# HG changeset patch
# User lost@starbug
# Date 1271822398 21600
# Node ID 6b33faa21a0ae6e1f1518d0d46abcde61ad7061b
# Parent 898a41f7eb591058a72740138ffbb6cbfd2c3542
Debugging output and bugfixing pass 0
diff -r 898a41f7eb59 -r 6b33faa21a0a lwasm/Makefile.am
--- a/lwasm/Makefile.am Thu Apr 15 22:26:49 2010 -0600
+++ b/lwasm/Makefile.am Tue Apr 20 21:59:58 2010 -0600
@@ -4,6 +4,6 @@
instab.c symbol.c macro.c pass2.c pass3.c pass4.c pass5.c pass6.c \
insn_inh.c insn_rtor.c insn_tfm.c insn_rlist.c insn_rel.c \
insn_bitbit.c insn_indexed.c insn_gen.c insn_logicmem.c \
- pseudo.c section.c os9.c pass7.c
+ pseudo.c section.c os9.c pass7.c debug.c
lwasm_LDADD = -L$(top_builddir)/lib -L$(top_srcdir)/lib -L$(top_builddir)/lwlib -L$(top_srcdir)/lwlib -lgnu -llw
EXTRA_DIST = lwasm.h input.h instab.h
diff -r 898a41f7eb59 -r 6b33faa21a0a lwasm/debug.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/lwasm/debug.c Tue Apr 20 21:59:58 2010 -0600
@@ -0,0 +1,80 @@
+/*
+debug.c
+
+Copyright © 2010 William Astle
+
+This file is part of LWTOOLS.
+
+LWTOOLS is free software: you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation, either version 3 of the License, or (at your option) any later
+version.
+
+This program is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+more details.
+
+You should have received a copy of the GNU General Public License along with
+this program. If not, see .
+*/
+
+#include
+
+#include
+#include
+
+#include "lwasm.h"
+#include "instab.h"
+
+/*
+
+Various debug utilities
+
+*/
+void dump_state(asmstate_t *as, FILE *fp)
+{
+ line_t *cl;
+ exportlist_t *ex;
+ struct symtabe *s;
+ importlist_t *im;
+ struct line_expr_s *le;
+ lwasm_error_t *e;
+
+ fprintf(fp, "Lines:\n");
+
+ for (cl = as -> line_head; cl; cl = cl -> next)
+ {
+ fprintf(fp, "%p ", cl);
+ if (cl -> insn >= 0)
+ {
+ fprintf(fp, "INSN %d (%s) ", cl -> insn, instab[cl -> insn].opcode);
+ fprintf(fp, "LEN %d ", cl -> len);
+ }
+ fprintf(fp, "\n ADDR:");
+ lw_expr_print(cl -> addr, fp);
+ for (le = cl -> exprs; le; le = le -> next)
+ {
+ fprintf(fp, "\n EXPR %d:", le -> id);
+ lw_expr_print(le -> expr, fp);
+ }
+ if (cl -> outputl > 0)
+ {
+ int i;
+ fprintf(fp, "\n OUTPUT:");
+ for (i = 0; i < cl -> outputl; i++)
+ {
+ fprintf(fp, "%02X", cl -> output[i]);
+ }
+ }
+ for (e = cl -> err; e; e = e -> next)
+ {
+ fprintf(fp, "\n ERR: %s", e -> mess);
+ }
+ for (e = cl -> warn; e; e = e -> next)
+ {
+ fprintf(fp, "\n WARN: %s", e -> mess);
+ }
+ fprintf(fp, "\n");
+ }
+}
diff -r 898a41f7eb59 -r 6b33faa21a0a lwasm/main.c
--- a/lwasm/main.c Thu Apr 15 22:26:49 2010 -0600
+++ b/lwasm/main.c Tue Apr 20 21:59:58 2010 -0600
@@ -190,6 +190,8 @@
{ NULL, NULL }
};
+extern void dump_state(asmstate_t *as, FILE *fp);
+
int main(int argc, char **argv)
{
int passnum;
@@ -200,6 +202,7 @@
lw_expr_set_special_handler(lwasm_evaluate_special);
lw_expr_set_var_handler(lwasm_evaluate_var);
+ lw_expr_set_term_parser(lwasm_parse_term);
/* initialize assembler state */
asmstate.include_list = lw_stringlist_create();
@@ -220,6 +223,8 @@
{
fprintf(stderr, "Doing pass %d (%s)\n", passnum, passlist[passnum].passname);
(passlist[passnum].fn)(&asmstate);
+ fprintf(stderr, "After pass %d (%s):\n", passnum, passlist[passnum].passname);
+ dump_state(&asmstate, stderr);
if (asmstate.errorcount > 0)
{
diff -r 898a41f7eb59 -r 6b33faa21a0a lwasm/pass1.c
--- a/lwasm/pass1.c Thu Apr 15 22:26:49 2010 -0600
+++ b/lwasm/pass1.c Tue Apr 20 21:59:58 2010 -0600
@@ -179,8 +179,8 @@
for (tok = p1; *p1 && !isspace(*p1); p1++)
/* do nothing */ ;
}
-
- cl -> sym = sym;
+ if (sym)
+ cl -> sym = lw_strdup(sym);
cl -> symset = 0;
// tok points to the opcode for the line or NUL if none
@@ -188,7 +188,7 @@
{
// look up operation code
sym = lw_strndup(tok, p1 - tok);
- for (; *p1 && isspace(p1); p1++)
+ for (; *p1 && isspace(*p1); p1++)
/* do nothing */ ;
for (opnum = 0; instab[opnum].opcode; opnum++)
@@ -252,19 +252,19 @@
{
if (cl -> sym && cl -> symset == 0)
{
- printf("Register symbol %s:", sym);
- lw_expr_print(cl -> addr);
+ printf("Register symbol %s:", cl -> sym);
+ lw_expr_print(cl -> addr, stderr);
printf("\n");
// register symbol at line address
if (!register_symbol(as, cl, cl -> sym, cl -> addr, symbol_flag_none))
{
// symbol error
- lwasm_register_error(as, cl, "Bad symbol '%s'", cl -> sym);
+ // lwasm_register_error(as, cl, "Bad symbol '%s'", cl -> sym);
}
}
- lw_expr_print(cl -> addr);
+ lw_expr_print(cl -> addr, stderr);
printf("\n");
}
diff -r 898a41f7eb59 -r 6b33faa21a0a lwasm/pseudo.c
--- a/lwasm/pseudo.c Thu Apr 15 22:26:49 2010 -0600
+++ b/lwasm/pseudo.c Tue Apr 20 21:59:58 2010 -0600
@@ -35,6 +35,7 @@
lw_expr_t addr;
as -> endseen = 1;
+ l -> len = 0;
if (as -> output_format != OUTPUT_DECB)
{
@@ -42,7 +43,14 @@
return;
}
- addr = lwasm_parse_expr(as, p);
+ if (!**p)
+ {
+ addr = lw_expr_build(lw_expr_type_int, 0);
+ }
+ else
+ {
+ addr = lwasm_parse_expr(as, p);
+ }
if (!addr)
{
lwasm_register_error(as, l, "Bad expression");
diff -r 898a41f7eb59 -r 6b33faa21a0a lwasm/symbol.c
--- a/lwasm/symbol.c Thu Apr 15 22:26:49 2010 -0600
+++ b/lwasm/symbol.c Tue Apr 20 21:59:58 2010 -0600
@@ -26,6 +26,7 @@
#include
#include
+#include
#include "lwasm.h"
@@ -106,6 +107,7 @@
se -> version = version;
se -> flags = flags;
se -> value = lw_expr_copy(val);
+ se -> symbol = lw_strdup(sym);
return se;
}
diff -r 898a41f7eb59 -r 6b33faa21a0a lwlib/lw_expr.c
--- a/lwlib/lw_expr.c Thu Apr 15 22:26:49 2010 -0600
+++ b/lwlib/lw_expr.c Tue Apr 20 21:59:58 2010 -0600
@@ -192,7 +192,7 @@
return r;
}
-void lw_expr_print(lw_expr_t E)
+void lw_expr_print(lw_expr_t E, FILE *fp)
{
struct lw_expr_opers *o;
int c = 0;
@@ -200,86 +200,86 @@
for (o = E -> operands; o; o = o -> next)
{
c++;
- lw_expr_print(o -> p);
+ lw_expr_print(o -> p, fp);
}
switch (E -> type)
{
case lw_expr_type_int:
- printf("%d ", E -> value);
+ fprintf(fp, "%d ", E -> value);
break;
case lw_expr_type_var:
- printf("V(%s) ", (char *)(E -> value2));
+ fprintf(fp, "V(%s) ", (char *)(E -> value2));
break;
case lw_expr_type_special:
- printf("S(%d,%p) ", E -> value, E -> value2);
+ fprintf(fp, "S(%d,%p) ", E -> value, E -> value2);
break;
case lw_expr_type_oper:
- printf("[%d]", c);
+ fprintf(fp, "[%d]", c);
switch (E -> value)
{
case lw_expr_oper_plus:
- printf("+ ");
+ fprintf(fp, "+ ");
break;
case lw_expr_oper_minus:
- printf("- ");
+ fprintf(fp, "- ");
break;
case lw_expr_oper_times:
- printf("* ");
+ fprintf(fp, "* ");
break;
case lw_expr_oper_divide:
- printf("/ ");
+ fprintf(fp, "/ ");
break;
case lw_expr_oper_mod:
- printf("%% ");
+ fprintf(fp, "%% ");
break;
case lw_expr_oper_intdiv:
- printf("\\ ");
+ fprintf(fp, "\\ ");
break;
case lw_expr_oper_bwand:
- printf("BWAND ");
+ fprintf(fp, "BWAND ");
break;
case lw_expr_oper_bwor:
- printf("BWOR ");
+ fprintf(fp, "BWOR ");
break;
case lw_expr_oper_bwxor:
- printf("BWXOR ");
+ fprintf(fp, "BWXOR ");
break;
case lw_expr_oper_and:
- printf("AND ");
+ fprintf(fp, "AND ");
break;
case lw_expr_oper_or:
- printf("OR ");
+ fprintf(fp, "OR ");
break;
case lw_expr_oper_neg:
- printf("NEG ");
+ fprintf(fp, "NEG ");
break;
case lw_expr_oper_com:
- printf("COM ");
+ fprintf(fp, "COM ");
break;
default:
- printf("OPER ");
+ fprintf(fp, "OPER ");
break;
}
break;
default:
- printf("ERR ");
+ fprintf(fp, "ERR ");
break;
}
}
@@ -783,7 +783,7 @@
if (!**p || isspace(**p) || **p == ')' || **p == ',' || **p == ']')
return NULL;
-
+
term1 = lw_expr_parse_term(p, priv);
if (!term1)
return NULL;
diff -r 898a41f7eb59 -r 6b33faa21a0a lwlib/lw_expr.h
--- a/lwlib/lw_expr.h Thu Apr 15 22:26:49 2010 -0600
+++ b/lwlib/lw_expr.h Tue Apr 20 21:59:58 2010 -0600
@@ -22,6 +22,7 @@
#ifndef ___lw_expr_h_seen___
#define ___lw_expr_h_seen___
+#include
enum
{
@@ -81,7 +82,7 @@
extern lw_expr_t lw_expr_copy(lw_expr_t E);
extern void lw_expr_add_operand(lw_expr_t E, lw_expr_t O);
extern lw_expr_t lw_expr_build(int exprtype, ...);
-extern void lw_expr_print(lw_expr_t E);
+extern void lw_expr_print(lw_expr_t E, FILE *fp);
extern int lw_expr_compare(lw_expr_t E1, lw_expr_t E2);
extern void lw_expr_simplify(lw_expr_t E, void *priv);