mirror of
https://github.com/transistorfet/moa.git
synced 2024-11-21 19:30:52 +00:00
Attempted to implement DAA but still have a lot of failures
This commit is contained in:
parent
5ec2fe4157
commit
6390a207a6
@ -193,8 +193,49 @@ impl Z80 {
|
|||||||
self.set_flag(Flags::HalfCarry, true);
|
self.set_flag(Flags::HalfCarry, true);
|
||||||
self.set_flag(Flags::AddSubtract, true);
|
self.set_flag(Flags::AddSubtract, true);
|
||||||
},
|
},
|
||||||
//Instruction::DAA => {
|
Instruction::DAA => {
|
||||||
//},
|
// From <http://z80-heaven.wikidot.com/instructions-set:daa>
|
||||||
|
// if the least significant four bits of A contain a non-BCD digit (i. e. it is
|
||||||
|
// greater than 9) or the H flag is set, then $06 is added to the register. Then
|
||||||
|
// the four most significant bits are checked. If this more significant digit
|
||||||
|
// also happens to be greater than 9 or the C flag is set, then $60 is added.
|
||||||
|
|
||||||
|
// From <http://www.z80.info/zip/z80-documented.pdf>
|
||||||
|
//
|
||||||
|
// CF | high | HF | low | diff
|
||||||
|
// | nibble | | nibble |
|
||||||
|
//----------------------------------
|
||||||
|
// 0 | 0-9 | 0 | 0-9 | 00
|
||||||
|
// 0 | 0-9 | 1 | 0-9 | 06
|
||||||
|
// 0 | 0-8 | * | a-f | 06
|
||||||
|
// 0 | a-f | 0 | 0-9 | 60
|
||||||
|
// 1 | * | 0 | 0-9 | 60
|
||||||
|
// 1 | * | 1 | 0-9 | 66
|
||||||
|
// 1 | * | * | a-f | 66
|
||||||
|
// 0 | 9-f | * | a-f | 66
|
||||||
|
// 0 | a-f | 1 | 0-9 | 66
|
||||||
|
|
||||||
|
let mut value = self.get_register_value(Register::A);
|
||||||
|
let mut carry = false;
|
||||||
|
let mut half_carry = false;
|
||||||
|
if (value & 0x0F) > 9 || self.get_flag(Flags::HalfCarry) {
|
||||||
|
let (result, _, _, half_carry1) = add_bytes(value, 6);
|
||||||
|
value = result;
|
||||||
|
half_carry = half_carry1;
|
||||||
|
}
|
||||||
|
if (value & 0xF0) > 0x90 || self.get_flag(Flags::Carry) {
|
||||||
|
let (result, _, _, half_carry2) = add_bytes(value, 0x60);
|
||||||
|
value = result;
|
||||||
|
half_carry |= half_carry2;
|
||||||
|
carry = true;
|
||||||
|
}
|
||||||
|
self.set_register_value(Register::A, value);
|
||||||
|
|
||||||
|
self.set_numeric_flags(value as u16, Size::Byte);
|
||||||
|
self.set_parity_flags(value);
|
||||||
|
self.set_flag(Flags::HalfCarry, half_carry);
|
||||||
|
self.set_flag(Flags::Carry, carry);
|
||||||
|
},
|
||||||
Instruction::DEC16(regpair) => {
|
Instruction::DEC16(regpair) => {
|
||||||
let value = self.get_register_pair_value(regpair);
|
let value = self.get_register_pair_value(regpair);
|
||||||
|
|
||||||
@ -910,9 +951,8 @@ impl Z80 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn set_parity_flags(&mut self, value: u8) {
|
fn set_parity_flags(&mut self, value: u8) {
|
||||||
let mask = (Flags::Parity as u8) | (Flags::AddSubtract as u8);
|
|
||||||
let parity = if (value.count_ones() & 0x01) == 0 { Flags::Parity as u8 } else { 0 };
|
let parity = if (value.count_ones() & 0x01) == 0 { Flags::Parity as u8 } else { 0 };
|
||||||
self.set_flags(mask, parity);
|
self.set_flags(Flags::Parity as u8, parity);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn set_arithmetic_op_flags(&mut self, value: u16, size: Size, addsub: bool, carry: bool, overflow: bool, half_carry: bool) {
|
fn set_arithmetic_op_flags(&mut self, value: u16, size: Size, addsub: bool, carry: bool, overflow: bool, half_carry: bool) {
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
Last run on 2023-05-13 at commit f3d1fd0ae2410a164c92150cc3caa0f525cbb4b7
|
Last run on 2023-05-13 at commit 5ec2fe41578e06279419b35826bb4b575bc14c09
|
||||||
|
|
||||||
00.json completed, all passed!
|
00.json completed, all passed!
|
||||||
01.json completed, all passed!
|
01.json completed, all passed!
|
||||||
@ -41,7 +41,7 @@ Last run on 2023-05-13 at commit f3d1fd0ae2410a164c92150cc3caa0f525cbb4b7
|
|||||||
24.json completed, all passed!
|
24.json completed, all passed!
|
||||||
25.json completed, all passed!
|
25.json completed, all passed!
|
||||||
26.json completed, all passed!
|
26.json completed, all passed!
|
||||||
27.json completed: 0 passed, 1000 FAILED
|
27.json completed: 396 passed, 604 FAILED
|
||||||
28.json completed, all passed!
|
28.json completed, all passed!
|
||||||
29.json completed, all passed!
|
29.json completed, all passed!
|
||||||
2a.json completed, all passed!
|
2a.json completed, all passed!
|
||||||
@ -643,5 +643,5 @@ fd f9.json completed, all passed!
|
|||||||
fe.json completed, all passed!
|
fe.json completed, all passed!
|
||||||
ff.json completed, all passed!
|
ff.json completed, all passed!
|
||||||
|
|
||||||
passed: 628998, failed: 13002, total 98%
|
passed: 629394, failed: 12606, total 98%
|
||||||
completed in 0m 31s
|
completed in 0m 32s
|
||||||
|
Loading…
Reference in New Issue
Block a user