Commit | Line | Data |
---|---|---|
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 | |
54 | extern UNIT cpu_unit;\r | |
55 | extern REG cpu_reg[];\r | |
56 | extern int32 saved_PC;\r | |
57 | extern int32 PSL;\r | |
58 | extern int32 sim_switches;\r | |
59 | \r | |
60 | t_stat fprint_sym_m (FILE *of, uint32 addr, t_value *val);\r | |
61 | int32 fprint_sym_qoimm (FILE *of, t_value *val, int32 vp, int32 lnt);\r | |
62 | t_stat parse_char (char *cptr, t_value *val, int32 lnt);\r | |
63 | t_stat parse_sym_m (char *cptr, uint32 addr, t_value *val);\r | |
64 | int32 parse_brdisp (char *cptr, uint32 addr, t_value *val,\r | |
65 | int32 vp, int32 lnt, t_stat *r);\r | |
66 | int32 parse_spec (char *cptr, uint32 addr, t_value *val,\r | |
67 | int32 vp, int32 disp, t_stat *r);\r | |
68 | char *parse_rnum (char *cptr, int32 *rn);\r | |
69 | int32 parse_sym_qoimm (int32 *lit, t_value *val, int32 vp,\r | |
70 | int lnt, int32 minus);\r | |
71 | \r | |
72 | extern t_stat fprint_sym_cm (FILE *of, t_addr addr, t_value *bytes, int32 sw);\r | |
73 | t_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 | |
85 | REG *sim_PC = &cpu_reg[0];\r | |
86 | \r | |
87 | int32 sim_emax = 60;\r | |
88 | \r | |
89 | const 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 | |
126 | t_stat pdp11_bad_block (UNIT *uptr, int32 sec, int32 wds)\r | |
127 | {\r | |
128 | int32 i;\r | |
129 | t_addr da;\r | |
130 | uint16 *buf;\r | |
131 | \r | |
132 | if ((sec < 2) || (wds < 16)) return SCPE_ARG;\r | |
133 | if ((uptr->flags & UNIT_ATT) == 0) return SCPE_UNATT;\r | |
134 | if (!get_yn ("Overwrite last track? [N]", FALSE)) return SCPE_OK;\r | |
135 | da = (uptr->capac - (sec * wds)) * sizeof (uint16);\r | |
136 | if (sim_fseek (uptr->fileref, da, SEEK_SET)) return SCPE_IOERR;\r | |
137 | if ((buf = (uint16 *) malloc (wds * sizeof (uint16))) == NULL) return SCPE_MEM;\r | |
138 | buf[0] = 0x1234;\r | |
139 | buf[1] = 0x5678;\r | |
140 | buf[2] = buf[3] = 0;\r | |
141 | for (i = 4; i < wds; i++) buf[i] = 0xFFFF;\r | |
142 | for (i = 0; (i < sec) && (i < 10); i++)\r | |
143 | sim_fwrite (buf, sizeof (uint16), wds, uptr->fileref);\r | |
144 | free (buf);\r | |
145 | if (ferror (uptr->fileref)) return SCPE_IOERR;\r | |
146 | return 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 | |
157 | const uint16 drom[NUM_INST][MAX_SPEC + 1] = {\r | |
158 | 0, 0, 0, 0, 0, 0, 0, /* HALT */\r | |
159 | 0, 0, 0, 0, 0, 0, 0, /* NOP */\r | |
160 | 0, 0, 0, 0, 0, 0, 0, /* REI */\r | |
161 | 0, 0, 0, 0, 0, 0, 0, /* BPT */\r | |
162 | 0, 0, 0, 0, 0, 0, 0, /* RET */\r | |
163 | 0, 0, 0, 0, 0, 0, 0, /* RSB */\r | |
164 | 0, 0, 0, 0, 0, 0, 0, /* LDPCTX */\r | |
165 | 0, 0, 0, 0, 0, 0, 0, /* SVPCTX */\r | |
166 | 4+DR_F, RW, AB, RW, AB, 0, 0, /* CVTPS */\r | |
167 | 4+DR_F, RW, AB, RW, AB, 0, 0, /* CVTSP */\r | |
168 | 6, RL, RL, RL, RL, RL, WL, /* INDEX */\r | |
169 | 4+DR_F, AB, RL, RW, AB, 0, 0, /* CRC */\r | |
170 | 3, RB, RW, AB, 0, 0, 0, /* PROBER */\r | |
171 | 3, RB, RW, AB, 0, 0, 0, /* PROBEW */\r | |
172 | 2, AB, AB, 0, 0, 0, 0, /* INSQUE */\r | |
173 | 2, AB, WL, 0, 0, 0, 0, /* REMQUE */\r | |
174 | 1, BB, 0, 0, 0, 0, 0, /* BSBB */\r | |
175 | 1, BB, 0, 0, 0, 0, 0, /* BRB */\r | |
176 | 1, BB, 0, 0, 0, 0, 0, /* BNEQ */\r | |
177 | 1, BB, 0, 0, 0, 0, 0, /* BEQL */\r | |
178 | 1, BB, 0, 0, 0, 0, 0, /* BGTR */\r | |
179 | 1, BB, 0, 0, 0, 0, 0, /* BLEQ */\r | |
180 | 1, AB, 0, 0, 0, 0, 0, /* JSB */\r | |
181 | 1, AB, 0, 0, 0, 0, 0, /* JMP */\r | |
182 | 1, BB, 0, 0, 0, 0, 0, /* BGEQ */\r | |
183 | 1, BB, 0, 0, 0, 0, 0, /* BLSS */\r | |
184 | 1, BB, 0, 0, 0, 0, 0, /* BGTRU */\r | |
185 | 1, BB, 0, 0, 0, 0, 0, /* BLEQU */\r | |
186 | 1, BB, 0, 0, 0, 0, 0, /* BVC */\r | |
187 | 1, BB, 0, 0, 0, 0, 0, /* BVS */\r | |
188 | 1, BB, 0, 0, 0, 0, 0, /* BCC */\r | |
189 | 1, BB, 0, 0, 0, 0, 0, /* BCS */\r | |
190 | 4+DR_F, RW, AB, RW, AB, 0, 0, /* ADDP4 */\r | |
191 | 6+DR_F, RW, AB, RW, AB, RW, AB, /* ADDP6 */\r | |
192 | 4+DR_F, RW, AB, RW, AB, 0, 0, /* SUBP4 */\r | |
193 | 6+DR_F, RW, AB, RW, AB, RW, AB, /* SUBP6 */\r | |
194 | 5+DR_F, RW, AB, AB, RW, AB, 0, /* CVTPT */\r | |
195 | 6+DR_F, RW, AB, RW, AB, RW, AB, /* MULP6 */\r | |
196 | 5+DR_F, RW, AB, AB, RW, AB, 0, /* CVTTP */\r | |
197 | 6+DR_F, RW, AB, RW, AB, RW, AB, /* DIVP6 */\r | |
198 | 3+DR_F, RW, AB, AB, 0, 0, 0, /* MOVC3 */\r | |
199 | 3+DR_F, RW, AB, AB, 0, 0, 0, /* CMPC3 */\r | |
200 | 4+DR_F, RW, AB, AB, RB, 0, 0, /* SCANC */\r | |
201 | 4+DR_F, RW, AB, AB, RB, 0, 0, /* SPANC */\r | |
202 | 5+DR_F, RW, AB, RB, RW, AB, 0, /* MOVC5 */\r | |
203 | 5+DR_F, RW, AB, RB, RW, AB, 0, /* CMPC5 */\r | |
204 | 6+DR_F, RW, AB, RB, AB, RW, AB, /* MOVTC */\r | |
205 | 6+DR_F, RW, AB, RB, AB, RW, AB, /* MOVTUC */\r | |
206 | 1, BW, 0, 0, 0, 0, 0, /* BSBW */\r | |
207 | 1, BW, 0, 0, 0, 0, 0, /* BRW */\r | |
208 | 2, RW, WL, 0, 0, 0, 0, /* CVTWL */\r | |
209 | 2, RW, WB, 0, 0, 0, 0, /* CVTWB */\r | |
210 | 3+DR_F, RW, AB, AB, 0, 0, 0, /* MOVP */\r | |
211 | 3+DR_F, RW, AB, AB, 0, 0, 0, /* CMPP3 */\r | |
212 | 3+DR_F, RW, AB, WL, 0, 0, 0, /* CVTPL */\r | |
213 | 4+DR_F, RW, AB, RW, AB, 0, 0, /* CMPP4 */\r | |
214 | 4+DR_F, RW, AB, AB, AB, 0, 0, /* EDITPC */\r | |
215 | 4+DR_F, RW, AB, RW, AB, 0, 0, /* MATCHC */\r | |
216 | 3+DR_F, RB, RW, AB, 0, 0, 0, /* LOCC */\r | |
217 | 3+DR_F, RB, RW, AB, 0, 0, 0, /* SKPC */\r | |
218 | 2, RW, WL, 0, 0, 0, 0, /* MOVZWL */\r | |
219 | 4, RW, RW, MW, BW, 0, 0, /* ACBW */\r | |
220 | 2, AW, WL, 0, 0, 0, 0, /* MOVAW */\r | |
221 | 1, AW, 0, 0, 0, 0, 0, /* PUSHAW */\r | |
222 | 2, RF, ML, 0, 0, 0, 0, /* ADDF2 */\r | |
223 | 3, RF, RF, WL, 0, 0, 0, /* ADDF3 */\r | |
224 | 2, RF, ML, 0, 0, 0, 0, /* SUBF2 */\r | |
225 | 3, RF, RF, WL, 0, 0, 0, /* SUBF3 */\r | |
226 | 2, RF, ML, 0, 0, 0, 0, /* MULF2 */\r | |
227 | 3, RF, RF, WL, 0, 0, 0, /* MULF3 */\r | |
228 | 2, RF, ML, 0, 0, 0, 0, /* DIVF2 */\r | |
229 | 3, RF, RF, WL, 0, 0, 0, /* DIVF3 */\r | |
230 | 2, RF, WB, 0, 0, 0, 0, /* CVTFB */\r | |
231 | 2, RF, WW, 0, 0, 0, 0, /* CVTFW */\r | |
232 | 2, RF, WL, 0, 0, 0, 0, /* CVTFL */\r | |
233 | 2, RF, WL, 0, 0, 0, 0, /* CVTRFL */\r | |
234 | 2, RB, WL, 0, 0, 0, 0, /* CVTBF */\r | |
235 | 2, RW, WL, 0, 0, 0, 0, /* CVTWF */\r | |
236 | 2, RL, WL, 0, 0, 0, 0, /* CVTLF */\r | |
237 | 4, RF, RF, ML, BW, 0, 0, /* ACBF */\r | |
238 | 2, RF, WL, 0, 0, 0, 0, /* MOVF */\r | |
239 | 2, RF, RF, 0, 0, 0, 0, /* CMPF */\r | |
240 | 2, RF, WL, 0, 0, 0, 0, /* MNEGF */\r | |
241 | 1, RF, 0, 0, 0, 0, 0, /* TSTF */\r | |
242 | 5, RF, RB, RF, WL, WL, 0, /* EMODF */\r | |
243 | 3, RF, RW, AB, 0, 0, 0, /* POLYF */\r | |
244 | 2, RF, WQ, 0, 0, 0, 0, /* CVTFD */\r | |
245 | 0, 0, 0, 0, 0, 0, 0, /* reserved */\r | |
246 | 2, RW, WW, 0, 0, 0, 0, /* ADAWI */\r | |
247 | 0, 0, 0, 0, 0, 0, 0, /* reserved */\r | |
248 | 0, 0, 0, 0, 0, 0, 0, /* reserved */\r | |
249 | 0, 0, 0, 0, 0, 0, 0, /* reserved */\r | |
250 | 2, AB, AQ, 0, 0, 0, 0, /* INSQHI */\r | |
251 | 2, AB, AQ, 0, 0, 0, 0, /* INSQTI */\r | |
252 | 2, AQ, WL, 0, 0, 0, 0, /* REMQHI */\r | |
253 | 2, AQ, WL, 0, 0, 0, 0, /* REMQTI */\r | |
254 | 2, RD, MQ, 0, 0, 0, 0, /* ADDD2 */\r | |
255 | 3, RD, RD, WQ, 0, 0, 0, /* ADDD3 */\r | |
256 | 2, RD, MQ, 0, 0, 0, 0, /* SUBD2 */\r | |
257 | 3, RD, RD, WQ, 0, 0, 0, /* SUBD3 */\r | |
258 | 2, RD, MQ, 0, 0, 0, 0, /* MULD2 */\r | |
259 | 3, RD, RD, WQ, 0, 0, 0, /* MULD3 */\r | |
260 | 2, RD, MQ, 0, 0, 0, 0, /* DIVD2 */\r | |
261 | 3, RD, RD, WQ, 0, 0, 0, /* DIVD3 */\r | |
262 | 2, RD, WB, 0, 0, 0, 0, /* CVTDB */\r | |
263 | 2, RD, WW, 0, 0, 0, 0, /* CVTDW */\r | |
264 | 2, RD, WL, 0, 0, 0, 0, /* CVTDL */\r | |
265 | 2, RD, WL, 0, 0, 0, 0, /* CVTRDL */\r | |
266 | 2, RB, WQ, 0, 0, 0, 0, /* CVTBD */\r | |
267 | 2, RW, WQ, 0, 0, 0, 0, /* CVTWD */\r | |
268 | 2, RL, WQ, 0, 0, 0, 0, /* CVTLD */\r | |
269 | 4, RD, RD, MQ, BW, 0, 0, /* ACBD */\r | |
270 | 2, RD, WQ, 0, 0, 0, 0, /* MOVD */\r | |
271 | 2, RD, RD, 0, 0, 0, 0, /* CMPD */\r | |
272 | 2, RD, WQ, 0, 0, 0, 0, /* MNEGD */\r | |
273 | 1, RD, 0, 0, 0, 0, 0, /* TSTD */\r | |
274 | 5, RD, RB, RD, WL, WQ, 0, /* EMODD */\r | |
275 | 3, RD, RW, AB, 0, 0, 0, /* POLYD */\r | |
276 | 2, RD, WL, 0, 0, 0, 0, /* CVTDF */\r | |
277 | 0, 0, 0, 0, 0, 0, 0, /* reserved */\r | |
278 | 3, RB, RL, WL, 0, 0, 0, /* ASHL */\r | |
279 | 3, RB, RQ, WQ, 0, 0, 0, /* ASHQ */\r | |
280 | 4, RL, RL, RL, WQ, 0, 0, /* EMUL */\r | |
281 | 4, RL, RQ, WL, WL, 0, 0, /* EDIV */\r | |
282 | 1, WQ, 0, 0, 0, 0, 0, /* CLRQ */\r | |
283 | 2, RQ, WQ, 0, 0, 0, 0, /* MOVQ */\r | |
284 | 2, AQ, WL, 0, 0, 0, 0, /* MOVAQ */\r | |
285 | 1, AQ, 0, 0, 0, 0, 0, /* PUSHAQ */\r | |
286 | 2, RB, MB, 0, 0, 0, 0, /* ADDB2 */\r | |
287 | 3, RB, RB, WB, 0, 0, 0, /* ADDB3 */\r | |
288 | 2, RB, MB, 0, 0, 0, 0, /* SUBB2 */\r | |
289 | 3, RB, RB, WB, 0, 0, 0, /* SUBB3 */\r | |
290 | 2, RB, MB, 0, 0, 0, 0, /* MULB2 */\r | |
291 | 3, RB, RB, WB, 0, 0, 0, /* MULB3 */\r | |
292 | 2, RB, MB, 0, 0, 0, 0, /* DIVB2 */\r | |
293 | 3, RB, RB, WB, 0, 0, 0, /* DIVB3 */\r | |
294 | 2, RB, MB, 0, 0, 0, 0, /* BISB2 */\r | |
295 | 3, RB, RB, WB, 0, 0, 0, /* BISB3 */\r | |
296 | 2, RB, MB, 0, 0, 0, 0, /* BICB2 */\r | |
297 | 3, RB, RB, WB, 0, 0, 0, /* BICB3 */\r | |
298 | 2, RB, MB, 0, 0, 0, 0, /* XORB2 */\r | |
299 | 3, RB, RB, WB, 0, 0, 0, /* XORB3 */\r | |
300 | 2, RB, WB, 0, 0, 0, 0, /* MNEGB */\r | |
301 | 3, RB, RB, RB, 0, 0, 0, /* CASEB */\r | |
302 | 2, RB, WB, 0, 0, 0, 0, /* MOVB */\r | |
303 | 2, RB, RB, 0, 0, 0, 0, /* CMPB */\r | |
304 | 2, RB, WB, 0, 0, 0, 0, /* MCOMB */\r | |
305 | 2, RB, RB, 0, 0, 0, 0, /* BITB */\r | |
306 | 1, WB, 0, 0, 0, 0, 0, /* CLRB */\r | |
307 | 1, RB, 0, 0, 0, 0, 0, /* TSTB */\r | |
308 | 1, MB, 0, 0, 0, 0, 0, /* INCB */\r | |
309 | 1, MB, 0, 0, 0, 0, 0, /* DECB */\r | |
310 | 2, RB, WL, 0, 0, 0, 0, /* CVTBL */\r | |
311 | 2, RB, WW, 0, 0, 0, 0, /* CVTBW */\r | |
312 | 2, RB, WL, 0, 0, 0, 0, /* MOVZBL */\r | |
313 | 2, RB, WW, 0, 0, 0, 0, /* MOVZBW */\r | |
314 | 3, RB, RL, WL, 0, 0, 0, /* ROTL */\r | |
315 | 4, RB, RB, MB, BW, 0, 0, /* ACBB */\r | |
316 | 2, AB, WL, 0, 0, 0, 0, /* MOVAB */\r | |
317 | 1, AB, 0, 0, 0, 0, 0, /* PUSHAB */\r | |
318 | 2, RW, MW, 0, 0, 0, 0, /* ADDW2 */\r | |
319 | 3, RW, RW, WW, 0, 0, 0, /* ADDW3 */\r | |
320 | 2, RW, MW, 0, 0, 0, 0, /* SUBW2 */\r | |
321 | 3, RW, RW, WW, 0, 0, 0, /* SUBW3 */\r | |
322 | 2, RW, MW, 0, 0, 0, 0, /* MULW2 */\r | |
323 | 3, RW, RW, WW, 0, 0, 0, /* MULW3 */\r | |
324 | 2, RW, MW, 0, 0, 0, 0, /* DIVW2 */\r | |
325 | 3, RW, RW, WW, 0, 0, 0, /* DIVW3 */\r | |
326 | 2, RW, MW, 0, 0, 0, 0, /* BISW2 */\r | |
327 | 3, RW, RW, WW, 0, 0, 0, /* BISW3 */\r | |
328 | 2, RW, MW, 0, 0, 0, 0, /* BICW2 */\r | |
329 | 3, RW, RW, WW, 0, 0, 0, /* BICW3 */\r | |
330 | 2, RW, MW, 0, 0, 0, 0, /* XORW2 */\r | |
331 | 3, RW, RW, WW, 0, 0, 0, /* XORW3 */\r | |
332 | 2, RW, WW, 0, 0, 0, 0, /* MNEGW */\r | |
333 | 3, RW, RW, RW, 0, 0, 0, /* CASEW */\r | |
334 | 2, RW, WW, 0, 0, 0, 0, /* MOVW */\r | |
335 | 2, RW, RW, 0, 0, 0, 0, /* CMPW */\r | |
336 | 2, RW, WW, 0, 0, 0, 0, /* MCOMW */\r | |
337 | 2, RW, RW, 0, 0, 0, 0, /* BITW */\r | |
338 | 1, WW, 0, 0, 0, 0, 0, /* CLRW */\r | |
339 | 1, RW, 0, 0, 0, 0, 0, /* TSTW */\r | |
340 | 1, MW, 0, 0, 0, 0, 0, /* INCW */\r | |
341 | 1, MW, 0, 0, 0, 0, 0, /* DECW */\r | |
342 | 1, RW, 0, 0, 0, 0, 0, /* BISPSW */\r | |
343 | 1, RW, 0, 0, 0, 0, 0, /* BICPSW */\r | |
344 | 1, RW, 0, 0, 0, 0, 0, /* POPR */\r | |
345 | 1, RW, 0, 0, 0, 0, 0, /* PUSHR */\r | |
346 | 1, RW, 0, 0, 0, 0, 0, /* CHMK */\r | |
347 | 1, RW, 0, 0, 0, 0, 0, /* CHME */\r | |
348 | 1, RW, 0, 0, 0, 0, 0, /* CHMS */\r | |
349 | 1, RW, 0, 0, 0, 0, 0, /* CHMU */\r | |
350 | 2, RL, ML, 0, 0, 0, 0, /* ADDL2 */\r | |
351 | 3, RL, RL, WL, 0, 0, 0, /* ADDL3 */\r | |
352 | 2, RL, ML, 0, 0, 0, 0, /* SUBL2 */\r | |
353 | 3, RL, RL, WL, 0, 0, 0, /* SUBL3 */\r | |
354 | 2, RL, ML, 0, 0, 0, 0, /* MULL2 */\r | |
355 | 3, RL, RL, WL, 0, 0, 0, /* MULL3 */\r | |
356 | 2, RL, ML, 0, 0, 0, 0, /* DIVL2 */\r | |
357 | 3, RL, RL, WL, 0, 0, 0, /* DIVL3 */\r | |
358 | 2, RL, ML, 0, 0, 0, 0, /* BISL2 */\r | |
359 | 3, RL, RL, WL, 0, 0, 0, /* BISL3 */\r | |
360 | 2, RL, ML, 0, 0, 0, 0, /* BICL2 */\r | |
361 | 3, RL, RL, WL, 0, 0, 0, /* BICL3 */\r | |
362 | 2, RL, ML, 0, 0, 0, 0, /* XORL2 */\r | |
363 | 3, RL, RL, WL, 0, 0, 0, /* XORL3 */\r | |
364 | 2, RL, WL, 0, 0, 0, 0, /* MNEGL */\r | |
365 | 3, RL, RL, RL, 0, 0, 0, /* CASEL */\r | |
366 | 2, RL, WL, 0, 0, 0, 0, /* MOVL */\r | |
367 | 2, RL, RL, 0, 0, 0, 0, /* CMPL */\r | |
368 | 2, RL, WL, 0, 0, 0, 0, /* MCOML */\r | |
369 | 2, RL, RL, 0, 0, 0, 0, /* BITL */\r | |
370 | 1, WL, 0, 0, 0, 0, 0, /* CLRL */\r | |
371 | 1, RL, 0, 0, 0, 0, 0, /* TSTL */\r | |
372 | 1, ML, 0, 0, 0, 0, 0, /* INCL */\r | |
373 | 1, ML, 0, 0, 0, 0, 0, /* DECL */\r | |
374 | 2, RL, ML, 0, 0, 0, 0, /* ADWC */\r | |
375 | 2, RL, ML, 0, 0, 0, 0, /* SBWC */\r | |
376 | 2, RL, RL, 0, 0, 0, 0, /* MTPR */\r | |
377 | 2, RL, WL, 0, 0, 0, 0, /* MFPR */\r | |
378 | 1, WL, 0, 0, 0, 0, 0, /* MOVPSL */\r | |
379 | 1, RL, 0, 0, 0, 0, 0, /* PUSHL */\r | |
380 | 2, AL, WL, 0, 0, 0, 0, /* MOVAL */\r | |
381 | 1, AL, 0, 0, 0, 0, 0, /* PUSHAL */\r | |
382 | 3, RL, VB, BB, 0, 0, 0, /* BBS */\r | |
383 | 3, RL, VB, BB, 0, 0, 0, /* BBC */\r | |
384 | 3, RL, VB, BB, 0, 0, 0, /* BBSS */\r | |
385 | 3, RL, VB, BB, 0, 0, 0, /* BBCS */\r | |
386 | 3, RL, VB, BB, 0, 0, 0, /* BBSC */\r | |
387 | 3, RL, VB, BB, 0, 0, 0, /* BBCC */\r | |
388 | 3, RL, VB, BB, 0, 0, 0, /* BBSSI */\r | |
389 | 3, RL, VB, BB, 0, 0, 0, /* BBCCI */\r | |
390 | 2, RL, BB, 0, 0, 0, 0, /* BLBS */\r | |
391 | 2, RL, BB, 0, 0, 0, 0, /* BLBC */\r | |
392 | 4, RL, RB, VB, WL, 0, 0, /* FFS */\r | |
393 | 4, RL, RB, VB, WL, 0, 0, /* FFC */\r | |
394 | 4, RL, RB, VB, RL, 0, 0, /* CMPV */\r | |
395 | 4, RL, RB, VB, RL, 0, 0, /* CMPZV */\r | |
396 | 4, RL, RB, VB, WL, 0, 0, /* EXTV */\r | |
397 | 4, RL, RB, VB, WL, 0, 0, /* EXTZV */\r | |
398 | 4, RL, RL, RB, VB, 0, 0, /* INSV */\r | |
399 | 4, RL, RL, ML, BW, 0, 0, /* ACBL */\r | |
400 | 3, RL, ML, BB, 0, 0, 0, /* AOBLSS */\r | |
401 | 3, RL, ML, BB, 0, 0, 0, /* AOBLEQ */\r | |
402 | 2, ML, BB, 0, 0, 0, 0, /* SOBGEQ */\r | |
403 | 2, ML, BB, 0, 0, 0, 0, /* SOBGTR */\r | |
404 | 2, RL, WB, 0, 0, 0, 0, /* CVTLB */\r | |
405 | 2, RL, WW, 0, 0, 0, 0, /* CVTLW */\r | |
406 | 6+DR_F, RB, RW, AB, RB, RW, AB, /* ASHP */\r | |
407 | 3+DR_F, RL, RW, AB, 0, 0, 0, /* CVTLP */\r | |
408 | 2, AB, AB, 0, 0, 0, 0, /* CALLG */\r | |
409 | 2, RL, AB, 0, 0, 0, 0, /* CALLS */\r | |
410 | 0, 0, 0, 0, 0, 0, 0, /* XFC */\r | |
411 | 0, 0, 0, 0, 0, 0, 0, /* 0FD */\r | |
412 | 0, 0, 0, 0, 0, 0, 0, /* 0FE */\r | |
413 | 0, 0, 0, 0, 0, 0, 0, /* 0FF */\r | |
414 | 0, 0, 0, 0, 0, 0, 0, /* 100-10F */\r | |
415 | 0, 0, 0, 0, 0, 0, 0,\r | |
416 | 0, 0, 0, 0, 0, 0, 0,\r | |
417 | 0, 0, 0, 0, 0, 0, 0,\r | |
418 | 0, 0, 0, 0, 0, 0, 0,\r | |
419 | 0, 0, 0, 0, 0, 0, 0,\r | |
420 | 0, 0, 0, 0, 0, 0, 0,\r | |
421 | 0, 0, 0, 0, 0, 0, 0,\r | |
422 | 0, 0, 0, 0, 0, 0, 0,\r | |
423 | 0, 0, 0, 0, 0, 0, 0,\r | |
424 | 0, 0, 0, 0, 0, 0, 0,\r | |
425 | 0, 0, 0, 0, 0, 0, 0,\r | |
426 | 0, 0, 0, 0, 0, 0, 0,\r | |
427 | 0, 0, 0, 0, 0, 0, 0,\r | |
428 | 0, 0, 0, 0, 0, 0, 0,\r | |
429 | 0, 0, 0, 0, 0, 0, 0,\r | |
430 | 0, 0, 0, 0, 0, 0, 0, /* 110-11F */\r | |
431 | 0, 0, 0, 0, 0, 0, 0,\r | |
432 | 0, 0, 0, 0, 0, 0, 0,\r | |
433 | 0, 0, 0, 0, 0, 0, 0,\r | |
434 | 0, 0, 0, 0, 0, 0, 0,\r | |
435 | 0, 0, 0, 0, 0, 0, 0,\r | |
436 | 0, 0, 0, 0, 0, 0, 0,\r | |
437 | 0, 0, 0, 0, 0, 0, 0,\r | |
438 | 0, 0, 0, 0, 0, 0, 0,\r | |
439 | 0, 0, 0, 0, 0, 0, 0,\r | |
440 | 0, 0, 0, 0, 0, 0, 0,\r | |
441 | 0, 0, 0, 0, 0, 0, 0,\r | |
442 | 0, 0, 0, 0, 0, 0, 0,\r | |
443 | 0, 0, 0, 0, 0, 0, 0,\r | |
444 | 0, 0, 0, 0, 0, 0, 0,\r | |
445 | 0, 0, 0, 0, 0, 0, 0,\r | |
446 | 0, 0, 0, 0, 0, 0, 0, /* 120-12F */\r | |
447 | 0, 0, 0, 0, 0, 0, 0,\r | |
448 | 0, 0, 0, 0, 0, 0, 0,\r | |
449 | 0, 0, 0, 0, 0, 0, 0,\r | |
450 | 0, 0, 0, 0, 0, 0, 0,\r | |
451 | 0, 0, 0, 0, 0, 0, 0,\r | |
452 | 0, 0, 0, 0, 0, 0, 0,\r | |
453 | 0, 0, 0, 0, 0, 0, 0,\r | |
454 | 0, 0, 0, 0, 0, 0, 0,\r | |
455 | 0, 0, 0, 0, 0, 0, 0,\r | |
456 | 0, 0, 0, 0, 0, 0, 0,\r | |
457 | 0, 0, 0, 0, 0, 0, 0,\r | |
458 | 0, 0, 0, 0, 0, 0, 0,\r | |
459 | 0, 0, 0, 0, 0, 0, 0,\r | |
460 | 0, 0, 0, 0, 0, 0, 0,\r | |
461 | 0, 0, 0, 0, 0, 0, 0,\r | |
462 | 0, 0, 0, 0, 0, 0, 0, /* 130-13F */\r | |
463 | 0, 0, 0, 0, 0, 0, 0,\r | |
464 | ODC(2), RD, WO, 0, 0, 0, 0, /* CVTDH */\r | |
465 | 2, RG, WL, 0, 0, 0, 0, /* CVTGF */\r | |
466 | 0, 0, 0, 0, 0, 0, 0,\r | |
467 | 0, 0, 0, 0, 0, 0, 0,\r | |
468 | 0, 0, 0, 0, 0, 0, 0,\r | |
469 | 0, 0, 0, 0, 0, 0, 0,\r | |
470 | 0, 0, 0, 0, 0, 0, 0,\r | |
471 | 0, 0, 0, 0, 0, 0, 0,\r | |
472 | 0, 0, 0, 0, 0, 0, 0,\r | |
473 | 0, 0, 0, 0, 0, 0, 0,\r | |
474 | 0, 0, 0, 0, 0, 0, 0,\r | |
475 | 0, 0, 0, 0, 0, 0, 0,\r | |
476 | 0, 0, 0, 0, 0, 0, 0,\r | |
477 | 0, 0, 0, 0, 0, 0, 0,\r | |
478 | 2, RG, MQ, 0, 0, 0, 0, /* ADDG2 */\r | |
479 | 3, RG, RG, WQ, 0, 0, 0, /* ADDG3 */\r | |
480 | 2, RG, MQ, 0, 0, 0, 0, /* SUBG2 */\r | |
481 | 3, RG, RG, WQ, 0, 0, 0, /* SUBG3 */\r | |
482 | 2, RG, MQ, 0, 0, 0, 0, /* MULG2 */\r | |
483 | 3, RG, RG, WQ, 0, 0, 0, /* MULG3 */\r | |
484 | 2, RG, MQ, 0, 0, 0, 0, /* DIVG2 */\r | |
485 | 3, RG, RG, WQ, 0, 0, 0, /* DIVG3 */\r | |
486 | 2, RG, WB, 0, 0, 0, 0, /* CVTGB */\r | |
487 | 2, RG, WW, 0, 0, 0, 0, /* CVTGW */\r | |
488 | 2, RG, WL, 0, 0, 0, 0, /* CVTGL */\r | |
489 | 2, RG, WL, 0, 0, 0, 0, /* CVTRGL */\r | |
490 | 2, RB, WQ, 0, 0, 0, 0, /* CVTBG */\r | |
491 | 2, RW, WQ, 0, 0, 0, 0, /* CVTWG */\r | |
492 | 2, RL, WQ, 0, 0, 0, 0, /* CVTLG */\r | |
493 | 4, RG, RG, MQ, BW, 0, 0, /* ACBG */\r | |
494 | 2, RG, WQ, 0, 0, 0, 0, /* MOVG */\r | |
495 | 2, RG, RG, 0, 0, 0, 0, /* CMPG */\r | |
496 | 2, RG, WQ, 0, 0, 0, 0, /* MNEGG */\r | |
497 | 1, RG, 0, 0, 0, 0, 0, /* TSTG */\r | |
498 | 5, RG, RW, RG, WL, WQ, 0, /* EMODG */\r | |
499 | 3, RG, RW, AB, 0, 0, 0, /* POLYG */\r | |
500 | ODC(2), RG, WO, 0, 0, 0, 0, /* CVTGH */\r | |
501 | 0, 0, 0, 0, 0, 0, 0, /* reserved */\r | |
502 | 0, 0, 0, 0, 0, 0, 0, /* reserved */\r | |
503 | 0, 0, 0, 0, 0, 0, 0, /* reserved */\r | |
504 | 0, 0, 0, 0, 0, 0, 0, /* reserved */\r | |
505 | 0, 0, 0, 0, 0, 0, 0, /* reserved */\r | |
506 | 0, 0, 0, 0, 0, 0, 0, /* reserved */\r | |
507 | 0, 0, 0, 0, 0, 0, 0, /* reserved */\r | |
508 | 0, 0, 0, 0, 0, 0, 0, /* reserved */\r | |
509 | 0, 0, 0, 0, 0, 0, 0, /* reserved */\r | |
510 | ODC(2), RH, MO, 0, 0, 0, 0, /* ADDH2 */\r | |
511 | ODC(3), RH, RH, WO, 0, 0, 0, /* ADDH3 */\r | |
512 | ODC(2), RH, MO, 0, 0, 0, 0, /* SUBH2 */\r | |
513 | ODC(3), RH, RH, WO, 0, 0, 0, /* SUBH3 */\r | |
514 | ODC(2), RH, MO, 0, 0, 0, 0, /* MULH2 */\r | |
515 | ODC(3), RH, RH, WO, 0, 0, 0, /* MULH3 */\r | |
516 | ODC(2), RH, MO, 0, 0, 0, 0, /* DIVH2 */\r | |
517 | ODC(3), RH, RH, WO, 0, 0, 0, /* DIVH3 */\r | |
518 | ODC(2), RH, WB, 0, 0, 0, 0, /* CVTHB */\r | |
519 | ODC(2), RH, WW, 0, 0, 0, 0, /* CVTHW */\r | |
520 | ODC(2), RH, WL, 0, 0, 0, 0, /* CVTHL */\r | |
521 | ODC(2), RH, WL, 0, 0, 0, 0, /* CVTRHL */\r | |
522 | ODC(2), RB, WO, 0, 0, 0, 0, /* CVTBH */\r | |
523 | ODC(2), RW, WO, 0, 0, 0, 0, /* CVTWH */\r | |
524 | ODC(2), RL, WO, 0, 0, 0, 0, /* CVTLH */\r | |
525 | ODC(4), RH, RH, MO, BW, 0, 0, /* ACBH */\r | |
526 | ODC(2), RH, RO, 0, 0, 0, 0, /* MOVH */\r | |
527 | ODC(2), RH, RH, 0, 0, 0, 0, /* CMPH */\r | |
528 | ODC(2), RH, WO, 0, 0, 0, 0, /* MNEGH */\r | |
529 | ODC(1), RH, 0, 0, 0, 0, 0, /* TSTH */\r | |
530 | ODC(5), RH, RW, RH, WL, WO, 0, /* EMODH */\r | |
531 | ODC(3), RH, RW, AB, 0, 0, 0, /* POLYH */\r | |
532 | ODC(2), RH, WQ, 0, 0, 0, 0, /* CVTHG */\r | |
533 | 0, 0, 0, 0, 0, 0, 0, /* reserved */\r | |
534 | 0, 0, 0, 0, 0, 0, 0, /* reserved */\r | |
535 | 0, 0, 0, 0, 0, 0, 0, /* reserved */\r | |
536 | 0, 0, 0, 0, 0, 0, 0, /* reserved */\r | |
537 | 0, 0, 0, 0, 0, 0, 0, /* reserved */\r | |
538 | ODC(1), WO, 0, 0, 0, 0, 0, /* CLRO */\r | |
539 | ODC(2), RO, RO, 0, 0, 0, 0, /* MOVO */\r | |
540 | ODC(2), AO, WL, 0, 0, 0, 0, /* MOVAO*/\r | |
541 | ODC(1), AO, 0, 0, 0, 0, 0, /* PUSHAO*/\r | |
542 | 0, 0, 0, 0, 0, 0, 0, /* 180-18F */\r | |
543 | 0, 0, 0, 0, 0, 0, 0,\r | |
544 | 0, 0, 0, 0, 0, 0, 0,\r | |
545 | 0, 0, 0, 0, 0, 0, 0,\r | |
546 | 0, 0, 0, 0, 0, 0, 0,\r | |
547 | 0, 0, 0, 0, 0, 0, 0,\r | |
548 | 0, 0, 0, 0, 0, 0, 0,\r | |
549 | 0, 0, 0, 0, 0, 0, 0,\r | |
550 | 0, 0, 0, 0, 0, 0, 0,\r | |
551 | 0, 0, 0, 0, 0, 0, 0,\r | |
552 | 0, 0, 0, 0, 0, 0, 0,\r | |
553 | 0, 0, 0, 0, 0, 0, 0,\r | |
554 | 0, 0, 0, 0, 0, 0, 0,\r | |
555 | 0, 0, 0, 0, 0, 0, 0,\r | |
556 | 0, 0, 0, 0, 0, 0, 0,\r | |
557 | 0, 0, 0, 0, 0, 0, 0,\r | |
558 | 0, 0, 0, 0, 0, 0, 0, /* 190-19F */\r | |
559 | 0, 0, 0, 0, 0, 0, 0,\r | |
560 | 0, 0, 0, 0, 0, 0, 0,\r | |
561 | 0, 0, 0, 0, 0, 0, 0,\r | |
562 | 0, 0, 0, 0, 0, 0, 0,\r | |
563 | 0, 0, 0, 0, 0, 0, 0,\r | |
564 | 0, 0, 0, 0, 0, 0, 0,\r | |
565 | 0, 0, 0, 0, 0, 0, 0,\r | |
566 | ODC(2), RF, WO, 0, 0, 0, 0, /* CVTFH */\r | |
567 | 2, RF, WQ, 0, 0, 0, 0, /* CVTFG */\r | |
568 | 0, 0, 0, 0, 0, 0, 0,\r | |
569 | 0, 0, 0, 0, 0, 0, 0,\r | |
570 | 0, 0, 0, 0, 0, 0, 0,\r | |
571 | 0, 0, 0, 0, 0, 0, 0,\r | |
572 | 0, 0, 0, 0, 0, 0, 0,\r | |
573 | 0, 0, 0, 0, 0, 0, 0,\r | |
574 | 0, 0, 0, 0, 0, 0, 0, /* 1A0-1AF */\r | |
575 | 0, 0, 0, 0, 0, 0, 0,\r | |
576 | 0, 0, 0, 0, 0, 0, 0,\r | |
577 | 0, 0, 0, 0, 0, 0, 0,\r | |
578 | 0, 0, 0, 0, 0, 0, 0,\r | |
579 | 0, 0, 0, 0, 0, 0, 0,\r | |
580 | 0, 0, 0, 0, 0, 0, 0,\r | |
581 | 0, 0, 0, 0, 0, 0, 0,\r | |
582 | 0, 0, 0, 0, 0, 0, 0,\r | |
583 | 0, 0, 0, 0, 0, 0, 0,\r | |
584 | 0, 0, 0, 0, 0, 0, 0,\r | |
585 | 0, 0, 0, 0, 0, 0, 0,\r | |
586 | 0, 0, 0, 0, 0, 0, 0,\r | |
587 | 0, 0, 0, 0, 0, 0, 0,\r | |
588 | 0, 0, 0, 0, 0, 0, 0,\r | |
589 | 0, 0, 0, 0, 0, 0, 0,\r | |
590 | 0, 0, 0, 0, 0, 0, 0, /* 1B0-1BF */\r | |
591 | 0, 0, 0, 0, 0, 0, 0,\r | |
592 | 0, 0, 0, 0, 0, 0, 0,\r | |
593 | 0, 0, 0, 0, 0, 0, 0,\r | |
594 | 0, 0, 0, 0, 0, 0, 0,\r | |
595 | 0, 0, 0, 0, 0, 0, 0,\r | |
596 | 0, 0, 0, 0, 0, 0, 0,\r | |
597 | 0, 0, 0, 0, 0, 0, 0,\r | |
598 | 0, 0, 0, 0, 0, 0, 0,\r | |
599 | 0, 0, 0, 0, 0, 0, 0,\r | |
600 | 0, 0, 0, 0, 0, 0, 0,\r | |
601 | 0, 0, 0, 0, 0, 0, 0,\r | |
602 | 0, 0, 0, 0, 0, 0, 0,\r | |
603 | 0, 0, 0, 0, 0, 0, 0,\r | |
604 | 0, 0, 0, 0, 0, 0, 0,\r | |
605 | 0, 0, 0, 0, 0, 0, 0,\r | |
606 | 0, 0, 0, 0, 0, 0, 0, /* 1C0-1CF */\r | |
607 | 0, 0, 0, 0, 0, 0, 0,\r | |
608 | 0, 0, 0, 0, 0, 0, 0,\r | |
609 | 0, 0, 0, 0, 0, 0, 0,\r | |
610 | 0, 0, 0, 0, 0, 0, 0,\r | |
611 | 0, 0, 0, 0, 0, 0, 0,\r | |
612 | 0, 0, 0, 0, 0, 0, 0,\r | |
613 | 0, 0, 0, 0, 0, 0, 0,\r | |
614 | 0, 0, 0, 0, 0, 0, 0,\r | |
615 | 0, 0, 0, 0, 0, 0, 0,\r | |
616 | 0, 0, 0, 0, 0, 0, 0,\r | |
617 | 0, 0, 0, 0, 0, 0, 0,\r | |
618 | 0, 0, 0, 0, 0, 0, 0,\r | |
619 | 0, 0, 0, 0, 0, 0, 0,\r | |
620 | 0, 0, 0, 0, 0, 0, 0,\r | |
621 | 0, 0, 0, 0, 0, 0, 0,\r | |
622 | 0, 0, 0, 0, 0, 0, 0, /* 1D0-1DF */\r | |
623 | 0, 0, 0, 0, 0, 0, 0,\r | |
624 | 0, 0, 0, 0, 0, 0, 0,\r | |
625 | 0, 0, 0, 0, 0, 0, 0,\r | |
626 | 0, 0, 0, 0, 0, 0, 0,\r | |
627 | 0, 0, 0, 0, 0, 0, 0,\r | |
628 | 0, 0, 0, 0, 0, 0, 0,\r | |
629 | 0, 0, 0, 0, 0, 0, 0,\r | |
630 | 0, 0, 0, 0, 0, 0, 0,\r | |
631 | 0, 0, 0, 0, 0, 0, 0,\r | |
632 | 0, 0, 0, 0, 0, 0, 0,\r | |
633 | 0, 0, 0, 0, 0, 0, 0,\r | |
634 | 0, 0, 0, 0, 0, 0, 0,\r | |
635 | 0, 0, 0, 0, 0, 0, 0,\r | |
636 | 0, 0, 0, 0, 0, 0, 0,\r | |
637 | 0, 0, 0, 0, 0, 0, 0,\r | |
638 | 0, 0, 0, 0, 0, 0, 0, /* 1E0-1EF */\r | |
639 | 0, 0, 0, 0, 0, 0, 0,\r | |
640 | 0, 0, 0, 0, 0, 0, 0,\r | |
641 | 0, 0, 0, 0, 0, 0, 0,\r | |
642 | 0, 0, 0, 0, 0, 0, 0,\r | |
643 | 0, 0, 0, 0, 0, 0, 0,\r | |
644 | 0, 0, 0, 0, 0, 0, 0,\r | |
645 | 0, 0, 0, 0, 0, 0, 0,\r | |
646 | 0, 0, 0, 0, 0, 0, 0,\r | |
647 | 0, 0, 0, 0, 0, 0, 0,\r | |
648 | 0, 0, 0, 0, 0, 0, 0,\r | |
649 | 0, 0, 0, 0, 0, 0, 0,\r | |
650 | 0, 0, 0, 0, 0, 0, 0,\r | |
651 | 0, 0, 0, 0, 0, 0, 0,\r | |
652 | 0, 0, 0, 0, 0, 0, 0,\r | |
653 | 0, 0, 0, 0, 0, 0, 0,\r | |
654 | 0, 0, 0, 0, 0, 0, 0, /* 1F0-1FF */\r | |
655 | 0, 0, 0, 0, 0, 0, 0,\r | |
656 | 0, 0, 0, 0, 0, 0, 0,\r | |
657 | 0, 0, 0, 0, 0, 0, 0,\r | |
658 | 0, 0, 0, 0, 0, 0, 0,\r | |
659 | 0, 0, 0, 0, 0, 0, 0,\r | |
660 | ODC(2), RH, WL, 0, 0, 0, 0, /* CVTHF */\r | |
661 | ODC(2), RH, WQ, 0, 0, 0, 0, /* CVTHD */\r | |
662 | 0, 0, 0, 0, 0, 0, 0,\r | |
663 | 0, 0, 0, 0, 0, 0, 0,\r | |
664 | 0, 0, 0, 0, 0, 0, 0,\r | |
665 | 0, 0, 0, 0, 0, 0, 0,\r | |
666 | 0, 0, 0, 0, 0, 0, 0,\r | |
667 | 0, 0, 0, 0, 0, 0, 0,\r | |
668 | 0, 0, 0, 0, 0, 0, 0,\r | |
669 | 0, 0, 0, 0, 0, 0, 0\r | |
670 | };\r | |
671 | \r | |
672 | /* Opcode mnemonics table */\r | |
673 | \r | |
674 | const 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 | |
707 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 100 - 11F */\r | |
708 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r | |
709 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r | |
710 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r | |
711 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 120 - 13F */\r | |
712 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r | |
713 | NULL, NULL, "CVTDH", "CVTGF", NULL, NULL, NULL, NULL,\r | |
714 | NULL, 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 | |
718 | NULL, 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 | |
722 | NULL, NULL, NULL, NULL, "CLRO", "MOVO", "MOVAO", "PUSHAO",\r | |
723 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 180 - 19F */\r | |
724 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r | |
725 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r | |
726 | "CVTFH", "CVTFG", NULL, NULL, NULL, NULL, NULL, NULL,\r | |
727 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 1A0 - 1BF */\r | |
728 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r | |
729 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r | |
730 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r | |
731 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 1C0 - 1DF */\r | |
732 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r | |
733 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r | |
734 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r | |
735 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 1E0 - 1FF */\r | |
736 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r | |
737 | NULL, NULL, NULL, NULL, NULL, NULL, "CVTHF", "CVTHD",\r | |
738 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL\r | |
739 | };\r | |
740 | \r | |
741 | const char *altcod[] = {\r | |
742 | "CLRF", "CLRD", "CLRG", "CLRH", "MOVAF", "MOVAD", "MOVAG", "MOVAH",\r | |
743 | "PUSHAF", "PUSHAD", "PUSHAG", "PUSHAH", "BNEQU", "BEQLU", "BCC", "BCS",\r | |
744 | NULL\r | |
745 | };\r | |
746 | \r | |
747 | const 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 | |
752 | const 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 | |
773 | t_stat fprint_sym (FILE *of, t_addr exta, t_value *val,\r | |
774 | UNIT *uptr, int32 sw)\r | |
775 | {\r | |
776 | uint32 addr = (uint32) exta;\r | |
777 | int32 c, k, num, vp, lnt, rdx;\r | |
778 | t_stat r;\r | |
779 | DEVICE *dptr;\r | |
780 | \r | |
781 | if (uptr == NULL) uptr = &cpu_unit; /* anon = CPU */\r | |
782 | if ((sw & SIM_SW_STOP) && (PSL & PSL_CM)) /* stop in CM? */\r | |
783 | sw = sw | SWMASK ('P'); /* force CM print */\r | |
784 | dptr = find_dev_from_unit (uptr); /* find dev */\r | |
785 | if (dptr == NULL) return SCPE_IERR;\r | |
786 | if (dptr->dwidth != 8) return SCPE_ARG; /* byte dev only */\r | |
787 | if (sw & SWMASK ('B')) lnt = 1; /* get length */\r | |
788 | else if (sw & SWMASK ('W')) lnt = 2;\r | |
789 | else if (sw & SWMASK ('L')) lnt = 4;\r | |
790 | else lnt = (uptr == &cpu_unit)? 4: 1;\r | |
791 | if (sw & SWMASK ('D')) rdx = 10; /* get radix */\r | |
792 | else if (sw & SWMASK ('O')) rdx = 8;\r | |
793 | else if (sw & SWMASK ('H')) rdx = 16;\r | |
794 | else rdx = dptr->dradix;\r | |
795 | if ((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 | |
803 | if ((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 | |
809 | if ((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 | |
814 | vp = 0; /* init ptr */\r | |
815 | GETNUM (num, lnt); /* get number */\r | |
816 | fprint_val (of, (uint32) num, rdx, lnt * 8, PV_RZRO);\r | |
817 | return -(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 | |
831 | t_stat fprint_sym_m (FILE *of, uint32 addr, t_value *val)\r | |
832 | {\r | |
833 | int32 i, k, vp, inst, numspec;\r | |
834 | int32 num, spec, rn, disp, index;\r | |
835 | \r | |
836 | vp = 0; /* init ptr */\r | |
837 | inst = (int32) val[vp++]; /* get opcode */\r | |
838 | if (inst == 0xFD) inst = 0x100 | (int32) val[vp++]; /* 2 byte op? */\r | |
839 | if (opcode[inst] == NULL) return SCPE_ARG; /* defined? */\r | |
840 | numspec = DR_GETNSP (drom[inst][0]); /* get # spec */\r | |
841 | if (numspec == 0) numspec = DR_GETUSP (drom[inst][0]);\r | |
842 | fprintf (of, "%s", opcode[inst]); /* print name */\r | |
843 | for (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 | |
935 | return -(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 | |
949 | int32 fprint_sym_qoimm (FILE *of, t_value *val, int32 vp, int32 lnt)\r | |
950 | {\r | |
951 | int32 i, k, startp, num[4];\r | |
952 | \r | |
953 | for (i = 0; i < lnt; i++) { GETNUM (num[lnt - 1 - i], 4); }\r | |
954 | for (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 | |
961 | return 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 | |
979 | t_stat parse_sym (char *cptr, t_addr exta, UNIT *uptr, t_value *val, int32 sw)\r | |
980 | {\r | |
981 | uint32 addr = (uint32) exta;\r | |
982 | int32 k, rdx, lnt, num, vp;\r | |
983 | t_stat r;\r | |
984 | DEVICE *dptr;\r | |
985 | static const uint32 maxv[5] = { 0, 0xFF, 0xFFFF, 0, 0xFFFFFFFF };\r | |
986 | \r | |
987 | if (uptr == NULL) uptr = &cpu_unit; /* anon = CPU */\r | |
988 | dptr = find_dev_from_unit (uptr); /* find dev */\r | |
989 | if (dptr == NULL) return SCPE_IERR;\r | |
990 | if (dptr->dwidth != 8) return SCPE_ARG; /* byte dev only */\r | |
991 | if (sw & SWMASK ('B')) lnt = 1; /* get length */\r | |
992 | else if (sw & SWMASK ('W')) lnt = 2;\r | |
993 | else if (sw & SWMASK ('L')) lnt = 4;\r | |
994 | else lnt = (uptr == &cpu_unit)? 4: 1;\r | |
995 | if (sw & SWMASK ('D')) rdx = 10; /* get radix */\r | |
996 | else if (sw & SWMASK ('O')) rdx = 8;\r | |
997 | else if (sw & SWMASK ('H')) rdx = 16;\r | |
998 | else rdx = dptr->dradix;\r | |
999 | \r | |
1000 | if ((sw & SWMASK ('A')) || ((*cptr == '\'') && cptr++)) /* ASCII char? */\r | |
1001 | return parse_char (cptr, val, lnt);\r | |
1002 | if ((sw & SWMASK ('C')) || ((*cptr == '"') && cptr++)) /* ASCII string? */\r | |
1003 | return parse_char (cptr, val, sim_emax);\r | |
1004 | \r | |
1005 | if ((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 | |
1011 | if (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 | |
1016 | num = (int32) get_uint (cptr, rdx, maxv[lnt], &r); /* get number */\r | |
1017 | if (r != SCPE_OK) return r;\r | |
1018 | vp = 0;\r | |
1019 | PUTNUM (num, lnt); /* store */\r | |
1020 | return -(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 | |
1034 | t_stat parse_char (char *cptr, t_value *val, int32 lnt)\r | |
1035 | {\r | |
1036 | int32 vp;\r | |
1037 | \r | |
1038 | if (*cptr == 0) return SCPE_ARG;\r | |
1039 | vp = 0;\r | |
1040 | while ((vp < lnt) && *cptr) { /* get chars */\r | |
1041 | val[vp++] = *cptr++;\r | |
1042 | }\r | |
1043 | return -(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 | |
1057 | t_stat parse_sym_m (char *cptr, uint32 addr, t_value *val)\r | |
1058 | {\r | |
1059 | int32 i, numspec, disp, opc, vp;\r | |
1060 | t_stat r;\r | |
1061 | char gbuf[CBUFSIZE];\r | |
1062 | \r | |
1063 | cptr = get_glyph (cptr, gbuf, 0); /* get opcode */\r | |
1064 | for (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 | |
1067 | if (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 | |
1072 | if (opc < 0) return SCPE_ARG; /* undefined? */\r | |
1073 | vp = 0;\r | |
1074 | if (opc >= 0x100) val[vp++] = 0xFD; /* 2 byte? */\r | |
1075 | val[vp++] = opc & 0xFF; /* store opcode */\r | |
1076 | numspec = DR_GETNSP (drom[opc][0]); /* get # specifiers */\r | |
1077 | if (numspec == 0) numspec = DR_GETUSP (drom[opc][0]);\r | |
1078 | for (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 | |
1087 | if (*cptr != 0) return SCPE_ARG;\r | |
1088 | return -(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 | |
1104 | int32 parse_brdisp (char *cptr, uint32 addr, t_value *val, int32 vp,\r | |
1105 | int32 lnt, t_stat *r)\r | |
1106 | {\r | |
1107 | int32 k, dest, num;\r | |
1108 | \r | |
1109 | dest = (int32) get_uint (cptr, 16, 0xFFFFFFFF, r); /* get value */\r | |
1110 | num = dest - (addr + vp + lnt + 1); /* compute offset */\r | |
1111 | if ((num > (lnt? 32767: 127)) || (num < (lnt? -32768: -128)))\r | |
1112 | *r = SCPE_ARG;\r | |
1113 | else {\r | |
1114 | PUTNUM (num, lnt + 1); /* store offset */\r | |
1115 | *r = SCPE_OK;\r | |
1116 | }\r | |
1117 | return 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 | |
1151 | int32 parse_spec (char *cptr, uint32 addr, t_value *val, int32 vp, int32 disp, t_stat *r)\r | |
1152 | {\r | |
1153 | int32 i, k, litsize, rn, index;\r | |
1154 | int32 num, dispsize, mode;\r | |
1155 | int32 lit[4] = { 0 };\r | |
1156 | int32 fl = 0;\r | |
1157 | char c, *tptr;\r | |
1158 | const char *force[] = { "S^", "I^", "B^", "W^", "L^", NULL };\r | |
1159 | \r | |
1160 | *r = SCPE_OK; /* assume ok */\r | |
1161 | M1C ('@', SP_IND); /* look for @ */\r | |
1162 | if (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 | |
1172 | for (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 | |
1179 | M1C ('#', SP_LIT); /* look for # */\r | |
1180 | M1C ('+', SP_PLUS); /* look for + */\r | |
1181 | M1C ('-', SP_MINUS); /* look for - */\r | |
1182 | for (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 | |
1194 | if (*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 | |
1199 | M1C ('+', SP_POSTP); /* look for + */\r | |
1200 | if (*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 | |
1205 | switch (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 | |
1381 | if (*cptr != 0) *r = SCPE_ARG; /* must be done */\r | |
1382 | return vp;\r | |
1383 | }\r | |
1384 | \r | |
1385 | char *parse_rnum (char *cptr, int32 *rn)\r | |
1386 | {\r | |
1387 | int32 i, lnt;\r | |
1388 | t_value regnum;\r | |
1389 | char *tptr;\r | |
1390 | \r | |
1391 | for (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 | |
1398 | if (*cptr++ != 'R') return NULL; /* look for R */\r | |
1399 | regnum = strtotv (cptr, &tptr, 10); /* look for reg # */\r | |
1400 | if ((cptr == tptr) || (regnum > 15)) return NULL;\r | |
1401 | *rn = (int32) regnum;\r | |
1402 | return tptr;\r | |
1403 | }\r | |
1404 | \r | |
1405 | int32 parse_sym_qoimm (int32 *lit, t_value *val, int32 vp, int lnt, int32 minus)\r | |
1406 | {\r | |
1407 | int32 i, k, prev;\r | |
1408 | \r | |
1409 | for (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 | |
1413 | return vp;\r | |
1414 | }\r | |
1415 | \r |