www.pudn.com > fxvmm210.zip > _FXXMM.ASM


;±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°± 
 
; 
; XMM (+ XMS) memory manipulation procedures 
;  
 
	TITLE	FXXMM 
 
	.386p 
	.387 
 
FXXMM_TEXT	SEGMENT	BYTE public USE16 'CODE' 
FXXMM_TEXT	ENDS 
 
_DATA	SEGMENT	WORD public USE16 'DATA' 
_DATA	ENDS 
_BSS	SEGMENT	WORD public USE16 'BSS' 
_BSS	ENDS 
 
DGROUP	GROUP	_DATA, _BSS 
 
;±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°± 
 
include ..\source.asm\_fxvmm.inc 
 
;±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°± 
 
	extrn		_fxvmm_error_code:WORD 
	extrn		_fxvmm_bufsource:WORD 
	extrn		_fxvmm_global_xms_handle:WORD 
	extrn		F_LXURSH@:NEAR 
 
;±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°± 
 
	public		__fxvmm_xmm_isinstalled 
	public		__fxvmm_xmm_init 
	public		__fxvmm_xmm_getlargestblock 
	public		__fxvmm_xmm_allocblock 
	public		__fxvmm_xmm_blockfree 
	public		__fxvmm_xmm_embmove1 
	public		__fxvmm_xmm_embmove2 
	public		__fxvmm_xms_handle_absread 
	public		__fxvmm_xms_handle_abswrite 
	public		__fxvmm_xms_handle_free 
	public		__fxvmm_xms_handle_alloc 
	public		__fxvmm_xms_handle_deinit 
 
	public		_fxvmm_local_xms_handle 
	public		_fxvmm_strat_xms_handle 
 
	public		_fxvmm_xmm_exist 
	public		_fxvmm_xmm_control 
	public		_fxvmm_xmm_inited 
 
;±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°± 
 
FXXMM_TEXT	SEGMENT 
	assume	cs: FXXMM_TEXT 
 
;±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°± 
 
__fxvmm_xmm_isinstalled: 
	push	bp 
	mov	bp,sp 
	sub	sp,+002h 
	mov	ax,4300h 
	int	2Fh 
	mov	[bp-001h],al 
	cmp	byte ptr [bp-001h],80h 
	jnz	@@L1 
	mov	ax,0001h 
	jmp	short @@L2 
@@L1:	xor	ax,ax 
@@L2:	mov	sp,bp 
	pop	bp 
	retf 
 
;±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°± 
 
__fxvmm_xmm_init: 
	push	bp 
	mov	bp,sp 
	sub	sp,+004h 
	assume	ds: DGROUP 
	mov	word ptr _fxvmm_xmm_inited,0001h 
	push	cs 
	call	near ptr __fxvmm_xmm_isinstalled 
	or	ax,ax 
	jz	@@L3 
	mov	ax,4310h 
	int	2Fh 
	mov	word ptr [bp-002h],es 
	mov	[bp-004h],bx 
	mov	ax,[bp-002h] 
	mov	dx,[bp-004h] 
	mov	_fxvmm_xmm_xctrl,ax 
	mov	_fxvmm_xmm_control,dx 
	mov	ax,0001h 
	mov	sp,bp 
	pop	bp 
	retf 
@@L3:	mov	ax,_fxvmm_global_xms_handle 
	mov	dx,001Ah 
	imul	dx 
	mov	bx,ax 
	mov	word ptr [bx+_fxvmm_bufsource],0000h 
	xor	ax,ax 
	mov	sp,bp 
	pop	bp 
	retf 
 
;±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°± 
 
__fxvmm_xmm_getlargestblock: 
	push	bp 
	mov	bp,sp 
	sub	sp,+002h 
	cmp	word ptr _fxvmm_xmm_inited,+000h 
	jnz	@@L5 
	push	cs 
	call	near ptr __fxvmm_xmm_init 
