* * PEEK+POKE+WAIT 24-bit patch for the SuperCPU * * Patch code copies BASIC ROM to RAM, patches certain * routines, and adds some code to the casette buffer * at 828. * * Vers. 2: Change only LDA (),Y -> LDA [], use $50 $51 $52 * as 24-bit address. (but also $14 $15 as before). This * should maximize compatibility. * * Note that SYS patch is trivial. * * Stephen L. Judd 12/6/97 * * 1/3/98 Added SYS and LOAD patches. * DEST = $CE00 ;Casette buffer LINNUM = $14 ;Variable NUM24 = $50 ;New 24-bit dest. CHRGET = $73 TXTPTR = $7A HIGHPTR = $AB ;High byte of end save addr. *=============================== GETBYTE = $B79B GETNUM = $B7EB GETCHK = GETNUM+6 GETADR = $B7F7 PEEK = $B80D POKE = $B824 WAIT = $B82D *=============================== * GETADR patch -> GETADR+7 P1ADR = GETADR+7 PATCH1 = $99 ;CMP #$91 -> CMP #$99 * GETADR patch -> GETADR+$0D P2ADR = GETADR+$0D PATCH2 = $4C ;JMP LINFETCH * PEEK patch -> PEEK+9 P3ADR = PEEK+11 PATCH3A = $A7 ;LDA [$50] PATCH3B = NUM24 * POKE patch -> POKE+4 P4ADR = POKE+6 PATCH4A = $87 ;STA [$50] PATCH4B = PATCH3B * WAIT patch -> WAIT+17 P5ADR = WAIT+19 PATCH5A = PATCH3A ;LDA [$50] PATCH5B = PATCH3B *=============================== ORG $0801 DA LINK DA 3172 ;Line number DFB $9E ;SYS TXT '2063:' DFB $A2 ;NEW DFB 00 LINK DA 0 * Patch BASIC LDX #ENDCODE-CODE ;Copy extra routines :LCOPY LDA CODE,X STA DEST,X DEX CPX #$FF BNE :LCOPY * Init IEVAL vector LDA $030A ;Old IEVAL STA $0334 LDA $030B STA $0335 LDA #HEXEVAL STA $030B * Set up bank 1 patches CLC DFB $FB ;xce DFB $E2,$30 ;sep #$30 LDA #$01 PHA DFB $AB ;PLB -- store to bank 1 * Patch BASIC LDA #PATCH1 ;GETADR STA P1ADR LDA #PATCH2 STA P2ADR LDA #LINFETCH STA P2ADR+2 LDA #PATCH3A ;PEEK+WAIT STA P3ADR STA P5ADR LDA #PATCH3B STA P3ADR+1 STA P5ADR+1 STA P4ADR+1 ;POKE LDA #PATCH4A STA P4ADR * Patch SYS LDA #$DC ;JMP [] STA $E144 LDA #NUM24 STA $E145 * Get filename+address patch LDA #GETIT STA $E1F8 * Patch SAVE routine SPATCH LDA #SAVE STA $E158 LDA #SB0 STA $F607 LDA #$04 STA $F5F5 ;CMP #$04 LDA #$90 ;BCC ... STA $F5F6 LDA #$A6 ;LDX $B9 STA $F5F8 LDA #$B9 STA $F5F9 LDA #$AE ;start address in $AE/F STA $F61B LDA #$AF STA $F620 LDA #$EA ;NOP out $C1->$AC copy STA $F617 STA $F618 STA $F619 LDA #CMPSAVE STA $F626 LDA #INCSAVE STA $F63C LDA #$A7 ;LDA [$AE] STA $F629 LDA #$AE STA $F62A * Patch LOAD routine LPATCH LDA #LOAD STA $E16E LDA #$C7 STA $F512 ;CMP [$AE] LDA #$87 STA $F51C ;STA [$AE] STA $F7E5 STA $F7F0 LDA #$20 STA $F51E ;JSR INCSAVE STA $F7E7 LDA #INCSAVE STA $F520 STA $F7E9 LDA #$EA ;NOP NOP NOP STA $F521 STA $F522 STA $F523 STA $F7EA STA $F7EB STA $F7EC LDA #$B0 STA $F75B ;LDA $00B0,Y LDA #$B3 STA $F765 ;sprites -> $B3 STA $F7FF INC $F805 ;PLA/STA etc. INC $F808 INC $F80B SEC DFB $FB ;xce LDA #$00 PHA DFB $AB ;PLB -- store to bank 0 * Further LOAD patch LDX #F4C1-F4A7-1 :LOOP LDA F4A7,X HEX 9FA7F401 ;STA $01F4A7,X DEX BPL :LOOP RTS F4A7 HEX 6490 ;STZ $90 LDA $BA CMP #$04 BCS :CONT JMP $F713 :CONT LDY $B7 BNE :C2 JMP $F2CC :C2 LDX $B9 BPL :C3 ;Really just want $FF INX HEX 2C :C3 HEX 64B0 ;STZ $B0 F4C1 CODE ORG DEST * Patch EVAL to read in hex values HEXEVAL JSR CHRGET CMP #'$' BNE NOPE LDA #$C0 STA $0E ;128+64 = 24-bit integer LDA #00 STA $61 ;FAC1=0 STA $0D ;VALTYP = numeric LOOP JSR CHRGET BEQ LINRTS BCC :NUMBER SBC #8 ;A-F will be 10-15 :NUMBER SBC #47 CMP #16 BCC OK ;Can use e.g. $d0+5 now CMP #46-55 ;Check for decimal pt. BNE LINRTS ERROR LDX #14 ;Illegal quantity JMP ($0300) OK PHA LDA #SIXTEEN JSR $BA28 ;Multiply FAC1 by 16 PLA JSR $BD7E ;Add to FAC1 JMP LOOP NOPE LDX TXTPTR ;Back up TXTPTR BNE :SKIP DEC TXTPTR+1 :SKIP DEC TXTPTR JMP ($0334) ;Normal routine SIXTEEN FLO 16 ;16 in 5-byte fp ($85 00 00 00 00) TXT 'judd' * * Copy bytes of FAC1 into LINNUM and NUM24 * * On exit, .Y .A = LINNUM+1, LINNUM * LINFETCH LDA $63 ;high STA NUM24+2 LDA $64 ;med LDY $65 ;low STY LINNUM STY NUM24 STA LINNUM+1 STA NUM24+1 LINRTS RTS * * Patch LOAD+SAVE command to read address if present. * SAVE JSR GETPARMS ;Get 1st two parms BNE LINRTS ;Exit JSR SETNUM ;$AC is now start address JSR GETIT JSR CHEK24 BNE ERROR ;require another address LDY NUM24+1 ;end address LDA NUM24+2 STA HIGHPTR PLA PLA LDA #$AC ;start address JMP $E156+9 LOAD JSR GETPARMS BNE LINRTS JSR SETNUM PLA ;old return address PLA LDA $0A JMP $E16C+9 ;Into the load routine GETIT JSR $E20E ;Check for comma JSR $AD8A ;get number JSR $B7F7 ;convert to int LDX NUM24 ;low byte in .X RTS GETPARMS JSR $E1D4 ;Get 1st two parms CHEK24 LDY #$FF LDA $0E ;Check for 24-bit hex value CMP #$C0 BNE :RTS STY $B9 ;SA -- 24-bit flag :RTS RTS SETNUM LDX NUM24 STX $AC ;SAVE start addresses LDY NUM24+1 STY $AD LDA NUM24+2 STA $B0 ;Always high address RTS * * SAVE compare and increment routines * CMPSAVE SEC LDA $AE SBC $AC LDA $AF SBC $AD LDA $B0 SBC HIGHPTR RTS INCSAVE INC $AE BNE :RTS INC $AF BNE :RTS INC $B0 :RTS RTS * * Patch SAVE variables * SB0 INX ;.X contains SA BEQ :SKIP ;One byte short of a fit into DFB $64,$B0 ;SAVE itself. DFB $64,HIGHPTR ;STZ :SKIP LDA $C1 ;start address -> $AE LDX $AE ;end address -> $AC STA $AE STX $AC LDA $C2 LDX $AF STA $AF STX $AD JMP $F3D5 ;continue as normal ORG ;re-org ENDCODE ;ENDCODE-CODE bytes