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

📄 cpumacro.h

📁 著名SFC模拟器Snes9x的源代码。
💻 H
📖 第 1 页 / 共 2 页
字号:
/* * 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 + -