Subversion Repositories Kolibri OS

Rev

Rev 4966 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
4966 0CodErr 1
;   This program shows  information about thread   ;
2
;        usage:  tinfo [slot of the thread]        ;
3
; if slot number is omitted then assume  slot = -1 ;
4
;    to compile: nasm -f bin tinfo.asm -o tinfo    ;
5
ORG 0
6
BITS 32
7
; ---------------------------------------------------------------------------- ;
8
PATH_SIZE                         equ 1024
9
PARAMS_SIZE                       equ 256
10
STACK_SIZE                        equ 256
11
PROC_INFO_SIZE                    equ 1024
12
TMP_BUFFER_SIZE                   equ 64
13
; ---------------------------------------------------------------------------- ;
6609 0CodErr 14
TEXT_WIDTH                        equ 8
4966 0CodErr 15
BOLD_TEXT_WIDTH                   equ TEXT_WIDTH + 1
16
; ---------------------------------------------------------------------------- ;
17
COLUMN1_MAX_COUNT                 equ 13
18
COLUMN2_MAX_COUNT                 equ 12
19
COLUMN3_MAX_COUNT                 equ 26
20
; ---------------------------------------------------------------------------- ;
21
COLUMN_PADDING                    equ 3
22
COLUMN1_PADDING                   equ COLUMN_PADDING
23
COLUMN2_PADDING                   equ COLUMN_PADDING
24
COLUMN3_PADDING                   equ COLUMN_PADDING
25
; ---------------------------------------------------------------------------- ;
6609 0CodErr 26
ITEM_HEIGHT                       equ 22
27
TEXT_HEIGHT                       equ 16
28
%comment
4966 0CodErr 29
COLUMN1_ITEM_WIDTH                equ COLUMN1_MAX_COUNT * BOLD_TEXT_WIDTH + COLUMN1_PADDING * 2
30
COLUMN2_ITEM_WIDTH                equ COLUMN2_MAX_COUNT * BOLD_TEXT_WIDTH + COLUMN2_PADDING * 2
31
COLUMN3_ITEM_WIDTH                equ COLUMN3_MAX_COUNT * BOLD_TEXT_WIDTH + COLUMN3_PADDING * 2
6609 0CodErr 32
%endcomment
33
COLUMN1_ITEM_WIDTH                equ COLUMN1_MAX_COUNT * TEXT_WIDTH + COLUMN1_PADDING * 2
34
COLUMN2_ITEM_WIDTH                equ COLUMN2_MAX_COUNT * TEXT_WIDTH + COLUMN2_PADDING * 2
35
COLUMN3_ITEM_WIDTH                equ COLUMN3_MAX_COUNT * TEXT_WIDTH + COLUMN3_PADDING * 2
4966 0CodErr 36
ITEM_MARGIN                       equ 6
37
ITEM_BACK_COLOR_1                 equ 0x00EAEAEA
38
ITEM_BACK_COLOR_2                 equ 0x00F4F4F4
39
ITEM_COUNT                        equ 18 ; at current time we have 18 items
40
; ---------------------------------------------------------------------------- ;
41
COLUMN_Y                          equ 10
42
COLUMN1_X                         equ 10
43
COLUMN2_X                         equ COLUMN1_X + COLUMN1_ITEM_WIDTH + ITEM_MARGIN
44
COLUMN3_X                         equ COLUMN2_X + COLUMN2_ITEM_WIDTH + ITEM_MARGIN
45
; ---------------------------------------------------------------------------- ;
46
COLUMN1_TEXT_X                    equ COLUMN1_X + COLUMN1_PADDING
47
COLUMN2_TEXT_X                    equ COLUMN2_X + COLUMN2_PADDING
48
COLUMN3_TEXT_X                    equ COLUMN3_X + COLUMN3_PADDING
49
; ---------------------------------------------------------------------------- ;
50
FRAME_TOP                         equ COLUMN_Y - ITEM_MARGIN / 2
51
FRAME_BOTTOM                      equ COLUMN_Y + ITEM_HEIGHT * ITEM_COUNT + ITEM_MARGIN / 2 - 1
52
 ; ---------------------------------------------------------------------------- ;
53
FRAME1_LEFT                       equ COLUMN1_X - ITEM_MARGIN / 2
54
FRAME1_RIGHT                      equ COLUMN1_X + COLUMN1_ITEM_WIDTH + ITEM_MARGIN / 2 - 1
55
; ---------------------------------------------------------------------------- ;
56
FRAME2_LEFT                       equ COLUMN2_X - ITEM_MARGIN / 2
57
FRAME2_RIGHT                      equ COLUMN2_X + COLUMN2_ITEM_WIDTH + ITEM_MARGIN / 2 - 1
58
; ---------------------------------------------------------------------------- ;
59
FRAME3_LEFT                       equ COLUMN3_X - ITEM_MARGIN / 2
60
FRAME3_RIGHT                      equ COLUMN3_X + COLUMN3_ITEM_WIDTH + ITEM_MARGIN / 2 - 1
61
; ---------------------------------------------------------------------------- ;
62
WINDOW_STYLE_SKINNED_FIXED        equ 0x4000000
63
WINDOW_STYLE_COORD_CLIENT         equ 0x20000000
64
WINDOW_STYLE_CAPTION              equ 0x10000000
65
; ---------------------------------------------------------------------------- ;
66
WINDOW_BORDER_SIZE                equ 5
67
WINDOW_WIDTH                      equ FRAME3_RIGHT + FRAME1_LEFT + WINDOW_BORDER_SIZE * 2
68
WINDOW_STYLE                      equ WINDOW_STYLE_SKINNED_FIXED | WINDOW_STYLE_COORD_CLIENT | WINDOW_STYLE_CAPTION
69
WINDOW_BACK_COLOR                 equ 0x00FFFFFF
70
; ---------------------------------------------------------------------------- ;
71
INDICATOR_WIDTH                   equ 3
72
INDICATOR_HEIGHT                  equ 3
73
INDICATOR_LEFT                    equ COLUMN3_X + COLUMN3_ITEM_WIDTH + ITEM_MARGIN / 2
74
INDICATOR_TOP                     equ COLUMN_Y  - ITEM_MARGIN / 2 - INDICATOR_HEIGHT
75
; ---------------------------------------------------------------------------- ;
76
UPDATE_TIME                       equ 28
77
; ---------------------------------------------------------------------------- ;
78
thread_info                       equ END + PATH_SIZE + PARAMS_SIZE
79
tmpbuffer                         equ END + PATH_SIZE + PARAMS_SIZE + PROC_INFO_SIZE
80
; ---------------------------------------------------------------------------- ;
81
KEYBOARD_MODE_ASCII               equ 0
82
KEYBOARD_MODE_SCAN                equ 1
83
; ---------------------------------------------------------------------------- ;
84
WINDOW_STATE_MAXIMIZED            equ 1
85
WINDOW_STATE_MINIMIZED            equ 2
86
WINDOW_STATE_ROLLED_UP            equ 4
87
; ---------------------------------------------------------------------------- ;
88
THREAD_STATE_RUNNING              equ 0
89
THREAD_STATE_SUSPENDED            equ 1
90
THREAD_STATE_SUSPENDED_WAIT_EVENT equ 2
91
THREAD_STATE_NORMAL_TERMINATING   equ 3
92
THREAD_STATE_EXCEPT_TERMINATING   equ 4
93
THREAD_STATE_WAIT_EVENT           equ 5
94
THREAD_STATE_SLOT_IS_FREE         equ 9
95
; ---------------------------------------------------------------------------- ;
96
EM_REDRAW                         equ         1b
97
EM_KEY                            equ        10b
98
EM_BUTTON                         equ       100b
99
EM_RESERVED0                      equ      1000b
100
EM_REDRAW_BACKGROUND              equ     10000b
101
EM_MOUSE                          equ    100000b
102
EM_IPC                            equ   1000000b
103
EM_NETWORK                        equ  10000000b
104
EM_DEBUG                          equ 100000000b
105
; ---------------------------------------------------------------------------- ;
106
struc THREAD_INFO
107
        .cpu_usage               resd 1  ; usage of the processor
