mirror of
https://github.com/TomHarte/CLK.git
synced 2024-07-07 08:28:57 +00:00
Improve DAA.
This commit is contained in:
parent
1b9e6e8c8e
commit
0bf2099a70
@ -294,15 +294,21 @@ inline void aas(CPU::RegisterPair16 &ax, Status &status) {
|
|||||||
|
|
||||||
inline void daa(uint8_t &al, Status &status) {
|
inline void daa(uint8_t &al, Status &status) {
|
||||||
/*
|
/*
|
||||||
|
(as modified by https://www.felixcloutier.com/x86/daa ...)
|
||||||
|
|
||||||
|
old_AL ← AL;
|
||||||
|
old_CF ← CF;
|
||||||
|
CF ← 0;
|
||||||
|
|
||||||
IF (((AL AND 0FH) > 9) or AF = 1)
|
IF (((AL AND 0FH) > 9) or AF = 1)
|
||||||
THEN
|
THEN
|
||||||
AL ← AL + 6;
|
AL ← AL + 6;
|
||||||
CF ← CF OR CarryFromLastAddition; (* CF OR carry from AL ← AL + 6 *)
|
CF ← old_CF OR CarryFromLastAddition; (* CF OR carry from AL ← AL + 6 *)
|
||||||
AF ← 1;
|
AF ← 1;
|
||||||
ELSE
|
ELSE
|
||||||
AF ← 0;
|
AF ← 0;
|
||||||
FI;
|
FI;
|
||||||
IF ((AL AND F0H) > 90H) or CF = 1)
|
IF ((old_AL > 99H) or old_CF = 1)
|
||||||
THEN
|
THEN
|
||||||
AL ← AL + 60H;
|
AL ← AL + 60H;
|
||||||
CF ← 1;
|
CF ← 1;
|
||||||
@ -315,15 +321,19 @@ inline void daa(uint8_t &al, Status &status) {
|
|||||||
decimal carry in either digit of the result (see the “Operation” section above).
|
decimal carry in either digit of the result (see the “Operation” section above).
|
||||||
The SF, ZF, and PF flags are set according to the result. The OF flag is undefined.
|
The SF, ZF, and PF flags are set according to the result. The OF flag is undefined.
|
||||||
*/
|
*/
|
||||||
|
const uint8_t old_al = al;
|
||||||
|
const auto old_carry = status.carry;
|
||||||
|
status.carry = 0;
|
||||||
|
|
||||||
if((al & 0x0f) > 0x09 || status.auxiliary_carry) {
|
if((al & 0x0f) > 0x09 || status.auxiliary_carry) {
|
||||||
status.carry |= al > 0xf9;
|
status.carry = old_carry | (al > 0xf9);
|
||||||
al += 0x06;
|
al += 0x06;
|
||||||
status.auxiliary_carry = 1;
|
status.auxiliary_carry = 1;
|
||||||
} else {
|
} else {
|
||||||
status.auxiliary_carry = 0;
|
status.auxiliary_carry = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if((al & 0xf0) > 0x90 || status.carry) {
|
if(old_al > 0x99 || old_carry) {
|
||||||
al += 0x60;
|
al += 0x60;
|
||||||
status.carry = 1;
|
status.carry = 1;
|
||||||
} else {
|
} else {
|
||||||
|
Loading…
Reference in New Issue
Block a user