summaryrefslogtreecommitdiff
path: root/v4.0/src/MEMM/EMM/EMM.H
diff options
context:
space:
mode:
Diffstat (limited to 'v4.0/src/MEMM/EMM/EMM.H')
-rw-r--r--v4.0/src/MEMM/EMM/EMM.H223
1 files changed, 223 insertions, 0 deletions
diff --git a/v4.0/src/MEMM/EMM/EMM.H b/v4.0/src/MEMM/EMM/EMM.H
new file mode 100644
index 0000000..24c0974
--- /dev/null
+++ b/v4.0/src/MEMM/EMM/EMM.H
@@ -0,0 +1,223 @@
1/*******************************************************************************
2 *
3 * (C) Copyright Microsoft Corp. 1986
4 *
5 * TITLE: CEMM.EXE - COMPAQ Expanded Memory Manager 386 Driver
6 * EMMLIB.LIB - Expanded Memory Manager Library
7 *
8 * MODULE: EMM.H - EMM includes for "C" code
9 *
10 * VERSION: 0.04
11 *
12 * DATE: June 14,1986
13 *
14 *******************************************************************************
15 * CHANGE LOG
16 * Date Version Description
17 * -------- -------- -------------------------------------------------------
18 * 06/14/86 Original
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).
23 *
24 ******************************************************************************/
25
26#define OK 0
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
46
47/*
48 * various usefull defines
49 */
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
54
55#define GET 0x00 /* get/set page map sub codes */
56#define SET 0x01
57#define GETSET 0x02
58#define SIZE 0x03
59
60#define EMM_VERSION 0x40
61#define Handle_Name_Len 8
62
63/*
64 * defines for INTERNAL vs EXTERNAL current_map save
65 */
66#define INTERNAL_SAVE (unsigned)1
67#define EXTERNAL_SAVE (unsigned)0
68
69/*
70 * page table structure
71 */
72struct pt { /* page table structure, HW defined */
73 long pt_entry[1024];
74 };
75
76/*
77 * Page frame table.
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
82 * as a link field
83 */
84union pft386{
85 unsigned long address;
86 struct{
87 unsigned short p_handle;
88 unsigned short high;
89 } words;
90};
91
92/*
93 * save_map
94 * This is an array of structures that save the
95 * current mapping state. Size is dynamically determined.
96 */
97struct save_map{
98 unsigned short s_handle;
99 unsigned short window[4];
100 };
101/*
102 * handle_table
103 * This is an array of handle pointers. It
104 * is dynamically sized based on the amount of memory being
105 * managed.
106 * pft_index of NULL_PAGE means free
107 */
108struct handle_ptr{
109 unsigned short page_index; /* index of list header in emm_page */
110 unsigned short page_count; /* size of list in EMM pages */
111 };
112
113/*
114 * Handle_Name
115 * This is an 8 character handle name.
116 */
117typedef char Handle_Name[Handle_Name_Len];
118
119/*
120 * Handle_Dir_Entry
121 *
122 */
123struct Handle_Dir_Entry {
124 unsigned short Handle_Value;
125 Handle_Name Dir_Handle_Name;
126 };
127
128
129/*
130 * register frame on stack
131 *
132 * This is the stack frame on entry to the in67 dispatcher
133 */
134struct reg_frame {
135 unsigned short rdi; /* int 67 entry registers */
136 unsigned short pad0;
137 unsigned short rsi;
138 unsigned short pad1;
139 unsigned short rbp;
140 unsigned short pad2;
141 unsigned short rsp;
142 unsigned short pad3;
143 union {
144 struct {
145 unsigned short rbx;
146 unsigned short pad4;
147 unsigned short rdx;
148 unsigned short pad5;
149 unsigned short rcx;
150 unsigned short pad6;
151 unsigned short rax;
152 unsigned short pad7;
153 } x;
154 struct {
155 unsigned char rbl;
156 unsigned char rbh;
157 unsigned short pad8;
158 unsigned char rdl;
159 unsigned char rdh;
160 unsigned short pad9;
161 unsigned char rcl;
162 unsigned char rch;
163 unsigned short padA;
164 unsigned char ral;
165 unsigned char rah;
166 unsigned short padB;
167 } h;
168 } hregs;
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 */
176 };
177
178extern struct reg_frame far *regp;
179/*
180 * macros to set the value of a given register
181 * on the stack
182 */
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
188
189
190
191/*
192 * 4.0 EXTRAS
193 */
194
195/*
196 * Number of Physical Pages:
197 *
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
200 */
201#define EMM32_PHYS_PAGES 4
202#define EMM40_PHYS_PAGES (24 + EMM32_PHYS_PAGES)
203
204/*
205 * structure of mappable physical page
206 */
207struct mappable_page {
208 unsigned short page_seg; /* segment of physical page */
209 unsigned short physical_page; /* physical page number */
210};
211
212/* OS/E Enable/Disable defines */
213#define OS_IDLE 0
214#define OS_ENABLED 1
215#define OS_DISABLED 2
216
217/*
218 * structure of page map `register' bank
219 */
220struct PageBankMap {
221 unsigned short pbm_window;
222 unsigned char pbm_map[64];
223 };