Page 57 of 62
SBasic User's Manual SBasic Version 2.7 Page 57
Printed: December 5, 1999
as both a function and a statement, if you so choose. What's more,
you could pass varying numbers of arguments to the same ASMFUNC label
as a statement. You are responsible for ensuring your assembly
language routine behaves properly in all cases. SBasic will blindly
load up the arguments and perform the JSR; your code has to deal
properly with any variations in argument count.
Note that the second example is not completely general, since it can
be called only from the top level (main) of your SB program. If, for
example, you tried to do a SETSTK from within an SB routine, that
routine would crash when it executed a RETURN statement, since its
return address had moved when the stack pointer changed.
When writing assembly language code invoked with ASMFUNC labels,
remember to preserve SB's registers. For the 68hc11 and 68hc12, the
Y-register holds the data stack pointer and the S-register holds the
return stack pointer. Additionally, any argument returned to the
calling routine is passed back in the D-register.
To summarize, you can use an ASMFUNC label as either a statement or a
function. If used as a statement, you can supply zero, one, or more
arguments; any arguments will be pushed left to right onto the data
stack before the JSR to your label is executed. If used as a
function, you MUST supply one and only one argument to the function.
This argument will be passed to the called routine in the D-register,
though your routine can ignore it. Upon returning from your routine,
the contents of the D-register will be used as the returned value of
the function.
Additionally, remember that ASMFUNC labels do not exist as SBasic
labels. You cannot do a GOSUB to an ASMFUNC label, since that label
only exists in the assembly language module.
Since the ASMFUNC statement only affects subsequent references, the
statement must appear in your source file before any references to the
target label appear. Thus, it's best if you put all of your ASMFUNC
statements near the beginning of your source file.