aboutsummaryrefslogtreecommitdiff
path: root/dumpbas.c
diff options
context:
space:
mode:
Diffstat (limited to 'dumpbas.c')
-rw-r--r--dumpbas.c112
1 files changed, 112 insertions, 0 deletions
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