Subversion Repositories Kolibri OS

Rev

Rev 3539 | Rev 3742 | 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
;**************************************************************************
9
;
10
;   [cache_ide[X]_pointer]
11
;   or [cache_ide[X]_data_pointer]  first entry in cache list
12
;
13
;            +0   - lba sector
14
;            +4   - state of cache sector
15
;                   0 = empty
16
;                   1 = used for read  ( same as in hd )
17
;                   2 = used for write ( differs from hd )
18
;
19
;  [cache_ide[X]_system_data]
20
;  or [cache_ide[x]_appl_data] - cache entries
21
;
22
;**************************************************************************
23
 
24
$Revision: 3712 $
25
 
26
 
27
align 4
28
write_cache:
29
;-----------------------------------------------------------
30
; write all changed sectors to disk
31
;-----------------------------------------------------------
32
        push    eax ecx edx esi edi
33
 
34
    ; write difference ( 2 ) from cache to hd
35
        call    calculate_cache
36
        add     esi, 8
37
        mov     edi, 1
38
write_cache_more:
39
        cmp     dword [esi+4], 2; if cache slot is not different
40
        jne     .write_chain
41
        mov     dword [esi+4], 1; same as in hd
42
        mov     eax, [esi]      ; eax = sector to write
43
        cmp     eax, [PARTITION_START]
44
        jb      danger
45
        cmp     eax, [PARTITION_END]
46
        ja      danger
47
        cmp     [hdpos], 0x80
48
        jae     @f
49
; DMA write is permitted only if [allow_dma_access]=1
50
        cmp     [allow_dma_access], 2
51
        jae     .nodma
52
        cmp     [dma_hdd], 1
53
        jnz     .nodma
54
@@:
3539 clevermous 55
; Объединяем запись цепочки последовательных секторов в одно обращение к диску
2288 clevermous 56
        cmp     ecx, 1
57
        jz      .nonext
58
        cmp     dword [esi+8+4], 2
59
        jnz     .nonext
60
        push    eax
61
        inc     eax
62
        cmp     eax, [esi+8]
63
        pop     eax
64
        jnz     .nonext
65
        cmp     [cache_chain_started], 1
66
        jz      @f
67
        mov     [cache_chain_started], 1
68
        mov     [cache_chain_size], 0
69
        mov     [cache_chain_pos], edi
70
        mov     [cache_chain_ptr], esi
71
@@:
72
        inc     [cache_chain_size]
73
        cmp     [cache_chain_size], 16
74
        jnz     .continue
75
        jmp     .write_chain
76
.nonext:
77
        call    flush_cache_chain
78
        mov     [cache_chain_size], 1
79
        mov     [cache_chain_ptr], esi
80
        call    write_cache_sector
81
        jmp     .continue
82
.nodma:
83
        call    cache_write_pio
84
.write_chain:
85
        call    flush_cache_chain
86
.continue:
87
danger:
88
        add     esi, 8
89
        inc     edi
90
        dec     ecx
91
        jnz     write_cache_more
92
        call    flush_cache_chain
93
 return_02:
94
        pop     edi esi edx ecx eax
95
        ret
96
 
97
flush_cache_chain:
98
        cmp     [cache_chain_started], 0
99
        jz      @f
100
        call    write_cache_chain
101
        mov     [cache_chain_started], 0
102
@@:
103
        ret
104
;--------------------------------------------------------------------
105
align 4
106
find_empty_slot:
107
;-----------------------------------------------------------
108
; find empty or read slot, flush cache if next 10% is used by write
109
; output : edi = cache slot
110
;-----------------------------------------------------------
111
;    push  ecx esi
112
 
113
search_again:
114
        call    calculate_cache_3
115
        shr     ecx, 3
116
search_for_empty:
117
        inc     edi
118
        call    calculate_cache_4
119
        jbe     inside_cache
120
        mov     edi, 1
121
inside_cache:
122
        push    esi
123
        call    calculate_cache_1
124
        cmp     dword [edi*8+esi+4], 2
125
        pop     esi
126
        jb      found_slot              ; it's empty or read
127
        dec     ecx
128
        jnz     search_for_empty
129
        call    write_cache             ; no empty slots found, write all
