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