;Inputs: ; Dividend - AARGB0:AARGB1:AARGB2 (0 - most significant!) ; Divisor - BARGB0:BARGB1 ;Temporary: ; Counter - LOOPCOUNT ; Remainder- REMB0:REMB1 ;Output: ; Quotient - AARGB0:AARGB1:AARGB2 ; Remainder- REMB0:REMB1 ; ; Size: 28 ; Max timing: 4+24*(6+6+4+3+7)-2+3+3=632 cycles (with return) ; Min timing: 4+24*(6+6+6+7)-2+3+3=608 cycles (with return) ; FXD2416U: clr REMB0 clr REMB1 mov W, #24 mov LOOPCOUNT, W LOOPU2416 rl AARGB2 ;shift left divider to pass next bit to remainder rl AARGB1 ;and shift in next bit of result rl AARGB0 rl REMB1 ;shift carry into remainder rl REMB0 rl LOOPCOUNT ;save carry in counter mov W, BARGB1 ;substract divisor from remainder sub REMB1, W mov W, BARGB0 sb C movsz W, ++BARGB0 mov W, REMB0-w ;keep that byte in W untill we make sure about borrow snb C ;if no borrow setb LOOPCOUNT.0 ;set bit 0 of counter (saved carry) snb LOOPCOUNT.0 ;if no borrow jmp UOK46LL ;jump mov W, BARGB1 ;restore remainder if borrow add REMB1, W mov W, REMB0 ;read high byte of remainder to W ;to not change it by next instruction UOK46LL mov REMB0, W ;store high byte of remainder clrb C ;copy bit 0 to carry rr LOOPCOUNT ;and restore counter decsz LOOPCOUNT ;decrement counter jmp LOOPU2416 ;and repeat loop if not zero rl AARGB2 ;shift in last bit of result rl AARGB1 rl AARGB0 ret
Interested: