Subversion Repositories Kolibri OS

Rev

Rev 1635 | Rev 2465 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

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