void ApuBA() { // MOVW YA,dp IAPU.Registers.YA.B.A = S9xAPUGetByteZ(OP1); IAPU.Registers.YA.B.Y = S9xAPUGetByteZ(OP1 + 1); APUSetZN16(IAPU.Registers.YA.W); IAPU.PC += 2; }
void Apu5A() { // CMPW YA,dp uint16_t Work16 = S9xAPUGetByteZ(OP1) + (S9xAPUGetByteZ(OP1 + 1) << 8); int32_t Int32 = (long) IAPU.Registers.YA.W - (long) Work16; IAPU._Carry = Int32 >= 0; APUSetZN16((uint16_t) Int32); IAPU.PC += 2; }
void Apu5A() { // CMPW YA,dp uint16 Work16 = S9xAPUGetByteZ(OP1) + (S9xAPUGetByteZ(OP1 + 1) << 8); long Int32 = (long) IAPU.YA.W - (long) Work16; IAPU._Carry = Int32 >= 0; APUSetZN16((uint16) Int32); IAPU.PC += 2; }
void Apu3A() { // INCW dp uint16_t Work16 = S9xAPUGetByteZ(OP1) + (S9xAPUGetByteZ(OP1 + 1) << 8); Work16++; S9xAPUSetByteZ((uint8_t) Work16, OP1); S9xAPUSetByteZ(Work16 >> 8, OP1 + 1); APUSetZN16(Work16); IAPU.PC += 2; }
void Apu1A() { // DECW dp uint16 Work16 = S9xAPUGetByteZ(OP1) + (S9xAPUGetByteZ(OP1 + 1) << 8); Work16--; S9xAPUSetByteZ((uint8) Work16, OP1); S9xAPUSetByteZ(Work16 >> 8, OP1 + 1); APUSetZN16(Work16); IAPU.PC += 2; }
// XXX: HalfCarry - BJ Fixed? Or is it between bits 7 and 8 for ADDW/SUBW? void Apu7A() { // ADDW YA,dp uint16_t Work16 = S9xAPUGetByteZ(OP1) + (S9xAPUGetByteZ(OP1 + 1) << 8); uint32_t Work32 = (uint32_t) IAPU.Registers.YA.W + Work16; IAPU._Carry = Work32 >= 0x10000; if (~(IAPU.Registers.YA.W ^ Work16) & (Work16 ^ (uint16_t) Work32) & 0x8000) APUSetOverflow(); else APUClearOverflow(); APUClearHalfCarry(); if ((IAPU.Registers.YA.W ^ Work16 ^ (uint16_t) Work32) & 0x10) APUSetHalfCarry(); IAPU.Registers.YA.W = (uint16_t) Work32; APUSetZN16(IAPU.Registers.YA.W); IAPU.PC += 2; }
// XXX: BJ: i think the old HalfCarry behavior was wrong... // XXX: Or is it between bits 7 and 8 for ADDW/SUBW? // XXX: Used Work32 instead of Int32 before. Fixed? [Neb] void Apu9A() { // SUBW YA,dp uint16_t Work16 = S9xAPUGetByteZ(OP1) + (S9xAPUGetByteZ(OP1 + 1) << 8); int32_t Int32 = (long) IAPU.Registers.YA.W - (long) Work16; APUClearHalfCarry(); IAPU._Carry = Int32 >= 0; if (((IAPU.Registers.YA.W ^ Work16) & 0x8000) && ((IAPU.Registers.YA.W ^ (uint16_t) Int32) & 0x8000)) APUSetOverflow(); else APUClearOverflow(); if (((IAPU.Registers.YA.W ^ Work16) & 0x0080) && ((IAPU.Registers.YA.W ^ (uint16_t) Int32) & 0x0080)) APUSetHalfCarry(); APUSetHalfCarry(); if ((IAPU.Registers.YA.W ^ Work16 ^ (uint16_t) Int32) & 0x10) APUClearHalfCarry(); IAPU.Registers.YA.W = (uint16_t) Int32; APUSetZN16(IAPU.Registers.YA.W); IAPU.PC += 2; }
// XXX: BJ: i think the old HalfCarry behavior was wrong... // XXX: Or is it between bits 7 and 8 for ADDW/SUBW? void Apu9A() { // SUBW YA,dp uint16 Work16 = S9xAPUGetByteZ(OP1) + (S9xAPUGetByteZ(OP1 + 1) << 8); long Int32 = (long) IAPU.YA.W - (long) Work16; APUClearHalfCarry(); IAPU._Carry = Int32 >= 0; if (((IAPU.YA.W ^ Work16) & 0x8000) && ((IAPU.YA.W ^ (uint16) Int32) & 0x8000)) APUSetOverflow(); else APUClearOverflow(); // if (((IAPU.YA.W ^ Work16) & 0x0080) && // ((IAPU.YA.W ^ (uint16) Int32) & 0x0080)) // APUSetHalfCarry (); // notaz: strange here APUSetHalfCarry(); // if((IAPU.YA.W ^ Work16 ^ (uint16) Work32) & 0x10) // notaz: Work32?! if ((IAPU.YA.W ^ Work16 ^ (uint16) Int32) & 0x10) APUClearHalfCarry(); IAPU.YA.W = (uint16) Int32; APUSetZN16(IAPU.YA.W); IAPU.PC += 2; }