📄 z80.c
字号:
* 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 + -