dos33fsprogs/demos/hellmood_memories/multiply_s16x16.s

69 lines
804 B
ArmAsm

;==========================
; Signed 16x16=32 multiply
;==========================
; multiplies NUM1H:NUM1L by NUM2H:NUM2L
; result in RESULT3:RESULT2:RESULT1:RESULT0
multiply_s16x16:
; check if we need to invert result, save for later
lda NUM1H
eor NUM2H
php
; if NUM1 negative, invert it
lda NUM1H
bpl num1_positive
sec
lda #0
sbc NUM1L
sta NUM1L
lda #0
sbc NUM1H
sta NUM1H
num1_positive:
; if NUM2 negative, invert it
lda NUM2H
bpl num2_positive
sec
lda #0
sbc NUM2L
sta NUM2L
lda #0
sbc NUM2H
sta NUM2H
num2_positive:
jsr multiply_u16x16
; done, see if we need to negate
plp
bpl done_s16x16
sec
lda #0
sbc RESULT0
sta RESULT0
lda #0
sbc RESULT1
sta RESULT1
lda #0
sbc RESULT2
sta RESULT2
lda #0
sbc RESULT3
sta RESULT3
done_s16x16:
rts