|
|
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;
1.1.1.2 ! root 111: case '3': cpulevel = 3; break;
! 112: case '4': cpulevel = 4; break;
1.1 root 113: default: abort();
114: }
115: getnextch();
116:
117: switch (nextch) {
118: case '0': plevel = 0; break;
119: case '1': plevel = 1; break;
120: case '2': plevel = 2; break;
121: case '3': plevel = 3; break;
122: default: abort();
123: }
124: getnextch();
125:
126: while (isspace(nextch)) /* Get flag set information */
127: getnextch();
128:
129: if (nextch != ':')
130: abort();
131:
132: for(i = 0; i < 5; i++) {
133: getnextch();
134: switch(nextch){
135: case '-': flagset[i] = fa_unset; break;
136: case '/': flagset[i] = fa_isjmp; break;
137: case '0': flagset[i] = fa_zero; break;
138: case '1': flagset[i] = fa_one; break;
139: case 'x': flagset[i] = fa_dontcare; break;
140: case '?': flagset[i] = fa_unknown; break;
141: default: flagset[i] = fa_set; break;
142: }
143: }
144:
145: getnextch();
146: while (isspace(nextch))
147: getnextch();
148:
149: if (nextch != ':') /* Get flag used information */
150: abort();
151:
152: for(i = 0; i < 5; i++) {
153: getnextch();
154: switch(nextch){
155: case '-': flaguse[i] = fu_unused; break;
156: case '/': flaguse[i] = fu_isjmp; break;
157: case '+': flaguse[i] = fu_maybecc; break;
158: case '?': flaguse[i] = fu_unknown; break;
159: default: flaguse[i] = fu_used; break;
160: }
161: }
162:
163: getnextch();
164: while (isspace(nextch))
165: getnextch();
166:
167: if (nextch != ':')
168: abort();
169:
170: fgets(opcstr, 250, tablef);
171: getnextch();
172: if (cpulevel <= CPU_LEVEL) {
173: int j;
174: /* Remove superfluous spaces from the string */
175: char *opstrp = opcstr, *osendp;
176: int slen = 0;
177:
178: while (isspace(*opstrp))
179: opstrp++;
180:
181: osendp = opstrp;
182: while (*osendp) {
183: if (!isspace (*osendp))
184: slen = osendp - opstrp + 1;
185: osendp++;
186: }
187: opstrp[slen] = 0;
188:
189: if (no_insns > 0)
190: printf(",\n");
191: no_insns++;
192: printf("{ %d, %d, {", bitpattern, n_variable);
193: for (j = 0; j < 16; j++) {
194: printf("%d", bitpos[j]);
195: if (j < 15)
196: printf(",");
197: }
198: printf ("}, %d, %d, { ", bitmask, plevel);
199: for(i = 0; i < 5; i++) {
200: printf("{ %d, %d }%c ", flaguse[i], flagset[i], i == 4 ? ' ' : ',');
201: }
202: printf("}, \"%s\"}", opstrp);
203: }
204: }
205: printf("};\nint n_defs68k = %d;\n", no_insns);
206: fclose(tablef);
207: return 0;
208: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.