]> wirehaze git hosting - MS-DOS.git/blob - v4.0/src/MEMM/EMM/EMM.H

wirehaze git hosting

MZ is back!
[MS-DOS.git] / v4.0 / src / MEMM / EMM / EMM.H
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 */
72 struct 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 */
84 union 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 */
97 struct 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 */
108 struct 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 */
117 typedef char Handle_Name[Handle_Name_Len];
118
119 /*
120 * Handle_Dir_Entry
121 *
122 */
123 struct 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 */
134 struct 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
178 extern 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 \f
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 */
207 struct 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 */
220 struct PageBankMap {
221 unsigned short pbm_window;
222 unsigned char pbm_map[64];
223 };