diff --git a/programs/sleep.s65 b/programs/sleep.s65 new file mode 100644 index 0000000..5a78336 --- /dev/null +++ b/programs/sleep.s65 @@ -0,0 +1,41 @@ +.ifndef INCLUDE_SLEEP +INCLUDE_SLEEP = 1 +;******************************************************************************** +; @macro Sleep +; @param time_cs: Time to sleep in centiseconds (10^-2s = 10ms) +; @details +; Interrupts might change the actual time to finish +;******************************************************************************** +.macro Sleep time_cs + phx + ldx #time_cs + jsr sleep + plx +.endmacro + +;******************************************************************************** +; @function sleep +; @param x: Time to sleep in centiseconds (10^-2s = 10ms) +; @details +; Interrupts might change the actual time to finish +; To be exact, time_cs is in units of 0.010244s +;******************************************************************************** +.proc sleep +VAR_1 = 0 + stz VAR_1 +@loop: + .repeat 17 + nop ; 2 - i + .endrepeat + inc VAR_1 ; 3 - zp + bne @loop ; 2/3 - r (2 if not taken, but here most of the time its 3) + ; reaching this takes 256 * (X * 2(nop) + 3(inc) + 3(bne)) - 1(last bne) cycles + ; with X = 17: T1 = (256×(17×2 + 3 +3) − 1) × (1/1MHz) = 0,010 239 s + dex ; 2 - i + bne @loop ; 2/3 - r + ; with T1 = for running through VAR_1, one iteration takes + ; T1 + (2(dex) + 3(bne)) × (1/1MHz) = 0,010 244 s + rts + ; so T = N * 0,010 244 s - (1(last bne) + 4(jsr) + 6(rts)) * (1/1MHz) +.endproc +.endif ; guard