mirror of
https://github.com/mauiaaron/apple2.git
synced 2025-01-12 06:29:58 +00:00
DAA and DAS algorithms for x86_64
This commit is contained in:
parent
2def12c703
commit
995643dfa2
@ -20,6 +20,9 @@
|
|||||||
#define PC_Reg %si /* 6502 Program Counter */
|
#define PC_Reg %si /* 6502 Program Counter */
|
||||||
#define EffectiveAddr %di /* Effective address */
|
#define EffectiveAddr %di /* Effective address */
|
||||||
|
|
||||||
|
#define X86_CF_Bit 0x0 /* x86 carry */
|
||||||
|
#define X86_AF_Bit 0x4 /* x86 adj (nybble carry) */
|
||||||
|
|
||||||
#if __LP64__
|
#if __LP64__
|
||||||
# define SZ_PTR 8
|
# define SZ_PTR 8
|
||||||
# define ROR_BIT 63
|
# define ROR_BIT 63
|
||||||
|
@ -127,7 +127,7 @@
|
|||||||
#define FlagNVZC \
|
#define FlagNVZC \
|
||||||
pushfLQ; \
|
pushfLQ; \
|
||||||
popLQ _XAX; \
|
popLQ _XAX; \
|
||||||
andLQ $0x08C1,_XAX; \
|
andLQ $(N_Flag|(V_Flag<<8)|Z_Flag|C_Flag),_XAX; \
|
||||||
andb $~(N_Flag|V_Flag|Z_Flag|C_Flag), F_Reg; \
|
andb $~(N_Flag|V_Flag|Z_Flag|C_Flag), F_Reg; \
|
||||||
orb %ah, F_Reg; \
|
orb %ah, F_Reg; \
|
||||||
orb %al, F_Reg;
|
orb %al, F_Reg;
|
||||||
@ -445,13 +445,50 @@ E(op_ADC_dec)
|
|||||||
DebugBCDCheck
|
DebugBCDCheck
|
||||||
bt $C_Flag_Bit, AF_Reg_X
|
bt $C_Flag_Bit, AF_Reg_X
|
||||||
adcb A_Reg, %al
|
adcb A_Reg, %al
|
||||||
#ifdef __LP64__
|
#if !defined(__LP64__)
|
||||||
#warning TODO FIXME das instruction
|
|
||||||
#else
|
|
||||||
daa
|
daa
|
||||||
#endif
|
|
||||||
movb %al, A_Reg
|
movb %al, A_Reg
|
||||||
FlagNVZC
|
FlagNVZC
|
||||||
|
#else
|
||||||
|
// DAA algorithm : http://www.ray.masmcode.com/BCDdaa.html
|
||||||
|
// CF_old = CF
|
||||||
|
// IF (al AND 0Fh > 9) or (the Auxilliary Flag is set)
|
||||||
|
// al = al + 6
|
||||||
|
// CF = CF (automagically) or CF_old
|
||||||
|
// AF set (automagically)
|
||||||
|
// ENDIF
|
||||||
|
// IF (al > 99h) or (Carry Flag is set)
|
||||||
|
// al = al + 60h
|
||||||
|
// CF set
|
||||||
|
// ENDIF
|
||||||
|
pushq _XBX
|
||||||
|
pushfq
|
||||||
|
popq _XBX
|
||||||
|
andb $~(N_Flag|V_Flag|Z_Flag|C_Flag), F_Reg
|
||||||
|
movb %al, %ah
|
||||||
|
andb $0x0f, %ah
|
||||||
|
cmpb $9, %ah
|
||||||
|
jg _daa_lo_nyb
|
||||||
|
btq $X86_AF_Bit, _XBX
|
||||||
|
jnc _daa_next0
|
||||||
|
_daa_lo_nyb: addb $6, %al // adjust lo nybble
|
||||||
|
jc _daa_hi_nyb
|
||||||
|
_daa_next0: btq $X86_CF_Bit, _XBX
|
||||||
|
jc _daa_hi_nyb
|
||||||
|
xorb %ah, %ah
|
||||||
|
cmpw $0x99, %ax
|
||||||
|
jle _daa_next1
|
||||||
|
_daa_hi_nyb: addb $0x60, %al // adjust hi nybble
|
||||||
|
orb $C_Flag, F_Reg // FlagC
|
||||||
|
_daa_next1: testq $0x80, %rax
|
||||||
|
jz _daa_next2
|
||||||
|
orb $N_Flag, F_Reg // FlagN
|
||||||
|
_daa_next2: testq $0xFF, %rax
|
||||||
|
jnz _daa_finish
|
||||||
|
orb $Z_Flag, F_Reg // FlagZ
|
||||||
|
_daa_finish: popq _XBX
|
||||||
|
movb %al, A_Reg
|
||||||
|
#endif
|
||||||
Continue
|
Continue
|
||||||
|
|
||||||
E(op_ADC_imm) // 0x69
|
E(op_ADC_imm) // 0x69
|
||||||
@ -1562,18 +1599,57 @@ E(op_SBC_dec)
|
|||||||
incb DebugCycleCount // +1 cycle
|
incb DebugCycleCount // +1 cycle
|
||||||
GetFromEA_B
|
GetFromEA_B
|
||||||
DebugBCDCheck
|
DebugBCDCheck
|
||||||
bt $C_Flag_Bit, AF_Reg_X
|
btc $C_Flag_Bit, AF_Reg_X
|
||||||
cmc
|
|
||||||
xchgb A_Reg, %al
|
xchgb A_Reg, %al
|
||||||
|
#if !defined(__LP64__)
|
||||||
sbbb A_Reg, %al
|
sbbb A_Reg, %al
|
||||||
#ifdef __LP64__
|
|
||||||
#warning TODO FIXME das instruction
|
|
||||||
#else
|
|
||||||
das
|
das
|
||||||
#endif
|
|
||||||
movb %al, A_Reg
|
movb %al, A_Reg
|
||||||
cmc
|
cmc
|
||||||
FlagNVZC
|
FlagNVZC
|
||||||
|
#else
|
||||||
|
cmc
|
||||||
|
sbbb A_Reg, %al
|
||||||
|
// DAS algorithm : http://www.ray.masmcode.com/BCDdas.html
|
||||||
|
// CF_old = CF
|
||||||
|
// IF (al AND 0Fh > 9) or (the Auxilliary Flag is set)
|
||||||
|
// al = al - 6
|
||||||
|
// CF = CF (automagically) or CF_old
|
||||||
|
// AF set (automagically)
|
||||||
|
// ENDIF
|
||||||
|
// IF (al > 99h) or (Carry Flag is set)
|
||||||
|
// al = al - 60h
|
||||||
|
// ^CF set
|
||||||
|
// ENDIF
|
||||||
|
pushq _XBX
|
||||||
|
pushfq
|
||||||
|
popq _XBX
|
||||||
|
andb $~(N_Flag|V_Flag|Z_Flag), F_Reg
|
||||||
|
orb $C_Flag, F_Reg
|
||||||
|
movb %al, %ah
|
||||||
|
andb $0x0f, %ah
|
||||||
|
cmpb $9, %ah
|
||||||
|
jg _das_lo_nyb
|
||||||
|
btq $X86_AF_Bit, _XBX
|
||||||
|
jnc _das_next0
|
||||||
|
_das_lo_nyb: subb $6, %al // adjust lo nybble
|
||||||
|
jc _das_hi_nyb
|
||||||
|
_das_next0: btq $X86_CF_Bit, _XBX
|
||||||
|
jc _das_hi_nyb
|
||||||
|
xorb %ah, %ah
|
||||||
|
cmpw $0x99, %ax
|
||||||
|
jle _das_next1
|
||||||
|
_das_hi_nyb: subb $0x60, %al // adjust hi nybble
|
||||||
|
andb $~C_Flag, F_Reg // !FlagC
|
||||||
|
_das_next1: testq $0x80, %rax
|
||||||
|
jz _das_next2
|
||||||
|
orb $N_Flag, F_Reg // FlagN
|
||||||
|
_das_next2: testq $0xFF, %rax
|
||||||
|
jnz _das_finish
|
||||||
|
orb $Z_Flag, F_Reg // FlagZ
|
||||||
|
_das_finish: popq _XBX
|
||||||
|
movb %al, A_Reg
|
||||||
|
#endif
|
||||||
Continue
|
Continue
|
||||||
|
|
||||||
E(op_SBC_imm) // 0xe9
|
E(op_SBC_imm) // 0xe9
|
||||||
|
Loading…
x
Reference in New Issue
Block a user