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.