;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; RDOS operating system
; Copyright (C) 1988-2000, Leif Ekblad
;
; This program is free software; you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation; either version 2 of the License, or
; (at your option) any later version. The only exception to this rule
; is for commercial usage in embedded systems. For information on
; usage in commercial embedded systems, contact embedded@rdos.net
;
; This program is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with this program; if not, write to the Free Software
; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
;
; The author of this program may be contacted at leif@rdos.net
;
; DPMI32.ASM
; 32-bit DPMI functions
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

@WordSize = 4

INCLUDE protseg.def
INCLUDE ..\driver.def
INCLUDE ..\user.def
INCLUDE ..\os.def
INCLUDE int.def
INCLUDE ..\user.inc
INCLUDE ..\os.inc
INCLUDE system.def
INCLUDE dpmi.inc
INCLUDE system.inc

	.386p

code	SEGMENT byte public use32 'CODE'

	assume cs:code	

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
;		NAME:			ALLOCATE_DESCR
;
;		DESCRIPTION:	ALLOCATE SELECTORS
;
;		PARAMETERS:		
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

allocate_descr	PROC far
	cmp cx,1
	je dpmi_create_one
	AllocateMultipleLdt
	jmp dpmi_create_done
dpmi_create_one: 
	AllocateLdt
dpmi_create_done:
	GetThread
	mov ds,ax
	mov ds,ds:p_ldt_sel
	xor ax,ax
	mov [bx],ax
	mov [bx+2],ax
	mov [bx+4],al
	mov byte ptr [bx+5],0F2h
	mov [bx+7],al
	mov byte ptr [bx+6],40h
	mov ax,bx
	or ax,7
	mov ebx,[bp].vm_ebx
	mov ds,[bp].pm_ds
	and byte ptr [bp].vm_eflags,NOT 1
	retf
allocate_descr	ENDP

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
;		NAME:			FREE_DESCR
;
;		DESCRIPTION:	FREE SELECTOR
;
;		PARAMETERS:		
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

free_descr	PROC far
	push ds
	push es
	push fs
	push gs
	xor ax,ax
	mov ds,ax
	mov es,ax
	mov fs,ax
	mov gs,ax
	test bl,4
	jz free_descr_fail
	and bl,0F8h
	FreeLdt
	clc
	pop eax
	verr ax
	jnz free_gs
	mov gs,ax
free_gs:
	pop eax
	verr ax
	jnz free_fs
	mov fs,ax
free_fs:
	pop eax
	verr ax
	jnz free_es
	mov es,ax
free_es:
	pop eax
	verr ax
	jnz free_ds
	mov ds,ax
free_ds:
	and byte ptr [bp].vm_eflags,NOT 1
	mov eax,[bp].vm_eax
	mov bx,[bp].vm_ebx
	retf
free_descr_fail:
	or byte ptr [bp].vm_eflags,1
	mov ax,[bp].vm_eax
	mov bx,[bp].vm_ebx
	pop gs
	pop fs
	pop es
	pop ds
	retf
free_descr	ENDP


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
;		NAME:			GET_DECSR_DIST
;
;		DESCRIPTION:	GET DISTANCE BETWEEN SELECTORS
;
;		PARAMETERS:		
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

get_descr_dist	PROC far
	mov ax,8
	and byte ptr [bp].vm_eflags,NOT 1
	retf
get_descr_dist	ENDP

page

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
;		NAME:			GET_DECSR_BASE
;
;		DESCRIPTION:	GET SELCTOR BASE
;
;		PARAMETERS:		
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

get_descr_base	PROC far
	test bl,4
	jz get_descr_base_fail
	GetThread
	mov ds,ax
	mov ds,ds:p_ldt_sel
	and bl,0F8h
	mov al,[bx+5]
	and al,70h
	cmp al,70h
	jnz get_descr_base_fail
	mov dx,[bx+2]
	mov cl,[bx+4]
	mov ch,[bx+7]
	mov bx,[bp].vm_ebx
	mov ds,[bp].pm_ds
	and byte ptr [bp].vm_eflags,NOT 1
	retf
get_descr_base_fail:
	or byte ptr [bp].vm_eflags,1
	retf
get_descr_base	ENDP

page

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
;		NAME:			SET_DECSR_BASE
;
;		DESCRIPTION:	SET SELCTOR BASE
;
;		PARAMETERS:		
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

