kolibrios/programs/develop/mtdbg/gui.inc
Sergey Semyonov (Serge) b154c9c2cc mtdbg: 1)set rounding mode
2)improve output formatting 

git-svn-id: svn://kolibrios.org@4902 a494cfbc-eb01-0410-851d-a64ba20cac60
2014-04-27 11:58:27 +00:00

1743 lines
47 KiB
PHP

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; GUI ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
macro DrawRectangle x, y, w, h, color
{
mcall 13, x shl 16 + w, y shl 16 + 1, color ; top
mcall , x shl 16 + 1, y shl 16 + h, color ; left
mcall , (x+w) shl 16 +1, y shl 16 + (h+1), color ; right
mcall , x shl 16 + w, (y+h) shl 16 + 1, color ; bottom
}
;-----------------------------------------------------------------------------
; Color scheme
BLACK_ON_WHITE equ 0
MOVIEOS equ 1
WHITE_ON_BLACK equ 2
; format - 0xRRGGBB
if COLOR_THEME eq MOVIEOS
COLOR_BG_NORMAL = 0x1d272f
COLOR_BG_BREAKPOINT = 0x0000aa
COLOR_BG_SELECTED = 0xec9300
COLOR_LINE = 0x00b9a0
COLOR_TXT_NORMAL = 0xffffff
COLOR_TXT_INACTIVE = 0x8f7948
COLOR_TXT_CHANGED = 0xec9300
COLOR_TXT_LABEL = 0x22b14c
COLOR_TXT_SELECTED = 0x1d272f
COLOR_TXT_HEX = 0xec9300
COLOR_TXT_BREAKPOINT = 0xec9300
else if COLOR_THEME eq WHITE_ON_BLACK
COLOR_BG_NORMAL = 0x101010 ; dark grey
COLOR_BG_BREAKPOINT = 0xFF0000 ; red
COLOR_BG_SELECTED = 0x0000FF ; blue
COLOR_LINE = 0xFFFFFF ; white
COLOR_TXT_NORMAL = 0xFFFFFF ; white
COLOR_TXT_INACTIVE = 0x808080 ; grey
COLOR_TXT_CHANGED = 0x00AA00 ; green
COLOR_TXT_LABEL = COLOR_TXT_NORMAL
COLOR_TXT_SELECTED = 0xFFFFFF ; white
COLOR_TXT_HEX = COLOR_TXT_NORMAL
COLOR_TXT_BREAKPOINT = COLOR_TXT_NORMAL
else ; BLACK ON WHITE
COLOR_BG_NORMAL = 0xffffff ; white
COLOR_BG_BREAKPOINT = 0xFF0000 ; red
COLOR_BG_SELECTED = 0x0000FF ; blue
COLOR_LINE = 0x000000 ; black
COLOR_TXT_NORMAL = 0x000000 ; black
COLOR_TXT_INACTIVE = 0x808080 ; grey
COLOR_TXT_CHANGED = 0x00AA00 ; green
COLOR_TXT_LABEL = COLOR_TXT_NORMAL
COLOR_TXT_SELECTED = 0xFFFFFF ; white
COLOR_TXT_HEX = COLOR_TXT_NORMAL
COLOR_TXT_BREAKPOINT = COLOR_TXT_NORMAL
end if
;-----------------------------------------------------------------------------
data_width equ 80
data_x_pos equ 12
data_x_size equ data_width*6
title_x_pos equ 30
title_y_pos equ 32
title_y_size equ 10
;dump_y_pos equ (registers_y_pos + registers_y_size + 5)
dump_y_pos equ (title_y_pos + title_y_size)
dump_height equ 6
dump_y_size equ (dump_height*10)
disasm_y_pos equ (dump_y_pos + dump_y_size + 4)
disasm_height equ 18
disasm_y_size equ (disasm_height*10)
messages_width equ data_width
messages_height equ 8
messages_x_pos equ data_x_pos
messages_y_pos equ (disasm_y_pos + disasm_y_size + 4)
messages_x_size equ messages_width*6
messages_y_size equ messages_height*10
cmdline_width equ data_width
cmdline_x_pos equ data_x_pos
cmdline_y_pos equ (messages_y_pos + messages_y_size + 4)
cmdline_x_size equ messages_x_size
cmdline_y_size equ 10
registers_x_pos equ (data_x_pos + messages_x_size + 4)
registers_y_pos equ (title_y_pos + title_y_size - 3)
registers_x_size equ 134
registers_y_size equ (cmdline_y_pos + cmdline_y_size - registers_y_pos+1)
wnd_x_size equ (data_x_pos + messages_x_size + data_x_pos + registers_x_size+3)
wnd_y_size equ (cmdline_y_pos + cmdline_y_size + data_x_pos)
;-----------------------------------------------------------------------------
; Entry point
; TODO: split all gui part in independent function, move entry point into mtdbg.asm
start:
; initialize process heap
mcall 68, 11
push eax
fstcw word [esp]
or word [esp], 3 shl 10 ; set round-to-zero mode
fldcw word [esp]
pop eax
mov edi, messages
mov ecx, messages_width*messages_height
mov al, ' '
rep stosb
xor eax, eax
mov [messages_pos], eax
mov [cmdline_len], eax
mov [cmdline_pos], eax
mov edi, needzerostart
mov ecx, (needzeroend-needzerostart+3)/4
rep stosd
mov esi, begin_str
call put_message_nodraw
; set event mask - default events and debugging events
mcall 40, 0x107
; set debug messages buffer
mov ecx, dbgbufsize
mov dword [ecx], 256
xor ebx, ebx
mov [ecx+4], ebx
mov al, 69
mcall
mov esi, i_param
call get_arg.skip_spaces
test al, al
jz dodraw
push esi
call draw_window
pop esi
call OnLoadInit
jmp waitevent
dodraw:
call draw_window
waitevent:
mcall 10
cmp al, 9
jz debugmsg
dec eax
jz dodraw
dec eax
jz keypressed
dec eax
jnz waitevent
; button pressed - we have only one button (close)
mcall -1
; TODO: split in more independent function
keypressed:
mov al, 2
mcall
shr eax, 8
cmp al, 8
jz .backspace
cmp al, 0xB0
jz .left
cmp al, 0xB3
jz .right
cmp al, 0x0D
jz .enter
cmp al, 0xB6
jz .del
cmp al, 0xB4
jz .home
cmp al, 0xB5
jz .end
cmp al, 0xB1
jz .down
cmp al, 0xB2
jz .up
cmp ah, 0x41
jz F7
cmp ah, 0x42
jz F8
cmp [cmdline_len], cmdline_width
jae waitevent
push eax
call clear_cmdline_end
pop eax
mov edi, cmdline
mov ecx, [cmdline_len]
add edi, ecx
lea esi, [edi-1]
sub ecx, [cmdline_pos]
std
rep movsb
cld
stosb
inc [cmdline_len]
call draw_cmdline_end
inc [cmdline_pos]
call draw_cursor
jmp waitevent
.backspace:
cmp [cmdline_pos], 0
jz waitevent
dec [cmdline_pos]
.delchar:
call clear_cmdline_end
mov edi, [cmdline_pos]
dec [cmdline_len]
mov ecx, [cmdline_len]
sub ecx, edi
add edi, cmdline
lea esi, [edi+1]
rep movsb
call draw_cmdline_end
call draw_cursor
jmp waitevent
.del:
mov eax, [cmdline_pos]
cmp eax, [cmdline_len]
jae waitevent
jmp .delchar
.left:
cmp [cmdline_pos], 0
jz waitevent
call hide_cursor
dec [cmdline_pos]
call draw_cursor
jmp waitevent
.right:
mov eax, [cmdline_pos]
cmp eax, [cmdline_len]
jae waitevent
call hide_cursor
inc [cmdline_pos]
call draw_cursor
jmp waitevent
.home:
call hide_cursor
and [cmdline_pos], 0
call draw_cursor
jmp waitevent
.end:
call hide_cursor
mov eax, [cmdline_len]
mov [cmdline_pos], eax
call draw_cursor
.up:
.down:
jmp waitevent
; We also trying to execute previous command, if empty command_line
.enter:
mov ecx, [cmdline_len]
test ecx, ecx
jnz .exec_cur
mov cl, byte [cmdline_prev]
cmp cl, 0
jz waitevent
.exec_prev:
mov esi, cmdline_prev
jmp .exec
.exec_cur:
mov esi, cmdline
.exec:
mov byte [esi+ecx], 0
and [cmdline_pos], 0
push esi
call clear_cmdline_end
call draw_cursor
pop esi
and [cmdline_len], 0
; skip leading spaces
call get_arg.skip_spaces
cmp al, 0
jz waitevent
; now esi points to command
push esi
mov esi, prompt
call put_message_nodraw
pop esi
push esi
call put_message_nodraw
; TODO: add meaningful name
z1:
mov esi, newline
call put_message
pop esi
push esi
call get_arg
mov [curarg], esi
pop edi
mov esi, commands
call find_cmd
mov eax, aUnknownCommand
jc .x11
; check command requirements
; flags field:
; &1: command may be called without parameters
; &2: command may be called with parameters
; &4: command may be called without loaded program
; &8: command may be called with loaded program
mov eax, [esi+8]
mov ecx, [curarg]
cmp byte [ecx], 0
jz .noargs
test byte [esi+16], 2
jz .x11
jmp @f
.noargs:
test byte [esi+16], 1
jz .x11
@@:
cmp [debuggee_pid], 0
jz .nodebuggee
mov eax, aAlreadyLoaded
test byte [esi+16], 8
jz .x11
jmp .x9
.nodebuggee:
mov eax, need_debuggee
test byte [esi+16], 4
jnz .x9
.x11:
xchg esi, eax
call put_message
; store cmdline for repeating
.x10:
mov esi, cmdline
mov ecx, [cmdline_len]
@@:
cmp ecx, 0
jle .we
mov al, [esi + ecx]
mov [cmdline_prev + ecx], al
dec ecx
jmp @b
.we:
mov [cmdline_len], 0
jmp waitevent
.x9:
call dword [esi+4]
jmp .x10
;-----------------------------------------------------------------------------
; Cmdline handling
clear_cmdline_end:
mov ebx, [cmdline_pos]
mov ecx, [cmdline_len]
sub ecx, ebx
imul ebx, 6
imul ecx, 6
inc ecx
add ebx, cmdline_x_pos
shl ebx, 16
or ebx, ecx
mov ecx, cmdline_y_pos*10000h + cmdline_y_size
mov edx, COLOR_BG_NORMAL
; draw container rectangle/box for cmdline
mcall 13
ret
draw_cmdline:
xor ebx, ebx
jmp @f
; TODO: make it local
draw_cmdline_end:
mov ebx, [cmdline_pos]
@@:
mov esi, [cmdline_len]
sub esi, ebx
mov ecx, COLOR_TXT_NORMAL
lea edx, [cmdline+ebx]
imul ebx, 6
add ebx, cmdline_x_pos
shl ebx, 16
or ebx, cmdline_y_pos+1
; draw a text string in the window
mcall 4
ret
;-----------------------------------------------------------------------------
; Working with messages
; in: esi->ASCIIZ message
put_message_nodraw:
mov edx, [messages_pos]
.m:
lea edi, [messages+edx]
.l:
lodsb
cmp al, 0
jz .done
call test_scroll
cmp al, 10
jz .newline
cmp al, '%'
jnz @f
cmp dword [esp], z1
jnz .format
@@:
stosb
inc edx
jmp .l
.newline:
push edx
mov ecx, messages_width
xor eax, eax
xchg eax, edx
div ecx
xchg eax, edx
pop edx
test eax, eax
jz .m
sub edx, eax
add edx, ecx
jmp .m
.done:
mov [messages_pos], edx
ret
; at this moment all format specs must be %<digit>X
.format:
lodsb ; get <digit>
sub al, '0'
movzx ecx, al
lodsb
pop eax
pop ebp
push eax
; write number in ebp with ecx digits
dec ecx
shl ecx, 2
.writenibble:
push ecx
call test_scroll
pop ecx
mov eax, ebp
shr eax, cl
and al, 0xF
cmp al, 10
sbb al, 69h
das
stosb
inc edx
sub ecx, 4
jns .writenibble
jmp .l
test_scroll:
cmp edx, messages_width*messages_height
jnz .ret
push esi
mov edi, messages
lea esi, [edi+messages_width]
mov ecx, (messages_height-1)*messages_width/4
rep movsd
push eax
mov al, ' '
push edi
push messages_width
pop ecx
sub edx, ecx
rep stosb
pop edi
pop eax
pop esi
.ret:
ret
;-----------------------------------------------------------------------------
put_message:
call put_message_nodraw
draw_messages:
; draw container rectangle/box
mcall 13, messages_x_pos*10000h+messages_x_size, messages_y_pos*10000h+messages_y_size, COLOR_BG_NORMAL
mov edx, messages
push messages_width
pop esi
mov ecx, COLOR_TXT_NORMAL
mov ebx, messages_x_pos*10000h+messages_y_pos
@@:
; display text string in the window
mcall 4
add edx, esi
add ebx, 10
cmp edx, messages+messages_width*messages_height
jb @b
ret
;-----------------------------------------------------------------------------
; Show/hide cursor in command line
; TODO: make it cursor.draw and cursor.hide ???
draw_cursor:
mov ecx, cmdline_y_pos*10001h+cmdline_y_size-1
mov ebx, [cmdline_pos]
imul ebx, 6
add ebx, cmdline_x_pos
mov edx, ebx
shl ebx, 16
or ebx, edx
mov edx, COLOR_TXT_NORMAL
; draw line
mcall 38
ret
hide_cursor:
mov ebx, [cmdline_pos]
imul ebx, 6
add ebx, cmdline_x_pos
shl ebx, 16
inc ebx
mov ecx, cmdline_y_pos*10000h + cmdline_y_size
mov edx, COLOR_BG_NORMAL
; draw container rectangle/box
mcall 13
mov ebx, [cmdline_pos]
cmp ebx, [cmdline_len]
jae .ret
; setting up text color scheme and attributes
mov ecx, COLOR_TXT_NORMAL
lea edx, [cmdline+ebx]
imul ebx, 6
add ebx, cmdline_x_pos
shl ebx, 16
or ebx, cmdline_y_pos+1
push 1
pop esi
; draw text string in the window
mcall 4
.ret:
ret
;-----------------------------------------------------------------------------
; Draw program window title
; FIXME: something wrong here
redraw_title:
; draw container rectangle/box
mcall 13, title_x_pos*10000h+data_x_pos+data_x_size-title_x_pos, title_y_pos*10000h+title_y_size, COLOR_BG_NORMAL
draw_title:
mcall 38, (data_x_pos-2)*10000h+title_x_pos-5, (title_y_pos+5)*10001h, COLOR_LINE
push NoPrgLoaded_len
pop esi
cmp [debuggee_pid], 0
jz @f
mov esi, [prgname_len]
@@:
imul ebx, esi, 6
add ebx, title_x_pos+4
shl ebx, 16
mov bx, data_x_pos+data_x_size-10-5-6*7
cmp [bSuspended], 0
jz @f
add ebx, 6
@@:
; draw line with COLOR_LINE (in edx)
mcall
mov ebx, (data_x_pos+data_x_size-10+4)*0x10000 + data_x_pos+data_x_size+2
; draw line with COLOR_LINE (in edx)
mcall
mov al, 4
mov ebx, title_x_pos*10000h+title_y_pos
; setting up text color scheme and attributes
mov ecx, COLOR_TXT_NORMAL
mov edx, NoPrgLoaded_str
cmp [debuggee_pid], 0
jz @f
mov edx, [prgname_ptr]
@@:
; draw text string in the window
mcall
cmp [debuggee_pid], 0
jz .nodebuggee
mov ebx, (data_x_pos+data_x_size-10-6*7)*10000h + title_y_pos
mov edx, aRunning
push 7
pop esi
cmp [bSuspended], 0
jz @f
add ebx, 6*10000h
mov edx, aPaused
dec esi
@@:
; draw line with COLOR_LINE (in edx) in one case
; and draw text string with color COLOR_TXT_NORMAL (in ecx) in another
mcall
ret
.nodebuggee:
mov al, 38
mov ebx, (data_x_pos+data_x_size-10-6*7-5)*0x10000 + data_x_pos+data_x_size+2
mov ecx, (title_y_pos+5)*10001h
mov edx, COLOR_LINE
jmp @b
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;; REGISTERS PANEL ;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;-----------------------------------------------------------------------------
; Display common register content
; TODO: add format support (e.g. numerical value, or address offset/pointer)
; in: esi->value, edx->string, ecx = string length, ebx = coord
draw_register:
push edx
push ecx
push esi
mov eax, esi
mov esi, ecx
mov ecx, (COLOR_TXT_INACTIVE or 0x40000000)
cmp [debuggee_pid], 0
jz .cd
cmp [bSuspended], 0
jz .cd
mov ecx, (COLOR_TXT_NORMAL or 0x40000000)
push edi
mov edi, [eax]
cmp dword [eax+oldcontext-context], edi
pop edi
jz .cd
mov ecx, (COLOR_TXT_CHANGED or 0x40000000)
.cd:
; draw a text string in the window
mcall 4
imul esi, 60000h
lea edx, [ebx+esi]
mov esi, ecx
pop ecx
; draw a number in the window
mcall 47, 80101h
lea ebx, [edx+60000h*18]
mov esi, ecx
pop ecx
pop edx
add edx, ecx
ret
;-----------------------------------------------------------------------------
; Display FPU register (ST0 - ST7) content
;
; in: esi->value, edx->string, ecx = string length, ebx = coord
draw_fpu_register:
push ebx
push edx
push ecx
push esi
sub esp, 8
fld tword [esi]
fistp qword [esp]
mov eax, esi
mov esi, ecx
mov ecx, (COLOR_TXT_INACTIVE or 0x40000000)
cmp [debuggee_pid], 0
jz .cd
cmp [bSuspended], 0
jz .cd
mov ecx, (COLOR_TXT_NORMAL or 0x40000000)
push edi
mov edi, [eax]
cmp dword [eax+oldcontext-context], edi
pop edi
jnz .scol
push edi
mov edi, [eax+4]
cmp dword [eax+oldcontext-context+4], edi
pop edi
jz .cd
.scol:
mov ecx, (COLOR_TXT_CHANGED or 0x40000000)
.cd:
; draw a text string in the window
mcall 4
imul esi, 60000h
lea edx, [ebx+esi]
mov esi, ecx
mov ecx, esp
; draw a number in the window
; color is the same as for previous text draw function
; ebx : [20] show 16 chars set [30] bit - qword
mcall 47, 40100101h
add esp, 8
pop ecx
lea ebx, [edx+60000h*18]
mov esi, ecx
pop ecx
pop edx
pop ebx
add edx, ecx
ret
;-----------------------------------------------------------------------------
; Display FPU register (ST0 - ST7) content
;
; in: esi->value, ebx = coord
draw_fpu_register_2:
.str_buf equ esp
.bcd_man equ esp+32
.bcd_exp equ esp+32+12
.exp_v equ esp+32+12+12
sub esp, 32+12+12+4
mov eax, 0x20202020
mov edi, .str_buf
stosd
stosd
stosd
stosd
mov edx, ebp
shl edx, 4
movzx eax, word [_fsw]
shr eax, 11
add eax, ebp
and eax, 7
bt dword [_ftw], eax
jc .A6M
mov dword [.str_buf],' epm'
mov word [.str_buf+4],'ty'
jmp .display
mov cx, [_st0+edx+8]
and cx, 0x7FFF ;clear sign flag
jz .A6M
cmp cx, 0x7FFF
jne .decode
mov dword [.str_buf], ' inv'
mov dword [.str_buf+4], 'alid'
jmp .display
.A6M:
mov eax, dword [_st0+edx]
or eax, dword [_st0+edx+4]
jnz .decode
mov dword [.str_buf], ' 0.0'
jmp .display
.decode:
fld tword [_st0+edx]
fldlg2
fld tword [_st0+edx]
bt dword [_st0+edx+8], 15 ;check sign flag
jnc @f
fabs
@@:
fyl2x
frndint
fist dword [.exp_v]
fld st0
fbstp tword [.bcd_exp]
fldl2t
fmulp
fld st0
frndint
fxch
fsub st,st1
f2xm1
fld1
faddp
fscale
fstp st1
fdivp
fimul dword [_10000000]
fbstp tword [.bcd_man]
lea esi, [.bcd_man-1]
mov edi, .str_buf
mov ecx, 9
mov eax, 0x10000
mov al, [esi+ecx+1]
cmp al, 0x80 ; check for sign
jne .mantis_2_str
mov al, '-'
stosb
.mantis_2_str:
mov al, [esi+ecx]
test al, al
jnz @f
bt eax, 16
jc .skip_lb
@@:
mov ah, al
shr al, 4
jnz .write_h
bt eax, 16
jc .skip_hb
.write_h:
add al, 0x30
stosb
btr eax, 16
jnc .skip_hb
mov al, '.'
stosb
.skip_hb:
mov al, ah
and al, 0x0F
jnz .write_lb
bt eax, 16
jc .skip_lb
.write_lb:
add al,0x30
stosb
btr eax, 16
jnc .skip_lb
mov al, '.'
stosb
.skip_lb:
loop .mantis_2_str
mov eax, [.exp_v]
test eax, eax
jz .display
mov ax, ' e'
stosw
lea esi, [.bcd_exp-1]
mov ecx, 9
mov eax,0x10000
mov al, [esi+ecx+1]
cmp al, 0x80
jne .exp_2_str
mov al, '-'
stosb
.exp_2_str:
mov al, [esi+ecx]
test al, al
jnz @f
bt eax, 16
jc .skip_lb2
@@:
mov ah, al
shr al, 4
jnz .write_h2
bt eax, 16
jc .skip_hb2
.write_h2:
add al, 0x30
stosb
btr eax, 16
stosb
.skip_hb2:
mov al, ah
and al, 0x0F
jnz .write_lb2
bt eax, 16
jc .skip_lb2
.write_lb2:
add al, 0x30
stosb
btr eax, 16
.skip_lb2:
loop .exp_2_str
.display:
mov ecx, (COLOR_TXT_INACTIVE or 0x40000000)
cmp [debuggee_pid], 0
jz .do_label
cmp [bSuspended], 0
jz .do_label
mov ecx, (COLOR_TXT_NORMAL or 0x40000000)
mov eax, dword [_st0+edx]
cmp eax, dword [_st0+(oldcontext-context)+edx]
jne .scol
mov eax, dword [_st0+edx+4]
cmp eax, dword [_st0+(oldcontext-context)+4]
jne .scol
mov ax, word [_st0+edx+8]
cmp ax, word [_st0+(oldcontext-context)+8]
je .do_label
.scol:
mov ecx, (COLOR_TXT_CHANGED or 0x40000000)
.do_label:
; draw a text string in the window
mov eax, 4
mov esi, eax
lea edx, [fpu_strs+ebp*4]
mov edi, COLOR_BG_NORMAL
int 0x40
mov esi, 16
mov edx, .str_buf
add ebx, 0x180000
int 0x40
sub ebx, 0x180000
add esp, 32+12+12+4
ret
;-----------------------------------------------------------------------------
; Show FPU MMX register content
;
; in: esi->value, edx->string, ecx = string length, ebx = coord
draw_mmx_register:
push ebx
push edx
push ecx
push esi
mov eax, esi
mov esi, ecx
mov ecx, (COLOR_TXT_INACTIVE or 0x40000000)
cmp [debuggee_pid], 0
jz .cd
cmp [bSuspended], 0
jz .cd
mov ecx, (COLOR_TXT_NORMAL or 0x40000000)
push edi
mov edi, [eax]
cmp dword [eax+oldcontext-context], edi
pop edi
jnz .scol
push edi
mov edi, [eax+4]
cmp dword [eax+oldcontext-context+4], edi
pop edi
jz .cd
.scol:
mov ecx, (COLOR_TXT_CHANGED or 0x40000000)
.cd:
; draw a text string in the window
mcall 4
imul esi, 60000h
lea edx, [ebx+esi]
mov esi, ecx
pop ecx
; draw a number in the window
; color is the same as for previous draw text function
; ebx : [20] show 16 chars set [30] bit - qword
mcall 47, 40100101h
lea ebx, [edx+60000h*18]
mov esi, ecx
pop ecx
pop edx
pop ebx
add edx, ecx
ret
; TODO add SSE registers
; TODO add AVX registers
;-----------------------------------------------------------------------------
; Display contents of EFLAGS register
draw_flag:
movzx edi, byte [edx+7]
bt [_eflags], edi
jc .on
or byte [edx], 20h
jmp .onoff
.on:
and byte [edx], not 20h
.onoff:
mov ecx, (COLOR_TXT_INACTIVE or 0x40000000)
cmp [debuggee_pid], 0
jz .doit
cmp [bSuspended], 0
jz .doit
mov ecx, (COLOR_TXT_NORMAL or 0x40000000)
bt [_eflags], edi
lahf
bt dword [_eflags + oldcontext - context], edi
rcl ah, 1
test ah, 3
jp .doit
mov ecx, (COLOR_TXT_CHANGED or 0x40000000)
.doit:
mov ah, 0
mov edi, COLOR_BG_NORMAL
; draw a text string in the window in one case
; and a number in another
; color scheme same as for previously called function (was in ecx)
mcall
ret
;-----------------------------------------------------------------------------
; Draw registers frame title
; Also show current register set (common + MMX, SSE or AVX)
draw_reg_title:
mov edi, COLOR_BG_NORMAL
mov ecx, (COLOR_TXT_NORMAL or 0x40000000)
mov esi, 7
cmp [reg_mode], REG_MODE_CPU
jz @f
mov ecx, (COLOR_TXT_INACTIVE or 0x40000000)
@@:
mov edx, aMain
; draw a text string in the window
mcall 4, (registers_x_pos+4)*10000h+registers_y_pos+2
cmp [reg_mode], REG_MODE_SSE
jz @f
mov ecx, (COLOR_TXT_INACTIVE or 0x40000000)
@@:
mov edx, aSSE
; draw a text string in the window
mcall 4, (registers_x_pos+46)*10000h+registers_y_pos+2
cmp [reg_mode], REG_MODE_AVX
jz @f
mov ecx, (COLOR_TXT_INACTIVE or 0x40000000)
@@:
mov edx, aAVX
; draw a text string in the window
mcall 4, (registers_x_pos+88)*10000h+registers_y_pos+2
ret
;-----------------------------------------------------------------------------
; Display common registers set + MMX + FPU
draw_main_registers:
; TODO: add support for FPU ST0-ST7 registers
mov edi, COLOR_BG_NORMAL
mov esi, _eax
push 4
pop ecx
mov edx, regs_strs
mov ebx, (registers_x_pos+2)*10000h+registers_y_pos+22
call draw_register
mov ebx, (registers_x_pos+2)*10000h+registers_y_pos+32
add esi, _ebx-_eax
call draw_register
mov ebx, (registers_x_pos+2)*10000h+registers_y_pos+42
add esi, _ecx-_ebx
call draw_register
mov ebx, (registers_x_pos+2)*10000h+registers_y_pos+52
add esi, _edx-_ecx
call draw_register
mov ebx, (registers_x_pos+2)*10000h+registers_y_pos+62
add esi, _esi-_edx
call draw_register
mov ebx, (registers_x_pos+2)*10000h+registers_y_pos+72
add esi, _edi-_esi
call draw_register
mov ebx, (registers_x_pos+2)*10000h+registers_y_pos+82
add esi, _ebp-_edi
call draw_register
mov ebx, (registers_x_pos+2)*10000h+registers_y_pos+92
add esi, _esp-_ebp
call draw_register
mov ebx, (registers_x_pos+2)*10000h+registers_y_pos+102
add esi, _eip-_esp
call draw_register
mov ebx, (registers_x_pos+2)*10000h+registers_y_pos+112
mov cl, 7
add esi, _eflags-_eip
call draw_register
mov cl, 4
; MMX registers
push ebp
push 8
mov edx, mmx_strs
mov ebx, (registers_x_pos+2)*10000h+registers_y_pos+142
mov esi, _mm0
align 4
.draw_mmx_regs:
call draw_mmx_register
add ebx, 10
add esi, 16
dec dword [esp]
jnz .draw_mmx_regs
;FPU registers
;int3
nop
mov [esp], byte 8
xor ebp, ebp
mov ebx, (registers_x_pos+2)*10000h+registers_y_pos+232
align 4
.draw_fpu_regs:
call draw_fpu_register_2
add ebx, 10
inc ebp
dec dword [esp]
jnz .draw_fpu_regs
pop eax ;restore stack
pop ebp
mov ecx, COLOR_TXT_INACTIVE
cmp [debuggee_pid], 0
jz @f
cmp [bSuspended], 0
jz @f
mov ecx, COLOR_TXT_NORMAL
@@:
mov edx, aColon
xor esi, esi
inc esi
mcall 4, (registers_x_pos+10)*10000h+registers_y_pos+122
mov edx, flags
@@:
add ebx, 2*6*10000h
call draw_flag
inc edx
cmp dl, flags_bits and 0xFF
jnz @b
ret
;-----------------------------------------------------------------------------
; Draw SSE registers set
draw_sse_registers:
ret
;-----------------------------------------------------------------------------
; Draw AVX registers set
draw_avx_registers:
ret
;-----------------------------------------------------------------------------
; Draw all registers sets
draw_registers:
; draw container rectangle/box with COLOR_BG_NORMAL
mcall 13, (registers_x_pos-1)*10000h+(registers_x_size+2), (registers_y_pos-1)*10000h+(registers_y_size+2), COLOR_BG_NORMAL
call draw_reg_title
.redraw:
cmp [reg_mode], REG_MODE_CPU
jnz @f
call draw_main_registers
ret
@@:
cmp [reg_mode], REG_MODE_SSE
jnz @f
call draw_sse_registers
ret
@@:
call draw_avx_registers
ret
;-----------------------------------------------------------------------------
; Display memory dump
draw_dump:
; draw container rectangle/box in the window
mcall 13, data_x_pos*10000h+data_x_size, dump_y_pos*10000h+dump_y_size, COLOR_BG_NORMAL
.redraw:
; addresses
mov ebx, 80100h
mov edx, data_x_pos*10000h + dump_y_pos
mov ecx, [dumppos]
mov edi, COLOR_BG_NORMAL
mov esi, (COLOR_TXT_INACTIVE or 0x40000000)
cmp [debuggee_pid], 0
jz @f
cmp [bSuspended], 0
jz @f
mov esi, (COLOR_TXT_NORMAL or 0x40000000)
@@:
; draw a number in the window
mcall 47
add ecx, 10h
add edx, 10
cmp dl, dump_y_pos + dump_y_size
jb @b
; hex dump of data
mov ecx, dumpdata
push ecx
xor ebx, ebx
mov edx, (data_x_pos+12*6)*10000h + dump_y_pos
cmp [dumpread], ebx
jz .hexdumpdone1
.hexdumploop1:
push ebx
mov ebx, 20101h
; draw a number in the window
mcall
pop ebx
add edx, 3*6*10000h
inc ecx
inc ebx
test bl, 15
jz .16
test bl, 7
jnz @f
add edx, 2*6*10000h - 10 + 6*(3*10h+2)*10000h
.16:
add edx, 10 - 6*(3*10h+2)*10000h
@@:
cmp ebx, [dumpread]
jb .hexdumploop1
.hexdumpdone1:
mov al, 4
; copy color value from esi to ecx
; to draw text string with 'mcall 4'
mov ecx, esi
xchg ebx, edx
push 2
pop esi
.hexdumploop2:
cmp edx, dump_height*10h
jae .hexdumpdone2
push edx
mov edx, aQuests
; draw text string with color in ecx, copied from esi
mcall
pop edx
add ebx, 3*6*10000h
inc edx
test dl, 15
jz .16x
test dl, 7
jnz .hexdumploop2
add ebx, 2*6*10000h - 10 + 6*(3*10h+2)*10000h
.16x:
add ebx, 10 - 6*(3*10h+2)*10000h
jmp .hexdumploop2
.hexdumpdone2:
dec esi
; colon, minus signs
mov ebx, (data_x_pos+8*6)*10000h + dump_y_pos
mov edx, aColon
@@:
mcall
add ebx, 10
cmp bl, dump_y_pos+dump_height*10
jb @b
mov ebx, (data_x_pos+(12+3*8)*6)*10000h + dump_y_pos
mov edx, aMinus
@@:
mcall
add ebx, 10
cmp bl, dump_y_pos+dump_height*10
jb @b
; ASCII data
mov ebx, (data_x_pos+(12+3*10h+2+2)*6)*10000h + dump_y_pos
pop edx
push dump_height*10h
.asciiloop:
push edx
cmp byte [edx], 20h
jae @f
mov edx, aPoint
@@:
; draw a text string in the window, color in ecx
mcall
pop edx
inc edx
add ebx, 6*10000h
dec dword [esp]
jz .asciidone
test byte [esp], 15
jnz .asciiloop
add ebx, 10 - 6*10h*10000h
jmp .asciiloop
.asciidone:
pop ecx
ret
;-----------------------------------------------------------------------------
; Display disassembled code
draw_disasm:
mov eax, [disasm_start_pos]
mov [disasm_cur_pos], eax
and [disasm_cur_str], 0
.loop:
mov eax, [disasm_cur_pos]
call find_symbol
jc .nosymb
mov ebx, [disasm_cur_str]
imul ebx, 10
push ebx
lea ecx, [ebx+disasm_y_pos-1]
shl ecx, 16
mov cl, 11
; setting up background color for disassembled text
mov edx, COLOR_BG_NORMAL
; draw container rectangle/box with color COLOR_BG_NORMAL (was 0xFFFFFF - white)
mcall 13, data_x_pos*10000h+data_x_size
pop ebx
; copy color value from edx (COLOR_BG_NORMAL)
mov edi, edx
add ebx, (data_x_pos+6*2)*10000h+disasm_y_pos
mov edx, esi
@@:
lodsb
test al, al
jnz @b
mov byte [esi-1], ':'
sub esi, edx
; normal color
; was 0x40000000
mov ecx, (COLOR_TXT_LABEL or 0x40000000)
mov al, 4
; draw a text string in the window with color COLOR_TXT_NORMAL in ecx
mcall
mov byte [esi+edx-1], 0
lea esi, [esi*3]
movzx ecx, bx
shr ebx, 16
lea ebx, [ebx+esi*2]
shl ecx, 16
mov cl, 10
imul ebx, 10001h
sub bx, data_x_pos+data_x_size
neg bx
mov al, 13
; copy color value from edi
mov edx, edi
; draw container rectangle/box for disassembled text, color in edx
mcall
inc [disasm_cur_str]
cmp [disasm_cur_str], disasm_height
jae .loopend
.nosymb:
push [disasm_cur_pos]
call disasm_instr
pop ebp
jc .loopend
mov edx, COLOR_BG_NORMAL
mov esi, COLOR_TXT_NORMAL
mov ebx, data_x_pos*10000h + data_x_size
mov ecx, [disasm_cur_str]
imul ecx, 10*10000h
add ecx, (disasm_y_pos-1)*10000h + 10
mov eax, ebp
pushad
call find_enabled_breakpoint
popad
jnz .nobp
mov edx, COLOR_BG_BREAKPOINT
mov esi, COLOR_TXT_BREAKPOINT
.nobp:
mov eax, [_eip]
cmp eax, ebp
jnz .notcurrent
mov edx, COLOR_BG_SELECTED
mov esi, COLOR_TXT_SELECTED
.notcurrent:
push esi ; Save color value for disassembled text
; draw container rectangle/box for disassembled text
; color in edx
mcall 13
mov edx, [disasm_cur_str]
imul edx, 10
add edx, data_x_pos*10000h + disasm_y_pos
; draw a number in the window, color in esi
mcall 47, 80100h, ebp
lea ebx, [edx+8*6*10000h]
mov ecx, esi ; text color
push 2
pop esi
mov edx, aColon
; draw the colon
mcall 4
push 9
pop edi
lea edx, [ebx+2*6*10000h]
mov ecx, ebp
sub ecx, [disasm_start_pos]
add ecx, disasm_buffer
mov esi, COLOR_TXT_HEX
mov eax, [_eip]
cmp eax, ebp
jnz @f
mov esi, COLOR_TXT_SELECTED
@@:
.drawhex:
; draw a number in the window, color in esi
mcall 47, 20101h
add edx, 6*3*10000h
inc ecx
inc ebp
cmp ebp, [disasm_cur_pos]
jae .hexdone
dec edi
jnz .drawhex
push esi
mov esi, [disasm_cur_pos]
dec esi
cmp esi, ebp
pop esi
jbe .drawhex
lea ebx, [edx-6*10000h]
; copy color value from esi
mov ecx, esi
push 3
pop esi
mov edx, aDots
; draw a text string in the window, color in ecx
mcall 4
.hexdone:
pop esi
xor eax, eax
mov edi, disasm_string
mov edx, edi
or ecx, -1
repnz scasb
not ecx
dec ecx
xchg ecx, esi
mov ebx, [disasm_cur_str]
imul ebx, 10
add ebx, (data_x_pos+6*40)*10000h+disasm_y_pos
; draw a text string in the window, color in ecx
mcall 4
inc [disasm_cur_str]
cmp [disasm_cur_str], disasm_height
jb .loop
.loopend:
mov ecx, disasm_height
sub ecx, [disasm_cur_str]
jz @f
imul ecx, 10
inc ecx
mov eax, disasm_y_pos + disasm_y_size
sub eax, ecx
shl eax, 16
add ecx, eax
; Draw filled rectangle
mcall 13, data_x_pos*10000h+data_x_size, , COLOR_BG_NORMAL
@@:
ret
;-----------------------------------------------------------------------------
; TODO: cleanup of this function, make some global labels local
update_disasm_eip:
; test if instruction at eip is showed
mov ecx, disasm_height
mov eax, [disasm_start_pos]
mov [disasm_cur_pos], eax
.l:
mov eax, [disasm_cur_pos]
call find_symbol
jc @f
dec ecx
jz .m
@@:
cmp [_eip], eax
jz draw_disasm
push ecx
call disasm_instr
pop ecx
jc .m
loop .l
.m:
update_disasm_eip_force:
mov eax, [_eip]
mov [disasm_start_pos], eax
update_disasm:
cmp [debuggee_pid], 0
jz .no
mcall 69, 6, [debuggee_pid], 256, [disasm_start_pos], disasm_buffer
cmp eax, -1
jnz @f
mov esi, read_mem_err
call put_message
.no:
xor eax, eax
@@:
mov [disasm_buf_size], eax
call restore_from_breaks
jmp draw_disasm
;-----------------------------------------------------------------------------
; Draw main window
draw_window:
; start window redraw
mcall 12, 1
; define window
mcall 0, wnd_x_size, wnd_y_size, (COLOR_BG_NORMAL or 0x54000000), , caption_str
; clear unused areas
; get window skin height
mcall 48, 4
cmp eax, title_y_pos
jb @f
push registers_y_pos
pop eax
@@:
push registers_y_pos
pop ecx
push eax
sub ecx, eax
shl eax, 16
add ecx, eax
mov ebx, 5*10000h + (wnd_x_size-9)
mov edx, COLOR_BG_NORMAL
; draw container rectangle/box for registers information region
mcall 13
mov ecx, (dump_y_pos+dump_y_size)*10000h + (disasm_y_pos-dump_y_pos-dump_y_size)
; draw container rectangle/box for dump memory region
mcall
mov ecx, (disasm_y_pos-1+disasm_y_size)*10000h + (messages_y_pos-disasm_y_pos+1-disasm_y_size)
; draw container rectangle/box for disassembled code region
mcall
mov ecx, (messages_y_pos+messages_y_size)*10000h + (wnd_y_size-messages_y_pos-messages_y_size-4)
; draw container rectangle/box for messages window region
mcall
mov ebx, 5*10000h + (data_x_pos-5)
pop ecx
imul ecx, 10001h
sub cx, wnd_y_size-4
neg cx
; draw container rectangle/box
mcall
mov ebx, (data_x_pos+data_x_size)*10000h + (wnd_x_size-data_x_pos-data_x_size-4)
; draw container rectangle/box
mcall
mov ebx, 5*10000h + title_x_pos - 5
mov ecx, (title_y_pos)*10000h + (title_y_size)
; draw container rectangle/box for dump memory region title
mcall
; messages frame
mov ebx, (messages_x_pos-2)*10000h + (messages_x_pos+messages_x_size+2)
push ebx
mov ecx, (messages_y_pos-2)*10001h
mov edx, COLOR_LINE
mcall 38
mov ecx, (messages_y_pos+messages_y_size+2)*10001h
mcall
mov ebx, (messages_x_pos-2)*10001h
push ebx
mov ecx, (messages_y_pos-2)*10000h + (messages_y_pos+messages_y_size+2)
mcall
mov ebx, (messages_x_pos+messages_x_size+2)*10001h
push ebx
mcall
; command line frame
mov ecx, (cmdline_y_pos-2)*10000h + (cmdline_y_pos+cmdline_y_size+2)
pop ebx
mcall
pop ebx
mcall
pop ebx
mov ecx, (cmdline_y_pos+cmdline_y_size+2)*10001h
mcall
mov ecx, (cmdline_y_pos-2)*10001h
mcall
; registers frame
DrawRectangle (registers_x_pos-2), (registers_y_pos-2), (registers_x_size+3), (registers_y_size+3), COLOR_LINE
; draw container rectangle/box for registers information window region
; messages
call draw_messages
; command line & cursor
call draw_cmdline
call draw_cursor
; title & registers & dump & disasm
mov ebx, (data_x_pos-2)*10001h
mov ecx, (title_y_pos+5)*10000h + (messages_y_pos-2)
mov edx, COLOR_LINE
mcall 38
mov ebx, (data_x_pos+data_x_size+2)*10001h
mcall
mov ebx, (data_x_pos-2)*10000h + (data_x_pos+data_x_size+2)
mov ecx, (disasm_y_pos-4)*10001h
mcall
; redraw whole window again
call redraw_title
call draw_registers
call draw_dump
call draw_disasm
; end of window redraw
mcall 12, 2
ret
; vim: ft=fasm tabstop=4