From 9d1ce7321f27d47b76cba907127af777d6672188 Mon Sep 17 00:00:00 2001 From: "B. Watson" Date: Thu, 13 Jun 2024 15:30:33 -0400 Subject: major surgery: callback API, port dumpbas to use callbacks, add vxrefbas. --- dumpbas.c | 112 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) (limited to 'dumpbas.c') diff --git a/dumpbas.c b/dumpbas.c index 2888b52..d5404d2 100644 --- a/dumpbas.c +++ b/dumpbas.c @@ -79,6 +79,7 @@ void print_atascii(unsigned char c) { /* REM, DATA, ERROR lines are terminated by $9B, a real EOL, not the BASIC token. Since they're strings, print them in ASCII too. */ +/* int handle_text_stmt(int pos) { unsigned char c; @@ -91,7 +92,24 @@ int handle_text_stmt(int pos) { return pos; } +*/ +CALLBACK(handle_text) { + unsigned char c; + + do { + c = program[pos]; + print_atascii(c); + printf("%02x ", c); + pos++; + } while(c != 0x9b); +} + +CALLBACK(handle_cmd) { + printf("!%02x ", tok); +} + +/* int handle_cmd(int pos) { unsigned char tok = program[pos]; @@ -105,7 +123,9 @@ int handle_cmd(int pos) { return pos + 1; } } +*/ +/* void handle_string(int pos) { int i, len; len = program[pos + 1]; @@ -117,7 +137,9 @@ void handle_string(int pos) { } putchar(' '); } +*/ +/* void handle_num(int pos) { int i; printf("#%02x [", program[pos]); @@ -125,8 +147,97 @@ void handle_num(int pos) { printf("%02x%c", program[pos + 1 + i], (i == 5 ? ']' : ' ')); putchar(' '); } +*/ + +CALLBACK(handle_op) { + switch(tok) { + case OP_EOS: + printf("%02x:", tok); + return; + case OP_NUMCONST: + putchar('#'); break; + case OP_STRCONST: + putchar('$'); break; + default: break; + } + printf("%02x ", tok); +} + +CALLBACK(handle_var) { + printf("%02x", tok); + switch(get_vartype(tok)) { + case TYPE_ARRAY: + putchar('('); break; + case TYPE_STRING: + putchar('$'); break; + default: break; + } + putchar(' '); +} + +CALLBACK(handle_string) { + int i, len; + len = program[pos]; + printf("=%02x \"", len); + for(i = pos; i < pos + len; i++) { + unsigned char c = program[i + 1]; + print_atascii(c); + printf("%02x%c", c, (i == (pos + len - 1) ? '"' : ' ')); + } + putchar(' '); +} + +CALLBACK(handle_num) { + int i; + putchar('['); + for(i = 0; i < 6; i++) + printf("%02x%c", program[pos + i], (i == 5 ? ']' : ' ')); + putchar(' '); +} + +CALLBACK(handle_start_line) { + printf("%5d @%04x (%02x %02x): ^%02x\n", + lineno, pos, program[pos], program[pos + 1], program[pos + 2]); +} + +CALLBACK(handle_end_line) { + putchar('\n'); +} + +CALLBACK(handle_start_stmt) { + printf(" >%02x ", tok); +} + +CALLBACK(handle_end_stmt) { + putchar('\n'); +} + +int main(int argc, char **argv) { + set_self(*argv); + parse_general_args(argc, argv, print_help); + parse_args(argc, argv); + + readfile(); + parse_header(); + + on_start_line = handle_start_line; + on_end_line = handle_end_line; + on_start_stmt = handle_start_stmt; + on_end_stmt = handle_end_stmt; + on_exp_token = handle_op; + on_cmd_token = handle_cmd; + on_num_const = handle_num; + on_string_const = handle_string; + on_text = handle_text; + on_var_token = handle_var; + + walk_code(startlineno, endlineno); + + return 0; +} /* sorry, this is horrid, more like assembly than C. */ +#if 0 int main(int argc, char **argv) { int linepos, nextpos, offset, soffset, lineno, pos, end, tok; @@ -196,3 +307,4 @@ int main(int argc, char **argv) { return 0; } +#endif -- cgit v1.2.3