; DIS-ASSEMBLER FOR Z80-8080 ; CPU DEPENDING PART ; ; 1982.8.21. ; ; EQUATIONS OF EXTERNAL & ENTRY SYMBOLS ; ENTRY STRTMD ;START MODE SET UP ROUTINE ENTRY LOOPIN ;LOOP INITIALIZE ROUTINE ENTRY SETDB ;SET DEFINE BYTE PSUDO LINE ENTRY SETDW ;SET DEFINE WORD PSEUDO LINE ENTRY SETWDT ;SET WORD DATA ; ENTRY IXMNEM ;MNEMONIC MAIN INDEX ENTRY IXMAIN ;MAIN ROUTINE INDEX ; ENTRY PORG ;ORIGINATE PSUDO DATA POINT ENTRY PEQU ;EQUATION PSUDO DATA POINT ENTRY PEND ;END PSUDO DATA POINT ; ENTRY CSTUP ;START UP COMMNET ENTRY CTAG ;TAG DATA ENTRY MENDCD ;END CODE POINT ; EXT GETYN ;GET YES NO RESPONSE EXT COPY ;COPY DATA EXT ENDLIS ;ONE LINE END PROCESS EXT STLBOR ;SET LABEL DATA EXT LOOPDL ;LINE DECODE LOOP FOR INDEXED EXT SRCHCD ;SEARCH CODE EXT SETLOC ;SET LOCATION DATA EXT SETBYT ;SET BYTE DATA ; EXT WKOPCD ;OPCODE POINT IN WORK EXT BCODE ;INPUT FILE CODE BUFFER EXT PCURNT ;CURRENT PROGRAM ADDRESS ; ; EQUATIONS OF DATA ; CR EQU 0DH ;CARIAGE RETURN LF EQU 0AH ;LINE FEED ; ; OPTION SELECTION AT START POINT ; STRTMD: MVI A,-1 STA MZ80 ;INITIALIZE Z80 MODE LXI H,CUTDL CALL GETYN ;TDL CODE MODE RNZ ;YES LXI B,22 ;INTEL CODE MODE LXI D,PORG LXI H,PINTL CALL COPY ;COPY INTEL PSUDO OPERATORS LXI H,CUZ80 CALL GETYN ;Z80 MODE STA MZ80 RET ; ; ONE LINE DECODING LOOP INITIALIZE ROUTINE ; OUTPUT ; HL:LINE END ROUTINE POINTER ; LOOPIN: XRA A STA MIXIY ;CLEAR INDEXED MODE DCR A STA MENDCD ;RESET END CODE MODE LXI H,ENDLIN RET ; ; END PROCESS OF ONE LINE ; ENDLIN: LDA MIXIY ;GET INDEXED MODE ORA A CNZ SETDBS ;NOT MATCHED, SO DO AS 'DB' JMP ENDLIS ;TO MAIN END ROUTINE ; ; SET UP OF LABELED OPERAND ; SLOPDT: ;DATA LABEL MVI C,'D' JMP STLBOP ; SLOPPR: ;PROGRAM LABEL MVI C,'A' JMP STLBOP ; SLOPTB: ;TABLE LABEL MVI C,'T' STLBOP: MOV A,M INX H MOV H,M MOV L,A ;GET ADDRESS JMP STLBOR ; ; SET DEFINE BYTE ; SETDB: POP H ;CANCEL CODE POINTER SETDBS: CALL CLROPA ;CLEAR OPCODE & OPRAND AREA LXI H,PDB CALL SETOPC ;SET 'DB ' OR '.BYTE' MOV A,M STA WKOPCD+4 ;SET 5TH DATA XRA A STA MIXIY MVI B,1 ;ONE BYTE LDA BCODE ;GET CODE JMP SETBDT ;SET BYTE DATA ; ; SET DEFINE WORD ; SETDW: LXI H,PDW CALL SETOPC ;SET 'DW ' OR '.WORD' MOV A,M STA WKOPCD+4 ;SET 5TH DATA POP H MVI B,2 ;TWO BYTE DATA JMP SLOPPR ;SET AS PROGRAM LABEL ; ; SET OPCODE TO BUFFER ; INPUT ; HL:OPCODE DATA POINT ; OUTPUT ; DE:OPERAND BUFFER POINT ; SETOPC: LXI D,WKOPCD ;OPCODE DATA BUFFER LXI B,4 ;LENGTH OF OPCODE CALL COPY LXI D,WKOPCD+8 ;OPERAND BUFFER POINT RET ; ; SET COMMA ; SETCOM: PUSH PSW MVI A,',' STAX D INX D POP PSW RET ; ; CLEAR OPCODE & OPERAND AREA ; CLROPA: LXI H,WKOPCD MVI B,20 CLRLIL: MVI M,' ' ;FILL BY SPACE INX H DCR B JNZ CLRLIL MVI M,0 ;SET END CODE RET ; ; SET WORD DATA ; INPUT ; HL:DATA ; DE:BUFFER POINTER ; SETWDT: PUSH PSW MVI A,'0' STAX D INX D CALL SETLOC ;SET ADDRESS MVI A,'H' STAX D INX D POP PSW RET ; ; SET BYTE DATA ; INPUT ; A:DATA ; DE:BUFFER POINTER ; SETBDT: PUSH PSW MVI A,'0' STAX D INX D POP PSW CALL SETBYT MVI A,'H' STAX D INX D RET ; ; MAIN ROUTINE INDEX ; IXMAIN: DW OBNOPZ ; 0 1B NO OPERAND DW DBDATA ; 1 2B DATA OPERAND DW TBDADD ; 2 3B DATA ADDRESS DW TBPADD ; 3 3B PROGARM ADDRESS DW DBREL ; 4 2B RELATIVE ADDRESS Z DW ZINDX ; 5 >2B IX,IY INDEXED CODES Z DW ZOTHER ; 6 >2B OTHER Z CODES Z DW OBORGL ; 7 1B REGISTER BIT 0-2 DW OBORGH ; 8 1B REGISTER BIT 3-5 DW OBTWRG ; 9 1B TWO REGISTER BIT 0-2 & BIT 3-5 DW DBRGDT ;10 2B REGISTER BIT 3-5 & DATA DW OBDREG ;11 1B PAIR REGUSTER DW TBDRTA ;12 3B PAIR REGISTER & TABLE ADDRESS DW TBCPA ;13 3B CONDITION & PROGRAM ADDRESS DW STCOND ;14 1B CONDITION DW STRST ;15 1B RESTART ; ; ONE BYTE NO OPERAND ; OBNOPZ: CPI 008H ;EXAF CZ CHKZMD ;CHECK Z MODE CPI 0D9H ;EXX CZ CHKZMD ;CHECK Z MODE MVI B,1 CPI 0C9H ;RET JZ STENDC ;END CODE CPI 0E9H ;PCHL CZ STENDC ;END CODE ; ; CHECK IX OR IY MODE ; CHKIXY: LDA MIXIY ;GET INDEX MODE ORA A RZ ;NOT INDEXED LDA BCODE+1 ;GET CODE MOV C,A LXI D,6 ;ONE DATA LENGTH-1 LXI H,IXIXYC-6 ;INDEXED DATA CODE SRIXYL: ;CHECK IX,IY CODE DAD D MOV A,M ANA C RZ ;NOT FOUND MOV C,A INX H CMP M JNZ SRIXYL ;TO NEXT LXI D,WKOPCD-1 INR B LDA MIXIY ;GET INDEXED CODE MOV C,A XRA A STA MIXIY ;CLEAR INDEXED MODE STIXYL: ;ONE BYTE COPY LOOP INX H INX D STDRCD: MOV A,M CPI '*' JNZ $+4 ;NORMAL CODE MOV A,C ;GET INDEX CODE 'X' OR 'Y' STAX D ;SAVE DATA CPI ' ' JNZ STIXYL ;TO NEXT CODE RET ; ; SET END CODE MODE ; STENDC: XRA A STA MENDCD ;SET END CODE MODE RET ; ; TWO BYTES DATA OPERAND ; DBDATA: MVI B,2 MOV A,M ;GET DATA BYTE JMP SETBDT ;SET AS DATA ; ; THREE BYTES DATA ADDRESS ; TBDADD: CALL SLOPDT ;SET DATA LABEL MVI B,3 JMP CHKIXY ;CHECK INDEX ; ; THREE BYTE PROGRAM ADDRESS ; TBPADD: CPI 0C3H ;JMP CZ STENDC ;SET END CODE MODE TBADDC: MVI B,3 JMP SLOPPR ;PROGRAM ADDRESS MODE ; ; TWO BYTES RELATIVE ADDRESS ; DBREL: CALL CHKZMD ;CHECK Z MODE CPI 18H CZ STENDC ;JMPR SO END CODE MVI B,2 PUSH D MOV A,M INX H MOV E,A RAL SBB A ;GET SIGN MOV D,A LHLD PCURNT INX H INX H DAD D ;GET ADDRESS POP D MVI C,'A' JMP STLBOR ;SET LABEL ; ; X,Y INDEXED SET UP MODE & DECODE SECOND BYTE ; ZINDX: CALL CHKZMD ;CHECK Z CODE CPI 0DDH MVI A,'X' JZ $+4 ;IX INR A ;IY STA MIXIY ;SET INDEXED MODE JMP LOOPDL ; ; OTHER Z CODE DECODING ; ZOTHER: CALL CHKZMD ;CHECK Z MODE CPI 0EDH JZ ZMANY ;NOT BIT CODE LDA MIXIY ORA A MOV A,M JZ $+7 ;NOT INDEXED NOP ;INDEXED SO GET 4TH DATA INX H MOV A,M DCX H PUSH H PUSH D PUSH PSW LXI H,IXBIT CALL SRCHCD JC SETDBO ;NOT FOUND SO DO AS 'DB' LXI B,IXRBIT ;TO ROTATE OR BIT INXJMP: DAD B MOV A,M INX H MOV H,M MOV L,A POP PSW POP D XTHL MVI B,2 ;BASE IS TWO BYTES RET ; ; BIT & ROTATE MODE ROUTINE INDEX ; IXRBIT: DW SETRGL ;ROTATE SET REGISTER ONLY DW SETBIT ;BIT OPERATION ; ; BIT OPERATION BIT,SET,RES ; SETBIT: MOV C,A RRC RRC RRC ANI 7 CALL SETNBR ;SET BIT NUMBER CALL SETCOM ;SET COMMA MOV A,C JMP SETRGL ;TO SET REGISTER NAME ; ; Z MANY CODES ; ZMANY: MOV A,M INX H PUSH H PUSH D PUSH PSW LXI H,IXZCOD CALL SRCHCD ;SEARCH CODE JC SETDBO ;NOT FOUND SO DO AS 'DB' LXI B,IXSROT ;ROUTINE INDEX JMP INXJMP ; ; MANY Z CODE DECODING ROUTINES ; IXSROT: DW DBZNOP ;2B NO OPERAND DW FBDADD ;4B DATA ADDRESS DW SETDRG ;2B PAIR REGISTER DW SETRGH ;2B REGISTER BIT 3-5 ; ; CHECK END CODE OF Z ; DBZNOP: CPI 0B3H JZ DBZNOS ;OUTIR CPI 0BBH ;OUTDR JNZ DBZNOE ;NO NEED 5TH BYTE DBZNOS: MVI A,'R' STA WKOPCD+4 ;SET 5TH DATA RET ; DBZNOE: CPI 4DH ;RETI JZ STENDC ;END CODE CPI 045H ;RETN JZ STENDC ;END CODE RET ;NORMAL CODE ; ; FOUR BYTES DATA ADDRESS ; FBDADD: CALL SLOPDT ;SET LABEL AS DATA ADDRESS MVI B,4 ;BYTE LENGTH RET ; ; ONE BYTE REGISTER BIT 0-2 ; OBORGL: JMP SETRGL ; ; ONE BYTE REGISTER BIT 3-5 ; OBORGH: JMP SETRGH ; ; ONE BYTE TWO REGISTER 'MOV' ; OBTWRG: CALL SETRGH ;SET REGISTER OF BIT 3-5 CALL SETCOM ;SET COMMA JMP SETRGL ;SET REGISTER OF BIT 0-2 ; ; TWO BYTES TWO OPERANDS 'MVI' ; DBRGDT: INR B ;UP BYTE COUNT CALL SETRGH ;SET REGISTER BIT 3-5 CALL SETCOM ;SET COMMA MOV A,M JMP SETBDT ;SET BYTE DATA ; ; ONE BYTE REGISTER PAIR ; OBDREG: CALL SETDRG ;SET PAIR REGISTER JMP CHKIXY ;CHECK INDEXED ; ; THREE BYTES PAIR REGISTER & TABLE ADDRESS ; TBDRTA: MVI B,3 ;BYTE LENGTH CALL SETDRG ;SET REGISTER CALL SETCOM JMP SLOPTB ;SET LABEL AS TABLE ; ; THREE BYTES CONDITION & PROGRAM ADDRESS ; TBCPA: CALL STCOND ;SET CONDITION JMP TBADDC ;SET ADDRESS ; ; SET UP CONDITION DATA ; STCOND: PUSH B PUSH D PUSH H ANI 38H ;GET CONDITION BIT RRC RRC MOV C,A MVI B,0 LXI H,IXCOND DAD B ;GET CONDITION CODE DATA POINT LXI D,WKOPCD+1 MVI C,2 CALL COPY ;SET CONDITION CODE POP H POP D POP B RET ; ; RESTART INSTRUCTION ; STRST: RRC RRC RRC ANI 7 ; ; SET NUMBER ; SETNBR: ADI '0' STAX D INX D RET ; ; OVERRIDING TO 'DB' FROM Z CODE DECODING ROUTINE ; SETDBO: POP H POP H ; JMP SETDB ; ; SET UP REGISTER BIT 0-2 ; SETRGL: PUSH PSW JMP SETRGC ; ; SET UP REGISTER BIT 3-5 ; SETRGH: PUSH PSW RRC RRC RRC SETRGC: ANI 7 PUSH B MOV C,A CPI 6 JNZ SETRGS ;NORMAL REGISTER CODE LDA MIXIY ;CHECK INDEXED MODE ORA A JZ SETRGS ;NOT INDEXED MOV C,A ;GET INDEX CODE XRA A STA MIXIY ;CLEAR MODE MOV A,M INX H CALL SETBDT ;SET OFFSET MVI A,'(' STAX D INX D MOV A,C STAX D ;SET INDEX CODE INX D MVI A,')' STAX D INX D POP B INR B INR B POP PSW RET ; ; SETRGS: ;NORMAL REGISTER CODE MVI B,0 PUSH H LXI H,IXREGS DAD B MOV A,M ;GET REGISTER NAME POP H STAX D INX D POP B POP PSW RET ; ; PAIR REGISTER ; SETDRG: PUSH PSW PUSH B CPI 0F5H JZ SETPSW ;PUSH PSW CPI 0F1H JZ SETPSW ;POP PSW RRC RRC RRC ANI 6 ;GET CODE CPI 4 JNZ SETPRN ;NORMAL CODE MOV B,A ;CHECK INDEXED MODE LDA MIXIY ORA A JZ SETDRS ;NOT INDEXED STAX D ;INDEXED SET INDEX CODE INX D POP B POP PSW CPI ')' RZ INR B PUSH PSW XRA A STA MIXIY ;CLEAR INDEXED MODE POP PSW RET ; SETDRS: ;NORMAL PAIR REGISTER MOV A,B SETPRN: PUSH H MOV C,A MVI B,0 LXI H,IXREGD DAD B ;GET CODE POINT SETDRC: CALL STDRCD ;SET CODE POP H POP B POP PSW RET ; SETPSW: ;PSW CODE PUSH H LXI H,IXPSW JMP SETDRC ; ; CHECK Z MODE IF NOT Z MODE, OVERRIDING GOTO 'DB' ROUTINE ; CHKZMD: PUSH B MOV B,A LDA MZ80 ORA A MOV A,B POP B RNZ ;Z MODE SO OK JMP SETDB ;NOT Z SO TO 'DB' ROUTINE ; ; SUBTTL INDEX DATA & COMMENTS ; ; INDEX OF MNEMONICS ; MASK 1B MASK FOR CODE ; COUNT 1B BLOCK COUNT ; BLOCK 5B*N CODE 1B ; MEMONIC 4B ; IXMNEM: DB 0FFH,19 ;ONE BYTE NO OPERAND DB 2FH,'CMA ' DB 3FH,'CMC ' DB 27H,'DAA ' DB 0F3H,'DI ' DB 0FBH,'EI ' DB 008H,'EXAF' DB 0D9H,'EXX ' DB 076H,'HLT ' DB 000H,'NOP ' DB 0E9H,'PCHL' DB 017H,'RAL ' DB 01FH,'RAR ' DB 0C9H,'RET ' DB 007H,'RLC ' DB 00FH,'RRC ' DB 0F9H,'SPHL' DB 037H,'STC ' DB 0EBH,'XCHG' DB 0E3H,'XTHL' ; DB 0FFH,10 ;TWO BYTES DATA OPERAND DB 0CEH,'ACI ' DB 0C6H,'ADI ' DB 0E6H,'ANI ' DB 0FEH,'CPI ' DB 0DBH,'IN ' DB 0F6H,'ORI ' DB 0D3H,'OUT ' DB 0DEH,'SBI ' DB 0D6H,'SUI ' DB 0EEH,'XRI ' ; DB 0FFH,4 ;THREE BYTES DATA ADDRESS DB 03AH,'LDA ' DB 032H,'STA ' DB 02AH,'LHLD' DB 022H,'SHLD' ; DB 0FFH,2 ;THREE BYTES PROGRAM ADDRESS DB 0C3H,'JMP ' DB 0CDH,'CALL' ; DB 0FFH,6 ;TWO BYTES RELATIVE PROGRAM ADDRESS DB 010H,'DJNZ' DB 018H,'JMPR' DB 038H,'JRC ' DB 030H,'JRNC' DB 020H,'JRNZ' DB 028H,'JRZ ' ; DB 0DFH,1 ;>TWO BYTES INDEXED DATA DB 0DDH,'****' ; DB 0FFH,2 ;>TWO BYTES Z INSTRUCTIONS DB 0CBH,'****' ;ROTATE OR BIT OPERATION DB 0EDH,'****' ;OTHER CODES ; DB 0F8H,8 ;ONE BYTE REGISTER OPERAND BIT 0-2 DB 088H,'ADC ' DB 080H,'ADD ' DB 0A0H,'ANA ' DB 0B8H,'CMP ' DB 0B0H,'ORA ' DB 098H,'SBB ' DB 090H,'SUB ' DB 0A8H,'XRA ' ; DB 0C7H,2 ;ONE BYTE REGISTER OPERAND BIT 3-5 DB 05H,'DCR ' DB 04H,'INR ' ; DB 0C0H,1 ;ONE BYTE TWO REGISTERS BIT 0-2 & BIT 3-5 DB 040H,'MOV ' ; DB 0C7H,1 ;TWO BYTES REGISTER & DATA DB 006H,'MVI ' ; DB 0CFH,7 ;ONE BYTE REGISTER PAIR DB 009H,'DAD ' DB 00BH,'DCX ' DB 003H,'INX ' DB 0C1H,'POP ' DB 0C5H,'PUSH' DB 00AH,'LDAX' DB 002H,'STAX' ; DB 0CFH,1 ;THREE BYTES REGISTER PAIR & TABLE ADDRESS DB 001H,'LXI ' ; DB 0C7H,2 ;THREE BYTES CONDITION & PROGRAM ADDRESS DB 0C4H,'C** ' DB 0C2H,'J** ' ; DB 0C7H,1 ;ONE BYTE CONDITION DB 0C0H,'R** ' ; DB 0C7H,1 ;RESTART DB 0C7H,'RST ' DB 0 ; ; ROTATION & BIT OPERATION ; IXBIT: DB 0F8H,7 ;ROTATION DB 000H,'RLCR' DB 010H,'RALR' DB 008H,'RRCR' DB 018H,'RARR' DB 020H,'SLAR' DB 028H,'SRAR' DB 038H,'SRLR' ; DB 0C0H,3 ;BIT OPERATION DB 040H,'BIT ' DB 0C0H,'SET ' DB 080H,'RES ' DB 0 ; ; Z CODE OF SECOND FIRST IS 0EDH ; IXZCOD: DB 0FFH,28 ;TWO BYTES NO OPERAND DB 057H,'LDAI' DB 05FH,'LDAR' DB 047H,'STAI' DB 04FH,'STAR' DB 0A0H,'LDI ' DB 0B0H,'LDIR' DB 0A8H,'LDD ' DB 0B8H,'LDDR' DB 0A1H,'CCI ' DB 0B1H,'CCIR' DB 0A9H,'CCD ' DB 0B9H,'CCDR' DB 044H,'NEG ' DB 046H,'IM0 ' DB 056H,'IM1 ' DB 05EH,'IM2 ' DB 06FH,'RLD ' DB 067H,'RRD ' DB 04DH,'RETI' DB 045H,'RETN' DB 0A2H,'INI ' DB 0B2H,'INIR' DB 0AAH,'IND ' DB 0BAH,'INDR' DB 0A3H,'OUTI' DB 0B3H,'OUTI' DB 0ABH,'OUTD' DB 0BBH,'OUTD' ; DB 0FFH,6 ;FOUR BYTES DATA ADDRESS DB 04BH,'LBCD' DB 05BH,'LDED' DB 07BH,'LSPD' DB 043H,'SBCD' DB 053H,'SDED' DB 073H,'SSPD' ; DB 0CFH,2 ;TWO BYTE PAIR REGISTER DB 04AH,'DADC' DB 042H,'DSBC' ; DB 0C7H,2 ;TWO BYTE REGISTER BIT 3-5 DB 040H,'INP ' DB 041H,'OUTP' DB 0 ; ; CONDITION CODES ; IXCOND: DB 'NZ','Z ' DB 'NC','C ' DB 'PO','PE' DB 'P ','M ' ; ; REGISTER CODES ; IXREGS: DB 'BCDEHLMA' IXREGD: DB 'B ','D ','H ','SP ' IXPSW: DB 'PSW ' ; ; INDEXED CODES ; IXIXYC: DB 0FFH,0E9H,'PCI* ' DB 0FFH,0F9H,'SPI* ' DB 0FFH,0E3H,'XTI* ' DB 0FFH,02AH,'LI*D ' DB 0FFH,022H,'SI*D ' DB 0CFH,009H,'DAD* ' DB 0 ; ; PSEUDO OPERATION CODES ; PORG: DB '.LOC' ;TDL CODE PEND: DB '.END' PEQU: DB '= ' PDB: DB '.BYTE' PDW: DB '.WORD' ; PINTL: DB 'ORG ' ;INTEL CODE DB 'END ' DB 'EQU ' DB 'DB ' DB 'DW ' ; ; COMMENTS ; CSTUP: DB 'DIS-ASSEMBLER Z80-8080 VER.2.00',CR,LF,LF,0 CTAG: DB ':',0 ;TAG DATA CUTDL: DB 'USE TDL PSEUDO-OPS? ',0 CUZ80: DB 'Z80 CODE? ',0 ; ; MZ80: DS 1 ;Z80 MODE MIXIY: DS 1 ;INDEXED MODE 0 NO OR 'X' OR 'Y' MENDCD: DS 1 ;END CODE MODE 0 END CODE ; ; ; END