108
        .win_stack_pos           resw 1  ; position of the window of thread in the window stack
109
        .reserved0               resw 1  ; has no relation to the specified thread
110
        .reserved1               resw 1  ; reserved
111
        .name                    resb 11 ; name of the started file - executable file without extension
112
        .reserved2               resb 1  ; reserved, this byte is not changed
113
        .mem_address             resd 1  ; address of the process in memory
114
        .mem_usage               resd 1  ; size of used memory - 1
115
        .identifier              resd 1  ; identifier (PID/TID)
116
        .x                       resd 1  ; coordinate of the thread window on axis x
117
        .y                       resd 1  ; coordinate of the thread window on axis y
118
        .size_x                  resd 1  ; size of the thread window on axis x
119
        .size_y                  resd 1  ; size of the thread window on axis y
120
        .thread_state            resw 1  ; status of the thread slot
121
        .reserved3               resw 1  ; reserved, this word is not changed
122
        .client_x                resd 1  ; coordinate of the client area on axis x
123
        .client_y                resd 1  ; coordinate of the client area on axis y
124
        .client_size_x           resd 1  ; width of the client area
125
        .client_size_y           resd 1  ; height of the client area
126
        .window_state            resb 1  ; state of the window - bitfield
127
        .event_mask              resd 1  ; event mask
128
        .keyboard_mode           resb 1  ; keyboard mode
129
endstruc
130
; ---------------------------------------------------------------------------- ;
131
MENUET01       db 'MENUET01'
132
version        dd 1
133
program.start  dd START
134
program.end    dd END
135
program.memory dd END + PATH_SIZE + PARAMS_SIZE + PROC_INFO_SIZE + TMP_BUFFER_SIZE + STACK_SIZE
136
program.stack  dd END + PATH_SIZE + PARAMS_SIZE + PROC_INFO_SIZE + TMP_BUFFER_SIZE + STACK_SIZE
137
program.params dd END + PATH_SIZE
138
program.path   dd END
139
; ---------------------------------------------------------------------------- ;
140
slot                              dd -1 ; for default if no params
141
; ---------------------------------------------------------------------------- ;
142
screen:
143
.height                           dw 0
144
.width                            dw 0
145
; ---------------------------------------------------------------------------- ;
146
window:
147
.left                             dd 0
148
.top                              dd 0
149
.width                            dd 0
150
.height                           dd 0
151
; ---------------------------------------------------------------------------- ;
152
fore_color                        dd 0x00000000
153
back_color                        dd ITEM_BACK_COLOR_1
154
frame_color                       dd 0x00CCCCCC
155
; ---------------------------------------------------------------------------- ;
156
BackColors:
157
                                  dd 1
158
                                  dd ITEM_BACK_COLOR_1
159
                                  dd ITEM_BACK_COLOR_2
160
; ---------------------------------------------------------------------------- ;
161
IndicatorColors:
162
                                  dd 1
163
                                  dd 0x000AF000
164
                                  dd 0x00000FA0
165
; ---------------------------------------------------------------------------- ;
166
%define x [Pos.x]
167
%define y [Pos.y]
168
Pos:
169
.x                                dd COLUMN1_X
170
.y                                dd COLUMN_Y
171
; ---------------------------------------------------------------------------- ;
172
sz_caption                        db "ThreadInfo",0
173
; ---------------------------------------------------------------------------- ;
174
sz_cpu_usage                      db "CPU usage",0
175
sz_win_stack_pos                  db "Win stack pos",0
176
sz_name                           db "Name",0
177
sz_mem_address                    db "Mem address",0
178
sz_mem_usage                      db "Mem usage",0
179
sz_identifier                     db "Identifier",0
180
sz_x                              db "X",0
181
sz_y                              db "Y",0
182
sz_size_x                         db "Size X",0
183
sz_size_y                         db "Size Y",0
184
sz_thread_state                   db "Thread state",0
185
sz_client_x                       db "Client X",0
186
sz_client_y                       db "Client Y",0
187
sz_client_size_x                  db "Client Size X",0
188
sz_client_size_y                  db "Client Size Y",0
189
sz_window_state                   db "Window state",0
190
sz_event_mask                     db "Event mask",0
191
sz_keyboard_mode                  db "Keyboard mode",0
192
; ---------------------------------------------------------------------------- ;
193
; state of the window
194
sz_maximized                      db "Max ",0
195
sz_minimized                      db "Min ",0
196
sz_rolled_up                      db "RollUp ",0
197
; ---------------------------------------------------------------------------- ;
198
; keyboard mode
199
sz_ascii                          db "ASCII",0
200
sz_scan                           db "SCAN ",0
201
; ---------------------------------------------------------------------------- ;
202
; status of the thread slot
203
sz_running                        db "running             ",0
204
sz_suspended                      db "suspended           ",0
205
sz_suspended_wait_event           db "suspended wait event",0
206
sz_normal_terminating             db "normal terminating  ",0
207
sz_except_terminating             db "except. terminating ",0
208
sz_wait_event                     db "wait event          ",0
209
sz_slot_is_free                   db "slot is free        ",0
210
; ---------------------------------------------------------------------------- ;
211
; event mask
212
sz_redraw                         db "rdrw ",0
213
sz_key                            db "key ",0
214
sz_button                         db "btn ",0
215
sz_reserved0                      db "rsrvd0 ",0
216
sz_redraw_background              db "bckgr ",0
217
sz_mouse                          db "mouse ",0
218
sz_ipc                            db "ipc ",0
219
sz_network                        db "net ",0
220
sz_debug                          db "dbg ",0
221
; ---------------------------------------------------------------------------- ;
222
sz_undefined                      db "UnDef               ",0
223
; **************************************************************************** ;
224
%macro DrawCpuUsage 0
225
; sz_cpu_usage
226
        push   dword COLUMN1_TEXT_X
