Update add_FAC2_FAC1

This commit is contained in:
Rikard Nordgren authored and FeralChild64 committed 2026-03-29 21:45:24 +02:00
1 parent 40653732fa
commit 902fcc8e8b
4 files changed
+66 -176

No files matched your search

+1 -1
View File
@@ -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 |
-97
View File
@@ -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
+63 -75
View File
@@ -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
+2 -3
View File
@@ -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,