Subversion Repositories Kolibri OS

Rev

Rev 580 | Rev 593 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 580 Rev 585
Line 19... Line 19...
19
; write all changed sectors to disk
19
; write all changed sectors to disk
20
;-----------------------------------------------------------
20
;-----------------------------------------------------------
21
    push  eax ecx edx esi edi
21
    push  eax ecx edx esi edi
Line 22... Line 22...
22
 
22
 
23
    ; write difference ( 2 ) from cache to hd
-
 
24
 
-
 
25
;    mov   ecx,cache_max
-
 
26
;    mov   esi,HD_CACHE+8
23
    ; write difference ( 2 ) from cache to hd
27
    call  calculate_cache
24
    call  calculate_cache
28
    add   esi,8
-
 
29
    
25
    add   esi,8
30
    mov   edi,1
-
 
31
 
26
    mov   edi,1
32
  write_cache_more:
-
 
33
 
27
write_cache_more:
34
    cmp   dword [esi+4],2       ; if cache slot is not different
28
    cmp   dword [esi+4],2	; if cache slot is not different
35
    jne   .write_chain
-
 
36
 
29
    jne   .write_chain
37
    mov   dword [esi+4],1       ; same as in hd
30
    mov   dword [esi+4],1	; same as in hd
38
    mov   eax,[esi]             ; eax = sector to write
-
 
39
 
31
    mov   eax,[esi]		; eax = sector to write
40
    cmp   eax,[PARTITION_START]
32
    cmp   eax,[PARTITION_START]
41
    jb    danger
33
    jb	  danger
42
    cmp   eax,[PARTITION_END]
34
    cmp   eax,[PARTITION_END]
43
    ja    danger
-
 
44
 
35
    ja	  danger
45
; DMA write is permitted only if [allow_dma_access]=1
36
; DMA write is permitted only if [allow_dma_access]=1
46
        cmp     [allow_dma_access], 2
37
	cmp	[allow_dma_access], 2
47
        jae     .nodma
38
	jae	.nodma
48
        cmp     [dma_hdd], 1
39
	cmp	[dma_hdd], 1
Line 76... Line 67...
76
        jmp     .continue
67
	jmp	.continue
77
.nodma:
68
.nodma:
78
        call    cache_write_pio
69
	call	cache_write_pio
79
.write_chain:
70
.write_chain:
80
        call    flush_cache_chain
71
	call	flush_cache_chain
81
 
-
 
82
.continue:
72
.continue:
83
  danger:
73
danger:
84
 
-
 
85
    add   esi,8
74
    add   esi,8
86
    inc   edi
75
    inc   edi
87
    dec   ecx
76
    dec   ecx
88
    jnz   write_cache_more
77
    jnz   write_cache_more
89
        call    flush_cache_chain
78
	call	flush_cache_chain
Line 96... Line 85...
96
        jz      @f
85
	jz	@f
97
        call    write_cache_chain
86
	call	write_cache_chain
98
        mov     [cache_chain_started], 0
87
	mov	[cache_chain_started], 0
99
@@:
88
@@:
100
        ret
89
	ret
101
        
-
 
102
 
-
 
-
 
90
;--------------------------------------------------------------------
103
align 4
91
align 4
104
find_empty_slot:
92
find_empty_slot:
105
;-----------------------------------------------------------
93
;-----------------------------------------------------------
106
; find empty or read slot, flush cache if next 10% is used by write
94
; find empty or read slot, flush cache if next 10% is used by write
107
; output : edi = cache slot
95
; output : edi = cache slot
108
;-----------------------------------------------------------
96
;-----------------------------------------------------------
109
;    push  ecx esi
97
;    push  ecx esi
Line 110... Line 98...
110
 
98
 
111
  search_again:
-
 
112
 
-
 
113
;    mov   ecx,cache_max*10/100
-
 
114
;    mov   edi,[cache_search_start]
99
search_again:
115
    call  calculate_cache_3
-
 
116
;    push  eax edx
-
 
117
;    mov   eax,ecx
-
 
