From 2eb4c81239b5da878cfd8a3f7a0c5cb7309bd0ae Mon Sep 17 00:00:00 2001 From: Rikard Nordgren Date: Wed, 4 Feb 2026 20:18:18 +0100 Subject: [PATCH] Update normal_FAC1 --- STATUS.md | 2 +- src/basic/math/b8d7.normal_FAC1.s | 41 ++++++++++++ src/basic/math/normal_FAC1.s | 101 ------------------------------ tools/similarity.c | 5 +- 4 files changed, 44 insertions(+), 105 deletions(-) create mode 100644 src/basic/math/b8d7.normal_FAC1.s delete mode 100644 src/basic/math/normal_FAC1.s diff --git a/STATUS.md b/STATUS.md index 632e2653..86bee4ca 100644 --- a/STATUS.md +++ b/STATUS.md @@ -211,8 +211,8 @@ Floating point mathematical routines - not official, but well known and broadly | `$B867` | `add_MEM_FAC1` | DONE | From the Microsoft BASIC, original name: FADD | | `$B86A` | `add_FAC2_FAC1` | DONE | | | `$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 | -| `$B8FE` | `normal_FAC1` | DONE | | | `$B947` | `inv_FAC1_mantissa` | DONE | From the Microsoft BASIC, original name: NEGFAC | | `$B96F` | `inc_FAC1` | DONE | From the Microsoft BASIC, original name: INCFAC | | `$B983` | `shiftr_FAC1` | DONE | From the Microsoft BASIC, original name: SHIFTR | diff --git a/src/basic/math/b8d7.normal_FAC1.s b/src/basic/math/b8d7.normal_FAC1.s new file mode 100644 index 00000000..93ef7438 --- /dev/null +++ b/src/basic/math/b8d7.normal_FAC1.s @@ -0,0 +1,41 @@ +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +;; #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 - normalize FAC1 +; +; This is verified to be identical to the original Microsoft implementation where it was named NORMAL. +; +; See also: +; - [CM64] Computes Mapping the Commodore 64 - page 113 +; - https://www.c64-wiki.com/wiki/Floating_point_arithmetic +; - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics +; + + +normal_FAC1: + + ldy #0 + tya + clc +@1: + ldx FAC1_mantissa+0 + bne NORM1 + ldx FAC1_mantissa+1 ; Shift 8 bites at a time for speed + stx FAC1_mantissa + ldx FAC1_mantissa+2 + stx FAC1_mantissa+1 + ldx FAC1_mantissa+3 + stx FAC1_mantissa+2 + ldx FACOV + stx FAC1_mantissa+3 + sty FACOV + adc #8 + cmp #$20 + bne @1 + + ; Fallthrough to zero_FAC1 diff --git a/src/basic/math/normal_FAC1.s b/src/basic/math/normal_FAC1.s deleted file mode 100644 index 3305e004..00000000 --- a/src/basic/math/normal_FAC1.s +++ /dev/null @@ -1,101 +0,0 @@ -;; #LAYOUT# STD * #TAKE -;; #LAYOUT# * BASIC_0 #TAKE -;; #LAYOUT# * * #IGNORE - -; -; Math package - normalize FAC1 -; -; See also: -; - [CM64] Computes Mapping the Commodore 64 - page 113 -; - https://www.c64-wiki.com/wiki/Floating_point_arithmetic -; - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics -; - -; XXX test this - -normal_FAC1_impl: - - lda FAC1_exponent - beq normal_FAC1_end ; branch if our float is 0 - - ; FALLTROUGH - -normal_FAC1_check_mantissa_byte: - - lda FAC1_mantissa+0 - beq normal_FAC1_by_byte ; branch if we can move the whole byte - - ; FALLTROUGH - -normal_FAC1_check_mantissa_bit: - - lda FAC1_mantissa+0 ; XXX optimize for 65CE02? - and #$80 - bne normal_FAC1_end ; branch if already normalized - - ; FALLTROUGH - -normal_FAC1_by_bit: - - ; Decrement the exponent - - dec FAC1_exponent - beq normal_FAC1_end ; exponent reached 0, nothing more to do - - ; Multiply the mantissa by 2 - - asl FACOV - rol FAC1_mantissa+3 - rol FAC1_mantissa+2 - rol FAC1_mantissa+1 - rol FAC1_mantissa+0 - - bcc normal_FAC1_check_mantissa_bit ; branch if next iteration needed - rts - -normal_FAC1_by_byte: - - ; First decrement the exponent by 8, but not below 0 - - lda FAC1_exponent - sec - sbc #$08 - bcs @1 - lda #$00 -@1: - sta FAC1_exponent - beq normal_FAC1_end ; branch if our float reached 0 - - ; Now multiply the mantissa by 8 by moving the whole bytes - - lda FAC1_mantissa+1 - sta FAC1_mantissa+0 - lda FAC1_mantissa+2 - sta FAC1_mantissa+1 - lda FAC1_mantissa+3 - sta FAC1_mantissa+2 - - lda FACOV - sta FAC1_mantissa+3 - - lda #$00 - sta FACOV - - ; Now check if mantissa is not 0 - - ora FAC1_mantissa+0 - ora FAC1_mantissa+1 - ora FAC1_mantissa+2 - ora FAC1_mantissa+3 - - bne normal_FAC1_check_mantissa_byte ; not 0 - branch to next iteration - - ; Our mantissa reached 0 - mark exponent as 0 and finish - - sta FAC1_exponent - - ; FALLTROUGH - -normal_FAC1_end: - - rts diff --git a/tools/similarity.c b/tools/similarity.c index 3721b602..d2b3d10a 100644 --- a/tools/similarity.c +++ b/tools/similarity.c @@ -20,14 +20,13 @@ int matches[MAX_SIZE]; int phase_mask[MAX_SIZE+MAX_SIZE]; -#define NUM_CHUNKS 10 +#define NUM_CHUNKS 9 // 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, 0xB8D5, - 0xB8F7, 0xB8FD, + 0xB8D2, 0xB8FD, 0xB947, 0xB97D, 0xB983, 0xB9BB, 0xBA8C, 0xBAB6,