|
|
1.1 root 1: /*
2: * cray disassembler
3: */
4:
5: #include "defs.h"
6: #include "space.h"
7:
8: #define FBIG 1
9: #define FPAR 2
10: #define FWRD 4
11:
12: static struct optab {
13: int op;
14: int mask;
15: int mbnz;
16: int flag;
17: char *name;
18: } optab[] = {
19: 0000000, 0177777, 0, 0, "err",
20: 0001000, 0177707, 0, 0, "%ca,%a$j\t1",
21: 0001100, 0177707, 0, 0, "%cl,%a$j\t1",
22: 0001000, 0177700, 0, 0, "%ca,%a$j\t%a$k",
23: 0001100, 0177700, 0, 0, "%cl,%a$j\t%a$k",
24: 0001200, 0177707, 0, 0, "%ci,%a$j",
25: 0001201, 0177707, 0, 0, "%mc,%a$j",
26: 0001300, 0177777, 0, 0, "%xa\t0",
27: 0001300, 0177707, 0, 0, "%xa\t%a$j",
28: 0001400, 0177777, 0, 0, "%rt\t0",
29: 0001400, 0177707, 0, 0, "%rt\t%s$j",
30: 0001401, 0177777, 0, 0, "%ip\t1",
31: 0001402, 0177777, 0, 0, "%ip\t0",
32: 0001403, 0177777, 0, 0, "%cln\t0",
33: 0001413, 0177777, 0, 0, "%cln\t1",
34: 0001423, 0177777, 0, 0, "%cln\t2",
35: 0001433, 0177777, 0, 0, "%cln\t3",
36: 0001404, 0177777, 0, 0, "%pci\t0",
37: 0001404, 0177707, 0, 0, "%pci\t%s$j",
38: 0001405, 0177777, 0, 0, "cci",
39: 0001406, 0177777, 0, 0, "eci",
40: 0001407, 0177777, 0, 0, "dci",
41: 0002000, 0177777, 0, 0, "%vl\t1",
42: 0002000, 0177770, 0, 0, "%vl\t%a$k",
43: 0002100, 0177777, 0, 0, "efi",
44: 0002200, 0177777, 0, 0, "dfi",
45: 0002300, 0177777, 0, 0, "eri",
46: 0002400, 0177777, 0, 0, "dri",
47: 0002500, 0177777, 0, 0, "dbm",
48: 0002600, 0177777, 0, 0, "ebm",
49: 0002700, 0177777, 0, 0, "cmr",
50: 0003000, 0177777, 0, 0, "%vm\t0",
51: 0003000, 0177707, 0, 0, "%vm\t%s$j",
52: 0003400, 0177700, 0, 0, "%sm$j$k\t1,ts",
53: 0003600, 0177700, 0, 0, "%sm$j$k\t0",
54: 0003700, 0177700, 0, 0, "%sm$j$k\t1",
55: 0004000, 0177777, 0, 0, "ex",
56: 0005000, 0177700, 0, 0, "j\t%b$j$k",
57: 0006000, 0177000, 0, FBIG|FPAR, "j\t$X",
58: 0007000, 0177000, 0, FBIG|FPAR, "r\t$X",
59: 0010000, 0177000, 0, FBIG|FPAR, "jaz\t$X",
60: 0011000, 0177000, 0, FBIG|FPAR, "jan\t$X",
61: 0012000, 0177000, 0, FBIG|FPAR, "jap\t$X",
62: 0013000, 0177000, 0, FBIG|FPAR, "jam\t$X",
63: 0014000, 0177000, 0, FBIG|FPAR, "jsz\t$X",
64: 0015000, 0177000, 0, FBIG|FPAR, "jsn\t$X",
65: 0016000, 0177000, 0, FBIG|FPAR, "jsp\t$X",
66: 0017000, 0177000, 0, FBIG|FPAR, "jsm\t$X",
67: 0020000, 0177000, 0, FBIG|FWRD, "%a$i\t$x",
68: 0021000, 0177000, 0, FBIG|FWRD, "%a$i\t~$x",
69: 0022000, 0177000, 0, FWRD, "%a$i\t$y",
70: 0023000, 0177077, 0, 0, "%a$i\t0",
71: 0023000, 0177007, 0, 0, "%a$i\t%s$j",
72: 0023001, 0177077, 0, 0, "%a$i\tvl",
73: 0024000, 0177000, 0, 0, "%a$i\t%b$j$k",
74: 0025000, 0177000, 0, 0, "%b$j$k\t%a$i",
75: 0026000, 0177007, 0, 0, "%a$i\t%ps$j",
76: 0026001, 0177007, 0, 0, "%a$i\t%qs$j",
77: 0026007, 0177007, 0, 0, "%a$i\t%sb$j",
78: 0027000, 0177007, 0, 0, "%a$i\t%zs$j",
79: 0027007, 0177007, 0, 0, "%zs$j\t%a$i",
80: 0030000, 0177070, 07, 0, "%a$i\t%a$k",
81: 0030000, 0177007, 070, 0, "%a$i\t%a$j+1",
82: 0030000, 0177000, 0, 0, "%a$i\t%a$j+%a$k",
83: 0031000, 0177077, 0, 0, "%a$i\t-1",
84: 0031000, 0177070, 07, 0, "%a$i\t-%a$k",
85: 0031000, 0177007, 070, 0, "%a$i\t%a$j-1",
86: 0031000, 0177000, 0, 0, "%a$i\t%a$j-%a$k",
87: 0032000, 0177070, 07, 0, "%a$i\t0*%a$k",
88: 0032000, 0177007, 070, 0, "%a$i\t%a$j*1",
89: 0032000, 0177000, 0, 0, "%a$i\t%a$j*%a$k",
90: 0033000, 0177077, 0, 0, "%a$i\t%ci",
91: 0033000, 0177007, 0, 0, "%a$i\t%ca,%a$j",
92: 0033001, 0177007, 0, 0, "%a$i\t%ce,%a$j",
93: 0034000, 0177000, 0, 0, "%b$j$k,%a$i\t,%a0",
94: 0035000, 0177000, 0, 0, ",%a0\t%b$j$k,%a$i",
95: 0036000, 0177000, 0, 0, "%t$j$k,%a$i\t,%a0",
96: 0037000, 0177000, 0, 0, ",%a0\t%t$j$k,%a$i",
97: 0040000, 0177000, 0, FBIG, "%s$i\t$x",
98: 0041000, 0177000, 0, FBIG, "%s$i\t~$x",
99: 0042000, 0177077, 0, 0, "%s$i\t-1",
100: 0042077, 0177077, 0, 0, "%s$i\t1",
101: 0042000, 0177000, 0, 0, "%s$i\t<$x",
102: 0043000, 0177077, 0, 0, "%s$i\t0",
103: 0043000, 0177000, 0, 0, "%s$i\t>$x",
104: 0044000, 0177007, 0, 0, "%s$i\t%s$j&%sb",
105: 0044000, 0177000, 0, 0, "%s$i\t%s$j&%s$k",
106: 0045000, 0177007, 0, 0, "%s$i\t%s$j&~%sb",
107: 0045000, 0177000, 0, 0, "%s$i\t%s$j&~%s$k",
108: 0046000, 0177007, 0, 0, "%s$i\t%s$j^%sb",
109: 0046000, 0177000, 0, 0, "%s$i\t%s$j^%s$k",
110: 0047000, 0177007, 0, 0, "%s$i\t%s$j^~%sb",
111: 0047000, 0177000, 0, 0, "%s$i\t%s$j^~%s$k",
112: 0050000, 0177007, 0, 0, "%s$i\t%s$j!%s$i&%sb",
113: 0050000, 0177000, 0, 0, "%s$i\t%s$j!%s$i&%s$k",
114: 0051000, 0177077, 0, 0, "%s$i\t%sb",
115: 0051000, 0177007, 070, 0, "%s$i\t%s$j|%sb",
116: 0051000, 0177070, 07, 0, "%s$i\t%s$k|0",
117: 0051000, 0177000, 0, 0, "%s$i\t%s$j|%s$k",
118: 0052000, 0177000, 0, 0, "%s0\t%s$i<<$y",
119: 0053000, 0177000, 0, 0, "%s0\t%s$i>>$z",
120: 0054000, 0177000, 0, 0, "%s$i\t%s$i<<$y",
121: 0055000, 0177000, 0, 0, "%s$i\t%s$i>>$z",
122: 0056000, 0177007, 070, 0, "%s$i\t%s$i,$s$j<<1",
123: 0056000, 0177070, 07, 0, "%s$i\t%s$i<<%a$k",
124: 0056000, 0177000, 0, 0, "%s$i\t%s$i,%s$j<<%a$k",
125: 0057000, 0177007, 070, 0, "%s$i\t%s$i,$s$j>>1",
126: 0057000, 0177070, 07, 0, "%s$i\t%s$i>>%a$k",
127: 0057000, 0177000, 0, 0, "%s$i\t%s$i,%s$j>>%a$k",
128: 0060000, 0177070, 07, 0, "%s$i\t0+%s$k",
129: 0060000, 0177007, 070, 0, "%s$i\t%s$j^%sb",
130: 0060000, 0177000, 0, 0, "%s$i\t%s$j+%s$k",
131: 0061000, 0177070, 0, 0, "%s$i\t-%s$k",
132: 0061000, 0177000, 0, 0, "%s$i\t%s$j-%s$k",
133: 0062000, 0177070, 0, 0, "%s$i\t+%fs$k",
134: 0062000, 0177000, 0, 0, "%s$i\t%s$j+%fs$k",
135: 0063000, 0177070, 0, 0, "%s$i\t-%fs$k",
136: 0063000, 0177000, 0, 0, "%s$i\t%s$j-%fs$k",
137: 0064000, 0177000, 0, 0, "%s$i\t%s$j*%fs$k",
138: 0065000, 0177000, 0, 0, "%s$i\t%s$j*%hs$k",
139: 0066000, 0177000, 0, 0, "%s$i\t%s$j*%rs$k",
140: 0067000, 0177000, 0, 0, "%s$i\t%s$j*%is$k",
141: 0070000, 0177007, 0, 0, "%s$i\t/%hs$j",
142: 0071000, 0177070, 0, 0, "%s$i\t%a$k",
143: 0071010, 0177070, 0, 0, "%s$i\t+%a$k",
144: 0071020, 0177070, 0, 0, "%s$i\t+%fa%k",
145: 0071030, 0177077, 0, 0, "%s$i\t0.75*2**48",
146: 0071040, 0177077, 0, 0, "%s$i\t0.5",
147: 0071050, 0177077, 0, 0, "%s$i\t1.0",
148: 0071060, 0177077, 0, 0, "%s$i\t2.0",
149: 0071070, 0177077, 0, 0, "%s$i\t4.0",
150: 0072000, 0177077, 0, 0, "%s$i\t%rt",
151: 0072002, 0177077, 0, 0, "%s$i\t%sm",
152: 0072003, 0177007, 0, 0, "%s$i\t%st$j",
153: 0073000, 0177077, 0, 0, "%s$i\t%vm",
154: 0073001, 0177007, 0, 0, "%s$i\t%sr$j",
155: 0073002, 0177077, 0, 0, "%sm\t%s$i",
156: 0073003, 0177007, 0, 0, "%st$j\t%s$i",
157: 0074000, 0177000, 0, 0, "%s$i\t%t$j$k",
158: 0075000, 0177000, 0, 0, "%t$j$k\t%s$i",
159: 0076000, 0177000, 0, 0, "%s$i\t%v$j,%a$k",
160: 0077000, 0177077, 0, 0, "%v$i,1\t0",
161: 0077000, 0177070, 07, 0, "%v$i,%a$k\t0",
162: 0077000, 0177007, 070, 0, "%v$i,1\t%s$j",
163: 0077000, 0177000, 0, 0, "%v$i,%a$k\t%s$j",
164: 0100000, 0177000, 0, FBIG|FWRD, "%a$i\t$x,0",
165: 0100000, 0170000, 0, FBIG|FWRD, "%a$i\t$x,%a$h",
166: 0110000, 0177000, 0, FBIG|FWRD, "$x,0\t%a$i",
167: 0110000, 0170000, 0, FBIG|FWRD, "$x,%a$h\t%a$i",
168: 0120000, 0177000, 0, FBIG|FWRD, "%s$i\t$x,0",
169: 0120000, 0170000, 0, FBIG|FWRD, "%s$i\t$x,%a$h",
170: 0130000, 0177000, 0, FBIG|FWRD, "$x,0\t%s$i",
171: 0130000, 0170000, 0, FBIG|FWRD, "$x,%a$h\t%s$i",
172: 0140000, 0177000, 0, 0, "%v$i\t%s$j&%v$k",
173: 0141000, 0177000, 0, 0, "%v$i\t%v$j&%v$k",
174: 0142000, 0177070, 0, 0, "%v$i\t%v$k",
175: 0142000, 0177000, 0, 0, "%v$i\t%s$j|%v$k",
176: 0143000, 0177000, 0, 0, "%v$i\t%v$j|%v$k",
177: 0144000, 0177000, 0, 0, "%v$i\t%s$j^%v$k",
178: 0145000, 0177000, 0, 0, "%v$i\t%v$j^%v$k",
179: 0146000, 0177070, 0, 0, "%v$i\t#%vm&%v$k",
180: 0146000, 0177000, 0, 0, "%v$i\t%s$j!%v$k&%vm",
181: 0147000, 0177000, 0, 0, "%v$i\t%v$j!%v$k&%vm",
182: 0150000, 0177007, 0, 0, "%v$i\t%v$j<<1",
183: 0150000, 0177000, 0, 0, "%v$i\t%v$j<<%a$k",
184: 0151000, 0177007, 0, 0, "%v$i\t%v$j>>1",
185: 0151000, 0177000, 0, 0, "%v$i\t%v$j>>%a$k",
186: 0152000, 0177007, 0, 0, "%v$i\t%v$j,%v$j<<1",
187: 0152000, 0177000, 0, 0, "%v$i\t%v$j,%v$j<<%a$k",
188: 0153000, 0177007, 0, 0, "%v$i\t%v$j,%v$j>>1",
189: 0153000, 0177000, 0, 0, "%v$i\t%v$j,%v$j>>%a$k",
190: 0154000, 0177000, 0, 0, "%v$i\t%s$j+%v$k",
191: 0155000, 0177000, 0, 0, "%v$i\t%v$j+%v$k",
192: 0156000, 0177070, 0, 0, "%v$i\t-%v$k",
193: 0156000, 0177000, 0, 0, "%v$i\t%s$j-%v$k",
194: 0157000, 0177000, 0, 0, "%v$i\t%v$j-%v$k",
195: 0160000, 0177000, 0, 0, "%v$i\t%s$j*%fv$k",
196: 0161000, 0177000, 0, 0, "%v$i\t%v$j*%fv$k",
197: 0162000, 0177000, 0, 0, "%v$i\t%s$j*%hv$k",
198: 0163000, 0177000, 0, 0, "%v$i\t%v$j*%hv$k",
199: 0164000, 0177000, 0, 0, "%v$i\t%s$j*%rv$k",
200: 0165000, 0177000, 0, 0, "%v$i\t%v$j*%rv$k",
201: 0166000, 0177000, 0, 0, "%v$i\t%s$j*%iv$k",
202: 0167000, 0177000, 0, 0, "%v$i\t%v$j*%iv$k",
203: 0170000, 0177070, 0, 0, "%v$i\t+%fv$k",
204: 0170000, 0177000, 0, 0, "%v$i\t%s$j+%fv$k",
205: 0171000, 0177000, 0, 0, "%v$i\t%v$j+%fv$k",
206: 0172000, 0177070, 0, 0, "%v$i\t-%fv$k",
207: 0172000, 0177000, 0, 0, "%v$i\t%s$j-%fv$k",
208: 0173000, 0177000, 0, 0, "%v$i\t%v$j-%fv$k",
209: 0174000, 0177007, 0, 0, "%v$i\t/%hv$j",
210: 0174001, 0177007, 0, 0, "%v$i\t/%pv$j",
211: 0174002, 0177007, 0, 0, "%v$i\t/%qv$j",
212: 0175000, 0177707, 0, 0, "%vm\t%v$j,z",
213: 0175001, 0177707, 0, 0, "%vm\t%v$j,n",
214: 0175002, 0177707, 0, 0, "%vm\t%v$j,p",
215: 0175003, 0177707, 0, 0, "%vm\t%v$j,m",
216: 0176000, 0177077, 0, 0, "%v$i\t,%a0,1",
217: 0176000, 0177070, 0, 0, "%v$i\t,%a0,%a$k",
218: 0177000, 0177707, 0, 0, ",%a0,1\t%v$j",
219: 0177000, 0177700, 0, 0, ",%a0,%a$k\t%v$j",
220: 0, 0, 0, 0, 0, 0, NULL
221: };
222:
223: printins(isp)
224: int isp;
225: {
226: register WORD ins;
227: register struct optab *op;
228: register char *p;
229: int oh, oi, oj, ok, om;
230: WORD val, xval;
231: static char oct[] = "01234567";
232:
233: ins = stow(sget(dot, isp));
234: ins &= 0177777; /* hack */
235: for (op = optab; op->name; op++) {
236: if ((ins & op->mask) != op->op)
237: continue;
238: if (op->mbnz == 0
239: || (ins & op->mbnz) != 0)
240: break;
241: }
242: dotinc = 2;
243: if (op->name == NULL) {
244: printf("gok\t%R", ins);
245: return;
246: }
247: om = 0;
248: if (op->flag & FBIG) {
249: dotinc += 2;
250: om = stow(sget(dot+2, isp)) & 0177777;
251: }
252: oh = (ins >> 9) & 07;
253: oi = (ins >> 6) & 07;
254: oj = (ins >> 3) & 07;
255: ok = ins & 07;
256: for (p = op->name; *p; p++) {
257: if (*p != '$') {
258: printc(*p);
259: continue;
260: }
261: switch (*++p) {
262: case 0:
263: --p;
264: break;
265:
266: case 'h':
267: printc(oct[oh]);
268: break;
269:
270: case 'i':
271: printc(oct[oi]);
272: break;
273:
274: case 'j':
275: printc(oct[oj]);
276: break;
277:
278: case 'k':
279: printc(oct[ok]);
280: break;
281:
282: case 'y': /* jk */
283: val = ok|(oj<<3);
284: if (op->flag & FPAR) {
285: printf("p.");
286: val *= 2;
287: }
288: if (op->flag & FWRD) {
289: printf("w.");
290: val *= 8;
291: }
292: psymoff(val, (op->flag & FPAR) ? INSTSP : DATASP, "");
293: break;
294:
295: case 'z': /* jk, special case for >> */
296: val = 0100 - (ok|(oj<<3));
297: psymoff(val, DATASP, "");
298: break;
299:
300: case 'x': /* jkm */
301: val = om|(ok<<16)|(oj<<19);
302: if (op->flag & FPAR) {
303: printf("p.");
304: val *= 2;
305: }
306: if (op->flag & FWRD) {
307: printf("w.");
308: val *= 8;
309: }
310: psymoff(val, (op->flag & FPAR) ? INSTSP : DATASP, "");
311: break;
312:
313: case 'X': /* ijkm */
314: val = om|(ok<<16)|(oj<<19)|(oi<<22);
315: if (op->flag & FPAR) {
316: printf("p.");
317: val *= 2;
318: }
319: if (op->flag & FWRD) {
320: printf("w.");
321: val *= 8;
322: }
323: psymoff(val, (op->flag & FPAR) ? INSTSP : DATASP, "");
324: break;
325: }
326: }
327: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.