diff --git a/src/dos_m65/,aliases_dos.s b/src/dos_m65/,aliases_dos.s index 5c40c77a..011b88cf 100644 --- a/src/dos_m65/,aliases_dos.s +++ b/src/dos_m65/,aliases_dos.s @@ -35,8 +35,37 @@ !addr IDX1_TALKER = $8012 ; talker idx, >=$80 = none !addr IDX2_TALKER = $8013 ; talker idx * 2, >=$80 = none - for calling routines via vector table + ; Various temporary data + + !addr XX_DIR_PHASE = $8014 ; directory output phase, values deponds on device driver + !addr SD_DIR_PHASE = $8014 ; - SD card + !addr FD_DIR_PHASE = $8015 ; - floppy + !addr RD_DIR_PHASE = $8016 ; - ram disk + + + ; Free space: $8014-$8063 + !addr SD_ACPTR_helper = $8052 ; subroutine in RAM to read a byte + !addr code_LDA_01 = $8052 ; - LDA instruction + !addr SD_ACPTR_PTR = $8053 ; - 2 bytes; address in buffer, SD card + !addr code_RTS_01 = $8055 ; - RTS instruction + + !addr FD_ACPTR_helper = $8056 ; subroutine in RAM to read a byte + !addr code_LDA_02 = $8056 ; - LDA instruction + !addr FD_ACPTR_PTR = $8057 ; - 2 bytes; address in buffer, floppy + !addr code_RTS_02 = $8059 ; - RTS instruction + + !addr RD_ACPTR_helper = $805A ; subroutine in RAM to read a byte + !addr code_LDA_03 = $805A ; - LDA instruction + !addr RD_ACPTR_PTR = $805B ; - 2 bytes; address in buffer, ram disk + !addr code_RTS_03 = $805D ; - RTS instruction + + !addr XX_ACPTR_LEN = $805E ; 2 bytes - length of data left for ACPTR + !addr SD_ACPTR_LEN = $805E ; - SD card + !addr FD_ACPTR_LEN = $8060 ; - floppy + !addr RD_ACPTR_LEN = $8062 ; - ram disk + !addr XX_MODE = $8064 ; current mode (0 = none, 1 = receiving command/file name) !addr SD_MODE = $8064 ; - SD card !addr FD_MODE = $8065 ; - floppy diff --git a/src/dos_m65/assets/dos_error_strings.s b/src/dos_m65/assets/dos_error_strings.s index 2c72cfc6..922d9dfa 100644 --- a/src/dos_m65/assets/dos_error_strings.s +++ b/src/dos_m65/assets/dos_error_strings.s @@ -9,7 +9,7 @@ dos_err_init_sdcard: - !pet "73,m65 dos sdcard,00,00", 0 + !pet "73,m65 dos sd card,00,00", 0 dos_err_init_floppy: @@ -25,7 +25,7 @@ dos_err_init_ramdisk: dos_err_00: ; not an error - !pet "ok", 0 + !pet " ok", 0 dos_err_01: ; not an error diff --git a/src/dos_m65/assets/dos_parts_dir.s b/src/dos_m65/assets/dos_parts_dir.s new file mode 100644 index 00000000..c9929dfb --- /dev/null +++ b/src/dos_m65/assets/dos_parts_dir.s @@ -0,0 +1,33 @@ + +; +; Data used to generate directory in CBM BASIC format +; + +dir_hdr: ; 32 bytes - header + + !byte $01, $08 ; program location + !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 + !byte $22, $20 ; quote, space + !pet "00 2a" ; default ID, disk format + !byte $00 ; end of the line + +dir_hdr_sd: ; 32 bytes - header + + !byte $01, $08 ; program location + !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 + !byte $22, $20 ; quote, space + !pet "fat32" ; filesystem + !byte $00 ; end of the line + +dir_end: ; 19 bytes + + !byte $01, $01 ; link to the next line - dummy, will be regenerated by BASIC + !byte $00, $00 ; line number 0 + !pet "blocks free." + !byte $00, $00, $00 ; end of the line, end of program marker 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 eeca8192..1358ab93 100644 --- a/src/dos_m65/dev_floppy/dev_fd_cmd_open.s +++ b/src/dos_m65/dev_floppy/dev_fd_cmd_open.s @@ -9,3 +9,9 @@ dev_fd_cmd_OPEN: ; XXX provide implementation jmp dos_EXIT_SEC + +dev_fd_cmd_OPEN_EOI: + + ; XXX provide implementation + + jmp dos_EXIT diff --git a/src/dos_m65/dev_floppy/dev_fd_cmd_read.s b/src/dos_m65/dev_floppy/dev_fd_cmd_read.s new file mode 100644 index 00000000..1ef268af --- /dev/null +++ b/src/dos_m65/dev_floppy/dev_fd_cmd_read.s @@ -0,0 +1,12 @@ + +; +; Read more data into the buffer +; + + +dev_fd_cmd_READ: + + ; XXX provide implementation + + sec ; mark EOI + rts diff --git a/src/dos_m65/dev_floppy/dev_fd_init.s b/src/dos_m65/dev_floppy/dev_fd_init.s index fbaddd33..09791d41 100644 --- a/src/dos_m65/dev_floppy/dev_fd_init.s +++ b/src/dos_m65/dev_floppy/dev_fd_init.s @@ -12,6 +12,10 @@ dev_fd_init: stx FD_STATUS_IDX stx FD_CMDFN_IDX stx FD_MODE + stx FD_ACPTR_LEN+0 + stx FD_ACPTR_LEN+1 + stx FD_ACPTR_PTR+0 + stx FD_ACPTR_PTR+1 dex @1: inx diff --git a/src/dos_m65/dev_ramdisk/dev_rd_cmd_open.s b/src/dos_m65/dev_ramdisk/dev_rd_cmd_open.s index 46eceb62..50d2c5f7 100644 --- a/src/dos_m65/dev_ramdisk/dev_rd_cmd_open.s +++ b/src/dos_m65/dev_ramdisk/dev_rd_cmd_open.s @@ -9,3 +9,9 @@ dev_rd_cmd_OPEN: ; XXX provide implementation jmp dos_EXIT_SEC + +dev_rd_cmd_OPEN_EOI: + + ; XXX provide implementation + + jmp dos_EXIT diff --git a/src/dos_m65/dev_ramdisk/dev_rd_cmd_read.s b/src/dos_m65/dev_ramdisk/dev_rd_cmd_read.s new file mode 100644 index 00000000..36a95300 --- /dev/null +++ b/src/dos_m65/dev_ramdisk/dev_rd_cmd_read.s @@ -0,0 +1,12 @@ + +; +; Read more data into the buffer +; + + +dev_rd_cmd_READ: + + ; XXX provide implementation + + sec ; mark EOI + rts diff --git a/src/dos_m65/dev_ramdisk/dev_rd_init.s b/src/dos_m65/dev_ramdisk/dev_rd_init.s index 352cf003..fbe87e3b 100644 --- a/src/dos_m65/dev_ramdisk/dev_rd_init.s +++ b/src/dos_m65/dev_ramdisk/dev_rd_init.s @@ -12,6 +12,10 @@ dev_rd_init: stx RD_STATUS_IDX stx RD_CMDFN_IDX stx RD_MODE + stx RD_ACPTR_LEN+0 + stx RD_ACPTR_LEN+1 + stx RD_ACPTR_PTR+0 + stx RD_ACPTR_PTR+1 dex @1: inx diff --git a/src/dos_m65/dev_sdcard/dev_sd_cmd_open.s b/src/dos_m65/dev_sdcard/dev_sd_cmd_open.s index b104f0ba..25a0575a 100644 --- a/src/dos_m65/dev_sdcard/dev_sd_cmd_open.s +++ b/src/dos_m65/dev_sdcard/dev_sd_cmd_open.s @@ -10,3 +10,43 @@ dev_sd_cmd_OPEN: sta SD_MODE jmp dos_EXIT + +dev_sd_cmd_OPEN_EOI: + + ; XXX this dispatcher is temporary + + ; XXX add support for second card + + lda SD_CMDFN_BUF + cmp '$' + beq dev_sd_cmd_OPEN_dir + + ; XXX implement for file names + + jmp dos_EXIT_SEC + + +dev_sd_cmd_OPEN_dir: + + ; XXX add support for filtering + + ; Initialize 1st directory phase - header + + lda #$01 + sta SD_DIR_PHASE + + ; Provide pointer and length of the header + + lda #$20 + sta SD_ACPTR_PTR+0 + lda #$00 + sta SD_ACPTR_PTR+1 + + lda #dir_hdr_sd + sta SD_ACPTR_PTR+1 + + ; End + + jmp dos_EXIT diff --git a/src/dos_m65/dev_sdcard/dev_sd_cmd_read.s b/src/dos_m65/dev_sdcard/dev_sd_cmd_read.s new file mode 100644 index 00000000..302f7142 --- /dev/null +++ b/src/dos_m65/dev_sdcard/dev_sd_cmd_read.s @@ -0,0 +1,12 @@ + +; +; Read more data into the buffer +; + + +dev_sd_cmd_READ: + + ; XXX provide implementation + + sec ; mark EOI + rts diff --git a/src/dos_m65/dev_sdcard/dev_sd_init.s b/src/dos_m65/dev_sdcard/dev_sd_init.s index cf47aa11..95b0f144 100644 --- a/src/dos_m65/dev_sdcard/dev_sd_init.s +++ b/src/dos_m65/dev_sdcard/dev_sd_init.s @@ -12,6 +12,10 @@ dev_sd_init: stx SD_STATUS_IDX stx SD_CMDFN_IDX stx SD_MODE + stx SD_ACPTR_LEN+0 + stx SD_ACPTR_LEN+1 + stx SD_ACPTR_PTR+0 + stx SD_ACPTR_PTR+1 dex @1: inx diff --git a/src/dos_m65/dos_init.s b/src/dos_m65/dos_init.s index 53784393..66a81d8c 100644 --- a/src/dos_m65/dos_init.s +++ b/src/dos_m65/dos_init.s @@ -44,6 +44,18 @@ dos_INIT: jsr dev_fd_init jsr dev_rd_init + ; Initialize helper code in RAM + + lda #$AD ; LDA opcode, absolute + sta code_LDA_01 + sta code_LDA_02 + sta code_LDA_03 + + lda #$60 ; RTS opcode + sta code_RTS_01 + sta code_RTS_02 + sta code_RTS_03 + ; Exit DOS context jmp dos_EXIT diff --git a/src/dos_m65/dos_memchk.s b/src/dos_m65/dos_memchk.s index 683a33a5..f646228b 100644 --- a/src/dos_m65/dos_memchk.s +++ b/src/dos_m65/dos_memchk.s @@ -16,6 +16,24 @@ dos_MEMCHK: dex bpl @1 + ; Check if helper code is undamaged + + lda #$AD + cmp code_LDA_01 + bne @fail + cmp code_LDA_02 + bne @fail + cmp code_LDA_03 + bne @fail + + lda #$60 + cmp code_RTS_01 + bne @fail + cmp code_RTS_02 + bne @fail + cmp code_RTS_03 + bne @fail + clc rts diff --git a/src/dos_m65/msg_acptr.s b/src/dos_m65/msg_acptr.s index 44d13ea3..1d521567 100644 --- a/src/dos_m65/msg_acptr.s +++ b/src/dos_m65/msg_acptr.s @@ -11,7 +11,7 @@ msg_ACPTR: ; Check if there is a talker active ldx IDX1_TALKER - bmi msg_ACPTR_fail + bmi msg_ACPTR_fail_no_talker ; Check if active channel is status one @@ -19,9 +19,65 @@ msg_ACPTR: cmp #$0F beq msg_ACPTR_status - ; XXX providde implementation for non-status channels + ; XXX add support for read contexts (multiple channels) - jmp msg_ACPTR_fail + ; Not a status channel - check if we have something to read out + + ldx IDX2_TALKER + lda XX_ACPTR_LEN+0,x + ora XX_ACPTR_LEN+1,x + beq msg_ACPTR_fail_no_data + + ; Read a byte of data from the buffer + + jmp (msg_ACPTR_read_vectab, X) + +msg_ACPTR_read_SD: + + ; Read and return one byte + + jsr SD_ACPTR_helper + sta TBTCNT + + ; Increment pointer, decrement length + + inc SD_ACPTR_PTR+0 + bne @1 + inc SD_ACPTR_PTR+1 +@1: + dec SD_ACPTR_LEN+0 + lda SD_ACPTR_LEN+0 + cmp #$FF + bne @2 + dec SD_ACPTR_LEN+1 +@2: + ; If new length is 0, try to read next block of data + + ora SD_ACPTR_LEN+1 + bne @3 + jsr dev_sd_cmd_READ + bcc @3 + jsr kernalstatus_EOI +@3: + jmp dos_EXIT + + +msg_ACPTR_read_FD: + + ; XXX provide implementation + + +msg_ACPTR_read_RD: + + ; XXX provide implementation + + +msg_ACPTR_fail_no_data: + + ; XXX What should be the reaction when trying to read and no data is present? + + sta TBTCNT + bra msg_ACPTR_EOI msg_ACPTR_status: @@ -57,7 +113,7 @@ msg_ACPTR_status_got: jmp dos_EXIT_A -msg_ACPTR_fail: +msg_ACPTR_fail_no_talker: ; XXX set error code @@ -70,13 +126,12 @@ msg_ACPTR_reset_status: ; FALLTROUGH -msg_ACPTR_eoi: +msg_ACPTR_EOI: jsr kernalstatus_EOI jmp dos_EXIT - ; Vector tables for jumps msg_ACPTR_status_vectab: @@ -84,3 +139,9 @@ msg_ACPTR_status_vectab: !word msg_ACPTR_status_SD !word msg_ACPTR_status_FD !word msg_ACPTR_status_RD + +msg_ACPTR_read_vectab: + + !word msg_ACPTR_read_SD + !word msg_ACPTR_read_FD + !word msg_ACPTR_read_RD diff --git a/src/dos_m65/msg_ciout.s b/src/dos_m65/msg_ciout.s index e62e376d..3885020c 100644 --- a/src/dos_m65/msg_ciout.s +++ b/src/dos_m65/msg_ciout.s @@ -7,10 +7,12 @@ msg_CIOUT: jsr dos_ENTER + php ; Check operation mode ldx IDX1_LISTENER + bmi msg_CIOUT_fail lda XX_MODE, x cmp #$01 @@ -18,14 +20,20 @@ msg_CIOUT: ; Receiving command or file name - ldx IDX2_TALKER + ldx IDX2_LISTENER jmp (msg_CIOUT_cmdfn_vectab, X) @1: ; XXX handle cases of transferring data + plp jmp dos_EXIT_SEC +msg_CIOUT_fail: + ; XXX should we set status? + lda #K_ERR_DEVICE_NOT_FOUND + + jmp dos_EXIT_A_SEC @@ -41,6 +49,8 @@ msg_CIOUT_cmdfn_SD: ; get next byte of status - SD card @1: lda #$00 sta SD_CMDFN_IDX,x + plp + +bcs dev_sd_cmd_OPEN_EOI ; if EOI - execute command jmp dos_EXIT msg_CIOUT_cmdfn_FD: ; get next byte of status - floppy @@ -53,6 +63,8 @@ msg_CIOUT_cmdfn_FD: ; get next byte of status - floppy @1: lda #$00 sta FD_CMDFN_IDX,x + plp + +bcs dev_fd_cmd_OPEN_EOI ; if EOI - execute command jmp dos_EXIT msg_CIOUT_cmdfn_RD: ; get next byte of status - ram disk @@ -65,6 +77,8 @@ msg_CIOUT_cmdfn_RD: ; get next byte of status - ram disk @1: lda #$00 sta RD_CMDFN_IDX,x + plp + +bcs dev_rd_cmd_OPEN_EOI ; if EOI - execute command jmp dos_EXIT msg_CIOUT_cmdfn_vectab: diff --git a/tools/generate_strings.cc b/tools/generate_strings.cc index 424bed0a..78191819 100644 --- a/tools/generate_strings.cc +++ b/tools/generate_strings.cc @@ -1224,7 +1224,7 @@ void DataSet::generateConfigDepStrings() // CBDOS features - featureStrM65 += "CBDOS : SDCARD "; + featureStrM65 += "CBDOS : SD CARD "; // Keyboard support features