Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
750 victor 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
2465 Serge 3
;; Copyright (C) KolibriOS team 2004-2011. All rights reserved. ;;
750 victor 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: 2465 $
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
2434 Serge 36
        add     esi, 8
37
        mov     edi, 1
585 mario79 38
write_cache_more:
2434 Serge 39
        cmp     dword [esi+4], 2; if cache slot is not different
580 mario79 40
    jne   .write_chain
2434 Serge 41
        mov     dword [esi+4], 1; same as in hd
42
        mov     eax, [esi]      ; eax = sector to write
43
        cmp     eax, [PARTITION_START]
585 mario79 44
    jb	  danger
2434 Serge 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:
2434 Serge 88
        add     esi, 8
580 mario79 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
2434 Serge 115
        shr     ecx, 3
585 mario79 116
search_for_empty:
580 mario79 117
    inc   edi
118
    call  calculate_cache_4
119
    jbe   inside_cache
2434 Serge 120
        mov     edi, 1
585 mario79 121
inside_cache:
580 mario79 122
    push   esi
123
    call  calculate_cache_1
2434 Serge 124
        cmp     dword [edi*8+esi+4], 2
580 mario79 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
2434 Serge 130
        cmp     [hd_error], 0
580 mario79 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:
2434 Serge 140
        mov     [fat_in_cache], -1
141
        mov     [fat_change], 0
580 mario79 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:
2434 Serge 151
        cmp     [hdpos], 1
580 mario79 152
    jne    .ide1
2434 Serge 153
        cmp     [hdd_appl_data], 0
580 mario79 154
    jne    .ide0_appl_data
2434 Serge 155
        mov     ecx, [cache_ide0_system_sad_size]
156
        mov     esi, [cache_ide0_pointer]
580 mario79 157
    ret
158
.ide0_appl_data:
2434 Serge 159
        mov     ecx, [cache_ide0_appl_sad_size]
160
        mov     esi, [cache_ide0_data_pointer]
580 mario79 161
    ret
162
.ide1:
2434 Serge 163
        cmp     [hdpos], 2
580 mario79 164
    jne    .ide2
2434 Serge 165
        cmp     [hdd_appl_data], 0
580 mario79 166
    jne    .ide1_appl_data
2434 Serge 167
        mov     ecx, [cache_ide1_system_sad_size]
168
        mov     esi, [cache_ide1_pointer]
580 mario79 169
    ret
170
.ide1_appl_data:
2434 Serge 171
        mov     ecx, [cache_ide1_appl_sad_size]
172
        mov     esi, [cache_ide1_data_pointer]
580 mario79 173
    ret
174
.ide2:
2434 Serge 175
        cmp     [hdpos], 3
580 mario79 176
    jne    .ide3
2434 Serge 177
        cmp     [hdd_appl_data], 0
580 mario79 178
    jne    .ide2_appl_data
2434 Serge 179
        mov     ecx, [cache_ide2_system_sad_size]
180
        mov     esi, [cache_ide2_pointer]
580 mario79 181
    ret
182
.ide2_appl_data:
2434 Serge 183
        mov     ecx, [cache_ide2_appl_sad_size]
184
        mov     esi, [cache_ide2_data_pointer]
580 mario79 185
    ret
186
.ide3:
2434 Serge 187
        cmp     [hdpos], 4
709 diamond 188
    jne    .noide
2434 Serge 189
        cmp     [hdd_appl_data], 0
580 mario79 190
    jne    .ide3_appl_data
2434 Serge 191
        mov     ecx, [cache_ide3_system_sad_size]
192
        mov     esi, [cache_ide3_pointer]
580 mario79 193
    ret
194
.ide3_appl_data:
2434 Serge 195
        mov     ecx, [cache_ide3_appl_sad_size]
196
        mov     esi, [cache_ide3_data_pointer]
580 mario79 197
    ret
709 diamond 198
.noide:
199
    push   eax
2434 Serge 200
        mov     eax, [hdpos]
201
        sub     eax, 80h
709 diamond 202
    cmp    byte [BiosDisksData+eax*4+2], -1
203
    jz     @f
2434 Serge 204
        movzx   eax, byte [BiosDisksData+eax*4+2]
205
        imul    eax, cache_ide1-cache_ide0
206
        add     eax, cache_ide0
709 diamond 207
    jmp    .get
208
@@:
2434 Serge 209
        imul    eax, cache_ide1-cache_ide0
210
        add     eax, BiosDiskCaches
