66 lines
1.4 KiB
ArmAsm
66 lines
1.4 KiB
ArmAsm
;; #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 - shift a floating point register right
|
|
;
|
|
; The main entry point is shiftr_FAC which shifts any FAC to the right with sign extension
|
|
; Inputs:
|
|
; - A is the negative of the number of bits to shift
|
|
; - X points to to the bytes to be shifted
|
|
; Returns:
|
|
; - Y = 0
|
|
; - CF = 0
|
|
; - A = overflowed bits
|
|
;
|
|
; Alternative entry point shift_for_mul_RES will shift the RES register for multiplication.
|
|
; Alternative entry point short_shift_FAC will makes a short shift without sign extension
|
|
;
|
|
; This is verified to be identical to the original Microsoft implementation where it was named SHIFTR.
|
|
;
|
|
|
|
shift_for_mul_RES:
|
|
ldx #RESHO-1
|
|
|
|
.bytes:
|
|
ldy 4,X ; Shift entire bytes
|
|
sty FACOV
|
|
ldy 3,X
|
|
sty 4,X
|
|
ldy 2,X
|
|
sty 3,X
|
|
ldy 1,X
|
|
sty 2,X
|
|
ldy BITS
|
|
sty 1,X
|
|
|
|
shiftr_FAC:
|
|
adc #8
|
|
bmi .bytes ; More than or equal to 8 bits remaining
|
|
beq .bytes
|
|
sbc #8 ; Go back to previous value
|
|
tay
|
|
lda FACOV
|
|
bcs shftrt
|
|
.sext:
|
|
asl 1,X
|
|
bcc @2
|
|
inc 1,X
|
|
@2:
|
|
ror 1,X ; Undo previous shift
|
|
ror 1,X
|
|
short_shift_FAC:
|
|
ror 2,X
|
|
ror 3,X
|
|
ror 4,X
|
|
ror
|
|
iny
|
|
bne .sext
|
|
shftrt:
|
|
clc
|
|
rts
|