227
        push   dword y
228
        push   dword sz_cpu_usage
229
        push   dword [fore_color]
230
        push   dword [back_color]
6609 0CodErr 231
        call   DrawText
4966 0CodErr 232
; [cpu_usage]
233
        push   dword [thread_info + THREAD_INFO.cpu_usage]
234
        call   uint2str
235
        push   dword COLUMN2_MAX_COUNT
236
        call   PadBuffSpaces
237
        push   dword COLUMN2_TEXT_X
238
        push   dword y
239
        push   dword tmpbuffer
240
        push   dword [fore_color]
241
        push   dword [back_color]
6609 0CodErr 242
        call   DrawText
4966 0CodErr 243
        call   ChangeBackColor
244
        add    y, dword ITEM_HEIGHT
245
%endmacro
246
; **************************************************************************** ;
247
%macro DrawWinStackPos 0
248
; sz_win_stack_pos
249
        push   dword COLUMN1_TEXT_X
250
        push   dword y
251
        push   dword sz_win_stack_pos
252
        push   dword [fore_color]
253
        push   dword [back_color]
6609 0CodErr 254
        call   DrawText
4966 0CodErr 255
; [win_stack_pos]
256
        movzx  eax, word [thread_info + THREAD_INFO.win_stack_pos]
257
        push   eax
258
        call   uint2str
259
        push   dword COLUMN2_MAX_COUNT
260
        call   PadBuffSpaces
261
        push   dword COLUMN2_TEXT_X
262
        push   dword y
263
        push   dword tmpbuffer
264
        push   dword [fore_color]
265
        push   dword [back_color]
6609 0CodErr 266
        call   DrawText
4966 0CodErr 267
        call   ChangeBackColor
268
        add    y, dword ITEM_HEIGHT
269
%endmacro
270
; **************************************************************************** ;
271
%macro DrawName 0
272
; sz_name
273
        push   dword COLUMN1_TEXT_X
274
        push   dword y
275
        push   dword sz_name
276
        push   dword [fore_color]
277
        push   dword [back_color]
6609 0CodErr 278
        call   DrawText
4966 0CodErr 279
; name
280
        push   dword COLUMN2_TEXT_X
281
        push   dword y
282
        push   dword (thread_info + THREAD_INFO.name)
283
        push   dword [fore_color]
284
        push   dword [back_color]
6609 0CodErr 285
        call   DrawText
4966 0CodErr 286
        call   ChangeBackColor
287
        add    y, dword ITEM_HEIGHT
288
%endmacro
289
; **************************************************************************** ;
290
%macro DrawMemAddress 0
291
; sz_mem_address
292
        push   dword COLUMN1_TEXT_X
293
        push   dword y
294
        push   dword sz_mem_address
295
        push   dword [fore_color]
296
        push   dword [back_color]
6609 0CodErr 297
        call   DrawText
4966 0CodErr 298
; [mem_address]
299
        push   dword [thread_info + THREAD_INFO.mem_address]
300
        call   uint2str
301
        push   dword COLUMN2_MAX_COUNT
302
        call   PadBuffSpaces
303
        push   dword COLUMN2_TEXT_X
304
        push   dword y
305
        push   dword tmpbuffer
306
        push   dword [fore_color]
307
        push   dword [back_color]
6609 0CodErr 308
        call   DrawText
4966 0CodErr 309
        call   ChangeBackColor
310
        add    y, dword ITEM_HEIGHT
311
%endmacro
312
; **************************************************************************** ;
313
%macro DrawMemUsage 0
314
; sz_mem_usage
315
        push   dword COLUMN1_TEXT_X
316
        push   dword y
317
        push   dword sz_mem_usage
318
        push   dword [fore_color]
319
        push   dword [back_color]
6609 0CodErr 320
        call   DrawText
4966 0CodErr 321
; [mem_usage]
322
        push   dword [thread_info + THREAD_INFO.mem_usage]
323
        call   uint2str
324
        push   dword COLUMN2_MAX_COUNT
325
        call   PadBuffSpaces
326
        push   dword COLUMN2_TEXT_X
327
        push   dword y
328
        push   dword tmpbuffer
329
        push   dword [fore_color]
330
        push   dword [back_color]
6609 0CodErr 331
        call   DrawText
4966 0CodErr 332
        call   ChangeBackColor
333
        add    y, dword ITEM_HEIGHT
334
%endmacro
335
; **************************************************************************** ;
336
%macro DrawIdentifier 0
337
; sz_identifier
338
        push   dword COLUMN1_TEXT_X
339
        push   dword y
340
        push   dword sz_identifier
341
        push   dword [fore_color]
342
        push   dword [back_color]
6609 0CodErr 343
        call   DrawText
4966 0CodErr 344
; [identifier]
345
        push   dword [thread_info + THREAD_INFO.identifier]
346
        call   uint2str
347
        push   dword COLUMN2_MAX_COUNT
348
        call   PadBuffSpaces
349
        push   dword COLUMN2_TEXT_X
350
        push   dword y
