Subversion Repositories Kolibri OS

Rev

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

  1. ; int __stdcall GenericBox(DLGTEMPLATE* dlg, void* DlgProc);
  2. ;       int __stdcall DlgProc(DLGTEMPLATE* dlg, int msg, int param1, int param2);
  3.  
  4. virtual at 0
  5. dlgtemplate:
  6. ; Флаги:
  7. ; бит 0: использовать стандартные цвета диалога
  8. ; бит 1: использовать стандартные цвета предупреждения/ошибки
  9. ; (если любой из этих битов установлен, поля main_color,border_color,header_color
  10. ;  игнорируются)
  11. ; бит 2: не рисовать тень
  12. .flags          dd      ?
  13. .x              dd      ?
  14. .y              dd      ?
  15. .width          dd      ?
  16. .height         dd      ?
  17. .border_size_x  dd      ?
  18. .border_size_y  dd      ?
  19. .title          dd      ?
  20. .main_color     db      ?
  21. .border_color   db      ?
  22. .header_color   db      ?
  23.                 db      ?       ; align
  24. .dataptr        dd      ?       ; used internally, ignored on input
  25. .size = $
  26. end virtual
  27.  
  28. GenericBox:
  29.         push    [cursor_x]
  30.         push    [cursor_y]
  31.         push    dword [esp+8+8]
  32.         push    dword [esp+8+8]
  33.         call    ShowGenericBox
  34.         test    eax, eax
  35.         jz      @f
  36.         pop     [cursor_y]
  37.         pop     [cursor_x]
  38.         ret
  39. @@:
  40.         pushad
  41. ; message loop
  42. .event:
  43. ;        call    get_event
  44.         push    10
  45.         pop     eax
  46.         int     40h
  47.         dec     eax
  48.         jz      .redraw
  49.         dec     eax
  50.         jz      .key
  51.         jmp     exit
  52. .redraw:
  53.         call    draw_window
  54.         jmp     .event
  55. .key:
  56.         mov     al, 2
  57.         int     40h
  58.         shr     eax, 8
  59.         cmp     al, 0xE0
  60.         jnz     @f
  61.         mov     [bWasE0], 1
  62.         jmp     .event
  63. @@:
  64.         xchg    ah, [bWasE0]
  65.         cmp     al, 0x1D
  66.         jz      .ctrl_down
  67.         cmp     al, 0x9D
  68.         jz      .ctrl_up
  69.         cmp     al, 0x2A
  70.         jz      .lshift_down
  71.         cmp     al, 0xAA
  72.         jz      .lshift_up
  73.         cmp     al, 0x36
  74.         jz      .rshift_down
  75.         cmp     al, 0xB6
  76.         jz      .rshift_up
  77.         cmp     al, 0x38
  78.         jz      .alt_down
  79.         cmp     al, 0xB8
  80.         jz      .alt_up
  81.         mov     ebx, [esp+24h+8]
  82.         mov     ecx, [esp+28h+8]
  83.         push    0
  84.         push    eax
  85.         push    2
  86.         push    ebx
  87.         call    ecx
  88.         test    eax, eax
  89.         jz      .event
  90.         mov     [esp+28], eax
  91.         jmp     .exit
  92. .ctrl_down:
  93.         test    ah, ah
  94.         jnz     .rctrl_down
  95.         or      [ctrlstate], 4
  96.         jmp     .event
  97. .rctrl_down:
  98.         or      [ctrlstate], 8
  99.         jmp     .event
  100. .ctrl_up:
  101.         test    ah, ah
  102.         jnz     .rctrl_up
  103.         and     [ctrlstate], not 4
  104.         jmp     .event
  105. .rctrl_up:
  106.         and     [ctrlstate], not 8
  107.         jmp     .event
  108. .lshift_down:
  109.         test    ah, ah
  110.         jnz     @f
  111.         or      [ctrlstate], 1
  112. @@:     jmp     .event
  113. .lshift_up:
  114.         test    ah, ah
  115.         jnz     @b
  116.         and     [ctrlstate], not 1
  117.         jmp     @b
  118. .rshift_down:
  119.         or      [ctrlstate], 2
  120.         jmp     .event
  121. .rshift_up:
  122.         and     [ctrlstate], not 2
  123.         jmp     .event
  124. .alt_down:
  125.         test    ah, ah
  126.         jnz     .ralt_down
  127.         or      [ctrlstate], 0x10
  128.         jmp     .event
  129. .ralt_down:
  130.         or      [ctrlstate], 0x20
  131.         jmp     .event
  132. .alt_up:
  133.         test    ah, ah
  134.         jnz     .ralt_up
  135.         and     [ctrlstate], not 0x10
  136.         jmp     .event
  137. .ralt_up:
  138.         and     [ctrlstate], not 0x20
  139.         jmp     .event
  140. .exit:
  141.         popad
  142.         push    eax
  143.         push    0
  144.         push    dword [esp+12+8]
  145.         call    HideGenericBox
  146.         pop     eax
  147.         pop     [cursor_y]
  148.         pop     [cursor_x]
  149.         pushad
  150.         call    draw_image
  151.         popad
  152.         ret     8
  153.  
  154. ; int __stdcall ShowGenericBox(DLGTEMPLATE* dlg, void* DlgProc);
  155. ShowGenericBox:
  156.         pushad
  157.         mov     ebx, [esp+20h+4]
  158. ; center window if required
  159.         push    [ebx+dlgtemplate.x]
  160.         push    [ebx+dlgtemplate.y]
  161.         cmp     [ebx+dlgtemplate.x], -1
  162.         jnz     @f
  163.         mov     eax, [cur_width]
  164.         sub     eax, [ebx+dlgtemplate.width]
  165.         shr     eax, 1
  166.         mov     [ebx+dlgtemplate.x], eax
  167. @@:
  168.         cmp     [ebx+dlgtemplate.y], -1
  169.         jnz     @f
  170.         mov     eax, [cur_height]
  171.         sub     eax, [ebx+dlgtemplate.height]
  172.         shr     eax, 1
  173.         mov     [ebx+dlgtemplate.y], eax
  174. @@:
  175. ; some checks
  176.         mov     eax, [ebx+dlgtemplate.x]
  177.         cmp     eax, 1
  178.         jl      .sizeerr
  179.         add     eax, [ebx+dlgtemplate.width]
  180.         cmp     eax, [cur_width]
  181.         jge     .sizeerr
  182.         mov     eax, [ebx+dlgtemplate.y]
  183.         cmp     eax, 1
  184.         jl      .sizeerr
  185.         add     eax, [ebx+dlgtemplate.height]
  186.         cmp     eax, [cur_height]
  187.         jge     .sizeerr
  188.         cmp     [ebx+dlgtemplate.border_size_x], 1
  189.         jl      .sizeerr
  190.         cmp     [ebx+dlgtemplate.border_size_y], 1
  191.         jge     .sizeok
  192. .sizeerr:
  193.         pop     [ebx+dlgtemplate.y]
  194.         pop     [ebx+dlgtemplate.x]
  195.         popad
  196.         or      eax, -1
  197.         ret     8
  198. .sizeok:
  199. ; set color if required
  200.         test    byte [ebx+dlgtemplate.flags], 1
  201.         jz      @f
  202.         mov     edi, dialog_colors
  203.         jmp     .setcolor
  204. @@:
  205.         test    byte [ebx+dlgtemplate.flags], 2
  206.         jz      @f
  207.         mov     edi, warning_colors
  208. .setcolor:
  209.         mov     al, [edi + dialog_main_color-dialog_colors]
  210.         mov     [ebx+dlgtemplate.main_color], al
  211.         mov     al, [edi + dialog_border_color-dialog_colors]
  212.         mov     [ebx+dlgtemplate.border_color], al
  213.         mov     al, [edi + dialog_header_color-dialog_colors]
  214.         mov     [ebx+dlgtemplate.header_color], al
  215. @@:
  216. ; allocate memory for data under dialog
  217. ; for 'No memory' dialog use static data area
  218.         mov     eax, nomem_dlgsavearea
  219.         cmp     ebx, nomem_dlgdata
  220.         jz      .allocated
  221.         mov     eax, [ebx+dlgtemplate.width]
  222.         add     eax, [ebx+dlgtemplate.border_size_x]
  223.         add     eax, [ebx+dlgtemplate.border_size_x]
  224.         inc     eax
  225.         inc     eax
  226.         mov     edx, [ebx+dlgtemplate.height]
  227.         add     edx, [ebx+dlgtemplate.border_size_y]
  228.         add     edx, [ebx+dlgtemplate.border_size_y]
  229.         inc     edx
  230.         mul     edx
  231.         lea     ecx, [eax*2+8]
  232.         call    xpgalloc
  233.         test    eax, eax
  234.         jnz     @f
  235.         pop     [ebx+dlgtemplate.y]
  236.         pop     [ebx+dlgtemplate.x]
  237.         popad
  238.         or      eax, -1
  239.         ret     8
  240. @@:
  241. .allocated:
  242.         mov     [ebx+dlgtemplate.dataptr], eax
  243.         pop     dword [eax+4]
  244.         pop     dword [eax]
  245.         lea     ebp, [eax+8]
  246. ; save data
  247.         mov     eax, [ebx+dlgtemplate.y]
  248.         add     eax, [ebx+dlgtemplate.height]
  249.         add     eax, [ebx+dlgtemplate.border_size_y]
  250.         inc     eax
  251.         push    eax
  252.         mov     eax, [ebx+dlgtemplate.x]
  253.         add     eax, [ebx+dlgtemplate.width]
  254.         add     eax, [ebx+dlgtemplate.border_size_x]
  255.         inc     eax
  256.         inc     eax
  257.         push    eax
  258.         mov     eax, [ebx+dlgtemplate.y]
  259.         sub     eax, [ebx+dlgtemplate.border_size_y]
  260.         push    eax
  261.         mov     eax, [ebx+dlgtemplate.x]
  262.         sub     eax, [ebx+dlgtemplate.border_size_x]
  263.         push    eax
  264.         call    save_console_data
  265. ; draw shadow
  266.         test    byte [ebx+dlgtemplate.flags], 4
  267.         jnz     .noshadow
  268.         call    draw_dialog_shadow
  269. .noshadow:
  270.         popad
  271.         push    dword [esp+8]
  272.         push    dword [esp+8]
  273.         call    DrawGenericBox
  274.         xor     eax, eax
  275.         ret     8
  276.  
  277. draw_dialog_shadow:
  278.         mov     eax, [ebx+dlgtemplate.x]
  279.         sub     eax, [ebx+dlgtemplate.border_size_x]
  280.         ja      @f
  281.         xor     eax, eax
  282. @@:
  283.         inc     eax
  284.         inc     eax
  285.         mov     edx, [ebx+dlgtemplate.y]
  286.         sub     edx, [ebx+dlgtemplate.border_size_y]
  287.         ja      @f
  288.         xor     edx, edx
  289. @@:
  290.         inc     edx
  291.         call    get_console_ptr
  292.         mov     ecx, [ebx+dlgtemplate.y]
  293.         add     ecx, [ebx+dlgtemplate.height]
  294.         add     ecx, [ebx+dlgtemplate.border_size_y]
  295.         inc     ecx
  296.         cmp     ecx, [cur_height]
  297.         jb      @f
  298.         mov     ecx, [cur_height]
  299. @@:
  300.         sub     ecx, edx
  301.         mov     edx, ecx
  302.         mov     ecx, [ebx+dlgtemplate.x]
  303.         add     ecx, [ebx+dlgtemplate.width]
  304.         add     ecx, [ebx+dlgtemplate.border_size_x]
  305.         inc     ecx
  306.         inc     ecx
  307.         cmp     ecx, [cur_width]
  308.         jb      @f
  309.         mov     ecx, [cur_width]
  310. @@:
  311.         sub     ecx, eax
  312.         mov     eax, ecx
  313. .shadow_loop:
  314.         mov     ecx, eax
  315.         push    edi
  316. .sl1:
  317.         inc     edi
  318.         test    byte [edi], 0x0F
  319.         jnz     @f
  320.         or      byte [edi], 8
  321. @@:
  322.         and     byte [edi], 0x0F
  323.         inc     edi
  324.         loop    .sl1
  325.         pop     edi
  326.         add     edi, [cur_width]
  327.         add     edi, [cur_width]
  328.         dec     edx
  329.         jnz     .shadow_loop
  330.         ret
  331.  
  332. ; void __stdcall DrawGenericBox(DLGDATA* dlg, void* DlgProc)
  333. DrawGenericBox:
  334.         pushad
  335.         mov     ebx, [esp+24h]
  336. ; draw area background
  337.         mov     eax, [ebx+dlgtemplate.x]
  338.         sub     eax, [ebx+dlgtemplate.border_size_x]
  339.         ja      @f
  340.         xor     eax, eax
  341. @@:
  342.         mov     edx, [ebx+dlgtemplate.y]
  343.         sub     edx, [ebx+dlgtemplate.border_size_y]
  344.         ja      @f
  345.         xor     edx, edx
  346. @@:
  347.         call    get_console_ptr
  348.         mov     ecx, [ebx+dlgtemplate.x]
  349.         add     ecx, [ebx+dlgtemplate.width]
  350.         add     ecx, [ebx+dlgtemplate.border_size_x]
  351.         cmp     ecx, [cur_width]
  352.         jb      @f
  353.         mov     ecx, [cur_width]
  354. @@:
  355.         sub     ecx, eax
  356.         mov     esi, ecx
  357.         mov     ecx, [ebx+dlgtemplate.y]
  358.         add     ecx, [ebx+dlgtemplate.height]
  359.         add     ecx, [ebx+dlgtemplate.border_size_y]
  360.         cmp     ecx, [cur_height]
  361.         jb      @f
  362.         mov     ecx, [cur_height]
  363. @@:
  364.         sub     ecx, edx
  365.         mov     edx, ecx
  366.         mov     al, ' '
  367.         mov     ah, [ebx+dlgtemplate.border_color]
  368. .1:
  369.         mov     ecx, esi
  370.         push    edi
  371.         rep     stosw
  372.         pop     edi
  373.         add     edi, [cur_width]
  374.         add     edi, [cur_width]
  375.         dec     edx
  376.         jnz     .1
  377. ; draw border
  378.         mov     eax, [ebx+dlgtemplate.x]
  379.         dec     eax
  380.         mov     edx, [ebx+dlgtemplate.y]
  381.         dec     edx
  382.         call    get_console_ptr
  383.         mov     edx, [ebx+dlgtemplate.height]
  384.         inc     edx
  385.         inc     edx
  386.         mov     ah, [ebx+dlgtemplate.border_color]
  387.         push    ebx
  388.         mov     ebx, [ebx+dlgtemplate.width]
  389.         inc     ebx
  390.         inc     ebx
  391.         call    draw_border
  392.         pop     ebx
  393. ; draw header
  394.         mov     esi, [ebx+dlgtemplate.title]
  395.         test    esi, esi
  396.         jz      .noheader
  397.         cmp     byte [esi], 0
  398.         jz      .noheader
  399.         push    esi
  400. @@:     lodsb
  401.         test    al, al
  402.         jnz     @b
  403.         mov     eax, esi
  404.         pop     esi
  405.         sub     eax, esi
  406.         inc     eax     ; eax = длина заголовка + 2
  407.         mov     ecx, [ebx+dlgtemplate.width]
  408.         cmp     eax, ecx
  409.         jbe     .fullhea
  410.         sub     ecx, 5
  411.         jb      .noheader
  412.         xor     edx, edx
  413.         jmp     .drawhea
  414. .fullhea:
  415.         mov     edx, ecx
  416.         sub     edx, eax
  417.         shr     edx, 1
  418. .drawhea:
  419.         mov     eax, [ebx+dlgtemplate.x]
  420.         add     eax, edx
  421.         mov     edx, [ebx+dlgtemplate.y]
  422.         dec     edx
  423.         call    get_console_ptr
  424.         mov     ah, [ebx+dlgtemplate.header_color]
  425.         mov     al, ' '
  426.         stosw
  427. .2:
  428.         dec     ecx
  429.         jz      .3
  430.         lodsb
  431.         test    al, al
  432.         jz      .4
  433.         stosw
  434.         jmp     .2
  435. .3:
  436.         mov     al, '.'
  437.         stosw
  438.         stosw
  439.         stosw
  440. .4:
  441.         mov     al, ' '
  442.         stosw
  443. .noheader:
  444. ; draw window background
  445.         mov     eax, [ebx+dlgtemplate.x]
  446.         mov     edx, [ebx+dlgtemplate.y]
  447.         call    get_console_ptr
  448.         mov     ah, [ebx+dlgtemplate.main_color]
  449.         mov     al, ' '
  450.         mov     edx, [ebx+dlgtemplate.height]
  451. @@:
  452.         mov     ecx, [ebx+dlgtemplate.width]
  453.         push    edi
  454.         rep     stosw
  455.         pop     edi
  456.         add     edi, [cur_width]
  457.         add     edi, [cur_width]
  458.         dec     edx
  459.         jnz     @b
  460. ; send redraw message
  461.         mov     eax, [esp+28h]
  462.         push    0
  463.         push    0
  464.         push    1
  465.         push    ebx
  466.         call    eax
  467.         call    draw_image
  468.         popad
  469.         ret     8
  470.  
  471. ; void __stdcall HideGenericBox(DLGTEMPLATE* dlg, int bRedrawWindow);
  472. HideGenericBox:
  473. ; void __stdcall HideDialogBox(DLGDATA* dlg, int bRedrawWindow);
  474. HideDialogBox:
  475.         pushad
  476.         mov     ebx, [esp+24h]
  477.         mov     ebp, [ebx+dlgtemplate.dataptr]
  478.         add     ebp, 8
  479. ; restore data
  480.         mov     eax, [ebx+dlgtemplate.y]
  481.         add     eax, [ebx+dlgtemplate.height]
  482.         add     eax, [ebx+dlgtemplate.border_size_y]
  483.         inc     eax
  484.         push    eax
  485.         mov     eax, [ebx+dlgtemplate.x]
  486.         add     eax, [ebx+dlgtemplate.width]
  487.         add     eax, [ebx+dlgtemplate.border_size_x]
  488.         inc     eax
  489.         inc     eax
  490.         push    eax
  491.         mov     eax, [ebx+dlgtemplate.y]
  492.         sub     eax, [ebx+dlgtemplate.border_size_y]
  493.         push    eax
  494.         mov     eax, [ebx+dlgtemplate.x]
  495.         sub     eax, [ebx+dlgtemplate.border_size_x]
  496.         push    eax
  497.         call    restore_console_data
  498.         call    draw_keybar
  499.         lea     ecx, [ebp-8]
  500.         push    dword [ecx]
  501.         push    dword [ecx+4]
  502.         pop     [ebx+dlgtemplate.y]
  503.         pop     [ebx+dlgtemplate.x]
  504.         cmp     ebx, nomem_dlgdata
  505.         jz      @f
  506.         call    pgfree
  507. @@:
  508.         or      [cursor_x], -1
  509.         or      [cursor_y], -1
  510.         cmp     dword [esp+28h], 0
  511.         jz      @f
  512.         call    draw_image
  513. @@:
  514.         popad
  515.         ret     8
  516.  
  517. save_console_data:
  518.         cmp     dword [esp+4], 0
  519.         jge     @f
  520.         and     dword [esp+4], 0
  521. @@:
  522.         cmp     dword [esp+8], 0
  523.         jge     @f
  524.         and     dword [esp+8], 0
  525. @@:
  526.         mov     eax, [esp+12]
  527.         cmp     eax, [cur_width]
  528.         jbe     @f
  529.         mov     eax, [cur_width]
  530. @@:
  531.         sub     eax, [esp+4]
  532.         ja      @f
  533.         ret     16
  534. @@:
  535.         mov     [esp+12], eax
  536.         mov     eax, [esp+16]
  537.         cmp     eax, [cur_height]
  538.         jbe     @f
  539.         mov     eax, [cur_height]
  540. @@:
  541.         sub     eax, [esp+8]
  542.         ja      @f
  543.         ret     16
  544. @@:
  545.         mov     [esp+16], eax
  546.         mov     eax, [esp+4]
  547.         mov     edx, [esp+8]
  548.         call    get_console_ptr
  549.         mov     esi, edi
  550.         mov     edi, ebp
  551. .l:
  552.         mov     ecx, [esp+12]
  553.         push    esi
  554.         shr     ecx, 1
  555.         rep     movsd
  556.         adc     ecx, ecx
  557.         rep     movsw
  558.         pop     esi
  559.         add     esi, [cur_width]
  560.         add     esi, [cur_width]
  561.         dec     dword [esp+16]
  562.         jnz     .l
  563.         ret     16
  564.  
  565. restore_console_data:
  566.         cmp     dword [esp+4], 0
  567.         jge     @f
  568.         and     dword [esp+4], 0
  569. @@:
  570.         cmp     dword [esp+8], 0
  571.         jge     @f
  572.         and     dword [esp+8], 0
  573. @@:
  574.         mov     eax, [esp+12]
  575.         cmp     eax, [cur_width]
  576.         jbe     @f
  577.         mov     eax, [cur_width]
  578. @@:
  579.         sub     eax, [esp+4]
  580.         ja      @f
  581.         ret     16
  582. @@:
  583.         mov     [esp+12], eax
  584.         mov     eax, [esp+16]
  585.         cmp     eax, [cur_height]
  586.         jbe     @f
  587.         mov     eax, [cur_height]
  588. @@:
  589.         sub     eax, [esp+8]
  590.         ja      @f
  591.         ret     16
  592. @@:
  593.         mov     [esp+16], eax
  594.         mov     eax, [esp+4]
  595.         mov     edx, [esp+8]
  596.         call    get_console_ptr
  597.         mov     esi, ebp
  598. .l:
  599.         mov     ecx, [esp+12]
  600.         push    edi
  601.         shr     ecx, 1
  602.         rep     movsd
  603.         adc     ecx, ecx
  604.         rep     movsw
  605.         pop     edi
  606.         add     edi, [cur_width]
  607.         add     edi, [cur_width]
  608.         dec     dword [esp+16]
  609.         jnz     .l
  610.         ret     16
  611.  
  612. ; int __stdcall menu(void* variants, const char* title, unsigned flags);
  613. ; variants указывает на текущий элемент в двусвязном линейном списке
  614. menu:
  615.         pop     eax
  616.         push    [cur_height]
  617.         push    [cur_width]
  618.         push    0
  619.         push    0
  620.         push    eax
  621.  
  622. ; int __stdcall menu_centered_in(unsigned left, unsigned top, unsigned width, unsigned height,
  623. ;       void* variants, const char* title, unsigned flags);
  624. menu_centered_in:
  625.         pushad
  626.         mov     ecx, 60
  627. ; 40 bytes for dlgtemplate + additional:
  628. ; +40: dd cur_variant
  629. ; +44: dd num_variants
  630. ; +48: dd begin_variant
  631. ; +52: dd end_variant
  632. ; +56: dd cur_variant_idx
  633.         call    xpgalloc
  634.         test    eax, eax
  635.         jnz     @f
  636. .ret_bad:
  637.         popad
  638.         or      eax, -1
  639.         ret     28
  640. @@:
  641.         mov     ebx, eax
  642.         mov     eax, 1
  643.         test    byte [esp+20h+28], 1
  644.         jz      @f
  645.         mov     al, 3
  646. @@:
  647.         mov     [ebx+dlgtemplate.border_size_x], eax
  648.         inc     eax
  649.         shr     eax, 1
  650.         mov     [ebx+dlgtemplate.border_size_y], eax
  651. ; Находим ширину и высоту окна
  652.         xor     eax, eax
  653.         xor     ecx, ecx
  654.         mov     esi, [esp+20h+20]
  655.         mov     [ebx+40], esi
  656.         mov     dword [ebx+56], eax
  657. @@:
  658.         cmp     dword [esi+4], eax
  659.         jz      .find_width
  660.         mov     esi, [esi+4]
  661.         inc     dword [ebx+56]
  662.         jmp     @b
  663. .find_width:
  664.         mov     [ebx+48], esi
  665.         add     esi, 8
  666.         push    esi
  667.         xor     edx, edx
  668. .fw1:
  669.         cmp     byte [esi], '&'
  670.         jnz     @f
  671.         mov     dl, 1
  672. @@:
  673.         inc     esi
  674.         cmp     byte [esi-1], 0
  675.         jnz     .fw1
  676.         sub     esi, [esp]
  677.         sub     esi, edx
  678.         dec     esi
  679.         cmp     eax, esi
  680.         ja      @f
  681.         mov     eax, esi
  682. @@:
  683.         inc     ecx
  684.         pop     esi
  685.         mov     esi, [esi-8]
  686.         test    esi, esi
  687.         jnz     .find_width
  688.         add     eax, 3
  689.         add     eax, [ebx+dlgtemplate.border_size_x]
  690.         add     eax, [ebx+dlgtemplate.border_size_x]
  691.         cmp     eax, [cur_width]
  692.         jb      @f
  693.         mov     eax, [cur_width]
  694. @@:
  695.         sub     eax, [ebx+dlgtemplate.border_size_x]
  696.         sub     eax, [ebx+dlgtemplate.border_size_x]
  697.         mov     [ebx+dlgtemplate.width], eax
  698.         mov     [ebx+dlgtemplate.height], ecx
  699.         mov     [ebx+44], ecx
  700.         sub     eax, [esp+20h+12]
  701.         neg     eax
  702.         sar     eax, 1
  703.         add     eax, [esp+20h+4]
  704.         cmp     eax, [ebx+dlgtemplate.border_size_x]
  705.         jge     @f
  706.         mov     eax, [ebx+dlgtemplate.border_size_x]
  707. @@:
  708.         push    eax
  709.         add     eax, [ebx+dlgtemplate.width]
  710.         add     eax, [ebx+dlgtemplate.border_size_x]
  711.         cmp     eax, [cur_width]
  712.         jbe     @f
  713.         pop     eax
  714.         mov     eax, [cur_width]
  715.         sub     eax, [ebx+dlgtemplate.width]
  716.         sub     eax, [ebx+dlgtemplate.border_size_x]
  717.         push    eax
  718. @@:
  719.         pop     [ebx+dlgtemplate.x]
  720.         sub     ecx, [esp+20h+16]
  721.         neg     ecx
  722.         sar     ecx, 1
  723.         add     ecx, [esp+20h+8]
  724.         cmp     ecx, [ebx+dlgtemplate.border_size_y]
  725.         jge     @f
  726.         mov     ecx, [ebx+dlgtemplate.border_size_y]
  727. @@:
  728.         push    ecx
  729.         add     ecx, [ebx+dlgtemplate.height]
  730.         add     ecx, [ebx+dlgtemplate.border_size_y]
  731.         cmp     ecx, [cur_height]
  732.         jbe     @f
  733.         pop     ecx
  734.         mov     ecx, [cur_height]
  735.         sub     ecx, [ebx+dlgtemplate.height]
  736.         sub     ecx, [ebx+dlgtemplate.border_size_y]
  737.         push    ecx
  738. @@:
  739.         pop     [ebx+dlgtemplate.y]
  740.         mov     eax, [cur_height]
  741.         sub     eax, 6
  742.         cmp     [ebx+dlgtemplate.height], eax
  743.         jbe     .small_height
  744.         mov     [ebx+dlgtemplate.height], eax
  745.         mov     [ebx+dlgtemplate.y], 3
  746. .small_height:
  747.         mov     ecx, [ebx+dlgtemplate.height]
  748.         mov     eax, [ebx+40]
  749.         mov     [ebx+48], eax
  750.         dec     ecx
  751.         jz      .skip
  752.         push    ecx
  753. @@:
  754.         cmp     dword [eax+4], 0
  755.         jz      @f
  756.         mov     eax, [eax+4]
  757.         loop    @b
  758. @@:
  759.         mov     [ebx+48], eax
  760.         pop     ecx
  761. .loop:
  762.         mov     eax, [eax]
  763.         loop    .loop
  764. .skip:
  765.         mov     [ebx+52], eax
  766.         mov     eax, [esp+20h+24]
  767.         mov     [ebx+dlgtemplate.title], eax
  768.         mov     al, [menu_normal_color]
  769.         mov     [ebx+dlgtemplate.main_color], al
  770.         mov     al, [menu_border_color]
  771.         mov     [ebx+dlgtemplate.border_color], al
  772.         mov     al, [menu_header_color]
  773.         mov     [ebx+dlgtemplate.header_color], al
  774.         push    MenuDlgProc
  775.         push    ebx
  776.         call    GenericBox
  777.         mov     [esp+28], eax
  778.         mov     ecx, ebx
  779.         call    pgfree
  780.         popad
  781.         ret     28
  782.  
  783. MenuDlgProc:
  784.         mov     eax, [esp+8]
  785.         cmp     al, 1
  786.         jz      .draw
  787.         cmp     al, 2
  788.         jz      .key
  789.         ret     16
  790. .draw:
  791.         call    .dodraw
  792.         ret     16
  793. .prev:
  794.         mov     eax, [ebx+40]
  795.         cmp     dword [eax+4], 0
  796.         jz      .end
  797.         call    .line_prev
  798. .posret:
  799.         mov     [ebx+40], eax
  800. .redraw:
  801.         call    .dodraw
  802.         call    draw_image
  803.         xor     eax, eax
  804.         ret     16
  805. .next:
  806.         mov     eax, [ebx+40]
  807.         cmp     dword [eax], 0
  808.         jz      .home
  809.         call    .line_next
  810.         jmp     .posret
  811. .pgdn:
  812.         mov     eax, [ebx+40]
  813.         mov     ecx, [ebx+dlgtemplate.height]
  814. .pgdnl:
  815.         cmp     dword [eax], 0
  816.         jz      .posret
  817.         call    .line_next
  818.         loop    .pgdnl
  819.         jmp     .posret
  820. .key:
  821.         mov     al, [esp+12]
  822.         cmp     al, 0x48
  823.         jz      .prev
  824.         cmp     al, 0x4B
  825.         jz      .prev
  826.         cmp     al, 0x4D
  827.         jz      .next
  828.         cmp     al, 0x50
  829.         jz      .next
  830.         cmp     al, 0x1C
  831.         jz      .enter
  832.         cmp     al, 1
  833.         jz      .esc
  834.         cmp     al, 0x47
  835.         jz      .home
  836.         cmp     al, 0x4F
  837.         jz      .end
  838.         cmp     al, 0x51
  839.         jz      .pgdn
  840.         cmp     al, 0x49
  841.         jz      .pgup
  842.         cmp     al, 0x52
  843.         jz      .ins
  844.         cmp     al, 0x53
  845.         jz      .del
  846.         mov     edx, [ebx+40]
  847. @@:
  848.         cmp     dword [edx+4], 0
  849.         jz      @f
  850.         mov     edx, [edx+4]
  851.         jmp     @b
  852. @@:
  853. .l:
  854.         lea     esi, [edx+7]
  855. @@:
  856.         inc     esi
  857.         cmp     byte [esi], 0
  858.         jz      .n
  859.         cmp     byte [esi], '&'
  860.         jnz     @b
  861.         movzx   ecx, byte [esi+1]
  862.         cmp     [ascii2scan+ecx], al
  863.         jnz     .n
  864.         mov     eax, edx
  865.         ret     16
  866. .n:
  867.         mov     edx, [edx]
  868.         test    edx, edx
  869.         jnz     .l
  870. .ret:
  871.         xor     eax, eax
  872.         ret     16
  873. .pgup:
  874.         mov     eax, [ebx+40]
  875.         mov     ecx, [ebx+dlgtemplate.height]
  876. .pgupl:
  877.         cmp     dword [eax+4], 0
  878.         jz      .posret
  879.         call    .line_prev
  880.         loop    .pgupl
  881.         jmp     .posret
  882. .home:
  883.         mov     eax, [ebx+40]
  884. @@:
  885.         cmp     dword [eax+4], 0
  886.         jz      @f
  887.         mov     eax, [eax+4]
  888.         jmp     @b
  889. @@:
  890.         mov     [ebx+48], eax
  891.         push    eax
  892.         mov     ecx, [ebx+dlgtemplate.height]
  893.         dec     ecx
  894.         jz      .h1
  895. .h2:
  896.         mov     eax, [eax]
  897.         loop    .h2
  898. .h1:
  899.         mov     [ebx+52], eax
  900.         pop     eax
  901.         and     dword [ebx+56], 0
  902.         jmp     .posret
  903. .end:
  904.         mov     eax, [ebx+40]
  905. @@:
  906.         cmp     dword [eax], 0
  907.         jz      @f
  908.         mov     eax, [eax]
  909.         jmp     @b
  910. @@:
  911.         mov     [ebx+52], eax
  912.         push    eax
  913.         mov     ecx, [ebx+dlgtemplate.height]
  914.         dec     ecx
  915.         jz      .e1
  916. .e2:
  917.         mov     eax, [eax+4]
  918.         loop    .e2
  919. .e1:
  920.         mov     [ebx+48], eax
  921.         mov     eax, [ebx+44]
  922.         dec     eax
  923.         mov     [ebx+56], eax
  924.         pop     eax
  925.         jmp     .posret
  926. .esc:
  927.         or      eax, -1
  928.         ret     16
  929. .enter:
  930.         mov     eax, [ebx+40]
  931.         ret     16
  932. .ins:
  933.         push    5
  934.         pop     edx
  935.         jmp     @f
  936. .del:
  937.         push    4
  938.         pop     edx
  939. @@:
  940.         mov     eax, [ebx+40]
  941.         cmp     byte [eax+8], '/'
  942.         jnz     @f
  943.         cmp     word [eax+9], 'cd'
  944.         jnz     @f
  945.         movzx   ecx, byte [eax+11]
  946.         sub     ecx, '0'
  947.         push    24
  948.         pop     eax
  949.         mov     ebx, edx
  950.         int     40h
  951. @@:
  952.         xor     eax, eax
  953.         ret     16
  954.  
  955. .line_prev:
  956.         cmp     eax, [ebx+48]
  957.         jnz     @f
  958.         mov     edx, [ebx+48]
  959.         mov     edx, [edx+4]
  960.         mov     [ebx+48], edx
  961.         mov     edx, [ebx+52]
  962.         mov     edx, [edx+4]
  963.         mov     [ebx+52], edx
  964. @@:
  965.         mov     eax, [eax+4]
  966.         dec     dword [ebx+56]
  967.         ret
  968. .line_next:
  969.         cmp     eax, [ebx+52]
  970.         jnz     @f
  971.         mov     edx, [ebx+48]
  972.         mov     edx, [edx]
  973.         mov     [ebx+48], edx
  974.         mov     edx, [ebx+52]
  975.         mov     edx, [edx]
  976.         mov     [ebx+52], edx
  977. @@:
  978.         mov     eax, [eax]
  979.         inc     dword [ebx+56]
  980.         ret
  981.  
  982. .dodraw:
  983.         mov     eax, [ebx+dlgtemplate.x]
  984.         mov     edx, [ebx+dlgtemplate.y]
  985.         call    get_console_ptr
  986.         mov     esi, [ebx+48]
  987. .0:
  988.         xor     edx, edx
  989.         mov     ah, [menu_selected_color]
  990.         cmp     esi, [ebx+40]
  991.         jz      @f
  992.         mov     ah, [menu_normal_color]
  993. @@:
  994.         push    edi
  995.         mov     ecx, [ebx+dlgtemplate.width]
  996.         mov     al, ' '
  997.         stosw
  998.         dec     ecx
  999.         stosw
  1000.         dec     ecx
  1001.         dec     ecx
  1002.         push    esi
  1003.         add     esi, 8
  1004. @@:
  1005.         lodsb
  1006.         test    al, al
  1007.         jz      @f
  1008.         cmp     al, '&'
  1009.         jnz     .noamp
  1010.         test    dl, dl
  1011.         jnz     .noamp
  1012.         mov     dl, 1
  1013.         lodsb
  1014.         push    eax
  1015.         mov     ah, [menu_selected_highlight_color]
  1016.         push    ecx
  1017.         mov     ecx, [esp+8]
  1018.         cmp     ecx, [ebx+40]
  1019.         pop     ecx
  1020.         jz      .amp1
  1021.         mov     ah, [menu_highlight_color]
  1022. .amp1:
  1023.         stosw
  1024.         pop     eax
  1025.         jmp     .amp2
  1026. .noamp:
  1027.         stosw
  1028. .amp2:
  1029.         loop    @b
  1030.         mov     al, ' '
  1031.         cmp     byte [esi], 0
  1032.         jnz     .1
  1033.         lodsb
  1034.         jmp     .1
  1035. @@:
  1036.         mov     al, ' '
  1037. .1:
  1038.         stosw
  1039.         mov     al, ' '
  1040.         rep     stosw
  1041.         pop     esi edi
  1042.         add     edi, [cur_width]
  1043.         add     edi, [cur_width]
  1044.         cmp     esi, [ebx+52]
  1045.         jz      @f
  1046.         mov     esi, [esi]
  1047.         test    esi, esi
  1048.         jnz     .0
  1049. @@:
  1050. ; Линейка прокрутки
  1051.         mov     ecx, [ebx+dlgtemplate.height]
  1052.         cmp     ecx, [ebx+44]
  1053.         jz      .noscrollbar
  1054.         sub     ecx, 2
  1055.         jbe     .noscrollbar
  1056.         mov     eax, [ebx+56]
  1057.         mul     ecx
  1058.         div     dword [ebx+44]
  1059.         push    eax
  1060.         mov     eax, [ebx+dlgtemplate.x]
  1061.         add     eax, [ebx+dlgtemplate.width]
  1062.         mov     edx, [ebx+dlgtemplate.y]
  1063.         call    get_console_ptr
  1064.         pop     edx
  1065.         inc     edx
  1066.         mov     al, 0x1E
  1067.         mov     ah, [menu_scrollbar_color]
  1068.         mov     [edi], ax
  1069.         add     edi, [cur_width]
  1070.         add     edi, [cur_width]
  1071. .2:
  1072.         mov     al, 0xB2
  1073.         dec     edx
  1074.         jz      @f
  1075.         mov     al, 0xB0
  1076. @@:
  1077.         mov     [edi], ax
  1078.         add     edi, [cur_width]
  1079.         add     edi, [cur_width]
  1080.         loop    .2
  1081.         mov     al, 0x1F
  1082.         stosw
  1083. .noscrollbar:
  1084.         ret
  1085.  
  1086. get_ascii_char:
  1087. ; query keyboard layout
  1088.         pushad
  1089.         mov     al, [ctrlstate]
  1090.         and     al, 3
  1091.         xor     ecx, ecx
  1092.         cmp     al, 1
  1093.         sbb     ecx, -2
  1094.         push    26
  1095.         pop     eax
  1096.         push    2
  1097.         pop     ebx
  1098.         mov     edx, layout
  1099.         int     0x40
  1100.         popad
  1101. ; translate scancode to ASCII
  1102.         movzx   eax, byte [layout+eax]
  1103.         ret
  1104.  
  1105. virtual at 0
  1106. dlgitemtemplate:
  1107. ; Элементы:
  1108. ;       1 = статический текст
  1109. ;       2 = кнопка
  1110. ;       3 = поле редактирования
  1111. ;       4 = горизонтальный разделитель
  1112. ;       5 = флажок
  1113. ;       6 = список
  1114. .type           dd      ?
  1115. .x1             dd      ?
  1116. .y1             dd      ?
  1117. .x2             dd      ?
  1118. .y2             dd      ?
  1119. ; Данные:
  1120. ; для текста: const char* data - ASCIIZ-строка
  1121. ; для кнопки и флажка: const char* data - заголовок
  1122. ; для редактора: struct {unsigned maxlength; unsigned pos; unsigned start;
  1123. ;                        char data[maxlength+1];}* data;
  1124. ; для списка: struct {listitem* curitemptr; unsigned numitems;
  1125. ;               listitem *head; unsigned curitem;}* data;
  1126. ; head = указатель на первый отображаемый элемент,
  1127. ; curitemptr = указатель на выделенный элемент, curitem = его индекс в списке (от 0)
  1128. ; (где struct listitem {listitem* next; listitem* prev; char text[];};)
  1129. .data           dd      ?
  1130. .flags          dd      ?
  1131. ; Флаги:
  1132. ;       0 = выравнивание влево
  1133. ;       1 = выравнивание по центру
  1134. ;       2 = выравнивание вправо
  1135. ;       4 = элемент имеет фокус ввода
  1136. ;       8 = элемент может иметь фокус ввода
  1137. ;       10h: для кнопки = кнопка по умолчанию (Enter на не-кнопке)
  1138. ;            для поля ввода = данные были модифицированы
  1139. ;            для флажка = флажок установлен
  1140. ;       20h: для поля ввода = не отображать вводимые данные (показывать '*')
  1141. .size = $
  1142. end virtual
  1143. ;       struct DLGDATA
  1144. ;       {
  1145. ;               DLGTEMPLATE dialog;     /* window description */
  1146. ;               void* DlgProc;          /* dialog procedure */
  1147. ; /* int __stdcall DlgProc(DLGDATA* dlg, int msg, int param1, int param2); */
  1148. ;               void* user_data;        /* arbitrary user data */
  1149. ;               unsigned num_items;     /* number of items in the following array */
  1150. ;               DLGITEMTEMPLATE items[]; /* array of dialog items */
  1151. ;       }
  1152. ; int __stdcall DialogBox(DLGDATA* dlg);
  1153. DialogBox:
  1154.         push    ManagerDlgProc
  1155.         push    dword [esp+8]
  1156.         call    GenericBox
  1157.         ret     4
  1158.  
  1159. ; int __stdcall ShowDialogBox(DLGDATA* dlg);
  1160. ShowDialogBox:
  1161.         push    ManagerDlgProc
  1162.         push    dword [esp+8]
  1163.         call    ShowGenericBox
  1164.         ret     4
  1165.  
  1166. ; void __stdcall DrawDialogBox(DLGDATA* dlg);
  1167. DrawDialogBox:
  1168.         push    ManagerDlgProc
  1169.         push    dword [esp+8]
  1170.         call    DrawGenericBox
  1171.         ret     4
  1172.  
  1173. ManagerDlgProc:
  1174.         mov     ebp, ebx
  1175.         mov     eax, [esp+8]
  1176.         dec     eax
  1177.         jz      .draw
  1178.         dec     eax
  1179.         jz      .key
  1180.         xor     eax, eax
  1181.         ret     16
  1182. .draw:
  1183.         call    .dodraw
  1184.         ret     16
  1185. .key:
  1186. ; find item with focus
  1187.         add     ebx, dlgtemplate.size+12
  1188.         mov     ecx, [ebx-4]
  1189.         jecxz   .nobtns
  1190. @@:
  1191.         test    [ebx+dlgitemtemplate.flags], 4
  1192.         jnz     @f
  1193.         add     ebx, dlgitemtemplate.size
  1194.         loop    @b
  1195. @@:
  1196. .nobtns:
  1197.         mov     al, [esp+12]
  1198.         cmp     al, 1
  1199.         jz      .esc
  1200.         cmp     al, 0x1C
  1201.         jz      .enter
  1202.         cmp     al, 0xF
  1203.         jz      .tab
  1204.         cmp     al, 0x48
  1205.         jz      .up
  1206.         cmp     al, 0x50
  1207.         jz      .down
  1208.         jecxz   .nobtns2
  1209.         cmp     [ebx+dlgitemtemplate.type], 3
  1210.         jz      .key_edit
  1211.         cmp     [ebx+dlgitemtemplate.type], 5
  1212.         jnz     @f
  1213.         cmp     al, 0x39
  1214.         jnz     @f
  1215.         xor     [ebx+dlgitemtemplate.flags], 10h
  1216.         jmp     .ret_draw
  1217. @@:
  1218. .nobtns2:
  1219.         cmp     al, 0x4B
  1220.         jz      .left
  1221.         cmp     al, 0x4D
  1222.         jz      .right
  1223. .ret0:
  1224.         xor     eax, eax
  1225.         ret     16
  1226. .esc:
  1227.         or      eax, -1
  1228.         ret     16
  1229. .enter:
  1230.         cmp     [ebx+dlgitemtemplate.type], 2
  1231.         jnz     @f
  1232. .enter_found:
  1233.         mov     eax, ebx
  1234.         ret     16
  1235. @@:
  1236.         lea     ebx, [ebp+dlgtemplate.size+12]
  1237.         mov     ecx, [ebx-4]
  1238. .enter_find:
  1239.         cmp     [ebx+dlgitemtemplate.type], 2
  1240.         jnz     @f
  1241.         test    [ebx+dlgitemtemplate.flags], 0x10
  1242.         jnz     .enter_found
  1243. @@:
  1244.         add     ebx, dlgitemtemplate.size
  1245.         loop    .enter_find
  1246.         jmp     .enter_found
  1247. .tab:
  1248.         test    [ctrlstate], 3
  1249.         jnz     .shift_tab
  1250. .right:
  1251. .down:
  1252.         jecxz   .ret0
  1253.         and     byte [ebx+dlgitemtemplate.flags], not 4
  1254.         dec     ecx
  1255.         jz      .find_first_btn
  1256. @@:
  1257.         add     ebx, dlgitemtemplate.size
  1258.         test    [ebx+dlgitemtemplate.flags], 8
  1259.         jnz     .btn_found
  1260.         loop    @b
  1261. .find_first_btn:
  1262.         lea     ebx, [ebp+dlgtemplate.size+12]
  1263. @@:
  1264.         test    [ebx+dlgitemtemplate.flags], 8
  1265.         jnz     .btn_found
  1266.         add     ebx, dlgitemtemplate.size
  1267.         jmp     @b
  1268. .btn_found:
  1269.         or      byte [ebx+dlgitemtemplate.flags], 4
  1270. .ret_draw:
  1271.         mov     ebx, ebp
  1272.         call    .dodraw
  1273.         call    draw_image
  1274.         xor     eax, eax
  1275.         ret     16
  1276. .shift_tab:
  1277. .left:
  1278. .up:
  1279.         jecxz   .ret0
  1280.         and     byte [ebx+dlgitemtemplate.flags], not 4
  1281.         sub     ecx, [ebp+dlgtemplate.size+8]
  1282.         neg     ecx
  1283.         jz      .find_last_btn
  1284. @@:
  1285.         sub     ebx, dlgitemtemplate.size
  1286.         test    [ebx+dlgitemtemplate.flags], 8
  1287.         loopz   @b
  1288.         jnz     .btn_found
  1289. .find_last_btn:
  1290.         mov     ebx, [ebp+dlgtemplate.size+8]
  1291.         imul    ebx, dlgitemtemplate.size
  1292.         lea     ebx, [ebx+ebp+dlgtemplate.size+12]
  1293. @@:
  1294.         sub     ebx, dlgitemtemplate.size
  1295.         test    [ebx+dlgitemtemplate.flags], 8
  1296.         jz      @b
  1297.         jmp     .btn_found
  1298. .key_edit:
  1299. ; обработка клавиш в поле ввода
  1300.         test    al, 0x80
  1301.         jnz     .ret0
  1302.         or      [ebx+dlgitemtemplate.flags], 0x10
  1303.         mov     edx, [ebx+dlgitemtemplate.data]
  1304.         cmp     al, 0x4B
  1305.         jz      .editor_left
  1306.         cmp     al, 0x4D
  1307.         jz      .editor_right
  1308.         cmp     al, 0x47
  1309.         jz      .editor_home
  1310.         cmp     al, 0x4F
  1311.         jz      .editor_end
  1312.         cmp     al, 0x0E
  1313.         jz      .editor_backspace
  1314.         cmp     al, 0x53
  1315.         jnz     .editor_char
  1316. .editor_del:
  1317.         mov     ecx, [edx+4]
  1318.         lea     edi, [ecx+edx+12]
  1319.         lea     esi, [edi+1]
  1320.         cmp     byte [edi], 0
  1321.         jz      .ret_test
  1322.         jmp     .copy_and_ret_test
  1323. .editor_left:
  1324.         mov     ecx, [edx+4]
  1325.         jecxz   @f
  1326.         dec     dword [edx+4]
  1327. @@:     jmp     .ret_test
  1328. .editor_right:
  1329.         mov     ecx, [edx+4]
  1330.         cmp     byte [edx+ecx+12], 0
  1331.         jz      @b
  1332.         inc     dword [edx+4]
  1333.         jmp     @b
  1334. .editor_home:
  1335.         and     dword [edx+4], 0
  1336.         jmp     @b
  1337. .editor_end:
  1338.         lea     edi, [edx+12]
  1339.         xor     eax, eax
  1340.         or      ecx, -1
  1341.         repnz   scasb
  1342.         not     ecx
  1343.         dec     ecx
  1344.         mov     [edx+4], ecx
  1345. .ret_test:
  1346.         mov     eax, [edx+4]
  1347.         cmp     [edx+8], eax
  1348.         jl      .ret_test.l1
  1349.         mov     [edx+8], eax
  1350.         jmp     .ret_test.l2
  1351. .ret_test.l1:
  1352.         add     eax, [ebx+dlgitemtemplate.x1]
  1353.         sub     eax, [ebx+dlgitemtemplate.x2]
  1354.         cmp     [edx+8], eax
  1355.         jge     .ret_test.l2
  1356.         mov     [edx+8], eax
  1357. .ret_test.l2:
  1358.         jmp     .ret_draw
  1359. .editor_backspace:
  1360.         mov     ecx, [edx+4]
  1361.         jecxz   .ret_test
  1362.         dec     dword [edx+4]
  1363.         lea     esi, [edx+ecx+12]
  1364.         lea     edi, [esi-1]
  1365. .copy_and_ret_test:
  1366. @@:
  1367.         lodsb
  1368.         stosb
  1369.         test    al, al
  1370.         jnz     @b
  1371.         jmp     .ret_test
  1372. .editor_char:
  1373.         test    [ctrlstate], 0x3C
  1374.         jnz     .ret_draw
  1375.         movzx   eax, al
  1376.         call    get_ascii_char
  1377.         push    eax
  1378. ; insert entered symbol
  1379.         xor     eax, eax
  1380.         lea     edi, [edx+12]
  1381.         or      ecx, -1
  1382.         repnz   scasb
  1383.         not     ecx
  1384.         pop     eax
  1385.         cmp     ecx, [edx]
  1386.         ja      .ret_test       ; buffer capacity exceeded
  1387.         lea     edi, [edx+ecx+12-1]
  1388.         mov     esi, [edx+4]
  1389.         lea     esi, [edx+esi+12]
  1390. @@:
  1391.         mov     cl, [edi]
  1392.         mov     [edi+1], cl
  1393.         dec     edi
  1394.         cmp     edi, esi
  1395.         jae     @b
  1396.         mov     [esi], al
  1397.         inc     dword [edx+4]
  1398. @@:     jmp     .ret_test
  1399.  
  1400. .dodraw:
  1401.         or      [cursor_x], -1
  1402.         or      [cursor_y], -1
  1403.         add     ebx, dlgtemplate.size+8
  1404.         mov     ecx, [ebx]
  1405.         add     ebx, 4
  1406.         jecxz   .done_draw
  1407. .draw_loop:
  1408.         push    ecx
  1409.         mov     eax, [ebx+dlgitemtemplate.type]
  1410.         cmp     eax, draw_functions_num
  1411.         jae     .draw_loop_continue
  1412.         call    [draw_functions + eax*4]
  1413. .draw_loop_continue:
  1414.         pop     ecx
  1415.         add     ebx, dlgitemtemplate.size
  1416.         loop    .draw_loop
  1417. .done_draw:
  1418.         ret
  1419.  
  1420. iglobal
  1421. align 4
  1422. label draw_functions dword
  1423.         dd      ManagerDlgProc.done_draw
  1424.         dd      draw_static_text
  1425.         dd      draw_button
  1426.         dd      draw_editbox
  1427.         dd      draw_h_separator
  1428.         dd      draw_checkbox
  1429.         dd      draw_listbox
  1430. draw_functions_num = ($ - draw_functions) / 4
  1431. endg
  1432.  
  1433. draw_static_text:
  1434. ; рисуем статический текст
  1435.         mov     ah, [dialog_main_color]
  1436.         test    byte [ebp+dlgtemplate.flags], 2
  1437.         jz      draw_text
  1438.         mov     ah, [warning_main_color]
  1439. draw_text:
  1440. ; определяем длину строки
  1441.         mov     esi, [ebx+dlgitemtemplate.data]
  1442. draw_text_esi:
  1443.         test    esi, esi
  1444.         jz      .ret2
  1445.         push    eax
  1446.         push    -1
  1447.         pop     ecx
  1448. @@:
  1449.         inc     ecx
  1450.         cmp     byte [ecx+esi], 0
  1451.         jnz     @b
  1452. ; в ecx длина строки
  1453.         xor     eax, eax
  1454.         mov     edx, [ebx+dlgitemtemplate.x2]
  1455.         sub     edx, [ebx+dlgitemtemplate.x1]
  1456.         inc     edx
  1457.         cmp     ecx, edx
  1458.         jae     .text_draw
  1459.         mov     al, byte [ebx+dlgitemtemplate.flags]
  1460.         and     al, 3
  1461.         jz      .text_align_left
  1462.         cmp     al, 1
  1463.         jz      .text_align_center
  1464. ; текст выровнен вправо
  1465.         mov     eax, edx
  1466.         sub     eax, ecx
  1467.         jmp     .text_draw
  1468. .text_align_center:
  1469.         mov     eax, edx
  1470.         sub     eax, ecx
  1471.         shr     eax, 1
  1472.         jmp     .text_draw
  1473. .text_align_left:
  1474.         xor     eax, eax
  1475. .text_draw:
  1476.         push    ecx
  1477.         push    eax
  1478.         push    edx
  1479.         call    dlgitem_get_console_ptr
  1480.         pop     edx
  1481.         pop     ecx
  1482.         mov     ah, [esp+5]
  1483.         mov     al, ' '
  1484.         rep     stosw
  1485.         pop     ecx
  1486.         cmp     ecx, edx
  1487.         jbe     .text_copy
  1488.         cmp     [ebx+dlgitemtemplate.type], 3
  1489.         jnz     @f
  1490.         mov     ecx, edx
  1491.         jmp     .text_copy
  1492. @@:
  1493.         cmp     edx, 3
  1494.         jb      .ret
  1495.         mov     al, '.'
  1496.         stosw
  1497.         stosw
  1498.         stosw
  1499.         add     esi, ecx
  1500.         mov     ecx, edx
  1501.         sub     ecx, 3
  1502.         sub     esi, ecx
  1503. .text_copy:
  1504.         jecxz   .ret
  1505. ; check for password editboxes
  1506.         cmp     [ebx+dlgitemtemplate.type], 3
  1507.         jnz     @f
  1508.         test    [ebx+dlgitemtemplate.flags], 20h
  1509.         jz      @f
  1510.         mov     al, '*'
  1511.         rep     stosw
  1512.         jmp     .ret
  1513. @@:
  1514.         lodsb
  1515.         stosw
  1516.         loop    @b
  1517. .ret:
  1518.         mov     eax, [ebp+dlgtemplate.x]
  1519.         mov     edx, [ebp+dlgtemplate.y]
  1520.         add     eax, [ebx+dlgitemtemplate.x2]
  1521.         inc     eax
  1522.         add     edx, [ebx+dlgitemtemplate.y1]
  1523.         mov     ecx, edi
  1524.         call    get_console_ptr
  1525.         xchg    ecx, edi
  1526.         sub     ecx, edi
  1527.         shr     ecx, 1
  1528.         pop     eax
  1529.         mov     al, ' '
  1530.         rep     stosw
  1531. .ret2:
  1532.         ret
  1533.  
  1534. draw_button:
  1535.         mov     ecx, dialog_colors
  1536.         test    byte [ebp+dlgtemplate.flags], 2
  1537.         jz      @f
  1538.         mov     ecx, warning_colors
  1539. @@:
  1540.         mov     ah, [dialog_normal_btn_color-dialog_colors+ecx]
  1541.         test    [ebx+dlgitemtemplate.flags], 4
  1542.         jz      @f
  1543.         mov     ah, [dialog_selected_btn_color-dialog_colors+ecx]
  1544. @@:
  1545.         jmp     draw_text
  1546.  
  1547. draw_editbox:
  1548.         mov     edx, [ebx+dlgitemtemplate.data]
  1549.         test    [ebx+dlgitemtemplate.flags], 4
  1550.         jz      @f
  1551.         mov     eax, [ebx+dlgitemtemplate.x1]
  1552.         add     eax, [edx+4]
  1553.         sub     eax, [edx+8]
  1554.         add     eax, [ebp+dlgtemplate.x]
  1555.         mov     [cursor_x], eax
  1556.         mov     eax, [ebx+dlgitemtemplate.y1]
  1557.         add     eax, [ebp+dlgtemplate.y]
  1558.         mov     [cursor_y], eax
  1559. @@:
  1560.         mov     ecx, dialog_colors
  1561.         test    byte [ebp+dlgtemplate.flags], 2
  1562.         jz      @f
  1563.         mov     ecx, warning_colors
  1564. @@:
  1565.         mov     ah, [dialog_edit_color-dialog_colors+ecx]
  1566.         test    [ebx+dlgitemtemplate.flags], 10h
  1567.         jnz     @f
  1568.         mov     ah, [dialog_unmodified_edit_color-dialog_colors+ecx]
  1569. @@:
  1570.         mov     esi, [ebx+dlgitemtemplate.data]
  1571.         add     esi, [edx+8]
  1572.         add     esi, 12
  1573.         jmp     draw_text_esi
  1574.  
  1575. dlgitem_get_console_ptr:
  1576.         mov     eax, [ebx+dlgitemtemplate.x1]
  1577.         mov     edx, [ebx+dlgitemtemplate.y1]
  1578.         mov     ecx, eax
  1579.         add     eax, [ebp+dlgtemplate.x]
  1580.         add     edx, [ebp+dlgtemplate.y]
  1581.         jmp     get_console_ptr
  1582.  
  1583. draw_h_separator:
  1584. ; рисуем горизонтальный разделитель
  1585.         call    dlgitem_get_console_ptr
  1586. .scan:
  1587.         mov     al, 0xC7
  1588.         test    ecx, ecx
  1589.         js      @f
  1590.         mov     al, 0xB6
  1591.         cmp     ecx, [ebp+dlgtemplate.width]
  1592.         jz      @f
  1593.         mov     al, 0xC4
  1594. @@:
  1595.         stosb
  1596.         jz      .done
  1597.         inc     ecx
  1598.         inc     edi
  1599.         cmp     ecx, [ebx+dlgitemtemplate.x2]
  1600.         jb      .scan
  1601. .done:
  1602.         ret
  1603.  
  1604. draw_checkbox:
  1605. ; рисуем флажок
  1606.         call    dlgitem_get_console_ptr
  1607.         test    byte [ebx+dlgitemtemplate.flags], 4
  1608.         jz      @f
  1609.         inc     eax
  1610.         mov     [cursor_x], eax
  1611.         mov     [cursor_y], edx
  1612. @@:
  1613.         mov     ah, [dialog_main_color]
  1614.         test    byte [ebp+dlgtemplate.flags], 2
  1615.         jz      @f
  1616.         mov     ah, [warning_main_color]
  1617. @@:
  1618.         mov     al, '['
  1619.         stosw
  1620.         mov     al, 'x'
  1621.         test    byte [ebx+dlgitemtemplate.flags], 10h
  1622.         jnz     @f
  1623.         mov     al, ' '
  1624. @@:
  1625.         stosw
  1626.         mov     al, ']'
  1627.         stosw
  1628.         mov     al, ' '
  1629.         stosw
  1630.         mov     ecx, [ebx+dlgitemtemplate.x2]
  1631.         sub     ecx, [ebx+dlgitemtemplate.x1]
  1632.         jb      .ret
  1633.         sub     ecx, 3
  1634.         jbe     .ret
  1635.         mov     esi, [ebx+dlgitemtemplate.data]
  1636. @@:
  1637.         lodsb
  1638.         test    al, al
  1639.         jz      .ret
  1640.         stosw
  1641.         loop    @b
  1642. .ret:
  1643.         ret
  1644.  
  1645. draw_listbox:
  1646. ; рисуем список
  1647.         call    dlgitem_get_console_ptr
  1648.         mov     edx, [ebx+dlgitemtemplate.data]
  1649.         mov     esi, [edx+8]
  1650.         mov     eax, [ebx+dlgitemtemplate.y2]
  1651.         sub     eax, [ebx+dlgitemtemplate.y1]
  1652.         push    eax
  1653.         push    eax
  1654. .0:
  1655.         test    esi, esi
  1656.         jz      .listdone
  1657.         push    esi edi
  1658.         push    edx
  1659.         or      edx, -1
  1660.         mov     ecx, [ebx+dlgitemtemplate.x2]
  1661.         sub     ecx, [ebx+dlgitemtemplate.x1]
  1662.         inc     ecx
  1663.         xor     eax, eax
  1664. @@:
  1665.         inc     edx
  1666.         cmp     byte [esi+8+edx], al
  1667.         jnz     @b
  1668. @@:
  1669.         cmp     ecx, edx
  1670.         jae     .text_draw
  1671.         mov     al, byte [ebx+dlgitemtemplate.flags]
  1672.         and     al, 3
  1673.         jz      .text_align_left
  1674.         cmp     al, 1
  1675.         jz      .text_align_center
  1676. ; текст выровнен вправо
  1677.         mov     eax, edx
  1678.         sub     eax, ecx
  1679.         jmp     .text_draw
  1680. .text_align_center:
  1681.         mov     eax, edx
  1682.         sub     eax, ecx
  1683.         shr     eax, 1
  1684.         jmp     .text_draw
  1685. .text_align_left:
  1686. ;        xor     eax, eax
  1687. .text_draw:
  1688.         pop     edx
  1689.         cmp     esi, [edx]
  1690.         lea     esi, [esi+8+eax]
  1691.         mov     ah, [dialog_selected_list_color]
  1692.         jz      @f
  1693.         mov     ah, [dialog_list_color]
  1694. @@:
  1695.         jecxz   .next
  1696. @@:
  1697.         lodsb
  1698.         test    al, al
  1699.         jz      @f
  1700.         stosw
  1701.         loop    @b
  1702. @@:
  1703.         mov     al, ' '
  1704.         rep     stosw
  1705. .next:
  1706.         pop     edi esi
  1707.         add     edi, [cur_width]
  1708.         add     edi, [cur_width]
  1709.         mov     esi, [esi]
  1710.         dec     dword [esp]
  1711.         jns     .0
  1712. .listdone:
  1713.         pop     eax
  1714. ; Линейка прокрутки
  1715.         pop     ecx
  1716.         inc     ecx
  1717.         mov     esi, [edx+4]
  1718.         cmp     ecx, esi
  1719.         jae     .noscrollbar
  1720.         sub     ecx, 2
  1721.         jbe     .noscrollbar
  1722.         mov     eax, [edx+12]
  1723.         mul     ecx
  1724.         div     esi
  1725.         push    eax
  1726.         mov     eax, [ebx+dlgitemtemplate.x2]
  1727.         add     eax, [ebp+dlgtemplate.x]
  1728.         mov     edx, [ebx+dlgitemtemplate.y1]
  1729.         add     edx, [ebp+dlgtemplate.y]
  1730.         call    get_console_ptr
  1731.         pop     edx
  1732.         inc     edx
  1733.         mov     al, 0x1E
  1734.         mov     ah, [dialog_scroll_list_color]
  1735.         mov     [edi], ax
  1736.         add     edi, [cur_width]
  1737.         add     edi, [cur_width]
  1738. .2:
  1739.         mov     al, 0xB1
  1740.         dec     edx
  1741.         jz      @f
  1742.         mov     al, 0xB0
  1743. @@:
  1744.         mov     [edi], ax
  1745.         add     edi, [cur_width]
  1746.         add     edi, [cur_width]
  1747.         loop    .2
  1748.         mov     al, 0x1F
  1749.         stosw
  1750. .noscrollbar:
  1751.         ret
  1752.  
  1753. listbox_key:
  1754.         mov     edx, [ebx+dlgitemtemplate.data]
  1755.         cmp     al, 0x48
  1756.         jz      .prev
  1757.         cmp     al, 0x50
  1758.         jz      .next
  1759.         cmp     al, 0x47
  1760.         jz      .home
  1761.         cmp     al, 0x4F
  1762.         jz      .end
  1763.         cmp     al, 0x51
  1764.         jz      .pgdn
  1765.         cmp     al, 0x49
  1766.         jz      .pgup
  1767.         ret
  1768. .next:
  1769.         call    .calc_last_line
  1770.         mov     eax, [edx]
  1771.         cmp     dword [eax], 0
  1772.         jz      @f
  1773.         call    .line_next
  1774. @@:
  1775.         mov     [edx], eax
  1776.         ret
  1777. .pgdn:
  1778.         call    .calc_last_line
  1779.         mov     eax, [edx]
  1780.         mov     ecx, [ebx+dlgitemtemplate.y2]
  1781.         sub     ecx, [ebx+dlgitemtemplate.y1]
  1782. .pgdnl:
  1783.         cmp     dword [eax], 0
  1784.         jz      @f
  1785.         call    .line_next
  1786.         loop    .pgdnl
  1787. @@:
  1788.         mov     [edx], eax
  1789.         ret
  1790. .prev:
  1791.         mov     eax, [edx]
  1792.         cmp     dword [eax+4], 0
  1793.         jz      @f
  1794.         call    .line_prev
  1795. @@:
  1796.         mov     [edx], eax
  1797.         ret
  1798. .pgup:
  1799.         mov     eax, [edx]
  1800.         mov     ecx, [ebx+dlgitemtemplate.y2]
  1801.         sub     ecx, [ebx+dlgitemtemplate.y1]
  1802. ;        inc     ecx
  1803. .pgupl:
  1804.         cmp     dword [eax+4], 0
  1805.         jz      @f
  1806.         call    .line_prev
  1807.         loop    .pgupl
  1808. @@:
  1809.         mov     [edx], eax
  1810.         ret
  1811. .home:
  1812.         mov     eax, [edx]
  1813. @@:
  1814.         cmp     dword [eax+4], 0
  1815.         jz      @f
  1816.         mov     eax, [eax+4]
  1817.         jmp     @b
  1818. @@:
  1819.         mov     [edx], eax
  1820.         mov     [edx+8], eax
  1821.         and     dword [edx+12], 0
  1822.         ret
  1823. .end:
  1824.         mov     eax, [edx]
  1825. @@:
  1826.         cmp     dword [eax], 0
  1827.         jz      @f
  1828.         mov     eax, [eax]
  1829.         jmp     @b
  1830. @@:
  1831.         mov     [edx], eax
  1832.         mov     ecx, [ebx+dlgitemtemplate.y2]
  1833.         sub     ecx, [ebx+dlgitemtemplate.y1]
  1834.         jz      .e1
  1835. .e2:
  1836.         mov     eax, [eax+4]
  1837.         loop    .e2
  1838. .e1:
  1839.         mov     [edx+8], eax
  1840.         mov     eax, [edx+4]
  1841.         dec     eax
  1842.         mov     [edx+12], eax
  1843.         ret
  1844.  
  1845. .line_prev:
  1846.         cmp     eax, [edx+8]
  1847.         mov     eax, [eax+4]
  1848.         jnz     @f
  1849.         mov     [edx+8], eax
  1850. @@:
  1851.         dec     dword [edx+12]
  1852.         ret
  1853. .calc_last_line:
  1854.         mov     esi, [edx+8]
  1855.         mov     ecx, [ebx+dlgitemtemplate.y2]
  1856.         sub     ecx, [ebx+dlgitemtemplate.y1]
  1857.         jz      .clldone
  1858. @@:
  1859.         mov     esi, [esi]
  1860.         test    esi, esi
  1861.         jz      @f
  1862.         loop    @b
  1863. .clldone:
  1864.         ret
  1865. .line_next:
  1866.         cmp     eax, esi
  1867.         mov     eax, [eax]
  1868.         jnz     @f
  1869.         push    eax
  1870.         mov     eax, [edx+8]
  1871.         mov     eax, [eax]
  1872.         mov     [edx+8], eax
  1873.         pop     eax
  1874.         mov     esi, eax
  1875. @@:
  1876.         inc     dword [edx+12]
  1877.         ret
  1878.  
  1879. ; void __stdcall SayNoMem(void);
  1880. SayNoMem:
  1881.         or      dword [nomem_dlgdata+4], -1
  1882.         or      dword [nomem_dlgdata+8], -1
  1883.         push    nomem_dlgdata
  1884.         call    DialogBox
  1885.         ret
  1886.  
  1887. ; int __stdcall ConfirmCancel(void);
  1888. ; return value: 0 = the user is sure, nonzero = the user wants to continue
  1889. ConfirmCancel:
  1890.         push    YesOrNoBtn
  1891.         push    2
  1892.         push    ConfirmCancelMsg
  1893.         push    1
  1894.         push    aCancelled
  1895.         call    SayErrTitle
  1896.         test    eax, eax
  1897.         ret
  1898.  
  1899. ; int __stdcall SayErr(int num_strings, const char* strings[],
  1900. ;                      int num_buttons, const char* buttons[]);
  1901. SayErr:
  1902.         pop     eax
  1903.         push    aError
  1904.         push    eax
  1905. ; int __stdcall SayErrTitle(const char* title,
  1906. ;                       int num_strings, const char* strings[],
  1907. ;                       int num_buttons, const char* buttons[]);
  1908. SayErrTitle:
  1909.         push    2
  1910.         jmp     @f
  1911.  
  1912. ; int __stdcall Message(const char* title,
  1913. ;                       int num_strings, const char* strings[],
  1914. ;                       int num_buttons, const char* buttons[]);
  1915. Message:
  1916.         push    1
  1917. @@:
  1918.         pop     eax
  1919. ; [esp+4] = title
  1920. ; [esp+8] = num_strings
  1921. ; [esp+12] = strings
  1922. ; [esp+16] = num_buttons
  1923. ; [esp+20] = buttons
  1924.         pushad
  1925.         mov     ecx, [esp+32+8]
  1926.         add     ecx, [esp+32+16]
  1927.         imul    ecx, dlgitemtemplate.size
  1928.         add     ecx, dlgtemplate.size+12
  1929.         call    xpgalloc
  1930.         test    eax, eax
  1931.         jnz     @f
  1932.         popad
  1933.         or      eax, -1
  1934.         ret     28
  1935. @@:
  1936.         mov     ebx, eax
  1937.         mov     edi, eax
  1938.         mov     eax, [esp+28]
  1939.         stosd                           ; dlgtemplate.flags
  1940.         or      eax, -1
  1941.         stosd                           ; dlgtemplate.x
  1942.         stosd                           ; dlgtemplate.y
  1943. ; calculate width
  1944.         mov     ecx, [esp+32+8]
  1945.         mov     esi, [esp+32+12]
  1946.         xor     edx, edx
  1947. .calcwidth:
  1948.         lodsd
  1949. @@:
  1950.         inc     eax
  1951.         cmp     byte [eax-1], 0
  1952.         jnz     @b
  1953.         sub     eax, [esi-4]
  1954.         inc     eax
  1955.         cmp     edx, eax
  1956.         ja      @f
  1957.         mov     edx, eax
  1958. @@:
  1959.         loop    .calcwidth
  1960.         mov     ecx, [esp+32+16]
  1961.         mov     esi, [esp+32+20]
  1962.         xor     ebp, ebp
  1963. .calcwidth2:
  1964.         lodsd
  1965. @@:
  1966.         inc     eax
  1967.         cmp     byte [eax-1], 0
  1968.         jnz     @b
  1969.         sub     eax, [esi-4]
  1970.         inc     eax
  1971.         add     ebp, eax
  1972.         loop    .calcwidth2
  1973.         inc     ebp
  1974.         inc     ebp
  1975.         cmp     edx, ebp
  1976.         ja      @f
  1977.         mov     edx, ebp
  1978. @@:
  1979.         mov     eax, [cur_width]
  1980.         sub     eax, 8
  1981.         cmp     edx, eax
  1982.         jb      @f
  1983.         mov     edx, eax
  1984. @@:
  1985.         mov     eax, edx
  1986.         stosd                           ; dlgtemplate.width
  1987.         mov     eax, [esp+32+8]
  1988.         inc     eax
  1989.         stosd                           ; dlgtemplate.height
  1990.         mov     eax, 3
  1991.         stosd                           ; dlgtemplate.border_size_x
  1992.         mov     al, 2
  1993.         stosd                           ; dlgtemplate.border_size_y
  1994.         mov     eax, [esp+32+4]
  1995.         stosd                           ; dlgtemplate.title
  1996.         xor     eax, eax
  1997.         stosd                           ; (ignored)
  1998.         stosd                           ; (ignored)
  1999.         stosd                           ; DlgProc
  2000.         stosd                           ; userdata
  2001.         mov     eax, [esp+32+8]
  2002.         add     eax, [esp+32+16]
  2003.         stosd                           ; num_items
  2004. ; fill strings
  2005.         xor     ecx, ecx
  2006.         mov     esi, [esp+32+12]
  2007. @@:
  2008.         mov     eax, 1
  2009.         stosd                           ; dlgitemtemplate.type
  2010.         dec     eax
  2011.         stosd                           ; dlgitemtemplate.x1
  2012.         mov     eax, ecx
  2013.         stosd                           ; dlgitemtemplate.y1
  2014.         lea     eax, [edx-1]
  2015.         stosd                           ; dlgitemtemplate.x2
  2016.         mov     eax, ecx
  2017.         stosd                           ; dlgitemtemplate.y2
  2018.         movsd                           ; dlgitemtemplate.data
  2019.         mov     eax, 1
  2020.         stosd                           ; dlgitemtemplate.flags
  2021.         inc     ecx
  2022.         cmp     ecx, [esp+32+8]
  2023.         jb      @b
  2024. ; fill buttons
  2025.         mov     ecx, [esp+32+16]
  2026.         mov     esi, [esp+32+20]
  2027.         sub     edx, ebp
  2028.         jc      .big
  2029.         shr     edx, 1
  2030.         inc     edx
  2031.         jmp     .fillbtns
  2032. .big:
  2033.         xor     edx, edx
  2034. .fillbtns:
  2035.         mov     eax, 2
  2036.         stosd                           ; dlgitemtemplate.type
  2037.         mov     eax, edx
  2038.         stosd                           ; dlgitemtemplate.x1
  2039.         mov     eax, [ebx+dlgtemplate.height]
  2040.         dec     eax
  2041.         stosd                           ; dlgitemtemplate.y1
  2042.         push    eax
  2043.         lodsd
  2044.         sub     eax, edx
  2045. @@:
  2046.         inc     edx
  2047.         cmp     byte [eax+edx-1], 0
  2048.         jnz     @b
  2049.         mov     eax, edx
  2050.         inc     edx
  2051.         stosd                           ; dlgitemtemplate.x2
  2052.         pop     eax
  2053.         stosd                           ; dlgitemtemplate.y2
  2054.         mov     eax, [esi-4]
  2055.         stosd                           ; dlgitemtemplate.data
  2056.         mov     eax, 9
  2057.         cmp     ecx, [esp+32+16]
  2058.         jnz     @f
  2059.         or      al, 4
  2060. @@:
  2061.         stosd                           ; dlgitemtemplate.flags
  2062.         loop    .fillbtns
  2063.         push    ebx
  2064.         call    DialogBox
  2065.         cmp     eax, -1
  2066.         jz      @f
  2067.         sub     eax, ebx
  2068.         sub     eax, dlgtemplate.size+12
  2069.         xor     edx, edx
  2070.         mov     ecx, dlgitemtemplate.size
  2071.         div     ecx
  2072.         sub     eax, [esp+32+8]
  2073. @@:
  2074.         mov     [esp+28], eax
  2075.         mov     ecx, ebx
  2076.         call    pgfree
  2077.         popad
  2078.         ret     20
  2079.