11 2 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 3+ 19:26 09/08/2018 4+ PAGE 1 5 IMSAI SCS-1 REV. 2 06 OCT. 1976 6 7 8 TITLE 'IMSAI SCS-1 REV. 2 06 OCT. 1976' 9 ; 10 ; PAGE 62 11 ; 12 ; MODIFIED TO ASSEMBLE WITH INTEL 8080 CROSS ASSEMBLER 13 ; OCTOBER 2008, UDO MUNK 14 ; 15 0003 TTS EQU 03H 16 0002 TTI EQU 02H 17 0002 TTO EQU 02H 18 0002 TTYDA EQU 02H 19 0001 TTYTR EQU 01H 20 ; 21 0000 ORG 0H 22 0000 C34000 JMP INITA ;DEAD START 23 0003 C36700 JMP EOR ;RESTART MONITOR 24 ; 25 0008 ORG 08H 26 0008 C32E0D JMP BRKP ;BREAKPOINT RESTART 27 ; 28 0040 ORG 40H; 29 ; 30 ; THIS ROUTINE SETS UP THE SIO BOARD 31 ; 32 0040 3EAA INITA: MVI A,0AAH ;GET DUMMY MODE WORD 33 0042 D303 OUT TTS ;OUTPUT IT 34 0044 3E40 MVI A,40H ;GET RESET BIT 35 0046 D303 OUT TTS ;RESET SIO BOARD 36 0048 3ECE MVI A,0CEH ;GET REAL MODE WORD 37 004A D303 OUT TTS ;SET THE MODE FOR REAL 38 004C 3E37 MVI A,37H ;GET THE COMMAND 39 004E D303 OUT TTS ;OUTPUT IT 40 ; 41 ; THIS ROUTINE INITIALIZES THE FILE AREAD FOR SUBSEQUENT 42 ; PROCESSING 43 ; 44 0050 212410 LXI H,FILE0 45 0053 0E4E MVI C,MAXFIL*FELEN 46 0055 AF XRA A 47 0056 77 INIT2: MOV M,A 48 0057 23 INX H 49 0058 0D DCR C 50 0059 C25600 JNZ INIT2 51 ; 52 ; CLEAR THE BREAKPOINT TABLE 53 ; 54 005C 0618 MVI B,NBR*3 55 005E 210C10 LXI H,BRT 56 0061 77 INIT3: MOV M,A 57 0062 23 INX H 58 0063 05 DCR B 591 60 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 61+ 19:26 09/08/2018 62+ PAGE 2 63 IMSAI SCS-1 REV. 2 06 OCT. 1976 64 65 66 0064 C26100 JNZ INIT3 67 ; 68 ; THIS IS THE STARTING POINT OF THE SELF CONTAINED 69 ; SYSTEM ONCE THE SYSTEM HAS BEEN INITIALIZED. COMMANDS 70 ; ARE READ FROM THE USER, EXECUTED, AND CONTROL RETURNS 71 ; BACK TO THIS POINT TO READ ANOTHER COMMAND. 72 ; 73 0067 31B210 EOR: LXI SP,AREA+18 74 006A CD0E01 CALL CRLF ;PRINT C/R, LINE FEED 75 006D CD8000 CALL READ ;READ INPUT LINE 76 0070 23 INX H 77 0071 7E MOV A,M ;FETCH FIRST CHARACTER 78 0072 FE3A CPI '9'+1 ;COMMAND OR LINE NUMBER? 79 0074 DAB504 JC LINE ;JUMP IF LINE FOR FILE 80 0077 CD7301 CALL VALC 81 007A CD2B01 CALL COMM 82 007D C36700 JMP EOR 83 ; 84 ; THIS ROUTINE READS IN A LINE FROM THE TTY AND PLACES 85 ; IT IN AN INPUT BUFFER. 86 ; THE FOLLOWING ARE SPECIAL CHARACTERS 87 ; CR TERMINATES READ ROUTINE 88 ; LF NOT RECOGNIZED BY ROUTINE 89 ; CTRL X DELETES CURRENT LINE 90 ; DEL DELETES CHARACER 91 ; ALL DISPLAYABLE CHARACTERS BETWEEN BLANK & Z AND THE 92 ; ABOVE ARE RECOGNIZED BY THE READ ROUTINE, ALL OTHERS 93 ; ARE SKIPPED OVER. THE ROUTINE WILL NOT ACCEPT MORE 94 ; CHARACTERS THAN THE INPUT BUFFER WILL HOLD. 95 ; 96 0080 21C710 READ: LXI H,IBUF ;GET INPUT BUFFER ADDRESS 97 0083 227410 SHLD ADDS ;SAVE ADDRESS 98 0086 1E02 MVI E,2 ;INITIALIZE CHARACTER COUNT 99 0088 CDF600 NEXT: CALL IN8 ;READ A LINE 100 008B 78 MOV A,B 101 008C FE18 CPI 24 ;CHECK FOR CTRL X 102 008E C29700 JNZ CR 103 0091 CD0E01 CALL CRLF ;OUTPUT A CRLF 104 0094 C38000 JMP READ 105 0097 FE0D CR: CPI ASCR ;GET AN ASCII CR 106 0099 C2B200 JNZ DEL 107 009C 7D MOV A,L 108 009D FEC7 CPI IBUF AND 00FFH ;CHECK FOR FIRST CHAR 109 009F CA8000 JZ READ 110 00A2 360D MVI M,ASCR ;PLACE CR AT END OF LINE 111 00A4 23 INX H 112 00A5 3601 MVI M,1 ;PLACE EOF INDICATOR IN LINE 113 00A7 23 INX H 114 00A8 3E1A MVI A,IBUF+83 AND 00FFH 115 00AA CDE100 CALL CLER ;CLEAR REMAINING BUFFER 116 00AD 21C610 LXI H,IBUF-1 1171 118 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 119+ 19:26 09/08/2018 120+ PAGE 3 121 IMSAI SCS-1 REV. 2 06 OCT. 1976 122 123 124 00B0 73 MOV M,E ;SAVE CHARACTER COUNT 125 00B1 C9 RET 126 00B2 FE7F DEL: CPI 127 ;CHECK FOR DELETE CHARACTER 127 00B4 C2C700 JNZ CHAR 128 00B7 3EC7 MVI A,IBUF AND 00FFH 129 00B9 BD CMP L ;IS IT 1ST CHARACTER 130 00BA CA8800 JZ NEXT 131 00BD 2B DCX H ;DECREMENT POINTER 132 00BE 1D DCR E ;DECREMENT COUNT 133 00BF 065F BSPA: MVI B,5FH 134 00C1 CD0301 CALL OUT8 135 00C4 C38800 JMP NEXT 136 00C7 FE20 CHAR: CPI ' ' ;CHECK FOR LEGAL CHARACTER 137 00C9 DA8800 JC NEXT 138 00CC FE5B CPI 'Z'+1 139 00CE D28800 JNC NEXT 140 00D1 47 MOV B,A 141 00D2 CD0301 CALL OUT8 ;ECHO CHARACTER 142 00D5 70 MOV M,B 143 00D6 3E18 MVI A,IBUF+81 AND 00FFH 144 00D8 BD CMP L ;CHECK FOR END OF LINE 145 00D9 CABF00 JZ BSPA 146 00DC 23 INX H 147 00DD 1C INR E ;INCREMENT CHARACTER COUNT 148 00DE C38800 JMP NEXT 149 ; 150 ; THIS ROUTINE IS USED TO BLANK OUT A PORTION OF MEMORY 151 ; 152 00E1 BD CLER: CMP L 153 00E2 C8 RZ 154 00E3 3620 MVI M,' ' ;PLACE BLANK IN MEMORY 155 00E5 23 INX H 156 00E6 C3E100 JMP CLER 157 ; 158 ; SEE IF TTY INPUT READY AND CHECK FOR CTRL X. 159 ; 160 00E9 DB03 INK: IN TTS ;GET TTY STATUS 161 00EB 2F CMA ;INVERT STATUS 162 00EC E602 ANI TTYDA ;IS DATA AVAILABLE? 163 00EE C0 RNZ ;RETURN IF NOT 164 00EF DB02 IN TTI ;GET THE CHAR 165 00F1 E67F ANI 07FH ;STRIP OFF PARITY 166 00F3 FE18 CPI 'X'-40H ;IS IT A CTRL X? 167 00F5 C9 RET 168 ; 169 ; THIS ROUTINE READS A BYTE OF DATA FROM THE USART 170 ; 171 00F6 DB03 IN8: IN TTS ;READ USART STATUS 172 00F8 E602 ANI TTYDA 173 00FA CAF600 JZ IN8 174 00FD DB02 IN TTI ;READ DATA 1751 176 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 177+ 19:26 09/08/2018 178+ PAGE 4 179 IMSAI SCS-1 REV. 2 06 OCT. 1976 180 181 182 00FF E67F ANI 127 ;STRIP OFF PARITY 183 0101 47 MOV B,A 184 0102 C9 RET 185 186 ; 187 ; THIS ROUTINE OUTPUTS A BYTE OF DATA TO THE USART 188 ; 189 0103 DB03 OUT8: IN TTS ;READ STATUS 190 0105 E601 ANI TTYTR 191 0107 CA0301 JZ OUT8 192 010A 78 OK: MOV A,B 193 010B D302 OUT TTO ;TRANSMIT DATA 194 010D C9 RET 195 ; 196 ; THIS ROUTINE WILL OUTPUT A CARRIAGE RETURN AND 197 ; LINE FEED FOLLOWED BY TWO DELETE CHARACTERS WHICH 198 ; PROVIDE TIME FOR PRINT HEAD TO RETURN. 199 ; 200 010E 060D CRLF: MVI B,13 ;CR 201 0110 CD0301 CALL OUT8 202 0113 060A LF: MVI B,10 ;LF 203 0115 CD0301 CALL OUT8 204 0118 067F MVI B,127 205 011A CD0301 CALL OUT8 206 011D CD0301 CALL OUT8 207 0120 C9 RET 208 ; 209 ; THIS ROUTINE JUMPS TO A LOCATION IN MEMORY GIVEN BY 210 ; THE INPUT COMMAND AND BEGINS EXECUTION OF PROGRAM 211 ; THERE. 212 ; 213 0121 CD0003 EXEC: CALL VCHK ;CHECK FOR PARAMETERS 214 0124 CD0E01 CALL CRLF 215 0127 2A8A10 LHLD BBUF ;FETCH ADDRESS 216 012A E9 PCHL ;JUMP TO PROGRAM 217 ; 218 ; THIS ROUTINE CHECKS THE INPUT COMMAND AGAINS ALL 219 ; LEGAL COMMANDS STORED IN A TABLE. IF A LEGAL COMMAND 220 ; IS FOUND, A JUMP IS MADE TO THAT ROUTINE. OTHERWISE 221 ; AN ERROR MESSAGE IS OUTPUT TO THE USER. 222 ; 223 012B 11BE02 COMM: LXI D,CTAB ;COMMAND TABLE ADDRESS 224 012E 060B MVI B,NCOM ;NUMBER OF COMMANDS 225 0130 3E04 MVI A,4 ;LENGTH OF COMMAND 226 0132 329510 STA NCHR ;SAVE 227 0135 CD3C01 CALL COMS ;SEARCH TABLE 228 0138 C25A04 JNZ WHAT ;JUMP IF ILLEGAL COMMAND 229 013B E9 PCHL ;BE HERE NOW 230 ; 231 ; THIS ROUTINE CHECKS TO SEE IF A BASE CHARACTER STRING 232 ; IS EQUAL TO ANY OF THE STRINGS CONTAINED IN A TABLE 2331 234 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 235+ 19:26 09/08/2018 236+ PAGE 5 237 IMSAI SCS-1 REV. 2 06 OCT. 1976 238 239 240 ; POINTED TO BY D,E. HE TABLE CONSISTS OF ANY NUMBER 241 ; OF CHARS, WITH 2 BYTES CONTAINING VALUES ASSOCIATED 242 ; WITH IT. REG B CONTAINS THE # OF STRINGS TO COMPARE. 243 ; THIS ROUTINE CAN BE USED TO SEARCH THROUGH A COMMAND 244 ; OR SYMBOL TABLE. ON RETURN, IF THE ZERO FLAG IS SET, 245 ; A MATCH WAS FOUND; IF NOT, NO MATCH WAS FOUND. IF 246 ; A MATCH WAS FOUND, D,E POINT TO THE LAST BYTE 247 ; ASSOCIATED WITH THE CHARACTER STRING. F NOT, D,E 248 ; POINT TO THE NEXT LOCATION AFTER THE END FO THE TABLE. 249 ; 250 013C 2A7410 COMS: LHLD ADDS ;FETCH COMPARE ADDRESS 251 013F 3A9510 LDA NCHR ;GET LENGTH OF STRING 252 0142 4F MOV C,A 253 0143 CD5301 CALL SEAR ;COMPARE STRINGS 254 0146 1A LDAX D ;FETCH VALUE 255 0147 6F MOV L,A 256 0148 13 INX D 257 0149 1A LDAX D ;FETCH VALUE 258 014A 67 MOV H,A 259 014B C8 RZ 260 014C 13 INX D ;SET TO NEXT STRING 261 014D 05 DCR B ;DECREMENT COUNT 262 014E C23C01 JNZ COMS 263 0151 04 INR B ;CLEAR ZERO FLAG 264 0152 C9 RET 265 ; 266 ; THIS ROUTINE CHECKS TO SEE IF TWO CHARACTER STRINGS IN 267 ; MEMORY ARE EQUAL. HE STRINGS ARE POINTED TO BY D,E 268 ; AND H,L. ON RETURN, THE ZERO FLAG SET INDICATES A 269 ; MATCH. REG C INDICATES THE LENGTH OF THE STRINGS. ON 270 ; RETURN, THE POINTERS POINT TO THE NEXT ADDRESS AFTER 271 ; THE CHARACTER STRINGS. 272 ; 273 0153 1A SEAR: LDAX D ;FETCH CHARACTER 274 0154 BE CMP M ;COMPARE CHARACTERS 275 0155 C25F01 JNZ INCA 276 0158 23 INX H 277 0159 13 INX D 278 015A 0D DCR C ;DECREMENT CHARACTER COUNT 279 015B C25301 JNZ SEAR 280 015E C9 RET 281 015F 13 INCA: INX D 282 0160 0D DCR C 283 0161 C25F01 JNZ INCA 284 0164 0C INR C ;CLEAR ZERO FLAG 285 0165 C9 RET 286 ; 287 ; THIS ROUTINE ZEROES OUT A BUFFER IN MEMORY WHICH IS 288 ; THEN USED BY OTHER SCANNING ROUTINES 289 ; 290 0166 AF ZBUF: XRA A ;GET A ZERO 2911 292 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 293+ 19:26 09/08/2018 294+ PAGE 6 295 IMSAI SCS-1 REV. 2 06 OCT. 1976 296 297 298 0167 118A10 LXI D,ABUF+12 ;BUFFER ADDRESS 299 016A 060C MVI B,12 ;BUFFER LENGTH 300 016C 1B ZBU1: DCX D ;DECREMENT ADDRESS 301 016D 12 STAX D ;ZERO BUFFER 302 016E 05 DCR B 303 016F C26C01 JNZ ZBU1 304 0172 C9 RET 305 ; 306 ; THIS ROUTINE CALLS ETRA TO OBTAIN THE INPUT PARAMETER 307 ; VALUES AND CALLS AN ERROR ROUTINE IF AN ERROR OCCURED 308 ; IN THAT ROUTINE 309 ; 310 0173 CD7A01 VALC: CALL ETRA ;GET INPUT PARAMETERS 311 0176 DA5A04 JC WHAT ;JUMP IF ERROR 312 0179 C9 RET 313 ; 314 ; THIS ROUTINE EXTRACTS THE VALUES ASSOCIATED WITH A 315 ; COMMAND FROM THE INPUT STREAM AND PLACES THEM IN THE 316 ; ASCII BUFFER (ABUF). IT ALSO CALLS A ROUTINE TO 317 ; CONVERT THE ASCII HEXADECIMALS TO BINARY AND STORES 318 ; THEM IN THE BINARY BUFFER (BBUF). ON RETURN, CARRY 319 ; SET INDICATES AN ERROR IN INPUT PARAMETERS. 320 ; 321 017A 210000 ETRA: LXI H,0 ;GET A ZERO 322 017D 228C10 SHLD BBUF+2 ;ZERO VALUE 323 0180 227610 SHLD FBUF ;SET NO FILE NAME 324 0183 CD6601 CALL ZBUF ;ZERO BUFFER 325 0186 21C610 LXI H,IBUF-1 326 0189 23 VAL1: INX H 327 018A 7E MOV A,M ;FETCH INPUT CHARACTER 328 018B FE20 CPI ' ' ;LOOK FOR FIRST CHARACTER 329 018D 3F CMC 330 018E D0 RNC ;RETURN IF NO CARRY 331 018F C28901 JNZ VAL1 ;JUMP IF NO BLACK 332 0192 229610 SHLD PNTR ;SAVE POINTER 333 0195 CD0D09 CALL SBLK ;SCAN TO FIRST PARAMETER 334 0198 3F CMC 335 0199 D0 RNC ;RETURN IF CR 336 019A FE2F CPI '/' 337 019C C2C401 JNZ VAL5 ;NO FILE NAME 338 019F 117610 LXI D,FBUF ;NAME FOLLOWS PUT IN FBUF 339 01A2 0E05 MVI C,NMLEN 340 01A4 23 VAL2: INX H 341 01A5 7E MOV A,M 342 01A6 FE2F CPI '/' 343 01A8 CAB401 JZ VAL3 344 01AB 0D DCR C 345 01AC FA5A04 JM WHAT 346 01AF 12 STAX D ;STORE FILE NAME 347 01B0 13 INX D 348 01B1 C3A401 JMP VAL2 3491 350 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 351+ 19:26 09/08/2018 352+ PAGE 7 353 IMSAI SCS-1 REV. 2 06 OCT. 1976 354 355 356 01B4 3E20 VAL3: MVI A,' ' ;GET AN ASCII SPACE 357 01B6 0D VAL4: DCR C 358 01B7 FABF01 JM DONE 359 01BA 12 STAX D ;FILL IN WITH SPACES 360 01BB 13 INX D 361 01BC C3B601 JMP VAL4 362 01BF CD1409 DONE: CALL SBL2 363 01C2 3F CMC 364 01C3 D0 RNC 365 01C4 117E10 VAL5: LXI D,ABUF 366 01C7 CD750B CALL ALPS ;PLACE PARAMETER IN BUFFER 367 01CA 78 MOV A,B ;GET DIGIT COUNT 368 01CB FE05 CPI 5 ;CHECK NUMBER OF DIGITS 369 01CD 3F CMC 370 01CE D8 RC ;RETURN IF TOO MANY DIGITS 371 01CF 017E10 LXI B,ABUF 372 01D2 CD1B02 CALL AHEX ;CONVERT VALUE 373 01D5 D8 RC ;ILLEGAL CHARACTER 374 01D6 228A10 SHLD BBUF ;SAVE IN BINARY BUFFER 375 01D9 217E10 LXI H,ABUF 376 01DC CDBD05 CALL NORM ;NORMALIZE ASCII VALUE 377 01DF CD0D09 CALL SBLK ;SCAN TO NEXT PARAMETER 378 01E2 3F CMC 379 01E3 D0 RNC ;RETURN IF 380 01E4 118210 LXI D,ABUF+4 381 01E7 CD750B CALL ALPS ;PLACE PARAMETERS IN BUFFER 382 01EA 78 MOV A,B ;GET DIGIT COUNT 383 01EB FE05 CPI 5 ;CHECK NUMBER OF DIGITS 384 01ED 3F CMC 385 01EE D8 RC ;RETURN IF TOO MANY DIGITS 386 01EF 018210 LXI B,ABUF+4 387 01F2 CD1B02 CALL AHEX ;CONVERT VALUE 388 01F5 D8 RC ;ILLEGAL VALUE 389 01F6 228C10 SHLD BBUF+2 ;SAVE IN BINARY BUFFER 390 01F9 218210 LXI H,ABUF+4 391 01FC CDBD05 CALL NORM ;NORMALIZE ASCII VALUE 392 01FF B7 ORA A ;CLEAR CARRY 393 0200 C9 RET 394 ; 395 ; THIS ROUTINE FETCHES DIGITS FROM THE BUFFER ADDRESSED 396 ; BY B,C AND CONVERTS THE ASCII DECIMAL DIGITS INTO 397 ; BINARY. UP TO A 16-BIT VALUE CAN BE CONVERTED. THE 398 ; SCAN STOPS WHEN A BINARY ZERO IS FOUND IN THE BUFFER. 399 ; 400 0201 210000 ADEC: LXI H,0 ;GET A 16 BIT ZERO 401 0204 0A ADE1: LDAX B ;FETCH ASCII DIGIT 402 0205 B7 ORA A ;SET ZERO FLAG 403 0206 C8 RZ ;RETURN IFF FINISHED 404 0207 54 MOV D,H ;SAVE CURRENT VALUE 405 0208 5D MOV E,L ;SAVE CURRENT VALUE 406 0209 29 DAD H ;TIMES TWO 4071 408 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 409+ 19:26 09/08/2018 410+ PAGE 8 411 IMSAI SCS-1 REV. 2 06 OCT. 1976 412 413 414 020A 29 DAD H ;TIMES TWO 415 020B 19 DAD D ;ADD IN ORIGINAL VALUE 416 020C 29 DAD H ;TIMES TWO 417 020D D630 SUI 48 ;ASCII BIAS 418 020F FE0A CPI 10 ;CHECK FOR LEGAL VALUE 419 0211 3F CMC 420 0212 D8 RC ;RETURN IF ERROR 421 0213 5F MOV E,A 422 0214 1600 MVI D,0 423 0216 19 DAD D ;ADD IN NEXT DIGIT 424 0217 03 INX B ;INCREMENT POINTER 425 0218 C30402 JMP ADE1 426 ; 427 ; THIS ROUTINE FETCHES DIGITS FROM THE BUFFER ADDRESSED 428 ; BY B,C AND CONVERTS THE ASCII HEXADECIMAL DIGITS INTO 429 ; BINARY. UP TO A 16-BIT VALUE CAN BE CONVERTED. THE 430 ; SCAN STOPS WHEN A BINARY ZERO IS FOUNDIN THE BUFFER. 431 ; 432 021B 210000 AHEX: LXI H,0 ;GET A 16 BIT ZERO 433 021E 0A AHE1: LDAX B ;FETCH ASCII DIGIT 434 021F B7 ORA A ;SET ZERO FLAG 435 0220 C8 RZ ;RETURN IF DONE 436 0221 29 DAD H ;LEFT SHIFT 437 0222 29 DAD H ;LEFT SHIFT 438 0223 29 DAD H ;LEFT SHIFT 439 0224 29 DAD H ;LEFT SHIFT 440 0225 CD3202 CALL AHS1 ;CONVERT TO BINARY 441 0228 FE10 CPI 10H ;CHECK FOR LEGAL VALUE 442 022A 3F CMC 443 022B D8 RC ;RETURN IF ERROR 444 022C 85 ADD L 445 022D 6F MOV L,A 446 022E 03 INX B ;INCREMENT POINTER 447 022F C31E02 JMP AHE1 448 ; 449 ; THIS ROUTINE CONVERTS ASCII HEX DIGITS INTO BINARY 450 ; 451 0232 D630 AHS1: SUI 48 ;ASCII BIAS 452 0234 FE0A CPI 10 ;DIGIT 0-10 453 0236 D8 RC 454 0237 D607 SUI 7 ;ALPHA BIAS 455 0239 C9 RET 456 ; 457 ; THIS ROUTINE CONVERTS A BINARY VALUE TO ASCII 458 ; HEXADECIMAL AND OUTPUTS THE CHARACTERS TO THE TTY. 459 ; 460 023A CD8602 HOUT: CALL BINH 461 023D 217410 LXI H,HCON 462 0240 46 CHOT: MOV B,M 463 0241 CD0301 CALL OUT8 464 0244 23 INX H 4651 466 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 467+ 19:26 09/08/2018 468+ PAGE 9 469 IMSAI SCS-1 REV. 2 06 OCT. 1976 470 471 472 0245 46 MOV B,M 473 0246 CD0301 CALL OUT8 474 0249 C9 RET 475 ; 476 ; THIS ROUTINE DOES THE SAME AS ABOVE BUT OUTPUTS A 477 ; BLANK AFTER THE LAST CHARACTER 478 ; 479 024A CD3A02 HOTB: CALL HOUT ;CONVERT AND OUTPUT 480 024D CD5D02 CALL BLK1 ;OUTPUT A BLANK 481 0250 C9 RET 482 ; 483 ; THIS ROUTINE CONVERTS A BINARY VALUE TO ASCII 484 ; DECIMAL DIGITS AND OPTPUTS THE CHARACTERS TO THE TTY 485 ; 486 487 0251 CDA302 DOUT: CALL BIND ;CONVERT VALUE 488 0254 CD3D02 CALL HOUT+3 ;OUTPUT VALUE (2 DIGITS) 489 0257 23 INX H 490 0258 46 MOV B,M ;GET LAST DIGIT 491 0259 CD0301 CALL OUT8 ;OUTPUT 492 025C C9 RET 493 ; 494 ; THIS ROUTINE OUTPUTS A BLANK 495 ; 496 025D 0620 BLK1: MVI B,' ' ;GET A BLANK 497 025F CD0301 CALL OUT8 498 0262 C9 RET 499 ; 500 ; THIS ROUTINE IS USED BY OTHER ROUTINES TO INCREMENT 501 ; THE STARTING ADDRESS IN A COMMAND AND COMPARE IT WITH 502 ; THE FINAL ADDRESS IN THE COMMAND. ON RETURN, THE 503 ; CARRY FLAG SET INDICATES THAT THE FINAL ADDRESS HAS 504 ; BEEN REACHED. 505 ; 506 0263 2A8A10 ACHK: LHLD BBUF ;FETCH START ADDRESS 507 0266 3A8D10 LDA BBUF+3 ;STOP ADDRESS (HIGH) 508 0269 BC CMP H ;COMPARE ADDRESSES 509 026A C27502 JNZ ACH1 510 026D 3A8C10 LDA BBUF+2 ;STOP ADDRESS (LOW) 511 0270 BD CMP L ;COMPARE ADDRESSES 512 0271 C27502 JNZ ACH1 513 0274 37 STC ;SET CARRY IF EQUAL 514 0275 23 ACH1: INX H ;INCREMENT START ADDRESSES 515 0276 228A10 SHLD BBUF ;STORE START ADDRESS 516 0279 C9 RET 517 ; 518 ; THIS ROUTINE OUTPUTS CHARACTER OF A STRING 519 ; UNTIL A CARRIAGE RETURN IS FOUND 520 ; 521 027A 46 SCRN: MOV B,M ;FETCH CHARACTER 522 027B 3E0D MVI A,13 ;CARRIAGE RETURN 5231 524 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 525+ 19:26 09/08/2018 526+ PAGE 10 527 IMSAI SCS-1 REV. 2 06 OCT. 1976 528 529 530 027D B8 CMP B ;CHARACTER = CR? 531 027E C8 RZ 532 027F CD0301 CALL OUT8 533 0282 23 INX H 534 0283 C37A02 JMP SCRN 535 ; 536 ; THIS ROUTINE CONVERTS THE BINARY VALUE IN REG A INTO 537 ; ASCII HEXADECIMAL DIGITS AND STORES THEM IN MEMORY 538 ; 539 0286 217410 BINH: LXI H,HCON ;CONVERSION 540 0289 47 MOV B,A ;SAVE VALUE 541 028A 1F RAR 542 028B 1F RAR 543 028C 1F RAR 544 028D 1F RAR 545 028E CD9902 CALL BIN1 546 0291 77 MOV M,A 547 0292 23 INX H 548 0293 78 MOV A,B 549 0294 CD9902 CALL BIN1 ;CONVERT TO ASCII 550 0297 77 MOV M,A 551 0298 C9 RET 552 ; 553 ; THIS ROUTINE CONVERTS A VALUE TO HEXADECIMAL 554 ; 555 0299 E60F BIN1: ANI 0FH ;LOW 4 BITS 556 029B C630 ADI 48 ;CONVERT TO ASCII 557 029D FE3A CPI 58 ;DIGIT 0-9 558 029F D8 RC 559 02A0 C607 ADI 7 ;MODIFY FOR A-F 560 02A2 C9 RET 561 ; 562 ; THIS ROUTINE CONVERTS THE BINARY VALUE IN REG A INTO 563 ; ASCII DECIMAL DIGITS AND STORES THEM IN MEMORY 564 ; 565 02A3 217410 BIND: LXI H,HCON ;CONVERSION ADDRESS 566 02A6 0664 MVI B,100 567 02A8 CDB402 CALL BID1 ;CONVERT HUNDREDS DIGIT 568 02AB 060A MVI B,10 569 02AD CDB402 CALL BID1 ;CONVERT TENS DIGIT 570 02B0 C630 ADI '0' ;GET UNITS DIGIT 571 02B2 77 MOV M,A ;STORE IN MEMORY 572 02B3 C9 RET 573 ; 574 ; THIS ROUTINE CONVERTS A VALUE TO DECIMAL 575 ; 576 02B4 362F BID1: MVI M,'0'-1 ;INITIALIZE DIGIT COUNT 577 02B6 34 INR M 578 02B7 90 SUB B ;CHECK DIGIT 579 02B8 D2B602 JNC BID1+2 580 02BB 80 ADD B ;RESTORE VALUE 5811 582 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 583+ 19:26 09/08/2018 584+ PAGE 11 585 IMSAI SCS-1 REV. 2 06 OCT. 1976 586 587 588 02BC 23 INX H 589 02BD C9 RET 590 ; 591 ; LEGAL COMMAND TABLE 592 ; 593 02BE 44554D50 CTAB: DB 'DUMP' 594 02C2 0803 DW DUMP 595 02C4 45584543 DB 'EXEC' 596 02C8 2101 DW EXEC 597 02CA 454E5452 DB 'ENTR' 598 02CE 7604 DW ENTR 599 02D0 46494C45 DB 'FILE' 600 02D4 3E03 DW FILE 601 02D6 4C495354 DB 'LIST' 602 02DA D005 DW LIST 603 02DC 44454C54 DB 'DELT' 604 02E0 E705 DW DELL 605 02E2 4153534D DB 'ASSM' 606 02E6 5E06 DW ASSM 607 02E8 50414745 DB 'PAGE' 608 02EC 2203 DW PAGEMOV 609 02EE 43555354 DB 'CUST' 610 02F2 0020 DW 2000H 611 02F4 4252454B DB 'BREK' 612 02F8 D20C DW BREAK 613 02FA 50524F43 DB 'PROC' 614 02FE 8F0D DW PROC 615 ; 616 ; THIS ROUTINE CHECKS IF ANY PARAMETERS WERE ENTERED 617 ; WITH THE COMMAND, IF NOT AN ERROR MESSAGE IS ISSUED 618 ; 619 0300 3A7E10 VCHK: LDA ABUF ;FETCH PARAMETER BYTE 620 0303 B7 ORA A ;SET FLAGS 621 0304 CA5A04 JZ WHAT ;NO PARAMETER 622 0307 C9 RET 623 ; 624 ; THIS ROUTINE DUMPS OUT THE FONTENTS OF MEMORY FROM 625 ; THE START TO FINAL ADDRESSES GIVEN IN THE COMMAND. 626 ; 627 0308 CD0003 DUMP: CALL VCHK ;CHECK FOR PARAMETERS 628 030B CD0E01 DUMS: CALL CRLF ;START NEW LINE 629 030E 2A8A10 DUM1: LHLD BBUF ;FETCH MEMORY ADDRESS 630 0311 7E MOV A,M 631 0312 CD4A02 CALL HOTB ;OUTPUT VALUE 632 0315 CD6302 CALL ACHK ;CHECK ADDRESS 633 0318 D8 RC ;RETURN IF FINISHED 634 0319 7D MOV A,L ;IS NEXT ADDRESS 635 031A E60F ANI 0FH ; DIVISIBLE BY 16? 636 031C C20E03 JNZ DUM1 637 031F C30B03 JMP DUMS 638 ; 6391 640 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 641+ 19:26 09/08/2018 642+ PAGE 12 643 IMSAI SCS-1 REV. 2 06 OCT. 1976 644 645 646 ; THIS ROUTINE WILL MOVE 256 BYTES FROM 1ST ADDRESS 647 ; GIVEN IN COMMAND TO 2ND ADDRESS IN COMMAND. 648 ; 649 0322 CD0003 PAGEMOV:CALL VCHK ;CHECK FOR PARAMETER 650 0325 3A8210 LDA ABUF+4 ;FETCH 2ND PARAMETER 651 0328 B7 ORA A ;DOES 2ND PARAMETER EXIST? 652 0329 CA5A04 JZ WHAT 653 032C 2A8A10 LHLD BBUF ;FETCH MOVE TO ADDRESS 654 032F EB XCHG 655 0330 2A8C10 LHLD BBUF+2 ;FETCH MOVE TO ADDRESS 656 0333 0600 MVI B,0 ;SET COUNTER 657 0335 1A PAG1: LDAX D 658 0336 77 MOV M,A 659 0337 23 INX H 660 0338 13 INX D 661 0339 05 DCR B ;DECREMENT COUNTER 662 033A C23503 JNZ PAG1 663 033D C9 RET 664 ; 665 ; THIS COMMAND INITIALIZES THE BEGINNING OF FILE ADDRESS 666 ; AND END OF FILE ADDRESS AS WELL AS THE FILE AREA 667 ; WHEN THE FILE COMMAND IS USED 668 ; 669 033E CD0E01 FILE: CALL CRLF 670 ; CHECK FOR FILE PARAMETERS 671 0341 3A7610 LDA FBUF 672 0344 B7 ORA A 673 0345 CAB903 JZ FOUT ;NO ? GO LIST 674 0348 CD1804 CALL FSEA ;LOOK UP FILE 675 034B EB XCHG ;PNTR IN DE 676 034C C26303 JNZ TEST 677 ; NO ENTRY 678 034F 3A7E10 LDA ABUF ;CHECK FOR PARAM 679 0352 B7 ORA A 680 0353 CA5D04 JZ WHA1 ;NO?? - ERROR 681 ; CHECK FOR ROOM IN DIRECTORY 682 0356 3A7D10 LDA FEF 683 0359 B7 ORA A 684 035A C27803 JNZ ROOM 685 035D 216B04 LXI H,EMES1 686 0360 C36004 JMP MESS 687 ; ENTRY FOUND ARE THESE PARAMETERS 688 0363 3A7E10 TEST: LDA ABUF 689 0366 B7 ORA A 690 0367 CA8B03 JZ SWAPS 691 036A 2A8A10 LHLD BBUF 692 036D 7C MOV A,H 693 036E B5 ORA L 694 036F CA8B03 JZ SWAPS 695 0372 217004 LXI H,EMES2 ;NO-NO CAN?T DO 696 0375 C36004 JMP MESS ;IT - DELETE FIRST 6971 698 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 699+ 19:26 09/08/2018 700+ PAGE 13 701 IMSAI SCS-1 REV. 2 06 OCT. 1976 702 703 704 ; MOVE FILE NAME TO BLOCK POINTED TO BY FREAD 705 0378 2A7B10 ROOM: LHLD FREAD 706 037B EB XCHG 707 037C 217610 LXI H,FBUF ;FILE NAME POINTER IN H,L 708 037F D5 PUSH D 709 0380 0E05 MVI C,NMLEN ;NAME LENGTH COUNT 710 0382 7E MOV23: MOV A,M 711 0383 12 STAX D 712 0384 13 INX D 713 0385 0D DCR C ;TEST COUNT 714 0386 23 INX H 715 0387 C28203 JNZ MOV23 716 038A D1 POP D ;RESTORE ENTRY POINTER 717 ; MAKE FILE POINTED TO BY D,E CURRENT 718 038B 212410 SWAPS: LXI H,FILE0 719 038E 0E0D MVI C,FELEN ;ENTRY LENGTH 720 0390 1A SWAP: LDAX D 721 0391 46 MOV B,M 722 0392 77 MOV M,A ;EXCHANGE 723 0393 78 MOV A,B 724 0394 12 STAX D 725 0395 13 INX D 726 0396 23 INX H ;BUMP POINTER 727 0397 0D DCR C ;TEST COUNT 728 0398 C29003 JNZ SWAP 729 730 ; CHECK FOR 2ND PARAMETER 731 039B 3A7E10 LDA ABUF 732 039E B7 ORA A 733 039F CAC303 JZ FOOT ;NO SECOND PARAMETER 734 ; PROCESS 2ND PARAMETER 735 03A2 2A8A10 LHLD BBUF ;GET ADDRESS 736 03A5 222910 SHLD BOFP ;SET BEGIN 737 03A8 222B10 SHLD EOFP ;SET END 738 03AB 7D MOV A,L ;IS ADDRESS ZERO 739 03AC B4 ORA H 740 03AD CAB203 JZ FIL35 ;YES 741 03B0 3601 FIL30: MVI M,1 ;NON-ZERO ? SET EOF 742 03B2 AF FIL35: XRA A ;AND MAX LINE # 743 03B3 322D10 STA MAXL 744 03B6 C3C303 JMP FOOT ;OUTPUT PARAMETERS 745 03B9 3ACB10 FOUT: LDA IBUF+4 746 03BC FE53 CPI 'S' ;IS COMMAND FILES? 747 03BE 0E06 MVI C,MAXFIL 748 03C0 CAC503 JZ FOUL 749 03C3 0E01 FOOT: MVI C,1 750 ; OUTPUT THE # OF ENTRIES IN C 751 03C5 212410 FOUL: LXI H,FILE0 752 03C8 79 MOV A,C 753 03C9 327D10 FINE: STA FOCNT ;SAVE COUNT 754 03CC E5 PUSH H 7551 756 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 757+ 19:26 09/08/2018 758+ PAGE 14 759 IMSAI SCS-1 REV. 2 06 OCT. 1976 760 761 762 03CD 110500 LXI D,NMLEN 763 03D0 19 DAD D 764 03D1 7E MOV A,M 765 03D2 B7 ORA A 766 03D3 C2E303 JNZ FOOD 767 03D6 23 INX H 768 03D7 86 ADD M 769 03D8 23 INX H 770 03D9 C2E303 JNZ FOOD ;NON ZERO, OK TO OUTPUT 771 03DC 33 INX SP 772 03DD 33 INX SP 773 03DE 23 INX H 774 03DF 23 INX H 775 03E0 C3F803 JMP FEET 776 ; HAVE AN ENTRY TO OUTPUT 777 03E3 E1 FOOD: POP H ;PTR 778 03E4 0E05 MVI C,NMLEN 779 03E6 46 FAST: MOV B,M ;LOAD CHARACTER TO B 780 03E7 CD0301 CALL OUT8 781 03EA 0D DCR C 782 03EB 23 INX H 783 03EC C2E603 JNZ FAST ;DO THE REST 784 ; NOW OUTPUT BEGIN-END PTRS 785 03EF CD0404 CALL FOOL ;OUTPUT BEGIN 786 03F2 CD0404 CALL FOOL ;OUTPUT END 787 03F5 CD0E01 CALL CRLF ;AND C/R 788 ; TEST COUNT, H,L POINTS PAST EOFP 789 03F8 110400 FEET: LXI D,FELEN-NMLEN-4 790 03FB 19 DAD D ;MOVE TO NEXT ENTRY 791 03FC 3A7D10 LDA FOCNT 792 03FF 3D DCR A ;TEST COUNT 793 0400 C2C903 JNZ FINE ;MORE TO DO 794 0403 C9 RET ;DONE! 795 ; OUTPUT NUMBER POINTED TO BY H,L 796 ; ON RET, H,L POINT 2 WORDS LATER 797 0404 CD5D02 FOOL: CALL BLK1 ;SPACE 798 0407 23 INX H 799 0408 7E MOV A,M 800 0409 2B DCX H 801 040A E5 PUSH H 802 040B CD3A02 CALL HOUT ;OUTPUT 803 040E E1 POP H 804 040F 7E MOV A,M 805 0410 23 INX H 806 0411 23 INX H 807 0412 E5 PUSH H 808 0413 CD4A02 CALL HOTB ;OUTPUT 809 0416 E1 POP H ;RESTORE H,L 810 0417 C9 RET 811 ; 812 ; SEARCH THE FILE DIRECTORY FOR THE FILE 8131 814 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 815+ 19:26 09/08/2018 816+ PAGE 15 817 IMSAI SCS-1 REV. 2 06 OCT. 1976 818 819 820 ; WHOSE NAME IS IN FBUF. 821 ; RETURN IF FOUND, ZERO IF OFF, H,L POINT TO 822 ; ENTRY WHILE SEARCHING, ON ENTRY FOUND WITH ADDR 823 ; ZERO, SET FEF TO >0 AND FREAD TO THE ADDR OF ENTRY 824 ; 825 0418 AF FSEA: XRA A 826 0419 327D10 STA FEF ;CLAIM NO FREE ENTRIES 827 041C 0606 MVI B,MAXFIL ;COUNT OF ENTRIES 828 041E 112410 LXI D,FILE0 ;TABLE ADDRESS 829 0421 217610 FSE10: LXI H,FBUF 830 0424 0E05 MVI C,NMLEN 831 0426 CD5301 CALL SEAR ;TEST STRINGS 832 0429 F5 PUSH PSW ;SAVE FLAG 833 042A D5 PUSH D 834 042B 1A LDAX D ;GET BOFP 835 042C B7 ORA A ;EMPTY ENTRY? 836 042D C24E04 JNZ FSE20 837 0430 13 INX D ;STORE OTHER WORD 838 0431 1A LDAX D 839 0432 B7 ORA A 840 0433 C24E04 JNZ FSE20 ;NOPE-GO TEST FOR MATCH 841 0436 EB XCHG 842 0437 11FAFF LXI D,-NMLEN-1 843 043A 19 DAD D ;MOVE TO BEGINNING 844 043B 227B10 SHLD FREAD ;SAVE ADDR 845 043E 7A MOV A,D 846 043F 327D10 STA FEF ;SET FREE ENTRY FOUND 847 0442 E1 POP H ;RESTORE INTERIM PTR 848 0443 F1 POP PSW ;UNJUNK STACK 849 ; MOVE TO NEXT ENTRY 850 0444 110800 FSE15: LXI D,FELEN-NMLEN 851 0447 19 DAD D 852 0448 EB XCHG ;NEXT ENTRY IN DE 853 0449 05 DCR B ;TEST COUNT 854 044A C8 RZ ;DONE--NOPE 855 044B C32104 JMP FSE10 ;TRY NEXT 856 ; ENTRY WASN?T FREE, TEST FOR MATCH 857 044E E1 FSE20: POP H 858 044F F1 POP PSW 859 0450 C24404 JNZ FSE15 ;IF ZERO CLEAR, NO MATCH 860 ; ENTRY FOUND 861 0453 11FBFF LXI D,-NMLEN ;BACKUP 862 0456 19 DAD D ;H,L POINTS TO ENTRY 863 0457 7A MOV A,D 864 0458 B7 ORA A ;CLEAR ZERO 865 0459 C9 RET ;THAT?S ALL 866 ; 867 ; OUTPUT ERROR MESSAGE FOR ILLEGAL COMMAND 868 ; 869 045A CD0E01 WHAT: CALL CRLF ;OUT CRLF 870 045D 216604 WHA1: LXI H,EMES ;MESSAGE ADDRESS 8711 872 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 873+ 19:26 09/08/2018 874+ PAGE 16 875 IMSAI SCS-1 REV. 2 06 OCT. 1976 876 877 878 0460 CD7A02 MESS: CALL SCRN 879 0463 C36700 JMP EOR 880 ; 881 0466 57484154 EMES: DB 'WHAT' 882 046A 0D DB 13 883 046B 46554C4C EMES1: DB 'FULL',13 884 046F 0D 885 0470 4E4F204E EMES2: DB 'NO NO',13 886 0474 4F0D 887 ; 888 ; CALL ROUTINE TO ENTER DATA INTO MEMORY 889 ; AND CHECK FOR ERROR ON RETURN 890 ; 891 ; THIS ROUTINE IS USED TO ENTER DATA VALUES INTO MEMORY. 892 ; EACH VALUE IS ONE BYTE AND IS WRITTEN IN HEXADECIMAL 893 ; VALUES GREATER THAN 255 WILL CAUSE CARRY TO BE SET 894 ; AND RETURN TO BE MADE TO CALLING PROGRAM 895 ; 896 0476 CD0003 ENTR: CALL VCHK ;CHECK FOR PARAMETERS 897 0479 CD8304 CALL ENTS 898 047C DA5A04 JC WHAT 899 047F CD0E01 CALL CRLF 900 0482 C9 RET 901 ; 902 002F EEND EQU '/' ;TERMINATION CHARACTER 903 0483 CD0E01 ENTS: CALL CRLF 904 0486 CD8000 CALL READ ;READ INPUT DATA 905 0489 21C710 LXI H,IBUF ;SET LINE POINTER 906 048C 229610 SHLD PNTR ;SAVE POINTER 907 048F CD6601 ENT1: CALL ZBUF ;CLEAR BUFFER 908 0492 CD0D09 CALL SBLK ;SCAN TO FIRST VALUE 909 0495 DA8304 JC ENTS ;JUMP IF CR FOUND 910 0498 FE2F CPI EEND 911 049A C8 RZ ;RETURN CARRY IS ZERO 912 049B CD750B CALL ALPS ;PLACE VALUE IN BUFFER 913 049E 78 MOV A,B ;GET DIGIT COUNT 914 049F FE03 CPI 3 ;CHECK NMBR OF DIGITS 915 04A1 3F CMC 916 04A2 D8 RC ;RETURN IF MORE THAN 2 DIGITS 917 04A3 017E10 LXI B,ABUF ;CONVERSION ADDRESS 918 04A6 CD1B02 CALL AHEX ;CONVERT VALUE 919 04A9 D8 RC ;ERROR IN HEX CHARACTER 920 04AA 7D MOV A,L 921 04AB 2A8A10 LHLD BBUF ;FETCH MEMORY ADDRESS 922 04AE 77 MOV M,A ;PUT IN MEMORY 923 04AF CD7502 CALL ACH1 ;INCREMENT MEMORY LOCATION 924 04B2 C38F04 JMP ENT1 925 ; 926 ; THIS ROUTINE IS USED TO ENTER LINES INTO THE FILE 927 ; AREA. THE LINE NUMBER IS FIRST CHECKED TO SEE IF IT IS 928 ; A VALID NUMBER (0000-9999). NEXT IT IS CHECKED TO SEE 9291 930 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 931+ 19:26 09/08/2018 932+ PAGE 17 933 IMSAI SCS-1 REV. 2 06 OCT. 1976 934 935 936 ; IF IT IS GREATER THAN THE MAXIMUM CURRENT LINE NUMBER. 937 ; IF IT IS, THE NEXT LINE IS INSERTED AT THE END OF THE 938 ; CURRENT FILE AND THE MAXIMUM LINE NUMBER IS UPDATED AS 939 ; WELL AS THE END OF FILE POSITION. LINE NUMBERS THAT 940 ; ALREADY EXIST ARE INSERTED INTO THE FILE AREA AT THE 941 ; APPROPRIATE PLACE AND ANY EXTRA CHARACTERS IN THE OLD 942 ; LINE ARE DELETED. 943 ; 944 04B5 3A2410 LINE: LDA FILE0 ;IS A FILE DEFINED? 945 04B8 B7 ORA A 946 04B9 CA5A04 JZ WHAT ;ABORT IF NOT 947 04BC 0E04 MVI C,4 ;NO OF DIGITS TO CHECK 948 04BE 21C610 LXI H,IBUF-1 ;INITIALIZE ADDRESS 949 04C1 23 LICK: INX H 950 04C2 7E MOV A,M ;FETCH LINE DIGIT 951 04C3 FE30 CPI '0' ;CHECK FOR VALID NUMBER 952 04C5 DA5A04 JC WHAT 953 04C8 FE3A CPI '9'+1 954 04CA D25A04 JNC WHAT 955 04CD 0D DCR C 956 04CE C2C104 JNZ LICK 957 04D1 227410 SHLD ADDS ;FIND ADDRESS 958 04D4 113010 LXI D,MAXL+3 ;GET ADDRESS 959 04D7 CDA205 CALL COM0 960 04DA D2FA04 JNC INSR 961 ; GET HERE IF NEW LINE IS GREATER THAN MAXIMUM LINE # 962 04DD 23 INX H 963 04DE CD9205 CALL LODM ;GET NEW LINE NUMBER 964 04E1 213010 LXI H,MAXL+3 965 04E4 CD9A05 CALL STOM ;MAKE IT MAXIMUM LINE NUMBER 966 04E7 11C610 LXI D,IBUF-1 967 04EA 2A2B10 LHLD EOFP ;END OF FILE POSITION 968 04ED 0E01 MVI C,1 969 04EF CD8005 CALL LMOV ;PLACE LINE IN FILE 970 04F2 3601 SEOF: MVI M,1 ;END OF FILE INDICATOR 971 04F4 222B10 SHLD EOFP ;END OF FILE ADDRESS 972 04F7 C36700 JMP EOR 973 ; GET HERE IF NEW LINE MUST BE INSERTED INTO ALREADY 974 ; EISTING FILE AREA 975 04FA CD5205 INSR: CALL FIN1 ;FIND LINE IN FILE 976 04FD 0E02 MVI C,2 977 04FF CA0305 JZ EQUL 978 0502 0D DCR C ;NEW LN NOT EQUAL TO SOME OLD LN 979 0503 46 EQUL: MOV B,M 980 0504 2B DCX H 981 0505 3602 MVI M,2 ;MOVE LINE INDICATOR 982 0507 227210 SHLD INSP ;INSERT LINE POSITION 983 050A 3AC610 LDA IBUF-1 ;NEW LINE COUNT 984 050D 0D DCR C 985 050E CA1805 JZ LESS ;NEW LN NOT = OLD LN 986 0511 90 SUB B ;COUNT DIFFERENCE 9871 988 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 989+ 19:26 09/08/2018 990+ PAGE 18 991 IMSAI SCS-1 REV. 2 06 OCT. 1976 992 993 994 0512 CA3B05 JZ ZERO ;LINE LENGTHS EQUAL 995 0515 DA2B05 JC MORE 996 ; GET HERE IF # OF CHARS IN OLD LINE > # OF CHARS IN 997 ; NEW LINE OR NEW LINE # WAS NOT EQUAL TO SOLD OLD 998 ; LINE # 999 0518 2A2B10 LESS: LHLD EOFP ;END OF FILE ADDRESS 1000 051B 54 MOV D,H 1001 051C 5D MOV E,L 1002 051D CD7B05 CALL ADR ;MOVE TO ADDRESS 1003 0520 222B10 SHLD EOFP ;NEW END OF FILE ADDRESS 1004 0523 0E02 MVI C,2 1005 0525 CD8905 CALL RMOV ;OPEN UP FILE AREA 1006 0528 C33B05 JMP ZERO 1007 ; GET HERE IF # OF CHARS IN OLD LINE < # OF CHARS IN 1008 ; NEW LINE 1009 052B 2F MORE: CMA 1010 052C 3C INR A ;COUNT DIFFERENCE 1011 052D 54 MOV D,H 1012 052E 5D MOV E,L 1013 052F CD7B05 CALL ADR 1014 0532 EB XCHG 1015 0533 CD8005 CALL LMOV ;DELETE EXCESS CHAR IN FILE 1016 0536 3601 MVI M,1 ;E-O-F INDICATOR 1017 0538 222B10 SHLD EOFP ;E-O-F ADDRESS 1018 ; GET HERE TO INSERT LINE INTO FILE AREA 1019 053B 2A7210 ZERO: LHLD INSP ;INSERT ADDRESS 1020 053E 360D MVI M,ASCR 1021 0540 23 INX H 1022 0541 11C610 LXI D,IBUF-1 ;NEW LINE ADDRESS 1023 0544 0E01 MVI C,1 ;CHECK VALUE 1024 0546 CD8005 CALL LMOV ;PLACE LINE IN FILE 1025 0549 C36700 JMP EOR 1026 ; 1027 ; THIS ROUTINE IS USED TO FIND A LN IN THE FILE AREA 1028 ; WHICH IS GREATER THAN OR EQUAL TO THE CURRENT LINE # 1029 ; 1030 054C 218110 FIND: LXI H,ABUF+3 ;BUFFER ADDRESS 1031 054F 227410 SHLD ADDS ;SAVE ADDRESS 1032 0552 2A2910 FIN1: LHLD BOFP ;BEGIN FILE ADDRESS 1033 0555 7C MOV A,H ;RETURN TO MONITOR IF 1034 0556 B5 ORA L ; FILE IS EMPTY... 1035 0557 CA6700 JZ EOR 1036 055A CD7405 FI1: CALL EO1 ;CHECK FOR END OF FILE 1037 055D EB XCHG 1038 055E 2A7410 LHLD ADDS ;FETCH FIND ADDRESS 1039 0561 EB XCHG 1040 0562 3E04 MVI A,4 1041 0564 CD7B05 CALL ADR ;BUMP LINE ADDRESS 1042 0567 CDA205 CALL COM0 ;COMPARE LINE NUMBERS 1043 056A D8 RC 1044 056B C8 RZ 10451 1046 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 1047+ 19:26 09/08/2018 1048+ PAGE 19 1049 IMSAI SCS-1 REV. 2 06 OCT. 1976 1050 1051 1052 056C 7E FI2: MOV A,M 1053 056D CD7B05 CALL ADR ;NEXT LINE ADDRESS 1054 0570 C35A05 JMP FI1 1055 ; 1056 ; WHEN SEARCHING THROUGH THE FILE AREA, THIS ROUTINE 1057 ; CHECKS TO SEE IF THE CURRENT ADDRESS IS THE END OF 1058 ; FILE 1059 ; 1060 0573 23 EOF: INX H 1061 0574 3E01 EO1: MVI A,1 ;E-O-F INDICATOR 1062 0576 BE CMP M 1063 0577 C0 RNZ 1064 0578 C36700 JMP EOR 1065 ; 1066 ; THIS ROUTINE IS USED TO ADD A VALUE TO AN ADDRESS 1067 ; CONTAINED IN REGISTER H,L 1068 ; 1069 057B 85 ADR: ADD L 1070 057C 6F MOV L,A 1071 057D D0 RNC 1072 057E 24 INR H 1073 057F C9 RET 1074 ; 1075 ; THIS ROUTINE WILL MOVE CHARACTER STRINGS FROM ONE 1076 ; LOCATION OF MEMORY TO ANOTHER 1077 ; CHARACTERS ARE MOVED FROM LOCATION ADDRESSED BY D,E 1078 ; TO LOCATION ADDRESSED BY H,L. ADDITIONAL CHARACTERS 1079 ; ARE MOVED BY BUMPING POINTERS UNTIL THE CHARACTER IN 1080 ; REG C IS FETCHED. 1081 ; 1082 0580 1A LMOV: LDAX D ;FETCH CHARACTER 1083 0581 13 INX D ;INCREMENT FETCH ADDRESS 1084 0582 B9 CMP C ;TERMINATION CHARACTER 1085 0583 C8 RZ 1086 0584 77 MOV M,A ;STORE CHARACTER 1087 0585 23 INX H ;INCREMENT STORE ADDRESS 1088 0586 C38005 JMP LMOV 1089 ; 1090 ; THIS ROUTINE IS SIMILAR TO ABOVE EXCEPT THAT THE 1091 ; CHARACTER ADDRESS IS DECREMENTED AFTER EACH FETCH 1092 ; AND STORE 1093 ; 1094 0589 1A RMOV: LDAX D ;FETCH CHARACTER 1095 058A 1B DCX D ;DECREMENT FETCH CHARACTER 1096 058B B9 CMP C ;TERMINATION CHARACTER 1097 058C C8 RZ 1098 058D 77 MOV M,A ;STORE CHARACTER 1099 058E 2B DCX H ;DECREMENT STORE ADDRESS 1100 058F C38905 JMP RMOV 1101 ; 1102 ; THIS ROUTINE IS USED TO LOAD FOUR CHARACTERS FROM 11031 1104 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 1105+ 19:26 09/08/2018 1106+ PAGE 20 1107 IMSAI SCS-1 REV. 2 06 OCT. 1976 1108 1109 1110 ; MEMORY INTO REGISTERS 1111 ; 1112 1113 0592 46 LODM: MOV B,M ;FETCH CHARACTER 1114 0593 23 INX H 1115 0594 4E MOV C,M ;FETCH CHARACTER 1116 0595 23 INX H 1117 0596 56 MOV D,M ;FETCH CHARACTER 1118 0597 23 INX H 1119 0598 5E MOV E,M ;FETCH CHARACTER 1120 0599 C9 RET 1121 ; 1122 ; THIS ROUTINE STORES FOUR CHARACTERS FROM THE REGISTERS 1123 ; INTO MEMORY 1124 ; 1125 059A 73 STOM: MOV M,E ;STORE CHARACTER 1126 059B 2B DCX H 1127 059C 72 MOV M,D ;STORE CHARACTER 1128 059D 2B DCX H 1129 059E 71 MOV M,C ;STORE CHARACTER 1130 059F 2B DCX H 1131 05A0 70 MOV M,B ;STORE CHARACTER 1132 05A1 C9 RET 1133 ; 1134 ; THIS ROUTINE IS USED TO COMPARE TWO CHARACTER STRINGS 1135 ; OF LENGTH 4, ON RETURN ZERO FLAG SET MEANS BOTH 1136 ; STRINGS ARE EQUAL. CARRY FLAG =0 MEANS STRING ADDRESS 1137 ; BY D,E WAS GREATER THAN OR EQUAL TO CHARACTER STRING 1138 ; ADDRESSED BY H,L 1139 ; 1140 05A2 0601 COM0: MVI B,1 ;EQUAL COUNTER 1141 05A4 0E04 MVI C,4 ;STRING LENGTH 1142 05A6 B7 ORA A ;CLEAR CARRY 1143 05A7 1A CO1: LDAX D ;FETCH CHARACTER 1144 05A8 9E SBB M ;COMPARE CHARACTERS 1145 05A9 CAAD05 JZ CO2 1146 05AC 04 INR B ;INCREMENT EQUAL COUNTER 1147 05AD 1B CO2: DCX D 1148 05AE 2B DCX H 1149 05AF 0D DCR C 1150 05B0 C2A705 JNZ CO1 1151 05B3 05 DCR B 1152 05B4 C9 RET 1153 ; 1154 ; THIS ROUTINE IS SIMILAR TO THE ABOVE ROUTINE EXCEPT ON 1155 ; RETURN CARRY FLAG = 0 MEANS THAT CHARACTER STRING 1156 ; ADDRESSED BY D,E IS ONLY > STRING ADDRESSED BY H,L. 1157 ; 1158 05B5 0E04 COM1: MVI C,4 ;STRING LENGTH 1159 05B7 1A LDAX D ;TCH CHARACTER 1160 05B8 D601 SUI 1 11611 1162 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 1163+ 19:26 09/08/2018 1164+ PAGE 21 1165 IMSAI SCS-1 REV. 2 06 OCT. 1976 1166 1167 1168 05BA C3A805 JMP CO1+1 1169 ; 1170 ; THIS ROUTINE WILL TAKE ASCII CHARACTERS AND ADD ANY 1171 ; NECESSARY ASCII ZEROES SO THE RESULT IS A 4 CHARACTER 1172 ; ASCII VALUE 1173 ; 1174 05BD CD9205 NORM: CALL LODM ;LOAD CHARACTERS 1175 05C0 AF XRA A ;FETCH A ZERO 1176 05C1 B8 CMP B 1177 05C2 C8 RZ 1178 05C3 BB NOR1: CMP E 1179 05C4 C49A05 CNZ STOM ;STORE VALUES 1180 05C7 C0 RNZ 1181 05C8 5A MOV E,D ;NORMALIZE VALUE 1182 05C9 51 MOV D,C 1183 05CA 48 MOV C,B 1184 05CB 0630 MVI B,'0' 1185 05CD C3C305 JMP NOR1 1186 ; 1187 ; THIS ROUTINE IS USED TO LIST THE CONTENTS OF THE FILE 1188 ; AREA STARTING AT THE LINE NUMBER GIVEN IN THE COMMAND 1189 ; 1190 05D0 CD0E01 LIST: CALL CRLF 1191 05D3 CD4C05 CALL FIND ;FIND STARTING LINE NUMBER 1192 05D6 23 LIST0: INX H ;OUTPUT LINE... 1193 05D7 CD7A02 CALL SCRN 1194 05DA CD0E01 CALL CRLF 1195 05DD CD7305 CALL EOF ;CHECK FOR END OF FILE 1196 05E0 CDE900 CALL INK ;CHECK FOR ?X 1197 05E3 C2D605 JNZ LIST0 ;LOOP IF NO ?X 1198 05E6 C9 RET 1199 ; 1200 ; THIS ROUTINE IS USED TO DELETE LINES FROM THE 1201 ; FILE AREA. THE REMAINING FILE AREA IS THEN MOVED IN 1202 ; MEMORY SO THAT THERE IS NO EXCESS SPACE. 1203 ; 1204 05E7 CD0003 DELL: CALL VCHK ;CHECK FOR PARAMETER 1205 05EA CD4C05 CALL FIND ;FIND LINE IN FILE AREA 1206 05ED 227210 SHLD DELP ;SAVE DELETE POSITION 1207 05F0 218510 LXI H,ABUF+7 1208 05F3 7E MOV A,M ;CHECK FOR 2ND PARAMETER 1209 05F4 B7 ORA A ;SET FLAGS 1210 05F5 C2FB05 JNZ DEL1 1211 05F8 218110 LXI H,ABUF+3 ;USE FIRST PARAMETER 1212 05FB 227410 DEL1: SHLD ADDS ;SAVE FIND ADDRESS 1213 05FE EB XCHG 1214 05FF 213010 LXI H,MAXL+3 1215 0602 CDA205 CALL COM0 ;COMPARE LINE NUMBERS 1216 0605 2A7210 LHLD DELP ;LOAD DELETE POSITION 1217 0608 DA4906 JC NOVR 1218 ; GET HERE IF DELETION INVOLVES END OF FILE 12191 1220 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 1221+ 19:26 09/08/2018 1222+ PAGE 22 1223 IMSAI SCS-1 REV. 2 06 OCT. 1976 1224 1225 1226 060B 222B10 SHLD EOFP ;CHANGE E-O-F POSITION 1227 060E 3601 MVI M,1 ;SET E-O-F INDICATOR 1228 0610 EB XCHG 1229 0611 2A2910 LHLD BOFP 1230 0614 EB XCHG 1231 0615 060D MVI B,13 ;SET SCAN SWITCH 1232 0617 2B DCX H ;CHECK FOR BOFP 1233 0618 7D DEL2: MOV A,L 1234 0619 93 SUB E 1235 061A 7C MOV A,H 1236 061B 9A SBB D 1237 061C 3E0D MVI A,ASCR ;LOOK FOR CR 1238 061E DA4006 JC DEL4 ;DECREMENTED PAST BOF 1239 0621 05 DCR B 1240 0622 2B DCX H 1241 0623 BE CMP M ;FIND NEW MAX LN 1242 0624 C21806 JNZ DEL2 1243 0627 2B DCX H 1244 0628 7D MOV A,L 1245 0629 93 SUB E 1246 062A 7C MOV A,H 1247 062B 9A SBB D 1248 062C DA4106 JC DEL5 1249 062F BE CMP M ;END OF PREVIOUS LINE 1250 0630 23 INX H 1251 0631 23 INX H 1252 0632 CA3606 JZ DEL3 1253 0635 23 INX H 1254 0636 CD9205 DEL3: CALL LODM ;LOAD NEW MAX LN 1255 0639 213010 LXI H,MAXL+3 ;SET ADDRESS 1256 063C CD9A05 CALL STOM ;STORE NEW MAX LN 1257 063F C9 RET 1258 0640 B8 DEL4: CMP B ;CHECK SWITCH 1259 0641 EB DEL5: XCHG 1260 0642 C23506 JNZ DEL3-1 1261 0645 322D10 STA MAXL ;MAKE MAX LN A SMALL NUMBER 1262 0648 C9 RET 1263 ; GET HERE IF DELETION IS IN THE MIDDLE OF FILE AREA 1264 0649 CD5A05 NOVR: CALL FI1 ;FIND END OF DELETE AREA 1265 064C CC6C05 CZ FI2 ;NEXT LINE IF THIS LN EQUAL 1266 064F EB NOV1: XCHG 1267 0650 2A7210 LHLD DELP ;CHAR MOVE TO POSITION 1268 0653 0E01 MVI C,1 ;MOVE TERMINATOR 1269 0655 CD8005 CALL LMOV ;COMPACT FILE AREA 1270 0658 222B10 SHLD EOFP ;SET EOF POSITION 1271 065B 3601 MVI M,1 ;SET EOF INDICATOR 1272 065D C9 RET 1273 ; 1274 ; STARTING HERE IS THE SELF ASSEMBLER PROGRAM 1275 ; THIS PROGRAM ASSEMBLES PROGRAMS WHICH ARE 1276 ; IN THE FILE AREA 12771 1278 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 1279+ 19:26 09/08/2018 1280+ PAGE 23 1281 IMSAI SCS-1 REV. 2 06 OCT. 1976 1282 1283 1284 ; 1285 065E CD0003 ASSM: CALL VCHK ;CHECK FOR PARAMETERS 1286 0661 3A8210 LDA ABUF+4 ;GET 2ND PARAMETER 1287 0664 B7 ORA A ;CHECK FOR PRARMETERS 1288 0665 C26E06 JNZ ASM4 1289 0668 2A8A10 LHLD BBUF ;FETCH 1ST PARAMETER 1290 066B 228C10 SHLD BBUF+2 ;STORE INTO 2ND PARAMETER 1291 066E 3ACB10 ASM4: LDA IBUF+4 ;FETCH INPUT CHARACTER 1292 0671 D645 SUI 'E' ;RESET IF ERRORS ONLY 1293 0673 328E10 STA AERR ;SAVE ERROR FLAG 1294 0676 AF XRA A ;GET A ZERO 1295 0677 329810 STA NOLA ;INITIALIZE LABEL COUNT 1296 067A 329410 ASM3: STA PASI ;SET PASS INDICATOR 1297 067D CD0E01 CALL CRLF ;INDICATE START OF PASS 1298 0680 2A8A10 LHLD BBUF ;FETCH ORIGIN 1299 0683 229210 SHLD ASPC ;INITIALIZE PC 1300 0686 2A2910 LHLD BOFP ;GET START OF FILE 1301 0689 227210 SHLD APNT 1302 068C 2A7210 ASM1: LHLD APNT ;FETCH LINE POINTER 1303 068F 31B210 LXI SP,AREA+18 1304 0692 7E MOV A,M ;FETCH CHARACTER 1305 0693 FE01 CPI 1 ;END OF FILE? 1306 0695 CA0109 JZ EASS ;JUMP IF END OF FILE 1307 0698 EB XCHG 1308 0699 13 INX D ;INCREMENT ADDRESS 1309 069A 21B210 LXI H,OBUF ;BLANK START ADDRESS 1310 069D 3EC2 MVI A,IBUF-5 AND 0FFH ;BLANK END ADDRESS 1311 069F CDE100 CALL CLER ;BLANK OUT BUFFER 1312 06A2 0E0D MVI C,ASCR ;STOP CHARACTER 1313 06A4 CD8005 CALL LMOV ;MOVE LINE INTO BUFFER 1314 06A7 71 MOV M,C ;PLACE CR IN BUFFER 1315 06A8 EB XCHG 1316 06A9 227210 SHLD APNT ;SAVE ADDRESS 1317 06AC 3A9410 LDA PASI ;FETCH PASS INDICATOR 1318 06AF B7 ORA A ;SET FLAGW 1319 06B0 C2B906 JNZ ASM2 ;JUMP IF PASS 2 1320 06B3 CDDC06 CALL PAS1 1321 06B6 C38C06 JMP ASM1 1322 ; 1323 06B9 CD9307 ASM2: CALL PAS2 1324 06BC 21B210 LXI H,OBUF ;OUTPUT BUFFER ADDRESS 1325 06BF CDC506 CALL AOUT ;OUTPUT LINE 1326 06C2 C38C06 JMP ASM1 1327 ; 1328 ; THIS ROUTINE IS USED TO OUTPUT THE LISTING FOR 1329 ; AN ASSEMBLY. IT CHECKS THE ERROR SWITCH TO SEE IF 1330 ; ALL LINES ARE TO BE PRINTED OR JUST THOSE WITH 1331 ; ERRORS. 1332 ; 1333 06C5 3A8E10 AOUT: LDA AERR ;FETCH ERROR SWITCH 1334 06C8 B7 ORA A ;SET FLAGS 13351 1336 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 1337+ 19:26 09/08/2018 1338+ PAGE 24 1339 IMSAI SCS-1 REV. 2 06 OCT. 1976 1340 1341 1342 06C9 C2D206 JNZ AOU1 ;OUTPUT ALL LINES 1343 06CC 3AB210 AOU2: LDA OBUF ;FETCH ERROR INDICATOR 1344 06CF FE20 CPI ' ' ;CHECK FOR AN ERROR 1345 06D1 C8 RZ ;RETURN IF NO ERROR 1346 06D2 21B210 AOU1: LXI H,OBUF ;OUTPUT BUFFER ADDRESS 1347 06D5 CD7A02 CALL SCRN ;OUTPUT LINE... 1348 06D8 CD0E01 CALL CRLF 1349 06DB C9 RET 1350 ; 1351 ; PASS 1 OF ASSEMBLER, USED TO FORM SYMBOL TABLE 1352 ; 1353 06DC CD6601 PAS1: CALL ZBUF ;CLEAR BUFFER 1354 06DF 329410 STA PASI ;SET FOR PASS1 1355 06E2 21C710 LXI H,IBUF ;INITIALIZE LINE POINTER 1356 06E5 229610 SHLD PNTR 1357 06E8 7E MOV A,M ;FETCH CHARACTER 1358 06E9 FE20 CPI ' ' ;CHECK FOR A BLANK 1359 06EB CA1E07 JZ OPC ;JUMP IF NO LABLE 1360 06EE FE2A CPI '*' ;CHECK FOR COMMENT 1361 06F0 C8 RZ ;RETURN IF COMMENT 1362 ; 1363 ; PROCESS LABEL 1364 ; 1365 06F1 CD200B CALL SLAB ;GET AND CHECK LABEL 1366 06F4 DADF0A JC OP5 ;ERROR IN LABEL 1367 06F7 CAC70C JZ ERRD ;DUPLICATE LABEL 1368 06FA CD3507 CALL LCHK ;CHECK CHARACTER AFTER LABEL 1369 06FD C2DF0A JNZ OP5 ;ERROR IF NO BLANK 1370 0700 0E05 MVI C,LLAB ;LENGTH OF LABELS 1371 0702 217E10 LXI H,ABUF ;SET BUFFER ADDRESS 1372 0705 7E MLAB: MOV A,M ;FETCH NEXT CHARACTER 1373 0706 12 STAX D ;STORE IN SYMBOL TABLE 1374 0707 13 INX D 1375 0708 23 INX H 1376 0709 0D DCR C 1377 070A C20507 JNZ MLAB 1378 070D EB XCHG 1379 070E 229010 SHLD TABA ;SAVE TABLE ADDRESS FOR EQU 1380 0711 3A9310 LDA ASPC+1 ;FETCH PC (HIGH) 1381 0714 77 MOV M,A 1382 0715 23 INX H 1383 0716 3A9210 LDA ASPC ;FETCH PC (LOW) 1384 0719 77 MOV M,A ;STORE IN TABLE 1385 071A 219810 LXI H,NOLA 1386 071D 34 INR M ;INCREMENT NUMBER OF LABELS 1387 ; 1388 ; PROCESS OPCODE 1389 ; 1390 071E CD6601 OPC: CALL ZBUF ;ZERO WORKING BUFFER 1391 0721 CD0D09 CALL SBLK ;SCAN TO OPCODE 1392 0724 DA060B JC OERR ;FOUND CARRIAGE RETURN 13931 1394 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 1395+ 19:26 09/08/2018 1396+ PAGE 25 1397 IMSAI SCS-1 REV. 2 06 OCT. 1976 1398 1399 1400 0727 CD750B CALL ALPS ;PLACE OPCODE IN BUFFER 1401 072A FE20 CPI ' ' ;CHECK FOR BLANK AFTER OPCODE 1402 072C DA650A JC OPCD ;CR AFTER OPCODE 1403 072F C2060B JNZ OERR ;ERROR IF NO BLANK 1404 0732 C3650A JMP OPCD ;CHECK OPCODE 1405 ; 1406 ; THIS ROUTINE CHECKS THE CHARACTER AFTER A LABEL 1407 ; FOR A BLANK OR COLON 1408 ; 1409 0735 2A9610 LCHK: LHLD PNTR 1410 0738 7E MOV A,M ;GET CHARACTER AFTER LABEL 1411 0739 FE20 CPI ' ' ;CHECK FOR BLANK 1412 073B C8 RZ ;RETURN IF A BLANK 1413 073C FE3A CPI ':' ;CHECK FOR COLON 1414 073E C0 RNZ 1415 073F 23 INX H 1416 0740 229610 SHLD PNTR ;SAVE POINTER 1417 0743 C9 RET 1418 ; 1419 ; PROCESS ANY PSEUDO OPS THAT NEED TO BE IN PASS 1 1420 ; 1421 0744 CD0D09 PSU1: CALL SBLK ;SCAN TO OPERAND 1422 0747 1A LDAX D ;FETCH VALUE 1423 0748 B7 ORA A ;SET FLAGS 1424 0749 CA6007 JZ ORG1 ;ORG OPCODE 1425 074C FA9007 JM DAT1 ;DATA STATEMENT 1426 074F E27507 JPO EQU1 ;EQU OPCODE 1427 0752 FE05 CPI 5 1428 0754 DA8807 JC RES1 ;RES OPCODE 1429 0757 C20109 JNZ EASS ;JUMP IF END 1430 ; DO DW PSEUDO/OP 1431 075A 0E02 ACO1: MVI C,2 ;2 BYTE INSTRUCTION 1432 075C AF XRA A ;GET A ZERO 1433 075D C3F50A JMP OCN1 ;ADD VALUE TO PROGRAM COUNTER 1434 ; DO ORG PSUEDO OP 1435 0760 CD970B ORG1: CALL ASCN ;GET OPERAND 1436 0763 3AB210 LDA OBUF ;FETCH ERROR INDICATOR 1437 0766 FE20 CPI ' ' ;CHECK FOR AN ERROR 1438 0768 C0 RNZ 1439 0769 229210 SHLD ASPC ;STORE NEW ORIGIN 1440 076C 3AC710 LDA IBUF ;GET FIRST CHARACTER 1441 076F FE20 CPI ' ' ;CHECK FOR AN ERROR 1442 0771 C8 RZ ;NO LABEL 1443 0772 C38007 JMP EQUS ;CHANGE LABEL VALUE 1444 ; DO EQU PSUEDO-OP 1445 0775 CD970B EQU1: CALL ASCN ;GET OPERAND 1446 0778 3AC710 LDA IBUF ;FETCH 1ST CHARACTER 1447 077B FE20 CPI ' ' ;CHECK FOR LABEL 1448 077D CA9F0C JZ ERRM ;MISSING LABEL 1449 0780 EB EQUS: XCHG 1450 0781 2A9010 LHLD TABA ;SYMBOL TABLE ADDRESS 14511 1452 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 1453+ 19:26 09/08/2018 1454+ PAGE 26 1455 IMSAI SCS-1 REV. 2 06 OCT. 1976 1456 1457 1458 0784 72 MOV M,D ;STORE LABEL VALUE 1459 0785 23 INX H 1460 0786 73 MOV M,E 1461 0787 C9 RET 1462 ; DO DS PSEUDO-OP 1463 0788 CD970B RES1: CALL ASCN ;GET OPERAND 1464 078B 44 MOV B,H 1465 078C 4D MOV C,L 1466 078D C3ED07 JMP RES21 ;ADD VALUE TO PROGRAM COUNTER 1467 ; 1468 ; DO DB PSEUDO-OP 1469 ; 1470 0790 C3F407 DAT1: JMP DAT2A 1471 ; 1472 ; PERFORM PASS 2 OF THE ASSEMBLER 1473 ; 1474 0793 21B410 PAS2: LXI H,OBUF+2 ;SET OUTPUT BUFFER ADDRESS 1475 0796 3A9310 LDA ASPC+1 ;FETCH PC (HIGH) 1476 0799 CD8902 CALL BINH+3 ;CONVERT FOR OUTPUT 1477 079C 23 INX H 1478 079D 3A9210 LDA ASPC ;FETCH PC(LOW) 1479 07A0 CD8902 CALL BINH+3 ;CONVERT FOR OUTPUT 1480 07A3 23 INX H 1481 07A4 229E10 SHLD OIND ;SAVE OUTPUT ADDRESS 1482 07A7 CD6601 CALL ZBUF ;CLEAR BUFFER 1483 07AA 21C710 LXI H,IBUF ;INITIALIZE LINE POINTER 1484 07AD 229610 PABL: SHLD PNTR ;SAVE POINTER 1485 07B0 7E MOV A,M ;FETCH FIRST CHARACTER 1486 07B1 FE20 CPI ' ' ;CHECK FOR LABEL 1487 07B3 CA1E07 JZ OPC ;GET OPCODE 1488 07B6 FE2A CPI '*' ;CHECK FOR COMMENT 1489 07B8 C8 RZ ;RETURN IF COMMENT 1490 07B9 CD200B CALL SLAB ;SCAN OFF LABEL 1491 07BC DAC20C JC ERRL ;ERROR IN LABEL 1492 07BF CD3507 CALL LCHK ;CHECK FOR A BLANK OR COLON 1493 07C2 C2C20C JNZ ERRL ;ERROR IF NOT A BLANK 1494 07C5 C31E07 JMP OPC 1495 ; 1496 ; PROCESS PSEUDO OPS FOR PASS2 1497 ; 1498 07C8 1A PSU2: LDAX D 1499 07C9 B7 ORA A ;SET FLAGS 1500 07CA CA0C08 JZ ORG2 ;ORG OPCODE 1501 07CD FAF107 JM DAT2 ;DATA OPCODE 1502 07D0 E2FA07 JPO EQU2 ;EQUATE PSEUDO-OP 1503 07D3 FE05 CPI 5 1504 07D5 DAE107 JC RES2 ;RES OPCODE 1505 07D8 C20109 JNZ EASS ;END OPCODE 1506 ; DO DW OPCODE 1507 07DB CDE108 ACO2: CALL TYS6 ;GET VALUE 1508 07DE C35A07 JMP ACO1 15091 1510 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 1511+ 19:26 09/08/2018 1512+ PAGE 27 1513 IMSAI SCS-1 REV. 2 06 OCT. 1976 1514 1515 1516 ; DO DS PSEUDO-OP 1517 07E1 CD940B RES2: CALL ASBL ;GET OPERAND 1518 07E4 44 MOV B,H 1519 07E5 4D MOV C,L 1520 07E6 2A8C10 LHLD BBUF+2 ;FETCH STORAGE COUNTER 1521 07E9 09 DAD B ;ADD VALUE 1522 07EA 228C10 SHLD BBUF+2 1523 07ED AF RES21: XRA A ;GET A ZERO 1524 07EE C3F80A JMP OCN2 1525 ; DO DB PSEUDO-OP 1526 07F1 CDA008 DAT2: CALL TY55 ;GET OPERAND 1527 07F4 AF DAT2A: XRA A ;MAKE ZERO 1528 07F5 0E01 MVI C,1 ;BYTE COUNT 1529 07F7 C3F50A JMP OCN1 1530 ; 1531 ; HANDLE EQUATES ON 2ND PASS 1532 ; 1533 07FA CD940B EQU2: CALL ASBL ;GET OPERAND INTO HL AND 1534 ; FALL INTO NEXT ROUTINE 1535 ; 1536 ; STORE CONTENTS OF HL AS HEX ASCII AT OBUF+2 1537 ; ON RETURN, DE HOLDS VALUE WHICH WAS IN HL. 1538 ; 1539 07FD EB BINAD: XCHG ;PUT VALUE INTO DE 1540 07FE 21B410 LXI H,OBUF+2 ;POINTER TO ADDR IN OBUF 1541 0801 7A MOV A,D ;STORE HI BYTE 1542 0802 CD8902 CALL BINH+3 1543 0805 23 INX H 1544 0806 7B MOV A,E ;STORE LOW BYTE... 1545 0807 CD8902 CALL BINH+3 1546 080A 23 INX H 1547 080B C9 RET 1548 ; DO ORG PSEUDO-OP 1549 080C CD940B ORG2: CALL ASBL ;GET NEW ORIGIN 1550 080F 3AB210 LDA OBUF ;GET ERROR INDICATOR 1551 0812 FE20 CPI ' ' ;CHECK FOR AN ERROR 1552 0814 C0 RNZ ;DON?T MODIFY PC IF ERROR 1553 0815 CDFD07 CALL BINAD ;STORE NEW ADDR IN OBUF 1554 0818 2A9210 LHLD ASPC ;FETCH PC 1555 081B EB XCHG 1556 081C 229210 SHLD ASPC ;STORE NEW PC 1557 081F 7D MOV A,L 1558 0820 93 SUB E ;FORM DIFFERENCE OF ORIGINS 1559 0821 5F MOV E,A 1560 0822 7C MOV A,H 1561 0823 9A SBB D 1562 0824 57 MOV D,A 1563 0825 2A8C10 LHLD BBUF+2 ;FETCH STORAGE POINTER 1564 0828 19 DAD D ;MODIFY 1565 0829 228C10 SHLD BBUF+2 ;SAVE 1566 082C C9 RET 15671 1568 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 1569+ 19:26 09/08/2018 1570+ PAGE 28 1571 IMSAI SCS-1 REV. 2 06 OCT. 1976 1572 1573 1574 ; 1575 ; PROCESS 1 BYTE INSTRUCTIONS WITHOUT OPERANDS 1576 ; 1577 082D CDEE08 TYP1: CALL ASTO ;STORE VALUE IN MEMORY 1578 0830 C9 RET 1579 ; 1580 ; PROCESS STAX AND LDAX INSTRUCTIONS 1581 ; 1582 0831 CD940B TYP2: CALL ASBL ;FETCH OPERAND 1583 0834 C4810C CNZ ERRR ;ILLEGAL REGISTER 1584 0837 7D MOV A,L ;GET LOW ORDER OPERAND 1585 0838 B7 ORA A ;SET FLAGS 1586 0839 CA5508 JZ TY31 ;OPERAND = 0 1587 083C FE02 CPI 2 ;OPERAND = 2 1588 083E C4810C CNZ ERRR ;ILLEGAL REGISTER 1589 0841 C35508 JMP TY31 1590 ; 1591 ; PROCESS PUSH, POP, INX, DCX, DAD INSTRUCTIONS 1592 ; 1593 0844 CD940B TYP3: CALL ASBL ;FETCH OPERAND 1594 0847 C4810C CNZ ERRR ;ILLEGAL REGISTER 1595 084A 7D MOV A,L ;GET LOW ORDER OPERAND 1596 084B 0F RRC ;CHECK LOW ORDER BIT 1597 084C DC810C CC ERRR ;ILLEGAL REGISTER 1598 084F 17 RAL ;RESTORE 1599 0850 FE08 CPI 8 1600 0852 D4810C CNC ERRR ;ILLEGAL REGISTER 1601 0855 07 TY31: RLC ;MULTIPLY BY 8 1602 0856 17 RAL 1603 0857 17 RAL 1604 0858 47 TY32: MOV B,A 1605 0859 1A LDAX D ;FETCH OPCODE BASE 1606 085A 80 ADD B ;FORM OPCODE 1607 085B FE76 CPI 118 ;CHECK FOR MOV M,M 1608 085D CC810C CZ ERRR ;ILLEGAL REGISTER 1609 0860 C32D08 JMP TYP1 1610 ; 1611 ; PROCESS ACCUMULATOR, INR,DCR,MOV,RST INSTRUCTIONS 1612 ; 1613 0863 CD940B TYP4: CALL ASBL ;FETCH OPERAND 1614 0866 C4810C CNZ ERRR ;ILLEGAL REGISTER 1615 0869 7D MOV A,L ;GET LOW ORDER OPERAND 1616 086A FE08 CPI 8 1617 086C D4810C CNC ERRR ;ILLEGAL REGISTER 1618 086F 1A LDAX D ;FETCH OPCODE BASE 1619 0870 FE40 CPI 64 ;CHECK FOR MOV INSTRUCTION 1620 0872 CA8108 JZ TY41 1621 0875 FEC7 CPI 199 1622 0877 7D MOV A,L 1623 0878 CA5508 JZ TY31 ;RST INSTRUCTION 1624 087B FA5808 JM TY32 ;ACCUMULATOR INSTRUCTION 16251 1626 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 1627+ 19:26 09/08/2018 1628+ PAGE 29 1629 IMSAI SCS-1 REV. 2 06 OCT. 1976 1630 1631 1632 087E C35508 JMP TY31 ;INR, DCR 1633 ; PROCESS MOV INSTRUCTION 1634 0881 29 TY41: DAD H ;MULTIPLY OPERAND BY 8 1635 0882 29 DAD H 1636 0883 29 DAD H 1637 0884 85 ADD L ;FORM OPCODE 1638 0885 12 STAX D ;SAVE OPCODE 1639 0886 CDBF08 CALL MPNT 1640 0889 CD970B CALL ASCN 1641 088C C4810C CNZ ERRR ;INCREMENT POINTER 1642 088F 7D MOV A,L 1643 0890 FE08 CPI 8 1644 0892 D4810C CNC ERRR ;ILLEGAL REGISTER 1645 0895 C35808 JMP TY32 1646 ; 1647 ; PROCESS IMMEDIATE INSTRUCTIONS 1648 ; IMMEDIATE BYTE CAN BETWEEN -256 AND +255 1649 ; MVI INSTRUCTION IS A SPECIAL CASE AND CONTAINS 1650 ; 2 ARGUMENTS IN OPERAND 1651 ; 1652 0898 FE06 TYP5: CPI 6 ;CHECK FOR MVI 1653 089A CCAD08 CZ TY56 1654 089D CDEE08 CALL ASTO ;STORE OBJECT BYTE 1655 08A0 CD940B TY55: CALL ASBL ;GET IMMEDIATE ARGUMENT 1656 08A3 3C INR A 1657 08A4 FE02 CPI 2 ;CHECK OPERAND FOR RANGE 1658 08A6 D49A0C CNC ERRV 1659 08A9 7D MOV A,L 1660 08AA C32D08 JMP TYP1 1661 ; 1662 ; FETCH 1ST ARG FOR MVI AND LXI INSTRUCTIONS 1663 ; 1664 08AD CD940B TY56: CALL ASBL ;FETCH ARG 1665 08B0 C4810C CNZ ERRR ;ILLEGAL REGISTER 1666 08B3 7D MOV A,L ;GET LOW ORDER ARGUMENT 1667 08B4 FE08 CPI 8 1668 08B6 D4810C CNC ERRR ;ILLEGAL REGISTER 1669 08B9 29 DAD H 1670 08BA 29 DAD H 1671 08BB 29 DAD H 1672 08BC 1A LDAX D ;FETCH OPCODE BASE 1673 08BD 85 ADD L ;FOR OPCODE 1674 08BE 5F MOV E,A ;SAVE OBJECT BYTE 1675 08BF 2A9610 MPNT: LHLD PNTR ;FETCH POINTER 1676 08C2 7E MOV A,M ;FETCH CHARACTER 1677 08C3 FE2C CPI ',' ;CHECK FOR COMMA 1678 08C5 23 INX H ;INCREMENT POINTER 1679 08C6 229610 SHLD PNTR 1680 08C9 C28A0C JNZ ERRS ;SYNTAX ERROR IF NO COMMA 1681 08CC 7B MOV A,E 1682 08CD C9 RET 16831 1684 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 1685+ 19:26 09/08/2018 1686+ PAGE 30 1687 IMSAI SCS-1 REV. 2 06 OCT. 1976 1688 1689 1690 ; 1691 ; PROCESS 3 BYTE INSTRUCTIONS 1692 ; LXI INSTRUCTION IS A SPECIAL CASE 1693 ; 1694 08CE FE01 TYP6: CPI 1 ;CHECK FOR LXI INSTRUCTION 1695 08D0 C2DE08 JNZ TY6 ;JUMP IF NOT LXI 1696 08D3 CDAD08 CALL TY56 ;GET REGISTER 1697 08D6 E608 ANI 08H ;CHECK FOR ILLEGAL REGISTER 1698 08D8 C4810C CNZ ERRR ;REGISTER ERROR 1699 08DB 7B MOV A,E ;GET OPCODE 1700 08DC E6F7 ANI 0F7H ;CLEAR BIT IN ERROR 1701 08DE CDEE08 TY6: CALL ASTO ;STORE OBJECT BYTE 1702 08E1 CD940B TYS6: CALL ASBL ;FETCH OPERAND 1703 08E4 7D MOV A,L 1704 08E5 54 MOV D,H 1705 08E6 CDEE08 CALL ASTO ;STORE 2ND BYTE 1706 08E9 7A MOV A,D 1707 08EA C32D08 JMP TYP1 1708 08ED C9 RET 1709 ; 1710 ; THIS ROUTINE IS USED TO STORE OBJECT CODE PRODUCED 1711 ; BY THE ASSEMBLER DURING PASS 2 INTO MEMORY 1712 ; 1713 08EE 2A8C10 ASTO: LHLD BBUF+2 ;FETCH STORAGE ADDRESS 1714 08F1 77 MOV M,A ;STORE OBJECT BYTE 1715 08F2 23 INX H ;INCREMENT LOCATION 1716 08F3 228C10 SHLD BBUF+2 1717 08F6 2A9E10 LHLD OIND ;FETCH OUTPUT ADDRESS 1718 08F9 23 INX H 1719 08FA CD8902 CALL BINH+3 ;CONVERT OBJECT BYTE 1720 08FD 229E10 SHLD OIND 1721 0900 C9 RET 1722 ; 1723 ; GET HERE WHEN END PSEUDO-OP IS FOUND OR WHEN 1724 ; END-OF-FILE OCCURS IN SOURCE FILE. CONTROL IS SET 1725 ; FOR EITHER PASS 2 OR ASSEMBLY TERMINATOR IF FINISHED 1726 ; 1727 0901 3A9410 EASS: LDA PASI ;FETCH PASS INDICATOR 1728 0904 B7 ORA A ;SET FLAGS 1729 0905 C26700 JNZ EOR ;JUMP IF FINISHED 1730 0908 3E01 MVI A,1 ;PASS INDICATOR FOR 2ND PASS 1731 090A C37A06 JMP ASM3 ;DO 2ND PASS 1732 ; 1733 ; THIS ROUTINE SCANS THROUGH A CHARACTER STRING UNTIL 1734 ; THE FIRST NON-BLANK CHARACTER IS FOUND 1735 ; 1736 ; ON RETURN, CARRY SET INDICATES A CARRIAGE RETURN 1737 ; AS FIRST NON-BLANK CHARACTER. 1738 ; 1739 090D 2A9610 SBLK: LHLD PNTR ;FETCH ADDRESS 1740 0910 7E SBL1: MOV A,M ;FETCH CHARACTER 17411 1742 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 1743+ 19:26 09/08/2018 1744+ PAGE 31 1745 IMSAI SCS-1 REV. 2 06 OCT. 1976 1746 1747 1748 0911 FE20 CPI ' ' ;CHECK FOR BLANK 1749 0913 C0 RNZ ;RETURN IF NON-BLANK 1750 0914 23 SBL2: INX H ;INCREMENT 1751 0915 229610 SHLD PNTR ;SAVE POINTER 1752 0918 C31009 JMP SBL1 1753 ; 1754 ; THIS ROUTINE IS USED TO CHECK THE CONDITION 1755 ; CODE NMEUMONICS FOR CONDITIONAL JUMPS, CALLS, 1756 ; AND RETURNS. 1757 ; 1758 091B 217F10 COND: LXI H,ABUF+1 1759 091E 227410 SHLD ADDS 1760 0921 0602 MVI B,2 ;2 CHARACTERS 1761 0923 CD500A CALL COPC 1762 0926 C9 RET 1763 ; 1764 ; THE FOLLOWING IS THE OPCODE TABLE 1765 ; 1766 0927 4F5247 OTAB: DB 'ORG' 1767 092A 00 DB 0 1768 092B 00 DB 0 1769 092C 455155 DB 'EQU' 1770 092F 00 DB 0 1771 0930 01 DB 1 1772 0931 4442 DB 'DB' 1773 0933 00 DB 0 1774 0934 00 DB 0 1775 0935 FF DB -1 AND 0FFH 1776 0936 4453 DB 'DS' 1777 0938 00 DB 0 1778 0939 00 DB 0 1779 093A 03 DB 3 1780 093B 4457 DB 'DW' 1781 093D 00 DB 0 1782 093E 00 DB 0 1783 093F 05 DB 5 1784 0940 454E44 DB 'END' 1785 0943 00 DB 0 1786 0944 06 DB 6 1787 0945 00 DB 0 1788 0946 484C54 DB 'HLT' 1789 0949 76 DB 118 1790 094A 524C43 DB 'RLC' 1791 094D 07 DB 7 1792 094E 525243 DB 'RRC' 1793 0951 0F DB 15 1794 0952 52414C DB 'RAL' 1795 0955 17 DB 23 1796 0956 524152 DB 'RAR' 1797 0959 1F DB 31 1798 095A 524554 DB 'RET' 17991 1800 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 1801+ 19:26 09/08/2018 1802+ PAGE 32 1803 IMSAI SCS-1 REV. 2 06 OCT. 1976 1804 1805 1806 095D C9 DB 201 1807 095E 434D41 DB 'CMA' 1808 0961 2F DB 47 1809 0962 535443 DB 'STC' 1810 0965 37 DB 55 1811 0966 444141 DB 'DAA' 1812 0969 27 DB 39 1813 096A 434D43 DB 'CMC' 1814 096D 3F DB 63 1815 096E 4549 DB 'EI' 1816 0970 00 DB 0 1817 0971 FB DB 251 1818 0972 4449 DB 'DI' 1819 0974 00 DB 0 1820 0975 F3 DB 243 1821 0976 4E4F50 DB 'NOP' 1822 0979 00 DB 0 1823 097A 00 DB 0 1824 097B 58434847 DB 'XCHG' 1825 097F EB DB 235 1826 0980 5854484C DB 'XTHL' 1827 0984 E3 DB 227 1828 0985 5350484C DB 'SPHL' 1829 0989 F9 DB 249 1830 098A 5043484C DB 'PCHL' 1831 098E E9 DB 233 1832 098F 00 DB 0 1833 0990 53544158 DB 'STAX' 1834 0994 02 DB 2 1835 0995 4C444158 DB 'LDAX' 1836 0999 0A DB 10 1837 099A 00 DB 0 1838 099B 50555348 DB 'PUSH' 1839 099F C5 DB 197 1840 09A0 504F50 DB 'POP' 1841 09A3 00 DB 0 1842 09A4 C1 DB 193 1843 09A5 494E58 DB 'INX' 1844 09A8 00 DB 0 1845 09A9 03 DB 3 1846 09AA 444358 DB 'DCX' 1847 09AD 00 DB 0 1848 09AE 0B DB 11 1849 09AF 444144 DB 'DAD' 1850 09B2 00 DB 0 1851 09B3 09 DB 9 1852 09B4 00 DB 0 1853 09B5 494E52 DB 'INR' 1854 09B8 04 DB 4 1855 09B9 444352 DB 'DCR' 1856 09BC 05 DB 5 18571 1858 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 1859+ 19:26 09/08/2018 1860+ PAGE 33 1861 IMSAI SCS-1 REV. 2 06 OCT. 1976 1862 1863 1864 09BD 4D4F56 DB 'MOV' 1865 09C0 40 DB 64 1866 09C1 414444 DB 'ADD' 1867 09C4 80 DB 128 1868 09C5 414443 DB 'ADC' 1869 09C8 88 DB 136 1870 09C9 535542 DB 'SUB' 1871 09CC 90 DB 144 1872 09CD 534242 DB 'SBB' 1873 09D0 98 DB 152 1874 09D1 414E41 DB 'ANA' 1875 09D4 A0 DB 160 1876 09D5 585241 DB 'XRA' 1877 09D8 A8 DB 168 1878 09D9 4F5241 DB 'ORA' 1879 09DC B0 DB 176 1880 09DD 434D50 DB 'CMP' 1881 09E0 B8 DB 184 1882 09E1 525354 DB 'RST' 1883 09E4 C7 DB 199 1884 09E5 00 DB 0 1885 09E6 414449 DB 'ADI' 1886 09E9 C6 DB 198 1887 09EA 414349 DB 'ACI' 1888 09ED CE DB 206 1889 09EE 535549 DB 'SUI' 1890 09F1 D6 DB 214 1891 09F2 534249 DB 'SBI' 1892 09F5 DE DB 222 1893 09F6 414E49 DB 'ANI' 1894 09F9 E6 DB 230 1895 09FA 585249 DB 'XRI' 1896 09FD EE DB 238 1897 09FE 4F5249 DB 'ORI' 1898 0A01 F6 DB 246 1899 0A02 435049 DB 'CPI' 1900 0A05 FE DB 254 1901 0A06 494E DB 'IN' 1902 0A08 00 DB 0 1903 0A09 DB DB 219 1904 0A0A 4F5554 DB 'OUT' 1905 0A0D D3 DB 211 1906 0A0E 4D5649 DB 'MVI' 1907 0A11 06 DB 6 1908 0A12 00 DB 0 1909 0A13 4A4D50 DB 'JMP' 1910 0A16 00 DB 0 1911 0A17 C3 DB 195 1912 0A18 43414C4C DB 'CALL' 1913 0A1C CD DB 205 1914 0A1D 4C5849 DB 'LXI' 19151 1916 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 1917+ 19:26 09/08/2018 1918+ PAGE 34 1919 IMSAI SCS-1 REV. 2 06 OCT. 1976 1920 1921 1922 0A20 00 DB 0 1923 0A21 01 DB 1 1924 0A22 4C4441 DB 'LDA' 1925 0A25 00 DB 0 1926 0A26 3A DB 58 1927 0A27 535441 DB 'STA' 1928 0A2A 00 DB 0 1929 0A2B 32 DB 50 1930 0A2C 53484C44 DB 'SHLD' 1931 0A30 22 DB 34 1932 0A31 4C484C44 DB 'LHLD' 1933 0A35 2A DB 42 1934 0A36 00 DB 0 1935 ; CONDITION CODE TABLE 1936 0A37 4E5A DB 'NZ' 1937 0A39 00 DB 0 1938 0A3A 5A DB 'Z' 1939 0A3B 00 DB 0 1940 0A3C 08 DB 8 1941 0A3D 4E43 DB 'NC' 1942 0A3F 10 DB 16 1943 0A40 43 DB 'C' 1944 0A41 00 DB 0 1945 0A42 18 DB 24 1946 0A43 504F DB 'PO' 1947 0A45 20 DB 32 1948 0A46 5045 DB 'PE' 1949 0A48 28 DB 40 1950 0A49 50 DB 'P' 1951 0A4A 00 DB 0 1952 0A4B 30 DB 48 1953 0A4C 4D DB 'M' 1954 0A4D 00 DB 0 1955 0A4E 38 DB 56 1956 0A4F 00 DB 0 1957 ; 1958 ; THIS ROUTINE IS USED TO CHECK A GIVEN OPCODE 1959 ; AGAINST THE LEGAL OPCODES IN THE OPCODE TABLE 1960 ; 1961 0A50 2A7410 COPC: LHLD ADDS 1962 0A53 1A LDAX D ;FETCH CHARACTER 1963 0A54 B7 ORA A ;SET FLAGS 1964 0A55 CA620A JZ COP1 ;JUMP IF TERMINATION CHARACTER 1965 0A58 48 MOV C,B 1966 0A59 CD5301 CALL SEAR 1967 0A5C 1A LDAX D 1968 0A5D C8 RZ ;RETURN IF A MATCH 1969 0A5E 13 INX D ; NEXT STRING 1970 0A5F C3500A JMP COPC ;CONTINUE SEARCH 1971 0A62 3C COP1: INR A ;CLEAR ZERO FLAG 1972 0A63 13 INX D ;INCREMENT ADDRESS 19731 1974 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 1975+ 19:26 09/08/2018 1976+ PAGE 35 1977 IMSAI SCS-1 REV. 2 06 OCT. 1976 1978 1979 1980 0A64 C9 RET 1981 ; 1982 ; THIS ROUTINE CHECKS THE LEGAL OPCODES IN BOTH PASS 1 1983 ; AND PASS 2. IN PASS 1 THE PROGRAM COUNTER IS INCRE- 1984 ; MENTED BY THE CORRECT NUMBER OF BYTES. AN ADDRESS IS 1985 ; ALSO SET SO THAT AN INDEXED JUMP CAN BE MADE TO 1986 ; PROCESS THE OPCODE FOR PASS 2. 1987 ; 1988 0A65 217E10 OPCD: LXI H,ABUF ;GET ADDRESS 1989 0A68 227410 SHLD ADDS 1990 0A6B 112709 LXI D,OTAB ;OPCODE TABLE ADDRESS 1991 0A6E 0604 MVI B,4 ;CHARACTER COUNT 1992 0A70 CD500A CALL COPC ;CHECK OPCODE 1993 0A73 CA0E0B JZ PSEU ;JUMP IF PSEUDO-OP 1994 0A76 05 DCR B ;3-CHARACTER OPCODES 1995 0A77 CD500A CALL COPC 1996 0A7A CA810A JZ OP1 1997 0A7D 04 INR B ;4 CHARACTER OPCODES 1998 0A7E CD500A CALL COPC 1999 0A81 212D08 OP1: LXI H,TYP1 ;TYPE 1 INSTRUCTIONS 2000 0A84 0E01 OP2: MVI C,1 ;1 BYTE INSTRUCTIONS 2001 0A86 CAE10A JZ OCNT 2002 ; 2003 0A89 CD500A OPC2: CALL COPC ;CHECK FOR STAX, LDAX 2004 0A8C 213108 LXI H,TYP2 2005 0A8F CA840A JZ OP2 2006 0A92 CD500A CALL COPC ;CHECK FOR PUSH,POP,INX 2007 ; DCX AND DAD 2008 0A95 214408 LXI H,TYP3 2009 0A98 CA840A JZ OP2 2010 0A9B 05 DCR B ;3 CHAR OPCODES 2011 0A9C CD500A CALL COPC ;ACCUMULATOR INSTRUCTIONS, 2012 ; INR, DCR, MOV, RST 2013 0A9F 216308 LXI H,TYP4 2014 0AA2 CA840A JZ OP2 2015 ; 2016 0AA5 CD500A OPC3: CALL COPC ;IMMEDIATE INSTRUCTIONS 2017 0AA8 219808 LXI H,TYP5 2018 0AAB 0E02 MVI C,2 ;2 BYTE INSTRUCTIONS 2019 0AAD CAE10A JZ OCNT 2020 0AB0 04 INR B ;4 CHARACTER OPCODES 2021 0AB1 CD500A CALL COPC ;JMP, CALL, LIX, LDA, STA, 2022 ; LHLD, SHLD OPCODES 2023 0AB4 CADC0A JZ OP4 2024 0AB7 CD1B09 CALL COND ;CONDITIONAL INSTRUCTIONS 2025 0ABA C2060B JNZ OERR ;ILLEGAL OPCODE 2026 0ABD C6C0 ADI 192 ;ADD BASE VALUE TO RETURN 2027 0ABF 57 MOV D,A 2028 0AC0 0603 MVI B,3 ;3 CHARACTER OPCODES 2029 0AC2 3A7E10 LDA ABUF ;FETCH FIRST CHARACTER 2030 0AC5 4F MOV C,A ;SAVE CHARACTER 20311 2032 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 2033+ 19:26 09/08/2018 2034+ PAGE 36 2035 IMSAI SCS-1 REV. 2 06 OCT. 1976 2036 2037 2038 0AC6 FE52 CPI 'R' ;CONDITIONAL RETURN 2039 0AC8 7A MOV A,D 2040 0AC9 CA810A JZ OP1 2041 0ACC 79 MOV A,C 2042 0ACD 14 INR D ;FORM CONDITIONAL JUMP 2043 0ACE 14 INR D 2044 0ACF FE4A CPI 'J' ;CONDITIONAL JUMP 2045 0AD1 CADB0A JZ OPAD 2046 0AD4 FE43 CPI 'C' ;CONDITIONAL CALL 2047 0AD6 C2060B JNZ OERR ;ILLEGAL OPCODE 2048 0AD9 14 INR D ;FORM CONDITIONAL CALL 2049 0ADA 14 INR D 2050 0ADB 7A OPAD: MOV A,D ;GET OPCODE 2051 0ADC 21CE08 OP4: LXI H,TYP6 2052 0ADF 0E03 OP5: MVI C,3 ;3 BYTE INSTRUCTION 2053 0AE1 329D10 OCNT: STA TEMP ;SAVE OPCODE 2054 ; 2055 ; CHECK FOR OPCODE ONLY CONTAINING THE CORRECT NUMBER OF 2056 ; CHARACTERS. THUS ADDQ, SAY, WOULD GIVE AN ERROR 2057 ; 2058 0AE4 3E7E MVI A,ABUF AND 0FFH ;LOAD BUFFER ADDRESS 2059 0AE6 80 ADD B ;ADD LENGTH OF BUFFER 2060 0AE7 5F MOV E,A 2061 0AE8 3E10 MVI A,ABUF/256 2062 0AEA CE00 ACI 0 ;GET HIGH ORDER ADDRESS 2063 0AEC 57 MOV D,A 2064 0AED 1A LDAX D ;FETCH CHARACTER AFTER OPCODE 2065 0AEE B7 ORA A ;IT SHOULD BE ZERO 2066 0AEF C2060B JNZ OERR ;OPCODE ERROR 2067 0AF2 3A9410 LDA PASI ;FETCH PASS INDICATOR 2068 0AF5 0600 OCN1: MVI B,0 2069 0AF7 EB XCHG 2070 0AF8 2A9210 OCN2: LHLD ASPC ;FETCH PROGRAM COUNTER 2071 0AFB 09 DAD B ;ADD IN BYTE COUNT 2072 0AFC 229210 SHLD ASPC ;STORE PC 2073 0AFF B7 ORA A ;WHICH PASS? 2074 0B00 C8 RZ ;RETURN IF PASS 1 2075 0B01 3A9D10 LDA TEMP ;FETCH OPCODE 2076 0B04 EB XCHG 2077 0B05 E9 PCHL 2078 ; 2079 0B06 21AD0C OERR: LXI H,ERRO ;GET ERROR ADDRESS 2080 0B09 0E03 MVI C,3 ;LEAVE 3 BYTES FOR PATCH 2081 0B0B C3F20A JMP OCN1-3 2082 ; 2083 0B0E 218210 PSEU: LXI H,ABUF+4 ;SET BUFFER ADDRESS 2084 0B11 7E MOV A,M ;FETCH CHARACTER AFTER OPCODE 2085 0B12 B7 ORA A ;SHOULD BE A ZERO 2086 0B13 C2060B JNZ OERR 2087 0B16 3A9410 LDA PASI ;FETCH PASS INDICATOR 2088 0B19 B7 ORA A 20891 2090 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 2091+ 19:26 09/08/2018 2092+ PAGE 37 2093 IMSAI SCS-1 REV. 2 06 OCT. 1976 2094 2095 2096 0B1A CA4407 JZ PSU1 2097 0B1D C3C807 JMP PSU2 2098 ; 2099 ; THIS ROUTINE IS USED TO PROCESS LABELS. 2100 ; IT CHECKS TO SEE IF A LABEL IS IN THE SYMBOL TABLE 2101 ; OR NOT. ON RETURN, Z=1 INDICATES A MATCH WAS FOUND 2102 ; AND H,L CONTAIN THE VALUE ASSOCIATED WITH THE LABEL. 2103 ; THE REGISTER NAMES A, B, C, D, E, H, L, P, AND S ARE 2104 ; PRE-DEFINED AND NEED NOT BE ENTERED BY THE USER. 2105 ; ON RETURN, C=1 INDICATES A LABEL ERROR. 2106 ; 2107 0B20 FE41 SLAB: CPI 'A' ;CHECK FOR LEGAL CHARACTER 2108 0B22 D8 RC 2109 0B23 FE5B CPI 'Z'+1 ;CHECK FOR ILLEGAL CHARACTER 2110 0B25 3F CMC 2111 0B26 D8 RC ;RETURN IF ILLEGAL CHARACTER 2112 0B27 CD750B CALL ALPS ;PLACE SYMBOL IN BUFFER 2113 0B2A 217E10 LXI H,ABUF ;SET BUFFER ADDRESS 2114 0B2D 227410 SHLD ADDS ;SAVE ADDRESS 2115 0B30 05 DCR B ;CHECK IF ONE CHARACTER 2116 0B31 C2440B JNZ SLA1 2117 ; CHECK IF PREFEFINED REGISTER NAME 2118 0B34 04 INR B ;SET B=1 2119 0B35 11600B LXI D,RTAB ;REGISTER NAME TABLE 2120 0B38 CD500A CALL COPC ;CHECK NAME OF REGISTER 2121 0B3B C2440B JNZ SLA1 ;NOT A PREFEFINED REGIGTER 2122 0B3E 6F MOV L,A ;SET VALUE (HIGH) 2123 0B3F 2600 MVI H,0 2124 0B41 C35A0B JMP SLA2 2125 0B44 3A9810 SLA1: LDA NOLA ;FETCH SYMBOL COUNT 2126 0B47 47 MOV B,A 2127 0B48 111A11 LXI D,SYMT ;SET SYMBOL TABLE ADDRESS 2128 0B4B B7 ORA A ;ARE THERE ANY LABELS? 2129 0B4C CA5D0B JZ SLA3 ;JUMP IF NO LABELS 2130 0B4F 3E05 MVI A,LLAB ;FETCH LENGTH OF LABEL 2131 0B51 329510 STA NCHR 2132 0B54 CD3C01 CALL COMS ;CHECK TABLE 2133 0B57 4C MOV C,H ;SWAP H AND L 2134 0B58 65 MOV H,L 2135 0B59 69 MOV L,C 2136 0B5A 37 SLA2: STC ;SET CARRY 2137 0B5B 3F CMC ;CLEAR CARRY 2138 0B5C C9 RET ;RETURN 2139 0B5D 3C SLA3: INR A ;CLEAR ZERO FLAG 2140 0B5E B7 ORA A ;CLEAR CARRY 2141 0B5F C9 RET 2142 ; 2143 ; PREDEFINE REGISTER VALUES IN THIS TABLE 2144 ; 2145 0B60 41 RTAB: DB 'A' 2146 0B61 07 DB 7 21471 2148 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 2149+ 19:26 09/08/2018 2150+ PAGE 38 2151 IMSAI SCS-1 REV. 2 06 OCT. 1976 2152 2153 2154 0B62 42 DB 'B' 2155 0B63 00 DB 0 2156 0B64 43 DB 'C' 2157 0B65 01 DB 1 2158 0B66 44 DB 'D' 2159 0B67 02 DB 2 2160 0B68 45 DB 'E' 2161 0B69 03 DB 3 2162 0B6A 48 DB 'H' 2163 0B6B 04 DB 4 2164 0B6C 4C DB 'L' 2165 0B6D 05 DB 5 2166 0B6E 4D DB 'M' 2167 0B6F 06 DB 6 2168 0B70 50 DB 'P' 2169 0B71 06 DB 6 2170 0B72 53 DB 'S' 2171 0B73 06 DB 6 2172 0B74 00 DB 0 ;END OF TABLE INDICATOR. 2173 ; 2174 ; THIS ROUTINE SCANS THE INPUT LINE AND PLACES TH 2175 ; OPCODES AND LABELS IN THE BUFFER. THE SCAN TERMINATES 2176 ; WHEN A CHARACTER OTHER THAN 0-9 OR A-Z IS FOUND. 2177 ; 2178 0B75 0600 ALPS: MVI B,0 ;SET COUNT 2179 0B77 12 ALP1: STAX D ;STORE CHARACTER IN BUFFER 2180 0B78 04 INR B ;INCREMENT COUNT 2181 0B79 78 MOV A,B ;FETCH COUNT 2182 0B7A FE0B CPI 11 ;MAXIMUM BUFFER SIZE 2183 0B7C D0 RNC ;RETURN IF BUFFER FILLED 2184 0B7D 13 INX D ;INCREMENT BUFFER 2185 0B7E 23 INX H ;INCREMENT INPUT POINTER 2186 0B7F 229610 SHLD PNTR ;SAVE LINE POINTER 2187 0B82 7E MOV A,M ;FETCH CHARACTER 2188 0B83 FE30 CPI '0' ;CHECK FOR ILLEGAL CHARACTERS 2189 0B85 D8 RC 2190 0B86 FE3A CPI '9'+1 2191 0B88 DA770B JC ALP1 2192 0B8B FE41 CPI 'A' 2193 0B8D D8 RC 2194 0B8E FE5B CPI 'Z'+1 2195 0B90 DA770B JC ALP1 2196 0B93 C9 RET 2197 ; 2198 ; THIS ROUTINE IS USED TO SCAN THROUGH THE INPUT LINE 2199 ; TO FETCH THE VALUE OF THE OPERAND FIELD. ON RETURN, 2200 ; THE VALUE OF THE OPERAND IS CONTAINED IN REG?S H,L 2201 ; 2202 0B94 CD0D09 ASBL: CALL SBLK ;GET 1ST ARGUMENT 2203 0B97 210000 ASCN: LXI H,0 ;GET A ZERO 2204 0B9A 229A10 SHLD OPRD ;INITIALIZE OPERAND 22051 2206 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 2207+ 19:26 09/08/2018 2208+ PAGE 39 2209 IMSAI SCS-1 REV. 2 06 OCT. 1976 2210 2211 2212 0B9D 24 INR H 2213 0B9E 229B10 SHLD OPRI-1 ;INITIALIZE OPERAND INDICATOR 2214 0BA1 2A9610 NXT1: LHLD PNTR ;FETCH SCAN POINTER 2215 0BA4 2B DCX H 2216 0BA5 CD6601 CALL ZBUF ;CLEAR BUFFER 2217 0BA8 329910 STA SIGN ;ZERO SIGN INDICATOR 2218 0BAB 23 NXT2: INX H ;INCREMENT POINTER 2219 0BAC 7E MOV A,M ;FETCH NEXT CHARACTER 2220 0BAD FE21 CPI ' '+1 2221 0BAF DA530C JC SEND ;JUMP IF CR OR BLANK 2222 0BB2 FE2C CPI ',' ;FIELD SEPARATOR 2223 0BB4 CA530C JZ SEND 2224 ; CHECK FOR OPERATOR 2225 0BB7 FE2B CPI '+' ;CHECK FOR PLUS 2226 0BB9 CAC40B JZ ASC1 2227 0BBC FE2D CPI '-' ;CHECK FOR MINUS 2228 0BBE C2D40B JNZ ASC2 2229 0BC1 329910 STA SIGN 2230 0BC4 3A9C10 ASC1: LDA OPRI ;FETCH OPERAND INDICATOR 2231 0BC7 FE02 CPI 2 ;CHECK FOR 2 OPERATORS 2232 0BC9 CA8A0C JZ ERRS ;SYNTAX ERROR 2233 0BCC 3E02 MVI A,2 2234 0BCE 329C10 STA OPRI ;SET INDICATOR 2235 0BD1 C3AB0B JMP NXT2 2236 ; CHECK FOR OPERANDS 2237 0BD4 4F ASC2: MOV C,A ;SAVE CHARACTER 2238 0BD5 3A9C10 LDA OPRI ;GET INDICATOR 2239 0BD8 B7 ORA A ;CHECK FOR 2 OPERANDS 2240 0BD9 CA8A0C JZ ERRS ;SYNTAX ERROR 2241 0BDC 79 MOV A,C 2242 0BDD FE24 CPI '$' ;LC EXPRESSION 2243 0BDF C2EC0B JNZ ASC3 2244 0BE2 23 INX H ;INCREMENT POINTER 2245 0BE3 229610 SHLD PNTR ;SAVE POINTER 2246 0BE6 2A9210 LHLD ASPC ;FETCH LOCATION COUNTER 2247 0BE9 C3280C JMP AVAL 2248 ;CHECK FOR ASCII CHARACTERS 2249 0BEC FE27 ASC3: CPI 27H ;CHECK FOR SINGLE QUOTE 2250 0BEE C2180C JNZ ASC5 ;JUMP IF NOT QUOTE 2251 0BF1 110000 LXI D,0 ;GET A ZERO 2252 0BF4 0E03 MVI C,3 ;CHARACTER COUNT 2253 0BF6 23 ASC4: INX H ;BUMP POINTER 2254 0BF7 229610 SHLD PNTR ;SAVE 2255 0BFA 7E MOV A,M ;FETCH NEXT CHARACTER 2256 0BFB FE0D CPI ASCR ;IS IT A CARRIAGE RETURN? 2257 0BFD CAA80C JZ ERAR ;ARGUMENT ERROR 2258 0C00 FE27 CPI 27H ;IS IT A QUOTE? 2259 0C02 C20F0C JNZ SSTR 2260 0C05 23 INX H ;INCREMENT POINTER 2261 0C06 229610 SHLD PNTR ;SAVE 2262 0C09 7E MOV A,M ;FETCH NEXT CHAR 22631 2264 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 2265+ 19:26 09/08/2018 2266+ PAGE 40 2267 IMSAI SCS-1 REV. 2 06 OCT. 1976 2268 2269 2270 0C0A FE27 CPI 27H ;CHECK FOR 2 QUOTES IN A ROW 2271 0C0C C2290C JNZ AVAL+1 ;TERMINAL QUOTE 2272 0C0F 0D SSTR: DCR C ;CHECK COUNT 2273 0C10 CAA80C JZ ERAR ;TOO MANY CHARACTERS 2274 0C13 53 MOV D,E 2275 0C14 5F MOV E,A ;SET CHARACTER IN BUFFER 2276 0C15 C3F60B JMP ASC4 2277 0C18 FE30 ASC5: CPI '0' ;CHECK FOR NUMERIC 2278 0C1A DAA80C JC ERAR ;ILLEGAL CHARACTER 2279 0C1D FE3A CPI '9'+1 2280 0C1F D2470C JNC ALAB 2281 0C22 CD630C CALL NUMS ;GET NUMERIC VALUE 2282 0C25 DAA80C JC ERAR ;ARGUMENT ERROR 2283 0C28 EB AVAL: XCHG 2284 0C29 2A9A10 LHLD OPRD ;FETCH OPERAND 2285 0C2C AF XRA A ;GET A ZERO 2286 0C2D 329C10 STA OPRI ;STOR IN OPERAND INDICATOR 2287 0C30 3A9910 LDA SIGN ;GET SIGN INDICATOR 2288 0C33 B7 ORA A ;SET FLAGS 2289 0C34 C23E0C JNZ ASUB 2290 0C37 19 DAD D ;FORM RESULT 2291 0C38 229A10 ASC7: SHLD OPRD ;SAVE RESULT 2292 0C3B C3A10B JMP NXT1 2293 0C3E 7D ASUB: MOV A,L 2294 0C3F 93 SUB E 2295 0C40 6F MOV L,A 2296 0C41 7C MOV A,H 2297 0C42 9A SBB D 2298 0C43 67 MOV H,A 2299 0C44 C3380C JMP ASC7 2300 0C47 CD200B ALAB: CALL SLAB 2301 0C4A CA280C JZ AVAL 2302 0C4D DAA80C JC ERAR ;ILLEGAL SYMBOL 2303 0C50 C3950C JMP ERRU ;UNDEFINED SYMBOL 2304 ; 2305 ; GET HERE WHEN TERMINATING CHARACTER IS FOUND. 2306 ; CHECK FOR LEADING FIELD SEPARATOR 2307 ; 2308 0C53 3A9C10 SEND: LDA OPRI ;FETCH OPERAND INDICATOR 2309 0C56 B7 ORA A ;SET FLAGS 2310 0C57 C28A0C JNZ ERRS ;SYNTAX ERROR 2311 0C5A 2A9A10 LHLD OPRD 2312 0C5D 7C SEN1: MOV A,H ;GET HIGH ORDER BYTE 2313 0C5E 119D10 LXI D,TEMP ;GET ADDRESS 2314 0C61 B7 ORA A ;SET FLAGS 2315 0C62 C9 RET 2316 ; 2317 ; GET A NUMERIC VALUE WHICH IS EITHER HEXADECIMAL OR 2318 ; DECIMAL. ON RETURN, CARRY SET INDICATES AN ERROR. 2319 ; 2320 0C63 CD750B NUMS: CALL ALPS ;GET NUMERIC 23211 2322 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 2323+ 19:26 09/08/2018 2324+ PAGE 41 2325 IMSAI SCS-1 REV. 2 06 OCT. 1976 2326 2327 2328 0C66 1B DCX D 2329 0C67 1A LDAX D ;GET LAST CHARACTER 2330 0C68 017E10 LXI B,ABUF ;SET BUFFER ADDRESS 2331 0C6B FE48 CPI 'H' ;IS IT HEXADECIMAL? 2332 0C6D CA7B0C JZ NUM2 2333 0C70 FE44 CPI 'D' ;IS IT DECIMAL 2334 0C72 C2770C JNZ NUM1 2335 0C75 AF XRA A ;GET A ZERO 2336 0C76 12 STAX D ;CLEAR D FROM BUFFER 2337 0C77 CD0102 NUM1: CALL ADEC ;CONVERT DECIMAL VALUE 2338 0C7A C9 RET 2339 0C7B AF NUM2: XRA A ;GET A ZERO 2340 0C7C 12 STAX D ;CLEAR H FROM BUFFER 2341 0C7D CD1B02 CALL AHEX 2342 0C80 C9 RET 2343 ; 2344 ; PROCESS REGISTER ERROR 2345 ; 2346 0C81 3E52 ERRR: MVI A,'R' ;GET INDICATOR 2347 0C83 210000 LXI H,0 ;GET A ZERO 2348 0C86 32B210 STA OBUF ;SET IN OUTPUT BUFFER 2349 0C89 C9 RET 2350 ; 2351 ; PROCESS SYNTAX ERROR 2352 ; 2353 0C8A 3E53 ERRS: MVI A,'S' ;GET INDICATOR 2354 0C8C 32B210 STA OBUF ;STORE IN OUTPUT BUFFER 2355 0C8F 210000 LXI H,0 2356 0C92 C35D0C JMP SEN1 2357 ; 2358 ; PROCESS UNDEFINED SYMBOL ERROR 2359 ; 2360 0C95 3E55 ERRU: MVI A,'U' ;GET INDICATOR 2361 0C97 C38C0C JMP ERRS+2 2362 ; 2363 ; PROCESS VALUE ERROR 2364 ; 2365 0C9A 3E56 ERRV: MVI A,'V' ;GET INDICATOR 2366 0C9C C3830C JMP ERRR+2 2367 ; 2368 ; PROCESS MISSING LABEL ERROR 2369 ; 2370 0C9F 3E4D ERRM: MVI A,'M' ;GET INDICATOR 2371 0CA1 32B210 STA OBUF ;STORE IN OUTPUT BUFFER 2372 0CA4 CDD206 CALL AOU1 ;DISPLAY ERROR 2373 0CA7 C9 RET 2374 ; 2375 ;PROCESS ARGUMENT ERROR 2376 ; 2377 0CA8 3E41 ERAR: MVI A,'A' ;GET INDICATOR 2378 0CAA C38C0C JMP ERRS+2 23791 2380 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 2381+ 19:26 09/08/2018 2382+ PAGE 42 2383 IMSAI SCS-1 REV. 2 06 OCT. 1976 2384 2385 2386 ; 2387 ; PROCESS OPCODE ERROR 2388 ; STORE 3 BYTES OF ZERO IN OBJECT CODE TO PROVIDE 2389 ; FOR A PATCH 2390 ; 2391 0CAD 3E4F ERRO: MVI A,'O' ;GET INDICATOR 2392 0CAF 32B210 STA OBUF ;STORE IN OUTPUT BUFFER 2393 0CB2 3A9410 LDA PASI ;FETCH PASS INDICATOR 2394 0CB5 B7 ORA A ;WHICH PASS 2395 0CB6 C8 RZ ;RETURN IF PASS 1 2396 0CB7 0E03 MVI C,3 ;NEED 3 BYTES 2397 0CB9 AF ERO1: XRA A ;GET A ZERO 2398 0CBA CDEE08 CALL ASTO ;PUT IN LISTING AND MEMORY 2399 0CBD 0D DCR C 2400 0CBE C2B90C JNZ ERO1 2401 0CC1 C9 RET 2402 ; 2403 ; PROCESS LABEL ERROR 2404 ; 2405 0CC2 3E4C ERRL: MVI A,'L' ;GET INDICATOR 2406 0CC4 C3AF0C JMP ERRO+2 2407 ; 2408 ; PROCESS DUPLICATE LABEL ERROR 2409 ; 2410 0CC7 3E44 ERRD: MVI A,'D' ;GET INDICATOR 2411 0CC9 32B210 STA OBUF 2412 0CCC CDC506 CALL AOUT 2413 0CCF C31E07 JMP OPC 2414 ; 2415 ; THIS ROUTINE SETS OR CLEARS BREAKPOINTS 2416 ; 2417 0CD2 3A7E10 BREAK: LDA ABUF ;CHECK FOR AN ARG 2418 0CD5 B7 ORA A 2419 0CD6 CA140D JZ CLRB ;IF NO ARGUMENT, GO CLEAR BREAKPOINT 2420 0CD9 1608 MVI D, NBR ;ELSE GET NUMBER OF BREAKPOINTS 2421 0CDB 210C10 LXI H,BRT ;AND ADDR OF TABLE 2422 0CDE 7E B1: MOV A,M ;GET HI BYTE OF ENTRY 2423 0CDF 23 INX H 2424 0CE0 46 MOV B,M ;GET LOW BYTE OF ENTRY 2425 0CE1 B0 ORA B ;CHECK FOR EMPTY ENTRY 2426 0CE2 CAEE0C JZ B2 ;BRANCH IF EMPTY 2427 0CE5 23 INX H ;ELSE GO ON TO NEXT ENTRY 2428 0CE6 23 INX H 2429 0CE7 15 DCR D ;BUMP COUNT 2430 0CE8 C2DE0C JNZ B1 ;AND TRY AGAIN 2431 0CEB C35A04 JMP WHAT ;OOPS NO ROOM 2432 0CEE 2B B2: DCX H 2433 0CEF EB XCHG 2434 0CF0 2A8A10 LHLD BBUF ;GET ADDRESS 2435 0CF3 EB XCHG ;IN D,E 2436 0CF4 7A MOV A,D ;CHECK FOR ADDR > 11D 24371 2438 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 2439+ 19:26 09/08/2018 2440+ PAGE 43 2441 IMSAI SCS-1 REV. 2 06 OCT. 1976 2442 2443 2444 0CF5 B7 ORA A 2445 0CF6 C2FF0C JNZ B3 2446 0CF9 7B MOV A,E 2447 0CFA FE0B CPI 11 2448 0CFC DA5A04 JC WHAT ;OOPS, TOO LOW 2449 0CFF 72 B3: MOV M,D ;SAVE ADDRESS 2450 0D00 23 INX H 2451 0D01 73 MOV M,E 2452 0D02 23 INX H 2453 0D03 1A LDAX D ;PICK UP INSTRUCTION 2454 0D04 77 MOV M,A ;SAVE IT 2455 0D05 3ECF MVI A,0CFH ;RST 1 INSTRUCTION 2456 0D07 12 STAX D 2457 0D08 3EC3 MVI A,0C3H ;SET UP LO MEMORY 2458 0D0A 320800 STA 8 ;WITH A JUMP TO BREAKPOINT 2459 0D0D 212E0D LXI H,BRKP 2460 0D10 220900 SHLD 9 2461 0D13 C9 RET ;THEN RETURN 2462 ; 2463 ; THIS ROUTINE CLEARS ALL BREAKPOINTS 2464 ; 2465 0D14 210C10 CLRB: LXI H,BRT ;GET TABLE ADDRESS 2466 0D17 0608 MVI B,NBR ;GET NUMBER OF BREAKPOINTS 2467 0D19 AF CLBL: XRA A ;GET A ZERO 2468 0D1A 56 MOV D,M ;GET HI-BYTE OF ENTRY 2469 0D1B 77 MOV M,A 2470 0D1C 23 INX H 2471 0D1D 5E MOV E,M ;GET LO-BYTE OF ENTRY 2472 0D1E 77 MOV M,A 2473 0D1F 23 INX H 2474 0D20 46 MOV B,M ;GET INST BYTE 2475 0D21 23 INX H 2476 0D22 7A MOV A,D ;WAS THIS A NULL ENTRY 2477 0D23 B3 ORA E 2478 0D24 CA290D JZ CL2 ;BRANCH IF IT WAS 2479 0D27 78 MOV A,B 2480 0D28 12 STAX D ;ELSE PLUG INST BACK IN 2481 0D29 05 CL2: DCR B ;BUMP COUNT 2482 0D2A C2190D JNZ CLBL ;GO DO NEXT ONE 2483 0D2D C9 RET 2484 ; 2485 ; COME HERE WHEN WE HIT A BREAKPOINT 2486 ; 2487 0D2E 220810 BRKP: SHLD HOLD+8 ;SAVE H,L 2488 0D31 E1 POP H ;GET PC 2489 0D32 2B DCX H ;ADJUST IT 2490 0D33 220A10 SHLD HOLD+10 ;SAVE IT 2491 0D36 F5 PUSH PSW ;SAVE FLAGS 2492 0D37 E1 POP H ;GET THEM INTO H,L 2493 0D38 220010 SHLD HOLD ;NOW STORE THEM FOR USER 2494 0D3B 210000 LXI H,0 24951 2496 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 2497+ 19:26 09/08/2018 2498+ PAGE 44 2499 IMSAI SCS-1 REV. 2 06 OCT. 1976 2500 2501 2502 0D3E 39 DAD SP ;GET STACK POINTER 2503 0D3F 310810 LXI SP,HOLD+8 ;SET STACK POINTER AGAIN 2504 0D42 E5 PUSH H ;SAVE OLD SP 2505 0D43 D5 PUSH D ;SAVE D,E 2506 0D44 C5 PUSH B ;SAVE B,C 2507 0D45 2F CMA ;COMPLEMENT ACCUMULATOR 2508 0D46 D3FF OUT 0FFH ;DISPLAY IT IN LIGHTS 2509 0D48 31B210 LXI SP,AREA+18 ;SET SP AGAIN 2510 0D4B 2A0A10 LHLD HOLD+10 ;GET PC 2511 0D4E EB XCHG ;INTO D,E 2512 0D4F 210C10 LXI H,BRT ;GET ADDR OF TABLE 2513 0D52 0608 MVI B,NBR ;AND NUMBER OF ENTRIES 2514 0D54 7E BL1: MOV A,M ;GET AN ENTRY FROM THE TABLE 2515 0D55 23 INX H 2516 0D56 BA CMP D ;DOES IT MATCH? 2517 0D57 C25F0D JNZ BL2 ;BRANCH IF NOT 2518 0D5A 7E MOV A,M ;ELSE GET NEXT BYTE 2519 0D5B BB CMP E ;CHECK IT 2520 0D5C CA680D JZ BL3 ;IT MATCHES! 2521 0D5F 23 BL2: INX H ;BUMP AROUND THIS ENTRY 2522 0D60 23 INX H 2523 0D61 05 DCR B ;BUMP COUNT 2524 0D62 CA5A04 JZ WHAT ;NOT IN OUR TABLE 2525 0D65 C3540D JMP BL1 2526 ; 2527 0D68 23 BL3: INX H 2528 0D69 7E MOV A,M ;GET INSTR BYTE 2529 0D6A 12 STAX D ;PUT IT BACK 2530 0D6B AF XRA A ;CLEAR ENTRY IN TABLE 2531 0D6C 2B DCX H 2532 0D6D 77 MOV M,A 2533 0D6E 2B DCX H 2534 0D6F 77 MOV M,A 2535 0D70 CD0E01 CALL CRLF ;RESTORE THE CARRIAGE 2536 0D73 3A0B10 LDA HOLD+11 ;GET HI-BYTE OF PC 2537 0D76 CD3A02 CALL HOUT ;TYPE IT 2538 0D79 3A0A10 LDA HOLD+10 ;GET LO-BYTE OF PC 2539 0D7C CD3A02 CALL HOUT ;TYPE IT 2540 0D7F 21880D LXI H,BMES ;TELL USER WHAT IT IS 2541 0D82 CD7A02 CALL SCRN 2542 0D85 C36700 JMP EOR ;GO BACK TO COMMAND LEVEL 2543 ; 2544 0D88 20425245 BMES: DB ' BREAK',13 2545 0D8C 414B0D 2546 ; 2547 ; THIS ROUTINE PROCEEDS FROM A BREAKPOINT 2548 ; 2549 0D8F 3A7E10 PROC: LDA ABUF ;CHECK FOR ARG 2550 0D92 B7 ORA A 2551 0D93 CA9C0D JZ P1 ;JUMP IF NO ARG 2552 0D96 2A8A10 LHLD BBUF ;ELSE GET ARG 25531 2554 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 2555+ 19:26 09/08/2018 2556+ PAGE 45 2557 IMSAI SCS-1 REV. 2 06 OCT. 1976 2558 2559 2560 0D99 220A10 SHLD HOLD+10 ;PLUG IT INTO PC SLOT 2561 0D9C 310010 P1: LXI SP,HOLD ;SET SP TO POINT AT REG?S 2562 0D9F F1 POP PSW ;RESTORE PSW 2563 0DA0 C1 POP B ;RESTORE B,C 2564 0DA1 D1 POP D ;RESTORE D,E 2565 0DA2 E1 POP H ;GET OLD SP 2566 0DA3 F9 SPHL ;RESTORE IT 2567 0DA4 2A0A10 LHLD HOLD+10 ;GET PC 2568 0DA7 E5 PUSH H ;PUT IT ON STACK 2569 0DA8 2A0810 LHLD HOLD+8 ;RESTORE H,L 2570 0DAB C9 RET ;AND PROCEED 2571 ; 2572 ; SYSTEM RAM 2573 ; 2574 1000 ORG 1000H 2575 ; 2576 ; DEFINE BREAKPOINT REGION 2577 ; 2578 0008 NBR EQU 8 ;NUMBER OF BREAKPOINTS 2579 1000 HOLD: DS 12 ;REGISTER HOLD AREA 2580 100C BRT: DS 3*NBR ;BREAKPOINT TABLE 2581 ; 2582 ; FILE AREA PARAMETERS 2583 ; 2584 0006 MAXFIL EQU 6 2585 0005 NMLEN EQU 5 2586 000D FELEN EQU NMLEN+8 2587 1024 FILE0: DS NMLEN 2588 1029 BOFP: DS 2 2589 102B EOFP: DS 2 2590 102D MAXL: DS 4 2591 1031 FILTB: DS (MAXFIL-1)*FELEN 2592 1072 INSP: DS 2 2593 1072 DELP EQU INSP 2594 000D ASCR EQU 13 2595 1074 HCON: DS 2 2596 1074 ADDS EQU HCON 2597 1076 FBUF: DS NMLEN 2598 107B FREAD: DS 2 2599 107D FEF: DS 1 2600 107D FOCNT EQU FEF 2601 107E ABUF: DS 12 2602 108A BBUF: DS 4 2603 108E SCNT: DS 1 2604 108F DCNT: DS 1 2605 000B NCOM EQU 11 2606 1090 TABA: DS 2 2607 1092 ASPC: DS 2 2608 1094 PASI: DS 1 2609 1095 NCHR: DS 1 2610 1096 PNTR: DS 2 26111 2612 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 2613+ 19:26 09/08/2018 2614+ PAGE 46 2615 IMSAI SCS-1 REV. 2 06 OCT. 1976 2616 2617 2618 1098 NOLA: DS 1 2619 1099 SIGN: DS 1 2620 109A OPRD: DS 2 2621 109C OPRI: DS 1 2622 109D TEMP: DS 1 2623 1072 APNT EQU INSP 2624 108E AERR EQU SCNT 2625 109E OIND: DS 2 2626 0005 LLAB EQU 5 2627 10A0 AREA: DS 18 2628 10B2 OBUF: DS 16 2629 10C2 DS 5 2630 10C7 IBUF: DS 83 2631 00FF SWCH EQU 0FFH 2632 111A SYMT EQU $ 2633 END 2634 NO PROGRAM ERRORS 26351 2636 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 2637+ 19:26 09/08/2018 2638+ PAGE 47 2639 IMSAI SCS-1 REV. 2 06 OCT. 1976 2640 2641 2642 SYMBOL TABLE 2643 2644 * 01 2645 2646 A 0007 ABUF 107E ACH1 0275 ACHK 0263 2647 ACO1 075A ACO2 07DB * ADDS 1074 ADE1 0204 2648 ADEC 0201 ADR 057B AERR 108E AHE1 021E 2649 AHEX 021B AHS1 0232 ALAB 0C47 ALP1 0B77 2650 ALPS 0B75 AOU1 06D2 AOU2 06CC * AOUT 06C5 2651 APNT 1072 AREA 10A0 ASBL 0B94 ASC1 0BC4 2652 ASC2 0BD4 ASC3 0BEC ASC4 0BF6 ASC5 0C18 2653 ASC7 0C38 ASCN 0B97 ASCR 000D ASM1 068C 2654 ASM2 06B9 ASM3 067A ASM4 066E ASPC 1092 2655 ASSM 065E ASTO 08EE ASUB 0C3E AVAL 0C28 2656 B 0000 B1 0CDE B2 0CEE B3 0CFF 2657 BBUF 108A BID1 02B4 BIN1 0299 BINAD 07FD 2658 BIND 02A3 BINH 0286 BL1 0D54 BL2 0D5F 2659 BL3 0D68 BLK1 025D BMES 0D88 BOFP 1029 2660 BREAK 0CD2 BRKP 0D2E BRT 100C BSPA 00BF 2661 C 0001 CHAR 00C7 CHOT 0240 * CL2 0D29 2662 CLBL 0D19 CLER 00E1 CLRB 0D14 CO1 05A7 2663 CO2 05AD COM0 05A2 COM1 05B5 * COMM 012B 2664 COMS 013C COND 091B COP1 0A62 COPC 0A50 2665 CR 0097 CRLF 010E CTAB 02BE D 0002 2666 DAT1 0790 DAT2 07F1 DAT2A 07F4 DCNT 108F * 2667 DEL 00B2 DEL1 05FB DEL2 0618 DEL3 0636 2668 DEL4 0640 DEL5 0641 DELL 05E7 DELP 1072 2669 DONE 01BF DOUT 0251 * DUM1 030E DUMP 0308 2670 DUMS 030B E 0003 EASS 0901 EEND 002F 2671 EMES 0466 EMES1 046B EMES2 0470 ENT1 048F 2672 ENTR 0476 ENTS 0483 EO1 0574 EOF 0573 2673 EOFP 102B EOR 0067 EQU1 0775 EQU2 07FA 2674 EQUL 0503 EQUS 0780 ERAR 0CA8 ERO1 0CB9 2675 ERRD 0CC7 ERRL 0CC2 ERRM 0C9F ERRO 0CAD 2676 ERRR 0C81 ERRS 0C8A ERRU 0C95 ERRV 0C9A 2677 ETRA 017A EXEC 0121 FAST 03E6 FBUF 1076 2678 FEET 03F8 FEF 107D FELEN 000D FI1 055A 2679 FI2 056C FIL30 03B0 * FIL35 03B2 FILE 033E 2680 FILE0 1024 FILTB 1031 * FIN1 0552 FIND 054C 2681 FINE 03C9 FOCNT 107D FOOD 03E3 FOOL 0404 2682 FOOT 03C3 FOUL 03C5 FOUT 03B9 FREAD 107B 2683 FSE10 0421 FSE15 0444 FSE20 044E FSEA 0418 2684 H 0004 HCON 1074 HOLD 1000 HOTB 024A 2685 HOUT 023A IBUF 10C7 IN8 00F6 INCA 015F 2686 INIT2 0056 INIT3 0061 INITA 0040 INK 00E9 2687 INSP 1072 INSR 04FA L 0005 LCHK 0735 2688 LESS 0518 LF 0113 * LICK 04C1 LINE 04B5 2689 LIST 05D0 LIST0 05D6 LLAB 0005 LMOV 0580 2690 LODM 0592 M 0006 MAXFI 0006 MAXL 102D 2691 MESS 0460 MLAB 0705 MORE 052B MOV23 0382 2692 MPNT 08BF NBR 0008 NCHR 1095 NCOM 000B 26931 2694 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 2695+ 19:26 09/08/2018 2696+ PAGE 48 2697 SYMBOL TABLE 2698 2699 2700 NEXT 0088 NMLEN 0005 NOLA 1098 NOR1 05C3 2701 NORM 05BD NOV1 064F * NOVR 0649 NUM1 0C77 2702 NUM2 0C7B NUMS 0C63 NXT1 0BA1 NXT2 0BAB 2703 OBUF 10B2 OCN1 0AF5 OCN2 0AF8 OCNT 0AE1 2704 OERR 0B06 OIND 109E OK 010A * OP1 0A81 2705 OP2 0A84 OP4 0ADC OP5 0ADF OPAD 0ADB 2706 OPC 071E OPC2 0A89 * OPC3 0AA5 * OPCD 0A65 2707 OPRD 109A OPRI 109C ORG1 0760 ORG2 080C 2708 OTAB 0927 OUT8 0103 P1 0D9C PABL 07AD * 2709 PAG1 0335 PAGEM 0322 PAS1 06DC PAS2 0793 2710 PASI 1094 PNTR 1096 PROC 0D8F PSEU 0B0E 2711 PSU1 0744 PSU2 07C8 PSW 0006 READ 0080 2712 RES1 0788 RES2 07E1 RES21 07ED RMOV 0589 2713 ROOM 0378 RTAB 0B60 SBL1 0910 SBL2 0914 2714 SBLK 090D SCNT 108E SCRN 027A SEAR 0153 2715 SEN1 0C5D SEND 0C53 SEOF 04F2 * SIGN 1099 2716 SLA1 0B44 SLA2 0B5A SLA3 0B5D SLAB 0B20 2717 SP 0006 SSTR 0C0F STOM 059A SWAP 0390 2718 SWAPS 038B SWCH 00FF * SYMT 111A TABA 1090 2719 TEMP 109D TEST 0363 TTI 0002 TTO 0002 2720 TTS 0003 TTYDA 0002 TTYTR 0001 TY31 0855 2721 TY32 0858 TY41 0881 TY55 08A0 TY56 08AD 2722 TY6 08DE TYP1 082D TYP2 0831 TYP3 0844 2723 TYP4 0863 TYP5 0898 TYP6 08CE TYS6 08E1 2724 VAL1 0189 VAL2 01A4 VAL3 01B4 VAL4 01B6 2725 VAL5 01C4 VALC 0173 VCHK 0300 WHA1 045D 2726 WHAT 045A ZBU1 016C ZBUF 0166 ZERO 053B 2727 2728