130
        cmp     [hd_error], 0
131
        jne     found_slot_access_denied
132
        jmp     search_again            ; and start again
133
found_slot:
134
        call    calculate_cache_5
135
found_slot_access_denied:
136
        ret
137
;--------------------------------------------------------------------
138
align 4
139
calculate_cache:
140
; 1 - IDE0 ... 4 - IDE3
141
.ide0:
142
        cmp     [hdpos], 1
143
        jne     .ide1
144
        cmp     [hdd_appl_data], 0
145
        jne     .ide0_appl_data
146
        mov     ecx, [cache_ide0_system_sad_size]
147
        mov     esi, [cache_ide0_pointer]
148
        ret
149
.ide0_appl_data:
150
        mov     ecx, [cache_ide0_appl_sad_size]
151
        mov     esi, [cache_ide0_data_pointer]
152
        ret
153
.ide1:
154
        cmp     [hdpos], 2
155
        jne     .ide2
156
        cmp     [hdd_appl_data], 0
157
        jne     .ide1_appl_data
158
        mov     ecx, [cache_ide1_system_sad_size]
159
        mov     esi, [cache_ide1_pointer]
160
        ret
161
.ide1_appl_data:
162
        mov     ecx, [cache_ide1_appl_sad_size]
163
        mov     esi, [cache_ide1_data_pointer]
164
        ret
165
.ide2:
166
        cmp     [hdpos], 3
167
        jne     .ide3
168
        cmp     [hdd_appl_data], 0
169
        jne     .ide2_appl_data
170
        mov     ecx, [cache_ide2_system_sad_size]
171
        mov     esi, [cache_ide2_pointer]
172
        ret
173
.ide2_appl_data:
174
        mov     ecx, [cache_ide2_appl_sad_size]
175
        mov     esi, [cache_ide2_data_pointer]
176
        ret
177
.ide3:
178
        cmp     [hdpos], 4
179
        jne     .noide
180
        cmp     [hdd_appl_data], 0
181
        jne     .ide3_appl_data
182
        mov     ecx, [cache_ide3_system_sad_size]
183
        mov     esi, [cache_ide3_pointer]
184
        ret
185
.ide3_appl_data:
186
        mov     ecx, [cache_ide3_appl_sad_size]
187
        mov     esi, [cache_ide3_data_pointer]
188
        ret
189
.noide:
190
        push    eax
191
        mov     eax, [hdpos]
192
        sub     eax, 80h
193
        cmp     byte [BiosDisksData+eax*4+2], -1
194
        jz      @f
195
        movzx   eax, byte [BiosDisksData+eax*4+2]
196
        imul    eax, cache_ide1-cache_ide0
197
        add     eax, cache_ide0
198
        jmp     .get
199
@@:
200
        imul    eax, cache_ide1-cache_ide0
201
        add     eax, BiosDiskCaches
202
.get:
203
        cmp     [hdd_appl_data], 0
204
        jne     .bd_appl_data
205
        mov     ecx, [cache_ide0_system_sad_size-cache_ide0+eax]
206
        mov     esi, [cache_ide0_pointer-cache_ide0+eax]
207
        pop     eax
208
        ret
209
.bd_appl_data:
210
        mov     ecx, [cache_ide0_appl_sad_size-cache_ide0+eax]
211
        mov     esi, [cache_ide0_data_pointer-cache_ide0+eax]
212
        pop     eax
213
        ret
214
;--------------------------------------------------------------------
215
align 4
216
calculate_cache_1:
217
; 1 - IDE0 ... 4 - IDE3
218
.ide0:
219
        cmp     [hdpos], 1
220
        jne     .ide1
221
        cmp     [hdd_appl_data], 0
222
        jne     .ide0_appl_data
223
        mov     esi, [cache_ide0_pointer]
224
        ret
225
.ide0_appl_data:
226
        mov     esi, [cache_ide0_data_pointer]
227
        ret
228
.ide1:
229
        cmp     [hdpos], 2
230
        jne     .ide2
231
        cmp     [hdd_appl_data], 0
232
        jne     .ide1_appl_data
233
        mov     esi, [cache_ide1_pointer]
234
        ret
235
.ide1_appl_data:
236
        mov     esi, [cache_ide1_data_pointer]