set_descr_base	PROC far
	push es
	push fs
	push gs
	test bl,4
	jz set_descr_base_fail
	push ax
	GetThread
	mov ds,ax
	pop ax
	mov ds,ds:p_ldt_sel
	and bl,0F8h
	mov al,[bx+5]
	and al,70h
	cmp al,70h
	jnz set_descr_base_fail
	mov [bx+2],dx
	mov [bx+4],cl
	mov [bx+7],ch
	mov ax,[bp].vm_eax
	mov bx,[bp].vm_ebx
	mov ds,[bp].pm_ds
	and byte ptr [bp].vm_eflags,NOT 1
	pop gs
	pop fs
	pop es
	retf
set_descr_base_fail:
	or byte ptr [bp].vm_eflags,1
	pop gs
	pop fs
	pop es
	retf
set_descr_base	ENDP

page

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
;		NAME:			SET_DECSR_LIMIT
;
;		DESCRIPTION:	SET SELCTOR LIMIT
;
;		PARAMETERS:		
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

set_descr_limit	PROC far
	push es
	push fs
	push gs
	test bl,4
	jz set_descr_limit_fail
	GetThread
	mov ds,ax
	mov ds,ds:p_ldt_sel
	and bl,0F8h
	mov al,[bx+5]
	and al,70h
	cmp al,70h
	jnz set_descr_limit_fail
	push cx
	push dx
	pop eax
	cmp eax,100000h
	jc set_descr_small
	shr eax,12
	or byte ptr [bx+6],80h
	jmp set_descr_lim_do
set_descr_small:
	and byte ptr [bx+6],7Fh
set_descr_lim_do:
	mov [bx],ax
	shr eax,16
	mov ah,[bx+6]
	and ah,0F0h
	or al,ah
	mov [bx+6],al
	and byte ptr [bp].vm_eflags,NOT 1
	mov eax,[bp].vm_eax
	mov bx,[bp].vm_ebx
	mov ds,[bp].pm_ds
	pop gs
	pop fs
	pop es
	retf
set_descr_limit_fail:
	or byte ptr [bp].vm_eflags,1
	pop gs
	pop fs
	pop es
	retf
set_descr_limit	ENDP

page

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
;		NAME:			CREATE_CODE_DESCR_ALIAS
;
;		DESCRIPTION:	CREATES CODE DESCRIPTOR ALIAS
;
;		PARAMETERS:		
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

create_code_descr_alias	PROC far
	or bl,3
	verr bx
	jnz create_code_alias_fail
	test bl,4
	jz create_code_alias_fail
	GetThread
	mov ds,ax
	mov ds,ds:p_ldt_sel
	and bl,0F8h
	push es
	push esi
	push edi
	mov ax,ds
	mov es,ax
	movzx esi,bx
	AllocateLdt
	movzx edi,bx
	movsd
	movsd
	mov byte ptr [bx+5],0F2h
	pop edi
	pop esi
	pop es
	mov ax,bx
	or al,7
	mov bx,[bp].vm_ebx
	mov ds,[bp].pm_ds
	and byte ptr [bp].vm_eflags,NOT 1
	retf
create_code_alias_fail:
	mov ax,[bp].vm_eax
	mov bx,[bp].vm_ebx
	mov ds,[bp].pm_ds
	or byte ptr [bp].vm_eflags,1
	retf
create_code_descr_alias	ENDP

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
;		NAME:			SEGMENT_TO_DESCR
;
;		DESCRIPTION:	SEGMENT TO DESCR
;
;		PARAMETERS:		
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

segment_to_descr	PROC far
	AllocateLdt
	movzx eax,word ptr[bp].vm_ebx
	shl eax,4
	mov [bx+2],eax
	xor ax,ax
	mov byte ptr [bx+5],0F2h
	mov [bx+7],al
	dec ax
	mov [bx],ax
	mov byte ptr [bx+6],40h
	or bx,7
	mov [bp].vm_eax,bx
	mov eax,[bp].vm_eax
	mov ebx,[bp].vm_ebx
	mov ds,[bp].pm_ds
	and byte ptr [bp].vm_eflags,NOT 1
	retf
segment_to_descr	ENDP

page

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
;		NAME:			SET_DECSR_ACCESS
;
;		DESCRIPTION:	SET SELCTOR ACCESS RIGHTS
;
;		PARAMETERS:		
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

