emmfunct.inc
上传用户:xiaoan1112
上传日期:2013-04-11
资源大小:19621k
文件大小:11k
源码类别:

操作系统开发

开发平台:

Visual C++

  1. ifndef INC_LIST
  2. .xlist
  3. endif
  4. ;******************************************************************************
  5. ;
  6. ; (C) Copyright MICROSOFT Corp. 1986-1991
  7. ; (C) Copyright COMPAQ Computer Corp. 1986-1991
  8. ;
  9. ; Title: EMM386.EXE - MICROSOFT Expanded Memory Manager 386 Driver
  10. ; EMMLIB.LIB - Expanded Memory Manager Library
  11. ;
  12. ; Module: EMMFUNCT.INC - defines for EMM code.
  13. ;
  14. ; Version: 0.10
  15. ;
  16. ; Date: June 21, 1986
  17. ;
  18. ; Author: Steve Preston
  19. ;
  20. ;******************************************************************************
  21. ;
  22. ; Change log:
  23. ;
  24. ; DATE REV DESCRIPTION
  25. ; -------- ------ -----------------------------------------------------
  26. ; 06/21/86 0.0
  27. ; 06/25/86 0.02 Changed TOTAL_HANDLES to 255 to match LIM spec (SBP).
  28. ; 06/28/86 0.02 Name change from CEMM386 to CEMM (SBP).
  29. ; 07/06/86 0.04 Changed save area struct (SBP).
  30. ; 01/01/89 0.10 Rewritten for LIM 4.0 (DJM).
  31. ;******************************************************************************
  32. ;******************************************************************************
  33. ; GENERAL DEFINES
  34. ;******************************************************************************
  35. MAX_HANDLES EQU 255 ; total number of handles supported
  36. MAX_REGISTER_SETS EQU 255 ; number of register sets
  37. TOTAL_EMS_WINDOWS EQU 48 ; Maximum number of 4.0 windows
  38. TOTAL_PF_WINDOWS EQU 4 ; total number of 3.2 windows
  39. TOTAL_PAGE_TABLES = 10 ; total number of page tables
  40. NUMBER_BASE_WINDOWS = 16 ; number of windows from 256k to 512k
  41. FIRST_HANDLE_PTE = 0C00h ; starting location for handles
  42. TOTAL_HANDLE_PTES = 1000h ; number of handle PTEs
  43. PAGE_SIZE = 1000h ; 4k page size
  44. EMS_PAGE_SIZE = 4000H ; 16k EMS pages
  45. START_OF_ROM_MEMORY = 0E000h
  46. MAX_SIZE =   (32 * 1024) ; max size of EMS memory pool
  47. MS_DOS = 21h ; DOS interrupts
  48. PRINT_STRING = 09h ; DOS print string
  49. GET_VERSION = 30h ; DOS get version
  50. X_HI_MEM_SEG = 0F000h ; segment for the following words
  51. X_MT_AT  = 0FFFEh ; Machine type
  52. DOS3X_ADJ = 1 ; DOS 3.x base memory adjustment
  53. MAX_ARG_LEN = 5 ; max command line argument length
  54. OS_ENABLED_BIT = 0 ; bit index into OS_function variable
  55. OS_KEY_OUT_BIT = 1 ; bit index into OS_function variable
  56. SAVE_MAP_IN_USE_BIT = 15 ; bit index into the save_map array
  57. PAGE_ALLOCATED_BIT = 9 ; bit index into a page table entry
  58. PAGE_ALLOCATED_BIT_MASK = 0200h ; bit mask for above bit
  59. VCPI_USAGE_BIT = 10 ; bit index into a page table entry
  60. HANDLE_ALLOCATED_BIT = 11 ; bit index into a page table entry
  61. HANDLE_ALLOCATED_BIT_SET= 800h ; bit index into a page table entry
  62. TRUE = 1
  63. FALSE = 0
  64. FREE = -1 ; for save_flag
  65. EMS_STATUS_FUNCTION = 40h
  66. VCPI_FUNCTION_OPCODE = 0DEh
  67. NULL_PAGE = 7FFFh ; defines a handle not in use
  68. PTE_ADDRESS_BIT_MASK =   0FFFFF000h ; bit mask for a page table entry
  69. PTE_CONTROL_BIT_MASK =   000000FFFh ; bit mask for a page table entry
  70. EMM_VERSION = 040h ; the current version
  71. UNMAP_WINDOW_OPCODE = 0FFFFh ; for unmapping a window
  72. DOS_MASTER_VECTOR = 08h ; normal DOS master 8259 vector
  73. DOS_SLAVE_VECTOR = 70h ; normal DOS slave 8259 vector
  74. TSS_RESET_BUSY equ 0FDh ; for turning off the TSS's busy bit
  75. ;******************************************************************************
  76. ; STATUS DEFINES
  77. ;******************************************************************************
  78. OK = 0
  79. EMM_SW_MALFUNCTION = 080h
  80. EMM_HW_MALFUNCTION = 081h
  81. INVALID_HANDLE = 083h
  82. INVALID_FUNCTION = 084h
  83. NO_MORE_HANDLES  = 085h
  84. SAVED_PAGE_DEALLOC = 086h
  85. NOT_ENOUGH_EXT_MEM = 087h
  86. NOT_ENOUGH_FREE_MEM = 088h
  87. ZERO_PAGES = 089h
  88. LOG_PAGE_RANGE = 08Ah
  89. PHYS_PAGE_RANGE  = 08Bh
  90. SAVE_AREA_FULL = 08Ch
  91. MAP_PREV_SAVED = 08Dh
  92. NO_MAP_SAVED = 08Eh
  93. INVALID_SUBFUNCTION = 08Fh
  94. NOT_SUPPORTED = 091h
  95. SUCCESSFUL_OVERLAP = 092h
  96. INSUFFICIENT_MEMORY = 093h
  97. INVALID_OFFSET = 095h
  98. INVALID_REGION = 096h
  99. INVALID_OVERLAP  = 097h
  100. INVALID_SOURCE_TYPE = 098h
  101. UNSUPPORTED_REGISTER_SET= 09Ah
  102. NO_FREE_REGISTER_SETS = 09Bh
  103. NO_ALT_DMA_REG_SETS = 09Ch
  104. NO_ALT_REG_SETS  = 09Ch
  105. INVALID_REGISTER_SET = 09Dh
  106. NO_DEDICATED_DMA = 09Eh
  107. NAME_NOT_FOUND = 0A0h
  108. INVALID_NAME = 0A1h
  109. WRAP_AT_1MB = 0A2h
  110. WINDOW_INDEX_RANGE = 0A3h
  111. ACCESS_DENIED = 0A4h
  112. ;==============================================================================
  113. ;==  Flags used allocation/deallocation of memory
  114. ;==============================================================================
  115. fEMSPageAllocatedBit equ 9 ; bit to indicate an EMS allocated page
  116. fVCPIPageAllocatedBit equ 10 ; bit to indicate a VCPI allocated page
  117. fXMSPageAllocatedBit equ 11 ; bit to indicate a page from XMS pool
  118. fEMSPageAllocated equ 1 shl fEMSPageAllocatedBit
  119. fVCPIPageAllocated equ 1 shl fVCPIPageAllocatedBit
  120. fXMSPageAllocated equ 1 shl fXMSPageAllocatedBit
  121. fWINPageBit equ 9 ; bit to indicate page for WINdows
  122. fWINPage equ 1 shl fWINPageBit
  123. ;==============================================================================
  124. ;==  Flags used for Page4K[] array.
  125. ;==============================================================================
  126. INUSEbit equ  0   ; for WinSrch: ROM and default eXclude
  127. EXCLUDEbit equ 1 ; for user specified X= parameter
  128. RAMbit equ 2 ; for RAM=mmmm-nnnn
  129. EMSbit equ 3 ; for EMS=mmmm-nnnn
  130. ROMbit equ 4 ; for ROM=mmmm-nnnn
  131. WINbit equ 5 ; for WIN=mmmm-nnnn
  132. INUSE equ 1 shl INUSEbit
  133. EXCLUDE equ  1 shl EXCLUDEbit
  134. RAM equ 1 shl RAMbit
  135. EMS equ 1 shl EMSbit
  136. ROM equ 1 shl ROMbit
  137. WIN equ 1 shl WINbit
  138. ;******************************************************************************
  139. ; VCPI STATUS DEFINES
  140. ;******************************************************************************
  141. SUCCESS  equ 000h ; return code for AH using 32-bit regs
  142. FAILURE  equ 0ffh ; return code for AH using 32-bit regs
  143. D_PRES equ 080h ; present in memory
  144. D_DPL0 equ 0 ; Ring 0
  145. D_CTRL equ 0 ; Control descriptor
  146. D_386INT_GATE equ 0eh ; 386 interrupt gate
  147. D_386INT0 equ (D_PRES+D_DPL0+D_CTRL+D_386INT_GATE) ; Ring 0 int gate
  148. ;******************************************************************************
  149. ;  S T R U C T U R E S
  150. ;******************************************************************************
  151. ;***********************************************************************
  152. ; EMSmap[]
  153. ; This structure is used for holding info about the EMS windows.
  154. ; The windows mapping consist of PTE entries.
  155. ;***********************************************************************
  156. EMSmap_struc struc
  157. dd 0
  158. EMSmap_struc ends
  159. ;***********************************************************************
  160. ; RegisterStack_struc[]
  161. ; This structure is used for accessing the user's original registers.
  162. ; There are 2 EBP locations which have different meanings depending
  163. ; on how CEMM was called.  If CEMM was on (in protected mode) then
  164. ; 'stack_frame_EBP' points to the fault stack frame on the ring zero
  165. ; stack and 'reg_EBP' is the user's EBP.  If CEMM was off (in real mode)
  166. ; then 'stack_frame_EBP' is the user's original EBP and there is no
  167. ; fault stack frame.
  168. ;***********************************************************************
  169. RegisterStack_struc struc
  170. reg_EDI  dd ?
  171. reg_ESI  dd ?
  172. stack_frame_EBP dd ?
  173. reg_ESP  dd ?
  174. reg_EBX  dd ?
  175. reg_EDX  dd ?
  176. reg_ECX  dd ?
  177. reg_EAX  dd ?
  178. ret_IP dw ?
  179. ret_CS dw ?
  180. reg_DS dw ?
  181. reg_ES dw ?
  182. reg_EBP  dd ?
  183. RegisterStack_struc ends
  184. ;***********************************************************************
  185. ; register_set[]
  186. ; This structure is used with the register_set array.  The
  187. ; 'active' fields specifies if this register set has been allocated
  188. ; or not.  The 'saved_mapping' is the window mapping for this set.
  189. ;***********************************************************************
  190. RegisterSet_struc struc
  191. active db 0
  192. RSrsvd db 0
  193. a20_state dw 0
  194. page_table_ptr dd 0
  195. RegisterSet_struc ends
  196. ifdef QEMS
  197. RegisterSet_struc struc
  198. active db 0
  199. a20_state dw 0
  200. page_table_ptr dd 0
  201. saved_mapping dw 0
  202. dd TOTAL_EMS_WINDOWS dup (NULL_PAGE)
  203. RegisterSet_struc ends
  204. endif
  205. ;***********************************************************************
  206. ; handle_table[]
  207. ; This structure is used with the handle_table[] array for
  208. ; holding handle information.  The 'base_PTE_index' is the PTE index
  209. ; where the handle starts at.  The 'number_PTEs' is how many PTE's
  210. ; are allocated to this handle.  The PTE's are always contiguous and
  211. ; for each PTE, the address saved in it is allocated to that handle.
  212. ; A value of NULL_PAGE in 'base_PTE_index' means the handle is free.
  213. ;***********************************************************************
  214. HandleTable_struc struc
  215. base_PTE_index dw ?
  216. number_PTEs dw ?
  217. HandleTable_struc ends
  218. HandleName_struc STRUC
  219. DB 8 DUP (0)
  220. HandleName_struc ENDS
  221. HandleSaveMap_struc STRUC
  222. dd 4 dup (0)
  223. HandleSaveMap_struc ENDS
  224. ifdef QEMS
  225. ;***********************************************************************
  226. ; EMS_window[]
  227. ; This structure is used for holding info about the EMS windows.
  228. ; The windows mapping consist of its handle and logical page.
  229. ;***********************************************************************
  230. EMS_window_struc struc
  231. handle DB ?
  232. logical_4k_page dw ?
  233. EMS_window_struc ends
  234. endif
  235. ;***********************************************************************
  236. ; MACROS
  237. ; These macro's are needed due to a 80386 bug in versions prior to
  238. ; the D step.  The problem is that the EDI register will not be
  239. ; incremented correctly but only the 16 bit DI register is if an
  240. ; address size override instruction does not follow.
  241. ;***********************************************************************
  242. REP_MOVS_DWORD_USING_DS_ESI macro
  243. rep movs dword ptr es:[edi],dword ptr ds:[esi]
  244. db 67h
  245. nop
  246. endm
  247. REP_MOVS_WORD_USING_DS_ESI macro
  248. rep movs word ptr es:[edi], word ptr ds:[esi]
  249. db 67h
  250. nop
  251. endm
  252. REP_MOVS_BYTE_USING_DS_ESI macro
  253. rep movs BYTE ptr es:[edi], BYTE ptr ds:[esi]
  254. db 67h
  255. nop
  256. endm
  257. MOVS_DWORD_USING_DS_ESI macro
  258. movs dword ptr es:[edi],dword ptr ds:[esi]
  259. db 67h
  260. nop
  261. endm
  262. MOVS_WORD_USING_DS_ESI macro
  263. movs word ptr es:[edi],word ptr ds:[esi]
  264. db 67h
  265. nop
  266. endm
  267. REP_MOVS_DWORD_USING_ES_ESI macro
  268. rep movs dword ptr es:[edi],dword ptr es:[esi]
  269. db 67h
  270. nop
  271. endm
  272. MOVS_DWORD_USING_ES_ESI macro
  273. movs dword ptr es:[edi],dword ptr es:[esi]
  274. db 67h
  275. nop
  276. endm
  277. REP_MOVS_BYTE_USING_ES_ESI macro
  278. rep movs byte ptr es:[edi],byte ptr es:[esi]
  279. db 67h
  280. nop
  281. endm
  282. MOVS_BYTE_USING_ES_ESI macro
  283. movs byte ptr es:[edi],byte ptr es:[esi]
  284. db 67h
  285. nop
  286. endm
  287. STOS_BYTE_PTR_ES_EDI macro
  288. stos byte ptr es:[edi]
  289. db 67h ; Address mode prefix
  290. nop
  291. endm
  292. STOS_WORD_PTR_ES_EDI macro
  293. stos word ptr es:[edi]
  294. db 67h ; Address mode prefix
  295. nop
  296. endm
  297. STOS_DWORD_PTR_ES_EDI macro
  298. stos dword ptr es:[edi]
  299. db 67h ; Address mode prefix
  300. nop
  301. endm
  302. REP_STOS_DWORD_PTR_ES_EDI macro
  303. rep stos    dword ptr es:[edi]
  304. db 67h ; Address mode prefix
  305. nop
  306. endm
  307. LODS_BYTE_PTR_ES_ESI macro
  308. lods byte ptr es:[esi]
  309. db 67h ; Address mode prefix
  310. nop
  311. endm
  312. LODS_WORD_PTR_ES_ESI macro
  313. lods word ptr es:[esi]
  314. db 67h ; Address mode prefix
  315. nop
  316. endm
  317. LODS_DWORD_PTR_ES_ESI macro
  318. lods dword ptr es:[esi]
  319. db 67h ; Address mode prefix
  320. nop
  321. endm
  322. .list