612 lines
15 KiB
PHP
612 lines
15 KiB
PHP
|
|
; 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
|
|
|
|
; -------------------------------------------------------
|
|
; -------------------------------------------------------
|
|
; -------------------------------------------------------
|
|
|
|
;****************************************************************
|