Source file: /~heha/Mikrocontroller/avr-inc.zip/divs4s2.i90

;"Normale" Division 32bit / 16bit = 16bit Rest 16bit, vzb!
;Registeraufteilung günstig für MulDiv (Zusammensetzung mit muls2s2)
;h#s 01/06
#ifndef DIVS4S2_I90
#define DIVS4S2_I90
;Quelle: 32-bit-Dividend, 16-bit-Divisor
;Ziel: 16-bit-Quotient, 16-bit-Divisionsrest
;ACHTUNG: itoa.i90 muss, wenn benötigt,
; _vor_ dieser Include-Datei eingefügt werden!
;UNGETESTET!

;	r3:r2 R r5:r4 = divs4s2 (r5:r4:r3:r2, r1:r0)	vzb.
;Weitere Hilfsfunktionen:
;	neg4 (R5:R4:R3:R2 negieren)
;	negr1r0 (R1:R0 negieren)
;	negr3r2 (R3:R2 negieren)


.include "makros.i90"
.include "divu4u2.i90"

#ifndef ITOA_I90
neg4:
;32-bit-Zahl in R5:R4:R3:R2 negieren
;VR: R2-R5, R16
	rcall	negr3r2
	negc	r4
	negc	r5
	ret
#endif

negr1r0:
	neg	r0
	negc	r1
	ret

divs4s2:
;PE: R5:R4:R3:R2 = Zähler, Dividend
;    R1:R0 = Nenner, Divisor (nachher positiv)
;PA: R3:R2 = Ergebnis
;    R5:R4 = Rest (immer positiv)
;VR: R0-R5, r16-r17
	mov	r17,r5		;Vorzeichen Dividend
	eor	r17,r1		;Vorzeichen Divisor
	sbrc	r5,7
	 rcall	neg4
	sbrc	r1,7
	 rcall	negr1r0
	rcall	divu4u2
	sbrs	r17,7		;Ergebnis positiv?
	 ret			;ja
negr3r2:
	neg	r2		;nein, Ergebnis negieren
	negc	r3
	ret

#endif//DIVS4S2_I90
Detected encoding: UTF-80