INCALL - call internal function (with no SYMREF).
Usage:
incall ADDRESS,NARGS,bump=>STBUMP,point=>OP
Where:
- ADDRESS
- is the address of the routine you want to call.
- NARGS
- is the number of words of arguments to be passed to the
function. (Remember this is the amount of space occupied
by the arguments, not the actual number of arguments.)
- bump=>STBUMP
- gives the distance to bump the stack. If this option is
omitted, the default STBUMP value is the length of the
STACK (.highest(STACK)-.lowest(STACK)).
- point=>OP
- gives an instruction for loading the "address"
into "p.entr" (the entry register). If this
option is not specified, an EPPR instruction will be
used. If you specify "point=>" without a
value, "incall" will not generate an
instruction to load "p.entr" with an entry
address; presumably, the entry address has already been
loaded into "p.entr".
Description:
"incall" calls a routine that does not need to be
linked with the current module. No SYMREF is generated for the
routine being called.
Examples:
incall func,10
#generates
eppr p.entr,func
ldx x.bump,.highest(STACK)-.lowest(STACK),du
eppr p.ret,*+3,$
tra .call
zero nargs
{ #start of code block
last: .set .ic(S_ARG1) #argument area
.origin S_ARG1+10 #end of args
.origin last
}
In this example, "last" is a variable local to
"incall". The two ".origin" statements in the
code block move to the end of the argument area and back again to
make sure that the stack's highwater mark takes into account the
size of the arguments.
Copyright © 1996, Thinkage Ltd.