[Main]
Name=ASM_fastcall
Type=Function
Subtype=Macro
Header Files=system.h
Definition=void ASM_fastcall (void *base_addr);
Real Definition=#define ASM_fastcall(x) ({ __need_in_use_bit; (((void(*)())(x))()); })

[Description]
Calls a subroutine located on absolute address.

[Explanation]
ASM_fastcall calls an assembly subroutine located at absolute address <I>base_addr</I>.
As ASM_fastcall is a macro, not a function, <I>base_addr</I> need not to be a pointer. It
can also be an unsigned (long) integer. In fact,
<PRE>ASM_fastcall (base_addr);
</PRE>
is the same as
<PRE>((void(*)(void))(base_addr)) ();
</PRE>
but much more readable. It performs just a "jsr" to <I>base_addr</I>; it does not perform any
relocation of relocatable items (to do this, see <A HREF="$$LINK(EX_patch)">EX_patch</A>).
<BR><BR>
ASM_fastcall assumes that called subroutine will not destroy any registers. If this
assumption is not valid, use <A HREF="$$LINK(ASM_call)">ASM_call</A> instead. In fact, if you are
not very sure about behaviour of called subroutine, it is highly recommended to avoid
ASM_fastcall and to use <A HREF="$$LINK(ASM_call)">ASM_call</A>. In releases of TIGCCLIB prior
to 2.1, <A HREF="$$LINK(ASM_call)">ASM_call</A> does exactly what ASM_fastcall does in this release.
<BR><BR>
<B>Note:</B> This function should be used with great care, because on HW2 calculators a stupid
protection device does not allow that the program counter may be on arbitrary place, except
if some special precausions are performed. Anyway, this function is not designed for common
use: it is intended for very experienced system programmers. Don't use it if you don't know
very well what are you doing!

[References]
In=ASM_call
Out_EV_eventLoop=1
