Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
31 halyavin 1
file_handler:
2
 .position=0
3
 .size=4
4
 .bufer_block=8
5
 .operation=12
6
 .first_block=16
7
 .n_blocks=20
8
 .bufer=24
9
 .work_area=28
10
 .name=32
11
 .st_size=32+128
12
 
13
open: ;esi=name_string
14
      ;retorna eax
15
	pushad
16
	push dword [work_area]
17
	mov ecx,512 ;bufer
18
	call malloc
19
	push edi
20
	mov ecx,file_handler.st_size
21
	call mallocz
22
	pop dword[edi+file_handler.bufer]
23
	pop dword[edi+file_handler.work_area]
24
	mov [esp+28],edi
25
	mov ecx,100
26
	add edi,file_handler.name
27
	call movedata
28
	mov edi,[esp+28]
29
	mov byte[edi+file_handler.n_blocks],1
30
	mov  eax,58
31
	lea  ebx,[edi+file_handler.operation]
32
	push edi
33
	int  0x40
34
	pop edi
35
	test eax,eax
36
	jnz close.b
37
	mov [edi+file_handler.size],ebx
38
	clc
39
	popad
40
	ret
41
 
42
close:
43
	pushad
44
     .b:
45
	mov eax,[esp+28]
46
	mov edi,[eax+file_handler.bufer]
47
	call free
48
	mov edi,eax
49
	call free
50
	popad
51
	xor eax,eax
52
	ret
53
 
54
 
55
read:     ;(f,bufer,nbytes)  eax,edi,ecx ncr
56
	  ;retorna bytes leidos en ecx
57
	pushad
58
	mov edx,[eax+file_handler.size]
59
	sub edx,[eax+file_handler.position]
60
	cmp edx,ecx
61
	jnc .nb_ok
62
	mov ecx,edx
63
	mov [esp+24],edx
64
      .nb_ok:
65
	jecxz .final
66
	mov byte[eax+file_handler.operation],0
67
	test dword[eax+file_handler.position],511
68
	jz .l1
69
	call .bufer
70
      .l1:
71
	mov edx,ecx
72
	shr edx,9
73
	jz .l2
74
	mov [eax+file_handler.n_blocks],edx
75
	mov edx,[eax+file_handler.position]
76
	shr edx,9
77
	mov [eax+file_handler.first_block],edx
78
	xchg edi,[eax+file_handler.bufer]
79
	pushad
80
	lea ebx,[eax+file_handler.operation]
81
	mov eax,58
82
	int 40h
83
 cmp eax,0ffffff00h
84
 jnc .error
85
	popad
86
	xchg edi,[eax+file_handler.bufer]
87
	mov edx,ecx
88
	and edx,0fffffe00h
89
	add [eax+file_handler.position],edx
90
	add edi,edx
91
      .l2:
92
	and ecx,511
93
	jz .final
94
	call .bufer
95
      .final:
96
	popad
97
	ret
98
 
99
   .bufer:
100
	pushad
101
	mov ebx,[eax+file_handler.position]
102
	shr ebx,9
103
	cmp ebx,[eax+file_handler.bufer_block]
104
	je .l3
105
	mov [eax+file_handler.first_block],ebx
106
	mov [eax+file_handler.bufer_block],ebx
107
	mov dword[eax+file_handler.n_blocks],1
108
	lea ebx,[eax+file_handler.operation]
109
	mov eax,58
110
	int 40h
111
 cmp eax,0ffffff00h
112
 jnc .error
113
   .l3:
114
	mov eax,[esp+28]
115
	mov edx,[eax+file_handler.position]
116
	mov esi,[eax+file_handler.bufer]
117
	and edx,511
118
	add esi,edx
119
	neg edx
120
	add edx,512
121
	cmp ecx,edx
122
	jc .l4
123
	mov ecx,edx
124
    .l4:
125
	add [eax+file_handler.position],ecx
126
	sub [esp+24],ecx
127
	pop edi
128
	call movedata
129
	push edi
130
	popad
131
	ret
132
.error:
133
 popad
134
 popad
135
 xor ecx,ecx
136
 stc
137
 ret
138
 
139
 
140
ftell:  mov edx,[eax+file_handler.position]
141
	ret
142
lseek: ;eax=file edx=pos
143
	mov [eax+file_handler.position],edx
144
	ret
145
skip:   ;eax=file edx=bytes to skip
146
	add [eax+file_handler.position],edx
147
	ret
148