set_descr_access	PROC far
	push es
	push fs
	push gs
	test bl,4
	jz set_descr_access_fail
	mov al,cl
	and al,70h
	cmp al,70h
	jnz set_descr_access_fail
	test cl,8
	jz set_descr_access_ok
	test cl,4
	jnz set_descr_access_fail
	test cl,2
	jz set_descr_access_fail
set_descr_access_ok:
	test ch,30h
	jnz set_descr_access_fail
	and ch,0F0h
	GetThread
	mov ds,ax
	mov ds,ds:p_ldt_sel
	and bl,0F8h
	mov al,[bx+5]
	and al,70h
	cmp al,70h
	jnz set_descr_access_fail
	mov [bx+5],cl
	mov al,[bx+6]
	and al,0Fh
	or al,ch
	mov [bx+6],al
	and byte ptr [bp].vm_eflags,NOT 1
	mov ax,[bp].vm_eax
	mov bx,[bp].vm_ebx
	mov ds,[bp].pm_ds
	pop gs
	pop fs
	pop es
	retf
set_descr_access_fail:
	mov ax,[bp].vm_eax
	or byte ptr [bp].vm_eflags,1
	pop gs
	pop fs
	pop es
	retf
set_descr_access	ENDP

page

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
;		NAME:			GET_DESCR
;
;		DESCRIPTION:	GET DESCRIPTOR
;
;		PARAMETERS:		
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

get_descr	PROC far
	test bl,4
	jz get_descr_fail
	GetThread
	mov ds,ax
	mov ds,ds:p_ldt_sel
	and bl,0F8h
	mov al,[bx+5]
	and al,70h
	cmp al,70h
	jnz get_descr_fail
	mov eax,[bx]
	mov es:[edi],eax
	mov eax,[bx+4]
	mov es:[edi+4],eax
	mov eax,[bp].vm_eax
	mov bx,[bp].vm_ebx
	mov ds,[bp].pm_ds
	and byte ptr [bp].vm_eflags,NOT 1
	retf
get_descr_fail:
	or byte ptr [bp].vm_eflags,1
	retf
get_descr	ENDP

page

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
;		NAME:			SET_DESCR
;
;		DESCRIPTION:	SET DESCRIPTOR
;
;		PARAMETERS:		
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

set_descr	PROC far
	push es
	push fs
	push gs
	test bl,4
	jz set_descr_fail
	mov al,es:[edi+6]
	test al,30h
	jnz set_descr_fail
	mov al,es:[edi+5]
	and al,70h
	cmp al,70h
	jnz set_descr_fail
	mov al,es:[edi+5]
	test al,8
	jz set_descr_ok
	test al,4
	jnz set_descr_fail
	test al,2
	jz set_descr_fail
set_descr_ok:
	GetThread
	mov ds,ax
	mov ds,ds:p_ldt_sel
	and bl,0F8h
	mov al,[bx+5]
	and al,70h
	cmp al,70h
	jnz set_descr_fail
	mov eax,es:[edi]
	mov [bx],eax
	mov eax,es:[edi+4]
	mov [bx+4],eax
	mov eax,[bp].vm_eax
	mov bx,[bp].vm_ebx
	mov ds,[bp].pm_ds
	and byte ptr [bp].vm_eflags,NOT 1
	pop gs
	pop fs
	pop es
	retf
set_descr_fail:
	mov ax,[bp].vm_eax
	or byte ptr [bp].vm_eflags,1
	pop gs
	pop fs
	pop es
	retf
set_descr	ENDP


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
;		NAME:			ALLOCATE_SPECIFIC_DESCR
;
;		DESCRIPTION:	ALLOCATE SPECIFIC DESCRIPTOR
;
;		PARAMETERS:		
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

allocate_specific_descr	PROC far
	test bl,4
	jz alloc_spec_descr_fail
	cmp bx,100h
	jnc alloc_spec_descr_fail
	and bl,0F8h	
	GetThread
	mov ds,ax
	mov ds,ds:p_ldt_sel
	mov al,[bx+5]
	or al,al
	jnz alloc_spec_descr_fail
	xor ax,ax
	mov [bx],ax
	mov [bx+2],ax
	mov [bx+4],al
	mov byte ptr [bx+5],0F2h
	mov byte ptr [bx+6],40h
	mov [bx+7],al
	mov ax,[bp].vm_eax
	mov ebx,[bp].vm_ebx
	mov ds,[bp].pm_ds
	and byte ptr [bp].vm_eflags,NOT 1
	retf
