//***************************************************************************** // // (C) Copyright MICROSOFT Corp., 1988-1993 // // Title: minivdd.inc - VDD definitions for other VxD's and multiple VDD's // // Version: 4.00 // // Date: // // Author: FredE for the Mini-VDD interface. Adapted from VDD.INC in // the general include area. Added services are ONLY for the // use of the Mini-VDD and should therefore not be documented. // //----------------------------------------------------------------------------- //============================================================================= #ifndef _MINIVDD_H_ #define _MINIVDD_H_ #ifndef Not_VxD /*XLATOFF*/ #define VDD_Service Declare_Service #pragma warning (disable:4003) // turn off not enough params warning /*XLATON*/ #ifdef MINIVDD #ifdef NEC_98 /*MACROS*/ // // VDD protect mode services for other devices and VMM (Get_Version must be first). // Only define these if we're assembling either the "main" VDD or one of the // mini-VDD's. Don't define this if we're assembling a display driver or other // caller of the MiniVDD stuff: // Begin_Service_Table(VDD) VDD_Service( VDD_Get_Version ) // Get version number and ID string ptr VDD_Service( VDD_PIF_State ) // Pass video PIF bits to VDD VDD_Service( VDD_Get_GrabRtn ) // Get routine addr for video grab VDD_Service( VDD_Hide_Cursor ) // Hide cursor when display is windowed VDD_Service( VDD_Set_VMType ) // Set VM type(windowed, bckgrnd, excl) VDD_Service( VDD_Get_ModTime ) // Return system time of last mod VDD_Service( VDD_Set_HCurTrk ) // Track horiz cursor movement in window VDD_Service( VDD_Msg_ClrScrn ) // Clear screen for sysmodal message VDD_Service( VDD_Msg_ForColor ) // Set Msg_TextOut forground color VDD_Service( VDD_Msg_BakColor ) // Set Msg_TextOut background color VDD_Service( VDD_Msg_TextOut ) // Output a string VDD_Service( VDD_Msg_SetCursPos ) // Set cursor position VDD_Service( VDD_Query_Access ) // Is it OK to access video now? VDD_Service( VDD_Check_Update_Soon ) // User action may update screen VDD_Service( VDD_Get_Mini_Dispatch_Table) // Get addr of dispatch table to mini-VDD VDD_Service( VDD_Register_Virtual_Port ) // Mini-VDD asks us to setup I/O trap VDD_Service( VDD_Get_VM_Info ) // Returns CRTC owner and MemC owners // and other special VM handles VDD_Service( VDD_Get_Special_VM_IDs ) // returns planar & msg mode IDs VDD_Service( VDD_Register_Extra_Screen_Selector ) // allows display driver to use second // screen selector for block moves VDD_Service( VDD_Takeover_VGA_Port ) // allows MiniVDD to takeover a port // in range 3C0H through 3DFH VDD_Service( VDD_Get_DISPLAYINFO ) // get DISPLAYINFO data structure VDD_Service( VDD_Do_Physical_IO ) // perform physical I/O for trapped port VDD_Service( VDD_Register_Mini_VDD ) VDD_Service( VDD_Install_IO_Handler ) VDD_Service( VDD_Install_Mult_IO_Handlers ) VDD_Service( VDD_Enable_Local_Trapping ) VDD_Service( VDD_Disable_Local_Trapping ) VDD_Service( VDD_Trap_Suspend ) VDD_Service( Test_Vid_VM_Handle ) VDD_Service( VDD_Set_Core_Graphics ) VDD_Service( VDD_Load_AccBIOS ) VDD_Service( VDD_Map_AccBIOS ) VDD_Service( VDD_Map_VRAM ) VDD_Service( VDD_EnableDevice ) End_Service_Table(VDD) /*ENDMACROS*/ #else /*NEC_98*/ /*MACROS*/ // // VDD protect mode services for other devices and VMM (Get_Version must be first). // Only define these if we're assembling either the "main" VDD or one of the // mini-VDD's. Don't define this if we're assembling a display driver or other // caller of the MiniVDD stuff: // Begin_Service_Table(VDD) VDD_Service( VDD_Get_Version )// Get version number and ID string ptr VDD_Service( VDD_PIF_State )// Pass video PIF bits to VDD VDD_Service( VDD_Get_GrabRtn )// Get routine addr for video grab VDD_Service( VDD_Hide_Cursor )// Hide cursor when display is windowed VDD_Service( VDD_Set_VMType )// Set VM type(windowed, bckgrnd, excl) VDD_Service( VDD_Get_ModTime )// Return system time of last mod VDD_Service( VDD_Set_HCurTrk )// Track horiz cursor movement in window VDD_Service( VDD_Msg_ClrScrn )// Clear screen for sysmodal message VDD_Service( VDD_Msg_ForColor )// Set Msg_TextOut forground color VDD_Service( VDD_Msg_BakColor )// Set Msg_TextOut background color VDD_Service( VDD_Msg_TextOut )// Output a string VDD_Service( VDD_Msg_SetCursPos )// Set cursor position VDD_Service( VDD_Query_Access )// Is it OK to access video now? VDD_Service( VDD_Check_Update_Soon )// User action may update screen VDD_Service( VDD_Get_Mini_Dispatch_Table )// Get addr of dispatch table to mini-VDD VDD_Service( VDD_Register_Virtual_Port )// Mini-VDD asks us to setup I/O trap VDD_Service( VDD_Get_VM_Info )// Returns CRTC owner and MemC owners // and other special VM handles VDD_Service( VDD_Get_Special_VM_IDs )// returns planar & msg mode IDs VDD_Service( VDD_Register_Extra_Screen_Selector ) // allows display driver to use second // screen selector for block moves VDD_Service( VDD_Takeover_VGA_Port ) // allows MiniVDD to takeover a port // in range 3C0H through 3DFH VDD_Service( VDD_Get_DISPLAYINFO ) // get DISPLAYINFO data structure VDD_Service( VDD_Do_Physical_IO ) // perform physical I/O for trapped port VDD_Service( VDD_Set_Sleep_Flag_Addr ) // when display driver can't be interrupted VDD_Service( VDD_EnableDevice ) End_Service_Table(VDD) /*ENDMACROS*/ #endif /*NEC_98*/ #endif /*MINIVDD*/ /*XLATOFF*/ #pragma warning (default:4003) // turn off not enough params warning /*XLATON*/ #define VDD_VerNum 0x0400 // version 4.00 #define VDD_MinVerNum 0x030A // supports down to 3.10 //*************** // PIF_State service definitions // // These definitions cannot change without changing the PIF editor!!! // #ifdef NEC_98 #define bVidTextMd 4 ; Allocate text mode mem #define fVidTextMd (1 << 4) #define bVidNTModeFF 0 ; NoTrap: Mode F/F #define fVidNTModeFF (1 << 0) #define bVidNTModeFFC16 1 ; Default is 16 color mode #define fVidNTModeFFC16 (1 << 1) #define bVidNTDispRW 2 ; NoTrap: Bank Register #define fVidNTDispRW (1 << 2) #define bVidNTPal 3 ; NoTrap: Palette #define fVidNTPal (1 << 3) #define bVidNTGDC 5 ; NoTrap: GDC #define fVidNTGDC (1 << 5) #define bVidNTGDCTON 6 ; Default Text on #define fVidNTGDCTON (1 << 6) #define bVidNTGDCGON 7 ; Default Grph on #define fVidNTGDCGON (1 << 7) #define bVidNTFont 8 ; NoTrap: KCG #define fVidNTFont (1 << 8) #define bVidCRTC 9 ; Use CRTC Tracer #define fVidCRTC (1 << 9) #define bVidDispDataXfer 10 ; Transrate mode (0:Text, 1:Text/Grph) #define fVidDispDataXfer (1 << 10) #define bVidXFERPlane0 11 ; Transrate plane Blue #define fVidXFERPlane0 (1 << 11) #define bVidXFERPlane1 12 ; Red #define fVidXFERPlane1 (1 << 12) #define bVidXFERPlane2 13 ; Green #define fVidXFERPlane2 (1 << 13) #define bVidXFERPlane3 14 ; Intensity #define fVidXFERPlane3 (1 << 14) #define mVidXFERPlane (fVidXFERPlane0+fVidXFERPlane1+fVidXFERPlane2+fVidXFERPlane3) #define mVidNTH98 (fVidNTModeFF+fVidNTModeFFC16+fVidNTDispRW+fVidNTPal+fVidNTGDC+fVidNTGDCTON+fVidNTGDCGON) #else //NEC_98 #define fVidTxtEmulate 0x0001 // Do INT 10h TTY and cursor emulation #define fVidNoTrpTxt 0x0002 // Do not trap text mode apps #define fVidNoTrpLRGrfx 0x0004 // Do not trap lo res graphics mode apps #define fVidNoTrpHRGrfx 0x0008 // Do not trap hi res graphics mode apps #define fVidTextMd 0x0010 // Allocate text mode mem #define fVidLowRsGrfxMd 0x0020 // Allocate lo res graphics mode mem #define fVidHghRsGrfxMd 0x0040 // Allocate hi res graphics mode mem #define fVidRetainAllo 0x0080 // Never deallocate once allocated #endif //NEC_98 // // The following stuff was added for mini-VDD support: // // Functions that we can call in the hardware-dependent mini-VDD. Note that // these equates are used to create the dispatch table for calling functions // in the mini-VDD: // #ifdef NEC_98 #define REGISTER_DISPLAY_DRIVER 0 #define PRE_HIRES_TO_VGA 1 #define SAVE_REGISTERS 2 #define RESTORE_REGISTERS 3 #define ENABLE_TRAPS 4 #define DISABLE_TRAPS 5 #define DISPLAY_DRIVER_DISABLING 6 #define ENABLE_ACCELERATER 7 #define DISABLE_ACCELERATER 8 #define CHECK_UPDATE 9 #define CHECK_WINDOWED 10 #define ACC_VBE_PM 11 #define ACC_VBE_DDC 12 #define ACC_INT_10 13 #define ACC_GET_CAPABILITIES 14 #define ACC_GET_EXT_MODE_INFO 15 #define ACC_GET_FLAT_SELECTOR 16 #define ACC_ENABLE_BIOS 17 #define ACC_DISABLE_BIOS 18 #define ACC_SET_PALETTE 19 #define ACC_GET_PALETTE 20 #define ACC_SET_CURSOR 21 #define ACC_SHOW_CURSOR 22 #define ACC_HIDE_CURSOR 23 #define ACC_SET_CURSOR_POS 24 #define ACC_GET_CURSOR_POS 25 ; // 970204 //#define NBR_MINI_VDD_FUNCTIONS 26 //REMEMBER TO RESET THIS!!!!!! #define NBR_MINI_VDD_FUNCTIONS_40 26 // #define GET_NUM_UNITS 26 // 970220 rev.1 #define SET_ADAPTER_POWER_STATE 27 // SetAdapterPowerState(DEVNODE, DWORD) #define GET_ADAPTER_POWER_STATE_CAPS 28 // GetAdapterPowerStateCap(DEVNODE) #define SET_MONITOR_POWER_STATE 29 // SetMonitorPowerState(DEVNODE, DWORD) #define GET_MONITOR_POWER_STATE_CAPS 30 // GetMonitorPowerStateCaps(DEVNODE) #define GET_MONITOR_INFO 31 // GetMonitorInfo(DEVNODE, UINT, EDID *) #define I2C_OPEN 32 // OpenI2CPort(PDO, BOOL, I2CControl *) #define I2C_ACCESS 33 // AccessI2CPort(PDO, I2CControl *); #define GPIO_OPEN 34 // OpenGPIOPort(PDO, BOOL, GPIOControl *) #define GPIO_ACCESS 35 // AccessGPIOPort(PDO, GPIOControl *) #define COPYPROTECTION_ACCESS 36 // AccessCopyProtection(PDO,CPControl * ) #define NBR_MINI_VDD_FUNCTIONS_41 37 #ifdef MAINVDD #define NBR_MINI_VDD_FUNCTIONS NBR_MINI_VDD_FUNCTIONS_41 #else #define NBR_MINI_VDD_FUNCTIONS NBR_MINI_VDD_FUNCTIONS_40 #endif #else //NEC_98 #define REGISTER_DISPLAY_DRIVER 0 #define GET_VDD_BANK 1 #define SET_VDD_BANK 2 #define RESET_BANK 3 #define PRE_HIRES_TO_VGA 4 #define POST_HIRES_TO_VGA 5 #define PRE_VGA_TO_HIRES 6 #define POST_VGA_TO_HIRES 7 #define SAVE_REGISTERS 8 #define RESTORE_REGISTERS 9 #define MODIFY_REGISTER_STATE 10 #define ACCESS_VGA_MEMORY_MODE 11 #define ACCESS_LINEAR_MEMORY_MODE 12 #define ENABLE_TRAPS 13 #define DISABLE_TRAPS 14 #define MAKE_HARDWARE_NOT_BUSY 15 #define VIRTUALIZE_CRTC_IN 16 #define VIRTUALIZE_CRTC_OUT 17 #define VIRTUALIZE_SEQUENCER_IN 18 #define VIRTUALIZE_SEQUENCER_OUT 19 #define VIRTUALIZE_GCR_IN 20 #define VIRTUALIZE_GCR_OUT 21 #define SET_LATCH_BANK 22 #define RESET_LATCH_BANK 23 #define SAVE_LATCHES 24 #define RESTORE_LATCHES 25 #define DISPLAY_DRIVER_DISABLING 26 #define SELECT_PLANE 27 #define PRE_CRTC_MODE_CHANGE 28 #define POST_CRTC_MODE_CHANGE 29 #define VIRTUALIZE_DAC_OUT 30 #define VIRTUALIZE_DAC_IN 31 #define GET_CURRENT_BANK_WRITE 32 #define GET_CURRENT_BANK_READ 33 #define SET_BANK 34 #define CHECK_HIRES_MODE 35 #define GET_TOTAL_VRAM_SIZE 36 #define GET_BANK_SIZE 37 #define SET_HIRES_MODE 38 #define PRE_HIRES_SAVE_RESTORE 39 #define POST_HIRES_SAVE_RESTORE 40 #define VESA_SUPPORT 41 #define GET_CHIP_ID 42 #define CHECK_SCREEN_SWITCH_OK 43 #define VIRTUALIZE_BLTER_IO 44 #define SAVE_MESSAGE_MODE_STATE 45 #define SAVE_FORCED_PLANAR_STATE 46 #define VESA_CALL_POST_PROCESSING 47 #define PRE_INT_10_MODE_SET 48 #define NBR_MINI_VDD_FUNCTIONS_40 49 //REMEMBER TO RESET THIS!!!!!! // // new miniVDD functions that a 4.1 miniVDD should implement // #define GET_NUM_UNITS 49 // GetNumUnits(DEVNODE) #define TURN_VGA_OFF 50 // TurnOffVGA(DEVNODE) #define TURN_VGA_ON 51 // TurnOnVGA(DEVNODE) #define SET_ADAPTER_POWER_STATE 52 // SetAdapterPowerState(DEVNODE, DWORD) #define GET_ADAPTER_POWER_STATE_CAPS 53 // GetAdapterPowerStateCap(DEVNODE) #define SET_MONITOR_POWER_STATE 54 // SetMonitorPowerState(DEVNODE, DWORD) #define GET_MONITOR_POWER_STATE_CAPS 55 // GetMonitorPowerStateCaps(DEVNODE) #define GET_MONITOR_INFO 56 // GetMonitorInfo(DEVNODE, UINT, EDID *) #define I2C_OPEN 57 // OpenI2CPort(PDO, BOOL, I2CControl *) #define I2C_ACCESS 58 // AccessI2CPort(PDO, I2CControl *); #define GPIO_OPEN 59 // OpenGPIOPort(PDO, BOOL, GPIOControl *) #define GPIO_ACCESS 60 // AccessGPIOPort(PDO, GPIOControl *) #define COPYPROTECTION_ACCESS 61 // AccessCopyProtection(PDO,CPControl * ) #define NBR_MINI_VDD_FUNCTIONS_41 62 #ifdef MAINVDD #define NBR_MINI_VDD_FUNCTIONS NBR_MINI_VDD_FUNCTIONS_41 #else #define NBR_MINI_VDD_FUNCTIONS NBR_MINI_VDD_FUNCTIONS_40 #endif #endif //NEC_98 #endif /*NotVxD*/ // // Following are function codes that can be called via the VDD's // API entry point. These are mainly for display driver --> VDD communication. // Since Windows 3.0 and 3.1 VDD's may have used the sequential numbers // (after the Grabber functions) for other VDD API services, we start our // numbering at 80H so as to avoid ugly conflicts with old 3.1 stuff: // // all these entry points take as input: // // Entry: // Client_EAX - function code. // Client_EBX - device handle, or device id (1-N) // #define VDD_QUERY_VERSION 0 #define MINIVDD_SVC_BASE_OFFSET 0x80 #define VDD_DRIVER_REGISTER (0 + MINIVDD_SVC_BASE_OFFSET) #define VDD_DRIVER_UNREGISTER (1 + MINIVDD_SVC_BASE_OFFSET) #define VDD_SAVE_DRIVER_STATE (2 + MINIVDD_SVC_BASE_OFFSET) #define VDD_REGISTER_DISPLAY_DRIVER_INFO (3 + MINIVDD_SVC_BASE_OFFSET) #define VDD_REGISTER_SSB_FLAGS (4 + MINIVDD_SVC_BASE_OFFSET) #define VDD_GET_DISPLAY_CONFIG (5 + MINIVDD_SVC_BASE_OFFSET) #define VDD_PRE_MODE_CHANGE (6 + MINIVDD_SVC_BASE_OFFSET) #define VDD_POST_MODE_CHANGE (7 + MINIVDD_SVC_BASE_OFFSET) #define VDD_SET_USER_FLAGS (8 + MINIVDD_SVC_BASE_OFFSET) #define VDD_SET_BUSY_FLAG_ADDR (9 + MINIVDD_SVC_BASE_OFFSET) #define VDD_PC98_RESERVED (10 + MINIVDD_SVC_BASE_OFFSET) #define VDD_VBE_PM (10 + MINIVDD_SVC_BASE_OFFSET) // // all functions >= VDD_ENABLE also take the following params: // // Client_ES:DI - buffer // Client_ECX - buffer size // Client_EDX - flags // // Exit: // Client_EAX = function code if the function is not supported. // = 0 if the function succeded. // = -1 if the function failed. // #define VDD_ENABLE (11 + MINIVDD_SVC_BASE_OFFSET) #define VDD_GETMEMBASE (12 + MINIVDD_SVC_BASE_OFFSET) #define VDD_OPEN (13 + MINIVDD_SVC_BASE_OFFSET) #define VDD_CLOSE (14 + MINIVDD_SVC_BASE_OFFSET) #define VDD_OPEN_KEY (15 + MINIVDD_SVC_BASE_OFFSET) #define VDD_SET_POWER_STATE (16 + MINIVDD_SVC_BASE_OFFSET) #define VDD_GET_POWER_STATE_CAPS (17 + MINIVDD_SVC_BASE_OFFSET) // // special verion of VDD_GET_DISPLAY_CONFIG that always get the // monitor data, even if the user has disabled using a refresh rate. // #define VDD_GET_DISPLAY_CONFIG2 0x8085 // // VDD_DRIVER_REGISTER // // The display driver sends us some information needed to handle various // context changes. // // Entry: // Client_ES:DI Selector:Offset of callback routine used // to reset to Windows HiRes mode upon return // from a full screen DOS VM to the Windows VM. // Client_ES Main code segment of display driver. // Client_ECX contains the total nbr of bytes on-screen (excluding // off-screen memory). // Client_EDX contain 0 if we are to attempt to allow 4 plane VGA // virtualization. // Client_EDX contains -1 if we are to not allow 4 plane VGA // virtualization. // Client_EBX device handle, or device id (1-N) // Exit: // Client_EAX contains total bytes of memory used by visible screen // AND the VDD virtualization area (ie: the start of // off-screen memory available for use by the display // driver as "scratch" memory). // // // VDD_DRIVER_UNREGISTER // // Entry: // Client_EBX device handle, or device id (1-N) // Exit: // // // VDD_ENABLE // // entry: // Client_EAX - VDD_ENABLE (0x008B) // Client_EBX - device handle // Client_EDX - enable flags (see below) // // exit: // Client_EAX - previous enable state. // // only one device at a time can have VGAMEM, VGAIO, or ROM access // at a time. // #define ENABLE_IO 0x00000001 // enable IO. #define ENABLE_MEM 0x00000002 // enable memory. #define ENABLE_VGA 0x00000030 // enable VGA #define ENABLE_ROM 0x00000080 // enable ROM at C000. #define ENABLE_ALL 0x000000FF // enable all access to this device #define ENABLE_NONE 0x00000000 // disable device. #define ENABLE_VALID 0x000000FF // valid flags. #define ENABLE_ERROR 0xFFFFFFFF // enable fail code // // VDD_OPEN // // open a device given a name // // Entry: // Client_ES:EDI - device name // Client_EDX - flags // Client_EBX - device id (only for VDD_OPEN_ENUM) // Exit: // Client_EAX - device handle // #define VDD_OPEN_EXIST 0x00000001 // check if the device name is valid #define VDD_OPEN_ENUM 0x00000002 // return the Nth device #define VDD_OPEN_LOCK 0x00000000 // lock the device (default) #define VDD_OPEN_TEST VDD_OPEN_EXIST // // VDD_OPEN_KEY // // opens the setting key in the registry for the given device // the caller must close the key when done. // // Entry: // Client_ES:EDI - points to place to store the opened registry key // Client_ECX - must be 4, ie sizeof(HKEY) // Client_EDX - flags // Client_EBX - device handle // Exit: // Client_EAX - 0 for success, or Win32 error code // #define VDD_OPEN_KEY_WRITE 0x00000001 // will be writing settings #define VDD_OPEN_KEY_READ 0x00000002 // only gonig to read settings #define VDD_OPEN_KEY_USER 0x00000010 // open the per user settings #define VDD_OPEN_KEY_GLOBAL 0x00000020 // open the global (not per user) settings // // WIN32 IOCTLS // // The following defines are used with the Win32 function DeviceIOControl // #define VDD_IOCTL_SET_NOTIFY 0x10000001 // set mode change notify #define VDD_IOCTL_GET_DDHAL 0x10000002 // get DDHAL functions from miniVDD #define VDD_IOCTL_COPY_PROTECTION 0x10000003 // copy protection enable/disable #define VDD_IOCTL_I2C_OPEN 0x10000004 // open i2c port for access #define VDD_IOCTL_I2C_ACCESS 0x10000005 // read/write interface // // VDD_IOCTL_SET_NOTIFY // // sets a notification function that will be called when events // happen on the device. // // input: // NotifyMask - bitfield of events // // VDD_NOTIFY_START_MODE_CHANGE - start of mode change in sysVM // VDD_NOTIFY_END_MODE_CHANGE - end of mode change in sysVM // VDD_NOTIFY_ENABLE - sysVM is gaining display focus // VDD_NOTIFY_DISABLE - sysVM is losing display focus // // NotifyType - type of notify // // VDD_NOTIFY_TYPE_CALLBACK - NotifyProc is a Ring0 callback // // NotifyProc - notify procedure // NotifyData - client data // // output: // none // // return: // ERROR_SUCCES if callback is set successfuly // // notes: // currenly only one callback, per device can be active. // // to unregister a callback do a SET_NOTIFY with a NotifyMask == 0 // // your callback better be in pagelocked code. // // NotifyProc has the following form: // // void __cdecl NotifyProc(DWORD NotifyDevice, DWORD NotifyEvent, DWORD NotifyData) // // NotifyDevice internal VDD device handle // NotifyEvent event code (VDD_NOTIFY_*) // NotifyData your client data // // // VDD_IOCTL_SET_NOTIFY_INPUT // typedef struct tagVDD_IOCTL_SET_NOTIFY_INPUT { DWORD NotifyMask; DWORD NotifyType; DWORD NotifyProc; DWORD NotifyData; } VDD_IOCTL_SET_NOTIFY_INPUT; // // VDD_IOCTL_SET_NOTIFY_INPUT.NotifyMask // #define VDD_NOTIFY_START_MODE_CHANGE 0x00000001 #define VDD_NOTIFY_END_MODE_CHANGE 0x00000002 #define VDD_NOTIFY_ENABLE 0x00000004 #define VDD_NOTIFY_DISABLE 0x00000008 // // VDD_IOCTL_SET_NOTIFY_INPUT.NotifyType // #define VDD_NOTIFY_TYPE_CALLBACK 1 // // Port size equates: // #define BYTE_LENGTHED 1 #define WORD_LENGTHED 2 // // Flag equates: // #define GOING_TO_WINDOWS_MODE 1 #define GOING_TO_VGA_MODE 2 #define DISPLAY_DRIVER_DISABLED 4 #define IN_WINDOWS_HIRES_MODE 8 // // DISPLAYINFO structure // typedef struct DISPLAYINFO { WORD diHdrSize; WORD diInfoFlags; // // display mode specific data // DWORD diDevNodeHandle; char diDriverName[16]; WORD diXRes; WORD diYRes; WORD diDPI; BYTE diPlanes; BYTE diBpp; // // monitor specific data // WORD diRefreshRateMax; WORD diRefreshRateMin; WORD diLowHorz; WORD diHighHorz; WORD diLowVert; WORD diHighVert; DWORD diMonitorDevNodeHandle; BYTE diHorzSyncPolarity; BYTE diVertSyncPolarity; // // new 4.1 stuff // DWORD diUnitNumber; // device unit number DWORD diDisplayFlags; // mode specific flags DWORD diXDesktopPos; // position of desktop DWORD diYDesktopPos; // ... DWORD diXDesktopSize; // size of desktop (for panning) DWORD diYDesktopSize; // ... } DISPLAYINFO; /*ASM DISPLAYINFO_SIZE equ diRefreshRateMax+2-diHdrSize DISPLAYINFO_SIZE1 equ diBpp+1-diHdrSize DISPLAYINFO_SIZE2 equ diVertSyncPolarity+1-diHdrSize DISPLAYINFO_SIZE3 equ diMemorySize+4-diHdrSize */ // // Following are values for the diInfoFlags word in DISPLAYINFO: // #define RETURNED_DATA_IS_STALE 0x0001 #define MINIVDD_FAILED_TO_LOAD 0x0002 #define MINIVDD_CHIP_ID_DIDNT_MATCH 0x0004 #define REGISTRY_BPP_NOT_VALID 0x0008 #define REGISTRY_RESOLUTION_NOT_VALID 0x0010 #define REGISTRY_DPI_NOT_VALID 0x0020 #define MONITOR_DEVNODE_NOT_ACTIVE 0x0040 #define MONITOR_INFO_NOT_VALID 0x0080 #define MONITOR_INFO_DISABLED_BY_USER 0x0100 #define REFRESH_RATE_MAX_ONLY 0x0200 #define CARD_VDD_LOADED_OK 0x0400 #define DEVICE_IS_NOT_VGA 0x0800 // // Following are explanations for the diInfoFlags word in DISPLAYINFO: // // RETURNED_DATA_IS_STALE, if set, means that this call to VDD_GET_DISPLAY_CONFIG // or VDD_GetDisplayInfo (which are the Ring 3 and Ring 0 methods by which a // program would get the DISPLAYINFO structure returned to him) caused the VDD // to return data that was read in a previous call to VDD_GET_DISPLAY_CONFIG // insted of actually going out and reading "fresh" data from the Registry. // // This flag brings to light the fact that there are some circumstances when the // VDD cannot go out and read the registry in response to the call to // VDD_GET_DISPLAY_CONFIG or VDD_GetDisplayInfo (due to system multi-tasking // considerations). In this case, this flag will be set to a 1 to indicate that // the information being returned isn't "fresh" -- that is -- it may be // incorrect and obsolete. The caller should respond accordingly if this flag // is set. // // // MINIVDD_FAILED_TO_LOAD if set, indicates that for some reason (typically // that the MiniVDD didn't match the chipset installed in the machine), the // MiniVDD didn't load. Callers can examine this flag and act accordingly. // // // MINIVDD_CHIP_ID_DIDNT_MATCH means that although the MiniVDD did load // successfully, when the ChipID that the MiniVDD calculated was compared // against the value saved in the registry, they didn't match. An example of // when this would happen is when the user is happily using an S3-911 card // and then decides to upgrade his display card to an S3-864. Since both // cards use S3.VXD, the MiniVDD will load, however, since the card model // is different, the VDD will return a defect to configuration manager and // set this flag. Callers of the GET_DISPLAY_CONFIG functions can use this // flag to take appropriate actions to make sure that the user gets his // configuration correct. // // // REGISTRY_BPP_NOT_VALID if set, means that we failed to obtain the BPP value // from the registry when the VDD tried to read it. // // // REGISTRY_RESOLUTION_NOT_VALID if set, means that we failed to obtain the // resolution value from the registry when the VDD tried to read it. // // // REGISTRY_DPI_NOT_VALID if set, means that we failed to obtain the // DPI value from the registry when the VDD tried to read it. // // // MONITOR_DEVNODE_NOT_ACTIVE is set if someone tries to make a call to the // GET_DISPLAY_CONFIG function before the monitor DevNode has been created. // This is certainly not fatal by any means. It simply means that the // monitor refresh rate info in the DISPLAYINFO data structure is totally // invalid! // // // MONITOR_INFO_NOT_VALID indicates that something within the code which // retrieves and calculates the refresh rate data has failed. This indicates // that the values in diRefreshRateMax through diVertSyncPolarity are not // valid and could contain random data. // // // MONITOR_INFO_DISABLED_BY_USER indicates that the either the RefreshRate= // string in SYSTEM.INI had a negative number in it or that the string in // the display's software key RefreshRate = string was 0 or a negative number. // // // REFRESH_RATE_MAX_ONLY indicates that there was no diLowHorz, diHighHorz, // diLowVert, diHighVert, or sync polarity data in the registry. The // value returned in diRefreshRateMax is the only refresh rate data that // we have available. This was derived either from RefreshRate= in SYSTEM.INI // or the display software key RefreshRate = string in the registry. // // // CARD_VDD_LOADED_OK indicates that a second MiniVDD (which is useful for // display card manufacturers wishing to extend the capabilities of the chip level // MiniVDD's ) has successfully been loaded and initialized. // // DEVICE_IS_NOT_VGA indicates that this device is not the primary vga // #define NoTrace_VIRTUALIZE_CRTC_IN #define NoTrace_VIRTUALIZE_CRTC_OUT #define NoTrace_VIRTUALIZE_SEQUENCER_IN #define NoTrace_VIRTUALIZE_SEQUENCER_OUT #define NoTrace_VIRTUALIZE_GCR_IN #define NoTrace_VIRTUALIZE_GCR_OUT #define NoTrace_VIRTUALIZE_DAC_OUT #define NoTrace_VIRTUALIZE_DAC_IN #define NoTrace_CHECK_HIRES_MODE /*ASM ifdef NEC_98 ;****************************************************************************** ; E Q U A T E S ;****************************************************************************** ; ; Mini-VDD Static Flags ; vFlg_Machine_Std equ 00000001b vFlg_Machine_Multi equ 00000010b vFlg_Machine_Mate equ 00000100b vFlg_Machine_H98 equ 00001000b vFlg_CRT_New equ 00010000b vFlg_CRT_NonInter equ 00100000b vFlg_GDC_5MHz equ 01000000b vFlg_GDC_Emulate equ 10000000b vFlg_Acc_Internal equ 0000000100000000b vFlg_Acc_External equ 0000001000000000b vFlg_Acc_PCI equ 0000010000000000b vFlg_Acc_ML equ 0000100000000000b vFlg_Acc_PVD equ 0001000000000000b vFlg_Mode_NH equ 0010000000000000b vFlg_Mode_H equ 0100000000000000b vFlg_Initialized equ 1000000000000000b vFlg_Opt_MFR equ 000000010000000000000000b vFlg_Opt_NewMFR equ 000000100000000000000000b vFlg_Opt_VDP equ 000001000000000000000000b vFlg_Opt_NewVDP equ 000010000000000000000000b vFlg_Local equ 000000000100000010000000b ; ; Mini-VDD Support Max ; MaxMiniVDD equ 16 MaxMiniTrap equ 32 MaxMultiTrap equ 3 MaxMultiFunc equ MaxMiniVDD ; ; MiniVDD_LTrap_Struct.LTrap_Status ; MiniVDD_LTrap_Struct.LTrap_Flags.xxxx ; LT_Enable equ 00000001b LT_Enable_bit equ 0 LT_Initialized equ 10000000b LT_Initialized_bit equ 7 ;****************************************************************************** ; D A T A S T R U C T U R E S ;****************************************************************************** ; ; Vids_struct ; Vids_struct struc ; ; Common Data supplied by Base-VDD. Some data(bits) set by Mini-VDD. ; Vids_SFlags dd ? ; Static flags Vids_CB_Offset dd ? ; Vids_Msg_Pseudo_VM dd ? ; ; ; Common Procedure supplied by Base-VDD ; VDD_TGDC_Draw_Off dd ? ; VDD_TGDC_Sync_Off dd ? ; VDD_TGDC_Sync_On dd ? ; VDD_TGDC_FIFO_Empty dd ? ; VDD_GGDC_Draw_Off dd ? ; VDD_GGDC_Sync_Off dd ? ; VDD_GGDC_Sync_On dd ? ; VDD_GGDC_FIFO_Empty dd ? ; VDD_GGDC_MOD_Emulate dd ? ; ; ; Common Procedure supplied by Mini-VDD ; H98_FLORA_Change dd ? ; H98 - NH mode H98_Clear_Text dd ? ; H98 - NH mode H98_Rest_GCs dd ? ; H98 H98_Rest_etc dd ? ; H98 H98_Save_ModeFF dd ? ; H98 Vids_struct ends Vid_SFlags equ VDD_CB_Offset equ VDD_Msg_Pseudo_VM equ TGDC_Draw_Off equ GGDC_Draw_Off equ TGDC_Sync_On equ TGDC_Sync_Off equ TGDC_FIFO_Empty equ GGDC_FIFO_Empty equ ; ; RegTrapStruct ; MiniFuncStruct STRUC MF_ProcAddr dd ? ;;MF_Order dw ? ;;MF_MiniID db ? ;;MF_Flags db ? MiniFuncStruct ENDS ; ; MiniProcStruct ; MiniVDD_Proc_Struct STRUC Proc_Address dd ? Proc_Order dw ? Proc_MiniID db ? Proc_Flags db ? MiniVDD_Proc_Struct ENDS .errnz (size MiniVDD_Proc_Struct) mod 4 ; ; MiniTrapTable - Global Info ; LocalTrapTable - Local Status ; MiniVDD_GTrap_Struct STRUC GTrap_ProcAddr dd ? GTrap_PortAddr dw ? GTrap_NumMini dw ? GTrap_ProcTable db ((size MiniVDD_Proc_Struct) * MaxMultiTrap) dup (?) MiniVDD_GTrap_Struct ENDS MiniVDD_LTrap_Struct STRUC LTrap_ProcAddr dd ? LTrap_Status db ? LTrap_Flags db MaxMultiTrap dup (?) MiniVDD_LTrap_Struct ENDS ;****************************************************************************** ; M A C R O S ;****************************************************************************** ; ; BeginMiniFunc TableName ; MiniFunc Function-ID, ProcedureName ; | ; EndMiniFunc TableName ; EndMiniFunc_ MACRO n ifdef MiniFunc&n dd OFFSET32 MiniFunc&n ; MiniFuncStruct else dd 0 endif ENDM MiniFunc_ MACRO FuncID, FuncName MiniFunc&FuncID equ ENDM BeginMiniFunc MACRO TableName public TableName TableName label near ENDM if 1 EndMiniFunc MACRO TableName x = 0 REPT NBR_MINI_VDD_FUNCTIONS_41 EndMiniFunc_ %x x = x + 1 ENDM ENDM else EndMiniFunc MACRO TableName x = 0 REPT NBR_MINI_VDD_FUNCTIONS EndMiniFunc_ %x x = x + 1 ENDM ENDM endif MiniFunc MACRO FuncID, FuncName MiniFunc_ %(FuncID), ENDM ; ; MiniVDDCall Function-ID ; MiniVDDCall MACRO FuncID, SetCarry local MiniCall_Loop local MiniCall_Exit push ecx push esi lea esi, [MiniVDD_Func_Table][(size MiniVDD_Proc_Struct) * MaxMultiFunc * FuncID] mov ecx, [MiniVDD_NumMini] MiniCall_Loop: cmp dword ptr [esi.Proc_Address], 0 jz MiniCall_Exit pushad ifnb stc endif call dword ptr [esi.Proc_Address] popad jc MiniCall_Exit add esi, size MiniVDD_Proc_Struct loop MiniCall_Loop MiniCall_Exit: pop esi pop ecx ENDM ; ; MiniVDDCall2 Function-ID ; MiniVDDCall2 MACRO FuncID, SetCarry local MiniCall_Exit local MiniCall_Proc push ecx push esi lea esi, [MiniVDD_Func_Table][(size MiniVDD_Proc_Struct) * MaxMultiFunc * FuncID] MiniCall_Proc: cmp dword ptr [esi.Proc_Address], 0 jz MiniCall_Exit pushad ifnb stc endif call dword ptr [esi.Proc_Address] popad MiniCall_Exit: pop esi pop ecx ENDM ; ; MiniVDDCall3 Function-ID ; MiniVDDCall3 MACRO FuncID, MiniID, SetCarry local MiniCall_Exit local MiniCall_Loop local MiniCall_Proc push ecx push esi lea esi, [MiniVDD_Func_Table][(size MiniVDD_Proc_Struct) * MaxMultiFunc * FuncID] movzx ecx, MiniID MiniCall_Loop: cmp ecx, 0 jz MiniCall_Proc add esi, size MiniVDD_Proc_Struct dec ecx jmp MiniCall_Loop MiniCall_Proc: cmp dword ptr [esi.Proc_Address], 0 jz MiniCall_Exit pushad ifnb stc endif call dword ptr [esi.Proc_Address] popad MiniCall_Exit: pop esi pop ecx ENDM ; ; MiniVDDCall Function-ID ; MiniVDDFunc MACRO TmpReg, FuncID mov TmpReg, [MiniVDD_Func_Table.Proc_Address][(size MiniVDD_Proc_Struct) * MaxMultiFunc * FuncID] ENDM ; ; ExecMode/ExecModeThru ; ExecModeNot/ExecModeThruNot ; ExecModeOnly ; ExecModeOnlyNot ; ExecModeElse ; ExecModeElseNot ; ExecModeEnd ; ExecModeLL macro Num ExecMode_L&Num: endm ExecModeLE macro Num ExecMode_E&Num: endm ExecModeJE macro Num jmp ExecMode_E&Num endm ExecModeJZ macro Num jz ExecMode_L&Num endm ExecModeJNZ macro Num jnz ExecMode_L&Num endm ExecModeJEZ macro Num jz ExecMode_E&Num endm ExecModeJENZ macro Num jnz ExecMode_E&Num endm ExecModeTest macro ModeFlag, CB_Reg if ModeFlag and vFlg_Local ifidni , push ebx mov ebx, [Vid_VM_Handle] add ebx, [VDD_CB_Offset] test [ebx.VDD_SFlags], ModeFlag pop ebx else ifidni , push ebx VMMCall Get_Cur_VM_Handle add ebx, [VDD_CB_Offset] test [ebx.VDD_SFlags], ModeFlag pop ebx else ifb push ebx add ebx, [VDD_CB_Offset] test [ebx.VDD_SFlags], ModeFlag pop ebx else test [CB_Reg.VDD_SFlags], ModeFlag endif endif endif else test [Vid_SFlags], ModeFlag endif endm ExecModeChk macro HdrFlag, JmpFlag, JmpLabel, ModeFlag, CB_Reg ifidni , .erre FlgExecMode ExecModeJE %EndExecMode endif ExecModeLL %NumExecMode NumExecMode = NumExecMode + 1 FlgExecMode = 1 ifnb ExecModeTest , ifidni , ifidni , ExecModeJENZ %EndExecMode else ExecModeJEZ %EndExecMode endif else ifidni , ExecModeJNZ %NumExecMode else ExecModeJZ %NumExecMode endif endif endif endm ExecModeEnd macro ExecModeLL %NumExecMode ExecModeLE %EndExecMode NumExecMode = NumExecMode + 1 EndExecMode = EndExecMode + 1 FlgExecMode = 0 endm ; ; CB_Reg = Regs/Vid/Cur ; ModeFlag = vFlg_xxxx ; ExecModeJmp macro JmpLabel, ModeFlag, CB_Reg ExecModeTest %ModeFlag, jnz JmpLabel endm ExecModeJmpNot macro JmpLabel, ModeFlag, CB_Reg ExecModeTest %ModeFlag, jz JmpLabel endm ExecMode macro ModeFlag, CB_Reg ExecModeChk Top, Equ, Next, %ModeFlag, CB_Reg endm ExecModeNot macro ModeFlag, CB_Reg ExecModeChk Top, Not, Next, %ModeFlag, CB_Reg endm ExecModeOnly macro ModeFlag, CB_Reg ExecModeChk Top, Equ, End, %ModeFlag, CB_Reg endm ExecModeOnlyNot macro ModeFlag, CB_Reg ExecModeChk Top, Not, End, %ModeFlag, CB_Reg endm ExecModeElse macro ModeFlag, CB_Reg ExecModeChk Jmp, Equ, Next, %ModeFlag, CB_Reg endm ExecModeElseNot macro ModeFlag, CB_Reg ExecModeChk Jmp, Not, Next, %ModeFlag, CB_Reg endm ExecModeThru macro ModeFlag, CB_Reg ExecModeChk Thru, Equ, Next, %ModeFlag, CB_Reg endm ExecModeThruNot macro ModeFlag, CB_Reg ExecModeChk Thru, Not, Next, %ModeFlag, CB_Reg endm NumExecMode = 1 EndExecMode = 1 FlgExecMode = 0 else ;NEC_98 ; ;Some external definitions. Only define these if we're assembling the ;device independent "main" portion of the Mini-VDD: ; ifdef MAINVDD externdef MiniVDDDispatchTable:dword ;in VDDCTL.ASM endif ;MAINVDD ; ; MiniVDDDispatch macro FunctionCode, HandlerAddr mov [edi+(FunctionCode*4)],OFFSET32 MiniVDD_&HandlerAddr endm ; ; CardVDDDispatch macro FunctionCode, HandlerAddr mov [edi+(FunctionCode*4)],OFFSET32 CardVDD_&HandlerAddr endm ; ; MiniVDDCall macro FunctionCode, SaveFlags local MiniVDDCallExit, MiniVDDCallLeave ifdef MAXDEBUG ifndef NoTrace_&FunctionCode& Trace_Out "MiniVDDCall: &FunctionCode&" endif endif push edi ;;save this register for now ifnb pushfd ;;save the flags state endif mov edi,OFFSET32 MiniVDDDispatchTable cmp dword ptr [edi+(FunctionCode*4)],0 je MiniVDDCallLeave ;;MiniVDD doesn't support this ifnb popfd ;;just clear the Stack from the flags endif call dword ptr [edi+(FunctionCode*4)] ifnb jmp MiniVDDCallExit ;;we already restored the flags endif ; MiniVDDCallLeave: ifnb popfd ;; endif ; MiniVDDCallExit: pop edi ;;we're done handling this call endm endif ;NEC_98 */ #endif // _MINIVDD_H_