|
|
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: long int opc;
53: int i;
54:
55: char patbits[16];
56: char opcstr[256];
57: int bitpos[16];
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 's': currbit = bits; break;
81: case 'S': currbit = bitS; break;
82: case 'd': currbit = bitd; break;
83: case 'D': currbit = bitD; break;
84: case 'r': currbit = bitr; break;
85: case 'R': currbit = bitR; break;
86: case 'z': currbit = bitz; break;
87: default: abort();
88: }
89: if (!(bitmask & 1)) {
90: bitpos[n_variable] = currbit;
91: n_variable++;
92: }
93:
94: if (nextch == '0' || nextch == '1')
95: bitmask |= 1;
96: if (nextch == '1')
97: bitpattern |= 1;
98: patbits[i] = nextch;
99: getnextch();
100: }
101: while (isspace(nextch) || nextch == ':')
102: getnextch();
103: switch (nextch) {
104: case '0': cpulevel = 0; break;
105: case '1': cpulevel = 1; break;
106: case '2': cpulevel = 2; break;
107: default: abort();
108: }
109: getnextch();
110:
111: switch (nextch) {
112: case '0': plevel = 0; break;
113: case '1': plevel = 1; break;
114: case '2': plevel = 2; break;
115: case '3': plevel = 3; break;
116: default: abort();
117: }
118: getnextch();
119:
120: while (isspace(nextch))
121: getnextch();
122:
123: if (nextch != ':')
124: abort();
125: fgets(opcstr, 250, tablef);
126: getnextch();
127: if (cpulevel <= CPU_LEVEL) {
128: int j;
129: /* Remove superfluous spaces from the string */
130: char *opstrp = opcstr, *osendp;
131: int slen = 0;
132:
133: while (isspace(*opstrp))
134: opstrp++;
135:
136: osendp = opstrp;
137: while (*osendp) {
138: if (!isspace (*osendp))
139: slen = osendp - opstrp + 1;
140: osendp++;
141: }
142: opstrp[slen] = 0;
143:
144: if (no_insns > 0)
145: printf(",\n");
146: no_insns++;
147: printf("{ %d, %d, {", bitpattern, n_variable);
148: for (j = 0; j < 16; j++) {
149: printf("%d", bitpos[j]);
150: if (j < 15)
151: printf(",");
152: }
153: printf ("}, %d, %d, \"%s\"}", bitmask, plevel, opstrp);
154: }
155: }
156: printf("};\nint n_defs68k = %d;\n", no_insns);
157: fclose(tablef);
158: return 0;
159: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.