www.pudn.com > fxvmm210.zip > _FXVIRT.ASM
;±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±
;
; Virtual memory manipulation procedures
;
TITLE FXVIRT
.386p
.387
FXVIRT_TEXT SEGMENT BYTE public USE16 'CODE'
FXVIRT_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 _int86x:NEAR
extrn F_PADA@:NEAR
extrn _getdisk:NEAR
extrn __fxvmm_vrt_handle_buildswap:NEAR
extrn __fxvmm_vrt_handle_swapunlink:NEAR
extrn _strcpy:NEAR
extrn _chsize:NEAR
extrn _close:NEAR
extrn _lseek:NEAR
extrn _open:NEAR
extrn _fxvmm_error_code:WORD
extrn _fxvmm_global_vrt_handle:WORD
;±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±
public __fxvmm_vrt_handle_init
public __fxvmm_vrt_handle_absread
public __fxvmm_vrt_handle_abswrite
public __fxvmm_vrt_handle_free
public __fxvmm_vrt_changesize
public __fxvmm_vrt_handle_alloc
public __fxvmm_vrt_handle_deinit
public _fxvmm_local_vrt_handle
public _fxvmm_strat_vrt_handle
public _fxvmm_vrt_swapsize
public _fxvmm_vrt_swapinsize
public _fxvmm_vrt_swaptemplate
public _fxvmm_vrt_swapdisk
public _fxvmm_vrt_inithandle
public _fxvmm_vrt_swaphandle
public _fxvmm_vrt_swapname
;±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±
FXVIRT_TEXT SEGMENT
assume cs: FXVIRT_TEXT
;±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±
__fxvmm_vrt_handle_init:
push bp
mov bp,sp
sub sp,+004h
push ds
mov ax,offset DGROUP:_fxvmm_vrt_swaptemplate ; target
push ax
call far ptr _strcpy ; call the C function
add sp,+008h ; strcpy() to copy swapstring
call far ptr _getdisk ; get the current disk
assume ds: DGROUP
mov _fxvmm_vrt_swapdisk,ax ; move result (ax) into _fxvmm_vrt_swapdisk
mov ax,0180h
push ax
mov ax,8104h
push ax
push word ptr [bp-002h]
push word ptr [bp-004h]
call far ptr __fxvmm_vrt_handle_buildswap
add sp,+004h
push dx
push ax
push ds
; We're making a copy of the returned string from the _fxvmm_tempname()
; function, just so that we keep a local variable, wich cannot be changed
; by the user while we're actually opening or closing a swap file.
mov ax,offset DGROUP:_fxvmm_vrt_swapname ; setup _fxvmm_vrt_swapname
push ax ; for strcpy()
call far ptr _strcpy ; copy returned string
add sp,+008h ; into _fxvmm_vrt_swapname
push dx
push ax
; Open the swap file using the ANSI-C function open()
call far ptr _open
add sp,+008h
mov _fxvmm_vrt_swaphandle,ax
cmp ax,0FFFFh
jz @@L4
mov ax,0001h
jmp short @@L5
@@L4: xor ax,ax
; check to if any error occured, if so put them into the externally
; accessible fxvmm_error_code variable
@@L5: mov _fxvmm_vrt_inithandle,ax
cmp word ptr _fxvmm_vrt_inithandle,+000h
jnz @@L6
mov word ptr _fxvmm_error_code,0002h
@@L6: mov sp,bp
pop bp
retf
;±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±
__fxvmm_vrt_handle_absread:
push bp
mov bp,sp
xor ax,ax
push ax
les bx,dword ptr [bp+00Ah]
mov ax,es:[bx+015h]
mov dx,es:[bx+013h]
add dx,[bp+00Eh]
adc ax,[bp+010h]
push ax
push dx
push _fxvmm_vrt_swaphandle
call far ptr _lseek
add sp,+008h
push word ptr [bp+014h]
push word ptr [bp+012h]
push word ptr [bp+008h]
push word ptr [bp+006h]
push _fxvmm_vrt_swaphandle
call far ptr __fxvmm_longread
add sp,+00Ah
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_vrt_handle_abswrite:
push bp
mov bp,sp
xor ax,ax
push ax
les bx,dword ptr [bp+006h]
mov ax,es:[bx+015h]
mov dx,es:[bx+013h]
add dx,[bp+00Ah]
adc ax,[bp+00Ch]
push ax
push dx
push _fxvmm_vrt_swaphandle
call far ptr _lseek
add sp,+008h
push word ptr [bp+014h]
push word ptr [bp+012h]
push word ptr [bp+010h]
push word ptr [bp+00Eh]
push _fxvmm_vrt_swaphandle
call far ptr __fxvmm_longwrite
add sp,+00Ah
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_vrt_handle_free:
push bp
mov bp,sp
pop bp
retf
;±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±
__fxvmm_vrt_changesize:
push bp
mov bp,sp
push word ptr [bp+00Ah]
push word ptr [bp+008h]
push word ptr [bp+006h]
call far ptr _chsize
add sp,+006h
cmp ax,0FFFFh
jz @@L7
mov ax,0001h
jmp short @@L8
@@L7: xor ax,ax
@@L8: pop bp
retf
;±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±
__fxvmm_vrt_handle_alloc:
push bp
mov bp,sp
cmp word ptr _fxvmm_vrt_inithandle,+000h
jnz @@L9
push cs
call __fxvmm_vrt_handle_init
@@L9: cmp word ptr _fxvmm_vrt_inithandle,+000h
jnz @@L10
xor ax,ax
pop bp
retf
@@L10: mov ax,_fxvmm_vrt_swapinsize
mov dx,_fxvmm_vrt_swapsize
add dx,[bp+006h]
adc ax,[bp+008h]
push ax
push dx
push _fxvmm_vrt_swaphandle
push cs
call near ptr __fxvmm_vrt_changesize
add sp,+006h
or ax,ax
jz @@L12
les bx,dword ptr [bp+00Ah]
mov ax,_fxvmm_vrt_swapinsize
mov dx,_fxvmm_vrt_swapsize
mov es:[bx+015h],ax
mov es:[bx+013h],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 ax,[bp+008h]
mov dx,[bp+006h]
mov es:[bx+005h],ax
mov es:[bx+003h],dx
mov ax,_fxvmm_global_vrt_handle
and ax,007Fh
les bx,dword ptr [bp+00Ah]
and byte ptr es:[bx+002h],80h
or es:[bx+002h],al
mov ax,_fxvmm_vrt_swapinsize
mov dx,_fxvmm_vrt_swapsize
add dx,[bp+006h]
adc ax,[bp+008h]
mov _fxvmm_vrt_swapinsize,ax
mov _fxvmm_vrt_swapsize,dx
mov ax,0001h
pop bp
retf
@@L12: mov word ptr _fxvmm_error_code,0002h
xor ax,ax
pop bp
retf
;±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±
__fxvmm_vrt_handle_deinit:
push bp
mov bp,sp
cmp word ptr _fxvmm_vrt_swaphandle,+000h
jz @@L13
push _fxvmm_vrt_swaphandle
call far ptr _close
add sp,+002h
push ds
mov ax,offset DGROUP:_fxvmm_vrt_swapname
push ax
call far ptr __fxvmm_vrt_handle_swapunlink
add sp,+004h
@@L13: mov word ptr _fxvmm_vrt_inithandle,0000h
pop bp
retf
;±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±
__fxvmm_longread:
push bp
mov bp,sp
sub sp,+020h
mov ax,[bp+00Eh]
mov dx,[bp+00Ch]
mov [bp-00Ah],ax
mov [bp-00Ch],dx
mov ax,[bp+00Ah]
mov dx,[bp+008h]
mov [bp-00Eh],ax
mov [bp-010h],dx
mov ax,[bp+006h]
mov [bp-01Eh],ax
mov byte ptr [bp-01Fh],3Fh
jmp @$L1
@$L6: cmp word ptr [bp+00Eh],+000h
jg @$L2
jl @$L3
cmp word ptr [bp+00Ch],-001h
jnc @$L2
@$L3: mov ax,[bp+00Ch]
jmp short @$L4
@$L2: mov ax,0FFFFh
@$L4: mov [bp-01Ch],ax
mov ax,[bp-00Eh]
mov [bp-002h],ax
mov ax,[bp-010h]
mov [bp-01Ah],ax
push ss
lea ax,[bp-008h]
push ax
push ss
lea ax,[bp-020h]
push ax
push ss
lea ax,[bp-020h]
push ax
mov ax,0021h
push ax
call far ptr _int86x
add sp,+00Eh
mov bx,[bp-020h]
xor cx,cx
mov dx,ss
lea ax,[bp-010h]
call far ptr F_PADA@
mov ax,[bp-020h]
sub [bp+00Ch],ax
sbb word ptr [bp+00Eh],+000h
mov ax,[bp-00Eh]
mov [bp-002h],ax
mov ax,[bp-010h]
mov [bp-01Ah],ax
cmp word ptr [bp-014h],+000h
jz @$L1
assume ds: DGROUP
mov word ptr _fxvmm_error_code,0002h
mov dx,0FFFFh
mov ax,0FFFFh
mov sp,bp
pop bp
retf
@$L1: mov ax,[bp+00Ch]
or ax,[bp+00Eh]
jz @$L5
jmp @$L6
@$L5: mov dx,[bp-00Ah]
mov ax,[bp-00Ch]
sub ax,[bp+00Ch]
sbb dx,[bp+00Eh]
mov sp,bp
pop bp
retf
;±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±
__fxvmm_longwrite:
push bp
mov bp,sp
sub sp,+020h
mov ax,[bp+00Eh]
mov dx,[bp+00Ch]
mov [bp-00Ah],ax
mov [bp-00Ch],dx
mov ax,[bp+00Ah]
mov dx,[bp+008h]
mov [bp-00Eh],ax
mov [bp-010h],dx
mov ax,[bp+006h]
mov [bp-01Eh],ax
mov byte ptr [bp-01Fh],40h
jmp @$L7
@$L12: cmp word ptr [bp+00Eh],+000h
jg @$L8
jl @$L9
cmp word ptr [bp+00Ch],-001h
jnc @$L8
@$L9: mov ax,[bp+00Ch]
jmp short @$L10
@$L8: mov ax,0FFFFh
@$L10: mov [bp-01Ch],ax
mov ax,[bp-00Eh]
mov [bp-002h],ax
mov ax,[bp-010h]
mov [bp-01Ah],ax
push ss
lea ax,[bp-008h]
push ax
push ss
lea ax,[bp-020h]
push ax
push ss
lea ax,[bp-020h]
push ax
mov ax,0021h
push ax
call far ptr _int86x
add sp,+00Eh
mov bx,[bp-020h]
xor cx,cx
mov dx,ss
lea ax,[bp-010h]
call far ptr F_PADA@
mov ax,[bp-020h]
sub [bp+00Ch],ax
sbb word ptr [bp+00Eh],+000h
mov ax,[bp-00Eh]
mov [bp-002h],ax
mov ax,[bp-010h]
mov [bp-01Ah],ax
cmp word ptr [bp-014h],+000h
jz @$L7
mov word ptr _fxvmm_error_code,0002h
mov dx,0FFFFh
mov ax,0FFFFh
mov sp,bp
pop bp
retf
@$L7: mov ax,[bp+00Ch]
or ax,[bp+00Eh]
jz @$L11
jmp @$L12
@$L11: mov dx,[bp-00Ah]
mov ax,[bp-00Ch]
sub ax,[bp+00Ch]
sbb dx,[bp+00Eh]
mov sp,bp
pop bp
retf
;±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±
FXVIRT_TEXT ENDS
_DATA SEGMENT
_fxvmm_local_vrt_handle db 001h
db 000h
dd FXVIRT_TEXT:__fxvmm_vrt_handle_alloc
dd FXVIRT_TEXT:__fxvmm_vrt_handle_free
dd FXVIRT_TEXT:__fxvmm_vrt_handle_absread
dd FXVIRT_TEXT:__fxvmm_vrt_handle_abswrite
dd FXVIRT_TEXT:__fxvmm_vrt_handle_deinit
dd DGROUP:_fxvmm_global_vrt_handle
_fxvmm_strat_vrt_handle dd DGROUP:_fxvmm_local_vrt_handle
_DATA ENDS
;±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±
_BSS SEGMENT
_fxvmm_vrt_swapsize dw 1 dup(?)
_fxvmm_vrt_swapinsize dw 1 dup(?)
_fxvmm_vrt_swaptemplate db 80 dup(?)
_fxvmm_vrt_swapdisk dw 1 dup(?)
_fxvmm_vrt_inithandle dw 1 dup(?)
_fxvmm_vrt_swaphandle dw 1 dup(?)
_fxvmm_vrt_swapname db 80 dup(?)
_BSS ENDS
END
;±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°±°