Added directory functions to the Commodore Platform File System.
They reduce the Telnet server's run size by 1231 bytes.
This commit is contained in:
parent
c25e965b0c
commit
d864e73579
14 changed files with 636 additions and 19 deletions
114
platform/c64/lib/pfs-dir-asm.S
Normal file
114
platform/c64/lib/pfs-dir-asm.S
Normal file
|
@ -0,0 +1,114 @@
|
|||
;
|
||||
; 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
|
Loading…
Add table
Add a link
Reference in a new issue