Execf call skip behaviour
in Propeller 2
Hello,
I have an issue with a program that uses execf with call instructions.
See this example:
CON
_clkfreq = 160_000_000
DAT
org $000
call #test_execf
call #test_execf_nop
jmp #$
test_execf
debug(udec(test_execf))
push #$+2
execf op1
debug(udec(t1))
push #$+2
execf op2
debug(udec(t1))
push #$+2
execf op3
debug(udec(t1))
ret
test_execf_nop
debug(udec(test_execf_nop))
push #$+2
execf op1_nop
debug(udec(t1))
push #$+2
execf op2_nop
debug(udec(t1))
push #$+2
execf op3_nop
debug(udec(t1))
ret
op1 long op | %1_1_0 << 10
op2 long op | %1_0_1 << 10
op3 long op | %0_1_1 << 10
op1_nop long op_nop | %01_01_00 << 10
op2_nop long op_nop | %01_00_01 << 10
op3_nop long op_nop | %00_01_01 << 10
op call #sub1
call #sub2
call #sub3
ret
op_nop call #sub1
nop
call #sub2
nop
call #sub3
nop
ret
sub1 _ret_ mov t1, #1
sub2 _ret_ mov t1, #2
sub3 _ret_ mov t1, #3
t1 res 1
t2 res 1
This is an image of the debug output:
You can see that, apparently, contiguous calls can't skipped but if there is another instruction in between (a nop in this case) the skip pattern works.
Is that the correct behaviour or I'm missing something ?
Comments
CALL must use absolute addressing with SKIPF/EXECF, e.g CALL #\routine or CALL reg, if the instruction after the call might be skipped. See "Special SKIPF Branching Rules" in the doc.
It is safest to use absolute addressing for every CALL in a SKIPF sequence. I do that for non-skipping CALLs, too, just in case they become part of a skip sequence later.
Isn't that what I'm using ?
No, just noticed the backslash !!!
(some rants and really bad words deleted before posting)
New postit: P2 CALL/JMP ARE RELATIVE !!!
Thanks for your help!