forked from KolibriOS/kolibrios
630234432f
git-svn-id: svn://kolibrios.org@109 a494cfbc-eb01-0410-851d-a64ba20cac60
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
|
|
|
|
|
|
|
|
|