Mercurial > hg > Members > kono > os9 > sbc09
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;