forked from KolibriOS/kolibrios
152 lines
2.5 KiB
NASM
152 lines
2.5 KiB
NASM
|
file_handler:
|
||
|
.position=0
|
||
|
.size=4
|
||
|
.bufer_block=8
|
||
|
.operation=12
|
||
|
.first_block=16
|
||
|
.n_blocks=20
|
||
|
.bufer=24
|
||
|
.work_area=28
|
||
|
.name=32
|
||
|
.st_size=32+128
|
||
|
|
||
|
open: ;esi=name_string
|
||
|
;retorna eax
|
||
|
pushad
|
||
|
push dword [work_area]
|
||
|
mov ecx,512 ;bufer
|
||
|
call malloc
|
||
|
push edi
|
||
|
mov ecx,file_handler.st_size
|
||
|
call mallocz
|
||
|
pop dword[edi+file_handler.bufer]
|
||
|
pop dword[edi+file_handler.work_area]
|
||
|
mov [esp+28],edi
|
||
|
mov ecx,100
|
||
|
add edi,file_handler.name
|
||
|
call movedata
|
||
|
mov edi,[esp+28]
|
||
|
mov byte[edi+file_handler.n_blocks],1
|
||
|
mov eax,58
|
||
|
lea ebx,[edi+file_handler.operation]
|
||
|
push edi
|
||
|
int 0x40
|
||
|
pop edi
|
||
|
test eax,eax
|
||
|
jnz close.b
|
||
|
mov [edi+file_handler.size],ebx
|
||
|
clc
|
||
|
popad
|
||
|
ret
|
||
|
|
||
|
close:
|
||
|
pushad
|
||
|
.b:
|
||
|
mov eax,[esp+28]
|
||
|
mov edi,[eax+file_handler.bufer]
|
||
|
call free
|
||
|
mov edi,eax
|
||
|
call free
|
||
|
popad
|
||
|
xor eax,eax
|
||
|
ret
|
||
|
|
||
|
|
||
|
read: ;(f,bufer,nbytes) eax,edi,ecx ncr
|
||
|
;retorna bytes leidos en ecx
|
||
|
pushad
|
||
|
mov edx,[eax+file_handler.size]
|
||
|
sub edx,[eax+file_handler.position]
|
||
|
cmp edx,ecx
|
||
|
jnc .nb_ok
|
||
|
mov ecx,edx
|
||
|
mov [esp+24],edx
|
||
|
.nb_ok:
|
||
|
jecxz .final
|
||
|
mov byte[eax+file_handler.operation],0
|
||
|
test dword[eax+file_handler.position],511
|
||
|
jz .l1
|
||
|
call .bufer
|
||
|
.l1:
|
||
|
mov edx,ecx
|
||
|
shr edx,9
|
||
|
jz .l2
|
||
|
mov [eax+file_handler.n_blocks],edx
|
||
|
mov edx,[eax+file_handler.position]
|
||
|
shr edx,9
|
||
|
mov [eax+file_handler.first_block],edx
|
||
|
xchg edi,[eax+file_handler.bufer]
|
||
|
pushad
|
||
|
lea ebx,[eax+file_handler.operation]
|
||
|
mov eax,58
|
||
|
int 40h
|
||
|
cmp eax,0ffffff00h
|
||
|
jnc .error
|
||
|
popad
|
||
|
xchg edi,[eax+file_handler.bufer]
|
||
|
mov edx,ecx
|
||
|
and edx,0fffffe00h
|
||
|
add [eax+file_handler.position],edx
|
||
|
add edi,edx
|
||
|
.l2:
|
||
|
and ecx,511
|
||
|
jz .final
|
||
|
call .bufer
|
||
|
.final:
|
||
|
popad
|
||
|
ret
|
||
|
|
||
|
.bufer:
|
||
|
pushad
|
||
|
mov ebx,[eax+file_handler.position]
|
||
|
shr ebx,9
|
||
|
cmp ebx,[eax+file_handler.bufer_block]
|
||
|
je .l3
|
||
|
mov [eax+file_handler.first_block],ebx
|
||
|
mov [eax+file_handler.bufer_block],ebx
|
||
|
mov dword[eax+file_handler.n_blocks],1
|
||
|
lea ebx,[eax+file_handler.operation]
|
||
|
mov eax,58
|
||
|
int 40h
|
||
|
cmp eax,0ffffff00h
|
||
|
jnc .error
|
||
|
.l3:
|
||
|
mov eax,[esp+28]
|
||
|
mov edx,[eax+file_handler.position]
|
||
|
mov esi,[eax+file_handler.bufer]
|
||
|
and edx,511
|
||
|
add esi,edx
|
||
|
neg edx
|
||
|
add edx,512
|
||
|
cmp ecx,edx
|
||
|
jc .l4
|
||
|
mov ecx,edx
|
||
|
.l4:
|
||
|
add [eax+file_handler.position],ecx
|
||
|
sub [esp+24],ecx
|
||
|
pop edi
|
||
|
call movedata
|
||
|
push edi
|
||
|
popad
|
||
|
ret
|
||
|
.error:
|
||
|
popad
|
||
|
popad
|
||
|
xor ecx,ecx
|
||
|
stc
|
||
|
ret
|
||
|
|
||
|
|
||
|
ftell: mov edx,[eax+file_handler.position]
|
||
|
ret
|
||
|
lseek: ;eax=file edx=pos
|
||
|
mov [eax+file_handler.position],edx
|
||
|
ret
|
||
|
skip: ;eax=file edx=bytes to skip
|
||
|
add [eax+file_handler.position],edx
|
||
|
ret
|
||
|
|
||
|
|
||
|
|
||
|
|