Subversion Repositories Kolibri OS

Rev

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

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