Burer df0c5d8f48 Сharsets: Updated to 0.4.2 (#196)
30.03.2025 - 0.4.0
- Localization for all system languages
- Display all character scales
- Abolity to copy character codes
- Block on charpage 00 for CP866
- New character code half markers
- Navigation using keys (see hotkeys.txt)

03.04.2025 - 0.4.1
- Fixed bug with codes color subscription

04.04.2025 - 0.4.2
- Fixed bug with resetting UTF charpage to zero on double charset swap to CP866
- Improved charpage blocking for CP866 UX
- Improved char codes copying UI

Reviewed-on: https://git.kolibrios.org/KolibriOS/kolibrios/pulls/196
Reviewed-by: Max Logaev <maxlogaev@proton.me>
Co-authored-by: Burer <burer@kolibrios.org>
Co-committed-by: Burer <burer@kolibrios.org>
2025-04-10 16:24:11 +02:00

1236 lines
33 KiB
NASM
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

; SPDX-License-Identifier: GPL-2.0-only
;
; Charsets - Charsets Viewer
; Copyright (C) 2025 KolibriOS team
;
; Contributor Burer - Main code
; Contributor Doczom - UTF-8 to UTF-16 convertor
; ================================================================
use32
org 0
; ================================================================
db 'MENUET01'
dd 1
dd START
dd I_END
dd MEM
dd STACKTOP
dd 0
dd 0
; ================================================================
include '../../macros.inc'
include "../../KOSfuncs.inc"
include "../../encoding.inc"
; ================================================================
START: ; start of execution
call draw_window ; draw the window
event_wait:
mcall SF_WAIT_EVENT
cmp al, 1
je red
cmp al, 2
je key
cmp al, 3
je button
jmp event_wait
red:
call draw_window
jmp event_wait
key:
mcall SF_GET_KEY
; no input
cmp al, 1
je event_wait
; if not reading - skip
cmp [reading], 0x01
je .read_input
; moving scancode to ah
shr eax, 16
.key_pagedown:
cmp al, 81
jne .key_pageup
call logic_charpage_dec
jmp .key_end
.key_pageup:
cmp al, 73
jne .key_pagezero
call logic_charpage_inc
jmp .key_end
.key_pagezero:
cmp al, 82
jne .key_arr_left
call logic_charpage_zero
jmp .key_end
.key_arr_left:
cmp al, 75
jne .key_arr_right
call logic_char_left
jmp .key_end
.key_arr_right:
cmp al, 77
jne .key_arr_down
call logic_char_right
jmp .key_end
.key_arr_down:
cmp al, 72
jne .key_arr_up
call logic_char_down
jmp .key_end
.key_arr_up:
cmp al, 80
jne .key_scale_down
call logic_char_up
jmp .key_end
.key_scale_down:
cmp al, 74
jne .key_scale_up
call logic_scale_down
jmp .key_end
.key_scale_up:
cmp al, 78
jne .key_home
call logic_scale_up
jmp .key_end
.key_home:
cmp al, 71
jne .key_end
call logic_charpage_zero
jmp .key_end
; reading inputted char
.read_input:
mov [char], ah
mov [page], 0x00
push eax
shr ax, 8
xor ah, ah
mov [char_ascii], ax
pop eax
shr eax, 16
mov [char_scan], ax
mov [letter], 0x0000
.key_end:
call logic_update
jmp event_wait
button:
mcall SF_GET_BUTTON
.close: ; window close button
cmp ah, 1
jne .button_a
mcall SF_TERMINATE_PROCESS
.button_a: ; 0A - select character
cmp ah, 0x0A
jne .button_b
mcall SF_MOUSE_GET, SSF_WINDOW_POSITION
sub eax, 0x00220022
mov bl, 24
div bl
mov cl, al
shl cl, 4
shr eax, 16
div bl
add cl, al
mov [char], cl
mov [char_scan], 0x0000
jmp .button_end
.button_b: ; 0B - charset CP866 6x9
cmp ah, 0x0B
jne .button_c
call draw_charpage_delete
mov [page], 0x00
mov [charset], 0x80
mov [lb_curr], lb_cp6x9
jmp .button_end
.button_c: ; 0C - charset CP866 8x16
cmp ah, 0x0C
jne .button_d
call draw_charpage_delete
mov [page], 0x00
mov [charset], 0x90
mov [lb_curr], lb_cp8x16
jmp .button_end
.button_d: ; 0D - charset UTF-16 8x16
cmp ah, 0x0D
jne .button_e
call draw_charpage_buttons
mov al, [page_utf]
mov [page], al
mov [charset], 0xA0
mov [lb_curr], lb_utf16
jmp .button_end
.button_e: ; 0E - charset UTF-8 8x16
cmp ah, 0x0E
jne .button_f
call draw_charpage_buttons
mov al, [page_utf]
mov [page], al
mov [charset], 0xB0
mov [lb_curr], lb_utf8
call .button_end
.button_f: ; 0F - charpage reset
cmp ah, 0x0F
jne .button_10
call logic_charpage_zero
jmp event_wait
.button_10: ; 10 - charpage decrement
cmp ah, 0x10
jne .button_11
call logic_charpage_dec
jmp event_wait
.button_11: ; 11 - charpage increment
cmp ah, 0x11
jne .button_12
call logic_charpage_inc
jmp event_wait
.button_12: ; 12 - read/stop keyboard input
cmp ah, 0x12
jne .button_13
mov al, 0x01
sub al, [reading]
mov [reading], al
call draw_toggle
jmp event_wait
.button_13: ; 13 - character scale down
cmp ah, 0x13
jne .button_14
call logic_scale_down
jmp event_wait
.button_14: ; 14 - character scale up
cmp ah, 0x14
jne .button_15
call logic_scale_up
jmp event_wait
.button_15: ; 15 - copy ascii dec
cmp ah, 0x15
jne .button_16
mov dx, [char_ascii]
call logic_copy_dec
jmp event_wait
.button_16: ; 18 - copy scan dec
cmp ah, 0x16
jne .button_17
mov dx, [char_scan]
call logic_copy_dec
jmp event_wait
.button_17: ; 17 - copy ascii hex
cmp ah, 0x17
jne .button_18
mov dx, [char_ascii]
call logic_copy_hex
jmp event_wait
.button_18: ; 18 - copy scan hex
cmp ah, 0x18
jne event_wait
mov dx, [char_scan]
call logic_copy_hex
jmp event_wait
.button_end:
call logic_update
jmp event_wait
; ===================================================================
; set charpage number to zero
logic_charpage_zero:
cmp [charset], 0x90
jle event_wait
mov [page], 0x00
mov [page_utf], 0x00
call logic_update
ret
; decrement charpage number
logic_charpage_dec:
cmp [charset], 0x90
jle event_wait
dec byte [page]
dec byte [page_utf]
call logic_update
ret
; increment charpage number
logic_charpage_inc:
cmp [charset], 0x90
jle event_wait
inc byte [page]
inc byte [page_utf]
call logic_update
ret
; moving in charpage
; dec/inc lower nibble mod 16
; input: al = +1 or -1
logic_char_modify_lower_nibble:
mov bl, [char]
mov cl, bl
and cl, 0x0F
add cl, al
and cl, 0x0F
and bl, 0xF0
or bl, cl
mov [char], bl
ret
; dec/inc upper nibble mod 16
; input: al = +1 or -1
logic_char_modify_upper_nibble:
mov bl, [char]
mov cl, bl
and cl, 0xF0
shr cl, 4
add cl, al
and cl, 0x0F
shl cl, 4
and bl, 0x0F
or bl, cl
mov [char], bl
ret
; move left in charpage
logic_char_left:
mov al, -1
call logic_char_modify_lower_nibble
ret
; move right in charpage
logic_char_right:
mov al, 1
call logic_char_modify_lower_nibble
ret
; move down in charpage
logic_char_down:
mov al, -1
call logic_char_modify_upper_nibble
ret
; move up in charpage
logic_char_up:
mov al, 1
call logic_char_modify_upper_nibble
ret
; update all dependant values
logic_update:
; update [letter] value (first char on current page)
mov ax, [letter]
mov ah, [page]
mov [letter], ax
; update [char_ascii] value (selected single char)
mov ah, [page]
mov al, [char]
mov [char_ascii], ax
call draw_update_table
call draw_update_single
ret
; edx = num, esi -> buffer of size 4
logic_utf16to8:
push eax ecx edx
xor ecx, ecx
mov dword [esi], 0
or ecx, 3
mov eax, 0x80808000 + 11110000b
cmp edx, 0x00010000
jae @f
mov eax, 0x00808000 + 11100000b
dec ecx
cmp edx, 0x00000800
jae @f
mov eax, 0x00008000 + 11000000b
dec ecx
cmp edx, 0x00000080
jae @f
mov eax, edx
dec ecx
@@:
mov [esi], eax
@@:
mov eax, edx
and eax, 0x3F
shr edx, 6
or byte[esi + ecx], al
dec ecx
jns @b
pop edx ecx eax
ret
; scale down single character display
logic_scale_down:
cmp [scale], 0x00
jle event_wait
mov bl, [scale]
dec bl
mov [scale], bl
call draw_update_single
ret
; scale up single character display
logic_scale_up:
cmp [scale], 0x07
jge event_wait
mov bl, [scale]
inc bl
mov [scale], bl
call draw_update_single
ret
; char codes copying functions
; edx - code
logic_copy_dec:
mov ax, dx
mov bx, 10
mov ecx, 5
.copy_d_loop:
xor dx, dx
div bx
add dl, 0x30
mov [char_code_dec + 11 + ecx], byte dl
loop .copy_d_loop
mcall SF_CLIPBOARD, SSF_WRITE_CB, char_code_dec.end - char_code_dec, char_code_dec
ret
; edx - code
logic_copy_hex:
mov ecx, 4
.copy_ah_loop: ; iterate over all hex-digits of color
mov al, dl
and al, 0x0F
add al, 0x30 ; 0x30 = ASCII code of "0"
cmp al, 0x39
jbe .cont ; if digit
add al, 0x07 ; if letter
.cont:
mov [char_code_hex + 11 + ecx], byte al
shr edx, 4
loop .copy_ah_loop
mcall SF_CLIPBOARD, SSF_WRITE_CB, char_code_hex.end - char_code_hex, char_code_hex
ret
; ===================================================================
draw_window:
mcall SF_REDRAW, SSF_BEGIN_DRAW
mcall SF_STYLE_SETTINGS, SSF_GET_COLORS, win_cols, sizeof.system_colors
mcall , SSF_GET_SKIN_HEIGHT,
mov ecx, eax
add ecx, WN_RECT.Y shl 16 + WN_RECT.H
mov edx, [win_cols.work]
add edx, 0x34000000
mcall SF_CREATE_WINDOW, <WN_RECT.X, WN_RECT.W>, , , , title
call draw_base
call draw_update_table
call draw_update_single
call draw_toggle
mcall SF_REDRAW, SSF_END_DRAW
ret
; ===================================================================
; unchangeble base - table, headers and buttons
draw_base:
; both tables background
mcall SF_DRAW_RECT, <TB_PAGE.X, TB_PAGE.W>, <TB_PAGE.Y, TB_PAGE.H>, [win_cols.work_text]
mcall , <TB_SING.X, TB_SING.W>, ,
mcall , <TB_PAGE.X + 1, TB_PAGE.W - 2>, <TB_PAGE.Y + 1, TB_PAGE.H - 2>, [win_cols.work_light]
mcall , <TB_SING.X + 1, TB_SING.W - 2>,
; buttons
; button on charpage table to pick single character
mcall SF_DEFINE_BUTTON, <BT_TABL.X, BT_TABL.W>, <BT_TABL.Y, BT_TABL.H>, 0x6000000A,
; charsets change buttons
mcall , <BT_CS_01.X, BT_CS_01.W>, <BT_CS_01.Y, BT_CS_01.H>, 0x0000000B, [win_cols.work_button]
mcall , <BT_CS_02.X, BT_CS_02.W>, , 0x0000000C,
mcall , <BT_CS_03.X, BT_CS_03.W>, , 0x0000000D,
mcall , <BT_CS_04.X, BT_CS_04.W>, , 0x0000000E,
; character scale buttons
mcall , <BT_SC_DN.X, BT_SC_DN.W>, <BT_SC_DN.Y, BT_SC_DN.H>, 0x00000013,
mcall , <BT_SC_UP.X, BT_SC_UP.W>, , 0x00000014,
; tables
; 16x16 characters table
mcall SF_DRAW_RECT, <LN_PG_01.X, LN_PG_01.W>, <LN_PG_01.Y, LN_PG_01.H>, [win_cols.work_text]
mcall , <LN_PG_02.X, LN_PG_02.W>, <LN_PG_02.Y, LN_PG_02.H>,
; single character table
mcall SF_DRAW_RECT, <LN_SN_01.X, LN_SN_01.W>, ,
mcall , <LN_SN_02.X, LN_SN_02.W>, <LN_SN_02.Y, LN_SN_02.H>,
mcall , , <LN_SN_03.Y, LN_SN_03.H>,
mcall , , <LN_SN_04.Y, LN_SN_04.H>,
; headers
; horizontal page table headers
mov eax, SF_DRAW_TEXT
mov ebx, HD_TABL.X shl 16 + HD_TABL.Y
mov ecx, [win_cols.work_text]
add ecx, 0x90000000
xor edx, edx
mov esi, 16
.loop_hx:
mov edx, header
mcall
mov dx, [header]
add dx, 0x0100
cmp dx, 0x3AFF
jne .hx_af
add dx, 0x0700
.hx_af:
mov [header], dx
add ebx, 24 shl 16
dec esi
jnz .loop_hx
; vertical headers
mov ebx, 13 shl 16 + 39
mov esi, 16
mov [header], 0xFF30
.loop_hy:
mov edx, header
mcall
mov dx, [header]
add dx, 0x0001
cmp dx, 0xFF3A
jne .hy_af
add dx, 0x0007
.hy_af:
mov [header], dx
add ebx, 24
dec esi
jnz .loop_hy
; reset headers
mov [header], 0x30FF
; single character table headers
mcall , <LB_SN_SCL.X, LB_SN_SCL.Y>, , lb_size,
mcall , <LB_SN_DEC.X, LB_SN_DEC.Y>, , lb_dec,
mcall , <LB_SN_HEX.X, LB_SN_HEX.Y>, , lb_hex,
mcall , <LB_SN_ASC.X, LB_SN_ASC.Y>, , lb_asci,
mcall , <LB_SN_SCN.X, LB_SN_SCN.Y>, , lb_scan,
; buttons subscriptions
; charsets change buttons subscriptions
mov ecx, [win_cols.work_button_text]
add ecx, 0xB0000000
mcall , <LB_CS_01.X, LB_CS_01.Y>, , lb_cp6x9
mcall , <LB_CS_02.X, LB_CS_02.Y>, , lb_cp8x16
mcall , <LB_CS_03.X, LB_CS_03.Y>, , lb_utf16
mcall , <LB_CS_04.X, LB_CS_04.Y>, , lb_utf8
; page swap buttons subscriptions
mcall , <LB_CP_ZR.X, LB_CP_ZR.Y>, , bt_res
mcall , <LB_CP_DN.X, LB_CP_DN.Y>, , bt_dec
mcall , <LB_CP_UP.X, LB_CP_UP.Y>, , bt_inc
; character scale buttons subscriptions
mcall , <LB_SC_DN.X, LB_SC_DN.Y>, , bt_smaller
mcall , <LB_SC_UP.X, LB_SC_UP.Y>, , bt_bigger
cmp [charset], 0x90
jle .cp_bt_cp
.cp_bt_utf:
call draw_charpage_buttons
jmp .cp_bt_end
.cp_bt_cp:
call draw_charpage_delete
.cp_bt_end:
ret
; changable data: current charset, charpage, chars, selection
draw_update_table:
; current charset and charpage
mov ecx, [win_cols.work_text]
add ecx, 0xD0000000
mcall SF_DRAW_TEXT, <TB_PAGE.X, TB_PAGE.Y + TB_PAGE.H + 13>, , [lb_curr], , [win_cols.work]
mov esi, [win_cols.work_text]
add esi, 0x50000000
mcall SF_DRAW_NUMBER, 0x00020101, page, <TB_PAGE.X + 5, TB_PAGE.Y + 6>, , [win_cols.work_light]
; 16x16 table of letters
; background for letters
mcall SF_DRAW_RECT, <TB_PAGE.X + 26, TB_PAGE.W - 27>, <TB_PAGE.Y + 26, TB_PAGE.H - 27>, [win_cols.work_light]
;different coordinates for 6x9 charset
mov bl, [charset]
cmp bl, 0x80
jne .char_big
.char_sm:
mov ebx, 44 shl 16 + 42
jmp .char_draw
.char_big:
mov ebx, 42 shl 16 + 39
.char_draw:
mov eax, SF_DRAW_TEXT
mov cl, [charset]
shl ecx, 24
add ecx, [win_cols.work_text]
mov esi, 16
; letters draw loop
.loop_ly:
mov edi, 16
.loop_lx:
mov edx, letter
cmp [charset], 0xB0
jne .skip_conversion
;utf 8 to 16
xor edx, edx
mov dx, [letter]
push esi
mov esi, letutf
call logic_utf16to8
pop esi
mov edx, letutf
.skip_conversion:
mcall
mov dx, [letter]
add dx, 0x01
mov [letter], dx
add ebx, 24 shl 16
dec edi
jnz .loop_lx
; start new row of letters
sub ebx, 383 shl 16 + 65512
dec esi
jnz .loop_ly
; reset letter from 0x0100 to 0x0000
mov dx, [letter]
dec dh
mov [letter], dx
; highlight of current character in table
mov al, [char]
shr al, 4
mov bl, 24
mul bl
add ax, 34
shl eax, 16
mov al, 0x01
mov ecx, eax
push ecx
mov eax, SF_DRAW_RECT
mov ebx, 34 shl 16 + 384
mov edx, [win_cols.work_button]
; skip horizontal lines aligned to table borders
cmp ecx, 34 shl 16 + 65536
jle .hl_next_hr
mcall
.hl_next_hr:
add ecx, 23 shl 16
cmp ecx, 417 shl 16
jge .hl_end_hr
mcall
.hl_end_hr:
mov al, [char]
and al, 0x0F
mov bl, 24
mul bl
add ax, 34
shl eax, 16
mov al, 0x01
mov ebx, eax
mov eax, SF_DRAW_RECT
mov ecx, 34 shl 16 + 384
mov edx, [win_cols.work_button]
; skip vertical lines aligned to table borders
cmp ebx, 34 shl 16 + 65536
jle .hl_next_vr
mcall
.hl_next_vr:
add ebx, 23 shl 16
cmp ebx, 417 shl 16
jge .hl_end_vr
mcall
.hl_end_vr:
pop ecx
add ecx, 23
sub ebx, 23 * 65535
mcall
; redraw active symbol
shr ecx, 16
mov bx, cx
add ebx, 8 shl 16 + 5
mov cl, [charset]
cmp cl, 0xB0
jne .check_6x9
mov cl, 0xA0
jmp .char_draw_act
.check_6x9:
cmp cl, 0x80
jne .char_draw_act
add ebx, 2 shl 16 + 3
.char_draw_act:
shl ecx, 24
add ecx, [win_cols.work_button_text]
mcall SF_DRAW_TEXT, , , char_ascii
ret
; single character big display, it's scale and codes
draw_update_single:
; background for single char
mcall SF_DRAW_RECT, <TB_SING.X + 1, TB_SING.W - 2>, <TB_SING.Y + 26, TB_SING.H - 102>, [win_cols.work_light]
mov ah, [page]
mov al, [char]
mov [char_ascii], ax
; shifting letter position depenging on scale
mov bl, 7
sub bl, [scale]
mov al, 7
mul bl
add ax, 136
push ax
mov bl, 7
sub bl, [scale]
mov al, 4
mul bl
add ax, 516
shl eax, 16
pop ax
mov ebx, eax
cmp [charset], 0xB0
jne .not_utf8
;utf 8 to 16 conversion
.utf_8:
xor edx, edx
mov dx, [char_ascii]
push esi
mov esi, char_utf
call logic_utf16to8
pop esi
mov cl, 0xF0
add cl, [scale]
shl ecx, 24
add ecx, [win_cols.work_text]
mcall SF_DRAW_TEXT, , , char_utf, 0, [win_cols.work_light]
jmp .codes
.not_utf8:
mov cl, [charset]
cmp cl, 0x80
jne .not_80
; shifting letter position depenging on scale
xor eax, eax
mov al, [scale]
add al, [scale]
shl eax, 16
add ebx, eax
push ebx
mov bl, 7
sub bl, [scale]
mov al, 3
mul bl
pop ebx
sub bx, ax
add ebx, 0 shl 16 + 25
.not_80:
add cl, 0x40
add cl, [scale]
shl ecx, 24
add ecx, [win_cols.work_text]
mcall SF_DRAW_TEXT, , , char_ascii, 1, [win_cols.work_light]
; singe character codes
.codes:
; character codes copy buttons
mcall SF_DEFINE_BUTTON, <BT_CP_AD.X, BT_CP_AD.W>, <BT_CP_AD.Y, BT_CP_AD.H>, 0x00000015, [win_cols.work_button]
mcall , , <BT_CP_SD.Y, BT_CP_SD.H>, 0x00000016,
mcall , <BT_CP_AH.X, BT_CP_AH.W>, <BT_CP_AH.Y, BT_CP_AH.H>, 0x00000017,
mcall , , <BT_CP_SH.Y, BT_CP_SH.H>, 0x00000018,
; lines to overlap button's borders
mcall SF_DRAW_RECT, <LN_SN_02.X, LN_SN_02.W>, <LN_SN_05.Y, LN_SN_05.H>,
mcall , , <LN_SN_06.Y, LN_SN_06.H>,
mcall , , <LN_SN_06.Y + BT_CP_SH.H, LN_SN_06.H>,
mcall , <LN_SN_07.X, LN_SN_07.W>, <LN_SN_07.Y, LN_SN_07.H>,
mcall , <LN_SN_08.X, LN_SN_08.W>, ,
mcall , <LN_SN_08.X + BT_CP_SH.W, LN_SN_08.W>, ,
xor ecx, ecx
mov esi, [win_cols.work_button_text]
add esi, 0x10000000
mov cx, [char_ascii]
mcall SF_DRAW_NUMBER, 0x00050000, , <DT_CD_AD.X, DT_CD_AD.Y>,
mov cx, [char_scan]
mcall , , , <DT_CD_SD.X, DT_CD_SD.Y>,
mov cx, [char_ascii]
mcall , 0x00040100, , <DT_CD_AH.X, DT_CD_AH.Y>,
mov cx, [char_scan]
mcall , , , <DT_CD_SH.X, DT_CD_SH.Y>,
; single character scale
xor ecx, ecx
mov cl, [scale]
inc cl
mov esi, [win_cols.work_text]
add esi, 0x50000000
mcall SF_DRAW_NUMBER, 0x80010000, , <DT_CH_SC.X, DT_CH_SC.Y>, , [win_cols.work_light]
ret
; redraw keyboard input toggle button
draw_toggle:
cmp [reading], 0x01
je .stop
mcall SF_DEFINE_BUTTON, <BT_RD_ST.X, BT_RD_ST.W>, <BT_RD_ST.Y, BT_RD_ST.H>, 0x00000012, [win_cols.work_button]
mov ecx, [win_cols.work_button_text]
add ecx, 0x90000000
mcall SF_DRAW_TEXT, <BT_RD_ST.X + 17, BT_RD_ST.Y + 5>, , bt_read
ret
.stop:
mov esi, [win_cols.work_button]
or esi, 0x00FF0000
mcall SF_DEFINE_BUTTON, <BT_RD_ST.X, BT_RD_ST.W>, <BT_RD_ST.Y, BT_RD_ST.H>, 0x00000012,
mov ecx, [win_cols.work_button_text]
add ecx, 0x90000000
mcall SF_DRAW_TEXT, <BT_RD_ST.X + 17, BT_RD_ST.Y + 5>, , bt_stop
ret
; draw charpage change buttons
draw_charpage_buttons:
mcall SF_DEFINE_BUTTON, <BT_CP_ZR.X, BT_CP_ZR.W>, <BT_CP_ZR.Y, BT_CP_ZR.H>, 0x0000000F, [win_cols.work_button]
mcall , <BT_CP_DN.X, BT_CP_DN.W>, , 0x00000010,
mcall , <BT_CP_UP.X, BT_CP_UP.W>, , 0x00000011,
mov ecx, [win_cols.work_button_text]
add ecx, 0xB0000000
; page swap buttons subscriptions
mcall SF_DRAW_TEXT, <LB_CP_ZR.X, LB_CP_ZR.Y>, , bt_res
mcall , <LB_CP_DN.X, LB_CP_DN.Y>, , bt_dec
mcall , <LB_CP_UP.X, LB_CP_UP.Y>, , bt_inc
ret
; delete charpage change buttons
draw_charpage_delete:
mcall SF_DEFINE_BUTTON, , , 0x8000000F
mcall , , , 0x80000010
mcall , , , 0x80000011
mcall SF_DRAW_RECT, <BT_CP_ZR.X, BT_CP_ZR.W + BT_CP_DN.W + BT_CP_UP.W + 19>, <BT_CP_ZR.Y, BT_CP_ZR.H + 1>, [win_cols.work]
ret
; ===================================================================
WN_RECT RECT 100, 100, 686, 494 ; window
TB_PAGE RECT 8, 8, 411, 411 ; tables background
TB_SING RECT 427, 8, 242, 411
BT_TABL RECT 34, 34, 384, 384 ; button to pick char
BT_CS_01 RECT 8, 459, 95, 23 ; charsets buttons
BT_CS_02 RECT 113, 459, 95, 23
BT_CS_03 RECT 218, 459, 95, 23
BT_CS_04 RECT 323, 459, 95, 23
BT_CP_ZR RECT 323, 427, 31, 23 ; charpage buttons
BT_CP_DN RECT 363, 427, 23, 23
BT_CP_UP RECT 395, 427, 23, 23
BT_SC_DN RECT 618, 8, 25, 25 ; char scale buttons
BT_SC_UP RECT 643, 8, 25, 25
BT_CP_AD RECT 562, 368, 57, 25 ; char code copy buttons
BT_CP_SD RECT 562, 393, 57, 25
BT_CP_AH RECT 619, 368, 49, 25
BT_CP_SH RECT 619, 393, 49, 25
BT_RD_ST RECT 427, 459, 241, 23 ; key input read/stop button
LN_PG_01 RECT 8, 33, 410, 1 ; page table lines
LN_PG_02 RECT 33, 8, 1, 410
LN_SN_01 RECT 668, 8, 1, 410 ; singe table lines
LN_SN_02 RECT 427, 8, 242, 1
LN_SN_03 RECT 427, 33, 242, 1
LN_SN_04 RECT 427, 343, 242, 1
LN_SN_05 RECT 427, 368, 242, 1
LN_SN_06 RECT 427, 393, 242, 1
LN_SN_07 RECT 562, 343, 1, 75
LN_SN_08 RECT 619, 343, 1, 75
LB_SN_SCL RECT 436, 14, 0, 0 ; single table subscriptions
LB_SN_DEC RECT 579, 349, 0, 0
LB_SN_HEX RECT 632, 349, 0, 0
LB_SN_ASC RECT 436, 374, 0, 0
LB_SN_SCN RECT 436, 399, 0, 0
LB_CS_01 RECT 20, 464, 0, 0 ; charsets buttons subscriptions
LB_CS_02 RECT 121, 464, 0, 0
LB_CS_03 RECT 222, 464, 0, 0
LB_CS_04 RECT 331, 464, 0, 0
LB_CP_ZR RECT 331, 432, 0, 0 ; charpage buttons subscriptions
LB_CP_DN RECT 370, 432, 0, 0
LB_CP_UP RECT 403, 432, 0, 0
LB_SC_DN RECT 627, 13, 0, 0 ; char scale subscriptions
LB_SC_UP RECT 652, 13, 0, 0
DT_CD_AD RECT 571, 374, 0, 0 ; char codes
DT_CD_SD RECT 571, 399, 0, 0
DT_CD_AH RECT 628, 374, 0, 0
DT_CD_SH RECT 628, 399, 0, 0
DT_CH_SC RECT 508, 14, 0, 0 ; char scale
HD_TABL RECT 38, 14, 0, 0 ; char table headers
; ===================================================================
if lang eq ru_RU
title cp866 "Таблицы Символов 0.4.2", 0
lb_size cp866 "Масштаб:", 0
lb_asci cp866 "ASCII-код", 0
lb_scan cp866 "Скан-код", 0
bt_read cp866 " Читать ввод с клавиатуры ", 0
bt_stop cp866 " Прекратить читать ввод ", 0
else if lang eq es_ES
title db "Tablas de Simbolos 0.4.2", 0
lb_size db "Escala:", 0
lb_asci db "Codigo ASCII", 0
lb_scan db "Codigo scan", 0
bt_read db " Leer entrada del teclano ", 0
bt_stop db "Detener entrada de teclano", 0
else
title db "Charsets Viewer 0.4.2", 0
lb_size db "Scale:", 0
lb_asci db "ASCII-code", 0
lb_scan db "Scan-code", 0
bt_read db " Start keyboard input ", 0
bt_stop db " End keyboard input ", 0
endf
lb_cp6x9 db "CP866 6x9 ", 0
lb_cp8x16 db "CP866 8x16 ", 0
lb_utf16 db "UTF-16 8x16", 0
lb_utf8 db "UTF-8 8x16 ", 0
lb_curr dd lb_utf8
lb_hex db "HEX", 0
lb_dec db "DEC", 0
bt_res db "00", 0
bt_dec db "<", 0
bt_inc db ">", 0
bt_smaller db "-", 0
bt_bigger db "+", 0
; ===================================================================
win_cols system_colors
; ===================================================================
reading db 0x00
header dw 0x30FF, 0 ; "-0" symbols
letter dw 0x0000, 0 ; buffer for chars in page table
letutf dd 0x00000000, 0 ; same, but for UTF-8 chars
charset db 0xB0
page db 0x00
page_utf db 0x00
char db 0x00
scale db 0x07
char_ascii dw 0x0000, 0 ; current char ASCII/CP866 code
char_scan dw 0x0000, 0 ; current char SCAN-code
char_utf dd 0x00000000, 0 ; current char UTF-8 code
char_code_dec:
dd char_code_dec.end - char_code_dec
dd 0
dd 1
db '00000'
.end:
char_code_hex:
dd char_code_hex.end - char_code_hex
dd 0
dd 1
db '0000'
.end:
; ===================================================================
I_END:
rb 512
align 16
STACKTOP:
MEM: