;"Normale" Division 32bit / 16bit = 16bit Rest 16bit
;Registeraufteilung günstig für MulDiv (Zusammensetzung mit mulu2u2)
;h#s 01/06
#ifndef DIVU4U2_I90
#define DIVU4U2_I90
;Quelle: 32-bit-Dividend, 16-bit-Divisor
;Ziel: 16-bit-Quotient, 16-bit-Divisionsrest
; r3:r2 R r5:r4 = divu4u2 (r5:r4:r3:r2, r1:r0) vzl.
.include "makros.i90"
divu4u2:
;PE: R5:R4:R3:R2 = Zähler
; R1:R0 = Nenner, Divisor (bleibt erhalten)
;PA: R3:R2 = Ergebnis
; R5:R4 = Rest
;VR: R2-R5, r16
;Ta: 200 (12 µs @ 16 MHz)
ldi r16,16
div_loop:
lslw r3,r2 ;Null einschieben
rolw r5,r4
brcs div_sub ;Bei Überlauf immer subtrahieren
cp r4,r0
cpc r5,r1 ;High-Teil mit Nenner vergleichen
brcs div_nosub ;Wenn High-Teil < Nenner, dann nicht subtr.
div_sub:
sub r4,r0
sbc r5,r1
inc r2 ;LSB im Divisionsergebnis setzen
div_nosub:
djnz r16,div_loop
ret
#endif//DIVU4U2_I90
Detected encoding: ANSI (CP1252) | 4
|
|