118
;    mov   ecx,10
-
 
119
;    xor   edx,edx
-
 
120
;    div  ecx
-
 
121
;    mov   ecx,eax
-
 
122
;    pop   edx eax
100
    call  calculate_cache_3
123
    shr   ecx,3    
101
    shr   ecx,3
124
  search_for_empty:
-
 
125
 
102
search_for_empty:
126
    inc   edi
-
 
127
;    cmp   edi,cache_max
-
 
128
;    push   eax
103
    inc   edi
129
    call  calculate_cache_4
-
 
130
;    cmp   edi,eax
-
 
131
;    pop   eax
104
    call  calculate_cache_4
132
    jbe   inside_cache
105
    jbe   inside_cache
133
    mov   edi,1
-
 
134
 
106
    mov   edi,1
135
  inside_cache:
-
 
136
 
-
 
137
;    cmp   dword [edi*8+HD_CACHE+4],2    ; get cache slot info
107
inside_cache:
138
    push   esi
108
    push   esi
139
    call  calculate_cache_1
109
    call  calculate_cache_1
140
    cmp   dword [edi*8+esi+4],2
110
    cmp   dword [edi*8+esi+4],2
141
    pop   esi
111
    pop   esi
142
    jb    found_slot                    ; it's empty or read
112
    jb	  found_slot			; it's empty or read
143
    dec   ecx
113
    dec   ecx
144
    jnz   search_for_empty
-
 
145
 
114
    jnz   search_for_empty
146
    call  write_cache                   ; no empty slots found, write all
115
    call  write_cache			; no empty slots found, write all
147
    cmp   [hd_error],0
116
    cmp   [hd_error],0
148
    jne   found_slot_access_denied
-
 
149
 
117
    jne   found_slot_access_denied
150
    jmp   search_again                  ; and start again
-
 
151
 
118
    jmp   search_again			; and start again
152
  found_slot:
-
 
153
 
-
 
154
;    mov   [cache_search_start],edi
119
found_slot:
155
    call  calculate_cache_5
120
    call  calculate_cache_5
156
  found_slot_access_denied:
121
found_slot_access_denied:
157
    ret
-
 
-
 
122
    ret
158
 
123
;--------------------------------------------------------------------
159
align 4
124
align 4
160
clear_hd_cache:
-
 
161
;    push  eax ecx edi
-
 
162
;    mov   edi, HD_CACHE
-
 
163
;    mov   ecx,16384
-
 
164
;    xor   eax,eax
-
 
165
;    cld
-
 
166
;    rep   stosd                 ; clear hd cache with 0
-
 
167
;    mov   [cache_search_start],eax
125
clear_hd_cache:
168
    mov   [fat_in_cache],-1
126
    mov   [fat_in_cache],-1
169
    mov   [fat_change],0
-
 
170
;    pop   edi ecx eax
127
    mov   [fat_change],0
171
    ret
-
 
172
    
128
    ret
173
;--------------------------------------------------------------------
129
;--------------------------------------------------------------------
174
align 4
130
align 4
175
calculate_cache:
131
calculate_cache:
176
;    mov   ecx,cache_max         ; entries in cache
132
;    mov   ecx,cache_max         ; entries in cache
Line 446... Line 402...
446
    mov   [cache_ide3_search_start],edi    
402
    mov   [cache_ide3_search_start],edi
447
    ret
403
    ret
448
.ide3_appl_data:
404
.ide3_appl_data:
449
    mov   [cache_ide3_appl_search_start],edi
405
    mov   [cache_ide3_appl_search_start],edi
450
    ret
406
    ret
-
 
407
 
-
 
408
;--------------------------------------------------------------------
-
 
409
align 4
-
 
410
find_empty_slot_CD_cache:
-
 
411
;-----------------------------------------------------------
-
 
412
; find empty or read slot, flush cache if next 10% is used by write
-
 
413
; output : edi = cache slot
-
 
414
;-----------------------------------------------------------
-
 
415
.search_again:
-
 
416
    call  cd_calculate_cache_3
-
 
417
.search_for_empty:
-
 
