81 lines
1.0 KiB
ArmAsm
81 lines
1.0 KiB
ArmAsm
;; #LAYOUT# M65 KERNAL_0 #TAKE
|
|
;; #LAYOUT# M65 KERNAL_1 #TAKE
|
|
;; #LAYOUT# * * #IGNORE
|
|
|
|
; Exchanges BASIC part of the zero page with it's shadow location; tries to destroy as little memory as possible
|
|
|
|
|
|
m65_shadow_BZP:
|
|
|
|
!ifdef SEGMENT_M65_KERNAL_0 {
|
|
|
|
jsr map_KERNAL_1
|
|
jsr (VK1__m65_shadow_BZP)
|
|
jmp map_NORMAL
|
|
|
|
} else {
|
|
|
|
|
|
; Preserve CPU status and registers
|
|
|
|
php
|
|
phz
|
|
pha
|
|
phx
|
|
|
|
; We need a 4-byte pointer on the zero page; let's use the ones starting from FNLEN
|
|
|
|
ldx #$03
|
|
@1:
|
|
lda FNLEN,x
|
|
pha
|
|
dex
|
|
bpl @1
|
|
|
|
; Store the address of the ZP shadow location
|
|
|
|
lda #MEMCONF_SHADOW_BZP_0
|
|
sta FNLEN+0
|
|
lda #MEMCONF_SHADOW_BZP_1
|
|
sta FNLEN+1
|
|
lda #MEMCONF_SHADOW_BZP_2
|
|
sta FNLEN+2
|
|
lda #MEMCONF_SHADOW_BZP_3
|
|
sta FNLEN+3
|
|
|
|
; Exchange the ZP content
|
|
|
|
ldz #$00
|
|
ldx #$00
|
|
@2:
|
|
lda [FNLEN],z
|
|
pha
|
|
lda $02,x
|
|
sta [FNLEN],z
|
|
pla
|
|
sta $02,x
|
|
inz
|
|
inx
|
|
cpx #$8E
|
|
bne @2
|
|
|
|
; Restore FNLEN and further bytes
|
|
|
|
ldx #$00
|
|
@3:
|
|
pla
|
|
sta FNLEN,x
|
|
inx
|
|
cpx #$04
|
|
bne @3
|
|
|
|
; Restore registers and quit
|
|
|
|
plx
|
|
pla
|
|
plz
|
|
plp
|
|
|
|
rts
|
|
}
|