Subversion Repositories Kolibri OS

Rev

Rev 709 | Rev 2288 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

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