From ec2b32f57702d5449485a275bcffb61ff0e8f5c7 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Mon, 19 Oct 2020 19:31:33 +0200 Subject: [PATCH] initial support for cartridge-extended ROMs --- Makefile | 70 ++++++++++++--- src/,,config_cx16.s | 2 +- src/,,config_generic_crt.s | 132 ++++++++++++++++++++++++++++ src/aliases/,aliases_config.s | 8 ++ src/kernal/iec_fast/jiffydos_load.s | 10 +++ 5 files changed, 211 insertions(+), 11 deletions(-) create mode 100644 src/,,config_generic_crt.s diff --git a/Makefile b/Makefile index 79ca47a1..ed1ff185 100644 --- a/Makefile +++ b/Makefile @@ -83,6 +83,7 @@ GEN_KERNAL = DIR_CUS = build/target_custom DIR_GEN = build/target_generic +DIR_CRT = build/target_generic_crt DIR_TST = build/target_testing DIR_M65 = build/target_mega65 DIR_U64 = build/target_ultimate64 @@ -92,6 +93,7 @@ DIR_X16 = build/target_cx16 CFG_CUS = src/,,config_custom.s CFG_GEN = src/,,config_generic.s +CFG_CRT = src/,,config_generic_crt.s CFG_TST = src/,,config_testing.s CFG_M65 = src/,,config_mega65.s CFG_U64 = src/,,config_ultimate64.s @@ -101,6 +103,7 @@ CFG_X16 = src/,,config_cx16.s GEN_STR_CUS = $(DIR_CUS)/,generated/,packed_strings.s GEN_STR_GEN = $(DIR_GEN)/,generated/,packed_strings.s +GEN_STR_CRT = $(DIR_CRT)/,generated/,packed_strings.s GEN_STR_TST = $(DIR_TST)/,generated/,packed_strings.s GEN_STR_M65 = $(DIR_M65)/,generated/,packed_strings.s GEN_STR_U64 = $(DIR_U64)/,generated/,packed_strings.s @@ -136,11 +139,13 @@ TOOLS_LIST = $(TOOL_GENERATE_CONSTANTS) \ TARGET_CUS_B = build/basic_custom.rom TARGET_GEN_B = build/basic_generic.rom +TARGET_CRT_B = build/basic_generic_crt.rom TARGET_TST_B = build/basic_testing.rom TARGET_U64_B = build/basic_ultimate64.rom TARGET_CUS_K = build/kernal_custom.rom TARGET_GEN_K = build/kernal_generic.rom +TARGET_CRT_K = build/kernal_generic_crt.rom TARGET_TST_K = build/kernal_testing.rom TARGET_U64_K = build/kernal_ultimate64.rom @@ -150,6 +155,7 @@ TARGET_X16_x = build/cx16-dummy.rom TARGET_LIST_CUS = $(TARGET_CUS_B) $(TARGET_CUS_K) TARGET_LIST_GEN = $(TARGET_GEN_B) $(TARGET_GEN_K) +TARGET_LIST_CRT = $(TARGET_CRT_B) $(TARGET_CRT_K) TARGET_LIST_TST = $(TARGET_TST_B) $(TARGET_TST_K) TARGET_LIST_U64 = $(TARGET_U64_B) $(TARGET_U64_K) @@ -162,6 +168,9 @@ TARGET_LIST = build/chargen_openroms.rom \ $(TARGET_LIST_U64) \ $(TARGET_X16_x) +SEG_LIST_CRT = $(DIR_X16)/basic.seg_0 \ + $(DIR_X16)/kernal.seg_0 + SEG_LIST_M65 = $(DIR_M65)/basic.seg_0 \ $(DIR_M65)/basic.seg_1 \ $(DIR_M65)/dos.seg_1 \ @@ -281,6 +290,11 @@ $(DIR_TST)/OUTK_x.BIN $(DIR_TST)/KERNAL_combined.vs $(DIR_TST)/KERNAL_combined.s $(DIR_U64)/OUTK_x.BIN $(DIR_U64)/KERNAL_combined.vs $(DIR_U64)/KERNAL_combined.sym: \ $(TOOL_ASSEMBLER) $(TOOL_BUILD_SEGMENT) $(DEP_KERNAL) $(CFG_U64) $(GEN_STR_U64) +$(DIR_CRT)/OUTB_0.BIN $(DIR_CRT)/BASIC_combined.vs: \ + $(TOOL_ASSEMBLER) $(TOOL_BUILD_SEGMENT) $(DEP_BASIC) $(CFG_CRT) $(CRT_STR_GEN) $(DIR_CRT)/KERNAL_combined.sym +$(DIR_CRT)/OUTK_0.BIN $(DIR_CRT)/KERNAL_combined.vs $(DIR_CRT)/KERNAL_combined.sym: \ + $(TOOL_ASSEMBLER) $(TOOL_BUILD_SEGMENT) $(DEP_KERNAL) $(CFG_CRT) $(GEN_STR_CRT) + $(DIR_M65)/OUTB_0.BIN $(DIR_M65)/BASIC_0_combined.vs $(DIR_M65)/BASIC_0_combined.sym: \ $(TOOL_ASSEMBLER) $(TOOL_BUILD_SEGMENT) $(DEP_BASIC) $(CFG_M65) $(GEN_STR_M65) $(DIR_M65)/KERNAL_0_combined.sym $(DIR_M65)/OUTK_0.BIN $(DIR_M65)/KERNAL_0_combined.vs $(DIR_M65)/KERNAL_0_combined.sym: \ @@ -305,6 +319,7 @@ $(DIR_X16)/kernal.seg_1 $(DIR_X16)/KERNAL_1_combined.vs $(DIR_X16)/KERNAL_1_comb $(DIR_CUS)/OUTx_x.BIN: $(DIR_CUS)/OUTB_x.BIN $(DIR_CUS)/OUTK_x.BIN $(DIR_GEN)/OUTx_x.BIN: $(DIR_GEN)/OUTB_x.BIN $(DIR_GEN)/OUTK_x.BIN +$(DIR_CRT)/OUTx_0.BIN: $(DIR_CRT)/OUTB_0.BIN $(DIR_CRT)/OUTK_0.BIN $(DIR_TST)/OUTx_x.BIN: $(DIR_TST)/OUTB_x.BIN $(DIR_TST)/OUTK_x.BIN $(DIR_M65)/OUTx_0.BIN: $(DIR_M65)/OUTB_0.BIN $(DIR_M65)/OUTK_0.BIN $(DIR_U64)/OUTx_x.BIN: $(DIR_U64)/OUTB_x.BIN $(DIR_U64)/OUTK_x.BIN @@ -335,6 +350,10 @@ $(GEN_STR_GEN): $(TOOL_GENERATE_STRINGS) $(CFG_GEN) @mkdir -p $(DIR_GEN)/,generated $(TOOL_GENERATE_STRINGS) -o $@ -c $(CFG_GEN) +$(GEN_STR_CRT): $(TOOL_GENERATE_STRINGS) $(CFG_CRT) + @mkdir -p $(DIR_CRT)/,generated + $(TOOL_GENERATE_STRINGS) -o $@ -c $(CFG_CRT) + $(GEN_STR_TST): $(TOOL_GENERATE_STRINGS) $(CFG_TST) @mkdir -p $(DIR_TST)/,generated $(TOOL_GENERATE_STRINGS) -o $@ -c $(CFG_TST) @@ -355,12 +374,13 @@ build/,generated/,float_constants.s: $(TOOL_GENERATE_CONSTANTS) @mkdir -p build/,generated $(TOOL_GENERATE_CONSTANTS) -o build/,generated/,float_constants.s -GEN_STR_custom = $(GEN_STR_CUS) -GEN_STR_generic = $(GEN_STR_GEN) -GEN_STR_testing = $(GEN_STR_TST) -GEN_STR_mega65 = $(GEN_STR_M65) -GEN_STR_ultimate64 = $(GEN_STR_U64) -GEN_STR_cx16 = $(GEN_STR_X16) +GEN_STR_custom = $(GEN_STR_CUS) +GEN_STR_generic = $(GEN_STR_GEN) +GEN_STR_generic_crt = $(GEN_STR_CRT) +GEN_STR_testing = $(GEN_STR_TST) +GEN_STR_mega65 = $(GEN_STR_M65) +GEN_STR_ultimate64 = $(GEN_STR_U64) +GEN_STR_cx16 = $(GEN_STR_X16) .PRECIOUS: build/target_%/OUTB_x.BIN build/target_%/BASIC_combined.vs build/target_%/OUTB_x.BIN build/target_%/BASIC_combined.vs: @@ -374,6 +394,18 @@ build/target_%/OUTK_x.BIN build/target_%/KERNAL_combined.vs build/target_%/KERNA @rm -f $@* build/target_$*/KERNAL* @$(TOOL_BUILD_SEGMENT) -a ../../$(TOOL_ASSEMBLER) -r STD -s KERNAL -i KERNAL-$* -o OUTK_x.BIN -d build/target_$* -l e4d3 -h ffff src/,,config_$*.s $(SRCDIR_KERNAL) $(GEN_KERNAL) $(GEN_STR_$*) +# Rules - BASIC and KERNAL intermediate files, for ROM with external cartridge + +$(DIR_CRT)/OUTB_0.BIN $(DIR_CRT)/BASIC_0_combined.vs $(DIR_CRT)/BASIC_0_combined.sym: + @mkdir -p $(DIR_CRT) + @rm -f $@* $(DIR_CRT)/BASIC_0* + @$(TOOL_BUILD_SEGMENT) -a ../../$(TOOL_ASSEMBLER) -r CRT -s BASIC_0 -i BASIC_0-generic-crt -o OUTB_0.BIN -d $(DIR_CRT) -l a000 -h e4d2 $(CFG_CRT) $(GEN_STR_CRT) $(SRCDIR_BASIC) $(GEN_BASIC) + +$(DIR_CRT)/OUTK_0.BIN $(DIR_CRT)/KERNAL_0_combined.vs $(DIR_CRT)/KERNAL_0_combined.sym: + @mkdir -p $(DIR_CRT) + @rm -f $@* $(DIR_CRT)/KERNAL_0* + @$(TOOL_BUILD_SEGMENT) -a ../../$(TOOL_ASSEMBLER) -r CRT -s KERNAL_0 -i KERNAL_0-generic-crt -o OUTK_0.BIN -d $(DIR_CRT) -l e4d3 -h ffff $(CFG_CRT) $(GEN_STR_CRT) $(SRCDIR_KERNAL) $(GEN_KERNAL) + # Rules - BASIC and KERNAL intermediate files, for MEGA65 $(DIR_M65)/OUTB_0.BIN $(DIR_M65)/BASIC_0_combined.vs $(DIR_M65)/BASIC_0_combined.sym: @@ -441,6 +473,15 @@ build/basic_%.rom: build/symbols_%.vs: @sort build/target_$*/BASIC_combined.vs build/target_$*/KERNAL_combined.vs | uniq | grep -v "__" > $@ +$(DIR_CRT)/OUTx_0.BIN: + @cat $(DIR_CRT)/OUTB_0.BIN $(DIR_CRT)/OUTK_0.BIN > $@ + +$(DIR_CRT)/kernal.seg_0: $(DIR_CRT)/OUTx_0.BIN + @dd if=$(DIR_CRT)/OUTx_0.BIN bs=8192 count=1 skip=2 of=$@ status=none + +$(DIR_CRT)/basic.seg_0: $(DIR_CRT)/OUTx_0.BIN + @dd if=$(DIR_CRT)/OUTx_0.BIN bs=8192 count=1 skip=0 of=$@ status=none + $(DIR_M65)/OUTx_0.BIN: @cat $(DIR_M65)/OUTB_0.BIN $(DIR_M65)/OUTK_0.BIN > $@ @@ -459,6 +500,12 @@ $(DIR_X16)/kernal.seg_0: $(DIR_X16)/OUTx_0.BIN $(DIR_X16)/basic.seg_0: $(DIR_X16)/OUTx_0.BIN @dd if=$(DIR_X16)/OUTx_0.BIN bs=8192 count=1 skip=0 of=$@ status=none +build/kernal_generic_crt.rom: $(DIR_CRT)/OUTx_0.BIN + @dd if=$(DIR_CRT)/OUTx_0.BIN bs=8192 count=1 skip=2 of=$@ status=none + +build/basic_generic_crt.rom: $(DIR_CRT)/OUTx_0.BIN + @dd if=$(DIR_CRT)/OUTx_0.BIN bs=8192 count=1 skip=0 of=$@ status=none + build/kernal_hybrid.rom: kernal $(DIR_GEN)/OUTK_x.BIN @echo @echo $(HYBRID_WARNING) @@ -538,12 +585,12 @@ $(TARGET_X16_x): $(SEG_LIST_X16) build/chargen_openroms.rom # Rules - tests -.PHONY: test test_generic test_generic_x128 test_hybrid test_testing \ - test_mega65 test_mega65_xemu test_m65 \ - test_ultimate64 \ +.PHONY: test test_crt test_generic test_generic_x128 test_generic_crt test_hybrid test_testing \ + test_mega65 test_mega65_xemu test_m65 test_ultimate64 \ testremote testsimilarity -test: test_custom +test: test_custom +test_crt: test_generic_crt test_custom: build/kernal_custom.rom build/basic_custom.rom build/symbols_custom.vs x64 -kernal build/kernal_custom.rom -basic build/basic_custom.rom -moncommands build/symbols_custom.vs -1 $(TESTTAPE) -8 $(TESTDISK) @@ -554,6 +601,9 @@ test_generic: build/kernal_generic.rom build/basic_generic.rom build/symbols_gen test_generic_x128: build/kernal_generic.rom build/basic_generic.rom build/symbols_generic.vs x128 -go64 -kernal64 build/kernal_generic.rom -basic64 build/basic_generic.rom -moncommands build/symbols_generic.vs -1 $(TESTTAPE) -8 $(TESTDISK) +test_generic_crt: build/kernal_generic_crt.rom build/basic_generic_crt.rom build/symbols_generic_crt.vs + x64 -kernal build/kernal_generic_crt.rom -basic build/basic_generic_crt.rom -moncommands build/symbols_generic_crt.vs -1 $(TESTTAPE) -8 $(TESTDISK) + test_testing: build/kernal_testing.rom build/basic_testing.rom build/symbols_testing.vs x64 -kernal build/kernal_testing.rom -basic build/basic_testing.rom -moncommands build/symbols_testing.vs -1 $(TESTTAPE) -8 $(TESTDISK) diff --git a/src/,,config_cx16.s b/src/,,config_cx16.s index 89e55b4a..b1f3b2c8 100644 --- a/src/,,config_cx16.s +++ b/src/,,config_cx16.s @@ -1,5 +1,5 @@ -;; #CONFIG# ID $04 ; should be 1 byte, different for each config file! +;; #CONFIG# ID $E0 ; should be 1 byte, different for each config file! ; ; Please read CONFIG.md before modifying this file! diff --git a/src/,,config_generic_crt.s b/src/,,config_generic_crt.s new file mode 100644 index 00000000..b673a23f --- /dev/null +++ b/src/,,config_generic_crt.s @@ -0,0 +1,132 @@ + +;; #CONFIG# ID $02 ; should be 1 byte, different for each config file! + +; +; Please read CONFIG.md before modifying this file! +; + +; Idea: +; - sane defaults for the Commodore 64/128 emulators +; - use RetroRelplay cartridge image as a ROM extension +; - do not enable features which are a significant compatibility risk + + + +; --- Hardware platform and brand + +;; #CONFIG# PLATFORM_COMMODORE_64 YES +;; #CONFIG# BRAND_GENERIC_CRT YES + + +; --- Processor instruction set + +;; #CONFIG# CPU_MOS_6502 YES +;; #CONFIG# CPU_DTV_6502 NO +;; #CONFIG# CPU_RCW_65C02 NO +;; #CONFIG# CPU_WDC_65C02 NO +;; #CONFIG# CPU_WDC_65816 NO +;; #CONFIG# CPU_CSG_65CE02 NO + + +; --- Memory model + +;; #CONFIG# MEMORY_MODEL_38K NO +;; #CONFIG# MEMORY_MODEL_46K NO +;; #CONFIG# MEMORY_MODEL_50K YES +;; #CONFIG# MEMORY_MODEL_60K NO + + +; --- IEC bus configuration + +;; #CONFIG# IEC YES +;; #CONFIG# IEC_DOLPHINDOS YES +;; #CONFIG# IEC_DOLPHINDOS_FAST YES +;; #CONFIG# IEC_JIFFYDOS YES +;; #CONFIG# IEC_JIFFYDOS_BLANK YES + + +; --- Tape deck configuration + +;; #CONFIG# TAPE_NORMAL YES +;; #CONFIG# TAPE_TURBO YES +;; #CONFIG# TAPE_AUTODETECT YES +;; #CONFIG# TAPE_NO_KEY_SENSE NO +;; #CONFIG# TAPE_NO_MOTOR_CONTROL NO + + +; --- Sound support + +;; #CONFIG# SID_2ND_ADDRESS NO +;; #CONFIG# SID_3RD_ADDRESS NO +;; #CONFIG# SID_D4XX NO +;; #CONFIG# SID_D5XX NO +;; #CONFIG# SID_D6XX NO +;; #CONFIG# SID_D7XX NO + + +; --- Keyboard settings + +;; #CONFIG# LEGACY_SCNKEY NO +;; #CONFIG# KEYBOARD_C128 NO +;; #CONFIG# KEYBOARD_C128_CAPS_LOCK NO +;; #CONFIG# KEY_REPEAT_DEFAULT NO +;; #CONFIG# KEY_REPEAT_ALWAYS NO +;; #CONFIG# KEY_FAST_SCAN YES +;; #CONFIG# JOY1_CURSOR NO +;; #CONFIG# JOY2_CURSOR NO + +;; #CONFIG# PROGRAMMABLE_KEYS YES + +;; #CONFIG# KEYCMD_RUN "\5FL" + +;; #CONFIG# KEYCMD_F1 "@8$" +;; #CONFIG# KEYCMD_F2 "LOAD" +;; #CONFIG# KEYCMD_F3 "@9$" +;; #CONFIG# KEYCMD_F4 "RUN:" +;; #CONFIG# KEYCMD_F5 "@10$" +;; #CONFIG# KEYCMD_F6 NO +;; #CONFIG# KEYCMD_F7 "@11$" +;; #CONFIG# KEYCMD_F8 NO + +;; #CONFIG# KEYCMD_HELP "LIST" + +;; #CONFIG# KEYCMD_F9 NO +;; #CONFIG# KEYCMD_F10 NO +;; #CONFIG# KEYCMD_F11 NO +;; #CONFIG# KEYCMD_F12 NO +;; #CONFIG# KEYCMD_F13 NO +;; #CONFIG# KEYCMD_F14 NO + + +; --- Screen editor + +;; #CONFIG# EDIT_STOPQUOTE YES +;; #CONFIG# EDIT_TABULATORS NO + + +; --- Software features + +;; #CONFIG# PANIC_SCREEN YES +;; #CONFIG# DOS_WEDGE YES +;; #CONFIG# TAPE_WEDGE YES +;; #CONFIG# TAPE_HEAD_ALIGN NO +;; #CONFIG# BCD_SAFE_INTERRUPTS YES + + +; --- Eye candy + +;; #CONFIG# COLORS_BRAND YES +;; #CONFIG# BANNER_SIMPLE NO +;; #CONFIG# BANNER_FANCY YES +;; #CONFIG# SHOW_FEATURES YES + + +; --- Debug options + +;; #CONFIG# DBG_STUBS_BRK NO +;; #CONFIG# DBG_PRINTF NO + + +; --- Other + +;; #CONFIG# COMPRESSION_LVL_2 NO diff --git a/src/aliases/,aliases_config.s b/src/aliases/,aliases_config.s index 2e47a455..d8610292 100644 --- a/src/aliases/,aliases_config.s +++ b/src/aliases/,aliases_config.s @@ -39,6 +39,7 @@ !set counter = 0 !ifdef CONFIG_BRAND_CUSTOM { !set counter = counter + 1 } !ifdef CONFIG_BRAND_GENERIC { !set counter = counter + 1 } +!ifdef CONFIG_BRAND_GENERIC_CRT { !set counter = counter + 1 } !ifdef CONFIG_BRAND_TESTING { !set counter = counter + 1 } !ifndef CONFIG_PLATFORM_COMMODORE_64 { @@ -51,6 +52,13 @@ !error "Please select exactly one CONFIG_BRAND_* option" } +!ifdef CONFIG_BRAND_GENERIC_CRT { !ifndef ROM_LAYOUT_CRT { + !error "CONFIG_BRAND_GENERIC_CRT needs cartridge extended ROM set and vice-versa" +}} +!ifdef CONFIG_BRAND_GENERIC { !ifndef ROM_LAYOUT_STD { + !error "CONFIG_BRAND_GENERIC needs standard ROM set and vice-versa" +}} + ; Check that processor configuration is correct diff --git a/src/kernal/iec_fast/jiffydos_load.s b/src/kernal/iec_fast/jiffydos_load.s index fc339414..12c59179 100644 --- a/src/kernal/iec_fast/jiffydos_load.s +++ b/src/kernal/iec_fast/jiffydos_load.s @@ -29,9 +29,16 @@ jiffydos_load: lda FA jsr TALK bcs jiffydos_load_error + + lda #$01 + sta CIA2_DDRB ; XXX for test only + lda #$61 jsr TKSA + lda #$02 + sta CIA2_DDRB ; XXX for test only + ; XXX flow below most likely takes too much time... ; Timing is critical, do not allow interrupts @@ -120,6 +127,9 @@ jiffydos_load_check_loop: jiffydos_load_error: + lda #$F3 + sta CIA2_DDRB ; XXX for test only + +panic $03 ; XXX finish the implementation