alloc_spec_descr_fail:
	mov ax,[bp].vm_eax
	or byte ptr [bp].vm_eflags,1
	retf
allocate_specific_descr	ENDP

PAGE

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;	
;
;		NAME:			ALLOCATE_DOS_MEM
;
;		DESCRIPTION:	
;
;		PARAMETERS:		BX			NUMBER OF PARAGRAPH
;						
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

allocate_dos_mem	PROC far
	push ds
	push es
	push bx
	movzx eax,bx
	shl eax,4
	AllocateDosMem
	jc allocate_dos_mem_fail
	GetThread
	mov ds,ax
	mov ds,ds:p_ldt_sel
	mov bx,es
	mov dx,bx
	and bx,0FFF8h
	mov eax,[bx+2]
	shr eax,4
	and eax,0FFFFh
	and byte ptr [bp].vm_eflags,NOT 1
	pop bx
	pop es
	pop ds
	retf

allocate_dos_mem_fail:
	pop bx
	pop es
	pop ds
	push eax
	push edx
	AvailableDosLinear
	shr edx,4
	mov bx,dx
	pop edx
	pop eax
	or byte ptr [bp].vm_eflags,1
	retf
allocate_dos_mem	ENDP

PAGE

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;	
;
;		NAME:			FREE_DOS_MEM
;
;		DESCRIPTION:	
;
;		PARAMETERS:		DX			SELECTOR TO FREE
;						
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

free_dos_mem	PROC far
	push es
;
	verr dx
	jnz free_dos_mem_fail
;
	mov es,dx
	FreeMem
	and byte ptr [bp].vm_eflags,NOT 1
	pop es
	retf

free_dos_mem_fail:
	or byte ptr [bp].vm_eflags,1
	mov ax,8022h
	pop es
	retf
free_dos_mem	ENDP

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
;		NAME:			GET_REAL_INT
;
;		DESCRIPTION:	GET REAL MODE INT VECTOR
;
;		PARAMETERS:		
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

get_real_int	PROC far
	mov al,bl
	GetVMInt
	mov cx,dx
	mov dx,bx
	mov ax,[bp].vm_eax
	mov bx,[bp].vm_ebx
	and byte ptr [bp].vm_eflags,NOT 1
	retf
get_real_int	ENDP


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
;		NAME:			SET_REAL_INT
;
;		DESCRIPTION:	SET REAL MODE INT VECTOR
;
;		PARAMETERS:		
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

set_real_int	PROC far
	mov al,bl
	mov bx,dx
	mov dx,cx
	SetVMInt
	mov ax,[bp].vm_eax
	mov bx,[bp].vm_ebx
	and byte ptr [bp].vm_eflags,NOT 1
	retf
set_real_int	ENDP

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
;		NAME:			GET_EXCEPTION
;
;		DESCRIPTION:	GET EXCEPTION VECTOR
;
;		PARAMETERS:		
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

get_exception	PROC far
	push es
	push edi
	mov al,bl
	GetException
	mov cx,es
	mov edx,edi
	pop edi
	pop es
	mov ax,[bp].vm_eax
	and byte ptr [bp].vm_eflags,NOT 1
	retf
get_exception	ENDP

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
;		NAME:			SET_EXCEPTION
;
;		DESCRIPTION:	SET EXCEPTION VECTOR
;
;		PARAMETERS:		
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

set_exception	PROC far
	push es
	push edi
	mov al,bl
	cmp al,1
	je set_exc_ignore
;
	cmp al,3
	je set_exc_ignore
;
	cmp al,0Dh
	je set_exc_ignore
;
	mov es,cx
	mov edi,edx
	SetException

set_exc_ignore:
	pop edi
	pop es
	mov ax,[bp].vm_eax
	and byte ptr [bp].vm_eflags,NOT 1
	retf
set_exception	ENDP

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
;		NAME:			GET_VECTOR
;
;		DESCRIPTION:	GET INT VECTOR
;
;		PARAMETERS:		
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

get_vector	PROC far
	push es
	push edi
	mov al,bl
	GetPMInt
	mov cx,es
	mov edx,edi
	pop edi
	pop es
	mov ax,[bp].vm_eax
	and byte ptr [bp].vm_eflags,NOT 1
	retf
get_vector	ENDP

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
;		NAME:			SET_VECTOR
;
;		DESCRIPTION:	SET INT VECTOR
;
;		PARAMETERS:		
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