@@L5:	mov	ax,_fxvmm_global_xms_handle 
	mov	dx,001Ah 
	imul	dx 
	mov	bx,ax 
	cmp	word ptr [bx+_fxvmm_bufsource],+000h 
	jnz	@@L6 
	xor	dx,dx 
	xor	ax,ax 
	mov	sp,bp 
	pop	bp 
	retf 
@@L6:	mov	ah,08h 
	call	dword ptr _fxvmm_xmm_control 
	mov	[bp-002h],ax 
	mov	ax,[bp-002h] 
	xor	dx,dx 
	mov	sp,bp 
	pop	bp 
	retf 
 
;±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°± 
 
__fxvmm_xmm_allocblock: 
	push	bp 
	mov	bp,sp 
	sub	sp,+004h 
	cmp	word ptr _fxvmm_xmm_inited,+000h 
	jnz	@@L7 
	push	cs 
	call	__fxvmm_xmm_init 
@@L7:	mov	ax,_fxvmm_global_xms_handle 
	mov	dx,001Ah 
	imul	dx 
	mov	bx,ax 
	cmp	word ptr [bx+_fxvmm_bufsource],+000h 
	jnz	@@L8 
	xor	ax,ax 
	mov	sp,bp 
	pop	bp 
	retf 
@@L8:	mov	ah,09h 
	mov	dx,[bp+006h] 
	call	dword ptr _fxvmm_xmm_control 
	mov	[bp-002h],ax 
	mov	[bp-004h],dx 
	les	bx,dword ptr [bp+008h] 
	mov	ax,[bp-004h] 
	mov	es:[bx],ax 
	cmp	word ptr [bp-002h],+000h 
	jnz	@@L9 
	mov	word ptr _fxvmm_error_code,0001h 
@@L9:	mov	ax,[bp-002h] 
	mov	sp,bp 
	pop	bp 
	retf 
 
;±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°± 
 
__fxvmm_xmm_blockfree: 
	push	bp 
	mov	bp,sp 
	sub	sp,+002h 
	mov	ah,0Ah 
	mov	dx,[bp+006h] 
	call	dword ptr _fxvmm_xmm_control 
	mov	[bp-002h],ax 
	cmp	word ptr [bp-002h],+000h 
	jnz	@@L10 
	mov	word ptr _fxvmm_error_code,0001h 
@@L10:	mov	ax,[bp-002h] 
	mov	sp,bp 
	pop	bp 
	retf 
 
;±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°± 
 
__fxvmm_xmm_embmove1: 
	push	bp 
	mov	bp,sp 
	sub	sp,+028h 
	push	si 
	push	di 
	mov	di,[bp+00Ch] 
	mov	ax,_fxvmm_xmm_xctrl 
	mov	dx,_fxvmm_xmm_control 
	mov	[bp-002h],ax 
	mov	[bp-004h],dx 
	lea	ax,[bp-028h] 
	mov	word ptr [bp-008h],ss 
	mov	[bp-00Ah],ax 
	mov	ax,[bp-008h] 
	mov	[bp-00Ch],ax 
	mov	ax,[bp-00Ah] 
	mov	[bp-00Eh],ax 
	mov	ax,[bp+014h] 
	mov	dx,[bp+012h] 
	shr	ax,1 
	rcr	dx,1 
	shl	dx,1 
	rcl	ax,1 
	mov	[bp-010h],ax 
	mov	[bp-012h],dx 
	mov	word ptr [bp-006h],ds 
	mov	ax,[bp-010h] 
	mov	dx,[bp-012h] 
	mov	[bp-026h],ax 
	mov	[bp-028h],dx 
	mov	ax,[bp+006h] 
	mov	[bp-024h],ax 
	mov	ax,[bp+00Ah] 
	mov	dx,[bp+008h] 
	mov	[bp-020h],ax 
	mov	[bp-022h],dx 
	mov	[bp-01Eh],di 
	mov	ax,[bp+010h] 
	mov	dx,[bp+00Eh] 
	mov	[bp-01Ah],ax 
	mov	[bp-01Ch],dx 
	mov	ds,word ptr [bp-00Ch] 
	mov	si,[bp-00Eh] 
	mov	ah,0Bh 
	call	dword ptr [bp-004h] 
	mov	ds,word ptr [bp-006h] 
	mov	[bp-014h],ax 
	cmp	word ptr [bp-014h],+000h 
	jnz	@@L11 
	mov	word ptr _fxvmm_error_code,0001h 
	xor	ax,ax 
	pop	di 
	pop	si 
	mov	sp,bp 
	pop	bp 
	retf 