237
        ret
238
.ide2:
239
        cmp     [hdpos], 3
240
        jne     .ide3
241
        cmp     [hdd_appl_data], 0
242
        jne     .ide2_appl_data
243
        mov     esi, [cache_ide2_pointer]
244
        ret
245
.ide2_appl_data:
246
        mov     esi, [cache_ide2_data_pointer]
247
        ret
248
.ide3:
249
        cmp     [hdpos], 4
250
        jne     .noide
251
        cmp     [hdd_appl_data], 0
252
        jne     .ide3_appl_data
253
        mov     esi, [cache_ide3_pointer]
254
        ret
255
.ide3_appl_data:
256
        mov     esi, [cache_ide3_data_pointer]
257
        ret
258
.noide:
259
        push    eax
260
        mov     eax, [hdpos]
261
        sub     eax, 80h
262
        cmp     byte [BiosDisksData+eax*4+2], -1
263
        jz      @f
264
        movzx   eax, byte [BiosDisksData+eax*4+2]
265
        imul    eax, cache_ide1-cache_ide0
266
        add     eax, cache_ide0
267
        jmp     .get
268
@@:
269
        imul    eax, cache_ide1-cache_ide0
270
        add     eax, BiosDiskCaches
271
.get:
272
        cmp     [hdd_appl_data], 0
273
        jne     .bd_appl_data
274
        mov     esi, [cache_ide0_pointer-cache_ide0+eax]
275
        pop     eax
276
        ret
277
.bd_appl_data:
278
        mov     esi, [cache_ide0_data_pointer-cache_ide0+eax]
279
        pop     eax
280
        ret
281
 
282
;--------------------------------------------------------------------
283
align 4
284
calculate_cache_2:
285
; 1 - IDE0 ... 4 - IDE3
286
.ide0:
287
        cmp     [hdpos], 1
288
        jne     .ide1
289
        cmp     [hdd_appl_data], 0
290
        jne     .ide0_appl_data
291
        mov     eax, [cache_ide0_system_data]
292
        ret
293
.ide0_appl_data:
294
        mov     eax, [cache_ide0_appl_data]
295
        ret
296
.ide1:
297
        cmp     [hdpos], 2
298
        jne     .ide2
299
        cmp     [hdd_appl_data], 0
300
        jne     .ide1_appl_data
301
        mov     eax, [cache_ide1_system_data]
302
        ret
303
.ide1_appl_data:
304
        mov     eax, [cache_ide1_appl_data]
305
        ret
306
.ide2:
307
        cmp     [hdpos], 3
308
        jne     .ide3
309
        cmp     [hdd_appl_data], 0
310
        jne     .ide2_appl_data
311
        mov     eax, [cache_ide2_system_data]
312
        ret
313
.ide2_appl_data:
314
        mov     eax, [cache_ide2_appl_data]
315
        ret
316
.ide3:
317
        cmp     [hdpos], 4
318
        jne     .noide
319
        cmp     [hdd_appl_data], 0
320
        jne     .ide3_appl_data
321
        mov     eax, [cache_ide3_system_data]
322
        ret
323
.ide3_appl_data:
324
        mov     eax, [cache_ide3_appl_data]
325
        ret
326
.noide:
327
        mov     eax, [hdpos]
328
        sub     eax, 80h
329
        cmp     byte [BiosDisksData+eax*4+2], -1
330
        jz      @f
331
        movzx   eax, byte [BiosDisksData+eax*4+2]
332
        imul    eax, cache_ide1-cache_ide0
333
        add     eax, cache_ide0
334
        jmp     .get
335
@@:
336
        imul    eax, cache_ide1-cache_ide0
337
        add     eax, BiosDiskCaches
338
.get:
339
        cmp     [hdd_appl_data], 0
340
        jne     .bd_appl_data
341
        mov     eax, [cache_ide0_system_data-cache_ide0+eax]
342
        ret
343
.bd_appl_data:
344
        mov     eax, [cache_ide0_appl_data-cache_ide0+eax]
345
        ret
346
;--------------------------------------------------------------------
347
align 4
348
calculate_cache_3:
349
;    mov   ecx,cache_max*10/100
350
;    mov   edi,[cache_search_start]
351
 
