
; Divide...

    MACRO
$la _DIVIDE $r,$a,$b,$d
    ASSERT  $r <> $a
    ASSERT  $r <> $b
    ASSERT  $r <> $d
    ASSERT  $a <> $b
    ASSERT  $a <> $d
    ASSERT  $b <> $d
    _LOCAL
$la
    CMP     $b,#0
    MOVLE   $b,#1
    MOV     $d,#1
div1A$l
    CMP     $a,$b,LSL #1
    MOVHS   $b,$b,LSL #1
    MOVHS   $d,$d,LSL #1
    BHI     div1A$l
    MOV     $r,#0
div2A$l
    CMP     $a,$b
    SUBHS   $a,$a,$b
    ADDHS   $r,$r,$d
    MOV     $b,$b,LSR #1
    MOVS    $d,$d,LSR #1
    BNE     div2A$l

    _LOCAL

    MEND

; Divide a 64 bit by a 32 bit one
; result in 32bit, so will assume a < (b<<32)

    MACRO
$la _UDIV64 $r,$al,$ah,$b,$d
    ASSERT  $r <> $al
    ASSERT  $r <> $ah
    ASSERT  $r <> $b
    ASSERT  $r <> $d
    ASSERT  $al<> $ah
    ASSERT  $al<> $b
    ASSERT  $al<> $d
    ASSERT  $ah<> $b
    ASSERT  $ah<> $d
    ASSERT  $b <> $d
    _LOCAL
$la
    CMP     $b,#0
    MOVEQ   $b,#1
    MOV     $r,#0
    MOV     $d,#1<<31
div2A$l
    MOVS    $al,$al,LSL #1
    ADC     $ah,$ah,$ah
    CMP     $ah,$b
    ADDHS   $r,$r,$d
    SUBHS   $ah,$ah,$b
    MOVS    $d,$d,LSR #1
    BNE     div2A$l

    _LOCAL

    MEND
; Divide a 64 bit by a 32 bit one
; result in 64 bit

    MACRO
$la _UDIVL64 $rl,$rh,$al,$ah,$b,$d
    ASSERT  $rl<> $rh
    ASSERT  $rl<> $al
    ASSERT  $rl<> $ah
    ASSERT  $rl<> $b
    ASSERT  $rl<> $d
    ASSERT  $rh<> $al
    ASSERT  $rh<> $ah
    ASSERT  $rh<> $b
    ASSERT  $rh<> $d
    ASSERT  $al<> $ah
    ASSERT  $al<> $b
    ASSERT  $al<> $d
    ASSERT  $ah<> $b
    ASSERT  $ah<> $d
    ASSERT  $b <> $d
    _LOCAL
$la
    CMP     $b,#0
    MOVEQ   $b,#1
    MOV     $rh,#0
    MOV     $d,#1

div1A$l
    CMP     $ah,$b,LSL #1
    MOVHS   $b,$b,LSL #1
    MOVHS   $d,$d,LSL #1
    BHI     div1A$l

div2A$l
    CMP     $ah,$b
    ADDHS   $rh,$rh,$d
    SUBHS   $ah,$ah,$b
    MOVS    $al,$al,LSL #1
    ADC     $ah,$ah,$ah
    MOVS    $d,$d,LSR #1
    BNE     div2A$l

div30$l
    MOV     $rl,#0
    MOV     $d,#1<<31
div3A$l
    CMP     $ah,$b
    ADDHS   $rl,$rl,$d
    SUBHS   $ah,$ah,$b
    MOVS    $al,$al,LSL #1
    ADC     $ah,$ah,$ah
    MOVS    $d,$d,LSR #1
    BNE     div3A$l

    _LOCAL

    MEND
; Mul 32 bit by 32 bit
; Result in 64 bit
; a and b destroyed
    MACRO
$la _UMUL64 $rl,$rh,$a,$b,$t
    ASSERT  $b <> $a
    ASSERT  $t <> $a
    ASSERT  $rl<> $a
    ASSERT  $rh<> $a
    ASSERT  $rl<> $b
    ASSERT  $rh<> $b
    ASSERT  $t <> $b
    ASSERT  $rl<> $t
    ASSERT  $rh<> $t
    ASSERT  $rl<> $rh
    _LOCAL
$la
    MOV     $t,$a,LSR #16
    MOV     $rh,$b,LSR #16
    BIC     $a,$a,$t,LSL #16
    BIC     $b,$b,$rh,LSL #16
    MUL     $rl,$a,$b
    MUL     $b,$t,$b
    MUL     $a,$rh,$a
    MUL     $rh,$t,$rh
    ADDS    $a,$b,$a
    ADDCS   $rh,$rh,#&10000
    ADDS    $rl,$rl,$a,LSL #16
    ADC     $rh,$rh,$a,LSR #16

    _LOCAL

    MEND

; end of macros

    END
