diff a09.c @ 6:9c2602e1d716

level2 rom done
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Thu, 05 Jul 2018 00:02:54 +0900
parents 35028b396a35
children a6db579d8c11
line wrap: on
line diff
--- a/a09.c	Wed Jul 04 21:30:24 2018 +0900
+++ b/a09.c	Thu Jul 05 00:02:54 2018 +0900
@@ -179,6 +179,7 @@
 
 int symcounter=0;
 int os9 = 0;   // os9 flag
+int prevloc = 0;
 
 /* Symbol categories.
    0 Constant value (from equ).
@@ -300,6 +301,15 @@
                           label or constant, this is important when
                           generating relocatable object code. */
 
+void generate()
+{
+    generating = 1;
+    if (prevloc) {
+       loccounter  = prevloc-1 ;
+       prevloc = 0;
+    }
+}
+
 
 char namebuf[MAXIDLEN+1];
 
@@ -1105,7 +1115,7 @@
 
 void os9begin()
 {
- generating=1;
+ generate();
  os9=1;   // contiguous code generation ( i.e. ignore org nor rmb )
  modStart = loccounter;
  reset_crc();
@@ -1150,14 +1160,16 @@
  case 0:/* RMB */
         //   in OS9 mode, this generates no data
         //   loccounter will be reset after any code to the current code generation
+        if (os9 && !prevloc) prevloc = loccounter+1;
         setlabel(lp);
         operand=scanexpr(0);
         if(unknown)error|=4;
         loccounter+=operand;
         if(generating&&pass==2) {
-           if(!outmode || os9 )for(i=0;i<operand;i++) {
-              fputc(0,objfile);
-           } else flushhex();  
+           if(!outmode && !os9 ) {
+               for(i=0;i<operand;i++) { fputc(0,objfile); } 
+           } else 
+               flushhex();  
         }   
         hexaddr=loccounter;
         break;
@@ -1174,8 +1186,8 @@
         }
         break;
  case 7:/* FCB */
+        generate();
         setlabel(lp);
-        generating=1;
         do {
         if(*srcptr==',')srcptr++;
         skipspace();
@@ -1192,7 +1204,7 @@
         } while(*srcptr==',');
         break;
  case 8:/* FCC */
-        generating=1;
+        generate();
         setlabel(lp);
         skipspace();
         c=*srcptr++;
@@ -1201,7 +1213,7 @@
         if(*srcptr==c)srcptr++;
         break;
  case 9:/* FDB */
-        generating=1;
+        generate();
         setlabel(lp);
         do {
          if(*srcptr==',')srcptr++;
@@ -1212,7 +1224,7 @@
         } while(*srcptr==',');
         break;
  case 23 :/* FCS */
-        generating=1;
+        generate();
         setlabel(lp);
         skipspace();
         int sep = *srcptr;
@@ -1252,6 +1264,7 @@
         if(!operand)suppress=2;
         break;                
  case 12: /* ORG */
+         if (os9 && !prevloc) prevloc = loccounter+1;
          operand=scanexpr(0);
          if(unknown)error|=4;
          if(generating&&pass==2&&!outmode&&!os9) {
@@ -1283,7 +1296,7 @@
         terminate=1;
         break;     
    case 27: /* USE */     
-        locsave = loccounter ;
+        // locsave = loccounter ;
    case 16: /* INCLUDE */     
         skipspace();
         if(*srcptr=='"')srcptr++;
@@ -1302,7 +1315,7 @@
         // if (co==27) loccounter = locsave;
         break; 
    case 24: /* MOD */     
-        loccounter = 0;
+        oldlc = loccounter = 0;
         setlabel(lp);
         os9begin();
         break; 
@@ -1310,7 +1323,7 @@
         os9end();
         break; 
    case 32: /* OS9 */     
-        generating = 1;
+        generate();
         setlabel(lp);
         putword(0x103f); // SWI2
         putbyte(scanexpr(0));
@@ -1349,8 +1362,8 @@
   op=findop(namebuf);
   if(op) {
    if(op->cat!=13){
+     generate();
      setlabel(lp);
-     generating=1;
    }
    co=op->code;
    switch(op->cat) {
@@ -1404,8 +1417,7 @@
    if(ifcount==0 && suppress==2)suppress=0;
   }
  }  
- if(pass==2&&listing)outlist();
-}
+ if(pass==2&&listing)outlist(); } 
 
 void
 usage(char*nm)
@@ -1431,29 +1443,30 @@
 void
 getoptions(int c,char*v[])
 {
- int i=0;
+ int i=1;
  if(c==1)usage(v[0]);
- if(strcmp(v[1],"-d")==0) {
-   debug=1;
-   i++;
- }
- if(strcmp(v[1],"-o")==0) {
-   if(c<4)usage(v[0]);
-   objname = v[2];
-   i+=2;
+ while(v[i]) {
+     if(strcmp(v[i],"-d")==0) {
+       debug=1;
+       i++;
+     } else if(strcmp(v[i],"-o")==0) {
+       objname = v[i+1];
+       i+=2;
+     } else if(strcmp(v[i],"-s")==0) {
+       objname=v[i+1];
+       outmode=1;
+       i+=2;
+     } else if(strcmp(v[i],"-l")==0) {
+       listname=v[i+1];
+       i+=2;
+     } else if(*v[i]=='-') {
+         usage(v[0]);
+     } else {
+        if (srcname) usage(v[0]);
+        srcname=v[i];
+        i++;
+     }
  }
- if(strcmp(v[i+1],"-s")==0) {
-   if(c<4+i)usage(v[0]);
-   objname=v[i+2];
-   outmode=1;
-   i+=2;
- }
- if(strcmp(v[i+1],"-l")==0) {
-   if(c<4+i)usage(v[0]);
-   listname=v[2+i];
-   i+=2;
- }
- srcname=v[1+i];
  if(objname==0) {
    for(i=0;srcname[i]!='.' && srcname[i]!=0 ;i++) ;
    objname = strconcat(srcname,i,".b");
@@ -1490,8 +1503,11 @@
  oldno=lineno;
  lineno=0;
  if((srcfile=fopen(name,"r"))==0) {
-   int i = strlen(oldname);
-   while(i>0 && oldname[i]!='/') i--;
+   int i = 0;
+   if (oldname) {
+       i = strlen(oldname);
+       while(i>0 && oldname[i]!='/') i--;
+   }
    if (i>0) {
        char *next = strconcat(oldname,i+1,name);
        if((srcfile=fopen(next,"r"))==0) {
@@ -1536,6 +1552,7 @@
   if(c=='n'||c=='N') exit(3);
  }
  pass=2;
+ prevloc = 0;
  loccounter=0;
  errors=0;
  generating=0;