351
        push   dword tmpbuffer
352
        push   dword [fore_color]
353
        push   dword [back_color]
6609 0CodErr 354
        call   DrawText
4966 0CodErr 355
        call   ChangeBackColor
356
        add    y, dword ITEM_HEIGHT
357
%endmacro
358
; **************************************************************************** ;
359
%macro DrawWindowX 0
360
; sz_x
361
        push   dword COLUMN1_TEXT_X
362
        push   dword y
363
        push   dword sz_x
364
        push   dword [fore_color]
365
        push   dword [back_color]
6609 0CodErr 366
        call   DrawText
4966 0CodErr 367
; [x]
368
        push   dword [thread_info + THREAD_INFO.x]
369
        call   uint2str
370
        push   dword COLUMN2_MAX_COUNT
371
        call   PadBuffSpaces
372
        push   dword COLUMN2_TEXT_X
373
        push   dword y
374
        push   dword tmpbuffer
375
        push   dword [fore_color]
376
        push   dword [back_color]
6609 0CodErr 377
        call   DrawText
4966 0CodErr 378
        call   ChangeBackColor
379
        add    y, dword ITEM_HEIGHT
380
%endmacro
381
; **************************************************************************** ;
382
%macro DrawWindowY 0
383
; sz_y
384
        push   dword COLUMN1_TEXT_X
385
        push   dword y
386
        push   dword sz_y
387
        push   dword [fore_color]
388
        push   dword [back_color]
6609 0CodErr 389
        call   DrawText
4966 0CodErr 390
; [y]
391
        push   dword [thread_info + THREAD_INFO.y]
392
        call   uint2str
393
        push   dword COLUMN2_MAX_COUNT
394
        call   PadBuffSpaces
395
        push   dword COLUMN2_TEXT_X
396
        push   dword y
397
        push   dword tmpbuffer
398
        push   dword [fore_color]
399
        push   dword [back_color]
6609 0CodErr 400
        call   DrawText
4966 0CodErr 401
        call   ChangeBackColor
402
        add    y, dword ITEM_HEIGHT
403
%endmacro
404
; **************************************************************************** ;
405
%macro DrawWindowSizeX 0
406
; sz_size_x
407
        push   dword COLUMN1_TEXT_X
408
        push   dword y
409
        push   dword sz_size_x
410
        push   dword [fore_color]
411
        push   dword [back_color]
6609 0CodErr 412
        call   DrawText
4966 0CodErr 413
; [size_x]
414
        push   dword [thread_info + THREAD_INFO.size_x]
415
        call   uint2str
416
        push   dword COLUMN2_MAX_COUNT
417
        call   PadBuffSpaces
418
        push   dword COLUMN2_TEXT_X
419
        push   dword y
420
        push   dword tmpbuffer
421
        push   dword [fore_color]
422
        push   dword [back_color]
6609 0CodErr 423
        call   DrawText
4966 0CodErr 424
        call   ChangeBackColor
425
        add    y, dword ITEM_HEIGHT
426
%endmacro
427
; **************************************************************************** ;
428
%macro DrawWindowSizeY 0
429
; sz_size_y
430
        push   dword COLUMN1_TEXT_X
431
        push   dword y
432
        push   dword sz_size_y
433
        push   dword [fore_color]
434
        push   dword [back_color]
6609 0CodErr 435
        call   DrawText
4966 0CodErr 436
; [size_y]
437
        push   dword [thread_info + THREAD_INFO.size_y]
438
        call   uint2str
439
        push   dword COLUMN2_MAX_COUNT
440
        call   PadBuffSpaces
441
        push   dword COLUMN2_TEXT_X
442
        push   dword y
443
        push   dword tmpbuffer
444
        push   dword [fore_color]
445
        push   dword [back_color]
6609 0CodErr 446
        call   DrawText
4966 0CodErr 447
        call   ChangeBackColor
448
        add    y, dword ITEM_HEIGHT
449
%endmacro
450
; **************************************************************************** ;
451
%macro DrawThreadState 0
452
; sz_thread_state
453
        push   dword COLUMN1_TEXT_X
454
        push   dword y
455
        push   dword sz_thread_state
456
        push   dword [fore_color]
457
        push   dword [back_color]
6609 0CodErr 458
        call   DrawText
4966 0CodErr 459
; decoded_thread_state & [thread_state]
460
        movzx  eax, word [thread_info + THREAD_INFO.thread_state]
461
        push   eax ; for "call uint2str" below
462
%%running:
463
        cmp    eax, THREAD_STATE_RUNNING
464
        jne    %%suspended
465
        mov    eax, sz_running
466
        jmp    %%draw_decoded_thread_state
467
%%suspended:
468
        cmp    eax, THREAD_STATE_SUSPENDED
469
        jne    %%suspended_w
470
        mov    eax, sz_suspended
471
        jmp    %%draw_decoded_thread_state
472
%%suspended_w:
473
        cmp    eax, THREAD_STATE_SUSPENDED_WAIT_EVENT
474
        jne    %%normal_term
475
        mov    eax, sz_suspended_wait_event
476
        jmp    %%draw_decoded_thread_state
477
%%normal_term:
478
        cmp    eax, THREAD_STATE_NORMAL_TERMINATING
479
        jne    %%except_term
480
        mov    eax, sz_normal_terminating
481
        jmp    %%draw_decoded_thread_state
482
%%except_term:
483
        cmp    eax, THREAD_STATE_EXCEPT_TERMINATING
484
        jne    %%wait_event
485
        mov    eax, sz_except_terminating
486
        jmp    %%draw_decoded_thread_state
487
%%wait_event:
488
        cmp    eax, THREAD_STATE_WAIT_EVENT
489
        jne    %%slot_free
490
        mov    eax, sz_wait_event
491
        jmp    %%draw_decoded_thread_state
492
%%slot_free:
493
        cmp    eax, THREAD_STATE_SLOT_IS_FREE
494
        jne    %%undefined
495
        mov    eax, sz_slot_is_free
496
        jmp    %%draw_decoded_thread_state
497
%%undefined:
498
        mov    eax, sz_undefined
499
%%draw_decoded_thread_state:
500
        push   dword COLUMN3_TEXT_X
501
        push   dword y
502
        push   eax
503
        push   dword [fore_color]
504
        push   dword [back_color]
6609 0CodErr 505
        call   DrawText
