⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spc700.cpp

📁 著名SFC模拟器Snes9x的源代码。
💻 CPP
📖 第 1 页 / 共 3 页
字号:
{// EOR A,dp+X    APURegisters.YA.B.A ^= S9xAPUGetByteZ (OP1 + APURegisters.X);    APUSetZN8 (APURegisters.YA.B.A);    IAPU.PC += 2;}void Apu55 (){// EOR A,abs+X    AbsoluteX ();    APURegisters.YA.B.A ^= S9xAPUGetByte (IAPU.Address);    APUSetZN8 (APURegisters.YA.B.A);    IAPU.PC += 3;}void Apu56 (){// EOR A,abs+Y    AbsoluteY ();    APURegisters.YA.B.A ^= S9xAPUGetByte (IAPU.Address);    APUSetZN8 (APURegisters.YA.B.A);    IAPU.PC += 3;}void Apu57 (){// EOR A,(dp)+Y    IndirectIndexedY ();    APURegisters.YA.B.A ^= S9xAPUGetByte (IAPU.Address);    APUSetZN8 (APURegisters.YA.B.A);    IAPU.PC += 2;}void Apu58 (){// EOR dp,#00    Work8 = OP1;    Work8 ^= S9xAPUGetByteZ (OP2);    S9xAPUSetByteZ (Work8, OP2);    APUSetZN8 (Work8);    IAPU.PC += 3;}void Apu59 (){// EOR (X),(Y)    Work8 = S9xAPUGetByteZ (APURegisters.X) ^ S9xAPUGetByteZ (APURegisters.YA.B.Y);    APUSetZN8 (Work8);    S9xAPUSetByteZ (Work8, APURegisters.X);    IAPU.PC++;}void Apu4B (){// LSR dp    Work8 = S9xAPUGetByteZ (OP1);    LSR (Work8);    S9xAPUSetByteZ (Work8, OP1);    IAPU.PC += 2;}void Apu4C (){// LSR abs    Absolute ();    Work8 = S9xAPUGetByte (IAPU.Address);    LSR (Work8);    S9xAPUSetByte (Work8, IAPU.Address);    IAPU.PC += 3;}void Apu5B (){// LSR dp+X    Work8 = S9xAPUGetByteZ (OP1 + APURegisters.X);    LSR (Work8);    S9xAPUSetByteZ (Work8, OP1 + APURegisters.X);    IAPU.PC += 2;}void Apu5C (){// LSR A    LSR (APURegisters.YA.B.A);    IAPU.PC++;}void Apu7D (){// MOV A,X    APURegisters.YA.B.A = APURegisters.X;    APUSetZN8 (APURegisters.YA.B.A);    IAPU.PC++;}void ApuDD (){// MOV A,Y    APURegisters.YA.B.A = APURegisters.YA.B.Y;    APUSetZN8 (APURegisters.YA.B.A);    IAPU.PC++;}void Apu5D (){// MOV X,A    APURegisters.X = APURegisters.YA.B.A;    APUSetZN8 (APURegisters.X);    IAPU.PC++;}void ApuFD (){// MOV Y,A    APURegisters.YA.B.Y = APURegisters.YA.B.A;    APUSetZN8 (APURegisters.YA.B.Y);    IAPU.PC++;}void Apu9D (){//MOV X,SP    APURegisters.X = APURegisters.S;    APUSetZN8 (APURegisters.X);    IAPU.PC++;}void ApuBD (){// MOV SP,X    APURegisters.S = APURegisters.X;    IAPU.PC++;}void Apu6B (){// ROR dp    Work8 = S9xAPUGetByteZ (OP1);    ROR (Work8);    S9xAPUSetByteZ (Work8, OP1);    IAPU.PC += 2;}void Apu6C (){// ROR abs    Absolute ();    Work8 = S9xAPUGetByte (IAPU.Address);    ROR (Work8);    S9xAPUSetByte (Work8, IAPU.Address);    IAPU.PC += 3;}void Apu7B (){// ROR dp+X    Work8 = S9xAPUGetByteZ (OP1 + APURegisters.X);    ROR (Work8);    S9xAPUSetByteZ (Work8, OP1 + APURegisters.X);    IAPU.PC += 2;}void Apu7C (){// ROR A    ROR (APURegisters.YA.B.A);    IAPU.PC++;}void Apu6E (){// DBNZ dp,rel    Work8 = OP1;    Relative2 ();    W1 = S9xAPUGetByteZ (Work8) - 1;    S9xAPUSetByteZ (W1, Work8);    if (W1 != 0)    {	IAPU.PC = IAPU.RAM + (uint16) Int16;	APU.Cycles += IAPU.TwoCycles;    }    else	IAPU.PC += 3;}void ApuFE (){// DBNZ Y,rel    Relative ();    APURegisters.YA.B.Y--;    if (APURegisters.YA.B.Y != 0)    {	IAPU.PC = IAPU.RAM + (uint16) Int16;	APU.Cycles += IAPU.TwoCycles;    }    else	IAPU.PC += 2;}void Apu6F (){// RET    PopW (APURegisters.PC);    IAPU.PC = IAPU.RAM + APURegisters.PC;}void Apu7F (){// RETI    // STOP ("RETI");    Pop (APURegisters.P);    S9xAPUUnpackStatus ();    PopW (APURegisters.PC);    IAPU.PC = IAPU.RAM + APURegisters.PC;}void Apu84 (){// ADC A,dp    Work8 = S9xAPUGetByteZ (OP1);    ADC (APURegisters.YA.B.A, Work8);    IAPU.PC += 2;}void Apu85 (){// ADC A, abs    Absolute ();    Work8 = S9xAPUGetByte (IAPU.Address);    ADC (APURegisters.YA.B.A, Work8);    IAPU.PC += 3;}void Apu86 (){// ADC A,(X)    Work8 = S9xAPUGetByteZ (APURegisters.X);    ADC (APURegisters.YA.B.A, Work8);    IAPU.PC++;}void Apu87 (){// ADC A,(dp+X)    IndexedXIndirect ();    Work8 = S9xAPUGetByte (IAPU.Address);    ADC (APURegisters.YA.B.A, Work8);    IAPU.PC += 2;}void Apu88 (){// ADC A,#00    Work8 = OP1;    ADC (APURegisters.YA.B.A, Work8);    IAPU.PC += 2;}void Apu89 (){// ADC dp(dest),dp(src)    Work8 = S9xAPUGetByteZ (OP1);    W1 = S9xAPUGetByteZ (OP2);    ADC (W1, Work8);    S9xAPUSetByteZ (W1, OP2);    IAPU.PC += 3;}void Apu94 (){// ADC A,dp+X    Work8 = S9xAPUGetByteZ (OP1 + APURegisters.X);    ADC (APURegisters.YA.B.A, Work8);    IAPU.PC += 2;}void Apu95 (){// ADC A, abs+X    AbsoluteX ();    Work8 = S9xAPUGetByte (IAPU.Address);    ADC (APURegisters.YA.B.A, Work8);    IAPU.PC += 3;}void Apu96 (){// ADC A, abs+Y    AbsoluteY ();    Work8 = S9xAPUGetByte (IAPU.Address);    ADC (APURegisters.YA.B.A, Work8);    IAPU.PC += 3;}void Apu97 (){// ADC A, (dp)+Y    IndirectIndexedY ();    Work8 = S9xAPUGetByte (IAPU.Address);    ADC (APURegisters.YA.B.A, Work8);    IAPU.PC += 2;}void Apu98 (){// ADC dp,#00    Work8 = OP1;    W1 = S9xAPUGetByteZ (OP2);    ADC (W1, Work8);    S9xAPUSetByteZ (W1, OP2);    IAPU.PC += 3;}void Apu99 (){// ADC (X),(Y)    W1 = S9xAPUGetByteZ (APURegisters.X);    Work8 = S9xAPUGetByteZ (APURegisters.YA.B.Y);    ADC (W1, Work8);    S9xAPUSetByteZ (W1, APURegisters.X);    IAPU.PC++;}void Apu8D (){// MOV Y,#00    APURegisters.YA.B.Y = OP1;    APUSetZN8 (APURegisters.YA.B.Y);    IAPU.PC += 2;}void Apu8F (){// MOV dp,#00    Work8 = OP1;    S9xAPUSetByteZ (Work8, OP2);    IAPU.PC += 3;}void Apu9E (){// DIV YA,X    if (APURegisters.X == 0)    {	APUSetOverflow ();	APURegisters.YA.B.Y = 0xff;	APURegisters.YA.B.A = 0xff;    }    else    {	APUClearOverflow ();	Work8 = APURegisters.YA.W / APURegisters.X;	APURegisters.YA.B.Y = APURegisters.YA.W % APURegisters.X;	APURegisters.YA.B.A = Work8;    }// XXX How should Overflow, Half Carry, Zero and Negative flags be set??    // APUSetZN16 (APURegisters.YA.W);    APUSetZN8 (APURegisters.YA.B.A);    IAPU.PC++;}void Apu9F (){// XCN A    APURegisters.YA.B.A = (APURegisters.YA.B.A >> 4) | (APURegisters.YA.B.A << 4);    APUSetZN8 (APURegisters.YA.B.A);    IAPU.PC++;}void ApuA4 (){// SBC A, dp    Work8 = S9xAPUGetByteZ (OP1);    SBC (APURegisters.YA.B.A, Work8);    IAPU.PC += 2;}void ApuA5 (){// SBC A, abs    Absolute ();    Work8 = S9xAPUGetByte (IAPU.Address);    SBC (APURegisters.YA.B.A, Work8);    IAPU.PC += 3;}void ApuA6 (){// SBC A, (X)    Work8 = S9xAPUGetByteZ (APURegisters.X);    SBC (APURegisters.YA.B.A, Work8);    IAPU.PC++;}void ApuA7 (){// SBC A,(dp+X)    IndexedXIndirect ();    Work8 = S9xAPUGetByte (IAPU.Address);    SBC (APURegisters.YA.B.A, Work8);    IAPU.PC += 2;}void ApuA8 (){// SBC A,#00    Work8 = OP1;    SBC (APURegisters.YA.B.A, Work8);    IAPU.PC += 2;}void ApuA9 (){// SBC dp(dest), dp(src)    Work8 = S9xAPUGetByteZ (OP1);    W1 = S9xAPUGetByteZ (OP2);    SBC (W1, Work8);    S9xAPUSetByteZ (W1, OP2);    IAPU.PC += 3;}void ApuB4 (){// SBC A, dp+X    Work8 = S9xAPUGetByteZ (OP1 + APURegisters.X);    SBC (APURegisters.YA.B.A, Work8);    IAPU.PC += 2;}void ApuB5 (){// SBC A,abs+X    AbsoluteX ();    Work8 = S9xAPUGetByte (IAPU.Address);    SBC (APURegisters.YA.B.A, Work8);    IAPU.PC += 3;}void ApuB6 (){// SBC A,abs+Y    AbsoluteY ();    Work8 = S9xAPUGetByte (IAPU.Address);    SBC (APURegisters.YA.B.A, Work8);    IAPU.PC += 3;}void ApuB7 (){// SBC A,(dp)+Y    IndirectIndexedY ();    Work8 = S9xAPUGetByte (IAPU.Address);    SBC (APURegisters.YA.B.A, Work8);    IAPU.PC += 2;}void ApuB8 (){// SBC dp,#00    Work8 = OP1;    W1 = S9xAPUGetByteZ (OP2);    SBC (W1, Work8);    S9xAPUSetByteZ (W1, OP2);    IAPU.PC += 3;}void ApuB9 (){// SBC (X),(Y)    W1 = S9xAPUGetByteZ (APURegisters.X);    Work8 = S9xAPUGetByteZ (APURegisters.YA.B.Y);    SBC (W1, Work8);    S9xAPUSetByteZ (W1, APURegisters.X);    IAPU.PC++;}void ApuAF (){// MOV (X)+, A    S9xAPUSetByteZ (APURegisters.YA.B.A, APURegisters.X++);    IAPU.PC++;}void ApuBE (){// DAS    // XXX:    IAPU.PC++;}void ApuBF (){// MOV A,(X)+    APURegisters.YA.B.A = S9xAPUGetByteZ (APURegisters.X++);    APUSetZN8 (APURegisters.YA.B.A);    IAPU.PC++;}void ApuC0 (){// DI    APUClearInterrupt ();    IAPU.PC++;}void ApuA0 (){// EI    APUSetInterrupt ();    IAPU.PC++;}void ApuC4 (){// MOV dp,A    S9xAPUSetByteZ (APURegisters.YA.B.A, OP1);    IAPU.PC += 2;}void ApuC5 (){// MOV abs,A    Absolute ();    S9xAPUSetByte (APURegisters.YA.B.A, IAPU.Address);    IAPU.PC += 3;}void ApuC6 (){// MOV (X), A    S9xAPUSetByteZ (APURegisters.YA.B.A, APURegisters.X);    IAPU.PC++;}void ApuC7 (){// MOV (dp+X),A    IndexedXIndirect ();    S9xAPUSetByte (APURegisters.YA.B.A, IAPU.Address);    IAPU.PC += 2;}void ApuC9 (){// MOV abs,X    Absolute ();    S9xAPUSetByte (APURegisters.X, IAPU.Address);    IAPU.PC += 3;}void ApuCB (){// MOV dp,Y    S9xAPUSetByteZ (APURegisters.YA.B.Y, OP1);    IAPU.PC += 2;}void ApuCC (){// MOV abs,Y    Absolute ();    S9xAPUSetByte (APURegisters.YA.B.Y, IAPU.Address);    IAPU.PC += 3;}void ApuCD (){// MOV X,#00    APURegisters.X = OP1;    APUSetZN8 (APURegisters.X);    IAPU.PC += 2;}void ApuCF (){// MUL YA    APURegisters.YA.W = (uint16) APURegisters.YA.B.A * APURegisters.YA.B.Y;    APUSetZN16 (APURegisters.YA.W);    IAPU.PC++;}void ApuD4 (){// MOV dp+X, A    S9xAPUSetByteZ (APURegisters.YA.B.A, OP1 + APURegisters.X);    IAPU.PC += 2;}void ApuD5 (){// MOV abs+X,A    AbsoluteX ();    S9xAPUSetByte (APURegisters.YA.B.A, IAPU.Address);    IAPU.PC += 3;}void ApuD6 (){// MOV abs+Y,A    AbsoluteY ();    S9xAPUSetByte (APURegisters.YA.B.A, IAPU.Address);    IAPU.PC += 3;}void ApuD7 (){// MOV (dp)+Y,A    IndirectIndexedY ();    S9xAPUSetByte (APURegisters.YA.B.A, IAPU.Address);    IAPU.PC += 2;}void ApuD8 (){// MOV dp,X    S9xAPUSetByteZ (APURegisters.X, OP1);    IAPU.PC += 2;}void ApuD9 (){// MOV dp+Y,X    S9xAPUSetByteZ (APURegisters.X, OP1 + APURegisters.YA.B.Y);    IAPU.PC += 2;}void ApuDB (){// MOV dp+X,Y    S9xAPUSetByteZ (APURegisters.YA.B.Y, OP1 + APURegisters.X);    IAPU.PC += 2;}void ApuDF (){// DAA    W1 = APURegisters.YA.B.A & 0xf;    W2 = APURegisters.YA.B.A >> 4;    APUClearCarry ();    if (W1 > 9)    {	W1 -= 10;	W2++;    }    if (W2 > 9)    {	W2 -= 10;	APUSetCarry ();    }    APURegisters.YA.B.A = W1 | (W2 << 4);    APUSetZN8 (APURegisters.YA.B.A);    IAPU.PC++;}void ApuE4 (){// MOV A, dp    APURegisters.YA.B.A = S9xAPUGetByteZ (OP1);    APUSetZN8 (APURegisters.YA.B.A);    IAPU.PC += 2;}void ApuE5 (){// MOV A,abs    Absolute ();    APURegisters.YA.B.A = S9xAPUGetByte (IAPU.Address);    APUSetZN8 (APURegisters.YA.B.A);    IAPU.PC += 3;}void ApuE6 (){// MOV A,(X)    APURegisters.YA.B.A = S9xAPUGetByteZ (APURegisters.X);    APUSetZN8 (APURegisters.YA.B.A);    IAPU.PC++;}void ApuE7 (){// MOV A,(dp+X)    IndexedXIndirect ();    APURegisters.YA.B.A = S9xAPUGetByte (IAPU.Address);    APUSetZN8 (APURegisters.YA.B.A);    IAPU.PC += 2;}void ApuE8 (){// MOV A,#00    APURegisters.YA.B.A = OP1;    APUSetZN8 (APURegisters.YA.B.A);    IAPU.PC += 2;}void ApuE9 (){// MOV X, abs    Absolute ();    APURegisters.X = S9xAPUGetByte (IAPU.Address);    APUSetZN8 (APURegisters.X);    IAPU.PC += 3;}void ApuEB (){// MOV Y,dp    APURegisters.YA.B.Y = S9xAPUGetByteZ (OP1);    APUSetZN8 (APURegisters.YA.B.Y);    IAPU.PC += 2;}void ApuEC (){// MOV Y,abs    Absolute ();    APURegisters.YA.B.Y = S9xAPUGetByte (IAPU.Address);    APUSetZN8 (APURegisters.YA.B.Y);    IAPU.PC += 3;}void ApuF4 (){// MOV A, dp+X    APURegisters.YA.B.A = S9xAPUGetByteZ (OP1 + APURegisters.X);    APUSetZN8 (APURegisters.YA.B.A);    IAPU.PC += 2;}void ApuF5 (){// MOV A, abs+X    AbsoluteX ();    APURegisters.YA.B.A = S9xAPUGetByte (IAPU.Address);    APUSetZN8 (APURegisters.YA.B.A);    IAPU.PC += 3;}void ApuF6 (){// MOV A, abs+Y    AbsoluteY ();    APURegisters.YA.B.A = S9xAPUGetByte (IAPU.Address);    APUSetZN8 (APURegisters.YA.B.A);    IAPU.PC += 3;}void ApuF7 (){// MOV A, (dp)+Y    IndirectIndexedY ();    APURegisters.YA.B.A = S9xAPUGetByte (IAPU.Address);    APUSetZN8 (APURegisters.YA.B.A);    IAPU.PC += 2;}void ApuF8 (){// MOV X,dp    APURegisters.X = S9xAPUGetByteZ (OP1);    APUSetZN8 (APURegisters.X);    IAPU.PC += 2;}void ApuF9 (){// MOV X,dp+Y    APURegisters.X = S9xAPUGetByteZ (OP1 + APURegisters.YA.B.Y);    APUSetZN8 (APURegisters.X);    IAPU.PC += 2;}void ApuFA (){// MOV dp(dest),dp(src)    S9xAPUSetByteZ (S9xAPUGetByteZ (OP1), OP2);    IAPU.PC += 3;}void ApuFB (){// MOV Y,dp+X    APURegisters.YA.B.Y = S9xAPUGetByteZ (OP1 + APURegisters.X);    APUSetZN8 (APURegisters.YA.B.Y);    IAPU.PC += 2;}#ifdef NO_INLINE_SET_GET#undef INLINE#define INLINE#include "apumem.h"#endifvoid (*S9xApuOpcodes[256]) (void) ={	Apu00, Apu01, Apu02, Apu03, Apu04, Apu05, Apu06, Apu07,	Apu08, Apu09, Apu0A, Apu0B, Apu0C, Apu0D, Apu0E, Apu0F,	Apu10, Apu11, Apu12, Apu13, Apu14, Apu15, Apu16, Apu17,	Apu18, Apu19, Apu1A, Apu1B, Apu1C, Apu1D, Apu1E, Apu1F,	Apu20, Apu21, Apu22, Apu23, Apu24, Apu25, Apu26, Apu27,	Apu28, Apu29, Apu2A, Apu2B, Apu2C, Apu2D, Apu2E, Apu2F,	Apu30, Apu31, Apu32, Apu33, Apu34, Apu35, Apu36, Apu37,	Apu38, Apu39, Apu3A, Apu3B, Apu3C, Apu3D, Apu3E, Apu3F,	Apu40, Apu41, Apu42, Apu43, Apu44, Apu45, Apu46, Apu47,	Apu48, Apu49, Apu4A, Apu4B, Apu4C, Apu4D, Apu4E, Apu4F,	Apu50, Apu51, Apu52, Apu53, Apu54, Apu55, Apu56, Apu57,	Apu58, Apu59, Apu5A, Apu5B, Apu5C, Apu5D, Apu5E, Apu5F,	Apu60, Apu61, Apu62, Apu63, Apu64, Apu65, Apu66, Apu67,	Apu68, Apu69, Apu6A, Apu6B, Apu6C, Apu6D, Apu6E, Apu6F,	Apu70, Apu71, Apu72, Apu73, Apu74, Apu75, Apu76, Apu77,	Apu78, Apu79, Apu7A, Apu7B, Apu7C, Apu7D, Apu7E, Apu7F,	Apu80, Apu81, Apu82, Apu83, Apu84, Apu85, Apu86, Apu87,	Apu88, Apu89, Apu8A, Apu8B, Apu8C, Apu8D, Apu8E, Apu8F,	Apu90, Apu91, Apu92, Apu93, Apu94, Apu95, Apu96, Apu97,	Apu98, Apu99, Apu9A, Apu9B, Apu9C, Apu9D, Apu9E, Apu9F,	ApuA0, ApuA1, ApuA2, ApuA3, ApuA4, ApuA5, ApuA6, ApuA7,	ApuA8, ApuA9, ApuAA, ApuAB, ApuAC, ApuAD, ApuAE, ApuAF,	ApuB0, ApuB1, ApuB2, ApuB3, ApuB4, ApuB5, ApuB6, ApuB7,	ApuB8, ApuB9, ApuBA, ApuBB, ApuBC, ApuBD, ApuBE, ApuBF,	ApuC0, ApuC1, ApuC2, ApuC3, ApuC4, ApuC5, ApuC6, ApuC7,	ApuC8, ApuC9, ApuCA, ApuCB, ApuCC, ApuCD, ApuCE, ApuCF,	ApuD0, ApuD1, ApuD2, ApuD3, ApuD4, ApuD5, ApuD6, ApuD7,	ApuD8, ApuD9, ApuDA, ApuDB, ApuDC, ApuDD, ApuDE, ApuDF,	ApuE0, ApuE1, ApuE2, ApuE3, ApuE4, ApuE5, ApuE6, ApuE7,	ApuE8, ApuE9, ApuEA, ApuEB, ApuEC, ApuED, ApuEE, ApuEF,	ApuF0, ApuF1, ApuF2, ApuF3, ApuF4, ApuF5, ApuF6, ApuF7,	ApuF8, ApuF9, ApuFA, ApuFB, ApuFC, ApuFD, ApuFE, ApuFF};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -