|
|
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 ! 16: ! 17: #include "sysconfig.h" ! 18: #include "sysdeps.h" ! 19: ! 20: ! 21: #include "readcpu.h" ! 22: ! 23: static FILE *tablef; ! 24: static int nextch = 0; ! 25: ! 26: static void getnextch(void) ! 27: { ! 28: do { ! 29: nextch = fgetc(tablef); ! 30: if (nextch == '%') { ! 31: do { ! 32: nextch = fgetc(tablef); ! 33: } while (nextch != EOF && nextch != '\n'); ! 34: } ! 35: } while (nextch != EOF && isspace(nextch)); ! 36: } ! 37: ! 38: static int nextchtohex(void) ! 39: { ! 40: switch (isupper (nextch) ? tolower (nextch) : nextch) { ! 41: case '0': return 0; ! 42: case '1': return 1; ! 43: case '2': return 2; ! 44: case '3': return 3; ! 45: case '4': return 4; ! 46: case '5': return 5; ! 47: case '6': return 6; ! 48: case '7': return 7; ! 49: case '8': return 8; ! 50: case '9': return 9; ! 51: case 'a': return 10; ! 52: case 'b': return 11; ! 53: case 'c': return 12; ! 54: case 'd': return 13; ! 55: case 'e': return 14; ! 56: case 'f': return 15; ! 57: default: abort(); ! 58: } ! 59: } ! 60: ! 61: int main(int argc, char **argv) ! 62: { ! 63: int no_insns = 0; ! 64: ! 65: printf ("#include \"sysconfig.h\"\n"); ! 66: printf ("#include \"sysdeps.h\"\n"); ! 67: printf ("#include \"readcpu.h\"\n"); ! 68: printf ("struct instr_def defs68k[] = {\n"); ! 69: #if 0 ! 70: tablef = fopen("table68k","r"); ! 71: if (tablef == NULL) { ! 72: fprintf(stderr, "table68k not found\n"); ! 73: exit(1); ! 74: } ! 75: #else ! 76: tablef = stdin; ! 77: #endif ! 78: getnextch(); ! 79: while (nextch != EOF) { ! 80: int cpulevel, plevel, sduse; ! 81: int i; ! 82: ! 83: char patbits[16]; ! 84: char opcstr[256]; ! 85: int bitpos[16]; ! 86: int flagset[5], flaguse[5]; ! 87: ! 88: unsigned int bitmask,bitpattern; ! 89: int n_variable; ! 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: patbits[i] = nextch; ! 131: getnextch(); ! 132: } ! 133: ! 134: while (isspace(nextch) || nextch == ':') /* Get CPU and privilege level */ ! 135: getnextch(); ! 136: ! 137: switch (nextch) { ! 138: case '0': cpulevel = 0; break; ! 139: case '1': cpulevel = 1; break; ! 140: case '2': cpulevel = 2; break; ! 141: case '3': cpulevel = 3; break; ! 142: case '4': cpulevel = 4; break; ! 143: case '5': cpulevel = 5; break; ! 144: case '6': cpulevel = 6; break; ! 145: case '7': cpulevel = 7; break; ! 146: default: abort(); ! 147: } ! 148: getnextch(); ! 149: ! 150: switch (nextch) { ! 151: case '0': plevel = 0; break; ! 152: case '1': plevel = 1; break; ! 153: case '2': plevel = 2; break; ! 154: case '3': plevel = 3; break; ! 155: default: abort(); ! 156: } ! 157: getnextch(); ! 158: ! 159: while (isspace(nextch)) /* Get flag set information */ ! 160: getnextch(); ! 161: ! 162: if (nextch != ':') ! 163: abort(); ! 164: ! 165: for(i = 0; i < 5; i++) { ! 166: getnextch(); ! 167: switch(nextch){ ! 168: case '-': flagset[i] = fa_unset; break; ! 169: case '/': flagset[i] = fa_isjmp; break; ! 170: case '+': flagset[i] = fa_isbranch; break; ! 171: case '0': flagset[i] = fa_zero; break; ! 172: case '1': flagset[i] = fa_one; break; ! 173: case 'x': flagset[i] = fa_dontcare; break; ! 174: case '?': flagset[i] = fa_unknown; break; ! 175: default: flagset[i] = fa_set; break; ! 176: } ! 177: } ! 178: ! 179: getnextch(); ! 180: while (isspace(nextch)) ! 181: getnextch(); ! 182: ! 183: if (nextch != ':') /* Get flag used information */ ! 184: abort(); ! 185: ! 186: for(i = 0; i < 5; i++) { ! 187: getnextch(); ! 188: switch(nextch){ ! 189: case '-': flaguse[i] = fu_unused; break; ! 190: case '/': flaguse[i] = fu_isjmp; break; ! 191: case '+': flaguse[i] = fu_maybecc; break; ! 192: case '?': flaguse[i] = fu_unknown; break; ! 193: default: flaguse[i] = fu_used; break; ! 194: } ! 195: } ! 196: ! 197: getnextch(); ! 198: while (isspace(nextch)) ! 199: getnextch(); ! 200: ! 201: if (nextch != ':') /* Get source/dest usage information */ ! 202: abort(); ! 203: ! 204: getnextch(); ! 205: sduse = nextchtohex() << 4; ! 206: getnextch(); ! 207: sduse |= nextchtohex(); ! 208: ! 209: getnextch(); ! 210: while (isspace(nextch)) ! 211: getnextch(); ! 212: ! 213: if (nextch != ':') ! 214: abort(); ! 215: ! 216: if (fgets(opcstr, 250, tablef) == NULL) { ! 217: perror("fgets"); ! 218: return -1; ! 219: } ! 220: getnextch(); ! 221: { ! 222: int j; ! 223: /* Remove superfluous spaces from the string */ ! 224: char *opstrp = opcstr, *osendp; ! 225: char tmp[100], *p; ! 226: int slen = 0; ! 227: ! 228: while (isspace(*opstrp)) ! 229: opstrp++; ! 230: ! 231: osendp = opstrp; ! 232: while (*osendp) { ! 233: if (!isspace (*osendp)) ! 234: slen = osendp - opstrp + 1; ! 235: osendp++; ! 236: } ! 237: opstrp[slen] = 0; ! 238: ! 239: if (no_insns > 0) ! 240: printf(",\n"); ! 241: no_insns++; ! 242: strcpy (tmp, opstrp); ! 243: strcat (tmp, " "); ! 244: p = tmp; ! 245: while (!isspace(*p++)); ! 246: *p = 0; ! 247: printf("/* %s */\n", tmp); ! 248: printf("{0x%04X,%2d,{", bitpattern, n_variable); ! 249: for (j = 0; j < 16; j++) { ! 250: printf("%2d", bitpos[j]); ! 251: if (j < 15) ! 252: printf(","); ! 253: } ! 254: printf ("},0x%04X,%d,%d,{", bitmask, cpulevel, plevel); ! 255: for(i = 0; i < 5; i++) { ! 256: printf("{%d,%d}%s", flaguse[i], flagset[i], i == 4 ? "" : ","); ! 257: } ! 258: printf("},%2d,\"%s\"}", sduse, opstrp); ! 259: } ! 260: } ! 261: printf("};\nint n_defs68k = %d;\n", no_insns); ! 262: return 0; ! 263: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.