set_vector	PROC far
	push es
	push edi
	mov al,bl
	mov es,cx
	mov edi,edx
	SetPMInt
	pop edi
	pop es
	mov ax,[bp].vm_eax
	and byte ptr [bp].vm_eflags,NOT 1
	retf
set_vector	ENDP

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
;		NAME:			SIM_REAL_INT
;
;		DESCRIPTION:	SIMULERA REAL MODE INT
;
;		PARAMETERS:		
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

sim_real_int	PROC far
	push esi
	mov ds,[bp].vm_ss
	movzx esi,word ptr [bp].vm_esp
	mov al,bl
	DpmiInt
	pop esi
	mov ds,[bp].pm_ds
	mov eax,[bp].vm_eax
	and byte ptr [bp].vm_eflags, NOT 1
	retf
sim_real_int	ENDP

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
;		NAME:			SIM_REAL_CALL
;
;		DESCRIPTION:	SIMULERA REAL MODE CALL
;
;		PARAMETERS:		
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

sim_real_call	PROC far
	push esi
	mov ds,[bp].vm_ss
	movzx esi,word ptr [bp].vm_esp
	DpmiCall
	pop esi
	mov ds,[bp].pm_ds
	and byte ptr [bp].vm_eflags, NOT 1
	retf
sim_real_call	ENDP

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
;		NAME:			SIM_REAL_CALL_INT
;
;		DESCRIPTION:	SIMULERA REAL MODE CALL WITH IRET
;
;		PARAMETERS:		
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

sim_real_call_int	PROC far
	push esi
	mov ds,[bp].vm_ss
	movzx esi,word ptr [bp].vm_esp
	DpmiCallInt
	pop esi
	mov ds,[bp].pm_ds
	and byte ptr [bp].vm_eflags, NOT 1
	retf
sim_real_call_int	ENDP

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
;		NAME:			ALLOCATE_VM_CALLBACK
;
;		DESCRIPTION:	ALLOKERA VM CALLBACK
;
;		PARAMETERS:		
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

allocate_vm_callback	PROC far
	AllocateVMCallback
	mov cx,dx
	mov dx,ax
	mov ax,[bp].vm_eax
	mov ds,[bp].pm_ds
	and byte ptr [bp].vm_eflags, NOT 1
	retf
allocate_vm_callback	ENDP

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
;		NAME:			FREE_VM_CALLBACK
;
;		DESCRIPTION:	FRIG™R VM CALLBACK
;
;		PARAMETERS:		
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

free_vm_callback	PROC far
	push cx
	push dx
	mov ax,dx
	mov dx,cx
	FreeVMCallback
	pop dx
	pop cx
	and byte ptr [bp].vm_eflags, NOT 1
	retf
free_vm_callback	ENDP

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
;		NAME:			DPMI_GET_STATE_SR_ADDR
;
;		DESCRIPTION:	GET STATE SAVE/RESTORE ADDRESS
;
;		PARAMETERS:		
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

dpmi_get_save_restore_addr	PROC far
	xor ax,ax
	and byte ptr [bp].vm_eflags,NOT 1
	retf
dpmi_get_save_restore_addr	ENDP
	
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
;		NAME:			DPMI_GET_RAW_SWITCH_ADDR
;
;		DESCRIPTION:	GET RAW MODE SWITCH ADDRESS
;
;		PARAMETERS:		
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

dpmi_get_raw_switch_addr	PROC far
	GetRawSwitchAds
	mov ds,[bp].pm_ds
	and byte ptr [bp].vm_eflags,NOT 1
	retf
dpmi_get_raw_switch_addr	ENDP
	
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
;		NAME:			GET_VERSION
;
;		DESCRIPTION:	GET DPMI VERSION
;
;		PARAMETERS:		
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	
get_version	PROC far
	mov ax,9
	mov bx,5
	mov cl,3
	mov dx,2838h
	and byte ptr [bp].vm_eflags,NOT 1
	retf
get_version	ENDP
	
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
;		NAME:			GET_FREE_MEM
;
;		DESCRIPTION:	GET FREE MEMORY INFO
;
;		PARAMETERS:		
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	
get_free_mem	PROC far
	push eax
	push edx
	UsedLocalLinear
	mov edx,eax
	AvailableLocalLinear
	add edx,eax
	shr edx,12
	mov es:[edi],eax
	shr eax,12
	mov es:[edi+4],eax
	mov es:[edi+8],eax
	mov es:[edi+12],edx
	mov es:[edi+28],edx
	mov dword ptr es:[edi+16],-1
	GetFreePhysical
	shr eax,12
	mov es:[edi+20],eax
	mov dword ptr es:[edi+24],-1
	mov dword ptr es:[edi+32],-1
	pop edx		
	pop eax
	and byte ptr [bp].vm_eflags,NOT 1
	retf
