6502 Disassembler

Started by Blacklord, August 09, 2009, 08:33 AM

Previous topic - Next topic

0 Members and 2 Guests are viewing this topic.

Blacklord

5 DIMR$ (257)
10 PRINT "6502 DISASSEMBLER" : PRINT : PRINT
15 GOSUB250
20 PRINT "ENTER START ADDRESS"
25 PRINT "IN HEX, USE 4 DIGITS."
30 INPUTA$
35 GOSUB900
40 Z = PEEK(S) : A = S
55 GOSUB1000 : REM-GET HX ADR
60 PRINTER$ : TH$ : TW$ : OE$; " ";
65 IFR$(Z) = "" THENPRINT "INVALID CODE" : GOTO20
70 A = Z : GOSUB1000
75 PRINTTW$; OE$; " "; LEFT$(R$(Z), 3); " ";
85 U$ = RIGHT$ (R$(Z), 1)
90 IFU$ = " " THENPRINTU$:S = S + 1 : GOTO40
95 IFU$ = "N" THENPRINT "A*"; : GOTO600
100 IFU$ = "A" THENPRINTU$ : S = S+1 : GOTO40
105 IFU$ = "Z" THENPRINT "A*"; : GOTO625
110 IFU$ = "*" THENPRINT "*$"; : GOTO625
115 IFU$ = "X" THENPRINT "A*"; : GOTO645
120 IFU$ = "Y" THENPRINT "A*"; : GOTO665
125 IFU$ = "B" THENPRINT " ("; : GOTO685
130 IFU$ = "C" THENPRINT " ("; : GOTO700
135 IFU$ = "U" THENPRINT "A*"; : GOTO715
140 IFU$ = "R" THENPRINT "TO"; : GOTO765
145 IFU$ = "J" THENPRINT " ("; : GOTO735
150 IFU$ = "V" THENPRINT "A*"; : GOTO755
250 FORX = 0TO255 : READM$ : R$(X) = M$ : NEXT
255 DATABRK , ORAB, , , ,ORAZ, ASLZ,, PHP , ORA*, ASLA,,, ORAN
260 DATAASLN,, RPLR, ORAC,,,, DRAU, ASLU,,CLC , ORAY,,,, DRAX
265 DATAASLX,, JSRN, ANDB,,, BITZ,ANDZ,ROLZ,,PLP ,AND*, ROLA,, BITN
270 DATAANDU,ROLN,, BMIR,ANDC,,,,ANDU,ROLU,,SEC , ANDY,,,
275 DATAANDX, ROLX,,RTI ,EORB,,,, EORZ,LSRZ,, PHA , EDR*, LSRA,, JMPN
280 DATAEORN, LSRN,, BVCR, EORC,,,, EORU, LSRU,, CLI, EORY,,,
285 DATAFORX, LSRX,, RTS , ADCB,,,, ADCZ,RORZ,,PLA , ADC*, RORA,, JMP J
290 DATAADCN,RORN,,BVSR,ADCC,,,,ADCU,RORU,,SEI ,ADCY,,,, ADCX,,,
295 DATASTAB,,, STYZ, STAZ, STXZ,, DEY ,, TXA ,, STYN, STAN, STXN,, BCCR
300 DATASTAC,,, STYU,STAU,STXV,, TYA , STAY,TXS ,,, STAX,,,LDY*
305 DATALDAB, LDX*,, LDYZ, LDAZ, LDXZ,, TAY , LDA*, TAX ,, LDYN, LDAN, LDXN
310 DATA,BCSR, LDAC,,,LDYU, LDAU, LDXV,, CLV , LDAY, TSX ,, LDYX,LDAX
315 DATALDXY,, CPY*, CMPB,,, CPYZ, CMPZ, DECZ,, INY , CMP*, DEX ,
320 DATACPYN, CMPN, DECN,, BNER, CMPC,,,, CMPU, DECU,, CLD , CMPY,,,
325 DATACMPX, DECX,, CPX*, SBCB,,, CPXZ, SBCZ,INCZ,, INX ,SBC*, NOP ,
330 DATACPXN, SBCN,INCN,, BEQR, SBCC,,,
335 DATASBCU, INCU,, SED , SBCY,,,,SBCX, INCX,
340 RETURN
600 A = PEEK (S+2) : GOSUB1000
605 PRINTTW$; OE$;
610 A = PEEK (S+1) : GOSUB1000
615 PRINTTW$; OE$
620 S = S + 3 : GOTO40
625 A = PEEK (S+1) : GOSUB1000
630 PRINTTW$; OE$
632 S = S+2 : GOTO40
645 A = PEEK (S+2) : GOSUB1000
650 PRINTTW$; OE$;
655 A = PEEK (S+1) : GOSUB1000
660 PRINTTW$; OE$; ,X:S = S +3 : GOTO40
665 A = PEEK (S+2) : GOSUB1000
670 PRINTTW$; OE$;
675 A = PEEK (S+1) : GOSUB1000
680 PRINTTW$: OE$; " , Y" : S = S+3: GOTO40


The format of the resultant printout pretty much follows standard assembler notation, with one exception. When relative addressing mode is encountered, the program prints the hex address to which the branch occurs, rather than the hex offset. I found this to be much more convenient when disassembling. Since it is a one pass only disassembler, the use of labels was out, but this works just as well in my opinion.