Skip to content
This repository was archived by the owner on Dec 27, 2024. It is now read-only.

Commit eebe094

Browse files
committed
add8 adc did not work
1 parent 3a8dd4b commit eebe094

File tree

2 files changed

+40
-50
lines changed

2 files changed

+40
-50
lines changed

src/emu/flags.rs

Lines changed: 11 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -395,26 +395,18 @@ impl Flags {
395395
result as u64
396396
}
397397

398-
pub fn add8(&mut self, value1: u64, value2: u64, input_cf: bool) -> u64 {
399-
// Do full addition including carry
400-
let result = (value1 as u8).wrapping_add(value2 as u8).wrapping_add(if input_cf { 1 } else { 0 });
401-
402-
// Check carry by doing additions step by step
403-
let (temp, first_carry) = (value2 as u8).overflowing_add(value1 as u8);
404-
let (_, second_carry) = temp.overflowing_add(if input_cf { 1 } else { 0 });
405-
self.f_cf = first_carry || second_carry;
406-
407-
// Similar for overflow
408-
let (temp_s, first_overflow) = (value2 as u8 as i8).overflowing_add(value1 as u8 as i8);
409-
let (_, second_overflow) = temp_s.overflowing_add(if input_cf { 1 } else { 0 });
410-
self.f_of = first_overflow || second_overflow;
411-
412-
// Rest of flags based on final result
413-
self.f_sf = (result as i8) < 0;
414-
self.f_zf = result == 0;
415-
self.calc_pf(result);
398+
pub fn add8(&mut self, value1: u64, value2: u64) -> u64 {
399+
let unsigned: u16 = value1 as u8 as u16 + value2 as u8 as u16;
400+
401+
self.f_sf = (unsigned as i8) < 0;
402+
self.f_zf = (unsigned & 0xff) == 0;
403+
self.calc_pf(unsigned as u8);
404+
let (result, carry) = (value2 as u8).overflowing_add(value1 as u8);
405+
let (_, overflow) = (value2 as u8 as i8).overflowing_add(value1 as u8 as i8);
406+
self.f_of = overflow;
407+
self.f_cf = carry;
416408
self.calc_af(value1, value2, result as u64, 8);
417-
409+
418410
result as u64
419411
}
420412

src/emu/mod.rs

Lines changed: 29 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -5128,10 +5128,10 @@ impl Emu {
51285128
};
51295129

51305130
let res: u64 = match self.get_operand_sz(&ins, 1) {
5131-
64 => self.flags.add64(value0, value1), // TODO: cf as separate argument
5132-
32 => self.flags.add32(value0, value1), // TODO: cf as separate argument
5133-
16 => self.flags.add16(value0, value1), // TODO: cf as separate argument
5134-
8 => self.flags.add8(value0, value1, self.flags.f_cf),
5131+
64 => self.flags.add64(value0, value1),
5132+
32 => self.flags.add32(value0, value1),
5133+
16 => self.flags.add16(value0, value1),
5134+
8 => self.flags.add8(value0, value1),
51355135
_ => unreachable!("weird size"),
51365136
};
51375137

@@ -5142,37 +5142,35 @@ impl Emu {
51425142

51435143
Mnemonic::Adc => {
51445144
self.show_instruction(&self.colors.cyan, &ins);
5145-
5145+
51465146
assert!(ins.op_count() == 2);
5147-
5148-
// Get current carry flag value
5149-
let cf = if self.flags.f_cf { 1 } else { 0 };
5150-
5151-
// Get the size first to ensure consistent handling
5152-
let size = self.get_operand_sz(&ins, 1);
5153-
5154-
// Get destination value (first operand)
5155-
let dest = match self.get_operand_value(&ins, 0, true) {
5147+
5148+
let cf: u64;
5149+
if self.flags.f_cf {
5150+
cf = 1
5151+
} else {
5152+
cf = 0;
5153+
}
5154+
5155+
let value0 = match self.get_operand_value(&ins, 0, true) {
51565156
Some(v) => v,
51575157
None => return false,
51585158
};
5159-
5160-
// Get source value (second operand)
5161-
let src = match self.get_operand_value(&ins, 1, true) {
5159+
5160+
let value1 = match self.get_operand_value(&ins, 1, true) {
51625161
Some(v) => v,
51635162
None => return false,
51645163
};
5165-
5166-
// Do the addition with carry
5167-
let res = match size {
5168-
64 => self.flags.add64(dest, src + cf), // TODO: cf as separate argument
5169-
32 => self.flags.add32(dest, src + cf), // TODO: cf as separate argument
5170-
16 => self.flags.add16(dest, src + cf), // TODO: cf as separate argument
5171-
8 => self.flags.add8(dest, src, self.flags.f_cf),
5164+
5165+
let res: u64;
5166+
match self.get_operand_sz(&ins, 1) {
5167+
64 => res = self.flags.add64(value0, value1 + cf),
5168+
32 => res = self.flags.add32(value0, value1 + cf),
5169+
16 => res = self.flags.add16(value0, value1 + cf),
5170+
8 => res = self.flags.add8(value0, value1 + cf),
51725171
_ => unreachable!("weird size"),
5173-
};
5174-
5175-
// Set the result
5172+
}
5173+
51765174
if !self.set_operand_value(&ins, 0, res) {
51775175
return false;
51785176
}
@@ -6588,10 +6586,10 @@ impl Emu {
65886586
}
65896587

65906588
let res: u64 = match self.get_operand_sz(&ins, 1) {
6591-
64 => self.flags.add64(value0, value1), // TODO: cf as separate argument
6592-
32 => self.flags.add32(value0, value1), // TODO: cf as separate argument
6593-
16 => self.flags.add16(value0, value1), // TODO: cf as separate argument
6594-
8 => self.flags.add8(value0, value1, self.flags.f_cf),
6589+
64 => self.flags.add64(value0, value1),
6590+
32 => self.flags.add32(value0, value1),
6591+
16 => self.flags.add16(value0, value1),
6592+
8 => self.flags.add8(value0, value1),
65956593
_ => unreachable!("weird size"),
65966594
};
65976595

0 commit comments

Comments
 (0)