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;