Subversion Repositories Kolibri OS

Rev

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