Subversion Repositories Kolibri OS

Rev

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

  1. ;**************************************************************************
  2. ;
  3. ;   [cache_ide[X]_pointer]
  4. ;   or [cache_ide[X]_data_pointer]  first entry in cache list
  5. ;
  6. ;            +0   - lba sector
  7. ;            +4   - state of cache sector
  8. ;                   0 = empty
  9. ;                   1 = used for read  ( same as in hd )
  10. ;                   2 = used for write ( differs from hd )
  11. ;
  12. ;  [cache_ide[X]_system_data]
  13. ;  or [cache_ide[x]_appl_data] - cache entries
  14. ;
  15. ;**************************************************************************
  16. align 4
  17. write_cache:
  18. ;-----------------------------------------------------------
  19. ; write all changed sectors to disk
  20. ;-----------------------------------------------------------
  21.     push  eax ecx edx esi edi
  22.  
  23.     ; write difference ( 2 ) from cache to hd
  24.  
  25. ;    mov   ecx,cache_max
  26. ;    mov   esi,HD_CACHE+8
  27.     call  calculate_cache
  28.     add   esi,8
  29.    
  30.     mov   edi,1
  31.  
  32.   write_cache_more:
  33.  
  34.     cmp   dword [esi+4],2       ; if cache slot is not different
  35.     jne   .write_chain
  36.  
  37.     mov   dword [esi+4],1       ; same as in hd
  38.     mov   eax,[esi]             ; eax = sector to write
  39.  
  40.     cmp   eax,[PARTITION_START]
  41.     jb    danger
  42.     cmp   eax,[PARTITION_END]
  43.     ja    danger
  44.  
  45. ; DMA write is permitted only if [allow_dma_access]=1
  46.         cmp     [allow_dma_access], 2
  47.         jae     .nodma
  48.         cmp     [dma_hdd], 1
  49.         jnz     .nodma
  50. ; Ž¡ê¥¤¨­ï¥¬ § ¯¨áì 楯®çª¨ ¯®á«¥¤®¢ â¥«ì­ëå ᥪâ®à®¢ ¢ ®¤­® ®¡à é¥­¨¥ ª ¤¨áªã
  51.         cmp     ecx, 1
  52.         jz      .nonext
  53.         cmp     dword [esi+8+4], 2
  54.         jnz     .nonext
  55.         push    eax
  56.         inc     eax
  57.         cmp     eax, [esi+8]
  58.         pop     eax
  59.         jnz     .nonext
  60.         cmp     [cache_chain_started], 1
  61.         jz      @f
  62.         mov     [cache_chain_started], 1
  63.         mov     [cache_chain_size], 0
  64.         mov     [cache_chain_pos], edi
  65.         mov     [cache_chain_ptr], esi
  66. @@:
  67.         inc     [cache_chain_size]
  68.         cmp     [cache_chain_size], 64
  69.         jnz     .continue
  70.         jmp     .write_chain
  71. .nonext:
  72.         call    flush_cache_chain
  73.         mov     [cache_chain_size], 1
  74.         mov     [cache_chain_ptr], esi
  75.         call    write_cache_sector
  76.         jmp     .continue
  77. .nodma:
  78.         call    cache_write_pio
  79. .write_chain:
  80.         call    flush_cache_chain
  81.  
  82. .continue:
  83.   danger:
  84.  
  85.     add   esi,8
  86.     inc   edi
  87.     dec   ecx
  88.     jnz   write_cache_more
  89.         call    flush_cache_chain
  90.  return_02:
  91.     pop   edi esi edx ecx eax
  92.     ret
  93.  
  94. flush_cache_chain:
  95.         cmp     [cache_chain_started], 0
  96.         jz      @f
  97.         call    write_cache_chain
  98.         mov     [cache_chain_started], 0
  99. @@:
  100.         ret
  101.        
  102.  
  103. align 4
  104. find_empty_slot:
  105. ;-----------------------------------------------------------
  106. ; find empty or read slot, flush cache if next 10% is used by write
  107. ; output : edi = cache slot
  108. ;-----------------------------------------------------------
  109. ;    push  ecx esi
  110.  
  111.   search_again:
  112.  
  113. ;    mov   ecx,cache_max*10/100
  114. ;    mov   edi,[cache_search_start]
  115.     call  calculate_cache_3
  116. ;    push  eax edx
  117. ;    mov   eax,ecx
  118. ;    mov   ecx,10
  119. ;    xor   edx,edx
  120. ;    div  ecx
  121. ;    mov   ecx,eax
  122. ;    pop   edx eax
  123.     shr   ecx,3    
  124.   search_for_empty:
  125.  
  126.     inc   edi
  127. ;    cmp   edi,cache_max
  128. ;    push   eax
  129.     call  calculate_cache_4
  130. ;    cmp   edi,eax
  131. ;    pop   eax
  132.     jbe   inside_cache
  133.     mov   edi,1
  134.  
  135.   inside_cache:
  136.  
  137. ;    cmp   dword [edi*8+HD_CACHE+4],2    ; get cache slot info
  138.     push   esi
  139.     call  calculate_cache_1
  140.     cmp   dword [edi*8+esi+4],2
  141.     pop   esi
  142.     jb    found_slot                    ; it's empty or read
  143.     dec   ecx
  144.     jnz   search_for_empty
  145.  
  146.     call  write_cache                   ; no empty slots found, write all
  147.     cmp   [hd_error],0
  148.     jne   found_slot_access_denied
  149.  
  150.     jmp   search_again                  ; and start again
  151.  
  152.   found_slot:
  153.  
  154. ;    mov   [cache_search_start],edi
  155.     call  calculate_cache_5
  156.   found_slot_access_denied:
  157.     ret
  158.  
  159. align 4
  160. clear_hd_cache:
  161. ;    push  eax ecx edi
  162. ;    mov   edi, HD_CACHE
  163. ;    mov   ecx,16384
  164. ;    xor   eax,eax
  165. ;    cld
  166. ;    rep   stosd                 ; clear hd cache with 0
  167. ;    mov   [cache_search_start],eax
  168.     mov   [fat_in_cache],-1
  169.     mov   [fat_change],0
  170. ;    pop   edi ecx eax
  171.     ret
  172.    
  173. ;--------------------------------------------------------------------
  174. align 4
  175. calculate_cache:
  176. ;    mov   ecx,cache_max         ; entries in cache
  177. ;    mov   esi,HD_CACHE+8
  178.  
  179. ; 1 - IDE0 ... 4 - IDE3
  180. .ide0:
  181.     cmp    [hdpos],1
  182.     jne    .ide1
  183.     cmp    [hdd_appl_data],0
  184.     jne    .ide0_appl_data
  185.     mov    ecx,[cache_ide0_system_sad_size]
  186.     mov    esi,[cache_ide0_pointer]
  187.     ret
  188. .ide0_appl_data:
  189.     mov    ecx,[cache_ide0_appl_sad_size]
  190.     mov    esi,[cache_ide0_data_pointer]
  191.     ret
  192. .ide1:
  193.     cmp    [hdpos],2
  194.     jne    .ide2
  195.     cmp    [hdd_appl_data],0
  196.     jne    .ide1_appl_data
  197.     mov    ecx,[cache_ide1_system_sad_size]
  198.     mov    esi,[cache_ide1_pointer]
  199.     ret
  200. .ide1_appl_data:
  201.     mov    ecx,[cache_ide1_appl_sad_size]
  202.     mov    esi,[cache_ide1_data_pointer]
  203.     ret
  204. .ide2:
  205.     cmp    [hdpos],3
  206.     jne    .ide3
  207.     cmp    [hdd_appl_data],0
  208.     jne    .ide2_appl_data
  209.     mov    ecx,[cache_ide2_system_sad_size]
  210.     mov    esi,[cache_ide2_pointer]    
  211.     ret
  212. .ide2_appl_data:
  213.     mov    ecx,[cache_ide2_appl_sad_size]
  214.     mov    esi,[cache_ide2_data_pointer]
  215.     ret
  216. .ide3:
  217.     cmp    [hdd_appl_data],0
  218.     jne    .ide3_appl_data
  219.     mov    ecx,[cache_ide3_system_sad_size]
  220.     mov    esi,[cache_ide3_pointer]      
  221.     ret
  222. .ide3_appl_data:
  223.     mov    ecx,[cache_ide3_appl_sad_size]
  224.     mov    esi,[cache_ide3_data_pointer]
  225.     ret
  226. ;--------------------------------------------------------------------
  227. align 4
  228. calculate_cache_1:
  229. ;    lea   esi,[edi*8+HD_CACHE]
  230. ; 1 - IDE0 ... 4 - IDE3
  231. .ide0:
  232.     cmp    [hdpos],1
  233.     jne    .ide1
  234.     cmp    [hdd_appl_data],0
  235.     jne    .ide0_appl_data
  236.     mov    esi,[cache_ide0_pointer]
  237.     ret
  238. .ide0_appl_data:
  239.     mov    esi,[cache_ide0_data_pointer]
  240.     ret
  241. .ide1:
  242.     cmp    [hdpos],2
  243.     jne    .ide2
  244.     cmp    [hdd_appl_data],0
  245.     jne    .ide1_appl_data
  246.     mov    esi,[cache_ide1_pointer]
  247.     ret
  248. .ide1_appl_data:
  249.     mov    esi,[cache_ide1_data_pointer]
  250.     ret
  251. .ide2:
  252.     cmp    [hdpos],3
  253.     jne    .ide3
  254.     cmp    [hdd_appl_data],0
  255.     jne    .ide2_appl_data
  256.     mov    esi,[cache_ide2_pointer]
  257.     ret
  258. .ide2_appl_data:
  259.     mov    esi,[cache_ide2_data_pointer]
  260.     ret
  261. .ide3:
  262.     cmp    [hdd_appl_data],0
  263.     jne    .ide3_appl_data
  264.     mov    esi,[cache_ide3_pointer]    
  265.     ret
  266. .ide3_appl_data:
  267.     mov    esi,[cache_ide3_data_pointer]
  268.     ret
  269. ;--------------------------------------------------------------------
  270. align 4
  271. calculate_cache_2:
  272. ;    add   esi,HD_CACHE+65536
  273. ; 1 - IDE0 ... 4 - IDE3
  274. .ide0:
  275.     cmp    [hdpos],1
  276.     jne    .ide1
  277.     cmp    [hdd_appl_data],0
  278.     jne    .ide0_appl_data
  279.     mov    eax,[cache_ide0_system_data]    
  280.     ret
  281. .ide0_appl_data:
  282.     mov    eax,[cache_ide0_appl_data]
  283.     ret
  284. .ide1:
  285.     cmp    [hdpos],2
  286.     jne    .ide2
  287.     cmp    [hdd_appl_data],0
  288.     jne    .ide1_appl_data
  289.     mov    eax,[cache_ide1_system_data]
  290.     ret
  291. .ide1_appl_data:
  292.     mov    eax,[cache_ide1_appl_data]
  293.     ret
  294. .ide2:
  295.     cmp    [hdpos],3
  296.     jne    .ide3
  297.     cmp    [hdd_appl_data],0
  298.     jne    .ide2_appl_data
  299.     mov    eax,[cache_ide2_system_data]
  300.     ret
  301. .ide2_appl_data:
  302.     mov    eax,[cache_ide2_appl_data]
  303.     ret
  304. .ide3:
  305.     cmp    [hdd_appl_data],0
  306.     jne    .ide3_appl_data
  307.     mov    eax,[cache_ide3_system_data]    
  308.     ret
  309. .ide3_appl_data:
  310.     mov    eax,[cache_ide3_appl_data]
  311.     ret
  312. ;--------------------------------------------------------------------
  313. align 4
  314. calculate_cache_3:
  315. ;    mov   ecx,cache_max*10/100
  316. ;    mov   edi,[cache_search_start]
  317.  
  318. ; 1 - IDE0 ... 4 - IDE3
  319. .ide0:
  320.     cmp    [hdpos],1
  321.     jne    .ide1
  322.     cmp    [hdd_appl_data],0
  323.     jne    .ide0_appl_data
  324.     mov    ecx,[cache_ide0_system_sad_size]
  325.     mov    edi,[cache_ide0_search_start]
  326.     ret
  327. .ide0_appl_data:
  328.     mov    ecx,[cache_ide0_appl_sad_size]
  329.     mov    edi,[cache_ide0_appl_search_start]
  330.     ret
  331. .ide1:
  332.     cmp    [hdpos],2
  333.     jne    .ide2
  334.     cmp    [hdd_appl_data],0
  335.     jne    .ide1_appl_data
  336.     mov    ecx,[cache_ide1_system_sad_size]
  337.     mov    edi,[cache_ide1_search_start]
  338.     ret
  339. .ide1_appl_data:
  340.     mov    ecx,[cache_ide1_appl_sad_size]
  341.     mov    edi,[cache_ide1_appl_search_start]
  342.     ret
  343. .ide2:
  344.     cmp    [hdpos],3
  345.     jne    .ide3
  346.     cmp    [hdd_appl_data],0
  347.     jne    .ide2_appl_data
  348.     mov    ecx,[cache_ide2_system_sad_size]
  349.     mov    edi,[cache_ide2_search_start]    
  350.     ret
  351. .ide2_appl_data:
  352.     mov    ecx,[cache_ide2_appl_sad_size]
  353.     mov    edi,[cache_ide2_appl_search_start]
  354.     ret
  355. .ide3:
  356.     cmp    [hdd_appl_data],0
  357.     jne    .ide3_appl_data
  358.     mov    ecx,[cache_ide3_system_sad_size]
  359.     mov    edi,[cache_ide3_search_start]      
  360.     ret
  361. .ide3_appl_data:
  362.     mov    ecx,[cache_ide3_appl_sad_size]
  363.     mov    edi,[cache_ide3_appl_search_start]
  364.     ret
  365. ;--------------------------------------------------------------------
  366. align 4
  367. calculate_cache_4:
  368. ;    cmp   edi,cache_max
  369. ; 1 - IDE0 ... 4 - IDE3
  370. .ide0:
  371.     cmp    [hdpos],1
  372.     jne    .ide1
  373.     cmp    [hdd_appl_data],0
  374.     jne    .ide0_appl_data
  375.     cmp   edi,[cache_ide0_system_sad_size]
  376.     ret
  377. .ide0_appl_data:
  378.     cmp   edi,[cache_ide0_appl_sad_size]
  379.     ret
  380. .ide1:
  381.     cmp    [hdpos],2
  382.     jne    .ide2
  383.     cmp    [hdd_appl_data],0
  384.     jne    .ide1_appl_data
  385.     cmp   edi,[cache_ide1_system_sad_size]
  386.     ret
  387. .ide1_appl_data:
  388.     cmp   edi,[cache_ide1_appl_sad_size]
  389.     ret
  390. .ide2:
  391.     cmp    [hdpos],3
  392.     jne    .ide3
  393.     cmp    [hdd_appl_data],0
  394.     jne    .ide2_appl_data
  395.     cmp   edi,[cache_ide2_system_sad_size]
  396.     ret
  397. .ide2_appl_data:
  398.     cmp   edi,[cache_ide2_appl_sad_size]
  399.     ret
  400. .ide3:
  401.     cmp    [hdd_appl_data],0
  402.     jne    .ide3_appl_data
  403.     cmp   edi,[cache_ide3_system_sad_size]
  404.     ret
  405. .ide3_appl_data:
  406.     cmp   edi,[cache_ide3_appl_sad_size]
  407.     ret
  408. ;--------------------------------------------------------------------
  409. align 4
  410. calculate_cache_5:
  411. ;    mov   [cache_search_start],edi
  412. ; 1 - IDE0 ... 4 - IDE3
  413. .ide0:
  414.     cmp    [hdpos],1
  415.     jne    .ide1
  416.     cmp    [hdd_appl_data],0
  417.     jne    .ide0_appl_data
  418.     mov   [cache_ide0_search_start],edi    
  419.     ret
  420. .ide0_appl_data:
  421.     mov   [cache_ide0_appl_search_start],edi
  422.     ret
  423. .ide1:
  424.     cmp    [hdpos],2
  425.     jne    .ide2
  426.     cmp    [hdd_appl_data],0
  427.     jne    .ide1_appl_data
  428.     mov   [cache_ide1_search_start],edi
  429.     ret
  430. .ide1_appl_data:
  431.     mov   [cache_ide1_appl_search_start],edi
  432.     ret
  433. .ide2:
  434.     cmp    [hdpos],3
  435.     jne    .ide3
  436.     cmp    [hdd_appl_data],0
  437.     jne    .ide2_appl_data
  438.     mov   [cache_ide2_search_start],edi
  439.     ret
  440. .ide2_appl_data:
  441.     mov   [cache_ide2_appl_search_start],edi
  442.     ret
  443. .ide3:
  444.     cmp    [hdd_appl_data],0
  445.     jne    .ide3_appl_data
  446.     mov   [cache_ide3_search_start],edi    
  447.     ret
  448. .ide3_appl_data:
  449.     mov   [cache_ide3_appl_search_start],edi
  450.     ret
  451. ;--------------------------------------------------------------------
  452. align 4
  453. calculate_linear_to_real:
  454.     shr eax, 12
  455.     mov eax, [page_tabs+eax*4]
  456.     and eax, 0xFFFFF000
  457.     ret
  458.