4966 0CodErr 506
        call   uint2str
507
        push   dword COLUMN2_MAX_COUNT
508
        call   PadBuffSpaces
509
        push   dword COLUMN2_TEXT_X
510
        push   dword y
511
        push   dword tmpbuffer
512
        push   dword [fore_color]
513
        push   dword [back_color]
6609 0CodErr 514
        call   DrawText
4966 0CodErr 515
        call   ChangeBackColor
516
        add    y, dword ITEM_HEIGHT
517
%endmacro
518
; **************************************************************************** ;
519
%macro DrawClientX 0
520
; sz_client_x
521
        push   dword COLUMN1_TEXT_X
522
        push   dword y
523
        push   dword sz_client_x
524
        push   dword [fore_color]
525
        push   dword [back_color]
6609 0CodErr 526
        call   DrawText
4966 0CodErr 527
; [client_x]
528
        push   dword [thread_info + THREAD_INFO.client_x]
529
        call   uint2str
530
        push   dword COLUMN2_MAX_COUNT
531
        call   PadBuffSpaces
532
        push   dword COLUMN2_TEXT_X
533
        push   dword y
534
        push   dword tmpbuffer
535
        push   dword [fore_color]
536
        push   dword [back_color]
6609 0CodErr 537
        call   DrawText
4966 0CodErr 538
        call   ChangeBackColor
539
        add    y, dword ITEM_HEIGHT
540
%endmacro
541
; **************************************************************************** ;
542
%macro DrawClientY 0
543
; sz_client_y
544
        push   dword COLUMN1_TEXT_X
545
        push   dword y
546
        push   dword sz_client_y
547
        push   dword [fore_color]
548
        push   dword [back_color]
6609 0CodErr 549
        call   DrawText
4966 0CodErr 550
; [client_y]
551
        push   dword [thread_info + THREAD_INFO.client_y]
552
        call   uint2str
553
        push   dword COLUMN2_MAX_COUNT
554
        call   PadBuffSpaces
555
        push   dword COLUMN2_TEXT_X
556
        push   dword y
557
        push   dword tmpbuffer
558
        push   dword [fore_color]
559
        push   dword [back_color]
6609 0CodErr 560
        call   DrawText
4966 0CodErr 561
        call   ChangeBackColor
562
        add    y, dword ITEM_HEIGHT
563
%endmacro
564
; **************************************************************************** ;
565
%macro DrawClientSizeX 0
566
; sz_client_size_x
567
        push   dword COLUMN1_TEXT_X
568
        push   dword y
569
        push   dword sz_client_size_x
570
        push   dword [fore_color]
571
        push   dword [back_color]
6609 0CodErr 572
        call   DrawText
4966 0CodErr 573
; [client_size_x]
574
        push   dword [thread_info + THREAD_INFO.client_size_x]
575
        call   uint2str
576
        push   dword COLUMN2_MAX_COUNT
577
        call   PadBuffSpaces
578
        push   dword COLUMN2_TEXT_X
579
        push   dword y
580
        push   dword tmpbuffer
581
        push   dword [fore_color]
582
        push   dword [back_color]
6609 0CodErr 583
        call   DrawText
4966 0CodErr 584
        call   ChangeBackColor
585
        add    y, dword ITEM_HEIGHT
586
%endmacro
587
; **************************************************************************** ;
588
%macro DrawClientSizeY 0
589
; sz_client_size_y
590
        push   dword COLUMN1_TEXT_X
591
        push   dword y
592
        push   dword sz_client_size_y
593
        push   dword [fore_color]
594
        push   dword [back_color]
6609 0CodErr 595
        call   DrawText
4966 0CodErr 596
; [client_size_y]
597
        push   dword [thread_info + THREAD_INFO.client_size_y]
598
        call   uint2str
599
        push   dword COLUMN2_MAX_COUNT
600
        call   PadBuffSpaces
601
        push   dword COLUMN2_TEXT_X
602
        push   dword y
603
        push   dword tmpbuffer
604
        push   dword [fore_color]
605
        push   dword [back_color]
6609 0CodErr 606
        call   DrawText
4966 0CodErr 607
        call   ChangeBackColor
608
        add    y, dword ITEM_HEIGHT
609
%endmacro
610
; **************************************************************************** ;
611
%macro DrawWindowState 0
612
; sz_window_state
613
        push   dword COLUMN1_TEXT_X
614
        push   dword y
615
        push   dword sz_window_state
616
        push   dword [fore_color]
617
        push   dword [back_color]
6609 0CodErr 618
        call   DrawText
4966 0CodErr 619
; decoded_window_state & [window_state]
620
        movzx  eax, byte [thread_info + THREAD_INFO.window_state]
621
        push   eax ; for "call uint2str" below
622
        mov    ebx, eax
623
        mov    [tmpbuffer], byte 0
624
%%maximized:
625
        test   ebx, WINDOW_STATE_MAXIMIZED
626
        jz     %%minimized
627
        push   tmpbuffer
628
        push   sz_maximized
629
        call   StringConcatenate
630
%%minimized:
631
        test   ebx, WINDOW_STATE_MINIMIZED
632
        jz     %%rolled_up
633
        push   tmpbuffer
634
        push   sz_minimized
635
        call   StringConcatenate
636
%%rolled_up:
637
        test   ebx, WINDOW_STATE_ROLLED_UP
638
        jz     %%draw_decoded_window_state
639
        push   tmpbuffer
640
        push   sz_rolled_up
641
        call   StringConcatenate
642
%%draw_decoded_window_state:
643
        push   dword COLUMN3_MAX_COUNT
644
        call   PadBuffSpaces
645
        push   dword COLUMN3_TEXT_X
646
        push   dword y
647
        push   dword tmpbuffer
648
        push   dword [fore_color]
649
        push   dword [back_color]
6609 0CodErr 650
        call   DrawText
4966 0CodErr 651
        call   uint2str
652
        push   dword COLUMN2_MAX_COUNT
653
        call   PadBuffSpaces
654
        push   dword COLUMN2_TEXT_X
655
        push   dword y
656
        push   dword tmpbuffer
657
        push   dword [fore_color]
658
        push   dword [back_color]
6609 0CodErr 659
        call   DrawText
4966 0CodErr 660
        call   ChangeBackColor
661
        add    y, dword ITEM_HEIGHT
