M740 fixes (mostly related to 6563dfe9cf)

This commit is contained in:
AJR 2022-09-06 22:09:36 -04:00
parent 807c0a050f
commit 7b2aae2fd6
2 changed files with 26 additions and 26 deletions

View File

@ -90,37 +90,37 @@ void m740_device::do_sbc_dt(uint8_t val)
{ {
uint8_t c = P & F_C ? 0 : 1; uint8_t c = P & F_C ? 0 : 1;
P &= ~(F_N|F_V|F_Z|F_C); P &= ~(F_N|F_V|F_Z|F_C);
uint16_t diff = TMP2 - val - c; uint16_t diff = TMP - val - c;
uint8_t al = (TMP2 & 15) - (val & 15) - c; uint8_t al = (TMP & 15) - (val & 15) - c;
if(int8_t(al) < 0) if(int8_t(al) < 0)
al -= 6; al -= 6;
uint8_t ah = (TMP2 >> 4) - (val >> 4) - (int8_t(al) < 0); uint8_t ah = (TMP >> 4) - (val >> 4) - (int8_t(al) < 0);
if(!uint8_t(diff)) if(!uint8_t(diff))
P |= F_Z; P |= F_Z;
else if(diff & 0x80) else if(diff & 0x80)
P |= F_N; P |= F_N;
if((TMP2^val) & (TMP2^diff) & 0x80) if((TMP^val) & (TMP^diff) & 0x80)
P |= F_V; P |= F_V;
if(!(diff & 0xff00)) if(!(diff & 0xff00))
P |= F_C; P |= F_C;
if(int8_t(ah) < 0) if(int8_t(ah) < 0)
ah -= 6; ah -= 6;
TMP2 = (ah << 4) | (al & 15); TMP = (ah << 4) | (al & 15);
} }
void m740_device::do_sbc_ndt(uint8_t val) void m740_device::do_sbc_ndt(uint8_t val)
{ {
uint16_t diff = TMP2 - val - (P & F_C ? 0 : 1); uint16_t diff = TMP - val - (P & F_C ? 0 : 1);
P &= ~(F_N|F_V|F_Z|F_C); P &= ~(F_N|F_V|F_Z|F_C);
if(!uint8_t(diff)) if(!uint8_t(diff))
P |= F_Z; P |= F_Z;
else if(int8_t(diff) < 0) else if(int8_t(diff) < 0)
P |= F_N; P |= F_N;
if((TMP2^val) & (TMP2^diff) & 0x80) if((TMP^val) & (TMP^diff) & 0x80)
P |= F_V; P |= F_V;
if(!(diff & 0xff00)) if(!(diff & 0xff00))
P |= F_C; P |= F_C;
TMP2 = diff; TMP = diff;
} }
void m740_device::do_sbct(uint8_t val) void m740_device::do_sbct(uint8_t val)
@ -135,37 +135,37 @@ void m740_device::do_adc_dt(uint8_t val)
{ {
uint8_t c = P & F_C ? 1 : 0; uint8_t c = P & F_C ? 1 : 0;
P &= ~(F_N|F_V|F_Z|F_C); P &= ~(F_N|F_V|F_Z|F_C);
uint8_t al = (TMP2 & 15) + (val & 15) + c; uint8_t al = (TMP & 15) + (val & 15) + c;
if(al > 9) if(al > 9)
al += 6; al += 6;
uint8_t ah = (TMP2 >> 4) + (val >> 4) + (al > 15); uint8_t ah = (TMP >> 4) + (val >> 4) + (al > 15);
if(!uint8_t(TMP2 + val + c)) if(!uint8_t(TMP + val + c))
P |= F_Z; P |= F_Z;
else if(ah & 8) else if(ah & 8)
P |= F_N; P |= F_N;
if(~(TMP2^val) & (TMP2^(ah << 4)) & 0x80) if(~(TMP^val) & (TMP^(ah << 4)) & 0x80)
P |= F_V; P |= F_V;
if(ah > 9) if(ah > 9)
ah += 6; ah += 6;
if(ah > 15) if(ah > 15)
P |= F_C; P |= F_C;
TMP2 = (ah << 4) | (al & 15); TMP = (ah << 4) | (al & 15);
} }
void m740_device::do_adc_ndt(uint8_t val) void m740_device::do_adc_ndt(uint8_t val)
{ {
uint16_t sum; uint16_t sum;
sum = TMP2 + val + (P & F_C ? 1 : 0); sum = TMP + val + (P & F_C ? 1 : 0);
P &= ~(F_N|F_V|F_Z|F_C); P &= ~(F_N|F_V|F_Z|F_C);
if(!uint8_t(sum)) if(!uint8_t(sum))
P |= F_Z; P |= F_Z;
else if(int8_t(sum) < 0) else if(int8_t(sum) < 0)
P |= F_N; P |= F_N;
if(~(TMP2^val) & (TMP2^sum) & 0x80) if(~(TMP^val) & (TMP^sum) & 0x80)
P |= F_V; P |= F_V;
if(sum & 0xff00) if(sum & 0xff00)
P |= F_C; P |= F_C;
TMP2 = sum; TMP = sum;
} }
void m740_device::do_adct(uint8_t val) void m740_device::do_adct(uint8_t val)

View File

@ -1164,7 +1164,7 @@ adct_aba
TMP = set_h(TMP, read_pc()); TMP = set_h(TMP, read_pc());
TMP2 = read_data(TMP); TMP2 = read_data(TMP);
TMP = read(X); TMP = read(X);
read_dummy(TMP); read_dummy(X);
do_adct(TMP2); do_adct(TMP2);
write(X, TMP); write(X, TMP);
prefetch(); prefetch();
@ -1220,11 +1220,11 @@ adct_idy
prefetch(); prefetch();
adct_imm adct_imm
TMP = read_pc(); TMP2 = read_pc();
TMP2 = read(X); TMP = read(X);
read_dummy(X); read_dummy(X);
do_adct(TMP); do_adct(TMP2);
write(X, TMP2); write(X, TMP);
prefetch(); prefetch();
adct_zpg adct_zpg
@ -1390,7 +1390,7 @@ cmpt_idy
read_dummy(set_l(TMP, TMP+Y)); read_dummy(set_l(TMP, TMP+Y));
TMP2 = read_data(TMP+Y); TMP2 = read_data(TMP+Y);
TMP = read(X); TMP = read(X);
do_cmp(TMP, read(TMP2+Y)); do_cmp(TMP, TMP2);
prefetch(); prefetch();
cmpt_imm cmpt_imm
@ -1748,11 +1748,11 @@ sbct_idy
prefetch(); prefetch();
sbct_imm sbct_imm
TMP = read_pc(); TMP2 = read_pc();
TMP2 = read(X); TMP = read(X);
read_dummy(X); read_dummy(X);
do_sbct(TMP); do_sbct(TMP2);
write(X, TMP2); write(X, TMP);
prefetch(); prefetch();
sbct_zpg sbct_zpg