Subversion Repositories Kolibri OS

Rev

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

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