processor 6502 include "vcs.h" include "macro.h" include "xmacro.h" ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; seg.u Variables org $80 Temp .byte ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Macro that implements Bank Switching trampoline ; X = bank number ; A = hi byte of destination PC ; Y = lo byte of destination PC MAC BANK_SWITCH_TRAMPOLINE pha ; push hi byte tya ; Y -> A pha ; push lo byte lda $1FF8,x ; do the bank switch rts ; return to target ENDM ; Macro that performs bank switch MAC BANK_SWITCH .Bank SET {1} .Addr SET {2} lda #>(.Addr-1) ldy #<(.Addr-1) ldx #.Bank jmp BankSwitch ENDM seg Code ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; BANK 0 org $1000 rorg $F000 ;----The following code is the same on both banks---- Start ; Ensure that bank 0 is selected lda #>(Reset_0-1) ldy #<(Reset_0-1) ldx #0 BankSwitch BANK_SWITCH_TRAMPOLINE ;----End of bank-identical code---- Reset_0 CLEAN_START lda #$30 sta COLUBK ; make the screen red bit INPT4 ; test button bmi Reset_0 ; button not pressed, repeat ; Switch to Bank 2 routine lda #>(Main_1-1) ldy #<(Main_1-1) ldx #1 jmp BankSwitch ; Bank 0 epilogue org $1FFA rorg $FFFA .word Start ; NMI .word Start ; RESET .word Start ; BRK ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; BANK 1 org $2000 rorg $F000 ;----The following code is the same on both banks---- Start ; Ensure that bank 0 is selected lda #>(Reset_0-1) ldy #<(Reset_0-1) ldx #0 BankSwitch BANK_SWITCH_TRAMPOLINE ;----End of bank-identical code---- Main_1 inc Temp lda Temp sta COLUBK ; make rainbows bit INPT4 ; test button bpl Main_1 ; button is pressed, repeat BANK_SWITCH 0,Reset_0 ; Bank 1 epilogue org $2FFA rorg $FFFA .word Start ; NMI .word Start ; RESET .word Start ; BRK