Rev 1150 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1150 | Rev 1376 | ||
---|---|---|---|
1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
2 | ;; ;; |
2 | ;; ;; |
3 | ;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;; |
3 | ;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;; |
4 | ;; Distributed under terms of the GNU General Public License ;; |
4 | ;; Distributed under terms of the GNU General Public License ;; |
5 | ;; ;; |
5 | ;; ;; |
6 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
6 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
7 | 7 | ||
8 | $Revision: 1150 $ |
8 | $Revision: 1376 $ |
9 | 9 | ||
10 | pusha |
10 | pusha |
11 | 11 | ||
12 | mov eax,[pg_data.pages_free] |
12 | mov eax,[pg_data.pages_free] |
13 | ; 1/32 |
13 | ; 1/32 |
14 | shr eax,5 |
14 | shr eax,5 |
15 | ; round off up to 8 pages |
15 | ; round off up to 8 pages |
16 | shr eax,3 |
16 | shr eax,3 |
17 | shl eax,3 |
17 | shl eax,3 |
18 | ; translate pages in butes *4096 |
18 | ; translate pages in butes *4096 |
19 | shl eax,12 |
19 | shl eax,12 |
20 | ; check a upper size of the cache, no more than 1 Mb on the physical device |
20 | ; check a upper size of the cache, no more than 1 Mb on the physical device |
21 | cmp eax,1024*1024 |
21 | cmp eax,1024*1024 |
22 | jbe @f |
22 | jbe @f |
23 | mov eax,1024*1024 |
23 | mov eax,1024*1024 |
24 | jmp .continue |
24 | jmp .continue |
25 | @@: |
25 | @@: |
26 | ; check a lower size of the cache, not less than 128 Kb on the physical device |
26 | ; check a lower size of the cache, not less than 128 Kb on the physical device |
27 | cmp eax,128*1024 |
27 | cmp eax,128*1024 |
28 | jae @f |
28 | jae @f |
29 | mov eax,128*1024 |
29 | mov eax,128*1024 |
30 | @@: |
30 | @@: |
31 | .continue: |
31 | .continue: |
32 | mov [cache_ide0_size],eax |
32 | mov [cache_ide0_size],eax |
33 | mov [cache_ide1_size],eax |
33 | mov [cache_ide1_size],eax |
34 | mov [cache_ide2_size],eax |
34 | mov [cache_ide2_size],eax |
35 | mov [cache_ide3_size],eax |
35 | mov [cache_ide3_size],eax |
36 | xor eax,eax |
36 | xor eax,eax |
37 | mov [hdd_appl_data],1 ;al |
37 | mov [hdd_appl_data],1 ;al |
38 | mov [cd_appl_data],1 |
38 | mov [cd_appl_data],1 |
39 | 39 | ||
40 | mov ch,[DRIVE_DATA+1] |
40 | mov ch,[DRIVE_DATA+1] |
41 | mov cl,ch |
41 | mov cl,ch |
42 | and cl,11b |
42 | and cl,11b |
43 | je .ide2 |
43 | je .ide2 |
44 | mov esi,cache_ide3 |
44 | mov esi,cache_ide3 |
45 | call get_cache_ide |
45 | call get_cache_ide |
46 | .ide2: |
46 | .ide2: |
47 | mov cl,ch |
47 | mov cl,ch |
48 | shr cl,2 |
48 | shr cl,2 |
49 | and cl,11b |
49 | and cl,11b |
50 | je .ide1 |
50 | je .ide1 |
51 | mov esi,cache_ide2 |
51 | mov esi,cache_ide2 |
52 | call get_cache_ide |
52 | call get_cache_ide |
53 | .ide1: |
53 | .ide1: |
54 | mov cl,ch |
54 | mov cl,ch |
55 | shr cl,4 |
55 | shr cl,4 |
56 | and cl,11b |
56 | and cl,11b |
57 | je .ide0 |
57 | je .ide0 |
58 | mov esi,cache_ide1 |
58 | mov esi,cache_ide1 |
59 | call get_cache_ide |
59 | call get_cache_ide |
60 | .ide0: |
60 | .ide0: |
61 | mov cl,ch |
61 | mov cl,ch |
62 | shr cl,6 |
62 | shr cl,6 |
63 | and cl,11b |
63 | and cl,11b |
64 | je @f |
64 | je @f |
65 | mov esi,cache_ide0 |
65 | mov esi,cache_ide0 |
66 | call get_cache_ide |
66 | call get_cache_ide |
67 | @@: |
67 | @@: |
68 | xor ecx,ecx |
68 | xor ecx,ecx |
69 | cmp [NumBiosDisks],ecx |
69 | cmp [NumBiosDisks],ecx |
70 | jz .endbd |
70 | jz .endbd |
71 | mov esi,BiosDiskCaches |
71 | mov esi,BiosDiskCaches |
72 | .loopbd: |
72 | .loopbd: |
73 | push ecx |
73 | push ecx |
74 | movsx ecx,byte [BiosDisksData+ecx*4+2] |
74 | movsx ecx,byte [BiosDisksData+ecx*4+2] |
75 | inc ecx |
75 | inc ecx |
76 | jz .getbd |
76 | jz .getbd |
77 | add ecx,ecx |
77 | add ecx,ecx |
78 | movzx eax,byte [DRIVE_DATA+1] |
78 | movzx eax,byte [DRIVE_DATA+1] |
79 | shl eax,cl |
79 | shl eax,cl |
80 | and ah,3 |
80 | and ah,3 |
81 | cmp ah,1 |
81 | cmp ah,1 |
82 | jz .contbd |
82 | jz .contbd |
83 | pop ecx |
83 | pop ecx |
84 | mov byte [BiosDisksData+ecx*4+2], -1 |
84 | mov byte [BiosDisksData+ecx*4+2], -1 |
85 | push ecx |
85 | push ecx |
86 | .getbd: |
86 | .getbd: |
87 | mov eax,[cache_ide0_size] |
87 | mov eax,[cache_ide0_size] |
88 | mov [esi+cache_ide0_size-cache_ide0],eax |
88 | mov [esi+cache_ide0_size-cache_ide0],eax |
89 | mov cl,1 |
89 | mov cl,1 |
90 | call get_cache_ide |
90 | call get_cache_ide |
91 | .contbd: |
91 | .contbd: |
92 | pop ecx |
92 | pop ecx |
93 | add esi,cache_ide1-cache_ide0 |
93 | add esi,cache_ide1-cache_ide0 |
94 | inc ecx |
94 | inc ecx |
95 | cmp ecx,[NumBiosDisks] |
95 | cmp ecx,[NumBiosDisks] |
96 | jb .loopbd |
96 | jb .loopbd |
97 | .endbd: |
97 | .endbd: |
98 | jmp end_get_cache |
98 | jmp end_get_cache |
99 | 99 | ||
100 | get_cache_ide: |
100 | get_cache_ide: |
101 | and [esi+cache_ide0_search_start-cache_ide0],0 |
101 | and [esi+cache_ide0_search_start-cache_ide0],0 |
102 | and [esi+cache_ide0_appl_search_start-cache_ide0],0 |
102 | and [esi+cache_ide0_appl_search_start-cache_ide0],0 |
103 | push ecx |
103 | push ecx |
104 | stdcall kernel_alloc,[esi+cache_ide0_size-cache_ide0] |
104 | stdcall kernel_alloc,[esi+cache_ide0_size-cache_ide0] |
105 | mov [esi+cache_ide0_pointer-cache_ide0],eax |
105 | mov [esi+cache_ide0_pointer-cache_ide0],eax |
106 | pop ecx |
106 | pop ecx |
107 | mov edx,eax |
107 | mov edx,eax |
108 | mov eax,[esi+cache_ide0_size-cache_ide0] |
108 | mov eax,[esi+cache_ide0_size-cache_ide0] |
109 | shr eax,3 |
109 | shr eax,3 |
110 | mov [esi+cache_ide0_system_data_size-cache_ide0],eax |
110 | mov [esi+cache_ide0_system_data_size-cache_ide0],eax |
111 | mov ebx,eax |
111 | mov ebx,eax |
112 | imul eax,7 |
112 | imul eax,7 |
113 | mov [esi+cache_ide0_appl_data_size-cache_ide0],eax |
113 | mov [esi+cache_ide0_appl_data_size-cache_ide0],eax |
114 | add ebx,edx |
114 | add ebx,edx |
115 | mov [esi+cache_ide0_data_pointer-cache_ide0],ebx |
115 | mov [esi+cache_ide0_data_pointer-cache_ide0],ebx |
116 | 116 | ||
117 | cmp cl,10b |
117 | cmp cl,10b |
118 | je .cd |
118 | je .cd |
119 | push ecx |
119 | push ecx |
120 | mov eax,[esi+cache_ide0_system_data_size-cache_ide0] |
120 | mov eax,[esi+cache_ide0_system_data_size-cache_ide0] |
121 | call calculate_for_hd |
121 | call calculate_for_hd |
122 | add eax,[esi+cache_ide0_pointer-cache_ide0] |
122 | add eax,[esi+cache_ide0_pointer-cache_ide0] |
123 | mov [esi+cache_ide0_system_data-cache_ide0],eax |
123 | mov [esi+cache_ide0_system_data-cache_ide0],eax |
124 | mov [esi+cache_ide0_system_sad_size-cache_ide0],ecx |
124 | mov [esi+cache_ide0_system_sad_size-cache_ide0],ecx |
125 | 125 | ||
126 | push edi |
126 | push edi |
127 | mov edi,[esi+cache_ide0_pointer-cache_ide0] |
127 | mov edi,[esi+cache_ide0_pointer-cache_ide0] |
128 | call clear_ide_cache |
128 | call clear_ide_cache |
129 | pop edi |
129 | pop edi |
130 | 130 | ||
131 | mov eax,[esi+cache_ide0_appl_data_size-cache_ide0] |
131 | mov eax,[esi+cache_ide0_appl_data_size-cache_ide0] |
132 | call calculate_for_hd |
132 | call calculate_for_hd |
133 | add eax,[esi+cache_ide0_data_pointer-cache_ide0] |
133 | add eax,[esi+cache_ide0_data_pointer-cache_ide0] |
134 | mov [esi+cache_ide0_appl_data-cache_ide0],eax |
134 | mov [esi+cache_ide0_appl_data-cache_ide0],eax |
135 | mov [esi+cache_ide0_appl_sad_size-cache_ide0],ecx |
135 | mov [esi+cache_ide0_appl_sad_size-cache_ide0],ecx |
136 | 136 | ||
137 | push edi |
137 | push edi |
138 | mov edi,[esi+cache_ide0_data_pointer-cache_ide0] |
138 | mov edi,[esi+cache_ide0_data_pointer-cache_ide0] |
139 | call clear_ide_cache |
139 | call clear_ide_cache |
140 | pop edi |
140 | pop edi |
141 | 141 | ||
142 | pop ecx |
142 | pop ecx |
143 | ret |
143 | ret |
144 | .cd: |
144 | .cd: |
145 | push ecx |
145 | push ecx |
146 | mov eax,[esi+cache_ide0_system_data_size-cache_ide0] |
146 | mov eax,[esi+cache_ide0_system_data_size-cache_ide0] |
147 | call calculate_for_cd |
147 | call calculate_for_cd |
148 | add eax,[esi+cache_ide0_pointer-cache_ide0] |
148 | add eax,[esi+cache_ide0_pointer-cache_ide0] |
149 | mov [esi+cache_ide0_system_data-cache_ide0],eax |
149 | mov [esi+cache_ide0_system_data-cache_ide0],eax |
150 | mov [esi+cache_ide0_system_sad_size-cache_ide0],ecx |
150 | mov [esi+cache_ide0_system_sad_size-cache_ide0],ecx |
151 | 151 | ||
152 | push edi |
152 | push edi |
153 | mov edi,[esi+cache_ide0_pointer-cache_ide0] |
153 | mov edi,[esi+cache_ide0_pointer-cache_ide0] |
154 | call clear_ide_cache |
154 | call clear_ide_cache |
155 | pop edi |
155 | pop edi |
156 | 156 | ||
157 | mov eax,[esi+cache_ide0_appl_data_size-cache_ide0] |
157 | mov eax,[esi+cache_ide0_appl_data_size-cache_ide0] |
158 | call calculate_for_cd |
158 | call calculate_for_cd |
159 | add eax,[esi+cache_ide0_data_pointer-cache_ide0] |
159 | add eax,[esi+cache_ide0_data_pointer-cache_ide0] |
160 | mov [esi+cache_ide0_appl_data-cache_ide0],eax |
160 | mov [esi+cache_ide0_appl_data-cache_ide0],eax |
161 | mov [esi+cache_ide0_appl_sad_size-cache_ide0],ecx |
161 | mov [esi+cache_ide0_appl_sad_size-cache_ide0],ecx |
162 | 162 | ||
163 | push edi |
163 | push edi |
164 | mov edi,[esi+cache_ide0_data_pointer-cache_ide0] |
164 | mov edi,[esi+cache_ide0_data_pointer-cache_ide0] |
165 | call clear_ide_cache |
165 | call clear_ide_cache |
166 | pop edi |
166 | pop edi |
167 | 167 | ||
168 | pop ecx |
168 | pop ecx |
169 | ret |
169 | ret |
170 | 170 | ||
171 | calculate_for_hd: |
171 | calculate_for_hd: |
172 | push eax |
172 | push eax |
173 | mov ebx,eax |
173 | mov ebx,eax |
174 | shr eax,9 |
174 | shr eax,9 |
175 | shl eax,3 |
175 | shl eax,3 |
176 | sub ebx,eax |
176 | sub ebx,eax |
177 | shr ebx,9 |
177 | shr ebx,9 |
178 | mov ecx,ebx |
178 | mov ecx,ebx |
179 | shl ebx,9 |
179 | shl ebx,9 |
180 | pop eax |
180 | pop eax |
181 | sub eax,ebx |
181 | sub eax,ebx |
182 | dec ecx |
182 | dec ecx |
183 | ret |
183 | ret |
184 | 184 | ||
185 | calculate_for_cd: |
185 | calculate_for_cd: |
186 | push eax |
186 | push eax |
187 | mov ebx,eax |
187 | mov ebx,eax |
188 | shr eax,11 |
188 | shr eax,11 |
189 | shl eax,3 |
189 | shl eax,3 |
190 | sub ebx,eax |
190 | sub ebx,eax |
191 | shr ebx,11 |
191 | shr ebx,11 |
192 | mov ecx,ebx |
192 | mov ecx,ebx |
193 | shl ebx,11 |
193 | shl ebx,11 |
194 | pop eax |
194 | pop eax |
195 | sub eax,ebx |
195 | sub eax,ebx |
196 | dec ecx |
196 | dec ecx |
197 | ret |
197 | ret |
198 | 198 | ||
199 | clear_ide_cache: |
199 | clear_ide_cache: |
200 | push eax |
200 | push eax |
201 | shl ecx,1 |
201 | shl ecx,1 |
202 | xor eax,eax |
202 | xor eax,eax |
203 | cld |
203 | cld |
204 | rep stosd |
204 | rep stosd |
205 | pop eax |
205 | pop eax |
206 | ret |
206 | ret |
207 | 207 | ||
208 | end_get_cache: |
208 | end_get_cache: |
209 | ; mov [cache_ide0_pointer],HD_CACHE |
209 | ; mov [cache_ide0_pointer],HD_CACHE |
210 | ; mov [cache_ide0_system_data],HD_CACHE+65536 |
210 | ; mov [cache_ide0_system_data],HD_CACHE+65536 |
211 | ; mov [cache_ide0_system_sad_size],1919 |
211 | ; mov [cache_ide0_system_sad_size],1919 |
212 | popa |
212 | popa |