====== Turbo 250 Mr.Z Disassembled ====== Written by FTC This was disassembled the other day using IDA Pro (an old but useable freeware dos version available at 6502.org) and then converted it into ACME format. The process involved "decoding" some EOR'ed blocks of code, and therefore slight changes had to be made to the startup code. (To be able to convert all parts of the program into readable assembler source rather than EOR'ed data.) The source is hardly labelled at all, but I guess it could still be nice to have a look at for some people. I might update it sometime, but don't count on it. I just couldn't resist looking under the hood of this extremely classic piece of software. ;) ;============================================================================ * = $0801 basic_startup: !byte $10 ; !byte 8 ; !byte $A ; !byte 0 ; !byte $9E ; !byte $32 ; 2 !byte $30 ; 0 !byte $36 ; 6 !byte $36 ; 6 !byte $20 ; eorval1: !byte $4D ; M eorval2: !byte $52 ; R eorval3: !byte $2E ; . eorval4: !byte $5A ; Z !byte 0 ; !byte 0 ; !byte 0 ; ;============================================================================ ; ldx lamerprotection ; stx $fb ldx #0 printmsg: ; code xref: 0824j lda string,x ;lda string-$4d,x ;$4d = EOR instructino at lamerprotection beq lamerprotection ;bypass message jsr $e716 ; eor $fb ; sta $fb inx bne printmsg lamerprotection: ; code xref: 081aj ; data xref: 0812r eor #$ff ; a=ff x=fa y=90 fb=d5 tay iny ldx #$ff txs ldx #$55 copy1: ; code xref: 083dj lda code1,y ; y=0 ; eor $fb ; fb=d5 ; eor $7b6,x ; 080d=$4d sta $2a7,y iny cpy #$58 bne copy1 ldy #0 copy2: ; code xref: 084fj lda code2,y ; eor $fb ; fb=d5 ; eor $7b7,x ; 080e=52 sta $334,y iny cpy #$c7 bne copy2 ldy #0 copy3: ; code xref: 0861j lda code3,y ; eor $fb ; fb=d5 ; eor $7b8,x ; 080f=2e sta $10b,y iny cpy #$97 bne copy3 ldy #0 copy4: ; code xref: 0873j lda code4,y ; eor $fb ; fb=d5 ; eor $7b9,x ; 0810=5a sta $ff3b,y iny cpy #$c5 bne copy4 lda #$a7 ldx #2 sta $308 ; basic caracter dispatch stx $309 jmp $a474 ; restart basic ;============================================================================ string: !byte $93 ; “ !byte $8E ; Ž !byte $B0 ; ° !byte $C3 ; Ã !byte $C3 ; Ã !byte $C3 ; Ã !byte $C3 ; Ã !byte $C3 ; Ã !byte $C3 ; Ã !byte $C3 ; Ã !byte $C3 ; Ã !byte $C3 ; Ã !byte $C3 ; Ã !byte $C3 ; Ã !byte $C3 ; Ã !byte $C3 ; Ã !byte $C3 ; Ã !byte $C3 ; Ã !byte $C3 ; Ã !byte $C3 ; Ã !byte $C3 ; Ã !byte $C3 ; Ã !byte $AE ; ® !byte $D ; !byte $C2 ; Â !byte $20 ; !byte $54 ; T !byte $55 ; U !byte $52 ; R !byte $42 ; B !byte $4F ; O !byte $20 ; !byte $32 ; 2 !byte $35 ; 5 !byte $30 ; 0 !byte $20 ; !byte $42 ; B !byte $59 ; Y !byte $20 ; !byte $4D ; M !byte $52 ; R !byte $2E ; . !byte $5A ; Z !byte $20 ; !byte $C2 ; Â !byte $D ; !byte $C2 ; Â !byte $43 ; C !byte $41 ; A !byte $4E ; N !byte $20 ; !byte $48 ; H !byte $41 ; A !byte $4E ; N !byte $44 ; D !byte $4C ; L !byte $45 ; E !byte $20 ; !byte $50 ; P !byte $52 ; R !byte $4F ; O !byte $47 ; G !byte $52 ; R !byte $41 ; A !byte $4D ; M !byte $53 ; S !byte $C2 ; Â !byte $D ; !byte $C2 ; Â !byte $42 ; B !byte $45 ; E !byte $54 ; T !byte $57 ; W !byte $45 ; E !byte $45 ; E !byte $4E ; N !byte $20 ; !byte $24 ; $ !byte $30 ; 0 !byte $38 ; 8 !byte $30 ; 0 !byte $31 ; 1 !byte $2D ; - !byte $24 ; $ !byte $46 ; F !byte $46 ; F !byte $33 ; 3 !byte $42 ; B !byte $C2 ; Â !byte $D ; !byte $AB ; « !byte $C3 ; Ã !byte $C3 ; Ã !byte $C3 ; Ã !byte $C3 ; Ã !byte $C3 ; Ã !byte $C3 ; Ã !byte $C3 ; Ã !byte $C3 ; Ã !byte $C3 ; Ã !byte $C3 ; Ã !byte $C3 ; Ã !byte $C3 ; Ã !byte $C3 ; Ã !byte $C3 ; Ã !byte $C3 ; Ã !byte $C3 ; Ã !byte $C3 ; Ã !byte $C3 ; Ã !byte $C3 ; Ã !byte $B3 ; ³ !byte $D ; !byte $C2 ; Â !byte $5F ; _ !byte $4C ; L !byte $20 ; !byte $20 ; !byte $20 ; !byte $20 ; !byte $20 ; !byte $20 ; !byte $20 ; !byte $20 ; !byte $4C ; L !byte $4F ; O !byte $41 ; A !byte $44 ; D !byte $20 ; !byte $50 ; P !byte $52 ; R !byte $4F ; O !byte $47 ; G !byte $C2 ; Â !byte $D ; !byte $C2 ; Â !byte $5F ; _ !byte $53 ; S !byte $20 ; !byte $28 ; ( !byte $4E ; N !byte $41 ; A !byte $4D ; M !byte $45 ; E !byte $29 ; ) !byte $20 ; !byte $53 ; S !byte $41 ; A !byte $56 ; V !byte $45 ; E !byte $20 ; !byte $50 ; P !byte $52 ; R !byte $4F ; O !byte $47 ; G !byte $C2 ; Â !byte $D ; !byte $AD ; ­ !byte $C3 ; Ã !byte $C3 ; Ã !byte $C3 ; Ã !byte $C3 ; Ã !byte $C3 ; Ã !byte $C3 ; Ã !byte $C3 ; Ã !byte $C3 ; Ã !byte $C3 ; Ã !byte $C3 ; Ã !byte $C3 ; Ã !byte $C3 ; Ã !byte $C3 ; Ã !byte $C3 ; Ã !byte $C3 ; Ã !byte $C3 ; Ã !byte $C3 ; Ã !byte $C3 ; Ã !byte $C3 ; Ã !byte $BD ; ½ !byte 0 ; ;################################################################################## ;################################################################################## ;################################################################################## code1: !pseudopc $2a7 { ;============================================================================ JSR $73 BEQ loc_0_2B0 CMP #$5F BEQ loc_0_2B3 loc_0_2B0: ; CODE XREF: 02AAj JMP $A7E7 ;============================================================================ loc_0_2B3: ; CODE XREF: 02AEj JSR $73 CMP #$4C BEQ loc_0_2C1 CMP #$53 BEQ loc_0_2C4 JMP $AF08 ;============================================================================ loc_0_2C1: ; CODE XREF: 02B8j JMP loc_0_111 ;============================================================================ loc_0_2C4: ; CODE XREF: 02BCj JMP loc_0_120 ;============================================================================ loc_0_2C7: ; CODE XREF: 011Aj LDX #0 STX $A STX $93 STX $90 loc_0_2CF: ; CODE XREF: 02DAj JSR loc_0_334 LDA $AB CMP #1 BEQ loc_0_2DC CMP #2 BNE loc_0_2CF loc_0_2DC: ; CODE XREF: 02D6j DEC $B3 JSR $F750 INC $B3 JSR $A82C JSR $F5D2 JSR loc_0_355 LDA $BD EOR $D7 BEQ loc_0_2F6 LDA #$FF STA $90 loc_0_2F6: ; CODE XREF: 02F0j JSR $F5A9 JSR $E195 JMP $A7AE ;============================================================================ } ;################################################################################## ;################################################################################## ;################################################################################## code2: !pseudopc $334 { ;============================================================================ loc_0_334: ; CODE XREF: 0339j JSR sub_0_388 CMP #0 BEQ loc_0_334 STA $AB loc_0_33D: ; CODE XREF: 0346j JSR sub_0_3B6 STA $AC,Y INY CPY #5 BNE loc_0_33D loc_0_348: ; CODE XREF: 0351j JSR sub_0_3B6 STA $23C,Y INY CPY #$15 BNE loc_0_348 BEQ sub_0_37C loc_0_355: JSR sub_0_388 loc_0_358: ; CODE XREF: 0373j JSR sub_0_3B6 LDA #4 STA 1 LDA $BD STA ($AC),Y LDA #7 STA 1 LDA $BD EOR $D7 STA $D7 JSR $FCDB JSR $FCD1 BCC loc_0_358 JSR sub_0_3B6 JSR sub_0_3E0 INY ;############################################################################ ; S u b r o u t i n e sub_0_37C: ; CODE XREF: 017Cp 0353j STY $C0 CLI CLC LDA #0 STA $2A0 JMP $FC93 ; End of function sub_0_37C ;############################################################################ ; S u b r o u t i n e sub_0_388: ; CODE XREF: 0334p 0355p JSR loc_0_10B JSR sub_0_3E0 STY $D7 LDA #7 STA $DD06 LDX #1 loc_0_397: ; CODE XREF: sub_0_388+18j ; sub_0_388+25j JSR sub_0_3C9 ROL $BD LDA $BD CMP #2 BNE loc_0_397 LDY #9 loc_0_3A4: ; CODE XREF: sub_0_388+21j JSR sub_0_3B6 CMP #2 BEQ loc_0_3A4 loc_0_3AB: ; CODE XREF: sub_0_388+2Bj CPY $BD BNE loc_0_397 JSR sub_0_3B6 DEY BNE loc_0_3AB RTS ; End of function sub_0_388 ;############################################################################ ; S u b r o u t i n e sub_0_3B6: ; CODE XREF: 033Dp 0348p 0358p 0375p ; ... LDA #8 STA $A3 loc_0_3BA: ; CODE XREF: sub_0_3B6+Ej JSR sub_0_3C9 ROL $BD NOP NOP NOP DEC $A3 BNE loc_0_3BA LDA $BD RTS ; End of function sub_0_3B6 ;############################################################################ ; S u b r o u t i n e sub_0_3C9: ; CODE XREF: sub_0_388+Fp sub_0_3B6+4p LDA #$10 loc_0_3CB: ; CODE XREF: sub_0_3C9+5j BIT $DC0D BEQ loc_0_3CB LDA $DD0D STX $DD07 PHA LDA #$19 STA $DD0F PLA LSR LSR RTS ; End of function sub_0_3C9 ;############################################################################ ; S u b r o u t i n e sub_0_3E0: ; CODE XREF: 0168p 0378p sub_0_388+3p LDY #0 STY $C0 LDA $D011 AND #$EF STA $D011 loc_0_3EC: ; CODE XREF: sub_0_3E0+Dj sub_0_3E0+10j DEX BNE loc_0_3EC DEY BNE loc_0_3EC SEI RTS ; End of function sub_0_3E0 ;============================================================================ irq: LDA #$37 ; '7' STA 1 JMP $FE69 ;============================================================================ } ;################################################################################## ;################################################################################## ;################################################################################## code3: ;!bin "block3.PRG",,2 !pseudopc $10b { ;============================================================================ loc_0_10B: JSR $F817 JMP $A82C ;============================================================================ loc_0_111: JSR $73 BEQ loc_0_11A CMP #$3A BNE loc_0_11D loc_0_11A: ; CODE XREF: 0114j JMP loc_0_2C7 ;============================================================================ loc_0_11D: ; CODE XREF: 0118j JMP $AF08 ;============================================================================ loc_0_120: LDX $37 LDY $38 STX $FB STY $FC LDX $2D LDY $2E STX $FD STY $FE LDX #$F8 LDY #7 STX $37 STY $38 LDX #$E8 LDY #7 STX $2D STY $2E JSR $A660 LDX #$82 LDY #1 STX $302 STY $303 JSR $73 JSR $E1D4 LDX #5 STX $AB DEX loc_0_158: ; CODE XREF: 015Dj LDA $2A,X STA $AB,X DEX BNE loc_0_158 JSR $F838 JSR $A82C JSR $F68F JSR sub_0_3E0 SEI LDA #$7F STA $DD0D LDA #4 STA 1 JSR loc_0_FF3B LDA #7 STA 1 JSR sub_0_37C JMP $A474 ;============================================================================ LDA #$83 STA $302 LDA #$A4 STA $303 LDA $FB STA $37 LDA $FC STA $38 LDA $FD STA $2D LDA $FE STA $2E JSR $A660 JMP ($302) ;============================================================================ } ;################################################################################## ;################################################################################## ;################################################################################## code4: !pseudopc $ff3b { ;============================================================================ loc_0_FF3B: LDA $FD STA $AE LDA $FE STA $AF JSR sub_0_FFAB LDA $B9 LDA #2 NOP DEX JSR sub_0_FFCB LDX #8 loc_0_FF51: ; CODE XREF: FF5Dj LDA $AC,Y JSR sub_0_FFCB LDX #6 INY CPY #5 NOP BNE loc_0_FF51 LDY #0 LDX #4 loc_0_FF63: ; CODE XREF: FF74j LDA ($BB),Y CPY $B7 BCC loc_0_FF6C LDA #$20 DEX loc_0_FF6C: ; CODE XREF: FF67j JSR sub_0_FFCB LDX #5 INY CPY #$BB BNE loc_0_FF63 LDA #2 STA $AB JSR sub_0_FFAB TYA JSR sub_0_FFCB STY $D7 LDX #7 NOP loc_0_FF86: ; CODE XREF: FF9Dj LDA ($AC),Y JSR sub_0_FFCB LDX #3 INC $AC BNE loc_0_FF95 INC $AD DEX DEX loc_0_FF95: ; CODE XREF: FF8Fj LDA $AC CMP $AE LDA $AD SBC $AF BCC loc_0_FF86 loc_0_FF9F: ; CODE XREF: FFA7j LDA $D7 JSR sub_0_FFCB LDX #7 DEY BNE loc_0_FF9F INY RTS ;############################################################################ ; S u b r o u t i n e sub_0_FFAB: ; CODE XREF: FF43p FF7Ap LDY #0 loc_0_FFAD: ; CODE XREF: sub_0_FFAB+Cj ; sub_0_FFAB+12j LDA #2 JSR sub_0_FFCB LDX #7 DEY CPY #9 BNE loc_0_FFAD LDX #5 DEC $AB BNE loc_0_FFAD loc_0_FFBF: ; CODE XREF: sub_0_FFAB+1Bj TYA JSR sub_0_FFCB LDX #7 DEY BNE loc_0_FFBF DEX DEX RTS ; End of function sub_0_FFAB ;############################################################################ ; S u b r o u t i n e sub_0_FFCB: ; CODE XREF: FF4Cp FF54p FF6Cp FF7Ep ; ... STA $BD EOR $D7 STA $D7 LDA #8 STA $A3 loc_0_FFD5: ; CODE XREF: sub_0_FFCB+1Fj ASL $BD LDA 1 AND #$F7 JSR sub_0_FFED LDX #$11 NOP ORA #8 JSR sub_0_FFED LDX #$E DEC $A3 BNE loc_0_FFD5 RTS ; End of function sub_0_FFCB ;############################################################################ ; S u b r o u t i n e sub_0_FFED: ; CODE XREF: sub_0_FFCB+10p ; sub_0_FFCB+18p sub_0_FFED+1j DEX BNE sub_0_FFED BCC loc_0_FFF7 LDX #$B loc_0_FFF4: ; CODE XREF: sub_0_FFED+8j DEX BNE loc_0_FFF4 loc_0_FFF7: ; CODE XREF: sub_0_FFED+3j STA 1 RTS ; End of function sub_0_FFED ;============================================================================ ;Interrupt handler pointers which ends up at $fffa - $ffff !WORD irq !WORD irq !WORD irq }