1File: AS68INIT.C Page 1 1 /* 2 Copyright 1981 3 Alcyon Corporation 4 8716 Production Ave. 5 San Diego, Ca. 92121 6 */ 7 8 #include "machine.h" 9 #include "ctype.h" 10 11 #ifdef PDP11 12 struct { 13 char lobyte; 14 char hibyte; 15 }; 16 struct { 17 char *ptrw1; 18 char *ptrw2; 19 }; 20 struct { 21 int wd1; 22 int wd2; 23 }; 24 struct { 25 int swd1; 26 }; 27 #endif 28 29 #ifdef MC68000 30 struct { 31 char hibyte; 32 char lobyte; 33 }; 34 struct { 35 char *ptrw2; 36 }; 37 struct { 38 int wd1; 39 int wd2; 40 }; 41 struct { 42 int swd1; 43 }; 44 #endif 45 46 #ifdef VAX 47 struct { 48 short wd2; 49 short wd1; 50 }; 51 struct { 52 short swd1; 53 }; 54 55 struct { 56 char lobyte; 57 char hibyte; 58 }; 59 struct { 1File: AS68INIT.C Page 2 60 char *ptrw2; 61 }; 62 #endif 63 64 /* format of a symbol entry in the main table*/ 65 66 # define NAMELEN 8 /*length of name in symbol table*/ 67 struct symtab { 68 char name[NAMELEN]; /*symbol name*/ 69 int flags; /*bit flags*/ 70 char *tlnk; /*table link*/ 71 long vl1; /*symbol value*/ 72 }; 73 74 struct symtab *symtptr; 75 # define STESIZE (sizeof *symtptr) /*byte length of symbol table entry*/ 76 77 /* flags for symbols*/ 78 # define SYDF 0100000 /*defined*/ 79 # define SYEQ 0040000 /*equated*/ 80 # define SYGL 0020000 /*global - entry or external*/ 81 # define SYER 0010000 /*equated register*/ 82 # define SYXR 0004000 /*external reference*/ 83 # define SYRA 0002000 /*DATA based relocatable*/ 84 # define SYRO 0001000 /*TEXT based relocatable*/ 85 # define SYBS 0000400 /*BSS based relocatable*/ 86 # define SYIN 0000200 /*internal symbol -- opcode, directive or equ*/ 87 # define SYPC 0000100 /*[vlh]equated using star '*' expression*/ 88 # define SYRM 0000040 /*[vlh]register mask equate*/ 89 90 /*flags for opcodes and directives*/ 91 # define OPDR 0100000 /*0=>opcode, 1=>directive*/ 92 # define OPFF 037 /*type of instruction (used as mask)*/ 93 94 struct irts { 95 char *irle; /*ptr to last entry in chain*/ 96 char *irfe; /*ptr to first entry in chain*/ 97 }; 98 99 long stlen; /*length of symbol table*/ 100 101 /* 102 * intermediate text file 103 * format of the intermediate text for one statement: 104 * 105 * ****************************************************** 106 * * it type = ITBS * # it entries * 0 107 * ****************************************************** 108 * * absolute line number (long) * 109 * ****************************************************** 110 * * it type = ITSY * instr length * 1 111 * ****************************************************** 112 * * symbol table pointer for stmt label (long) * 113 * ****************************************************** 114 * * it type = ITSY * instr mode length * 2 115 * ****************************************************** 116 * * opcode ptr (long) * 117 * ****************************************************** 118 * * it type = ITCN * relocation base * 3 1File: AS68INIT.C Page 3 119 * ****************************************************** 120 * * location counter (pass 1) * 121 * ****************************************************** 122 * * it type * relocation flag * 4 - oprnds 123 * ****************************************************** 124 * * value (long) * 125 * ****************************************************** 126 * . 127 * . 128 * . 129 * ****************************************************** 130 * * it type * relocation flag * n - oprnds 131 * ****************************************************** 132 * * value (long) * 133 * ****************************************************** 134 */ 135 136 #define ITOP1 4 /*first it entry for operands*/ 137 138 /* 139 * it type meaning 140 * 0 beginning of statement 141 * 1 value is pointer to symbol table 142 * 2 value is a constant 143 * 3 value is a specal char 144 * 145 * relocation flag for opcode it entry is operand length: 146 * 'b' => byte 147 * 'w' => word 148 * 'l' => long 149 */ 150 151 struct it { 152 char itty; /*it type*/ 153 char itrl; /*relocation flag or # it entries*/ 154 long itop; 155 }; 156 157 int mode=0; /*operand mode (byte, word, long)*/ 158 int modelen=0; /*operand length per mode*/ 159 #define BYTE 'b' 160 #define WORD 'w' 161 #define LONG 'l' 162 163 /* parameters that define the main table*/ 164 #define SZMT 300 /*initial size of the main table */ 165 /*must be large enough to initialize*/ 166 #ifdef PDP11 167 #define ICRSZMT 10 /*add to main table when run out*/ 168 #else 169 #define ICRSZMT 50 /*add to main table when run out*/ 170 #endif 171 int cszmt=0; /*current size of main table*/ 172 char *bmte=0; /*beginning of main table*/ 173 char *emte=0; /*end of main table*/ 174 175 /* intermediate text types*/ 176 #define ITBS 0 /*beginning of statement*/ 177 #define ITSY 1 /*pointer to symbol table*/ 1File: AS68INIT.C Page 4 178 #define ITCN 2 /*constant*/ 179 #define ITSP 3 /*special*/ 180 #define ITRM 4 /*[vlh]register mask!*/ 181 #define ITPC 5 /*[vlh]pc relative argument*/ 182 183 # define ITBSZ 256 /*size of the it buffer*/ 184 int itbuf[ITBSZ]={0}; /*it buffer*/ 185 186 #define STMAX 200 /*size of intermediate text buffer*/ 187 struct it stbuf[STMAX]={0}; /*holds it for one statement*/ 188 189 char sbuf[512]={0}; /*holds one block of source*/ 190 191 /*initial reference table for symbols*/ 192 # define SZIRT 128 193 char *sirt[SZIRT]={0}; 194 195 /*initial reference table to opcodes*/ 196 char *oirt[SZIRT]={0}; 197 198 /*external symbol table*/ 199 #define EXTSZ 512 200 char *extbl[EXTSZ]={0}; 201 int extindx=0; /*index to external symbol table*/ 202 char **pexti=0; /*ptr to external symbol table*/ 203 204 int absln=0; /*absolute line number*/ 205 int p2absln=0; /*pass 2 line number*/ 206 int fcflg=0; /*0=>passed an item. 1=>first char*/ 207 int fchr=0; /*first char in term*/ 208 int ifn=0; /*source file descriptor*/ 209 int *pitix=0; /*ptr to it buffer*/ 210 int itwc=0; /*number of words in it buffer*/ 211 struct it *pitw=0; /*ptr to it buffer next entry*/ 212 int itype=0; /*type of item*/ 213 long ival=0; /*value of item*/ 214 char *lblpt=0; /*label pointer*/ 215 char lbt[NAMELEN]={0}; /*holds label name*/ 216 char *lmte=0; /*last entry in main table*/ 217 long loctr=0; /*location counter*/ 218 long savelc[4]={0}; /*save relocation counters for 3 bases*/ 219 int nite=0; /*number of entries in stbuf*/ 220 struct it *pnite=0; 221 int lfn=0; /*loader output file descriptor*/ 222 char *opcpt=0; /*pointer to opcode entry in main table*/ 223 int p2flg=0; /*0=>pass 1 1=>pass 2*/ 224 char **pirt=0; /*entry in initial reference table*/ 225 int reloc=0; /*relocation value returned by expression evaluator (expr)*/ 226 int rlflg=0; /*relocation value of current location counter*/ 227 /*relocation values*/ 228 # define ABS 0 /*absolute*/ 229 # define DATA 1 230 # define TEXT 2 231 # define BSS 3 232 # define EXTRN 4 /*externally defined*/ 233 234 #define EOLC '\n' /*end of line character*/ 235 #define EOF 0 /*end of file indicator*/ 236 #define NULL 0 /* [vlh] character null '\0' */ 1File: AS68INIT.C Page 5 237 #define TRUE 1 /* [vlh] boolean values */ 238 #define FALSE 0 /* [vlh] boolean values */ 239 240 int format=0; 241 int sbuflen=0; /*number of chars in sbuf*/ 242 char *psbuf=0; /*ptr into sbuf*/ 243 int itfn=0; /*it file number*/ 244 char itfnc=0; /*last char of it file name*/ 245 int trbfn=0; /*temp for text relocation bits*/ 246 char trbfnc=0; /*last char of text rb file*/ 247 int dafn=0; /*file for data stuff*/ 248 char dafnc=0; /*last char of data file*/ 249 int drbfn=0; /*file for data relocation bits*/ 250 char drbfnc=0; /*last char*/ 251 int prtflg=0; /*print output flag*/ 252 int undflg=0; /*make undefined symbols external flag*/ 253 254 int starmul=0; /* * is multiply operator*/ 255 256 char *endptr=0, *addptr=0; 257 char *orgptr=0; 258 char *subptr=0, *addiptr=0, *addqptr=0, *subiptr=0, *subqptr=0; 259 char *cmpptr=0, *addaptr=0, *cmpaptr=0, *subaptr=0, *cmpmptr=0; 260 char *equptr=0; 261 char *andptr=0, *andiptr=0, *eorptr=0, *eoriptr=0, *orptr=0, *oriptr=0; 262 char *cmpiptr=0; 263 char *moveptr=0, *moveqptr=0; 264 char *exgptr=0; 265 char *evenptr=0; 266 char *jsrptr=0, *bsrptr=0, *nopptr=0; 267 268 char peekc=0; 269 int numcon[2]=0, numsym[2]=0, indir[2]=0, immed[2]=0, numreg[2]=0; 270 int plevel=0; /*parenthesis level counter*/ 271 int opdix=0; /*operand index counter*/ 272 int p1inlen=0; /*pass 1 instr length*/ 273 int instrlen=0; /*pass 2 bytes in current instruction*/ 274 275 /* effective address mode bits*/ 276 #define DDIR 000 277 #define ADIR 010 278 #define INDIRECT 020 279 #define INDINC 030 280 #define DECIND 040 281 #define INDDISP 050 282 #define INDINX 060 283 #define SADDR 070 284 #define LADDR 071 285 #define IMM 074 286 287 #define AREGLO 8 288 #define AREGHI 15 289 290 /* relocation bit definitions:*/ 291 #define RBMASK 07 /*tells type of relocation*/ 292 #define INSABS 7 /*first word of instr -- absolute*/ 293 #define DABS 0 /*data word absolute*/ 294 #define TRELOC 2 /* TEXT relocatable*/ 295 #define DRELOC 1 /* DATA relocatable*/ 1File: AS68INIT.C Page 6 296 #define BRELOC 3 /* BSS relocatable*/ 297 #define EXTVAR 4 /* ref to external variable*/ 298 #define LUPPER 5 /* upper word of long*/ 299 #define EXTREL 6 /* external relative mode*/ 300 301 /* ptrs to ins[] and rlbits[]*/ 302 int *pins=0; 303 int *prlb=0; 304 int ins[5]={0}; /*holds instruction words*/ 305 306 #define PRTCHLEN 128 307 char prtchars[PRTCHLEN]={0}; /*line buffer for putchar*/ 308 char *prtchidx=0; /*index for putchar*/ 309 310 int extflg=0, extref=0; /*external in expr*/ 311 312 #define CCR 16 313 #define SR 17 314 #define USP 18 315 #define MOVECCR 042300 316 #define MOVESR 043300 317 #define SRMOVE 040300 318 #define MOVEUSP 047140 319 320 struct op { 321 int ea; /* effective address bits*/ 322 int len; /* effective address length in bytes*/ 323 long con; /*constant or reloc part of operand*/ 324 int drlc; /*reloc of con*/ 325 int ext; /*external variable #*/ 326 int idx; /*index register if any*/ 327 int xmod; /*mode of index reg*/ 328 } opnd[2]={0}; 329 #define OPSTLEN 10 330 #define TREELEN 20 331 struct buf{ 332 int fildes; 333 int nunused; 334 char *xfree; 335 char buff[512]; 336 }; 337 338 struct buf lbuf={0}; 339 struct buf tbuf={0}; 340 struct buf dabuf={0}; 341 struct buf drbuf={0}; 342 343 int nerror=0; /*# of assembler errors*/ 344 int in_err=0; /*[vlh] don't generate instrlen err if already err state*/ 345 int shortadr=0; /*short addresses if set*/ 346 347 #define CLRFOR 24 348 #define CLRVAL 041000 349 350 long itoffset=0; 351 352 #define LASTCHTFN tfilname[11] 353 #define PC 22 354 1File: AS68INIT.C Page 7 355 int equflg=0; /*doing an equate stmt*/ 356 357 #define ANDI 01000 358 #define AND 0140000 359 #define ORI 0 360 #define OR 0100000 361 #define EORI 05000 362 #define EOR 0130000 363 #define MOVE 0 364 365 long lseek(); 366 char *sbrk(); 367 char *lemt(); 368 369 int refpc=0; /* * referenced in expr*/ 370 #define SOH 1 371 372 /* Conditional Assembly variables and constants [vlh] */ 373 #define LOW_CA 21 /* [vlh] */ 374 #define HI_CA 30 /* [vlh] */ 375 376 int ca_true=0; /* true unless in a false CA*/ 377 int ca=0; /* depth of conditional assembly, none = 0*/ 378 int ca_level=0; /* at what CA depth did CA go false?*/ 379 380 /* pass 1 global variables */ 381 int numops=0; /*number of operands*/ 382 int inoffset=0; /*[vlh]offset directive*/ 383 int didorg=0; 384 int initflg=0; /*initialize flag*/ 385 386 /* defines */ 387 #define igblk() while(fchr==' ') fchr=gchr() 388 #define ckein() ((pitw >= pnite)) 389 390 /* is it an alterable operand */ 391 #define memalt(ap) (memea(ap) && altea(ap)) 392 #define dataalt(ap) (dataea(ap) && altea(ap)) 393 #define altea(ap) ((((ap)->ea&070)!=SADDR || ((ap)->ea&6)==0)) 394 395 /* is it the specific type of operand */ 396 #define memea(ap) (((ap)->ea&070) >= INDIRECT) 397 #define dataea(ap) (((ap)->ea&070) != ADIR) 398 #define pcea(ap) ((ap)->ea==072 || (ap)->ea==073) 399 #define ckdreg(ap) ((ap)->ea>=0 && (ap)->eaea>=AREGLO && (ap)->ea<=AREGHI) 401 /* 402 * DRI Listing Hacks: 403 */ 404 char *sfname=0; /* -> Source filename */ 405 int xline=0; /* Current line number */ 406 int xpage=0; /* Current page number */ 407 /* 408 * More Initializations: 409 */ 410 char *tfilname[80] = {0}; /* Temp filename area */ 411 char *initfnam[80] = {0}; /* Init filename area */ 412 struct it exitm={0}; 413 int prcnt=0; 1File: AS68INIT.C Page 8 414 int rval=0; 415 int lpflg=0; 416 int lastopr=0; 417 int rlbits[5]={0}; 418 int pline=0; 419 int prsp=0; 420 int amode=0; 421 long stlen=0; 422 int udfct=0; 423 int errno=0; 424 int nitleft=0; 425 int hibytflg[4]={0}; 426 int hibytw[4]={0}; 427 struct it *piop=0; 428 struct it *pitr=0; 429 struct it opstk[OPSTLEN]={0}; 430 struct it tree[TREELEN]={0}; 431 int chmvq=0; 432 int explmod=0; 433 int ftudp=0; 434 int iop=0; 435 int itr=0; 436 char ldfn[40]={0}; 437 int opcval=0; 438 int poslab=0; 439 int symcon=0; 440 char *tfilptr=0; 441 int tlab1=0; 442 #define HDSIZE (sizeof couthd) /**.o file header size*/ 443 struct hdr { 444 short ch_magic; /*c.out magic number 060016 = $600E*/ 445 long ch_tsize; /*text size*/ 446 long ch_dsize; /*data size*/ 447 long ch_bsize; /*bss size*/ 448 long ch_ssize; /*symbol table size*/ 449 long ch_stksize; /*stack size*/ 450 long ch_entry; /*entry point*/ 451 short ch_rlbflg; /*relocation bits suppressed flag*/ 452 } couthd={0}; 453 454 #define MAGIC 0x601a /* bra .+26 instruction*/