From 732ba36d8730509212ae7e4a21ec7bacaa1ea00c Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Fri, 23 Oct 2020 14:38:14 +0200 Subject: [PATCH] adapted BASIC to CRT memory layout, updated binaries --- Makefile | 57 ++++---- 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/external_generic.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_pxlfont.rom | Bin 131072 -> 131072 bytes doc/Extended-BASIC.md | 8 +- src/aliases/,aliases_config.s | 15 +- src/basic/ab1e.strout.s | 1 + src/basic/assets/packed_as_1n.s | 2 +- src/basic/assets/packed_as_3n.s | 2 +- src/basic/assets/packed_dictionary.s | 2 +- src/basic/assets/packed_errors.s | 2 +- src/basic/assets/packed_keywords.s | 2 +- src/basic/assets/packed_keywords_01.s | 2 +- src/basic/assets/packed_keywords_02.s | 2 +- src/basic/assets/packed_keywords_03.s | 2 +- src/basic/assets/packed_misc.s | 2 +- src/basic/assets/startup_banner.s | 2 +- .../basic_commands_02/cmd__jumptable_02.s | 13 +- src/basic/basic_commands_02/cmd_mem.s | 28 ++-- .../basic_commands_02/helper_ask_if_sure.s | 7 + .../basic_commands_02/helper_mem_tab_str.s | 1 + .../basic_commands_02/helper_mem_tab_x.s | 1 + .../basic_commands_02/helper_mem_tab_y.s | 1 + .../board_crt/8000.crt_vectable_basic_1.s | 54 ++++++++ src/basic/board_crt/8000.interop | 1 + src/basic/board_crt/crt_imports.s | 41 ++++++ src/basic/board_crt/crt_proxies.s | 130 ++++++++++++++++++ src/basic/board_crt/dummy.s | 4 - src/basic/engine_editor/a533.linkprg.s | 15 ++ src/basic/engine_editor/tk_cut_away.s | 2 +- src/basic/engine_editor/tk_pack.s | 2 +- src/basic/engine_editor/tk_search.s | 2 +- src/basic/engine_editor/tk_shorten.s | 2 +- src/basic/engine_editor/tokenise_line.s | 10 +- src/basic/engine_runtime/do_error.s | 12 +- src/basic/engine_runtime/do_new_clr_restore.s | 22 ++- src/basic/engine_runtime/is_alphanumeric.s | 1 + .../engine_runtime/prepare_direct_execution.s | 7 + src/basic/init/e422.initmsg.jmp.s | 6 + src/basic/init/initmsg_bytes_free.s | 2 +- src/basic/init/initmsg_real.s | 10 +- src/basic/print/list_single_line.s | 20 ++- src/basic/print/print_features.s | 2 +- src/basic/print/print_packed_dict_string.s | 2 +- src/basic/print/print_packed_freq_string.s | 20 ++- src/basic/print/print_packed_search.s | 2 +- src/basic/wedge/wedge_dos.s | 8 +- tools/generate_strings.cc | 23 ++-- 54 files changed, 461 insertions(+), 91 deletions(-) create mode 100644 src/basic/board_crt/8000.crt_vectable_basic_1.s create mode 100644 src/basic/board_crt/8000.interop create mode 100644 src/basic/board_crt/crt_imports.s create mode 100644 src/basic/board_crt/crt_proxies.s delete mode 100644 src/basic/board_crt/dummy.s diff --git a/Makefile b/Makefile index 01e8a236..e884707a 100644 --- a/Makefile +++ b/Makefile @@ -146,6 +146,9 @@ TOOLS_LIST = $(TOOL_GENERATE_CONSTANTS) \ # List of targets +TARGET_CHR_OR = build/chargen_openroms.rom +TARGET_CHR_PXL = build/chargen_pxlfont.rom + TARGET_CUS_B = build/basic_custom.rom TARGET_GEN_B = build/basic_generic.rom TARGET_CRT_B = build/basic_generic_crt.rom @@ -270,17 +273,17 @@ build/tools/%: tools/%.cc tools/common.h # Rules - CHARGEN -build/chargen_openroms.rom: $(TOOL_PNGPREPARE) assets/8x8font.png +$(TARGET_CHR_OR): $(TOOL_PNGPREPARE) assets/8x8font.png @$(TOOL_PNGPREPARE) charrom assets/8x8font.png $@ 1>build/pngprepare.log -build/chargen_pxlfont.rom: bin/chargen_pxlfont_2.3.rom +$(TARGET_CHR_PXL): bin/chargen_pxlfont_2.3.rom @cp $< $@ -build/chargen_openroms.patched: $(TOOL_PATCH_CHARGEN) build/chargen_openroms.rom - @$(TOOL_PATCH_CHARGEN) -i build/chargen_openroms.rom -o $@ -n 7px-OpenROMs +build/chargen_openroms.patched: $(TOOL_PATCH_CHARGEN) $(TARGET_CHR_OR) + @$(TOOL_PATCH_CHARGEN) -i $(TARGET_CHR_OR) -o $@ -n 7px-OpenROMs -build/chargen_pxlfont.patched: $(TOOL_PATCH_CHARGEN) build/chargen_pxlfont.rom - @$(TOOL_PATCH_CHARGEN) -i build/chargen_pxlfont.rom -o $@ -n 6px-PXLfont +build/chargen_pxlfont.patched: $(TOOL_PATCH_CHARGEN) $(TARGET_CHR_PXL) + @$(TOOL_PATCH_CHARGEN) -i $(TARGET_CHR_PXL) -o $@ -n 6px-PXLfont # Dependencies - BASIC, DOS, and KERNAL @@ -591,7 +594,7 @@ build/padding_64_KB: @mkdir -p build @dd if=/dev/zero bs=8192 count=8 of=$@ status=none -$(TARGET_M65_x) $(TARGET_M65_x_PXL): $(SEG_LIST_M65) build/padding_64_KB build/chargen_openroms.rom build/chargen_openroms.patched build/chargen_pxlfont.rom build/chargen_pxlfont.patched +$(TARGET_M65_x) $(TARGET_M65_x_PXL): $(SEG_LIST_M65) build/padding_64_KB $(TARGET_CHR_OR) build/chargen_openroms.patched $(TARGET_CHR_PXL) build/chargen_pxlfont.patched @echo @echo @echo @@ -602,7 +605,7 @@ $(TARGET_M65_x) $(TARGET_M65_x_PXL): $(SEG_LIST_M65) build/padding_64_KB build/c @cat $(DIR_M65)/kernal.seg_1 >> $(TARGET_M65_x) @cat $(DIR_M65)/basic.seg_1 >> $(TARGET_M65_x) @cat $(DIR_M65)/basic.seg_0 >> $(TARGET_M65_x) - @cat build/chargen_openroms.rom >> $(TARGET_M65_x) + @cat $(TARGET_CHR_OR) >> $(TARGET_M65_x) @cat build/chargen_openroms.patched >> $(TARGET_M65_x) @cat $(DIR_M65)/kernal.seg_0 >> $(TARGET_M65_x) @cat build/padding_64_KB >> $(TARGET_M65_x) @@ -616,7 +619,7 @@ $(TARGET_M65_x) $(TARGET_M65_x_PXL): $(SEG_LIST_M65) build/padding_64_KB build/c @cat $(DIR_M65)/kernal.seg_1 >> $(TARGET_M65_x_PXL) @cat $(DIR_M65)/basic.seg_1 >> $(TARGET_M65_x_PXL) @cat $(DIR_M65)/basic.seg_0 >> $(TARGET_M65_x_PXL) - @cat build/chargen_pxlfont.rom >> $(TARGET_M65_x_PXL) + @cat $(TARGET_CHR_PXL) >> $(TARGET_M65_x_PXL) @cat build/chargen_pxlfont.patched >> $(TARGET_M65_x_PXL) @cat $(DIR_M65)/kernal.seg_0 >> $(TARGET_M65_x_PXL) @cat build/padding_64_KB >> $(TARGET_M65_x_PXL) @@ -647,23 +650,23 @@ $(TARGET_X16_x): $(SEG_LIST_X16) build/chargen_openroms.rom test: test_custom test_crt: test_generic_crt -test_custom: $(TARGET_LIST_CUS) build/symbols_custom.vs - x64 -kernal $(TARGET_CUS_K) -basic $(TARGET_CUS_B) -moncommands build/symbols_custom.vs -1 $(TESTTAPE) -8 $(TESTDISK) +test_custom: $(TARGET_LIST_CUS) $(TARGET_CHR_PXL) build/symbols_custom.vs + x64 -kernal $(TARGET_CUS_K) -basic $(TARGET_CUS_B) -chargen $(TARGET_CHR_PXL) -moncommands build/symbols_custom.vs -1 $(TESTTAPE) -8 $(TESTDISK) -test_generic: $(TARGET_LIST_GEN) build/symbols_generic.vs - x64 -kernal $(TARGET_GEN_K) -basic $(TARGET_GEN_B) -moncommands build/symbols_generic.vs -1 $(TESTTAPE) -8 $(TESTDISK) +test_generic: $(TARGET_LIST_GEN)$(TARGET_CHR_PXL) build/symbols_generic.vs + x64 -kernal $(TARGET_GEN_K) -basic $(TARGET_GEN_B) -chargen $(TARGET_CHR_PXL) -moncommands build/symbols_generic.vs -1 $(TESTTAPE) -8 $(TESTDISK) -test_generic_x128: $(TARGET_LIST_GEN) build/symbols_generic.vs - x128 -go64 -kernal64 $(TARGET_GEN_K) -basic64 $(TARGET_GEN_B) -moncommands build/symbols_generic.vs -1 $(TESTTAPE) -8 $(TESTDISK) +test_generic_x128: $(TARGET_LIST_GEN) $(TARGET_CHR_PXL) build/symbols_generic.vs + x128 -go64 -kernal64 $(TARGET_GEN_K) -basic64 $(TARGET_GEN_B) -chargen $(TARGET_CHR_PXL) -moncommands build/symbols_generic.vs -1 $(TESTTAPE) -8 $(TESTDISK) -test_generic_crt: $(TARGET_LIST_CRT) build/symbols_generic_crt.vs - x64 -kernal $(TARGET_CRT_K) -basic $(TARGET_CRT_B) -cartcrt $(TARGET_CRT_X) -moncommands build/symbols_generic_crt.vs -1 $(TESTTAPE) -8 $(TESTDISK) +test_generic_crt: $(TARGET_LIST_CRT) $(TARGET_CHR_PXL) build/symbols_generic_crt.vs + x64 -kernal $(TARGET_CRT_K) -basic $(TARGET_CRT_B) -chargen $(TARGET_CHR_PXL) -cartcrt $(TARGET_CRT_X) -moncommands build/symbols_generic_crt.vs -1 $(TESTTAPE) -8 $(TESTDISK) -test_testing: $(TARGET_LIST_TST) build/symbols_testing.vs - x64 -kernal $(TARGET_TST_K) -basic $(TARGET_TST_B) -moncommands build/symbols_testing.vs -1 $(TESTTAPE) -8 $(TESTDISK) +test_testing: $(TARGET_LIST_TST) $(TARGET_CHR_PXL) build/symbols_testing.vs + x64 -kernal $(TARGET_TST_K) -basic $(TARGET_TST_B) -chargen $(TARGET_CHR_PXL) -moncommands build/symbols_testing.vs -1 $(TESTTAPE) -8 $(TESTDISK) -test_ultimate64: $(TARGET_LIST_U64) build/symbols_ultimate64.vs - x64 -kernal $(TARGET_U64_K) -basic $(TARGET_U64_B) -moncommands build/symbols_ultimate64.vs -1 $(TESTTAPE) -8 $(TESTDISK) +test_ultimate64: $(TARGET_LIST_U64) $(TARGET_CHR_PXL) build/symbols_ultimate64.vs + x64 -kernal $(TARGET_U64_K) -basic $(TARGET_U64_B) -chargen $(TARGET_CHR_PXL) -moncommands build/symbols_ultimate64.vs -1 $(TESTTAPE) -8 $(TESTDISK) test_mega65: $(TARGET_M65_x) $(TARGET_M65_x_PXL) ../xemu/build/bin/xmega65.native -dmarev 2 -besure -fontrefresh -forcerom -loadrom $(TARGET_M65_x_PXL) @@ -671,20 +674,20 @@ test_mega65: $(TARGET_M65_x) $(TARGET_M65_x_PXL) test_cx16: $(TARGET_X16_x) ../x16-emulator/x16emu -rom $(TARGET_X16_x) -test_hybrid: build/kernal_hybrid.rom build/symbols_hybrid.vs +test_hybrid: build/kernal_hybrid.rom $(TARGET_CHR_PXL) build/symbols_hybrid.vs @echo @echo $(HYBRID_WARNING) @echo - x64 -kernal build/kernal_hybrid.rom -moncommands build/symbols_hybrid.vs -1 $(TESTTAPE) -8 $(TESTDISK) + x64 -kernal build/kernal_hybrid.rom -chargen $(TARGET_CHR_PXL) -moncommands build/symbols_hybrid.vs -1 $(TESTTAPE) -8 $(TESTDISK) @echo @echo $(HYBRID_WARNING) @echo -test_hybrid_u64: build/kernal_hybrid_u64.rom build/symbols_hybrid_u64.vs +test_hybrid_u64: build/kernal_hybrid_u64.rom $(TARGET_CHR_PXL) build/symbols_hybrid_u64.vs @echo @echo $(HYBRID_WARNING) @echo - x64 -kernal build/kernal_hybrid_u64.rom -moncommands build/symbols_hybrid_u64.vs -1 $(TESTTAPE) -8 $(TESTDISK) + x64 -kernal build/kernal_hybrid_u64.rom -chargen $(TARGET_CHR_PXL) -moncommands build/symbols_hybrid_u64.vs -1 $(TESTTAPE) -8 $(TESTDISK) @echo @echo $(HYBRID_WARNING) @echo @@ -692,8 +695,8 @@ test_hybrid_u64: build/kernal_hybrid_u64.rom build/symbols_hybrid_u64.vs test_m65: build/mega65.rom m65 -b ../mega65-core/bin/mega65r1.bit -k ../mega65-core/bin/KICKUP.M65 -R build/mega65.rom -4 -testremote: 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 -remotemonitor +testremote: build/kernal_custom.rom build/basic_custom.rom $(TARGET_CHR_PXL) build/symbols_custom.vs + x64 -kernal build/kernal_custom.rom -basic build/basic_custom.rom -chargen $(TARGET_CHR_PXL) -moncommands build/symbols_custom.vs -remotemonitor testsimilarity: $(TOOL_SIMILARITY) $(DIR_GEN)/OUTx_x.BIN kernal basic $(TOOL_SIMILARITY) kernal $(DIR_GEN)/OUTx_x.BIN diff --git a/bin/basic_generic.rom b/bin/basic_generic.rom index 370684bc822b0b4dc693f1acfe50e60f6d96c8f7..3683c857b914e350987e3e1859696a6dc8ee5aa3 100644 GIT binary patch delta 107 zcmZp0XmHrDi;->RyQLcxR!%;^Sj?9CdXcO`@MK1I;mtlwHf)T~CU3 zNNv{VRAUlOeZ7ELVd_JV4j{2ALxFjVLc-(>?nfYbA07`r#%G(SN}Xh3G@cwU9|Y37 HS>6`_HyQLcxwoN|3Sj=|v=^|N$;K_{a!kc}VY}goIP447KV>6tX5~a6bac`|x=1F}~V7Rq7-QqtWDe`5=(q H&GNngU56{} diff --git a/bin/basic_generic_crt.rom b/bin/basic_generic_crt.rom index 23f011e13bb4bb58f8a8d48663615d2315bd29ef..0720e80e99ad794709e46e4b850077fed1df5f16 100644 GIT binary patch delta 4165 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 delta 5974 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 U8g|M9e?(+Q{8_5@s`f1PzjpdAX8-^I diff --git a/bin/basic_ultimate64.rom b/bin/basic_ultimate64.rom index 1ea03b7bdab1cd9be32ac2883681d728681c7fef..af1dd73cc7cbb2925ee317f16ef0e675aa944486 100644 GIT binary patch delta 1373 zcmXX_Yfuwc6yDvC*T#?_U;`AmB8G^fZG#q}C>D_@Tg7LqeRyN*4E0B6+J6n!>U36t zRt?_TR{66D-lZEI-IzL-kPM>^t=sxowROsmwxEJKbUGJiI_fx`^e*&7i8n5!2l{hpzDWHjr_0>RXp`9gGdRMIa zgu?6hpGh2AoH(cyHD_&dQ}4Cp35~EarbGhDhv;NhIY(XJ$Xd)PcahEPwT<-&2UIXK zg_f9+{ZYyT6)Sj@LO0Dn=WbpltZZGqV%^#e8#gt@i0dc!G8DJ?&~KJTm&AaM(eaSZ zjkiPNb)|LoqTU2>M#ARl^u#8b4qzfGFRpra3qRJ%Nr^U>@QPX7Xk-|&mf2~BK4LNc zu(e?>4%Iwl#Sm_P$cXI_x9Themn4;iIuCl!D4f_T^qxVyZO`oJgyNE1AejM8De7Nh z;vwB6conUj9!(0cAjMVzU_`U2CgFx0Fxpg3wo@n!pxeZxU^+!xL2UJG0a|E3h ztMjJ@r%{P1CeS(3HT_Xdk8{(E9+_l!=#QmY!;=y8)S2KYkJM~GdmG)$e%sbLf`dFY zN2^^+>jol%Its7e8s5U4&-`;vlB9bhcm7PCg5b@F%85zn!Tz1CqCd=yS3`vffD8R$ zqa+FfO1sK9isY!P&}j0%uF5=0k}{G_tG12@^-1B9Y#?3devvClp%2_I(F7vy2ka%( zmE$wWvVc76o(Ix!iHkX-Y=HXJ0C@sy6lTo#EuiWBIEqzsoVcPEu(cn@!LGltN;e9q zxMP3N9MsLq3&PEelm#*as;R^Mn9?~jfF^Qf7Y%WOztw$|X#SgRPKMYqHM014Ct|6nFa#aSKpX;9Zi+uQ%_gr-6XqZLZ_8FTr&&(X z3|D<~n?JT)J6_pUqgOiPC~X?IFu85&iOV*Yn288VSe7S=8OAK#ySkU$d+)x#-{<@J z9%wkw;7=BTVMzt#F~pk(tF;WgX|M`P4Cor2@M+vcCp`W~DVu{hwsG#+kl!HO2+2Gs zkEL&+yq_1R z10MNJbS|TWqoHqREa#5gL1v@NJe?E{DMBXLGI3+7P>&v1oNQ$@li$eZR!m6-aB|esMYnJVxDf?q zsKa`fIW8!C$qNc$L6f+{PEs2pTe>M$YV#-AJv@6+B!>#knApPMw&Cy7e!C9 zqB@C`>?(E|-OGN}ERSI?PtDOf+sfMC0)jFMgXeB<=PsunU5ZAfdw1^s89NU_dqCmD z7_5<*arf7N+Fc!$84tM9@7JG1K|l#xF-MUcwH4@1{?}HPM@dplvgxZ$6JG71@O?-} zy4GIFr3TO&_GPqyfc*h`6&=lS+qX3fYunbX*|=fzmaR=RUG%%0QPv|f-9D|mQiHOs zyHnF1)z>{=v9xU0;!O+OtuMdi+3{k@_7_?jvr2caE?+P1KIAoeHKY8jFr1Pyz`VF( z=(5jHI?s!vsoao_Hlc^)>ec!Nbk<0Db;f_DJ1|5K-0Nr<>ok|1@ry|Q25wb!h#JZlYa6*X)XZnXC%fpGjC{+(>*K~`Rhl&>2 z9Pcsg>Hjst`~C1BLzhknhFIu)=!8uV75ZiFD|BSQkshU4%##^0UkA0JV3iK)y9Jk= zlpd~{aj)p2^en}tc7re|W0&X!bCRGEZ7AHM_w}2?*2PCXu{)3w?@Fj648gvjaQK4E z2G>Xrg+xl&7sR_q5@F4Vy(6(PRQAlZ0+9#(QxYRkI-k5u+u0YwTRcJL0hmTP&U}u} zqube7OQ#d>-rFL!;MewgL=O~(La_A1?qeVMFCRZ7p9-N9=!2|}PmZ+w`pKuC?LXyu z=XC7M+0TFe;`;S3QOLQJcj&%!Vm&Z=+j)>>m!b9|mxWTKmbi6Z94lHtdEHl3UGUY# XG)8dt>Jtq1)l9OY4|h&7Vki6$fyZD* diff --git a/bin/external_generic.crt b/bin/external_generic.crt index 2001cc5160521bae11cd93c6ee22f90b3235ffdd..a2524d6961da6541f5aaa6991586d22a54f03415 100644 GIT binary patch delta 2868 zcmZ`*e^gV~9sj;01c<;3zhbE3y|u2E1r)SkmQyI+S8u1*1Gv? z(du)|s!QtgLYO61y}V^5kZvEWMU~~%Rm*BtRs^%?d0#N| zShG&m1v3y(1YwJ)6Sg9sFO-Qfp_HeGJz<8I3*9EUl$XohdU-2v=XaL~#d{qA@U=?C zY7(uI_O?WoADpfH&us-W=goJOtzYrjBTJvIb*!1Tdcop_%TuR6v3ALf454^;$rVs@ z&IUj#j>@16S$!Ldg<=slln5oXB{>aKNTV7E`tCu}hLl;)Bq>C%6Dyl0N(gmw3 zxkWHJG;khr+m`MTi-=qM!+94H({A=J7eSJ23%?)6w$Y5>GorYo&1!PzAnzG?KsuO9;P`@Vj& z?fo|%aKj!$fuMabWO*%Tv`A^4IEm`3d!xbk`xg`s!M75IcllD52{b+*GVV#T!>D z#g(Xd;>uk5kdHGQ+Ur0dm$hyOB2(}>Wmak8v5&;z)d8Hqq}&o?`C=nRpo8me6m|Kc z)@ZQ1^zM!B8x!cLNAo}+w~=A$&G)snJ>sVF*6?I(h6Z__J1dZOah*p^t5@y?EEgjl zbsS%V)w5YcI#hXoZ-d)uQ!99rL1|>AlHl9ZgPD6C*K3E)O^JK8(aLtlYv& z+W4tHhp7HII_gAU6iXK|>~Rct$M}%wSjpF)GBU|p?Q2mQit7TclLC6|DUNz1txl{& z`jUj5taGf>V8@ZCDicDTl`)}HoXYwA&7Det98;&uj9Me>R9<$ub6Xug$KE_w>lH3s zO26|tTb%MA6`jx-RsJUa&M~dioRjC0Gt|sHUSXZMm)6EML$4(|_CuCzIhi7TccvaFjec zIzgkUut^VnPUubraxwyWCRhx8U4E?WllcTa1tRq6p=;OzZ7yIBdK)}IWd*a#!$6d1M~M;#vl@@*!4GUAuts1LTriSl0-WMrW(xcx8UBQT@20>= zax#cUXeS1EkV^0cYEOY}CfIL+3nm~v4^p7p1YJYvKweFNC`kZvhefTs6EEgwGQf_e z!^?x{J&A8rWYVtt=JMKeu(4YrJtkytUH(yUmD`?!9`X`FW51>E`%BP~iy6$_*o}g1 z)bd4nZ5q7%$x)KEv3u_|sO=`Zv*Y2j$hEP|_oscy{{4$`KW639y;Lo^aZ7*J$3J9( zEqCd&7n0)R*u0kQqh=V+II!;#CoBGIk7&VigqK|fsX0t4GZN8uN`CnJGVY)VUYxA9)TWyU@ zBJH;=-7LZi_pP~jhDWc)C!2OZdwW~_v|ZZSlYKQf4(KM0hV^e=r#}CEn%PDqUgD* zCV3jN7n-QYE#OIdg)(cN*b+*o3Xt`m7aQ@TAH}pCLA7w`od&vYwX) zfzNCap}8Z#Yg@)8&X&TpK|tW}a)b#l)yR{9SXAR>2>6qECY(07zdHpw<*Hg~5Pu=K zPbau7_z;6G2z%xSb$iN!^J%F+2IKJHSvov;(7wKi MsXX!Addt-R0{6_Cr2qf` delta 85 zcmV-b0IL6hfdYVm0+3L#f)f?7kk|?i>Q7PvL`7CEGB7bPGBUGCAa*$!NARVbjUdoW ryzh9a0ENb_Akc-JAp7x5O|#fpS_B64@X8?c@RK-RF#%1pYF-v1z78ZP diff --git a/bin/kernal_generic.rom b/bin/kernal_generic.rom index d085818454689868d959b1eeeeafdf0f9d6a2439..2f309c4ebda5e3cc3877c2c9dbb6d8282fb6bd5c 100644 GIT binary patch delta 3251 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 delta 3350 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 diff --git a/bin/kernal_generic_crt.rom b/bin/kernal_generic_crt.rom index ee4b0800d5b69f34e6e8e37ef069d1d23939df55..933aae8936e03c0bf38307ff7dff94557f73436c 100644 GIT binary patch delta 3062 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 delta 3110 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 diff --git a/bin/kernal_ultimate64.rom b/bin/kernal_ultimate64.rom index e1a873fc4e8a1aa84d369953554e96454a233159..b4a7dcb3fcb4108ff6439b219eca6fcfa04fe4b0 100644 GIT binary patch delta 4192 zcmZ8k4OA58xtHSo$-X_N8*s)2PO)fpTr@g0g za#I(*j71u_ONJ((NwbbS;9wTl)8;5Dg=m7iRO1K~rIjO10

