******************************** * MIKBUG AUTO PATCHER FOR MC3 * BY DANIEL TUFVESSON 2014 * * THIS PROGRAM LOOKS FOR MIKBUG * REFERENCES AND REPLACES THEM * WITH EQUAL MC3 ROUTINES * * TRIGGERS ON JMP AND BSR * - 7E E0 XX * - 7E E1 XX * - 7E A0 XX * - BD E0 XX * - BD E1 XX * - BD A0 XX * RETURN EQU $C000 RETURN TO MONITOR PDATA EQU $C009 PRINT TEXT STRING @ X ENDED BY $04 OUT2HS EQU $C012 PRINT 2 HEX CHARS @ X OUT4HS EQU $C015 PRINT 4 HEX CHARS @ X BADDR EQU $C01E INPUT ADDRESS TO X. CARRY SET = OK ORG $8000 JMP START TXCRLF FCB $0D,$0A,$04 TXSTART FCB $0D,$0A FCC 'MIKBUG AUTO PATCHER FOR MC3' FCB $0D,$0A FCC 'START ADDRESS: ' FCB $04 TXEND FCB $0D,$0A FCC 'END ADDRESS: ' FCB $04 TXPATCH FCC ' PATCHED' FCB $04 * PROGRAM BEGIN HERE START LDX #TXSTART JSR PDATA JSR BADDR BCC STERR STX CADDR SAVE START ADDRESS LDX #TXEND JSR PDATA JSR BADDR BCC STERR STX EADDR SAVE END ADDRESS LDX #TXCRLF JSR PDATA BRA LOOP BEGIN SEARCHING STERR JMP RETURN * SEARCH LOOP LOOP LDX CADDR LOOP1 LDAA ,X STX TEMP INX CMPA #$BD IS IT A JSR? BNE LOOP2 BRA LOOP3 LOOP2 CMPA #$7E IS IT A JMP? BNE LOOP1 LOOP3 STX CADDR CPX EADDR HAVE WE REACHED END BHI END OF SEARCH AREA? CPX $C000 HAVE WE REACHED ROM? BHI END OF SEARCH AREA? * FOUND OP CODE - CONTINUE TESTING LDAA ,X FETCH MSB OF OP PAYLOAD CMPA #$E0 MIKBUG AREA? BEQ MIKFND FOUND MIKBUG AREA CMPA #$E1 MIKBUG AREA? BEQ MIKFND FOUND MIKBUG AREA CMPA #$A0 MIKBUG RAM AREA? BEQ MIKWRN FOUND MIKBUG RAM AREA BRA LOOP1 NOT MIKBUG AREA, CONTINUE SEARCH * FOUND MIKBUG PROGRAM AREA MIKFND LDX #TEMP JSR OUT4HS LDX TEMP JSR OUT2HS JSR OUT2HS JSR OUT2HS STX CADDR UPDATE NEXT ADDRESS LDX TEMP LOCATE OP CODE PAYLOAD INX INX LDAB ,X JSR LOOKUP LOOKUP LSB CMPB #$FF BEQ TESTEND * REPLACE OP CODE PAYLOAD ADDRESS LDX #MC3TAB ABX LDAB ,X FETCH MC3 LSB LDX TEMP INX LDAA #$C0 STAA ,X INX STAB ,X LDX #TXPATCH JSR PDATA * END OF OP CODE TESTING - CONTINUE SEARCHING TESTEND LDX #TXCRLF JSR PDATA BRA LOOP CONTINUE SEARCHING * FOUND MIKBUG RAM AREA - PRINT ONLY MIKWRN LDX #TEMP JSR OUT4HS LDX TEMP JSR OUT2HS JSR OUT2HS JSR OUT2HS STX CADDR UPDATE NEXT ADDRESS BRA TESTEND END JMP RETURN * LOOKUP MIKBUG LSB IN TABLE * IN: B=LSB * OUT: B=TABLE OFFSET LOOKUP PSHA CLR TMP COUNTER LDX #MIKTAB LOKLOP LDAA ,X CBA BEQ LOKFND FOUND LSB IN TABLE INC TMP INX CPX #MIKTABE END OF TABLE BNE LOKLOP LDAB #$FF NOT FOUND PULA RTS LOKFND LDAB TMP LOAD OFFSET PULA RTS * LOOKUP TABLES MIKTAB FCB $47 BADDR FCB $55 BYTE FCB $67 OUTHL FCB $6B OUTHR FCB $7E PDATA FCB $AA INHEX FCB $C8 OUT4HS FCB $CA OUT2HS FCB $CC OUTS FCB $D0 START FCB $E3 CONTRL FCB $AC INEEE FCB $D1 OUTEEE MIKTABE EQU * MC3TAB FCB $1E BADDR FCB $1B INBYTE FCB $0F OUTHL FCB $0C OUTHR FCB $09 PDATA FCB $18 INHEX FCB $12 OUT4HS FCB $15 OUT2HS FCB $24 OUTS FCB $00 RETURN FCB $00 RETURN FCB $06 INCHAR FCB $03 OUTCHAR MC3TABE EQU * * VARIABLES CADDR RMB 2 CURRENT ADDRESS EADDR RMB 2 END ADDRESS TEMP RMB 2 TEMP AREA TMP RMB 1 TEMP AREA * MIKBUG ROUTINES *BADDR $E047 *BYTE $E055 *OUTHL $E067 *OUTHR $E06B *PDATA1 $E07E *INHEX $E0AA *OUT4HS $E0C8 *OUT2HS $E0CA *OUTS $E0CC *START $E0D0 *CONTRL $E0E3 *INEEE $E1AC *OUTEEE $E1D1