mirror of
https://github.com/deater/dos33fsprogs.git
synced 2025-01-02 12:29:26 +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
|
||
|
|