first attempts to read dirent structure
This commit is contained in:
1 parent
906ec22834
commit
f8c8e71f9f
4 files changed
+129
-80
No files matched your search
@@ -94,3 +94,5 @@
|
|||||||
!addr SD_CMDFN_BUF = $8100 ; buffer for command and/or file name, 128 bytes, SD card
|
!addr SD_CMDFN_BUF = $8100 ; buffer for command and/or file name, 128 bytes, SD card
|
||||||
!addr FD_CMDFN_BUF = $8180 ; buffer for command and/or file name, 128 bytes, floppy
|
!addr FD_CMDFN_BUF = $8180 ; buffer for command and/or file name, 128 bytes, floppy
|
||||||
!addr RD_CMDFN_BUF = $8200 ; buffer for command and/or file name, 128 bytes, ram disk
|
!addr RD_CMDFN_BUF = $8200 ; buffer for command and/or file name, 128 bytes, ram disk
|
||||||
|
|
||||||
|
!addr SD_DIRENT = $8280 ; 256 byte buffer for 'dirent' structure
|
||||||
@@ -19,46 +19,11 @@ dev_sd_cmd_OPEN_EOI:
|
|||||||
|
|
||||||
lda SD_CMDFN_BUF
|
lda SD_CMDFN_BUF
|
||||||
cmp #'$'
|
cmp #'$'
|
||||||
beq dev_sd_cmd_OPEN_dir
|
+beq fs_hvsr_read_dir_open
|
||||||
|
|
||||||
; XXX implement for file names
|
; XXX implement for file names
|
||||||
|
|
||||||
jmp dos_EXIT_SEC
|
jmp dos_EXIT_SEC
|
||||||
|
|
||||||
|
|
||||||
dev_sd_cmd_OPEN_dir:
|
|
||||||
|
|
||||||
; XXX
|
|
||||||
|
|
||||||
; .X = file descriptor
|
|
||||||
; .Y = page of memory for output
|
|
||||||
|
|
||||||
; lda #$11 ; dos_opendir
|
|
||||||
; sta HTRAP00
|
|
||||||
; +nop
|
|
||||||
|
|
||||||
; Reset status to OK
|
|
||||||
|
|
||||||
lda #$00
|
|
||||||
jsr dos_status_00
|
|
||||||
|
|
||||||
; Provide pointer to the header
|
|
||||||
|
|
||||||
lda #$20
|
|
||||||
sta SD_ACPTR_LEN+0
|
|
||||||
lda #$00
|
|
||||||
sta SD_ACPTR_LEN+1
|
|
||||||
|
|
||||||
lda #<dir_hdr_sd
|
|
||||||
sta SD_ACPTR_PTR+0
|
|
||||||
lda #>dir_hdr_sd
|
|
||||||
sta SD_ACPTR_PTR+1
|
|
||||||
|
|
||||||
; Set directory phase to 'file name'
|
|
||||||
|
|
||||||
lda #$01
|
|
||||||
sta SD_DIR_PHASE
|
|
||||||
|
|
||||||
; End
|
|
||||||
|
|
||||||
jmp dos_EXIT
|
|
||||||
@@ -10,50 +10,9 @@ dev_sd_cmd_READ:
|
|||||||
|
|
||||||
lda SD_DIR_PHASE
|
lda SD_DIR_PHASE
|
||||||
cmp #$01
|
cmp #$01
|
||||||
beq dev_sd_cmd_READ_dir_blocksfree
|
+beq fs_hvsr_read_dir
|
||||||
|
cmp #$02
|
||||||
|
+beq fs_hvsr_read_dir_blocksfree
|
||||||
|
|
||||||
sec ; mark EOI
|
sec ; mark EOI
|
||||||
rts
|
rts
|
||||||
|
|
||||||
dev_sd_cmd_READ_dir:
|
|
||||||
|
|
||||||
; Dirent structure:
|
|
||||||
; - 4 bytes - inode
|
|
||||||
; - 2 bytes - ('off' - not sure what's this)
|
|
||||||
; - 4 bytes - ('reclen' - is it file size?)
|
|
||||||
; - 2 bytes - type
|
|
||||||
|
|
||||||
; .X = file descriptor
|
|
||||||
; .Y = page of memory for output
|
|
||||||
|
|
||||||
; lda #$12 ; dos_readdir
|
|
||||||
; sta HTRAP00
|
|
||||||
; +nop
|
|
||||||
|
|
||||||
dev_sd_cmd_READ_dir_blocksfree:
|
|
||||||
|
|
||||||
; Set pointer to '0 BLOCKS FREE.' line
|
|
||||||
|
|
||||||
lda #$13
|
|
||||||
sta SD_ACPTR_LEN+0
|
|
||||||
lda #$00
|
|
||||||
sta SD_ACPTR_LEN+1
|
|
||||||
|
|
||||||
lda #<dir_end
|
|
||||||
sta SD_ACPTR_PTR+0
|
|
||||||
lda #>dir_end
|
|
||||||
sta SD_ACPTR_PTR+1
|
|
||||||
|
|
||||||
; Mark end of directory
|
|
||||||
|
|
||||||
lda #$00
|
|
||||||
sta SD_DIR_PHASE
|
|
||||||
|
|
||||||
; .X = file descriptor
|
|
||||||
|
|
||||||
; lda #$13 ; dos_closedir
|
|
||||||
; sta HTRAP00
|
|
||||||
; +nop
|
|
||||||
|
|
||||||
clc
|
|
||||||
rts
|
|
||||||
@@ -0,0 +1,123 @@
|
|||||||
|
|
||||||
|
;
|
||||||
|
; Hypervisor virtual filesystem - reading directory
|
||||||
|
;
|
||||||
|
|
||||||
|
|
||||||
|
fs_hvsr_read_dir_open:
|
||||||
|
|
||||||
|
; Read dirent structure into $1000 and then copy it to SD_DIRENT
|
||||||
|
; Starting at $1000 VIC sees chargen, so this should be a safe place
|
||||||
|
; Content of the original memory location will be preserved
|
||||||
|
|
||||||
|
jsr fs_hvsr_dirent_swap
|
||||||
|
|
||||||
|
ldx #$00 ; file descriptor; we use $00 for reading directory
|
||||||
|
ldy #$10 ; target page number
|
||||||
|
|
||||||
|
lda #$11 ; dos_opendir
|
||||||
|
sta HTRAP00
|
||||||
|
+nop
|
||||||
|
|
||||||
|
; XXX handle read errors
|
||||||
|
|
||||||
|
jsr fs_hvsr_dirent_swap
|
||||||
|
|
||||||
|
; Reset status to OK
|
||||||
|
|
||||||
|
lda #$00
|
||||||
|
jsr dos_status_00
|
||||||
|
|
||||||
|
; Provide pointer to the header
|
||||||
|
|
||||||
|
lda #$20
|
||||||
|
sta SD_ACPTR_LEN+0
|
||||||
|
lda #$00
|
||||||
|
sta SD_ACPTR_LEN+1
|
||||||
|
|
||||||
|
lda #<dir_hdr_sd
|
||||||
|
sta SD_ACPTR_PTR+0
|
||||||
|
lda #>dir_hdr_sd
|
||||||
|
sta SD_ACPTR_PTR+1
|
||||||
|
|
||||||
|
; Set directory phase to 'file name'
|
||||||
|
|
||||||
|
lda #$01
|
||||||
|
sta SD_DIR_PHASE
|
||||||
|
|
||||||
|
; End
|
||||||
|
|
||||||
|
jmp dos_EXIT
|
||||||
|
|
||||||
|
fs_hvsr_read_dir:
|
||||||
|
|
||||||
|
jsr fs_hvsr_dirent_swap
|
||||||
|
|
||||||
|
ldx #$00 ; file descriptor; we use $00 for reading directory
|
||||||
|
ldy #$10 ; target page number
|
||||||
|
|
||||||
|
lda #$12 ; dos_readdir
|
||||||
|
sta HTRAP00
|
||||||
|
+nop
|
||||||
|
|
||||||
|
; XXX handle read errors
|
||||||
|
|
||||||
|
sta $400
|
||||||
|
stx $401
|
||||||
|
|
||||||
|
jsr fs_hvsr_dirent_swap
|
||||||
|
|
||||||
|
|
||||||
|
jmp fs_hvsr_read_dir_blocksfree ; XXX temporary
|
||||||
|
|
||||||
|
; Dirent structure:
|
||||||
|
; - 4 bytes - inode
|
||||||
|
; - 2 bytes - ('off' - not sure what's this)
|
||||||
|
; - 4 bytes - ('reclen' - is it file size?)
|
||||||
|
; - 2 bytes - type
|
||||||
|
|
||||||
|
fs_hvsr_read_dir_blocksfree:
|
||||||
|
|
||||||
|
; Set pointer to '0 BLOCKS FREE.' line
|
||||||
|
|
||||||
|
lda #$13
|
||||||
|
sta SD_ACPTR_LEN+0
|
||||||
|
lda #$00
|
||||||
|
sta SD_ACPTR_LEN+1
|
||||||
|
|
||||||
|
lda #<dir_end
|
||||||
|
sta SD_ACPTR_PTR+0
|
||||||
|
lda #>dir_end
|
||||||
|
sta SD_ACPTR_PTR+1
|
||||||
|
|
||||||
|
; Mark end of directory
|
||||||
|
|
||||||
|
lda #$00
|
||||||
|
sta SD_DIR_PHASE
|
||||||
|
|
||||||
|
; .X = file descriptor
|
||||||
|
|
||||||
|
; lda #$13 ; dos_closedir
|
||||||
|
; sta HTRAP00
|
||||||
|
; +nop
|
||||||
|
|
||||||
|
clc
|
||||||
|
rts
|
||||||
|
|
||||||
|
|
||||||
|
;
|
||||||
|
; Helper routines
|
||||||
|
;
|
||||||
|
|
||||||
|
fs_hvsr_dirent_swap:
|
||||||
|
|
||||||
|
ldx #$00
|
||||||
|
@1:
|
||||||
|
lda $1000, x
|
||||||
|
ldy SD_DIRENT, x
|
||||||
|
sta SD_DIRENT, x
|
||||||
|
sty $1000, x
|
||||||
|
inx
|
||||||
|
bne @1
|
||||||
|
|
||||||
|
rts
|
||||||
Reference in new issue
Block a user