d864e73579
They reduce the Telnet server's run size by 1231 bytes.
114 lines
2.9 KiB
ArmAsm
114 lines
2.9 KiB
ArmAsm
;
|
|
; 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
|