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 } };