;******************************************************************
;
; DelayCy() clock equate and delay operand multipliers
;
radix dec
clock equ 4 ; clock frequency in Megahertz
usecs equ clock/4 ; cycles/microsecond multiplier
msecs equ usecs*1000 ; cycles/millisecond multiplier
;
; 5 cycle loop delay range 11..327690 cycles
; 6 cycle loop delay range 11..393226 cycles
; 7 cycle loop delay range 11..458762 cycles
; 8 cycle loop delay range 11..524298 cycles
;
loop equ 8 ; select 5 to 8 cycle loop timing
;
; K8LH DelayCy() macro generates four instructions for every
; (loop * 65536 + 10) cycles in the delay.
;
DelayCy macro delay ; minimum 11 cycles
local cycles
cycles = delay
while cycles > (loop*65536+10)
movlw high((loop*65536-11)/loop)+1
movwf DelayHi
movlw low ((loop*65536-11)/loop)
call uDelay-((65536-11)%loop)
cycles -= (loop*65536)
endw
movlw high((cycles-11)/loop)+1
movwf DelayHi
movlw low ((cycles-11)/loop)
call uDelay-((cycles-11)%loop)
endm
;******************************************************************
; example code for simulation testing.
;
SimTest DelayCy(500*msecs) ; <- put simulator PC here
nop ; <- put simulator break point here
;******************************************************************
; 16 bit uDelay subroutine with adjustable 5..8 cycle loop time
;
nop ; entry for (delay-11)%loop == 7 |B0
nop ; entry for (delay-11)%loop == 6 |B0
nop ; entry for (delay-11)%loop == 5 |B0
nop ; entry for (delay-11)%loop == 4 |B0
nop ; entry for (delay-11)%loop == 3 |B0
nop ; entry for (delay-11)%loop == 2 |B0
nop ; entry for (delay-11)%loop == 1 |B0
uDelay addlw -1 ; subtract "loop" cycle time |B0
skpc ; borrow? no, skip, else |B0
decfsz DelayHi,F ; done? yes, skip, else |B0
goto uDelay+5-loop ; do another loop |B0
return ; |B0
;