|
|
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:
1.1.1.3 ! root 9: #include "sysconfig.h"
! 10: #include "sysdeps.h"
! 11:
1.1 root 12: #include <stdlib.h>
13: //#include <tchar.h>
14: #include <string.h>
15: #include <assert.h>
16: #include <ctype.h>
17:
18: #define TCHAR char
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) {
1.1.1.3 ! root 79: int cpulevel, uncpulevel, plevel, sduse;
! 80: int i;
1.1 root 81:
1.1.1.3 ! root 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;
1.1 root 293:
1.1.1.3 ! root 294: while (isspace(*opstrp))
1.1 root 295: opstrp++;
296:
1.1.1.3 ! root 297: osendp = opstrp;
! 298: while (*osendp) {
1.1 root 299: if (!isspace (*osendp))
1.1.1.3 ! 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("},0x%02x,_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.