Subversion Repositories Kolibri OS

Rev

Rev 3309 | Blame | 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. ;; System service for filesystem call                           ;;
  8. ;; (C) 2004 Ville Turjanmaa, License: GPL                       ;;
  9. ;; 29.04.2006 Elimination of hangup after the                   ;;
  10. ;;            expiration hd_wait_timeout (for LBA) -  Mario79   ;;
  11. ;; 15.01.2005 get file size/attr/date,                          ;;
  12. ;;            file_append (only for hd) - ATV                   ;;
  13. ;; 23.11.2004 test if hd/partition is set - ATV                 ;;
  14. ;; 18.11.2004 get_disk_info and more error codes - ATV          ;;
  15. ;; 08.11.2004 expand_pathz and rename (only for hd) - ATV       ;;
  16. ;; 20.10.2004 Makedir/Removedir (only for hd) - ATV             ;;
  17. ;;                                                              ;;
  18. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  19.  
  20. $Revision: 3539 $
  21.  
  22.  
  23. iglobal
  24.  
  25. if lang eq sp
  26. include 'fs/fs-sp.inc'
  27. else
  28. dir0:
  29.              db  'HARDDISK   '
  30.              db  'RAMDISK    '
  31.              db  'FLOPPYDISK '
  32.              db  0
  33.  
  34. dir1:
  35.              db  'FIRST      '
  36.              db  'SECOND     '
  37.              db  'THIRD      '
  38.              db  'FOURTH     '
  39.              db  0
  40. end if
  41.  
  42. not_select_IDE db 0
  43.  
  44. hd_address_table:
  45.                    dd  0x1f0,0x00,0x1f0,0x10
  46.                    dd  0x170,0x00,0x170,0x10
  47. endg
  48.  
  49. file_system:
  50.  
  51. ; IN:
  52. ;
  53. ; eax = 0  ; read file          /RamDisk/First  6
  54. ; eax = 8  ; lba read
  55. ; eax = 15 ; get_disk_info
  56. ;
  57. ; OUT:
  58. ;
  59. ; eax = 0  : read ok
  60. ; eax = 1  : no hd base and/or partition defined
  61. ; eax = 2  : function is unsupported for this FS
  62. ; eax = 3  : unknown FS
  63. ; eax = 4  : partition not defined at hd
  64. ; eax = 5  : file not found
  65. ; eax = 6  : end of file
  66. ; eax = 7  : memory pointer not in application area
  67. ; eax = 8  : disk full
  68. ; eax = 9  : fat table corrupted
  69. ; eax = 10 : access denied
  70. ; eax = 11 : disk error
  71. ;
  72. ; ebx = size
  73.  
  74. ; \begin{diamond}[18.03.2006]
  75. ; for subfunction 16 (start application) error codes must be negative
  76. ;    because positive values are valid PIDs
  77. ; so possible return values are:
  78. ; eax > 0 : process created, eax=PID
  79.  
  80. ; -0x10 <= eax < 0 : -eax is filesystem error code:
  81. ; eax = -1  = 0xFFFFFFFF : no hd base and/or partition defined
  82. ; eax = -3  = 0xFFFFFFFD : unknown FS
  83. ; eax = -5  = 0xFFFFFFFB : file not found
  84. ; eax = -6  = 0xFFFFFFFA : unexpected end of file (probably not executable file)
  85. ; eax = -9  = 0xFFFFFFF7 : fat table corrupted
  86. ; eax = -10 = 0xFFFFFFF6 : access denied
  87.  
  88. ; -0x20 <= eax < -0x10: eax is process creation error code:
  89. ; eax = -0x20 = 0xFFFFFFE0 : too many processes
  90. ; eax = -0x1F = 0xFFFFFFE1 : not Menuet/Kolibri executable
  91. ; eax = -0x1E = 0xFFFFFFE2 : no memory
  92.  
  93. ; ebx is not changed
  94.  
  95. ; \end{diamond}[18.03.2006]
  96.  
  97.     ; Extract parameters
  98.  ;   add    eax, std_application_base_address    ; abs start of info block
  99.  
  100.         cmp     dword [eax+0], 15; GET_DISK_INFO
  101.         je      fs_info
  102.  
  103.         cmp     dword [CURRENT_TASK], 1; no memory checks for kernel requests
  104.         jz      no_checks_for_kernel
  105.         mov     edx, eax
  106.         cmp     dword [eax+0], 1
  107.         jnz     .usual_check
  108.         mov     ebx, [eax+12]
  109.  ;   add   ebx,std_application_base_address
  110.         mov     ecx, [eax+8]
  111.         call    check_region
  112.         test    eax, eax
  113.         jnz     area_in_app_mem
  114.  
  115. .error_output:
  116.         mov     esi, buffer_failed
  117.         call    sys_msg_board_str
  118. ;    mov   eax,7
  119.         mov     dword [esp+36], 7
  120.         ret
  121. iglobal
  122.   buffer_failed db 'K : Buffer check failed',13,10,0
  123. endg
  124. .usual_check:
  125.         cmp     dword [eax+0], 0
  126.         mov     ecx, 512
  127.         jnz     .small_size
  128.         mov     ecx, [eax+8]
  129.         shl     ecx, 9
  130. .small_size:
  131.         mov     ebx, [eax+12]
  132.  ;   add   ebx,std_application_base_address
  133.         call    check_region
  134.         test    eax, eax
  135.         jz      .error_output
  136.   area_in_app_mem:
  137.         mov     eax, edx
  138.   no_checks_for_kernel:
  139.  
  140.   fs_read:
  141.  
  142.         mov     ebx, [eax+20]   ; program wants root directory ?
  143.         test    bl, bl
  144.         je      fs_getroot
  145.         test    bh, bh
  146.         jne     fs_noroot
  147.   fs_getroot:
  148. ; \begin{diamond}[18.03.2006]
  149. ; root - only read is allowed
  150. ; other operations return "access denied", eax=10
  151. ; (execute operation returns eax=-10)
  152.         cmp     dword [eax], 0
  153.         jz      .read_root
  154.         mov     dword [esp+36], 10
  155.         ret
  156. .read_root:
  157. ; \end{diamond}[18.03.2006]
  158.         mov     esi, dir0
  159.         mov     edi, [eax+12]
  160.  ;   add   edi,std_application_base_address
  161.         mov     ecx, 11
  162.         push    ecx
  163. ;    cld    ; already is
  164.         rep movsb
  165.         mov     al, 0x10
  166.         stosb
  167.         add     edi, 32-11-1
  168.         pop     ecx
  169.         rep movsb
  170.         stosb
  171.         and     dword [esp+36], 0; ok read
  172.         mov     dword [esp+24], 32*2; size of root
  173.         ret
  174.  
  175.   fs_info:                      ;start of code - Mihasik
  176.         push    eax
  177.         cmp     [eax+21], byte 'r'
  178.         je      fs_info_r
  179.         cmp     [eax+21], byte 'R'
  180.         je      fs_info_r
  181.         mov     eax, 3          ;if unknown disk
  182.         xor     ebx, ebx
  183.         xor     ecx, ecx
  184.         xor     edx, edx
  185.         jmp     fs_info1
  186.   fs_info_r:
  187.         call    ramdisk_free_space;if ramdisk
  188.         mov     ecx, edi        ;free space in ecx
  189.         shr     ecx, 9          ;free clusters
  190.         mov     ebx, 2847       ;total clusters
  191.         mov     edx, 512        ;cluster size
  192.         xor     eax, eax        ;always 0
  193.   fs_info1:
  194.         pop     edi
  195.         mov     [esp+36], eax
  196.         mov     [esp+24], ebx    ; total clusters on disk
  197.         mov     [esp+32], ecx    ; free clusters on disk
  198.         mov     [edi], edx       ; cluster size in bytes
  199.         ret                      ;end of code - Mihasik
  200.  
  201.   fs_noroot:
  202.  
  203.         push    dword [eax+0]   ; read/write/delete/.../makedir/rename/lba/run
  204.         push    dword [eax+4]   ; 512 block number to read
  205.         push    dword [eax+8]   ; bytes to write/append or 512 blocks to read
  206.         mov     ebx, [eax+12]
  207.  ;   add   ebx,std_application_base_address
  208.         push    ebx             ; abs start of return/save area
  209.  
  210.         lea     esi, [eax+20]   ; abs start of dir + filename
  211.         mov     edi, [eax+16]
  212.  ;   add   edi,std_application_base_address    ; abs start of work area
  213.  
  214.         call    expand_pathz
  215.  
  216.         push    edi             ; dir start
  217.         push    ebx             ; name of file start
  218.  
  219.         mov     eax, [edi+1]
  220.         cmp     eax, 'RD  '
  221.         je      fs_yesramdisk
  222.         cmp     eax, 'RAMD'
  223.         jne     fs_noramdisk
  224.  
  225.   fs_yesramdisk:
  226.  
  227.         cmp     byte [edi+1+11], 0
  228.         je      fs_give_dir1
  229.  
  230.         mov     eax, [edi+1+12]
  231.         cmp     eax, '1   '
  232.         je      fs_yesramdisk_first
  233.         cmp     eax, 'FIRS'
  234.         jne     fs_noramdisk
  235.  
  236.   fs_yesramdisk_first:
  237.  
  238.         cmp     dword [esp+20], 8; LBA read ramdisk
  239.         jne     fs_no_LBA_read_ramdisk
  240.  
  241.         mov     eax, [esp+16]   ; LBA block to read
  242.         mov     ecx, [esp+8]    ; abs pointer to return area
  243.  
  244.         call    LBA_read_ramdisk
  245.         jmp     file_system_return
  246.  
  247.  
  248.   fs_no_LBA_read_ramdisk:
  249.  
  250.         cmp     dword [esp+20], 0; READ
  251.         jne     fs_noramdisk_read
  252.  
  253.         mov     eax, [esp+4]    ; fname
  254.         add     eax, 2*12+1
  255.         mov     ebx, [esp+16]   ; block start
  256.         inc     ebx
  257.         mov     ecx, [esp+12]   ; block count
  258.         mov     edx, [esp+8]    ; return
  259.         mov     esi, [esp+0]
  260.         sub     esi, eax
  261.         add     esi, 12+1       ; file name length
  262.         call    fileread
  263.  
  264.         jmp     file_system_return
  265.  
  266.  
  267.   fs_noramdisk_read:
  268.   fs_noramdisk:
  269.  
  270.   ;********************************************************************
  271.         mov     eax, [edi+1]
  272.         cmp     eax, 'FD  '
  273.         je      fs_yesflpdisk
  274.         cmp     eax, 'FLOP'
  275.         jne     fs_noflpdisk
  276.  
  277.   fs_yesflpdisk:
  278.         call    reserve_flp
  279.  
  280.         cmp     byte [edi+1+11], 0
  281.         je      fs_give_dir1
  282.  
  283.         mov     eax, [edi+1+12]
  284.         cmp     eax, '1   '
  285.         je      fs_yesflpdisk_first
  286.         cmp     eax, 'FIRS'
  287.         je      fs_yesflpdisk_first
  288.         cmp     eax, '2   '
  289.         je      fs_yesflpdisk_second
  290.         cmp     eax, 'SECO'
  291.         jne     fs_noflpdisk
  292.         jmp     fs_yesflpdisk_second
  293.  
  294.   fs_yesflpdisk_first:
  295.         mov     [flp_number], 1
  296.         jmp     fs_yesflpdisk_start
  297.   fs_yesflpdisk_second:
  298.         mov     [flp_number], 2
  299.   fs_yesflpdisk_start:
  300.         cmp     dword [esp+20], 0; READ
  301.         jne     fs_noflpdisk_read
  302.  
  303.         mov     eax, [esp+4]    ; fname
  304.         add     eax, 2*12+1
  305.         mov     ebx, [esp+16]   ; block start
  306.         inc     ebx
  307.         mov     ecx, [esp+12]   ; block count
  308.         mov     edx, [esp+8]    ; return
  309.         mov     esi, [esp+0]
  310.         sub     esi, eax
  311.         add     esi, 12+1       ; file name length
  312.         call    floppy_fileread
  313.  
  314.         jmp     file_system_return
  315.  
  316.  
  317.   fs_noflpdisk_read:
  318.   fs_noflpdisk:
  319.   ;*****************************************************************
  320.  
  321.         mov     eax, [edi+1]
  322.         cmp     eax, 'HD0 '
  323.         je      fs_yesharddisk_IDE0
  324.         cmp     eax, 'HD1 '
  325.         je      fs_yesharddisk_IDE1
  326.         cmp     eax, 'HD2 '
  327.         je      fs_yesharddisk_IDE2
  328.         cmp     eax, 'HD3 '
  329.         je      fs_yesharddisk_IDE3
  330.         jmp     old_path_harddisk
  331. fs_yesharddisk_IDE0:
  332.         call    reserve_hd1
  333.         mov     [hdbase], 0x1f0
  334.         mov     [hdid], 0x0
  335.         mov     [hdpos], 1
  336.         jmp     fs_yesharddisk_partition
  337. fs_yesharddisk_IDE1:
  338.         call    reserve_hd1
  339.         mov     [hdbase], 0x1f0
  340.         mov     [hdid], 0x10
  341.         mov     [hdpos], 2
  342.         jmp     fs_yesharddisk_partition
  343. fs_yesharddisk_IDE2:
  344.         call    reserve_hd1
  345.         mov     [hdbase], 0x170
  346.         mov     [hdid], 0x0
  347.         mov     [hdpos], 3
  348.         jmp     fs_yesharddisk_partition
  349. fs_yesharddisk_IDE3:
  350.         call    reserve_hd1
  351.         mov     [hdbase], 0x170
  352.         mov     [hdid], 0x10
  353.         mov     [hdpos], 4
  354. fs_yesharddisk_partition:
  355.         call    reserve_hd_channel
  356. ;    call  choice_necessity_partition
  357. ;    jmp   fs_yesharddisk_all
  358.         jmp     fs_for_new_semantic
  359.  
  360. choice_necessity_partition:
  361.         mov     eax, [edi+1+12]
  362.         call    StringToNumber
  363.         mov     [fat32part], eax
  364. choice_necessity_partition_1:
  365.         mov     ecx, [hdpos]
  366.         xor     eax, eax
  367.         mov     [hd_entries], eax; entries in hd cache
  368.         mov     edx, DRIVE_DATA+2
  369.         cmp     ecx, 0x80
  370.         jb      search_partition_array
  371.         mov     ecx, 4
  372.  search_partition_array:
  373.         mov     bl, [edx]
  374.         movzx   ebx, bl
  375.         add     eax, ebx
  376.         inc     edx
  377.         loop    search_partition_array
  378.         mov     ecx, [hdpos]
  379.         mov     edx, BiosDiskPartitions
  380.         sub     ecx, 0x80
  381.         jb      .s
  382.         je      .f
  383.  @@:
  384.         mov     ebx, [edx]
  385.         add     edx, 4
  386.         add     eax, ebx
  387.         loop    @b
  388.         jmp     .f
  389.  .s:
  390.         sub     eax, ebx
  391.  .f:
  392.         add     eax, [known_part];   add   eax,[fat32part]
  393.         dec     eax
  394.         xor     edx, edx
  395.         imul    eax, 100
  396.         add     eax, DRIVE_DATA+0xa
  397.         mov     [transfer_adress], eax
  398.         call    partition_data_transfer_1
  399.         ret
  400.  
  401.  old_path_harddisk:
  402.         mov     eax, [edi+1]
  403.         cmp     eax, 'HD  '
  404.         je      fs_yesharddisk
  405.         cmp     eax, 'HARD'
  406.         jne     fs_noharddisk
  407.  
  408.   fs_yesharddisk:
  409.         cmp     dword [esp+20], 8; LBA read
  410.         jne     fs_no_LBA_read
  411.         mov     eax, [esp+16]   ; LBA block to read
  412.         lea     ebx, [edi+1+12] ; pointer to FIRST/SECOND/THIRD/FOURTH
  413.         mov     ecx, [esp+8]    ; abs pointer to return area
  414.         call    LBA_read
  415.         jmp     file_system_return
  416.  
  417.   fs_no_LBA_read:
  418.  
  419.         cmp     byte [edi+1+11], 0; directory read
  420.         je      fs_give_dir1
  421.         call    reserve_hd1
  422.  fs_for_new_semantic:
  423.         call    choice_necessity_partition
  424.  
  425.   fs_yesharddisk_all:
  426.         mov     eax, 1
  427.         mov     ebx, [esp+24+24]
  428.         cmp     [hdpos], 0      ; is hd base set?
  429.         jz      hd_err_return
  430.         cmp     [fat32part], 0  ; is partition set?
  431.         jnz     @f
  432. hd_err_return:
  433.         call    free_hd_channel
  434.         and     [hd1_status], 0
  435.         jmp     file_system_return
  436. @@:
  437.  
  438.         call    free_hd_channel
  439.         and     [hd1_status], 0
  440.  
  441.   fs_noharddisk:
  442. ; \begin{diamond}[18.03.2006]
  443.         mov     eax, 5   ; file not found
  444. ; а может быть, возвращать другой код ошибки?
  445.         mov     ebx, [esp+24+24]; do not change ebx in application
  446. ; \end{diamond}[18.03.2006]
  447.  
  448.   file_system_return:
  449.  
  450.         add     esp, 24
  451.  
  452.         mov     [esp+36], eax
  453.         mov     [esp+24], ebx
  454.         ret
  455.  
  456.  
  457.   fs_give_dir1:
  458.  
  459. ; \begin{diamond}[18.03.2006]
  460. ; /RD,/FD,/HD - only read is allowed
  461. ; other operations return "access denied", eax=10
  462. ; (execute operation returns eax=-10)
  463.         cmp     dword [esp+20], 0
  464.         jz      .read
  465.         add     esp, 20
  466.         pop     ecx
  467.         mov     dword [esp+36], 10
  468.         ret
  469. .read:
  470. ; \end{diamond}[18.03.2006]
  471.         mov     al, 0x10
  472.         mov     ebx, 1
  473.         mov     edi, [esp+8]
  474.         mov     esi, dir1
  475.   fs_d1_new:
  476.         mov     ecx, 11
  477. ;    cld
  478.         rep movsb
  479.         stosb
  480.         add     edi, 32-11-1
  481.         dec     ebx
  482.         jne     fs_d1_new
  483.  
  484.         add     esp, 24
  485.  
  486.         and     dword [esp+36], 0; ok read
  487.         mov     dword [esp+24], 32*1; dir/data size
  488.         ret
  489.  
  490.  
  491.  
  492. LBA_read_ramdisk:
  493.  
  494.         cmp     [lba_read_enabled], 1
  495.         je      lbarrl1
  496.  
  497.         xor     ebx, ebx
  498.         mov     eax, 2
  499.         ret
  500.  
  501.   lbarrl1:
  502.  
  503.         cmp     eax, 18*2*80
  504.         jb      lbarrl2
  505.         xor     ebx, ebx
  506.         mov     eax, 3
  507.         ret
  508.  
  509.   lbarrl2:
  510.  
  511.         pushad
  512.  
  513.         call    restorefatchain
  514.  
  515.         mov     edi, ecx
  516.         mov     esi, eax
  517.  
  518.         shl     esi, 9
  519.         add     esi, RAMDISK
  520.         mov     ecx, 512/4
  521. ;    cld
  522.         rep movsd
  523.  
  524.         popad
  525.  
  526.         xor     ebx, ebx
  527.         xor     eax, eax
  528.         ret
  529.  
  530. LBA_read:
  531.  
  532. ; IN:
  533. ;
  534. ; eax = LBA block to read
  535. ; ebx = pointer to FIRST/SECOND/THIRD/FOURTH
  536. ; ecx = abs pointer to return area
  537.  
  538.         cmp     [lba_read_enabled], 1
  539.         je      lbarl1
  540.         mov     eax, 2
  541.         ret
  542.  
  543.   lbarl1:
  544.  
  545.         call    reserve_hd1
  546.  
  547.         push    eax
  548.         push    ecx
  549.  
  550.         mov     edi, hd_address_table
  551.         mov     esi, dir1
  552.         mov     eax, [ebx]
  553.         mov     edx, '1   '
  554.         mov     ecx, 4
  555.   blar0:
  556.         cmp     eax, [esi]
  557.         je      blar2
  558.         cmp     eax, edx
  559.         je      blar2
  560.         inc     edx
  561.         add     edi, 8
  562.         add     esi, 11
  563.         dec     ecx
  564.         jnz     blar0
  565.  
  566.         mov     eax, 1
  567.         mov     ebx, 1
  568.         jmp     LBA_read_ret
  569.  
  570.   blar2:
  571.         mov     eax, [edi+0]
  572.         mov     ebx, [edi+4]
  573.  
  574.         mov     [hdbase], eax
  575.         mov     [hdid], ebx
  576.  
  577.         call    wait_for_hd_idle
  578.         cmp     [hd_error], 0
  579.         jne     hd_lba_error
  580.  
  581.     ; eax = hd port
  582.     ; ebx = set for primary (0x00) or slave (0x10)
  583.  
  584.         cli
  585.  
  586.         mov     edx, eax
  587.         inc     edx
  588.         xor     eax, eax
  589.         out     dx, al
  590.         inc     edx
  591.         inc     eax
  592.         out     dx, al
  593.         inc     edx
  594.         mov     eax, [esp+4]
  595.         out     dx, al
  596.         shr     eax, 8
  597.         inc     edx
  598.         out     dx, al
  599.         shr     eax, 8
  600.         inc     edx
  601.         out     dx, al
  602.         shr     eax, 8
  603.         inc     edx
  604.         and     al, 1+2+4+8
  605.         add     al, bl
  606.         add     al, 128+64+32
  607.         out     dx, al
  608.  
  609.         inc     edx
  610.         mov     al, 20h
  611.         out     dx, al
  612.  
  613.         sti
  614.  
  615.         call    wait_for_sector_buffer
  616.         cmp     [hd_error], 0
  617.         jne     hd_lba_error
  618.  
  619.         cli
  620.  
  621.         mov     edi, [esp+0]
  622.         mov     ecx, 256
  623.         sub     edx, 7
  624.         cld
  625.         rep insw
  626.  
  627.         sti
  628.  
  629.         xor     eax, eax
  630.         xor     ebx, ebx
  631.  
  632.   LBA_read_ret:
  633.         mov     [hd_error], 0
  634.         mov     [hd1_status], 0
  635.         add     esp, 2*4
  636.  
  637.         ret
  638.  
  639.  
  640. expand_pathz:
  641. ; IN:
  642. ;   esi = asciiz path & file
  643. ;   edi = buffer for path & file name
  644. ; OUT:
  645. ;   edi = directory & file : / 11 + / 11 + / 11 - zero terminated
  646. ;   ebx = /file name - zero terminated
  647. ;   esi = pointer after source
  648.  
  649.         push    eax
  650.         push    ecx
  651.         push    edi;[esp+0]
  652.  
  653.   pathz_start:
  654.         mov     byte [edi], '/'
  655.         inc     edi
  656.         mov     al, 32
  657.         mov     ecx, 11
  658.         cld
  659.         rep stosb               ; clear filename area
  660.         sub     edi, 11
  661.         mov     ebx, edi        ; start of dir/file name
  662.  
  663.   pathz_new_char:
  664.         mov     al, [esi]
  665.         inc     esi
  666.         cmp     al, 0
  667.         je      pathz_end
  668.  
  669.         cmp     al, '/'
  670.         jne     pathz_not_path
  671.         cmp     edi, ebx        ; skip first '/'
  672.         jz      pathz_new_char
  673.         lea     edi, [ebx+11]   ; start of next directory
  674.         jmp     pathz_start
  675.  
  676.   pathz_not_path:
  677.         cmp     al, '.'
  678.         jne     pathz_not_ext
  679.         lea     edi, [ebx+8]    ; start of extension
  680.         jmp     pathz_new_char
  681.  
  682.   pathz_not_ext:
  683.         cmp     al, 'a'
  684.         jb      pathz_not_low
  685.         cmp     al, 'z'
  686.         ja      pathz_not_low
  687.         sub     al, 0x20        ; char to uppercase
  688.  
  689.   pathz_not_low:
  690.         mov     [edi], al
  691.         inc     edi
  692.         mov     eax, [esp+0]    ; start_of_dest_path
  693.         add     eax, 512        ; keep maximum path under 512 bytes
  694.         cmp     edi, eax
  695.         jb      pathz_new_char
  696.  
  697.   pathz_end:
  698.         cmp     ebx, edi        ; if path end with '/'
  699.         jnz     pathz_put_zero  ; go back 1 level
  700.         sub     ebx, 12
  701.  
  702.   pathz_put_zero:
  703.         mov     byte [ebx+11], 0
  704.         dec     ebx             ; include '/' char into file name
  705.         pop     edi
  706.         pop     ecx
  707.         pop     eax
  708.         ret
  709.  
  710. ;*******************************************
  711. ;* string to number
  712. ;* input eax - 4 byte string
  713. ;* output eax - number
  714. ;*******************************************
  715. StringToNumber:
  716. ;    ПЕРЕВОД СТРОКОВОГО ЧИСЛА В ЧИСЛОВОЙ ВИД
  717. ;    Вход:
  718. ;        EDI - адрес строки с числом. Конец числа отмечен кодом 0Dh
  719. ;    Выход:
  720. ;        CF - индикатор ошибок:
  721. ;            0 - ошибок нет;
  722. ;            1 - ошибка
  723. ;        Если CF=0, то AX - число.
  724.  
  725.         push    bx
  726.         push    cx
  727.         push    dx
  728.         push    edi
  729.         mov     [partition_string], eax
  730.         mov     edi, partition_string
  731.         xor     cx, cx
  732. i1:
  733.         mov     al, [edi]
  734.         cmp     al, 32;13
  735.         je      i_exit
  736. ;    cmp    al,'0'
  737. ;    jb    err
  738. ;    cmp    al,'9'
  739. ;    ja    err
  740.         sub     al, 48
  741.         shl     cx, 1
  742.         jc      error
  743.         mov     bx, cx
  744.         shl     cx, 1
  745.         jc      error
  746.         shl     cx, 1
  747.         jc      error
  748.         add     cx, bx
  749.         jc      error
  750.         cbw
  751.         add     cx, ax
  752.         jc      error
  753. i3:
  754.         inc     edi
  755.         jmp     i1
  756. i_exit:
  757.         mov     ax, cx
  758.         clc
  759. i4:
  760.         movzx   eax, ax
  761.         pop     edi
  762.         pop     dx
  763.         pop     cx
  764.         pop     bx
  765.         ret
  766.  
  767. error:
  768.         stc
  769.         jmp     i4
  770.  
  771. partition_string:
  772.                   dd 0
  773.                   db 32
  774.