diff --git a/bbhashtool.c b/bbhashtool.c new file mode 100644 index 0000000..5c678a3 --- /dev/null +++ b/bbhashtool.c @@ -0,0 +1,38 @@ +/* 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/src/buzbee.inc b/src/buzbee.inc index 6ab6d89..5fbaedb 100644 --- a/src/buzbee.inc +++ b/src/buzbee.inc @@ -12,15 +12,9 @@ BUZBEE IMPORT ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -BBIN_BASE EQU $0200 -BBIN_DEPTH EQU $7F +BBIN_BASE EQU $0200 +BBIN_DEPTH EQU $7F +BBTOKENS_BASE EQU $0280 +BBTOKENS_DEPTH EQU $3F +BBTOKENS_CCH EQU $02C0 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; -;; BUZBEE Structures -;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -BBVARS STRUCT -INPUT rmb BBIN_DEPTH - ENDSTRUCT diff --git a/src/buzbee.s b/src/buzbee.s index ad8a043..0c25229 100644 --- a/src/buzbee.s +++ b/src/buzbee.s @@ -95,6 +95,21 @@ FULLBUF@ jsr POUTCHAR bra INPLOOP +; Makes a hash of four chars in BBIN starting at offset X. +; @param X: offset in BBIN to read the four chars from +; @return A: resulting hash +MKCMDSUM + pshs b + ldb #4 ; Loop over four chars + clra ; Initialize accumulator +NEXTC@ + suba BBIN_BASE,x ; Subtract current char from accumulator + leax 1,x ; Next char + decb ; Reduce count + cmpb #0 ; Are we at the end? + bne NEXTC@ ; No? loop + rts + PROMPTLINE fcb $0D,$0A,$25,$00 ; CR LF '%' NUL