Apple2: Provide a way to get directory file count
The information is available in the directory key block. Providing it to the user as soon as opendir() is done can save them costly code.
This commit is contained in:
committed by
Oliver Schmidt
parent
36132a437b
commit
40d9f3eed5
@@ -45,6 +45,7 @@ struct DIR {
|
||||
int fd;
|
||||
unsigned char entry_length;
|
||||
unsigned char entries_per_block;
|
||||
unsigned int file_count;
|
||||
unsigned char current_entry;
|
||||
union {
|
||||
unsigned char bytes[512];
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
FD .word
|
||||
ENTRY_LENGTH .byte
|
||||
ENTRIES_PER_BLOCK .byte
|
||||
FILE_COUNT .word
|
||||
CURRENT_ENTRY .byte
|
||||
|
||||
.union
|
||||
BYTES .byte 512
|
||||
.struct CONTENT
|
||||
|
||||
24
libsrc/apple2/dir_file_count.s
Normal file
24
libsrc/apple2/dir_file_count.s
Normal file
@@ -0,0 +1,24 @@
|
||||
;
|
||||
; Colin Leroy-Mira <colin@colino.net>, 2024
|
||||
;
|
||||
; unsigned int __fastcall__ dir_file_count(DIR *dir);
|
||||
;
|
||||
|
||||
.export _dir_file_count
|
||||
|
||||
.importzp ptr1
|
||||
|
||||
.include "apple2.inc"
|
||||
.include "dir.inc"
|
||||
|
||||
.proc _dir_file_count
|
||||
sta ptr1
|
||||
stx ptr1+1
|
||||
|
||||
ldy #DIR::FILE_COUNT + 1
|
||||
lda (ptr1),y
|
||||
tax
|
||||
dey
|
||||
lda (ptr1),y
|
||||
rts
|
||||
.endproc
|
||||
@@ -128,24 +128,23 @@
|
||||
; Read succeeded, populate dir struct
|
||||
jsr popptr1 ; Restore our dir pointer
|
||||
|
||||
ldy #$24 + DIR::BYTES
|
||||
lda (ptr1),y ; ENTRIES_PER_BLOCK
|
||||
pha ; Back it up
|
||||
|
||||
; Get file_count to entry_length from block
|
||||
ldy #$26 + DIR::BYTES
|
||||
: lda (ptr1),y
|
||||
pha
|
||||
dey
|
||||
lda (ptr1),y ; ENTRY_LENGTH
|
||||
cpy #$23 + DIR::BYTES - 1
|
||||
bne :-
|
||||
|
||||
; Set entry_length to file_count in struct
|
||||
ldy #DIR::ENTRY_LENGTH
|
||||
: pla
|
||||
sta (ptr1),y
|
||||
|
||||
pla
|
||||
.assert DIR::ENTRIES_PER_BLOCK = DIR::ENTRY_LENGTH + 1, error
|
||||
iny
|
||||
sta (ptr1),y
|
||||
cpy #DIR::CURRENT_ENTRY
|
||||
bne :-
|
||||
|
||||
; Skip directory header entry
|
||||
.assert DIR::CURRENT_ENTRY = DIR::ENTRIES_PER_BLOCK + 1, error
|
||||
iny
|
||||
lda #$01
|
||||
sta (ptr1),y
|
||||
|
||||
|
||||
Reference in New Issue
Block a user