get_free_mem	ENDP
	
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
;		NAME:			ALLOCATE_MEM
;
;		DESCRIPTION:	ALLOCATE LOCAL MEMORY
;
;		PARAMETERS:		
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

allocate_mem	PROC far
	push edx
	push ecx
	mov eax,8
	AllocateLocalLinear
	push edx
	mov di,dx
	shr edx,16
	mov si,dx
	mov ax,flat_sel
	mov ds,ax	
	mov ax,bx
	shl eax,16
	mov ax,cx
	AllocateLocalLinear
	pop ecx
	mov [ecx],eax
	mov [ecx+4],edx
	pop ecx
	mov cx,dx
	shr edx,16
	mov bx,dx
	pop edx
	mov eax,[bp].vm_eax
	mov ds,[bp].pm_ds
	and byte ptr [bp].vm_eflags,NOT 1
	retf
allocate_mem	ENDP
	
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
;		NAME:			FREE_MEM
;
;		DESCRIPTION:	FREE LOCAL MEMORY
;
;		PARAMETERS:		
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

free_mem	PROC far
	push ecx
	push edx
	mov dx,si
	shl edx,16
	mov dx,di
	mov ax,flat_sel
	mov ds,ax
	mov ecx,[edx]
	mov edx,[edx+4]
	FreeLinear
	pop edx
	pop ecx
	mov eax,[bp].vm_eax
	mov ds,[bp].pm_ds
	and byte ptr [bp].vm_eflags,NOT 1
	retf
free_mem	ENDP
	
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
;		NAME:			RESIZE_MEM
;
;		DESCRIPTION:	RESIZE LOCAL MEMORY
;
;		PARAMETERS:		
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

resize_mem	PROC far
	push edx
;
	mov ax,flat_sel
	mov ds,ax
;
	mov ax,bx
	shl eax,16
	mov ax,cx
;
	shl esi,16
	mov si,di
	mov ecx,[esi]
	mov edx,[esi+4]
	sub edx,local_page_linear
	ResizeFlatLinear
	jc resize_mem_fail
;
	add edx,local_page_linear
	mov [esi],eax
	mov [esi+4],edx
	mov cx,[esi+4]
	mov bx,[esi+6]
	mov di,si
	shr esi,16
	and byte ptr [bp].vm_eflags,NOT 1
	jmp resize_mem_done

resize_mem_fail:
	mov [esi],ecx
	mov [esi+4],edx
	mov cx,[esi+4]
	mov bx,[esi+6]
	mov di,si
	shr esi,16
	or byte ptr [bp].vm_eflags,1
	
resize_mem_done:
	pop edx
	mov ds,[bp].pm_ds
	retf
resize_mem	ENDP
	
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
;		NAME:			SET_PAGE_ATTRIB
;
;		DESCRIPTION:	Set page attributes
;
;		PARAMETERS:		ESI		Memory handle
;						EBX		Offset within block
;						ECX		Number of pages
;						ES:EDX	Buffer to attributes
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

set_page_attrib	PROC far
	push ecx
	push edx
	push edi
;
	mov eax,flat_sel
	mov ds,ax
	mov edi,edx
	shl ecx,12
	mov eax,[esi]
	mov edx,[esi+4]
	and bx,0F000h
;
	sub eax,ecx
	jc set_page_range_fail
;
	sub eax,ebx
	jc set_page_range_fail
;
	add edx,ebx
	sub edx,local_page_linear
	jc set_page_range_fail
;
	shr ecx,12

set_page_attrib_loop:
	mov ax,es:[edi]
	test al,7
	jz set_page_uncommited
;
	test al,8
	jz set_page_readonly
;
	mov eax,1000h
	SetFlatLinearReadWrite
	jmp set_page_attrib_next

set_page_readonly:
	mov eax,1000h
	SetFlatLinearRead
	jmp set_page_attrib_next

set_page_uncommited:
	mov eax,1000h
	SetFlatLinearInvalid

set_page_attrib_next:
	add edi,2
	loop set_page_attrib_loop
;
	pop edi
	pop edx
	pop ecx
