|
|
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 <stdlib.h> ! 13: #include <string.h> ! 14: #include <assert.h> ! 15: #include <ctype.h> ! 16: ! 17: #define TCHAR char ! 18: #define strnicmp strncasecmp ! 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) { ! 79: int cpulevel, uncpulevel, plevel, sduse; ! 80: int i; ! 81: ! 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; ! 293: ! 294: while (isspace(*opstrp)) ! 295: opstrp++; ! 296: ! 297: osendp = opstrp; ! 298: while (*osendp) { ! 299: if (!isspace (*osendp)) ! 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); ! 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.