709 diamond 211
.get:
2434 Serge 212
        cmp     [hdd_appl_data], 0
709 diamond 213
    jne    .bd_appl_data
2434 Serge 214
        mov     ecx, [cache_ide0_system_sad_size-cache_ide0+eax]
215
        mov     esi, [cache_ide0_pointer-cache_ide0+eax]
709 diamond 216
    pop    eax
217
    ret
218
.bd_appl_data:
2434 Serge 219
        mov     ecx, [cache_ide0_appl_sad_size-cache_ide0+eax]
220
        mov     esi, [cache_ide0_data_pointer-cache_ide0+eax]
709 diamond 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:
2434 Serge 229
        cmp     [hdpos], 1
580 mario79 230
    jne    .ide1
2434 Serge 231
        cmp     [hdd_appl_data], 0
580 mario79 232
    jne    .ide0_appl_data
2434 Serge 233
        mov     esi, [cache_ide0_pointer]
580 mario79 234
    ret
235
.ide0_appl_data:
2434 Serge 236
        mov     esi, [cache_ide0_data_pointer]
580 mario79 237
    ret
238
.ide1:
2434 Serge 239
        cmp     [hdpos], 2
580 mario79 240
    jne    .ide2
2434 Serge 241
        cmp     [hdd_appl_data], 0
580 mario79 242
    jne    .ide1_appl_data
2434 Serge 243
        mov     esi, [cache_ide1_pointer]
580 mario79 244
    ret
245
.ide1_appl_data:
2434 Serge 246
        mov     esi, [cache_ide1_data_pointer]
580 mario79 247
    ret
248
.ide2:
2434 Serge 249
        cmp     [hdpos], 3
580 mario79 250
    jne    .ide3
2434 Serge 251
        cmp     [hdd_appl_data], 0
580 mario79 252
    jne    .ide2_appl_data
2434 Serge 253
        mov     esi, [cache_ide2_pointer]
580 mario79 254
    ret
255
.ide2_appl_data:
2434 Serge 256
        mov     esi, [cache_ide2_data_pointer]
580 mario79 257
    ret
258
.ide3:
2434 Serge 259
        cmp     [hdpos], 4
709 diamond 260
    jne    .noide
2434 Serge 261
        cmp     [hdd_appl_data], 0
580 mario79 262
    jne    .ide3_appl_data
2434 Serge 263
        mov     esi, [cache_ide3_pointer]
580 mario79 264
    ret
265
.ide3_appl_data:
2434 Serge 266
        mov     esi, [cache_ide3_data_pointer]
580 mario79 267
    ret
709 diamond 268
.noide:
269
    push   eax
2434 Serge 270
        mov     eax, [hdpos]
271
        sub     eax, 80h
709 diamond 272
    cmp    byte [BiosDisksData+eax*4+2], -1
273
    jz     @f
2434 Serge 274
        movzx   eax, byte [BiosDisksData+eax*4+2]
275
        imul    eax, cache_ide1-cache_ide0
276
        add     eax, cache_ide0
709 diamond 277
    jmp    .get
278
@@:
2434 Serge 279
        imul    eax, cache_ide1-cache_ide0
280
        add     eax, BiosDiskCaches
709 diamond 281
.get:
2434 Serge 282
        cmp     [hdd_appl_data], 0
709 diamond 283
    jne    .bd_appl_data
2434 Serge 284
        mov     esi, [cache_ide0_pointer-cache_ide0+eax]
709 diamond 285
    pop    eax
286
    ret
287
.bd_appl_data:
2434 Serge 288
        mov     esi, [cache_ide0_data_pointer-cache_ide0+eax]
709 diamond 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:
2434 Serge 298
        cmp     [hdpos], 1
580 mario79 299
    jne    .ide1
2434 Serge 300
        cmp     [hdd_appl_data], 0
580 mario79 301
    jne    .ide0_appl_data
2434 Serge 302
        mov     eax, [cache_ide0_system_data]
580 mario79 303
    ret
304
.ide0_appl_data:
2434 Serge 305
        mov     eax, [cache_ide0_appl_data]
580 mario79 306
    ret
307
.ide1:
2434 Serge 308
        cmp     [hdpos], 2
580 mario79 309
    jne    .ide2
2434 Serge 310
        cmp     [hdd_appl_data], 0
580 mario79 311
    jne    .ide1_appl_data
2434 Serge 312
        mov     eax, [cache_ide1_system_data]
580 mario79 313
    ret
