ca65 V2.17 - Git 582aa41 Main file : disassembler.ca65 Current file: disassembler.ca65 000000r 1 ; 000000r 1 ; ACORN System 1 Applications: Disassembler 000000r 1 ; 000000r 1 ; From Computing Today April 1980 000000r 1 ; 000000r 1 ; (Chris Oddy January 2022) 000000r 1 ; 000000r 1 ; entry point $0200 000000r 1 ; 000000r 1 .setcpu "6502" 000000r 1 .listbytes unlimited 000000r 1 ; 000000r 1 MAP := $00 000000r 1 UPKEY := $16 000000r 1 DOT := $80 000000r 1 DISPLAY := $FE0C ; scan the display 000000r 1 DHEXTD := $FE6F ; double hex to display 000000r 1 SEARCH := $FF09 ; monitor reentry point 000000r 1 ; 000000r 1 .org $0200 000200 1 ; 000200 1 A2 07 DISASS: ldx #$07 ; first clear the display 000202 1 94 10 clear: sty $10,x 000204 1 CA dex 000205 1 D0 FB bne clear 000207 1 A5 00 lda MAP ; get opcode address 000209 1 20 6F FE jsr DHEXTD ; display least significant byte on left 00020C 1 A1 00 lda (MAP,x) ; get the opcode 00020E 1 A0 02 ldy #$02 000210 1 20 6F FE jsr DHEXTD ; display this on next pair of digits 000213 1 A1 00 lda (MAP,x) ; get it back and carry out disassembly 000215 1 29 0F and #$0F ; remove first digit 000217 1 F0 2C beq check ; if second digit=0 check for 3-byters 000219 1 C9 08 cmp #$08 00021B 1 90 0E bcc B2 ; if second digit<8 we have a 2-byter 00021D 1 F0 36 beq B1 ; if second digit=8 we have a 1-byter 00021F 1 C9 0A cmp #$0A 000221 1 F0 32 beq B1 ; if second digit=A we have a 1-byter 000223 1 B0 08 bcs B3 ; if second digit>A we have a 1-byter 000225 1 A1 00 lda (MAP,x) ; get it back again 000227 1 29 10 and #$10 ; we are left with 9's 000229 1 D0 02 bne B3 ; if first digit odd we have a 3-byter 00022B 1 A2 02 B2: ldx #$02 ; 2-Byte Opcode (remember in X) 00022D 1 88 B3: dey ; 3-Byte Opcode 00022E 1 B1 00 lda (MAP),y ; get second byte 000230 1 A0 04 ldy #$04 000232 1 20 6F FE jsr DHEXTD ; display it 000235 1 8A txa ; if x=0 we have a 3-byter 000236 1 D0 1F bne finish ; otherwise we have a 2-byter 000238 1 A0 02 ldy #$02 00023A 1 B1 00 lda (MAP),y ; get third byte 00023C 1 A0 06 ldy #$06 00023E 1 20 6F FE jsr DHEXTD ; display it 000241 1 A2 03 ldx #$03 000243 1 D0 12 bne finish ; 3-byte opcode finished 000245 1 A1 00 check: lda (MAP,x) ; check for complicating opcodes - get opcode again 000247 1 C9 20 cmp #$20 ; jsr ? 000249 1 F0 E2 beq B3 00024B 1 29 F0 and #$F0 ; remove second digit leaving first 00024D 1 C9 80 cmp #$80 ; greater than 8 ? 00024F 1 B0 DA bcs B2 ; - 2-byter 000251 1 29 10 and #$10 ; check if odd or even 000253 1 D0 D6 bne B2 ; odd - 2-byter, otherwise 000255 1 A2 01 B1: ldx #$01 ; 1-Byte Opcode - already finished 000257 1 E6 00 finish: inc MAP ; increment MAP x times 000259 1 D0 02 bne noinc ; to move to next opcode 00025B 1 E6 01 inc MAP+1 00025D 1 CA noinc: dex 00025E 1 D0 F7 bne finish ; increment again 000260 1 A2 05 ldx #$05 ; now put dots on every 000262 1 A9 80 dot: lda #DOT ; other digit to make it 000264 1 15 10 ora $10,x ; more readable 000266 1 95 10 sta $10,x 000268 1 CA dex 000269 1 CA dex 00026A 1 10 F6 bpl dot 00026C 1 20 0C FE jsr DISPLAY ; display disassembled opcode 00026F 1 C9 16 cmp #UPKEY ; was UP key pressed ? 000271 1 F0 8D beq DISASS ; yes - carry on 000273 1 4C 09 FF jmp SEARCH ; no - jump back to Monitor 000273 1