diff --git a/src/dos_m65/,aliases_dos.s b/src/dos_m65/,aliases_dos.s index 503f2265..776c4fa8 100644 --- a/src/dos_m65/,aliases_dos.s +++ b/src/dos_m65/,aliases_dos.s @@ -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 diff --git a/src/dos_m65/assets/dos_parts_dir.s b/src/dos_m65/assets/dos_parts_dir.s index d3d46c6a..0fc6f88c 100644 --- a/src/dos_m65/assets/dos_parts_dir.s +++ b/src/dos_m65/assets/dos_parts_dir.s @@ -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 diff --git a/src/dos_m65/dev_floppy/dev_fd_cmd_read.s b/src/dos_m65/dev_floppy/dev_fd_cmd_read.s index 1ef268af..aa5eb88b 100644 --- a/src/dos_m65/dev_floppy/dev_fd_cmd_read.s +++ b/src/dos_m65/dev_floppy/dev_fd_cmd_read.s @@ -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 diff --git a/src/dos_m65/dev_floppy/fs_1581_read_dir.s b/src/dos_m65/dev_floppy/fs_1581_read_dir.s index 5488777c..807973a7 100644 --- a/src/dos_m65/dev_floppy/fs_1581_read_dir.s +++ b/src/dos_m65/dev_floppy/fs_1581_read_dir.s @@ -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 diff --git a/src/dos_m65/dev_floppy/fs_1581_read_file.s b/src/dos_m65/dev_floppy/fs_1581_read_file.s index 0a3cdaf5..49998c2b 100644 --- a/src/dos_m65/dev_floppy/fs_1581_read_file.s +++ b/src/dos_m65/dev_floppy/fs_1581_read_file.s @@ -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