314
.ide1_appl_data:
2434 Serge 315
        mov     eax, [cache_ide1_appl_data]
580 mario79 316
    ret
317
.ide2:
2434 Serge 318
        cmp     [hdpos], 3
580 mario79 319
    jne    .ide3
2434 Serge 320
        cmp     [hdd_appl_data], 0
580 mario79 321
    jne    .ide2_appl_data
2434 Serge 322
        mov     eax, [cache_ide2_system_data]
580 mario79 323
    ret
324
.ide2_appl_data:
2434 Serge 325
        mov     eax, [cache_ide2_appl_data]
580 mario79 326
    ret
327
.ide3:
2434 Serge 328
        cmp     [hdpos], 4
709 diamond 329
    jne    .noide
2434 Serge 330
        cmp     [hdd_appl_data], 0
580 mario79 331
    jne    .ide3_appl_data
2434 Serge 332
        mov     eax, [cache_ide3_system_data]
580 mario79 333
    ret
334
.ide3_appl_data:
2434 Serge 335
        mov     eax, [cache_ide3_appl_data]
580 mario79 336
    ret
709 diamond 337
.noide:
2434 Serge 338
        mov     eax, [hdpos]
339
        sub     eax, 80h
709 diamond 340
    cmp    byte [BiosDisksData+eax*4+2], -1
341
    jz     @f
2434 Serge 342
        movzx   eax, byte [BiosDisksData+eax*4+2]
343
        imul    eax, cache_ide1-cache_ide0
344
        add     eax, cache_ide0
709 diamond 345
    jmp    .get
346
@@:
2434 Serge 347
        imul    eax, cache_ide1-cache_ide0
348
        add     eax, BiosDiskCaches
709 diamond 349
.get:
2434 Serge 350
        cmp     [hdd_appl_data], 0
709 diamond 351
    jne    .bd_appl_data
2434 Serge 352
        mov     eax, [cache_ide0_system_data-cache_ide0+eax]
709 diamond 353
    ret
354
.bd_appl_data:
2434 Serge 355
        mov     eax, [cache_ide0_appl_data-cache_ide0+eax]
709 diamond 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:
2434 Serge 365
        cmp     [hdpos], 1
580 mario79 366
    jne    .ide1
2434 Serge 367
        cmp     [hdd_appl_data], 0
580 mario79 368
    jne    .ide0_appl_data
2434 Serge 369
        mov     ecx, [cache_ide0_system_sad_size]
370
        mov     edi, [cache_ide0_search_start]
580 mario79 371
    ret
372
.ide0_appl_data:
2434 Serge 373
        mov     ecx, [cache_ide0_appl_sad_size]
374
        mov     edi, [cache_ide0_appl_search_start]
580 mario79 375
    ret
376
.ide1:
2434 Serge 377
        cmp     [hdpos], 2
580 mario79 378
    jne    .ide2
2434 Serge 379
        cmp     [hdd_appl_data], 0
580 mario79 380
    jne    .ide1_appl_data
2434 Serge 381
        mov     ecx, [cache_ide1_system_sad_size]
382
        mov     edi, [cache_ide1_search_start]
580 mario79 383
    ret
384
.ide1_appl_data:
2434 Serge 385
        mov     ecx, [cache_ide1_appl_sad_size]
386
        mov     edi, [cache_ide1_appl_search_start]
580 mario79 387
    ret
388
.ide2:
2434 Serge 389
        cmp     [hdpos], 3
580 mario79 390
    jne    .ide3
2434 Serge 391
        cmp     [hdd_appl_data], 0
580 mario79 392
    jne    .ide2_appl_data
2434 Serge 393
        mov     ecx, [cache_ide2_system_sad_size]
394
        mov     edi, [cache_ide2_search_start]
580 mario79 395
    ret
396
.ide2_appl_data:
2434 Serge 397
        mov     ecx, [cache_ide2_appl_sad_size]
398
        mov     edi, [cache_ide2_appl_search_start]
580 mario79 399
    ret
400
.ide3:
2434 Serge 401
        cmp     [hdpos], 4
709 diamond 402
    jne    .noide
2434 Serge 403
        cmp     [hdd_appl_data], 0
580 mario79 404
    jne    .ide3_appl_data
2434 Serge 405
        mov     ecx, [cache_ide3_system_sad_size]
406
        mov     edi, [cache_ide3_search_start]
580 mario79 407
    ret
408
.ide3_appl_data:
2434 Serge 409
        mov     ecx, [cache_ide3_appl_sad_size]
