    opt o+,p+

; Assembler: DevPac v2.14
; IN:     d0,d1      -->   Faktor,Faktor
; OUT:    d0,d1,d2   -->   Faktor,Faktor,Produkt

; RETURN: d2 = 0     -->   wenn bei LSL.L #1,D0 oder
;                          ADD.L D0,D2 ein Überlauf
;                          auftritt (Zahl wird größer
;                          als 2^32)

    move.l  #356,d0
    move.l  #98743,d1

mul
    movem.l d0/d1,-(sp) ; Werte sichern
    moveq   #0,d2       ; D2 löschen
    cmp.l   d0,d1       ; größerer Wert in D0 stehen
    ble.s   .mul_loop
    exg     d0,d1

.mul_loop
    lsl.l   #1,d0       ; mit 2 multiplizieren
    bcs.s   .overflow
    lsr.l   #1,d1       ; durch 2 teilen
    btst    #0,d1       ; Zahl gerade ?
    beq.s   .even       ; ja
    add.l   d0,d2       ; nein -> addieren
    bcs.s   .overflow

.even
    cmp.l   #1,d1       ; Fertig ??
    bne.s   .mul_loop   ; Nein -> weiter geht`s
    bra.s   .mul_done

.overflow
    moveq   #0,d2

.mul_done
    movem.l (sp)+,d0/d1 ; und tschüß...
    rts
