asm_dip/toolchain/fasmw17332/TOOLS/DOS/SYSTEM.INC
2024-11-24 23:13:28 -05:00

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