Skip to content

Commit a1dab20

Browse files
committed
[fix] 16 bit arithmetic carries and zero
Closes #14
1 parent 5551f48 commit a1dab20

2 files changed

Lines changed: 8 additions & 8 deletions

File tree

src/chips/w65c816s.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -520,7 +520,7 @@ static inline void _w65816_adc16(w65816_t* cpu, uint16_t val) {
520520
}
521521
else {
522522
/* default mode */
523-
uint16_t sum = _C(cpu) + val + (cpu->P & W65816_CF ? 1:0);
523+
uint32_t sum = _C(cpu) + val + (cpu->P & W65816_CF ? 1:0);
524524
cpu->P &= ~(W65816_VF|W65816_CF);
525525
cpu->P = _W65816_NZ16(cpu->P,sum);
526526
if (~(_C(cpu)^val) & (_C(cpu)^sum) & 0x8000) {
@@ -565,7 +565,7 @@ static inline void _w65816_sbc(w65816_t* cpu, uint8_t val) {
565565
/* default mode */
566566
uint16_t diff = _A(cpu) - val - (cpu->P & W65816_CF ? 0 : 1);
567567
cpu->P &= ~(W65816_VF|W65816_CF);
568-
cpu->P = _W65816_NZ(cpu->P, (uint8_t)diff);
568+
cpu->P = _W65816_NZ(cpu->P, diff);
569569
if ((_A(cpu)^val) & (_A(cpu)^diff) & 0x80) {
570570
cpu->P |= W65816_VF;
571571
}
@@ -581,7 +581,7 @@ static inline void _w65816_sbc16(w65816_t* cpu, uint16_t val) {
581581
/* decimal mode (credit goes to MAME) */
582582
uint8_t c = cpu->P & W65816_CF ? 0 : 1;
583583
cpu->P &= ~(W65816_NF|W65816_VF|W65816_ZF|W65816_CF);
584-
uint16_t diff = _C(cpu) - val - c;
584+
uint32_t diff = _C(cpu) - val - c;
585585
uint8_t al = (_A(cpu) & 0x0F) - (val & 0x0F) - c;
586586
if ((int8_t)al < 0) {
587587
al -= 6;
@@ -614,9 +614,9 @@ static inline void _w65816_sbc16(w65816_t* cpu, uint16_t val) {
614614
}
615615
else {
616616
/* default mode */
617-
uint16_t diff = _C(cpu) - val - (cpu->P & W65816_CF ? 0 : 1);
617+
uint32_t diff = _C(cpu) - val - (cpu->P & W65816_CF ? 0 : 1);
618618
cpu->P &= ~(W65816_VF|W65816_CF);
619-
cpu->P = _W65816_NZ16(cpu->P, (uint8_t)diff);
619+
cpu->P = _W65816_NZ16(cpu->P, diff);
620620
if ((_C(cpu)^val) & (_C(cpu)^diff) & 0x8000) {
621621
cpu->P |= W65816_VF;
622622
}

src/tests/cputest.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -418,7 +418,7 @@ TEST_CASE("16 bit arithmetic carries") {
418418
0x80, // sbc #$9000 ; CC
419419
0x81, // sec
420420
0x81, // lda #$8000
421-
0x01, // sbc #$4000 ; CS
421+
0x41, // sbc #$4000 ; CS
422422
};
423423

424424
size_t code_ptr = 0;
@@ -431,7 +431,7 @@ TEST_CASE("16 bit arithmetic carries") {
431431
}
432432

433433
pins = w65816_tick(&cpu, pins);
434-
printf("%zu: %016lx %02x\n", code_ptr - 1, pins, cpu.P);
434+
// printf("%zu: %016lx %02x\n", code_ptr - 1, pins, cpu.P);
435435

436436
if ((pins & W65816_VPA) && (pins & W65816_VDA)) {
437437
// if this is a next instruction fetch, check status register
@@ -443,7 +443,7 @@ TEST_CASE("16 bit arithmetic carries") {
443443
(cpu.P & W65816_ZF) ? 'Z' : '-', (cpu.P & W65816_CF) ? 'C' : '-', '\0'
444444
};
445445
CAPTURE(p_str);
446-
printf(" >> %s / %zd\n", p_str, inst_ptr);
446+
// printf(" >> %s / %zd : %04X\n", p_str, inst_ptr, cpu.C);
447447
CHECK(cpu.P == flags[inst_ptr++]);
448448
}
449449
}

0 commit comments

Comments
 (0)