VJNyVN%d+>KrS`Pt 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 diff --git a/bin/mega65_pxlfont.rom b/bin/mega65_pxlfont.rom index 6c040c1581c672c96e2abb176eb2d50b40e963cf..f0f7a8e17de6b19171d86c167e76175a16becef4 100644 GIT binary patch delta 4554 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 diff --git a/doc/Extended-BASIC.md b/doc/Extended-BASIC.md index b82d72d2..d8c6d046 100644 --- a/doc/Extended-BASIC.md +++ b/doc/Extended-BASIC.md @@ -1,7 +1,7 @@ # Extended BASIC -NOTE: Command syntax, behaviour details, and tokens are still subject to change! Currently the availability of some depends on the build configuration, in the future most (if not all) extended commands will be available only on machines with extended ROM, like the *MEGA65* or *Ultimate 64*. +NOTE: Command syntax, behaviour details, and tokens are still subject to change! Currently the availability of some depends on the build configuration, in the future most (if not all) extended commands will be available only on machines with extended ROM, like the *MEGA65*, *Ultimate 64*, or a build utilizing cartridge with external ROM (build marked as *cart*). ## DOS Wedge @@ -42,7 +42,7 @@ Loads the file from tape. Depending on the configuration, it tries to load the f Like above, but merges a BASIC program to the one already stored in memory. -### `←H` or `←HF` (MEGA65, cartridge) +### `←H` or `←HF` (cart, MEGA65) Launches a built-in tape head alignment tool. Destroys program in memory. Press `RUN/STOP` to terminate the tool. `←HF` is for compatibility with the *BlackBox v3/v4/v8* cartridges. @@ -71,7 +71,7 @@ Saves the binary data from the given memory area. NOTE: for now syntax differs f ## Additional BASIC commands - misc -### `COLD` (MEGA65) +### `COLD` (cart, MEGA65) Resets the machine. In direct mode asks for confirmation first. @@ -83,7 +83,7 @@ Tries to switch the machine to turbo mode (or back to 1MHz operation mode) - det Tries to restore program destroyed by the `NEW` command or a reset. -### `MEM` (MEGA65) +### `MEM` (cart, MEGA65) Displays BASIC memory usage information: * `TEXT` - size of BASIC program text, always at least 2 bytes are used diff --git a/src/aliases/,aliases_config.s b/src/aliases/,aliases_config.s index fbbc5c0c..4eb53819 100644 --- a/src/aliases/,aliases_config.s +++ b/src/aliases/,aliases_config.s @@ -94,6 +94,9 @@ !ifdef CONFIG_MB_M65 { !ifdef CONFIG_MEMORY_MODEL_60K { !error "Do not use CONFIG_MEMORY_MODEL_60K options for MEGA65 motherboard" } } +!ifdef ROM_LAYOUT_CRT { + !ifdef CONFIG_MEMORY_MODEL_60K { !error "Do not use CONFIG_MEMORY_MODEL_60K options for CRT ROM layout" } +} !ifdef CONFIG_PLATFORM_COMMANDER_X16 { !ifndef CONFIG_MEMORY_MODEL_38K { !error "Select CONFIG_MEMORY_MODEL_38K options for Commander X16 platform" } } @@ -445,9 +448,9 @@ ; Determine if we need space-savings in BASIC code -!ifndef CONFIG_MB_M65 { +!ifndef CONFIG_MB_M65 { !ifndef ROM_LAYOUT_CRT { !set HAS_SMALL_BASIC = 1 -} +} } @@ -469,4 +472,12 @@ !ifdef SEGMENT_BASIC_0 { !set SEGMENT_M65_BASIC_0 = 1 } !ifdef SEGMENT_BASIC_1 { !set SEGMENT_M65_BASIC_1 = 1 } !ifdef SEGMENT_KERNAL_0 { !set SEGMENT_M65_KERNAL_0 = 1 } + !ifdef SEGMENT_KERNAL_1 { !set SEGMENT_M65_KERNAL_1 = 1 } +} + +!ifdef ROM_LAYOUT_CRT { + !ifdef SEGMENT_BASIC_0 { !set SEGMENT_CRT_BASIC_0 = 1 } + !ifdef SEGMENT_BASIC_1 { !set SEGMENT_CRT_BASIC_1 = 1 } + !ifdef SEGMENT_KERNAL_0 { !set SEGMENT_CRT_KERNAL_0 = 1 } + !ifdef SEGMENT_KERNAL_1 { !set SEGMENT_CRT_KERNAL_1 = 1 } } diff --git a/src/basic/ab1e.strout.s b/src/basic/ab1e.strout.s index 3f88c657..13daaf5d 100644 --- a/src/basic/ab1e.strout.s +++ b/src/basic/ab1e.strout.s @@ -1,6 +1,7 @@ ;; #LAYOUT# STD * #TAKE ;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 ;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# CRT BASIC_1 #TAKE-FLOAT ;; #LAYOUT# M65 BASIC_1 #TAKE-FLOAT ;; #LAYOUT# * * #IGNORE diff --git a/src/basic/assets/packed_as_1n.s b/src/basic/assets/packed_as_1n.s index 4fae3774..c8874aa6 100644 --- a/src/basic/assets/packed_as_1n.s +++ b/src/basic/assets/packed_as_1n.s @@ -1,5 +1,5 @@ ;; #LAYOUT# STD * #TAKE -;; #LAYOUT# CRT BASIC_0 #TAKE +;; #LAYOUT# CRT BASIC_1 #TAKE ;; #LAYOUT# M65 BASIC_1 #TAKE ;; #LAYOUT# X16 BASIC_0 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/basic/assets/packed_as_3n.s b/src/basic/assets/packed_as_3n.s index 1447af4d..f0d6b833 100644 --- a/src/basic/assets/packed_as_3n.s +++ b/src/basic/assets/packed_as_3n.s @@ -1,5 +1,5 @@ ;; #LAYOUT# STD * #TAKE -;; #LAYOUT# CRT BASIC_0 #TAKE +;; #LAYOUT# CRT BASIC_1 #TAKE ;; #LAYOUT# M65 BASIC_1 #TAKE ;; #LAYOUT# X16 BASIC_0 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/basic/assets/packed_dictionary.s b/src/basic/assets/packed_dictionary.s index ed6563ad..c56b26bc 100644 --- a/src/basic/assets/packed_dictionary.s +++ b/src/basic/assets/packed_dictionary.s @@ -1,5 +1,5 @@ ;; #LAYOUT# STD * #TAKE -;; #LAYOUT# CRT BASIC_0 #TAKE +;; #LAYOUT# CRT BASIC_1 #TAKE ;; #LAYOUT# M65 BASIC_1 #TAKE ;; #LAYOUT# X16 BASIC_0 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/basic/assets/packed_errors.s b/src/basic/assets/packed_errors.s index eda0257e..303bd668 100644 --- a/src/basic/assets/packed_errors.s +++ b/src/basic/assets/packed_errors.s @@ -1,5 +1,5 @@ ;; #LAYOUT# STD * #TAKE -;; #LAYOUT# CRT BASIC_0 #TAKE +;; #LAYOUT# CRT BASIC_1 #TAKE ;; #LAYOUT# M65 BASIC_1 #TAKE ;; #LAYOUT# X16 BASIC_0 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/basic/assets/packed_keywords.s b/src/basic/assets/packed_keywords.s index 0f01aab6..307e1b08 100644 --- a/src/basic/assets/packed_keywords.s +++ b/src/basic/assets/packed_keywords.s @@ -1,5 +1,5 @@ ;; #LAYOUT# STD * #TAKE -;; #LAYOUT# CRT BASIC_0 #TAKE +;; #LAYOUT# CRT BASIC_1 #TAKE ;; #LAYOUT# M65 BASIC_1 #TAKE ;; #LAYOUT# X16 BASIC_0 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/basic/assets/packed_keywords_01.s b/src/basic/assets/packed_keywords_01.s index c4260b5d..f2f77efc 100644 --- a/src/basic/assets/packed_keywords_01.s +++ b/src/basic/assets/packed_keywords_01.s @@ -1,5 +1,5 @@ ;; #LAYOUT# STD * #TAKE -;; #LAYOUT# CRT BASIC_0 #TAKE +;; #LAYOUT# CRT BASIC_1 #TAKE ;; #LAYOUT# M65 BASIC_1 #TAKE ;; #LAYOUT# X16 BASIC_0 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/basic/assets/packed_keywords_02.s b/src/basic/assets/packed_keywords_02.s index cfe22be5..dc0e993e 100644 --- a/src/basic/assets/packed_keywords_02.s +++ b/src/basic/assets/packed_keywords_02.s @@ -1,5 +1,5 @@ ;; #LAYOUT# STD * #TAKE -;; #LAYOUT# CRT BASIC_0 #TAKE +;; #LAYOUT# CRT BASIC_1 #TAKE ;; #LAYOUT# M65 BASIC_1 #TAKE ;; #LAYOUT# X16 BASIC_0 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/basic/assets/packed_keywords_03.s b/src/basic/assets/packed_keywords_03.s index 2b633ed2..916f9bdb 100644 --- a/src/basic/assets/packed_keywords_03.s +++ b/src/basic/assets/packed_keywords_03.s @@ -1,5 +1,5 @@ ;; #LAYOUT# STD * #TAKE -;; #LAYOUT# CRT BASIC_0 #TAKE +;; #LAYOUT# CRT BASIC_1 #TAKE ;; #LAYOUT# M65 BASIC_1 #TAKE ;; #LAYOUT# X16 BASIC_0 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/basic/assets/packed_misc.s b/src/basic/assets/packed_misc.s index 52e38c48..bbfc7c6c 100644 --- a/src/basic/assets/packed_misc.s +++ b/src/basic/assets/packed_misc.s @@ -1,5 +1,5 @@ ;; #LAYOUT# STD * #TAKE -;; #LAYOUT# CRT BASIC_0 #TAKE +;; #LAYOUT# CRT BASIC_1 #TAKE ;; #LAYOUT# M65 BASIC_1 #TAKE ;; #LAYOUT# X16 BASIC_0 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/basic/assets/startup_banner.s b/src/basic/assets/startup_banner.s index 1582c98c..bd0e3b9b 100644 --- a/src/basic/assets/startup_banner.s +++ b/src/basic/assets/startup_banner.s @@ -1,5 +1,5 @@ ;; #LAYOUT# STD * #TAKE -;; #LAYOUT# CRT BASIC_0 #TAKE +;; #LAYOUT# CRT BASIC_1 #TAKE ;; #LAYOUT# X16 BASIC_0 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/basic/basic_commands_02/cmd__jumptable_02.s b/src/basic/basic_commands_02/cmd__jumptable_02.s index deb3dc4d..d51a332d 100644 --- a/src/basic/basic_commands_02/cmd__jumptable_02.s +++ b/src/basic/basic_commands_02/cmd__jumptable_02.s @@ -21,18 +21,22 @@ !set ITEM_00 = cmd_cold !set ITEM_01 = cmd_mem -!set ITEM_02 = cmd_sysinfo +!ifdef CONFIG_MB_M65 { +!set ITEM_02 = cmd_sysinfo +} !ifndef HAS_OPCODES_65C02 { command_02_jumptable_lo: - !byte <(ITEM_00-1), <(ITEM_01-1), <(ITEM_02-1) + !byte <(ITEM_00-1), <(ITEM_01-1) + !ifdef CONFIG_MB_M65 { !byte <(ITEM_02-1) } command_02_jumptable_hi: - !byte >(ITEM_00-1), >(ITEM_01-1), >(ITEM_02-1) + !byte >(ITEM_00-1), >(ITEM_01-1) + !ifdef CONFIG_MB_M65 { !byte >(ITEM_02-1) } } else { ; HAS_OPCODES_65C02 @@ -40,5 +44,6 @@ command_02_jumptable: ; Note: 65C02 has the page boundary vector bug fixed! - !word ITEM_00, ITEM_01, ITEM_02 + !word ITEM_00, ITEM_01 + !ifdef CONFIG_MB_M65 { !word ITEM_02 } } } diff --git a/src/basic/basic_commands_02/cmd_mem.s b/src/basic/basic_commands_02/cmd_mem.s index 19c53e03..af06307a 100644 --- a/src/basic/basic_commands_02/cmd_mem.s +++ b/src/basic/basic_commands_02/cmd_mem.s @@ -1,38 +1,50 @@ ;; #LAYOUT# STD * #TAKE -;; #LAYOUT# M65 * #TAKE -;; #LAYOUT# X16 BASIC_0 #TAKE +;; #LAYOUT# CRT BASIC_1 #TAKE +;; #LAYOUT# M65 BASIC_1 #TAKE +;; #LAYOUT# * BASIC_0 #TAKE ;; #LAYOUT# * * #IGNORE !ifndef HAS_SMALL_BASIC { + ; First perform the garbage collection - to be able to determine real values + !ifdef SEGMENT_M65_BASIC_0 { cmd_mem: - ; First perform the garbage collection - to be able to determine real values - jsr varstr_garbage_collect - jsr map_BASIC_1 jsr (VB1__cmd_mem_cont) jmp map_NORMAL +} else ifdef SEGMENT_CRT_BASIC_0 { + +cmd_mem: + + jsr varstr_garbage_collect + + jsr map_BASIC_1 + jsr JB1__cmd_mem_cont + jmp map_NORMAL + } else ifdef SEGMENT_M65_BASIC_1 { cmd_mem_cont: +} else ifdef SEGMENT_CRT_BASIC_1 { + +cmd_mem_cont: + } else { cmd_mem: - ; First perform the garbage collection - to be able to determine real values - jsr varstr_garbage_collect } -!ifndef SEGMENT_M65_BASIC_0 { +!ifndef SEGMENT_BASIC_0 { ; Print header diff --git a/src/basic/basic_commands_02/helper_ask_if_sure.s b/src/basic/basic_commands_02/helper_ask_if_sure.s index 5f52d7b9..5c5f456a 100644 --- a/src/basic/basic_commands_02/helper_ask_if_sure.s +++ b/src/basic/basic_commands_02/helper_ask_if_sure.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT BASIC_1 #TAKE ;; #LAYOUT# M65 BASIC_1 #TAKE ;; #LAYOUT# * BASIC_0 #TAKE ;; #LAYOUT# * * #IGNORE @@ -19,6 +20,12 @@ helper_ask_if_sure: jsr (VB1__helper_ask_if_sure) jmp map_NORMAL +} else ifdef SEGMENT_CRT_BASIC_0 { + + jsr map_BASIC_1 + jsr JB1__helper_ask_if_sure + jmp map_NORMAL + } else { ; First check, if we are in direct mode,; if not, do not ask diff --git a/src/basic/basic_commands_02/helper_mem_tab_str.s b/src/basic/basic_commands_02/helper_mem_tab_str.s index eca887b1..b336b964 100644 --- a/src/basic/basic_commands_02/helper_mem_tab_str.s +++ b/src/basic/basic_commands_02/helper_mem_tab_str.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT BASIC_1 #TAKE ;; #LAYOUT# M65 BASIC_1 #TAKE ;; #LAYOUT# X16 BASIC_0 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/basic/basic_commands_02/helper_mem_tab_x.s b/src/basic/basic_commands_02/helper_mem_tab_x.s index 825d0a59..7b9939bc 100644 --- a/src/basic/basic_commands_02/helper_mem_tab_x.s +++ b/src/basic/basic_commands_02/helper_mem_tab_x.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT BASIC_1 #TAKE ;; #LAYOUT# M65 BASIC_1 #TAKE ;; #LAYOUT# X16 BASIC_0 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/basic/basic_commands_02/helper_mem_tab_y.s b/src/basic/basic_commands_02/helper_mem_tab_y.s index 083817d8..7735ccce 100644 --- a/src/basic/basic_commands_02/helper_mem_tab_y.s +++ b/src/basic/basic_commands_02/helper_mem_tab_y.s @@ -1,4 +1,5 @@ ;; #LAYOUT# STD * #TAKE +;; #LAYOUT# CRT BASIC_1 #TAKE ;; #LAYOUT# M65 BASIC_1 #TAKE ;; #LAYOUT# X16 BASIC_0 #TAKE ;; #LAYOUT# * * #IGNORE diff --git a/src/basic/board_crt/8000.crt_vectable_basic_1.s b/src/basic/board_crt/8000.crt_vectable_basic_1.s new file mode 100644 index 00000000..7e2f0fa1 --- /dev/null +++ b/src/basic/board_crt/8000.crt_vectable_basic_1.s @@ -0,0 +1,54 @@ +;; #LAYOUT# CRT BASIC_0 #TAKE-FLOAT +;; #LAYOUT# CRT BASIC_1 #TAKE +;; #LAYOUT# * * #IGNORE + +; +; Definitions for communication with cartridge segment BASIC_1 from BASIC_0 +; + + +!ifdef SEGMENT_BASIC_0 { + + + ; Label definitions + + !addr JB1__INITMSG = $8000 + 3 * 0 + !addr JB1__LINKPRG = $8000 + 3 * 1 + !addr JB1__tokenise_line = $8000 + 3 * 2 + !addr JB1__list_single_line = $8000 + 3 * 3 + !addr JB1__print_packed_error = $8000 + 3 * 4 + !addr JB1__print_packed_misc_str = $8000 + 3 * 5 + !addr JB1__do_new = $8000 + 3 * 6 + !addr JB1__do_clr = $8000 + 3 * 7 + !addr JB1__do_restore = $8000 + 3 * 8 + !addr JB1__cmd_mem_cont = $8000 + 3 * 9 + !addr JB1__prepare_direct_execution = $8000 + 3 * 10 + !addr JB1__helper_ask_if_sure = $8000 + 3 * 11 + +!ifdef CONFIG_DOS_WEDGE { + !addr JB1__wedge_dos = $8000 + 3 * 12 +} + +} else { + + ; Jump table (Open ROMs private!) + + jmp INITMSG + jmp LINKPRG + jmp tokenise_line + jmp list_single_line + jmp print_packed_error + jmp print_packed_misc_str + jmp do_new + jmp do_clr + jmp do_restore + jmp cmd_mem_cont + jmp prepare_direct_execution + jmp helper_ask_if_sure + +!ifdef CONFIG_DOS_WEDGE { + jmp wedge_dos +} + + +} diff --git a/src/basic/board_crt/8000.interop b/src/basic/board_crt/8000.interop new file mode 100644 index 00000000..7acd2a6f --- /dev/null +++ b/src/basic/board_crt/8000.interop @@ -0,0 +1 @@ +This particular address is not for interoperability - we had to choose some fixed location for the extended ROM jumptable, beginning of the mapped memory block is just sane. diff --git a/src/basic/board_crt/crt_imports.s b/src/basic/board_crt/crt_imports.s new file mode 100644 index 00000000..678029af --- /dev/null +++ b/src/basic/board_crt/crt_imports.s @@ -0,0 +1,41 @@ +;; #LAYOUT# CRT BASIC_1 #TAKE +;; #LAYOUT# * * #IGNORE + +;; #IMPORT# BASIC_0 = BASIC_0_combined.sym +;; #IMPORT# KERNAL_0 = KERNAL_0_combined.sym + +; +; Definitions for calling segments BASIC_0 and KERNAL_0 routines from BASIC_1 +; + +;; #ALIAS# peek_via_OLDTXT = BASIC_0.proxy_B1_peek_via_OLDTXT +;; #ALIAS# poke_via_OLDTXT = BASIC_0.proxy_B1_poke_via_OLDTXT +;; #ALIAS# JCHROUT = BASIC_0.proxy_B1_JCHROUT +;; #ALIAS# JCLALL = BASIC_0.proxy_B1_JCLALL +;; #ALIAS# plot_set = BASIC_0.proxy_B1_plot_set + +;; #ALIAS# JCLOSE = BASIC_0.proxy_B1_JCLOSE +;; #ALIAS# JOPEN = BASIC_0.proxy_B1_JOPEN +;; #ALIAS# JMEMTOP = KERNAL_0.JMEMTOP +;; #ALIAS# JSETFLS = KERNAL_0.JSETFLS +;; #ALIAS# JSETNAM = KERNAL_0.JSETNAM +;; #ALIAS# JGETIN = KERNAL_0.JGETIN +;; #ALIAS# JCHKIN = BASIC_0.proxy_B1_JCHKIN +;; #ALIAS# JCHRIN = BASIC_0.proxy_B1_JCHRIN +;; #ALIAS# JREADST = KERNAL_0.JREADST +;; #ALIAS# JSCREEN = KERNAL_0.JSCREEN +;; #ALIAS# SELDEV = KERNAL_0.SELDEV +;; #ALIAS# init_oldtxt = BASIC_0.init_oldtxt +;; #ALIAS# tmpstr_free_all_reset = BASIC_0.tmpstr_free_all_reset +;; #ALIAS# print_hex_byte = BASIC_0.proxy_B1_print_hex_byte +;; #ALIAS# print_integer = BASIC_0.proxy_B1_print_integer +;; #ALIAS# print_return = BASIC_0.proxy_B1_print_return +;; #ALIAS# print_space = BASIC_0.proxy_B1_print_space +;; #ALIAS# print_features = BASIC_0.proxy_B1_print_features +;; #ALIAS# do_error_fetch = BASIC_0.do_error_fetch +;; #ALIAS# do_basic_error = BASIC_0.do_basic_error +;; #ALIAS# str_rev_question = BASIC_0.str_rev_question +;; #ALIAS# fetch_character = BASIC_0.proxy_B1_fetch_character +;; #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 diff --git a/src/basic/board_crt/crt_proxies.s b/src/basic/board_crt/crt_proxies.s new file mode 100644 index 00000000..200367c0 --- /dev/null +++ b/src/basic/board_crt/crt_proxies.s @@ -0,0 +1,130 @@ +;; #LAYOUT# CRT BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE + +; +; Proxies for calling segment BASIC_0 and KERNAL_0 routines from BASIC_1 +; + +proxy_B1_peek_via_OLDTXT: + + jsr map_NORMAL + +!ifdef CONFIG_MEMORY_MODEL_60K { + !error "not implemented" +} else ifdef CONFIG_MEMORY_MODEL_46K_OR_50K { + jsr peek_under_roms_via_OLDTXT + cmp #$00 +} else { ; CONFIG_MEMORY_MODEL_38K + lda (OLDTXT),y +} + jmp map_BASIC_1 ; do not do 'bra' - we want this one as fast as possible + + +proxy_B1_poke_via_OLDTXT: + + jsr map_NORMAL +!ifdef CONFIG_MEMORY_MODEL_60K { + !error "not implemented" +} else { ; CONFIG_MEMORY_MODEL_38K || CONFIG_MEMORY_MODEL_46K || CONFIG_MEMORY_MODEL_50K + sta (OLDTXT),y +} + + jmp map_BASIC_1 + + +proxy_B1_JCLALL: + + jsr map_NORMAL + jsr JCLALL + jmp map_BASIC_1 + + +!ifdef CONFIG_DOS_WEDGE { + +proxy_B1_JCLOSE: + + jsr map_NORMAL + jsr JCLOSE + jmp map_BASIC_1 + +proxy_B1_JOPEN: + + jsr map_NORMAL + jsr JOPEN + jmp map_BASIC_1 +} + +proxy_B1_JCHKIN: + + jsr map_NORMAL + jsr JCHKIN + jmp map_BASIC_1 + +proxy_B1_JCHRIN: + + jsr map_NORMAL + jsr JCHRIN + jmp map_BASIC_1 + +proxy_B1_JCHROUT: + + jsr map_NORMAL + jsr JCHROUT + jmp map_BASIC_1 + +proxy_B1_print_hex_byte: + + jsr map_NORMAL + jsr print_hex_byte + jmp map_BASIC_1 + +proxy_B1_print_integer: + + jsr map_NORMAL + jsr print_integer + jmp map_BASIC_1 + +proxy_B1_print_return: + + jsr map_NORMAL + jsr print_return + jmp map_BASIC_1 + +proxy_B1_print_space: + + jsr map_NORMAL + jsr print_space + jmp map_BASIC_1 + +proxy_B1_plot_set: + + jsr map_NORMAL + jsr plot_set + jmp map_BASIC_1 + +!ifdef CONFIG_DOS_WEDGE { + +proxy_B1_fetch_character: + + jsr map_NORMAL + jsr fetch_character + jmp map_BASIC_1 + +proxy_B1_fetch_character_skip_spaces: + + jsr map_NORMAL + jsr fetch_character_skip_spaces + jmp map_BASIC_1 + +proxy_B1_fetch_uint8: + + jsr map_NORMAL + jsr fetch_uint8 + jmp map_BASIC_1 + +proxy_B1_shell_main_loop: + + jsr map_NORMAL + jmp shell_main_loop +} + diff --git a/src/basic/board_crt/dummy.s b/src/basic/board_crt/dummy.s deleted file mode 100644 index 3a3e191e..00000000 --- a/src/basic/board_crt/dummy.s +++ /dev/null @@ -1,4 +0,0 @@ -;; #LAYOUT# CRT BASIC_1 #TAKE -;; #LAYOUT# * * #IGNORE - - +nop diff --git a/src/basic/engine_editor/a533.linkprg.s b/src/basic/engine_editor/a533.linkprg.s index 8679e6a2..3e518f9e 100644 --- a/src/basic/engine_editor/a533.linkprg.s +++ b/src/basic/engine_editor/a533.linkprg.s @@ -1,5 +1,6 @@ ;; #LAYOUT# STD * #TAKE ;; #LAYOUT# CRT BASIC_0 #TAKE +;; #LAYOUT# CRT BASIC_1 #TAKE-FLOAT ;; #LAYOUT# M65 BASIC_0 #TAKE ;; #LAYOUT# M65 BASIC_1 #TAKE-FLOAT ;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 @@ -20,6 +21,12 @@ LINKPRG: jsr (VB1__LINKPRG) jmp map_NORMAL +} else ifdef SEGMENT_CRT_BASIC_0 { + + jsr map_BASIC_1 + jsr JB1__LINKPRG + jmp map_NORMAL + } else { ; Start by getting pointer to the first line @@ -31,6 +38,8 @@ linkprg_loop: !ifdef CONFIG_MB_M65 { jsr peek_via_OLDTXT +} else ifdef ROM_LAYOUT_CRT { + jsr peek_via_OLDTXT } else ifdef CONFIG_MEMORY_MODEL_60K { ldx #