The T1 version was, however, a very creditable programming feat. I have been told that it was written without the aid of an assembler and simply hand coded from mnemonics into hex for the programmer unit. And it worked (mostly) first time. 1k of code is a lot of work (and paper)! I’ve included the assembly listing here: Nasbug 1
The T1 and T2 monitors were both supplied in single 1k x 8 EPROMs. These were, at that time, 2708 devices which are both difficult to find and almost impossible to program nowadays!
B – set breakpoint
Bxxxx
Set a breakpoint at xxxx. B 0 de-activates the breakpoint. This must only be set as the first byte of an instruction, as it temporarily replaces the instruction with E7H.
C – copy
Cxxxx yyyy zzzz
Copy a block of length zzzz from xxxx to yyyy. One byte is copied at a time, starting with the first byte, so if there is an overlap in the two areas data may be destroyed. This command is useful for filling a block with a single value. Make yyyy one greater than xxxx and put the required value into address xxxx. Set zzzz to the number of bytes required.
D – dump
Dxxxx yyyy
Dump the contents of the area from xxxx to yyyy to the serial interface. The data is transmitted in groups of 8 bytes preceded by the location of the first byte in the group and followed by a checksum and LF character. The command terminates by sending a full stop as the last character. The cassette motor output is automatically controlled by this command. No data is written to the tape for about 1 second after start up to allow the motor to reach running speed.
E – execute
Exxxx
Execute program at xxxx. If xxxx is omitted then the stored program counter is used. This means that to continue execution after a breakpoint, just enter E.
L – load from serial interface
L
Loads incoming data into memory. This is compatible with the Dump command. The loaded data is checked and any lines containing errors are scrolled up the screen (and are not stored in memory)so that they can be re-loaded or corrected. All correct lines are displayed for a moment and then vanish. The cassette motor output is automatically controlled by this command and is switched off when the final full stop is received.
M – modify store
Mxxxx
Modify memory starting at address xxxx. The address is displayed followed by the current data. This value may be changed. Enter a “.” at the end of the line to end the command. If you enter several values then the successive address values are changed. This allows several values to be entered at once. All data is, of course, entered in hexadecimal notation.
S – single step
Sxxxx
Executes the single instruction at address xxxx. If xxxx is not specified then the stored program counter is used. This means that to continue single stepping after a breakpoint, just enter S. If the previous command was S then even this need not be re-typed for successive steps – just the enter key. Program registers are stored and displayed after each step.
T – tabulate
Txxxx yyyy
Tabulate (display) a block of memory starting at xxxx and continuing to yyyy-1. It is inadvisable to display more than 68H addresses as the top line scrolls off the screen.
Program register display:
The registers are displayed in the following format during the S command or when an E7H (breakpoint) is encountered
ssss pppp aaff hhll ddee bbcc
where:
ssss is the stack pointer | pppp is the program counter |
aa is the accumulator | ff is the flag register |
hh is the H register | ll is the L register |
dd is the D register | ee is the E register |
bb is the B register | cc is the C register |
ROM calls
Restart instructions:
C7 | RST 0 | (0) | START | Reset the computer. Initialise NASBUG |
E7 | RST 20h | (4) | BRKPT | Breakpoint – stop & display registers |
EF | RST 28h | (5) | PRS | Output following string until 0H found |
The remaining restart instructions were not made available to the user. They actually jumped into the middle of routines (and sometimes instructions!).
0035H | KDEL | Approx 7mS delay |
0051H | MOTFLP | Invert the status of the cassette motor output |
0069H | KBD | Scan keyboard & return with C set if present in A |
005DH | SRLOUT | Sends contents of A to serial device |
013BH | CRT | Place character in A onto screen in current posn. |
003EH | CHIN | Get char from serial or keyboard (like KBD) |
0244H | B2HEX | Display contents of A as 2 hex digits on screen |
023CH | SPACE | Print a blank space on screen |
0240H | CRLF | Scroll screen up 1 line and put cursor on next |
These were the “official” calls of course. Some software used others, which probably gave the writers of some of the later monitors something to think about!