comparison 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
comparison
equal deleted inserted replaced
33:7c5379eb406e 34:2032755628dc
211 unsigned short value; 211 unsigned short value;
212 struct symrecord *next; 212 struct symrecord *next;
213 }; 213 };
214 214
215 int symcounter=0; 215 int symcounter=0;
216 int os9 = 0; // os9 flag 216 int os9 = 0; // os9 flag
217 int prevloc = 0; 217 int rmbmode = 0; // in os9 work area
218 int prevrmb = 0;
219 struct symrecord * prevlp = 0; 218 struct symrecord * prevlp = 0;
220 219
221 /* expression categories... 220 /* expression categories...
222 ECORD all zeros is ordinary constant. 221 ECORD all zeros is ordinary constant.
223 ECADR bit 1 indicates address within module. 222 ECADR bit 1 indicates address within module.
332 char pass; /* Assembler pass=1 or 2 */ 331 char pass; /* Assembler pass=1 or 2 */
333 char listing; /* flag to indicate listing */ 332 char listing; /* flag to indicate listing */
334 char relocatable; /* flag to indicate relocatable object. */ 333 char relocatable; /* flag to indicate relocatable object. */
335 char terminate; /* flag to indicate termination. */ 334 char terminate; /* flag to indicate termination. */
336 char generating; /* flag to indicate that we generate code */ 335 char generating; /* flag to indicate that we generate code */
337 unsigned short loccounter,oldlc; /* Location counter */ 336 unsigned short loccounter,oldlc,prevloc,rmbcounter; /* Location counter */
338 337
339 char inpline[128]; /* Current input line (not expanded)*/ 338 char inpline[128]; /* Current input line (not expanded)*/
340 char srcline[128]; /* Current source line */ 339 char srcline[128]; /* Current source line */
341 char * srcptr; /* Pointer to line being parsed */ 340 char * srcptr; /* Pointer to line being parsed */
342 341
349 generating relocatable object code. */ 348 generating relocatable object code. */
350 349
351 void generate() 350 void generate()
352 { 351 {
353 generating = 1; 352 generating = 1;
354 if (prevloc) { 353 if (rmbmode) {
355 prevrmb = loccounter+1; // we were in rmb mode 354 rmbcounter = loccounter;
356 oldlc = loccounter = prevloc-1 ; 355 oldlc = loccounter = prevloc;
357 prevloc = 0; 356 rmbmode = 0;
358 } 357 }
359 } 358 }
360 359
361 360
362 char namebuf[MAXIDLEN+1]; 361 char namebuf[MAXIDLEN+1];
487 skipspace(); 486 skipspace();
488 c=*srcptr; 487 c=*srcptr;
489 if(isalpha(c))return scanlabel(); 488 if(isalpha(c))return scanlabel();
490 else if(isdigit(c))return scandecimal(); 489 else if(isdigit(c))return scandecimal();
491 else switch(c) { 490 else switch(c) {
492 case '*' : srcptr++;exprcat|=2; if(prevloc) return prevloc-1; else return loccounter; 491 case '*' : srcptr++;exprcat|=2; if(rmbmode) return prevloc; else return loccounter;
493 case '.' : srcptr++;exprcat|=2; if(prevrmb) return prevrmb-1; else return loccounter; 492 case '.' : srcptr++;exprcat|=2; if(os9&&!rmbmode) return rmbcounter; else return loccounter;
494 case '$' : return scanhex(); 493 case '$' : return scanhex();
495 case '%' : return scanbin(); 494 case '%' : return scanbin();
496 case '&' : /* compatibility */ 495 case '&' : /* compatibility */
497 case '@' : return scanoct(); 496 case '@' : return scanoct();
498 case '\'' : return scanchar(); 497 case '\'' : return scanchar();
1167 } else { 1166 } else {
1168 error|=1; 1167 error|=1;
1169 } 1168 }
1170 } 1169 }
1171 1170
1172 int modStart;
1173
1174 void os9begin() 1171 void os9begin()
1175 { 1172 {
1176 generate(); 1173 generate();
1177 os9=1; // contiguous code generation ( i.e. ignore org nor rmb ) 1174 os9=1; // contiguous code generation ( i.e. ignore org nor rmb )
1178 modStart = loccounter; 1175 oldlc = loccounter = rmbcounter = rmbmode = 0;
1179 reset_crc(); 1176 reset_crc();
1180 putword(0x87cd); 1177 putword(0x87cd);
1181 putword(scanexpr(0)-loccounter); // module size 1178 putword(scanexpr(0)-loccounter); // module size
1182 skipComma(); 1179 skipComma();
1183 putword(scanexpr(0)-loccounter); // offset to module name 1180 putword(scanexpr(0)-loccounter); // offset to module name
1192 while (*srcptr==',') { // there are some more 1189 while (*srcptr==',') { // there are some more
1193 srcptr++; 1190 srcptr++;
1194 putword(scanexpr(0)); 1191 putword(scanexpr(0));
1195 skipspace(); 1192 skipspace();
1196 } 1193 }
1194 prevloc = codeptr;
1195 rmbmode = 1; // next org works on rmb
1196 loccounter = 0x10000-codeptr; // should start at 0
1197 } 1197 }
1198 1198
1199 void os9end() 1199 void os9end()
1200 { 1200 {
1201 crc = crc ^ 0xffffff; 1201 crc = crc ^ 0xffffff;
1216 1216
1217 switch(co) { 1217 switch(co) {
1218 case 0:/* RMB */ 1218 case 0:/* RMB */
1219 // in OS9 mode, this generates no data 1219 // in OS9 mode, this generates no data
1220 // loccounter will be reset after any code to the current code generation 1220 // loccounter will be reset after any code to the current code generation
1221 if (prevrmb) { 1221 if (os9 && !rmbmode) {
1222 oldlc = loccounter = prevrmb-1 ; 1222 prevloc = loccounter;
1223 prevrmb = 0; 1223 oldlc = loccounter = rmbcounter;
1224 rmbmode = 1;
1224 } 1225 }
1225 setlabel(lp); 1226 setlabel(lp);
1226 operand=scanexpr(0); 1227 operand=scanexpr(0);
1227 if(unknown)error|=4; 1228 if(unknown)error|=4;
1228 loccounter+=operand; 1229 loccounter+=operand;
1461 outbuffer(); 1462 outbuffer();
1462 if(listing)outlist(); 1463 if(listing)outlist();
1463 } 1464 }
1464 if(error)report(); 1465 if(error)report();
1465 loccounter+=codeptr; 1466 loccounter+=codeptr;
1466 if (os9 && prevloc==0 ) {
1467 prevloc = loccounter+1;
1468 oldlc = loccounter = 0;
1469 }
1470 } 1467 }
1471 1468
1472 void 1469 void
1473 suppressline() 1470 suppressline()
1474 { 1471 {