
; 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

; end of macros

    END
