From f6abf8e4cd120b75e3675e3a5fee403117b4f5cb Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 16 May 2021 17:58:22 +0200 Subject: [PATCH] some work towards 2nd floppy --- CONFIG.md | 2 +- Makefile | 1 + src/,,config_mega65.s | 3 +- src/basic/board_u64/bankswitch.txt | 12 ++ src/dos_m65/,aliases_dos.s | 142 ++++++++++-------- src/dos_m65/dos_init.s | 8 +- src/dos_m65/dos_memchk.s | 6 + src/dos_m65/dos_unitchk.s | 17 ++- src/dos_m65/dos_unitnum.s | 13 +- src/dos_m65/dos_unitset.s | 18 ++- .../filesystem_cbm/fs_cbm_nextdirentry.s | 10 +- .../filesystem_cbm/fs_cbm_nextfileblock.s | 14 +- src/dos_m65/filesystem_cbm/fs_cbm_read_dir.s | 72 ++++----- src/dos_m65/filesystem_cbm/fs_cbm_read_file.s | 8 +- src/dos_m65/pseudoiec/msg_acptr.s | 72 +++++++-- src/dos_m65/pseudoiec/msg_ciout.s | 30 +++- src/dos_m65/pseudoiec/msg_listen.s | 30 +++- src/dos_m65/pseudoiec/msg_talk.s | 30 +++- src/dos_m65/unit_floppy/unit_fd_cmd_open.s | 12 +- src/dos_m65/unit_floppy/unit_fd_cmd_read.s | 12 +- src/dos_m65/unit_floppy/unit_fd_init.s | 27 +++- src/dos_m65/utils/util_status.s | 15 +- src/kernal/iec_fast/m65dos_bridge.s | 2 +- 23 files changed, 370 insertions(+), 186 deletions(-) create mode 100644 src/basic/board_u64/bankswitch.txt diff --git a/CONFIG.md b/CONFIG.md index befc3550..e74d85bb 100644 --- a/CONFIG.md +++ b/CONFIG.md @@ -177,7 +177,7 @@ Enable this option if you are using a tape interface adapter lacking tape motor ## Additional storage -### `UNIT_SDCARD`, `UNIT_FLOPPY`, `UNIT_RAMDISK` +### `UNIT_SDCARD`, `UNIT_FLOPPY0`, `UNIT_FLOPPY1`, `UNIT_RAMDISK` MEGA65 specific pseudo-IEC devices, handled by internal DOS (work in progress). If set to 0, given unit is disabled. Otherwise - assigns IEC unit number to the given storage. diff --git a/Makefile b/Makefile index 0d33ce72..c900042c 100644 --- a/Makefile +++ b/Makefile @@ -21,6 +21,7 @@ SRCDIR_BASIC = $(SRCDIR_COMMON) \ src/basic/basic_functions_06 \ src/basic/board_crt \ src/basic/board_m65 \ + src/basic/board_u64 \ src/basic/board_x16 \ src/basic/engine_editor \ src/basic/engine_runtime \ diff --git a/src/,,config_mega65.s b/src/,,config_mega65.s index 21d7e6fe..d1d19ebc 100644 --- a/src/,,config_mega65.s +++ b/src/,,config_mega65.s @@ -91,7 +91,8 @@ ; --- Built-in DOS configuration ;; #CONFIG# UNIT_SDCARD 27 -;; #CONFIG# UNIT_FLOPPY 28 ; XXX use separate number for second floppy (device 29) +;; #CONFIG# UNIT_FLOPPY0 28 +;; #CONFIG# UNIT_FLOPPY1 29 ;; #CONFIG# UNIT_RAMDISK 30 diff --git a/src/basic/board_u64/bankswitch.txt b/src/basic/board_u64/bankswitch.txt new file mode 100644 index 00000000..708c9a72 --- /dev/null +++ b/src/basic/board_u64/bankswitch.txt @@ -0,0 +1,12 @@ + +Information about Ultimate 64 bank switching: https://www.forum64.de/index.php?thread/102375-16k-bzw-24k-kernal/&postID=1674790#post1674790 + + lda $e460 ; only needed if switching from outside of the Kernal + lda $e460 + lda $e494 + lda $e464 + lda $e462 + lda $e495 + lda $e480+bankno + +There can be no $e460-$e49f access in between. diff --git a/src/dos_m65/,aliases_dos.s b/src/dos_m65/,aliases_dos.s index 8d07ebb8..0cd6902b 100644 --- a/src/dos_m65/,aliases_dos.s +++ b/src/dos_m65/,aliases_dos.s @@ -32,13 +32,14 @@ !addr RAM_ATTIC = $8009 ; $8000000-$87FFFFF RAM status; 0 = not present, $FF = present !addr RAM_CELLAR = $800A ; $8800000-$8FFFFFF RAM status; 0 = not present, $FF = present - ; Reserved: $800B - $800C + ; Reserved: $800B ; General DOS configuration - !addr UNIT_SDCARD = $800D ; unit number for device, 0 = none - !addr UNIT_FLOPPY = $800E ; as above - !addr UNIT_RAMDISK = $800F ; as above + !addr UNIT_SDCARD = $800C ; unit number for device, 0 = none + !addr UNIT_FLOPPY0 = $800D ; as above - for the internal floppy + !addr UNIT_FLOPPY1 = $800E ; as above - for additional floppy drive + !addr UNIT_RAMDISK = $800F ; as above - for the RAM disk ; General DOS status @@ -51,7 +52,7 @@ !addr code_LDA_nnnn_Y = $8014 ; - LDA nnnn, Y instruction !addr par_LDA_nnnn_Y = $8015 ; - 2 bytes; address - !addr code_RTS_04 = $8017 ; - RTS instruction + !addr code_RTS_05 = $8017 ; - RTS instruction ; Parameters for utilities/helpers @@ -69,65 +70,78 @@ !addr XX_DIR_PHASE = $8041 ; directory output phase, values deponds on device driver, but 0 = not reading !addr SD_DIR_PHASE = $8041 ; - SD card - !addr FD_DIR_PHASE = $8042 ; - floppy - !addr RD_DIR_PHASE = $8043 ; - ram disk + !addr F0_DIR_PHASE = $8042 ; - floppy 0 + !addr F1_DIR_PHASE = $8043 ; - floppy 0 + !addr RD_DIR_PHASE = $8044 ; - ram disk - ; Free space: $8044-$8063 + ; Free space: $8045-$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 F0_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 F0_ACPTR_PTR = $8057 ; - 2 bytes; address in buffer, floppy 0 !addr code_RTS_02 = $8059 ; - RTS instruction - !addr RD_ACPTR_helper = $805A ; subroutine in RAM to read a byte + !addr F1_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 F1_ACPTR_PTR = $805B ; - 2 bytes; address in buffer, floppy 1 !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 RD_ACPTR_helper = $805E ; subroutine in RAM to read a byte + !addr code_LDA_04 = $805E ; - LDA instruction + !addr RD_ACPTR_PTR = $805F ; - 2 bytes; address in buffer, ram disk + !addr code_RTS_04 = $8061 ; - RTS instruction - !addr XX_MODE = $8064 ; current mode (0 = none, 1 = receiving command/file name) - !addr SD_MODE = $8064 ; - SD card - !addr FD_MODE = $8065 ; - floppy - !addr RD_MODE = $8066 ; - ram disk + !addr XX_ACPTR_LEN = $8062 ; 2 bytes - length of data left for ACPTR + !addr SD_ACPTR_LEN = $8062 ; - SD card + !addr F0_ACPTR_LEN = $8064 ; - floppy + !addr F1_ACPTR_LEN = $8064 ; - floppy + !addr RD_ACPTR_LEN = $8066 ; - ram disk - !addr XX_CHANNEL = $8067 ; current channel - !addr SD_CHANNEL = $8067 ; - SD card - !addr FD_CHANNEL = $8068 ; - floppy - !addr RD_CHANNEL = $8069 ; - ram disk + !addr XX_MODE = $8068 ; current mode (0 = none, 1 = receiving command/file name) + !addr SD_MODE = $8068 ; - SD card + !addr F0_MODE = $8069 ; - floppy 0 + !addr F1_MODE = $806A ; - floppy 1 + !addr RD_MODE = $806B ; - ram disk - !addr XX_CMDFN_IDX = $806A ; index byte for storing file name/command - !addr SD_CMDFN_IDX = $806A ; - SD card - !addr FD_CMDFN_IDX = $806B ; - floppy - !addr RD_CMDFN_IDX = $806C ; - ram disk + !addr XX_CHANNEL = $806C ; current channel + !addr SD_CHANNEL = $806C ; - SD card + !addr F0_CHANNEL = $806D ; - floppy 0 + !addr F1_CHANNEL = $806E ; - floppy 0 + !addr RD_CHANNEL = $806F ; - ram disk - !addr XX_STATUS_IDX = $806D ; index byte for reading status - !addr SD_STATUS_IDX = $806D ; - SD card - !addr FD_STATUS_IDX = $806E ; - floppy - !addr RD_STATUS_IDX = $806F ; - ram disk + !addr XX_CMDFN_IDX = $8070 ; index byte for storing file name/command + !addr SD_CMDFN_IDX = $8070 ; - SD card + !addr F0_CMDFN_IDX = $8071 ; - floppy 0 + !addr F1_CMDFN_IDX = $8072 ; - floppy 1 + !addr RD_CMDFN_IDX = $8073 ; - ram disk + + !addr XX_STATUS_IDX = $8074 ; index byte for reading status + !addr SD_STATUS_IDX = $8074 ; - SD card + !addr F0_STATUS_IDX = $8075 ; - floppy + !addr F1_STATUS_IDX = $8076 ; - floppy + !addr RD_STATUS_IDX = $8077 ; - ram disk ; Various, most likely to be reworked - !addr SD_DESC = $8070 ; current file descriptor - !addr FD_DIRENT = $8071 ; directory entry to read, 0-15 + !addr SD_DESC = $8078 ; current file descriptor + !addr F0_DIRENT = $8079 ; directory entry to read, 0-15 + !addr F1_DIRENT = $807A ; directory entry to read, 0-15 - !addr FD_LOADTRACK = $8072 ; current track for file loading - !addr FD_LOADSECTOR = $8073 ; current sector for file loading + !addr F0_LOADTRACK = $807B ; current track for file loading + !addr F0_LOADSECTOR = $807C ; current sector for file loading - !addr RD_STARTSEG = $8074 ; RAM disk start address, 2nd most significant byte (or $FF if no RAM) - !addr RD_MAXTRACK = $8075 ; maximum RAM disk track number + !addr F1_LOADTRACK = $807D ; current track for file loading + !addr F1_LOADSECTOR = $807E ; current sector for file loading + !addr RD_STARTSEG = $807F ; RAM disk start address, 2nd most significant byte (or $FF if no RAM) + !addr RD_MAXTRACK = $8080 ; maximum RAM disk track number - ; XXX Free space - + ; Reserved: $8081-$81FF ; ; Various buffers, caches, and other large memory chunks @@ -137,8 +151,8 @@ ; General purpose buffers, 512 bytes each, each starts at page start - XXX dynamic alllocation to be written !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_1 = $8400 ; XXX temporarily hardcoded for usage by floppy 0 + !addr SHARED_BUF_2 = $8600 ; XXX temporarily hardcoded for usage by floppy 1 !addr SHARED_BUF_3 = $8800 !addr SHARED_BUF_4 = $8A00 !addr SHARED_BUF_5 = $8C00 @@ -151,49 +165,51 @@ !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 + !addr F0_BAM_CACHE = $A000 ; - floppy disk 0 BAM + !addr SHARED_BUF_X0 = $A200 ; - buffer which can be used if disk is not ED + !addr F1_BAM_CACHE = $A400 ; - floppy disk 1 BAM + !addr SHARED_BUF_X1 = $A600 ; - buffer which can be used if disk is not ED ; Memory shadow, needed for SD card support - !addr SD_MEMSHADOW_BUF = $AA00 ; 256 byte buffer for preserving original memory content + !addr SD_MEMSHADOW_BUF = $A800 ; 256 byte buffer for preserving original memory content - ; Command/filename buffers, 128 bytes each - XXX extend to 256 bytes (change implementation) + ; Command/filename buffers, 256 bytes each - !addr SD_CMDFN_BUF = $AB00 ; - SD card - !addr FD_CMDFN_BUF = $AC00 ; - floppy + !addr SD_CMDFN_BUF = $A900 ; - SD card + !addr F0_CMDFN_BUF = $AA00 ; - floppy 0 + !addr F1_CMDFN_BUF = $AB00 ; - floppy 1 !addr RD_CMDFN_BUF = $AD00 ; - ram disk ; Directory entry buffers, in BASIC format, $30 bytes each !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 + !addr F0_DIRENT_BUF = $AE30 ; - floppy 0 + !addr F1_DIRENT_BUF = $AE60 ; - floppy 1 + !addr RD_DIRENT_BUF = $AE90 ; - ram disk ; Status buffers, content terminated by 0, $30 bytes each - !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 + !addr XX_STATUS_BUF = $AEC0 + !addr SD_STATUS_BUF = $AEC0 ; - SD card + !addr F0_STATUS_BUF = $AEF0 ; - floppy 0 + !addr F1_STATUS_BUF = $AF20 ; - floppy 1 + !addr RD_STATUS_BUF = $AF50 ; - ram disk ; Shared buffer metadata tables, 18 bytes each - !addr BUFTAB_UNIT = $AF20 ; which unit the buffer is assigned to - !addr BUFTAB_DEV = $AF32 ; which device within the unit - !addr BUFTAB_TRACK = $AF44 ; which track (or other kind of handle) - !addr BUFTAB_SECTOR = $AF56 ; which sector is stored in the first half of the buffer + !addr BUFTAB_UNIT = $AF50 ; which unit the buffer is assigned to + !addr BUFTAB_DEV = $AF62 ; which device within the unit + !addr BUFTAB_TRACK = $AF74 ; which track (or other kind of handle) + !addr BUFTAB_SECTOR = $AF86 ; which sector is stored in the first half of the buffer ; Common DMA list, 15 bytes - !addr DMAJOB_LIST = $AF68 + !addr DMAJOB_LIST = $AF98 !addr DMAJOB_SRC_MB = DMAJOB_LIST+2 !addr DMAJOB_DST_MB = DMAJOB_LIST+4 !addr DMAJOB_SIZE = DMAJOB_LIST+7 ; keep $0200 here @@ -204,4 +220,4 @@ ; Reserved 20 KB for floppy track buffers + some area still free ; - !addr XX_REMAINING = $AF87 + !addr XX_REMAINING = $AFA7 diff --git a/src/dos_m65/dos_init.s b/src/dos_m65/dos_init.s index f4c5c5d3..764dd2ca 100644 --- a/src/dos_m65/dos_init.s +++ b/src/dos_m65/dos_init.s @@ -26,8 +26,10 @@ dos_INIT: lda #CONFIG_UNIT_SDCARD sta UNIT_SDCARD - lda #CONFIG_UNIT_FLOPPY - sta UNIT_FLOPPY + lda #CONFIG_UNIT_FLOPPY0 + sta UNIT_FLOPPY0 + lda #CONFIG_UNIT_FLOPPY1 + sta UNIT_FLOPPY1 lda #CONFIG_UNIT_RAMDISK sta UNIT_RAMDISK @@ -68,6 +70,7 @@ dos_INIT: sta code_LDA_01 sta code_LDA_02 sta code_LDA_03 + sta code_LDA_04 lda #$B9 ; LDA nnnn, y opcode sta code_LDA_nnnn_Y @@ -77,6 +80,7 @@ dos_INIT: sta code_RTS_02 sta code_RTS_03 sta code_RTS_04 + sta code_RTS_05 ; Initialize device handlers diff --git a/src/dos_m65/dos_memchk.s b/src/dos_m65/dos_memchk.s index cde237bb..58af78c8 100644 --- a/src/dos_m65/dos_memchk.s +++ b/src/dos_m65/dos_memchk.s @@ -28,6 +28,8 @@ dos_MEMCHK: bne @fail cmp code_LDA_03 bne @fail + cmp code_LDA_04 + bne @fail lda #$60 cmp code_RTS_01 @@ -36,6 +38,10 @@ dos_MEMCHK: bne @fail cmp code_RTS_03 bne @fail + cmp code_RTS_04 + bne @fail + cmp code_RTS_05 + bne @fail plx pla diff --git a/src/dos_m65/dos_unitchk.s b/src/dos_m65/dos_unitchk.s index b14c09f9..be4d694e 100644 --- a/src/dos_m65/dos_unitchk.s +++ b/src/dos_m65/dos_unitchk.s @@ -18,8 +18,10 @@ dos_UNITCHK: cmp UNIT_SDCARD beq dos_UNITCHK_sdcard - cmp UNIT_FLOPPY - beq dos_UNITCHK_floppy + cmp UNIT_FLOPPY0 + beq dos_UNITCHK_floppy0 + cmp UNIT_FLOPPY1 + beq dos_UNITCHK_floppy1 cmp UNIT_RAMDISK beq dos_UNITCHK_ramdisk @@ -36,15 +38,22 @@ dos_UNITCHK_sdcard: ; FALLTROUGH -dos_UNITCHK_floppy: +dos_UNITCHK_floppy0: lda #$01 +skip_2_bytes_trash_nvz ; FALLTROUGH -dos_UNITCHK_ramdisk: +dos_UNITCHK_floppy1: lda #$02 + +skip_2_bytes_trash_nvz + + ; FALLTROUGH + +dos_UNITCHK_ramdisk: + + lda #$03 jmp dos_EXIT_CLC_A diff --git a/src/dos_m65/dos_unitnum.s b/src/dos_m65/dos_unitnum.s index 06857073..b3d4be36 100644 --- a/src/dos_m65/dos_unitnum.s +++ b/src/dos_m65/dos_unitnum.s @@ -20,8 +20,10 @@ dos_UNITNUM: cmp #$00 beq dos_UNITNUM_sdcard cmp #$01 - beq dos_UNITNUM_floppy + beq dos_UNITNUM_floppy0 cmp #$02 + beq dos_UNITNUM_floppy1 + cmp #$03 beq dos_UNITNUM_ramdisk ; FALLTROUGH @@ -37,9 +39,14 @@ dos_UNITNUM_sdcard: lda UNIT_SDCARD bra dos_UNITNUM_common -dos_UNITNUM_floppy: +dos_UNITNUM_floppy0: - lda UNIT_FLOPPY + lda UNIT_FLOPPY0 + bra dos_UNITNUM_common + +dos_UNITNUM_floppy1: + + lda UNIT_FLOPPY1 bra dos_UNITNUM_common dos_UNITNUM_ramdisk: diff --git a/src/dos_m65/dos_unitset.s b/src/dos_m65/dos_unitset.s index 02b89f9d..873aa3b6 100644 --- a/src/dos_m65/dos_unitset.s +++ b/src/dos_m65/dos_unitset.s @@ -21,8 +21,10 @@ dos_UNITSET: cmp #$00 beq dos_UNITSET_sdcard cmp #$01 - beq dos_UNITSET_floppy + beq dos_UNITSET_floppy0 cmp #$02 + beq dos_UNITSET_floppy1 + cmp #$03 beq dos_UNITSET_ramdisk jmp dos_EXIT_SEC @@ -30,15 +32,23 @@ dos_UNITSET: dos_UNITSET_sdcard: stx UNIT_SDCARD - +skip_2_bytes_trash_nvz ; FALLTROUGH -dos_UNITSET_floppy: +dos_UNITSET_end: - stx UNIT_FLOPPY jmp dos_EXIT_CLC +dos_UNITSET_floppy0: + + stx UNIT_FLOPPY0 + bra dos_UNITSET_end + +dos_UNITSET_floppy1: + + stx UNIT_FLOPPY1 + bra dos_UNITSET_end + dos_UNITSET_ramdisk: stx UNIT_RAMDISK diff --git a/src/dos_m65/filesystem_cbm/fs_cbm_nextdirentry.s b/src/dos_m65/filesystem_cbm/fs_cbm_nextdirentry.s index 1762546d..47d02008 100644 --- a/src/dos_m65/filesystem_cbm/fs_cbm_nextdirentry.s +++ b/src/dos_m65/filesystem_cbm/fs_cbm_nextdirentry.s @@ -12,7 +12,7 @@ fs_cbm_nextdirentry: - lda FD_DIRENT + lda F0_DIRENT ; If first entry within sector - make sure it is present within the buffer @@ -42,7 +42,7 @@ fs_cbm_nextdirentry: @1: ; Set next directory entry - inc FD_DIRENT + inc F0_DIRENT ; Copy data to parameter variables @@ -69,10 +69,10 @@ fs_cbm_nextdirentry: ldy #$03 ; get file starting track and sector jsr code_LDA_nnnn_Y - sta FD_LOADTRACK + sta F0_LOADTRACK iny jsr code_LDA_nnnn_Y - sta FD_LOADSECTOR + sta F0_LOADSECTOR iny ; copy the file name @lp1: @@ -124,7 +124,7 @@ fs_cbm_nextdirentry: beq @2 lda #$08 @2: - sta FD_DIRENT + sta F0_DIRENT jmp @cont @end_of_dir: diff --git a/src/dos_m65/filesystem_cbm/fs_cbm_nextfileblock.s b/src/dos_m65/filesystem_cbm/fs_cbm_nextfileblock.s index 8d2c2803..d45afb47 100644 --- a/src/dos_m65/filesystem_cbm/fs_cbm_nextfileblock.s +++ b/src/dos_m65/filesystem_cbm/fs_cbm_nextfileblock.s @@ -4,6 +4,8 @@ ; +; XXX add support for both floppies + fs_cbm_nextfileblock: ; Fetch the next track/sector @@ -55,14 +57,14 @@ fs_cbm_nextfileblock_got_ts: ; Store pointer and amount of data ready to fetch lda #$FE - sta FD_ACPTR_LEN+0 + sta F0_ACPTR_LEN+0 lda #$00 - sta FD_ACPTR_LEN+1 + sta F0_ACPTR_LEN+1 lda #$02 - sta FD_ACPTR_PTR+0 + sta F0_ACPTR_PTR+0 lda #>SHARED_BUF_1 - sta FD_ACPTR_PTR+1 + sta F0_ACPTR_PTR+1 lda PAR_SECTOR and #$01 @@ -84,7 +86,7 @@ fs_cbm_nextfileblock_got_ts: ; Sector with data is located in the 2nd half of the buffer - inc FD_ACPTR_PTR+1 + inc F0_ACPTR_PTR+1 lda SHARED_BUF_1+$100+0 bne @exit @@ -99,7 +101,7 @@ fs_cbm_nextfileblock_got_ts: cmp #$FF beq fs_cbm_nextfileblock_eof - sta FD_ACPTR_LEN+0 + sta F0_ACPTR_LEN+0 ; FALLTROUGH 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 5f07a556..8a726854 100644 --- a/src/dos_m65/filesystem_cbm/fs_cbm_read_dir.s +++ b/src/dos_m65/filesystem_cbm/fs_cbm_read_dir.s @@ -20,56 +20,56 @@ fs_cbm_read_dir_open: ldx #$1F ; first fetch the template @lp1: lda dir_hdr,x - sta FD_DIRENT_BUF,x + sta F0_DIRENT_BUF,x dex bpl @lp1 ldx #$0F ; file name @lp2: lda SHARED_BUF_1+$04,x - sta FD_DIRENT_BUF+$08,x + sta F0_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 + sta F0_DIRENT_BUF+$1A @skip1: lda SHARED_BUF_1+$17 cmp #$A0 beq @skip2 - sta FD_DIRENT_BUF+$1B + sta F0_DIRENT_BUF+$1B @skip2: lda SHARED_BUF_1+$19 ; dos version - sta FD_DIRENT_BUF+$1D + sta F0_DIRENT_BUF+$1D lda SHARED_BUF_1+$1A - sta FD_DIRENT_BUF+$1E + sta F0_DIRENT_BUF+$1E ; Provide pointer to the header lda #$20 - sta FD_ACPTR_LEN+0 + sta F0_ACPTR_LEN+0 lda #$00 - sta FD_ACPTR_LEN+1 + sta F0_ACPTR_LEN+1 - lda #FD_DIRENT_BUF - sta FD_ACPTR_PTR+1 + lda #F0_DIRENT_BUF + sta F0_ACPTR_PTR+1 ; Set directory phase to 'file name' lda #$01 - sta FD_DIR_PHASE + sta F0_DIR_PHASE ; Copy 1st BAM sector to the cache ldx #$00 @lp3: lda SHARED_BUF_1+$100, x - sta FD_BAM_CACHE_0,x + sta F0_BAM_CACHE,x inx bne @lp3 @@ -85,14 +85,14 @@ fs_cbm_read_dir_open: ldx #$00 @lp4: lda SHARED_BUF_1, x - sta FD_BAM_CACHE_0+$100,x + sta F0_BAM_CACHE+$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 + sta F0_DIRENT ; Make sure the 1st sector in buffer points to 2nd one @@ -117,22 +117,22 @@ fs_cbm_read_dir: ; Prepare output entry, starting from XX_DIRENT_BUF + initial offset jsr util_dir_filesize_blocks - ldx #(FD_DIRENT_BUF - XX_DIRENT_BUF) + ldx #(F0_DIRENT_BUF - XX_DIRENT_BUF) ldx #$30 jsr util_dir_basic ; Provide pointers and length - sta FD_ACPTR_LEN+1 + sta F0_ACPTR_LEN+1 txa sec sbc #$30 - sta FD_ACPTR_LEN+0 + sta F0_ACPTR_LEN+0 - lda #<(FD_DIRENT_BUF) - sta FD_ACPTR_PTR+0 - lda #>(FD_DIRENT_BUF) - sta FD_ACPTR_PTR+1 + lda #<(F0_DIRENT_BUF) + sta F0_ACPTR_PTR+0 + lda #>(F0_DIRENT_BUF) + sta F0_ACPTR_PTR+1 clc rts @@ -143,7 +143,7 @@ fs_cbm_read_dir_blocksfree: ldx #$13 @lp1: lda dir_end, x - sta FD_DIRENT_BUF, x + sta F0_DIRENT_BUF, x dex bpl @lp1 @@ -151,11 +151,11 @@ fs_cbm_read_dir_blocksfree: ldx #$10 @lp2: - lda FD_BAM_CACHE_0+$100,x + lda F0_BAM_CACHE+$100,x jsr @sub_free_add cpx #$FA beq @lp2_end - lda FD_BAM_CACHE_0+$000,x + lda F0_BAM_CACHE+$000,x jsr @sub_free_add inx inx @@ -170,19 +170,19 @@ fs_cbm_read_dir_blocksfree: ; Set pointer and length lda #$13 - sta FD_ACPTR_LEN+0 + sta F0_ACPTR_LEN+0 lda #$00 - sta FD_ACPTR_LEN+1 + sta F0_ACPTR_LEN+1 - lda #FD_DIRENT_BUF - sta FD_ACPTR_PTR+1 + lda #F0_DIRENT_BUF + sta F0_ACPTR_PTR+1 ; Mark end of directory lda #$00 - sta FD_DIR_PHASE + sta F0_DIR_PHASE clc rts @@ -193,9 +193,9 @@ fs_cbm_read_dir_blocksfree: ; Helper routine to calculate free blocks clc - adc FD_DIRENT_BUF+2 - sta FD_DIRENT_BUF+2 + adc F0_DIRENT_BUF+2 + sta F0_DIRENT_BUF+2 bcc @noinc - inc FD_DIRENT_BUF+3 + inc F0_DIRENT_BUF+3 @noinc: rts 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 ea9c1329..36951d18 100644 --- a/src/dos_m65/filesystem_cbm/fs_cbm_read_file.s +++ b/src/dos_m65/filesystem_cbm/fs_cbm_read_file.s @@ -18,7 +18,7 @@ fs_cbm_read_file_open: ; Set variables to point to the 1st directory entry in the 2nd sector of the buffer lda #$08 - sta FD_DIRENT + sta F0_DIRENT ; Make sure the 1st sector in buffer points to 2nd one @@ -51,11 +51,11 @@ fs_cbm_read_file_open: ; Found the file, load it lda #$03 ; mode: read file - sta FD_MODE + sta F0_MODE - lda FD_LOADTRACK + lda F0_LOADTRACK sta PAR_TRACK - lda FD_LOADSECTOR + lda F0_LOADSECTOR sta PAR_SECTOR jmp fs_cbm_nextfileblock_got_ts diff --git a/src/dos_m65/pseudoiec/msg_acptr.s b/src/dos_m65/pseudoiec/msg_acptr.s index c662618c..96b5934f 100644 --- a/src/dos_m65/pseudoiec/msg_acptr.s +++ b/src/dos_m65/pseudoiec/msg_acptr.s @@ -62,31 +62,61 @@ msg_ACPTR_read_SD: @3: jmp dos_EXIT_CLC -msg_ACPTR_read_FD: +msg_ACPTR_read_F0: ; Read and return one byte - jsr FD_ACPTR_helper + jsr F0_ACPTR_helper sta TBTCNT sta REG_A ; Increment pointer, decrement length - inc FD_ACPTR_PTR+0 + inc F0_ACPTR_PTR+0 bne @1 - inc FD_ACPTR_PTR+1 + inc F0_ACPTR_PTR+1 @1: - dec FD_ACPTR_LEN+0 - lda FD_ACPTR_LEN+0 + dec F0_ACPTR_LEN+0 + lda F0_ACPTR_LEN+0 cmp #$FF bne @2 - dec FD_ACPTR_LEN+1 + dec F0_ACPTR_LEN+1 @2: ; If new length is 0, try to read next block of data - ora FD_ACPTR_LEN+1 + ora F0_ACPTR_LEN+1 bne @3 - jsr unit_fd_cmd_READ + jsr unit_f0_cmd_READ + bcc @3 + jsr kernalstatus_EOI +@3: + jmp dos_EXIT_CLC + +msg_ACPTR_read_F1: + + ; Read and return one byte + + jsr F1_ACPTR_helper + sta TBTCNT + sta REG_A + + ; Increment pointer, decrement length + + inc F1_ACPTR_PTR+0 + bne @1 + inc F1_ACPTR_PTR+1 +@1: + dec F1_ACPTR_LEN+0 + lda F1_ACPTR_LEN+0 + cmp #$FF + bne @2 + dec F1_ACPTR_LEN+1 +@2: + ; If new length is 0, try to read next block of data + + ora F1_ACPTR_LEN+1 + bne @3 + jsr unit_f1_cmd_READ bcc @3 jsr kernalstatus_EOI @3: @@ -117,11 +147,18 @@ msg_ACPTR_status_SD: ; get next byte of status - SD card lda SD_STATUS_BUF,x bra msg_ACPTR_status_got -msg_ACPTR_status_FD: ; get next byte of status - floppy +msg_ACPTR_status_F0: ; get next byte of status - floppy 0 - ldx FD_STATUS_IDX - inc FD_STATUS_IDX - lda FD_STATUS_BUF,x + ldx F0_STATUS_IDX + inc F0_STATUS_IDX + lda F0_STATUS_BUF,x + bra msg_ACPTR_status_got + +msg_ACPTR_status_F1: ; get next byte of status - floppy 0 + + ldx F1_STATUS_IDX + inc F1_STATUS_IDX + lda F1_STATUS_BUF,x bra msg_ACPTR_status_got msg_ACPTR_status_RD: ; get next byte of status - ram disk @@ -166,17 +203,20 @@ msg_ACPTR_EOI: msg_ACPTR_status_vectab: !word msg_ACPTR_status_SD - !word msg_ACPTR_status_FD + !word msg_ACPTR_status_F0 + !word msg_ACPTR_status_F1 !word msg_ACPTR_status_RD msg_ACPTR_read_vectab: !word msg_ACPTR_read_SD - !word msg_ACPTR_read_FD + !word msg_ACPTR_read_F0 + !word msg_ACPTR_read_F1 !word msg_ACPTR_read_RD msg_ACPTR_set_status_vectab: !word util_status_SD - !word util_status_FD + !word util_status_F0 + !word util_status_F1 !word util_status_RD diff --git a/src/dos_m65/pseudoiec/msg_ciout.s b/src/dos_m65/pseudoiec/msg_ciout.s index 5f819460..369d38d3 100644 --- a/src/dos_m65/pseudoiec/msg_ciout.s +++ b/src/dos_m65/pseudoiec/msg_ciout.s @@ -38,7 +38,7 @@ msg_CIOUT_fail: -; Receiving command/file name +; Receiving command/file name XXX limit $7F is too small, buffer size is 256 bytes msg_CIOUT_cmdfn_SD: ; get next byte of status - SD card @@ -55,17 +55,32 @@ msg_CIOUT_cmdfn_SD: ; get next byte of status - SD card +bcs unit_sd_cmd_OPEN_EOI ; if EOI - execute command jmp dos_EXIT_CLC -msg_CIOUT_cmdfn_FD: ; get next byte of status - floppy +msg_CIOUT_cmdfn_F0: ; get next byte of status - floppy - ldx FD_CMDFN_IDX - sta FD_CMDFN_BUF,x + ldx F0_CMDFN_IDX + sta F0_CMDFN_BUF,x inx bpl @1 ldx #$7F @1: - stx FD_CMDFN_IDX + stx F0_CMDFN_IDX lda #$A0 - sta FD_CMDFN_BUF,x + sta F0_CMDFN_BUF,x + plp + +bcs unit_fd_cmd_OPEN_EOI ; if EOI - execute command + jmp dos_EXIT_CLC + +msg_CIOUT_cmdfn_F1: ; get next byte of status - floppy + + ldx F1_CMDFN_IDX + sta F1_CMDFN_BUF,x + inx + bpl @1 + ldx #$7F +@1: + stx F1_CMDFN_IDX + lda #$A0 + sta F1_CMDFN_BUF,x plp +bcs unit_fd_cmd_OPEN_EOI ; if EOI - execute command jmp dos_EXIT_CLC @@ -88,5 +103,6 @@ msg_CIOUT_cmdfn_RD: ; get next byte of status - ram disk msg_CIOUT_cmdfn_vectab: !word msg_CIOUT_cmdfn_SD - !word msg_CIOUT_cmdfn_FD + !word msg_CIOUT_cmdfn_F0 + !word msg_CIOUT_cmdfn_F1 !word msg_CIOUT_cmdfn_RD diff --git a/src/dos_m65/pseudoiec/msg_listen.s b/src/dos_m65/pseudoiec/msg_listen.s index b8c3f3a8..8cd2e460 100644 --- a/src/dos_m65/pseudoiec/msg_listen.s +++ b/src/dos_m65/pseudoiec/msg_listen.s @@ -12,28 +12,44 @@ msg_LISTEN: and #$1F beq msg_LISTEN_fail ; branch if device 0 (used to denote lack of device) +@try_sd: + cmp UNIT_SDCARD - bne @1 + bne @try_f0 ; LISTEN on SD card lda #$00 bra msg_LISTEN_success -@1: - cmp UNIT_FLOPPY - bne @2 - ; LISTEN on floppy +@try_f0: + + cmp UNIT_FLOPPY0 + bne @try_f1 + + ; LISTEN on floppy 0 lda #$01 bra msg_LISTEN_success -@2: + +@try_f1: + + cmp UNIT_FLOPPY1 + bne @try_rd + + ; LISTEN on floppy 1 + + lda #$02 + bra msg_LISTEN_success + +@try_rd: + cmp UNIT_RAMDISK bne msg_LISTEN_fail ; LISTEN on ram disk - lda #$02 + lda #$03 ; FALLTROUGH diff --git a/src/dos_m65/pseudoiec/msg_talk.s b/src/dos_m65/pseudoiec/msg_talk.s index 28bb56e2..c56f7e10 100644 --- a/src/dos_m65/pseudoiec/msg_talk.s +++ b/src/dos_m65/pseudoiec/msg_talk.s @@ -12,28 +12,44 @@ msg_TALK: and #$1F beq msg_TALK_fail ; branch if device 0 (used to denote lack of device) +@try_sd: + cmp UNIT_SDCARD - bne @1 + bne @try_f0 ; TALK on SD card lda #$00 bra msg_TALK_success -@1: - cmp UNIT_FLOPPY - bne @2 - ; TALK on floppy +@try_f0: + + cmp UNIT_FLOPPY0 + bne @try_f1 + + ; TALK on floppy 0 lda #$01 bra msg_TALK_success -@2: + +@try_f1: + + cmp UNIT_FLOPPY1 + bne @try_rd + + ; TALK on floppy 1 + + lda #$02 + bra msg_TALK_success + +@try_rd: + cmp UNIT_RAMDISK bne msg_TALK_fail ; TALK on ram disk - lda #$02 + lda #$03 ; FALLTROUGH diff --git a/src/dos_m65/unit_floppy/unit_fd_cmd_open.s b/src/dos_m65/unit_floppy/unit_fd_cmd_open.s index 68bd9821..f03c8457 100644 --- a/src/dos_m65/unit_floppy/unit_fd_cmd_open.s +++ b/src/dos_m65/unit_floppy/unit_fd_cmd_open.s @@ -3,11 +3,13 @@ ; Open file for reading ; +; XXX add support for both floppies + unit_fd_cmd_OPEN: lda #$01 ; mode: receive command or file name - sta FD_MODE + sta F0_MODE jmp dos_EXIT_CLC @@ -26,7 +28,7 @@ unit_fd_cmd_OPEN_EOI: ; XXX add support for second floppy - lda FD_CMDFN_BUF + lda F0_CMDFN_BUF cmp #'$' beq unit_fd_cmd_OPEN_dir @@ -38,7 +40,7 @@ unit_fd_cmd_OPEN_file: ldy #$00 @lp1: - lda FD_CMDFN_BUF, y + lda F0_CMDFN_BUF, y cmp #$A0 beq @lp1_end sta PAR_FPATTERN, y @@ -54,13 +56,13 @@ unit_fd_cmd_OPEN_file: unit_fd_cmd_OPEN_dir: lda #$02 ; mode: read directory - sta FD_MODE + sta F0_MODE ; Copy the filter from command XXX this should be moved to common part and deduplicated with file opening ldy #$00 @lp1: - lda FD_CMDFN_BUF+1, y + lda F0_CMDFN_BUF+1, y cmp #$A0 beq @lp1_end sta PAR_FPATTERN, y diff --git a/src/dos_m65/unit_floppy/unit_fd_cmd_read.s b/src/dos_m65/unit_floppy/unit_fd_cmd_read.s index 3dad8028..9c7b9ab7 100644 --- a/src/dos_m65/unit_floppy/unit_fd_cmd_read.s +++ b/src/dos_m65/unit_floppy/unit_fd_cmd_read.s @@ -4,13 +4,21 @@ ; +unit_f0_cmd_READ: + + ; XXX provide implementation + +unit_f1_cmd_READ: + + ; XXX provide implementation + unit_fd_cmd_READ: - lda FD_MODE + lda F0_MODE cmp #$03 +beq fs_cbm_nextfileblock - lda FD_DIR_PHASE + lda F0_DIR_PHASE cmp #$01 +beq fs_cbm_read_dir cmp #$02 diff --git a/src/dos_m65/unit_floppy/unit_fd_init.s b/src/dos_m65/unit_floppy/unit_fd_init.s index 9e254cba..9b95f591 100644 --- a/src/dos_m65/unit_floppy/unit_fd_init.s +++ b/src/dos_m65/unit_floppy/unit_fd_init.s @@ -9,18 +9,29 @@ unit_fd_init: ; Copy status string ldx #$00 - 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 + + stx F0_STATUS_IDX + stx F0_CMDFN_IDX + stx F0_MODE + stx F0_ACPTR_LEN+0 + stx F0_ACPTR_LEN+1 + stx F0_ACPTR_PTR+0 + stx F0_ACPTR_PTR+1 + + stx F1_STATUS_IDX + stx F1_CMDFN_IDX + stx F1_MODE + stx F1_ACPTR_LEN+0 + stx F1_ACPTR_LEN+1 + stx F1_ACPTR_PTR+0 + stx F1_ACPTR_PTR+1 + dex @1: inx lda dos_sts_init_floppy,x - sta FD_STATUS_BUF,x + sta F0_STATUS_BUF,x + sta F1_STATUS_BUF,x bne @1 ; Initialize the controller diff --git a/src/dos_m65/utils/util_status.s b/src/dos_m65/utils/util_status.s index 209a73cd..50340ef1 100644 --- a/src/dos_m65/utils/util_status.s +++ b/src/dos_m65/utils/util_status.s @@ -14,18 +14,25 @@ util_status_SD: ldx #$00 ; offset to status buffer bra util_status_common -util_status_FD: +util_status_F0: ldx #$00 - stx FD_STATUS_IDX ; set first byte of status to read - ldx #$20 ; offset to status buffer + stx F0_STATUS_IDX ; set first byte of status to read + ldx #$30 ; offset to status buffer + bra util_status_common + +util_status_F1: + + ldx #$00 + stx F1_STATUS_IDX ; set first byte of status to read + ldx #$60 ; offset to status buffer bra util_status_common util_status_RD: ldx #$00 stx RD_STATUS_IDX ; set first byte of status to read - ldx #$40 ; offset to status buffer + ldx #$90 ; offset to status buffer ; FALLLTROUGH diff --git a/src/kernal/iec_fast/m65dos_bridge.s b/src/kernal/iec_fast/m65dos_bridge.s index 9d60ffc5..439c5d01 100644 --- a/src/kernal/iec_fast/m65dos_bridge.s +++ b/src/kernal/iec_fast/m65dos_bridge.s @@ -41,7 +41,7 @@ m65dos_unitchk: ; XXX expose to BASIC ; Checks is the unit number is supported by the internal DOS ; Input: .A - unit number to check - ; Output: Carry set if not supported, otherwise .A contains unit type (0 = SD card, 1 = internal floppy, 2 = RAM disk) + ; Output: Carry set if not supported, otherwise .A contains unit type (0 = SD card, 1/2 = internal/external floppy, 3 = RAM disk) jsr map_DOS_1 jsr (VDOS_UNITCHK)