662
%endmacro
663
; **************************************************************************** ;
664
%macro DrawEventMask 0
665
; sz_event_mask
666
        push   dword COLUMN1_TEXT_X
667
        push   dword y
668
        push   dword sz_event_mask
669
        push   dword [fore_color]
670
        push   dword [back_color]
6609 0CodErr 671
        call   DrawText
4966 0CodErr 672
; decoded_event_mask & [event_mask]
673
        mov    eax, [thread_info + THREAD_INFO.event_mask]
674
        push   eax ; for "call uint2str" below
675
        mov    ebx, eax
676
        mov    [tmpbuffer], byte 0
677
%%redraw:
678
        test   ebx, EM_REDRAW
679
        jz     %%key
680
        push   tmpbuffer
681
        push   sz_redraw
682
        call   StringConcatenate
683
%%key:
684
        test   ebx, EM_KEY
685
        jz     %%button
686
        push   tmpbuffer
687
        push   sz_key
688
        call   StringConcatenate
689
%%button:
690
        test   ebx, EM_BUTTON
691
        jz     %%reserved0
692
        push   tmpbuffer
693
        push   sz_button
694
        call   StringConcatenate
695
%%reserved0:
696
        test   ebx, EM_RESERVED0
697
        jz     %%redraw_background
698
        push   tmpbuffer
699
        push   sz_reserved0
700
        call   StringConcatenate
701
%%redraw_background:
702
        test   ebx, EM_REDRAW_BACKGROUND
703
        jz     %%mouse
704
        push   tmpbuffer
705
        push   sz_redraw_background
706
        call   StringConcatenate
707
%%mouse:
708
        test   ebx, EM_MOUSE
709
        jz     %%ipc
710
        push   tmpbuffer
711
        push   sz_mouse
712
        call   StringConcatenate
713
%%ipc:
714
        test   ebx, EM_IPC
715
        jz     %%network
716
        push   tmpbuffer
717
        push   sz_ipc
718
        call   StringConcatenate
719
%%network:
720
        test   ebx, EM_NETWORK
721
        jz     %%debug
722
        push   tmpbuffer
723
        push   sz_network
724
        call   StringConcatenate
725
%%debug:
726
        test   ebx, EM_DEBUG
727
        jz     %%draw_decoded_event_mask
728
        push   tmpbuffer
729
        push   sz_debug
730
        call   StringConcatenate
731
%%draw_decoded_event_mask:
732
        push   dword COLUMN3_MAX_COUNT
733
        call   PadBuffSpaces
734
        push   dword COLUMN3_TEXT_X
735
        push   dword y
736
        push   dword tmpbuffer
737
        push   dword [fore_color]
738
        push   dword [back_color]
6609 0CodErr 739
        call   DrawText
4966 0CodErr 740
        call   uint2str
741
        push   dword COLUMN2_MAX_COUNT
742
        call   PadBuffSpaces
743
        push   dword COLUMN2_TEXT_X
744
        push   dword y
745
        push   dword tmpbuffer
746
        push   dword [fore_color]
747
        push   dword [back_color]
6609 0CodErr 748
        call   DrawText
4966 0CodErr 749
        call   ChangeBackColor
750
        add    y, dword ITEM_HEIGHT
751
%endmacro
752
; **************************************************************************** ;
753
%macro DrawKeyboardMode 0
754
        push   dword COLUMN2_MAX_COUNT
755
        call   PadBuffSpaces
756
; sz_keyboard_mode
757
        push   dword COLUMN1_TEXT_X
758
        push   dword y
759
        push   dword sz_keyboard_mode
760
        push   dword [fore_color]
761
        push   dword [back_color]
6609 0CodErr 762
        call   DrawText
4966 0CodErr 763
; decoded_keyboard_mode & [keyboard_mode]
764
        movzx  eax, byte [thread_info + THREAD_INFO.keyboard_mode]
765
        push   eax ; for "call uint2str" below
766
%%ascii:
767
        cmp    eax, KEYBOARD_MODE_ASCII
768
        jne    %%scan
769
        mov    eax, sz_ascii
770
        jmp    %%draw_decoded_keyboard_mode
771
%%scan:
772
        cmp    eax, KEYBOARD_MODE_SCAN
773
        jne    %%undefined
774
        mov    eax, sz_scan
775
        jmp    %%draw_decoded_keyboard_mode
776
%%undefined:
777
        mov    eax, sz_undefined
778
%%draw_decoded_keyboard_mode:
779
        push   dword COLUMN3_TEXT_X
780
        push   dword y
781
        push   eax
782
        push   dword [fore_color]
783
        push   dword [back_color]
6609 0CodErr 784
        call   DrawText
4966 0CodErr 785
        call   uint2str
786
        push   dword COLUMN2_TEXT_X
787
        push   dword y
788
        push   dword tmpbuffer
789
        push   dword [fore_color]
790
        push   dword [back_color]
6609 0CodErr 791
        call   DrawText
4966 0CodErr 792
        call   ChangeBackColor
793
        add    y, dword ITEM_HEIGHT
794
%endmacro
795
; **************************************************************************** ;
796
%macro DrawUpdateIndicator 0
797
        mov    eax, [IndicatorColors]
798
        sub    eax, 3
799
        neg    eax
800
        mov    [IndicatorColors], eax
801
; draw.rectangle
802
        mov    edx, [eax * 4 + IndicatorColors]
803
        mov    eax, 13
804
        mov    ebx, INDICATOR_LEFT << 16 | INDICATOR_WIDTH
805
        mov    ecx, INDICATOR_TOP  << 16 | INDICATOR_HEIGHT
806
        int    64
807
%endmacro
808
; **************************************************************************** ;
809
%macro DrawTable 0
810
; DrawFrames
811
        push   dword FRAME1_LEFT
812
        push   dword FRAME_TOP
813
        push   dword FRAME1_RIGHT
814
        push   dword FRAME_BOTTOM
815
        push   dword [frame_color]
816
        call   DrawFrame
817
        push   dword FRAME2_LEFT
818
        push   dword FRAME_TOP
819
        push   dword FRAME2_RIGHT
820
        push   dword FRAME_BOTTOM
821
        push   dword [frame_color]
822
        call   DrawFrame
823
        push   dword FRAME3_LEFT
824
        push   dword FRAME_TOP
825
        push   dword FRAME3_RIGHT
