Code: Select all
void cpu_6502_base::do_adc_bcd(const byte val)
{
const uint lo_bin = (a & 0x0FU) + (val & 0x0FU) + c;
const uint lo = (lo_bin >= 0x0AU) ? ((lo_bin + 0x06U) & 0x0FU) + 0x10U : lo_bin;
const uint hilo_bin = (a & 0xF0U) + (val & 0xF0U) + lo;
const uint hilo = (hilo_bin >= 0xA0U) ? hilo_bin + 0x60U : hilo_bin;
n = !!(hilo_bin & 0x80U);
v = !!((a ^ hilo_bin) & (val ^ hilo_bin) & 0x80U);
z = !((a + val + c) & 0xFFU);
c = (hilo_bin >= 0xA0U);
a = hilo & 0xFFU;
}
void cpu_6502_base::do_sbc_bcd(const byte val)
{
const uint lo_bin = (a & 0x0FU) + (val & 0x0FU) + c;
const uint lo = (lo_bin < 0x10U) ? ((lo_bin + 0x0AU) & 0x0FU) : lo_bin;
const uint hilo_bin = (a & 0xF0U) + (val & 0xF0U) + lo;
const uint hilo = (hilo_bin < 0x100U) ? hilo_bin + 0xA0U : hilo_bin;
n = !!(hilo_bin & 0x80U);
v = !!((a ^ hilo_bin) & (val ^ hilo_bin) & 0x80U);
z = !((a + val + c) & 0xFFU);
c = hilo_bin >> 8;
a = hilo & 0xFFU;
}
Just looking at your code in that other thread: does that also set all the flags correctly like the NMOS 6502 (and also give the correct results with non-BCD inputs)? If so, that is some proper magic going on there!