diff options
Diffstat (limited to 'private/mvdm/softpc.new/host/src/nt_reset.c')
-rw-r--r-- | private/mvdm/softpc.new/host/src/nt_reset.c | 422 |
1 files changed, 422 insertions, 0 deletions
diff --git a/private/mvdm/softpc.new/host/src/nt_reset.c b/private/mvdm/softpc.new/host/src/nt_reset.c new file mode 100644 index 000000000..8b004fe9e --- /dev/null +++ b/private/mvdm/softpc.new/host/src/nt_reset.c @@ -0,0 +1,422 @@ +/* + * SoftPC Revision 3.0 + * + * Title : NT reset functions + * + * Description : This function is called by the standard reset function to + * set up any specific devices used by the Sun4 implementation. + * + * Author : SoftPC team + * + * Notes : + */ +#include <nt.h> +#include <ntrtl.h> +#include <nturtl.h> +#include <windows.h> +#include <vdm.h> +#include <vdmapi.h> +#include "insignia.h" +#include "host_def.h" + +#ifdef X86GFX +#include <ntddvdeo.h> +#endif + +#include <sys\types.h> +#include "xt.h" +#include "sas.h" +#include "bios.h" +#include "keyboard.h" +#include "gmi.h" +#include "gfx_upd.h" +#include "gvi.h" +#include "mouse_io.h" +#include "error.h" +#include "config.h" +#include "host.h" +#include "timer.h" +#include "idetect.h" +#include CpuH +#include "debug.h" +#include <stdio.h> +#include <stdlib.h> +#include <conapi.h> +#include "nt_timer.h" +#include "nt_graph.h" +#include "ntcheese.h" +#include "nt_uis.h" +#include "nt_com.h" +#include "nt_reset.h" +#include "nt_event.h" +#include "nt_fulsc.h" +#include "nt_eoi.h" +#include "video.h" +#include "nt_thred.h" + + +VOID DeleteConfigFiles(VOID); // from command.lib +void ShowStartGlass (DWORD); // private user api + +extern VIDEOFUNCS nt_video_funcs; +extern KEYBDFUNCS nt_keybd_funcs; +extern HOSTMOUSEFUNCS the_mouse_funcs; + +#ifndef MONITOR +extern WORD BWVKey; +extern char achES[]; +#endif + +#ifdef MONITOR +extern VOID AddTempIVTFixups(VOID); +#endif + +extern IU8 lcifo[]; + +/* + * Exported Data + */ +GLOBAL BOOL VDMForWOW = FALSE; +GLOBAL BOOL fSeparateWow = FALSE; // TRUE if CREATE_SEPARATE_WOW_VDM flag +GLOBAL HANDLE MainThread; +GLOBAL ULONG DosSessionId = 0; +GLOBAL UINT VdmExitCode = 0xFF; +GLOBAL BOOL StreamIoSwitchOn = TRUE; + +/* + * + * ============================================================================ + * External functions + * =========================================================================== + * = + */ + +void +host_reset() +{ + +#ifdef X86GFX + InitDetect(); +#endif + + if (host_stream_io_enabled) { + sc.ScreenState = STREAM_IO; + ConsoleInitialised = TRUE; + } + else { + + ConsoleInit(); + MouseAttachMenuItem(sc.ActiveOutputBufferHandle); + /*::::::::::::::::::::::::::::::::::::::::::::::::: Enable idle detect */ + } + +#ifdef MONITOR + /* Borrow the end of this routine to add temp code that hooks certain + * Ints back to the VDM and not into the native BIOS. These will only + * be active for the DOSEM initialisation ie until keyboard.sys can + * come along and do it properly. We must do this though as some real + * BIOS' can hang on certain initialisation functions. eg Dec 486/50 + * will hang on printer init as it is waiting for a responce from a + * 'private' port. + */ + AddTempIVTFixups(); +#endif /* MONITOR */ + + + // + // Let the heartbeat thread run and release the ica lock, + // on x86 needed now, for fullscreen switch notification. + // + ResumeThread(ThreadInfo.HeartBeat.Handle); + +#ifdef MONITOR + WaitIcaLockFullyInitialized(); +#endif + + host_ica_unlock(); + +#ifdef HUNTER + IDLE_ctl(FALSE); /* makes Trapper too slow */ +#else /* ! ( HUNTER ) */ + if (sc.ScreenState == FULLSCREEN) // initialised in ConsoleInit() + IDLE_ctl(FALSE); + else + IDLE_ctl(TRUE); // can't idle detect fullscreen + + host_idle_init(); // host sleep event creation +#endif /* HUNTER */ + + +} + + +/* + * ========================================================================= + * + * FUNCTION : host_applInit + * + * PURPOSE : Sets up the keyboard, lpt and error panels. + * + * RETURNED STATUS : None. + * + * DESCRIPTION : Called from main.c. The keyboard and other GWI pointer + * sets are initialised here. The command line arguments are + * parsed for those flags that need processing early (ie before + * config() is called). + * + * ======================================================================= + */ +#define HOUR_BOOST_FOR_WOW 20*1000 // 20 seconds + +void host_applInit(int argc,char *argv[]) +{ + char *psz; + int temp_argc = argc; + char **temp_argv = argv; + BOOL bSwitchF = FALSE; + + working_video_funcs = &nt_video_funcs; + working_keybd_funcs = &nt_keybd_funcs; + working_mouse_funcs = &the_mouse_funcs; + + // check that someone has'nt started ntvdm from the cmd prompt. In such a + // case we should kill ntvdm as we support it only when createprocess + // executes it. We are checking a this with the argc although lots of + // fancy things can be done. If a user is bent upon running ntvdm directly + // they can always fool this code. We are only checking the presence of + // -f switch. + + +// Check if the VDM Is for WOW +// Check is for new console session + while (--temp_argc > 0) { + psz = *++temp_argv; + if (*psz == '-' || *psz == '/') { + psz++; + + if (*psz == 'f') { + bSwitchF = TRUE; + continue; + } +#ifndef MONITOR + // + // Check for windowed graphics resize + // + if (*psz == 'E') { + int i; + + i = strlen(achES); + if (!strncmp(psz, achES, i) && strlen(psz) == (size_t)i+2) { + psz += i; + BWVKey = (WORD)strtoul(psz, NULL, 16); + if (BWVKey > 0xFE) + BWVKey = 0; + } + } + else +#endif + if(tolower(*psz) == 'w'){ + VDMForWOW = TRUE; + if (bSwitchF) + break; + } + else if (*psz == 'o'){ + StreamIoSwitchOn = FALSE; + } + else if (*psz++ == 'i' && *psz) { + DosSessionId = strtoul(psz, NULL, 16); + } + + } + } + + + if (bSwitchF == FALSE) + ExitProcess (0); + + // If VDM Is for WOW keep showing the glass + if (VDMForWOW) { + if (DosSessionId) { + fSeparateWow = TRUE; + } + + ShowStartGlass (HOUR_BOOST_FOR_WOW); + StreamIoSwitchOn = FALSE; + } + else if (StreamIoSwitchOn) + enable_stream_io(); + + /* + * Get a handle to the main thread so it can be suspended during + * hand-shaking. + */ + DuplicateHandle(GetCurrentProcess(), + GetCurrentThread(), + GetCurrentProcess(), + &MainThread, + (DWORD) 0, + FALSE, + (DWORD) DUPLICATE_SAME_ACCESS); + + InitializeIcaLock(); + host_ica_lock(); + + init_host_uis(); /* console setup */ + nt_start_event_thread(); /* Start event processing thread */ +} + + +/* + * ========================================================================= + * + * FUNCTION : host_applClose + * + * PURPOSE : The last chance to close down. + * + * RETURNED STATUS : None. + * + * DESCRIPTION : Called from main.c. + * + * + * ======================================================================= + */ + +void +host_applClose(void) +{ + nt_remove_event_thread(); + InitSound(FALSE); + TerminateHeartBeat(); + + GfxCloseDown(); // ensure video section destroyed +#ifdef X86GFX + if (sc.ScreenBufHandle) + CloseHandle(sc.ScreenBufHandle); +#endif // X86GFX + + + + host_lpt_close_all(); /* Close all open printer ports */ + host_com_close_all(); /* Close all open comms ports */ + MouseDetachMenuItem(TRUE); /* Force the menu item away on quit */ + + DeleteConfigFiles(); // make sure temp config files are deleted +} + + + + +/*::::::::::::::::::::::::::::::::::::::::::::::::::: Closedown the VDM */ + + +/* + * host_terminate + * + * This function does not return it exits + * Most of softpc has been shutdown by the time this + * code is reached, as host_applClose has already been + * invoked. + * + */ +void host_terminate(void) +{ + +#ifdef HUNTER + if (TrapperDump != (HANDLE) -1) + CloseHandle(TrapperDump); +#endif /* HUNTER */ + + if(VDMForWOW) + ExitVDM(VDMForWOW,(ULONG)-1); // Kill everything for WOW VDM + else + ExitVDM(FALSE,0); + + ExitProcess(VdmExitCode); +} + + + +/* TerminateVDM - used by host to initiate shutdown + * + * Request to start shutting down + * + */ +VOID TerminateVDM(void) +{ + + /* + * Do base sepcific cleanup thru terminate(). + * NOTE: terminate will call host_applClose and host_terminate + * after doing base cleanup + */ + terminate(); +} + + + + + +#ifdef NOTUSEDNOTUSED +void +manager_files_init() +{ + + assert0(NO,"manager_files_init stubbed\n"); +} + + +#ifndef PROD +/* + * ========================================================================= + * + * FUNCTION : host_symb_debug_init + * + * PURPOSE : Does nothing + * + * RETURNED STATUS : None. + * + * DESCRIPTION : Called from main.c. + * + * + * ======================================================================= + */ + +void +host_symb_debug_init IFN1(char *, name) +{ +} +#endif /* nPROD */ + + +void +host_supply_dfa_filename IFN1(char *, filename) + +{ +} + +static BOOL bool_dummy_func() {} +static SHORT short_dummy_func() {} +static VOID void_dummy_func() {} + + +ERRORFUNCS dummy_error_funcs = +{ + + short_dummy_func, + short_dummy_func, + short_dummy_func + +}; + +KEYBDFUNCS dummy_keybd_funcs = +{ + + void_dummy_func, + void_dummy_func, + void_dummy_func, + void_dummy_func, + void_dummy_func, + void_dummy_func + +}; +#endif |