Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
750 victor 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
3
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
4
;; Distributed under terms of the GNU General Public License    ;;
5
;;                                                              ;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
593 mikedld 7
 
750 victor 8
$Revision: 1376 $
593 mikedld 9
 
580 mario79 10
    pusha
11
 
12
    mov  eax,[pg_data.pages_free]
13
;   1/32
14
    shr eax,5
15
;   round off up to 8 pages
16
    shr eax,3
17
    shl eax,3
18
;   translate pages in butes *4096
19
    shl eax,12
585 mario79 20
;       check a upper size of the cache, no more than 1 Mb on the physical device
580 mario79 21
    cmp  eax,1024*1024
22
    jbe  @f
23
    mov  eax,1024*1024
24
    jmp  .continue
25
@@:
585 mario79 26
;       check a lower size of the cache, not less than 128 Kb on the physical device
580 mario79 27
    cmp  eax,128*1024
28
    jae  @f
29
    mov  eax,128*1024
30
@@:
31
.continue:
32
    mov  [cache_ide0_size],eax
33
    mov  [cache_ide1_size],eax
34
    mov  [cache_ide2_size],eax
35
    mov  [cache_ide3_size],eax
36
    xor  eax,eax
37
    mov  [hdd_appl_data],1  ;al
585 mario79 38
    mov  [cd_appl_data],1
580 mario79 39
 
709 diamond 40
    mov  ch,[DRIVE_DATA+1]
41
    mov  cl,ch
580 mario79 42
    and  cl,11b
585 mario79 43
    je	.ide2
709 diamond 44
    mov  esi,cache_ide3
45
    call get_cache_ide
580 mario79 46
.ide2:
47
    mov  cl,ch
709 diamond 48
    shr  cl,2
49
    and  cl,11b
585 mario79 50
    je	.ide1
709 diamond 51
    mov  esi,cache_ide2
52
    call get_cache_ide
580 mario79 53
.ide1:
54
    mov  cl,ch
709 diamond 55
    shr  cl,4
56
    and  cl,11b
585 mario79 57
    je	.ide0
709 diamond 58
    mov  esi,cache_ide1
59
    call get_cache_ide
580 mario79 60
.ide0:
61
    mov  cl,ch
709 diamond 62
    shr  cl,6
63
    and  cl,11b
64
    je	@f
65
    mov  esi,cache_ide0
66
    call get_cache_ide
67
@@:
68
    xor ecx,ecx
69
    cmp [NumBiosDisks],ecx
70
    jz  .endbd
71
    mov esi,BiosDiskCaches
72
.loopbd:
1150 diamond 73
    push ecx
74
    movsx ecx,byte [BiosDisksData+ecx*4+2]
75
    inc ecx
76
    jz  .getbd
77
    add ecx,ecx
78
    movzx eax,byte [DRIVE_DATA+1]
79
    shl eax,cl
80
    and ah,3
81
    cmp ah,1
82
    jz  .contbd
83
    pop ecx
84
    mov byte [BiosDisksData+ecx*4+2], -1
85
    push ecx
86
.getbd:
709 diamond 87
    mov eax,[cache_ide0_size]
88
    mov [esi+cache_ide0_size-cache_ide0],eax
89
    mov  cl,1
90
    call get_cache_ide
1150 diamond 91
.contbd:
580 mario79 92
    pop  ecx
709 diamond 93
    add  esi,cache_ide1-cache_ide0
94
    inc  ecx
95
    cmp  ecx,[NumBiosDisks]
96
    jb   .loopbd
97
.endbd:
98
    jmp  end_get_cache
580 mario79 99
 
709 diamond 100
get_cache_ide:
101
    and  [esi+cache_ide0_search_start-cache_ide0],0
102
    and  [esi+cache_ide0_appl_search_start-cache_ide0],0
580 mario79 103
    push  ecx
709 diamond 104
    stdcall kernel_alloc,[esi+cache_ide0_size-cache_ide0]
105
    mov [esi+cache_ide0_pointer-cache_ide0],eax
580 mario79 106
    pop   ecx
107
    mov  edx,eax
709 diamond 108
    mov  eax,[esi+cache_ide0_size-cache_ide0]
580 mario79 109
    shr  eax,3
709 diamond 110
    mov  [esi+cache_ide0_system_data_size-cache_ide0],eax
580 mario79 111
    mov  ebx,eax
112
    imul eax,7
