; ;DASMTDL.MAC from DASM.TDL (ver. 3.0) ;The following routine is the disassembler module for TDL Mnemonics in DASM. ;It is included during the assembly of DASM by M80. ; IF1 .PRINTX /DASM with TDL Mnemonics/ ENDIF ; ; This is the Header to be printed for this module by DASM ; HEADER: DEFB 'DASM for TDL Mnemonics',0dh,0ah DEFB ' Derived from ZZSOURCE/RESOURCE',0dh,0ah DEFB 0dh,0ah,'$',0 ; ; This is the main Disassembler module; the instruction to be disassembled ; is pted to by PC ; DASM: CALL HSYM ;write a symbol if it exists, then put PC LD HL,(RPLPTR) ;IS THIS ENTIRE LINE TO BE REPLACED? LD A,H OR L JR Z,DASM1 LD B,(HL) INC HL DEC B CALL NWLN0 DASM1: LD HL,(PC) EX DE,HL ;DE hold the PC LD HL,(OFFSET) ADD HL,DE ;HL is now the biased PC LD (BIASED),HL EX DE,HL INC HL LD (PC),HL ;the new PC (next byte) EX DE,HL ;DE is byte after instruction address LD B,(HL) ;get the current byte LD HL,OPC CALL GTCD CALL TYPEOC ; ;........TYPE 1, 2, AND 3 ARE 1-BYTE INSTRUCTIONS. ; CP 4 JR C,OLDPC ; ;........TYPE 9, A, B AND C ARE 1-BYTE INSTRUCTIONS. ; CP 9 JR C,XTND ;not a 1-byte CP 0DH JR C,OLDPC ;is a 1-byte XTND: INC HL CP 6 JR C,NEWPC ;types 4 & 5 are 2 byte CP 9 JR NC,NEWPC ;types d, e, f, etc. -2 bytes or more INC HL ;3 bytes for 6, 7, and 8. NEWPC: LD (PC),HL OLDPC: PUSH DE LD E,A LD D,0 LD HL,JMPTBL ADD HL,DE ;add 3*opcode type to JMPTBL to ADD HL,DE ;.. get routine jump vector address ADD HL,DE POP DE PUSH HL ;push address LD HL,(BIASED) RET ;'return' to routine ; ; GO TO JUMP TABLE + 3*(OPCODE TYPE). ; JMPTBL: JP TZERO JP TONE JP TTWO JP TTHREE JP TFOUR JP TFIVE JP TSIX JP TSEVEN JP TEIGHT JP TNINE JP TTEN JP TELEVEN ; New decode routines JP T12 ;bit, res, set JP T13 ;djnz, jmpr JP T14 ;jrxx JP T15 ;the 'cb' series JP T16 ;'db' generation JP T17 ;the 'dd' series JP T18 ; " 'fd' " JP T19 ; " 'ed' " JP T20 ; 2 byte dd/fd JP T21 ; " " " JP T22 ; " " " JP T23 ; 3 byte dd/fd JP T24 ; " " " JP T25 ; " " " JP T26 ; LXIii nn JP T27 ; LIiiD, SIxxD JP T28 ; mvi d(ii),n JP T29 ; the 4 byte 'cb' series JP T30 ; inc/dec/repeat group JP T31 ; 4 byte direct store ; GTCD: LD DE,6 ; ; FIND THE OPCODE FOR THIS BYTE. ; NXTCD: ADD HL,DE LD A,(HL) ;get mask AND B INC HL ;point to compare byte. CP (HL) JR NZ,NXTCD INC HL LD A,(HL) ;get type LD (OPCTP),A RET ; ; TYPE THE OPCODE MNEMONIC. ; TYPEOC: LD B,4 ;maximum of 4 characters to type TYPEC1: INC HL LD A,(HL) CP '.' ;do not type '.' CALL NZ,COUT DJNZ TYPEC1 LD HL,(PC) LD A,(OPCTP) RET ; ; SIMPLE ONE BYTE INSTRUCTIONS. ; TZERO: JP DCRLF ; ; ARITHMETIC AND LOGICAL INSTRUCTIONS. ; TONE: CALL TAB REG0: CALL PREG0 JP DCRLF ; ; DCR AND INR INSTRUCTIONS. ; TTWO: CALL TAB CALL PREG1 JP DCRLF ; ; DOUBLE REGISTER NON-IMMEDIATES. ; TTHREE: CALL TAB LD E,'H' CALL PXREG JP DCRLF ; ; THE 'MVI' INSTRUCTIONS. ; TFOUR: CALL TAB CALL PREG1 T4PT: CALL COMMA JR BYTWO ; ; REGISTER IMMEDIATES (EXCEPT MVI) AND IN & OUT. ; TFIVE: CALL TAB BYTWO: LD HL,(BIASED) INC HL LD (BIASED),HL DTABYT: LD A,(HL) CP ' ' JR C,NOTASC CP 5BH JR NC,NOTASC ; ;...ONLY TYPE 4 & 5 WITH ASCII DATA BYTES GET HERE. ; LD A,(HL) CALL PASCII LD A,'''' CALL COUT LD A,(XCSW) ;IS SYMBOL COMMENTING ON? OR A JP Z,DCRLF CALL TAB CALL SEMI ; ;..THE DATA BYTE SHOULD NOT BE PRINTED AS ASCII. ; NOTASC: LD A,(HL) CP 0AH JR C,NTSC0 CALL PASHEX LD A,'H' CALL COUT JP DCRLF NTSC0: ADD A,'0' CALL COUT JP DCRLF ; ; THE LXI INSTRUCTION. ; TSIX: CALL TAB LD E,'H' CALL PXREG T6PT: CALL COMMA ; ; READ THE 2 BYTES AFTER BIASED INTO DE. ; TWOBYTE:LD HL,(BIASED) INC HL LD E,(HL) INC HL LD D,(HL) CALL PRNTDE JP DCRLF ; ; UNCONDITIONAL JUMPS AND 3-BYTERS WITH ADDRESSES. ; TSEVEN: CALL TAB JR TWOBYTE ; ; CONDITIONAL CALLS AND JUMPS. ; TEIGHT: LD E,0EH CALL PRNTCND LD HL,(BIASED) JR TSEVEN ; ; THE CONDITIONAL RETURNS... ; TNINE: LD E,0EH CALL PRNTCND JP DCRLF ; ; THE RST INSTRUCTION..... ; TTEN: CALL TAB LD A,(HL) RRA RRA RRA AND 7 OR '0' CALL COUT JP DCRLF ; TELEVEN:CALL TAB CALL PREG1 T11PT: CALL COMMA LD HL,(BIASED) LD A,(HL) JP REG0 ; ADDED Z-80 ROUTINES T12: CALL TAB ;bit, res, set CALL PBIT JR T11PT PBIT: LD A,(HL) RRA RRA RRA AND 7 ADD A,'0' JP COUT T13: CALL TAB ;djnz & jmpr INC HL LD A,(HL) LD E,A LD D,0 LD HL,(PC) OR A JP P,PSTV DEC D PSTV: ADD HL,DE EX DE,HL CALL PRNTDE JP DCRLF T14: LD E,6 ;conditional relative jumps CALL PRNTCND LD HL,(BIASED) JR T13 T15: INC HL ;the 'cb' series LD B,(HL) LD (BIASED),HL ;new current byte LD HL,OPC2-6 CALL GTCD ;octyp is either 1, 10h or 0ch CALL TYPEOC JP OLDPC T16: LD HL,(PC) ;a 'db', so back up the pc DEC HL LD (PC),HL LD HL,(BIASED) DEC HL ;back up here too JP PRDB T17: LD E,'X' ;the 'dd' series T170: PUSH DE INC HL LD (BIASED),HL ;second byte of instruction LD B,(HL) LD HL,OPC3-6 CALL GTCD CALL TYPEOC POP DE CP 23 JP C,OLDPC INC HL CP 26 JP C,NEWPC INC HL JP NEWPC T18: LD E,'Y' ;the 'fd' series JR T170 T19: INC HL ;the 'ed' series LD (BIASED),HL LD B,(HL) LD HL,OPC4-6 CALL GTCD CALL TYPEOC CP 1FH JP C,OLDPC INC HL INC HL JP NEWPC T21: CALL TAB ;pop x, push x T20: LD A,E ;xtix, etc. CALL COUT JP DCRLF T22: LD A,E CALL COUT CALL TAB CALL PXREG JP DCRLF T23: CALL TAB T231: CALL PDISP CALL PINDX JP DCRLF PDISP: INC HL ;print displacement LD A,(HL) CALL PASHEX LD A,'H' JP COUT PINDX: LD A,'(' ;print '(x)' CALL COUT LD A,E CALL COUT LD A,')' ; JP COUT T24: CALL TAB ;mov r,d(ii) CALL PREG1 CALL COMMA LD HL,(BIASED) JR T231 T25: CALL TAB ;mov d(ii),r CALL PDISP CALL PINDX JP T11PT T26: CALL TAB LD A,E CALL COUT JP T6PT T27: LD A,E CALL COUT LD A,'D' CALL COUT JP TSEVEN T28: CALL TAB ;mvi d(ii),n CALL PDISP CALL PINDX LD (BIASED),HL JP T4PT T29: INC HL INC HL LD B,(HL) LD HL,OPC2-6 PUSH DE CALL GTCD POP DE LD A,B ;get o.c. AND 7 CP 6 JR NZ,ILLEG CALL TYPEOC LD HL,(BIASED) CP 0CH JP C,T23 JR Z,DD12 ILLEG: LD HL,(PC) DEC HL DEC HL LD (PC),HL JP T16 DD12: CALL TAB INC HL INC HL CALL PBIT CALL COMMA DEC HL DEC HL JP T231 T30: LD A,(HL) AND 8 LD A,'I' JR Z,T301 LD A,'D' T301: CALL COUT LD A,(HL) AND 10H JP Z,DCRLF LD A,'R' CALL COUT JP DCRLF T31: LD E,'H' CALL PXREG LD A,D RRCA LD D,A LD A,'C' DEC D JP M,T311 LD A,'E' DEC D JP M,T311 LD A,'L' DEC D T311: CALL NZ,COUT LD A,'D' CALL COUT JP TSEVEN ; ; THE END OF Z80 ADDITIONS. ; ; ROUTINES TO PRINT VARIOUS CHARACTERS ; COMMA: LD A,',' JP COUT TAB: LD A,9 JP COUT SEMI: LD A,';' JP COUT PRDB: CALL PSTG DEFB 'DB',9,0 JP DTABYT ; ;...PRINT THE CONDITION CODE LETTERS FOR THIS INSTRUCTION. ; PRNTCND: LD A,(HL) RRA RRA AND E LD HL,CNDTAB CALL SKIP LD A,(HL) CALL COUT INC HL LD A,(HL) CP '.' CALL NZ,COUT RET ; ;...PRINT A LEADING QUOTE AND THEN THE ASCII ; (PRINT '' FOR '). ; PASCII: PUSH AF LD A,'''' CALL COUT POP AF CP '''' JP NZ,COUT PUSH AF CALL COUT POP AF JP COUT ; ;...PRINT THE FALUE FOR A DOUBLE REGISTER. ; PXREG: LD A,(HL) RRA RRA RRA AND 6 LD D,A CP 4 JR NZ,TAGN LD A,E JP COUT TAGN: CP 6 JR NZ,PREG LD A,(HL) AND 0CFH ; ;......IS IT A POP? ; CP 0C1H JR Z,PPSW ; ;......IS IT A PUSH? ; CP 0C5H JR Z,PPSW LD A,'S' CALL COUT LD A,'P' JP COUT PPSW: CALL PSTG DEFB 'PSW',0 RET ; ;...READ A BYTE AND PRINT ITS DEST. REGISTER. ; PREG1: LD A,(HL) RRA RRA RRA JR PREG ; ;...READ A BYTE AND PRINT ITS SOURCE REGISTER. ; PREG0: LD A,(HL) PREG: LD HL,REGTAB AND 7 CALL SKIP LD A,(HL) JP COUT ; ;...ADVANCE H & L BY (A). ; SKIP: ADD A,L LD L,A RET NC INC H RET ; ;...PRINT THE VALUE IN A AS HEX, ; WITH A LEADING ZERO IF NECESSARY. ; PASHEX: CP 0A0H JP C,PHEX PUSH AF LD A,'0' CALL COUT POP AF JP PHEX ; ;...PRINT A SYMBOLIC VALUE FOR (DE) ; PRNTDE: PUSH DE CALL SYMSCH POP DE JR NC,SYMTCH LD A,(BUILD) OR A JR Z,NOBLD PUSH DE CALL BLDSYM POP DE JR NOBLD SYMTCH: CALL PRNT PDERTN: LD A,(XCSW) ;SYMBOL COMMENTING? OR A RET Z CALL TAB CALL SEMI NOBLD: LD A,D OR E LD A,'0' JR Z,NOBLD1 LD A,D OR A JR Z,NOBLD2 CALL PASHEX LD A,E CALL PHEX NOBLD0: LD A,'H' NOBLD1: CALL COUT RET NOBLD2: LD A,E CP 0AH JR C,NOBLD3 CALL PASHEX JR NOBLD0 NOBLD3: ADD A,'0' JR NOBLD1 ; ;...PRINT THE STRING AT (HL) FOR (B) CHARACTERS. ; PRNT: LD A,(HL) CALL COUT INC HL DJNZ PRNT RET ; ; OPCODE TABLES ; CNDTAB: DEFB 'NZZ.NCC.POPEP.M.' REGTAB: DEFB 'BC' OPC: DEFB 'DEHLMA' DEFB 0FFH,0CEH,5,'ACI.' DEFB 0F8H,88H,1,'ADC.' DEFB 0F8H,80H,1,'ADD.' DEFB 0FFH,0C6H,5,'ADI.' DEFB 0F8H,0A0H,1,'ANA.' DEFB 0FFH,0E6H,5,'ANI.' DEFB 0C7H,0C4H,8,'C...' DEFB 0FFH,0CDH,7,'CALL' DEFB 0FFH,2FH,0,'CMA.' DEFB 0FFH,3FH,0,'CMC.' DEFB 0F8H,0B8H,1,'CMP.' DEFB 0FFH,0FEH,5,'CPI.' DEFB 0FFH,27H,0,'DAA.' DEFB 0CFH,9,3,'DAD.' DEFB 0C7H,5,2,'DCR.' DEFB 0CFH,0BH,3,'DCX.' DEFB 0FFH,0F3H,0,'DI..' DEFB 0FFH,0FBH,0,'EI..' DEFB 0FFH,76H,0,'HLT.' DEFB 0FFH,0DBH,5,'IN..' DEFB 0C7H,4,2,'INR.' DEFB 0CFH,3,3,'INX.' DEFB 0C7H,0C2H,8,'J...' DEFB 0FFH,0C3H,7,'JMP.' DEFB 0FFH,3AH,7,'LDA.' DEFB 0EFH,0AH,3,'LDAX' DEFB 0FFH,2AH,7,'LHLD' DEFB 0CFH,1,6,'LXI.' DEFB 0C0H,40H,0BH,'MOV.' DEFB 0C7H,6,4,'MVI.' DEFB 0FFH,0,0,'NOP.' DEFB 0F8H,0B0H,1,'ORA.' DEFB 0FFH,0F6H,5,'ORI.' DEFB 0FFH,0D3H,5,'OUT.' DEFB 0FFH,0E9H,0,'PCHL' DEFB 0CFH,0C1H,3,'POP.' DEFB 0CFH,0C5H,3,'PUSH' DEFB 0C7H,0C0H,9,'R...' DEFB 0FFH,17H,0,'RAL.' DEFB 0FFH,1FH,0,'RAR.' DEFB 0FFH,0C9H,0,'RET.' DEFB 0FFH,0FH,0,'RRC.' DEFB 0FFH,7,0,'RLC.' DEFB 0C7H,0C7H,0AH,'RST.' DEFB 0F8H,98H,1,'SBB.' DEFB 0FFH,0DEH,5,'SBI.' DEFB 0FFH,22H,7,'SHLD' DEFB 0FFH,0F9H,0,'SPHL' DEFB 0FFH,32H,7,'STA.' DEFB 0EFH,2,3,'STAX' DEFB 0FFH,37H,0,'STC.' DEFB 0F8H,90H,1,'SUB.' DEFB 0FFH,0D6H,5,'SUI.' DEFB 0FFH,0EBH,0,'XCHG' DEFB 0F8H,0A8H,1,'XRA.' DEFB 0FFH,0EEH,5,'XRI.' DEFB 0FFH,0E3H,0,'XTHL' ; DEFB 0FFH,008H,0,'EXAF' DEFB 0FFH,0D9H,0,'EXX.' DEFB 0FFH,010H,0DH,'DJNZ' DEFB 0FFH,018H,0DH,'JMPR' DEFB 0E7H,020H,0EH,'JR..' DEFB 0FFH,0CBH,0FH,'....';THE 'CB' SERIES DEFB 0FFH,0DDH,11H,'....'; " 'DD' " DEFB 0FFH,0FDH,12H,'....'; " 'FD' " DEFB 0FFH,0EDH,13H,'....'; " 'ED' " OPC2: DEFB 0F8H,0,1,'RLCR' DEFB 0F8H,8,1,'RRCR' DEFB 0F8H,10H,1,'RALR' DEFB 0F8H,18H,1,'RARR' DEFB 0F8H,20H,1,'SLAR' DEFB 0F8H,28H,1,'SRAR' DEFB 0F8H,38H,1,'SRLR' DEFB 0C0H,40H,0CH,'BIT.' DEFB 0C0H,80H,0CH,'RES.' DEFB 0C0H,0C0H,0CH,'SET.' DEFB 0,0,10H,'....' OPC3: DEFB 0FFH,0E3H,14H,'XIT.' DEFB 0FFH,0E9H,14H,'PCI.' DEFB 0FFH,0F9H,14H,'SPI.' DEFB 0FFH,0E1H,15H,'POP.' DEFB 0FFH,0E5H,15H,'PUSH' DEFB 0CFH,9,16H,'DAD.' ; DEFB 0FFH,23H,15H,'INX.' DEFB 0FFH,2BH,15H,'DCX.' DEFB 0FFH,34H,17H,'INR.' DEFB 0FFH,35H,17H,'DCR.' DEFB 0FFH,86H,17H,'ADD.' DEFB 0FFH,8EH,17H,'ADC.' DEFB 0FFH,96H,17H,'SUB.' DEFB 0FFH,9EH,17H,'SBB.' DEFB 0FFH,0A6H,17H,'ANA.' DEFB 0FFH,0AEH,17H,'XRA.' DEFB 0FFH,0B6H,17H,'ORA.' DEFB 0FFH,0BEH,17H,'CMP.' DEFB 0C7H,046H,18H,'MOV.' DEFB 0F8H,070H,19H,'MOV.' ; DEFB 0FFH,021H,1AH,'LXI.' DEFB 0FFH,022H,1BH,'SI..' DEFB 0FFH,02AH,1BH,'LI..' DEFB 0FFH,036H,1CH,'MVI.' DEFB 0CBH,0CBH,1DH,'....' DEFB 0,0,010H,'....' OPC4: DEFB 0FEH,070H,010H,'....';PREVENTS 'INP M' DEFB 0FFH,044H,0,'NEG.' DEFB 0FFH,045H,0,'RETN' DEFB 0FFH,046H,0,'IM0.' DEFB 0FFH,056H,0,'IM1.' DEFB 0FFH,05EH,0,'IM2.' DEFB 0FFH,047H,0,'STAI' DEFB 0FFH,04DH,0,'RETI' DEFB 0FFH,04FH,0,'STAR' DEFB 0FFH,057H,0,'LDAI' DEFB 0FFH,05FH,0,'LDAR' DEFB 0FFH,067H,0,'RRD.' DEFB 0FFH,06FH,0,'RLD.' DEFB 0CFH,042H,3,'DSBC' DEFB 0CFH,04AH,3,'DADC' DEFB 0C7H,040H,2,'INP.' DEFB 0C7H,041H,2,'OUTP' DEFB 0E7H,0A0H,1EH,'LD..' DEFB 0E7H,0A1H,1EH,'CC..' DEFB 0E7H,0A2H,1EH,'IN..' DEFB 0E7H,0A3H,1EH,'OUT.' DEFB 0CFH,043H,1FH,'S...' DEFB 0CFH,04BH,1FH,'L...' DEFB 0,0,010H,'....' ; ; END OF OPCODE TABLES ;