Mercurial > hg > Members > kono > os9 > sbc09
comparison a09.c @ 26:51a35f0347f6
fix label
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 11 Jul 2018 01:00:18 +0900 |
parents | c4e3abe97e2c |
children | 3c14d647bb51 |
comparison
equal
deleted
inserted
replaced
25:c4e3abe97e2c | 26:51a35f0347f6 |
---|---|
178 }; | 178 }; |
179 | 179 |
180 int symcounter=0; | 180 int symcounter=0; |
181 int os9 = 0; // os9 flag | 181 int os9 = 0; // os9 flag |
182 int prevloc = 0; | 182 int prevloc = 0; |
183 struct symrecord * prevlp = 0; | |
183 | 184 |
184 /* expression categories... | 185 /* expression categories... |
185 ECORD all zeros is ordinary constant. | 186 ECORD all zeros is ordinary constant. |
186 ECADR bit 1 indicates address within module. | 187 ECADR bit 1 indicates address within module. |
187 ECEXT bit 2 indicates external address. | 188 ECEXT bit 2 indicates external address. |
891 } | 892 } |
892 | 893 |
893 void | 894 void |
894 setlabel(struct symrecord * lp) | 895 setlabel(struct symrecord * lp) |
895 { | 896 { |
897 if (prevlp) { | |
898 struct symrecord *l = prevlp; | |
899 prevlp = 0; | |
900 setlabel(l); | |
901 } | |
896 if(lp) { | 902 if(lp) { |
897 if(lp->cat!=13&&lp->cat!=6) { | 903 if(lp->cat!=13&&lp->cat!=6) { |
898 if(lp->cat!=2||lp->value!=loccounter) | 904 if(lp->cat!=2||lp->value!=loccounter) |
899 error|=8; | 905 error|=8; |
900 } else { | 906 } else { |
1353 lp=0; | 1359 lp=0; |
1354 codeptr=0; | 1360 codeptr=0; |
1355 if(isalnum(*srcptr)) { | 1361 if(isalnum(*srcptr)) { |
1356 scanname();lp=findsym(namebuf); | 1362 scanname();lp=findsym(namebuf); |
1357 if(*srcptr==':') srcptr++; | 1363 if(*srcptr==':') srcptr++; |
1364 if(lp && pass==2) { | |
1365 oldlc = lp->value; | |
1366 } | |
1358 } | 1367 } |
1359 skipspace(); | 1368 skipspace(); |
1360 if(isalnum(*srcptr)) { | 1369 if(isalnum(*srcptr)) { |
1361 scanname(); | 1370 scanname(); |
1362 op=findop(namebuf); | 1371 op=findop(namebuf); |
1385 c=*srcptr; | 1394 c=*srcptr; |
1386 if (debug) fprintf(stderr,"DEBUG: processline: mode=%d, opsize=%d, error=%d, postbyte=%02X c=%c\n",mode,opsize,error,postbyte,c); | 1395 if (debug) fprintf(stderr,"DEBUG: processline: mode=%d, opsize=%d, error=%d, postbyte=%02X c=%c\n",mode,opsize,error,postbyte,c); |
1387 if(c!=' '&&*(srcptr-1)!=' '&&c!=0&&c!=';')error|=2; | 1396 if(c!=' '&&*(srcptr-1)!=' '&&c!=0&&c!=';')error|=2; |
1388 } | 1397 } |
1389 else error|=0x8000; | 1398 else error|=0x8000; |
1390 }else setlabel(lp); | 1399 } else { |
1400 prevlp = lp; // os9 mode label can be data or code | |
1401 } | |
1391 if(pass==2) { | 1402 if(pass==2) { |
1392 outbuffer(); | 1403 outbuffer(); |
1393 if(listing)outlist(); | 1404 if(listing)outlist(); |
1394 } | 1405 } |
1395 if(error)report(); | 1406 if(error)report(); |
1528 expandline(); | 1539 expandline(); |
1529 lineno++; | 1540 lineno++; |
1530 srcptr=srcline; | 1541 srcptr=srcline; |
1531 if(suppress)suppressline(); else processline(); | 1542 if(suppress)suppressline(); else processline(); |
1532 } | 1543 } |
1544 setlabel(0); // process prevlp | |
1533 fclose(srcfile); | 1545 fclose(srcfile); |
1534 if(suppress) { | 1546 if(suppress) { |
1535 fprintf(stderr,"improperly nested IF statements in %s",curname); | 1547 fprintf(stderr,"improperly nested IF statements in %s",curname); |
1536 errors++; | 1548 errors++; |
1537 suppress=0; | 1549 suppress=0; |