home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 1 / crawlyvol1.bin / program / compiler / fasbin21 / fas_src / as1805 / as1805.y < prev   
Text File  |  1990-12-11  |  33KB  |  1,487 lines

  1. %{
  2.  
  3. /*
  4. HEADER:     ;
  5. TITLE:         Frankenstein Cross Assemblers;
  6. VERSION:     2.0;
  7. DESCRIPTION: "    Reconfigurable Cross-assembler producing Intel (TM)
  8.         Hex format object records.  ";
  9. KEYWORDS:     cross-assemblers, 1805, 2650, 6301, 6502, 6805, 6809, 
  10.         6811, tms7000, 8048, 8051, 8096, z8, z80;
  11. SYSTEM:     UNIX, MS-Dos ;
  12. FILENAME:     as1805.y;
  13. WARNINGS:     "This software is in the public domain.  
  14.         Any prior copyright claims are relinquished.  
  15.  
  16.         This software is distributed with no warranty whatever.  
  17.         The author takes no responsibility for the consequences 
  18.         of its use.
  19.  
  20.         Yacc (or Bison) required to compile."  ;
  21. SEE-ALSO:     as1805.doc,frasmain.c;    
  22. AUTHORS:     Mark Zenier;
  23. COMPILERS:     Microport Sys V/AT, ATT Yacc, Turbo C V1.5, Bison (CUG disk 285)
  24.         (previous versions Xenix, Unisoft 68000 Version 7, Sun 3);
  25. */
  26. /* RCA 1802 instruction generation file */
  27. /* November 17, 1990 - character set support */
  28.  
  29. /*
  30.     description    frame work parser description for framework cross
  31.             assemblers
  32.     history        February 2, 1988
  33.             September 11, 1990 - merge table definition
  34.             September 12, 1990 - short file names
  35.             September 14, 1990 - short variable names
  36.             September 17, 1990 - use yylex as external
  37. */
  38. #include <stdio.h>
  39. #include "frasmdat.h"
  40. #include "fragcon.h"
  41.  
  42. #define yylex lexintercept
  43.  
  44. #define CPUMASK        0xc000
  45. #define CPU1802        0x4000    
  46. #define CPU1805        0xc000
  47. #define TS1802PLUS    0x4000    /* mask and match values in table */
  48. #define TS1805    0x8000    /* if select value & mask == mask */
  49. #define ST_INH 0x1
  50. #define ST_IMM 0x2
  51. #define ST_EXP 0x4
  52. #define ST_IO 0x1
  53. #define ST_REG 0x1
  54. #define ST_LDN 0x1
  55. #define ST_RLDI 0x1
  56. #define ST_DBNZ 0x1
  57.     
  58.     int    cpuselect = CPU1805;
  59.     static char    genbdef[] = "[1=];";
  60.     static char    genwdef[] = "[1=]x"; /* x for normal, y for byte rev */
  61.     char ignosyn[] = "[Xinvalid syntax for instruction";
  62.     char ignosel[] = "[Xinvalid operands/illegal instruction for cpu";
  63.  
  64.     long    labelloc;
  65.     static int satsub;
  66.     int    ifstkpt = 0;
  67.     int    fraifskip = FALSE;
  68.  
  69.     struct symel * endsymbol = SYMNULL;
  70.  
  71. %}
  72. %union {
  73.     int    intv;
  74.     long     longv;
  75.     char    *strng;
  76.     struct symel *symb;
  77. }
  78. %token <intv> KOC_BDEF
  79. %token <intv> KOC_ELSE
  80. %token <intv> KOC_END
  81. %token <intv> KOC_ENDI
  82. %token <intv> KOC_EQU
  83. %token <intv> KOC_IF
  84. %token <intv> KOC_INCLUDE
  85. %token <intv> KOC_ORG
  86. %token <intv> KOC_RESM
  87. %token <intv> KOC_SDEF
  88. %token <intv> KOC_SET
  89. %token <intv> KOC_WDEF
  90. %token <intv> KOC_CHSET
  91. %token <intv> KOC_CHDEF
  92. %token <intv> KOC_CHUSE
  93. %token <intv> KOC_opcode
  94. %token <intv> KOC_ioop
  95. %token <intv> KOC_regop
  96. %token <intv> KOC_ldn
  97. %token <intv> KOC_rldi
  98. %token <intv> KOC_dbnz
  99.  
  100. %token <longv> CONSTANT
  101. %token EOL
  102. %token KEOP_AND
  103. %token KEOP_DEFINED
  104. %token KEOP_EQ
  105. %token KEOP_GE
  106. %token KEOP_GT
  107. %token KEOP_HIGH
  108. %token KEOP_LE
  109. %token KEOP_LOW
  110. %token KEOP_LT
  111. %token KEOP_MOD
  112. %token KEOP_MUN
  113. %token KEOP_NE
  114. %token KEOP_NOT
  115. %token KEOP_OR
  116. %token KEOP_SHL
  117. %token KEOP_SHR
  118. %token KEOP_XOR
  119. %token KEOP_locctr
  120. %token <symb> LABEL
  121. %token <strng> STRING
  122. %token <symb> SYMBOL
  123.  
  124. %token KTK_invalid
  125.  
  126. %right    KEOP_HIGH KEOP_LOW
  127. %left    KEOP_OR KEOP_XOR
  128. %left    KEOP_AND
  129. %right    KEOP_NOT
  130. %nonassoc    KEOP_GT KEOP_GE KEOP_LE KEOP_LT KEOP_NE KEOP_EQ
  131. %left    '+' '-'
  132. %left    '*' '/' KEOP_MOD KEOP_SHL KEOP_SHR
  133. %right    KEOP_MUN
  134.  
  135.  
  136. %type <intv> expr exprlist stringlist
  137.  
  138. %start file
  139.  
  140. %%
  141.  
  142. file    :    file allline
  143.     |    allline
  144.     ;
  145.  
  146. allline    :     line EOL
  147.             {
  148.                 clrexpr();
  149.             }
  150.     |    EOL
  151.     |    error EOL
  152.             {
  153.                 clrexpr();
  154.                 yyerrok;
  155.             }
  156.     ;
  157.  
  158. line    :    LABEL KOC_END 
  159.             {
  160.                 endsymbol = $1;
  161.                 nextreadact = Nra_end;
  162.             }
  163.     |          KOC_END 
  164.             {
  165.                 nextreadact = Nra_end;
  166.             }
  167.     |    KOC_INCLUDE STRING
  168.             {
  169.         if(nextfstk >= FILESTKDPTH)
  170.         {
  171.             fraerror("include file nesting limit exceeded");
  172.         }
  173.         else
  174.         {
  175.             infilestk[nextfstk].fnm = savestring($2,strlen($2));
  176.             if( (infilestk[nextfstk].fpt = fopen($2,"r"))
  177.                 ==(FILE *)NULL )
  178.             {
  179.                 fraerror("cannot open include file");
  180.             }
  181.             else
  182.             {
  183.                 nextreadact = Nra_new;
  184.             }
  185.         }
  186.             }
  187.     |    LABEL KOC_EQU expr 
  188.             {
  189.                 if($1 -> seg == SSG_UNDEF)
  190.                 {
  191.                     pevalexpr(0, $3);
  192.                     if(evalr[0].seg == SSG_ABS)
  193.                     {
  194.                         $1 -> seg = SSG_EQU;
  195.                         $1 -> value = evalr[0].value;
  196.                         prtequvalue("C: 0x%lx\n",
  197.                             evalr[0].value);
  198.                     }
  199.                     else
  200.                     {
  201.                         fraerror(
  202.                     "noncomputable expression for EQU");
  203.                     }
  204.                 }
  205.                 else
  206.                 {
  207.                     fraerror(
  208.                 "cannot change symbol value with EQU");
  209.                 }
  210.             }
  211.     |    LABEL KOC_SET expr 
  212.             {
  213.                 if($1 -> seg == SSG_UNDEF
  214.                    || $1 -> seg == SSG_SET)
  215.                 {
  216.                     pevalexpr(0, $3);
  217.                     if(evalr[0].seg == SSG_ABS)
  218.                     {
  219.                         $1 -> seg = SSG_SET;
  220.                         $1 -> value = evalr[0].value;
  221.                         prtequvalue("C: 0x%lx\n",
  222.                             evalr[0].value);
  223.                     }
  224.                     else
  225.                     {
  226.                         fraerror(
  227.                     "noncomputable expression for SET");
  228.                     }
  229.                 }
  230.                 else
  231.                 {
  232.                     fraerror(
  233.                 "cannot change symbol value with SET");
  234.                 }
  235.             }
  236.     |    KOC_IF expr 
  237.             {
  238.         if((++ifstkpt) < IFSTKDEPTH)
  239.         {
  240.             pevalexpr(0, $2);
  241.             if(evalr[0].seg == SSG_ABS)
  242.             {
  243.                 if(evalr[0].value != 0)
  244.                 {
  245.                     elseifstk[ifstkpt] = If_Skip;
  246.                     endifstk[ifstkpt] = If_Active;
  247.                 }
  248.                 else
  249.                 {
  250.                     fraifskip = TRUE;
  251.                     elseifstk[ifstkpt] = If_Active;
  252.                     endifstk[ifstkpt] = If_Active;
  253.                 }
  254.             }
  255.             else
  256.             {
  257.                 fraifskip = TRUE;
  258.                 elseifstk[ifstkpt] = If_Active;
  259.                 endifstk[ifstkpt] = If_Active;
  260.             }
  261.         }
  262.         else
  263.         {
  264.             fraerror("IF stack overflow");
  265.         }
  266.             }
  267.                         
  268.     |    KOC_IF 
  269.             {
  270.         if(fraifskip) 
  271.         {
  272.             if((++ifstkpt) < IFSTKDEPTH)
  273.             {
  274.                     elseifstk[ifstkpt] = If_Skip;
  275.                     endifstk[ifstkpt] = If_Skip;
  276.             }
  277.             else
  278.             {
  279.                 fraerror("IF stack overflow");
  280.             }
  281.         }
  282.         else
  283.         {
  284.             yyerror("syntax error");
  285.             YYERROR;
  286.         }
  287.                 }
  288.                         
  289.     |    KOC_ELSE 
  290.             {
  291.                 switch(elseifstk[ifstkpt])
  292.                 {
  293.                 case If_Active:
  294.                     fraifskip = FALSE;
  295.                     break;
  296.                 
  297.                 case If_Skip:
  298.                     fraifskip = TRUE;
  299.                     break;
  300.                 
  301.                 case If_Err:
  302.                     fraerror("ELSE with no matching if");
  303.                     break;
  304.                 }
  305.             }
  306.  
  307.     |    KOC_ENDI 
  308.             {
  309.                 switch(endifstk[ifstkpt])
  310.                 {
  311.                 case If_Active:
  312.                     fraifskip = FALSE;
  313.                     ifstkpt--;
  314.                     break;
  315.                 
  316.                 case If_Skip:
  317.                     fraifskip = TRUE;
  318.                     ifstkpt--;
  319.                     break;
  320.                 
  321.                 case If_Err:
  322.                     fraerror("ENDI with no matching if");
  323.                     break;
  324.                 }
  325.             }
  326.     |    LABEL KOC_ORG expr 
  327.             {
  328.                 pevalexpr(0, $3);
  329.                 if(evalr[0].seg == SSG_ABS)
  330.                 {
  331.                     locctr = labelloc = evalr[0].value;
  332.                     if($1 -> seg == SSG_UNDEF)
  333.                     {
  334.                         $1 -> seg = SSG_ABS;
  335.                         $1 -> value = labelloc;
  336.                     }
  337.                     else
  338.                         fraerror(
  339.                         "multiple definition of label");
  340.                     prtequvalue("C: 0x%lx\n",
  341.                         evalr[0].value);
  342.                 }
  343.                 else
  344.                 {
  345.                     fraerror(
  346.                      "noncomputable expression for ORG");
  347.                 }
  348.             }
  349.     |          KOC_ORG expr 
  350.             {
  351.                 pevalexpr(0, $2);
  352.                 if(evalr[0].seg == SSG_ABS)
  353.                 {
  354.                     locctr = labelloc = evalr[0].value;
  355.                     prtequvalue("C: 0x%lx\n",
  356.                         evalr[0].value);
  357.                 }
  358.                 else
  359.                 {
  360.                     fraerror(
  361.                      "noncomputable expression for ORG");
  362.                 }
  363.             }
  364.     |    LABEL KOC_CHSET
  365.             {
  366.                 if($1 -> seg == SSG_UNDEF)
  367.                 {
  368.                     $1 -> seg = SSG_EQU;
  369.                     if( ($1->value = chtcreate()) <= 0)
  370.                     {
  371.         fraerror( "cannot create character translation table");
  372.                     }
  373.                     prtequvalue("C: 0x%lx\n", $1 -> value);
  374.                 }
  375.                 else
  376.                 {
  377.             fraerror( "multiple definition of label");
  378.                 }
  379.             }
  380.     |        KOC_CHUSE
  381.             {
  382.                 chtcpoint = (int *) NULL;
  383.                 prtequvalue("C: 0x%lx\n", 0L);
  384.             }
  385.     |        KOC_CHUSE expr
  386.             {
  387.                 pevalexpr(0, $2);
  388.                 if( evalr[0].seg == SSG_ABS)
  389.                 {
  390.                     if( evalr[0].value == 0)
  391.                     {
  392.                         chtcpoint = (int *)NULL;
  393.                         prtequvalue("C: 0x%lx\n", 0L);
  394.                     }
  395.                     else if(evalr[0].value < chtnxalph)
  396.                     {
  397.                 chtcpoint = chtatab[evalr[0].value];
  398.                 prtequvalue("C: 0x%lx\n", evalr[0].value);
  399.                     }
  400.                     else
  401.                     {
  402.             fraerror("nonexistent character translation table");
  403.                     }
  404.                 }
  405.                 else
  406.                 {
  407.                     fraerror("noncomputable expression");
  408.                 }
  409.             }
  410.     |        KOC_CHDEF STRING ',' exprlist
  411.             {
  412.         int findrv, numret, *charaddr;
  413.         char *sourcestr = $2, *before;
  414.  
  415.         if(chtnpoint != (int *)NULL)
  416.         {
  417.             for(satsub = 0; satsub < $4; satsub++)
  418.             {
  419.                 before = sourcestr;
  420.  
  421.                 pevalexpr(0, exprlist[satsub]);
  422.                 findrv = chtcfind(chtnpoint, &sourcestr,
  423.                         &charaddr, &numret);
  424.                 if(findrv == CF_END)
  425.                 {
  426.             fraerror("more expressions than characters");
  427.                     break;
  428.                 }
  429.  
  430.                 if(evalr[0].seg == SSG_ABS)
  431.                 {
  432.                     switch(findrv)
  433.                     {
  434.                     case CF_UNDEF:
  435.                         {
  436.                 if(evalr[0].value < 0 ||
  437.                     evalr[0].value > 255)
  438.                 {
  439.             frawarn("character translation value truncated");
  440.                 }
  441.                 *charaddr = evalr[0].value & 0xff;
  442.                 prtequvalue("C: 0x%lx\n", evalr[0].value);
  443.                         }
  444.                         break;
  445.  
  446.                     case CF_INVALID:
  447.                     case CF_NUMBER:
  448.                 fracherror("invalid character to define", 
  449.                     before, sourcestr);
  450.                         break;
  451.  
  452.                     case CF_CHAR:
  453.                 fracherror("character already defined", 
  454.                     before, sourcestr);
  455.                         break;
  456.                     }
  457.                 }
  458.                 else
  459.                 {
  460.                     fraerror("noncomputable expression");
  461.                 }
  462.             }
  463.  
  464.             if( *sourcestr != '\0')
  465.             {
  466.                 fraerror("more characters than expressions");
  467.             }
  468.         }
  469.         else
  470.         {
  471.             fraerror("no CHARSET statement active");
  472.         }
  473.             
  474.             }
  475.     |    LABEL 
  476.             {
  477.             if($1 -> seg == SSG_UNDEF)
  478.             {
  479.                 $1 -> seg = SSG_ABS;
  480.                 $1 -> value = labelloc;
  481.                 prtequvalue("C: 0x%lx\n", labelloc);
  482.  
  483.             }
  484.             else
  485.                 fraerror(
  486.                 "multiple definition of label");
  487.             }
  488.     |    labeledline
  489.     ;
  490.  
  491. labeledline :    LABEL genline
  492.             {
  493.             if($1 -> seg == SSG_UNDEF)
  494.             {
  495.                 $1 -> seg = SSG_ABS;
  496.                 $1 -> value = labelloc;
  497.             }
  498.             else
  499.                 fraerror(
  500.                 "multiple definition of label");
  501.             labelloc = locctr;
  502.             }
  503.                 
  504.     |    genline
  505.             {
  506.                 labelloc = locctr;
  507.             }
  508.     ;
  509.  
  510. genline    :    KOC_BDEF    exprlist 
  511.             {
  512.                 genlocrec(currseg, labelloc);
  513.                 for( satsub = 0; satsub < $2; satsub++)
  514.                 {
  515.                     pevalexpr(1, exprlist[satsub]);
  516.                     locctr += geninstr(genbdef);
  517.                 }
  518.             }
  519.     |    KOC_SDEF stringlist 
  520.             {
  521.                 genlocrec(currseg, labelloc);
  522.                 for(satsub = 0; satsub < $2; satsub++)
  523.                 {
  524.                     locctr += genstring(stringlist[satsub]);
  525.                 }
  526.             }
  527.     |    KOC_WDEF exprlist 
  528.             {
  529.                 genlocrec(currseg, labelloc);
  530.                 for( satsub = 0; satsub < $2; satsub++)
  531.                 {
  532.                     pevalexpr(1, exprlist[satsub]);
  533.                     locctr += geninstr(genwdef);
  534.                 }
  535.             }    
  536.     |    KOC_RESM expr 
  537.             {
  538.                 pevalexpr(0, $2);
  539.                 if(evalr[0].seg == SSG_ABS)
  540.                 {
  541.                     locctr = labelloc + evalr[0].value;
  542.                     prtequvalue("C: 0x%lx\n", labelloc);
  543.                 }
  544.                 else
  545.                 {
  546.                     fraerror(
  547.                  "noncomputable result for RMB expression");
  548.                 }
  549.             }
  550.     ;
  551.  
  552. exprlist :    exprlist ',' expr
  553.             {
  554.                 exprlist[nextexprs ++ ] = $3;
  555.                 $$ = nextexprs;
  556.             }
  557.     |    expr
  558.             {
  559.                 nextexprs = 0;
  560.                 exprlist[nextexprs ++ ] = $1;
  561.                 $$ = nextexprs;
  562.             }
  563.     ;
  564.  
  565. stringlist :    stringlist ',' STRING
  566.             {
  567.                 stringlist[nextstrs ++ ] = $3;
  568.                 $$ = nextstrs;
  569.             }
  570.     |    STRING
  571.             {
  572.                 nextstrs = 0;
  573.                 stringlist[nextstrs ++ ] = $1;
  574.                 $$ = nextstrs;
  575.             }
  576.     ;
  577.  
  578.  
  579. genline : KOC_opcode 
  580.             {
  581.         genlocrec(currseg, labelloc);
  582.         locctr += geninstr( findgen( $1, ST_INH, cpuselect
  583.                 ));
  584.             }
  585.     ;
  586. genline : KOC_opcode  '#' expr
  587.             {
  588.         genlocrec(currseg, labelloc);
  589.         pevalexpr(1, $3);
  590.         locctr += geninstr( findgen( $1, ST_IMM, cpuselect
  591.                 ));
  592.             }
  593.     ;
  594. genline : KOC_opcode  expr
  595.             {
  596.         genlocrec(currseg, labelloc);
  597.         pevalexpr(1, $2);
  598.         locctr += geninstr( findgen( $1, ST_EXP, cpuselect
  599.                 ));
  600.             }
  601.     ;
  602. genline : KOC_ioop  expr
  603.             {
  604.         genlocrec(currseg, labelloc);
  605.         pevalexpr(1, $2);
  606.         if(evalr[1].seg != SSG_ABS
  607.             || evalr[1].value < 1
  608.             || evalr[1].value > 7 )
  609.         {
  610.             fraerror("invalid IO port");
  611.             evalr[1].value = 0;
  612.         }
  613.         locctr += geninstr( findgen( $1, ST_IO, cpuselect
  614.                 ));
  615.             }
  616.     ;
  617. genline : KOC_regop  expr
  618.             {
  619.         genlocrec(currseg, labelloc);
  620.         pevalexpr(1, $2);
  621.         if(evalr[1].seg != SSG_ABS
  622.             || evalr[1].value < 0
  623.             || evalr[1].value > 15  )
  624.         {
  625.             fraerror("invalid register expression");
  626.             evalr[1].value = 0;
  627.         }
  628.         locctr += geninstr( findgen( $1, ST_REG, cpuselect
  629.                 ));
  630.             }
  631.     ;
  632. genline : KOC_ldn  expr
  633.             {
  634.         genlocrec(currseg, labelloc);
  635.         pevalexpr(1, $2);
  636.         if(evalr[1].seg != SSG_ABS
  637.             || evalr[1].value < 1
  638.             || evalr[1].value > 15  )
  639.         {
  640.             fraerror("invalid register expression");
  641.             evalr[1].value = 0;
  642.         }
  643.         locctr += geninstr( findgen( $1, ST_LDN, cpuselect
  644.                 ));
  645.             }
  646.     ;
  647. genline : KOC_rldi  expr ',' '#' expr
  648.             {
  649.         genlocrec(currseg, labelloc);
  650.         pevalexpr(1, $2);
  651.         pevalexpr(2, $5);
  652.         if(evalr[1].seg != SSG_ABS
  653.             || evalr[1].value < 0
  654.             || evalr[1].value > 15  )
  655.         {
  656.             fraerror("invalid register expression");
  657.             evalr[1].value = 0;
  658.         }
  659.         locctr += geninstr( findgen( $1, ST_RLDI, cpuselect
  660.                 ));
  661.             }
  662.     ;
  663. genline : KOC_dbnz  expr ',' expr
  664.             {
  665.         genlocrec(currseg, labelloc);
  666.         pevalexpr(1, $2);
  667.         pevalexpr(2, $4);
  668.         if(evalr[1].seg != SSG_ABS
  669.             || evalr[1].value < 0
  670.             || evalr[1].value > 15  )
  671.         {
  672.             fraerror("invalid register expression");
  673.             evalr[1].value = 0;
  674.         }
  675.         locctr += geninstr( findgen( $1, ST_DBNZ, cpuselect
  676.                 ));
  677.             }
  678.     ;
  679. expr    :    '+' expr %prec KEOP_MUN
  680.             {
  681.                 $$ = $2;
  682.             }
  683.     |    '-' expr %prec KEOP_MUN
  684.             {
  685.                 $$ = exprnode(PCCASE_UN,$2,IFC_NEG,0,0L,
  686.                     SYMNULL);
  687.             }
  688.     |    KEOP_NOT expr
  689.             {
  690.                 $$ = exprnode(PCCASE_UN,$2,IFC_NOT,0,0L,
  691.                     SYMNULL);
  692.             }
  693.     |    KEOP_HIGH expr
  694.             {
  695.                 $$ = exprnode(PCCASE_UN,$2,IFC_HIGH,0,0L,
  696.                     SYMNULL);
  697.             }
  698.     |    KEOP_LOW expr
  699.             {
  700.                 $$ = exprnode(PCCASE_UN,$2,IFC_LOW,0,0L,
  701.                     SYMNULL);
  702.             }
  703.     |    expr '*' expr
  704.             {
  705.                 $$ = exprnode(PCCASE_BIN,$1,IFC_MUL,$3,0L,
  706.                     SYMNULL);
  707.             }
  708.     |    expr '/' expr
  709.             {
  710.                 $$ = exprnode(PCCASE_BIN,$1,IFC_DIV,$3,0L,
  711.                     SYMNULL);
  712.             }
  713.     |    expr '+' expr
  714.             {
  715.                 $$ = exprnode(PCCASE_BIN,$1,IFC_ADD,$3,0L,
  716.                     SYMNULL);
  717.             }
  718.     |    expr '-' expr
  719.             {
  720.                 $$ = exprnode(PCCASE_BIN,$1,IFC_SUB,$3,0L,
  721.                     SYMNULL);
  722.             }
  723.     |    expr KEOP_MOD expr
  724.             {
  725.                 $$ = exprnode(PCCASE_BIN,$1,IFC_MOD,$3,0L,
  726.                     SYMNULL);
  727.             }
  728.     |    expr KEOP_SHL expr
  729.             {
  730.                 $$ = exprnode(PCCASE_BIN,$1,IFC_SHL,$3,0L,
  731.                     SYMNULL);
  732.             }
  733.     |    expr KEOP_SHR expr
  734.             {
  735.                 $$ = exprnode(PCCASE_BIN,$1,IFC_SHR,$3,0L,
  736.                     SYMNULL);
  737.             }
  738.     |    expr KEOP_GT expr
  739.             {
  740.                 $$ = exprnode(PCCASE_BIN,$1,IFC_GT,$3,0L,
  741.                     SYMNULL);
  742.             }
  743.     |    expr KEOP_GE expr
  744.             {
  745.                 $$ = exprnode(PCCASE_BIN,$1,IFC_GE,$3,0L,
  746.                     SYMNULL);
  747.             }
  748.     |    expr KEOP_LT expr
  749.             {
  750.                 $$ = exprnode(PCCASE_BIN,$1,IFC_LT,$3,0L,
  751.                     SYMNULL);
  752.             }
  753.     |    expr KEOP_LE expr
  754.             {
  755.                 $$ = exprnode(PCCASE_BIN,$1,IFC_LE,$3,0L,
  756.                     SYMNULL);
  757.             }
  758.     |    expr KEOP_NE expr
  759.             {
  760.                 $$ = exprnode(PCCASE_BIN,$1,IFC_NE,$3,0L,
  761.                     SYMNULL);
  762.             }
  763.     |    expr KEOP_EQ expr
  764.             {
  765.                 $$ = exprnode(PCCASE_BIN,$1,IFC_EQ,$3,0L,
  766.                     SYMNULL);
  767.             }
  768.     |    expr KEOP_AND expr
  769.             {
  770.                 $$ = exprnode(PCCASE_BIN,$1,IFC_AND,$3,0L,
  771.                     SYMNULL);
  772.             }
  773.     |    expr KEOP_OR expr
  774.             {
  775.                 $$ = exprnode(PCCASE_BIN,$1,IFC_OR,$3,0L,
  776.                     SYMNULL);
  777.             }
  778.     |    expr KEOP_XOR expr
  779.             {
  780.                 $$ = exprnode(PCCASE_BIN,$1,IFC_XOR,$3,0L,
  781.                     SYMNULL);
  782.             }
  783.     |    KEOP_DEFINED SYMBOL
  784.             {
  785.                 $$ = exprnode(PCCASE_DEF,0,IGP_DEFINED,0,0L,$2);
  786.             }
  787.     |    SYMBOL
  788.             {
  789.                 $$ = exprnode(PCCASE_SYMB,0,IFC_SYMB,0,0L,$1);
  790.             }
  791.     |    '*'
  792.             {
  793.                 $$ = exprnode(PCCASE_PROGC,0,IFC_PROGCTR,0,
  794.                     labelloc, SYMNULL);
  795.             }
  796.     |    CONSTANT
  797.             {
  798.                 $$ = exprnode(PCCASE_CONS,0,IGP_CONSTANT,0,$1,
  799.                     SYMNULL);
  800.             }
  801.     |    STRING
  802.             {
  803.                 char *sourcestr = $1;
  804.                 long accval = 0;
  805.  
  806.                 if(strlen($1) > 0)
  807.                 {
  808.                     accval = chtran(&sourcestr);
  809.                     if(*sourcestr != '\0')
  810.                     {
  811.                         accval = (accval << 8) +
  812.                             chtran(&sourcestr);
  813.                     }
  814.  
  815.                     if( *sourcestr != '\0')
  816.                     {
  817.     frawarn("string constant in expression more than 2 characters long");
  818.                     }
  819.                 }
  820.                 $$ = exprnode(PCCASE_CONS, 0, IGP_CONSTANT, 0,
  821.                     accval, SYMNULL);
  822.             }
  823.     |    '(' expr ')'
  824.             {
  825.                 $$ = $2;
  826.             }
  827.     ;
  828.  
  829.  
  830. %%
  831.  
  832. lexintercept()
  833. /*
  834.     description    intercept the call to yylex (the lexical analyzer)
  835.             and filter out all unnecessary tokens when skipping
  836.             the input between a failed IF and its matching ENDI or
  837.             ELSE
  838.     globals     fraifskip    the enable flag
  839. */
  840. {
  841. #undef yylex
  842.  
  843.     int rv;
  844.  
  845.     if(fraifskip)
  846.     {
  847.         for(;;)
  848.         {
  849.  
  850.             switch(rv = yylex())
  851.  
  852.             {
  853.             case 0:
  854.             case KOC_END:
  855.             case KOC_IF:
  856.             case KOC_ELSE:
  857.             case KOC_ENDI:
  858.             case EOL:
  859.                 return rv;
  860.             default:
  861.                 break;
  862.             }
  863.         }
  864.     }
  865.     else
  866.         return yylex();
  867. #define yylex lexintercept
  868. }
  869.  
  870.  
  871. setreserved()
  872. {
  873.  
  874.     reservedsym("and", KEOP_AND, 0);
  875.     reservedsym("defined", KEOP_DEFINED,0);
  876.     reservedsym("eq", KEOP_EQ, 0);
  877.     reservedsym("ge", KEOP_GE, 0);
  878.     reservedsym("gt", KEOP_GT, 0);
  879.     reservedsym("high", KEOP_HIGH, 0);
  880.     reservedsym("le", KEOP_LE, 0);
  881.     reservedsym("low", KEOP_LOW, 0);
  882.     reservedsym("lt", KEOP_LT, 0);
  883.     reservedsym("mod", KEOP_MOD, 0);
  884.     reservedsym("ne", KEOP_NE, 0);
  885.     reservedsym("not", KEOP_NOT, 0);
  886.     reservedsym("or", KEOP_OR, 0);
  887.     reservedsym("shl", KEOP_SHL, 0);
  888.     reservedsym("shr", KEOP_SHR, 0);
  889.     reservedsym("xor", KEOP_XOR, 0);
  890.     reservedsym("AND", KEOP_AND, 0);
  891.     reservedsym("DEFINED", KEOP_DEFINED,0);
  892.     reservedsym("EQ", KEOP_EQ, 0);
  893.     reservedsym("GE", KEOP_GE, 0);
  894.     reservedsym("GT", KEOP_GT, 0);
  895.     reservedsym("HIGH", KEOP_HIGH, 0);
  896.     reservedsym("LE", KEOP_LE, 0);
  897.     reservedsym("LOW", KEOP_LOW, 0);
  898.     reservedsym("LT", KEOP_LT, 0);
  899.     reservedsym("MOD", KEOP_MOD, 0);
  900.     reservedsym("NE", KEOP_NE, 0);
  901.     reservedsym("NOT", KEOP_NOT, 0);
  902.     reservedsym("OR", KEOP_OR, 0);
  903.     reservedsym("SHL", KEOP_SHL, 0);
  904.     reservedsym("SHR", KEOP_SHR, 0);
  905.     reservedsym("XOR", KEOP_XOR, 0);
  906.  
  907. }
  908.  
  909. cpumatch(str)
  910.     char * str;
  911. {
  912.     int msub;
  913.  
  914.     static struct
  915.     {
  916.         char * mtch;
  917.         int   cpuv;
  918.     } matchtab[] =
  919.     {
  920.         {"02", CPU1802 },
  921.         {"05", CPU1805 },
  922.         {"04", CPU1805 },
  923.         {"06", CPU1805 },
  924.         {"", 0} 
  925.     };
  926.  
  927.     for(msub = 0; matchtab[msub].cpuv != 0; msub++)
  928.     {
  929.         if(strcontains(str, matchtab[msub].mtch))
  930.         {
  931.             cpuselect = matchtab[msub].cpuv;
  932.             return TRUE;
  933.         }
  934.     }
  935.  
  936.     return FALSE;
  937. }
  938.  
  939.  
  940. strcontains(s1, sm)
  941.     char * s1, *sm;
  942. {
  943.     int l1 = strlen(s1), lm = strlen(sm);
  944.  
  945.     for(; l1 >= lm; l1--, s1++)
  946.     {
  947.         if(strncmp(s1, sm, lm) == 0)
  948.         {
  949.             return TRUE;
  950.         }
  951.     }
  952.     return FALSE;
  953. }
  954.  
  955. /*
  956.     description    Opcode and Instruction generation tables
  957.     usage        Unix, framework crossassembler
  958.     history        September 25, 1987
  959. */
  960.  
  961. #define NUMOPCODE 143
  962. #define NUMSYNBLK 121
  963. #define NUMDIFFOP 121
  964.  
  965. int gnumopcode = NUMOPCODE;
  966.  
  967. int ophashlnk[NUMOPCODE];
  968.  
  969. struct opsym optab[NUMOPCODE+1]
  970.     = {
  971.     {"invalid", KOC_opcode, 2, 0 },
  972.     {"ADC", KOC_opcode, 1, 2 },
  973.     {"ADCI", KOC_opcode, 1, 3 },
  974.     {"ADD", KOC_opcode, 1, 4 },
  975.     {"ADI", KOC_opcode, 1, 5 },
  976.     {"AND", KOC_opcode, 1, 6 },
  977.     {"ANI", KOC_opcode, 1, 7 },
  978.     {"B1", KOC_opcode, 1, 8 },
  979.     {"B2", KOC_opcode, 1, 9 },
  980.     {"B3", KOC_opcode, 1, 10 },
  981.     {"B4", KOC_opcode, 1, 11 },
  982.     {"BCI", KOC_opcode, 1, 12 },
  983.     {"BDF", KOC_opcode, 1, 13 },
  984.     {"BGE", KOC_opcode, 1, 14 },
  985.     {"BL", KOC_opcode, 1, 15 },
  986.     {"BM", KOC_opcode, 1, 16 },
  987.     {"BN1", KOC_opcode, 1, 17 },
  988.     {"BN2", KOC_opcode, 1, 18 },
  989.     {"BN3", KOC_opcode, 1, 19 },
  990.     {"BN4", KOC_opcode, 1, 20 },
  991.     {"BNF", KOC_opcode, 1, 21 },
  992.     {"BNQ", KOC_opcode, 1, 22 },
  993.     {"BNZ", KOC_opcode, 1, 23 },
  994.     {"BPZ", KOC_opcode, 1, 24 },
  995.     {"BQ", KOC_opcode, 1, 25 },
  996.     {"BR", KOC_opcode, 1, 26 },
  997.     {"BXI", KOC_opcode, 1, 27 },
  998.     {"BYTE", KOC_BDEF, 0, 0 },
  999.     {"BZ", KOC_opcode, 1, 28 },
  1000.     {"CHARDEF", KOC_CHDEF, 0, 0 },
  1001.     {"CHARSET", KOC_CHSET, 0, 0 },
  1002.     {"CHARUSE", KOC_CHUSE, 0, 0 },
  1003.     {"CHD", KOC_CHDEF, 0, 0 },
  1004.     {"CID", KOC_opcode, 1, 29 },
  1005.     {"CIE", KOC_opcode, 1, 30 },
  1006.     {"DACI", KOC_opcode, 1, 31 },
  1007.     {"DADC", KOC_opcode, 1, 32 },
  1008.     {"DADD", KOC_opcode, 1, 33 },
  1009.     {"DADI", KOC_opcode, 1, 34 },
  1010.     {"DB", KOC_BDEF, 0, 0 },
  1011.     {"DBNZ", KOC_dbnz, 1, 35 },
  1012.     {"DEC", KOC_regop, 1, 36 },
  1013.     {"DIS", KOC_opcode, 1, 37 },
  1014.     {"DSAV", KOC_opcode, 1, 38 },
  1015.     {"DSBI", KOC_opcode, 1, 39 },
  1016.     {"DSM", KOC_opcode, 1, 40 },
  1017.     {"DSMB", KOC_opcode, 1, 41 },
  1018.     {"DSMI", KOC_opcode, 1, 42 },
  1019.     {"DTC", KOC_opcode, 1, 43 },
  1020.     {"DW", KOC_WDEF, 0, 0 },
  1021.     {"ELSE", KOC_ELSE, 0, 0 },
  1022.     {"END", KOC_END, 0, 0 },
  1023.     {"ENDI", KOC_ENDI, 0, 0 },
  1024.     {"EQU", KOC_EQU, 0, 0 },
  1025.     {"ETQ", KOC_opcode, 1, 44 },
  1026.     {"FCB", KOC_BDEF, 0, 0 },
  1027.     {"FCC", KOC_SDEF, 0, 0 },
  1028.     {"FDB", KOC_WDEF, 0, 0 },
  1029.     {"GEC", KOC_opcode, 1, 45 },
  1030.     {"GHI", KOC_regop, 1, 46 },
  1031.     {"GLO", KOC_regop, 1, 47 },
  1032.     {"IDL", KOC_opcode, 1, 48 },
  1033.     {"IF", KOC_IF, 0, 0 },
  1034.     {"INC", KOC_regop, 1, 49 },
  1035.     {"INCL", KOC_INCLUDE, 0, 0 },
  1036.     {"INCLUDE", KOC_INCLUDE, 0, 0 },
  1037.     {"INP", KOC_ioop, 1, 50 },
  1038.     {"IRX", KOC_opcode, 1, 51 },
  1039.     {"LBDF", KOC_opcode, 1, 52 },
  1040.     {"LBNF", KOC_opcode, 1, 53 },
  1041.     {"LBNQ", KOC_opcode, 1, 54 },
  1042.     {"LBNZ", KOC_opcode, 1, 55 },
  1043.     {"LBQ", KOC_opcode, 1, 56 },
  1044.     {"LBR", KOC_opcode, 1, 57 },
  1045.     {"LBZ", KOC_opcode, 1, 58 },
  1046.     {"LDA", KOC_regop, 1, 59 },
  1047.     {"LDC", KOC_opcode, 1, 60 },
  1048.     {"LDI", KOC_opcode, 1, 61 },
  1049.     {"LDN", KOC_ldn, 1, 62 },
  1050.     {"LDX", KOC_opcode, 1, 63 },
  1051.     {"LDXA", KOC_opcode, 1, 64 },
  1052.     {"LSDF", KOC_opcode, 1, 65 },
  1053.     {"LSIE", KOC_opcode, 1, 66 },
  1054.     {"LSKP", KOC_opcode, 1, 67 },
  1055.     {"LSNF", KOC_opcode, 1, 68 },
  1056.     {"LSNQ", KOC_opcode, 1, 69 },
  1057.     {"LSNZ", KOC_opcode, 1, 70 },
  1058.     {"LSQ", KOC_opcode, 1, 71 },
  1059.     {"LSZ", KOC_opcode, 1, 72 },
  1060.     {"MARK", KOC_opcode, 1, 73 },
  1061.     {"NBR", KOC_opcode, 1, 74 },
  1062.     {"NLBR", KOC_opcode, 1, 75 },
  1063.     {"NOP", KOC_opcode, 1, 76 },
  1064.     {"OR", KOC_opcode, 1, 77 },
  1065.     {"ORG", KOC_ORG, 0, 0 },
  1066.     {"ORI", KOC_opcode, 1, 78 },
  1067.     {"OUT", KOC_ioop, 1, 79 },
  1068.     {"PHI", KOC_regop, 1, 80 },
  1069.     {"PLO", KOC_regop, 1, 81 },
  1070.     {"REQ", KOC_opcode, 1, 82 },
  1071.     {"RESERVE", KOC_RESM, 0, 0 },
  1072.     {"RET", KOC_opcode, 1, 83 },
  1073.     {"RLDI", KOC_rldi, 1, 84 },
  1074.     {"RLXA", KOC_regop, 1, 85 },
  1075.     {"RMB", KOC_RESM, 0, 0 },
  1076.     {"RNX", KOC_regop, 1, 86 },
  1077.     {"RSHL", KOC_opcode, 1, 87 },
  1078.     {"RSHR", KOC_opcode, 1, 88 },
  1079.     {"RSXD", KOC_regop, 1, 89 },
  1080.     {"SAV", KOC_opcode, 1, 90 },
  1081.     {"SCAL", KOC_dbnz, 1, 91 },
  1082.     {"SCM1", KOC_opcode, 1, 92 },
  1083.     {"SCM2", KOC_opcode, 1, 93 },
  1084.     {"SD", KOC_opcode, 1, 94 },
  1085.     {"SDB", KOC_opcode, 1, 95 },
  1086.     {"SDBI", KOC_opcode, 1, 96 },
  1087.     {"SDI", KOC_opcode, 1, 97 },
  1088.     {"SEP", KOC_regop, 1, 98 },
  1089.     {"SEQ", KOC_opcode, 1, 99 },
  1090.     {"SET", KOC_SET, 0, 0 },
  1091.     {"SEX", KOC_regop, 1, 100 },
  1092.     {"SHL", KOC_opcode, 1, 101 },
  1093.     {"SHLC", KOC_opcode, 1, 102 },
  1094.     {"SHR", KOC_opcode, 1, 103 },
  1095.     {"SHRC", KOC_opcode, 1, 104 },
  1096.     {"SKP", KOC_opcode, 1, 105 },
  1097.     {"SM", KOC_opcode, 1, 106 },
  1098.     {"SMB", KOC_opcode, 1, 107 },
  1099.     {"SMBI", KOC_opcode, 1, 108 },
  1100.     {"SMI", KOC_opcode, 1, 109 },
  1101.     {"SPM1", KOC_opcode, 1, 110 },
  1102.     {"SPM2", KOC_opcode, 1, 111 },
  1103.     {"SRET", KOC_regop, 1, 112 },
  1104.     {"STM", KOC_opcode, 1, 113 },
  1105.     {"STPC", KOC_opcode, 1, 114 },
  1106.     {"STR", KOC_regop, 1, 115 },
  1107.     {"STRING", KOC_SDEF, 0, 0 },
  1108.     {"STXD", KOC_opcode, 1, 116 },
  1109.     {"WORD", KOC_WDEF, 0, 0 },
  1110.     {"XID", KOC_opcode, 1, 117 },
  1111.     {"XIE", KOC_opcode, 1, 118 },
  1112.     {"XOR", KOC_opcode, 1, 119 },
  1113.     {"XRI", KOC_opcode, 1, 120 },
  1114.     { "", 0, 0, 0 }};
  1115.  
  1116. struct opsynt ostab[NUMSYNBLK+1]
  1117.     = {
  1118. /* invalid 0 */ { 0, 1, 0 },
  1119. /* invalid 1 */ { 0xffff, 1, 1 },
  1120. /* ADC 2 */ { ST_INH, 1, 2 },
  1121. /* ADCI 3 */ { ST_IMM, 1, 3 },
  1122. /* ADD 4 */ { ST_INH, 1, 4 },
  1123. /* ADI 5 */ { ST_IMM, 1, 5 },
  1124. /* AND 6 */ { ST_INH, 1, 6 },
  1125. /* ANI 7 */ { ST_IMM, 1, 7 },
  1126. /* B1 8 */ { ST_EXP, 1, 8 },
  1127. /* B2 9 */ { ST_EXP, 1, 9 },
  1128. /* B3 10 */ { ST_EXP, 1, 10 },
  1129. /* B4 11 */ { ST_EXP, 1, 11 },
  1130. /* BCI 12 */ { ST_EXP, 1, 12 },
  1131. /* BDF 13 */ { ST_EXP, 1, 13 },
  1132. /* BGE 14 */ { ST_EXP, 1, 14 },
  1133. /* BL 15 */ { ST_EXP, 1, 15 },
  1134. /* BM 16 */ { ST_EXP, 1, 16 },
  1135. /* BN1 17 */ { ST_EXP, 1, 17 },
  1136. /* BN2 18 */ { ST_EXP, 1, 18 },
  1137. /* BN3 19 */ { ST_EXP, 1, 19 },
  1138. /* BN4 20 */ { ST_EXP, 1, 20 },
  1139. /* BNF 21 */ { ST_EXP, 1, 21 },
  1140. /* BNQ 22 */ { ST_EXP, 1, 22 },
  1141. /* BNZ 23 */ { ST_EXP, 1, 23 },
  1142. /* BPZ 24 */ { ST_EXP, 1, 24 },
  1143. /* BQ 25 */ { ST_EXP, 1, 25 },
  1144. /* BR 26 */ { ST_EXP, 1, 26 },
  1145. /* BXI 27 */ { ST_EXP, 1, 27 },
  1146. /* BZ 28 */ { ST_EXP, 1, 28 },
  1147. /* CID 29 */ { ST_INH, 1, 29 },
  1148. /* CIE 30 */ { ST_INH, 1, 30 },
  1149. /* DACI 31 */ { ST_IMM, 1, 31 },
  1150. /* DADC 32 */ { ST_INH, 1, 32 },
  1151. /* DADD 33 */ { ST_INH, 1, 33 },
  1152. /* DADI 34 */ { ST_IMM, 1, 34 },
  1153. /* DBNZ 35 */ { ST_DBNZ, 1, 35 },
  1154. /* DEC 36 */ { ST_REG, 1, 36 },
  1155. /* DIS 37 */ { ST_INH, 1, 37 },
  1156. /* DSAV 38 */ { ST_INH, 1, 38 },
  1157. /* DSBI 39 */ { ST_IMM, 1, 39 },
  1158. /* DSM 40 */ { ST_INH, 1, 40 },
  1159. /* DSMB 41 */ { ST_INH, 1, 41 },
  1160. /* DSMI 42 */ { ST_IMM, 1, 42 },
  1161. /* DTC 43 */ { ST_INH, 1, 43 },
  1162. /* ETQ 44 */ { ST_INH, 1, 44 },
  1163. /* GEC 45 */ { ST_INH, 1, 45 },
  1164. /* GHI 46 */ { ST_REG, 1, 46 },
  1165. /* GLO 47 */ { ST_REG, 1, 47 },
  1166. /* IDL 48 */ { ST_INH, 1, 48 },
  1167. /* INC 49 */ { ST_REG, 1, 49 },
  1168. /* INP 50 */ { ST_IO, 1, 50 },
  1169. /* IRX 51 */ { ST_INH, 1, 51 },
  1170. /* LBDF 52 */ { ST_EXP, 1, 52 },
  1171. /* LBNF 53 */ { ST_EXP, 1, 53 },
  1172. /* LBNQ 54 */ { ST_EXP, 1, 54 },
  1173. /* LBNZ 55 */ { ST_EXP, 1, 55 },
  1174. /* LBQ 56 */ { ST_EXP, 1, 56 },
  1175. /* LBR 57 */ { ST_EXP, 1, 57 },
  1176. /* LBZ 58 */ { ST_EXP, 1, 58 },
  1177. /* LDA 59 */ { ST_REG, 1, 59 },
  1178. /* LDC 60 */ { ST_INH, 1, 60 },
  1179. /* LDI 61 */ { ST_IMM, 1, 61 },
  1180. /* LDN 62 */ { ST_LDN, 1, 62 },
  1181. /* LDX 63 */ { ST_INH, 1, 63 },
  1182. /* LDXA 64 */ { ST_INH, 1, 64 },
  1183. /* LSDF 65 */ { ST_INH, 1, 65 },
  1184. /* LSIE 66 */ { ST_INH, 1, 66 },
  1185. /* LSKP 67 */ { ST_INH, 1, 67 },
  1186. /* LSNF 68 */ { ST_INH, 1, 68 },
  1187. /* LSNQ 69 */ { ST_INH, 1, 69 },
  1188. /* LSNZ 70 */ { ST_INH, 1, 70 },
  1189. /* LSQ 71 */ { ST_INH, 1, 71 },
  1190. /* LSZ 72 */ { ST_INH, 1, 72 },
  1191. /* MARK 73 */ { ST_INH, 1, 73 },
  1192. /* NBR 74 */ { ST_EXP, 1, 74 },
  1193. /* NLBR 75 */ { ST_EXP, 1, 75 },
  1194. /* NOP 76 */ { ST_INH, 1, 76 },
  1195. /* OR 77 */ { ST_INH, 1, 77 },
  1196. /* ORI 78 */ { ST_IMM, 1, 78 },
  1197. /* OUT 79 */ { ST_IO, 1, 79 },
  1198. /* PHI 80 */ { ST_REG, 1, 80 },
  1199. /* PLO 81 */ { ST_REG, 1, 81 },
  1200. /* REQ 82 */ { ST_INH, 1, 82 },
  1201. /* RET 83 */ { ST_INH, 1, 83 },
  1202. /* RLDI 84 */ { ST_RLDI, 1, 84 },
  1203. /* RLXA 85 */ { ST_REG, 1, 85 },
  1204. /* RNX 86 */ { ST_REG, 1, 86 },
  1205. /* RSHL 87 */ { ST_INH, 1, 87 },
  1206. /* RSHR 88 */ { ST_INH, 1, 88 },
  1207. /* RSXD 89 */ { ST_REG, 1, 89 },
  1208. /* SAV 90 */ { ST_INH, 1, 90 },
  1209. /* SCAL 91 */ { ST_DBNZ, 1, 91 },
  1210. /* SCM1 92 */ { ST_INH, 1, 92 },
  1211. /* SCM2 93 */ { ST_INH, 1, 93 },
  1212. /* SD 94 */ { ST_INH, 1, 94 },
  1213. /* SDB 95 */ { ST_INH, 1, 95 },
  1214. /* SDBI 96 */ { ST_IMM, 1, 96 },
  1215. /* SDI 97 */ { ST_IMM, 1, 97 },
  1216. /* SEP 98 */ { ST_REG, 1, 98 },
  1217. /* SEQ 99 */ { ST_INH, 1, 99 },
  1218. /* SEX 100 */ { ST_REG, 1, 100 },
  1219. /* SHL 101 */ { ST_INH, 1, 101 },
  1220. /* SHLC 102 */ { ST_INH, 1, 102 },
  1221. /* SHR 103 */ { ST_INH, 1, 103 },
  1222. /* SHRC 104 */ { ST_INH, 1, 104 },
  1223. /* SKP 105 */ { ST_INH, 1, 105 },
  1224. /* SM 106 */ { ST_INH, 1, 106 },
  1225. /* SMB 107 */ { ST_INH, 1, 107 },
  1226. /* SMBI 108 */ { ST_IMM, 1, 108 },
  1227. /* SMI 109 */ { ST_IMM, 1, 109 },
  1228. /* SPM1 110 */ { ST_INH, 1, 110 },
  1229. /* SPM2 111 */ { ST_INH, 1, 111 },
  1230. /* SRET 112 */ { ST_REG, 1, 112 },
  1231. /* STM 113 */ { ST_INH, 1, 113 },
  1232. /* STPC 114 */ { ST_INH, 1, 114 },
  1233. /* STR 115 */ { ST_REG, 1, 115 },
  1234. /* STXD 116 */ { ST_INH, 1, 116 },
  1235. /* XID 117 */ { ST_INH, 1, 117 },
  1236. /* XIE 118 */ { ST_INH, 1, 118 },
  1237. /* XOR 119 */ { ST_INH, 1, 119 },
  1238. /* XRI 120 */ { ST_IMM, 1, 120 },
  1239.     { 0, 0, 0 } };
  1240.  
  1241. struct igel igtab[NUMDIFFOP+1]
  1242.     = {
  1243. /* invalid 0 */   { 0 , 0, 
  1244.         "[Xnullentry" },
  1245. /* invalid 1 */   { 0 , 0, 
  1246.         "[Xinvalid opcode" },
  1247. /* ADC 2 */   { 0 , 0, 
  1248.         "74;" },
  1249. /* ADCI 3 */   { 0 , 0, 
  1250.         "7c;[1=];" },
  1251. /* ADD 4 */   { 0 , 0, 
  1252.         "f4;" },
  1253. /* ADI 5 */   { 0 , 0, 
  1254.         "fc;[1=];" },
  1255. /* AND 6 */   { 0 , 0, 
  1256.         "f2;" },
  1257. /* ANI 7 */   { 0 , 0, 
  1258.         "fa;[1=];" },
  1259. /* B1 8 */   { 0 , 0, 
  1260.         "34;[1=].Q.ff00&-~.0<T!;" },
  1261. /* B2 9 */   { 0 , 0, 
  1262.         "35;[1=].Q.ff00&-~.0<T!;" },
  1263. /* B3 10 */   { 0 , 0, 
  1264.         "36;[1=].Q.ff00&-~.0<T!;" },
  1265. /* B4 11 */   { 0 , 0, 
  1266.         "37;[1=].Q.ff00&-~.0<T!;" },
  1267. /* BCI 12 */   { TS1805 , TS1805, 
  1268.         "68;3e;[1=].Q.ff00&-~.0<T!;" },
  1269. /* BDF 13 */   { 0 , 0, 
  1270.         "33;[1=].Q.ff00&-~.0<T!;" },
  1271. /* BGE 14 */   { 0 , 0, 
  1272.         "33;[1=].Q.ff00&-~.0<T!;" },
  1273. /* BL 15 */   { 0 , 0, 
  1274.         "3b;[1=].Q.ff00&-~.0<T!;" },
  1275. /* BM 16 */   { 0 , 0, 
  1276.         "3b;[1=].Q.ff00&-~.0<T!;" },
  1277. /* BN1 17 */   { 0 , 0, 
  1278.         "3c;[1=].Q.ff00&-~.0<T!;" },
  1279. /* BN2 18 */   { 0 , 0, 
  1280.         "3d;[1=].Q.ff00&-~.0<T!;" },
  1281. /* BN3 19 */   { 0 , 0, 
  1282.         "3e;[1=].Q.ff00&-~.0<T!;" },
  1283. /* BN4 20 */   { 0 , 0, 
  1284.         "3f;[1=].Q.ff00&-~.0<T!;" },
  1285. /* BNF 21 */   { 0 , 0, 
  1286.         "3b;[1=].Q.ff00&-~.0<T!;" },
  1287. /* BNQ 22 */   { 0 , 0, 
  1288.         "39;[1=].Q.ff00&-~.0<T!;" },
  1289. /* BNZ 23 */   { 0 , 0, 
  1290.         "3a;[1=].Q.ff00&-~.0<T!;" },
  1291. /* BPZ 24 */   { 0 , 0, 
  1292.         "33;[1=].Q.ff00&-~.0<T!;" },
  1293. /* BQ 25 */   { 0 , 0, 
  1294.         "31;[1=].Q.ff00&-~.0<T!;" },
  1295. /* BR 26 */   { 0 , 0, 
  1296.         "30;[1=].Q.ff00&-~.0<T!;" },
  1297. /* BXI 27 */   { TS1805 , TS1805, 
  1298.         "68;3f;[1=].Q.ff00&-~.0<T!;" },
  1299. /* BZ 28 */   { 0 , 0, 
  1300.         "32;[1=].Q.ff00&-~.0<T!;" },
  1301. /* CID 29 */   { TS1805 , TS1805, 
  1302.         "68;0d;" },
  1303. /* CIE 30 */   { TS1805 , TS1805, 
  1304.         "68;0c;" },
  1305. /* DACI 31 */   { TS1805 , TS1805, 
  1306.         "68;7c;[1=];" },
  1307. /* DADC 32 */   { TS1805 , TS1805, 
  1308.         "68;74;" },
  1309. /* DADD 33 */   { TS1805 , TS1805, 
  1310.         "68;f4;" },
  1311. /* DADI 34 */   { TS1805 , TS1805, 
  1312.         "68;fc;[1=];" },
  1313. /* DBNZ 35 */   { TS1805 , TS1805, 
  1314.         "68;20.[1#]|;[2=]x" },
  1315. /* DEC 36 */   { 0 , 0, 
  1316.         "20.[1#]|;" },
  1317. /* DIS 37 */   { 0 , 0, 
  1318.         "71;" },
  1319. /* DSAV 38 */   { TS1805 , TS1805, 
  1320.         "68;76;" },
  1321. /* DSBI 39 */   { TS1805 , TS1805, 
  1322.         "68;7f;[1=];" },
  1323. /* DSM 40 */   { TS1805 , TS1805, 
  1324.         "68;f7;" },
  1325. /* DSMB 41 */   { TS1805 , TS1805, 
  1326.         "68;77;" },
  1327. /* DSMI 42 */   { TS1805 , TS1805, 
  1328.         "68;ff;[1=];" },
  1329. /* DTC 43 */   { TS1805 , TS1805, 
  1330.         "68;01;" },
  1331. /* ETQ 44 */   { TS1805 , TS1805, 
  1332.         "68;09;" },
  1333. /* GEC 45 */   { TS1805 , TS1805, 
  1334.         "68;08;" },
  1335. /* GHI 46 */   { 0 , 0, 
  1336.         "90.[1#]|;" },
  1337. /* GLO 47 */   { 0 , 0, 
  1338.         "80.[1#]|;" },
  1339. /* IDL 48 */   { 0 , 0, 
  1340.         "00;" },
  1341. /* INC 49 */   { 0 , 0, 
  1342.         "10.[1#]|;" },
  1343. /* INP 50 */   { 0 , 0, 
  1344.         "68.[1#]|;" },
  1345. /* IRX 51 */   { 0 , 0, 
  1346.         "60;" },
  1347. /* LBDF 52 */   { 0 , 0, 
  1348.         "c3;[1=]x" },
  1349. /* LBNF 53 */   { 0 , 0, 
  1350.         "cb;[1=]x" },
  1351. /* LBNQ 54 */   { 0 , 0, 
  1352.         "c9;[1=]x" },
  1353. /* LBNZ 55 */   { 0 , 0, 
  1354.         "ca;[1=]x" },
  1355. /* LBQ 56 */   { 0 , 0, 
  1356.         "c1;[1=]x" },
  1357. /* LBR 57 */   { 0 , 0, 
  1358.         "c0;[1=]x" },
  1359. /* LBZ 58 */   { 0 , 0, 
  1360.         "c2;[1=]x" },
  1361. /* LDA 59 */   { 0 , 0, 
  1362.         "40.[1#]|;" },
  1363. /* LDC 60 */   { TS1805 , TS1805, 
  1364.         "68;06;" },
  1365. /* LDI 61 */   { 0 , 0, 
  1366.         "f8;[1=];" },
  1367. /* LDN 62 */   { 0 , 0, 
  1368.         "00.[1#]|;" },
  1369. /* LDX 63 */   { 0 , 0, 
  1370.         "f0;" },
  1371. /* LDXA 64 */   { 0 , 0, 
  1372.         "72;" },
  1373. /* LSDF 65 */   { 0 , 0, 
  1374.         "cf;" },
  1375. /* LSIE 66 */   { 0 , 0, 
  1376.         "cc;" },
  1377. /* LSKP 67 */   { 0 , 0, 
  1378.         "c8;" },
  1379. /* LSNF 68 */   { 0 , 0, 
  1380.         "c7;" },
  1381. /* LSNQ 69 */   { 0 , 0, 
  1382.         "c5;" },
  1383. /* LSNZ 70 */   { 0 , 0, 
  1384.         "c6;" },
  1385. /* LSQ 71 */   { 0 , 0, 
  1386.         "cd;" },
  1387. /* LSZ 72 */   { 0 , 0, 
  1388.         "ce;" },
  1389. /* MARK 73 */   { 0 , 0, 
  1390.         "79;" },
  1391. /* NBR 74 */   { 0 , 0, 
  1392.         "38;[1=].Q.ff00&-~.0<T!;" },
  1393. /* NLBR 75 */   { 0 , 0, 
  1394.         "c8;[1=]x" },
  1395. /* NOP 76 */   { 0 , 0, 
  1396.         "c4;" },
  1397. /* OR 77 */   { 0 , 0, 
  1398.         "f1;" },
  1399. /* ORI 78 */   { 0 , 0, 
  1400.         "f9;[1=];" },
  1401. /* OUT 79 */   { 0 , 0, 
  1402.         "60.[1#]|;" },
  1403. /* PHI 80 */   { 0 , 0, 
  1404.         "b0.[1#]|;" },
  1405. /* PLO 81 */   { 0 , 0, 
  1406.         "a0.[1#]|;" },
  1407. /* REQ 82 */   { 0 , 0, 
  1408.         "7a;" },
  1409. /* RET 83 */   { 0 , 0, 
  1410.         "70;" },
  1411. /* RLDI 84 */   { TS1805 , TS1805, 
  1412.         "68;c0.[1#]|;[2=]x" },
  1413. /* RLXA 85 */   { TS1805 , TS1805, 
  1414.         "68;60.[1#]|;" },
  1415. /* RNX 86 */   { TS1805 , TS1805, 
  1416.         "68;b0.[1#]|;" },
  1417. /* RSHL 87 */   { 0 , 0, 
  1418.         "7e;" },
  1419. /* RSHR 88 */   { 0 , 0, 
  1420.         "76;" },
  1421. /* RSXD 89 */   { TS1805 , TS1805, 
  1422.         "68;a0.[1#]|;" },
  1423. /* SAV 90 */   { 0 , 0, 
  1424.         "78;" },
  1425. /* SCAL 91 */   { TS1805 , TS1805, 
  1426.         "68;80.[1#]|;[2=]x" },
  1427. /* SCM1 92 */   { TS1805 , TS1805, 
  1428.         "68;05;" },
  1429. /* SCM2 93 */   { TS1805 , TS1805, 
  1430.         "68;03;" },
  1431. /* SD 94 */   { 0 , 0, 
  1432.         "f5;" },
  1433. /* SDB 95 */   { 0 , 0, 
  1434.         "75;" },
  1435. /* SDBI 96 */   { 0 , 0, 
  1436.         "7d;[1=];" },
  1437. /* SDI 97 */   { 0 , 0, 
  1438.         "fd;[1=];" },
  1439. /* SEP 98 */   { 0 , 0, 
  1440.         "d0.[1#]|;" },
  1441. /* SEQ 99 */   { 0 , 0, 
  1442.         "7b;" },
  1443. /* SEX 100 */   { 0 , 0, 
  1444.         "e0.[1#]|;" },
  1445. /* SHL 101 */   { 0 , 0, 
  1446.         "fe;" },
  1447. /* SHLC 102 */   { 0 , 0, 
  1448.         "7e;" },
  1449. /* SHR 103 */   { 0 , 0, 
  1450.         "f6;" },
  1451. /* SHRC 104 */   { 0 , 0, 
  1452.         "76;" },
  1453. /* SKP 105 */   { 0 , 0, 
  1454.         "38;" },
  1455. /* SM 106 */   { 0 , 0, 
  1456.         "f7;" },
  1457. /* SMB 107 */   { 0 , 0, 
  1458.         "77;" },
  1459. /* SMBI 108 */   { 0 , 0, 
  1460.         "7f;[1=];" },
  1461. /* SMI 109 */   { 0 , 0, 
  1462.         "ff;[1=];" },
  1463. /* SPM1 110 */   { TS1805 , TS1805, 
  1464.         "68;04;" },
  1465. /* SPM2 111 */   { TS1805 , TS1805, 
  1466.         "68;02;" },
  1467. /* SRET 112 */   { TS1805 , TS1805, 
  1468.         "68;90.[1#]|;" },
  1469. /* STM 113 */   { TS1805 , TS1805, 
  1470.         "68;07;" },
  1471. /* STPC 114 */   { TS1805 , TS1805, 
  1472.         "68;00;" },
  1473. /* STR 115 */   { 0 , 0, 
  1474.         "50.[1#]|;" },
  1475. /* STXD 116 */   { 0 , 0, 
  1476.         "73;" },
  1477. /* XID 117 */   { TS1805 , TS1805, 
  1478.         "68;0b;" },
  1479. /* XIE 118 */   { TS1805 , TS1805, 
  1480.         "68;0a;" },
  1481. /* XOR 119 */   { 0 , 0, 
  1482.         "f3;" },
  1483. /* XRI 120 */   { 0 , 0, 
  1484.         "fb;[1=];" },
  1485.     { 0,0,""} };
  1486. /* end fraptabdef.c */
  1487.