home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_300 / 357_01 / cstar1.exe / T2.C < prev    next >
C/C++ Source or Header  |  1991-06-18  |  22KB  |  888 lines

  1. /*
  2.     C* tables
  3.  
  4.     instruction lookup tables
  5.     lengths and address modes
  6.     opcode assignments
  7.  
  8.     Version:
  9.         March 6, 1987
  10.         March 7, 1989
  11.  
  12.     PUBLIC DOMAIN SOFTWARE
  13.  
  14.     The CSTAR program was placed in    the public domain on June 15, 1991,
  15.     by its author and sole owner,
  16.  
  17.         Edward K. Ream
  18.         1617 Monroe Street
  19.         Madison, WI 53711
  20.         (608) 257-0802
  21.  
  22.     CSTAR may be used for any commercial or non-commercial purpose.
  23.  
  24.     See cstar.h or cstar.c for a DISCLAIMER OF WARRANTIES.
  25. */
  26.  
  27. #include "enum.h"
  28.  
  29. #define X_T_FRAME 6
  30. #define NULL 0L
  31.  
  32. /*
  33.     NOTE: X_TOK synonyms such as follows are dealt with in enum.h
  34.  
  35.     X_BLO  == X_BCS
  36.     X_BHS  == X_BCC
  37.  
  38.     X_DBRA == X_DBF    ;note that this is branch UNTIL false
  39.     X_DBRN == X_DBT
  40.     X_DBLO == X_DBCS
  41.     X_DBHS == X_DBCC
  42.  
  43.     X_SLO  == X_SCS
  44.     X_SHS  == X_SCC
  45.  
  46.     other synonyms that might arise ought to be handled similarly
  47. */
  48.  
  49.  
  50. /*
  51.     These are the visible instructions in order, 
  52.     as on pp. 82-182 of The Book.
  53.  
  54.     AS_1_AM means that the (second) argument must match the first as
  55.     to length.
  56.  
  57.     MODE1_AM means that the argument length is not orthogonal to
  58.     the addressing mode, and the interpreter is to refer to the
  59.     addressing mode of the (first) argument to determine whether the
  60.     length is acceptable.
  61.  
  62.     In case an operand does not match the template as to length, an
  63.     error will be flagged--EXCEPT when the operand is a D register
  64.     and its type is not required to determine the operation size.
  65.     Thus, a muls into a word-length D register will issue a warning,
  66.     as will a moveq into that register.  However, moving a long into
  67.     a memory word is an error.
  68.  
  69.     The arguments are:
  70.  
  71.         1. 0 for fixed or unsized ops, 1 if the size of the first
  72.            c_arg is the size of the op, 2 if the size of the second
  73.            is the size of the op.
  74.  
  75.         2. Permissible size for first c_arg in this entry
  76.  
  77.         3. Permissible size for second c_arg in this entry
  78.  
  79.         4. Permissible address modes for first c_arg
  80.  
  81.         5. Permissible address modes for second c_arg
  82.  
  83.         6. Token that should be substituted into code node if this
  84.            entry is accepted.
  85.  
  86.     CAUTION: the code in io.c needs to be synchronized to the internal
  87.     structure of this table.  This seems like an obvious point, but...
  88.  
  89.     NOTE: the old name "entry" conflicts with an ANSI keyword
  90.  
  91.     The designators AS_1, MODE1, and MODE2 are associated with the 
  92.     interpreter internals and should be somewhat self-expanatory.
  93.     AS_1 indicates that arg2 should match whatever length arg1 has.
  94.  
  95.     MODE1 is a filler which indicates that the length is implicit in
  96.     the address mode AND is checked by the am_match() code for that
  97.     address mode.  Similarly for MODE2; these fillers indicate to the
  98.     interpreter that no length check should apply to their argument
  99.     except that done by am_match().
  100. */
  101.  
  102. #define code(x) int x[] = {
  103. #define entry_(a,b,c,d,e,f) a,b,c,d,e,f, 
  104. #define end_l -1};
  105.  
  106. /* abcd */
  107.     code (abcd_)
  108.     entry_(0, LEN8_AM, LEN8_AM, DEC_AM, DEC_AM, X_ABCD)
  109.     entry_(0, LEN8_AM, LEN8_AM, DN_AM,  DN_AM,  X_ABCD)
  110.     end_l
  111.     
  112. /* add */
  113.     code(add_)
  114.     entry_(2, MODE1_AM, ANY_AM,  QUICK8_AM, DALT_AM, X_ADDQ)
  115.     entry_(2, MODE1_AM, NOT8_AM, QUICK8_AM, AN_AM,   X_ADDQ)
  116.     entry_(2, ANY_AM,  AS_1_AM, DATA_AM, DN_AM,   X_ADD)
  117.     entry_(2, ANY_AM,  AS_1_AM, DN_AM,   MALT_AM, X_ADD)
  118.     entry_(2, NOT8_AM, AS_1_AM, AN_AM,   DN_AM,   X_ADD)
  119.     entry_(1, LEN16_AM, LEN32_AM, GEN_AM, AN_AM,  X_ADDA)
  120.     entry_(2, NOT8_AM, AS_1_AM, GEN_AM, AN_AM,   X_ADDA)
  121.     entry_(2, ANY_AM,  AS_1_AM, IMM_AM,  DALT_AM, X_ADDI)
  122.     end_l
  123.  
  124. /* adda */
  125.     code(adda_)
  126.     entry_(2, MODE1_AM, NOT8_AM, QUICK8_AM, AN_AM,   X_ADDQ)
  127.     entry_(1, LEN16_AM, LEN32_AM, GEN_AM, AN_AM, X_ADDA)
  128.     entry_(2, NOT8_AM,  AS_1_AM,  GEN_AM, AN_AM, X_ADDA)
  129.     end_l
  130.  
  131. /* addi */
  132.     code(addi_)
  133.     entry_(2, MODE1_AM, ANY_AM,  QUICK8_AM, DALT_AM, X_ADDQ)
  134.     entry_(2, ANY_AM, AS_1_AM, IMM_AM, DALT_AM, X_ADDI)
  135.     end_l
  136.  
  137. /* addq */
  138.     code(addq_)
  139.     entry_(2, MODE1_AM, ANY_AM,  QUICK8_AM, DALT_AM, X_ADDQ)
  140.     entry_(2, MODE1_AM, NOT8_AM, QUICK8_AM, AN_AM,   X_ADDQ)
  141.     end_l
  142.  
  143. /* addx */
  144.     code(addx_)
  145.     entry_(2, ANY_AM, AS_1_AM, DEC_AM, DEC_AM, X_ADDX)
  146.     entry_(2, ANY_AM, AS_1_AM, DN_AM,  DN_AM,  X_ADDX)
  147.     end_l
  148.  
  149.  
  150. /* extra opcodes will eventually be added to the X_TOK enumeration */
  151. #define X_ANDI1 X_ANDI
  152. #define X_ANDI2 X_ANDI
  153. #define X_ANDI3 X_ANDI
  154.  
  155. /* and */
  156.     code(and_)
  157.     entry_(2, ANY_AM, AS_1_AM, DATA_AM, DN_AM,   X_AND)
  158.     entry_(2, ANY_AM, AS_1_AM, DN_AM,   MALT_AM, X_AND)
  159.     entry_(2, ANY_AM, AS_1_AM, IMM_AM,  DALT_AM, X_ANDI3)
  160.     end_l
  161.  
  162. /* andi */
  163.     code(andi_)
  164.     entry_(2, LEN8_AM,  AS_1_AM, IMM8_AM,  CCR_AM,  X_ANDI1)    /* to ccr */
  165.     entry_(2, LEN16_AM, AS_1_AM, IMM16_AM, SR_AM,   X_ANDI2)    /* to ssr */
  166.     entry_(2, ANY_AM,   AS_1_AM, IMM_AM,   DALT_AM, X_ANDI3)
  167.     end_l
  168.  
  169. /* asl */
  170. #define X_ASL1 X_ASL
  171. #define X_ASL2 X_ASL
  172.     code(asl_)
  173.     entry_(2, ANY_AM,   ANY_AM, DN_AM,     DN_AM,   X_ASL1)    /* dreg dyn */
  174.     entry_(2, MODE1_AM, ANY_AM, QUICK8_AM, DN_AM,   X_ASL1)    /* dreg stat */
  175.     entry_(1, LEN16_AM, NONE_AM, MALT_AM,  NONE_AM, X_ASL2)    /* memory x1 */
  176.     end_l
  177.  
  178. /* asr */
  179. #define X_ASR1 X_ASR
  180. #define X_ASR2 X_ASR
  181.     code(asr_)
  182.     entry_(2, ANY_AM,   ANY_AM, DN_AM,     DN_AM,   X_ASR1)    /* dreg dyn */
  183.     entry_(2, MODE1_AM, ANY_AM, QUICK8_AM, DN_AM,   X_ASR1)    /* dreg stat */
  184.     entry_(1, LEN16_AM, NONE_AM, MALT_AM,  NONE_AM, X_ASR2)    /* memory x1 */
  185.     end_l
  186.  
  187. /* bchg */
  188. #define X_BCHG1 X_BCHG
  189. #define X_BCHG2 X_BCHG
  190.     code(bchg_)
  191.     entry_(2, MODE1_AM, LEN8_AM,  BIT31_AM, MALT_AM, X_BCHG1)    /* static */
  192.     entry_(2, MODE1_AM, LEN32_AM, BIT31_AM, DN_AM,   X_BCHG1)
  193.     entry_(2, ANY_AM,   LEN8_AM,  DN_AM,    MALT_AM, X_BCHG2)    /* dynamic */
  194.     entry_(2, ANY_AM,   LEN32_AM, DN_AM,    DN_AM,   X_BCHG2)
  195.     end_l
  196.  
  197. /* bclr */
  198. #define X_BCLR1 X_BCLR
  199. #define X_BCLR2 X_BCLR
  200.     code(bclr_)
  201.     entry_(2, MODE1_AM, LEN8_AM,  BIT31_AM, MALT_AM, X_BCLR1)    /* static */
  202.     entry_(2, MODE1_AM, LEN32_AM, BIT31_AM, DN_AM,   X_BCLR1)
  203.     entry_(2, ANY_AM,   LEN8_AM,  DN_AM,    MALT_AM, X_BCLR2)    /* dynamic */
  204.     entry_(2, ANY_AM,   LEN32_AM, DN_AM,    DN_AM,   X_BCLR2)
  205.     end_l
  206.  
  207. /* bset */
  208. #define X_BSET1 X_BSET
  209. #define X_BSET2 X_BSET
  210.     code(bset_)
  211.     entry_(2, MODE1_AM, LEN8_AM,  BIT31_AM, MALT_AM, X_BSET1)    /* static */
  212.     entry_(2, MODE1_AM, LEN32_AM, BIT31_AM, DN_AM,   X_BSET1)
  213.     entry_(2, ANY_AM,   LEN8_AM,  DN_AM,    MALT_AM, X_BSET2)    /* dynamic */
  214.     entry_(2, ANY_AM,   LEN32_AM, DN_AM,    DN_AM,   X_BSET2)
  215.     end_l
  216.  
  217. /* btst */
  218. #define X_BTST1 X_BTST
  219. #define X_BTST2 X_BTST
  220.     code(btst_)
  221.     entry_(2, MODE1_AM, LEN8_AM,  BIT31_AM, MALT_AM, X_BTST1)    /* static */
  222.     entry_(2, MODE1_AM, LEN32_AM, BIT31_AM, DN_AM,   X_BTST1)
  223.     entry_(2, ANY_AM,   LEN8_AM,  DN_AM,    MALT_AM, X_BTST2)    /* dynamic */
  224.     entry_(2, ANY_AM,   LEN32_AM, DN_AM,    DN_AM,   X_BTST2)
  225.     end_l
  226.  
  227. /* bsr */
  228.     code(bsr_)
  229.     entry_(1, MODE1_AM, NONE_AM, DISP_AM, NONE_AM, X_BSR)
  230.     end_l
  231.  
  232. /* bra */
  233.     code(bra_)
  234.     entry_(1, MODE1_AM, NONE_AM, DISP_AM, NONE_AM, X_BRA)
  235.     end_l
  236.  
  237. /* bcc */
  238.     code(bcc_)
  239.     entry_(1, MODE1_AM, NONE_AM, DISP_AM, NONE_AM, X_BCC)
  240.     end_l
  241.  
  242. /* bcs */
  243.     code(bcs_)
  244.     entry_(1, MODE1_AM, NONE_AM, DISP_AM, NONE_AM, X_BCS)
  245.     end_l
  246.  
  247. /* beq */
  248.     code(beq_)
  249.     entry_(1, MODE1_AM, NONE_AM, DISP_AM, NONE_AM, X_BEQ)
  250.     end_l
  251.  
  252. /* bge */
  253.     code(bge_)
  254.     entry_(1, MODE1_AM, NONE_AM, DISP_AM, NONE_AM, X_BGE)
  255.     end_l
  256.  
  257. /* bgt */
  258.     code(bgt_)
  259.     entry_(1, MODE1_AM, NONE_AM, DISP_AM, NONE_AM, X_BGT)
  260.     end_l
  261.  
  262. /* bhi */
  263.     code(bhi_)
  264.     entry_(1, MODE1_AM, NONE_AM, DISP_AM, NONE_AM, X_BHI)
  265.     end_l
  266.  
  267. /* ble */
  268.     code(ble_)
  269.     entry_(1, MODE1_AM, NONE_AM, DISP_AM, NONE_AM, X_BLE)
  270.     end_l
  271.  
  272. /* bls */
  273.     code(bls_)
  274.     entry_(1, MODE1_AM, NONE_AM, DISP_AM, NONE_AM, X_BLS)
  275.     end_l
  276.  
  277. /* blt */
  278.     code(blt_)
  279.     entry_(1, MODE1_AM, NONE_AM, DISP_AM, NONE_AM, X_BLT)
  280.     end_l
  281.  
  282. /* bmi */
  283.     code(bmi_)
  284.     entry_(1, MODE1_AM, NONE_AM, DISP_AM, NONE_AM, X_BMI)
  285.     end_l
  286.  
  287. /* bne */
  288.     code(bne_)
  289.     entry_(1, MODE1_AM, NONE_AM, DISP_AM, NONE_AM, X_BNE)
  290.     end_l
  291.  
  292. /* bpl */
  293.     code(bpl_)
  294.     entry_(1, MODE1_AM, NONE_AM, DISP_AM, NONE_AM, X_BPL)
  295.     end_l
  296.  
  297. /* bvc */
  298.     code(bvc_)
  299.     entry_(1, MODE1_AM, NONE_AM, DISP_AM, NONE_AM, X_BVC)
  300.     end_l
  301.  
  302. /* bvs */
  303.     code(bvs_)
  304.     entry_(1, MODE1_AM, NONE_AM, DISP_AM, NONE_AM, X_BVS)
  305.     end_l
  306.  
  307. /* chk */
  308.     code(chk_)
  309.     entry_(2, LEN16_AM, AS_1_AM, DATA_AM, DN_AM, X_CHK)
  310.     end_l
  311.  
  312. /* clr */
  313.     code(clr_)
  314.     entry_(1, ANY_AM, NONE_AM, DALT_AM, NONE_AM, X_CLR)
  315.     end_l
  316.  
  317. /* cmp */
  318.     code(cmp_)
  319.     entry_(2, ANY_AM,   AS_1_AM,  DATA_AM, DN_AM, X_CMP)
  320.     entry_(2, NOT8_AM,  AS_1_AM, AN_AM,   DN_AM, X_CMP)
  321.     entry_(2, NOT8_AM,  AS_1_AM,  GEN_AM, AN_AM, X_CMPA)
  322.     entry_(1, LEN16_AM, LEN32_AM, GEN_AM, AN_AM, X_CMPA)
  323.     entry_(2, ANY_AM,   AS_1_AM,  IMM_AM, DALT_AM, X_CMPI)
  324.     end_l
  325.  
  326. /* cmpa */
  327.     code(cmpa_)
  328.     entry_(2, NOT8_AM,  AS_1_AM,  GEN_AM, AN_AM, X_CMPA)
  329.     entry_(1, LEN16_AM, LEN32_AM, GEN_AM, AN_AM, X_CMPA)
  330.     end_l
  331.  
  332. /* cmpi */
  333.     code(cmpi_)
  334.     entry_(2, ANY_AM, AS_1_AM, IMM_AM, DALT_AM, X_CMPI)
  335.     end_l
  336.  
  337. /* cmpm */
  338.     code(cmpm_)
  339.     entry_(2, ANY_AM, AS_1_AM, INC_AM, INC_AM, X_CMPM)
  340.     end_l
  341.  
  342. /* dbra */
  343.     code(dbra_)
  344.     entry_(0, LEN16_AM, MODE2_AM, DN_AM, DISP_AM, X_DBRA)
  345.     end_l
  346.  
  347. /* dbcc */
  348.     code(dbcc_)
  349.     entry_(0, LEN16_AM, MODE2_AM, DN_AM, DISP_AM, X_DBCC)
  350.     end_l
  351.  
  352. /* dbcs */
  353.     code(dbcs_)
  354.     entry_(0, LEN16_AM, MODE2_AM, DN_AM, DISP_AM, X_DBCS)
  355.     end_l
  356.  
  357. /* dbeq */
  358.     code(dbeq_)
  359.     entry_(0, LEN16_AM, MODE2_AM, DN_AM, DISP_AM, X_DBEQ)
  360.     end_l
  361.  
  362. /* dbf */
  363.     code(dbf_)
  364.     entry_(0, LEN16_AM, MODE2_AM, DN_AM, DISP_AM, X_DBF)
  365.     end_l
  366.  
  367. /* dbge */
  368.     code(dbge_)
  369.     entry_(0, LEN16_AM, MODE2_AM, DN_AM, DISP_AM, X_DBGE)
  370.     end_l
  371.  
  372. /* dbgt */
  373.     code(dbgt_)
  374.     entry_(0, LEN16_AM, MODE2_AM, DN_AM, DISP_AM, X_DBGT)
  375.     end_l
  376.  
  377. /* dbhi */
  378.     code(dbhi_)
  379.     entry_(0, LEN16_AM, MODE2_AM, DN_AM, DISP_AM, X_DBHI)
  380.     end_l
  381.  
  382. /* dble */
  383.     code(dble_)
  384.     entry_(0, LEN16_AM, MODE2_AM, DN_AM, DISP_AM, X_DBLE)
  385.     end_l
  386.  
  387. /* dbls */
  388.     code(dbls_)
  389.     entry_(0, LEN16_AM, MODE2_AM, DN_AM, DISP_AM, X_DBLS)
  390.     end_l
  391.  
  392. /* dblt */
  393.     code(dblt_)
  394.     entry_(0, LEN16_AM, MODE2_AM, DN_AM, DISP_AM, X_DBLT)
  395.     end_l
  396.  
  397. /* dbmi */
  398.     code(dbmi_)
  399.     entry_(0, LEN16_AM, MODE2_AM, DN_AM, DISP_AM, X_DBMI)
  400.     end_l
  401.  
  402. /* dbne */
  403.     code(dbne_)
  404.     entry_(0, LEN16_AM, MODE2_AM, DN_AM, DISP_AM, X_DBNE)
  405.     end_l
  406.  
  407. /* dbpl */
  408.     code(dbpl_)
  409.     entry_(0, LEN16_AM, MODE2_AM, DN_AM, DISP_AM, X_DBPL)
  410.     end_l
  411.  
  412. /* dbt */
  413.     code(dbt_)
  414.     entry_(0, LEN16_AM, MODE2_AM, DN_AM, DISP_AM, X_DBT)
  415.     end_l
  416.  
  417. /* dbvc */
  418.     code(dbvc_)
  419.     entry_(0, LEN16_AM, MODE2_AM, DN_AM, DISP_AM, X_DBVC)
  420.     end_l
  421.  
  422. /* dbvs */
  423.     code(dbvs_)
  424.     entry_(0, LEN16_AM, MODE2_AM, DN_AM, DISP_AM, X_DBVS)
  425.     end_l
  426.  
  427.  
  428. /* divs */
  429.     code(divs_)
  430.     entry_(0, LEN16_AM, NOT8_AM, DATA_AM, DN_AM, X_DIVS)
  431.     end_l
  432.  
  433. /* divu */
  434.     code(divu_)
  435.     entry_(0, LEN16_AM, NOT8_AM, DATA_AM, DN_AM, X_DIVU)
  436.     end_l
  437.  
  438. /* eor */
  439.     code(eor_)
  440.     entry_(2, ANY_AM, AS_1_AM, DN_AM, DALT_AM, X_EOR)
  441.     end_l
  442.  
  443. /* eori */
  444. #define X_EORI1 X_EORI
  445. #define X_EORI2 X_EORI
  446. #define X_EORI3 X_EORI
  447.     code(eori_)
  448.     entry_(0, LEN8_AM,  AS_1_AM, IMM8_AM,  CCR_AM,  X_EORI1)    /* to ccr */
  449.     entry_(0, LEN16_AM, AS_1_AM, IMM16_AM, SR_AM,   X_EORI2)    /* to ssr */
  450.     entry_(2, ANY_AM,   AS_1_AM, IMM_AM,   DALT_AM, X_EORI3)
  451.     end_l
  452.  
  453. /* exg */
  454. #define X_EXG1 X_EXG
  455. #define X_EXG2 X_EXG
  456. #define X_EXG3 X_EXG
  457. #define X_EXG4 X_EXG
  458.     code(exg_)
  459.     entry_(0, LEN32_AM, AS_1_AM, AN_AM, AN_AM, X_EXG1)
  460.     entry_(0, LEN32_AM, AS_1_AM, DN_AM, DN_AM, X_EXG2)
  461.     entry_(0, LEN32_AM, AS_1_AM, AN_AM, DN_AM, X_EXG3)
  462.     entry_(0, LEN32_AM, AS_1_AM, DN_AM, AN_AM, X_EXG4)
  463.     end_l
  464.  
  465. /* ext */
  466.     code(ext_)
  467.     entry_(1, NOT8_AM, NONE_AM, DN_AM, NONE_AM, X_EXT)
  468.     end_l
  469.  
  470. /* ----- comment out (illegal)
  471.     code(ill_)
  472.     entry_(0, NONE_AM, NONE_AM, NONE_AM, NONE_AM, X_ILL)
  473.     end_l
  474. ------- */
  475.  
  476. /* jmp */
  477.     code(jmp_)
  478.     entry_(0, MODE1_AM, NONE_AM, CONTROL_AM, NONE_AM, X_JMP)
  479.     end_l
  480.  
  481. /* jsr */
  482.     code(jsr_)
  483.     entry_(0, MODE1_AM, NONE_AM, CONTROL_AM, NONE_AM, X_JSR)
  484.     end_l
  485.  
  486. /* lea */
  487.     code(lea_)
  488.     entry_(0, MODE1_AM, LEN32_AM, CONTROL_AM, AN_AM, X_LEA)
  489.     end_l
  490.  
  491. /* link */
  492.     code(link_)
  493.     entry_(0, LEN32_AM, LEN16_AM, AN_AM, IMM16_AM, X_LINK)
  494.     end_l
  495.  
  496. /* lsl */
  497. #define X_LSL1 X_LSL
  498. #define X_LSL2 X_LSL
  499.     code(lsl_)
  500.     entry_(2, ANY_AM,   ANY_AM, DN_AM,     DN_AM,   X_LSL1)    /* dreg dyn */
  501.     entry_(2, MODE1_AM, ANY_AM, QUICK8_AM, DN_AM,   X_LSL1)    /* dreg stat */
  502.     entry_(1, LEN16_AM, NONE_AM, MALT_AM,  NONE_AM, X_LSL2)    /* memory x1 */
  503.     end_l
  504.  
  505. /* lsr */
  506. #define X_LSR1 X_LSR
  507. #define X_LSR2 X_LSR
  508.     code(lsr_)
  509.     entry_(2, ANY_AM,   ANY_AM, DN_AM,     DN_AM,   X_LSR1)    /* dreg dyn */
  510.     entry_(2, MODE1_AM, ANY_AM, QUICK8_AM, DN_AM,   X_LSR1)    /* dreg stat */
  511.     entry_(1, LEN16_AM, NONE_AM, MALT_AM,  NONE_AM, X_LSR2)    /* memory x1 */
  512.     end_l
  513.  
  514. /* move */
  515. #define X_MOVE1 X_MOVE
  516. #define X_MOVE2 X_MOVE
  517. #define X_MOVE3 X_MOVE
  518. #define X_MOVE4 X_MOVE
  519. #define X_MOVE5 X_MOVE
  520.     code(move_)
  521.     entry_(0, MODE1_AM, LEN32_AM, Q8BIT_AM, DN_AM, X_MOVEQ)
  522.     entry_(0, ANY_AM,   AS_1_AM,  GEN_AM,  DALT_AM, X_MOVE)
  523.     entry_(1, LEN16_AM, LEN32_AM, GEN_AM, AN_AM, X_MOVEA)
  524.     entry_(0, NOT8_AM,  AS_1_AM,  GEN_AM, AN_AM, X_MOVEA)
  525.  
  526.     entry_(0, LEN8_AM,  AS_1_AM, CCR_AM,  DALT_AM, X_MOVE1)    /* ccr */
  527.     entry_(0, LEN8_AM,  AS_1_AM, DATA_AM, CCR_AM,  X_MOVE2)
  528.     entry_(0, LEN16_AM, AS_1_AM, SR_AM,   DALT_AM, X_MOVE3)    /* ssr */
  529.     entry_(0, LEN16_AM, AS_1_AM, DATA_AM, SR_AM,   X_MOVE4)
  530.     entry_(0, LEN32_AM, AS_1_AM, USP_AM,  AN_AM,   X_MOVE5)    /* usp */
  531.     entry_(0, LEN32_AM, AS_1_AM, AN_AM,   USP_AM,  X_MOVE5)
  532.     end_l
  533.  
  534. /* movea */
  535.     code(movea_)
  536.     entry_(1, LEN16_AM, LEN32_AM, GEN_AM, AN_AM, X_MOVEA)
  537.     entry_(0, NOT8_AM,  AS_1_AM,  GEN_AM, AN_AM, X_MOVEA)
  538.     end_l
  539.  
  540. /* movem */
  541.     /*
  542.         WARNING: right now, we can't even parse the reg_list!
  543.  
  544.         NOTE: the normal way of handling the size may not work
  545.         naturally in some cases--we may want movem_l and movem_w.
  546.  
  547.         That is, we can't simultaneously declare short int *a7 and
  548.         long int *a7, so we can't mix word and long movem's in the
  549.         same routine except with explicit casts.
  550.     */
  551.     code(movem_)
  552.     entry_(2, NOT8_AM, AS_1_AM, REGLIST_AM, MOVER2M_AM, X_MOVEM)
  553.     entry_(1, NOT8_AM, AS_1_AM, MOVEM2R_AM, REGLIST_AM, X_MOVEM)
  554.     end_l
  555.  
  556. /* movep */
  557.     /*
  558.         NOTE: same comment as movem.
  559.  
  560.         For this one, I suggest having ONLY movep_l and movep_w, since
  561.         the operation is incredibly bizarre.
  562.     */
  563.     code(movep_)
  564.     entry_(1, NOT8_AM, AS_1_AM, DN_AM, D_AN_AM, X_MOVEP)
  565.     entry_(2, NOT8_AM, AS_1_AM, D_AN_AM, DN_AM, X_MOVEP)
  566.     end_l
  567.  
  568. /* moveq */
  569.     code(moveq_)
  570.     entry_(2, MODE1_AM, LEN32_AM, Q8BIT_AM, DN_AM, X_MOVEQ)
  571.     end_l
  572.  
  573. /* muls */
  574.     code(muls_)
  575.     entry_(0, LEN16_AM, NOT8_AM, DALT_AM, DN_AM, X_MULS)
  576.     end_l
  577.  
  578. /* mulu */
  579.     code(mulu_)
  580.     entry_(0, LEN16_AM, NOT8_AM, DALT_AM, DN_AM, X_MULU)
  581.     end_l
  582.  
  583. /* nbcd */
  584.     code(nbcd_)
  585.     entry_(0, LEN8_AM, NONE_AM, DALT_AM, NONE_AM, X_NBCD)
  586.     end_l
  587.  
  588. /* neg */
  589.     code(neg_)
  590.     entry_(1, ANY_AM, NONE_AM, DALT_AM, NONE_AM, X_NEG)
  591.     end_l
  592.  
  593. /* negx */
  594.     code(negx_)
  595.     entry_(1, ANY_AM, NONE_AM, DALT_AM, NONE_AM, X_NEGX)
  596.     end_l
  597.  
  598. /* nop */
  599.     code(nop_)
  600.     entry_(0, NONE_AM, NONE_AM, NONE_AM, NONE_AM, X_NOP)
  601.     end_l
  602.  
  603. /* not */
  604.     code(not_)
  605.     entry_(1, ANY_AM, NONE_AM, DALT_AM, NONE_AM, X_NOT)
  606.     end_l
  607.  
  608. /* or */
  609.     code(or_)
  610.     entry_(1, ANY_AM, AS_1_AM, DATA_AM, DN_AM,   X_OR)
  611.     entry_(2, ANY_AM, AS_1_AM, DN_AM,   MALT_AM, X_OR)
  612.     end_l
  613.  
  614. /* ori */
  615. #define X_ORI1 X_ORI
  616. #define X_ORI2 X_ORI
  617. #define X_ORI3 X_ORI
  618.     code(ori_)
  619.     entry_(2, ANY_AM, AS_1_AM,   IMM_AM,   DALT_AM, X_ORI3)
  620.     entry_(0, LEN8_AM, AS_1_AM,  IMM8_AM,  CCR_AM, X_ORI1)    /* to ccr */
  621.     entry_(0, LEN16_AM, AS_1_AM, IMM16_AM, SR_AM, X_ORI2)    /* to ssr */
  622.     end_l
  623.  
  624. /* pea */
  625.     code(pea_)
  626.     entry_(0, MODE1_AM, NONE_AM, CONTROL_AM, NONE_AM, X_PEA)
  627.     end_l
  628.  
  629. /* reset */
  630.     code(reset_)
  631.     entry_(0, NONE_AM, NONE_AM, NONE_AM, NONE_AM, X_RESET)
  632.     end_l
  633.  
  634. /* rol */
  635. #define X_ROL1 X_ROL
  636. #define X_ROL2 X_ROL
  637.     code(rol_)
  638.     entry_(2, ANY_AM,   ANY_AM, DN_AM,     DN_AM,   X_ROL1)    /* dreg dyn */
  639.     entry_(2, MODE1_AM, ANY_AM, QUICK8_AM, DN_AM,   X_ROL1)    /* dreg stat */
  640.     entry_(2, LEN16_AM, NONE_AM, MALT_AM,  NONE_AM, X_ROL2)    /* memory x1 */
  641.     end_l
  642.  
  643. /* ror */
  644. #define X_ROR1 X_ROR
  645. #define X_ROR2 X_ROR
  646.     code(ror_)
  647.     entry_(2, ANY_AM,   ANY_AM, DN_AM,     DN_AM,   X_ROR1)    /* dreg dyn */
  648.     entry_(2, MODE1_AM, ANY_AM, QUICK8_AM, DN_AM,   X_ROR1)    /* dreg stat */
  649.     entry_(2, LEN16_AM, NONE_AM, MALT_AM,  NONE_AM, X_ROR2)    /* memory x1 */
  650.     end_l
  651.  
  652. /* roxl */
  653. #define X_ROXL1 X_ROXL
  654. #define X_ROXL2 X_ROXL
  655.     code(roxl_)
  656.     entry_(2, ANY_AM,   ANY_AM, DN_AM,     DN_AM,   X_ROXL1)    /* dreg dyn */
  657.     entry_(2, MODE1_AM, ANY_AM, QUICK8_AM, DN_AM,   X_ROXL1)    /* dreg stat */
  658.     entry_(2, LEN16_AM, NONE_AM, MALT_AM,  NONE_AM, X_ROXL2)    /* memory x1 */
  659.     end_l
  660.  
  661. /* roxr */
  662. #define X_ROXR1 X_ROXR
  663. #define X_ROXR2 X_ROXR
  664.     code(roxr_)
  665.     entry_(2, ANY_AM,   ANY_AM, DN_AM,     DN_AM,   X_ROXL1)    /* dreg dyn */
  666.     entry_(2, MODE1_AM, ANY_AM, QUICK8_AM, DN_AM,   X_ROXL1)    /* dreg stat */
  667.     entry_(2, LEN16_AM, NONE_AM, MALT_AM,  NONE_AM, X_ROXL2)    /* memory x1 */
  668.     end_l
  669.  
  670. /* rte */
  671.     code(rte_)
  672.     entry_(0, NONE_AM, NONE_AM, NONE_AM, NONE_AM, X_RTE)
  673.     end_l
  674.  
  675. /* rtr */
  676.     code(rtr_)
  677.     entry_(0, NONE_AM, NONE_AM, NONE_AM, NONE_AM, X_RTR)
  678.     end_l
  679.  
  680. /* rts */
  681.     code(rts_)
  682.     entry_(0, NONE_AM, NONE_AM, NONE_AM, NONE_AM, X_RTS)
  683.     end_l
  684.  
  685. /* sbcd */
  686.     code(sbcd_)
  687.     entry_(0, LEN8_AM, AS_1_AM, DEC_AM, DEC_AM, X_SBCD)
  688.     entry_(0, LEN8_AM, AS_1_AM, DN_AM,  DN_AM,  X_SBCD)
  689.     end_l
  690.  
  691. /* scc */
  692.     code(scc_)
  693.     entry_(0, LEN8_AM, MODE2_AM, DN_AM, DISP_AM, X_SCC)
  694.     end_l
  695.  
  696. /* scs */
  697.     code(scs_)
  698.     entry_(0, LEN8_AM, MODE2_AM, DN_AM, DISP_AM, X_SCS)
  699.     end_l
  700.  
  701. /* seq */
  702.     code(seq_)
  703.     entry_(0, LEN8_AM, MODE2_AM, DN_AM, DISP_AM, X_SEQ)
  704.     end_l
  705.  
  706. /* sf */
  707.     code(sf_)
  708.     entry_(0, LEN8_AM, MODE2_AM, DN_AM, DISP_AM, X_SF)
  709.     end_l
  710.  
  711. /* sge */
  712.     code(sge_)
  713.     entry_(0, LEN8_AM, MODE2_AM, DN_AM, DISP_AM, X_SGE)
  714.     end_l
  715.  
  716. /* sgt */
  717.     code(sgt_)
  718.     entry_(0, LEN8_AM, MODE2_AM, DN_AM, DISP_AM, X_SGT)
  719.     end_l
  720.  
  721. /* shi */
  722.     code(shi_)
  723.     entry_(0, LEN8_AM, MODE2_AM, DN_AM, DISP_AM, X_SHI)
  724.     end_l
  725.  
  726. /* sle */
  727.     code(sle_)
  728.     entry_(0, LEN8_AM, MODE2_AM, DN_AM, DISP_AM, X_SLE)
  729.     end_l
  730.  
  731. /* sls */
  732.     code(sls_)
  733.     entry_(0, LEN8_AM, MODE2_AM, DN_AM, DISP_AM, X_SLS)
  734.     end_l
  735.  
  736. /* slt */
  737.     code(slt_)
  738.     entry_(0, LEN8_AM, MODE2_AM, DN_AM, DISP_AM, X_SLT)
  739.     end_l
  740.  
  741. /* smi */
  742.     code(smi_)
  743.     entry_(0, LEN8_AM, MODE2_AM, DN_AM, DISP_AM, X_SMI)
  744.     end_l
  745.  
  746. /* sne */
  747.     code(sne_)
  748.     entry_(0, LEN8_AM, MODE2_AM, DN_AM, DISP_AM, X_SNE)
  749.     end_l
  750.  
  751. /* spl */
  752.     code(spl_)
  753.     entry_(0, LEN8_AM, MODE2_AM, DN_AM, DISP_AM, X_SPL)
  754.     end_l
  755.  
  756. /* st */
  757.     code(st_)
  758.     entry_(0, LEN8_AM, MODE2_AM, DN_AM, DISP_AM, X_ST)
  759.     end_l
  760.  
  761. /* svc */
  762.     code(svc_)
  763.     entry_(0, LEN8_AM, MODE2_AM, DN_AM, DISP_AM, X_SVC)
  764.     end_l
  765.  
  766. /* svs */
  767.     code(svs_)
  768.     entry_(0, LEN8_AM, MODE2_AM, DN_AM, DISP_AM, X_SVS)
  769.     end_l
  770.  
  771.  
  772. /* stop */
  773.     /* privileged instruction */
  774.     code(stop_)
  775.     entry_(0, ANY_AM, NONE_AM, IMM16_AM, NONE_AM, X_STOP)
  776.     end_l
  777.  
  778.  
  779. /* sub */
  780.     code(sub_)
  781.     entry_(2, MODE1_AM, ANY_AM,  QUICK8_AM, DALT_AM, X_SUBQ)
  782.     entry_(2, MODE1_AM, NOT8_AM, QUICK8_AM, AN_AM,   X_SUBQ)
  783.     entry_(2, ANY_AM,  AS_1_AM, DATA_AM, DN_AM,   X_SUB)
  784.     entry_(2, ANY_AM,  AS_1_AM, DN_AM,   MALT_AM, X_SUB)
  785.     entry_(2, NOT8_AM, AS_1_AM, AN_AM,   DN_AM,   X_SUB)
  786.     entry_(1, LEN16_AM, LEN32_AM, GEN_AM, AN_AM,  X_SUBA)
  787.     entry_(2, NOT8_AM, AS_1_AM, GEN_AM, AN_AM,   X_SUBA)
  788.     entry_(2, ANY_AM,  AS_1_AM, IMM_AM,  DALT_AM, X_SUBI)
  789.     end_l
  790.  
  791. /* suba */
  792.     code(suba_)
  793.     entry_(2, MODE1_AM, NOT8_AM, QUICK8_AM, AN_AM,   X_SUBQ)
  794.     entry_(1, LEN16_AM, LEN32_AM, GEN_AM, AN_AM, X_SUBA)
  795.     entry_(2, NOT8_AM,  AS_1_AM,  GEN_AM, AN_AM, X_SUBA)
  796.     end_l
  797.  
  798. /* subi */
  799.     code(subi_)
  800.     entry_(2, MODE1_AM, ANY_AM,  QUICK8_AM, DALT_AM, X_SUBQ)
  801.     entry_(2, ANY_AM, AS_1_AM, IMM_AM, DALT_AM, X_SUBI)
  802.     end_l
  803.  
  804. /* subq */
  805.     code(subq_)
  806.     entry_(2, MODE1_AM, ANY_AM,  QUICK8_AM, DALT_AM, X_SUBQ)
  807.     entry_(2, MODE1_AM, NOT8_AM, QUICK8_AM, AN_AM,   X_SUBQ)
  808.     end_l
  809.  
  810. /* subx */
  811.     code(subx_)
  812.     entry_(2, ANY_AM, AS_1_AM, DEC_AM, DEC_AM, X_SUBX)
  813.     entry_(2, ANY_AM, AS_1_AM, DN_AM,  DN_AM,  X_SUBX)
  814.     end_l
  815.  
  816.  
  817. /* swap */
  818.     code(swap_)
  819.     entry_(0, NOT8_AM, NONE_AM, DN_AM, NONE_AM, X_SWAP)
  820.     end_l
  821.     
  822. /* tas */
  823.     code(tas_)
  824.     entry_(0, LEN8_AM, AS_1_AM, DALT_AM, NONE_AM, X_TAS)
  825.     end_l
  826.  
  827. /* trap */
  828.     code(trap_)
  829.     entry_(0, MODE1_AM, NONE_AM, TRAP15_AM, NONE_AM, X_TRAP)
  830.     end_l
  831.  
  832. /* trapv */
  833.     code(trapv_)
  834.     entry_(0, MODE1_AM, NONE_AM, TRAP15_AM, NONE_AM, X_TRAPV)
  835.     end_l
  836.  
  837. /* tst */
  838.     code(tst_)
  839.     entry_(1, ANY_AM, NONE_AM, DALT_AM, NONE_AM, X_TST)
  840.     end_l
  841.  
  842. /* unlk */
  843.     code(unlk_)
  844.     entry_(0, LEN32_AM, NONE_AM, AN_AM, NONE_AM, X_UNLK)
  845.     end_l
  846. /*
  847.     x_token lookup list--these entries are to correspond in sequence
  848.     to the X_TOK list in enum.h, so that the table for an X_TOK
  849.     is *x_lookup[X_TOK], and an integer in that table is 
  850.     (*x_lookup[X_TOK])[i]; note that the parentheses are essential!
  851.  
  852.     an entry consists of five integers
  853. */
  854.  
  855.  
  856. /* WARNING: illegal (p. 125 of the Book) is not in X_TOK enumeration */
  857. #define X_ILL 0
  858. int *x_lookup[] = {
  859.     NULL,                    /* X_TOK is zero */
  860.     abcd_,    add_,    adda_,    addi_,    addq_,
  861.     addx_,    and_,    andi_,    asl_,    asr_,
  862.     bchg_,    bclr_,    bra_,    bset_,    bsr_,
  863.     btst_, NULL,    chk_,    clr_,    cmp_,    /* NULL bxx */
  864.     cmpa_,    cmpi_,    cmpm_,    NULL,    divs_,    /* dbxx */
  865.     divu_,    eor_,    eori_,    exg_,    ext_,
  866.     jmp_,    jsr_,    lea_,    link_,    lsl_,    /* insert ILL in this line */
  867.     lsr_,    move_,    movea_, movem_,    movep_,
  868.     moveq_,muls_,    mulu_,    nbcd_,    neg_,
  869.     negx_,    nop_,    not_,    or_,    ori_,
  870.     pea_,    reset_,rol_,    ror_,    roxl_,
  871.     roxr_,    rte_,    rtr_,    rts_,    sbcd_,
  872.     NULL,    stop_,    sub_,    suba_,    subi_,    /* sxx */
  873.     subq_,    subx_,    swap_,    tas_,    trap_,
  874.     trapv_,tst_,    unlk_,
  875.     NULL, NULL,                /* MODS, MODU */
  876.  
  877.     bcc_,    bcs_,    beq_,    bge_,    bgt_,    bhi_,    ble_,
  878.     bls_,    blt_,    bmi_,    bne_,    bpl_,    bvc_,    bvs_,
  879.  
  880.     dbcc_,    dbcs_,    dbeq_,    dbf_,    dbge_,    dbgt_,    dbhi_,    dble_,
  881.     dbls_,    dblt_,    dbmi_,    dbne_,    dbpl_,    dbt_,    dbvc_,    dbvs_,
  882.  
  883.     scc_,    scs_,    seq_,    sf_,    sge_,    sgt_,    shi_,    sle_,
  884.     sls_,    slt_,    smi_,    sne_,    spl_,    st_,    svc_,    svs_,
  885.  
  886.     NULL
  887. };
  888.