| /**************************************************************************** |
| * |
| * SciTech OS Portability Manager Library |
| * |
| * ======================================================================== |
| * |
| * The contents of this file are subject to the SciTech MGL Public |
| * License Version 1.0 (the "License"); you may not use this file |
| * except in compliance with the License. You may obtain a copy of |
| * the License at http://www.scitechsoft.com/mgl-license.txt |
| * |
| * Software distributed under the License is distributed on an |
| * "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or |
| * implied. See the License for the specific language governing |
| * rights and limitations under the License. |
| * |
| * The Original Code is Copyright (C) 1991-1998 SciTech Software, Inc. |
| * |
| * The Initial Developer of the Original Code is SciTech Software, Inc. |
| * All Rights Reserved. |
| * |
| * ======================================================================== |
| * |
| * Language: ANSI C |
| * Environment: Real mode and 16/32 bit Protected Mode |
| * |
| * Description: Header file for the interrupt handling extensions to the OS |
| * Portability Manager Library. These extensions includes |
| * simplified interrupt handling, allowing all common interrupt |
| * handlers to be hooked and handled directly with normal C |
| * functions, both in 16 bit and 32 bit modes. Note however that |
| * simplified handling does not mean slow performance! All low |
| * level interrupt handling is done efficiently in assembler |
| * for speed (well actually necessary to insulate the |
| * application from the lack of far pointers in 32 bit PM). The |
| * interrupt handlers currently supported are: |
| * |
| * Mouse (0x33 callback) |
| * Timer Tick (0x8) |
| * Keyboard (0x9 and 0x15) |
| * Control C/Break (0x23/0x1B) |
| * Critical Error (0x24) |
| * |
| ****************************************************************************/ |
| |
| #ifndef __PMINT_H |
| #define __PMINT_H |
| |
| /*--------------------------- Macros and Typedefs -------------------------*/ |
| |
| #ifdef __SMX32__ |
| /* PC interrupts (Ensure consistent with pme.inc) */ |
| #define PM_IRQ0 0x40 |
| #define PM_IRQ1 (PM_IRQ0+1) |
| #define PM_IRQ6 (PM_IRQ0+6) |
| #define PM_IRQ14 (PM_IRQ0+14) |
| #endif |
| |
| /* Define the different types of interrupt handlers that we support */ |
| |
| typedef uint (PMAPIP PM_criticalHandler)(uint axValue,uint diValue); |
| typedef void (PMAPIP PM_breakHandler)(uint breakHit); |
| typedef short (PMAPIP PM_key15Handler)(short scanCode); |
| typedef void (PMAPIP PM_mouseHandler)(uint event, uint butstate,int x,int y,int mickeyX,int mickeyY); |
| |
| /* Create a type for representing far pointers in both 16 and 32 bit |
| * protected mode. |
| */ |
| |
| #ifdef PM386 |
| typedef struct { |
| long off; |
| short sel; |
| } PMFARPTR; |
| #define PMNULL {0,0} |
| #else |
| typedef void *PMFARPTR; |
| #define PMNULL NULL |
| #endif |
| |
| /*--------------------------- Function Prototypes -------------------------*/ |
| |
| #ifdef __cplusplus |
| extern "C" { /* Use "C" linkage when in C++ mode */ |
| #endif |
| |
| /* Routine to load save default data segment selector value into a code |
| * segment variable, and another to load the value into the DS register. |
| */ |
| |
| void PMAPI PM_loadDS(void); |
| void PMAPI PM_saveDS(void); |
| |
| /* Routine to install a mouse interrupt handling routine. The |
| * mouse handler routine is a normal C function, and the PM library |
| * will take care of passing the correct parameters to the function, |
| * and switching to a local stack. |
| * |
| * Note that you _must_ lock the memory containing the mouse interrupt |
| * handler with the PM_lockPages() function otherwise you may encounter |
| * problems in virtual memory environments. |
| */ |
| |
| int PMAPI PM_setMouseHandler(int mask,PM_mouseHandler mh); |
| void PMAPI PM_restoreMouseHandler(void); |
| |
| /* Routine to reset the mouse driver, and re-install the current |
| * mouse interrupt handler if one was currently installed (since the |
| * mouse reset will automatically remove this handler. |
| */ |
| |
| void PMAPI PM_resetMouseDriver(int hardReset); |
| |
| /* Routine to reset the mouse driver, and re-install the current |
| * mouse interrupt handler if one was currently installed (since the |
| * mouse reset will automatically remove this handler. |
| */ |
| |
| void PMAPI PM_resetMouseDriver(int hardReset); |
| |
| /* Routines to install and remove timer interrupt handlers. |
| * |
| * Note that you _must_ lock the memory containing the interrupt |
| * handlers with the PM_lockPages() function otherwise you may encounter |
| * problems in virtual memory environments. |
| */ |
| |
| void PMAPI PM_setTimerHandler(PM_intHandler ih); |
| void PMAPI PM_chainPrevTimer(void); |
| void PMAPI PM_restoreTimerHandler(void); |
| |
| /* Routines to install and keyboard interrupt handlers. |
| * |
| * Note that you _must_ lock the memory containing the interrupt |
| * handlers with the PM_lockPages() function otherwise you may encounter |
| * problems in virtual memory environments. |
| */ |
| |
| void PMAPI PM_setKeyHandler(PM_intHandler ih); |
| void PMAPI PM_chainPrevKey(void); |
| void PMAPI PM_restoreKeyHandler(void); |
| |
| /* Routines to hook and unhook the alternate Int 15h keyboard intercept |
| * callout routine. Your event handler will need to return the following: |
| * |
| * scanCode - Let the BIOS process scan code (chains to previous handler) |
| * 0 - You have processed the scan code so flush from BIOS |
| * |
| * Note that this is not available under all DOS extenders, but does |
| * work under real mode, DOS4GW and X32-VM. It does not work under the |
| * PowerPack 32 bit DOS extenders. If you figure out how to do it let us know! |
| */ |
| |
| void PMAPI PM_setKey15Handler(PM_key15Handler ih); |
| void PMAPI PM_restoreKey15Handler(void); |
| |
| /* Routines to install and remove the control c/break interrupt handlers. |
| * Interrupt handling is performed by the PM/Pro library, and you can call |
| * the supplied routines to test the status of the Ctrl-C and Ctrl-Break |
| * flags. If you pass the value TRUE for 'clearFlag' to these routines, |
| * the internal flags will be reset in order to catch another Ctrl-C or |
| * Ctrl-Break interrupt. |
| */ |
| |
| void PMAPI PM_installBreakHandler(void); |
| int PMAPI PM_ctrlCHit(int clearFlag); |
| int PMAPI PM_ctrlBreakHit(int clearFlag); |
| void PMAPI PM_restoreBreakHandler(void); |
| |
| /* Routine to install an alternate break handler that will call your |
| * code directly. This is not available under all DOS extenders, but does |
| * work under real mode, DOS4GW and X32-VM. It does not work under the |
| * PowerPack 32 bit DOS extenders. If you figure out how to do it let us know! |
| * |
| * Note that you should either install one or the other, but not both! |
| */ |
| |
| void PMAPI PM_installAltBreakHandler(PM_breakHandler bh); |
| |
| /* Routines to install and remove the critical error handler. The interrupt |
| * is handled by the PM/Pro library, and the operation will always be failed. |
| * You can check the status of the critical error handler with the |
| * appropriate function. If you pass the value TRUE for 'clearFlag', the |
| * internal flag will be reset ready to catch another critical error. |
| */ |
| |
| void PMAPI PM_installCriticalHandler(void); |
| int PMAPI PM_criticalError(int *axValue, int *diValue, int clearFlag); |
| void PMAPI PM_restoreCriticalHandler(void); |
| |
| /* Routine to install an alternate critical handler that will call your |
| * code directly. This is not available under all DOS extenders, but does |
| * work under real mode, DOS4GW and X32-VM. It does not work under the |
| * PowerPack 32 bit DOS extenders. If you figure out how to do it let us know! |
| * |
| * Note that you should either install one or the other, but not both! |
| */ |
| |
| void PMAPI PM_installAltCriticalHandler(PM_criticalHandler); |
| |
| /* Functions to manage protected mode only interrupt handlers */ |
| |
| void PMAPI PM_getPMvect(int intno, PMFARPTR *isr); |
| void PMAPI PM_setPMvect(int intno, PM_intHandler ih); |
| void PMAPI PM_restorePMvect(int intno, PMFARPTR isr); |
| |
| #ifdef __cplusplus |
| } /* End of "C" linkage for C++ */ |
| #endif |
| |
| #endif /* __PMINT_H */ |