📄 z80.c
字号:
asm ( \
" subb %2,%0 \n" \
" lahf \n" \
" setob %1 \n" /* al = 1 if overflow */ \
" stc \n" /* prepare to set N flag */ \
" adcb %1,%1 \n" /* shift to P/V bit position */ \
" addb %1,%1 \n" \
" andb $0xd1,%%ah \n" /* sign, zero, half carry, carry */ \
" orb %%ah,%1 \n" /* combine with P/V */ \
" movb %0,%%ah \n" /* get result */ \
" andb $0x28,%%ah \n" /* maks flags 5+3 */ \
" orb %%ah,%1 \n" /* put them into flags */ \
:"=r" (_A), "=r" (_F) \
:"r" (value), "1" (_F), "0" (_A) \
)
#else
#define SUB(value) \
asm ( \
" subb %2,%0 \n" \
" lahf \n" \
" setob %1 \n" /* al = 1 if overflow */ \
" stc \n" /* prepare to set N flag */ \
" adcb %1,%1 \n" /* shift to P/V bit position */ \
" addb %1,%1 \n" \
" andb $0xd1,%%ah \n" /* sign, zero, half carry, carry */ \
" orb %%ah,%1 \n" /* combine with P/V */ \
:"=r" (_A), "=r" (_F) \
:"r" (value), "1" (_F), "0" (_A) \
)
#endif
#else
#if BIG_FLAGS_ARRAY
#define SUB(value) \
{ \
UINT32 ah = _AFD & 0xff00; \
UINT32 res = (UINT8)((ah >> 8) - value); \
_F = SZHVC_sub[ah | 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
#if Z80_EXACT
#define SBC(value) \
asm ( \
" shrb $1,%1 \n" \
" sbbb %2,%0 \n" \
" lahf \n" \
" setob %1 \n" /* al = 1 if overflow */ \
" stc \n" /* prepare to set N flag */ \
" adcb %1,%1 \n" /* shift to P/V bit position */ \
" addb %1,%1 \n" \
" andb $0xd1,%%ah \n" /* sign, zero, half carry, carry */ \
" orb %%ah,%1 \n" /* combine with P/V */ \
" movb %0,%%ah \n" /* get result */ \
" andb $0x28,%%ah \n" /* maks flags 5+3 */ \
" orb %%ah,%1 \n" /* put them into flags */ \
:"=r" (_A), "=r" (_F) \
:"r" (value), "1" (_F), "0" (_A) \
)
#else
#define SBC(value) \
asm ( \
" shrb $1,%1 \n" \
" sbbb %2,%0 \n" \
" lahf \n" \
" setob %1 \n" /* al = 1 if overflow */ \
" stc \n" /* prepare to set N flag */ \
" adcb %1,%1 \n" /* shift to P/V bit position */ \
" addb %1,%1 \n" \
" andb $0xd1,%%ah \n" /* sign, zero, half carry, carry */ \
" orb %%ah,%1 \n" /* combine with P/V */ \
:"=r" (_A), "=r" (_F) \
:"r" (value), "1" (_F), "0" (_A) \
)
#endif
#else
#if BIG_FLAGS_ARRAY
#define SBC(value) \
{ \
UINT32 ah = _AFD & 0xff00, c = _AFD & 1; \
UINT32 res = (UINT8)((ah >> 8) - value - c); \
_F = SZHVC_sub[(c<<16) | ah | 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 { \
UINT8 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
#if Z80_EXACT
#define CP(value) \
asm ( \
" cmpb %2,%0 \n" \
" lahf \n" \
" setob %1 \n" /* al = 1 if overflow */ \
" stc \n" /* prepare to set N flag */ \
" adcb %1,%1 \n" /* shift to P/V bit position */ \
" addb %1,%1 \n" \
" andb $0xd1,%%ah \n" /* sign, zero, half carry, carry */ \
" orb %%ah,%1 \n" /* combine with P/V */ \
" movb %2,%%ah \n" /* get result */ \
" andb $0x28,%%ah \n" /* maks flags 5+3 */ \
" orb %%ah,%1 \n" /* put them into flags */ \
:"=r" (_A), "=r" (_F) \
:"r" (value), "1" (_F), "0" (_A) \
)
#else
#define CP(value) \
asm ( \
" cmpb %2,%0 \n" \
" lahf \n" \
" setob %1 \n" /* al = 1 if overflow */ \
" stc \n" /* prepare to set N flag */ \
" adcb %1,%1 \n" /* shift to P/V bit position */ \
" addb %1,%1 \n" \
" andb $0xd1,%%ah \n" /* sign, zero, half carry, carry */ \
" orb %%ah,%1 \n" /* combine with P/V */ \
:"=r" (_A), "=r" (_F) \
:"r" (value), "1" (_F), "0" (_A) \
)
#endif
#else
#if BIG_FLAGS_ARRAY
#define CP(value) \
{ \
UINT32 ah = _AFD & 0xff00; \
UINT32 res = (UINT8)((ah >> 8) - value); \
_F = SZHVC_sub[ah | 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 { \
PAIR tmp; \
tmp = Z80.AF; Z80.AF = Z80.AF2; Z80.AF2 = tmp; \
}
/***************************************************************
* EX DE,HL
***************************************************************/
#define EX_DE_HL { \
PAIR tmp; \
tmp = Z80.DE; Z80.DE = Z80.HL; Z80.HL = tmp; \
}
/***************************************************************
* EXX
***************************************************************/
#define EXX { \
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(DR) \
{ \
PAIR tmp = { { 0, 0, 0, 0 } }; \
RM16( _SPD, &tmp ); \
WM16( _SPD, &Z80.DR ); \
Z80.DR = tmp; \
}
/***************************************************************
* ADD16
***************************************************************/
#ifdef X86_ASM
#if Z80_EXACT
#define ADD16(DR,SR) \
asm ( \
" andb $0xc4,%1 \n" \
" addb %%dl,%%cl \n" \
" adcb %%dh,%%ch \n" \
" lahf \n" \
" andb $0x11,%%ah \n" \
" orb %%ah,%1 \n" \
" movb %%ch,%%ah \n" /* get result MSB */ \
" andb $0x28,%%ah \n" /* maks flags 5+3 */ \
" orb %%ah,%1 \n" /*
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -