diff --git a/PLASMA/src/codegen.c b/PLASMA/src/codegen.c index e9ad2c79..489292e2 100755 --- a/PLASMA/src/codegen.c +++ b/PLASMA/src/codegen.c @@ -542,32 +542,18 @@ void emit_llw(int index) { printf("\t%s\t$66,$%02X\t\t\t; LLW\t[%d]\n", DB, index, index); } -void emit_lab(int tag, int type) +void emit_lab(int tag, int offset, int type) { int fixup = fixup_new(tag, type, FIXUP_WORD); char *taglbl = tag_string(tag, type); - printf("\t%s\t$68\t\t\t; LAB\t%s\n", DB, taglbl); - printf("_F%03d%c\t%s\t%s\t\t\n", fixup, LBL, DW, type & EXTERN_TYPE ? "0" : taglbl); -} -void emit_law(int tag, int type) -{ - int fixup = fixup_new(tag, type, FIXUP_WORD); - char *taglbl = tag_string(tag, type); - printf("\t%s\t$6A\t\t\t; LAW\t%s\n", DB, taglbl); - printf("_F%03d%c\t%s\t%s\t\t\n", fixup, LBL, DW, type & EXTERN_TYPE ? "0" : taglbl); -} -void emit_lab_ofst(int tag, int offset, int type) -{ - int fixup = fixup_new(tag, type, FIXUP_WORD); - char *taglbl = tag_string(tag, type); - printf("\t%s\t$68\t\t\t; LAB\t%s\n", DB, taglbl); + printf("\t%s\t$68\t\t\t; LAB\t%s+%d\n", DB, taglbl, offset); printf("_F%03d%c\t%s\t%s+%d\t\t\n", fixup, LBL, DW, type & EXTERN_TYPE ? "0" : taglbl, offset); } -void emit_law_ofst(int tag, int offset, int type) +void emit_law(int tag, int offset, int type) { int fixup = fixup_new(tag, type, FIXUP_WORD); char *taglbl = tag_string(tag, type); - printf("\t%s\t$6A\t\t\t; LAW\t%s\n", DB, taglbl); + printf("\t%s\t$6A\t\t\t; LAW\t%s+%d\n", DB, taglbl, offset); printf("_F%03d%c\t%s\t%s+%d\t\t\n", fixup, LBL, DW, type & EXTERN_TYPE ? "0" : taglbl, offset); } void emit_sb(void) @@ -594,32 +580,18 @@ void emit_dlw(int index) { printf("\t%s\t$6E,$%02X\t\t\t; DLW\t[%d]\n", DB, index, index); } -void emit_sab(int tag, int type) +void emit_sab(int tag, int offset, int type) { int fixup = fixup_new(tag, type, FIXUP_WORD); char *taglbl = tag_string(tag, type); - printf("\t%s\t$78\t\t\t; SAB\t%s\n", DB, taglbl); - printf("_F%03d%c\t%s\t%s\t\t\n", fixup, LBL, DW, type & EXTERN_TYPE ? "0" : taglbl); -} -void emit_saw(int tag, int type) -{ - int fixup = fixup_new(tag, type, FIXUP_WORD); - char *taglbl = tag_string(tag, type); - printf("\t%s\t$7A\t\t\t; SAW\t%s\n", DB, taglbl); - printf("_F%03d%c\t%s\t%s\t\t\n", fixup, LBL, DW, type & EXTERN_TYPE ? "0" : taglbl); -} -void emit_sab_ofst(int tag, int offset, int type) -{ - int fixup = fixup_new(tag, type, FIXUP_WORD); - char *taglbl = tag_string(tag, type); - printf("\t%s\t$78\t\t\t; SAB\t%s\n", DB, taglbl); + printf("\t%s\t$78\t\t\t; SAB\t%s+%d\n", DB, taglbl, offset); printf("_F%03d%c\t%s\t%s+%d\t\t\n", fixup, LBL, DW, type & EXTERN_TYPE ? "0" : taglbl, offset); } -void emit_saw_ofst(int tag, int offset, int type) +void emit_saw(int tag, int offset, int type) { int fixup = fixup_new(tag, type, FIXUP_WORD); char *taglbl = tag_string(tag, type); - printf("\t%s\t$7A\t\t\t; SAW\t%s\n", DB, taglbl); + printf("\t%s\t$7A\t\t\t; SAW\t%s+%d\n", DB, taglbl, offset); printf("_F%03d%c\t%s\t%s+%d\t\t\n", fixup, LBL, DW, type & EXTERN_TYPE ? "0" : taglbl, offset); } void emit_dab(int tag, int type) @@ -640,19 +612,12 @@ void emit_localaddr(int index) { printf("\t%s\t$28,$%02X\t\t\t; LLA\t[%d]\n", DB, index, index); } -void emit_globaladdr(int tag, int type) +void emit_globaladdr(int tag, int offset, int type) { int fixup = fixup_new(tag, type, FIXUP_WORD); char *taglbl = tag_string(tag, type); - printf("\t%s\t$26\t\t\t; LA\t%s\n", DB, taglbl); - printf("_F%03d%c\t%s\t%s\t\t\n", fixup, LBL, DW, type & EXTERN_TYPE ? "0" : taglbl); -} -void emit_globaladdrofst(int tag, int ofst, int type) -{ - int fixup = fixup_new(tag, type, FIXUP_WORD); - char *taglbl = tag_string(tag, type); - printf("\t%s\t$26\t\t\t; LA\t%s+%d\n", DB, taglbl, ofst); - printf("_F%03d%c\t%s\t%s+%d\t\t\n", fixup, LBL, DW, type & EXTERN_TYPE ? "" : taglbl, ofst); + printf("\t%s\t$26\t\t\t; LA\t%s+%d\n", DB, taglbl, offset); + printf("_F%03d%c\t%s\t%s+%d\t\t\n", fixup, LBL, DW, type & EXTERN_TYPE ? "" : taglbl, offset); } void emit_indexbyte(void) { diff --git a/PLASMA/src/codegen.h b/PLASMA/src/codegen.h index 646c3185..3c47732f 100755 --- a/PLASMA/src/codegen.h +++ b/PLASMA/src/codegen.h @@ -20,27 +20,22 @@ void emit_lb(void); void emit_lw(void); void emit_llb(int index); void emit_llw(int index); -void emit_lab(int tag, int type); -void emit_law(int tag, int type); -void emit_lab_ofst(int tag, int offset, int type); -void emit_law_ofst(int tag, int offset, int type); +void emit_lab(int tag, int offset, int type); +void emit_law(int tag, int offset, int type); void emit_sb(void); void emit_sw(void); void emit_slb(int index); void emit_slw(int index); void emit_dlb(int index); void emit_dlw(int index); -void emit_sab(int tag, int type); -void emit_saw(int tag, int type); -void emit_sab_ofst(int tag, int offset, int type); -void emit_saw_ofst(int tag, int ofset, int type); +void emit_sab(int tag, int offset, int type); +void emit_saw(int tag, int ofset, int type); void emit_dab(int tag, int type); void emit_daw(int tag, int type); void emit_call(int tag, int type); void emit_ical(void); void emit_localaddr(int index); -void emit_globaladdr(int tag, int type); -void emit_globaladdrofst(int tag, int offset, int type); +void emit_globaladdr(int tag, int offset, int type); void emit_indexbyte(void); void emit_indexword(void); int emit_unaryop(int op); diff --git a/PLASMA/src/parse.c b/PLASMA/src/parse.c index 34e3a34a..99ea7454 100755 --- a/PLASMA/src/parse.c +++ b/PLASMA/src/parse.c @@ -188,6 +188,8 @@ int parse_value(int rvalue) int deref = rvalue; int optos = opsptr; int type = 0, value = 0, emit_value = 0; + int elem_size, elem_type; + long elem_offset = 0; /* * Parse pre operand operators. */ @@ -301,7 +303,7 @@ int parse_value(int rvalue) if (type & LOCAL_TYPE) emit_localaddr(value); else - emit_globaladdr(value, type); + emit_globaladdr(value, 0, type); } else if (type & CONST_TYPE) { @@ -340,9 +342,7 @@ int parse_value(int rvalue) /* * Structure member offset or array of arrays */ - int elem_size; - int elem_type = (scantoken == DOT_TOKEN) ? BPTR_TYPE : WPTR_TYPE; - long elem_offset = 0; + elem_type = (scantoken == DOT_TOKEN) ? BPTR_TYPE : WPTR_TYPE; if (parse_constval(&elem_offset, &elem_size)) { /* @@ -352,23 +352,20 @@ int parse_value(int rvalue) { if (type & VAR_TYPE) { - if (type & LOCAL_TYPE) - emit_localaddr(value + elem_offset); - else - emit_globaladdrofst(value, elem_offset, type); + elem_type = (type & ~VAR_TYPE) | (elem_type == BPTR_TYPE ? BYTE_TYPE : WORD_TYPE); } else if (type & CONST_TYPE) { value += elem_offset; emit_const(value); + elem_offset = 0; + emit_value = 1; } else // FUNC_TYPE { - emit_globaladdr(value, type); - emit_const(elem_offset); - emit_op(ADD_TOKEN); + emit_globaladdr(value, elem_offset, type); + emit_value = 1; } - emit_value = 1; } else { @@ -376,6 +373,7 @@ int parse_value(int rvalue) { emit_const(elem_offset); emit_op(ADD_TOKEN); + elem_offset = 0; } } } @@ -389,9 +387,9 @@ int parse_value(int rvalue) if (type & ADDR_TYPE) { if (type & LOCAL_TYPE) - emit_localaddr(value); + emit_localaddr(value + elem_offset); else - emit_globaladdr(value, type); + emit_globaladdr(value, elem_offset, type); } else if (type & CONST_TYPE) { @@ -454,9 +452,9 @@ int parse_value(int rvalue) if (type & VAR_TYPE) { if (type & LOCAL_TYPE) - emit_llw(value); + emit_llw(value + elem_offset); else - emit_law(value, type); + emit_law(value, elem_offset, type); } else if (type & PTR_TYPE) emit_lw(); @@ -486,9 +484,9 @@ int parse_value(int rvalue) else if (type & VAR_TYPE) { if (type & LOCAL_TYPE) - (type & BYTE_TYPE) ? emit_llb(value) : emit_llw(value); + (type & BYTE_TYPE) ? emit_llb(value + elem_offset) : emit_llw(value + elem_offset); else - (type & BYTE_TYPE) ? emit_lab(value, type) : emit_law(value, type); + (type & BYTE_TYPE) ? emit_lab(value, elem_offset, type) : emit_law(value, elem_offset, type); } else if (type & PTR_TYPE) (type & BPTR_TYPE) ? emit_lb() : emit_lw(); @@ -496,9 +494,9 @@ int parse_value(int rvalue) else { if (type & LOCAL_TYPE) - emit_localaddr(value); + emit_localaddr(value + elem_offset); else - emit_globaladdr(value, type); + emit_globaladdr(value, elem_offset, type); } } while (optos < opsptr) @@ -894,10 +892,8 @@ int parse_stmnt(void) } if (type & LOCAL_TYPE) (elem_type & BYTE_TYPE) ? emit_slb(addr + elem_offset) : emit_slw(addr + elem_offset); - else if (elem_offset) - (elem_type & BYTE_TYPE) ? emit_sab_ofst(addr, elem_offset, type) : emit_saw_ofst(addr, elem_offset, type); - else - (elem_type & BYTE_TYPE) ? emit_sab(addr, type) : emit_saw(addr, type); + else + (elem_type & BYTE_TYPE) ? emit_sab(addr, elem_offset, type) : emit_saw(addr, elem_offset, type); break; } } diff --git a/PLASMA/src/test.pla b/PLASMA/src/test.pla index c8baedc2..8116fbe0 100755 --- a/PLASMA/src/test.pla +++ b/PLASMA/src/test.pla @@ -8,15 +8,17 @@ end import testlib predef puti, putnl end +const mainentry = 2 ; ; Predeclare any functions called before defined. ; -predef main +predef ascii, main ; ; Declare all global variables for this module. ; byte hello[] = "Hello, world.\n" -word defptr = main +word defptr = @ascii, @main +word struct[] = 1, 10, 100 ; ; Define functions. ; @@ -48,7 +50,7 @@ end export def indirect word mainptr mainptr = @main - return mainptr(10) + return defptr:mainentry(struct:2) end indirect