@@L11:	mov	ax,[bp-010h] 
	mov	dx,[bp-012h] 
	cmp	ax,[bp+014h] 
	jbe	@@L12 
	jmp	@@L13 
@@L12:	jc	@@L14 
	cmp	dx,[bp+012h] 
	jc	@@L14 
	jmp	@@L13 
@@L14:	mov	word ptr [bp-006h],ds 
	mov	word ptr [bp-026h],0000h 
	mov	word ptr [bp-028h],0002h 
	mov	[bp-024h],di 
	mov	ax,[bp+010h] 
	mov	dx,[bp+00Eh] 
	add	dx,[bp-012h] 
	adc	ax,[bp-010h] 
	mov	[bp-020h],ax 
	mov	[bp-022h],dx 
	mov	word ptr [bp-01Eh],0000h 
	lea	ax,[bp-016h] 
	mov	word ptr [bp-01Ah],ss 
	mov	[bp-01Ch],ax 
	mov	ds,word ptr [bp-00Ch] 
	mov	si,[bp-00Eh] 
	mov	ah,0Bh 
	call	dword ptr [bp-004h] 
	mov	[bp-014h],ax 
	mov	word ptr [bp-026h],0000h 
	mov	word ptr [bp-028h],0002h 
	mov	ax,[bp+006h] 
	mov	[bp-024h],ax 
	mov	ax,[bp+00Ah] 
	mov	dx,[bp+008h] 
	add	dx,[bp-012h] 
	adc	ax,[bp-010h] 
	mov	[bp-020h],ax 
	mov	[bp-022h],dx 
	mov	word ptr [bp-01Eh],0000h 
	lea	ax,[bp-018h] 
	mov	word ptr [bp-01Ah],ss 
	mov	[bp-01Ch],ax 
	mov	ds,word ptr [bp-00Ch] 
	mov	si,[bp-00Eh] 
	mov	ah,0Bh 
	call	dword ptr [bp-004h] 
	mov	[bp-014h],ax 
	mov	ax,[bp-016h] 
	and	ax,0FF00h 
	mov	[bp-016h],ax 
	mov	ax,[bp-018h] 
	or	ax,0FF00h 
	mov	[bp-018h],ax 
	mov	ax,[bp-016h] 
	and	ax,[bp-018h] 
	mov	[bp-016h],ax 
	mov	word ptr [bp-026h],0000h 
	mov	word ptr [bp-028h],0002h 
	mov	word ptr [bp-024h],0000h 
	lea	ax,[bp-016h] 
	mov	word ptr [bp-020h],ss 
	mov	[bp-022h],ax 
	mov	[bp-01Eh],di 
	mov	ax,[bp+010h] 
	mov	dx,[bp+00Eh] 
	add	dx,[bp-012h] 
	adc	ax,[bp-010h] 
	mov	[bp-01Ah],ax 
	mov	[bp-01Ch],dx 
	mov	ds,word ptr [bp-00Ch] 
	mov	si,[bp-00Eh] 
	mov	ah,0Bh 
	call	dword ptr [bp-004h] 
	mov	ds,word ptr [bp-006h] 
	mov	[bp-014h],ax 
	cmp	word ptr [bp-014h],+000h 
	jnz	@@L13 
	mov	word ptr _fxvmm_error_code,0001h 
