Subversion Repositories Kolibri OS

Rev

Rev 8089 | 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: 8091 $
  9.  
  10. iglobal
  11. full_file_name_table    dd  sysdir_name
  12. .size                   dd  1
  13. endg
  14.  
  15. uglobal
  16. sysdir_name     rb  64  ; 'sys',0
  17. sysdir_path     rb  64
  18. sysdir_name1    rb  64
  19. sysdir_path1    rb  64
  20. endg
  21. ; Example:
  22. ; align 64
  23. ; sysdir_name1 db 'KolibriOS',0
  24. ; align 64
  25. ; sysdir_path1 db 'HD0/1',0
  26.  
  27. proc Parser_params
  28.     locals
  29.         buff    rb  4   ; for test cd
  30.     endl
  31. if defined extended_primary_loader
  32.         mov     ecx, sysdir_path
  33.         mov     [ecx-64], dword 'sys'
  34.         mov     [ecx-2], byte 3
  35.         mov     esi, BOOT.syspath
  36.         mov     edi, sysdir_path-1
  37.         mov     ecx, 20
  38.         rep movsb
  39.         ret
  40. else
  41.         mov     ax, [BOOT.sys_disk]
  42.         mov     ecx, sysdir_path
  43.         mov     [ecx-64], dword 'sys'
  44.         mov     [ecx-2], byte 3
  45.         mov     [ecx-1], byte '/'
  46.         cmp     al, 'r' ; ram disk
  47.         jnz     @f
  48.         mov     [ecx], dword 'RD/?'
  49.         mov     [ecx+3], byte ah
  50.         mov     [ecx+4], byte 0
  51.         ret
  52.  
  53. @@:
  54.         cmp     al, 'm'
  55.         jnz     .hard_disk
  56.         mov     [ecx], dword 'CD?/'
  57.         mov     [ecx+4], byte '1'
  58.         mov     [ecx+5], dword '/KOL'
  59.         mov     [ecx+9], dword 'IBRI'
  60.         mov     [ecx+13], byte 0
  61. .next_cd:
  62.         mov     [ecx+2], byte ah
  63.         inc     ah
  64.         cmp     ah, '5'
  65.         je      @f
  66.         lea     edx, [buff]
  67.         pushad
  68.         stdcall read_file, read_firstapp, edx, 0, 4
  69.         popad
  70.         cmp     [edx], dword 'MENU'
  71.         jne     .next_cd
  72. @@:
  73.         ret
  74. end if
  75.  
  76. .hard_disk:
  77.         sub     al, '1'
  78.         mov     [ecx], dword 'HD?/'
  79.         mov     [ecx+2], byte al
  80.         mov     [ecx+4], byte ah
  81.         mov     [ecx+5], dword '/KOL'
  82.         mov     [ecx+9], dword 'IBRI'
  83.         mov     [ecx+13], byte 0
  84.         ret
  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.