From 2ac02d91c226930885cbec402dbdca8a98a970c4 Mon Sep 17 00:00:00 2001 From: folkert van heusden Date: Sun, 20 Mar 2022 21:20:15 +0100 Subject: [PATCH] restructured ASH & limit to -32...31 --- cpu.cpp | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/cpu.cpp b/cpu.cpp index c04b16d..ac3365d 100644 --- a/cpu.cpp +++ b/cpu.cpp @@ -479,21 +479,20 @@ bool cpu::additional_double_operand_instructions(const uint16_t instr) case 2: { // ASH int16_t R = getRegister(reg), oldR = R; uint16_t a = getGAMAddress(dst_mode, dst_reg, false, false); - int16_t shift = b->read(a, false); + int16_t shift = b->read(a, false) & 077; // mask of lower 6 bit - if (shift > 0) { + if (shift == 0) + setPSW_c(false); + else if (shift < 32) { R <<= shift - 1; setPSW_c(R & 0x8000); R <<= 1; } - else if (shift < 0) { - R >>= -(shift + 1); + else { + R >>= 64 - shift - 1; setPSW_c(R & 1); R >>= 1; } - else { - setPSW_c(false); - } setPSW_n(R < 0); setPSW_z(R == 0);