Subversion Repositories Kolibri OS

Rev

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

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                              ;;
  3. ;; Copyright (C) KolibriOS team 2004-2016. All rights reserved. ;;
  4. ;;  Distributed under terms of the GNU General Public License.  ;;
  5. ;;                                                              ;;
  6. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  7.  
  8. $Revision: 6845 $
  9.  
  10. ; CD external functions
  11. ;   in:
  12. ; esi -> path string in UTF-8
  13. ; ebx -> offset in file (qword)
  14. ; ecx = bytes to read
  15. ; edx -> buffer
  16. ;   out:
  17. ; eax, ebx = return values for sysfunc 70
  18. iglobal
  19. align 4
  20. fs_CdServices:
  21.         dd      fs_CdRead
  22.         dd      fs_CdReadFolder
  23.         dd      fs_NotImplemented
  24.         dd      fs_NotImplemented
  25.         dd      fs_NotImplemented
  26.         dd      fs_CdGetFileInfo
  27.         dd      fs_NotImplemented
  28.         dd      0
  29.         dd      fs_NotImplemented
  30.         dd      fs_NotImplemented
  31. fs_NumCdServices = ($ - fs_CdServices)/4
  32. endg
  33.  
  34. uglobal
  35. align 4
  36. cd_current_pointer_of_input     dd  0
  37. cd_current_pointer_of_input_2   dd  0
  38. cd_mem_location                 dd  0
  39. cd_counter_block                dd  0
  40. cd_status                       dd  0
  41. endg
  42.  
  43. ;-----------------------------------------------------------------------------
  44. fs_NotImplemented:
  45.         movi    eax, ERROR_UNSUPPORTED_FS
  46.         ret
  47. ;-----------------------------------------------------------------------------
  48. reserve_cd:
  49.         cli
  50.         cmp     [cd_status], 0
  51.         je      reserve_ok2
  52.  
  53.         sti
  54.         call    change_task
  55.         jmp     reserve_cd
  56. ;-----------------------------------------------------------------------------
  57. reserve_ok2:
  58.         push    eax
  59.         mov     eax, [CURRENT_TASK]
  60.         shl     eax, 5
  61.         mov     eax, [eax+CURRENT_TASK+TASKDATA.pid]
  62.         mov     [cd_status], eax
  63.         pop     eax
  64.         sti
  65.         ret
  66. ;-----------------------------------------------------------------------------
  67. reserve_cd_channel:
  68.         pushad
  69.         mov     eax, [cdpos]
  70.         dec     eax
  71.         shr     eax, 2
  72.  
  73.         test    eax, eax
  74.         jnz     .1
  75.  
  76.         cmp     [ChannelNumber], 1
  77.         jne     @f
  78.  
  79.         mov     ecx, ide_channel1_mutex
  80.         jmp     .mutex_lock
  81. ;--------------------------------------
  82. @@:
  83.         mov     ecx, ide_channel2_mutex
  84.         jmp     .mutex_lock
  85. ;--------------------------------------
  86. .1:
  87.         dec     eax
  88.         jnz     .2
  89.  
  90.         cmp     [ChannelNumber], 1
  91.         jne     @f
  92.  
  93.         mov     ecx, ide_channel3_mutex
  94.         jmp     .mutex_lock
  95. ;--------------------------------------
  96. @@:
  97.         mov     ecx, ide_channel4_mutex
  98.         jmp     .mutex_lock
  99. ;--------------------------------------
  100. .2:
  101.         cmp     [ChannelNumber], 1
  102.         jne     @f
  103.  
  104.         mov     ecx, ide_channel5_mutex
  105.         jmp     .mutex_lock
  106. ;--------------------------------------
  107. @@:
  108.         mov     ecx, ide_channel6_mutex
  109. .mutex_lock:
  110.         call    mutex_lock
  111.         popad
  112.         ret
  113. ;-----------------------------------------------------------------------------
  114. free_cd_channel:
  115.         pushad
  116.         mov     eax, [cdpos]
  117.         dec     eax
  118.         shr     eax, 2
  119.  
  120.         test    eax, eax
  121.         jnz     .1
  122.  
  123.         cmp     [ChannelNumber], 1
  124.         jne     @f
  125.  
  126.         mov     ecx, ide_channel1_mutex
  127.         jmp     .mutex_unlock
  128. ;--------------------------------------
  129. @@:
  130.         mov     ecx, ide_channel2_mutex
  131.         jmp     .mutex_unlock
  132. ;--------------------------------------
  133. .1:
  134.         dec     eax
  135.         jnz     .2
  136.  
  137.         cmp     [ChannelNumber], 1
  138.         jne     @f
  139.  
  140.         mov     ecx, ide_channel3_mutex
  141.         jmp     .mutex_unlock
  142. ;--------------------------------------
  143. @@:
  144.         mov     ecx, ide_channel4_mutex
  145.         jmp     .mutex_unlock
  146. ;--------------------------------------
  147. .2:
  148.         cmp     [ChannelNumber], 1
  149.         jne     @f
  150.  
  151.         mov     ecx, ide_channel5_mutex
  152.         jmp     .mutex_unlock
  153. ;--------------------------------------
  154. @@:
  155.         mov     ecx, ide_channel6_mutex
  156. .mutex_unlock:
  157.         call    mutex_unlock
  158.         popad
  159.         ret
  160.  
  161. ;-----------------------------------------------------------------------------
  162. fs_CdRead:
  163.         call    cd_find_lfn
  164.         jc      .notFound
  165.         mov     edi, [cd_current_pointer_of_input]
  166.         test    byte [edi+25], 10b  ; do not allow read directories
  167.         jnz     .noaccess
  168.         test    ebx, ebx
  169.         jz      .l1
  170.         cmp     dword [ebx+4], 0
  171.         jz      @f
  172.         xor     ebx, ebx
  173.         movi    eax, ERROR_END_OF_FILE
  174.         ret
  175.  
  176. .notFound:
  177.         cmp     [DevErrorCode], 0
  178.         jne     .noaccess
  179.         xor     ebx, ebx
  180.         movi    eax, ERROR_FILE_NOT_FOUND
  181.         ret
  182.  
  183. .noaccess_3:
  184.         pop     eax edx ecx
  185. .noaccess:
  186.         xor     ebx, ebx
  187.         movi    eax, ERROR_ACCESS_DENIED
  188.         ret
  189.  
  190. @@:
  191.         mov     ebx, [ebx]
  192. .l1:
  193.         push    ecx edx 0
  194.         mov     eax, [edi+10]   ; real size of the file section
  195.         sub     eax, ebx
  196.         jb      .eof
  197.         cmp     eax, ecx
  198.         jae     @f
  199.         mov     ecx, eax
  200.         pop     eax
  201.         push    ERROR_END_OF_FILE
  202. @@:
  203.         mov     eax, [edi+2]
  204.         mov     [CDSectorAddress], eax
  205. ; now eax=cluster, ebx=position, ecx=count, edx=buffer for data
  206. .new_sector:
  207.         test    ecx, ecx
  208.         jz      .done
  209.         sub     ebx, 2048
  210.         jae     .next
  211.         add     ebx, 2048
  212.         jnz     .incomplete_sector
  213.         cmp     ecx, 2048
  214.         jb      .incomplete_sector
  215. ; we may read and memmove complete sector
  216.         mov     [CDDataBuf_pointer], edx
  217.         call    ReadCDWRetr
  218.         cmp     [DevErrorCode], 0
  219.         jne     .noaccess_3
  220.         add     edx, 2048
  221.         sub     ecx, 2048
  222. .next:
  223.         inc     dword [CDSectorAddress]
  224.         jmp     .new_sector
  225.  
  226. .eof:
  227.         pop     eax
  228.         push    ERROR_END_OF_FILE
  229. .done:
  230.         mov     ebx, edx
  231.         pop     eax edx ecx
  232.         sub     ebx, edx
  233.         ret
  234.  
  235. .incomplete_sector: ; we must read and memmove incomplete sector
  236.         mov     [CDDataBuf_pointer], CDDataBuf
  237.         call    ReadCDWRetr
  238.         cmp     [DevErrorCode], 0
  239.         jne     .noaccess_3
  240.         push    ecx
  241.         add     ecx, ebx
  242.         cmp     ecx, 2048
  243.         jbe     @f
  244.         mov     ecx, 2048
  245. @@:
  246.         sub     ecx, ebx
  247.         push    edi esi ecx
  248.         mov     edi, edx
  249.         lea     esi, [CDDataBuf + ebx]
  250.         cld
  251.         rep movsb
  252.         pop     ecx esi edi
  253.         add     edx, ecx
  254.         sub     [esp], ecx
  255.         pop     ecx
  256.         xor     ebx, ebx
  257.         jmp     .next
  258.  
  259. ;-----------------------------------------------------------------------------
  260. fs_CdReadFolder:
  261.         push    edi
  262.         call    cd_find_lfn
  263.         jnc     .found
  264.         pop     edi
  265.         cmp     [DevErrorCode], 0
  266.         jne     .noaccess_1
  267.         or      ebx, -1
  268.         mov     eax, ERROR_FILE_NOT_FOUND
  269.         ret
  270.  
  271. .found:
  272.         mov     edi, [cd_current_pointer_of_input]
  273.         test    byte [edi+25], 10b    ; do not allow read directories
  274.         jnz     .found_dir
  275.         pop     edi
  276. .noaccess_1:
  277.         or      ebx, -1
  278.         mov     eax, ERROR_ACCESS_DENIED
  279.         ret
  280.  
  281. .end_buffer:
  282.         pop     edx eax
  283.         sub     eax, 2048   ; directory is over?
  284.         ja      .read_to_buffer
  285.         mov     eax, [cd_counter_block]
  286.         mov     [edx+8], eax
  287.         mov     eax, [ebx]
  288.         sub     [edx+4], eax
  289.         xor     eax, eax
  290.         dec     ecx
  291.         js      @f
  292.         mov     al, ERROR_END_OF_FILE
  293. @@:
  294.         pop     ecx edi
  295.         mov     ebx, [edx+4]
  296.         ret
  297.  
  298. .found_dir:
  299.         mov     eax, [edi+2]    ; eax=cluster
  300.         mov     [CDSectorAddress], eax
  301.         mov     eax, [edi+10]   ; directory size
  302.         push    eax ecx
  303.         mov     edi, edx
  304.         mov     ecx, 32/4
  305.         xor     eax, eax
  306.         rep stosd
  307.         pop     ecx eax
  308.         mov     byte [edx], 1   ; version
  309.         mov     [cd_mem_location], edx
  310.         add     [cd_mem_location], 32
  311.         mov     [cd_counter_block], dword 0
  312.         dec     dword [CDSectorAddress]
  313.         push    ecx
  314. .read_to_buffer:
  315.         inc     dword [CDSectorAddress]
  316.         mov     [CDDataBuf_pointer], CDDataBuf
  317.         call    ReadCDWRetr     ; read sector of directory
  318.         cmp     [DevErrorCode], 0
  319.         jne     .noaccess_1
  320.         mov     [cd_current_pointer_of_input_2], CDDataBuf
  321.         push    eax edx
  322. .get_names_from_buffer:
  323.         call    cd_get_name
  324.         jc      .end_buffer
  325.         inc     dword [cd_counter_block]
  326.         mov     eax, [cd_counter_block]
  327.         cmp     [ebx], eax
  328.         jae     .get_names_from_buffer
  329.         test    ecx, ecx
  330.         jz      .get_names_from_buffer
  331.         mov     edi, [cd_counter_block]
  332.         mov     [edx+4], edi
  333.         dec     ecx
  334.         mov     esi, ebp
  335.         call    cd_get_parameters_of_file
  336.         add     edi, 40
  337.         mov     ax, '.'
  338.         cmp     dword[ebx+4], 2
  339.         jz      .utf16
  340.         cmp     dword[ebx+4], 3
  341.         jz      .utf8
  342.         cmp     [cd_counter_block], 2
  343.         jbe     .parentDirectory
  344. @@:
  345.         lodsw
  346.         xchg    ah, al
  347.         call    uni2ansi_char
  348.         stosb
  349.         call    .checkForEnd
  350.         jc      @b
  351. @@:
  352.         mov     [edi], byte 0
  353.         add     [cd_mem_location], 304
  354.         jmp     .get_names_from_buffer
  355.  
  356. .parentDirectory:
  357.         stosb
  358.         cmp     [cd_counter_block], 2
  359.         jnz     @b
  360.         stosb
  361.         jmp     @b
  362.  
  363. .utf8:
  364.         add     [cd_mem_location], 256
  365.         cmp     [cd_counter_block], 2
  366.         jbe     .parentDirectory
  367.         push    ecx
  368.         mov     ecx, 519
  369. @@:
  370.         lodsw
  371.         xchg    ah, al
  372.         call    UTF16to8
  373.         js      @f
  374.         call    .checkForEnd
  375.         jc      @b
  376. @@:
  377.         pop     ecx
  378.         mov     [edi], byte 0
  379.         add     [cd_mem_location], 304
  380.         jmp     .get_names_from_buffer
  381.  
  382. .checkForEnd:
  383.         mov     ax, [esi]
  384.         cmp     ax, 3B00h   ; ';'
  385.         jz      @f
  386. ; check for files not ending with separator
  387.         movzx   eax, byte [ebp-33]
  388.         add     eax, ebp
  389.         sub     eax, 34
  390.         cmp     esi, eax
  391.         jz      @f
  392. ; check the end of the directory
  393.         movzx   eax, byte [ebp-1]
  394.         add     eax, ebp
  395.         cmp     esi, eax
  396. @@:
  397.         ret
  398.  
  399. .utf16:
  400.         cmp     [cd_counter_block], 2
  401.         jbe     .utf16ParentDirectory
  402. @@:
  403.         lodsw
  404.         xchg    ah, al
  405.         stosw
  406.         call    .checkForEnd
  407.         jc      @b
  408. @@:
  409.         mov     [edi], word 0
  410.         add     [cd_mem_location], 560
  411.         jmp     .get_names_from_buffer
  412.  
  413. .utf16ParentDirectory:
  414.         stosw
  415.         cmp     [cd_counter_block], 2
  416.         jnz     @b
  417.         stosw
  418.         jmp     @b
  419.  
  420. cd_get_parameters_of_file:
  421.         mov     edi, [cd_mem_location]
  422. cd_get_parameters_of_file_1:
  423. ; get file attributes
  424.         xor     eax, eax
  425. ; file is not archived
  426.         inc     eax
  427.         shl     eax, 1
  428. ; is a directory?
  429.         test    [ebp-8], byte 2
  430.         jz      .file
  431.         inc     eax
  432. .file:
  433. ; not as a volume label in the FAT, in this form not available
  434. ; file is not a system
  435.         shl     eax, 3
  436. ; file is hidden? (attribute of existence)
  437.         test    [ebp-8], byte 1
  438.         jz      .hidden
  439.         inc     eax
  440. .hidden:
  441.         shl     eax, 1
  442. ; file is always read-only, as this CD
  443.         inc     eax
  444.         mov     [edi], eax
  445.         mov     eax, [ebx+4]
  446.         mov     [edi+4], eax
  447. ; get the time to file
  448. ; hour
  449.         movzx   eax, byte [ebp-12]
  450.         shl     eax, 8
  451. ; minute
  452.         mov     al, [ebp-11]
  453.         shl     eax, 8
  454. ; second
  455.         mov     al, [ebp-10]
  456. ; file creation time
  457.         mov     [edi+8], eax
  458. ; last access time
  459.         mov     [edi+16], eax
  460. ; last write time
  461.         mov     [edi+24], eax
  462. ; get date for file
  463. ; year
  464.         movzx   eax, byte [ebp-15]
  465.         add     eax, 1900
  466.         shl     eax, 8
  467. ; month
  468.         mov     al, [ebp-14]
  469.         shl     eax, 8
  470. ; day
  471.         mov     al, [ebp-13]
  472. ; file creation date
  473.         mov     [edi+12], eax
  474. ; last access date
  475.         mov     [edi+20], eax
  476. ; last write date
  477.         mov     [edi+28], eax
  478. ; get the file size in bytes
  479.         xor     eax, eax
  480.         mov     [edi+32+4], eax
  481.         mov     eax, [ebp-23]
  482.         mov     [edi+32], eax
  483.         ret
  484.  
  485. ;-----------------------------------------------------------------------------
  486. fs_CdGetFileInfo:
  487.         cmp     byte [esi], 0
  488.         jnz     @f
  489.  
  490.         mov     eax, 2
  491.         ret
  492. ;--------------------------------------
  493. @@:
  494.         push    edi
  495.         call    cd_find_lfn
  496.         pushfd
  497.         cmp     [DevErrorCode], 0
  498.         jz      @f
  499.  
  500.         popfd
  501.         pop     edi
  502.         mov     eax, 11
  503.         ret
  504. ;--------------------------------------
  505. @@:
  506.         popfd
  507.         jnc     @f
  508.  
  509.         pop     edi
  510.         mov     eax, ERROR_FILE_NOT_FOUND
  511.         ret
  512. ;--------------------------------------
  513. @@:
  514.  
  515.         mov     edi, edx
  516.         push    ebp
  517.         mov     ebp, [cd_current_pointer_of_input]
  518.         add     ebp, 33
  519.         call    cd_get_parameters_of_file_1
  520.         pop     ebp
  521.         and     dword [edi+4], 0
  522.         pop     edi
  523.         xor     eax, eax
  524.         ret
  525. ;-----------------------------------------------------------------------------
  526. cd_find_lfn:
  527.         mov     [cd_appl_data], 0
  528. ; in: esi -> path string in UTF-8
  529. ; out: [cd_current_pointer_of_input] -> direntry, CF=1 -> file not found
  530.         push    eax esi
  531. ; Sector 16 - start set of volume descriptors
  532.         call    WaitUnitReady
  533.         cmp     [DevErrorCode], 0
  534.         jne     .access_denied
  535.  
  536.         call    prevent_medium_removal
  537. ; testing of reading
  538.         mov     [CDSectorAddress], dword 16
  539.         mov     [CDDataBuf_pointer], CDDataBuf
  540.         call    ReadCDWRetr;_1
  541.         cmp     [DevErrorCode], 0
  542.         jne     .access_denied
  543.  
  544. ; calculation of the last session
  545.         call    WaitUnitReady
  546.         cmp     [DevErrorCode], 0
  547.         jne     .access_denied
  548.  
  549.         call    Read_TOC
  550.         mov     ah, [CDDataBuf+4+4]
  551.         mov     al, [CDDataBuf+4+5]
  552.         shl     eax, 16
  553.         mov     ah, [CDDataBuf+4+6]
  554.         mov     al, [CDDataBuf+4+7]
  555.         add     eax, 15
  556.         mov     [CDSectorAddress], eax
  557. ;  mov  [CDSectorAddress],dword 15
  558.         mov     [CDDataBuf_pointer], CDDataBuf
  559. ;--------------------------------------
  560. .start:
  561.         inc     dword [CDSectorAddress]
  562.         call    ReadCDWRetr;_1
  563.         cmp     [DevErrorCode], 0
  564.         jne     .access_denied
  565.  
  566. .start_check:
  567. ; checking for "lice"
  568.         cmp     [CDDataBuf+1], dword 'CD00'
  569.         jne     .access_denied
  570.  
  571.         cmp     [CDDataBuf+5], byte '1'
  572.         jne     .access_denied
  573. ; sector is the terminator of set of descriptors volumes?
  574.         cmp     [CDDataBuf], byte 0xff
  575.         je      .access_denied
  576. ; sector is an additional and improved descriptor of volume?
  577.         cmp     [CDDataBuf], byte 0x2
  578.         jne     .start
  579. ; sector is an additional descriptor of volume?
  580.         cmp     [CDDataBuf+6], byte 0x1
  581.         jne     .start
  582.  
  583. ; parameters of root directory
  584.         mov     eax, [CDDataBuf+0x9c+2]; start of root directory
  585.         mov     [CDSectorAddress], eax
  586.         mov     eax, [CDDataBuf+0x9c+10]; size of root directory
  587.         cmp     byte [esi], 0
  588.         jnz     @f
  589.  
  590.         mov     [cd_current_pointer_of_input], CDDataBuf+0x9c
  591.         jmp     .done
  592. ;--------------------------------------
  593. @@:
  594. ; start the search
  595. .mainloop:
  596.         dec     dword [CDSectorAddress]
  597. ;--------------------------------------
  598. .read_to_buffer:
  599.         inc     dword [CDSectorAddress]
  600.         mov     [CDDataBuf_pointer], CDDataBuf
  601.         call    ReadCDWRetr      ; read sector of directory
  602.         cmp     [DevErrorCode], 0
  603.         jne     .access_denied
  604.         call    cd_find_name_in_buffer
  605.         jnc     .found
  606.         sub     eax, 2048
  607. ; directory is over?
  608.         cmp     eax, 0
  609.         ja      .read_to_buffer
  610. ; desired element of chain is not found
  611. .access_denied:
  612.         pop     esi eax
  613.         mov     [cd_appl_data], 1
  614.         stc
  615.         ret
  616. ;--------------------------------------
  617. ; desired element of chain found
  618. .found:
  619. ; the end of the file path
  620.         cmp     byte [esi-1], 0
  621.         jz      .done
  622.         mov     eax, [cd_current_pointer_of_input]
  623.         push    dword [eax+2]
  624.         pop     dword [CDSectorAddress] ; beginning of the directory
  625.         mov     eax, [eax+2+8] ; size of directory
  626.         jmp     .mainloop
  627. ;--------------------------------------
  628. ; file pointer found
  629. .done:
  630.         pop     esi eax
  631.         mov     [cd_appl_data], 1
  632.         clc
  633.         ret
  634. ;-----------------------------------------------------------------------------
  635. cd_find_name_in_buffer:
  636.         mov     [cd_current_pointer_of_input_2], CDDataBuf
  637. ;--------------------------------------
  638. .start:
  639.         call    cd_get_name
  640.         jc      .not_found
  641.  
  642.         call    cd_compare_name
  643.         jc      .start
  644. ;--------------------------------------
  645. .found:
  646.         clc
  647.         ret
  648. ;--------------------------------------
  649. .not_found:
  650.         stc
  651.         ret
  652. ;-----------------------------------------------------------------------------
  653. cd_get_name:
  654.         push    eax
  655.         mov     ebp, [cd_current_pointer_of_input_2]
  656.         mov     [cd_current_pointer_of_input], ebp
  657.         mov     eax, [ebp]
  658.         test    eax, eax ; entry's is over?
  659.         jz      .next_sector
  660.  
  661.         cmp     ebp, CDDataBuf+2048  ; buffer is over?
  662.         jae     .next_sector
  663.  
  664.         movzx   eax, byte [ebp]
  665.         add     [cd_current_pointer_of_input_2], eax ; next entry of directory
  666.         add     ebp, 33; pointer is set to the beginning of the name
  667.         pop     eax
  668.         clc
  669.         ret
  670. ;--------------------------------------
  671. .next_sector:
  672.         pop     eax
  673.         stc
  674.         ret
  675. ;-----------------------------------------------------------------------------
  676. cd_compare_name:
  677. ; in: esi -> UTF-8 name, ebp -> UTF-16BE name
  678. ; out: CF=0 -> names match, esi -> next component of name
  679. ;      CF=1 -> esi is not changed
  680.         push    edx edi eax esi
  681.         mov     edi, ebp
  682. .loop:
  683.         call    utf8to16
  684.         call    utf16toUpper
  685.         mov     edx, eax
  686.         mov     ax, [edi]
  687.         xchg    al, ah
  688.         call    utf16toUpper
  689.         cmp     ax, dx
  690.         jne     .name_not_coincide
  691.         add     edi, 2
  692.         cmp     [esi], byte '/' ; path separator is end of current element
  693.         je      .done
  694.         cmp     [esi], byte 0 ; path separator end of name
  695.         jne     .loop
  696. .done:
  697. ; check end of file
  698.         cmp     [edi], word 3B00h; separator end of file ';'
  699.         je      .done_1
  700. ; check for files not ending with separator
  701.         movzx   eax, byte [ebp-33]
  702.         add     eax, ebp
  703.         sub     eax, 34
  704.         cmp     edi, eax
  705.         je      .done_1
  706. ; check the end of directory
  707.         movzx   eax, byte [ebp-1]
  708.         add     eax, ebp
  709.         cmp     edi, eax
  710.         jne     .name_not_coincide
  711. .done_1:
  712.         pop     eax eax edi edx
  713.         inc     esi
  714.         ret
  715.  
  716. .name_not_coincide:
  717.         pop     esi eax edi edx
  718.         stc
  719.         ret
  720.