Release candidate 4

This commit is contained in:
Zane Kaminski 2020-07-25 01:06:56 -04:00
parent 50816d1499
commit 4df575bd62
4 changed files with 118 additions and 67 deletions

Binary file not shown.

Binary file not shown.

98
gsram_asm.s Normal file
View File

@ -0,0 +1,98 @@
.setcpu "65816"
.autoimport on
.importzp sp
.export _gsram_getsize
.macro A8
sep #$20 ; put the 65C816 in 8-bit accumulator mode
.A8
.endmacro
.macro I8
sep #$10 ; put the 65C816 in 8-bit index register mode
.I8
.endmacro
.macro AI8
sep #$30 ; put the 65C816 in 8-bit accumulator and index register mode
.A8
.I8
.endmacro
.macro A16
rep #$20 ; put the 65C816 in 8-bit accumulator mode
.A16
.endmacro
.macro I16
rep #$10 ; put the 65C816 in 8-bit index register mode
.I16
.endmacro
.macro AI16
rep #$30 ; put the 65C816 in 8-bit accumulator and index register mode
.A16
.I16
.endmacro
.segment "CODE"
.proc _gsram_getsize: near
.A8
.I8
; Preamble
php ; Push status
sei ; Disable interrupts
clc ; Clear carry
xce ; Clear emulation bit
php ; Push status
phb ; Push bank
AI8
; Store bank number at address 0xFFFF in each bank
ldy #$7F ; Start at bank 0x7F
BankSetLoop:
phy ; Push future bank
plb ; Pull bank
lda $8000 ; Get address 0xFFFF in this bank
pha ; Save old address 0xFFFF contents
tya ; A = Y
eor #$FF ; Flip all bits
tay ; Y = A
sty $8000 ; Overwrite address 0xFFFF with bank number
eor #$FF ; Flip all bits back
tay ; Y = A
dey ; Decrement bank number
cpy #$FF ; Have we wrapped around?
bne BankSetLoop ; If not, repeat
; Count banks with matching bank number
ldy #$00 ; Y is bank
ldx #$00 ; X is count
CountLoop:
phy ; Push future bank
plb ; Pull bank
tya ; A = Y
eor #$FF ; Flip all bits
tay ; Y = A
cpy $8000 ; Is bank num stored at address 0xFFFF?
bne AfterInc ; If not, skip increment
inx ; If so, increment bank count
AfterInc:
eor #$FF ; Flip all bits back
tay ; Y = A
pla ; Get contents to restore
sta $8000 ; Restore address 0xFFFF in this bank
iny ; Move to next bank
cpy #$80 ; Are we at bank 0x80 yet?
bne CountLoop ; If not, repeat
; Postamble
plb ; Restore bank
plp ; Restore status
xce ; Restore emulation bit
txa ; Transfer bank count to A
plp ; Pull status again to pull I flag
rts
.endproc

View File

@ -40,72 +40,15 @@
.segment "CODE" .segment "CODE"
.proc _gsram_getsize: near
.A8
.I8
; Preamble
sei ; Disable interrupts
clc ; Clear carry
xce ; Clear emulation bit
php ; Push status
phb ; Push bank
AI8
; Store bank number at address 0xFFFF in each bank
ldy #$7F ; Start at bank 0x7F
BankSetLoop:
phy ; Push future bank
plb ; Pull bank
lda $8000 ; Get address 0xFFFF in this bank
pha ; Save old address 0xFFFF contents
tya ; A = Y
eor #$FF ; Flip all bits
tay ; Y = A
sty $8000 ; Overwrite address 0xFFFF with bank number
eor #$FF ; Flip all bits back
tay ; Y = A
dey ; Decrement bank number
cpy #$FF ; Have we wrapped around?
bne BankSetLoop ; If not, repeat
; Count banks with matching bank number
ldy #$00 ; Y is bank
ldx #$00 ; X is count
CountLoop:
phy ; Push future bank
plb ; Pull bank
tya ; A = Y
eor #$FF ; Flip all bits
tay ; Y = A
cpy $8000 ; Is bank num stored at address 0xFFFF?
bne AfterInc ; If not, skip increment
inx ; If so, increment bank count
AfterInc:
eor #$FF ; Flip all bits back
tay ; Y = A
pla ; Get contents to restore
sta $8000 ; Restore address 0xFFFF in this bank
iny ; Move to next bank
cpy #$80 ; Are we at bank 0x80 yet?
bne CountLoop ; If not, repeat
; Postamble
plb ; Restore bank
plp ; Restore status
xce ; Restore emulation bit
cli ; Enable interrupts
txa ; Transfer bank count to A
rts
.endproc
.proc _ram2gs_getsize: near .proc _ram2gs_getsize: near
.A8 .A8
.I8 .I8
; Preamble ; Preamble
php ; Push status
sei ; Disable interrupts sei ; Disable interrupts
clc ; Clear carry clc ; Clear carry
xce ; Clear emulation bit xce ; Clear emulation bit
php ; Push status php ; Push status again, reflecting emulation bit
phb ; Push bank phb ; Push bank
AI8 AI8
@ -152,8 +95,8 @@
plb ; Restore bank plb ; Restore bank
plp ; Restore status plp ; Restore status
xce ; Restore emulation bit xce ; Restore emulation bit
cli ; Enable interrupts
txa ; Transfer bank count to A txa ; Transfer bank count to A
plp ; Pull status again to pull I flag
rts rts
.endproc .endproc
@ -210,10 +153,11 @@
.A8 .A8
.I8 .I8
; Preamble ; Preamble
php ; Push status
sei ; Disable interrupts sei ; Disable interrupts
clc ; Clear carry clc ; Clear carry
xce ; Clear emulation bit xce ; Clear emulation bit
php ; Push status php ; Push status again, reflecting emulation bit
phb ; Push bank phb ; Push bank
AI8 AI8
@ -278,16 +222,22 @@
plb ; Restore bank plb ; Restore bank
plp ; Restore status plp ; Restore status
xce ; Restore emulation bit xce ; Restore emulation bit
cli ; Enable interrupts plp ; Pull status again to pull I flag
rts rts
.endproc .endproc
.proc _ram2gs_cmd: near .proc _ram2gs_cmd: near
.A8 .A8
.I8 .I8
; Save current bank and command in accumulator ; Preamble
phb php ; Push status
pha sei ; Disable interrupts
clc ; Clear carry
xce ; Clear emulation bit
php ; Push status again, reflecting emulation bit
phb ; Push bank
pha ; Push command in accumulator
AI8
; Switch to bank 0xFB ; Switch to bank 0xFB
lda #$FB lda #$FB
pha pha
@ -300,7 +250,10 @@
; Pull and submit command ; Pull and submit command
pla pla
sta $FFFD sta $FFFD
; Restore bank and return ; Postamble
plb plb ; Restore bank
plp ; Restore status
xce ; Restore emulation bit
plp ; Pull status again to pull I flag
rts rts
.endproc .endproc