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