375 lines
9.7 KiB
PHP
375 lines
9.7 KiB
PHP
;*** dxvcpi.inc - include file for vcpi functions/maintenance
|
|
;
|
|
; Copyright <C> 1990-1991, Microsoft Corporation
|
|
;
|
|
; Purpose:
|
|
;
|
|
; Revision History:
|
|
;
|
|
; 08-07-90 earleh rearranged things to allow building Pmode data
|
|
; structures with total size exceeding that of LIM 3.2 page
|
|
; frame
|
|
; 05/09/90 jimmat Started incorporating VCPI changes from languages group.
|
|
;
|
|
; [] 20-Feb-1990 Dans Created
|
|
;
|
|
;************************************************************************/
|
|
|
|
CurrentCpu = @Cpu ;select 386 assembly if not already
|
|
ife (CurrentCpu AND 0008h)
|
|
.386
|
|
endif
|
|
|
|
;
|
|
; Hungarian used:
|
|
; la Linear Address
|
|
; za Physical Address
|
|
;
|
|
|
|
;
|
|
;
|
|
; Miscellaneous equates
|
|
;
|
|
EMS_INT = 067h
|
|
VCPIINT = 067h
|
|
CBEMMSTR = 8h
|
|
CPTDX = 1h ; count of user page tables dx uses
|
|
CPTDXEXT = (CPTDX+1) ; count of total page tables dx uses
|
|
CBPAGE386 = 1000h ; bytes in 386 page
|
|
CBPAGE386LIM = 1000h-1
|
|
|
|
DXINDOS = 00000001b
|
|
DXINEMS = 00000010b ; obsolete
|
|
DXINVCPI = 00000100b
|
|
DXINXMS = 00001000b
|
|
|
|
;
|
|
; See dxvcpi.asm for a rough sketch of the memory block that the
|
|
; following variables describe
|
|
|
|
DXLINEARBASE = 80000000h ; Linear base of DX system memory
|
|
|
|
VCPIPTOFF = 0 * CBPAGE386 ; vcpi's 0th page table
|
|
DXPT1OFF = 1 * CBPAGE386 ; dx's first user page table
|
|
DXPTSYSOFF = DXPT1OFF + (CPTDX * CBPAGE386)
|
|
; dx's system page table
|
|
DXPDOFF = DXPTSYSOFF + CBPAGE386 ; page directory
|
|
DXLASTPTOFF = DXPDOFF
|
|
DXBOOTPTOFF = DXPTSYSOFF
|
|
;
|
|
; Last user page table is used to bootstrap our protected mode
|
|
; data into extended memory.
|
|
;
|
|
DXTEMPPTOFF = DXPTSYSOFF - CBPAGE386
|
|
DX_TEMP_LINEARBASE = (DXTEMPPTOFF - VCPIPTOFF) shl 10
|
|
|
|
;
|
|
; The next number comes from the dosx.map file, and is equal to the
|
|
; offset of the CODEENDPM symbol, plus whatever padding we want to use
|
|
; so we don't have to update this include file too often.
|
|
;
|
|
if DEBUG
|
|
DXPMCODESIZE = 04900H
|
|
else ; DEBUG
|
|
DXPMCODESIZE = 04000H
|
|
endif ; DEBUG
|
|
|
|
IDTOFF = DXLASTPTOFF + CBPAGE386
|
|
IDTSIZE = CDSCIDTDEFAULT * 8
|
|
IDTLIM = IDTSIZE - 1
|
|
|
|
TSSOFF = IDTOFF + IDTSIZE
|
|
TSSTOP = TSSOFF + (type TSS386)
|
|
|
|
GDTOFF = ((TSSTOP + 0fh) shr 4) shl 4 ; paragraph align
|
|
GDTLIM = GDT_SIZE - 1
|
|
GDTTOP = GDTOFF + GDT_SIZE
|
|
|
|
DXPMCODEOFF = ((GDTTOP + 0fh) shr 4) shl 4 ; paragraph align
|
|
|
|
LDTOFF = ((DXPMCODEOFF + DXPMCODESIZE + CBPAGE386 - 1) shr 12) shl 12
|
|
LDTSIZE = CDSCMAXLDT * 8
|
|
LDTLIM = LDTSIZE - 1
|
|
LDTTOP = LDTOFF + LDTSIZE
|
|
|
|
;
|
|
; Final place where page tables are mapped in Protected mode is
|
|
; at the first linear page boundary after the end of the LDT.
|
|
;
|
|
|
|
USERPT = (LDTTOP + CBPAGE386 - 1) shr 12
|
|
USERPTOFF = ((LDTTOP + CBPAGE386 - 1) shr 12) shl 12
|
|
|
|
;
|
|
; The total number of 386 pages we need for the block that holds our
|
|
; system tables and protected mode code.
|
|
;
|
|
DXPMPAGES = (LDTTOP + (CBPAGE386 - 1)) shr 12
|
|
DXPMBYTES = DXPMPAGES shl 12
|
|
DXPMPARAGRAPHS = DXPMBYTES shr 4
|
|
|
|
;
|
|
; compile time asserts for sizes/offsets/alignment
|
|
;
|
|
.ERRE (type TSS386) GE 104
|
|
.ERRE TSSTOP LE GDTOFF
|
|
.ERRE IDTOFF EQ ((IDTOFF SHR 4) SHL 4)
|
|
|
|
;
|
|
; Limits of tables
|
|
;
|
|
DXPTMAX = CPTDX * CBPAGE386 ; space we allocate for
|
|
; user page tables
|
|
|
|
;
|
|
; Linear pointers to bases of various tables when running under vcpi
|
|
;
|
|
|
|
; For a selDXPD descriptor (dos extender's page directory)
|
|
;
|
|
LADXPDBASE = DXLINEARBASE + DXPDOFF
|
|
|
|
; For a selDXPT descriptor (dos extender's page tables)
|
|
;
|
|
LADXPTBASE = DXLINEARBASE + USERPTOFF ; (Plus runtime value.)
|
|
|
|
; For a selGDT descriptor
|
|
;
|
|
LADXGDTBASE = DXLINEARBASE + GDTOFF
|
|
|
|
; For a selLDT descriptor
|
|
;
|
|
LADXLDTBASE = DXLINEARBASE + LDTOFF
|
|
|
|
; For a selIDT descriptor
|
|
;
|
|
LADXIDTBASE = DXLINEARBASE + IDTOFF
|
|
|
|
; For a selTSS descriptor
|
|
;
|
|
LADXTSS1BASE = DXLINEARBASE + TSSOFF
|
|
LADXTSS2BASE = DXLINEARBASE + TSSOFF + type TSS386
|
|
|
|
; For a SEL_DXPMCODE descriptor
|
|
;
|
|
LADXPMCODEBASE = DXLINEARBASE + DXPMCODEOFF
|
|
|
|
|
|
;
|
|
; vcpi/ems service macros
|
|
;
|
|
RMvcpi macro fCode
|
|
ifnb <fCode>
|
|
mov ax, fCode
|
|
endif
|
|
int VCPIINT
|
|
endm
|
|
|
|
PMvcpi macro fCode
|
|
ifnb <fCode>
|
|
mov ax, fCode
|
|
endif
|
|
cCall CallVCPIPM
|
|
endm
|
|
|
|
emscall macro fCode
|
|
ifnb <fCode>
|
|
mov ax, fCode
|
|
endif
|
|
int EMS_INT
|
|
endm
|
|
|
|
; EMS functions/subfunctions
|
|
|
|
GETFRAMEADDRESS = 04100h
|
|
|
|
ALLOCATEPAGES = 05A00h
|
|
GETNUMOFPAGES = 04200h
|
|
MAPHANDLEPAGE = 04400h
|
|
DEALLOCATEPAGES = 04500h
|
|
GETEMSVER = 04600h
|
|
SETHANDLENAME = 05301h
|
|
GETPAGEADDRS = 05800h
|
|
GETNUMPAGEMAP = 05801h
|
|
|
|
page
|
|
;
|
|
; VCPI functions/subfunctions
|
|
; all functions take the vcpi function code in ax as input
|
|
; all functions return ah=0 if successful, ah != 0 if failure
|
|
; if function return has no ah value, it can't fail (ah == 0)
|
|
;
|
|
;
|
|
|
|
; vcpi version, presence
|
|
;
|
|
vcpiVER = 0de00h
|
|
;
|
|
; input:
|
|
; return: ah = 0, bl = vcpi minor revision, bh = major revision
|
|
;
|
|
|
|
; get protect mode interface
|
|
;
|
|
vcpiPMINTERFACE = 0de01h
|
|
;
|
|
; input: es:di = ptr to 4k page table,
|
|
; ds:si = ptr to 3 entries in GDT
|
|
; return: di = 1st unused page table entry,
|
|
; ebx = offset in server CS of PM entry point
|
|
;
|
|
|
|
; get max physical address in system
|
|
;
|
|
vcpiMAXPHYSADDR = 0de02h
|
|
;
|
|
; input:
|
|
; return: edx = physical addr of highest 4k page that
|
|
; could ever be allocated
|
|
;
|
|
|
|
; count of free 4k pages
|
|
;
|
|
; Note: This call gives the total 386 pages available to all tasks
|
|
; in the system from the VCPI server. According to VCPI version 1.0,
|
|
; however, we should only allocate as much memory as there is EMS
|
|
; memory available. The following call, therefore, is not real useful
|
|
; to us.
|
|
;
|
|
vcpiCFREEPAGES = 0de03h
|
|
;
|
|
; input:
|
|
; return: edx = number of free 4k pages
|
|
;
|
|
|
|
; allocate a 4k page
|
|
;
|
|
vcpiALLOCPAGE = 0de04h
|
|
;
|
|
; input:
|
|
; return: ah = 0, edx = physical address of allocated 4k page
|
|
; ah != 0, edx = trashed
|
|
;
|
|
|
|
; free a 4k page
|
|
;
|
|
vcpiFREEPAGE = 0de05h
|
|
;
|
|
; input: edx = physical address of page to free
|
|
; return: ah = 0
|
|
; ah != 0
|
|
;
|
|
|
|
; physical address of page in 1st meg
|
|
;
|
|
vcpiPHYSADDRPAGE= 0de06h
|
|
;
|
|
; input: cx = page number (linear addr of page SHR by 12)
|
|
; return: ah = 0, edx = physical address of 4k page
|
|
; ah != 0
|
|
;
|
|
|
|
; read cr0
|
|
;
|
|
vcpiREADCR0 = 0de07h
|
|
;
|
|
; input:
|
|
; return: ebx = cr0 value
|
|
;
|
|
|
|
; read debug registers
|
|
;
|
|
vcpiREADDRx = 0de08h
|
|
;
|
|
; input: es:di = ptr to 8 dwords, dr0 first, dr4, dr5 not present
|
|
; return:
|
|
;
|
|
|
|
; load debug registers
|
|
;
|
|
vcpiLOADDRx = 0de09h
|
|
;
|
|
; input: es:di = ptr to 8 dwords, dr0 first, dr4, dr5 not present
|
|
; return:
|
|
;
|
|
|
|
; get mapping of hardware interrupts
|
|
;
|
|
vcpiGET8259MAP = 0de0ah
|
|
;
|
|
; input:
|
|
; return: bx = 1st vector mapping for master 8259a
|
|
; cx = 1st vector mapping for slave 8259a
|
|
|
|
; set mapping of hardware interrupts
|
|
;
|
|
vcpiSET8259MAP = 0de0bh
|
|
;
|
|
; input: interrupts disabled
|
|
; bx = 1st vector mapping for master 8259a
|
|
; cx = 1st vector mapping for slave 8259a
|
|
; return:
|
|
;
|
|
|
|
; switch from v86 mode to protect mode or protect mode to v86 mode
|
|
;
|
|
vcpiSWITCHTOPM = 0de0ch
|
|
;
|
|
; input: interrupts disabled
|
|
; esi = linear address (in first megabyte) of data
|
|
; structure (v86topm struc)
|
|
;
|
|
; return: (output in pm)
|
|
; gdtr, idtr, ldtr, tr loaded
|
|
; ss:esp must have 16 bytes of space on it, pm must
|
|
; set up it's stack
|
|
; eax = trashed
|
|
; esi = trashed
|
|
; ds, es, fs, gs all modified
|
|
; interrupts disabled
|
|
;
|
|
|
|
vcpiSWITCHTOV86 = 0de0ch
|
|
;
|
|
; input: interrupts disabled
|
|
; STACK: 28 dword gs
|
|
; 24 dword fs
|
|
; 20 dword ds
|
|
; 1c dword es
|
|
; 18 dword ss
|
|
; 14 dword esp
|
|
; 10 dword eflags reserved
|
|
; 0c dword cs xfer to
|
|
; 08 dword eip xfer to
|
|
; 00 qword far32 return (garbage)
|
|
;
|
|
;
|
|
; return: (output in rm)
|
|
; ss:esp loaded with values from stack
|
|
; segment registers loaded with stack values
|
|
; eax = trashed
|
|
; interrupts disabled
|
|
|
|
;
|
|
; structures
|
|
;
|
|
VTP struc
|
|
zaCr3VTP dd 0 ; physical addr of page directory
|
|
laGdtrVTP dd 0 ; linear addr in first meg of gdtr
|
|
laIdtrVTP dd 0 ; linear addr in first meg of idtr
|
|
selLdtVTP dw 0 ; selector of ldt
|
|
selTrVTP dw 0 ; selector of tr
|
|
ipVTP dw 0 ; 48-bit address of protect
|
|
unusedVTP dw 0 ; mode entry point to xfer to
|
|
csVTP dw 0 ;
|
|
VTP ends
|
|
|
|
|
|
ife (CurrentCpu AND 0008h) ;restore cpu type if not 386
|
|
if (CurrentCpu AND 0080h)
|
|
.286p
|
|
else
|
|
.286
|
|
endif
|
|
endif
|