diff options
Diffstat (limited to 'board/MAI/bios_emulator/scitech/src/common/gaos2.c')
| -rw-r--r-- | board/MAI/bios_emulator/scitech/src/common/gaos2.c | 248 | 
1 files changed, 248 insertions, 0 deletions
| diff --git a/board/MAI/bios_emulator/scitech/src/common/gaos2.c b/board/MAI/bios_emulator/scitech/src/common/gaos2.c new file mode 100644 index 000000000..822e93ca6 --- /dev/null +++ b/board/MAI/bios_emulator/scitech/src/common/gaos2.c @@ -0,0 +1,248 @@ +/**************************************************************************** +* +*                   SciTech Nucleus Graphics Architecture +* +*               Copyright (C) 1991-1998 SciTech Software, Inc. +*                            All rights reserved. +* +*  ====================================================================== +*  |REMOVAL OR MODIFICATION OF THIS HEADER IS STRICTLY PROHIBITED BY LAW| +*  |                                                                    | +*  |This copyrighted computer code contains proprietary technology      | +*  |owned by SciTech Software, Inc., located at 505 Wall Street,        | +*  |Chico, CA 95928 USA (http://www.scitechsoft.com).                   | +*  |                                                                    | +*  |The contents of this file are subject to the SciTech Nucleus        | +*  |License; you may *not* use this file or related software except in  | +*  |compliance with the License. You may obtain a copy of the License   | +*  |at http://www.scitechsoft.com/nucleus-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.                           | +*  |                                                                    | +*  |REMOVAL OR MODIFICATION OF THIS HEADER IS STRICTLY PROHIBITED BY LAW| +*  ====================================================================== +* +* Language:     ANSI C +* Environment:  OS/2 32-bit +* +* Description:  OS specific Nucleus Graphics Architecture services for +*               the OS/2 operating system environments. +* +****************************************************************************/ + +#include "pm_help.h" +#define INCL_DOSERRORS +#define INCL_DOS +#define INCL_SUB +#define INCL_VIO +#define INCL_KBD +#include <os2.h> + +/*--------------------------- Global variables ----------------------------*/ + +static ibool    haveRDTSC = false; +static ulong    parms[3];       /* Must not cross 64Kb boundary!    */ +static ulong    result[4];      /* Must not cross 64Kb boundary!    */ + +/*-------------------------- Implementation -------------------------------*/ + +/**************************************************************************** +PARAMETERS: +func        - Helper device driver function to call + +RETURNS: +First return value from the device driver in parmsOut[0] + +REMARKS: +Function to open our helper device driver, call it and close the file +handle. Note that we have to open the device driver for every call because +of two problems: + + 1. We cannot open a single file handle in a DLL that is shared amongst +    programs, since every process must have it's own open file handle. + + 2. For some reason there appears to be a limit of about 12 open file +    handles on a device driver in the system. Hence when we open more +    than about 12 file handles things start to go very strange. + +Hence we simply open the file handle every time that we need to call the +device driver to work around these problems. +****************************************************************************/ +static ulong CallSDDHelp( +    int func) +{ +    static ulong    inLen;          /* Must not cross 64Kb boundary!    */ +    static ulong    outLen;         /* Must not cross 64Kb boundary!    */ +    HFILE           hSDDHelp; + +    /* If this code in here fails, we are screwed! Many of our drivers +     * use this code and don't have a C library, so we simply assume we +     * can't fail here. +     */ +    DosOpen(PMHELP_NAME,&hSDDHelp,&result[0],0,0, +            FILE_OPEN, OPEN_SHARE_DENYNONE | OPEN_ACCESS_READWRITE, +            NULL); +    DosDevIOCtl(hSDDHelp,PMHELP_IOCTL,func, +             &parms, inLen = sizeof(parms), &inLen, +            &result, outLen = sizeof(result), &outLen); +    DosClose(hSDDHelp); +    return result[0]; +} + +/**************************************************************************** +PARAMETERS: +path    - Local path to the Nucleus driver files. + +REMARKS: +This function is used by the application program to override the location +of the Nucleus driver files that are loaded. Normally the loader code +will look in the system Nucleus directories first, then in the 'drivers' +directory relative to the current working directory, and finally relative +to the MGL_ROOT environment variable. +****************************************************************************/ +void NAPI GA_setLocalPath( +    const char *path) +{ +    PM_setLocalBPDPath(path); +} + +/**************************************************************************** +RETURNS: +Pointer to the system wide PM library imports, or the internal version if none + +REMARKS: +For OS/2 we don't need to do anything special because Nucleus is always +loaded via the shared SDDPMI driver when SDD is loaded so we don't need +a system wide PM library imports function. +****************************************************************************/ +PM_imports * NAPI GA_getSystemPMImports(void) +{ +    return &_PM_imports; +} + +/**************************************************************************** +PARAMETERS: +gaExp   - Place to store the exported functions +shared  - True if connecting to the shared, global Nucleus driver + +REMARKS: +For OS/2 if SDD is loaded we *always* connect to the shared Nucleus functions +contained within the SDDPMI driver. This allows the Nucleus functions contained +within this driver to be utilised by all Nucleus apps in the system and +maintains a consistent state between versions. +****************************************************************************/ +ibool NAPI GA_getSharedExports( +    GA_exports *gaExp, +    ibool shared) +{ +    /* In test harness mode, we need to load a local copy of Nucleus */ +#if !defined (TEST_HARNESS) || defined (DEBUG_SDDPMI) +    HMODULE     hModSDDPMI; +    char        buf[80]; +    GA_exports  *exp; + +    /* Initialise the PM library and connect to our runtime DLL's */ +    PM_init(); +    if (CallSDDHelp(PMHELP_GETSHAREDEXP) != 0) { +        /* We have found the shared Nucleus exports. Because not all processes +         * map to SDDPMI.DLL, we need to ensure that we connect to this +         * DLL so that it gets mapped into our address space (that is +         * where the shared Nucleus loader code is located). Simply doing a +         * DosLoadModule on it is enough for this. +         */ +        DosLoadModule((PSZ)buf,sizeof(buf),(PSZ)"SDDPMI.DLL",&hModSDDPMI); +        exp = (GA_exports*)result[0]; +        memcpy(gaExp,exp,MIN(gaExp->dwSize,exp->dwSize)); +        return true; +        } +#endif +    (void)shared; +    return false; +} + +#ifndef TEST_HARNESS +/**************************************************************************** +REMARKS: +Nothing special for this OS +****************************************************************************/ +ibool NAPI GA_queryFunctions( +    GA_devCtx *dc, +    N_uint32 id, +    void _FAR_ *funcs) +{ +    return __GA_exports.GA_queryFunctions(dc,id,funcs); +} + +/**************************************************************************** +REMARKS: +Nothing special for this OS +****************************************************************************/ +ibool NAPI REF2D_queryFunctions( +    REF2D_driver *ref2d, +    N_uint32 id, +    void _FAR_ *funcs) +{ +    return __GA_exports.REF2D_queryFunctions(ref2d,id,funcs); +} +#endif + +/**************************************************************************** +REMARKS: +This function initialises the high precision timing functions for the +Nucleus loader library. +****************************************************************************/ +ibool NAPI GA_TimerInit(void) +{ +    if (_GA_haveCPUID() && (_GA_getCPUIDFeatures() & CPU_HaveRDTSC) != 0) +        haveRDTSC = true; +    return true; +} + +/**************************************************************************** +REMARKS: +This function reads the high resolution timer. +****************************************************************************/ +void NAPI GA_TimerRead( +    GA_largeInteger *value) +{ +    if (haveRDTSC) +        _GA_readTimeStamp(value); +    else +        DosTmrQueryTime((QWORD*)value); +} + +/**************************************************************************** +REMARKS: +On OS/2, we need special memory allocation functions if we build SDDPMI in +test harness mode. But if we build GATest etc. in test mode, we want to use +the normal C runtime functions, so route them back here. +****************************************************************************/ + +#if defined (TEST_HARNESS) && !defined (DEBUG_SDDPMI) + +/* Undefine these macros first or we'll recurse to hell! */ +#undef malloc +#undef calloc +#undef realloc +#undef free + +void *SDDPMI_malloc(size_t size) { +    return malloc(size); +} + +void *SDDPMI_calloc(size_t num, size_t size) { +    return calloc(num, size); +} + +void SDDPMI_free(void *ptr) { +    free(ptr); +} + +void *SDDPMI_realloc(void *ptr, size_t size) { +    return realloc(ptr, size); +} + +#endif |