826
        push   dword FRAME_BOTTOM
827
        push   dword [frame_color]
828
        call   DrawFrame
829
; DrawItems
830
        mov    esi, COLUMN_Y
831
        xor    edi, edi
832
%%draw_item:
833
        cmp    edi, ITEM_COUNT
834
        jnl    %%done
835
        mov    ecx, esi
836
        shl    ecx, 16
837
        or     ecx, ITEM_HEIGHT
838
; draw.rectangle
839
        mov    eax, 13
840
        mov    ebx, COLUMN1_X << 16 | COLUMN1_ITEM_WIDTH
841
        mov    edx, [back_color]
842
        int    64
843
; draw.rectangle
844
        mov    eax, 13
845
        mov    ebx, COLUMN2_X << 16 | COLUMN2_ITEM_WIDTH
846
        mov    edx, [back_color]
847
        int    64
848
; draw.rectangle
849
        mov    eax, 13
850
        mov    ebx, COLUMN3_X << 16 | COLUMN3_ITEM_WIDTH
851
        mov    edx, [back_color]
852
        int    64
853
        call   ChangeBackColor
854
        add    esi, ITEM_HEIGHT
855
        inc    edi
856
        jmp    %%draw_item
857
%%done:
858
%endmacro
859
; ---------------------------------------------------------------------------- ;
860
align 4
861
START:
862
        mov    esi, [program.params]
863
        test   [esi], byte 0xFF
864
        jz     .no_params
865
; str2uint(program.params)
866
        xor    eax, eax
867
        xor    ecx, ecx
868
.convert:
869
        lodsb
870
        test   al, al
871
        jz     .converted
872
        lea    ecx, [ecx + ecx * 4]
873
        lea    ecx, [eax + ecx * 2 - 48]
874
        jmp    .convert
875
.converted:
876
        mov    [slot], ecx
877
.no_params:
878
; get.screen.size
879
        mov    eax, 61
880
        mov    ebx, 1
881
        int    64
882
        mov    [screen], eax
883
; skin.height
884
        mov    eax, 48
885
        mov    ebx, 4
886
        int    64
887
        add    eax, FRAME_BOTTOM + FRAME_TOP + WINDOW_BORDER_SIZE
888
        mov    [window.width], dword WINDOW_WIDTH
889
        mov    [window.height], eax
890
        movzx  eax, word [screen.width]
891
        movzx  edx, word [screen.height]
892
        sub    eax, [window.width]
893
        sub    edx, [window.height]
894
        shr    eax, 1
895
        shr    edx, 1
896
        mov    [window.left], eax
897
        mov    [window.top], edx
898
; set.event
899
        mov    eax, 40
900
        mov    ebx, EM_REDRAW | EM_BUTTON
901
        int    64
902
; ---------------------------------------------------------------------------- ;
903
align 4
904
on_redraw:
905
; redraw.start
906
        mov    eax, 12
907
        mov    ebx, 1
908
        int    64
909
; draw.window
910
        xor    eax, eax
911
        mov    ebx, [window.left]
912
        mov    ecx, [window.top]
913
        shl    ebx, 16
914
        shl    ecx, 16
915
        or     ebx, [window.width]
916
        or     ecx, [window.height]
917
        mov    edx, WINDOW_STYLE | WINDOW_BACK_COLOR
918
        mov    edi, sz_caption
919
        xor    esi, esi
920
        int    64
921
; redraw.finish
922
        mov    eax, 12
923
        mov    ebx, 2
924
        int    64
925
        DrawTable
926
        call   UpdateThreadInfo
927
align 4
928
wait.event.by.time:
929
        mov    eax, 23
930
        mov    ebx, UPDATE_TIME
931
        int    64
932
        dec    eax
933
        jz     on_redraw        ; IF      eax = 1 THEN   redraw
934
        jns    on_button        ; ELSEIF  eax = 2 THEN   button
935
        call   UpdateThreadInfo ; ELSE no event -> update thread info
936
        jmp    wait.event.by.time
937
align 4
938
on_button: ; terminate because we have only one button(close button)
939
        or     eax, -1
940
        int    64
941
; ---------------------------------------------------------------------------- ;
942
align 4
943
UpdateThreadInfo:
944
; get.thread.info
945
        mov    eax, 9
946
        mov    ebx, thread_info
947
        mov    ecx, [slot]
948
        int    64
949
 
950
        mov    x, dword COLUMN1_X
951
        mov    y, dword COLUMN_Y + (ITEM_HEIGHT - TEXT_HEIGHT) / 2
952
        mov    [back_color], dword ITEM_BACK_COLOR_1
953
        mov    [BackColors], dword 1
954
; order of next "Draw..." can be changed
955
        DrawName
956
        DrawThreadState
957
        DrawWindowState
958
        DrawEventMask
959
        DrawKeyboardMode
960
        DrawCpuUsage
961
        DrawMemUsage
962
        DrawMemAddress
963
        DrawIdentifier
964
        DrawWinStackPos
965
        DrawWindowX
966
        DrawWindowY
967
        DrawWindowSizeX
968
        DrawWindowSizeY
969
        DrawClientX
970
        DrawClientY
971
        DrawClientSizeX
972
        DrawClientSizeY
973
 
974
        DrawUpdateIndicator ; blinking thing at upper right corner
975
 
976
        ret
977
; ---------------------------------------------------------------------------- ;
978
align 4
979
DrawFrame:
980
%define Color  [esp +  4 +1*4]
981
%define Bottom [esp +  8 +1*4]
982
%define Top    [esp + 16 +1*4]
983
%define Right  [esp + 12 +1*4]
984
%define Left   [esp + 20 +1*4]
985
        push   ebp
986
        mov    eax, 38
987
        mov    edx, Color
988
        mov    esi, Bottom
989
        mov    edi, Top
990
        mov    ebp, Right
991
        mov    ebx, Left
992
        shl    ebx, 16
993
        mov    bx, bp
994
        shrd   ecx, edi, 16
995
        mov    cx, di
996
        int    64
997
        shrd   ecx, esi, 16
998
        mov    cx, si
999
        int    64
1000
        shld   esi, ebx, 16
1001
        mov    bx, si
1002
        shrd   ecx, edi, 16
1003
        int    64
1004
        shrd   ebx, ebp, 16
1005
        mov    bx, bp
1006
        int    64