418
    inc   edi
-
 
419
    call  cd_calculate_cache_4
-
 
420
    jbe   .inside_cache
-
 
421
    mov   edi,1
-
 
422
.inside_cache:
-
 
423
    call  cd_calculate_cache_5
-
 
424
    ret
-
 
425
;--------------------------------------------------------------------
-
 
426
clear_CD_cache:
-
 
427
    pusha
-
 
428
.ide0:
-
 
429
    xor   eax,eax
-
 
430
    cmp    [cdpos],1
-
 
431
    jne    .ide1
-
 
432
    mov    [cache_ide0_search_start],eax
-
 
433
    mov    ecx,[cache_ide0_system_sad_size]
-
 
434
    mov    edi,[cache_ide0_pointer]
-
 
435
    call   .clear
-
 
436
    mov    [cache_ide0_appl_search_start],eax
-
 
437
    mov    ecx,[cache_ide0_appl_sad_size]
-
 
438
    mov    edi,[cache_ide0_data_pointer]
-
 
439
    jmp    .continue
-
 
440
.ide1:
-
 
441
    cmp    [cdpos],2
-
 
442
    jne    .ide2
-
 
443
    mov    [cache_ide1_search_start],eax
-
 
444
    mov    ecx,[cache_ide1_system_sad_size]
-
 
445
    mov    edi,[cache_ide1_pointer]
-
 
446
    call   .clear
-
 
447
    mov    [cache_ide1_appl_search_start],eax
-
 
448
    mov    ecx,[cache_ide1_appl_sad_size]
-
 
449
    mov    edi,[cache_ide1_data_pointer]
-
 
450
    jmp    .continue
-
 
451
.ide2:
-
 
452
    cmp    [cdpos],3
-
 
453
    jne    .ide3
-
 
454
    mov    [cache_ide2_search_start],eax
-
 
455
    mov    ecx,[cache_ide2_system_sad_size]
-
 
456
    mov    edi,[cache_ide2_pointer]
-
 
457
    call   .clear
-
 
458
    mov    [cache_ide2_appl_search_start],eax
-
 
459
    mov    ecx,[cache_ide2_appl_sad_size]
-
 
460
    mov    edi,[cache_ide2_data_pointer]
-
 
461
    jmp    .continue
-
 
462
.ide3:
-
 
463
    mov    [cache_ide3_search_start],eax
-
 
464
    mov    ecx,[cache_ide3_system_sad_size]
-
 
465
    mov    edi,[cache_ide3_pointer]
-
 
466
    call   .clear
-
 
467
    mov    [cache_ide3_appl_search_start],eax
-
 
468
    mov    ecx,[cache_ide3_appl_sad_size]
-
 
469
    mov    edi,[cache_ide3_data_pointer]
-
 
470
.continue:
-
 
471
    call   .clear
-
 
472
    popa
-
 
473
    ret
-
 
474
.clear:
-
 
475
    shl   ecx,1
-
 
476
    cld
-
 
477
    rep   stosd
-
 
478
    ret
-
 
479
;--------------------------------------------------------------------
-
 
480
align 4
-
 
481
cd_calculate_cache:
-
 
482
;    mov   ecx,cache_max         ; entries in cache
-
 
483
;    mov   esi,HD_CACHE+8
-
 
484
 
-
 
485
; 1 - IDE0 ... 4 - IDE3
-
 
486
.ide0:
-
 
487
    cmp    [cdpos],1
-
 
488
    jne    .ide1
-
 
489
    cmp    [cd_appl_data],0
-
 
490
    jne    .ide0_appl_data
-
 
491
    mov    ecx,[cache_ide0_system_sad_size]
-
 
492
    mov    esi,[cache_ide0_pointer]
-
 
493
    ret
-
 
494
.ide0_appl_data:
-
 
495
    mov    ecx,[cache_ide0_appl_sad_size]
-
 
496
    mov    esi,[cache_ide0_data_pointer]
-
 
497
    ret
-
 
498
.ide1:
-
 
499
    cmp    [cdpos],2
