windows-nt/Source/XPSP1/NT/base/mvdm/dpmi/dxemm2.asm
2020-09-26 16:20:57 +08:00

140 lines
3.3 KiB
NASM

PAGE ,132
TITLE DXEMM2.ASM -- Dos Extender MEMM Enable Code
; Copyright (c) Microsoft Corporation 1989-1991. All Rights Reserved.
;***********************************************************************
;
; DXEMM2.ASM -- Dos Extender MEMM Enable Code
;
;-----------------------------------------------------------------------
;
; This module provides routines that attempt to enable MEMM/CEMM/EMM386
; drivers. DOSX tries to disable MEMM when starting up, and enables MEMM
; when terminating.
;
; NOTE: This code is in a seperate file from the disable logic because
; the disable code is discarded after initialization.
;
;-----------------------------------------------------------------------
;
; 12/08/89 jimmat Finally got around to implementing this.
;
;***********************************************************************
.286p
; -------------------------------------------------------
; INCLUDE FILE DEFINITIONS
; -------------------------------------------------------
.xlist
.sall
include segdefs.inc
include gendefs.inc
.list
if NOT VCPI
; -------------------------------------------------------
; GENERAL SYMBOL DEFINITIONS
; -------------------------------------------------------
; -------------------------------------------------------
; EXTERNAL SYMBOL DEFINITIONS
; -------------------------------------------------------
; -------------------------------------------------------
; DATA SEGMENT DEFINITIONS
; -------------------------------------------------------
DXDATA segment
public fMEMM_Disabled, MEMM_State, MEMM_Call
fMEMM_Disabled db 0 ; NZ if MEMM disabled
MEMM_state db 0 ; Initial MEMM state
MEMM_Call dd 0 ; far call address into EMM driver
DXDATA ends
; -------------------------------------------------------
; CODE SEGMENT VARIABLES
; -------------------------------------------------------
DXCODE segment
DXCODE ends
DXPMCODE segment
DXPMCODE ends
; -------------------------------------------------------
subttl MEMM/CEMM/EMM386 Enable Routines
page
; -------------------------------------------------------
; MEMM/CEMM/EMM386 ENABLE ROUTINES
; -------------------------------------------------------
DXCODE segment
assume cs:DXCODE
; -------------------------------------------------------
; EMMEnable -- This routine attempts to re-enable any installed
; MEMM/CEMM/EMM386 driver.
;
; Input: none
; Output: CY off - EMM driver enabled (or never disabled)
; CY set - EMM installed, and can't disable
; Errors:
; Uses: All registers preserved
assume ds:DGROUP,es:NOTHING,ss:NOTHING
public EMMEnable
EMMEnable proc near
push ax
cmp fMEMM_Disabled,0 ; Did we disable MEMM before?
jz enable_exit ; no, don't need to enable then
mov ah,01 ; Set state command
mov al,MEMM_state ; Get initial state
cmp al,2 ; They return 0 (on), 1 (off),
jbe @f ; 2 (auto on), 3 (auto off) -- but
mov al,2 ; we can only set 1 - 2
@@:
call [MEMM_Call] ; and restore it
jc not_enabled
mov fMEMM_Disabled,0 ; no longer disabled
clc
jmp short enable_exit
not_enabled:
stc
enable_exit:
pop ax
ret
EMMEnable endp
; -------------------------------------------------------
DXCODE ends
;****************************************************************
endif ; NOT VCPI
end