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