📄 spc700.cpp
字号:
{// 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 + -