i finally completed the LIST command for the 8-bit project by adding argument printing. getting the branch address calculation correct held me back for a week, but fell quickly when i finally realized that a backward branch was actually the same calculation as a forward branch, just with a pre-decrement of the MSB to account for crossing page boundaries. i had been trying to use a different code path for it, subtracting rather than adding, etc.
for the mnemonics themselves, i set up a 1024-byte table – 4 bytes for each of the 256 possible values. the first three bytes of each entry are the three-character opcode (or ??? for illegal opcodes) and the fourth byte is the address mode. this allows me to simply use the actual opcode (multiplied by 4) as an index into the table. the address mode byte is similarly used as an index into a table of jump addresses for each of the address mode output handlers. i’m sure all of that could have been done in some fancy way that would save a lot of memory (at the expense of extra clock cycles), but as i’ve mentioned several times, i’m aiming for something that works right now rather than the most elegant solution.
i did add a bit of elegance by clearing the screen before i start outputting. this prevents the lcd from having to scroll, which is a fairly slow operation. so the output is not only complete now, but it finishes faster and looks better while it’s outputting. 8)
for the next step, i think i’m going to improve LIST a bit more by adding the actual byte values to the output, i.e. instead of the output being
$aaaa: mmm <addr>
it will instead become
$aaaa: aa bb cc mmm <addr>
where of course ‘bb’ and ‘cc’ may actually be just spaces depending on the number of bytes that the command actually uses. this will bring the maximum length of a line up from 23 to 32-34 characters (depending on how wide i make the gaps), which is not a problem for my 40-character-wide lcd.