mirror of
https://github.com/deater/dos33fsprogs.git
synced 2024-11-04 20:06:09 +00:00
54 lines
758 B
ArmAsm
54 lines
758 B
ArmAsm
;=================================================
|
|
; M1 * M2
|
|
multiply_s8x8:
|
|
|
|
lda M2
|
|
eor M1 ; calc if we need to adjust at end
|
|
; (++ vs +- vs -+ vs --)
|
|
php ; save status on stack
|
|
|
|
; if M1 negative, negate it
|
|
lda M1
|
|
bpl m1_positive
|
|
eor #$ff
|
|
clc
|
|
adc #0
|
|
m1_positive:
|
|
sta M1
|
|
|
|
; if M2 negative, naegate it
|
|
lda M2
|
|
bpl m2_positive
|
|
eor #$ff
|
|
clc
|
|
adc #0
|
|
m2_positive:
|
|
sta M2
|
|
|
|
;==================
|
|
; unsigned multiply
|
|
|
|
jsr multiply_u8x8
|
|
|
|
|
|
; done, high result in factor2, low result in factor1
|
|
|
|
; adjust to be signed
|
|
; if m1 and m2 positive, good
|
|
; if m1 and m2 negative, good
|
|
; otherwise, negate result
|
|
|
|
plp ; restore saved pos/neg value
|
|
bpl done_result
|
|
negate_result:
|
|
sec
|
|
lda #0
|
|
sbc M1
|
|
lda #0
|
|
sbc M2
|
|
done_result:
|
|
sta M2
|
|
|
|
rts
|
|
|