; Copyright (c) Microsoft Corporation 1988-1991. All Rights Reserved. ;**************************************************************** ;* * ;* GENDEFS.INC -- General Symbol Defintions for Dos Extender * ;* * ;**************************************************************** ;* Revision History: * ;* * ;* 05/08/90 jimmat Changes for VCPI support. * ;* 01/07/90 jimmat Make DOSX version 03.00. * ;* 7/28/89 jimmat Increased GDT/LDT size yet again. * ;* 4/01/89 jimmat Increased size of GDT/LDT (again) * ;* 3/30/89 jimmat Added ChkPoint macro for debugging * ;* 3/11/89 jimmat Added support for LDT & TSS * ;* 3/09/89 jimmat Added DX_DYNALINK function * ;* 02/22/89 (GeneA): increased size of interrupt reflector * ;* stack frames (CB_STKFRAME) from 128 to 256 bytes * ;* 02/17/89 (GeneA): removed ERC_??? equates * ;* 02/10/89 (GeneA): changed form of definitions for the * ;* EXEC_??? symbols, and added ERC_??? error code symbols. * ;* 12/13/88 (GeneA): moved definitions for EXEC_??? symbols * ;* and RELOC_BUFFER here from dxinit.asm ;* 12/08/88 (GeneA): added npopf function * ;* 12/08/88 (GeneA): added HMMFUNC definition * ;* * ;**************************************************************** ifndef DEBUG ;define DEBUG switch if it isn't already DEBUG = 0 endif ifndef MINBUG MINBUG = 0 endif ifndef VCPI VCPI = 0 endif ifndef NO386 NO386 = 0 endif ; ------------------------------------------------------- ; MISC. PROGRAM CONSTANTS ; ------------------------------------------------------- DXVERSION = 030Ah ;Version 03.10 DPMI_32BIT equ 0000000000000001b if VCPI CDSCGDTDEFAULT = 3072 ;default size of GDT **** temp for VCPI **** !!! CDSCLDTDEFAULT = 2 else CDSCGDTDEFAULT = 3072 ;default size of GDT endif CDSCMAXLDT = 8190 ;maximum possible LDT selectors CDSCIDTDEFAULT = 256 ;default size of IDT CB_XFRBUF0 = 128 ;size of small transfer buffer ; ; Performance enhancement, by RalphL ; CB_XFRBUF1 = 8192 ;size of large transfer buffer CB_STKFRAME = 384 ;size of a stack frame CB_MEMHDR = 16 ; size of memory block header (1 paragraph) CXMSBLOCKSDX = 16 ; number of XMS blocks to allocate INTA00 = 20h ;i/o address of master 8259 INTA01 = 21h INTB00 = 0A0h ;i/o address of slave 8259 INTB01 = 0A1h CMOSLoc = 70h ;CMOS ram/Real-Time Clock location port CMOSValue = 71h ;CMOS ram/Real-Time Clock value port HP_VECTRA = 01h ;Running on an HP Vectra HP_CLASSIC = 02h ;Running on a 'Classic' Vectra (A & A+) CRESERVED = 32 ;Reserved interrupt numbers ; The following equates define the DOS Extender DynaLink services if DEBUG OutDebugStr = 0 ;debugging text out service TestDebugIns = 1 ;debugger installation check service NUM_DYNALINK = 2 else ; !DEBUG NUM_DYNALINK = 0 endif ; This structure defines the format of the Exec paramter block used ; by the MS-DOS exec function (ah=4Bh, al=01). XBLK struc segEnv dw ? ;segment address of environment to use lpchCmnd dd ? ;far pointer to command line lpFCB0 dd ? ;far pointer to first default fcb lpFCB1 dd ? ;far pointer to second default fcb lpChildStack dd ? ;return value, far pointer to child stack lpChildCode dd ? ;return value, far pointer to child code XBLK ends ; The following symbols define locations in rgbXfrBuf1 used ; during initialization. ParseCommandLine places this information ; into the buffer to be used by later programs. BUFTMP = CB_XFRBUF1 - 1024 ;use the top 1k for the temporary buffers EXEC_PROGNAME equ ;child program's exe file name EXEC_DXNAME equ ;Dos Extender program name EXEC_CMNDLINE equ ;command line to pass to the child EXEC_EXEHDR equ ;buffer for holding exe header for ; the overlay currently being ; loaded EXEC_FCB0 equ ;FCB0 to pass to the child EXEC_FCB1 equ ;FCB1 to pass to the child RELOC_BUFFER equ ;file input buffer used to hold ; pages of the relocation table ; while relocating the current ; overlay ; ; This structure defines the stack frame used to hold the entry ; values and automatic variables for Dos Extender functions. FUNCSTACK struc fnsUserES dw ? fnsUserDS dw ? fnsUserDI dw ? fnsUserSI dw ? fnsUserBP dw ? fnsUserSPx dw ? fnsUserBX dw ? fnsUserDX dw ? fnsUserCX dw ? fnsUserAX dw ? fnsUserIP dw ? fnsUserCS dw ? fnsUserFL dw ? fnsUserSS dw ? fnsUserSP dw ? FUNCSTACK ends ; ------------------------------------------------------- ; DEFINITIONS FOR MACROS ; ------------------------------------------------------- ; These macros are used to switch between the protected mode ; only code segment and the mixed protected/real mode code segment. ; They are intended to be used for switching between modes in-line ; within a routine. They must be used in pairs, bracketing the ; code that needs to be in the other mode (from the initial or 'native' ; mode of the function.) ; ------------------------------------------------------- ; ; This macro switches the processor and the local segment context ; to the dos extender protected mode segment. SwitchToProtectedMode macro local foo ifndef EnterProtectedMode extrn EnterProtectedMode:NEAR endif call EnterProtectedMode % ifidni <@CURSEG>, ; jmp far ptr foo db 0EAh ;avoid need for fixups dw offset DXPMCODE:foo dw SEL_DXPMCODE OR STD_RING DXCODE ends DXPMCODE segment assume cs:DXPMCODE endif foo: endm ; ------------------------------------------------------- ; ; This macro switches the processor and the local segment context ; to the dos extender mixed protected/real mode segment. SwitchToRealMode macro local foo % ifidni <@CURSEG>, ; jmp far ptr foo db 0EAh ;avoid need for fixups dw offset DXCODE:foo dw SEL_DXCODE OR STD_RING DXPMCODE ends DXCODE segment assume cs:DXCODE endif ifndef EnterRealMode extrn EnterRealMode:NEAR endif foo: call EnterRealMode endm ; ------------------------------------------------------- ; BeginLowSegment macro DXCODE segment assume cs:DXCODE endm EndLowSegment macro DXCODE ends endm BeginHighSegment macro DXPMCODE segment assume cs:DXPMCODE endm EndHighSegment macro DXPMCODE ends endm ; ------------------------------------------------------- ; ; This macro switches the local segment context ; to the dos extender protected mode segment. ChangeToHighSegment macro local foo % ifidni <@CURSEG>, .err %out Switch to high segment when already in high segment endif jmp far ptr foo DXCODE ends DXPMCODE segment assume cs:DXPMCODE foo: endm ; ------------------------------------------------------- ; ; This macro switches the local segment context ; to the dos extender mixed protected/real mode segment. ChangeToLowSegment macro local foo % ifidni <@CURSEG>, .err %out Switch to low segment when already in low segment endif jmp far ptr foo DXPMCODE ends DXCODE segment assume cs:DXCODE foo: endm ; ------------------------------------------------------- ; PushCParams MACRO P1, P2, P3, P4, P5, P6, P7, P8, P9, P10 IRP Param, IFNB push Param ENDIF ENDM ENDM ClearCParams MACRO Count, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10 IFNB ClearCParams %(Count+1), , , , , , , , , ELSE IF Count add sp, Count*2 ENDIF ENDIF ENDM ; ------------------------------------------------------- ; This macro calls one of the DX services DXcall MACRO Procedure, Param_List IFNDEF WOW_x86 ; BUGBUG PushCParams Param_List db 9Ah ;call sel:0 dw 0 dw SEL_DYNALINK + (Procedure SHL 3) ClearCParams 0, Param_List ENDIF ENDM ; ------------------------------------------------------- ; This macro displays a string if DEBUG ; ; Note: This macro only works in PROTECT MODE! ********** Trace_Out MACRO String, nocrlf LOCAL String_Offset ifndef WOW_x86 ;bugbug IF DEBUG DXDATA SEGMENT String_Offset LABEL BYTE db String IFB db 0Ah, 0Dh ENDIF db 0 DXDATA ENDS push ds pushf cli pusha ; save our registers pusha ; copy them for print routine mov ax,SEL_DXDATA ; make sure string is addressable mov ds,ax mov si,OFFSET DGROUP:String_Offset DXcall OutDebugStr popa ; restore our registers npopf pop ds ENDIF endif ;WOW_x86 ENDM ; ------------------------------------------------------- ; This macro displays a string and breaks if DEBUG ; ; Note: This macro only works in PROTECT MODE! ********** Debug_Out MACRO String LOCAL Skip_Int1 IF DEBUG pushf Trace_Out DXcall TestDebugIns jz SHORT Skip_Int1 int 1 Skip_Int1: npopf ENDIF ENDM ; ------------------------------------------------------- ; This macro displays a string if DEBUG ; ; Note: This macro only works in REAL MODE! ********** ; ; DS must be set to the DOS Extender's DS before using, too. ; Real_Trace_Out MACRO String, nocrlf LOCAL String_Offset IF DEBUG ifndef DXOutDebugStr EXTRN DXOutDebugStr:FAR endif DXDATA SEGMENT String_Offset LABEL BYTE db String IFB db 0Ah, 0Dh ENDIF db 0 DXDATA ENDS pushf cli pusha ; save our registers pusha ; copy them for print routine mov si,OFFSET DGROUP:String_Offset call DXOutDebugStr popa ; restore our registers npopf ENDIF ENDM ; ------------------------------------------------------- ; This macro displays a string and breaks if DEBUG ; ; Note: This macro only works in REAL MODE! ********** ; ; DS must be set to the DOS Extender's DS before using, too. ; Real_Debug_Out MACRO String LOCAL Skip_Int1 IF DEBUG pushf Real_Trace_Out cmp fDebug,0 jz SHORT Skip_Int1 int 1 Skip_Int1: npopf ENDIF ENDM ; ------------------------------------------------------- ; Delay for I/O Instructions... IO_Delay MACRO jmp short $+2 jmp short $+2 jmp short $+2 ENDM ; ------------------------------------------------------- ;8080-style return macros due to Greg Whitten genrcc macro cc r&cc ¯o labl if $-___ret gt 126d jn&cc $+3 ;;Skip around ret ___ret = $ ret else j&cc ___ret ;;jmp to last ret endif &endm rn&cc ¯o labl if $-___ret gt 126d j&cc $+3 ;;Skip around ret ___ret = $ ret else jn&cc ___ret ;;jmp to last ret endif &endm call&cc ¯o labl jn&cc $+5 ;;Skip around call call labl &endm calln&cc ¯o labl j&cc $+5 ;;Skip around call call labl &endm jmp&cc ¯o labl jn&cc $+5 ;;Skip around jmp jmp labl &endm jmpn&cc ¯o labl j&cc $+5 ;;Skip around jmp jmp labl &endm endm ; ------------------------------------------------------- ; rcc and rncc macro generators genrcc a genrcc ae genrcc b genrcc be genrcc c genrcc e genrcc g genrcc ge genrcc l genrcc le genrcc o genrcc s genrcc z return macro ___ret = $ ret endm ; ------------------------------------------------------- ; ; This macro is used to get around the bug in the POPF instruction in ; some early 80286 chips. IFDEF WOW npopf macro rpopf endm ELSE npopf macro local a jmp $+3 ; Fix for bug in POPF on IBM AT a: iret ; This simulates a POPF instruction push cs call a endm ENDIF ; ------------------------------------------------------- ; ; MS-DOS function call macros dossvc macro fcn ifnb mov ah,fcn endif int 21h endm pmdossvc macro fcn ifnb mov ah,fcn endif pushf ;don't do Int 21h in case child has Int 21h cli ; hooked (like Windows) push cs call PmIntrDos endm ; ------------------------------------------------------- ; This macro will request a Dos Extender funtion. dxsvc macro fcn ifnb mov al,fcn endif mov ah,DXFUNC int 2Fh endm ; ------------------------------------------------------- ; This macro is used to make calls to the XMS driver for ; extended memory management. HMMFUNC = 43h ;Himem driver Int 2Fh function code xmssvc macro fcn ifnb mov ah,fcn endif call [lpfnXMSFunc] endm ; ------------------------------------------------------- out1 macro p if1 %out p endif endm ; ------------------------------------------------------- errnz macro p if2 .errnz p endif endm ; ------------------------------------------------------- ; ------------------------------------------------------- ; ------------------------------------------------------- ;****************************************************************