Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
580 mario79 1
;**************************************************************************
2
;
3
;   [cache_ide[X]_pointer]
4
;   or [cache_ide[X]_data_pointer]  first entry in cache list
5
;
6
;            +0   - lba sector
7
;            +4   - state of cache sector
8
;                   0 = empty
9
;                   1 = used for read  ( same as in hd )
10
;                   2 = used for write ( differs from hd )
11
;
12
;  [cache_ide[X]_system_data]
13
;  or [cache_ide[x]_appl_data] - cache entries
14
;
15
;**************************************************************************
16
align 4
17
write_cache:
18
;-----------------------------------------------------------
19
; write all changed sectors to disk
20
;-----------------------------------------------------------
21
    push  eax ecx edx esi edi
22
 
23
    ; write difference ( 2 ) from cache to hd
24
 
25
;    mov   ecx,cache_max
26
;    mov   esi,HD_CACHE+8
27
    call  calculate_cache
28
    add   esi,8
29
 
30
    mov   edi,1
31
 
32
  write_cache_more:
33
 
34
    cmp   dword [esi+4],2       ; if cache slot is not different
35
    jne   .write_chain
36
 
37
    mov   dword [esi+4],1       ; same as in hd
38
    mov   eax,[esi]             ; eax = sector to write
39
 
40
    cmp   eax,[PARTITION_START]
41
    jb    danger
42
    cmp   eax,[PARTITION_END]
43
    ja    danger
44
 
45
; DMA write is permitted only if [allow_dma_access]=1
46
        cmp     [allow_dma_access], 2
47
        jae     .nodma
48
        cmp     [dma_hdd], 1
49
        jnz     .nodma
50
; Объединяем запись цепочки последовательных секторов в одно обращение к диску
51
        cmp     ecx, 1
52
        jz      .nonext
53
        cmp     dword [esi+8+4], 2
54
        jnz     .nonext
55
        push    eax
56
        inc     eax
57
        cmp     eax, [esi+8]
58
        pop     eax
59
        jnz     .nonext
60
        cmp     [cache_chain_started], 1
61
        jz      @f
62
        mov     [cache_chain_started], 1
63
        mov     [cache_chain_size], 0
64
        mov     [cache_chain_pos], edi
65
        mov     [cache_chain_ptr], esi
66
@@:
67
        inc     [cache_chain_size]
68
        cmp     [cache_chain_size], 64
69
        jnz     .continue
70
        jmp     .write_chain
71
.nonext:
72
        call    flush_cache_chain
73
        mov     [cache_chain_size], 1
74
        mov     [cache_chain_ptr], esi
75
        call    write_cache_sector
76
        jmp     .continue
77
.nodma:
78
        call    cache_write_pio
79
.write_chain:
80
        call    flush_cache_chain
81
 
82
.continue:
83
  danger:
84
 
85
    add   esi,8
86
    inc   edi
87
    dec   ecx
88
    jnz   write_cache_more
89
        call    flush_cache_chain
90
 return_02:
91
    pop   edi esi edx ecx eax
92
    ret
93
 
94
flush_cache_chain:
95
        cmp     [cache_chain_started], 0
96
        jz      @f
97
        call    write_cache_chain
98
        mov     [cache_chain_started], 0
99
@@:
100
        ret
101
 
102
 
103
align 4
104
find_empty_slot:
105
;-----------------------------------------------------------
106
; find empty or read slot, flush cache if next 10% is used by write
107
; output : edi = cache slot
108
;-----------------------------------------------------------
109
;    push  ecx esi
110
 
111
  search_again:
112
 
113
;    mov   ecx,cache_max*10/100
114
;    mov   edi,[cache_search_start]
115
    call  calculate_cache_3
116
;    push  eax edx
117
;    mov   eax,ecx
118
;    mov   ecx,10
119
;    xor   edx,edx
120
;    div  ecx
121
;    mov   ecx,eax
122
;    pop   edx eax
123
    shr   ecx,3
124
  search_for_empty:
125
 
126
    inc   edi
