diff options
author | Kartik Agaram <vc@akkartik.com> | 2019-05-15 01:07:22 -0700 |
---|---|---|
committer | Kartik Agaram <vc@akkartik.com> | 2019-05-15 01:09:39 -0700 |
commit | cecb9d7688a2a969cd28b8cfef8370f2c83e8a16 (patch) | |
tree | 428c9ffb0af1f52761d55a0d8eb8edec9b111da9 /subx/015immediate_addressing.cc | |
parent | b888e42867d43e1ef2b308b42a7af7dbac578c87 (diff) | |
download | mu-cecb9d7688a2a969cd28b8cfef8370f2c83e8a16.tar.gz |
5163
A few more places with flag corrections.
Diffstat (limited to 'subx/015immediate_addressing.cc')
-rw-r--r-- | subx/015immediate_addressing.cc | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/subx/015immediate_addressing.cc b/subx/015immediate_addressing.cc index bfedac21..478e3592 100644 --- a/subx/015immediate_addressing.cc +++ b/subx/015immediate_addressing.cc @@ -449,6 +449,8 @@ case 0xc1: { *arg1 = (*arg1 << count); ZF = (*arg1 == 0); SF = (*arg1 < 0); + // CF undefined + trace(Callstack_depth+1, "run") << "SF=" << SF << "; ZF=" << ZF << "; CF=" << CF << "; OF=" << OF << end(); trace(Callstack_depth+1, "run") << "storing 0x" << HEXWORD << *arg1 << end(); break; } @@ -483,11 +485,15 @@ void test_shift_right_arithmetic_r32_with_imm8() { case 7: { // shift right r/m32 by CL, preserving sign trace(Callstack_depth+1, "run") << "subop: shift right by CL bits, while preserving sign" << end(); uint8_t count = next() & 0x1f; - *arg1 = (*arg1 >> count); + int32_t result = (*arg1 >> count); ZF = (*arg1 == 0); SF = (*arg1 < 0); // OF is only defined if count is 1 if (count == 1) OF = false; + // CF + CF = ((*arg1 >> (count-1)) & 0x1); + trace(Callstack_depth+1, "run") << "SF=" << SF << "; ZF=" << ZF << "; CF=" << CF << "; OF=" << OF << end(); + *arg1 = result; trace(Callstack_depth+1, "run") << "storing 0x" << HEXWORD << *arg1 << end(); break; } @@ -562,6 +568,8 @@ case 5: { // shift right r/m32 by CL, preserving sign ZF = (*uarg1 == 0); // result is always positive by definition SF = false; + // CF undefined + trace(Callstack_depth+1, "run") << "SF=" << SF << "; ZF=" << ZF << "; CF=" << CF << "; OF=" << OF << end(); trace(Callstack_depth+1, "run") << "storing 0x" << HEXWORD << *arg1 << end(); break; } |