From 935cbc3dedf33d3306b638e16367dd552d731b44 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 25 Mar 2021 22:51:44 +0100 Subject: [PATCH 01/38] started work on ram disk --- src/,,config_mega65.s | 4 +-- src/dos_m65/assets/dos_ramdisk_filename.s | 9 +++++ src/dos_m65/unit_ramdisk/unit_rd_init.s | 40 +++++++++++++++++++++++ 3 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 src/dos_m65/assets/dos_ramdisk_filename.s diff --git a/src/,,config_mega65.s b/src/,,config_mega65.s index d9fadbe2..ce67ea29 100644 --- a/src/,,config_mega65.s +++ b/src/,,config_mega65.s @@ -69,7 +69,7 @@ ;; #CONFIG# KEYCMD_F10 "\5FL" ;; #CONFIG# KEYCMD_F11 "@29$" ;; #CONFIG# KEYCMD_F12 "\5FHF" -;; #CONFIG# KEYCMD_F13 "JOYCRSR 2" +;; #CONFIG# KEYCMD_F13 "@30$" ;; #CONFIG# KEYCMD_F14 "BOOTCPM" @@ -92,7 +92,7 @@ ;; #CONFIG# UNIT_SDCARD 28 ;; #CONFIG# UNIT_FLOPPY 29 -;; #CONFIG# UNIT_RAMDISK 0 ; do not change, ram disk is not implemented yet +;; #CONFIG# UNIT_RAMDISK 30 ; --- Debug options 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..92a82aa7 --- /dev/null +++ b/src/dos_m65/assets/dos_ramdisk_filename.s @@ -0,0 +1,9 @@ + +; +; File name for the initial RAM disk +; + +ramdisk_filename: + + !pet "ramdisk.dnp" + !byte $00 diff --git a/src/dos_m65/unit_ramdisk/unit_rd_init.s b/src/dos_m65/unit_ramdisk/unit_rd_init.s index f12dd15c..0f798b3f 100644 --- a/src/dos_m65/unit_ramdisk/unit_rd_init.s +++ b/src/dos_m65/unit_ramdisk/unit_rd_init.s @@ -23,6 +23,46 @@ unit_rd_init: sta RD_STATUS_BUF,x bne @1 + ; End of initialization, now try to load the initial RAM disk; first set file name + + ldx #ramdisk_filename + + lda #$2E ; dos_setname + sta HTRAP00 + +nop + + ; Try to find the file + + jsr fs_vfs_direntmem_prepare + + ldy #>FS_HVSR_DIRENT ; XXX is it needed? + + lda #$30 ; dos_findfirst + sta HTRAP00 + +nop + + bcc @error_not_found ; branch if file not found XXX why it can't find the file? + + ; XXX load the file + + + + + lda #$20 ; dos_closefile + sta HTRAP00 + +nop + + jsr fs_vfs_direntmem_restore + ; End of initialization rts + + +@error_not_found: + + + ; XXX set information about file not found + + jmp fs_vfs_direntmem_restore From 1f777ebe60ee33481bee7a41917f770a3dd557e1 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 25 Mar 2021 23:02:36 +0100 Subject: [PATCH 02/38] show DNP files in the SD card directory --- src/dos_m65/assets/dos_parts_dir.s | 1 + 1 file changed, 1 insertion(+) 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 From 0618d38cdd3925f0d682ba0a76cd91e330cc1627 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Fri, 26 Mar 2021 16:45:06 +0100 Subject: [PATCH 03/38] 65C02 code size optimization (22 bytes saved) in IEC code --- src/kernal/iec/iec_pull_release.s | 87 +++++++++++++++++++++++++++++-- 1 file changed, 83 insertions(+), 4 deletions(-) diff --git a/src/kernal/iec/iec_pull_release.s b/src/kernal/iec/iec_pull_release.s index 67b67ce2..8deb834f 100644 --- a/src/kernal/iec/iec_pull_release.s +++ b/src/kernal/iec/iec_pull_release.s @@ -14,6 +14,8 @@ !ifdef CONFIG_IEC { +!ifndef HAS_OPCODES_65C02 { + iec_pull_atn_clk_release_data: @@ -34,7 +36,7 @@ iec_pull_clk_release_data: iec_pull_clk_release_data_1: and #$FF - BIT_CIA2_PRA_DAT_OUT ; release - bne iec_pull_release_end ; branch always + bne iec__pull_release_end ; branch always iec_pull_clk_release_data_oneshot: @@ -56,7 +58,7 @@ iec_release_clk_data: and #$FF - BIT_CIA2_PRA_DAT_OUT ; release sta CIA2_PRA and #$FF - BIT_CIA2_PRA_CLK_OUT ; release - jmp iec_pull_release_end + +bra iec__pull_release_end iec_release_clk_pull_data: @@ -64,7 +66,7 @@ iec_release_clk_pull_data: ora #BIT_CIA2_PRA_DAT_OUT ; pull sta CIA2_PRA and #$FF - BIT_CIA2_PRA_CLK_OUT ; release - bne iec_pull_release_end ; branch always + bne iec__pull_release_end ; branch always iec_pull_data_release_atn_clk: @@ -83,8 +85,85 @@ iec_release_atn: ; FALLTROUGH -iec_pull_release_end: +iec__pull_release_end: sta CIA2_PRA rts + + +} else { + + + ; 65C02 version + +iec_pull_atn_clk_release_data: + + lda #BIT_CIA2_PRA_ATN_OUT + tsb CIA2_PRA + + ; FALLTROUGH + +iec_pull_clk_release_data: + + lda #BIT_CIA2_PRA_CLK_OUT + tsb CIA2_PRA + lda #BIT_CIA2_PRA_DAT_OUT + bra iec__pull_release_trb + +iec_pull_clk_release_data_oneshot: + + lda CIA2_PRA + ora #BIT_CIA2_PRA_CLK_OUT ; pull + and #$FF - BIT_CIA2_PRA_DAT_OUT ; release + sta CIA2_PRA + rts + +iec_release_atn_clk_data: + + lda #BIT_CIA2_PRA_ATN_OUT + trb CIA2_PRA + + ; FALLTROUGH + +iec_release_clk_data: + + lda #BIT_CIA2_PRA_DAT_OUT + trb CIA2_PRA + bra iec__release_clk + +iec_release_clk_pull_data: + + lda #BIT_CIA2_PRA_DAT_OUT + tsb CIA2_PRA + + ; FALLTROUGH + +iec__release_clk: + + lda #BIT_CIA2_PRA_CLK_OUT + bra iec__pull_release_trb + +iec_pull_data_release_atn_clk: + + lda #BIT_CIA2_PRA_DAT_OUT + tsb CIA2_PRA + lda #(BIT_CIA2_PRA_CLK_OUT + BIT_CIA2_PRA_ATN_OUT) + +skip_2_bytes_trash_nvz + + ; FALLTROUGH + +iec_release_atn: + + lda #BIT_CIA2_PRA_ATN_OUT + + ; FALLTROUGH + +iec__pull_release_trb: + + trb CIA2_PRA + rts + + +} + } From fad9333e590060eff8b52d5b749eb43722fcda4a Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Fri, 26 Mar 2021 18:14:38 +0100 Subject: [PATCH 04/38] code harmonization --- src/dos_m65/assets/dos_ramdisk_filename.s | 3 +-- src/dos_m65/unit_ramdisk/unit_rd_init.s | 25 +++++++++-------------- 2 files changed, 11 insertions(+), 17 deletions(-) diff --git a/src/dos_m65/assets/dos_ramdisk_filename.s b/src/dos_m65/assets/dos_ramdisk_filename.s index 92a82aa7..7faeec1d 100644 --- a/src/dos_m65/assets/dos_ramdisk_filename.s +++ b/src/dos_m65/assets/dos_ramdisk_filename.s @@ -5,5 +5,4 @@ ramdisk_filename: - !pet "ramdisk.dnp" - !byte $00 + !pet "ramdisk.dnp", 0 diff --git a/src/dos_m65/unit_ramdisk/unit_rd_init.s b/src/dos_m65/unit_ramdisk/unit_rd_init.s index 0f798b3f..bff58927 100644 --- a/src/dos_m65/unit_ramdisk/unit_rd_init.s +++ b/src/dos_m65/unit_ramdisk/unit_rd_init.s @@ -25,35 +25,31 @@ unit_rd_init: ; End of initialization, now try to load the initial RAM disk; first set file name - ldx #ramdisk_filename - + ldx #FS_HVSR_DIRENT ; XXX is it needed? - - lda #$30 ; dos_findfirst + lda #$34 ; dos_findfile sta HTRAP00 +nop - bcc @error_not_found ; branch if file not found XXX why it can't find the file? ; XXX load the file +;@x: +; inc $D020 +; bra @x - lda #$20 ; dos_closefile - sta HTRAP00 - +nop - - jsr fs_vfs_direntmem_restore + ; lda #$20 ; dos_closefile + ; sta HTRAP00 + ; +nop ; End of initialization @@ -62,7 +58,6 @@ unit_rd_init: @error_not_found: - ; XXX set information about file not found - jmp fs_vfs_direntmem_restore + rts From 0e34cd8d68c0687d970940d8342768827f501cbb Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Fri, 26 Mar 2021 21:43:24 +0100 Subject: [PATCH 05/38] more work on RAM disk support, added ATTIC/CELLAR RAM test --- src/aliases/,aliases_ram_lowmem.s | 2 +- src/dos_m65/,aliases_dos.s | 7 +- src/dos_m65/4020.dos_vectable.s | 1 + src/dos_m65/dos_preload.s | 17 ++++ src/dos_m65/unit_ramdisk/unit_rd_init.s | 102 ++++++++++++++++----- src/dos_m65/unit_ramdisk/unit_rd_preload.s | 47 ++++++++++ src/kernal/iec_fast/m65dos_bridge.s | 31 ++++--- src/kernal/init/fce2.hw_entry_reset.s | 2 + 8 files changed, 174 insertions(+), 35 deletions(-) create mode 100644 src/dos_m65/dos_preload.s create mode 100644 src/dos_m65/unit_ramdisk/unit_rd_preload.s 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/dos_m65/,aliases_dos.s b/src/dos_m65/,aliases_dos.s index e5652ce5..2be9d441 100644 --- a/src/dos_m65/,aliases_dos.s +++ b/src/dos_m65/,aliases_dos.s @@ -27,7 +27,12 @@ !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 + + ; Reserved: $800B - $800C ; General DOS configuration diff --git a/src/dos_m65/4020.dos_vectable.s b/src/dos_m65/4020.dos_vectable.s index fb940b73..fd2aa2c3 100644 --- a/src/dos_m65/4020.dos_vectable.s +++ b/src/dos_m65/4020.dos_vectable.s @@ -2,6 +2,7 @@ ; A vector table to integrate DOS with the MEGA65 Kernal !word dos_INIT +!word dos_PRELOAD !word dos_UNITCHK !word dos_UNITSET !word dos_UNITNUM diff --git a/src/dos_m65/dos_preload.s b/src/dos_m65/dos_preload.s new file mode 100644 index 00000000..0775e180 --- /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 unit_rd_preload + jmp dos_EXIT_CLC diff --git a/src/dos_m65/unit_ramdisk/unit_rd_init.s b/src/dos_m65/unit_ramdisk/unit_rd_init.s index bff58927..eeb9826f 100644 --- a/src/dos_m65/unit_ramdisk/unit_rd_init.s +++ b/src/dos_m65/unit_ramdisk/unit_rd_init.s @@ -1,11 +1,12 @@ ; -; Initializes DOS part of ram disk +; Initializes DOS part of RAM disk ; unit_rd_init: + ; Copy status string ldx #$00 @@ -23,41 +24,98 @@ unit_rd_init: sta RD_STATUS_BUF,x bne @1 - ; End of initialization, now try to load the initial RAM disk; first set file name + ; FALLTROUGH - ldy #>ramdisk_filename - ldx #ramdisk_filename + ldx # Date: Sat, 27 Mar 2021 22:12:06 +0100 Subject: [PATCH 06/38] fixed problem in LOAD, wrong register was used --- src/kernal/iostack/f4a5.load.s | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kernal/iostack/f4a5.load.s b/src/kernal/iostack/f4a5.load.s index 43b511a5..0086cf98 100644 --- a/src/kernal/iostack/f4a5.load.s +++ b/src/kernal/iostack/f4a5.load.s @@ -30,7 +30,7 @@ LOAD: lda MEMUSS+0 sta STAL+0 lda MEMUSS+1 - sty STAL+1 + sta STAL+1 ; Reset status jsr kernalstatus_reset From d68583d1b340caba3d34a4a9c501f3ed34207b9c Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Tue, 30 Mar 2021 20:34:01 +0200 Subject: [PATCH 07/38] improved support for different RAM configurations --- src/,,config_mega65.s | 18 ++++----- src/dos_m65/,aliases_dos.s | 4 ++ src/dos_m65/dos_unitset.s | 20 +++++----- src/dos_m65/unit_ramdisk/unit_rd_init.s | 43 ++++++++++++++-------- src/dos_m65/unit_ramdisk/unit_rd_preload.s | 18 ++++++++- src/dos_m65/utils/util_check_rd_ram.s | 21 +++++++++++ src/kernal/iec/load_iec.s | 2 +- 7 files changed, 89 insertions(+), 37 deletions(-) create mode 100644 src/dos_m65/utils/util_check_rd_ram.s diff --git a/src/,,config_mega65.s b/src/,,config_mega65.s index ce67ea29..21d7e6fe 100644 --- a/src/,,config_mega65.s +++ b/src/,,config_mega65.s @@ -52,23 +52,23 @@ ;; #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_F9 "@27$" +;; #CONFIG# KEYCMD_F10 "REM F10" +;; #CONFIG# KEYCMD_F11 "@28$" +;; #CONFIG# KEYCMD_F12 "@29$" ;; #CONFIG# KEYCMD_F13 "@30$" ;; #CONFIG# KEYCMD_F14 "BOOTCPM" @@ -90,8 +90,8 @@ ; --- Built-in DOS configuration -;; #CONFIG# UNIT_SDCARD 28 -;; #CONFIG# UNIT_FLOPPY 29 +;; #CONFIG# UNIT_SDCARD 27 +;; #CONFIG# UNIT_FLOPPY 28 ; XXX use separate number for second floppy (device 29) ;; #CONFIG# UNIT_RAMDISK 30 diff --git a/src/dos_m65/,aliases_dos.s b/src/dos_m65/,aliases_dos.s index 2be9d441..8d07ebb8 100644 --- a/src/dos_m65/,aliases_dos.s +++ b/src/dos_m65/,aliases_dos.s @@ -122,6 +122,10 @@ !addr FD_LOADTRACK = $8072 ; current track for file loading !addr FD_LOADSECTOR = $8073 ; 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 + + ; XXX Free space diff --git a/src/dos_m65/dos_unitset.s b/src/dos_m65/dos_unitset.s index a82e6316..02b89f9d 100644 --- a/src/dos_m65/dos_unitset.s +++ b/src/dos_m65/dos_unitset.s @@ -14,17 +14,16 @@ 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_floppy + cmp #$02 + beq dos_UNITSET_ramdisk jmp dos_EXIT_SEC @@ -38,12 +37,13 @@ dos_UNITSET_sdcard: dos_UNITSET_floppy: stx UNIT_FLOPPY - +skip_2_bytes_trash_nvz - - ; FALLTROUGH + jmp dos_EXIT_CLC 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/unit_ramdisk/unit_rd_init.s b/src/dos_m65/unit_ramdisk/unit_rd_init.s index eeb9826f..0532228f 100644 --- a/src/dos_m65/unit_ramdisk/unit_rd_init.s +++ b/src/dos_m65/unit_ramdisk/unit_rd_init.s @@ -39,41 +39,48 @@ unit_rd_init_test_ram: ; non-destructive ATTIC/CELLAR RAM test ; For the start, mark extended RAM as not present + stx RD_STARTSEG ; by default $FF, to mark no RAM disk inx + stx RD_MAXTRACK ; maximum allowed track number, for now set 0 stx RAM_ATTIC ; set ATTIC/CELLAR RAM as not present stx RAM_CELLAR - ; Prepare address - ATTIC RAM, $0800:$0000 + ; Prepare address - CELLAR RAM, $0880:$0000 stx PNTR+0 stx PNTR+1 - stx PNTR+2 + 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_ATTIC ; test passed + dec RAM_CELLAR ; test passed + lda #$00 + sta RD_STARTSEG ; RAM DISK start segment - ATTIC RAM @done_attic: - ; Prepare address - CELLAR RAM, $0880:$0000 - - lda #$80 - sta PNTR+2 - - ; Test for cellar RAM - - jsr @perform_ram_test - bne @done_cellar - dec RAM_CELLAR ; test passed - -@done_cellar: - ; Restore temporary address area content ldx #$00 @@ -84,6 +91,10 @@ unit_rd_init_test_ram: ; non-destructive ATTIC/CELLAR RAM test cpx #$04 bne @3 + ; Clear RAM disk device number if no Hyper RAM available + + jsr util_check_rd_ram + ; End of initialization rts diff --git a/src/dos_m65/unit_ramdisk/unit_rd_preload.s b/src/dos_m65/unit_ramdisk/unit_rd_preload.s index 0facd81b..3f06bbf0 100644 --- a/src/dos_m65/unit_ramdisk/unit_rd_preload.s +++ b/src/dos_m65/unit_ramdisk/unit_rd_preload.s @@ -6,6 +6,11 @@ unit_rd_preload: + ; Check if RAM disk is enabled + + lda UNIT_RAMDISK + beq @error_no_ramdisk + ; XXX make sure attic RAM is present rts ; XXX remove when code is fully implemented @@ -28,6 +33,11 @@ unit_rd_preload: ; XXX load the file + ; XXX while loading set RD_MAXTRACK + +@load_track: + + ; XXX while loading set RD_MAXTRACK @@ -42,6 +52,12 @@ unit_rd_preload: @error_not_found: - ; XXX set information about file not found + ; XXX set error information + + rts + +@error_no_ramdisk: + + ; XXX set error information rts diff --git a/src/dos_m65/utils/util_check_rd_ram.s b/src/dos_m65/utils/util_check_rd_ram.s new file mode 100644 index 00000000..8a614e5e --- /dev/null +++ b/src/dos_m65/utils/util_check_rd_ram.s @@ -0,0 +1,21 @@ + +; If no Hyper RAM is present, clear the RAM DISK device number and set Carry + + +util_check_rd_ram: + + lda RAM_ATTIC + ora RAM_CELLAR + beq @no_hyperram + + clc + rts + + +@no_hyperram: + + lda #$00 + sta UNIT_RAMDISK + + sec + rts diff --git a/src/kernal/iec/load_iec.s b/src/kernal/iec/load_iec.s index e006b001..714945ff 100644 --- a/src/kernal/iec/load_iec.s +++ b/src/kernal/iec/load_iec.s @@ -92,7 +92,7 @@ load_iec: sta EAL+1 !ifdef CONFIG_MB_M65 { - load_iec_m65cont: +load_iec_m65cont: } ; If secondary address is 0, override EAL with STAL From bf583d904b0b23e9761e794ec660e527f45215ed Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Wed, 14 Apr 2021 18:30:26 +0200 Subject: [PATCH 08/38] reworked native mode extended memory map for easier porting of the legacy software --- src/aliases/,aliases_ram_lowmem_m65.s | 70 +++++++++++++++------------ 1 file changed, 40 insertions(+), 30 deletions(-) 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 From eac99c755c89401ab6ede62f04a4152e09722861 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Wed, 12 May 2021 21:23:26 +0200 Subject: [PATCH 09/38] attempt to sense disk on MEGA65 --- src/dos_m65/lowlevel/lowlevel_readsector.s | 53 +++++++++++++++------- 1 file changed, 36 insertions(+), 17 deletions(-) diff --git a/src/dos_m65/lowlevel/lowlevel_readsector.s b/src/dos_m65/lowlevel/lowlevel_readsector.s index fc180823..8f539a82 100644 --- a/src/dos_m65/lowlevel/lowlevel_readsector.s +++ b/src/dos_m65/lowlevel/lowlevel_readsector.s @@ -4,9 +4,24 @@ lowlevel_readsector: - ; XXX compare device and unit too + ; Set drive, check if disk is present + + lda #%00001111 ; set drive 0 (internal) and side 0 + trb FDC_CONTROL ; $D080 + + lda FDC_STATUS_B ; $D083 ; check if disk is inserted XXX this is probably not enough! + and #$08 + bne @disk_present + + ; XXX set error code + + sec + rts + +@disk_present: ; Check if buffer contains data from given track + ; XXX compare device and unit too lda PAR_TRACK cmp BUFTAB_TRACK+1 @@ -26,14 +41,9 @@ lowlevel_readsector: lowlevel_readsector_force: - ; Select FDD sector as buffer - lda #%10000000 ; select floppy buffer trb SD_BUFCTL ; $D689 - lda #%00001111 ; set drive 0 (internal) and side 0 - trb FDC_CONTROL ; $D080 - ; Select physical track and sector based on logical ones from PAR_TRACK and PAR_SECTOR lda PAR_TRACK @@ -70,17 +80,8 @@ lowlevel_readsector_force: lda #$40 sta FDC_COMMAND ; $D081 - ; Wait for RDREQ (indicates sector found) - -@lp1: - lda FDC_STATUS_B ; $D083 - bpl @lp1 - - ; Wait for BUSY flag to clear - -@lp2: - lda FDC_STATUS_A ; $D082 - bmi @lp2 + jsr lowlevel_wait_set_RDREQ ; wait till sector is found + jsr lowlevel_wait_clr_BUSY ; wait for BUSY flag to clear ; Wait for DRQ and EQ flags to go high @@ -115,3 +116,21 @@ lowlevel_readsector_force: clc rts + + + +; XXX consider moving these to a separate file + +lowlevel_wait_clr_BUSY: + + bit FDC_STATUS_A ; $D082 + bmi lowlevel_wait_clr_BUSY + + rts + +lowlevel_wait_set_RDREQ: + + bit FDC_STATUS_B ; $D083 + bpl lowlevel_wait_set_RDREQ + + rts From 3a80867854a163779a213c38e488c1b7c892794a Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Wed, 12 May 2021 21:48:09 +0200 Subject: [PATCH 10/38] added MEGA65 floppy engine handling --- src/dos_m65/lowlevel/lowlevel_helpers.s | 49 ++++++++++++++++++++++ src/dos_m65/lowlevel/lowlevel_readsector.s | 40 ++++-------------- 2 files changed, 58 insertions(+), 31 deletions(-) create mode 100644 src/dos_m65/lowlevel/lowlevel_helpers.s diff --git a/src/dos_m65/lowlevel/lowlevel_helpers.s b/src/dos_m65/lowlevel/lowlevel_helpers.s new file mode 100644 index 00000000..cd81ec98 --- /dev/null +++ b/src/dos_m65/lowlevel/lowlevel_helpers.s @@ -0,0 +1,49 @@ + +; Helper routines for low-level disk operations + + +lowlevel_ensure_presence: + + lda FDC_STATUS_B ; $D083 ; check if disk is inserted XXX this is probably not enough! + and #$08 + beq @not_present + rts + +@not_present: + + pla + pla + + jsr lowlevel_motor_off ; if disk not present, disable drive motor + + ; XXX set error code, invalidate buffers, etc. + + sec + rts + +lowlevel_motor_on: + + lda #%00100000 ; enable drive motor and LED + tsb FDC_CONTROL ; $D080 + bra lowlevel_wait_clr_BUSY + +lowlevel_motor_off: + + lda #%00100000 ; disable drive motor and LED + trb FDC_CONTROL ; $D080 + + ; FALLTROUGH + +lowlevel_wait_clr_BUSY: + + bit FDC_STATUS_A ; $D082 + bmi lowlevel_wait_clr_BUSY + + rts + +lowlevel_wait_set_RDREQ: + + bit FDC_STATUS_B ; $D083 + bpl lowlevel_wait_set_RDREQ + + rts diff --git a/src/dos_m65/lowlevel/lowlevel_readsector.s b/src/dos_m65/lowlevel/lowlevel_readsector.s index 8f539a82..8d2de407 100644 --- a/src/dos_m65/lowlevel/lowlevel_readsector.s +++ b/src/dos_m65/lowlevel/lowlevel_readsector.s @@ -4,21 +4,12 @@ lowlevel_readsector: - ; Set drive, check if disk is present + ; Set drive, ensure disk is present lda #%00001111 ; set drive 0 (internal) and side 0 trb FDC_CONTROL ; $D080 - lda FDC_STATUS_B ; $D083 ; check if disk is inserted XXX this is probably not enough! - and #$08 - bne @disk_present - - ; XXX set error code - - sec - rts - -@disk_present: + jsr lowlevel_ensure_presence ; Check if buffer contains data from given track ; XXX compare device and unit too @@ -41,6 +32,9 @@ lowlevel_readsector: lowlevel_readsector_force: + jsr lowlevel_motor_on ; enable drive motor and LED + jsr lowlevel_ensure_presence + lda #%10000000 ; select floppy buffer trb SD_BUFCTL ; $D689 @@ -85,11 +79,13 @@ lowlevel_readsector_force: ; Wait for DRQ and EQ flags to go high -@lp3: +@lp1: lda FDC_STATUS_A ; $D082 and #%01100000 cmp #%01000000 ; XXX is this correct? .A seems to stay at $40 at this point - bne @lp3 + bne @lp1 + + jsr lowlevel_motor_off ; disable drive motor ; Copy sector to buffer in RAM @@ -116,21 +112,3 @@ lowlevel_readsector_force: clc rts - - - -; XXX consider moving these to a separate file - -lowlevel_wait_clr_BUSY: - - bit FDC_STATUS_A ; $D082 - bmi lowlevel_wait_clr_BUSY - - rts - -lowlevel_wait_set_RDREQ: - - bit FDC_STATUS_B ; $D083 - bpl lowlevel_wait_set_RDREQ - - rts From 8e13ef40166a5f1f249b2a1e9b5e56a787e0f3a1 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 13 May 2021 17:56:43 +0200 Subject: [PATCH 11/38] more work towards physical floppy suppport --- src/dos_m65/dos_imports.s | 2 + src/dos_m65/lowlevel/lowlevel_helpers.s | 49 -------------- src/dos_m65/lowlevel/lowlevel_helpers_fdc.s | 74 +++++++++++++++++++++ src/dos_m65/lowlevel/lowlevel_readsector.s | 12 ++-- src/dos_m65/unit_floppy/unit_fd_init.s | 7 ++ 5 files changed, 89 insertions(+), 55 deletions(-) delete mode 100644 src/dos_m65/lowlevel/lowlevel_helpers.s create mode 100644 src/dos_m65/lowlevel/lowlevel_helpers_fdc.s 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/lowlevel/lowlevel_helpers.s b/src/dos_m65/lowlevel/lowlevel_helpers.s deleted file mode 100644 index cd81ec98..00000000 --- a/src/dos_m65/lowlevel/lowlevel_helpers.s +++ /dev/null @@ -1,49 +0,0 @@ - -; Helper routines for low-level disk operations - - -lowlevel_ensure_presence: - - lda FDC_STATUS_B ; $D083 ; check if disk is inserted XXX this is probably not enough! - and #$08 - beq @not_present - rts - -@not_present: - - pla - pla - - jsr lowlevel_motor_off ; if disk not present, disable drive motor - - ; XXX set error code, invalidate buffers, etc. - - sec - rts - -lowlevel_motor_on: - - lda #%00100000 ; enable drive motor and LED - tsb FDC_CONTROL ; $D080 - bra lowlevel_wait_clr_BUSY - -lowlevel_motor_off: - - lda #%00100000 ; disable drive motor and LED - trb FDC_CONTROL ; $D080 - - ; FALLTROUGH - -lowlevel_wait_clr_BUSY: - - bit FDC_STATUS_A ; $D082 - bmi lowlevel_wait_clr_BUSY - - rts - -lowlevel_wait_set_RDREQ: - - bit FDC_STATUS_B ; $D083 - bpl lowlevel_wait_set_RDREQ - - rts diff --git a/src/dos_m65/lowlevel/lowlevel_helpers_fdc.s b/src/dos_m65/lowlevel/lowlevel_helpers_fdc.s new file mode 100644 index 00000000..1d4d0696 --- /dev/null +++ b/src/dos_m65/lowlevel/lowlevel_helpers_fdc.s @@ -0,0 +1,74 @@ + +; Helper routines for low-level disk operations + + +lowlevel_fdc_ensure_presence_refresh: + + jsr lowlevel_fdc_wait_clr_BUSY ; to be extra sure + + ; XXX stepping head is definitely needed, but probably still not enough + + lda #%00011000 ; step head 1 track in (XXX: check if it is really in) + sta FDC_COMMAND ; $D081 + jsr lowlevel_fdc_wait_clr_BUSY + + lda #%00010000 ; step head 1 track out (XXX: check if it is really out) + sta FDC_COMMAND ; $D081 + jsr lowlevel_fdc_wait_clr_BUSY + + ; FALLTROUGH + +lowlevel_fdc_ensure_presence: + + lda FDC_STATUS_B ; $D083 ; check if disk is inserted + and #$08 + beq @not_present + rts + +@not_present: + + pla + pla + + jsr lowlevel_fdc_motor_off ; if disk not present, disable drive motor + + ; XXX set error code, invalidate buffers, etc. + + sec + rts + +lowlevel_fdc_motor_on: + + lda #%00100000 ; enable drive motor and LED + tsb FDC_CONTROL ; $D080 + + ; Allow some time for spin-up; according to https://wiki.osdev.org/Floppy_Disk_Controller + ; 300 ms should be more than enough + + phx + ldx #$0F + jsr wait_x_bars + plx + + bra lowlevel_fdc_wait_clr_BUSY + +lowlevel_fdc_motor_off: + + lda #%00100000 ; disable drive motor and LED + trb FDC_CONTROL ; $D080 + + ; FALLTROUGH + +lowlevel_fdc_wait_clr_BUSY: + + bit FDC_STATUS_A ; $D082 + bmi lowlevel_fdc_wait_clr_BUSY + + rts + +lowlevel_fdc_wait_set_RDREQ: + + bit FDC_STATUS_B ; $D083 + bpl lowlevel_fdc_wait_set_RDREQ + + rts diff --git a/src/dos_m65/lowlevel/lowlevel_readsector.s b/src/dos_m65/lowlevel/lowlevel_readsector.s index 8d2de407..4cb3d26f 100644 --- a/src/dos_m65/lowlevel/lowlevel_readsector.s +++ b/src/dos_m65/lowlevel/lowlevel_readsector.s @@ -9,7 +9,7 @@ lowlevel_readsector: lda #%00001111 ; set drive 0 (internal) and side 0 trb FDC_CONTROL ; $D080 - jsr lowlevel_ensure_presence + jsr lowlevel_fdc_ensure_presence_refresh ; Check if buffer contains data from given track ; XXX compare device and unit too @@ -32,8 +32,8 @@ lowlevel_readsector: lowlevel_readsector_force: - jsr lowlevel_motor_on ; enable drive motor and LED - jsr lowlevel_ensure_presence + jsr lowlevel_fdc_motor_on ; enable drive motor and LED + jsr lowlevel_fdc_ensure_presence lda #%10000000 ; select floppy buffer trb SD_BUFCTL ; $D689 @@ -74,8 +74,8 @@ lowlevel_readsector_force: lda #$40 sta FDC_COMMAND ; $D081 - jsr lowlevel_wait_set_RDREQ ; wait till sector is found - jsr lowlevel_wait_clr_BUSY ; wait for BUSY flag to clear + jsr lowlevel_fdc_wait_set_RDREQ ; wait till sector is found + jsr lowlevel_fdc_wait_clr_BUSY ; wait for BUSY flag to clear ; Wait for DRQ and EQ flags to go high @@ -85,7 +85,7 @@ lowlevel_readsector_force: cmp #%01000000 ; XXX is this correct? .A seems to stay at $40 at this point bne @lp1 - jsr lowlevel_motor_off ; disable drive motor + jsr lowlevel_fdc_motor_off ; disable drive motor ; Copy sector to buffer in RAM diff --git a/src/dos_m65/unit_floppy/unit_fd_init.s b/src/dos_m65/unit_floppy/unit_fd_init.s index 45143cce..9e254cba 100644 --- a/src/dos_m65/unit_floppy/unit_fd_init.s +++ b/src/dos_m65/unit_floppy/unit_fd_init.s @@ -23,6 +23,13 @@ unit_fd_init: sta FD_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 From 6180472a9b449c77f78223537a2043307966feca Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 13 May 2021 18:38:51 +0200 Subject: [PATCH 12/38] commented out some problematic code --- src/dos_m65/lowlevel/lowlevel_helpers_fdc.s | 34 +++++++++++++-------- src/dos_m65/lowlevel/lowlevel_readsector.s | 2 -- src/dos_m65/unit_floppy/unit_fd_cmd_close.s | 2 ++ 3 files changed, 24 insertions(+), 14 deletions(-) diff --git a/src/dos_m65/lowlevel/lowlevel_helpers_fdc.s b/src/dos_m65/lowlevel/lowlevel_helpers_fdc.s index 1d4d0696..1a5fff65 100644 --- a/src/dos_m65/lowlevel/lowlevel_helpers_fdc.s +++ b/src/dos_m65/lowlevel/lowlevel_helpers_fdc.s @@ -8,13 +8,13 @@ lowlevel_fdc_ensure_presence_refresh: ; XXX stepping head is definitely needed, but probably still not enough - lda #%00011000 ; step head 1 track in (XXX: check if it is really in) - sta FDC_COMMAND ; $D081 - jsr lowlevel_fdc_wait_clr_BUSY + ; lda #%00011000 ; step head 1 track in (XXX: check if it is really in) + ; sta FDC_COMMAND ; $D081 + ; jsr lowlevel_fdc_wait_clr_BUSY - lda #%00010000 ; step head 1 track out (XXX: check if it is really out) - sta FDC_COMMAND ; $D081 - jsr lowlevel_fdc_wait_clr_BUSY + ; lda #%00010000 ; step head 1 track out (XXX: check if it is really out) + ; sta FDC_COMMAND ; $D081 + ; jsr lowlevel_fdc_wait_clr_BUSY ; FALLTROUGH @@ -39,16 +39,22 @@ lowlevel_fdc_ensure_presence: lowlevel_fdc_motor_on: - lda #%00100000 ; enable drive motor and LED - tsb FDC_CONTROL ; $D080 + lda FDC_CONTROL + and #%00100000 + bne lowlevel_fdc_rts ; if motor already enabled, do nothing + + ; XXX find out why it is not disabled at all + ; lda #%00100000 ; enable drive motor and LED + ; tsb FDC_CONTROL ; $D080 ; Allow some time for spin-up; according to https://wiki.osdev.org/Floppy_Disk_Controller ; 300 ms should be more than enough - phx - ldx #$0F - jsr wait_x_bars - plx + ; XXX reenable this + ; phx + ; ldx #$0F + ; jsr wait_x_bars + ; plx bra lowlevel_fdc_wait_clr_BUSY @@ -71,4 +77,8 @@ lowlevel_fdc_wait_set_RDREQ: bit FDC_STATUS_B ; $D083 bpl lowlevel_fdc_wait_set_RDREQ + ; FALLTROUGH + +lowlevel_fdc_rts: + rts diff --git a/src/dos_m65/lowlevel/lowlevel_readsector.s b/src/dos_m65/lowlevel/lowlevel_readsector.s index 4cb3d26f..7b7f1dbc 100644 --- a/src/dos_m65/lowlevel/lowlevel_readsector.s +++ b/src/dos_m65/lowlevel/lowlevel_readsector.s @@ -85,8 +85,6 @@ lowlevel_readsector_force: cmp #%01000000 ; XXX is this correct? .A seems to stay at $40 at this point bne @lp1 - jsr lowlevel_fdc_motor_off ; disable drive motor - ; Copy sector to buffer in RAM lda #$00 diff --git a/src/dos_m65/unit_floppy/unit_fd_cmd_close.s b/src/dos_m65/unit_floppy/unit_fd_cmd_close.s index fc980641..c15bfc1b 100644 --- a/src/dos_m65/unit_floppy/unit_fd_cmd_close.s +++ b/src/dos_m65/unit_floppy/unit_fd_cmd_close.s @@ -8,4 +8,6 @@ unit_fd_cmd_CLOSE: ; XXX provide implementation + jsr lowlevel_fdc_motor_off ; disable drive motor XXX only do this if no channel is opened + jmp dos_EXIT_SEC From f6abf8e4cd120b75e3675e3a5fee403117b4f5cb Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 16 May 2021 17:58:22 +0200 Subject: [PATCH 13/38] 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) From 215adaf47a7633102e2a8229b9dc2742bac0c92f Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 16 May 2021 18:09:47 +0200 Subject: [PATCH 14/38] dual fdd startup banner fix --- src/basic/basic_commands_04/cmd_sysinfo.s | 10 ++++++++-- tools/generate_strings.cc | 4 ++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/basic/basic_commands_04/cmd_sysinfo.s b/src/basic/basic_commands_04/cmd_sysinfo.s index dfed12c2..43dfeee4 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 + lda #'/' + jsr JCHROUT + + 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/tools/generate_strings.cc b/tools/generate_strings.cc index 676d6594..e5a55217 100644 --- a/tools/generate_strings.cc +++ b/tools/generate_strings.cc @@ -306,8 +306,8 @@ const StringEntryList GLOBAL_MiscStrings = { ListType::STRINGS_BASIC, "misc", { false, true, true, false, false, "STR_MEM_STRS", "\r STRS" }, { false, true, true, false, false, "STR_MEM_FREE", "\r\r FREE" }, - { false, false, true, false, false, "STR_DOS_FD", ", FLOPPY " }, - { false, false, true, false, false, "STR_DOS_RD", ", RAM DISK " }, + { false, false, true, false, false, "STR_DOS_FD", ", FDD " }, + { false, false, true, false, false, "STR_DOS_RD", ", RAM DISK " }, { false, false, true, false, false, "STR_SI_HEADER", "OPEN ROMS, " }, { false, false, true, false, false, "STR_SI_MODE64", "LEGACY MODE" }, From ad66c0972a6ca83894296f9690307a9a246c8d0a Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Mon, 17 May 2021 20:04:05 +0200 Subject: [PATCH 15/38] more work towards preloading RAM disk image --- src/dos_m65/,aliases_dos.s | 8 ++-- src/dos_m65/unit_ramdisk/unit_rd_init.s | 2 +- src/dos_m65/unit_ramdisk/unit_rd_preload.s | 55 ++++++++++++++++++++-- 3 files changed, 58 insertions(+), 7 deletions(-) diff --git a/src/dos_m65/,aliases_dos.s b/src/dos_m65/,aliases_dos.s index 0cd6902b..9cfdbf59 100644 --- a/src/dos_m65/,aliases_dos.s +++ b/src/dos_m65/,aliases_dos.s @@ -138,10 +138,12 @@ !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 + !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: $8081-$81FF + + ; Reserved: $8082-$81FF ; ; Various buffers, caches, and other large memory chunks diff --git a/src/dos_m65/unit_ramdisk/unit_rd_init.s b/src/dos_m65/unit_ramdisk/unit_rd_init.s index 0532228f..14d73474 100644 --- a/src/dos_m65/unit_ramdisk/unit_rd_init.s +++ b/src/dos_m65/unit_ramdisk/unit_rd_init.s @@ -41,7 +41,7 @@ unit_rd_init_test_ram: ; non-destructive ATTIC/CELLAR RAM test stx RD_STARTSEG ; by default $FF, to mark no RAM disk inx - stx RD_MAXTRACK ; maximum allowed track number, for now set 0 + stx RD_VALIDIMG ; mark no valid image loaded stx RAM_ATTIC ; set ATTIC/CELLAR RAM as not present stx RAM_CELLAR diff --git a/src/dos_m65/unit_ramdisk/unit_rd_preload.s b/src/dos_m65/unit_ramdisk/unit_rd_preload.s index 3f06bbf0..97f86cd4 100644 --- a/src/dos_m65/unit_ramdisk/unit_rd_preload.s +++ b/src/dos_m65/unit_ramdisk/unit_rd_preload.s @@ -4,17 +4,22 @@ ; +!addr __stoptrack = RD_DIR_PHASE ; helper value for detecting too large image + + unit_rd_preload: - ; Check if RAM disk is enabled + ; Check if RAM disk is enabled (should be disabled if no Hyper RAM is present) lda UNIT_RAMDISK beq @error_no_ramdisk - ; XXX make sure attic RAM is present - rts ; XXX remove when code is fully implemented + + + + ; Set file name ldy #>ramdisk_filename @@ -31,6 +36,30 @@ unit_rd_preload: +nop bcc @error_not_found ; branch if file not found + ; Calculate maximum amount of tracks possible to load + + lda #$FF + sta RD_MAXTRACK ; maximum track number of loaded image, for now set $FF + sta __stoptrack + + lda RAM_ATTIC + beq @added_attic + jsr unit_rd_preload_addram + +@added_attic: + + lda RAM_CELLAR + beq @added_cellar + jsr unit_rd_preload_addram + +@added_cellar: + + ; Load the file + + + + + ; XXX load the file ; XXX while loading set RD_MAXTRACK @@ -47,6 +76,12 @@ unit_rd_preload: ; End of initialization + lda #$FF + sta RD_VALIDIMG ; mark image as valid + + lda #$00 ; temporary storage needs to be restored to 0 + sta __stoptrack + rts @@ -61,3 +96,17 @@ unit_rd_preload: ; XXX set error information rts + + + + + +unit_rd_preload_addram: + + ; Add allowed number of tracks due to attic/cellar block presence + + clc + lda #$80 + adc __stoptrack + sta __stoptrack + rts From 81f0b16ca400f5807e4b13c6b36406a44dee20c6 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Tue, 18 May 2021 21:39:47 +0200 Subject: [PATCH 16/38] more ram disk code --- src/dos_m65/unit_ramdisk/unit_rd_preload.s | 101 +++++++++++++++++---- 1 file changed, 85 insertions(+), 16 deletions(-) diff --git a/src/dos_m65/unit_ramdisk/unit_rd_preload.s b/src/dos_m65/unit_ramdisk/unit_rd_preload.s index 97f86cd4..11dedca1 100644 --- a/src/dos_m65/unit_ramdisk/unit_rd_preload.s +++ b/src/dos_m65/unit_ramdisk/unit_rd_preload.s @@ -54,51 +54,120 @@ unit_rd_preload: @added_cellar: - ; Load the file + ; Load the image - - - - - ; XXX load the file - - ; XXX while loading set RD_MAXTRACK + lda #$FF + sta RD_MODE ; mark for nothing loaded @load_track: - ; XXX while loading set RD_MAXTRACK + inc RD_MAXTRACK ; XXX check against __stoptrack - detect file too llarge + ldx #$FF ; counter of 512-byte blocks to load +@load_track_loop: + phx - ; lda #$20 ; dos_closefile - ; sta HTRAP00 - ; +nop + ; Read 512 bytes + + lda #$1A ; dos_readfile + sta HTRAP00 + +nop + + cpx #$00 + bne @error_wrong_size_plx ; file size not multiplicity of 64K + + cpy #$00 + beq @load_image_end + + cpy #$02 + bne @error_wrong_size_plx ; file size not multiplicity of 64K + + stx RD_MODE ; .X should be 0 - mark that something was actually loaded + + plx + inx + + ; XXX launch DMA job to copy data + + cpx #$7F + bne @load_track_loop ; next 512-byte block of the same track + + bra @load_track ; next track + +@load_image_end: + + plx + cpx #$7F + bne @error_wrong_size ; file empty or file size not multiplicity of 64K + + lda RD_MAXTRACK + cmp #$02 + bcc @error_wrong_size ; file too small, at least 128K required + + lda #$20 ; dos_closefile + sta HTRAP00 + +nop ; End of initialization lda #$FF - sta RD_VALIDIMG ; mark image as valid + sta RD_VALIDIMG ; mark image as valid - lda #$00 ; temporary storage needs to be restored to 0 + lda #$00 ; temporary storage needs to be restored to 0 sta __stoptrack rts + +@error_wrong_size_plx: + + plx + +@error_wrong_size: + + jsr unit_rd_preload_err_common + + ; XXX set error information + + rts + + @error_not_found: - ; XXX set error information + jsr unit_rd_preload_err_common_noclose + + ; XXX set error information, put 0 to __stoptrack rts @error_no_ramdisk: - ; XXX set error information + jsr unit_rd_preload_err_common_noclose + + ; XXX set error information, put 0 to __stoptrack rts +unit_rd_preload_err_common: + + lda #$20 ; dos_closefile + sta HTRAP00 + +nop + + ; FALLTROUGH + +unit_rd_preload_err_common_noclose: + + lda #$00 ; temporary storage needs to be restored to 0 + sta __stoptrack + sta RD_VALIDIMG ; mark image as invalid + + rts + unit_rd_preload_addram: From 770441e302a0a7b2ef84eabbc2aa0501d727c246 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Wed, 19 May 2021 20:39:06 +0200 Subject: [PATCH 17/38] more ram disk preload checks --- src/dos_m65/unit_ramdisk/unit_rd_preload.s | 53 +++++++++++++++++----- 1 file changed, 41 insertions(+), 12 deletions(-) diff --git a/src/dos_m65/unit_ramdisk/unit_rd_preload.s b/src/dos_m65/unit_ramdisk/unit_rd_preload.s index 11dedca1..779f4db1 100644 --- a/src/dos_m65/unit_ramdisk/unit_rd_preload.s +++ b/src/dos_m65/unit_ramdisk/unit_rd_preload.s @@ -12,13 +12,12 @@ unit_rd_preload: ; Check if RAM disk is enabled (should be disabled if no Hyper RAM is present) lda UNIT_RAMDISK - beq @error_no_ramdisk - - rts ; XXX remove when code is fully implemented - - + +beq @error_no_ramdisk + ; Select SD card buffer + lda #$80 + tsb SD_BUFCTL ; Set file name @@ -27,14 +26,14 @@ unit_rd_preload: lda #$2E ; dos_setname sta HTRAP00 +nop - bcc @error_not_found + +bcc @error_not_found ; branch if error ; Try to find the file lda #$34 ; dos_findfile sta HTRAP00 +nop - bcc @error_not_found ; branch if file not found + +bcc @error_not_found ; branch if file not found ; Calculate maximum amount of tracks possible to load @@ -56,12 +55,20 @@ unit_rd_preload: ; Load the image - lda #$FF - sta RD_MODE ; mark for nothing loaded + lda #$00 + sta RD_MAXTRACK + + bra @load_track_check_done @load_track: - inc RD_MAXTRACK ; XXX check against __stoptrack - detect file too llarge + lda RD_MAXTRACK + cmp __stoptrack + beq @load_image_mem_full + +@load_track_check_done: + + inc RD_MAXTRACK ldx #$FF ; counter of 512-byte blocks to load @load_track_loop: @@ -83,8 +90,6 @@ unit_rd_preload: cpy #$02 bne @error_wrong_size_plx ; file size not multiplicity of 64K - stx RD_MODE ; .X should be 0 - mark that something was actually loaded - plx inx @@ -95,6 +100,23 @@ unit_rd_preload: bra @load_track ; next track +@load_image_mem_full: + + ; Make sure this is the end of the file + + lda #$1A ; dos_readfile + sta HTRAP00 + +nop + + cpx #$00 + bne @error_too_large + cpy #$00 + bne @error_too_large + + lda #$20 ; dos_closefile + sta HTRAP00 + +nop + @load_image_end: plx @@ -133,6 +155,13 @@ unit_rd_preload: rts +@error_too_large: + + jsr unit_rd_preload_err_common + + ; XXX set error information + + rts @error_not_found: From f7ff71f6cdc41c8b787e87d3fee26ee9079e443d Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Wed, 19 May 2021 22:59:35 +0200 Subject: [PATCH 18/38] added ram disk status message on startup screen --- src/basic/,imports.s | 1 + src/basic/board_m65/mega65_imports.s | 1 + src/basic/board_m65/mega65_proxies.s | 6 ++++ src/basic/init/initmsg_m65.s | 35 +++++++++++++++++++- src/dos_m65/,aliases_dos.s | 2 +- src/dos_m65/4020.dos_vectable.s | 1 + src/dos_m65/dos_rdchk.s | 24 ++++++++++++++ src/dos_m65/unit_ramdisk/unit_rd_init.s | 2 ++ src/dos_m65/unit_ramdisk/unit_rd_preload.s | 37 ++++++++-------------- src/kernal/iec_fast/m65dos_bridge.s | 32 ++++++++++++------- tools/generate_strings.cc | 6 ++++ 11 files changed, 110 insertions(+), 37 deletions(-) create mode 100644 src/dos_m65/dos_rdchk.s 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/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/init/initmsg_m65.s b/src/basic/init/initmsg_m65.s index 7df683f5..a81b682c 100644 --- a/src/basic/init/initmsg_m65.s +++ b/src/basic/init/initmsg_m65.s @@ -66,7 +66,40 @@ 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 INITMSG_rts + + 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_rts: + + rts INITMSG_main_banner: diff --git a/src/dos_m65/,aliases_dos.s b/src/dos_m65/,aliases_dos.s index 9cfdbf59..cdcad8a2 100644 --- a/src/dos_m65/,aliases_dos.s +++ b/src/dos_m65/,aliases_dos.s @@ -32,7 +32,7 @@ !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 + !addr RD_MSG = $800B ; code of the RAM disk message to be displayed on banner screen, $FF for none ; General DOS configuration diff --git a/src/dos_m65/4020.dos_vectable.s b/src/dos_m65/4020.dos_vectable.s index fd2aa2c3..12d25c33 100644 --- a/src/dos_m65/4020.dos_vectable.s +++ b/src/dos_m65/4020.dos_vectable.s @@ -3,6 +3,7 @@ !word dos_INIT !word dos_PRELOAD +!word dos_RDCHK !word dos_UNITCHK !word dos_UNITSET !word dos_UNITNUM 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/unit_ramdisk/unit_rd_init.s b/src/dos_m65/unit_ramdisk/unit_rd_init.s index 14d73474..3016c239 100644 --- a/src/dos_m65/unit_ramdisk/unit_rd_init.s +++ b/src/dos_m65/unit_ramdisk/unit_rd_init.s @@ -37,6 +37,8 @@ unit_rd_init_test_ram: ; non-destructive ATTIC/CELLAR RAM test 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 diff --git a/src/dos_m65/unit_ramdisk/unit_rd_preload.s b/src/dos_m65/unit_ramdisk/unit_rd_preload.s index 779f4db1..53bbf47f 100644 --- a/src/dos_m65/unit_ramdisk/unit_rd_preload.s +++ b/src/dos_m65/unit_ramdisk/unit_rd_preload.s @@ -12,7 +12,7 @@ unit_rd_preload: ; Check if RAM disk is enabled (should be disabled if no Hyper RAM is present) lda UNIT_RAMDISK - +beq @error_no_ramdisk + +beq unit_rd_preload_err_common_noclose ; Select SD card buffer @@ -139,6 +139,9 @@ unit_rd_preload: lda #$00 ; temporary storage needs to be restored to 0 sta __stoptrack + lda #$00 ; set message to OK + sta RD_MSG + rts @@ -149,40 +152,26 @@ unit_rd_preload: @error_wrong_size: - jsr unit_rd_preload_err_common - - ; XXX set error information - - rts + lda #$01 + jmp unit_rd_preload_err_common @error_too_large: - jsr unit_rd_preload_err_common - - ; XXX set error information - - rts + lda #$02 + jmp unit_rd_preload_err_common @error_not_found: - jsr unit_rd_preload_err_common_noclose - - ; XXX set error information, put 0 to __stoptrack - - rts - -@error_no_ramdisk: - - jsr unit_rd_preload_err_common_noclose - - ; XXX set error information, put 0 to __stoptrack - - rts + lda #$03 + sta RD_MSG + jmp unit_rd_preload_err_common_noclose unit_rd_preload_err_common: + sta RD_MSG ; set code for startup screen + lda #$20 ; dos_closefile sta HTRAP00 +nop diff --git a/src/kernal/iec_fast/m65dos_bridge.s b/src/kernal/iec_fast/m65dos_bridge.s index 439c5d01..77bb46de 100644 --- a/src/kernal/iec_fast/m65dos_bridge.s +++ b/src/kernal/iec_fast/m65dos_bridge.s @@ -8,17 +8,18 @@ !addr VDOS_INIT = $4020 + 0 * 2 !addr VDOS_PRELOAD = $4020 + 1 * 2 -!addr VDOS_UNITCHK = $4020 + 2 * 2 -!addr VDOS_UNITSET = $4020 + 3 * 2 -!addr VDOS_UNITNUM = $4020 + 4 * 2 -!addr VDOS_ACPTR = $4020 + 5 * 2 -!addr VDOS_CIOUT = $4020 + 6 * 2 -!addr VDOS_LISTEN = $4020 + 7 * 2 -!addr VDOS_SECOND = $4020 + 8 * 2 -!addr VDOS_TALK = $4020 + 9 * 2 -!addr VDOS_TKSA = $4020 + 10 * 2 -!addr VDOS_UNTLK = $4020 + 11 * 2 -!addr VDOS_UNLSN = $4020 + 12 * 2 +!addr VDOS_RDCHK = $4020 + 2 * 2 +!addr VDOS_UNITCHK = $4020 + 3 * 2 +!addr VDOS_UNITSET = $4020 + 4 * 2 +!addr VDOS_UNITNUM = $4020 + 5 * 2 +!addr VDOS_ACPTR = $4020 + 6 * 2 +!addr VDOS_CIOUT = $4020 + 7 * 2 +!addr VDOS_LISTEN = $4020 + 8 * 2 +!addr VDOS_SECOND = $4020 + 9 * 2 +!addr VDOS_TALK = $4020 + 10 * 2 +!addr VDOS_TKSA = $4020 + 11 * 2 +!addr VDOS_UNTLK = $4020 + 12 * 2 +!addr VDOS_UNLSN = $4020 + 13 * 2 m65dos_init: @@ -37,6 +38,15 @@ m65dos_preload: jsr (VDOS_PRELOAD) bra m65dos_end_1 +m65dos_rdchk: + + ; Returns in .A the RAM DISK preload status; $00 = OK, $FF = N/A, other = error code + + jsr map_DOS_1 + jsr (VDOS_RDCHK) + bra m65dos_end_1 + + m65dos_unitchk: ; XXX expose to BASIC ; Checks is the unit number is supported by the internal DOS diff --git a/tools/generate_strings.cc b/tools/generate_strings.cc index e5a55217..d57f0e57 100644 --- a/tools/generate_strings.cc +++ b/tools/generate_strings.cc @@ -326,6 +326,12 @@ const StringEntryList GLOBAL_MiscStrings = { ListType::STRINGS_BASIC, "misc", { false, false, true, false, false, "STR_SI_HW_XX", "UNKNOWN ID $" }, { false, false, true, false, false, "STR_SI_HDR_VID", "\rVIDEO : " }, + { false, false, true, false, false, "STR_RD_NAME", "RAMDISK.DNP " }, + { false, false, true, false, false, "STR_RD_OK", "LOADED OK\r" }, + { false, false, true, false, false, "STR_RD_ERR1", "SIZE WRONG\r" }, + { false, false, true, false, false, "STR_RD_ERR2", "TOO LARGE\r" }, + { false, false, true, false, false, "STR_RD_ERR3", "NOT FOUND\r" }, + // Note: depending on configuration, additional strings will be added here } }; From 394aa80b4940645569c5a2ad27b38b8b930cd6f3 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sat, 22 May 2021 20:33:43 +0200 Subject: [PATCH 19/38] fix for ram disk file name --- src/dos_m65/,aliases_dos.s | 2 +- .../filesystem_vfs/fs_vfs_nextfileblock.s | 2 +- src/dos_m65/filesystem_vfs/fs_vfs_read_dir.s | 35 ++----------------- src/dos_m65/filesystem_vfs/fs_vfs_read_file.s | 4 +-- src/dos_m65/unit_ramdisk/unit_rd_preload.s | 14 ++++++-- src/dos_m65/utils/util_shadow.s | 31 ++++++++++++++++ 6 files changed, 49 insertions(+), 39 deletions(-) create mode 100644 src/dos_m65/utils/util_shadow.s diff --git a/src/dos_m65/,aliases_dos.s b/src/dos_m65/,aliases_dos.s index cdcad8a2..61f61fa3 100644 --- a/src/dos_m65/,aliases_dos.s +++ b/src/dos_m65/,aliases_dos.s @@ -177,7 +177,7 @@ ; Memory shadow, needed for SD card support - !addr SD_MEMSHADOW_BUF = $A800 ; 256 byte buffer for preserving original memory content + !addr MEMSHADOW_BUF = $A800 ; 256 byte buffer for preserving original memory content ; Command/filename buffers, 256 bytes each diff --git a/src/dos_m65/filesystem_vfs/fs_vfs_nextfileblock.s b/src/dos_m65/filesystem_vfs/fs_vfs_nextfileblock.s index e787af5f..d804f8e3 100644 --- a/src/dos_m65/filesystem_vfs/fs_vfs_nextfileblock.s +++ b/src/dos_m65/filesystem_vfs/fs_vfs_nextfileblock.s @@ -66,7 +66,7 @@ fs_vfs_nextfileblock: fs_vfs_file_not_found: - jsr fs_vfs_direntmem_restore ; restore $1000 memory content + jsr util_shadow_restore ; restore $1000 memory content ldx SD_DESC lda #$16 ; dos_closedir 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..ad99c314 100644 --- a/src/dos_m65/filesystem_vfs/fs_vfs_read_dir.s +++ b/src/dos_m65/filesystem_vfs/fs_vfs_read_dir.s @@ -49,9 +49,9 @@ 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 - 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' @@ -112,34 +112,3 @@ fs_vfs_read_dir_blocksfree: 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..8e7a07c8 100644 --- a/src/dos_m65/filesystem_vfs/fs_vfs_read_file.s +++ b/src/dos_m65/filesystem_vfs/fs_vfs_read_file.s @@ -28,7 +28,7 @@ fs_vfs_read_file_open: ; Read dirent structures into $1000, find the first matching file ; Starting at $1000 VIC sees chargen, so this should be a safe place - jsr fs_vfs_direntmem_prepare + jsr util_shadow @lp_find: @@ -49,7 +49,7 @@ fs_vfs_read_file_open: ; Found the file - load it - jsr fs_vfs_direntmem_restore ; restore $1000 memory content + jsr util_shadow_restore ; restore $1000 memory content lda #$18 ; dos_openfile sta HTRAP00 diff --git a/src/dos_m65/unit_ramdisk/unit_rd_preload.s b/src/dos_m65/unit_ramdisk/unit_rd_preload.s index 53bbf47f..b62a57e3 100644 --- a/src/dos_m65/unit_ramdisk/unit_rd_preload.s +++ b/src/dos_m65/unit_ramdisk/unit_rd_preload.s @@ -21,11 +21,21 @@ unit_rd_preload: ; Set file name - ldy #>ramdisk_filename - ldx #$1000 + ldx #<$1000 lda #$2E ; dos_setname sta HTRAP00 +nop + jsr util_shadow_restore + +bcc @error_not_found ; branch if error ; Try to find the file diff --git a/src/dos_m65/utils/util_shadow.s b/src/dos_m65/utils/util_shadow.s new file mode 100644 index 00000000..bdfed2bf --- /dev/null +++ b/src/dos_m65/utils/util_shadow.s @@ -0,0 +1,31 @@ + +; Handling shadow memory, preserves .P + + + +util_shadow: + + ldx #$00 +@1: + ldy $1000, x + sty MEMSHADOW_BUF, x + inx + bne @1 + + rts + +util_shadow_restore: + + php + + ldx #$00 +@1: + ldy MEMSHADOW_BUF, x + sty $1000, x + inx + bne @1 + + bne @1 + + plp + rts From b5247f8019612590a64762d1fa105f9e84e61a20 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sat, 22 May 2021 20:47:38 +0200 Subject: [PATCH 20/38] small DOS cleanup --- src/dos_m65/,aliases_dos.s | 2 +- .../filesystem_vfs/fs_vfs_nextdirentry.s | 36 +++++++++---------- .../filesystem_vfs/fs_vfs_nextfileblock.s | 2 +- src/dos_m65/filesystem_vfs/fs_vfs_read_dir.s | 3 +- src/dos_m65/filesystem_vfs/fs_vfs_read_file.s | 5 ++- src/dos_m65/unit_ramdisk/unit_rd_preload.s | 6 ++-- src/dos_m65/utils/util_dir_filter.s | 2 +- src/dos_m65/utils/util_shadow.s | 4 +-- 8 files changed, 29 insertions(+), 31 deletions(-) diff --git a/src/dos_m65/,aliases_dos.s b/src/dos_m65/,aliases_dos.s index 61f61fa3..3b6ec8de 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 ; diff --git a/src/dos_m65/filesystem_vfs/fs_vfs_nextdirentry.s b/src/dos_m65/filesystem_vfs/fs_vfs_nextdirentry.s index 9a855961..f459b304 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,14 +18,14 @@ 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 @@ -44,7 +44,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 +52,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 +79,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 +90,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 +106,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 +119,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 +142,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 +185,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 +201,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 +215,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 d804f8e3..e700a6c7 100644 --- a/src/dos_m65/filesystem_vfs/fs_vfs_nextfileblock.s +++ b/src/dos_m65/filesystem_vfs/fs_vfs_nextfileblock.s @@ -66,7 +66,7 @@ fs_vfs_nextfileblock: fs_vfs_file_not_found: - jsr util_shadow_restore ; restore $1000 memory content + jsr util_shadow_restore ; restore MEM_BUF memory content ldx SD_DESC lda #$16 ; dos_closedir 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 ad99c314..7cba036f 100644 --- a/src/dos_m65/filesystem_vfs/fs_vfs_read_dir.s +++ b/src/dos_m65/filesystem_vfs/fs_vfs_read_dir.s @@ -46,8 +46,7 @@ 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 util_shadow jsr fs_vfs_nextdirentry 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 8e7a07c8..7c019a68 100644 --- a/src/dos_m65/filesystem_vfs/fs_vfs_read_file.s +++ b/src/dos_m65/filesystem_vfs/fs_vfs_read_file.s @@ -25,8 +25,7 @@ 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 util_shadow @@ -49,7 +48,7 @@ fs_vfs_read_file_open: ; Found the file - load it - jsr util_shadow_restore ; restore $1000 memory content + jsr util_shadow_restore ; restore MEM_BUF memory content lda #$18 ; dos_openfile sta HTRAP00 diff --git a/src/dos_m65/unit_ramdisk/unit_rd_preload.s b/src/dos_m65/unit_ramdisk/unit_rd_preload.s index b62a57e3..f1699990 100644 --- a/src/dos_m65/unit_ramdisk/unit_rd_preload.s +++ b/src/dos_m65/unit_ramdisk/unit_rd_preload.s @@ -26,11 +26,11 @@ unit_rd_preload: @lp1: inx lda ramdisk_filename, x - sta $1000, x + sta MEM_BUF, x bne @lp1 - ldy #>$1000 - ldx #<$1000 + ldy #>MEM_BUF + ldx # Date: Sat, 22 May 2021 21:56:37 +0200 Subject: [PATCH 21/38] small RAM disk preload fix --- src/dos_m65/unit_ramdisk/unit_rd_preload.s | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/dos_m65/unit_ramdisk/unit_rd_preload.s b/src/dos_m65/unit_ramdisk/unit_rd_preload.s index f1699990..cfff2312 100644 --- a/src/dos_m65/unit_ramdisk/unit_rd_preload.s +++ b/src/dos_m65/unit_ramdisk/unit_rd_preload.s @@ -65,7 +65,7 @@ unit_rd_preload: ; Load the image - lda #$00 + lda #$FF sta RD_MAXTRACK bra @load_track_check_done @@ -131,6 +131,8 @@ unit_rd_preload: plx cpx #$7F + ; XXX debug code + ; stx $1000 bne @error_wrong_size ; file empty or file size not multiplicity of 64K lda RD_MAXTRACK @@ -162,6 +164,10 @@ unit_rd_preload: @error_wrong_size: + ; XXX debug code + ; lda RD_MAXTRACK + l sta $1001 + lda #$01 jmp unit_rd_preload_err_common From 74aa30772d14d5f2cb74844859f42e9aab7b521a Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sat, 22 May 2021 22:15:27 +0200 Subject: [PATCH 22/38] added missing hypervicor call --- src/dos_m65/unit_ramdisk/unit_rd_preload.s | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/dos_m65/unit_ramdisk/unit_rd_preload.s b/src/dos_m65/unit_ramdisk/unit_rd_preload.s index cfff2312..0baa3ce2 100644 --- a/src/dos_m65/unit_ramdisk/unit_rd_preload.s +++ b/src/dos_m65/unit_ramdisk/unit_rd_preload.s @@ -65,6 +65,10 @@ unit_rd_preload: ; Load the image + lda #$18 ; dos_openfile + sta HTRAP00 + +nop + lda #$FF sta RD_MAXTRACK @@ -166,7 +170,7 @@ unit_rd_preload: ; XXX debug code ; lda RD_MAXTRACK - l sta $1001 + ; sta $1001 lda #$01 jmp unit_rd_preload_err_common From b7e32fa459d42348b3cff2e77d0d75f08ec6711f Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sat, 22 May 2021 22:50:34 +0200 Subject: [PATCH 23/38] code size optimization --- src/dos_m65/unit_ramdisk/unit_rd_preload.s | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/dos_m65/unit_ramdisk/unit_rd_preload.s b/src/dos_m65/unit_ramdisk/unit_rd_preload.s index 0baa3ce2..e851110d 100644 --- a/src/dos_m65/unit_ramdisk/unit_rd_preload.s +++ b/src/dos_m65/unit_ramdisk/unit_rd_preload.s @@ -83,7 +83,7 @@ unit_rd_preload: @load_track_check_done: inc RD_MAXTRACK - ldx #$FF ; counter of 512-byte blocks to load + ldx #$00 ; counter of 512-byte blocks to load @load_track_loop: @@ -104,12 +104,13 @@ unit_rd_preload: cpy #$02 bne @error_wrong_size_plx ; file size not multiplicity of 64K - plx - inx - ; XXX launch DMA job to copy data - cpx #$7F + ; Next 512-byte block or next track + + plx + inx + inx bne @load_track_loop ; next 512-byte block of the same track bra @load_track ; next track From 9fbd7499db8bc249555bcb0bfca0d0f771e96740 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sat, 22 May 2021 22:54:29 +0200 Subject: [PATCH 24/38] fixed regression in the last commit --- src/dos_m65/unit_ramdisk/unit_rd_preload.s | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/dos_m65/unit_ramdisk/unit_rd_preload.s b/src/dos_m65/unit_ramdisk/unit_rd_preload.s index e851110d..9bf90c13 100644 --- a/src/dos_m65/unit_ramdisk/unit_rd_preload.s +++ b/src/dos_m65/unit_ramdisk/unit_rd_preload.s @@ -135,9 +135,7 @@ unit_rd_preload: @load_image_end: plx - cpx #$7F - ; XXX debug code - ; stx $1000 + cpx #$00 bne @error_wrong_size ; file empty or file size not multiplicity of 64K lda RD_MAXTRACK @@ -169,10 +167,6 @@ unit_rd_preload: @error_wrong_size: - ; XXX debug code - ; lda RD_MAXTRACK - ; sta $1001 - lda #$01 jmp unit_rd_preload_err_common From c1f5ccf55bc6bc8a249c6c1d4586a36f15647f77 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 23 May 2021 03:30:36 +0200 Subject: [PATCH 25/38] tweaked MEGA65 startup banner --- src/basic/basic_commands_04/cmd_sysinfo.s | 4 ++-- src/basic/init/initmsg_m65.s | 10 +++------- tools/generate_strings.cc | 23 ++++++++++++----------- 3 files changed, 17 insertions(+), 20 deletions(-) diff --git a/src/basic/basic_commands_04/cmd_sysinfo.s b/src/basic/basic_commands_04/cmd_sysinfo.s index 43dfeee4..6f74e215 100644 --- a/src/basic/basic_commands_04/cmd_sysinfo.s +++ b/src/basic/basic_commands_04/cmd_sysinfo.s @@ -124,8 +124,8 @@ print_sysinfo_video: lda #$01 jsr cmd_sysinfo_print_dev - lda #'/' - jsr JCHROUT + ldx #IDX__STR_DOS_SEPAR + jsr print_packed_misc_str lda #$02 jsr cmd_sysinfo_print_dev diff --git a/src/basic/init/initmsg_m65.s b/src/basic/init/initmsg_m65.s index a81b682c..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 @@ -72,7 +72,7 @@ INITMSG_native: jsr m65dos_rdchk cmp #$FF - beq INITMSG_rts + +beq print_return pha jsr print_return @@ -97,10 +97,6 @@ INITMSG_native: tax jmp print_packed_misc_str -INITMSG_rts: - - rts - INITMSG_main_banner: ; Clear the screen first, some cartridges (like IEEE-488) are leaving a mess on the screen diff --git a/tools/generate_strings.cc b/tools/generate_strings.cc index d57f0e57..cf75caaf 100644 --- a/tools/generate_strings.cc +++ b/tools/generate_strings.cc @@ -306,14 +306,15 @@ const StringEntryList GLOBAL_MiscStrings = { ListType::STRINGS_BASIC, "misc", { false, true, true, false, false, "STR_MEM_STRS", "\r STRS" }, { false, true, true, false, false, "STR_MEM_FREE", "\r\r FREE" }, - { false, false, true, false, false, "STR_DOS_FD", ", FDD " }, - { false, false, true, false, false, "STR_DOS_RD", ", RAM DISK " }, + { false, false, true, false, false, "STR_DOS_FD", "\rFLOPPY : " }, + { false, false, true, false, false, "STR_DOS_SEPAR", " / " }, + { false, false, true, false, false, "STR_DOS_RD", "\rRAM DISK : " }, { false, false, true, false, false, "STR_SI_HEADER", "OPEN ROMS, " }, { false, false, true, false, false, "STR_SI_MODE64", "LEGACY MODE" }, { false, false, true, false, false, "STR_SI_MODE65", "NATIVE MODE" }, { false, false, true, false, false, "STR_SI_HDR_REL", "\rRELEASE " }, - { false, false, true, false, false, "STR_SI_HDR_HW", "BOARD : " }, + { false, false, true, false, false, "STR_SI_HDR_HW", "BOARD : " }, { false, false, true, false, false, "STR_SI_HW_01", "MEGA65 R1" }, { false, false, true, false, false, "STR_SI_HW_02", "MEGA65 R2" }, { false, false, true, false, false, "STR_SI_HW_03", "MEGA65 R3" }, @@ -324,7 +325,7 @@ const StringEntryList GLOBAL_MiscStrings = { ListType::STRINGS_BASIC, "misc", { false, false, true, false, false, "STR_SI_HW_FD", "WUKONG A100T" }, { false, false, true, false, false, "STR_SI_HW_FE", "SIMULATION VHDL" }, { false, false, true, false, false, "STR_SI_HW_XX", "UNKNOWN ID $" }, - { false, false, true, false, false, "STR_SI_HDR_VID", "\rVIDEO : " }, + { false, false, true, false, false, "STR_SI_HDR_VID", "\rVIDEO : " }, { false, false, true, false, false, "STR_RD_NAME", "RAMDISK.DNP " }, { false, false, true, false, false, "STR_RD_OK", "LOADED OK\r" }, @@ -1153,17 +1154,17 @@ void DataSet::generateConfigDepStrings() if (GLOBAL_ConfigOptions["TAPE_NORMAL"] && GLOBAL_ConfigOptions["TAPE_TURBO"]) { featureStr += "TAPE LOAD NORMAL TURBO\r"; - featureStrM65 += "TAPE : LOAD NORMAL TURBO\r"; + featureStrM65 += "TAPE : LOAD NORMAL TURBO\r"; } else if (GLOBAL_ConfigOptions["TAPE_NORMAL"]) { featureStr += "TAPE LOAD NORMAL\r"; - featureStrM65 += "TAPE : LOAD NORMAL\r"; + featureStrM65 += "TAPE : LOAD NORMAL\r"; } else if (GLOBAL_ConfigOptions["TAPE_TURBO"]) { featureStr += "TAPE LOAD TURBO\r"; - featureStrM65 += "TAPE : LOAD TURBO\r"; + featureStrM65 += "TAPE : LOAD TURBO\r"; } // IEC support features @@ -1171,7 +1172,7 @@ void DataSet::generateConfigDepStrings() if (GLOBAL_ConfigOptions["IEC"]) { featureStr += "IEC"; - featureStrM65 += "IEC :"; + featureStrM65 += "IEC :"; bool extendedIEC = false; @@ -1217,7 +1218,7 @@ void DataSet::generateConfigDepStrings() } else { - featureStrM65 += "IEC : NO\r"; + featureStrM65 += "IEC : -\r"; } // RS-232 support features @@ -1226,11 +1227,11 @@ void DataSet::generateConfigDepStrings() if (GLOBAL_ConfigOptions["RS232_UP2400"]) featureStr += "UP2400\r"; if (GLOBAL_ConfigOptions["RS232_UP9600"]) featureStr += "UP9600\r"; - featureStrM65 += "RS-232 : NO\r"; + featureStrM65 += "RS-232 : -\r"; // CBDOS features - featureStrM65 += "\rSD CARD "; + featureStrM65 += "\rSD CARD : "; // Keyboard support features From e7f3a0731ff7c91ee141a3b77318b974b4c1daf7 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 23 May 2021 13:00:13 +0200 Subject: [PATCH 26/38] code size optimization in CBDOS --- .../filesystem_vfs/fs_vfs_nextdirentry.s | 4 +- .../filesystem_vfs/fs_vfs_nextfileblock.s | 12 +-- src/dos_m65/filesystem_vfs/fs_vfs_read_dir.s | 8 +- src/dos_m65/filesystem_vfs/fs_vfs_read_file.s | 4 +- src/dos_m65/unit_ramdisk/unit_rd_preload.s | 32 ++------ src/dos_m65/unit_sdcard/unit_sd_init.s | 13 +--- src/dos_m65/utils/util_htrap.s | 75 +++++++++++++++++++ 7 files changed, 91 insertions(+), 57 deletions(-) create mode 100644 src/dos_m65/utils/util_htrap.s diff --git a/src/dos_m65/filesystem_vfs/fs_vfs_nextdirentry.s b/src/dos_m65/filesystem_vfs/fs_vfs_nextdirentry.s index f459b304..0e03fff3 100644 --- a/src/dos_m65/filesystem_vfs/fs_vfs_nextdirentry.s +++ b/src/dos_m65/filesystem_vfs/fs_vfs_nextdirentry.s @@ -27,9 +27,7 @@ fs_vfs_nextdirentry: ldx SD_DESC ; directory descriptor XXX rename to FS_HVSR_DESC ldy #>MEM_BUF ; target page number - lda #$14 ; dos_readdir - sta HTRAP00 - +nop + jsr util_htrap_dos_readddir +bcc @fail diff --git a/src/dos_m65/filesystem_vfs/fs_vfs_nextfileblock.s b/src/dos_m65/filesystem_vfs/fs_vfs_nextfileblock.s index e700a6c7..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 @@ -69,9 +65,7 @@ fs_vfs_file_not_found: 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 7cba036f..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 @@ -105,9 +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 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 7c019a68..9cc623bc 100644 --- a/src/dos_m65/filesystem_vfs/fs_vfs_read_file.s +++ b/src/dos_m65/filesystem_vfs/fs_vfs_read_file.s @@ -50,9 +50,7 @@ fs_vfs_read_file_open: 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/unit_ramdisk/unit_rd_preload.s b/src/dos_m65/unit_ramdisk/unit_rd_preload.s index 9bf90c13..4322b264 100644 --- a/src/dos_m65/unit_ramdisk/unit_rd_preload.s +++ b/src/dos_m65/unit_ramdisk/unit_rd_preload.s @@ -31,18 +31,14 @@ unit_rd_preload: ldy #>MEM_BUF ldx # Date: Tue, 25 May 2021 21:40:52 +0200 Subject: [PATCH 27/38] added missing DMA job and file handler support --- src/dos_m65/unit_ramdisk/unit_rd_preload.s | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/dos_m65/unit_ramdisk/unit_rd_preload.s b/src/dos_m65/unit_ramdisk/unit_rd_preload.s index 4322b264..61372202 100644 --- a/src/dos_m65/unit_ramdisk/unit_rd_preload.s +++ b/src/dos_m65/unit_ramdisk/unit_rd_preload.s @@ -43,6 +43,8 @@ unit_rd_preload: ; Calculate maximum amount of tracks possible to load + ; XXX clean this up, for the loop counter it should be enough to use DMAJOB_DST_ADDR + lda #$FF sta RD_MAXTRACK ; maximum track number of loaded image, for now set $FF sta __stoptrack @@ -61,7 +63,16 @@ unit_rd_preload: ; Load the image + lda #$08 ; set the ram disk start address + sta DMAJOB_DST_MB + lda #$00 + sta DMAJOB_DST_ADDR+0 + sta DMAJOB_DST_ADDR+1 + lda RD_STARTSEG + sta DMAJOB_DST_ADDR+2 + jsr util_htrap_dos_openfile + sta SD_DESC ; XXX consider using separate variable lda #$FF sta RD_MAXTRACK @@ -73,6 +84,7 @@ unit_rd_preload: lda RD_MAXTRACK cmp __stoptrack beq @load_image_mem_full + inc DMAJOB_DST_ADDR+2 @load_track_check_done: @@ -96,7 +108,10 @@ unit_rd_preload: cpy #$02 bne @error_wrong_size_plx ; file size not multiplicity of 64K - ; XXX launch DMA job to copy data + jsr util_dma_launch_from_hwbuf ; copy data to Hyper RAM + + inc DMAJOB_DST_ADDR+1 ; advance pointer to the next block + inc DMAJOB_DST_ADDR+1 ; Next 512-byte block or next track @@ -128,7 +143,8 @@ unit_rd_preload: cmp #$02 bcc @error_wrong_size ; file too small, at least 128K required - jsr util_htrap_dos_closefile ; XXX set descriptor + ldx SD_DESC + jsr util_htrap_dos_closefile ; End of initialization From 3a05ee480750f3b9999c16366f1e62f57948cbbb Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Mon, 7 Jun 2021 22:00:01 +0200 Subject: [PATCH 28/38] more work on multiple filesystem instances --- src/dos_m65/,aliases_dos.s | 14 ++++++++------ src/dos_m65/lowlevel/lowlevel_readsector.s | 3 +++ src/dos_m65/pseudoiec/msg_acptr.s | 4 ++++ src/dos_m65/pseudoiec/msg_ciout.s | 8 +++++++- src/dos_m65/pseudoiec/msg_second.s | 1 + src/dos_m65/unit_sdcard/unit_sd_cmd_open.s | 2 -- 6 files changed, 23 insertions(+), 9 deletions(-) diff --git a/src/dos_m65/,aliases_dos.s b/src/dos_m65/,aliases_dos.s index 3b6ec8de..3bf30ab4 100644 --- a/src/dos_m65/,aliases_dos.s +++ b/src/dos_m65/,aliases_dos.s @@ -66,15 +66,17 @@ !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 F0_DIR_PHASE = $8042 ; - floppy 0 - !addr F1_DIR_PHASE = $8043 ; - floppy 0 - !addr RD_DIR_PHASE = $8044 ; - 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: $8045-$8063 + ; Free space: $8046-$8063 !addr SD_ACPTR_helper = $8052 ; subroutine in RAM to read a byte !addr code_LDA_01 = $8052 ; - LDA instruction diff --git a/src/dos_m65/lowlevel/lowlevel_readsector.s b/src/dos_m65/lowlevel/lowlevel_readsector.s index 7b7f1dbc..9af6dd94 100644 --- a/src/dos_m65/lowlevel/lowlevel_readsector.s +++ b/src/dos_m65/lowlevel/lowlevel_readsector.s @@ -2,6 +2,9 @@ ; Read a sector pair from a block device +; XXX utilize PAR_FSINSTANCE + + lowlevel_readsector: ; Set drive, ensure disk is present diff --git a/src/dos_m65/pseudoiec/msg_acptr.s b/src/dos_m65/pseudoiec/msg_acptr.s index 96b5934f..03ba153f 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 diff --git a/src/dos_m65/pseudoiec/msg_ciout.s b/src/dos_m65/pseudoiec/msg_ciout.s index 369d38d3..29ce9597 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 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/unit_sdcard/unit_sd_cmd_open.s b/src/dos_m65/unit_sdcard/unit_sd_cmd_open.s index 56a2629d..20cfc828 100644 --- a/src/dos_m65/unit_sdcard/unit_sd_cmd_open.s +++ b/src/dos_m65/unit_sdcard/unit_sd_cmd_open.s @@ -24,8 +24,6 @@ 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 From 2acf32fb6870daa91b76341e7553276377f729a6 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Mon, 14 Jun 2021 22:31:46 +0200 Subject: [PATCH 29/38] started unification of floppy and ramdisk code --- Makefile | 2 +- src/dos_m65/{unit_floppy => unit_disk}/unit_fd_cmd_close.s | 0 src/dos_m65/{unit_floppy => unit_disk}/unit_fd_cmd_open.s | 0 src/dos_m65/{unit_floppy => unit_disk}/unit_fd_cmd_read.s | 0 src/dos_m65/{unit_floppy => unit_disk}/unit_fd_init.s | 0 src/dos_m65/{unit_ramdisk => unit_disk}/unit_rd_init.s | 0 src/dos_m65/{unit_ramdisk => unit_disk}/unit_rd_preload.s | 0 src/dos_m65/unit_ramdisk/unit_rd_cmd_close.s | 2 ++ src/dos_m65/unit_ramdisk/unit_rd_cmd_open.s | 2 ++ src/dos_m65/unit_ramdisk/unit_rd_cmd_read.s | 2 ++ 10 files changed, 7 insertions(+), 1 deletion(-) rename src/dos_m65/{unit_floppy => unit_disk}/unit_fd_cmd_close.s (100%) rename src/dos_m65/{unit_floppy => unit_disk}/unit_fd_cmd_open.s (100%) rename src/dos_m65/{unit_floppy => unit_disk}/unit_fd_cmd_read.s (100%) rename src/dos_m65/{unit_floppy => unit_disk}/unit_fd_init.s (100%) rename src/dos_m65/{unit_ramdisk => unit_disk}/unit_rd_init.s (100%) rename src/dos_m65/{unit_ramdisk => unit_disk}/unit_rd_preload.s (100%) diff --git a/Makefile b/Makefile index c900042c..0e75894f 100644 --- a/Makefile +++ b/Makefile @@ -68,7 +68,7 @@ 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_disk \ src/dos_m65/unit_ramdisk \ src/dos_m65/unit_sdcard \ src/dos_m65/utils diff --git a/src/dos_m65/unit_floppy/unit_fd_cmd_close.s b/src/dos_m65/unit_disk/unit_fd_cmd_close.s similarity index 100% rename from src/dos_m65/unit_floppy/unit_fd_cmd_close.s rename to src/dos_m65/unit_disk/unit_fd_cmd_close.s diff --git a/src/dos_m65/unit_floppy/unit_fd_cmd_open.s b/src/dos_m65/unit_disk/unit_fd_cmd_open.s similarity index 100% rename from src/dos_m65/unit_floppy/unit_fd_cmd_open.s rename to src/dos_m65/unit_disk/unit_fd_cmd_open.s diff --git a/src/dos_m65/unit_floppy/unit_fd_cmd_read.s b/src/dos_m65/unit_disk/unit_fd_cmd_read.s similarity index 100% rename from src/dos_m65/unit_floppy/unit_fd_cmd_read.s rename to src/dos_m65/unit_disk/unit_fd_cmd_read.s diff --git a/src/dos_m65/unit_floppy/unit_fd_init.s b/src/dos_m65/unit_disk/unit_fd_init.s similarity index 100% rename from src/dos_m65/unit_floppy/unit_fd_init.s rename to src/dos_m65/unit_disk/unit_fd_init.s diff --git a/src/dos_m65/unit_ramdisk/unit_rd_init.s b/src/dos_m65/unit_disk/unit_rd_init.s similarity index 100% rename from src/dos_m65/unit_ramdisk/unit_rd_init.s rename to src/dos_m65/unit_disk/unit_rd_init.s diff --git a/src/dos_m65/unit_ramdisk/unit_rd_preload.s b/src/dos_m65/unit_disk/unit_rd_preload.s similarity index 100% rename from src/dos_m65/unit_ramdisk/unit_rd_preload.s rename to src/dos_m65/unit_disk/unit_rd_preload.s diff --git a/src/dos_m65/unit_ramdisk/unit_rd_cmd_close.s b/src/dos_m65/unit_ramdisk/unit_rd_cmd_close.s index 60f9a9c3..0fb7d592 100644 --- a/src/dos_m65/unit_ramdisk/unit_rd_cmd_close.s +++ b/src/dos_m65/unit_ramdisk/unit_rd_cmd_close.s @@ -3,6 +3,8 @@ ; Close currently opened file ; +; XXX to be unified with floppy code + unit_rd_cmd_CLOSE: diff --git a/src/dos_m65/unit_ramdisk/unit_rd_cmd_open.s b/src/dos_m65/unit_ramdisk/unit_rd_cmd_open.s index dba16a23..0eab1ee8 100644 --- a/src/dos_m65/unit_ramdisk/unit_rd_cmd_open.s +++ b/src/dos_m65/unit_ramdisk/unit_rd_cmd_open.s @@ -3,6 +3,8 @@ ; Open file for reading ; +; XXX to be unified with floppy code + unit_rd_cmd_OPEN: diff --git a/src/dos_m65/unit_ramdisk/unit_rd_cmd_read.s b/src/dos_m65/unit_ramdisk/unit_rd_cmd_read.s index cd9a0b0c..ffbb3640 100644 --- a/src/dos_m65/unit_ramdisk/unit_rd_cmd_read.s +++ b/src/dos_m65/unit_ramdisk/unit_rd_cmd_read.s @@ -3,6 +3,8 @@ ; Read more data into the buffer ; +; XXX to be unified with floppy code + unit_rd_cmd_READ: From 924d87d271a650f0a64a543045a59c40d46105c6 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 17 Jun 2021 21:50:24 +0200 Subject: [PATCH 30/38] further RAM disk and floppy code integration --- src/dos_m65/dos_vectab_unit.s | 4 ++-- src/dos_m65/pseudoiec/msg_ciout.s | 15 +++++++------- src/dos_m65/unit_disk/unit_fd_cmd_open.s | 23 ++++++++++++++++----- src/dos_m65/unit_ramdisk/unit_rd_cmd_open.s | 6 ------ 4 files changed, 28 insertions(+), 20 deletions(-) diff --git a/src/dos_m65/dos_vectab_unit.s b/src/dos_m65/dos_vectab_unit.s index ee5bce48..c64e805d 100644 --- a/src/dos_m65/dos_vectab_unit.s +++ b/src/dos_m65/dos_vectab_unit.s @@ -7,8 +7,8 @@ dos_cmd_OPEN_vectab: !word unit_sd_cmd_OPEN - !word unit_fd_cmd_OPEN - !word unit_rd_cmd_OPEN + !word unit_disk_cmd_OPEN + !word unit_disk_cmd_OPEN dos_cmd_CLOSE_vectab: diff --git a/src/dos_m65/pseudoiec/msg_ciout.s b/src/dos_m65/pseudoiec/msg_ciout.s index 29ce9597..ac8fa48e 100644 --- a/src/dos_m65/pseudoiec/msg_ciout.s +++ b/src/dos_m65/pseudoiec/msg_ciout.s @@ -72,9 +72,7 @@ msg_CIOUT_cmdfn_F0: ; get next byte of status - floppy stx F0_CMDFN_IDX lda #$A0 sta F0_CMDFN_BUF,x - plp - +bcs unit_fd_cmd_OPEN_EOI ; if EOI - execute command - jmp dos_EXIT_CLC + bra msg_CIOUT_cmdfn_FX msg_CIOUT_cmdfn_F1: ; get next byte of status - floppy @@ -87,9 +85,7 @@ msg_CIOUT_cmdfn_F1: ; get next byte of status - floppy 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 + bra msg_CIOUT_cmdfn_FX msg_CIOUT_cmdfn_RD: ; get next byte of status - ram disk @@ -102,8 +98,13 @@ 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 unit_disk_cmd_OPEN_EOI ; if EOI - execute command jmp dos_EXIT_CLC msg_CIOUT_cmdfn_vectab: diff --git a/src/dos_m65/unit_disk/unit_fd_cmd_open.s b/src/dos_m65/unit_disk/unit_fd_cmd_open.s index f03c8457..b5c0dca1 100644 --- a/src/dos_m65/unit_disk/unit_fd_cmd_open.s +++ b/src/dos_m65/unit_disk/unit_fd_cmd_open.s @@ -6,14 +6,15 @@ ; XXX add support for both floppies -unit_fd_cmd_OPEN: +unit_disk_cmd_OPEN: lda #$01 ; mode: receive command or file name - sta F0_MODE + ldx PAR_FSINSTANCE + sta XX_MODE, x jmp dos_EXIT_CLC -unit_fd_cmd_OPEN_EOI: +unit_disk_cmd_OPEN_EOI: ; XXX this dispatcher is temporary @@ -26,16 +27,28 @@ unit_fd_cmd_OPEN_EOI: dey bpl @lp1 - ; XXX add support for second floppy + ldx PAR_FSINSTANCE + cmp #$02 + beq @f1 + bcs @rd lda F0_CMDFN_BUF + +skip_2_bytes_trash_nvz +@f1: + lda F1_CMDFN_BUF + +skip_2_bytes_trash_nvz +@rd: + lda RD_CMDFN_BUF + cmp #'$' - beq unit_fd_cmd_OPEN_dir + beq unit_fd_cmd_OPEN_dir ; XXX add support for second floppy and RAM disk ; FALLTROUGH unit_fd_cmd_OPEN_file: + ; XXX add support for second floppy and RAM disk + ; Copy the filter from command XXX this should be moved to common part and deduplicated with directory opening ldy #$00 diff --git a/src/dos_m65/unit_ramdisk/unit_rd_cmd_open.s b/src/dos_m65/unit_ramdisk/unit_rd_cmd_open.s index 0eab1ee8..ca151259 100644 --- a/src/dos_m65/unit_ramdisk/unit_rd_cmd_open.s +++ b/src/dos_m65/unit_ramdisk/unit_rd_cmd_open.s @@ -6,12 +6,6 @@ ; XXX to be unified with floppy code -unit_rd_cmd_OPEN: - - ; XXX provide implementation - - jmp dos_EXIT_SEC - unit_rd_cmd_OPEN_EOI: ; XXX provide implementation From 7624e141044afa825e6af4557ecbfa522ad15c25 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Wed, 7 Jul 2021 20:33:49 +0200 Subject: [PATCH 31/38] more refactoring towards RAM disk support --- Makefile | 2 +- src/dos_m65/dos_init.s | 6 +++--- src/dos_m65/dos_preload.s | 2 +- src/dos_m65/dos_vectab_unit.s | 14 +++++++------ src/dos_m65/pseudoiec/msg_acptr.s | 6 +++--- src/dos_m65/pseudoiec/msg_ciout.s | 4 ++-- .../card_sd_cmd_close.s} | 2 +- .../card_sd_cmd_open.s} | 10 +++++----- .../card_sd_cmd_read.s} | 2 +- .../card_sd_init.s} | 2 +- ...nit_fd_cmd_close.s => disk_fd_cmd_close.s} | 2 +- ...{unit_fd_cmd_open.s => disk_fd_cmd_open.s} | 10 +++++----- ...{unit_fd_cmd_read.s => disk_fd_cmd_read.s} | 6 +++--- .../{unit_fd_init.s => disk_fd_init.s} | 2 +- .../disk_rd_cmd_close.s} | 4 +--- .../{unit_rd_init.s => disk_rd_init.s} | 4 ++-- .../{unit_rd_preload.s => disk_rd_preload.s} | 20 +++++++++---------- ...{unit_rd_cmd_open.s => disk_rd_cmd_open.s} | 2 +- ...{unit_rd_cmd_read.s => disk_rd_cmd_read.s} | 2 +- 19 files changed, 51 insertions(+), 51 deletions(-) rename src/dos_m65/{unit_sdcard/unit_sd_cmd_close.s => unit_card/card_sd_cmd_close.s} (82%) rename src/dos_m65/{unit_sdcard/unit_sd_cmd_open.s => unit_card/card_sd_cmd_open.s} (89%) rename src/dos_m65/{unit_sdcard/unit_sd_cmd_read.s => unit_card/card_sd_cmd_read.s} (92%) rename src/dos_m65/{unit_sdcard/unit_sd_init.s => unit_card/card_sd_init.s} (96%) rename src/dos_m65/unit_disk/{unit_fd_cmd_close.s => disk_fd_cmd_close.s} (90%) rename src/dos_m65/unit_disk/{unit_fd_cmd_open.s => disk_fd_cmd_open.s} (88%) rename src/dos_m65/unit_disk/{unit_fd_cmd_read.s => disk_fd_cmd_read.s} (83%) rename src/dos_m65/unit_disk/{unit_fd_init.s => disk_fd_init.s} (97%) rename src/dos_m65/{unit_ramdisk/unit_rd_cmd_close.s => unit_disk/disk_rd_cmd_close.s} (60%) rename src/dos_m65/unit_disk/{unit_rd_init.s => disk_rd_init.s} (96%) rename src/dos_m65/unit_disk/{unit_rd_preload.s => disk_rd_preload.s} (91%) rename src/dos_m65/unit_ramdisk/{unit_rd_cmd_open.s => disk_rd_cmd_open.s} (84%) rename src/dos_m65/unit_ramdisk/{unit_rd_cmd_read.s => disk_rd_cmd_read.s} (87%) diff --git a/Makefile b/Makefile index 0e75894f..2a273598 100644 --- a/Makefile +++ b/Makefile @@ -68,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_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/src/dos_m65/dos_init.s b/src/dos_m65/dos_init.s index 764dd2ca..baae9e36 100644 --- a/src/dos_m65/dos_init.s +++ b/src/dos_m65/dos_init.s @@ -84,9 +84,9 @@ dos_INIT: ; 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_preload.s b/src/dos_m65/dos_preload.s index 0775e180..fc575915 100644 --- a/src/dos_m65/dos_preload.s +++ b/src/dos_m65/dos_preload.s @@ -13,5 +13,5 @@ dos_PRELOAD: rts @ok: jsr dos_ENTER - jsr unit_rd_preload + jsr disk_rd_preload jmp dos_EXIT_CLC diff --git a/src/dos_m65/dos_vectab_unit.s b/src/dos_m65/dos_vectab_unit.s index c64e805d..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_disk_cmd_OPEN - !word unit_disk_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/pseudoiec/msg_acptr.s b/src/dos_m65/pseudoiec/msg_acptr.s index 03ba153f..8afbb02a 100644 --- a/src/dos_m65/pseudoiec/msg_acptr.s +++ b/src/dos_m65/pseudoiec/msg_acptr.s @@ -60,7 +60,7 @@ 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: @@ -90,7 +90,7 @@ msg_ACPTR_read_F0: ora F0_ACPTR_LEN+1 bne @3 - jsr unit_f0_cmd_READ + jsr disk_f0_cmd_READ bcc @3 jsr kernalstatus_EOI @3: @@ -120,7 +120,7 @@ msg_ACPTR_read_F1: ora F1_ACPTR_LEN+1 bne @3 - jsr unit_f1_cmd_READ + jsr disk_f1_cmd_READ bcc @3 jsr kernalstatus_EOI @3: diff --git a/src/dos_m65/pseudoiec/msg_ciout.s b/src/dos_m65/pseudoiec/msg_ciout.s index ac8fa48e..327b60d4 100644 --- a/src/dos_m65/pseudoiec/msg_ciout.s +++ b/src/dos_m65/pseudoiec/msg_ciout.s @@ -58,7 +58,7 @@ 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_F0: ; get next byte of status - floppy @@ -104,7 +104,7 @@ msg_CIOUT_cmdfn_RD: ; get next byte of status - ram disk msg_CIOUT_cmdfn_FX: ; common pard for floppy and RAM disk plp - +bcs unit_disk_cmd_OPEN_EOI ; if EOI - execute command + +bcs disk_fd_cmd_OPEN_EOI ; if EOI - execute command jmp dos_EXIT_CLC msg_CIOUT_cmdfn_vectab: 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 89% 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 20cfc828..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 @@ -26,11 +26,11 @@ unit_sd_cmd_OPEN_EOI: 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 @@ -49,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 96% rename from src/dos_m65/unit_sdcard/unit_sd_init.s rename to src/dos_m65/unit_card/card_sd_init.s index 3f4552e9..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 diff --git a/src/dos_m65/unit_disk/unit_fd_cmd_close.s b/src/dos_m65/unit_disk/disk_fd_cmd_close.s similarity index 90% rename from src/dos_m65/unit_disk/unit_fd_cmd_close.s rename to src/dos_m65/unit_disk/disk_fd_cmd_close.s index c15bfc1b..9f0b1d4a 100644 --- a/src/dos_m65/unit_disk/unit_fd_cmd_close.s +++ b/src/dos_m65/unit_disk/disk_fd_cmd_close.s @@ -4,7 +4,7 @@ ; -unit_fd_cmd_CLOSE: +disk_fd_cmd_CLOSE: ; XXX provide implementation diff --git a/src/dos_m65/unit_disk/unit_fd_cmd_open.s b/src/dos_m65/unit_disk/disk_fd_cmd_open.s similarity index 88% rename from src/dos_m65/unit_disk/unit_fd_cmd_open.s rename to src/dos_m65/unit_disk/disk_fd_cmd_open.s index b5c0dca1..9c146e64 100644 --- a/src/dos_m65/unit_disk/unit_fd_cmd_open.s +++ b/src/dos_m65/unit_disk/disk_fd_cmd_open.s @@ -6,7 +6,7 @@ ; XXX add support for both floppies -unit_disk_cmd_OPEN: +disk_xx_cmd_OPEN: lda #$01 ; mode: receive command or file name ldx PAR_FSINSTANCE @@ -14,7 +14,7 @@ unit_disk_cmd_OPEN: jmp dos_EXIT_CLC -unit_disk_cmd_OPEN_EOI: +disk_fd_cmd_OPEN_EOI: ; XXX this dispatcher is temporary @@ -41,11 +41,11 @@ unit_disk_cmd_OPEN_EOI: lda RD_CMDFN_BUF cmp #'$' - beq unit_fd_cmd_OPEN_dir ; XXX add support for second floppy and RAM disk + beq disk_fd_cmd_OPEN_dir ; XXX add support for second floppy and RAM disk ; FALLTROUGH -unit_fd_cmd_OPEN_file: +disk_fd_cmd_OPEN_file: ; XXX add support for second floppy and RAM disk @@ -66,7 +66,7 @@ unit_fd_cmd_OPEN_file: jmp fs_cbm_read_file_open -unit_fd_cmd_OPEN_dir: +disk_fd_cmd_OPEN_dir: lda #$02 ; mode: read directory sta F0_MODE diff --git a/src/dos_m65/unit_disk/unit_fd_cmd_read.s b/src/dos_m65/unit_disk/disk_fd_cmd_read.s similarity index 83% rename from src/dos_m65/unit_disk/unit_fd_cmd_read.s rename to src/dos_m65/unit_disk/disk_fd_cmd_read.s index 9c7b9ab7..49d85d6a 100644 --- a/src/dos_m65/unit_disk/unit_fd_cmd_read.s +++ b/src/dos_m65/unit_disk/disk_fd_cmd_read.s @@ -4,15 +4,15 @@ ; -unit_f0_cmd_READ: +disk_f0_cmd_READ: ; XXX provide implementation -unit_f1_cmd_READ: +disk_f1_cmd_READ: ; XXX provide implementation -unit_fd_cmd_READ: +disk_f__cmd_READ: lda F0_MODE cmp #$03 diff --git a/src/dos_m65/unit_disk/unit_fd_init.s b/src/dos_m65/unit_disk/disk_fd_init.s similarity index 97% rename from src/dos_m65/unit_disk/unit_fd_init.s rename to src/dos_m65/unit_disk/disk_fd_init.s index 9b95f591..9b62a3c8 100644 --- a/src/dos_m65/unit_disk/unit_fd_init.s +++ b/src/dos_m65/unit_disk/disk_fd_init.s @@ -4,7 +4,7 @@ ; -unit_fd_init: +disk_fd_init: ; Copy status string 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 60% 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 0fb7d592..ef50f5a1 100644 --- a/src/dos_m65/unit_ramdisk/unit_rd_cmd_close.s +++ b/src/dos_m65/unit_disk/disk_rd_cmd_close.s @@ -3,10 +3,8 @@ ; Close currently opened file ; -; XXX to be unified with floppy code - -unit_rd_cmd_CLOSE: +disk_rd_cmd_CLOSE: ; XXX provide implementation diff --git a/src/dos_m65/unit_disk/unit_rd_init.s b/src/dos_m65/unit_disk/disk_rd_init.s similarity index 96% rename from src/dos_m65/unit_disk/unit_rd_init.s rename to src/dos_m65/unit_disk/disk_rd_init.s index 3016c239..c38ecbc6 100644 --- a/src/dos_m65/unit_disk/unit_rd_init.s +++ b/src/dos_m65/unit_disk/disk_rd_init.s @@ -4,7 +4,7 @@ ; -unit_rd_init: +disk_rd_init: ; Copy status string @@ -26,7 +26,7 @@ unit_rd_init: ; FALLTROUGH -unit_rd_init_test_ram: ; non-destructive ATTIC/CELLAR RAM test +disk_rd_init_test_ram: ; non-destructive ATTIC/CELLAR RAM test ; Preserve temporary address area on stack diff --git a/src/dos_m65/unit_disk/unit_rd_preload.s b/src/dos_m65/unit_disk/disk_rd_preload.s similarity index 91% rename from src/dos_m65/unit_disk/unit_rd_preload.s rename to src/dos_m65/unit_disk/disk_rd_preload.s index 61372202..b75c4aab 100644 --- a/src/dos_m65/unit_disk/unit_rd_preload.s +++ b/src/dos_m65/unit_disk/disk_rd_preload.s @@ -7,12 +7,12 @@ !addr __stoptrack = RD_DIR_PHASE ; helper value for detecting too large image -unit_rd_preload: +disk_rd_preload: ; Check if RAM disk is enabled (should be disabled if no Hyper RAM is present) lda UNIT_RAMDISK - +beq unit_rd_preload_err_common_noclose + +beq disk_rd_preload_err_common_noclose ; Select SD card buffer @@ -51,13 +51,13 @@ unit_rd_preload: lda RAM_ATTIC beq @added_attic - jsr unit_rd_preload_addram + jsr disk_rd_preload_addram @added_attic: lda RAM_CELLAR beq @added_cellar - jsr unit_rd_preload_addram + jsr disk_rd_preload_addram @added_cellar: @@ -168,22 +168,22 @@ unit_rd_preload: @error_wrong_size: lda #$01 - jmp unit_rd_preload_err_common + jmp disk_rd_preload_err_common @error_too_large: lda #$02 - jmp unit_rd_preload_err_common + jmp disk_rd_preload_err_common @error_not_found: lda #$03 sta RD_MSG - jmp unit_rd_preload_err_common_noclose + jmp disk_rd_preload_err_common_noclose -unit_rd_preload_err_common: +disk_rd_preload_err_common: sta RD_MSG ; set code for startup screen @@ -191,7 +191,7 @@ unit_rd_preload_err_common: ; FALLTROUGH -unit_rd_preload_err_common_noclose: +disk_rd_preload_err_common_noclose: lda #$00 ; temporary storage needs to be restored to 0 sta __stoptrack @@ -201,7 +201,7 @@ unit_rd_preload_err_common_noclose: -unit_rd_preload_addram: +disk_rd_preload_addram: ; Add allowed number of tracks due to attic/cellar block presence diff --git a/src/dos_m65/unit_ramdisk/unit_rd_cmd_open.s b/src/dos_m65/unit_ramdisk/disk_rd_cmd_open.s similarity index 84% rename from src/dos_m65/unit_ramdisk/unit_rd_cmd_open.s rename to src/dos_m65/unit_ramdisk/disk_rd_cmd_open.s index ca151259..05f62444 100644 --- a/src/dos_m65/unit_ramdisk/unit_rd_cmd_open.s +++ b/src/dos_m65/unit_ramdisk/disk_rd_cmd_open.s @@ -6,7 +6,7 @@ ; XXX to be unified with floppy code -unit_rd_cmd_OPEN_EOI: +disk_rd_cmd_OPEN_EOI: ; XXX provide implementation diff --git a/src/dos_m65/unit_ramdisk/unit_rd_cmd_read.s b/src/dos_m65/unit_ramdisk/disk_rd_cmd_read.s similarity index 87% rename from src/dos_m65/unit_ramdisk/unit_rd_cmd_read.s rename to src/dos_m65/unit_ramdisk/disk_rd_cmd_read.s index ffbb3640..cd527078 100644 --- a/src/dos_m65/unit_ramdisk/unit_rd_cmd_read.s +++ b/src/dos_m65/unit_ramdisk/disk_rd_cmd_read.s @@ -6,7 +6,7 @@ ; XXX to be unified with floppy code -unit_rd_cmd_READ: +disk_rd_cmd_READ: ; XXX provide implementation From 0f6466c20f8dd962c75641a5fe342f74ece6c9df Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Wed, 4 Aug 2021 21:53:04 +0200 Subject: [PATCH 32/38] more work towards second floppy and ram disk support --- src/dos_m65/pseudoiec/msg_ciout.s | 2 +- src/dos_m65/unit_disk/disk_fd_cmd_open.s | 126 +++++++++++++++++------ 2 files changed, 98 insertions(+), 30 deletions(-) diff --git a/src/dos_m65/pseudoiec/msg_ciout.s b/src/dos_m65/pseudoiec/msg_ciout.s index 327b60d4..20cd025f 100644 --- a/src/dos_m65/pseudoiec/msg_ciout.s +++ b/src/dos_m65/pseudoiec/msg_ciout.s @@ -104,7 +104,7 @@ msg_CIOUT_cmdfn_RD: ; get next byte of status - ram disk msg_CIOUT_cmdfn_FX: ; common pard for floppy and RAM disk plp - +bcs disk_fd_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: diff --git a/src/dos_m65/unit_disk/disk_fd_cmd_open.s b/src/dos_m65/unit_disk/disk_fd_cmd_open.s index 9c146e64..93605b39 100644 --- a/src/dos_m65/unit_disk/disk_fd_cmd_open.s +++ b/src/dos_m65/unit_disk/disk_fd_cmd_open.s @@ -14,7 +14,7 @@ disk_xx_cmd_OPEN: jmp dos_EXIT_CLC -disk_fd_cmd_OPEN_EOI: +disk_xx_cmd_OPEN_EOI: ; XXX this dispatcher is temporary @@ -32,57 +32,125 @@ disk_fd_cmd_OPEN_EOI: beq @f1 bcs @rd + ; FALLTROUGH + lda F0_CMDFN_BUF - +skip_2_bytes_trash_nvz + cmp #'$' + beq disk_f0_cmd_OPEN_dir + bra disk_f0_cmd_OPEN_file @f1: lda F1_CMDFN_BUF - +skip_2_bytes_trash_nvz + cmp #'$' + beq disk_f1_cmd_OPEN_dir + bra disk_f1_cmd_OPEN_file @rd: lda RD_CMDFN_BUF - cmp #'$' - beq disk_fd_cmd_OPEN_dir ; XXX add support for second floppy and RAM disk + beq disk_rd_cmd_OPEN_dir ; FALLTROUGH -disk_fd_cmd_OPEN_file: - ; XXX add support for second floppy and RAM disk - - ; Copy the filter from command XXX this should be moved to common part and deduplicated with directory opening +disk_rd_cmd_OPEN_file: ; XXX there is a great potential for code deduplication here ldy #$00 @lp1: - lda F0_CMDFN_BUF, y - cmp #$A0 - beq @lp1_end - sta PAR_FPATTERN, y - iny - cpy #$10 + lda RD_CMDFN_BUF, y + jsr disk_xx_cmd_OPEN_file_common bne @lp1 -@lp1_end: - jmp fs_cbm_read_file_open -disk_fd_cmd_OPEN_dir: - - lda #$02 ; mode: read directory - sta F0_MODE - - ; Copy the filter from command XXX this should be moved to common part and deduplicated with file opening +disk_f0_cmd_OPEN_file: ldy #$00 @lp1: - lda F0_CMDFN_BUF+1, y - cmp #$A0 - beq @lp1_end - sta PAR_FPATTERN, y - iny - cpy #$10 + lda F0_CMDFN_BUF, y + jsr disk_xx_cmd_OPEN_file_common + bne @lp1 + + jmp fs_cbm_read_file_open + + +disk_f1_cmd_OPEN_file: + + ldy #$00 +@lp1: + lda F1_CMDFN_BUF, y + jsr disk_xx_cmd_OPEN_file_common + bne @lp1 + + jmp fs_cbm_read_file_open + + +disk_rd_cmd_OPEN_dir: + + lda #$02 + sta RD_MODE + + ; Copy the filter from command + ldy #$00 +@lp1: + lda RD_CMDFN_BUF+1, y + jsr disk_xx_cmd_OPEN_dir_common bne @lp1 @lp1_end: jmp fs_cbm_read_dir_open + + +disk_f0_cmd_OPEN_dir: + + lda #$02 + sta F0_MODE + + ; Copy the filter from command + ldy #$00 +@lp1: + lda F0_CMDFN_BUF+1, y + jsr disk_xx_cmd_OPEN_dir_common + bne @lp1 + + jmp fs_cbm_read_dir_open + + +disk_f1_cmd_OPEN_dir: + + lda #$02 + sta F1_MODE + + ; Copy the filter from command + ldy #$00 +@lp1: + lda F1_CMDFN_BUF+1, y + jsr disk_xx_cmd_OPEN_dir_common + bne @lp1 + + jmp fs_cbm_read_dir_open + + + +disk_xx_cmd_OPEN_file_common: + + ; Common part of filter copy loop + + cmp #$A0 + +beq fs_cbm_read_file_open + sta PAR_FPATTERN, y + iny + cpy #$10 + + rts + + +disk_xx_cmd_OPEN_dir_common: + + cmp #$A0 + +beq fs_cbm_read_dir_open + sta PAR_FPATTERN, y + iny + cpy #$10 + + rts From 02e9badb657923f3370babe7983eb20ec21fd76d Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Wed, 4 Aug 2021 21:57:49 +0200 Subject: [PATCH 33/38] minor cleanup --- .../unit_disk/{disk_fd_cmd_open.s => disk_xx_cmd_open.s} | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) rename src/dos_m65/unit_disk/{disk_fd_cmd_open.s => disk_xx_cmd_open.s} (89%) diff --git a/src/dos_m65/unit_disk/disk_fd_cmd_open.s b/src/dos_m65/unit_disk/disk_xx_cmd_open.s similarity index 89% rename from src/dos_m65/unit_disk/disk_fd_cmd_open.s rename to src/dos_m65/unit_disk/disk_xx_cmd_open.s index 93605b39..eee7ce3e 100644 --- a/src/dos_m65/unit_disk/disk_fd_cmd_open.s +++ b/src/dos_m65/unit_disk/disk_xx_cmd_open.s @@ -16,9 +16,9 @@ disk_xx_cmd_OPEN: disk_xx_cmd_OPEN_EOI: - ; XXX this dispatcher is temporary + ; XXX this dispatcher needs improvements to handle more of the syntax - ; Erase filter pattern XXX this should be moved to common part + ; Erase filter pattern ldy #$0F lda #$A0 @@ -51,8 +51,9 @@ disk_xx_cmd_OPEN_EOI: ; FALLTROUGH -disk_rd_cmd_OPEN_file: ; XXX there is a great potential for code deduplication here +disk_rd_cmd_OPEN_file: + ; Copy the filter from command ldy #$00 @lp1: lda RD_CMDFN_BUF, y @@ -64,6 +65,7 @@ disk_rd_cmd_OPEN_file: ; XXX there is a great potential for code deduplicati disk_f0_cmd_OPEN_file: + ; Copy the filter from command ldy #$00 @lp1: lda F0_CMDFN_BUF, y @@ -75,6 +77,7 @@ disk_f0_cmd_OPEN_file: disk_f1_cmd_OPEN_file: + ; Copy the filter from command ldy #$00 @lp1: lda F1_CMDFN_BUF, y From a12eaff249c2305ace7d47a44d0341680662e33a Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 8 Aug 2021 20:54:29 +0200 Subject: [PATCH 34/38] attempt tro fix https://github.com/MEGA65/open-roms/issues/68 --- bin/mega65.rom | Bin 131072 -> 131072 bytes bin/mega65_orfont.rom | Bin 131072 -> 131072 bytes .../board_m65/mega65_hypervisor_reset.s | 28 +++++++++--------- src/kernal/board_m65/mega65_reset_part.s | 5 ++++ 4 files changed, 19 insertions(+), 14 deletions(-) diff --git a/bin/mega65.rom b/bin/mega65.rom index b5c42ccf4cb64266e996f730a6e41fb3d0469271..e03351a0d0273431fa27800c255376eaccf6f341 100644 GIT binary patch delta 12682 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 delta 11683 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 diff --git a/bin/mega65_orfont.rom b/bin/mega65_orfont.rom index b106ad9afeda7327ddafcbbe6fb806aee7f897c2..48c04f1dc7d51b224fa1ef554819789487f8acf1 100644 GIT binary patch delta 12682 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 diff --git a/src/kernal/board_m65/mega65_hypervisor_reset.s b/src/kernal/board_m65/mega65_hypervisor_reset.s index db451919..6c93d1e6 100644 --- a/src/kernal/board_m65/mega65_hypervisor_reset.s +++ b/src/kernal/board_m65/mega65_hypervisor_reset.s @@ -8,33 +8,33 @@ m65_hypervisor_reset: ; Proceed like with normal reset, skip problematic parts - sei ; disable the interrupts, as fast as possible - cld ; Kernal is not designed to operate in decimal mode + sei ; disable the interrupts, as fast as possible + cld ; Kernal is not designed to operate in decimal mode lda #$00 - sta NMINV+1 ; soft-disable custom NMI interrupt handler + sta NMINV+1 ; soft-disable custom NMI interrupt handler ; Do not reset the stack (see, ldx #$FF, txs) - we need to know where to return - jsr m65_reset_part ; init MEGA65 specific hardware, shutdown VIC-IV, clear native mode mark - ldx #$28 ; 40 columns, screen disabled for now + jsr m65_reset_part ; init MEGA65 specific hardware, shutdown VIC-IV, clear native mode mark + ldx #$28 ; 40 columns, screen disabled for now stx VIC_SCROLX - jsr IOINIT_skip_DOS ; better not to initialize DOS under hypervisor, risk of incompatibility - jsr m65_reset_common ; RAMTAS, RESTOR, CINT + jsr IOINIT_skip_DOS ; better not to initialize DOS under hypervisor, risk of incompatibility + jsr m65_reset_part_skip_palette ; also skip palette setting, but do RAMTAS, RESTOR, CINT ; Restore hypervisor memory mapping and quit - lda #$00 ; lower memory - megabyte $00 - ldx #$0F ; lower memory - request to set the megabyte - ldy #$FF ; higher memory - megabyte $FF - ldz #$0F ; higher memory - request to set the megabyte + lda #$00 ; lower memory - megabyte $00 + ldx #$0F ; lower memory - request to set the megabyte + ldy #$FF ; higher memory - megabyte $FF + ldz #$0F ; higher memory - request to set the megabyte map - tax ; lower memory - keep unmapped (.A is already 0) - tay ; higher memory - lower 16 bits of the offset are also 0's - ldz #$3F ; higher memory - map is %0011 = $3, offset is $FF0 + tax ; lower memory - keep unmapped (.A is already 0) + tay ; higher memory - lower 16 bits of the offset are also 0's + ldz #$3F ; higher memory - map is %0011 = $3, offset is $FF0 map eom diff --git a/src/kernal/board_m65/mega65_reset_part.s b/src/kernal/board_m65/mega65_reset_part.s index abc943a2..875d0578 100644 --- a/src/kernal/board_m65/mega65_reset_part.s +++ b/src/kernal/board_m65/mega65_reset_part.s @@ -8,6 +8,11 @@ m65_reset_part: jsr map_KERNAL_1 jsr (VK1__m65_colorset_reset) + + ; FALLTROUGH + +m65_reset_part_skip_palette: ; for hypervisor reset do not set palette, see https://github.com/MEGA65/open-roms/issues/68 + jsr map_NORMAL ; we want normal memory mapping jsr viciv_shutdown ; by default we do not want the VIC-IV From 1190a3faed09102a8195d4d8416fa6a2811bcfd5 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 12 Aug 2021 20:32:19 +0200 Subject: [PATCH 35/38] started work on block read abstraction --- bin/basic_generic.rom | Bin 8192 -> 8192 bytes bin/basic_generic_crt.rom | Bin 8192 -> 8192 bytes bin/basic_ultimate64.rom | Bin 8192 -> 8192 bytes bin/extrom_generic_crt.crt | Bin 32896 -> 32896 bytes bin/kernal_generic.rom | Bin 8192 -> 8192 bytes bin/kernal_generic_crt.rom | Bin 8192 -> 8192 bytes bin/kernal_ultimate64.rom | Bin 8192 -> 8192 bytes src/dos_m65/pseudoiec/msg_acptr.s | 22 +++++++++--------- ...{disk_fd_cmd_read.s => disk_xx_cmd_read.s} | 17 +++++--------- 9 files changed, 17 insertions(+), 22 deletions(-) rename src/dos_m65/unit_disk/{disk_fd_cmd_read.s => disk_xx_cmd_read.s} (54%) diff --git a/bin/basic_generic.rom b/bin/basic_generic.rom index 30d54dee02bb1b977dd310c439d49cb380184865..95d1bd01dcdcce51bba12096463627a55e432d15 100644 GIT binary patch delta 15 WcmZp0XmHpNBhPGMU@ Date: Mon, 16 Aug 2021 20:05:09 +0200 Subject: [PATCH 36/38] added entry for sector read emulation for RAM disk --- .../filesystem_cbm/fs_cbm_nextdirentry.s | 2 +- .../filesystem_cbm/fs_cbm_nextfileblock.s | 2 +- src/dos_m65/filesystem_cbm/fs_cbm_read_dir.s | 4 +-- src/dos_m65/filesystem_cbm/fs_cbm_read_file.s | 2 +- ...el_helpers_fdc.s => lowlevel_fd_helpers.s} | 30 +++++++++---------- ..._readsector.s => lowlevel_fd_readsector.s} | 28 ++++++++++++----- src/dos_m65/lowlevel/lowlevel_rd_readsector.s | 7 +++++ src/dos_m65/unit_disk/disk_fd_cmd_close.s | 2 +- 8 files changed, 48 insertions(+), 29 deletions(-) rename src/dos_m65/lowlevel/{lowlevel_helpers_fdc.s => lowlevel_fd_helpers.s} (67%) rename src/dos_m65/lowlevel/{lowlevel_readsector.s => lowlevel_fd_readsector.s} (76%) create mode 100644 src/dos_m65/lowlevel/lowlevel_rd_readsector.s diff --git a/src/dos_m65/filesystem_cbm/fs_cbm_nextdirentry.s b/src/dos_m65/filesystem_cbm/fs_cbm_nextdirentry.s index 47d02008..86bf9a26 100644 --- a/src/dos_m65/filesystem_cbm/fs_cbm_nextdirentry.s +++ b/src/dos_m65/filesystem_cbm/fs_cbm_nextdirentry.s @@ -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 diff --git a/src/dos_m65/filesystem_cbm/fs_cbm_nextfileblock.s b/src/dos_m65/filesystem_cbm/fs_cbm_nextfileblock.s index d45afb47..b0e3d79f 100644 --- a/src/dos_m65/filesystem_cbm/fs_cbm_nextfileblock.s +++ b/src/dos_m65/filesystem_cbm/fs_cbm_nextfileblock.s @@ -52,7 +52,7 @@ 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 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 8a726854..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,7 +13,7 @@ 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) @@ -78,7 +78,7 @@ 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 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 36951d18..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,7 +13,7 @@ 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 diff --git a/src/dos_m65/lowlevel/lowlevel_helpers_fdc.s b/src/dos_m65/lowlevel/lowlevel_fd_helpers.s similarity index 67% rename from src/dos_m65/lowlevel/lowlevel_helpers_fdc.s rename to src/dos_m65/lowlevel/lowlevel_fd_helpers.s index 1a5fff65..69af3fb5 100644 --- a/src/dos_m65/lowlevel/lowlevel_helpers_fdc.s +++ b/src/dos_m65/lowlevel/lowlevel_fd_helpers.s @@ -2,23 +2,23 @@ ; Helper routines for low-level disk operations -lowlevel_fdc_ensure_presence_refresh: +lowlevel_fd_ensure_presence_refresh: - jsr lowlevel_fdc_wait_clr_BUSY ; to be extra sure + jsr lowlevel_fd_wait_clr_BUSY ; to be extra sure ; XXX stepping head is definitely needed, but probably still not enough ; lda #%00011000 ; step head 1 track in (XXX: check if it is really in) ; sta FDC_COMMAND ; $D081 - ; jsr lowlevel_fdc_wait_clr_BUSY + ; jsr lowlevel_fd_wait_clr_BUSY ; lda #%00010000 ; step head 1 track out (XXX: check if it is really out) ; sta FDC_COMMAND ; $D081 - ; jsr lowlevel_fdc_wait_clr_BUSY + ; jsr lowlevel_fd_wait_clr_BUSY ; FALLTROUGH -lowlevel_fdc_ensure_presence: +lowlevel_fd_ensure_presence: lda FDC_STATUS_B ; $D083 ; check if disk is inserted and #$08 @@ -30,18 +30,18 @@ lowlevel_fdc_ensure_presence: pla pla - jsr lowlevel_fdc_motor_off ; if disk not present, disable drive motor + jsr lowlevel_fd_motor_off ; if disk not present, disable drive motor ; XXX set error code, invalidate buffers, etc. sec rts -lowlevel_fdc_motor_on: +lowlevel_fd_motor_on: lda FDC_CONTROL and #%00100000 - bne lowlevel_fdc_rts ; if motor already enabled, do nothing + bne lowlevel_fd_rts ; if motor already enabled, do nothing ; XXX find out why it is not disabled at all ; lda #%00100000 ; enable drive motor and LED @@ -56,29 +56,29 @@ lowlevel_fdc_motor_on: ; jsr wait_x_bars ; plx - bra lowlevel_fdc_wait_clr_BUSY + bra lowlevel_fd_wait_clr_BUSY -lowlevel_fdc_motor_off: +lowlevel_fd_motor_off: lda #%00100000 ; disable drive motor and LED trb FDC_CONTROL ; $D080 ; FALLTROUGH -lowlevel_fdc_wait_clr_BUSY: +lowlevel_fd_wait_clr_BUSY: bit FDC_STATUS_A ; $D082 - bmi lowlevel_fdc_wait_clr_BUSY + bmi lowlevel_fd_wait_clr_BUSY rts -lowlevel_fdc_wait_set_RDREQ: +lowlevel_fd_wait_set_RDREQ: bit FDC_STATUS_B ; $D083 - bpl lowlevel_fdc_wait_set_RDREQ + bpl lowlevel_fd_wait_set_RDREQ ; FALLTROUGH -lowlevel_fdc_rts: +lowlevel_fd_rts: rts diff --git a/src/dos_m65/lowlevel/lowlevel_readsector.s b/src/dos_m65/lowlevel/lowlevel_fd_readsector.s similarity index 76% rename from src/dos_m65/lowlevel/lowlevel_readsector.s rename to src/dos_m65/lowlevel/lowlevel_fd_readsector.s index 9af6dd94..d92b4e69 100644 --- a/src/dos_m65/lowlevel/lowlevel_readsector.s +++ b/src/dos_m65/lowlevel/lowlevel_fd_readsector.s @@ -2,17 +2,29 @@ ; Read a sector pair from a block device -; XXX utilize PAR_FSINSTANCE +lowlevel_xx_readsector: + ldx PAR_FSINSTANCE + +beq lowlevel_rd_readsector -lowlevel_readsector: + ; FALLTROUGH - ; Set drive, ensure disk is present +lowlevel_fd_readsector: + + ; Set drive lda #%00001111 ; set drive 0 (internal) and side 0 trb FDC_CONTROL ; $D080 - jsr lowlevel_fdc_ensure_presence_refresh + cpx #$01 + beq @1 + + lda #%00000001 ; if needed, switch to drive 1 (external) + tsb FDC_CONTROL +@1: + ; Ensure disk is present + + jsr lowlevel_fd_ensure_presence_refresh ; Check if buffer contains data from given track ; XXX compare device and unit too @@ -35,8 +47,8 @@ lowlevel_readsector: lowlevel_readsector_force: - jsr lowlevel_fdc_motor_on ; enable drive motor and LED - jsr lowlevel_fdc_ensure_presence + jsr lowlevel_fd_motor_on ; enable drive motor and LED + jsr lowlevel_fd_ensure_presence lda #%10000000 ; select floppy buffer trb SD_BUFCTL ; $D689 @@ -77,8 +89,8 @@ lowlevel_readsector_force: lda #$40 sta FDC_COMMAND ; $D081 - jsr lowlevel_fdc_wait_set_RDREQ ; wait till sector is found - jsr lowlevel_fdc_wait_clr_BUSY ; wait for BUSY flag to clear + jsr lowlevel_fd_wait_set_RDREQ ; wait till sector is found + jsr lowlevel_fd_wait_clr_BUSY ; wait for BUSY flag to clear ; Wait for DRQ and EQ flags to go high 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/unit_disk/disk_fd_cmd_close.s b/src/dos_m65/unit_disk/disk_fd_cmd_close.s index 9f0b1d4a..42505fc8 100644 --- a/src/dos_m65/unit_disk/disk_fd_cmd_close.s +++ b/src/dos_m65/unit_disk/disk_fd_cmd_close.s @@ -8,6 +8,6 @@ disk_fd_cmd_CLOSE: ; XXX provide implementation - jsr lowlevel_fdc_motor_off ; disable drive motor XXX only do this if no channel is opened + jsr lowlevel_fd_motor_off ; disable drive motor XXX only do this if no channel is opened jmp dos_EXIT_SEC From d91f7916c09ff442dd3cbb0805acceb7091bf106 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Mon, 23 Aug 2021 19:20:38 +0200 Subject: [PATCH 37/38] updates to floppy code --- src/dos_m65/lowlevel/lowlevel_fd_helpers.s | 84 ------------------- src/dos_m65/lowlevel/lowlevel_fd_readsector.s | 84 +++++++++++-------- 2 files changed, 51 insertions(+), 117 deletions(-) delete mode 100644 src/dos_m65/lowlevel/lowlevel_fd_helpers.s diff --git a/src/dos_m65/lowlevel/lowlevel_fd_helpers.s b/src/dos_m65/lowlevel/lowlevel_fd_helpers.s deleted file mode 100644 index 69af3fb5..00000000 --- a/src/dos_m65/lowlevel/lowlevel_fd_helpers.s +++ /dev/null @@ -1,84 +0,0 @@ - -; Helper routines for low-level disk operations - - -lowlevel_fd_ensure_presence_refresh: - - jsr lowlevel_fd_wait_clr_BUSY ; to be extra sure - - ; XXX stepping head is definitely needed, but probably still not enough - - ; lda #%00011000 ; step head 1 track in (XXX: check if it is really in) - ; sta FDC_COMMAND ; $D081 - ; jsr lowlevel_fd_wait_clr_BUSY - - ; lda #%00010000 ; step head 1 track out (XXX: check if it is really out) - ; sta FDC_COMMAND ; $D081 - ; jsr lowlevel_fd_wait_clr_BUSY - - ; FALLTROUGH - -lowlevel_fd_ensure_presence: - - lda FDC_STATUS_B ; $D083 ; check if disk is inserted - and #$08 - beq @not_present - rts - -@not_present: - - pla - pla - - jsr lowlevel_fd_motor_off ; if disk not present, disable drive motor - - ; XXX set error code, invalidate buffers, etc. - - sec - rts - -lowlevel_fd_motor_on: - - lda FDC_CONTROL - and #%00100000 - bne lowlevel_fd_rts ; if motor already enabled, do nothing - - ; XXX find out why it is not disabled at all - ; lda #%00100000 ; enable drive motor and LED - ; tsb FDC_CONTROL ; $D080 - - ; Allow some time for spin-up; according to https://wiki.osdev.org/Floppy_Disk_Controller - ; 300 ms should be more than enough - - ; XXX reenable this - ; phx - ; ldx #$0F - ; jsr wait_x_bars - ; plx - - bra lowlevel_fd_wait_clr_BUSY - -lowlevel_fd_motor_off: - - lda #%00100000 ; disable drive motor and LED - trb FDC_CONTROL ; $D080 - - ; FALLTROUGH - -lowlevel_fd_wait_clr_BUSY: - - bit FDC_STATUS_A ; $D082 - bmi lowlevel_fd_wait_clr_BUSY - - rts - -lowlevel_fd_wait_set_RDREQ: - - bit FDC_STATUS_B ; $D083 - bpl lowlevel_fd_wait_set_RDREQ - - ; FALLTROUGH - -lowlevel_fd_rts: - - rts diff --git a/src/dos_m65/lowlevel/lowlevel_fd_readsector.s b/src/dos_m65/lowlevel/lowlevel_fd_readsector.s index d92b4e69..af2184ca 100644 --- a/src/dos_m65/lowlevel/lowlevel_fd_readsector.s +++ b/src/dos_m65/lowlevel/lowlevel_fd_readsector.s @@ -1,5 +1,6 @@ -; 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_xx_readsector: @@ -11,48 +12,46 @@ lowlevel_xx_readsector: lowlevel_fd_readsector: - ; Set drive - - lda #%00001111 ; set drive 0 (internal) and side 0 - trb FDC_CONTROL ; $D080 - - cpx #$01 - beq @1 - - lda #%00000001 ; if needed, switch to drive 1 (external) - tsb FDC_CONTROL -@1: - ; Ensure disk is present - - jsr lowlevel_fd_ensure_presence_refresh - - ; Check if buffer contains data from given track - ; XXX compare device and unit too + ; 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: - jsr lowlevel_fd_motor_on ; enable drive motor and LED - jsr lowlevel_fd_ensure_presence + ; 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 + ; 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 lda PAR_TRACK @@ -84,21 +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 - jsr lowlevel_fd_wait_set_RDREQ ; wait till sector is found - jsr lowlevel_fd_wait_clr_BUSY ; wait for BUSY flag to clear + ; Wait for busy flag to assert XXX how much? 1 second? most likelly too much... - ; Wait for DRQ and EQ flags to go high + ldy #71 +@3: + ldx #$00 + jsr wait_x_bars + dey + bne @3 -@lp1: + ; Wait until BUSY flag clears + +@4: lda FDC_STATUS_A ; $D082 - and #%01100000 - cmp #%01000000 ; XXX is this correct? .A seems to stay at $40 at this point - bne @lp1 + bmi @4 ; Copy sector to buffer in RAM @@ -125,3 +133,13 @@ lowlevel_readsector_force: clc rts + + + +lowlevel_fd_motor_off: + + ; XXX set correct drive + + lda #$00 + sta FDC_CONTROL ; $D080 + rts From 5192c683a098204e835b8c5529ecd24c808eba92 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Mon, 23 Aug 2021 19:31:29 +0200 Subject: [PATCH 38/38] explained all similarities, prepared for the release --- bin/basic_generic.rom | Bin 8192 -> 8192 bytes bin/basic_generic_crt.rom | Bin 8192 -> 8192 bytes bin/basic_ultimate64.rom | Bin 8192 -> 8192 bytes bin/extrom_generic_crt.crt | Bin 32896 -> 32896 bytes bin/kernal_generic.rom | Bin 8192 -> 8192 bytes bin/kernal_generic_crt.rom | Bin 8192 -> 8192 bytes bin/kernal_ultimate64.rom | Bin 8192 -> 8192 bytes bin/mega65.rom | Bin 131072 -> 131072 bytes bin/mega65_orfont.rom | Bin 131072 -> 131072 bytes src/,,config_mega65.s | 6 +++--- strings/A5C385C1A5C485C220 | 3 +++ 11 files changed, 6 insertions(+), 3 deletions(-) create mode 100644 strings/A5C385C1A5C485C220 diff --git a/bin/basic_generic.rom b/bin/basic_generic.rom index 95d1bd01dcdcce51bba12096463627a55e432d15..1ddfbd8252f29a02b59575c6700ffcdf4c398f56 100644 GIT binary patch delta 14 VcmZp0XmHpNE6-$PJUL!|Apj(-1jYaW delta 14 VcmZp0XmHpNE6-$LF*#m-Apj(~1jzsZ diff --git a/bin/basic_generic_crt.rom b/bin/basic_generic_crt.rom index 1e6104fde6567c48f0be75ee9ab0c080f0ea02f2..3549c683c7b34befe4238f77a2e81824ef8e1fc8 100644 GIT binary patch delta 14 VcmZp0XmHpNE6-$PJUL!|Apj(-1jYaW delta 14 VcmZp0XmHpNE6-$LF*#m-Apj(~1jzsZ diff --git a/bin/basic_ultimate64.rom b/bin/basic_ultimate64.rom index a37fb32792ca80c6aedd580ecc6d77028e95bd41..4aefc34a9ef5a20d62110170486a3815dc011e73 100644 GIT binary patch delta 14 VcmZp0XmHpNE6-$PJUL!|Apj(-1jYaW delta 14 VcmZp0XmHpNE6-$LF*#m-Apj(~1jzsZ diff --git a/bin/extrom_generic_crt.crt b/bin/extrom_generic_crt.crt index de6c55793c92ec9f1c2736cffa50e79ce9e3e305..4780c72a71bfb5649a0ed498fc9de3a640c80f9a 100644 GIT binary patch delta 17 YcmZo@WNK(++TgChWMsVAQ^7m|05VGjH~;_u delta 17 YcmZo@WNK(++TgChWMHw`Q^7m|05V$zI{*Lx diff --git a/bin/kernal_generic.rom b/bin/kernal_generic.rom index dfefccd4a0867e7454af9764e6495cd73eaad638..2819eeacd27ad2d23707ad91d85088e181eeb997 100644 GIT binary patch delta 15 WcmZp0XmHqYgoVk-c=It9D`@~Ny#+D= delta 15 WcmZp0XmHqYgoVk#V)HQ;D`@~N%>^|8 diff --git a/bin/kernal_generic_crt.rom b/bin/kernal_generic_crt.rom index 74035f8d9f75bac7f56e845b12cc8eb1f16b067a..f976ce2d2b7603d0a7544b5ccec318a0ca6ce678 100644 GIT binary patch delta 15 WcmZp0XmHqYgoVk-c=It9D`@~Ny#+D= delta 15 WcmZp0XmHqYgoVk#V)HQ;D`@~N%>^|8 diff --git a/bin/kernal_ultimate64.rom b/bin/kernal_ultimate64.rom index 50e7685e5a54c596e4fe5b7bac5655bc43e8279a..ef234000861a3d042cecc96c66b7d82f11d00bf9 100644 GIT binary patch delta 15 WcmZp0XmHqYgoVk-c=It9D`@~Ny#+D= delta 15 WcmZp0XmHqYgoVk#V)HQ;D`@~N%>^|8 diff --git a/bin/mega65.rom b/bin/mega65.rom index e03351a0d0273431fa27800c255376eaccf6f341..a089f01f30dd61e4317865fbc3b33749f0cef1c5 100644 GIT binary patch delta 1786 zcmY*a4NMbv6u-MtDMCwusRb1Negzu&XaOr)*!YYy*6GxYCDVwIIX~!8fl?}UJp71T z=5@G#mS~g>x;Z`EwOiP-EToal%vm#*BiURq+hFP(b8eP2n~ERoT@~Z*F7NLD-v535 z-h2N8&;V#k$S`kA^e2N!)!hKL>-^dRv#GeCu)stfU8|jb`#<(6esd$|NcR|;FE-{j zzSGE*E#VWIUfyAK18;Nk z^m1N)?BiglK7V${RbFIrL^em{azqtcN3GL{j2=u$-f}>2jvB+Ea5y$J7S^Frk?D4T zKM6cRyF$OVKgle_gcCz-I4Q)1lS8U-3PRycP~z}v0q%Hp01o zc4Kfp#!L5`YzthiqDF9om@O~|P|O}611e)iHDbEUqG_twGTdN``B138xLpnYcJ><->g zi}Co|fYkG176vWG*lyB4%nLbJE7cVouiDK2KPiz2bxM-;ATAR&fanr70>)DjZGdRP zXs@3zN~*UA-{xb;2lTIkjEyx+m{2?7>BL|7Q;nfh~n)36>bFd1-S^b3=0{JyU3Bchc0NZOOeYvgW%u zKu7`OJ@^CZrALZpvqSWB(OkNI>0Ya=RZ0aT8|I>@+rDWjt`*eaodJhq;e-YdJFmT) zfs6XvV!Du^&6vkAxk`nr!B|~4*Dj9$%OT`DN zq~BU9@^FkI2jWmL)5v0*k%09k~&Z(fr2$)LVW-o2+ly%yl^Oh#u>CrwaY$d zuhVnO3SW7tO}=9raA3nQedMXdndt@g)2?VgNu*BMYiLK#jwq+^DbCI)=gc%G)DziC zUo6hAG`qX1L_%R}YbW)LfDk_lvztMJn&(&}=Q4&%pxvb_vk|BWsA3pOy@il$viTzZX=- z_@f8e!uflnYJAA^y=T;O!}F|Xmq+jfJfqHW=Y(_8*>5Z@+Q$_X_HQ}+>SBEFKY#6u K^VirF>Hh&e^8$AO delta 1895 zcmY*a3rtg27{0fqvsxadEVByYQE}3RM++iVVL=h2TLpu2)6HxZhQUWKXrWN;#xJnA zId8{uvSo|1K_hNQcj*jEjN3X{LX2I&T;n5wY#A{wVaC8UM8!vR|EbgHy*KBc|G($| z{?~WT1uy~_i^zy%OX{_NUEjG2ToY17p2P06JM--1@pZK^=(*uB)@`dZ)msAdycg@1 z)E%x9N-R>GbaKU_?6poeTJh(GRJw9i#Rd}P(-|P_7x2%2aY`vypGrXW zp9xMkhcd87u3HkqDJBR#3Yx$*#U=JgHiMkZlR-(gfSiJJT9R|fu~u?bO60txw5c|u zCc0~DFQLL!i^c#~#nq?4yE~6cx4Ps7|v)^;!yI1mk(Q z!32P*U?RX|FbRm_acP(V9n8%%TVO^k3yB$GDWfv?W%Ln~Fg`sKcwG@W8IdiBoPx+N zGQo9=&a+#KrzB>PORij(n}G?k735h!d_IyckwSl8lc*4|or$)pH_4hk>J9RWL`o&5 zmurE1x!a{tpM8DFKm#+%eqfoh(2k$Pc2e2cXL|U&C4Sfr%0563N`O0Ynf5Rdaj^a` zI5IL;)iWJRUBYRRMY}ZP*A6(>Z&q)*zTdNEBor4B;4g`mJ4($PrC=2ts)nx;sz9Aa zR?}{W?WHY})s3aoQr5gk&YXl46CS#;_W%%mUlP zp#x!6hXM6V^ zSxILW{)E*UEX;prU9&pn8mLFs2*=4Y!igsWl4@s+R0`S5*Cy>l&Gwk)_%oUvG0ll5 znrPRgm%i=HEzR_Il&Kaa6^66@9m`dtG8=~T{2dOfk`De1znl)rT=38L%X7hr-|pu5 z<=KGC?`HeuR8Z33ZYCXcwu!}b{nDoNtxc*qBASP*np9&%XCAI@(oE;@>fh8c>MErF zEUj!wmqL%mBCS|1vwEk?jI47>NJRRbKq@5KE#L{(0&*EB(?Qb{!#-uk<2P3R|CV9H z6ae0_(ir8r0hp8)7%BrTbNpC%yafp}LN-dHf?C!uXmk5@YB9EVyeB+v>IvT)8&j_$ zdp6SFm(8kJ&CksJoMvTwFoF9X6J59WG94fEsBk^lizC5>d=0L3TN!w8Rt9c760F<| zJ2%h}nj1-^w&h!Da4JNE_D-RD47v9F(ZNsV%EliT@@;pU3^#}DAv!cna+(nwOv&$>k>siONMJ{#gzErKs33#s6W5 zf@#GL%LVg3h}lcgz@@<7f$M>SKvm$gz^?(Huf_MV?{i(VU diff --git a/bin/mega65_orfont.rom b/bin/mega65_orfont.rom index 48c04f1dc7d51b224fa1ef554819789487f8acf1..d516675ed1d256b5e97a4d4bcbaeba1cd867cc2f 100644 GIT binary patch delta 1786 zcmY*a4NMbv6u-MtDMCwusRb1Negzu&XaOr)*!YYy*6GxYCDVwIIX~!8fl?}UJp71T z=5@G#mS~g>x;Z`EwOiP-EToal%vm#*BiURq+hFP(b8eP2n~ERoT@~Z*F7NLD-v535 z-h2N8&;V#k$S`kA^e2N!)!hKL>-^dRv#GeCu)stfU8|jb`#<(6esd$|NcR|;FE-{j zzSGE*E#VWIUfyAK18;Nk z^m1N)?BiglK7V${RbFIrL^em{azqtcN3GL{j2=u$-f}>2jvB+Ea5y$J7S^Frk?D4T zKM6cRyF$OVKgle_gcCz-I4Q)1lS8U-3PRycP~z}v0q%Hp01o zc4Kfp#!L5`YzthiqDF9om@O~|P|O}611e)iHDbEUqG_twGTdN``B138xLpnYcJ><->g zi}Co|fYkG176vWG*lyB4%nLbJE7cVouiDK2KPiz2bxM-;ATAR&fanr70>)DjZGdRP zXs@3zN~*UA-{xb;2lTIkjEyx+m{2?7>BL|7Q;nfh~n)36>bFd1-S^b3=0{JyU3Bchc0NZOOeYvgW%u zKu7`OJ@^CZrALZpvqSWB(OkNI>0Ya=RZ0aT8|I>@+rDWjt`*eaodJhq;e-YdJFmT) zfs6XvV!Du^&6vkAxk`nr!B|~4*Dj9$%OT`DN zq~BU9@^FkI2jWmL)5v0*k%09k~&Z(fr2$)LVW-o2+ly%yl^Oh#u>CrwaY$d zuhVnO3SW7tO}=9raA3nQedMXdndt@g)2?VgNu*BMYiLK#jwq+^DbCI)=gc%G)DziC zUo6hAG`qX1L_%R}YbW)LfDk_lvztMJn&(&}=Q4&%pxvb_vk|BWsA3pOy@il$viTzZX=- z_@f8e!uflnYJAA^y=T;O!}F|Xmq+jfJfqHW=Y(_8*>5Z@+Q$_X_HQ}+>SBEFKY#6u K^VirF>Hh&e^8$AO delta 1895 zcmY*a3rtg27{0fqvsxadEVByYQE}3RM++iVVL=h2TLpu2)6HxZhQUWKXrWN;#xJnA zId8{uvSo|1K_hNQcj*jEjN3X{LX2I&T;n5wY#A{wVaC8UM8!vR|EbgHy*KBc|G($| z{?~WT1uy~_i^zy%OX{_NUEjG2ToY17p2P06JM--1@pZK^=(*uB)@`dZ)msAdycg@1 z)E%x9N-R>GbaKU_?6poeTJh(GRJw9i#Rd}P(-|P_7x2%2aY`vypGrXW zp9xMkhcd87u3HkqDJBR#3Yx$*#U=JgHiMkZlR-(gfSiJJT9R|fu~u?bO60txw5c|u zCc0~DFQLL!i^c#~#nq?4yE~6cx4Ps7|v)^;!yI1mk(Q z!32P*U?RX|FbRm_acP(V9n8%%TVO^k3yB$GDWfv?W%Ln~Fg`sKcwG@W8IdiBoPx+N zGQo9=&a+#KrzB>PORij(n}G?k735h!d_IyckwSl8lc*4|or$)pH_4hk>J9RWL`o&5 zmurE1x!a{tpM8DFKm#+%eqfoh(2k$Pc2e2cXL|U&C4Sfr%0563N`O0Ynf5Rdaj^a` zI5IL;)iWJRUBYRRMY}ZP*A6(>Z&q)*zTdNEBor4B;4g`mJ4($PrC=2ts)nx;sz9Aa zR?}{W?WHY})s3aoQr5gk&YXl46CS#;_W%%mUlP zp#x!6hXM6V^ zSxILW{)E*UEX;prU9&pn8mLFs2*=4Y!igsWl4@s+R0`S5*Cy>l&Gwk)_%oUvG0ll5 znrPRgm%i=HEzR_Il&Kaa6^66@9m`dtG8=~T{2dOfk`De1znl)rT=38L%X7hr-|pu5 z<=KGC?`HeuR8Z33ZYCXcwu!}b{nDoNtxc*qBASP*np9&%XCAI@(oE;@>fh8c>MErF zEUj!wmqL%mBCS|1vwEk?jI47>NJRRbKq@5KE#L{(0&*EB(?Qb{!#-uk<2P3R|CV9H z6ae0_(ir8r0hp8)7%BrTbNpC%yafp}LN-dHf?C!uXmk5@YB9EVyeB+v>IvT)8&j_$ zdp6SFm(8kJ&CksJoMvTwFoF9X6J59WG94fEsBk^lizC5>d=0L3TN!w8Rt9c760F<| zJ2%h}nj1-^w&h!Da4JNE_D-RD47v9F(ZNsV%EliT@@;pU3^#}DAv!cna+(nwOv&$>k>siONMJ{#gzErKs33#s6W5 zf@#GL%LVg3h}lcgz@@<7f$M>SKvm$gz^?(Huf_MV?{i(VU diff --git a/src/,,config_mega65.s b/src/,,config_mega65.s index d1d19ebc..07bdd2ca 100644 --- a/src/,,config_mega65.s +++ b/src/,,config_mega65.s @@ -91,9 +91,9 @@ ; --- Built-in DOS configuration ;; #CONFIG# UNIT_SDCARD 27 -;; #CONFIG# UNIT_FLOPPY0 28 -;; #CONFIG# UNIT_FLOPPY1 29 -;; #CONFIG# UNIT_RAMDISK 30 +;; #CONFIG# UNIT_FLOPPY0 0 +;; #CONFIG# UNIT_FLOPPY1 0 +;; #CONFIG# UNIT_RAMDISK 0 ; --- Debug options diff --git a/strings/A5C385C1A5C485C220 b/strings/A5C385C1A5C485C220 new file mode 100644 index 00000000..25e5de60 --- /dev/null +++ b/strings/A5C385C1A5C485C220 @@ -0,0 +1,3 @@ +LDA $C3 + STA $C1 + LDA $C$ + STA $C2 + JSR (address not imnculded in similarity) + +Copy 16-bit value from one well-known zero page location to another + jump to subroutine. Trivial - not copyrightable.