Subversion Repositories Kolibri OS

Rev

Rev 859 | 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: 864 $
  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.     mov ecx, [esi+cache_ide0_size-cache_ide0]
  95.     mov edx, PG_SW
  96.     call @mem_alloc@8
  97.     mov [esi+cache_ide0_pointer-cache_ide0],eax
  98.     pop   ecx
  99.     mov  edx,eax
  100.     mov  eax,[esi+cache_ide0_size-cache_ide0]
  101.     shr  eax,3
  102.     mov  [esi+cache_ide0_system_data_size-cache_ide0],eax
  103.     mov  ebx,eax
  104.     imul eax,7
  105.     mov  [esi+cache_ide0_appl_data_size-cache_ide0],eax
  106.     add  ebx,edx
  107.     mov  [esi+cache_ide0_data_pointer-cache_ide0],ebx
  108.  
  109.     cmp cl,10b
  110.     je  .cd
  111.     push ecx
  112.     mov  eax,[esi+cache_ide0_system_data_size-cache_ide0]
  113.     call calculate_for_hd
  114.     add  eax,[esi+cache_ide0_pointer-cache_ide0]
  115.     mov  [esi+cache_ide0_system_data-cache_ide0],eax
  116.     mov  [esi+cache_ide0_system_sad_size-cache_ide0],ecx
  117.  
  118.     push  edi
  119.     mov   edi,[esi+cache_ide0_pointer-cache_ide0]
  120.     call  clear_ide_cache
  121.     pop   edi
  122.  
  123.     mov  eax,[esi+cache_ide0_appl_data_size-cache_ide0]
  124.     call calculate_for_hd
  125.     add  eax,[esi+cache_ide0_data_pointer-cache_ide0]
  126.     mov  [esi+cache_ide0_appl_data-cache_ide0],eax
  127.     mov  [esi+cache_ide0_appl_sad_size-cache_ide0],ecx
  128.  
  129.     push  edi
  130.     mov   edi,[esi+cache_ide0_data_pointer-cache_ide0]
  131.     call  clear_ide_cache
  132.     pop   edi
  133.  
  134.     pop  ecx
  135.     ret
  136. .cd:
  137.     push ecx
  138.     mov  eax,[esi+cache_ide0_system_data_size-cache_ide0]
  139.     call calculate_for_cd
  140.     add  eax,[esi+cache_ide0_pointer-cache_ide0]
  141.     mov  [esi+cache_ide0_system_data-cache_ide0],eax
  142.     mov  [esi+cache_ide0_system_sad_size-cache_ide0],ecx
  143.  
  144.     push  edi
  145.     mov   edi,[esi+cache_ide0_pointer-cache_ide0]
  146.     call  clear_ide_cache
  147.     pop   edi
  148.  
  149.     mov  eax,[esi+cache_ide0_appl_data_size-cache_ide0]
  150.     call calculate_for_cd
  151.     add  eax,[esi+cache_ide0_data_pointer-cache_ide0]
  152.     mov  [esi+cache_ide0_appl_data-cache_ide0],eax
  153.     mov  [esi+cache_ide0_appl_sad_size-cache_ide0],ecx
  154.  
  155.     push  edi
  156.     mov   edi,[esi+cache_ide0_data_pointer-cache_ide0]
  157.     call  clear_ide_cache
  158.     pop   edi
  159.  
  160.     pop  ecx
  161.     ret
  162.  
  163. calculate_for_hd:
  164.     push eax
  165.     mov  ebx,eax
  166.     shr  eax,9
  167.     shl  eax,3
  168.     sub  ebx,eax
  169.     shr  ebx,9
  170.     mov  ecx,ebx
  171.     shl  ebx,9
  172.     pop  eax
  173.     sub  eax,ebx
  174.     dec  ecx
  175.     ret
  176.  
  177. calculate_for_cd:
  178.     push eax
  179.     mov  ebx,eax
  180.     shr  eax,11
  181.     shl  eax,3
  182.     sub  ebx,eax
  183.     shr  ebx,11
  184.     mov  ecx,ebx
  185.     shl  ebx,11
  186.     pop  eax
  187.     sub  eax,ebx
  188.     dec  ecx
  189.     ret
  190.  
  191. clear_ide_cache:
  192.     push   eax
  193.     shl   ecx,1
  194.     xor   eax,eax
  195.     cld
  196.     rep   stosd
  197.     pop   eax
  198.     ret
  199.  
  200. end_get_cache:
  201. ;    mov  [cache_ide0_pointer],HD_CACHE
  202. ;    mov  [cache_ide0_system_data],HD_CACHE+65536
  203. ;    mov  [cache_ide0_system_sad_size],1919
  204.     popa
  205.