Alternate Multiplex Interrupt Specification Library Public Domain 1992 Ralf Brown Version 0.90 LastEdit: 9/12/92 Files in this library: AMISLIB.DOC this file TSRS.DOC usage instructions for sample TSRs and utilities AMIS.MAC include file defining various macros AMIS.ASM the actual library code AMISHOTK.ASM the library's hotkey collision detection code AMIS.H C include file defining various things AMITSRS.C sample program to list resident programs using AMIS FINDTSRS.C function to find all TSRs matching a given name POPUP.C sample program to request popup of an AMIS TSR REMOVE.C sample program to remove a specific AMIS TSR UNINSTAL.ASM TSR remover for REMOVE.C FASTMOUS.ASM sample TSR NOLPT.ASM sample TSR -- turn parallel port into bit bucket SWITCHAR.ASM sample TSR -- provide switchar() for MSDOS 5.0 VGABLANK.ASM sample TSR -- VGA screen blanker NOTE.ASM sample TSR -- popup note-taker MAKEFILE make all programs from the library sources ------------------------------------------------------------------------ Advantages of AMISLIB: totally free adds only 1K to the executable -- TSRs can be as small as 1.4K on disk and use little as 128 bytes in memory (hotkey checking adds another 300 bytes of transient code) up to 256 AMIS-compliant TSRs can be resident simultaneously with no interrupt conflicts resultant TSR can load itself into high memory (either MSDOS 5 upper memory blocks or XMS upper memory blocks); the user has control over where TSR is allowed to load: high only, low only, or high first then low; high memory may use either the first or the best UMB; low memory may use either the low end or the high end of conventional memory. TSRs using AMISLIB or other AMIS-compliant code can detect hotkey conflicts and either abort before installation or attempt to use alternate hotkeys TSRs using AMISLIB or other AMIS-compliant code can be unloaded in any order, and can be unloaded by programs other than the TSR's original executable Note: This is still a preliminary version of the library, so there might be problems. Please let me know if you find any.... ------------------------------------------------------------------------ To make use of this library, you basically need to do four things: 1. To each source file that will make calls, add INCLUDE AMIS.MAC 2. In the source file containing the program's entry point, add @Startup M,NN,SSS just after the above INCLUDE and @Startup2 at the program's entry point (see below for details). 3. Change the END line of the main source file to END INIT 4. Link in AMIS.OBJ (assembled from AMIS.ASM) with the rest of your object modules. If you are using hotkeys, also link in AMISHOTK.OBJ. Limitations: The ALTMPX and INSTALL_TSR macros must be invoked from the same source file in order for the installer to properly fix up the resident AMIS handler. (If not, you will have to perform the fixup yourself in an 'init' handler for INSTALL_TSR) AMISLIB currently limits the resident code/data (not counting the "extra" allocation at installation time) to 64K. ------------------------------------------------------------------------ After an INCLUDE AMIS.MAC, the following definitions and macros are available: AMIS_VERSION 100 times the version of the specification to which the library conforms (i.e. 123 = version 1.2.3). AMISLIB_VERSION 100 times the version of this library @Startup Declare all segments and provide some startup code. Usage: @Startup major,minor,stack Arguments: major [opt] the minimum major version of DOS required to run minor [opt] the major minor version of DOS required to run stack [opt] the number of bytes of stack to provide at startup Note: If either or is blank, the program will not check the DOS version at startup. If is blank, a default stack of 256 bytes will be provided in memory models other than Tiny (there is no stack in Tiny model, so this value will be ignored). @Startup2 Provide additional startup code at the program's actual entry point. Usage: @Startup2 psp Arguments: psp [opt] if non-blank, allocate a public variable named __psp Note: should be blank if some other module (such as the C runtime library) provides a public variable named __psp. RESIDENT_CODE The name of the segment to ASSUME or use in overrides when accessing data within the part of the program which will remain resident. TGROUP Group containing all resident segments in the TSR. See also TGROUP@ and TSRgroup@. TGROUP@ Symbol to use when loading a segment register to access the TSRs resident portion in the executable. In Tiny model, this will load the value of TGROUP from a memory location; in other memory models, it is identical to TGROUP. TSRcode@ TSRcodeEnd@ Delimit the code which will remain resident; some of the other macros listed below will not function correctly unless within a section of code delimited with TSRcode@ and TSRcodeEnd@. TSRdata@ TSRdataEnd@ Delimit the initialized data which will remain resident. Requires the use of TSRgroup@ to function properly. TSRbss@ TSRbssEnd@ Delimit the uninitialized data which will be placed in the resident portion (but omitted from the disk image of the executable if possible). Requires the use of TSRgroup@ to function properly. TSRgroup@ Declare TGROUP and force the correct ordering of TSRcode@, TSRdata@, and TSRbss@. DISPLAY_STRING Output a '$'-terminated string to standard output via DOS. Usage: DISPLAY_STRING string,dataseg Arguments: string the label of the string to be displayed dataseg [opt] the segment of the string Example: DISPLAY_STRING banner ... ... banner db "FOOBAR (c) 1992 Harry Q Bovik",13,10,"$" CHECK_DOS_VER Ensure that the program is running under the proper version of DOS, and terminate with an error message specifying the minimum required version if not. Usage: CHECK_DOS_VER major,minor Example: CHECK_DOS_VER 2,00 IF_INSTALLED Conditionally branch somewhere if the TSR is already installed. Usage: IF_INSTALLED dest Arguments: dest label to branch to if already installed Return: falls through with CF clear if not already installed branches with CF set and AH = multiplex number if installed IF_HOTKEY_USED Conditionally branch somewhere if one or more of the TSR's hotkeys are already in use. Usage: IF_HOTKEY_USED dest Arguments: dest label to branch to if hotkey conflict Return: falls through with CF clear if no hotkey conflict branches with CF set and AX = bitmask of conflict types bit 0: exact key already in use bit 1: superset key already in use bit 2: subset key already in use INSTALL_TSR Allocate memory for the resident code, copy the resident code to the allocated memory, hook all interrupts used by the TSR, optionally call an initialization function, and terminate back to DOS. Usage: INSTALL_TSR extra,fit,high,init,if_inst,on_err,more_flags Arguments: extra [opt] number of additional paragraphs needed in resident part fit [opt] FIRST or BEST (default) -fit allocation high [opt] HIGHONLY to only use UMBs, LOWONLY to only use conventional memory, TOPMEM to allocate block at high end of conventional memory if no UMBs, TOPLOW to only use top end of conventional memory init [opt] function to call after installing TSR but before exiting if_inst [opt] label to branch to if already installed on_err [opt] label to branch to if unable to install more_flags [opt] label of byte containing additional flags to be ORed with those automatically set by and Notes: If 'init' is specified, the indicated function will be called with AX = segment at which TSR was loaded If 'if_inst' is specified, the indicated function will be jumped at with AH = multiplex number CX = version number The TOPMEM and TOPLOW options are reported to be incompatible with Windows 3.0, and will most likely cause a crash if the TSR is installed while shelled out from a program using SPAWNO or another swapping spawn() replacement. Then again, anyone who attempts to install a TSR while shelled out of another program deserves whatever happens. UNINSTALL Remove the TSR from memory. Usage: UNINSTALL on_err Arguments: on_err [opt] label to branch to if unable to remove from memory Notes: If 'on_err' is omitted, check CF after this macro to determine whether the removal was successful (CF clear if successful, set on error). ISP_HEADER Set up the Interrupt Sharing Protocol header for an interrupt. Usage: ISP_HEADER intr,reset,eoi Arguments: intr interrupt number reset [opt] name of routine to perform hardware reset eoi [opt] if nonzero, this is the primary handler for a hardware int Exported Labels: (for example "ISP_HEADER 00h,reset_func,0") INT00h_handler (public), ORIG_INT00h (public), HWRESET_00h, EOI_FLAG_00h [in addition, hw_reset_00h would be present for ISP_HEADER 00h,,0] Note: This macro must be used inside a TSRcode@/TSRcodeEnd@ pair. Example: ISP_HEADER 21h cmp ah,4Bh ; provide our own EXEC replacement je exec_call jmp ORIG_INT21h exec_call: ... HOOKED_INTS Declare the interrupts this TSR hooks. Usage: HOOKED_INTS int1,int2,...,int32 Arguments: up to 32 interrupt numbers Exported Labels: $AMIS$HOOKED_INT_LIST (public) Notes: This macro must be used inside a TSRcode@/TSRcodeEnd@ or TSRdata@/TSRdataEnd@ pair. INT 2Dh need not be listed, as it is automatically added to the end of the list of hooked interrupts. Examples: HOOKED_INTS ; this TSR hooks only INT 2Dh HOOKED_INTS 13h,21h,FFh ; this TSR hooks INTs 13h, 21h, 2Dh, FFh HOTKEYS Declare the type of hotkey check(s) used by this TSR. Usage: HOTKEYS type Arguments: type when the TSR checks for it hotkey(s) Exported Labels: $AMIS$HOTKEY_LIST (public) $AMIS$HOTKEY_LIST_START (internal use) Note: This macro must be followed immediately by one or more HOTKEY macros, followed by the HOTKEYS_DONE macro. HOTKEY Declare one of the hotkeys used by this TSR. Usage: HOTKEY scan,required,disallowed Arguments: scan scan code for hotkey required shift states required for hotkey to be recognized disallowed shift states which must be inactive for hotkey HOTKEYS_DONE Indicate that the list of hotkey definitions is complete. Usage: HOTKEYS_DONE Exported Labels: $AMIS$NUM_HOTKEYS (internal use) HOTKEY_DISPATCHER Include code for a generic hotkey dispatcher on INT 15/AH=4Fh which interprets the hotkey records created with the HOTKEYS, HOTKEY, and HOTKEYS_DONE macros. Usage: HOTKEY_DISPATCHER chain,funcs,other Arguments: chain when should dispatcher chain? valid: BEFORE or AFTER funcs name of list of words containing offsets of functions other [opt] address to jump at if INT 15h invoked with AH != 4Fh Exported Labels: ORIG_INT15h Note: The list of hotkey handlers must be in the same order as the hotkeys defined with multiple instances of the HOTKEY macro. ALTMPX Define the alternate multiplex interrupt handler for the program. Usage: ALTMPX manuf,prodname,version,descrip,priv,api,popup,remove,psp Arguments: manuf one- to eight-character manufacturer's name prodname one- to eight-character product name version four-digit hex version number (hi byte = major, lo = minor) descrip [opt] string (max 63 char) describing the product priv [opt] name of routine to handle private INT 2Dh functions api [opt] name of FAR routine giving non-INT 2Dh API entry point popup [opt] name of function to call to request a popup remove [opt] name of function to call to remove TSR from memory psp [opt] if nonblank, set up patch word for memblk segment to be returned if omitted; returns CS if both and blank (in this case, INSTALL_TSR must specify either TOPMEM or HIGHONLY) Limitations on Routines: must be located in TSRcode@ input: AL = function number (10h-FFh) AH = multiplex number (ignore) others available for handler return: via IRET, with regs as appropriate for requested func must be located in TSRcode@ input: registers as desired (no limitations) return: registers as desired (no limitations) must be located in TSRcode@ input: nothing return: AL = status 01h can not pop up now, try again later 02h can not pop up yet, will do so when able 03h already popped up 04h unable to popup, user intervention required BX = standard reason code 0000h unknown failure 0001h int chain passes through memory which must be swapped out 0002h swap-in failed CX = application's reason code if nonzero FFh TSR popped up and was exited by user BX = return value 0000h no return value 0001h TSR unloaded 0002h-00FFh reserved 0100h-FFFFh application-specific must be located in TSRcode@ input: DX:BX = return address if uninstall successful return: AL = status 01h unable to remove from memory 02h can't remove now, will do so when able 03h safe to remove, but no resident uninstaller (TSR still enabled) BX = segment of memory block 04h safe to remove, but no resident uninstaller (TSR now disabled) BX = segment of memory block 05h not safe to remove now, try again later FFh successful (DX:BX were ignored) return at DX:BX with AX destroyed if successful and honors specific return address if omitted, ALTMPX returns AL=03h Exported Labels: INT2Dh_handler (public), ORIG_INT2Dh (public), HWRESET_2Dh, EOI_FLAG_2Dh, hw_reset_2Dh, $AMIS$MULTIPLEX_NUMBER (public), ALTMPX_SIGNATURE (public), ALTMPX$PSP [patch word if nonblank] Note: This macro must be used inside a TSRcode@/TSRcodeEnd@ pair. ------------------------------------------------------------------------ For more details, see AMIS.MAC, AMIS.ASM, and the source to the example TSRs. See also TSRS.DOC for usage information on the sample TSRs. ------------------------------------------------------------------------ Ralf Brown [valid until November 1, 1993] 813 Copeland Way, Suite 26 Pittsburgh, PA 15232 Ralf Brown 1:129/26.1 ralf+@cs.cmu.edu