Subversion Repositories Kolibri OS

Rev

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