diff --git a/src/dos_m65/,aliases_dos.s b/src/dos_m65/,aliases_dos.s index 7268677e..503f2265 100644 --- a/src/dos_m65/,aliases_dos.s +++ b/src/dos_m65/,aliases_dos.s @@ -109,14 +109,7 @@ !addr FD_STATUS_IDX = $806E ; - floppy !addr RD_STATUS_IDX = $806F ; - ram disk - !addr DMAJOB_LIST = $8070 ; 15 bytes, a general purpose DMA list - !addr DMAJOB_SRC_MB = DMAJOB_LIST+2 - !addr DMAJOB_DST_MB = DMAJOB_LIST+4 - !addr DMAJOB_SIZE = DMAJOB_LIST+7 ; keep $0200 here - !addr DMAJOB_SRC_ADDR = DMAJOB_LIST+9 - !addr DMAJOB_DST_ADDR = DMAJOB_LIST+12 - - !addr SD_DESC = $807F ; current file descriptor + !addr SD_DESC = $8070 ; current file descriptor @@ -129,54 +122,63 @@ ; 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 = $8A00 ; - floppy drive 0 - !addr FD_BAM_CACHE_1 = $8E00 ; - floppy drive 1 + !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 = $9200 ; XXX temporarily hardcoded for usage by SD card - !addr SHARED_BUF_1 = $9400 ; XXX temporarily hardcoded for usage by floppy - !addr SHARED_BUF_2 = $9600 - !addr SHARED_BUF_3 = $9800 - !addr SHARED_BUF_4 = $9A00 - !addr SHARED_BUF_5 = $9C00 - !addr SHARED_BUF_6 = $9E00 - !addr SHARED_BUF_7 = $A000 - !addr SHARED_BUF_8 = $A200 - !addr SHARED_BUF_9 = $A400 - !addr SHARED_BUF_A = $A600 - !addr SHARED_BUF_B = $A800 - !addr SHARED_BUF_C = $AA00 - !addr SHARED_BUF_D = $AC00 - !addr SHARED_BUF_E = $AE00 - !addr SHARED_BUF_F = $B000 + !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 ; Memory shadow, needed for SD card support - !addr SD_MEMSHADOW_BUF = $8200 ; 256 byte buffer for preserving original memory content + !addr SD_MEMSHADOW_BUF = $AA00 ; 256 byte buffer for preserving original memory content ; Command/filename buffers, 128 bytes each - XXX extend to 256 bytes (change implementation) - !addr SD_CMDFN_BUF = $B300 ; - SD card - !addr FD_CMDFN_BUF = $B400 ; - floppy - !addr RD_CMDFN_BUF = $B500 ; - ram disk + !addr SD_CMDFN_BUF = $AB00 ; - SD card + !addr FD_CMDFN_BUF = $AC00 ; - floppy + !addr RD_CMDFN_BUF = $AD00 ; - ram disk ; Directory entry buffers, in BASIC format, $30 bytes each - !addr XX_DIRENT_BUF = $B600 - !addr SD_DIRENT_BUF = $B600 ; - SD card - !addr FD_DIRENT_BUF = $B630 ; - floppy - !addr RD_DIRENT_BUF = $B660 ; - ram disk + !addr XX_DIRENT_BUF = $AE00 + !addr SD_DIRENT_BUF = $AE00 ; - SD card + !addr FD_DIRENT_BUF = $AE30 ; - floppy + !addr RD_DIRENT_BUF = $AE60 ; - ram disk ; Status buffers, content terminated by 0, $30 bytes each - !addr XX_STATUS_BUF = $B690 - !addr SD_STATUS_BUF = $B690 ; - SD card - !addr FD_STATUS_BUF = $B6C0 ; - floppy - !addr RD_STATUS_BUF = $B6F0 ; - ram disk + !addr XX_STATUS_BUF = $AE90 + !addr SD_STATUS_BUF = $AE90 ; - SD card + !addr FD_STATUS_BUF = $AEC0 ; - floppy + !addr RD_STATUS_BUF = $AEF0 ; - ram disk + + ; Common DMA list + + !addr DMAJOB_LIST = $AF20 ; 15 bytes, a general purpose DMA list + !addr DMAJOB_SRC_MB = DMAJOB_LIST+2 + !addr DMAJOB_DST_MB = DMAJOB_LIST+4 + !addr DMAJOB_SIZE = DMAJOB_LIST+7 ; keep $0200 here + !addr DMAJOB_SRC_ADDR = DMAJOB_LIST+9 + !addr DMAJOB_DST_ADDR = DMAJOB_LIST+12 ; - ; Reserved 18 KB for floppy track buffers + some area for track metadata + ; Reserved 20 KB for floppy track buffers + some area for track metadata ; - !addr XX_REMAINING = $B720 + !addr XX_REMAINING = $AF2F diff --git a/src/dos_m65/assets/dos_parts_dir.s b/src/dos_m65/assets/dos_parts_dir.s index 309d3703..d3d46c6a 100644 --- a/src/dos_m65/assets/dos_parts_dir.s +++ b/src/dos_m65/assets/dos_parts_dir.s @@ -9,9 +9,9 @@ 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 + !pet " " ; space for disk/directory name XXX should be space, or shift+space? !byte $22, $20 ; quote, space - !pet "00 2a" ; default ID, disk format + !pet " 2a" ; default ID, disk format !byte $00 ; end of the line dir_hdr_sd: ; 32 bytes - header @@ -20,7 +20,7 @@ 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 + !pet "sd card " ; space for disk/directory name XXX should be space, or shift+space? !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_open.s b/src/dos_m65/dev_floppy/dev_fd_cmd_open.s index 72794ff7..9f66198b 100644 --- a/src/dos_m65/dev_floppy/dev_fd_cmd_open.s +++ b/src/dos_m65/dev_floppy/dev_fd_cmd_open.s @@ -58,20 +58,3 @@ dev_fd_cmd_OPEN_dir: @lp1_end: jmp fs_1581_read_dir_open - - - - ; XXX experimental code below - - ; Try to read track 40, sector 0 (disk header) - - lda #40 - sta PAR_TRACK - lda #$00 - sta PAR_SECTOR - - jsr dev_fd_util_readsector - - ; XXX continue implementation - - jmp dos_EXIT_CLC diff --git a/src/dos_m65/dev_floppy/dev_fd_util_readsector.s b/src/dos_m65/dev_floppy/dev_fd_util_readsector.s index bc837fa1..b4292cf7 100644 --- a/src/dos_m65/dev_floppy/dev_fd_util_readsector.s +++ b/src/dos_m65/dev_floppy/dev_fd_util_readsector.s @@ -14,42 +14,35 @@ dev_fd_util_readsector: ; Select physical track and sector based on logical ones from PAR_TRACK and PAR_SECTOR -; lda PAR_TRACK -; dec -; sta FDC_TRACK ; $D084 + lda PAR_TRACK + dec + sta FDC_TRACK ; $D084 -; lda PAR_SECTOR -; cmp #20 -; bcc @side0 + lda PAR_SECTOR + cmp #20 + bcc @side0 @side1: -; lda #%00001000 ; set side 1 -; tsb FDC_CONTROL ; $D080 + lda #%00001000 ; set side 1 + tsb FDC_CONTROL ; $D080 -; lda PAR_SECTOR -; sec -; sbc #20 + lda PAR_SECTOR + sec + sbc #20 -; ldx #$01 -; +skip_2_bytes_trash_nvz + ldx #$01 + +skip_2_bytes_trash_nvz @side0: -; ldx #$00 -; stx FDC_SIDE ; $D086 -; clc -; ror -; sta FDC_SECTOR ; $D085 - - ; XXX temporary code, just for testing (replacement for the commented-out code) - - lda #39 - sta FDC_TRACK ; $D084 - lda #00 + ldx #$00 + stx FDC_SIDE ; $D086 + clc + ror + inc sta FDC_SECTOR ; $D085 - lda #00 - sta FDC_SIDE ; $D086 + ; Ask the controller to read the sector XXX how to detect errors, missing disk, etc.? @@ -73,7 +66,7 @@ dev_fd_util_readsector: @lp3: lda FDC_STATUS_A ; $D082 and #%01100000 - cmp #%01100000 ; XXX is this correct? .A seems to stay at $40 at this point + cmp #%01000000 ; XXX is this correct? .A seems to stay at $40 at this point bne @lp3 ; Copy sector to buffer in RAM 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 21ee8306..5488777c 100644 --- a/src/dos_m65/dev_floppy/fs_1581_read_dir.s +++ b/src/dos_m65/dev_floppy/fs_1581_read_dir.s @@ -15,10 +15,59 @@ fs_1581_read_dir_open: jsr dev_fd_util_readsector ; XXX handle read errors + ; Create the first directory listing entry (title, id) + ldx #$1F ; first fetch the template +@lp1: + lda dir_hdr,x + sta FD_DIRENT_BUF,x + dex + bpl @lp1 + ldx #$0F ; file name +@lp2: + lda SHARED_BUF_1+$04,x + sta FD_DIRENT_BUF+$08,x + dex + bpl @lp2 + lda SHARED_BUF_1+$16 ; disk ID XXX test this on a disk with ID + cmp #$A0 + beq @skip1 + sta FD_DIRENT_BUF+$1A +@skip1: + lda SHARED_BUF_1+$17 + cmp #$A0 + beq @skip2 + sta FD_DIRENT_BUF+$1B +@skip2: - ; XXX continue implementation + lda SHARED_BUF_1+$19 ; dos version + sta FD_DIRENT_BUF+$1D + lda SHARED_BUF_1+$1A + sta FD_DIRENT_BUF+$1E + + ; Provide pointer to the header + + lda #$20 + sta FD_ACPTR_LEN+0 + lda #$00 + sta FD_ACPTR_LEN+1 + + lda #FD_DIRENT_BUF + sta FD_ACPTR_PTR+1 + + ; Set directory phase to 'file name' + + lda #$01 + sta FD_DIR_PHASE + + ; XXX copy 1st half of BAM + ; XXX preload the next entry + ; XXX copy 2nd half of BAM + + ; End jmp dos_EXIT_CLC diff --git a/src/dos_m65/msg_acptr.s b/src/dos_m65/msg_acptr.s index f1e0dbe2..d22c7884 100644 --- a/src/dos_m65/msg_acptr.s +++ b/src/dos_m65/msg_acptr.s @@ -11,13 +11,13 @@ msg_ACPTR: ; Check if there is a talker active ldx IDX1_TALKER - bmi msg_ACPTR_fail_no_talker + +bmi msg_ACPTR_fail_no_talker ; Check if active channel is status one lda XX_CHANNEL, X cmp #$0F - beq msg_ACPTR_status + +beq msg_ACPTR_status ; XXX add support for read contexts (multiple channels) @@ -26,7 +26,7 @@ msg_ACPTR: ldx IDX2_TALKER lda XX_ACPTR_LEN+0,x ora XX_ACPTR_LEN+1,x - beq msg_ACPTR_fail_no_data + +beq msg_ACPTR_fail_no_data ; Read a byte of data from the buffer @@ -62,11 +62,35 @@ msg_ACPTR_read_SD: @3: jmp dos_EXIT_CLC - msg_ACPTR_read_FD: - ; XXX provide implementation + ; Read and return one byte + jsr FD_ACPTR_helper + sta TBTCNT + sta REG_A + + ; Increment pointer, decrement length + + inc FD_ACPTR_PTR+0 + bne @1 + inc FD_ACPTR_PTR+1 +@1: + dec FD_ACPTR_LEN+0 + lda FD_ACPTR_LEN+0 + cmp #$FF + bne @2 + dec FD_ACPTR_LEN+1 +@2: + ; If new length is 0, try to read next block of data + + ora FD_ACPTR_LEN+1 + bne @3 + jsr dev_fd_cmd_READ + bcc @3 + jsr kernalstatus_EOI +@3: + jmp dos_EXIT_CLC msg_ACPTR_read_RD: