fix corner case, support > 256 files

This commit is contained in:
Peter Ferrie 2019-01-22 12:37:50 -08:00
parent f413d79f23
commit 53cde4e2e0
2 changed files with 41 additions and 13 deletions

View File

@ -34,6 +34,7 @@ ver_02 = 1
allow_subdir = 1 ;set to 1 to allow opening subdirectories to access files allow_subdir = 1 ;set to 1 to allow opening subdirectories to access files
might_exist = 1 ;set to 1 if file is not known to always exist already might_exist = 1 ;set to 1 if file is not known to always exist already
;makes use of status to indicate success or failure ;makes use of status to indicate success or failure
many_files = 1 ;set to 1 to support more than 256 files in a directory
allow_aux = 0 ;set to 1 to allow read/write directly to/from aux memory allow_aux = 0 ;set to 1 to allow read/write directly to/from aux memory
;requires load_high to be set for arbitrary memory access ;requires load_high to be set for arbitrary memory access
;else driver must be running from same memory target ;else driver must be running from same memory target
@ -132,6 +133,9 @@ ver_02 = 1
blokhi = $47 ;ProDOS constant blokhi = $47 ;ProDOS constant
entries = $3f ;(internal) total number of entries in directory entries = $3f ;(internal) total number of entries in directory
!if many_files = 1 {
entrieshi = $3b ;(internal) total number of entries in directory
} ;many_files
!if mem_swap = 0 { !if mem_swap = 0 {
!if rwts_mode = 1 { !if rwts_mode = 1 {
@ -726,16 +730,20 @@ unrblockhi = unrelocdsk + (* - reloc)
jsr readdirsel jsr readdirsel
readdir ;note that calling this location directly limits subdirectories to 14 entries! readdir ;note that calling this location directly limits subdirectories to 14 entries!
!if might_exist = 1 {
lda dirbuf + FILE_COUNT
sta entries
!if many_files = 1 {
lda dirbuf + FILE_COUNT + 1
sta entrieshi
} ;many_files
} ;might_exist
lda #NAME_LENGTH + ENTRY_SIZE lda #NAME_LENGTH + ENTRY_SIZE
firstent sta bloklo firstent sta bloklo
lda #>(dirbuf - 1) lda #>(dirbuf - 1)
sta blokhi sta blokhi
!if might_exist = 1 {
lda dirbuf + FILE_COUNT ;assuming only 256 files per subdirectory
sta entries
} ;might_exist
;there can be only one page crossed, so we can increment here ;there can be only one page crossed, so we can increment here
nextent1 inc blokhi nextent1 inc blokhi
@ -786,14 +794,22 @@ nextent ldy #0
!if might_exist = 1 { !if might_exist = 1 {
dec entries dec entries
bne + bne +
} ;might_exist !if many_files = 1 {
!if (might_exist + poll_drive) > 0 { lda entrieshi
bne ++
} ;many_files
!if poll_drive = 0 {
nodisk nodisk
unrdrvoff2 = unrelocdsk + (* - reloc) unrdrvoff2 = unrelocdsk + (* - reloc)
lda MOTOROFF lda MOTOROFF
inc status inc status
rts rts
} ;might_exist or poll_drive } ;poll_drive
!if many_files = 1 {
++ dec entrieshi
} ;many_files
} ;might_exist
;move to next entry in this block, if possible ;move to next entry in this block, if possible
@ -2081,16 +2097,20 @@ unrhddblockhi = unrelochdd + (* - reloc)
} ;enable_floppy } ;enable_floppy
hddreaddir ;note that calling this location directly limits subdirectories to 14 entries! hddreaddir ;note that calling this location directly limits subdirectories to 14 entries!
!if might_exist = 1 {
lda hdddirbuf + FILE_COUNT
sta entries
!if many_files = 1 {
lda hdddirbuf + FILE_COUNT + 1
sta entrieshi
} ;many_files
} ;might_exist
lda #NAME_LENGTH + ENTRY_SIZE lda #NAME_LENGTH + ENTRY_SIZE
hddfirstent sta bloklo hddfirstent sta bloklo
lda #>(hdddirbuf - 1) lda #>(hdddirbuf - 1)
sta blokhi sta blokhi
!if might_exist = 1 {
lda hdddirbuf + FILE_COUNT ;assuming only 256 files per subdirectory
sta entries
} ;might_exist
;there can be only one page crossed, so we can increment here ;there can be only one page crossed, so we can increment here
hddnextent1 inc blokhi hddnextent1 inc blokhi
@ -2141,8 +2161,16 @@ hddnextent ldy #0
!if might_exist = 1 { !if might_exist = 1 {
dec entries dec entries
bne + bne +
!if many_files = 1 {
lda entrieshi
bne ++
} ;many_files
inc status inc status
rts rts
!if many_files = 1 {
++ dec entrieshi
} ;many_files
} ;might_exist } ;might_exist
;move to next entry in this block, if possible ;move to next entry in this block, if possible

Binary file not shown.