diskio load and save use kernel routines for load and save, and don't bother with SEQ files

This commit is contained in:
Irmen de Jong 2020-10-14 22:33:49 +02:00
parent efe3ed499b
commit aba437e5a2
3 changed files with 57 additions and 49 deletions

View File

@ -77,63 +77,60 @@ io_error:
} }
str filename = "0:??????????????????????????????????????"
sub save(ubyte drivenumber, uword filenameptr, uword address, uword size) -> byte { sub save(ubyte drivenumber, uword filenameptr, uword address, uword size) -> byte {
ubyte flen = strlen(filenameptr) c64.SETNAM(strlen(filenameptr), filenameptr)
filename[0] = '0' c64.SETLFS(1, drivenumber, 0)
filename[1] = ':' uword end_address = address + size
memcopy(filenameptr, &filename+2, flen)
memcopy(",s,w", &filename+2+flen, 5)
c64.SETNAM(flen+6, filename)
c64.SETLFS(1, drivenumber, 1)
void c64.OPEN()
if_cs
goto io_error
c64.CHKOUT(1) %asm {{
if_cs lda address
goto io_error sta P8ZP_SCRATCH_W1
lda address+1
sta P8ZP_SCRATCH_W1+1
stx P8ZP_SCRATCH_REG
lda #<P8ZP_SCRATCH_W1
ldx end_address
ldy end_address+1
jsr c64.SAVE
php
ldx P8ZP_SCRATCH_REG
plp
}}
repeat size { if_cc
c64.CHROUT(@(address)) return c64.READST()==0
address++
}
io_error: return false
c64.CLRCHN()
c64.CLOSE(1)
return c64.READST()==0
} }
sub load(ubyte drivenumber, uword filenameptr, uword address) -> byte { sub load(ubyte drivenumber, uword filenameptr, uword address_override) -> uword {
ubyte flen = strlen(filenameptr) c64.SETNAM(strlen(filenameptr), filenameptr)
filename[0] = '0' ubyte secondary = 1
filename[1] = ':' uword end_of_load = 0
memcopy(filenameptr, &filename+2, flen) if address_override
memcopy(",s,r", &filename+2+flen, 5) secondary = 0
c64.SETNAM(flen+6, filename) c64.SETLFS(1, drivenumber, secondary)
c64.SETLFS(1, drivenumber, 2) %asm {{
void c64.OPEN() stx P8ZP_SCRATCH_REG
if_cs lda #0
goto io_error ldx address_override
void c64.CHKIN(1) ldy address_override+1
if_cs jsr c64.LOAD
goto io_error bcs +
stx end_of_load
sty end_of_load+1
+ ldx P8ZP_SCRATCH_REG
}}
do { if end_of_load
@(address) = c64.CHRIN() return end_of_load - address_override
address++
} until c64.READST()
io_error: return 0
c64.CLRCHN()
c64.CLOSE(1)
ubyte status = c64.READST()
return status==0 or status==64
} }
str filename = "0:??????????????????????????????????????"
sub delete(ubyte drivenumber, uword filenameptr) { sub delete(ubyte drivenumber, uword filenameptr) {
; -- delete a file on the drive ; -- delete a file on the drive
ubyte flen = strlen(filenameptr) ubyte flen = strlen(filenameptr)

View File

@ -1,12 +1,23 @@
%import textio %import textio
%import diskio %import diskio
%zeropage basicsafe %zeropage basicsafe
%option no_sysinit
main { main {
sub start() { sub start() {
txt.print("saving...")
diskio.delete(8, "data.bin")
if diskio.save(8, "data.bin", $0400, 40*25) {
txt.clear_screenchars('*')
txt.print("loading...")
uword size = diskio.load(8, "data.bin", $0400)
txt.print_uwhex(size, true)
txt.chrout('\n')
} else txt.print("io error\n")
testX()
} }

View File

@ -65,7 +65,7 @@ main {
} }
trader { trader {
str Savegame = "txtel.savegame" str Savegame = "↑commander.save"
str input = "??????????" str input = "??????????"
ubyte num_chars ubyte num_chars