_newline:
        move.l   d0, -(a7)
        move.l   #10, d0
        movea.l  #4, a4
        jsr      (a4)
        move.l   (a7)+, d0
        rts

_nibbleout:
        move.l   d0, -(a7)
        and.l    #$f, d0
        cmp.l    #10, d0
        bge.b    _nibbleout2
        add.l    #'0', d0
        bra.b    _nibbleout3
_nibbleout2:
        sub.l    #10, d0
        add.l    #'a', d0
_nibbleout3:
        movea.l  #4, a4
        jsr      (a4)
        move.l   (a7)+, d0
        rts
_hexout:
        move.l   d0, -(a7)
        move.l   d7, d0
        rol.l    #4, d0
        bsr.w    _nibbleout
        rol.l    #4, d0
        bsr.w    _nibbleout
        rol.l    #4, d0
        bsr.w    _nibbleout
        rol.l    #4, d0
        bsr.w    _nibbleout
        rol.l    #4, d0
        bsr.w    _nibbleout
        rol.l    #4, d0
        bsr.w    _nibbleout
        rol.l    #4, d0
        bsr.w    _nibbleout
        rol.l    #4, d0
        bsr.w    _nibbleout
        move.l   (a7)+, d0
        rts

_umul32:
        move.l   d1, d4
        move.l   d0, d3
        move.l   #0, d2
        move.l   #0, d0
        move.l   #0, d1
_umul32_1:
        lsr.l    #1, d4
        bcc.b    _umul32_2
        add.l    d3, d1
        addx.l   d2, d0
_umul32_2:
        lsl.l    #1, d3
        roxl.l   #1, d2
        tst.l    d4
        bne.b    _umul32_1
        rts

_udiv32:
        clr.l    d3
_udiv1:
        cmp.l    d0, d1
        bcs.b    _udiv5
        move.l   d0, d2
        clr.l    d4
        move.w   #$10, ccr
_udiv2:
        cmp.l    d2, d1
        bcs.b    _udiv3
        roxl.l   #1, d4
        tst.l    d2
        bmi.b    _udiv4
        lsl.l    #1, d2
        bra.b    _udiv2
_udiv3:
        lsr.l    #1, d2
_udiv4:
        sub.l    d2, d1
        add.l    d4, d3
        bra.b    _udiv1
_udiv5:
        move.l   d3, d0 ; put quotent in d0. remainder is in d1
        rts

_signed_quotient:

        ; input d0 - numerator
        ; input d1 - denominator
        ; output d0 - quotient

        move.l   d0, d2 ; swap d0, d1
        move.l   d1, d0
        move.l   d2, d1

        move.l   #0, d2
        cmp.l    #0, d0
        bge.b    _signed_quotient2
        add.l    #1, d2
        neg.l    d0

_signed_quotient2:
        cmp.l    #0, d1
        bge.b    _signed_quotient3
        add.l    #1, d2
        neg.l    d1

_signed_quotient3:
        move.l   d2, -(a7)
        bsr.w    _udiv32
        move.l   (a7)+, d2

        cmp.l    #1, d2 ; negate result
        bne.b    _signed_quotient4
        neg.l    d0
_signed_quotient4:
        rts

_signed_remainder:

        ; input d0 - numerator
        ; input d1 - denominator
        ; output d0 - remainder

        move.l   d0, d2 ; swap d0, d1
        move.l   d1, d0
        move.l   d2, d1
        bsr.w    _udiv32
        move.l   d1, d0
        rts

my_mul:
        suba.l   #4, a2
        move.l   (a2), d0
        movea.l  a2, a3
        suba.l   #4, a3
        move.l   (a3), d1
        bsr.w    _umul32
        move.l   d1, (a3)
        rts

my_div:
        suba.l   #4, a2
        move.l   (a2), d0
        movea.l  a2, a3
        suba.l   #4, a3
        move.l   (a3), d1
        bsr.w    _signed_quotient
        move.l   d0, (a3)
        rts

my_mod:
        suba.l   #4, a2
        move.l   (a2), d0
        movea.l  a2, a3
        suba.l   #4, a3
        move.l   (a3), d1
        bsr.w    _signed_remainder
        move.l   d0, (a3)
        rts

my_abs:
        movea.l  a2, a3
        suba.l   #4, a3
        move.l   (a3), d1
        cmp.l    #0, d0
        bge.b    my_abs_1
        neg.l    d0
        move.l   d0, (a3)
my_abs_1:
        rts