127
;    cmp   edi,cache_max
128
;    push   eax
129
    call  calculate_cache_4
130
;    cmp   edi,eax
131
;    pop   eax
132
    jbe   inside_cache
133
    mov   edi,1
134
 
135
  inside_cache:
136
 
137
;    cmp   dword [edi*8+HD_CACHE+4],2    ; get cache slot info
138
    push   esi
139
    call  calculate_cache_1
140
    cmp   dword [edi*8+esi+4],2
141
    pop   esi
142
    jb    found_slot                    ; it's empty or read
143
    dec   ecx
144
    jnz   search_for_empty
145
 
146
    call  write_cache                   ; no empty slots found, write all
147
    cmp   [hd_error],0
148
    jne   found_slot_access_denied
149
 
150
    jmp   search_again                  ; and start again
151
 
152
  found_slot:
153
 
154
;    mov   [cache_search_start],edi
155
    call  calculate_cache_5
156
  found_slot_access_denied:
157
    ret
158
 
159
align 4
160
clear_hd_cache:
161
;    push  eax ecx edi
162
;    mov   edi, HD_CACHE
163
;    mov   ecx,16384
164
;    xor   eax,eax
165
;    cld
166
;    rep   stosd                 ; clear hd cache with 0
167
;    mov   [cache_search_start],eax
168
    mov   [fat_in_cache],-1
169
    mov   [fat_change],0
170
;    pop   edi ecx eax
171
    ret
172
 
173
;--------------------------------------------------------------------
174
align 4
175
calculate_cache:
176
;    mov   ecx,cache_max         ; entries in cache
177
;    mov   esi,HD_CACHE+8
178
 
179
; 1 - IDE0 ... 4 - IDE3
180
.ide0:
181
    cmp    [hdpos],1
182
    jne    .ide1
183
    cmp    [hdd_appl_data],0
184
    jne    .ide0_appl_data
185
    mov    ecx,[cache_ide0_system_sad_size]
186
    mov    esi,[cache_ide0_pointer]
187
    ret
188
.ide0_appl_data:
189
    mov    ecx,[cache_ide0_appl_sad_size]
190
    mov    esi,[cache_ide0_data_pointer]
191
    ret
192
.ide1:
193
    cmp    [hdpos],2
194
    jne    .ide2
195
    cmp    [hdd_appl_data],0
196
    jne    .ide1_appl_data
197
    mov    ecx,[cache_ide1_system_sad_size]
198
    mov    esi,[cache_ide1_pointer]
199
    ret
200
.ide1_appl_data:
201
    mov    ecx,[cache_ide1_appl_sad_size]
202
    mov    esi,[cache_ide1_data_pointer]
203
    ret
204
.ide2:
205
    cmp    [hdpos],3
206
    jne    .ide3
207
    cmp    [hdd_appl_data],0
208
    jne    .ide2_appl_data
209
    mov    ecx,[cache_ide2_system_sad_size]
210
    mov    esi,[cache_ide2_pointer]
211
    ret
212
.ide2_appl_data:
213
    mov    ecx,[cache_ide2_appl_sad_size]
214
    mov    esi,[cache_ide2_data_pointer]
215
    ret
216
.ide3:
217
    cmp    [hdd_appl_data],0
218
    jne    .ide3_appl_data
219
    mov    ecx,[cache_ide3_system_sad_size]
220
    mov    esi,[cache_ide3_pointer]
221
    ret
222
.ide3_appl_data:
223
    mov    ecx,[cache_ide3_appl_sad_size]
224
    mov    esi,[cache_ide3_data_pointer]
225
    ret
226
;--------------------------------------------------------------------
227
align 4
228
calculate_cache_1:
229
;    lea   esi,[edi*8+HD_CACHE]
230
; 1 - IDE0 ... 4 - IDE3
231
.ide0:
232
    cmp    [hdpos],1
233
    jne    .ide1
234
    cmp    [hdd_appl_data],0
235
    jne    .ide0_appl_data
236
    mov    esi,[cache_ide0_pointer]
237
    ret
