93e2c279ba
Step 2: 1) Realized cache ATAPI device (CD\DVD). 2) Lock\Unlock ATAPI device for working with cache. 3) Eject (F70/10) and Load (F70/11) tray of ATAPI device. 4) Application CD_tray for control of tray ATAPI device. git-svn-id: svn://kolibrios.org@585 a494cfbc-eb01-0410-851d-a64ba20cac60
392 lines
8.9 KiB
PHP
392 lines
8.9 KiB
PHP
;cache_ide0_pointer dd 0
|
|
;cache_ide0_size dd 0 ; not use
|
|
;cache_ide0_data_pointer dd 0
|
|
;cache_ide0_system_data_size dd 0 ; not use
|
|
;cache_ide0_appl_data_size dd 0 ; not use
|
|
;cache_ide0_system_data dd 0
|
|
;cache_ide0_appl_data dd 0
|
|
;cache_ide0_system_sad_size dd 0
|
|
;cache_ide0_appl_sad_size dd 0
|
|
|
|
pusha
|
|
|
|
mov eax,[pg_data.pages_free]
|
|
; 1/32
|
|
shr eax,5
|
|
; round off up to 8 pages
|
|
shr eax,3
|
|
shl eax,3
|
|
; translate pages in butes *4096
|
|
shl eax,12
|
|
; check a upper size of the cache, no more than 1 Mb on the physical device
|
|
cmp eax,1024*1024
|
|
jbe @f
|
|
mov eax,1024*1024
|
|
jmp .continue
|
|
@@:
|
|
; check a lower size of the cache, not less than 128 Kb on the physical device
|
|
cmp eax,128*1024
|
|
jae @f
|
|
mov eax,128*1024
|
|
@@:
|
|
.continue:
|
|
mov [cache_ide0_size],eax
|
|
mov [cache_ide1_size],eax
|
|
mov [cache_ide2_size],eax
|
|
mov [cache_ide3_size],eax
|
|
xor eax,eax
|
|
mov [cache_ide0_search_start],eax
|
|
mov [cache_ide0_appl_search_start],eax
|
|
mov [cache_ide1_search_start],eax
|
|
mov [cache_ide1_appl_search_start],eax
|
|
mov [cache_ide2_search_start],eax
|
|
mov [cache_ide2_appl_search_start],eax
|
|
mov [cache_ide3_search_start],eax
|
|
mov [cache_ide3_appl_search_start],eax
|
|
mov [hdd_appl_data],1 ;al
|
|
mov [cd_appl_data],1
|
|
|
|
mov cl,[DRIVE_DATA+1]
|
|
mov ch,cl
|
|
and cl,11b
|
|
cmp cl,0
|
|
je .ide2
|
|
call get_cache_ide3
|
|
.ide2:
|
|
mov cl,ch
|
|
and cl,1100b
|
|
cmp cl,0
|
|
je .ide1
|
|
call get_cache_ide2
|
|
.ide1:
|
|
mov cl,ch
|
|
and cl,110000b
|
|
cmp cl,0
|
|
je .ide0
|
|
call get_cache_ide1
|
|
.ide0:
|
|
mov cl,ch
|
|
and cl,11000000b
|
|
cmp cl,0
|
|
je end_get_cache
|
|
call get_cache_ide0
|
|
jmp end_get_cache
|
|
|
|
get_cache_ide0:
|
|
push ecx
|
|
stdcall kernel_alloc,[cache_ide0_size]
|
|
mov [cache_ide0_pointer],eax
|
|
pop ecx
|
|
mov edx,eax
|
|
mov eax,[cache_ide0_size]
|
|
shr eax,3
|
|
mov [cache_ide0_system_data_size],eax
|
|
mov ebx,eax
|
|
imul eax,7
|
|
mov [cache_ide0_appl_data_size],eax
|
|
add ebx,edx
|
|
mov [cache_ide0_data_pointer],ebx
|
|
|
|
cmp cl,10000000b
|
|
je .cd
|
|
push ecx
|
|
mov eax,[cache_ide0_system_data_size]
|
|
call calculate_for_hd
|
|
add eax,[cache_ide0_pointer]
|
|
mov [cache_ide0_system_data],eax
|
|
mov [cache_ide0_system_sad_size],ecx
|
|
|
|
push edi
|
|
mov edi,[cache_ide0_pointer]
|
|
call clear_ide_cache
|
|
pop edi
|
|
|
|
mov eax,[cache_ide0_appl_data_size]
|
|
call calculate_for_hd
|
|
add eax,[cache_ide0_data_pointer]
|
|
mov [cache_ide0_appl_data],eax
|
|
mov [cache_ide0_appl_sad_size],ecx
|
|
|
|
push edi
|
|
mov edi,[cache_ide0_data_pointer]
|
|
call clear_ide_cache
|
|
pop edi
|
|
|
|
pop ecx
|
|
ret
|
|
.cd:
|
|
push ecx
|
|
mov eax,[cache_ide0_system_data_size]
|
|
call calculate_for_cd
|
|
add eax,[cache_ide0_pointer]
|
|
mov [cache_ide0_system_data],eax
|
|
mov [cache_ide0_system_sad_size],ecx
|
|
|
|
push edi
|
|
mov edi,[cache_ide0_pointer]
|
|
call clear_ide_cache
|
|
pop edi
|
|
|
|
mov eax,[cache_ide0_appl_data_size]
|
|
call calculate_for_cd
|
|
add eax,[cache_ide0_data_pointer]
|
|
mov [cache_ide0_appl_data],eax
|
|
mov [cache_ide0_appl_sad_size],ecx
|
|
|
|
push edi
|
|
mov edi,[cache_ide0_data_pointer]
|
|
call clear_ide_cache
|
|
pop edi
|
|
|
|
pop ecx
|
|
ret
|
|
|
|
get_cache_ide1:
|
|
push ecx
|
|
stdcall kernel_alloc,[cache_ide1_size]
|
|
mov [cache_ide1_pointer],eax
|
|
pop ecx
|
|
mov edx,eax
|
|
mov eax,[cache_ide1_size]
|
|
shr eax,3
|
|
mov [cache_ide1_system_data_size],eax
|
|
mov ebx,eax
|
|
imul eax,7
|
|
mov [cache_ide1_appl_data_size],eax
|
|
add ebx,edx
|
|
mov [cache_ide1_data_pointer],ebx
|
|
|
|
cmp cl,100000b
|
|
je .cd
|
|
push ecx
|
|
mov eax,[cache_ide1_system_data_size]
|
|
call calculate_for_hd
|
|
add eax,[cache_ide1_pointer]
|
|
mov [cache_ide1_system_data],eax
|
|
mov [cache_ide1_system_sad_size],ecx
|
|
|
|
push edi
|
|
mov edi,[cache_ide1_pointer]
|
|
call clear_ide_cache
|
|
pop edi
|
|
|
|
mov eax,[cache_ide1_appl_data_size]
|
|
call calculate_for_hd
|
|
add eax,[cache_ide1_data_pointer]
|
|
mov [cache_ide1_appl_data],eax
|
|
mov [cache_ide1_appl_sad_size],ecx
|
|
|
|
push edi
|
|
mov edi,[cache_ide1_data_pointer]
|
|
call clear_ide_cache
|
|
pop edi
|
|
|
|
pop ecx
|
|
ret
|
|
.cd:
|
|
push ecx
|
|
mov eax,[cache_ide1_system_data_size]
|
|
call calculate_for_cd
|
|
add eax,[cache_ide1_pointer]
|
|
mov [cache_ide1_system_data],eax
|
|
mov [cache_ide1_system_sad_size],ecx
|
|
|
|
push edi
|
|
mov edi,[cache_ide1_pointer]
|
|
call clear_ide_cache
|
|
pop edi
|
|
|
|
mov eax,[cache_ide1_appl_data_size]
|
|
call calculate_for_cd
|
|
add eax,[cache_ide1_data_pointer]
|
|
mov [cache_ide1_appl_data],eax
|
|
mov [cache_ide1_appl_sad_size],ecx
|
|
|
|
push edi
|
|
mov edi,[cache_ide1_data_pointer]
|
|
call clear_ide_cache
|
|
pop edi
|
|
|
|
pop ecx
|
|
ret
|
|
|
|
get_cache_ide2:
|
|
push ecx
|
|
stdcall kernel_alloc,[cache_ide2_size]
|
|
mov [cache_ide2_pointer],eax
|
|
pop ecx
|
|
mov edx,eax
|
|
mov eax,[cache_ide2_size]
|
|
shr eax,3
|
|
mov [cache_ide2_system_data_size],eax
|
|
mov ebx,eax
|
|
imul eax,7
|
|
mov [cache_ide2_appl_data_size],eax
|
|
add ebx,edx
|
|
mov [cache_ide2_data_pointer],ebx
|
|
|
|
cmp cl,1000b
|
|
je .cd
|
|
push ecx
|
|
mov eax,[cache_ide2_system_data_size]
|
|
call calculate_for_hd
|
|
add eax,[cache_ide2_pointer]
|
|
mov [cache_ide2_system_data],eax
|
|
mov [cache_ide2_system_sad_size],ecx
|
|
|
|
push edi
|
|
mov edi,[cache_ide2_pointer]
|
|
call clear_ide_cache
|
|
pop edi
|
|
|
|
mov eax,[cache_ide2_appl_data_size]
|
|
call calculate_for_hd
|
|
add eax,[cache_ide2_data_pointer]
|
|
mov [cache_ide2_appl_data],eax
|
|
mov [cache_ide2_appl_sad_size],ecx
|
|
|
|
push edi
|
|
mov edi,[cache_ide2_data_pointer]
|
|
call clear_ide_cache
|
|
pop edi
|
|
|
|
pop ecx
|
|
ret
|
|
.cd:
|
|
push ecx
|
|
mov eax,[cache_ide2_system_data_size]
|
|
call calculate_for_cd
|
|
add eax,[cache_ide2_pointer]
|
|
mov [cache_ide2_system_data],eax
|
|
mov [cache_ide2_system_sad_size],ecx
|
|
|
|
push edi
|
|
mov edi,[cache_ide2_pointer]
|
|
call clear_ide_cache
|
|
pop edi
|
|
|
|
mov eax,[cache_ide2_appl_data_size]
|
|
call calculate_for_cd
|
|
add eax,[cache_ide2_data_pointer]
|
|
mov [cache_ide2_appl_data],eax
|
|
mov [cache_ide2_appl_sad_size],ecx
|
|
|
|
push edi
|
|
mov edi,[cache_ide2_data_pointer]
|
|
call clear_ide_cache
|
|
pop edi
|
|
|
|
pop ecx
|
|
ret
|
|
|
|
get_cache_ide3:
|
|
push ecx
|
|
stdcall kernel_alloc,[cache_ide3_size]
|
|
mov [cache_ide3_pointer],eax
|
|
pop ecx
|
|
mov edx,eax
|
|
mov eax,[cache_ide3_size]
|
|
shr eax,3
|
|
mov [cache_ide3_system_data_size],eax
|
|
mov ebx,eax
|
|
imul eax,7
|
|
mov [cache_ide3_appl_data_size],eax
|
|
add ebx,edx
|
|
mov [cache_ide3_data_pointer],ebx
|
|
|
|
cmp cl,10b
|
|
je .cd
|
|
push ecx
|
|
mov eax,[cache_ide3_system_data_size]
|
|
call calculate_for_hd
|
|
add eax,[cache_ide3_pointer]
|
|
mov [cache_ide3_system_data],eax
|
|
mov [cache_ide3_system_sad_size],ecx
|
|
|
|
push edi
|
|
mov edi,[cache_ide3_pointer]
|
|
call clear_ide_cache
|
|
pop edi
|
|
|
|
mov eax,[cache_ide3_appl_data_size]
|
|
call calculate_for_hd
|
|
add eax,[cache_ide3_data_pointer]
|
|
mov [cache_ide3_appl_data],eax
|
|
mov [cache_ide3_appl_sad_size],ecx
|
|
|
|
push edi
|
|
mov edi,[cache_ide3_data_pointer]
|
|
call clear_ide_cache
|
|
pop edi
|
|
|
|
pop ecx
|
|
ret
|
|
.cd:
|
|
push ecx
|
|
mov eax,[cache_ide3_system_data_size]
|
|
call calculate_for_cd
|
|
add eax,[cache_ide3_pointer]
|
|
mov [cache_ide3_system_data],eax
|
|
mov [cache_ide3_system_sad_size],ecx
|
|
|
|
push edi
|
|
mov edi,[cache_ide3_pointer]
|
|
call clear_ide_cache
|
|
pop edi
|
|
|
|
mov eax,[cache_ide3_appl_data_size]
|
|
call calculate_for_cd
|
|
add eax,[cache_ide3_data_pointer]
|
|
mov [cache_ide3_appl_data],eax
|
|
mov [cache_ide3_appl_sad_size],ecx
|
|
|
|
push edi
|
|
mov edi,[cache_ide3_data_pointer]
|
|
call clear_ide_cache
|
|
pop edi
|
|
|
|
pop ecx
|
|
ret
|
|
|
|
calculate_for_hd:
|
|
push eax
|
|
mov ebx,eax
|
|
shr eax,9
|
|
shl eax,3
|
|
sub ebx,eax
|
|
shr ebx,9
|
|
mov ecx,ebx
|
|
shl ebx,9
|
|
pop eax
|
|
sub eax,ebx
|
|
dec ecx
|
|
ret
|
|
|
|
calculate_for_cd:
|
|
push eax
|
|
mov ebx,eax
|
|
shr eax,11
|
|
shl eax,3
|
|
sub ebx,eax
|
|
shr ebx,11
|
|
mov ecx,ebx
|
|
shl ebx,11
|
|
pop eax
|
|
sub eax,ebx
|
|
dec ecx
|
|
ret
|
|
|
|
clear_ide_cache:
|
|
push eax
|
|
shl ecx,1
|
|
xor eax,eax
|
|
cld
|
|
rep stosd
|
|
pop eax
|
|
ret
|
|
|
|
end_get_cache:
|
|
; mov [cache_ide0_pointer],HD_CACHE
|
|
; mov [cache_ide0_system_data],HD_CACHE+65536
|
|
; mov [cache_ide0_system_sad_size],1919
|
|
popa |