Subversion Repositories Kolibri OS

Rev

Rev 750 | 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: 1150 $
  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.     push ecx
  74.     movsx ecx,byte [BiosDisksData+ecx*4+2]
  75.     inc ecx
  76.     jz  .getbd
  77.     add ecx,ecx
  78.     movzx eax,byte [DRIVE_DATA+1]
  79.     shl eax,cl
  80.     and ah,3
  81.     cmp ah,1
  82.     jz  .contbd
  83.     pop ecx
  84.     mov byte [BiosDisksData+ecx*4+2], -1
  85.     push ecx
  86. .getbd:
  87.     mov eax,[cache_ide0_size]
  88.     mov [esi+cache_ide0_size-cache_ide0],eax
  89.     mov  cl,1
  90.     call get_cache_ide
  91. .contbd:
  92.     pop  ecx
  93.     add  esi,cache_ide1-cache_ide0
  94.     inc  ecx
  95.     cmp  ecx,[NumBiosDisks]
  96.     jb   .loopbd
  97. .endbd:
  98.     jmp  end_get_cache
  99.  
  100. get_cache_ide:
  101.     and  [esi+cache_ide0_search_start-cache_ide0],0
  102.     and  [esi+cache_ide0_appl_search_start-cache_ide0],0
  103.     push  ecx
  104.     stdcall kernel_alloc,[esi+cache_ide0_size-cache_ide0]
  105.     mov [esi+cache_ide0_pointer-cache_ide0],eax
  106.     pop   ecx
  107.     mov  edx,eax
  108.     mov  eax,[esi+cache_ide0_size-cache_ide0]
  109.     shr  eax,3
  110.     mov  [esi+cache_ide0_system_data_size-cache_ide0],eax
  111.     mov  ebx,eax
  112.     imul eax,7
  113.     mov  [esi+cache_ide0_appl_data_size-cache_ide0],eax
  114.     add  ebx,edx
  115.     mov  [esi+cache_ide0_data_pointer-cache_ide0],ebx
  116.  
  117.     cmp cl,10b
  118.     je  .cd
  119.     push ecx
  120.     mov  eax,[esi+cache_ide0_system_data_size-cache_ide0]
  121.     call calculate_for_hd
  122.     add  eax,[esi+cache_ide0_pointer-cache_ide0]
  123.     mov  [esi+cache_ide0_system_data-cache_ide0],eax
  124.     mov  [esi+cache_ide0_system_sad_size-cache_ide0],ecx
  125.  
  126.     push  edi
  127.     mov   edi,[esi+cache_ide0_pointer-cache_ide0]
  128.     call  clear_ide_cache
  129.     pop   edi
  130.  
  131.     mov  eax,[esi+cache_ide0_appl_data_size-cache_ide0]
  132.     call calculate_for_hd
  133.     add  eax,[esi+cache_ide0_data_pointer-cache_ide0]
  134.     mov  [esi+cache_ide0_appl_data-cache_ide0],eax
  135.     mov  [esi+cache_ide0_appl_sad_size-cache_ide0],ecx
  136.  
  137.     push  edi
  138.     mov   edi,[esi+cache_ide0_data_pointer-cache_ide0]
  139.     call  clear_ide_cache
  140.     pop   edi
  141.  
  142.     pop  ecx
  143.     ret
  144. .cd:
  145.     push ecx
  146.     mov  eax,[esi+cache_ide0_system_data_size-cache_ide0]
  147.     call calculate_for_cd
  148.     add  eax,[esi+cache_ide0_pointer-cache_ide0]
  149.     mov  [esi+cache_ide0_system_data-cache_ide0],eax
  150.     mov  [esi+cache_ide0_system_sad_size-cache_ide0],ecx
  151.  
  152.     push  edi
  153.     mov   edi,[esi+cache_ide0_pointer-cache_ide0]
  154.     call  clear_ide_cache
  155.     pop   edi
  156.  
  157.     mov  eax,[esi+cache_ide0_appl_data_size-cache_ide0]
  158.     call calculate_for_cd
  159.     add  eax,[esi+cache_ide0_data_pointer-cache_ide0]
  160.     mov  [esi+cache_ide0_appl_data-cache_ide0],eax
  161.     mov  [esi+cache_ide0_appl_sad_size-cache_ide0],ecx
  162.  
  163.     push  edi
  164.     mov   edi,[esi+cache_ide0_data_pointer-cache_ide0]
  165.     call  clear_ide_cache
  166.     pop   edi
  167.  
  168.     pop  ecx
  169.     ret
  170.  
  171. calculate_for_hd:
  172.     push eax
  173.     mov  ebx,eax
  174.     shr  eax,9
  175.     shl  eax,3
  176.     sub  ebx,eax
  177.     shr  ebx,9
  178.     mov  ecx,ebx
  179.     shl  ebx,9
  180.     pop  eax
  181.     sub  eax,ebx
  182.     dec  ecx
  183.     ret
  184.  
  185. calculate_for_cd:
  186.     push eax
  187.     mov  ebx,eax
  188.     shr  eax,11
  189.     shl  eax,3
  190.     sub  ebx,eax
  191.     shr  ebx,11
  192.     mov  ecx,ebx
  193.     shl  ebx,11
  194.     pop  eax
  195.     sub  eax,ebx
  196.     dec  ecx
  197.     ret
  198.  
  199. clear_ide_cache:
  200.     push   eax
  201.     shl   ecx,1
  202.     xor   eax,eax
  203.     cld
  204.     rep   stosd
  205.     pop   eax
  206.     ret
  207.  
  208. end_get_cache:
  209. ;    mov  [cache_ide0_pointer],HD_CACHE
  210. ;    mov  [cache_ide0_system_data],HD_CACHE+65536
  211. ;    mov  [cache_ide0_system_sad_size],1919
  212.     popa