From 678c38a3e0c342bfcc37ddc5cceaf2fd5d4e5239 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sat, 24 Oct 2020 09:08:57 +0200 Subject: [PATCH] reorganized extended BASIC tokens --- CONFIG.md | 4 ++ Makefile | 4 +- bin/README.md | 2 +- 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/basic_ultimate64_crt.rom | Bin 0 -> 8192 bytes ...nal_generic.crt => extrom_generic_crt.crt} | Bin 32896 -> 32896 bytes bin/extrom_ultimate64_crt.crt | Bin 0 -> 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/kernal_ultimate64_crt.rom | Bin 0 -> 8192 bytes bin/mega65.rom | Bin 131072 -> 131072 bytes bin/mega65_pxlfont.rom | Bin 131072 -> 131072 bytes doc/Development.md | 28 +++++---- doc/Extended-BASIC.md | 14 ++--- src/,,config_ultimate64_crt.s | 1 + src/basic/assets/packed_keywords_02.s | 12 ---- src/basic/assets/packed_keywords_03.s | 13 ---- src/basic/assets/packed_keywords_04.s | 7 +++ src/basic/assets/packed_keywords_06.s | 7 +++ .../basic_commands_01/cmd__jumptable_01.s | 42 ++++++++----- .../cmd_bload_bverify.s | 3 + .../cmd_bsave.s | 3 + .../cmd_clear.s | 3 + .../cmd_cold.s | 0 .../cmd_dispose.s | 0 .../cmd_mem.s | 0 .../cmd_merge.s | 3 + .../helper_ask_if_sure.s | 0 .../helper_bload_fetch_address.s | 3 + .../helper_bload_fetch_filename.s | 3 + .../helper_mem_tab_str.s | 0 .../helper_mem_tab_x.s | 0 .../helper_mem_tab_y.s | 0 .../basic_commands_02/cmd__jumptable_02.s | 49 --------------- .../basic_commands_03_m65/cmd__jumptable_03.s | 15 ----- .../basic_commands_04/cmd__jumptable_04.s | 29 +++++++++ .../cmd_sysinfo.s | 0 .../basic_functions_06/fun__jumptable_06.s | 28 +++++++++ src/basic/engine_editor/tokenise_line.s | 38 +++++------ .../engine_runtime/execute_line_statements.s | 59 ++++-------------- src/basic/print/list_single_line.s | 47 +++++++------- src/basic/print/print_packed_freq_string.s | 21 +++---- src/basic/wedge/wedge_tape.s | 8 +++ tools/generate_strings.cc | 49 +++++++-------- 47 files changed, 235 insertions(+), 260 deletions(-) create mode 100644 bin/basic_ultimate64_crt.rom rename bin/{external_generic.crt => extrom_generic_crt.crt} (93%) create mode 100644 bin/extrom_ultimate64_crt.crt create mode 100644 bin/kernal_ultimate64_crt.rom delete mode 100644 src/basic/assets/packed_keywords_02.s delete mode 100644 src/basic/assets/packed_keywords_03.s create mode 100644 src/basic/assets/packed_keywords_04.s create mode 100644 src/basic/assets/packed_keywords_06.s rename src/basic/{basic_commands_02 => basic_commands_01}/cmd_bload_bverify.s (96%) rename src/basic/{basic_commands_02 => basic_commands_01}/cmd_bsave.s (95%) rename src/basic/{basic_commands_02 => basic_commands_01}/cmd_clear.s (86%) rename src/basic/{basic_commands_02 => basic_commands_01}/cmd_cold.s (100%) rename src/basic/{basic_commands_02 => basic_commands_01}/cmd_dispose.s (100%) rename src/basic/{basic_commands_02 => basic_commands_01}/cmd_mem.s (100%) rename src/basic/{basic_commands_02 => basic_commands_01}/cmd_merge.s (96%) rename src/basic/{basic_commands_02 => basic_commands_01}/helper_ask_if_sure.s (100%) rename src/basic/{basic_commands_02 => basic_commands_01}/helper_bload_fetch_address.s (92%) rename src/basic/{basic_commands_02 => basic_commands_01}/helper_bload_fetch_filename.s (94%) rename src/basic/{basic_commands_02 => basic_commands_01}/helper_mem_tab_str.s (100%) rename src/basic/{basic_commands_02 => basic_commands_01}/helper_mem_tab_x.s (100%) rename src/basic/{basic_commands_02 => basic_commands_01}/helper_mem_tab_y.s (100%) delete mode 100644 src/basic/basic_commands_02/cmd__jumptable_02.s delete mode 100644 src/basic/basic_commands_03_m65/cmd__jumptable_03.s create mode 100644 src/basic/basic_commands_04/cmd__jumptable_04.s rename src/basic/{basic_commands_02 => basic_commands_04}/cmd_sysinfo.s (100%) create mode 100644 src/basic/basic_functions_06/fun__jumptable_06.s diff --git a/CONFIG.md b/CONFIG.md index 68fa3e88..c3033ba5 100644 --- a/CONFIG.md +++ b/CONFIG.md @@ -31,6 +31,10 @@ Since Open ROMs is highly modular, it should be possible to add other platforms Select if the ROM is going to be used exclusively on the specified motherboard. It prevents from enabling options not having sense, skips initialization of C128-only registers, and enables motherboard-specific features. +### `ROM_CRT` + +Has to be set for builds utilizing cartridge image as a ROM extension. + ## Brand Branding is only allowed for C64 platform, if no motherboard is specified. diff --git a/Makefile b/Makefile index bbb11c14..e746d3aa 100644 --- a/Makefile +++ b/Makefile @@ -15,10 +15,10 @@ SRCDIR_BASIC = $(SRCDIR_COMMON) \ src/basic/assets \ src/basic/basic_commands \ src/basic/basic_commands_01 \ - src/basic/basic_commands_02 \ - src/basic/basic_commands_03_m65 \ + src/basic/basic_commands_04 \ src/basic/basic_operators \ src/basic/basic_functions \ + src/basic/basic_functions_06 \ src/basic/board_crt \ src/basic/board_m65 \ src/basic/board_x16 \ diff --git a/bin/README.md b/bin/README.md index 93f2ac57..b7c980d7 100644 --- a/bin/README.md +++ b/bin/README.md @@ -22,7 +22,7 @@ For Ultimate 64 motherboard the following settings are recommended:
-The generic_crt ROM set is a special version of generic set, with some code moved to external ROM on the cartridge - thus, more features could be enabled. It needs all the 3 files (BASIC, Kernal, cartridge) to be operable. +The \*\_crt ROM set is a special version, with some code moved to external ROM on the cartridge - thus, more features could be enabled. It needs all the 3 files (BASIC, Kernal, cartridge) to be operable.
diff --git a/bin/basic_generic.rom b/bin/basic_generic.rom index 3683c857b914e350987e3e1859696a6dc8ee5aa3..6d8d0ed886a23c62adb0ea512c4714fed5176017 100644 GIT binary patch delta 3788 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 ZU1{j>iGkk>mp*q+Oq`raj3#2I{tM9|@?ih~ diff --git a/bin/basic_ultimate64.rom b/bin/basic_ultimate64.rom index af1dd73cc7cbb2925ee317f16ef0e675aa944486..029dbe3e781066aa520736c67dd87b360d56ec90 100644 GIT binary patch delta 3371 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 y2O*m8^NnOJd5@L0k$Dmjc9P-2VUoPyDI? diff --git a/bin/basic_ultimate64_crt.rom b/bin/basic_ultimate64_crt.rom new file mode 100644 index 0000000000000000000000000000000000000000..ca471e34c201bd566691800cd5c40e2fd806692c GIT binary patch literal 8192 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 literal 0 HcmV?d00001 diff --git a/bin/external_generic.crt b/bin/extrom_generic_crt.crt similarity index 93% rename from bin/external_generic.crt rename to bin/extrom_generic_crt.crt index a2524d6961da6541f5aaa6991586d22a54f03415..1dbfdc03e80510ded36b4350319410b12f96b2ed 100644 GIT binary patch delta 917 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 TFanGKBftnS0*t`_pTK_uUTD_z literal 0 HcmV?d00001 diff --git a/bin/kernal_generic.rom b/bin/kernal_generic.rom index 2f309c4ebda5e3cc3877c2c9dbb6d8282fb6bd5c..9d6d01f0f2a325c04c8ba8b718c56445d61796ec 100644 GIT binary patch delta 529 zcmZp0XmCjI*|ZFZ6b|m(Ag-`}{Zd{7W}oxRmL|4tUz*gqduej(9*KmNYORb5Sh_B{ z`)qg&W;1N8YPCH9BHi6Vk5H2*cQdK0v@B^2kXWje z8qlgVf$5lXf`ay*lMF!BZi`MfY+&};_rQm7(ZtnJ(xO{eEfqVdv_W`9tGGlabF0`i zh8Fjg46PnMrzR^fzUSzC;1lskL1@opaV9^uh64)(B5WpSGbw~Fl6)feL24_*2f@~W zt&FXKTbWvex;zwCEY4W<;>C*#k5)>yimeoD6;DW5$+*aI!AGCH{}m?hQeb;9f!XKM zGKHSU8<-VluV1OXOm~T%!j1nx(N)V5CO=>b7pvM0^|AX=*9)vCHo6~m1NwNfFSC8T zg2bW?Os%^T76|VQ+JAHBlMk#b8FRKj=@9tf6SWMaOTp(6$4d29MvVj?r_~-FK6AGv zc>m&OXnxJ$#meyiKhPfw7!{^I1cwCUnxzvBn0@{%S9rcn!RVpS`NxxAGh6AmD7Pvt zVA-hDn%e;+azI2jkl<`+&Dy9Wz`XLm4ls1`K*E_z6B809#u_MZv~9IK0VJ$IR{OYb rgStO!qSA>YnHRp#Q0ROxc{z(5pNXEEvz{RXg90-H5Ny88qALvmHg)0l delta 529 zcmZp0XmE&K$*8lEL1E%9g{R9E(icu(_Bp?-b(ccG!lhgaSN{XKtCl6KRBL5iz|wWm z-DkoBFq>gxRjcg@AYsR93lxJWU^tR^f!QbV@x~;DOaD&@d`$4!v}|$+i-DYi&m)eN z>aC0#2@2YKPBH)$9a(s?VFRTE!(YnOnuCF|@d^ zWN7v9IWbv*@jb`N$378{6r`6=7H9Hf`|91p$HXu>n@M3}g1TP)dXPN|lXoeYuLipI z(lUhu8-eusWk4@qH8Lc8KMSN_RPkz7@F2=A6>IwIwt`}HOY;-^B2K2;a zUuOIGXCN;u-jT3CcxTZ5n>(L;U|q?Wv;9ejzz3hGWvu}cOO;XsT9qa+9aB#5S+kIl zE9Hei!UBdxF+NvzE4c1axVQj_PWpUcKk55{6Xb@Ai+wil0+I_DT6X#*J(>KP*{a^> zCm%!e9R^QU2Kk4-Mfn)yT{?lxBR_SfAS>*VP_1v8G3>g>{Uhni_T(kKyi>@>P3k0 delta 197 zcmV;$06PDGK!8AyHVsF`MbHJvu}8&5Oi1IALtG1BtjU0|15Cc)Orw#iU_)0-)Vm-_ ztDpfOIONFy&;v|2sHKrG15BFZAQHSFIpItZ;i)Et0iXnm(ML>3nyE1F1tGxQT1DKF$ubX!Si)IJL*yz)u7i;&%TqE!`K+K- zAA!ldh=AW^e8VaO9^y|X8rVVBC|!ptCVS*%4o`$@-}$e)6!TRH-V_U?DGtUqJQy7< zL<)t%!<$+Qyvl<~6je6dANnSjMJ%6VV=jQmqk^~c8p7-QYKvk!wBwheZX=2)=eTGI ze%{wOIG1JA=sZYxJY*y-nyFJ??+kDsE)iE{LM+~S{lCCQX|NrU&SN}&j5}V*eO~@V z-EBTA2q8mUfK|Val|L-&D3xF-E>s}3*sA|p`_qebMihh7tu<;Bu<>5#y3^6EHUmq3 ZPUUTbquga58n8PU1|vpK;>lpE{{?odoa6ui delta 402 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 delta 2748 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 Qg3#@|G}?b@lqjD0Uve(!VgLXD diff --git a/bin/mega65_pxlfont.rom b/bin/mega65_pxlfont.rom index f0f7a8e17de6b19171d86c167e76175a16becef4..4c18426b18af275edf78f3993412b284301d5bd5 100644 GIT binary patch delta 2733 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 delta 2748 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 Qg3#@|G}?b@lqjD0Uve(!VgLXD diff --git a/doc/Development.md b/doc/Development.md index 000dc546..a63ed9b9 100644 --- a/doc/Development.md +++ b/doc/Development.md @@ -78,19 +78,21 @@ Make sure to read the main [README](../README.md) first - although any help with List of the most important make targets: -| target | description | -| :------------------ | :------------------------------------------------------------------------------ | -| `all` | builds all ROMs, places them in 'build' subdirectory | -| `clean` | removes all the compilation results and intermediate files | -| `updatebin` | upates ROMs in 'bin' subdirectory - with embedded version string, for release | -| `testsimilarity` | launches the similarity tool, see [README](../README.md) | -| `test` | builds the 'custom' configuration, launches it using VICE emulator | -| `test_generic` | builds the default ROMs, for generic C64/C128, launches using VICE | -| `test_generic_x128` | as above, but launches C128 emulator instead | -| `test_mega65` | builds the MEGA65 ROM, launches it using XEMU emulator | -| `test_ultimate64` | builds the Ultimate 64 configuration, launches it using VICE emulator | -| `test_hybrid` | builds a hybrid ROM (Open ROMs Kernal + original BASIC), launches it using VICE | -| `test_testing` | builds a rather odd testing configuration, launches it using VICE emulator | +| target | description | +| :-------------------- | :------------------------------------------------------------------------------ | +| `all` | builds all ROMs, places them in 'build' subdirectory | +| `clean` | removes all the compilation results and intermediate files | +| `updatebin` | upates ROMs in 'bin' subdirectory - with embedded version string, for release | +| `testsimilarity` | launches the similarity tool, see [README](../README.md) | +| `test` | builds the 'custom' configuration, launches it using VICE emulator | +| `test_generic` | builds the default ROMs, for generic C64/C128, launches using VICE | +| `test_generic_x128` | as above, but launches C128 emulator instead | +| `test_generic_crt` | builds the default ROM with extended cartridge image, launches using VICE | +| `test_mega65` | builds the MEGA65 ROM, launches it using XEMU emulator | +| `test_ultimate64` | builds the Ultimate 64 configuration, launches it using VICE | +| `test_ultimate64_crt` | as above, ROM with extended cartriodge image | +| `test_hybrid` | builds a hybrid ROM (Open ROMs Kernal + original BASIC), launches it using VICE | +| `test_testing` | builds a rather odd testing configuration, launches it using VICE | ### Code segments and ROM layouts diff --git a/doc/Extended-BASIC.md b/doc/Extended-BASIC.md index d8c6d046..1ea35116 100644 --- a/doc/Extended-BASIC.md +++ b/doc/Extended-BASIC.md @@ -53,19 +53,19 @@ Launches a built-in tape head alignment tool. Destroys program in memory. Press * if tape format autodetection is compiled-in, you can load file from tape using either device #1 (CBM compatible way) or from device #7 (in a way compatible with *Final* and *Action Replay* cartridges) * if autodetection is not available, than device #1 means normal CBM format, and device #7 means *Turbo Tape 64* format -### `MERGE "file_name" [, device_number]` (all) +### `MERGE "file_name" [, device_number]` (cart, MEGA65) Appends the BASIC program from a storage medium to the one currently present in memory. -### `BLOAD "file_name", device_number, start_address` (all) +### `BLOAD "file_name", device_number, start_address` (cart, MEGA65) Loads a binary file starting from the given memory location. Does not clear variables, does not perform BASIC program relinking, etc. NOTE: for now syntax differs from the BASIC V3.5+ - this will be changed once the necessary BASIC infrastructure is implemented. -### `BVERIFY "file_name", device_number, start_address` (all) +### `BVERIFY "file_name", device_number, start_address` (cart, MEGA65) Verify operation for the binary data starting from a given addres. NOTE: for now syntax differs from the BASIC V3.5+ - this will be changed once the necessary BASIC infrastructure is implemented. -### `BSAVE "file_name", device_number, start_address, end_address` (all) +### `BSAVE "file_name", device_number, start_address, end_address` (cart, MEGA65) Saves the binary data from the given memory area. NOTE: for now syntax differs from the BASIC V3.5+ - this will be changed once the necessary BASIC infrastructure is implemented. @@ -77,7 +77,7 @@ Resets the machine. In direct mode asks for confirmation first. ### `FAST`, `SLOW` (all) -Tries to switch the machine to turbo mode (or back to 1MHz operation mode) - details differ depending on the configured machine / motherboard. On MEGA65 motherboard this is not available in native mode, it is not designed to run in 1MHz due to using compound CPU instructions. +Tries to switch the machine to turbo mode (or back to 1MHz operation mode) - details differ depending on the configured machine / motherboard. On MEGA65 motherboard this is not available in native mode, it is not designed to run in 1MHz due to using compound CPU instructions usage. ### `OLD` (all) @@ -96,11 +96,11 @@ Displays BASIC memory usage information: Displays various system information. -### `CLEAR` (all) +### `CLEAR` (cart, MEGA65) Clears the screen content. -### `DISPOSE` (all) +### `DISPOSE` (cart, MEGA65) Runs the garbage collector - disposes outdated strings. diff --git a/src/,,config_ultimate64_crt.s b/src/,,config_ultimate64_crt.s index 290d2756..566868c0 100644 --- a/src/,,config_ultimate64_crt.s +++ b/src/,,config_ultimate64_crt.s @@ -7,6 +7,7 @@ ; Idea: ; - sane defaults for the Ultimate 64 FPGA computer +; - use RetroRelplay cartridge image as a ROM extension ; - do not enable features which are a significant compatibility risk diff --git a/src/basic/assets/packed_keywords_02.s b/src/basic/assets/packed_keywords_02.s deleted file mode 100644 index dc0e993e..00000000 --- a/src/basic/assets/packed_keywords_02.s +++ /dev/null @@ -1,12 +0,0 @@ -;; #LAYOUT# STD * #TAKE -;; #LAYOUT# CRT BASIC_1 #TAKE -;; #LAYOUT# M65 BASIC_1 #TAKE -;; #LAYOUT# X16 BASIC_0 #TAKE -;; #LAYOUT# * * #IGNORE - -!ifndef HAS_SMALL_BASIC { - -packed_freq_keywords_02: - - +PUT_PACKED_FREQ_keywords_02 -} diff --git a/src/basic/assets/packed_keywords_03.s b/src/basic/assets/packed_keywords_03.s deleted file mode 100644 index 916f9bdb..00000000 --- a/src/basic/assets/packed_keywords_03.s +++ /dev/null @@ -1,13 +0,0 @@ -;; #LAYOUT# STD * #TAKE -;; #LAYOUT# CRT BASIC_1 #TAKE -;; #LAYOUT# M65 BASIC_1 #TAKE -;; #LAYOUT# X16 BASIC_0 #TAKE -;; #LAYOUT# * * #IGNORE - -!ifdef CONFIG_MB_M65 { - -packed_freq_keywords_03: - - +PUT_PACKED_FREQ_keywords_03 - -} \ No newline at end of file diff --git a/src/basic/assets/packed_keywords_04.s b/src/basic/assets/packed_keywords_04.s new file mode 100644 index 00000000..d80ac41b --- /dev/null +++ b/src/basic/assets/packed_keywords_04.s @@ -0,0 +1,7 @@ +;; #LAYOUT# M65 BASIC_1 #TAKE +;; #LAYOUT# * * #IGNORE + + +packed_freq_keywords_04: + + +PUT_PACKED_FREQ_keywords_04 diff --git a/src/basic/assets/packed_keywords_06.s b/src/basic/assets/packed_keywords_06.s new file mode 100644 index 00000000..77d1eac9 --- /dev/null +++ b/src/basic/assets/packed_keywords_06.s @@ -0,0 +1,7 @@ +;; #LAYOUT# M65 BASIC_1 #TAKE +;; #LAYOUT# * * #IGNORE + + +packed_freq_keywords_06: + + +PUT_PACKED_FREQ_keywords_06 diff --git a/src/basic/basic_commands_01/cmd__jumptable_01.s b/src/basic/basic_commands_01/cmd__jumptable_01.s index 31ebb526..ad3a7490 100644 --- a/src/basic/basic_commands_01/cmd__jumptable_01.s +++ b/src/basic/basic_commands_01/cmd__jumptable_01.s @@ -6,33 +6,42 @@ ; Jumptable for BASIC commands with tokens prefixed by $01 ; +!set ITEM_01 = cmd_slow +!set ITEM_02 = cmd_fast +!set ITEM_03 = cmd_old -!set ITEM_00 = cmd_slow -!set ITEM_01 = cmd_fast -!set ITEM_02 = cmd_old +!ifndef HAS_SMALL_BASIC { - ; NOTE! These commands are temporarily placed here, they should be a part of list 02! +!set ITEM_04 = cmd_clear +!set ITEM_05 = varstr_garbage_collect ; cmd_dispose +!set ITEM_06 = cmd_merge +!set ITEM_07 = cmd_bload +!set ITEM_08 = cmd_bsave +!set ITEM_09 = cmd_bverify +!set ITEM_0A = cmd_cold +!set ITEM_0B = cmd_mem -!set ITEM_03 = cmd_merge +} -!set ITEM_04 = cmd_bload -!set ITEM_05 = cmd_bsave -!set ITEM_06 = cmd_bverify - -!set ITEM_07 = cmd_clear -!set ITEM_08 = varstr_garbage_collect ; cmd_dispose !ifndef HAS_OPCODES_65C02 { command_01_jumptable_lo: - !byte <(ITEM_00-1), <(ITEM_01-1), <(ITEM_02-1), <(ITEM_03-1), <(ITEM_04-1), <(ITEM_05-1), <(ITEM_06-1), <(ITEM_07-1), <(ITEM_08-1) + !byte <(ITEM_01-1), <(ITEM_02-1), <(ITEM_03-1) +!ifndef HAS_SMALL_BASIC { + !byte <(ITEM_04-1), <(ITEM_05-1), <(ITEM_06-1), <(ITEM_07-4), <(ITEM_08-1), <(ITEM_09-1), <(ITEM_0A-1), <(ITEM_0B-1) +} command_01_jumptable_hi: - !byte >(ITEM_00-1), >(ITEM_01-1), >(ITEM_02-1), >(ITEM_03-1), >(ITEM_04-1), >(ITEM_05-1), >(ITEM_06-1), >(ITEM_07-1), >(ITEM_08-1) + !byte >(ITEM_01-1), >(ITEM_02-1), >(ITEM_03-1) + +!ifndef HAS_SMALL_BASIC { + !byte >(ITEM_04-1), >(ITEM_05-1), >(ITEM_06-1), >(ITEM_07-4), >(ITEM_08-1), >(ITEM_09-1), >(ITEM_0A-1), >(ITEM_0B-1) +} } else { ; HAS_OPCODES_65C02 @@ -40,5 +49,10 @@ command_01_jumptable: ; Note: 65C02 has the page boundary vector bug fixed! - !word ITEM_00, ITEM_01, ITEM_02, ITEM_03, ITEM_04, ITEM_05, ITEM_06, ITEM_07, ITEM_08 + !word ITEM_01, ITEM_02, ITEM_03 + +!ifndef HAS_SMALL_BASIC { + !word ITEM_04, ITEM_05, ITEM_06, ITEM_07, ITEM_08, ITEM_09, ITEM_0A, ITEM_0B +} + } diff --git a/src/basic/basic_commands_02/cmd_bload_bverify.s b/src/basic/basic_commands_01/cmd_bload_bverify.s similarity index 96% rename from src/basic/basic_commands_02/cmd_bload_bverify.s rename to src/basic/basic_commands_01/cmd_bload_bverify.s index 87ab76d8..2e31c215 100644 --- a/src/basic/basic_commands_02/cmd_bload_bverify.s +++ b/src/basic/basic_commands_01/cmd_bload_bverify.s @@ -3,6 +3,8 @@ ;; #LAYOUT# * * #IGNORE +!ifndef HAS_SMALL_BASIC { + cmd_bverify: ; LOAD and VERIFY are very similar, from BASIC perspective there is almost no difference; @@ -40,3 +42,4 @@ cmd_bload: ; Execute next statement rts +} \ No newline at end of file diff --git a/src/basic/basic_commands_02/cmd_bsave.s b/src/basic/basic_commands_01/cmd_bsave.s similarity index 95% rename from src/basic/basic_commands_02/cmd_bsave.s rename to src/basic/basic_commands_01/cmd_bsave.s index f702a295..9a6ba5c9 100644 --- a/src/basic/basic_commands_02/cmd_bsave.s +++ b/src/basic/basic_commands_01/cmd_bsave.s @@ -3,6 +3,8 @@ ;; #LAYOUT# * * #IGNORE +!ifndef HAS_SMALL_BASIC { + cmd_bsave: ; Set default device and secondary address @@ -40,3 +42,4 @@ cmd_bsave: ; Perform SAVE - reuse regular command jmp cmd_save_do +} \ No newline at end of file diff --git a/src/basic/basic_commands_02/cmd_clear.s b/src/basic/basic_commands_01/cmd_clear.s similarity index 86% rename from src/basic/basic_commands_02/cmd_clear.s rename to src/basic/basic_commands_01/cmd_clear.s index a4af3508..1f4333db 100644 --- a/src/basic/basic_commands_02/cmd_clear.s +++ b/src/basic/basic_commands_01/cmd_clear.s @@ -3,8 +3,11 @@ ;; #LAYOUT# * * #IGNORE +!ifndef HAS_SMALL_BASIC { + cmd_clear: ; XXX in the future add separate implementation for graphics screen jmp clear_screen +} diff --git a/src/basic/basic_commands_02/cmd_cold.s b/src/basic/basic_commands_01/cmd_cold.s similarity index 100% rename from src/basic/basic_commands_02/cmd_cold.s rename to src/basic/basic_commands_01/cmd_cold.s diff --git a/src/basic/basic_commands_02/cmd_dispose.s b/src/basic/basic_commands_01/cmd_dispose.s similarity index 100% rename from src/basic/basic_commands_02/cmd_dispose.s rename to src/basic/basic_commands_01/cmd_dispose.s diff --git a/src/basic/basic_commands_02/cmd_mem.s b/src/basic/basic_commands_01/cmd_mem.s similarity index 100% rename from src/basic/basic_commands_02/cmd_mem.s rename to src/basic/basic_commands_01/cmd_mem.s diff --git a/src/basic/basic_commands_02/cmd_merge.s b/src/basic/basic_commands_01/cmd_merge.s similarity index 96% rename from src/basic/basic_commands_02/cmd_merge.s rename to src/basic/basic_commands_01/cmd_merge.s index 75e5bc44..e9740c36 100644 --- a/src/basic/basic_commands_02/cmd_merge.s +++ b/src/basic/basic_commands_01/cmd_merge.s @@ -3,6 +3,8 @@ ;; #LAYOUT# * * #IGNORE +!ifndef HAS_SMALL_BASIC { + cmd_merge: lda #$00 ; mark operation as LOAD @@ -45,3 +47,4 @@ cmd_merge_no_error: ; Relink loaded program, clear variables, execute next statement jmp update_LINKPRG_VARTAB_do_clr +} \ No newline at end of file diff --git a/src/basic/basic_commands_02/helper_ask_if_sure.s b/src/basic/basic_commands_01/helper_ask_if_sure.s similarity index 100% rename from src/basic/basic_commands_02/helper_ask_if_sure.s rename to src/basic/basic_commands_01/helper_ask_if_sure.s diff --git a/src/basic/basic_commands_02/helper_bload_fetch_address.s b/src/basic/basic_commands_01/helper_bload_fetch_address.s similarity index 92% rename from src/basic/basic_commands_02/helper_bload_fetch_address.s rename to src/basic/basic_commands_01/helper_bload_fetch_address.s index f3ab147f..940ec192 100644 --- a/src/basic/basic_commands_02/helper_bload_fetch_address.s +++ b/src/basic/basic_commands_01/helper_bload_fetch_address.s @@ -7,6 +7,8 @@ ; +!ifndef HAS_SMALL_BASIC { + helper_bload_fetch_address: jsr injest_comma @@ -20,3 +22,4 @@ helper_bload_fetch_address: ldy LINNUM+1 rts +} \ No newline at end of file diff --git a/src/basic/basic_commands_02/helper_bload_fetch_filename.s b/src/basic/basic_commands_01/helper_bload_fetch_filename.s similarity index 94% rename from src/basic/basic_commands_02/helper_bload_fetch_filename.s rename to src/basic/basic_commands_01/helper_bload_fetch_filename.s index e1b238de..6ad5ad74 100644 --- a/src/basic/basic_commands_02/helper_bload_fetch_filename.s +++ b/src/basic/basic_commands_01/helper_bload_fetch_filename.s @@ -7,6 +7,8 @@ ; +!ifndef HAS_SMALL_BASIC { + helper_bload_fetch_filename: ; Fetch the file name @@ -24,3 +26,4 @@ helper_bload_fetch_filename: sta FNLEN @1: rts +} \ No newline at end of file diff --git a/src/basic/basic_commands_02/helper_mem_tab_str.s b/src/basic/basic_commands_01/helper_mem_tab_str.s similarity index 100% rename from src/basic/basic_commands_02/helper_mem_tab_str.s rename to src/basic/basic_commands_01/helper_mem_tab_str.s diff --git a/src/basic/basic_commands_02/helper_mem_tab_x.s b/src/basic/basic_commands_01/helper_mem_tab_x.s similarity index 100% rename from src/basic/basic_commands_02/helper_mem_tab_x.s rename to src/basic/basic_commands_01/helper_mem_tab_x.s diff --git a/src/basic/basic_commands_02/helper_mem_tab_y.s b/src/basic/basic_commands_01/helper_mem_tab_y.s similarity index 100% rename from src/basic/basic_commands_02/helper_mem_tab_y.s rename to src/basic/basic_commands_01/helper_mem_tab_y.s diff --git a/src/basic/basic_commands_02/cmd__jumptable_02.s b/src/basic/basic_commands_02/cmd__jumptable_02.s deleted file mode 100644 index d51a332d..00000000 --- a/src/basic/basic_commands_02/cmd__jumptable_02.s +++ /dev/null @@ -1,49 +0,0 @@ -;; #LAYOUT# STD * #TAKE -;; #LAYOUT# * BASIC_0 #TAKE -;; #LAYOUT# * * #IGNORE - -; -; Jumptable for BASIC commands with tokens prefixed by $02 -; - -!ifndef HAS_SMALL_BASIC { - - ; NOTE! These commands are temporarily placed in list 01! - - ; cmd_merge, - - ; cmd_bload, - ; cmd_bsave, - ; cmd_bverify, - - ; cmd_clear, - ; varstr_garbage_collect, ; cmd_dispose - -!set ITEM_00 = cmd_cold -!set ITEM_01 = cmd_mem - -!ifdef CONFIG_MB_M65 { -!set ITEM_02 = cmd_sysinfo -} - -!ifndef HAS_OPCODES_65C02 { - -command_02_jumptable_lo: - - !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) - !ifdef CONFIG_MB_M65 { !byte >(ITEM_02-1) } - -} else { ; HAS_OPCODES_65C02 - -command_02_jumptable: - - ; Note: 65C02 has the page boundary vector bug fixed! - - !word ITEM_00, ITEM_01 - !ifdef CONFIG_MB_M65 { !word ITEM_02 } -} } diff --git a/src/basic/basic_commands_03_m65/cmd__jumptable_03.s b/src/basic/basic_commands_03_m65/cmd__jumptable_03.s deleted file mode 100644 index cd3b7b54..00000000 --- a/src/basic/basic_commands_03_m65/cmd__jumptable_03.s +++ /dev/null @@ -1,15 +0,0 @@ -;; #LAYOUT# M65 BASIC_0 #TAKE -;; #LAYOUT# * * #IGNORE - -; -; Jumptable for BASIC commands with tokens prefixed by $03 -; - -!set ITEM_00 = cmd_rem ; XXX just for testing - - -command_03_jumptable: - - ; Note: 65C02 has the page boundary vector bug fixed! - - !word ITEM_00 diff --git a/src/basic/basic_commands_04/cmd__jumptable_04.s b/src/basic/basic_commands_04/cmd__jumptable_04.s new file mode 100644 index 00000000..4b623071 --- /dev/null +++ b/src/basic/basic_commands_04/cmd__jumptable_04.s @@ -0,0 +1,29 @@ +;; #LAYOUT# M65 * #TAKE +;; #LAYOUT# * * #IGNORE + +; +; Jumptable for BASIC commands with tokens prefixed by $04 +; + +!set ITEM_01 = cmd_sysinfo + + + +!ifndef HAS_OPCODES_65C02 { + +command_04_jumptable_lo: + + !byte <(ITEM_01-1) + +command_04_jumptable_hi: + + !byte >(ITEM_01-1) + +} else { ; HAS_OPCODES_65C02 + +command_04_jumptable: + + ; Note: 65C02 has the page boundary vector bug fixed! + + !word ITEM_01 +} diff --git a/src/basic/basic_commands_02/cmd_sysinfo.s b/src/basic/basic_commands_04/cmd_sysinfo.s similarity index 100% rename from src/basic/basic_commands_02/cmd_sysinfo.s rename to src/basic/basic_commands_04/cmd_sysinfo.s diff --git a/src/basic/basic_functions_06/fun__jumptable_06.s b/src/basic/basic_functions_06/fun__jumptable_06.s new file mode 100644 index 00000000..63213301 --- /dev/null +++ b/src/basic/basic_functions_06/fun__jumptable_06.s @@ -0,0 +1,28 @@ +;; #LAYOUT# M65 BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE + +; +; Jumptable for BASIC commands with tokens prefixed by $03 +; + +!set ITEM_01 = do_NOT_IMPLEMENTED_error ; just for testing + + +!ifndef HAS_OPCODES_65C02 { + +function_06_jumptable_lo: + + !byte <(ITEM_01-1) + +function_06_jumptable_hi: + + !byte >(ITEM_01-1) + +} else { ; HAS_OPCODES_65C02 + +function_06_jumptable: + + ; Note: 65C02 has the page boundary vector bug fixed! + + !word ITEM_01 +} diff --git a/src/basic/engine_editor/tokenise_line.s b/src/basic/engine_editor/tokenise_line.s index 2144abd8..500c4714 100644 --- a/src/basic/engine_editor/tokenise_line.s +++ b/src/basic/engine_editor/tokenise_line.s @@ -92,26 +92,23 @@ tokenise_line_loop: jsr tk_search bcc tokenise_line_keyword_01 ; branch if keyword identified -!ifndef HAS_SMALL_BASIC { - - lda #packed_freq_keywords_02 - sta FRESPC+1 - - jsr tk_search - bcc tokenise_line_keyword_02 ; branch if keyword identified -} - !ifdef CONFIG_MB_M65 { - lda #packed_freq_keywords_03 + lda #>packed_freq_keywords_04 sta FRESPC+1 jsr tk_search - bcc tokenise_line_keyword_03 ; branch if keyword identified + bcc tokenise_line_keyword_04 ; branch if keyword identified + + lda #packed_freq_keywords_06 + sta FRESPC+1 + + jsr tk_search + bcc tokenise_line_keyword_06 ; branch if keyword identified } ; Shorten packed keyword candidate and try again @@ -189,23 +186,18 @@ tokenise_line_char: !ifdef CONFIG_MB_M65 { -tokenise_line_keyword_03: +tokenise_line_keyword_04: ; Store the token list index - lda #$03 + lda #$04 +skip_2_bytes_trash_nvz - ; FALLTROUGH -} - -!ifndef HAS_SMALL_BASIC { - -tokenise_line_keyword_02: +tokenise_line_keyword_06: ; Store the token list index - lda #$02 + lda #$06 +skip_2_bytes_trash_nvz ; FALLTROUGH diff --git a/src/basic/engine_runtime/execute_line_statements.s b/src/basic/engine_runtime/execute_line_statements.s index 1c500524..ea128073 100644 --- a/src/basic/engine_runtime/execute_line_statements.s +++ b/src/basic/engine_runtime/execute_line_statements.s @@ -39,23 +39,19 @@ execute_statements: ; Check if token is valid for execution -!ifdef HAS_SMALL_BASIC { +!ifndef CONFIG_MB_M65 { cpx #$01 beq execute_statements_01 } else { -!ifdef CONFIG_MB_M65 { - cpx #$04 -} else { - cpx #$03 -} + cpx #$05 bcc execute_statements_extended } cpx #$CB - +beq cmd_go ; 'GO' command has a strange token, placed after function tokens + +beq cmd_go ; 'GO' command has a strange token, placed after function tokens cpx #$7F +bcc execute_statements_var_assign ; not a token - try variable assign @@ -84,25 +80,17 @@ execute_statements: jmp (command_jumptable, x) } -!ifndef HAS_SMALL_BASIC { +!ifdef CONFIG_MB_M65 { execute_statements_extended: ; Support for extended BASIC commands - ; XXX consider jumpable here - cpx #$01 beq execute_statements_01 - cpx #$02 - beq execute_statements_02 - -!ifdef CONGIH_MB_M65 { - - cpx #$03 - beq execute_statements_03 -} + cpx #$04 + beq execute_statements_04 jmp do_SYNTAX_error } @@ -141,9 +129,9 @@ execute_statements_01: jmp (command_01_jumptable - 2, x) } -!ifndef HAS_SMALL_BASIC { +!ifdef CONFIG_MB_M65 { -execute_statements_02: +execute_statements_04: ; Get the sub-token, check that it is valid @@ -151,7 +139,7 @@ execute_statements_02: cmp #$00 +beq do_SYNTAX_error - cmp #(TK__MAXTOKEN_keywords_02+1) + cmp #(TK__MAXTOKEN_keywords_04+1) +bcs do_SYNTAX_error ; Execute command @@ -161,9 +149,9 @@ execute_statements_02: ; Get the jump table entry for it, push it on the stack, and then RTS to start it. tax - lda command_02_jumptable_hi - 1, x + lda command_04_jumptable_hi - 1, x pha - lda command_02_jumptable_lo - 1, x + lda command_04_jumptable_lo - 1, x pha rts @@ -174,31 +162,10 @@ execute_statements_02: asl tax - jmp (command_02_jumptable - 2, x) + jmp (command_04_jumptable - 2, x) } -} ; !HAS_SMALL_BASIC - -!ifdef CONFIG_MB_M65 { - -execute_statements_03: - - ; Get the sub-token, check that it is valid - - jsr fetch_character - cmp #$00 - +beq do_SYNTAX_error - - cmp #(TK__MAXTOKEN_keywords_03+1) - +bcs do_SYNTAX_error - - ; Use jumptable to go to the command routine - - asl - tax - jmp (command_03_jumptable - 2, x) - -} ; CONFIG_MB_M65 +} execute_statements_end_of_line: diff --git a/src/basic/print/list_single_line.s b/src/basic/print/list_single_line.s index 485f2a16..bd2cbd31 100644 --- a/src/basic/print/list_single_line.s +++ b/src/basic/print/list_single_line.s @@ -104,13 +104,11 @@ list_not_quote: ; Check for extended BASIC tokens cmp #$01 beq list_display_token_01 -!ifndef HAS_SMALL_BASIC { - cmp #$02 - beq list_display_token_02 -} !ifdef CONFIG_MB_M65 { - cmp #$03 - beq list_display_token_03 + cmp #$04 + beq list_display_token_04 + cmp #$06 + beq list_display_token_06 } ; Check for literals @@ -232,37 +230,34 @@ list_display_token_ext_done: ; Next iteration +bra list_not_rem -!ifndef HAS_SMALL_BASIC { - -list_display_token_02: - - ; Display a 2-byte token - for extended BASIC - jsr list_fetch_subtoken - - ; Check if token is known - cpx #TK__MAXTOKEN_keywords_02 - bcs list_is_unknown - - ; Now ask for it to be printed - +phy_trash_a - jsr print_packed_keyword_02 - +bra list_display_token_ext_done -} - !ifdef CONFIG_MB_M65 { -list_display_token_03: +list_display_token_04: ; Display a 2-byte token - for extended BASIC jsr list_fetch_subtoken ; Check if token is known - cpx #TK__MAXTOKEN_keywords_03 + cpx #TK__MAXTOKEN_keywords_04 bcs list_is_unknown ; Now ask for it to be printed +phy_trash_a - jsr print_packed_keyword_03 + jsr print_packed_keyword_04 + +bra list_display_token_ext_done + +list_display_token_06: + + ; Display a 2-byte token - for extended BASIC + jsr list_fetch_subtoken + + ; Check if token is known + cpx #TK__MAXTOKEN_keywords_06 + bcs list_is_unknown + + ; Now ask for it to be printed + +phy_trash_a + jsr print_packed_keyword_06 +bra list_display_token_ext_done } diff --git a/src/basic/print/print_packed_freq_string.s b/src/basic/print/print_packed_freq_string.s index 882bf26d..cc46cdc1 100644 --- a/src/basic/print/print_packed_freq_string.s +++ b/src/basic/print/print_packed_freq_string.s @@ -59,21 +59,18 @@ print_packed_keyword_01: ; .X - token number ldy #>packed_freq_keywords_01 bne print_freq_packed_string ; branch always -!ifndef HAS_SMALL_BASIC { - -print_packed_keyword_02: ; .X - token number - - lda #packed_freq_keywords_02 - bne print_freq_packed_string ; branch always -} - !ifdef CONFIG_MB_M65 { -print_packed_keyword_03: ; .X - token number +print_packed_keyword_04: ; .X - token number - lda #packed_freq_keywords_03 + lda #packed_freq_keywords_04 + bne print_freq_packed_string ; branch always + +print_packed_keyword_06: ; .X - token number + + lda #packed_freq_keywords_06 bne print_freq_packed_string ; branch always } diff --git a/src/basic/wedge/wedge_tape.s b/src/basic/wedge/wedge_tape.s index 54926c89..0b83dc15 100644 --- a/src/basic/wedge/wedge_tape.s +++ b/src/basic/wedge/wedge_tape.s @@ -19,8 +19,12 @@ wedge_tape: cmp #$4C ; 'L' beq wedge_arrow_L + +!ifndef HAS_SMALL_BASIC { + cmp #$4D ; 'M' beq wedge_arrow_M +} !ifdef CONFIG_TAPE_HEAD_ALIGN { @@ -68,6 +72,9 @@ wedge_arrow_L: jmp cmd_load_got_params + +!ifndef HAS_SMALL_BASIC { + wedge_arrow_M: jsr wedge_tape_prepare_load @@ -77,5 +84,6 @@ wedge_arrow_M: ; Perform merging jmp cmd_merge_got_params +} } ; CONFIG_TAPE_WEDGE diff --git a/tools/generate_strings.cc b/tools/generate_strings.cc index 074393b4..17440485 100644 --- a/tools/generate_strings.cc +++ b/tools/generate_strings.cc @@ -174,7 +174,7 @@ const StringEntryList GLOBAL_Keywords_V2 = { ListType::KEYWORDS, "keywords_V2", { true, true, true, true, true, "KV2_CB", "GO", 0 }, // https://en.wikipedia.org/wiki/Goto } }; -// extended BASIC keywords - list reserved for small BASIC commands, suitable for inclusion in non-extended ROMs +// extended BASIC keywords - list reserved for small BASIC commands, suitable for inclusion in all machines with extended ROM const StringEntryList GLOBAL_Keywords_01 = { ListType::KEYWORDS, "keywords_01", { @@ -182,37 +182,33 @@ const StringEntryList GLOBAL_Keywords_01 = { ListType::KEYWORDS, "keywords_01", { true, true, true, true, true, "K01_01", "SLOW", }, // https://en.wikipedia.org/wiki/Sinclair_BASIC - ZX81 variant { true, true, true, true, true, "K01_02", "FAST", }, // https://en.wikipedia.org/wiki/Sinclair_BASIC - ZX81 variant { true, true, true, true, true, "K01_03", "OLD", }, // Not present in CBM BASIC dialects, but common to some extensions (*) - - // (*) see https://sourceforge.net/p/vice-emu/code/HEAD/tree/trunk/vice/src/petcat.c - - // NOTE! These commands are temporarily placed here, they should be a part of list 02! - - { true, true, true, true, true, "K02_01", "MERGE", }, // Not present in CBM BASIC dialects, but common to some extensions (*) - { true, true, true, true, true, "K02_02", "BLOAD", }, // http://www.antonis.de/qbebooks/gwbasman/bload.html - { true, true, true, true, true, "K02_03", "BSAVE", }, // http://www.antonis.de/qbebooks/gwbasman/bsave.html - { true, true, true, true, true, "K02_04", "BVERIFY", }, - { true, true, true, true, true, "K02_05", "CLEAR", }, // Not present in CBM BASIC dialects, Open ROMs specific - { true, true, true, true, true, "K02_06", "DISPOSE", }, // Not present in CBM BASIC dialects, Open ROMs specific -} }; - -// extended BASIC keywords - list reserved for generic (mostly hardware independent) BASIC commands - -const StringEntryList GLOBAL_Keywords_02 = { ListType::KEYWORDS, "keywords_02", -{ - // STD CRT M65 U64 X16 - { false, true, true, false, false, "K02_07", "COLD", }, // Not present in CBM BASIC dialects, but common to some extensions (*) - { false, true, true, false, false, "K02_08", "MEM", }, // Not present in CBM BASIC dialects, Open ROMs specific - { false, false, true, false, false, "K02_09", "SYSINFO", }, // Not present in CBM BASIC dialects, Open ROMs specific + { false, true, true, true, false, "K01_04", "CLEAR", }, // Not present in CBM BASIC dialects, Open ROMs specific + { false, true, true, true, false, "K01_05", "DISPOSE", }, // Not present in CBM BASIC dialects, Open ROMs specific + { false, true, true, true, false, "K01_06", "MERGE", }, // Not present in CBM BASIC dialects, but common to some extensions (*) + { false, true, true, true, false, "K01_07", "BLOAD", }, // http://www.antonis.de/qbebooks/gwbasman/bload.html + { false, true, true, true, false, "K01_08", "BSAVE", }, // http://www.antonis.de/qbebooks/gwbasman/bsave.html + { false, true, true, true, false, "K01_09", "BVERIFY", }, + { false, true, true, true, false, "K01_0A", "COLD", }, // Not present in CBM BASIC dialects, but common to some extensions (*) + { false, true, true, true, false, "K01_0B", "MEM", }, // Not present in CBM BASIC dialects, Open ROMs specific // (*) see https://sourceforge.net/p/vice-emu/code/HEAD/tree/trunk/vice/src/petcat.c } }; // extended BASIC keywords - list reserved for hardware dependent BASIC commands -const StringEntryList GLOBAL_Keywords_03_M65 = { ListType::KEYWORDS, "keywords_03", +const StringEntryList GLOBAL_Keywords_04 = { ListType::KEYWORDS, "keywords_04", { // STD CRT M65 U64 X16 - { false, false, true, false, false, "K03_01", "TEST", }, // Not present in CBM BASIC dialects, Open ROMs specific + { false, false, true, false, false, "K04_01", "SYSINFO", }, // Not present in CBM BASIC dialects, Open ROMs specific + +} }; + +// extended BASIC keywords - list reserved for functions + +const StringEntryList GLOBAL_Keywords_06 = { ListType::KEYWORDS, "keywords_06", +{ + // STD CRT M65 U64 X16 + { false, false, true, false, false, "K06_01", "TEST", }, // Not present in CBM BASIC dialects, Open ROMs specific } }; @@ -1846,8 +1842,8 @@ void writeStrings() dataSetM65.addStrings(GLOBAL_Keywords_V2); dataSetM65.addStrings(GLOBAL_Keywords_01); - dataSetM65.addStrings(GLOBAL_Keywords_02); - dataSetM65.addStrings(GLOBAL_Keywords_03_M65); + dataSetM65.addStrings(GLOBAL_Keywords_04); + dataSetM65.addStrings(GLOBAL_Keywords_06); dataSetM65.addStrings(GLOBAL_Errors); dataSetM65.addStrings(GLOBAL_MiscStrings); @@ -1863,7 +1859,6 @@ void writeStrings() dataSetCRT.addStrings(GLOBAL_Keywords_V2); dataSetCRT.addStrings(GLOBAL_Keywords_01); - dataSetCRT.addStrings(GLOBAL_Keywords_02); dataSetCRT.addStrings(GLOBAL_Errors); dataSetCRT.addStrings(GLOBAL_MiscStrings);