diff --git a/.gitignore b/.gitignore index ba5cc46..1c6fdaf 100644 --- a/.gitignore +++ b/.gitignore @@ -6,7 +6,8 @@ *.s19 build/ map.txt -bbhashtool +bbmkcmds # Build system generated files src/version.s +src/bbcmds.s diff --git a/bbhashtool.c b/bbhashtool.c deleted file mode 100644 index 5c678a3..0000000 --- a/bbhashtool.c +++ /dev/null @@ -1,38 +0,0 @@ -/* Generates "hashes" from ASCII strings to be used in BUZBEE */ - -#include -#include - -const int CCH_CMD = 4; - -int mkhash(const char pszCmd[]); - -int main(void) { - /* Add your commands here to be hashed. Imprtant that they all be CCH_CMD - * chars long EXCLUDING the NUL terminator. */ - char *ppszCmds[] = { - "CALL", - "EXEC", - "HELP", - "PEEK", - "POKE", - "SREC", - /* "BOOT", */ - }; - - for (int iCmd = 0; iCmd < (sizeof(ppszCmds) / sizeof(char *)); iCmd++) - printf("BBC%s\n fcb $%.2X\n", ppszCmds[iCmd], mkhash(ppszCmds[iCmd])); - - return 0; -} - -int mkhash(const char pszCmd[]) { - uint8_t nhash = 0; - - /* NOTE: Very important that condition is the length of the string MINUS the - * NUL terminator, in this case iChar < 4 */ - for (int iChar = 0; iChar < CCH_CMD; iChar++) - nhash = nhash - pszCmd[iChar]; - - return nhash; -} diff --git a/bbmkcmds.c b/bbmkcmds.c new file mode 100644 index 0000000..648435c --- /dev/null +++ b/bbmkcmds.c @@ -0,0 +1,66 @@ +/* Generates BUZBEE command data table asm file */ + +#include +#include + +/* Length of commands in printable-char count (excluding NUL terminator). */ +const int s_cchCmd = 4; + +/* Add your commands here to be hashed. Imprtant that they all be CCH_CMD + * chars long EXCLUDING the NUL terminator. */ +const char *s_ppszCmds[] = { + "CALL", + "EXEC", + "HELP", + "PEEK", + "POKE", + "SREC", + /* "BOOT", */ +}; + +int mkHash(const char pszCmd[]); + +int main(void) { + /* Emit file header */ + puts("; CHIBI PC-09 -- BUZBEE -- Command Data\n\ +; Copyright (c) 2025 Gale Faraday\n\ +; Licensed under MIT\n\ +\n\ +; This file generated by bbmkcmds.c\n\ +\n\ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\ +;;\n\ +;; BUZBEE Command Data\n\ +;;\n\ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\ +\n\ + SECTION BBCMDS\n"); + + for (int iCmd = 0; iCmd < sizeof(s_ppszCmds) / sizeof(char *); iCmd++) { + const char *pszLabel = s_ppszCmds[iCmd]; + printf(" EXPORT BBC%s\n", pszLabel); + } + + /* Extra newline */ + printf("\n"); + + /* Emit table data */ + for (int iCmd = 0; iCmd < sizeof(s_ppszCmds) / sizeof(char *); iCmd++) { + const char *pszLabel = s_ppszCmds[iCmd]; + uint8_t uHash = mkHash(s_ppszCmds[iCmd]); + printf("BBC%s\n fcb $%.2X\n", pszLabel, uHash); + } + + return 0; +} + +int mkHash(const char pszCmd[]) { + uint8_t nhash = 0; + + /* NOTE: Very important that condition is the length of the string MINUS the + * NUL terminator, in this case iChar < 4 */ + for (int iChar = 0; iChar < s_cchCmd; iChar++) + nhash = nhash - pszCmd[iChar]; + + return nhash; +} diff --git a/makefile b/makefile index 50b56be..35dcb47 100644 --- a/makefile +++ b/makefile @@ -13,7 +13,7 @@ TARGREC := $(TARGET).s19 TARGROM := $(TARGET).bin SRCDIR := src/ BUILDDIR := build/ -GENS := $(SRCDIR)version.s +GENS := $(SRCDIR)version.s $(SRCDIR)bbcmds.s SRCS := $(wildcard $(SRCDIR)*.s) OBJS := $(patsubst $(SRCDIR)%.s,$(BUILDDIR)%.o,$(SRCS)) INCS := $(wildcard $(SRCDIR)*.inc) @@ -48,11 +48,18 @@ $(OBJS): $(BUILDDIR)%.o : $(SRCDIR)%.s -@mkdir -p $(BUILDDIR) $(AS) $(ASFLAGS) -o $@ $< +# Pseudo target for generation step generate: $(GENS) -$(GENS): +# Run generation scripts +$(GENS): bbmkcmds + ./bbmkcmds > src/bbcmds.s ./genver.sh +# Build bbmkcmds, used to generate src/cmds.s +bbmkcmds: bbmkcmds.c + cc -o $@ $< + clean: @echo 'Cleaning up intermediary files...' @rm -rv $(TARGROM) $(TARGREC) map.txt $(BUILDDIR)