nes-proj/platform/c64/lib/pfs-dir-asm.S

115 lines
2.9 KiB
ArmAsm
Raw Normal View History

;
; Helper functions for pfs_opendir() and pfs_readdir()
;
; Close a directory listing that had been openned by pfs_opendir().
;
; 2012-06-01, Ullrich von Bassewitz
; 2016-04-10, Greg King
;
.importzp sp, ptr1, tmp1
.import pushax, _pfs_read, _pfs_close
.export __pfs_dirread1, __pfs_dirread
.export _pfs_closedir
;---------------------------------------------------------------------------
; Data structure
.struct DIR
fd .word
.endstruct
;---------------------------------------------------------------------------
; /* Read one byte from the directory into the supplied buffer.
; ** Return true if the read was successful, and false otherwise.
; */
; unsigned char __fastcall__ _pfs_dirread1(struct cfs_dir *dir, void *buf);
__pfs_dirread1:
jsr pushax ; Push buf
lda #1 ; Load count = 1
; Run directly into __dirread
;---------------------------------------------------------------------------
; /* Read characters from the directory into the supplied buffer.
; ** Return true if the read was successful, and false otherwise.
; */
; unsigned char __fastcall__ _pfs_dirread(struct cfs_dir *dir, void *buf,
__pfs_dirread:
pha ; Save count
; Replace dir by ((DIR*)dir)->fd.
ldy #$02
lda (sp),y
sta ptr1
iny
lda (sp),y
sta ptr1+1
ldy #DIR::fd+1
lda (ptr1),y
pha
dey
lda (ptr1),y
ldy #$02
sta (sp),y
pla
iny
sta (sp),y
; Get count, save it again, clear the high byte, and call pfs_read().
; By the previous actions, the stack frame is as pfs_read() needs it;
; and, pfs_read() also will drop it.
pla
pha
ldx #>$0000
jsr _pfs_read
; Check for errors.
cpx #>-1
beq L3
; pfs_read() was successful; check number of bytes read. We assume that
; pfs_read() will not return more than count; so, .X is zero if we come here.
sta tmp1 ; Save returned count
pla ; Our count
cmp tmp1
beq L2 ; OK, return count
; Didn't read enough bytes. That is an error for us.
bne L1 ; Branch always
; pfs_read() returned an error.
L3: pla ; Drop count
inx ; .X = 0
L1: txa ; Return zero
L2: rts
;---------------------------------------------------------------------------
; void __fastcall__ pfs_closedir(struct cfs_dir *dirp);
.proc _pfs_closedir
sta ptr1
stx ptr1+1
; Load ((DIR *)dirp)->fd.
ldy #DIR::fd+1
lda (ptr1),y
tax
dey
lda (ptr1),y
; Close the directory file.
jmp _pfs_close
.endproc