MACLIB Z80 ROM EQU 0000H ;;;;;;;;;;;;;;;; ; work area ;;;;;;;;;;;;;;;; ORG 8000H START: DS 32 ; jump table RBC DS 2 ; BC RDE DS 2 ; DE RHL DS 2 ; HL RAF DS 2 ; AF RBC2 DS 2 ; BC' RDE2 DS 2 ; DE' RHL2 DS 2 ; HL' RAF2 DS 2 ; AF' RIX DS 2 ; IX RIY DS 2 ; IY RSP DS 2 ; SP RR DS 1 ; R RI DS 1 ; I RPC DS 2 ; PC RIFF DS 2 ; IFF DUMPR DS 2 ; for DUMP EDITR DS 2 ; for EDIT INPUR DS 2 ; for IN DISR DS 2 ; for DISASM DISX DS 1 ; IX(DD), IY(FD) DISB DS 1 ; BIT/SET/RES(CB) DISD DS 1 ; +d DISF DS 1 DISBUF DS 40 STACK EQU START+100H ;;;;;;;;;;;;;;;; ; CHAR cont. ;;;;;;;;;;;;;;;; CR EQU 0DH LF EQU 0AH TAB EQU 09H ;;;;;;;;;;;;;;;; ; I/O ;;;;;;;;;;;;;;;; CTC0 EQU 10H SIOA EQU 18H PIOA EQU 1CH ;;;;;;;;;;;;;;;; ; MAIN ;;;;;;;;;;;;;;;; ORG ROM JMP RST0 ORG ROM+08H JMP START+3 ORG ROM+10H JMP START+6 ORG ROM+18H JMP START+9 ORG ROM+20H JMP START+12 ORG ROM+28H JMP START+15 ORG ROM+30H JMP START+18 ORG ROM+38H JMP START+21 ORG ROM+66H JMP START+24 ;;;;;;;;;;;;;;;; ; RST VECTOR ;;;;;;;;;;;;;;;; RST0: PUSH H PUSH PSW IN PIOA CMA ORA A JZ RST00 RAR MOV H, A MVI A, 0 RAR MOV L, A POP PSW XTHL RET RST00: DI IM1 LXI SP, 0 LXI H, INITBL LXI D, START LXI B, 32 ; JMP table LDIR XRA A ; work area MVI B, 36 RST01: STAX D INX D DJNZ RST01 LXI B, 0200H+CTC0 ; CTC-0 OUTIR LXI B, 0700H+SIOA+1 ; SIO-A OUTIR LXI B, 0200H+PIOA+1 ; PIO-A OUTIR ; CALL HELP ; JMP LOOP JMP 1000H RST1: MVI A,10H OUT SIOA+1 IN SIOA+1 ANI 21H XRI 20H RET RST2: CALL RST1 JRZ RST2 IN SIOA RET RST3: PUSH PSW RST30: MVI A, 10H OUT SIOA+1 IN SIOA+1 ANI 24H XRI 20H JRZ RST30 POP PSW OUT SIOA RST4: RST5: RST6: RET RST7: DI RETI NMI: RETN INITBL: JMP ENTRY ; MONITOR JMP RST1 JMP RST2 JMP RST3 JMP RST4 JMP RST5 JMP RST6 JMP RST7 JMP NMI DB 20H, 07H, 08H, 07H, 1 ; CTC-0 DB 017H, 5 ; IE,M,PS,EDGE,TRIG,TC,RES,1 ; SIO-A DB 018H ; 9600bps(x16) 1-stop, no-P, 8-bit DB 4, 044H ; CR1,CR0,SM1,SM0,S1,S0,P1,P0 DB 3, 0C1H ; RB1,RB0,AE,HP,CRC,AS,SY,RXE DB 5, 06AH ; DTR,TB1,TB0,BK,TXE,CRC,RTS,CRCE ; PIO-A DB 0CFH, 0FFH ; mode-3, IN ;;;;;;;;;;;;;;;; ; entry point ;;;;;;;;;;;;;;;; ORG ROM+100H ENTRY: JMP MON ; monitor entry CALL SAVE ; from DE to HL JMP CRLF MON: SHLD RHL ; save HL POP HL ; save PC SHLD RPC SHLD DISR ; and for Z SSPD RSP ; save SP SSPD DUMPR ; and for D LXI SP, STACK PUSH PSW POP HL ; save AF SHLD RAF LDAR ; save R STA RR LDAI ; save I STA RI ; and IFF MVI A, 0F3H ; "DI" JPO MON1 MVI A, 0FBH ; "EI" MON1: STA RIFF DI SBCD RBC ; save BC/DE/IX/IY SDED RDE SIXD RIX SIYD RIY EXX SBCD RBC2 ; save BC/DE/HL/AF' SDED RDE2 SHLD RHL2 EXAF PUSH PSW POP HL SHLD RAF2 JR LOOP ;;;;;;;;;;;;;;;; ; CHECK , ;;;;;;;;;;;;;;;; CHKCM: CPI ',' RZ JR ERROR ;;;;;;;;;;;;;;;; ; CHECK CR ;;;;;;;;;;;;;;;; CHKCR: CPI CR RZ ;;;;;;;;;;;;;;;; ; ERROR ;;;;;;;;;;;;;;;; ERROR: MVI A, '?' CALL RST3 ;;;;;;;;;;;;;;;; ; MAIN LOOP ;;;;;;;;;;;;;;;; LOOP: LXI SP, STACK LXI H, LOOP PUSH H CALL MSGS DB CR, LF, '*', 0 LOOP1: CALL INPUT CPI ':' JRZ LOOP2 CPI 'A' JRC LOOP1 CPI 'Z'+1 JRNC LOOP1 CALL RST3 LOOP2: ;;;;;;;;;;;;;;;; ; G [hex] ;;;;;;;;;;;;;;;; CPI 'G' JRNZ GOFIN CALL HEXIN CALL CHKCR ; check CR MOV A, C ; if no ADRS, use saved PC ORA A JRNZ GO1 LHLD RPC GO1: SHLD RPC LDA RI ; recover I STAI LBCD RBC2 ; recover BC/DE/HL/AF' LDED RDE2 LHLD RHL2 EXX LHLD RAF2 PUSH H POP PSW EXAF LBCD RBC ; recover BC/DE/IX/IY/SP LDED RDE LIXD RIX LIYD RIY LHLD RSP BIT 7,H ; SP must point RAM JRNZ GO2 LXI H, 0 GO2: SPHL LHLD RPC ; recover PC on stack PUSH H LHLD RAF ; recover AF on stack PUSH H LDA RR ; recover R STAR LXI H, RIFF BIT 3, M MVI M, 0F3H ; "DI" JRZ GO3 MVI M, 0FBH ; "EI" GO3: INX H MVI M, 0C9H ; "RET" LHLD RHL ; recover HL POP PSW JMP RIFF ; recover IFF and GO GOFIN: ;;;;;;;;;;;;;;;; ; R ;;;;;;;;;;;;;;;; CPI 'R' JNZ REGFIN CALL RST2 CALL CHKCR ; check CR CALL MSGS DB CR, LF, '-BC- -DE- -HL- -AF- SZ-H-PNC', CR, LF, 0 LXI H, RBC CALL REG3 ; show BC/DE/HL/AF and FLAGS CALL REG3 ; show BC/DE/HL/AF' and FLAGS CALL MSGS DB '-IX- -IY- -SP- -IR- -PC- IFF', CR, LF, 0 LXI H, RIX CALL REG1 ; show IX/IY/SP/IR LHLD RPC ; show PC CALL REG5 LDA RIFF ; show IFF ORA A MVI A, '0' JRZ REG0 INR A REG0: CALL RST3 LXI H, RBC ; go EDIT mode JMP EDIT1 REG1: MVI B, 4 REG2: MOV E, M INX H MOV D, M INX H XCHG CALL REG5 XCHG DJNZ REG2 RET REG3: CALL REG1 MVI B, 8 REG4: MVI A, 18H ; '0'/2 SLAR E ADC A CALL RST3 DJNZ REG4 JMP CRLF REG5: CALL PRHEX4 PSP: MVI A, ' ' JMP RST3 REGFIN: ;;;;;;;;;;;;;;;; ; E [hex] ;;;;;;;;;;;;;;;; CPI 'E' JRNZ EDITFIN CALL HEXIN CALL CHKCR ; check CR MOV A, C ; if no ADRS, use saved adrs ORA A JRNZ EDIT1 LHLD EDITR JR EDIT1 EDIT0: DCX H EDIT1: CALL CRLF CALL PRHEX4 ; show ADRS CALL PCOL EDIT2: SHLD EDITR ; save ADRS CALL PSP MOV A, M ; show DATA CALL PRHEX2 CALL PMINS CALL HEXIN1 ; 1st input JRNC EDIT4 CPI '.' ; back if . JRZ EDIT0 CPI CR ; end if CR RZ CPI ' ' ; skip if space JNZ ERROR MOV A, M CALL PRHEX2 EDIT3: INX H ; next line ? MOV A, L ANI 07H JRNZ EDIT2 JR EDIT1 EDIT4: PUSH PSW ; show 1st digit CALL PRHEX POP PSW ADD A ADD A ADD A ADD A MOV C, A CALL HEXIN1 ; 2nd input JC ERROR PUSH PSW CALL PRHEX ; show 2nd digit POP PSW ADD C MOV M, A ; write DATA JR EDIT3 EDITFIN: ;;;;;;;;;;;;;;;; ; LOAD (intel-HEX) ;;;;;;;;;;;;;;;; CPI ':' JRNZ LOADFIN LOAD0: MVI C, 0 ; C for check-sum CALL HEXIN2 ; COUNT to B JRC LOADERR MOV B, A ADD C MOV C, A CALL HEXIN2 ; ADRS-H JRC LOADERR MOV H, A ADD C MOV C, A CALL HEXIN2 ; ADRS-L JRC LOADERR MOV L, A ADD C MOV C, A MOV A, B ORA A CNZ PRHEX4 ; show ADRS CALL HEXIN2 ; TYPE JRC LOADERR ADD C MOV C, A MOV A, B ORA A JRZ LOAD4 LOAD1: CALL HEXIN2 ; DATA JRC LOADERR MOV M, A ADD C MOV C, A INX H DJNZ LOAD1 LOAD2: CALL HEXIN2 ; CHECK-SUM JRC LOADERR ADD C JRNZ LOADERR LOAD3: CALL RST2 ; skip CR/LF CPI ':' JRNZ LOAD3 CALL RST3 JMP LOAD0 LOAD4: CALL HEXIN2 ; CHECK-SUM JRC LOADERR ADD C JRNZ LOADERR LOAD5: CALL RST2 ; skip CR/LF CPI CR JRNZ LOAD5 RET LOADERR: CALL RST2 CPI CR JRNZ LOADERR CALL PMINS DCX H CALL PRHEX4 JMP ERROR LOADFIN: ;;;;;;;;;;;;;;;; ; S hex, hex ;;;;;;;;;;;;;;;; CPI 'S' JRNZ SAVEFIN CALL HEXIN ; save FROM CALL CHKCM ; check , PUSH H CALL HEXIN ; save TO POP D CALL CHKCR ; check CR SAVE: ORA A DSBC D ; SIZE = TO - FROM + 1 INX H XCHG SAVE1: CALL CRLF MOV A, D ; check SIZE ORA E JRZ SAVE4 MOV A, L ; odd start ? CMA ANI 1FH INR A MOV B, A MOV A, D ; odd end ? ORA A JRNZ SAVE2 MOV A, E SUB B JRNC SAVE2 MOV B, E SAVE2: CALL PCOL MOV A, B ; COUNT CALL PRHEX2 MOV A, H ; ADRS-H CALL PRHEX2 MOV A, L ; ADRS-L CALL PRHEX2 XRA A ; TYPE CALL PRHEX2 MOV A, B ; C for check-sum ADD H ADD L MOV C, A SAVE3: MOV A, M ; DATA ADD C MOV C, A MOV A, M INX H DCX D CALL PRHEX2 DJNZ SAVE3 XRA A ; CHECK-SUM SUB C CALL PRHEX2 JR SAVE1 SAVE4: CALL MSGS DB ':00000001FF', CR, LF, 0 RET SAVEFIN: ;;;;;;;;;;;;;;;; ; D [hex][, hex] ;;;;;;;;;;;;;;;; CPI 'D' JRNZ DUMPFIN CALL HEXIN DCR C ; if no START, use saved adrs JP DUMP1 LHLD DUMPR DUMP1: CPI CR JRZ DUMP2 CALL CHKCM ; check , PUSH H CALL HEXIN POP D CALL CHKCR ; check CR DSBC D INX H XCHG DCR C ; if no END, set 1 page size JP DUMP3 DUMP2: MOV A, L ; if no END, set 1 page size ANI 0FH CMA MOV E, A MVI D, 0 INX D DUMP3: CALL CRLF PUSH H MOV A, L ; show ADRS ANI 0F0H MOV L, A CALL PRHEX4 POP H CALL PCOL MOV A, L ANI 0FH JRZ DUMP5 MOV B, A ; odd start ? DUMP4: CALL MSGS DB ' ', 0 DJNZ DUMP4 DUMP5: CALL PSP MOV A, M ; show DATA INX H CALL PRHEX2 DCX D MOV A, D ; end ? ORA E JRZ DUMP6 MOV A, L ANI 0FH JRNZ DUMP5 JR DUMP3 DUMP6: SHLD DUMPR ; save ADRS RET DUMPFIN: ;;;;;;;;;;;;;;;; ; I [hex] ;;;;;;;;;;;;;;;; CPI 'I' JRNZ INFIN CALL HEXIN CALL CHKCR ; check CR MOV A, C ; if no ADRS, use saved adrs ORA A JRNZ IN1 LHLD INPUR IN1: SHLD INPUR CALL CRLF CALL PRHEX4 ; show adrs CALL MSGS DB ' = ', 0 MOV C, L MOV B, H INP A JMP PRHEX2 ; show data INFIN: ;;;;;;;;;;;;;;;; ; O hex,hex[,hex]... ;;;;;;;;;;;;;;;; CPI 'O' JRNZ OUTFIN CALL HEXIN ; adrs to BC DCR C ; no ADRS JM ERROR CALL CHKCM ; check , MOV C, L MOV B, H OUT0: PUSH BC CALL HEXIN ; data to L DCR C ; no DATA JM ERROR POP BC CPI CR JZ OUT1 CALL CHKCM ; check , OUT1: OUTP L CPI ',' JRZ OUT0 RET OUTFIN: ;;;;;;;;;;;;;;;; ; F hex, hex, hex ;;;;;;;;;;;;;;;; CPI 'F' JRNZ FILLFIN CALL HEXIN ; start DCR C ; no ADRS JM ERROR CALL CHKCM ; check , PUSH H CALL HEXIN ; end DCR C ; no ADRS JM ERROR POP D CALL CHKCM ; check , DSBC D INX H PUSH H CALL HEXIN ; data DCR C ; no DATA JM ERROR POP B CALL CHKCR ; check CR XCHG FILL1: MOV M, E INX H DCX B MOV A, C ORA B JRNZ FILL1 RET FILLFIN: ;;;;;;;;;;;;;;;; ; C hex, hex, hex ;;;;;;;;;;;;;;;; CPI 'C' JRNZ COPYFIN CALL HEXIN ; start DCR C ; no ADRS JM ERROR CALL CHKCM ; check , PUSH H CALL HEXIN ; end DCR C ; no ADRS JM ERROR POP D CALL CHKCM ; check , DSBC D INX H PUSH H CALL HEXIN ; to DCR C ; no ADRS JM ERROR POP B CALL CHKCR ; check CR XCHG LDIR RET COPYFIN: ;;;;;;;;;;;;;;;; ; Z [hex] [,[hex]] ;;;;;;;;;;;;;;;; CPI 'Z' JNZ DISFIN CALL HEXIN DCR C ; if no adrs, use saved adrs JP DIS1 LHLD DISR DIS1: XCHG CPI CR JZ DIS2 CALL CHKCM ; check , PUSH D CALL HEXIN POP D CALL CHKCR ; check CR DCR C JP DIS3 DIS2: LXI H, 0FH DAD D DIS3: PUSH H ; from DE to HL ORA A DSBC D POP H RC PUSH H CALL DISASM POP H JR DIS3 DISFIN: ;;;;;;;;;;;;;;;; ; H ;;;;;;;;;;;;;;;; CPI 'H' JNZ HELPFIN CALL RST2 CALL CHKCR ; check CR HELP: CALL MSGS DB CR, LF, 'Monitor ', 0 LXI H, START+27 MVI B, 5 HELP0: MOV A, M INX H CALL PRHEX2 DJNZ HELP0 CALL MSGS DB CR, LF, 'G [start] : GO' DB CR, LF, 'R : REG' DB CR, LF, 'D [begin] [,end] : DUMP' DB CR, LF, 'E [begin] : EDIT' DB CR, LF, 'C begin, end, to : COPY' DB CR, LF, 'F begin, end, data: FILL' DB CR, LF, 'I [port] : IN' DB CR, LF, 'O port, data, ... : OUT' DB CR, LF, 'Z [begin] [,end] : DISASM' DB CR, LF, '(Intel-HEX) : LOAD' DB CR, LF, 'S begin, end : SAVE' DB CR, LF, 'H : HELP' DB 0 RET HELPFIN: ;;;;;;;;;;;;;;;; ; else ;;;;;;;;;;;;;;;; JMP ERROR ;;;;;;;;;;;;;;;; ; input & to upper case ;;;;;;;;;;;;;;;; INPUT: CALL RST2 CPI 'a' RC CPI 'z'+1 RNC SUI 20H RET ;;;;;;;;;;;;;;;; ; message ;;;;;;;;;;;;;;;; MSGS: XTHL CALL MSG XTHL RET ;;;;;;;;;;;;;;;; ; PRINT (HL)... ;;;;;;;;;;;;;;;; MSG: MOV A, M INX H ORA A RZ CALL RST3 JR MSG ;;;;;;;;;;;;;;;; ; PRINT CR LF ;;;;;;;;;;;;;;;; CRLF: MVI A, CR CALL RST3 MVI A, LF CALL RST3 CALL RST1 ; break ? RZ CALL RST2 CPI 3 RNZ JMP ERROR ;;;;;;;;;;;;;;;; ; PRINT : ;;;;;;;;;;;;;;;; PCOL: MVI A, ':' JMP RST3 ;;;;;;;;;;;;;;;; ; PRINT - ;;;;;;;;;;;;;;;; PMINS: MVI A, '-' JMP RST3 ;;;;;;;;;;;;;;;; ; PRINT HEX, 4 digit from HL ;;;;;;;;;;;;;;;; PRHEX4: MOV A, H CALL PRHEX2 MOV A, L ;;;;;;;;;;;;;;;; ; PRINT HEX, 2 digit from A ;;;;;;;;;;;;;;;; PRHEX2: PUSH PSW RRC RRC RRC RRC CALL PRHEX POP PSW ;;;;;;;;;;;;;;;; ; PRINT HEX, 1 digit from A ;;;;;;;;;;;;;;;; PRHEX: ANI 0FH ADI '0' CPI '9'+1 JRC PRH1 ADI 7 PRH1: JMP RST3 ;;;;;;;;;;;;;;;; ; HEX to HL, char to A, flag to C ;;;;;;;;;;;;;;;; HEXIN: LXI H, 0 MOV C, L H0: CALL INPUT CPI CR JZ PRH1 CPI ',' JZ PRH1 CPI '0' JRC H0 CPI '9'+1 JRC H1 CPI 'A' JRC H0 CPI 'F'+1 JRNC H0 CALL RST3 SUI 7 JR H2 H1: CALL RST3 H2: SUI '0' INR C DAD H DAD H DAD H DAD H ADD L MOV L, A JR H0 ;;;;;;;;;;;;;;;; ; HEX to A, 2 digit, no-echo ;;;;;;;;;;;;;;;; HEXIN2: CALL HEXIN1 RC ADD A ADD A ADD A ADD A MOV E, A CALL HEXIN1 RC ADD E RET ;;;;;;;;;;;;;;;; ; HEX to A, 1 digit, no-echo ;;;;;;;;;;;;;;;; HEXIN1: CALL INPUT CPI '0' RC CPI '9'+1 JRC HI1 CPI 'A' RC CPI 'F'+1 CMC RC SUI 7 HI1: SUI '0' RET ;;;;;;;;;;;;;;;; ; DISASM (DE) ;;;;;;;;;;;;;;;; DISASM: CALL CRLF XCHG SHLD DISR LXIX DISBUF CALL PRHEX4 MVI A, ':' CALL RST3 XCHG CALL DISSUB LDAX D ; op-code MOV C, A INX D MOV A, M ; not found ORA A JRNZ D0 DERR: XRA A STA DISX LXIX DISBUF LHLD DISR XCHG LXI H, MDB D0: MVI A, TAB D1: STX A, 0 INXIX D2: MOV A, M INX H ORA A JRZ D3 CPI ' ' ; space -> TAB JRZ D0 CPI 'i' JRC D1 EXX SUI 'i' ADD A MOV C, A MVI B, 0 LXI H, JPT DAD B MOV E, M INX H MOV D, M LXI H, D2 PUSH H PUSH D EXX RET D3: LDA DISX MOV B, A LDA DISF CMP B JNZ DERR MVIX 0, 0 LHLD DISR PUSH H XCHG ORA A DSBC D POP D MOV B, L MVI C, 4 D4: CALL PSP LDAX D INX D CALL PRHEX2 DCR C DJNZ D4 SDED DISR MOV A, C ADD A ADD C INR A MOV B, A MVI A, ' ' D5: CALL RST3 DJNZ D5 LXI H, DISBUF JMP MSG MDB: DB 'DB n', 0 JPT: DW REGX ; i -> HL/IX/IY DW COND8 ; j -> NZ/Z/NC/C/PO/PE/P/M DW COND4 ; k -> NZ/Z/NC/C DW RELB ; l -> relative DW BYTE2 ; m -> word DW BYTE1 ; n -> byte DW RSTX ; o -> RST DW REGA ; p -> BC/DE/HL/AF, (IX/IY) DW REGS ; q -> BC/DE/HL/SP, (IX/IY) DW REGH ; r -> B/C/D/E/H/L/(HL)/A, (IX/IY+d) DW REGL ; s -> B/C/D/E/H/L/(HL)/A, (IX/IY+d) DW BITN ; t -> 0-7 ;;;;;;;;;;;;;;;; ; PUT HEX, 4 digit from HL ;;;;;;;;;;;;;;;; IXHEX4: MOV A, H CALL IXHEX2 MOV A, L ;;;;;;;;;;;;;;;; ; PUT HEX, 2 digit from A ;;;;;;;;;;;;;;;; IXHEX2: PUSH PSW RRC RRC RRC RRC CALL IXHEX POP PSW ;;;;;;;;;;;;;;;; ; PUT HEX, 1 digit from A ;;;;;;;;;;;;;;;; IXHEX: ANI 0FH ADI '0' CPI '9'+1 JRC IXH1 ADI 7 IXH1: STX A, 0 INXIX RET ;;;;;;;;;;;;;;;; ; PUT message ;;;;;;;;;;;;;;;; IXMSGS: XTHL CALL IXMSG XTHL RET ;;;;;;;;;;;;;;;; ; PUT (HL)... ;;;;;;;;;;;;;;;; IXMSG: MOV A, M INX H ORA A RZ STX A, 0 INXIX JR IXMSG ; j = NZ/Z/NC/C/PO/PE/P/M COND8: MOV A, C ANI 38H JR COND1 ; k = NZ/Z/NC/C COND4: MOV A, C ANI 18H COND1: RRC RRC MOV C, A MVI B, 0 PUSH H LXI H, MCC DAD B MOV A, M STX A, 0 INXIX INX H MOV A, M POP H ORA A RZ STX A, 0 INXIX RET MCC: DB 'NZ', 'Z', 0 DB 'NC', 'C', 0 DB 'PO', 'PE' DB 'P', 0, 'M', 0 ; l = 1Byte-rel RELB: LDAX D INX D PUSH H MOV L, A ADD A SBB A MOV H, A DAD D CALL IXHEX4 POP H RET ; m = 2Byte BYTE2: PUSH H XCHG MOV E, M INX H MOV D, M INX H XCHG CALL IXHEX4 POP H RET ; n = 1Byte BYTE1: LDAX D INX D JMP IXHEX2 ; o = RST RSTX: MOV A, C ANI 38H CALL IXHEX2 MVIX 'H', 0 INXIX RET ; p = BC/DE/HL/AF REGA: MOV A, C RRC RRC RRC ANI 6 CPI 4 JRNC REG8 REG7: ADI 'B' ; BC/DE STX A, 0 INXIX INR A STX A, 0 INXIX RET REG8: JRZ REGX CALL IXMSGS ; AF DB 'AF', 0 RET ; HL/IX/IY REGX: LDA DISX ORA A JRNZ REGE CALL IXMSGS ; HL DB 'HL', 0 RET REGE: STA DISF MVIX 'I', 0 ; IX/IY INXIX SUI 0EDH SBB A ADI 'Y' STX A, 0 INXIX RET ; q = BC/DE/HL/SP REGS: MOV A, C RRC RRC RRC ANI 6 CPI 4 JRC REG7 ; BC/DE JRZ REGX ; HL/IX/IY CALL IXMSGS ; SP DB 'SP', 0 RET ; r = B/C/D/E/H/L/(HL)/A REGH: MOV A, C RRC RRC RRC JR REG10 ; r = B/C/D/E/H/L/(HL)/A REGL: MOV A, C REG10: ANI 7 CPI 4 JRNC REG11 ADI 'B' ; B/C/D/E STX A, 0 INXIX RET REG11: JRNZ REG12 MVIX 'H', 0 ; H INXIX RET REG12: CPI 6 JRNC REG13 MVIX 'L', 0 ; L INXIX RET REG13: JRZ REG14 MVIX 'A', 0 ; A INXIX RET REG14: LDA DISX ORA A JRNZ REG15 CALL IXMSGS ; (HL) DB '(HL)', 0 RET REG15: STA DISF MVIX '(', 0 ; (IX/IY+d) INXIX CALL REGE LDA DISB ; DD/FD CB d op? ORA A JRNZ REG16 LDAX D INX D STA DISD REG16: EXX MVIX '+', 0 LDA DISD ORA A JP REG17 NEG MVIX '-', 0 REG17: INXIX MVI B, 0 REG18: MVI C, -1 REG19: INR C SUI 10 JRNC REG19 ADI '0'+10 PUSH PSW INR B MOV A, C ORA A JRNZ REG18 REG20: POP PSW STX A, 0 INXIX DJNZ REG20 EXX MVIX ')', 0 INXIX RET ; 0-7 BITN: MOV A, C RRC RRC RRC ANI 7 ADI '0' STX A, 0 INXIX RET ;;;;;;;;;;;;;;;; ; DE = target adrs ; HL <- string ;;;;;;;;;;;;;;;; DISSUB: XRA A STA DISF STA DISX STA DISB LXI H, OPTBL LDAX D CPI 0CBH JRZ DISCB CPI 0DDH JRZ DISDD CPI 0FDH JRNZ DIS11 DISDD: STA DISX ; DD/FD INX D LDAX D CPI 0CBH JRNZ DISL INX D ; DD/FD CB d LDAX D STA DISD MVI A, 0CBH DISCB: STA DISB ; (DD/FD) CB INX D LXI H, CBTBL JR DISL DIS11: CPI 0EDH JRNZ DISL INX D ; ED xx LXI H, EDTBL DISL: LDAX D ANA M INX H NEXT: CMP M INX H RZ ; found PUSH PSW XRA A N1: CMP M ; skip string INX H JRNZ N1 MOV A, M ORA A JRZ MASK POP PSW JR NEXT MASK: POP PSW INX H MOV A, M ORA A RZ ; not found JR DISL OPTBL: DB 0FFH DB 000H, 'NOP', 0 DB 007H, 'RLCA', 0 DB 008H, 'EX AF,AF''', 0 DB 00FH, 'RRCA', 0 DB 010H, 'DJNZ l', 0 DB 017H, 'RLA', 0 DB 018H, 'JR l', CR, LF, 0 DB 01FH, 'RRA', 0 DB 022H, 'LD (m),i', 0 DB 027H, 'DAA', 0 DB 02AH, 'LD i,(m)', 0 DB 02FH, 'CPL', 0 DB 032H, 'LD (m),A', 0 DB 037H, 'SCF', 0 DB 03AH, 'LD A,(m)', 0 DB 03FH, 'CCF', 0 DB 076H, 'HALT', CR, LF, 0 DB 0C3H, 'JP m', CR, LF, 0 DB 0C6H, 'ADD A,n', 0 DB 0C9H, 'RET', CR, LF, 0 DB 0CDH, 'CALL m', 0 DB 0CEH, 'ADC A,n', 0 DB 0D3H, 'OUT n,A', 0 DB 0D6H, 'SUB n', 0 DB 0D9H, 'EXX', 0 DB 0DBH, 'IN A,n', 0 DB 0DEH, 'SBC A,n', 0 DB 0E3H, 'EX (SP),i', 0 DB 0E6H, 'AND n', 0 DB 0E9H, 'JP (i)', CR, LF, 0 DB 0EBH, 'EX DE,HL', 0 DB 0EEH, 'XOR n', 0 DB 0F3H, 'DI', 0 DB 0F6H, 'OR n', 0 DB 0F9H, 'LD SP,i', 0 DB 0FBH, 'EI', 0 DB 0FEH, 'CP n', 0 DB 0, 0F8H DB 080H, 'ADD A,s', 0 DB 088H, 'ADC A,s', 0 DB 090H, 'SUB s', 0 DB 098H, 'SBC A,s', 0 DB 0A0H, 'AND s', 0 DB 0A8H, 'XOR s', 0 DB 0B0H, 'OR s', 0 DB 0B8H, 'CP s', 0 DB 0, 0EFH DB 002H, 'LD (q),A', 0 DB 00AH, 'LD A,(q)', 0 DB 0, 0E7H DB 020H, 'JR k,l', 0 DB 0, 0CFH DB 001H, 'LD q,m', 0 DB 003H, 'INC q', 0 DB 009H, 'ADD i,q', 0 DB 00BH, 'DEC q', 0 DB 0C1H, 'POP p', 0 DB 0C5H, 'PUSH p', 0 DB 0, 0C7H DB 004H, 'INC r', 0 DB 005H, 'DEC r', 0 DB 006H, 'LD r,n', 0 DB 0C0H, 'RET j', 0 DB 0C2H, 'JP j,m', 0 DB 0C4H, 'CALL j,m', 0 DB 0C7H, 'RST o', 0 DB 0, 0C0H DB 040H, 'LD r,s', 0 DB 0, 0 CBTBL: DB 0F8H DB 000H, 'RLC s', 0 DB 008H, 'RRC s', 0 DB 010H, 'RL s', 0 DB 018H, 'RR s', 0 DB 020H, 'SLA s', 0 DB 028H, 'SRA s', 0 DB 038H, 'SRL s', 0 DB 0, 0C0H DB 040H, 'BIT t,s', 0 DB 080H, 'RES t,s', 0 DB 0C0H, 'SET t,s', 0 DB 0, 0 EDTBL: DB 0FFH DB 044H, 'NEG', 0 DB 045H, 'RETN', CR, LF, 0 DB 046H, 'IM 0', 0 DB 047H, 'LD I,A', 0 DB 04DH, 'RETI', CR, LF, 0 DB 04FH, 'LD R,A', 0 DB 056H, 'IM 1', 0 DB 057H, 'LD A,I', 0 DB 05EH, 'IM 2', 0 DB 05FH, 'LD A,R', 0 DB 067H, 'RRD', 0 DB 06FH, 'RLD', 0 DB 0A0H, 'LDI', 0 DB 0A1H, 'CPI', 0 DB 0A2H, 'INI', 0 DB 0A3H, 'OUTI', 0 DB 0A8H, 'LDD', 0 DB 0A9H, 'CPD', 0 DB 0AAH, 'IND', 0 DB 0ABH, 'OUTD', 0 DB 0B0H, 'LDIR', 0 DB 0B1H, 'CPIR', 0 DB 0B2H, 'INIR', 0 DB 0B3H, 'OTIR', 0 DB 0B8H, 'LDDR', 0 DB 0B9H, 'CPDR', 0 DB 0BAH, 'INDR', 0 DB 0BBH, 'OTDR', 0 DB 0, 0CFH DB 042H, 'SBC HL,q', 0 DB 043H, 'LD (m),q', 0 DB 04AH, 'ADC HL,q', 0 DB 04BH, 'LD q,(m)', 0 DB 0, 0C7H DB 040H, 'IN r,(C)', 0 DB 041H, 'OUT (C),r', 0 DB 0, 0 END