-
 
500
    jne    .ide2
-
 
501
    cmp    [cd_appl_data],0
-
 
502
    jne    .ide1_appl_data
-
 
503
    mov    ecx,[cache_ide1_system_sad_size]
-
 
504
    mov    esi,[cache_ide1_pointer]
-
 
505
    ret
-
 
506
.ide1_appl_data:
-
 
507
    mov    ecx,[cache_ide1_appl_sad_size]
-
 
508
    mov    esi,[cache_ide1_data_pointer]
-
 
509
    ret
-
 
510
.ide2:
-
 
511
    cmp    [cdpos],3
-
 
512
    jne    .ide3
-
 
513
    cmp    [cd_appl_data],0
-
 
514
    jne    .ide2_appl_data
-
 
515
    mov    ecx,[cache_ide2_system_sad_size]
-
 
516
    mov    esi,[cache_ide2_pointer]
-
 
517
    ret
-
 
518
.ide2_appl_data:
-
 
519
    mov    ecx,[cache_ide2_appl_sad_size]
-
 
520
    mov    esi,[cache_ide2_data_pointer]
-
 
521
    ret
-
 
522
.ide3:
-
 
523
    cmp    [cd_appl_data],0
-
 
524
    jne    .ide3_appl_data
-
 
525
    mov    ecx,[cache_ide3_system_sad_size]
-
 
526
    mov    esi,[cache_ide3_pointer]
-
 
527
    ret
-
 
528
.ide3_appl_data:
-
 
529
    mov    ecx,[cache_ide3_appl_sad_size]
-
 
530
    mov    esi,[cache_ide3_data_pointer]
-
 
531
    ret
-
 
532
;--------------------------------------------------------------------
-
 
533
align 4
-
 
534
cd_calculate_cache_1:
-
 
535
;    lea   esi,[edi*8+HD_CACHE]
-
 
536
; 1 - IDE0 ... 4 - IDE3
-
 
537
.ide0:
-
 
538
    cmp    [cdpos],1
-
 
539
    jne    .ide1
-
 
540
    cmp    [cd_appl_data],0
-
 
541
    jne    .ide0_appl_data
-
 
542
    mov    esi,[cache_ide0_pointer]
-
 
543
    ret
-
 
544
.ide0_appl_data:
-
 
545
    mov    esi,[cache_ide0_data_pointer]
-
 
546
    ret
-
 
547
.ide1:
-
 
548
    cmp    [cdpos],2
-
 
549
    jne    .ide2
-
 
550
    cmp    [cd_appl_data],0
-
 
551
    jne    .ide1_appl_data
-
 
552
    mov    esi,[cache_ide1_pointer]
-
 
553
    ret
-
 
554
.ide1_appl_data:
-
 
555
    mov    esi,[cache_ide1_data_pointer]
-
 
556
    ret
-
 
557
.ide2:
-
 
558
    cmp    [cdpos],3
-
 
559
    jne    .ide3
-
 
560
    cmp    [cd_appl_data],0
-
 
561
    jne    .ide2_appl_data
-
 
562
    mov    esi,[cache_ide2_pointer]
-
 
563
    ret
-
 
564
.ide2_appl_data:
-
 
565
    mov    esi,[cache_ide2_data_pointer]
-
 
566
    ret
-
 
567
.ide3:
-
 
568
    cmp    [cd_appl_data],0
-
 
569
    jne    .ide3_appl_data
-
 
570
    mov    esi,[cache_ide3_pointer]
-
 
571
    ret
-
 
572
.ide3_appl_data:
-
 
573
    mov    esi,[cache_ide3_data_pointer]
-
 
574
    ret
451
;--------------------------------------------------------------------
575
;--------------------------------------------------------------------
452
align 4
576
align 4
453
calculate_linear_to_real:
577
cd_calculate_cache_2:
-
 
578
;    add   esi,HD_CACHE+65536
-
 
579
; 1 - IDE0 ... 4 - IDE3
-
 
580
.ide0:
-
 
581
    cmp    [cdpos],1
-
 
