11.4 Dynamic functions

-----------------------

Dynamic functions are functions which are defined but are only inserted

into the program code if there are calls. They can be used as macros.

The definition of a dynamic function starts with a colon ':',

Example of a stack dynamic function:

: void setvideomode (byte mode)

{

AL = mode;

AH = 0;

$ INT 0x10

}

Example of a function dynamic register:

: int ABS () /* AX = number, which absolute value search for*/

{

IF (int AX < 0)

-AX;

}

/* AX = number whose absolute value is sought/

11.4.1 Loading a dynamic function at a specific address in memory

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Dynamic functions, if they are used as macros and if they were called

in a program, are inserted into the program code at the very end of

compilation. It is not known where exactly in the program they will turn

up. To locate a dynamic function at a specific place in a program, do the

following:

:void proc ( int par1, par2)

{

...

}

We have a dynamic function whose code is supposed to be located

before the code of a regular function in the program. Before defining

this function, write the following string:

@ void proc ();

This causes a dynamic function to be inserted into the program code

not at its end, as usual, but at the place where this string is found.

If the dynamic function has parameters, these must be registered.

The compiler has a still more powerful way to locate all dynamic

objects (functions, variables, structures) at the desired spot and not at

the end of the program, as usual. This is the directive '#setdinproc'. On

encountering this directive, the compiler immediately places all dynamic

objects currently known to it at the site of declaration of this

directive. Later dynamic objects are placed as usual at the end of the

program if '#setdinproc' is not applied again.

This can be be put to good use when creating TSRs and device drivers.