home *** CD-ROM | disk | FTP | other *** search
/ GEMini Atari / GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso / files / falcon / asm56 / gram.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-11-14  |  68.4 KB  |  2,352 lines

  1.  
  2. # line 2 "a56.y"
  3. /*******************************************************
  4.  *
  5.  *  a56 - a DSP56001 assembler
  6.  *
  7.  *  Written by Quinn C. Jensen
  8.  *  July 1990
  9.  *  jensenq@npd.novell.com (or jensenq@qcj.icon.com)
  10.  *
  11.  *******************************************************\
  12.  
  13. /*
  14.  * Copyright (C) 1990-1992 Quinn C. Jensen
  15.  *
  16.  * Permission to use, copy, modify, distribute, and sell thi3 software
  17.  * and its documentation for any purpose is hereby granted without fee,
  18.  * provided that the above copyright notice appeice appeice appeice appeice appe[] = "@(#) getopt.c 5.0 (UTZoo) 1985";
  19. #endif
  20.  
  21. #define    ARGCH    (int)':'
  22. #define BADCH     (int)'?'
  23. #define EMSG     ""
  24. #define    ENDARGS  "--"
  25.  
  26. /* this is included because index is not on some UNIX systems */
  27. static
  28. char *
  29. index (s, c)
  30. register    char    *s;
  31. register    int     c;
  32.     {
  33.     while (*s)
  34.         if (c == *s) return (s);
  35.         else s++;
  36.     return (NULL);
  37.     }
  38.  
  39. /*
  40.  * get option letter from argument vector
  41.  */
  42. int    opterr = 1,        /* useless, never set or used */
  43.     optind = 1,        /* index into parent argv vector */
  44.     optopt;            /* character checked for validity */
  45. char    *optarg;        /* argument associated with option */
  46.  
  47. #define tell(s)    fputs(*nargv,stderr);fputs(s,stderr); \
  48.         fputc(optopt,stderr);fputc('\n',stderr);return(BADCH);
  49.  
  50.  
  51. getopt(nargc,nargv,ostr)
  52. int    nargc;
  53. char    **nargv,
  54.     *ostr;
  55. {
  56.     static char    *place = EMSG;    /* option letter processing */
  57.     register char    *oli;        /* option letter list index */
  58.     char    *index();
  59.  
  60.     if(!*place) {            /* update scanning pointer */
  61.         if(optind >= nargc || *(place = nargv[optind]) != '-' || !*++place) return(EOF);
  62.         if (*place == '-') {    /* found "--" */
  63.             ++optind;
  64.             return(EOF);
  65.         }
  66.     }                /* option letter okay? */
  67.     if ((optopt = (int)*place++) == ARGCH || !(oli = index(ostr,optopt))) {
  68.         if(!*place) ++optind;
  69.         tell(": illegal option -- ");
  70.     }
  71.     if (*++oli != ARGCH) {        /* don't need argument */
  72.         optarg = NULL;
  73.         if (!*place) ++optind;
  74.     }
  75.     else {                /* need an argument */
  76.         if (*place) optarg = place;    /* no white space */
  77.         else if (nargc <= ++optind) {    /* no arg */
  78.             place = EMSG;
  79.             tell(": option requires an argument -- ");
  80.         }
  81.          else optarg = nargv[optind];    /* white space */
  82.         place = EMSG;
  83.         ++optind;
  84.     }
  85.     return(optopt);            /* dump back option letter */
  86. }
  87.  
  88.  
  89. #ifdef GETOPT
  90.  
  91. #ifndef lint
  92. static    char    sccspid[] = "@(#) getopt.c 5.1 (WangInst) 6/15/85";
  93. #endif
  94.  
  95. main (argc, argv) char **argv;
  96.     {
  97.     char    *optstring = argv[1];
  98.     char    *argv0 = argv[0];
  99.     extern    int     optind;
  100.     extern    char    *optarg;
  101.     int     opterr = 0;
  102.     int     C;
  103.     char    *opi;
  104.     if (argc == 1)
  105.         {
  106.         fprintf (stderr, "Usage: %s optstringOP_JSCC 271
  107. # define OP_TCC 272
  108. # define SYM 273
  109. # define STRING 274
  110. # define CHAR 275
  111. # define COMMENT 276
  112. # define XMEM 277
  113. # define YMEM 278
  114. # define LMEM 279
  115. # define PMEM 280
  116. # define AAAA 281
  117. # define A10 282
  118. # define BBBB 283
  119. # define B10 284
  120. # define AABB 285
  121. # define BBAA 286
  122. # define XXXX 287
  123. # define YYYY 288
  124. # define SR 289
  125. # define MR 290
  126. # define CCR 291
  127. # define OMR 292
  128. # define SP 293
  129. # define SSH 294
  130. # define SSL 295
  131. # define LA 296
  132. # define LC 297
  133. # define EOL 298
  134. # define EOS 299
  135. # define OP_ABS 300
  136. # define OP_ADC 301
  137. # define OP_ADD 302
  138. # define OP_ADDL 303
  139. # define OP_ADDR 304
  140. # define OP_ASL 305
  141. # define OP_ASR 306
  142. # define OP_CLR 307
  143. # define OP_CMP 308
  144. # define OP_CMPM 309
  145. # define OP_DIV 310
  146. # define OP_MAC 311
  147. # define OP_MACR 312
  148. # define OP_MPY 313
  149. # define OP_MPYR 314
  150. # define OP_NEG 315
  151. # define OP_NORM 316
  152. # define OP_RND 317
  153. # define OP_SBC 318
  154. # define OP_SUB 319
  155. # define OP_SUBL 320
  156. # define OP_SUBR 321
  157. # define OP_TFR 322
  158. # define OP_TST 323
  159. # define OP_AND 324
  160. # define OP_ANDI 325
  161. # define OP_EOR 326
  162. # define OP_LSL 327
  163. # define OP_LSR 328
  164. # define OP_NOT 329
  165. # define OP_OR 330
  166. # define OP_ORI 331
  167. # define OP_ROL 332
  168. # define OP_ROR 333
  169. # define OP_BCLR 334
  170. # define OP_BSET 335
  171. # define OP_BCHG 336
  172. # define OP_BTST 337
  173. # define OP_DO 338
  174. # define OP_ENDDO 339
  175. # define OP_LUA 340
  176. # define OP_MOVE 341
  177. # define OP_MOVEC 342
  178. # define OP_MOVEM 343
  179. # define OP_MOVEP 344
  180. # define OP_ILLEGAL 345
  181. # define OP_INCLUDE 346
  182. # define OP_JMP 347
  183. # define OP_JCLR 348
  184. # define OP_JSET 349
  185. # define OP_JSR 350
  186. # define OP_JSCLR 351
  187. # define OP_JSSET 352
  188. # define OP_NOP 353
  189. # define OP_REP 354
  190. # define OP_RESET 355
  191. # define OP_RTI 356
  192. # define OP_RTS 357
  193. # define OP_STOP 358
  194. # define OP_SWI 359
  195. # define OP_WAIT 360
  196. # define OP_EQU 361
  197. # define OP_ORG 362
  198. # define OP_DC 363
  199. # define OP_END 364
  200. # define OP_PAGE 365
  201. # define OP_PSECT 366
  202. # define OP_ALIGN 367
  203. # define SHL 368
  204. # define SHR 369
  205. #define yyclearin yychar = -1
  206. #define yyerrok yyerrflag = 0
  207. extern int yychar;
  208. extern short yyerrflag;
  209. #ifndef YYMAXDEPTH
  210. #define YYMAXDEPTH 150
  211. #endif
  212. YYSTYPE yylval, yyval;
  213. # define YYERRCODE 256
  214.  
  215. # line 1579 "a56.y"
  216.  
  217.  
  218. #include <stdio.h>
  219.  
  220. int yydebug;
  221.  
  222. struct n binary_op(a1, op, a2)
  223. struct n a1, a2;
  224. int op;
  225. {
  226.     struct n result;
  227.  
  228.     if(a1.type == UNDEF || a2.type == UNDEF) {
  229.     result.type = UNDEF;
  230.     return result;
  231.     }
  232.  
  233.     /* promote to float automatically */
  234.  
  235.     if(a1.type != a2.type) {
  236.     if(a1.type == INT) {
  237.         a1.val.f = a1.val.i;    /* truncate */
  238.         a1.type = FLT;
  239.     } else {
  240.         a2.val.f = a2.val.i;    /* truncate */
  241.     }
  242.     }
  243.     result.type = a1.type;
  244.  
  245.     /* do the op */
  246.  
  247.     if(result.type == INT) {
  248.     switch(op) {
  249.         case '+':    result.val.i = a1.val.i + a2.val.i; break;
  250.         case '-':    result.val.i = a1.val.i - a2.val.i; break;
  251.         case '*':    result.val.i = a1.val.i * a2.val.i; break;
  252.         case '/':    result.val.i = a1.val.i / a2.val.i; break;
  253.         case '%':    result.val.i = a1.val.i % a2.val.i; break;
  254.         case SHL:    result.val.i = a1.val.i << a2.val.i; break;
  255.         case SHR:    result.val.i = a1.val.i >> a2.val.i; break;
  256.         case '|':    result.val.i = a1.val.i | a2.val.i; break;
  257.         case '&':    result.val.i = a1.val.i & a2.val.i; break;
  258.         case '^':    result.val.i = a1.val.i ^ a2.val.i; break;
  259.     }
  260.     } else {
  261.     switch(op) {
  262.         case '+':    result.val.f = a1.val.f + a2.val.f; break;
  263.         case '-':    result.val.f = a1.val.f - a2.val.f; break;
  264.         case '*':    result.val.f = a1.val.f * a2.val.f; break;
  265.         case '/':    result.val.f = a1.val.f / a2.val.f; break;
  266.         case '%':    result.val.f = (int)a1.val.f % (int)a2.val.f; break;
  267.         case SHL:    result.val.f = (int)a1.val.f << (int)a2.val.f; break;
  268.         case SHR:    result.val.f = (int)a1.val.f >> (int)a2.val.f; break;
  269.         case '|':    result.val.f = (int)a1.val.f | (int)a2.val.f; break;
  270.         case '&':    result.val.f = (int)a1.val.f & (int)a2.val.f; break;
  271.         case '^':    result.val.f = (int)a1.val.f ^ (int)a2.val.f; break;
  272.     }
  273.     }
  274.  
  275.     return result;
  276. }
  277.  
  278. struct n unary_op(op, a1)
  279. int op;
  280. struct n a1;
  281. {
  282.     struct n result;
  283.  
  284.     if(a1.type == UNDEF) {
  285.     result.type = UNDEF;
  286.     return result;
  287.     }
  288.  
  289.     result.type = a1.type;
  290.  
  291.     /* do the op */
  292.  
  293.     if(result.type == INT) {
  294.     switch(op) {
  295.         case '-':    result.val.i = -a1.val.i; break;
  296.         case '~':    result.val.i = ~a1.val.i; break;
  297.     }
  298.     } else {
  299.     switch(op) {
  300.         case '-':    result.val.f = -a1.val.f; break;
  301.         case '~':    result.val.f = ~(int)a1.val.f; break;
  302.     }
  303.     }
  304.  
  305.     return result;
  306. }
  307.  
  308. n2int(n)
  309. struct n n;
  310. {
  311.     if(n.type == UNDEF)
  312.     return UNDEF;
  313.     else if(n.type == INT)
  314.     return n.val.i;
  315.     else
  316.     return n.val.f;
  317. }
  318.  
  319. n2frac(n)
  320. struct n n;
  321. {
  322.     double adval = n.val.f >= 0.0 ? n.val.f : -n.val.f;
  323.  
  324.     if(n.type == UNDEF)
  325.     return UNDEF;
  326.     else if(n.type == INT)
  327.     return n.val.i;
  328.  
  329.     adval -= (double)(int)adval;
  330.     adval *= (double)0x800000;
  331.     adval += 0.5;
  332.  
  333.     if(n.val.f >= 0.0)
  334.     return adval;
  335.     else
  336.     return -adval;
  337. }
  338.  
  339. extern struct {int n; char *name;} tok_tab[];
  340. extern int n_tok;
  341.  
  342. char *tok_print(tok)
  343. int tok;
  344. {
  345.     int i;
  346.     static char buf[32];
  347.  
  348.     if(tok < 256) {
  349.     sprintf(buf, "'%c'", tok);
  350.     return(buf);
  351.     } else {
  352.     for(i = 0; i < n_tok; i++) {
  353.         if(tok == tok_tab[i].n)
  354.         return(tok_tab[i].name);
  355.     }
  356.     }
  357.     return("<unknown>");
  358. }
  359.  
  360. yyerror(s, a0, a1, a2, a3)
  361. char *s, *a0, *a1, *a2, *a3;
  362. {
  363.     extern int error;
  364.     char buf[1024];
  365.  
  366.     error++;
  367.     sprintf(buf, s, a0, a1, a2, a3);
  368.  
  369.     if(pass == 2) {
  370.     fprintf(stderr, "%s: line %d: %s (tok=%s)\n", curfile, curline,
  371.         buf, tok_print(yychar));
  372.     fprintf(stderr, "%s\n", inline); 
  373.     printf("%s: line %d: %s (tok=%s)\n", curfile, curline,
  374.         buf, tok_print(yychar));
  375. #if 0
  376.     printf("%s\n", inline); 
  377. #endif
  378.     }
  379. }
  380.  
  381. char *luntab(s)
  382. char *s;
  383. {
  384.     static char buf[256];
  385.  
  386.     strcpy(buf, s);
  387.  
  388.     untab(buf);
  389.     return(buf);
  390. }
  391. short yyexca[] ={
  392. -1, 1,
  393.     0, -1,
  394.     270, 32,
  395.     271, 32,
  396.     272, 32,
  397.     298, 6,
  398.     299, 6,
  399.     300, 32,
  400.     301, 32,
  401.     302, 32,
  402.     303, 32,
  403.     304, 32,
  404.     305, 32,
  405.     306, 32,
  406.     307, 32,
  407.     308, 32,
  408.     309, 32,
  409.     310, 32,
  410.     311, 32,
  411.     312, 32,
  412.     313, 32,
  413.     314, 32,
  414.     315, 32,
  415.     316, 32,
  416.     317, 32,
  417.     318, 32,
  418.     319, 32,
  419.     320, 32,
  420.     321, 32,
  421.     322, 32,
  422.     323, 32,
  423.     324, 32,
  424.     325, 32,
  425.     326, 32,
  426.     327, 32,
  427.     328, 32,
  428.     329, 32,
  429.     330, 32,
  430.     331, 32,
  431.     332, 32,
  432.     333, 32,
  433.     334, 32,
  434.     335, 32,
  435.     336, 32,
  436.     337, 32,
  437.     338, 32,
  438.     339, 32,
  439.     340, 32,
  440.     341, 32,
  441.     342, 32,
  442.     343, 32,
  443.     344, 32,
  444.     345, 32,
  445.     347, 32,
  446.     348, 32,
  447.     349, 32,
  448.     350, 32,
  449.     351, 32,
  450.     352, 32,
  451.     353, 32,
  452.     354, 32,
  453.     355, 32,
  454.     356, 32,
  455.     357, 32,
  456.     358, 32,
  457.     359, 32,
  458.     360, 32,
  459.     363, 32,
  460.     -2, 0,
  461. -1, 9,
  462.     298, 35,
  463.     299, 35,
  464.     -2, 31,
  465.     };
  466. # define YYNPROD 286
  467. # define YYLAST 1345
  468. short yyact[]={
  469.  
  470.  134, 479, 221, 222, 336, 219, 345, 282, 277, 434,
  471.  119, 338, 284, 281, 106, 280,  20, 283,  17,  18,
  472.  110, 399, 133, 215, 216,  97, 234, 396, 439, 115,
  473.  220, 435, 436, 437, 390, 182, 183, 400, 282, 277,
  474.  176, 177, 395, 284, 281, 371, 280, 389, 283, 282,
  475.  277, 181, 131, 180, 284, 281, 173, 280, 172, 283,
  476.  422, 516, 174, 175, 276, 204,  20, 205, 104, 521,
  477.  241, 245, 187, 102, 188, 112, 113, 114, 111, 203,
  478.  274, 522, 139, 140, 116, 256, 258, 262, 300, 267,
  479.  301, 270, 242, 246, 275, 276, 240, 244,  98,  99,
  480.  100,  96, 109, 460, 459, 511, 276, 253, 490, 261,
  481.  353, 254, 302, 263, 481, 268, 282, 277, 271, 272,
  482.  369, 284, 281, 503, 280, 275, 283, 227, 502, 225,
  483.  288, 218, 228, 457, 458, 210, 210, 210, 210, 293,
  484.  304, 305, 297, 282, 277, 198, 199, 223, 284, 281,
  485.  461, 280, 226, 283, 103,  98,  99, 100, 232, 214,
  486.  233, 202, 528, 193, 294, 209, 282, 298, 197, 247,
  487.  455, 284, 454, 276, 282, 277, 283, 523, 132, 284,
  488.  281, 282, 280, 166, 283, 167, 284, 281, 504, 280,
  489.  517, 283, 514, 512, 229, 230, 231, 510, 505, 499,
  490.  276, 498, 494, 275, 468, 441, 430, 425, 424, 224,
  491.  195, 196, 423, 103, 206, 207, 208, 420, 200, 201,
  492.  217, 101, 211, 212, 213, 236, 237, 238, 282, 277,
  493.  275, 417, 121, 284, 281, 462, 280, 194, 283, 414,
  494.  264, 248, 248, 248, 248, 328, 327, 413, 412, 334,
  495.  332, 249, 250, 251, 388, 387, 337, 339, 405, 386,
  496.  406, 342, 382, 381, 376, 346, 375, 348, 358, 357,
  497.  356, 355, 354, 329, 352, 351, 350, 333, 186, 189,
  498.  190, 191, 192, 344, 343,  98,  99, 100, 341, 335,
  499.  347, 331, 349, 374, 330, 326, 377, 380, 321, 320,
  500.  319, 107, 373, 108, 235, 372, 273, 318, 317, 316,
  501.  315, 314, 285, 286, 287, 313, 312, 311, 378, 227,
  502.  289, 225, 310, 138, 228, 309, 308, 409, 307, 306,
  503.  296, 295, 292, 410, 411, 291, 416, 290, 279, 278,
  504.  385, 130, 129, 171,  98,  99, 100, 299, 128, 408,
  505.  127, 427, 428, 429, 126, 431, 125, 433, 415, 124,
  506.  107, 123, 108, 265, 419, 260, 421, 179, 438, 279,
  507.  278, 257, 252, 426, 243, 442, 443, 444, 447, 178,
  508.  279, 278, 452, 453, 448, 450,  19, 239, 391, 392,
  509.  393, 394, 440,  92, 397, 398,  95,  91, 401, 402,
  510.  403, 404,  29,  10, 446, 103, 184, 185, 117, 449,
  511.  451, 464, 467,  28,  27, 469, 470, 471, 478,  26,
  512.  466, 475, 122, 483, 485, 486, 487, 473, 346, 484,
  513.   25,  24, 488, 322, 480, 432, 480, 287, 285, 465,
  514.  476,  23, 118, 482, 495, 299, 474, 279, 278, 500,
  515.   21, 497,   8, 347,   7, 340, 493, 489, 137,   5,
  516.    3,   2, 227, 138, 225,   1, 456, 228, 266, 269,
  517.  165, 506, 303, 150, 279, 278, 472, 463, 135, 337,
  518.  339, 507, 223, 508, 509, 359, 360, 361, 362, 363,
  519.  364, 365, 366, 367, 368, 105, 235, 480, 370, 515,
  520.    0, 121, 513,   0,   0, 279, 278, 518, 519, 164,
  521.  383, 384,   0,   0,   0, 524,   0,   0, 526,   0,
  522.    0,   0, 525,   0, 530, 520,   0,   0, 529, 532,
  523.   62,  61,  88, 531,   0, 287,  98,  99, 100,   0,
  524.    0, 168, 169, 170,   0,   0,   0,   0, 103,   0,
  525.  418,   0, 107,   0, 108,   0,   0,   0,   0,   0,
  526.   53,  59,  35,  41,  45,  55,  51,  42,  38,  39,
  527.   90,  32,  33,  30,  31,  57,  89,  40,  60,  34,
  528.   43,  47,  37,  46,  48,  94,  50,  56,  52,  44,
  529.   49,  93,  58,  54,  83,  82,  81,  80,  70,  71,
  530.   87,  36,  86,  85,  84,  77, 235,  64,  68,  67,
  531.   63,  66,  65,  79,  69,  74,  78,  75,  72,  76,
  532.   73,   0,   0,  22,   4,   0,   0,   0,   0,   0,
  533.    0,   0,   0,   0, 143, 144, 149, 148, 147, 141,
  534.  142,   9,   0,   0,   6, 235,   0, 340,   0, 491,
  535.  492, 139, 140,   0, 477, 145, 151, 146, 152, 155,
  536.  156, 153, 154, 157,   0,   0, 158, 159, 160, 161,
  537.  162, 163,   0,   0,   0,   0,   0,   0,   0,  98,
  538.   99, 100,   0, 143, 144, 149, 148, 147, 141, 142,
  539.    0,   0,   0,   0,   0, 107,   0, 108,   0,   0,
  540.  139, 140, 136,   0, 145, 151, 146, 152, 155, 156,
  541.  153, 154, 157,   0,  15, 158, 159, 160, 161, 162,
  542.  163, 143, 144, 149, 148, 147, 141, 142,   0,   0,
  543.   13,   0,  16,  14,  12,  11,   0,   0, 139, 140,
  544.    0, 255, 145, 151, 146, 152, 155, 156, 153, 154,
  545.  157,   0,   0, 158, 159, 160, 161, 162, 163, 143,
  546.  144, 149, 148, 147, 141, 142,   0,   0,   0,   0,
  547.    0,   0,   0,   0,   0,   0, 139, 140, 379,   0,
  548.  145, 151, 146, 152, 155, 156, 153, 154, 157,   0,
  549.    0, 158, 159, 160, 161, 162, 163,   0,   0,   0,
  550.    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  551.    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  552.    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  553.    0, 143, 144, 149, 148, 147, 141, 142,   0,   0,
  554.    0,   0,   0,   0,   0,   0,   0,   0, 139, 140,
  555.    0,   0, 145, 151, 146, 152, 155, 156, 153, 154,
  556.  157,   0,   0, 158, 159, 160, 161, 162, 163,   0,
  557.  143, 144, 149, 148, 147, 141, 142,   0,   0,   0,
  558.    0,   0,   0,   0,   0,   0,   0,   0, 445,   0,
  559.    0, 145, 151, 146, 152, 155, 156, 153, 154, 157,
  560.    0,   0, 158, 159, 160, 161, 162, 163, 143, 144,
  561.  149, 148, 147, 141, 142,   0,   0,   0,   0,   0,
  562.    0,   0,   0,   0,   0, 139, 140,   0,   0, 145,
  563.  151, 146, 152, 155, 156, 153, 154, 157,   0,   0,
  564.  158, 159, 160, 161, 162, 163, 143, 144, 149, 148,
  565.  147, 141, 142, 227,   0, 225, 104,   0, 228,   0,
  566.    0, 102,   0,   0, 527,   0,   0, 145, 151, 146,
  567.  152, 155, 156, 153, 154, 157,   0,   0, 158, 159,
  568.  160, 161, 162, 163, 143, 144, 149, 148, 147, 141,
  569.  142, 104,   0, 225,   0,   0, 102,   0,   0,   0,
  570.    0,   0, 501,   0,   0, 145, 151, 146, 152, 155,
  571.  156, 153, 154, 157,   0,   0, 158, 159, 160, 161,
  572.  162, 163, 143, 144, 149, 148, 147, 141, 142, 104,
  573.    0,   0, 104,   0, 102,   0,   0, 102,   0, 103,
  574.  496,   0, 103, 145, 151, 146, 152, 155, 156, 153,
  575.  154, 157, 300,   0, 158, 159, 160, 161, 162, 163,
  576.  143, 144, 149, 148, 147, 141, 142, 104,   0,   0,
  577.    0, 104, 102, 323,   0,   0, 102, 103,   0,   0,
  578.  259, 145, 151, 146, 152, 155, 156, 153, 154, 157,
  579.    0,   0, 158, 159, 160, 161, 162, 163, 143, 144,
  580.  149, 148, 147, 141, 142,   0, 104,   0,   0, 325,
  581.    0, 102,   0,   0, 102, 103,   0,   0, 103, 145,
  582.  151, 146, 152, 155, 156, 153, 154, 157,   0,   0,
  583.  158, 159, 160, 161, 162, 163,   0,   0,   0,   0,
  584.    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  585.    0,   0,   0, 103,   0,   0,   0, 103,   0,   0,
  586.    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  587.   98,  99, 100,  98,  99, 100,   0,   0,   0,   0,
  588.  407,   0,   0,   0,   0,   0, 107,   0, 108, 107,
  589.    0, 108, 103,   0,   0, 103,   0,   0,   0,   0,
  590.    0,   0,   0,   0,   0,   0,   0,   0,  98,  99,
  591.  100,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  592.    0,   0,   0,   0, 107,   0, 108,   0,   0,   0,
  593.    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  594.    0,   0,   0,   0,   0,   0,  98,  99, 100,  98,
  595.   99, 100,   0,   0,   0,   0,   0,   0,   0,   0,
  596.    0,   0, 107, 120, 108, 107,   0, 108,   0,   0,
  597.    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  598.    0,   0,   0,   0,  98,  99, 100,   0,  98,  99,
  599.  100, 324,   0,   0,   0,   0,   0,   0,   0,   0,
  600.  107,   0, 108,   0, 107,   0, 108,   0,   0,   0,
  601.    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  602.    0,   0,   0,  98,  99, 100,  98,  99, 100,   0,
  603.    0,   0,   0,   0,   0,   0,   0,   0,   0, 107,
  604.    0, 108, 107,   0, 108 };
  605. short yypact[]={
  606.  
  607. -1000, 368,-1000,-280,-1000,-1000,-1000,-210, 260,-260,
  608. -102,1066,-171,-202,-102,-190,-1000,-1000,-1000,-1000,
  609. -1000,-210, 989,-1000,-1000, 423,-1000,-1000,-1000,-1000,
  610.  140, 140, 140, 140,-225,-225,-1000,-230,-230,-230,
  611. -209,-209,-209,-209,-209,-209,-209,-209,-120,-120,
  612. -120,-216,-216,-216,-216,-216,-216,-216,-216,-264,
  613. -264, 422, 422, 422, 422, 269, 269, 269, 269, 571,
  614.  571,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
  615.  269, 269, 269, 269, 461, 800, 571, 283, 838,-149,
  616.  838, 269, 269,-1000,-1000,-1000,1066,-194,-1000,-1000,
  617. -1000, 106,1066,1066,1066,-1000,-1000,-1000,-1000,-202,
  618. 1066,-1000,-1000,-1000,-1000, 293,-1000,-1000, 291,-1000,
  619. -1000, 106,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
  620. -1000, 288,-1000, 422, 287, 286, 422,  28,-152,-1000,
  621. -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
  622. -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
  623. -1000,-1000,-1000,-1000,-1000,-125,-1000,-1000,-1000,-1000,
  624. -1000,-1000, 285, 284, 282, 281, 278, 273,-1000,-1000,
  625.  272, 271, 267, 266,-1000,-1000,-1000, 265, 264,-1000,
  626. -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000, 263, 256,
  627. -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
  628. -1000,-1000,-1000,-1000,-1000, 255, 254,-1000,-1000,-1000,
  629. -1000,-1000,-1000,1031, 106,-1000,-1000,1027,1069,-1000,
  630. -1000,-1000,-1000, 251,-1000, 992,-1000,-1000,-1000,-1000,
  631. -1000,-1000, 422,-1000, 250, 247, 422,-1000, 245,-1000,
  632. -1000,-1000,-1000, 279, 244, 913, 240,-1000, 239, 422,
  633. -1000, 422, 232, 231, 230,-1000,-154, 228, 227,-1000,
  634.  226, 225, 224, 106,-1000,1066,1066,1066,1066,1066,
  635. 1066,1066,1066,1066,1066,-1000,-1000,  79,1066,   1,
  636. -102, 989, 838, 222, 220, 499, 838, 219, 218, 106,
  637. 1066,1066, 299, 215, 211, 210,-234,-249,-216,-216,
  638. -216,-216,-239,-256,-216,-216,-262,-244,-216,-216,
  639. -216,-216, 106,-1000, 217, 916, 648,-1000,-1000,-1000,
  640.  951, 951, 204, 203, 195, 648, 187,-1000,-1000,-1000,
  641. 1066,-195, 173,-195,-220, 168,-1000,-1000, 164, 163,
  642.  648, 838, 838, 162, 838,-216, 838,-259,-259,  12,
  643.  137, 144, 191, 191, 129, 129,-1000,-1000,-1000,-1000,
  644.  -30,-202, 161,-1000, 838, 838, 838, 610, 422, 422,
  645. -1000, 838, 838, 106, 106, 127,-216,-132,-162,-1000,
  646. -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
  647. -1000,-1000,-1000,-1000,-1000, 127,-113, 194,  87, 160,
  648. -1000,-1000, 951, 951, 951,  87,-1000, 374, 106,-159,
  649. -195,-159, 422, 838, 838, 838, 422,-1000,-1000,-1000,
  650. -156,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,1066,
  651. 1066,-102, 158, 762,-1000, 913, 157, 155, 724,-1000,
  652. -1000,-1000,-1000,-1000,-135,-140,-1000,-1000,-1000,-1000,
  653. -1000, 147,-1000, 154,-1000,-1000,-1000,-1000, 951,-1000,
  654. -1000,-1000,-1000,-1000,-1000,-1000, 279, 913,-1000,-1000,
  655. -1000,-1000,-159,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
  656. -1000, 106, 106, 153,-161, 149, 913, 148, 838,-217,
  657.  146, 913,-1000,-1000,-1000, 951,-1000,-1000,-1000,-1000,
  658. -102,-1000,-197, 133, 838,-1000, 913, 686, 118,-1000,
  659. -1000,-1000, 913, 838,-1000,-1000,-1000, 913, 838,-1000,
  660. -1000,-1000,-1000 };
  661. short yypgo[]={
  662.  
  663.    0,  14,   1, 495, 209,  26, 478,   2,  30,  11,
  664.   79,  22,   5, 160, 477,   3, 476,   6, 131, 152,
  665.  473, 343, 367, 237, 163, 168, 161, 165, 159, 509,
  666.  472, 470, 469,   9, 468,  20,   0,   4, 465, 461,
  667.  460, 459, 454, 386, 452, 450, 442,  10, 441, 431,
  668.  430, 422, 419, 414, 413, 402, 397, 393, 158, 387,
  669.  374, 169, 372, 371, 365, 363, 361, 359, 356, 354,
  670.  350, 348, 342, 341 };
  671. short yyr1[]={
  672.  
  673.    0,  38,  38,  39,  39,  39,  40,  40,  40,  40,
  674.   40,  40,  41,  42,  42,  42,  42,  42,  42,  42,
  675.   42,  42,  42,  46,  46,  47,  47,  35,  35,  35,
  676.   35,  44,  44,  45,  43,  43,  48,  48,  48,  50,
  677.   50,  50,  50,  50,  50,  50,  50,  50,  50,  50,
  678.   50,  50,  50,  50,  50,  50,  50,  50,  50,  50,
  679.   50,  50,  50,  50,  50,  50,  50,  50,  50,  50,
  680.   29,  31,  31,  31,  30,  30,  30,  30,  21,  21,
  681.   21,  21,  21,  21,  22,  22,  22,  22,  23,  23,
  682.   23,  23,  24,  25,  25,  26,  27,  28,  28,  10,
  683.   10,  49,  49,  49,  49,  55,  55,  55,  55,  56,
  684.   56,  57,  57,  52,  52,  52,  52,  52,  52,  52,
  685.   52,  52,  52,  52,  52,  52,  52,  52,  52,  52,
  686.   52,  52,  60,  60,  60,  60,  60,  59,  59,  59,
  687.   59,  59,  58,  58,  14,  14,  14,  14,  53,  53,
  688.   53,  53,  61,  61,  16,  16,  16,  54,  54,  54,
  689.   54,  54,  65,  65,  34,  32,  64,  64,  64,  64,
  690.   64,  64,  62,  62,  62,  62,  62,  62,  37,  37,
  691.   37,  63,  63,  13,  11,  11,  17,  17,  18,  18,
  692.   12,  12,  15,  15,  15,  15,  19,  19,  19,  19,
  693.   36,  36,  36,  36,  36,  36,  36,  36,  36,  36,
  694.   36,  36,  36,  36,  36,  36,  20,  20,  20,  20,
  695.   20,  20,  20,  33,  33,  33,  51,  51,  51,  51,
  696.   51,  51,  51,  51,  66,  71,  67,  68,  68,  68,
  697.   68,  68,  69,  69,  69,  70,  70,  70,  73,  73,
  698.   73,  73,  72,  72,  72,  72,   1,   1,   1,   5,
  699.    5,   6,   7,   7,   8,   8,   9,   2,   2,   3,
  700.    3,   3,   4,   4,   4,   4,   4,   4,   4,   4,
  701.    4,   4,   4,   4,   4,   4 };
  702. short yyr2[]={
  703.  
  704.    0,   0,   2,   2,   2,   1,   0,   1,   1,   2,
  705.    3,   2,   3,   3,   2,   2,   6,   3,   6,   3,
  706.    8,   2,   1,   3,   1,   1,   1,   1,   1,   1,
  707.    1,   1,   0,   1,   1,   0,   1,   1,   2,   2,
  708.    2,   2,   2,   2,   2,   1,   2,   2,   2,   2,
  709.    2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
  710.    2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
  711.    4,   1,   1,   0,   3,   3,   3,   3,   3,   3,
  712.    3,   3,   3,   3,   3,   3,   3,   3,   1,   1,
  713.    3,   3,   1,   3,   3,   1,   1,   3,   3,   1,
  714.    1,   1,   1,   1,   1,   4,   2,   4,   4,   1,
  715.    1,   1,   1,   2,   2,   2,   2,   2,   2,   2,
  716.    2,   2,   2,   1,   1,   1,   1,   1,   1,   1,
  717.    1,   1,   3,   3,   4,   4,   4,   1,   1,   2,
  718.    2,   2,   6,   5,   1,   1,   1,   1,   2,   2,
  719.    2,   2,   4,   3,   1,   1,   1,   2,   2,   2,
  720.    4,   2,   1,   4,   3,   3,   4,   4,   3,   4,
  721.    4,   3,   5,   4,   5,   5,   4,   4,   1,   1,
  722.    1,   4,   4,   1,   1,   1,   1,   1,   1,   1,
  723.    1,   1,   1,   3,   5,   4,   5,   5,   4,   4,
  724.    1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
  725.    1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
  726.    1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
  727.    1,   1,   1,   1,   3,   3,   1,   4,   4,   4,
  728.    4,   3,   7,   6,   7,   7,   6,   7,   4,   4,
  729.    4,   4,   8,   8,   8,   8,   1,   1,   1,   2,
  730.    3,   3,   1,   1,   2,   2,   2,   1,   1,   1,
  731.    1,   1,   3,   3,   3,   3,   3,   3,   3,   3,
  732.    3,   3,   2,   2,   3,   1 };
  733. short yychk[]={
  734.  
  735. -1000, -38, -39, -40, 256, -41, 276, -42, -44, 273,
  736.   35, 367, 366, 362, 365, 346, 364, 298, 299, -43,
  737.  276, -45, 363, -48, -49, -50, -52, -53, -54, -55,
  738.  313, 314, 311, 312, 319, 302, 341, 322, 308, 309,
  739.  317, 303, 307, 320, 329, 304, 323, 321, 324, 330,
  740.  326, 306, 328, 300, 333, 305, 327, 315, 332, 301,
  741.  318, 271, 270, 350, 347, 352, 351, 349, 348, 354,
  742.  338, 339, 358, 360, 355, 357, 359, 345, 356, 353,
  743.  337, 336, 335, 334, 344, 343, 342, 340, 272, 316,
  744.  310, -56, -57, 331, 325, -43, 361,  -1, 257, 258,
  745.  259,  -4,  45, 126,  40,  -3,  -1, 273, 275, 273,
  746.  -35, 280, 277, 278, 279,  -1, 274, -43, -46, -47,
  747.  274,  -4, -51, -66, -67, -68, -69, -70, -71, -72,
  748.  -73,  -5, -19, -11, -36,  -6, 279,  35,  40, 277,
  749.  278, 265, 266, 260, 261, 281, 283, 264, 263, 262,
  750.  -20, 282, 284, 287, 288, 285, 286, 289, 292, 293,
  751.  294, 295, 296, 297, -29, -31,  43,  45, -29, -29,
  752.  -29, -21, 283, 281, 287, 288, 265, 266, -21, -22,
  753.  283, 281, 265, 266, -22, -22, -23, 281, 283, -23,
  754.  -23, -23, -23, -24, -23, -24, -24, -25, 265, 266,
  755.  -25, -25, -26, -10, 281, 283, -26, -26, -26, -27,
  756.  -10, -27, -27, -27, -28, 287, 288, -28, -18, -12,
  757.   -8,  -7, -15,  60,  -4,  42, -19,  40,  45, -18,
  758.  -18, -18, -58, -13,  -5,  35, -58, -58, -58, -59,
  759.   -5, -36, -11, -60,  -5, -36, -11, -61, -13, -61,
  760.  -61, -61, -62, -11,  -5, 280, -36, -63, -36, 280,
  761.  -64, -11, -36,  -5, -19, -65, -34, -36, 264, -32,
  762.  -36,  -5,  -5,  -4, 274, 124,  94,  38, 369, 368,
  763.   45,  43,  37,  47,  42,  -4,  -4,  -4, -35,  -4,
  764.   44,  44,  44, -12,  -8,  44,  44, -12,  -8,  -4,
  765.   60,  62, 264, -30, 265, 266,  44,  44,  44,  44,
  766.   44,  44,  44,  44,  44,  44,  44,  44,  44,  44,
  767.   44,  44,  -4,  42, 264,  40,  44, -15,  -7,  -8,
  768.   44,  44, -15,  -8,  -7,  44, -37,  -7,  -9, -15,
  769.  368,  44, -12,  44,  44, -17, -12,  -8, -12,  -8,
  770.   44,  44,  44, 264,  44,  44,  44,  44,  44,  -4,
  771.   -4,  -4,  -4,  -4,  -4,  -4,  -4,  -4,  -4,  41,
  772.   -4,  44,  -1, -47, -36,  44,  44, -36, -11, 279,
  773.  -36,  44,  44,  -4,  -4,  41,  44,  44,  44, 281,
  774.  283, -10, -10, -10, -10, 281, 283, -10, -10, 283,
  775.  281, -10, -10, -10, -10,  41,  43, 264, -11, -36,
  776.   -7,  -7,  44,  44,  44, -11, -36,  44,  -4, -11,
  777.   44, -11, 280,  44,  44,  44, -11, -36, -36, -36,
  778.   44, -36, -10, -36, -33, 290, 291, 292, -33,  58,
  779.  -35,  44, -36, -36, -36, 278,  -5, -36, -12,  -8,
  780.  -12,  -8, -36, -36,  45,  43, -10, 265, 266, 266,
  781.  265, 263,  41, -14,  -7,  -8,  -9, -15,  44,  -7,
  782.   -7,  -7, -16,  -9,  -8, -12, -11, 280, -36,  -2,
  783.   -1, 273, -11,  -2, -17, -36, -36, -36, -12,  -8,
  784.  264,  -4,  -4,  -1,  44, -36, 278, -12,  44,  44,
  785.  -36, 278, 263, 263,  41,  44,  -7, -37, -12,  -2,
  786.   44, 266,  44, -12,  44, -36, 278,  44, -12,  -7,
  787.   -1, 266, 278,  44, -36, -12, -36, 278,  44, -12,
  788.  -36, -12, -36 };
  789. short yydef[]={
  790.  
  791.    1,  -2,   2,   0,   5,   7,   8,  35,   0,  -2,
  792.    0,   0,   0,   0,   0,   0,  22,   3,   4,   9,
  793.   34,  35,   0,  33,  36,  37, 101, 102, 103, 104,
  794.   73,  73,  73,  73,   0,   0,  45,   0,   0,   0,
  795.    0,   0,   0,   0,   0,   0,   0,   0, 111, 109,
  796.    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  797.    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  798.    0, 123, 124, 125, 126, 127, 128, 129, 130, 131,
  799.    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  800.    0,   0,   0, 110, 112,  11,   0,   0, 256, 257,
  801.  258,  14,   0,   0,   0, 285, 269, 270, 271,  15,
  802.    0,  27,  28,  29,  30,   0,  21,  10,  19,  24,
  803.   25,  26,  38, 226, 227, 228, 229, 230, 231, 232,
  804.  233,   0, 236,   0,   0,   0,   0,   0,   0, 184,
  805.  185, 200, 201, 202, 203, 204, 205, 206, 207, 208,
  806.  209, 210, 211, 212, 213, 214, 215, 216, 217, 218,
  807.  219, 220, 221, 222,  39,   0,  71,  72,  40,  41,
  808.   42,  43,   0,   0,   0,   0,   0,   0,  44,  46,
  809.    0,   0,   0,   0,  47,  48,  49,  88,  89,  50,
  810.   51,  52,  53,  54,  92,  55,  56,  57,   0,   0,
  811.   58,  59,  60,  95,  99, 100,  61,  62,  63,  64,
  812.   96,  65,  66,  67,  68,   0,   0,  69, 113, 188,
  813.  189, 190, 191,   0, 262, 263, 192,   0,   0, 114,
  814.  115, 116, 117,   0, 183,   0, 118, 119, 120, 121,
  815.  137, 138,   0, 122,   0,   0,   0, 148,   0, 149,
  816.  150, 151, 157,   0,   0,   0,   0, 158,   0,   0,
  817.  159,   0,   0,   0,   0, 161, 162,   0,   0, 106,
  818.    0,   0,   0,  13,  12,   0,   0,   0,   0,   0,
  819.    0,   0,   0,   0,   0, 282, 283,   0,   0,  17,
  820.    0,   0,   0,   0,   0,   0,   0,   0,   0, 259,
  821.    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  822.    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  823.    0,   0, 264, 265,   0,   0,   0, 139, 140, 141,
  824.    0,   0,   0,   0,   0,   0,   0, 178, 179, 180,
  825.    0,   0,   0,   0,   0,   0, 186, 187,   0,   0,
  826.    0,   0,   0,   0,   0,   0,   0,   0,   0, 272,
  827.  273, 274, 275, 276, 277, 278, 279, 280, 281, 284,
  828.    0,   0,   0,  23, 234,   0,   0, 235,   0,   0,
  829.  241,   0,   0, 260, 261,   0,   0,   0,   0,  78,
  830.   79,  80,  81,  82,  83,  84,  85,  86,  87,  91,
  831.   90,  93,  94,  97,  98, 193,   0,   0,   0,   0,
  832.  132, 133,   0,   0,   0,   0, 153,   0, 266,   0,
  833.    0,   0,   0,   0,   0,   0,   0, 171, 168, 160,
  834.    0, 164, 105, 165, 107, 223, 224, 225, 108,   0,
  835.    0,   0,   0, 237, 238,   0,   0,   0, 239, 240,
  836.  249, 251, 248, 250, 198, 199,  70,  74,  76,  75,
  837.   77,   0, 195,   0, 144, 145, 146, 147,   0, 134,
  838.  135, 136, 152, 154, 155, 156,   0,   0, 177, 173,
  839.  267, 268,   0, 176, 181, 182, 166, 169, 167, 170,
  840.  163,  16,  18,   0,   0,   0,   0,   0,   0,   0,
  841.    0,   0, 196, 197, 194,   0, 143, 172, 175, 174,
  842.    0, 243,   0,   0,   0, 246,   0,   0,   0, 142,
  843.   20, 242,   0,   0, 245, 247, 244,   0,   0, 253,
  844.  252, 255, 254 };
  845. #ifndef lint
  846. static char yaccpar_sccsid[] = "@(#)yaccpar    4.1    (Berkeley)    2/11/83";
  847. #endif not lint
  848.  
  849. #
  850. # define YYFLAG -1000
  851. # define YYERROR goto yyerrlab
  852. # define YYACCEPT return(0)
  853. # define YYABORT return(1)
  854.  
  855. /*    parser for yacc output    */
  856.  
  857. #ifdef YYDEBUG
  858. int yydebug = 0; /* 1 for debugging */
  859. #endif
  860. YYSTYPE yyv[YYMAXDEPTH]; /* where the values are stored */
  861. int yychar = -1; /* current input token number */
  862. int yynerrs = 0;  /* number of errors */
  863. short yyerrflag = 0;  /* error recovery flag */
  864.  
  865. yyparse() {
  866.  
  867.     short yys[YYMAXDEPTH];
  868.     short yyj, yym;
  869.     register YYSTYPE *yypvt;
  870.     register short yystate, *yyps, yyn;
  871.     register YYSTYPE *yypv;
  872.     register short *yyxi;
  873.  
  874.     yystate = 0;
  875.     yychar = -1;
  876.     yynerrs = 0;
  877.     yyerrflag = 0;
  878.     yyps= &yys[-1];
  879.     yypv= &yyv[-1];
  880.  
  881.  yystack:    /* put a state and value onto the stack */
  882.  
  883. #ifdef YYDEBUG
  884.     if( yydebug  ) printf( "state %d, char 0%o\n", yystate, yychar );
  885. #endif
  886.         if( ++yyps> &yys[YYMAXDEPTH] ) { yyerror( "yacc stack overflow" ); return(1); }
  887.         *yyps = yystate;
  888.         ++yypv;
  889.         *yypv = yyval;
  890.  
  891.  yynewstate:
  892.  
  893.     yyn = yypact[yystate];
  894.  
  895.     if( yyn<= YYFLAG ) goto yydefault; /* simple state */
  896.  
  897.     if( yychar<0 ) if( (yychar=yylex())<0 ) yychar=0;
  898.     if( (yyn += yychar)<0 || yyn >= YYLAST ) goto yydefault;
  899.  
  900.     if( yychk[ yyn=yyact[ yyn ] ] == yychar ){ /* valid shift */
  901.         yychar = -1;
  902.         yyval = yylval;
  903.         yystate = yyn;
  904.         if( yyerrflag > 0 ) --yyerrflag;
  905.         goto yystack;
  906.         }
  907.  
  908.  yydefault:
  909.     /* default state action */
  910.  
  911.     if( (yyn=yydef[yystate]) == -2 ) {
  912.         if( yychar<0 ) if( (yychar=yylex())<0 ) yychar = 0;
  913.         /* look through exception table */
  914.  
  915.         for( yyxi=yyexca; (*yyxi!= (-1)) || (yyxi[1]!=yystate) ; yyxi += 2 ) ; /* VOID */
  916.  
  917.         while( *(yyxi+=2) >= 0 ){
  918.             if( *yyxi == yychar ) break;
  919.             }
  920.         if( (yyn = yyxi[1]) < 0 ) return(0);   /* accept */
  921.         }
  922.  
  923.     if( yyn == 0 ){ /* error */
  924.         /* error ... attempt to resume parsing */
  925.  
  926.         switch( yyerrflag ){
  927.  
  928.         case 0:   /* brand new error */
  929.  
  930.             yyerror( "syntax error" );
  931.         yyerrlab:
  932.             ++yynerrs;
  933.  
  934.         case 1:
  935.         case 2: /* incompletely recovered error ... try again */
  936.  
  937.             yyerrflag = 3;
  938.  
  939.             /* find a state where "error" is a legal shift action */
  940.  
  941.             while ( yyps >= yys ) {
  942.                yyn = yypact[*yyps] + YYERRCODE;
  943.                if( yyn>= 0 && yyn < YYLAST && yychk[yyact[yyn]] == YYERRCODE ){
  944.                   yystate = yyact[yyn];  /* simulate a shift of "error" */
  945.                   goto yystack;
  946.                   }
  947.                yyn = yypact[*yyps];
  948.  
  949.                /* the current yyps has no shift onn "error", pop stack */
  950.  
  951. #ifdef YYDEBUG
  952.                if( yydebug ) printf( "error recovery pops state %d, uncovers %d\n", *yyps, yyps[-1] );
  953. #endif
  954.                --yyps;
  955.                --yypv;
  956.                }
  957.  
  958.             /* there is no state on the stack with an error shift ... abort */
  959.  
  960.     yyabort:
  961.             return(1);
  962.  
  963.  
  964.         case 3:  /* no shift yet; clobber input char */
  965.  
  966. #ifdef YYDEBUG
  967.             if( yydebug ) printf( "error recovery discards char %d\n", yychar );
  968. #endif
  969.  
  970.             if( yychar == 0 ) goto yyabort; /* don't discard EOF, quit */
  971.             yychar = -1;
  972.             goto yynewstate;   /* try again in the same state */
  973.  
  974.             }
  975.  
  976.         }
  977.  
  978.     /* reduction by production yyn */
  979.  
  980. #ifdef YYDEBUG
  981.         if( yydebug ) printf("reduce %d\n",yyn);
  982. #endif
  983.         yyps -= yyr2[yyn];
  984.         yypvt = yypv;
  985.         yypv -= yyr2[yyn];
  986.         yyval = yypv[1];
  987.         yym=yyn;
  988.             /* consult goto table to find next state */
  989.         yyn = yyr1[yyn];
  990.         yyj = yypgo[yyn] + *yyps + 1;
  991.         if( yyj>=YYLAST || yychk[ yystate = yyact[yyj] ] != -yyn ) yystate = yyact[yypgo[yyn]];
  992.         switch(yym){
  993.             
  994. case 3:
  995. # line 234 "a56.y"
  996. {substatement = 0;
  997.             if(NOT check_psect(seg, pc) && pass == 2)
  998.                 yyerror("%04X: psect violation", pc);
  999.             } break;
  1000. case 4:
  1001. # line 239 "a56.y"
  1002. {substatement++;
  1003.             if(NOT check_psect(seg, pc) && pass == 2)
  1004.                 yyerror("%04X: psect violation", pc);
  1005.             } break;
  1006. case 6:
  1007. # line 248 "a56.y"
  1008. {if(pass == 2 && list_on) {
  1009.                 printf("\n");
  1010.             }} break;
  1011. case 8:
  1012. # line 253 "a56.y"
  1013. {if(pass == 2 && NOT substatement && list_on) {
  1014.                 printf("%s%s\n", spaces(0), luntab(inline));
  1015.             }} break;
  1016. case 9:
  1017. # line 257 "a56.y"
  1018. {long_symbolic_expr = FALSE;} break;
  1019. case 10:
  1020. # line 259 "a56.y"
  1021. {char *printcode();
  1022.             if(pass == 2) {
  1023.                 gencode(seg, pc, w0);
  1024.                 if(list_on) printf("%c:%04X %s %s\n", segs[seg], pc, 
  1025.                     printcode(w0), substatement ? "" :
  1026.                         luntab(inline));
  1027.                 pc++;
  1028.                 if(uses_w1) {
  1029.                     gencode(seg, pc, w1);
  1030.                     if(list_on) printf("%c:%04X %s\n", segs[seg], pc,
  1031.                                printcode(w1 & 0xFFFFFF));
  1032.                     pc++;
  1033.                 }
  1034.             } else {
  1035.                 pc++;
  1036.                 if(uses_w1)
  1037.                     pc++;
  1038.             }
  1039.             w0 = w1 = 0; uses_w1 = FALSE; 
  1040.             long_symbolic_expr = FALSE;} break;
  1041. case 11:
  1042. # line 280 "a56.y"
  1043. {sym_def(yypvt[-1].sval, INT, pc);
  1044.             free(yypvt[-1].sval);
  1045.             if(pass == 2) {
  1046.                 if(list_on) printf("%c:%04X%s%s\n", segs[seg], pc, 
  1047.                     spaces(14-8), substatement ? "" :
  1048.                         luntab(inline));
  1049.             long_symbolic_expr = FALSE;
  1050.             }} break;
  1051. case 12:
  1052. # line 292 "a56.y"
  1053. {if(strlen(yypvt[-0].sval) > 0)
  1054.                 curfile = yypvt[-0].sval;
  1055.             curline = yypvt[-1].n.val.i - 2;} break;
  1056. case 13:
  1057. # line 299 "a56.y"
  1058. {sym_def(yypvt[-2].sval, yypvt[-0].n.type, yypvt[-0].n.val.i, yypvt[-0].n.val.f);
  1059.             free(yypvt[-2].sval);
  1060.             if(pass == 2 && list_on) {
  1061.                 if(yypvt[-0].n.type == INT)
  1062.                     printf("%06X%s",
  1063.                         yypvt[-0].n.val.i & 0xFFFFFF,
  1064.                         spaces(14-6-2));
  1065.                 else
  1066.                     printf("%10g%s", yypvt[-0].n.val.f,
  1067.                         spaces(14-10-2));
  1068.                 printf("%s\n", 
  1069.                     substatement ? "" : luntab(inline));
  1070.             }} break;
  1071. case 14:
  1072. # line 313 "a56.y"
  1073. {int ival = n2int(yypvt[-0].n);
  1074.             if(yypvt[-0].n.type == UNDEF) {
  1075.                 yyerror("illegal forward reference");
  1076.             } else if (ival <= 1) {
  1077.                 yyerror("%d: illegal alignment", ival);
  1078.             } else {
  1079.                 if(pc % ival != 0)
  1080.                     pc += ival - pc % ival;
  1081.             }
  1082.             if(pass == 2 && list_on)
  1083.                 printf("%c:%04X%s%s\n", segs[seg], pc, 
  1084.                     spaces(14-8), substatement ? "" : luntab(inline));
  1085.             } break;
  1086. case 15:
  1087. # line 327 "a56.y"
  1088. {struct psect *pp = find_psect(yypvt[-0].sval);
  1089.             if(NOT pp) {
  1090.                 if(pass == 2)
  1091.                     yyerror("%s: undefined psect", yypvt[-0].sval);
  1092.             } else {
  1093.                 seg = pp->seg;
  1094.                 pc = pp->pc;
  1095.                 set_psect(pp);
  1096.                 if(pass == 2 && list_on) 
  1097.                     printf("%c:%04X%s%s\n", segs[seg], pc, 
  1098.                         spaces(14-8), substatement ? "" : luntab(inline));
  1099.             }
  1100.             free(yypvt[-0].sval);} break;
  1101. case 16:
  1102. # line 341 "a56.y"
  1103. {new_psect(yypvt[-4].sval, yypvt[-3].ival, n2int(yypvt[-2].n), n2int(yypvt[-0].n));
  1104.             if(pass == 2 && list_on) 
  1105.                 printf("%c:%04X %04X%s%s\n", 
  1106.                     segs[yypvt[-3].ival], n2int(yypvt[-2].n), n2int(yypvt[-0].n), spaces(14-8+4+1), 
  1107.                     substatement ? "" : luntab(inline));
  1108.             } break;
  1109. case 17:
  1110. # line 348 "a56.y"
  1111. {pc = n2int(yypvt[-0].n);
  1112.             seg = yypvt[-1].ival;
  1113.             if(pass == 2 && list_on) 
  1114.                 printf("%c:%04X%s%s\n", segs[seg], pc, 
  1115.                     spaces(14-8), substatement ? "" : luntab(inline));
  1116.             } break;
  1117. case 18:
  1118. # line 355 "a56.y"
  1119. {pc = n2int(yypvt[-3].n);
  1120.             seg = yypvt[-4].ival;
  1121.             if(pass == 2 && list_on)
  1122.                 printf("%c:%04X%s%s\n", segs[seg], pc, 
  1123.                     spaces(14-8), substatement ? "" : luntab(inline));
  1124.             } break;
  1125. case 20:
  1126. # line 363 "a56.y"
  1127. {if(pass == 2 && NOT substatement && list_on) {
  1128.                 printf("%s%s\n", spaces(0), luntab(inline));
  1129.             }} break;
  1130. case 21:
  1131. # line 367 "a56.y"
  1132. {if(pass == 2 && NOT substatement && list_on) {
  1133.                 printf("%s%s\n", spaces(0), luntab(inline));
  1134.             }
  1135.             include(yypvt[-0].sval); /* free($2); */
  1136.             } break;
  1137. case 22:
  1138. # line 373 "a56.y"
  1139. {if(pass == 2 && NOT substatement && list_on) {
  1140.                 printf("%s%s\n", spaces(0), luntab(inline));
  1141.             }} break;
  1142. case 25:
  1143. # line 385 "a56.y"
  1144. {int len = strlen(yypvt[-0].sval), i; char *cp; w0 = 0;
  1145.             if(len % 3 == 2)
  1146.                 len++;    /* force empty word */
  1147.             for(i = 0, cp = yypvt[-0].sval; i < len; i++, cp++) {
  1148.                 w0 |= (*cp & 0xFF) << (2 - (i % 3)) * 8;
  1149.                 if(i % 3 == 2 || i == len - 1) {
  1150.                     if(pass == 2) {
  1151.                         if(list_on) printf("%c:%04X %06X%s%s\n",
  1152.                             segs[seg], pc, w0, 
  1153.                             spaces(14-6+5), 
  1154.                             substatement ? "" : luntab(inline));
  1155.                         gencode(seg, pc, w0);
  1156.                         substatement++;
  1157.                     }
  1158.                     pc++; w0 = 0;
  1159.                 }
  1160.             }
  1161.             free(yypvt[-0].sval);} break;
  1162. case 26:
  1163. # line 404 "a56.y"
  1164. {int frac = n2frac(yypvt[-0].n);
  1165.             if(pass == 2) {
  1166.                 if(list_on) {
  1167.                     printf("%c:%04X ", segs[seg], pc);
  1168.                     printf("%06X%s", 
  1169.                         frac & 0xFFFFFF,
  1170.                             spaces(14-6+5));
  1171.                     printf("%s\n",
  1172.                         substatement ? "" : luntab(inline));
  1173.                 }
  1174.                 gencode(seg, pc, frac);
  1175.                 substatement++;
  1176.             }
  1177.             pc++;} break;
  1178. case 27:
  1179. # line 420 "a56.y"
  1180. {yyval.ival = PROG;} break;
  1181. case 28:
  1182. # line 422 "a56.y"
  1183. {yyval.ival = XDATA;} break;
  1184. case 29:
  1185. # line 424 "a56.y"
  1186. {yyval.ival = YDATA;} break;
  1187. case 30:
  1188. # line 426 "a56.y"
  1189. {yyval.ival = LDATA;} break;
  1190. case 31:
  1191. # line 431 "a56.y"
  1192. {sym_def(yypvt[-0].sval, INT, pc);
  1193.             free(yypvt[-0].sval);} break;
  1194. case 33:
  1195. # line 438 "a56.y"
  1196. {if(just_rep) 
  1197.                 just_rep--;} break;
  1198. case 37:
  1199. # line 450 "a56.y"
  1200. {w0 |= 0x200000;} break;
  1201. case 39:
  1202. # line 459 "a56.y"
  1203. {w0 |= 0x80 | yypvt[-0].ival << 2;} break;
  1204. case 40:
  1205. # line 461 "a56.y"
  1206. {w0 |= 0x81 | yypvt[-0].ival << 2;} break;
  1207. case 41:
  1208. # line 463 "a56.y"
  1209. {w0 |= 0x82 | yypvt[-0].ival << 2;} break;
  1210. case 42:
  1211. # line 465 "a56.y"
  1212. {w0 |= 0x83 | yypvt[-0].ival << 2;} break;
  1213. case 43:
  1214. # line 468 "a56.y"
  1215. {w0 |= 0x04 | yypvt[-0].ival << 3;} break;
  1216. case 44:
  1217. # line 470 "a56.y"
  1218. {w0 |= 0x00 | yypvt[-0].ival << 3;} break;
  1219. case 45:
  1220. # line 472 "a56.y"
  1221. {w0 |= 0x00;} break;
  1222. case 46:
  1223. # line 475 "a56.y"
  1224. {w0 |= 0x01 | yypvt[-0].ival << 3;} break;
  1225. case 47:
  1226. # line 477 "a56.y"
  1227. {w0 |= 0x05 | yypvt[-0].ival << 3;} break;
  1228. case 48:
  1229. # line 479 "a56.y"
  1230. {w0 |= 0x07 | yypvt[-0].ival << 3;} break;
  1231. case 49:
  1232. # line 482 "a56.y"
  1233. {w0 |= 0x11 | yypvt[-0].ival << 3;} break;
  1234. case 50:
  1235. # line 484 "a56.y"
  1236. {w0 |= 0x12 | yypvt[-0].ival << 3;} break;
  1237. case 51:
  1238. # line 486 "a56.y"
  1239. {w0 |= 0x13 | yypvt[-0].ival << 3;} break;
  1240. case 52:
  1241. # line 488 "a56.y"
  1242. {w0 |= 0x16 | yypvt[-0].ival << 3;} break;
  1243. case 53:
  1244. # line 490 "a56.y"
  1245. {w0 |= 0x17 | yypvt[-0].ival << 3;} break;
  1246. case 54:
  1247. # line 493 "a56.y"
  1248. {w0 |= 0x02 | yypvt[-0].ival << 3;} break;
  1249. case 55:
  1250. # line 495 "a56.y"
  1251. {w0 |= 0x03 | yypvt[-0].ival << 3;} break;
  1252. case 56:
  1253. # line 497 "a56.y"
  1254. {w0 |= 0x06 | yypvt[-0].ival << 3;} break;
  1255. case 57:
  1256. # line 500 "a56.y"
  1257. {w0 |= 0x46 | yypvt[-0].ival << 3;} break;
  1258. case 58:
  1259. # line 502 "a56.y"
  1260. {w0 |= 0x42 | yypvt[-0].ival << 3;} break;
  1261. case 59:
  1262. # line 504 "a56.y"
  1263. {w0 |= 0x43 | yypvt[-0].ival << 3;} break;
  1264. case 60:
  1265. # line 507 "a56.y"
  1266. {w0 |= 0x22 | yypvt[-0].ival << 3;} break;
  1267. case 61:
  1268. # line 509 "a56.y"
  1269. {w0 |= 0x23 | yypvt[-0].ival << 3;} break;
  1270. case 62:
  1271. # line 511 "a56.y"
  1272. {w0 |= 0x26 | yypvt[-0].ival << 3;} break;
  1273. case 63:
  1274. # line 513 "a56.y"
  1275. {w0 |= 0x27 | yypvt[-0].ival << 3;} break;
  1276. case 64:
  1277. # line 516 "a56.y"
  1278. {w0 |= 0x32 | yypvt[-0].ival << 3;} break;
  1279. case 65:
  1280. # line 518 "a56.y"
  1281. {w0 |= 0x33 | yypvt[-0].ival << 3;} break;
  1282. case 66:
  1283. # line 520 "a56.y"
  1284. {w0 |= 0x36 | yypvt[-0].ival << 3;} break;
  1285. case 67:
  1286. # line 522 "a56.y"
  1287. {w0 |= 0x37 | yypvt[-0].ival << 3;} break;
  1288. case 68:
  1289. # line 525 "a56.y"
  1290. {w0 |= 0x21 | yypvt[-0].ival << 3;} break;
  1291. case 69:
  1292. # line 527 "a56.y"
  1293. {w0 |= 0x25 | yypvt[-0].ival << 3;} break;
  1294. case 70:
  1295. # line 531 "a56.y"
  1296. {yyval.ival = yypvt[-3].ival | yypvt[-0].ival << 1 | yypvt[-2].ival << 2;} break;
  1297. case 71:
  1298. # line 536 "a56.y"
  1299. {yyval.ival = 0;} break;
  1300. case 72:
  1301. # line 538 "a56.y"
  1302. {yyval.ival = 1;} break;
  1303. case 73:
  1304. # line 540 "a56.y"
  1305. {yyval.ival = 0;} break;
  1306. case 74:
  1307. # line 545 "a56.y"
  1308. {switch (yypvt[-2].ival << 4 | yypvt[-0].ival) {
  1309.                 case 0x00: yyval.ival = 0x0; break;
  1310.                 case 0x01: 
  1311.                 case 0x10: yyval.ival = 0x2; break;
  1312.                 case 0x11: 
  1313.                     yyerror("illegal source operands"); 
  1314.                     break;
  1315.             }} break;
  1316. case 75:
  1317. # line 554 "a56.y"
  1318. {switch (yypvt[-2].ival << 4 | yypvt[-0].ival) {
  1319.                 case 0x00: yyval.ival = 0x1; break;
  1320.                 case 0x01: 
  1321.                 case 0x10: yyval.ival = 0x3; break;
  1322.                 case 0x11: 
  1323.                     yyerror("illegal source operands"); 
  1324.                     break;
  1325.             }} break;
  1326. case 76:
  1327. # line 563 "a56.y"
  1328. {switch (yypvt[-2].ival << 4 | yypvt[-0].ival) {
  1329.                 case 0x00: yyval.ival = 0x5; break;
  1330.                 case 0x01: yyval.ival = 0x4; break;
  1331.                 case 0x10: yyval.ival = 0x6; break;
  1332.                 case 0x11: yyval.ival = 0x7; break;
  1333.             }} break;
  1334. case 77:
  1335. # line 570 "a56.y"
  1336. {switch (yypvt[-2].ival << 4 | yypvt[-0].ival) {
  1337.                 case 0x00: yyval.ival = 0x5; break;
  1338.                 case 0x01: yyval.ival = 0x6; break;
  1339.                 case 0x10: yyval.ival = 0x4; break;
  1340.                 case 0x11: yyval.ival = 0x7; break;
  1341.             }} break;
  1342. case 78:
  1343. # line 579 "a56.y"
  1344. {yyval.ival = 0x2;} break;
  1345. case 79:
  1346. # line 581 "a56.y"
  1347. {yyval.ival = 0x3;} break;
  1348. case 80:
  1349. # line 583 "a56.y"
  1350. {yyval.ival = 0x4 | yypvt[-0].ival;} break;
  1351. case 81:
  1352. # line 585 "a56.y"
  1353. {yyval.ival = 0x6 | yypvt[-0].ival;} break;
  1354. case 82:
  1355. # line 587 "a56.y"
  1356. {yyval.ival = 0x8 | yypvt[-2].ival << 2 | yypvt[-0].ival;} break;
  1357. case 83:
  1358. # line 589 "a56.y"
  1359. {yyval.ival = 0xA | yypvt[-2].ival << 2 | yypvt[-0].ival;} break;
  1360. case 84:
  1361. # line 593 "a56.y"
  1362. {yyval.ival = 0x0;} break;
  1363. case 85:
  1364. # line 595 "a56.y"
  1365. {yyval.ival = 0x1;} break;
  1366. case 86:
  1367. # line 597 "a56.y"
  1368. {yyval.ival = 0x8 | yypvt[-2].ival << 2 | yypvt[-0].ival;} break;
  1369. case 87:
  1370. # line 599 "a56.y"
  1371. {yyval.ival = 0xA | yypvt[-2].ival << 2 | yypvt[-0].ival;} break;
  1372. case 88:
  1373. # line 603 "a56.y"
  1374. {yyval.ival = 0x0;} break;
  1375. case 89:
  1376. # line 605 "a56.y"
  1377. {yyval.ival = 0x1;} break;
  1378. case 90:
  1379. # line 607 "a56.y"
  1380. {yyval.ival = 0x0;} break;
  1381. case 91:
  1382. # line 609 "a56.y"
  1383. {yyval.ival = 0x1;} break;
  1384. case 92:
  1385. # line 613 "a56.y"
  1386. {yyval.ival = yypvt[-0].ival;} break;
  1387. case 93:
  1388. # line 617 "a56.y"
  1389. {yyval.ival = 0x0 | yypvt[-2].ival << 2 | yypvt[-0].ival;} break;
  1390. case 94:
  1391. # line 619 "a56.y"
  1392. {yyval.ival = 0x2 | yypvt[-2].ival << 2 | yypvt[-0].ival;} break;
  1393. case 95:
  1394. # line 623 "a56.y"
  1395. {yyval.ival = yypvt[-0].ival;} break;
  1396. case 96:
  1397. # line 627 "a56.y"
  1398. {yyval.ival = yypvt[-0].ival;} break;
  1399. case 97:
  1400. # line 631 "a56.y"
  1401. {yyval.ival = 0x0 | yypvt[-0].ival;} break;
  1402. case 98:
  1403. # line 633 "a56.y"
  1404. {yyval.ival = 0x2 | yypvt[-0].ival;} break;
  1405. case 99:
  1406. # line 637 "a56.y"
  1407. {yyval.ival = 0;} break;
  1408. case 100:
  1409. # line 639 "a56.y"
  1410. {yyval.ival = 1;} break;
  1411. case 101:
  1412. # line 644 "a56.y"
  1413. {if(just_rep == 1)
  1414.                 yyerror("instruction not allowed after REP");} break;
  1415. case 105:
  1416. # line 655 "a56.y"
  1417. {w0 |= 0x01D815 | yypvt[-2].ival << 8 | yypvt[-0].ival << 3;} break;
  1418. case 106:
  1419. # line 657 "a56.y"
  1420. {w0 |= 0x018040 | yypvt[-0].ival << 3;} break;
  1421. case 107:
  1422. # line 659 "a56.y"
  1423. {w0 |= 0x0000F8 | (n2int(yypvt[-2].n) & 0xFF) << 8 | yypvt[-0].ival;} break;
  1424. case 108:
  1425. # line 661 "a56.y"
  1426. {w0 |= 0x0000B8 | (n2int(yypvt[-2].n) & 0xFF) << 8 | yypvt[-0].ival;} break;
  1427. case 113:
  1428. # line 676 "a56.y"
  1429. {if(yypvt[-0].ival) {
  1430.                 w0 |= 0x0BC0A0 | yypvt[-1].cond << 0;
  1431.             } else {
  1432.                 w0 |= 0x0F0000 | yypvt[-1].cond << 12;
  1433.             }} break;
  1434. case 114:
  1435. # line 682 "a56.y"
  1436. {if(yypvt[-0].ival) {
  1437.                 w0 |= 0x0AC0A0 | yypvt[-1].cond << 0;
  1438.             } else {
  1439.                 w0 |= 0x0E0000 | yypvt[-1].cond << 12;
  1440.             }} break;
  1441. case 115:
  1442. # line 688 "a56.y"
  1443. {if(yypvt[-0].ival) {
  1444.                 w0 |= 0x0BC080;
  1445.             } else {
  1446.                 w0 |= 0x0D0000;
  1447.             }} break;
  1448. case 116:
  1449. # line 694 "a56.y"
  1450. {if(yypvt[-0].ival) {
  1451.                 w0 |= 0x0AC080;
  1452.             } else {
  1453.                 w0 |= 0x0C0000;
  1454.             }} break;
  1455. case 117:
  1456. # line 701 "a56.y"
  1457. {w0 |= 0x0B0020;} break;
  1458. case 118:
  1459. # line 703 "a56.y"
  1460. {w0 |= 0x0B0000;} break;
  1461. case 119:
  1462. # line 705 "a56.y"
  1463. {w0 |= 0x0A0020;} break;
  1464. case 120:
  1465. # line 707 "a56.y"
  1466. {w0 |= 0x0A0000;} break;
  1467. case 121:
  1468. # line 710 "a56.y"
  1469. {just_rep = 2;} break;
  1470. case 122:
  1471. # line 712 "a56.y"
  1472. {uses_w1++;} break;
  1473. case 123:
  1474. # line 714 "a56.y"
  1475. {w0 |= 0x00008C;} break;
  1476. case 124:
  1477. # line 716 "a56.y"
  1478. {w0 |= 0x000087;} break;
  1479. case 125:
  1480. # line 718 "a56.y"
  1481. {w0 |= 0x000086;} break;
  1482. case 126:
  1483. # line 720 "a56.y"
  1484. {w0 |= 0x000084;} break;
  1485. case 127:
  1486. # line 722 "a56.y"
  1487. {w0 |= 0x00000C;} break;
  1488. case 128:
  1489. # line 724 "a56.y"
  1490. {w0 |= 0x000006;} break;
  1491. case 129:
  1492. # line 726 "a56.y"
  1493. {w0 |= 0x000005;} break;
  1494. case 130:
  1495. # line 728 "a56.y"
  1496. {w0 |= 0x000004;} break;
  1497. case 131:
  1498. # line 730 "a56.y"
  1499. {w0 |= 0x000000;
  1500.             just_rep = 0;} break;
  1501. case 132:
  1502. # line 735 "a56.y"
  1503. {int ival = n2int(yypvt[-2].n);
  1504.             w0 |= 0x060080 | (ival & 0xFF) << 8 | (ival & 0xF00)>> 8;
  1505.             if(ival > 0xFFF && pass == 2) {
  1506.                 yyerror("warning: immediate operand truncated");
  1507.             }
  1508.             w1 |= yypvt[-0].ival-1;} break;
  1509. case 133:
  1510. # line 742 "a56.y"
  1511. {w0 |= 0x06C000 | yypvt[-2].regs.r6 << 8;
  1512.             w1 |= yypvt[-0].ival-1;} break;
  1513. case 134:
  1514. # line 745 "a56.y"
  1515. {w0 |= 0x064000 | yypvt[-2].ival << 8 | yypvt[-3].ival << 6;
  1516.             w1 |= yypvt[-0].ival-1;} break;
  1517. case 135:
  1518. # line 748 "a56.y"
  1519. {w0 |= 0x060000 | (yypvt[-2].ival & 0x3F) << 8 | yypvt[-3].ival << 6;
  1520.             if(yypvt[-2].ival > 0x003F && pass == 2)
  1521.                 yyerror("warning: address operand truncated");
  1522.             w1 |= yypvt[-0].ival-1;} break;
  1523. case 136:
  1524. # line 753 "a56.y"
  1525. {w0 |= 0x060000 | (yypvt[-2].ival & 0x3F) << 8 | yypvt[-3].ival << 6;
  1526.             if(yypvt[-2].ival > 0x003F && pass == 2)
  1527.                 yyerror("warning: address operand truncated");
  1528.             w1 |= yypvt[-0].ival-1;} break;
  1529. case 137:
  1530. # line 761 "a56.y"
  1531. {int ival = n2int(yypvt[-0].n);
  1532.             w0 |= 0x0600A0 | (ival & 0xFF) << 8 | (ival & 0xF00)>> 8;
  1533.             if(ival > 0xFFF && pass == 2) {
  1534.                 yyerror("warning: immediate operand truncated");
  1535.             }} break;
  1536. case 138:
  1537. # line 767 "a56.y"
  1538. {w0 |= 0x06C020 | yypvt[-0].regs.r6 << 8;} break;
  1539. case 139:
  1540. # line 769 "a56.y"
  1541. {w0 |= 0x064020 | yypvt[-1].ival << 6 | yypvt[-0].ival << 8;} break;
  1542. case 140:
  1543. # line 771 "a56.y"
  1544. {w0 |= 0x060020 | yypvt[-1].ival << 6 | (yypvt[-0].ival & 0x3F) << 8;
  1545.             if(yypvt[-0].ival > 0x003F && pass == 2)
  1546.                 yyerror("warning: address operand truncated");
  1547.             } break;
  1548. case 141:
  1549. # line 776 "a56.y"
  1550. {w0 |= 0x060020 | yypvt[-1].ival << 6 | (yypvt[-0].ival & 0x3F) << 8;
  1551.             if(yypvt[-0].ival > 0x003F && pass == 2)
  1552.                 yyerror("warning: address operand truncated");
  1553.             } break;
  1554. case 142:
  1555. # line 784 "a56.y"
  1556. {w0 |= yypvt[-5].ival << 0 | yypvt[-3].ival << 6;
  1557.             uses_w1++;
  1558.             w1 = yypvt[-0].ival;} break;
  1559. case 143:
  1560. # line 788 "a56.y"
  1561. {w0 |= 0x00C000 | yypvt[-4].ival << 0 | yypvt[-2].regs.r6 << 8;
  1562.             uses_w1++;
  1563.             w1 = yypvt[-0].ival;} break;
  1564. case 144:
  1565. # line 799 "a56.y"
  1566. {if(yypvt[-0].ival != -1) {    /* symbol defined */
  1567.                 w0 |= (yypvt[-0].ival & 0x3F) << 8;
  1568.                 if(yypvt[-0].ival >= 0xFFC0) {
  1569.                     w0 |= 0x008080;
  1570.                 } else {
  1571.                     w0 |= 0x000080;
  1572.                     if(yypvt[-0].ival > 0x003F && pass == 2)
  1573.                         yyerror("warning: address operand truncated");
  1574.                 }
  1575.             }} break;
  1576. case 145:
  1577. # line 810 "a56.y"
  1578. {if(yypvt[-0].ival != -1) {
  1579.                 if(yypvt[-0].ival > 0x3F && pass == 2)
  1580.                     yyerror("warning: address operand truncated");
  1581.                 w0 |= 0x000080 | (yypvt[-0].ival & 0x3F) << 8;
  1582.             }} break;
  1583. case 146:
  1584. # line 816 "a56.y"
  1585. {if(yypvt[-0].ival != -1) {
  1586.                 if(yypvt[-0].ival < 0xFFC0 && pass == 2)
  1587.                     yyerror("warning: address operand truncated");
  1588.                 w0 |= 0x008080 | (yypvt[-0].ival & 0x3F) << 8;
  1589.             }} break;
  1590. case 147:
  1591. # line 822 "a56.y"
  1592. {w0 |= 0x004080 | yypvt[-0].ival << 8;} break;
  1593. case 148:
  1594. # line 829 "a56.y"
  1595. {w0 |= 0x0B0020;} break;
  1596. case 149:
  1597. # line 831 "a56.y"
  1598. {w0 |= 0x0B0000;} break;
  1599. case 150:
  1600. # line 833 "a56.y"
  1601. {w0 |= 0x0A0020;} break;
  1602. case 151:
  1603. # line 835 "a56.y"
  1604. {w0 |= 0x0A0000;} break;
  1605. case 152:
  1606. # line 840 "a56.y"
  1607. {w0 |= yypvt[-3].ival << 0 | yypvt[-1].ival << 6;} break;
  1608. case 153:
  1609. # line 842 "a56.y"
  1610. {w0 |= 0x00C040 | yypvt[-2].ival << 0 | yypvt[-0].regs.r6 << 8;} break;
  1611. case 154:
  1612. # line 847 "a56.y"
  1613. {if(yypvt[-0].ival != -1) {
  1614.                 w0 |= (yypvt[-0].ival & 0x3F) << 8 | 0x008000;
  1615.                 if(yypvt[-0].ival < 0xFFC0 && pass == 2)
  1616.                     yyerror("warning: address operand truncated");
  1617.             }} break;
  1618. case 155:
  1619. # line 853 "a56.y"
  1620. {if(yypvt[-0].ival != -1) {
  1621.                 w0 |= (yypvt[-0].ival & 0x3F) << 8 | 0x000000;
  1622.                 if(yypvt[-0].ival > 0x003F && pass == 2)
  1623.                     yyerror("warning: address operand truncated");
  1624.             }} break;
  1625. case 156:
  1626. # line 859 "a56.y"
  1627. {w0 |= 0x004000;} break;
  1628. case 160:
  1629. # line 869 "a56.y"
  1630. {w0 |= 0x044010 | yypvt[-2].ival << 8 | yypvt[-0].regs.r4;} break;
  1631. case 161:
  1632. # line 871 "a56.y"
  1633. {w0 |= yypvt[-1].cond << 12;} break;
  1634. case 162:
  1635. # line 876 "a56.y"
  1636. {w0 |= 0x020000 | yypvt[-0].ival << 3;} break;
  1637. case 163:
  1638. # line 878 "a56.y"
  1639. {w0 |= 0x030000 | yypvt[-3].ival << 3 | yypvt[-2].ival << 8 | yypvt[-0].ival;} break;
  1640. case 164:
  1641. # line 882 "a56.y"
  1642. {if(yypvt[-2].regs.flags & R_AB && yypvt[-0].regs.flags & R_AB) {
  1643.                 if(yypvt[-2].regs.ab == yypvt[-0].regs.ab) 
  1644.                     yyerror("source and dest must be different");
  1645.                 yyval.ival = yypvt[-0].regs.ab;
  1646.             } else if(yypvt[-2].regs.flags & R_XREG && yypvt[-0].regs.flags & R_AB) {
  1647.                 yyval.ival = 0x8 | yypvt[-2].regs.xreg << 2 | yypvt[-0].regs.ab;
  1648.             } else if(yypvt[-2].regs.flags & R_YREG && yypvt[-0].regs.flags & R_AB) {
  1649.                 yyval.ival = 0xA | yypvt[-2].regs.yreg << 2 | yypvt[-0].regs.ab;
  1650.             } else 
  1651.                 yyerror("illegal TCC operands");
  1652.             } break;
  1653. case 165:
  1654. # line 896 "a56.y"
  1655. {if(yypvt[-2].regs.flags & R_XREG && yypvt[-0].regs.flags & R_AB) {
  1656.                 yyval.ival = yypvt[-2].regs.xreg << 2 | yypvt[-0].regs.ab;
  1657.             } else if(yypvt[-2].regs.flags & R_YREG && yypvt[-0].regs.flags & R_AB) {
  1658.                 yyval.ival = yypvt[-2].regs.yreg << 2 | 2 | yypvt[-0].regs.ab;
  1659.             }} break;
  1660. case 166:
  1661. # line 905 "a56.y"
  1662. {if(yypvt[-3].ival == 0) {
  1663.                 w0 |= 0x05C020 | yypvt[-0].regs.ctl_reg;
  1664.             } else {
  1665.                 w0 |= 0x05C060 | yypvt[-0].regs.ctl_reg;
  1666.             }} break;
  1667. case 167:
  1668. # line 911 "a56.y"
  1669. {if(yypvt[-1].ival == 0) {
  1670.                 w0 |= 0x054020 | yypvt[-3].regs.ctl_reg;
  1671.             } else {
  1672.                 w0 |= 0x054060 | yypvt[-3].regs.ctl_reg;
  1673.             }} break;
  1674. case 168:
  1675. # line 917 "a56.y"
  1676. {int ival = n2int(yypvt[-2].n);
  1677.             if(ival < 256 && NOT long_symbolic_expr) {
  1678.                 w0 |= 0x0500A0 | (ival & 0xFF) << 8 | yypvt[-0].regs.ctl_reg; 
  1679.             } else {
  1680.                 w0 |= 0x05C020 | 0x003400 | yypvt[-0].regs.ctl_reg;
  1681.                 uses_w1++; w1 = ival & 0xFFFF;
  1682.             }} break;
  1683. case 169:
  1684. # line 925 "a56.y"
  1685. {if(yypvt[-3].ival == 0) {
  1686.                 w0 |= 0x058020 | (yypvt[-2].ival & 0x3F) << 8 | yypvt[-0].regs.ctl_reg;
  1687.             } else {
  1688.                 w0 |= 0x058060 | (yypvt[-2].ival & 0x3F) << 8 | yypvt[-0].regs.ctl_reg;
  1689.             }
  1690.             if(yypvt[-2].ival > 0x003F && pass == 2)
  1691.                 yyerror("warning: address operand truncated");
  1692.             } break;
  1693. case 170:
  1694. # line 934 "a56.y"
  1695. {if(yypvt[-1].ival == 0) {
  1696.                 w0 |= 0x050020 | (yypvt[-0].ival & 0x3F) << 8 | yypvt[-3].regs.ctl_reg;
  1697.             } else {
  1698.                 w0 |= 0x050060 | (yypvt[-0].ival & 0x3F) << 8 | yypvt[-3].regs.ctl_reg;
  1699.             }
  1700.             if(yypvt[-0].ival > 0x003F && pass == 2)
  1701.                 yyerror("warning: address operand truncated");
  1702.             } break;
  1703. case 171:
  1704. # line 943 "a56.y"
  1705. {if(yypvt[-2].regs.flags & R_CTL_REG) {
  1706.                 w0 |= 0x0440A0 | yypvt[-0].regs.r6 << 8 | yypvt[-2].regs.ctl_reg;
  1707.             } else if(yypvt[-0].regs.flags & R_CTL_REG) {
  1708.                 w0 |= 0x04C0A0 | yypvt[-2].regs.r6 << 8 | yypvt[-0].regs.ctl_reg;
  1709.             } else if(yypvt[-2].regs.flags & yypvt[-0].regs.flags & R_CTL_REG) {
  1710.                 /* bogus? $$$ */
  1711.                        w0 |= 0x04C0A0 | (yypvt[-2].regs.ctl_reg | 0x20) << 8 | 
  1712.                 yypvt[-0].regs.ctl_reg;
  1713.             } else {
  1714.                 yyerror("MOVEC must reference a control reg");
  1715.             }} break;
  1716. case 172:
  1717. # line 958 "a56.y"
  1718. {w0 |= 0x084080;
  1719.             switch(yypvt[-3].ea.pp << 1 | yypvt[-0].ea.pp) {
  1720.                 case 0:    case 3:
  1721.                     yyerror("illegal MOVEP; can't move EA to EA or IO to IO");
  1722.                     break;
  1723.                 case 1:    /* ea, pp */
  1724.                     w0 |= yypvt[-1].ival << 16 | 1 << 15 | yypvt[-4].ival << 6 |
  1725.                         (yypvt[-0].ea.ext & 0x3F);
  1726.                     if(yypvt[-3].ea.mode == 0x003000) {
  1727.                         w0 |= 0x003000;
  1728.                         uses_w1++;
  1729.                         w1 = yypvt[-3].ea.ext;
  1730.                     } else {
  1731.                         w0 |= yypvt[-3].ea.mode;
  1732.                     }
  1733.                     break;
  1734.                 case 2:    /* pp, ea */
  1735.                     w0 |= yypvt[-4].ival << 16 | 0 << 15 | yypvt[-1].ival << 6 |
  1736.                         (yypvt[-3].ea.ext & 0x3F);
  1737.                     if(yypvt[-0].ea.mode == 0x003000) {
  1738.                         w0 |= 0x003000;
  1739.                         uses_w1++;
  1740.                         w1 = yypvt[-0].ea.ext;
  1741.                     } else {
  1742.                         w0 |= yypvt[-0].ea.mode;
  1743.                     }
  1744.                     break;
  1745.             }} break;
  1746. case 173:
  1747. # line 987 "a56.y"
  1748. {w0 |= 0x084080;
  1749.             w0 |= yypvt[-1].ival << 16 | 1 << 15 | 0x34 << 8 | 
  1750.                 (n2int(yypvt[-0].n) & 0x3F);
  1751.             uses_w1++;
  1752.             w1 = n2int(yypvt[-3].n);} break;
  1753. case 174:
  1754. # line 993 "a56.y"
  1755. {w0 |= 0x084040;
  1756.             w0 |= yypvt[-1].ival << 16 | 1 << 15 | (n2int(yypvt[-0].n) & 0x3F);} break;
  1757. case 175:
  1758. # line 996 "a56.y"
  1759. {w0 |= 0x084040;
  1760.             if(yypvt[-3].ea.mode != 0x003000 && yypvt[-3].ea.mode != 0)
  1761.                 yyerror("illegal MOVEP");
  1762.             w0 |= yypvt[-4].ival << 16 | 0 << 15 | (yypvt[-3].ea.ext & 0x3F);} break;
  1763. case 176:
  1764. # line 1001 "a56.y"
  1765. {w0 |= 0x084000;
  1766.             w0 |= yypvt[-1].ival << 16 | 1 << 15 | yypvt[-3].regs.r6 << 8 | 
  1767.                 (n2int(yypvt[-0].n) & 0x3F);} break;
  1768. case 177:
  1769. # line 1005 "a56.y"
  1770. {w0 |= 0x084000;
  1771.             if(!yypvt[-2].ea.pp)
  1772.                 yyerror("illegal MOVEP");
  1773.             w0 |= yypvt[-3].ival << 16 | 0 << 15 | yypvt[-0].regs.r6 << 8 | (yypvt[-2].ea.ext & 0x3F);} break;
  1774. case 178:
  1775. # line 1013 "a56.y"
  1776. {if(yypvt[-0].ival != UNDEF && yypvt[-0].ival >= 0xFFC0) {
  1777.                 /* defined symbol or constant, in i/o range */
  1778.                 yyval.ea.pp = 1;
  1779.                 yyval.ea.mode = 0;
  1780.             } else {
  1781.                 /* either out of i/o range or symbol not */
  1782.                 /* yet defined:  assume ea extension */
  1783.                 yyval.ea.pp = 0;
  1784.                 yyval.ea.mode = 0x003000;
  1785.             }
  1786.             yyval.ea.ext = yypvt[-0].ival;} break;
  1787. case 179:
  1788. # line 1025 "a56.y"
  1789. {yyval.ea.pp = 1;
  1790.             yyval.ea.mode = 0;
  1791.             if(yypvt[-0].ival < 0xFFC0 && pass == 2)
  1792.                 yyerror("warning: address operand truncated");
  1793.             yyval.ea.ext = yypvt[-0].ival;} break;
  1794. case 180:
  1795. # line 1031 "a56.y"
  1796. {yyval.ea.pp = 0;
  1797.             yyval.ea.mode = yypvt[-0].ival << 8;
  1798.             yyval.ea.ext = yypvt[-0].ival;} break;
  1799. case 181:
  1800. # line 1038 "a56.y"
  1801. {w0 |= 0x070000 | 0 << 15 | yypvt[-3].regs.r6;} break;
  1802. case 182:
  1803. # line 1040 "a56.y"
  1804. {w0 |= 0x070000 | 1 << 15 | yypvt[-0].regs.r6;} break;
  1805. case 183:
  1806. # line 1047 "a56.y"
  1807. {int ival = n2int(yypvt[-0].n);
  1808.             yyval.ival = ival; if(ival > 0x17) 
  1809.                 yyerror("%d: illegal bit number", ival);} break;
  1810. case 184:
  1811. # line 1053 "a56.y"
  1812. {yyval.ival = 0;} break;
  1813. case 185:
  1814. # line 1055 "a56.y"
  1815. {yyval.ival = 1;} break;
  1816. case 186:
  1817. # line 1061 "a56.y"
  1818. {w0 |= 0x004080;} break;
  1819. case 187:
  1820. # line 1063 "a56.y"
  1821. {w0 |= (yypvt[-0].ival & 0x3F) << 8;
  1822.             if(yypvt[-0].ival > 0x003F && pass == 2)
  1823.                 yyerror("warning: address operand truncated");
  1824.             } break;
  1825. case 188:
  1826. # line 1070 "a56.y"
  1827. {yyval.ival = 1;} break;
  1828. case 189:
  1829. # line 1072 "a56.y"
  1830. {w0 |= yypvt[-0].ival & 0xFFF; yyval.ival = 0;
  1831.             if(yypvt[-0].ival > 0x0FFF && pass == 2)
  1832.                 yyerror("warning: address operand truncated");
  1833.             } break;
  1834. case 190:
  1835. # line 1079 "a56.y"
  1836. {w0 |= 0x003000;
  1837.             uses_w1++;
  1838.             w1 |= yypvt[-0].ival;
  1839.             yyval.ival = 0x003000;} break;
  1840. case 191:
  1841. # line 1084 "a56.y"
  1842. {w0 |= yypvt[-0].ival << 8;
  1843.             yyval.ival = yypvt[-0].ival << 8;} break;
  1844. case 192:
  1845. # line 1090 "a56.y"
  1846. {yyval.ival = yypvt[-0].ival;} break;
  1847. case 193:
  1848. # line 1092 "a56.y"
  1849. {yyval.ival = 4 << 3 | yypvt[-1].ival;} break;
  1850. case 194:
  1851. # line 1094 "a56.y"
  1852. {yyval.ival = 5 << 3 | yypvt[-3].ival;
  1853.             if(yypvt[-3].ival != yypvt[-1].ival) yyerror("Rn and Nn must be same number");} break;
  1854. case 195:
  1855. # line 1097 "a56.y"
  1856. {yyval.ival = 7 << 3 | yypvt[-1].ival;} break;
  1857. case 196:
  1858. # line 1102 "a56.y"
  1859. {yyval.ival = 0 << 3 | yypvt[-3].ival;
  1860.             if(yypvt[-3].ival != yypvt[-0].ival) yyerror("Rn and Nn must be same number");} break;
  1861. case 197:
  1862. # line 1105 "a56.y"
  1863. {yyval.ival = 1 << 3 | yypvt[-3].ival;
  1864.             if(yypvt[-3].ival != yypvt[-0].ival) yyerror("Rn and Nn must be same number");} break;
  1865. case 198:
  1866. # line 1108 "a56.y"
  1867. {yyval.ival = 2 << 3 | yypvt[-2].ival;} break;
  1868. case 199:
  1869. # line 1110 "a56.y"
  1870. {yyval.ival = 3 << 3 | yypvt[-2].ival;} break;
  1871. case 200:
  1872. # line 1116 "a56.y"
  1873. {yyval.regs.r6 = yyval.regs.r5 = 0x04 | yypvt[-0].ival;
  1874.             yyval.regs.sdx = yypvt[-0].ival;
  1875.             yyval.regs.xreg = yypvt[-0].ival;
  1876.             yyval.regs.flags = R_R6|R_R5|R_XREG|R_SDX|R_SFRAC;} break;
  1877. case 201:
  1878. # line 1121 "a56.y"
  1879. {yyval.regs.r6 = yyval.regs.r5 = 0x06 | yypvt[-0].ival;
  1880.             yyval.regs.sdy = yypvt[-0].ival;
  1881.             yyval.regs.yreg = yypvt[-0].ival;
  1882.             yyval.regs.flags = R_R6|R_R5|R_SDY|R_YREG|R_SFRAC;} break;
  1883. case 202:
  1884. # line 1126 "a56.y"
  1885. {switch(yypvt[-0].ival) {
  1886.                 case 0: 
  1887.                     yyval.regs.r6 = yyval.regs.r5 = 0x08 | 0; 
  1888.                     break;
  1889.                 case 1: 
  1890.                     yyval.regs.r6 = yyval.regs.r5 = 0x08 | 4; 
  1891.                     break;
  1892.                 case 2: 
  1893.                     yyval.regs.r6 = yyval.regs.r5 = 0x08 | 2; 
  1894.                     break;
  1895.             }
  1896.             yyval.regs.flags = R_R6|R_R5|R_UINT;} break;
  1897. case 203:
  1898. # line 1139 "a56.y"
  1899. {switch(yypvt[-0].ival) {
  1900.                 case 0: 
  1901.                     yyval.regs.r6 = yyval.regs.r5 = 0x08 | 1; break;
  1902.                 case 1: 
  1903.                     yyval.regs.r6 = yyval.regs.r5 = 0x08 | 5; break;
  1904.                 case 2: 
  1905.                     yyval.regs.r6 = yyval.regs.r5 = 0x08 | 3; break;
  1906.             }
  1907.             yyval.regs.flags = R_R6|R_R5|R_UINT;} break;
  1908. case 204:
  1909. # line 1149 "a56.y"
  1910. {yyval.regs.r6 = yyval.regs.r5 = 0x0E;
  1911.             yyval.regs.sdx = yyval.regs.sdy = 0x2;
  1912.             yyval.regs.ab = 0;
  1913.             yyval.regs.lsd = 4;
  1914.             yyval.regs.flags = R_R6|R_R5|R_SDX|R_SDY|R_AB|R_LSD|R_SFRAC;} break;
  1915. case 205:
  1916. # line 1155 "a56.y"
  1917. {yyval.regs.r6 = yyval.regs.r5 = 0x0F;
  1918.             yyval.regs.sdx = yyval.regs.sdy = 0x3;
  1919.             yyval.regs.ab = 1;
  1920.             yyval.regs.lsd = 5;
  1921.             yyval.regs.flags = R_R6|R_R5|R_SDX|R_SDY|R_AB|R_LSD|R_SFRAC;} break;
  1922. case 206:
  1923. # line 1161 "a56.y"
  1924. {yyval.regs.r6 = yyval.regs.r5 = 0x10 | yypvt[-0].ival;
  1925.             yyval.regs.r4 = 0x00 | yypvt[-0].ival;
  1926.             yyval.regs.flags = R_R6|R_R5|R_R4|R_UINT;} break;
  1927. case 207:
  1928. # line 1165 "a56.y"
  1929. {yyval.regs.r6 = yyval.regs.r5 = 0x18 | yypvt[-0].ival;
  1930.             yyval.regs.r4 = 0x08 | yypvt[-0].ival;
  1931.             yyval.regs.flags = R_R6|R_R5|R_R4|R_UINT;} break;
  1932. case 208:
  1933. # line 1169 "a56.y"
  1934. {yyval.regs.r6 = 0x20 | yypvt[-0].ival;
  1935.             yyval.regs.r5 = -1;
  1936.             yyval.regs.ctl_reg = yypvt[-0].ival;
  1937.             yyval.regs.flags = R_R6|R_R5|R_CTL_REG|R_UINT;} break;
  1938. case 209:
  1939. # line 1174 "a56.y"
  1940. {yyval.regs.r6 = 0x38 | yypvt[-0].ival;
  1941.             yyval.regs.r5 = -1;
  1942.             yyval.regs.ctl_reg = 0x18 | yypvt[-0].ival;
  1943.             yyval.regs.flags = R_R6|R_R5|R_CTL_REG|R_UINT;} break;
  1944. case 210:
  1945. # line 1179 "a56.y"
  1946. {yyval.regs.lsd  = 0;
  1947.             yyval.regs.flags = R_LSD;} break;
  1948. case 211:
  1949. # line 1182 "a56.y"
  1950. {yyval.regs.lsd = 1;
  1951.             yyval.regs.flags = R_LSD;} break;
  1952. case 212:
  1953. # line 1185 "a56.y"
  1954. {yyval.regs.lsd = 2;
  1955.             yyval.regs.flags = R_LSD;} break;
  1956. case 213:
  1957. # line 1188 "a56.y"
  1958. {yyval.regs.lsd = 3;
  1959.             yyval.regs.flags = R_LSD;} break;
  1960. case 214:
  1961. # line 1191 "a56.y"
  1962. {yyval.regs.lsd = 6;
  1963.             yyval.regs.flags = R_LSD;} break;
  1964. case 215:
  1965. # line 1194 "a56.y"
  1966. {yyval.regs.lsd = 7;
  1967.             yyval.regs.flags = R_LSD;} break;
  1968. case 216:
  1969. # line 1200 "a56.y"
  1970. {yyval.ival = 1;} break;
  1971. case 217:
  1972. # line 1202 "a56.y"
  1973. {yyval.ival = 2;} break;
  1974. case 218:
  1975. # line 1204 "a56.y"
  1976. {yyval.ival = 3;} break;
  1977. case 219:
  1978. # line 1206 "a56.y"
  1979. {yyval.ival = 4;} break;
  1980. case 220:
  1981. # line 1208 "a56.y"
  1982. {yyval.ival = 5;} break;
  1983. case 221:
  1984. # line 1210 "a56.y"
  1985. {yyval.ival = 6;} break;
  1986. case 222:
  1987. # line 1212 "a56.y"
  1988. {yyval.ival = 7;} break;
  1989. case 223:
  1990. # line 1217 "a56.y"
  1991. {yyval.ival = 0;} break;
  1992. case 224:
  1993. # line 1219 "a56.y"
  1994. {yyval.ival = 1;} break;
  1995. case 225:
  1996. # line 1221 "a56.y"
  1997. {yyval.ival = 2;} break;
  1998. case 234:
  1999. # line 1238 "a56.y"
  2000. {int ival = n2int(yypvt[-2].n);
  2001.             int frac = n2frac(yypvt[-2].n);
  2002.             int value;
  2003.             BOOL shortform = FALSE;
  2004.             if(yypvt[-0].regs.flags & R_CTL_REG) {
  2005.                 yyerror("please use MOVEC for control register moves");
  2006.                 break;
  2007.             }
  2008.             if(yypvt[-0].regs.flags & R_SFRAC && yypvt[-2].n.type == FLT) {
  2009.                 if((frac & 0xFFFF) == 0 && 
  2010.                     NOT long_symbolic_expr) {
  2011.                     value = frac >> 16;
  2012.                     shortform++;
  2013.                 } else {
  2014.                     value = frac;
  2015.                 }
  2016.             } else {
  2017.                 if(ival <= 0xFF && NOT long_symbolic_expr) {
  2018.                     value = ival;
  2019.                     shortform++;
  2020.                 } else {
  2021.                     value = ival;
  2022.                 }
  2023.             }
  2024.  
  2025.             if(shortform) {
  2026.                 w0 |= 0x200000 | (value & 0xFF) << 8 |
  2027.                     yypvt[-0].regs.r5 << 16;
  2028.             } else {
  2029.                 w0 |= 0x400000 | 0x00F400 |
  2030.                     (yypvt[-0].regs.r5 >> 3 & 3) << 20 | 
  2031.                     (yypvt[-0].regs.r5 & 7) << 16;
  2032.                 uses_w1++; w1 = value;
  2033.             }} break;
  2034. case 235:
  2035. # line 1275 "a56.y"
  2036. {
  2037.                 if(yypvt[-0].regs.flags & R_CTL_REG) {
  2038.                     yyerror("please use MOVEC for control register moves");
  2039.                     break;
  2040.                 }
  2041.                 if(yypvt[-2].regs.flags & R_R5 & yypvt[-0].regs.flags) 
  2042.                     w0 |= 0x200000 | yypvt[-0].regs.r5 << 8 | yypvt[-2].regs.r5 << 13;
  2043.                 else
  2044.                     yyerror("illegal R move");
  2045.             } break;
  2046. case 236:
  2047. # line 1288 "a56.y"
  2048. {w0 |= 0x204000 | yypvt[-0].ival << 8;} break;
  2049. case 237:
  2050. # line 1293 "a56.y"
  2051. {w0 |= 0x40C000 | yypvt[-3].ival << 19;
  2052.             if(yypvt[-0].regs.flags & R_CTL_REG) {
  2053.                 yyerror("please use MOVEC for control register moves");
  2054.                 break;
  2055.             }
  2056.             w0 |= (yypvt[-0].regs.r5 >> 3 & 3) << 20 | (yypvt[-0].regs.r5 & 7) << 16;} break;
  2057. case 238:
  2058. # line 1300 "a56.y"
  2059. {w0 |= 0x408000 | yypvt[-3].ival << 19 | (yypvt[-2].ival & 0x3F) << 8;
  2060.             if(yypvt[-0].regs.flags & R_CTL_REG) {
  2061.                 yyerror("please use MOVEC for control register moves");
  2062.                 break;
  2063.             }
  2064.             if(yypvt[-2].ival > 0x003F && pass == 2)
  2065.                 yyerror("warning: address operand truncated");
  2066.             w0 |= (yypvt[-0].regs.r5>> 3 & 3) << 20 | (yypvt[-0].regs.r5 & 7) << 16;} break;
  2067. case 239:
  2068. # line 1309 "a56.y"
  2069. {w0 |= 0x404000 | yypvt[-1].ival << 19;
  2070.             if(yypvt[-3].regs.flags & R_CTL_REG) {
  2071.                 yyerror("please use MOVEC for control register moves");
  2072.                 break;
  2073.             }
  2074.             w0 |= (yypvt[-3].regs.r5 >> 3 & 3) << 20 | (yypvt[-3].regs.r5 & 7) << 16;} break;
  2075. case 240:
  2076. # line 1316 "a56.y"
  2077. {w0 |= 0x400000 | yypvt[-1].ival << 19 | (yypvt[-0].ival & 0x3F) << 8;
  2078.             if(yypvt[-3].regs.flags & R_CTL_REG) {
  2079.                 yyerror("please use MOVEC for control register moves");
  2080.                 break;
  2081.             }
  2082.             if(yypvt[-0].ival > 0x003F && pass == 2)
  2083.                 yyerror("warning: address operand truncated");
  2084.             w0 |= (yypvt[-3].regs.r5 >> 3 & 3) << 20 | (yypvt[-3].regs.r5 & 7) << 16;} break;
  2085. case 241:
  2086. # line 1325 "a56.y"
  2087. {w0 |= 0x400000 | 0x00F400 | (yypvt[-0].regs.r5 >> 3 & 3) << 20 |
  2088.                 (yypvt[-0].regs.r5 & 7) << 16;
  2089.             if(yypvt[-0].regs.flags & R_CTL_REG) {
  2090.                 yyerror("please use MOVEC for control register moves");
  2091.                 break;
  2092.             }
  2093.             uses_w1++; w1 = n2frac(yypvt[-2].n);
  2094.             } break;
  2095. case 242:
  2096. # line 1336 "a56.y"
  2097. {if(yypvt[-6].ival == 0 && yypvt[-2].regs.flags & R_AB) {
  2098.                 w0 |= 0x108000 | yypvt[-3].regs.sdx << 18 | yypvt[-2].regs.ab << 17 |
  2099.                     yypvt[-0].ival << 16;
  2100.             } else {
  2101.                 yyerror("illegal X:R move");
  2102.             }} break;
  2103. case 243:
  2104. # line 1343 "a56.y"
  2105. {if(yypvt[-2].regs.flags & R_AB) {
  2106.                 w0 |= 0x10B400 | yypvt[-3].regs.sdx << 18 | yypvt[-2].regs.ab << 17 |
  2107.                     yypvt[-0].ival << 16;
  2108.                 uses_w1++;
  2109.                 w1 |= n2frac(yypvt[-5].n) & 0xFFFFFF;
  2110.             } else {
  2111.                 yyerror("illegal X:R move");
  2112.             }} break;
  2113. case 244:
  2114. # line 1352 "a56.y"
  2115. {if(yypvt[-6].regs.flags & R_SDX && yypvt[-4].ival == 0 && yypvt[-2].regs.flags & R_AB &&
  2116.                 yypvt[-0].regs.flags & R_YREG) {
  2117.                 w0 |= 0x100000 | yypvt[-6].regs.sdx << 18 | yypvt[-2].regs.ab << 17 |
  2118.                     yypvt[-0].regs.yreg << 16;
  2119.             } else if(yypvt[-6].regs.flags & R_AB && yypvt[-4].ival == 0 && 
  2120.                 yypvt[-2].regs.flags & R_XREG && yypvt[-0].regs.flags & R_AB) {
  2121.                 if(yypvt[-2].regs.xreg != 0) yyerror("must use X0");
  2122.                 if(yypvt[-6].regs.ab == 0 && yypvt[-0].regs.ab == 0)
  2123.                     w0 |= 0x080000;
  2124.                 else if(yypvt[-6].regs.ab == 1 && yypvt[-0].regs.ab == 1)
  2125.                     w0 |= 0x090000;
  2126.                 else
  2127.                     yyerror("illegal X:R move");
  2128.             } else {
  2129.                 yyerror("illegal X:R move");
  2130.             }} break;
  2131. case 245:
  2132. # line 1371 "a56.y"
  2133. {if(yypvt[-4].regs.flags & R_XREG && yypvt[-0].regs.flags & (R_YREG|R_AB)) {
  2134.                 w0 |= 0x10C000 | yypvt[-6].regs.ab << 19 | yypvt[-4].regs.xreg << 18 |
  2135.                     yypvt[-0].regs.sdy << 16;
  2136.             } else {
  2137.                 yyerror("illegal R:Y move");
  2138.             }} break;
  2139. case 246:
  2140. # line 1378 "a56.y"
  2141. {if(yypvt[-3].regs.flags & R_XREG && yypvt[-0].regs.flags & (R_YREG|R_AB)) {
  2142.                 w0 |= 0x10F400 | yypvt[-5].regs.ab << 19 | yypvt[-3].regs.xreg << 18 |
  2143.                     yypvt[-0].regs.sdy << 16;
  2144.                 uses_w1++;
  2145.                 w1 |= n2frac(yypvt[-2].n) & 0xFFFFFF;
  2146.             } else {
  2147.                 yyerror("illegal R:Y move");
  2148.             }} break;
  2149. case 247:
  2150. # line 1387 "a56.y"
  2151. {if(yypvt[-6].regs.flags & R_AB && yypvt[-4].regs.flags & R_XREG) {
  2152.                 w0 |= 0x104000 | yypvt[-6].regs.ab << 19 | yypvt[-4].regs.xreg << 18 |
  2153.                 yypvt[-3].regs.sdy << 16;
  2154.             } else if (yypvt[-6].regs.flags & R_YREG && yypvt[-4].regs.flags & R_AB &&
  2155.                 yypvt[-3].regs.flags & R_AB) {
  2156.                 if(yypvt[-6].regs.yreg != 0) yyerror("must use Y0");
  2157.                 if(yypvt[-4].regs.ab == 0 && yypvt[-3].regs.ab == 0)
  2158.                     w0 |= 0x088000;
  2159.                 else if(yypvt[-4].regs.ab == 1 && yypvt[-3].regs.ab == 1)
  2160.                     w0 |= 0x098000;
  2161.                 else
  2162.                     yyerror("illegal R:Y move");
  2163.             } else {
  2164.                 yyerror("illegal R:Y move");
  2165.             }} break;
  2166. case 248:
  2167. # line 1405 "a56.y"
  2168. {if(yypvt[-0].regs.flags & R_CTL_REG) {
  2169.                 yyerror("please use MOVEC for control register moves");
  2170.                 break;
  2171.             }
  2172.             w0 |= 0x40C000 | (yypvt[-0].regs.lsd & 3) << 16 | (yypvt[-0].regs.lsd >> 2) << 19;} break;
  2173. case 249:
  2174. # line 1411 "a56.y"
  2175. {if(yypvt[-3].regs.flags & R_CTL_REG) {
  2176.                 yyerror("please use MOVEC for control register moves");
  2177.                 break;
  2178.             }
  2179.             w0 |= 0x404000 | (yypvt[-3].regs.lsd & 3) << 16 | (yypvt[-3].regs.lsd >> 2) << 19;} break;
  2180. case 250:
  2181. # line 1417 "a56.y"
  2182. {w0 |= 0x408000 | (yypvt[-0].regs.lsd & 3) << 16 | (yypvt[-0].regs.lsd >> 2) << 19;
  2183.             if(yypvt[-0].regs.flags & R_CTL_REG) {
  2184.                 yyerror("please use MOVEC for control register moves");
  2185.                 break;
  2186.             }
  2187.             if(yypvt[-2].ival > 0x003F && pass == 2)
  2188.                 yyerror("warning: address operand truncated");
  2189.             w0 |= (yypvt[-2].ival & 0x3F) << 8;} break;
  2190. case 251:
  2191. # line 1426 "a56.y"
  2192. {w0 |= 0x400000 | (yypvt[-3].regs.lsd & 3) << 16 | (yypvt[-3].regs.lsd >> 2) << 19;
  2193.             if(yypvt[-3].regs.flags & R_CTL_REG) {
  2194.                 yyerror("please use MOVEC for control register moves");
  2195.                 break;
  2196.             }
  2197.             if(yypvt[-0].ival > 0x003F && pass == 2)
  2198.                 yyerror("warning: address operand truncated");
  2199.             w0 |= (yypvt[-0].ival & 0x3F) << 8;} break;
  2200. case 252:
  2201. # line 1437 "a56.y"
  2202. {int eax = yypvt[-6].ival, eay = yypvt[-2].ival,
  2203.                  regx = (yypvt[-4].regs.flags & R_AB) ? yypvt[-4].regs.ab | 2 : yypvt[-4].regs.xreg,
  2204.                  regy = (yypvt[-0].regs.flags & R_AB) ? yypvt[-0].regs.ab | 2 : yypvt[-0].regs.yreg;
  2205.             if((eax & 0x400) == (eay & 0x400))
  2206.                 yyerror("registers must be in opposite halves");
  2207.             if(!(yypvt[-4].regs.flags & (R_AB | R_XREG)))
  2208.                 yyerror("invalid X move register");
  2209.             if(!(yypvt[-0].regs.flags & (R_AB | R_YREG)))
  2210.                 yyerror("invalid Y move register");
  2211.             if(yypvt[-4].regs.flags & R_AB &&
  2212.                yypvt[-0].regs.flags & R_AB &&
  2213.                yypvt[-4].regs.ab == yypvt[-0].regs.ab)
  2214.                 yyerror("duplicate destination register");
  2215.             w0 = w0 & 0xFF | 0xC08000;    /* both write */
  2216.             w0 |= eax & 0x1f00 | (eay & 0x300) << 5 | (eay & 0x1800) << 9 | regx << 18 | regy << 16;} break;
  2217. case 253:
  2218. # line 1453 "a56.y"
  2219. {int eax = yypvt[-6].ival, eay = yypvt[-0].ival,
  2220.                  regx = (yypvt[-4].regs.flags & R_AB) ? yypvt[-4].regs.ab | 2 : yypvt[-4].regs.xreg,
  2221.                  regy = (yypvt[-3].regs.flags & R_AB) ? yypvt[-3].regs.ab | 2 : yypvt[-3].regs.yreg;
  2222.             if((eax & 0x400) == (eay & 0x400))
  2223.                 yyerror("registers must be in opposite halves");
  2224.             if(!(yypvt[-4].regs.flags & (R_AB | R_XREG)))
  2225.                 yyerror("invalid X move register");
  2226.             if(!(yypvt[-3].regs.flags & (R_AB | R_YREG)))
  2227.                 yyerror("invalid Y move register");
  2228.             w0 = w0 & 0xFF | 0x808000;    /* X:write, Y:read */
  2229.             w0 |= eax & 0x1f00 | (eay & 0x300) << 5 | (eay & 0x1800) << 9 | regx << 18 | regy << 16;} break;
  2230. case 254:
  2231. # line 1465 "a56.y"
  2232. {int eax = yypvt[-4].ival, eay = yypvt[-2].ival,
  2233.                  regx = (yypvt[-7].regs.flags & R_AB) ? yypvt[-7].regs.ab | 2 : yypvt[-7].regs.xreg,
  2234.                  regy = (yypvt[-0].regs.flags & R_AB) ? yypvt[-0].regs.ab | 2 : yypvt[-0].regs.yreg;
  2235.             if((eax & 0x400) == (eay & 0x400))
  2236.                 yyerror("registers must be in opposite halves");
  2237.             if(!(yypvt[-7].regs.flags & (R_AB | R_XREG)))
  2238.                 yyerror("invalid X move register");
  2239.             if(!(yypvt[-0].regs.flags & (R_AB | R_YREG)))
  2240.                 yyerror("invalid Y move register");
  2241.                   w0 = w0 & 0xFF | 0xC00000;    /* X:read, Y:write */
  2242.             w0 |= eax & 0x1f00 | (eay & 0x300) << 5 | (eay & 0x1800) << 9 | regx << 18 | regy << 16;} break;
  2243. case 255:
  2244. # line 1477 "a56.y"
  2245. {int eax = yypvt[-4].ival, eay = yypvt[-0].ival,
  2246.                  regx = (yypvt[-7].regs.flags & R_AB) ? yypvt[-7].regs.ab | 2 : yypvt[-7].regs.xreg,
  2247.                  regy = (yypvt[-3].regs.flags & R_AB) ? yypvt[-3].regs.ab | 2 : yypvt[-3].regs.yreg;
  2248.             if((eax & 0x400) == (eay & 0x400))
  2249.                 yyerror("registers must be in opposite halves");
  2250.             if(!(yypvt[-7].regs.flags & (R_AB | R_XREG)))
  2251.                 yyerror("invalid X move register");
  2252.             if(!(yypvt[-3].regs.flags & (R_AB | R_YREG)))
  2253.                 yyerror("invalid Y move register");
  2254.                   w0 = w0 & 0xFF | 0x800000;    /* both read */
  2255.             w0 |= eax & 0x1f00 | (eay & 0x300) << 5 | (eay & 0x1800) << 9 | regx << 18 | regy << 16;} break;
  2256. case 256:
  2257. # line 1493 "a56.y"
  2258. {yyval.n = yypvt[-0].n;} break;
  2259. case 257:
  2260. # line 1495 "a56.y"
  2261. {yyval.n = yypvt[-0].n;} break;
  2262. case 258:
  2263. # line 1497 "a56.y"
  2264. {yyval.n = yypvt[-0].n;} break;
  2265. case 259:
  2266. # line 1501 "a56.y"
  2267. {yyval.n = yypvt[-0].n;} break;
  2268. case 260:
  2269. # line 1503 "a56.y"
  2270. {yyval.n.val.i = n2int(yypvt[-0].n) & 0xFF;
  2271.             yyval.n.type = INT;
  2272.             long_symbolic_expr = FALSE;} break;
  2273. case 261:
  2274. # line 1509 "a56.y"
  2275. {yyval.n = yypvt[-0].n;} break;
  2276. case 262:
  2277. # line 1514 "a56.y"
  2278. {yyval.ival = n2int(yypvt[-0].n);} break;
  2279. case 263:
  2280. # line 1516 "a56.y"
  2281. {yyval.ival = pc;} break;
  2282. case 264:
  2283. # line 1521 "a56.y"
  2284. {yyval.ival = n2int(yypvt[-0].n);} break;
  2285. case 265:
  2286. # line 1523 "a56.y"
  2287. {yyval.ival = pc;} break;
  2288. case 266:
  2289. # line 1528 "a56.y"
  2290. {yyval.ival = n2int(yypvt[-0].n);} break;
  2291. case 267:
  2292. # line 1533 "a56.y"
  2293. {yyval.n = yypvt[-0].n;} break;
  2294. case 268:
  2295. # line 1535 "a56.y"
  2296. {yyval.n = sym_ref(yypvt[-0].sval); free(yypvt[-0].sval);} break;
  2297. case 269:
  2298. # line 1540 "a56.y"
  2299. {yyval.n = yypvt[-0].n;} break;
  2300. case 270:
  2301. # line 1542 "a56.y"
  2302. {yyval.n = sym_ref(yypvt[-0].sval); free(yypvt[-0].sval); long_symbolic_expr++;} break;
  2303. case 271:
  2304. # line 1544 "a56.y"
  2305. {yyval.n.type = INT; yyval.n.val.i = yypvt[-0].cval & 0xFFFFFF;} break;
  2306. case 272:
  2307. # line 1548 "a56.y"
  2308. {yyval.n = binary_op(yypvt[-2].n, '|', yypvt[-0].n);} break;
  2309. case 273:
  2310. # line 1550 "a56.y"
  2311. {yyval.n = binary_op(yypvt[-2].n, '^', yypvt[-0].n);} break;
  2312. case 274:
  2313. # line 1552 "a56.y"
  2314. {yyval.n = binary_op(yypvt[-2].n, '&', yypvt[-0].n);} break;
  2315. case 275:
  2316. # line 1554 "a56.y"
  2317. {yyval.n = binary_op(yypvt[-2].n, SHR, yypvt[-0].n);} break;
  2318. case 276:
  2319. # line 1556 "a56.y"
  2320. {yyval.n = binary_op(yypvt[-2].n, SHL, yypvt[-0].n);} break;
  2321. case 277:
  2322. # line 1558 "a56.y"
  2323. {yyval.n = binary_op(yypvt[-2].n, '-', yypvt[-0].n);} break;
  2324. case 278:
  2325. # line 1560 "a56.y"
  2326. {yyval.n = binary_op(yypvt[-2].n, '+', yypvt[-0].n);} break;
  2327. case 279:
  2328. # line 1562 "a56.y"
  2329. {yyval.n = binary_op(yypvt[-2].n, '%', yypvt[-0].n);} break;
  2330. case 280:
  2331. # line 1564 "a56.y"
  2332. {yyval.n = binary_op(yypvt[-2].n, '/', yypvt[-0].n);} break;
  2333. case 281:
  2334. # line 1566 "a56.y"
  2335. {yyval.n = binary_op(yypvt[-2].n, '*', yypvt[-0].n);} break;
  2336. case 282:
  2337. # line 1568 "a56.y"
  2338. {yyval.n = unary_op('-', yypvt[-0].n);} break;
  2339. case 283:
  2340. # line 1570 "a56.y"
  2341. {yyval.n = unary_op('~', yypvt[-0].n);} break;
  2342. case 284:
  2343. # line 1572 "a56.y"
  2344. {yyval.n = yypvt[-1].n;} break;
  2345. case 285:
  2346. # line 1574 "a56.y"
  2347. {yyval.n = yypvt[-0].n;} break;
  2348.         }
  2349.         goto yystack;  /* stack new state and value */
  2350.  
  2351.     }
  2352.