Subversion Repositories Kolibri OS

Rev

Rev 3555 | Rev 3908 | 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: 3725 $
  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. calculate_cache:
  140. ; 1 - IDE0 ... 4 - IDE3
  141. .ide0:
  142.         cmp     [hdpos], 1
  143.         jne     .ide1
  144.         cmp     [hdd_appl_data], 0
  145.         jne     .ide0_appl_data
  146.         mov     ecx, [cache_ide0_system_sad_size]
  147.         mov     esi, [cache_ide0_pointer]
  148.         ret
  149. .ide0_appl_data:
  150.         mov     ecx, [cache_ide0_appl_sad_size]
  151.         mov     esi, [cache_ide0_data_pointer]
  152.         ret
  153. .ide1:
  154.         cmp     [hdpos], 2
  155.         jne     .ide2
  156.         cmp     [hdd_appl_data], 0
  157.         jne     .ide1_appl_data
  158.         mov     ecx, [cache_ide1_system_sad_size]
  159.         mov     esi, [cache_ide1_pointer]
  160.         ret
  161. .ide1_appl_data:
  162.         mov     ecx, [cache_ide1_appl_sad_size]
  163.         mov     esi, [cache_ide1_data_pointer]
  164.         ret
  165. .ide2:
  166.         cmp     [hdpos], 3
  167.         jne     .ide3
  168.         cmp     [hdd_appl_data], 0
  169.         jne     .ide2_appl_data
  170.         mov     ecx, [cache_ide2_system_sad_size]
  171.         mov     esi, [cache_ide2_pointer]
  172.         ret
  173. .ide2_appl_data:
  174.         mov     ecx, [cache_ide2_appl_sad_size]
  175.         mov     esi, [cache_ide2_data_pointer]
  176.         ret
  177. .ide3:
  178.         cmp     [hdpos], 4
  179.         jne     .noide
  180.         cmp     [hdd_appl_data], 0
  181.         jne     .ide3_appl_data
  182.         mov     ecx, [cache_ide3_system_sad_size]
  183.         mov     esi, [cache_ide3_pointer]
  184.         ret
  185. .ide3_appl_data:
  186.         mov     ecx, [cache_ide3_appl_sad_size]
  187.         mov     esi, [cache_ide3_data_pointer]
  188.         ret
  189. .noide:
  190.         push    eax
  191.         mov     eax, [hdpos]
  192.         sub     eax, 80h
  193.         cmp     byte [BiosDisksData+eax*4+2], -1
  194.         jz      @f
  195.         movzx   eax, byte [BiosDisksData+eax*4+2]
  196.         imul    eax, cache_ide1-cache_ide0
  197.         add     eax, cache_ide0
  198.         jmp     .get
  199. @@:
  200.         imul    eax, cache_ide1-cache_ide0
  201.         add     eax, BiosDiskCaches
  202. .get:
  203.         cmp     [hdd_appl_data], 0
  204.         jne     .bd_appl_data
  205.         mov     ecx, [cache_ide0_system_sad_size-cache_ide0+eax]
  206.         mov     esi, [cache_ide0_pointer-cache_ide0+eax]
  207.         pop     eax
  208.         ret
  209. .bd_appl_data:
  210.         mov     ecx, [cache_ide0_appl_sad_size-cache_ide0+eax]
  211.         mov     esi, [cache_ide0_data_pointer-cache_ide0+eax]
  212.         pop     eax
  213.         ret
  214. ;--------------------------------------------------------------------
  215. align 4
  216. calculate_cache_1:
  217. ; 1 - IDE0 ... 4 - IDE3
  218. .ide0:
  219.         cmp     [hdpos], 1
  220.         jne     .ide1
  221.         cmp     [hdd_appl_data], 0
  222.         jne     .ide0_appl_data
  223.         mov     esi, [cache_ide0_pointer]
  224.         ret
  225. .ide0_appl_data:
  226.         mov     esi, [cache_ide0_data_pointer]
  227.         ret
  228. .ide1:
  229.         cmp     [hdpos], 2
  230.         jne     .ide2
  231.         cmp     [hdd_appl_data], 0
  232.         jne     .ide1_appl_data
  233.         mov     esi, [cache_ide1_pointer]
  234.         ret
  235. .ide1_appl_data:
  236.         mov     esi, [cache_ide1_data_pointer]
  237.         ret
  238. .ide2:
  239.         cmp     [hdpos], 3
  240.         jne     .ide3
  241.         cmp     [hdd_appl_data], 0
  242.         jne     .ide2_appl_data
  243.         mov     esi, [cache_ide2_pointer]
  244.         ret
  245. .ide2_appl_data:
  246.         mov     esi, [cache_ide2_data_pointer]
  247.         ret
  248. .ide3:
  249.         cmp     [hdpos], 4
  250.         jne     .noide
  251.         cmp     [hdd_appl_data], 0
  252.         jne     .ide3_appl_data
  253.         mov     esi, [cache_ide3_pointer]
  254.         ret
  255. .ide3_appl_data:
  256.         mov     esi, [cache_ide3_data_pointer]
  257.         ret
  258. .noide:
  259.         push    eax
  260.         mov     eax, [hdpos]
  261.         sub     eax, 80h
  262.         cmp     byte [BiosDisksData+eax*4+2], -1
  263.         jz      @f
  264.         movzx   eax, byte [BiosDisksData+eax*4+2]
  265.         imul    eax, cache_ide1-cache_ide0
  266.         add     eax, cache_ide0
  267.         jmp     .get
  268. @@:
  269.         imul    eax, cache_ide1-cache_ide0
  270.         add     eax, BiosDiskCaches
  271. .get:
  272.         cmp     [hdd_appl_data], 0
  273.         jne     .bd_appl_data
  274.         mov     esi, [cache_ide0_pointer-cache_ide0+eax]
  275.         pop     eax
  276.         ret
  277. .bd_appl_data:
  278.         mov     esi, [cache_ide0_data_pointer-cache_ide0+eax]
  279.         pop     eax
  280.         ret
  281.  
  282. ;--------------------------------------------------------------------
  283. align 4
  284. calculate_cache_2:
  285. ; 1 - IDE0 ... 4 - IDE3
  286. .ide0:
  287.         cmp     [hdpos], 1
  288.         jne     .ide1
  289.         cmp     [hdd_appl_data], 0
  290.         jne     .ide0_appl_data
  291.         mov     eax, [cache_ide0_system_data]
  292.         ret
  293. .ide0_appl_data:
  294.         mov     eax, [cache_ide0_appl_data]
  295.         ret
  296. .ide1:
  297.         cmp     [hdpos], 2
  298.         jne     .ide2
  299.         cmp     [hdd_appl_data], 0
  300.         jne     .ide1_appl_data
  301.         mov     eax, [cache_ide1_system_data]
  302.         ret
  303. .ide1_appl_data:
  304.         mov     eax, [cache_ide1_appl_data]
  305.         ret
  306. .ide2:
  307.         cmp     [hdpos], 3
  308.         jne     .ide3
  309.         cmp     [hdd_appl_data], 0
  310.         jne     .ide2_appl_data
  311.         mov     eax, [cache_ide2_system_data]
  312.         ret
  313. .ide2_appl_data:
  314.         mov     eax, [cache_ide2_appl_data]
  315.         ret
  316. .ide3:
  317.         cmp     [hdpos], 4
  318.         jne     .noide
  319.         cmp     [hdd_appl_data], 0
  320.         jne     .ide3_appl_data
  321.         mov     eax, [cache_ide3_system_data]
  322.         ret
  323. .ide3_appl_data:
  324.         mov     eax, [cache_ide3_appl_data]
  325.         ret
  326. .noide:
  327.         mov     eax, [hdpos]
  328.         sub     eax, 80h
  329.         cmp     byte [BiosDisksData+eax*4+2], -1
  330.         jz      @f
  331.         movzx   eax, byte [BiosDisksData+eax*4+2]
  332.         imul    eax, cache_ide1-cache_ide0
  333.         add     eax, cache_ide0
  334.         jmp     .get
  335. @@:
  336.         imul    eax, cache_ide1-cache_ide0
  337.         add     eax, BiosDiskCaches
  338. .get:
  339.         cmp     [hdd_appl_data], 0
  340.         jne     .bd_appl_data
  341.         mov     eax, [cache_ide0_system_data-cache_ide0+eax]
  342.         ret
  343. .bd_appl_data:
  344.         mov     eax, [cache_ide0_appl_data-cache_ide0+eax]
  345.         ret
  346. ;--------------------------------------------------------------------
  347. align 4
  348. calculate_cache_3:
  349. ;    mov   ecx,cache_max*10/100
  350. ;    mov   edi,[cache_search_start]
  351.  
  352. ; 1 - IDE0 ... 4 - IDE3
  353. .ide0:
  354.         cmp     [hdpos], 1
  355.         jne     .ide1
  356.         cmp     [hdd_appl_data], 0
  357.         jne     .ide0_appl_data
  358.         mov     ecx, [cache_ide0_system_sad_size]
  359.         mov     edi, [cache_ide0_search_start]
  360.         ret
  361. .ide0_appl_data:
  362.         mov     ecx, [cache_ide0_appl_sad_size]
  363.         mov     edi, [cache_ide0_appl_search_start]
  364.         ret
  365. .ide1:
  366.         cmp     [hdpos], 2
  367.         jne     .ide2
  368.         cmp     [hdd_appl_data], 0
  369.         jne     .ide1_appl_data
  370.         mov     ecx, [cache_ide1_system_sad_size]
  371.         mov     edi, [cache_ide1_search_start]
  372.         ret
  373. .ide1_appl_data:
  374.         mov     ecx, [cache_ide1_appl_sad_size]
  375.         mov     edi, [cache_ide1_appl_search_start]
  376.         ret
  377. .ide2:
  378.         cmp     [hdpos], 3
  379.         jne     .ide3
  380.         cmp     [hdd_appl_data], 0
  381.         jne     .ide2_appl_data
  382.         mov     ecx, [cache_ide2_system_sad_size]
  383.         mov     edi, [cache_ide2_search_start]
  384.         ret
  385. .ide2_appl_data:
  386.         mov     ecx, [cache_ide2_appl_sad_size]
  387.         mov     edi, [cache_ide2_appl_search_start]
  388.         ret
  389. .ide3:
  390.         cmp     [hdpos], 4
  391.         jne     .noide
  392.         cmp     [hdd_appl_data], 0
  393.         jne     .ide3_appl_data
  394.         mov     ecx, [cache_ide3_system_sad_size]
  395.         mov     edi, [cache_ide3_search_start]
  396.         ret
  397. .ide3_appl_data:
  398.         mov     ecx, [cache_ide3_appl_sad_size]
  399.         mov     edi, [cache_ide3_appl_search_start]
  400.         ret
  401. .noide:
  402.         push    eax
  403.         mov     eax, [hdpos]
  404.         sub     eax, 80h
  405.         cmp     byte [BiosDisksData+eax*4+2], -1
  406.         jz      @f
  407.         movzx   eax, byte [BiosDisksData+eax*4+2]
  408.         imul    eax, cache_ide1-cache_ide0
  409.         add     eax, cache_ide0
  410.         jmp     .get
  411. @@:
  412.         imul    eax, cache_ide1-cache_ide0
  413.         add     eax, BiosDiskCaches
  414. .get:
  415.         cmp     [hdd_appl_data], 0
  416.         jne     .bd_appl_data
  417.         mov     ecx, [cache_ide0_system_sad_size-cache_ide0+eax]
  418.         mov     edi, [cache_ide0_search_start-cache_ide0+eax]
  419.         pop     eax
  420.         ret
  421. .bd_appl_data:
  422.         mov     ecx, [cache_ide0_appl_sad_size-cache_ide0+eax]
  423.         mov     edi, [cache_ide0_appl_search_start-cache_ide0+eax]
  424.         pop     eax
  425.         ret
  426. ;--------------------------------------------------------------------
  427. align 4
  428. calculate_cache_4:
  429. ;    cmp   edi,cache_max
  430. ; 1 - IDE0 ... 4 - IDE3
  431. .ide0:
  432.         cmp     [hdpos], 1
  433.         jne     .ide1
  434.         cmp     [hdd_appl_data], 0
  435.         jne     .ide0_appl_data
  436.         cmp     edi, [cache_ide0_system_sad_size]
  437.         ret
  438. .ide0_appl_data:
  439.         cmp     edi, [cache_ide0_appl_sad_size]
  440.         ret
  441. .ide1:
  442.         cmp     [hdpos], 2
  443.         jne     .ide2
  444.         cmp     [hdd_appl_data], 0
  445.         jne     .ide1_appl_data
  446.         cmp     edi, [cache_ide1_system_sad_size]
  447.         ret
  448. .ide1_appl_data:
  449.         cmp     edi, [cache_ide1_appl_sad_size]
  450.         ret
  451. .ide2:
  452.         cmp     [hdpos], 3
  453.         jne     .ide3
  454.         cmp     [hdd_appl_data], 0
  455.         jne     .ide2_appl_data
  456.         cmp     edi, [cache_ide2_system_sad_size]
  457.         ret
  458. .ide2_appl_data:
  459.         cmp     edi, [cache_ide2_appl_sad_size]
  460.         ret
  461. .ide3:
  462.         cmp     [hdpos], 4
  463.         jne     .noide
  464.         cmp     [hdd_appl_data], 0
  465.         jne     .ide3_appl_data
  466.         cmp     edi, [cache_ide3_system_sad_size]
  467.         ret
  468. .ide3_appl_data:
  469.         cmp     edi, [cache_ide3_appl_sad_size]
  470.         ret
  471. .noide:
  472.         push    eax
  473.         mov     eax, [hdpos]
  474.         sub     eax, 80h
  475.         cmp     byte [BiosDisksData+eax*4+2], -1
  476.         jz      @f
  477.         movzx   eax, byte [BiosDisksData+eax*4+2]
  478.         imul    eax, cache_ide1-cache_ide0
  479.         add     eax, cache_ide0
  480.         jmp     .get
  481. @@:
  482.         imul    eax, cache_ide1-cache_ide0
  483.         add     eax, BiosDiskCaches
  484. .get:
  485.         cmp     [hdd_appl_data], 0
  486.         jne     .bd_appl_data
  487.         cmp     edi, [cache_ide0_system_sad_size-cache_ide0+eax]
  488.         pop     eax
  489.         ret
  490. .bd_appl_data:
  491.         cmp     edi, [cache_ide0_appl_sad_size-cache_ide0+eax]
  492.         pop     eax
  493.         ret
  494.  
  495. ;--------------------------------------------------------------------
  496. align 4
  497. calculate_cache_5:
  498. ;    mov   [cache_search_start],edi
  499. ; 1 - IDE0 ... 4 - IDE3
  500. .ide0:
  501.         cmp     [hdpos], 1
  502.         jne     .ide1
  503.         cmp     [hdd_appl_data], 0
  504.         jne     .ide0_appl_data
  505.         mov     [cache_ide0_search_start], edi
  506.         ret
  507. .ide0_appl_data:
  508.         mov     [cache_ide0_appl_search_start], edi
  509.         ret
  510. .ide1:
  511.         cmp     [hdpos], 2
  512.         jne     .ide2
  513.         cmp     [hdd_appl_data], 0
  514.         jne     .ide1_appl_data
  515.         mov     [cache_ide1_search_start], edi
  516.         ret
  517. .ide1_appl_data:
  518.         mov     [cache_ide1_appl_search_start], edi
  519.         ret
  520. .ide2:
  521.         cmp     [hdpos], 3
  522.         jne     .ide3
  523.         cmp     [hdd_appl_data], 0
  524.         jne     .ide2_appl_data
  525.         mov     [cache_ide2_search_start], edi
  526.         ret
  527. .ide2_appl_data:
  528.         mov     [cache_ide2_appl_search_start], edi
  529.         ret
  530. .ide3:
  531.         cmp     [hdpos], 4
  532.         jne     .noide
  533.         cmp     [hdd_appl_data], 0
  534.         jne     .ide3_appl_data
  535.         mov     [cache_ide3_search_start], edi
  536.         ret
  537. .ide3_appl_data:
  538.         mov     [cache_ide3_appl_search_start], edi
  539.         ret
  540. .noide:
  541.         push    eax
  542.         mov     eax, [hdpos]
  543.         sub     eax, 80h
  544.         cmp     byte [BiosDisksData+eax*4+2], -1
  545.         jz      @f
  546.         movzx   eax, byte [BiosDisksData+eax*4+2]
  547.         imul    eax, cache_ide1-cache_ide0
  548.         add     eax, cache_ide0
  549.         jmp     .get
  550. @@:
  551.         imul    eax, cache_ide1-cache_ide0
  552.         add     eax, BiosDiskCaches
  553. .get:
  554.         cmp     [hdd_appl_data], 0
  555.         jne     .bd_appl_data
  556.         mov     [cache_ide0_search_start-cache_ide0+eax], edi
  557.         pop     eax
  558.         ret
  559. .bd_appl_data:
  560.         mov     [cache_ide0_appl_search_start-cache_ide0+eax], edi
  561.         pop     eax
  562.         ret
  563.  
  564. ;--------------------------------------------------------------------
  565. align 4
  566. find_empty_slot_CD_cache:
  567. ;-----------------------------------------------------------
  568. ; find empty or read slot, flush cache if next 10% is used by write
  569. ; output : edi = cache slot
  570. ;-----------------------------------------------------------
  571. .search_again:
  572.         call    cd_calculate_cache_3
  573. .search_for_empty:
  574.         inc     edi
  575.         call    cd_calculate_cache_4
  576.         jbe     .inside_cache
  577.         mov     edi, 1
  578. .inside_cache:
  579.         call    cd_calculate_cache_5
  580.         ret
  581. ;--------------------------------------------------------------------
  582. clear_CD_cache:
  583.         pusha
  584. .ide0:
  585.         xor     eax, eax
  586.         cmp     [cdpos], 1
  587.         jne     .ide1
  588.         mov     [cache_ide0_search_start], eax
  589.         mov     ecx, [cache_ide0_system_sad_size]
  590.         mov     edi, [cache_ide0_pointer]
  591.         call    .clear
  592.         mov     [cache_ide0_appl_search_start], eax
  593.         mov     ecx, [cache_ide0_appl_sad_size]
  594.         mov     edi, [cache_ide0_data_pointer]
  595.         jmp     .continue
  596. .ide1:
  597.         cmp     [cdpos], 2
  598.         jne     .ide2
  599.         mov     [cache_ide1_search_start], eax
  600.         mov     ecx, [cache_ide1_system_sad_size]
  601.         mov     edi, [cache_ide1_pointer]
  602.         call    .clear
  603.         mov     [cache_ide1_appl_search_start], eax
  604.         mov     ecx, [cache_ide1_appl_sad_size]
  605.         mov     edi, [cache_ide1_data_pointer]
  606.         jmp     .continue
  607. .ide2:
  608.         cmp     [cdpos], 3
  609.         jne     .ide3
  610.         mov     [cache_ide2_search_start], eax
  611.         mov     ecx, [cache_ide2_system_sad_size]
  612.         mov     edi, [cache_ide2_pointer]
  613.         call    .clear
  614.         mov     [cache_ide2_appl_search_start], eax
  615.         mov     ecx, [cache_ide2_appl_sad_size]
  616.         mov     edi, [cache_ide2_data_pointer]
  617.         jmp     .continue
  618. .ide3:
  619.         mov     [cache_ide3_search_start], eax
  620.         mov     ecx, [cache_ide3_system_sad_size]
  621.         mov     edi, [cache_ide3_pointer]
  622.         call    .clear
  623.         mov     [cache_ide3_appl_search_start], eax
  624.         mov     ecx, [cache_ide3_appl_sad_size]
  625.         mov     edi, [cache_ide3_data_pointer]
  626. .continue:
  627.         call    .clear
  628.         popa
  629.         ret
  630. .clear:
  631.         shl     ecx, 1
  632.         cld
  633.         rep stosd
  634.         ret
  635. ;--------------------------------------------------------------------
  636. align 4
  637. cd_calculate_cache:
  638. ; 1 - IDE0 ... 4 - IDE3
  639. .ide0:
  640.         cmp     [cdpos], 1
  641.         jne     .ide1
  642.         cmp     [cd_appl_data], 0
  643.         jne     .ide0_appl_data
  644.         mov     ecx, [cache_ide0_system_sad_size]
  645.         mov     esi, [cache_ide0_pointer]
  646.         ret
  647. .ide0_appl_data:
  648.         mov     ecx, [cache_ide0_appl_sad_size]
  649.         mov     esi, [cache_ide0_data_pointer]
  650.         ret
  651. .ide1:
  652.         cmp     [cdpos], 2
  653.         jne     .ide2
  654.         cmp     [cd_appl_data], 0
  655.         jne     .ide1_appl_data
  656.         mov     ecx, [cache_ide1_system_sad_size]
  657.         mov     esi, [cache_ide1_pointer]
  658.         ret
  659. .ide1_appl_data:
  660.         mov     ecx, [cache_ide1_appl_sad_size]
  661.         mov     esi, [cache_ide1_data_pointer]
  662.         ret
  663. .ide2:
  664.         cmp     [cdpos], 3
  665.         jne     .ide3
  666.         cmp     [cd_appl_data], 0
  667.         jne     .ide2_appl_data
  668.         mov     ecx, [cache_ide2_system_sad_size]
  669.         mov     esi, [cache_ide2_pointer]
  670.         ret
  671. .ide2_appl_data:
  672.         mov     ecx, [cache_ide2_appl_sad_size]
  673.         mov     esi, [cache_ide2_data_pointer]
  674.         ret
  675. .ide3:
  676.         cmp     [cd_appl_data], 0
  677.         jne     .ide3_appl_data
  678.         mov     ecx, [cache_ide3_system_sad_size]
  679.         mov     esi, [cache_ide3_pointer]
  680.         ret
  681. .ide3_appl_data:
  682.         mov     ecx, [cache_ide3_appl_sad_size]
  683.         mov     esi, [cache_ide3_data_pointer]
  684.         ret
  685. ;--------------------------------------------------------------------
  686. align 4
  687. cd_calculate_cache_1:
  688. ; 1 - IDE0 ... 4 - IDE3
  689. .ide0:
  690.         cmp     [cdpos], 1
  691.         jne     .ide1
  692.         cmp     [cd_appl_data], 0
  693.         jne     .ide0_appl_data
  694.         mov     esi, [cache_ide0_pointer]
  695.         ret
  696. .ide0_appl_data:
  697.         mov     esi, [cache_ide0_data_pointer]
  698.         ret
  699. .ide1:
  700.         cmp     [cdpos], 2
  701.         jne     .ide2
  702.         cmp     [cd_appl_data], 0
  703.         jne     .ide1_appl_data
  704.         mov     esi, [cache_ide1_pointer]
  705.         ret
  706. .ide1_appl_data:
  707.         mov     esi, [cache_ide1_data_pointer]
  708.         ret
  709. .ide2:
  710.         cmp     [cdpos], 3
  711.         jne     .ide3
  712.         cmp     [cd_appl_data], 0
  713.         jne     .ide2_appl_data
  714.         mov     esi, [cache_ide2_pointer]
  715.         ret
  716. .ide2_appl_data:
  717.         mov     esi, [cache_ide2_data_pointer]
  718.         ret
  719. .ide3:
  720.         cmp     [cd_appl_data], 0
  721.         jne     .ide3_appl_data
  722.         mov     esi, [cache_ide3_pointer]
  723.         ret
  724. .ide3_appl_data:
  725.         mov     esi, [cache_ide3_data_pointer]
  726.         ret
  727. ;--------------------------------------------------------------------
  728. align 4
  729. cd_calculate_cache_2:
  730. ; 1 - IDE0 ... 4 - IDE3
  731. .ide0:
  732.         cmp     [cdpos], 1
  733.         jne     .ide1
  734.         cmp     [cd_appl_data], 0
  735.         jne     .ide0_appl_data
  736.         mov     eax, [cache_ide0_system_data]
  737.         ret
  738. .ide0_appl_data:
  739.         mov     eax, [cache_ide0_appl_data]
  740.         ret
  741. .ide1:
  742.         cmp     [cdpos], 2
  743.         jne     .ide2
  744.         cmp     [cd_appl_data], 0
  745.         jne     .ide1_appl_data
  746.         mov     eax, [cache_ide1_system_data]
  747.         ret
  748. .ide1_appl_data:
  749.         mov     eax, [cache_ide1_appl_data]
  750.         ret
  751. .ide2:
  752.         cmp     [cdpos], 3
  753.         jne     .ide3
  754.         cmp     [cd_appl_data], 0
  755.         jne     .ide2_appl_data
  756.         mov     eax, [cache_ide2_system_data]
  757.         ret
  758. .ide2_appl_data:
  759.         mov     eax, [cache_ide2_appl_data]
  760.         ret
  761. .ide3:
  762.         cmp     [cd_appl_data], 0
  763.         jne     .ide3_appl_data
  764.         mov     eax, [cache_ide3_system_data]
  765.         ret
  766. .ide3_appl_data:
  767.         mov     eax, [cache_ide3_appl_data]
  768.         ret
  769. ;--------------------------------------------------------------------
  770. align 4
  771. cd_calculate_cache_3:
  772. ;    mov   ecx,cache_max*10/100
  773. ;    mov   edi,[cache_search_start]
  774.  
  775. ; 1 - IDE0 ... 4 - IDE3
  776. .ide0:
  777.         cmp     [cdpos], 1
  778.         jne     .ide1
  779.         cmp     [cd_appl_data], 0
  780.         jne     .ide0_appl_data
  781.         mov     edi, [cache_ide0_search_start]
  782.         ret
  783. .ide0_appl_data:
  784.         mov     edi, [cache_ide0_appl_search_start]
  785.         ret
  786. .ide1:
  787.         cmp     [cdpos], 2
  788.         jne     .ide2
  789.         cmp     [cd_appl_data], 0
  790.         jne     .ide1_appl_data
  791.         mov     edi, [cache_ide1_search_start]
  792.         ret
  793. .ide1_appl_data:
  794.         mov     edi, [cache_ide1_appl_search_start]
  795.         ret
  796. .ide2:
  797.         cmp     [cdpos], 3
  798.         jne     .ide3
  799.         cmp     [cd_appl_data], 0
  800.         jne     .ide2_appl_data
  801.         mov     edi, [cache_ide2_search_start]
  802.         ret
  803. .ide2_appl_data:
  804.         mov     edi, [cache_ide2_appl_search_start]
  805.         ret
  806. .ide3:
  807.         cmp     [cd_appl_data], 0
  808.         jne     .ide3_appl_data
  809.         mov     edi, [cache_ide3_search_start]
  810.         ret
  811. .ide3_appl_data:
  812.         mov     edi, [cache_ide3_appl_search_start]
  813.         ret
  814. ;--------------------------------------------------------------------
  815. align 4
  816. cd_calculate_cache_4:
  817. ;    cmp   edi,cache_max
  818. ; 1 - IDE0 ... 4 - IDE3
  819. .ide0:
  820.         cmp     [cdpos], 1
  821.         jne     .ide1
  822.         cmp     [cd_appl_data], 0
  823.         jne     .ide0_appl_data
  824.         cmp     edi, [cache_ide0_system_sad_size]
  825.         ret
  826. .ide0_appl_data:
  827.         cmp     edi, [cache_ide0_appl_sad_size]
  828.         ret
  829. .ide1:
  830.         cmp     [cdpos], 2
  831.         jne     .ide2
  832.         cmp     [cd_appl_data], 0
  833.         jne     .ide1_appl_data
  834.         cmp     edi, [cache_ide1_system_sad_size]
  835.         ret
  836. .ide1_appl_data:
  837.         cmp     edi, [cache_ide1_appl_sad_size]
  838.         ret
  839. .ide2:
  840.         cmp     [cdpos], 3
  841.         jne     .ide3
  842.         cmp     [cd_appl_data], 0
  843.         jne     .ide2_appl_data
  844.         cmp     edi, [cache_ide2_system_sad_size]
  845.         ret
  846. .ide2_appl_data:
  847.         cmp     edi, [cache_ide2_appl_sad_size]
  848.         ret
  849. .ide3:
  850.         cmp     [cd_appl_data], 0
  851.         jne     .ide3_appl_data
  852.         cmp     edi, [cache_ide3_system_sad_size]
  853.         ret
  854. .ide3_appl_data:
  855.         cmp     edi, [cache_ide3_appl_sad_size]
  856.         ret
  857. ;--------------------------------------------------------------------
  858. align 4
  859. cd_calculate_cache_5:
  860. ;    mov   [cache_search_start],edi
  861. ; 1 - IDE0 ... 4 - IDE3
  862. .ide0:
  863.         cmp     [cdpos], 1
  864.         jne     .ide1
  865.         cmp     [cd_appl_data], 0
  866.         jne     .ide0_appl_data
  867.         mov     [cache_ide0_search_start], edi
  868.         ret
  869. .ide0_appl_data:
  870.         mov     [cache_ide0_appl_search_start], edi
  871.         ret
  872. .ide1:
  873.         cmp     [cdpos], 2
  874.         jne     .ide2
  875.         cmp     [cd_appl_data], 0
  876.         jne     .ide1_appl_data
  877.         mov     [cache_ide1_search_start], edi
  878.         ret
  879. .ide1_appl_data:
  880.         mov     [cache_ide1_appl_search_start], edi
  881.         ret
  882. .ide2:
  883.         cmp     [cdpos], 3
  884.         jne     .ide3
  885.         cmp     [cd_appl_data], 0
  886.         jne     .ide2_appl_data
  887.         mov     [cache_ide2_search_start], edi
  888.         ret
  889. .ide2_appl_data:
  890.         mov     [cache_ide2_appl_search_start], edi
  891.         ret
  892. .ide3:
  893.         cmp     [cd_appl_data], 0
  894.         jne     .ide3_appl_data
  895.         mov     [cache_ide3_search_start], edi
  896.         ret
  897. .ide3_appl_data:
  898.         mov     [cache_ide3_appl_search_start], edi
  899.         ret
  900. ;--------------------------------------------------------------------
  901. ;align 4
  902. ;calculate_linear_to_real:
  903. ;    shr eax, 12
  904. ;    mov eax, [page_tabs+eax*4]
  905. ;    and eax, 0xFFFFF000
  906. ;    ret
  907.