|
|
; 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
; ------------------------------------------------------- ; ------------------------------------------------------- ; -------------------------------------------------------
;****************************************************************
|