Код:
; Division - <number> / <number>
; ==============================
; On entry, r2/r3/r4 = RHS value
; sp=>retaddr, r2/r4/r3 = LHS value
;
.fnDivide
jsr pc,EnsureFloat
beq errDivideZero ; RHS=0, num/0 = divide by zero
jsr pc,SwapStack
.fnDivideSwap
jsr pc,EnsureFloat
beq fnMultiplyZero ; LHS=0, 0/num = 0
;
; r2/r3/r4=LHS value
; sp=> RHS value
;
; to divide,
; exp=expL-expR
; man=manL/manR
; then renormalise
;
sub 2(sp),r2 ; Subtract exponents
add #&81,r2 ; Exponent biased from &80
; ; Exponent is tested after normalisation as
; ; exponent may get inc/dec'd back into range
; ; by normalisation
jsr pc,fnFloatPrepare ; Stack exponent, get sign of result, add '1' to mantissas
mov r5,-(sp) ; Save program pointer
mov r1,-(sp) ; Save sign of result
mov #48,r5 ; r5=48, number of bits to divide
clr r2
; could speed this up by doing 32+8 bits and pre-rotating values
;
; we now have
; r1:r0=running total, starts at LHS dividend
; r2:r3:r4=initially LHS mantissa, result rotated into
; r5 =48, number of bits to add/multiply
; sp=>sign, saved r5, retaddr, exponent, r4, r3 = RHS value
;
br fnDivideStart ; Jump into division loop
.fnDivideFloatLp
rol r2
rol r1 ; Rotate carry bit into r3:r4 result
rol r0
.fnDivide34
clc ; Rotate dividend
rol r4
rol r3
bcs fnDivideSubtract
.fnDivideStart
sub 8(sp),r4 ; Trial subtract total=total-RHS divisor
sbc r3
sub 10(sp),r3
bcc fnDivideNoRestore
add 8(sp),r4 ; Add RHS back to restore total
adc r3
add 10(sp),r3
clc
br fnDivideCount
.fnDivideSubtract
sub 8(sp),r4 ; Trial subtract total=total-RHS divisor
sbc r3
sub 10(sp),r3
.fnDivideNoRestore
sec
.fnDivideCount
dec r5
bne fnDivideFloatLp ; Loop for all bits
;
; Answer is now in r0:r1:r2
; Transfer to r3:r4:xx
; Then normalise
;
; Need to get
; r3:r4:r1=mantissa
; r2 =exponent
; (sp) =return address
; r0 =<sign of result><operator>
;
mov r0,r3
mov r1,r4
.fnDivideFinish
mov (sp)+,r0 ; Get sign of result
mov (sp)+,r5 ; Restore program pointer
mov (sp)+,r1 ; r1=return address
mov r1,4(sp) ; Store further up stack
mov r2,r1 ; r1=rounding bits
mov (sp)+,r2 ; r2=exponent of result
tst (sp)+ ; Drop part of RHS from stack
bis #&80,r0 ; Set <not compare>
jmp fnFloatNormaliseDiv; Jump to normalise and insert sign bit