;
;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
;