238
.ide0_appl_data:
239
    mov    esi,[cache_ide0_data_pointer]
240
    ret
241
.ide1:
242
    cmp    [hdpos],2
243
    jne    .ide2
244
    cmp    [hdd_appl_data],0
245
    jne    .ide1_appl_data
246
    mov    esi,[cache_ide1_pointer]
247
    ret
248
.ide1_appl_data:
249
    mov    esi,[cache_ide1_data_pointer]
250
    ret
251
.ide2:
252
    cmp    [hdpos],3
253
    jne    .ide3
254
    cmp    [hdd_appl_data],0
255
    jne    .ide2_appl_data
256
    mov    esi,[cache_ide2_pointer]
257
    ret
258
.ide2_appl_data:
259
    mov    esi,[cache_ide2_data_pointer]
260
    ret
261
.ide3:
262
    cmp    [hdd_appl_data],0
263
    jne    .ide3_appl_data
264
    mov    esi,[cache_ide3_pointer]
265
    ret
266
.ide3_appl_data:
267
    mov    esi,[cache_ide3_data_pointer]
268
    ret
269
;--------------------------------------------------------------------
270
align 4
271
calculate_cache_2:
272
;    add   esi,HD_CACHE+65536
273
; 1 - IDE0 ... 4 - IDE3
274
.ide0:
275
    cmp    [hdpos],1
276
    jne    .ide1
277
    cmp    [hdd_appl_data],0
278
    jne    .ide0_appl_data
279
    mov    eax,[cache_ide0_system_data]
280
    ret
281
.ide0_appl_data:
282
    mov    eax,[cache_ide0_appl_data]
283
    ret
284
.ide1:
285
    cmp    [hdpos],2
286
    jne    .ide2
287
    cmp    [hdd_appl_data],0
288
    jne    .ide1_appl_data
289
    mov    eax,[cache_ide1_system_data]
290
    ret
291
.ide1_appl_data:
292
    mov    eax,[cache_ide1_appl_data]
293
    ret
294
.ide2:
295
    cmp    [hdpos],3
296
    jne    .ide3
297
    cmp    [hdd_appl_data],0
298
    jne    .ide2_appl_data
299
    mov    eax,[cache_ide2_system_data]
300
    ret
301
.ide2_appl_data:
302
    mov    eax,[cache_ide2_appl_data]
303
    ret
304
.ide3:
305
    cmp    [hdd_appl_data],0
306
    jne    .ide3_appl_data
307
    mov    eax,[cache_ide3_system_data]
308
    ret
309
.ide3_appl_data:
310
    mov    eax,[cache_ide3_appl_data]
311
    ret
312
;--------------------------------------------------------------------
313
align 4
314
calculate_cache_3:
315
;    mov   ecx,cache_max*10/100
316
;    mov   edi,[cache_search_start]
317
 
318
; 1 - IDE0 ... 4 - IDE3
319
.ide0:
320
    cmp    [hdpos],1
321
    jne    .ide1
322
    cmp    [hdd_appl_data],0
323
    jne    .ide0_appl_data
324
    mov    ecx,[cache_ide0_system_sad_size]
325
    mov    edi,[cache_ide0_search_start]
326
    ret
327
.ide0_appl_data:
328
    mov    ecx,[cache_ide0_appl_sad_size]
329
    mov    edi,[cache_ide0_appl_search_start]
330
    ret
331
.ide1:
332
    cmp    [hdpos],2
333
    jne    .ide2
334
    cmp    [hdd_appl_data],0
335
    jne    .ide1_appl_data
336
    mov    ecx,[cache_ide1_system_sad_size]
337
    mov    edi,[cache_ide1_search_start]
338
    ret
339
.ide1_appl_data:
340
    mov    ecx,[cache_ide1_appl_sad_size]
341
    mov    edi,[cache_ide1_appl_search_start]
342
    ret
343
.ide2:
344
    cmp    [hdpos],3
345
    jne    .ide3
346
    cmp    [hdd_appl_data],0
347
    jne    .ide2_appl_data
348
    mov    ecx,[cache_ide2_system_sad_size]
