Subversion Repositories Kolibri OS

Rev

Rev 10016 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                              ;;
  3. ;; Copyright (C) KolibriOS team 2004-2024. All rights reserved. ;;
  4. ;;  Distributed under terms of the GNU General Public License.  ;;
  5. ;;                                                              ;;
  6. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  7.  
  8.  
  9. iglobal
  10. full_file_name_table    dd  sysdir_name
  11. .size                   dd  1
  12. endg
  13.  
  14. uglobal
  15. sysdir_name     rb  64  ; 'sys',0
  16. sysdir_path     rb  64
  17. sysdir_name1    rb  64
  18. sysdir_path1    rb  64
  19. endg
  20. ; Example:
  21. ; align 64
  22. ; sysdir_name1 db 'KolibriOS',0
  23. ; align 64
  24. ; sysdir_path1 db 'HD0/1',0
  25.  
  26. proc Parser_params
  27.     locals
  28.         buff    rb  4   ; for test cd
  29.     endl
  30. if defined extended_primary_loader
  31.         mov     ecx, sysdir_path
  32.         mov     [ecx-64], dword 'sys'
  33.         mov     [ecx-2], byte 3
  34.         mov     esi, BOOT.syspath
  35.         mov     edi, sysdir_path-1
  36.         mov     ecx, 20
  37.         rep movsb
  38.         ret
  39. else
  40.         mov     ax, [BOOT.sys_disk]
  41.         mov     ecx, sysdir_path
  42.         mov     [ecx-64], dword 'sys'
  43.         mov     [ecx-2], byte 3
  44.         mov     [ecx-1], byte '/'
  45.         cmp     al, 'r' ; ram disk
  46.         jnz     @f
  47.         mov     [ecx], dword 'RD/?'
  48.         mov     [ecx+3], byte ah
  49.         mov     [ecx+4], byte 0
  50.         ret
  51.  
  52. @@:
  53.         cmp     al, 'm'
  54.         jnz     .hard_disk
  55.         mov     [ecx], dword 'CD?/'
  56.         mov     [ecx+4], byte '1'
  57.         mov     [ecx+5], dword '/KOL'
  58.         mov     [ecx+9], dword 'IBRI'
  59.         mov     [ecx+13], byte 0
  60. .next_cd:
  61.         mov     [ecx+2], byte ah
  62.         inc     ah
  63.         cmp     ah, '5'
  64.         je      @f
  65.         lea     edx, [buff]
  66.         pushad
  67.         stdcall read_file, read_firstapp, edx, 0, 4
  68.         popad
  69.         cmp     [edx], dword 'MENU'
  70.         jne     .next_cd
  71. @@:
  72.         ret
  73.  
  74. .hard_disk:
  75.         sub     al, '1'
  76.         mov     [ecx], dword 'HD?/'
  77.         mov     [ecx+2], byte al
  78.         mov     [ecx+4], byte ah
  79.         mov     [ecx+5], dword '/KOL'
  80.         mov     [ecx+9], dword 'IBRI'
  81.         mov     [ecx+13], byte 0
  82.         ret
  83. end if
  84.  
  85. endp
  86.  
  87. cp866toUpper:
  88. ; convert cp866 character in al to uppercase
  89.         cmp     al, 'a'
  90.         jb      .ret
  91.         cmp     al, 'z'
  92.         jbe     @f
  93.         cmp     al, 0xA0
  94.         jb      .ret
  95.         cmp     al, 0xB0
  96.         jb      @f
  97.         cmp     al, 0xE0
  98.         jb      .ret
  99.         cmp     al, 0xF0
  100.         jb      .rus
  101.         cmp     al, 0xF7
  102.         ja      .ret
  103.         and     eax, -2
  104. .ret:
  105.         ret
  106.  
  107. @@:
  108.         sub     eax, 32
  109.         ret
  110.  
  111. .rus:
  112.         sub     eax, 0xE0-0x90
  113.         ret
  114.  
  115. utf16toUpper:
  116. ; convert UTF-16 character in ax to uppercase
  117.         cmp     ax, 'a'
  118.         jb      .ret
  119.         cmp     ax, 'z'
  120.         jbe     @f
  121.         cmp     ax, 430h
  122.         jb      .ret
  123.         cmp     ax, 450h
  124.         jb      @f
  125.         cmp     ax, 460h
  126.         jnc     .ret
  127.         sub     eax, 80
  128. .ret:
  129.         ret
  130.  
  131. @@:
  132.         sub     eax, 32
  133.         ret
  134.  
  135. uni2ansi_char:
  136. ; convert UNICODE character in ax to ANSI character in al using cp866 encoding
  137.         cmp     ax, 0x80
  138.         jb      .ret
  139.         cmp     ax, 0xB6
  140.         jz      .B6
  141.         cmp     ax, 0x400
  142.         jb      .unk
  143.         cmp     ax, 0x410
  144.         jb      @f
  145.         cmp     ax, 0x440
  146.         jb      .rus1
  147.         cmp     ax, 0x450
  148.         jb      .rus2
  149.         cmp     ax, 0x460
  150.         jb      @f
  151. .unk:
  152.         mov     al, '_'
  153. .ret:
  154.         ret
  155.  
  156. .B6:
  157.         mov     al, 20
  158.         ret
  159.  
  160. .rus1:  ; 0x410-0x43F -> 0x80-0xAF
  161.         add     al, 0x70
  162.         ret
  163.  
  164. .rus2:  ; 0x440-0x44F -> 0xE0-0xEF
  165.         add     al, 0xA0
  166.         ret
  167.  
  168. @@:
  169.         push    ecx edi
  170.         mov     ecx, 8
  171.         mov     edi, .table
  172.         repnz scasb
  173.         mov     ah, cl
  174.         pop     edi ecx
  175.         jnz     .unk
  176.         mov     al, 0xF7
  177.         sub     al, ah
  178.         ret
  179.  
  180. .table  db  1, 51h, 4, 54h, 7, 57h, 0Eh, 5Eh
  181.  
  182. ansi2uni_char:
  183. ; convert ANSI character in al to UNICODE character in ax, using cp866 encoding
  184.         movzx   eax, al
  185.         cmp     al, 0x80
  186.         jb      @f      ; 0x00-0x7F - trivial map
  187.         cmp     al, 0xB0
  188.         jb      .rus    ; 0x80-0xAF -> 0x410-0x43F
  189.         cmp     al, 0xE0
  190.         jb      .unk
  191.         cmp     al, 0xF0
  192.         jb      .rus2   ; 0xE0-0xEF -> 0x440-0x44F
  193.         cmp     al, 0xF8
  194.         jnc     .unk
  195.         mov     al, [eax+uni2ansi_char.table-0xF0]
  196.         add     ax, 400h
  197.         ret
  198.  
  199. @@:
  200.         cmp     al, 20
  201.         jnz     .ret
  202.         mov     al, 0xB6
  203. .ret:
  204.         ret
  205.  
  206. .rus:
  207.         add     ax, 0x410-0x80
  208.         ret
  209.  
  210. .rus2:
  211.         add     ax, 0x440-0xE0
  212.         ret
  213.  
  214. .unk:
  215.         mov     al, '_'
  216.         ret
  217.  
  218. cp866toUTF8_string:
  219. ;   in:
  220. ; esi -> cp866 string (could be zero terminated)
  221. ; edi -> buffer for UTF-8 string
  222. ; ecx = buffer size (signed)
  223.         lodsb
  224.         call    ansi2uni_char
  225.         push    eax
  226.         call    UTF16to8
  227.         pop     eax
  228.         js      @f
  229.         test    eax, eax
  230.         jnz     cp866toUTF8_string
  231. @@:
  232.         ret
  233.  
  234. ; SF=1 -> counter
  235. ; ZF=1 -> zero char
  236.  
  237. UTF16to8_string:
  238. ;   in:
  239. ; esi -> UTF-16 string (could be zero terminated)
  240. ; edi -> buffer for UTF-8 string
  241. ; ecx = buffer size (signed)
  242.         xor     eax, eax
  243. @@:
  244.         lodsw
  245.         push    eax
  246.         call    UTF16to8
  247.         pop     eax
  248.         js      @f
  249.         test    eax, eax
  250.         jnz     @b
  251. @@:
  252.         ret
  253.  
  254. UTF16to8:
  255. ;   in:
  256. ; eax = UTF-16 char
  257. ; edi -> buffer for UTF-8 char (increasing)
  258. ; ecx = byte counter (decreasing)
  259.         dec     ecx
  260.         js      .ret
  261.         cmp     eax, 80h
  262.         jnc     @f
  263.         stosb
  264.         test    eax, eax    ; SF=0
  265. .ret:
  266.         ret
  267.  
  268. @@:
  269.         dec     ecx
  270.         js      .ret
  271.         cmp     eax, 800h
  272.         jnc     @f
  273.         shl     eax, 2
  274.         shr     al, 2
  275.         or      eax, 1100000010000000b
  276.         xchg    al, ah
  277.         stosw
  278.         ret
  279.  
  280. @@:
  281.         dec     ecx
  282.         js      .ret
  283.         shl     eax, 4
  284.         shr     ax, 2
  285.         shr     al, 2
  286.         or      eax, 111000001000000010000000b
  287.         bswap   eax
  288.         shr     eax, 8
  289.         stosb
  290.         shr     eax, 8
  291.         stosw
  292.         ret
  293.  
  294. utf8to16:
  295. ; in: esi -> UTF-8 char (increasing)
  296. ; out: ax = UTF-16 char
  297.         lodsb
  298.         test    al, al
  299.         jns     .got
  300.         shl     al, 2
  301.         jnc     utf8to16
  302. @@:
  303.         shl     ax, 8
  304.         lodsb
  305.         test    al, al
  306.         jns     .got
  307.         shl     al, 2
  308.         jc      @b
  309.         shr     ah, 2
  310.         shl     ax, 3
  311.         jnc     @f
  312.         shl     eax, 3
  313.         lodsb
  314.         test    al, al
  315.         jns     .got
  316.         shl     al, 2
  317.         jc      @b
  318.         shr     eax, 2
  319.         ret
  320.  
  321. @@:
  322.         shr     ax, 5
  323.         ret
  324.  
  325. .got:
  326.         xor     ah, ah
  327.         ret
  328.  
  329. strlen:
  330. ; in: esi -> source
  331. ; out: ecx = length
  332.         push    edi eax
  333.         or      ecx, -1
  334.         mov     edi, esi
  335.         xor     eax, eax
  336.         repnz scasb
  337.         inc     ecx
  338.         not     ecx
  339.         pop     eax edi
  340.         ret
  341.