279 lines
6.4 KiB
NASM
279 lines
6.4 KiB
NASM
|
page ,132
|
||
|
;-----------------------------Module-Header-----------------------------;
|
||
|
; Module Name: HEAP.ASM
|
||
|
;
|
||
|
; This module contains functions for dealing with external local heaps
|
||
|
;
|
||
|
; Created: 09-20-90
|
||
|
; Author: Todd Laney [ToddLa]
|
||
|
;
|
||
|
; Copyright (c) 1984-1990 Microsoft Corporation
|
||
|
;
|
||
|
; Exported Functions: none
|
||
|
;
|
||
|
; Public Functions: HeapCreate
|
||
|
; HeapDestroy
|
||
|
; HeapAlloc
|
||
|
; HeapFree
|
||
|
;
|
||
|
; Public Data: none
|
||
|
;
|
||
|
; General Description:
|
||
|
;
|
||
|
; Restrictions:
|
||
|
;
|
||
|
;-----------------------------------------------------------------------;
|
||
|
|
||
|
?PLM = 1
|
||
|
?WIN = 0
|
||
|
?NODATA = 1
|
||
|
.286p
|
||
|
|
||
|
.xlist
|
||
|
include cmacros.inc
|
||
|
include windows.inc
|
||
|
.list
|
||
|
|
||
|
MIN_HEAPSIZE = 128
|
||
|
GMEM_SHARE = GMEM_DDESHARE
|
||
|
|
||
|
externFP LocalInit ; in KERNEL
|
||
|
externFP LocalAlloc ; in KERNEL
|
||
|
externFP LocalReAlloc ; in KERNEL
|
||
|
externFP LocalFree ; in KERNEL
|
||
|
externFP LocalCompact ; in KERNEL
|
||
|
externFP GlobalAlloc ; in KERNEL
|
||
|
externFP GlobalLock ; in KERNEL
|
||
|
externFP GlobalUnlock ; in KERNEL
|
||
|
externFP GlobalFree ; in KERNEL
|
||
|
|
||
|
|
||
|
; The following structure should be used to access high and low
|
||
|
; words of a DWORD. This means that "word ptr foo[2]" -> "foo.hi".
|
||
|
|
||
|
LONG struc
|
||
|
lo dw ?
|
||
|
hi dw ?
|
||
|
LONG ends
|
||
|
|
||
|
FARPOINTER struc
|
||
|
off dw ?
|
||
|
sel dw ?
|
||
|
FARPOINTER ends
|
||
|
|
||
|
createSeg INIT, InitSeg, word, public, CODE
|
||
|
|
||
|
sBegin InitSeg
|
||
|
assumes cs,InitSeg
|
||
|
assumes ds,nothing
|
||
|
assumes es,nothing
|
||
|
|
||
|
;---------------------------Public-Routine------------------------------;
|
||
|
; HeapCreate
|
||
|
;
|
||
|
; Create a external heap
|
||
|
;
|
||
|
; Entry:
|
||
|
; cbSize is the initial size of the heap
|
||
|
;
|
||
|
; Returns:
|
||
|
; AX = handle to heap
|
||
|
; Error Returns:
|
||
|
; AX = 0
|
||
|
; Registers Preserved:
|
||
|
; BP,DS,SI,DI
|
||
|
; Registers Destroyed:
|
||
|
; AX,BX,CX,DX,FLAGS
|
||
|
; Calls:
|
||
|
; GlobalAlloc, LocalInit
|
||
|
; History:
|
||
|
; Fri 21-Sep-1990 13:45:58 -by- Todd Laney [ToddLa]
|
||
|
; Created.
|
||
|
;-----------------------------------------------------------------------;
|
||
|
assumes ds,nothing
|
||
|
assumes es,nothing
|
||
|
|
||
|
cProc HeapCreate, <FAR,PUBLIC>, <>
|
||
|
ParmW cbSize
|
||
|
cBegin
|
||
|
mov ax,cbSize
|
||
|
cmp ax,MIN_HEAPSIZE
|
||
|
jg hc_alloc
|
||
|
mov ax,MIN_HEAPSIZE
|
||
|
mov cbSize,ax
|
||
|
|
||
|
hc_alloc:
|
||
|
cCall GlobalAlloc, <GHND+GMEM_SHARE,0,ax>
|
||
|
or ax,ax
|
||
|
jz hc_exit
|
||
|
|
||
|
cCall GlobalLock, <ax>
|
||
|
push dx
|
||
|
mov ax,cbSize
|
||
|
dec ax
|
||
|
cCall LocalInit,<dx,0,ax>
|
||
|
pop ax
|
||
|
hc_exit:
|
||
|
cEnd
|
||
|
|
||
|
;---------------------------Public-Routine------------------------------;
|
||
|
; HeapDestroy
|
||
|
;
|
||
|
; Destroys a external heap
|
||
|
;
|
||
|
; Entry:
|
||
|
; hHeap contains heap handle (ie the selector)
|
||
|
;
|
||
|
; Returns:
|
||
|
; none
|
||
|
; Error Returns:
|
||
|
; none
|
||
|
; Registers Preserved:
|
||
|
; BP,DS,SI,DI
|
||
|
; Registers Destroyed:
|
||
|
; AX,BX,CX,DX,FLAGS
|
||
|
; Calls:
|
||
|
; GlobalUnlock, GlobalFree
|
||
|
; History:
|
||
|
; Fri 21-Sep-1990 13:45:58 -by- Todd Laney [ToddLa]
|
||
|
; Created.
|
||
|
;-----------------------------------------------------------------------;
|
||
|
assumes ds,nothing
|
||
|
assumes es,nothing
|
||
|
|
||
|
cProc HeapDestroy, <FAR,PUBLIC>, <>
|
||
|
ParmW hHeap
|
||
|
cBegin
|
||
|
cCall GlobalUnlock, <hHeap> ; !!! only need in REAL mode
|
||
|
cCall GlobalFree, <hHeap>
|
||
|
cEnd
|
||
|
|
||
|
sEnd
|
||
|
|
||
|
ifndef SEGNAME
|
||
|
SEGNAME equ <_TEXT>
|
||
|
endif
|
||
|
|
||
|
createSeg %SEGNAME, CodeSeg, word, public, CODE
|
||
|
|
||
|
sBegin CodeSeg
|
||
|
assumes cs,CodeSeg
|
||
|
assumes ds,nothing
|
||
|
assumes es,nothing
|
||
|
|
||
|
;---------------------------Public-Routine------------------------------;
|
||
|
; HeapAlloc
|
||
|
;
|
||
|
; allocate memory from a external heap
|
||
|
;
|
||
|
; Entry:
|
||
|
; hHeap contains heap handle (ie the selector)
|
||
|
; cbSize contains the requested size of the allocation
|
||
|
;
|
||
|
; Returns:
|
||
|
; DX:AX = pointer to allocated object
|
||
|
; Error Returns:
|
||
|
; DX:AX = NULL
|
||
|
; Registers Preserved:
|
||
|
; BP,DS,SI,DI
|
||
|
; Registers Destroyed:
|
||
|
; AX,BX,CX,DX,FLAGS
|
||
|
; Calls:
|
||
|
; LocalAlloc
|
||
|
; History:
|
||
|
; Fri 21-Sep-1990 13:45:58 -by- Todd Laney [ToddLa]
|
||
|
; Created.
|
||
|
;-----------------------------------------------------------------------;
|
||
|
assumes ds,nothing
|
||
|
assumes es,nothing
|
||
|
|
||
|
cProc HeapAlloc, <FAR,PUBLIC>, <ds>
|
||
|
ParmW hHeap
|
||
|
ParmW cbSize
|
||
|
cBegin
|
||
|
mov ds,hHeap
|
||
|
cCall LocalAlloc, <LPTR, cbSize>
|
||
|
xor dx,dx
|
||
|
or ax,ax
|
||
|
jz hal_exit
|
||
|
mov dx,ds
|
||
|
hal_exit:
|
||
|
cEnd
|
||
|
|
||
|
;---------------------------Public-Routine------------------------------;
|
||
|
; HeapReAlloc
|
||
|
;
|
||
|
; reallocate memory from a external heap
|
||
|
;
|
||
|
; Entry:
|
||
|
; lpObject contains the pointer to the object to be reallocated
|
||
|
; cbSize contains the requested size of the reallocation
|
||
|
;
|
||
|
; Returns:
|
||
|
; DX:AX = pointer to allocated object
|
||
|
; Error Returns:
|
||
|
; DX:AX = NULL
|
||
|
; Registers Preserved:
|
||
|
; BP,DS,SI,DI
|
||
|
; Registers Destroyed:
|
||
|
; AX,BX,CX,DX,FLAGS
|
||
|
; Calls:
|
||
|
; LocalAlloc
|
||
|
; History:
|
||
|
; Wed 8-Jan-1991 1: 2: 3 -by- David Levine [DavidLe]
|
||
|
; Created based on HeapAlloc.
|
||
|
;-----------------------------------------------------------------------;
|
||
|
assumes ds,nothing
|
||
|
assumes es,nothing
|
||
|
|
||
|
cProc HeapReAlloc, <FAR,PUBLIC>, <ds>
|
||
|
ParmD lpObject
|
||
|
ParmW cbSize
|
||
|
cBegin
|
||
|
lds ax,lpObject
|
||
|
|
||
|
AllocFlags EQU LMEM_MOVEABLE OR LMEM_ZEROINIT
|
||
|
|
||
|
cCall LocalReAlloc, <ax, cbSize, AllocFlags>
|
||
|
xor dx,dx
|
||
|
or ax,ax
|
||
|
jz hral_exit
|
||
|
mov dx,ds
|
||
|
hral_exit:
|
||
|
cEnd
|
||
|
|
||
|
;---------------------------Public-Routine------------------------------;
|
||
|
; HeapFree
|
||
|
;
|
||
|
; free memory from a external heap
|
||
|
;
|
||
|
; Entry:
|
||
|
; hObject contains the object to free
|
||
|
;
|
||
|
; Returns:
|
||
|
; none
|
||
|
; Error Returns:
|
||
|
; none
|
||
|
; Registers Preserved:
|
||
|
; BP,DS,SI,DI
|
||
|
; Registers Destroyed:
|
||
|
; AX,BX,CX,DX,FLAGS
|
||
|
; Calls:
|
||
|
; LocalFree
|
||
|
; History:
|
||
|
; Fri 21-Sep-1990 13:45:58 -by- Todd Laney [ToddLa]
|
||
|
; Created.
|
||
|
;-----------------------------------------------------------------------;
|
||
|
assumes ds,nothing
|
||
|
assumes es,nothing
|
||
|
|
||
|
cProc HeapFree, <FAR,PUBLIC>, <ds>
|
||
|
ParmD lpObject
|
||
|
cBegin
|
||
|
lds ax,lpObject
|
||
|
cCall LocalFree, <ax>
|
||
|
cEnd
|
||
|
|
||
|
sEnd CodeSeg
|
||
|
end
|