582
    jne    .ide1
-
 
583
    cmp    [cd_appl_data],0
-
 
584
    jne    .ide0_appl_data
-
 
585
    mov    eax,[cache_ide0_system_data]
-
 
586
    ret
-
 
587
.ide0_appl_data:
-
 
588
    mov    eax,[cache_ide0_appl_data]
-
 
589
    ret
-
 
590
.ide1:
-
 
591
    cmp    [cdpos],2
454
    shr eax, 12
592
    jne    .ide2
-
 
593
    cmp    [cd_appl_data],0
-
 
594
    jne    .ide1_appl_data
-
 
595
    mov    eax,[cache_ide1_system_data]
-
 
596
    ret
-
 
597
.ide1_appl_data:
-
 
598
    mov    eax,[cache_ide1_appl_data]
-
 
599
    ret
-
 
600
.ide2:
-
 
601
    cmp    [cdpos],3
-
 
602
    jne    .ide3
-
 
603
    cmp    [cd_appl_data],0
-
 
604
    jne    .ide2_appl_data
-
 
605
    mov    eax,[cache_ide2_system_data]
-
 
606
    ret
-
 
607
.ide2_appl_data:
-
 
608
    mov    eax,[cache_ide2_appl_data]
-
 
609
    ret
-
 
610
.ide3:
-
 
611
    cmp    [cd_appl_data],0
-
 
612
    jne    .ide3_appl_data
-
 
613
    mov    eax,[cache_ide3_system_data]
-
 
614
    ret
-
 
615
.ide3_appl_data:
455
    mov eax, [page_tabs+eax*4] 
616
    mov    eax,[cache_ide3_appl_data]
-
 
617
    ret
-
 
618
;--------------------------------------------------------------------
-
 
619
align 4
-
 
620
cd_calculate_cache_3:
456
    and eax, 0xFFFFF000
621
;    mov   ecx,cache_max*10/100
-
 
622
;    mov   edi,[cache_search_start]
-
 
623
 
-
 
624
; 1 - IDE0 ... 4 - IDE3
-
 
625
.ide0:
-
 
626
    cmp    [cdpos],1
-
 
627
    jne    .ide1
-
 
628
    cmp    [cd_appl_data],0
-
 
629
    jne    .ide0_appl_data
-
 
630
    mov    edi,[cache_ide0_search_start]
-
 
631
    ret
-
 
632
.ide0_appl_data:
-
 
633
    mov    edi,[cache_ide0_appl_search_start]
-
 
634
    ret
-
 
635
.ide1:
-
 
636
    cmp    [cdpos],2
-
 
637
    jne    .ide2
-
 
638
    cmp    [cd_appl_data],0
-
 
639
    jne    .ide1_appl_data
-
 
640
    mov    edi,[cache_ide1_search_start]
-
 
641
    ret
-
 
642
.ide1_appl_data:
-
 
643
    mov    edi,[cache_ide1_appl_search_start]
-
 
644
    ret
-
 
645
.ide2:
-
 
646
    cmp    [cdpos],3
-
 
647
    jne    .ide3
-
 
648
    cmp    [cd_appl_data],0
-
 
649
    jne    .ide2_appl_data
-
 
650
    mov    edi,[cache_ide2_search_start]
-
 
651
    ret
-
 
652
.ide2_appl_data:
-
 
653
    mov    edi,[cache_ide2_appl_search_start]
-
 
654
    ret
-
 
655
.ide3:
-
 
656
    cmp    [cd_appl_data],0
-
 
657
    jne    .ide3_appl_data
-
 
658
    mov    edi,[cache_ide3_search_start]
-
 
659
    ret
-
 
660
.ide3_appl_data:
-
 
661
    mov    edi,[cache_ide3_appl_search_start]
-
 
662
    ret
-
 
663
;--------------------------------------------------------------------
-
 
664
align 4
-
 
665
cd_calculate_cache_4:
-
 
666
;    cmp   edi,cache_max
-
 
667
; 1 - IDE0 ... 4 - IDE3
-
 