410
        mov     edi, [cache_ide3_appl_search_start]
580 mario79 411
    ret
709 diamond 412
.noide:
413
    push   eax
2434 Serge 414
        mov     eax, [hdpos]
415
        sub     eax, 80h
709 diamond 416
    cmp    byte [BiosDisksData+eax*4+2], -1
417
    jz     @f
2434 Serge 418
        movzx   eax, byte [BiosDisksData+eax*4+2]
419
        imul    eax, cache_ide1-cache_ide0
420
        add     eax, cache_ide0
709 diamond 421
    jmp    .get
422
@@:
2434 Serge 423
        imul    eax, cache_ide1-cache_ide0
424
        add     eax, BiosDiskCaches
709 diamond 425
.get:
2434 Serge 426
        cmp     [hdd_appl_data], 0
709 diamond 427
    jne    .bd_appl_data
2434 Serge 428
        mov     ecx, [cache_ide0_system_sad_size-cache_ide0+eax]
429
        mov     edi, [cache_ide0_search_start-cache_ide0+eax]
709 diamond 430
    pop    eax
431
    ret
432
.bd_appl_data:
2434 Serge 433
        mov     ecx, [cache_ide0_appl_sad_size-cache_ide0+eax]
434
        mov     edi, [cache_ide0_appl_search_start-cache_ide0+eax]
709 diamond 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:
2434 Serge 443
        cmp     [hdpos], 1
580 mario79 444
    jne    .ide1
2434 Serge 445
        cmp     [hdd_appl_data], 0
580 mario79 446
    jne    .ide0_appl_data
2434 Serge 447
        cmp     edi, [cache_ide0_system_sad_size]
580 mario79 448
    ret
449
.ide0_appl_data:
2434 Serge 450
        cmp     edi, [cache_ide0_appl_sad_size]
580 mario79 451
    ret
452
.ide1:
2434 Serge 453
        cmp     [hdpos], 2
580 mario79 454
    jne    .ide2
2434 Serge 455
        cmp     [hdd_appl_data], 0
580 mario79 456
    jne    .ide1_appl_data
2434 Serge 457
        cmp     edi, [cache_ide1_system_sad_size]
580 mario79 458
    ret
459
.ide1_appl_data:
2434 Serge 460
        cmp     edi, [cache_ide1_appl_sad_size]
580 mario79 461
    ret
462
.ide2:
2434 Serge 463
        cmp     [hdpos], 3
580 mario79 464
    jne    .ide3
2434 Serge 465
        cmp     [hdd_appl_data], 0
580 mario79 466
    jne    .ide2_appl_data
2434 Serge 467
        cmp     edi, [cache_ide2_system_sad_size]
580 mario79 468
    ret
469
.ide2_appl_data:
2434 Serge 470
        cmp     edi, [cache_ide2_appl_sad_size]
580 mario79 471
    ret
472
.ide3:
2434 Serge 473
        cmp     [hdpos], 4
709 diamond 474
    jne    .noide
2434 Serge 475
        cmp     [hdd_appl_data], 0
580 mario79 476
    jne    .ide3_appl_data
2434 Serge 477
        cmp     edi, [cache_ide3_system_sad_size]
580 mario79 478
    ret
479
.ide3_appl_data:
2434 Serge 480
        cmp     edi, [cache_ide3_appl_sad_size]
580 mario79 481
    ret
709 diamond 482
.noide:
483
    push   eax
2434 Serge 484
        mov     eax, [hdpos]
485
        sub     eax, 80h
709 diamond 486
    cmp    byte [BiosDisksData+eax*4+2], -1
487
    jz     @f
2434 Serge 488
        movzx   eax, byte [BiosDisksData+eax*4+2]
489
        imul    eax, cache_ide1-cache_ide0
490
        add     eax, cache_ide0
709 diamond 491
    jmp    .get
492
@@:
2434 Serge 493
        imul    eax, cache_ide1-cache_ide0
494
        add     eax, BiosDiskCaches
709 diamond 495
.get:
2434 Serge 496
        cmp     [hdd_appl_data], 0
709 diamond 497
    jne    .bd_appl_data
2434 Serge 498
        cmp     edi, [cache_ide0_system_sad_size-cache_ide0+eax]
709 diamond 499
    pop    eax
500
    ret
501
.bd_appl_data:
2434 Serge 502
        cmp     edi, [cache_ide0_appl_sad_size-cache_ide0+eax]