@@L13:	mov	ax,[bp-014h] 
	pop	di 
	pop	si 
	mov	sp,bp 
	pop	bp 
	retf 
 
;±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°± 
 
__fxvmm_xmm_embmove2: 
	push	bp 
	mov	bp,sp 
	sub	sp,+002h 
	push	si 
	push	di 
	mov	si,[bp+006h] 
	mov	di,[bp+00Ch] 
@@L20:	cmp	word ptr [bp+014h],+000h 
	jnbe	@@L15 
	jc	@@L16 
	cmp	word ptr [bp+012h],-001h 
	jnc	@@L15 
@@L16:	mov	dx,[bp+014h] 
	mov	ax,[bp+012h] 
	jmp	short @@L17 
@@L15:	xor	dx,dx 
	mov	ax,0FFFFh 
@@L17:	push	dx 
	push	ax 
	push    word ptr [bp+010h] 
	push    word ptr [bp+00Eh] 
	push	di 
	push    word ptr [bp+00Ah] 
	push    word ptr [bp+008h] 
	push	si 
	push	cs 
	call	__fxvmm_xmm_embmove1 
	add	sp,+010h 
	mov	[bp-002h],ax 
	cmp	word ptr [bp+014h],+000h 
	jnbe	@@L18 
	jc	@@L19 
	cmp	word ptr [bp+012h],-001h 
	jc	@@L19 
@@L18:	add	word ptr [bp+008h],-001h 
	adc	word ptr [bp+00Ah],+000h 
	add	word ptr [bp+00Eh],-001h 
	adc	word ptr [bp+010h],+000h 
	jmp	short @@L20 
@@L19:	mov	ax,[bp-002h] 
	pop	di 
	pop	si 
	mov	sp,bp 
	pop	bp 
	retf 
 
;±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°± 
 
__fxvmm_xms_handle_absread: 
	push	bp 
	mov	bp,sp 
	push    word ptr [bp+014h] 
	push    word ptr [bp+012h] 
	push    word ptr [bp+008h] 
	push    word ptr [bp+006h] 
	xor	ax,ax 
	push	ax 
	les	bx,dword ptr [bp+00Ah] 
	mov	ax,[bp+010h] 
	mov	dx,[bp+00Eh] 
	add	dx,es:[bx+017h] 
	adc	ax,es:[bx+019h] 
	push	ax 
	push	dx 
	les	bx,dword ptr [bp+00Ah] 
	push	word ptr es:[bx+013h] 
	push	cs 
	call	__fxvmm_xmm_embmove2 
	add	sp,+010h 
	mov	ax,[bp+010h] 
	mov	dx,[bp+00Eh] 
	add	dx,[bp+012h] 
	adc	ax,[bp+014h] 
	les	bx,dword ptr [bp+00Ah] 
	push	dx 
	mov	es:[bx+009h],ax 
	mov	dx,ax 
	pop	ax 
	mov	es:[bx+007h],ax 
	pop	bp 
	retf 
 
;±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°± 
 
__fxvmm_xms_handle_abswrite: 
	push	bp 
	mov	bp,sp 
	push    word ptr [bp+014h] 
	push    word ptr [bp+012h] 
	les	bx,dword ptr [bp+006h] 
	mov	ax,[bp+00Ch] 
	mov	dx,[bp+00Ah] 
	add	dx,es:[bx+017h] 
	adc	ax,es:[bx+019h] 
	push	ax 
	push	dx 
	les	bx,dword ptr [bp+006h] 
	push	word ptr es:[bx+013h] 
	push    word ptr [bp+010h] 
	push    word ptr [bp+00Eh] 
	xor	ax,ax 
	push	ax 
	push	cs 
	call	__fxvmm_xmm_embmove2 
	add	sp,+010h 
	mov	ax,[bp+00Ch] 
	mov	dx,[bp+00Ah] 
	add	dx,[bp+012h] 
	adc	ax,[bp+014h] 
	les	bx,dword ptr [bp+006h] 
	push	dx 
	mov	es:[bx+009h],ax 
	mov	dx,ax 
	pop	ax 
	mov	es:[bx+007h],ax 
	pop	bp 
	retf 
 
