work on floppy directory within CBDOS

This commit is contained in:
FeralChild64 committed 2021-03-04 22:16:40 +01:00
1 parent 52b2686f0e
commit f8c048fab3
5 files changed
+169 -27

No files matched your search

+26 -21
View File
@@ -45,7 +45,7 @@
; Helper subroutines to fetch data
!addr code_LDA_nnnn_Y = $8014 ; - LDA nnnn, Y instruction
!addr par_LDA_nnnn_Y = $8015 ; - 2 bytes; address in buffer, ram disk
!addr par_LDA_nnnn_Y = $8015 ; - 2 bytes; address
!addr code_RTS_04 = $8017 ; - RTS instruction
; Parameters for utilities/helpers
@@ -111,6 +111,8 @@
!addr SD_DESC = $8070 ; current file descriptor
!addr FD_DIRENT = $8071 ; directory entry to read, 0-15
; XXX Free space
@@ -120,29 +122,32 @@
; Various buffers, caches, and other large memory chunks
;
; BAM cache for floppy drives; 2 KB (4 blocks) each, to cover up to ED floppies - XXX implementation to be written
!addr FD_BAM_CACHE_0 = $8200 ; - floppy drive 0
!addr FD_BAM_CACHE_1 = $8600 ; - floppy drive 1
; General purpose buffers, 512 bytes each, each starts at page start - XXX dynamic alllocation to be written
!addr SHARED_BUF_0 = $8A00 ; XXX temporarily hardcoded for usage by SD card
!addr SHARED_BUF_1 = $8C00 ; XXX temporarily hardcoded for usage by floppy
!addr SHARED_BUF_2 = $8E00
!addr SHARED_BUF_3 = $9000
!addr SHARED_BUF_4 = $9200
!addr SHARED_BUF_5 = $9400
!addr SHARED_BUF_6 = $9600
!addr SHARED_BUF_7 = $9800
!addr SHARED_BUF_8 = $9A00
!addr SHARED_BUF_9 = $9C00
!addr SHARED_BUF_A = $9E00
!addr SHARED_BUF_B = $A000
!addr SHARED_BUF_C = $A200
!addr SHARED_BUF_D = $A400
!addr SHARED_BUF_E = $A600
!addr SHARED_BUF_F = $A800
!addr SHARED_BUF_0 = $8200 ; XXX temporarily hardcoded for usage by SD card
!addr SHARED_BUF_1 = $8400 ; XXX temporarily hardcoded for usage by floppy
!addr SHARED_BUF_2 = $8600
!addr SHARED_BUF_3 = $8800
!addr SHARED_BUF_4 = $8A00
!addr SHARED_BUF_5 = $8C00
!addr SHARED_BUF_6 = $8E00
!addr SHARED_BUF_7 = $9000
!addr SHARED_BUF_8 = $9200
!addr SHARED_BUF_9 = $9400
!addr SHARED_BUF_A = $9600
!addr SHARED_BUF_B = $9800
!addr SHARED_BUF_C = $9A00
!addr SHARED_BUF_D = $9C00
!addr SHARED_BUF_E = $9E00
!addr SHARED_BUF_F = $A000
; BAM cache for floppy drives; 2 KB (4 blocks) each, to cover up to ED floppies
!addr FD_BAM_CACHE_0 = $A200 ; - floppy disk 0 BAM
!addr SHARED_BUF_X0 = $A400 ; - buffer which can be used if disk is not ED
!addr FD_BAM_CACHE_1 = $A600 ; - floppy disk 1 BAM
!addr SHARED_BUF_X1 = $A800 ; - buffer which can be used if disk is not ED
; Memory shadow, needed for SD card support
+3 -2
View File
@@ -9,7 +9,7 @@ dir_hdr: ; 32 bytes - header
!byte $01, $01 ; link to the next line - dummy, will be regenerated by BASIC
!byte $00, $00 ; line number 0
!byte $12, $22 ; reverse mode, quote
!pet " " ; space for disk/directory name XXX should be space, or shift+space?
!pet " " ; space for disk/directory name
!byte $22, $20 ; quote, space
!pet " 2a" ; default ID, disk format
!byte $00 ; end of the line
@@ -20,7 +20,8 @@ dir_hdr_sd: ; 32 bytes - header
!byte $01, $01 ; link to the next line - dummy, will be regenerated by BASIC
!byte $00, $00 ; line number 0
!byte $12, $22 ; reverse mode, quote
!pet "sd card " ; space for disk/directory name XXX should be space, or shift+space?
!pet "sd card" ; space for disk/directory name
!byte $A0, $A0, $A0, $A0, $A0, $A0, $A0, $A0, $A0
!byte $22, $20 ; quote, space
!pet "fat32" ; filesystem
!byte $00 ; end of the line
+9 -1
View File
@@ -6,7 +6,15 @@
dev_fd_cmd_READ:
; XXX provide implementation
lda SD_MODE
cmp #$03
+beq fs_1581_read_file
lda SD_DIR_PHASE
cmp #$01
+beq fs_1581_read_dir
cmp #$02
+beq fs_1581_read_dir_blocksfree
sec ; mark EOI
rts
+122 -3
View File
@@ -64,10 +64,129 @@ fs_1581_read_dir_open:
lda #$01
sta FD_DIR_PHASE
; XXX copy 1st half of BAM
; XXX preload the next entry
; XXX copy 2nd half of BAM
; Copy 1st BAM sector to the cache
ldx #$00
@lp3:
lda SHARED_BUF_1+$100, x
sta FD_BAM_CACHE_0,x
inx
bne @lp3
; Load the next pair of sectors
lda #$02
sta PAR_SECTOR
jsr dev_fd_util_readsector ; XXX handle read errors
; Copy 2nd BAM sector to the cache
ldx #$00
@lp4:
lda SHARED_BUF_1, x
sta FD_BAM_CACHE_0+$100,x
inx
bne @lp4
; Set variables to point to the 1st directory entry in the 2nd sector of the buffer
lda #$08
sta FD_DIRENT
; End
jmp dos_EXIT_CLC
fs_1581_read_dir:
lda FD_DIRENT
; If first entry within sector - make sure it is present within the buffer
cmp #$08
beq @get_sector_lo
cmp #$10
beq @get_sector_hi
; FALLTROUGH
fs_1581_read_dir_cont:
; Set address of the RAW directory entry
lda >SHARED_BUF_1
sta par_LDA_nnnn_Y+1
asl
asl
asl
asl
asl
sta par_LDA_nnnn_Y+0
bcc @1
inc par_LDA_nnnn_Y+1
@1:
; Set next directory entry
inc FD_DIRENT
; Copy data to parameter variables
; XXX most likely copying is not necessary (compare all CBM and CMD filesystems) -
; XXX just make the hypervisor file system emulate these structures
ldy #$02 ; start from determining file type
jsr code_LDA_nnnn_Y
tax
and #%00111111 ; for checking, filter out special bits
beq fs_1581_read_dir ; ignore deleted files
cmp #$06
bcs fs_1581_read_dir ; ignore unknown file types
stx PAR_FTYPE
ldy #$1E ; now get file size in blocks
jsr code_LDA_nnnn_Y
sta PAR_FSIZE_BLOCKS+0
iny
jsr code_LDA_nnnn_Y
sta PAR_FSIZE_BLOCKS+0
ldy #$05 ; copy the file name
@lp1:
jsr code_LDA_nnnn_Y
sta PAR_FNAME-5
iny
cpy #$15
bne @lp1
;
; XXX
@get_sector_lo:
; XXX
@get_sector_hi:
; XXX
; XXX provide implementation
jmp dos_EXIT_SEC
fs_1581_read_dir_blocksfree:
; XXX provide implementation
jmp dos_EXIT_SEC
@@ -6,3 +6,12 @@
fs_1581_read_file_open:
; XXX provide implementation
jmp dos_EXIT_SEC
fs_1581_read_file:
; XXX provide implementation
jmp dos_EXIT_SEC