709 diamond 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:
2434 Serge 512
        cmp     [hdpos], 1
580 mario79 513
    jne    .ide1
2434 Serge 514
        cmp     [hdd_appl_data], 0
580 mario79 515
    jne    .ide0_appl_data
2434 Serge 516
        mov     [cache_ide0_search_start], edi
580 mario79 517
    ret
518
.ide0_appl_data:
2434 Serge 519
        mov     [cache_ide0_appl_search_start], edi
580 mario79 520
    ret
521
.ide1:
2434 Serge 522
        cmp     [hdpos], 2
580 mario79 523
    jne    .ide2
2434 Serge 524
        cmp     [hdd_appl_data], 0
580 mario79 525
    jne    .ide1_appl_data
2434 Serge 526
        mov     [cache_ide1_search_start], edi
580 mario79 527
    ret
528
.ide1_appl_data:
2434 Serge 529
        mov     [cache_ide1_appl_search_start], edi
580 mario79 530
    ret
531
.ide2:
2434 Serge 532
        cmp     [hdpos], 3
580 mario79 533
    jne    .ide3
2434 Serge 534
        cmp     [hdd_appl_data], 0
580 mario79 535
    jne    .ide2_appl_data
2434 Serge 536
        mov     [cache_ide2_search_start], edi
580 mario79 537
    ret
538
.ide2_appl_data:
2434 Serge 539
        mov     [cache_ide2_appl_search_start], edi
580 mario79 540
    ret
541
.ide3:
2434 Serge 542
        cmp     [hdpos], 4
709 diamond 543
    jne    .noide
2434 Serge 544
        cmp     [hdd_appl_data], 0
580 mario79 545
    jne    .ide3_appl_data
2434 Serge 546
        mov     [cache_ide3_search_start], edi
580 mario79 547
    ret
548
.ide3_appl_data:
2434 Serge 549
        mov     [cache_ide3_appl_search_start], edi
580 mario79 550
    ret
709 diamond 551
.noide:
552
    push   eax
2434 Serge 553
        mov     eax, [hdpos]
554
        sub     eax, 80h
709 diamond 555
    cmp    byte [BiosDisksData+eax*4+2], -1
556
    jz     @f
2434 Serge 557
        movzx   eax, byte [BiosDisksData+eax*4+2]
558
        imul    eax, cache_ide1-cache_ide0
559
        add     eax, cache_ide0
709 diamond 560
    jmp    .get
561
@@:
2434 Serge 562
        imul    eax, cache_ide1-cache_ide0
563
        add     eax, BiosDiskCaches
709 diamond 564
.get:
2434 Serge 565
        cmp     [hdd_appl_data], 0
709 diamond 566
    jne    .bd_appl_data
2434 Serge 567
        mov     [cache_ide0_search_start-cache_ide0+eax], edi
709 diamond 568
    pop    eax
569
    ret
570
.bd_appl_data:
2434 Serge 571
        mov     [cache_ide0_appl_search_start-cache_ide0+eax], edi
709 diamond 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
2434 Serge 588
        mov     edi, 1
585 mario79 589
.inside_cache:
590
    call  cd_calculate_cache_5
580 mario79 591
    ret
585 mario79 592
;--------------------------------------------------------------------
593
clear_CD_cache:
594
    pusha
595
.ide0:
2434 Serge 596
        xor     eax, eax
597
        cmp     [cdpos], 1
585 mario79 598
    jne    .ide1
2434 Serge 599
        mov     [cache_ide0_search_start], eax
600
        mov     ecx, [cache_ide0_system_sad_size]
601
        mov     edi, [cache_ide0_pointer]
585 mario79 602
    call   .clear
2434 Serge 603
        mov     [cache_ide0_appl_search_start], eax
604
        mov     ecx, [cache_ide0_appl_sad_size]
605
        mov     edi, [cache_ide0_data_pointer]
585 mario79 606
    jmp    .continue
607
.ide1:
2434 Serge 608
        cmp     [cdpos], 2
585 mario79 609
    jne    .ide2
2434 Serge 610
        mov     [cache_ide1_search_start], eax
611
        mov     ecx, [cache_ide1_system_sad_size]
612
        mov     edi, [cache_ide1_pointer]
585 mario79 613
    call   .clear
2434 Serge 614
        mov     [cache_ide1_appl_search_start], eax
615
        mov     ecx, [cache_ide1_appl_sad_size]
616
        mov     edi, [cache_ide1_data_pointer]