352
; 1 - IDE0 ... 4 - IDE3
353
.ide0:
354
        cmp     [hdpos], 1
355
        jne     .ide1
356
        cmp     [hdd_appl_data], 0
357
        jne     .ide0_appl_data
358
        mov     ecx, [cache_ide0_system_sad_size]
359
        mov     edi, [cache_ide0_search_start]
360
        ret
361
.ide0_appl_data:
362
        mov     ecx, [cache_ide0_appl_sad_size]
363
        mov     edi, [cache_ide0_appl_search_start]
364
        ret
365
.ide1:
366
        cmp     [hdpos], 2
367
        jne     .ide2
368
        cmp     [hdd_appl_data], 0
369
        jne     .ide1_appl_data
370
        mov     ecx, [cache_ide1_system_sad_size]
371
        mov     edi, [cache_ide1_search_start]
372
        ret
373
.ide1_appl_data:
374
        mov     ecx, [cache_ide1_appl_sad_size]
375
        mov     edi, [cache_ide1_appl_search_start]
376
        ret
377
.ide2:
378
        cmp     [hdpos], 3
379
        jne     .ide3
380
        cmp     [hdd_appl_data], 0
381
        jne     .ide2_appl_data
382
        mov     ecx, [cache_ide2_system_sad_size]
383
        mov     edi, [cache_ide2_search_start]
384
        ret
385
.ide2_appl_data:
386
        mov     ecx, [cache_ide2_appl_sad_size]
387
        mov     edi, [cache_ide2_appl_search_start]
388
        ret
389
.ide3:
390
        cmp     [hdpos], 4
391
        jne     .noide
392
        cmp     [hdd_appl_data], 0
393
        jne     .ide3_appl_data
394
        mov     ecx, [cache_ide3_system_sad_size]
395
        mov     edi, [cache_ide3_search_start]
396
        ret
397
.ide3_appl_data:
398
        mov     ecx, [cache_ide3_appl_sad_size]
399
        mov     edi, [cache_ide3_appl_search_start]
400
        ret
401
.noide:
402
        push    eax
403
        mov     eax, [hdpos]
404
        sub     eax, 80h
405
        cmp     byte [BiosDisksData+eax*4+2], -1
406
        jz      @f
407
        movzx   eax, byte [BiosDisksData+eax*4+2]
408
        imul    eax, cache_ide1-cache_ide0
409
        add     eax, cache_ide0
410
        jmp     .get
411
@@:
412
        imul    eax, cache_ide1-cache_ide0
413
        add     eax, BiosDiskCaches
414
.get:
415
        cmp     [hdd_appl_data], 0
416
        jne     .bd_appl_data
417
        mov     ecx, [cache_ide0_system_sad_size-cache_ide0+eax]
418
        mov     edi, [cache_ide0_search_start-cache_ide0+eax]
419
        pop     eax
420
        ret
421
.bd_appl_data:
422
        mov     ecx, [cache_ide0_appl_sad_size-cache_ide0+eax]
423
        mov     edi, [cache_ide0_appl_search_start-cache_ide0+eax]
424
        pop     eax
425
        ret
426
;--------------------------------------------------------------------
427
align 4
428
calculate_cache_4:
429
;    cmp   edi,cache_max
430
; 1 - IDE0 ... 4 - IDE3
431
.ide0:
432
        cmp     [hdpos], 1
433
        jne     .ide1
434
        cmp     [hdd_appl_data], 0
435
        jne     .ide0_appl_data
436
        cmp     edi, [cache_ide0_system_sad_size]
437
        ret
438
.ide0_appl_data:
439
        cmp     edi, [cache_ide0_appl_sad_size]
440
        ret
441
.ide1:
442
        cmp     [hdpos], 2
443
        jne     .ide2
444
        cmp     [hdd_appl_data], 0
445
        jne     .ide1_appl_data
446
        cmp     edi, [cache_ide1_system_sad_size]
447
        ret
448
.ide1_appl_data:
449
        cmp     edi, [cache_ide1_appl_sad_size]
450
        ret
451
.ide2:
452
        cmp     [hdpos], 3
453
        jne     .ide3
454
        cmp     [hdd_appl_data], 0
