; 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 <DGROUP:rgbXfrBuf1+BUFTMP+0000h> ;child program's exe file name EXEC_DXNAME equ <DGROUP:rgbXfrBuf1+BUFTMP+0080h> ;Dos Extender program name EXEC_CMNDLINE equ <DGROUP:rgbXfrBuf1+BUFTMP+0100h> ;command line to pass to the child EXEC_EXEHDR equ <DGROUP:rgbXfrBuf1+BUFTMP+0180h> ;buffer for holding exe header for ; the overlay currently being ; loaded EXEC_FCB0 equ <DGROUP:rgbXfrBuf1+BUFTMP+01A0h> ;FCB0 to pass to the child EXEC_FCB1 equ <DGROUP:rgbXfrBuf1+BUFTMP+01D0h> ;FCB1 to pass to the child RELOC_BUFFER equ <DGROUP:rgbXfrBuf1+BUFTMP+0200h> ;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>,<DXCODE> ; 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>,<DXPMCODE> ; 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>,<DXCODE> .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>,<DXCODE> .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, <P10, P9, P8, P7, P6, P5, P4, P3, P2, P1> IFNB <Param> push Param ENDIF ENDM ENDM ClearCParams MACRO Count, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10 IFNB <P1> ClearCParams %(Count+1), <P2>, <P3>, <P4>, <P5>, <P6>, <P7>, <P8>, <P9>, <P10> 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 <nocrlf> 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 <String> 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 <nocrlf> 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 <String> 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 <fcn> mov ah,fcn endif int 21h endm pmdossvc macro fcn ifnb <fcn> 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 <fcn> 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 <fcn> mov ah,fcn endif call [lpfnXMSFunc] endm ; ------------------------------------------------------- out1 macro p if1 %out p endif endm ; ------------------------------------------------------- errnz macro p if2 .errnz p endif endm ; ------------------------------------------------------- ; ------------------------------------------------------- ; ------------------------------------------------------- ;****************************************************************