709 diamond 113
    mov  [esi+cache_ide0_appl_data_size-cache_ide0],eax
580 mario79 114
    add  ebx,edx
709 diamond 115
    mov  [esi+cache_ide0_data_pointer-cache_ide0],ebx
585 mario79 116
 
580 mario79 117
    cmp cl,10b
585 mario79 118
    je	.cd
580 mario79 119
    push ecx
709 diamond 120
    mov  eax,[esi+cache_ide0_system_data_size-cache_ide0]
580 mario79 121
    call calculate_for_hd
709 diamond 122
    add  eax,[esi+cache_ide0_pointer-cache_ide0]
123
    mov  [esi+cache_ide0_system_data-cache_ide0],eax
124
    mov  [esi+cache_ide0_system_sad_size-cache_ide0],ecx
580 mario79 125
 
126
    push  edi
709 diamond 127
    mov   edi,[esi+cache_ide0_pointer-cache_ide0]
580 mario79 128
    call  clear_ide_cache
129
    pop   edi
130
 
709 diamond 131
    mov  eax,[esi+cache_ide0_appl_data_size-cache_ide0]
580 mario79 132
    call calculate_for_hd
709 diamond 133
    add  eax,[esi+cache_ide0_data_pointer-cache_ide0]
134
    mov  [esi+cache_ide0_appl_data-cache_ide0],eax
135
    mov  [esi+cache_ide0_appl_sad_size-cache_ide0],ecx
585 mario79 136
 
580 mario79 137
    push  edi
709 diamond 138
    mov   edi,[esi+cache_ide0_data_pointer-cache_ide0]
580 mario79 139
    call  clear_ide_cache
140
    pop   edi
585 mario79 141
 
580 mario79 142
    pop  ecx
143
    ret
144
.cd:
145
    push ecx
709 diamond 146
    mov  eax,[esi+cache_ide0_system_data_size-cache_ide0]
580 mario79 147
    call calculate_for_cd
709 diamond 148
    add  eax,[esi+cache_ide0_pointer-cache_ide0]
149
    mov  [esi+cache_ide0_system_data-cache_ide0],eax
150
    mov  [esi+cache_ide0_system_sad_size-cache_ide0],ecx
580 mario79 151
 
152
    push  edi
709 diamond 153
    mov   edi,[esi+cache_ide0_pointer-cache_ide0]
580 mario79 154
    call  clear_ide_cache
155
    pop   edi
156
 
709 diamond 157
    mov  eax,[esi+cache_ide0_appl_data_size-cache_ide0]
580 mario79 158
    call calculate_for_cd
709 diamond 159
    add  eax,[esi+cache_ide0_data_pointer-cache_ide0]
160
    mov  [esi+cache_ide0_appl_data-cache_ide0],eax
161
    mov  [esi+cache_ide0_appl_sad_size-cache_ide0],ecx
585 mario79 162
 
580 mario79 163
    push  edi
709 diamond 164
    mov   edi,[esi+cache_ide0_data_pointer-cache_ide0]
580 mario79 165
    call  clear_ide_cache
166
    pop   edi
585 mario79 167
 
580 mario79 168
    pop  ecx
169
    ret
170
 
171
calculate_for_hd:
172
    push eax
173
    mov  ebx,eax
174
    shr  eax,9
175
    shl  eax,3
176
    sub  ebx,eax
177
    shr  ebx,9
178
    mov  ecx,ebx
179
    shl  ebx,9
180
    pop  eax
181
    sub  eax,ebx
584 mario79 182
    dec  ecx
580 mario79 183
    ret
184
 
185
calculate_for_cd:
186
    push eax
187
    mov  ebx,eax
188
    shr  eax,11
189
    shl  eax,3
190
    sub  ebx,eax
191
    shr  ebx,11
192
    mov  ecx,ebx
193
    shl  ebx,11
194
    pop  eax
195
    sub  eax,ebx
584 mario79 196
    dec  ecx
580 mario79 197
    ret
585 mario79 198
 
580 mario79 199
clear_ide_cache:
200
    push   eax
201
    shl   ecx,1
202
    xor   eax,eax
203
    cld
204
    rep   stosd
205
    pop   eax
206
    ret
585 mario79 207
 
580 mario79 208
end_get_cache:
209
;    mov  [cache_ide0_pointer],HD_CACHE
210
;    mov  [cache_ide0_system_data],HD_CACHE+65536
211
;    mov  [cache_ide0_system_sad_size],1919
212
    popa