From b63232169d907c9f1a2a4fa5eb9e2fd709e73ce9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juhani=20Krekel=C3=A4?= Date: Wed, 17 Aug 2022 02:32:26 +0300 Subject: [PATCH] Implement subWord, stSub, stGtEq in calculator.asm --- calculator.asm | 65 +++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 57 insertions(+), 8 deletions(-) diff --git a/calculator.asm b/calculator.asm index c10557e..0f7986d 100644 --- a/calculator.asm +++ b/calculator.asm @@ -35,17 +35,27 @@ stAdd: ; a b -- a-b stSub: - cleq r0, r0, stNeg - breq r0, r0, stAdd - -; n -- -n -stNeg: cleq r0, r0, popWord - nand r0, r0 - nand r1, r1 - cleq r0, r0, incWord + cleq r0, r0, tmpStoreWord01 + cleq r0, r0, popWord + cleq r0, r0, tmpLoadWord23 + cleq r0, r0, subWord breq r0, r0, pushWord +; a b -- +; if a >= b then r0:r1 = 0001 +; else r0:r1 = 0000 +stGtEq: + cleq r0, r0, popWord + cleq r0, r0, tmpStoreWord01 + cleq r0, r0, popWord + cleq r0, r0, tmpLoadWord23 + cleq r0, r0, subWord + xor r0, r0 + xor r1, r1 + or r1, r2 + ret + ; ------------------------------------------------------------------ ; I/O ; ------------------------------------------------------------------ @@ -228,6 +238,45 @@ addWord: addWordSecondHigh: data 0 addWordResultLow: data 0 +; in: +; r0:r1 = minuend +; r2:r3 = subtrahend +; out: +; r0:r1 = result +; r2 = carryout +; trashes: +; r3 +subWord: + store subWordMinuendHigh, r0 + store subWordSubtrahendHigh, r2 + + ; Subtract low bytes + ; a - b = a + (-b) = a + ~b + 1 + xor r0, r0 + or r0, r3 + nand r0, r0 + load r2, lit01 + cleq r0, r0, addByte3 + store subWordResultLow, r0 + + ; Subtract high bytes with carry-in in r1 + load r0, subWordMinuendHigh + load r2, subWordSubtrahendHigh + nand r2, r2 + cleq r0, r0, addByte3 + + ; Move carryout to r2 + xor r2, r2 + or r2, r1 + + load r1, subWordResultLow + + ret + + subWordMinuendHigh: data 0 + subWordSubtrahendHigh: data 0 + subWordResultLow: data 0 + ; in/out: ; r0:r1 = word ; trashes: