Mercurial > hg > Members > kono > os9 > sbc09
comparison a09.c @ 5:35028b396a35
on going
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 04 Jul 2018 21:30:24 +0900 |
parents | 831ac057ea86 |
children | 9c2602e1d716 |
comparison
equal
deleted
inserted
replaced
4:6159cc57d44e | 5:35028b396a35 |
---|---|
6 THERE IS NO WARRANTY ON THIS PROGRAM. | 6 THERE IS NO WARRANTY ON THIS PROGRAM. |
7 | 7 |
8 Generates binary image file from the lowest to | 8 Generates binary image file from the lowest to |
9 the highest address with actually assembled data. | 9 the highest address with actually assembled data. |
10 | 10 |
11 Machine dependencies: | 11 Machin edependencies: |
12 char is 8 bits. | 12 char is 8 bits. |
13 short is 16 bits. | 13 short is 16 bits. |
14 integer arithmetic is twos complement. | 14 integer arithmetic is twos complement. |
15 | 15 |
16 syntax a09 [-o filename] [-l filename] sourcefile. | 16 syntax a09 [-o filename] [-l filename] sourcefile. |
478 char oldcat,c; | 478 char oldcat,c; |
479 exprcat=0; | 479 exprcat=0; |
480 if(level==10)return scanfactor(); | 480 if(level==10)return scanfactor(); |
481 t=scanexpr(level+1); | 481 t=scanexpr(level+1); |
482 while(1) { | 482 while(1) { |
483 skipspace(); | 483 // skipspace(); |
484 c=*srcptr++; | 484 c=*srcptr++; |
485 switch(c) { | 485 switch(c) { |
486 case '*':oldcat=exprcat; | 486 case '*':oldcat=exprcat; |
487 t*=scanexpr(10); | 487 t*=scanexpr(10); |
488 exprcat|=oldcat|16; | 488 exprcat|=oldcat|16; |
548 oldcat=exprcat; | 548 oldcat=exprcat; |
549 t=t>scanexpr(7); | 549 t=t>scanexpr(7); |
550 exprcat|=oldcat|16; | 550 exprcat|=oldcat|16; |
551 break; | 551 break; |
552 } | 552 } |
553 case '!':if(level>=6||*srcptr!='=')EXITEVAL | 553 case '!':if(level>=6) { |
554 srcptr++; | 554 if (*srcptr=='=') { |
555 oldcat=exprcat; | 555 srcptr++; |
556 t=t!=scanexpr(6); | 556 oldcat=exprcat; |
557 exprcat|=oldcat|16; | 557 t=t!=scanexpr(6); |
558 exprcat|=oldcat|16; | |
559 } else { | |
560 oldcat=exprcat; | |
561 t|=scanexpr(6); | |
562 exprcat|=oldcat|16; | |
563 } | |
564 } | |
558 break; | 565 break; |
559 case '=':if(level>=6)EXITEVAL | 566 case '=':if(level>=6)EXITEVAL |
560 if(*srcptr=='=')srcptr++; | 567 if(*srcptr=='=')srcptr++; |
561 oldcat=exprcat; | 568 oldcat=exprcat; |
562 t=t==scanexpr(6); | 569 t=t==scanexpr(6); |
725 scanspecial(); | 732 scanspecial(); |
726 break; | 733 break; |
727 case '#': | 734 case '#': |
728 if(mode==5)error|=2;else mode=0; | 735 if(mode==5)error|=2;else mode=0; |
729 srcptr++; | 736 srcptr++; |
737 if (*srcptr=='"') { | |
738 operand = (srcptr[1]<<8) + srcptr[2] ; | |
739 srcptr += 3; | |
740 break; | |
741 } | |
730 operand=scanexpr(0); | 742 operand=scanexpr(0); |
731 break; | 743 break; |
732 case '<': | 744 case '<': |
733 srcptr++; | 745 srcptr++; |
734 if(*srcptr=='<') { | 746 if(*srcptr=='<') { |
842 fprintf(stderr,"%s\n",errormsg[i]); | 854 fprintf(stderr,"%s\n",errormsg[i]); |
843 if(pass==2&&listing)fprintf(listfile,"**** %s\n",errormsg[i]); | 855 if(pass==2&&listing)fprintf(listfile,"**** %s\n",errormsg[i]); |
844 } | 856 } |
845 error>>=1; | 857 error>>=1; |
846 } | 858 } |
859 error = 0; | |
847 errors++; | 860 errors++; |
848 } | 861 } |
849 | 862 |
850 void | 863 void |
851 outlist() | 864 outlist() |
936 | 949 |
937 void | 950 void |
938 oneimm(int co) | 951 oneimm(int co) |
939 { | 952 { |
940 scanoperands(); | 953 scanoperands(); |
941 if(mode>=3)error|=2; | 954 if(mode>=3) |
955 error|=2; | |
942 putbyte(co); | 956 putbyte(co); |
943 putbyte(operand); | 957 putbyte(operand); |
944 } | 958 } |
945 | 959 |
946 void | 960 void |
1319 struct oprecord * op; | 1333 struct oprecord * op; |
1320 int co; | 1334 int co; |
1321 char c; | 1335 char c; |
1322 srcptr=srcline; | 1336 srcptr=srcline; |
1323 oldlc=loccounter; | 1337 oldlc=loccounter; |
1324 error=0; | 1338 // error=0; |
1325 unknown=0;certain=1; | 1339 unknown=0;certain=1; |
1326 lp=0; | 1340 lp=0; |
1327 codeptr=0; | 1341 codeptr=0; |
1328 if(isalnum(*srcptr)) { | 1342 if(isalnum(*srcptr)) { |
1329 scanname();lp=findsym(namebuf); | 1343 scanname();lp=findsym(namebuf); |