int main(int argc, char **argv) { int no_insns = 0; printf ("#include \"sysconfig.h\"\n"); printf ("#include \"sysdeps.h\"\n"); printf ("#include \"readcpu.h\"\n"); printf ("struct instr_def defs68k[] = {\n"); #if 0 tablef = fopen("table68k","r"); if (tablef == NULL) { fprintf(stderr, "table68k not found\n"); exit(1); } #else tablef = stdin; #endif getnextch(); while (nextch != EOF) { int cpulevel, uncpulevel, plevel, sduse; int i; char patbits[16]; char opcstr[256]; int bitpos[16]; int flagset[5], flaguse[5]; unsigned int bitmask,bitpattern; int n_variable; n_variable = 0; bitmask = bitpattern = 0; memset (bitpos, 0, sizeof(bitpos)); for(i=0; i<16; i++) { int currbit; bitmask <<= 1; bitpattern <<= 1; switch (nextch) { case '0': currbit = bit0; bitmask |= 1; break; case '1': currbit = bit1; bitmask |= 1; bitpattern |= 1; break; case 'c': currbit = bitc; break; case 'C': currbit = bitC; break; case 'f': currbit = bitf; break; case 'i': currbit = biti; break; case 'I': currbit = bitI; break; case 'j': currbit = bitj; break; case 'J': currbit = bitJ; break; case 'k': currbit = bitk; break; case 'K': currbit = bitK; break; case 's': currbit = bits; break; case 'S': currbit = bitS; break; case 'd': currbit = bitd; break; case 'D': currbit = bitD; break; case 'r': currbit = bitr; break; case 'R': currbit = bitR; break; case 'z': currbit = bitz; break; case 'p': currbit = bitp; break; default: abort(); } if (!(bitmask & 1)) { bitpos[n_variable] = currbit; n_variable++; } if (nextch == '0' || nextch == '1') bitmask |= 1; if (nextch == '1') bitpattern |= 1; patbits[i] = nextch; getnextch(); } while (isspace(nextch) || nextch == ':') /* Get CPU level, unimplemented level, and privilege level */ getnextch(); switch (nextch) { case '0': cpulevel = 0; break; case '1': cpulevel = 1; break; case '2': cpulevel = 2; break; case '3': cpulevel = 3; break; case '4': cpulevel = 4; break; case '5': cpulevel = 5; break; case '6': cpulevel = 6; break; case '7': cpulevel = 7; break; default: abort(); } getnextch(); switch (nextch) { case '0': uncpulevel = 0; break; case '1': uncpulevel = 1; break; case '2': uncpulevel = 2; break; case '3': uncpulevel = 3; break; case '4': uncpulevel = 4; break; case '5': uncpulevel = 5; break; case '6': uncpulevel = 6; break; case '7': uncpulevel = 7; break; default: abort(); } getnextch(); switch (nextch) { case '0': plevel = 0; break; case '1': plevel = 1; break; case '2': plevel = 2; break; case '3': plevel = 3; break; default: abort(); } getnextch(); while (isspace(nextch)) /* Get flag set information */ getnextch(); if (nextch != ':') abort(); for(i = 0; i < 5; i++) { getnextch(); switch(nextch){ case '-': flagset[i] = fa_unset; break; case '/': flagset[i] = fa_isjmp; break; case '+': flagset[i] = fa_isbranch; break; case '0': flagset[i] = fa_zero; break; case '1': flagset[i] = fa_one; break; case 'x': flagset[i] = fa_dontcare; break; case '?': flagset[i] = fa_unknown; break; default: flagset[i] = fa_set; break; } } getnextch(); while (isspace(nextch)) getnextch(); if (nextch != ':') /* Get flag used information */ abort(); for(i = 0; i < 5; i++) { getnextch(); switch(nextch){ case '-': flaguse[i] = fu_unused; break; case '/': flaguse[i] = fu_isjmp; break; case '+': flaguse[i] = fu_maybecc; break; case '?': flaguse[i] = fu_unknown; break; default: flaguse[i] = fu_used; break; } } getnextch(); while (isspace(nextch)) getnextch(); if (nextch != ':') /* Get source/dest usage information */ abort(); getnextch(); sduse = nextchtohex() << 4; getnextch(); sduse |= nextchtohex(); getnextch(); while (isspace(nextch)) getnextch(); if (nextch != ':') abort(); fgets(opcstr, 250, tablef); getnextch(); { int j; /* Remove superfluous spaces from the string */ char *opstrp = opcstr, *osendp; char tmp[100], *p; int slen = 0; while (isspace(*opstrp)) opstrp++; osendp = opstrp; while (*osendp) { if (!isspace (*osendp)) slen = osendp - opstrp + 1; osendp++; } opstrp[slen] = 0; if (no_insns > 0) printf(",\n"); no_insns++; strcpy (tmp, opstrp); strcat (tmp, " "); p = tmp; while (!isspace(*p++)); *p = 0; printf("/* %s */\n", tmp); printf("{0x%04X,%2d,{", bitpattern, n_variable); for (j = 0; j < 16; j++) { printf("%2d", bitpos[j]); if (j < 15) printf(","); } printf ("},0x%04X,%d,%d,%d,{", bitmask, cpulevel, uncpulevel, plevel); for(i = 0; i < 5; i++) { printf("{%d,%d}%s", flaguse[i], flagset[i], i == 4 ? "" : ","); } printf("},%2d,_T(\"%s\")}", sduse, opstrp); } } printf("};\nint n_defs68k = %d;\n", no_insns); return 0; }
int main() { int no_insns = 0; printf ("#include \"sysdeps.h\"\n"); printf ("#include \"readcpu.h\"\n"); printf ("struct instr_def defs68k[] = {\n"); #if 0 tablef = fopen("table68k","r"); if (tablef == NULL) { fprintf(stderr, "table68k not found\n"); exit(1); } #else tablef = stdin; #endif getnextch(); while (nextch != EOF) { int cpulevel, plevel, sduse; int i; char patbits[16]; char opcstr[256]; int bitpos[16]; int flagset[5], flaguse[5]; char cflow; unsigned int bitmask,bitpattern; int n_variable; n_variable = 0; bitmask = bitpattern = 0; memset (bitpos, 0, sizeof(bitpos)); for(i=0; i<16; i++) { int currbit; bitmask <<= 1; bitpattern <<= 1; switch (nextch) { case '0': currbit = bit0; bitmask |= 1; break; case '1': currbit = bit1; bitmask |= 1; bitpattern |= 1; break; case 'c': currbit = bitc; break; case 'C': currbit = bitC; break; case 'f': currbit = bitf; break; case 'i': currbit = biti; break; case 'I': currbit = bitI; break; case 'j': currbit = bitj; break; case 'J': currbit = bitJ; break; case 'k': currbit = bitk; break; case 'K': currbit = bitK; break; case 's': currbit = bits; break; case 'S': currbit = bitS; break; case 'd': currbit = bitd; break; case 'D': currbit = bitD; break; case 'r': currbit = bitr; break; case 'R': currbit = bitR; break; case 'z': currbit = bitz; break; case 'E': currbit = bitE; break; case 'p': currbit = bitp; break; default: abort(); } if (!(bitmask & 1)) { bitpos[n_variable] = currbit; n_variable++; } if (nextch == '0' || nextch == '1') bitmask |= 1; if (nextch == '1') bitpattern |= 1; patbits[i] = nextch; getnextch(); } (void) patbits; while (isspace(nextch) || nextch == ':') /* Get CPU and privilege level */ getnextch(); switch (nextch) { case '0': cpulevel = 0; break; case '1': cpulevel = 1; break; case '2': cpulevel = 2; break; case '3': cpulevel = 3; break; case '4': cpulevel = 4; break; case '5': cpulevel = 5; break; default: abort(); } getnextch(); switch (nextch) { case '0': plevel = 0; break; case '1': plevel = 1; break; case '2': plevel = 2; break; case '3': plevel = 3; break; default: abort(); } getnextch(); while (isspace(nextch)) /* Get flag set information */ getnextch(); if (nextch != ':') abort(); for(i = 0; i < 5; i++) { getnextch(); switch(nextch){ case '-': flagset[i] = fa_unset; break; case '/': flagset[i] = fa_isjmp; break; case '+': flagset[i] = fa_isbranch; break; case '0': flagset[i] = fa_zero; break; case '1': flagset[i] = fa_one; break; case 'x': flagset[i] = fa_dontcare; break; case '?': flagset[i] = fa_unknown; break; default: flagset[i] = fa_set; break; } } getnextch(); while (isspace(nextch)) getnextch(); if (nextch != ':') /* Get flag used information */ abort(); for(i = 0; i < 5; i++) { getnextch(); switch(nextch){ case '-': flaguse[i] = fu_unused; break; case '/': flaguse[i] = fu_isjmp; break; case '+': flaguse[i] = fu_maybecc; break; case '?': flaguse[i] = fu_unknown; break; default: flaguse[i] = fu_used; break; } } getnextch(); while (isspace(nextch)) getnextch(); if (nextch != ':') /* Get control flow information */ abort(); cflow = 0; for(i = 0; i < 2; i++) { getnextch(); switch(nextch){ case '-': break; case 'R': cflow |= fl_return; break; case 'B': cflow |= fl_branch; break; case 'J': cflow |= fl_jump; break; case 'T': cflow |= fl_trap; break; default: abort(); } } getnextch(); while (isspace(nextch)) getnextch(); if (nextch != ':') /* Get source/dest usage information */ abort(); getnextch(); sduse = nextchtohex() << 4; getnextch(); sduse |= nextchtohex(); getnextch(); while (isspace(nextch)) getnextch(); if (nextch != ':') abort(); assert(fgets(opcstr, 250, tablef) != NULL); getnextch(); { int j; /* Remove superfluous spaces from the string */ char *opstrp = opcstr, *osendp; int slen = 0; while (isspace((int)*opstrp)) opstrp++; osendp = opstrp; while (*osendp) { if (!isspace ((int)*osendp)) slen = osendp - opstrp + 1; osendp++; } opstrp[slen] = 0; if (no_insns > 0) printf(",\n"); no_insns++; printf("{ %d, %d, {", bitpattern, n_variable); for (j = 0; j < 16; j++) { printf("%d", bitpos[j]); if (j < 15) printf(","); } printf ("}, %d, %d, %d, { ", bitmask, cpulevel, plevel); for(i = 0; i < 5; i++) { printf("{ %d, %d }%c ", flaguse[i], flagset[i], i == 4 ? ' ' : ','); } printf("}, %d, %d, \"%s\"}", cflow, sduse, opstrp); } } printf("};\nint n_defs68k = %d;\n", no_insns); return 0; }
int32_t main(void) { int32_t no_insns = 0; printf ("#include \"sysconfig.h\"\n"); printf ("#include \"uae_types.h\"\n"); printf ("#include \"readcpu.h\"\n"); printf ("struct instr_def defs68k[] = {\n"); tablef = stdin; getnextch(); while (EOF != nextch) { int32_t cpulevel, uncpulevel, plevel, sduse; char opcstr[256] = { 0 }; int32_t bitpos[16] = { 0 }; int32_t flagset[5] = { 0 }; int32_t flaguse[5] = { 0 }; uint32_t bitmask = 0; uint32_t bitpattern = 0; int32_t n_variable = 0; int32_t head = 0; int32_t tail = 0; int32_t clocks = 0; int32_t fetchmode = 0; /* A line looks like this : * 0100 1000 00dd dDDD:000:X?Z?C:X-Z--:30: NBCD.B d[!Areg] */ /* Read first 16 values until the first colon * Example: "0100 1000 00dd dDDD" * Note: getnextch() skips comment lines and spaces */ for (int32_t i = 0; i < 16; ++i) { int32_t currbit = 0; bitmask <<= 1; bitpattern <<= 1; switch (nextch) { case '0': currbit = bit0; bitmask |= 1; break; case '1': currbit = bit1; bitmask |= 1; bitpattern |= 1; break; case 'c': currbit = bitc; break; case 'C': currbit = bitC; break; case 'f': currbit = bitf; break; case 'i': currbit = biti; break; case 'I': currbit = bitI; break; case 'j': currbit = bitj; break; case 'J': currbit = bitJ; break; case 'k': currbit = bitk; break; case 'K': currbit = bitK; break; case 's': currbit = bits; break; case 'S': currbit = bitS; break; case 'd': currbit = bitd; break; case 'D': currbit = bitD; break; case 'r': currbit = bitr; break; case 'R': currbit = bitR; break; case 'z': currbit = bitz; break; case 'p': currbit = bitp; break; default: abort(); } if ( !(bitmask & 1) ) { bitpos[n_variable] = currbit; n_variable++; } if ( '0' == nextch ) bitmask |= 1; else if ( '1' == nextch ) { bitmask |= 1; bitpattern |= 1; } getnextch(); } /* Get CPU level, unimplemented level, and privilege level * Example: "000" */ while ( isspace(nextch) || (':' == nextch) ) getnextch(); switch (nextch) { case '0': cpulevel = 0; break; case '1': cpulevel = 1; break; case '2': cpulevel = 2; break; case '3': cpulevel = 3; break; case '4': cpulevel = 4; break; case '5': cpulevel = 5; break; case '6': cpulevel = 6; break; case '7': cpulevel = 7; break; default: abort(); } getnextch(); switch (nextch) { case '0': uncpulevel = 0; break; case '1': uncpulevel = 1; break; case '2': uncpulevel = 2; break; case '3': uncpulevel = 3; break; case '4': uncpulevel = 4; break; case '5': uncpulevel = 5; break; case '6': uncpulevel = 6; break; case '7': uncpulevel = 7; break; default: abort(); } getnextch(); switch (nextch) { case '0': plevel = 0; break; case '1': plevel = 1; break; case '2': plevel = 2; break; case '3': plevel = 3; break; default: abort(); } getnextch(); /* Get flag set information * Example: "X?Z?C" */ while (isspace(nextch)) getnextch(); if (':' != nextch) abort(); for(int32_t i = 0; i < 5; i++) { getnextch(); switch(nextch){ case '-': flagset[i] = fa_unset; break; case '/': flagset[i] = fa_isjmp; break; case '+': flagset[i] = fa_isbranch; break; case '0': flagset[i] = fa_zero; break; case '1': flagset[i] = fa_one; break; case 'x': flagset[i] = fa_dontcare; break; case '?': flagset[i] = fa_unknown; break; default: flagset[i] = fa_set; break; } } getnextch(); while (isspace(nextch)) getnextch(); /* Get flag used information * Example: "X-Z--" */ if (':' != nextch) abort(); for(int32_t i = 0; i < 5; i++) { getnextch(); switch(nextch){ case '-': flaguse[i] = fu_unused; break; case '/': flaguse[i] = fu_isjmp; break; case '+': flaguse[i] = fu_maybecc; break; case '?': flaguse[i] = fu_unknown; break; default: flaguse[i] = fu_used; break; } } getnextch(); while (isspace(nextch)) getnextch(); /* Get source/dest usage information * Example: "30" */ if (':' != nextch) abort(); getnextch(); sduse = nextchtohex() << 4; getnextch(); sduse |= nextchtohex(); getnextch(); while (isspace(nextch)) getnextch(); /* Last is instruction information * Example: " NBCD.B d[!Areg]" */ if (':' != nextch) abort(); if (fgets(opcstr, 250, tablef)) getnextch(); /* Eat newline */ /* Handle extra information on separate lines identified by '-' beginning * Example: "- 0 1 3 fea" */ if ('-' == nextch) { int32_t neg = 1; char fm[20] = { 0 }; getnextch(); while (isspace(nextch)) getnextch(); if ('-' == nextch) { neg = -1; getnextch(); } while ( ('0' <= nextch) && ('9' >= nextch) ) { head *= 10; head += nextch - '0'; nextch = fgetc (tablef); } head *= neg; while (isspace(nextch)) getnextch(); while ( ('0' <= nextch) && ('9' >= nextch) ) { tail *= 10; tail += nextch - '0'; nextch = fgetc (tablef); } while (isspace(nextch)) getnextch(); while ( ('0' <= nextch) && ('9' >= nextch) ) { clocks *= 10; clocks += nextch - '0'; nextch = fgetc (tablef); } if ( (' ' == nextch) && fgets(fm, sizeof fm, tablef) ) { if (!strncasecmp(fm, "fea", 3)) fetchmode = 1; if (!strncasecmp(fm, "cea", 3)) fetchmode = 2; if (!strncasecmp(fm, "fiea", 4)) fetchmode = 3; if (!strncasecmp(fm, "ciea", 4)) fetchmode = 4; if (!strncasecmp(fm, "jea", 3)) fetchmode = 5; } getnextch(); } /* Remove superfluous spaces from the string */ char* opstrp = opcstr; char* osendp = NULL; char tmp[100] = { 0 }; char* p = NULL; int32_t slen = 0; /* Advance leading spaces */ while (isspace(*opstrp)) opstrp++; /* Store non-space beginning */ osendp = opstrp; /* Count non-space characters */ while (*osendp) { if (!isspace (*osendp)) slen = osendp - opstrp + 1; osendp++; } /* End string on first space with a null byte */ opstrp[slen] = 0; /* Add line breaks after the first instruction written */ if (no_insns++ > 0) printf(",\n"); strcpy (tmp, opstrp); strcat (tmp, " "); p = tmp; while (!isspace(*p++)) ; *p = 0; printf("/* %s */\n", tmp); printf("{0x%04X,%2d,{", bitpattern, n_variable); for (int32_t j = 0; j < 16; j++) { printf("%2d", bitpos[j]); if (j < 15) printf(","); } printf ("},0x%04X,%d,%d,%d,{", bitmask, cpulevel, uncpulevel, plevel); for(int32_t i = 0; i < 5; i++) { printf("{%d,%d}%s", flaguse[i], flagset[i], i == 4 ? "" : ","); } printf ("},%2d,\"%s\",%2d,%2d,%2d,%2d}", sduse, opstrp, head, tail, clocks, fetchmode); } // end of reading loop printf("};\nint n_defs68k = %d;\n", no_insns); return 0; }
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { int argc = __argc; char** argv = __argv; #else int main(int argc, char **argv) { #endif int no_insns = 0; printf ("#include \"sysconfig.h\"\n"); printf ("#include \"sysdeps.h\"\n"); printf ("#include \"readcpu.h\"\n"); printf ("struct instr_def defs68k[] = {\n"); #if 0 tablef = fopen("table68k","r"); if (tablef == NULL) { fprintf(stderr, "table68k not found\n"); exit(1); } #else tablef = stdin; #endif getnextch(); while (nextch != EOF) { int cpulevel, uncpulevel, plevel, sduse; int i; char opcstr[256]; int bitpos[16]; int flagset[5], flaguse[5]; unsigned int bitmask,bitpattern; int n_variable; int head = 0, tail = 0, clocks = 0, fetchmode = 0; n_variable = 0; bitmask = bitpattern = 0; memset (bitpos, 0, sizeof(bitpos)); for(i=0; i<16; i++) { int currbit; bitmask <<= 1; bitpattern <<= 1; switch (nextch) { case '0': currbit = bit0; bitmask |= 1; break; case '1': currbit = bit1; bitmask |= 1; bitpattern |= 1; break; case 'c': currbit = bitc; break; case 'C': currbit = bitC; break; case 'f': currbit = bitf; break; case 'i': currbit = biti; break; case 'I': currbit = bitI; break; case 'j': currbit = bitj; break; case 'J': currbit = bitJ; break; case 'k': currbit = bitk; break; case 'K': currbit = bitK; break; case 's': currbit = bits; break; case 'S': currbit = bitS; break; case 'd': currbit = bitd; break; case 'D': currbit = bitD; break; case 'r': currbit = bitr; break; case 'R': currbit = bitR; break; case 'z': currbit = bitz; break; case 'p': currbit = bitp; break; default: abort(); } if (!(bitmask & 1)) { bitpos[n_variable] = currbit; n_variable++; } if (nextch == '0' || nextch == '1') bitmask |= 1; if (nextch == '1') bitpattern |= 1; getnextch(); } while (isspace(nextch) || nextch == ':') /* Get CPU level, unimplemented level, and privilege level */ getnextch(); switch (nextch) { case '0': cpulevel = 0; break; case '1': cpulevel = 1; break; case '2': cpulevel = 2; break; case '3': cpulevel = 3; break; case '4': cpulevel = 4; break; case '5': cpulevel = 5; break; case '6': cpulevel = 6; break; case '7': cpulevel = 7; break; default: abort(); } getnextch(); switch (nextch) { case '0': uncpulevel = 0; break; case '1': uncpulevel = 1; break; case '2': uncpulevel = 2; break; case '3': uncpulevel = 3; break; case '4': uncpulevel = 4; break; case '5': uncpulevel = 5; break; case '6': uncpulevel = 6; break; case '7': uncpulevel = 7; break; default: abort(); } getnextch(); switch (nextch) { case '0': plevel = 0; break; case '1': plevel = 1; break; case '2': plevel = 2; break; case '3': plevel = 3; break; default: abort(); } getnextch(); while (isspace(nextch)) /* Get flag set information */ getnextch(); if (nextch != ':') abort(); for(i = 0; i < 5; i++) { getnextch(); switch(nextch){ case '-': flagset[i] = fa_unset; break; case '/': flagset[i] = fa_isjmp; break; case '+': flagset[i] = fa_isbranch; break; case '0': flagset[i] = fa_zero; break; case '1': flagset[i] = fa_one; break; case 'x': flagset[i] = fa_dontcare; break; case '?': flagset[i] = fa_unknown; break; default: flagset[i] = fa_set; break; } } getnextch(); while (isspace(nextch)) getnextch(); if (nextch != ':') /* Get flag used information */ abort(); for(i = 0; i < 5; i++) { getnextch(); switch(nextch){ case '-': flaguse[i] = fu_unused; break; case '/': flaguse[i] = fu_isjmp; break; case '+': flaguse[i] = fu_maybecc; break; case '?': flaguse[i] = fu_unknown; break; default: flaguse[i] = fu_used; break; } } getnextch(); while (isspace(nextch)) getnextch(); if (nextch != ':') /* Get source/dest usage information */ abort(); getnextch(); sduse = nextchtohex() << 4; getnextch(); sduse |= nextchtohex(); getnextch(); while (isspace(nextch)) getnextch(); if (nextch != ':') abort(); if (fgets(opcstr, 250, tablef) != opcstr) { abort(); } getnextch(); if (nextch == '-') { int neg; char fm[20]; getnextch(); while (isspace(nextch)) getnextch(); neg = 1; if (nextch == '-') { neg = -1; getnextch(); } for (;;) { if (nextch < '0' || nextch > '9') break; head *= 10; head += nextch - '0'; nextch = fgetc (tablef); } head *= neg; while (isspace(nextch)) getnextch(); for (;;) { if (nextch < '0' || nextch > '9') break; tail *= 10; tail += nextch - '0'; nextch = fgetc (tablef); } while (isspace(nextch)) getnextch(); for (;;) { if (nextch < '0' || nextch > '9') break; clocks *= 10; clocks += nextch - '0'; nextch = fgetc (tablef); } if (nextch == ' ') { if (fgets(fm, sizeof fm, tablef) != fm) { abort(); } if (!strnicmp(fm, "fea", 3)) fetchmode = 1; if (!strnicmp(fm, "cea", 3)) fetchmode = 2; if (!strnicmp(fm, "fiea", 4)) fetchmode = 3; if (!strnicmp(fm, "ciea", 4)) fetchmode = 4; if (!strnicmp(fm, "jea", 3)) fetchmode = 5; } getnextch(); } int j; /* Remove superfluous spaces from the string */ char *opstrp = opcstr, *osendp; char tmp[100], *p; int slen = 0; while (isspace(*opstrp)) opstrp++; osendp = opstrp; while (*osendp) { if (!isspace (*osendp)) slen = osendp - opstrp + 1; osendp++; } opstrp[slen] = 0; if (no_insns > 0) printf(",\n"); no_insns++; strcpy (tmp, opstrp); strcat (tmp, " "); p = tmp; while (!isspace(*p++)); *p = 0; printf("/* %s */\n", tmp); printf("{0x%04X,%2d,{", bitpattern, n_variable); for (j = 0; j < 16; j++) { printf("%2d", bitpos[j]); if (j < 15) printf(","); } printf ("},0x%04X,%d,%d,%d,{", bitmask, cpulevel, uncpulevel, plevel); for(i = 0; i < 5; i++) { printf("{%d,%d}%s", flaguse[i], flagset[i], i == 4 ? "" : ","); } printf("},0x%02x,_T(\"%s\"),%2d,%2d,%2d,%2d}", sduse, opstrp, head, tail, clocks, fetchmode); } printf("};\nint n_defs68k = %d;\n", no_insns); return 0; }