Lists the program. As the stored program is in tokenised form (ie keywords are represented with single byte numeric IDs) LIST is more complex than a simple memory dump. When it meets a keyword ID it looks it up in the keywords table and prints it.
| Get the line number argument into DE and error back if a non-numeric argument was given. | ||||
| 038E | CD9D04 | List | CALL LineNumberFromStr | |
| 0391 | C0 | RNZ | ||
| 0392 | C1 | POP B | ?why get return address? | |
| From the line number in DE, get the address of the starting program line onto the stack. | ||||
| 0393 | CD7D02 | CALL FindProgramLine | ||
| 0396 | C5 | PUSH B | ||
| Pop the current program line address into HL, and get the address of the *next* program line into BC.. | ||||
| 0397 | E1 | ListNextLine | POP H | |
| 0398 | F7 | RST PushNextWord | ||
| 0399 | C1 | POP B | ||
| If we've reached the null line at the end of the program, then exit. | ||||
| 039A | 78 | MOV A,B | ||
| 039B | B1 | ORA C | ||
| 039C | CAF901 | JZ Main | ||
| Allow user a chance to stop the program listing. | ||||
| 039F | CD7304 | CALL TestBreakKey | ||
| 03A2 | C5 | PUSH B | ||
| 03A3 | CD8A05 | CALL NewLine | ||
| Get current program line number into HL, and push current program line ptr onto the stack. | ||||
| 03A6 | F7 | RST PushNextWord | ||
| 03A7 | E3 | XTHL | ||
| Print the line number and prepare to print a space.. | ||||
| 03A8 | CD370B | CALL PrintInt | ||
| 03AB | 3E20 | MVI A,' ' | ||
| Restore current line ptr to HL, print current character, advance current line ptr and | ||||
| 03AD | E1 | POP H | ||
| 03AE | DF | ListChar | RST OutChar | |
| 03AF | 7E | MOV A,M | ||
| 03B0 | B7 | ORA A | ||
| 03B1 | 23 | INX H | ||
| 03B2 | CA9703 | JZ ListNextLine | ||
| 03B5 | F2AE03 | JP ListChar | ||
| Bit 7 of A is set, indicating a keyword ID. So we need to look the keyword up in the table and print it. | ||||
| 03B8 | D67F | SUI 7F | A is now keyword index + 1. | |
| 03BA | 4F | MOV C,A | ||
| 03BB | E5 | PUSH H | ||
| 03BC | 115700 | LXI D,KEYWORDS | ||
| 03BF | D5 | PUSH D | ||
| Find the start of the next keyword. | ||||
| 03C0 | 1A | ToNextKeyword | LDAX D | |
| 03C1 | 13 | INX D | ||
| 03C2 | B7 | ORA A | ||
| 03C3 | F2C003 | JP ToNextKeyword | ||
| Decrement keyword index and restore start of previous keyword to HL. If this is not yet the keyword we want, then loop back. | ||||
| 03C6 | 0D | DCR C | ||
| 03C7 | E1 | POP H | ||
| 03C8 | C2BF03 | JNZ ToNextKeyword-1 | ||
| Print the keyword. Note that printing of the last character is deferred to ListChar in the main loop. | ||||
| 03CB | 7E | PrintKeyword | MOV A,M | |
| 03CC | B7 | ORA A | ||
| 03CD | FAAD03 | JM ListChar-1 | ||
| 03D0 | DF | RST OutChar | ||
| 03D1 | 23 | INX H | ||
| 03D2 | C3CB03 | JMP PrintKeyword | ||