; ============================================================================= ; 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