/* * pseudo --- pseudo op processing */ #define RMB 0 /* Reserve Memory Bytes */ #define FCB 1 /* Form Constant Bytes */ #define FDB 2 /* Form Double Bytes (words) */ #define FCC 3 /* Form Constant Characters */ #define ORG 4 /* Origin */ #define EQU 5 /* Equate */ #define ZMB 6 /* Zero memory bytes */ #define FILL 7 /* block fill constant bytes */ #define OPT 8 /* assembler option */ #define NULL_OP 9 /* null pseudo op */ #define PAGE 10 /* new page */ struct oper pseudo[] = { "bsz", PSEUDO, ZMB, 0, "end", PSEUDO, NULL_OP,0, "equ", PSEUDO, EQU, 0, "fcb", PSEUDO, FCB, 0, "fcc", PSEUDO, FCC, 0, "fdb", PSEUDO, FDB, 0, "fill", PSEUDO, FILL, 0, "nam", PSEUDO, NULL_OP,0, "name", PSEUDO, NULL_OP,0, "opt", PSEUDO, OPT, 0, "org", PSEUDO, ORG, 0, "pag", PSEUDO, PAGE, 0, "page", PSEUDO, PAGE, 0, "rmb", PSEUDO, RMB, 0, "spc", PSEUDO, NULL_OP,0, "ttl", PSEUDO, NULL_OP,0, "zmb", PSEUDO, ZMB, 0 }; /* * do_pseudo --- do pseudo op processing */ do_pseudo(op) int op; /* which op */ { char fccdelim; int j; int fill; char *skip_white(); if( op != EQU && *Label ) install(Label,Pc); P_force++; switch(op){ case RMB: /* reserve memory bytes */ if( eval() ){ Pc += Result; f_record(); /* flush out bytes */ } else error("Undefined Operand during Pass One"); break; case ZMB: /* zero memory bytes */ if( eval() ) while( Result-- ) emit(0); else error("Undefined Operand during Pass One"); break; case FILL: /* fill memory with constant */ eval(); fill = Result; if( *Optr++ != ',' ) error("Bad fill"); else{ Optr = skip_white(Optr); eval(); while( Result-- ) emit(fill); } break; case FCB: /* form constant byte(s) */ do{ Optr = skip_white(Optr); eval(); if( Result > 0xFF ){ if(!Force_byte) warn("Value truncated"); Result = lobyte(Result); } emit(Result); }while( *Optr++ == ',' ); break; case FDB: /* form double byte(s) */ do{ Optr = skip_white(Optr); eval(); eword(Result); }while( *Optr++ == ',' ); break; case FCC: /* form constant characters */ if(*Operand==EOS) break; fccdelim = *Optr++; while( *Optr != EOS && *Optr != fccdelim) emit(*Optr++); if(*Optr == fccdelim) Optr++; else error("Missing Delimiter"); break; case ORG: /* origin */ if( eval() ){ Old_pc = Pc = Result; f_record(); /* flush out any bytes */ } else error("Undefined Operand during Pass One"); break; case EQU: /* equate */ if(*Label==EOS){ error("EQU requires label"); break; } if( eval() ){ install(Label,Result); Old_pc = Result; /* override normal */ } else error("Undefined Operand during Pass One"); break; case OPT: /* assembler option */ P_force=0; if( head(Operand,"l") ) Lflag=1; else if( head(Operand,"nol")) Lflag=0; else if( head(Operand,"c")){ Cflag=1; Ctotal=0; } else if( head(Operand,"noc")) Cflag=0; else if( head(Operand,"contc")){ Cflag=1; } else if ( head(Operand,"s")) Sflag = 1; else if ( head(Operand,"cre")) CREflag = 1; else error("Unrecognized OPT"); break; case PAGE: /* go to a new page */ P_force=0; N_page = 1; if (Pass == 2 ) if (Lflag) { printf ("\f"); printf ("%-10s",Argv[Cfn]); printf (" "); printf ("page %3d\n",Page_num++); } break; case NULL_OP: /* ignored psuedo ops */ P_force=0; break; default: fatal("Pseudo error"); } }