349
    mov    edi,[cache_ide2_search_start]
350
    ret
351
.ide2_appl_data:
352
    mov    ecx,[cache_ide2_appl_sad_size]
353
    mov    edi,[cache_ide2_appl_search_start]
354
    ret
355
.ide3:
356
    cmp    [hdd_appl_data],0
357
    jne    .ide3_appl_data
358
    mov    ecx,[cache_ide3_system_sad_size]
359
    mov    edi,[cache_ide3_search_start]
360
    ret
361
.ide3_appl_data:
362
    mov    ecx,[cache_ide3_appl_sad_size]
363
    mov    edi,[cache_ide3_appl_search_start]
364
    ret
365
;--------------------------------------------------------------------
366
align 4
367
calculate_cache_4:
368
;    cmp   edi,cache_max
369
; 1 - IDE0 ... 4 - IDE3
370
.ide0:
371
    cmp    [hdpos],1
372
    jne    .ide1
373
    cmp    [hdd_appl_data],0
374
    jne    .ide0_appl_data
375
    cmp   edi,[cache_ide0_system_sad_size]
376
    ret
377
.ide0_appl_data:
378
    cmp   edi,[cache_ide0_appl_sad_size]
379
    ret
380
.ide1:
381
    cmp    [hdpos],2
382
    jne    .ide2
383
    cmp    [hdd_appl_data],0
384
    jne    .ide1_appl_data
385
    cmp   edi,[cache_ide1_system_sad_size]
386
    ret
387
.ide1_appl_data:
388
    cmp   edi,[cache_ide1_appl_sad_size]
389
    ret
390
.ide2:
391
    cmp    [hdpos],3
392
    jne    .ide3
393
    cmp    [hdd_appl_data],0
394
    jne    .ide2_appl_data
395
    cmp   edi,[cache_ide2_system_sad_size]
396
    ret
397
.ide2_appl_data:
398
    cmp   edi,[cache_ide2_appl_sad_size]
399
    ret
400
.ide3:
401
    cmp    [hdd_appl_data],0
402
    jne    .ide3_appl_data
403
    cmp   edi,[cache_ide3_system_sad_size]
404
    ret
405
.ide3_appl_data:
406
    cmp   edi,[cache_ide3_appl_sad_size]
407
    ret
408
;--------------------------------------------------------------------
409
align 4
410
calculate_cache_5:
411
;    mov   [cache_search_start],edi
412
; 1 - IDE0 ... 4 - IDE3
413
.ide0:
414
    cmp    [hdpos],1
415
    jne    .ide1
416
    cmp    [hdd_appl_data],0
417
    jne    .ide0_appl_data
418
    mov   [cache_ide0_search_start],edi
419
    ret
420
.ide0_appl_data:
421
    mov   [cache_ide0_appl_search_start],edi
422
    ret
423
.ide1:
424
    cmp    [hdpos],2
425
    jne    .ide2
426
    cmp    [hdd_appl_data],0
427
    jne    .ide1_appl_data
428
    mov   [cache_ide1_search_start],edi
429
    ret
430
.ide1_appl_data:
431
    mov   [cache_ide1_appl_search_start],edi
432
    ret
433
.ide2:
434
    cmp    [hdpos],3
435
    jne    .ide3
436
    cmp    [hdd_appl_data],0
437
    jne    .ide2_appl_data
438
    mov   [cache_ide2_search_start],edi
439
    ret
440
.ide2_appl_data:
441
    mov   [cache_ide2_appl_search_start],edi
442
    ret
443
.ide3:
444
    cmp    [hdd_appl_data],0
445
    jne    .ide3_appl_data
446
    mov   [cache_ide3_search_start],edi
447
    ret
448
.ide3_appl_data:
449
    mov   [cache_ide3_appl_search_start],edi
450
    ret
451
;--------------------------------------------------------------------
452
align 4
453
calculate_linear_to_real:
454
    shr eax, 12
455
    mov eax, [page_tabs+eax*4]
456
    and eax, 0xFFFFF000
457
    ret