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

📄 z80.c

📁 这个是延伸mame的在wince平台下的游戏模拟器的代码
💻 C
📖 第 1 页 / 共 5 页
字号:
 * RLA
 ***************************************************************/
#define RLA {													\
	UINT8 res = (_A << 1) | (_F & CF);							\
	UINT8 c = (_A & 0x80) ? CF : 0; 							\
	_F = (_F & (SF | ZF | YF | XF | PF)) | c;					\
	_A = res;													\
}

/***************************************************************
 * RRA
 ***************************************************************/
#define RRA {													\
	UINT8 res = (_A >> 1) | (_F << 7);							\
	UINT8 c = (_A & 0x01) ? CF : 0; 							\
    _F = (_F & (SF | ZF | YF | XF | PF)) | c;                   \
	_A = res;													\
}

/***************************************************************
 * RRD
 ***************************************************************/
#define RRD {													\
	UINT8 n = RM(_HL);											\
	WM( _HL,(n >> 4) | (_A << 4) ); 							\
	_A = (_A & 0xf0) | (n & 0x0f);								\
	_F = (_F & CF) | SZP[_A];									\
}

/***************************************************************
 * RLD
 ***************************************************************/
#define RLD {                                                   \
    UINT8 n = RM(_HL);                                          \
    WM( _HL,(n << 4) | (_A & 0x0f) );                           \
    _A = (_A & 0xf0) | (n >> 4);                                \
	_F = (_F & CF) | SZP[_A];									\
}

/***************************************************************
 * ADD	A,n
 ***************************************************************/
#ifdef X86_ASM
#define ADD(Value)												\
 asm (															\
 " addb %2,%0           \n"                                     \
 " lahf                 \n"                                     \
 " setob %%al           \n" /* al = 1 if overflow */            \
 " shlb $2,%%al         \n" /* shift to P/V bit position */     \
 " andb $0xd1,%%ah      \n" /* sign, zero, half carry, carry */ \
 " orb %%ah,%%al        \n"                                     \
 :"=g" (_A), "=a" (_F)                                          \
 :"r" (Value), "0" (_A)                                         \
 )
#else
#if BIG_FLAGS_ARRAY
#define ADD(Value) {											\
	unsigned val = Value;										\
	unsigned res = (_A + val) & 0xff;							\
	_F = SZHVC_add[(_A << 8) | res];							\
    _A = res;                                                   \
}
#else
#define ADD(Value) {											\
	unsigned val = Value;										\
    unsigned res = _A + val;                                    \
    _F = SZ[(UINT8)res] | ((res >> 8) & CF) |                   \
        ((_A ^ res ^ val) & HF) |                               \
        (((val ^ _A ^ 0x80) & (val ^ res) & 0x80) >> 5);        \
    _A = (UINT8)res;                                            \
}
#endif
#endif

/***************************************************************
 * ADC	A,n
 ***************************************************************/
#ifdef X86_ASM
#define ADC(Value)												\
 asm (															\
 " shrb $1,%%al         \n"                                     \
 " adcb %2,%0           \n"                                     \
 " lahf                 \n"                                     \
 " setob %%al           \n" /* al = 1 if overflow */            \
 " shlb $2,%%al         \n" /* shift to P/V bit position */     \
 " andb $0xd1,%%ah      \n" /* sign, zero, half carry, carry */ \
 " orb %%ah,%%al        \n" /* combine with P/V */              \
 :"=g" (_A), "=a" (_F)                                          \
 :"r" (Value), "a" (_F), "0" (_A)                               \
 )
#else
#if BIG_FLAGS_ARRAY
#define ADC(Value) {											\
	unsigned val = Value;										\
	unsigned res = (_A + val + (_F & CF)) & 0xff;				\
	_F = SZHVC_add[((_F & CF) << 16) | (_A << 8) | res];		\
    _A = res;                                                   \
}
#else
#define ADC(Value) {                                            \
	unsigned val = Value;										\
	unsigned res = _A + val + (_F & CF);						\
	_F = SZ[res & 0xff] | ((res >> 8) & CF) |					\
		((_A ^ res ^ val) & HF) |								\
		(((val ^ _A ^ 0x80) & (val ^ res) & 0x80) >> 5);		\
	_A = res;													\
}
#endif
#endif

/***************************************************************
 * SUB	n
 ***************************************************************/
#ifdef X86_ASM
#define SUB(Value)												\
 asm (															\
 " subb %2,%0           \n"                                     \
 " lahf                 \n"                                     \
 " setob %%al           \n" /* al = 1 if overflow */            \
 " shlb $2,%%al         \n" /* shift to P/V bit position */     \
 " andb $0xd1,%%ah      \n" /* sign, zero, half carry, carry */ \
 " orb $2,%%al          \n" /* set N flag */                    \
 " orb %%ah,%%al        \n" /* combine with P/V */              \
 :"=g" (_A), "=a" (_F)                                          \
 :"r" (Value), "0" (_A)                                         \
 )
#else
#if BIG_FLAGS_ARRAY
#define SUB(Value) {											\
	unsigned val = Value;										\
	unsigned res = (_A - val) & 0xff;							\
	_F = SZHVC_sub[(_A << 8) | res];							\
    _A = res;                                                   \
}
#else
#define SUB(Value) {                                            \
	unsigned val = Value;										\
	unsigned res = _A - val;									\
	_F = SZ[res & 0xff] | ((res >> 8) & CF) | NF |				\
		((_A ^ res ^ val) & HF) |								\
		(((val ^ _A) & (_A ^ res) & 0x80) >> 5);				\
	_A = res;													\
}
#endif
#endif