668
.ide0:
-
 
669
    cmp    [cdpos],1
-
 
670
    jne    .ide1
-
 
671
    cmp    [cd_appl_data],0
-
 
672
    jne    .ide0_appl_data
-
 
673
    cmp   edi,[cache_ide0_system_sad_size]
-
 
674
    ret
-
 
675
.ide0_appl_data:
-
 
676
    cmp   edi,[cache_ide0_appl_sad_size]
-
 
677
    ret
-
 
678
.ide1:
-
 
679
    cmp    [cdpos],2
-
 
680
    jne    .ide2
-
 
681
    cmp    [cd_appl_data],0
-
 
682
    jne    .ide1_appl_data
-
 
683
    cmp   edi,[cache_ide1_system_sad_size]
-
 
684
    ret
-
 
685
.ide1_appl_data:
-
 
686
    cmp   edi,[cache_ide1_appl_sad_size]
-
 
687
    ret
-
 
688
.ide2:
-
 
689
    cmp    [cdpos],3
-
 
690
    jne    .ide3
-
 
691
    cmp    [cd_appl_data],0
-
 
692
    jne    .ide2_appl_data
-
 
693
    cmp   edi,[cache_ide2_system_sad_size]
-
 
694
    ret
-
 
695
.ide2_appl_data:
-
 
696
    cmp   edi,[cache_ide2_appl_sad_size]
-
 
697
    ret
-
 
698
.ide3:
-
 
699
    cmp    [cd_appl_data],0
-
 
700
    jne    .ide3_appl_data
-
 
701
    cmp   edi,[cache_ide3_system_sad_size]
-
 
702
    ret
-
 
703
.ide3_appl_data:
-
 
704
    cmp   edi,[cache_ide3_appl_sad_size]
-
 
705
    ret
-
 
706
;--------------------------------------------------------------------
-
 
707
align 4
-
 
708
cd_calculate_cache_5:
-
 
709
;    mov   [cache_search_start],edi
-
 
710
; 1 - IDE0 ... 4 - IDE3
-
 
711
.ide0:
-
 
712
    cmp    [cdpos],1
-
 
713
    jne    .ide1
-
 
714
    cmp    [cd_appl_data],0
-
 
715
    jne    .ide0_appl_data
-
 
716
    mov   [cache_ide0_search_start],edi
-
 
717
    ret
-
 
718
.ide0_appl_data:
-
 
719
    mov   [cache_ide0_appl_search_start],edi
457
    ret
720
    ret
-
 
721
.ide1:
-
 
722
    cmp    [cdpos],2
-
 
723
    jne    .ide2
-
 
724
    cmp    [cd_appl_data],0
-
 
725
    jne    .ide1_appl_data
-
 
726
    mov   [cache_ide1_search_start],edi
-
 
727
    ret
-
 
728
.ide1_appl_data:
-
 
729
    mov   [cache_ide1_appl_search_start],edi
-
 
730
    ret
-
 
731
.ide2:
-
 
732
    cmp    [cdpos],3
-
 
733
    jne    .ide3
-
 
734
    cmp    [cd_appl_data],0
-
 
735
    jne    .ide2_appl_data
-
 
736
    mov   [cache_ide2_search_start],edi
-
 
737
    ret
-
 
738
.ide2_appl_data:
-
 
739
    mov   [cache_ide2_appl_search_start],edi
-
 
740
    ret
-
 
741
.ide3:
-
 
742
    cmp    [cd_appl_data],0
-
 
743
    jne    .ide3_appl_data
-
 
744
    mov   [cache_ide3_search_start],edi
-
 
745
    ret
-
 
746
.ide3_appl_data:
-
 
747
    mov   [cache_ide3_appl_search_start],edi
-
 
748
    ret
-
 
749
;--------------------------------------------------------------------
-
 
750
;align 4
-
 
751
;calculate_linear_to_real:
-
 
752
;    shr eax, 12
-
 
753
;    mov eax, [page_tabs+eax*4]
-
 
754
;    and eax, 0xFFFFF000
-
 
755
;    ret