;±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°± 
 
__fxvmm_xms_handle_free: 
	push	bp 
	mov	bp,sp 
	les	bx,dword ptr [bp+006h] 
	push	word ptr es:[bx+013h] 
	push	cs 
	call	__fxvmm_xmm_blockfree 
	add	sp,+002h 
	pop	bp 
	retf 
 
;±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°± 
 
__fxvmm_xms_handle_alloc: 
	push	bp 
	mov	bp,sp 
	mov	ax,[bp+00Ah] 
	add	ax,0013h 
	push    word ptr [bp+00Ch] 
	push	ax 
	mov	dx,[bp+008h] 
	mov	ax,[bp+006h] 
	mov	cl,0Ah 
	call	far ptr F_LXURSH@ 
	push	ax 
	mov	ax,[bp+006h] 
	and	ax,03FFh 
	or	ax,0000h 
	jz	@@L21 
	mov	ax,0001h 
	jmp	short @@L22 
@@L21:	xor	ax,ax 
 
@@L22:	pop	dx 
	add	dx,ax 
	push	dx 
	push	cs 
	call	__fxvmm_xmm_allocblock 
	add	sp,+006h 
	or	ax,ax 
	jnz	@@L23 
	xor	ax,ax 
	pop	bp 
	retf 
@@L23:	mov	ax,_fxvmm_global_xms_handle 
	and	ax,007Fh 
	les	bx,dword ptr [bp+00Ah] 
	and	byte ptr es:[bx+002h],80h 
	or	es:[bx+002h],al 
	les	bx,dword ptr [bp+00Ah] 
	mov	ax,[bp+008h] 
	mov	dx,[bp+006h] 
	mov	es:[bx+005h],ax 
	mov	es:[bx+003h],dx 
	les	bx,dword ptr [bp+00Ah] 
	mov	word ptr es:[bx+009h],0000h 
	mov	word ptr es:[bx+007h],0000h 
	les	bx,dword ptr [bp+00Ah] 
	mov	word ptr es:[bx+019h],0000h 
	mov	word ptr es:[bx+017h],0000h 
	mov	ax,0001h 
	pop	bp 
	retf 
 
;±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°± 
 
__fxvmm_xms_handle_deinit: 
	push	bp 
	mov	bp,sp 
	pop	bp 
	retf 
FXXMM_TEXT	ENDS 
 
;±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°± 
 
_DATA	SEGMENT 
 
_fxvmm_local_xms_handle	db	001h 
                    	db	000h 
                 	dd	FXXMM_TEXT:__fxvmm_xms_handle_alloc 
                  	dd	FXXMM_TEXT:__fxvmm_xms_handle_free 
                    	dd	FXXMM_TEXT:__fxvmm_xms_handle_absread 
                   	dd	FXXMM_TEXT:__fxvmm_xms_handle_abswrite 
                 	dd	FXXMM_TEXT:__fxvmm_xms_handle_deinit 
                 	dd	DGROUP:_fxvmm_global_xms_handle 
_fxvmm_strat_xms_handle	dd	DGROUP:_fxvmm_local_xms_handle 
 
_DATA	ENDS 
 
;±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°± 
 
_BSS	SEGMENT 
 
_fxvmm_xmm_exist	dw	1 dup(?) 
_fxvmm_xmm_control	dw	1 dup(?) 
_fxvmm_xmm_xctrl        dw	1 dup(?) 
_fxvmm_xmm_inited	dw	1 dup(?) 
 
_BSS	ENDS 
	END 
 
;±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°