Subversion Repositories Kolibri OS

Rev

Rev 7683 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; GUI ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  4.  
  5. ;-----------------------------------------------------------------------------
  6. ;                             Color scheme
  7.  
  8. BLACK_ON_WHITE  = 0
  9. MOVIEOS         = 1
  10. WHITE_ON_BLACK  = 2
  11.  
  12. ;-----------------------------------------------------------------------------
  13. ;                                Font
  14.  
  15. FONT            equ 1           ; 0 to 3
  16. FONT_MULTIPLIER equ 1           ; 1 to 8
  17.  
  18. ;-----------------------------------------------------------------------------
  19. ;                       GUI elements size and position
  20.  
  21. TEXT_Y_CLEARANCE        = 1                                                     ; in pixels
  22.  
  23. DATA_WIDTH              = 80                                                    ; in characters
  24. DATA_X_POS              = 12                                                    ; in pixels
  25.  
  26. TITLE_X_POS             = 30                                                    ; in pixels
  27. TITLE_Y_POS             = 8                                                     ; in pixels
  28.  
  29. DUMP_HEIGHT             = 6                                                     ; in text lines
  30. MIN_DISASM_HEIGHT       = 18                                                    ; in text lines
  31. MSG_HEIGHT              = 14                                                    ; in text lines
  32.  
  33. ;-----------------------------------------------------------------------------
  34.  
  35. if (FONT eq 0)
  36.         FONT_X_SIZE     = 6*FONT_MULTIPLIER
  37. else
  38.         FONT_X_SIZE     = 8*FONT_MULTIPLIER
  39. end if
  40.  
  41. if (FONT eq 0)
  42.         FONT_Y_SIZE     = 9*FONT_MULTIPLIER
  43. else
  44.         FONT_Y_SIZE     = 16*FONT_MULTIPLIER
  45. end if
  46.  
  47. TITLE_Y_SIZE            = (FONT_Y_SIZE + TEXT_Y_CLEARANCE)
  48. DUMP_Y_POS              = (TITLE_Y_POS + TITLE_Y_SIZE)
  49. DUMP_Y_SIZE             = (DUMP_HEIGHT*(FONT_Y_SIZE + TEXT_Y_CLEARANCE))
  50. DISASM_Y_POS            = (DUMP_Y_POS + DUMP_Y_SIZE + 4)
  51.  
  52. MSG_WIDTH               = DATA_WIDTH
  53. MSG_X_POS               = DATA_X_POS
  54. MSG_X_SIZE              = MSG_WIDTH*FONT_X_SIZE
  55. MSG_Y_SIZE              = MSG_HEIGHT*(FONT_Y_SIZE + TEXT_Y_CLEARANCE)
  56.  
  57. CMD_WIDTH               = DATA_WIDTH
  58. CMD_X_POS               = DATA_X_POS
  59. CMD_Y_SIZE              = (FONT_Y_SIZE+TEXT_Y_CLEARANCE)
  60.  
  61. REGISTERS_Y_POS         = DUMP_Y_POS
  62. REGISTERS_X_SIZE        = (22+2)*(FONT_X_SIZE)                                  ; 22 characters + 2 spacing
  63.  
  64. wnd_x_size              = (DATA_X_POS + MSG_X_SIZE + DATA_X_POS + REGISTERS_X_SIZE + 3) + 10
  65. wnd_y_size              = (((DISASM_Y_POS + (MIN_DISASM_HEIGHT*(FONT_Y_SIZE + TEXT_Y_CLEARANCE)) + 4) + MSG_Y_SIZE + 4) + CMD_Y_SIZE + DATA_X_POS)
  66.  
  67. ;-----------------------------------------------------------------------------
  68.  
  69. ;                         format - 0xRRGGBB
  70. if COLOR_THEME eq MOVIEOS
  71.  
  72.         COLOR_BG_NORMAL           = 0x1d272f
  73.         COLOR_BG_BREAKPOINT       = 0x0000aa
  74.         COLOR_BG_SELECTED         = 0xec9300
  75.         COLOR_LINE                = 0x00b9a0
  76.         COLOR_TXT_NORMAL          = 0xffffff
  77.         COLOR_TXT_INACTIVE        = 0x8f7948
  78.         COLOR_TXT_CHANGED         = 0xec9300
  79.         COLOR_TXT_LABEL           = 0x22b14c
  80.         COLOR_TXT_SELECTED        = 0x1d272f
  81.         COLOR_TXT_HEX             = 0xec9300
  82.         COLOR_TXT_BREAKPOINT      = 0xec9300
  83.  
  84. else if COLOR_THEME eq WHITE_ON_BLACK
  85.  
  86.         COLOR_BG_NORMAL           = 0x101010 ; dark grey
  87.         COLOR_BG_BREAKPOINT       = 0xFF0000 ; red
  88.         COLOR_BG_SELECTED         = 0x0000FF ; blue
  89.         COLOR_LINE                = 0xFFFFFF ; white
  90.         COLOR_TXT_NORMAL          = 0xFFFFFF ; white
  91.         COLOR_TXT_INACTIVE        = 0x808080 ; grey
  92.         COLOR_TXT_CHANGED         = 0x00AA00 ; green
  93.         COLOR_TXT_LABEL           = COLOR_TXT_NORMAL
  94.         COLOR_TXT_SELECTED        = 0xFFFFFF ; white
  95.         COLOR_TXT_HEX             = COLOR_TXT_NORMAL
  96.         COLOR_TXT_BREAKPOINT      = COLOR_TXT_NORMAL
  97.  
  98. else  ; BLACK ON WHITE
  99.  
  100.         COLOR_BG_NORMAL           = 0xffffff ; white
  101.         COLOR_BG_BREAKPOINT       = 0xFF0000 ; red
  102.         COLOR_BG_SELECTED         = 0x0000FF ; blue
  103.         COLOR_LINE                = 0x000000 ; black
  104.         COLOR_TXT_NORMAL          = 0x000000 ; black
  105.         COLOR_TXT_INACTIVE        = 0x808080 ; grey
  106.         COLOR_TXT_CHANGED         = 0x00AA00 ; green
  107.         COLOR_TXT_LABEL           = COLOR_TXT_NORMAL
  108.         COLOR_TXT_SELECTED        = 0xFFFFFF ; white
  109.         COLOR_TXT_HEX             = COLOR_TXT_NORMAL
  110.         COLOR_TXT_BREAKPOINT      = COLOR_TXT_NORMAL
  111.  
  112. end if
  113.  
  114. struc fpcvt
  115. {
  116.   .str_buf  rb 32
  117.   .cvt_buf  rb 16
  118.   .bcd_man  rb 10
  119.   .bcd_exp  rb 10
  120.   .exp      rd 1
  121.   .digits   rq 1
  122.   .sizeof:
  123. }
  124.  
  125.  
  126.  
  127. ;-----------------------------------------------------------------------------
  128. ;                          Entry point
  129.  
  130. ; TODO: split all gui part in independent function, move entry point into mtdbg.asm
  131.  
  132. start:
  133.         ; initialize process heap
  134.         mcall   68, 11
  135.  
  136.         call    init_cmd_hist_buffer
  137.  
  138.         push    eax
  139.         fstcw   word [esp]
  140.         pop     eax
  141.         and     ax, not (3 shl 10)
  142.         or      ax, 1 shl 10    ; set round-to-minus infinity mode
  143.         push    eax
  144.         fldcw   word [esp]
  145.         pop     eax
  146.  
  147.         mov     edi, messages
  148.         mov     ecx, MSG_WIDTH*MSG_HEIGHT
  149.         mov     al, ' '
  150.         rep stosb
  151.         xor     eax, eax
  152.         mov     [messages_pos], eax
  153.         mov     [cmdline_len], eax
  154.         mov     [cmdline_pos], eax
  155.         mov     edi, needzerostart
  156.         mov     ecx, (needzeroend-needzerostart+3)/4
  157.         rep stosd
  158.         mov     esi, begin_str
  159.         call    put_message_nodraw
  160.         ; set event mask - default events and debugging events
  161.         mcall   40, EVM_REDRAW or EVM_KEY or EVM_BUTTON or EVM_DEBUG
  162.         ; set debug messages buffer
  163.         mov     ecx, dbgbufsize
  164.         mov     dword [ecx], 256
  165.         xor     ebx, ebx
  166.         mov     [ecx+4], ebx
  167.         mov     al, 69
  168.         mcall
  169.         mov     esi, i_param
  170.         call    get_arg.skip_spaces
  171.         test    al, al
  172.         jz      dodraw
  173.         push    esi
  174.         call    draw_window
  175.         pop     esi
  176.         call    OnLoadInit
  177.         jmp     waitevent
  178.  
  179. dodraw:
  180.         call    draw_window
  181.  
  182. waitevent:
  183.         mcall   10
  184.         cmp     al, 9
  185.         jz      debugmsg
  186.         dec     eax
  187.         jz      dodraw
  188.         dec     eax
  189.         jz      keypressed
  190.         dec     eax
  191.         jnz     waitevent
  192. ;button pressed
  193.         mcall   17
  194.         test    al, al
  195.         jnz     waitevent
  196.         movzx   eax, ah
  197.         jmp     dword [.jmp_table+eax*4]
  198.  
  199. .close:
  200.         mcall -1
  201. .mmx:
  202.         movzx   edx, [fpu_mode]
  203.         xor     dl, 1
  204.         mov     [fpu_mode], dl
  205.         push    edx
  206.         jnz     .fpu
  207.         call    draw_mmx_regs
  208.         jmp     .draw_label
  209. .fpu:
  210.         call    draw_fpu_regs
  211. .draw_label:
  212.         pop     edx
  213.         mov     edx, [btn2_tab+edx*4]
  214.         mov     edi, COLOR_BG_NORMAL
  215.         mov     ecx, ((FONT) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_NORMAL or 0x40000000)
  216.         mov     esi, 7
  217.         mov     ebx, [registers_x_pos_dd]
  218.         add     ebx, 4*10000h+REGISTERS_Y_POS
  219.         mcall   4
  220.         jmp     waitevent
  221.  
  222. align 4
  223. .jmp_table:
  224.         dd waitevent
  225.         dd .close
  226.         dd .mmx
  227.  
  228.  
  229. ; TODO: split in more independent function
  230. keypressed:
  231.         mov     al, 2
  232.         mcall
  233.         shr     eax, 8
  234.         cmp     al, 8
  235.         jz      .backspace
  236.         cmp     al, 0xB0
  237.         jz      .left
  238.         cmp     al, 0xB3
  239.         jz      .right
  240.         cmp     al, 0x0D
  241.         jz      .enter
  242.         cmp     al, 0xB6
  243.         jz      .del
  244.         cmp     al, 0xB4
  245.         jz      .home
  246.         cmp     al, 0xB5
  247.         jz      .end
  248.         cmp     al, 0xB1
  249.         jz      .down
  250.         cmp     al, 0xB2
  251.         jz      .up
  252.         cmp     ah, 0x41
  253.         jz      F7
  254.         cmp     ah, 0x42
  255.         jz      F8
  256.         mov     [cmd_hist_buffer.tmp_line_flag], 0
  257.         cmp     [cmdline_len], CMD_WIDTH
  258.         jae     waitevent
  259.         push    eax
  260.         call    clear_cmdline_end
  261.         pop     eax
  262.         mov     edi, cmdline
  263.         mov     ecx, [cmdline_len]
  264.         add     edi, ecx
  265.         lea     esi, [edi-1]
  266.         sub     ecx, [cmdline_pos]
  267.         std
  268.         rep movsb
  269.         cld
  270.         stosb
  271.         inc     [cmdline_len]
  272.         call    draw_cmdline_end
  273.         inc     [cmdline_pos]
  274.         call    draw_cursor
  275.  
  276.         jmp     waitevent
  277.  
  278.     .backspace:
  279.         mov     [cmd_hist_buffer.tmp_line_flag], 0
  280.         cmp     [cmdline_pos], 0
  281.         jz      waitevent
  282.         dec     [cmdline_pos]
  283.  
  284.     .delchar:
  285.         mov     [cmd_hist_buffer.tmp_line_flag], 0
  286.         call    clear_cmdline_end
  287.         mov     edi, [cmdline_pos]
  288.         dec     [cmdline_len]
  289.         mov     ecx, [cmdline_len]
  290.         sub     ecx, edi
  291.         add     edi, cmdline
  292.         lea     esi, [edi+1]
  293.         rep movsb
  294.         call    draw_cmdline_end
  295.         call    draw_cursor
  296.         jmp     waitevent
  297.  
  298.     .del:
  299.         mov     eax, [cmdline_pos]
  300.         cmp     eax, [cmdline_len]
  301.         jae     waitevent
  302.         jmp     .delchar
  303.  
  304.     .left:
  305.         cmp     [cmdline_pos], 0
  306.         jz      waitevent
  307.         call    hide_cursor
  308.         dec     [cmdline_pos]
  309.         call    draw_cursor
  310.         jmp     waitevent
  311.  
  312.     .right:
  313.         mov     eax, [cmdline_pos]
  314.         cmp     eax, [cmdline_len]
  315.         jae     waitevent
  316.         call    hide_cursor
  317.         inc     [cmdline_pos]
  318.         call    draw_cursor
  319.         jmp     waitevent
  320.  
  321.     .home:
  322.         call    hide_cursor
  323.         and     [cmdline_pos], 0
  324.         call    draw_cursor
  325.         jmp     waitevent
  326.  
  327.     .end:
  328.         call    hide_cursor
  329.         mov     eax, [cmdline_len]
  330.         mov     [cmdline_pos], eax
  331.         call    draw_cursor
  332.  
  333.         .up:
  334.                 xor     edx, edx
  335.                 jmp     .hist
  336.  
  337.         .down:
  338.                 xor     edx, edx
  339.                 inc     edx
  340.  
  341.         .hist:
  342.                 cmp     [cmd_hist_buffer.tmp_line_flag], 1
  343.                 je      @f
  344.                 mov     eax, cmdline
  345.                 mov     ecx, [cmdline_len]
  346.                 mov     byte [eax + ecx], 0
  347.                 call    add_cmd_hist_tmp_line
  348.  
  349.         @@:
  350.                 test    edx, edx
  351.                 jnz     .hist.next
  352.                 cmp     [cmd_hist_buffer.n_flag], 0
  353.                 jne     @f
  354.                 call    get_cmd_hist_line
  355.                 inc     [cmd_hist_buffer.n_flag]
  356.                 jmp     .hist.cp_line
  357.  
  358.         @@:
  359.                 call    prev_cmd_hist_line
  360.                 jc      waitevent
  361.                 call    get_cmd_hist_line
  362.                 inc     [cmd_hist_buffer.n_flag]
  363.                 jmp     .hist.cp_line
  364.  
  365.         .hist.next:
  366.                 cmp     [cmd_hist_buffer.n_flag], 0
  367.                 je      waitevent
  368.  
  369.                 call    next_cmd_hist_line
  370.                 call    get_cmd_hist_line
  371.                 jnc     .hist.cp_line
  372.                 call    get_cmd_hist_tmp_line
  373.                 mov     [cmd_hist_buffer.tmp_line_flag], 0
  374.                 mov     [cmd_hist_buffer.n_flag], 0
  375.  
  376.         .hist.cp_line:
  377.  
  378.                 mov     esi, eax
  379.                 mov     edi, cmdline
  380.                 xor     ecx, ecx
  381.  
  382.         @@:
  383.                 inc     ecx
  384.                 lodsb
  385.                 stosb
  386.                 test    al, al
  387.                 jnz     @b
  388.  
  389.                 dec     ecx
  390.                 mov     [cmdline_pos], 0
  391.                 call    clear_cmdline_end
  392.                 mov     [cmdline_len], ecx
  393.                 mov     [cmdline_pos], ecx
  394.                 call    draw_cmdline
  395.                 call    draw_cursor
  396.  
  397.                 jmp     waitevent
  398.  
  399.         ; We also trying to execute previous command, if empty command_line
  400.     .enter:
  401.         mov     ecx, [cmdline_len]
  402.         test    ecx, ecx
  403.         jnz     .exec_cur
  404.         mov     cl, byte [cmdline_prev]
  405.         cmp     cl, 0
  406.         jz      waitevent
  407.  
  408.     .exec_prev:
  409.         mov     esi, cmdline_prev
  410.         jmp     .exec
  411.  
  412.     .exec_cur:
  413.         mov     esi, cmdline
  414.  
  415.     .exec:
  416.         mov     byte [esi+ecx], 0
  417.  
  418.         mov     eax, esi
  419.         call    add_cmd_hist_line
  420.         mov     [cmd_hist_buffer.n_flag], 0
  421.  
  422.         and     [cmdline_pos], 0
  423.         push    esi
  424.         call    clear_cmdline_end
  425.         call    draw_cursor
  426.         pop     esi
  427.         and     [cmdline_len], 0
  428.         ; skip leading spaces
  429.         call    get_arg.skip_spaces
  430.         cmp     al, 0
  431.         jz      waitevent
  432.         ; now esi points to command
  433.         push    esi
  434.         mov     esi, prompt
  435.         call    put_message_nodraw
  436.         pop     esi
  437.         push    esi
  438.         call    put_message_nodraw
  439.  
  440. ; TODO: add meaningful name
  441. z1:
  442.         mov     esi, newline
  443.         call    put_message
  444.         pop     esi
  445.         push    esi
  446.         call    get_arg
  447.         mov     [curarg], esi
  448.         pop     edi
  449.         mov     esi, commands
  450.         call    find_cmd
  451.         mov     eax, aUnknownCommand
  452.         jc      .x11
  453.  
  454.         ; check command requirements
  455.         ; flags field:
  456.         ; &1: command may be called without parameters
  457.         ; &2: command may be called with parameters
  458.         ; &4: command may be called without loaded program
  459.         ; &8: command may be called with loaded program
  460.         mov     eax, [esi+8]
  461.         mov     ecx, [curarg]
  462.         cmp     byte [ecx], 0
  463.         jz      .noargs
  464.         test    byte [esi+16], 2
  465.         jz      .x11
  466.         jmp     @f
  467.  
  468.     .noargs:
  469.         test    byte [esi+16], 1
  470.         jz      .x11
  471.  
  472.     @@:
  473.         cmp     [debuggee_pid], 0
  474.         jz      .nodebuggee
  475.         mov     eax, aAlreadyLoaded
  476.         test    byte [esi+16], 8
  477.         jz      .x11
  478.         jmp     .x9
  479.  
  480.     .nodebuggee:
  481.         mov     eax, need_debuggee
  482.         test    byte [esi+16], 4
  483.         jnz     .x9
  484.  
  485.     .x11:
  486.         xchg    esi, eax
  487.         call    put_message
  488.  
  489.         ; store cmdline for repeating
  490.     .x10:
  491.         mov     esi, cmdline
  492.         mov     ecx, [cmdline_len]
  493.  
  494.     @@:
  495.         cmp     ecx, 0
  496.         jle     .we
  497.         mov     al, [esi + ecx]
  498.         mov     [cmdline_prev + ecx], al
  499.         dec     ecx
  500.         jmp     @b
  501.  
  502.     .we:
  503.         mov     [cmdline_len], 0
  504.         jmp     waitevent
  505.  
  506.     .x9:
  507.         call    dword [esi+4]
  508.         jmp     .x10
  509.  
  510. ;-----------------------------------------------------------------------------
  511. ;                            Cmdline handling
  512.  
  513. clear_cmdline_end:
  514.         pusha
  515.  
  516.         mov     ebx, [cmdline_pos]
  517.         mov     ecx, [cmdline_len]
  518.         sub     ecx, ebx
  519.         imul    ebx, FONT_X_SIZE
  520.         imul    ecx, FONT_X_SIZE
  521.         inc     ecx
  522.         add     ebx, CMD_X_POS
  523.         shl     ebx, 16
  524.         or      ebx, ecx
  525.         mov     ecx, [cmdline_y_pos_dd]
  526.         mov     cx, CMD_Y_SIZE
  527.         mov     edx, COLOR_BG_NORMAL
  528.         ; draw container rectangle/box for cmdline
  529.         mcall   13
  530.  
  531.         popa
  532.         ret
  533.  
  534. draw_cmdline:
  535.         xor     ebx, ebx
  536.         jmp     @f
  537.  
  538. ; TODO: make it local
  539. draw_cmdline_end:
  540.         mov     ebx, [cmdline_pos]
  541.  
  542.     @@:
  543.         mov     esi, [cmdline_len]
  544.         sub     esi, ebx
  545.  
  546.         mov     ecx, (FONT) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_NORMAL
  547.         lea     edx, [cmdline+ebx]
  548.         imul    ebx, FONT_X_SIZE
  549.         add     ebx, CMD_X_POS
  550.         shl     ebx, 16
  551.         mov     bx, word[cmdline_y_pos_dd+4]
  552.         inc     bx
  553.         ; draw a text string in the window
  554.         mcall   4
  555.         ret
  556.  
  557. ;-----------------------------------------------------------------------------
  558. ;                        Working with messages
  559. ; in: esi->ASCIIZ message
  560. put_message_nodraw:
  561.         mov     edx, [messages_pos]
  562.  
  563.     .m:
  564.         lea     edi, [messages+edx]
  565.  
  566.     .l:
  567.         lodsb
  568.         cmp     al, 0
  569.         jz      .done
  570.         call    test_scroll
  571.         cmp     al, 10
  572.         jz      .newline
  573.         cmp     al, '%'
  574.         jnz     @f
  575.         cmp     dword [esp], z1
  576.         jnz     .format
  577.  
  578.     @@:
  579.         stosb
  580.         inc     edx
  581.         jmp     .l
  582.  
  583.     .newline:
  584.         push    edx
  585.         mov     ecx, MSG_WIDTH
  586.         xor     eax, eax
  587.         xchg    eax, edx
  588.         div     ecx
  589.         xchg    eax, edx
  590.         pop     edx
  591.         test    eax, eax
  592.         jz      .m
  593.         sub     edx, eax
  594.         add     edx, ecx
  595.         jmp     .m
  596.  
  597.     .done:
  598.         mov     [messages_pos], edx
  599.         ret
  600.  
  601.         ; at this moment all format specs must be %<digit>X
  602.     .format:
  603.         lodsb   ; get <digit>
  604.         sub     al, '0'
  605.         movzx   ecx, al
  606.         lodsb
  607.         pop     eax
  608.         pop     ebp
  609.         push    eax
  610.         ; write number in ebp with ecx digits
  611.         dec     ecx
  612.         shl     ecx, 2
  613.  
  614.     .writenibble:
  615.         push    ecx
  616.         call    test_scroll
  617.         pop     ecx
  618.         mov     eax, ebp
  619.         shr     eax, cl
  620.         and     al, 0xF
  621.         cmp     al, 10
  622.         sbb     al, 69h
  623.         das
  624.         stosb
  625.         inc     edx
  626.         sub     ecx, 4
  627.         jns     .writenibble
  628.         jmp     .l
  629.  
  630. test_scroll:
  631.         cmp     edx, MSG_WIDTH*MSG_HEIGHT
  632.         jnz     .ret
  633.         push    esi
  634.         mov     edi, messages
  635.         lea     esi, [edi+MSG_WIDTH]
  636.         mov     ecx, (MSG_HEIGHT-1)*MSG_WIDTH/4
  637.         rep movsd
  638.         push    eax
  639.         mov     al, ' '
  640.         push    edi
  641.         push    MSG_WIDTH
  642.         pop     ecx
  643.         sub     edx, ecx
  644.         rep stosb
  645.         pop     edi
  646.         pop     eax
  647.         pop     esi
  648.  
  649.     .ret:
  650.         ret
  651.  
  652. ;-----------------------------------------------------------------------------
  653.  
  654. put_message:
  655.         call    put_message_nodraw
  656.  
  657. draw_messages:
  658.         ; draw container rectangle/box
  659.         mov     ebx, MSG_X_POS shl 16
  660.         add     ebx, [messages_x_size_dd+4]
  661.         mov     ecx, [messages_y_pos_dd]
  662.         mov     cx, MSG_Y_SIZE
  663.         mcall   13, , , COLOR_BG_NORMAL
  664.         mov     edx, messages
  665.         push    MSG_WIDTH
  666.         pop     esi
  667.         mov     ecx, (FONT) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_NORMAL
  668.         mov     ebx, MSG_X_POS*10000h
  669.         mov     bx, word[messages_y_pos_dd+4]
  670.  
  671.     @@:
  672.         ; display text string in the window
  673.         mcall   4
  674.         add     edx, esi
  675.         add     ebx, FONT_Y_SIZE+TEXT_Y_CLEARANCE
  676.         cmp     edx, messages+MSG_WIDTH*MSG_HEIGHT
  677.         jb      @b
  678.         ret
  679.  
  680. ;-----------------------------------------------------------------------------
  681. ;                     Show/hide cursor in command line
  682.  
  683. ; TODO: make it cursor.draw and cursor.hide ???
  684. draw_cursor:
  685.         pusha
  686.  
  687.         mov     ecx, [cmdline_y_pos_dd+2]
  688.         add     cx, CMD_Y_SIZE-1
  689.         mov     ebx, [cmdline_pos]
  690.         imul    ebx, FONT_X_SIZE
  691.         add     ebx, CMD_X_POS
  692.         mov     edx, ebx
  693.         shl     ebx, 16
  694.         or      ebx, edx
  695.         mov     edx, (FONT) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_NORMAL
  696.         ; draw line
  697.         mcall   38
  698.  
  699.         popa
  700.         ret
  701.  
  702. hide_cursor:
  703.         mov     ebx, [cmdline_pos]
  704.         imul    ebx, FONT_X_SIZE
  705.         add     ebx, CMD_X_POS
  706.         shl     ebx, 16
  707.         inc     ebx
  708.         mov     ecx, [cmdline_y_pos_dd]
  709.         mov     cx, CMD_Y_SIZE
  710.         mov     edx, COLOR_BG_NORMAL
  711.         ; draw container rectangle/box
  712.         mcall   13
  713.         mov     ebx, [cmdline_pos]
  714.         cmp     ebx, [cmdline_len]
  715.         jae     .ret
  716.         ; setting up text color scheme and attributes
  717.         mov     ecx, (FONT) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_NORMAL
  718.         lea     edx, [cmdline+ebx]
  719.         imul    ebx, FONT_X_SIZE
  720.         add     ebx, CMD_X_POS
  721.         shl     ebx, 16
  722.         mov     bx, word[cmdline_y_pos_dd+4]
  723.         inc     bx
  724.         push    1
  725.         pop     esi
  726.         ; draw text string in the window
  727.         mcall   4
  728.  
  729.     .ret:
  730.         ret
  731.  
  732. ;-----------------------------------------------------------------------------
  733. ;                       Draw program window title
  734.  
  735. ; FIXME: something wrong here
  736. redraw_title:
  737.         ; draw container rectangle/box
  738.         mov     ebx, [data_x_size_dd+4]
  739.         add     ebx, TITLE_X_POS*10000h+DATA_X_POS-TITLE_X_POS
  740.         mcall   13, , TITLE_Y_POS*10000h+TITLE_Y_SIZE, COLOR_BG_NORMAL
  741.  
  742. draw_title:
  743.         mcall   38, (DATA_X_POS-2)*10000h+TITLE_X_POS-5, (TITLE_Y_POS+(FONT_Y_SIZE/2))*10001h, COLOR_LINE
  744.         push    NoPrgLoaded_len
  745.         pop     esi
  746.         cmp     [debuggee_pid], 0
  747.         jz      @f
  748.         mov     esi, [prgname_len]
  749.  
  750.     @@:
  751.         imul    ebx, esi, FONT_X_SIZE
  752.         add     ebx, TITLE_X_POS+4
  753.         shl     ebx, 16
  754.         mov     bx, DATA_X_POS-10-5-FONT_X_SIZE*7
  755.         add     bx, word[data_x_size_dd+4]
  756.         cmp     [bSuspended], 0
  757.         jz      @f
  758.         add     ebx, FONT_X_SIZE
  759.  
  760.     @@:
  761.         ; draw line with COLOR_LINE (in edx)
  762.         mcall
  763.         mov     ebx, [data_x_size_dd+2]
  764.         add     ebx, (DATA_X_POS-10+4)*0x10000 + DATA_X_POS+2
  765.         ; draw line with COLOR_LINE (in edx)
  766.         mcall
  767.         mov     al, 4
  768.         mov     ebx, TITLE_X_POS*10000h+TITLE_Y_POS
  769.         ; setting up text color scheme and attributes
  770.         mov     ecx, (FONT) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_NORMAL
  771.         mov     edx, NoPrgLoaded_str
  772.         cmp     [debuggee_pid], 0
  773.         jz      @f
  774.         mov     edx, [prgname_ptr]
  775.  
  776.     @@:
  777.         ; draw text string in the window
  778.         mcall
  779.         cmp     [debuggee_pid], 0
  780.         jz      .nodebuggee
  781.         mov     ebx, [data_x_size_dd]
  782.         add     ebx, (DATA_X_POS-10-FONT_X_SIZE*7)*10000h + TITLE_Y_POS
  783.         mov     edx, aRunning
  784.         push    7
  785.         pop     esi
  786.         cmp     [bSuspended], 0
  787.         jz      @f
  788.         add     ebx, FONT_X_SIZE*10000h
  789.         mov     edx, aPaused
  790.         dec     esi
  791.  
  792.     @@:
  793.         ; draw line with COLOR_LINE (in edx) in one case
  794.         ; and draw text string with color (FONT) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_NORMAL (in ecx) in another
  795.         mcall
  796.         ret
  797.  
  798.     .nodebuggee:
  799.         mov     al, 38
  800.         mov     ebx, [data_x_size_dd+2]
  801.         add     ebx, (DATA_X_POS-10-FONT_X_SIZE*7-5)*0x10000 + DATA_X_POS+2
  802.         mov     ecx, (TITLE_Y_POS+(FONT_Y_SIZE/2))*10001h
  803.         mov     edx, COLOR_LINE
  804.         jmp     @b
  805.  
  806. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  807. ;;;;;;;;;;;;;;;;;;; REGISTERS PANEL ;;;;;;;;;;;;;;;;;;;;;;;;;;
  808. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  809.  
  810. ;-----------------------------------------------------------------------------
  811. ;                      Display common register content
  812.  
  813. ; TODO: add format support (e.g. numerical value, or address offset/pointer)
  814.  
  815. ; in: esi->value, edx->string, ecx = string length, ebx = coord
  816. draw_register:
  817.         push    esi
  818.         push    edx
  819.         push    ecx
  820.         push    ebp
  821.  
  822.         mov     ebp, ecx
  823.  
  824.         mov     eax, [esi]
  825.  
  826.         mov     ecx, ((FONT) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_INACTIVE or 0x40000000)
  827.         cmp     [debuggee_pid], 0
  828.         jz      .cd
  829.         cmp     [bSuspended], 0
  830.         jz      .cd
  831.  
  832.         mov     ecx, ((FONT) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_NORMAL or 0x40000000)
  833.         cmp     eax, dword [esi+oldcontext-context]
  834.         je      .cd
  835.         mov     ecx, ((FONT) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_CHANGED or 0x40000000)
  836. .cd:
  837.         push    eax                       ;store reg value
  838.  
  839.         mov     esi, ebp
  840.         ; draw a text string in the window
  841.         mcall   4
  842.  
  843.         imul    esi, FONT_X_SIZE*10000h
  844.         lea     edx, [ebx+esi]
  845.         mov     esi, ecx
  846.         pop     ecx
  847.  
  848.         ; draw a number in the window
  849.         rol     ecx, 16
  850.         mcall   47, 0x00040100
  851.  
  852.         shr     ecx, 16
  853.         add     edx, (4*FONT_X_SIZE+3) shl 16
  854.         mcall   47
  855.  
  856.         pop     ebp
  857.         pop     ecx
  858.         pop     edx
  859.         pop     esi
  860.         add     edx, ecx
  861.         ret
  862.  
  863.  
  864. ; in: edi=cvt buffer, st0 = value
  865.  
  866. ;align 4
  867. ;fp2str:
  868.  
  869.  
  870.  
  871. ;-----------------------------------------------------------------------------
  872. ;                  Display FPU register (ST0 - ST7) content
  873. ;
  874. ; in: ebp->index, ebx = coord
  875.  
  876. draw_fpu_register_2:
  877.  
  878. .str_buf  equ esp
  879. .cvt_buf  equ .str_buf+32
  880. .bcd_man  equ .cvt_buf+16
  881. .bcd_exp  equ .bcd_man+10
  882. .exp      equ .bcd_exp+10
  883. .tmp      equ .exp+4
  884. .lcl_end  equ .tmp+4
  885.  
  886.         sub     esp, 32+16+10+10+4+4
  887.  
  888.         mov     edi, .str_buf
  889.         shl     ebp, 16
  890.         lea     eax, ['ST0:'+ebp]
  891.         stosd
  892.         mov     eax, 0x20202020
  893.         stosd
  894.         stosd
  895.         stosd
  896.         stosd
  897.         stosd
  898.  
  899.         movzx   eax, word [_fsw]
  900.         shr     eax, 11
  901.         add     eax, ebp
  902.         shr     ebp, 12
  903.         and     eax, 7
  904.         bt      dword [_ftw], eax
  905.         jc     .exam
  906.  
  907.         mov     dword [.str_buf+8],' emp'
  908.         mov     word [.str_buf+8+4],'ty'
  909.         jmp     .display
  910.  
  911. .exam:
  912.         fld     tword [_st0+ebp]
  913.         fxam
  914.         fstsw   ax
  915.         fstp    st1
  916.         sahf
  917.  
  918.         jz      .c3
  919.         jp      .c2
  920.  
  921. ;C0 leaf
  922.         jc      .nan
  923.  
  924. ; C3 = 0 C2 = 0 C0 = 0 - invalid
  925.         mov     dword [.str_buf+6], ' inv'
  926.         mov     dword [.str_buf+6+4], 'alid'
  927.         jmp     .display
  928.  
  929. ; C3 = 0 C2 = 0 C0 = 1 - Not a Number
  930. .nan:
  931.         mov     dword [.str_buf+10], ' NaN'
  932.         jmp     .display
  933.  
  934. ;C2 leaf - valid or infinity
  935.  
  936. .c2:
  937. ; C3 = 0 C2 = 1 C0 = 0 - valid number
  938.  
  939.         jnc     .decode
  940.  
  941. ; C3 = 0 C2 = 1 C0 = 1 - Infinty
  942.  
  943. ;check sign flag
  944.         test    ah, 0x02
  945.         jnz     @F
  946.         mov     dword [.str_buf+10], '+Inf'
  947.         jmp     .display
  948. @@:
  949.         mov     dword [.str_buf+10], '-Inf'
  950.         jmp     .display
  951.  
  952. .c3:
  953.         jp      .denormal
  954.         jc      .empty
  955.  
  956. ; C3 = 1 C2 = 1 C0 = 0 - Zero
  957.  
  958.         mov     dword [.str_buf+10], ' 0.0'
  959.         jmp     .display
  960.  
  961. .empty:
  962.         mov     dword [.str_buf+8],' emp'
  963.         mov     word [.str_buf+8+4],'ty'
  964.         jmp     .display
  965.  
  966. ; C3 = 1 C2 = 1 C0 = 0 - Denormal number
  967.  
  968. .denormal:
  969.         test    ah, 0x02
  970.         jnz     @F
  971.  
  972.         mov     dword [.str_buf+6], '+den'
  973.         mov     dword [.str_buf+6+4], 'orm '
  974.         jmp     .display
  975. @@:
  976.         mov     dword [.str_buf+6], '-den'
  977.         mov     dword [.str_buf+6+4], 'orm '
  978.         jmp     .display
  979.  
  980. .decode:
  981.         fld     tword [_st0+ebp]
  982.         fabs
  983.         fld     st0
  984.         fldlg2
  985.         fld     st1
  986.         fyl2x
  987.         frndint
  988.         fist    dword [.exp]
  989.         fld     st0
  990.         fbstp   tword [.bcd_exp]
  991.  
  992.         fldl2t
  993.         fmulp
  994.         fld     st0
  995.         frndint
  996.         fxch
  997.         fsub    st,st1
  998.  
  999.         f2xm1
  1000.         fld1
  1001.         faddp
  1002.         fscale
  1003.         fstp    st1
  1004.         fdivp
  1005.  
  1006.         fist    dword [.tmp]
  1007.         cmp     dword [.tmp], 10
  1008.         jae     .fixup
  1009.  
  1010.         fstp    st1
  1011.         jmp     .done
  1012.  
  1013. .fixup:
  1014.         fstp st0
  1015.  
  1016.         inc     dword [.exp]
  1017.         fild    dword [.exp]
  1018.         fld     st0
  1019.         fbstp   tword [.bcd_exp]
  1020.  
  1021.         fldl2t
  1022.         fmulp
  1023.         fld st0
  1024.         frndint
  1025.         fxch
  1026.         fsub    st,st1
  1027.  
  1028.         f2xm1
  1029.         fld1
  1030.         faddp
  1031.         fscale
  1032.         fstp    st1
  1033.         fdivp
  1034. .done:
  1035.         fimul   dword [n_digits]
  1036.         fbstp   tword [.bcd_man]
  1037.  
  1038.         lea     edi, [.cvt_buf]
  1039.         mov     edx, dword [.bcd_man]
  1040.         mov     ecx, 8
  1041. @@:
  1042.         xor     eax, eax
  1043.         shld    eax, edx, 4
  1044.         stosb
  1045.         shl     edx, 4
  1046.         loop    @B
  1047.  
  1048.         lea     esi, [.cvt_buf+7]
  1049.         lea     edi, [.str_buf+13]
  1050.         mov     ecx, 7
  1051.         mov     ah, 0x30
  1052.         std
  1053. .skip_z:
  1054.         lodsb
  1055.         test    al, al
  1056.         jnz     .body
  1057.         loop    .skip_z
  1058. .body:
  1059.         add     al, ah
  1060.         stosb
  1061.         lodsb
  1062.         jcxz    .point
  1063.         loop    .body
  1064. .point:
  1065.         dec     edi
  1066.         add     al, ah
  1067.         mov     ah, '.'
  1068.         stosw
  1069.  
  1070.         bt      word [_st0+ebp+8], 15
  1071.         jnc     .m_sign
  1072.         mov     al, '-'
  1073.         mov     [edi+1], al
  1074.  
  1075. .m_sign:
  1076.         cld
  1077.  
  1078.         mov     dx, word [.bcd_exp]
  1079.         test    dx, dx
  1080.         jz      .display
  1081.  
  1082.         lea     edi, [.str_buf+15]
  1083.         mov     ax, 'E '
  1084.         cmp     byte [.bcd_exp+9], 0x80
  1085.         jne     .w_e_sign
  1086.         mov     ax, 'E-'
  1087.  
  1088. .w_e_sign:
  1089.         stosw
  1090.  
  1091.         mov     ecx, 4
  1092. .skip_lz:
  1093.         xor     eax, eax
  1094.         shld    ax, dx, 4
  1095.         shl     dx, 4
  1096.         test al, al
  1097.         jnz     .w_exp
  1098.         loop    .skip_lz
  1099. .w_exp:
  1100.         add     al, 0x30
  1101.         stosb
  1102.         xor     eax, eax
  1103.         shld    ax, dx, 4
  1104.         shl     dx,4
  1105.         loop    .w_exp
  1106.  
  1107. .display:
  1108.  
  1109.         mov     ecx, ((FONT) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_INACTIVE or 0x40000000)
  1110.         cmp     [debuggee_pid], 0
  1111.         jz      .do_label
  1112.         cmp     [bSuspended], 0
  1113.         jz      .do_label
  1114.  
  1115.         mov     ecx, ((FONT) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_NORMAL or 0x40000000)
  1116.  
  1117.         mov     eax, dword [_st0+ebp]
  1118.         cmp     eax, dword [_st0+(oldcontext-context)+ebp]
  1119.         jne     .scol
  1120.  
  1121.         mov     eax, dword [_st0+ebp+4]
  1122.         cmp     eax, dword [_st0+(oldcontext-context)+ebp+4]
  1123.         jne     .scol
  1124.  
  1125.         mov     ax, word [_st0+ebp+8]
  1126.         cmp     ax, word [_st0+(oldcontext-context)+ebp+8]
  1127.         je      .do_label
  1128.  
  1129. .scol:
  1130.         mov     ecx, ((FONT) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_CHANGED or 0x40000000)
  1131.  
  1132. .do_label:
  1133.         ; draw a text string in the window
  1134.         mov     esi, 23
  1135.         mov     edx, .str_buf
  1136.         mov     edi, COLOR_BG_NORMAL
  1137.         mcall   4
  1138.  
  1139.         shr     ebp, 4
  1140.         add     esp, 32+16+10+10+4+4
  1141.  
  1142.         ret
  1143.  
  1144.  
  1145. ;-----------------------------------------------------------------------------
  1146. ;                      Show FPU MMX register content
  1147. ;
  1148. ; in: ebp index, ebx = coord
  1149.  
  1150. draw_mmx_register_2:
  1151.  
  1152.         sub     esp, 24
  1153.         lea     edi, [esp+4]
  1154.  
  1155.         shl     ebp, 4
  1156.         mov     eax, ebp
  1157.         shl     eax, 16-4
  1158.         add     eax, 'MM0:'
  1159.         mov     [esp], eax
  1160.  
  1161.         mov     edx, dword [_mm0+ebp+4]
  1162.         call    .hex_2_str
  1163.         mov     al, ' '
  1164.         stosb
  1165.         call    .hex_2_str
  1166.         mov     al, ' '
  1167.         stosb
  1168.  
  1169.         mov     edx, dword [_mm0+ebp]
  1170.         call    .hex_2_str
  1171.         mov     al, ' '
  1172.         stosb
  1173.         call    .hex_2_str
  1174.  
  1175.         mov     ecx, ((FONT) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_INACTIVE or 0x40000000)
  1176.         cmp     [debuggee_pid], 0
  1177.         jz      .cd
  1178.         cmp     [bSuspended], 0
  1179.         jz      .cd
  1180.  
  1181.         mov     ecx, ((FONT) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_NORMAL or 0x40000000)
  1182.  
  1183.         mov     eax, dword [_mm0+ebp]
  1184.         cmp     eax, dword [_mm0+(oldcontext-context)+ebp]
  1185.         jne     .scol
  1186.  
  1187.         mov     eax, dword [_mm0+ebp+4]
  1188.         cmp     eax, dword [_mm0+(oldcontext-context)+ebp+4]
  1189.         je     .cd
  1190.  
  1191. .scol:
  1192.         mov     ecx, ((FONT) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_CHANGED or 0x40000000)
  1193. .cd:
  1194.         ; draw a text string in the window
  1195.  
  1196.         mov     esi, 23
  1197.         mov     edx, esp
  1198.         mov     edi, COLOR_BG_NORMAL
  1199.         mcall   4
  1200.         shr     ebp, 4
  1201.         add     esp, 24
  1202.         ret
  1203.  
  1204. align 4
  1205. .hex_2_str:
  1206.         mov     ecx, 4
  1207. @@:
  1208.         xor     eax, eax
  1209.         shld    eax, edx, 4
  1210.         aaa
  1211.         adc     al, 0x30
  1212.         aad     16
  1213.         shl     edx, 4
  1214.         stosb
  1215.         loop @B
  1216.         ret
  1217.  
  1218. align 4
  1219. draw_fpu_regs:
  1220.         push    ebp
  1221.         push    8
  1222.         xor     ebp, ebp
  1223.         mov     ebx, [registers_x_pos_dd]
  1224.         add     ebx, 2*10000h+REGISTERS_Y_POS+14*(TEXT_Y_CLEARANCE+FONT_Y_SIZE)
  1225. .draw_regs:
  1226.         call    draw_fpu_register_2
  1227.         add     ebx, FONT_Y_SIZE+TEXT_Y_CLEARANCE
  1228.         inc     ebp
  1229.         dec     dword [esp]
  1230.         jnz     .draw_regs
  1231.         pop     eax                         ;restore stack
  1232.         pop     ebp
  1233.         ret
  1234.  
  1235. align 4
  1236. draw_mmx_regs:
  1237.         push    ebp
  1238.         push    8
  1239.         xor     ebp, ebp
  1240.         mov     ebx, [registers_x_pos_dd]
  1241.         add     ebx, 2*10000h+REGISTERS_Y_POS+14*(TEXT_Y_CLEARANCE+FONT_Y_SIZE)
  1242. .draw_regs:
  1243.         call    draw_mmx_register_2
  1244.         add     ebx, FONT_Y_SIZE+TEXT_Y_CLEARANCE
  1245.         inc     ebp
  1246.         dec     dword [esp]
  1247.         jnz     .draw_regs
  1248.         pop     eax
  1249.         pop     ebp
  1250.         ret
  1251.  
  1252. align 4
  1253. draw_sse_regs:
  1254.         push    ebp
  1255.         push    8
  1256.         xor     ebp, ebp
  1257.         mov     ebx, [registers_x_pos_dd]
  1258.         add     ebx, 2*10000h+REGISTERS_Y_POS+14*(TEXT_Y_CLEARANCE+FONT_Y_SIZE)
  1259. .draw_regs:
  1260.      ;   call    draw_sse_register
  1261.         add     ebx, FONT_Y_SIZE+TEXT_Y_CLEARANCE
  1262.         inc     ebp
  1263.         dec     dword [esp]
  1264.         jnz     .draw_regs
  1265.         pop     eax
  1266.         pop     ebp
  1267.         ret
  1268.  
  1269. ; TODO add AVX registers
  1270.  
  1271. ;-----------------------------------------------------------------------------
  1272. ;                   Display contents of EFLAGS register
  1273. draw_flag:
  1274.         movzx   edi, byte [edx+7]
  1275.         bt      [_eflags], edi
  1276.         jc      .on
  1277.         or      byte [edx], 20h
  1278.         jmp     .onoff
  1279.  
  1280.     .on:
  1281.         and     byte [edx], not 20h
  1282.  
  1283.     .onoff:
  1284.         mov     ecx, ((FONT) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_INACTIVE or 0x40000000)
  1285.         cmp     [debuggee_pid], 0
  1286.         jz      .doit
  1287.         cmp     [bSuspended], 0
  1288.         jz      .doit
  1289.  
  1290.         mov     ecx, ((FONT) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_NORMAL or 0x40000000)
  1291.         bt      [_eflags], edi
  1292.         lahf
  1293.         bt      dword [_eflags + oldcontext - context], edi
  1294.         rcl     ah, 1
  1295.         test    ah, 3
  1296.         jp      .doit
  1297.         mov     ecx, ((FONT) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_CHANGED or 0x40000000)
  1298.  
  1299.     .doit:
  1300.         mov     ah, 0
  1301.         mov     edi, COLOR_BG_NORMAL
  1302.         ; draw a text string in the window in one case
  1303.         ; and a number in another
  1304.         ; color scheme same as for previously called function (was in ecx)
  1305.         mcall
  1306.         ret
  1307.  
  1308. ;-----------------------------------------------------------------------------
  1309. ;                      Draw registers frame title
  1310.  
  1311. ; Also show current register set (common + MMX, SSE or AVX)
  1312. draw_reg_title:
  1313.         mov     edi, COLOR_BG_NORMAL
  1314.         mov     ecx, ((FONT) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_NORMAL or 0x40000000)
  1315.         mov     esi, 7
  1316.         cmp     [reg_mode], REG_MODE_CPU
  1317.         jz      @f
  1318.         mov     ecx, ((FONT) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_INACTIVE or 0x40000000)
  1319.     @@:
  1320.         movzx   edx, [fpu_mode]
  1321.         mov     edx, [btn2_tab+edx*4]
  1322.  
  1323.         ; draw a text string in the window
  1324.         mov     ebx, [registers_x_pos_dd]
  1325.         add     ebx, 4*10000h+REGISTERS_Y_POS
  1326.         mcall   4
  1327.  
  1328.         cmp     [reg_mode], REG_MODE_SSE
  1329.         jz      @f
  1330.         mov     ecx, ((FONT) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_INACTIVE or 0x40000000)
  1331.     @@:
  1332.         mov     edx, aSSE
  1333.         ; draw a text string in the window
  1334.         mov     ebx, [registers_x_pos_dd]
  1335.         add     ebx, (7*FONT_X_SIZE+4)*10000h+REGISTERS_Y_POS
  1336.         mcall   4
  1337.  
  1338.         cmp     [reg_mode], REG_MODE_AVX
  1339.         jz      @f
  1340.         mov     ecx, ((FONT) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_INACTIVE or 0x40000000)
  1341.     @@:
  1342.         mov     edx, aAVX
  1343.         ; draw a text string in the window
  1344.         mov     ebx, [registers_x_pos_dd]
  1345.         add     ebx, (14*FONT_X_SIZE+4)*10000h+REGISTERS_Y_POS
  1346.         mcall   4
  1347.         ret
  1348.  
  1349. ;-----------------------------------------------------------------------------
  1350. ;                Display common registers set + MMX + FPU
  1351.  
  1352. draw_main_registers:
  1353. ; TODO: add support for FPU ST0-ST7 registers
  1354.         mov     edi, COLOR_BG_NORMAL
  1355.         mov     esi, _eax
  1356.         push    4
  1357.         pop     ecx
  1358.         mov     edx, regs_strs
  1359.         mov     ebx, [registers_x_pos_dd]
  1360.         add     ebx, 2*10000h+REGISTERS_Y_POS+2*(FONT_Y_SIZE+TEXT_Y_CLEARANCE)
  1361.         call    draw_register
  1362.         mov     ebx, [registers_x_pos_dd]
  1363.         add     ebx, 2*10000h+REGISTERS_Y_POS+3*(FONT_Y_SIZE+TEXT_Y_CLEARANCE)
  1364.         add     esi, _ebx-_eax
  1365.         call    draw_register
  1366.         mov     ebx, [registers_x_pos_dd]
  1367.         add     ebx, 2*10000h+REGISTERS_Y_POS+4*(FONT_Y_SIZE+TEXT_Y_CLEARANCE)
  1368.         add     esi, _ecx-_ebx
  1369.         call    draw_register
  1370.         mov     ebx, [registers_x_pos_dd]
  1371.         add     ebx, 2*10000h+REGISTERS_Y_POS+5*(FONT_Y_SIZE+TEXT_Y_CLEARANCE)
  1372.         add     esi, _edx-_ecx
  1373.         call    draw_register
  1374.         mov     ebx, [registers_x_pos_dd]
  1375.         add     ebx, 2*10000h+REGISTERS_Y_POS+6*(FONT_Y_SIZE+TEXT_Y_CLEARANCE)
  1376.         add     esi, _esi-_edx
  1377.         call    draw_register
  1378.         mov     ebx, [registers_x_pos_dd]
  1379.         add     ebx, 2*10000h+REGISTERS_Y_POS+7*(FONT_Y_SIZE+TEXT_Y_CLEARANCE)
  1380.         add     esi, _edi-_esi
  1381.         call    draw_register
  1382.         mov     ebx, [registers_x_pos_dd]
  1383.         add     ebx, 2*10000h+REGISTERS_Y_POS+8*(FONT_Y_SIZE+TEXT_Y_CLEARANCE)
  1384.         add     esi, _ebp-_edi
  1385.         call    draw_register
  1386.         mov     ebx, [registers_x_pos_dd]
  1387.         add     ebx, 2*10000h+REGISTERS_Y_POS+9*(FONT_Y_SIZE+TEXT_Y_CLEARANCE)
  1388.         add     esi, _esp-_ebp
  1389.         call    draw_register
  1390.         mov     ebx, [registers_x_pos_dd]
  1391.         add     ebx, 2*10000h+REGISTERS_Y_POS+10*(FONT_Y_SIZE+TEXT_Y_CLEARANCE)
  1392.         add     esi, _eip-_esp
  1393.         call    draw_register
  1394.         mov     ebx, [registers_x_pos_dd]
  1395.         add     ebx, 2*10000h+REGISTERS_Y_POS+11*(FONT_Y_SIZE+TEXT_Y_CLEARANCE)
  1396.  
  1397.         mov     cl, 7
  1398.         add     esi, _eflags-_eip
  1399.         call    draw_register
  1400.  
  1401.         cmp     [fpu_mode], 1
  1402.         je      .fpu
  1403.         call    draw_mmx_regs
  1404.         jmp     @f
  1405.   .fpu:
  1406.         call    draw_fpu_regs
  1407.     @@:
  1408.         mov     ecx, (0 and 11b) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_INACTIVE
  1409.         cmp     [debuggee_pid], 0
  1410.         jz      @f
  1411.         cmp     [bSuspended], 0
  1412.         jz      @f
  1413.         mov     ecx, (0 and 11b) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_NORMAL
  1414.     @@:
  1415.         mov     edx, aColon
  1416.         xor     esi, esi
  1417.         inc     esi
  1418.         mov     ebx, [registers_x_pos_dd]
  1419.         add     ebx, 10*10000h+REGISTERS_Y_POS+12*(FONT_Y_SIZE+TEXT_Y_CLEARANCE)
  1420.         mcall   4
  1421.         mov     edx, flags
  1422.  
  1423.     @@:
  1424.         add     ebx, 2*FONT_X_SIZE*10000h
  1425.         call    draw_flag
  1426.         inc     edx
  1427.         cmp     dl, flags_bits and 0xFF
  1428.         jnz     @b
  1429.         ret
  1430.  
  1431. ;-----------------------------------------------------------------------------
  1432. ;                  Draw SSE registers set
  1433.  
  1434. draw_sse_registers:
  1435.  
  1436.         ret
  1437.  
  1438. ;-----------------------------------------------------------------------------
  1439. ;                  Draw AVX registers set
  1440.  
  1441. draw_avx_registers:
  1442.  
  1443.         ret
  1444.  
  1445. ;-----------------------------------------------------------------------------
  1446. ;                 Draw all registers sets
  1447. draw_registers:
  1448.  
  1449.         ; draw container rectangle/box with COLOR_BG_NORMAL
  1450.         mov     ebx, [registers_x_pos_dd]
  1451.         add     ebx, (-1)*10000h+(REGISTERS_X_SIZE+2)
  1452.         mov     ecx, [registers_y_size_dd+4]
  1453.         add     ecx, ((TITLE_Y_POS+(FONT_Y_SIZE/2))+1)*10000h+2
  1454.         mcall   13, , , COLOR_BG_NORMAL
  1455.         call    draw_reg_title
  1456.  
  1457.     .redraw:
  1458.         cmp     [reg_mode], REG_MODE_CPU
  1459.         jnz     @f
  1460.         call    draw_main_registers
  1461.         ret
  1462.  
  1463.     @@:
  1464.         cmp     [reg_mode], REG_MODE_SSE
  1465.         jnz     @f
  1466.         call    draw_sse_registers
  1467.         ret
  1468.  
  1469.     @@:
  1470.         call    draw_avx_registers
  1471.         ret
  1472.  
  1473. ;-----------------------------------------------------------------------------
  1474. ;                     Display memory dump
  1475.  
  1476. draw_dump:
  1477.         ; draw container rectangle/box in the window
  1478.         mov     ebx, [data_x_size_dd+4]
  1479.         add     ebx, DATA_X_POS*10000h
  1480.         mcall   13, , DUMP_Y_POS*10000h+DUMP_Y_SIZE, COLOR_BG_NORMAL
  1481.  
  1482.     .redraw:
  1483.         ; addresses
  1484.         mov     ebx, 80100h
  1485.         mov     edx, DATA_X_POS*10000h + DUMP_Y_POS
  1486.         mov     ecx, [dumppos]
  1487.         mov     edi, COLOR_BG_NORMAL
  1488.         mov     esi, ((FONT) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_INACTIVE or 0x40000000)
  1489.         cmp     [debuggee_pid], 0
  1490.         jz      @f
  1491.         cmp     [bSuspended], 0
  1492.         jz      @f
  1493.         mov     esi, ((FONT) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_NORMAL or 0x40000000)
  1494.     @@:
  1495.         ; draw a number in the window
  1496.         mcall   47
  1497.         add     ecx, 10h
  1498.         add     edx, FONT_Y_SIZE + TEXT_Y_CLEARANCE
  1499.         cmp     dl, DUMP_Y_POS + DUMP_Y_SIZE
  1500.         jb      @b
  1501.         ; hex dump of data
  1502.         mov     ecx, dumpdata
  1503.         push    ecx
  1504.         xor     ebx, ebx
  1505.         mov     edx, (DATA_X_POS+12*FONT_X_SIZE)*10000h + DUMP_Y_POS
  1506.         cmp     [dumpread], ebx
  1507.         jz      .hexdumpdone1
  1508.  
  1509.     .hexdumploop1:
  1510.         push    ebx
  1511.         mov     ebx, 20101h
  1512.         ; draw a number in the window
  1513.         mcall
  1514.         pop     ebx
  1515.         add     edx, 3*FONT_X_SIZE*10000h
  1516.         inc     ecx
  1517.         inc     ebx
  1518.         test    bl, 15
  1519.         jz      .16
  1520.         test    bl, 7
  1521.         jnz     @f
  1522.         add     edx, 2*FONT_X_SIZE*10000h - (FONT_Y_SIZE+TEXT_Y_CLEARANCE) + FONT_X_SIZE*(3*10h+2)*10000h
  1523.  
  1524.     .16:
  1525.         add     edx, (FONT_Y_SIZE+TEXT_Y_CLEARANCE) - FONT_X_SIZE*(3*10h+2)*10000h
  1526.  
  1527.     @@:
  1528.         cmp     ebx, [dumpread]
  1529.         jb      .hexdumploop1
  1530.  
  1531.     .hexdumpdone1:
  1532.         mov     al, 4
  1533.         ; copy color value from esi to ecx
  1534.         ; to draw text string with 'mcall 4'
  1535.         mov     ecx, esi
  1536.         xchg    ebx, edx
  1537.         push    2
  1538.         pop     esi
  1539.  
  1540.     .hexdumploop2:
  1541.         cmp     edx, DUMP_HEIGHT*10h
  1542.         jae     .hexdumpdone2
  1543.         push    edx
  1544.         mov     edx, aQuests
  1545.         ; draw text string with color in ecx, copied from esi
  1546.         mcall
  1547.         pop     edx
  1548.         add     ebx, 3*FONT_X_SIZE*10000h
  1549.         inc     edx
  1550.         test    dl, 15
  1551.         jz      .16x
  1552.         test    dl, 7
  1553.         jnz     .hexdumploop2
  1554.         add     ebx, 2*FONT_X_SIZE*10000h - (FONT_Y_SIZE+TEXT_Y_CLEARANCE) + FONT_X_SIZE*(3*10h+2)*10000h
  1555.  
  1556.   .16x:
  1557.         add     ebx, (FONT_Y_SIZE+TEXT_Y_CLEARANCE) - FONT_X_SIZE*(3*10h+2)*10000h
  1558.         jmp     .hexdumploop2
  1559.  
  1560.   .hexdumpdone2:
  1561.         dec     esi
  1562.         ; colon, minus signs
  1563.         mov     ebx, (DATA_X_POS+8*FONT_X_SIZE)*10000h + DUMP_Y_POS
  1564.         mov     edx, aColon
  1565.  
  1566.     @@:
  1567.         mcall
  1568.         add     ebx, (FONT_Y_SIZE+TEXT_Y_CLEARANCE)
  1569.         cmp     bl, DUMP_Y_POS+DUMP_HEIGHT*(FONT_Y_SIZE+TEXT_Y_CLEARANCE)
  1570.         jb      @b
  1571.         mov     ebx, (DATA_X_POS+(12+3*8)*FONT_X_SIZE)*10000h + DUMP_Y_POS
  1572.         mov     edx, aMinus
  1573.  
  1574.     @@:
  1575.         mcall
  1576.         add     ebx, (FONT_Y_SIZE+TEXT_Y_CLEARANCE)
  1577.         cmp     bl, DUMP_Y_POS+DUMP_HEIGHT*(FONT_Y_SIZE+TEXT_Y_CLEARANCE)
  1578.         jb      @b
  1579.         ; ASCII data
  1580.         mov     ebx, (DATA_X_POS+(12+3*10h+2+2)*FONT_X_SIZE)*10000h + DUMP_Y_POS
  1581.         pop     edx
  1582.         push    DUMP_HEIGHT*10h
  1583.  
  1584.     .asciiloop:
  1585.         push    edx
  1586.         cmp     byte [edx], 20h
  1587.         jae     @f
  1588.         mov     edx, aPoint
  1589.  
  1590.     @@:
  1591.         ; draw a text string in the window, color in ecx
  1592.         mcall
  1593.         pop     edx
  1594.         inc     edx
  1595.         add     ebx, FONT_X_SIZE*10000h
  1596.         dec     dword [esp]
  1597.         jz      .asciidone
  1598.         test    byte [esp], 15
  1599.         jnz     .asciiloop
  1600.         add     ebx, (FONT_Y_SIZE+TEXT_Y_CLEARANCE) - FONT_X_SIZE*10h*10000h
  1601.         jmp     .asciiloop
  1602.  
  1603.     .asciidone:
  1604.         pop     ecx
  1605.         ret
  1606.  
  1607. ;-----------------------------------------------------------------------------
  1608. ;                   Display disassembled code
  1609.  
  1610. draw_disasm:
  1611.  
  1612.         mov     eax, [disasm_start_pos]
  1613.         mov     [disasm_cur_pos], eax
  1614.         and     [disasm_cur_str], 0
  1615.  
  1616.     .loop:
  1617.         mov     eax, [disasm_cur_pos]
  1618.         call    find_symbol
  1619.         jc      .nosymb
  1620.         mov     ebx, [disasm_cur_str]
  1621.         imul    ebx, (FONT_Y_SIZE+TEXT_Y_CLEARANCE)
  1622.         push    ebx
  1623.         lea     ecx, [ebx+DISASM_Y_POS-1]
  1624.         shl     ecx, 16
  1625.         mov     cl, FONT_Y_SIZE+TEXT_Y_CLEARANCE
  1626.         ; setting up background color for disassembled text
  1627.         mov     edx, COLOR_BG_NORMAL
  1628.         ; draw container rectangle/box with color COLOR_BG_NORMAL (was 0xFFFFFF - white)
  1629.         mov     ebx, [data_x_size_dd+4]
  1630.         add     ebx, DATA_X_POS*10000h
  1631.         mcall   13
  1632.         pop     ebx
  1633.         ; copy color value from edx (COLOR_BG_NORMAL)
  1634.         mov     edi, edx
  1635.         add     ebx, (DATA_X_POS+FONT_X_SIZE*2)*10000h+DISASM_Y_POS
  1636.         mov     edx, esi
  1637.  
  1638.     @@:
  1639.         lodsb
  1640.         test    al, al
  1641.         jnz     @b
  1642.         mov     byte [esi-1], ':'
  1643.         sub     esi, edx
  1644.         ; normal color
  1645.         ; was 0x40000000
  1646.         mov     ecx, ((FONT) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_LABEL or 0x40000000)
  1647.         mov     al, 4
  1648.         ; draw a text string in the window with color COLOR_TXT_NORMAL in ecx
  1649.         mcall
  1650.         mov     byte [esi+edx-1], 0
  1651. ;         lea     esi, [esi*3]
  1652. ;         movzx   ecx, bx
  1653. ;         shr     ebx, 16
  1654. ;         lea     ebx, [ebx+esi*2]
  1655. ;         shl     ecx, 16
  1656. ;         mov     cl, 10
  1657. ;         imul    ebx, 10001h
  1658. ;         sub     bx, DATA_X_POS
  1659. ;         sub     bx, word[data_x_size_dd+4]
  1660. ;         neg     bx
  1661. ;         mov     al, 13
  1662. ;         copy color value from edi
  1663. ;         mov     edx, edi
  1664. ;         draw container rectangle/box for disassembled text, color in edx
  1665. ;         mcall
  1666.         inc     [disasm_cur_str]
  1667.         mov     eax, [disasm_height_dd]
  1668.         cmp     [disasm_cur_str], eax
  1669.         jae     .loopend
  1670.  
  1671.     .nosymb:
  1672.         push    [disasm_cur_pos]
  1673.         call    disasm_instr
  1674.         pop     ebp
  1675.         jc      .loopend
  1676.         mov     edx, COLOR_BG_NORMAL
  1677.         mov     esi, (FONT) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_NORMAL
  1678.         mov     ebx, DATA_X_POS*10000h
  1679.         add     ebx, [data_x_size_dd+4]
  1680.         mov     ecx, [disasm_cur_str]
  1681.         imul    ecx, (FONT_Y_SIZE+TEXT_Y_CLEARANCE)*10000h
  1682.         add     ecx, (DISASM_Y_POS-1)*10000h + (FONT_Y_SIZE+TEXT_Y_CLEARANCE)
  1683.         mov     eax, ebp
  1684.         pushad
  1685.         call    find_enabled_breakpoint
  1686.         popad
  1687.         jnz     .nobp
  1688.         mov     edx, COLOR_BG_BREAKPOINT
  1689.         mov     esi, (FONT) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_BREAKPOINT
  1690.     .nobp:
  1691.  
  1692.         mov     eax, [_eip]
  1693.         cmp     eax, ebp
  1694.         jnz     .notcurrent
  1695.         mov     edx, COLOR_BG_SELECTED
  1696.         mov     esi, (FONT) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_SELECTED
  1697.     .notcurrent:
  1698.         push    esi     ; Save color value for disassembled text
  1699.  
  1700.         ; draw container rectangle/box for disassembled text
  1701.         ; color in edx
  1702.         mcall   13
  1703.  
  1704.         mov     edx, [disasm_cur_str]
  1705.         imul    edx, (FONT_Y_SIZE+TEXT_Y_CLEARANCE)
  1706.         add     edx, DATA_X_POS*10000h + DISASM_Y_POS
  1707.         ; draw a number in the window, color in esi
  1708.         mcall   47, 80100h, ebp
  1709.  
  1710.         lea     ebx, [edx+8*FONT_X_SIZE*10000h]
  1711.         mov     ecx, esi    ; text color
  1712.         push    2
  1713.         pop     esi
  1714.         mov     edx, aColon
  1715.         ; draw the colon
  1716.         mcall   4
  1717.         push    9
  1718.         pop     edi
  1719.         lea     edx, [ebx+2*FONT_X_SIZE*10000h]
  1720.         mov     ecx, ebp
  1721.         sub     ecx, [disasm_start_pos]
  1722.         add     ecx, disasm_buffer
  1723.  
  1724.         mov     esi, (FONT) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_HEX
  1725.         mov     eax, [_eip]
  1726.         cmp     eax, ebp
  1727.         jnz     @f
  1728.         mov     esi, (FONT) shl 28 or ((FONT_MULTIPLIER - 1) and 111b) shl 24 or COLOR_TXT_SELECTED
  1729.   @@:
  1730.     .drawhex:
  1731.         ; draw a number in the window, color in esi
  1732.         mcall   47, 20101h
  1733.         add     edx, FONT_X_SIZE*3*10000h
  1734.         inc     ecx
  1735.         inc     ebp
  1736.         cmp     ebp, [disasm_cur_pos]
  1737.         jae     .hexdone
  1738.         dec     edi
  1739.         jnz     .drawhex
  1740.         push    esi
  1741.         mov     esi, [disasm_cur_pos]
  1742.         dec     esi
  1743.         cmp     esi, ebp
  1744.         pop     esi
  1745.         jbe     .drawhex
  1746.  
  1747.         lea     ebx, [edx-FONT_X_SIZE*10000h]
  1748.         ; copy color value from esi
  1749.         mov     ecx, esi
  1750.         push    3
  1751.         pop     esi
  1752.         mov     edx, aDots
  1753.         ; draw a text string in the window, color in ecx
  1754.         mcall   4
  1755.  
  1756.     .hexdone:
  1757.         pop     esi
  1758.         xor     eax, eax
  1759.         mov     edi, disasm_string
  1760.         mov     edx, edi
  1761.         or      ecx, -1
  1762.         repnz scasb
  1763.         not     ecx
  1764.         dec     ecx
  1765.         xchg    ecx, esi
  1766.         mov     ebx, [disasm_cur_str]
  1767.         imul    ebx, (FONT_Y_SIZE+TEXT_Y_CLEARANCE)
  1768.         add     ebx, (DATA_X_POS+FONT_X_SIZE*40)*10000h+DISASM_Y_POS
  1769.  
  1770.         ; draw a text string in the window, color in ecx
  1771.         mcall   4
  1772.         inc     [disasm_cur_str]
  1773.         mov     eax, [disasm_height_dd]
  1774.         cmp     [disasm_cur_str], eax
  1775.         jb      .loop
  1776.  
  1777.     .loopend:
  1778.         mov     ecx, [disasm_height_dd]
  1779.         sub     ecx, [disasm_cur_str]
  1780.         jz      @f
  1781.         imul    ecx, (FONT_Y_SIZE+TEXT_Y_CLEARANCE)
  1782.         inc     ecx
  1783.         mov     eax, DISASM_Y_POS
  1784.         add     eax, [disasm_y_size_dd+4]
  1785.         sub     eax, ecx
  1786.         shl     eax, 16
  1787.         add     ecx, eax
  1788.         ; Draw filled rectangle
  1789.         mov     ebx, [data_x_size_dd+4]
  1790.         add     ebx, DATA_X_POS*10000h
  1791.         mcall   13, , , COLOR_BG_NORMAL
  1792.  
  1793.     @@:
  1794.         ret
  1795.  
  1796. ;-----------------------------------------------------------------------------
  1797.  
  1798. ; TODO: cleanup of this function, make some global labels local
  1799. update_disasm_eip:
  1800. ; test if instruction at eip is showed
  1801.         mov     ecx, [disasm_height_dd]
  1802.         mov     eax, [disasm_start_pos]
  1803.         mov     [disasm_cur_pos], eax
  1804.  
  1805.     .l:
  1806.         mov     eax, [disasm_cur_pos]
  1807.         call    find_symbol
  1808.         jc      @f
  1809.         dec     ecx
  1810.         jz      .m
  1811.  
  1812.     @@:
  1813.         cmp     [_eip], eax
  1814.         jz      draw_disasm
  1815.         push    ecx
  1816.         call    disasm_instr
  1817.         pop     ecx
  1818.         jc      .m
  1819.         loop    .l
  1820.  
  1821.     .m:
  1822.  
  1823. update_disasm_eip_force:
  1824.         mov     eax, [_eip]
  1825.         mov     [disasm_start_pos], eax
  1826.  
  1827. update_disasm:
  1828.         cmp     [debuggee_pid], 0
  1829.         jz      .no
  1830.  
  1831.         mcall   69, 6, [debuggee_pid], 256, [disasm_start_pos], disasm_buffer
  1832.         cmp     eax, -1
  1833.         jnz     @f
  1834.         mov     esi, read_mem_err
  1835.         call    put_message
  1836.  
  1837.     .no:
  1838.         xor     eax, eax
  1839.  
  1840.     @@:
  1841.         mov     [disasm_buf_size], eax
  1842.         call    restore_from_breaks
  1843.         jmp     draw_disasm
  1844.  
  1845.  
  1846. ;-----------------------------------------------------------------------------
  1847. ;                               Draw main window
  1848.  
  1849. draw_window:
  1850.         ; start window redraw
  1851.         mcall   12, 1
  1852.  
  1853.         ; define window
  1854.         mcall   0, wnd_x_size+10, wnd_y_size+30, (COLOR_BG_NORMAL or 0x33000000), ,caption_str
  1855.  
  1856.         ; Get actual window size
  1857.         mcall   9, thread_info, -1
  1858.  
  1859.         ; Check if window is rolled up
  1860.         test    [thread_info.wnd_state], 100b
  1861.         jnz     .done
  1862.  
  1863.         ; Check if window isnt smaller then permisseable
  1864.         mov     eax, [thread_info.box.width]            ; window xsize
  1865.         mov     ebx, [thread_info.box.height]           ; ysize
  1866.         mov     edx, [thread_info.client_box.width]     ; work area xsize
  1867.         mov     esi, [thread_info.client_box.height]    ; ysize
  1868.         sub     eax, edx
  1869.         sub     ebx, esi
  1870.  
  1871.         cmp     edx, wnd_x_size
  1872.         jae     .x_ok
  1873.         mov     edx, wnd_x_size
  1874.   .x_ok:
  1875.         add     edx, eax
  1876.  
  1877.         cmp     esi, wnd_y_size
  1878.         jae     .y_ok
  1879.         mov     esi, wnd_y_size
  1880.   .y_ok:
  1881.         add     esi, ebx
  1882.         mcall   67, -1, -1      ; set the new sizes
  1883.  
  1884.         ; (re)calculate coordinates of GUI elements
  1885.         mov     eax, [thread_info.client_box.width]
  1886.         sub     eax, DATA_X_POS + DATA_X_POS + REGISTERS_X_SIZE+3
  1887.         mov     [data_x_size_dd+4], eax
  1888.         mov     [messages_x_size_dd+4], eax
  1889.         shl     eax, 16
  1890.         mov     [data_x_size_dd], eax
  1891.         mov     [messages_x_size_dd], eax
  1892.         shr     eax, 16
  1893.         add     eax, DATA_X_POS + 4
  1894.         mov     [registers_x_pos_dd+4], eax
  1895.         shl     eax, 16
  1896.         mov     [registers_x_pos_dd], eax
  1897.  
  1898.         mov     eax, [thread_info.client_box.height]
  1899.         sub     eax, CMD_Y_SIZE + DATA_X_POS
  1900.         mov     [cmdline_y_pos_dd+4], eax
  1901.         shl     eax, 16
  1902.         mov     [cmdline_y_pos_dd], eax
  1903.         shr     eax, 16
  1904.         sub     eax, MSG_Y_SIZE + 4
  1905.         mov     [messages_y_pos_dd+4], eax
  1906.         shl     eax, 16
  1907.         mov     [messages_y_pos_dd], eax
  1908.         shr     eax, 16
  1909.         sub     eax, DISASM_Y_POS + 4
  1910.         mov     [disasm_y_size_dd+4], eax
  1911.         shl     eax, 16
  1912.         mov     [disasm_y_size_dd], eax
  1913.         shr     eax, 16
  1914.         mov     ecx, (FONT_Y_SIZE+TEXT_Y_CLEARANCE)
  1915.         xor     edx, edx
  1916.         div     ecx
  1917.         mov     [disasm_height_dd], eax
  1918.  
  1919.         mov     eax, [thread_info.client_box.height]
  1920.         sub     eax, DATA_X_POS + TITLE_Y_POS+(FONT_Y_SIZE/2)+2
  1921.         mov     [registers_y_size_dd+4], eax
  1922.         shl     eax, 16
  1923.         mov     [registers_y_size_dd], eax
  1924.  
  1925.         ; messages frame
  1926.         mov     ebx, [messages_x_size_dd+4]
  1927.         add     ebx, (MSG_X_POS-2)*10000h + (MSG_X_POS+2)
  1928.         push    ebx
  1929.         mov     ecx, [messages_y_pos_dd+2]
  1930.         add     ecx, -2*10001h
  1931.         mov     edx, COLOR_LINE
  1932.         mcall   38
  1933.         add     ecx, (MSG_Y_SIZE+2+2)*10001h
  1934.         mcall
  1935.         mov     ebx, (MSG_X_POS-2)*10001h
  1936.         push    ebx
  1937.         mov     ecx, [messages_y_pos_dd+2]
  1938.         add     ecx, (-2*10000h) + (MSG_Y_SIZE+2)
  1939.         mcall
  1940.         mov     ebx, [messages_x_size_dd+2]
  1941.         add     ebx, (MSG_X_POS+2)*10001h
  1942.         push    ebx
  1943.         mcall
  1944.  
  1945.         ; command line frame
  1946.         mov     ecx, [cmdline_y_pos_dd+2]
  1947.         add     ecx, (-2*10000h) + (CMD_Y_SIZE+2)
  1948.         pop     ebx
  1949.         mcall
  1950.         pop     ebx
  1951.         mcall
  1952.         pop     ebx
  1953.         mov     ecx, [cmdline_y_pos_dd+2]
  1954.         add     ecx, (CMD_Y_SIZE+2)*10001h
  1955.  
  1956.         mcall
  1957.         mov     ecx, [cmdline_y_pos_dd+2]
  1958.         add     ecx, (-2*10001h)
  1959.         mcall
  1960.  
  1961.         ; registers frame
  1962.         mov     ebx, [registers_x_pos_dd]
  1963.         add     ebx, (-2) shl 16 + (REGISTERS_X_SIZE+3)
  1964.         mov     ecx, (TITLE_Y_POS+(FONT_Y_SIZE/2)) shl 16 + 1
  1965.         mov     edx, COLOR_LINE
  1966.         mcall   13                      ; top
  1967.         mov     ebx, [registers_x_pos_dd]
  1968.         add     ebx, ((-2)+(REGISTERS_X_SIZE+3)) shl 16 + 1
  1969.         mov     ecx, [registers_y_size_dd+4]
  1970.         add     ecx, (TITLE_Y_POS+(FONT_Y_SIZE/2)) shl 16 + (+3+1)
  1971.         mcall                           ; right
  1972.         mov     ebx, [registers_x_pos_dd]
  1973.         add     ebx, (-2) shl 16 + (REGISTERS_X_SIZE+3+1)
  1974.         mov     ecx, [registers_y_size_dd]
  1975.         add     ecx, ((TITLE_Y_POS+(FONT_Y_SIZE/2))+4) shl 16 + 1
  1976.         mcall                           ; bottom
  1977.  
  1978.         ; messages
  1979.         call    draw_messages
  1980.  
  1981.         ; command line & cursor
  1982.         call    draw_cmdline
  1983.         call    draw_cursor
  1984.  
  1985.         ; title & registers & dump & disasm
  1986.         mov     ebx, (DATA_X_POS-2)*10001h
  1987.         mov     ecx, (TITLE_Y_POS+(FONT_Y_SIZE/2))*10000h + (-2)
  1988.         add     ecx, [messages_y_pos_dd+4]
  1989.         mov     edx, COLOR_LINE
  1990.         mcall   38
  1991.         mov     ebx, [data_x_size_dd+2]
  1992.         add     ebx, (DATA_X_POS+2)*10001h
  1993.         mcall
  1994.         mov     ebx, [data_x_size_dd+4]
  1995.         add     ebx, (DATA_X_POS-2)*10000h + (DATA_X_POS+2)
  1996.         mov     ecx, (DISASM_Y_POS-4)*10001h
  1997.         mcall
  1998.  
  1999.         mov     ebx, [registers_x_pos_dd]
  2000.         add     ebx, (-1) shl 16 + REGISTERS_X_SIZE + 1
  2001.         mov     ecx, (REGISTERS_Y_POS - 2) shl 16 + FONT_Y_SIZE + TEXT_Y_CLEARANCE
  2002.         mov     edx, (1 shl 30) + 2
  2003.         mov     esi, 0x00808080
  2004.         mcall   8
  2005.  
  2006.  
  2007.         ; redraw whole window again
  2008.         call    redraw_title
  2009.         call    draw_registers
  2010.         call    draw_dump
  2011.         call    draw_disasm
  2012.  
  2013.  
  2014.   .done:
  2015.         ; end of window redraw
  2016.         mcall   12, 2
  2017.         ret
  2018.  
  2019. ; vim: ft=fasm tabstop=4
  2020.