kolibrios-fun/programs/system/tinfo/tinfo.asm

1157 lines
41 KiB
NASM
Raw Normal View History

; This program shows information about thread ;
; usage: tinfo [slot of the thread] ;
; if slot number is omitted then assume slot = -1 ;
; to compile: nasm -f bin tinfo.asm -o tinfo ;
ORG 0
BITS 32
; ---------------------------------------------------------------------------- ;
PATH_SIZE equ 1024
PARAMS_SIZE equ 256
STACK_SIZE equ 256
PROC_INFO_SIZE equ 1024
TMP_BUFFER_SIZE equ 64
; ---------------------------------------------------------------------------- ;
TEXT_WIDTH equ 6
BOLD_TEXT_WIDTH equ TEXT_WIDTH + 1
; ---------------------------------------------------------------------------- ;
COLUMN1_MAX_COUNT equ 13
COLUMN2_MAX_COUNT equ 12
COLUMN3_MAX_COUNT equ 26
; ---------------------------------------------------------------------------- ;
COLUMN_PADDING equ 3
COLUMN1_PADDING equ COLUMN_PADDING
COLUMN2_PADDING equ COLUMN_PADDING
COLUMN3_PADDING equ COLUMN_PADDING
; ---------------------------------------------------------------------------- ;
ITEM_HEIGHT equ 15
TEXT_HEIGHT equ 9
COLUMN1_ITEM_WIDTH equ COLUMN1_MAX_COUNT * BOLD_TEXT_WIDTH + COLUMN1_PADDING * 2
COLUMN2_ITEM_WIDTH equ COLUMN2_MAX_COUNT * BOLD_TEXT_WIDTH + COLUMN2_PADDING * 2
COLUMN3_ITEM_WIDTH equ COLUMN3_MAX_COUNT * BOLD_TEXT_WIDTH + COLUMN3_PADDING * 2
ITEM_MARGIN equ 6
ITEM_BACK_COLOR_1 equ 0x00EAEAEA
ITEM_BACK_COLOR_2 equ 0x00F4F4F4
ITEM_COUNT equ 18 ; at current time we have 18 items
; ---------------------------------------------------------------------------- ;
COLUMN_Y equ 10
COLUMN1_X equ 10
COLUMN2_X equ COLUMN1_X + COLUMN1_ITEM_WIDTH + ITEM_MARGIN
COLUMN3_X equ COLUMN2_X + COLUMN2_ITEM_WIDTH + ITEM_MARGIN
; ---------------------------------------------------------------------------- ;
COLUMN1_TEXT_X equ COLUMN1_X + COLUMN1_PADDING
COLUMN2_TEXT_X equ COLUMN2_X + COLUMN2_PADDING
COLUMN3_TEXT_X equ COLUMN3_X + COLUMN3_PADDING
; ---------------------------------------------------------------------------- ;
FRAME_TOP equ COLUMN_Y - ITEM_MARGIN / 2
FRAME_BOTTOM equ COLUMN_Y + ITEM_HEIGHT * ITEM_COUNT + ITEM_MARGIN / 2 - 1
; ---------------------------------------------------------------------------- ;
FRAME1_LEFT equ COLUMN1_X - ITEM_MARGIN / 2
FRAME1_RIGHT equ COLUMN1_X + COLUMN1_ITEM_WIDTH + ITEM_MARGIN / 2 - 1
; ---------------------------------------------------------------------------- ;
FRAME2_LEFT equ COLUMN2_X - ITEM_MARGIN / 2
FRAME2_RIGHT equ COLUMN2_X + COLUMN2_ITEM_WIDTH + ITEM_MARGIN / 2 - 1
; ---------------------------------------------------------------------------- ;
FRAME3_LEFT equ COLUMN3_X - ITEM_MARGIN / 2
FRAME3_RIGHT equ COLUMN3_X + COLUMN3_ITEM_WIDTH + ITEM_MARGIN / 2 - 1
; ---------------------------------------------------------------------------- ;
WINDOW_STYLE_SKINNED_FIXED equ 0x4000000
WINDOW_STYLE_COORD_CLIENT equ 0x20000000
WINDOW_STYLE_CAPTION equ 0x10000000
; ---------------------------------------------------------------------------- ;
WINDOW_BORDER_SIZE equ 5
WINDOW_WIDTH equ FRAME3_RIGHT + FRAME1_LEFT + WINDOW_BORDER_SIZE * 2
WINDOW_STYLE equ WINDOW_STYLE_SKINNED_FIXED | WINDOW_STYLE_COORD_CLIENT | WINDOW_STYLE_CAPTION
WINDOW_BACK_COLOR equ 0x00FFFFFF
; ---------------------------------------------------------------------------- ;
INDICATOR_WIDTH equ 3
INDICATOR_HEIGHT equ 3
INDICATOR_LEFT equ COLUMN3_X + COLUMN3_ITEM_WIDTH + ITEM_MARGIN / 2
INDICATOR_TOP equ COLUMN_Y - ITEM_MARGIN / 2 - INDICATOR_HEIGHT
; ---------------------------------------------------------------------------- ;
UPDATE_TIME equ 28
; ---------------------------------------------------------------------------- ;
thread_info equ END + PATH_SIZE + PARAMS_SIZE
tmpbuffer equ END + PATH_SIZE + PARAMS_SIZE + PROC_INFO_SIZE
; ---------------------------------------------------------------------------- ;
KEYBOARD_MODE_ASCII equ 0
KEYBOARD_MODE_SCAN equ 1
; ---------------------------------------------------------------------------- ;
WINDOW_STATE_MAXIMIZED equ 1
WINDOW_STATE_MINIMIZED equ 2
WINDOW_STATE_ROLLED_UP equ 4
; ---------------------------------------------------------------------------- ;
THREAD_STATE_RUNNING equ 0
THREAD_STATE_SUSPENDED equ 1
THREAD_STATE_SUSPENDED_WAIT_EVENT equ 2
THREAD_STATE_NORMAL_TERMINATING equ 3
THREAD_STATE_EXCEPT_TERMINATING equ 4
THREAD_STATE_WAIT_EVENT equ 5
THREAD_STATE_SLOT_IS_FREE equ 9
; ---------------------------------------------------------------------------- ;
EM_REDRAW equ 1b
EM_KEY equ 10b
EM_BUTTON equ 100b
EM_RESERVED0 equ 1000b
EM_REDRAW_BACKGROUND equ 10000b
EM_MOUSE equ 100000b
EM_IPC equ 1000000b
EM_NETWORK equ 10000000b
EM_DEBUG equ 100000000b
; ---------------------------------------------------------------------------- ;
struc THREAD_INFO
.cpu_usage resd 1 ; usage of the processor
.win_stack_pos resw 1 ; position of the window of thread in the window stack
.reserved0 resw 1 ; has no relation to the specified thread
.reserved1 resw 1 ; reserved
.name resb 11 ; name of the started file - executable file without extension
.reserved2 resb 1 ; reserved, this byte is not changed
.mem_address resd 1 ; address of the process in memory
.mem_usage resd 1 ; size of used memory - 1
.identifier resd 1 ; identifier (PID/TID)
.x resd 1 ; coordinate of the thread window on axis x
.y resd 1 ; coordinate of the thread window on axis y
.size_x resd 1 ; size of the thread window on axis x
.size_y resd 1 ; size of the thread window on axis y
.thread_state resw 1 ; status of the thread slot
.reserved3 resw 1 ; reserved, this word is not changed
.client_x resd 1 ; coordinate of the client area on axis x
.client_y resd 1 ; coordinate of the client area on axis y
.client_size_x resd 1 ; width of the client area
.client_size_y resd 1 ; height of the client area
.window_state resb 1 ; state of the window - bitfield
.event_mask resd 1 ; event mask
.keyboard_mode resb 1 ; keyboard mode
endstruc
; ---------------------------------------------------------------------------- ;
MENUET01 db 'MENUET01'
version dd 1
program.start dd START
program.end dd END
program.memory dd END + PATH_SIZE + PARAMS_SIZE + PROC_INFO_SIZE + TMP_BUFFER_SIZE + STACK_SIZE
program.stack dd END + PATH_SIZE + PARAMS_SIZE + PROC_INFO_SIZE + TMP_BUFFER_SIZE + STACK_SIZE
program.params dd END + PATH_SIZE
program.path dd END
; ---------------------------------------------------------------------------- ;
slot dd -1 ; for default if no params
; ---------------------------------------------------------------------------- ;
screen:
.height dw 0
.width dw 0
; ---------------------------------------------------------------------------- ;
window:
.left dd 0
.top dd 0
.width dd 0
.height dd 0
; ---------------------------------------------------------------------------- ;
fore_color dd 0x00000000
back_color dd ITEM_BACK_COLOR_1
frame_color dd 0x00CCCCCC
; ---------------------------------------------------------------------------- ;
BackColors:
dd 1
dd ITEM_BACK_COLOR_1
dd ITEM_BACK_COLOR_2
; ---------------------------------------------------------------------------- ;
IndicatorColors:
dd 1
dd 0x000AF000
dd 0x00000FA0
; ---------------------------------------------------------------------------- ;
%define x [Pos.x]
%define y [Pos.y]
Pos:
.x dd COLUMN1_X
.y dd COLUMN_Y
; ---------------------------------------------------------------------------- ;
sz_caption db "ThreadInfo",0
; ---------------------------------------------------------------------------- ;
sz_cpu_usage db "CPU usage",0
sz_win_stack_pos db "Win stack pos",0
sz_name db "Name",0
sz_mem_address db "Mem address",0
sz_mem_usage db "Mem usage",0
sz_identifier db "Identifier",0
sz_x db "X",0
sz_y db "Y",0
sz_size_x db "Size X",0
sz_size_y db "Size Y",0
sz_thread_state db "Thread state",0
sz_client_x db "Client X",0
sz_client_y db "Client Y",0
sz_client_size_x db "Client Size X",0
sz_client_size_y db "Client Size Y",0
sz_window_state db "Window state",0
sz_event_mask db "Event mask",0
sz_keyboard_mode db "Keyboard mode",0
; ---------------------------------------------------------------------------- ;
; state of the window
sz_maximized db "Max ",0
sz_minimized db "Min ",0
sz_rolled_up db "RollUp ",0
; ---------------------------------------------------------------------------- ;
; keyboard mode
sz_ascii db "ASCII",0
sz_scan db "SCAN ",0
; ---------------------------------------------------------------------------- ;
; status of the thread slot
sz_running db "running ",0
sz_suspended db "suspended ",0
sz_suspended_wait_event db "suspended wait event",0
sz_normal_terminating db "normal terminating ",0
sz_except_terminating db "except. terminating ",0
sz_wait_event db "wait event ",0
sz_slot_is_free db "slot is free ",0
; ---------------------------------------------------------------------------- ;
; event mask
sz_redraw db "rdrw ",0
sz_key db "key ",0
sz_button db "btn ",0
sz_reserved0 db "rsrvd0 ",0
sz_redraw_background db "bckgr ",0
sz_mouse db "mouse ",0
sz_ipc db "ipc ",0
sz_network db "net ",0
sz_debug db "dbg ",0
; ---------------------------------------------------------------------------- ;
sz_undefined db "UnDef ",0
; **************************************************************************** ;
%macro DrawCpuUsage 0
; sz_cpu_usage
push dword COLUMN1_TEXT_X
push dword y
push dword sz_cpu_usage
push dword [fore_color]
push dword [back_color]
call DrawTextBold
; [cpu_usage]
push dword [thread_info + THREAD_INFO.cpu_usage]
call uint2str
push dword COLUMN2_MAX_COUNT
call PadBuffSpaces
push dword COLUMN2_TEXT_X
push dword y
push dword tmpbuffer
push dword [fore_color]
push dword [back_color]
call DrawTextBold
call ChangeBackColor
add y, dword ITEM_HEIGHT
%endmacro
; **************************************************************************** ;
%macro DrawWinStackPos 0
; sz_win_stack_pos
push dword COLUMN1_TEXT_X
push dword y
push dword sz_win_stack_pos
push dword [fore_color]
push dword [back_color]
call DrawTextBold
; [win_stack_pos]
movzx eax, word [thread_info + THREAD_INFO.win_stack_pos]
push eax
call uint2str
push dword COLUMN2_MAX_COUNT
call PadBuffSpaces
push dword COLUMN2_TEXT_X
push dword y
push dword tmpbuffer
push dword [fore_color]
push dword [back_color]
call DrawTextBold
call ChangeBackColor
add y, dword ITEM_HEIGHT
%endmacro
; **************************************************************************** ;
%macro DrawName 0
; sz_name
push dword COLUMN1_TEXT_X
push dword y
push dword sz_name
push dword [fore_color]
push dword [back_color]
call DrawTextBold
; name
push dword COLUMN2_TEXT_X
push dword y
push dword (thread_info + THREAD_INFO.name)
push dword [fore_color]
push dword [back_color]
call DrawTextBold
call ChangeBackColor
add y, dword ITEM_HEIGHT
%endmacro
; **************************************************************************** ;
%macro DrawMemAddress 0
; sz_mem_address
push dword COLUMN1_TEXT_X
push dword y
push dword sz_mem_address
push dword [fore_color]
push dword [back_color]
call DrawTextBold
; [mem_address]
push dword [thread_info + THREAD_INFO.mem_address]
call uint2str
push dword COLUMN2_MAX_COUNT
call PadBuffSpaces
push dword COLUMN2_TEXT_X
push dword y
push dword tmpbuffer
push dword [fore_color]
push dword [back_color]
call DrawTextBold
call ChangeBackColor
add y, dword ITEM_HEIGHT
%endmacro
; **************************************************************************** ;
%macro DrawMemUsage 0
; sz_mem_usage
push dword COLUMN1_TEXT_X
push dword y
push dword sz_mem_usage
push dword [fore_color]
push dword [back_color]
call DrawTextBold
; [mem_usage]
push dword [thread_info + THREAD_INFO.mem_usage]
call uint2str
push dword COLUMN2_MAX_COUNT
call PadBuffSpaces
push dword COLUMN2_TEXT_X
push dword y
push dword tmpbuffer
push dword [fore_color]
push dword [back_color]
call DrawTextBold
call ChangeBackColor
add y, dword ITEM_HEIGHT
%endmacro
; **************************************************************************** ;
%macro DrawIdentifier 0
; sz_identifier
push dword COLUMN1_TEXT_X
push dword y
push dword sz_identifier
push dword [fore_color]
push dword [back_color]
call DrawTextBold
; [identifier]
push dword [thread_info + THREAD_INFO.identifier]
call uint2str
push dword COLUMN2_MAX_COUNT
call PadBuffSpaces
push dword COLUMN2_TEXT_X
push dword y
push dword tmpbuffer
push dword [fore_color]
push dword [back_color]
call DrawTextBold
call ChangeBackColor
add y, dword ITEM_HEIGHT
%endmacro
; **************************************************************************** ;
%macro DrawWindowX 0
; sz_x
push dword COLUMN1_TEXT_X
push dword y
push dword sz_x
push dword [fore_color]
push dword [back_color]
call DrawTextBold
; [x]
push dword [thread_info + THREAD_INFO.x]
call uint2str
push dword COLUMN2_MAX_COUNT
call PadBuffSpaces
push dword COLUMN2_TEXT_X
push dword y
push dword tmpbuffer
push dword [fore_color]
push dword [back_color]
call DrawTextBold
call ChangeBackColor
add y, dword ITEM_HEIGHT
%endmacro
; **************************************************************************** ;
%macro DrawWindowY 0
; sz_y
push dword COLUMN1_TEXT_X
push dword y
push dword sz_y
push dword [fore_color]
push dword [back_color]
call DrawTextBold
; [y]
push dword [thread_info + THREAD_INFO.y]
call uint2str
push dword COLUMN2_MAX_COUNT
call PadBuffSpaces
push dword COLUMN2_TEXT_X
push dword y
push dword tmpbuffer
push dword [fore_color]
push dword [back_color]
call DrawTextBold
call ChangeBackColor
add y, dword ITEM_HEIGHT
%endmacro
; **************************************************************************** ;
%macro DrawWindowSizeX 0
; sz_size_x
push dword COLUMN1_TEXT_X
push dword y
push dword sz_size_x
push dword [fore_color]
push dword [back_color]
call DrawTextBold
; [size_x]
push dword [thread_info + THREAD_INFO.size_x]
call uint2str
push dword COLUMN2_MAX_COUNT
call PadBuffSpaces
push dword COLUMN2_TEXT_X
push dword y
push dword tmpbuffer
push dword [fore_color]
push dword [back_color]
call DrawTextBold
call ChangeBackColor
add y, dword ITEM_HEIGHT
%endmacro
; **************************************************************************** ;
%macro DrawWindowSizeY 0
; sz_size_y
push dword COLUMN1_TEXT_X
push dword y
push dword sz_size_y
push dword [fore_color]
push dword [back_color]
call DrawTextBold
; [size_y]
push dword [thread_info + THREAD_INFO.size_y]
call uint2str
push dword COLUMN2_MAX_COUNT
call PadBuffSpaces
push dword COLUMN2_TEXT_X
push dword y
push dword tmpbuffer
push dword [fore_color]
push dword [back_color]
call DrawTextBold
call ChangeBackColor
add y, dword ITEM_HEIGHT
%endmacro
; **************************************************************************** ;
%macro DrawThreadState 0
; sz_thread_state
push dword COLUMN1_TEXT_X
push dword y
push dword sz_thread_state
push dword [fore_color]
push dword [back_color]
call DrawTextBold
; decoded_thread_state & [thread_state]
movzx eax, word [thread_info + THREAD_INFO.thread_state]
push eax ; for "call uint2str" below
%%running:
cmp eax, THREAD_STATE_RUNNING
jne %%suspended
mov eax, sz_running
jmp %%draw_decoded_thread_state
%%suspended:
cmp eax, THREAD_STATE_SUSPENDED
jne %%suspended_w
mov eax, sz_suspended
jmp %%draw_decoded_thread_state
%%suspended_w:
cmp eax, THREAD_STATE_SUSPENDED_WAIT_EVENT
jne %%normal_term
mov eax, sz_suspended_wait_event
jmp %%draw_decoded_thread_state
%%normal_term:
cmp eax, THREAD_STATE_NORMAL_TERMINATING
jne %%except_term
mov eax, sz_normal_terminating
jmp %%draw_decoded_thread_state
%%except_term:
cmp eax, THREAD_STATE_EXCEPT_TERMINATING
jne %%wait_event
mov eax, sz_except_terminating
jmp %%draw_decoded_thread_state
%%wait_event:
cmp eax, THREAD_STATE_WAIT_EVENT
jne %%slot_free
mov eax, sz_wait_event
jmp %%draw_decoded_thread_state
%%slot_free:
cmp eax, THREAD_STATE_SLOT_IS_FREE
jne %%undefined
mov eax, sz_slot_is_free
jmp %%draw_decoded_thread_state
%%undefined:
mov eax, sz_undefined
%%draw_decoded_thread_state:
push dword COLUMN3_TEXT_X
push dword y
push eax
push dword [fore_color]
push dword [back_color]
call DrawTextBold
call uint2str
push dword COLUMN2_MAX_COUNT
call PadBuffSpaces
push dword COLUMN2_TEXT_X
push dword y
push dword tmpbuffer
push dword [fore_color]
push dword [back_color]
call DrawTextBold
call ChangeBackColor
add y, dword ITEM_HEIGHT
%endmacro
; **************************************************************************** ;
%macro DrawClientX 0
; sz_client_x
push dword COLUMN1_TEXT_X
push dword y
push dword sz_client_x
push dword [fore_color]
push dword [back_color]
call DrawTextBold
; [client_x]
push dword [thread_info + THREAD_INFO.client_x]
call uint2str
push dword COLUMN2_MAX_COUNT
call PadBuffSpaces
push dword COLUMN2_TEXT_X
push dword y
push dword tmpbuffer
push dword [fore_color]
push dword [back_color]
call DrawTextBold
call ChangeBackColor
add y, dword ITEM_HEIGHT
%endmacro
; **************************************************************************** ;
%macro DrawClientY 0
; sz_client_y
push dword COLUMN1_TEXT_X
push dword y
push dword sz_client_y
push dword [fore_color]
push dword [back_color]
call DrawTextBold
; [client_y]
push dword [thread_info + THREAD_INFO.client_y]
call uint2str
push dword COLUMN2_MAX_COUNT
call PadBuffSpaces
push dword COLUMN2_TEXT_X
push dword y
push dword tmpbuffer
push dword [fore_color]
push dword [back_color]
call DrawTextBold
call ChangeBackColor
add y, dword ITEM_HEIGHT
%endmacro
; **************************************************************************** ;
%macro DrawClientSizeX 0
; sz_client_size_x
push dword COLUMN1_TEXT_X
push dword y
push dword sz_client_size_x
push dword [fore_color]
push dword [back_color]
call DrawTextBold
; [client_size_x]
push dword [thread_info + THREAD_INFO.client_size_x]
call uint2str
push dword COLUMN2_MAX_COUNT
call PadBuffSpaces
push dword COLUMN2_TEXT_X
push dword y
push dword tmpbuffer
push dword [fore_color]
push dword [back_color]
call DrawTextBold
call ChangeBackColor
add y, dword ITEM_HEIGHT
%endmacro
; **************************************************************************** ;
%macro DrawClientSizeY 0
; sz_client_size_y
push dword COLUMN1_TEXT_X
push dword y
push dword sz_client_size_y
push dword [fore_color]
push dword [back_color]
call DrawTextBold
; [client_size_y]
push dword [thread_info + THREAD_INFO.client_size_y]
call uint2str
push dword COLUMN2_MAX_COUNT
call PadBuffSpaces
push dword COLUMN2_TEXT_X
push dword y
push dword tmpbuffer
push dword [fore_color]
push dword [back_color]
call DrawTextBold
call ChangeBackColor
add y, dword ITEM_HEIGHT
%endmacro
; **************************************************************************** ;
%macro DrawWindowState 0
; sz_window_state
push dword COLUMN1_TEXT_X
push dword y
push dword sz_window_state
push dword [fore_color]
push dword [back_color]
call DrawTextBold
; decoded_window_state & [window_state]
movzx eax, byte [thread_info + THREAD_INFO.window_state]
push eax ; for "call uint2str" below
mov ebx, eax
mov [tmpbuffer], byte 0
%%maximized:
test ebx, WINDOW_STATE_MAXIMIZED
jz %%minimized
push tmpbuffer
push sz_maximized
call StringConcatenate
%%minimized:
test ebx, WINDOW_STATE_MINIMIZED
jz %%rolled_up
push tmpbuffer
push sz_minimized
call StringConcatenate
%%rolled_up:
test ebx, WINDOW_STATE_ROLLED_UP
jz %%draw_decoded_window_state
push tmpbuffer
push sz_rolled_up
call StringConcatenate
%%draw_decoded_window_state:
push dword COLUMN3_MAX_COUNT
call PadBuffSpaces
push dword COLUMN3_TEXT_X
push dword y
push dword tmpbuffer
push dword [fore_color]
push dword [back_color]
call DrawTextBold
call uint2str
push dword COLUMN2_MAX_COUNT
call PadBuffSpaces
push dword COLUMN2_TEXT_X
push dword y
push dword tmpbuffer
push dword [fore_color]
push dword [back_color]
call DrawTextBold
call ChangeBackColor
add y, dword ITEM_HEIGHT
%endmacro
; **************************************************************************** ;
%macro DrawEventMask 0
; sz_event_mask
push dword COLUMN1_TEXT_X
push dword y
push dword sz_event_mask
push dword [fore_color]
push dword [back_color]
call DrawTextBold
; decoded_event_mask & [event_mask]
mov eax, [thread_info + THREAD_INFO.event_mask]
push eax ; for "call uint2str" below
mov ebx, eax
mov [tmpbuffer], byte 0
%%redraw:
test ebx, EM_REDRAW
jz %%key
push tmpbuffer
push sz_redraw
call StringConcatenate
%%key:
test ebx, EM_KEY
jz %%button
push tmpbuffer
push sz_key
call StringConcatenate
%%button:
test ebx, EM_BUTTON
jz %%reserved0
push tmpbuffer
push sz_button
call StringConcatenate
%%reserved0:
test ebx, EM_RESERVED0
jz %%redraw_background
push tmpbuffer
push sz_reserved0
call StringConcatenate
%%redraw_background:
test ebx, EM_REDRAW_BACKGROUND
jz %%mouse
push tmpbuffer
push sz_redraw_background
call StringConcatenate
%%mouse:
test ebx, EM_MOUSE
jz %%ipc
push tmpbuffer
push sz_mouse
call StringConcatenate
%%ipc:
test ebx, EM_IPC
jz %%network
push tmpbuffer
push sz_ipc
call StringConcatenate
%%network:
test ebx, EM_NETWORK
jz %%debug
push tmpbuffer
push sz_network
call StringConcatenate
%%debug:
test ebx, EM_DEBUG
jz %%draw_decoded_event_mask
push tmpbuffer
push sz_debug
call StringConcatenate
%%draw_decoded_event_mask:
push dword COLUMN3_MAX_COUNT
call PadBuffSpaces
push dword COLUMN3_TEXT_X
push dword y
push dword tmpbuffer
push dword [fore_color]
push dword [back_color]
call DrawTextBold
call uint2str
push dword COLUMN2_MAX_COUNT
call PadBuffSpaces
push dword COLUMN2_TEXT_X
push dword y
push dword tmpbuffer
push dword [fore_color]
push dword [back_color]
call DrawTextBold
call ChangeBackColor
add y, dword ITEM_HEIGHT
%endmacro
; **************************************************************************** ;
%macro DrawKeyboardMode 0
push dword COLUMN2_MAX_COUNT
call PadBuffSpaces
; sz_keyboard_mode
push dword COLUMN1_TEXT_X
push dword y
push dword sz_keyboard_mode
push dword [fore_color]
push dword [back_color]
call DrawTextBold
; decoded_keyboard_mode & [keyboard_mode]
movzx eax, byte [thread_info + THREAD_INFO.keyboard_mode]
push eax ; for "call uint2str" below
%%ascii:
cmp eax, KEYBOARD_MODE_ASCII
jne %%scan
mov eax, sz_ascii
jmp %%draw_decoded_keyboard_mode
%%scan:
cmp eax, KEYBOARD_MODE_SCAN
jne %%undefined
mov eax, sz_scan
jmp %%draw_decoded_keyboard_mode
%%undefined:
mov eax, sz_undefined
%%draw_decoded_keyboard_mode:
push dword COLUMN3_TEXT_X
push dword y
push eax
push dword [fore_color]
push dword [back_color]
call DrawTextBold
call uint2str
push dword COLUMN2_TEXT_X
push dword y
push dword tmpbuffer
push dword [fore_color]
push dword [back_color]
call DrawTextBold
call ChangeBackColor
add y, dword ITEM_HEIGHT
%endmacro
; **************************************************************************** ;
%macro DrawUpdateIndicator 0
mov eax, [IndicatorColors]
sub eax, 3
neg eax
mov [IndicatorColors], eax
; draw.rectangle
mov edx, [eax * 4 + IndicatorColors]
mov eax, 13
mov ebx, INDICATOR_LEFT << 16 | INDICATOR_WIDTH
mov ecx, INDICATOR_TOP << 16 | INDICATOR_HEIGHT
int 64
%endmacro
; **************************************************************************** ;
%macro DrawTable 0
; DrawFrames
push dword FRAME1_LEFT
push dword FRAME_TOP
push dword FRAME1_RIGHT
push dword FRAME_BOTTOM
push dword [frame_color]
call DrawFrame
push dword FRAME2_LEFT
push dword FRAME_TOP
push dword FRAME2_RIGHT
push dword FRAME_BOTTOM
push dword [frame_color]
call DrawFrame
push dword FRAME3_LEFT
push dword FRAME_TOP
push dword FRAME3_RIGHT
push dword FRAME_BOTTOM
push dword [frame_color]
call DrawFrame
; DrawItems
mov esi, COLUMN_Y
xor edi, edi
%%draw_item:
cmp edi, ITEM_COUNT
jnl %%done
mov ecx, esi
shl ecx, 16
or ecx, ITEM_HEIGHT
; draw.rectangle
mov eax, 13
mov ebx, COLUMN1_X << 16 | COLUMN1_ITEM_WIDTH
mov edx, [back_color]
int 64
; draw.rectangle
mov eax, 13
mov ebx, COLUMN2_X << 16 | COLUMN2_ITEM_WIDTH
mov edx, [back_color]
int 64
; draw.rectangle
mov eax, 13
mov ebx, COLUMN3_X << 16 | COLUMN3_ITEM_WIDTH
mov edx, [back_color]
int 64
call ChangeBackColor
add esi, ITEM_HEIGHT
inc edi
jmp %%draw_item
%%done:
%endmacro
; ---------------------------------------------------------------------------- ;
align 4
START:
mov esi, [program.params]
test [esi], byte 0xFF
jz .no_params
; str2uint(program.params)
xor eax, eax
xor ecx, ecx
.convert:
lodsb
test al, al
jz .converted
lea ecx, [ecx + ecx * 4]
lea ecx, [eax + ecx * 2 - 48]
jmp .convert
.converted:
mov [slot], ecx
.no_params:
; get.screen.size
mov eax, 61
mov ebx, 1
int 64
mov [screen], eax
; skin.height
mov eax, 48
mov ebx, 4
int 64
add eax, FRAME_BOTTOM + FRAME_TOP + WINDOW_BORDER_SIZE
mov [window.width], dword WINDOW_WIDTH
mov [window.height], eax
movzx eax, word [screen.width]
movzx edx, word [screen.height]
sub eax, [window.width]
sub edx, [window.height]
shr eax, 1
shr edx, 1
mov [window.left], eax
mov [window.top], edx
; set.event
mov eax, 40
mov ebx, EM_REDRAW | EM_BUTTON
int 64
; ---------------------------------------------------------------------------- ;
align 4
on_redraw:
; redraw.start
mov eax, 12
mov ebx, 1
int 64
; draw.window
xor eax, eax
mov ebx, [window.left]
mov ecx, [window.top]
shl ebx, 16
shl ecx, 16
or ebx, [window.width]
or ecx, [window.height]
mov edx, WINDOW_STYLE | WINDOW_BACK_COLOR
mov edi, sz_caption
xor esi, esi
int 64
; redraw.finish
mov eax, 12
mov ebx, 2
int 64
DrawTable
call UpdateThreadInfo
align 4
wait.event.by.time:
mov eax, 23
mov ebx, UPDATE_TIME
int 64
dec eax
jz on_redraw ; IF eax = 1 THEN redraw
jns on_button ; ELSEIF eax = 2 THEN button
call UpdateThreadInfo ; ELSE no event -> update thread info
jmp wait.event.by.time
align 4
on_button: ; terminate because we have only one button(close button)
or eax, -1
int 64
; ---------------------------------------------------------------------------- ;
align 4
UpdateThreadInfo:
; get.thread.info
mov eax, 9
mov ebx, thread_info
mov ecx, [slot]
int 64
mov x, dword COLUMN1_X
mov y, dword COLUMN_Y + (ITEM_HEIGHT - TEXT_HEIGHT) / 2
mov [back_color], dword ITEM_BACK_COLOR_1
mov [BackColors], dword 1
; order of next "Draw..." can be changed
DrawName
DrawThreadState
DrawWindowState
DrawEventMask
DrawKeyboardMode
DrawCpuUsage
DrawMemUsage
DrawMemAddress
DrawIdentifier
DrawWinStackPos
DrawWindowX
DrawWindowY
DrawWindowSizeX
DrawWindowSizeY
DrawClientX
DrawClientY
DrawClientSizeX
DrawClientSizeY
DrawUpdateIndicator ; blinking thing at upper right corner
ret
; ---------------------------------------------------------------------------- ;
align 4
DrawFrame:
%define Color [esp + 4 +1*4]
%define Bottom [esp + 8 +1*4]
%define Top [esp + 16 +1*4]
%define Right [esp + 12 +1*4]
%define Left [esp + 20 +1*4]
push ebp
mov eax, 38
mov edx, Color
mov esi, Bottom
mov edi, Top
mov ebp, Right
mov ebx, Left
shl ebx, 16
mov bx, bp
shrd ecx, edi, 16
mov cx, di
int 64
shrd ecx, esi, 16
mov cx, si
int 64
shld esi, ebx, 16
mov bx, si
shrd ecx, edi, 16
int 64
shrd ebx, ebp, 16
mov bx, bp
int 64
pop ebp
ret 20
%undef Color
%undef Bottom
%undef Top
%undef Right
%undef Left
; ---------------------------------------------------------------------------- ;
align 4
StringConcatenate:
%define stradd [esp + 4]
%define str [esp + 8]
mov esi, stradd
or ecx, -1
mov edi, esi
xor eax, eax
repne scasb
mov edx, ecx
mov edi, str
repne scasb
dec edi
not edx
mov eax, str
mov ecx, edx
shr ecx, 2
and edx, 3
rep movsd
mov ecx, edx
rep movsb
ret 8
%undef stradd
%undef str
; ---------------------------------------------------------------------------- ;
align 4
DrawTextBold:
%define x [esp + 20]
%define y [esp + 16]
%define text [esp + 12]
%define fore_color [esp + 8]
%define back_color [esp + 4]
mov eax, 4
mov ecx, fore_color
mov edi, back_color
mov esi, 1 ; count
mov edx, text
mov ebx, x
shl ebx, 16
or ebx, y
align 4
.next:
test [edx], byte 0xFF
jz .done
or ecx, 0x40000000
int 64
add ebx, (1 << 16)
and ecx, 0x00FFFFFF
int 64
add ebx, (6 << 16)
inc edx
jmp .next
align 4
.done:
ret 20
%undef x
%undef y
%undef text
%undef fore_color
%undef back_color
; ---------------------------------------------------------------------------- ;
align 4
ChangeBackColor:
mov eax, [BackColors]
sub eax, 3
neg eax
mov [BackColors], eax
mov eax, [eax * 4 + BackColors]
mov [back_color], eax
ret
; ---------------------------------------------------------------------------- ;
align 4
uint2str:
%define value [esp + 4]
push dword value ; value
push dword 10 ; base(decimal)
push dword tmpbuffer ; buffer
call ConvertToBase
ret 4
%undef value
; ---------------------------------------------------------------------------- ;
align 4
ConvertToBase:
%define value [esp + 12] ; value treated as unsigned
%define base [esp + 8] ; 2 <= base <= 36
%define buffer [esp + 4] ; SizeOf(buffer) => (32 + 1)
mov eax, value
mov ecx, base
mov esi, buffer
mov edi, esi ; +0 +31 +32
add esi, 32 ; base2(0xFFFFFFFF) = 11111111111111111111111111111111b
mov [esi], byte 0 ; end of string byte 0
align 4
.next:
xor edx, edx
div ecx
dec esi
mov dl, [edx + .digits]; (put digit
mov [esi], dl ; to buffer)
test eax, eax
jnz .next
; shift result string to buffer beginning
mov eax, esi
sub eax, edi
mov ecx, 32 + 1
sub ecx, eax
mov eax, edi ; return buffer
; yes, memory overlapped, but edi not above than esi
; hope that movsD faster than movsB in this case
; if you want only "rep movsb" because it shorter then remove five next lines before "rep movsb"
mov edx, ecx
shr ecx, 2
and edx, 3
rep movsd
mov ecx, edx
rep movsb
ret 12
%undef value
%undef base
%undef buffer
align 4
.digits db "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
; ---------------------------------------------------------------------------- ;
align 4
PadBuffSpaces:
%define maxlen [esp + 4]
mov edi, tmpbuffer
or ecx, -1
xor eax, eax
repne scasb
dec edi
sub eax, ecx
dec eax
mov ecx, maxlen
sub ecx, eax
mov eax, " "
mov edx, ecx
shr ecx, 2
and edx, 3
rep stosd
mov ecx, edx
rep stosb
mov [edi], byte 0
ret 4
%undef maxlen
; ---------------------------------------------------------------------------- ;
align 4
END: