|
|
1.1 root 1: /*
2: * UAE - The Un*x Amiga Emulator
3: *
4: * Read 68000 CPU specs from file "table68k" and build table68k.c
5: *
6: * Copyright 1995,1996 Bernd Schmidt
7: */
8:
9: #include "sysconfig.h"
10: #include "sysdeps.h"
11:
12: #include <stdlib.h>
13: #include <string.h>
14: #include <assert.h>
15: #include <ctype.h>
16:
17: #define TCHAR char
18: #define strnicmp strncasecmp
19:
20: #include "readcpu.h"
21:
22: static FILE *tablef;
23: static int nextch = 0;
24:
25: static void getnextch(void)
26: {
27: do {
28: nextch = fgetc(tablef);
29: if (nextch == '%') {
30: do {
31: nextch = fgetc(tablef);
32: } while (nextch != EOF && nextch != '\n');
33: }
34: } while (nextch != EOF && isspace(nextch));
35: }
36:
37: static int nextchtohex(void)
38: {
39: switch (isupper (nextch) ? tolower (nextch) : nextch) {
40: case '0': return 0;
41: case '1': return 1;
42: case '2': return 2;
43: case '3': return 3;
44: case '4': return 4;
45: case '5': return 5;
46: case '6': return 6;
47: case '7': return 7;
48: case '8': return 8;
49: case '9': return 9;
50: case 'a': return 10;
51: case 'b': return 11;
52: case 'c': return 12;
53: case 'd': return 13;
54: case 'e': return 14;
55: case 'f': return 15;
56: default: abort();
57: }
58: }
59:
60: int main(int argc, char **argv)
61: {
62: int no_insns = 0;
63:
64: printf ("#include \"sysconfig.h\"\n");
65: printf ("#include \"sysdeps.h\"\n");
66: printf ("#include \"readcpu.h\"\n");
67: printf ("struct instr_def defs68k[] = {\n");
68: #if 0
69: tablef = fopen("table68k","r");
70: if (tablef == NULL) {
71: fprintf(stderr, "table68k not found\n");
72: exit(1);
73: }
74: #else
75: tablef = stdin;
76: #endif
77: getnextch();
78: while (nextch != EOF) {
79: int cpulevel, uncpulevel, plevel, sduse;
80: int i;
81:
82: char opcstr[256];
83: int bitpos[16];
84: int flagset[5], flaguse[5];
85:
86: unsigned int bitmask,bitpattern;
87: int n_variable;
88:
89: int head = 0, tail = 0, clocks = 0, fetchmode = 0;
90:
91: n_variable = 0;
92: bitmask = bitpattern = 0;
93: memset (bitpos, 0, sizeof(bitpos));
94: for(i=0; i<16; i++) {
95: int currbit;
96: bitmask <<= 1;
97: bitpattern <<= 1;
98:
99: switch (nextch) {
100: case '0': currbit = bit0; bitmask |= 1; break;
101: case '1': currbit = bit1; bitmask |= 1; bitpattern |= 1; break;
102: case 'c': currbit = bitc; break;
103: case 'C': currbit = bitC; break;
104: case 'f': currbit = bitf; break;
105: case 'i': currbit = biti; break;
106: case 'I': currbit = bitI; break;
107: case 'j': currbit = bitj; break;
108: case 'J': currbit = bitJ; break;
109: case 'k': currbit = bitk; break;
110: case 'K': currbit = bitK; break;
111: case 's': currbit = bits; break;
112: case 'S': currbit = bitS; break;
113: case 'd': currbit = bitd; break;
114: case 'D': currbit = bitD; break;
115: case 'r': currbit = bitr; break;
116: case 'R': currbit = bitR; break;
117: case 'z': currbit = bitz; break;
118: case 'p': currbit = bitp; break;
119: default: abort();
120: }
121: if (!(bitmask & 1)) {
122: bitpos[n_variable] = currbit;
123: n_variable++;
124: }
125:
126: if (nextch == '0' || nextch == '1')
127: bitmask |= 1;
128: if (nextch == '1')
129: bitpattern |= 1;
130: getnextch();
131: }
132:
133: while (isspace(nextch) || nextch == ':') /* Get CPU level, unimplemented level, and privilege level */
134: getnextch();
135:
136: switch (nextch) {
137: case '0': cpulevel = 0; break;
138: case '1': cpulevel = 1; break;
139: case '2': cpulevel = 2; break;
140: case '3': cpulevel = 3; break;
141: case '4': cpulevel = 4; break;
142: case '5': cpulevel = 5; break;
143: case '6': cpulevel = 6; break;
144: case '7': cpulevel = 7; break;
145: default: abort();
146: }
147: getnextch();
148:
149: switch (nextch) {
150: case '0': uncpulevel = 0; break;
151: case '1': uncpulevel = 1; break;
152: case '2': uncpulevel = 2; break;
153: case '3': uncpulevel = 3; break;
154: case '4': uncpulevel = 4; break;
155: case '5': uncpulevel = 5; break;
156: case '6': uncpulevel = 6; break;
157: case '7': uncpulevel = 7; break;
158: default: abort();
159: }
160: getnextch();
161:
162: switch (nextch) {
163: case '0': plevel = 0; break;
164: case '1': plevel = 1; break;
165: case '2': plevel = 2; break;
166: case '3': plevel = 3; break;
167: default: abort();
168: }
169: getnextch();
170:
171: while (isspace(nextch)) /* Get flag set information */
172: getnextch();
173:
174: if (nextch != ':')
175: abort();
176:
177: for(i = 0; i < 5; i++) {
178: getnextch();
179: switch(nextch){
180: case '-': flagset[i] = fa_unset; break;
181: case '/': flagset[i] = fa_isjmp; break;
182: case '+': flagset[i] = fa_isbranch; break;
183: case '0': flagset[i] = fa_zero; break;
184: case '1': flagset[i] = fa_one; break;
185: case 'x': flagset[i] = fa_dontcare; break;
186: case '?': flagset[i] = fa_unknown; break;
187: default: flagset[i] = fa_set; break;
188: }
189: }
190:
191: getnextch();
192: while (isspace(nextch))
193: getnextch();
194:
195: if (nextch != ':') /* Get flag used information */
196: abort();
197:
198: for(i = 0; i < 5; i++) {
199: getnextch();
200: switch(nextch){
201: case '-': flaguse[i] = fu_unused; break;
202: case '/': flaguse[i] = fu_isjmp; break;
203: case '+': flaguse[i] = fu_maybecc; break;
204: case '?': flaguse[i] = fu_unknown; break;
205: default: flaguse[i] = fu_used; break;
206: }
207: }
208:
209: getnextch();
210: while (isspace(nextch))
211: getnextch();
212:
213: if (nextch != ':') /* Get source/dest usage information */
214: abort();
215:
216: getnextch();
217: sduse = nextchtohex() << 4;
218: getnextch();
219: sduse |= nextchtohex();
220:
221: getnextch();
222: while (isspace(nextch))
223: getnextch();
224:
225: if (nextch != ':')
226: abort();
227:
228: if (fgets(opcstr, 250, tablef) != opcstr) {
229: abort();
230: }
231: getnextch();
232:
233: if (nextch == '-') {
234: int neg;
235: char fm[20];
236: getnextch();
237: while (isspace(nextch))
238: getnextch();
239: neg = 1;
240: if (nextch == '-') {
241: neg = -1;
242: getnextch();
243: }
244: for (;;) {
245: if (nextch < '0' || nextch > '9')
246: break;
247: head *= 10;
248: head += nextch - '0';
249: nextch = fgetc (tablef);
250: }
251: head *= neg;
252: while (isspace(nextch))
253: getnextch();
254: for (;;) {
255: if (nextch < '0' || nextch > '9')
256: break;
257: tail *= 10;
258: tail += nextch - '0';
259: nextch = fgetc (tablef);
260: }
261: while (isspace(nextch))
262: getnextch();
263: for (;;) {
264: if (nextch < '0' || nextch > '9')
265: break;
266: clocks *= 10;
267: clocks += nextch - '0';
268: nextch = fgetc (tablef);
269: }
270: if (nextch == ' ') {
271: if (fgets(fm, sizeof fm, tablef) != fm) {
272: abort();
273: }
274: if (!strnicmp(fm, "fea", 3))
275: fetchmode = 1;
276: if (!strnicmp(fm, "cea", 3))
277: fetchmode = 2;
278: if (!strnicmp(fm, "fiea", 4))
279: fetchmode = 3;
280: if (!strnicmp(fm, "ciea", 4))
281: fetchmode = 4;
282: if (!strnicmp(fm, "jea", 3))
283: fetchmode = 5;
284: }
285: getnextch();
286: }
287:
288: int j;
289: /* Remove superfluous spaces from the string */
290: char *opstrp = opcstr, *osendp;
291: char tmp[100], *p;
292: int slen = 0;
293:
294: while (isspace(*opstrp))
295: opstrp++;
296:
297: osendp = opstrp;
298: while (*osendp) {
299: if (!isspace (*osendp))
300: slen = osendp - opstrp + 1;
301: osendp++;
302: }
303: opstrp[slen] = 0;
304:
305: if (no_insns > 0)
306: printf(",\n");
307: no_insns++;
308: strcpy (tmp, opstrp);
309: strcat (tmp, " ");
310: p = tmp;
311: while (!isspace(*p++));
312: *p = 0;
313: printf("/* %s */\n", tmp);
314: printf("{0x%04X,%2d,{", bitpattern, n_variable);
315: for (j = 0; j < 16; j++) {
316: printf("%2d", bitpos[j]);
317: if (j < 15)
318: printf(",");
319: }
320: printf ("},0x%04X,%d,%d,%d,{", bitmask, cpulevel, uncpulevel, plevel);
321: for(i = 0; i < 5; i++) {
322: printf("{%d,%d}%s", flaguse[i], flagset[i], i == 4 ? "" : ",");
323: }
324: printf("},0x%02x,_T(\"%s\"),%2d,%2d,%2d,%2d}", sduse, opstrp, head, tail, clocks, fetchmode);
325: }
326: printf("};\nint n_defs68k = %d;\n", no_insns);
327: return 0;
328: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.