455
        jne     .ide2_appl_data
456
        cmp     edi, [cache_ide2_system_sad_size]
457
        ret
458
.ide2_appl_data:
459
        cmp     edi, [cache_ide2_appl_sad_size]
460
        ret
461
.ide3:
462
        cmp     [hdpos], 4
463
        jne     .noide
464
        cmp     [hdd_appl_data], 0
465
        jne     .ide3_appl_data
466
        cmp     edi, [cache_ide3_system_sad_size]
467
        ret
468
.ide3_appl_data:
469
        cmp     edi, [cache_ide3_appl_sad_size]
470
        ret
471
.noide:
472
        push    eax
473
        mov     eax, [hdpos]
474
        sub     eax, 80h
475
        cmp     byte [BiosDisksData+eax*4+2], -1
476
        jz      @f
477
        movzx   eax, byte [BiosDisksData+eax*4+2]
478
        imul    eax, cache_ide1-cache_ide0
479
        add     eax, cache_ide0
480
        jmp     .get
481
@@:
482
        imul    eax, cache_ide1-cache_ide0
483
        add     eax, BiosDiskCaches
484
.get:
485
        cmp     [hdd_appl_data], 0
486
        jne     .bd_appl_data
487
        cmp     edi, [cache_ide0_system_sad_size-cache_ide0+eax]
488
        pop     eax
489
        ret
490
.bd_appl_data:
491
        cmp     edi, [cache_ide0_appl_sad_size-cache_ide0+eax]
492
        pop     eax
493
        ret
494
 
495
;--------------------------------------------------------------------
496
align 4
497
calculate_cache_5:
498
;    mov   [cache_search_start],edi
499
; 1 - IDE0 ... 4 - IDE3
500
.ide0:
501
        cmp     [hdpos], 1
502
        jne     .ide1
503
        cmp     [hdd_appl_data], 0
504
        jne     .ide0_appl_data
505
        mov     [cache_ide0_search_start], edi
506
        ret
507
.ide0_appl_data:
508
        mov     [cache_ide0_appl_search_start], edi
509
        ret
510
.ide1:
511
        cmp     [hdpos], 2
512
        jne     .ide2
513
        cmp     [hdd_appl_data], 0
514
        jne     .ide1_appl_data
515
        mov     [cache_ide1_search_start], edi
516
        ret
517
.ide1_appl_data:
518
        mov     [cache_ide1_appl_search_start], edi
519
        ret
520
.ide2:
521
        cmp     [hdpos], 3
522
        jne     .ide3
523
        cmp     [hdd_appl_data], 0
524
        jne     .ide2_appl_data
525
        mov     [cache_ide2_search_start], edi
526
        ret
527
.ide2_appl_data:
528
        mov     [cache_ide2_appl_search_start], edi
529
        ret
530
.ide3:
531
        cmp     [hdpos], 4
532
        jne     .noide
533
        cmp     [hdd_appl_data], 0
534
        jne     .ide3_appl_data
535
        mov     [cache_ide3_search_start], edi
536
        ret
537
.ide3_appl_data:
538
        mov     [cache_ide3_appl_search_start], edi
539
        ret
540
.noide:
541
        push    eax
542
        mov     eax, [hdpos]
543
        sub     eax, 80h
544
        cmp     byte [BiosDisksData+eax*4+2], -1
545
        jz      @f
546
        movzx   eax, byte [BiosDisksData+eax*4+2]
547
        imul    eax, cache_ide1-cache_ide0
548
        add     eax, cache_ide0
549
        jmp     .get
550
@@:
551
        imul    eax, cache_ide1-cache_ide0
552
        add     eax, BiosDiskCaches
553
.get:
554
        cmp     [hdd_appl_data], 0
555
        jne     .bd_appl_data
556
        mov     [cache_ide0_search_start-cache_ide0+eax], edi
557
        pop     eax
558
        ret
559
.bd_appl_data:
560
        mov     [cache_ide0_appl_search_start-cache_ide0+eax], edi
561
        pop     eax
562
        ret
563
 
564
;--------------------------------------------------------------------
565
align 4
566
find_empty_slot_CD_cache:
567
;-----------------------------------------------------------
568
; find empty or read slot, flush cache if next 10% is used by write
569
; output : edi = cache slot
570
;-----------------------------------------------------------
571
.search_again:
572
        call    cd_calculate_cache_3
