_rom_call_addr_concat Function (Macro)

default.h

#define _rom_call_addr_concat(intindex,romindex) (__jmp_tbl [intindex])

Returns a void pointer to a TIOS ROM call (internal).

_rom_call_addr_concat is an internal macro which is used by _rom_call_addr and _rom_call.

intindex contains the index of the ROM call as a numeric constant. It is used in this definition, as an array subscript for __jmp_tbl, a pointer to the table of ROM calls. romindex contains a symbol in the form _ROM_CALL_xxx, where xxx is the index in hexadecimal form without the '0x' prefix.

Other header files override this definition to use romind instead. In particular, doors.h includes a romsymb.h header file which defines a list of external variables for all ROM call symbols which may appear in romindex, and changes the definition to:

#define _rom_call_addr_concat(intindex,romindex) (&romindex)
You probably wonder why _rom_call_addr_concat exists at all, since other header files might as well override _rom_call_addr, which could be used directly by _rom_call. The reason is that all arguments which are not concatenated are scanned for macros that have to be expanded. If _rom_call was using _rom_call_addr, passing index to it, then the index parameter would be scanned. This turns out to be fatal if the user defines a macro such as A1, and uses the ROM call with the index 0xA1.

Therefore, both _rom_call_addr and _rom_call have to use concatenation on their index parameter. Then they pass the resulting symbols to _rom_call_addr_concat.