; ; TDL BASED Z80 DISASSEMBLER ; BASED ON A Z80-ZAP DISASSEMBLER FROM ; DDJ, MAY, 1979 BY B.W. LEE ; ADAPTED FOR CPM BY TIM BURKE ; SEPTEMBER, 1979. ; .TITLE "Z80 DISASSEMBLER" .SBTTL "TIM BURKE, SEPT., 1979" .LADDR .LALL .PABS ; ; SYSTEM EQUATES ; MSIZE = 47 ;56K-DRIVERS(4K)-I/O(1K) ; MSIZE WAS 56 FOR TIMS VERSION BIASC = (MSIZE-16)*1024 PRSIZE = PREND-PRBEG LOCATE = 3100H+BIASC-PRSIZE PRLOC = 9000H SYCOUN = 900 ;NUMBER OF SYMBOLS SYMNUM = SYCOUN*7 ; ; BDOSV = 5 ;DOS ENTRY WBOOTV = 0 ;WARM BOOT WTFN = 9 ;CONSOLE BUFF. WRITE RDFN = 10 ;BUFF. READ COFN = 2 ;CONSOLE CHAR. WRITE FCB = 5CH ;READ FCB ADD. OPENF = 15 ;FILE OPEN BUFF = 80H ;READ BUFF. ADD. READF = 20 ;READ SECTOR LOGIN = 14 ;LOG IN DISK SEARCH = 17 ;SEARCH FOR FILE DELETE = 19 ;ERASE FILE MAKEF = 22 ;CREATE FILE SDMA = 26 ;SET DMA ADD. DWRIT = 21 ;WRITE SECTOR CLSFN = 16 ;CLOSE FILE CR = 0DH LF = 0AH TAB = 'I'-40H TRUE = 0FFH FALSE = 0 ; ; .LOC PRLOC ; ; PRBEG: LXI SP,STKTOP LHLD BDOSV+1 SHLD BDOS+1 LHLD WBOOTV+1 SHLD WBOOT+1 XRA A STA CBYTE STA KBYTE STA FCBW+32 STA FCBW+12 JMPR ENTRE BDOS: JMP BDOSV WBOOT: JMP WBOOTV ENTRE: LXI D,HERALD MVI C,WTFN CALL BDOS EXPR: LXI SP,STKTOP LXI D,ENMES MVI C,WTFN CALL BDOS LXI D,RDBUF MVI C,RDFN CALL BDOS LDA RDCNT CPI 0 JRZ EXPR LXI H,COMAND LDA RDCNT MOV B,A UCON1: MOV A,M CPI 91 JM UCON2 SUI 32 UCON2: MOV M,A INX H DJNZ UCON1 LXI X,COMAND POINT: MOV A,0(X) INX X CPI ' ' JRNZ TST1 LDA RDCNT DCR A STA RDCNT JMPR POINT TST1: CPI 'D' JRNZ TST2 JMP DISASM TST2: CPI 'H' JRNZ TST3 JMP HEXMAT TST3: CPI 'R' JRNZ TST4 JMP RDFILE TST4: CPI 'O' JRNZ TST5 JMP OPTION TST5: CPI 'M' JRNZ TST6 JMP MOVEM TST6: CPI 'Q' JRNZ TST7 CALL CRLF LXI D,FINMES MVI C,WTFN CALL BDOS LHLD SYMBC CALL LADR CALL CRLF JMP WBOOT TST7: CPI 'S' JRNZ TST8 JMP SHOW TST8: CPI 'T' JNZ TST9 JMP TYPEIT TST9: CPI 'C' JNZ EXPR LDA FCBW+32 ORA A JRNZ VERDI LDA FCBW+12 ORA A JZ EXPR VERDI: XRA A STA TABC LXI H,ESFSG MVI B,ESFSL AFTERA: MOV C,M CALL PO INX H DJNZ AFTERA JMP CDKF ; ; HEXMAT: CALL CRLF CALL CRLF CALL PARAM LHLD BIAS LDED RELO PUSH H DAD D CALL LADR MVI C,' ' CALL CO POP H ORA A DSBC D CALL LADR CALL CRLF JMP EXPR ; ; TYPEIT: CALL CRLF CALL PARAM LHLD BIAS LDED RELO ..T0D: CALL LFADR MVI B,16 ..T1D: MOV A,M ANI 7FH CPI ' ' JRNC ..T3D ..T2D: MVI A,'.' ..T3D: CPI 07CH JRNC ..T2D MOV C,A CALL CO CALL HILOX DJNZ ..T1D JMPR ..T0D MOVEM: CALL CRLF CALL PARAM LHLD BIAS LDED RELO LBCD OFFST ..M: MOV A,M STAX B INX B CALL HILOX JMPR ..M HILOX: CALL HILO RNC JMP EXPR HILO: INX H MOV A,H ORA L STC RZ MOV A,E SUB L MOV A,D SBB H RET ; ; SHOW: CALL CRLF CALL PARAM LHLD BIAS LDED RELO ..D0: CALL LFADR ..D1: CALL BLK MOV A,M CALL LBYTE CALL HILOX MOV A,L ANI 0FH JRNZ ..D1 JMPR ..D0 ; ; RDFILE: LXI Y,FCB CALL BLANK LXI Y,FCB CALL FORMIT CALL CRLF LXI B,3 LXI H,COMEX LXI D,FCB+9 LDIR LXI D,FCB MVI C,OPENF CALL BDOS CPI 255 JRNZ OPNOK CALL CRLF LXI D,OPNM MVI C,WTFN CALL BDOS JMP EXPR OPNOK: XRA A STA FCB+32 LXI D,100H LOOP: LXI H,BUFF CALL DISKR MVI B,128 CONTE: MOV A,M XCHG MOV M,A XCHG INX H INX D DJNZ CONTE JMPR LOOP DISKR: PUSH H PUSH D PUSH B LXI D,FCB MVI C,READF CALL BDOS POP B POP D POP H CPI 0 RZ CPI 1 JZ FINAL CALL CRLF LXI D,RDERRM MVI C,WTFN CALL BDOS JMP EXPR FINAL: CALL CRLF LXI D,MESA3 MVI C,WTFN CALL BDOS LDA FCB+12 MOV H,A LDA FCB+32 MOV L,A CALL LADR MVI B,7 SHIT: SLAR L RALR H DJNZ SHIT LXI B,100H DAD B PUSH H CALL CRLF LXI D,MESA4 MVI C,WTFN CALL BDOS POP H CALL LADR JMP EXPR ; ; OPTION: CALL CRLF CALL CRLF XRA A STA CBYTE STA KBYTE MOV D,A MOV E,A LDA RDCNT DCR A JZ EXPR PUSH D LXI D,OPTMES MVI C,WTFN CALL BDOS POP D LDA RDCNT MOV H,A LOPIT: MOV A,0(X) MOV C,A INX X DCR H JRZ NOWPT CPI 'A' JRNZ TMT1 SET 0,D CALL CO JMPR LOPIT TMT1: CPI 'B' JRNZ TMT2 SET 1,D CALL CO JMPR LOPIT TMT2: CPI 'C' JRNZ TMT3 SET 2,D CALL CO JMPR LOPIT TMT3: CPI 'D' JRNZ TMT4 SET 3,D CALL CO JMPR LOPIT TMT4: CPI 'E' JRNZ TMT5 SET 4,D CALL CO JMPR LOPIT TMT5: CPI 'F' JRNZ TMT6 SET 5,D CALL CO JMPR LOPIT TMT6: CPI 'G' JRNZ TMT7 SET 6,D CALL CO JMPR LOPIT TMT7: CPI 'H' JRNZ TMT8 SET 7,D CALL CO JMPR LOPIT TMT8: CPI 'I' JRNZ TMT9 SET 0,E CALL CO JMPR LOPIT TMT9: CPI 'J' JRNZ TMT10 SET 1,E CALL CO JMPR LOPIT TMT10: CPI 'K' JRNZ LOPIT SET 2,E CALL CO JMP LOPIT NOWPT: CALL CRLF CALL CRLF MOV A,D STA CBYTE MOV A,E STA KBYTE JMP EXPR ; ; ; SUBROUTINES ; CRLF: MVI C,CR CALL CO MVI C,LF CALL CO RET LFADR: CALL CRLF HLSP: CALL LADR BLK: MVI C,' ' CO: PUSH B PUSH H PUSH D MVI D,0 MOV E,C MVI C,COFN CALL BDOS POP D POP H POP B MOV A,C RET PARAM: LXI H,0 SHLD BIAS SHLD RELO SHLD OFFST LDA RDCNT DCR A RZ MOV C,A DREN: MOV A,0(X) CPI ' ' JRNZ BRA2 DCR C INX X RZ JMPR DREN BRA2: CALL CONVER JRC ..EX1 DAD H DAD H DAD H DAD H ORA L MOV L,A DCR C JRNZ BRA2 SHLD BIAS RET ..EX1: SHLD BIAS MOV A,B CPI ' ' JRZ CONT CPI ',' JRZ CONT JMP EXPR CONT: LXI H,0 DCR C RZ BRA1: CALL CONVER JRC ..EX2 DAD H DAD H DAD H DAD H ORA L MOV L,A DCR C JRNZ BRA1 SHLD RELO RET ..EX2: SHLD RELO MOV A,B CPI ' ' JRZ CONT1 CPI ',' JRZ CONT1 JMP EXPR CONT1: LXI H,0 DCR C RZ BRA3: CALL CONVER JC EXPR DAD H DAD H DAD H DAD H ORA L MOV L,A DCR C JRNZ BRA3 SHLD OFFST RET CONVER: MOV A,0(X) INX X MOV B,A CONV: SUI '0' RC CPI 'G'-'0' CMC RC CPI 10 CMC RNC SUI 'A'-'9'-1 CPI 0AH RET LADR: MOV A,H CALL LBYTE MOV A,L LBYTE: PUSH PSW RRC RRC RRC RRC CALL ..2 POP PSW ..2: CALL ZONV JMP CO ZONV: ANI 0FH ADI 90H DAA ACI 40H DAA MOV C,A RET BLANK: MVI A,1 MOV 0(Y),A MVI B,11 MVI A,' ' LPAGE: INX Y MOV 0(Y),A DCR B JRNZ LPAGE XRA A MVI B,21 OVAGP: INX Y MOV 0(Y),A DCR B JRNZ OVAGP RET FORMIT: LDA RDCNT DCR A JZ EXPR MOV C,A ALTOS: MOV A,0(X) CPI ' ' JRNZ NITS DCR C INX X JZ EXPR JMPR ALTOS NITS: MOV A,1(X) CPI ':' JRZ FOUND1 JMPR FORT2 FOUND1: MOV A,0(X) INX X INX X DCR C DCR C SUI 64 MOV 0(Y),A FORT2: INX Y MOV A,0(X) CPI '.' RZ MOV 0(Y),A INX X DCR C JRNZ FORT2 RET TOM1: MOV C,M INX H CALL CO DJNZ TOM1 RET RSDF: LXI D,OFCMD MVI C,WTFN CALL BDOS LXI D,RDBUF MVI C,RDFN CALL BDOS LDA RDCNT CPI 0 JRZ RSDF LXI H,COMAND LDA RDCNT MOV B,A ACON1: MOV A,M CPI 91 JM ACON2 SUI 32 ACON2: MOV M,A INX H DCR B JRNZ ACON1 LXI X,COMAND POINTA: MOV A,0(X) INX X CPI ' ' JRNZ OKNDT LDA RDCNT DCR A STA RDCNT JMPR POINTA OKNDT: LXI Y,FCBW LDA RDCNT INR A STA RDCNT DCX X CALL BLANK LXI Y,FCBW CALL FORMIT LXI B,3 LXI H,TDLT LXI D,FCBW+9 LDIR LDA FCBW DCR A MVI D,0 MOV E,A MVI C,LOGIN CALL BDOS LXI D,FCBW MVI C,SEARCH CALL BDOS CPI 255 JRZ MAKE LXI D,FCBW MVI C,DELETE CALL BDOS MAKE: LXI D,FCBW MVI C,MAKEF CALL BDOS CPI 255 JRNZ OPEN CALL CRLF LXI D,DIREM MVI C,WTFN CALL BDOS OPEN: LXI D,FCBW MVI C,OPENF CALL BDOS CPI 255 JRNZ OOKK CALL CRLF LXI D,OPNM MVI C,WTFN CALL BDOS JMP EXPR OOKK: XRA A STA FCBW+32 STA WTPTR RET PEOL: MVI C,CR CALL PO MVI C,LF PO: PUSH X LXI X,FCBW CALL WDSKF POP X RET WDSKF: PUSH H PUSH D PUSH B LDA WTPTR CPI 80H JRNZ WTBYT CALL DISKWR XRA A WTBYT: MOV E,A MVI D,0 INR A STA WTPTR LXI H,WTBUF DAD D MOV M,C POP B POP D POP H MOV A,C RET DISKWR: PUSH B LXI D,WTBUF MVI C,SDMA CALL BDOS PUSH X POP D MVI C,DWRIT CALL BDOS PUSH PSW LXI D,BUFF MVI C,SDMA CALL BDOS POP PSW CPI 0 JRZ BNC2 CALL CRLF LXI D,WEMS1 MVI C,WTFN CALL BDOS POP H POP H POP H POP H CALL LADR CALL CRLF JMP ABTRR BNC2: POP B RET CONSTA: PUSH H PUSH D PUSH B MVI C,11 CALL BDOS ANI 1 JRNZ TRUX XRA A JMPR EXST1 TRUX: MVI A,TRUE EXST1: POP B POP D POP H RET CI: PUSH H PUSH D PUSH B MVI C,1 CALL BDOS ANI 7FH POP B POP D POP H RET CDKF: MVI C,'Z'-40H CALL PO LXI X,FCBW CALL DISKWR ABTRR: LXI D,FCBW MVI C,CLSFN CALL BDOS CPI 255 JNZ EXPR CALL CRLF LXI D,CLEER MVI C,WTFN CALL BDOS CALL CRLF JMP EXPR ; ; MAIN PROGRAM ; DISASM: CALL CRLF CALL PARAM LHLD BIAS LDED RELO SHLD BBUF SDED EBUF LXI H,SGNMG MVI B,SNMGL CALL TOM1 .RADIX 16 BEGIN: LDA CBYTE ANI 2 JRNZ APNFL NEWFL: LDA CBYTE ANI 04 JRZ KSFIN XRA A STA SYMTB LXI H,0 SHLD SYMBC LXI H,SYMNUM SHLD SYMBC1 KSFIN: LDA CBYTE ANI 80 JRZ START CALL RSDF CALL PEOL START: LHLD BBUF DISAM: CALL LINE CALL ENDCK JMPR DISAM APNFL: LDA KBYTE ANI 01 JRNZ KSFIN JMPR START LINE: LDA KBYTE ANI 04 CZ LADR MVI A,0FC STA TABC MVI A,TAB CALL TYPE MOV B,H MOV C,L LDA CBYTE ANI 01 CNZ PRTLB JRNC ..A0 MVI A,':' CALL ZTYPE ..A0: MVI A,TAB CALL ZTYPE LDA CBYTE ANI 20 JNZ PRDB PUSH H MOV H,M LXI B,OTABM ; ; OPCODE TABLE LOOKUP ; ULP: LDAX B ORA A JZ SFRET ANA H MOV L,A INX B LDAX B CMP L JZ FOUND MOV A,C ADI 06 MOV C,A JRNC ULP INR B JMPR ULP ; FOUND: INX B LDAX B STA TYFLG PUSH D MOV E,A MVI D,00 LXI H,JMTBL DAD D DAD D MOV D,M INX H MOV H,M MOV L,D POP D XTHL RET ; TYPE0: CALL PROP IXHRT: INX H JMP RET ; TYPE1: CALL PROP T1B: CALL REG JMPR IXHRT ; TYPE2: CALL PROP CALL REGM JMPR IXHRT ; TYPE3: CALL PROP CALL XR JMPR IXHRT ; TYPE4: CALL PROP CALL REGM T4B: CALL COMMA JMPR T52 ; TYPE5: CALL PROP T52: INX H T53: MOV A,M CALL X00 T54: MVI A,'H' CALL ZTYPE MOV A,M INX H PUSH B MOV B,A LDA CBYTE ANI 10 MOV A,B POP B JZ RET CPI ' ' JC RET CPI 'Z'+1 JNC RET LDA TYFLG CPI 04 JC RET CPI 06 JNC RET MVI A,TAB CALL ZTYPE MVI A,';' CALL ZTYPE DCX H MOV A,M INX H QCHAR: PUSH PSW CALL OQ POP PSW MVI A,27 CALL ZTYPE JMP RET ; TYPE6: CALL PROP CALL XR T6B: CALL COMMA LDA CBYTE ANI 40 JRZ TYP6H PRT2X: CALL SYMBO JC RET TYP6H: INX H MOV B,M INX H MOV A,M CALL X00 MOV A,B CALL X0 JMPR T54 ; TYPREL: CALL PROP INX H MOV A,M CALL X21 JMP T54 ; TYPE7: CALL PROP CALL SYMBO JC RET LDA CBYTE ANI 08 JRZ TYP6H MVI A,'L' CALL ZTYPE INX H MOV B,M INX H MOV A,M CALL X00 MOV A,B CALL X0 JMP IXHRT ; TYPE8: INX B LDAX B STA CC1 CALL GETCC JMPR TYPE7 ; TYPE9: MVI A,'R' STA CC1 CALL GETCC JMP TYPE0 ; TYPEA: CALL PROP RAR RAR RAR ANI 07 ADI '0' CALL ZTYPE JMP IXHRT ; TYPEB: CALL PROP CALL REGM CALL COMMA MOV A,M JMP T1B ; TYPEC = TYPREL ; TYPED: INX B LDAX B STA CC1-1 INX B LDAX B STA CC1 MOV A,M ANI 0DF CALL GETC DCX B JMP TYPREL ; TYPEE: INX H PUSH H MOV H,M LXI B,OTABC ULP1: MVI A,21 ULP2: STA TYFLG JMP ULP ; TYPEF: INX H PUSH H MOV H,M LXI B,OTABE JMPR ULP1 ; TYP10: INX B PUSH B INX H PUSH H MOV H,M MVI A,0CB CMP H JZ TY10C LXI B,OTBIR MVI A,41 JMPR ULP2 ; TY10C: POP H INX H INX H PUSH H MOV H,M LXI B,OTBIC MVI A,43 JMPR ULP2 ; TYP11: CALL GRSCC JMP TYPE1 ; TYP12: CALL PROP CALL POTLM CALL COMMA MOV A,M JMP T1B ; TYP13: INX B LDAX B STA CC1 INX B INX B INX B LDAX B STA CCB CALL GETXR JMP TYPE7 ; TYP14: INX B LDAX B STA CC1 INX B LDAX B STA CC1+1 CALL GETBX JMP TYPE0 ; TYP15: MVI A,'O' CALL ZTYPE JMPR TYP14 ; TYP16: INX B LDAX B STA CC1 INX B LDAX B STA CC1+1 POP B MVI A,'I' STA CC1+2 INX B LDAX B STA CCB LXI B,CC1-1 JMP TYPE0 ; TYP17: CALL PROP POP B CALL PRIR JMP IXHRT ; TYP18: CALL PROP INX H MOV A,M CALL X00 POP B CALL PRIRP MVI A,04 STA TYFLG JMP T4B ; TYP19: CALL PROP POP B CALL PRIR JMP T6B ; TYP1A: INX B LDAX B STA CC1 INX B INX B INX B LDAX B STA CCB POP B MVI A,'I' STA CC1+1 INX B LDAX B STA CC1+2 LXI B,CC1-1 JMP TYPE7 ; TYP1B: CALL PROP INX H MOV A,M CALL X00 POP B CALL PRIRP DCX H CALL COMMA MOV A,M CALL REG IXHHR: INX H JMP IXHRT ; TYP1C: CALL PROP CALL REGM CALL COMMA INX H MOV A,M CALL X00 POP B CALL PRIRP JMP IXHRT ; TYP1D: CALL PROP CALL POTLM CALL COMMA TY1DB: DCX H MOV A,M CALL X00 POP B CALL PRIRP JMPR IXHHR ; TYP1E: CALL GRSCC CALL PROP JMPR TY1DB ; TYP1F: CALL PROP INX H MOV A,M CALL X00 POP B CALL PRIRP JMP IXHRT ; TYP20: INX B LDAX B STA CC1 INX B LDAX B STA CC1+1 POP B MVI A,'D' STA CC1+2 INX B LDAX B STA CCB LXI B,CC1-1 CALL PROP CALL TST20 MOV A,B CALL ZTYPE JMP IXHRT TST20: CPI 09 MVI B,'B' RZ CPI 19 MVI B,'D' RZ CPI 39 JRNZ ATST1 MVI A,'S' CALL ZTYPE MVI B,'P' RET ATST1: DCX H MOV A,M CPI 0DD JRNZ YTST1 MVI B,'X' INX H RET YTST1: INX H MVI B,'Y' RET ; SFRET: LDA TYFLG CPI 20 POP H JC PRDB CPI 40 JRC BKUPH POP B BKUPH: ANI 0F MOV B,A XRA A STA TYFLG BUHLP: DCX H DJNZ BUHLP JMP PRDB ; ; DISASSEMBLER SUBROUTINES ; COMMA: MVI A,',' JMP ZTYPE ; PRDB: PUSH H LXI H,BYTSG MVI B,BYSGL PRDB1: MOV A,M CALL ZTYPE INX H DJNZ PRDB1 MVI A,TAB CALL ZTYPE POP H LDA CBYTE ANI 30 CPI 30 JNZ T53 MOV A,M CPI ' ' JC T53 CPI 'Z'+1 JNC T53 INX H JMP QCHAR ; GETCC: MOV A,M GETC: RAR RAR ANI 0E PUSH H LXI H,CCTAB CALL ADD MOV A,M STA CC1+1 INX H MOV A,M STA CC1+2 POP H LXI B,CC1-1 MVI A,' ' STA CCB RET ; HEXL: RAR RAR RAR RAR HEXR: ANI 0F CPI 0A JC HEXRN ADI 07 HEXRN: ADI '0' RET ; X0: PUSH PSW CALL HEXL CALL ZTYPE POP PSW CALL HEXR JMP ZTYPE ; OQ: PUSH PSW MVI A,' ' CALL ZTYPE MVI A,27 CALL ZTYPE POP PSW JMP ZTYPE ; PROP: PUSH D MVI D,4 PROPL: INX B LDAX B CALL ZTYPE DCR D JRNZ PROPL MVI A,TAB CALL ZTYPE POP D MOV A,M RET ; XR: RAR RAR RAR ANI 06 CPI 06 JRNZ REG MOV A,M ORA A JM PRPSW PRTSP: MVI A,'S' CALL ZTYPE MVI A,'P' JMP ZTYPE PRPSW: MVI A,'P' CALL ZTYPE MVI A,'S' CALL ZTYPE MVI A,'W' JMP ZTYPE ; REGM: RAR RAR RAR ; REG: PUSH H LXI H,RTAB ANI 07 CALL ADD MOV A,M POP H JMP ZTYPE ; ADD: ADD L MOV L,A RNC INR H RET ; X21: PUSH H PUSH PSW DCX H MOV A,M CPI 10 JZ RELADD CPI 38 JZ RELADD CPI 18 JZ RELADD CPI 30 JZ RELADD CPI 20 JZ RELADD CPI 28 JZ RELADD X000: POP PSW POP H X00: CPI 0A0 JC X0 PUSH PSW MVI A,'0' CALL ZTYPE POP PSW JMP X0 RELADD: PUSH D MVI D,0 INX H MOV A,M INX H ORA A JM SUBIT MOV E,A DAD D SHLD TEMHL JMPR ZIPIT SUBIT: CMA ADI 01 MOV E,A SLAR D DSBC D SHLD TEMHL ZIPIT: LXI H,TEMHL-1 CALL SYMBO POP D JNC X000 POP PSW POP H SHLD TEMHL POP H LHLD TEMHL JMP IXHRT TEMHL: .WORD 0 ; RET: MVI A,CR ; ZTYPE: PUSH B MOV B,A LDA CBYTE RAL MOV A,B JRNC TYPEP DFOUT: MOV C,A CALL PO TYPEP: POP B TYPE: PUSH B CPI TAB JRZ TABX MOV C,A LDA KBYTE ANI 04 MOV A,C JRNZ FFFFD CALL CO FFFFD: MOV B,A LDA TABC DCR A STA TABC MOV A,B POP B CPI CR RNZ EOL: MVI A,LF JMPR ZTYPE TABX: PUSH PSW LDA TABC MOV B,A TABXL: MVI C,20 LDA KBYTE ANI 04 JRNZ AAAAF CALL CO AAAAF: MOV A,B ANI 07 MOV B,A DJNZ TABXL XRA A STA TABC POP PSW POP B RET ; SYMBO: LDA CBYTE ANI 05 RZ ANI 01 JRNZ FRMTB ; CALL SYBLD ORA A RET ; FRMTB: INX H MOV C,M INX H MOV B,M INX H CALL PRTLB RC DCX H DCX H DCX H ORA A RET PRTLB: CALL LOOKU CMC RNC MVI B,5 SYPLP: LDAX D INX D ORA A JRZ SYPEX CALL ZTYPE DJNZ SYPLP SYPEX: STC RET ; SYBLD: INX H MOV C,M INX H MOV B,M DCX H DCX H CALL LOOKU RNC MVI A,'L' STAX D INX D MOV A,B CALL SYSTX MOV A,C CALL SYSTX MOV A,B STAX D INX D MOV A,C STAX D XRA A INX D STAX D PUSH H LHLD SYMBC INX H SHLD SYMBC LHLD SYMBC1 DCX H MOV A,H ORA L JRNZ HITIT CALL CRLF MVI C,WTFN LXI D,TERRM CALL BDOS CALL CRLF JMP EXPR HITIT: SHLD SYMBC1 POP H STC RET ; SYSTX: PUSH PSW CALL HEXL STAX D INX D POP PSW CALL HEXR STAX D INX D RET ; LOOKU: LXI D,SYMTB LULP: LDAX D ORA A STC RZ INX D INX D INX D INX D INX D LDAX D CMP B INX D JRNZ LUNO LDAX D CMP C JRNZ LUNO DCX D DCX D DCX D DCX D DCX D DCX D ORA A RET LUNO: INX D JMPR LULP ; GRSCC: MOV A,M RAR ANI 1C PUSH H LXI H,RSTAB CALL ADD MOV A,M STA CC1 INX H MOV A,M STA CC1+1 INX H MOV A,M STA CC1+2 INX H MOV A,M STA CCB POP H LXI B,CC1-1 RET ; POTLM: RAR RAR RAR POTL: ANI 07 ADI 30 JMP ZTYPE ; GETXR: MOV A,M RAR RAR RAR ANI 06 CPI 06 JRNZ GETRP MVI A,'S' STA CC1+1 MVI A,'P' STA CC1+2 LXI B,CC1-1 RET ; GETRP: PUSH H LXI H,RTAB CALL ADD MOV A,M STA CC1+1 INX H MOV A,M STA CC1+2 JMPR GETEX ; GETBX: MOV A,M RAR RAR ANI 06 PUSH H LXI H,BXTAB CALL ADD MOV A,M STA CC1+2 INX H MOV A,M STA CCB GETEX: POP H LXI B,CC1-1 RET ; PRIR: INX B LDAX B CALL ZTYPE RET PRIRP: MVI A,'H' CALL ZTYPE PUSH D MVI D,03 DCX B PIRPL: INX B LDAX B CALL ZTYPE DCR D JRNZ PIRPL POP D RET ; ENDCK: LDA EBUF SUB L LDA EBUF+1 SBB H JRNC CKCTC END: LDA KBYTE ANI 02 JZ EXPR ENDSF: PUSH H XRA A STA TABC LXI H,ESFSG MVI B,ESFSL EDSFL: MOV A,M CALL ZTYPE INX H DJNZ EDSFL POP H JMP CDKF CKCTC: CALL CONSTA CPI TRUE RNZ CALL CI CPI 'K'-40 JZ EXPR CPI 'S'-40 RNZ CALL CI CPI 'K'-40 JZ EXPR RET ; ; TABLES ; JMTBL: .WORD TYPE0 .WORD TYPE1 .WORD TYPE2 .WORD TYPE3 .WORD TYPE4 .WORD TYPE5 .WORD TYPE6 .WORD TYPE7 .WORD TYPE8 .WORD TYPE9 .WORD TYPEA .WORD TYPEB .WORD TYPEC .WORD TYPED .WORD TYPEE .WORD TYPEF .WORD TYP10 .WORD TYP11 .WORD TYP12 .WORD TYP13 .WORD TYP14 .WORD TYP15 .WORD TYP16 .WORD TYP17 .WORD TYP18 .WORD TYP19 .WORD TYP1A .WORD TYP1B .WORD TYP1C .WORD TYP1D .WORD TYP1E .WORD TYP1F .WORD TYP20 .WORD PRDB ; CCTAB: .ASCII 'NZ' .ASCII 'Z ' .ASCII 'NC' .ASCII 'C ' .ASCII 'PO' .ASCII 'PE' .ASCII 'P ' .ASCII 'M ' ; RTAB: .ASCII 'BC' .ASCII 'DE' .ASCII 'HL' .ASCII 'MA' ; RSTAB: .ASCII 'RLCR' .ASCII 'RRCR' .ASCII 'RALR' .ASCII 'RARR' .ASCII 'SLAR' .ASCII 'SRAR' .ASCII 'UNDF' .ASCII 'SRLR' ; BXTAB: .ASCII 'I ' .ASCII 'D ' .ASCII 'IR' .ASCII 'DR' ; ; OPCODE TABLES ; OTABM: .BYTE 0FF .WORD 0000 .ASCII 'NOP ' .BYTE 0FF .WORD 0007 .ASCII 'RLC ' .BYTE 0FF .WORD 000F .ASCII 'RRC ' .BYTE 0FF .WORD 0017 .ASCII 'RAL ' .BYTE 0FF .WORD 00EB .ASCII 'XCHG' .BYTE 0FF .WORD 001F .ASCII 'RAR ' .BYTE 0FF .WORD 0722 .ASCII 'SHLD' .BYTE 0FF .WORD 0027 .ASCII 'DAA ' .BYTE 0FF .WORD 072A .ASCII 'LHLD' .BYTE 0FF .WORD 002F .ASCII 'CMA ' .BYTE 0FF .WORD 0732 .ASCII 'STA ' .BYTE 0FF .WORD 0037 .ASCII 'STC ' .BYTE 0FF .WORD 073A .ASCII 'LDA ' .BYTE 0FF .WORD 003F .ASCII 'CMC ' .BYTE 0FF .WORD 0076 .ASCII 'HLT ' .BYTE 0C0 .WORD 0B40 .ASCII 'MOV ' .BYTE 0FF .WORD 07C3 .ASCII 'JMP ' .BYTE 0FF .WORD 00C9 .ASCII 'RET ' .BYTE 0FF .WORD 07CD .ASCII 'CALL' .BYTE 0FF .WORD 05D3 .ASCII 'OUT ' .BYTE 0FF .WORD 05DB .ASCII 'IN ' .BYTE 0FF .WORD 00E3 .ASCII 'XTHL' .BYTE 0FF .WORD 00E9 .ASCII 'PCHL' .BYTE 0FF .WORD 00F3 .ASCII 'DI ' .BYTE 0FF .WORD 00FB .ASCII 'EI ' .BYTE 0FF .WORD 00F9 .ASCII 'SPHL' .BYTE 0FF .WORD 05C6 .ASCII 'ADI ' .BYTE 0FF .WORD 05CE .ASCII 'ACI ' .BYTE 0FF .WORD 05D6 .ASCII 'SUI ' .BYTE 0FF .WORD 05DE .ASCII 'SBI ' .BYTE 0FF .WORD 05E6 .ASCII 'ANI ' .BYTE 0FF .WORD 05EE .ASCII 'XRI ' .BYTE 0FF .WORD 05F6 .ASCII 'ORI ' .BYTE 0FF .WORD 05FE .ASCII 'CPI ' .BYTE 0FF .WORD 0008 .ASCII 'EXAF' .BYTE 0FF .WORD 0C10 .ASCII 'DJNZ' .BYTE 0FF .WORD 0C18 .ASCII 'JMPR' .BYTE 0FF .WORD 00D9 .ASCII 'EXX ' .BYTE 0FF .WORD 0ECB .ASCII '....' .BYTE 0FF .WORD 0FED .ASCII '....' .BYTE 0FF .WORD 10DD .ASCII '(X).' .BYTE 0FF .WORD 10FD .ASCII '(Y).' .BYTE 0E7 .WORD 0D20 .ASCII 'JR..' .BYTE 0F8 .WORD 0180 .ASCII 'ADD ' .BYTE 0F8 .WORD 0188 .ASCII 'ADC ' .BYTE 0F8 .WORD 0190 .ASCII 'SUB ' .BYTE 0F8 .WORD 0198 .ASCII 'SBB ' .BYTE 0F8 .WORD 01A0 .ASCII 'ANA ' .BYTE 0F8 .WORD 01A8 .ASCII 'XRA ' .BYTE 0F8 .WORD 01B0 .ASCII 'ORA ' .BYTE 0F8 .WORD 01B8 .ASCII 'CMP ' .BYTE 0C7 .WORD 0204 .ASCII 'INR ' .BYTE 0C7 .WORD 0205 .ASCII 'DCR ' .BYTE 0EF .WORD 0302 .ASCII 'STAX' .BYTE 0EF .WORD 030A .ASCII 'LDAX' .BYTE 0CF .WORD 03C1 .ASCII 'POP ' .BYTE 0CF .WORD 03C5 .ASCII 'PUSH' .BYTE 0C7 .WORD 0406 .ASCII 'MVI ' .BYTE 0CF .WORD 0303 .ASCII 'INX ' .BYTE 0CF .WORD 0309 .ASCII 'DAD ' .BYTE 0CF .WORD 030B .ASCII 'DCX ' .BYTE 0C7 .WORD 08C2 .ASCII 'J...' .BYTE 0C7 .WORD 08C4 .ASCII 'C...' .BYTE 0CF .WORD 0601 .ASCII 'LXI ' .BYTE 0C7 .WORD 09C0 .ASCII 'R...' .BYTE 0C7 .WORD 0AC7 .ASCII 'RST ' .BYTE 00 ; ; OTABC: .BYTE 0C0 .WORD 1100 .ASCII '....' .BYTE 0C0 .WORD 1240 .ASCII 'BIT ' .BYTE 0C0 .WORD 1280 .ASCII 'RES ' .BYTE 0C0 .WORD 12C0 .ASCII 'SET ' .BYTE 00 ; ; OTABE: .BYTE 0FF .WORD 0044 .ASCII 'NEG ' .BYTE 0FF .WORD 0045 .ASCII 'RETN' .BYTE 0FF .WORD 004D .ASCII 'RETI' .BYTE 0FF .WORD 0046 .ASCII 'IM0 ' .BYTE 0FF .WORD 0056 .ASCII 'IM1 ' .BYTE 0FF .WORD 005E .ASCII 'IM2 ' .BYTE 0FF .WORD 0067 .ASCII 'RRD ' .BYTE 0FF .WORD 006F .ASCII 'RLD ' .BYTE 0FF .WORD 0047 .ASCII 'STAI' .BYTE 0FF .WORD 004F .ASCII 'STAR' .BYTE 0FF .WORD 0057 .ASCII 'LDAI' .BYTE 0FF .WORD 005F .ASCII 'LDAR' .BYTE 0CF .WORD 1343 .ASCII 'S..D' .BYTE 0CF .WORD 134B .ASCII 'L..D' .BYTE 0E7 .WORD 14A0 .ASCII 'LD..' .BYTE 0E7 .WORD 14A1 .ASCII 'CC..' .BYTE 0E7 .WORD 14A2 .ASCII 'IN..' .BYTE 0E7 .WORD 15A3 .ASCII 'UT..' .BYTE 0C7 .WORD 0240 .ASCII 'INP ' .BYTE 0C7 .WORD 0241 .ASCII 'OUTP' .BYTE 0CF .WORD 034A .ASCII 'DADC' .BYTE 0CF .WORD 0342 .ASCII 'DSBC' .BYTE 00 ; ; OTBIR: .BYTE 0FF .WORD 16E9 .ASCII 'PC..' .BYTE 0C9 .WORD 2009 .ASCII 'DA..' .BYTE 0FF .WORD 16F9 .ASCII 'SP..' .BYTE 0FF .WORD 16E3 .ASCII 'XT..' .BYTE 0FF .WORD 17E1 .ASCII 'POP ' .BYTE 0FF .WORD 17E5 .ASCII 'PUSH' .BYTE 0FF .WORD 1723 .ASCII 'INX ' .BYTE 0FF .WORD 172B .ASCII 'DCX ' .BYTE 0FF .WORD 1836 .ASCII 'MVI ' .BYTE 0FF .WORD 1921 .ASCII 'LXI ' .BYTE 0FF .WORD 1A22 .ASCII 'S..D' .BYTE 0FF .WORD 1A2A .ASCII 'L..D' .BYTE 0F8 .WORD 1B70 .ASCII 'MOV ' .BYTE 0C7 .WORD 1C46 .ASCII 'MOV ' .BYTE 0FF .WORD 1F86 .ASCII 'ADD ' .BYTE 0FF .WORD 1F34 .ASCII 'INR ' .BYTE 0FF .WORD 1F35 .ASCII 'DCR ' .BYTE 0FF .WORD 1F8E .ASCII 'ADC ' .BYTE 0FF .WORD 1F96 .ASCII 'SUB ' .BYTE 0FF .WORD 1F9E .ASCII 'SBB ' .BYTE 0FF .WORD 1FA6 .ASCII 'ANA ' .BYTE 0FF .WORD 1FB6 .ASCII 'ORA ' .BYTE 0FF .WORD 1FAE .ASCII 'XRA ' .BYTE 0FF .WORD 1FBE .ASCII 'CMP ' .BYTE 00 ; ; OTBIC: .BYTE 0C7 .WORD 1D46 .ASCII 'BIT ' .BYTE 0C7 .WORD 1D86 .ASCII 'RES ' .BYTE 0C7 .WORD 1DC6 .ASCII 'SET ' .BYTE 0C6 .WORD 1E06 .ASCII '....' .BYTE 00 ; ; ; ; .RADIX 10 ; ; STORAGE ; RDBUF: .BYTE 30 RDCNT: .BYTE 0 COMAND: .BLKB 28 BIAS: .WORD 0 RELO: .WORD 0 OFFST: .WORD 0 KBYTE: .BYTE 0 CBYTE: .BYTE 0 BBUF: .WORD 0 EBUF: .WORD 0 SYMBC: .WORD 0 SYMBC1: .WORD SYMNUM FCBW: .BLKB 33 WTPTR: .BYTE 0 WTBUF: .BLKB 128 TYFLG: .BLKB 2 CC1: .BLKB 3 CCB: .BLKB 1 TABC: .BYTE 0 STACK: .BLKB 64 STKTOP = . HERALD: .BYTE 126,28 .ASCII "CPM Z-80 DISASSEMBLER VER 1.0" .BYTE CR,LF .ASCII "ADAPTED FROM DDJ BY T.M.B., SEPT. 1979." .BYTE CR,LF,CR,LF .ASCII "$" ENMES: .BYTE CR,LF .ASCII "Command (c,d,m,o,r,q,h,s,t) ==> $" COMEX: .ASCII "COM" OPNM: .ASCII "ERROR ON opening FILE$" MESA3: .ASCII "SECTORS READ = $" MESA4: .ASCII "NEXT ADDRESS = $" RDERRM: .ASCII "ERROR ON reading SECTOR$" ESFSG: .BYTE TAB .ASCII ".END" .BYTE CR,'Z'-40H ESFSL = .-ESFSG BYTSG: .ASCII ".BYTE" BYSGL = .-BYTSG SGNMG: .ASCII "DISASSEMBLER" .BYTE CR,LF SNMGL = .-SGNMG OFCMD: .BYTE CR,LF .ASCII "Output Filename ==> $" DIREM: .ASCII "No more directory space $" WEMS1: .ASCII "ERROR ON writing SECTOR...NOW CLOSING." .BYTE CR,LF .ASCII "LAST ADDRESS DISASSEMBLED ==> $" TDLT: .ASCII "TDL" CLEER: .ASCII "ERROR ON closing FILE$" OPTMES: .ASCII "OPTIONS SELECTED = $" FINMES: .ASCII "NUMBER OF ENTRIES IN SYMBOL TABLE = $" TERRM: .ASCII ">>> WARNING <<< SYMBOL TABLE EXCEDED.$" SYMTB: .BLKB SYMNUM ; PREND = . .END