summaryrefslogtreecommitdiffstats
path: root/board/MAI/bios_emulator/scitech/src/common
diff options
context:
space:
mode:
Diffstat (limited to 'board/MAI/bios_emulator/scitech/src/common')
-rw-r--r--board/MAI/bios_emulator/scitech/src/common/_aa_imp.asm51
-rw-r--r--board/MAI/bios_emulator/scitech/src/common/_ga_imp.asm136
-rw-r--r--board/MAI/bios_emulator/scitech/src/common/_gatimer.asm248
-rw-r--r--board/MAI/bios_emulator/scitech/src/common/_pm_imp.asm195
-rw-r--r--board/MAI/bios_emulator/scitech/src/common/aabeos.c92
-rw-r--r--board/MAI/bios_emulator/scitech/src/common/aados.c64
-rw-r--r--board/MAI/bios_emulator/scitech/src/common/aalib.c225
-rw-r--r--board/MAI/bios_emulator/scitech/src/common/aalinux.c94
-rw-r--r--board/MAI/bios_emulator/scitech/src/common/aaos2.c124
-rw-r--r--board/MAI/bios_emulator/scitech/src/common/aaqnx.c95
-rw-r--r--board/MAI/bios_emulator/scitech/src/common/aartt.c89
-rw-r--r--board/MAI/bios_emulator/scitech/src/common/aasmx.c83
-rw-r--r--board/MAI/bios_emulator/scitech/src/common/aavxd.c90
-rw-r--r--board/MAI/bios_emulator/scitech/src/common/aawin32.c264
-rw-r--r--board/MAI/bios_emulator/scitech/src/common/agplib.c220
-rw-r--r--board/MAI/bios_emulator/scitech/src/common/center.c123
-rw-r--r--board/MAI/bios_emulator/scitech/src/common/cmdline.c428
-rw-r--r--board/MAI/bios_emulator/scitech/src/common/gabeos.c146
-rw-r--r--board/MAI/bios_emulator/scitech/src/common/gados.c136
-rw-r--r--board/MAI/bios_emulator/scitech/src/common/galib.c269
-rw-r--r--board/MAI/bios_emulator/scitech/src/common/galinux.c148
-rw-r--r--board/MAI/bios_emulator/scitech/src/common/gantdrv.c137
-rw-r--r--board/MAI/bios_emulator/scitech/src/common/gaos2.c248
-rw-r--r--board/MAI/bios_emulator/scitech/src/common/gaqnx.c149
-rw-r--r--board/MAI/bios_emulator/scitech/src/common/gartt.c139
-rw-r--r--board/MAI/bios_emulator/scitech/src/common/gasmx.c133
-rw-r--r--board/MAI/bios_emulator/scitech/src/common/gavxd.c137
-rw-r--r--board/MAI/bios_emulator/scitech/src/common/gawin32.c256
-rw-r--r--board/MAI/bios_emulator/scitech/src/common/gtfcalc.c436
-rw-r--r--board/MAI/bios_emulator/scitech/src/common/libcimp.c828
-rw-r--r--board/MAI/bios_emulator/scitech/src/common/makefile18
-rw-r--r--board/MAI/bios_emulator/scitech/src/common/peloader.c587
-rw-r--r--board/MAI/bios_emulator/scitech/src/common/vesavbe.c1214
33 files changed, 7602 insertions, 0 deletions
diff --git a/board/MAI/bios_emulator/scitech/src/common/_aa_imp.asm b/board/MAI/bios_emulator/scitech/src/common/_aa_imp.asm
new file mode 100644
index 0000000000..61a9024ab3
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/src/common/_aa_imp.asm
@@ -0,0 +1,51 @@
+;****************************************************************************
+;*
+;* SciTech Nucleus Audio 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: TASM 4.0 or NASM
+;* Environment: IBM PC 32 bit Protected Mode.
+;*
+;* Description: Module to implement the import stubs for all the Nucleus
+;* Audio API functions for Intel binary compatible drivers.
+;*
+;****************************************************************************
+
+ IDEAL
+
+include "scitech.mac" ; Memory model macros
+
+BEGIN_IMPORTS_DEF _AA_exports
+SKIP_IMP AA_status ; Implemented in C code
+SKIP_IMP AA_errorMsg ; Implemented in C code
+SKIP_IMP AA_getDaysLeft ; Implemented in C code
+SKIP_IMP AA_registerLicense ; Implemented in C code
+SKIP_IMP AA_enumerateDevices ; Implemented in C code
+SKIP_IMP AA_loadDriver ; Implemented in C code
+DECLARE_IMP AA_unloadDriver
+DECLARE_IMP AA_saveOptions
+END_IMPORTS_DEF
+
+ END
diff --git a/board/MAI/bios_emulator/scitech/src/common/_ga_imp.asm b/board/MAI/bios_emulator/scitech/src/common/_ga_imp.asm
new file mode 100644
index 0000000000..5317600438
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/src/common/_ga_imp.asm
@@ -0,0 +1,136 @@
+;****************************************************************************
+;*
+;* 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: TASM 4.0 or NASM
+;* Environment: IBM PC 32 bit Protected Mode.
+;*
+;* Description: Module to implement the import stubs for all the Nucleus
+;* Graphics API functions for Intel binary compatible drivers.
+;*
+;****************************************************************************
+
+ IDEAL
+
+include "scitech.mac" ; Memory model macros
+
+BEGIN_IMPORTS_DEF __GA_exports
+SKIP_IMP GA_status,0 ; Implemented in C code
+SKIP_IMP GA_errorMsg,1 ; Implemented in C code
+SKIP_IMP GA_getDaysLeft,1 ; Implemented in C code
+SKIP_IMP GA_registerLicense,2 ; Implemented in C code
+SKIP_IMP GA_enumerateDevices,1 ; Implemented in C code
+SKIP_IMP GA_loadDriver,2 ; Implemented in C code
+DECLARE_IMP GA_setActiveDevice,1
+SKIP_IMP GA_reserved1,0 ; Implemented in C code
+DECLARE_IMP GA_unloadDriver,1
+DECLARE_IMP REF2D_loadDriver,6
+DECLARE_IMP REF2D_unloadDriver,2
+DECLARE_IMP GA_loadRef2d,5
+DECLARE_IMP GA_unloadRef2d,1
+DECLARE_IMP GA_softStereoInit,1
+DECLARE_IMP GA_softStereoOn,0
+DECLARE_IMP GA_softStereoScheduleFlip,2
+DECLARE_IMP GA_softStereoGetFlipStatus,0
+DECLARE_IMP GA_softStereoWaitTillFlipped,0
+DECLARE_IMP GA_softStereoOff,0
+DECLARE_IMP GA_softStereoExit,0
+DECLARE_IMP GA_saveModeProfile,2
+DECLARE_IMP GA_saveOptions,2
+DECLARE_IMP GA_saveCRTCTimings,1
+DECLARE_IMP GA_restoreCRTCTimings,1
+DECLARE_IMP DDC_init,1
+DECLARE_IMP DDC_readEDID,5
+DECLARE_IMP EDID_parse,3
+DECLARE_IMP MCS_begin,1
+DECLARE_IMP MCS_getCapabilitiesString,2
+DECLARE_IMP MCS_isControlSupported,1
+DECLARE_IMP MCS_enableControl,2
+DECLARE_IMP MCS_getControlMax,2
+DECLARE_IMP MCS_getControlValue,2
+DECLARE_IMP MCS_getControlValues,3
+DECLARE_IMP MCS_setControlValue,2
+DECLARE_IMP MCS_setControlValues,3
+DECLARE_IMP MCS_resetControl,1
+DECLARE_IMP MCS_saveCurrentSettings,0
+DECLARE_IMP MCS_getTimingReport,3
+DECLARE_IMP MCS_getSelfTestReport,3
+DECLARE_IMP MCS_end,0
+SKIP_IMP GA_loadInGUI,1 ; Implemented in C code
+DECLARE_IMP DDC_writeEDID,6
+DECLARE_IMP GA_useDoubleScan,1
+DECLARE_IMP GA_getMaxRefreshRate,4
+DECLARE_IMP GA_computeCRTCTimings,6
+DECLARE_IMP GA_addMode,5
+DECLARE_IMP GA_addRefresh,5
+DECLARE_IMP GA_delMode,5
+DECLARE_IMP N_getLogName,0
+SKIP_IMP2 N_log
+DECLARE_IMP MDBX_getErrCode,0
+DECLARE_IMP MDBX_getErrorMsg,0
+DECLARE_IMP MDBX_open,1
+DECLARE_IMP MDBX_close,0
+DECLARE_IMP MDBX_first,1
+DECLARE_IMP MDBX_last,1
+DECLARE_IMP MDBX_next,1
+DECLARE_IMP MDBX_prev,1
+DECLARE_IMP MDBX_insert,1
+DECLARE_IMP MDBX_update,1
+DECLARE_IMP MDBX_flush,0
+DECLARE_IMP MDBX_importINF,2
+SKIP_IMP GA_getGlobalOptions,2 ; Implemented in C code
+DECLARE_IMP GA_setGlobalOptions,1
+DECLARE_IMP GA_saveGlobalOptions,1
+DECLARE_IMP GA_getInternalName,1
+DECLARE_IMP GA_getNucleusConfigPath,0
+DECLARE_IMP GA_getFakePCIID,0
+SKIP_IMP GA_loadLibrary,3 ; Implemented in C code
+SKIP_IMP GA_isOEMVersion,1 ; Implemented in C code
+DECLARE_IMP GA_isLiteVersion,1
+DECLARE_IMP GA_getDisplaySerialNo,1
+DECLARE_IMP GA_getDisplayUserName,1
+SKIP_IMP GA_getCurrentDriver,1 ; Implemented in C code
+SKIP_IMP GA_getCurrentRef2d,1 ; Implemented in C code
+SKIP_IMP GA_getLicensedDevices,1 ; Implemented in C code
+DECLARE_IMP DDC_initExt,2
+DECLARE_IMP MCS_beginExt,2
+DECLARE_IMP GA_loadRegionMgr,3
+DECLARE_IMP GA_unloadRegionMgr,1
+DECLARE_IMP GA_getProcAddress,2
+DECLARE_IMP GA_enableVBEMode,5
+DECLARE_IMP GA_disableVBEMode,5
+DECLARE_IMP GA_loadModeProfile,2
+DECLARE_IMP GA_getCRTCTimings,4
+DECLARE_IMP GA_setCRTCTimings,4
+DECLARE_IMP GA_setDefaultRefresh,6
+DECLARE_IMP GA_saveMonitorInfo,2
+DECLARE_IMP GA_detectPnPMonitor,3
+SKIP_IMP3 GA_queryFunctions
+SKIP_IMP3 REF2D_queryFunctions
+END_IMPORTS_DEF
+
+ END
+
diff --git a/board/MAI/bios_emulator/scitech/src/common/_gatimer.asm b/board/MAI/bios_emulator/scitech/src/common/_gatimer.asm
new file mode 100644
index 0000000000..0194a62f98
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/src/common/_gatimer.asm
@@ -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: 80386 Assembler, NASM or TASM
+;* Environment: IBM PC 32 bit Protected Mode.
+;*
+;* Description: Assembly support functions for the Nucleus library for
+;* the high resolution timing support functions provided by
+;* the Intel Pentium and compatible processors.
+;*
+;****************************************************************************
+
+ IDEAL
+
+include "scitech.mac" ; Memory model macros
+
+header _gatimer
+
+begcodeseg _gatimer
+
+ifdef USE_NASM
+%macro mCPU_ID 0
+db 00Fh,0A2h
+%endmacro
+else
+MACRO mCPU_ID
+db 00Fh,0A2h
+ENDM
+endif
+
+ifdef USE_NASM
+%macro mRDTSC 0
+db 00Fh,031h
+%endmacro
+else
+MACRO mRDTSC
+db 00Fh,031h
+ENDM
+endif
+
+;----------------------------------------------------------------------------
+; bool _GA_haveCPUID(void)
+;----------------------------------------------------------------------------
+; Determines if we have support for the CPUID instruction.
+;----------------------------------------------------------------------------
+cprocstart _GA_haveCPUID
+
+ enter_c
+ pushfd ; Get original EFLAGS
+ pop eax
+ mov ecx, eax
+ xor eax, 200000h ; Flip ID bit in EFLAGS
+ push eax ; Save new EFLAGS value on stack
+ popfd ; Replace current EFLAGS value
+ pushfd ; Get new EFLAGS
+ pop eax ; Store new EFLAGS in EAX
+ xor eax, ecx ; Can not toggle ID bit,
+ jnz @@1 ; Processor=80486
+ mov eax,0 ; We dont have CPUID support
+ jmp @@Done
+@@1: mov eax,1 ; We have CPUID support
+@@Done: leave_c
+ ret
+
+cprocend
+
+;----------------------------------------------------------------------------
+; uint _GA_getCPUIDFeatures(void)
+;----------------------------------------------------------------------------
+; Determines the CPU type using the CPUID instruction.
+;----------------------------------------------------------------------------
+cprocstart _GA_getCPUIDFeatures
+
+ enter_c
+
+ xor eax, eax ; Set up for CPUID instruction
+ mCPU_ID ; Get and save vendor ID
+ cmp eax, 1 ; Make sure 1 is valid input for CPUID
+ jl @@Fail ; We dont have the CPUID instruction
+ xor eax, eax
+ inc eax
+ mCPU_ID ; Get family/model/stepping/features
+ mov eax, edx
+@@Done: leave_c
+ ret
+
+@@Fail: xor eax,eax
+ jmp @@Done
+
+cprocend
+
+;----------------------------------------------------------------------------
+; void _GA_readTimeStamp(GA_largeInteger *time)
+;----------------------------------------------------------------------------
+; Reads the time stamp counter and returns the 64-bit result.
+;----------------------------------------------------------------------------
+cprocstart _GA_readTimeStamp
+
+ mRDTSC
+ mov ecx,[esp+4] ; Access directly without stack frame
+ mov [ecx],eax
+ mov [ecx+4],edx
+ ret
+
+cprocend
+
+;----------------------------------------------------------------------------
+; N_uint32 GA_TimerDifference(GA_largeInteger *a,GA_largeInteger *b)
+;----------------------------------------------------------------------------
+; Computes the difference between two 64-bit numbers (a-b)
+;----------------------------------------------------------------------------
+cprocstart GA_TimerDifference
+
+ ARG a:DPTR, b:DPTR, t:DPTR
+
+ enter_c
+
+ mov ecx,[a]
+ mov eax,[ecx] ; EAX := b.low
+ mov ecx,[b]
+ sub eax,[ecx]
+ mov edx,eax ; EDX := low difference
+ mov ecx,[a]
+ mov eax,[ecx+4] ; ECX := b.high
+ mov ecx,[b]
+ sbb eax,[ecx+4] ; EAX := high difference
+ mov eax,edx ; Return low part
+
+ leave_c
+ ret
+
+cprocend
+
+; Macro to delay briefly to ensure that enough time has elapsed between
+; successive I/O accesses so that the device being accessed can respond
+; to both accesses even on a very fast PC.
+
+ifdef USE_NASM
+%macro DELAY_TIMER 0
+ jmp short $+2
+ jmp short $+2
+ jmp short $+2
+%endmacro
+else
+macro DELAY_TIMER
+ jmp short $+2
+ jmp short $+2
+ jmp short $+2
+endm
+endif
+
+;----------------------------------------------------------------------------
+; void _OS_delay8253(N_uint32 microSeconds);
+;----------------------------------------------------------------------------
+; Delays for the specified number of microseconds, by directly programming
+; the 8253 timer chips.
+;----------------------------------------------------------------------------
+cprocstart _OS_delay8253
+
+ ARG microSec:UINT
+
+ enter_c
+
+; Start timer 2 counting
+
+ mov _ax,[microSec] ; EAX := count in microseconds
+ mov ecx,1196
+ mul ecx
+ mov ecx,1000
+ div ecx
+ mov ecx,eax ; ECX := count in timer ticks
+ in al,61h
+ or al,1
+ out 61h,al
+
+; Set the timer 2 count to 0 again to start the timing interval.
+
+ mov al,10110100b ; set up to load initial (timer 2)
+ out 43h,al ; timer count
+ DELAY_TIMER
+ sub al,al
+ out 42h,al ; load count lsb
+ DELAY_TIMER
+ out 42h,al ; load count msb
+ xor di,di ; Allow max 64K loop iterations
+
+@@LoopStart:
+ dec di ; This is a guard against the possibility that
+ jz @@LoopEnd ; someone eg. stopped the timer behind our back.
+ ; After 64K iterations we bail out no matter what
+ ; (and hope it wasn't too soon)
+ mov al,00000000b ; latch timer 0
+ out 43h,al
+ DELAY_TIMER
+ in al,42h ; least significant byte
+ DELAY_TIMER
+ mov ah,al
+ in al,42h ; most significant byte
+ xchg ah,al
+ neg ax ; Convert from countdown remaining
+ ; to elapsed count
+ cmp ax,cx ; Has delay expired?
+ jb @@LoopStart ; No, so loop till done
+
+; Stop timer 2 from counting
+@@LoopEnd:
+ in al,61H
+ and al,0FEh
+ out 61H,al
+
+; Some programs have a problem if we change the control port; better change it
+; to something they expect (mode 3 - square wave generator)...
+ mov al,0B6h
+ out 43h,al
+
+ leave_c
+ ret
+
+cprocend
+
+endcodeseg _gatimer
+
+ END
+
diff --git a/board/MAI/bios_emulator/scitech/src/common/_pm_imp.asm b/board/MAI/bios_emulator/scitech/src/common/_pm_imp.asm
new file mode 100644
index 0000000000..d4b11790af
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/src/common/_pm_imp.asm
@@ -0,0 +1,195 @@
+;****************************************************************************
+;*
+;* SciTech OS Portability Manager Library
+;*
+;* 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: TASM 4.0 or NASM
+;* Environment: IBM PC 32 bit Protected Mode.
+;*
+;* Description: Module to implement the import stubs for all the PM
+;* API functions for Intel binary portable drivers.
+;*
+;****************************************************************************
+
+ IDEAL
+
+include "scitech.mac" ; Memory model macros
+
+BEGIN_IMPORTS_DEF _PM_imports
+DECLARE_IMP PM_getModeType,0
+DECLARE_IMP PM_getBIOSPointer,0
+DECLARE_IMP PM_getA0000Pointer,0
+DECLARE_IMP PM_mapPhysicalAddr,0
+DECLARE_IMP PM_mallocShared,0
+SKIP_IMP _PM_reserved1,0
+DECLARE_IMP PM_freeShared,0
+DECLARE_IMP PM_mapToProcess,0
+DECLARE_IMP PM_mapRealPointer,0
+DECLARE_IMP PM_allocRealSeg,0
+DECLARE_IMP PM_freeRealSeg,0
+DECLARE_IMP PM_allocLockedMem,0
+DECLARE_IMP PM_freeLockedMem,0
+DECLARE_IMP PM_callRealMode,0
+DECLARE_IMP PM_int86,0
+DECLARE_IMP PM_int86x,0
+DECLARE_IMP DPMI_int86,0
+DECLARE_IMP PM_availableMemory,0
+DECLARE_IMP PM_getVESABuf,0
+DECLARE_IMP PM_getOSType,0
+DECLARE_IMP PM_fatalError,0
+DECLARE_IMP PM_setBankA,0
+DECLARE_IMP PM_setBankAB,0
+DECLARE_IMP PM_setCRTStart,0
+DECLARE_IMP PM_getCurrentPat,0
+DECLARE_IMP PM_getVBEAFPath,0
+DECLARE_IMP PM_getNucleusPath,0
+DECLARE_IMP PM_getNucleusConfigPath,0
+DECLARE_IMP PM_getUniqueID,0
+DECLARE_IMP PM_getMachineName,0
+DECLARE_IMP VF_available,0
+DECLARE_IMP VF_init,0
+DECLARE_IMP VF_exit,0
+DECLARE_IMP PM_openConsole,0
+DECLARE_IMP PM_getConsoleStateSize,0
+DECLARE_IMP PM_saveConsoleState,0
+DECLARE_IMP PM_restoreConsoleState,0
+DECLARE_IMP PM_closeConsole,0
+DECLARE_IMP PM_setOSCursorLocation,0
+DECLARE_IMP PM_setOSScreenWidth,0
+DECLARE_IMP PM_enableWriteCombine,0
+DECLARE_IMP PM_backslash,0
+DECLARE_IMP PM_lockDataPages,0
+DECLARE_IMP PM_unlockDataPages,0
+DECLARE_IMP PM_lockCodePages,0
+DECLARE_IMP PM_unlockCodePages,0
+DECLARE_IMP PM_setRealTimeClockHandler,0
+DECLARE_IMP PM_setRealTimeClockFrequency,0
+DECLARE_IMP PM_restoreRealTimeClockHandler,0
+DECLARE_IMP PM_doBIOSPOST,0
+DECLARE_IMP PM_getBootDrive,0
+DECLARE_IMP PM_freePhysicalAddr,0
+DECLARE_IMP PM_inpb,0
+DECLARE_IMP PM_inpw,0
+DECLARE_IMP PM_inpd,0
+DECLARE_IMP PM_outpb,0
+DECLARE_IMP PM_outpw,0
+DECLARE_IMP PM_outpd,0
+SKIP_IMP _PM_reserved2,0
+DECLARE_IMP PM_setSuspendAppCallback,0
+DECLARE_IMP PM_haveBIOSAccess,0
+DECLARE_IMP PM_kbhit,0
+DECLARE_IMP PM_getch,0
+DECLARE_IMP PM_findBPD,0
+DECLARE_IMP PM_getPhysicalAddr,0
+DECLARE_IMP PM_sleep,0
+DECLARE_IMP PM_getCOMPort,0
+DECLARE_IMP PM_getLPTPort,0
+DECLARE_IMP PM_loadLibrary,0
+DECLARE_IMP PM_getProcAddress,0
+DECLARE_IMP PM_freeLibrary,0
+DECLARE_IMP PCI_enumerate,0
+DECLARE_IMP PCI_accessReg,0
+DECLARE_IMP PCI_setHardwareIRQ,0
+DECLARE_IMP PCI_generateSpecialCyle,0
+SKIP_IMP _PM_reserved3,0
+DECLARE_IMP PCIBIOS_getEntry,0
+DECLARE_IMP CPU_getProcessorType,0
+DECLARE_IMP CPU_haveMMX,0
+DECLARE_IMP CPU_have3DNow,0
+DECLARE_IMP CPU_haveSSE,0
+DECLARE_IMP CPU_haveRDTSC,0
+DECLARE_IMP CPU_getProcessorSpeed,0
+DECLARE_IMP ZTimerInit,0
+DECLARE_IMP LZTimerOn,0
+DECLARE_IMP LZTimerLap,0
+DECLARE_IMP LZTimerOff,0
+DECLARE_IMP LZTimerCount,0
+DECLARE_IMP LZTimerOnExt,0
+DECLARE_IMP LZTimerLapExt,0
+DECLARE_IMP LZTimerOffExt,0
+DECLARE_IMP LZTimerCountExt,0
+DECLARE_IMP ULZTimerOn,0
+DECLARE_IMP ULZTimerLap,0
+DECLARE_IMP ULZTimerOff,0
+DECLARE_IMP ULZTimerCount,0
+DECLARE_IMP ULZReadTime,0
+DECLARE_IMP ULZElapsedTime,0
+DECLARE_IMP ULZTimerResolution,0
+DECLARE_IMP PM_findFirstFile,0
+DECLARE_IMP PM_findNextFile,0
+DECLARE_IMP PM_findClose,0
+DECLARE_IMP PM_makepath,0
+DECLARE_IMP PM_splitpath,0
+DECLARE_IMP PM_driveValid,0
+DECLARE_IMP PM_getdcwd,0
+DECLARE_IMP PM_setFileAttr,0
+DECLARE_IMP PM_mkdir,0
+DECLARE_IMP PM_rmdir,0
+DECLARE_IMP PM_getFileAttr,0
+DECLARE_IMP PM_getFileTime,0
+DECLARE_IMP PM_setFileTime,0
+DECLARE_IMP CPU_getProcessorName,0
+DECLARE_IMP PM_getVGAStateSize,0
+DECLARE_IMP PM_saveVGAState,0
+DECLARE_IMP PM_restoreVGAState,0
+DECLARE_IMP PM_vgaBlankDisplay,0
+DECLARE_IMP PM_vgaUnblankDisplay,0
+DECLARE_IMP PM_blockUntilTimeout,0
+DECLARE_IMP _PM_add64,0
+DECLARE_IMP _PM_sub64,0
+DECLARE_IMP _PM_mul64,0
+DECLARE_IMP _PM_div64,0
+DECLARE_IMP _PM_shr64,0
+DECLARE_IMP _PM_sar64,0
+DECLARE_IMP _PM_shl64,0
+DECLARE_IMP _PM_neg64,0
+DECLARE_IMP PCI_findBARSize,0
+DECLARE_IMP PCI_readRegBlock,0
+DECLARE_IMP PCI_writeRegBlock,0
+DECLARE_IMP PM_flushTLB,0
+DECLARE_IMP PM_useLocalMalloc,0
+DECLARE_IMP PM_malloc,0
+DECLARE_IMP PM_calloc,0
+DECLARE_IMP PM_realloc,0
+DECLARE_IMP PM_free,0
+DECLARE_IMP PM_getPhysicalAddrRange,0
+DECLARE_IMP PM_allocPage,0
+DECLARE_IMP PM_freePage,0
+DECLARE_IMP PM_agpInit,0
+DECLARE_IMP PM_agpExit,0
+DECLARE_IMP PM_agpReservePhysical,0
+DECLARE_IMP PM_agpReleasePhysical,0
+DECLARE_IMP PM_agpCommitPhysical,0
+DECLARE_IMP PM_agpFreePhysical,0
+DECLARE_IMP PCI_getNumDevices,0
+DECLARE_IMP PM_setLocalBPDPath,0
+DECLARE_IMP PM_loadDirectDraw,0
+DECLARE_IMP PM_unloadDirectDraw,0
+DECLARE_IMP PM_getDirectDrawWindow,0
+DECLARE_IMP PM_doSuspendApp,0
+END_IMPORTS_DEF
+
+ END
+
diff --git a/board/MAI/bios_emulator/scitech/src/common/aabeos.c b/board/MAI/bios_emulator/scitech/src/common/aabeos.c
new file mode 100644
index 0000000000..ba8645945b
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/src/common/aabeos.c
@@ -0,0 +1,92 @@
+/****************************************************************************
+*
+* 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: Linux
+*
+* Description: OS specific Nucleus Graphics Architecture services for
+* the Linux operating system.
+*
+****************************************************************************/
+
+#include "nucleus/graphics.h"
+#include <sys/time.h>
+
+static ibool haveRDTSC;
+
+/*-------------------------- Implementation -------------------------------*/
+
+/****************************************************************************
+REMARKS:
+Nothing special for this OS.
+****************************************************************************/
+GA_sharedInfo * NAPI GA_getSharedInfo(
+ int device)
+{
+ (void)device;
+ return NULL;
+}
+
+/****************************************************************************
+REMARKS:
+Nothing special for this OS.
+****************************************************************************/
+ibool NAPI GA_getSharedExports(
+ GA_exports *gaExp)
+{
+ (void)gaExp;
+ return false;
+}
+
+/****************************************************************************
+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 {
+ struct timeval t;
+ gettimeofday(&t, NULL);
+ value->low = t.tv_sec*1000000 + t.tv_usec;
+ value->high = 0;
+ }
+}
diff --git a/board/MAI/bios_emulator/scitech/src/common/aados.c b/board/MAI/bios_emulator/scitech/src/common/aados.c
new file mode 100644
index 0000000000..e994f938eb
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/src/common/aados.c
@@ -0,0 +1,64 @@
+/****************************************************************************
+*
+* 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: MSDOS
+*
+* Description: OS specific Nucleus Graphics Architecture services for
+* the MSDOS operating system.
+*
+****************************************************************************/
+
+#include "pm_help.h"
+#include "pmapi.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+/*-------------------------- Implementation -------------------------------*/
+
+/****************************************************************************
+REMARKS:
+This function initialises the high precision timing functions for the DOS
+Nucleus loader library.
+****************************************************************************/
+ibool NAPI GA_TimerInit(void)
+{
+ if (_GA_haveCPUID() && (_GA_getCPUIDFeatures() & CPU_HaveRDTSC) != 0)
+ return true;
+ return false;
+}
+
+/****************************************************************************
+REMARKS:
+This function reads the high resolution timer.
+****************************************************************************/
+void NAPI GA_TimerRead(
+ GA_largeInteger *value)
+{
+ _GA_readTimeStamp(value);
+}
diff --git a/board/MAI/bios_emulator/scitech/src/common/aalib.c b/board/MAI/bios_emulator/scitech/src/common/aalib.c
new file mode 100644
index 0000000000..84bf7b3d8f
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/src/common/aalib.c
@@ -0,0 +1,225 @@
+/****************************************************************************
+*
+* SciTech Nucleus Audio 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: Any 32-bit protected mode environment
+*
+* Description: C module for the Graphics Accelerator Driver API. Uses
+* the SciTech PM library for interfacing with DOS
+* extender specific functions.
+*
+****************************************************************************/
+
+#include "nucleus/audio.h"
+#ifdef __WIN32_VXD__
+#include "sdd/sddhelp.h"
+#else
+#include <stdio.h>
+#include <stdlib.h>
+#endif
+
+/*---------------------------- Global Variables ---------------------------*/
+
+#ifdef TEST_HARNESS
+extern PM_imports _VARAPI _PM_imports;
+#else
+AA_exports _VARAPI _AA_exports;
+static int loaded = false;
+static PE_MODULE *hModBPD = NULL;
+
+#ifdef __DRIVER__
+extern PM_imports _PM_imports;
+#else
+#include "pmimp.h"
+#endif
+
+static N_imports _N_imports = {
+ sizeof(N_imports),
+ _OS_delay,
+ };
+
+#ifdef __DRIVER__
+extern AA_imports _AA_imports;
+#else
+static AA_imports _AA_imports = {
+ sizeof(AA_imports),
+ };
+#endif
+#endif
+
+/*----------------------------- Implementation ----------------------------*/
+
+#define DLL_NAME "audio.bpd"
+
+#ifndef TEST_HARNESS
+/****************************************************************************
+REMARKS:
+Fatal error handler for non-exported AA_exports.
+****************************************************************************/
+static void _AA_fatalErrorHandler(void)
+{
+ PM_fatalError("Unsupported Nucleus export function called! Please upgrade your copy of Nucleus!\n");
+}
+
+/****************************************************************************
+REMARKS:
+Loads the Nucleus binary portable DLL into memory and initilises it.
+****************************************************************************/
+static ibool LoadDriver(void)
+{
+ AA_initLibrary_t AA_initLibrary;
+ AA_exports *aaExp;
+ char filename[PM_MAX_PATH];
+ char bpdpath[PM_MAX_PATH];
+ int i,max;
+ ulong *p;
+
+ /* Check if we have already loaded the driver */
+ if (loaded)
+ return true;
+ PM_init();
+ _AA_exports.dwSize = sizeof(_AA_exports);
+
+ /* Open the BPD file */
+ if (!PM_findBPD(DLL_NAME,bpdpath))
+ return false;
+ strcpy(filename,bpdpath);
+ strcat(filename,DLL_NAME);
+ if ((hModBPD = PE_loadLibrary(filename,false)) == NULL)
+ return false;
+ if ((AA_initLibrary = (AA_initLibrary_t)PE_getProcAddress(hModBPD,"_AA_initLibrary")) == NULL)
+ return false;
+ bpdpath[strlen(bpdpath)-1] = 0;
+ if (strcmp(bpdpath,PM_getNucleusPath()) == 0)
+ strcpy(bpdpath,PM_getNucleusConfigPath());
+ else {
+ PM_backslash(bpdpath);
+ strcat(bpdpath,"config");
+ }
+ if ((aaExp = AA_initLibrary(bpdpath,filename,&_PM_imports,&_N_imports,&_AA_imports)) == NULL)
+ PM_fatalError("AA_initLibrary failed!\n");
+
+ /* Initialize all default imports to point to fatal error handler
+ * for upwards compatibility, and copy the exported functions.
+ */
+ max = sizeof(_AA_exports)/sizeof(AA_initLibrary_t);
+ for (i = 0,p = (ulong*)&_AA_exports; i < max; i++)
+ *p++ = (ulong)_AA_fatalErrorHandler;
+ memcpy(&_AA_exports,aaExp,MIN(sizeof(_AA_exports),aaExp->dwSize));
+ loaded = true;
+ return true;
+}
+
+/* The following are stub entry points that the application calls to
+ * initialise the Nucleus loader library, and we use this to load our
+ * driver DLL from disk and initialise the library using it.
+ */
+
+/* {secret} */
+int NAPI AA_status(void)
+{
+ if (!loaded)
+ return nDriverNotFound;
+ return _AA_exports.AA_status();
+}
+
+/* {secret} */
+const char * NAPI AA_errorMsg(
+ N_int32 status)
+{
+ if (!loaded)
+ return "Unable to load Nucleus device driver!";
+ return _AA_exports.AA_errorMsg(status);
+}
+
+/* {secret} */
+int NAPI AA_getDaysLeft(void)
+{
+ if (!LoadDriver())
+ return -1;
+ return _AA_exports.AA_getDaysLeft();
+}
+
+/* {secret} */
+int NAPI AA_registerLicense(uchar *license)
+{
+ if (!LoadDriver())
+ return 0;
+ return _AA_exports.AA_registerLicense(license);
+}
+
+/* {secret} */
+int NAPI AA_enumerateDevices(void)
+{
+ if (!LoadDriver())
+ return 0;
+ return _AA_exports.AA_enumerateDevices();
+}
+
+/* {secret} */
+AA_devCtx * NAPI AA_loadDriver(N_int32 deviceIndex)
+{
+ if (!LoadDriver())
+ return NULL;
+ return _AA_exports.AA_loadDriver(deviceIndex);
+}
+#endif
+
+typedef struct {
+ N_uint32 low;
+ N_uint32 high;
+ } AA_largeInteger;
+
+void NAPI _OS_delay8253(N_uint32 microSeconds);
+ibool NAPI _GA_haveCPUID(void);
+uint NAPI _GA_getCPUIDFeatures(void);
+void NAPI _GA_readTimeStamp(AA_largeInteger *time);
+#define CPU_HaveRDTSC 0x00000010
+
+/****************************************************************************
+REMARKS:
+This function delays for the specified number of microseconds
+****************************************************************************/
+void NAPI _OS_delay(
+ N_uint32 microSeconds)
+{
+ static ibool inited = false;
+ LZTimerObject tm;
+
+ if (_GA_haveCPUID() && (_GA_getCPUIDFeatures() & CPU_HaveRDTSC) != 0) {
+ if (!inited) {
+ ZTimerInit();
+ inited = true;
+ }
+ LZTimerOnExt(&tm);
+ while (LZTimerLapExt(&tm) < microSeconds)
+ ;
+ LZTimerOnExt(&tm);
+ }
+ else
+ _OS_delay8253(microSeconds);
+}
diff --git a/board/MAI/bios_emulator/scitech/src/common/aalinux.c b/board/MAI/bios_emulator/scitech/src/common/aalinux.c
new file mode 100644
index 0000000000..4385b23e4f
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/src/common/aalinux.c
@@ -0,0 +1,94 @@
+/****************************************************************************
+*
+* 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: Linux
+*
+* Description: OS specific Nucleus Graphics Architecture services for
+* the Linux operating system.
+*
+****************************************************************************/
+
+#include "nucleus/graphics.h"
+#include <sys/time.h>
+
+/*---------------------------- Global Variables ---------------------------*/
+
+static ibool haveRDTSC;
+
+/*-------------------------- Implementation -------------------------------*/
+
+/****************************************************************************
+REMARKS:
+Nothing special for this OS.
+****************************************************************************/
+GA_sharedInfo * NAPI GA_getSharedInfo(
+ int device)
+{
+ (void)device;
+ return NULL;
+}
+
+/****************************************************************************
+REMARKS:
+Nothing special for this OS.
+****************************************************************************/
+ibool NAPI GA_getSharedExports(
+ GA_exports *gaExp)
+{
+ (void)gaExp;
+ return false;
+}
+
+/****************************************************************************
+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 {
+ struct timeval t;
+ gettimeofday(&t, NULL);
+ value->low = t.tv_sec*1000000 + t.tv_usec;
+ value->high = 0;
+ }
+}
diff --git a/board/MAI/bios_emulator/scitech/src/common/aaos2.c b/board/MAI/bios_emulator/scitech/src/common/aaos2.c
new file mode 100644
index 0000000000..486b96a9c0
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/src/common/aaos2.c
@@ -0,0 +1,124 @@
+/****************************************************************************
+*
+* 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 HFILE hSDDHelp;
+static ulong outLen; /* Must not cross 64Kb boundary! */
+static ulong result; /* Must not cross 64Kb boundary! */
+static ibool haveRDTSC;
+
+/*-------------------------- Implementation -------------------------------*/
+
+/****************************************************************************
+REMARKS:
+This function returns a pointer to the common graphics driver loaded in the
+helper VxD. The memory for the VxD is shared between all processes via
+the VxD, so that the VxD, 16-bit code and 32-bit code all see the same
+state when accessing the graphics binary portable driver.
+****************************************************************************/
+GA_sharedInfo * NAPI GA_getSharedInfo(
+ int device)
+{
+ /* Initialise the PM library and connect to our runtime DLL's */
+ PM_init();
+
+ /* Open our helper device driver */
+ if (DosOpen(PMHELP_NAME,&hSDDHelp,&result,0,0,
+ FILE_OPEN, OPEN_SHARE_DENYNONE | OPEN_ACCESS_READWRITE,
+ NULL))
+ PM_fatalError("Unable to open SDDHELP$ helper device driver!");
+ outLen = sizeof(result);
+ DosDevIOCtl(hSDDHelp,PMHELP_IOCTL,PMHELP_GETSHAREDINFO,
+ NULL, 0, NULL,
+ &result, outLen, &outLen);
+ DosClose(hSDDHelp);
+ if (result) {
+ /* We have found the shared Nucleus packet. 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 packet is located). Simply doing a
+ * DosLoadModule on it is enough for this.
+ */
+ HMODULE hModSDDPMI;
+ char buf[80];
+ DosLoadModule((PSZ)buf,sizeof(buf),(PSZ)"SDDPMI.DLL",&hModSDDPMI);
+ }
+ return (GA_sharedInfo*)result;
+}
+
+/****************************************************************************
+REMARKS:
+Nothing special for this OS.
+****************************************************************************/
+ibool NAPI GA_getSharedExports(
+ GA_exports *gaExp)
+{
+ (void)gaExp;
+ return false;
+}
+
+/****************************************************************************
+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);
+}
diff --git a/board/MAI/bios_emulator/scitech/src/common/aaqnx.c b/board/MAI/bios_emulator/scitech/src/common/aaqnx.c
new file mode 100644
index 0000000000..2e26c9afa6
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/src/common/aaqnx.c
@@ -0,0 +1,95 @@
+/****************************************************************************
+*
+* 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: QNX
+*
+* Description: OS specific Nucleus Graphics Architecture services for
+* the QNX operating system.
+*
+****************************************************************************/
+
+#include "nucleus/graphics.h"
+#include <time.h>
+
+/*---------------------------- Global Variables ---------------------------*/
+
+static ibool haveRDTSC;
+
+/*-------------------------- Implementation -------------------------------*/
+
+/****************************************************************************
+REMARKS:
+Nothing special for this OS.
+****************************************************************************/
+GA_sharedInfo * NAPI GA_getSharedInfo(
+ int device)
+{
+ (void)device;
+ return NULL;
+}
+
+/****************************************************************************
+REMARKS:
+Nothing special for this OS.
+****************************************************************************/
+ibool NAPI GA_getSharedExports(
+ GA_exports *gaExp)
+{
+ (void)gaExp;
+ return false;
+}
+
+/****************************************************************************
+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 {
+ struct timespec ts;
+
+ clock_gettime(CLOCK_REALTIME, &ts);
+ value->low = (ts.tv_nsec / 1000 + ts.tv_sec * 1000000);
+ value->high = 0;
+ }
+}
diff --git a/board/MAI/bios_emulator/scitech/src/common/aartt.c b/board/MAI/bios_emulator/scitech/src/common/aartt.c
new file mode 100644
index 0000000000..17a06b531c
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/src/common/aartt.c
@@ -0,0 +1,89 @@
+/****************************************************************************
+*
+* 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: RTTarget-32
+*
+* Description: OS specific Nucleus Graphics Architecture services for
+* the RTTarget-32 operating system environments.
+*
+****************************************************************************/
+
+#include "nucleus/graphics.h"
+
+/*------------------------- Global Variables ------------------------------*/
+
+static ibool haveRDTSC;
+
+/*-------------------------- Implementation -------------------------------*/
+
+/****************************************************************************
+REMARKS:
+Nothing special for this OS.
+****************************************************************************/
+GA_sharedInfo * NAPI GA_getSharedInfo(
+ int device)
+{
+ (void)device;
+ return NULL;
+}
+
+/****************************************************************************
+REMARKS:
+Nothing special for this OS.
+****************************************************************************/
+ibool NAPI GA_getSharedExports(
+ GA_exports *gaExp)
+{
+ (void)gaExp;
+ return false;
+}
+
+/****************************************************************************
+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;
+ }
+ return false;
+}
+
+/****************************************************************************
+REMARKS:
+This function reads the high resolution timer.
+****************************************************************************/
+void NAPI GA_TimerRead(
+ GA_largeInteger *value)
+{
+ if (haveRDTSC)
+ _GA_readTimeStamp(value);
+}
diff --git a/board/MAI/bios_emulator/scitech/src/common/aasmx.c b/board/MAI/bios_emulator/scitech/src/common/aasmx.c
new file mode 100644
index 0000000000..56cbd5b888
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/src/common/aasmx.c
@@ -0,0 +1,83 @@
+/****************************************************************************
+*
+* 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: smx32
+*
+* Description: OS specific Nucleus Graphics Architecture services for
+* the smx32 platform -- no vxD support.
+*
+****************************************************************************/
+
+#include "pmapi.h"
+#include "nucleus/graphics.h"
+
+/*-------------------------- Implementation -------------------------------*/
+
+/****************************************************************************
+REMARKS:
+Nothing special for this OS.
+****************************************************************************/
+GA_sharedInfo * NAPI GA_getSharedInfo(
+ int device)
+{
+ (void)device;
+ return NULL;
+}
+
+/****************************************************************************
+REMARKS:
+Nothing special for this OS.
+****************************************************************************/
+ibool NAPI GA_getSharedExports(
+ GA_exports *gaExp)
+{
+ (void)gaExp;
+ return false;
+}
+
+/****************************************************************************
+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)
+ return true;
+ return false;
+}
+
+/****************************************************************************
+REMARKS:
+This function reads the high resolution timer.
+****************************************************************************/
+void NAPI GA_TimerRead(
+ GA_largeInteger *value)
+{
+ _GA_readTimeStamp(value);
+}
diff --git a/board/MAI/bios_emulator/scitech/src/common/aavxd.c b/board/MAI/bios_emulator/scitech/src/common/aavxd.c
new file mode 100644
index 0000000000..295533db39
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/src/common/aavxd.c
@@ -0,0 +1,90 @@
+/****************************************************************************
+*
+* 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: Win32 VxD
+*
+* Description: OS specific Nucleus Graphics Architecture services for
+* the Win32 VxD's.
+*
+****************************************************************************/
+
+#include "sdd/sddhelp.h"
+
+/*------------------------- Global Variables ------------------------------*/
+
+static ibool haveRDTSC;
+
+/*-------------------------- Implementation -------------------------------*/
+
+/****************************************************************************
+REMARKS:
+Return the internal shared info structure.
+****************************************************************************/
+GA_sharedInfo * NAPI GA_getSharedInfo(
+ int device)
+{
+ static GA_sharedInfo shared = {0,-1};
+ return &shared;
+}
+
+/****************************************************************************
+REMARKS:
+Nothing special for this OS.
+****************************************************************************/
+ibool NAPI GA_getSharedExports(
+ GA_exports *gaExp)
+{
+ (void)gaExp;
+ return false;
+}
+
+/****************************************************************************
+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
+ VTD_Get_Real_Time(&value->high,&value->low);
+}
diff --git a/board/MAI/bios_emulator/scitech/src/common/aawin32.c b/board/MAI/bios_emulator/scitech/src/common/aawin32.c
new file mode 100644
index 0000000000..f63f004f99
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/src/common/aawin32.c
@@ -0,0 +1,264 @@
+/****************************************************************************
+*
+* 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: Win32
+*
+* Description: OS specific Nucleus Graphics Architecture services for
+* the Win32 operating system environments.
+*
+****************************************************************************/
+
+#include "pm_help.h"
+#include "pmapi.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#define STRICT
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+
+/*------------------------- Global Variables ------------------------------*/
+
+#if GA_MAX_DEVICES > 4
+#error GA_MAX_DEVICES has changed!
+#endif
+
+static ibool haveRDTSC;
+static GA_largeInteger countFreq;
+static GA_loadDriver_t ORG_GA_loadDriver;
+extern HANDLE _PM_hDevice;
+
+/*-------------------------- Implementation -------------------------------*/
+
+/****************************************************************************
+DESCRIPTION:
+Get the current graphics driver imports from the VxD
+
+REMARKS:
+This function returns a pointer to the common graphics driver loaded in the
+helper VxD. The memory for the VxD is shared between all processes via
+the VxD, so that the VxD, 16-bit code and 32-bit code all see the same
+state when accessing the graphics binary portable driver.
+****************************************************************************/
+GA_sharedInfo * NAPI GA_getSharedInfo(
+ int device)
+{
+ DWORD inBuf[1]; /* Buffer to send data to VxD */
+ DWORD outBuf[2]; /* Buffer to receive data from VxD */
+ DWORD count; /* Count of bytes returned from VxD */
+
+ PM_init();
+ inBuf[0] = device;
+ if (DeviceIoControl(_PM_hDevice, PMHELP_GETSHAREDINFO32, inBuf, sizeof(inBuf),
+ outBuf, sizeof(outBuf), &count, NULL)) {
+ return (GA_sharedInfo*)outBuf[0];
+ }
+ return NULL;
+}
+
+/****************************************************************************
+REMARKS:
+Nothing special for this OS.
+****************************************************************************/
+ibool NAPI GA_getSharedExports(
+ GA_exports *gaExp)
+{
+ (void)gaExp;
+ return false;
+}
+
+/****************************************************************************
+REMARKS:
+This function initialises the software stereo module by either calling
+the Nucleus libraries directly, or calling into the VxD if we are running
+on the shared Nucleus libraries loaded by the Windows VxD.
+****************************************************************************/
+static ibool NAPI _GA_softStereoInit(
+ GA_devCtx *dc)
+{
+ if (_PM_hDevice) {
+ DWORD inBuf[1]; /* Buffer to send data to VxD */
+ DWORD outBuf[1]; /* Buffer to receive data from VxD */
+ DWORD count; /* Count of bytes returned from VxD */
+
+ inBuf[0] = (ulong)dc;
+ if (DeviceIoControl(_PM_hDevice, PMHELP_GASTEREOINIT32, inBuf, sizeof(inBuf),
+ outBuf, sizeof(outBuf), &count, NULL)) {
+ return outBuf[0];
+ }
+ }
+ return false;
+}
+
+/****************************************************************************
+REMARKS:
+This function turns on software stereo mode, either directly or via the VxD.
+****************************************************************************/
+static void NAPI _GA_softStereoOn(void)
+{
+ if (_PM_hDevice) {
+ DeviceIoControl(_PM_hDevice, PMHELP_GASTEREOON32, NULL, 0,
+ NULL, 0, NULL, NULL);
+ }
+}
+
+/****************************************************************************
+REMARKS:
+This function schedules a software stereo mode page flip, either directly
+or via the VxD.
+****************************************************************************/
+static void NAPI _GA_softStereoScheduleFlip(
+ N_uint32 leftAddr,
+ N_uint32 rightAddr)
+{
+ if (_PM_hDevice) {
+ DWORD inBuf[2]; /* Buffer to send data to VxD */
+ DWORD count; /* Count of bytes returned from VxD */
+
+ inBuf[0] = (ulong)leftAddr;
+ inBuf[1] = (ulong)rightAddr;
+ DeviceIoControl(_PM_hDevice, PMHELP_GASTEREOFLIP32, inBuf, sizeof(inBuf),
+ NULL, 0, &count, NULL);
+ }
+}
+
+/****************************************************************************
+REMARKS:
+This function turns off software stereo mode, either directly or via the VxD.
+****************************************************************************/
+static N_int32 NAPI _GA_softStereoGetFlipStatus(void)
+{
+ if (_PM_hDevice) {
+ DWORD outBuf[1]; /* Buffer to receive data from VxD */
+ DWORD count; /* Count of bytes returned from VxD */
+
+ if (DeviceIoControl(_PM_hDevice, PMHELP_GASTEREOFLIPSTATUS32, NULL, 0,
+ outBuf, sizeof(outBuf), &count, NULL)) {
+ return outBuf[0];
+ }
+ }
+ return 0;
+}
+
+/****************************************************************************
+REMARKS:
+This function turns off software stereo mode, either directly or via the VxD.
+****************************************************************************/
+static void NAPI _GA_softStereoWaitTillFlipped(void)
+{
+ while (!_GA_softStereoGetFlipStatus())
+ ;
+}
+
+/****************************************************************************
+REMARKS:
+This function turns off software stereo mode, either directly or via the VxD.
+****************************************************************************/
+static void NAPI _GA_softStereoOff(void)
+{
+ if (_PM_hDevice) {
+ DeviceIoControl(_PM_hDevice, PMHELP_GASTEREOOFF32, NULL, 0,
+ NULL, 0, NULL, NULL);
+ }
+}
+
+/****************************************************************************
+REMARKS:
+This function disable the software stereo handler, either directly or via
+the VxD.
+****************************************************************************/
+static void NAPI _GA_softStereoExit(void)
+{
+ if (_PM_hDevice) {
+ DeviceIoControl(_PM_hDevice, PMHELP_GASTEREOEXIT32, NULL, 0,
+ NULL, 0, NULL, NULL);
+ }
+}
+
+/****************************************************************************
+REMARKS:
+We hook this function in here so that we can avoid the memory detect and
+other destructive sequences in the drivers if we are loading the driver
+from a Win32 application (our display drivers in contrast load them inside
+the VxD directly, but the control panel applets use this function).
+****************************************************************************/
+static GA_devCtx * NAPI _GA_loadDriver(
+ N_int32 deviceIndex,
+ N_int32 shared)
+{
+ GA_devCtx *dc;
+ DWORD inBuf[1];
+ DWORD outBuf[1];
+ N_int32 totalMemory = 0,oldIOPL;
+
+ if (deviceIndex >= GA_MAX_DEVICES)
+ PM_fatalError("DeviceIndex too large in GA_loadDriver!");
+ PM_init();
+ inBuf[0] = deviceIndex;
+ if (DeviceIoControl(_PM_hDevice, PMHELP_GETMEMSIZE32,
+ inBuf, sizeof(inBuf), outBuf, sizeof(outBuf), NULL, NULL))
+ totalMemory = outBuf[0];
+ if (totalMemory == 0)
+ totalMemory = 8192;
+ _GA_exports.GA_forceMemSize(totalMemory,shared);
+ oldIOPL = PM_setIOPL(3);
+ dc = ORG_GA_loadDriver(deviceIndex,shared);
+ PM_setIOPL(oldIOPL);
+ return dc;
+}
+
+/****************************************************************************
+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;
+ }
+ else if (QueryPerformanceFrequency((LARGE_INTEGER*)&countFreq)) {
+ haveRDTSC = false;
+ return true;
+ }
+ return false;
+}
+
+/****************************************************************************
+REMARKS:
+This function reads the high resolution timer.
+****************************************************************************/
+void NAPI GA_TimerRead(
+ GA_largeInteger *value)
+{
+ if (haveRDTSC)
+ _GA_readTimeStamp(value);
+ else
+ QueryPerformanceCounter((LARGE_INTEGER*)value);
+}
diff --git a/board/MAI/bios_emulator/scitech/src/common/agplib.c b/board/MAI/bios_emulator/scitech/src/common/agplib.c
new file mode 100644
index 0000000000..df8f932fb1
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/src/common/agplib.c
@@ -0,0 +1,220 @@
+/****************************************************************************
+*
+* 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: Any 32-bit protected mode environment
+*
+* Description: C module for the Graphics Accelerator Driver API. Uses
+* the SciTech PM library for interfacing with DOS
+* extender specific functions.
+*
+****************************************************************************/
+
+#include "nucleus/graphics.h"
+#include "nucleus/agp.h"
+
+/*---------------------------- Global Variables ---------------------------*/
+
+#ifndef DEBUG_AGP_DRIVER
+static AGP_exports _AGP_exports;
+static int loaded = false;
+static PE_MODULE *hModBPD = NULL;
+
+static N_imports _N_imports = {
+ sizeof(N_imports),
+ _OS_delay,
+ };
+
+static AGP_imports _AGP_imports = {
+ sizeof(AGP_imports),
+ };
+#endif
+
+#include "pmimp.h"
+
+/*----------------------------- Implementation ----------------------------*/
+
+#define DLL_NAME "agp.bpd"
+
+#ifndef DEBUG_AGP_DRIVER
+/****************************************************************************
+REMARKS:
+Fatal error handler for non-exported GA_exports.
+****************************************************************************/
+static void _AGP_fatalErrorHandler(void)
+{
+ PM_fatalError("Unsupported AGP export function called! Please upgrade your copy of AGP!\n");
+}
+
+/****************************************************************************
+PARAMETERS:
+shared - True to load the driver into shared memory.
+
+REMARKS:
+Loads the Nucleus binary portable DLL into memory and initilises it.
+****************************************************************************/
+static ibool LoadDriver(void)
+{
+ AGP_initLibrary_t AGP_initLibrary;
+ AGP_exports *agpExp;
+ char filename[PM_MAX_PATH];
+ char bpdpath[PM_MAX_PATH];
+ int i,max;
+ ulong *p;
+
+ /* Check if we have already loaded the driver */
+ if (loaded)
+ return true;
+ PM_init();
+
+ /* Open the BPD file */
+ if (!PM_findBPD(DLL_NAME,bpdpath))
+ return false;
+ strcpy(filename,bpdpath);
+ strcat(filename,DLL_NAME);
+ if ((hModBPD = PE_loadLibrary(filename,false)) == NULL)
+ return false;
+ if ((AGP_initLibrary = (AGP_initLibrary_t)PE_getProcAddress(hModBPD,"_AGP_initLibrary")) == NULL)
+ return false;
+ bpdpath[strlen(bpdpath)-1] = 0;
+ if (strcmp(bpdpath,PM_getNucleusPath()) == 0)
+ strcpy(bpdpath,PM_getNucleusConfigPath());
+ else {
+ PM_backslash(bpdpath);
+ strcat(bpdpath,"config");
+ }
+ if ((agpExp = AGP_initLibrary(bpdpath,filename,GA_getSystemPMImports(),&_N_imports,&_AGP_imports)) == NULL)
+ PM_fatalError("AGP_initLibrary failed!\n");
+ _AGP_exports.dwSize = sizeof(_AGP_exports);
+ max = sizeof(_AGP_exports)/sizeof(AGP_initLibrary_t);
+ for (i = 0,p = (ulong*)&_AGP_exports; i < max; i++)
+ *p++ = (ulong)_AGP_fatalErrorHandler;
+ memcpy(&_AGP_exports,agpExp,MIN(sizeof(_AGP_exports),agpExp->dwSize));
+ loaded = true;
+ return true;
+}
+
+/* The following are stub entry points that the application calls to
+ * initialise the Nucleus loader library, and we use this to load our
+ * driver DLL from disk and initialise the library using it.
+ */
+
+/* {secret} */
+int NAPI AGP_status(void)
+{
+ if (!loaded)
+ return nDriverNotFound;
+ return _AGP_exports.AGP_status();
+}
+
+/* {secret} */
+const char * NAPI AGP_errorMsg(
+ N_int32 status)
+{
+ if (!loaded)
+ return "Unable to load Nucleus device driver!";
+ return _AGP_exports.AGP_errorMsg(status);
+}
+
+/* {secret} */
+AGP_devCtx * NAPI AGP_loadDriver(N_int32 deviceIndex)
+{
+ if (!LoadDriver())
+ return NULL;
+ return _AGP_exports.AGP_loadDriver(deviceIndex);
+}
+
+/* {secret} */
+void NAPI AGP_unloadDriver(
+ AGP_devCtx *dc)
+{
+ if (loaded)
+ _AGP_exports.AGP_unloadDriver(dc);
+}
+
+/* {secret} */
+void NAPI AGP_getGlobalOptions(
+ AGP_globalOptions *options)
+{
+ if (LoadDriver())
+ _AGP_exports.AGP_getGlobalOptions(options);
+}
+
+/* {secret} */
+void NAPI AGP_setGlobalOptions(
+ AGP_globalOptions *options)
+{
+ if (LoadDriver())
+ _AGP_exports.AGP_setGlobalOptions(options);
+}
+
+/* {secret} */
+void NAPI AGP_saveGlobalOptions(
+ AGP_globalOptions *options)
+{
+ if (loaded)
+ _AGP_exports.AGP_saveGlobalOptions(options);
+}
+#endif
+
+/* {secret} */
+void NAPI _OS_delay8253(N_uint32 microSeconds);
+
+/****************************************************************************
+REMARKS:
+This function delays for the specified number of microseconds
+****************************************************************************/
+void NAPI _OS_delay(
+ N_uint32 microSeconds)
+{
+ static ibool inited = false;
+ static ibool haveRDTSC;
+ LZTimerObject tm;
+
+ if (!inited) {
+#ifndef __WIN32_VXD__
+ // This has been causing problems in VxD's for some reason, so for now
+ // we avoid using it.
+ if (_GA_haveCPUID() && (_GA_getCPUIDFeatures() & CPU_HaveRDTSC) != 0) {
+ ZTimerInit();
+ haveRDTSC = true;
+ }
+ else
+#endif
+ haveRDTSC = false;
+ inited = true;
+ }
+ if (haveRDTSC) {
+ LZTimerOnExt(&tm);
+ while (LZTimerLapExt(&tm) < microSeconds)
+ ;
+ LZTimerOnExt(&tm);
+ }
+ else
+ _OS_delay8253(microSeconds);
+}
+
diff --git a/board/MAI/bios_emulator/scitech/src/common/center.c b/board/MAI/bios_emulator/scitech/src/common/center.c
new file mode 100644
index 0000000000..7eb368fd3a
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/src/common/center.c
@@ -0,0 +1,123 @@
+/****************************************************************************
+*
+* Display Doctor Windows Interface Code
+*
+* ======================================================================
+* |REMOVAL OR MODIFICATION OF THIS HEADER IS STRICTLY PROHIBITED BY LAW|
+* | |
+* |This copyrighted computer code is a proprietary trade secret of |
+* |SciTech Software, Inc., located at 505 Wall Street, Chico, CA 95928 |
+* |USA (www.scitechsoft.com). ANY UNAUTHORIZED POSSESSION, USE, |
+* |VIEWING, COPYING, MODIFICATION OR DISSEMINATION OF THIS CODE IS |
+* |STRICTLY PROHIBITED BY LAW. Unless you have current, express |
+* |written authorization from SciTech to possess or use this code, you |
+* |may be subject to civil and/or criminal penalties. |
+* | |
+* |If you received this code in error or you would like to report |
+* |improper use, please immediately contact SciTech Software, Inc. at |
+* |530-894-8400. |
+* | |
+* |REMOVAL OR MODIFICATION OF THIS HEADER IS STRICTLY PROHIBITED BY LAW|
+* ======================================================================
+*
+* Language: C++ 3.0
+* Environment: Win16
+*
+* Description: Dialog driven configuration program for UniVBE and
+* WinDirect Professional products.
+*
+****************************************************************************/
+
+#include "center.h"
+
+/*------------------------------ Implementation ---------------------------*/
+
+void _EXPORT CenterWindow(HWND hWndCenter, HWND parent, BOOL repaint)
+/****************************************************************************
+*
+* Function: CenterWindow
+* Parameters: hWndCenter - Window to center
+* parent - Handle for parent window
+* repaint - true if window should be re-painted
+*
+* Description: Centers the specified window within the bounds of the
+* specified parent window. If the parent window is NULL, then
+* we center it using the Desktop window.
+*
+****************************************************************************/
+{
+ HWND hWndParent = (parent ? parent : GetDesktopWindow());
+ RECT RectParent;
+ RECT RectCenter;
+ int CenterX,CenterY,Height,Width;
+
+ GetWindowRect(hWndParent, &RectParent);
+ GetWindowRect(hWndCenter, &RectCenter);
+
+ Width = (RectCenter.right - RectCenter.left);
+ Height = (RectCenter.bottom - RectCenter.top);
+ CenterX = ((RectParent.right - RectParent.left) - Width) / 2;
+ CenterY = ((RectParent.bottom - RectParent.top) - Height) / 2;
+
+ if ((CenterX < 0) || (CenterY < 0)) {
+ /* The Center Window is smaller than the parent window. */
+ if (hWndParent != GetDesktopWindow()) {
+ /* If the parent window is not the desktop use the desktop size. */
+ CenterX = (GetSystemMetrics(SM_CXSCREEN) - Width) / 2;
+ CenterY = (GetSystemMetrics(SM_CYSCREEN) - Height) / 2;
+ }
+ CenterX = (CenterX < 0) ? 0: CenterX;
+ CenterY = (CenterY < 0) ? 0: CenterY;
+ }
+ else {
+ CenterX += RectParent.left;
+ CenterY += RectParent.top;
+ }
+
+ /* Copy the values into RectCenter */
+ RectCenter.left = CenterX;
+ RectCenter.right = CenterX + Width;
+ RectCenter.top = CenterY;
+ RectCenter.bottom = CenterY + Height;
+
+ /* Move the window to the new location */
+ MoveWindow(hWndCenter, RectCenter.left, RectCenter.top,
+ (RectCenter.right - RectCenter.left),
+ (RectCenter.bottom - RectCenter.top), repaint);
+}
+
+void _EXPORT CenterLogo(HWND hWndLogo, HWND hWndParent, int CenterY)
+/****************************************************************************
+*
+* Function: CenterLogo
+* Parameters: hWndLogo - Window to center
+* hWndParent - Handle for parent window
+* CenterY - Top coordinate for logo
+*
+* Description: Centers the specified window within the bounds of the
+* specified parent window in the horizontal direction only.
+*
+****************************************************************************/
+{
+ RECT RectParent;
+ RECT RectCenter;
+ int CenterX,Height,Width;
+
+ GetWindowRect(hWndParent, &RectParent);
+ GetWindowRect(hWndLogo, &RectCenter);
+ Width = (RectCenter.right - RectCenter.left);
+ Height = (RectCenter.bottom - RectCenter.top);
+ CenterX = ((RectParent.right - RectParent.left) - Width) / 2;
+
+ /* Copy the values into RectCenter */
+ RectCenter.left = CenterX;
+ RectCenter.right = CenterX + Width;
+ RectCenter.top = CenterY;
+ RectCenter.bottom = CenterY + Height;
+
+ /* Move the window to the new location */
+ MoveWindow(hWndLogo, RectCenter.left, RectCenter.top,
+ (RectCenter.right - RectCenter.left),
+ (RectCenter.bottom - RectCenter.top), false);
+}
+
diff --git a/board/MAI/bios_emulator/scitech/src/common/cmdline.c b/board/MAI/bios_emulator/scitech/src/common/cmdline.c
new file mode 100644
index 0000000000..872fae9194
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/src/common/cmdline.c
@@ -0,0 +1,428 @@
+/****************************************************************************
+*
+* ========================================================================
+*
+* 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: any
+*
+* Description: This module contains code to parse the command line,
+* extracting options and parameters in standard System V
+* style.
+*
+****************************************************************************/
+
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include "cmdline.h"
+
+/*------------------------- Global variables ------------------------------*/
+
+int nextargv = 1; /* Index into argv array */
+char *nextchar = NULL; /* Pointer to next character */
+
+/*-------------------------- Implementation -------------------------------*/
+
+#define IS_SWITCH_CHAR(c) ((c) == '-')
+#define IS_NOT_SWITCH_CHAR(c) ((c) != '-')
+
+/****************************************************************************
+DESCRIPTION:
+Parse the command line for specific options
+
+HEADER:
+cmdline.h
+
+PARAMETERS:
+argc - Value passed to program through argc variable
+argv - Pointer to the argv array passed to the program
+format - A string representing the expected format of the command line
+argument - Pointer to optional argument on command line
+
+RETURNS:
+Character code representing the next option parsed from the command line by
+getcmdopt. Returns ALLDONE (-1) when there are no more parameters to be parsed
+on the command line, PARAMETER (-2) when the argument being parsed is a
+parameter and not an option switch and lastly INVALID (-3) if an error
+occured while parsing the command line.
+
+REMARKS:
+Function to parse the command line option switches in UNIX System V style.
+When getcmdopt is called, it returns the character code of the next valid
+option that is parsed from the command line as specified by the Format
+string. The format string should be in the following form:
+
+ "abcd:e:f:"
+
+where a,b and c represent single switch style options and the character
+code returned by getcmdopt is the only value returned. Also d, e and f
+represent options that expect arguments immediately after them on the
+command line. The argument that follows the option on the command line is
+returned via a reference in the pointer argument. Thus a valid command line
+for this format string might be:
+
+ myprogram -adlines -b -f format infile outfile
+
+where a and b will be returned as single character options with no argument,
+while d is returned with the argument lines and f is returned with the
+argument format.
+
+When getcmdopt returns with PARAMETER (we attempted to parse a paramter, not
+an option), the global variable NextArgv will hold an index in the argv
+array to the argument on the command line AFTER the options, ie in the
+above example the string 'infile'. If the parameter is successfully used,
+NextArgv should be incremented and getcmdopt can be called again to parse any
+more options. Thus you can also have options interspersed throught the
+command line. eg:
+
+ myprogram -adlines infile -b outfile -f format
+
+can be made to be a valid form of the above command line.
+****************************************************************************/
+int getcmdopt(
+ int argc,
+ char **argv,
+ char *format,
+ char **argument)
+{
+ char ch;
+ char *formatchar;
+
+ if (argc > nextargv) {
+ if (nextchar == NULL) {
+ nextchar = argv[nextargv]; /* Index next argument */
+ if (nextchar == NULL) {
+ nextargv++;
+ return ALLDONE; /* No more options */
+ }
+ if (IS_NOT_SWITCH_CHAR(*nextchar)) {
+ nextchar = NULL;
+ return PARAMETER; /* We have a parameter */
+ }
+ nextchar++; /* Move past switch operator */
+ if (IS_SWITCH_CHAR(*nextchar)) {
+ nextchar = NULL;
+ return INVALID; /* Ignore rest of line */
+ }
+ }
+ if ((ch = *(nextchar++)) == 0) {
+ nextchar = NULL;
+ return INVALID; /* No options on line */
+ }
+
+ if (ch == ':' || (formatchar = strchr(format, ch)) == NULL)
+ return INVALID;
+
+ if (*(++formatchar) == ':') { /* Expect an argument after option */
+ nextargv++;
+ if (*nextchar == 0) {
+ if (argc <= nextargv)
+ return INVALID;
+ nextchar = argv[nextargv++];
+ }
+ *argument = nextchar;
+ nextchar = NULL;
+ }
+ else { /* We have a switch style option */
+ if (*nextchar == 0) {
+ nextargv++;
+ nextchar = NULL;
+ }
+ *argument = NULL;
+ }
+ return ch; /* return the option specifier */
+ }
+ nextchar = NULL;
+ nextargv++;
+ return ALLDONE; /* no arguments on command line */
+}
+
+/****************************************************************************
+PARAMETERS:
+optarr - Description for the option we are parsing
+argument - String to parse
+
+RETURNS:
+INVALID on error, ALLDONE on success.
+
+REMARKS:
+Parses the argument string depending on the type of argument that is
+expected, filling in the argument for that option. Note that to parse a
+string, we simply return a pointer to argument.
+****************************************************************************/
+static int parse_option(
+ Option *optarr,
+ char *argument)
+{
+ int num_read;
+
+ switch ((int)(optarr->type)) {
+ case OPT_INTEGER:
+ num_read = sscanf(argument,"%d",(int*)optarr->arg);
+ break;
+ case OPT_HEX:
+ num_read = sscanf(argument,"%x",(int*)optarr->arg);
+ break;
+ case OPT_OCTAL:
+ num_read = sscanf(argument,"%o",(int*)optarr->arg);
+ break;
+ case OPT_UNSIGNED:
+ num_read = sscanf(argument,"%u",(uint*)optarr->arg);
+ break;
+ case OPT_LINTEGER:
+ num_read = sscanf(argument,"%ld",(long*)optarr->arg);
+ break;
+ case OPT_LHEX:
+ num_read = sscanf(argument,"%lx",(long*)optarr->arg);
+ break;
+ case OPT_LOCTAL:
+ num_read = sscanf(argument,"%lo",(long*)optarr->arg);
+ break;
+ case OPT_LUNSIGNED:
+ num_read = sscanf(argument,"%lu",(ulong*)optarr->arg);
+ break;
+ case OPT_FLOAT:
+ num_read = sscanf(argument,"%f",(float*)optarr->arg);
+ break;
+ case OPT_DOUBLE:
+ num_read = sscanf(argument,"%lf",(double*)optarr->arg);
+ break;
+ case OPT_LDOUBLE:
+ num_read = sscanf(argument,"%Lf",(long double*)optarr->arg);
+ break;
+ case OPT_STRING:
+ num_read = 1; /* This always works */
+ *((char**)optarr->arg) = argument;
+ break;
+ default:
+ return INVALID;
+ }
+
+ if (num_read == 0)
+ return INVALID;
+ else
+ return ALLDONE;
+}
+
+/****************************************************************************
+HEADER:
+cmdline.h
+
+PARAMETERS:
+argc - Number of arguments on command line
+argv - Array of command line arguments
+num_opt - Number of options in option array
+optarr - Array to specify how to parse the command line
+do_param - Routine to handle a command line parameter
+
+RETURNS:
+ALLDONE, INVALID or HELP
+
+REMARKS:
+Function to parse the command line according to a table of options. This
+routine calls getcmdopt above to parse each individual option and attempts
+to parse each option into a variable of the specified type. The routine
+can parse integers and long integers in either decimal, octal, hexadecimal
+notation, unsigned integers and unsigned longs, strings and option switches.
+Option switches are simply boolean variables that get turned on if the
+switch was parsed.
+
+Parameters are extracted from the command line by calling a user supplied
+routine do_param() to handle each parameter as it is encountered. The
+routine do_param() should accept a pointer to the parameter on the command
+line and an integer representing how many parameters have been encountered
+(ie: 1 if this is the first parameter, 10 if it is the 10th etc), and return
+ALLDONE upon successfully parsing it or INVALID if the parameter was invalid.
+
+We return either ALLDONE if all the options were successfully parsed,
+INVALID if an invalid option was encountered or HELP if any of -h, -H or
+-? were present on the command line.
+****************************************************************************/
+int getargs(
+ int argc,
+ char *argv[],
+ int num_opt,
+ Option optarr[],
+ int (*do_param)(
+ char *param,
+ int num))
+{
+ int i,opt;
+ char *argument;
+ int param_num = 1;
+ char cmdstr[MAXARG*2 + 4];
+
+ /* Build the command string from the array of options */
+
+ strcpy(cmdstr,"hH?");
+ for (i = 0,opt = 3; i < num_opt; i++,opt++) {
+ cmdstr[opt] = optarr[i].opt;
+ if (optarr[i].type != OPT_SWITCH) {
+ cmdstr[++opt] = ':';
+ }
+ }
+ cmdstr[opt] = '\0';
+
+ for (;;) {
+ opt = getcmdopt(argc,argv,cmdstr,&argument);
+ switch (opt) {
+ case 'H':
+ case 'h':
+ case '?':
+ return HELP;
+ case ALLDONE:
+ return ALLDONE;
+ case INVALID:
+ return INVALID;
+ case PARAMETER:
+ if (do_param == NULL)
+ return INVALID;
+ if (do_param(argv[nextargv],param_num) == INVALID)
+ return INVALID;
+ nextargv++;
+ param_num++;
+ break;
+ default:
+
+ /* Search for the option in the option array. We are
+ * guaranteed to find it.
+ */
+
+ for (i = 0; i < num_opt; i++) {
+ if (optarr[i].opt == opt)
+ break;
+ }
+ if (optarr[i].type == OPT_SWITCH)
+ *((ibool*)optarr[i].arg) = true;
+ else {
+ if (parse_option(&optarr[i],argument) == INVALID)
+ return INVALID;
+ }
+ break;
+ }
+ }
+}
+
+/****************************************************************************
+HEADER:
+cmdline.h
+
+PARAMETERS:
+num_opt - Number of options in the table
+optarr - Table of option descriptions
+
+REMARKS:
+Prints the description of each option in a standard format to the standard
+output device. The description for each option is obtained from the table
+of options.
+****************************************************************************/
+void print_desc(
+ int num_opt,
+ Option optarr[])
+{
+ int i;
+
+ for (i = 0; i < num_opt; i++) {
+ if (optarr[i].type == OPT_SWITCH)
+ printf(" -%c %s\n",optarr[i].opt,optarr[i].desc);
+ else
+ printf(" -%c<arg> %s\n",optarr[i].opt,optarr[i].desc);
+ }
+}
+
+/****************************************************************************
+HEADER:
+cmdline.h
+
+PARAMETERS:
+moduleName - Module name for program
+cmdLine - Command line to parse
+pargc - Pointer to 'argc' parameter
+pargv - Pointer to 'argv' parameter
+maxArgc - Maximum argv array index
+
+REMARKS:
+Parses a command line from a single string into the C style 'argc' and
+'argv' format. Most useful for Windows programs where the command line
+is passed in verbatim.
+****************************************************************************/
+int parse_commandline(
+ char *moduleName,
+ char *cmdLine,
+ int *pargc,
+ char *argv[],
+ int maxArgv)
+{
+ static char str[512];
+ static char filename[260];
+ char *prevWord = NULL;
+ ibool inQuote = FALSE;
+ ibool noStrip = FALSE;
+ int argc;
+
+ argc = 0;
+ strcpy(filename,moduleName);
+ argv[argc++] = filename;
+ cmdLine = strncpy(str, cmdLine, sizeof(str)-1);
+ while (*cmdLine) {
+ switch (*cmdLine) {
+ case '"' :
+ if (prevWord != NULL) {
+ if (inQuote) {
+ if (!noStrip)
+ *cmdLine = '\0';
+ argv [argc++] = prevWord;
+ prevWord = NULL;
+ }
+ else
+ noStrip = TRUE;
+ }
+ inQuote = !inQuote;
+ break;
+ case ' ' :
+ case '\t' :
+ if (!inQuote) {
+ if (prevWord != NULL) {
+ *cmdLine = '\0';
+ argv [argc++] = prevWord;
+ prevWord = NULL;
+ noStrip = FALSE;
+ }
+ }
+ break;
+ default :
+ if (prevWord == NULL)
+ prevWord = cmdLine;
+ break;
+ }
+ if (argc >= maxArgv - 1)
+ break;
+ cmdLine++;
+ }
+
+ if ((prevWord != NULL || (inQuote && prevWord != NULL)) && argc < maxArgv - 1) {
+ *cmdLine = '\0';
+ argv [argc++] = prevWord;
+ }
+ argv[argc] = NULL;
+
+ /* Return updated parameters */
+ return (*pargc = argc);
+}
diff --git a/board/MAI/bios_emulator/scitech/src/common/gabeos.c b/board/MAI/bios_emulator/scitech/src/common/gabeos.c
new file mode 100644
index 0000000000..1d8a543216
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/src/common/gabeos.c
@@ -0,0 +1,146 @@
+/****************************************************************************
+*
+* 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: Linux
+*
+* Description: OS specific Nucleus Graphics Architecture services for
+* the Linux operating system.
+*
+****************************************************************************/
+
+#include "nucleus/graphics.h"
+#include <sys/time.h>
+
+static ibool haveRDTSC;
+
+/*-------------------------- Implementation -------------------------------*/
+
+/****************************************************************************
+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:
+In order to support deploying new Nucleus drivers that may require updated
+PM library functions, we check here to see if there is a system wide version
+of the PM functions available. If so we return those functions for use with
+the system wide Nucleus drivers, otherwise the compiled in version of the PM
+library is used with the application local version of Nucleus.
+****************************************************************************/
+PM_imports * NAPI GA_getSystemPMImports(void)
+{
+ // TODO: We may very well want to provide a system shared library
+ // that eports the PM functions required by the Nucleus library
+ // for BeOS here. That will eliminate fatal errors loading new
+ // drivers on BeOS!
+ return &_PM_imports;
+}
+
+/****************************************************************************
+REMARKS:
+Nothing special for this OS.
+****************************************************************************/
+ibool NAPI GA_getSharedExports(
+ GA_exports *gaExp,
+ ibool shared)
+{
+ (void)gaExp;
+ (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 {
+ struct timeval t;
+ gettimeofday(&t, NULL);
+ value->low = t.tv_sec*1000000 + t.tv_usec;
+ value->high = 0;
+ }
+}
diff --git a/board/MAI/bios_emulator/scitech/src/common/gados.c b/board/MAI/bios_emulator/scitech/src/common/gados.c
new file mode 100644
index 0000000000..4c90e805d7
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/src/common/gados.c
@@ -0,0 +1,136 @@
+/****************************************************************************
+*
+* 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: MSDOS
+*
+* Description: OS specific Nucleus Graphics Architecture services for
+* the MSDOS operating system.
+*
+****************************************************************************/
+
+#include "pm_help.h"
+#include "pmapi.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+/*-------------------------- Implementation -------------------------------*/
+
+/****************************************************************************
+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:
+Nothing to do here for DOS. Basically since DOS has no system wide shared
+library mechanism we are essentially screwed if the binary API changes.
+By default for 32-bit DOS apps the local Nucleus drivers should always be
+used in preference to the system wide Nucleus drivers.
+****************************************************************************/
+PM_imports * NAPI GA_getSystemPMImports(void)
+{
+ return &_PM_imports;
+}
+
+/****************************************************************************
+REMARKS:
+Nothing special for this OS.
+****************************************************************************/
+ibool NAPI GA_getSharedExports(
+ GA_exports *gaExp,
+ ibool shared)
+{
+ (void)gaExp;
+ (void)shared;
+ return false;
+}
+
+#if !defined(TEST_HARNESS) && !defined(VBETEST)
+/****************************************************************************
+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 DOS
+Nucleus loader library.
+****************************************************************************/
+ibool NAPI GA_TimerInit(void)
+{
+ if (_GA_haveCPUID() && (_GA_getCPUIDFeatures() & CPU_HaveRDTSC) != 0)
+ return true;
+ return false;
+}
+
+/****************************************************************************
+REMARKS:
+This function reads the high resolution timer.
+****************************************************************************/
+void NAPI GA_TimerRead(
+ GA_largeInteger *value)
+{
+ _GA_readTimeStamp(value);
+}
+
diff --git a/board/MAI/bios_emulator/scitech/src/common/galib.c b/board/MAI/bios_emulator/scitech/src/common/galib.c
new file mode 100644
index 0000000000..7c1fbe312d
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/src/common/galib.c
@@ -0,0 +1,269 @@
+/****************************************************************************
+*
+* 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: Any 32-bit protected mode environment
+*
+* Description: C module for the Graphics Accelerator Driver API. Uses
+* the SciTech PM library for interfacing with DOS
+* extender specific functions.
+*
+****************************************************************************/
+
+#include "nucleus/graphics.h"
+#if defined(__WIN32_VXD__) || defined(__NT_DRIVER__)
+#include "sdd/sddhelp.h"
+#else
+#include <stdio.h>
+#include <stdlib.h>
+#endif
+
+/*---------------------------- Global Variables ---------------------------*/
+
+#ifndef TEST_HARNESS
+GA_exports _VARAPI __GA_exports;
+static int loaded = false;
+static PE_MODULE *hModBPD = NULL;
+
+static N_imports _N_imports = {
+ sizeof(N_imports),
+ _OS_delay,
+ };
+
+static GA_imports _GA_imports = {
+ sizeof(GA_imports),
+ GA_getSharedInfo,
+ GA_TimerInit,
+ GA_TimerRead,
+ GA_TimerDifference,
+ };
+#endif
+
+/*----------------------------- Implementation ----------------------------*/
+
+#define DLL_NAME "graphics.bpd"
+
+/****************************************************************************
+REMARKS:
+This function is no longer used but we must implement it and return NULL
+for compatibility with older binary drivers.
+****************************************************************************/
+GA_sharedInfo * NAPI GA_getSharedInfo(
+ int device)
+{
+ return NULL;
+}
+
+#ifndef TEST_HARNESS
+/****************************************************************************
+REMARKS:
+Fatal error handler for non-exported GA_exports.
+****************************************************************************/
+static void _GA_fatalErrorHandler(void)
+{
+ PM_fatalError("Unsupported Nucleus export function called! Please upgrade your copy of Nucleus!\n");
+}
+
+/****************************************************************************
+PARAMETERS:
+shared - True to load the driver into shared memory.
+
+REMARKS:
+Loads the Nucleus binary portable DLL into memory and initilises it.
+****************************************************************************/
+static ibool LoadDriver(
+ ibool shared)
+{
+ GA_initLibrary_t GA_initLibrary;
+ GA_exports *gaExp;
+ char filename[PM_MAX_PATH];
+ char bpdpath[PM_MAX_PATH];
+ int i,max;
+ ulong *p;
+
+ /* Check if we have already loaded the driver */
+ if (loaded)
+ return true;
+ PM_init();
+
+ /* First try to see if we can find the system wide shared exports
+ * if they are available. Under OS/2 this connects to our global
+ * shared Nucleus loader in SDDPMI.DLL.
+ */
+ __GA_exports.dwSize = sizeof(__GA_exports);
+ if (GA_getSharedExports(&__GA_exports,shared))
+ return loaded = true;
+
+ /* Open the BPD file */
+ if (!PM_findBPD(DLL_NAME,bpdpath))
+ return false;
+ strcpy(filename,bpdpath);
+ strcat(filename,DLL_NAME);
+ if ((hModBPD = PE_loadLibrary(filename,shared)) == NULL)
+ return false;
+ if ((GA_initLibrary = (GA_initLibrary_t)PE_getProcAddress(hModBPD,"_GA_initLibrary")) == NULL)
+ return false;
+ bpdpath[strlen(bpdpath)-1] = 0;
+ if (strcmp(bpdpath,PM_getNucleusPath()) == 0)
+ strcpy(bpdpath,PM_getNucleusConfigPath());
+ else {
+ PM_backslash(bpdpath);
+ strcat(bpdpath,"config");
+ }
+ if ((gaExp = GA_initLibrary(shared,bpdpath,filename,GA_getSystemPMImports(),&_N_imports,&_GA_imports)) == NULL)
+ PM_fatalError("GA_initLibrary failed!\n");
+
+ /* Initialize all default imports to point to fatal error handler
+ * for upwards compatibility, and copy the exported functions.
+ */
+ max = sizeof(__GA_exports)/sizeof(GA_initLibrary_t);
+ for (i = 0,p = (ulong*)&__GA_exports; i < max; i++)
+ *p++ = (ulong)_GA_fatalErrorHandler;
+ memcpy(&__GA_exports,gaExp,MIN(sizeof(__GA_exports),gaExp->dwSize));
+ loaded = true;
+ return true;
+}
+
+/* The following are stub entry points that the application calls to
+ * initialise the Nucleus loader library, and we use this to load our
+ * driver DLL from disk and initialise the library using it.
+ */
+
+/* {secret} */
+int NAPI GA_status(void)
+{
+ if (!loaded)
+ return nDriverNotFound;
+ return __GA_exports.GA_status();
+}
+
+/* {secret} */
+const char * NAPI GA_errorMsg(
+ N_int32 status)
+{
+ if (!loaded)
+ return "Unable to load Nucleus device driver!";
+ return __GA_exports.GA_errorMsg(status);
+}
+
+/* {secret} */
+int NAPI GA_getDaysLeft(N_int32 shared)
+{
+ if (!LoadDriver(shared))
+ return -1;
+ return __GA_exports.GA_getDaysLeft(shared);
+}
+
+/* {secret} */
+int NAPI GA_registerLicense(uchar *license,N_int32 shared)
+{
+ if (!LoadDriver(shared))
+ return 0;
+ return __GA_exports.GA_registerLicense(license,shared);
+}
+
+/* {secret} */
+ibool NAPI GA_loadInGUI(N_int32 shared)
+{
+ if (!LoadDriver(shared))
+ return false;
+ return __GA_exports.GA_loadInGUI(shared);
+}
+
+/* {secret} */
+int NAPI GA_enumerateDevices(N_int32 shared)
+{
+ if (!LoadDriver(shared))
+ return 0;
+ return __GA_exports.GA_enumerateDevices(shared);
+}
+
+/* {secret} */
+GA_devCtx * NAPI GA_loadDriver(N_int32 deviceIndex,N_int32 shared)
+{
+ if (!LoadDriver(shared))
+ return NULL;
+ return __GA_exports.GA_loadDriver(deviceIndex,shared);
+}
+
+/* {secret} */
+void NAPI GA_getGlobalOptions(
+ GA_globalOptions *options,
+ ibool shared)
+{
+ if (LoadDriver(shared))
+ __GA_exports.GA_getGlobalOptions(options,shared);
+}
+
+/* {secret} */
+PE_MODULE * NAPI GA_loadLibrary(
+ const char *szBPDName,
+ ulong *size,
+ ibool shared)
+{
+ if (!LoadDriver(shared))
+ return NULL;
+ return __GA_exports.GA_loadLibrary(szBPDName,size,shared);
+}
+
+/* {secret} */
+GA_devCtx * NAPI GA_getCurrentDriver(
+ N_int32 deviceIndex)
+{
+ /* Bail for older drivers that didn't export this function! */
+ if (!__GA_exports.GA_getCurrentDriver)
+ return NULL;
+ return __GA_exports.GA_getCurrentDriver(deviceIndex);
+}
+
+/* {secret} */
+REF2D_driver * NAPI GA_getCurrentRef2d(
+ N_int32 deviceIndex)
+{
+ /* Bail for older drivers that didn't export this function! */
+ if (!__GA_exports.GA_getCurrentRef2d)
+ return NULL;
+ return __GA_exports.GA_getCurrentRef2d(deviceIndex);
+}
+
+/* {secret} */
+int NAPI GA_isOEMVersion(ibool shared)
+{
+ if (!LoadDriver(shared))
+ return 0;
+ return __GA_exports.GA_isOEMVersion(shared);
+}
+
+/* {secret} */
+N_uint32 * NAPI GA_getLicensedDevices(ibool shared)
+{
+ if (!LoadDriver(shared))
+ return 0;
+ return __GA_exports.GA_getLicensedDevices(shared);
+}
+#endif
+
diff --git a/board/MAI/bios_emulator/scitech/src/common/galinux.c b/board/MAI/bios_emulator/scitech/src/common/galinux.c
new file mode 100644
index 0000000000..cbd9d7f4e5
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/src/common/galinux.c
@@ -0,0 +1,148 @@
+/****************************************************************************
+*
+* 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: Linux
+*
+* Description: OS specific Nucleus Graphics Architecture services for
+* the Linux operating system.
+*
+****************************************************************************/
+
+#include "nucleus/graphics.h"
+#include <sys/time.h>
+
+/*---------------------------- Global Variables ---------------------------*/
+
+static ibool haveRDTSC;
+
+/*-------------------------- Implementation -------------------------------*/
+
+/****************************************************************************
+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:
+In order to support deploying new Nucleus drivers that may require updated
+PM library functions, we check here to see if there is a system wide version
+of the PM functions available. If so we return those functions for use with
+the system wide Nucleus drivers, otherwise the compiled in version of the PM
+library is used with the application local version of Nucleus.
+****************************************************************************/
+PM_imports * NAPI GA_getSystemPMImports(void)
+{
+ // TODO: We may very well want to provide a system shared library
+ // that eports the PM functions required by the Nucleus library
+ // for Linux here. That will eliminate fatal errors loading new
+ // drivers on Linux!
+ return &_PM_imports;
+}
+
+/****************************************************************************
+REMARKS:
+Nothing special for this OS.
+****************************************************************************/
+ibool NAPI GA_getSharedExports(
+ GA_exports *gaExp,
+ ibool shared)
+{
+ (void)gaExp;
+ (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 {
+ struct timeval t;
+ gettimeofday(&t, NULL);
+ value->low = t.tv_sec*1000000 + t.tv_usec;
+ value->high = 0;
+ }
+}
diff --git a/board/MAI/bios_emulator/scitech/src/common/gantdrv.c b/board/MAI/bios_emulator/scitech/src/common/gantdrv.c
new file mode 100644
index 0000000000..d9944c56ae
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/src/common/gantdrv.c
@@ -0,0 +1,137 @@
+/****************************************************************************
+*
+* 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: NT device driver
+*
+* Description: OS specific Nucleus Graphics Architecture services for
+* the NT device drivers.
+*
+****************************************************************************/
+
+#include "sdd/sddhelp.h"
+
+/*------------------------- Global Variables ------------------------------*/
+
+static ibool haveRDTSC;
+
+/*-------------------------- Implementation -------------------------------*/
+
+/****************************************************************************
+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:
+Nothing special for this OS.
+****************************************************************************/
+PM_imports * NAPI GA_getSystemPMImports(void)
+{
+ return &_PM_imports;
+}
+
+/****************************************************************************
+REMARKS:
+Nothing special for this OS.
+****************************************************************************/
+ibool NAPI GA_getSharedExports(
+ GA_exports *gaExp,
+ ibool shared)
+{
+ (void)gaExp;
+ (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
+ KeQuerySystemTime((LARGE_INTEGER*)value);
+}
+
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 0000000000..822e93ca61
--- /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
diff --git a/board/MAI/bios_emulator/scitech/src/common/gaqnx.c b/board/MAI/bios_emulator/scitech/src/common/gaqnx.c
new file mode 100644
index 0000000000..0846cccef0
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/src/common/gaqnx.c
@@ -0,0 +1,149 @@
+/****************************************************************************
+*
+* 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: QNX
+*
+* Description: OS specific Nucleus Graphics Architecture services for
+* the QNX operating system.
+*
+****************************************************************************/
+
+#include "nucleus/graphics.h"
+#include <time.h>
+
+/*---------------------------- Global Variables ---------------------------*/
+
+static ibool haveRDTSC;
+
+/*-------------------------- Implementation -------------------------------*/
+
+/****************************************************************************
+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:
+In order to support deploying new Nucleus drivers that may require updated
+PM library functions, we check here to see if there is a system wide version
+of the PM functions available. If so we return those functions for use with
+the system wide Nucleus drivers, otherwise the compiled in version of the PM
+library is used with the application local version of Nucleus.
+****************************************************************************/
+PM_imports * NAPI GA_getSystemPMImports(void)
+{
+ // TODO: We may very well want to provide a system shared library
+ // that eports the PM functions required by the Nucleus library
+ // for QNX here. That will eliminate fatal errors loading new
+ // drivers on QNX!
+ return &_PM_imports;
+}
+
+/****************************************************************************
+REMARKS:
+Nothing special for this OS.
+****************************************************************************/
+ibool NAPI GA_getSharedExports(
+ GA_exports *gaExp,
+ ibool shared)
+{
+ (void)gaExp;
+ (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 {
+ struct timespec ts;
+
+ clock_gettime(CLOCK_REALTIME, &ts);
+ value->low = (ts.tv_nsec / 1000 + ts.tv_sec * 1000000);
+ value->high = 0;
+ }
+}
diff --git a/board/MAI/bios_emulator/scitech/src/common/gartt.c b/board/MAI/bios_emulator/scitech/src/common/gartt.c
new file mode 100644
index 0000000000..003e1e7dbe
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/src/common/gartt.c
@@ -0,0 +1,139 @@
+/****************************************************************************
+*
+* 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: RTTarget-32
+*
+* Description: OS specific Nucleus Graphics Architecture services for
+* the RTTarget-32 operating system environments.
+*
+****************************************************************************/
+
+#include "nucleus/graphics.h"
+
+/*------------------------- Global Variables ------------------------------*/
+
+static ibool haveRDTSC;
+
+/*-------------------------- Implementation -------------------------------*/
+
+/****************************************************************************
+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:
+In order to support deploying new Nucleus drivers that may require updated
+PM library functions, we check here to see if there is a system wide version
+of the PM functions available. If so we return those functions for use with
+the system wide Nucleus drivers, otherwise the compiled in version of the PM
+library is used with the application local version of Nucleus.
+****************************************************************************/
+PM_imports * NAPI GA_getSystemPMImports(void)
+{
+ return &_PM_imports;
+}
+
+/****************************************************************************
+REMARKS:
+Nothing special for this OS.
+****************************************************************************/
+ibool NAPI GA_getSharedExports(
+ GA_exports *gaExp,
+ ibool shared)
+{
+ (void)gaExp;
+ (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;
+ }
+ return false;
+}
+
+/****************************************************************************
+REMARKS:
+This function reads the high resolution timer.
+****************************************************************************/
+void NAPI GA_TimerRead(
+ GA_largeInteger *value)
+{
+ if (haveRDTSC)
+ _GA_readTimeStamp(value);
+}
diff --git a/board/MAI/bios_emulator/scitech/src/common/gasmx.c b/board/MAI/bios_emulator/scitech/src/common/gasmx.c
new file mode 100644
index 0000000000..62e68dc13e
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/src/common/gasmx.c
@@ -0,0 +1,133 @@
+/****************************************************************************
+*
+* 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: smx32
+*
+* Description: OS specific Nucleus Graphics Architecture services for
+* the smx32 platform -- no vxD support.
+*
+****************************************************************************/
+
+#include "pmapi.h"
+#include "nucleus/graphics.h"
+
+/*-------------------------- Implementation -------------------------------*/
+
+/****************************************************************************
+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:
+In order to support deploying new Nucleus drivers that may require updated
+PM library functions, we check here to see if there is a system wide version
+of the PM functions available. If so we return those functions for use with
+the system wide Nucleus drivers, otherwise the compiled in version of the PM
+library is used with the application local version of Nucleus.
+****************************************************************************/
+PM_imports * NAPI GA_getSystemPMImports(void)
+{
+ return &_PM_imports;
+}
+
+/****************************************************************************
+REMARKS:
+Nothing special for this OS.
+****************************************************************************/
+ibool NAPI GA_getSharedExports(
+ GA_exports *gaExp,
+ ibool shared)
+{
+ (void)gaExp;
+ (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)
+ return true;
+ return false;
+}
+
+/****************************************************************************
+REMARKS:
+This function reads the high resolution timer.
+****************************************************************************/
+void NAPI GA_TimerRead(
+ GA_largeInteger *value)
+{
+ _GA_readTimeStamp(value);
+}
diff --git a/board/MAI/bios_emulator/scitech/src/common/gavxd.c b/board/MAI/bios_emulator/scitech/src/common/gavxd.c
new file mode 100644
index 0000000000..62173cc8d0
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/src/common/gavxd.c
@@ -0,0 +1,137 @@
+/****************************************************************************
+*
+* 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: Win32 VxD
+*
+* Description: OS specific Nucleus Graphics Architecture services for
+* the Win32 VxD's.
+*
+****************************************************************************/
+
+#include "sdd/sddhelp.h"
+
+/*------------------------- Global Variables ------------------------------*/
+
+static ibool haveRDTSC;
+
+/*-------------------------- Implementation -------------------------------*/
+
+/****************************************************************************
+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:
+Nothing special for this OS.
+****************************************************************************/
+PM_imports * NAPI GA_getSystemPMImports(void)
+{
+ return &_PM_imports;
+}
+
+/****************************************************************************
+REMARKS:
+Nothing special for this OS.
+****************************************************************************/
+ibool NAPI GA_getSharedExports(
+ GA_exports *gaExp,
+ ibool shared)
+{
+ (void)gaExp;
+ (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
+ VTD_Get_Real_Time(&value->high,&value->low);
+}
+
diff --git a/board/MAI/bios_emulator/scitech/src/common/gawin32.c b/board/MAI/bios_emulator/scitech/src/common/gawin32.c
new file mode 100644
index 0000000000..a2a4150953
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/src/common/gawin32.c
@@ -0,0 +1,256 @@
+/****************************************************************************
+*
+* 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: Win32
+*
+* Description: OS specific Nucleus Graphics Architecture services for
+* the Win32 operating system environments.
+*
+****************************************************************************/
+
+#include "pm_help.h"
+#include "pmapi.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#define STRICT
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+
+/*------------------------- Global Variables ------------------------------*/
+
+#define DLL_NAME "nga_w32.dll"
+
+extern HANDLE _PM_hDevice;
+static HMODULE hModDLL = NULL;
+static ibool useRing0Driver = false;
+static ibool haveRDTSC;
+static GA_largeInteger countFreq;
+
+/*-------------------------- Implementation -------------------------------*/
+
+/****************************************************************************
+REMARKS:
+Loads the shared "nga_w32.dll" library from disk and connects to it. This
+library is *always* located in the same directory as the Nucleus
+graphics.bpd file.
+****************************************************************************/
+static ibool LoadSharedDLL(void)
+{
+ char filename[PM_MAX_PATH];
+ char bpdpath[PM_MAX_PATH];
+
+ /* Check if we have already loaded the DLL */
+ if (hModDLL)
+ return true;
+ PM_init();
+
+ /* Open the DLL file */
+ if (!PM_findBPD(DLL_NAME,bpdpath))
+ return false;
+ strcpy(filename,bpdpath);
+ strcat(filename,DLL_NAME);
+ if ((hModDLL = LoadLibrary(filename)) == NULL)
+ return false;
+ return true;
+}
+
+/****************************************************************************
+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.
+
+Note that for Win32 we also call into the loaded PMHELP device driver
+as necessary to change the local Nucleus path for system wide Nucleus
+drivers.
+****************************************************************************/
+void NAPI GA_setLocalPath(
+ const char *path)
+{
+ DWORD inBuf[1];
+ DWORD outBuf[1],outCnt;
+
+ PM_setLocalBPDPath(path);
+ if (_PM_hDevice != INVALID_HANDLE_VALUE) {
+ inBuf[0] = (DWORD)path;
+ DeviceIoControl(_PM_hDevice, PMHELP_GASETLOCALPATH32,
+ inBuf, sizeof(inBuf), outBuf, sizeof(outBuf), &outCnt, NULL);
+ }
+}
+
+/****************************************************************************
+RETURNS:
+Pointer to the system wide PM library imports, or the internal version if none
+
+REMARKS:
+In order to support deploying new Nucleus drivers that may require updated
+PM library functions, we check here to see if there is a system wide version
+of the PM functions available. If so we return those functions for use with
+the system wide Nucleus drivers, otherwise the compiled in version of the PM
+library is used with the application local version of Nucleus.
+****************************************************************************/
+PM_imports * NAPI GA_getSystemPMImports(void)
+{
+ PM_imports * pmImp;
+ PM_imports * (NAPIP _GA_getSystemPMImports)(void);
+
+ if (LoadSharedDLL()) {
+ /* Note that Visual C++ build DLL's with only a single underscore in front
+ * of the exported name while Watcom C provides two of them. We check for
+ * both to allow working with either compiled DLL.
+ */
+ if ((_GA_getSystemPMImports = (void*)GetProcAddress(hModDLL,"_GA_getSystemPMImports")) != NULL) {
+ if ((_GA_getSystemPMImports = (void*)GetProcAddress(hModDLL,"__GA_getSystemPMImports")) != NULL) {
+ pmImp = _GA_getSystemPMImports();
+ memcpy(&_PM_imports,pmImp,MIN(_PM_imports.dwSize,pmImp->dwSize));
+ return pmImp;
+ }
+ }
+ }
+ return &_PM_imports;
+}
+
+/****************************************************************************
+PARAMETERS:
+gaExp - Place to store the exported functions
+shared - True if connecting to the shared, global Nucleus driver
+
+REMARKS:
+For Win32 if we are connecting to the shared, global Nucleus driver (loaded
+at ring 0) then we need to load a special nga_w32.dll library which contains
+thunks to call down into the Ring 0 device driver as necessary. If we are
+connecting to the application local Nucleus drivers (ie: Nucleus on DirectDraw
+emulation layer) then we do nothing here.
+****************************************************************************/
+ibool NAPI GA_getSharedExports(
+ GA_exports *gaExp,
+ ibool shared)
+{
+ GA_exports * exp;
+ GA_exports * (NAPIP _GA_getSystemGAExports)(void);
+
+ useRing0Driver = false;
+ if (shared) {
+ if (!LoadSharedDLL())
+ PM_fatalError("Unable to load " DLL_NAME "!");
+ if ((_GA_getSystemGAExports = (void*)GetProcAddress(hModDLL,"_GA_getSystemGAExports")) == NULL)
+ if ((_GA_getSystemGAExports = (void*)GetProcAddress(hModDLL,"__GA_getSystemGAExports")) == NULL)
+ PM_fatalError("Unable to load " DLL_NAME "!");
+ exp = _GA_getSystemGAExports();
+ memcpy(gaExp,exp,MIN(gaExp->dwSize,exp->dwSize));
+ useRing0Driver = true;
+ return true;
+ }
+ return false;
+}
+
+#ifndef TEST_HARNESS
+/****************************************************************************
+REMARKS:
+Nothing special for this OS
+****************************************************************************/
+ibool NAPI GA_queryFunctions(
+ GA_devCtx *dc,
+ N_uint32 id,
+ void _FAR_ *funcs)
+{
+ static ibool (NAPIP _GA_queryFunctions)(GA_devCtx *dc,N_uint32 id,void _FAR_ *funcs) = NULL;
+
+ if (useRing0Driver) {
+ // Call the version in nga_w32.dll if it is loaded
+ if (!_GA_queryFunctions) {
+ if ((_GA_queryFunctions = (void*)GetProcAddress(hModDLL,"_GA_queryFunctions")) == NULL)
+ if ((_GA_queryFunctions = (void*)GetProcAddress(hModDLL,"__GA_queryFunctions")) == NULL)
+ PM_fatalError("Unable to get exports from " DLL_NAME "!");
+ }
+ return _GA_queryFunctions(dc,id,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)
+{
+ static ibool (NAPIP _REF2D_queryFunctions)(REF2D_driver *ref2d,N_uint32 id,void _FAR_ *funcs) = NULL;
+
+ if (useRing0Driver) {
+ // Call the version in nga_w32.dll if it is loaded
+ if (!_REF2D_queryFunctions) {
+ if ((_REF2D_queryFunctions = (void*)GetProcAddress(hModDLL,"_REF2D_queryFunctions")) == NULL)
+ if ((_REF2D_queryFunctions = (void*)GetProcAddress(hModDLL,"__REF2D_queryFunctions")) == NULL)
+ PM_fatalError("Unable to get exports from " DLL_NAME "!");
+ }
+ return _REF2D_queryFunctions(ref2d,id,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;
+ }
+ else if (QueryPerformanceFrequency((LARGE_INTEGER*)&countFreq)) {
+ haveRDTSC = false;
+ return true;
+ }
+ return false;
+}
+
+/****************************************************************************
+REMARKS:
+This function reads the high resolution timer.
+****************************************************************************/
+void NAPI GA_TimerRead(
+ GA_largeInteger *value)
+{
+ if (haveRDTSC)
+ _GA_readTimeStamp(value);
+ else
+ QueryPerformanceCounter((LARGE_INTEGER*)value);
+}
+
diff --git a/board/MAI/bios_emulator/scitech/src/common/gtfcalc.c b/board/MAI/bios_emulator/scitech/src/common/gtfcalc.c
new file mode 100644
index 0000000000..5a03ac5885
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/src/common/gtfcalc.c
@@ -0,0 +1,436 @@
+/****************************************************************************
+*
+* VESA Generalized Timing Formula (GTF)
+* Version 1.1
+*
+* ========================================================================
+*
+* 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.
+*
+* ========================================================================
+*
+* Developed by: SciTech Software, Inc.
+*
+* Language: ANSI C
+* Environment: Any.
+*
+* Description: C module for generating GTF compatible timings given a set
+* of input requirements. Translated from the original GTF
+* 1.14 spreadsheet definition.
+*
+* Compile with #define TESTING to build a command line test
+* program.
+*
+* NOTE: The code in here has been written for clarity and
+* to follow the original GTF spec as closely as
+* possible.
+*
+****************************************************************************/
+
+#include "gtf.h"
+#ifndef __WIN32_VXD__
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <math.h>
+#endif
+
+/*------------------------- Global Variables ------------------------------*/
+
+static GTF_constants GC = {
+ 1.8, /* Margin size as percentage of display */
+ 8, /* Character cell granularity */
+ 1, /* Minimum front porch in lines/chars */
+ 3, /* Width of V sync in lines */
+ 8, /* Width of H sync as percent of total */
+ 550, /* Minimum vertical sync + back porch (us) */
+ 600, /* Blanking formula gradient */
+ 40, /* Blanking formula offset */
+ 128, /* Blanking formula scaling factor */
+ 20, /* Blanking formula scaling factor weight */
+ };
+
+/*-------------------------- Implementation -------------------------------*/
+
+#ifdef __WIN32_VXD__
+/* These functions are not supported in a VxD, so we stub them out so this
+ * module will at least compile. Calling the functions in here will do
+ * something wierd!
+ */
+double sqrt(double x)
+{ return x; }
+
+double floor(double x)
+{ return x; }
+
+double pow(double x,double y)
+{ return x*y; }
+#endif
+
+static double round(double v)
+{
+ return floor(v + 0.5);
+}
+
+static void GetInternalConstants(GTF_constants *c)
+/****************************************************************************
+*
+* Function: GetInternalConstants
+* Parameters: c - Place to store the internal constants
+*
+* Description: Calculates the rounded, internal set of GTF constants.
+* These constants are different to the real GTF constants
+* that can be set up for the monitor. The calculations to
+* get these real constants are defined in the 'Work Area'
+* after the constants are defined in the Excel spreadsheet.
+*
+****************************************************************************/
+{
+ c->margin = GC.margin;
+ c->cellGran = round(GC.cellGran);
+ c->minPorch = round(GC.minPorch);
+ c->vSyncRqd = round(GC.vSyncRqd);
+ c->hSync = GC.hSync;
+ c->minVSyncBP = GC.minVSyncBP;
+ if (GC.k == 0)
+ c->k = 0.001;
+ else
+ c->k = GC.k;
+ c->m = (c->k / 256) * GC.m;
+ c->c = (GC.c - GC.j) * (c->k / 256) + GC.j;
+ c->j = GC.j;
+}
+
+void GTF_calcTimings(double hPixels,double vLines,double freq,
+ int type,ibool wantMargins,ibool wantInterlace,GTF_timings *t)
+/****************************************************************************
+*
+* Function: GTF_calcTimings
+* Parameters: hPixels - X resolution
+* vLines - Y resolution
+* freq - Frequency (Hz, KHz or MHz depending on type)
+* type - 1 - vertical, 2 - horizontal, 3 - dot clock
+* margins - True if margins should be generated
+* interlace - True if interlaced timings to be generated
+* t - Place to store the resulting timings
+*
+* Description: Calculates a set of GTF timing parameters given a specified
+* resolution and vertical frequency. The horizontal frequency
+* and dot clock will be automatically generated by this
+* routines.
+*
+* For interlaced modes the CRTC parameters are calculated for
+* a single field, so will be half what would be used in
+* a non-interlaced mode.
+*
+****************************************************************************/
+{
+ double interlace,vFieldRate,hPeriod;
+ double topMarginLines,botMarginLines;
+ double leftMarginPixels,rightMarginPixels;
+ double hPeriodEst,vSyncBP,vBackPorch;
+ double vTotalLines,vFieldRateEst;
+ double hTotalPixels,hTotalActivePixels,hBlankPixels;
+ double idealDutyCycle,hSyncWidth,hSyncBP,hBackPorch;
+ double idealHPeriod;
+ double vFreq,hFreq,dotClock;
+ GTF_constants c;
+
+ /* Get rounded GTF constants used for internal calculations */
+ GetInternalConstants(&c);
+
+ /* Move input parameters into appropriate variables */
+ vFreq = hFreq = dotClock = freq;
+
+ /* Round pixels to character cell granularity */
+ hPixels = round(hPixels / c.cellGran) * c.cellGran;
+
+ /* For interlaced mode halve the vertical parameters, and double
+ * the required field refresh rate.
+ */
+ vFieldRate = vFreq;
+ interlace = 0;
+ if (wantInterlace)
+ dotClock *= 2;
+
+ /* Determine the lines for margins */
+ if (wantMargins) {
+ topMarginLines = round(c.margin / 100 * vLines);
+ botMarginLines = round(c.margin / 100 * vLines);
+ }
+ else {
+ topMarginLines = 0;
+ botMarginLines = 0;
+ }
+
+ if (type != GTF_lockPF) {
+ if (type == GTF_lockVF) {
+ /* Estimate the horizontal period */
+ hPeriodEst = ((1/vFieldRate) - (c.minVSyncBP/1000000)) /
+ (vLines + (2*topMarginLines) + c.minPorch + interlace) * 1000000;
+
+ /* Find the number of lines in vSync + back porch */
+ vSyncBP = round(c.minVSyncBP / hPeriodEst);
+ }
+ else if (type == GTF_lockHF) {
+ /* Find the number of lines in vSync + back porch */
+ vSyncBP = round((c.minVSyncBP * hFreq) / 1000);
+ }
+
+ /* Find the number of lines in the V back porch alone */
+ vBackPorch = vSyncBP - c.vSyncRqd;
+
+ /* Find the total number of lines in the vertical period */
+ vTotalLines = vLines + topMarginLines + botMarginLines + vSyncBP
+ + interlace + c.minPorch;
+
+ if (type == GTF_lockVF) {
+ /* Estimate the vertical frequency */
+ vFieldRateEst = 1000000 / (hPeriodEst * vTotalLines);
+
+ /* Find the actual horizontal period */
+ hPeriod = (hPeriodEst * vFieldRateEst) / vFieldRate;
+
+ /* Find the actual vertical field frequency */
+ vFieldRate = 1000000 / (hPeriod * vTotalLines);
+ }
+ else if (type == GTF_lockHF) {
+ /* Find the actual vertical field frequency */
+ vFieldRate = (hFreq / vTotalLines) * 1000;
+ }
+ }
+
+ /* Find the number of pixels in the left and right margins */
+ if (wantMargins) {
+ leftMarginPixels = round(hPixels * c.margin) / (100 * c.cellGran);
+ rightMarginPixels = round(hPixels * c.margin) / (100 * c.cellGran);
+ }
+ else {
+ leftMarginPixels = 0;
+ rightMarginPixels = 0;
+ }
+
+ /* Find the total number of active pixels in image + margins */
+ hTotalActivePixels = hPixels + leftMarginPixels + rightMarginPixels;
+
+ if (type == GTF_lockVF) {
+ /* Find the ideal blanking duty cycle */
+ idealDutyCycle = c.c - ((c.m * hPeriod) / 1000);
+ }
+ else if (type == GTF_lockHF) {
+ /* Find the ideal blanking duty cycle */
+ idealDutyCycle = c.c - (c.m / hFreq);
+ }
+ else if (type == GTF_lockPF) {
+ /* Find ideal horizontal period from blanking duty cycle formula */
+ idealHPeriod = (((c.c - 100) + (sqrt((pow(100-c.c,2)) +
+ (0.4 * c.m * (hTotalActivePixels + rightMarginPixels +
+ leftMarginPixels) / dotClock)))) / (2 * c.m)) * 1000;
+
+ /* Find the ideal blanking duty cycle */
+ idealDutyCycle = c.c - ((c.m * idealHPeriod) / 1000);
+ }
+
+ /* Find the number of pixels in blanking time */
+ hBlankPixels = round((hTotalActivePixels * idealDutyCycle) /
+ ((100 - idealDutyCycle) * c.cellGran)) * c.cellGran;
+
+ /* Find the total number of pixels */
+ hTotalPixels = hTotalActivePixels + hBlankPixels;
+
+ /* Find the horizontal back porch */
+ hBackPorch = round((hBlankPixels / 2) / c.cellGran) * c.cellGran;
+
+ /* Find the horizontal sync width */
+ hSyncWidth = round(((c.hSync/100) * hTotalPixels) / c.cellGran) * c.cellGran;
+
+ /* Find the horizontal sync + back porch */
+ hSyncBP = hBackPorch + hSyncWidth;
+
+ if (type == GTF_lockPF) {
+ /* Find the horizontal frequency */
+ hFreq = (dotClock / hTotalPixels) * 1000;
+
+ /* Find the number of lines in vSync + back porch */
+ vSyncBP = round((c.minVSyncBP * hFreq) / 1000);
+
+ /* Find the number of lines in the V back porch alone */
+ vBackPorch = vSyncBP - c.vSyncRqd;
+
+ /* Find the total number of lines in the vertical period */
+ vTotalLines = vLines + topMarginLines + botMarginLines + vSyncBP
+ + interlace + c.minPorch;
+
+ /* Find the actual vertical field frequency */
+ vFieldRate = (hFreq / vTotalLines) * 1000;
+ }
+ else {
+ if (type == GTF_lockVF) {
+ /* Find the horizontal frequency */
+ hFreq = 1000 / hPeriod;
+ }
+ else if (type == GTF_lockHF) {
+ /* Find the horizontal frequency */
+ hPeriod = 1000 / hFreq;
+ }
+
+ /* Find the pixel clock frequency */
+ dotClock = hTotalPixels / hPeriod;
+ }
+
+ /* Return the computed frequencies */
+ t->vFreq = vFieldRate;
+ t->hFreq = hFreq;
+ t->dotClock = dotClock;
+
+ /* Determine the vertical timing parameters */
+ t->h.hTotal = (int)hTotalPixels;
+ t->h.hDisp = (int)hTotalActivePixels;
+ t->h.hSyncStart = t->h.hTotal - (int)hSyncBP;
+ t->h.hSyncEnd = t->h.hTotal - (int)hBackPorch;
+ t->h.hFrontPorch = t->h.hSyncStart - t->h.hDisp;
+ t->h.hSyncWidth = (int)hSyncWidth;
+ t->h.hBackPorch = (int)hBackPorch;
+
+ /* Determine the vertical timing parameters */
+ t->v.vTotal = (int)vTotalLines;
+ t->v.vDisp = (int)vLines;
+ t->v.vSyncStart = t->v.vTotal - (int)vSyncBP;
+ t->v.vSyncEnd = t->v.vTotal - (int)vBackPorch;
+ t->v.vFrontPorch = t->v.vSyncStart - t->v.vDisp;
+ t->v.vSyncWidth = (int)c.vSyncRqd;
+ t->v.vBackPorch = (int)vBackPorch;
+ if (wantInterlace) {
+ /* Halve the timings for interlaced modes */
+ t->v.vTotal /= 2;
+ t->v.vDisp /= 2;
+ t->v.vSyncStart /= 2;
+ t->v.vSyncEnd /= 2;
+ t->v.vFrontPorch /= 2;
+ t->v.vSyncWidth /= 2;
+ t->v.vBackPorch /= 2;
+ t->dotClock /= 2;
+ }
+
+ /* Mark as GTF timing using the sync polarities */
+ t->interlace = (wantInterlace) ? 'I' : 'N';
+ t->hSyncPol = '-';
+ t->vSyncPol = '+';
+}
+
+void GTF_getConstants(GTF_constants *constants)
+{ *constants = GC; }
+
+void GTF_setConstants(GTF_constants *constants)
+{ GC = *constants; }
+
+#ifdef TESTING_GTF
+
+void main(int argc,char *argv[])
+{
+ FILE *f;
+ double xPixels,yPixels,freq;
+ ibool interlace;
+ GTF_timings t;
+
+ if (argc != 5 && argc != 6) {
+ printf("Usage: GTFCALC <xPixels> <yPixels> <freq> [[Hz] [KHz] [MHz]] [I]\n");
+ printf("\n");
+ printf("where <xPixels> is the horizontal resolution of the mode, <yPixels> is the\n");
+ printf("vertical resolution of the mode. The <freq> value will be the frequency to\n");
+ printf("drive the calculations, and will be either the vertical frequency (in Hz)\n");
+ printf("the horizontal frequency (in KHz) or the dot clock (in MHz). To generate\n");
+ printf("timings for an interlaced mode, add 'I' to the end of the command line.\n");
+ printf("\n");
+ printf("For example to generate timings for 640x480 at 60Hz vertical:\n");
+ printf("\n");
+ printf(" GTFCALC 640 480 60 Hz\n");
+ printf("\n");
+ printf("For example to generate timings for 640x480 at 31.5KHz horizontal:\n");
+ printf("\n");
+ printf(" GTFCALC 640 480 31.5 KHz\n");
+ printf("\n");
+ printf("For example to generate timings for 640x480 with a 25.175Mhz dot clock:\n");
+ printf("\n");
+ printf(" GTFCALC 640 480 25.175 MHz\n");
+ printf("\n");
+ printf("GTFCALC will print a summary of the results found, and dump the CRTC\n");
+ printf("values to the UVCONFIG.CRT file in the format used by SciTech Display Doctor.\n");
+ exit(1);
+ }
+
+ /* Get values from command line */
+ xPixels = atof(argv[1]);
+ yPixels = atof(argv[2]);
+ freq = atof(argv[3]);
+ interlace = ((argc == 6) && (argv[5][0] == 'I'));
+
+ /* Compute the CRTC timings */
+ if (toupper(argv[4][0]) == 'H')
+ GTF_calcTimings(xPixels,yPixels,freq,GTF_lockVF,false,interlace,&t);
+ else if (toupper(argv[4][0]) == 'K')
+ GTF_calcTimings(xPixels,yPixels,freq,GTF_lockHF,false,interlace,&t);
+ else if (toupper(argv[4][0]) == 'M')
+ GTF_calcTimings(xPixels,yPixels,freq,GTF_lockPF,false,interlace,&t);
+ else {
+ printf("Unknown command line!\n");
+ exit(1);
+ }
+
+ /* Dump summary info to standard output */
+ printf("CRTC values for %.0fx%.0f @ %.2f %s\n", xPixels, yPixels, freq, argv[4]);
+ printf("\n");
+ printf(" hTotal = %-4d vTotal = %-4d\n",
+ t.h.hTotal, t.v.vTotal);
+ printf(" hDisp = %-4d vDisp = %-4d\n",
+ t.h.hDisp, t.v.vDisp);
+ printf(" hSyncStart = %-4d vSyncStart = %-4d\n",
+ t.h.hSyncStart, t.v.vSyncStart);
+ printf(" hSyncEnd = %-4d vSyncEnd = %-4d\n",
+ t.h.hSyncEnd, t.v.vSyncEnd);
+ printf(" hFrontPorch = %-4d vFrontPorch = %-4d\n",
+ t.h.hFrontPorch, t.v.vFrontPorch);
+ printf(" hSyncWidth = %-4d vSyncWidth = %-4d\n",
+ t.h.hSyncWidth, t.v.vSyncWidth);
+ printf(" hBackPorch = %-4d vBackPorch = %-4d\n",
+ t.h.hBackPorch, t.v.vBackPorch);
+ printf("\n");
+ printf(" Interlaced = %s\n", (t.interlace == 'I') ? "Yes" : "No");
+ printf(" H sync pol = %c\n", t.hSyncPol);
+ printf(" V sync pol = %c\n", t.vSyncPol);
+ printf("\n");
+ printf(" Vert freq = %.2f Hz\n", t.vFreq);
+ printf(" Horiz freq = %.2f KHz\n", t.hFreq);
+ printf(" Dot Clock = %.2f Mhz\n", t.dotClock);
+
+ /* Dump to file in format used by SciTech Display Doctor */
+ if ((f = fopen("UVCONFIG.CRT","w")) != NULL) {
+ fprintf(f, "[%.0f %.0f]\n", xPixels, yPixels);
+ fprintf(f, "%d %d %d %d '%c' %s\n",
+ t.h.hTotal, t.h.hDisp,
+ t.h.hSyncStart, t.h.hSyncEnd,
+ t.hSyncPol, (t.interlace == 'I') ? "I" : "NI");
+ fprintf(f, "%d %d %d %d '%c'\n",
+ t.v.vTotal, t.v.vDisp,
+ t.v.vSyncStart, t.v.vSyncEnd,
+ t.vSyncPol);
+ fprintf(f, "%.2f\n", t.dotClock);
+ fclose(f);
+ }
+}
+
+#endif /* TESTING */
diff --git a/board/MAI/bios_emulator/scitech/src/common/libcimp.c b/board/MAI/bios_emulator/scitech/src/common/libcimp.c
new file mode 100644
index 0000000000..0eacd120bf
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/src/common/libcimp.c
@@ -0,0 +1,828 @@
+/****************************************************************************
+*
+* SciTech MGL Graphics 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: Any
+*
+* Description: Module to implement a the OS specific side of the Binary
+* Portable DLL C runtime library. The functions in here
+* are imported into the Binary Portable DLL's to implement
+* OS specific services.
+*
+****************************************************************************/
+
+#include "pmapi.h"
+#if defined(__WIN32_VXD__) || defined(__NT_DRIVER__)
+#include "drvlib/peloader.h"
+#include "drvlib/attrib.h"
+#include "drvlib/libc/init.h"
+#define __BUILDING_PE_LOADER__
+#include "drvlib/libc/file.h"
+#if defined(__WIN32_VXD__)
+#include "vxdfile.h"
+#endif
+#else
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <malloc.h>
+#include <time.h>
+#include <signal.h>
+#include <fcntl.h>
+#if defined(__GNUC__) || defined(__UNIX__)
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#else
+#include <io.h>
+#endif
+#include "drvlib/attrib.h"
+#include "drvlib/libc/init.h"
+#define __BUILDING_PE_LOADER__
+#include "drvlib/libc/file.h"
+#if defined(__WINDOWS__) || defined(TNT) || defined(__RTTARGET__)
+#define WIN32_LEAN_AND_MEAN
+#define STRICT
+#include <windows.h>
+#endif
+#ifdef __MSDOS__
+#include <dos.h>
+#endif
+#ifdef __OS2__
+#define INCL_DOS
+#define INCL_DOSERRORS
+#define INCL_SUB
+#include <os2.h>
+#endif
+#endif
+
+/* No text or binary modes for Unix */
+
+#ifndef O_BINARY
+#define O_BINARY 0
+#define O_TEXT 0
+#endif
+
+/*--------------------------- Global variables ----------------------------*/
+
+#if defined(__WIN32_VXD__) || defined(__NT_DRIVER__)
+#define MAX_FILES 16
+static FILE *openHandles[MAX_FILES] = {NULL};
+#endif
+
+/* <stdlib.h> stub functions */
+void _CDECL stub_abort(void);
+int _CDECL stub_atexit(void (*)(void));
+void * _CDECL stub_calloc(size_t _nelem, size_t _size);
+void _CDECL stub_exit(int _status);
+void _CDECL stub_free(void *_ptr);
+char * _CDECL stub_getenv(const char *_name);
+void * _CDECL stub_malloc(size_t _size);
+void * _CDECL stub_realloc(void *_ptr, size_t _size);
+int _CDECL stub_system(const char *_s);
+int _CDECL stub_putenv(const char *_val);
+
+/* <libc/file.h> stub functions */
+int _CDECL stub_open(const char *_path, int _oflag, unsigned _mode);
+int _CDECL stub_access(const char *_path, int _amode);
+int _CDECL stub_close(int _fildes);
+off_t _CDECL stub_lseek(int _fildes, off_t _offset, int _whence);
+size_t _CDECL stub_read(int _fildes, void *_buf, size_t _nbyte);
+int _CDECL stub_unlink(const char *_path);
+size_t _CDECL stub_write(int _fildes, const void *_buf, size_t _nbyte);
+int _CDECL stub_isatty(int _fildes);
+
+/* <stdio.h> stub functions */
+int _CDECL stub_remove(const char *_filename);
+int _CDECL stub_rename(const char *_old, const char *_new);
+
+/* <time.h> stub functions */
+time_t _CDECL stub_time(time_t *_tod);
+
+/* <signal.h> stub functions */
+int _CDECL stub_raise(int);
+void * _CDECL stub_signal(int, void *);
+
+/* <drvlib/attrib.h> functions */
+#define stub_OS_setfileattr _OS_setfileattr
+#define stub_OS_getcurrentdate _OS_getcurrentdate
+
+LIBC_imports _VARAPI ___imports = {
+ sizeof(LIBC_imports),
+
+ /* <stdlib.h> exports */
+ stub_abort,
+ stub_atexit,
+ stub_calloc,
+ stub_exit,
+ stub_free,
+ stub_getenv,
+ stub_malloc,
+ stub_realloc,
+ stub_system,
+ stub_putenv,
+
+ /* <libc/file.h> exports */
+ stub_open,
+ stub_access,
+ stub_close,
+ stub_lseek,
+ stub_read,
+ stub_unlink,
+ stub_write,
+ stub_isatty,
+
+ /* <stdio.h> exports */
+ stub_remove,
+ stub_rename,
+
+ /* <signal.h> functions */
+ stub_raise,
+ stub_signal,
+
+ /* <time.h> exports */
+ stub_time,
+
+ /* <drvlib/attrib.h> exports */
+ stub_OS_setfileattr,
+ stub_OS_getcurrentdate,
+ };
+
+/*---------------------- Stub function implementation ---------------------*/
+
+/* <stdlib.h> stub functions */
+void _CDECL stub_abort(void)
+{
+#if !defined( __WIN32_VXD__) && !defined(__NT_DRIVER__)
+ abort();
+#endif
+}
+
+int _CDECL stub_atexit(void (*func)(void))
+{
+#if !defined( __WIN32_VXD__) && !defined(__NT_DRIVER__)
+ return atexit((void(*)(void))func);
+#else
+ return -1;
+#endif
+}
+
+void * _CDECL stub_calloc(size_t _nelem, size_t _size)
+{ return __PM_calloc(_nelem,_size); }
+
+void _CDECL stub_exit(int _status)
+{
+#if !defined( __WIN32_VXD__) && !defined(__NT_DRIVER__)
+ exit(_status);
+#endif
+}
+
+void _CDECL stub_free(void *_ptr)
+{ __PM_free(_ptr); }
+
+char * _CDECL stub_getenv(const char *_name)
+{
+#if defined( __WIN32_VXD__) || defined(__NT_DRIVER__)
+ return NULL;
+#else
+ return getenv(_name);
+#endif
+}
+
+void * _CDECL stub_malloc(size_t _size)
+{ return __PM_malloc(_size); }
+
+void * _CDECL stub_realloc(void *_ptr, size_t _size)
+{ return __PM_realloc(_ptr,_size); }
+
+int _CDECL stub_system(const char *_s)
+{
+#if defined(__WINDOWS__) || defined(__WIN32_VXD__) || defined(__NT_DRIVER__) || defined(__SMX32__) || defined(__RTTARGET__)
+ (void)_s;
+ return -1;
+#else
+ return system(_s);
+#endif
+}
+
+int _CDECL stub_putenv(const char *_val)
+{
+#if defined( __WIN32_VXD__) || defined(__NT_DRIVER__)
+ return -1;
+#else
+ return putenv((char*)_val);
+#endif
+}
+
+time_t _CDECL stub_time(time_t *_tod)
+{
+#if defined( __WIN32_VXD__) || defined(__NT_DRIVER__)
+ return 0;
+#else
+ return time(_tod);
+#endif
+}
+
+#if defined(__MSDOS__)
+
+#if defined(TNT) && defined(_MSC_VER)
+
+void _CDECL _OS_setfileattr(const char *filename,unsigned attrib)
+{ SetFileAttributes((LPSTR)filename, (DWORD)attrib); }
+
+#else
+
+void _CDECL _OS_setfileattr(const char *filename,unsigned attrib)
+{ _dos_setfileattr(filename,attrib); }
+
+#endif
+
+#elif defined(__WIN32_VXD__)
+
+#define USE_LOCAL_FILEIO
+#define USE_LOCAL_GETDATE
+
+/* <libc/file.h> stub functions */
+int _CDECL stub_open(const char *_path, int _oflag, unsigned _mode)
+{
+ char mode[10];
+ int i;
+
+ /* Find an empty file handle to use */
+ for (i = 3; i < MAX_FILES; i++) {
+ if (!openHandles[i])
+ break;
+ }
+ if (openHandles[i])
+ return -1;
+
+ /* Find the open flags to use */
+ if (_oflag & ___O_TRUNC)
+ strcpy(mode,"w");
+ else if (_oflag & ___O_CREAT)
+ strcpy(mode,"a");
+ else
+ strcpy(mode,"r");
+ if (_oflag & ___O_BINARY)
+ strcat(mode,"b");
+ if (_oflag & ___O_TEXT)
+ strcat(mode,"t");
+
+ /* Open the file and store the file handle */
+ if ((openHandles[i] = fopen(_path,mode)) == NULL)
+ return -1;
+ return i;
+}
+
+int _CDECL stub_access(const char *_path, int _amode)
+{ return -1; }
+
+int _CDECL stub_close(int _fildes)
+{
+ if (_fildes >= 3 && openHandles[_fildes]) {
+ fclose(openHandles[_fildes]);
+ openHandles[_fildes] = NULL;
+ }
+ return 0;
+}
+
+off_t _CDECL stub_lseek(int _fildes, off_t _offset, int _whence)
+{
+ if (_fildes >= 3) {
+ fseek(openHandles[_fildes],_offset,_whence);
+ return ftell(openHandles[_fildes]);
+ }
+ return 0;
+}
+
+size_t _CDECL stub_read(int _fildes, void *_buf, size_t _nbyte)
+{
+ if (_fildes >= 3)
+ return fread(_buf,1,_nbyte,openHandles[_fildes]);
+ return 0;
+}
+
+int _CDECL stub_unlink(const char *_path)
+{
+ WORD error;
+
+ if (initComplete) {
+ if (R0_DeleteFile((char*)_path,0,&error))
+ return 0;
+ return -1;
+ }
+ else
+ return i_remove(_path);
+}
+
+size_t _CDECL stub_write(int _fildes, const void *_buf, size_t _nbyte)
+{
+ if (_fildes >= 3)
+ return fwrite(_buf,1,_nbyte,openHandles[_fildes]);
+ return _nbyte;
+}
+
+int _CDECL stub_isatty(int _fildes)
+{ return 0; }
+
+/* <stdio.h> stub functions */
+int _CDECL stub_remove(const char *_filename)
+{ return stub_unlink(_filename); }
+
+int _CDECL stub_rename(const char *_old, const char *_new)
+{ return -1; }
+
+void _CDECL _OS_setfileattr(const char *filename,unsigned attrib)
+{
+ WORD error;
+ if (initComplete)
+ R0_SetFileAttributes((char*)filename,attrib,&error);
+}
+
+/* Return the current date in days since 1/1/1980 */
+ulong _CDECL _OS_getcurrentdate(void)
+{
+ DWORD date;
+ VTD_Get_Date_And_Time(&date);
+ return date;
+}
+
+#elif defined(__NT_DRIVER__)
+
+#define USE_LOCAL_FILEIO
+#define USE_LOCAL_GETDATE
+
+/* <libc/file.h> stub functions */
+int _CDECL stub_open(const char *_path, int _oflag, unsigned _mode)
+{
+ char mode[10];
+ int i;
+
+ /* Find an empty file handle to use */
+ for (i = 3; i < MAX_FILES; i++) {
+ if (!openHandles[i])
+ break;
+ }
+ if (openHandles[i])
+ return -1;
+
+ /* Find the open flags to use */
+ if (_oflag & ___O_TRUNC)
+ strcpy(mode,"w");
+ else if (_oflag & ___O_CREAT)
+ strcpy(mode,"a");
+ else
+ strcpy(mode,"r");
+ if (_oflag & ___O_BINARY)
+ strcat(mode,"b");
+ if (_oflag & ___O_TEXT)
+ strcat(mode,"t");
+
+ /* Open the file and store the file handle */
+ if ((openHandles[i] = fopen(_path,mode)) == NULL)
+ return -1;
+ return i;
+}
+
+int _CDECL stub_close(int _fildes)
+{
+ if (_fildes >= 3 && openHandles[_fildes]) {
+ fclose(openHandles[_fildes]);
+ openHandles[_fildes] = NULL;
+ }
+ return 0;
+}
+
+off_t _CDECL stub_lseek(int _fildes, off_t _offset, int _whence)
+{
+ if (_fildes >= 3) {
+ fseek(openHandles[_fildes],_offset,_whence);
+ return ftell(openHandles[_fildes]);
+ }
+ return 0;
+}
+
+size_t _CDECL stub_read(int _fildes, void *_buf, size_t _nbyte)
+{
+ if (_fildes >= 3)
+ return fread(_buf,1,_nbyte,openHandles[_fildes]);
+ return 0;
+}
+
+size_t _CDECL stub_write(int _fildes, const void *_buf, size_t _nbyte)
+{
+ if (_fildes >= 3)
+ return fwrite(_buf,1,_nbyte,openHandles[_fildes]);
+ return _nbyte;
+}
+
+int _CDECL stub_access(const char *_path, int _amode)
+{ return -1; }
+
+int _CDECL stub_isatty(int _fildes)
+{ return 0; }
+
+int _CDECL stub_unlink(const char *_path)
+{
+ // TODO: Implement this!
+ return -1;
+}
+
+/* <stdio.h> stub functions */
+int _CDECL stub_remove(const char *_filename)
+{ return stub_unlink(_filename); }
+
+int _CDECL stub_rename(const char *_old, const char *_new)
+{
+ // TODO: Implement this!
+ return -1;
+}
+
+void _CDECL _OS_setfileattr(const char *filename,unsigned attrib)
+{
+ uint _attr = 0;
+ if (attrib & __A_RDONLY)
+ _attr |= FILE_ATTRIBUTE_READONLY;
+ if (attrib & __A_HIDDEN)
+ _attr |= FILE_ATTRIBUTE_HIDDEN;
+ if (attrib & __A_SYSTEM)
+ _attr |= FILE_ATTRIBUTE_SYSTEM;
+ PM_setFileAttr(filename,_attr);
+}
+
+/* Return the current date in days since 1/1/1980 */
+ulong _CDECL _OS_getcurrentdate(void)
+{
+ TIME_FIELDS tm;
+ _int64 count,count_1_1_1980;
+
+ tm.Year = 1980;
+ tm.Month = 1;
+ tm.Day = 1;
+ tm.Hour = 0;
+ tm.Minute = 0;
+ tm.Second = 0;
+ tm.Milliseconds = 0;
+ tm.Weekday = 0;
+ RtlTimeFieldsToTime(&tm,(PLARGE_INTEGER)&count_1_1_1980);
+ KeQuerySystemTime((PLARGE_INTEGER)&count);
+ return (ulong)( (count - count_1_1_1980) / ((_int64)24 * (_int64)3600 * (_int64)10000000) );
+}
+
+#elif defined(__WINDOWS32__) || defined(__RTTARGET__)
+
+void _CDECL _OS_setfileattr(const char *filename,unsigned attrib)
+{ SetFileAttributes((LPSTR)filename, (DWORD)attrib); }
+
+#elif defined(__OS2__)
+
+#define USE_LOCAL_FILEIO
+
+#ifndef W_OK
+#define W_OK 0x02
+#endif
+
+void _CDECL _OS_setfileattr(const char *filename,unsigned attrib)
+{
+ FILESTATUS3 s;
+ if (DosQueryPathInfo((PSZ)filename,FIL_STANDARD,(PVOID)&s,sizeof(s)))
+ return;
+ s.attrFile = attrib;
+ DosSetPathInfo((PSZ)filename,FIL_STANDARD,(PVOID)&s,sizeof(s),0L);
+}
+
+/* <libc/file.h> stub functions */
+
+#define BUF_SIZE 4096
+
+/* Note: the implementation of the standard Unix-ish handle-based I/O isn't
+ * complete - but that wasn't the intent either. Note also that we
+ * don't presently support text file I/O, so all text files end
+ * up in Unix format (and are not translated!).
+ */
+int _CDECL stub_open(const char *_path, int _oflag, unsigned _mode)
+{
+ HFILE handle;
+ ULONG error, actiontaken, openflag, openmode;
+ char path[PM_MAX_PATH];
+
+ /* Determine open flags */
+ if (_oflag & ___O_CREAT) {
+ if (_oflag & ___O_EXCL)
+ openflag = OPEN_ACTION_FAIL_IF_EXISTS | OPEN_ACTION_CREATE_IF_NEW;
+ else if (_oflag & ___O_TRUNC)
+ openflag = OPEN_ACTION_REPLACE_IF_EXISTS | OPEN_ACTION_CREATE_IF_NEW;
+ else
+ openflag = OPEN_ACTION_OPEN_IF_EXISTS | OPEN_ACTION_CREATE_IF_NEW;
+ }
+ else if (_oflag & ___O_TRUNC)
+ openflag = OPEN_ACTION_REPLACE_IF_EXISTS;
+ else
+ openflag = OPEN_ACTION_OPEN_IF_EXISTS;
+
+ /* Determine open mode flags */
+ if (_oflag & ___O_RDONLY)
+ openmode = OPEN_ACCESS_READONLY | OPEN_SHARE_DENYNONE;
+ else if (_oflag & ___O_WRONLY)
+ openmode = OPEN_ACCESS_WRITEONLY | OPEN_SHARE_DENYWRITE;
+ else
+ openmode = OPEN_ACCESS_READWRITE | OPEN_SHARE_DENYWRITE;
+
+ /* Copy the path to a variable on the stack. We need to do this
+ * for OS/2 as when the drivers are loaded into shared kernel
+ * memory, we can't pass an address from that memory range to
+ * this function.
+ */
+ strcpy(path,_path);
+ if (DosOpen(path, &handle, &actiontaken, 0, FILE_NORMAL,
+ openflag, openmode, NULL) != NO_ERROR)
+ return -1;
+
+ /* Handle append mode of operation */
+ if (_oflag & ___O_APPEND) {
+ if (DosSetFilePtr(handle, 0, FILE_END, &error) != NO_ERROR)
+ return -1;
+ }
+ return handle;
+}
+
+int _CDECL stub_access(const char *_path, int _amode)
+{
+ char path[PM_MAX_PATH];
+ FILESTATUS fs;
+
+ /* Copy the path to a variable on the stack. We need to do this
+ * for OS/2 as when the drivers are loaded into shared kernel
+ * memory, we can't pass an address from that memory range to
+ * this function.
+ */
+ strcpy(path,_path);
+ if (DosQueryPathInfo(path, FIL_STANDARD, &fs, sizeof(fs)) != NO_ERROR)
+ return -1;
+ if ((_amode & W_OK) && (fs.attrFile & FILE_READONLY))
+ return -1;
+ return 0;
+}
+
+int _CDECL stub_close(int _fildes)
+{
+ if (DosClose(_fildes) != NO_ERROR)
+ return -1;
+ return 0;
+}
+
+off_t _CDECL stub_lseek(int _fildes, off_t _offset, int _whence)
+{
+ ULONG cbActual, origin;
+
+ switch (_whence) {
+ case SEEK_CUR:
+ origin = FILE_CURRENT;
+ break;
+ case SEEK_END:
+ origin = FILE_END;
+ break;
+ default:
+ origin = FILE_BEGIN;
+ }
+ if (DosSetFilePtr(_fildes, _offset, origin, &cbActual) != NO_ERROR)
+ return -1;
+ return cbActual;
+}
+
+size_t _CDECL stub_read(int _fildes, void *_buf, size_t _nbyte)
+{
+ ULONG cbActual = 0,cbRead;
+ uchar *p = _buf;
+ uchar file_io_buf[BUF_SIZE];
+
+ /* We need to perform the physical read in chunks into a
+ * a temporary static buffer, since the buffer passed in may be
+ * in kernel space and will cause DosRead to bail internally.
+ */
+ while (_nbyte > BUF_SIZE) {
+ if (DosRead(_fildes, file_io_buf, BUF_SIZE, &cbRead) != NO_ERROR)
+ return -1;
+ cbActual += cbRead;
+ memcpy(p,file_io_buf,BUF_SIZE);
+ p += BUF_SIZE;
+ _nbyte -= BUF_SIZE;
+ }
+ if (_nbyte) {
+ if (DosRead(_fildes, file_io_buf, _nbyte, &cbRead) != NO_ERROR)
+ return -1;
+ cbActual += cbRead;
+ memcpy(p,file_io_buf,_nbyte);
+ }
+ return cbActual;
+}
+
+size_t _CDECL stub_write(int _fildes, const void *_buf, size_t _nbyte)
+{
+ ULONG cbActual = 0,cbWrite;
+ uchar *p = (PVOID)_buf;
+ uchar file_io_buf[BUF_SIZE];
+
+ /* We need to perform the physical write in chunks from a
+ * a temporary static buffer, since the buffer passed in may be
+ * in kernel space and will cause DosWrite to bail internally.
+ */
+ while (_nbyte > BUF_SIZE) {
+ memcpy(file_io_buf,p,BUF_SIZE);
+ if (DosWrite(_fildes, file_io_buf, BUF_SIZE, &cbWrite) != NO_ERROR)
+ return -1;
+ cbActual += cbWrite;
+ p += BUF_SIZE;
+ _nbyte -= BUF_SIZE;
+ }
+ if (_nbyte) {
+ memcpy(file_io_buf,p,_nbyte);
+ if (DosWrite(_fildes, file_io_buf, _nbyte, &cbWrite) != NO_ERROR)
+ return -1;
+ cbActual += cbWrite;
+ }
+ return cbActual;
+}
+
+int _CDECL stub_unlink(const char *_path)
+{
+ char path[PM_MAX_PATH];
+
+ /* Copy the path to a variable on the stack. We need to do this
+ * for OS/2 as when the drivers are loaded into shared kernel
+ * memory, we can't pass an address from that memory range to
+ * this function.
+ */
+ strcpy(path,_path);
+ if (DosDelete(path) != NO_ERROR)
+ return -1;
+ return 0;
+}
+
+int _CDECL stub_isatty(int _fildes)
+{
+ ULONG htype, flags;
+
+ if (DosQueryHType(_fildes, &htype, &flags) != NO_ERROR)
+ return 0;
+ return ((htype & 0xFF) == HANDTYPE_DEVICE);
+}
+
+/* <stdio.h> stub functions */
+int _CDECL stub_remove(const char *_path)
+{
+ char path[PM_MAX_PATH];
+
+ /* Copy the path to a variable on the stack. We need to do this
+ * for OS/2 as when the drivers are loaded into shared kernel
+ * memory, we can't pass an address from that memory range to
+ * this function.
+ */
+ strcpy(path,_path);
+ if (DosDelete(path) != NO_ERROR)
+ return -1;
+ return 0;
+}
+
+int _CDECL stub_rename(const char *_old, const char *_new)
+{
+ char old[PM_MAX_PATH];
+ char new[PM_MAX_PATH];
+
+ /* Copy the path to a variable on the stack. We need to do this
+ * for OS/2 as when the drivers are loaded into shared kernel
+ * memory, we can't pass an address from that memory range to
+ * this function.
+ */
+ strcpy(old,_old);
+ strcpy(new,_new);
+ if (DosMove(old, new) != NO_ERROR)
+ return -1;
+ return 0;
+}
+
+#else
+
+void _CDECL _OS_setfileattr(const char *filename,unsigned attrib)
+{ /* Unable to set hidden, system attributes on Unix. */ }
+
+#endif
+
+#ifndef USE_LOCAL_FILEIO
+
+/* <libc/file.h> stub functions */
+int _CDECL stub_open(const char *_path, int _oflag, unsigned _mode)
+{
+ int oflag_tab[] = {
+ ___O_RDONLY, O_RDONLY,
+ ___O_WRONLY, O_WRONLY,
+ ___O_RDWR, O_RDWR,
+ ___O_BINARY, O_BINARY,
+ ___O_TEXT, O_TEXT,
+ ___O_CREAT, O_CREAT,
+ ___O_EXCL, O_EXCL,
+ ___O_TRUNC, O_TRUNC,
+ ___O_APPEND, O_APPEND,
+ };
+ int i,oflag = 0;
+
+ /* Translate the oflag's to the OS dependent versions */
+ for (i = 0; i < sizeof(oflag_tab) / sizeof(int); i += 2) {
+ if (_oflag & oflag_tab[i])
+ oflag |= oflag_tab[i+1];
+ }
+ return open(_path,oflag,_mode);
+}
+
+int _CDECL stub_access(const char *_path, int _amode)
+{ return access(_path,_amode); }
+
+int _CDECL stub_close(int _fildes)
+{ return close(_fildes); }
+
+off_t _CDECL stub_lseek(int _fildes, off_t _offset, int _whence)
+{ return lseek(_fildes,_offset,_whence); }
+
+size_t _CDECL stub_read(int _fildes, void *_buf, size_t _nbyte)
+{ return read(_fildes,_buf,_nbyte); }
+
+int _CDECL stub_unlink(const char *_path)
+{ return unlink(_path); }
+
+size_t _CDECL stub_write(int _fildes, const void *_buf, size_t _nbyte)
+{ return write(_fildes,_buf,_nbyte); }
+
+int _CDECL stub_isatty(int _fildes)
+{ return isatty(_fildes); }
+
+/* <stdio.h> stub functions */
+int _CDECL stub_remove(const char *_filename)
+{ return remove(_filename); }
+
+int _CDECL stub_rename(const char *_old, const char *_new)
+{ return rename(_old,_new); }
+
+#endif
+
+#ifndef USE_LOCAL_GETDATE
+
+/* Return the current date in days since 1/1/1980 */
+ulong _CDECL _OS_getcurrentdate(void)
+{
+ struct tm refTime;
+ refTime.tm_year = 80;
+ refTime.tm_mon = 0;
+ refTime.tm_mday = 1;
+ refTime.tm_hour = 0;
+ refTime.tm_min = 0;
+ refTime.tm_sec = 0;
+ refTime.tm_isdst = -1;
+ return (time(NULL) - mktime(&refTime)) / (24 * 3600L);
+}
+
+#endif
+
+int _CDECL stub_raise(int sig)
+{
+#if defined(__WIN32_VXD__) || defined(__NT_DRIVER__) || defined(__SMX32__)
+ return -1;
+#else
+ return raise(sig);
+#endif
+}
+
+#ifdef __WINDOWS32__
+typedef void (*__code_ptr)(int);
+#else
+typedef void (*__code_ptr)();
+#endif
+
+void * _CDECL stub_signal(int sig, void *handler)
+{
+#if defined(__WIN32_VXD__) || defined(__NT_DRIVER__) || defined(__SMX32__)
+ return NULL;
+#else
+ return (void*)signal(sig,(__code_ptr)handler);
+#endif
+}
+
diff --git a/board/MAI/bios_emulator/scitech/src/common/makefile b/board/MAI/bios_emulator/scitech/src/common/makefile
new file mode 100644
index 0000000000..5aac0381b3
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/src/common/makefile
@@ -0,0 +1,18 @@
+#############################################################################
+#
+# Copyright (C) 1996 SciTech Software.
+# All rights reserved.
+#
+# Descripton: Makefile for UniVBE(tm), UniPOWER(tm), UVBELib(tm) and
+# DPMSLib library files. Requires Borland C++ 4.52 to build
+# some components.
+#
+# $Date: 2002/10/02 15:35:20 $ $Author: hfrieden $
+#
+#############################################################################
+
+CFLAGS += -DTESTING_GTF
+
+gtfcalc$E: gtfcalc$O
+
+.INCLUDE: "$(SCITECH)/makedefs/common.mk"
diff --git a/board/MAI/bios_emulator/scitech/src/common/peloader.c b/board/MAI/bios_emulator/scitech/src/common/peloader.c
new file mode 100644
index 0000000000..b9bec4aebb
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/src/common/peloader.c
@@ -0,0 +1,587 @@
+/****************************************************************************
+*
+* SciTech MGL Graphics 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: Any
+*
+* Description: Module to implement a simple Portable Binary DLL loader
+* library. This library can be used to load PE DLL's under
+* any Intel based OS, provided the DLL's do not have any
+* imports in the import table.
+*
+* NOTE: This loader module expects the DLL's to be built with
+* Watcom C++ and may produce unexpected results with
+* DLL's linked by another compiler.
+*
+****************************************************************************/
+
+#include "drvlib/peloader.h"
+#include "pmapi.h"
+#include "drvlib/os/os.h"
+#include "drvlib/libc/init.h"
+#if (defined(__WINDOWS32__) || defined(__DRIVER__)) && defined(CHECKED)
+#define WIN32_LEAN_AND_MEAN
+#define STRICT
+#include <windows.h>
+#endif
+#include "drvlib/pe.h"
+
+/*--------------------------- Global variables ----------------------------*/
+
+static int result = PE_ok;
+
+/*------------------------- Implementation --------------------------------*/
+
+/****************************************************************************
+PARAMETERS:
+f - Handle to open file to read driver from
+startOffset - Offset to the start of the driver within the file
+
+RETURNS:
+Handle to loaded PE DLL, or NULL on failure.
+
+REMARKS:
+This function loads a Portable Binary DLL library from disk, relocates
+the code and returns a handle to the loaded library. This function is the
+same as the regular PE_loadLibrary except that it take a handle to an
+open file and an offset within that file for the DLL to load.
+****************************************************************************/
+static int PE_readHeader(
+ FILE *f,
+ long startOffset,
+ FILE_HDR *filehdr,
+ OPTIONAL_HDR *opthdr)
+{
+ EXE_HDR exehdr;
+ ulong offset,signature;
+
+ /* Read the EXE header and check for valid header signature */
+ result = PE_invalidDLLImage;
+ fseek(f, startOffset, SEEK_SET);
+ if (fread(&exehdr, 1, sizeof(exehdr), f) != sizeof(exehdr))
+ return false;
+ if (exehdr.signature != 0x5A4D)
+ return false;
+
+ /* Now seek to the start of the PE header defined at offset 0x3C
+ * in the MS-DOS EXE header, and read the signature and check it.
+ */
+ fseek(f, startOffset+0x3C, SEEK_SET);
+ if (fread(&offset, 1, sizeof(offset), f) != sizeof(offset))
+ return false;
+ fseek(f, startOffset+offset, SEEK_SET);
+ if (fread(&signature, 1, sizeof(signature), f) != sizeof(signature))
+ return false;
+ if (signature != 0x00004550)
+ return false;
+
+ /* Now read the PE file header and check that it is correct */
+ if (fread(filehdr, 1, sizeof(*filehdr), f) != sizeof(*filehdr))
+ return false;
+ if (filehdr->Machine != IMAGE_FILE_MACHINE_I386)
+ return false;
+ if (!(filehdr->Characteristics & IMAGE_FILE_32BIT_MACHINE))
+ return false;
+ if (!(filehdr->Characteristics & IMAGE_FILE_DLL))
+ return false;
+ if (fread(opthdr, 1, sizeof(*opthdr), f) != sizeof(*opthdr))
+ return false;
+ if (opthdr->Magic != 0x10B)
+ return false;
+
+ /* Success, so return true! */
+ return true;
+}
+
+/****************************************************************************
+PARAMETERS:
+f - Handle to open file to read driver from
+startOffset - Offset to the start of the driver within the file
+
+RETURNS:
+Size of the DLL file on disk, or -1 on error
+
+REMARKS:
+This function scans the headers for a Portable Binary DLL to determine the
+length of the DLL file on disk.
+{secret}
+****************************************************************************/
+ulong PEAPI PE_getFileSize(
+ FILE *f,
+ ulong startOffset)
+{
+ FILE_HDR filehdr;
+ OPTIONAL_HDR opthdr;
+ SECTION_HDR secthdr;
+ ulong size;
+ int i;
+
+ /* Read the PE file headers from disk */
+ if (!PE_readHeader(f,startOffset,&filehdr,&opthdr))
+ return 0xFFFFFFFF;
+
+ /* Scan all the section headers summing up the total size */
+ size = opthdr.SizeOfHeaders;
+ for (i = 0; i < filehdr.NumberOfSections; i++) {
+ if (fread(&secthdr, 1, sizeof(secthdr), f) != sizeof(secthdr))
+ return 0xFFFFFFFF;
+ size += secthdr.SizeOfRawData;
+ }
+ return size;
+}
+
+/****************************************************************************
+DESCRIPTION:
+Loads a Portable Binary DLL into memory from an open file
+
+HEADER:
+peloader.h
+
+PARAMETERS:
+f - Handle to open file to read driver from
+startOffset - Offset to the start of the driver within the file
+size - Place to store the size of the driver loaded
+shared - True to load module into shared memory
+
+RETURNS:
+Handle to loaded PE DLL, or NULL on failure.
+
+REMARKS:
+This function loads a Portable Binary DLL library from disk, relocates
+the code and returns a handle to the loaded library. This function is the
+same as the regular PE_loadLibrary except that it take a handle to an
+open file and an offset within that file for the DLL to load.
+
+SEE ALSO:
+PE_loadLibrary, PE_getProcAddress, PE_freeLibrary
+****************************************************************************/
+PE_MODULE * PEAPI PE_loadLibraryExt(
+ FILE *f,
+ ulong startOffset,
+ ulong *size,
+ ibool shared)
+{
+ FILE_HDR filehdr;
+ OPTIONAL_HDR opthdr;
+ SECTION_HDR secthdr;
+ ulong offset,pageOffset;
+ ulong text_off,text_addr,text_size;
+ ulong data_off,data_addr,data_size,data_end;
+ ulong export_off,export_addr,export_size,export_end;
+ ulong reloc_off,reloc_size;
+ ulong image_size;
+ int i,delta,numFixups;
+ ushort relocType,*fixup;
+ PE_MODULE *hMod = NULL;
+ void *reloc = NULL;
+ BASE_RELOCATION *baseReloc;
+ InitLibC_t InitLibC;
+
+ /* Read the PE file headers from disk */
+ if (!PE_readHeader(f,startOffset,&filehdr,&opthdr))
+ return NULL;
+
+ /* Scan all the section headers and find the necessary sections */
+ text_off = data_off = reloc_off = export_off = 0;
+ text_addr = text_size = 0;
+ data_addr = data_size = data_end = 0;
+ export_addr = export_size = export_end = 0;
+ reloc_size = 0;
+ for (i = 0; i < filehdr.NumberOfSections; i++) {
+ if (fread(&secthdr, 1, sizeof(secthdr), f) != sizeof(secthdr))
+ goto Error;
+ if (strcmp(secthdr.Name, ".edata") == 0 || strcmp(secthdr.Name, ".rdata") == 0) {
+ /* Exports section */
+ export_off = secthdr.PointerToRawData;
+ export_addr = secthdr.VirtualAddress;
+ export_size = secthdr.SizeOfRawData;
+ export_end = export_addr + export_size;
+ }
+ else if (strcmp(secthdr.Name, ".idata") == 0) {
+ /* Imports section, ignore */
+ }
+ else if (strcmp(secthdr.Name, ".reloc") == 0) {
+ /* Relocations section */
+ reloc_off = secthdr.PointerToRawData;
+ reloc_size = secthdr.SizeOfRawData;
+ }
+ else if (!text_off && secthdr.Characteristics & IMAGE_SCN_CNT_CODE) {
+ /* Code section */
+ text_off = secthdr.PointerToRawData;
+ text_addr = secthdr.VirtualAddress;
+ text_size = secthdr.SizeOfRawData;
+ }
+ else if (!data_off && secthdr.Characteristics & IMAGE_SCN_CNT_INITIALIZED_DATA) {
+ /* Data section */
+ data_off = secthdr.PointerToRawData;
+ data_addr = secthdr.VirtualAddress;
+ data_size = secthdr.SizeOfRawData;
+ data_end = data_addr + data_size;
+ }
+ }
+
+ /* Check to make sure that we have all the sections we need */
+ if (!text_off || !data_off || !export_off || !reloc_off) {
+ result = PE_invalidDLLImage;
+ goto Error;
+ }
+
+ /* Find the size of the image to load allocate memory for it */
+ image_size = MAX(export_end,data_end) - text_addr;
+ *size = sizeof(PE_MODULE) + image_size + 4096;
+ if (shared)
+ hMod = PM_mallocShared(*size);
+ else
+ hMod = PM_malloc(*size);
+ reloc = PM_malloc(reloc_size);
+ if (!hMod || !reloc) {
+ result = PE_outOfMemory;
+ goto Error;
+ }
+
+ hMod->text = (uchar*)ROUND_4K((ulong)hMod + sizeof(PE_MODULE));
+ hMod->data = (uchar*)((ulong)hMod->text + (data_addr - text_addr));
+ hMod->export = (uchar*)((ulong)hMod->text + (export_addr - text_addr));
+ hMod->textBase = text_addr;
+ hMod->dataBase = data_addr;
+ hMod->exportBase = export_addr;
+ hMod->exportDir = opthdr.DataDirectory[0].RelVirtualAddress - export_addr;
+ hMod->shared = shared;
+
+ /* Now read the section images from disk */
+ result = PE_invalidDLLImage;
+ fseek(f, startOffset+text_off, SEEK_SET);
+ if (fread(hMod->text, 1, text_size, f) != text_size)
+ goto Error;
+ fseek(f, startOffset+data_off, SEEK_SET);
+ if (fread(hMod->data, 1, data_size, f) != data_size)
+ goto Error;
+ fseek(f, startOffset+export_off, SEEK_SET);
+ if (fread(hMod->export, 1, export_size, f) != export_size)
+ goto Error;
+ fseek(f, startOffset+reloc_off, SEEK_SET);
+ if (fread(reloc, 1, reloc_size, f) != reloc_size)
+ goto Error;
+
+ /* Now perform relocations on all sections in the image */
+ delta = (ulong)hMod->text - opthdr.ImageBase - text_addr;
+ baseReloc = (BASE_RELOCATION*)reloc;
+ for (;;) {
+ /* Check for termination condition */
+ if (!baseReloc->PageRVA || !baseReloc->BlockSize)
+ break;
+
+ /* Do fixups */
+ pageOffset = baseReloc->PageRVA - hMod->textBase;
+ numFixups = (baseReloc->BlockSize - sizeof(BASE_RELOCATION)) / sizeof(ushort);
+ fixup = (ushort*)(baseReloc + 1);
+ for (i = 0; i < numFixups; i++) {
+ relocType = *fixup >> 12;
+ if (relocType) {
+ offset = pageOffset + (*fixup & 0x0FFF);
+ *(ulong*)(hMod->text + offset) += delta;
+ }
+ fixup++;
+ }
+
+ /* Move to next relocation block */
+ baseReloc = (BASE_RELOCATION*)((ulong)baseReloc + baseReloc->BlockSize);
+ }
+
+ /* Initialise the C runtime library for the loaded DLL */
+ result = PE_unableToInitLibC;
+ if ((InitLibC = (InitLibC_t)PE_getProcAddress(hMod,"_InitLibC")) == NULL)
+ goto Error;
+ if (!InitLibC(&___imports,PM_getOSType()))
+ goto Error;
+
+ /* Clean up, close the file and return the loaded module handle */
+ PM_free(reloc);
+ result = PE_ok;
+ return hMod;
+
+Error:
+ if (shared)
+ PM_freeShared(hMod);
+ else
+ PM_free(hMod);
+ PM_free(reloc);
+ return NULL;
+}
+
+/****************************************************************************
+DESCRIPTION:
+Loads a Portable Binary DLL into memory
+
+HEADER:
+peloader.h
+
+PARAMETERS:
+szDLLName - Name of the PE DLL library to load
+shared - True to load module into shared memory
+
+RETURNS:
+Handle to loaded PE DLL, or NULL on failure.
+
+REMARKS:
+This function loads a Portable Binary DLL library from disk, relocates
+the code and returns a handle to the loaded library. This function
+will only work on DLL's that do not have any imports, since we don't
+resolve import dependencies in this function.
+
+SEE ALSO:
+PE_getProcAddress, PE_freeLibrary
+****************************************************************************/
+PE_MODULE * PEAPI PE_loadLibrary(
+ const char *szDLLName,
+ ibool shared)
+{
+ PE_MODULE *hMod;
+
+#if (defined(__WINDOWS32__) || defined(__DRIVER__)) && defined(CHECKED)
+ if (!shared) {
+ PM_MODULE hInst;
+ InitLibC_t InitLibC;
+
+ /* For Win32 if are building checked libraries for debugging, we use
+ * the real Win32 DLL functions so that we can debug the resulting DLL
+ * files with the Win32 debuggers. Note that we can't do this if
+ * we need to load the files into a shared memory context.
+ */
+ if ((hInst = PM_loadLibrary(szDLLName)) == NULL) {
+ result = PE_fileNotFound;
+ return NULL;
+ }
+
+ /* Initialise the C runtime library for the loaded DLL */
+ result = PE_unableToInitLibC;
+ if ((InitLibC = (void*)PM_getProcAddress(hInst,"_InitLibC")) == NULL)
+ return NULL;
+ if (!InitLibC(&___imports,PM_getOSType()))
+ return NULL;
+
+ /* Allocate the PE_MODULE structure */
+ if ((hMod = PM_malloc(sizeof(*hMod))) == NULL)
+ return NULL;
+ hMod->text = (void*)hInst;
+ hMod->shared = -1;
+
+ /* DLL loaded successfully so return module handle */
+ result = PE_ok;
+ return hMod;
+ }
+ else
+#endif
+ {
+ FILE *f;
+ ulong size;
+
+ /* Attempt to open the file on disk */
+ if (shared < 0)
+ shared = 0;
+ if ((f = fopen(szDLLName,"rb")) == NULL) {
+ result = PE_fileNotFound;
+ return NULL;
+ }
+ hMod = PE_loadLibraryExt(f,0,&size,shared);
+ fclose(f);
+ return hMod;
+ }
+}
+
+/****************************************************************************
+DESCRIPTION:
+Loads a Portable Binary DLL into memory
+
+HEADER:
+peloader.h
+
+PARAMETERS:
+szDLLName - Name of the PE DLL library to load
+shared - True to load module into shared memory
+
+RETURNS:
+Handle to loaded PE DLL, or NULL on failure.
+
+REMARKS:
+This function is the same as the regular PE_loadLibrary function, except
+that it looks for the drivers in the MGL_ROOT/drivers directory or a
+/drivers directory relative to the current directory.
+
+SEE ALSO:
+PE_loadLibraryMGL, PE_getProcAddress, PE_freeLibrary
+****************************************************************************/
+PE_MODULE * PEAPI PE_loadLibraryMGL(
+ const char *szDLLName,
+ ibool shared)
+{
+#if !defined(__WIN32_VXD__) && !defined(__NT_DRIVER__)
+ PE_MODULE *hMod;
+#endif
+ char path[256] = "";
+
+ /* We look in the 'drivers' directory, optionally under the MGL_ROOT
+ * environment variable directory.
+ */
+#if !defined(__WIN32_VXD__) && !defined(__NT_DRIVER__)
+ if (getenv("MGL_ROOT")) {
+ strcpy(path,getenv("MGL_ROOT"));
+ PM_backslash(path);
+ }
+ strcat(path,"drivers");
+ PM_backslash(path);
+ strcat(path,szDLLName);
+ if ((hMod = PE_loadLibrary(path,shared)) != NULL)
+ return hMod;
+#endif
+ strcpy(path,"drivers");
+ PM_backslash(path);
+ strcat(path,szDLLName);
+ return PE_loadLibrary(path,shared);
+}
+
+/****************************************************************************
+DESCRIPTION:
+Gets a function address from a Portable Binary DLL
+
+HEADER:
+peloader.h
+
+PARAMETERS:
+hModule - Handle to a loaded PE DLL library
+szProcName - Name of the function to get the address of
+
+RETURNS:
+Pointer to the function, or NULL on failure.
+
+REMARKS:
+This function searches for the named, exported function in a loaded PE
+DLL library, and returns the address of the function. If the function is
+not found in the library, this function return NULL.
+
+SEE ALSO:
+PE_loadLibrary, PE_freeLibrary
+****************************************************************************/
+void * PEAPI PE_getProcAddress(
+ PE_MODULE *hModule,
+ const char *szProcName)
+{
+#if (defined(__WINDOWS32__) || defined(__DRIVER__)) && defined(CHECKED)
+ if (hModule->shared == -1)
+ return (void*)PM_getProcAddress(hModule->text,szProcName);
+ else
+#endif
+ {
+ uint i;
+ EXPORT_DIRECTORY *exports;
+ ulong funcOffset;
+ ulong *AddressTable;
+ ulong *NameTable;
+ ushort *OrdinalTable;
+ char *name;
+
+ /* Find the address of the export tables from the export section */
+ if (!hModule)
+ return NULL;
+ exports = (EXPORT_DIRECTORY*)(hModule->export + hModule->exportDir);
+ AddressTable = (ulong*)(hModule->export + exports->AddressTableRVA - hModule->exportBase);
+ NameTable = (ulong*)(hModule->export + exports->NameTableRVA - hModule->exportBase);
+ OrdinalTable = (ushort*)(hModule->export + exports->OrdinalTableRVA - hModule->exportBase);
+
+ /* Search the export name table to find the function name */
+ for (i = 0; i < exports->NumberOfNamePointers; i++) {
+ name = (char*)(hModule->export + NameTable[i] - hModule->exportBase);
+ if (strcmp(name,szProcName) == 0)
+ break;
+ }
+ if (i == exports->NumberOfNamePointers)
+ return NULL;
+ funcOffset = AddressTable[OrdinalTable[i]];
+ if (!funcOffset)
+ return NULL;
+ return (void*)(hModule->text + funcOffset - hModule->textBase);
+ }
+}
+
+/****************************************************************************
+DESCRIPTION:
+Frees a loaded Portable Binary DLL
+
+HEADER:
+peloader.h
+
+PARAMETERS:
+hModule - Handle to a loaded PE DLL library to free
+
+REMARKS:
+This function frees a loaded PE DLL library from memory.
+
+SEE ALSO:
+PE_getProcAddress, PE_loadLibrary
+****************************************************************************/
+void PEAPI PE_freeLibrary(
+ PE_MODULE *hModule)
+{
+ TerminateLibC_t TerminateLibC;
+
+#if (defined(__WINDOWS32__) || defined(__DRIVER__)) && defined(CHECKED)
+ if (hModule->shared == -1) {
+ /* Run the C runtime library exit code on module unload */
+ if ((TerminateLibC = (TerminateLibC_t)PM_getProcAddress(hModule->text,"_TerminateLibC")) != NULL)
+ TerminateLibC();
+ PM_freeLibrary(hModule->text);
+ PM_free(hModule);
+ }
+ else
+#endif
+ {
+ if (hModule) {
+ /* Run the C runtime library exit code on module unload */
+ if ((TerminateLibC = (TerminateLibC_t)PE_getProcAddress(hModule,"_TerminateLibC")) != NULL)
+ TerminateLibC();
+ if (hModule->shared)
+ PM_freeShared(hModule);
+ else
+ PM_free(hModule);
+ }
+ }
+}
+
+/****************************************************************************
+DESCRIPTION:
+Returns the error code for the last operation
+
+HEADER:
+peloader.h
+
+RETURNS:
+Error code for the last operation.
+
+SEE ALSO:
+PE_getProcAddress, PE_loadLibrary
+****************************************************************************/
+int PEAPI PE_getError(void)
+{
+ return result;
+}
+
diff --git a/board/MAI/bios_emulator/scitech/src/common/vesavbe.c b/board/MAI/bios_emulator/scitech/src/common/vesavbe.c
new file mode 100644
index 0000000000..2be57e2bd3
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/src/common/vesavbe.c
@@ -0,0 +1,1214 @@
+/****************************************************************************
+*
+* The SuperVGA Kit - UniVBE Software Development Kit
+*
+* ========================================================================
+*
+* 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: IBM PC Real Mode and 16/32 bit Protected Mode.
+*
+* Description: Module to implement a C callable interface to the standard
+* VESA VBE routines. You should rip out this module and use it
+* directly in your own applications, or you can use the
+* high level SDK functions.
+*
+* MUST be compiled in the LARGE or FLAT models.
+*
+****************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "vesavbe.h"
+#include "pmapi.h"
+#include "drvlib/os/os.h"
+
+/*---------------------------- Global Variables ---------------------------*/
+
+#define VBE_SUCCESS 0x004F
+#define MAX_LIN_PTRS 10
+
+static uint VESABuf_len = 1024;/* Length of the VESABuf buffer */
+static ibool haveRiva128; /* True if we have a Riva128 */
+static VBE_state defState = {0}; /* Default state buffer */
+static VBE_state *state = &defState; /* Pointer to current buffer */
+static int VBE_shared = 0;
+#ifndef REALMODE
+static char localBuf[512]; /* Global PM string translate buf */
+#define MAX_LOCAL_BUF &localBuf[511]
+#endif
+
+/*----------------------------- Implementation ----------------------------*/
+
+/* static function in WinDirect for passing 32-bit registers to BIOS */
+int PMAPI WD_int386(int intno, RMREGS *in, RMREGS *out);
+
+void VBEAPI VBE_init(void)
+/****************************************************************************
+*
+* Function: VBE_init
+*
+* Description: Initialises the VBE transfer buffer in real mode DC.memory.
+* This routine is called by the VESAVBE module every time
+* it needs to use the transfer buffer, so we simply allocate
+* it once and then return.
+*
+****************************************************************************/
+{
+ if (!state->VESABuf_ptr) {
+ /* Allocate a global buffer for communicating with the VESA VBE */
+ if ((state->VESABuf_ptr = PM_getVESABuf(&VESABuf_len, &state->VESABuf_rseg, &state->VESABuf_roff)) == NULL)
+ PM_fatalError("VESAVBE.C: Real mode memory allocation failed!");
+ }
+}
+
+void * VBEAPI VBE_getRMBuf(uint *len,uint *rseg,uint *roff)
+/****************************************************************************
+*
+* Function: VBE_getRMBuf
+*
+* Description: This function returns the location and length of the real
+* mode memory buffer for calling real mode functions.
+*
+****************************************************************************/
+{
+ *len = VESABuf_len;
+ *rseg = state->VESABuf_rseg;
+ *roff = state->VESABuf_roff;
+ return state->VESABuf_ptr;
+}
+
+void VBEAPI VBE_setStateBuffer(VBE_state *s)
+/****************************************************************************
+*
+* Function: VBE_setStateBuffer
+*
+* Description: This functions sets the internal state buffer for the
+* VBE module to the passed in buffer. By default the internal
+* global buffer is used, but you must use separate buffers
+* for each device in a multi-controller environment.
+*
+****************************************************************************/
+{
+ state = s;
+}
+
+void VBEAPI VBE_callESDI(RMREGS *regs, void *buffer, int size)
+/****************************************************************************
+*
+* Function: VBE_callESDI
+* Parameters: regs - Registers to load when calling VBE
+* buffer - Buffer to copy VBE info block to
+* size - Size of buffer to fill
+*
+* Description: Calls the VESA VBE and passes in a buffer for the VBE to
+* store information in, which is then copied into the users
+* buffer space. This works in protected mode as the buffer
+* passed to the VESA VBE is allocated in conventional
+* memory, and is then copied into the users memory block.
+*
+****************************************************************************/
+{
+ RMSREGS sregs;
+
+ if (!state->VESABuf_ptr)
+ PM_fatalError("You *MUST* call VBE_init() before you can call the VESAVBE.C module!");
+ sregs.es = (ushort)state->VESABuf_rseg;
+ regs->x.di = (ushort)state->VESABuf_roff;
+ memcpy(state->VESABuf_ptr, buffer, size);
+ PM_int86x(0x10, regs, regs, &sregs);
+ memcpy(buffer, state->VESABuf_ptr, size);
+}
+
+#ifndef REALMODE
+static char *VBE_copyStrToLocal(char *p,char *realPtr,char *max)
+/****************************************************************************
+*
+* Function: VBE_copyStrToLocal
+* Parameters: p - Flat model buffer to copy to
+* realPtr - Real mode pointer to copy
+* Returns: Pointer to the next byte after string
+*
+* Description: Copies the string from the real mode location pointed to
+* by 'realPtr' into the flat model buffer pointed to by
+* 'p'. We return a pointer to the next byte past the copied
+* string.
+*
+****************************************************************************/
+{
+ uchar *v;
+
+ v = PM_mapRealPointer((uint)((ulong)realPtr >> 16), (uint)((ulong)realPtr & 0xFFFF));
+ while (*v != 0 && p < max)
+ *p++ = *v++;
+ *p++ = 0;
+ return p;
+}
+
+static void VBE_copyShortToLocal(ushort *p,ushort *realPtr)
+/****************************************************************************
+*
+* Function: VBE_copyShortToLocal
+* Parameters: p - Flat model buffer to copy to
+* realPtr - Real mode pointer to copy
+*
+* Description: Copies the mode table from real mode memory to the flat
+* model buffer.
+*
+****************************************************************************/
+{
+ ushort *v;
+
+ v = PM_mapRealPointer((uint)((ulong)realPtr >> 16),(uint)((ulong)realPtr & 0xFFFF));
+ while (*v != 0xFFFF)
+ *p++ = *v++;
+ *p = 0xFFFF;
+}
+#endif
+
+int VBEAPI VBE_detectEXT(VBE_vgaInfo *vgaInfo,ibool forceUniVBE)
+/****************************************************************************
+*
+* Function: VBE_detect
+* Parameters: vgaInfo - Place to store the VGA information block
+* Returns: VBE version number, or 0 if not detected.
+*
+* Description: Detects if a VESA VBE is out there and functioning
+* correctly. If we detect a VBE interface we return the
+* VGAInfoBlock returned by the VBE and the VBE version number.
+*
+****************************************************************************/
+{
+ RMREGS regs;
+
+ regs.x.ax = 0x4F00; /* Get SuperVGA information */
+ if (forceUniVBE) {
+ regs.x.bx = 0x1234;
+ regs.x.cx = 0x4321;
+ }
+ else {
+ regs.x.bx = 0;
+ regs.x.cx = 0;
+ }
+ strncpy(vgaInfo->VESASignature,"VBE2",4);
+ VBE_callESDI(&regs, vgaInfo, sizeof(*vgaInfo));
+ if (regs.x.ax != VBE_SUCCESS)
+ return 0;
+ if (strncmp(vgaInfo->VESASignature,"VESA",4) != 0)
+ return 0;
+
+ /* Check for bogus BIOSes that return a VBE version number that is
+ * not correct, and fix it up. We also check the OemVendorNamePtr for a
+ * valid value, and if it is invalid then we also reset to VBE 1.2.
+ */
+ if (vgaInfo->VESAVersion >= 0x200 && vgaInfo->OemVendorNamePtr == 0)
+ vgaInfo->VESAVersion = 0x102;
+#ifndef REALMODE
+ /* Relocate all the indirect information (mode tables, OEM strings
+ * etc) from the low 1Mb memory region into a static buffer in
+ * our default data segment. We do this to insulate the application
+ * from mapping the strings from real mode to protected mode.
+ */
+ {
+ char *p,*p2;
+ p2 = VBE_copyStrToLocal(localBuf,vgaInfo->OemStringPtr,MAX_LOCAL_BUF);
+ vgaInfo->OemStringPtr = localBuf;
+ if (vgaInfo->VESAVersion >= 0x200) {
+ p = VBE_copyStrToLocal(p2,vgaInfo->OemVendorNamePtr,MAX_LOCAL_BUF);
+ vgaInfo->OemVendorNamePtr = p2;
+ p2 = VBE_copyStrToLocal(p,vgaInfo->OemProductNamePtr,MAX_LOCAL_BUF);
+ vgaInfo->OemProductNamePtr = p;
+ p = VBE_copyStrToLocal(p2,vgaInfo->OemProductRevPtr,MAX_LOCAL_BUF);
+ vgaInfo->OemProductRevPtr = p2;
+ VBE_copyShortToLocal((ushort*)p,vgaInfo->VideoModePtr);
+ vgaInfo->VideoModePtr = (ushort*)p;
+ }
+ else {
+ VBE_copyShortToLocal((ushort*)p2,vgaInfo->VideoModePtr);
+ vgaInfo->VideoModePtr = (ushort*)p2;
+ }
+ }
+#endif
+ state->VBEMemory = vgaInfo->TotalMemory * 64;
+
+ /* Check for Riva128 based cards since they have broken triple buffering
+ * and stereo support.
+ */
+ haveRiva128 = false;
+ if (vgaInfo->VESAVersion >= 0x300 &&
+ (strstr(vgaInfo->OemStringPtr,"NVidia") != NULL ||
+ strstr(vgaInfo->OemStringPtr,"Riva") != NULL)) {
+ haveRiva128 = true;
+ }
+
+ /* Check for Matrox G400 cards which claim to be VBE 3.0
+ * compliant yet they don't implement the refresh rate control
+ * functions.
+ */
+ if (vgaInfo->VESAVersion >= 0x300 && (strcmp(vgaInfo->OemProductNamePtr,"Matrox G400") == 0))
+ vgaInfo->VESAVersion = 0x200;
+ return (state->VBEVersion = vgaInfo->VESAVersion);
+}
+
+int VBEAPI VBE_detect(VBE_vgaInfo *vgaInfo)
+/****************************************************************************
+*
+* Function: VBE_detect
+* Parameters: vgaInfo - Place to store the VGA information block
+* Returns: VBE version number, or 0 if not detected.
+*
+* Description: Detects if a VESA VBE is out there and functioning
+* correctly. If we detect a VBE interface we return the
+* VGAInfoBlock returned by the VBE and the VBE version number.
+*
+****************************************************************************/
+{
+ return VBE_detectEXT(vgaInfo,false);
+}
+
+ibool VBEAPI VBE_getModeInfo(int mode,VBE_modeInfo *modeInfo)
+/****************************************************************************
+*
+* Function: VBE_getModeInfo
+* Parameters: mode - VBE mode to get information for
+* modeInfo - Place to store VBE mode information
+* Returns: True on success, false if function failed.
+*
+* Description: Obtains information about a specific video mode from the
+* VBE. You should use this function to find the video mode
+* you wish to set, as the new VBE 2.0 mode numbers may be
+* completely arbitrary.
+*
+****************************************************************************/
+{
+ RMREGS regs;
+ int bits;
+
+ regs.x.ax = 0x4F01; /* Get mode information */
+ regs.x.cx = (ushort)mode;
+ VBE_callESDI(&regs, modeInfo, sizeof(*modeInfo));
+ if (regs.x.ax != VBE_SUCCESS)
+ return false;
+ if ((modeInfo->ModeAttributes & vbeMdAvailable) == 0)
+ return false;
+
+ /* Map out triple buffer and stereo flags for NVidia Riva128
+ * chips.
+ */
+ if (haveRiva128) {
+ modeInfo->ModeAttributes &= ~vbeMdTripleBuf;
+ modeInfo->ModeAttributes &= ~vbeMdStereo;
+ }
+
+ /* Support old style RGB definitions for VBE 1.1 BIOSes */
+ bits = modeInfo->BitsPerPixel;
+ if (modeInfo->MemoryModel == vbeMemPK && bits > 8) {
+ modeInfo->MemoryModel = vbeMemRGB;
+ switch (bits) {
+ case 15:
+ modeInfo->RedMaskSize = 5;
+ modeInfo->RedFieldPosition = 10;
+ modeInfo->GreenMaskSize = 5;
+ modeInfo->GreenFieldPosition = 5;
+ modeInfo->BlueMaskSize = 5;
+ modeInfo->BlueFieldPosition = 0;
+ modeInfo->RsvdMaskSize = 1;
+ modeInfo->RsvdFieldPosition = 15;
+ break;
+ case 16:
+ modeInfo->RedMaskSize = 5;
+ modeInfo->RedFieldPosition = 11;
+ modeInfo->GreenMaskSize = 5;
+ modeInfo->GreenFieldPosition = 5;
+ modeInfo->BlueMaskSize = 5;
+ modeInfo->BlueFieldPosition = 0;
+ modeInfo->RsvdMaskSize = 0;
+ modeInfo->RsvdFieldPosition = 0;
+ break;
+ case 24:
+ modeInfo->RedMaskSize = 8;
+ modeInfo->RedFieldPosition = 16;
+ modeInfo->GreenMaskSize = 8;
+ modeInfo->GreenFieldPosition = 8;
+ modeInfo->BlueMaskSize = 8;
+ modeInfo->BlueFieldPosition = 0;
+ modeInfo->RsvdMaskSize = 0;
+ modeInfo->RsvdFieldPosition = 0;
+ break;
+ }
+ }
+
+ /* Convert the 32k direct color modes of VBE 1.2+ BIOSes to
+ * be recognised as 15 bits per pixel modes.
+ */
+ if (bits == 16 && modeInfo->RsvdMaskSize == 1)
+ modeInfo->BitsPerPixel = 15;
+
+ /* Fix up bogus BIOS'es that report incorrect reserved pixel masks
+ * for 32K color modes. Quite a number of BIOS'es have this problem,
+ * and this affects our OS/2 drivers in VBE fallback mode.
+ */
+ if (bits == 15 && (modeInfo->RsvdMaskSize != 1 || modeInfo->RsvdFieldPosition != 15)) {
+ modeInfo->RsvdMaskSize = 1;
+ modeInfo->RsvdFieldPosition = 15;
+ }
+ return true;
+}
+
+long VBEAPI VBE_getPageSize(VBE_modeInfo *mi)
+/****************************************************************************
+*
+* Function: VBE_getPageSize
+* Parameters: mi - Pointer to mode information block
+* Returns: Caculated page size in bytes rounded to correct boundary
+*
+* Description: Computes the page size in bytes for the specified mode
+* information block, rounded up to the appropriate boundary
+* (8k, 16k, 32k or 64k). Pages >= 64k in size are always
+* rounded to the nearest 64k boundary (so the start of a
+* page is always bank aligned).
+*
+****************************************************************************/
+{
+ long size;
+
+ size = (long)mi->BytesPerScanLine * (long)mi->YResolution;
+ if (mi->BitsPerPixel == 4) {
+ /* We have a 16 color video mode, so round up the page size to
+ * 8k, 16k, 32k or 64k boundaries depending on how large it is.
+ */
+
+ size = (size + 0x1FFFL) & 0xFFFFE000L;
+ if (size != 0x2000) {
+ size = (size + 0x3FFFL) & 0xFFFFC000L;
+ if (size != 0x4000) {
+ size = (size + 0x7FFFL) & 0xFFFF8000L;
+ if (size != 0x8000)
+ size = (size + 0xFFFFL) & 0xFFFF0000L;
+ }
+ }
+ }
+ else size = (size + 0xFFFFL) & 0xFFFF0000L;
+ return size;
+}
+
+ibool VBEAPI VBE_setVideoModeExt(int mode,VBE_CRTCInfo *crtc)
+/****************************************************************************
+*
+* Function: VBE_setVideoModeExt
+* Parameters: mode - SuperVGA video mode to set.
+* Returns: True if the mode was set, false if not.
+*
+* Description: Attempts to set the specified video mode. This version
+* includes support for the VBE/Core 3.0 refresh rate control
+* mechanism.
+*
+****************************************************************************/
+{
+ RMREGS regs;
+
+ if (state->VBEVersion < 0x200 && mode < 0x100) {
+ /* Some VBE implementations barf terribly if you try to set non-VBE
+ * video modes with the VBE set mode call. VBE 2.0 implementations
+ * must be able to handle this.
+ */
+ regs.h.al = (ushort)mode;
+ regs.h.ah = 0;
+ PM_int86(0x10,&regs,&regs);
+ }
+ else {
+ if (state->VBEVersion < 0x300 && (mode & vbeRefreshCtrl))
+ return false;
+ regs.x.ax = 0x4F02;
+ regs.x.bx = (ushort)mode;
+ if ((mode & vbeRefreshCtrl) && crtc)
+ VBE_callESDI(&regs, crtc, sizeof(*crtc));
+ else
+ PM_int86(0x10,&regs,&regs);
+ if (regs.x.ax != VBE_SUCCESS)
+ return false;
+ }
+ return true;
+}
+
+ibool VBEAPI VBE_setVideoMode(int mode)
+/****************************************************************************
+*
+* Function: VBE_setVideoMode
+* Parameters: mode - SuperVGA video mode to set.
+* Returns: True if the mode was set, false if not.
+*
+* Description: Attempts to set the specified video mode.
+*
+****************************************************************************/
+{
+ return VBE_setVideoModeExt(mode,NULL);
+}
+
+int VBEAPI VBE_getVideoMode(void)
+/****************************************************************************
+*
+* Function: VBE_getVideoMode
+* Returns: Current video mode
+*
+****************************************************************************/
+{
+ RMREGS regs;
+
+ regs.x.ax = 0x4F03;
+ PM_int86(0x10,&regs,&regs);
+ if (regs.x.ax != VBE_SUCCESS)
+ return -1;
+ return regs.x.bx;
+}
+
+ibool VBEAPI VBE_setBank(int window,int bank)
+/****************************************************************************
+*
+* Function: VBE_setBank
+* Parameters: window - Window to set
+* bank - Bank number to set window to
+* Returns: True on success, false on failure.
+*
+****************************************************************************/
+{
+ RMREGS regs;
+
+ regs.x.ax = 0x4F05;
+ regs.h.bh = 0;
+ regs.h.bl = window;
+ regs.x.dx = bank;
+ PM_int86(0x10,&regs,&regs);
+ return regs.x.ax == VBE_SUCCESS;
+}
+
+int VBEAPI VBE_getBank(int window)
+/****************************************************************************
+*
+* Function: VBE_setBank
+* Parameters: window - Window to read
+* Returns: Bank number for the window (-1 on failure)
+*
+****************************************************************************/
+{
+ RMREGS regs;
+
+ regs.x.ax = 0x4F05;
+ regs.h.bh = 1;
+ regs.h.bl = window;
+ PM_int86(0x10,&regs,&regs);
+ if (regs.x.ax != VBE_SUCCESS)
+ return -1;
+ return regs.x.dx;
+}
+
+ibool VBEAPI VBE_setPixelsPerLine(int pixelsPerLine,int *newBytes,
+ int *newPixels,int *maxScanlines)
+/****************************************************************************
+*
+* Function: VBE_setPixelsPerLine
+* Parameters: pixelsPerLine - Pixels per scanline
+* newBytes - Storage for bytes per line value set
+* newPixels - Storage for pixels per line value set
+* maxScanLines - Storage for maximum number of scanlines
+* Returns: True on success, false on failure
+*
+* Description: Sets the scanline length for the video mode to the specified
+* number of pixels per scanline. If you need more granularity
+* in TrueColor modes, use the VBE_setBytesPerLine routine
+* (only valid for VBE 2.0).
+*
+****************************************************************************/
+{
+ RMREGS regs;
+
+ regs.x.ax = 0x4F06;
+ regs.h.bl = 0;
+ regs.x.cx = pixelsPerLine;
+ PM_int86(0x10,&regs,&regs);
+ *newBytes = regs.x.bx;
+ *newPixels = regs.x.cx;
+ *maxScanlines = regs.x.dx;
+ return regs.x.ax == VBE_SUCCESS;
+}
+
+ibool VBEAPI VBE_setBytesPerLine(int bytesPerLine,int *newBytes,
+ int *newPixels,int *maxScanlines)
+/****************************************************************************
+*
+* Function: VBE_setBytesPerLine
+* Parameters: pixelsPerLine - Pixels per scanline
+* newBytes - Storage for bytes per line value set
+* newPixels - Storage for pixels per line value set
+* maxScanLines - Storage for maximum number of scanlines
+* Returns: True on success, false on failure
+*
+* Description: Sets the scanline length for the video mode to the specified
+* number of bytes per scanline (valid for VBE 2.0 only).
+*
+****************************************************************************/
+{
+ RMREGS regs;
+
+ regs.x.ax = 0x4F06;
+ regs.h.bl = 2;
+ regs.x.cx = bytesPerLine;
+ PM_int86(0x10,&regs,&regs);
+ *newBytes = regs.x.bx;
+ *newPixels = regs.x.cx;
+ *maxScanlines = regs.x.dx;
+ return regs.x.ax == VBE_SUCCESS;
+}
+
+ibool VBEAPI VBE_getScanlineLength(int *bytesPerLine,int *pixelsPerLine,
+ int *maxScanlines)
+/****************************************************************************
+*
+* Function: VBE_getScanlineLength
+* Parameters: bytesPerLine - Storage for bytes per scanline
+* pixelsPerLine - Storage for pixels per scanline
+* maxScanLines - Storage for maximum number of scanlines
+* Returns: True on success, false on failure
+*
+****************************************************************************/
+{
+ RMREGS regs;
+
+ regs.x.ax = 0x4F06;
+ regs.h.bl = 1;
+ PM_int86(0x10,&regs,&regs);
+ *bytesPerLine = regs.x.bx;
+ *pixelsPerLine = regs.x.cx;
+ *maxScanlines = regs.x.dx;
+ return regs.x.ax == VBE_SUCCESS;
+}
+
+ibool VBEAPI VBE_getMaxScanlineLength(int *maxBytes,int *maxPixels)
+/****************************************************************************
+*
+* Function: VBE_getMaxScanlineLength
+* Parameters: maxBytes - Maximum scanline width in bytes
+* maxPixels - Maximum scanline width in pixels
+* Returns: True if successful, false if function failed
+*
+****************************************************************************/
+{
+ RMREGS regs;
+
+ regs.x.ax = 0x4F06;
+ regs.h.bl = 3;
+ PM_int86(0x10,&regs,&regs);
+ *maxBytes = regs.x.bx;
+ *maxPixels = regs.x.cx;
+ return regs.x.ax == VBE_SUCCESS;
+}
+
+ibool VBEAPI VBE_setDisplayStart(int x,int y,ibool waitVRT)
+/****************************************************************************
+*
+* Function: VBE_setDisplayStart
+* Parameters: x,y - Position of the first pixel to display
+* waitVRT - True to wait for retrace, false if not
+* Returns: True if function was successful.
+*
+* Description: Sets the new starting display position to implement
+* hardware scrolling.
+*
+****************************************************************************/
+{
+ RMREGS regs;
+
+ regs.x.ax = 0x4F07;
+ if (waitVRT)
+ regs.x.bx = 0x80;
+ else regs.x.bx = 0x00;
+ regs.x.cx = x;
+ regs.x.dx = y;
+ PM_int86(0x10,&regs,&regs);
+ return regs.x.ax == VBE_SUCCESS;
+}
+
+ibool VBEAPI VBE_getDisplayStart(int *x,int *y)
+/****************************************************************************
+*
+* Function: VBE_getDisplayStart
+* Parameters: x,y - Place to store starting address value
+* Returns: True if function was successful.
+*
+****************************************************************************/
+{
+ RMREGS regs;
+
+ regs.x.ax = 0x4F07;
+ regs.x.bx = 0x01;
+ PM_int86(0x10,&regs,&regs);
+ *x = regs.x.cx;
+ *y = regs.x.dx;
+ return regs.x.ax == VBE_SUCCESS;
+}
+
+ibool VBEAPI VBE_setDisplayStartAlt(ulong startAddr,ibool waitVRT)
+/****************************************************************************
+*
+* Function: VBE_setDisplayStartAlt
+* Parameters: startAddr - 32-bit starting address in display memory
+* waitVRT - True to wait for vertical retrace, false if not
+* Returns: True if function was successful, false if not supported.
+*
+* Description: Sets the new starting display position to the specified
+* 32-bit display start address. Note that this function is
+* different the the version above, since it takes a 32-bit
+* byte offset in video memory as the starting address which
+* gives the programmer maximum control over the stat address.
+*
+* NOTE: Requires VBE/Core 3.0
+*
+****************************************************************************/
+{
+ RMREGS regs;
+
+ if (state->VBEVersion >= 0x300) {
+ regs.x.ax = 0x4F07;
+ regs.x.bx = waitVRT ? 0x82 : 0x02;
+ regs.e.ecx = startAddr;
+ PM_int86(0x10,&regs,&regs);
+ return regs.x.ax == VBE_SUCCESS;
+ }
+ return false;
+}
+
+int VBEAPI VBE_getDisplayStartStatus(void)
+/****************************************************************************
+*
+* Function: VBE_getDisplayStartStatus
+* Returns: 0 if last flip not occurred, 1 if already flipped
+* -1 if not supported
+*
+* Description: Returns the status of the previous display start request.
+* If this function is supported the programmer can implement
+* hardware triple buffering using this function.
+*
+* NOTE: Requires VBE/Core 3.0
+*
+****************************************************************************/
+{
+ RMREGS regs;
+
+ if (state->VBEVersion >= 0x300) {
+ regs.x.ax = 0x4F07;
+ regs.x.bx = 0x0004;
+ PM_int86(0x10,&regs,&regs);
+ if (regs.x.ax == VBE_SUCCESS)
+ return (regs.x.cx != 0);
+ }
+ return -1;
+}
+
+ibool VBEAPI VBE_enableStereoMode(void)
+/****************************************************************************
+*
+* Function: VBE_enableStereoMode
+* Returns: True if stereo mode enabled, false if not supported.
+*
+* Description: Puts the system into hardware stereo mode for LC shutter
+* glasses, where the display swaps between two display start
+* addresses every vertical retrace.
+*
+* NOTE: Requires VBE/Core 3.0
+*
+****************************************************************************/
+{
+ RMREGS regs;
+
+ if (state->VBEVersion >= 0x300) {
+ regs.x.ax = 0x4F07;
+ regs.x.bx = 0x0005;
+ PM_int86(0x10,&regs,&regs);
+ return regs.x.ax == VBE_SUCCESS;
+ }
+ return false;
+}
+
+ibool VBEAPI VBE_disableStereoMode(void)
+/****************************************************************************
+*
+* Function: VBE_disableStereoMode
+* Returns: True if stereo mode disabled, false if not supported.
+*
+* Description: Puts the system back into normal, non-stereo display mode
+* after having stereo mode enabled.
+*
+* NOTE: Requires VBE/Core 3.0
+*
+****************************************************************************/
+{
+ RMREGS regs;
+
+ if (state->VBEVersion >= 0x300) {
+ regs.x.ax = 0x4F07;
+ regs.x.bx = 0x0006;
+ PM_int86(0x10,&regs,&regs);
+ return regs.x.ax == VBE_SUCCESS;
+ }
+ return false;
+}
+
+ibool VBEAPI VBE_setStereoDisplayStart(ulong leftAddr,ulong rightAddr,
+ ibool waitVRT)
+/****************************************************************************
+*
+* Function: VBE_setStereoDisplayStart
+* Parameters: leftAddr - 32-bit start address for left image
+* rightAddr - 32-bit start address for right image
+* waitVRT - True to wait for vertical retrace, false if not
+* Returns: True if function was successful, false if not supported.
+*
+* Description: Sets the new starting display position to the specified
+* 32-bit display start address. Note that this function is
+* different the the version above, since it takes a 32-bit
+* byte offset in video memory as the starting address which
+* gives the programmer maximum control over the stat address.
+*
+* NOTE: Requires VBE/Core 3.0
+*
+****************************************************************************/
+{
+ RMREGS regs;
+
+ if (state->VBEVersion >= 0x300) {
+ regs.x.ax = 0x4F07;
+ regs.x.bx = waitVRT ? 0x83 : 0x03;
+ regs.e.ecx = leftAddr;
+ regs.e.edx = rightAddr;
+ PM_int86(0x10,&regs,&regs);
+ return regs.x.ax == VBE_SUCCESS;
+ }
+ return false;
+}
+
+ulong VBEAPI VBE_getClosestClock(ushort mode,ulong pixelClock)
+/****************************************************************************
+*
+* Function: VBE_getClosestClock
+* Parameters: mode - VBE mode to be used (include vbeLinearBuffer)
+* pixelClock - Desired pixel clock
+* Returns: Closest pixel clock to desired clock (-1 if not supported)
+*
+* Description: Calls the VBE/Core 3.0 interface to determine the closest
+* pixel clock to the requested value. The BIOS will always
+* search for a pixel clock that is no more than 1% below the
+* requested clock or somewhere higher than the clock. If the
+* clock is higher note that it may well be many Mhz higher
+* that requested and the application will have to check that
+* the returned value is suitable for it's needs. This function
+* returns the actual pixel clock that will be programmed by
+* the hardware.
+*
+* Note that if the pixel clock will be used with a linear
+* framebuffer mode, make sure you pass in the linear
+* framebuffer flag to this function.
+*
+* NOTE: Requires VBE/Core 3.0
+*
+****************************************************************************/
+{
+ RMREGS regs;
+
+ if (state->VBEVersion >= 0x300) {
+ regs.x.ax = 0x4F0B;
+ regs.h.bl = 0x00;
+ regs.e.ecx = pixelClock;
+ regs.x.dx = mode;
+ PM_int86(0x10,&regs,&regs);
+ if (regs.x.ax == VBE_SUCCESS)
+ return regs.e.ecx;
+ }
+ return -1;
+}
+
+ibool VBEAPI VBE_setDACWidth(int width)
+/****************************************************************************
+*
+* Function: VBE_setDACWidth
+* Parameters: width - Width to set the DAC to
+* Returns: True on success, false on failure
+*
+****************************************************************************/
+{
+ RMREGS regs;
+
+ regs.x.ax = 0x4F08;
+ regs.h.bl = 0x00;
+ regs.h.bh = width;
+ PM_int86(0x10,&regs,&regs);
+ return regs.x.ax == VBE_SUCCESS;
+}
+
+int VBEAPI VBE_getDACWidth(void)
+/****************************************************************************
+*
+* Function: VBE_getDACWidth
+* Returns: Current width of the palette DAC
+*
+****************************************************************************/
+{
+ RMREGS regs;
+
+ regs.x.ax = 0x4F08;
+ regs.h.bl = 0x01;
+ PM_int86(0x10,&regs,&regs);
+ if (regs.x.ax != VBE_SUCCESS)
+ return -1;
+ return regs.h.bh;
+}
+
+ibool VBEAPI VBE_setPalette(int start,int num,VBE_palette *pal,ibool waitVRT)
+/****************************************************************************
+*
+* Function: VBE_setPalette
+* Parameters: start - Starting palette index to program
+* num - Number of palette indexes to program
+* pal - Palette buffer containing values
+* waitVRT - Wait for vertical retrace flag
+* Returns: True on success, false on failure
+*
+* Description: Sets a block of palette registers by calling the VBE 2.0
+* BIOS. This function will fail on VBE 1.2 implementations.
+*
+****************************************************************************/
+{
+ RMREGS regs;
+
+ regs.x.ax = 0x4F09;
+ regs.h.bl = waitVRT ? 0x80 : 0x00;
+ regs.x.cx = num;
+ regs.x.dx = start;
+ VBE_callESDI(&regs, pal, sizeof(VBE_palette) * num);
+ return regs.x.ax == VBE_SUCCESS;
+}
+
+void * VBEAPI VBE_getBankedPointer(VBE_modeInfo *modeInfo)
+/****************************************************************************
+*
+* Function: VBE_getBankedPointer
+* Parameters: modeInfo - Mode info block for video mode
+* Returns: Selector to the linear framebuffer (0 on failure)
+*
+* Description: Returns a near pointer to the VGA framebuffer area.
+*
+****************************************************************************/
+{
+ /* We just map the pointer every time, since the pointer will always
+ * be in real mode memory, so we wont actually be mapping any real
+ * memory.
+ *
+ * NOTE: We cannot currently map a near pointer to the banked frame
+ * buffer for Watcom Win386, so we create a 16:16 far pointer to
+ * the video memory. All the assembler code will render to the
+ * video memory by loading the selector rather than using a
+ * near pointer.
+ */
+ ulong seg = (ushort)modeInfo->WinASegment;
+ if (seg != 0) {
+ if (seg == 0xA000)
+ return (void*)PM_getA0000Pointer();
+ else
+ return (void*)PM_mapPhysicalAddr(seg << 4,0xFFFF,true);
+ }
+ return NULL;
+}
+
+#ifndef REALMODE
+
+void * VBEAPI VBE_getLinearPointer(VBE_modeInfo *modeInfo)
+/****************************************************************************
+*
+* Function: VBE_getLinearPointer
+* Parameters: modeInfo - Mode info block for video mode
+* Returns: Selector to the linear framebuffer (0 on failure)
+*
+* Description: Returns a near pointer to the linear framebuffer for the video
+* mode.
+*
+****************************************************************************/
+{
+ static ulong physPtr[MAX_LIN_PTRS] = {0};
+ static void *linPtr[MAX_LIN_PTRS] = {0};
+ static int numPtrs = 0;
+ int i;
+
+ /* Search for an already mapped pointer */
+ for (i = 0; i < numPtrs; i++) {
+ if (physPtr[i] == modeInfo->PhysBasePtr)
+ return linPtr[i];
+ }
+ if (numPtrs < MAX_LIN_PTRS) {
+ physPtr[numPtrs] = modeInfo->PhysBasePtr;
+ linPtr[numPtrs] = PM_mapPhysicalAddr(modeInfo->PhysBasePtr,(state->VBEMemory * 1024L)-1,true);
+ return linPtr[numPtrs++];
+ }
+ return NULL;
+}
+
+static void InitPMCode(void)
+/****************************************************************************
+*
+* Function: InitPMCode - 32 bit protected mode version
+*
+* Description: Finds the address of and relocates the protected mode
+* code block from the VBE 2.0 into a local memory block. The
+* memory block is allocated with malloc() and must be freed
+* with VBE_freePMCode() after graphics processing is complete.
+*
+* Note that this buffer _must_ be recopied after each mode set,
+* as the routines will change depending on the underlying
+* video mode.
+*
+****************************************************************************/
+{
+ RMREGS regs;
+ RMSREGS sregs;
+ uchar *code;
+ int pmLen;
+
+ if (!state->pmInfo && state->VBEVersion >= 0x200) {
+ regs.x.ax = 0x4F0A;
+ regs.x.bx = 0;
+ PM_int86x(0x10,&regs,&regs,&sregs);
+ if (regs.x.ax != VBE_SUCCESS)
+ return;
+ if (VBE_shared)
+ state->pmInfo = PM_mallocShared(regs.x.cx);
+ else
+ state->pmInfo = PM_malloc(regs.x.cx);
+ if (state->pmInfo == NULL)
+ return;
+ state->pmInfo32 = state->pmInfo;
+ pmLen = regs.x.cx;
+
+ /* Relocate the block into our local data segment */
+ code = PM_mapRealPointer(sregs.es,regs.x.di);
+ memcpy(state->pmInfo,code,pmLen);
+
+ /* Now do a sanity check on the information we recieve to ensure
+ * that is is correct. Some BIOS return totally bogus information
+ * in here (Matrox is one)! Under DOS this works OK, but under OS/2
+ * we are screwed.
+ */
+ if (state->pmInfo->setWindow >= pmLen ||
+ state->pmInfo->setDisplayStart >= pmLen ||
+ state->pmInfo->setPalette >= pmLen ||
+ state->pmInfo->IOPrivInfo >= pmLen) {
+ if (VBE_shared)
+ PM_freeShared(state->pmInfo);
+ else
+ PM_free(state->pmInfo);
+ state->pmInfo32 = state->pmInfo = NULL;
+ return;
+ }
+
+ /* Read the IO priveledge info and determine if we need to
+ * pass a selector to MMIO registers to the bank switch code.
+ * Since we no longer support selector allocation, we no longer
+ * support this mechanism so we disable the protected mode
+ * interface in this case.
+ */
+ if (state->pmInfo->IOPrivInfo && !state->MMIOSel) {
+ ushort *p = (ushort*)((uchar*)state->pmInfo + state->pmInfo->IOPrivInfo);
+ while (*p != 0xFFFF)
+ p++;
+ p++;
+ if (*p != 0xFFFF)
+ VBE_freePMCode();
+ }
+ }
+}
+
+void * VBEAPI VBE_getSetBank(void)
+/****************************************************************************
+*
+* Function: VBE_getSetBank
+* Returns: Pointer to the 32 VBE 2.0 bit bank switching routine.
+*
+****************************************************************************/
+{
+ if (state->VBEVersion >= 0x200) {
+ InitPMCode();
+ if (state->pmInfo)
+ return (uchar*)state->pmInfo + state->pmInfo->setWindow;
+ }
+ return NULL;
+}
+
+void * VBEAPI VBE_getSetDisplayStart(void)
+/****************************************************************************
+*
+* Function: VBE_getSetDisplayStart
+* Returns: Pointer to the 32 VBE 2.0 bit CRT start address routine.
+*
+****************************************************************************/
+{
+ if (state->VBEVersion >= 0x200) {
+ InitPMCode();
+ if (state->pmInfo)
+ return (uchar*)state->pmInfo + state->pmInfo->setDisplayStart;
+ }
+ return NULL;
+}
+
+void * VBEAPI VBE_getSetPalette(void)
+/****************************************************************************
+*
+* Function: VBE_getSetPalette
+* Returns: Pointer to the 32 VBE 2.0 bit palette programming routine.
+*
+****************************************************************************/
+{
+ if (state->VBEVersion >= 0x200) {
+ InitPMCode();
+ if (state->pmInfo)
+ return (uchar*)state->pmInfo + state->pmInfo->setPalette;
+ }
+ return NULL;
+}
+
+void VBEAPI VBE_freePMCode(void)
+/****************************************************************************
+*
+* Function: VBE_freePMCode
+*
+* Description: This routine frees the protected mode code blocks that
+* we copied from the VBE 2.0 interface. This routine must
+* be after you have finished graphics processing to free up
+* the memory occupied by the routines. This is necessary
+* because the PM info memory block must be re-copied after
+* every video mode set from the VBE 2.0 implementation.
+*
+****************************************************************************/
+{
+ if (state->pmInfo) {
+ if (VBE_shared)
+ PM_freeShared(state->pmInfo);
+ else
+ PM_free(state->pmInfo);
+ state->pmInfo = NULL;
+ state->pmInfo32 = NULL;
+ }
+}
+
+void VBEAPI VBE_sharePMCode(void)
+/****************************************************************************
+*
+* Function: VBE_sharePMCode
+*
+* Description: Enables internal sharing of the PM code buffer for OS/2.
+*
+****************************************************************************/
+{
+ VBE_shared = true;
+}
+
+/* Set of code stubs used to build the final bank switch code */
+
+#define VBE20_adjustOffset 7
+
+static uchar VBE20A_bankFunc32_Start[] = {
+ 0x53,0x51, /* push ebx,ecx */
+ 0x8B,0xD0, /* mov edx,eax */
+ 0x33,0xDB, /* xor ebx,ebx */
+ 0xB1,0x00, /* mov cl,0 */
+ 0xD2,0xE2, /* shl dl,cl */
+ };
+
+static uchar VBE20_bankFunc32_End[] = {
+ 0x59,0x5B, /* pop ecx,ebx */
+ };
+
+static uchar bankFunc32[100];
+
+#define copy(p,b,a) memcpy(b,a,sizeof(a)); (p) = (b) + sizeof(a)
+
+ibool VBEAPI VBE_getBankFunc32(int *codeLen,void **bankFunc,int dualBanks,
+ int bankAdjust)
+/****************************************************************************
+*
+* Function: VBE_getBankFunc32
+* Parameters: codeLen - Place to store length of code
+* bankFunc - Place to store pointer to bank switch code
+* dualBanks - True if dual banks are in effect
+* bankAdjust - Bank shift adjustment factor
+* Returns: True on success, false if not compatible.
+*
+* Description: Creates a local 32 bit bank switch function from the
+* VBE 2.0 bank switch code that is compatible with the
+* virtual flat framebuffer devices (does not have a return
+* instruction at the end and takes the bank number in EAX
+* not EDX). Note that this 32 bit code cannot include int 10h
+* instructions, so we can only do this if we have VBE 2.0
+* or later.
+*
+* Note that we need to know the length of the 32 bit
+* bank switch function, which the standard VBE 2.0 spec
+* does not provide. In order to support this we have
+* extended the VBE 2.0 state->pmInfo structure in UniVBE 5.2 in a
+* way to support this, and we hope that this will become
+* a VBE 2.0 ammendment.
+*
+* Note also that we cannot run the linear framebuffer
+* emulation code with bank switching routines that require
+* a selector to the memory mapped registers passed in ES.
+*
+****************************************************************************/
+{
+ int len;
+ uchar *code;
+ uchar *p;
+
+ InitPMCode();
+ if (state->VBEVersion >= 0x200 && state->pmInfo32 && !state->MMIOSel) {
+ code = (uchar*)state->pmInfo32 + state->pmInfo32->setWindow;
+ if (state->pmInfo32->extensionSig == VBE20_EXT_SIG)
+ len = state->pmInfo32->setWindowLen-1;
+ else {
+ /* We are running on a system without the UniVBE 5.2 extension.
+ * We do as best we can by scanning through the code for the
+ * ret function to determine the length. This is not foolproof,
+ * but is the best we can do.
+ */
+ p = code;
+ while (*p != 0xC3)
+ p++;
+ len = p - code;
+ }
+ if ((len + sizeof(VBE20A_bankFunc32_Start) + sizeof(VBE20_bankFunc32_End)) > sizeof(bankFunc32))
+ PM_fatalError("32-bit bank switch function too long!");
+ copy(p,bankFunc32,VBE20A_bankFunc32_Start);
+ memcpy(p,code,len);
+ p += len;
+ copy(p,p,VBE20_bankFunc32_End);
+ *codeLen = p - bankFunc32;
+ bankFunc32[VBE20_adjustOffset] = (uchar)bankAdjust;
+ *bankFunc = bankFunc32;
+ return true;
+ }
+ return false;
+}
+
+#endif
OpenPOWER on IntegriCloud