WIP - merge latest sdl1-dev changes into sdl2-dev (warning, not fully checked yet, may crash!)

This commit is contained in:
Dimitris Panokostas 2017-11-29 00:54:20 +01:00
parent 6e0ab8ae90
commit d2c43c114b
144 changed files with 25089 additions and 22234 deletions

View file

@ -154,25 +154,25 @@ struct mnemolookup lookuptab[] = {
struct instr *table68k;
static amodes mode_from_str(const TCHAR *str)
static amodes mode_from_str (const TCHAR *str)
{
if (_tcsncmp(str, _T("Dreg"), 4) == 0) return Dreg;
if (_tcsncmp(str, _T("Areg"), 4) == 0) return Areg;
if (_tcsncmp(str, _T("Aind"), 4) == 0) return Aind;
if (_tcsncmp(str, _T("Apdi"), 4) == 0) return Apdi;
if (_tcsncmp(str, _T("Aipi"), 4) == 0) return Aipi;
if (_tcsncmp(str, _T("Ad16"), 4) == 0) return Ad16;
if (_tcsncmp(str, _T("Ad8r"), 4) == 0) return Ad8r;
if (_tcsncmp(str, _T("absw"), 4) == 0) return absw;
if (_tcsncmp(str, _T("absl"), 4) == 0) return absl;
if (_tcsncmp(str, _T("PC16"), 4) == 0) return PC16;
if (_tcsncmp(str, _T("PC8r"), 4) == 0) return PC8r;
if (_tcsncmp(str, _T("Immd"), 4) == 0) return imm;
abort();
if (_tcsncmp (str, _T("Dreg"), 4) == 0) return Dreg;
if (_tcsncmp (str, _T("Areg"), 4) == 0) return Areg;
if (_tcsncmp (str, _T("Aind"), 4) == 0) return Aind;
if (_tcsncmp (str, _T("Apdi"), 4) == 0) return Apdi;
if (_tcsncmp (str, _T("Aipi"), 4) == 0) return Aipi;
if (_tcsncmp (str, _T("Ad16"), 4) == 0) return Ad16;
if (_tcsncmp (str, _T("Ad8r"), 4) == 0) return Ad8r;
if (_tcsncmp (str, _T("absw"), 4) == 0) return absw;
if (_tcsncmp (str, _T("absl"), 4) == 0) return absl;
if (_tcsncmp (str, _T("PC16"), 4) == 0) return PC16;
if (_tcsncmp (str, _T("PC8r"), 4) == 0) return PC8r;
if (_tcsncmp (str, _T("Immd"), 4) == 0) return imm;
abort ();
return (amodes)0;
}
STATIC_INLINE amodes mode_from_mr(int mode, int reg)
STATIC_INLINE amodes mode_from_mr (int mode, int reg)
{
switch (mode) {
case 0: return Dreg;
@ -194,11 +194,11 @@ STATIC_INLINE amodes mode_from_mr(int mode, int reg)
case 7: return am_illg;
}
}
abort();
abort ();
return (amodes)0;
}
static void build_insn(int insn)
static void build_insn (int insn)
{
int find = -1;
int variants;
@ -207,39 +207,39 @@ static void build_insn(int insn)
int i, n;
int flaglive = 0, flagdead = 0;
int cflow = 0;
int cflow = 0;
// Mask of flags set/used
unsigned char flags_set = 0;
unsigned char flags_used = 0;
// Mask of flags set/used
unsigned char flags_set = 0;
unsigned char flags_used = 0;
id = defs68k[insn];
// Control flow information
cflow = id.cflow;
// Control flow information
cflow = id.cflow;
for (i = 0, n = 4; i < 5; i++, n--) {
switch (id.flaginfo[i].flagset) {
case fa_unset:
case fa_isjmp:
break;
default:
flags_set |= (1 << n);
}
for (i = 0, n = 4; i < 5; i++, n--) {
switch (id.flaginfo[i].flagset) {
case fa_unset:
case fa_isjmp:
break;
default:
flags_set |= (1 << n);
}
switch (id.flaginfo[i].flaguse) {
case fu_unused:
case fu_isjmp:
break;
default:
flags_used |= (1 << n);
}
}
switch (id.flaginfo[i].flaguse) {
case fu_unused:
case fu_isjmp:
break;
default:
flags_used |= (1 << n);
}
}
for (i = 0; i < 5; i++) {
switch (id.flaginfo[i].flagset) {
switch (id.flaginfo[i].flagset){
case fa_unset: break;
case fa_isjmp: break;
case fa_isjmp: break;
case fa_zero: flagdead |= 1 << i; break;
case fa_one: flagdead |= 1 << i; break;
case fa_dontcare: flagdead |= 1 << i; break;
@ -341,8 +341,7 @@ out2:
break;
default: abort();
}
}
else {
} else {
mnemonic[mnp] = opcstr[pos];
if (mnemonic[mnp] == 'f') {
find = -1;
@ -380,7 +379,7 @@ out2:
case 'A':
srcmode = Areg;
switch (opcstr[pos++]) {
case 'l': srcmode = absl; break;
case 'l': srcmode = absl; break;
case 'r': srcreg = bitval[bitr]; srcgather = 1; srcpos = bitpos[bitr]; break;
case 'R': srcreg = bitval[bitR]; srcgather = 1; srcpos = bitpos[bitR]; break;
default: abort();
@ -439,16 +438,16 @@ out2:
srcpos = bitpos[bitK];
}
break;
case 'E': srcmode = immi; srcreg = bitval[bitE];
if (CPU_EMU_SIZE < 5) {
/* 1..255 */
srcgather = 1;
srctype = 6;
srcpos = bitpos[bitE];
}
break;
case 'p': srcmode = immi; srcreg = bitval[bitp];
if (CPU_EMU_SIZE < 5) {
case 'E': srcmode = immi; srcreg = bitval[bitE];
if (CPU_EMU_SIZE < 5) {
/* 1..255 */
srcgather = 1;
srctype = 6;
srcpos = bitpos[bitE];
}
break;
case 'p': srcmode = immi; srcreg = bitval[bitp];
if (CPU_EMU_SIZE < 5) {
/* 0..3 */
srcgather = 1;
srctype = 7;
@ -460,13 +459,13 @@ out2:
break;
case 'd':
srcreg = bitval[bitD];
srcmode = mode_from_mr(bitval[bitd], bitval[bitD]);
srcmode = mode_from_mr(bitval[bitd],bitval[bitD]);
if (srcmode == am_illg)
continue;
if (CPU_EMU_SIZE < 2 &&
(srcmode == Areg || srcmode == Dreg || srcmode == Aind
|| srcmode == Ad16 || srcmode == Ad8r || srcmode == Aipi
|| srcmode == Apdi))
|| srcmode == Ad16 || srcmode == Ad8r || srcmode == Aipi
|| srcmode == Apdi))
{
srcgather = 1; srcpos = bitpos[bitD];
}
@ -476,30 +475,28 @@ out2:
/* exclusion */
do {
pos++;
if (mode_from_str(opcstr + pos) == srcmode)
if (mode_from_str(opcstr+pos) == srcmode)
goto nomatch;
pos += 4;
} while (opcstr[pos] == ',');
pos++;
}
else {
if (opcstr[pos + 4] == '-') {
} else {
if (opcstr[pos+4] == '-') {
/* replacement */
if (mode_from_str(opcstr + pos) == srcmode)
srcmode = mode_from_str(opcstr + pos + 5);
if (mode_from_str(opcstr+pos) == srcmode)
srcmode = mode_from_str(opcstr+pos+5);
else
goto nomatch;
pos += 10;
}
else {
} else {
/* normal */
while (mode_from_str(opcstr + pos) != srcmode) {
while(mode_from_str(opcstr+pos) != srcmode) {
pos += 4;
if (opcstr[pos] == ']')
goto nomatch;
pos++;
}
while (opcstr[pos] != ']') pos++;
while(opcstr[pos] != ']') pos++;
pos++;
break;
}
@ -511,14 +508,14 @@ out2:
break;
case 's':
srcreg = bitval[bitS];
srcmode = mode_from_mr(bitval[bits], bitval[bitS]);
srcmode = mode_from_mr(bitval[bits],bitval[bitS]);
if (srcmode == am_illg)
continue;
if (CPU_EMU_SIZE < 2 &&
(srcmode == Areg || srcmode == Dreg || srcmode == Aind
|| srcmode == Ad16 || srcmode == Ad8r || srcmode == Aipi
|| srcmode == Apdi))
|| srcmode == Ad16 || srcmode == Ad8r || srcmode == Aipi
|| srcmode == Apdi))
{
srcgather = 1; srcpos = bitpos[bitS];
}
@ -528,30 +525,28 @@ out2:
/* exclusion */
do {
pos++;
if (mode_from_str(opcstr + pos) == srcmode)
if (mode_from_str(opcstr+pos) == srcmode)
goto nomatch;
pos += 4;
} while (opcstr[pos] == ',');
pos++;
}
else {
if (opcstr[pos + 4] == '-') {
} else {
if (opcstr[pos+4] == '-') {
/* replacement */
if (mode_from_str(opcstr + pos) == srcmode)
srcmode = mode_from_str(opcstr + pos + 5);
if (mode_from_str(opcstr+pos) == srcmode)
srcmode = mode_from_str(opcstr+pos+5);
else
goto nomatch;
pos += 10;
}
else {
} else {
/* normal */
while (mode_from_str(opcstr + pos) != srcmode) {
while(mode_from_str(opcstr+pos) != srcmode) {
pos += 4;
if (opcstr[pos] == ']')
goto nomatch;
pos++;
}
while (opcstr[pos] != ']') pos++;
while(opcstr[pos] != ']') pos++;
pos++;
}
}
@ -584,19 +579,19 @@ out2:
default: abort();
}
if (dstpos < 0 || dstpos >= 32)
abort();
abort ();
break;
case 'A':
destmode = Areg;
switch (opcstr[pos++]) {
case 'l': destmode = absl; break;
case 'l': destmode = absl; break;
case 'r': destreg = bitval[bitr]; dstgather = 1; dstpos = bitpos[bitr]; break;
case 'R': destreg = bitval[bitR]; dstgather = 1; dstpos = bitpos[bitR]; break;
case 'x': destreg = 0; dstgather = 0; dstpos = 0; break;
default: abort();
}
if (destmode != absl && (dstpos < 0 || dstpos >= 32))
abort();
if (destmode != absl && (dstpos < 0 || dstpos >= 32))
abort ();
switch (opcstr[pos]) {
case 'p': destmode = Apdi; pos++; break;
case 'P': destmode = Aipi; pos++; break;
@ -621,13 +616,13 @@ out2:
break;
case 'd':
destreg = bitval[bitD];
destmode = mode_from_mr(bitval[bitd], bitval[bitD]);
destmode = mode_from_mr(bitval[bitd],bitval[bitD]);
if (destmode == am_illg)
continue;
if (CPU_EMU_SIZE < 1 &&
(destmode == Areg || destmode == Dreg || destmode == Aind
|| destmode == Ad16 || destmode == Ad8r || destmode == Aipi
|| destmode == Apdi))
|| destmode == Ad16 || destmode == Ad8r || destmode == Aipi
|| destmode == Apdi))
{
dstgather = 1; dstpos = bitpos[bitD];
}
@ -638,30 +633,28 @@ out2:
/* exclusion */
do {
pos++;
if (mode_from_str(opcstr + pos) == destmode)
if (mode_from_str(opcstr+pos) == destmode)
goto nomatch;
pos += 4;
} while (opcstr[pos] == ',');
pos++;
}
else {
if (opcstr[pos + 4] == '-') {
} else {
if (opcstr[pos+4] == '-') {
/* replacement */
if (mode_from_str(opcstr + pos) == destmode)
destmode = mode_from_str(opcstr + pos + 5);
if (mode_from_str(opcstr+pos) == destmode)
destmode = mode_from_str(opcstr+pos+5);
else
goto nomatch;
pos += 10;
}
else {
} else {
/* normal */
while (mode_from_str(opcstr + pos) != destmode) {
while(mode_from_str(opcstr+pos) != destmode) {
pos += 4;
if (opcstr[pos] == ']')
goto nomatch;
pos++;
}
while (opcstr[pos] != ']') pos++;
while(opcstr[pos] != ']') pos++;
pos++;
break;
}
@ -673,14 +666,14 @@ out2:
break;
case 's':
destreg = bitval[bitS];
destmode = mode_from_mr(bitval[bits], bitval[bitS]);
destmode = mode_from_mr(bitval[bits],bitval[bitS]);
if (destmode == am_illg)
continue;
if (CPU_EMU_SIZE < 1 &&
(destmode == Areg || destmode == Dreg || destmode == Aind
|| destmode == Ad16 || destmode == Ad8r || destmode == Aipi
|| destmode == Apdi))
|| destmode == Ad16 || destmode == Ad8r || destmode == Aipi
|| destmode == Apdi))
{
dstgather = 1; dstpos = bitpos[bitS];
}
@ -691,30 +684,28 @@ out2:
/* exclusion */
do {
pos++;
if (mode_from_str(opcstr + pos) == destmode)
if (mode_from_str(opcstr+pos) == destmode)
goto nomatch;
pos += 4;
} while (opcstr[pos] == ',');
pos++;
}
else {
if (opcstr[pos + 4] == '-') {
} else {
if (opcstr[pos+4] == '-') {
/* replacement */
if (mode_from_str(opcstr + pos) == destmode)
destmode = mode_from_str(opcstr + pos + 5);
if (mode_from_str(opcstr+pos) == destmode)
destmode = mode_from_str(opcstr+pos+5);
else
goto nomatch;
pos += 10;
}
else {
} else {
/* normal */
while (mode_from_str(opcstr + pos) != destmode) {
while(mode_from_str(opcstr+pos) != destmode) {
pos += 4;
if (opcstr[pos] == ']')
goto nomatch;
pos++;
}
while (opcstr[pos] != ']') pos++;
while(opcstr[pos] != ']') pos++;
pos++;
}
}
@ -732,17 +723,17 @@ out2:
if (destmode == Areg && sz == sz_byte)
goto nomatch;
endofline:
endofline:
/* now, we have a match */
if (table68k[opc].mnemo != i_ILLG)
;//write_log (_T("Double match: %x: %s\n"), opc, opcstr);
if (find == -1) {
for (find = 0;; find++) {
if (_tcscmp(mnemonic, lookuptab[find].name) == 0) {
if (_tcscmp (mnemonic, lookuptab[find].name) == 0) {
table68k[opc].mnemo = lookuptab[find].mnemo;
break;
}
if (_tcslen(lookuptab[find].name) == 0)
if (_tcslen (lookuptab[find].name) == 0)
abort();
}
}
@ -783,67 +774,67 @@ out2:
table68k[opc].clocks = id.clocks;
table68k[opc].fetchmode = id.fetchmode;
// Fix flags used information for Scc, Bcc, TRAPcc, DBcc instructions
if (table68k[opc].mnemo == i_Scc
|| table68k[opc].mnemo == i_Bcc
|| table68k[opc].mnemo == i_DBcc
|| table68k[opc].mnemo == i_TRAPcc
) {
switch (table68k[opc].cc) {
// CC mask: XNZVC
// 8421
case 0: flags_used = 0x00; break; /* T */
case 1: flags_used = 0x00; break; /* F */
case 2: flags_used = 0x05; break; /* HI */
case 3: flags_used = 0x05; break; /* LS */
case 4: flags_used = 0x01; break; /* CC */
case 5: flags_used = 0x01; break; /* CS */
case 6: flags_used = 0x04; break; /* NE */
case 7: flags_used = 0x04; break; /* EQ */
case 8: flags_used = 0x02; break; /* VC */
case 9: flags_used = 0x02; break; /* VS */
case 10:flags_used = 0x08; break; /* PL */
case 11:flags_used = 0x08; break; /* MI */
case 12:flags_used = 0x0A; break; /* GE */
case 13:flags_used = 0x0A; break; /* LT */
case 14:flags_used = 0x0E; break; /* GT */
case 15:flags_used = 0x0E; break; /* LE */
}
// Fix flags used information for Scc, Bcc, TRAPcc, DBcc instructions
if ( table68k[opc].mnemo == i_Scc
|| table68k[opc].mnemo == i_Bcc
|| table68k[opc].mnemo == i_DBcc
|| table68k[opc].mnemo == i_TRAPcc
) {
switch (table68k[opc].cc) {
// CC mask: XNZVC
// 8421
case 0: flags_used = 0x00; break; /* T */
case 1: flags_used = 0x00; break; /* F */
case 2: flags_used = 0x05; break; /* HI */
case 3: flags_used = 0x05; break; /* LS */
case 4: flags_used = 0x01; break; /* CC */
case 5: flags_used = 0x01; break; /* CS */
case 6: flags_used = 0x04; break; /* NE */
case 7: flags_used = 0x04; break; /* EQ */
case 8: flags_used = 0x02; break; /* VC */
case 9: flags_used = 0x02; break; /* VS */
case 10:flags_used = 0x08; break; /* PL */
case 11:flags_used = 0x08; break; /* MI */
case 12:flags_used = 0x0A; break; /* GE */
case 13:flags_used = 0x0A; break; /* LT */
case 14:flags_used = 0x0E; break; /* GT */
case 15:flags_used = 0x0E; break; /* LE */
}
}
#if 1
/* gb-- flagdead and flaglive would not have correct information */
table68k[opc].flagdead = flags_set;
table68k[opc].flaglive = flags_used;
/* gb-- flagdead and flaglive would not have correct information */
table68k[opc].flagdead = flags_set;
table68k[opc].flaglive = flags_used;
#else
table68k[opc].flagdead = flagdead;
table68k[opc].flaglive = flaglive;
#endif
table68k[opc].cflow = cflow;
nomatch:
table68k[opc].cflow = cflow;
nomatch:
/* FOO! */;
}
}
void read_table68k(void)
void read_table68k (void)
{
int i;
free(table68k);
table68k = xmalloc(struct instr, 65536);
free (table68k);
table68k = xmalloc (struct instr, 65536);
for (i = 0; i < 65536; i++) {
table68k[i].mnemo = i_ILLG;
table68k[i].handler = -1;
}
for (i = 0; i < n_defs68k; i++) {
build_insn(i);
build_insn (i);
}
}
static int imismatch;
static void handle_merges(long int opcode)
static void handle_merges (long int opcode)
{
uae_u16 smsk;
uae_u16 dmsk;
@ -852,8 +843,7 @@ static void handle_merges(long int opcode)
if (table68k[opcode].spos == -1) {
sbitdst = 1; smsk = 0;
}
else {
} else {
switch (table68k[opcode].stype) {
case 0:
smsk = 7; sbitdst = 8; break;
@ -867,8 +857,8 @@ static void handle_merges(long int opcode)
smsk = 7; sbitdst = 8; break;
case 5:
smsk = 63; sbitdst = 64; break;
case 6:
smsk = 255; sbitdst = 256; break;
case 6:
smsk = 255; sbitdst = 256; break;
case 7:
smsk = 3; sbitdst = 4; break;
default:
@ -880,13 +870,12 @@ static void handle_merges(long int opcode)
}
if (table68k[opcode].dpos == -1) {
dstend = 1; dmsk = 0;
}
else {
} else {
dmsk = 7 << table68k[opcode].dpos;
dstend = 8;
}
for (srcreg = 0; srcreg < sbitdst; srcreg++) {
for (dstreg = 0; dstreg < dstend; dstreg++) {
for (srcreg=0; srcreg < sbitdst; srcreg++) {
for (dstreg=0; dstreg < dstend; dstreg++) {
uae_u16 code = (uae_u16)opcode;
code = (code & ~smsk) | (srcreg << table68k[opcode].spos);
@ -904,14 +893,14 @@ static void handle_merges(long int opcode)
}
if (table68k[opcode].suse
&& (table68k[opcode].spos != table68k[code].spos
|| table68k[opcode].smode != table68k[code].smode
|| table68k[opcode].stype != table68k[code].stype))
|| table68k[opcode].smode != table68k[code].smode
|| table68k[opcode].stype != table68k[code].stype))
{
imismatch++; continue;
}
if (table68k[opcode].duse
&& (table68k[opcode].dpos != table68k[code].dpos
|| table68k[opcode].dmode != table68k[code].dmode))
|| table68k[opcode].dmode != table68k[code].dmode))
{
imismatch++; continue;
}
@ -922,7 +911,7 @@ static void handle_merges(long int opcode)
}
}
void do_merges(void)
void do_merges (void)
{
long int opcode;
int nr = 0;
@ -931,12 +920,12 @@ void do_merges(void)
if (table68k[opcode].handler != -1 || table68k[opcode].mnemo == i_ILLG)
continue;
nr++;
handle_merges(opcode);
handle_merges (opcode);
}
nr_cpuop_funcs = nr;
}
int get_no_mismatches(void)
int get_no_mismatches (void)
{
return imismatch;
}