573
.search_for_empty:
574
        inc     edi
575
        call    cd_calculate_cache_4
576
        jbe     .inside_cache
577
        mov     edi, 1
578
.inside_cache:
579
        call    cd_calculate_cache_5
580
        ret
581
;--------------------------------------------------------------------
582
clear_CD_cache:
583
        pusha
584
.ide0:
585
        xor     eax, eax
586
        cmp     [cdpos], 1
587
        jne     .ide1
588
        mov     [cache_ide0_search_start], eax
589
        mov     ecx, [cache_ide0_system_sad_size]
590
        mov     edi, [cache_ide0_pointer]
591
        call    .clear
592
        mov     [cache_ide0_appl_search_start], eax
593
        mov     ecx, [cache_ide0_appl_sad_size]
594
        mov     edi, [cache_ide0_data_pointer]
595
        jmp     .continue
596
.ide1:
597
        cmp     [cdpos], 2
598
        jne     .ide2
599
        mov     [cache_ide1_search_start], eax
600
        mov     ecx, [cache_ide1_system_sad_size]
601
        mov     edi, [cache_ide1_pointer]
602
        call    .clear
603
        mov     [cache_ide1_appl_search_start], eax
604
        mov     ecx, [cache_ide1_appl_sad_size]
605
        mov     edi, [cache_ide1_data_pointer]
606
        jmp     .continue
607
.ide2:
608
        cmp     [cdpos], 3
609
        jne     .ide3
610
        mov     [cache_ide2_search_start], eax
611
        mov     ecx, [cache_ide2_system_sad_size]
612
        mov     edi, [cache_ide2_pointer]
613
        call    .clear
614
        mov     [cache_ide2_appl_search_start], eax
615
        mov     ecx, [cache_ide2_appl_sad_size]
616
        mov     edi, [cache_ide2_data_pointer]
617
        jmp     .continue
618
.ide3:
619
        mov     [cache_ide3_search_start], eax
620
        mov     ecx, [cache_ide3_system_sad_size]
621
        mov     edi, [cache_ide3_pointer]
622
        call    .clear
623
        mov     [cache_ide3_appl_search_start], eax
624
        mov     ecx, [cache_ide3_appl_sad_size]
625
        mov     edi, [cache_ide3_data_pointer]
626
.continue:
627
        call    .clear
628
        popa
629
        ret
630
.clear:
631
        shl     ecx, 1
632
        cld
633
        rep stosd
634
        ret
635
;--------------------------------------------------------------------
636
align 4
637
cd_calculate_cache:
638
; 1 - IDE0 ... 4 - IDE3
639
.ide0:
640
        cmp     [cdpos], 1
641
        jne     .ide1
642
        cmp     [cd_appl_data], 0
643
        jne     .ide0_appl_data
644
        mov     ecx, [cache_ide0_system_sad_size]
645
        mov     esi, [cache_ide0_pointer]
646
        ret
647
.ide0_appl_data:
648
        mov     ecx, [cache_ide0_appl_sad_size]
649
        mov     esi, [cache_ide0_data_pointer]
650
        ret
651
.ide1:
652
        cmp     [cdpos], 2
653
        jne     .ide2
654
        cmp     [cd_appl_data], 0
655
        jne     .ide1_appl_data
656
        mov     ecx, [cache_ide1_system_sad_size]
657
        mov     esi, [cache_ide1_pointer]
658
        ret
659
.ide1_appl_data:
660
        mov     ecx, [cache_ide1_appl_sad_size]
661
        mov     esi, [cache_ide1_data_pointer]
662
        ret
663
.ide2:
664
        cmp     [cdpos], 3
665
        jne     .ide3
666
        cmp     [cd_appl_data], 0
667
        jne     .ide2_appl_data
668
        mov     ecx, [cache_ide2_system_sad_size]
669
        mov     esi, [cache_ide2_pointer]
670
        ret
671
.ide2_appl_data:
672
        mov     ecx, [cache_ide2_appl_sad_size]
673
        mov     esi, [cache_ide2_data_pointer]
674
        ret
