240 lines
3.1 KiB
Plaintext
240 lines
3.1 KiB
Plaintext
|
|
display_string:
|
|
lods byte [esi]
|
|
or al,al
|
|
jz string_end
|
|
mov dl,al
|
|
mov ah,2
|
|
int 21h
|
|
jmp display_string
|
|
string_end:
|
|
ret
|
|
alloc:
|
|
push ebx esi edi
|
|
mov cx,ax
|
|
shr eax,16
|
|
mov bx,ax
|
|
mov ax,501h
|
|
int 31h
|
|
jc dpmi_allocation_failed
|
|
mov ax,bx
|
|
shl eax,16
|
|
mov ax,cx
|
|
mov edx,main
|
|
shl edx,4
|
|
sub eax,edx
|
|
mov bx,si
|
|
shl ebx,16
|
|
mov bx,di
|
|
mov ecx,[memory_handles_count]
|
|
inc [memory_handles_count]
|
|
shl ecx,3
|
|
add ecx,memory_handles
|
|
mov [ecx],eax
|
|
mov [ecx+4],ebx
|
|
pop edi esi ebx
|
|
clc
|
|
ret
|
|
dpmi_allocation_failed:
|
|
pop edi esi ebx
|
|
stc
|
|
ret
|
|
free:
|
|
push ebx esi edi
|
|
mov esi,memory_handles
|
|
mov ecx,[memory_handles_count]
|
|
find_memory_handle:
|
|
cmp eax,[esi]
|
|
je memory_handle_found
|
|
add esi,8
|
|
loop find_memory_handle
|
|
pop edi esi
|
|
ret
|
|
memory_handle_found:
|
|
mov ebx,[esi+4]
|
|
dec [memory_handles_count]
|
|
dec ecx
|
|
jz free_memory
|
|
remove_memory_handle:
|
|
mov edx,[esi+8]
|
|
mov edi,[esi+8+4]
|
|
mov [esi],edx
|
|
mov [esi+4],edi
|
|
add esi,8
|
|
loop remove_memory_handle
|
|
free_memory:
|
|
mov esi,ebx
|
|
shr esi,16
|
|
mov di,bx
|
|
mov ax,502h
|
|
int 31h
|
|
pop edi esi ebx
|
|
ret
|
|
open:
|
|
push esi edi ebp
|
|
call adapt_path
|
|
mov ax,716Ch
|
|
mov bx,100000b
|
|
mov dx,1
|
|
xor cx,cx
|
|
xor si,si
|
|
call dos_int
|
|
jnc open_done
|
|
cmp ax,7100h
|
|
je old_open
|
|
stc
|
|
jmp open_done
|
|
old_open:
|
|
mov ax,3D00h
|
|
xor dx,dx
|
|
call dos_int
|
|
open_done:
|
|
mov bx,ax
|
|
pop ebp edi esi
|
|
ret
|
|
adapt_path:
|
|
mov esi,edx
|
|
mov edi,buffer
|
|
copy_path:
|
|
lodsb
|
|
cmp al,'/'
|
|
jne path_char_ok
|
|
mov al,'\'
|
|
path_char_ok:
|
|
stosb
|
|
or al,al
|
|
jnz copy_path
|
|
ret
|
|
dos_int:
|
|
push 0 0 0
|
|
pushw buffer_segment buffer_segment
|
|
stc
|
|
pushfw
|
|
push eax
|
|
push ecx
|
|
push edx
|
|
push ebx
|
|
push 0
|
|
push ebp
|
|
push esi
|
|
push edi
|
|
mov ax,300h
|
|
mov bx,21h
|
|
xor cx,cx
|
|
mov edi,esp
|
|
push es ss
|
|
pop es
|
|
int 31h
|
|
pop es
|
|
mov edi,[esp]
|
|
mov esi,[esp+4]
|
|
mov ebp,[esp+8]
|
|
mov ebx,[esp+10h]
|
|
mov edx,[esp+14h]
|
|
mov ecx,[esp+18h]
|
|
mov ah,[esp+20h]
|
|
add esp,32h
|
|
sahf
|
|
mov eax,[esp-32h+1Ch]
|
|
ret
|
|
create:
|
|
push esi edi ebp
|
|
call adapt_path
|
|
mov ax,716Ch
|
|
mov bx,100001b
|
|
mov dx,10010b
|
|
xor cx,cx
|
|
xor si,si
|
|
xor di,di
|
|
call dos_int
|
|
jnc create_done
|
|
cmp ax,7100h
|
|
je old_create
|
|
stc
|
|
jmp create_done
|
|
old_create:
|
|
mov ah,3Ch
|
|
xor cx,cx
|
|
xor dx,dx
|
|
call dos_int
|
|
create_done:
|
|
mov bx,ax
|
|
pop ebp edi esi
|
|
ret
|
|
write:
|
|
push edx esi edi ebp
|
|
mov ebp,ecx
|
|
mov esi,edx
|
|
write_loop:
|
|
mov ecx,1000h
|
|
sub ebp,1000h
|
|
jnc do_write
|
|
add ebp,1000h
|
|
mov ecx,ebp
|
|
xor ebp,ebp
|
|
do_write:
|
|
push ecx
|
|
mov edi,buffer
|
|
shr ecx,2
|
|
rep movsd
|
|
mov ecx,[esp]
|
|
and ecx,11b
|
|
rep movsb
|
|
pop ecx
|
|
mov ah,40h
|
|
xor dx,dx
|
|
call dos_int
|
|
or ebp,ebp
|
|
jnz write_loop
|
|
pop ebp edi esi edx
|
|
ret
|
|
read:
|
|
push edx esi edi ebp
|
|
mov ebp,ecx
|
|
mov edi,edx
|
|
read_loop:
|
|
mov ecx,1000h
|
|
sub ebp,1000h
|
|
jnc do_read
|
|
add ebp,1000h
|
|
mov ecx,ebp
|
|
xor ebp,ebp
|
|
do_read:
|
|
push ecx
|
|
mov ah,3Fh
|
|
xor dx,dx
|
|
call dos_int
|
|
cmp ax,cx
|
|
jne eof
|
|
mov esi,buffer
|
|
mov ecx,[esp]
|
|
shr ecx,2
|
|
rep movsd
|
|
pop ecx
|
|
and ecx,11b
|
|
rep movsb
|
|
or ebp,ebp
|
|
jnz read_loop
|
|
read_done:
|
|
pop ebp edi esi edx
|
|
ret
|
|
eof:
|
|
pop ecx
|
|
stc
|
|
jmp read_done
|
|
close:
|
|
mov ah,3Eh
|
|
int 21h
|
|
ret
|
|
lseek:
|
|
mov ah,42h
|
|
mov ecx,edx
|
|
shr ecx,16
|
|
int 21h
|
|
pushf
|
|
shl edx,16
|
|
popf
|
|
mov dx,ax
|
|
mov eax,edx
|
|
ret
|