diff options
| author | 2009-09-05 04:34:51 +0000 | |
|---|---|---|
| committer | 2009-09-05 04:34:51 +0000 | |
| commit | 3548990629d7767f84488438406af647aa6f1049 (patch) | |
| tree | 012968a2c923ff112c844804603cb90a07e46497 /src | |
| parent | 652a7ca44151b4290cb8316fa725893ca6a80dfa (diff) | |
Fixed carry handling in ADC, ADCI, SBC and SBCI opcodes. Fixes many SNES SuperFX bugs. [Harmony]
Diffstat (limited to 'src')
| -rw-r--r-- | src/emu/cpu/superfx/superfx.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/src/emu/cpu/superfx/superfx.c b/src/emu/cpu/superfx/superfx.c index 9b0a5c760a9..0ea8a1cf693 100644 --- a/src/emu/cpu/superfx/superfx.c +++ b/src/emu/cpu/superfx/superfx.c @@ -1023,7 +1023,7 @@ static CPU_EXECUTE( superfx ) case 0x58: case 0x59: case 0x5a: case 0x5b: case 0x5c: case 0x5d: case 0x5e: case 0x5f: // ADD / ADC / ADDI / ADCI { INT32 r = *(cpustate->sreg); - cpustate->sfr &= ~(SUPERFX_SFR_OV | SUPERFX_SFR_S | SUPERFX_SFR_CY | SUPERFX_SFR_Z); + cpustate->sfr &= ~(SUPERFX_SFR_OV | SUPERFX_SFR_S | SUPERFX_SFR_Z); switch(cpustate->sfr & SUPERFX_SFR_ALT) { case SUPERFX_SFR_ALT0: // ADD @@ -1043,6 +1043,7 @@ static CPU_EXECUTE( superfx ) cpustate->sfr |= (~(*(cpustate->sreg) ^ (op & 0xf)) & ((op & 0xf) ^ r) & 0x8000) ? SUPERFX_SFR_OV : 0; break; } + cpustate->sfr &= ~SUPERFX_SFR_CY; cpustate->sfr |= (r & 0x8000) ? SUPERFX_SFR_S : 0; cpustate->sfr |= (r >= 0x10000) ? SUPERFX_SFR_CY : 0; cpustate->sfr |= ((UINT16)r == 0) ? SUPERFX_SFR_Z : 0; @@ -1055,7 +1056,7 @@ static CPU_EXECUTE( superfx ) case 0x68: case 0x69: case 0x6a: case 0x6b: case 0x6c: case 0x6d: case 0x6e: case 0x6f: // SUB / SBC / SUBI / CMP { INT32 r = 0; - cpustate->sfr &= ~(SUPERFX_SFR_OV | SUPERFX_SFR_S | SUPERFX_SFR_CY | SUPERFX_SFR_Z); + cpustate->sfr &= ~(SUPERFX_SFR_OV | SUPERFX_SFR_S | SUPERFX_SFR_Z); switch(cpustate->sfr & SUPERFX_SFR_ALT) { case SUPERFX_SFR_ALT0: // SUB @@ -1078,6 +1079,7 @@ static CPU_EXECUTE( superfx ) cpustate->sfr |= ((*(cpustate->sreg) ^ cpustate->r[op & 0xf]) & (*(cpustate->sreg) ^ r) & 0x8000) ? SUPERFX_SFR_OV : 0; break; } + cpustate->sfr &= ~SUPERFX_SFR_CY; cpustate->sfr |= (r & 0x8000) ? SUPERFX_SFR_S : 0; cpustate->sfr |= (r >= 0x0) ? SUPERFX_SFR_CY : 0; cpustate->sfr |= ((UINT16)r == 0) ? SUPERFX_SFR_Z : 0; @@ -1401,6 +1403,10 @@ static CPU_EXECUTE( superfx ) cpustate->r[15]++; } + //printf( " r0:%04x r1:%04x r2:%04x r3:%04x r4:%04x r5:%04x r6:%04x r7:%04x\n", cpustate->r[0], cpustate->r[1], cpustate->r[2], cpustate->r[3], cpustate->r[4], cpustate->r[5], cpustate->r[6], cpustate->r[7] ); + //printf( " r8:%04x r9:%04x r10:%04x r11:%04x r12:%04x r13:%04x r14:%04x r15:%04x\n", cpustate->r[8], cpustate->r[9], cpustate->r[10], cpustate->r[11], cpustate->r[12], cpustate->r[13], cpustate->r[14], cpustate->r[15] ); + //printf( "sfr:%04x\n", cpustate->sfr ); + --cpustate->icount; } |