675
.ide3:
676
        cmp     [cd_appl_data], 0
677
        jne     .ide3_appl_data
678
        mov     ecx, [cache_ide3_system_sad_size]
679
        mov     esi, [cache_ide3_pointer]
680
        ret
681
.ide3_appl_data:
682
        mov     ecx, [cache_ide3_appl_sad_size]
683
        mov     esi, [cache_ide3_data_pointer]
684
        ret
685
;--------------------------------------------------------------------
686
align 4
687
cd_calculate_cache_1:
688
; 1 - IDE0 ... 4 - IDE3
689
.ide0:
690
        cmp     [cdpos], 1
691
        jne     .ide1
692
        cmp     [cd_appl_data], 0
693
        jne     .ide0_appl_data
694
        mov     esi, [cache_ide0_pointer]
695
        ret
696
.ide0_appl_data:
697
        mov     esi, [cache_ide0_data_pointer]
698
        ret
699
.ide1:
700
        cmp     [cdpos], 2
701
        jne     .ide2
702
        cmp     [cd_appl_data], 0
703
        jne     .ide1_appl_data
704
        mov     esi, [cache_ide1_pointer]
705
        ret
706
.ide1_appl_data:
707
        mov     esi, [cache_ide1_data_pointer]
708
        ret
709
.ide2:
710
        cmp     [cdpos], 3
711
        jne     .ide3
712
        cmp     [cd_appl_data], 0
713
        jne     .ide2_appl_data
714
        mov     esi, [cache_ide2_pointer]
715
        ret
716
.ide2_appl_data:
717
        mov     esi, [cache_ide2_data_pointer]
718
        ret
719
.ide3:
720
        cmp     [cd_appl_data], 0
721
        jne     .ide3_appl_data
722
        mov     esi, [cache_ide3_pointer]
723
        ret
724
.ide3_appl_data:
725
        mov     esi, [cache_ide3_data_pointer]
726
        ret
727
;--------------------------------------------------------------------
728
align 4
729
cd_calculate_cache_2:
730
; 1 - IDE0 ... 4 - IDE3
731
.ide0:
732
        cmp     [cdpos], 1
733
        jne     .ide1
734
        cmp     [cd_appl_data], 0
735
        jne     .ide0_appl_data
736
        mov     eax, [cache_ide0_system_data]
737
        ret
738
.ide0_appl_data:
739
        mov     eax, [cache_ide0_appl_data]
740
        ret
741
.ide1:
742
        cmp     [cdpos], 2
743
        jne     .ide2
744
        cmp     [cd_appl_data], 0
745
        jne     .ide1_appl_data
746
        mov     eax, [cache_ide1_system_data]
747
        ret
748
.ide1_appl_data:
749
        mov     eax, [cache_ide1_appl_data]
750
        ret
751
.ide2:
752
        cmp     [cdpos], 3
753
        jne     .ide3
754
        cmp     [cd_appl_data], 0
755
        jne     .ide2_appl_data
756
        mov     eax, [cache_ide2_system_data]
757
        ret
758
.ide2_appl_data:
759
        mov     eax, [cache_ide2_appl_data]
760
        ret
761
.ide3:
762
        cmp     [cd_appl_data], 0
763
        jne     .ide3_appl_data
764
        mov     eax, [cache_ide3_system_data]
765
        ret
766
.ide3_appl_data:
767
        mov     eax, [cache_ide3_appl_data]
768
        ret
769
;--------------------------------------------------------------------
770
align 4
771
cd_calculate_cache_3:
772
;    mov   ecx,cache_max*10/100
773
;    mov   edi,[cache_search_start]
774
 
775
; 1 - IDE0 ... 4 - IDE3
776
.ide0:
777
        cmp     [cdpos], 1
778
        jne     .ide1
779
        cmp     [cd_appl_data], 0
780
        jne     .ide0_appl_data
781
        mov     edi, [cache_ide0_search_start]
782
        ret
783
.ide0_appl_data:
784
        mov     edi, [cache_ide0_appl_search_start]
785
        ret
786
.ide1:
787
        cmp     [cdpos], 2
788
        jne     .ide2
789
        cmp     [cd_appl_data], 0
790
        jne     .ide1_appl_data
