aboutsummaryrefslogtreecommitdiffstats
path: root/src/syscall.asm
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/syscall.asm9
1 files changed, 6 insertions, 3 deletions
diff --git a/src/syscall.asm b/src/syscall.asm
index e3f0b1b..4bcb601 100644
--- a/src/syscall.asm
+++ b/src/syscall.asm
@@ -277,8 +277,10 @@ ENDR
; -----------------------------------------------------------------------------
; sys_sleep(B = 1/64-second units) - cooperative delay driven by the DIV timer.
-; DIV (FF04) free-runs at 16384 Hz, so 256 ticks = 1/64 s. We accumulate DIV
-; deltas across SchedYields (other procs run) until enough units have elapsed.
+; DIV free-runs at 16384 Hz - 32768 Hz in double-speed mode, where 256 ticks
+; = 1/128 s - so the accumulated high byte is halved before comparing against
+; the target. We accumulate DIV deltas across SchedYields (other procs run)
+; until enough 1/64-second units have elapsed.
; -----------------------------------------------------------------------------
sys_sleep:
ld a, b
@@ -305,7 +307,8 @@ sys_sleep:
ld [wSleepAcc], a
ld a, [wSleepAcc+1]
adc 0
- ld [wSleepAcc+1], a ; acc high byte = elapsed 1/64-second units
+ ld [wSleepAcc+1], a ; acc high byte = elapsed 1/128-second units
+ srl a ; /2: double-speed DIV -> 1/64-second units
ld b, a
ld a, [wSleepTarget]
cp b