Files
kolibrios/drivers/vboxguest/common/utils.inc
lex ab59015ded
Some checks failed
Build system / Check kernel codestyle (pull_request) Has been cancelled
Build system / Build (pull_request) Has been cancelled
Add VBoxGuest driver code
2026-03-04 21:16:17 +03:00

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