got rid of diskio.have_first_byte overhead

This commit is contained in:
Irmen de Jong 2022-11-23 02:43:22 +01:00
parent 68b112837a
commit d4a35ba6ff
3 changed files with 21 additions and 62 deletions

View File

@ -96,14 +96,6 @@ internal_vload:
return 0 return 0
diskio.list_blocks = 0 ; we reuse this variable for the total number of bytes read diskio.list_blocks = 0 ; we reuse this variable for the total number of bytes read
if diskio.have_first_byte {
diskio.have_first_byte=false
@(bufferpointer) = diskio.first_byte
bufferpointer++
diskio.list_blocks++
num_bytes--
}
void c64.CHKIN(12) ; use #12 as input channel again void c64.CHKIN(12) ; use #12 as input channel again
; commander X16 supports fast block-read via macptr() kernal call ; commander X16 supports fast block-read via macptr() kernal call
@ -137,7 +129,7 @@ byte_read_loop: ; fallback if macptr() isn't supported on the device
repeat num_bytes { repeat num_bytes {
%asm {{ %asm {{
jsr c64.CHRIN jsr c64.CHRIN
sta cx16.r5 sta cx16.r5L
m_in_buffer sta $ffff m_in_buffer sta $ffff
inc m_in_buffer+1 inc m_in_buffer+1
bne + bne +
@ -148,13 +140,13 @@ m_in_buffer sta $ffff
+ +
}} }}
if cx16.r5==$0d { ; chance on I/o error status? if cx16.r5L==$0d { ; chance on I/o error status?
diskio.first_byte = c64.READST() cx16.r5L = c64.READST()
if diskio.first_byte & $40 { if cx16.r5L & $40 {
diskio.f_close() ; end of file, close it diskio.f_close() ; end of file, close it
diskio.list_blocks-- ; don't count that last CHRIN read diskio.list_blocks-- ; don't count that last CHRIN read
} }
if diskio.first_byte if cx16.r5L
return diskio.list_blocks ; number of bytes read return diskio.list_blocks ; number of bytes read
} }
} }
@ -169,13 +161,6 @@ m_in_buffer sta $ffff
return 0 return 0
uword total_read = 0 uword total_read = 0
if diskio.have_first_byte {
diskio.have_first_byte=false
@(bufferpointer) = diskio.first_byte
bufferpointer++
total_read = 1
}
while not c64.READST() { while not c64.READST() {
uword size = cx16diskio.f_read(bufferpointer, 256) uword size = cx16diskio.f_read(bufferpointer, 256)
total_read += size total_read += size
@ -238,7 +223,6 @@ m_in_buffer sta $ffff
c64.SETLFS(15, diskio.last_drivenumber, 15) c64.SETLFS(15, diskio.last_drivenumber, 15)
void c64.OPEN() void c64.OPEN()
c64.CLOSE(15) c64.CLOSE(15)
diskio.have_first_byte = false
} }
; TODO see if we can get this to work as well: ; TODO see if we can get this to work as well:

View File

