Update int_FAC1
This commit is contained in:
1 parent
fa838d8fb2
commit
74d1943cee
3 files changed
+34
-73
No files matched your search
@@ -1,8 +0,0 @@
|
||||
;; #LAYOUT# STD * #TAKE
|
||||
;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000
|
||||
;; #LAYOUT# * BASIC_0 #TAKE
|
||||
;; #LAYOUT# * * #IGNORE
|
||||
|
||||
; Just a compatibility jump - our routine is longer than original one
|
||||
|
||||
jmp int_FAC1
|
||||
@@ -0,0 +1,34 @@
|
||||
;; #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 - rounds away the decimal to make an integer
|
||||
;
|
||||
; This is verified to be identical to the original Microsoft implementation where it was named INT.
|
||||
;
|
||||
; See also:
|
||||
; - [CM64] Computes Mapping the Commodore 64 - page 116
|
||||
; - https://www.c64-wiki.com/wiki/Floating_point_arithmetic
|
||||
; - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics
|
||||
;
|
||||
|
||||
int_FAC1:
|
||||
|
||||
lda FAC1_exponent
|
||||
cmp #$A0
|
||||
bcs clear_FAC1_rts
|
||||
jsr QINT
|
||||
sty FACOV
|
||||
lda FAC1_sign
|
||||
sty FAC1_sign
|
||||
eor #$80
|
||||
rol
|
||||
lda #$A0
|
||||
sta FAC1_exponent
|
||||
lda FAC1_mantissa+3
|
||||
sta CHARAC ; INTEGR in the original code ($07)
|
||||
jmp abs_and_normal_FAC1
|
||||
@@ -1,65 +0,0 @@
|
||||
;; #LAYOUT# STD * #TAKE
|
||||
;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000
|
||||
;; #LAYOUT# * BASIC_0 #TAKE
|
||||
;; #LAYOUT# * * #IGNORE
|
||||
|
||||
;
|
||||
; Math package - rounds away the decimal to make an integer
|
||||
;
|
||||
; See also:
|
||||
; - [CM64] Computes Mapping the Commodore 64 - page 116
|
||||
; - https://www.c64-wiki.com/wiki/Floating_point_arithmetic
|
||||
; - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics
|
||||
;
|
||||
|
||||
int_FAC1:
|
||||
|
||||
lda FAC1_exponent
|
||||
cmp #$81
|
||||
bcc int_FAC1_zero ; exponent is 0 or lower so integer part is 0
|
||||
cmp #$A0
|
||||
bcs int_FAC1_out ; exponent is 32 or larger so the entire mantissa is part of the integer
|
||||
|
||||
tax
|
||||
and #$07 ; low three bits of exponent is number of bits to keep
|
||||
tay
|
||||
|
||||
txa
|
||||
lsr ; Bits 4-5 of exponent is how many full mantissa bytes to keep
|
||||
lsr
|
||||
lsr
|
||||
and #$03
|
||||
tax
|
||||
|
||||
lda #$FF ; Create bit mask for first mantissa byte to change
|
||||
@1: lsr
|
||||
dey
|
||||
bne @1
|
||||
eor #$FF
|
||||
|
||||
and FAC1_mantissa,X
|
||||
sta FAC1_mantissa,X
|
||||
lda #0
|
||||
@2: inx
|
||||
cpx #$4
|
||||
bcs @3
|
||||
sta FAC1_mantissa,X
|
||||
bcc @2
|
||||
|
||||
@3: lda FAC1_sign
|
||||
bpl int_FAC1_out
|
||||
lda #<const_ONE ; If negative subtract one
|
||||
ldy #>const_ONE
|
||||
jsr sub_MEM_FAC1 ; FAC1 = 1 - FAC1
|
||||
lda #$FF
|
||||
sta FAC1_sign ; FAC1 = FAC1 - 1
|
||||
rts
|
||||
|
||||
|
||||
; FIXME: Do we need to set FACOV to 0?
|
||||
|
||||
int_FAC1_zero:
|
||||
lda #0
|
||||
sta FAC1_exponent
|
||||
int_FAC1_out:
|
||||
rts
|
||||
Reference in new issue
Block a user