--- uae/src/gencpu.c 2018/04/24 16:38:39 1.1 +++ uae/src/gencpu.c 2018/04/24 16:38:54 1.1.1.2 @@ -124,13 +124,23 @@ static void genamode(amodes mode, char * if (getv) switch(size) { case sz_byte: - printf("\tBYTE %s = regs.d[%s];\n", name, reg); +#ifdef AMIGA + /* sam: I don't know why gcc.2.7.2.1 produces a code worse */ + /* if it is not done like that: */ + printf("\tBYTE %s = ((UBYTE*)&m68k_dreg(regs, %s))[3];\n", name, reg); +#else + printf("\tBYTE %s = m68k_dreg(regs, %s);\n", name, reg); +#endif break; case sz_word: - printf("\tWORD %s = regs.d[%s];\n", name, reg); +#ifdef AMIGA + printf("\tWORD %s = ((WORD*)&m68k_dreg(regs, %s))[1];\n", name, reg); +#else + printf("\tWORD %s = m68k_dreg(regs, %s);\n", name, reg); +#endif break; case sz_long: - printf("\tLONG %s = regs.d[%s];\n", name, reg); + printf("\tLONG %s = m68k_dreg(regs, %s);\n", name, reg); break; default: abort(); } @@ -141,16 +151,16 @@ static void genamode(amodes mode, char * if (getv) switch(size) { case sz_word: - printf("\tWORD %s = regs.a[%s];\n", name, reg); + printf("\tWORD %s = m68k_areg(regs, %s);\n", name, reg); break; case sz_long: - printf("\tLONG %s = regs.a[%s];\n", name, reg); + printf("\tLONG %s = m68k_areg(regs, %s);\n", name, reg); break; default: abort(); } break; case Aind: - printf("\tCPTR %sa = regs.a[%s];\n", name, reg); + printf("\tCPTR %sa = m68k_areg(regs, %s);\n", name, reg); if (getv) switch(size) { case sz_byte: @@ -166,27 +176,27 @@ static void genamode(amodes mode, char * } break; case Aipi: - printf("\tCPTR %sa = regs.a[%s];\n", name, reg); + printf("\tCPTR %sa = m68k_areg(regs, %s);\n", name, reg); switch(size) { case sz_byte: if (getv) printf("\tBYTE %s = get_byte(%sa);\n", name, name); if (!movem) { start_brace(); - printf("\tregs.a[%s] += areg_byteinc[%s];\n", reg, reg); + printf("\tm68k_areg(regs, %s) += areg_byteinc[%s];\n", reg, reg); } break; case sz_word: if (getv) printf("\tWORD %s = get_word(%sa);\n", name, name); if (!movem) { start_brace(); - printf("\tregs.a[%s] += 2;\n", reg); + printf("\tm68k_areg(regs, %s) += 2;\n", reg); } break; case sz_long: if (getv) printf("\tLONG %s = get_long(%sa);\n", name, name); if (!movem) { start_brace(); - printf("\tregs.a[%s] += 4;\n", reg); + printf("\tm68k_areg(regs, %s) += 4;\n", reg); } break; default: abort(); @@ -195,28 +205,28 @@ static void genamode(amodes mode, char * case Apdi: switch(size) { case sz_byte: - if (!movem) printf("\tregs.a[%s] -= areg_byteinc[%s];\n", reg, reg); + if (!movem) printf("\tm68k_areg(regs, %s) -= areg_byteinc[%s];\n", reg, reg); start_brace(); - printf("\tCPTR %sa = regs.a[%s];\n", name, reg); + printf("\tCPTR %sa = m68k_areg(regs, %s);\n", name, reg); if (getv) printf("\tBYTE %s = get_byte(%sa);\n", name, name); break; case sz_word: - if (!movem) printf("\tregs.a[%s] -= 2;\n", reg); + if (!movem) printf("\tm68k_areg(regs, %s) -= 2;\n", reg); start_brace(); - printf("\tCPTR %sa = regs.a[%s];\n", name, reg); + printf("\tCPTR %sa = m68k_areg(regs, %s);\n", name, reg); if (getv) printf("\tWORD %s = get_word(%sa);\n", name, name); break; case sz_long: - if (!movem) printf("\tregs.a[%s] -= 4;\n", reg); + if (!movem) printf("\tm68k_areg(regs, %s) -= 4;\n", reg); start_brace(); - printf("\tCPTR %sa = regs.a[%s];\n", name, reg); + printf("\tCPTR %sa = m68k_areg(regs, %s);\n", name, reg); if (getv) printf("\tLONG %s = get_long(%sa);\n", name, name); break; default: abort(); } break; case Ad16: - printf("\tCPTR %sa = regs.a[%s] + (LONG)(WORD)nextiword();\n", name, reg); + printf("\tCPTR %sa = m68k_areg(regs, %s) + (LONG)(WORD)nextiword();\n", name, reg); if (getv) switch(size) { case sz_byte: @@ -232,7 +242,7 @@ static void genamode(amodes mode, char * } break; case Ad8r: - printf("\tCPTR %sa = get_disp_ea(regs.a[%s]);\n", name, reg); + printf("\tCPTR %sa = get_disp_ea(m68k_areg(regs, %s));\n", name, reg); if (getv) { start_brace(); switch(size) { @@ -322,7 +332,7 @@ static void genamode(amodes mode, char * if (getv) switch(size) { case sz_byte: - printf("\tBYTE %s = nextiword();\n", name); + printf("\tBYTE %s = nextibyte();\n", name); break; case sz_word: printf("\tWORD %s = nextiword();\n", name); @@ -335,7 +345,7 @@ static void genamode(amodes mode, char * break; case imm0: if (!getv) abort(); - printf("\tBYTE %s = nextiword();\n", name); + printf("\tBYTE %s = nextibyte();\n", name); break; case imm1: if (!getv) abort(); @@ -360,13 +370,13 @@ static void genastore(char *from, amodes case Dreg: switch(size) { case sz_byte: - printf("\tregs.d[%s] = (regs.d[%s] & ~0xff) | ((%s) & 0xff);\n", reg, reg, from); + printf("\tm68k_dreg(regs, %s) = (m68k_dreg(regs, %s) & ~0xff) | ((%s) & 0xff);\n", reg, reg, from); break; case sz_word: - printf("\tregs.d[%s] = (regs.d[%s] & ~0xffff) | ((%s) & 0xffff);\n", reg, reg, from); + printf("\tm68k_dreg(regs, %s) = (m68k_dreg(regs, %s) & ~0xffff) | ((%s) & 0xffff);\n", reg, reg, from); break; case sz_long: - printf("\tregs.d[%s] = (%s);\n", reg, from); + printf("\tm68k_dreg(regs, %s) = (%s);\n", reg, from); break; default: abort(); } @@ -375,10 +385,10 @@ static void genastore(char *from, amodes switch(size) { case sz_word: fprintf(stderr, "Foo\n"); - printf("\tregs.a[%s] = (LONG)(WORD)(%s);\n", reg, from); + printf("\tm68k_areg(regs, %s) = (LONG)(WORD)(%s);\n", reg, from); break; case sz_long: - printf("\tregs.a[%s] = (%s);\n", reg, from); + printf("\tm68k_areg(regs, %s) = (%s);\n", reg, from); break; default: abort(); } @@ -448,13 +458,13 @@ static void genmovemel(UWORD opcode) printf("\tUWORD mask = nextiword(), dmask = mask & 0xff, amask = (mask >> 8) & 0xff;\n"); genamode(table68k[opcode].dmode, "dstreg", table68k[opcode].size, "src", 0, 1); start_brace(); - printf("\twhile (dmask) { regs.d[movem_index1[dmask]] = %s; srca += %d; dmask = movem_next[dmask]; }\n", + printf("\twhile (dmask) { m68k_dreg(regs, movem_index1[dmask]) = %s; srca += %d; dmask = movem_next[dmask]; }\n", getcode, size); - printf("\twhile (amask) { regs.a[movem_index1[amask]] = %s; srca += %d; amask = movem_next[amask]; }\n", + printf("\twhile (amask) { m68k_areg(regs, movem_index1[amask]) = %s; srca += %d; amask = movem_next[amask]; }\n", getcode, size); if (table68k[opcode].dmode == Aipi) - printf("\tregs.a[dstreg] = srca;\n"); + printf("\tm68k_areg(regs, dstreg) = srca;\n"); } static void genmovemle(UWORD opcode) @@ -472,17 +482,16 @@ static void genmovemle(UWORD opcode) start_brace(); if (table68k[opcode].dmode == Apdi) { printf("\tUWORD amask = mask & 0xff, dmask = (mask >> 8) & 0xff;\n"); - printf("\twhile (amask) { srca -= %d; %s regs.a[movem_index2[amask]]); amask = movem_next[amask]; }\n", + printf("\twhile (amask) { srca -= %d; %s m68k_areg(regs, movem_index2[amask])); amask = movem_next[amask]; }\n", size, putcode); - printf("\twhile (dmask) { srca -= %d; %s regs.d[movem_index2[dmask]]); dmask = movem_next[dmask]; }\n", + printf("\twhile (dmask) { srca -= %d; %s m68k_dreg(regs, movem_index2[dmask])); dmask = movem_next[dmask]; }\n", size, putcode); - printf("\tregs.a[dstreg] = srca;\n"); - } - else { + printf("\tm68k_areg(regs, dstreg) = srca;\n"); + } else { printf("\tUWORD dmask = mask & 0xff, amask = (mask >> 8) & 0xff;\n"); - printf("\twhile (dmask) { %s regs.d[movem_index1[dmask]]); srca += %d; dmask = movem_next[dmask]; }\n", + printf("\twhile (dmask) { %s m68k_dreg(regs, movem_index1[dmask])); srca += %d; dmask = movem_next[dmask]; }\n", putcode, size); - printf("\twhile (amask) { %s regs.a[movem_index1[amask]]); srca += %d; amask = movem_next[amask]; }\n", + printf("\twhile (amask) { %s m68k_areg(regs, movem_index1[amask])); srca += %d; amask = movem_next[amask]; }\n", putcode, size); } } @@ -649,19 +658,19 @@ static void genflags(flagtypes type, wor case flag_logical: if (strcmp(value, "0") == 0) { - printf("\t*(UBYTE *)®flags = 64;\n"); + printf("\t*(ULONG *)®flags = 64;\n"); } else { switch(size) { case sz_byte: - printf("\t__asm__ __volatile__(\"testb %%b1,%%b1\\n\\tpushfl\\n\\tpopl %%0\\n\\tmovw %%w0,regflags\\n\"" - ": \"=r\" (scratch) : \"r\" (%s) :\"cc\");", value); + printf("\t__asm__ __volatile__(\"testb %%b1,%%b1\\n\\tpushfl\\n\\tpopl %%0\\n\\tmovl %%0,regflags\\n\"" + ": \"=r\" (scratch) : \"q\" (%s) :\"cc\");", value); break; case sz_word: - printf("\t__asm__ __volatile__(\"testw %%w1,%%w1\\n\\tpushfl\\n\\tpopl %%0\\n\\tmovw %%w0,regflags\\n\"" + printf("\t__asm__ __volatile__(\"testw %%w1,%%w1\\n\\tpushfl\\n\\tpopl %%0\\n\\tmovl %%0,regflags\\n\"" ": \"=r\" (scratch) : \"r\" (%s) : \"cc\");", value); break; case sz_long: - printf("\t__asm__ __volatile__(\"testl %%1,%%1\\n\\tpushfl\\n\\tpopl %%0\\n\\tmovw %%w0,regflags\\n\"" + printf("\t__asm__ __volatile__(\"testl %%1,%%1\\n\\tpushfl\\n\\tpopl %%0\\n\\tmovl %%0,regflags\\n\"" ": \"=r\" (scratch) : \"r\" (%s) : \"cc\");", value); break; @@ -672,19 +681,19 @@ static void genflags(flagtypes type, wor case flag_add: switch (size) { case sz_byte: - printf("\t__asm__ __volatile__(\"addb %%b3,%%b0\\n\\tpushfl\\n\\tpopl %%1\\n\\tmovw %%w1,regflags\\n\\tmovw %%w1,regflags+2\\n\"" + printf("\t__asm__ __volatile__(\"addb %%b3,%%b0\\n\\tpushfl\\n\\tpopl %%1\\n\\tmovl %%1,regflags\\n\\tmovl %%1,regflags+4\\n\"" ": \"=&q\" (%s) : \"r\" (scratch), " " \"0\" ((BYTE)(%s)), \"qm\" ((BYTE)(%s)) : \"cc\");", value, src, dst); break; case sz_word: - printf("\t__asm__ __volatile__(\"addw %%w3,%%w0\\n\\tpushfl\\n\\tpopl %%1\\n\\tmovw %%w1,regflags\\n\\tmovw %%w1,regflags+2\\n\"" + printf("\t__asm__ __volatile__(\"addw %%w3,%%w0\\n\\tpushfl\\n\\tpopl %%1\\n\\tmovl %%1,regflags\\n\\tmovl %%1,regflags+4\\n\"" ": \"=&r\" (%s) : \"r\" (scratch), " " \"0\" ((WORD)(%s)), \"rmi\" ((WORD)(%s)) : \"cc\");", value, src, dst); break; case sz_long: - printf("\t__asm__ __volatile__(\"addl %%3,%%0\\n\\tpushfl\\n\\tpopl %%1\\n\\tmovw %%w1,regflags\\n\\tmovw %%w1,regflags+2\\n\"" + printf("\t__asm__ __volatile__(\"addl %%3,%%0\\n\\tpushfl\\n\\tpopl %%1\\n\\tmovl %%1,regflags\\n\\tmovl %%1,regflags+4\\n\"" ": \"=&r\" (%s) : \"r\" (scratch), " " \"0\" ((LONG)(%s)), \"rmi\" ((LONG)(%s)) : \"cc\");", value, src, dst); @@ -695,19 +704,19 @@ static void genflags(flagtypes type, wor case flag_sub: switch (size) { case sz_byte: - printf("\t__asm__ __volatile__(\"subb %%b2,%%b0\\n\\tpushfl\\n\\tpopl %%1\\n\\tmovw %%w1,regflags\\n\\tmovw %%w1,regflags+2\\n\"" + printf("\t__asm__ __volatile__(\"subb %%b2,%%b0\\n\\tpushfl\\n\\tpopl %%1\\n\\tmovl %%1,regflags\\n\\tmovl %%1,regflags+4\\n\"" ": \"=&q\" (%s) : \"r\" (scratch), " " \"qmi\" ((BYTE)(%s)), \"0\" ((BYTE)(%s)) : \"cc\");", value, src, dst); break; case sz_word: - printf("\t__asm__ __volatile__(\"subw %%w2,%%w0\\n\\tpushfl\\n\\tpopl %%1\\n\\tmovw %%w1,regflags\\n\\tmovw %%w1,regflags+2\\n\"" + printf("\t__asm__ __volatile__(\"subw %%w2,%%w0\\n\\tpushfl\\n\\tpopl %%1\\n\\tmovl %%1,regflags\\n\\tmovl %%1,regflags+4\\n\"" ": \"=&r\" (%s) : \"r\" (scratch), " " \"rmi\" ((WORD)(%s)), \"0\" ((WORD)(%s)) : \"cc\");", value, src, dst); break; case sz_long: - printf("\t__asm__ __volatile__(\"subl %%2,%%0\\n\\tpushfl\\n\\tpopl %%1\\n\\tmovw %%w1,regflags\\n\\tmovw %%w1,regflags+2\\n\"" + printf("\t__asm__ __volatile__(\"subl %%2,%%0\\n\\tpushfl\\n\\tpopl %%1\\n\\tmovl %%1,regflags\\n\\tmovl %%1,regflags+4\\n\"" ": \"=&r\" (%s) : \"r\" (scratch), " " \"rmi\" ((LONG)(%s)), \"0\" ((LONG)(%s)) : \"cc\");", value, src, dst); @@ -718,19 +727,19 @@ static void genflags(flagtypes type, wor case flag_cmp: switch (size) { case sz_byte: - printf("\t__asm__ __volatile__(\"cmpb %%b1,%%b2\\n\\tpushfl\\n\\tpopl %%0\\n\\tmovw %%w0,regflags\\n\"" + printf("\t__asm__ __volatile__(\"cmpb %%b1,%%b2\\n\\tpushfl\\n\\tpopl %%0\\n\\tmovl %%0,regflags\\n\"" ": : \"r\" (scratch), " " \"qmi\" ((BYTE)(%s)), \"q\" ((BYTE)(%s)) : \"cc\");", src, dst); break; case sz_word: - printf("\t__asm__ __volatile__(\"cmpw %%w1,%%w2\\n\\tpushfl\\n\\tpopl %%0\\n\\tmovw %%w0,regflags\\n\"" + printf("\t__asm__ __volatile__(\"cmpw %%w1,%%w2\\n\\tpushfl\\n\\tpopl %%0\\n\\tmovl %%0,regflags\\n\"" ": : \"r\" (scratch), " " \"rmi\" ((WORD)(%s)), \"r\" ((WORD)(%s)) : \"cc\");", src, dst); break; case sz_long: - printf("\t__asm__ __volatile__(\"cmpl %%1,%%2\\n\\tpushfl\\n\\tpopl %%0\\n\\tmovw %%w0,regflags\\n\"" + printf("\t__asm__ __volatile__(\"cmpl %%1,%%2\\n\\tpushfl\\n\\tpopl %%0\\n\\tmovl %%0,regflags\\n\"" ": : \"r\" (scratch), " " \"rmi\" ((LONG)(%s)), \"r\" ((LONG)(%s)) : \"cc\");", src, dst); @@ -738,6 +747,156 @@ static void genflags(flagtypes type, wor } return; } +#elif defined(M68K_FLAG_OPT) +/* + * sam: This is different from 0.6.3. Might be buggy! + */ + switch (type) { + case flag_logical: + case flag_av: + case flag_sv: + case flag_zn: + case flag_addx: + case flag_subx: + break; + + case flag_add: + case flag_sub: + case flag_cmp: + start_brace(); + printf("\tULONG %s;\n", value); + break; + } + + switch(type) { + case flag_av: + case flag_sv: + case flag_zn: + case flag_addx: + case flag_subx: + /* normal code: genflags_normal() */ + break; + + case flag_logical: + if (strcmp(value, "0") == 0) { + /* v=c=n=0 z=1 */ + printf("\t*(UWORD*)®flags = 4;\n"); + } else { + printf("\t{\n"); + switch(size) { + case sz_byte: + printf("\t__asm__(\"tstb %%0\\n\\tmovw ccr,_regflags\"" + ": " + ": \"dmi\" ((BYTE)(%s)) : \"cc\");\n",value); + break; + case sz_word: + printf("\t__asm__(\"tstw %%0\\n\\tmovw ccr,_regflags\"" + ": " + ": \"dmi\" ((WORD)(%s)) : \"cc\");\n",value); + break; + case sz_long: + printf("\t__asm__(\"tstl %%0\\n\\tmovw ccr,_regflags\"" + ": " + ": \"dmi\" ((LONG)(%s)) : \"cc\");\n",value); + break; + } + printf("\t}\n"); + } + return; + + case flag_add: + printf("\t{UWORD ccr;\n"); + switch (size) { + case sz_byte: + printf("\t__asm__(\"addb %%3,%%1\\n\\tmovw ccr,%%0\"" + ": \"=d\" (ccr), \"=&d\" ((BYTE)(%s))" + ": \"1\" ((BYTE)(%s)), \"dmi\" ((BYTE)(%s)) : \"cc\");\n", + value, src, dst); + break; + case sz_word: + printf("\t__asm__(\"addw %%3,%%1\\n\\tmovw ccr,%%0\"" + ": \"=d\" (ccr), \"=&d\" ((WORD)(%s))" + ": \"1\" ((WORD)(%s)), \"dmi\" ((WORD)(%s)) : \"cc\");\n", + value, src, dst); + break; + case sz_long: + printf("\t__asm__(\"addl %%3,%%1\\n\\tmovw ccr,%%0\"" + ": \"=d\" (ccr), \"=&d\" ((LONG)(%s))" + ": \"1\" ((LONG)(%s)), \"dmi\" ((LONG)(%s)) : \"cc\");\n", + value, src, dst); + break; + } + printf("\t((UWORD*)®flags)[1] = ((UWORD*)®flags)[0] = ccr;}\n"); + return; + + case flag_sub: + printf("\t{UWORD ccr;\n"); + switch (size) { + case sz_byte: + if(strcmp(dst,"0")!=0) + printf("\t__asm__(\"subb %%2,%%1\\n\\tmovw ccr,%%0\"" + ": \"=d\" (ccr), \"=&d\" ((BYTE)(%s)) " + ": \"dmi\" ((BYTE)(%s)), \"1\" ((BYTE)(%s)) : \"cc\");\n", + value, src, dst); + else + printf("\t__asm__(\"negb %%1\\n\\tmovw ccr,%%0\"" + ": \"=d\" (ccr), \"=&d\" ((BYTE)(%s)) " + ": \"1\" ((BYTE)(%s)) : \"cc\");\n", + value, src); + break; + case sz_word: + if(strcmp(dst,"0")!=0) + printf("\t__asm__(\"subw %%2,%%1\\n\\tmovw ccr,%%0\"" + ": \"=d\" (ccr), \"=&d\" ((WORD)(%s)) " + ": \"dmi\" ((WORD)(%s)), \"1\" ((WORD)(%s)) : \"cc\");\n", + value, src, dst); + else + printf("\t__asm__(\"negw %%1\\n\\tmovw ccr,%%0\"" + ": \"=d\" (ccr), \"=&d\" ((WORD)(%s)) " + ": \"1\" ((WORD)(%s)) : \"cc\");\n", + value, src); + break; + case sz_long: + if(strcmp(dst,"0")!=0) + printf("\t__asm__(\"subl %%2,%%1\\n\\tmovw ccr,%%0\"" + ": \"=d\" (ccr), \"=&d\" ((LONG)(%s)) " + ": \"dmi\" ((LONG)(%s)), \"1\" ((LONG)(%s)) : \"cc\");\n", + value, src, dst); + else + printf("\t__asm__(\"negl %%1\\n\\tmovw ccr,%%0\"" + ": \"=d\" (ccr), \"=&d\" ((LONG)(%s)) " + ": \"1\" ((LONG)(%s)) : \"cc\");\n", + value, src); + break; + } + printf("\t((UWORD*)®flags)[1] = ((UWORD*)®flags)[0] = ccr;}\n"); + return; + + case flag_cmp: + printf("\t{\n"); + switch (size) { + case sz_byte: + printf("\t__asm__(\"cmpb %%0,%%1\\n\\tmovw ccr,_regflags\"" + ": " + ": \"dmi\" ((BYTE)(%s)), \"d\" ((BYTE)(%s)) : \"cc\");\n", + src, dst); + break; + case sz_word: + printf("\t__asm__(\"cmpw %%0,%%1\\n\\tmovw ccr,_regflags\"" + ": " + ": \"dmi\" ((WORD)(%s)), \"d\" ((WORD)(%s)) : \"cc\");\n", + src, dst); + break; + case sz_long: + printf("\t__asm__(\"cmpl %%0,%%1\\n\\tmovw ccr,_regflags\"" + ": " + ": \"dmi\" ((LONG)(%s)), \"d\" ((LONG)(%s)) : \"cc\");\n", + src, dst); + break; + } + printf("\t}\n"); + return; + } #endif genflags_normal(type, size, value, src, dst); } @@ -998,7 +1157,7 @@ static void gen_opcode(unsigned long int * weird things... */ case i_MVPRM: genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); - printf("\tCPTR memp = regs.a[dstreg] + nextiword();\n"); + printf("\tCPTR memp = m68k_areg(regs, dstreg) + nextiword();\n"); if (table68k[opcode].size == sz_word) { printf("\tput_byte(memp, src >> 8); put_byte(memp + 2, src);\n"); } else { @@ -1007,7 +1166,7 @@ static void gen_opcode(unsigned long int } break; case i_MVPMR: - printf("\tCPTR memp = regs.a[srcreg] + nextiword();\n"); + printf("\tCPTR memp = m68k_areg(regs, srcreg) + nextiword();\n"); genamode(table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 0, 0); if (table68k[opcode].size == sz_word) { printf("\tUWORD val = (get_byte(memp) << 8) + get_byte(memp + 2);\n"); @@ -1122,11 +1281,11 @@ static void gen_opcode(unsigned long int printf("\tnewsr = sr; newpc = pc;\n"); printf("\tif ((format & 0xF000) == 0x0000) { break; }\n"); printf("\telse if ((format & 0xF000) == 0x1000) { ; }\n"); - printf("\telse if ((format & 0xF000) == 0x2000) { regs.a[7] += 4; break; }\n"); - printf("\telse if ((format & 0xF000) == 0x8000) { regs.a[7] += 50; break; }\n"); - printf("\telse if ((format & 0xF000) == 0x9000) { regs.a[7] += 12; break; }\n"); - printf("\telse if ((format & 0xF000) == 0xa000) { regs.a[7] += 24; break; }\n"); - printf("\telse if ((format & 0xF000) == 0xb000) { regs.a[7] += 84; break; }\n"); + printf("\telse if ((format & 0xF000) == 0x2000) { m68k_areg(regs, 7) += 4; break; }\n"); + printf("\telse if ((format & 0xF000) == 0x8000) { m68k_areg(regs, 7) += 50; break; }\n"); + printf("\telse if ((format & 0xF000) == 0x9000) { m68k_areg(regs, 7) += 12; break; }\n"); + printf("\telse if ((format & 0xF000) == 0xa000) { m68k_areg(regs, 7) += 24; break; }\n"); + printf("\telse if ((format & 0xF000) == 0xb000) { m68k_areg(regs, 7) += 84; break; }\n"); printf("\telse { Exception(14,0); return; }\n"); printf("\tregs.sr = newsr; MakeFromSR();\n}\n"); pop_braces (old_brace_level); @@ -1135,33 +1294,34 @@ static void gen_opcode(unsigned long int } break; case i_RTD: + printf("\tcompiler_flush_jsr_stack();\n"); genamode(Aipi, "7", sz_long, "pc", 1, 0); genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "offs", 1, 0); - printf("\tregs.a[7] += offs;\n"); + printf("\tm68k_areg(regs, 7) += offs;\n"); printf("\tm68k_setpc_rte(pc);\n"); break; case i_LINK: genamode(Apdi, "7", sz_long, "old", 0, 0); genamode(table68k[opcode].smode, "srcreg", sz_long, "src", 1, 0); genastore("src", Apdi, "7", sz_long, "old"); - genastore("regs.a[7]", table68k[opcode].smode, "srcreg", sz_long, "src"); + genastore("m68k_areg(regs, 7)", table68k[opcode].smode, "srcreg", sz_long, "src"); genamode(table68k[opcode].dmode, "dstreg", table68k[opcode].size, "offs", 1, 0); - printf("\tregs.a[7] += offs;\n"); + printf("\tm68k_areg(regs, 7) += offs;\n"); break; case i_UNLK: genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); - printf("\tregs.a[7] = src;\n"); + printf("\tm68k_areg(regs, 7) = src;\n"); genamode(Aipi, "7", sz_long, "old", 1, 0); genastore("old", table68k[opcode].smode, "srcreg", table68k[opcode].size, "src"); break; case i_RTS: - genamode(Aipi, "7", sz_long, "pc", 1, 0); - printf("\tm68k_setpc(pc);\n"); + printf("\tm68k_do_rts();\n"); break; case i_TRAPV: printf("\tif(VFLG) Exception(7,m68k_getpc()-2);\n"); break; - case i_RTR: + case i_RTR: + printf("\tcompiler_flush_jsr_stack();\n"); printf("\tMakeSR();\n"); genamode(Aipi, "7", sz_word, "sr", 1, 0); genamode(Aipi, "7", sz_long, "pc", 1, 0); @@ -1171,9 +1331,7 @@ static void gen_opcode(unsigned long int break; case i_JSR: genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 0, 0); - genamode(Apdi, "7", sz_long, "sp", 0, 0); - genastore("m68k_getpc()", Apdi, "7", sz_long, "sp"); - printf("\tm68k_setpc(srca);\n"); + printf("\tm68k_do_jsr(srca);\n"); break; case i_JMP: genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 0, 0); @@ -1181,24 +1339,16 @@ static void gen_opcode(unsigned long int break; /* Put on your cool #ifdef shades... */ case i_BSR: -#if defined(USE_POINTER) && !defined(USE_COMPILER) +#if defined(USE_POINTER) printf("\tchar *oldpcp = (char *)regs.pc_p;\n"); + genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); + printf("\tLONG s = (LONG)src - (((char *)regs.pc_p) - oldpcp);\n"); #else printf("\tULONG oldpc = m68k_getpc();\n"); -#endif genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); - genamode(Apdi, "7", sz_long, "sp", 0, 0); - genastore("m68k_getpc()", Apdi, "7", sz_long, "sp"); -#ifdef USE_COMPILER - printf("\tm68k_setpc(oldpc + (LONG)src);\n"); -#elif defined(USE_POINTER) - printf("\tregs.pc_p = (UBYTE *)(oldpcp + (LONG)src);\n"); -#else - printf("\tregs.pc = oldpc + (LONG)src;\n"); -#endif -#ifndef NO_EXCEPTION_3 - printf("\tif (src & 1) Exception(3,0);\n"); + printf("\tLONG s = (LONG)src - (m68k_getpc() - oldpc);\n"); #endif + printf("\tm68k_do_bsr(s);\n"); break; case i_Bcc: #if defined(USE_POINTER) && !defined(USE_COMPILER) @@ -1316,7 +1466,7 @@ static void gen_opcode(unsigned long int printf("\tCPTR oldpc = m68k_getpc();\n"); genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "extra", 1, 0); genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 0, 0); - printf("\t{LONG upper,lower,reg = extra & 0x8000 ? regs.a[(extra >> 12) & 7] : regs.d[(extra >> 12) & 7];\n"); + printf("\t{LONG upper,lower,reg = regs.regs[(extra >> 12) & 15];\n"); switch (table68k[opcode].size) { case sz_byte: printf("\tlower=(LONG)(BYTE)get_byte(dsta); upper = (LONG)(BYTE)get_byte(dsta+1);\n"); printf("\tif ((extra & 0x8000) == 0) reg = (LONG)(BYTE)reg;\n"); @@ -1745,15 +1895,15 @@ static void gen_opcode(unsigned long int case i_MOVEC2: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); start_brace(); - printf("\tint regno = (src >> 12) & 7;\n"); - printf("\tULONG *regp = src & 0x8000 ? regs.a + regno : regs.d + regno;\n"); + printf("\tint regno = (src >> 12) & 15;\n"); + printf("\tULONG *regp = regs.regs + regno;\n"); printf("\tm68k_movec2(src & 0xFFF, regp);\n"); break; case i_MOVE2C: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); start_brace(); - printf("\tint regno = (src >> 12) & 7;\n"); - printf("\tULONG *regp = src & 0x8000 ? regs.a + regno : regs.d + regno;\n"); + printf("\tint regno = (src >> 12) & 15;\n"); + printf("\tULONG *regp = regs.regs + regno;\n"); printf("\tm68k_move2c(src & 0xFFF, regp);\n"); break; case i_CAS: @@ -1764,51 +1914,51 @@ static void gen_opcode(unsigned long int start_brace(); printf("\tint ru = (src >> 6) & 7;\n"); printf("\tint rc = src & 7;\n"); - genflags(flag_cmp, table68k[opcode].size, "newv", "regs.d[rc]", "dst"); + genflags(flag_cmp, table68k[opcode].size, "newv", "m68k_dreg(regs, rc)", "dst"); printf("\tif (ZFLG)"); old_brace_level = n_braces; start_brace (); - genastore("(regs.d[ru])",table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst"); + genastore("(m68k_dreg(regs, ru))",table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst"); pop_braces (old_brace_level); printf("else"); start_brace (); - printf("regs.d[rc] = dst;\n"); + printf("m68k_dreg(regs, rc) = dst;\n"); pop_braces (old_brace_level); } break; case i_CAS2: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "extra", 1, 0); - printf("\tULONG rn1 = extra & 0x80000000 ? regs.a[(extra >> 28) & 7] : regs.d[(extra >> 28) & 7];\n"); - printf("\tULONG rn2 = extra & 0x8000 ? regs.a[(extra >> 12) & 7] : regs.d[(extra >> 12) & 7];\n"); + printf("\tULONG rn1 = regs.regs[(extra >> 28) & 7];\n"); + printf("\tULONG rn2 = regs.regs[(extra >> 12) & 7];\n"); if (table68k[opcode].size == sz_word) { int old_brace_level = n_braces; printf("\tUWORD dst1 = get_word(rn1), dst2 = get_word(rn2);\n"); - genflags(flag_cmp, table68k[opcode].size, "newv", "regs.d[(extra >> 16) & 7]", "dst1"); + genflags(flag_cmp, table68k[opcode].size, "newv", "m68k_dreg(regs, (extra >> 16) & 7)", "dst1"); printf("\tif (ZFLG) {\n"); - genflags(flag_cmp, table68k[opcode].size, "newv", "regs.d[extra & 7]", "dst2"); + genflags(flag_cmp, table68k[opcode].size, "newv", "m68k_dreg(regs, extra & 7)", "dst2"); printf("\tif (ZFLG) {\n"); - printf("\tput_word(rn1,regs.d[(extra >> 22) & 7]);\n"); - printf("\tput_word(rn1,regs.d[(extra >> 6) & 7]);\n"); + printf("\tput_word(rn1, m68k_dreg(regs, (extra >> 22) & 7));\n"); + printf("\tput_word(rn1, m68k_dreg(regs, (extra >> 6) & 7));\n"); printf("\t}}\n"); pop_braces (old_brace_level); printf("\tif (!ZFLG) {\n"); - printf("\tregs.d[(extra >> 22) & 7] = (regs.d[(extra >> 22) & 7] & ~0xffff) | (dst1 & 0xffff);\n"); - printf("\tregs.d[(extra >> 6) & 7] = (regs.d[(extra >> 6) & 7] & ~0xffff) | (dst2 & 0xffff);\n"); + printf("\tm68k_dreg(regs, (extra >> 22) & 7) = (m68k_dreg(regs, (extra >> 22) & 7) & ~0xffff) | (dst1 & 0xffff);\n"); + printf("\tm68k_dreg(regs, (extra >> 6) & 7) = (m68k_dreg(regs, (extra >> 6) & 7) & ~0xffff) | (dst2 & 0xffff);\n"); printf("\t}\n"); } else { int old_brace_level = n_braces; printf("\tULONG dst1 = get_long(rn1), dst2 = get_long(rn2);\n"); - genflags(flag_cmp, table68k[opcode].size, "newv", "regs.d[(extra >> 16) & 7]", "dst1"); + genflags(flag_cmp, table68k[opcode].size, "newv", "m68k_dreg(regs, (extra >> 16) & 7)", "dst1"); printf("\tif (ZFLG) {\n"); - genflags(flag_cmp, table68k[opcode].size, "newv", "regs.d[extra & 7]", "dst2"); + genflags(flag_cmp, table68k[opcode].size, "newv", "m68k_dreg(regs, extra & 7)", "dst2"); printf("\tif (ZFLG) {\n"); - printf("\tput_long(rn1,regs.d[(extra >> 22) & 7]);\n"); - printf("\tput_long(rn1,regs.d[(extra >> 6) & 7]);\n"); + printf("\tput_long(rn1, m68k_dreg(regs, (extra >> 22) & 7));\n"); + printf("\tput_long(rn1, m68k_dreg(regs, (extra >> 6) & 7));\n"); printf("\t}}\n"); pop_braces (old_brace_level); printf("\tif (!ZFLG) {\n"); - printf("\tregs.d[(extra >> 22) & 7] = dst1;\n"); - printf("\tregs.d[(extra >> 6) & 7] = dst2;\n"); + printf("\tm68k_dreg(regs, (extra >> 22) & 7) = dst1;\n"); + printf("\tm68k_dreg(regs, (extra >> 6) & 7) = dst2;\n"); printf("\t}\n"); } break; @@ -1819,7 +1969,7 @@ static void gen_opcode(unsigned long int printf("\tif (extra & 0x800)\n"); old_brace_level = n_braces; start_brace (); - printf("\tULONG src = (extra & 0x8000) ? regs.a[(extra >> 12) & 7] : regs.d[(extra >> 12) & 7];\n"); + printf("\tULONG src = regs.regs[(extra >> 12) & 15];\n"); genamode(table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 0, 0); genastore("src", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst"); pop_braces (old_brace_level); @@ -1828,9 +1978,9 @@ static void gen_opcode(unsigned long int genamode(table68k[opcode].dmode, "dstreg", table68k[opcode].size, "src", 1, 0); printf("\tif (extra & 0x8000) {\n"); switch(table68k[opcode].size) { - case sz_byte: printf("\tregs.a[(extra >> 12) & 7] = (LONG)(BYTE)src;\n"); break; - case sz_word: printf("\tregs.a[(extra >> 12) & 7] = (LONG)(WORD)src;\n"); break; - case sz_long: printf("\tregs.a[(extra >> 12) & 7] = src;\n"); break; + case sz_byte: printf("\tm68k_areg(regs, (extra >> 12) & 7) = (LONG)(BYTE)src;\n"); break; + case sz_word: printf("\tm68k_areg(regs, (extra >> 12) & 7) = (LONG)(WORD)src;\n"); break; + case sz_long: printf("\tm68k_areg(regs, (extra >> 12) & 7) = src;\n"); break; default: abort(); } printf("\t} else {\n"); @@ -1876,10 +2026,10 @@ static void gen_opcode(unsigned long int genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "extra", 1, 0); genamode (table68k[opcode].dmode, "dstreg", sz_long, "dst", 0, 0); start_brace(); - printf("\tLONG offset = extra & 0x800 ? regs.d[(extra >> 6) & 7] : (extra >> 6) & 0x1f;\n"); - printf("\tint width = (((extra & 0x20 ? regs.d[extra & 7] : extra) -1) & 0x1f) +1;\n"); + printf("\tLONG offset = extra & 0x800 ? m68k_dreg(regs, (extra >> 6) & 7) : (extra >> 6) & 0x1f;\n"); + printf("\tint width = (((extra & 0x20 ? m68k_dreg(regs, extra & 7) : extra) -1) & 0x1f) +1;\n"); if (table68k[opcode].dmode == Dreg) { - printf("\tULONG tmp = regs.d[dstreg] << (offset & 0x1f);\n"); + printf("\tULONG tmp = m68k_dreg(regs, dstreg) << (offset & 0x1f);\n"); } else { printf("\tULONG tmp,bf0,bf1;\n"); @@ -1893,14 +2043,14 @@ static void gen_opcode(unsigned long int case i_BFTST: break; case i_BFEXTU: - printf("\tregs.d[(extra >> 12) & 7] = tmp;\n"); + printf("\tm68k_dreg(regs, (extra >> 12) & 7) = tmp;\n"); break; case i_BFCHG: printf("\ttmp = ~tmp;\n"); break; case i_BFEXTS: printf("\tif (NFLG) tmp |= width == 32 ? 0 : (-1 << width);\n"); - printf("\tregs.d[(extra >> 12) & 7] = tmp;\n"); + printf("\tm68k_dreg(regs, (extra >> 12) & 7) = tmp;\n"); break; case i_BFCLR: printf("\ttmp = 0;\n"); @@ -1908,13 +2058,13 @@ static void gen_opcode(unsigned long int case i_BFFFO: printf("\t{ ULONG mask = 1 << (width-1);\n"); printf("\twhile (mask) { if (tmp & mask) break; mask >>= 1; offset++; }}\n"); - printf("\tregs.d[(extra >> 12) & 7] = offset;\n"); + printf("\tm68k_dreg(regs, (extra >> 12) & 7) = offset;\n"); break; case i_BFSET: printf("\ttmp = 0xffffffff;\n"); break; case i_BFINS: - printf("\ttmp = regs.d[(extra >> 12) & 7];\n"); + printf("\ttmp = m68k_dreg(regs, (extra >> 12) & 7);\n"); break; default: break; @@ -1925,11 +2075,11 @@ static void gen_opcode(unsigned long int table68k[opcode].mnemo == i_BFINS) { printf("\ttmp <<= (32 - width);\n"); if (table68k[opcode].dmode == Dreg) { - printf("\tregs.d[dstreg] = (regs.d[dstreg] & ((offset & 0x1f) == 0 ? 0 :\n"); + printf("\tm68k_dreg(regs, dstreg) = (m68k_dreg(regs, dstreg) & ((offset & 0x1f) == 0 ? 0 :\n"); printf("\t\t(0xffffffff << (32 - (offset & 0x1f))))) |\n"); printf("\t\t(tmp >> (offset & 0x1f)) |\n"); printf("\t\t(((offset & 0x1f) + width) >= 32 ? 0 :\n"); - printf(" (regs.d[dstreg] & ((ULONG)0xffffffff >> ((offset & 0x1f) + width))));\n"); + printf(" (m68k_dreg(regs, dstreg) & ((ULONG)0xffffffff >> ((offset & 0x1f) + width))));\n"); } else { printf("\tbf0 = (bf0 & (0xff000000 << (8 - (offset & 7)))) |\n"); @@ -1947,34 +2097,34 @@ static void gen_opcode(unsigned long int break; case i_PACK: if (table68k[opcode].smode == Dreg) { - printf("\tUWORD val = regs.d[srcreg] + nextiword();\n"); - printf("\tregs.d[dstreg] = (regs.d[dstreg] & 0xffffff00) | ((val >> 4) & 0xf0) | (val & 0xf);\n"); + printf("\tUWORD val = m68k_dreg(regs, srcreg) + nextiword();\n"); + printf("\tm68k_dreg(regs, dstreg) = (m68k_dreg(regs, dstreg) & 0xffffff00) | ((val >> 4) & 0xf0) | (val & 0xf);\n"); } else { printf("\tUWORD val;\n"); - printf("\tregs.a[srcreg] -= areg_byteinc[srcreg];\n"); - printf("\tval = (UWORD)get_byte(regs.a[srcreg]);\n"); - printf("\tregs.a[srcreg] -= areg_byteinc[srcreg];\n"); - printf("\tval = (val | ((UWORD)get_byte(regs.a[srcreg]) << 8)) + nextiword();\n"); - printf("\tregs.a[dstreg] -= areg_byteinc[dstreg];\n"); - printf("\tput_byte(regs.a[dstreg],((val >> 4) & 0xf0) | (val & 0xf));\n"); + printf("\tm68k_areg(regs, srcreg) -= areg_byteinc[srcreg];\n"); + printf("\tval = (UWORD)get_byte(m68k_areg(regs, srcreg));\n"); + printf("\tm68k_areg(regs, srcreg) -= areg_byteinc[srcreg];\n"); + printf("\tval = (val | ((UWORD)get_byte(m68k_areg(regs, srcreg)) << 8)) + nextiword();\n"); + printf("\tm68k_areg(regs, dstreg) -= areg_byteinc[dstreg];\n"); + printf("\tput_byte(m68k_areg(regs, dstreg),((val >> 4) & 0xf0) | (val & 0xf));\n"); } break; case i_UNPK: if (table68k[opcode].smode == Dreg) { - printf("\tUWORD val = regs.d[srcreg];\n"); + printf("\tUWORD val = m68k_dreg(regs, srcreg);\n"); printf("\tval = (((val << 4) & 0xf00) | (val & 0xf)) + nextiword();\n"); - printf("\tregs.d[dstreg] = (regs.d[dstreg] & 0xffff0000) | (val & 0xffff);\n"); + printf("\tm68k_dreg(regs, dstreg) = (m68k_dreg(regs, dstreg) & 0xffff0000) | (val & 0xffff);\n"); } else { printf("\tUWORD val;\n"); - printf("\tregs.a[srcreg] -= areg_byteinc[srcreg];\n"); - printf("\tval = (UWORD)get_byte(regs.a[srcreg]);\n"); + printf("\tm68k_areg(regs, srcreg) -= areg_byteinc[srcreg];\n"); + printf("\tval = (UWORD)get_byte(m68k_areg(regs, srcreg));\n"); printf("\tval = (((val << 4) & 0xf00) | (val & 0xf)) + nextiword();\n"); - printf("\tregs.a[dstreg] -= areg_byteinc[dstreg];\n"); - printf("\tput_byte(regs.a[dstreg],val);\n"); - printf("\tregs.a[dstreg] -= areg_byteinc[dstreg];\n"); - printf("\tput_byte(regs.a[dstreg],val >> 8);\n"); + printf("\tm68k_areg(regs, dstreg) -= areg_byteinc[dstreg];\n"); + printf("\tput_byte(m68k_areg(regs, dstreg),val);\n"); + printf("\tm68k_areg(regs, dstreg) -= areg_byteinc[dstreg];\n"); + printf("\tput_byte(m68k_areg(regs, dstreg),val >> 8);\n"); } break; case i_TAS: @@ -2035,10 +2185,14 @@ static void generate_func(long int from, printf("#include \"sysdeps.h\"\n"); printf("#include \"config.h\"\n"); printf("#include \"options.h\"\n"); + printf("#include \"machdep/m68k.h\"\n"); printf("#include \"memory.h\"\n"); printf("#include \"custom.h\"\n"); + printf("#include \"readcpu.h\"\n"); printf("#include \"newcpu.h\"\n"); + printf("#include \"compiler.h\"\n"); printf("#include \"cputbl.h\"\n"); + printf("#if !defined (MEMFUNCS_DIRECT_REQUESTED) || defined (DIRECT_MEMFUNCS_SUCCESSFUL)\n"); for(opcode=from; opcode < to; opcode++) { if (table68k[opcode].mnemo == i_ILLG) { illg++; @@ -2049,7 +2203,7 @@ static void generate_func(long int from, break; } if (isspecific(opcode)) { - printf("void op_%lx_s(ULONG opcode) /* %s */\n{\n", opcode, lookuptab[i].name); + printf("void REGPARAM2 CPU_OP_NAME(_%lx) ## _s(ULONG opcode) /* %s */\n{\n", opcode, lookuptab[i].name); if (table68k[opcode].suse && table68k[opcode].smode != imm && table68k[opcode].smode != imm0 && table68k[opcode].smode != imm1 && table68k[opcode].smode != imm2 @@ -2098,7 +2252,7 @@ static void generate_func(long int from, } dmsk = 7; - printf("void op_%lx(ULONG opcode) /* %s */\n{\n", opcode, lookuptab[i].name); + printf("void REGPARAM2 CPU_OP_NAME(_%lx)(ULONG opcode) /* %s */\n{\n", opcode, lookuptab[i].name); if (table68k[opcode].suse && table68k[opcode].smode != imm && table68k[opcode].smode != imm0 && table68k[opcode].smode != imm1 && table68k[opcode].smode != imm2 @@ -2147,7 +2301,7 @@ static void generate_func(long int from, gen_opcode(opcode); printf("}\n"); } - + printf("#endif\n"); fprintf (stderr, "%d illegals generated.\n", illg); } @@ -2160,27 +2314,31 @@ static void generate_table(void) printf("#include \"sysdeps.h\"\n"); printf("#include \"config.h\"\n"); printf("#include \"options.h\"\n"); + printf("#include \"machdep/m68k.h\"\n"); printf("#include \"memory.h\"\n"); printf("#include \"custom.h\"\n"); + printf("#include \"readcpu.h\"\n"); printf("#include \"newcpu.h\"\n"); + printf("#include \"compiler.h\"\n"); printf("#include \"cputbl.h\"\n"); - printf("cpuop_func *cpufunctbl[65536] = {\n"); + printf("#if !defined (MEMFUNCS_DIRECT_REQUESTED) || defined (DIRECT_MEMFUNCS_SUCCESSFUL)\n"); + printf("cpuop_func *CPU_OP_NAME(_functbl)[65536] = {\n"); for(opcode=0; opcode < 65536; opcode++) { if (table68k[opcode].mnemo == i_ILLG) { printf("op_illg"); illg++; } else if (isspecific(opcode)) - printf("op_%lx_s", opcode); + printf("CPU_OP_NAME(_%lx) ## _s", opcode); else if (table68k[opcode].handler != -1) - printf("op_%lx", table68k[opcode].handler); + printf("CPU_OP_NAME(_%lx)", table68k[opcode].handler); else - printf("op_%lx", opcode); + printf("CPU_OP_NAME(_%lx)", opcode); if (opcode < 65535) printf(","); if ((opcode & 7) == 7) printf("\n"); } - printf("\n};\n"); + printf("\n};\n#endif\n"); fprintf (stderr, "%d illegals generated.\n", illg); if (get_no_mismatches()) fprintf(stderr, "%d mismatches.\n", get_no_mismatches()); @@ -2195,12 +2353,16 @@ static void generate_smalltable(void) printf("#include \"sysdeps.h\"\n"); printf("#include \"config.h\"\n"); printf("#include \"options.h\"\n"); + printf("#include \"machdep/m68k.h\"\n"); printf("#include \"memory.h\"\n"); printf("#include \"custom.h\"\n"); + printf("#include \"readcpu.h\"\n"); printf("#include \"newcpu.h\"\n"); + printf("#include \"compiler.h\"\n"); printf("#include \"cputbl.h\"\n"); - printf("struct cputbl smallcputbl[] = {\n"); + printf("struct cputbl CPU_OP_NAME(_smalltbl)[] = {\n"); + printf("#if !defined (MEMFUNCS_DIRECT_REQUESTED) || defined (DIRECT_MEMFUNCS_SUCCESSFUL)\n"); for(opcode=0; opcode < 65536; opcode++) { if ((isspecific(opcode) || table68k[opcode].handler == -1) && table68k[opcode].mnemo != i_ILLG) @@ -2210,12 +2372,12 @@ static void generate_smalltable(void) break; } if (isspecific(opcode)) - printf("{ op_%lx_s, 1, %ld }, /* %s */\n", opcode, opcode, lookuptab[i].name); + printf("{ CPU_OP_NAME(_%lx) ## _s, 1, %ld }, /* %s */\n", opcode, opcode, lookuptab[i].name); if (table68k[opcode].handler == -1) - printf("{ op_%lx, 0, %ld }, /* %s */\n", opcode, opcode, lookuptab[i].name); + printf("{ CPU_OP_NAME(_%lx), 0, %ld }, /* %s */\n", opcode, opcode, lookuptab[i].name); } } - printf("{ 0, 0, 0 }};\n"); + printf("#endif\n{ 0, 0, 0 }};\n"); } static void generate_header(void) @@ -2223,19 +2385,21 @@ static void generate_header(void) int illg = 0; long int opcode; + printf("#if !defined (MEMFUNCS_DIRECT_REQUESTED) || defined (DIRECT_MEMFUNCS_SUCCESSFUL)\n"); for(opcode=0; opcode < 65536; opcode++) { if (table68k[opcode].mnemo == i_ILLG) { illg++; continue; } if (isspecific(opcode)) - printf("extern cpuop_func op_%lx_s;\n", opcode); + printf("extern cpuop_func CPU_OP_NAME(_%lx) ## _s;\n", opcode); if (table68k[opcode].handler != -1) continue; - printf("extern cpuop_func op_%lx;\n", opcode); + printf("extern cpuop_func CPU_OP_NAME(_%lx);\n", opcode); } + printf("#endif\n"); fprintf (stderr, "%d illegals generated.\n", illg); if (get_no_mismatches()) fprintf(stderr, "%d mismatches.\n", get_no_mismatches());