585 mario79 617
    jmp    .continue
618
.ide2:
2434 Serge 619
        cmp     [cdpos], 3
585 mario79 620
    jne    .ide3
2434 Serge 621
        mov     [cache_ide2_search_start], eax
622
        mov     ecx, [cache_ide2_system_sad_size]
623
        mov     edi, [cache_ide2_pointer]
585 mario79 624
    call   .clear
2434 Serge 625
        mov     [cache_ide2_appl_search_start], eax
626
        mov     ecx, [cache_ide2_appl_sad_size]
627
        mov     edi, [cache_ide2_data_pointer]
585 mario79 628
    jmp    .continue
629
.ide3:
2434 Serge 630
        mov     [cache_ide3_search_start], eax
631
        mov     ecx, [cache_ide3_system_sad_size]
632
        mov     edi, [cache_ide3_pointer]
585 mario79 633
    call   .clear
2434 Serge 634
        mov     [cache_ide3_appl_search_start], eax
635
        mov     ecx, [cache_ide3_appl_sad_size]
636
        mov     edi, [cache_ide3_data_pointer]
585 mario79 637
.continue:
638
    call   .clear
639
    popa
640
    ret
641
.clear:
2434 Serge 642
        shl     ecx, 1
585 mario79 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:
2434 Serge 654
        cmp     [cdpos], 1
585 mario79 655
    jne    .ide1
2434 Serge 656
        cmp     [cd_appl_data], 0
585 mario79 657
    jne    .ide0_appl_data
2434 Serge 658
        mov     ecx, [cache_ide0_system_sad_size]
659
        mov     esi, [cache_ide0_pointer]
585 mario79 660
    ret
661
.ide0_appl_data:
2434 Serge 662
        mov     ecx, [cache_ide0_appl_sad_size]
663
        mov     esi, [cache_ide0_data_pointer]
585 mario79 664
    ret
665
.ide1:
2434 Serge 666
        cmp     [cdpos], 2
585 mario79 667
    jne    .ide2
2434 Serge 668
        cmp     [cd_appl_data], 0
585 mario79 669
    jne    .ide1_appl_data
2434 Serge 670
        mov     ecx, [cache_ide1_system_sad_size]
671
        mov     esi, [cache_ide1_pointer]
585 mario79 672
    ret
673
.ide1_appl_data:
2434 Serge 674
        mov     ecx, [cache_ide1_appl_sad_size]
675
        mov     esi, [cache_ide1_data_pointer]
585 mario79 676
    ret
677
.ide2:
2434 Serge 678
        cmp     [cdpos], 3
585 mario79 679
    jne    .ide3
2434 Serge 680
        cmp     [cd_appl_data], 0
585 mario79 681
    jne    .ide2_appl_data
2434 Serge 682
        mov     ecx, [cache_ide2_system_sad_size]
683
        mov     esi, [cache_ide2_pointer]
585 mario79 684
    ret
685
.ide2_appl_data:
2434 Serge 686
        mov     ecx, [cache_ide2_appl_sad_size]
687
        mov     esi, [cache_ide2_data_pointer]
585 mario79 688
    ret
689
.ide3:
2434 Serge 690
        cmp     [cd_appl_data], 0
585 mario79 691
    jne    .ide3_appl_data
2434 Serge 692
        mov     ecx, [cache_ide3_system_sad_size]
693
        mov     esi, [cache_ide3_pointer]
585 mario79 694
    ret
695
.ide3_appl_data:
2434 Serge 696
        mov     ecx, [cache_ide3_appl_sad_size]
697
        mov     esi, [cache_ide3_data_pointer]
585 mario79 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:
2434 Serge 705
        cmp     [cdpos], 1
585 mario79 706
    jne    .ide1
2434 Serge 707
        cmp     [cd_appl_data], 0
585 mario79 708
    jne    .ide0_appl_data
2434 Serge 709
        mov     esi, [cache_ide0_pointer]
585 mario79 710
    ret
711
.ide0_appl_data:
2434 Serge 712
        mov     esi, [cache_ide0_data_pointer]
585 mario79 713
    ret
714
.ide1:
2434 Serge 715
        cmp     [cdpos], 2
585 mario79 716
    jne    .ide2
2434 Serge 717
        cmp     [cd_appl_data], 0
585 mario79 718
    jne    .ide1_appl_data
2434 Serge 719
        mov     esi, [cache_ide1_pointer]
585 mario79 720
    ret
721
.ide1_appl_data:
2434 Serge 722
        mov     esi, [cache_ide1_data_pointer]
