Add busy loop delay module.
This commit is contained in:
parent
bf1b651ec5
commit
61720e925d
35
src/delay.asm
Normal file
35
src/delay.asm
Normal file
@ -0,0 +1,35 @@
|
||||
SECTION code
|
||||
|
||||
PUBLIC _delay_loop
|
||||
_delay_loop:
|
||||
; function prologue: use IX to index parameters passed on the stack
|
||||
push ix ; 15
|
||||
ld ix,$0000 ; 14
|
||||
add ix,sp ; 15
|
||||
|
||||
; save scratch registers
|
||||
push af ; 11
|
||||
push de ; 11
|
||||
|
||||
; load loop counter into DE
|
||||
ld d,(ix+$05) ; 19
|
||||
ld e,(ix+$04) ; 19
|
||||
|
||||
; delay loop (24 × n)
|
||||
_delay_loop_loop:
|
||||
dec de ; 6
|
||||
ld a,d ; 4
|
||||
or e ; 4
|
||||
jp nz,_delay_loop_loop ; 10
|
||||
|
||||
; restore scratch registers
|
||||
pop de ; 10
|
||||
pop af ; 10
|
||||
|
||||
; restore IX
|
||||
pop ix ; 14
|
||||
|
||||
ret
|
||||
|
||||
|
||||
|
25
src/delay.h
Normal file
25
src/delay.h
Normal file
@ -0,0 +1,25 @@
|
||||
#ifndef CEDA_DELAY_H
|
||||
#define CEDA_DELAY_H
|
||||
|
||||
/*
|
||||
Assuming a Z80 CPU running at 4MHz, the chosen assembly loop
|
||||
permits busy loops withing the following specs:
|
||||
|
||||
min: 37 us
|
||||
max: 393253 ms
|
||||
precision: 6 us
|
||||
|
||||
For example, to wait for 50 us use the following.
|
||||
This will actually busy wait for 47 us due to precision losses.
|
||||
delay_us(US_TO_LOOPS(50));
|
||||
*/
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#define CPU_FREQ 4000000UL // 4 MHz
|
||||
|
||||
#define US_TO_LOOPS(t) ((((t)*CPU_FREQ / 1000000UL) - 148) / 24)
|
||||
|
||||
void delay_loop(uint16_t loops);
|
||||
|
||||
#endif // CEDA_DELAY_H
|
Loading…
Reference in New Issue
Block a user