mirror of
https://github.com/irmen/prog8.git
synced 2024-07-10 08:28:57 +00:00
tweak sys.wait() routines on various targets
add warning to docs about FP usage in IRQ
This commit is contained in:
parent
bbf6357222
commit
32c1c19224
@ -561,15 +561,32 @@ sys {
|
|||||||
}}
|
}}
|
||||||
}
|
}
|
||||||
|
|
||||||
sub wait(uword jiffies) {
|
asmsub wait(uword jiffies @AY) {
|
||||||
; --- wait approximately the given number of jiffies (1/60th seconds)
|
; --- wait approximately the given number of jiffies (1/60th seconds) (N or N+1)
|
||||||
; note: the system irq handler has to be active for this to work as it depends on the system jiffy clock
|
; note: the system irq handler has to be active for this to work as it depends on the system jiffy clock
|
||||||
repeat jiffies {
|
%asm {{
|
||||||
ubyte jiff = lsb(c64.RDTIM16())
|
stx P8ZP_SCRATCH_B1
|
||||||
while jiff==lsb(c64.RDTIM16()) {
|
sta P8ZP_SCRATCH_W1
|
||||||
; wait until 1 jiffy has passed
|
sty P8ZP_SCRATCH_W1+1
|
||||||
}
|
|
||||||
}
|
_loop lda P8ZP_SCRATCH_W1
|
||||||
|
ora P8ZP_SCRATCH_W1+1
|
||||||
|
bne +
|
||||||
|
ldx P8ZP_SCRATCH_B1
|
||||||
|
rts
|
||||||
|
|
||||||
|
+ lda c64.TIME_LO
|
||||||
|
sta P8ZP_SCRATCH_B1
|
||||||
|
- lda c64.TIME_LO
|
||||||
|
cmp P8ZP_SCRATCH_B1
|
||||||
|
beq -
|
||||||
|
|
||||||
|
lda P8ZP_SCRATCH_W1
|
||||||
|
bne +
|
||||||
|
dec P8ZP_SCRATCH_W1+1
|
||||||
|
+ dec P8ZP_SCRATCH_W1
|
||||||
|
jmp _loop
|
||||||
|
}}
|
||||||
}
|
}
|
||||||
|
|
||||||
asmsub waitvsync() clobbers(A) {
|
asmsub waitvsync() clobbers(A) {
|
||||||
|
@ -527,15 +527,32 @@ sys {
|
|||||||
}}
|
}}
|
||||||
}
|
}
|
||||||
|
|
||||||
sub wait(uword jiffies) {
|
asmsub wait(uword jiffies @AY) {
|
||||||
; --- wait approximately the given number of jiffies (1/60th seconds)
|
; --- wait approximately the given number of jiffies (1/60th seconds) (N or N+1)
|
||||||
; note: the system irq handler has to be active for this to work as it depends on the system jiffy clock
|
; note: the system irq handler has to be active for this to work as it depends on the system jiffy clock
|
||||||
repeat jiffies {
|
%asm {{
|
||||||
ubyte jiff = lsb(c64.RDTIM16())
|
stx P8ZP_SCRATCH_B1
|
||||||
while jiff==lsb(c64.RDTIM16()) {
|
sta P8ZP_SCRATCH_W1
|
||||||
; wait until 1 jiffy has passed
|
sty P8ZP_SCRATCH_W1+1
|
||||||
}
|
|
||||||
}
|
_loop lda P8ZP_SCRATCH_W1
|
||||||
|
ora P8ZP_SCRATCH_W1+1
|
||||||
|
bne +
|
||||||
|
ldx P8ZP_SCRATCH_B1
|
||||||
|
rts
|
||||||
|
|
||||||
|
+ lda c64.TIME_LO
|
||||||
|
sta P8ZP_SCRATCH_B1
|
||||||
|
- lda c64.TIME_LO
|
||||||
|
cmp P8ZP_SCRATCH_B1
|
||||||
|
beq -
|
||||||
|
|
||||||
|
lda P8ZP_SCRATCH_W1
|
||||||
|
bne +
|
||||||
|
dec P8ZP_SCRATCH_W1+1
|
||||||
|
+ dec P8ZP_SCRATCH_W1
|
||||||
|
jmp _loop
|
||||||
|
}}
|
||||||
}
|
}
|
||||||
|
|
||||||
asmsub waitvsync() clobbers(A) {
|
asmsub waitvsync() clobbers(A) {
|
||||||
|
@ -908,17 +908,29 @@ sys {
|
|||||||
|
|
||||||
asmsub wait(uword jiffies @AY) {
|
asmsub wait(uword jiffies @AY) {
|
||||||
; --- wait approximately the given number of jiffies (1/60th seconds) (N or N+1)
|
; --- wait approximately the given number of jiffies (1/60th seconds) (N or N+1)
|
||||||
; note: regular system vsync irq handler must be running, and no nother irqs
|
; note: the system irq handler has to be active for this to work as it depends on the system jiffy clock
|
||||||
%asm {{
|
%asm {{
|
||||||
- wai ; wait for irq (assume it was vsync)
|
phx
|
||||||
cmp #0
|
sta P8ZP_SCRATCH_W1
|
||||||
|
sty P8ZP_SCRATCH_W1+1
|
||||||
|
|
||||||
|
_loop lda P8ZP_SCRATCH_W1
|
||||||
|
ora P8ZP_SCRATCH_W1+1
|
||||||
bne +
|
bne +
|
||||||
dey
|
plx
|
||||||
+ dec a
|
|
||||||
bne -
|
|
||||||
cpy #0
|
|
||||||
bne -
|
|
||||||
rts
|
rts
|
||||||
|
|
||||||
|
+ jsr c64.RDTIM
|
||||||
|
sta P8ZP_SCRATCH_B1
|
||||||
|
- jsr c64.RDTIM
|
||||||
|
cmp P8ZP_SCRATCH_B1
|
||||||
|
beq -
|
||||||
|
|
||||||
|
lda P8ZP_SCRATCH_W1
|
||||||
|
bne +
|
||||||
|
dec P8ZP_SCRATCH_W1+1
|
||||||
|
+ dec P8ZP_SCRATCH_W1
|
||||||
|
bra _loop
|
||||||
}}
|
}}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -112,7 +112,7 @@ class TestCallgraph: FunSpec({
|
|||||||
"""
|
"""
|
||||||
val result = compileText(C64Target(), false, sourcecode)!!
|
val result = compileText(C64Target(), false, sourcecode)!!
|
||||||
val graph = CallGraph(result.program)
|
val graph = CallGraph(result.program)
|
||||||
graph.allIdentifiers.size shouldBeGreaterThanOrEqual 9
|
graph.allIdentifiers.size shouldBeGreaterThanOrEqual 5
|
||||||
val empties = graph.allIdentifiers.keys.filter { it.nameInSource==listOf("empty") }
|
val empties = graph.allIdentifiers.keys.filter { it.nameInSource==listOf("empty") }
|
||||||
empties.size shouldBe 3
|
empties.size shouldBe 3
|
||||||
empties[0].position.line shouldBe 4
|
empties[0].position.line shouldBe 4
|
||||||
|
@ -91,13 +91,15 @@ sys (part of syslib)
|
|||||||
|
|
||||||
``wait(uword jiffies)``
|
``wait(uword jiffies)``
|
||||||
wait approximately the given number of jiffies (1/60th seconds)
|
wait approximately the given number of jiffies (1/60th seconds)
|
||||||
note: the system irq handler has to be active for this to work as it depends on the system jiffy clock
|
Note: the regular system irq handler has run for this to work as it depends on the system jiffy clock.
|
||||||
|
If this is is not possible (for instance because your program is running its own irq handler logic *and* no longer calls
|
||||||
|
the kernal's handler routine), you'll have to write your own wait routine instead.
|
||||||
|
|
||||||
``waitvsync()``
|
``waitvsync()``
|
||||||
busy wait till the next vsync has occurred (approximately), without depending on custom irq handling.
|
busy wait till the next vsync has occurred (approximately), without depending on custom irq handling.
|
||||||
can be used to avoid screen flicker/tearing when updating screen contents.
|
can be used to avoid screen flicker/tearing when updating screen contents.
|
||||||
note: a more accurate way to wait for vsync is to set up a vsync irq handler instead.
|
note: a more accurate way to wait for vsync is to set up a vsync irq handler instead.
|
||||||
note for cx16: the system irq handler has to be active for this to work (this is not required on c64)
|
note for cx16: the regular system irq handler has to run for this to work (this is not required on C64 and C128)
|
||||||
|
|
||||||
``waitrastborder()`` (c64/c128 targets only)
|
``waitrastborder()`` (c64/c128 targets only)
|
||||||
busy wait till the raster position has reached the bottom screen border (approximately)
|
busy wait till the raster position has reached the bottom screen border (approximately)
|
||||||
|
@ -165,3 +165,11 @@ The Commander X16 provides two additional routines that should be used *in your
|
|||||||
; ... do your work that uses vera here...
|
; ... do your work that uses vera here...
|
||||||
cx16.pop_vera_context()
|
cx16.pop_vera_context()
|
||||||
|
|
||||||
|
.. caution::
|
||||||
|
It is advised to not use floating point calculations inside IRQ handler routines.
|
||||||
|
Beside them being very slow, there are intricate requirements such as having the
|
||||||
|
correct ROM bank enabled to be able to successfully call them (and making sure the correct
|
||||||
|
ROM bank is reset at the end of the handler), and the possibility
|
||||||
|
of corrupting variables and floating point calculations that are being executed
|
||||||
|
in the interrupted main program. These memory locations should be backed up
|
||||||
|
and restored at the end of the handler, further increasing its execution time...
|
||||||
|
Loading…
Reference in New Issue
Block a user