585 mario79 723
    ret
724
.ide2:
2434 Serge 725
        cmp     [cdpos], 3
585 mario79 726
    jne    .ide3
2434 Serge 727
        cmp     [cd_appl_data], 0
585 mario79 728
    jne    .ide2_appl_data
2434 Serge 729
        mov     esi, [cache_ide2_pointer]
585 mario79 730
    ret
731
.ide2_appl_data:
2434 Serge 732
        mov     esi, [cache_ide2_data_pointer]
585 mario79 733
    ret
734
.ide3:
2434 Serge 735
        cmp     [cd_appl_data], 0
585 mario79 736
    jne    .ide3_appl_data
2434 Serge 737
        mov     esi, [cache_ide3_pointer]
585 mario79 738
    ret
739
.ide3_appl_data:
2434 Serge 740
        mov     esi, [cache_ide3_data_pointer]
585 mario79 741
    ret
742
;--------------------------------------------------------------------
743
align 4
744
cd_calculate_cache_2:
745
;    add   esi,HD_CACHE+65536
746
; 1 - IDE0 ... 4 - IDE3
747
.ide0:
2434 Serge 748
        cmp     [cdpos], 1
585 mario79 749
    jne    .ide1
2434 Serge 750
        cmp     [cd_appl_data], 0
585 mario79 751
    jne    .ide0_appl_data
2434 Serge 752
        mov     eax, [cache_ide0_system_data]
585 mario79 753
    ret
754
.ide0_appl_data:
2434 Serge 755
        mov     eax, [cache_ide0_appl_data]
585 mario79 756
    ret
757
.ide1:
2434 Serge 758
        cmp     [cdpos], 2
585 mario79 759
    jne    .ide2
2434 Serge 760
        cmp     [cd_appl_data], 0
585 mario79 761
    jne    .ide1_appl_data
2434 Serge 762
        mov     eax, [cache_ide1_system_data]
585 mario79 763
    ret
764
.ide1_appl_data:
2434 Serge 765
        mov     eax, [cache_ide1_appl_data]
585 mario79 766
    ret
767
.ide2:
2434 Serge 768
        cmp     [cdpos], 3
585 mario79 769
    jne    .ide3
2434 Serge 770
        cmp     [cd_appl_data], 0
585 mario79 771
    jne    .ide2_appl_data
2434 Serge 772
        mov     eax, [cache_ide2_system_data]
585 mario79 773
    ret
774
.ide2_appl_data:
2434 Serge 775
        mov     eax, [cache_ide2_appl_data]
585 mario79 776
    ret
777
.ide3:
2434 Serge 778
        cmp     [cd_appl_data], 0
585 mario79 779
    jne    .ide3_appl_data
2434 Serge 780
        mov     eax, [cache_ide3_system_data]
585 mario79 781
    ret
782
.ide3_appl_data:
2434 Serge 783
        mov     eax, [cache_ide3_appl_data]
585 mario79 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:
2434 Serge 793
        cmp     [cdpos], 1
585 mario79 794
    jne    .ide1
2434 Serge 795
        cmp     [cd_appl_data], 0
585 mario79 796
    jne    .ide0_appl_data
2434 Serge 797
        mov     edi, [cache_ide0_search_start]
585 mario79 798
    ret
799
.ide0_appl_data:
2434 Serge 800
        mov     edi, [cache_ide0_appl_search_start]
585 mario79 801
    ret
802
.ide1:
2434 Serge 803
        cmp     [cdpos], 2
585 mario79 804
    jne    .ide2
2434 Serge 805
        cmp     [cd_appl_data], 0
585 mario79 806
    jne    .ide1_appl_data
2434 Serge 807
        mov     edi, [cache_ide1_search_start]
585 mario79 808
    ret
809
.ide1_appl_data:
2434 Serge 810
        mov     edi, [cache_ide1_appl_search_start]
585 mario79 811
    ret
812
.ide2:
2434 Serge 813
        cmp     [cdpos], 3
585 mario79 814
    jne    .ide3
2434 Serge 815
        cmp     [cd_appl_data], 0
585 mario79 816
    jne    .ide2_appl_data
2434 Serge 817
        mov     edi, [cache_ide2_search_start]
585 mario79 818
    ret
819
.ide2_appl_data:
2434 Serge 820
        mov     edi, [cache_ide2_appl_search_start]
585 mario79 821
    ret
