Subversion Repositories Kolibri OS

Rev

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