/***************************************************************
 * SBC	A,n
 ***************************************************************/
#ifdef X86_ASM
#define SBC(Value)												\
 asm (															\
 " shrb $1,%%al         \n"                                     \
 " sbbb %2,%0           \n"                                     \
 " lahf                 \n"                                     \
 " setob %%al           \n" /* al = 1 if overflow */            \
 " shlb $2,%%al         \n" /* shift to P/V bit position */     \
 " andb $0xd1,%%ah      \n" /* sign, zero, half carry, carry */ \
 " orb $2,%%al          \n" /* set N flag */                    \
 " orb %%ah,%%al        \n" /* combine with P/V */              \
 :"=g" (_A), "=a" (_F)                                          \
 :"r" (Value), "a" (_F), "0" (_A)                               \
 )
#else
#if BIG_FLAGS_ARRAY
#define SBC(Value) {											\
	unsigned val = Value;										\
	unsigned res = (_A - val - (_F & CF)) & 0xff;				\
	_F = SZHVC_sub[((_F & CF) << 16) | (_A << 8) | res];		\
    _A = res;                                                   \
}
#else
#define SBC(Value) {                                            \
	unsigned val = Value;										\
	unsigned res = _A - val - (_F & CF);						\
	_F = SZ[res & 0xff] | ((res >> 8) & CF) | NF |				\
		((_A ^ res ^ val) & HF) |								\
		(((val ^ _A) & (_A ^ res) & 0x80) >> 5);				\
	_A = res;													\
}
#endif
#endif

/***************************************************************
 * NEG
 ***************************************************************/
#define NEG {                                                   \
	unsigned Value = _A;										\
	_A = 0; 													\
	SUB(Value); 												\
}

/***************************************************************
 * DAA
 ***************************************************************/
#define DAA {													\
	int idx = _A;												\
	if (_F & CF) idx |= 0x100;									\
	if (_F & HF) idx |= 0x200;									\
	if (_F & NF) idx |= 0x400;									\
	_AF = DAATable[idx];										\
}

/***************************************************************
 * AND	n
 ***************************************************************/
#define AND(Value)												\
	_A &= Value;												\
	_F = SZP[_A] | HF

/***************************************************************
 * OR	n
 ***************************************************************/
#define OR(Value)												\
	_A |= Value;												\
	_F = SZP[_A]

/***************************************************************
 * XOR	n
 ***************************************************************/
#define XOR(Value)												\
	_A ^= Value;												\
	_F = SZP[_A]

/***************************************************************
 * CP	n
 ***************************************************************/
#ifdef X86_ASM
#define CP(Value)												\
 asm (															\
 " cmpb %2,%0          \n"                                      \
 " lahf                \n"                                      \
 " setob %%al          \n" /* al = 1 if overflow */             \
 " shlb $2,%%al        \n" /* shift to P/V bit position */      \
 " andb $0xd1,%%ah     \n" /* sign, zero, half carry, carry */  \
 " orb $2,%%al         \n" /* set N flag */                     \
 " orb %%ah,%%al       \n" /* combine with P/V */               \
 :"=g" (_A), "=a" (_F)                                          \
 :"r" (Value), "0" (_A)                                         \
 )
#else
#if BIG_FLAGS_ARRAY
#define CP(Value) { 											\
	unsigned val = Value;										\
	unsigned res = (_A - val) & 0xff;							\
	_F = SZHVC_sub[(_A << 8) | res];							\
}
#else
#define CP(Value) {                                             \
	unsigned val = Value;										\
	unsigned res = _A - val;									\
	_F = SZ[res & 0xff] | ((res >> 8) & CF) | NF |				\
		((_A ^ res ^ val) & HF) |								\
		((((val ^ _A) & (_A ^ res)) >> 5) & VF);				\
}
#endif
#endif

/***************************************************************
 * EX   AF,AF'
 ***************************************************************/
#define EX_AF {                                                 \
    Z80_pair tmp;                                               \
    tmp = Z80.AF; Z80.AF = Z80.AF2; Z80.AF2 = tmp;              \
}

/***************************************************************
 * EX   DE,HL
 ***************************************************************/
#define EX_DE_HL {                                              \
    Z80_pair tmp;                                               \
    tmp = Z80.DE; Z80.DE = Z80.HL; Z80.HL = tmp;                \
}

/***************************************************************
 * EXX
 ***************************************************************/
#define EXX {                                                   \
    Z80_pair tmp;                                               \
    tmp = Z80.BC; Z80.BC = Z80.BC2; Z80.BC2 = tmp;              \
    tmp = Z80.DE; Z80.DE = Z80.DE2; Z80.DE2 = tmp;              \
    tmp = Z80.HL; Z80.HL = Z80.HL2; Z80.HL2 = tmp;              \
}

/***************************************************************
 * EX   (SP),r16
 ***************************************************************/
#define EXSP(reg) {                                             \
    Z80_pair tmp;                                               \
	tmp.D = RM16( _SPD );										\
	WM16( _SPD, &Z80.reg ); 									\
	Z80.reg = tmp;												\
}


/***************************************************************
 * ADD16
 ***************************************************************/
#ifdef	X86_ASM
#define ADD16(DR,SR)											\
 asm (															\
 " andb $0xc4,%1        \n"                                     \
 " addb %%al,%%cl       \n"                                     \
 " adcb %%ah,%%ch       \n"                                     \
 " lahf                 \n"                                     \
 " andb $0x11,%%ah      \n"                                     \

⌨️ 快捷键说明

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