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