1007
        pop    ebp
1008
        ret    20
1009
%undef Color
1010
%undef Bottom
1011
%undef Top
1012
%undef Right
1013
%undef Left
1014
; ---------------------------------------------------------------------------- ;
1015
align 4
1016
StringConcatenate:
1017
%define stradd [esp +  4]
1018
%define str    [esp +  8]
1019
        mov    esi, stradd
1020
        or     ecx, -1
1021
        mov    edi, esi
1022
        xor    eax, eax
1023
        repne scasb
1024
        mov    edx, ecx
1025
        mov    edi, str
1026
        repne scasb
1027
        dec    edi
1028
        not    edx
1029
        mov    eax, str
1030
        mov    ecx, edx
1031
        shr    ecx, 2
1032
        and    edx, 3
1033
        rep movsd
1034
        mov    ecx, edx
1035
        rep movsb
1036
        ret    8
1037
%undef stradd
1038
%undef str
1039
; ---------------------------------------------------------------------------- ;
1040
align 4
6609 0CodErr 1041
DrawText:
1042
%define x          [esp + 20]
1043
%define y          [esp + 16]
1044
%define text       [esp + 12]
1045
%define fore_color [esp +  8]
1046
%define back_color [esp +  4]
1047
        mov    eax, 4
1048
        mov    ecx, fore_color
1049
        mov    edi, back_color
1050
        mov    edx, text
1051
        mov    ebx, x
1052
        shl    ebx, 16
1053
        or     ebx, y
1054
        or     ecx, 0xD0000000
1055
        int    64
1056
        ret    20
1057
%undef x
1058
%undef y
1059
%undef text
1060
%undef fore_color
1061
%undef back_color
1062
; ---------------------------------------------------------------------------- ;
1063
%comment
1064
align 4
4966 0CodErr 1065
DrawTextBold:
1066
%define x          [esp + 20]
1067
%define y          [esp + 16]
1068
%define text       [esp + 12]
1069
%define fore_color [esp +  8]
1070
%define back_color [esp +  4]
1071
        mov    eax, 4
1072
        mov    ecx, fore_color
1073
        mov    edi, back_color
1074
        mov    esi, 1 ; count
1075
        mov    edx, text
1076
        mov    ebx, x
1077
        shl    ebx, 16
1078
        or     ebx, y
1079
align 4
1080
.next:
1081
        test   [edx], byte 0xFF
1082
        jz     .done
6609 0CodErr 1083
        or     ecx, 0x50000000
4966 0CodErr 1084
        int    64
1085
        add    ebx, (1 << 16)
6609 0CodErr 1086
        and    ecx, 0x10FFFFFF
4966 0CodErr 1087
        int    64
6609 0CodErr 1088
        add    ebx, (TEXT_WIDTH << 16)
4966 0CodErr 1089
        inc    edx
1090
        jmp    .next
1091
align 4
1092
.done:
1093
        ret    20
1094
%undef x
1095
%undef y
1096
%undef text
1097
%undef fore_color
1098
%undef back_color
6609 0CodErr 1099
%endcomment
4966 0CodErr 1100
; ---------------------------------------------------------------------------- ;
1101
align 4
1102
ChangeBackColor:
1103
        mov    eax, [BackColors]
1104
        sub    eax, 3
1105
        neg    eax
1106
        mov    [BackColors], eax
1107
        mov    eax, [eax * 4 + BackColors]
1108
        mov    [back_color], eax
1109
        ret
1110
; ---------------------------------------------------------------------------- ;
1111
align 4
1112
uint2str:
1113
%define value  [esp + 4]
1114
        push   dword value     ; value
1115
        push   dword 10        ; base(decimal)
1116
        push   dword tmpbuffer ; buffer
1117
        call   ConvertToBase
1118
        ret    4
1119
%undef value
1120
; ---------------------------------------------------------------------------- ;
1121
align 4
1122
ConvertToBase:
1123
%define value  [esp + 12]        ; value treated as unsigned
1124
%define base   [esp +  8]        ; 2 <= base <= 36
1125
%define buffer [esp +  4]        ; SizeOf(buffer) => (32 + 1)
1126
        mov    eax, value
1127
        mov    ecx, base
1128
        mov    esi, buffer
1129
        mov    edi, esi          ;                    +0                             +31 +32
1130
        add    esi, 32           ; base2(0xFFFFFFFF) = 11111111111111111111111111111111b
1131
        mov    [esi], byte 0     ; end of string                                       byte 0
1132
align 4
1133
.next:
1134
        xor    edx, edx
1135
        div    ecx
1136
        dec    esi
1137
        mov    dl, [edx + .digits]; (put digit
1138
        mov    [esi], dl          ;           to buffer)
1139
        test   eax, eax
1140
        jnz    .next
1141
; shift result string to buffer beginning
1142
        mov    eax, esi
1143
        sub    eax, edi
1144
        mov    ecx, 32 + 1
1145
        sub    ecx, eax
1146
        mov    eax, edi          ; return buffer
1147
; yes, memory overlapped, but edi not above than esi
1148
; hope that movsD faster than movsB in this case
1149
; if you want only "rep movsb" because it shorter then remove five next lines before "rep movsb"
1150
        mov    edx, ecx
1151
        shr    ecx, 2
1152
        and    edx, 3
1153
        rep    movsd
1154
        mov    ecx, edx
1155
        rep    movsb
1156
        ret    12
1157
%undef value
1158
%undef base
1159
%undef buffer
1160
align 4
1161
.digits  db    "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
1162
; ---------------------------------------------------------------------------- ;
1163
align 4
1164
PadBuffSpaces:
1165
%define maxlen [esp + 4]
1166
        mov    edi, tmpbuffer
1167
        or     ecx, -1
1168
        xor    eax, eax
1169
        repne scasb
1170
        dec    edi
1171
        sub    eax, ecx
1172
        dec    eax
1173
        mov    ecx, maxlen
1174
        sub    ecx, eax
1175
        mov    eax, "    "
1176
        mov    edx, ecx
1177
        shr    ecx, 2
1178
        and    edx, 3
1179
        rep    stosd
1180
        mov    ecx, edx
1181
        rep    stosb
1182
        mov    [edi], byte 0
1183
        ret    4
1184
%undef maxlen
1185
; ---------------------------------------------------------------------------- ;
1186
align 4
1187
END: