From 265f4b49e5c2bbf66401b43b2aac42c80be75491 Mon Sep 17 00:00:00 2001 From: Richard Cornwell Date: Sun, 7 Nov 2021 12:04:28 -0500 Subject: [PATCH] IBM360: Fixed bug in AP instruction, thanks to Roberto Sancho for finding this. --- IBM360/ibm360_cpu.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/IBM360/ibm360_cpu.c b/IBM360/ibm360_cpu.c index ff1cbd4..ba403b5 100644 --- a/IBM360/ibm360_cpu.c +++ b/IBM360/ibm360_cpu.c @@ -5750,7 +5750,8 @@ dec_add(int op, uint32 addr1, uint8 len1, uint32 addr2, uint8 len2) if (op & 1) sb = !sb; - len = 2*(len+1)+1; + /* Length is 1 plus number of digits times two, including the sign nibble. */ + len = 2*(len+1)-1; /* On all but ZAP load first operand */ if ((op & 3) != 0) { if (dec_load(a, addr1, (int)len1, &sa)) @@ -5765,7 +5766,7 @@ dec_add(int op, uint32 addr1, uint8 len1, uint32 addr2, uint8 len2) cy = addsub; zero = 1; /* Add numbers together */ - for (i = 1; i < len; i++) { + for (i = 1; i <= len; i++) { acc = b[i] + ((addsub)? (0x9 - a[i]):a[i]) + cy; if (acc > 0x9) acc += 0x6; @@ -5784,7 +5785,7 @@ dec_add(int op, uint32 addr1, uint8 len1, uint32 addr2, uint8 len2) /* We need to recomplent the result */ cy = 1; zero = 1; - for (i = 1; i < len; i++) { + for (i = 1; i <= len; i++) { acc = (0x9 - a[i]) + cy; if (acc > 0x9) acc += 0x6; @@ -5803,7 +5804,7 @@ dec_add(int op, uint32 addr1, uint8 len1, uint32 addr2, uint8 len2) if ((op & 3) != 1) { if (!zero && !ov) { /* Start at len1 and go to len2 and see if any non-zero digits */ - for (i = (len1+1)*2; i < len; i++) { + for (i = (len1+1)*2; i <= len; i++) { if (a[i] != 0) { ov = 1; break;