11 2 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 3+ 04:31 11/15/2014 4+ PAGE 1 5 6 7 8 ; 9 ; CROMEMCO Z-1 MONITOR SOURCE 10 ; 11 ; RETYPED FROM MANUAL AND MODIFIED TO ASSEMBLE WITH INTEL MACRO-80 12 ; DECEMBER 2014, UDO MUNK 13 ; 14 ;PPAGE EQU 0E1H ;MUST BE THE HIGHER OF A PAIR OF NON-RAM PAGES. 15 00FF PPAGE EQU 0FFH ;PROM CAN'T BE DETECTED YET! 16 ;PSW EQU 6 ;DEFINED BY INTEL ASSEMBLER ALREADY 17 ;SP EQU 6 18 0080 PF EQU 80H ;PRIME-ABLE REG FLAG 19 0040 R2F EQU 40H ;2-BYTE REG FLAG 20 0007 BELL EQU 07 21 001B ESC EQU 1BH 22 000D CR EQU 0DH 23 000A LF EQU 0AH 24 0000 STAT EQU 0 25 0040 DAV EQU 40H 26 0080 TBE EQU 80H 27 0001 DATA EQU 1 28 0016 TEMPS EQU 16H ;ROOM FOR TEMP STORAGE 29 0030 RSTLC EQU 30H ;RST LOCATION 30 0020 CASE EQU 20H ;DIFF BETW LOWER & UPPER CA 31 ; 32 ; Z80 OP-CODES 33 0018 JR EQU 18H 34 0038 JRC EQU 38H 35 0030 JRNC EQU 30H 36 0028 JRZ EQU 28H 37 0020 JRNZ EQU 20H 38 0010 DJNZ EQU 10H 39 0008 EXAF EQU 08 ;EX AF,AF' 40 00D9 EXX EQU 0D9H 41 00ED RLD EQU 0EDH 42 006F RLD1 EQU 6FH 43 00ED CPI0 EQU 0EDH 44 00A1 CPI1 EQU 0A1H 45 00ED CPIR EQU 0EDH 46 00B1 CPIR1 EQU 0B1H 47 00ED LDI EQU 0EDH 48 00A0 LDI1 EQU 0A0H 49 00ED LDIR EQU 0EDH 50 00B0 LDIR1 EQU 0B0H 51 00ED LDD EQU 0EDH 52 00A8 LDD1 EQU 0A8H 53 00ED LDDR EQU 0EDH 54 00B8 LDDR1 EQU 0B8H 55 00CB SET5A EQU 0CBH 56 00EF ST5A1 EQU 0EFH 57 ; 58 00DD IX EQU 0DDH 591 60 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 61+ 04:31 11/15/2014 62+ PAGE 2 63 64 65 66 00FD IY EQU 0FDH 67 ; 68 ; DISPLACEMENTS FROM IX OF HI BYTE OF REG PAIRS 69 0000 DUPC EQU 0 70 FFFE DUSP EQU -2 71 FFFC DUAF EQU -4 72 FFFA DUBC EQU -6 73 FFF8 DUDE EQU -8 74 FFF6 DUHL EQU -10 75 FFF4 DUIT EQU -12 ;USER I & INTERRUPT ENABLE 76 FFF2 DUIX EQU -14 77 FFF0 DUIY EQU -16 78 FFEE DUAF2 EQU -18 79 FFEC DUBC2 EQU -20 80 FFEA DUDE2 EQU -22 81 FFE8 DUHL2 EQU -24 82 83 E000 ORG 0E000H 84 E000 START: 85 ; 86 ; ENTER MONITOR FROM RESET 87 ; 88 E000 3E01 MVI A,1 89 E002 D340 OUT 40H ;SELECT BANK 0 90 ; 91 ; PLACE SYS STACK AT HIGHEST PAGE OF AVAILABLE RAM. 92 ; ALLOW ROOM FOR TEMP STORAGE. 93 ; 94 E004 21EB00 LXI H,00FFH-TEMPS+2 95 E007 25 INIT: DCR H 96 E008 7E MOV A,M 97 E009 34 INR M 98 E00A BE CMP M ;DID IT CHANGE? 99 E00B 28 DB JRZ 100 E00C FA DB INIT-$-1 101 E00D 35 DCR M ;YES. RESTORE IT. 102 ; 103 ; HL NOW POINTS TO BP STACK END 104 ; 105 E00E 3600 MVI M,0 ;BP STACK END MARK 106 E010 7D MOV A,L ;SAVE 107 E011 2B DCX H ;STORAGE FOR BPSP,LO 108 E012 77 MOV M,A ;STORE BPSP,LO 109 E013 11E6FF LXI D,DUHL2-2 110 E016 19 DAD D ;TO END OF REG STORAGE 111 E017 F9 SPHL ;SYS SP 112 ; 113 E018 ED DB 0EDH ;SBC HL,DE: BACK TO UPC;HI 114 E019 52 DB 52H ;(CY WAS SET BY 'DAD D') 115 E01A E5 PUSH H 116 E01B DD DB IX 1171 118 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 119+ 04:31 11/15/2014 120+ PAGE 3 121 122 123 124 E01C E1 POP H ;POP IX: STORAGE PNTR 125 ; 126 E01D 16FF MVI D,PPAGE ;FORCE USER SP TO 127 E01F 2B DCX H 128 E020 2B DCX H 129 E021 72 MOV M,D ;POINT TO PROM 130 ; 131 ; SET BAUD RATE 132 ; 133 E022 3ED8 INIT1: MVI A,0D8H ;300 BAUD 134 E024 CD36E0 CALL BAUD 135 E027 3EF4 MVI A,0F4H ;110 BAUD 136 E029 C436E0 CNZ BAUD 137 E02C 20 DB JRNZ 138 E02D F4 DB INIT1-$-1 139 ; 140 E02E 2194E3 LXI H,HEAD ;HEADING 141 E031 CD0CE2 CALL PMSG 142 ; 143 E034 18 DB JR 144 E035 66 DB CMND-$-1 145 ; 146 E036 D300 BAUD: OUT STAT ;SET BAUD RATE 147 E038 CD41E1 CALL GBYTE 148 E03B CD41E1 CALL GBYTE ;CAN WE 149 E03E E67F ANI 7FH ;READ 150 E040 FE0D CPI CR ;A CR? 151 E042 C9 RET 152 ; 153 ; ENTER MONITOR FROM BRKPT 154 ; 155 ; SAVE MACHINE STATE. SAVES ALL REGS INCLUDING 156 ; SP, FINDS THE TOP OF RAM INSTALLED IN MACHINE 157 ; & SWITCHES THE STACK THERE. 158 ; 159 E043 E3 SVMS: XTHL ;ADJUST BRKPT RET ADDR 160 E044 2B DCX H 161 E045 E3 XTHL 162 ; 163 E046 E5 PUSH H ;SAVE 164 E047 210400 LXI H,4 165 E04A 39 DAD SP ;USP (USER-SP) 166 E04B E3 XTHL ;TO STACK 167 ; 168 E04C F5 PUSH PSW ;UAF 169 E04D C5 PUSH B ;UBC 170 E04E D5 PUSH D ;UDE 171 E04F E5 PUSH H ;UHL 172 ; 173 ; FIND SYS STACK AGAIN 174 ; 1751 176 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 177+ 04:31 11/15/2014 178+ PAGE 4 179 180 181 182 E050 21E900 LXI H,00FFH-TEMPS 183 E053 25 SVMS1: DCR H ;DECRM MEM PAGE 184 E054 7E MOV A,M 185 E055 34 INR M 186 E056 BE CMP M ;DID IT CHANGE? 187 E057 28 DB JRZ 188 E058 FA DB SVMS1-$-1 189 E059 35 DCR M ;YES. RESTORE IT. 190 ; 191 E05A EB XCHG 192 E05B 210B00 LXI H,11 193 E05E 39 DAD SP ;PNTS TO BPRA, HI BYTE 194 E05F 010C00 LXI B,12 195 E062 ED DB LDDR ;TRANSFER TO SYS STACK 196 E063 B8 DB LDDR1 197 E064 13 INX D ;DE HAS CURRENT VALUE OF SYS SP AND POINTS TO UR 198 E065 23 INX H ;HL HAS CURRENT VALUE OF USER SP AND ALSO POINTS 199 ;TO UR 200 E066 EB XCHG 201 E067 F9 SPHL ;SYS SP 202 ; 203 E068 ED DB 0EDH ;LD A,I 204 E069 57 DB 57H 205 E06A 0E00 MVI C,0 206 E06C E270E0 JPO SVMS3 ;IFF? 207 E06F 0C INR C ;C NOW HOLDS USER-IFF 208 E070 47 SVMS3: MOV B,A 209 E071 C5 PUSH B ;UIF (USER-I & USER-IFF) 210 ; 211 E072 DD DB IX 212 E073 E5 PUSH H ;PUSH IX: UIX 213 E074 FD DB IY 214 E075 E5 PUSH H ;PUSH IY: UIY 215 E076 010B00 LXI B,DUPC-DUHL+1 216 E079 09 DAD B ;PNTS TO UPC, HI BYTE 217 E07A E5 PUSH H 218 E07B DD DB IX 219 E07C E1 POP H ;TO IX (POINTS TO UPC) 220 ; 221 E07D 08 DB EXAF 222 E07E F5 PUSH PSW 223 E07F D9 DB EXX 224 E080 C5 PUSH B ;UBC2 225 E081 D5 PUSH D ;UDE2 226 E082 E5 PUSH H ;UHL2 227 ; 228 E083 DD DB IX 229 E084 E5 PUSH H ;PUSH IX 230 E085 E1 POP H 231 E086 23 INX H ;POINTS TO BPSP,LO 232 E087 6E MOV L,M ;BPSP NOW IN HL 2331 234 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 235+ 04:31 11/15/2014 236+ PAGE 5 237 238 239 240 ; 241 ; CLEAR ALL BRKPTS 242 ; 243 E088 7E CLBP1: MOV A,M ;BP STK EMPTY? 244 E089 B7 ORA A 245 E08A 28 DB JRZ 246 E08B 0A DB CLBP2-$-1 247 ; 248 E08C 2B DCX H 249 E08D 56 MOV D,M 250 E08E 2B DCX H 251 E08F 5E MOV E,M 252 E090 2B DCX H 253 E091 7E MOV A,M 254 E092 12 STAX D ;RESTORE CONTENTS TO MEM 255 E093 2B DCX H 256 E094 18 DB JR 257 E095 F2 DB CLBP1-$-1 258 ; 259 E096 7D CLBP2: MOV A,L 260 E097 2B DCX H 261 E098 77 MOV M,A ;ADJUST BPSP 262 ; 263 E099 CDF5E0 CALL DSPR ;DISPLAY USER REGISTERS 264 ; 265 ; GET 1-BYTE COMMAND. 266 ; RETURNS VALUE IN HL & JUMPS TO THAT ADDR. 267 ; 268 E09C CD0CE1 CMND: CALL CRLF 269 E09F 21B3E3 CMND1: LXI H,PRMPT 270 E0A2 CD0CE2 CALL PMSG 271 ; HL NOW PNTS TO TBL ADDR 272 E0A5 CD1AE2 CALL GCMND ;DE GETS LETTER - 'A' 273 E0A8 EB XCHG 274 E0A9 29 DAD H ;TIMES 2 275 E0AA 19 DAD D ; + TBL ADDR 276 E0AB 5E MOV E,M 277 E0AC 23 INX H 278 E0AD 56 MOV D,M 279 E0AE EB XCHG 280 E0AF 119FE0 LXI D,CMND1 ;SET UP RETURN 281 E0B2 D5 PUSH D ;TO CMND 282 E0B3 79 MOV A,C ;A & C HAVE CMND DELIMITER 283 E0B4 E9 PCHL 284 ; 285 ; REJECTS ALL BUT ALPHABETIC CHARACTERS. 286 ; RETURNS THE CHAR LESS THE ASCII VALUE OF 'A'. 287 ; 288 E0B5 D661 ABCYZ: SUI 'A'+CASE ;'A' OR ABOVE? 289 E0B7 38 DB JRC 290 E0B8 03 DB ERROR-$-1 2911 292 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 293+ 04:31 11/15/2014 294+ PAGE 6 295 296 297 298 E0B9 FE19 CPI 25D ;'Y' OR BELOW? 299 E0BB D8 RC ;IF NOT, CONTINUE BELOW 300 ; 301 ; ERROR & ESCAPE. RETURNS TO CMND WITH SP 302 ; POINTING TO SAVED-REG AREA (UHL2). 303 ; 304 E0BC CD09E2 ERROR: CALL PSQS ;PRINT '? <BELL>' 305 E0BF DD ESCPE: DB IX 306 E0C0 E5 PUSH H ;PUSH IX 307 E0C1 E1 POP H 308 E0C2 11E7FF LXI D,DUHL2-1-DUPC 309 E0C5 19 DAD D 310 E0C6 F9 SPHL 311 E0C7 18 DB JR 312 E0C8 D3 DB CMND-$-1 ;GET NEW CMND 313 ; 314 ; PROGRAM PROMS. ABORTS IF DESTINATION 315 ; IS NOT ON A 1K (400H) BOUNDARY, SWATH 316 ; WIDTH IS NOT A MULTIPLE OF 1K. 317 ; 318 E0C9 06B5 PROG: MVI B,181 ;360 ITERATION 319 E0CB C5 PROG1: PUSH B ;SAVE # OF ITERATIONS 320 E0CC CD70E1 CALL LD2N ;SOURCE TO DE,INCRM TO BC, 321 E0CF F5 PUSH PSW ;SAVE LATEST DELIMITER 322 E0D0 78 MOV A,B ;IS INCRM A MULT OF 1024? 323 E0D1 E603 ANI 3 324 E0D3 B1 ORA C 325 E0D4 20 DB JRNZ 326 E0D5 E6 DB ERROR-$-1 327 E0D6 F1 POP PSW ;LAST DELIMITER 328 E0D7 CD8EE1 CALL LINCR ;SOURCE TO HL, DEST TO DE 329 E0DA 7A MOV A,D ;IS DEST A MULT OF 1024? 330 E0DB E603 ANI 3 331 E0DD B3 ORA E 332 E0DE 20 DB JRNZ 333 E0DF DC DB ERROR-$-1 334 ; 335 E0E0 F1 PROG3: POP PSW ;ITERATION 336 E0E1 F5 PUSH PSW 337 E0E2 C5 PUSH B ;INCREMENT 338 E0E3 010004 LXI B,1024 339 E0E6 C5 PUSH B ;SAVE 340 E0E7 CD50E2 CALL MVE ;MOVE IT 341 E0EA C1 POP B ;RETRIEVE 342 E0EB E3 XTHL ;INCRM TO HL 343 E0EC B7 ORA A ;RESET CY 344 E0ED ED DB 0EDH ;SBC HL,BC 345 E0EE 42 DB 42H 346 E0EF E3 XTHL ;SOURCE BACK TO HL 347 E0F0 C1 POP B ;NEW INCRM 348 E0F1 20 DB JRNZ 3491 350 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 351+ 04:31 11/15/2014 352+ PAGE 7 353 354 355 356 E0F2 ED DB PROG3-$-1 ;LOOP IF INCRM NOT 0 357 E0F3 F1 POP PSW ;CLEAN UP 358 E0F4 C9 RET ;BACK TO CMND 359 ; 360 ; COMMAND 361 ; 362 ; DISPLAY THE USER REGISTERS. 363 ; 364 E0F5 CD0CE1 DSPR: CALL CRLF 365 E0F8 DD DB IX 366 E0F9 E5 PUSH H ;PUSH IX 367 E0FA E1 POP H ;POINTS TO UPC 368 E0FB 0602 MVI B,2 ;UPC & USP 369 E0FD CD07E1 CALL PREGS 370 E100 0607 MVI B,7 ;UAF THRU UIY 371 E102 CD07E1 CALL PREGS 372 E105 0604 MVI B,4 ;UAF2 THRU UHL2 373 E107 CD4AE1 PREGS: CALL P2BMS ;PRINT 2 BYTES PNTED TO B 374 E10A 10 DB DJNZ 375 E10B FB DB PREGS-$-1 376 ; (CONTINUE BELOW) 377 ; 378 ; PRINT CR & LF. PRESERVES ALL REGS BUT A. 379 ; 380 E10C 3E0D CRLF: MVI A,CR 381 ; (CONTINUE BELOW) 382 ; 383 ; PRINT THE CHARACTER IN THE A-REGISTER. (CHECKS 384 ; INPUT FOR ESCAPE.) PRESERVES ALL REGS. 385 E10E F5 PCHR: PUSH PSW ;SAVE THE CHAR 386 E10F DB00 IN STAT 387 E111 E640 ANI DAV 388 E113 28 DB JRZ 389 E114 08 DB PCHR2-$-1 390 E115 DB01 IN DATA 391 E117 E67F ANI 7FH 392 ; 393 E119 FE1B PCHR1: CPI ESC 394 E11B 28 DB JRZ 395 E11C A2 DB ESCPE-$-1 396 ; 397 E11D DB00 PCHR2: IN STAT 398 E11F E680 ANI TBE 399 E121 28 DB JRZ 400 E122 FA DB PCHR2-$-1 401 E123 F1 POP PSW 402 E124 D301 OUT DATA 403 E126 F5 PUSH PSW 404 E127 E5 PUSH H 405 E128 21B0E3 LXI H,LFNN 406 E12B FE0D CPI CR 4071 408 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 409+ 04:31 11/15/2014 410+ PAGE 8 411 412 413 414 E12D CC0CE2 CZ PMSG 415 E130 E1 POP H 416 E131 F1 POP PSW 417 E132 C9 RET 418 ; 419 ; GET CHARATER. RETURNS IT IN A. CONVERTS 420 ; ALPHA CHARS TO LOWER-CASE. ALTERS F. 421 ; 422 E133 CD41E1 GCHR: CALL GBYTE 423 E136 E67F ANI 7FH 424 E138 FE41 CPI 'A' 425 E13A 38 DB JRC 426 E13B 02 DB GCHR1-$-1 427 E13C F620 ORI 20H ;CONVERT TO LOWER-CASE 428 E13E F5 GCHR1: PUSH PSW ;SAVE THE CHAR 429 E13F 18 DB JR 430 E140 D8 DB PCHR1-$-1 ;PRINT IT 431 ; 432 E141 DB00 GBYTE: IN STAT 433 E143 E640 ANI DAV 434 E145 28 DB JRZ 435 E146 FA DB GBYTE-$-1 436 E147 DB01 IN DATA 437 E149 C9 RET 438 ; 439 ; PRINT 2 BYTES IN (HL) & (HL - 1). 440 ; DECREMENTS HL BY 2. ALTERS A. PRESERVES OTHERS 441 ; 442 E14A CDE5E1 P2BMS: CALL PNM 443 E14D 2B DCX H 444 E14E CDE5E1 CALL PNM 445 E151 2B DCX H 446 ; 447 ; PRINTS SPACE. PRESERVES ALL REGS BUT A. 448 ; 449 E152 3E20 SPACE: MVI A,20H 450 E154 18 DB JR 451 E155 B8 DB PCHR-$-1 452 ; 453 ; IF HL IS A MULTIPLE OF 16, DO PADDR. 454 ; 455 E156 3E0F CK16B: MVI A,15 456 ; 457 ; ENTER WITH A CONTAINING N. IF HL IS A MULTIPLE 458 ; OF N+1, DO PADDR. 459 ; 460 E158 A5 CKBND: ANA L 461 E159 C0 RNZ 462 ; 463 ; PRINT THE NUMBER IN HL, FOLLOWED BY A COLON. 464 ; PRESERVES ALL REGS EXCEPT A. 4651 466 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 467+ 04:31 11/15/2014 468+ PAGE 9 469 470 471 472 ; 473 E15A CD0CE1 PADDR: CALL CRLF 474 E15D CDDAE1 PADR1: CALL PNHL 475 E160 3E3A MVI A,':' 476 E162 18 DB JR 477 E163 AA DB PCHR-$-1 478 ; 479 ; LOAD TWO NUMBERS. FOLLOW WITH A CRLF. 480 ; 481 E164 CD70E1 L2NCR: CALL LD2N 482 ; 483 ; SKIP INITIAL SPACES. 484 ; IF DELIMITER NOT A CR, ERROR 485 ; 486 E167 CDD1E1 SKSGC: CALL SKSG ;LOOK FOR A NON-SPACE 487 E16A FE0D CPI CR ;CR? 488 E16C C2BCE0 JNZ ERROR 489 E16F C9 RET 490 ; 491 ; LOAD TWO NUMBERS. LOADS DE WITH THE BEGINNING 492 ; ADDR, N1. LOADS BC & HL WITH THE INCREMENT 493 ; N2-N1+1 (OR WITH N2 IF THE OPR IS 'S'). 494 ; RETURN WITH LAST DELIMITER IN A. 495 ; 496 E170 CD97E1 LD2N: CALL GNHL ;N1 TO HL, DELIMITER TO A 497 E173 EB XCHG ;SAVE N1 IN DE 498 E174 CDD1E1 CALL SKSG ;GET NEXT NON-SPACE CHAR 499 E177 FE73 CPI 'S'+CASE ;SWATH? 500 E179 20 DB JRNZ 501 E17A 06 DB LD2N1-$-1 502 ; 503 E17B AF XRA A ;YES 504 E17C CD97E1 CALL GNHL ;INCREMENT TO HL 505 E17F 18 DB JR 506 E180 07 DB LD2N2-$-1 507 ; 508 E181 CD97E1 LD2N1: CALL GNHL ;INCREMENT 509 E184 B7 ORA A ;CLEAR CY 510 E185 ED DB 0EDH ;SBC HL,DE 511 E186 52 DB 52H ;N2-N1 512 E187 23 INX H ;INCLUDE END POINT 513 E188 44 LD2N2: MOV B,H 514 E189 4D MOV C,L ;BC GETS THE INCRM 515 E18A C9 RET 516 ; 517 ; LOAD 3 OPERANDS. HL GETS SOURCE, DE THE 518 ; 3RD OPERAND, BC THE INCREMENT & A THE 519 ; LOW BYTE OF THE 3RD OPERAND. 520 ; 521 E18B CD70E1 LD3N: CALL LD2N 522 ; (CONTINUE BELOW) 5231 524 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 525+ 04:31 11/15/2014 526+ PAGE 10 527 528 529 530 ; 531 ; TRANSFER DE TO HL. ENTER WITH SPACE OR 532 ; 1ST DIGIT OF NUMBER IN A. GET NUMBER 533 ; INTO DE WITH LOW BYTE ALSO TO A. 534 ; FINISHES WITH A CRLF. 535 ; 536 E18E CD97E1 LINCR: CALL GNHL ;SKIP SPACES, LOAD HL 537 E191 CD67E1 CALL SKSGC ;WAIT FOR A CR 538 E194 7D MOV A,L 539 E195 EB XCHG 540 E196 C9 RET 541 ; 542 ; CLEARS HL. IF ENTERED WITH HEX CHAR IN A, 543 ; SHIFTS IT INTO HL. O/W, IGNORES LEADING 544 ; SPACES. FIRST CAHR MUST BE HEX. CONTINUES 545 ; SHIFT UNTIL A NON-HEX CHAR RECEIVED & THEN 546 ; RETURNS WITH THE LETTER IN A. 547 ; PRESERVES B,C,D,E. 548 ; 549 E197 C5 GNHL: PUSH B ;SAVE 550 E198 210000 GNHL1: LXI H,0 ;CLEAR BUFFER 551 ; STRIP LEADING SPACES & GET CHAR 552 E19B CDD1E1 CALL SKSG 553 ; FIRST CHAR MUST BE HEX 554 E19E CDAFE1 CALL HEXSH ;IF HEX, SHIFT INTO HL 555 E1A1 DABCE0 JC ERROR ;O/W,RETRY 556 E1A4 CD33E1 GNHL3: CALL GCHR 557 E1A7 CDAFE1 GNHL5: CALL HEXSH ;IF HEX SHIFT INTO HL 558 E1AA 78 MOV A,B ;RESTORE CHAR 559 E1AB 30 DB JRNC 560 E1AC F7 DB GNHL3-$-1 ;IF HEX, CONTINUE 561 E1AD C1 POP B ;IF NON-HEX, DONE 562 E1AE C9 RET 563 ; 564 ; IF A CONTAINS HEX CHAR, SHIFTS BINARY EQUIVALE 565 ; INTO HL. IF NOT HEX, RET WITH CY SET. SAVES 566 ; ORIGINAL CHAR IN B 567 ; 568 E1AF 47 HEXSH: MOV B,A 569 E1B0 D630 SUI '0' ;< '0'? 570 E1B2 D8 RC 571 E1B3 C6C9 ADI '0'-'G'-CASE 572 E1B5 D8 RC 573 E1B6 D6FA SUI 'A'-'G' 574 E1B8 30 DB JRNC ;OK IF >= 'A' 575 E1B9 03 DB HXSH0-$-1 576 E1BA C627 ADI 'A'-'9'-1+CASE 577 E1BC D8 RC 578 E1BD C60A HXSH0: DW 0AC6H ;ADI '9'+1-'0' 579 ; THE A-REG NOW CONTAINS THE HEX DIGIT IN BINARY 580 ; (THE HIGH-ORDER NIBBLE OF A IS 0.) 5811 582 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 583+ 04:31 11/15/2014 584+ PAGE 11 585 586 587 588 E1BF CDC8E1 HXSH4: CALL HXSH1 ;SHIFT 4 BITS INTO HL 589 E1C2 CDC8E1 CALL HXSH1 590 E1C5 CDC8E1 CALL HXSH1 591 ; 592 E1C8 07 HXSH1: RLC ;SHIFT INTO BIT 4 593 E1C9 29 DAD H ;SHIFT LEFT 594 ; CLEAR CY IN CASE OF RET FROM HEXSH 595 E1CA B7 ORA A 596 E1CB CB DB 0CBH ;BIT 4,A 597 E1CC 67 DB 67H ;IS IT 0? 598 E1CD C8 RZ 599 E1CE 23 INX H 600 E1CF C9 RET 601 ; 602 ; RETURNS WITH A NON-SPACE IN THE A-REG. 603 ; IF ENTERED WITH A-REG CONTAINING A NULL 604 ; OR A SPACE, GETS NEW CHARS UNTIL FIRST 605 ; NON-SPACE OCCURS. ALTERS AF. 606 ; 607 E1D0 AF SKSG0: XRA A ;START WITH A NULL 608 ; 609 E1D1 B7 SKSG: ORA A ;DOES A CONTAIN NULL? 610 E1D2 CC33E1 SKSG1: CZ GCHR 611 E1D5 FE20 CPI 20H ;SPACE? 612 E1D7 28 DB JRZ 613 E1D8 F9 DB SKSG1-$-1 614 E1D9 C9 RET 615 ; 616 ; PRINT THE NUMBER IN HL. PRESERVES ALL REGS. 617 ; 618 E1DA F5 PNHL: PUSH PSW 619 E1DB E5 PUSH H ;TO STACK 620 E1DC CDEBE1 CALL P4HEX 621 E1DF E1 POP H 622 E1E0 F1 POP PSW 623 E1E1 C9 RET 624 ; 625 ; PRINT SPACE FOLLOWED BY THE NUMBER POINTED 626 ; TO BY HL. ALTERS A ONLY. 627 ; 628 E1E2 CD52E1 PSNM: CALL SPACE 629 ; (CONTINUE BELOW) 630 ; 631 ; PRINTS THE NUMBER POINTED TO BY HL. 632 ; PRESERVES ALL REGISTERS. 633 ; 634 E1E5 F5 PNM: PUSH PSW 635 E1E6 CDF3E1 CALL P2HEX 636 E1E9 F1 POP PSW 637 E1EA C9 RET 638 ; 6391 640 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 641+ 04:31 11/15/2014 642+ PAGE 12 643 644 645 646 ; PRINTS 4 HEX CHARS FROM TOP OF STACK. 647 ; ALTERS F,H,L. 648 ; 649 E1EB 210300 P4HEX: LXI H,3 650 E1EE 39 DAD SP ;HL = SP 651 E1EF CDF3E1 CALL P2HEX ;HIGH BYTE 652 E1F2 2B DCX H ;LOW BYTE 653 ; 654 ; PRINT THE NUMBER POINTED TO BY HL. 655 ; PRESERVES ALL REGS EXCEPT AF. 656 E1F3 7E P2HEX: MOV A,M ;GET THE NUMBER 657 E1F4 0F RRC 658 E1F5 0F RRC 659 E1F6 0F RRC 660 E1F7 0F RRC 661 E1F8 CDFCE1 CALL P1HEX ;LEFT NIBBLE 662 E1FB 7E MOV A,M ;NOW DO THE RIGHT NIBBLE 663 E1FC E60F P1HEX: ANI 0FH ;MASK 664 E1FE FE0A CPI 10 ;<= 9? 665 E200 38 DB JRC 666 E201 02 DB P1HX1-$-1 667 E202 C607 ADI 7 ;A THRU F 668 E204 C630 P1HX1: ADI 30H ;ASCII BIAS 669 E206 C30EE1 JMP PCHR ;PRINT IT 670 ; 671 ; PRINT MESSAGE. ENTER WITH ADDR OF MSG 672 ; IN HL. MSG IS TERMINATED BY 00 THRU 07. 673 ; PRESERVES FLAGS, CLEARS A, INCRM HL. 674 ; 675 ; PRINT '? <BELL>' 676 ; 677 E209 21ADE3 PSQS: LXI H,SQS 678 ; 679 E20C 3E00 PMSG: MVI A,0 ;CLEAR A (FOR GNHL) 680 E20E F5 PUSH PSW ;SAVE FLAGS 681 E20F 7E PMSG1: MOV A,M 682 E210 23 INX H 683 E211 CD0EE1 CALL PCHR 684 E214 E6F8 ANI 0F8H ;<NULL> THRU <BELL>? 685 E216 20 DB JRNZ 686 E217 F7 DB PMSG1-$-1 687 E218 F1 POP PSW 688 E219 C9 RET 689 ; 690 ; DE GETS THE FIRST ALPHA CHAR - 'A'. 691 ; C GETS THE FIRST DELIMITER. 692 ; B IS INITIALIZED TO '0' & RETURNS 693 ; THE LAST CMND CHARACTER. 694 ; 695 E21A CDD0E1 GCMND: CALL SKSG0 ;GET NON-SPACE 696 E21D CDB5E0 CALL ABCYZ ;ALPHA CHECK 6971 698 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 699+ 04:31 11/15/2014 700+ PAGE 13 701 702 703 704 E220 5F MOV E,A 705 E221 1600 MVI D,0 ;DE HAS TBL DISPLACEMENT 706 E223 066F MVI B,'O'+CASE ;INITIALIZE FOR GO CMND 707 E225 CD33E1 GCMN1: CALL GCHR ;GET CHAR 708 E228 FE30 CPI 30H ;DELIMITER? 709 E22A 4F MOV C,A ;DELIM STORE 710 E22B D8 RC ;IF SO, DONE 711 E22C 47 MOV B,A ;LAST CHAR STORE 712 E22D 18 DB JR 713 E22E F6 DB GCMN1-$-1 714 ; 715 ; COMMAND 716 ; 717 E22F CD8BE1 VERIF: CALL LD3N ;GET 3 OPERANDS 718 ; 719 ; COMPARES TWO AREAS OF MEMORY. ENTER WITH 720 ; SOURCE IN HL. DESTINATION IN DE & COUNT 721 ; IN BC. ALTERS ALL REGISTERS. 722 ; 723 E232 1A VRFY: LDAX D ;DESTINATION 724 E233 ED DB CPI0 ;COMPARE TO SOURCE 725 E234 A1 DB CPI1 726 E235 C40CE1 CNZ CRLF ;IF NOT SAME, CRLF 727 E238 2B DCX H ;(CPI INCRMS HL) 728 E239 C4DAE1 CNZ PNHL ; & PRINT SOURCE ADDR 729 E23C C4E2E1 CNZ PSNM ; & SOURCE CONTENTS 730 E23F EB XCHG 731 E240 C4E2E1 CNZ PSNM ; & DEST CONTENTS 732 E243 EB XCHG 733 E244 23 INX H ;RESTORE HL FOR CPI 734 E245 13 INX D ;NEXT DEST 735 E246 E20CE1 JPO CRLF ;IF BC = 0, DONE 736 E249 18 DB JR 737 E24A E7 DB VRFY-$-1 738 ; 739 ; COMMAND 740 ; 741 E24B CD8BE1 MOVE: CALL LD3N ;OPERANDS 742 E24E 3E01 MVI A,1 ;# OF ITERATION 743 ; 744 ; MOVE FROM ONE LOCATION TO ANOTHER. ENTER 745 ; WITH SOURCE ADDR IN HL, DEST IN DE, BYTE 746 ; COUNT IN BC. THE MOVE IS ITERATED N TIMES, 747 ; WHERE N = TWICE THE CONTENTS OF A, LESS ONE. 748 ; INCREMENTS HL & DE BY BC. CHECKS RESULT 749 ; & PRINTS THE ERRORS FOUND. 750 E250 37 MVE: STC ;CY IS USED IN ITERATION COUNT 751 E251 E5 MVE1: PUSH H ;SOURCE 752 E252 D5 PUSH D ;DEST 753 E253 C5 PUSH B ;BYTE COUNT 754 E254 F3 DI ;FOR PROM PROGRAMMING 7551 756 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 757+ 04:31 11/15/2014 758+ PAGE 14 759 760 761 762 E255 ED DB LDIR ;ONE ITERATION 763 E256 B0 DB LDIR1 764 E257 FB EI 765 E258 C1 POP B 766 E259 D1 POP D 767 E25A E1 POP H 768 ; ITERATION CALCULATIONS 769 E25B 3F CMC 770 E25C 38 DB JRC 771 E25D F3 DB MVE1-$-1 772 E25E 3D DCR A 773 E25F 20 DB JRNZ 774 E260 F0 DB MVE1-$-1 775 ; CHECK RESULT 776 E261 18 DB JR 777 E262 CF DB VRFY-$-1 778 ; 779 ; COMMAND 780 ; 781 ; GO <CR> EXECUTION BEGINS AT USER PC. 782 ; 783 ; COMMAND 784 ; 785 ; GO <ADDR1>/<ADDR2> ... >ADDRN> 786 ; EXECUTION BEGINS AT ADDR1 WITH BREAKPOINTS SET 787 ; AT ADDR2,...,ADDRN. 788 ; 789 E263 78 GO: MOV A,B ;CHECK THAT THE LAST 790 E264 FE6F CPI 'O'+CASE ;CMND CHAR IS 'O' 791 E266 C2BCE0 JNZ ERROR 792 E269 79 MOV A,C ;CMND DELIMITER 793 E26A 0E00 MVI C,0 ;BP FLAG 794 E26C CDD1E1 GO1: CALL SKSG ;WAIT FOR NON-SPACE 795 E26F FE0D CPI CR 796 E271 28 DB JRZ 797 E272 3A DB RETN-$-1 ;RETN IF CR 798 E273 FE2F CPI '/' ;BP? 799 E275 20 DB JRNZ 800 E276 0E DB GO3-$-1 801 E277 0E01 MVI C,1 ;SET BRKPT FLAG 802 E279 213000 LXI H,RSTLC ;TRANSFER 803 E27C 36C3 MVI M,0C3H ;'JMP SVMS' TO 804 E27E 2143E0 LXI H,SVMS 805 E281 223100 SHLD RSTLC+1 ;RST LOC 806 E284 AF XRA A 807 E285 CD97E1 GO3: CALL GNHL ;GET ADDR 808 E288 CB41 DW 41CBH ;BIT 0,C: FLAG SET? 809 E28A EB XCHG 810 E28B 28 DB JRZ 811 E28C 18 DB GO5-$-1 ;JMP IF NO BP 812 E28D DD DB IX 8131 814 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 815+ 04:31 11/15/2014 816+ PAGE 15 817 818 819 820 E28E E5 PUSH H ;PUSH IX 821 E28F E1 POP H 822 E290 23 INX H 823 E291 6E MOV L,M ;HL = BPSP 824 ; 825 E292 23 INX H ;BUMP BPSP 826 E293 EB XCHG ;DE=BPSP, HL= BP ADDR 827 E294 46 MOV B,M ;CONTENTS 828 E295 36F7 MVI M,0C7H+RSTLC ;RST INSTRUCTION 829 E297 EB XCHG ;HL=BPSP 830 E298 70 MOV M,B ;TO BP STACK 831 E299 23 INX H ;BUMP BPSP 832 E29A 73 MOV M,E ;BP ADDR TO STACK 833 E29B 23 INX H 834 E29C 72 MOV M,D 835 E29D 23 INX H 836 E29E 3601 MVI M,01 ;PUNCTUATION (BP SET) 837 E2A0 DD DB IX 838 E2A1 75 MOV M,L ;LD (IX+1),L 839 E2A2 01 DB 1 840 E2A3 18 DB JR 841 E2A4 C7 DB GO1-$-1 842 ; CHANGE USER PC 843 E2A5 DD GO5: DB IX 844 E2A6 72 MOV M,D ;LD (IX+DUPC),D 845 E2A7 00 DB DUPC 846 E2A8 DD DB IX 847 E2A9 73 MOV M,E ;LD (IX+DUPC-1),E 848 E2AA FF DB DUPC-1 849 E2AB 18 DB JR 850 E2AC BF DB GO1-$-1 ;BACK FOR MORE 851 ; 852 E2AD E1 RETN: POP H ;STRIP CMND ADDR FROM STK 853 E2AE E1 POP H ;UHL2 854 E2AF D1 POP D ;UDE2 855 E2B0 C1 POP B ;UBC2 856 E2B1 F1 POP PSW ;UAF2 857 E2B2 D9 DB EXX 858 E2B3 08 DB EXAF 859 E2B4 FD DB IY 860 E2B5 E1 POP H ;POP IY: UIY 861 E2B6 DD DB IX 862 E2B7 E1 POP H ;POP IX: UIX 863 ; 864 E2B8 F1 POP PSW ;UIF 865 E2B9 ED DB 0EDH 866 E2BA 47 DB 47H ;LD I,A: UI 867 E2BB F3 DI 868 E2BC 30 DB JRNC 869 E2BD 01 DB RETN1-$-1 870 E2BE FB EI 8711 872 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 873+ 04:31 11/15/2014 874+ PAGE 16 875 876 877 878 ; IFF NOW RESTORED 879 E2BF E1 RETN1: POP H ;UHL 880 E2C0 D1 POP D ;UDE 881 E2C1 C1 POP B ;UBC 882 E2C2 F1 POP PSW ;UAF 883 E2C3 E3 XTHL ;USP TO HL, UHL TO (SP) 884 E2C4 F5 PUSH PSW 885 E2C5 C5 PUSH B 886 E2C6 D5 PUSH D 887 E2C7 010A00 LXI B,10 888 E2CA EB XCHG ;USP TO DE 889 E2CB 1B DCX D 890 E2CC 210900 LXI H,9 891 E2CF 39 DAD SP 892 E2D0 ED DB LDDR ;TRANSFER UPC THRU UHL, L 893 E2D1 B8 DB LDDR1 ;TO USER STACK 894 E2D2 EB XCHG ;IS (USER SP - 1) RAM? 895 E2D3 7E MOV A,M 896 E2D4 34 INR M 897 E2D5 BE CMP M ;DID IT CHANGE? 898 E2D6 28 DB JRZ 899 E2D7 03 DB RETN2-$-1 900 ; 901 E2D8 35 DCR M ;YES, RESTORE IT. 902 E2D9 F9 SPHL ;CHABGE TO USER STACK 903 E2DA 33 INX SP ;CORRECT FOR LDDR EXTRA DCR 904 ; 905 E2DB D1 RETN2: POP D ;OTHERWISE, CONTINUE SYS 906 E2DC C1 POP B 907 E2DD F1 POP PSW 908 E2DE E1 POP H 909 E2DF C9 RET 910 ; 911 ; ENTER WITH HL POINTING TO MEMORY & B CONTAINING 912 ; THE 2-BYTE REG FLAG. 913 ; PRINTS SPACE, CONTENTS OF (HL) & ALSO (HL-1) FOR 914 ; 2-BYTE REGS, GETS SUBSTITUTION VALUE INTO DE, 915 ; WRITES E INTO (HL) OR (HL-1) FOR 2-BYTE REGS. 916 ; RETURNS WITH Z-FLAG RESET IFF A CHANGE IS INDICATED 917 ; (BY A LACK OF '.') FOR A 2-BYTE REG. 918 ; PRESERVES BC,HL. 919 ; 920 E2E0 CDE2E1 GSUBV: CALL PSNM ;PRINT (HL) 921 E2E3 CB DB 0CBH ;BIT 6,B 922 E2E4 70 DB 70H ;2-BYTE REG? 923 E2E5 28 DB JRZ 924 E2E6 04 DB GSBV1-$-1 925 E2E7 2B DCX H ;YES, PRINT 926 E2E8 CDE5E1 CALL PNM ; LO BYTE 927 E2EB 3E2E GSBV1: MVI A,'.' 928 E2ED CD0EE1 CALL PCHR 9291 930 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 931+ 04:31 11/15/2014 932+ PAGE 17 933 934 935 936 E2F0 CD33E1 CALL GCHR 937 E2F3 FE2E CPI '.' ;SUSTITUTION? 938 E2F5 CC0EE1 CZ PCHR ;IF NOT, PRINT ANOTHER 939 E2F8 28 DB JRZ 940 E2F9 08 DB GSBV2-$-1 941 E2FA EB XCHG 942 E2FB CD97E1 CALL GNHL ;NEW VALUE 943 E2FE EB XCHG ;TO DE 944 E2FF 73 MOV M,E ;LOAD MEM 945 ; THE FOLLOWING TEST IS FOR SBSR 946 E300 CB DB 0CBH ;BIT 6,B 947 E301 70 DB 70H ;2-BYTE REG? 948 E302 23 GSBV2: INX H 949 E303 C9 RET 950 ; 951 ; COMMAND 952 ; 953 ; SM <ADDR> SUBSTITUTE MEMORY LOCATION. 954 ; 955 ; COMMAND 956 ; 957 ; SR <REGISTER NAME> SUBSTITUTE USER REGISTER 958 ; 959 ; REGISTER NAMES: P (PC), S (SP), 960 ; A, F, B, C, D, E, H, L, 961 ; I, T (IFF), X (IX), Y (IY), 962 ; A',F',B',C',D',E',H',L'. 963 ; 964 E304 78 SUBST: MOV A,B ;LAST CMND CHAR 965 E305 FE72 CPI 'R'+CASE ;SR? 966 E307 79 MOV A,C ;DELIMITER 967 E308 28 DB JRZ 968 E309 0F DB SBSR-$-1 969 ; 970 E30A CD97E1 SBSM: CALL GNHL ;HL GETS ADDR 971 E30D 0600 SBSM1: MVI B,0 ;REG FLAGS 972 ; PRINT CURRENT VALUE, REQUEST NEW VALUE & 973 ; PRINT IT IF GIVEN 974 E30F CDE0E2 CALL GSUBV 975 E312 3E07 MVI A,7 ;8 ENTRIES PER LINE 976 E314 CD58E1 CALL CKBND 977 E317 18 DB JR 978 E318 F4 DB SBSM1-$-1 979 ; 980 E319 CD1AE2 SBSR: CALL GCMND ;DE GETS LETTER - 'A' 981 E31C 21E7E3 LXI H,RGTBL 982 E31F 19 DAD D ;PNTS TO REG DISPLACEMENT 983 E320 42 MOV B,D ;D = 0 984 E321 CB DB 0CBH ;BIT 7,(HL) 985 E322 7E DB 7EH ;A THRU L? 986 E323 28 DB JRZ 9871 988 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 989+ 04:31 11/15/2014 990+ PAGE 18 991 992 993 994 E324 0C DB SBSR1-$-1 995 E325 79 MOV A,C ;LAST CMND DELIMITER 996 E326 FE20 CPI 20H ;SPACE? 997 E328 28 DB JRZ 998 E329 07 DB SBSR1-$-1 999 E32A FE27 CPI '''' ;PRIMED? 1000 E32C C2BCE0 JNZ ERROR 1001 E32F 060E MVI B,DUAF-DUAF2 ;YES 1002 ; 1003 E331 7E SBSR1: MOV A,M ;DISPLACEMENT & FLAGS 1004 E332 B7 ORA A ;IF 0, ILLEGAL CMND 1005 E333 CABCE0 JZ ERROR 1006 E336 E61F ANI 1FH ;STRIP FLAGS OFF 1007 E338 80 ADD B ;ADJUST FOR PRIMES 1008 E339 5F MOV E,A ;DE GETS DISPL (D=0) 1009 E33A 46 MOV B,M ;SAVE ORIG ENTRY 1010 E33B DD DB IX 1011 E33C E5 PUSH H ;PUSH IX 1012 E33D E1 POP H ;STACK FRAME 1013 E33E ED DB 0EDH ;SBC HL,DE 1014 E33F 52 DB 52H ;PNTS TO USER REG 1015 ; PRINT CURRENT VALUE, DE GETS SUBSTITUTION 1016 ; VALUE, IF ANY, & (HL) OR (HL-1) GETS E. 1017 ; Z-FLAG RESET IFF CHANGE FOR A 2-BYTE REG. 1018 E340 CDE0E2 CALL GSUBV 1019 E343 28 DB JRZ 1020 E344 01 DB SBSR3-$-1 1021 E345 72 MOV M,D ;NO. HI BYTE 1022 E346 CD52E1 SBSR3: CALL SPACE 1023 E349 18 DB JR 1024 E34A CE DB SBSR-$-1 1025 ; 1026 E34B 78 DISPL: MOV A,B ;LAST CMND CHAR 1027 E34C FE72 CPI 'R'+CASE ;DR? 1028 E34E 79 MOV A,C ;CMND DELIMITER 1029 E34F CAF5E0 JZ DSPR 1030 ; 1031 ; COMMAND 1032 ; 1033 ; DISPLAY MEMORY. 1034 ; 1035 E352 CD64E1 DSPM: CALL L2NCR ;INTO DE, INCRM TO BC, 1036 ;DELIMITER TO A 1037 E355 EB XCHG ;N1 TO HL 1038 E356 CD5DE1 DSPM1: CALL PADR1 ;PRINT ADDR, ':' 1039 E359 CDE2E1 DSPM2: CALL PSNM ;PRINT CONTENTS OF MEM 1040 E35C 23 INX H 1041 E35D 0B DCX B 1042 E35E 78 MOV A,B 1043 E35F B1 ORA C ;DONE? 1044 E360 CA0CE1 JZ CRLF 10451 1046 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 1047+ 04:31 11/15/2014 1048+ PAGE 19 1049 1050 1051 1052 E363 CD56E1 CALL CK16B ;CHECK FOR 16 COUNT 1053 E366 18 DB JR 1054 E367 F1 DB DSPM2-$-1 1055 ; 1056 ; COMMAND 1057 ; READ BINARY INPUT FROM DATA PORT 1058 ; 1059 E368 CD64E1 READB: CALL L2NCR ;GET MEM ADDRS 1060 E36B CD41E1 RDB1: CALL GBYTE ;GET INPUT 1061 E36E 12 STAX D ;TO MEM 1062 E36F 13 INX D 1063 E370 0B DCX B ;COUNT 1064 E371 78 MOV A,B 1065 E372 B1 ORA C ;BC = 0? 1066 E373 20 DB JRNZ 1067 E374 F6 DB RDB1-$-1 1068 E375 C9 RET 1069 ; 1070 ; COMMAND 1071 ; WRITE BINARY OUTPUT TO DATA PORT 1072 ; 1073 E376 CD64E1 WRITB: CALL L2NCR ;GET MEM ADDRS 1074 E379 DB00 WRTB1: IN STAT 1075 E37B E680 ANI TBE 1076 E37D 28 DB JRZ 1077 E37E FA DB WRTB1-$-1 1078 E37F 1A LDAX D 1079 E380 D301 OUT DATA 1080 E382 13 INX D 1081 E383 0B DCX B 1082 E384 78 MOV A,B 1083 E385 B1 ORA C 1084 E386 20 DB JRNZ 1085 E387 F1 DB WRTB1-$-1 1086 E388 C9 RET 1087 ; 1088 ; COMMAND 1089 ; OUT <DATA-BYTE> <PORT NUMBER> 1090 ; 1091 E389 CD97E1 OUTP: CALL GNHL 1092 E38C EB XCHG ;E GETS DATA 1093 E38D CD97E1 CALL GNHL ;GET PORT NUMBER 1094 ; 1095 E390 4D MOV C,L ;TO C 1096 E391 ED59 DW 59EDH ;OUT (C),E 1097 E393 C9 RET 1098 ; 1099 E394 0D HEAD: DB CR 1100 E395 0D DB CR 1101 E396 43524F4D DB 'CROMEMCO MON1.0 C.1976' 1102 E39A 454D434F 11031 1104 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 1105+ 04:31 11/15/2014 1106+ PAGE 20 1107 1108 1109 1110 E39E 204D4F4E 1111 E3A2 312E3020 1112 E3A6 432E3139 1113 E3AA 3736 1114 E3AC 00 DB 0 1115 ; 1116 E3AD 203F SQS: DB ' ?' 1117 E3AF 07 DB BELL 1118 ; 1119 E3B0 0A LFNN: DB LF 1120 E3B1 7F DB 7FH ;NULL 1121 E3B2 00 DB 0 1122 ; 1123 E3B3 3A PRMPT: DB ':' 1124 E3B4 00 DB 0 1125 ; THE COMMAND TBL MUST IMMEDIATELY FOLLOW 1126 ; THE PROMT MESSAGE 1127 E3B5 BCE0 DW ERROR ;A 1128 E3B7 BCE0 DW ERROR ;BANK 1129 E3B9 BCE0 DW ERROR ;C 1130 E3BB 4BE3 DW DISPL ;DISPLAY 1131 E3BD BCE0 DW ERROR ;ENTER 1132 E3BF BCE0 DW ERROR ;FILE 1133 E3C1 63E2 DW GO 1134 E3C3 BCE0 DW ERROR ;H 1135 E3C5 BCE0 DW ERROR ;INPUT 1136 E3C7 BCE0 DW ERROR ;J 1137 E3C9 BCE0 DW ERROR ;K 1138 E3CB BCE0 DW ERROR ;LIST 1139 E3CD 4BE2 DW MOVE 1140 E3CF BCE0 DW ERROR ;NUMBER 1141 E3D1 89E3 DW OUTP ;OUTPUT 1142 E3D3 C9E0 DW PROG ;PROGRAM 1143 E3D5 BCE0 DW ERROR ;Q 1144 E3D7 68E3 DW READB ;READ BINARY OR ASCII 1145 E3D9 04E3 DW SUBST ;SUBSTITUTE 1146 E3DB BCE0 DW ERROR ;TRAP 1147 E3DD BCE0 DW ERROR ;UNEQUAL 1148 E3DF 2FE2 DW VERIF ;VERIFY 1149 E3E1 76E3 DW WRITB ;WRITE BINARY OR ASCII 1150 E3E3 BCE0 DW ERROR ;X 1151 E3E5 BCE0 DW ERROR ;Y 1152 ; 1153 E3E7 84 RGTBL: DB -DUAF+PF ;A 1154 E3E8 86 DB -DUBC+PF ;B 1155 E3E9 87 DB -DUBC+1+PF ;C 1156 E3EA 88 DB -DUDE+PF ;D 1157 E3EB 89 DB -DUDE+1+PF ;E 1158 E3EC 85 DB -DUAF+1+PF ;F 1159 E3ED 00 DB 0 1160 E3EE 8A DB -DUHL+PF ;H 11611 1162 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 1163+ 04:31 11/15/2014 1164+ PAGE 21 1165 1166 1167 1168 E3EF 0C DB -DUIT ;I 1169 E3F0 00 DB 0 1170 E3F1 00 DB 0 1171 E3F2 8B DB -DUHL+1+PF ;L 1172 E3F3 00 DB 0 1173 E3F4 00 DB 0 1174 E3F5 00 DB 0 1175 ; INTEL MACRO-80 FLAGS A VALUE ERROR, BUT CORRECT VALUE 40 IS COMPUTED 1176 ; DB -DUPC+R2F ;PC 1177 E3F6 40 DB 40H 1178 E3F7 00 DB 0 1179 E3F8 00 DB 0 1180 E3F9 42 DB -DUSP+R2F ;SP 1181 E3FA 0D DB -DUIT+1 ;T (INTERRUPT ENABLE) 1182 E3FB 00 DB 0 1183 E3FC 00 DB 0 1184 E3FD 00 DB 0 1185 E3FE 4E DB -DUIX+R2F ;X (IX) 1186 E3FF 50 DB -DUIY+R2F ;Y (IY) 1187 1188 END 1189 NO PROGRAM ERRORS 11901 1191 8080 MACRO ASSEMBLER, VER 3.0 ERRORS = 0 1192+ 04:31 11/15/2014 1193+ PAGE 22 1194 1195 1196 1197 SYMBOL TABLE 1198 1199 * 01 1200 1201 A 0007 ABCYZ E0B5 B 0000 BAUD E036 1202 BELL 0007 C 0001 CASE 0020 CK16B E156 1203 CKBND E158 CLBP1 E088 CLBP2 E096 CMND E09C 1204 CMND1 E09F CPI0 00ED CPI1 00A1 CPIR 00ED * 1205 CPIR1 00B1 * CR 000D CRLF E10C D 0002 1206 DATA 0001 DAV 0040 DISPL E34B DJNZ 0010 1207 DSPM E352 * DSPM1 E356 * DSPM2 E359 DSPR E0F5 1208 DUAF FFFC DUAF2 FFEE DUBC FFFA DUBC2 FFEC * 1209 DUDE FFF8 DUDE2 FFEA * DUHL FFF6 DUHL2 FFE8 1210 DUIT FFF4 DUIX FFF2 DUIY FFF0 DUPC 0000 1211 DUSP FFFE E 0003 ERROR E0BC ESC 001B 1212 ESCPE E0BF EXAF 0008 EXX 00D9 GBYTE E141 1213 GCHR E133 GCHR1 E13E GCMN1 E225 GCMND E21A 1214 GNHL E197 GNHL1 E198 * GNHL3 E1A4 GNHL5 E1A7 * 1215 GO E263 GO1 E26C GO3 E285 GO5 E2A5 1216 GSBV1 E2EB GSBV2 E302 GSUBV E2E0 H 0004 1217 HEAD E394 HEXSH E1AF HXSH0 E1BD HXSH1 E1C8 1218 HXSH4 E1BF * INIT E007 INIT1 E022 IX 00DD 1219 IY 00FD JR 0018 JRC 0038 JRNC 0030 1220 JRNZ 0020 JRZ 0028 L 0005 L2NCR E164 1221 LD2N E170 LD2N1 E181 LD2N2 E188 LD3N E18B 1222 LDD 00ED * LDD1 00A8 * LDDR 00ED LDDR1 00B8 1223 LDI 00ED * LDI1 00A0 * LDIR 00ED LDIR1 00B0 1224 LF 000A LFNN E3B0 LINCR E18E M 0006 1225 MOVE E24B MVE E250 MVE1 E251 OUTP E389 1226 P1HEX E1FC P1HX1 E204 P2BMS E14A P2HEX E1F3 1227 P4HEX E1EB PADDR E15A * PADR1 E15D PCHR E10E 1228 PCHR1 E119 PCHR2 E11D PF 0080 PMSG E20C 1229 PMSG1 E20F PNHL E1DA PNM E1E5 PPAGE 00FF 1230 PREGS E107 PRMPT E3B3 PROG E0C9 PROG1 E0CB * 1231 PROG3 E0E0 PSNM E1E2 PSQS E209 PSW 0006 1232 R2F 0040 RDB1 E36B READB E368 RETN E2AD 1233 RETN1 E2BF RETN2 E2DB RGTBL E3E7 RLD 00ED * 1234 RLD1 006F * RSTLC 0030 SBSM E30A * SBSM1 E30D 1235 SBSR E319 SBSR1 E331 SBSR3 E346 SET5A 00CB * 1236 SKSG E1D1 SKSG0 E1D0 SKSG1 E1D2 SKSGC E167 1237 SP 0006 SPACE E152 SQS E3AD ST5A1 00EF * 1238 START E000 * STAT 0000 SUBST E304 SVMS E043 1239 SVMS1 E053 SVMS3 E070 TBE 0080 TEMPS 0016 1240 VERIF E22F VRFY E232 WRITB E376 WRTB1 E379 1241 1242