2025-04-27 07:49:33 -04:00

298 lines
5.4 KiB
NASM
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

TITLE XMM_INTERFACE.ASM
NAME XMM_INTERFACE
;*******************************************************************************
; ;
; XMM C Interface Routines ;
; ;
; Microsoft Confidential
; Copyright (C) Microsoft Corporation 1988,1991
; All Rights Reserved.
; ;
;*******************************************************************************
?PLM=0
?WIN=0
include cmacros.inc
sBegin Data
XMM_Initialised dw 0
XMM_Control label dword
dw CodeOFFSET XMM_NotInitialised
dw seg _TEXT
sEnd Data
sBegin CODE
assumes cs, CODE
assumes ds, DGROUP
;
; Macro to convert from XMS success/fail to
; a form more acceptable for C. IE.
;
; AX == 1 becomes DX:AX = 0
; AX != 1 becomes DX:AX = BL << 24 | (AX - 1)
;
; Since Error Codes returned in BL have the top bit
; set, C will interpret the return as negative.
;
SuccessFail macro
local Success
xor dx, dx
dec ax
jz Success
mov dh, bl
Success:
endm
;
; Macro to convert from XMS return value in AX
; a form more acceptable for C. IE.
;
; AX != 0 becomes DX:AX = AX
; AX == 0 becomes DX:AX = BL << 24 | AX
;
; Since Error Codes returned in BL have the top bit
; set, C will interpret the return as negative.
; XMS returns of this type return BL == 0 on success.
;
SuccessFailAX macro
local Success
xor dx, dx
or ax, ax
jnz Success
mov dh, bl
Success:
endm
;
; Macro to convert from XMS return value in DX
; a form more acceptable for C. IE.
;
; AX != 0 becomes DX:AX = DX
; AX == 0 becomes DX:AX = BL << 24 | DX
;
; Since Error Codes returned in BL have the top bit
; set, C will interpret the return as negative.
; XMS returns of this type return BL == 0 on success.
;
SuccessFailDX macro
local Success
or ax, ax
mov ax, dx
mov dx, 0 ; Preserves Flags
jnz Success
mov dh, bl
Success:
endm
cProc XMM_NotInitialised, <FAR>
cBegin
xor ax, ax ; Immediate failure
mov bl, 80h ; Not Implemented
cEnd
cProc XMM_Installed, <NEAR, PUBLIC>, <si, di>
cBegin
cmp [XMM_Initialised], 0
jne Already_Initialised
mov ax, 4300h ; Test for XMM
int 2fh
cmp al, 80h
jne NoDriver
mov ax, 4310h ; Get Control Function
int 2fh
mov word ptr [XMM_Control], bx
mov word ptr [XMM_Control+2], es
inc [XMM_Initialised]
NoDriver:
Already_Initialised:
mov ax, [XMM_Initialised]
cEnd
cProc XMM_Version, <NEAR, PUBLIC>, <si, di>
cBegin
xor ah, ah ; Function 0
call [XMM_Control]
mov dx, bx ; Return a long
cEnd
;
; long XMM_RequestHMA(Space_Needed: unsigned short);
;
cProc XMM_RequestHMA, <NEAR, PUBLIC>, <si, di>
parmW Space_Needed
cBegin
mov ah, 1
mov dx, Space_Needed
call [XMM_Control]
SuccessFail
cEnd
cProc XMM_ReleaseHMA, <NEAR, PUBLIC>, <si, di>
cBegin
mov ah, 2
call [XMM_Control]
SuccessFail
cEnd
cProc XMM_GlobalEnableA20, <NEAR, PUBLIC>, <si, di>
cBegin
mov ah, 3
call [XMM_Control]
SuccessFail
cEnd
cProc XMM_GlobalDisableA20, <NEAR, PUBLIC>, <si, di>
cBegin
mov ah, 4
call [XMM_Control]
SuccessFail
cEnd
cProc XMM_EnableA20, <NEAR, PUBLIC>, <si, di>
cBegin
mov ah, 5
call [XMM_Control]
SuccessFail
cEnd
cProc XMM_DisableA20, <NEAR, PUBLIC>, <si, di>
cBegin
mov ah, 6
call [XMM_Control]
SuccessFail
cEnd
cProc XMM_QueryA20, <NEAR, PUBLIC>, <si, di>
cBegin
mov ah, 7
call [XMM_Control]
SuccessFailAX
cEnd
cProc XMM_QueryLargestFree, <NEAR, PUBLIC>, <si, di>
cBegin
mov ah, 8
call [XMM_Control]
SuccessFailAX
cEnd
cProc XMM_QueryTotalFree, <NEAR, PUBLIC>, <si, di>
cBegin
mov ah, 8
call [XMM_Control]
SuccessFailDX
cEnd
cProc XMM_AllocateExtended, <NEAR, PUBLIC>, <si, di>
parmW SizeK
cBegin
mov ah, 9
mov dx, SizeK
call [XMM_Control]
SuccessFailDX
cEnd
cProc XMM_FreeExtended, <NEAR, PUBLIC>, <si, di>
parmW Handle
cBegin
mov ah, 0Ah
mov dx, Handle
call [XMM_Control]
SuccessFail
cEnd
cProc XMM_MoveExtended, <NEAR, PUBLIC>, <si, di>
parmW pInfo
cBegin
mov ah, 0Bh
mov si, pInfo ; DS:SI => Description
call [XMM_Control]
SuccessFail
cEnd
cProc XMM_LockExtended, <NEAR, PUBLIC>, <si, di>
parmW Handle
cBegin
mov ah, 0Ch
mov dx, Handle
call [XMM_Control]
xchg ax, bx
dec bx
jz XMML_Success
mov dh, al
XMML_Success:
cEnd
cProc XMM_UnLockExtended, <NEAR, PUBLIC>, <si, di>
parmW Handle
cBegin
mov ah, 0Dh
mov dx, Handle
call [XMM_Control]
SuccessFail
cEnd
cProc XMM_GetHandleLength, <NEAR, PUBLIC>, <si, di>
parmW Handle
cBegin
mov ah, 0Eh
mov dx, Handle
call [XMM_Control]
SuccessFailDX
cEnd
cProc XMM_GetHandleInfo, <NEAR, PUBLIC>, <si, di>
parmW Handle
cBegin
mov ah, 0Eh
mov dx, Handle
call [XMM_Control]
mov dx, bx
SuccessFailDX
cEnd
cProc XMM_ReallocateExtended, <NEAR, PUBLIC>, <si, di>
parmW Handle
parmW NewSize
cBegin
mov ah, 0Fh
mov dx, Handle
mov bx, NewSize
call [XMM_Control]
SuccessFail
cEnd
cProc XMM_RequestUMB, <NEAR, PUBLIC>, <si, di>
parmW UMBSize
cBegin
mov ah, 10h
mov dx, UMBSize
call [XMM_Control]
xchg bx, ax ; Segment in AX, Size in DX
dec bx
jz RUMB_Success
xchg ax, dx ; Largest available size in AX
mov dh, dl ; Error code now in DH
RUMB_Success:
cEnd
cProc XMM_ReleaseUMB, <NEAR, PUBLIC>, <si, di>
parmW UMBSegment
cBegin
mov ah, 11h
mov dx, UMBSegment
call [XMM_Control]
SuccessFail
cEnd
sEnd CODE
END