Subversion Repositories Kolibri OS

Rev

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

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