| 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 |