Subversion Repositories Kolibri OS

Rev

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