1 /*******************************************************************************
3 * (C) Copyright Microsoft Corp. 1986
5 * TITLE: CEMM.EXE - COMPAQ Expanded Memory Manager 386 Driver
6 * EMMLIB.LIB - Expanded Memory Manager Library
8 * MODULE: EMM.H - EMM includes for "C" code
14 *******************************************************************************
16 * Date Version Description
17 * -------- -------- -------------------------------------------------------
19 * 06/14/86 0.00 Changed stack frame structure to match new emmdisp.asm
20 * and allow byte regs access (SBP).
21 * 06/28/86 0.02 Name change from CEMM386 to CEMM (SBP).
22 * 07/06/86 0.04 Changed save area structure (SBP).
24 ******************************************************************************/
27 #define EMM_SW_MALFUNCTION 0x80
28 #define EMM_HW_MALFUNCTION 0x81
29 #define INVALID_HANDLE 0x83
30 #define INVALID_FUNCTION 0x84
31 #define NO_MORE_HANDLES 0x85
32 #define SAVED_PAGE_DEALLOC 0x86
33 #define NOT_ENOUGH_EXT_MEM 0x87
34 #define NOT_ENOUGH_FREE_MEM 0x88
35 #define ZERO_PAGES 0x89
36 #define LOG_PAGE_RANGE 0x8A
37 #define PHYS_PAGE_RANGE 0x8B
38 #define SAVE_AREA_FULL 0x8C
39 #define MAP_PREV_SAVED 0x8D
40 #define NO_MAP_SAVED 0x8E
41 #define INVALID_SUBFUNCTION 0x8F
42 #define FEATURE_NOT_SUPPORTED 0x91
43 #define NAMED_HANDLE_NOT_FOUND 0xA0
44 #define DUPLICATE_HANDLE_NAMES 0xA1
45 #define ACCESS_DENIED 0xA4
48 * various usefull defines
50 #define PAGE_SIZE 0x1000
51 #define NULL_HANDLE (struct handle_ptr *)0x0FFF
52 #define NULL_PAGE 0xFFFF
53 #define NULL_SAVE (struct save_map *)0
55 #define GET 0x00 /* get/set page map sub codes */
60 #define EMM_VERSION 0x40
61 #define Handle_Name_Len 8
64 * defines for INTERNAL vs EXTERNAL current_map save
66 #define INTERNAL_SAVE (unsigned)1
67 #define EXTERNAL_SAVE (unsigned)0
70 * page table structure
72 struct pt { /* page table structure, HW defined */
78 * Size is dynamic, based on number of pages
79 * available. Allocated at intialization time. Each entry
80 * references 4 80386 pages.
81 * Note that the lower 12 bits of the page address are used
85 unsigned long address;
87 unsigned short p_handle;
94 * This is an array of structures that save the
95 * current mapping state. Size is dynamically determined.
98 unsigned short s_handle;
99 unsigned short window[4];
103 * This is an array of handle pointers. It
104 * is dynamically sized based on the amount of memory being
106 * pft_index of NULL_PAGE means free
109 unsigned short page_index; /* index of list header in emm_page */
110 unsigned short page_count; /* size of list in EMM pages */
115 * This is an 8 character handle name.
117 typedef char Handle_Name[Handle_Name_Len];
123 struct Handle_Dir_Entry {
124 unsigned short Handle_Value;
125 Handle_Name Dir_Handle_Name;
130 * register frame on stack
132 * This is the stack frame on entry to the in67 dispatcher
135 unsigned short rdi; /* int 67 entry registers */
169 unsigned short ret_addr; /* return addr */
170 unsigned short rcs; /* CS segment */
171 unsigned short PFlag; /* protected mode flag */
172 unsigned short rds; /* int 67 entry DS segment */
173 unsigned short res; /* int 67 entry ES segment */
174 unsigned short rgs; /* int 67 entry GS segment */
175 unsigned short rfs; /* int 67 entry FS segment */
178 extern struct reg_frame far *regp;
180 * macros to set the value of a given register
183 #define setAH(xx) regp->hregs.h.rah = xx
184 #define setAX(xx) regp->hregs.x.rax = xx
185 #define setBX(xx) regp->hregs.x.rbx = xx
186 #define setCX(xx) regp->hregs.x.rcx = xx
187 #define setDX(xx) regp->hregs.x.rdx = xx
196 * Number of Physical Pages:
198 * LIM 3.2: Page Frame ==> 4 x 16k pages
199 * LIM 4.0: 256k to 640k ==> 24 x 16k pages plus 3.2 page frame
201 #define EMM32_PHYS_PAGES 4
202 #define EMM40_PHYS_PAGES (24 + EMM32_PHYS_PAGES)
205 * structure of mappable physical page
207 struct mappable_page {
208 unsigned short page_seg; /* segment of physical page */
209 unsigned short physical_page; /* physical page number */
212 /* OS/E Enable/Disable defines */
215 #define OS_DISABLED 2
218 * structure of page map `register' bank
221 unsigned short pbm_window;
222 unsigned char pbm_map[64];