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);