From df89e627615634fb5ec1ef8a1f7d727ca5acd1d7 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Mon, 8 Mar 2021 18:10:21 +0100 Subject: [PATCH] more work towards loading from internal drive --- .../filesystem_cbm/fs_cbm_nextdirentry.s | 138 +++++++++++++++++- src/dos_m65/filesystem_cbm/fs_cbm_read_dir.s | 130 +---------------- src/dos_m65/filesystem_cbm/fs_cbm_read_file.s | 20 ++- 3 files changed, 160 insertions(+), 128 deletions(-) diff --git a/src/dos_m65/filesystem_cbm/fs_cbm_nextdirentry.s b/src/dos_m65/filesystem_cbm/fs_cbm_nextdirentry.s index 2b06f078..fc500dac 100644 --- a/src/dos_m65/filesystem_cbm/fs_cbm_nextdirentry.s +++ b/src/dos_m65/filesystem_cbm/fs_cbm_nextdirentry.s @@ -10,4 +10,140 @@ ; XXX work-in-progress, this should be used within directory reading code -fs_cbm_nextdirentry: \ No newline at end of file +fs_cbm_nextdirentry: + + 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 + +@cont: + + ; Set address of the RAW directory entry + + ldy #>SHARED_BUF_1 + sty 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 + beq fs_cbm_nextdirentry ; ignore deleted files (but allow DEL files in some cases) + + tax + and #%00111111 ; for checking, filter out special bits + cmp #$06 + bcs fs_cbm_nextdirentry ; 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+1 + + ldy #$05 ; copy the file name +@lp1: + jsr code_LDA_nnnn_Y + sta PAR_FNAME-5,y + iny + cpy #$15 + bne @lp1 + + clc + rts + +@get_sector_lo: + + ; Check if this was the last sector + + lda SHARED_BUF_1+0 + beq @end_of_dir + lda SHARED_BUF_1+1 + cmp #$FF + beq @end_of_dir + + ; Transition from 1st half of the buffer, to (possibly) the second one + + lda SHARED_BUF_1+0 + cmp BUFTAB_TRACK+1 + bne @get_sector_lo_next + + lda SHARED_BUF_1+1 + dec + cmp BUFTAB_SECTOR+1 + bne @get_sector_lo_next + + ; It's OK, we can transition to the upper half of the buffer + + lda FD_DIRENT + jmp @cont + +@get_sector_lo_next: + + lda SHARED_BUF_1+0 + sta PAR_TRACK + lda SHARED_BUF_1+1 + sta PAR_SECTOR + bra @get_sector_common + +@get_sector_hi: + + ; Check if this was the last sector + + lda SHARED_BUF_1+$100+0 + beq @end_of_dir + lda SHARED_BUF_1+$100+1 + cmp #$FF + beq @end_of_dir + + ; Load new sector + + lda SHARED_BUF_1+$100+0 + sta PAR_TRACK + lda SHARED_BUF_1+$100+1 + sta PAR_SECTOR + +@get_sector_common: + + jsr lowlevel_readsector ; XXX handle read errors + + ; Set new FD_DIRENT + + lda PAR_SECTOR + and #$01 + beq @2 + lda #$08 +@2: + sta FD_DIRENT + jmp @cont + +@end_of_dir: + + sec + rts \ No newline at end of file diff --git a/src/dos_m65/filesystem_cbm/fs_cbm_read_dir.s b/src/dos_m65/filesystem_cbm/fs_cbm_read_dir.s index b14728c4..5f07a556 100644 --- a/src/dos_m65/filesystem_cbm/fs_cbm_read_dir.s +++ b/src/dos_m65/filesystem_cbm/fs_cbm_read_dir.s @@ -108,68 +108,11 @@ fs_cbm_read_dir_open: fs_cbm_read_dir: - lda FD_DIRENT + jsr fs_cbm_nextdirentry + bcs fs_cbm_read_dir_blocksfree ; XXX handle errors - ; 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 - -@cont: - - ; Set address of the RAW directory entry - - ldy #>SHARED_BUF_1 - sty 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 - beq fs_cbm_read_dir ; ignore deleted files (but allow DEL files in some cases) - - tax - and #%00111111 ; for checking, filter out special bits - cmp #$06 - bcs fs_cbm_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+1 - - ldy #$05 ; copy the file name -@lp1: - jsr code_LDA_nnnn_Y - sta PAR_FNAME-5,y - iny - cpy #$15 - bne @lp1 + jsr util_dir_filter ; XXX consider moving these calls to fs_*_nextdirentry + bne fs_cbm_read_dir ; if does not match, try the next entry ; Prepare output entry, starting from XX_DIRENT_BUF + initial offset @@ -193,71 +136,6 @@ fs_cbm_read_dir: clc rts -@get_sector_lo: - - ; Check if this was the last sector - - lda SHARED_BUF_1+0 - beq fs_cbm_read_dir_blocksfree - lda SHARED_BUF_1+1 - cmp #$FF - beq fs_cbm_read_dir_blocksfree - - ; Transition from 1st half of the buffer, to (possibly) the second one - - lda SHARED_BUF_1+0 - cmp BUFTAB_TRACK+1 - bne @get_sector_lo_next - - lda SHARED_BUF_1+1 - dec - cmp BUFTAB_SECTOR+1 - bne @get_sector_lo_next - - ; It's OK, we can transition to the upper half of the buffer - - lda FD_DIRENT - jmp @cont - -@get_sector_lo_next: - - lda SHARED_BUF_1+0 - sta PAR_TRACK - lda SHARED_BUF_1+1 - sta PAR_SECTOR - bra @get_sector_common - -@get_sector_hi: - - ; Check if this was the last sector - - lda SHARED_BUF_1+$100+0 - beq fs_cbm_read_dir_blocksfree - lda SHARED_BUF_1+$100+1 - cmp #$FF - beq fs_cbm_read_dir_blocksfree - - ; Load new sector - - lda SHARED_BUF_1+$100+0 - sta PAR_TRACK - lda SHARED_BUF_1+$100+1 - sta PAR_SECTOR - -@get_sector_common: - - jsr lowlevel_readsector ; XXX handle read errors - - ; Set new FD_DIRENT - - lda PAR_SECTOR - and #$01 - beq @2 - lda #$08 -@2: - sta FD_DIRENT - jmp @cont - fs_cbm_read_dir_blocksfree: ; Copy the 'BLOCKS FREE' line diff --git a/src/dos_m65/filesystem_cbm/fs_cbm_read_file.s b/src/dos_m65/filesystem_cbm/fs_cbm_read_file.s index 11090289..6bc7e910 100644 --- a/src/dos_m65/filesystem_cbm/fs_cbm_read_file.s +++ b/src/dos_m65/filesystem_cbm/fs_cbm_read_file.s @@ -6,7 +6,7 @@ fs_cbm_read_file_open: - ; Get the first sector of the directory + ; Get the first sector of the directory XXX deduplicate code, create a separate open directory routine lda #40 sta PAR_TRACK @@ -15,6 +15,24 @@ fs_cbm_read_file_open: jsr lowlevel_readsector ; XXX handle read errors + ; Set variables to point to the 1st directory entry in the 2nd sector of the buffer + + lda #$08 + sta FD_DIRENT + + ; Make sure the 1st sector in buffer points to 2nd one + + lda #40 + sta SHARED_BUF_1+0 + lda #03 + sta SHARED_BUF_1+1 + + ; XXX deduplicate code above with fs_cbm_read_dir_open + + ; Try to find the file + + jsr fs_cbm_nextdirentry + +bcs dos_EXIT