|
|
1.1 ! root 1: /* @(#)kas0.y 1.1 */ ! 2: %union { ! 3: int ival; ! 4: struct exp *expr; ! 5: struct symtab *sym; ! 6: char *str; ! 7: } ! 8: ! 9: %token NOCHAR NL ! 10: %token CM SEMI COLON LP RP ! 11: %token PLUS MINUS MUL DIV NOT POP BAR INC ! 12: %token AND XOR LS RS ! 13: %token <ival> INT ! 14: %token <sym> DNAME UNAME TNAME PAGE ! 15: %token <str> STR ! 16: %token <sym> REG BRG MEM MAR REGL REGH PC PCR ! 17: %token <sym> MVINS SFINS DFINS BRINS JMPINS ! 18: %token <sym> SEG ORG DATA DEBUG ! 19: ! 20: %nonassoc COLON ! 21: %left BAR XOR ! 22: %left AND ! 23: %left LS RS ! 24: %left PLUS MINUS ! 25: %left MUL DIV ! 26: %left NOT POP ! 27: ! 28: ! 29: %type <sym> fref ! 30: %type <ival> mach func page dst pdst sdst udst boreg oreg reg2 ! 31: %type <expr> expr val db debug ! 32: %{ ! 33: #include <stdio.h> ! 34: #include "kas.h" ! 35: struct exp explist[10]; ! 36: struct exp *xp = { explist}; ! 37: %} ! 38: ! 39: %% ! 40: %{ ! 41: int dinc; ! 42: int nlf; ! 43: %} ! 44: prog: /* empty */ ! 45: | prog line = { ! 46: xp = explist; ! 47: if (nlf) ! 48: lineno++; ! 49: } ! 50: ; ! 51: ! 52: line: labels close ! 53: | labels mach = { ! 54: putins($2); ! 55: } ! 56: | labels pseudo close ! 57: | debug close = { ! 58: debug($1->xvalue, $1->xtype); ! 59: } ! 60: | error close = { ! 61: yyerrok; ! 62: } ! 63: ; ! 64: ! 65: labels: /* empty */ ! 66: | labels UNAME COLON = { ! 67: $2->type = dot->type; ! 68: backup($2,dot->value); ! 69: } ! 70: | labels INT COLON = { ! 71: if ($2<0 || $2>9) { ! 72: yyerror("illegal numeric label"); ! 73: } else { ! 74: loclab[$2].name[0] = 1; ! 75: backup(&loclab[$2], dot->value); ! 76: loclab[$2].type = dot->value; ! 77: loclab[$2].value = 0; ! 78: } ! 79: } ! 80: ; ! 81: ! 82: close: NL = { ! 83: nlf = 1; ! 84: } ! 85: | SEMI = { ! 86: nlf = 0; ! 87: } ! 88: ; ! 89: ! 90: mach: MVINS fref CM udst close = { ! 91: $$ = $1->value|$4; ! 92: reloc[dot->value] = $2->value; ! 93: $2->value = dot->value|RLCMV; ! 94: } ! 95: | MVINS POP fref CM udst close = { ! 96: $$ = $1->value|$5; ! 97: reloc[dot->value] = $3->value; ! 98: $3->value = dot->value|RLCPOP; ! 99: } ! 100: | MVINS expr CM dst close = { ! 101: $$ = $1->value|cksrc($2->xvalue&0377, $4); ! 102: } ! 103: | MVINS REG CM dst close = { ! 104: $$ = $1->value|SRCBRG|SELA|ckreg($2->value, $4); ! 105: } ! 106: | MVINS oreg CM dst close = { ! 107: $$ = $1->value|$2|$4; ! 108: } ! 109: | SFINS REG CM dst close = { ! 110: $$ = $1->value|SRCBRG|ckreg($2->value, $4); ! 111: } ! 112: | SFINS REG close = { ! 113: $$ = $1->value|SRCBRG|$2->value|DSTREG; ! 114: } ! 115: | DFINS reg2 CM REG CM dst close = { ! 116: $$ = $1->value|$2|ckreg($4->value, $6); ! 117: } ! 118: | DFINS reg2 CM REG close = { ! 119: $$ = $1->value|$2|$4->value|DSTREG; ! 120: } ! 121: | BRINS expr close = { ! 122: $$ = $1->value|($2->xvalue&0377)|(($2->xvalue&01400)<<3); ! 123: if ((dot->value&~01777) != ($2->xvalue&~01777)) ! 124: yyerror("branch out of range"); ! 125: } ! 126: | BRINS fref close = { ! 127: $$ = $1->value; ! 128: reloc[dot->value] = $2->value; ! 129: $2->value = dot->value|RLCBR; ! 130: } ! 131: | BRINS LP func RP page close = { ! 132: $$ = $1->value|$3|$5; ! 133: } ! 134: | JMPINS expr close = { ! 135: $$ = $1->value|($2->xvalue&0377); ! 136: } ! 137: | JMPINS fref close = { ! 138: $$ = $1->value; ! 139: reloc[dot->value] = $2->value; ! 140: $2->value = dot->value|RLCMV; ! 141: } ! 142: | JMPINS LP func RP close = { ! 143: $$ = $1->value|$3; ! 144: } ! 145: ; ! 146: ! 147: func: REG = { ! 148: $$ = $1->value|SRCBRG|SELA; ! 149: } ! 150: | reg2 = { ! 151: $$ = $1|SELB; ! 152: } ! 153: | SFINS CM REG = { ! 154: $$ = $1->value|$3->value|SRCBRG; ! 155: } ! 156: | DFINS CM reg2 CM REG = { ! 157: $$ = $1->value|$3|$5->value; ! 158: } ! 159: ; ! 160: ! 161: page: /* empty */ = { ! 162: $$ = 0; ! 163: } ! 164: | CM PAGE = { ! 165: $$ = $2->value; ! 166: } ! 167: | CM POP val = { ! 168: $$ = ($3->xvalue&01400)<<3; ! 169: } ! 170: | CM POP fref = { ! 171: $$ = 0; ! 172: reloc[dot->value] = $3->value; ! 173: $3->value = dot->value|RLCPG; ! 174: } ! 175: ; ! 176: ! 177: fref: ! 178: UNAME ! 179: | TNAME ! 180: ; ! 181: ! 182: dst: MINUS = { ! 183: $$ = 0; ! 184: } ! 185: | pdst ! 186: | pdst BAR pdst = { ! 187: $$ = ckdst($1, $3); ! 188: } ! 189: | pdst BAR pdst BAR pdst = { ! 190: $$ = ckdst(ckdst($1, $3), $5); ! 191: } ! 192: ; ! 193: ! 194: pdst: REG = { ! 195: $$ = $1->value|DSTREG; ! 196: } ! 197: | BRG = { ! 198: $$ = DSTBRG; ! 199: } ! 200: | MEM = { ! 201: $$ = DSTMEM; ! 202: } ! 203: | REGL = { ! 204: $$ = $1->value|DSTREGL; ! 205: } ! 206: | REGH = { ! 207: $$ = $1->value|DSTREGH; ! 208: } ! 209: | BRG RS = { ! 210: $$ = DSTBGRS; ! 211: } ! 212: | MAR = { ! 213: $$ = DSTMAR; ! 214: } ! 215: | MAR INC = { ! 216: $$ = DSTMARI; ! 217: } ! 218: | POP MAR = { ! 219: $$ = DSTMARP; ! 220: } ! 221: | PCR = { ! 222: $$ = DSTPCH|DSTREGH; ! 223: } ! 224: ; ! 225: ! 226: udst: sdst ! 227: | sdst BAR sdst = { ! 228: $$ = ckdst($1, $3); ! 229: } ! 230: ; ! 231: ! 232: sdst: BRG = { ! 233: $$ = DSTBRG; ! 234: } ! 235: | MEM = { ! 236: $$ = DSTMEM; ! 237: } ! 238: | MAR = { ! 239: $$ = DSTMAR; ! 240: } ! 241: | MAR INC = { ! 242: $$ = DSTMARI; ! 243: } ! 244: | POP MAR = { ! 245: $$ = DSTMARP; ! 246: } ! 247: ; ! 248: ! 249: oreg: reg2 = { ! 250: $$ = $1|SELB; ! 251: } ! 252: | REGL = { ! 253: $$ = ($1->value<<4)|SRCREGL; ! 254: } ! 255: | REGH = { ! 256: $$ = ($1->value<<4)|SRCREGH; ! 257: } ! 258: | boreg = { ! 259: $$ = ($1<<4)|SRCREGH; ! 260: } ! 261: ; ! 262: ! 263: reg2: BRG = { ! 264: $$ = SRCBRG; ! 265: } ! 266: | MEM = { ! 267: $$ = SRCMEM; ! 268: } ! 269: ; ! 270: ! 271: boreg: MAR = { ! 272: $$ = SRCMARL; ! 273: } ! 274: | POP MAR = { ! 275: $$ = SRCMARH; ! 276: } ! 277: | PC = { ! 278: $$ = SRCPCL; ! 279: } ! 280: | POP PC = { ! 281: $$ = SRCPCH; ! 282: } ! 283: ; ! 284: ! 285: expr: val ! 286: | LP expr RP = { ! 287: $$ = $2; ! 288: } ! 289: | expr BAR expr = { ! 290: $1->xvalue |= $3->xvalue; ! 291: } ! 292: | expr XOR expr = { ! 293: $1->xvalue ^= $3->xvalue; ! 294: } ! 295: | expr AND expr = { ! 296: $1->xvalue &= $3->xvalue; ! 297: } ! 298: | expr LS expr = { ! 299: $1->xvalue <<= $3->xvalue; ! 300: } ! 301: | expr RS expr = { ! 302: $1->xvalue >>= $3->xvalue; ! 303: } ! 304: | expr PLUS expr = { ! 305: $1->xvalue += $3->xvalue; ! 306: } ! 307: | expr MINUS expr = { ! 308: $1->xvalue -= $3->xvalue; ! 309: } ! 310: | expr MUL expr = { ! 311: $1->xvalue *= $3->xvalue; ! 312: } ! 313: | expr DIV expr = { ! 314: $1->xvalue /= $3->xvalue; ! 315: } ! 316: | NOT expr = { ! 317: $2->xvalue = ~$2->xvalue; ! 318: $$ = $2; ! 319: } ! 320: | POP expr = { ! 321: $2->xvalue = ($2->xvalue>>8)&0377; ! 322: $$ = $2; ! 323: } ! 324: | MINUS expr %prec POP = { ! 325: $2->xvalue = -$2->xvalue; ! 326: $$ = $2; ! 327: } ! 328: ; ! 329: ! 330: val: DNAME = { ! 331: $$ = xp++; ! 332: $$->xtype = XABS; ! 333: $$->xvalue = $1->value; ! 334: } ! 335: | INT = { ! 336: $$ = xp++; ! 337: $$->xtype = XABS; ! 338: $$->xvalue = $1; ! 339: } ! 340: ; ! 341: ! 342: pseudo: SEG = { ! 343: if (dot->type==XTEXT) ! 344: textsv = dot->value; ! 345: else datasv = dot->value; ! 346: dot->type = $1->value; ! 347: if (dot->type==XTEXT) ! 348: dot->value = textsv; ! 349: else dot->value = datasv; ! 350: } ! 351: | ORG expr = { ! 352: if ($2->xvalue<0 || $2->xvalue>=NKMCI) ! 353: yyerror("illegal org value"); ! 354: else dot->value = $2->xvalue; ! 355: } ! 356: | data explist ! 357: ; ! 358: ! 359: data: DATA = { ! 360: if (dot->type != XDATA) { ! 361: yyerror("no data in text"); ! 362: } ! 363: dinc = $1->value; ! 364: } ! 365: ; ! 366: ! 367: explist: outexpr ! 368: | explist CM outexpr ! 369: ; ! 370: ! 371: outexpr: expr = { ! 372: putdat($1->xvalue&0377); ! 373: if (dinc==2) ! 374: putdat(($1->xvalue>>8)&0377); ! 375: xp = explist; ! 376: } ! 377: ; ! 378: ! 379: debug: db ! 380: | db INT = { ! 381: $1->xtype = $2; ! 382: } ! 383: | db STR = { ! 384: $1->xtype = (int)$2; ! 385: } ! 386: ; ! 387: ! 388: db: DEBUG = { ! 389: $$ = xp++; ! 390: $$->xvalue = $1->value; ! 391: $$->xtype = 0; ! 392: } ! 393: ; ! 394: %% ! 395: ! 396: yyerror(s, a) ! 397: char *s; ! 398: { ! 399: anyerrs++; ! 400: if (infile) ! 401: fprintf(stderr, "%s:", infile); ! 402: fprintf(stderr, "%d:", lineno); ! 403: fprintf(stderr, s, a); ! 404: fprintf(stderr, "\n"); ! 405: } ! 406: ! 407: #include "kas0.yl"
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.