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..2a273598 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 \ @@ -67,9 +68,9 @@ SRCDIR_DOS_M65 = $(SRCDIR_COMMON) \ src/dos_m65/filesystem_vfs \ src/dos_m65/lowlevel \ src/dos_m65/pseudoiec \ - src/dos_m65/unit_floppy \ + src/dos_m65/unit_card \ + src/dos_m65/unit_disk \ src/dos_m65/unit_ramdisk \ - src/dos_m65/unit_sdcard \ src/dos_m65/utils SRCDIR_MON_M65 = $(SRCDIR_COMMON) \ diff --git a/bin/basic_generic.rom b/bin/basic_generic.rom index 30d54dee..1ddfbd82 100644 Binary files a/bin/basic_generic.rom and b/bin/basic_generic.rom differ diff --git a/bin/basic_generic_crt.rom b/bin/basic_generic_crt.rom index f8eff4df..3549c683 100644 Binary files a/bin/basic_generic_crt.rom and b/bin/basic_generic_crt.rom differ diff --git a/bin/basic_ultimate64.rom b/bin/basic_ultimate64.rom index d5158567..4aefc34a 100644 Binary files a/bin/basic_ultimate64.rom and b/bin/basic_ultimate64.rom differ diff --git a/bin/extrom_generic_crt.crt b/bin/extrom_generic_crt.crt index 7827e060..4780c72a 100644 Binary files a/bin/extrom_generic_crt.crt and b/bin/extrom_generic_crt.crt differ diff --git a/bin/kernal_generic.rom b/bin/kernal_generic.rom index 252077d2..2819eeac 100644 Binary files a/bin/kernal_generic.rom and b/bin/kernal_generic.rom differ diff --git a/bin/kernal_generic_crt.rom b/bin/kernal_generic_crt.rom index dcbb525a..f976ce2d 100644 Binary files a/bin/kernal_generic_crt.rom and b/bin/kernal_generic_crt.rom differ diff --git a/bin/kernal_ultimate64.rom b/bin/kernal_ultimate64.rom index 3ecb2aec..ef234000 100644 Binary files a/bin/kernal_ultimate64.rom and b/bin/kernal_ultimate64.rom differ diff --git a/bin/mega65.rom b/bin/mega65.rom index b5c42ccf..a089f01f 100644 Binary files a/bin/mega65.rom and b/bin/mega65.rom differ diff --git a/bin/mega65_orfont.rom b/bin/mega65_orfont.rom index b106ad9a..d516675e 100644 Binary files a/bin/mega65_orfont.rom and b/bin/mega65_orfont.rom differ diff --git a/src/,,config_mega65.s b/src/,,config_mega65.s index d9fadbe2..07bdd2ca 100644 --- a/src/,,config_mega65.s +++ b/src/,,config_mega65.s @@ -52,24 +52,24 @@ ;; #CONFIG# PROGRAMMABLE_KEYS YES -;; #CONFIG# KEYCMD_RUN "RUN" +;; #CONFIG# KEYCMD_RUN "RUN:" ;; #CONFIG# KEYCMD_F1 "@8$" ;; #CONFIG# KEYCMD_F2 "LOAD" ;; #CONFIG# KEYCMD_F3 "@9$" -;; #CONFIG# KEYCMD_F4 "RUN:" +;; #CONFIG# KEYCMD_F4 "\5FL" ;; #CONFIG# KEYCMD_F5 "@10$" -;; #CONFIG# KEYCMD_F6 "REM F6" +;; #CONFIG# KEYCMD_F6 "\5FHF" ;; #CONFIG# KEYCMD_F7 "@11$" ;; #CONFIG# KEYCMD_F8 "MONITOR" ;; #CONFIG# KEYCMD_HELP "LIST" -;; #CONFIG# KEYCMD_F9 "@28$" -;; #CONFIG# KEYCMD_F10 "\5FL" -;; #CONFIG# KEYCMD_F11 "@29$" -;; #CONFIG# KEYCMD_F12 "\5FHF" -;; #CONFIG# KEYCMD_F13 "JOYCRSR 2" +;; #CONFIG# KEYCMD_F9 "@27$" +;; #CONFIG# KEYCMD_F10 "REM F10" +;; #CONFIG# KEYCMD_F11 "@28$" +;; #CONFIG# KEYCMD_F12 "@29$" +;; #CONFIG# KEYCMD_F13 "@30$" ;; #CONFIG# KEYCMD_F14 "BOOTCPM" @@ -90,9 +90,10 @@ ; --- Built-in DOS configuration -;; #CONFIG# UNIT_SDCARD 28 -;; #CONFIG# UNIT_FLOPPY 29 -;; #CONFIG# UNIT_RAMDISK 0 ; do not change, ram disk is not implemented yet +;; #CONFIG# UNIT_SDCARD 27 +;; #CONFIG# UNIT_FLOPPY0 0 +;; #CONFIG# UNIT_FLOPPY1 0 +;; #CONFIG# UNIT_RAMDISK 0 ; --- Debug options diff --git a/src/aliases/,aliases_ram_lowmem.s b/src/aliases/,aliases_ram_lowmem.s index ed03d9c9..2c6e08db 100644 --- a/src/aliases/,aliases_ram_lowmem.s +++ b/src/aliases/,aliases_ram_lowmem.s @@ -44,7 +44,7 @@ !addr OLDLIN = $3B ; $3B-$3C previous BASIC line number !addr OLDTXT = $3D ; $3D-$3E current BASIC line pointer !addr DATLIN = $3F ; $3F-$40 -- NOT IMPLEMENTED -- - !addr DATPTR = $41 ; $41-$42 pointer for READ/DATA copmmands + !addr DATPTR = $41 ; $41-$42 pointer for READ/DATA commands !addr INPPTR = $43 ; $43-$44 -- NOT IMPLEMENTED -- !addr VARNAM = $45 ; $45-$46 current variable name !addr VARPNT = $47 ; $47-$48 current variable/descriptor pointer diff --git a/src/aliases/,aliases_ram_lowmem_m65.s b/src/aliases/,aliases_ram_lowmem_m65.s index 18235f66..dfdb9ab0 100644 --- a/src/aliases/,aliases_ram_lowmem_m65.s +++ b/src/aliases/,aliases_ram_lowmem_m65.s @@ -33,39 +33,49 @@ ; Pages 4-7 - reused screen memory ; - ; $400-$57F - reserved for BASIC + !addr M65_RS232_INBUF = $400 ; $400-$4FF -- reserved for RS-232 input buffer -- + !addr M65_RS232_OUTBUF = $500 ; $500-$5FF -- reserved for RS-232 output buffer -- - ; $400-$57F -- UNUSED -- reserved for BASIC + ; $600-$77F - reserved for BASIC - ; $580-$5FF - reserved for KERNAL + ; $600-$77F -- UNUSED -- reserved for BASIC - !addr M65_SCRSEG = $580 ; $580-$581 segment address (2 higher bytes) of the screen memory - !addr M65_SCRBASE = $582 ; $582-$583 first byte of screen memory - !addr M65_SCRGUARD = $584 ; $584-$585 last byte of screen memory + 1 XXX is it needed? - !addr M65_COLGUARD = $586 ; $586-$587 last byte of colour memory + 1 - !addr M65_COLVIEW = $588 ; $588-$589 first byte of color memory viewport - !addr M65_COLVIEWMAX = $58A ; $58A-$58B largest allowed value of M65_COLVIEW - !addr M65_SCRMODE = $58C ; 0 = 40x25, 1 = 80x25, 2 = 80x50 - !addr M65_SCRWINMODE = $58D ; $00 = normal mode, $FF = window enabled - !addr M65_TXTWIN_X0 = $58E ; text window - top-left X coordinate, starting from 0 - !addr M65_TXTWIN_Y0 = $58F ; text window - top-left Y coordinate, starting from 0 - !addr M65_TXTWIN_X1 = $590 ; text window - bottom-right X coordinate + 1 - !addr M65_TXTWIN_Y1 = $591 ; text window - bottom-right Y coordinate + 1 - !addr M65_TXTROW_OFF = $592 ; $592-$593 offset to the current text row from the viewport start - !addr M65_SCRCOLMAX = $594 ; maximum allowed column - !addr M65_ESCMODE = $595 ; flag - if set, escape mode is in effect - !addr M65_KB_BUCKY = $596 ; result of bucky keys scan - !addr M65_KB_COLSCAN = $597 ; $597-$59F results of keyboard scan, columns 0-8 - !addr M65_KB_PRESSED = $5A0 ; $5A0-$5A2 keys pressed, used during scanning keyboard - !addr M65_KB_PRESSED_OLD = $5A3 ; $5A3-$5A5 keys pressed during previous scan - !addr M65_KB_PRESSED_NEW = $5A6 ; $5A6-$5A8 set of M65_KB_PRESSED minus M65_KB_PRESSED_OLD - !addr M65_BELLDSBL = $5A9 ; flag - if set, disable the bell - !addr M65_SOLIDCRSR = $5AA ; flag - if set, cursor is solid (does not flash) - !addr M65_JOYCRSR = $5AB ; joystick to be used for cursor movement - ; $5AC-$5EB -- UNUSED -- - !addr M65_DMAGIC_LIST = $5F1 ; $5EF-$5FF reserved for DMAgic list, 15 bytes (modulo bytes are not needed) - !addr M65_RS232_INBUF = $600 ; $600-$6FF -- reserved for RS-232 input buffer -- - !addr M65_RS232_OUTBUF = $700 ; $700-$7FF -- reserved for RS-232 output buffer -- + ; $780-$7FF - reserved for KERNAL + + !addr M65_SCRSEG = $780 ; $780-$781 segment address (2 higher bytes) of the screen memory + !addr M65_SCRBASE = $782 ; $782-$783 first byte of screen memory + !addr M65_SCRGUARD = $784 ; $784-$785 last byte of screen memory + 1 XXX is it needed? + !addr M65_COLGUARD = $786 ; $786-$787 last byte of colour memory + 1 + !addr M65_COLVIEW = $788 ; $788-$789 first byte of color memory viewport + !addr M65_COLVIEWMAX = $78A ; $78A-$78B largest allowed value of M65_COLVIEW + !addr M65_SCRMODE = $78C ; 0 = 40x25, 1 = 80x25, 2 = 80x50 + !addr M65_SCRWINMODE = $78D ; $00 = normal mode, $FF = window enabled + !addr M65_TXTWIN_X0 = $78E ; text window - top-left X coordinate, starting from 0 + !addr M65_TXTWIN_Y0 = $78F ; text window - top-left Y coordinate, starting from 0 + !addr M65_TXTWIN_X1 = $790 ; text window - bottom-right X coordinate + 1 + !addr M65_TXTWIN_Y1 = $791 ; text window - bottom-right Y coordinate + 1 + !addr M65_TXTROW_OFF = $792 ; $792-$793 offset to the current text row from the viewport start + !addr M65_SCRCOLMAX = $794 ; maximum allowed column + !addr M65_ESCMODE = $795 ; flag - if set, escape mode is in effect + !addr M65_KB_BUCKY = $796 ; result of bucky keys scan + !addr M65_KB_COLSCAN = $797 ; $797-$79F results of keyboard scan, columns 0-8 + !addr M65_KB_PRESSED = $7A0 ; $7A0-$7A2 keys pressed, used during scanning keyboard + !addr M65_KB_PRESSED_OLD = $7A3 ; $7A3-$7A5 keys pressed during previous scan + !addr M65_KB_PRESSED_NEW = $7A6 ; $7A6-$7A8 set of M65_KB_PRESSED minus M65_KB_PRESSED_OLD + !addr M65_BELLDSBL = $7A9 ; flag - if set, disable the bell + !addr M65_SOLIDCRSR = $7AA ; flag - if set, cursor is solid (does not flash) + !addr M65_JOYCRSR = $7AB ; joystick to be used for cursor movement + ; $7AC-$7C8 -- UNUSED -- + !addr M65_DMAGIC_LIST = $7C9 ; $7C9-$7D7 reserved for DMAgic list, 15 bytes (modulo bytes are not needed) + + ; $7D8-$7E7 - 4 32bit registers, reserved for parameters for future Kernal AP{I expansion + + !addr M65_R0 = $7D8 ; $7D8-$7DB + !addr M65_R1 = $7DC ; $7DC-$7DF + !addr M65_R2 = $7E0 ; $7E0-$7E3 + !addr M65_R3 = $7E4 ; $7E4-$7E7 + + ; $7E8-$7FF - 24 free bytes, as in the legacy compatibility mode ; ; Addresses for configuring the DMA job diff --git a/src/basic/,imports.s b/src/basic/,imports.s index d3626678..e0c61361 100644 --- a/src/basic/,imports.s +++ b/src/basic/,imports.s @@ -50,6 +50,7 @@ ;; #ALIAS# m65_shadow_BZP = KERNAL_0.m65_shadow_BZP ;; #ALIAS# proxy_M1_IO_end = KERNAL_0.proxy_M1_IO_end +;; #ALIAS# m65dos_rdchk = KERNAL_0.m65dos_rdchk ;; #ALIAS# m65dos_unitnum = KERNAL_0.m65dos_unitnum ; diff --git a/src/basic/basic_commands_04/cmd_sysinfo.s b/src/basic/basic_commands_04/cmd_sysinfo.s index dfed12c2..6f74e215 100644 --- a/src/basic/basic_commands_04/cmd_sysinfo.s +++ b/src/basic/basic_commands_04/cmd_sysinfo.s @@ -119,17 +119,23 @@ print_sysinfo_video: ldx #IDX__STR_DOS_FD jsr print_packed_misc_str - ; Print floppy unit ID + ; Print floppy unit IDs lda #$01 jsr cmd_sysinfo_print_dev + ldx #IDX__STR_DOS_SEPAR + jsr print_packed_misc_str + + lda #$02 + jsr cmd_sysinfo_print_dev + ; Print ram disk unit ID ldx #IDX__STR_DOS_RD jsr print_packed_misc_str - lda #$02 + lda #$03 jsr cmd_sysinfo_print_dev jmp print_return diff --git a/src/basic/board_m65/mega65_imports.s b/src/basic/board_m65/mega65_imports.s index 613df99e..86fa41fc 100644 --- a/src/basic/board_m65/mega65_imports.s +++ b/src/basic/board_m65/mega65_imports.s @@ -46,4 +46,5 @@ ;; #ALIAS# fetch_character_skip_spaces = BASIC_0.proxy_B1_fetch_character_skip_spaces ;; #ALIAS# fetch_uint8 = BASIC_0.proxy_B1_fetch_uint8 ;; #ALIAS# shell_main_loop = BASIC_0.proxy_B1_shell_main_loop +;; #ALIAS# m65dos_rdchk = BASIC_0.proxy_B1_m65dos_rdchk ;; #ALIAS# m65dos_unitnum = BASIC_0.proxy_B1_m65dos_unitnum diff --git a/src/basic/board_m65/mega65_proxies.s b/src/basic/board_m65/mega65_proxies.s index 953e9658..43691a65 100644 --- a/src/basic/board_m65/mega65_proxies.s +++ b/src/basic/board_m65/mega65_proxies.s @@ -157,6 +157,12 @@ proxy_M1_print_kernal_error: jmp proxy_M1_IO_end } +proxy_B1_m65dos_rdchk: + + jsr map_NORMAL + jsr m65dos_rdchk + bra proxy_B1_end_2 + proxy_B1_m65dos_unitnum: jsr map_NORMAL 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/basic/init/initmsg_m65.s b/src/basic/init/initmsg_m65.s index 7df683f5..67c25ddd 100644 --- a/src/basic/init/initmsg_m65.s +++ b/src/basic/init/initmsg_m65.s @@ -31,11 +31,11 @@ INITMSG_native: ; Native mode - ldx #46 + ldx #48 ldy #0 jsr M65_SETWIN_XY - ldx #34 + ldx #32 ldy #9 jsr M65_SETWIN_WH @@ -66,7 +66,36 @@ INITMSG_native: ldx #$09 ldy #$00 - jmp plot_set + jsr plot_set + + ; Display the preloaded RAM disc image status + + jsr m65dos_rdchk + cmp #$FF + +beq print_return + + pha + jsr print_return + pla + pha + cmp #$00 + beq @skip_bold + + lda #$1B + jsr JCHROUT + lda #'S' + jsr JCHROUT + +@skip_bold: + + ldx #IDX__STR_RD_NAME + jsr print_packed_misc_str + pla + + clc + adc #IDX__STR_RD_OK + tax + jmp print_packed_misc_str INITMSG_main_banner: diff --git a/src/dos_m65/,aliases_dos.s b/src/dos_m65/,aliases_dos.s index e5652ce5..3bf30ab4 100644 --- a/src/dos_m65/,aliases_dos.s +++ b/src/dos_m65/,aliases_dos.s @@ -11,7 +11,7 @@ ; Temporary storage locations ; - !addr FS_HVSR_DIRENT = $1000 + !addr MEM_BUF = $1000 ; buffer for hypervisor calls; starting at $1000 VIC sees chargen, so this should be a safe place ; @@ -27,13 +27,19 @@ !addr REG_Y = $8007 !addr REG_Z = $8008 - ; Reserved: $8009 - $800C + ; System configuration + + !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 + + !addr RD_MSG = $800B ; code of the RAM disk message to be displayed on banner screen, $FF for none ; 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 @@ -46,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 @@ -60,65 +66,86 @@ !addr PAR_FNAME = $8021 ; 16 bytes - filename, filled with $A0 !addr PAR_FPATTERN = $8031 ; 16 bytes - pattern to match, filled with $A0 + !addr PAR_FSINSTANCE = $8041 ; 0 = SD card, 1/2 = floppy, 3 = ram disk + ; Various temporary data - !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 XX_DIR_PHASE = $8042 ; directory output phase, values deponds on device driver, but 0 = not reading + !addr SD_DIR_PHASE = $8042 ; - SD card + !addr F0_DIR_PHASE = $8043 ; - floppy 0 + !addr F1_DIR_PHASE = $8044 ; - floppy 0 + !addr RD_DIR_PHASE = $8045 ; - ram disk - ; Free space: $8044-$8063 + ; Free space: $8046-$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 - ; XXX Free space + !addr F1_LOADTRACK = $807D ; current track for file loading + !addr F1_LOADSECTOR = $807E ; current sector for file loading + !addr RD_MAXTRACK = $807F ; maximum RAM disk track number of loaded image + !addr RD_STARTSEG = $8080 ; RAM disk start address, 2nd most significant byte (or $FF if no RAM) + !addr RD_VALIDIMG = $8081 ; $00 = no valid image loaded + + + ; Reserved: $8082-$81FF ; ; Various buffers, caches, and other large memory chunks @@ -128,8 +155,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 @@ -142,49 +169,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 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 @@ -195,4 +224,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/4020.dos_vectable.s b/src/dos_m65/4020.dos_vectable.s index fb940b73..12d25c33 100644 --- a/src/dos_m65/4020.dos_vectable.s +++ b/src/dos_m65/4020.dos_vectable.s @@ -2,6 +2,8 @@ ; A vector table to integrate DOS with the MEGA65 Kernal !word dos_INIT +!word dos_PRELOAD +!word dos_RDCHK !word dos_UNITCHK !word dos_UNITSET !word dos_UNITNUM diff --git a/src/dos_m65/assets/dos_parts_dir.s b/src/dos_m65/assets/dos_parts_dir.s index deca85a0..cc8488a3 100644 --- a/src/dos_m65/assets/dos_parts_dir.s +++ b/src/dos_m65/assets/dos_parts_dir.s @@ -59,6 +59,7 @@ dir_types: !pet "d2m", $00 ; CMD FD 2000 / 4000 - disk image (HD) !pet "d4m", $00 ; CMD FD 4000 - disk image (ED) !pet "dhd", $00 ; CMD HD - hard disk image + !pet "dnp", $00 ; CMD partition - single partition image !pet "rom", $00 ; rom image !pet "m65", $00 ; MEGA65 utility diff --git a/src/dos_m65/assets/dos_ramdisk_filename.s b/src/dos_m65/assets/dos_ramdisk_filename.s new file mode 100644 index 00000000..7faeec1d --- /dev/null +++ b/src/dos_m65/assets/dos_ramdisk_filename.s @@ -0,0 +1,8 @@ + +; +; File name for the initial RAM disk +; + +ramdisk_filename: + + !pet "ramdisk.dnp", 0 diff --git a/src/dos_m65/dos_imports.s b/src/dos_m65/dos_imports.s index 825cd530..a0f019c9 100644 --- a/src/dos_m65/dos_imports.s +++ b/src/dos_m65/dos_imports.s @@ -12,3 +12,5 @@ ;; #ALIAS# m65_speed_tape_cbdos = KERNAL_0.m65_speed_tape_cbdos ;; #ALIAS# m65_speed_restore = KERNAL_0.m65_speed_restore + +;; #ALIAS# wait_x_bars = KERNAL_0.wait_x_bars diff --git a/src/dos_m65/dos_init.s b/src/dos_m65/dos_init.s index f4c5c5d3..baae9e36 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,12 +80,13 @@ dos_INIT: sta code_RTS_02 sta code_RTS_03 sta code_RTS_04 + sta code_RTS_05 ; Initialize device handlers - jsr unit_sd_init - jsr unit_fd_init - jsr unit_rd_init + jsr card_sd_init + jsr disk_fd_init + jsr disk_rd_init ; Safer version of 'dos_EXIT' - does not affect speed related registers 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_preload.s b/src/dos_m65/dos_preload.s new file mode 100644 index 00000000..fc575915 --- /dev/null +++ b/src/dos_m65/dos_preload.s @@ -0,0 +1,17 @@ + +; +; Preload RAM disk image +; + + +dos_PRELOAD: + + ; Before the start make sure memory content is not damaged + + jsr dos_MEMCHK + bcc @ok + rts +@ok: + jsr dos_ENTER + jsr disk_rd_preload + jmp dos_EXIT_CLC diff --git a/src/dos_m65/dos_rdchk.s b/src/dos_m65/dos_rdchk.s new file mode 100644 index 00000000..45ecc0d6 --- /dev/null +++ b/src/dos_m65/dos_rdchk.s @@ -0,0 +1,24 @@ + +; +; Preload RAM disk image +; + + +dos_RDCHK: + + ; Before the start make sure memory content is not damaged + + jsr dos_MEMCHK + bcc @ok + lda #$FF + jmp dos_EXIT_SEC_A + +@ok: + jsr dos_ENTER + + lda RD_MSG + + ldx #$FF ; reset the message after it gets displayed + stx RD_MSG + + jmp dos_EXIT_CLC_A 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 a82e6316..873aa3b6 100644 --- a/src/dos_m65/dos_unitset.s +++ b/src/dos_m65/dos_unitset.s @@ -14,36 +14,46 @@ dos_UNITSET: @ok: jsr dos_ENTER - ; XXX do not allow illegal device numbers... above 30 or below 8 ? + ; XXX do not allow illegal device numbers (above 30 or below 8) ; Check what kind of device was requested cmp #$00 beq dos_UNITSET_sdcard - ; XXX devices below are not implemented yet - ; cmp #$01 - ; beq dos_UNITSET_floppy - ; cmp #$02 - ; beq dos_UNITSET_ramdisk + cmp #$01 + beq dos_UNITSET_floppy0 + cmp #$02 + beq dos_UNITSET_floppy1 + cmp #$03 + beq dos_UNITSET_ramdisk jmp dos_EXIT_SEC dos_UNITSET_sdcard: stx UNIT_SDCARD - +skip_2_bytes_trash_nvz ; FALLTROUGH -dos_UNITSET_floppy: +dos_UNITSET_end: - stx UNIT_FLOPPY - +skip_2_bytes_trash_nvz + jmp dos_EXIT_CLC - ; FALLTROUGH +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 - jmp dos_EXIT_CLC + ; Clear RAM disk device number if no Hyper RAM available + + jsr util_check_rd_ram + jmp dos_EXIT diff --git a/src/dos_m65/dos_vectab_unit.s b/src/dos_m65/dos_vectab_unit.s index ee5bce48..6adb160b 100644 --- a/src/dos_m65/dos_vectab_unit.s +++ b/src/dos_m65/dos_vectab_unit.s @@ -6,13 +6,15 @@ dos_cmd_OPEN_vectab: - !word unit_sd_cmd_OPEN - !word unit_fd_cmd_OPEN - !word unit_rd_cmd_OPEN + !word card_sd_cmd_OPEN + !word disk_xx_cmd_OPEN + !word disk_xx_cmd_OPEN + !word disk_xx_cmd_OPEN dos_cmd_CLOSE_vectab: - !word unit_sd_cmd_CLOSE - !word unit_fd_cmd_CLOSE - !word unit_rd_cmd_CLOSE + !word card_sd_cmd_CLOSE + !word disk_fd_cmd_CLOSE + !word disk_fd_cmd_CLOSE + !word disk_rd_cmd_CLOSE \ No newline at end of file diff --git a/src/dos_m65/filesystem_cbm/fs_cbm_nextdirentry.s b/src/dos_m65/filesystem_cbm/fs_cbm_nextdirentry.s index 1762546d..86bf9a26 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: @@ -115,7 +115,7 @@ fs_cbm_nextdirentry: @get_sector_common: - jsr lowlevel_readsector ; XXX handle read errors + jsr lowlevel_xx_readsector ; XXX handle read errors ; Set new FD_DIRENT @@ -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..b0e3d79f 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 @@ -50,19 +52,19 @@ fs_cbm_nextfileblock_got_ts: ; Load next track/sector - jsr lowlevel_readsector ; XXX handle read errors + jsr lowlevel_xx_readsector ; XXX handle read errors ; 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..d2316812 100644 --- a/src/dos_m65/filesystem_cbm/fs_cbm_read_dir.s +++ b/src/dos_m65/filesystem_cbm/fs_cbm_read_dir.s @@ -13,63 +13,63 @@ fs_cbm_read_dir_open: lda #$00 sta PAR_SECTOR - jsr lowlevel_readsector ; XXX handle read errors + jsr lowlevel_xx_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 + 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 @@ -78,21 +78,21 @@ fs_cbm_read_dir_open: lda #$02 sta PAR_SECTOR - jsr lowlevel_readsector ; XXX handle read errors + jsr lowlevel_xx_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 + 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..43d4b6ec 100644 --- a/src/dos_m65/filesystem_cbm/fs_cbm_read_file.s +++ b/src/dos_m65/filesystem_cbm/fs_cbm_read_file.s @@ -13,12 +13,12 @@ fs_cbm_read_file_open: lda #$03 sta PAR_SECTOR - jsr lowlevel_readsector ; XXX handle read errors + jsr lowlevel_xx_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 + 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/filesystem_vfs/fs_vfs_nextdirentry.s b/src/dos_m65/filesystem_vfs/fs_vfs_nextdirentry.s index 9a855961..0e03fff3 100644 --- a/src/dos_m65/filesystem_vfs/fs_vfs_nextdirentry.s +++ b/src/dos_m65/filesystem_vfs/fs_vfs_nextdirentry.s @@ -6,7 +6,7 @@ ; Fills-in: PAR_FNAME, PAR_FTYPE, PAR_FSIZE_BYTES -; NOTE: overrides page pointed by FS_HVSR_DIRENT! +; NOTE: overrides page pointed by MEM_BUF! fs_vfs_nextdirentry: @@ -18,18 +18,16 @@ fs_vfs_nextdirentry: @lpclear: - sta FS_HVSR_DIRENT, x + sta MEM_BUF, x inx bne @lpclear ; Ask the hypervisor to read the next dirent structure ldx SD_DESC ; directory descriptor XXX rename to FS_HVSR_DESC - ldy #>FS_HVSR_DIRENT ; target page number + ldy #>MEM_BUF ; target page number - lda #$14 ; dos_readdir - sta HTRAP00 - +nop + jsr util_htrap_dos_readddir +bcc @fail @@ -44,7 +42,7 @@ fs_vfs_nextdirentry: ; Preprocess/validate the filename ; - ldx FS_HVSR_DIRENT+$40 ; file name length + ldx MEM_BUF+$40 ; file name length beq fs_vfs_nextdirentry ; do not even try for empty file name cpx #20 bcs fs_vfs_nextdirentry ; if longer than 16 characters + dot + extension - also skip this one @@ -52,7 +50,7 @@ fs_vfs_nextdirentry: @lpname: - lda FS_HVSR_DIRENT,x + lda MEM_BUF,x cmp #$22 beq fs_vfs_nextdirentry ; quotation mark is illegal cmp #$2A @@ -79,7 +77,7 @@ fs_vfs_nextdirentry: @lpname_store_next: - sta FS_HVSR_DIRENT,x ; use this when file name has to be adapted + sta MEM_BUF,x ; use this when file name has to be adapted @lpname_next: @@ -90,7 +88,7 @@ fs_vfs_nextdirentry: ; Determine type (file/directory) ; - lda FS_HVSR_DIRENT+$56 + lda MEM_BUF+$56 tax and #$FE beq @entity_file ; workaround for older hypervisors @@ -106,7 +104,7 @@ fs_vfs_nextdirentry: ; Once again validate the name length, with more precise information - lda FS_HVSR_DIRENT+$40 + lda MEM_BUF+$40 cmp #$11 bcs fs_vfs_nextdirentry ; skip entry if file name longer than 16 characters @@ -119,17 +117,17 @@ fs_vfs_nextdirentry: ; Once again validate the name length, with more precise information - lda FS_HVSR_DIRENT+$40 + lda MEM_BUF+$40 sec sbc #$04 ; strip 4 bytes - for dot and extension bmi fs_vfs_nextdirentry ; if name too short, try next entry beq fs_vfs_nextdirentry ; if name too short, try next entry - sta FS_HVSR_DIRENT+$40 ; store corrected file name length + sta MEM_BUF+$40 ; store corrected file name length tax ; Make sure there is a dot marking the start of a 3-byte extension - lda FS_HVSR_DIRENT, x + lda MEM_BUF, x cmp #$2E +bne fs_vfs_nextdirentry @@ -142,15 +140,15 @@ fs_vfs_nextdirentry: @lpext: - lda FS_HVSR_DIRENT+0, x + lda MEM_BUF+0, x cmp dir_types+0, y bne @lpext_next - lda FS_HVSR_DIRENT+1, x + lda MEM_BUF+1, x cmp dir_types+1, y bne @lpext_next - lda FS_HVSR_DIRENT+2, x + lda MEM_BUF+2, x cmp dir_types+2, y beq @lpext_found @@ -185,7 +183,7 @@ fs_vfs_nextdirentry: ora #$80 ; mark the file as closed, FAT32 does not have a 'not closed' attribute sta PAR_FTYPE - lda FS_HVSR_DIRENT+$56 ; also apply read-only attribute from FAT32 + lda MEM_BUF+$56 ; also apply read-only attribute from FAT32 and #$01 beq @copy_size @@ -201,7 +199,7 @@ fs_vfs_nextdirentry: @lpsize: - lda FS_HVSR_DIRENT+$52,x ; copy file size in byytes + lda MEM_BUF+$52,x ; copy file size in byytes sta PAR_FSIZE_BYTES,x dex bpl @lpsize @@ -215,9 +213,9 @@ fs_vfs_nextdirentry: @lpname_cpy: - cpx FS_HVSR_DIRENT+$40 + cpx MEM_BUF+$40 bcs @lpname_fill - lda FS_HVSR_DIRENT, x + lda MEM_BUF, x @lpname_fill: diff --git a/src/dos_m65/filesystem_vfs/fs_vfs_nextfileblock.s b/src/dos_m65/filesystem_vfs/fs_vfs_nextfileblock.s index e787af5f..c5cd21ce 100644 --- a/src/dos_m65/filesystem_vfs/fs_vfs_nextfileblock.s +++ b/src/dos_m65/filesystem_vfs/fs_vfs_nextfileblock.s @@ -9,9 +9,7 @@ fs_vfs_nextfileblock: ; Read chunk of data to SD card buffer ldx SD_DESC - lda #$1A ; dos_readfile - sta HTRAP00 - +nop + jsr util_htrap_dos_readfile ; XXX check error code @@ -26,9 +24,7 @@ fs_vfs_nextfileblock: ora SD_ACPTR_LEN+0 bne @copy - lda #$20 ; dos_closefile - sta HTRAP00 - +nop + jsr util_htrap_dos_closefile lda #$00 sec @@ -66,12 +62,10 @@ fs_vfs_nextfileblock: fs_vfs_file_not_found: - jsr fs_vfs_direntmem_restore ; restore $1000 memory content + jsr util_shadow_restore ; restore MEM_BUF memory content ldx SD_DESC - lda #$16 ; dos_closedir - sta HTRAP00 - +nop + jsr util_htrap_dos_closedir lda #39 ; file not found error jsr util_status_SD diff --git a/src/dos_m65/filesystem_vfs/fs_vfs_read_dir.s b/src/dos_m65/filesystem_vfs/fs_vfs_read_dir.s index f1ca167b..14dec880 100644 --- a/src/dos_m65/filesystem_vfs/fs_vfs_read_dir.s +++ b/src/dos_m65/filesystem_vfs/fs_vfs_read_dir.s @@ -8,9 +8,7 @@ fs_vfs_read_dir_open: ; Open the directory - lda #$12 ; dos_opendir - sta HTRAP00 - +nop + jsr util_htrap_dos_opendir ; XXX handle read errors @@ -46,12 +44,11 @@ fs_vfs_read_dir_open: fs_vfs_read_dir: - ; Read dirent structure into $1000, process it, restore the memory content. - ; Starting at $1000 VIC sees chargen, so this should be a safe place + ; Read dirent structure into MEM_BUF, process it, restore the memory content. - jsr fs_vfs_direntmem_prepare + jsr util_shadow jsr fs_vfs_nextdirentry - jsr fs_vfs_direntmem_restore ; processor status is preserved + jsr util_shadow_restore ; processor status is preserved ; If nothing to read, output 'blocks free' @@ -106,40 +103,7 @@ fs_vfs_read_dir_blocksfree: ; Close the directory within the hypervisor XXX maybe move it to close routine ldx SD_DESC - lda #$16 ; dos_closedir - sta HTRAP00 - +nop + jsr util_htrap_dos_closedir clc rts - -; -; Helper routines -; - -fs_vfs_direntmem_prepare: - - ldx #$00 -@1: - ldy $1000, x - sty SD_MEMSHADOW_BUF, x - inx - bne @1 - - rts - -fs_vfs_direntmem_restore: - - php - - ldx #$00 -@1: - ldy SD_MEMSHADOW_BUF, x - sty $1000, x - inx - bne @1 - - bne @1 - - plp - rts diff --git a/src/dos_m65/filesystem_vfs/fs_vfs_read_file.s b/src/dos_m65/filesystem_vfs/fs_vfs_read_file.s index bf7ee626..9cc623bc 100644 --- a/src/dos_m65/filesystem_vfs/fs_vfs_read_file.s +++ b/src/dos_m65/filesystem_vfs/fs_vfs_read_file.s @@ -25,10 +25,9 @@ fs_vfs_read_file_open: ; XXX deduplicate part above with opening directory - ; Read dirent structures into $1000, find the first matching file - ; Starting at $1000 VIC sees chargen, so this should be a safe place + ; Read dirent structures into MEM_BUF, find the first matching file - jsr fs_vfs_direntmem_prepare + jsr util_shadow @lp_find: @@ -49,11 +48,9 @@ fs_vfs_read_file_open: ; Found the file - load it - jsr fs_vfs_direntmem_restore ; restore $1000 memory content + jsr util_shadow_restore ; restore MEM_BUF memory content - lda #$18 ; dos_openfile - sta HTRAP00 - +nop + jsr util_htrap_dos_openfile ; XXX check error code diff --git a/src/dos_m65/lowlevel/lowlevel_readsector.s b/src/dos_m65/lowlevel/lowlevel_fd_readsector.s similarity index 55% rename from src/dos_m65/lowlevel/lowlevel_readsector.s rename to src/dos_m65/lowlevel/lowlevel_fd_readsector.s index fc180823..af2184ca 100644 --- a/src/dos_m65/lowlevel/lowlevel_readsector.s +++ b/src/dos_m65/lowlevel/lowlevel_fd_readsector.s @@ -1,38 +1,56 @@ -; Read a sector pair from a block device +; Read a sector pair from a block device, flow partially based on: +; - https://github.com/MEGA65/mega65-tools/blob/master/src/tests/floppytest.c -lowlevel_readsector: +lowlevel_xx_readsector: - ; XXX compare device and unit too + ldx PAR_FSINSTANCE + +beq lowlevel_rd_readsector - ; Check if buffer contains data from given track + ; FALLTROUGH + +lowlevel_fd_readsector: + + ; Check if buffer contains data from given track, sector, drive lda PAR_TRACK cmp BUFTAB_TRACK+1 - bne lowlevel_readsector_force - - ; Check if sectors match + bne lowlevel_fd_readsector_force lda PAR_SECTOR and #%11111110 cmp BUFTAB_SECTOR+1 - bne lowlevel_readsector_force + bne lowlevel_fd_readsector_force + + ; XXX compare drive ; Data already loaded into buffer - do nothing clc rts -lowlevel_readsector_force: +lowlevel_fd_readsector_force: - ; Select FDD sector as buffer + ; Set drive, motor ON - lda #%10000000 ; select floppy buffer + lda #$68 + cpx #$01 + beq @1 + inc +@1: + sta FDC_CONTROL ; $D080 + + ; Select floppy buffer + + lda #%10000000 trb SD_BUFCTL ; $D689 - lda #%00001111 ; set drive 0 (internal) and side 0 - trb FDC_CONTROL ; $D080 + ; Wait until BUSY flag clears + +@2: + lda FDC_STATUS_A ; $D082 + bmi @2 ; Select physical track and sector based on logical ones from PAR_TRACK and PAR_SECTOR @@ -65,30 +83,30 @@ lowlevel_readsector_force: inc sta FDC_SECTOR ; $D085 + ; Reset buffers + + lda #$00 + sta FDC_COMMAND ; $D081 + ; Ask the controller to read the sector XXX how to detect errors, missing disk, etc.? lda #$40 sta FDC_COMMAND ; $D081 - ; Wait for RDREQ (indicates sector found) + ; Wait for busy flag to assert XXX how much? 1 second? most likelly too much... -@lp1: - lda FDC_STATUS_B ; $D083 - bpl @lp1 + ldy #71 +@3: + ldx #$00 + jsr wait_x_bars + dey + bne @3 - ; Wait for BUSY flag to clear + ; Wait until BUSY flag clears -@lp2: +@4: lda FDC_STATUS_A ; $D082 - bmi @lp2 - - ; Wait for DRQ and EQ flags to go high - -@lp3: - lda FDC_STATUS_A ; $D082 - and #%01100000 - cmp #%01000000 ; XXX is this correct? .A seems to stay at $40 at this point - bne @lp3 + bmi @4 ; Copy sector to buffer in RAM @@ -115,3 +133,13 @@ lowlevel_readsector_force: clc rts + + + +lowlevel_fd_motor_off: + + ; XXX set correct drive + + lda #$00 + sta FDC_CONTROL ; $D080 + rts diff --git a/src/dos_m65/lowlevel/lowlevel_rd_readsector.s b/src/dos_m65/lowlevel/lowlevel_rd_readsector.s new file mode 100644 index 00000000..42271474 --- /dev/null +++ b/src/dos_m65/lowlevel/lowlevel_rd_readsector.s @@ -0,0 +1,7 @@ + +; Read a sector pair from a RAM disk + + +lowlevel_rd_readsector: + + ; XXX provide implementation diff --git a/src/dos_m65/pseudoiec/msg_acptr.s b/src/dos_m65/pseudoiec/msg_acptr.s index c662618c..27b4741f 100644 --- a/src/dos_m65/pseudoiec/msg_acptr.s +++ b/src/dos_m65/pseudoiec/msg_acptr.s @@ -13,6 +13,10 @@ msg_ACPTR: ldx IDX1_TALKER +bmi msg_ACPTR_fail_no_talker + ; Set file system instance + + stx PAR_FSINSTANCE + ; Check if active channel is status one lda XX_CHANNEL, X @@ -56,45 +60,75 @@ msg_ACPTR_read_SD: ora SD_ACPTR_LEN+1 bne @3 - jsr unit_sd_cmd_READ + jsr card_sd_cmd_READ bcc @3 jsr kernalstatus_EOI @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 - bne @3 - jsr unit_fd_cmd_READ + ora F0_ACPTR_LEN+1 + bra msg_ACPTR_read_XX_common + +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 + bra msg_ACPTR_read_XX_common + +msg_ACPTR_read_RD: + + ; XXX provide implementation + +msg_ACPTR_read_XX_common: + + bne @3 + jsr disk_xx_cmd_READ bcc @3 jsr kernalstatus_EOI @3: jmp dos_EXIT_CLC -msg_ACPTR_read_RD: - - ; XXX provide implementation msg_ACPTR_fail_no_data: @@ -117,11 +151,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 +207,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..20cd025f 100644 --- a/src/dos_m65/pseudoiec/msg_ciout.s +++ b/src/dos_m65/pseudoiec/msg_ciout.s @@ -13,8 +13,14 @@ msg_CIOUT: ldx IDX1_LISTENER bmi msg_CIOUT_fail - lda XX_MODE, x + ; Set file system instance + + stx PAR_FSINSTANCE + + ; Check current operation mode + + lda XX_MODE, x cmp #$01 bne @1 @@ -38,7 +44,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 @@ -52,23 +58,34 @@ msg_CIOUT_cmdfn_SD: ; get next byte of status - SD card lda #$A0 sta SD_CMDFN_BUF,x plp - +bcs unit_sd_cmd_OPEN_EOI ; if EOI - execute command + +bcs card_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 - plp - +bcs unit_fd_cmd_OPEN_EOI ; if EOI - execute command - jmp dos_EXIT_CLC + sta F0_CMDFN_BUF,x + bra msg_CIOUT_cmdfn_FX + +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 + bra msg_CIOUT_cmdfn_FX msg_CIOUT_cmdfn_RD: ; get next byte of status - ram disk @@ -81,12 +98,18 @@ msg_CIOUT_cmdfn_RD: ; get next byte of status - ram disk stx RD_CMDFN_IDX lda #$A0 sta RD_CMDFN_BUF,x + + ; FALLTROUGH + +msg_CIOUT_cmdfn_FX: ; common pard for floppy and RAM disk + plp - +bcs unit_rd_cmd_OPEN_EOI ; if EOI - execute command + +bcs disk_xx_cmd_OPEN_EOI ; if EOI - execute command jmp dos_EXIT_CLC 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_second.s b/src/dos_m65/pseudoiec/msg_second.s index c0481254..cf9195ca 100644 --- a/src/dos_m65/pseudoiec/msg_second.s +++ b/src/dos_m65/pseudoiec/msg_second.s @@ -16,6 +16,7 @@ msg_SECOND: ldx IDX1_LISTENER bmi msg_SECOND_done ; do nothing if no listener + stx PAR_FSINSTANCE ; set file system instance sta XX_CHANNEL, x ; store channel ; Determine command type 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_sdcard/unit_sd_cmd_close.s b/src/dos_m65/unit_card/card_sd_cmd_close.s similarity index 82% rename from src/dos_m65/unit_sdcard/unit_sd_cmd_close.s rename to src/dos_m65/unit_card/card_sd_cmd_close.s index ac427a74..ac9d7558 100644 --- a/src/dos_m65/unit_sdcard/unit_sd_cmd_close.s +++ b/src/dos_m65/unit_card/card_sd_cmd_close.s @@ -4,7 +4,7 @@ ; -unit_sd_cmd_CLOSE: +card_sd_cmd_CLOSE: ; XXX provide implementation diff --git a/src/dos_m65/unit_sdcard/unit_sd_cmd_open.s b/src/dos_m65/unit_card/card_sd_cmd_open.s similarity index 86% rename from src/dos_m65/unit_sdcard/unit_sd_cmd_open.s rename to src/dos_m65/unit_card/card_sd_cmd_open.s index 56a2629d..04e71d32 100644 --- a/src/dos_m65/unit_sdcard/unit_sd_cmd_open.s +++ b/src/dos_m65/unit_card/card_sd_cmd_open.s @@ -4,14 +4,14 @@ ; -unit_sd_cmd_OPEN: +card_sd_cmd_OPEN: lda #$01 ; mode: receive command or file name sta SD_MODE jmp dos_EXIT_CLC -unit_sd_cmd_OPEN_EOI: +card_sd_cmd_OPEN_EOI: ; XXX this dispatcher is temporary @@ -24,15 +24,13 @@ unit_sd_cmd_OPEN_EOI: dey bpl @lp1 - ; XXX add support for second card - lda SD_CMDFN_BUF cmp #'$' - beq unit_sd_cmd_OPEN_dir + beq card_sd_cmd_OPEN_dir ; FALLTROUGH -unit_sd_cmd_OPEN_file: +card_sd_cmd_OPEN_file: ; Copy the filter from command XXX this should be moved to common part and deduplicated with directory opening @@ -51,7 +49,7 @@ unit_sd_cmd_OPEN_file: jmp fs_vfs_read_file_open -unit_sd_cmd_OPEN_dir: +card_sd_cmd_OPEN_dir: lda #$02 ; mode: read directory sta SD_MODE diff --git a/src/dos_m65/unit_sdcard/unit_sd_cmd_read.s b/src/dos_m65/unit_card/card_sd_cmd_read.s similarity index 92% rename from src/dos_m65/unit_sdcard/unit_sd_cmd_read.s rename to src/dos_m65/unit_card/card_sd_cmd_read.s index b9fad4c1..6a955f48 100644 --- a/src/dos_m65/unit_sdcard/unit_sd_cmd_read.s +++ b/src/dos_m65/unit_card/card_sd_cmd_read.s @@ -4,7 +4,7 @@ ; -unit_sd_cmd_READ: +card_sd_cmd_READ: lda SD_MODE cmp #$03 diff --git a/src/dos_m65/unit_sdcard/unit_sd_init.s b/src/dos_m65/unit_card/card_sd_init.s similarity index 66% rename from src/dos_m65/unit_sdcard/unit_sd_init.s rename to src/dos_m65/unit_card/card_sd_init.s index 6f79c036..a9b6577b 100644 --- a/src/dos_m65/unit_sdcard/unit_sd_init.s +++ b/src/dos_m65/unit_card/card_sd_init.s @@ -4,7 +4,7 @@ ; -unit_sd_init: +card_sd_init: ; Copy initial status string @@ -26,14 +26,5 @@ unit_sd_init: ; Close all the files in the hypervisor, go to root directory - lda #$22 ; dos_closeall - sta HTRAP00 - +nop - - lda #$3C ; dos_cdrootdir - sta HTRAP00 - +nop - - ; End of initialization - - rts + jsr util_htrap_dos_closeall + jmp util_htrap_dos_cdrootdir diff --git a/src/dos_m65/unit_disk/disk_fd_cmd_close.s b/src/dos_m65/unit_disk/disk_fd_cmd_close.s new file mode 100644 index 00000000..42505fc8 --- /dev/null +++ b/src/dos_m65/unit_disk/disk_fd_cmd_close.s @@ -0,0 +1,13 @@ + +; +; Close currently opened file +; + + +disk_fd_cmd_CLOSE: + + ; XXX provide implementation + + jsr lowlevel_fd_motor_off ; disable drive motor XXX only do this if no channel is opened + + jmp dos_EXIT_SEC diff --git a/src/dos_m65/unit_disk/disk_fd_init.s b/src/dos_m65/unit_disk/disk_fd_init.s new file mode 100644 index 00000000..9b62a3c8 --- /dev/null +++ b/src/dos_m65/unit_disk/disk_fd_init.s @@ -0,0 +1,46 @@ + +; +; Initializes DOS part of floppy controller +; + + +disk_fd_init: + + ; Copy status string + + ldx #$00 + + 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 F0_STATUS_BUF,x + sta F1_STATUS_BUF,x + bne @1 + + ; Initialize the controller + + lda #$80 ; default track stepping rate + sta FDC_STEP + lda #$FF + sta FDC_CLOCK + + ; End of initialization + + rts diff --git a/src/dos_m65/unit_ramdisk/unit_rd_cmd_close.s b/src/dos_m65/unit_disk/disk_rd_cmd_close.s similarity index 82% rename from src/dos_m65/unit_ramdisk/unit_rd_cmd_close.s rename to src/dos_m65/unit_disk/disk_rd_cmd_close.s index 60f9a9c3..ef50f5a1 100644 --- a/src/dos_m65/unit_ramdisk/unit_rd_cmd_close.s +++ b/src/dos_m65/unit_disk/disk_rd_cmd_close.s @@ -4,7 +4,7 @@ ; -unit_rd_cmd_CLOSE: +disk_rd_cmd_CLOSE: ; XXX provide implementation diff --git a/src/dos_m65/unit_disk/disk_rd_init.s b/src/dos_m65/unit_disk/disk_rd_init.s new file mode 100644 index 00000000..c38ecbc6 --- /dev/null +++ b/src/dos_m65/unit_disk/disk_rd_init.s @@ -0,0 +1,134 @@ + +; +; Initializes DOS part of RAM disk +; + + +disk_rd_init: + + + ; Copy status string + + ldx #$00 + 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 + lda dos_sts_init_ramdisk,x + sta RD_STATUS_BUF,x + bne @1 + + ; FALLTROUGH + +disk_rd_init_test_ram: ; non-destructive ATTIC/CELLAR RAM test + + ; Preserve temporary address area on stack + + ldx #$03 +@2: + lda PNTR, x + pha + dex + bpl @2 + + stx RD_MSG ; $FF - mark no message to be displayed + + ; For the start, mark extended RAM as not present + + stx RD_STARTSEG ; by default $FF, to mark no RAM disk + inx + stx RD_VALIDIMG ; mark no valid image loaded + stx RAM_ATTIC ; set ATTIC/CELLAR RAM as not present + stx RAM_CELLAR + + ; Prepare address - CELLAR RAM, $0880:$0000 + + stx PNTR+0 + stx PNTR+1 + lda #$80 + sta PNTR+2 + lda #$08 + sta PNTR+3 + + ldz #$00 + + ; Test for CELLAR RAM + + jsr @perform_ram_test + bne @done_cellar + dec RAM_ATTIC ; test passed + lda #$08 + sta RD_STARTSEG ; RAM DISK start segment - CELLAR RAM + +@done_cellar: + + ; Prepare address - ATTIC RAM, $0800:$0000 + + lda #$00 + sta PNTR+2 + + ; Test for ATTIC RAM + + jsr @perform_ram_test + bne @done_attic + dec RAM_CELLAR ; test passed + lda #$00 + sta RD_STARTSEG ; RAM DISK start segment - ATTIC RAM + +@done_attic: + + ; Restore temporary address area content + + ldx #$00 +@3: + pla + sta PNTR, x + inx + cpx #$04 + bne @3 + + ; Clear RAM disk device number if no Hyper RAM available + + jsr util_check_rd_ram + + ; End of initialization + + rts + +@perform_ram_test: + + ; Try to change one byte in extended RAM + + lda [PNTR], z + tax + eor #$FF + sta [PNTR], z + + ; Make sure the cache does not contain the value any more + + tay + dez + lda [PNTR], z + inz + tya + + ; Check if byte still contains the new value + + cmp [PNTR], z + php + + ; Restore byte content + + txa + sta [PNTR], z + + ; Return test result + + plp + rts diff --git a/src/dos_m65/unit_disk/disk_rd_preload.s b/src/dos_m65/unit_disk/disk_rd_preload.s new file mode 100644 index 00000000..b75c4aab --- /dev/null +++ b/src/dos_m65/unit_disk/disk_rd_preload.s @@ -0,0 +1,212 @@ + +; +; Preload RAM disk image from SD card +; + + +!addr __stoptrack = RD_DIR_PHASE ; helper value for detecting too large image + + +disk_rd_preload: + + ; Check if RAM disk is enabled (should be disabled if no Hyper RAM is present) + + lda UNIT_RAMDISK + +beq disk_rd_preload_err_common_noclose + + ; Select SD card buffer + + lda #$80 + tsb SD_BUFCTL + + ; Set file name + + jsr util_shadow + ldx #$FF +@lp1: + inx + lda ramdisk_filename, x + sta MEM_BUF, x + bne @lp1 + + ldy #>MEM_BUF + ldx #