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