Subversion Repositories Kolibri OS

Rev

Rev 2288 | Rev 3712 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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