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
;±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°