;"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-8 | 0
|