;
	mov eax,[bp].vm_eax
	mov ds,[bp].pm_ds
	and byte ptr [bp].vm_eflags,NOT 1
	retf

set_page_range_fail:
	mov ax,8025h
;
	or byte ptr [bp].vm_eflags,1
	pop edi
	pop edx
	pop ecx
	xor ecx,ecx
	mov ds,[bp].pm_ds
	retf
set_page_attrib	ENDP

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
;		NAME:			DPMI_PAGE_SIZE
;
;		DESCRIPTION:	GET PAGE SIZE 16 AND 32-BIT
;
;		PARAMETERS:		
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

dpmi_page_size	PROC far
	xor bx,bx
	mov cx,1000h
	and byte ptr [bp].vm_eflags,NOT 1
	retf
dpmi_page_size	ENDP
	
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
;		NAME:			GET_INT
;
;		DESCRIPTION:	GET VIRTUAL INTERRUPT STATE
;
;		PARAMETERS:		
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


get_int	PROC far
	xor ax,ax
	GetFlags
	shr ax,9
	and al,1
	mov ah,9
	and byte ptr [bp].vm_eflags,NOT 1
	retf
get_int	ENDP
	
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
;		NAME:			GET_DISABLE_INT
;
;		DESCRIPTION:	GET AND DISABLE VIRTUAL INTERRUPT STATE
;
;		PARAMETERS:		
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

get_disable_int	PROC far
	xor ax,ax
	GetFlags
	SimCli
	shr ax,9
	and al,1
	mov ah,9
	and byte ptr [bp].vm_eflags,NOT 1
	retf
get_disable_int	ENDP
	
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
;		NAME:			GET_ENABLE_INT
;
;		DESCRIPTION:	GET AND ENABLE VIRTUAL INTERRUPT STATE
;
;		PARAMETERS:		
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

get_enable_int	PROC near
	xor ax,ax
	GetFlags
	SimSti
	shr ax,9
	and al,1
	mov ah,9
	and byte ptr [bp].vm_eflags,NOT 1
	retf
get_enable_int	ENDP
	
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
;		NAME:			SET_FPU_EMULATION
;
;		DESCRIPTION:	Set FPU emulation
;
;		PARAMETERS:		
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

set_fpu_emulation	PROC near
	and byte ptr [bp].vm_eflags,NOT 1
	retf
set_fpu_emulation	ENDP

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
;		NAME:			DPMI_DUMMY
;
;		DESCRIPTION:	DUMMY DPMI
;
;		PARAMETERS:		
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

dpmi_dummy	PROC far
	and byte ptr [bp].vm_eflags,NOT 1
	retf
dpmi_dummy	ENDP

dpmi_error	PROC far
	int 3
	or byte ptr [bp].vm_eflags,1
	retf
dpmi_error	ENDP

dpmi_descriptor:
dd_ant	DD 0Dh
dd00	DD OFFSET allocate_descr
dd01	DD OFFSET free_descr
dd02	DD OFFSET segment_to_descr
dd03	DD OFFSET get_descr_dist
dd04	DD OFFSET dpmi_error
dd05	DD OFFSET dpmi_error
dd06	DD OFFSET get_descr_base
dd07	DD OFFSET set_descr_base
dd08	DD OFFSET set_descr_limit
dd09	DD OFFSET set_descr_access
dd0A	DD OFFSET create_code_descr_alias
dd0B	DD OFFSET get_descr
dd0C	DD OFFSET set_descr
dd0D	DD OFFSET allocate_specific_descr

dpmi_dosmem:
ds_ant	DD 2
ds00	DD OFFSET allocate_dos_mem
ds01	DD OFFSET free_dos_mem
ds02	DD OFFSET dpmi_error

dpmi_int:
di_ant	DD 12h
di00	DD OFFSET get_real_int
di01	DD OFFSET set_real_int
di02	DD OFFSET get_exception
di03	DD OFFSET set_exception
di04	DD OFFSET get_vector
di05	DD OFFSET set_vector
di06	DD OFFSET dpmi_error
di07	DD OFFSET dpmi_error
di08	DD OFFSET dpmi_error
di09	DD OFFSET dpmi_error
di0A	DD OFFSET dpmi_error
di0B	DD OFFSET dpmi_error
di0C	DD OFFSET dpmi_error
di0D	DD OFFSET dpmi_error
di0E	DD OFFSET dpmi_error
di0F	DD OFFSET dpmi_error
di10	DD OFFSET get_exception
di11	DD OFFSET dpmi_error
di12	DD OFFSET set_exception

