First Commit of my working state
[simh.git] / PDP10 / pdp10_sys.c
CommitLineData
196ba1fc
PH
1/* pdp10_sys.c: PDP-10 simulator interface\r
2\r
3 Copyright (c) 1993-2007, 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 01-Feb-07 RMS Added CD support\r
27 22-Jul-05 RMS Fixed warning from Solaris C (from Doug Gwyn)\r
28 09-Jan-03 RMS Added DEUNA/DELUA support\r
29 12-Sep-02 RMS Added RX211 support\r
30 22-Apr-02 RMS Removed magtape record length error\r
31 17-Sep-01 RMS Removed multiconsole support\r
32 25-Aug-01 RMS Enabled DZ11\r
33 27-May-01 RMS Added multiconsole support\r
34 29-Apr-01 RMS Fixed format for RDPCST, WRPCST\r
35 Added CLRCSH for ITS\r
36 03-Apr-01 RMS Added support for loading EXE files\r
37 19-Mar-01 RMS Added support for loading SAV files\r
38 30-Oct-00 RMS Added support for examine to file\r
39*/\r
40\r
41#include "pdp10_defs.h"\r
42#include <ctype.h>\r
43\r
44extern DEVICE cpu_dev;\r
45extern DEVICE pag_dev;\r
46extern DEVICE tim_dev;\r
47extern DEVICE fe_dev;\r
48extern DEVICE uba_dev;\r
49extern DEVICE ptr_dev;\r
50extern DEVICE ptp_dev;\r
51extern DEVICE rp_dev;\r
52extern DEVICE tu_dev;\r
53extern DEVICE dz_dev;\r
54extern DEVICE ry_dev;\r
55extern DEVICE cr_dev;\r
56extern DEVICE lp20_dev;\r
57extern DEVICE xu_dev;\r
58extern UNIT cpu_unit;\r
59extern REG cpu_reg[];\r
60extern d10 *M;\r
61extern a10 saved_PC;\r
62\r
63/* SCP data structures and interface routines\r
64\r
65 sim_name simulator name string\r
66 sim_PC pointer to saved PC register descriptor\r
67 sim_emax number of words for examine\r
68 sim_devices array of pointers to simulated devices\r
69 sim_stop_messages array of pointers to stop messages\r
70 sim_load binary loader\r
71*/\r
72\r
73char sim_name[] = "PDP-10";\r
74\r
75REG *sim_PC = &cpu_reg[0];\r
76\r
77int32 sim_emax = 1;\r
78\r
79DEVICE *sim_devices[] = { \r
80 &cpu_dev,\r
81 &pag_dev,\r
82 &tim_dev,\r
83 &fe_dev,\r
84 &uba_dev,\r
85 &ptr_dev,\r
86 &ptp_dev,\r
87 &ry_dev,\r
88 &lp20_dev,\r
89 &cr_dev,\r
90 &rp_dev,\r
91 &tu_dev,\r
92 &dz_dev,\r
93 &xu_dev,\r
94 NULL\r
95 };\r
96\r
97const char *sim_stop_messages[] = {\r
98 "Unknown error",\r
99 "HALT instruction",\r
100 "Breakpoint",\r
101 "Illegal instruction",\r
102 "Illegal interrupt instruction",\r
103 "Paging error in interrupt",\r
104 "Zero vector table",\r
105 "NXM on UPT/EPT reference",\r
106 "Nested indirect address limit exceeded",\r
107 "Nested XCT limit exceeded",\r
108 "Invalid I/O controller",\r
109 "Address stop",\r
110 "Panic stop"\r
111 };\r
112\r
113/* Binary loader, supports RIM10, SAV, EXE */\r
114\r
115#define FMT_R 1 /* RIM10 */\r
116#define FMT_S 2 /* SAV */\r
117#define FMT_E 3 /* EXE */\r
118\r
119#define EXE_DIR 01776 /* EXE directory */\r
120#define EXE_VEC 01775 /* EXE entry vec */\r
121#define EXE_PDV 01774 /* EXE ignored */\r
122#define EXE_END 01777 /* EXE end\r
123\r
124/* RIM10 loader\r
125\r
126 RIM10 format is a binary paper tape format (all data frames\r
127 are 200 or greater). It consists of blocks containing\r
128\r
129 -count,,origin-1\r
130 word\r
131 :\r
132 word\r
133 checksum (includes IOWD)\r
134 :\r
135 JRST start\r
136*/\r
137\r
138d10 getrimw (FILE *fileref)\r
139{\r
140int32 i, tmp;\r
141d10 word;\r
142\r
143word = 0;\r
144for (i = 0; i < 6;) {\r
145 if ((tmp = getc (fileref)) == EOF) return -1;\r
146 if (tmp & 0200) {\r
147 word = (word << 6) | ((d10) tmp & 077);\r
148 i++;\r
149 }\r
150 }\r
151return word;\r
152}\r
153\r
154t_stat load_rim (FILE *fileref)\r
155{\r
156d10 count, cksm, data;\r
157a10 pa;\r
158int32 op;\r
159\r
160for ( ;; ) { /* loop until JRST */\r
161 count = cksm = getrimw (fileref); /* get header */\r
162 if (count < 0) return SCPE_FMT; /* read err? */\r
163 if (TSTS (count)) { /* hdr = IOWD? */\r
164 for ( ; TSTS (count); count = AOB (count)) {\r
165 data = getrimw (fileref); /* get data wd */\r
166 if (data < 0) return SCPE_FMT;\r
167 cksm = cksm + data; /* add to cksm */\r
168 pa = ((a10) count + 1) & AMASK; /* store */\r
169 M[pa] = data;\r
170 } /* end for */\r
171 data = getrimw (fileref); /* get cksm */\r
172 if (data < 0) return SCPE_FMT;\r
173 if ((cksm + data) & DMASK) return SCPE_CSUM; /* test cksm */\r
174 } /* end if count */\r
175 else {\r
176 op = GET_OP (count); /* not IOWD */\r
177 if (op != OP_JRST) return SCPE_FMT; /* JRST? */\r
178 saved_PC = (a10) count & AMASK; /* set PC */\r
179 break;\r
180 } /* end else */\r
181 } /* end for */\r
182return SCPE_OK;\r
183}\r
184\r
185/* SAV file loader\r
186\r
187 SAV format is a disk file format (36b words). It consists of\r
188 blocks containing:\r
189\r
190 -count,,origin-1\r
191 word\r
192 :\r
193 word\r
194 :\r
195 JRST start\r
196*/\r
197\r
198t_stat load_sav (FILE *fileref)\r
199{\r
200d10 count, data;\r
201a10 pa;\r
202int32 wc, op;\r
203\r
204for ( ;; ) { /* loop */\r
205 wc = fxread (&count, sizeof (d10), 1, fileref); /* read IOWD */\r
206 if (wc == 0) return SCPE_OK; /* done? */\r
207 if (TSTS (count)) { /* IOWD? */\r
208 for ( ; TSTS (count); count = AOB (count)) {\r
209 wc = fxread (&data, sizeof (d10), 1, fileref);\r
210 if (wc == 0) return SCPE_FMT;\r
211 pa = ((a10) count + 1) & AMASK; /* store data */\r
212 M[pa] = data;\r
213 } /* end for */\r
214 } /* end if count*/\r
215 else {\r
216 op = GET_OP (count); /* not IOWD */\r
217 if (op != OP_JRST) return SCPE_FMT; /* JRST? */\r
218 saved_PC = (a10) count & AMASK; /* set PC */\r
219 break;\r
220 } /* end else */\r
221 } /* end for */\r
222return SCPE_OK;\r
223}\r
224\r
225/* EXE file loader\r
226\r
227 EXE format is a disk file format (36b words). It consists of\r
228 blocks containing:\r
229\r
230 block type,,total words = n\r
231 n - 1 data words\r
232\r
233 Block types are\r
234\r
235 EXE_DIR (1776) directory\r
236 EXE_VEC (1775) entry vector\r
237 EXE_PDV (1774) optional blocks\r
238 EXE_END (1777) end block\r
239\r
240 The directory blocks are the most important and contain doubleword\r
241 page loading information:\r
242\r
243 word0<0:8> = flags\r
244 <9:35> = page in file (0 if 0 page)\r
245 word1<0:8> = repeat count - 1\r
246 <9:35> = page in memory\r
247*/\r
248\r
249#define DIRSIZ (2 * PAG_SIZE)\r
250\r
251t_stat load_exe (FILE *fileref)\r
252{\r
253d10 data, dirbuf[DIRSIZ], pagbuf[PAG_SIZE], entbuf[2];\r
254int32 ndir, entvec, i, j, k, cont, bsz, bty, rpt, wc;\r
255int32 fpage, mpage;\r
256a10 ma;\r
257\r
258ndir = entvec = 0; /* no dir, entvec */\r
259cont = 1;\r
260do {\r
261 wc = fxread (&data, sizeof (d10), 1, fileref); /* read blk hdr */\r
262 if (wc == 0) return SCPE_FMT; /* error? */\r
263 bsz = (int32) ((data & RMASK) - 1); /* get count */\r
264 if (bsz <= 0) return SCPE_FMT; /* zero? */\r
265 bty = (int32) LRZ (data); /* get type */\r
266 switch (bty) { /* case type */\r
267\r
268 case EXE_DIR: /* directory */\r
269 if (ndir) return SCPE_FMT; /* got one */\r
270 ndir = fxread (dirbuf, sizeof (d10), bsz, fileref);\r
271 if (ndir < bsz) return SCPE_FMT; /* error */\r
272 break;\r
273\r
274 case EXE_PDV: /* ??? */\r
275 fseek (fileref, bsz * sizeof (d10), SEEK_CUR);\r
276 break;\r
277\r
278 case EXE_VEC: /* entry vec */\r
279 if (bsz != 2) return SCPE_FMT; /* must be 2 wds */\r
280 entvec = fxread (entbuf, sizeof (d10), bsz, fileref);\r
281 if (entvec < 2) return SCPE_FMT; /* error? */\r
282 cont = 0; /* stop */\r
283 break;\r
284\r
285 case EXE_END: /* end */\r
286 if (bsz != 0) return SCPE_FMT; /* must be hdr */\r
287 cont = 0; /* stop */\r
288 break;\r
289\r
290 default:\r
291 return SCPE_FMT;\r
292 } /* end switch */\r
293 } while (cont); /* end do */\r
294\r
295for (i = 0; i < ndir; i = i + 2) { /* loop thru dir */\r
296 fpage = (int32) (dirbuf[i] & RMASK); /* file page */\r
297 mpage = (int32) (dirbuf[i + 1] & RMASK); /* memory page */\r
298 rpt = (int32) ((dirbuf[i + 1] >> 27) + 1); /* repeat count */\r
299 for (j = 0; j < rpt; j++, mpage++) { /* loop thru rpts */\r
300 if (fpage) { /* file pages? */\r
301 fseek (fileref, (fpage << PAG_V_PN) * sizeof (d10), SEEK_SET);\r
302 wc = fxread (pagbuf, sizeof (d10), PAG_SIZE, fileref);\r
303 if (wc < PAG_SIZE) return SCPE_FMT;\r
304 fpage++;\r
305 }\r
306 ma = mpage << PAG_V_PN; /* mem addr */\r
307 for (k = 0; k < PAG_SIZE; k++, ma++) { /* copy buf to mem */\r
308 if (MEM_ADDR_NXM (ma)) return SCPE_NXM;\r
309 M[ma] = fpage? (pagbuf[k] & DMASK): 0;\r
310 } /* end copy */\r
311 } /* end rpt */\r
312 } /* end directory */\r
313if (entvec && entbuf[1])\r
314 saved_PC = (int32) entbuf[1] & RMASK; /* start addr */\r
315return SCPE_OK;\r
316}\r
317\r
318/* Master loader */\r
319\r
320t_stat sim_load (FILE *fileref, char *cptr, char *fnam, int flag)\r
321{\r
322d10 data;\r
323int32 wc, fmt;\r
324extern int32 sim_switches;\r
325\r
326fmt = 0; /* no fmt */\r
327if (sim_switches & SWMASK ('R')) fmt = FMT_R; /* -r? */\r
328else if (sim_switches & SWMASK ('S')) fmt = FMT_S; /* -s? */\r
329else if (sim_switches & SWMASK ('E')) fmt = FMT_E; /* -e? */\r
330else if (match_ext (fnam, "RIM")) fmt = FMT_R; /* .RIM? */\r
331else if (match_ext (fnam, "SAV")) fmt = FMT_S; /* .SAV? */\r
332else if (match_ext (fnam, "EXE")) fmt = FMT_E; /* .EXE? */\r
333else {\r
334 wc = fxread (&data, sizeof (d10), 1, fileref); /* read hdr */\r
335 if (wc == 0) return SCPE_FMT; /* error? */\r
336 if (LRZ (data) == EXE_DIR) fmt = FMT_E; /* EXE magic? */\r
337 else if (TSTS (data)) fmt = FMT_S; /* SAV magic? */\r
338 fseek (fileref, 0, SEEK_SET); /* rewind */\r
339 }\r
340\r
341switch (fmt) { /* case fmt */\r
342\r
343 case FMT_R: /* RIM */\r
344 return load_rim (fileref);\r
345\r
346 case FMT_S: /* SAV */\r
347 return load_sav (fileref);\r
348\r
349 case FMT_E: /* EXE */\r
350 return load_exe (fileref);\r
351 }\r
352\r
353printf ("Can't determine load file format\n");\r
354return SCPE_FMT;\r
355}\r
356\r
357/* Symbol tables */\r
358\r
359#define I_V_FL 39 /* inst class */\r
360#define I_M_FL 03 /* class mask */\r
361#define I_ITS 004000000000000 /* ITS flag */\r
362#define I_AC 000000000000000 /* AC, address */\r
363#define I_OP 010000000000000 /* address only */\r
364#define I_IO 020000000000000 /* classic I/O */\r
365#define I_V_AC 00\r
366#define I_V_OP 01\r
367#define I_V_IO 02\r
368\r
369static const d10 masks[] = {\r
370 0777000000000, 0777740000000,\r
371 0700340000000, 0777777777777\r
372 }; \r
373\r
374static const char *opcode[] = {\r
375"XCTR", "XCTI", /* ITS only */\r
376"IORDI", "IORDQ", "IORD", "IOWR", "IOWRI", "IOWRQ",\r
377"IORDBI", "IORDBQ", "IORDB", "IOWRB", "IOWRBI", "IOWRBQ",\r
378"CLRCSH", "RDPCST", "WRPCST",\r
379"SDBR1", "SDBR2", "SDBR3", "SDBR4", "SPM",\r
380"LDBR1", "LDBR2", "LDBR3", "LDBR4", "LPMR",\r
381\r
382"PORTAL", "JRSTF", "HALT", /* AC defines op */\r
383"XJRSTF", "XJEN", "XPCW",\r
384"JEN", "SFM", "XJRST", "IBP",\r
385"JFOV", "JCRY1", "JCRY0", "JCRY", "JOV",\r
386\r
387"APRID", "WRAPR", "RDAPR", "WRPI", "RDPI", "RDUBR", "CLRPT", "WRUBR",\r
388"WREBR", "RDEBR",\r
389"RDSPB", "RDCSB", "RDPUR", "RDCSTM", "RDTIM", "RDINT", "RDHSB",\r
390"WRSPB", "WRCSB", "WRPUR", "WRCSTM", "WRTIM", "WRINT", "WRHSB",\r
391\r
392 "LUUO01", "LUUO02", "LUUO03", "LUUO04", "LUUO05", "LUUO06", "LUUO07",\r
393"LUUO10", "LUUO11", "LUUO12", "LUUO13", "LUUO14", "LUUO15", "LUUO16", "LUUO17",\r
394"LUUO20", "LUUO21", "LUUO22", "LUUO23", "LUUO24", "LUUO25", "LUUO26", "LUUO27",\r
395"LUUO30", "LUUO31", "LUUO32", "LUUO33", "LUUO34", "LUUO35", "LUUO36", "LUUO37",\r
396"MUUO40", "MUUO41", "MUUO42", "MUUO43", "MUUO44", "MUUO45", "MUUO46", "MUUO47",\r
397"MUUO50", "MUUO51", "MUUO52", "MUUO53", "MUUO54", "MUUO55", "MUUO56", "MUUO57",\r
398"MUUO60", "MUUO61", "MUUO62", "MUUO63", "MUUO64", "MUUO65", "MUUO66", "MUUO67",\r
399"MUUO70", "MUUO71", "MUUO72", "MUUO73", "MUUO74", "MUUO75", "MUUO76", "MUUO77",\r
400\r
401"UJEN", "GFAD", "GFSB", "JSYS", "ADJSP", "GFMP", "GFDV ", \r
402"DFAD", "DFSB", "DFMP", "DFDV", "DADD", "DSUB", "DMUL", "DDIV",\r
403"DMOVE", "DMOVN", "FIX", "EXTEND", "DMOVEM", "DMOVNM", "FIXR", "FLTR",\r
404"UFA", "DFN", "FSC", "ADJBP", "ILDB", "LDB", "IDPB", "DPB",\r
405"FAD", "FADL", "FADM", "FADB", "FADR", "FADRL", "FADRM", "FADRB",\r
406"FSB", "FSBL", "FSBM", "FSBB", "FSBR", "FSBRL", "FSBRM", "FSBRB",\r
407"FMP", "FMPL", "FMPM", "FMPB", "FMPR", "FMPRL", "FMPRM", "FMPRB",\r
408"FDV", "FDVL", "FDVM", "FDVB", "FDVR", "FDVRL", "FDVRM", "FDVRB",\r
409\r
410"MOVE", "MOVEI", "MOVEM", "MOVES", "MOVS", "MOVSI", "MOVSM", "MOVSS",\r
411"MOVN", "MOVNI", "MOVNM", "MOVNS", "MOVM", "MOVMI", "MOVMM", "MOVMS",\r
412"IMUL", "IMULI", "IMULM", "IMULB", "MUL", "MULI", "MULM", "MULB",\r
413"IDIV", "IDIVI", "IDIVM", "IDIVB", "DIV", "DIVI", "DIVM", "DIVB",\r
414"ASH", "ROT", "LSH", "JFFO", "ASHC", "ROTC", "LSHC", "CIRC",\r
415"EXCH", "BLT", "AOBJP", "AOBJN", "JRST", "JFCL", "XCT", "MAP", \r
416"PUSHJ", "PUSH", "POP", "POPJ", "JSR", "JSP", "JSA", "JRA",\r
417"ADD", "ADDI", "ADDM", "ADDB", "SUB", "SUBI", "SUBM", "SUBB",\r
418\r
419"CAI", "CAIL", "CAIE", "CAILE", "CAIA", "CAIGE", "CAIN", "CAIG",\r
420"CAM", "CAML", "CAME", "CAMLE", "CAMA", "CAMGE", "CAMN", "CAMG",\r
421"JUMP", "JUMPL", "JUMPE", "JUMPLE", "JUMPA", "JUMPGE", "JUMPN", "JUMPG",\r
422"SKIP", "SKIPL", "SKIPE", "SKIPLE", "SKIPA", "SKIPGE", "SKIPN", "SKIPG",\r
423"AOJ", "AOJL", "AOJE", "AOJLE", "AOJA", "AOJGE", "AOJN", "AOJG",\r
424"AOS", "AOSL", "AOSE", "AOSLE", "AOSA", "AOSGE", "AOSN", "AOSG",\r
425"SOJ", "SOJL", "SOJE", "SOJLE", "SOJA", "SOJGE", "SOJN", "SOJG",\r
426"SOS", "SOSL", "SOSE", "SOSLE", "SOSA", "SOSGE", "SOSN", "SOSG",\r
427\r
428"SETZ", "SETZI", "SETZM", "SETZB", "AND", "ANDI", "ANDM", "ANDB", \r
429"ANDCA", "ANDCAI", "ANDCAM", "ANDCAB", "SETM", "SETMI", "SETMM", "SETMB",\r
430"ANDCM", "ANDCMI", "ANDCMM", "ANDCMB", "SETA", "SETAI", "SETAM", "SETAB",\r
431"XOR", "XORI", "XORM", "XORB", "IOR", "IORI", "IORM", "IORB", \r
432"ANDCB", "ANDCBI", "ANDCBM", "ANDCBB", "EQV", "EQVI", "EQVM", "EQVB", \r
433"SETCA", "SETCAI", "SETCAM", "SETCAB", "ORCA", "ORCAI", "ORCAM", "ORCAB",\r
434"SETCM", "SETCMI", "SETCMM", "SETCMB", "ORCM", "ORCMI", "ORCMM", "ORCMB",\r
435"ORCB", "ORCBI", "ORCBM", "ORCBB", "SETO", "SETOI", "SETOM", "SETOB",\r
436\r
437"HLL", "HLLI", "HLLM", "HLLS", "HRL", "HRLI", "HRLM", "HRLS", \r
438"HLLZ", "HLLZI", "HLLZM", "HLLZS", "HRLZ", "HRLZI", "HRLZM", "HRLZS",\r
439"HLLO", "HLLOI", "HLLOM", "HLLOS", "HRLO", "HRLOI", "HRLOM", "HRLOS",\r
440"HLLE", "HLLEI", "HLLEM", "HLLES", "HRLE", "HRLEI", "HRLEM", "HRLES",\r
441"HRR", "HRRI", "HRRM", "HRRS", "HLR", "HLRI", "HLRM", "HLRS",\r
442"HRRZ", "HRRZI", "HRRZM", "HRRZS", "HLRZ", "HLRZI", "HLRZM", "HLRZS",\r
443"HRRO", "HRROI", "HRROM", "HRROS", "HLRO", "HLROI", "HLROM", "HLROS",\r
444"HRRE", "HRREI", "HRREM", "HRRES", "HLRE", "HLREI", "HLREM", "HLRES",\r
445\r
446"TRN", "TLN", "TRNE", "TLNE", "TRNA", "TLNA", "TRNN", "TLNN",\r
447"TDN", "TSN", "TDNE", "TSNE", "TDNA", "TSNA", "TDNN", "TSNN",\r
448"TRZ", "TLZ", "TRZE", "TLZE", "TRZA", "TLZA", "TRZN", "TLZN",\r
449"TDZ", "TSZ", "TDZE", "TSZE", "TDZA", "TSZA", "TDZN", "TSZN",\r
450"TRC", "TLC", "TRCE", "TLCE", "TRCA", "TLCA", "TRCN", "TLCN",\r
451"TDC", "TSC", "TDCE", "TSCE", "TDCA", "TSCA", "TDCN", "TSCN",\r
452"TRO", "TLO", "TROE", "TLOE", "TROA", "TLOA", "TRON", "TLON",\r
453"TDO", "TSO", "TDOE", "TSOE", "TDOA", "TSOA", "TDON", "TSON",\r
454\r
455"UMOVE", "UMOVEM", /* KS10 I/O */\r
456"TIOE", "TION", "RDIO", "WRIO",\r
457"BSIO", "BCIO", "BLTBU", "BLTUB",\r
458"TIOEB", "TIONB", "RDIOB", "WRIOB",\r
459"BSIOB", "BCIOB", \r
460\r
461"BLKI", "DATAI", "BLKO", "DATAO", /* classic I/O */\r
462"CONO", "CONI", "CONSZ", "CONSO",\r
463\r
464"CLEAR", "CLEARI", "CLEARM", "CLEARB",\r
465"OR", "ORI", "ORM", "ORB", "XMOVEI", "XHLLI", /* alternate ops */\r
466\r
467 "CMPSL", "CMPSE", "CMPSLE", /* extended ops */\r
468"EDIT", "CMPSGE", "CMPSN", "CMPSG",\r
469"CVTDBO", "CVTDBT", "CVTBDO", "CVTBDT",\r
470"MOVSO", "MOVST", "MOVSLJ", "MOVSRJ",\r
471"XBLT", "GSNGL", "GDBLE", "GDFIX",\r
472"GFIX", "GDFIXR", "GFIXR", "DGFLTR",\r
473"GFLTR", "GFSC",\r
474\r
475NULL\r
476};\r
477\r
478static const d10 opc_val[] = {\r
479 0102000000000+I_AC+I_ITS, 0103000000000+I_AC+I_ITS,\r
480 0710000000000+I_AC+I_ITS, 0711000000000+I_AC+I_ITS, 0712000000000+I_AC+I_ITS,\r
481 0713000000000+I_AC+I_ITS, 0714000000000+I_AC+I_ITS, 0715000000000+I_AC+I_ITS,\r
482 0720000000000+I_AC+I_ITS, 0721000000000+I_AC+I_ITS, 0722000000000+I_AC+I_ITS,\r
483 0723000000000+I_AC+I_ITS, 0724000000000+I_AC+I_ITS, 0725000000000+I_AC+I_ITS,\r
484 0701000000000+I_OP+I_ITS, 0701440000000+I_OP+I_ITS, 0701540000000+I_OP+I_ITS,\r
485 0702000000000+I_OP+I_ITS, 0702040000000+I_OP+I_ITS,\r
486 0702100000000+I_OP+I_ITS, 0702140000000+I_OP+I_ITS, 0702340000000+I_OP+I_ITS,\r
487 0702400000000+I_OP+I_ITS, 0702440000000+I_OP+I_ITS,\r
488 0702500000000+I_OP+I_ITS, 0702540000000+I_OP+I_ITS, 0702740000000+I_OP+I_ITS,\r
489 \r
490 0254040000000+I_OP, 0254100000000+I_OP,\r
491 0254200000000+I_OP, 0254240000000+I_OP, 0254300000000+I_OP, 0254340000000+I_OP,\r
492 0254500000000+I_OP, 0254600000000+I_OP, 0254640000000+I_OP, 0133000000000+I_OP,\r
493 0255040000000+I_OP, 0255100000000+I_OP, 0255200000000+I_OP, 0255300000000+I_OP,\r
494 0255400000000+I_OP,\r
495\r
496 0700000000000+I_OP, 0700200000000+I_OP, 0700240000000+I_OP, 0700600000000+I_OP,\r
497 0700640000000+I_OP, 0701040000000+I_OP, 0701100000000+I_OP, 0701140000000+I_OP,\r
498 0701200000000+I_OP, 0701240000000+I_OP,\r
499 0702000000000+I_OP, 0702040000000+I_OP, 0702100000000+I_OP, 0702140000000+I_OP,\r
500 0702200000000+I_OP, 0702240000000+I_OP, 0702300000000+I_OP,\r
501 0702400000000+I_OP, 0702440000000+I_OP, 0702500000000+I_OP, 0702540000000+I_OP,\r
502 0702600000000+I_OP, 0702640000000+I_OP, 0702700000000+I_OP,\r
503\r
504 0001000000000+I_AC, 0002000000000+I_AC, 0003000000000+I_AC,\r
505 0004000000000+I_AC, 0005000000000+I_AC, 0006000000000+I_AC, 0007000000000+I_AC,\r
506 0010000000000+I_AC, 0011000000000+I_AC, 0012000000000+I_AC, 0013000000000+I_AC,\r
507 0014000000000+I_AC, 0015000000000+I_AC, 0016000000000+I_AC, 0017000000000+I_AC,\r
508 0020000000000+I_AC, 0021000000000+I_AC, 0022000000000+I_AC, 0023000000000+I_AC,\r
509 0024000000000+I_AC, 0025000000000+I_AC, 0026000000000+I_AC, 0027000000000+I_AC,\r
510 0030000000000+I_AC, 0031000000000+I_AC, 0032000000000+I_AC, 0033000000000+I_AC,\r
511 0034000000000+I_AC, 0035000000000+I_AC, 0036000000000+I_AC, 0037000000000+I_AC,\r
512 0040000000000+I_AC, 0041000000000+I_AC, 0042000000000+I_AC, 0043000000000+I_AC,\r
513 0044000000000+I_AC, 0045000000000+I_AC, 0046000000000+I_AC, 0047000000000+I_AC,\r
514 0050000000000+I_AC, 0051000000000+I_AC, 0052000000000+I_AC, 0053000000000+I_AC,\r
515 0054000000000+I_AC, 0055000000000+I_AC, 0056000000000+I_AC, 0057000000000+I_AC,\r
516 0060000000000+I_AC, 0061000000000+I_AC, 0062000000000+I_AC, 0063000000000+I_AC,\r
517 0064000000000+I_AC, 0065000000000+I_AC, 0066000000000+I_AC, 0067000000000+I_AC,\r
518 0070000000000+I_AC, 0071000000000+I_AC, 0072000000000+I_AC, 0073000000000+I_AC,\r
519 0074000000000+I_AC, 0075000000000+I_AC, 0076000000000+I_AC, 0077000000000+I_AC,\r
520\r
521 0100000000000+I_AC, 0102000000000+I_AC, 0103000000000+I_AC,\r
522 0104000000000+I_AC, 0105000000000+I_AC, 0106000000000+I_AC, 0107000000000+I_AC,\r
523 0110000000000+I_AC, 0111000000000+I_AC, 0112000000000+I_AC, 0113000000000+I_AC,\r
524 0114000000000+I_AC, 0115000000000+I_AC, 0116000000000+I_AC, 0117000000000+I_AC,\r
525 0120000000000+I_AC, 0121000000000+I_AC, 0122000000000+I_AC, 0123000000000+I_AC,\r
526 0124000000000+I_AC, 0125000000000+I_AC, 0126000000000+I_AC, 0127000000000+I_AC,\r
527 0130000000000+I_AC, 0131000000000+I_AC, 0132000000000+I_AC, 0133000000000+I_AC,\r
528 0134000000000+I_AC, 0135000000000+I_AC, 0136000000000+I_AC, 0137000000000+I_AC,\r
529 0140000000000+I_AC, 0141000000000+I_AC, 0142000000000+I_AC, 0143000000000+I_AC,\r
530 0144000000000+I_AC, 0145000000000+I_AC, 0146000000000+I_AC, 0147000000000+I_AC,\r
531 0150000000000+I_AC, 0151000000000+I_AC, 0152000000000+I_AC, 0153000000000+I_AC,\r
532 0154000000000+I_AC, 0155000000000+I_AC, 0156000000000+I_AC, 0157000000000+I_AC,\r
533 0160000000000+I_AC, 0161000000000+I_AC, 0162000000000+I_AC, 0163000000000+I_AC,\r
534 0164000000000+I_AC, 0165000000000+I_AC, 0166000000000+I_AC, 0167000000000+I_AC,\r
535 0170000000000+I_AC, 0171000000000+I_AC, 0172000000000+I_AC, 0173000000000+I_AC,\r
536 0174000000000+I_AC, 0175000000000+I_AC, 0176000000000+I_AC, 0177000000000+I_AC,\r
537\r
538 0200000000000+I_AC, 0201000000000+I_AC, 0202000000000+I_AC, 0203000000000+I_AC,\r
539 0204000000000+I_AC, 0205000000000+I_AC, 0206000000000+I_AC, 0207000000000+I_AC,\r
540 0210000000000+I_AC, 0211000000000+I_AC, 0212000000000+I_AC, 0213000000000+I_AC,\r
541 0214000000000+I_AC, 0215000000000+I_AC, 0216000000000+I_AC, 0217000000000+I_AC,\r
542 0220000000000+I_AC, 0221000000000+I_AC, 0222000000000+I_AC, 0223000000000+I_AC,\r
543 0224000000000+I_AC, 0225000000000+I_AC, 0226000000000+I_AC, 0227000000000+I_AC,\r
544 0230000000000+I_AC, 0231000000000+I_AC, 0232000000000+I_AC, 0233000000000+I_AC,\r
545 0234000000000+I_AC, 0235000000000+I_AC, 0236000000000+I_AC, 0237000000000+I_AC,\r
546 0240000000000+I_AC, 0241000000000+I_AC, 0242000000000+I_AC, 0243000000000+I_AC,\r
547 0244000000000+I_AC, 0245000000000+I_AC, 0246000000000+I_AC, 0247000000000+I_AC+I_ITS,\r
548 0250000000000+I_AC, 0251000000000+I_AC, 0252000000000+I_AC, 0253000000000+I_AC,\r
549 0254000000000+I_AC, 0255000000000+I_AC, 0256000000000+I_AC, 0257000000000+I_AC,\r
550 0260000000000+I_AC, 0261000000000+I_AC, 0262000000000+I_AC, 0263000000000+I_AC,\r
551 0264000000000+I_AC, 0265000000000+I_AC, 0266000000000+I_AC, 0267000000000+I_AC,\r
552 0270000000000+I_AC, 0271000000000+I_AC, 0272000000000+I_AC, 0273000000000+I_AC,\r
553 0274000000000+I_AC, 0275000000000+I_AC, 0276000000000+I_AC, 0277000000000+I_AC,\r
554\r
555 0300000000000+I_AC, 0301000000000+I_AC, 0302000000000+I_AC, 0303000000000+I_AC,\r
556 0304000000000+I_AC, 0305000000000+I_AC, 0306000000000+I_AC, 0307000000000+I_AC,\r
557 0310000000000+I_AC, 0311000000000+I_AC, 0312000000000+I_AC, 0313000000000+I_AC,\r
558 0314000000000+I_AC, 0315000000000+I_AC, 0316000000000+I_AC, 0317000000000+I_AC,\r
559 0320000000000+I_AC, 0321000000000+I_AC, 0322000000000+I_AC, 0323000000000+I_AC,\r
560 0324000000000+I_AC, 0325000000000+I_AC, 0326000000000+I_AC, 0327000000000+I_AC,\r
561 0330000000000+I_AC, 0331000000000+I_AC, 0332000000000+I_AC, 0333000000000+I_AC,\r
562 0334000000000+I_AC, 0335000000000+I_AC, 0336000000000+I_AC, 0337000000000+I_AC,\r
563 0340000000000+I_AC, 0341000000000+I_AC, 0342000000000+I_AC, 0343000000000+I_AC,\r
564 0344000000000+I_AC, 0345000000000+I_AC, 0346000000000+I_AC, 0347000000000+I_AC,\r
565 0350000000000+I_AC, 0351000000000+I_AC, 0352000000000+I_AC, 0353000000000+I_AC,\r
566 0354000000000+I_AC, 0355000000000+I_AC, 0356000000000+I_AC, 0357000000000+I_AC,\r
567 0360000000000+I_AC, 0361000000000+I_AC, 0362000000000+I_AC, 0363000000000+I_AC,\r
568 0364000000000+I_AC, 0365000000000+I_AC, 0366000000000+I_AC, 0367000000000+I_AC,\r
569 0370000000000+I_AC, 0371000000000+I_AC, 0372000000000+I_AC, 0373000000000+I_AC,\r
570 0374000000000+I_AC, 0375000000000+I_AC, 0376000000000+I_AC, 0377000000000+I_AC,\r
571\r
572 0400000000000+I_AC, 0401000000000+I_AC, 0402000000000+I_AC, 0403000000000+I_AC,\r
573 0404000000000+I_AC, 0405000000000+I_AC, 0406000000000+I_AC, 0407000000000+I_AC,\r
574 0410000000000+I_AC, 0411000000000+I_AC, 0412000000000+I_AC, 0413000000000+I_AC,\r
575 0414000000000+I_AC, 0415000000000+I_AC, 0416000000000+I_AC, 0417000000000+I_AC,\r
576 0420000000000+I_AC, 0421000000000+I_AC, 0422000000000+I_AC, 0423000000000+I_AC,\r
577 0424000000000+I_AC, 0425000000000+I_AC, 0426000000000+I_AC, 0427000000000+I_AC,\r
578 0430000000000+I_AC, 0431000000000+I_AC, 0432000000000+I_AC, 0433000000000+I_AC,\r
579 0434000000000+I_AC, 0435000000000+I_AC, 0436000000000+I_AC, 0437000000000+I_AC,\r
580 0440000000000+I_AC, 0441000000000+I_AC, 0442000000000+I_AC, 0443000000000+I_AC,\r
581 0444000000000+I_AC, 0445000000000+I_AC, 0446000000000+I_AC, 0447000000000+I_AC,\r
582 0450000000000+I_AC, 0451000000000+I_AC, 0452000000000+I_AC, 0453000000000+I_AC,\r
583 0454000000000+I_AC, 0455000000000+I_AC, 0456000000000+I_AC, 0457000000000+I_AC,\r
584 0460000000000+I_AC, 0461000000000+I_AC, 0462000000000+I_AC, 0463000000000+I_AC,\r
585 0464000000000+I_AC, 0465000000000+I_AC, 0466000000000+I_AC, 0467000000000+I_AC,\r
586 0470000000000+I_AC, 0471000000000+I_AC, 0472000000000+I_AC, 0473000000000+I_AC,\r
587 0474000000000+I_AC, 0475000000000+I_AC, 0476000000000+I_AC, 0477000000000+I_AC,\r
588\r
589 0500000000000+I_AC, 0501000000000+I_AC, 0502000000000+I_AC, 0503000000000+I_AC,\r
590 0504000000000+I_AC, 0505000000000+I_AC, 0506000000000+I_AC, 0507000000000+I_AC,\r
591 0510000000000+I_AC, 0511000000000+I_AC, 0512000000000+I_AC, 0513000000000+I_AC,\r
592 0514000000000+I_AC, 0515000000000+I_AC, 0516000000000+I_AC, 0517000000000+I_AC,\r
593 0520000000000+I_AC, 0521000000000+I_AC, 0522000000000+I_AC, 0523000000000+I_AC,\r
594 0524000000000+I_AC, 0525000000000+I_AC, 0526000000000+I_AC, 0527000000000+I_AC,\r
595 0530000000000+I_AC, 0531000000000+I_AC, 0532000000000+I_AC, 0533000000000+I_AC,\r
596 0534000000000+I_AC, 0535000000000+I_AC, 0536000000000+I_AC, 0537000000000+I_AC,\r
597 0540000000000+I_AC, 0541000000000+I_AC, 0542000000000+I_AC, 0543000000000+I_AC,\r
598 0544000000000+I_AC, 0545000000000+I_AC, 0546000000000+I_AC, 0547000000000+I_AC,\r
599 0550000000000+I_AC, 0551000000000+I_AC, 0552000000000+I_AC, 0553000000000+I_AC,\r
600 0554000000000+I_AC, 0555000000000+I_AC, 0556000000000+I_AC, 0557000000000+I_AC,\r
601 0560000000000+I_AC, 0561000000000+I_AC, 0562000000000+I_AC, 0563000000000+I_AC,\r
602 0564000000000+I_AC, 0565000000000+I_AC, 0566000000000+I_AC, 0567000000000+I_AC,\r
603 0570000000000+I_AC, 0571000000000+I_AC, 0572000000000+I_AC, 0573000000000+I_AC,\r
604 0574000000000+I_AC, 0575000000000+I_AC, 0576000000000+I_AC, 0577000000000+I_AC,\r
605\r
606 0600000000000+I_AC, 0601000000000+I_AC, 0602000000000+I_AC, 0603000000000+I_AC,\r
607 0604000000000+I_AC, 0605000000000+I_AC, 0606000000000+I_AC, 0607000000000+I_AC,\r
608 0610000000000+I_AC, 0611000000000+I_AC, 0612000000000+I_AC, 0613000000000+I_AC,\r
609 0614000000000+I_AC, 0615000000000+I_AC, 0616000000000+I_AC, 0617000000000+I_AC,\r
610 0620000000000+I_AC, 0621000000000+I_AC, 0622000000000+I_AC, 0623000000000+I_AC,\r
611 0624000000000+I_AC, 0625000000000+I_AC, 0626000000000+I_AC, 0627000000000+I_AC,\r
612 0630000000000+I_AC, 0631000000000+I_AC, 0632000000000+I_AC, 0633000000000+I_AC,\r
613 0634000000000+I_AC, 0635000000000+I_AC, 0636000000000+I_AC, 0637000000000+I_AC,\r
614 0640000000000+I_AC, 0641000000000+I_AC, 0642000000000+I_AC, 0643000000000+I_AC,\r
615 0644000000000+I_AC, 0645000000000+I_AC, 0646000000000+I_AC, 0647000000000+I_AC,\r
616 0650000000000+I_AC, 0651000000000+I_AC, 0652000000000+I_AC, 0653000000000+I_AC,\r
617 0654000000000+I_AC, 0655000000000+I_AC, 0656000000000+I_AC, 0657000000000+I_AC,\r
618 0660000000000+I_AC, 0661000000000+I_AC, 0662000000000+I_AC, 0663000000000+I_AC,\r
619 0664000000000+I_AC, 0665000000000+I_AC, 0666000000000+I_AC, 0667000000000+I_AC,\r
620 0670000000000+I_AC, 0671000000000+I_AC, 0672000000000+I_AC, 0673000000000+I_AC,\r
621 0674000000000+I_AC, 0675000000000+I_AC, 0676000000000+I_AC, 0677000000000+I_AC,\r
622\r
623 0704000000000+I_AC, 0705000000000+I_AC,\r
624 0710000000000+I_AC, 0711000000000+I_AC, 0712000000000+I_AC, 0713000000000+I_AC,\r
625 0714000000000+I_AC, 0715000000000+I_AC, 0716000000000+I_AC, 0717000000000+I_AC,\r
626 0720000000000+I_AC, 0721000000000+I_AC, 0722000000000+I_AC, 0723000000000+I_AC,\r
627 0724000000000+I_AC, 0725000000000+I_AC,\r
628\r
629 0700000000000+I_IO, 0700040000000+I_IO, 0700100000000+I_IO, 0700140000000+I_IO,\r
630 0700200000000+I_IO, 0700240000000+I_IO, 0700300000000+I_IO, 0700340000000+I_IO,\r
631\r
632 0400000000000+I_AC, 0401000000000+I_AC, 0402000000000+I_AC, 0403000000000+I_AC,\r
633 0434000000000+I_AC, 0435000000000+I_AC, 0436000000000+I_AC, 0437000000000+I_AC,\r
634 0415000000000+I_AC, 0501000000000+I_AC,\r
635 \r
636 0001000000000+I_AC, 0002000000000+I_AC, 0003000000000+I_AC,\r
637 0004000000000+I_AC, 0005000000000+I_AC, 0006000000000+I_AC, 0007000000000+I_AC,\r
638 0010000000000+I_AC, 0011000000000+I_AC, 0012000000000+I_AC, 0013000000000+I_AC,\r
639 0014000000000+I_AC, 0015000000000+I_AC, 0016000000000+I_AC, 0017000000000+I_AC,\r
640 0020000000000+I_AC, 0021000000000+I_AC, 0022000000000+I_AC, 0023000000000+I_AC,\r
641 0024000000000+I_AC, 0025000000000+I_AC, 0026000000000+I_AC, 0027000000000+I_AC,\r
642 0030000000000+I_AC, 0031000000000+I_AC,\r
643 -1\r
644 };\r
645\r
646#define NUMDEV 6\r
647\r
648static const char *devnam[NUMDEV] = {\r
649 "APR", "PI", "PAG", "CCA", "TIM", "MTR"\r
650 };\r
651\r
652/* Symbolic decode\r
653\r
654 Inputs:\r
655 *of = output stream\r
656 addr = current PC\r
657 *val = pointer to values\r
658 *uptr = pointer to unit\r
659 sw = switches\r
660 Outputs:\r
661 return = status code\r
662*/\r
663\r
664#define FMTASC(x) ((x) < 040)? "<%03o>": "%c", (x)\r
665#define SIXTOASC(x) ((x) + 040)\r
666\r
667t_stat fprint_sym (FILE *of, t_addr addr, t_value *val,\r
668 UNIT *uptr, int32 sw)\r
669{\r
670int32 i, j, c, cflag, ac, xr, y, dev;\r
671d10 inst;\r
672\r
673inst = val[0];\r
674cflag = (uptr == NULL) || (uptr == &cpu_unit);\r
675if (sw & SWMASK ('A')) { /* ASCII? */\r
676 if (inst > 0377) return SCPE_ARG;\r
677 fprintf (of, FMTASC ((int32) (inst & 0177)));\r
678 return SCPE_OK;\r
679 }\r
680if (sw & SWMASK ('C')) { /* character? */\r
681 for (i = 30; i >= 0; i = i - 6) {\r
682 c = (int32) ((inst >> i) & 077);\r
683 fprintf (of, "%c", SIXTOASC (c));\r
684 } \r
685 return SCPE_OK;\r
686 }\r
687if (sw & SWMASK ('P')) { /* packed? */\r
688 for (i = 29; i >= 0; i = i - 7) {\r
689 c = (int32) ((inst >> i) & 0177);\r
690 fprintf (of, FMTASC (c));\r
691 }\r
692 return SCPE_OK;\r
693 }\r
694if (!(sw & SWMASK ('M'))) return SCPE_ARG;\r
695\r
696/* Instruction decode */\r
697\r
698ac = GET_AC (inst);\r
699xr = GET_XR (inst);\r
700y = GET_ADDR (inst);\r
701dev = GET_DEV (inst);\r
702for (i = 0; opc_val[i] >= 0; i++) { /* loop thru ops */\r
703 j = (int32) ((opc_val[i] >> I_V_FL) & I_M_FL); /* get class */\r
704 if (((opc_val[i] & DMASK) == (inst & masks[j])) && /* match? */\r
705 (((opc_val[i] & I_ITS) == 0) || Q_ITS)) {\r
706 fprintf (of, "%s ", opcode[i]); /* opcode */\r
707 switch (j) { /* case on class */\r
708\r
709 case I_V_AC: /* AC + address */\r
710 fprintf (of, "%-o,", ac); /* print AC, fall thru */\r
711 case I_V_OP: /* address only */\r
712 if (inst & INST_IND) fprintf (of, "@");\r
713 if (xr) fprintf (of, "%-o(%-o)", y, xr);\r
714 else fprintf (of, "%-o", y);\r
715 break;\r
716\r
717 case I_V_IO: /* I/O */\r
718 if (dev < NUMDEV) fprintf (of, "%s,", devnam[dev]);\r
719 else fprintf (of, "%-o,", dev);\r
720 if (inst & INST_IND) fprintf (of, "@");\r
721 if (xr) fprintf (of, "%-o(%-o)", y, xr);\r
722 else fprintf (of, "%-o", y);\r
723 break;\r
724 } /* end case */\r
725 return SCPE_OK;\r
726 } /* end if */\r
727 } /* end for */\r
728return SCPE_ARG;\r
729}\r
730\r
731/* Get operand, including indirect and index\r
732\r
733 Inputs:\r
734 *cptr = pointer to input string\r
735 *status = pointer to error status\r
736 Outputs:\r
737 val = output value\r
738*/\r
739\r
740t_value get_opnd (char *cptr, t_stat *status)\r
741{\r
742int32 sign = 0;\r
743t_value val, xr = 0, ind = 0;\r
744char *tptr;\r
745\r
746*status = SCPE_ARG; /* assume fail */\r
747if (*cptr == '@') {\r
748 ind = INST_IND;\r
749 cptr++;\r
750 } \r
751if (*cptr == '+') cptr++;\r
752else if (*cptr == '-') {\r
753 sign = 1;\r
754 cptr++;\r
755 }\r
756val = strtotv (cptr, &tptr, 8);\r
757if (val > 0777777) return 0;\r
758if (sign) val = (~val + 1) & 0777777;\r
759cptr = tptr;\r
760if (*cptr == '(') {\r
761 cptr++;\r
762 xr = strtotv (cptr, &tptr, 8);\r
763 if ((cptr == tptr) || (*tptr != ')') ||\r
764 (xr > AC_NUM) || (xr == 0)) return 0;\r
765 cptr = ++tptr;\r
766 }\r
767if (*cptr == 0) *status = SCPE_OK;\r
768return (ind | (xr << 18) | val);\r
769}\r
770\r
771/* Symbolic input\r
772\r
773 Inputs:\r
774 *cptr = pointer to input string\r
775 addr = current PC\r
776 uptr = pointer to unit\r
777 *val = pointer to output values\r
778 sw = switches\r
779 Outputs:\r
780 status = error status\r
781*/\r
782\r
783t_stat parse_sym (char *cptr, t_addr addr, UNIT *uptr, t_value *val, int32 sw)\r
784{\r
785int32 cflag, i, j;\r
786t_value ac, dev;\r
787t_stat r;\r
788char gbuf[CBUFSIZE];\r
789\r
790cflag = (uptr == NULL) || (uptr == &cpu_unit);\r
791while (isspace (*cptr)) cptr++;\r
792for (i = 0; i < 6; i++) {\r
793 if (cptr[i] == 0) {\r
794 for (j = i + 1; j <= 6; j++) cptr[j] = 0;\r
795 break;\r
796 }\r
797 }\r
798if ((sw & SWMASK ('A')) || ((*cptr == '\'') && cptr++)) { /* ASCII char? */\r
799 if (cptr[0] == 0) return SCPE_ARG; /* must have 1 char */\r
800 val[0] = (t_value) cptr[0];\r
801 return SCPE_OK;\r
802 }\r
803if ((sw & SWMASK ('C')) || ((*cptr == '"') && cptr++)) { /* sixbit string? */\r
804 if (cptr[0] == 0) return SCPE_ARG; /* must have 1 char */\r
805 for (i = 0; i < 6; i++) {\r
806 val[0] = (val[0] << 6);\r
807 if (cptr[i]) val[0] = val[0] |\r
808 ((t_value) ((cptr[i] + 040) & 077));\r
809 }\r
810 return SCPE_OK;\r
811 }\r
812if ((sw & SWMASK ('P')) || ((*cptr == '#') && cptr++)) { /* packed string? */\r
813 if (cptr[0] == 0) return SCPE_ARG; /* must have 1 char */\r
814 for (i = 0; i < 5; i++) val[0] = (val[0] << 7) | ((t_value) cptr[i]);\r
815 val[0] = val[0] << 1;\r
816 return SCPE_OK;\r
817 }\r
818\r
819/* Instruction parse */\r
820\r
821cptr = get_glyph (cptr, gbuf, 0); /* get opcode */\r
822for (i = 0; (opcode[i] != NULL) && (strcmp (opcode[i], gbuf) != 0) ; i++) ;\r
823if (opcode[i] == NULL) return SCPE_ARG;\r
824val[0] = opc_val[i] & DMASK; /* get value */\r
825j = (int32) ((opc_val[i] >> I_V_FL) & I_M_FL); /* get class */\r
826switch (j) { /* case on class */\r
827\r
828 case I_V_AC: /* AC + operand */\r
829 if (strchr (cptr, ',')) { /* AC specified? */\r
830 cptr = get_glyph (cptr, gbuf, ','); /* get glyph */\r
831 if (gbuf[0]) { /* can be omitted */\r
832 ac = get_uint (gbuf, 8, AC_NUM - 1, &r);\r
833 if (r != SCPE_OK) return SCPE_ARG;\r
834 val[0] = val[0] | (ac << INST_V_AC);\r
835 }\r
836 } /* fall through */\r
837 case I_V_OP: /* operand */\r
838 cptr = get_glyph (cptr, gbuf, 0);\r
839 val[0] = val[0] | get_opnd (gbuf, &r);\r
840 if (r != SCPE_OK) return SCPE_ARG;\r
841 break;\r
842\r
843 case I_V_IO: /* I/O */\r
844 cptr = get_glyph (cptr, gbuf, ','); /* get glyph */\r
845 for (dev = 0; (dev < NUMDEV) && (strcmp (devnam[dev], gbuf) != 0); dev++);\r
846 if (dev >= NUMDEV) {\r
847 dev = get_uint (gbuf, 8, INST_M_DEV, &r);\r
848 if (r != SCPE_OK) return SCPE_ARG;\r
849 }\r
850 val[0] = val[0] | (dev << INST_V_DEV);\r
851 cptr = get_glyph (cptr, gbuf, 0);\r
852 val[0] = val[0] | get_opnd (gbuf, &r);\r
853 if (r != SCPE_OK) return SCPE_ARG;\r
854 break;\r
855 } /* end case */\r
856\r
857if (*cptr != 0) return SCPE_ARG; /* junk at end? */\r
858return SCPE_OK;\r
859}\r