A double-whammy of good news today! First, I'll talk about TIM/V, then I'll segue into SD card support.
If you're reading my progress, you're probably also familiar with the Commodore PET series of computers. If you've ever used them, you might also remember the built-in machine language monitor. You could break into the monitor at any time from BASIC with a SYS 4 command. This monitor's name was never printed to the screen; but it's official name is TIM, the Terminal Interface Monitor. Its heritage actually goes back to the KIM-1 computer!
Well, today[*], I'm happy to announce that my Kestrel-2DX computer has its own port of TIM, which I've named TIM/V. For expediency, I wrote it in C, and cannot yet do everything the real TIM can do. Part of the reason for this is limitations I'm running into as software size in ROM grows.
TIM/V does, however, have the minimum number of features required to provide self-hosted software development on the Kestrel-2DX. No, they're not convenient to use, particularly if you're pampered by today's software development environments. But it does work, and with enough patience and practice, it can be used to write literally anything that can run on the Kestrel-2DX.
TIM/V supports the following features:
- You can use the m [addr1][,addr2] command to inspect the contents of memory.
- You can use the = addr1 byte byte byte ... command to set the contents of memory.
- You can use the g [addr1] command to "goto" (actually, call) an arbitrary machine language subroutine.
- You can use the l addr1,blk-start,blk-len command to load a binary image into memory from an initialized SD/MMC card.
- You can use the s addr1,blk-start,blk-len command to save a binary image back to your SD/MMC card.
- You can use the i command to initialize the most recently inserted SD/MMC card.
There's no unmount command, so you can insert and remove cards arbitrarily. In fact, since the SD card interface lacks power control (not enough I/Os in the PMOD and no driver circuitry on the adapter circuit), if ever the SD/MMC card gets into a weird state, the only way to recover is literally to pull it out and re-insert it. This manually cycles power to the card. Remember to follow up with an i command to reinitialize it.
As of today, no commands exist to dump or set the contents of CPU registers, and certainly no support for breakpoints or watch-points exist yet either. These may come later after I've solved some higher priority issues/tasks.
Using TIM/V as a Boot Loader
As it happens, you can use TIM/V as a primitive boot loader. Assuming you just inserted an SD/MMC card into the slot, you can boot the computer with the following sequence of commands:
- l 1bc00,0,2
- g 1bc00
The 2nd command tells TIM/V to load a binary image from SD/MMC starting at sector 0, for two sectors (so, 1KiB), and place the data at address $1BC00 in IPL RAM. The 3rd command, obviously, then executes the loaded code.
SD/MMC Card Support
Like the original Kestrel-2, the 2DX only supports a single SD/MMC card. It's all I have, sorry. I have future plans to expand this with the Kestrel-3; but, for now, it's bit-banged via the GPIA and only a single slave-select pin is mapped.
That said, since its inception six years ago, the Kestrel-2 has never been able to write to an SD/MMC card. There just wasn't enough space in the bootstrap code to include it! Thankfully, now that the 2DX isolates ROM from RAM, and ROM is truly permanent, write support now exists!
This means that any operating system I implement for the 2DX will properly be able to save work artifacts. (With the original Kestrel-2, I was intending on including write-support in a code overlay library, but never got that far.)
SDHC Support Still Lacking
Alas, the 2DX remains constrained to using normal SD cards (it's not tested with a proper MMC card). None of the SDHC cards I have seem to initialize (not one responds properly to a CMD8 command) per documented procedures, so I'm not sure what to do about this. I'll defer this problem for later, I guess.
Fun Facts and Notes
* - I'm announcing this today; however, I managed to complete the working code a mere three minutes before my scheduled talk on the Kestrel-2DX at yesterday's SVFIG meeting. In true Commodore fashion, this was a real "COMDEX Moment."