@ -107,8 +107,6 @@ io_error:
uword list_pattern uword list_pattern
uword list_blocks uword list_blocks
bool iteration_in_progress = false bool iteration_in_progress = false
ubyte @zp first_byte
bool have_first_byte
ubyte last_drivenumber = 8 ; which drive was last used for a f_open operation? ubyte last_drivenumber = 8 ; which drive was last used for a f_open operation?
str list_filetype = "???" ; prg, seq, dir str list_filetype = "???" ; prg, seq, dir
str list_filename = "?" * 50 str list_filename = "?" * 50
@ -264,12 +262,13 @@ close_end:
if_cc { if_cc {
if c64.READST()==0 { if c64.READST()==0 {
iteration_in_progress = true iteration_in_progress = true
have_first_byte = false void c64.CHKIN(12) ; use #12 as input channel
void c64.CHKIN(12) ; use #12 as input channel
if_cc { if_cc {
first_byte = c64.CHRIN() ; read first byte to test for file not found void c64.CHRIN() ; read first byte to test for file not found
if not c64.READST() { if not c64.READST() {
have_first_byte = true c64.CLOSE(12) ; close file because we already consumed first byte
void c64.OPEN() ; re-open the file
void c64.CHKIN(12)
return true return true
} }
} }
@ -288,14 +287,6 @@ close_end:
return 0 return 0
list_blocks = 0 ; we reuse this variable for the total number of bytes read list_blocks = 0 ; we reuse this variable for the total number of bytes read
if have_first_byte {
have_first_byte=false
@(bufferpointer) = first_byte
bufferpointer++
list_blocks++
num_bytes--
}
void c64.CHKIN(12) ; use #12 as input channel again void c64.CHKIN(12) ; use #12 as input channel again
%asm {{ %asm {{
@ -307,7 +298,7 @@ close_end:
repeat num_bytes { repeat num_bytes {
%asm {{ %asm {{
jsr c64.CHRIN jsr c64.CHRIN
sta cx16.r5 sta cx16.r5L
m_in_buffer sta $ffff m_in_buffer sta $ffff
inc m_in_buffer+1 inc m_in_buffer+1
bne + bne +
@ -318,13 +309,13 @@ m_in_buffer sta $ffff
+ +
}} }}
if cx16.r5==$0d { ; chance on I/o error status? if cx16.r5L==$0d { ; chance on I/o error status?
first_byte = c64.READST() cx16.r5L = c64.READST()
if first_byte & $40 { if cx16.r5L & $40 {
f_close() ; end of file, close it f_close() ; end of file, close it
list_blocks-- ; don't count that last CHRIN read list_blocks-- ; don't count that last CHRIN read
} }
if first_byte if cx16.r5L
return list_blocks ; number of bytes read return list_blocks ; number of bytes read
} }
} }
@ -337,13 +328,6 @@ m_in_buffer sta $ffff
return 0 return 0
uword total_read = 0 uword total_read = 0
if have_first_byte {
have_first_byte=false
@(bufferpointer) = first_byte
bufferpointer++
total_read = 1
}
while not c64.READST() { while not c64.READST() {
uword size = f_read(bufferpointer, 256) uword size = f_read(bufferpointer, 256)
total_read += size total_read += size
@ -364,13 +348,6 @@ m_in_buffer sta $ffff
ldx #12 ldx #12
jsr c64.CHKIN ; use channel 12 again for input jsr c64.CHKIN ; use channel 12 again for input
ldy #0 ldy #0
lda have_first_byte
beq _loop
lda #0
sta have_first_byte
lda first_byte
sta (P8ZP_SCRATCH_W1),y
iny
_loop jsr c64.CHRIN _loop jsr c64.CHRIN
sta (P8ZP_SCRATCH_W1),y sta (P8ZP_SCRATCH_W1),y
beq _end beq _end
@ -449,10 +426,10 @@ _end rts
goto io_error goto io_error
while not c64.READST() { while not c64.READST() {
first_byte = c64.CHRIN() cx16.r5L = c64.CHRIN()
if first_byte=='\r' or first_byte=='\n' if cx16.r5L=='\r' or cx16.r5L=='\n'
break break
@(messageptr) = first_byte @(messageptr) = cx16.r5L
messageptr++ messageptr++
} }
@(messageptr) = 0 @(messageptr) = 0
@ -471,7 +448,7 @@ io_error:
c64.SETNAM(string.length(filenameptr), filenameptr) c64.SETNAM(string.length(filenameptr), filenameptr)
c64.SETLFS(1, drivenumber, 0) c64.SETLFS(1, drivenumber, 0)
uword @shared end_address = address + size uword @shared end_address = address + size
first_byte = 0 ; result var reuse cx16.r0L = 0
%asm {{ %asm {{
lda address lda address
@ -489,12 +466,12 @@ io_error:
}} }}
if_cc if_cc
first_byte = c64.READST()==0 cx16.r0L = c64.READST()==0
c64.CLRCHN() c64.CLRCHN()
c64.CLOSE(1) c64.CLOSE(1)
return first_byte return cx16.r0L
} }
; Use kernal LOAD routine to load the given program file in memory. ; Use kernal LOAD routine to load the given program file in memory.

View File

@ -3,8 +3,6 @@ TODO
For next release For next release
^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^
- get rid of diskio.have_first_byte. But detecting invalid filenames should still work.
- check diskio.status(), fix diskio.f_readline
- diskio.f_read doesn't signal end of file condition if the requested number of bytes==1 ? - diskio.f_read doesn't signal end of file condition if the requested number of bytes==1 ?
- diskio.f_read doesn't work if used after seek with buffer too small? - diskio.f_read doesn't work if used after seek with buffer too small?
- ir/vm: check weird asm chunks appearing in block? - ir/vm: check weird asm chunks appearing in block?