dpmi_translate:
dt_ant	DD 6
dt00	DD OFFSET sim_real_int
dt01	DD OFFSET sim_real_call
dt02	DD OFFSET sim_real_call_int
dt03	DD OFFSET allocate_vm_callback
dt04	DD OFFSET free_vm_callback
dt05	DD OFFSET dpmi_get_save_restore_addr
dt06	DD OFFSET dpmi_get_raw_switch_addr

dpmi_ver:
dv_ant	DD 0
dv00	DD OFFSET get_version

dpmi_mem:
dm_ant	DD 7
dm00	DD OFFSET get_free_mem
dm01	DD OFFSET allocate_mem
dm02	DD OFFSET free_mem
dm03	DD OFFSET resize_mem
dm04	DD OFFSET dpmi_error
dm05	DD OFFSET dpmi_error
dm06	DD OFFSET dpmi_error
dm07	DD OFFSET set_page_attrib

dpmi_page:
dp_ant	DD 4
dp00	DD OFFSET dpmi_dummy
dp01	DD OFFSET dpmi_dummy
dp02	DD OFFSET dpmi_dummy
dp03	DD OFFSET dpmi_dummy
dp04	DD OFFSET dpmi_page_size

dpmi_paging:
dg_ant	DD 3
dg00	DD OFFSET dpmi_error
dg01	DD OFFSET dpmi_error
dg02	DD OFFSET dpmi_dummy
dg03	DD OFFSET dpmi_dummy

dpmi_physical:
dy_ant	DD 0
dy00	DD OFFSET dpmi_dummy

dpmi_virtint:
dr_ant	DD 2
dr00	DD OFFSET get_disable_int
dr01	DD OFFSET get_enable_int
dr02	DD OFFSET get_int

dpmi_vendorapi:
da_ant	DD 0
da00	DD OFFSET dpmi_error

dpmi_debug:
de_ant	DD 3
de00	DD OFFSET dpmi_error
de01	DD OFFSET dpmi_error
de02	DD OFFSET dpmi_error
de03	DD OFFSET dpmi_error

dpmi_empty:
d0_ant	DD 0
d000	DD OFFSET dpmi_error

dpmi_fpu:
df_ant	DD 2
df00	DD OFFSET dpmi_error
df01	DD OFFSET set_fpu_emulation

dpmi_tab:
dpmi00	DD OFFSET dpmi_descriptor
dpmi01	DD OFFSET dpmi_dosmem
dpmi02	DD OFFSET dpmi_int
dpmi03	DD OFFSET dpmi_translate
dpmi04	DD OFFSET dpmi_ver
dpmi05	DD OFFSET dpmi_mem
dpmi06	DD OFFSET dpmi_page
dpmi07	DD OFFSET dpmi_paging
dpmi08	DD OFFSET dpmi_physical
dpmi09	DD OFFSET dpmi_virtint
dpmi0A	DD OFFSET dpmi_vendorapi
dpmi0B	DD OFFSET dpmi_debug
dpmi0C	DD OFFSET dpmi_empty
dpmi0D	DD OFFSET dpmi_empty
dpmi0E	DD OFFSET dpmi_fpu

int31:
	cmp ah,0Fh
	jae int31_fail
;
	movzx ebx,ah
	mov ebx,dword ptr cs:[ebx*4].dpmi_tab
	cmp al,cs:[ebx]
	jz int31_ok
	jc int31_ok

int31_fail:
	mov ebx,OFFSET dpmi_error
	jmp int31_do

int31_ok:
	movzx eax,al
	mov ebx,cs:[eax*4+ebx+4]
int31_do:
	push ebx
	mov eax,[bp].vm_eax
	mov ebx,[bp].vm_ebx
	mov ds,[bp].pm_ds
	retn

PAGE

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;	
;
;		NAME:			INIT_DPMI32
;
;		DESCRIPTION:	Init 32-bit DPMI
;
;		PARAMETERS:		
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	public init_dpmi32

init_dpmi32	PROC far
	push ds
	push es
	pushad
;
	mov ax,cs
	mov ds,ax
	mov es,ax
;
	mov al,31h
	mov edi,OFFSET int31
	HookProt32Int
;
	popad
	pop es
	pop ds
	ret
init_dpmi32	ENDP

code	ENDS

	END