;
; Divide A with B (A = A div B, mod B) - Byte version! (c) BiFi'96/2000
;
; In : A = Value
;      B = Divider
;
; Out: A = Result
;      B = Modulus
;      Carry reset when calculated correctly
;
DIVBYT: INC   B               ; Test division by zero
        DEC   B
        SCF                   ; Set Carry to indicate an error
        RET   Z
        CP    B               ; Less than B?
        PUSH  DE              ; Store used registers
        PUSH  BC
        LD    D,0             ; A < B, so result equals 0
        JR    C,ENDDIV        ; A is modulus value, quit
        LD    C,A             ; Comparison value
        INC   D               ; Result is at least 1
        LD    A,B             ; Set first divider

DIV_LP: CP    C               ; >= divider?
        JR    NC,ENDDIV       ; Modulus 0 (NZ i.s.o. NC)
        LD    E,A             ; Calculate modulus value
        LD    A,C             ; Get max. value
        SUB   E               ; Minus current value
        CP    B               ; Compare to divider
        JR    C,ENDDIV        ; There is a modulus
        LD    A,E             ; Restore current value (A * B)
        ADD   A,B             ; Add divider
        INC   D               ; Result is 1 more
        JR    DIV_LP          ; Do this again

ENDDIV: CP    C               ; Compare with initial value
        POP   BC              ; Restore registers
        LD    B,A             ; Modulus in B
        LD    A,D             ; Result in A
        POP   DE
        OR    A               ; Reset Carry (valid result)
        RET   NZ
        LD    B,0             ; Perfect division, no modulus
        RET
