Added missing 'SBC A,inm' opcode implementation :P
authorslack <slack@codemaniacs.com>
Fri, 12 Sep 2008 01:56:55 +0000 (03:56 +0200)
committerslack <slack@codemaniacs.com>
Fri, 12 Sep 2008 01:56:55 +0000 (03:56 +0200)
gbcore.cc
wendi/disasm.cc

index 4526935b9acca5f305a0363c73ccf9d977510e89..a208899fe9152eeae74ec06a25e9c0f3bde9dd07 100644 (file)
--- a/gbcore.cc
+++ b/gbcore.cc
@@ -694,8 +694,25 @@ GameBoy::run_status GameBoy::run_cycle()
 
                                        case 0x9E: {//SBC (HL)
                                                int carry = (check_flag(CARRY_FLAG)? 1 : 0);
-                                               int res = regs.A - memory.read(regs.HL) - carry;
-                                               int half_res = (regs.A & 0x0F) - (memory.read(regs.HL) & 0x0F) - carry;
+                                               int val = memory.read(regs.HL);
+                                               int res = regs.A - val - carry;
+                                               int half_res = (regs.A & 0x0F) - (val & 0x0F) - carry;
+                                               regs.A = static_cast<u8>(res);
+
+                                               set_flag(ADD_SUB_FLAG);
+                                               set_flag_if (res < 0,      CARRY_FLAG);
+                                               set_flag_if (res == 0,     ZERO_FLAG);
+                                               set_flag_if (half_res < 0, HALF_CARRY_FLAG);
+                                               cycles_until_next_instruction = 8; 
+                                               break;
+                                               }
+
+                                       // SBC inm
+                                       case 0xDE: {
+                                               int carry = (check_flag(CARRY_FLAG)? 1 : 0);
+                                               int inm = memory.read(regs.PC++);
+                                               int res = regs.A - inm - carry;
+                                               int half_res = (regs.A & 0x0F) - (inm & 0x0F) - carry;
                                                regs.A = static_cast<u8>(res);
 
                                                set_flag(ADD_SUB_FLAG);
@@ -706,7 +723,6 @@ GameBoy::run_status GameBoy::run_cycle()
                                                break;
                                                }
 
-                                       // There is no SBC inm
 
                                        // AND n
                                        for_each_register(0xA7, 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, AND_reg)
index 11f201fae46bcf0bcdd0688dc24190664044a2af..a68f0607fd6830becaa3849ffbb88c3b88d3d98b 100644 (file)
@@ -279,6 +279,7 @@ Instruction disassemble_opcode(GameBoy &gb, u16 addr)
                dis_for_each_register(0x9F, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, "SBC", Instruction::ALU, dis_reg)
 
                dis__reg16_(0x9E, "SBC", Instruction::ALU, HL)
+               dis_reg_inm(0xDE, "SBC", Instruction::ALU, A)
 
                // AND n
                dis_for_each_register(0xA7, 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, "AND", Instruction::ALU, dis_reg)