📄 cpumacro.h
字号:
/* * Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. * * (c) Copyright 1996 - 2001 Gary Henderson (gary@daniver.demon.co.uk) and * Jerremy Koot (jkoot@snes9x.com) * * Super FX C emulator code * (c) Copyright 1997 - 1999 Ivar (Ivar@snes9x.com) and * Gary Henderson. * Super FX assembler emulator code (c) Copyright 1998 zsKnight and _Demo_. * * DSP1 emulator code (c) Copyright 1998 Ivar, _Demo_ and Gary Henderson. * C4 asm and some C emulation code (c) Copyright 2000 zsKnight and _Demo_. * C4 C code (c) Copyright 2001 Gary Henderson (gary@daniver.demon.co.uk). * * DOS port code contains the works of other authors. See headers in * individual files. * * Snes9x homepage: www.snes9x.com * * Permission to use, copy, modify and distribute Snes9x in both binary and * source form, for non-commercial purposes, is hereby granted without fee, * providing that this license information and copyright notice appear with * all copies and any derived work. * * This software is provided 'as-is', without any express or implied * warranty. In no event shall the authors be held liable for any damages * arising from the use of this software. * * Snes9x is freeware for PERSONAL USE only. Commercial users should * seek permission of the copyright holders first. Commercial use includes * charging money for Snes9x or software derived from Snes9x. * * The copyright holders request that bug fixes and improvements to the code * should be forwarded to them so everyone can benefit from the modifications * in future versions. * * Super NES and Super Nintendo Entertainment System are trademarks of * Nintendo Co., Limited and its subsidiary companies. */#ifndef _CPUMACRO_H_#define _CPUMACRO_H_STATIC inline void SetZN16 (uint16 Work){ ICPU._Zero = Work != 0; ICPU._Negative = (uint8) (Work >> 8);}STATIC inline void SetZN8 (uint8 Work){ ICPU._Zero = Work; ICPU._Negative = Work;}STATIC inline void ADC8 (){ Work8 = S9xGetByte (OpAddress); if (CheckDecimal ()) { A1 = (Registers.A.W) & 0xF; A2 = (Registers.A.W >> 4) & 0xF; W1 = Work8 & 0xF; W2 = (Work8 >> 4) & 0xF; A1 += W1 + CheckCarry(); if (A1 > 9) { A1 -= 10; A2++; } A2 += W2; if (A2 > 9) { A2 -= 10; SetCarry (); } else { ClearCarry (); } Ans8 = (A2 << 4) | A1; if (~(Registers.AL ^ Work8) & (Work8 ^ Ans8) & 0x80) SetOverflow(); else ClearOverflow(); Registers.AL = Ans8; SetZN8 (Registers.AL); } else { Ans16 = Registers.AL + Work8 + CheckCarry(); ICPU._Carry = Ans16 >= 0x100; if (~(Registers.AL ^ Work8) & (Work8 ^ (uint8) Ans16) & 0x80) SetOverflow(); else ClearOverflow(); Registers.AL = (uint8) Ans16; SetZN8 (Registers.AL); }}STATIC inline void ADC16 (){ Work16 = S9xGetWord (OpAddress); if (CheckDecimal ()) { A1 = (Registers.A.W) & 0xF; A2 = (Registers.A.W >> 4) & 0xF; A3 = (Registers.A.W >> 8) & 0xF; A4 = (Registers.A.W >> 12) & 0xF; W1 = Work16 & 0xF; W2 = (Work16 >> 4) & 0xF; W3 = (Work16 >> 8) & 0xF; W4 = (Work16 >> 12) & 0xF; A1 += W1 + CheckCarry (); if (A1 > 9) { A1 -= 10; A2++; } A2 += W2; if (A2 > 9) { A2 -= 10; A3++; } A3 += W3; if (A3 > 9) { A3 -= 10; A4++; } A4 += W4; if (A4 > 9) { A4 -= 10; SetCarry (); } else { ClearCarry (); } Ans16 = (A4 << 12) | (A3 << 8) | (A2 << 4) | (A1); if (~(Registers.A.W ^ Work16) & (Work16 ^ Ans16) & 0x8000) SetOverflow(); else ClearOverflow(); Registers.A.W = Ans16; SetZN16 (Registers.A.W); } else { Ans32 = Registers.A.W + Work16 + CheckCarry(); ICPU._Carry = Ans32 >= 0x10000; if (~(Registers.A.W ^ Work16) & (Work16 ^ (uint16) Ans32) & 0x8000) SetOverflow(); else ClearOverflow(); Registers.A.W = (uint16) Ans32; SetZN16 (Registers.A.W); }}STATIC inline void AND16 (){ Registers.A.W &= S9xGetWord (OpAddress); SetZN16 (Registers.A.W);}STATIC inline void AND8 (){ Registers.AL &= S9xGetByte (OpAddress); SetZN8 (Registers.AL);}STATIC inline void A_ASL16 (){#ifdef VAR_CYCLES CPU.Cycles += ONE_CYCLE;#endif ICPU._Carry = (Registers.AH & 0x80) != 0; Registers.A.W <<= 1; SetZN16 (Registers.A.W);}STATIC inline void A_ASL8 (){#ifdef VAR_CYCLES CPU.Cycles += ONE_CYCLE;#endif ICPU._Carry = (Registers.AL & 0x80) != 0; Registers.AL <<= 1; SetZN8 (Registers.AL);}STATIC inline void ASL16 (){#ifdef VAR_CYCLES CPU.Cycles += ONE_CYCLE;#endif Work16 = S9xGetWord (OpAddress); ICPU._Carry = (Work16 & 0x8000) != 0; Work16 <<= 1; S9xSetWord (Work16, OpAddress); SetZN16 (Work16);}STATIC inline void ASL8 (){#ifdef VAR_CYCLES CPU.Cycles += ONE_CYCLE;#endif Work8 = S9xGetByte (OpAddress); ICPU._Carry = (Work8 & 0x80) != 0; Work8 <<= 1; S9xSetByte (Work8, OpAddress); SetZN8 (Work8);}STATIC inline void BIT16 (){ Work16 = S9xGetWord (OpAddress); ICPU._Overflow = (Work16 & 0x4000) != 0; ICPU._Negative = (uint8) (Work16 >> 8); ICPU._Zero = (Work16 & Registers.A.W) != 0;}STATIC inline void BIT8 (){ Work8 = S9xGetByte (OpAddress); ICPU._Overflow = (Work8 & 0x40) != 0; ICPU._Negative = Work8; ICPU._Zero = Work8 & Registers.AL;}STATIC inline void CMP16 (){ Int32 = (long) Registers.A.W - (long) S9xGetWord (OpAddress); ICPU._Carry = Int32 >= 0; SetZN16 ((uint16) Int32);}STATIC inline void CMP8 (){ Int16 = (short) Registers.AL - (short) S9xGetByte (OpAddress); ICPU._Carry = Int16 >= 0; SetZN8 ((uint8) Int16);}STATIC inline void CMX16 (){ Int32 = (long) Registers.X.W - (long) S9xGetWord (OpAddress); ICPU._Carry = Int32 >= 0; SetZN16 ((uint16) Int32);}STATIC inline void CMX8 (){ Int16 = (short) Registers.XL - (short) S9xGetByte (OpAddress); ICPU._Carry = Int16 >= 0; SetZN8 ((uint8) Int16);}STATIC inline void CMY16 (){ Int32 = (long) Registers.Y.W - (long) S9xGetWord (OpAddress); ICPU._Carry = Int32 >= 0; SetZN16 ((uint16) Int32);}STATIC inline void CMY8 (){ Int16 = (short) Registers.YL - (short) S9xGetByte (OpAddress); ICPU._Carry = Int16 >= 0; SetZN8 ((uint8) Int16);}STATIC inline void A_DEC16 (){#ifdef VAR_CYCLES CPU.Cycles += ONE_CYCLE;#endif#ifdef CPU_SHUTDOWN CPU.WaitAddress = NULL;#endif Registers.A.W--; SetZN16 (Registers.A.W);}STATIC inline void A_DEC8 (){#ifdef VAR_CYCLES CPU.Cycles += ONE_CYCLE;#endif#ifdef CPU_SHUTDOWN CPU.WaitAddress = NULL;#endif Registers.AL--; SetZN8 (Registers.AL);}STATIC inline void DEC16 (){#ifdef VAR_CYCLES CPU.Cycles += ONE_CYCLE;#endif#ifdef CPU_SHUTDOWN CPU.WaitAddress = NULL;#endif Work16 = S9xGetWord (OpAddress) - 1; S9xSetWord (Work16, OpAddress); SetZN16 (Work16);}STATIC inline void DEC8 (){#ifdef VAR_CYCLES CPU.Cycles += ONE_CYCLE;#endif#ifdef CPU_SHUTDOWN CPU.WaitAddress = NULL;#endif Work8 = S9xGetByte (OpAddress) - 1; S9xSetByte (Work8, OpAddress); SetZN8 (Work8);}STATIC inline void EOR16 (){ Registers.A.W ^= S9xGetWord (OpAddress); SetZN16 (Registers.A.W);}STATIC inline void EOR8 (){ Registers.AL ^= S9xGetByte (OpAddress); SetZN8 (Registers.AL);}STATIC inline void A_INC16 (){#ifdef VAR_CYCLES CPU.Cycles += ONE_CYCLE;#endif#ifdef CPU_SHUTDOWN CPU.WaitAddress = NULL;#endif Registers.A.W++; SetZN16 (Registers.A.W);}STATIC inline void A_INC8 (){#ifdef VAR_CYCLES CPU.Cycles += ONE_CYCLE;#endif#ifdef CPU_SHUTDOWN CPU.WaitAddress = NULL;#endif Registers.AL++; SetZN8 (Registers.AL);}STATIC inline void INC16 (){#ifdef VAR_CYCLES CPU.Cycles += ONE_CYCLE;#endif#ifdef CPU_SHUTDOWN CPU.WaitAddress = NULL;#endif Work16 = S9xGetWord (OpAddress) + 1; S9xSetWord (Work16, OpAddress); SetZN16 (Work16);}STATIC inline void INC8 (){#ifdef VAR_CYCLES
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -