mirror of
https://github.com/cc65/cc65.git
synced 2025-01-01 03:30:20 +00:00
55 lines
1.6 KiB
ArmAsm
55 lines
1.6 KiB
ArmAsm
|
;
|
||
|
; Colin Leroy-Mira <colin@colino.net>, 2024
|
||
|
;
|
||
|
; void __fastcall__ sleep(unsigned s)
|
||
|
;
|
||
|
;
|
||
|
|
||
|
.export _sleep
|
||
|
.import _get_iigs_speed
|
||
|
.import _set_iigs_speed
|
||
|
.import WAIT
|
||
|
.importzp tmp1
|
||
|
|
||
|
.include "accelerator.inc"
|
||
|
|
||
|
; This functions uses the Apple2 WAIT ROM routine to waste a certain
|
||
|
; amount of cycles and returns approximately after the numbers of
|
||
|
; seconds passed in AX.
|
||
|
;
|
||
|
; It takes 1023730 cycles when called with AX=1 (1,0007s),
|
||
|
; 10236364 cycles when called with AX=10 (10,006 seconds),
|
||
|
; 306064298 cycles with AX=300 (299.2 seconds).
|
||
|
;
|
||
|
; Caveat: IRQs firing during calls to sleep will make the sleep longer
|
||
|
; by the amount of cycles it takes to handle the IRQ.
|
||
|
;
|
||
|
_sleep:
|
||
|
stx tmp1 ; High byte of s in X
|
||
|
tay ; Low byte in A
|
||
|
ora tmp1
|
||
|
bne :+
|
||
|
rts
|
||
|
: jsr _get_iigs_speed ; Save current CPU speed
|
||
|
pha
|
||
|
lda #SPEED_SLOW ; Down to 1MHz for consistency around WAIT
|
||
|
jsr _set_iigs_speed
|
||
|
sleep_1s:
|
||
|
ldx #$0A ; Loop 10 times
|
||
|
sleep_100ms:
|
||
|
lda #$C7 ; Sleep about 99ms
|
||
|
jsr WAIT
|
||
|
lda #$0D ; About 1ms
|
||
|
jsr WAIT
|
||
|
dex
|
||
|
bne sleep_100ms
|
||
|
dey
|
||
|
bne sleep_1s
|
||
|
dec tmp1
|
||
|
bmi done
|
||
|
dey ; Down to #$FF
|
||
|
bne sleep_1s
|
||
|
done:
|
||
|
pla ; Restore CPU speed
|
||
|
jmp _set_iigs_speed
|