home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 1 / crawlyvol1.bin / program / compiler / as32 / as31.c next >
C/C++ Source or Header  |  1991-03-22  |  60KB  |  2,157 lines

  1.  
  2. # line 22 "as31.y"
  3.  
  4. #include <setjmp.h>
  5. #include <stdio.h>
  6. #define NOPE
  7. #include "as31.h"
  8. #undef NOPE
  9.  
  10. #define YYSTYPE union ystack
  11.  
  12. extern int lineno;
  13. extern int dashl;
  14. extern char *asmfile;
  15. extern jmp_buf main_env;
  16. extern FILE *listing;
  17.  
  18. int pass,fatal;
  19. unsigned long lc;
  20.  
  21. static unsigned char bytebuf[1024];        /* used by dumplist() */
  22. static int bytecount;
  23.  
  24. /* ------------------------ G R A M M E R ----------------------------- */
  25.  
  26. # define STRING 257
  27. # define D_ORG 258
  28. # define D_BYTE 259
  29. # define D_WORD 260
  30. # define D_SKIP 261
  31. # define D_EQU 262
  32. # define D_FLAG 263
  33. # define D_END 264
  34. # define ACALL 265
  35. # define ADD 266
  36. # define ADDC 267
  37. # define AJMP 268
  38. # define ANL 269
  39. # define CJNE 270
  40. # define CLR 271
  41. # define CPL 272
  42. # define DA 273
  43. # define DEC 274
  44. # define DIV 275
  45. # define DJNZ 276
  46. # define INC 277
  47. # define JB 278
  48. # define JBC 279
  49. # define JC 280
  50. # define JMP 281
  51. # define JNB 282
  52. # define JNC 283
  53. # define JNZ 284
  54. # define JZ 285
  55. # define LCALL 286
  56. # define LJMP 287
  57. # define MOV 288
  58. # define MOVC 289
  59. # define MOVX 290
  60. # define NOP 291
  61. # define MUL 292
  62. # define ORL 293
  63. # define POP 294
  64. # define PUSH 295
  65. # define RET 296
  66. # define RETI 297
  67. # define RL 298
  68. # define RLC 299
  69. # define RR 300
  70. # define RRC 301
  71. # define SETB 302
  72. # define SJMP 303
  73. # define SUBB 304
  74. # define SWAP 305
  75. # define XCH 306
  76. # define XCHD 307
  77. # define XRL 308
  78. # define AB 309
  79. # define A 310
  80. # define C 311
  81. # define PC 312
  82. # define DPTR 313
  83. # define BITPOS 314
  84. # define R0 315
  85. # define R1 316
  86. # define R2 317
  87. # define R3 318
  88. # define R4 319
  89. # define R5 320
  90. # define R6 321
  91. # define R7 322
  92. # define VALUE 323
  93. # define SYMBOL 324
  94. #define yyclearin yychar = -1
  95. #define yyerrok yyerrflag = 0
  96. extern int yychar;
  97. extern int yyerrflag;
  98. #ifndef YYMAXDEPTH
  99. #define YYMAXDEPTH 150
  100. #endif
  101. #ifndef YYSTYPE
  102. #define YYSTYPE int
  103. #endif
  104. YYSTYPE yylval, yyval;
  105. typedef int yytabelem;
  106. # define YYERRCODE 256
  107.  
  108. # line 949 "as31.y"
  109.  
  110.  
  111. /* ---------------------------------------------------------------------- */
  112.  
  113. yyerror(s)
  114. char *s;
  115. {
  116.     error(s);
  117. }
  118.  
  119.  
  120. /* ----------------------------------------------------------------------
  121.  * error:
  122.  *    Uses semi-variable arguments. This causes immediate assembler
  123.  *    termination.
  124.  */
  125.  
  126. error(cs,a1,a2,a3,a4,a5,a6)
  127. char *cs,*a1,*a2,*a3,*a4,*a5,*a6;
  128. {
  129.     fprintf(stderr,"File: %s, line: %d, ",asmfile,lineno);
  130.     fprintf(stderr,cs,a1,a2,a3,a4,a5,a6);
  131.     fprintf(stderr,".\n");
  132.     longjmp(main_env,1);
  133. }
  134.  
  135. /* ----------------------------------------------------------------------
  136.  * warning:
  137.  *    Produce error message. This will abort assembly at
  138.  *    the end of the current pass.
  139.  *
  140.  */
  141.  
  142. warning(cs,a1,a2,a3,a4,a5,a6)
  143. char *cs,*a1,*a2,*a3,*a4,*a5,*a6;
  144. {
  145.     fatal++;
  146.     fprintf(stderr,"File: %s, line: %d, ",asmfile,lineno);
  147.     fprintf(stderr,cs,a1,a2,a3,a4,a5,a6);
  148.     fprintf(stderr,".\n");
  149. }
  150.  
  151.  
  152. /* ----------------------------------------------------------------------
  153.  * makeop:
  154.  *    This function makes an opcode based on the instruction symbol table
  155.  *    entry, and an addressing mode structure.
  156.  *    This function is called from both passes, but
  157.  *    only generates code in pass 2.
  158.  *
  159.  *    Resultant opcode bytes are passed to genbyte().
  160.  *
  161.  *    Returns the nuumber of bytes that the instruction
  162.  *    occupies.
  163.  *
  164.  */
  165.  
  166. makeop(op,m,add)
  167. struct opcode *op;
  168. struct mode *m;
  169. {
  170.     register unsigned int newop;
  171.  
  172.     if( m == NULL ) {
  173.         if(pass2) genbyte(op->bytes[0+add]);
  174.         return(1);
  175.     }
  176.  
  177.     if( pass2 ) {
  178.         newop = op->bytes[ get_md(*m)+add ] | get_ov(*m);
  179.         genbyte(newop);
  180.         if( get_sz(*m) > 0 ) genbyte( get_b1(*m) );
  181.         if( get_sz(*m) > 1 ) genbyte( get_b2(*m) );
  182.     }
  183.     return( get_sz(*m)+1 );
  184. }
  185.  
  186.  
  187. /* ----------------------------------------------------------------------
  188.  * inclc:
  189.  *    Increments the Location Counter by 'i' amount.
  190.  *    Check to see if 'i' overflows 64K.
  191.  *    Checks to see if assembler is overlapping previous sections
  192.  *    of code. (using a large bit field).
  193.  *
  194.  */
  195.  
  196. #define indx(a) ( (a)/(sizeof(long)*8) )
  197. #define bit(a)    ( 1 << ((a)%(sizeof(long)*8)) )
  198.  
  199. #define getloc(a) (regions[indx(a)] & bit(a))
  200. #define setloc(a) (regions[indx(a)] |= bit(a))
  201.  
  202. inclc(i)
  203. {
  204.     static unsigned long regions[ 0x10000/(sizeof(long)*8) ];
  205.  
  206.     while(i-- > 0) {
  207.         if( pass2 && getloc(lc) )
  208.             error("Location counter overlaps");
  209.         if( pass2 ) setloc(lc);
  210.         lc += 1;
  211.     }
  212.         
  213.     if( lc > 0xffff )
  214.         error("Location counter has exceeded 16-bits");
  215. }
  216.  
  217. /* ----------------------------------------------------------------------
  218.  * padline:
  219.  *    This routine returns a new string, which is equivilant to
  220.  *    'line' except that all tabs have been expanded to spaces, and
  221.  *    the total length has been truncated to 60 chars.
  222.  */
  223.  
  224. char *padline(line)
  225. char *line;
  226. {
  227.     static char newline[61];
  228.     char *p1;
  229.     int pos=0,nxtpos;
  230.  
  231.     for(p1=line; pos<sizeof(newline)-1 && *p1; p1++ ) {
  232.         if( *p1 == '\t' ) {
  233.             nxtpos = pos+8-pos%8;
  234.             while(pos<sizeof(newline)-1 && pos <= nxtpos)
  235.                 newline[pos++] = ' ';
  236.         } else if( *p1 != '\n' )
  237.             newline[pos++]= *p1;
  238.     }
  239.     newline[pos] = '\0';
  240.     return(newline);
  241. }
  242.  
  243.  
  244. /* ----------------------------------------------------------------------
  245.  * dumplist:
  246.  *    Outputs the current location counter, bytebuf[] array, and
  247.  *    the string 'txt' to the listing file.
  248.  *    This routine is called for every source line encountered in the
  249.  *    source file. (Only in pass 2, and if listing is turned on).
  250.  *
  251.  */
  252.  
  253. dumplist(txt,show)
  254. char *txt;
  255. {
  256.     int i,j;
  257.  
  258.     fprintf(listing,show?"%04X: ":"      ",lc);
  259.  
  260.     j=0;
  261.     for(i=0; i<bytecount; i++ ) {
  262.         fprintf(listing,"%02X ",bytebuf[i]);
  263.         if( ++j >= 4 ) {
  264.             j = 0;
  265.             fprintf(listing,"\n      ");
  266.         }
  267.     }
  268.     while(++j <= 4)
  269.         fprintf(listing,"   ");
  270.  
  271.     fprintf(listing," %s\n",padline(txt));
  272. }
  273.  
  274. /* ----------------------------------------------------------------------
  275.  * gen* routines:
  276.  *    Place information into the bytebuf[] array, and also
  277.  *    call emitbyte with the byte.
  278.  *
  279.  */
  280.  
  281. genbyte(b)
  282. int b;
  283. {
  284.     if( bytecount < sizeof(bytebuf) )
  285.         bytebuf[bytecount++] = b;
  286.     emitbyte(b);
  287. }
  288.  
  289. genstr(s)
  290. char *s;
  291. {
  292.     while( *s )
  293.         genbyte(*s++);
  294. }
  295.  
  296. genword(w)
  297. unsigned long w;
  298. {
  299.     genbyte( (w & 0xff00) >> 8 );
  300.     genbyte( (w & 0x00ff) );
  301. }
  302.  
  303. yytabelem yyexca[] ={
  304. -1, 1,
  305.     0, -1,
  306.     -2, 0,
  307.     };
  308. # define YYNPROD 161
  309. # define YYLAST 742
  310. yytabelem yyact[]={
  311.  
  312.      9,   286,   168,   182,   183,   184,   185,   186,   187,   188,
  313.    189,   208,   229,   182,   183,   184,   185,   186,   187,   188,
  314.    189,     6,   121,   120,   226,   289,   228,   263,   262,    69,
  315.    282,    68,   284,   283,    70,   192,    10,   182,   183,   184,
  316.    185,   186,   187,   188,   189,   116,   117,   190,   302,   301,
  317.    191,   269,   276,   243,   304,   156,   303,   288,   121,   120,
  318.      9,   287,   270,   154,    75,   113,   112,   111,   110,   109,
  319.    105,   108,   106,    59,    60,    61,    62,    63,    64,    65,
  320.    170,   253,   252,   173,   170,   107,   226,     4,   171,    69,
  321.     56,    68,   158,   172,    70,     5,    10,   139,   300,   292,
  322.    291,   271,   255,    79,    69,   199,    68,   254,   297,    70,
  323.    224,   249,   245,   151,   280,    69,   235,    68,   212,    69,
  324.     70,    68,    83,    87,    70,   211,   210,   209,    95,   206,
  325.     69,   205,    68,   204,   296,    70,   203,   201,   198,   223,
  326.     69,   197,    68,   196,   295,    70,   194,   141,   142,   193,
  327.    129,   167,   157,   248,    95,   166,   147,   233,    69,   231,
  328.     68,   180,    69,    70,    68,   179,   169,    70,   178,    69,
  329.    169,    68,    74,    69,    70,    68,   126,   230,    70,   138,
  330.     69,   274,    68,   250,   234,    70,    90,    66,    76,    77,
  331.     78,    82,    86,    89,   131,   132,   133,   134,    58,    84,
  332.    115,    73,    57,     3,   119,   238,    55,   114,   148,   104,
  333.     69,   143,    68,   135,   261,    70,   260,   163,   128,    88,
  334.    160,    69,     8,    68,     7,   146,    70,     2,     1,     0,
  335.    236,     0,     0,     0,     0,     0,   164,   122,   123,     0,
  336.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  337.      0,     0,     0,     0,     0,    12,    14,    15,    13,    18,
  338.     47,    35,    36,    23,    22,    24,    51,    21,    48,    50,
  339.     42,    25,    49,    43,    44,    45,    41,    40,    52,    53,
  340.     54,    11,    26,    19,    39,    38,    27,    28,    29,    30,
  341.     31,    32,    37,    46,    16,    33,    20,    34,    17,   225,
  342.    244,   155,   121,   120,    96,    97,    98,    99,   100,   101,
  343.    102,   103,    72,    71,     6,    12,    14,    15,    13,    18,
  344.     47,    35,    36,    23,    22,    24,    51,    21,    48,    50,
  345.     42,    25,    49,    43,    44,    45,    41,    40,    52,    53,
  346.     54,    11,    26,    19,    39,    38,    27,    28,    29,    30,
  347.     31,    32,    37,    46,    16,    33,    20,    34,    17,    75,
  348.    153,   225,   152,     0,    96,    97,    98,    99,   100,   101,
  349.    102,   103,    72,    71,    92,   200,     0,    91,     0,    96,
  350.     97,    98,    99,   100,   101,   102,   103,    72,    71,   278,
  351.     96,    97,    98,    99,   100,   101,   102,   103,    72,    71,
  352.     92,     0,    72,    71,   181,    96,    97,    98,    99,   100,
  353.    101,   102,   103,    72,    71,    96,    97,    98,    99,   100,
  354.    101,   102,   103,    72,    71,   136,    81,   257,   246,   240,
  355.     96,    97,    98,    99,   100,   101,   102,   103,   162,    67,
  356.     67,    72,    71,    75,    85,    72,    71,   258,     0,     0,
  357.     75,     0,    72,    71,     0,     0,    72,    71,     0,   118,
  358.     80,     0,     0,    72,    71,     0,    93,   127,   127,   130,
  359.    130,   130,   130,   130,     0,     0,     0,     0,     0,     0,
  360.      0,     0,    94,    94,     0,     0,   159,   281,   165,   159,
  361.      0,     0,     0,    72,    71,     0,   176,   177,     0,   124,
  362.    125,     0,   290,     0,    72,    71,     0,     0,   140,   140,
  363.    140,     0,   145,   149,   137,     0,     0,     0,   144,   150,
  364.      0,   161,   298,   299,   173,   170,     0,     0,   220,   171,
  365.    175,   305,   174,     0,   172,     0,     0,     0,     0,   173,
  366.    170,     0,     0,   195,   171,   175,     0,   174,     0,   172,
  367.      0,     0,     0,     0,     0,     0,   202,     0,     0,     0,
  368.      0,   207,     0,     0,     0,     0,     0,     0,     0,     0,
  369.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  370.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  371.      0,     0,     0,     0,     0,     0,   213,   214,   215,   216,
  372.    217,   218,   219,     0,     0,     0,     0,     0,     0,     0,
  373.      0,   169,     0,     0,     0,     0,     0,     0,     0,     0,
  374.      0,     0,     0,   237,   239,   237,   169,     0,   264,     0,
  375.      0,     0,     0,     0,     0,     0,     0,   165,   259,   222,
  376.    227,     0,     0,     0,     0,   221,     0,     0,   275,     0,
  377.      0,     0,     0,     0,   232,     0,     0,     0,   285,     0,
  378.    242,     0,   247,     0,   251,     0,   241,     0,     0,     0,
  379.    256,     0,     0,     0,     0,     0,     0,   165,     0,     0,
  380.      0,     0,     0,     0,     0,   265,     0,   266,   267,   268,
  381.      0,     0,     0,     0,   272,   273,     0,     0,   237,     0,
  382.      0,     0,     0,     0,     0,     0,     0,     0,     0,   277,
  383.    279,     0,     0,     0,     0,     0,     0,     0,   237,   237,
  384.      0,     0,     0,     0,     0,     0,     0,   237,     0,     0,
  385.      0,     0,     0,     0,     0,   293,     0,     0,     0,     0,
  386.      0,   294 };
  387. yytabelem yypact[]={
  388.  
  389.    -10, -3000,   -10, -3000,    32, -3000, -3000,   192,   188, -3000,
  390.   -185, -3000,   129,   129,  -246,  -246,  -246,   140,   133,   133,
  391.   -246,    64,    90,  -240,  -237,    21,  -238, -3000, -3000,  -241,
  392.   -242,  -243,  -244,  -245,  -246,  -265,  -265,  -265,   129,   129,
  393.    129,   129,   129,   129,   129,   129,   129,   115,  -301,  -301,
  394.   -301,   100,    49,  -247,    -9, -3000,    50, -3000, -3000,   129,
  395.    181,   129,   129,  -303,  -322, -3000, -3000,   502, -3000,   129,
  396.    129, -3000, -3000, -3000, -3000,   124, -3000, -3000, -3000, -3000,
  397.    121,   502, -3000, -3000, -3000,   117, -3000, -3000, -3000, -3000,
  398.  -3000, -3000, -3000, -3000, -3000,  -278, -3000, -3000, -3000, -3000,
  399.  -3000, -3000, -3000, -3000, -3000, -3000, -3000,  -263, -3000, -3000,
  400.  -3000, -3000, -3000, -3000, -3000, -3000, -3000, -3000, -3000,  -279,
  401.  -3000, -3000, -3000, -3000, -3000, -3000, -3000,   502, -3000, -3000,
  402.    502, -3000, -3000, -3000, -3000, -3000,   105,   102,  -278, -3000,
  403.     99, -3000, -3000, -3000,    97,    94, -3000, -3000, -3000,    61,
  404.     93,  -278,    92,    89,    87,    85,  -302, -3000, -3000,   502,
  405.     83, -3000, -3000,    82, -3000,   502, -3000,    81,    74,   129,
  406.    129,   129,   129,   129,   129,   129,   487,    42,    75,    51,
  407.    -21, -3000, -3000, -3000, -3000, -3000, -3000, -3000, -3000, -3000,
  408.    134,   116, -3000,   122,   149,    72,   129,   129,   129,   -11,
  409.     68,   118,    67,   148,  -301,    18,    17,    63,    58,   170,
  410.    129,   129,  -296, -3000, -3000,    42,    42,    42,    46,    46,
  411.  -3000, -3000, -3000,  -278,   129, -3000,   129, -3000,  -301,  -301,
  412.   -262,  -248,    57,   129,   129,   146, -3000,   502, -3000,   502,
  413.  -3000, -3000, -3000,  -278, -3000,  -259, -3000, -3000,   129,    79,
  414.    129, -3000,  -280,  -312,  -249,  -253, -3000, -3000, -3000,   502,
  415.  -3000,  -289, -3000, -3000, -3000, -3000, -3000, -3000, -3000, -3000,
  416.  -3000,   129,    56,    55,   129, -3000, -3000, -3000, -3000, -3000,
  417.    129, -3000,   101,    91,    65, -3000, -3000, -3000, -3000, -3000,
  418.  -3000,   129,   129,    54, -3000,  -264,  -254,  -256, -3000, -3000,
  419.    129, -3000, -3000, -3000, -3000, -3000 };
  420. yytabelem yypgo[]={
  421.  
  422.      0,   228,   227,   203,    87,    95,   224,   222,    92,   220,
  423.    217,   426,   216,   214,   460,   236,   187,   172,   103,   199,
  424.    186,   200,   176,   150,   213,    97,   211,   208,   404,   466,
  425.    459,   230,   205,   204 };
  426. yytabelem yyr1[]={
  427.  
  428.      0,     1,     2,     2,     3,     3,     5,     5,     5,     6,
  429.      6,     6,     6,     6,     6,     6,     8,    12,    13,    13,
  430.      4,     9,     9,     9,     9,    10,    10,    11,    11,    11,
  431.     11,    11,    11,    11,    11,    11,    11,    11,    11,     7,
  432.      7,     7,     7,     7,     7,     7,     7,     7,     7,     7,
  433.      7,     7,     7,     7,     7,     7,     7,     7,     7,     7,
  434.      7,     7,     7,     7,     7,     7,     7,     7,     7,     7,
  435.      7,     7,     7,     7,     7,     7,     7,     7,     7,     7,
  436.      7,     7,     7,     7,     7,     7,     7,     7,     7,     7,
  437.      7,     7,     7,     7,     7,     7,     7,     7,    17,    17,
  438.     17,    17,    18,    18,    19,    19,    19,    25,    26,    26,
  439.     27,    27,    27,    27,    27,    27,    27,    27,    27,    27,
  440.     27,    27,    27,    20,    20,    20,    20,    21,    21,    21,
  441.     24,    24,    24,    24,    31,    32,    30,    30,    33,    33,
  442.     29,    29,    29,    29,    29,    29,    29,    29,    28,    28,
  443.     28,    28,    28,    28,    28,    28,    14,    15,    16,    22,
  444.     23 };
  445. yytabelem yyr2[]={
  446.  
  447.      0,     3,     4,     2,     7,     3,     5,     5,     3,     7,
  448.      7,     7,     7,    11,    11,     5,     3,     5,     3,     3,
  449.      3,     7,     7,     3,     3,     7,     3,     3,     7,     5,
  450.      7,     7,     7,     7,     7,     7,     7,     3,     3,     3,
  451.      5,     5,     5,     5,     5,     5,     5,     5,     5,     5,
  452.      5,     5,     5,     5,     5,     5,     5,     5,     5,    11,
  453.     11,     5,     3,     3,     5,     5,     5,     5,     5,     5,
  454.      5,     5,     5,     5,     5,     5,     5,     5,     5,     5,
  455.      5,     5,     5,     5,     5,     5,     5,     5,     5,     5,
  456.     15,    15,    15,    15,    11,    11,    11,    11,     7,     7,
  457.      9,     9,     7,     9,     7,     9,     9,     7,     7,     7,
  458.      7,     7,     9,     7,     7,     9,     9,     9,    11,     9,
  459.      7,     7,     9,     3,     3,     3,     5,     3,     3,     3,
  460.     11,    13,    13,    15,     3,     3,     5,     3,     3,     3,
  461.      3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
  462.      3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
  463.      3 };
  464. yytabelem yychk[]={
  465.  
  466.  -3000,    -1,    -2,    -3,    -4,    -5,   324,    -6,    -7,    10,
  467.     46,   291,   265,   268,   266,   267,   304,   308,   269,   293,
  468.    306,   277,   274,   273,   275,   281,   292,   296,   297,   298,
  469.    299,   300,   301,   305,   307,   271,   272,   302,   295,   294,
  470.    287,   286,   280,   283,   284,   285,   303,   270,   278,   282,
  471.    279,   276,   288,   289,   290,    -3,    58,    10,    10,   258,
  472.    259,   260,   261,   262,   263,   264,   -16,   -11,    42,    40,
  473.     45,   324,   323,   -16,   -17,   310,   -17,   -17,   -17,   -18,
  474.    -14,   -11,   -17,   -18,   -19,   311,   -17,   -18,   -19,   -17,
  475.    -20,   313,   310,   -29,   -14,    64,   315,   316,   317,   318,
  476.    319,   320,   321,   322,   -20,   310,   309,    64,   309,   310,
  477.    310,   310,   310,   310,   -17,   -21,   310,   311,   -30,   -33,
  478.    324,   323,   -21,   -21,   -14,   -14,   -22,   -11,   -22,   -23,
  479.    -11,   -23,   -23,   -23,   -23,   -24,   310,   -29,    64,   -25,
  480.    -30,   -25,   -25,   -26,   -29,   -14,   -17,   -18,   -27,   -14,
  481.    -29,    64,   313,   311,   310,   310,    64,    -5,    -8,   -11,
  482.     -9,   -14,   257,   -10,   -15,   -11,    -8,    -4,   324,   124,
  483.     38,    42,    47,    37,    45,    43,   -11,   -11,    44,    44,
  484.     44,   -28,   315,   316,   317,   318,   319,   320,   321,   322,
  485.    310,   313,   314,    44,    44,   -28,    44,    44,    44,    44,
  486.    314,    44,   -28,    44,    44,    44,    44,   -28,   313,    44,
  487.     44,    44,    44,   -11,   -11,   -11,   -11,   -11,   -11,   -11,
  488.     41,   -29,   -14,    64,    35,   310,    35,   -30,    47,    33,
  489.     43,    43,   -14,    35,    35,    44,   -31,   -11,   -32,   -11,
  490.    -31,   -29,   -14,    64,   311,    44,   310,   -14,    35,    44,
  491.     35,   -30,    64,    64,    44,    44,   -14,   257,   -15,   -11,
  492.    -12,   -13,   324,   323,   -28,   -14,   -14,   -30,   -30,   313,
  493.    310,    44,   -14,   -14,    35,   -28,   311,   -14,   310,   -14,
  494.     35,   -15,   310,   313,   312,   -28,   313,   310,   310,   314,
  495.    -31,    44,    44,   -14,   -14,    43,    43,    43,   -31,   -31,
  496.     44,   313,   312,   310,   310,   -31 };
  497. yytabelem yydef[]={
  498.  
  499.      0,    -2,     1,     3,     0,     5,    20,     0,     0,     8,
  500.      0,    39,     0,     0,     0,     0,     0,     0,     0,     0,
  501.      0,     0,     0,     0,     0,     0,     0,    62,    63,     0,
  502.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  503.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  504.      0,     0,     0,     0,     0,     2,     0,     6,     7,     0,
  505.      0,     0,     0,     0,     0,    15,    40,   158,    27,     0,
  506.      0,    37,    38,    41,    42,     0,    43,    44,    45,    46,
  507.      0,   156,    47,    48,    49,     0,    50,    51,    52,    53,
  508.     54,    55,   123,   124,   125,     0,   140,   141,   142,   143,
  509.    144,   145,   146,   147,    56,    57,    58,     0,    61,    64,
  510.     65,    66,    67,    68,    69,    70,   127,   128,   129,   137,
  511.    138,   139,    71,    72,    73,    74,    75,   159,    76,    77,
  512.    160,    78,    79,    80,    81,    82,     0,     0,     0,    83,
  513.      0,    84,    85,    86,     0,     0,    87,    88,    89,     0,
  514.      0,     0,     0,     0,     0,     0,     0,     4,     9,    16,
  515.     10,    23,    24,    11,    26,   157,    12,     0,     0,     0,
  516.      0,     0,     0,     0,     0,     0,     0,    29,     0,     0,
  517.      0,   126,   148,   149,   150,   151,   152,   153,   154,   155,
  518.      0,     0,   136,     0,     0,     0,     0,     0,     0,     0,
  519.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  520.      0,     0,     0,    30,    31,    32,    33,    34,    35,    36,
  521.     28,    98,    99,     0,     0,   102,     0,   104,     0,     0,
  522.      0,     0,     0,     0,     0,     0,   107,   134,   108,   135,
  523.    109,   113,   114,     0,   121,     0,   110,   111,     0,     0,
  524.      0,   120,     0,     0,     0,     0,    21,    22,    25,    13,
  525.     14,     0,    18,    19,   100,   101,   103,   105,   106,    59,
  526.     60,     0,     0,     0,     0,   115,   122,   112,   116,   117,
  527.      0,   119,     0,     0,     0,    94,    95,    96,    97,    17,
  528.    130,     0,     0,     0,   118,     0,     0,     0,   131,   132,
  529.      0,    90,    92,    91,    93,   133 };
  530. typedef struct { char *t_name; int t_val; } yytoktype;
  531. #ifndef YYDEBUG
  532. #    define YYDEBUG    0    /* don't allow debugging */
  533. #endif
  534.  
  535. #if YYDEBUG
  536.  
  537. yytoktype yytoks[] =
  538. {
  539.     "STRING",    257,
  540.     "D_ORG",    258,
  541.     "D_BYTE",    259,
  542.     "D_WORD",    260,
  543.     "D_SKIP",    261,
  544.     "D_EQU",    262,
  545.     "D_FLAG",    263,
  546.     "D_END",    264,
  547.     "ACALL",    265,
  548.     "ADD",    266,
  549.     "ADDC",    267,
  550.     "AJMP",    268,
  551.     "ANL",    269,
  552.     "CJNE",    270,
  553.     "CLR",    271,
  554.     "CPL",    272,
  555.     "DA",    273,
  556.     "DEC",    274,
  557.     "DIV",    275,
  558.     "DJNZ",    276,
  559.     "INC",    277,
  560.     "JB",    278,
  561.     "JBC",    279,
  562.     "JC",    280,
  563.     "JMP",    281,
  564.     "JNB",    282,
  565.     "JNC",    283,
  566.     "JNZ",    284,
  567.     "JZ",    285,
  568.     "LCALL",    286,
  569.     "LJMP",    287,
  570.     "MOV",    288,
  571.     "MOVC",    289,
  572.     "MOVX",    290,
  573.     "NOP",    291,
  574.     "MUL",    292,
  575.     "ORL",    293,
  576.     "POP",    294,
  577.     "PUSH",    295,
  578.     "RET",    296,
  579.     "RETI",    297,
  580.     "RL",    298,
  581.     "RLC",    299,
  582.     "RR",    300,
  583.     "RRC",    301,
  584.     "SETB",    302,
  585.     "SJMP",    303,
  586.     "SUBB",    304,
  587.     "SWAP",    305,
  588.     "XCH",    306,
  589.     "XCHD",    307,
  590.     "XRL",    308,
  591.     "AB",    309,
  592.     "A",    310,
  593.     "C",    311,
  594.     "PC",    312,
  595.     "DPTR",    313,
  596.     "BITPOS",    314,
  597.     "R0",    315,
  598.     "R1",    316,
  599.     "R2",    317,
  600.     "R3",    318,
  601.     "R4",    319,
  602.     "R5",    320,
  603.     "R6",    321,
  604.     "R7",    322,
  605.     "VALUE",    323,
  606.     "SYMBOL",    324,
  607.     "+",    43,
  608.     "-",    45,
  609.     "*",    42,
  610.     "/",    47,
  611.     "%",    37,
  612.     "|",    124,
  613.     "&",    38,
  614.     "-unknown-",    -1    /* ends search */
  615. };
  616.  
  617. char * yyreds[] =
  618. {
  619.     "-no such reduction-",
  620.     "program : linelist",
  621.     "linelist : linelist line",
  622.     "linelist : line",
  623.     "line : undefsym ':' linerest",
  624.     "line : linerest",
  625.     "linerest : directive '\n'",
  626.     "linerest : instr '\n'",
  627.     "linerest : '\n'",
  628.     "directive : '.' D_ORG defexpr",
  629.     "directive : '.' D_BYTE blist",
  630.     "directive : '.' D_WORD wlist",
  631.     "directive : '.' D_SKIP defexpr",
  632.     "directive : '.' D_EQU undefsym ',' expr",
  633.     "directive : '.' D_FLAG SYMBOL ',' flag",
  634.     "directive : '.' D_END",
  635.     "defexpr : expr",
  636.     "flag : flagv BITPOS",
  637.     "flagv : SYMBOL",
  638.     "flagv : VALUE",
  639.     "undefsym : SYMBOL",
  640.     "blist : blist ',' data8",
  641.     "blist : blist ',' STRING",
  642.     "blist : data8",
  643.     "blist : STRING",
  644.     "wlist : wlist ',' data16",
  645.     "wlist : data16",
  646.     "expr : '*'",
  647.     "expr : '(' expr ')'",
  648.     "expr : '-' expr",
  649.     "expr : expr '|' expr",
  650.     "expr : expr '&' expr",
  651.     "expr : expr '*' expr",
  652.     "expr : expr '/' expr",
  653.     "expr : expr '%' expr",
  654.     "expr : expr '-' expr",
  655.     "expr : expr '+' expr",
  656.     "expr : SYMBOL",
  657.     "expr : VALUE",
  658.     "instr : NOP",
  659.     "instr : ACALL addr11",
  660.     "instr : AJMP addr11",
  661.     "instr : ADD two_op1",
  662.     "instr : ADDC two_op1",
  663.     "instr : SUBB two_op1",
  664.     "instr : XRL two_op1",
  665.     "instr : XRL two_op2",
  666.     "instr : ANL two_op1",
  667.     "instr : ANL two_op2",
  668.     "instr : ANL two_op3",
  669.     "instr : ORL two_op1",
  670.     "instr : ORL two_op2",
  671.     "instr : ORL two_op3",
  672.     "instr : XCH two_op1",
  673.     "instr : INC single_op1",
  674.     "instr : INC DPTR",
  675.     "instr : DEC single_op1",
  676.     "instr : DA A",
  677.     "instr : DIV AB",
  678.     "instr : JMP '@' A '+' DPTR",
  679.     "instr : JMP '@' DPTR '+' A",
  680.     "instr : MUL AB",
  681.     "instr : RET",
  682.     "instr : RETI",
  683.     "instr : RL A",
  684.     "instr : RLC A",
  685.     "instr : RR A",
  686.     "instr : RRC A",
  687.     "instr : SWAP A",
  688.     "instr : XCHD two_op1",
  689.     "instr : CLR single_op2",
  690.     "instr : CPL single_op2",
  691.     "instr : SETB single_op2",
  692.     "instr : PUSH data8",
  693.     "instr : POP data8",
  694.     "instr : LJMP addr16",
  695.     "instr : LCALL addr16",
  696.     "instr : JC relative",
  697.     "instr : JNC relative",
  698.     "instr : JNZ relative",
  699.     "instr : JZ relative",
  700.     "instr : SJMP relative",
  701.     "instr : CJNE three_op1",
  702.     "instr : JB two_op4",
  703.     "instr : JNB two_op4",
  704.     "instr : JBC two_op4",
  705.     "instr : DJNZ two_op5",
  706.     "instr : MOV two_op1",
  707.     "instr : MOV two_op2",
  708.     "instr : MOV two_op6",
  709.     "instr : MOVC A ',' '@' A '+' DPTR",
  710.     "instr : MOVC A ',' '@' DPTR '+' A",
  711.     "instr : MOVC A ',' '@' A '+' PC",
  712.     "instr : MOVC A ',' '@' PC '+' A",
  713.     "instr : MOVX A ',' '@' regi",
  714.     "instr : MOVX A ',' '@' DPTR",
  715.     "instr : MOVX '@' regi ',' A",
  716.     "instr : MOVX '@' DPTR ',' A",
  717.     "two_op1 : A ',' reg",
  718.     "two_op1 : A ',' data8",
  719.     "two_op1 : A ',' '@' regi",
  720.     "two_op1 : A ',' '#' data8",
  721.     "two_op2 : data8 ',' A",
  722.     "two_op2 : data8 ',' '#' data8",
  723.     "two_op3 : C ',' bit",
  724.     "two_op3 : C ',' '/' bit",
  725.     "two_op3 : C ',' '!' bit",
  726.     "two_op4 : bit ',' rel",
  727.     "two_op5 : reg ',' rel2",
  728.     "two_op5 : data8 ',' rel",
  729.     "two_op6 : reg ',' A",
  730.     "two_op6 : reg ',' data8",
  731.     "two_op6 : reg ',' '#' data8",
  732.     "two_op6 : data8 ',' reg",
  733.     "two_op6 : data8 ',' data8",
  734.     "two_op6 : data8 ',' '@' regi",
  735.     "two_op6 : '@' regi ',' A",
  736.     "two_op6 : '@' regi ',' data8",
  737.     "two_op6 : '@' regi ',' '#' data8",
  738.     "two_op6 : DPTR ',' '#' data16",
  739.     "two_op6 : C ',' bit",
  740.     "two_op6 : data8 ',' C",
  741.     "two_op6 : data8 BITPOS ',' C",
  742.     "single_op1 : A",
  743.     "single_op1 : reg",
  744.     "single_op1 : data8",
  745.     "single_op1 : '@' regi",
  746.     "single_op2 : A",
  747.     "single_op2 : C",
  748.     "single_op2 : bit",
  749.     "three_op1 : A ',' data8 ',' rel",
  750.     "three_op1 : A ',' '#' data8 ',' rel",
  751.     "three_op1 : reg ',' '#' data8 ',' rel",
  752.     "three_op1 : '@' regi ',' '#' data8 ',' rel",
  753.     "rel : expr",
  754.     "rel2 : expr",
  755.     "bit : bitv BITPOS",
  756.     "bit : bitv",
  757.     "bitv : SYMBOL",
  758.     "bitv : VALUE",
  759.     "reg : R0",
  760.     "reg : R1",
  761.     "reg : R2",
  762.     "reg : R3",
  763.     "reg : R4",
  764.     "reg : R5",
  765.     "reg : R6",
  766.     "reg : R7",
  767.     "regi : R0",
  768.     "regi : R1",
  769.     "regi : R2",
  770.     "regi : R3",
  771.     "regi : R4",
  772.     "regi : R5",
  773.     "regi : R6",
  774.     "regi : R7",
  775.     "data8 : expr",
  776.     "data16 : expr",
  777.     "addr11 : expr",
  778.     "addr16 : expr",
  779.     "relative : expr",
  780. };
  781. #endif /* YYDEBUG */
  782. #define YYFLAG  (-3000)
  783. /* @(#) $Revision: 64.2 $ */    
  784.  
  785. /*
  786. ** Skeleton parser driver for yacc output
  787. */
  788.  
  789. #if defined(NLS) && !defined(NL_SETN)
  790. #include <msgbuf.h>
  791. #endif
  792.  
  793. #ifndef nl_msg
  794. #define nl_msg(i,s) (s)
  795. #endif
  796.  
  797. /*
  798. ** yacc user known macros and defines
  799. */
  800. #define YYERROR        goto yyerrlab
  801.  
  802. #ifndef __RUNTIME_YYMAXDEPTH
  803. #define YYACCEPT    return(0)
  804. #define YYABORT        return(1)
  805. #else
  806. #define YYACCEPT    {free_stacks(); return(0);}
  807. #define YYABORT        {free_stacks(); return(1);}
  808. #endif
  809.  
  810. #define YYBACKUP( newtoken, newvalue )\
  811. {\
  812.     if ( yychar >= 0 || ( yyr2[ yytmp ] >> 1 ) != 1 )\
  813.     {\
  814.         yyerror( (nl_msg(30001,"syntax error - cannot backup")) );\
  815.         goto yyerrlab;\
  816.     }\
  817.     yychar = newtoken;\
  818.     yystate = *yyps;\
  819.     yylval = newvalue;\
  820.     goto yynewstate;\
  821. }
  822. #define YYRECOVERING()    (!!yyerrflag)
  823. #ifndef YYDEBUG
  824. #    define YYDEBUG    1    /* make debugging available */
  825. #endif
  826.  
  827. /*
  828. ** user known globals
  829. */
  830. int yydebug;            /* set to 1 to get debugging */
  831.  
  832. /*
  833. ** driver internal defines
  834. */
  835. /* define for YYFLAG now generated by yacc program. */
  836. /*#define YYFLAG        (FLAGVAL)*/
  837.  
  838. /*
  839. ** global variables used by the parser
  840. */
  841. # ifndef __RUNTIME_YYMAXDEPTH
  842. YYSTYPE yyv[ YYMAXDEPTH ];    /* value stack */
  843. int yys[ YYMAXDEPTH ];        /* state stack */
  844. # else
  845. YYSTYPE *yyv;            /* pointer to malloc'ed value stack */
  846. int *yys;            /* pointer to malloc'ed stack stack */
  847. extern char *malloc(), *realloc();
  848. extern void free();
  849. int allocate_stacks(); 
  850. void free_stacks();
  851. # ifndef YYINCREMENT
  852. # define YYINCREMENT (YYMAXDEPTH/2) + 10
  853. # endif
  854. # endif
  855. long  yymaxdepth = YYMAXDEPTH;
  856.  
  857. YYSTYPE *yypv;            /* top of value stack */
  858. int *yyps;            /* top of state stack */
  859.  
  860. int yystate;            /* current state */
  861. int yytmp;            /* extra var (lasts between blocks) */
  862.  
  863. int yynerrs;            /* number of errors */
  864. int yyerrflag;            /* error recovery flag */
  865. int yychar;            /* current input token number */
  866.  
  867.  
  868.  
  869. /*
  870. ** yyparse - return 0 if worked, 1 if syntax error not recovered from
  871. */
  872. int
  873. yyparse()
  874. {
  875.     register YYSTYPE *yypvt;    /* top of value stack for $vars */
  876.  
  877.     /*
  878.     ** Initialize externals - yyparse may be called more than once
  879.     */
  880. # ifdef __RUNTIME_YYMAXDEPTH
  881.     if (allocate_stacks()) YYABORT;
  882. # endif
  883.     yypv = &yyv[-1];
  884.     yyps = &yys[-1];
  885.     yystate = 0;
  886.     yytmp = 0;
  887.     yynerrs = 0;
  888.     yyerrflag = 0;
  889.     yychar = -1;
  890.  
  891.     goto yystack;
  892.     {
  893.         register YYSTYPE *yy_pv;    /* top of value stack */
  894.         register int *yy_ps;        /* top of state stack */
  895.         register int yy_state;        /* current state */
  896.         register int  yy_n;        /* internal state number info */
  897.  
  898.         /*
  899.         ** get globals into registers.
  900.         ** branch to here only if YYBACKUP was called.
  901.         */
  902.     yynewstate:
  903.         yy_pv = yypv;
  904.         yy_ps = yyps;
  905.         yy_state = yystate;
  906.         goto yy_newstate;
  907.  
  908.         /*
  909.         ** get globals into registers.
  910.         ** either we just started, or we just finished a reduction
  911.         */
  912.     yystack:
  913.         yy_pv = yypv;
  914.         yy_ps = yyps;
  915.         yy_state = yystate;
  916.  
  917.         /*
  918.         ** top of for (;;) loop while no reductions done
  919.         */
  920.     yy_stack:
  921.         /*
  922.         ** put a state and value onto the stacks
  923.         */
  924. #if YYDEBUG
  925.         /*
  926.         ** if debugging, look up token value in list of value vs.
  927.         ** name pairs.  0 and negative (-1) are special values.
  928.         ** Note: linear search is used since time is not a real
  929.         ** consideration while debugging.
  930.         */
  931.         if ( yydebug )
  932.         {
  933.             register int yy_i;
  934.  
  935.             printf( "State %d, token ", yy_state );
  936.             if ( yychar == 0 )
  937.                 printf( "end-of-file\n" );
  938.             else if ( yychar < 0 )
  939.                 printf( "-none-\n" );
  940.             else
  941.             {
  942.                 for ( yy_i = 0; yytoks[yy_i].t_val >= 0;
  943.                     yy_i++ )
  944.                 {
  945.                     if ( yytoks[yy_i].t_val == yychar )
  946.                         break;
  947.                 }
  948.                 printf( "%s\n", yytoks[yy_i].t_name );
  949.             }
  950.         }
  951. #endif /* YYDEBUG */
  952.         if ( ++yy_ps >= &yys[ yymaxdepth ] )    /* room on stack? */
  953.         {
  954. # ifndef __RUNTIME_YYMAXDEPTH
  955.             yyerror( (nl_msg(30002,"yacc stack overflow")) );
  956.             YYABORT;
  957. # else
  958.             /* save old stack bases to recalculate pointers */
  959.             YYSTYPE * yyv_old = yyv;
  960.             int * yys_old = yys;
  961.             yymaxdepth += YYINCREMENT;
  962.             yys = (int *) realloc(yys, yymaxdepth * sizeof(int));
  963.             yyv = (YYSTYPE *) realloc(yyv, yymaxdepth * sizeof(YYSTYPE));
  964.             if (yys==0 || yyv==0) {
  965.                 yyerror( (nl_msg(30002,"yacc stack overflow")) );
  966.                 YYABORT;
  967.                 }
  968.             /* Reset pointers into stack */
  969.             yy_ps = (yy_ps - yys_old) + yys;
  970.             yyps = (yyps - yys_old) + yys;
  971.             yy_pv = (yy_pv - yyv_old) + yyv;
  972.             yypv = (yypv - yyv_old) + yyv;
  973. # endif
  974.  
  975.         }
  976.         *yy_ps = yy_state;
  977.         *++yy_pv = yyval;
  978.  
  979.         /*
  980.         ** we have a new state - find out what to do
  981.         */
  982.     yy_newstate:
  983.         if ( ( yy_n = yypact[ yy_state ] ) <= YYFLAG )
  984.             goto yydefault;        /* simple state */
  985. #if YYDEBUG
  986.         /*
  987.         ** if debugging, need to mark whether new token grabbed
  988.         */
  989.         yytmp = yychar < 0;
  990. #endif
  991.         if ( ( yychar < 0 ) && ( ( yychar = yylex() ) < 0 ) )
  992.             yychar = 0;        /* reached EOF */
  993. #if YYDEBUG
  994.         if ( yydebug && yytmp )
  995.         {
  996.             register int yy_i;
  997.  
  998.             printf( "Received token " );
  999.             if ( yychar == 0 )
  1000.                 printf( "end-of-file\n" );
  1001.             else if ( yychar < 0 )
  1002.                 printf( "-none-\n" );
  1003.             else
  1004.             {
  1005.                 for ( yy_i = 0; yytoks[yy_i].t_val >= 0;
  1006.                     yy_i++ )
  1007.                 {
  1008.                     if ( yytoks[yy_i].t_val == yychar )
  1009.                         break;
  1010.                 }
  1011.                 printf( "%s\n", yytoks[yy_i].t_name );
  1012.             }
  1013.         }
  1014. #endif /* YYDEBUG */
  1015.         if ( ( ( yy_n += yychar ) < 0 ) || ( yy_n >= YYLAST ) )
  1016.             goto yydefault;
  1017.         if ( yychk[ yy_n = yyact[ yy_n ] ] == yychar )    /*valid shift*/
  1018.         {
  1019.             yychar = -1;
  1020.             yyval = yylval;
  1021.             yy_state = yy_n;
  1022.             if ( yyerrflag > 0 )
  1023.                 yyerrflag--;
  1024.             goto yy_stack;
  1025.         }
  1026.  
  1027.     yydefault:
  1028.         if ( ( yy_n = yydef[ yy_state ] ) == -2 )
  1029.         {
  1030. #if YYDEBUG
  1031.             yytmp = yychar < 0;
  1032. #endif
  1033.             if ( ( yychar < 0 ) && ( ( yychar = yylex() ) < 0 ) )
  1034.                 yychar = 0;        /* reached EOF */
  1035. #if YYDEBUG
  1036.             if ( yydebug && yytmp )
  1037.             {
  1038.                 register int yy_i;
  1039.  
  1040.                 printf( "Received token " );
  1041.                 if ( yychar == 0 )
  1042.                     printf( "end-of-file\n" );
  1043.                 else if ( yychar < 0 )
  1044.                     printf( "-none-\n" );
  1045.                 else
  1046.                 {
  1047.                     for ( yy_i = 0;
  1048.                         yytoks[yy_i].t_val >= 0;
  1049.                         yy_i++ )
  1050.                     {
  1051.                         if ( yytoks[yy_i].t_val
  1052.                             == yychar )
  1053.                         {
  1054.                             break;
  1055.                         }
  1056.                     }
  1057.                     printf( "%s\n", yytoks[yy_i].t_name );
  1058.                 }
  1059.             }
  1060. #endif /* YYDEBUG */
  1061.             /*
  1062.             ** look through exception table
  1063.             */
  1064.             {
  1065.                 register int *yyxi = yyexca;
  1066.  
  1067.                 while ( ( *yyxi != -1 ) ||
  1068.                     ( yyxi[1] != yy_state ) )
  1069.                 {
  1070.                     yyxi += 2;
  1071.                 }
  1072.                 while ( ( *(yyxi += 2) >= 0 ) &&
  1073.                     ( *yyxi != yychar ) )
  1074.                     ;
  1075.                 if ( ( yy_n = yyxi[1] ) < 0 )
  1076.                     YYACCEPT;
  1077.             }
  1078.         }
  1079.  
  1080.         /*
  1081.         ** check for syntax error
  1082.         */
  1083.         if ( yy_n == 0 )    /* have an error */
  1084.         {
  1085.             /* no worry about speed here! */
  1086.             switch ( yyerrflag )
  1087.             {
  1088.             case 0:        /* new error */
  1089.                 yyerror( (nl_msg(30003,"syntax error")) );
  1090.                 yynerrs++;
  1091.                 goto skip_init;
  1092.             yyerrlab:
  1093.                 /*
  1094.                 ** get globals into registers.
  1095.                 ** we have a user generated syntax type error
  1096.                 */
  1097.                 yy_pv = yypv;
  1098.                 yy_ps = yyps;
  1099.                 yy_state = yystate;
  1100.                 yynerrs++;
  1101.             skip_init:
  1102.             case 1:
  1103.             case 2:        /* incompletely recovered error */
  1104.                     /* try again... */
  1105.                 yyerrflag = 3;
  1106.                 /*
  1107.                 ** find state where "error" is a legal
  1108.                 ** shift action
  1109.                 */
  1110.                 while ( yy_ps >= yys )
  1111.                 {
  1112.                     yy_n = yypact[ *yy_ps ] + YYERRCODE;
  1113.                     if ( yy_n >= 0 && yy_n < YYLAST &&
  1114.                         yychk[yyact[yy_n]] == YYERRCODE)                    {
  1115.                         /*
  1116.                         ** simulate shift of "error"
  1117.                         */
  1118.                         yy_state = yyact[ yy_n ];
  1119.                         goto yy_stack;
  1120.                     }
  1121.                     /*
  1122.                     ** current state has no shift on
  1123.                     ** "error", pop stack
  1124.                     */
  1125. #if YYDEBUG
  1126. #    define _POP_ "Error recovery pops state %d, uncovers state %d\n"
  1127.                     if ( yydebug )
  1128.                         printf( _POP_, *yy_ps,
  1129.                             yy_ps[-1] );
  1130. #    undef _POP_
  1131. #endif
  1132.                     yy_ps--;
  1133.                     yy_pv--;
  1134.                 }
  1135.                 /*
  1136.                 ** there is no state on stack with "error" as
  1137.                 ** a valid shift.  give up.
  1138.                 */
  1139.                 YYABORT;
  1140.             case 3:        /* no shift yet; eat a token */
  1141. #if YYDEBUG
  1142.                 /*
  1143.                 ** if debugging, look up token in list of
  1144.                 ** pairs.  0 and negative shouldn't occur,
  1145.                 ** but since timing doesn't matter when
  1146.                 ** debugging, it doesn't hurt to leave the
  1147.                 ** tests here.
  1148.                 */
  1149.                 if ( yydebug )
  1150.                 {
  1151.                     register int yy_i;
  1152.  
  1153.                     printf( "Error recovery discards " );
  1154.                     if ( yychar == 0 )
  1155.                         printf( "token end-of-file\n" );
  1156.                     else if ( yychar < 0 )
  1157.                         printf( "token -none-\n" );
  1158.                     else
  1159.                     {
  1160.                         for ( yy_i = 0;
  1161.                             yytoks[yy_i].t_val >= 0;
  1162.                             yy_i++ )
  1163.                         {
  1164.                             if ( yytoks[yy_i].t_val
  1165.                                 == yychar )
  1166.                             {
  1167.                                 break;
  1168.                             }
  1169.                         }
  1170.                         printf( "token %s\n",
  1171.                             yytoks[yy_i].t_name );
  1172.                     }
  1173.                 }
  1174. #endif /* YYDEBUG */
  1175.                 if ( yychar == 0 )    /* reached EOF. quit */
  1176.                     YYABORT;
  1177.                 yychar = -1;
  1178.                 goto yy_newstate;
  1179.             }
  1180.         }/* end if ( yy_n == 0 ) */
  1181.         /*
  1182.         ** reduction by production yy_n
  1183.         ** put stack tops, etc. so things right after switch
  1184.         */
  1185. #if YYDEBUG
  1186.         /*
  1187.         ** if debugging, print the string that is the user's
  1188.         ** specification of the reduction which is just about
  1189.         ** to be done.
  1190.         */
  1191.         if ( yydebug )
  1192.             printf( "Reduce by (%d) \"%s\"\n",
  1193.                 yy_n, yyreds[ yy_n ] );
  1194. #endif
  1195.         yytmp = yy_n;            /* value to switch over */
  1196.         yypvt = yy_pv;            /* $vars top of value stack */
  1197.         /*
  1198.         ** Look in goto table for next state
  1199.         ** Sorry about using yy_state here as temporary
  1200.         ** register variable, but why not, if it works...
  1201.         ** If yyr2[ yy_n ] doesn't have the low order bit
  1202.         ** set, then there is no action to be done for
  1203.         ** this reduction.  So, no saving & unsaving of
  1204.         ** registers done.  The only difference between the
  1205.         ** code just after the if and the body of the if is
  1206.         ** the goto yy_stack in the body.  This way the test
  1207.         ** can be made before the choice of what to do is needed.
  1208.         */
  1209.         {
  1210.             /* length of production doubled with extra bit */
  1211.             register int yy_len = yyr2[ yy_n ];
  1212.  
  1213.             if ( !( yy_len & 01 ) )
  1214.             {
  1215.                 yy_len >>= 1;
  1216.                 yyval = ( yy_pv -= yy_len )[1];    /* $$ = $1 */
  1217.                 yy_state = yypgo[ yy_n = yyr1[ yy_n ] ] +
  1218.                     *( yy_ps -= yy_len ) + 1;
  1219.                 if ( yy_state >= YYLAST ||
  1220.                     yychk[ yy_state =
  1221.                     yyact[ yy_state ] ] != -yy_n )
  1222.                 {
  1223.                     yy_state = yyact[ yypgo[ yy_n ] ];
  1224.                 }
  1225.                 goto yy_stack;
  1226.             }
  1227.             yy_len >>= 1;
  1228.             yyval = ( yy_pv -= yy_len )[1];    /* $$ = $1 */
  1229.             yy_state = yypgo[ yy_n = yyr1[ yy_n ] ] +
  1230.                 *( yy_ps -= yy_len ) + 1;
  1231.             if ( yy_state >= YYLAST ||
  1232.                 yychk[ yy_state = yyact[ yy_state ] ] != -yy_n )
  1233.             {
  1234.                 yy_state = yyact[ yypgo[ yy_n ] ];
  1235.             }
  1236.         }
  1237.                     /* save until reenter driver code */
  1238.         yystate = yy_state;
  1239.         yyps = yy_ps;
  1240.         yypv = yy_pv;
  1241.     }
  1242.     /*
  1243.     ** code supplied by user is placed in this switch
  1244.     */
  1245.     switch( yytmp )
  1246.     {
  1247.         
  1248. case 1:
  1249. # line 124 "as31.y"
  1250. {
  1251. } break;
  1252. case 4:
  1253. # line 133 "as31.y"
  1254. {
  1255.     if( pass1 ) {
  1256.         yypvt[-2].sym->type = LABEL;
  1257.         yypvt[-2].sym->value = lc;
  1258.     }
  1259.     inclc(yypvt[-0].value);
  1260.     bytecount = 0;
  1261. } break;
  1262. case 5:
  1263. # line 141 "as31.y"
  1264. { inclc(yypvt[-0].value); bytecount = 0; } break;
  1265. case 6:
  1266. # line 144 "as31.y"
  1267. {
  1268.                         yyval.value = yypvt[-1].value;
  1269.                         if( dashl && pass2 )
  1270.                             dumplist(yypvt[-0].str,1);
  1271.                     } break;
  1272. case 7:
  1273. # line 149 "as31.y"
  1274. {
  1275.                         yyval.value = yypvt[-1].value;
  1276.                         if( dashl && pass2 )
  1277.                             dumplist(yypvt[-0].str,1);
  1278.  
  1279.                     } break;
  1280. case 8:
  1281. # line 155 "as31.y"
  1282. {
  1283.                         yyval.value = 0;
  1284.                         if( dashl && pass2 )
  1285.                             dumplist(yypvt[-0].str,0);
  1286.                     } break;
  1287. case 9:
  1288. # line 172 "as31.y"
  1289. {
  1290.     lc = yypvt[-0].val.v;
  1291.     if( pass2 ) emitaddr(lc);
  1292.     bytecount = 0;
  1293.     yyval.value = 0;
  1294. } break;
  1295. case 10:
  1296. # line 178 "as31.y"
  1297. { yyval.value = yypvt[-0].value; } break;
  1298. case 11:
  1299. # line 179 "as31.y"
  1300. { yyval.value = yypvt[-0].value; } break;
  1301. case 12:
  1302. # line 180 "as31.y"
  1303. { yyval.value = yypvt[-0].val.v;
  1304.                       if( pass2 )
  1305.                         emitaddr(lc+yyval.value); } break;
  1306. case 13:
  1307. # line 184 "as31.y"
  1308. {
  1309.     if( yypvt[-0].val.d == 0 )
  1310.         error("Expression is undefined in pass 1");
  1311.     yypvt[-2].sym->type = LABEL;
  1312.     yypvt[-2].sym->value = yypvt[-0].val.v;
  1313.     yyval.value = 0;
  1314. } break;
  1315. case 14:
  1316. # line 193 "as31.y"
  1317. {
  1318.     yypvt[-2].sym->type = LABEL;
  1319.     yypvt[-2].sym->value = yypvt[-0].value;
  1320.     yyval.value = 0;
  1321. } break;
  1322. case 15:
  1323. # line 198 "as31.y"
  1324. { yyval.value = 0; } break;
  1325. case 16:
  1326. # line 202 "as31.y"
  1327. {
  1328.         if( yypvt[-0].val.d == 0 )
  1329.             error("Expression is undefined in pass 1");
  1330.         if( !(isbit16(yypvt[-0].val.v)) )
  1331.             error("Value greater than 16-bits");
  1332.         yyval.value = yypvt[-0].val.v;
  1333. } break;
  1334. case 17:
  1335. # line 212 "as31.y"
  1336. {
  1337.     if( !isbit8(yypvt[-1].value) )
  1338.         warning("Bit address exceeds 8-bits");
  1339.     if( isbmram(yypvt[-1].value) )
  1340.         yyval.value = (yypvt[-1].value-0x20)*8+ yypvt[-0].value;
  1341.     else if( isbmsfr(yypvt[-1].value) )
  1342.         yyval.value = yypvt[-1].value + yypvt[-0].value;
  1343.     else
  1344.         warning("Invalid bit addressable RAM location");
  1345. } break;
  1346. case 18:
  1347. # line 225 "as31.y"
  1348. {
  1349.     if( yypvt[-0].sym->type == UNDEF )
  1350.         error("Symbol %s must be defined in pass 1",yypvt[-0].sym->name);
  1351.     yyval.value = yypvt[-0].sym->value;
  1352. } break;
  1353. case 19:
  1354. # line 230 "as31.y"
  1355. { yyval.value = yypvt[-0].value; } break;
  1356. case 20:
  1357. # line 235 "as31.y"
  1358. {
  1359.     if( yypvt[-0].sym->type != UNDEF && pass1)
  1360.         error("Attempt to redefine symbol: %s",yypvt[-0].sym->name);
  1361.     yyval.sym = yypvt[-0].sym;
  1362. } break;
  1363. case 21:
  1364. # line 243 "as31.y"
  1365. {
  1366.     if( pass2 ) genbyte(yypvt[-0].value);
  1367.     yyval.value = yypvt[-2].value + 1;
  1368. } break;
  1369. case 22:
  1370. # line 248 "as31.y"
  1371. {
  1372.     if( pass1 )
  1373.         yyval.value = yypvt[-2].value + yypvt[-0].value;
  1374.     else {
  1375.         yyval.value = yypvt[-2].value + strlen(yypvt[-0].str);
  1376.         genstr(yypvt[-0].str);
  1377.         
  1378.         free(yypvt[-0].str);
  1379.     }
  1380. } break;
  1381. case 23:
  1382. # line 259 "as31.y"
  1383. {
  1384.     if( pass2 ) genbyte(yypvt[-0].value);
  1385.     yyval.value = 1;
  1386. } break;
  1387. case 24:
  1388. # line 264 "as31.y"
  1389. {
  1390.     if( pass1 )
  1391.         yyval.value = yypvt[-0].value;
  1392.     else {
  1393.         yyval.value = strlen(yypvt[-0].str);
  1394.         genstr(yypvt[-0].str);
  1395.         free(yypvt[-0].str);
  1396.     }
  1397. } break;
  1398. case 25:
  1399. # line 276 "as31.y"
  1400. {
  1401.     if( pass2 ) genword(yypvt[-0].value);
  1402.     yyval.value = yypvt[-2].value + 2;
  1403. } break;
  1404. case 26:
  1405. # line 281 "as31.y"
  1406. {
  1407.     if( pass2 ) genword(yypvt[-0].value);
  1408.     yyval.value = 2;
  1409. } break;
  1410. case 27:
  1411. # line 294 "as31.y"
  1412. { yyval.val.v = lc;
  1413.                       yyval.val.d = 1; } break;
  1414. case 28:
  1415. # line 297 "as31.y"
  1416. { yyval.val.v = yypvt[-1].val.v;
  1417.                       yyval.val.d = yypvt[-1].val.d; } break;
  1418. case 29:
  1419. # line 300 "as31.y"
  1420. { yyval.val.v = -yypvt[-0].val.v;
  1421.                       yyval.val.d = yypvt[-0].val.d;  } break;
  1422. case 30:
  1423. # line 303 "as31.y"
  1424. { yyval.val.v = yypvt[-2].val.v | yypvt[-0].val.v;
  1425.                       yyval.val.d = yypvt[-2].val.d && yypvt[-0].val.d; } break;
  1426. case 31:
  1427. # line 306 "as31.y"
  1428. { yyval.val.v = yypvt[-2].val.v & yypvt[-0].val.v;
  1429.                       yyval.val.d = yypvt[-2].val.d && yypvt[-0].val.d; } break;
  1430. case 32:
  1431. # line 309 "as31.y"
  1432. { yyval.val.v = yypvt[-2].val.v * yypvt[-0].val.v;
  1433.                       yyval.val.d = yypvt[-2].val.d && yypvt[-0].val.d; } break;
  1434. case 33:
  1435. # line 312 "as31.y"
  1436. { yyval.val.v = yypvt[-2].val.v / yypvt[-0].val.v;
  1437.                       yyval.val.d = yypvt[-2].val.d && yypvt[-0].val.d; } break;
  1438. case 34:
  1439. # line 315 "as31.y"
  1440. { yyval.val.v = yypvt[-2].val.v % yypvt[-0].val.v;
  1441.                       yyval.val.d = yypvt[-2].val.d && yypvt[-0].val.d; } break;
  1442. case 35:
  1443. # line 318 "as31.y"
  1444. { yyval.val.v = yypvt[-2].val.v - yypvt[-0].val.v;
  1445.                       yyval.val.d = yypvt[-2].val.d && yypvt[-0].val.d; } break;
  1446. case 36:
  1447. # line 321 "as31.y"
  1448. { yyval.val.v = yypvt[-2].val.v + yypvt[-0].val.v;
  1449.                       yyval.val.d = yypvt[-2].val.d && yypvt[-0].val.d; } break;
  1450. case 37:
  1451. # line 324 "as31.y"
  1452. {
  1453.     if( pass1 ) {
  1454.         yyval.val.v = yypvt[-0].sym->value;
  1455.         yyval.val.d = (yypvt[-0].sym->type != UNDEF);
  1456.     }
  1457.     else {
  1458.         if( yypvt[-0].sym->type == UNDEF )
  1459.             error("Undefined symbol %s",yypvt[-0].sym->name);
  1460.         yyval.val.v = yypvt[-0].sym->value;
  1461.         yyval.val.d = 1;
  1462.     }
  1463. } break;
  1464. case 38:
  1465. # line 336 "as31.y"
  1466. { yyval.val.v = yypvt[-0].val.v; yyval.val.d=1; } break;
  1467. case 39:
  1468. # line 349 "as31.y"
  1469. { yyval.value = makeop(yypvt[-0].op,NULL,0); } break;
  1470. case 40:
  1471. # line 351 "as31.y"
  1472. { yyval.value = makeop(yypvt[-1].op,&yypvt[-0].mode,0); } break;
  1473. case 41:
  1474. # line 353 "as31.y"
  1475. { yyval.value = makeop(yypvt[-1].op,&yypvt[-0].mode,0); } break;
  1476. case 42:
  1477. # line 355 "as31.y"
  1478. { yyval.value = makeop(yypvt[-1].op,&yypvt[-0].mode,0); } break;
  1479. case 43:
  1480. # line 357 "as31.y"
  1481. { yyval.value = makeop(yypvt[-1].op,&yypvt[-0].mode,0); } break;
  1482. case 44:
  1483. # line 359 "as31.y"
  1484. { yyval.value = makeop(yypvt[-1].op,&yypvt[-0].mode,0); } break;
  1485. case 45:
  1486. # line 361 "as31.y"
  1487. { yyval.value = makeop(yypvt[-1].op,&yypvt[-0].mode,0); } break;
  1488. case 46:
  1489. # line 363 "as31.y"
  1490. { yyval.value = makeop(yypvt[-1].op,&yypvt[-0].mode,4); } break;
  1491. case 47:
  1492. # line 365 "as31.y"
  1493. { yyval.value = makeop(yypvt[-1].op,&yypvt[-0].mode,0); } break;
  1494. case 48:
  1495. # line 367 "as31.y"
  1496. { yyval.value = makeop(yypvt[-1].op,&yypvt[-0].mode,4); } break;
  1497. case 49:
  1498. # line 369 "as31.y"
  1499. { yyval.value = makeop(yypvt[-1].op,&yypvt[-0].mode,6); } break;
  1500. case 50:
  1501. # line 371 "as31.y"
  1502. { yyval.value = makeop(yypvt[-1].op,&yypvt[-0].mode,0); } break;
  1503. case 51:
  1504. # line 373 "as31.y"
  1505. { yyval.value = makeop(yypvt[-1].op,&yypvt[-0].mode,4); } break;
  1506. case 52:
  1507. # line 375 "as31.y"
  1508. { yyval.value = makeop(yypvt[-1].op,&yypvt[-0].mode,6); } break;
  1509. case 53:
  1510. # line 377 "as31.y"
  1511. { if( get_md(yypvt[-0].mode) == 3 )
  1512.                     error("Immediate mode is illegal");
  1513.                   yyval.value = makeop(yypvt[-1].op,&yypvt[-0].mode,0);
  1514.                 } break;
  1515. case 54:
  1516. # line 382 "as31.y"
  1517. { yyval.value = makeop(yypvt[-1].op,&yypvt[-0].mode,0); } break;
  1518. case 55:
  1519. # line 384 "as31.y"
  1520. { yyval.value = makeop(yypvt[-1].op,NULL,4); } break;
  1521. case 56:
  1522. # line 386 "as31.y"
  1523. { yyval.value = makeop(yypvt[-1].op,&yypvt[-0].mode,0); } break;
  1524. case 57:
  1525. # line 388 "as31.y"
  1526. { yyval.value = makeop(yypvt[-1].op,NULL,0); } break;
  1527. case 58:
  1528. # line 390 "as31.y"
  1529. { yyval.value = makeop(yypvt[-1].op,NULL,0); } break;
  1530. case 59:
  1531. # line 392 "as31.y"
  1532. { yyval.value = makeop(yypvt[-4].op,NULL,0); } break;
  1533. case 60:
  1534. # line 394 "as31.y"
  1535. { yyval.value = makeop(yypvt[-4].op,NULL,0); } break;
  1536. case 61:
  1537. # line 396 "as31.y"
  1538. { yyval.value = makeop(yypvt[-1].op,NULL,0); } break;
  1539. case 62:
  1540. # line 398 "as31.y"
  1541. { yyval.value = makeop(yypvt[-0].op,NULL,0); } break;
  1542. case 63:
  1543. # line 400 "as31.y"
  1544. { yyval.value = makeop(yypvt[-0].op,NULL,0); } break;
  1545. case 64:
  1546. # line 402 "as31.y"
  1547. { yyval.value = makeop(yypvt[-1].op,NULL,0); } break;
  1548. case 65:
  1549. # line 404 "as31.y"
  1550. { yyval.value = makeop(yypvt[-1].op,NULL,0); } break;
  1551. case 66:
  1552. # line 406 "as31.y"
  1553. { yyval.value = makeop(yypvt[-1].op,NULL,0); } break;
  1554. case 67:
  1555. # line 408 "as31.y"
  1556. { yyval.value = makeop(yypvt[-1].op,NULL,0); } break;
  1557. case 68:
  1558. # line 410 "as31.y"
  1559. { yyval.value = makeop(yypvt[-1].op,NULL,0); } break;
  1560. case 69:
  1561. # line 412 "as31.y"
  1562. { if( get_md(yypvt[-0].mode) != 2 )
  1563.                     error("Invalid addressing mode");
  1564.                   yyval.value = makeop(yypvt[-1].op,&yypvt[-0].mode,-2); } break;
  1565. case 70:
  1566. # line 416 "as31.y"
  1567. { yyval.value = makeop(yypvt[-1].op,&yypvt[-0].mode,0); } break;
  1568. case 71:
  1569. # line 418 "as31.y"
  1570. { yyval.value = makeop(yypvt[-1].op,&yypvt[-0].mode,0); } break;
  1571. case 72:
  1572. # line 420 "as31.y"
  1573. { if( get_md(yypvt[-0].mode) == 0 )
  1574.                     error("Invalid addressing mode");
  1575.                   yyval.value = makeop(yypvt[-1].op,&yypvt[-0].mode,-1); } break;
  1576. case 73:
  1577. # line 424 "as31.y"
  1578. {
  1579.                    struct mode tmp;
  1580.                     set_md(tmp,0);
  1581.                     set_ov(tmp,0);
  1582.                     set_sz(tmp,1);
  1583.                     set_b1(tmp,yypvt[-0].value);
  1584.                     yyval.value = makeop(yypvt[-1].op,&tmp,0);
  1585.                 } break;
  1586. case 74:
  1587. # line 433 "as31.y"
  1588. {
  1589.                    struct mode tmp;
  1590.                     set_md(tmp,0);
  1591.                     set_ov(tmp,0);
  1592.                     set_sz(tmp,1);
  1593.                     set_b1(tmp,yypvt[-0].value);
  1594.                     yyval.value = makeop(yypvt[-1].op,&tmp,0);
  1595.                 } break;
  1596. case 75:
  1597. # line 442 "as31.y"
  1598. { yyval.value = makeop(yypvt[-1].op,&yypvt[-0].mode,0); } break;
  1599. case 76:
  1600. # line 444 "as31.y"
  1601. { yyval.value = makeop(yypvt[-1].op,&yypvt[-0].mode,0); } break;
  1602. case 77:
  1603. # line 446 "as31.y"
  1604. { yyval.value = makeop(yypvt[-1].op,&yypvt[-0].mode,0); } break;
  1605. case 78:
  1606. # line 448 "as31.y"
  1607. { yyval.value = makeop(yypvt[-1].op,&yypvt[-0].mode,0); } break;
  1608. case 79:
  1609. # line 450 "as31.y"
  1610. { yyval.value = makeop(yypvt[-1].op,&yypvt[-0].mode,0); } break;
  1611. case 80:
  1612. # line 452 "as31.y"
  1613. { yyval.value = makeop(yypvt[-1].op,&yypvt[-0].mode,0); } break;
  1614. case 81:
  1615. # line 454 "as31.y"
  1616. { yyval.value = makeop(yypvt[-1].op,&yypvt[-0].mode,0); } break;
  1617. case 82:
  1618. # line 456 "as31.y"
  1619. { yyval.value = makeop(yypvt[-1].op,&yypvt[-0].mode,0); } break;
  1620. case 83:
  1621. # line 458 "as31.y"
  1622. { yyval.value = makeop(yypvt[-1].op,&yypvt[-0].mode,0); } break;
  1623. case 84:
  1624. # line 460 "as31.y"
  1625. { yyval.value = makeop(yypvt[-1].op,&yypvt[-0].mode,0); } break;
  1626. case 85:
  1627. # line 462 "as31.y"
  1628. { yyval.value = makeop(yypvt[-1].op,&yypvt[-0].mode,0); } break;
  1629. case 86:
  1630. # line 464 "as31.y"
  1631. { yyval.value = makeop(yypvt[-1].op,&yypvt[-0].mode,0); } break;
  1632. case 87:
  1633. # line 466 "as31.y"
  1634. { yyval.value = makeop(yypvt[-1].op,&yypvt[-0].mode,0); } break;
  1635. case 88:
  1636. # line 468 "as31.y"
  1637. { yyval.value = makeop(yypvt[-1].op,&yypvt[-0].mode,4); } break;
  1638. case 89:
  1639. # line 470 "as31.y"
  1640. { yyval.value = makeop(yypvt[-1].op,&yypvt[-0].mode,6); } break;
  1641. case 90:
  1642. # line 474 "as31.y"
  1643. { yyval.value = makeop(yypvt[-6].op,NULL,0); } break;
  1644. case 91:
  1645. # line 476 "as31.y"
  1646. { yyval.value = makeop(yypvt[-6].op,NULL,0); } break;
  1647. case 92:
  1648. # line 478 "as31.y"
  1649. { yyval.value = makeop(yypvt[-6].op,NULL,1); } break;
  1650. case 93:
  1651. # line 480 "as31.y"
  1652. { yyval.value = makeop(yypvt[-6].op,NULL,1); } break;
  1653. case 94:
  1654. # line 483 "as31.y"
  1655. { yyval.value = makeop(yypvt[-4].op,NULL,yypvt[-0].value); } break;
  1656. case 95:
  1657. # line 485 "as31.y"
  1658. { yyval.value = makeop(yypvt[-4].op,NULL,2); } break;
  1659. case 96:
  1660. # line 487 "as31.y"
  1661. { yyval.value = makeop(yypvt[-4].op,NULL,yypvt[-2].value+3); } break;
  1662. case 97:
  1663. # line 489 "as31.y"
  1664. { yyval.value = makeop(yypvt[-4].op,NULL,5); } break;
  1665. case 98:
  1666. # line 501 "as31.y"
  1667. {
  1668.                     set_md(yyval.mode,0);
  1669.                     set_ov(yyval.mode, yypvt[-0].value);
  1670.                     set_sz(yyval.mode, 0);
  1671.                 } break;
  1672. case 99:
  1673. # line 507 "as31.y"
  1674. {
  1675.                     set_md(yyval.mode,1);
  1676.                     set_ov(yyval.mode,0);
  1677.                     set_sz(yyval.mode,1);
  1678.                     set_b1(yyval.mode,yypvt[-0].value);
  1679.                 } break;
  1680. case 100:
  1681. # line 514 "as31.y"
  1682. {
  1683.                     set_md(yyval.mode,2);
  1684.                     set_ov(yyval.mode,yypvt[-0].value);
  1685.                     set_sz(yyval.mode,0);
  1686.                 } break;
  1687. case 101:
  1688. # line 520 "as31.y"
  1689. {
  1690.                     set_md(yyval.mode,3);
  1691.                     set_ov(yyval.mode,0);
  1692.                     set_sz(yyval.mode,1);
  1693.                     set_b1(yyval.mode,yypvt[-0].value);
  1694.                 } break;
  1695. case 102:
  1696. # line 529 "as31.y"
  1697. {
  1698.                     set_md(yyval.mode,0);
  1699.                     set_ov(yyval.mode,0);
  1700.                     set_sz(yyval.mode,1);
  1701.                     set_b1(yyval.mode,yypvt[-2].value);
  1702.                 } break;
  1703. case 103:
  1704. # line 536 "as31.y"
  1705. {
  1706.                     set_md(yyval.mode,1);
  1707.                     set_ov(yyval.mode,0);
  1708.                     set_sz(yyval.mode,2);
  1709.                     set_b1(yyval.mode,yypvt[-3].value);
  1710.                     set_b2(yyval.mode,yypvt[-0].value);
  1711.                 } break;
  1712. case 104:
  1713. # line 546 "as31.y"
  1714. {
  1715.                     set_md(yyval.mode,0);
  1716.                     set_ov(yyval.mode,0);
  1717.                     set_sz(yyval.mode,1);
  1718.                     set_b1(yyval.mode,yypvt[-0].value);
  1719.                 } break;
  1720. case 105:
  1721. # line 553 "as31.y"
  1722. {
  1723.                     set_md(yyval.mode,1);
  1724.                     set_ov(yyval.mode,0);
  1725.                     set_sz(yyval.mode,1);
  1726.                     set_b1(yyval.mode,yypvt[-0].value);
  1727.                 } break;
  1728. case 106:
  1729. # line 560 "as31.y"
  1730. {
  1731.                     set_md(yyval.mode,1);
  1732.                     set_ov(yyval.mode,0);
  1733.                     set_sz(yyval.mode,1);
  1734.                     set_b1(yyval.mode,yypvt[-0].value);
  1735.                 } break;
  1736. case 107:
  1737. # line 569 "as31.y"
  1738. {
  1739.                     set_md(yyval.mode,0);
  1740.                     set_ov(yyval.mode,0);
  1741.                     set_sz(yyval.mode,2);
  1742.                     set_b1(yyval.mode,yypvt[-2].value);
  1743.                     set_b2(yyval.mode,yypvt[-0].value);
  1744.                 } break;
  1745. case 108:
  1746. # line 579 "as31.y"
  1747. {
  1748.                     set_md(yyval.mode,0);
  1749.                     set_ov(yyval.mode,yypvt[-2].value);
  1750.                     set_sz(yyval.mode,1);
  1751.                     set_b1(yyval.mode,yypvt[-0].value);
  1752.                 } break;
  1753. case 109:
  1754. # line 586 "as31.y"
  1755. {
  1756.                     set_md(yyval.mode,1);
  1757.                     set_ov(yyval.mode,0);
  1758.                     set_sz(yyval.mode,2);
  1759.                     set_b1(yyval.mode,yypvt[-2].value);
  1760.                     set_b2(yyval.mode,yypvt[-0].value);
  1761.                 } break;
  1762. case 110:
  1763. # line 596 "as31.y"
  1764. {
  1765.                     set_md(yyval.mode,0);
  1766.                     set_ov(yyval.mode,yypvt[-2].value);
  1767.                     set_sz(yyval.mode,0);
  1768.                 } break;
  1769. case 111:
  1770. # line 602 "as31.y"
  1771. {
  1772.                     set_md(yyval.mode,1);
  1773.                     set_ov(yyval.mode,yypvt[-2].value);
  1774.                     set_sz(yyval.mode,1);
  1775.                     set_b1(yyval.mode,yypvt[-0].value);
  1776.                 } break;
  1777. case 112:
  1778. # line 609 "as31.y"
  1779. {
  1780.                     set_md(yyval.mode,2);
  1781.                     set_ov(yyval.mode,yypvt[-3].value);
  1782.                     set_sz(yyval.mode,1);
  1783.                     set_b1(yyval.mode,yypvt[-0].value);
  1784.                 } break;
  1785. case 113:
  1786. # line 616 "as31.y"
  1787. {
  1788.                     set_md(yyval.mode,3);
  1789.                     set_ov(yyval.mode,yypvt[-0].value);
  1790.                     set_sz(yyval.mode,1);
  1791.                     set_b1(yyval.mode,yypvt[-2].value);
  1792.                 } break;
  1793. case 114:
  1794. # line 623 "as31.y"
  1795. {
  1796.                     set_md(yyval.mode,4);
  1797.                     set_ov(yyval.mode,0);
  1798.                     set_sz(yyval.mode,2);
  1799.                     set_b1(yyval.mode,yypvt[-0].value);
  1800.                     set_b2(yyval.mode,yypvt[-2].value);
  1801.                 } break;
  1802. case 115:
  1803. # line 631 "as31.y"
  1804. {
  1805.                     set_md(yyval.mode,5);
  1806.                     set_ov(yyval.mode,yypvt[-0].value);
  1807.                     set_sz(yyval.mode,1);
  1808.                     set_b1(yyval.mode,yypvt[-3].value);
  1809.                 } break;
  1810. case 116:
  1811. # line 638 "as31.y"
  1812. {
  1813.                     set_md(yyval.mode,6);
  1814.                     set_ov(yyval.mode,yypvt[-2].value);
  1815.                     set_sz(yyval.mode,0);
  1816.                 } break;
  1817. case 117:
  1818. # line 644 "as31.y"
  1819. {
  1820.                     set_md(yyval.mode,7);
  1821.                     set_ov(yyval.mode,yypvt[-2].value);
  1822.                     set_sz(yyval.mode,1);
  1823.                     set_b1(yyval.mode,yypvt[-0].value);
  1824.                 } break;
  1825. case 118:
  1826. # line 651 "as31.y"
  1827. {
  1828.                     set_md(yyval.mode,8);
  1829.                     set_ov(yyval.mode,yypvt[-3].value);
  1830.                     set_sz(yyval.mode,1);
  1831.                     set_b1(yyval.mode,yypvt[-0].value);
  1832.                 } break;
  1833. case 119:
  1834. # line 658 "as31.y"
  1835. {
  1836.                 set_md(yyval.mode,9);
  1837.                 set_ov(yyval.mode,0);
  1838.                 set_sz(yyval.mode,2);
  1839.                 set_b1(yyval.mode, (yypvt[-0].value & 0xff00) >> 8 );
  1840.                 set_b2(yyval.mode, (yypvt[-0].value & 0x00ff) );
  1841.             } break;
  1842. case 120:
  1843. # line 666 "as31.y"
  1844. {
  1845.                     set_md(yyval.mode,10);
  1846.                     set_ov(yyval.mode,0);
  1847.                     set_sz(yyval.mode,1);
  1848.                     set_b1(yyval.mode,yypvt[-0].value);
  1849.                 } break;
  1850. case 121:
  1851. # line 682 "as31.y"
  1852. {
  1853.                     set_md(yyval.mode,11);
  1854.                     set_ov(yyval.mode,0);
  1855.                     set_sz(yyval.mode,1);
  1856.                     set_b1(yyval.mode,yypvt[-2].value);
  1857.                 } break;
  1858. case 122:
  1859. # line 689 "as31.y"
  1860. {
  1861.     if( pass2 ) {
  1862.         if( !isbit8(yypvt[-3].value) )
  1863.             warning("Bit address exceeds 8-bits");
  1864.         if( isbmram(yypvt[-3].value) )
  1865.             set_b1(yyval.mode, (yypvt[-3].value-0x20)*8+ yypvt[-2].value );
  1866.         else if( isbmsfr(yypvt[-3].value) )
  1867.             set_b1(yyval.mode, yypvt[-3].value + yypvt[-2].value );
  1868.         else
  1869.             warning("Invalid bit addressable RAM location");
  1870.     }
  1871.     set_md(yyval.mode,11);
  1872.     set_ov(yyval.mode,0);
  1873.     set_sz(yyval.mode,1);
  1874. } break;
  1875. case 123:
  1876. # line 708 "as31.y"
  1877. {
  1878.                     set_md(yyval.mode,0);
  1879.                     set_ov(yyval.mode,0);
  1880.                     set_sz(yyval.mode,0);
  1881.                 } break;
  1882. case 124:
  1883. # line 715 "as31.y"
  1884. {
  1885.                     set_md(yyval.mode,1);
  1886.                     set_ov(yyval.mode,yypvt[-0].value);
  1887.                     set_sz(yyval.mode,0);
  1888.                 } break;
  1889. case 125:
  1890. # line 721 "as31.y"
  1891. {
  1892.                     set_md(yyval.mode,2);
  1893.                     set_ov(yyval.mode,0);
  1894.                     set_sz(yyval.mode,1);
  1895.                     set_b1(yyval.mode,yypvt[-0].value);
  1896.                 } break;
  1897. case 126:
  1898. # line 728 "as31.y"
  1899. {
  1900.                     set_md(yyval.mode,3);
  1901.                     set_ov(yyval.mode,yypvt[-0].value);
  1902.                     set_sz(yyval.mode,0);
  1903.                 } break;
  1904. case 127:
  1905. # line 736 "as31.y"
  1906. {
  1907.                     set_md(yyval.mode,0);
  1908.                     set_ov(yyval.mode,0);
  1909.                     set_sz(yyval.mode,0);
  1910.                 } break;
  1911. case 128:
  1912. # line 742 "as31.y"
  1913. {
  1914.                     set_md(yyval.mode,1);
  1915.                     set_ov(yyval.mode,0);
  1916.                     set_sz(yyval.mode,0);
  1917.                 } break;
  1918. case 129:
  1919. # line 748 "as31.y"
  1920. {
  1921.                     set_md(yyval.mode,2);
  1922.                     set_ov(yyval.mode,0);
  1923.                     set_sz(yyval.mode,1);
  1924.                     set_b1(yyval.mode,yypvt[-0].value);
  1925.                 } break;
  1926. case 130:
  1927. # line 757 "as31.y"
  1928. {
  1929.                     set_md(yyval.mode,0);
  1930.                     set_ov(yyval.mode,0);
  1931.                     set_sz(yyval.mode,2);
  1932.                     set_b1(yyval.mode,yypvt[-2].value);
  1933.                     set_b2(yyval.mode,yypvt[-0].value);
  1934.                 } break;
  1935. case 131:
  1936. # line 765 "as31.y"
  1937. {
  1938.                     set_md(yyval.mode,1);
  1939.                     set_ov(yyval.mode,0);
  1940.                     set_sz(yyval.mode,2);
  1941.                     set_b1(yyval.mode,yypvt[-2].value);
  1942.                     set_b2(yyval.mode,yypvt[-0].value);
  1943.                 } break;
  1944. case 132:
  1945. # line 773 "as31.y"
  1946. {
  1947.                     set_md(yyval.mode,2);
  1948.                     set_ov(yyval.mode,yypvt[-5].value);
  1949.                     set_sz(yyval.mode,2);
  1950.                     set_b1(yyval.mode,yypvt[-2].value);
  1951.                     set_b2(yyval.mode,yypvt[-0].value);
  1952.                 } break;
  1953. case 133:
  1954. # line 781 "as31.y"
  1955. {
  1956.                     set_md(yyval.mode,3);
  1957.                     set_ov(yyval.mode,yypvt[-5].value);
  1958.                     set_sz(yyval.mode,2);
  1959.                     set_b1(yyval.mode,yypvt[-2].value);
  1960.                     set_b2(yyval.mode,yypvt[-0].value);
  1961.                 } break;
  1962. case 134:
  1963. # line 791 "as31.y"
  1964. {
  1965.         long offset;
  1966.         if( pass2 ) {
  1967.             offset = yypvt[-0].val.v - (lc+3);
  1968.             if( offset > 127 || offset < -128 )
  1969.                warning("Relative offset exceeds -128 / +127");
  1970.             yyval.value = offset;
  1971.         }
  1972. } break;
  1973. case 135:
  1974. # line 808 "as31.y"
  1975. {
  1976.         long offset;
  1977.         if( pass2 ) {
  1978.             offset = yypvt[-0].val.v - (lc+2); /* different! */
  1979.             if( offset > 127 || offset < -128 )
  1980.                warning("Relative offset exceeds -128 / +127");
  1981.             yyval.value = offset;
  1982.         }
  1983. } break;
  1984. case 136:
  1985. # line 821 "as31.y"
  1986. {
  1987.     if( pass2 ) {
  1988.         if( !isbit8(yypvt[-1].value) )
  1989.             warning("Bit address exceeds 8-bits");
  1990.         if( isbmram(yypvt[-1].value) )
  1991.             yyval.value = (yypvt[-1].value-0x20)*8+yypvt[-0].value;
  1992.         else if( isbmsfr(yypvt[-1].value) )
  1993.             yyval.value = yypvt[-1].value + yypvt[-0].value;
  1994.         else
  1995.             warning("Invalid bit addressable RAM location");
  1996.     }
  1997. } break;
  1998. case 137:
  1999. # line 834 "as31.y"
  2000. {
  2001.     if( pass2 ) {
  2002.         if( !isbit8(yypvt[-0].value) )
  2003.             warning("Bit address exceeds 8-bits");
  2004.         yyval.value = yypvt[-0].value;
  2005.     }
  2006. } break;
  2007. case 138:
  2008. # line 844 "as31.y"
  2009. {
  2010.     if( yypvt[-0].sym->type == UNDEF && pass2 )
  2011.         error("Symbol %s undefined",yypvt[-0].sym->name);
  2012.     yyval.value = yypvt[-0].sym->value;
  2013. } break;
  2014. case 139:
  2015. # line 849 "as31.y"
  2016. { yyval.value = yypvt[-0].value; } break;
  2017. case 140:
  2018. # line 852 "as31.y"
  2019. { yyval.value = 0; } break;
  2020. case 141:
  2021. # line 853 "as31.y"
  2022. { yyval.value = 1; } break;
  2023. case 142:
  2024. # line 854 "as31.y"
  2025. { yyval.value = 2; } break;
  2026. case 143:
  2027. # line 855 "as31.y"
  2028. { yyval.value = 3; } break;
  2029. case 144:
  2030. # line 856 "as31.y"
  2031. { yyval.value = 4; } break;
  2032. case 145:
  2033. # line 857 "as31.y"
  2034. { yyval.value = 5; } break;
  2035. case 146:
  2036. # line 858 "as31.y"
  2037. { yyval.value = 6; } break;
  2038. case 147:
  2039. # line 859 "as31.y"
  2040. { yyval.value = 7; } break;
  2041. case 148:
  2042. # line 862 "as31.y"
  2043. { yyval.value = 0; } break;
  2044. case 149:
  2045. # line 863 "as31.y"
  2046. { yyval.value = 1; } break;
  2047. case 150:
  2048. # line 865 "as31.y"
  2049. { yyval.value = 0;
  2050.                   warning("Illegal indirect register: @r2"); } break;
  2051. case 151:
  2052. # line 868 "as31.y"
  2053. { yyval.value = 0;
  2054.                   warning("Illegal indirect register: @r3"); } break;
  2055. case 152:
  2056. # line 871 "as31.y"
  2057. { yyval.value = 0;
  2058.                   warning("Illegal indirect register: @r4"); } break;
  2059. case 153:
  2060. # line 874 "as31.y"
  2061. { yyval.value = 0;
  2062.                   warning("Illegal indirect register: @r5"); } break;
  2063. case 154:
  2064. # line 877 "as31.y"
  2065. { yyval.value = 0;
  2066.                   warning("Illegal indirect register: @r6"); } break;
  2067. case 155:
  2068. # line 880 "as31.y"
  2069. { yyval.value = 0;
  2070.                   warning("Illegal indirect register: @r7"); } break;
  2071. case 156:
  2072. # line 885 "as31.y"
  2073. {
  2074.     if( pass2 ) {
  2075.         if( !isbit8(yypvt[-0].val.v) )
  2076.             warning("Expression greater than 8-bits");
  2077.     }
  2078.     yyval.value = yypvt[-0].val.v;
  2079. } break;
  2080. case 157:
  2081. # line 895 "as31.y"
  2082. {
  2083.     if( pass2 ) {
  2084.         if( !isbit16(yypvt[-0].val.v) )
  2085.             warning("Expression greater than 16-bits");
  2086.     }
  2087.     yyval.value = yypvt[-0].val.v;
  2088. } break;
  2089. case 158:
  2090. # line 905 "as31.y"
  2091. {
  2092.         if( pass2 ) {
  2093.             if( !isbit16(yypvt[-0].val.v)  )
  2094.                 warning("Address greater than 16-bits");
  2095.             if( (yypvt[-0].val.v & size11) != ((lc+2) & size11) )
  2096.                 warning("Address outside current 2K page");
  2097.         }
  2098.         set_md(yyval.mode,0);
  2099.         set_ov(yyval.mode, (yypvt[-0].val.v&0x0700)>>3 );
  2100.         set_sz(yyval.mode,1);
  2101.         set_b1(yyval.mode,yypvt[-0].val.v&0x00ff);
  2102. } break;
  2103. case 159:
  2104. # line 920 "as31.y"
  2105. {
  2106.         if( pass2 ) {
  2107.             if( !isbit16(yypvt[-0].val.v)  )
  2108.                 warning("Address greater than 16-bits");
  2109.         }
  2110.         set_md(yyval.mode,0);
  2111.         set_ov(yyval.mode, 0 );
  2112.         set_sz(yyval.mode,2);
  2113.         set_b1(yyval.mode, (yypvt[-0].val.v & 0xff00 ) >> 8 );
  2114.         set_b2(yyval.mode, (yypvt[-0].val.v & 0x00ff ) );
  2115. } break;
  2116. case 160:
  2117. # line 934 "as31.y"
  2118. {
  2119.         long offset;
  2120.         if( pass2 ) {
  2121.             offset = yypvt[-0].val.v - (lc+2);
  2122.             if( offset>127 || offset<-128 )
  2123.                warning("Relative offset exceeds -128 / +127");
  2124.         }
  2125.         set_md(yyval.mode,0);
  2126.         set_ov(yyval.mode,0);
  2127.         set_sz(yyval.mode,1);
  2128.         set_b1(yyval.mode,offset);
  2129.  
  2130. } break;
  2131.     }
  2132.     goto yystack;        /* reset registers in driver code */
  2133. }
  2134.  
  2135. # ifdef __RUNTIME_YYMAXDEPTH
  2136.  
  2137. int allocate_stacks() {
  2138.     /* allocate the yys and yyv stacks */
  2139.     yys = (int *) malloc(yymaxdepth * sizeof(int));
  2140.     yyv = (YYSTYPE *) malloc(yymaxdepth * sizeof(YYSTYPE));
  2141.  
  2142.     if (yys==0 || yyv==0) {
  2143.        yyerror( (nl_msg(30004,"unable to allocate space for yacc stacks")) );
  2144.        return(1);
  2145.        }
  2146.     else return(0);
  2147.  
  2148. }
  2149.  
  2150.  
  2151. void free_stacks() {
  2152.     if (yys!=0) free(yys);
  2153.     if (yyv!=0) free(yyv);
  2154. }
  2155.  
  2156. # endif  /* defined(__RUNTIME_YYMAXDEPTH) */
  2157.