Page 55 of 62
SBasic User's Manual SBasic Version 2.7 Page 55
Printed: December 5, 1999
The ASMFUNC statement
The ASMFUNC statement gives SB access to labels and routines within a
block of assembly language code. See the section above on the ASM
statement. The format for the ASMFUNC statement is:
asmfunc foo
This statement tells the SBasic compiler that subsequent references to
the label FOO must be passed to the output file as FOO, not as a
converted label.
ASMFUNC adds tremendous power to SB, allowing you to write your own
SBasic extensions in assembly language, then use them as if they were
an integral part of SB. For example:
declare stack ' declare a variable
asmfunc getstk ' define an asm entry point
main: ' enter here
stack = getstk(0) ' get addr of return stack
do loop ' silly loop
asm ' switch to assembly language
getstk ' entry point to getstk()
tsx ' move addr of stack to x
xgdx ' move addr of stack to d
rts ' return addr of stack
endasm ' back to SBasic
end
Here, the ASMFUNC statement tells SB that references to the label
GETSTK are to be passed unchanged to the output file. Thus, when the
SB code invokes the function GETSTK() to get the current hardware
stack address, SB generates a JSR to GETSTK, not a JSR to an address
with an internal SB label.
The actual code for subroutine GETSTK exists in the ASM block. GETSTK
moves the stack pointer into the 68hc11's D-register and returns. The
code generated by SB then stores the D-register into variable STACK
and falls into the silly loop at the end of the program.
This example shows how to set up an ASMFUNC statement and its
associated assembly language. It also shows how to use an ASMFUNC
label as a function. In this case, you must adhere to SBasic's
general rules regarding functions. Functions, which return a result
in the D-register, must be called with an argument. Since the GETSTK
routine doesn't need an argument, anything will work, but you must
include an argument of some kind. That's why I show an argument of 0
for GETSTK.