home *** CD-ROM | disk | FTP | other *** search
- ;
- ;DASM6502.MAC from DASM.6502 (ver. >= 3.0)
- ;This routine is the 6502 mnemonic disassembler module for DASM.MAC.
- ;It is included into DASM during assembly under M80.
- ;
- ; Hacked by: William F. Dudley Jr. (dudley@nadc)
- ; uploaded to mit-mc Feb 22 1983
- ;
- IF1
- .PRINTX /DASM with 6502-Standard Mnemonics/
- ENDIF
- ;
- ; This is the Header to be printed for this module
- ;
- HEADER:
- DEFB 'DASM for 6502-Standard Mnemonics',0dh,0ah
- DEFB ' Derived from ZZSOURCE/RESOURCE',0dh,0ah
- DEFB '$',0
- ;
- ; This is the Disassembler Module -- Instruction to be disassembled
- ; is pted to by PC
- ;
- DASM:
- CALL HSYM ;WRITE A SYMBOL IF IT EXISTS
- ;.. AND PUT PC ON THE CRT
- LD HL,(RPLPTR) ;SEE IF THIS LINE IS REPLACED
- LD A,H
- OR L
- JR Z,DASM1
- LD B,(HL)
- INC HL ;SKIP THE '*'
- DEC B
- CALL NWLN0 ;PRINT THE REPLACING LINE AS A COMMENT
- DASM1:
- LD HL,(PC)
- EX DE,HL
- LD HL,(OFFSET)
- ADD HL,DE ;HL IS NOW THE BIASED PC
- LD (BIASED),HL
- EX DE,HL ;DE IS NOW THE BIASED PC
- INC HL
- LD (PC),HL ;THE NEW PC (NEXT BYTE)
- EX DE,HL ;DE IS THE BYTE AFTER THE INSTRUCTION
- LD B,(HL)
- LD HL,OPC-4
- CALL GTCD
- CALL TYPEOC
- CP 02H ;TYPES 0 and 1 ARE 1 BYTE
- JR C,OLDPC ; .. SO DON'T CHANGE THE PC
- LD HL,(PC)
- INC HL
- CP 09H ;TYPES 02 THRU 08H ARE 2-BYTERS
- JR C,NEWPC
- INC HL ;else must be 3 bytes
- NEWPC:
- LD (PC),HL
- OLDPC:
- PUSH DE ;SAVE THE 'E' REGISTER (MAY BE 'X' OR 'Y')
- LD E,A
- LD D,0
- LD HL,JMPTBL
- ADD HL,DE ;ADD 2*OPCODE TYPE TO JMPTBL TO GET
- ADD HL,DE ;.. ROUTINE ADDRESS
- LD E,(HL)
- INC HL
- LD D,(HL)
- EX DE,HL ;HL NOW CONTAINS THE ROUTINE ADDRESS
- POP DE
- PUSH HL
- LD HL,(BIASED)
- RET ;'RETURN' TO THE ROUTINE
- ;
- GTCD:
- LD DE,4
- NXTCD:
- ADD HL,DE
- NXTCD1:
- LD A,(HL)
- OR A ;SEE IF WE'RE AT THE NEXT MASK YET
- INC HL
- JP P,NXTCD1 ;JUMP IF NOT
- AND B ;MASK OUT VARIABLES IN THE INSTRUCTION
- CP (HL) ;CHECK THE GENERIC INSTRUCTION TYPE
- JR NZ,NXTCD
- INC HL
- LD A,(HL) ;AFTER A MATCH, GET THE OPCODE TYPE
- LD (OPCTP),A
- RET
- ;
- TOC2:
- CP 20H ;CONVERT SPACES IN THE TABLE TO TABS
- JR NZ,TOC1
- LD A,9
- TOC1:
- CALL COUT
- TYPEOC:
- INC HL ;TYPE THE OPCODE THAT HL IS POINTING TO
- LD A,(HL)
- OR A
- JR Z,TYPEOC
- JP P,TOC2
- LD HL,(PC)
- LD A,(OPCTP)
- RET
- ;
- JMPTBL:
- DEFW T0 ;SIMPLE 1 BYTE INSTRUCTIONS
- DEFW T2A ;UNDEFINED OPCODES
- DEFW TB ;8 BIT IMMEDIATE ARITH. & LOGICAL
- DEFW TF ;RELATIVE JUMPS
- defw tdzx ;zero, x
- defw tdx ;ind, x
- defw tdy ;ind, y
- defw tdzy ;zero, y
- defw tdzp ;zero page
- DEFW T11 ;JUMPS & CALLS
- defw twx ;abs, x
- defw twy ;abs, y
- defw jpind ;jump indirect
- ;
- ;ONE BYTE INSTRUCTIONS, SIMPLE
- ;
- T0:
- JP DCRLF
- ;
- ;ARITHMETIC & LOGICAL IMMEDIATES
- TB:
- INC HL
- DTABYT:
- LD A,(HL)
- CP ' '
- JR C,NOTASC
- CP 5BH
- JR NC,NOTASC
- CALL PASCII
- LD A,''''
- CALL COUT
- LD A,(XCSW) ;WANT SYMBOL COMMENTS?
- OR A
- JP Z,DCRLF
- CALL TAB
- CALL SEMI
- 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
- ;
- TDX:
- CALL LPAR
- inc hl
- ld e,(hl)
- ld d,0
- call prntde
- call c,pdertn
- ; LD A,(HL)
- ; CALL PASHEX
- ; LD A,'H'
- ; CALL COUT
- CALL COMMA
- LD A,'X'
- CALL COUT
- CALL RPAR
- JP DCRLF
- ;
- TDY:
- CALL LPAR
- inc hl
- ld e,(hl)
- ld d,0
- call prntde
- call c,pdertn
- ; LD A,(HL)
- ; CALL PASHEX
- ; LD A,'H'
- ; CALL COUT
- CALL RPAR
- CALL COMMA
- LD A,'Y'
- CALL COUT
- JP DCRLF
- ;
- TDZX:
- INC HL
- LD A,(HL)
- CALL PASHEX
- LD A,'H'
- CALL COUT
- CALL COMMA
- LD A,'X'
- CALL COUT
- JP DCRLF
- ;
- TDZY:
- INC HL
- LD A,(HL)
- CALL PASHEX
- LD A,'H'
- CALL COUT
- CALL COMMA
- LD A,'Y'
- CALL COUT
- JP DCRLF
- ;
- twy: call prnn
- push af
- call comma
- ld a,'Y'
- call cout
- pop af
- call c,pdertn
- jp dcrlf
- ;
- twx: call prnn
- push af
- call comma
- ld a,'X'
- call cout
- pop af
- call c,pdertn
- jp dcrlf
- ;
- ; zero page addresses
- ;
- tdzp: inc hl
- ld e,(hl)
- ld d,0
- call prntde
- call c,pdertn
- jp dcrlf
- ;
- ;OTHER RELATIVE INSTRUCTIONS
- TF:
- 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
- CALL C,PDERTN
- JP DCRLF
- ;
- ;JUMPS AND CALLS
- T11:
- CALL PRNN
- CALL C,PDERTN
- JP DCRLF
- ;
- jpind: call dradr
- call c,pdertn
- jp dcrlf
- ;
- DRADR:
- CALL LPAR ;PRINT THE VALUE FOR DE IN PARENTHESIS
- CALL PRNN
- PUSH AF
- CALL RPAR
- POP AF
- RET
- ;
- ;ALL UNDEFINED OPCODES COME HERE FOR A 'DB VALUE' TREATMENT
- ;
- T2A:
- LD HL,(BIASED)
- CALL PSTG
- DEFB 'DB',9,0
- JP DTABYT
- ;
- ; VARIOUS CHARACTERS TO PRINT
- ;
- COMMA:
- LD A,','
- JP COUT
- TAB:
- LD A,9
- JP COUT
- SEMI:
- LD A,';'
- JP COUT
- LPAR:
- LD A,'('
- JP COUT
- RPAR:
- LD A,')'
- JP COUT
- PCMAA:
- CALL COMMA
- LD A,'A'
- JP COUT
- ;
- ; PRINT THE CONDITION CODE LETTERS FOR THIS INSTRUCTION.
- ;
- PRCND:
- LD A,(HL)
- AND 38H ;FOR A FULL SET OF CONDITION CODES
- PRC:
- RRCA
- RRCA
- LD HL,CNDTAB
- CALL SKIP
- LD A,(HL)
- CALL COUT
- INC HL
- LD A,(HL)
- CP '.'
- CALL NZ,COUT
- RET
- PRCND1:
- LD A,(HL)
- AND 18H
- JR PRC
- CNDTAB:
- DEFB 'NZZ.NCC.POPEP.M.'
- ;
- ; PRINT THE SOURCE REGISTER FOR A BYTE
- ;
- PSREG:
- LD A,(HL)
- PREG:
- LD HL,REGTAB
- AND 7
- CP 6 ;MUST CATCH THE (HL) REFERENCES
- JP Z,PHLREG
- CALL SKIP
- LD A,(HL)
- JP COUT
- PHLREG:
- CALL LPAR
- LD A,'H'
- CALL COUT
- LD A,'L'
- CALL COUT
- JP RPAR
- PDREG:
- LD A,(HL) ;PRINT THE DESTINATION REGISTER FOR A BYTE
- RRA
- RRA
- RRA
- JP PREG
- ;
- ; ADVANCE H&L BY (A)
- ;
- SKIP:
- ADD A,L
- LD L,A
- RET NC
- INC H
- RET
- REGTAB:
- DEFB 'BCDEHLMA' ;'M' IS NEVER PRINTED - '(HL)' IS INSTEAD
- ;
- ; PRINT A DOUBLE REGISTER PAIR
- ;
- PXSREG:
- LD A,(HL)
- LD HL,DREGS
- JR PXREG
- PXQREG:
- LD A,(HL)
- LD HL,DREGQ
- PXREG:
- RRA
- RRA
- RRA
- AND 6
- CALL SKIP
- LD A,(HL)
- CALL COUT
- INC HL
- LD A,(HL)
- JP COUT
- DREGS:
- DEFB 'BCDEHLSP'
- DREGQ:
- DEFB 'BCDEHLAF'
- IXREGS:
- DEFB 'BCDEIXSP'
- IYREGS:
- DEFB 'BCDEIYSP'
- ;
- PBIT:
- LD A,(HL)
- RRA
- RRA
- RRA
- AND 7
- ADD A,'0'
- JP COUT
- PRXX:
- LD A,'I'
- CALL COUT
- LD A,E
- JP COUT
- ;
- ;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 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 THE STRING AT (HL) FOR (B) CHARACTERS.
- PRNT:
- LD A,(HL)
- CALL COUT
- INC HL
- DEC B
- JP NZ,PRNT
- RET
- ;
- ;PRINT A DISPLACEMENT IN THE FORM '(IX+d)'
- PDISP:
- CALL LPAR
- CALL PRXX
- LD A,'+'
- CALL COUT
- LD A,(HL)
- CALL PASHEX
- LD A,'H'
- CALL COUT
- JP RPAR
- ;
- ;PRINT THE NEXT 2 BYTES AS A SYMBOL (AND RETURN Cy=1) IF POSSIBLE
- ;
- PRNN:
- INC HL
- LD E,(HL)
- INC HL
- LD D,(HL)
- PRNTDE:
- PUSH DE
- CALL SYMSCH
- JP C,NOMTCH
- CALL PRNT ;GOT ONE, SO PRINT IT
- POP DE
- SCF ;INDICATE THAT A SYMBOL WAS PRINTED
- RET
- NOMTCH:
- LD A,(BUILD) ;DO WE BUILD A SYMBOL?
- OR A
- POP DE
- JR Z,NOBLD ;JUST PRINT THE HEX VALUE
- PUSH DE
- CALL BLDSYM
- POP DE
- JR NOBLD
- PDERTN:
- LD A,(XCSW)
- OR A
- RET Z ;DON'T PRINT THE SYMBOL AS A COMMENT
- CALL TAB ;WE'LL PRINT A VALUE AS A COMMENT
- CALL SEMI
- NOBLD:
- LD A,D
- OR E
- LD A,'0'
- JR Z,NOBLD1
- LD A,D
- OR A
- JR Z,NOBLD2
- CALL PASHEX ;PRINT THE HIGH ORDER BYTE
- LD A,E
- CALL PHEX
- NOBLD0:
- LD A,'H'
- NOBLD1:
- CALL COUT
- OR A ;CLEAR THE CARRY
- RET
- NOBLD2:
- LD A,E
- PRST:
- CP 0AH
- JR C,NOBLD3
- CALL PASHEX
- JR NOBLD0
- NOBLD3:
- ADD A,'0'
- JR NOBLD1
- ;
- ; OPCODE TABLES
- ;
- OPC:
- DEFB 0ffH,00ah,0,'ASL A'
- DEFB 0ffH,000h,0,'BRK'
- DEFB 0ffH,018h,0,'CLC'
- DEFB 0ffH,0d8h,0,'CLD'
- DEFB 0ffH,058h,0,'CLI'
- DEFB 0ffH,0b8h,0,'CLV'
- DEFB 0ffH,0cah,0,'DEX'
- DEFB 0ffH,088h,0,'DEY'
- DEFB 0ffH,0e8h,0,'INX'
- DEFB 0ffH,0c8h,0,'INY'
- DEFB 0ffH,04ah,0,'LSR A'
- DEFB 0ffH,0eah,0,'NOP'
- DEFB 0ffH,048h,0,'PHA'
- DEFB 0ffH,008h,0,'PHP'
- DEFB 0ffH,068h,0,'PLA'
- DEFB 0ffH,028h,0,'PLP'
- DEFB 0ffH,02ah,0,'ROL A'
- DEFB 0ffH,06ah,0,'ROR A'
- DEFB 0ffH,040h,0,'RTI'
- DEFB 0ffH,060h,0,'RTS'
- DEFB 0ffH,038h,0,'SEC'
- DEFB 0ffH,0f8h,0,'SED'
- DEFB 0ffH,078h,0,'SEI'
- DEFB 0ffH,0aah,0,'TAX'
- DEFB 0ffH,0a8h,0,'TAY'
- DEFB 0ffH,098h,0,'TYA'
- DEFB 0ffH,0bah,0,'TSX'
- DEFB 0ffH,08ah,0,'TXA'
- DEFB 0ffH,09ah,0,'TXS'
- DEFB 0ffH,069h,02h,'ADC #'
- DEFB 0ffH,029h,02h,'AND #'
- DEFB 0ffH,0C9h,02h,'CMP #'
- DEFB 0ffH,0E0h,02h,'CPX #'
- DEFB 0ffH,0C0h,02h,'CPY #'
- DEFB 0ffH,049h,02h,'EOR #'
- DEFB 0ffH,0A9h,02h,'LDA #'
- DEFB 0ffH,0A2h,02h,'LDX #'
- DEFB 0ffH,0A0h,02h,'LDY #'
- DEFB 0ffH,009h,02h,'ORA #'
- DEFB 0ffH,0E9h,02h,'SBC #'
- DEFB 0ffH,090h,03h,'BCC '
- DEFB 0ffH,0B0h,03h,'BCS '
- DEFB 0ffH,0F0h,03h,'BEQ '
- DEFB 0ffH,030h,03h,'BMI '
- DEFB 0ffH,0D0h,03h,'BNE '
- DEFB 0ffH,010h,03h,'BPL '
- DEFB 0ffH,050h,03h,'BVC '
- DEFB 0ffH,070h,03h,'BVS '
- DEFB 0ffH,06Dh,09h,'ADC '
- DEFB 0ffH,02Dh,09h,'AND '
- DEFB 0ffH,00Eh,09h,'ASL '
- DEFB 0ffH,02Ch,09h,'BIT '
- DEFB 0ffH,0CDh,09h,'CMP '
- DEFB 0ffH,0ECh,09h,'CPX '
- DEFB 0ffH,0CCh,09h,'CPY '
- DEFB 0ffH,0CEh,09h,'DEC '
- DEFB 0ffH,04Dh,09h,'EOR '
- DEFB 0ffH,0EEh,09h,'INC '
- DEFB 0ffH,04Ch,09h,'JMP '
- DEFB 0ffH,020h,09h,'JSR '
- DEFB 0ffH,0ADh,09h,'LDA '
- DEFB 0ffH,0AEh,09h,'LDX '
- DEFB 0ffH,0ACh,09h,'LDY '
- DEFB 0ffH,04Eh,09h,'LSR '
- DEFB 0ffH,00Dh,09h,'ORA '
- DEFB 0ffH,02Eh,09h,'ROL '
- DEFB 0ffH,06Eh,09h,'ROR '
- DEFB 0ffH,0EDh,09h,'SBC '
- DEFB 0ffH,08Dh,09h,'STA '
- DEFB 0ffH,08Eh,09h,'STX '
- DEFB 0ffH,08Ch,09h,'STY '
- DEFB 0ffH,065h,08h,'ADC '
- DEFB 0ffH,025h,08h,'AND '
- DEFB 0ffH,006h,08h,'ASL '
- DEFB 0ffH,024h,08h,'BIT '
- DEFB 0ffH,0C5h,08h,'CMP '
- DEFB 0ffH,0E4h,08h,'CPX '
- DEFB 0ffH,0C4h,08h,'CPY '
- DEFB 0ffH,0C6h,08h,'DEC '
- DEFB 0ffH,045h,08h,'EOR '
- DEFB 0ffH,0E6h,08h,'INC '
- DEFB 0ffH,0A5h,08h,'LDA '
- DEFB 0ffH,0A6h,08h,'LDX '
- DEFB 0ffH,0A4h,08h,'LDY '
- DEFB 0ffH,046h,08h,'LSR '
- DEFB 0ffH,005h,08h,'ORA '
- DEFB 0ffH,026h,08h,'ROL '
- DEFB 0ffH,066h,08h,'ROR '
- DEFB 0ffH,0E5h,08h,'SBC '
- DEFB 0ffH,085h,08h,'STA '
- DEFB 0ffH,086h,08h,'STX '
- DEFB 0ffH,084h,08h,'STY '
- DEFB 0ffH,075h,04h,'ADC '
- DEFB 0ffH,07dh,0ah,'ADC '
- DEFB 0ffH,079h,0bh,'ADC '
- DEFB 0ffH,061h,05h,'ADC '
- DEFB 0ffH,071h,06h,'ADC '
- DEFB 0ffH,035h,04h,'AND '
- DEFB 0ffH,03dh,0ah,'AND '
- DEFB 0ffH,039h,0bh,'AND '
- DEFB 0ffH,021h,05h,'AND '
- DEFB 0ffH,031h,06h,'AND '
- DEFB 0ffH,0d5h,04h,'CMP '
- DEFB 0ffH,0ddh,0ah,'CMP '
- DEFB 0ffH,0d9h,0bh,'CMP '
- DEFB 0ffH,0c1h,05h,'CMP '
- DEFB 0ffH,0d1h,06h,'CMP '
- DEFB 0ffH,055h,04h,'EOR '
- DEFB 0ffH,05dh,0ah,'EOR '
- DEFB 0ffH,059h,0bh,'EOR '
- DEFB 0ffH,041h,05h,'EOR '
- DEFB 0ffH,051h,06h,'EOR '
- DEFB 0ffH,0b5h,04h,'LDA '
- DEFB 0ffH,0bdh,0ah,'LDA '
- DEFB 0ffH,0b9h,0bh,'LDA '
- DEFB 0ffH,0a1h,05h,'LDA '
- DEFB 0ffH,0b1h,06h,'LDA '
- DEFB 0ffH,015h,04h,'ORA '
- DEFB 0ffH,01dh,0ah,'ORA '
- DEFB 0ffH,019h,0bh,'ORA '
- DEFB 0ffH,001h,05h,'ORA '
- DEFB 0ffH,011h,06h,'ORA '
- DEFB 0ffH,0f5h,04h,'SBC '
- DEFB 0ffH,0fdh,0ah,'SBC '
- DEFB 0ffH,0f9h,0bh,'SBC '
- DEFB 0ffH,0e1h,05h,'SBC '
- DEFB 0ffH,0f1h,06h,'SBC '
- DEFB 0ffH,095h,04h,'STA '
- DEFB 0ffH,09dh,0ah,'STA '
- DEFB 0ffH,099h,0bh,'STA '
- DEFB 0ffH,081h,05h,'STA '
- DEFB 0ffH,091h,06h,'STA '
- DEFB 0ffH,016h,04h,'ASL '
- DEFB 0ffH,01eh,0ah,'ASL '
- DEFB 0ffH,0d6h,04h,'DEC '
- DEFB 0ffH,0deh,0ah,'DEC '
- DEFB 0ffH,0f6h,04h,'INC '
- DEFB 0ffH,0feh,0ah,'INC '
- DEFB 0ffH,0b6h,04h,'LDX '
- DEFB 0ffH,0beh,0ah,'LDX '
- DEFB 0ffH,0b4h,04h,'LDY '
- DEFB 0ffH,0bch,0ah,'LDY '
- DEFB 0ffH,056h,04h,'LSR '
- DEFB 0ffH,05eh,0ah,'LSR '
- DEFB 0ffH,036h,04h,'ROL '
- DEFB 0ffH,03eh,0ah,'ROL '
- DEFB 0ffH,076h,04h,'ROR '
- DEFB 0ffH,07eh,0ah,'ROR '
- DEFB 0ffH,096h,07h,'STX '
- DEFB 0ffH,094h,04h,'STY '
- DEFB 0FFH,06CH,0cH,'JMP '
- DEFB 080H,000h,01h,0,0
- DEFB 080H,080h,01H,0,0
- ;
- ; END OF OPCODE TABLE
- ;
- ■╟!∙╥j7_mn\g╝∙CH≥a┘l$_┌