|
|
1.1 ! root 1: /* ! 2: * UAE - The Un*x Amiga Emulator - CPU core ! 3: * ! 4: * Read 68000 CPU specs from file "table68k" and build table68k.c ! 5: * ! 6: * Copyright 1995,1996 Bernd Schmidt ! 7: * ! 8: * Adaptation to Hatari by Thomas Huth ! 9: * ! 10: * This file is distributed under the GNU Public License, version 2 or at ! 11: * your option any later version. Read the file gpl.txt for details. ! 12: */ ! 13: const char Build68k_fileid[] = "Hatari build68k.c : " __DATE__ " " __TIME__; ! 14: ! 15: #include <assert.h> ! 16: #include <ctype.h> ! 17: #include <string.h> ! 18: ! 19: #include "readcpu.h" ! 20: ! 21: ! 22: static FILE *tablef; ! 23: static int nextch = 0; ! 24: ! 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 ("const 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: default: abort(); ! 144: } ! 145: getnextch(); ! 146: ! 147: switch (nextch) { ! 148: case '0': plevel = 0; break; ! 149: case '1': plevel = 1; break; ! 150: case '2': plevel = 2; break; ! 151: case '3': plevel = 3; break; ! 152: default: abort(); ! 153: } ! 154: getnextch(); ! 155: ! 156: while (isspace(nextch)) /* Get flag set information */ ! 157: getnextch(); ! 158: ! 159: if (nextch != ':') ! 160: abort(); ! 161: ! 162: for(i = 0; i < 5; i++) { ! 163: getnextch(); ! 164: switch(nextch){ ! 165: case '-': flagset[i] = fa_unset; break; ! 166: case '/': flagset[i] = fa_isjmp; break; ! 167: case '+': flagset[i] = fa_isbranch; 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: if (fgets(opcstr, 250, tablef) == NULL) { ! 214: perror("fgets"); ! 215: return -1; ! 216: } ! 217: ! 218: getnextch(); ! 219: { ! 220: int j; ! 221: /* Remove superfluous spaces from the string */ ! 222: char *opstrp = opcstr, *osendp; ! 223: int slen = 0; ! 224: ! 225: while (isspace((unsigned)(*opstrp))) ! 226: opstrp++; ! 227: ! 228: osendp = opstrp; ! 229: while (*osendp) { ! 230: if (!isspace ((unsigned)(*osendp))) ! 231: slen = osendp - opstrp + 1; ! 232: osendp++; ! 233: } ! 234: opstrp[slen] = 0; ! 235: ! 236: if (no_insns > 0) ! 237: printf(",\n"); ! 238: no_insns++; ! 239: printf("{ %d, %d, {", bitpattern, n_variable); ! 240: for (j = 0; j < 16; j++) { ! 241: printf("%d", bitpos[j]); ! 242: if (j < 15) ! 243: printf(","); ! 244: } ! 245: printf ("}, %d, %d, %d, { ", bitmask, cpulevel, plevel); ! 246: for(i = 0; i < 5; i++) { ! 247: printf("{ %d, %d }%c ", flaguse[i], flagset[i], i == 4 ? ' ' : ','); ! 248: } ! 249: printf("}, %d, \"%s\"}", sduse, opstrp); ! 250: } ! 251: } ! 252: printf("};\nint n_defs68k = %d;\n", no_insns); ! 253: return 0; ! 254: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.