First Commit of my working state
[simh.git] / VAX / vax_sys.c
CommitLineData
196ba1fc
PH
1/* vax_sys.c: VAX simulator interface\r
2\r
3 Copyright (c) 1998-2005, Robert M Supnik\r
4\r
5 Permission is hereby granted, free of charge, to any person obtaining a\r
6 copy of this software and associated documentation files (the "Software"),\r
7 to deal in the Software without restriction, including without limitation\r
8 the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
9 and/or sell copies of the Software, and to permit persons to whom the\r
10 Software is furnished to do so, subject to the following conditions:\r
11\r
12 The above copyright notice and this permission notice shall be included in\r
13 all copies or substantial portions of the Software.\r
14\r
15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\r
18 ROBERT M SUPNIK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
19 IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
20 CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
21\r
22 Except as contained in this notice, the name of Robert M Supnik shall not be\r
23 used in advertising or otherwise to promote the sale, use or other dealings\r
24 in this Software without prior written authorization from Robert M Supnik.\r
25\r
26 03-Nov-05 RMS Added 780 stop codes\r
27 04-Sep-05 RMS Fixed missing assignment (found by Peter Schorn)\r
28 16-Aug-05 RMS Fixed C++ declaration and cast problems\r
29 15-Sep-04 RMS Fixed bugs in character display and parse\r
30 30-Sep-04 RMS Fixed bugs in parsing indirect displacement modes\r
31 Added compatibility mode support\r
32 04-Sep-04 RMS Added octa instruction support\r
33 02-Sep-04 RMS Fixed parse branch return status\r
34 13-Jul-04 RMS Fixed bad block routine\r
35 16-Jun-04 RMS Added DHQ11 support\r
36 21-Mar-04 RMS Added RXV21 support\r
37 06-May-03 RMS Added support for second DELQA\r
38 12-Oct-02 RMS Added multiple RQ controller support\r
39 10-Oct-02 RMS Added DELQA support\r
40 21-Sep-02 RMS Extended symbolic ex/mod to all byte devices\r
41 06-Sep-02 RMS Added TMSCP support\r
42 14-Jul-02 RMS Added infinite loop message\r
43*/\r
44\r
45#include "vax_defs.h"\r
46#include <ctype.h>\r
47\r
48#if defined (FULL_VAX)\r
49#define ODC(x) (x)\r
50#else\r
51#define ODC(x) ((x) << DR_V_USPMASK)\r
52#endif\r
53\r
54extern UNIT cpu_unit;\r
55extern REG cpu_reg[];\r
56extern int32 saved_PC;\r
57extern int32 PSL;\r
58extern int32 sim_switches;\r
59\r
60t_stat fprint_sym_m (FILE *of, uint32 addr, t_value *val);\r
61int32 fprint_sym_qoimm (FILE *of, t_value *val, int32 vp, int32 lnt);\r
62t_stat parse_char (char *cptr, t_value *val, int32 lnt);\r
63t_stat parse_sym_m (char *cptr, uint32 addr, t_value *val);\r
64int32 parse_brdisp (char *cptr, uint32 addr, t_value *val,\r
65 int32 vp, int32 lnt, t_stat *r);\r
66int32 parse_spec (char *cptr, uint32 addr, t_value *val,\r
67 int32 vp, int32 disp, t_stat *r);\r
68char *parse_rnum (char *cptr, int32 *rn);\r
69int32 parse_sym_qoimm (int32 *lit, t_value *val, int32 vp,\r
70 int lnt, int32 minus);\r
71\r
72extern t_stat fprint_sym_cm (FILE *of, t_addr addr, t_value *bytes, int32 sw);\r
73t_stat parse_sym_cm (char *cptr, t_addr addr, t_value *bytes, int32 sw);\r
74\r
75/* SCP data structures and interface routines\r
76\r
77 sim_name simulator name string\r
78 sim_PC pointer to saved PC register descriptor\r
79 sim_emax number of words for examine\r
80 sim_devices array of pointers to simulated devices\r
81 sim_stop_messages array of pointers to stop messages\r
82 sim_load binary loader\r
83*/\r
84\r
85REG *sim_PC = &cpu_reg[0];\r
86\r
87int32 sim_emax = 60;\r
88\r
89const char *sim_stop_messages[] = {\r
90 "Unknown error",\r
91 "HALT instruction",\r
92 "Breakpoint",\r
93 "CHMx on interrupt stack",\r
94 "Invalid SCB vector",\r
95 "Exception in interrupt or exception",\r
96 "Process PTE in P0 or P1 space",\r
97 "Interrupt at undefined IPL",\r
98 "Fatal RQDX3 error",\r
99 "Infinite loop",\r
100 "Sanity timer expired",\r
101 "Software done",\r
102 "Reboot requested",\r
103 "Unknown error",\r
104 "Unknown abort code"\r
105 };\r
106\r
107/* Factory bad block table creation routine\r
108\r
109 This routine writes a DEC standard 044 compliant bad block table on the\r
110 last track of the specified unit. The bad block table consists of 10\r
111 repetitions of the same table, formatted as follows:\r
112\r
113 words 0-1 pack id number\r
114 words 2-3 cylinder/sector/surface specifications\r
115 :\r
116 words n-n+1 end of table (-1,-1)\r
117\r
118 Inputs:\r
119 uptr = pointer to unit\r
120 sec = number of sectors per surface\r
121 wds = number of words per sector\r
122 Outputs:\r
123 sta = status code\r
124*/\r
125\r
126t_stat pdp11_bad_block (UNIT *uptr, int32 sec, int32 wds)\r
127{\r
128int32 i;\r
129t_addr da;\r
130uint16 *buf;\r
131\r
132if ((sec < 2) || (wds < 16)) return SCPE_ARG;\r
133if ((uptr->flags & UNIT_ATT) == 0) return SCPE_UNATT;\r
134if (!get_yn ("Overwrite last track? [N]", FALSE)) return SCPE_OK;\r
135da = (uptr->capac - (sec * wds)) * sizeof (uint16);\r
136if (sim_fseek (uptr->fileref, da, SEEK_SET)) return SCPE_IOERR;\r
137if ((buf = (uint16 *) malloc (wds * sizeof (uint16))) == NULL) return SCPE_MEM;\r
138buf[0] = 0x1234;\r
139buf[1] = 0x5678;\r
140buf[2] = buf[3] = 0;\r
141for (i = 4; i < wds; i++) buf[i] = 0xFFFF;\r
142for (i = 0; (i < sec) && (i < 10); i++)\r
143 sim_fwrite (buf, sizeof (uint16), wds, uptr->fileref);\r
144free (buf);\r
145if (ferror (uptr->fileref)) return SCPE_IOERR;\r
146return SCPE_OK;\r
147}\r
148\r
149/* Dispatch/decoder table\r
150\r
151 The first entry contains:\r
152 - FPD legal flag (DR_F)\r
153 - number of specifiers for decode bits 2:0>\r
154 - number of specifiers for unimplemented instructions bits<6:4>\r
155 */\r
156\r
157const uint16 drom[NUM_INST][MAX_SPEC + 1] = {\r
1580, 0, 0, 0, 0, 0, 0, /* HALT */\r
1590, 0, 0, 0, 0, 0, 0, /* NOP */\r
1600, 0, 0, 0, 0, 0, 0, /* REI */\r
1610, 0, 0, 0, 0, 0, 0, /* BPT */\r
1620, 0, 0, 0, 0, 0, 0, /* RET */\r
1630, 0, 0, 0, 0, 0, 0, /* RSB */\r
1640, 0, 0, 0, 0, 0, 0, /* LDPCTX */\r
1650, 0, 0, 0, 0, 0, 0, /* SVPCTX */\r
1664+DR_F, RW, AB, RW, AB, 0, 0, /* CVTPS */\r
1674+DR_F, RW, AB, RW, AB, 0, 0, /* CVTSP */\r
1686, RL, RL, RL, RL, RL, WL, /* INDEX */\r
1694+DR_F, AB, RL, RW, AB, 0, 0, /* CRC */\r
1703, RB, RW, AB, 0, 0, 0, /* PROBER */\r
1713, RB, RW, AB, 0, 0, 0, /* PROBEW */\r
1722, AB, AB, 0, 0, 0, 0, /* INSQUE */\r
1732, AB, WL, 0, 0, 0, 0, /* REMQUE */\r
1741, BB, 0, 0, 0, 0, 0, /* BSBB */\r
1751, BB, 0, 0, 0, 0, 0, /* BRB */\r
1761, BB, 0, 0, 0, 0, 0, /* BNEQ */\r
1771, BB, 0, 0, 0, 0, 0, /* BEQL */\r
1781, BB, 0, 0, 0, 0, 0, /* BGTR */\r
1791, BB, 0, 0, 0, 0, 0, /* BLEQ */\r
1801, AB, 0, 0, 0, 0, 0, /* JSB */\r
1811, AB, 0, 0, 0, 0, 0, /* JMP */\r
1821, BB, 0, 0, 0, 0, 0, /* BGEQ */\r
1831, BB, 0, 0, 0, 0, 0, /* BLSS */\r
1841, BB, 0, 0, 0, 0, 0, /* BGTRU */\r
1851, BB, 0, 0, 0, 0, 0, /* BLEQU */\r
1861, BB, 0, 0, 0, 0, 0, /* BVC */\r
1871, BB, 0, 0, 0, 0, 0, /* BVS */\r
1881, BB, 0, 0, 0, 0, 0, /* BCC */\r
1891, BB, 0, 0, 0, 0, 0, /* BCS */\r
1904+DR_F, RW, AB, RW, AB, 0, 0, /* ADDP4 */\r
1916+DR_F, RW, AB, RW, AB, RW, AB, /* ADDP6 */\r
1924+DR_F, RW, AB, RW, AB, 0, 0, /* SUBP4 */\r
1936+DR_F, RW, AB, RW, AB, RW, AB, /* SUBP6 */\r
1945+DR_F, RW, AB, AB, RW, AB, 0, /* CVTPT */\r
1956+DR_F, RW, AB, RW, AB, RW, AB, /* MULP6 */\r
1965+DR_F, RW, AB, AB, RW, AB, 0, /* CVTTP */\r
1976+DR_F, RW, AB, RW, AB, RW, AB, /* DIVP6 */\r
1983+DR_F, RW, AB, AB, 0, 0, 0, /* MOVC3 */\r
1993+DR_F, RW, AB, AB, 0, 0, 0, /* CMPC3 */\r
2004+DR_F, RW, AB, AB, RB, 0, 0, /* SCANC */\r
2014+DR_F, RW, AB, AB, RB, 0, 0, /* SPANC */\r
2025+DR_F, RW, AB, RB, RW, AB, 0, /* MOVC5 */\r
2035+DR_F, RW, AB, RB, RW, AB, 0, /* CMPC5 */\r
2046+DR_F, RW, AB, RB, AB, RW, AB, /* MOVTC */\r
2056+DR_F, RW, AB, RB, AB, RW, AB, /* MOVTUC */\r
2061, BW, 0, 0, 0, 0, 0, /* BSBW */\r
2071, BW, 0, 0, 0, 0, 0, /* BRW */\r
2082, RW, WL, 0, 0, 0, 0, /* CVTWL */\r
2092, RW, WB, 0, 0, 0, 0, /* CVTWB */\r
2103+DR_F, RW, AB, AB, 0, 0, 0, /* MOVP */\r
2113+DR_F, RW, AB, AB, 0, 0, 0, /* CMPP3 */\r
2123+DR_F, RW, AB, WL, 0, 0, 0, /* CVTPL */\r
2134+DR_F, RW, AB, RW, AB, 0, 0, /* CMPP4 */\r
2144+DR_F, RW, AB, AB, AB, 0, 0, /* EDITPC */\r
2154+DR_F, RW, AB, RW, AB, 0, 0, /* MATCHC */\r
2163+DR_F, RB, RW, AB, 0, 0, 0, /* LOCC */\r
2173+DR_F, RB, RW, AB, 0, 0, 0, /* SKPC */\r
2182, RW, WL, 0, 0, 0, 0, /* MOVZWL */\r
2194, RW, RW, MW, BW, 0, 0, /* ACBW */\r
2202, AW, WL, 0, 0, 0, 0, /* MOVAW */\r
2211, AW, 0, 0, 0, 0, 0, /* PUSHAW */\r
2222, RF, ML, 0, 0, 0, 0, /* ADDF2 */\r
2233, RF, RF, WL, 0, 0, 0, /* ADDF3 */\r
2242, RF, ML, 0, 0, 0, 0, /* SUBF2 */\r
2253, RF, RF, WL, 0, 0, 0, /* SUBF3 */\r
2262, RF, ML, 0, 0, 0, 0, /* MULF2 */\r
2273, RF, RF, WL, 0, 0, 0, /* MULF3 */\r
2282, RF, ML, 0, 0, 0, 0, /* DIVF2 */\r
2293, RF, RF, WL, 0, 0, 0, /* DIVF3 */\r
2302, RF, WB, 0, 0, 0, 0, /* CVTFB */\r
2312, RF, WW, 0, 0, 0, 0, /* CVTFW */\r
2322, RF, WL, 0, 0, 0, 0, /* CVTFL */\r
2332, RF, WL, 0, 0, 0, 0, /* CVTRFL */\r
2342, RB, WL, 0, 0, 0, 0, /* CVTBF */\r
2352, RW, WL, 0, 0, 0, 0, /* CVTWF */\r
2362, RL, WL, 0, 0, 0, 0, /* CVTLF */\r
2374, RF, RF, ML, BW, 0, 0, /* ACBF */\r
2382, RF, WL, 0, 0, 0, 0, /* MOVF */\r
2392, RF, RF, 0, 0, 0, 0, /* CMPF */\r
2402, RF, WL, 0, 0, 0, 0, /* MNEGF */\r
2411, RF, 0, 0, 0, 0, 0, /* TSTF */\r
2425, RF, RB, RF, WL, WL, 0, /* EMODF */\r
2433, RF, RW, AB, 0, 0, 0, /* POLYF */\r
2442, RF, WQ, 0, 0, 0, 0, /* CVTFD */\r
2450, 0, 0, 0, 0, 0, 0, /* reserved */\r
2462, RW, WW, 0, 0, 0, 0, /* ADAWI */\r
2470, 0, 0, 0, 0, 0, 0, /* reserved */\r
2480, 0, 0, 0, 0, 0, 0, /* reserved */\r
2490, 0, 0, 0, 0, 0, 0, /* reserved */\r
2502, AB, AQ, 0, 0, 0, 0, /* INSQHI */\r
2512, AB, AQ, 0, 0, 0, 0, /* INSQTI */\r
2522, AQ, WL, 0, 0, 0, 0, /* REMQHI */\r
2532, AQ, WL, 0, 0, 0, 0, /* REMQTI */\r
2542, RD, MQ, 0, 0, 0, 0, /* ADDD2 */\r
2553, RD, RD, WQ, 0, 0, 0, /* ADDD3 */\r
2562, RD, MQ, 0, 0, 0, 0, /* SUBD2 */\r
2573, RD, RD, WQ, 0, 0, 0, /* SUBD3 */\r
2582, RD, MQ, 0, 0, 0, 0, /* MULD2 */\r
2593, RD, RD, WQ, 0, 0, 0, /* MULD3 */\r
2602, RD, MQ, 0, 0, 0, 0, /* DIVD2 */\r
2613, RD, RD, WQ, 0, 0, 0, /* DIVD3 */\r
2622, RD, WB, 0, 0, 0, 0, /* CVTDB */\r
2632, RD, WW, 0, 0, 0, 0, /* CVTDW */\r
2642, RD, WL, 0, 0, 0, 0, /* CVTDL */\r
2652, RD, WL, 0, 0, 0, 0, /* CVTRDL */\r
2662, RB, WQ, 0, 0, 0, 0, /* CVTBD */\r
2672, RW, WQ, 0, 0, 0, 0, /* CVTWD */\r
2682, RL, WQ, 0, 0, 0, 0, /* CVTLD */\r
2694, RD, RD, MQ, BW, 0, 0, /* ACBD */\r
2702, RD, WQ, 0, 0, 0, 0, /* MOVD */\r
2712, RD, RD, 0, 0, 0, 0, /* CMPD */\r
2722, RD, WQ, 0, 0, 0, 0, /* MNEGD */\r
2731, RD, 0, 0, 0, 0, 0, /* TSTD */\r
2745, RD, RB, RD, WL, WQ, 0, /* EMODD */\r
2753, RD, RW, AB, 0, 0, 0, /* POLYD */\r
2762, RD, WL, 0, 0, 0, 0, /* CVTDF */\r
2770, 0, 0, 0, 0, 0, 0, /* reserved */\r
2783, RB, RL, WL, 0, 0, 0, /* ASHL */\r
2793, RB, RQ, WQ, 0, 0, 0, /* ASHQ */\r
2804, RL, RL, RL, WQ, 0, 0, /* EMUL */\r
2814, RL, RQ, WL, WL, 0, 0, /* EDIV */\r
2821, WQ, 0, 0, 0, 0, 0, /* CLRQ */\r
2832, RQ, WQ, 0, 0, 0, 0, /* MOVQ */\r
2842, AQ, WL, 0, 0, 0, 0, /* MOVAQ */\r
2851, AQ, 0, 0, 0, 0, 0, /* PUSHAQ */\r
2862, RB, MB, 0, 0, 0, 0, /* ADDB2 */\r
2873, RB, RB, WB, 0, 0, 0, /* ADDB3 */\r
2882, RB, MB, 0, 0, 0, 0, /* SUBB2 */\r
2893, RB, RB, WB, 0, 0, 0, /* SUBB3 */\r
2902, RB, MB, 0, 0, 0, 0, /* MULB2 */\r
2913, RB, RB, WB, 0, 0, 0, /* MULB3 */\r
2922, RB, MB, 0, 0, 0, 0, /* DIVB2 */\r
2933, RB, RB, WB, 0, 0, 0, /* DIVB3 */\r
2942, RB, MB, 0, 0, 0, 0, /* BISB2 */\r
2953, RB, RB, WB, 0, 0, 0, /* BISB3 */\r
2962, RB, MB, 0, 0, 0, 0, /* BICB2 */\r
2973, RB, RB, WB, 0, 0, 0, /* BICB3 */\r
2982, RB, MB, 0, 0, 0, 0, /* XORB2 */\r
2993, RB, RB, WB, 0, 0, 0, /* XORB3 */\r
3002, RB, WB, 0, 0, 0, 0, /* MNEGB */\r
3013, RB, RB, RB, 0, 0, 0, /* CASEB */\r
3022, RB, WB, 0, 0, 0, 0, /* MOVB */\r
3032, RB, RB, 0, 0, 0, 0, /* CMPB */\r
3042, RB, WB, 0, 0, 0, 0, /* MCOMB */\r
3052, RB, RB, 0, 0, 0, 0, /* BITB */\r
3061, WB, 0, 0, 0, 0, 0, /* CLRB */\r
3071, RB, 0, 0, 0, 0, 0, /* TSTB */\r
3081, MB, 0, 0, 0, 0, 0, /* INCB */\r
3091, MB, 0, 0, 0, 0, 0, /* DECB */\r
3102, RB, WL, 0, 0, 0, 0, /* CVTBL */\r
3112, RB, WW, 0, 0, 0, 0, /* CVTBW */\r
3122, RB, WL, 0, 0, 0, 0, /* MOVZBL */\r
3132, RB, WW, 0, 0, 0, 0, /* MOVZBW */\r
3143, RB, RL, WL, 0, 0, 0, /* ROTL */\r
3154, RB, RB, MB, BW, 0, 0, /* ACBB */\r
3162, AB, WL, 0, 0, 0, 0, /* MOVAB */\r
3171, AB, 0, 0, 0, 0, 0, /* PUSHAB */\r
3182, RW, MW, 0, 0, 0, 0, /* ADDW2 */\r
3193, RW, RW, WW, 0, 0, 0, /* ADDW3 */\r
3202, RW, MW, 0, 0, 0, 0, /* SUBW2 */\r
3213, RW, RW, WW, 0, 0, 0, /* SUBW3 */\r
3222, RW, MW, 0, 0, 0, 0, /* MULW2 */\r
3233, RW, RW, WW, 0, 0, 0, /* MULW3 */\r
3242, RW, MW, 0, 0, 0, 0, /* DIVW2 */\r
3253, RW, RW, WW, 0, 0, 0, /* DIVW3 */\r
3262, RW, MW, 0, 0, 0, 0, /* BISW2 */\r
3273, RW, RW, WW, 0, 0, 0, /* BISW3 */\r
3282, RW, MW, 0, 0, 0, 0, /* BICW2 */\r
3293, RW, RW, WW, 0, 0, 0, /* BICW3 */\r
3302, RW, MW, 0, 0, 0, 0, /* XORW2 */\r
3313, RW, RW, WW, 0, 0, 0, /* XORW3 */\r
3322, RW, WW, 0, 0, 0, 0, /* MNEGW */\r
3333, RW, RW, RW, 0, 0, 0, /* CASEW */\r
3342, RW, WW, 0, 0, 0, 0, /* MOVW */\r
3352, RW, RW, 0, 0, 0, 0, /* CMPW */\r
3362, RW, WW, 0, 0, 0, 0, /* MCOMW */\r
3372, RW, RW, 0, 0, 0, 0, /* BITW */\r
3381, WW, 0, 0, 0, 0, 0, /* CLRW */\r
3391, RW, 0, 0, 0, 0, 0, /* TSTW */\r
3401, MW, 0, 0, 0, 0, 0, /* INCW */\r
3411, MW, 0, 0, 0, 0, 0, /* DECW */\r
3421, RW, 0, 0, 0, 0, 0, /* BISPSW */\r
3431, RW, 0, 0, 0, 0, 0, /* BICPSW */\r
3441, RW, 0, 0, 0, 0, 0, /* POPR */\r
3451, RW, 0, 0, 0, 0, 0, /* PUSHR */\r
3461, RW, 0, 0, 0, 0, 0, /* CHMK */\r
3471, RW, 0, 0, 0, 0, 0, /* CHME */\r
3481, RW, 0, 0, 0, 0, 0, /* CHMS */\r
3491, RW, 0, 0, 0, 0, 0, /* CHMU */\r
3502, RL, ML, 0, 0, 0, 0, /* ADDL2 */\r
3513, RL, RL, WL, 0, 0, 0, /* ADDL3 */\r
3522, RL, ML, 0, 0, 0, 0, /* SUBL2 */\r
3533, RL, RL, WL, 0, 0, 0, /* SUBL3 */\r
3542, RL, ML, 0, 0, 0, 0, /* MULL2 */\r
3553, RL, RL, WL, 0, 0, 0, /* MULL3 */\r
3562, RL, ML, 0, 0, 0, 0, /* DIVL2 */\r
3573, RL, RL, WL, 0, 0, 0, /* DIVL3 */\r
3582, RL, ML, 0, 0, 0, 0, /* BISL2 */\r
3593, RL, RL, WL, 0, 0, 0, /* BISL3 */\r
3602, RL, ML, 0, 0, 0, 0, /* BICL2 */\r
3613, RL, RL, WL, 0, 0, 0, /* BICL3 */\r
3622, RL, ML, 0, 0, 0, 0, /* XORL2 */\r
3633, RL, RL, WL, 0, 0, 0, /* XORL3 */\r
3642, RL, WL, 0, 0, 0, 0, /* MNEGL */\r
3653, RL, RL, RL, 0, 0, 0, /* CASEL */\r
3662, RL, WL, 0, 0, 0, 0, /* MOVL */\r
3672, RL, RL, 0, 0, 0, 0, /* CMPL */\r
3682, RL, WL, 0, 0, 0, 0, /* MCOML */\r
3692, RL, RL, 0, 0, 0, 0, /* BITL */\r
3701, WL, 0, 0, 0, 0, 0, /* CLRL */\r
3711, RL, 0, 0, 0, 0, 0, /* TSTL */\r
3721, ML, 0, 0, 0, 0, 0, /* INCL */\r
3731, ML, 0, 0, 0, 0, 0, /* DECL */\r
3742, RL, ML, 0, 0, 0, 0, /* ADWC */\r
3752, RL, ML, 0, 0, 0, 0, /* SBWC */\r
3762, RL, RL, 0, 0, 0, 0, /* MTPR */\r
3772, RL, WL, 0, 0, 0, 0, /* MFPR */\r
3781, WL, 0, 0, 0, 0, 0, /* MOVPSL */\r
3791, RL, 0, 0, 0, 0, 0, /* PUSHL */\r
3802, AL, WL, 0, 0, 0, 0, /* MOVAL */\r
3811, AL, 0, 0, 0, 0, 0, /* PUSHAL */\r
3823, RL, VB, BB, 0, 0, 0, /* BBS */\r
3833, RL, VB, BB, 0, 0, 0, /* BBC */\r
3843, RL, VB, BB, 0, 0, 0, /* BBSS */\r
3853, RL, VB, BB, 0, 0, 0, /* BBCS */\r
3863, RL, VB, BB, 0, 0, 0, /* BBSC */\r
3873, RL, VB, BB, 0, 0, 0, /* BBCC */\r
3883, RL, VB, BB, 0, 0, 0, /* BBSSI */\r
3893, RL, VB, BB, 0, 0, 0, /* BBCCI */\r
3902, RL, BB, 0, 0, 0, 0, /* BLBS */\r
3912, RL, BB, 0, 0, 0, 0, /* BLBC */\r
3924, RL, RB, VB, WL, 0, 0, /* FFS */\r
3934, RL, RB, VB, WL, 0, 0, /* FFC */\r
3944, RL, RB, VB, RL, 0, 0, /* CMPV */\r
3954, RL, RB, VB, RL, 0, 0, /* CMPZV */\r
3964, RL, RB, VB, WL, 0, 0, /* EXTV */\r
3974, RL, RB, VB, WL, 0, 0, /* EXTZV */\r
3984, RL, RL, RB, VB, 0, 0, /* INSV */\r
3994, RL, RL, ML, BW, 0, 0, /* ACBL */\r
4003, RL, ML, BB, 0, 0, 0, /* AOBLSS */\r
4013, RL, ML, BB, 0, 0, 0, /* AOBLEQ */\r
4022, ML, BB, 0, 0, 0, 0, /* SOBGEQ */\r
4032, ML, BB, 0, 0, 0, 0, /* SOBGTR */\r
4042, RL, WB, 0, 0, 0, 0, /* CVTLB */\r
4052, RL, WW, 0, 0, 0, 0, /* CVTLW */\r
4066+DR_F, RB, RW, AB, RB, RW, AB, /* ASHP */\r
4073+DR_F, RL, RW, AB, 0, 0, 0, /* CVTLP */\r
4082, AB, AB, 0, 0, 0, 0, /* CALLG */\r
4092, RL, AB, 0, 0, 0, 0, /* CALLS */\r
4100, 0, 0, 0, 0, 0, 0, /* XFC */\r
4110, 0, 0, 0, 0, 0, 0, /* 0FD */\r
4120, 0, 0, 0, 0, 0, 0, /* 0FE */\r
4130, 0, 0, 0, 0, 0, 0, /* 0FF */\r
4140, 0, 0, 0, 0, 0, 0, /* 100-10F */\r
4150, 0, 0, 0, 0, 0, 0,\r
4160, 0, 0, 0, 0, 0, 0,\r
4170, 0, 0, 0, 0, 0, 0,\r
4180, 0, 0, 0, 0, 0, 0,\r
4190, 0, 0, 0, 0, 0, 0,\r
4200, 0, 0, 0, 0, 0, 0,\r
4210, 0, 0, 0, 0, 0, 0,\r
4220, 0, 0, 0, 0, 0, 0,\r
4230, 0, 0, 0, 0, 0, 0,\r
4240, 0, 0, 0, 0, 0, 0,\r
4250, 0, 0, 0, 0, 0, 0,\r
4260, 0, 0, 0, 0, 0, 0,\r
4270, 0, 0, 0, 0, 0, 0,\r
4280, 0, 0, 0, 0, 0, 0,\r
4290, 0, 0, 0, 0, 0, 0,\r
4300, 0, 0, 0, 0, 0, 0, /* 110-11F */\r
4310, 0, 0, 0, 0, 0, 0,\r
4320, 0, 0, 0, 0, 0, 0,\r
4330, 0, 0, 0, 0, 0, 0,\r
4340, 0, 0, 0, 0, 0, 0,\r
4350, 0, 0, 0, 0, 0, 0,\r
4360, 0, 0, 0, 0, 0, 0,\r
4370, 0, 0, 0, 0, 0, 0,\r
4380, 0, 0, 0, 0, 0, 0,\r
4390, 0, 0, 0, 0, 0, 0,\r
4400, 0, 0, 0, 0, 0, 0,\r
4410, 0, 0, 0, 0, 0, 0,\r
4420, 0, 0, 0, 0, 0, 0,\r
4430, 0, 0, 0, 0, 0, 0,\r
4440, 0, 0, 0, 0, 0, 0,\r
4450, 0, 0, 0, 0, 0, 0,\r
4460, 0, 0, 0, 0, 0, 0, /* 120-12F */\r
4470, 0, 0, 0, 0, 0, 0,\r
4480, 0, 0, 0, 0, 0, 0,\r
4490, 0, 0, 0, 0, 0, 0,\r
4500, 0, 0, 0, 0, 0, 0,\r
4510, 0, 0, 0, 0, 0, 0,\r
4520, 0, 0, 0, 0, 0, 0,\r
4530, 0, 0, 0, 0, 0, 0,\r
4540, 0, 0, 0, 0, 0, 0,\r
4550, 0, 0, 0, 0, 0, 0,\r
4560, 0, 0, 0, 0, 0, 0,\r
4570, 0, 0, 0, 0, 0, 0,\r
4580, 0, 0, 0, 0, 0, 0,\r
4590, 0, 0, 0, 0, 0, 0,\r
4600, 0, 0, 0, 0, 0, 0,\r
4610, 0, 0, 0, 0, 0, 0,\r
4620, 0, 0, 0, 0, 0, 0, /* 130-13F */\r
4630, 0, 0, 0, 0, 0, 0,\r
464ODC(2), RD, WO, 0, 0, 0, 0, /* CVTDH */\r
4652, RG, WL, 0, 0, 0, 0, /* CVTGF */\r
4660, 0, 0, 0, 0, 0, 0,\r
4670, 0, 0, 0, 0, 0, 0,\r
4680, 0, 0, 0, 0, 0, 0,\r
4690, 0, 0, 0, 0, 0, 0,\r
4700, 0, 0, 0, 0, 0, 0,\r
4710, 0, 0, 0, 0, 0, 0,\r
4720, 0, 0, 0, 0, 0, 0,\r
4730, 0, 0, 0, 0, 0, 0,\r
4740, 0, 0, 0, 0, 0, 0,\r
4750, 0, 0, 0, 0, 0, 0,\r
4760, 0, 0, 0, 0, 0, 0,\r
4770, 0, 0, 0, 0, 0, 0,\r
4782, RG, MQ, 0, 0, 0, 0, /* ADDG2 */\r
4793, RG, RG, WQ, 0, 0, 0, /* ADDG3 */\r
4802, RG, MQ, 0, 0, 0, 0, /* SUBG2 */\r
4813, RG, RG, WQ, 0, 0, 0, /* SUBG3 */\r
4822, RG, MQ, 0, 0, 0, 0, /* MULG2 */\r
4833, RG, RG, WQ, 0, 0, 0, /* MULG3 */\r
4842, RG, MQ, 0, 0, 0, 0, /* DIVG2 */\r
4853, RG, RG, WQ, 0, 0, 0, /* DIVG3 */\r
4862, RG, WB, 0, 0, 0, 0, /* CVTGB */\r
4872, RG, WW, 0, 0, 0, 0, /* CVTGW */\r
4882, RG, WL, 0, 0, 0, 0, /* CVTGL */\r
4892, RG, WL, 0, 0, 0, 0, /* CVTRGL */\r
4902, RB, WQ, 0, 0, 0, 0, /* CVTBG */\r
4912, RW, WQ, 0, 0, 0, 0, /* CVTWG */\r
4922, RL, WQ, 0, 0, 0, 0, /* CVTLG */\r
4934, RG, RG, MQ, BW, 0, 0, /* ACBG */\r
4942, RG, WQ, 0, 0, 0, 0, /* MOVG */\r
4952, RG, RG, 0, 0, 0, 0, /* CMPG */\r
4962, RG, WQ, 0, 0, 0, 0, /* MNEGG */\r
4971, RG, 0, 0, 0, 0, 0, /* TSTG */\r
4985, RG, RW, RG, WL, WQ, 0, /* EMODG */\r
4993, RG, RW, AB, 0, 0, 0, /* POLYG */\r
500ODC(2), RG, WO, 0, 0, 0, 0, /* CVTGH */\r
5010, 0, 0, 0, 0, 0, 0, /* reserved */\r
5020, 0, 0, 0, 0, 0, 0, /* reserved */\r
5030, 0, 0, 0, 0, 0, 0, /* reserved */\r
5040, 0, 0, 0, 0, 0, 0, /* reserved */\r
5050, 0, 0, 0, 0, 0, 0, /* reserved */\r
5060, 0, 0, 0, 0, 0, 0, /* reserved */\r
5070, 0, 0, 0, 0, 0, 0, /* reserved */\r
5080, 0, 0, 0, 0, 0, 0, /* reserved */\r
5090, 0, 0, 0, 0, 0, 0, /* reserved */\r
510ODC(2), RH, MO, 0, 0, 0, 0, /* ADDH2 */\r
511ODC(3), RH, RH, WO, 0, 0, 0, /* ADDH3 */\r
512ODC(2), RH, MO, 0, 0, 0, 0, /* SUBH2 */\r
513ODC(3), RH, RH, WO, 0, 0, 0, /* SUBH3 */\r
514ODC(2), RH, MO, 0, 0, 0, 0, /* MULH2 */\r
515ODC(3), RH, RH, WO, 0, 0, 0, /* MULH3 */\r
516ODC(2), RH, MO, 0, 0, 0, 0, /* DIVH2 */\r
517ODC(3), RH, RH, WO, 0, 0, 0, /* DIVH3 */\r
518ODC(2), RH, WB, 0, 0, 0, 0, /* CVTHB */\r
519ODC(2), RH, WW, 0, 0, 0, 0, /* CVTHW */\r
520ODC(2), RH, WL, 0, 0, 0, 0, /* CVTHL */\r
521ODC(2), RH, WL, 0, 0, 0, 0, /* CVTRHL */\r
522ODC(2), RB, WO, 0, 0, 0, 0, /* CVTBH */\r
523ODC(2), RW, WO, 0, 0, 0, 0, /* CVTWH */\r
524ODC(2), RL, WO, 0, 0, 0, 0, /* CVTLH */\r
525ODC(4), RH, RH, MO, BW, 0, 0, /* ACBH */\r
526ODC(2), RH, RO, 0, 0, 0, 0, /* MOVH */\r
527ODC(2), RH, RH, 0, 0, 0, 0, /* CMPH */\r
528ODC(2), RH, WO, 0, 0, 0, 0, /* MNEGH */\r
529ODC(1), RH, 0, 0, 0, 0, 0, /* TSTH */\r
530ODC(5), RH, RW, RH, WL, WO, 0, /* EMODH */\r
531ODC(3), RH, RW, AB, 0, 0, 0, /* POLYH */\r
532ODC(2), RH, WQ, 0, 0, 0, 0, /* CVTHG */\r
5330, 0, 0, 0, 0, 0, 0, /* reserved */\r
5340, 0, 0, 0, 0, 0, 0, /* reserved */\r
5350, 0, 0, 0, 0, 0, 0, /* reserved */\r
5360, 0, 0, 0, 0, 0, 0, /* reserved */\r
5370, 0, 0, 0, 0, 0, 0, /* reserved */\r
538ODC(1), WO, 0, 0, 0, 0, 0, /* CLRO */\r
539ODC(2), RO, RO, 0, 0, 0, 0, /* MOVO */\r
540ODC(2), AO, WL, 0, 0, 0, 0, /* MOVAO*/\r
541ODC(1), AO, 0, 0, 0, 0, 0, /* PUSHAO*/\r
5420, 0, 0, 0, 0, 0, 0, /* 180-18F */\r
5430, 0, 0, 0, 0, 0, 0,\r
5440, 0, 0, 0, 0, 0, 0,\r
5450, 0, 0, 0, 0, 0, 0,\r
5460, 0, 0, 0, 0, 0, 0,\r
5470, 0, 0, 0, 0, 0, 0,\r
5480, 0, 0, 0, 0, 0, 0,\r
5490, 0, 0, 0, 0, 0, 0,\r
5500, 0, 0, 0, 0, 0, 0,\r
5510, 0, 0, 0, 0, 0, 0,\r
5520, 0, 0, 0, 0, 0, 0,\r
5530, 0, 0, 0, 0, 0, 0,\r
5540, 0, 0, 0, 0, 0, 0,\r
5550, 0, 0, 0, 0, 0, 0,\r
5560, 0, 0, 0, 0, 0, 0,\r
5570, 0, 0, 0, 0, 0, 0,\r
5580, 0, 0, 0, 0, 0, 0, /* 190-19F */\r
5590, 0, 0, 0, 0, 0, 0,\r
5600, 0, 0, 0, 0, 0, 0,\r
5610, 0, 0, 0, 0, 0, 0,\r
5620, 0, 0, 0, 0, 0, 0,\r
5630, 0, 0, 0, 0, 0, 0,\r
5640, 0, 0, 0, 0, 0, 0,\r
5650, 0, 0, 0, 0, 0, 0,\r
566ODC(2), RF, WO, 0, 0, 0, 0, /* CVTFH */\r
5672, RF, WQ, 0, 0, 0, 0, /* CVTFG */\r
5680, 0, 0, 0, 0, 0, 0,\r
5690, 0, 0, 0, 0, 0, 0,\r
5700, 0, 0, 0, 0, 0, 0,\r
5710, 0, 0, 0, 0, 0, 0,\r
5720, 0, 0, 0, 0, 0, 0,\r
5730, 0, 0, 0, 0, 0, 0,\r
5740, 0, 0, 0, 0, 0, 0, /* 1A0-1AF */\r
5750, 0, 0, 0, 0, 0, 0,\r
5760, 0, 0, 0, 0, 0, 0,\r
5770, 0, 0, 0, 0, 0, 0,\r
5780, 0, 0, 0, 0, 0, 0,\r
5790, 0, 0, 0, 0, 0, 0,\r
5800, 0, 0, 0, 0, 0, 0,\r
5810, 0, 0, 0, 0, 0, 0,\r
5820, 0, 0, 0, 0, 0, 0,\r
5830, 0, 0, 0, 0, 0, 0,\r
5840, 0, 0, 0, 0, 0, 0,\r
5850, 0, 0, 0, 0, 0, 0,\r
5860, 0, 0, 0, 0, 0, 0,\r
5870, 0, 0, 0, 0, 0, 0,\r
5880, 0, 0, 0, 0, 0, 0,\r
5890, 0, 0, 0, 0, 0, 0,\r
5900, 0, 0, 0, 0, 0, 0, /* 1B0-1BF */\r
5910, 0, 0, 0, 0, 0, 0,\r
5920, 0, 0, 0, 0, 0, 0,\r
5930, 0, 0, 0, 0, 0, 0,\r
5940, 0, 0, 0, 0, 0, 0,\r
5950, 0, 0, 0, 0, 0, 0,\r
5960, 0, 0, 0, 0, 0, 0,\r
5970, 0, 0, 0, 0, 0, 0,\r
5980, 0, 0, 0, 0, 0, 0,\r
5990, 0, 0, 0, 0, 0, 0,\r
6000, 0, 0, 0, 0, 0, 0,\r
6010, 0, 0, 0, 0, 0, 0,\r
6020, 0, 0, 0, 0, 0, 0,\r
6030, 0, 0, 0, 0, 0, 0,\r
6040, 0, 0, 0, 0, 0, 0,\r
6050, 0, 0, 0, 0, 0, 0,\r
6060, 0, 0, 0, 0, 0, 0, /* 1C0-1CF */\r
6070, 0, 0, 0, 0, 0, 0,\r
6080, 0, 0, 0, 0, 0, 0,\r
6090, 0, 0, 0, 0, 0, 0,\r
6100, 0, 0, 0, 0, 0, 0,\r
6110, 0, 0, 0, 0, 0, 0,\r
6120, 0, 0, 0, 0, 0, 0,\r
6130, 0, 0, 0, 0, 0, 0,\r
6140, 0, 0, 0, 0, 0, 0,\r
6150, 0, 0, 0, 0, 0, 0,\r
6160, 0, 0, 0, 0, 0, 0,\r
6170, 0, 0, 0, 0, 0, 0,\r
6180, 0, 0, 0, 0, 0, 0,\r
6190, 0, 0, 0, 0, 0, 0,\r
6200, 0, 0, 0, 0, 0, 0,\r
6210, 0, 0, 0, 0, 0, 0,\r
6220, 0, 0, 0, 0, 0, 0, /* 1D0-1DF */\r
6230, 0, 0, 0, 0, 0, 0,\r
6240, 0, 0, 0, 0, 0, 0,\r
6250, 0, 0, 0, 0, 0, 0,\r
6260, 0, 0, 0, 0, 0, 0,\r
6270, 0, 0, 0, 0, 0, 0,\r
6280, 0, 0, 0, 0, 0, 0,\r
6290, 0, 0, 0, 0, 0, 0,\r
6300, 0, 0, 0, 0, 0, 0,\r
6310, 0, 0, 0, 0, 0, 0,\r
6320, 0, 0, 0, 0, 0, 0,\r
6330, 0, 0, 0, 0, 0, 0,\r
6340, 0, 0, 0, 0, 0, 0,\r
6350, 0, 0, 0, 0, 0, 0,\r
6360, 0, 0, 0, 0, 0, 0,\r
6370, 0, 0, 0, 0, 0, 0,\r
6380, 0, 0, 0, 0, 0, 0, /* 1E0-1EF */\r
6390, 0, 0, 0, 0, 0, 0,\r
6400, 0, 0, 0, 0, 0, 0,\r
6410, 0, 0, 0, 0, 0, 0,\r
6420, 0, 0, 0, 0, 0, 0,\r
6430, 0, 0, 0, 0, 0, 0,\r
6440, 0, 0, 0, 0, 0, 0,\r
6450, 0, 0, 0, 0, 0, 0,\r
6460, 0, 0, 0, 0, 0, 0,\r
6470, 0, 0, 0, 0, 0, 0,\r
6480, 0, 0, 0, 0, 0, 0,\r
6490, 0, 0, 0, 0, 0, 0,\r
6500, 0, 0, 0, 0, 0, 0,\r
6510, 0, 0, 0, 0, 0, 0,\r
6520, 0, 0, 0, 0, 0, 0,\r
6530, 0, 0, 0, 0, 0, 0,\r
6540, 0, 0, 0, 0, 0, 0, /* 1F0-1FF */\r
6550, 0, 0, 0, 0, 0, 0,\r
6560, 0, 0, 0, 0, 0, 0,\r
6570, 0, 0, 0, 0, 0, 0,\r
6580, 0, 0, 0, 0, 0, 0,\r
6590, 0, 0, 0, 0, 0, 0,\r
660ODC(2), RH, WL, 0, 0, 0, 0, /* CVTHF */\r
661ODC(2), RH, WQ, 0, 0, 0, 0, /* CVTHD */\r
6620, 0, 0, 0, 0, 0, 0,\r
6630, 0, 0, 0, 0, 0, 0,\r
6640, 0, 0, 0, 0, 0, 0,\r
6650, 0, 0, 0, 0, 0, 0,\r
6660, 0, 0, 0, 0, 0, 0,\r
6670, 0, 0, 0, 0, 0, 0,\r
6680, 0, 0, 0, 0, 0, 0,\r
6690, 0, 0, 0, 0, 0, 0\r
670};\r
671\r
672/* Opcode mnemonics table */\r
673\r
674const char *opcode[] = {\r
675"HALT", "NOP", "REI", "BPT", "RET", "RSB", "LDPCTX", "SVPCTX",\r
676"CVTPS", "CVTSP", "INDEX", "CRC", "PROBER", "PROBEW", "INSQUE", "REMQUE",\r
677"BSBB", "BRB", "BNEQ", "BEQL", "BGTR", "BLEQ", "JSB", "JMP",\r
678"BGEQ", "BLSS", "BGTRU", "BLEQU", "BVC", "BVS", "BGEQU", "BLSSU",\r
679"ADDP4", "ADDP6", "SUBP4", "SUBP6", "CVTPT", "MULP", "CVTTP", "DIVP",\r
680"MOVC3", "CMPC3", "SCANC", "SPANC", "MOVC5", "CMPC5", "MOVTC", "MOVTUC",\r
681"BSBW", "BRW", "CVTWL", "CVTWB", "MOVP", "CMPP3", "CVTPL", "CMPP4",\r
682"EDITPC", "MATCHC", "LOCC", "SKPC", "MOVZWL", "ACBW", "MOVAW", "PUSHAW",\r
683"ADDF2", "ADDF3", "SUBF2", "SUBF3", "MULF2", "MULF3", "DIVF2", "DIVF3",\r
684"CVTFB", "CVTFW", "CVTFL", "CVTRFL", "CVTBF", "CVTWF", "CVTLF", "ACBF",\r
685"MOVF", "CMPF", "MNEGF", "TSTF", "EMODF", "POLYF", "CVTFD", NULL,\r
686"ADAWI", NULL, NULL, NULL, "INSQHI", "INSQTI", "REMQHI", "REMQTI",\r
687"ADDD2", "ADDD3", "SUBD2", "SUBD3", "MULD2", "MULD3", "DIVD2", "DIVD3",\r
688"CVTDB", "CVTDW", "CVTDL", "CVTRDL", "CVTBD", "CVTWD", "CVTLD", "ACBD",\r
689"MOVD", "CMPD", "MNEGD", "TSTD", "EMODD", "POLYD", "CVTDF", NULL,\r
690"ASHL", "ASHQ", "EMUL", "EDIV", "CLRQ", "MOVQ", "MOVAQ", "PUSHAQ",\r
691"ADDB2", "ADDB3", "SUBB2", "SUBB3", "MULB2", "MULB3", "DIVB2", "DIVB3",\r
692"BISB2", "BISB3", "BICB2", "BICB3", "XORB2", "XORB3", "MNEGB", "CASEB",\r
693"MOVB", "CMPB", "MCOMB", "BITB", "CLRB", "TSTB", "INCB", "DECB",\r
694"CVTBL", "CVTBW", "MOVZBL", "MOVZBW", "ROTL", "ACBB", "MOVAB", "PUSHAB",\r
695"ADDW2", "ADDW3", "SUBW2", "SUBW3", "MULW2", "MULW3", "DIVW2", "DIVW3",\r
696"BISW2", "BISW3", "BICW2", "BICW3", "XORW2", "XORW3", "MNEGW", "CASEW",\r
697"MOVW", "CMPW", "MCOMW", "BITW", "CLRW", "TSTW", "INCW", "DECW",\r
698"BISPSW", "BICPSW", "POPR", "PUSHR", "CHMK", "CHME", "CHMS", "CHMU",\r
699"ADDL2", "ADDL3", "SUBL2", "SUBL3", "MULL2", "MULL3", "DIVL2", "DIVL3",\r
700"BISL2", "BISL3", "BICL2", "BICL3", "XORL2", "XORL3", "MNEGL", "CASEL",\r
701"MOVL", "CMPL", "MCOML", "BITL", "CLRL", "TSTL", "INCL", "DECL",\r
702"ADWC", "SBWC", "MTPR", "MFPR", "MOVPSL", "PUSHL", "MOVAL", "PUSHAL",\r
703"BBS", "BBC", "BBSS", "BBCS", "BBSC", "BBCC", "BBSSI", "BBCCI",\r
704"BLBS", "BLBC", "FFS", "FFC", "CMPV", "CMPZV", "EXTV", "EXTZV",\r
705"INSV", "ACBL", "AOBLSS", "AOBLEQ", "SOBGEQ", "SOBGTR", "CVTLB", "CVTLW",\r
706"ASHP", "CVTLP", "CALLG", "CALLS", "XFC", NULL, NULL, NULL,\r
707NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 100 - 11F */\r
708NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
709NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
710NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
711NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 120 - 13F */\r
712NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
713NULL, NULL, "CVTDH", "CVTGF", NULL, NULL, NULL, NULL,\r
714NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
715"ADDG2", "ADDG3", "SUBG2", "SUBG3", "MULG2", "MULG3", "DIVG2", "DIVG3",\r
716"CVTGB", "CVTGW", "CVTGL", "CVTRGL", "CVTBG", "CVTWG", "CVTLG", "ACBG",\r
717"MOVG", "CMPG", "MNEGG", "TSTG", "EMODG", "POLYG", "CVTGH", NULL,\r
718NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
719"ADDH2", "ADDH3", "SUBH2", "SUBH3", "MULH2", "MULH3", "DIVH2", "DIVH3",\r
720"CVTHB", "CVTHW", "CVTHL", "CVTRHL", "CVTBH", "CVTWH", "CVTLH", "ACBH",\r
721"MOVH", "CMPH", "MNEGH", "TSTH", "EMODH", "POLYH", "CVTHG", NULL,\r
722NULL, NULL, NULL, NULL, "CLRO", "MOVO", "MOVAO", "PUSHAO",\r
723NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 180 - 19F */\r
724NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
725NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
726"CVTFH", "CVTFG", NULL, NULL, NULL, NULL, NULL, NULL,\r
727NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 1A0 - 1BF */\r
728NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
729NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
730NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
731NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 1C0 - 1DF */\r
732NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
733NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
734NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
735NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 1E0 - 1FF */\r
736NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
737NULL, NULL, NULL, NULL, NULL, NULL, "CVTHF", "CVTHD",\r
738NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL\r
739};\r
740\r
741const char *altcod[] = {\r
742"CLRF", "CLRD", "CLRG", "CLRH", "MOVAF", "MOVAD", "MOVAG", "MOVAH",\r
743"PUSHAF", "PUSHAD", "PUSHAG", "PUSHAH", "BNEQU", "BEQLU", "BCC", "BCS",\r
744NULL\r
745};\r
746\r
747const int32 altop[] = {\r
748 0xD4, 0x7C, 0x7C, 0x17C, 0xDE, 0x7E, 0x7E, 0x17E,\r
749 0xDF, 0x7F, 0x7F, 0x17F, 0x12, 0x13, 0x1E, 0x1F\r
750 };\r
751\r
752const char* regname[] = {\r
753 "R0", "R1", "R2", "R3", "R4", "R5", "R6", "R7",\r
754 "R8", "R9", "R10", "R11", "AP", "FP", "SP", "PC"\r
755 };\r
756\r
757#define GETNUM(d,n) for (k = d = 0; k < n; k++) \\r
758 d = d | (((int32) val[vp++]) << (k * 8))\r
759\r
760/* Symbolic decode\r
761\r
762 Inputs:\r
763 *of = output stream\r
764 addr = current PC\r
765 *val = values to decode\r
766 *uptr = pointer to unit\r
767 sw = switches\r
768 Outputs:\r
769 return = if >= 0, error code\r
770 if < 0, number of extra bytes retired\r
771*/\r
772\r
773t_stat fprint_sym (FILE *of, t_addr exta, t_value *val,\r
774 UNIT *uptr, int32 sw)\r
775{\r
776uint32 addr = (uint32) exta;\r
777int32 c, k, num, vp, lnt, rdx;\r
778t_stat r;\r
779DEVICE *dptr;\r
780\r
781if (uptr == NULL) uptr = &cpu_unit; /* anon = CPU */\r
782if ((sw & SIM_SW_STOP) && (PSL & PSL_CM)) /* stop in CM? */\r
783 sw = sw | SWMASK ('P'); /* force CM print */\r
784dptr = find_dev_from_unit (uptr); /* find dev */\r
785if (dptr == NULL) return SCPE_IERR;\r
786if (dptr->dwidth != 8) return SCPE_ARG; /* byte dev only */\r
787if (sw & SWMASK ('B')) lnt = 1; /* get length */\r
788else if (sw & SWMASK ('W')) lnt = 2;\r
789else if (sw & SWMASK ('L')) lnt = 4;\r
790else lnt = (uptr == &cpu_unit)? 4: 1;\r
791if (sw & SWMASK ('D')) rdx = 10; /* get radix */\r
792else if (sw & SWMASK ('O')) rdx = 8;\r
793else if (sw & SWMASK ('H')) rdx = 16;\r
794else rdx = dptr->dradix;\r
795if ((sw & SWMASK ('A')) || (sw & SWMASK ('C'))) { /* char format? */\r
796 for (vp = lnt - 1; vp >= 0; vp--) {\r
797 c = (int32) val[vp] & 0x7F;\r
798 fprintf (of, (c < 0x20)? "<%02X>": "%c", c);\r
799 }\r
800 return -(lnt - 1); /* return # chars */\r
801 }\r
802\r
803if ((sw & (SWMASK ('P') | SWMASK ('R'))) && /* cmode or rad50? */\r
804 (uptr == &cpu_unit)) {\r
805 r = fprint_sym_cm (of, addr, val, sw); /* decode inst */\r
806 if (r <= 0) return r;\r
807 }\r
808\r
809if ((sw & SWMASK ('M')) && (uptr == &cpu_unit)) { /* inst format? */\r
810 r = fprint_sym_m (of, addr, val); /* decode inst */\r
811 if (r <= 0) return r;\r
812 }\r
813\r
814vp = 0; /* init ptr */\r
815GETNUM (num, lnt); /* get number */\r
816fprint_val (of, (uint32) num, rdx, lnt * 8, PV_RZRO);\r
817return -(vp - 1);\r
818}\r
819\r
820/* Symbolic decode for -m\r
821\r
822 Inputs:\r
823 of = output stream\r
824 addr = current PC\r
825 *val = values to decode\r
826 Outputs:\r
827 return = if >= 0, error code\r
828 if < 0, number of extra bytes retired\r
829*/\r
830\r
831t_stat fprint_sym_m (FILE *of, uint32 addr, t_value *val)\r
832{\r
833int32 i, k, vp, inst, numspec;\r
834int32 num, spec, rn, disp, index;\r
835\r
836vp = 0; /* init ptr */\r
837inst = (int32) val[vp++]; /* get opcode */\r
838if (inst == 0xFD) inst = 0x100 | (int32) val[vp++]; /* 2 byte op? */\r
839if (opcode[inst] == NULL) return SCPE_ARG; /* defined? */\r
840numspec = DR_GETNSP (drom[inst][0]); /* get # spec */\r
841if (numspec == 0) numspec = DR_GETUSP (drom[inst][0]);\r
842fprintf (of, "%s", opcode[inst]); /* print name */\r
843for (i = 0; i < numspec; i++) { /* loop thru spec */\r
844 fputc (i? ',': ' ', of); /* separator */\r
845 disp = drom[inst][i + 1]; /* get drom value */\r
846 if (disp == BB) { /* byte br disp? */\r
847 GETNUM (num, 1);\r
848 fprintf (of, "%-X", SXTB (num) + addr + vp);\r
849 }\r
850 else if (disp == BW) { /* word br disp? */\r
851 GETNUM (num, 2);\r
852 fprintf (of, "%-X", SXTW (num) + addr + vp);\r
853 }\r
854 else {\r
855 spec = (int32) val[vp++]; /* get specifier */\r
856 if ((spec & 0xF0) == IDX) { /* index? */\r
857 index = spec; /* copy, get next */\r
858 spec = (int32) val[vp++];\r
859 }\r
860 else index = 0;\r
861 rn = spec & 0xF; /* get reg # */\r
862 switch (spec & 0xF0) { /* case on mode */\r
863\r
864 case SH0: case SH1: case SH2: case SH3: /* s^# */\r
865 fprintf (of, "#%-X", spec);\r
866 break;\r
867\r
868 case GRN: /* Rn */\r
869 fprintf (of, "%-s", regname[rn]);\r
870 break;\r
871\r
872 case RGD: /* (Rn) */\r
873 fprintf (of, "(%-s)", regname[rn]);\r
874 break;\r
875\r
876 case ADC: /* -(Rn) */\r
877 fprintf (of, "-(%-s)", regname[rn]);\r
878 break;\r
879\r
880 case AIN: /* (Rn)+, #n */\r
881 if (rn != nPC) fprintf (of, "(%-s)+", regname[rn]);\r
882 else {\r
883 if (DR_LNT (disp) == L_OCTA)\r
884 vp = fprint_sym_qoimm (of, val, vp, 4);\r
885 else if (DR_LNT (disp) == L_QUAD)\r
886 vp = fprint_sym_qoimm (of, val, vp, 2);\r
887 else {\r
888 GETNUM (num, DR_LNT (disp));\r
889 fprintf (of, "#%-X", num);\r
890 }\r
891 }\r
892 break;\r
893\r
894 case AID: /* @(Rn)+, @#n */\r
895 if (rn != nPC) fprintf (of, "@(%-s)+", regname[rn]);\r
896 else {\r
897 GETNUM (num, 4);\r
898 fprintf (of, "@#%-X", num);\r
899 }\r
900 break;\r
901\r
902 case BDD: /* @b^d(r),@b^n */\r
903 fputc ('@', of);\r
904 case BDP: /* b^d(r), b^n */\r
905 GETNUM (num, 1);\r
906 if (rn == nPC) fprintf (of, "%-X", addr + vp + SXTB (num));\r
907 else if (num & BSIGN) fprintf (of, "-%-X(%-s)",\r
908 -num & BMASK, regname[rn]);\r
909 else fprintf (of, "%-X(%-s)", num, regname[rn]);\r
910 break;\r
911\r
912 case WDD: /* @w^d(r),@w^n */\r
913 fputc ('@', of);\r
914 case WDP: /* w^d(r), w^n */\r
915 GETNUM (num, 2);\r
916 if (rn == nPC) fprintf (of, "%-X", addr + vp + SXTW (num));\r
917 else if (num & WSIGN) fprintf (of, "-%-X(%-s)",\r
918 -num & WMASK, regname[rn]);\r
919 else fprintf (of, "%-X(%-s)", num, regname[rn]);\r
920 break;\r
921\r
922 case LDD: /* @l^d(r),@l^n */\r
923 fputc ('@', of);\r
924 case LDP: /* l^d(r),l^n */\r
925 GETNUM (num, 4);\r
926 if (rn == nPC) fprintf (of, "%-X", addr + vp + num);\r
927 else if (num & LSIGN) fprintf (of, "-%-X(%-s)",\r
928 -num, regname[rn]);\r
929 else fprintf (of, "%-X(%-s)", num, regname[rn]);\r
930 break;\r
931 } /* end case */\r
932 if (index) fprintf (of, "[%-s]", regname[index & 0xF]);\r
933 } /* end else */\r
934 } /* end for */\r
935return -(vp - 1);\r
936}\r
937\r
938/* Symbolic decode, quad/octa immediates\r
939\r
940 Inputs:\r
941 *of = output stream\r
942 *val = pointer to input values\r
943 vp = current index into val\r
944 lnt = number of longwords in immediate\r
945 Outputs:\r
946 vp = updated index into val\r
947*/\r
948\r
949int32 fprint_sym_qoimm (FILE *of, t_value *val, int32 vp, int32 lnt)\r
950{\r
951int32 i, k, startp, num[4];\r
952\r
953for (i = 0; i < lnt; i++) { GETNUM (num[lnt - 1 - i], 4); }\r
954for (i = startp = 0; i < lnt; i++) {\r
955 if (startp) fprintf (of, "%08X", num[i]);\r
956 else if (num[i] || (i == (lnt - 1))) {\r
957 fprintf (of, "#%-X", num[i]);\r
958 startp = 1;\r
959 }\r
960 }\r
961return vp;\r
962}\r
963\r
964#define PUTNUM(d,n) for (k = 0; k < n; k++) val[vp++] = (d >> (k * 8)) & 0xFF\r
965\r
966/* Symbolic input\r
967\r
968 Inputs:\r
969 *cptr = pointer to input string\r
970 addr = current PC\r
971 *uptr = pointer to unit\r
972 *val = pointer to output values\r
973 sw = switches\r
974 Outputs:\r
975 status = > 0 error code\r
976 <= 0 -number of extra words\r
977*/\r
978\r
979t_stat parse_sym (char *cptr, t_addr exta, UNIT *uptr, t_value *val, int32 sw)\r
980{\r
981uint32 addr = (uint32) exta;\r
982int32 k, rdx, lnt, num, vp;\r
983t_stat r;\r
984DEVICE *dptr;\r
985static const uint32 maxv[5] = { 0, 0xFF, 0xFFFF, 0, 0xFFFFFFFF };\r
986\r
987if (uptr == NULL) uptr = &cpu_unit; /* anon = CPU */\r
988dptr = find_dev_from_unit (uptr); /* find dev */\r
989if (dptr == NULL) return SCPE_IERR;\r
990if (dptr->dwidth != 8) return SCPE_ARG; /* byte dev only */\r
991if (sw & SWMASK ('B')) lnt = 1; /* get length */\r
992else if (sw & SWMASK ('W')) lnt = 2;\r
993else if (sw & SWMASK ('L')) lnt = 4;\r
994else lnt = (uptr == &cpu_unit)? 4: 1;\r
995if (sw & SWMASK ('D')) rdx = 10; /* get radix */\r
996else if (sw & SWMASK ('O')) rdx = 8;\r
997else if (sw & SWMASK ('H')) rdx = 16;\r
998else rdx = dptr->dradix;\r
999\r
1000if ((sw & SWMASK ('A')) || ((*cptr == '\'') && cptr++)) /* ASCII char? */\r
1001 return parse_char (cptr, val, lnt);\r
1002if ((sw & SWMASK ('C')) || ((*cptr == '"') && cptr++)) /* ASCII string? */\r
1003 return parse_char (cptr, val, sim_emax);\r
1004\r
1005if ((sw & (SWMASK ('P') | SWMASK ('R'))) && /* cmode or rad50? */\r
1006 (uptr == &cpu_unit)) {\r
1007 r = parse_sym_cm (cptr, addr, val, sw); /* try to parse */\r
1008 if (r <= 0) return r;\r
1009 }\r
1010\r
1011if (uptr == &cpu_unit) { /* cpu only */\r
1012 r = parse_sym_m (cptr, addr, val); /* try to parse inst */\r
1013 if (r <= 0) return r;\r
1014 }\r
1015\r
1016num = (int32) get_uint (cptr, rdx, maxv[lnt], &r); /* get number */\r
1017if (r != SCPE_OK) return r;\r
1018vp = 0;\r
1019PUTNUM (num, lnt); /* store */\r
1020return -(lnt - 1);\r
1021}\r
1022\r
1023/* Character input for -a or -c\r
1024\r
1025 Inputs:\r
1026 *cptr = pointer to input string\r
1027 addr = current PC\r
1028 *val = pointer to output values\r
1029 Outputs:\r
1030 status = > 0 error code\r
1031 <= 0 -number of extra words\r
1032*/\r
1033\r
1034t_stat parse_char (char *cptr, t_value *val, int32 lnt)\r
1035{\r
1036int32 vp;\r
1037\r
1038if (*cptr == 0) return SCPE_ARG;\r
1039vp = 0;\r
1040while ((vp < lnt) && *cptr) { /* get chars */\r
1041 val[vp++] = *cptr++;\r
1042 }\r
1043return -(vp - 1); /* return # chars */\r
1044}\r
1045\r
1046/* Symbolic input for -m\r
1047\r
1048 Inputs:\r
1049 *cptr = pointer to input string\r
1050 addr = current PC\r
1051 *val = pointer to output values\r
1052 Outputs:\r
1053 status = > 0 error code\r
1054 <= 0 -number of extra words\r
1055*/\r
1056\r
1057t_stat parse_sym_m (char *cptr, uint32 addr, t_value *val)\r
1058{\r
1059int32 i, numspec, disp, opc, vp;\r
1060t_stat r;\r
1061char gbuf[CBUFSIZE];\r
1062\r
1063cptr = get_glyph (cptr, gbuf, 0); /* get opcode */\r
1064for (i = 0, opc = -1; (i < NUM_INST) && (opc < 0); i++) {\r
1065 if (opcode[i] && strcmp (gbuf, opcode[i]) == 0) opc = i;\r
1066 }\r
1067if (opc < 0) { /* check alternates */\r
1068 for (i = 0; altcod[i] && (opc < 0); i++) {\r
1069 if (strcmp (gbuf, altcod[i]) == 0) opc = altop[i];\r
1070 }\r
1071 }\r
1072if (opc < 0) return SCPE_ARG; /* undefined? */\r
1073vp = 0;\r
1074if (opc >= 0x100) val[vp++] = 0xFD; /* 2 byte? */\r
1075val[vp++] = opc & 0xFF; /* store opcode */\r
1076numspec = DR_GETNSP (drom[opc][0]); /* get # specifiers */\r
1077if (numspec == 0) numspec = DR_GETUSP (drom[opc][0]);\r
1078for (i = 1; i <= numspec; i++) { /* loop thru specs */\r
1079 if (i == numspec) cptr = get_glyph (cptr, gbuf, 0);\r
1080 else cptr = get_glyph (cptr, gbuf, ','); /* get specifier */\r
1081 disp = drom[opc][i]; /* get drom value */\r
1082 if (disp == BB) vp = parse_brdisp (gbuf, addr, val, vp, 0, &r);\r
1083 else if (disp == BW) vp = parse_brdisp (gbuf, addr, val, vp, 1, &r);\r
1084 else vp = parse_spec (gbuf, addr, val, vp, disp, &r);\r
1085 if (r != SCPE_OK) return r;\r
1086 }\r
1087if (*cptr != 0) return SCPE_ARG;\r
1088return -(vp - 1);\r
1089}\r
1090\r
1091/* Parse a branch displacement\r
1092\r
1093 Inputs:\r
1094 cptr = pointer to input buffer\r
1095 addr = current address\r
1096 val = pointer to output array\r
1097 vp = current pointer in output array\r
1098 lnt = length (0 = byte, 1 = word)\r
1099 r = pointer to status\r
1100 Outputs:\r
1101 vp = updated output pointer\r
1102*/\r
1103\r
1104int32 parse_brdisp (char *cptr, uint32 addr, t_value *val, int32 vp,\r
1105 int32 lnt, t_stat *r)\r
1106{\r
1107int32 k, dest, num;\r
1108\r
1109dest = (int32) get_uint (cptr, 16, 0xFFFFFFFF, r); /* get value */\r
1110num = dest - (addr + vp + lnt + 1); /* compute offset */\r
1111if ((num > (lnt? 32767: 127)) || (num < (lnt? -32768: -128)))\r
1112 *r = SCPE_ARG;\r
1113else {\r
1114 PUTNUM (num, lnt + 1); /* store offset */\r
1115 *r = SCPE_OK;\r
1116 }\r
1117return vp;\r
1118}\r
1119\r
1120/* Parse a specifier\r
1121\r
1122 Inputs:\r
1123 cptr = pointer to input buffer\r
1124 addr = current address\r
1125 val = pointer to output array\r
1126 vp = current pointer in output array\r
1127 disp = specifier dispatch\r
1128 r = pointer to status\r
1129 Outputs:\r
1130 vp = updated output pointer\r
1131*/\r
1132\r
1133#define SP_IND 0x200 /* indirect */\r
1134#define SP_V_FORCE 6\r
1135#define SP_FS 0x040 /* S^ */\r
1136#define SP_FI 0x080 /* I^ */\r
1137#define SP_FB 0x0C0 /* B^ */\r
1138#define SP_FW 0x100 /* W^ */\r
1139#define SP_FL 0x140 /* L^ */\r
1140#define SP_LIT 0x020 /* # */\r
1141#define SP_PLUS 0x010 /* plus */\r
1142#define SP_MINUS 0x008 /* minus */\r
1143#define SP_NUM 0x004 /* number */\r
1144#define SP_IDX 0x002 /* (Rn) */\r
1145#define SP_POSTP 0x001 /* trailing + */\r
1146#define M1C(c,v) if (*cptr == c) { cptr++; fl = fl | v; }\r
1147#define SPUTNUM(v,d) if (fl & SP_MINUS) v = -v; PUTNUM (v, d)\r
1148#define PARSE_LOSE { *r = SCPE_ARG; return vp; }\r
1149#define SEL_LIM(p,m,u) ((fl & SP_PLUS)? (p): ((fl & SP_MINUS)? (m): (u)))\r
1150\r
1151int32 parse_spec (char *cptr, uint32 addr, t_value *val, int32 vp, int32 disp, t_stat *r)\r
1152{\r
1153int32 i, k, litsize, rn, index;\r
1154int32 num, dispsize, mode;\r
1155int32 lit[4] = { 0 };\r
1156int32 fl = 0;\r
1157char c, *tptr;\r
1158const char *force[] = { "S^", "I^", "B^", "W^", "L^", NULL };\r
1159\r
1160*r = SCPE_OK; /* assume ok */\r
1161M1C ('@', SP_IND); /* look for @ */\r
1162if (tptr = parse_rnum (cptr, &rn)) { /* look for Rn */\r
1163 if (*cptr == '[') { /* look for [Rx] */\r
1164 cptr = parse_rnum (++cptr, &index);\r
1165 if ((cptr == NULL) || (*cptr++ != ']')) PARSE_LOSE;\r
1166 val[vp++] = index | IDX;\r
1167 }\r
1168 else val[vp++] = rn | GRN | (fl? 1: 0); /* Rn or @Rn */\r
1169 if (*tptr != 0) *r = SCPE_ARG; /* must be done */\r
1170 return vp;\r
1171 }\r
1172for (i = 0; force[i]; i++) { /* look for x^ */\r
1173 if (strncmp (cptr, force[i], 2) == 0) {\r
1174 cptr = cptr + 2;\r
1175 fl = fl | ((i + 1) << SP_V_FORCE);\r
1176 break;\r
1177 }\r
1178 }\r
1179M1C ('#', SP_LIT); /* look for # */\r
1180M1C ('+', SP_PLUS); /* look for + */\r
1181M1C ('-', SP_MINUS); /* look for - */\r
1182for (litsize = 0;; cptr++) { /* look for mprec int */\r
1183 c = *cptr;\r
1184 if ((c < '0') || (c > 'F') || ((c > '9') && (c < 'A'))) break;\r
1185 num = (c <= '9')? c - '0': c - 'A' + 10;\r
1186 fl = fl | SP_NUM;\r
1187 for (i = 3; i >= 0; i--) {\r
1188 lit[i] = lit[i] << 4;\r
1189 if (i > 0) lit[i] = lit[i] | ((lit[i - 1] >> 28) & 0xF);\r
1190 else lit[i] = lit[i] | num;\r
1191 if (lit[i] && (i > litsize)) litsize = i;\r
1192 }\r
1193 }\r
1194if (*cptr == '(') { /* look for (Rn) */\r
1195 cptr = parse_rnum (++cptr, &rn);\r
1196 if ((cptr == NULL) || (*cptr++ != ')')) PARSE_LOSE;\r
1197 fl = fl | SP_IDX;\r
1198 }\r
1199M1C ('+', SP_POSTP); /* look for + */\r
1200if (*cptr == '[') { /* look for [Rx] */ \r
1201 cptr = parse_rnum (++cptr, &index);\r
1202 if ((cptr == NULL) || (*cptr++ != ']')) PARSE_LOSE;\r
1203 val[vp++] = index | IDX;\r
1204 }\r
1205switch (fl) { /* case on state */\r
1206\r
1207 case SP_FS|SP_LIT|SP_NUM: /* S^#n */\r
1208 case SP_FS|SP_LIT|SP_PLUS|SP_NUM: /* S^#+n */\r
1209 if ((litsize > 0) || (lit[0] & ~0x3F)) PARSE_LOSE;\r
1210 val[vp++] = lit[0];\r
1211 break;\r
1212\r
1213 case SP_IDX: /* (Rn) */\r
1214 val[vp++] = rn | RGD;\r
1215 break;\r
1216\r
1217 case SP_MINUS|SP_IDX: /* -(Rn) */\r
1218 val[vp++] = rn | ADC;\r
1219 break;\r
1220\r
1221 case SP_IDX|SP_POSTP: /* (Rn)+ */\r
1222 val[vp++] = rn | AIN;\r
1223 break;\r
1224\r
1225 case SP_LIT|SP_NUM: /* #n */\r
1226 case SP_LIT|SP_PLUS|SP_NUM: /* #+n */\r
1227 if ((litsize == 0) && ((lit[0] & ~0x3F) == 0)) {\r
1228 val[vp++] = lit[0];\r
1229 break;\r
1230 } /* fall thru */\r
1231 case SP_LIT|SP_MINUS|SP_NUM: /* #-n */\r
1232 case SP_FI|SP_LIT|SP_NUM: /* I^#n */\r
1233 case SP_FI|SP_LIT|SP_PLUS|SP_NUM: /* I^#+n */\r
1234 case SP_FI|SP_LIT|SP_MINUS|SP_NUM: /* I^#-n */\r
1235 val[vp++] = nPC | AIN;\r
1236 disp = disp & DR_LNMASK;\r
1237 switch (disp) { /* case spec lnt */\r
1238 case 00: /* check fit */\r
1239 if ((litsize > 0) || (lit[0] < 0) || \r
1240 (lit[0] > SEL_LIM (0x7F, 0x80, 0xFF))) PARSE_LOSE;\r
1241 SPUTNUM (lit[0], 1); /* store */\r
1242 break;\r
1243 case 01: /* check fit */\r
1244 if ((litsize > 0) || (lit[0] < 0) ||\r
1245 (lit[0] > SEL_LIM (0x7FFF, 0x8000, 0xFFFF))) PARSE_LOSE;\r
1246 SPUTNUM (lit[0], 2);\r
1247 break;\r
1248 case 02: /* check 1 lw */\r
1249 if (litsize > 0) PARSE_LOSE;\r
1250 SPUTNUM (lit[0], 4);\r
1251 break;\r
1252 case 03: /* check 2 lw */\r
1253 if (litsize > 1) PARSE_LOSE;\r
1254 vp = parse_sym_qoimm (lit, val, vp, 2, fl & SP_MINUS);\r
1255 break;\r
1256 case 04:\r
1257 vp = parse_sym_qoimm (lit, val, vp, 4, fl & SP_MINUS);\r
1258 break;\r
1259 } /* end case lnt */\r
1260 break;\r
1261\r
1262 case SP_IND|SP_IDX|SP_POSTP: /* @(Rn)+ */\r
1263 val[vp++] = rn | AID;\r
1264 break;\r
1265\r
1266 case SP_IND|SP_LIT|SP_NUM: /* @#n */\r
1267 if (litsize > 0) PARSE_LOSE;\r
1268 val[vp++] = nPC | AID;\r
1269 PUTNUM (lit[0], 4);\r
1270 break;\r
1271 case SP_NUM|SP_IDX: /* d(rn) */\r
1272 case SP_PLUS|SP_NUM|SP_IDX: /* +d(rn) */\r
1273 case SP_MINUS|SP_NUM|SP_IDX: /* -d(rn) */\r
1274 case SP_IND|SP_NUM|SP_IDX: /* @d(rn) */\r
1275 case SP_IND|SP_PLUS|SP_NUM|SP_IDX: /* @+d(rn) */\r
1276 case SP_IND|SP_MINUS|SP_NUM|SP_IDX: /* @-d(rn) */\r
1277 if (litsize > 0) PARSE_LOSE;\r
1278 dispsize = 4; /* find fit for */\r
1279 mode = LDP; /* displacement */\r
1280 if (lit[0] >= 0) {\r
1281 if (lit[0] <= SEL_LIM (0x7F, 0x80, 0xFF)) {\r
1282 dispsize = 1;\r
1283 mode = BDP;\r
1284 }\r
1285 else if (lit[0] <= SEL_LIM (0x7FFF, 0x8000, 0xFFFF)) {\r
1286 dispsize = 2;\r
1287 mode = WDP;\r
1288 }\r
1289 }\r
1290 val[vp++] = mode | rn | ((fl & SP_IND)? 0x10: 0);\r
1291 SPUTNUM (lit[0], dispsize);\r
1292 break;\r
1293\r
1294 case SP_FB|SP_NUM|SP_IDX: /* B^d(rn) */\r
1295 case SP_FB|SP_PLUS|SP_NUM|SP_IDX: /* B^+d(rn) */\r
1296 case SP_FB|SP_MINUS|SP_NUM|SP_IDX: /* B^-d(rn) */\r
1297 case SP_IND|SP_FB|SP_NUM|SP_IDX: /* @B^d(rn) */\r
1298 case SP_IND|SP_FB|SP_PLUS|SP_NUM|SP_IDX: /* @B^+d(rn) */\r
1299 case SP_IND|SP_FB|SP_MINUS|SP_NUM|SP_IDX: /* @B^-d(rn) */\r
1300 if ((litsize > 0) || (lit[0] < 0) || \r
1301 (lit[0] > SEL_LIM (0x7F, 0x80, 0xFF))) PARSE_LOSE;\r
1302 val[vp++] = rn | BDP | ((fl & SP_IND)? 0x10: 0);\r
1303 SPUTNUM (lit[0], 1);\r
1304 break;\r
1305\r
1306 case SP_FW|SP_NUM|SP_IDX: /* W^d(rn) */\r
1307 case SP_FW|SP_PLUS|SP_NUM|SP_IDX: /* W^+d(rn) */\r
1308 case SP_FW|SP_MINUS|SP_NUM|SP_IDX: /* W^-d(rn) */\r
1309 case SP_IND|SP_FW|SP_NUM|SP_IDX: /* @W^d(rn) */\r
1310 case SP_IND|SP_FW|SP_PLUS|SP_NUM|SP_IDX: /* @W^+d(rn) */\r
1311 case SP_IND|SP_FW|SP_MINUS|SP_NUM|SP_IDX: /* @W^-d(rn) */\r
1312 if ((litsize > 0) || (lit[0] < 0) ||\r
1313 (lit[0] > SEL_LIM (0x7FFF, 0x8000, 0xFFFF))) PARSE_LOSE;\r
1314 val[vp++] = rn | WDP | ((fl & SP_IND)? 0x10: 0);\r
1315 SPUTNUM (lit[0], 2);\r
1316 break;\r
1317\r
1318 case SP_FL|SP_NUM|SP_IDX: /* L^d(rn) */\r
1319 case SP_FL|SP_PLUS|SP_NUM|SP_IDX: /* L^+d(rn) */\r
1320 case SP_FL|SP_MINUS|SP_NUM|SP_IDX: /* L^-d(rn) */\r
1321 case SP_IND|SP_FL|SP_NUM|SP_IDX: /* @L^d(rn) */\r
1322 case SP_IND|SP_FL|SP_PLUS|SP_NUM|SP_IDX: /* @L^+d(rn) */\r
1323 case SP_IND|SP_FL|SP_MINUS|SP_NUM|SP_IDX: /* @L^-d(rn) */\r
1324 if ((litsize > 0) || (lit[0] < 0)) PARSE_LOSE;\r
1325 val[vp++] = rn | LDP | ((fl & SP_IND)? 0x10: 0);\r
1326 SPUTNUM (lit[0], 4);\r
1327 break;\r
1328\r
1329 case SP_NUM: /* n */\r
1330 case SP_IND|SP_NUM: /* @n */\r
1331 if (litsize > 0) PARSE_LOSE;\r
1332 num = lit[0] - (addr + vp + 2); /* fit in byte? */\r
1333 if ((num >= -128) && (num <= 127)) {\r
1334 mode = BDP;\r
1335 dispsize = 1;\r
1336 }\r
1337 else {\r
1338 num = lit[0] - (addr + vp + 3); /* fit in word? */\r
1339 if ((num >= -32768) && (num <= 32767)) {\r
1340 mode = WDP;\r
1341 dispsize = 2;\r
1342 }\r
1343 else {\r
1344 num = lit[0] - (addr + vp + 5); /* no, use lw */\r
1345 mode = LDP;\r
1346 dispsize = 4;\r
1347 }\r
1348 }\r
1349 val[vp++] = mode | nPC | ((fl & SP_IND)? 1: 0);\r
1350 PUTNUM (num, dispsize);\r
1351 break;\r
1352\r
1353 case SP_FB|SP_NUM: /* B^n */\r
1354 case SP_IND|SP_FB|SP_NUM: /* @B^n */\r
1355 num = lit[0] - (addr + vp + 2);\r
1356 if ((litsize > 0) || (num > 127) || (num < -128)) PARSE_LOSE;\r
1357 val[vp++] = nPC | BDP | ((fl & SP_IND)? 1: 0);\r
1358 PUTNUM (num, 1);\r
1359 break;\r
1360\r
1361 case SP_FW|SP_NUM: /* W^n */\r
1362 case SP_IND|SP_FW|SP_NUM: /* @W^n */\r
1363 num = lit[0] - (addr + vp + 3);\r
1364 if ((litsize > 0) || (num > 32767) || (num < -32768)) PARSE_LOSE;\r
1365 val[vp++] = nPC | WDP | ((fl & SP_IND)? 1: 0);\r
1366 PUTNUM (num, 2);\r
1367 break;\r
1368\r
1369 case SP_FL|SP_NUM: /* L^n */\r
1370 case SP_IND|SP_FL|SP_NUM: /* @L^n */\r
1371 num = lit[0] - (addr + vp + 5);\r
1372 if (litsize > 0) PARSE_LOSE;\r
1373 val[vp++] = nPC | LDP | ((fl & SP_IND)? 1: 0);\r
1374 PUTNUM (num, 4);\r
1375 break;\r
1376\r
1377 default:\r
1378 PARSE_LOSE;\r
1379 } /* end case */\r
1380\r
1381if (*cptr != 0) *r = SCPE_ARG; /* must be done */\r
1382return vp;\r
1383}\r
1384\r
1385char *parse_rnum (char *cptr, int32 *rn)\r
1386{\r
1387int32 i, lnt;\r
1388t_value regnum;\r
1389char *tptr;\r
1390\r
1391for (i = 15; i >= 0; i--) { /* chk named reg */\r
1392 lnt = strlen (regname[i]);\r
1393 if (strncmp (cptr, regname[i], lnt) == 0) {\r
1394 *rn = i;\r
1395 return cptr + lnt;\r
1396 }\r
1397 }\r
1398if (*cptr++ != 'R') return NULL; /* look for R */\r
1399regnum = strtotv (cptr, &tptr, 10); /* look for reg # */\r
1400if ((cptr == tptr) || (regnum > 15)) return NULL;\r
1401*rn = (int32) regnum;\r
1402return tptr;\r
1403}\r
1404\r
1405int32 parse_sym_qoimm (int32 *lit, t_value *val, int32 vp, int lnt, int32 minus)\r
1406{\r
1407int32 i, k, prev;\r
1408\r
1409for (i = prev = 0; i < lnt; i++) {\r
1410 if (minus) prev = lit[i] = ~lit[i] + (prev == 0);\r
1411 PUTNUM (lit[i], 4);\r
1412 }\r
1413return vp;\r
1414}\r
1415\r