partial revert of 85e8f873e9 as they broke unix 5

This commit is contained in:
folkert van heusden 2024-04-12 21:46:00 +02:00
parent ec9211a0f1
commit 616674f8b1
Signed by untrusted user who does not match committer: folkert
GPG key ID: 6B6455EDFEED3BD1

35
cpu.cpp
View file

@ -513,10 +513,11 @@ bool cpu::double_operand_instructions(const uint16_t instr)
} }
case 0b010: { // CMP/CMPB Compare Word/Byte case 0b010: { // CMP/CMPB Compare Word/Byte
auto g_dst = getGAM(dst_mode, dst_reg, word_mode, rm_cur);
addToMMR1(g_dst);
gam_rc_t g_src = getGAM(src_mode, src_reg, word_mode, rm_cur); gam_rc_t g_src = getGAM(src_mode, src_reg, word_mode, rm_cur);
auto g_dst = getGAM(dst_mode, dst_reg, word_mode, rm_cur);
addToMMR1(g_dst);
addToMMR1(g_src); addToMMR1(g_src);
uint16_t temp = (g_src.value.value() - g_dst.value.value()) & (word_mode == wm_byte ? 0xff : 0xffff); uint16_t temp = (g_src.value.value() - g_dst.value.value()) & (word_mode == wm_byte ? 0xff : 0xffff);
@ -530,10 +531,11 @@ bool cpu::double_operand_instructions(const uint16_t instr)
} }
case 0b011: { // BIT/BITB Bit Test Word/Byte case 0b011: { // BIT/BITB Bit Test Word/Byte
auto g_dst = getGAM(dst_mode, dst_reg, word_mode, rm_cur);
addToMMR1(g_dst);
gam_rc_t g_src = getGAM(src_mode, src_reg, word_mode, rm_cur); gam_rc_t g_src = getGAM(src_mode, src_reg, word_mode, rm_cur);
auto g_dst = getGAM(dst_mode, dst_reg, word_mode, rm_cur);
addToMMR1(g_dst);
addToMMR1(g_src); addToMMR1(g_src);
uint16_t result = (g_dst.value.value() & g_src.value.value()) & (word_mode == wm_byte ? 0xff : 0xffff); uint16_t result = (g_dst.value.value() & g_src.value.value()) & (word_mode == wm_byte ? 0xff : 0xffff);
@ -544,10 +546,11 @@ bool cpu::double_operand_instructions(const uint16_t instr)
} }
case 0b100: { // BIC/BICB Bit Clear Word/Byte case 0b100: { // BIC/BICB Bit Clear Word/Byte
auto g_dst = getGAM(dst_mode, dst_reg, word_mode, rm_cur);
addToMMR1(g_dst);
gam_rc_t g_src = getGAM(src_mode, src_reg, word_mode, rm_cur); gam_rc_t g_src = getGAM(src_mode, src_reg, word_mode, rm_cur);
auto g_dst = getGAM(dst_mode, dst_reg, word_mode, rm_cur);
addToMMR1(g_dst);
addToMMR1(g_src); addToMMR1(g_src);
uint16_t result = g_dst.value.value() & ~g_src.value.value(); uint16_t result = g_dst.value.value() & ~g_src.value.value();
@ -560,10 +563,11 @@ bool cpu::double_operand_instructions(const uint16_t instr)
case 0b101: { // BIS/BISB Bit Set Word/Byte case 0b101: { // BIS/BISB Bit Set Word/Byte
// TODO: retain MSB for register operations? // TODO: retain MSB for register operations?
auto g_dst = getGAM(dst_mode, dst_reg, word_mode, rm_cur);
addToMMR1(g_dst);
gam_rc_t g_src = getGAM(src_mode, src_reg, word_mode, rm_cur); gam_rc_t g_src = getGAM(src_mode, src_reg, word_mode, rm_cur);
auto g_dst = getGAM(dst_mode, dst_reg, word_mode, rm_cur);
addToMMR1(g_dst);
addToMMR1(g_src); addToMMR1(g_src);
uint16_t result = g_dst.value.value() | g_src.value.value(); uint16_t result = g_dst.value.value() | g_src.value.value();
@ -578,10 +582,11 @@ bool cpu::double_operand_instructions(const uint16_t instr)
} }
case 0b110: { // ADD/SUB Add/Subtract Word case 0b110: { // ADD/SUB Add/Subtract Word
auto g_dst = getGAM(dst_mode, dst_reg, wm_word, rm_cur);
addToMMR1(g_dst);
auto g_ssrc = getGAM(src_mode, src_reg, wm_word, rm_cur); auto g_ssrc = getGAM(src_mode, src_reg, wm_word, rm_cur);
auto g_dst = getGAM(dst_mode, dst_reg, wm_word, rm_cur);
addToMMR1(g_dst);
addToMMR1(g_ssrc); addToMMR1(g_ssrc);
int16_t result = 0; int16_t result = 0;