From 82c5c92959356bd97c87baf5e5b25fbe965dd2f3 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Tue, 22 Sep 2020 19:24:06 +0200 Subject: [PATCH] initial strings suppport in config file --- src/,,config_custom.s | 25 +++++-------- src/,,config_generic.s | 23 ++++-------- src/,,config_mega65.s | 41 +++++++-------------- src/,,config_testing.s | 23 ++++-------- src/,,config_ultimate64.s | 23 ++++-------- tools/build_segment.cc | 76 +++++++++++++++++++++++++++++++++------ 6 files changed, 107 insertions(+), 104 deletions(-) diff --git a/src/,,config_custom.s b/src/,,config_custom.s index 478187ff..4ec8112f 100644 --- a/src/,,config_custom.s +++ b/src/,,config_custom.s @@ -15,7 +15,7 @@ ;; #CONFIG# PLATFORM_COMMODORE_64 YES ;; #CONFIG# BRAND_CUSTOM_BUILD YES -!macro CONFIG_CUSTOM_BRAND { !pet "custom build" } +;; #CONFIG# CUSTOM_BRAND "CUSTOM BUILD" ; --- Processor instruction set @@ -94,25 +94,16 @@ !pet "l" } -;; #CONFIG# KEYCMD_F1 YES -!macro CONFIG_KEYCMD_F1 { !pet "@" } -;; #CONFIG# KEYCMD_F2 NO -; !macro CONFIG_KEYCMD_F2 { !pet "" } -;; #CONFIG# KEYCMD_F3 YES -!macro CONFIG_KEYCMD_F3 { !pet "run:" } -;; #CONFIG# KEYCMD_F4 NO -; !macro CONFIG_KEYCMD_F4 { !pet "" } -;; #CONFIG# KEYCMD_F5 YES -!macro CONFIG_KEYCMD_F5 { !pet "load" } +;; #CONFIG# KEYCMD_F1 "@8$" +;; #CONFIG# KEYCMD_F2 "LOAD" +;; #CONFIG# KEYCMD_F3 "@9$" +;; #CONFIG# KEYCMD_F4 "RUN:" +;; #CONFIG# KEYCMD_F5 "@10$" ;; #CONFIG# KEYCMD_F6 NO -; !macro CONFIG_KEYCMD_F6 { !pet "" } -;; #CONFIG# KEYCMD_F7 YES -!macro CONFIG_KEYCMD_F7 { !pet "@$" } +;; #CONFIG# KEYCMD_F7 "@11$" ;; #CONFIG# KEYCMD_F8 NO -; !macro CONFIG_KEYCMD_F8 { !pet "" } -;; #CONFIG# KEYCMD_HELP YES -!macro CONFIG_KEYCMD_HELP { !pet "list" } +;; #CONFIG# KEYCMD_HELP "LIST" ;; #CONFIG# KEYCMD_F9 NO ;; #CONFIG# KEYCMD_F10 NO diff --git a/src/,,config_generic.s b/src/,,config_generic.s index b64297bc..97644990 100644 --- a/src/,,config_generic.s +++ b/src/,,config_generic.s @@ -82,25 +82,16 @@ !pet "l" } -;; #CONFIG# KEYCMD_F1 YES -!macro CONFIG_KEYCMD_F1 { !pet "@" } -;; #CONFIG# KEYCMD_F2 NO -; !macro CONFIG_KEYCMD_F2 { !pet "" } -;; #CONFIG# KEYCMD_F3 YES -!macro CONFIG_KEYCMD_F3 { !pet "run:" } -;; #CONFIG# KEYCMD_F4 NO -; !macro CONFIG_KEYCMD_F4 { !pet "" } -;; #CONFIG# KEYCMD_F5 YES -!macro CONFIG_KEYCMD_F5 { !pet "load" } +;; #CONFIG# KEYCMD_F1 "@8$" +;; #CONFIG# KEYCMD_F2 "LOAD" +;; #CONFIG# KEYCMD_F3 "@9$" +;; #CONFIG# KEYCMD_F4 "RUN:" +;; #CONFIG# KEYCMD_F5 "@10$" ;; #CONFIG# KEYCMD_F6 NO -; !macro CONFIG_KEYCMD_F6 { !pet "" } -;; #CONFIG# KEYCMD_F7 YES -!macro CONFIG_KEYCMD_F7 { !pet "@$" } +;; #CONFIG# KEYCMD_F7 "@11$" ;; #CONFIG# KEYCMD_F8 NO -; !macro CONFIG_KEYCMD_F8 { !pet "" } -;; #CONFIG# KEYCMD_HELP YES -!macro CONFIG_KEYCMD_HELP { !pet "list" } +;; #CONFIG# KEYCMD_HELP "LIST" ;; #CONFIG# KEYCMD_F9 NO ;; #CONFIG# KEYCMD_F10 NO diff --git a/src/,,config_mega65.s b/src/,,config_mega65.s index ca0f941d..26c4586c 100644 --- a/src/,,config_mega65.s +++ b/src/,,config_mega65.s @@ -61,38 +61,23 @@ !byte $5F !pet "l" } -;; #CONFIG# KEYCMD_F1 YES -!macro CONFIG_KEYCMD_F1 { !pet "@" } -;; #CONFIG# KEYCMD_F2 NO -; !macro CONFIG_KEYCMD_F2 { !pet "" } -;; #CONFIG# KEYCMD_F3 YES -!macro CONFIG_KEYCMD_F3 { !pet "run:" } -;; #CONFIG# KEYCMD_F4 NO -; !macro CONFIG_KEYCMD_F4 { !pet "" } -;; #CONFIG# KEYCMD_F5 YES -!macro CONFIG_KEYCMD_F5 { !pet "load" } +;; #CONFIG# KEYCMD_F1 "@8$" +;; #CONFIG# KEYCMD_F2 "LOAD" +;; #CONFIG# KEYCMD_F3 "@9$" +;; #CONFIG# KEYCMD_F4 "RUN:" +;; #CONFIG# KEYCMD_F5 "@10$" ;; #CONFIG# KEYCMD_F6 NO -; !macro CONFIG_KEYCMD_F6 { !pet "" } -;; #CONFIG# KEYCMD_F7 YES -!macro CONFIG_KEYCMD_F7 { !pet "@$" } +;; #CONFIG# KEYCMD_F7 "@11$" ;; #CONFIG# KEYCMD_F8 NO -; !macro CONFIG_KEYCMD_F8 { !pet "" } -;; #CONFIG# KEYCMD_HELP YES -!macro CONFIG_KEYCMD_HELP { !pet "list" } +;; #CONFIG# KEYCMD_HELP "LIST" -;; #CONFIG# KEYCMD_F9 YES -!macro CONFIG_KEYCMD_F9 { !pet "rem f9" } -;; #CONFIG# KEYCMD_F10 YES -!macro CONFIG_KEYCMD_F10 { !pet "rem f10" } -;; #CONFIG# KEYCMD_F11 YES -!macro CONFIG_KEYCMD_F11 { !pet "rem f11" } -;; #CONFIG# KEYCMD_F12 YES -!macro CONFIG_KEYCMD_F12 { !pet "rem f12" } -;; #CONFIG# KEYCMD_F13 YES -!macro CONFIG_KEYCMD_F13 { !pet "rem f13" } -;; #CONFIG# KEYCMD_F14 YES -!macro CONFIG_KEYCMD_F14 { !pet "rem f14" } +;; #CONFIG# KEYCMD_F9 "REM F9" +;; #CONFIG# KEYCMD_F10 "REM F10" +;; #CONFIG# KEYCMD_F11 "REM F11" +;; #CONFIG# KEYCMD_F12 "REM F12" +;; #CONFIG# KEYCMD_F13 "REM F13" +;; #CONFIG# KEYCMD_F14 "REM F14" ; --- Screen editor diff --git a/src/,,config_testing.s b/src/,,config_testing.s index 917d3ff9..4deed9b5 100644 --- a/src/,,config_testing.s +++ b/src/,,config_testing.s @@ -82,25 +82,16 @@ !pet "l" } -;; #CONFIG# KEYCMD_F1 YES -!macro CONFIG_KEYCMD_F1 { !pet "@" } -;; #CONFIG# KEYCMD_F2 NO -; !macro CONFIG_KEYCMD_F2 { !pet "" } -;; #CONFIG# KEYCMD_F3 YES -!macro CONFIG_KEYCMD_F3 { !pet "run:" } -;; #CONFIG# KEYCMD_F4 NO -; !macro CONFIG_KEYCMD_F4 { !pet "" } -;; #CONFIG# KEYCMD_F5 YES -!macro CONFIG_KEYCMD_F5 { !pet "load" } +;; #CONFIG# KEYCMD_F1 "@8$" +;; #CONFIG# KEYCMD_F2 "LOAD" +;; #CONFIG# KEYCMD_F3 "@9$" +;; #CONFIG# KEYCMD_F4 "RUN:" +;; #CONFIG# KEYCMD_F5 "@10$" ;; #CONFIG# KEYCMD_F6 NO -; !macro CONFIG_KEYCMD_F6 { !pet "" } -;; #CONFIG# KEYCMD_F7 YES -!macro CONFIG_KEYCMD_F7 { !pet "@$" } +;; #CONFIG# KEYCMD_F7 "@11$" ;; #CONFIG# KEYCMD_F8 NO -; !macro CONFIG_KEYCMD_F8 { !pet "" } -;; #CONFIG# KEYCMD_HELP YES -!macro CONFIG_KEYCMD_HELP { !pet "list" } +;; #CONFIG# KEYCMD_HELP "LIST" ;; #CONFIG# KEYCMD_F9 NO ;; #CONFIG# KEYCMD_F10 NO diff --git a/src/,,config_ultimate64.s b/src/,,config_ultimate64.s index e8c43789..290a927d 100644 --- a/src/,,config_ultimate64.s +++ b/src/,,config_ultimate64.s @@ -72,25 +72,16 @@ !pet "l" } -;; #CONFIG# KEYCMD_F1 YES -!macro CONFIG_KEYCMD_F1 { !pet "@" } -;; #CONFIG# KEYCMD_F2 NO -; !macro CONFIG_KEYCMD_F2 { !pet "" } -;; #CONFIG# KEYCMD_F3 YES -!macro CONFIG_KEYCMD_F3 { !pet "run:" } -;; #CONFIG# KEYCMD_F4 NO -; !macro CONFIG_KEYCMD_F4 { !pet "" } -;; #CONFIG# KEYCMD_F5 YES -!macro CONFIG_KEYCMD_F5 { !pet "load" } +;; #CONFIG# KEYCMD_F1 "@8$" +;; #CONFIG# KEYCMD_F2 "LOAD" +;; #CONFIG# KEYCMD_F3 "@9$" +;; #CONFIG# KEYCMD_F4 "RUN:" +;; #CONFIG# KEYCMD_F5 "@10$" ;; #CONFIG# KEYCMD_F6 NO -; !macro CONFIG_KEYCMD_F6 { !pet "" } -;; #CONFIG# KEYCMD_F7 YES -!macro CONFIG_KEYCMD_F7 { !pet "@$" } +;; #CONFIG# KEYCMD_F7 "@11$" ;; #CONFIG# KEYCMD_F8 NO -; !macro CONFIG_KEYCMD_F8 { !pet "" } -;; #CONFIG# KEYCMD_HELP YES -!macro CONFIG_KEYCMD_HELP { !pet "list" } +;; #CONFIG# KEYCMD_HELP "LIST" ;; #CONFIG# KEYCMD_F9 NO ;; #CONFIG# KEYCMD_F10 NO diff --git a/tools/build_segment.cc b/tools/build_segment.cc index 7ee19688..beebbe35 100644 --- a/tools/build_segment.cc +++ b/tools/build_segment.cc @@ -108,17 +108,18 @@ private: bool layoutProcessingDone; typedef struct ConfigEntry { - std::string key; - std::string valStr; // XXX add support for string values - uint32_t valInt; - bool valIntValid; + std::string key; + std::vector valBlob; + uint32_t valInt; + bool valIntValid; } ConfigEntry; std::map configEntries; void preprocessLine(const std::string &line, uint32_t lineNum); void preprocessLine_Alias(const std::list &tokens, std::list::iterator &iter, uint32_t lineNum); - void preprocessLine_Config(const std::list &tokens, std::list::iterator &iter, uint32_t lineNum); + void preprocessLine_Config(const std::list &tokens, std::list::iterator &iter, + const std::string &line, uint32_t lineNum); void preprocessLine_Import(const std::list &tokens, std::list::iterator &iter); void preprocessLine_Layout(const std::list &tokens, std::list::iterator &iter); }; @@ -712,8 +713,7 @@ void SourceFile::preprocess() } else if (configEntries.find(lineNum) != configEntries.end()) { - // XXX add spacing - // XXX add support for string values + outStream << "!set CONFIG_" << configEntries[lineNum].key << " = "; if (configEntries[lineNum].valIntValid) { @@ -726,6 +726,20 @@ void SourceFile::preprocess() outStream << " " << line; + if (!configEntries[lineNum].valBlob.empty()) + { + outStream << "\n!macro CONFIG_" << configEntries[lineNum].key << " { !byte "; + + bool first = true; + for (auto &byte : configEntries[lineNum].valBlob) + { + outStream << std::string(first ? "$" : ", $") << std::string((byte < 10) ? "0" : "") << + std::hex << (int) byte; + first = false; + } + outStream << " }"; + } + const std::string outString = outStream.str(); content.insert(content.end(), outString.begin(), outString.end()); } @@ -768,7 +782,7 @@ void SourceFile::preprocessLine(const std::string &line, uint32_t lineNum) // Check if supported directive if (iter->compare("#ALIAS#") == 0) preprocessLine_Alias(tokens, ++iter, lineNum); - else if (iter->compare("#CONFIG#") == 0) preprocessLine_Config(tokens, ++iter, lineNum); + else if (iter->compare("#CONFIG#") == 0) preprocessLine_Config(tokens, ++iter, line, lineNum); else if (iter->compare("#IMPORT#") == 0) preprocessLine_Import(tokens, ++iter); else if (iter->compare("#LAYOUT#") == 0) preprocessLine_Layout(tokens, ++iter); } @@ -803,7 +817,8 @@ void SourceFile::preprocessLine_Alias(const std::list &tokens, std: } } -void SourceFile::preprocessLine_Config(const std::list &tokens, std::list::iterator &iter, uint32_t lineNum) +void SourceFile::preprocessLine_Config(const std::list &tokens, std::list::iterator &iter, + const std::string &line, uint32_t lineNum) { if (ignore) return; @@ -821,6 +836,46 @@ void SourceFile::preprocessLine_Config(const std::list &tokens, std configEntries[lineNum].key = key; configEntries[lineNum].valIntValid = false; } + else if (valStr.length() > 1 && valStr[0] == '"') + { + // This is a string value + + auto pos = line.find('"', 0); + while (true) + { + char byte; + auto advance = [&byte, &line, &pos]() + { + if ((line.size() <= ++pos) || (line[pos] == '\n')) ERROR("syntax error, unfinished string in '#CONFIG#'"); + byte = line[pos]; + }; + + advance(); + + // Convert string from ASCII to PETSCII + + if (byte == '"') break; + if (byte == '\\') + { + advance(); + + if (byte == '"') + { + configEntries[lineNum].valBlob.push_back(byte); + continue; + } + + // XXX handle hex values + } + else if ((byte >= 0x20 && byte <= 0x5B) || byte == 0x5D) configEntries[lineNum].valBlob.push_back(byte); + else ERROR("syntax error, invalid character in string in '#CONFIG#'"); + } + + if (configEntries[lineNum].valBlob.empty()) ERROR("syntax error, empty string in '#CONFIG#'"); + + configEntries[lineNum].key = key; + configEntries[lineNum].valIntValid = false; + } else if (valStr.length() > 1 && valStr[0] == '$') { // This is a hexadecimal value @@ -857,8 +912,7 @@ void SourceFile::preprocessLine_Config(const std::list &tokens, std } else { - // XXX add support for string values - ERROR("syntax error, unknown key in '#CONFIG#'"); + ERROR("syntax error, unknown key in '#CONFIG#' line "); } }