📄 spc700.cpp
字号:
{// OR dp,#00 Work8 = OP1; Work8 |= S9xAPUGetByteZ (OP2); S9xAPUSetByteZ (Work8, OP2); APUSetZN8 (Work8); IAPU.PC += 3;}void Apu19 (){// OR (X),(Y) Work8 = S9xAPUGetByteZ (APURegisters.X) | S9xAPUGetByteZ (APURegisters.YA.B.Y); APUSetZN8 (Work8); S9xAPUSetByteZ (Work8, APURegisters.X); IAPU.PC++;}void Apu0A (){// OR1 C,membit MemBit (); if (!APUCheckCarry ()) { if (S9xAPUGetByte (IAPU.Address) & (1 << IAPU.Bit)) APUSetCarry (); } IAPU.PC += 3;}void Apu2A (){// OR1 C,not membit MemBit (); if (!APUCheckCarry ()) { if (!(S9xAPUGetByte (IAPU.Address) & (1 << IAPU.Bit))) APUSetCarry (); } IAPU.PC += 3;}void Apu4A (){// AND1 C,membit MemBit (); if (APUCheckCarry ()) { if (!(S9xAPUGetByte (IAPU.Address) & (1 << IAPU.Bit))) APUClearCarry (); } IAPU.PC += 3;}void Apu6A (){// AND1 C, not membit MemBit (); if (APUCheckCarry ()) { if ((S9xAPUGetByte (IAPU.Address) & (1 << IAPU.Bit))) APUClearCarry (); } IAPU.PC += 3;}void Apu8A (){// EOR1 C, membit MemBit (); if (APUCheckCarry ()) { if (S9xAPUGetByte (IAPU.Address) & (1 << IAPU.Bit)) APUClearCarry (); } else { if (S9xAPUGetByte (IAPU.Address) & (1 << IAPU.Bit)) APUSetCarry (); } IAPU.PC += 3;}void ApuAA (){// MOV1 C,membit MemBit (); if (S9xAPUGetByte (IAPU.Address) & (1 << IAPU.Bit)) APUSetCarry (); else APUClearCarry (); IAPU.PC += 3;}void ApuCA (){// MOV1 membit,C MemBit (); if (APUCheckCarry ()) { S9xAPUSetByte (S9xAPUGetByte (IAPU.Address) | (1 << IAPU.Bit), IAPU.Address); } else { S9xAPUSetByte (S9xAPUGetByte (IAPU.Address) & ~(1 << IAPU.Bit), IAPU.Address); } IAPU.PC += 3;}void ApuEA (){// NOT1 membit MemBit (); S9xAPUSetByte (S9xAPUGetByte (IAPU.Address) ^ (1 << IAPU.Bit), IAPU.Address); IAPU.PC += 3;}void Apu0B (){// ASL dp Work8 = S9xAPUGetByteZ (OP1); ASL (Work8); S9xAPUSetByteZ (Work8, OP1); IAPU.PC += 2;}void Apu0C (){// ASL abs Absolute (); Work8 = S9xAPUGetByte (IAPU.Address); ASL (Work8); S9xAPUSetByte (Work8, IAPU.Address); IAPU.PC += 3;}void Apu1B (){// ASL dp+X Work8 = S9xAPUGetByteZ (OP1 + APURegisters.X); ASL (Work8); S9xAPUSetByteZ (Work8, OP1 + APURegisters.X); IAPU.PC += 2;}void Apu1C (){// ASL A ASL (APURegisters.YA.B.A); IAPU.PC++;}void Apu0D (){// PUSH PSW S9xAPUPackStatus (); Push (APURegisters.P); IAPU.PC++;}void Apu2D (){// PUSH A Push (APURegisters.YA.B.A); IAPU.PC++;}void Apu4D (){// PUSH X Push (APURegisters.X); IAPU.PC++;}void Apu6D (){// PUSH Y Push (APURegisters.YA.B.Y); IAPU.PC++;}void Apu8E (){// POP PSW Pop (APURegisters.P); S9xAPUUnpackStatus (); if (APUCheckDirectPage ()) IAPU.DirectPage = IAPU.RAM + 0x100; else IAPU.DirectPage = IAPU.RAM; IAPU.PC++;}void ApuAE (){// POP A Pop (APURegisters.YA.B.A); IAPU.PC++;}void ApuCE (){// POP X Pop (APURegisters.X); IAPU.PC++;}void ApuEE (){// POP Y Pop (APURegisters.YA.B.Y); IAPU.PC++;}void Apu0E (){// TSET1 abs Absolute (); Work8 = S9xAPUGetByte (IAPU.Address); S9xAPUSetByte (Work8 | APURegisters.YA.B.A, IAPU.Address); Work8 &= APURegisters.YA.B.A; APUSetZN8 (Work8); IAPU.PC += 3;}void Apu4E (){// TCLR1 abs Absolute (); Work8 = S9xAPUGetByte (IAPU.Address); S9xAPUSetByte (Work8 & ~APURegisters.YA.B.A, IAPU.Address); Work8 &= APURegisters.YA.B.A; APUSetZN8 (Work8); IAPU.PC += 3;}void Apu0F (){// BRK#if 0 STOP ("BRK");#else PushW (IAPU.PC + 1 - IAPU.RAM); S9xAPUPackStatus (); Push (APURegisters.P); APUSetBreak (); APUClearInterrupt ();// XXX:Where is the BRK vector ??? IAPU.PC = IAPU.RAM + APU.ExtraRAM[0x20] + (APU.ExtraRAM[0x21] << 8);#endif}void ApuEF (){// SLEEP // XXX: sleep // STOP ("SLEEP"); IAPU.APUExecuting = FALSE; IAPU.PC++;}void ApuFF (){// STOP // STOP ("STOP"); IAPU.APUExecuting = FALSE; IAPU.PC++;}void Apu10 (){// BPL Relative (); if (!APUCheckNegative ()) { IAPU.PC = IAPU.RAM + (uint16) Int16; APU.Cycles += IAPU.TwoCycles; APUShutdown (); } else IAPU.PC += 2;}void Apu30 (){// BMI Relative (); if (APUCheckNegative ()) { IAPU.PC = IAPU.RAM + (uint16) Int16; APU.Cycles += IAPU.TwoCycles; APUShutdown (); } else IAPU.PC += 2;}void Apu90 (){// BCC Relative (); if (!APUCheckCarry ()) { IAPU.PC = IAPU.RAM + (uint16) Int16; APU.Cycles += IAPU.TwoCycles; APUShutdown (); } else IAPU.PC += 2;}void ApuB0 (){// BCS Relative (); if (APUCheckCarry ()) { IAPU.PC = IAPU.RAM + (uint16) Int16; APU.Cycles += IAPU.TwoCycles; APUShutdown (); } else IAPU.PC += 2;}void ApuD0 (){// BNE Relative (); if (!APUCheckZero ()) { IAPU.PC = IAPU.RAM + (uint16) Int16; APU.Cycles += IAPU.TwoCycles; APUShutdown (); } else IAPU.PC += 2;}void ApuF0 (){// BEQ Relative (); if (APUCheckZero ()) { IAPU.PC = IAPU.RAM + (uint16) Int16; APU.Cycles += IAPU.TwoCycles; APUShutdown (); } else IAPU.PC += 2;}void Apu50 (){// BVC Relative (); if (!APUCheckOverflow ()) { IAPU.PC = IAPU.RAM + (uint16) Int16; APU.Cycles += IAPU.TwoCycles; } else IAPU.PC += 2;}void Apu70 (){// BVS Relative (); if (APUCheckOverflow ()) { IAPU.PC = IAPU.RAM + (uint16) Int16; APU.Cycles += IAPU.TwoCycles; } else IAPU.PC += 2;}void Apu2F (){// BRA Relative (); IAPU.PC = IAPU.RAM + (uint16) Int16;}void Apu80 (){// SETC APUSetCarry (); IAPU.PC++;}void ApuED (){// NOTC IAPU._Carry ^= 1; IAPU.PC++;}void Apu40 (){// SETP APUSetDirectPage (); IAPU.DirectPage = IAPU.RAM + 0x100; IAPU.PC++;}void Apu1A (){// DECW dp Work16 = S9xAPUGetByteZ (OP1) + (S9xAPUGetByteZ (OP1 + 1) << 8); Work16--; S9xAPUSetByteZ ((uint8) Work16, OP1); S9xAPUSetByteZ (Work16 >> 8, OP1 + 1); APUSetZN16 (Work16); IAPU.PC += 2;}void Apu5A (){// CMPW YA,dp Work16 = S9xAPUGetByteZ (OP1) + (S9xAPUGetByteZ (OP1 + 1) << 8); Int32 = (long) APURegisters.YA.W - (long) Work16; IAPU._Carry = Int32 >= 0; APUSetZN16 ((uint16) Int32); IAPU.PC += 2;}void Apu3A (){// INCW dp 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 Work16 = S9xAPUGetByteZ (OP1) + (S9xAPUGetByteZ (OP1 + 1) << 8); Work32 = (uint32) APURegisters.YA.W + Work16; IAPU._Carry = Work32 >= 0x10000; if (~(APURegisters.YA.W ^ Work16) & (Work16 ^ (uint16) Work32) & 0x8000) APUSetOverflow (); else APUClearOverflow (); APUClearHalfCarry (); if((APURegisters.YA.W ^ Work16 ^ (uint16) Work32) & 0x10) APUSetHalfCarry (); APURegisters.YA.W = (uint16) Work32; APUSetZN16 (APURegisters.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 Work16 = S9xAPUGetByteZ (OP1) + (S9xAPUGetByteZ (OP1 + 1) << 8); Int32 = (long) APURegisters.YA.W - (long) Work16; APUClearHalfCarry (); IAPU._Carry = Int32 >= 0; if (((APURegisters.YA.W ^ Work16) & 0x8000) && ((APURegisters.YA.W ^ (uint16) Int32) & 0x8000)) APUSetOverflow (); else APUClearOverflow (); if (((APURegisters.YA.W ^ Work16) & 0x0080) && ((APURegisters.YA.W ^ (uint16) Int32) & 0x0080)) APUSetHalfCarry (); APUSetHalfCarry (); if((APURegisters.YA.W ^ Work16 ^ (uint16) Work32) & 0x10) APUClearHalfCarry (); APURegisters.YA.W = (uint16) Int32; APUSetZN16 (APURegisters.YA.W); IAPU.PC += 2;}void ApuBA (){// MOVW YA,dp APURegisters.YA.B.A = S9xAPUGetByteZ (OP1); APURegisters.YA.B.Y = S9xAPUGetByteZ (OP1 + 1); APUSetZN16 (APURegisters.YA.W); IAPU.PC += 2;}void ApuDA (){// MOVW dp,YA S9xAPUSetByteZ (APURegisters.YA.B.A, OP1); S9xAPUSetByteZ (APURegisters.YA.B.Y, OP1 + 1); IAPU.PC += 2;}void Apu64 (){// CMP A,dp Work8 = S9xAPUGetByteZ (OP1); CMP (APURegisters.YA.B.A, Work8); IAPU.PC += 2;}void Apu65 (){// CMP A,abs Absolute (); Work8 = S9xAPUGetByte (IAPU.Address); CMP (APURegisters.YA.B.A, Work8); IAPU.PC += 3;}void Apu66 (){// CMP A,(X) Work8 = S9xAPUGetByteZ (APURegisters.X); CMP (APURegisters.YA.B.A, Work8); IAPU.PC++;}void Apu67 (){// CMP A,(dp+X) IndexedXIndirect (); Work8 = S9xAPUGetByte (IAPU.Address); CMP (APURegisters.YA.B.A, Work8); IAPU.PC += 2;}void Apu68 (){// CMP A,#00 Work8 = OP1; CMP (APURegisters.YA.B.A, Work8); IAPU.PC += 2;}void Apu69 (){// CMP dp(dest), dp(src) W1 = S9xAPUGetByteZ (OP1); Work8 = S9xAPUGetByteZ (OP2); CMP (Work8, W1); IAPU.PC += 3;}void Apu74 (){// CMP A, dp+X Work8 = S9xAPUGetByteZ (OP1 + APURegisters.X); CMP (APURegisters.YA.B.A, Work8); IAPU.PC += 2;}void Apu75 (){// CMP A,abs+X AbsoluteX (); Work8 = S9xAPUGetByte (IAPU.Address); CMP (APURegisters.YA.B.A, Work8); IAPU.PC += 3;}void Apu76 (){// CMP A, abs+Y AbsoluteY (); Work8 = S9xAPUGetByte (IAPU.Address); CMP (APURegisters.YA.B.A, Work8); IAPU.PC += 3;}void Apu77 (){// CMP A,(dp)+Y IndirectIndexedY (); Work8 = S9xAPUGetByte (IAPU.Address); CMP (APURegisters.YA.B.A, Work8); IAPU.PC += 2;}void Apu78 (){// CMP dp,#00 Work8 = OP1; W1 = S9xAPUGetByteZ (OP2); CMP (W1, Work8); IAPU.PC += 3;}void Apu79 (){// CMP (X),(Y) W1 = S9xAPUGetByteZ (APURegisters.X); Work8 = S9xAPUGetByteZ (APURegisters.YA.B.Y); CMP (W1, Work8); IAPU.PC++;}void Apu1E (){// CMP X,abs Absolute (); Work8 = S9xAPUGetByte (IAPU.Address); CMP (APURegisters.X, Work8); IAPU.PC += 3;}void Apu3E (){// CMP X,dp Work8 = S9xAPUGetByteZ (OP1); CMP (APURegisters.X, Work8); IAPU.PC += 2;}void ApuC8 (){// CMP X,#00 CMP (APURegisters.X, OP1); IAPU.PC += 2;}void Apu5E (){// CMP Y,abs Absolute (); Work8 = S9xAPUGetByte (IAPU.Address); CMP (APURegisters.YA.B.Y, Work8); IAPU.PC += 3;}void Apu7E (){// CMP Y,dp Work8 = S9xAPUGetByteZ (OP1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -