From 902fcc8e8b33bf631981f99f3350b39ad06fdb00 Mon Sep 17 00:00:00 2001 From: Rikard Nordgren Date: Wed, 4 Feb 2026 20:29:06 +0100 Subject: [PATCH] Update add_FAC2_FAC1 --- STATUS.md | 2 +- src/basic/math/add_FAC2_FAC1_sub.s | 97 ------------------- src/basic/math/b86a.add_FAC2_FAC1.s | 138 +++++++++++++--------------- tools/similarity.c | 5 +- 4 files changed, 66 insertions(+), 176 deletions(-) delete mode 100644 src/basic/math/add_FAC2_FAC1_sub.s diff --git a/STATUS.md b/STATUS.md index ceff2392..71f5293c 100644 --- a/STATUS.md +++ b/STATUS.md @@ -209,7 +209,7 @@ Floating point mathematical routines - not official, but well known and broadly | `$B853` | `sub_FAC2_FAC1` | DONE | From the Microsoft BASIC, original name: FSUBT | | `$B862` | `add_align_exponents` | DONE | From the Microsoft BASIC, original name: FADD5 | | `$B867` | `add_MEM_FAC1` | DONE | From the Microsoft BASIC, original name: FADD | -| `$B86A` | `add_FAC2_FAC1` | DONE | | +| `$B86A` | `add_FAC2_FAC1` | DONE | From the Microsoft BASIC, original name: FADDT | | `$B8D2` | `abs_and_normal_FAC` | DONE | From the Microsoft BASIC, original name: FADFLT | | `$B8D7` | `normal_FAC1` | DONE | From the Microsoft BASIC, original name: NORMAL | | `$B8F7` | `zero_FAC1` | DONE | From the Microsoft BASIC, original name: ZEROFC | diff --git a/src/basic/math/add_FAC2_FAC1_sub.s b/src/basic/math/add_FAC2_FAC1_sub.s deleted file mode 100644 index d2fe2da1..00000000 --- a/src/basic/math/add_FAC2_FAC1_sub.s +++ /dev/null @@ -1,97 +0,0 @@ -;; #LAYOUT# STD * #TAKE -;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -;; #LAYOUT# * BASIC_0 #TAKE -;; #LAYOUT# * * #IGNORE - -; -; Math package - add FAC2 to FAC1, subtraction part -; - -; XXX test this - -add_FAC2_FAC1_sub: - - ; First verify that |FAC1| > |FAC2|, branch to proper variant if it is not - ; We ignore FACOV here. Note, that exponents are already equalized - - lda FAC1_mantissa+0 - cmp FAC2_mantissa+0 - bcc add_FAC2_FAC1_sub_rev ; if FAC1 < FAC2, branch - bne @1 ; if FAC1 > FAC2, branch - - lda FAC1_mantissa+1 - cmp FAC2_mantissa+1 - bcc add_FAC2_FAC1_sub_rev ; if FAC1 < FAC2, branch - bne @1 ; if FAC1 > FAC2, branch - - lda FAC1_mantissa+2 - cmp FAC2_mantissa+2 - bcc add_FAC2_FAC1_sub_rev ; if FAC1 < FAC2, branch - bne @1 ; if FAC1 > FAC2, branch - - lda FAC1_mantissa+3 - cmp FAC2_mantissa+3 - bcc add_FAC2_FAC1_sub_rev ; if FAC1 < FAC2, branch - bne @1 ; if FAC1 > FAC2, branch - - ; If we are here, than FAC1 is equal to FAC2 - so just set FAC1 to 0 - - lda #$00 - sta FAC1_exponent - rts -@1: - ; Perform the subtration, FAC1 = FAC1 - FAC2 - - sec - lda FAC1_mantissa+3 - sbc FAC2_mantissa+3 - sta FAC1_mantissa+3 - - lda FAC1_mantissa+2 - sbc FAC2_mantissa+2 - sta FAC1_mantissa+2 - - lda FAC1_mantissa+1 - sbc FAC2_mantissa+1 - sta FAC1_mantissa+1 - - lda FAC1_mantissa+0 - sbc FAC2_mantissa+0 - sta FAC1_mantissa+0 - - ; Exponent should never need adaptation here - - jmp normal_FAC1 - -add_FAC2_FAC1_sub_rev: - - ; Since |FAC1| < |FAC2|, toggle FAC1 sign before subtraction - - jsr toggle_sign_FAC1_skipcheck - - ; Perform the subtration, FAC1 = FAC2 - FAC1 - - sec - lda #$00 - sbc FACOV - sta FACOV - - lda FAC2_mantissa+3 - sbc FAC1_mantissa+3 - sta FAC1_mantissa+3 - - lda FAC2_mantissa+2 - sbc FAC1_mantissa+2 - sta FAC1_mantissa+2 - - lda FAC2_mantissa+1 - sbc FAC1_mantissa+1 - sta FAC1_mantissa+1 - - lda FAC2_mantissa+0 - sbc FAC1_mantissa+0 - sta FAC1_mantissa+0 - - ; Exponent should never need adaptation here - - jmp normal_FAC1 diff --git a/src/basic/math/b86a.add_FAC2_FAC1.s b/src/basic/math/b86a.add_FAC2_FAC1.s index 2ea751ae..fa661d15 100644 --- a/src/basic/math/b86a.add_FAC2_FAC1.s +++ b/src/basic/math/b86a.add_FAC2_FAC1.s @@ -3,14 +3,16 @@ ;; #LAYOUT# * BASIC_0 #TAKE ;; #LAYOUT# * * #IGNORE -; +; This file is under the MIT license, it contains code released by Microsoft Corporation. +; See LICENSE for more information. + ; Math package - add FAC2 to FAC1 ; ; Input: ; - .A - must load FAC1 exponent ($61) beforehand to set the zero flag ; -; Note: -; - load FAC2 after FAC1, or mimic the Kernals sign comparison (XXX do we need it?) +; This is verified to be identical to the original Microsoft implementation where it was named FADDT. +; ; ; See also: ; - [CM64] Computes Mapping the Commodore 64 - page 112 @@ -18,79 +20,65 @@ ; - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics ; -; XXX test this - add_FAC2_FAC1: - ; Check if FAC2 is 0; if so leave FAC1 without changes + bne @1 ; If FAC1=0 result is in FAC2 + jmp mov_FAC2_FAC1 +@1: + ldx FACOV + stx OLDOV + ldx #FAC2_exponent + lda FAC2_exponent +FADDC: + tay + beq FADDC;ZERRTS + sec + sbc FAC1_exponent + beq FADD4 ; No shifting + bcc @1 ; Branch if FAC2_exponent < FAC1_exponent + sty FAC1_exponent ; Resulting exponent + ldy FAC2_sign ; Since FAC2 is larger, its + sty FAC1_sign ; sign is sign of result + eor #$FF ; Shift a negative number of places + adc #0 ; Complete negation C=1 + ldy #0 + sty OLDOV + ldx #FAC1_exponent + bne @2 +@1: + ldy #0 + sty FACOV +@2: + cmp #$F9 + bmi add_align_exponents + tay + lda FACOV + lsr 1,X + jsr short_shift_FAC +FADD4: + bit ARISGN + bpl add_mantissas_FAC2_FAC1 + ldy #FAC1_exponent + cpx #FAC2_exponent ; FAC1 is bigger + beq @1 + ldy #FAC2_exponent ; FAC2 is bigger +@1: + sec + eor #$FF + adc OLDOV + sta FACOV + lda 4,Y + sbc 4,X + sta FAC1_mantissa+3 + lda 3,Y + sbc 3,X + sta FAC1_mantissa+2 + lda 2,Y + sbc 2,X + sta FAC1_mantissa+1 + lda 1,Y + sbc 1,X + sta FAC1_mantissa+0 - lda FAC2_exponent - beq add_FAC2_FAC1_done + ; Fallthrough to abs_and_normalize_FAC1 - ; If FAC1 is 0, if so just copy FAC2 to FAC1 - - lda FAC1_exponent - +beq mov_FAC2_FAC1 - - ; Make sure the exponents are aligned - - jsr add_align_exponents - - ; Check whether signs are the same - - lda FAC1_sign - eor FAC2_sign - - +bmi add_FAC2_FAC1_sub ; branch if signs are opposite - - ; Perform the addition - - clc - lda FAC2_mantissa+3 - adc FAC1_mantissa+3 - sta FAC1_mantissa+3 - - lda FAC2_mantissa+2 - adc FAC1_mantissa+2 - sta FAC1_mantissa+2 - - lda FAC2_mantissa+1 - adc FAC1_mantissa+1 - sta FAC1_mantissa+1 - - lda FAC2_mantissa+0 - adc FAC1_mantissa+0 - sta FAC1_mantissa+0 - - +bcc normal_FAC1 ; end if no need to adapt the exponent - - inc FAC1_exponent - bne add_FAC2_FAC1_adapt_mantissa ; end if no overflow - - ; FALLTROUGH - -set_FAC1_max: ; entry used by other routines too - - lda #$FF - sta FAC1_exponent - sta FAC1_mantissa+3 - sta FAC1_mantissa+2 - sta FAC1_mantissa+1 - sta FAC1_mantissa+0 - - ; FALLTROUGH - -add_FAC2_FAC1_done: - - rts - -add_FAC2_FAC1_adapt_mantissa: - - sec - ror FAC1_mantissa+0 - ror FAC1_mantissa+1 - ror FAC1_mantissa+2 - ror FAC1_mantissa+3 - ror FACOV - - rts diff --git a/tools/similarity.c b/tools/similarity.c index 0ff05235..d8ec935b 100644 --- a/tools/similarity.c +++ b/tools/similarity.c @@ -20,13 +20,12 @@ int matches[MAX_SIZE]; int phase_mask[MAX_SIZE+MAX_SIZE]; -#define NUM_CHUNKS 8 +#define NUM_CHUNKS 7 // Pairs of start, end memory addresses of known exact similarity with the open source Microsoft BASIC unsigned short microsoft_basic_chunks[NUM_CHUNKS * 2] = { 0xB391, 0xB39D, 0xB3A2, 0xB3A5, - 0xB849, 0xB869, - 0xB8D2, 0xB97D, + 0xB849, 0xB97D, 0xB983, 0xB9BB, 0xBA8C, 0xBAB6, 0xBBA2, 0xBC1A,