;***************** ;** UP Division ** ;***************** == ungetestet, 080507 == div16: ;FU: klassische vzl. Ganzzahldivision 16bit/8bit = 8bit Rest 8bit ;PE: R0:R1 = Dividend (8051-typisch R0=high, R1=low) ; R2 = Divisor (unverändert) ;PA: R0 = Rest ; R1 = Quotient, bei Division durch Null R1 = 0FFh ;VR: R0, R1, A=0, Flags ;TA: max. 133 (inkl. ret) mov a,R0 ;R0 wird in A gehalten mov R0,#8 ;Länge Quotient (Schleifenzähler) div16_loop: clr c xch a,R1 rlc a xch a,R1 rlc a ;A:R1 <<= 1 (16-bit-Schieben) jc div16_overbit ;1 herausgeschoben? subb a,R2 add a,R2 ;beides svw. "cmp" jc div16_zerobit ;Dividend noch zu klein div16_overbit: clr c ;da fehlt ein "sub"-Befehl subb a,R2 inc R1 ;setze Bit 0 div16_zerobit: djnz R0,div16_loop ;8mal xch a,R0 ret div32: ;FU: klassische vzl. Ganzzahldivision 32bit/16bit = 16bit Rest 16bit ;PE: R0:R1:R2:R3 = Dividend (R0=High-Byte) ; R4:R5 = Divisor ;PA: R0:R1 = Rest ; R2:R3 = Quotient, bei Division durch Null = 0FFFFh ;VR: R0-R3, R6=0, A, Flags mov R6,#16 div32_loop: clr c mov a,R3 rlc a mov R3,a mov a,R2 rlc a mov R2,a mov a,R1 rlc a mov R1,a xch a,R0 rlc a xch a,R0 ;jetzt A=R1 jc div32_overbit ;1 herausgeschoben? subb a,R5 mov a,R0 subb a,R6 jc div32_zerobit ;Dividend noch zu klein mov a,R1 div32_overbit: clr c subb a,R5 mov R1,a mov a,R0 subb a,R6 mov R0,a inc R3 ;setze Bit 0 div32_zerobit: djnz R6,div32_loop ;16mal ret div328: ;FU: vzl. Ganzzahldivision 32bit/8bit = 32bit Rest 8bit ; (für Hornerschema und Zahl-zu-ASCII-Konvertierung) ;PE: R0:R1:R2:R3 = Dividend (8051-typisch R0=high) ; R4 = Divisor (unverändert) ;PA: A = Rest ; R0:R1:R2:R3 = Quotient (bei R4=0 0FFFFFFFFh) ;VR: R0-R3, R5=0, A, Flags ;TA: ? clr a ;A enthält oberste 8 bit (gedachte 40-bit-Zahl) mov R5,#32 ;Länge Quotient (Schleifenzähler) div328_loop: clr c xch a,R3 rlc a xch a,R3 xch a,R2 rlc a xch a,R2 xch a,R1 rlc a xch a,R1 xch a,R0 rlc a xch a,R0 rlc a ;40-bit-Kette <<= 1 jc div16_overbit ;1 herausgeschoben? subb a,R4 add a,R4 ;beides svw. "cmp" jc div16_zerobit ;Dividend noch zu klein div328_overbit: clr c ;da fehlt ein "sub"-Befehl subb a,R4 inc R3 ;setze Bit 0 div328_zerobit: djnz R5,div16_loop ;8mal ret