Mercurial > hg > Members > kono > os9 > sbc09
diff a09.c @ 34:2032755628dc
fix for nitros9
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Sun, 15 Jul 2018 14:18:19 +0900 |
parents | 7c5379eb406e |
children | 01519215ec70 |
line wrap: on
line diff
--- a/a09.c Sat Jul 14 15:22:54 2018 +0900 +++ b/a09.c Sun Jul 15 14:18:19 2018 +0900 @@ -213,9 +213,8 @@ }; int symcounter=0; -int os9 = 0; // os9 flag -int prevloc = 0; -int prevrmb = 0; +int os9 = 0; // os9 flag +int rmbmode = 0; // in os9 work area struct symrecord * prevlp = 0; /* expression categories... @@ -334,7 +333,7 @@ char relocatable; /* flag to indicate relocatable object. */ char terminate; /* flag to indicate termination. */ char generating; /* flag to indicate that we generate code */ -unsigned short loccounter,oldlc; /* Location counter */ +unsigned short loccounter,oldlc,prevloc,rmbcounter; /* Location counter */ char inpline[128]; /* Current input line (not expanded)*/ char srcline[128]; /* Current source line */ @@ -351,10 +350,10 @@ void generate() { generating = 1; - if (prevloc) { - prevrmb = loccounter+1; // we were in rmb mode - oldlc = loccounter = prevloc-1 ; - prevloc = 0; + if (rmbmode) { + rmbcounter = loccounter; + oldlc = loccounter = prevloc; + rmbmode = 0; } } @@ -489,8 +488,8 @@ if(isalpha(c))return scanlabel(); else if(isdigit(c))return scandecimal(); else switch(c) { - case '*' : srcptr++;exprcat|=2; if(prevloc) return prevloc-1; else return loccounter; - case '.' : srcptr++;exprcat|=2; if(prevrmb) return prevrmb-1; else return loccounter; + case '*' : srcptr++;exprcat|=2; if(rmbmode) return prevloc; else return loccounter; + case '.' : srcptr++;exprcat|=2; if(os9&&!rmbmode) return rmbcounter; else return loccounter; case '$' : return scanhex(); case '%' : return scanbin(); case '&' : /* compatibility */ @@ -1169,13 +1168,11 @@ } } -int modStart; - void os9begin() { generate(); os9=1; // contiguous code generation ( i.e. ignore org nor rmb ) - modStart = loccounter; + oldlc = loccounter = rmbcounter = rmbmode = 0; reset_crc(); putword(0x87cd); putword(scanexpr(0)-loccounter); // module size @@ -1194,6 +1191,9 @@ putword(scanexpr(0)); skipspace(); } + prevloc = codeptr; + rmbmode = 1; // next org works on rmb + loccounter = 0x10000-codeptr; // should start at 0 } void os9end() @@ -1218,9 +1218,10 @@ case 0:/* RMB */ // in OS9 mode, this generates no data // loccounter will be reset after any code to the current code generation - if (prevrmb) { - oldlc = loccounter = prevrmb-1 ; - prevrmb = 0; + if (os9 && !rmbmode) { + prevloc = loccounter; + oldlc = loccounter = rmbcounter; + rmbmode = 1; } setlabel(lp); operand=scanexpr(0); @@ -1463,10 +1464,6 @@ } if(error)report(); loccounter+=codeptr; - if (os9 && prevloc==0 ) { - prevloc = loccounter+1; - oldlc = loccounter = 0; - } } void