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