mirror of
https://github.com/sergeyyarkov/attiny2313a_thermostat.git
synced 2026-10-11 02:08:52 +03:00
50 lines
1.4 KiB
NASM
50 lines
1.4 KiB
NASM
;***************************************************************************
|
|
;*
|
|
;* "div16u" - 16/16 Bit Unsigned Division
|
|
;*
|
|
;* This subroutine divides the two 16-bit numbers
|
|
;* "dd8uH:dd8uL" (dividend) and "dv16uH:dv16uL" (divisor).
|
|
;* The result is placed in "dres16uH:dres16uL" and the remainder in
|
|
;* "drem16uH:drem16uL".
|
|
;*
|
|
;* Number of words :19
|
|
;* Number of cycles :235/251 (Min/Max)
|
|
;* Low registers used :2 (drem16uL,drem16uH)
|
|
;* High registers used :5 (dres16uL/dd16uL,dres16uH/dd16uH,dv16uL,dv16uH,
|
|
;* dcnt16u)
|
|
;*
|
|
;***************************************************************************
|
|
|
|
;***** Subroutine Register Variables
|
|
|
|
.def drem16uL=r14
|
|
.def drem16uH=r15
|
|
.def dres16uL=r16
|
|
.def dres16uH=r17
|
|
.def dd16uL =r16
|
|
.def dd16uH =r17
|
|
.def dv16uL =r18
|
|
.def dv16uH =r19
|
|
.def dcnt16u =r20
|
|
|
|
;***** Code
|
|
|
|
div16u: clr drem16uL ;clear remainder Low byte
|
|
sub drem16uH,drem16uH;clear remainder High byte and carry
|
|
ldi dcnt16u,17 ;init loop counter
|
|
d16u_1: rol dd16uL ;shift left dividend
|
|
rol dd16uH
|
|
dec dcnt16u ;decrement counter
|
|
brne d16u_2 ;if done
|
|
ret ; return
|
|
d16u_2: rol drem16uL ;shift dividend into remainder
|
|
rol drem16uH
|
|
sub drem16uL,dv16uL ;remainder = remainder - divisor
|
|
sbc drem16uH,dv16uH ;
|
|
brcc d16u_3 ;if result negative
|
|
add drem16uL,dv16uL ; restore remainder
|
|
adc drem16uH,dv16uH
|
|
clc ; clear carry to be shifted into result
|
|
rjmp d16u_1 ;else
|
|
d16u_3: sec ; set carry to be shifted into result
|
|
rjmp d16u_1 |