1
0
mirror of https://github.com/cc65/cc65.git synced 2024-12-23 04:30:10 +00:00
cc65/libsrc/apple2/readdir.s
2024-11-17 11:03:58 +01:00

114 lines
2.8 KiB
ArmAsm

;
; Colin Leroy-Mira <colin@colino.net>, 2024
;
; struct dirent * __fastcall__ readdir (DIR *dir)
;
.export _readdir
.import read_dir_block_ptr1
.import incax1, return0
.import tosaddax, tosumula0, incaxy
.import pushax, pusha0, pushptr1, popptr1
.importzp ptr1, ptr4
.include "dir.inc"
.proc _readdir
sta ptr1
stx ptr1+1
@next_entry:
; Do we need to read the next directory block?
ldy #DIR::CURRENT_ENTRY
lda (ptr1),y
ldy #DIR::ENTRIES_PER_BLOCK
cmp (ptr1),y
bne @read_entry ; We don't
jsr read_dir_block_ptr1
bcc @read_ok
; We had a read error
jmp return0
@read_ok:
ldy #DIR::CURRENT_ENTRY
lda #$00
sta (ptr1),y
@read_entry:
; Compute pointer to current entry:
; entry = dir->block.content.entries +
; dir->current_entry * dir->entry_length
jsr pushptr1 ; Backup ptr1
lda ptr1
ldx ptr1+1
ldy #DIR::BYTES + DIR::CONTENT::ENTRIES
jsr incaxy
jsr pushax
ldy #DIR::CURRENT_ENTRY
lda (ptr1),y
jsr pusha0
ldy #DIR::ENTRY_LENGTH
lda (ptr1),y
jsr tosumula0
jsr tosaddax
; Store pointer to current entry
sta ptr4
stx ptr4+1
jsr popptr1
; Switch to next entry
ldy #DIR::CURRENT_ENTRY
lda (ptr1),y
clc
adc #1
sta (ptr1),y
; Check if entry[0] == 0
ldy #$00
lda (ptr4),y
beq @next_entry ; Yes, skip entry
; Move creation date/time to allow for next step below
; 18-19-1A-1B => 1A-1B-1C-1D
ldy #$1B
: lda (ptr4),y
iny
iny
sta (ptr4),y
dey
dey
dey
cpy #$17
bne :-
; Feature unsigned long access to EOF by extension from 3 to 4 bytes
; entry[0x18] = 0
iny
lda #$00
sta (ptr4),y
; Move file type to allow for next step below
; entry[0x19] = entry[0x10]
ldy #$10
lda (ptr4),y
ldy #$19
sta (ptr4),y
; Zero-terminate file name
ldy #$00
lda (ptr4),y
and #$0F
tay
iny
lda #$00
sta (ptr4),y
; Return pointer to entry+1
lda ptr4
ldx ptr4+1
jmp incax1
.endproc