Subversion Repositories Kolibri OS

Rev

Rev 109 | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 109 Rev 135
Line 1... Line 1...
1
file_handler:
1
file_handler:
2
 .position=0
2
 .operation=0
3
 .size=4
3
 .position=4
4
 .bufer_block=8
4
 .reserved=8
5
 .operation=12
-
 
6
 .first_block=16
-
 
7
 .n_blocks=20
5
 .n_bytes=12
8
 .bufer=24
6
 .bufer=16
9
 .work_area=28
-
 
10
 .name=32
7
 .name=20
11
 .st_size=32+128
8
 .st_size=20+1024
Line 12... Line 9...
12
 
9
 
13
open: ;esi=name_string
10
open: ;esi=name_string
14
      ;retorna eax
11
      ;retorna eax
15
	pushad
-
 
16
	push dword [work_area]
-
 
17
	mov ecx,512 ;bufer
-
 
18
	call malloc
-
 
19
	push edi
12
	pushad
20
	mov ecx,file_handler.st_size
13
	mov ecx,file_handler.st_size
21
	call mallocz
-
 
22
	pop dword[edi+file_handler.bufer]
-
 
23
	pop dword[edi+file_handler.work_area]
14
	call mallocz
-
 
15
	mov [esp+28],edi
24
	mov [esp+28],edi
16
	push edi
25
	mov ecx,100
17
	mov ecx,1024
26
	add edi,file_handler.name
18
	add edi,file_handler.name
27
	call movedata
19
	call movedata
28
	mov edi,[esp+28]
-
 
29
	mov byte[edi+file_handler.n_blocks],1
20
	pop edi
30
	mov  eax,58
21
; test if file exists
-
 
22
	lea ebx,[edi+file_handler.operation]
-
 
23
	mov byte[ebx],5
31
	lea  ebx,[edi+file_handler.operation]
24
	mov dword[ebx+16],fileattr
32
	push edi
25
	mov eax,70
33
	int  0x40
26
	int 0x40
-
 
27
	cmp eax,2
34
	pop edi
28
	jz .virtual
35
	test eax,eax
29
	test eax,eax
36
	jnz close.b
-
 
-
 
30
	jnz close.b
37
	mov [edi+file_handler.size],ebx
31
@@:
38
	clc
32
	clc
39
	popad
33
	popad
-
 
34
	ret
-
 
35
.virtual:
-
 
36
        mov     byte [fileattr], 0x10
Line 40... Line 37...
40
	ret
37
        jmp     @b
41
 
38
 
42
close:
39
close:
43
	pushad
40
	pushad
44
     .b:
-
 
45
	mov eax,[esp+28]
-
 
46
	mov edi,[eax+file_handler.bufer]
-
 
47
	call free
41
     .b:
48
	mov edi,eax
42
	mov edi,[esp+28]
49
	call free
43
	call free
50
	popad
44
	popad
Line 51... Line 45...
51
	xor eax,eax
45
	xor eax,eax
52
	ret
46
	ret
53
 
47
 
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
48
 
-
 
49
read:     ;(f,bufer,nbytes)  eax,edi,ecx ncr
-
 
50
	  ;retorna bytes leidos en ecx
-
 
51
	pushad
105
	mov [eax+file_handler.first_block],ebx
52
	lea     ebx, [eax+file_handler.operation]
106
	mov [eax+file_handler.bufer_block],ebx
53
	mov     byte [ebx], 0
107
	mov dword[eax+file_handler.n_blocks],1
54
	mov     [ebx+12], ecx
108
	lea ebx,[eax+file_handler.operation]
55
	mov     [ebx+16], edi
109
	mov eax,58
-
 
110
	int 40h
56
	mov     eax, 70
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
57
	int     0x40
122
	jc .l4
58
	cmp     ebx, -1
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
59
	sbb     ebx, -1
131
	ret
-
 
132
.error:
-
 
133
 popad
60
	mov     eax, [esp+28]
Line 134... Line -...
134
 popad
-
 
135
 xor ecx,ecx
61
	add     [eax+file_handler.position], ebx
136
 stc
62
	mov     [esp+24], ebx
137
 ret
63
	popad
138
 
64
	ret
139
 
65