791
        mov     edi, [cache_ide1_search_start]
792
        ret
793
.ide1_appl_data:
794
        mov     edi, [cache_ide1_appl_search_start]
795
        ret
796
.ide2:
797
        cmp     [cdpos], 3
798
        jne     .ide3
799
        cmp     [cd_appl_data], 0
800
        jne     .ide2_appl_data
801
        mov     edi, [cache_ide2_search_start]
802
        ret
803
.ide2_appl_data:
804
        mov     edi, [cache_ide2_appl_search_start]
805
        ret
806
.ide3:
807
        cmp     [cd_appl_data], 0
808
        jne     .ide3_appl_data
809
        mov     edi, [cache_ide3_search_start]
810
        ret
811
.ide3_appl_data:
812
        mov     edi, [cache_ide3_appl_search_start]
813
        ret
814
;--------------------------------------------------------------------
815
align 4
816
cd_calculate_cache_4:
817
;    cmp   edi,cache_max
818
; 1 - IDE0 ... 4 - IDE3
819
.ide0:
820
        cmp     [cdpos], 1
821
        jne     .ide1
822
        cmp     [cd_appl_data], 0
823
        jne     .ide0_appl_data
824
        cmp     edi, [cache_ide0_system_sad_size]
825
        ret
826
.ide0_appl_data:
827
        cmp     edi, [cache_ide0_appl_sad_size]
828
        ret
829
.ide1:
830
        cmp     [cdpos], 2
831
        jne     .ide2
832
        cmp     [cd_appl_data], 0
833
        jne     .ide1_appl_data
834
        cmp     edi, [cache_ide1_system_sad_size]
835
        ret
836
.ide1_appl_data:
837
        cmp     edi, [cache_ide1_appl_sad_size]
838
        ret
839
.ide2:
840
        cmp     [cdpos], 3
841
        jne     .ide3
842
        cmp     [cd_appl_data], 0
843
        jne     .ide2_appl_data
844
        cmp     edi, [cache_ide2_system_sad_size]
845
        ret
846
.ide2_appl_data:
847
        cmp     edi, [cache_ide2_appl_sad_size]
848
        ret
849
.ide3:
850
        cmp     [cd_appl_data], 0
851
        jne     .ide3_appl_data
852
        cmp     edi, [cache_ide3_system_sad_size]
853
        ret
854
.ide3_appl_data:
855
        cmp     edi, [cache_ide3_appl_sad_size]
856
        ret
857
;--------------------------------------------------------------------
858
align 4
859
cd_calculate_cache_5:
860
;    mov   [cache_search_start],edi
861
; 1 - IDE0 ... 4 - IDE3
862
.ide0:
863
        cmp     [cdpos], 1
864
        jne     .ide1
865
        cmp     [cd_appl_data], 0
866
        jne     .ide0_appl_data
867
        mov     [cache_ide0_search_start], edi
868
        ret
869
.ide0_appl_data:
870
        mov     [cache_ide0_appl_search_start], edi
871
        ret
872
.ide1:
873
        cmp     [cdpos], 2
874
        jne     .ide2
875
        cmp     [cd_appl_data], 0
876
        jne     .ide1_appl_data
877
        mov     [cache_ide1_search_start], edi
878
        ret
879
.ide1_appl_data:
880
        mov     [cache_ide1_appl_search_start], edi
881
        ret
882
.ide2:
883
        cmp     [cdpos], 3
884
        jne     .ide3
885
        cmp     [cd_appl_data], 0
886
        jne     .ide2_appl_data
887
        mov     [cache_ide2_search_start], edi
888
        ret
889
.ide2_appl_data:
890
        mov     [cache_ide2_appl_search_start], edi
891
        ret
892
.ide3:
893
        cmp     [cd_appl_data], 0
894
        jne     .ide3_appl_data
895
        mov     [cache_ide3_search_start], edi
896
        ret
897
.ide3_appl_data:
898
        mov     [cache_ide3_appl_search_start], edi
899
        ret
900
;--------------------------------------------------------------------
901
;align 4
902
;calculate_linear_to_real:
903
;    shr eax, 12
904
;    mov eax, [page_tabs+eax*4]
905
;    and eax, 0xFFFFF000
906
;    ret