Code: Select all
VirtualAddress_to_BankedAddress:
lda virtualAddressL
sta bankedAddressL
lda virtualAddressH
and #$E0 ; hhh00000
asl ; h <- hh000000
rol ; h <- h000000h
rol ; h <- 000000hh
rol ; 0 <- 00000hhh, clears carry
adc #DATA_BANK
sta bankedBank
lda virtualAddressH
and #$1F
ora #$A0
sta bankedAddressH
rts
Code: Select all
BankedAddress_to_VirtualAddress:
lda bankedAddressL
sta virtualAddressL
lda bankedBank
sec
sbc #DATA_BANK ; 00000hhh
lsr ; 000000hh -> h
ror ; h000000h -> h
ror ; hh000000 -> h
ror ; hhh00000 -> 0
eor bankedAddressH ; hl hl hl l l l l l
and #$E0 ; hl hl hl 0 0 0 0 0
eor bankedAddressH ; h h h l l l l l
sta virtualAddressH
rts
Code: Select all
BankedAddress_IncreaseMSB:
inc bankedAddressH
; The 3 MSBs are usually 101, but become 110 when we advance to Cxxx.
bit bankedAddressH
bvc :+
; Wrap from BFFF -> A000 and increase RAM bank.
lda #$A0
sta bankedAddressH
inc bankedBank
:
rts