update_flags_nz(value) { cpu->ps.N = bit(value, msb-1); cpu->ps.Z = value == 0; } get_flag(name, match, flag) { if (name == match) { return flag; } else { return !flag; } } jump(addr, fallback, flag) { if (flag) { return addr; } else { return fallback; } } read(addr, size) { return read_value(addr, size); } write(value, addr, size) { write_value(value, addr, size); } adc(a, b, carry) { sum = a + b + carry; update_flags_nz(sum); cpu->ps.C = sum < b; cpu->ps.V = bit(a^b, msb-1) && bit(a^sum, msb-1); return sum; } mul(a, b) { sum = a * b; update_flags_nz(sum); cpu->ps.V = bit(a^b, msb-1) && bit(a^sum, msb-1); return sum; } div(a, b, *rem) { sum = a / b; *rem = a % b; update_flags_nz(sum); return sum; }