Subversion Repositories Kolibri OS

Rev

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

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                              ;;
  3. ;; Copyright (C) KolibriOS team 2004-2011. All rights reserved. ;;
  4. ;; Distributed under terms of the GNU General Public License    ;;
  5. ;;                                                              ;;
  6. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  7.  
  8. ;**************************************************************************
  9. ;
  10. ;   [cache_ide[X]_pointer]
  11. ;   or [cache_ide[X]_data_pointer]  first entry in cache list
  12. ;
  13. ;            +0   - lba sector
  14. ;            +4   - state of cache sector
  15. ;                   0 = empty
  16. ;                   1 = used for read  ( same as in hd )
  17. ;                   2 = used for write ( differs from hd )
  18. ;
  19. ;  [cache_ide[X]_system_data]
  20. ;  or [cache_ide[x]_appl_data] - cache entries
  21. ;
  22. ;**************************************************************************
  23.  
  24. $Revision: 2643 $
  25.  
  26.  
  27. align 4
  28. write_cache:
  29. ;-----------------------------------------------------------
  30. ; write all changed sectors to disk
  31. ;-----------------------------------------------------------
  32.         push    eax ecx edx esi edi
  33.  
  34.     ; write difference ( 2 ) from cache to hd
  35.         call    calculate_cache
  36.         add     esi, 8
  37.         mov     edi, 1
  38. write_cache_more:
  39.         cmp     dword [esi+4], 2; if cache slot is not different
  40.         jne     .write_chain
  41.         mov     dword [esi+4], 1; same as in hd
  42.         mov     eax, [esi]      ; eax = sector to write
  43.         cmp     eax, [PARTITION_START]
  44.         jb      danger
  45.         cmp     eax, [PARTITION_END]
  46.         ja      danger
  47.         cmp     [hdpos], 0x80
  48.         jae     @f
  49. ; DMA write is permitted only if [allow_dma_access]=1
  50.         cmp     [allow_dma_access], 2
  51.         jae     .nodma
  52.         cmp     [dma_hdd], 1
  53.         jnz     .nodma
  54. @@:
  55. ; Объединяем запись цепочки последовательных секторов в одно обращение к диску
  56.         cmp     ecx, 1
  57.         jz      .nonext
  58.         cmp     dword [esi+8+4], 2
  59.         jnz     .nonext
  60.         push    eax
  61.         inc     eax
  62.         cmp     eax, [esi+8]
  63.         pop     eax
  64.         jnz     .nonext
  65.         cmp     [cache_chain_started], 1
  66.         jz      @f
  67.         mov     [cache_chain_started], 1
  68.         mov     [cache_chain_size], 0
  69.         mov     [cache_chain_pos], edi
  70.         mov     [cache_chain_ptr], esi
  71. @@:
  72.         inc     [cache_chain_size]
  73.         cmp     [cache_chain_size], 16
  74.         jnz     .continue
  75.         jmp     .write_chain
  76. .nonext:
  77.         call    flush_cache_chain
  78.         mov     [cache_chain_size], 1
  79.         mov     [cache_chain_ptr], esi
  80.         call    write_cache_sector
  81.         jmp     .continue
  82. .nodma:
  83.         call    cache_write_pio
  84. .write_chain:
  85.         call    flush_cache_chain
  86. .continue:
  87. danger:
  88.         add     esi, 8
  89.         inc     edi
  90.         dec     ecx
  91.         jnz     write_cache_more
  92.         call    flush_cache_chain
  93.  return_02:
  94.         pop     edi esi edx ecx eax
  95.         ret
  96.  
  97. flush_cache_chain:
  98.         cmp     [cache_chain_started], 0
  99.         jz      @f
  100.         call    write_cache_chain
  101.         mov     [cache_chain_started], 0
  102. @@:
  103.         ret
  104. ;--------------------------------------------------------------------
  105. align 4
  106. find_empty_slot:
  107. ;-----------------------------------------------------------
  108. ; find empty or read slot, flush cache if next 10% is used by write
  109. ; output : edi = cache slot
  110. ;-----------------------------------------------------------
  111. ;    push  ecx esi
  112.  
  113. search_again:
  114.         call    calculate_cache_3
  115.         shr     ecx, 3
  116. search_for_empty:
  117.         inc     edi
  118.         call    calculate_cache_4
  119.         jbe     inside_cache
  120.         mov     edi, 1
  121. inside_cache:
  122.         push    esi
  123.         call    calculate_cache_1
  124.         cmp     dword [edi*8+esi+4], 2
  125.         pop     esi
  126.         jb      found_slot              ; it's empty or read
  127.         dec     ecx
  128.         jnz     search_for_empty
  129.         call    write_cache             ; no empty slots found, write all
  130.         cmp     [hd_error], 0
  131.         jne     found_slot_access_denied
  132.         jmp     search_again            ; and start again
  133. found_slot:
  134.         call    calculate_cache_5
  135. found_slot_access_denied:
  136.         ret
  137. ;--------------------------------------------------------------------
  138. align 4
  139. clear_hd_cache:
  140.         ret
  141. ;--------------------------------------------------------------------
  142. align 4
  143. calculate_cache:
  144. ;    mov   ecx,cache_max         ; entries in cache
  145. ;    mov   esi,HD_CACHE+8
  146.  
  147. ; 1 - IDE0 ... 4 - IDE3
  148. .ide0:
  149.         cmp     [hdpos], 1
  150.         jne     .ide1
  151.         cmp     [hdd_appl_data], 0
  152.         jne     .ide0_appl_data
  153.         mov     ecx, [cache_ide0_system_sad_size]
  154.         mov     esi, [cache_ide0_pointer]
  155.         ret
  156. .ide0_appl_data:
  157.         mov     ecx, [cache_ide0_appl_sad_size]
  158.         mov     esi, [cache_ide0_data_pointer]
  159.         ret
  160. .ide1:
  161.         cmp     [hdpos], 2
  162.         jne     .ide2
  163.         cmp     [hdd_appl_data], 0
  164.         jne     .ide1_appl_data
  165.         mov     ecx, [cache_ide1_system_sad_size]
  166.         mov     esi, [cache_ide1_pointer]
  167.         ret
  168. .ide1_appl_data:
  169.         mov     ecx, [cache_ide1_appl_sad_size]
  170.         mov     esi, [cache_ide1_data_pointer]
  171.         ret
  172. .ide2:
  173.         cmp     [hdpos], 3
  174.         jne     .ide3
  175.         cmp     [hdd_appl_data], 0
  176.         jne     .ide2_appl_data
  177.         mov     ecx, [cache_ide2_system_sad_size]
  178.         mov     esi, [cache_ide2_pointer]
  179.         ret
  180. .ide2_appl_data:
  181.         mov     ecx, [cache_ide2_appl_sad_size]
  182.         mov     esi, [cache_ide2_data_pointer]
  183.         ret
  184. .ide3:
  185.         cmp     [hdpos], 4
  186.         jne     .noide
  187.         cmp     [hdd_appl_data], 0
  188.         jne     .ide3_appl_data
  189.         mov     ecx, [cache_ide3_system_sad_size]
  190.         mov     esi, [cache_ide3_pointer]
  191.         ret
  192. .ide3_appl_data:
  193.         mov     ecx, [cache_ide3_appl_sad_size]
  194.         mov     esi, [cache_ide3_data_pointer]
  195.         ret
  196. .noide:
  197.         push    eax
  198.         mov     eax, [hdpos]
  199.         sub     eax, 80h
  200.         cmp     byte [BiosDisksData+eax*4+2], -1
  201.         jz      @f
  202.         movzx   eax, byte [BiosDisksData+eax*4+2]
  203.         imul    eax, cache_ide1-cache_ide0
  204.         add     eax, cache_ide0
  205.         jmp     .get
  206. @@:
  207.         imul    eax, cache_ide1-cache_ide0
  208.         add     eax, BiosDiskCaches
  209. .get:
  210.         cmp     [hdd_appl_data], 0
  211.         jne     .bd_appl_data
  212.         mov     ecx, [cache_ide0_system_sad_size-cache_ide0+eax]
  213.         mov     esi, [cache_ide0_pointer-cache_ide0+eax]
  214.         pop     eax
  215.         ret
  216. .bd_appl_data:
  217.         mov     ecx, [cache_ide0_appl_sad_size-cache_ide0+eax]
  218.         mov     esi, [cache_ide0_data_pointer-cache_ide0+eax]
  219.         pop     eax
  220.         ret
  221. ;--------------------------------------------------------------------
  222. align 4
  223. calculate_cache_1:
  224. ;    lea   esi,[edi*8+HD_CACHE]
  225. ; 1 - IDE0 ... 4 - IDE3
  226. .ide0:
  227.         cmp     [hdpos], 1
  228.         jne     .ide1
  229.         cmp     [hdd_appl_data], 0
  230.         jne     .ide0_appl_data
  231.         mov     esi, [cache_ide0_pointer]
  232.         ret
  233. .ide0_appl_data:
  234.         mov     esi, [cache_ide0_data_pointer]
  235.         ret
  236. .ide1:
  237.         cmp     [hdpos], 2
  238.         jne     .ide2
  239.         cmp     [hdd_appl_data], 0
  240.         jne     .ide1_appl_data
  241.         mov     esi, [cache_ide1_pointer]
  242.         ret
  243. .ide1_appl_data:
  244.         mov     esi, [cache_ide1_data_pointer]
  245.         ret
  246. .ide2:
  247.         cmp     [hdpos], 3
  248.         jne     .ide3
  249.         cmp     [hdd_appl_data], 0
  250.         jne     .ide2_appl_data
  251.         mov     esi, [cache_ide2_pointer]
  252.         ret
  253. .ide2_appl_data:
  254.         mov     esi, [cache_ide2_data_pointer]
  255.         ret
  256. .ide3:
  257.         cmp     [hdpos], 4
  258.         jne     .noide
  259.         cmp     [hdd_appl_data], 0
  260.         jne     .ide3_appl_data
  261.         mov     esi, [cache_ide3_pointer]
  262.         ret
  263. .ide3_appl_data:
  264.         mov     esi, [cache_ide3_data_pointer]
  265.         ret
  266. .noide:
  267.         push    eax
  268.         mov     eax, [hdpos]
  269.         sub     eax, 80h
  270.         cmp     byte [BiosDisksData+eax*4+2], -1
  271.         jz      @f
  272.         movzx   eax, byte [BiosDisksData+eax*4+2]
  273.         imul    eax, cache_ide1-cache_ide0
  274.         add     eax, cache_ide0
  275.         jmp     .get
  276. @@:
  277.         imul    eax, cache_ide1-cache_ide0
  278.         add     eax, BiosDiskCaches
  279. .get:
  280.         cmp     [hdd_appl_data], 0
  281.         jne     .bd_appl_data
  282.         mov     esi, [cache_ide0_pointer-cache_ide0+eax]
  283.         pop     eax
  284.         ret
  285. .bd_appl_data:
  286.         mov     esi, [cache_ide0_data_pointer-cache_ide0+eax]
  287.         pop     eax
  288.         ret
  289.  
  290. ;--------------------------------------------------------------------
  291. align 4
  292. calculate_cache_2:
  293. ;    add   esi,HD_CACHE+65536
  294. ; 1 - IDE0 ... 4 - IDE3
  295. .ide0:
  296.         cmp     [hdpos], 1
  297.         jne     .ide1
  298.         cmp     [hdd_appl_data], 0
  299.         jne     .ide0_appl_data
  300.         mov     eax, [cache_ide0_system_data]
  301.         ret
  302. .ide0_appl_data:
  303.         mov     eax, [cache_ide0_appl_data]
  304.         ret
  305. .ide1:
  306.         cmp     [hdpos], 2
  307.         jne     .ide2
  308.         cmp     [hdd_appl_data], 0
  309.         jne     .ide1_appl_data
  310.         mov     eax, [cache_ide1_system_data]
  311.         ret
  312. .ide1_appl_data:
  313.         mov     eax, [cache_ide1_appl_data]
  314.         ret
  315. .ide2:
  316.         cmp     [hdpos], 3
  317.         jne     .ide3
  318.         cmp     [hdd_appl_data], 0
  319.         jne     .ide2_appl_data
  320.         mov     eax, [cache_ide2_system_data]
  321.         ret
  322. .ide2_appl_data:
  323.         mov     eax, [cache_ide2_appl_data]
  324.         ret
  325. .ide3:
  326.         cmp     [hdpos], 4
  327.         jne     .noide
  328.         cmp     [hdd_appl_data], 0
  329.         jne     .ide3_appl_data
  330.         mov     eax, [cache_ide3_system_data]
  331.         ret
  332. .ide3_appl_data:
  333.         mov     eax, [cache_ide3_appl_data]
  334.         ret
  335. .noide:
  336.         mov     eax, [hdpos]
  337.         sub     eax, 80h
  338.         cmp     byte [BiosDisksData+eax*4+2], -1
  339.         jz      @f
  340.         movzx   eax, byte [BiosDisksData+eax*4+2]
  341.         imul    eax, cache_ide1-cache_ide0
  342.         add     eax, cache_ide0
  343.         jmp     .get
  344. @@:
  345.         imul    eax, cache_ide1-cache_ide0
  346.         add     eax, BiosDiskCaches
  347. .get:
  348.         cmp     [hdd_appl_data], 0
  349.         jne     .bd_appl_data
  350.         mov     eax, [cache_ide0_system_data-cache_ide0+eax]
  351.         ret
  352. .bd_appl_data:
  353.         mov     eax, [cache_ide0_appl_data-cache_ide0+eax]
  354.         ret
  355. ;--------------------------------------------------------------------
  356. align 4
  357. calculate_cache_3:
  358. ;    mov   ecx,cache_max*10/100
  359. ;    mov   edi,[cache_search_start]
  360.  
  361. ; 1 - IDE0 ... 4 - IDE3
  362. .ide0:
  363.         cmp     [hdpos], 1
  364.         jne     .ide1
  365.         cmp     [hdd_appl_data], 0
  366.         jne     .ide0_appl_data
  367.         mov     ecx, [cache_ide0_system_sad_size]
  368.         mov     edi, [cache_ide0_search_start]
  369.         ret
  370. .ide0_appl_data:
  371.         mov     ecx, [cache_ide0_appl_sad_size]
  372.         mov     edi, [cache_ide0_appl_search_start]
  373.         ret
  374. .ide1:
  375.         cmp     [hdpos], 2
  376.         jne     .ide2
  377.         cmp     [hdd_appl_data], 0
  378.         jne     .ide1_appl_data
  379.         mov     ecx, [cache_ide1_system_sad_size]
  380.         mov     edi, [cache_ide1_search_start]
  381.         ret
  382. .ide1_appl_data:
  383.         mov     ecx, [cache_ide1_appl_sad_size]
  384.         mov     edi, [cache_ide1_appl_search_start]
  385.         ret
  386. .ide2:
  387.         cmp     [hdpos], 3
  388.         jne     .ide3
  389.         cmp     [hdd_appl_data], 0
  390.         jne     .ide2_appl_data
  391.         mov     ecx, [cache_ide2_system_sad_size]
  392.         mov     edi, [cache_ide2_search_start]
  393.         ret
  394. .ide2_appl_data:
  395.         mov     ecx, [cache_ide2_appl_sad_size]
  396.         mov     edi, [cache_ide2_appl_search_start]
  397.         ret
  398. .ide3:
  399.         cmp     [hdpos], 4
  400.         jne     .noide
  401.         cmp     [hdd_appl_data], 0
  402.         jne     .ide3_appl_data
  403.         mov     ecx, [cache_ide3_system_sad_size]
  404.         mov     edi, [cache_ide3_search_start]
  405.         ret
  406. .ide3_appl_data:
  407.         mov     ecx, [cache_ide3_appl_sad_size]
  408.         mov     edi, [cache_ide3_appl_search_start]
  409.         ret
  410. .noide:
  411.         push    eax
  412.         mov     eax, [hdpos]
  413.         sub     eax, 80h
  414.         cmp     byte [BiosDisksData+eax*4+2], -1
  415.         jz      @f
  416.         movzx   eax, byte [BiosDisksData+eax*4+2]
  417.         imul    eax, cache_ide1-cache_ide0
  418.         add     eax, cache_ide0
  419.         jmp     .get
  420. @@:
  421.         imul    eax, cache_ide1-cache_ide0
  422.         add     eax, BiosDiskCaches
  423. .get:
  424.         cmp     [hdd_appl_data], 0
  425.         jne     .bd_appl_data
  426.         mov     ecx, [cache_ide0_system_sad_size-cache_ide0+eax]
  427.         mov     edi, [cache_ide0_search_start-cache_ide0+eax]
  428.         pop     eax
  429.         ret
  430. .bd_appl_data:
  431.         mov     ecx, [cache_ide0_appl_sad_size-cache_ide0+eax]
  432.         mov     edi, [cache_ide0_appl_search_start-cache_ide0+eax]
  433.         pop     eax
  434.         ret
  435. ;--------------------------------------------------------------------
  436. align 4
  437. calculate_cache_4:
  438. ;    cmp   edi,cache_max
  439. ; 1 - IDE0 ... 4 - IDE3
  440. .ide0:
  441.         cmp     [hdpos], 1
  442.         jne     .ide1
  443.         cmp     [hdd_appl_data], 0
  444.         jne     .ide0_appl_data
  445.         cmp     edi, [cache_ide0_system_sad_size]
  446.         ret
  447. .ide0_appl_data:
  448.         cmp     edi, [cache_ide0_appl_sad_size]
  449.         ret
  450. .ide1:
  451.         cmp     [hdpos], 2
  452.         jne     .ide2
  453.         cmp     [hdd_appl_data], 0
  454.         jne     .ide1_appl_data
  455.         cmp     edi, [cache_ide1_system_sad_size]
  456.         ret
  457. .ide1_appl_data:
  458.         cmp     edi, [cache_ide1_appl_sad_size]
  459.         ret
  460. .ide2:
  461.         cmp     [hdpos], 3
  462.         jne     .ide3
  463.         cmp     [hdd_appl_data], 0
  464.         jne     .ide2_appl_data
  465.         cmp     edi, [cache_ide2_system_sad_size]
  466.         ret
  467. .ide2_appl_data:
  468.         cmp     edi, [cache_ide2_appl_sad_size]
  469.         ret
  470. .ide3:
  471.         cmp     [hdpos], 4
  472.         jne     .noide
  473.         cmp     [hdd_appl_data], 0
  474.         jne     .ide3_appl_data
  475.         cmp     edi, [cache_ide3_system_sad_size]
  476.         ret
  477. .ide3_appl_data:
  478.         cmp     edi, [cache_ide3_appl_sad_size]
  479.         ret
  480. .noide:
  481.         push    eax
  482.         mov     eax, [hdpos]
  483.         sub     eax, 80h
  484.         cmp     byte [BiosDisksData+eax*4+2], -1
  485.         jz      @f
  486.         movzx   eax, byte [BiosDisksData+eax*4+2]
  487.         imul    eax, cache_ide1-cache_ide0
  488.         add     eax, cache_ide0
  489.         jmp     .get
  490. @@:
  491.         imul    eax, cache_ide1-cache_ide0
  492.         add     eax, BiosDiskCaches
  493. .get:
  494.         cmp     [hdd_appl_data], 0
  495.         jne     .bd_appl_data
  496.         cmp     edi, [cache_ide0_system_sad_size-cache_ide0+eax]
  497.         pop     eax
  498.         ret
  499. .bd_appl_data:
  500.         cmp     edi, [cache_ide0_appl_sad_size-cache_ide0+eax]
  501.         pop     eax
  502.         ret
  503.  
  504. ;--------------------------------------------------------------------
  505. align 4
  506. calculate_cache_5:
  507. ;    mov   [cache_search_start],edi
  508. ; 1 - IDE0 ... 4 - IDE3
  509. .ide0:
  510.         cmp     [hdpos], 1
  511.         jne     .ide1
  512.         cmp     [hdd_appl_data], 0
  513.         jne     .ide0_appl_data
  514.         mov     [cache_ide0_search_start], edi
  515.         ret
  516. .ide0_appl_data:
  517.         mov     [cache_ide0_appl_search_start], edi
  518.         ret
  519. .ide1:
  520.         cmp     [hdpos], 2
  521.         jne     .ide2
  522.         cmp     [hdd_appl_data], 0
  523.         jne     .ide1_appl_data
  524.         mov     [cache_ide1_search_start], edi
  525.         ret
  526. .ide1_appl_data:
  527.         mov     [cache_ide1_appl_search_start], edi
  528.         ret
  529. .ide2:
  530.         cmp     [hdpos], 3
  531.         jne     .ide3
  532.         cmp     [hdd_appl_data], 0
  533.         jne     .ide2_appl_data
  534.         mov     [cache_ide2_search_start], edi
  535.         ret
  536. .ide2_appl_data:
  537.         mov     [cache_ide2_appl_search_start], edi
  538.         ret
  539. .ide3:
  540.         cmp     [hdpos], 4
  541.         jne     .noide
  542.         cmp     [hdd_appl_data], 0
  543.         jne     .ide3_appl_data
  544.         mov     [cache_ide3_search_start], edi
  545.         ret
  546. .ide3_appl_data:
  547.         mov     [cache_ide3_appl_search_start], edi
  548.         ret
  549. .noide:
  550.         push    eax
  551.         mov     eax, [hdpos]
  552.         sub     eax, 80h
  553.         cmp     byte [BiosDisksData+eax*4+2], -1
  554.         jz      @f
  555.         movzx   eax, byte [BiosDisksData+eax*4+2]
  556.         imul    eax, cache_ide1-cache_ide0
  557.         add     eax, cache_ide0
  558.         jmp     .get
  559. @@:
  560.         imul    eax, cache_ide1-cache_ide0
  561.         add     eax, BiosDiskCaches
  562. .get:
  563.         cmp     [hdd_appl_data], 0
  564.         jne     .bd_appl_data
  565.         mov     [cache_ide0_search_start-cache_ide0+eax], edi
  566.         pop     eax
  567.         ret
  568. .bd_appl_data:
  569.         mov     [cache_ide0_appl_search_start-cache_ide0+eax], edi
  570.         pop     eax
  571.         ret
  572.  
  573. ;--------------------------------------------------------------------
  574. align 4
  575. find_empty_slot_CD_cache:
  576. ;-----------------------------------------------------------
  577. ; find empty or read slot, flush cache if next 10% is used by write
  578. ; output : edi = cache slot
  579. ;-----------------------------------------------------------
  580. .search_again:
  581.         call    cd_calculate_cache_3
  582. .search_for_empty:
  583.         inc     edi
  584.         call    cd_calculate_cache_4
  585.         jbe     .inside_cache
  586.         mov     edi, 1
  587. .inside_cache:
  588.         call    cd_calculate_cache_5
  589.         ret
  590. ;--------------------------------------------------------------------
  591. clear_CD_cache:
  592.         pusha
  593. .ide0:
  594.         xor     eax, eax
  595.         cmp     [cdpos], 1
  596.         jne     .ide1
  597.         mov     [cache_ide0_search_start], eax
  598.         mov     ecx, [cache_ide0_system_sad_size]
  599.         mov     edi, [cache_ide0_pointer]
  600.         call    .clear
  601.         mov     [cache_ide0_appl_search_start], eax
  602.         mov     ecx, [cache_ide0_appl_sad_size]
  603.         mov     edi, [cache_ide0_data_pointer]
  604.         jmp     .continue
  605. .ide1:
  606.         cmp     [cdpos], 2
  607.         jne     .ide2
  608.         mov     [cache_ide1_search_start], eax
  609.         mov     ecx, [cache_ide1_system_sad_size]
  610.         mov     edi, [cache_ide1_pointer]
  611.         call    .clear
  612.         mov     [cache_ide1_appl_search_start], eax
  613.         mov     ecx, [cache_ide1_appl_sad_size]
  614.         mov     edi, [cache_ide1_data_pointer]
  615.         jmp     .continue
  616. .ide2:
  617.         cmp     [cdpos], 3
  618.         jne     .ide3
  619.         mov     [cache_ide2_search_start], eax
  620.         mov     ecx, [cache_ide2_system_sad_size]
  621.         mov     edi, [cache_ide2_pointer]
  622.         call    .clear
  623.         mov     [cache_ide2_appl_search_start], eax
  624.         mov     ecx, [cache_ide2_appl_sad_size]
  625.         mov     edi, [cache_ide2_data_pointer]
  626.         jmp     .continue
  627. .ide3:
  628.         mov     [cache_ide3_search_start], eax
  629.         mov     ecx, [cache_ide3_system_sad_size]
  630.         mov     edi, [cache_ide3_pointer]
  631.         call    .clear
  632.         mov     [cache_ide3_appl_search_start], eax
  633.         mov     ecx, [cache_ide3_appl_sad_size]
  634.         mov     edi, [cache_ide3_data_pointer]
  635. .continue:
  636.         call    .clear
  637.         popa
  638.         ret
  639. .clear:
  640.         shl     ecx, 1
  641.         cld
  642.         rep stosd
  643.         ret
  644. ;--------------------------------------------------------------------
  645. align 4
  646. cd_calculate_cache:
  647. ;    mov   ecx,cache_max         ; entries in cache
  648. ;    mov   esi,HD_CACHE+8
  649.  
  650. ; 1 - IDE0 ... 4 - IDE3
  651. .ide0:
  652.         cmp     [cdpos], 1
  653.         jne     .ide1
  654.         cmp     [cd_appl_data], 0
  655.         jne     .ide0_appl_data
  656.         mov     ecx, [cache_ide0_system_sad_size]
  657.         mov     esi, [cache_ide0_pointer]
  658.         ret
  659. .ide0_appl_data:
  660.         mov     ecx, [cache_ide0_appl_sad_size]
  661.         mov     esi, [cache_ide0_data_pointer]
  662.         ret
  663. .ide1:
  664.         cmp     [cdpos], 2
  665.         jne     .ide2
  666.         cmp     [cd_appl_data], 0
  667.         jne     .ide1_appl_data
  668.         mov     ecx, [cache_ide1_system_sad_size]
  669.         mov     esi, [cache_ide1_pointer]
  670.         ret
  671. .ide1_appl_data:
  672.         mov     ecx, [cache_ide1_appl_sad_size]
  673.         mov     esi, [cache_ide1_data_pointer]
  674.         ret
  675. .ide2:
  676.         cmp     [cdpos], 3
  677.         jne     .ide3
  678.         cmp     [cd_appl_data], 0
  679.         jne     .ide2_appl_data
  680.         mov     ecx, [cache_ide2_system_sad_size]
  681.         mov     esi, [cache_ide2_pointer]
  682.         ret
  683. .ide2_appl_data:
  684.         mov     ecx, [cache_ide2_appl_sad_size]
  685.         mov     esi, [cache_ide2_data_pointer]
  686.         ret
  687. .ide3:
  688.         cmp     [cd_appl_data], 0
  689.         jne     .ide3_appl_data
  690.         mov     ecx, [cache_ide3_system_sad_size]
  691.         mov     esi, [cache_ide3_pointer]
  692.         ret
  693. .ide3_appl_data:
  694.         mov     ecx, [cache_ide3_appl_sad_size]
  695.         mov     esi, [cache_ide3_data_pointer]
  696.         ret
  697. ;--------------------------------------------------------------------
  698. align 4
  699. cd_calculate_cache_1:
  700. ;    lea   esi,[edi*8+HD_CACHE]
  701. ; 1 - IDE0 ... 4 - IDE3
  702. .ide0:
  703.         cmp     [cdpos], 1
  704.         jne     .ide1
  705.         cmp     [cd_appl_data], 0
  706.         jne     .ide0_appl_data
  707.         mov     esi, [cache_ide0_pointer]
  708.         ret
  709. .ide0_appl_data:
  710.         mov     esi, [cache_ide0_data_pointer]
  711.         ret
  712. .ide1:
  713.         cmp     [cdpos], 2
  714.         jne     .ide2
  715.         cmp     [cd_appl_data], 0
  716.         jne     .ide1_appl_data
  717.         mov     esi, [cache_ide1_pointer]
  718.         ret
  719. .ide1_appl_data:
  720.         mov     esi, [cache_ide1_data_pointer]
  721.         ret
  722. .ide2:
  723.         cmp     [cdpos], 3
  724.         jne     .ide3
  725.         cmp     [cd_appl_data], 0
  726.         jne     .ide2_appl_data
  727.         mov     esi, [cache_ide2_pointer]
  728.         ret
  729. .ide2_appl_data:
  730.         mov     esi, [cache_ide2_data_pointer]
  731.         ret
  732. .ide3:
  733.         cmp     [cd_appl_data], 0
  734.         jne     .ide3_appl_data
  735.         mov     esi, [cache_ide3_pointer]
  736.         ret
  737. .ide3_appl_data:
  738.         mov     esi, [cache_ide3_data_pointer]
  739.         ret
  740. ;--------------------------------------------------------------------
  741. align 4
  742. cd_calculate_cache_2:
  743. ;    add   esi,HD_CACHE+65536
  744. ; 1 - IDE0 ... 4 - IDE3
  745. .ide0:
  746.         cmp     [cdpos], 1
  747.         jne     .ide1
  748.         cmp     [cd_appl_data], 0
  749.         jne     .ide0_appl_data
  750.         mov     eax, [cache_ide0_system_data]
  751.         ret
  752. .ide0_appl_data:
  753.         mov     eax, [cache_ide0_appl_data]
  754.         ret
  755. .ide1:
  756.         cmp     [cdpos], 2
  757.         jne     .ide2
  758.         cmp     [cd_appl_data], 0
  759.         jne     .ide1_appl_data
  760.         mov     eax, [cache_ide1_system_data]
  761.         ret
  762. .ide1_appl_data:
  763.         mov     eax, [cache_ide1_appl_data]
  764.         ret
  765. .ide2:
  766.         cmp     [cdpos], 3
  767.         jne     .ide3
  768.         cmp     [cd_appl_data], 0
  769.         jne     .ide2_appl_data
  770.         mov     eax, [cache_ide2_system_data]
  771.         ret
  772. .ide2_appl_data:
  773.         mov     eax, [cache_ide2_appl_data]
  774.         ret
  775. .ide3:
  776.         cmp     [cd_appl_data], 0
  777.         jne     .ide3_appl_data
  778.         mov     eax, [cache_ide3_system_data]
  779.         ret
  780. .ide3_appl_data:
  781.         mov     eax, [cache_ide3_appl_data]
  782.         ret
  783. ;--------------------------------------------------------------------
  784. align 4
  785. cd_calculate_cache_3:
  786. ;    mov   ecx,cache_max*10/100
  787. ;    mov   edi,[cache_search_start]
  788.  
  789. ; 1 - IDE0 ... 4 - IDE3
  790. .ide0:
  791.         cmp     [cdpos], 1
  792.         jne     .ide1
  793.         cmp     [cd_appl_data], 0
  794.         jne     .ide0_appl_data
  795.         mov     edi, [cache_ide0_search_start]
  796.         ret
  797. .ide0_appl_data:
  798.         mov     edi, [cache_ide0_appl_search_start]
  799.         ret
  800. .ide1:
  801.         cmp     [cdpos], 2
  802.         jne     .ide2
  803.         cmp     [cd_appl_data], 0
  804.         jne     .ide1_appl_data
  805.         mov     edi, [cache_ide1_search_start]
  806.         ret
  807. .ide1_appl_data:
  808.         mov     edi, [cache_ide1_appl_search_start]
  809.         ret
  810. .ide2:
  811.         cmp     [cdpos], 3
  812.         jne     .ide3
  813.         cmp     [cd_appl_data], 0
  814.         jne     .ide2_appl_data
  815.         mov     edi, [cache_ide2_search_start]
  816.         ret
  817. .ide2_appl_data:
  818.         mov     edi, [cache_ide2_appl_search_start]
  819.         ret
  820. .ide3:
  821.         cmp     [cd_appl_data], 0
  822.         jne     .ide3_appl_data
  823.         mov     edi, [cache_ide3_search_start]
  824.         ret
  825. .ide3_appl_data:
  826.         mov     edi, [cache_ide3_appl_search_start]
  827.         ret
  828. ;--------------------------------------------------------------------
  829. align 4
  830. cd_calculate_cache_4:
  831. ;    cmp   edi,cache_max
  832. ; 1 - IDE0 ... 4 - IDE3
  833. .ide0:
  834.         cmp     [cdpos], 1
  835.         jne     .ide1
  836.         cmp     [cd_appl_data], 0
  837.         jne     .ide0_appl_data
  838.         cmp     edi, [cache_ide0_system_sad_size]
  839.         ret
  840. .ide0_appl_data:
  841.         cmp     edi, [cache_ide0_appl_sad_size]
  842.         ret
  843. .ide1:
  844.         cmp     [cdpos], 2
  845.         jne     .ide2
  846.         cmp     [cd_appl_data], 0
  847.         jne     .ide1_appl_data
  848.         cmp     edi, [cache_ide1_system_sad_size]
  849.         ret
  850. .ide1_appl_data:
  851.         cmp     edi, [cache_ide1_appl_sad_size]
  852.         ret
  853. .ide2:
  854.         cmp     [cdpos], 3
  855.         jne     .ide3
  856.         cmp     [cd_appl_data], 0
  857.         jne     .ide2_appl_data
  858.         cmp     edi, [cache_ide2_system_sad_size]
  859.         ret
  860. .ide2_appl_data:
  861.         cmp     edi, [cache_ide2_appl_sad_size]
  862.         ret
  863. .ide3:
  864.         cmp     [cd_appl_data], 0
  865.         jne     .ide3_appl_data
  866.         cmp     edi, [cache_ide3_system_sad_size]
  867.         ret
  868. .ide3_appl_data:
  869.         cmp     edi, [cache_ide3_appl_sad_size]
  870.         ret
  871. ;--------------------------------------------------------------------
  872. align 4
  873. cd_calculate_cache_5:
  874. ;    mov   [cache_search_start],edi
  875. ; 1 - IDE0 ... 4 - IDE3
  876. .ide0:
  877.         cmp     [cdpos], 1
  878.         jne     .ide1
  879.         cmp     [cd_appl_data], 0
  880.         jne     .ide0_appl_data
  881.         mov     [cache_ide0_search_start], edi
  882.         ret
  883. .ide0_appl_data:
  884.         mov     [cache_ide0_appl_search_start], edi
  885.         ret
  886. .ide1:
  887.         cmp     [cdpos], 2
  888.         jne     .ide2
  889.         cmp     [cd_appl_data], 0
  890.         jne     .ide1_appl_data
  891.         mov     [cache_ide1_search_start], edi
  892.         ret
  893. .ide1_appl_data:
  894.         mov     [cache_ide1_appl_search_start], edi
  895.         ret
  896. .ide2:
  897.         cmp     [cdpos], 3
  898.         jne     .ide3
  899.         cmp     [cd_appl_data], 0
  900.         jne     .ide2_appl_data
  901.         mov     [cache_ide2_search_start], edi
  902.         ret
  903. .ide2_appl_data:
  904.         mov     [cache_ide2_appl_search_start], edi
  905.         ret
  906. .ide3:
  907.         cmp     [cd_appl_data], 0
  908.         jne     .ide3_appl_data
  909.         mov     [cache_ide3_search_start], edi
  910.         ret
  911. .ide3_appl_data:
  912.         mov     [cache_ide3_appl_search_start], edi
  913.         ret
  914. ;--------------------------------------------------------------------
  915. ;align 4
  916. ;calculate_linear_to_real:
  917. ;    shr eax, 12
  918. ;    mov eax, [page_tabs+eax*4]
  919. ;    and eax, 0xFFFFF000
  920. ;    ret
  921.