|
|
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 <assert.h>
13: #include <ctype.h>
14:
15: #include "config.h"
16: #include "options.h"
17: #include "readcpu.h"
18:
19: static FILE *tablef;
20: static int nextch = 0;
21:
22: static void getnextch(void)
23: {
24: do {
25: nextch = fgetc(tablef);
26: if (nextch == '%') {
27: do {
28: nextch = fgetc(tablef);
29: } while (nextch != EOF && nextch != '\n');
30: }
31: } while (nextch != EOF && isspace(nextch));
32: }
33:
34: int main(int argc, char **argv)
35: {
36: int no_insns = 0;
37:
38: printf ("#include \"sysconfig.h\"\n");
39: printf ("#include \"sysdeps.h\"\n");
40: printf ("#include \"config.h\"\n");
41: printf ("#include \"options.h\"\n");
42: printf ("#include \"readcpu.h\"\n");
43: printf ("struct instr_def defs68k[] = {\n");
44: tablef = fopen("table68k","r");
45: if (tablef == NULL) {
46: fprintf(stderr, "table68k not found\n");
47: exit(1);
48: }
49: getnextch();
50: while (nextch != EOF) {
51: int cpulevel, plevel;
52: int i;
53:
54: char patbits[16];
55: char opcstr[256];
56: int bitpos[16];
57: int flagset[5], flaguse[5];
58:
59: UWORD bitmask,bitpattern;
60: int n_variable;
61:
62: n_variable = 0;
63: bitmask = bitpattern = 0;
64: memset (bitpos, 0, sizeof(bitpos));
65: for(i=0; i<16; i++) {
66: int currbit;
67: bitmask <<= 1;
68: bitpattern <<= 1;
69:
70: switch (nextch) {
71: case '0': currbit = bit0; bitmask |= 1; break;
72: case '1': currbit = bit1; bitmask |= 1; bitpattern |= 1; break;
73: case 'c': currbit = bitc; break;
74: case 'C': currbit = bitC; break;
75: case 'f': currbit = bitf; break;
76: case 'i': currbit = biti; break;
77: case 'I': currbit = bitI; break;
78: case 'j': currbit = bitj; break;
79: case 'J': currbit = bitJ; break;
80: case 'k': currbit = bitk; break;
81: case 'K': currbit = bitK; break;
82: case 's': currbit = bits; break;
83: case 'S': currbit = bitS; break;
84: case 'd': currbit = bitd; break;
85: case 'D': currbit = bitD; break;
86: case 'r': currbit = bitr; break;
87: case 'R': currbit = bitR; break;
88: case 'z': currbit = bitz; break;
89: default: abort();
90: }
91: if (!(bitmask & 1)) {
92: bitpos[n_variable] = currbit;
93: n_variable++;
94: }
95:
96: if (nextch == '0' || nextch == '1')
97: bitmask |= 1;
98: if (nextch == '1')
99: bitpattern |= 1;
100: patbits[i] = nextch;
101: getnextch();
102: }
103:
104: while (isspace(nextch) || nextch == ':') /* Get CPU and privilege level */
105: getnextch();
106:
107: switch (nextch) {
108: case '0': cpulevel = 0; break;
109: case '1': cpulevel = 1; break;
110: case '2': cpulevel = 2; break;
111: default: abort();
112: }
113: getnextch();
114:
115: switch (nextch) {
116: case '0': plevel = 0; break;
117: case '1': plevel = 1; break;
118: case '2': plevel = 2; break;
119: case '3': plevel = 3; break;
120: default: abort();
121: }
122: getnextch();
123:
124: while (isspace(nextch)) /* Get flag set information */
125: getnextch();
126:
127: if (nextch != ':')
128: abort();
129:
130: for(i = 0; i < 5; i++) {
131: getnextch();
132: switch(nextch){
133: case '-': flagset[i] = fa_unset; break;
134: case '/': flagset[i] = fa_isjmp; break;
135: case '0': flagset[i] = fa_zero; break;
136: case '1': flagset[i] = fa_one; break;
137: case 'x': flagset[i] = fa_dontcare; break;
138: case '?': flagset[i] = fa_unknown; break;
139: default: flagset[i] = fa_set; break;
140: }
141: }
142:
143: getnextch();
144: while (isspace(nextch))
145: getnextch();
146:
147: if (nextch != ':') /* Get flag used information */
148: abort();
149:
150: for(i = 0; i < 5; i++) {
151: getnextch();
152: switch(nextch){
153: case '-': flaguse[i] = fu_unused; break;
154: case '/': flaguse[i] = fu_isjmp; break;
155: case '+': flaguse[i] = fu_maybecc; break;
156: case '?': flaguse[i] = fu_unknown; break;
157: default: flaguse[i] = fu_used; break;
158: }
159: }
160:
161: getnextch();
162: while (isspace(nextch))
163: getnextch();
164:
165: if (nextch != ':')
166: abort();
167:
168: fgets(opcstr, 250, tablef);
169: getnextch();
170: if (cpulevel <= CPU_LEVEL) {
171: int j;
172: /* Remove superfluous spaces from the string */
173: char *opstrp = opcstr, *osendp;
174: int slen = 0;
175:
176: while (isspace(*opstrp))
177: opstrp++;
178:
179: osendp = opstrp;
180: while (*osendp) {
181: if (!isspace (*osendp))
182: slen = osendp - opstrp + 1;
183: osendp++;
184: }
185: opstrp[slen] = 0;
186:
187: if (no_insns > 0)
188: printf(",\n");
189: no_insns++;
190: printf("{ %d, %d, {", bitpattern, n_variable);
191: for (j = 0; j < 16; j++) {
192: printf("%d", bitpos[j]);
193: if (j < 15)
194: printf(",");
195: }
196: printf ("}, %d, %d, { ", bitmask, plevel);
197: for(i = 0; i < 5; i++) {
198: printf("{ %d, %d }%c ", flaguse[i], flagset[i], i == 4 ? ' ' : ',');
199: }
200: printf("}, \"%s\"}", opstrp);
201: }
202: }
203: printf("};\nint n_defs68k = %d;\n", no_insns);
204: fclose(tablef);
205: return 0;
206: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.