Subversion Repositories Kolibri OS

Rev

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

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