822
.ide3:
2434 Serge 823
        cmp     [cd_appl_data], 0
585 mario79 824
    jne    .ide3_appl_data
2434 Serge 825
        mov     edi, [cache_ide3_search_start]
585 mario79 826
    ret
827
.ide3_appl_data:
2434 Serge 828
        mov     edi, [cache_ide3_appl_search_start]
585 mario79 829
    ret
830
;--------------------------------------------------------------------
831
align 4
832
cd_calculate_cache_4:
833
;    cmp   edi,cache_max
834
; 1 - IDE0 ... 4 - IDE3
835
.ide0:
2434 Serge 836
        cmp     [cdpos], 1
585 mario79 837
    jne    .ide1
2434 Serge 838
        cmp     [cd_appl_data], 0
585 mario79 839
    jne    .ide0_appl_data
2434 Serge 840
        cmp     edi, [cache_ide0_system_sad_size]
585 mario79 841
    ret
842
.ide0_appl_data:
2434 Serge 843
        cmp     edi, [cache_ide0_appl_sad_size]
585 mario79 844
    ret
845
.ide1:
2434 Serge 846
        cmp     [cdpos], 2
585 mario79 847
    jne    .ide2
2434 Serge 848
        cmp     [cd_appl_data], 0
585 mario79 849
    jne    .ide1_appl_data
2434 Serge 850
        cmp     edi, [cache_ide1_system_sad_size]
585 mario79 851
    ret
852
.ide1_appl_data:
2434 Serge 853
        cmp     edi, [cache_ide1_appl_sad_size]
585 mario79 854
    ret
855
.ide2:
2434 Serge 856
        cmp     [cdpos], 3
585 mario79 857
    jne    .ide3
2434 Serge 858
        cmp     [cd_appl_data], 0
585 mario79 859
    jne    .ide2_appl_data
2434 Serge 860
        cmp     edi, [cache_ide2_system_sad_size]
585 mario79 861
    ret
862
.ide2_appl_data:
2434 Serge 863
        cmp     edi, [cache_ide2_appl_sad_size]
585 mario79 864
    ret
865
.ide3:
2434 Serge 866
        cmp     [cd_appl_data], 0
585 mario79 867
    jne    .ide3_appl_data
2434 Serge 868
        cmp     edi, [cache_ide3_system_sad_size]
585 mario79 869
    ret
870
.ide3_appl_data:
2434 Serge 871
        cmp     edi, [cache_ide3_appl_sad_size]
585 mario79 872
    ret
873
;--------------------------------------------------------------------
874
align 4
875
cd_calculate_cache_5:
876
;    mov   [cache_search_start],edi
877
; 1 - IDE0 ... 4 - IDE3
878
.ide0:
2434 Serge 879
        cmp     [cdpos], 1
585 mario79 880
    jne    .ide1
2434 Serge 881
        cmp     [cd_appl_data], 0
585 mario79 882
    jne    .ide0_appl_data
2434 Serge 883
        mov     [cache_ide0_search_start], edi
585 mario79 884
    ret
885
.ide0_appl_data:
2434 Serge 886
        mov     [cache_ide0_appl_search_start], edi
585 mario79 887
    ret
888
.ide1:
2434 Serge 889
        cmp     [cdpos], 2
585 mario79 890
    jne    .ide2
2434 Serge 891
        cmp     [cd_appl_data], 0
585 mario79 892
    jne    .ide1_appl_data
2434 Serge 893
        mov     [cache_ide1_search_start], edi
585 mario79 894
    ret
895
.ide1_appl_data:
2434 Serge 896
        mov     [cache_ide1_appl_search_start], edi
585 mario79 897
    ret
898
.ide2:
2434 Serge 899
        cmp     [cdpos], 3
585 mario79 900
    jne    .ide3
2434 Serge 901
        cmp     [cd_appl_data], 0
585 mario79 902
    jne    .ide2_appl_data
2434 Serge 903
        mov     [cache_ide2_search_start], edi
585 mario79 904
    ret
905
.ide2_appl_data:
2434 Serge 906
        mov     [cache_ide2_appl_search_start], edi
585 mario79 907
    ret
908
.ide3:
2434 Serge 909
        cmp     [cd_appl_data], 0
585 mario79 910
    jne    .ide3_appl_data
2434 Serge 911
        mov     [cache_ide3_search_start], edi
585 mario79 912
    ret
913
.ide3_appl_data:
2434 Serge 914
        mov     [cache_ide3_appl_search_start], edi
585 mario79 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