asciivju: v0.4

git-svn-id: svn://kolibrios.org@2088 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Ivan Baravy 2011-08-21 07:30:35 +00:00
parent c98be95345
commit f0bb935cd0

View File

@ -3,401 +3,308 @@ use32
db 'MENUET01' db 'MENUET01'
dd 0x01,start,i_end,e_end,e_end,0,0 dd 0x01,start,i_end,e_end,e_end,0,0
include '../../../proc32.inc'
include '../../../macros.inc'
BUTTON_SIDE equ 16 ; button are squares BUTTON_SIDE equ 16 ; button are squares
BUTTON_SPACE equ 19 ; space between cols and rows BUTTON_SPACE equ 19 ; space between cols and rows
BUTTON_ID_SHIFT equ 2 ; button_id = character + BUTTON_ID_SHIFT
TABLE_BEGIN_X equ 2
TABLE_BEGIN_Y equ 2
FOCUS_SQUARE_COLOR equ 0x000080FF
PAGE_SWITCHER_BLINK_COLOR equ 0x00808080
start: start:
call get_skin_height
still: still:
mov eax, 10 mcall 10
int 0x40
dec eax dec eax
jnz @f jz redraw
call redraw dec eax
@@: dec eax jz key
jnz @f
call key
@@: dec eax
jnz @f
call button
@@: jmp still
get_skin_height:
mov eax, 48
mov ebx, 4
int 0x40
mov [skin_height], eax
ret
redraw:
mov eax, 12
mov ebx, 1
int 0x40
mov eax, 0
mov ebx, 300*0x10000+317
mov ecx, 300*0x10000+184
add ecx, [skin_height]
mov edx, 0x33F0F0F0 ; skinned, resizeable
mov esi, 0x80808080 ; title color
mov edi, window_title
int 0x40
call draw_table
call draw_codes
call draw_page_switcher
mov eax, 12
mov ebx, 2
int 0x40
ret
key:
mov eax, 2
int 0x40
ret
button: button:
mov eax, 17 mcall 17
int 0x40 shr eax, 8
cmp eax, 1
jnz @f
ret
@@: shr eax, 8
cmp eax, 1
jz quit
cmp ax, 0xFFAA
jnz .change_focus
xor bx, bx
mov bl, [symbol_start]
add bx, 2
mov cx, bx
add cx, 128
@@: mov eax, 8
mov edx, 0x80000000
add dx, bx
int 0x40
cmp bx, cx
jz @f
inc bx
jmp @b
@@: add [symbol_start], 128 ; change page
add [symbol_focused], 128
call draw_table
call draw_codes
mov [redraw_flag], 1 ; for page_switcher this means visual blink (color changing)
call draw_page_switcher
mov eax, 5
mov ebx, 10
int 0x40
mov [redraw_flag], 0
call draw_page_switcher
ret
cmp eax, 1
je quit
cmp ax, 0xFFAA ; page switcher
je .switch_page ; any button with a character
.change_focus: .change_focus:
mov bl, [symbol_focused] mov bl, [symbol_focused]
mov [symbol_unfocused], bl mov [symbol_unfocused], bl
shl eax, 8 sub ax, BUTTON_ID_SHIFT ; get the corresponding character
sub ah, 2 mov [symbol_focused], al
mov [symbol_focused], ah stdcall draw_table, 0
mov [redraw_flag], 1 ; for table this means redraw only focused and unfocused buttons
call draw_table
call draw_codes call draw_codes
mov [redraw_flag], 0 jmp still
ret .switch_page:
movzx bx, [symbol_start]
add bx, BUTTON_ID_SHIFT
mov cx, 128 ; half of page
mov edx, 0x80000000
mov dx, bx
@@: mcall 8
inc edx
dec cx
jnz @b
@@: add [symbol_start], 128 ; change page
add [symbol_focused], 128
stdcall draw_table, 1 ; 1 means redraw the whole table
call draw_codes
stdcall draw_page_switcher, 1 ; 1 means dark color, for blinking
mcall 5, 10
stdcall draw_page_switcher, 0 ; 0 means usual light color
jmp still
redraw:
mcall 9, proc_info, -1
mcall 48, 3, sys_colors, 40
mcall 12, 1
mcall 48, 4 ; get skin height
mov ecx, 300*0x10000+184
add ecx, eax
mov edx, 0x34000000
or edx, [sys_colors.work]
mov esi, 0x80000000
or esi, [sys_colors.grab_text]
mcall 0, <300,315>, , , , window_title
test [proc_info.wnd_state], 0x04
jnz @f
stdcall draw_table, 1
call draw_codes
stdcall draw_page_switcher, 0
@@:
mcall 12, 2
jmp still
key:
mcall 2
cmp ah, 0x09 ; TAB key
je button.switch_page
cmp ah, 0xB0 ; left
jne @f
mov bl, [symbol_focused]
mov [symbol_unfocused], bl
dec bl
and bl, 0x0f
and [symbol_focused], 0xf0
or [symbol_focused], bl
stdcall draw_table, 0
call draw_codes
jmp still
@@: cmp ah, 0xB1 ; down
jne @f
mov bl, [symbol_focused]
mov [symbol_unfocused], bl
add bl, 16
and bl, 0x70
and [symbol_focused], 0x8f
or [symbol_focused], bl
stdcall draw_table, 0
call draw_codes
jmp still
@@: cmp ah, 0xB2 ; up
jne @f
mov bl, [symbol_focused]
mov [symbol_unfocused], bl
sub bl, 16
and bl, 0x70
and [symbol_focused], 0x8f
or [symbol_focused], bl
stdcall draw_table, 0
call draw_codes
jmp still
@@: cmp ah, 0xB3 ; righ
jne @f
mov bl, [symbol_focused]
mov [symbol_unfocused], bl
inc bl
and bl, 0x0f
and [symbol_focused], 0xf0
or [symbol_focused], bl
stdcall draw_table, 0
call draw_codes
jmp still
jne @f
@@:
jmp still
draw_table:
proc draw_table _full_redraw
mov al, [symbol_start] mov al, [symbol_start]
mov [symbol_current], al mov [symbol_current], al
.next_button: .next_button:
push [button_x]
pop [button_cur_x]
push [button_y]
pop [button_cur_y]
xor edi, edi ; character focus flag
mov al, [symbol_current] mov al, [symbol_current]
mov [button_cur_id], al cmp al, [symbol_focused]
jne @f
mov [is_active], 0 inc edi
@@: cmp [_full_redraw], 1
mov al, [symbol_focused] je .draw
cmp [symbol_current], al cmp al, [symbol_focused]
jnz @f je .draw
mov byte[is_active], 1 cmp al, [symbol_unfocused] ; previously focused, should redraw to clear focus
@@: cmp [redraw_flag], 1 je .draw
jnz .draw ; if redraw_flag is zero, we should redraw the whole table
mov al, [symbol_focused]
cmp [symbol_current], al
jz .draw
mov al, [symbol_unfocused]
cmp [symbol_current], al
jz .draw
jmp .skip ; skip button if it isn't (un)focused jmp .skip ; skip button if it isn't (un)focused
.draw: .draw:
call draw_button call draw_button
.skip: .skip:
mov al, [symbol_start] mov bl, [symbol_start]
add al, 127 ; end of current page add bl, 127 ; end of current page
cmp [symbol_current], al ; the last on page? cmp [symbol_current], bl ; the last on page?
jb @f jne @f
mov [button_x], 2 mov [button_x], TABLE_BEGIN_X
mov [button_y], 2 mov [button_y], TABLE_BEGIN_Y
ret ret
@@: inc [symbol_current] @@: inc [symbol_current]
add [button_x], BUTTON_SPACE add [button_x], BUTTON_SPACE
cmp [button_x], 306 ; the last in row? cmp [button_x], 306 ; the last in row?
jae @f jne .next_button
add [button_y], BUTTON_SPACE ; next row
mov [button_x], TABLE_BEGIN_X
jmp .next_button jmp .next_button
@@: add [button_y], BUTTON_SPACE ; next row
mov [button_x], 2
jmp .next_button
ret ret
endp
draw_button: proc draw_button
mov eax, 8 mov ebx, [button_x]
mov ebx, [button_cur_x]
shl ebx, 16 shl ebx, 16
add ebx, BUTTON_SIDE mov bx, BUTTON_SIDE
mov ecx, [button_cur_y] mov ecx, [button_y]
shl ecx, 16 shl ecx, 16
add ecx, BUTTON_SIDE mov cx, BUTTON_SIDE
mov edx, 0x80000000 mov edx, 0x80000000
add dl, [button_cur_id] mov dl, [symbol_current]
add edx, 2 add edx, BUTTON_ID_SHIFT
mov eax, 8 mcall 8, , ,
int 0x40 and edx, 0x7FFFFFFF
or edx, 0x20000000 or edx, 0x20000000
add edx, 0x80000000 mcall , , , , [sys_colors.work_button]
mov esi, 0x00F0F0F0 ; button color
int 0x40 test edi, edi ; is focused?
jz .symbol ; draw only character, not selection square
.focus_frame: ; draw a blue square (selection), 8 segments
mov esi, [button_x]
mov edi, [button_y]
mov bx, si
shl ebx, 16
mov bx, si
add bx, BUTTON_SIDE
mov cx, di
shl ecx, 16
mov cx, di
mcall 38, , , FOCUS_SQUARE_COLOR
add ecx, 0x00010001
mcall
add ecx, (BUTTON_SIDE-2)*0x10000+(BUTTON_SIDE-2)
mcall
add ecx, 0x00010001
mcall
mov bx, si
shl ebx, 16
mov bx, si
mov cx, di
shl ecx, 16
mov cx, di
add ecx, 2*0x10000+(BUTTON_SIDE-2)
mcall 38, , ,
add ebx, 0x00010001
mcall
add ebx, (BUTTON_SIDE-2)*0x10000+(BUTTON_SIDE-2)
mcall
add ebx, 0x00010001
mcall
cmp byte[is_active], 1
jz @f
.symbol: .symbol:
mov eax, 4 mov ebx, [button_x]
mov ebx, [button_cur_x]
add ebx, 6 add ebx, 6
shl ebx, 16 shl ebx, 16
add ebx, [button_cur_y] add ebx, [button_y]
add ebx, 5 add ebx, 5
xor ecx, ecx mcall 4, , [sys_colors.work_button_text], symbol_current, 1
mov edx, symbol_current
mov esi, 1
int 0x40
ret ret
@@: ; draw a blue square (selection), 8 lines endp
mov eax, 38
mov ebx, [button_cur_x]
shl ebx, 16
add ebx, [button_cur_x]
add ebx, BUTTON_SIDE-1
mov ecx, [button_cur_y]
shl ecx, 16
add ecx, [button_cur_y]
mov edx, 0x000080FF ; square color
int 0x40
mov ebx, [button_cur_x]
shl ebx, 16
add ebx, [button_cur_x]
mov ecx, [button_cur_y]
shl ecx, 16
add ecx, [button_cur_y]
add ecx, BUTTON_SIDE-1
int 0x40
mov ebx, [button_cur_x]
inc ebx
shl ebx, 16
add ebx, [button_cur_x]
inc ebx
add ebx, BUTTON_SIDE-1
mov ecx, [button_cur_y]
inc ecx
shl ecx, 16
add ecx, [button_cur_y]
inc ecx
int 0x40
mov ebx, [button_cur_x]
inc ebx
shl ebx, 16
add ebx, [button_cur_x]
inc ebx
mov ecx, [button_cur_y]
inc ecx
shl ecx, 16
add ecx, [button_cur_y]
inc ecx
add ecx, BUTTON_SIDE-2
int 0x40
mov ebx, [button_cur_x]
add ebx, BUTTON_SIDE-1
shl ebx, 16
add ebx, [button_cur_x]
add ebx, BUTTON_SIDE-1
mov ecx, [button_cur_y]
inc ecx
shl ecx, 16
add ecx, [button_cur_y]
add ecx, BUTTON_SIDE-1
int 0x40
mov ebx, [button_cur_x]
inc ebx
shl ebx, 16
add ebx, [button_cur_x]
add ebx, BUTTON_SIDE-2
mov ecx, [button_cur_y]
add ecx, BUTTON_SIDE-1
shl ecx, 16
add ecx, [button_cur_y]
add ecx, BUTTON_SIDE-1
int 0x40
mov ebx, [button_cur_x]
add ebx, BUTTON_SIDE
shl ebx, 16
add ebx, [button_cur_x]
add ebx, BUTTON_SIDE
mov ecx, [button_cur_y]
shl ecx, 16
add ecx, [button_cur_y]
add ecx, BUTTON_SIDE-1
int 0x40
mov ebx, [button_cur_x]
shl ebx, 16
add ebx, [button_cur_x]
add ebx, BUTTON_SIDE
mov ecx, [button_cur_y]
add ecx, BUTTON_SIDE
shl ecx, 16
add ecx, [button_cur_y]
add ecx, BUTTON_SIDE
int 0x40
jmp .symbol
draw_page_switcher: proc draw_page_switcher _blinking
mov eax, 8 mcall 8, , , 0x8000FFAA
mov edx, 0x8000FFAA
int 0x40
mov esi, 0x00F0F0F0 mov esi, [sys_colors.work_button]
cmp [redraw_flag], 1 cmp [_blinking], 1 ; blinking?
jnz @f jne @f
mov esi, 0x00808080 mov esi, PAGE_SWITCHER_BLINK_COLOR
@@: mov eax, 8 @@: mcall , <2,60>, <157,19>, 0x2000FFAA
mov ebx, 2*0x10000+60
mov ecx, 157*0x10000+19
mov edx, 0x2000FFAA
int 0x40
cmp [symbol_start], 0
jnz @f
mov eax, 4
mov ebx, 11*0x10000+164
mov ecx, 0x80000000 mov ecx, 0x80000000
or ecx, [sys_colors.work_button_text]
mov edx, string_000_127 mov edx, string_000_127
int 0x40 cmp [symbol_start], 0 ; first page?
je @f
mov edx, string_128_255 ; ok, the second one
@@: mcall 4, <11,164>,
ret ret
endp
proc draw_codes
@@: mov eax, 4
mov ebx, 11*0x10000+164
mov ecx, 0x80000000 mov ecx, 0x80000000
mov edx, string_128_255 or ecx, [sys_colors.work_text]
int 0x40 mcall 4, <80,164>, , string_ASCII_CODE
ret mcall , <180,164>, , string_ASCII_HEX_CODE
movzx ecx, [symbol_focused]
mov esi, 0x40000000
draw_codes: or esi, [sys_colors.work_text]
mcall 47, 0x00030000, , <152,164>, , [sys_colors.work]
mov eax, 13 mcall , 0x00020100, , <276,164>,
mov ebx, 80*0x10000+220
mov ecx, 164*0x10000+9
mov edx, 0x00F0F0F0
int 0x40
mov eax, 4
mov ebx, 80*0x10000+164
mov ecx, 0x80000000
mov edx, string_ASCII_CODE
int 0x40
mov ebx, 180*0x10000+164
mov ecx, 0x80000000
mov edx, string_ASCII_HEX_CODE
int 0x40
mov eax, 47
mov ebx, 0x00030000 ; 3 digits, dec
xor ecx, ecx
add cl, [symbol_focused]
mov edx, 152*0x10000+164
xor esi, esi
int 0x40
mov ebx, 0x00020100 ; 2 digits, hex
mov edx, 276*0x10000+164
int 0x40
ret ret
endp
quit: quit:
mov eax, -1 mcall -1
int 0x40
window_title db 'ASCIIVju v0.3 R3',0
string_000_127 db '000-127',0 szZ window_title ,'ASCIIVju v0.4'
string_128_255 db '128-255',0 szZ string_000_127 ,'000-127'
string_ASCII_CODE db 'ASCII Code: ',0 szZ string_128_255 ,'128-255'
string_ASCII_HEX_CODE db 'ASCII Hex-Code: ',0 szZ string_ASCII_CODE ,'ASCII Code: '
szZ string_ASCII_HEX_CODE ,'ASCII Hex-Code: '
skin_height dd 0
button_x dd 2 button_x dd 2
button_y dd 2 button_y dd 2
symbol_current db 0 symbol_current db 0
symbol_start db 0 symbol_start db 0
button_cur_x dd 0
button_cur_y dd 0
button_cur_id db 0
db 0,0,0 ; unused
is_active dd 0 ; is current symbol selected?
symbol_unfocused db 0 symbol_unfocused db 0
symbol_focused db 0 symbol_focused db 0
redraw_flag dd 0
db 0,0,0,0 ; unused
i_end: i_end:
proc_info process_information
rb 0x500 ;stack sys_colors system_colors
rb 0x400 ;stack
e_end: e_end: