134 lines
2.1 KiB
PHP
134 lines
2.1 KiB
PHP
; =============================================================================
|
|
; VBoxGuest Driver for KolibriOS - Common Utilities
|
|
; Файл: common/utils.inc
|
|
; =============================================================================
|
|
|
|
; sf_utf8_to_cp866 — Конвертировать UTF-8 строку в CP866 (кириллица)
|
|
proc sf_utf8_to_cp866 uses ebx ecx edx esi edi, src:dword, dst:dword, src_len:dword
|
|
mov esi, [src]
|
|
mov edi, [dst]
|
|
mov ecx, [src_len]
|
|
xor edx, edx
|
|
|
|
.u8_loop:
|
|
test ecx, ecx
|
|
jle .u8_done
|
|
|
|
movzx eax, byte [esi]
|
|
|
|
cmp al, 0x80
|
|
jb .u8_ascii
|
|
|
|
cmp al, 0xC0
|
|
jb .u8_skip1
|
|
cmp al, 0xE0
|
|
jb .u8_two_byte
|
|
|
|
cmp al, 0xF0
|
|
jb .u8_skip3
|
|
|
|
mov byte [edi], '?'
|
|
inc edi
|
|
inc edx
|
|
add esi, 4
|
|
sub ecx, 4
|
|
jmp .u8_loop
|
|
|
|
.u8_skip3:
|
|
mov byte [edi], '?'
|
|
inc edi
|
|
inc edx
|
|
add esi, 3
|
|
sub ecx, 3
|
|
jmp .u8_loop
|
|
|
|
.u8_ascii:
|
|
mov [edi], al
|
|
inc esi
|
|
inc edi
|
|
inc edx
|
|
dec ecx
|
|
jmp .u8_loop
|
|
|
|
.u8_two_byte:
|
|
cmp ecx, 2
|
|
jb .u8_done
|
|
|
|
movzx eax, byte [esi]
|
|
movzx ebx, byte [esi + 1]
|
|
and eax, 0x1F
|
|
shl eax, 6
|
|
and ebx, 0x3F
|
|
or eax, ebx
|
|
|
|
cmp eax, 0x0401
|
|
je .u8_yo_upper
|
|
cmp eax, 0x0451
|
|
je .u8_yo_lower
|
|
|
|
cmp eax, 0x0410
|
|
jb .u8_not_cyrillic
|
|
cmp eax, 0x041F
|
|
jbe .u8_upper1
|
|
|
|
cmp eax, 0x042F
|
|
jbe .u8_upper2
|
|
|
|
cmp eax, 0x043F
|
|
jbe .u8_lower1
|
|
|
|
cmp eax, 0x044F
|
|
jbe .u8_lower2
|
|
|
|
jmp .u8_not_cyrillic
|
|
|
|
.u8_upper1:
|
|
sub eax, 0x0410
|
|
add eax, 0x80
|
|
jmp .u8_store2
|
|
|
|
.u8_upper2:
|
|
sub eax, 0x0420
|
|
add eax, 0x90
|
|
jmp .u8_store2
|
|
|
|
.u8_lower1:
|
|
sub eax, 0x0430
|
|
add eax, 0xA0
|
|
jmp .u8_store2
|
|
|
|
.u8_lower2:
|
|
sub eax, 0x0440
|
|
add eax, 0xE0
|
|
jmp .u8_store2
|
|
|
|
.u8_yo_upper:
|
|
mov eax, 0xF0
|
|
jmp .u8_store2
|
|
|
|
.u8_yo_lower:
|
|
mov eax, 0xF1
|
|
jmp .u8_store2
|
|
|
|
.u8_not_cyrillic:
|
|
mov eax, '?'
|
|
|
|
.u8_store2:
|
|
mov [edi], al
|
|
add esi, 2
|
|
sub ecx, 2
|
|
inc edi
|
|
inc edx
|
|
jmp .u8_loop
|
|
|
|
.u8_skip1:
|
|
inc esi
|
|
dec ecx
|
|
jmp .u8_loop
|
|
|
|
.u8_done:
|
|
mov byte [edi], 0
|
|
mov eax, edx
|
|
ret
|
|
endp
|