file_handler:
 .operation=0
 .position=4
 .reserved=8
 .n_bytes=12
 .bufer=16
 .name=20
 .st_size=20+1024

open: ;esi=name_string
      ;retorna eax
	pushad
	mov ecx,file_handler.st_size
	call mallocz
	mov [esp+28],edi
	push edi
	mov ecx,1024
	add edi,file_handler.name
	call movedata
	pop edi
; test if file exists
	lea ebx,[edi+file_handler.operation]
	mov byte[ebx],5
	mov dword[ebx+16],fileattr
	mov eax,70
	int 0x40
	cmp eax,2
	jz .virtual
	test eax,eax
	jnz close.b
@@:
	clc
	popad
	ret
.virtual:
        mov     byte [fileattr], 0x10
        jmp     @b

close:
	pushad
     .b:
	mov edi,[esp+28]
	call free
	popad
	xor eax,eax
	ret


read:     ;(f,bufer,nbytes)  eax,edi,ecx ncr
	  ;retorna bytes leidos en ecx
	pushad
	lea     ebx, [eax+file_handler.operation]
	mov     byte [ebx], 0
	mov     [ebx+12], ecx
	mov     [ebx+16], edi
	mov     eax, 70
	int     0x40
	cmp     ebx, -1
	sbb     ebx, -1
	mov     eax, [esp+28]
	add     [eax+file_handler.position], ebx
	mov     [esp+24], ebx
	popad
	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