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