Subversion Repositories Kolibri OS

Rev

Rev 1702 | Rev 2033 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;************************************************************************
  2. ; v.015 08.03.2010
  3. ; Support for OpenDialog - Open and Save
  4. ; Some optimization
  5. ;************************************************************************
  6. ; v.014 05.02.2010
  7. ;
  8. ; PageUp, PageDown      - страница вверх/вниз
  9. ; Ctrl+UP, Ctrl+Down    - прокрутка страницы на строку вверх/вниз без смещения курсора
  10. ; Home,End              - в начало/конец строки
  11. ; Ctrl+Home, Ctrl+End   - к первому/последнему байту файла
  12. ; Left, Right           - курсор влево/вправо
  13. ; Ctrl+O                - открыть файл
  14. ; Ctrl+S                - сохранить
  15. ; Ctrl+F                - поиск (+Tab для OptionBox)
  16. ; Ctrl+G                - переход на смещение (+Tab для OptionBox)
  17. ; Ctrl+B                - выделить блок
  18. ; ESC                   - снять выделение
  19. ; Ctrl+C                - копировать блок
  20. ; Ctrl+V                - вставить в выделенную область
  21. ; Ctrl+X                - вырезать выделенную область (в буфер)
  22. ; n                     - инвертировать байт под курсором
  23. ; Ins                   - режим замены/вставки (по умолчанию)
  24. ;   Del                 - в режиме вставки - удалить байт под курсором
  25. ;   BackSpace           - в режиме вставки - удалить байт перед курсором
  26. ; ~                     - смена кодировки (cp866,cp1251)
  27. ; Shift+~               - смена кодировки (cp866 или cp1251,koi8-r)
  28.  
  29. ; Память перераспределяется на увеличение i umen'shenie.
  30. ; Файл загружается целиком.
  31.  
  32. ; Макросы load_lib.mac, editbox_ex и библиотеку box_lib.obj создали:
  33. ; <Lrz> - Alexey Teplov / Алексей Теплов
  34. ; Mario79, Mario - Marat Zakiyanov / Марат Закиянов
  35. ; Diamondz - Evgeny Grechnikov / Евгений Гречников и др.
  36. ;
  37. ; staper@inbox.ru
  38. ; babalbes@yandex.ru
  39.  
  40. use32
  41.         org     0x0
  42.         db      'MENUET01'
  43.         dd      0x1
  44.         dd      START   ;program start
  45.         dd      I_END   ;program image  size
  46.         dd      (D_END+0x600) and not 3 ;required amount of memory
  47.         dd      (D_END+0x600) and not 3 ;stack
  48.         dd      0x0     ;buf_cmd_lin
  49.         dd      cur_dir_path
  50.  
  51. _title  equ 'HeEd 0.15', 0
  52.  
  53. include 'lang.inc'
  54. include '../../../config.inc'           ;for nightbuild
  55. include '../../../macros.inc'
  56. include '../../libraries/box_lib/trunk/box_lib.mac'
  57. include '../../libraries/box_lib/load_lib.mac'
  58.  
  59. @use_library
  60.  
  61. times   16      dd      0
  62.  
  63. frgrd_color     equ     0xfefefe
  64. bkgrd_color     equ     0x000000
  65. kursred_color   equ     0x0039ff
  66. kurstxt_color   equ     0x708090
  67. text_color      equ     0xaaaaaa
  68.  
  69. panel_clr1      equ     0xe9e9e2
  70. panel_clr2      equ     0x8b8b89
  71. panel_clr3      equ     0x777777;eaeae3
  72.  
  73.  
  74. palitra:
  75. .1      dd      frgrd_color,bkgrd_color ;цвет невыделенного символа
  76. .2      dd      frgrd_color,text_color  ;левый,правый столбцы,часть нижней строки
  77. .3      dd      kursred_color,frgrd_color       ;курсора
  78. .4      dd      kurstxt_color,bkgrd_color       ;курсора в текстовой области
  79. .5      dd      panel_clr1,not  text_color      ;нижняя панель
  80.  
  81. FIRST_HEX equ 0*65536+24
  82. scroll_width_size equ 15
  83.  
  84. struct  f70
  85.         func_n  rd 1
  86.         param1  rd 1
  87.         param2  rd 1
  88.         param3  rd 1
  89.         param4  rd 1
  90.         rezerv  rb 1
  91.         name    rd 1
  92. ends
  93.  
  94. START:
  95.         mcall   68,11
  96.  
  97. load_libraries l_libs_start,end_l_libs
  98.  
  99. ;OpenDialog     initialisation
  100.         push    dword OpenDialog_data
  101.         call    [OpenDialog_Init]
  102.  
  103.         mov     edi,filename_area
  104.         mov     esi,start_temp_file_name
  105.         xor     eax,eax
  106.         cld
  107. @@:
  108.         lodsb
  109.         stosb
  110.         test    eax,eax
  111.         jnz     @b
  112.  
  113.         mcall   40,0x27
  114.  
  115.         mcall   68,12,32*1024   ;страничный буфер
  116.         mov     [screen_table],eax
  117.         mcall   68,12,4*1024
  118. ;       mov     [blocks_table],eax
  119.         mov     [file_buffer],eax
  120. ;       mov     esi,eax
  121. ;       mcall   68,12,4*1024
  122. ;       mov     [esi],eax
  123. ;       mov     [blocks_counter],1
  124.  
  125. ;       mcall   68,12,1024      ;Procinfo area for function 9 in MenuBar
  126. ;       mov     [menu_data_1.procinfo],eax
  127. ;       mov     [menu_data_2.procinfo],eax
  128.         mcall   68,12,1024
  129.         mov     [copy_buf],eax
  130.  
  131.  
  132.         ;размер текущего пути
  133.         mov     esi,cur_dir_path
  134. @@:
  135.         cmp     byte [esi],0
  136.         je      @f
  137.         inc     esi
  138.         jmp     @b
  139. @@:
  140.         sub     esi,cur_dir_path
  141.         mov     [edit1.pos],esi
  142.         mov     [edit1.size],esi
  143.  
  144.         ;общесистемные клавиши для Shift+курсоры
  145. ;       mcall   66,4,75,1
  146. ;       mcall   66,,77
  147. ;       mcall   66,,72
  148. ;       mcall   66,,80
  149.  
  150.         call    ready_screen_buffer
  151. ;       jmp     open_file
  152.         mcall   9,procinfo,-1
  153.         mov     ecx,[ebx+30]    ; PID
  154.         mcall   18,21
  155.         mov     [active_process],eax    ; WINDOW SLOT
  156.  
  157. redraw_all:
  158.         call    control_minimal_window_size
  159.         call    draw_window_1
  160. still:
  161.         mcall   10
  162.  
  163.         cmp     eax,6
  164.         je      mouse
  165.         dec     al
  166.         jz      redraw_all
  167.         dec     al
  168.         jz      key
  169.         dec     al
  170.         jz      button
  171.         jmp     still
  172. ;---------------------------------------------------------------------
  173. control_minimal_window_size:
  174.         pusha
  175.         mcall   9,procinfo,-1
  176.         mov             eax,[ebx+70]
  177.         test    eax,10b
  178.         jnz             .end
  179.         test    eax,100b
  180.         jnz             .end
  181.         test    eax,1b
  182.         jnz             .end
  183.         mov             esi,-1
  184.         mov             eax,procinfo
  185.         mov             eax,[eax+46]
  186.         cmp             eax,299
  187.         jae             @f
  188.         mov             esi,299
  189.         mcall   67,-1,ebx,ebx
  190. @@:
  191.         mov             edx,-1
  192.         mov             eax,procinfo
  193.         mov             eax,[eax+42]
  194.         cmp             eax,399
  195.         jae             @f
  196.         mov             edx,399
  197.         mcall   67,-1,ebx,,ebx
  198. @@:
  199. .end:
  200.         popa
  201.         ret
  202. ;---------------------------------------------------------------------
  203. red:
  204.         call    ready_screen_buffer
  205.         call    main_area
  206.         jmp     still
  207. ;---------------------------------------------------------------------
  208. draw_window_1:
  209.         call    start_draw
  210.         call    draw_window
  211.         call    show_file_size
  212.         call    show_codepage
  213.         call    show_insert
  214.         call    ready_screen_buffer
  215.         call    main_area
  216.         ret
  217. ;---------------------------------------------------------------------
  218. key:
  219.         mcall   2
  220.         dec     al
  221.         jz      still
  222.         dec     al
  223.         jz      key.syst
  224.         cmp     ah,2
  225.         je      Ctrl_B  ;выделить блок
  226.         cmp     ah,3
  227.         je      Ctrl_C  ;copy
  228.         cmp     ah,6
  229.         je      Ctrl_F  ;find
  230.         cmp     ah,7
  231.         je      Ctrl_G  ;go to
  232.         cmp     ah,8
  233.         je      BackSpace
  234.         cmp     ah,15
  235.         je      open_dialog ;open_file ;Ctrl+O
  236.         cmp     ah,19
  237.         je      open_dialog_save ;save_file ;Ctrl+S
  238.         cmp     ah,22
  239.         je      Ctrl_V  ;paste
  240.         cmp     ah,24
  241.         je      Ctrl_X  ;cut
  242.         cmp     ah,27
  243.         je      ESC
  244.         cmp     ah,48
  245.         jb      still
  246.         cmp     ah,57
  247.         jbe     input_from_keyboard     ;0-9
  248.         cmp     ah,65
  249.         jb      still
  250.         cmp     ah,70
  251.         jbe     input_from_keyboard     ;A-F
  252.         cmp     ah,81
  253.         jne     @f
  254.         call    Ctrl_DOWN
  255.         jmp     red
  256. @@:
  257.         cmp     ah,82
  258.         jne     @f
  259.         call    Ctrl_UP
  260.         jmp     red
  261. @@:
  262.         cmp     ah,84
  263.         jne     @f
  264.         call    Ctrl_HOME
  265.         jmp     red
  266. @@:
  267.         cmp     ah,85
  268.         je      Ctrl_END
  269.         cmp     ah,96
  270.         je      change_codepage ;тильда, cp866 - cp1251
  271.         cmp     ah,97
  272.         jb      still
  273.         cmp     ah,102
  274.         jbe     input_from_keyboard ;a-f
  275.         cmp     ah,126
  276.         jne     @f
  277.         xor     ah,ah
  278.         jmp     change_codepage ;Shift+~, koi8-r
  279. @@:
  280.         cmp     ah,110
  281.         je      invert_byte ;n
  282.         cmp     ah,176
  283.         jne     @f
  284.         call    LEFT
  285.         jmp     red
  286. @@:
  287.         cmp     ah,177
  288.         jne     @f
  289.         call    DOWN
  290.         jmp     red
  291. @@:
  292.         cmp     ah,178
  293.         je      UP
  294.         cmp     ah,179
  295.         je      RIGHT
  296.         cmp     ah,180
  297.         jne     @f
  298.         call    HOME
  299.         jmp     red
  300. @@:
  301.         cmp     ah,181
  302.         je      END_
  303.         cmp     ah,182
  304.         je      DEL
  305.         cmp     ah,183
  306.         je      PGDN
  307.         cmp     ah,184
  308.         je      PGUP
  309.         cmp     ah,185
  310.         je      Insert
  311.         jmp     still
  312. .syst:
  313.         cmp     ah,72
  314.         cmp     ah,75
  315.         cmp     ah,77
  316.         cmp     ah,80
  317.         jmp     still
  318.  
  319. button:
  320.         mcall   17
  321.         dec     ah
  322.         jnz     still
  323.  
  324.         jmp     close_prog
  325.  
  326. align   4
  327. mouse:
  328.         mcall   18,7
  329.         cmp     [active_process],eax
  330.         jne     still
  331.  
  332.         mcall   37,7
  333.         test    eax,eax
  334.         jz      .menu_bar_1;.mouse
  335.         bt      eax,15
  336.         jc      @f      ;обработка колёсика мыши
  337.         mov     ecx,eax
  338.         shl     ecx,2
  339. .1:
  340.         call    Ctrl_DOWN
  341.         loop    .1
  342.         jmp     red
  343. @@:
  344.         xor     ecx,ecx
  345.         sub     cx,ax
  346.         shl     cx,2
  347. .2:
  348.         call    Ctrl_UP
  349.         loop    .2
  350.         jmp     red
  351.  
  352. .menu_bar_1:
  353.         call    .set_mouse_flag
  354. @@:
  355.         push    dword menu_data_1       ;mouse event for Menu 1
  356.         call    [menu_bar_mouse]
  357.         cmp     [menu_data_1.click],dword 1
  358.         jne     .menu_bar_2
  359.         cmp     [menu_data_1.cursor_out],dword 0
  360.         jne     .analyse_out_menu_1
  361.         jmp     .menu_bar_1
  362. .menu_bar_2:
  363.         push    dword menu_data_2
  364.         call    [menu_bar_mouse]
  365.         cmp     [menu_data_2.click],dword 1
  366.         jne     .menu_bar_3
  367.         cmp     [menu_data_2.cursor_out],dword 0
  368.         jne     .analyse_out_menu_2
  369.         jmp     .menu_bar_1
  370. .menu_bar_3:
  371.         push    dword menu_data_3
  372.         call    [menu_bar_mouse]
  373.         cmp     [menu_data_3.click],dword 1
  374.         jne     .scroll_bar
  375.         cmp     [menu_data_3.cursor_out],dword 0
  376.         jne     .analyse_out_menu_3
  377.         jmp     .menu_bar_1
  378.  
  379. .set_mouse_flag:
  380.         xor     eax,eax
  381.         inc     eax
  382.         mov     [menu_data_1.get_mouse_flag],eax
  383.         mov     [menu_data_2.get_mouse_flag],eax
  384.         mov     [menu_data_3.get_mouse_flag],eax
  385.         ret
  386.  
  387. .analyse_out_menu_1:
  388.         cmp     [menu_data_1.cursor_out],dword 1
  389.         je      open_dialog
  390.         cmp     [menu_data_1.cursor_out],dword 2
  391.         je      open_dialog_save        ;save_file
  392.         cmp     [menu_data_1.cursor_out],dword 3
  393.         je      close_prog
  394.         jmp     still
  395.  
  396. .analyse_out_menu_2:
  397.         cmp     [menu_data_2.cursor_out],dword 1
  398.         jne     @f
  399.         add     [bytes_per_line],4
  400.         jmp     redraw_all
  401. @@:
  402.         cmp     [menu_data_2.cursor_out],dword 2
  403.         jne     @f
  404.         add     [bytes_per_line],8
  405.         jmp     redraw_all
  406. @@:
  407.         cmp     [menu_data_2.cursor_out],dword 3
  408.         jne     @f
  409.         cmp     [bytes_per_line],4
  410.         je      still
  411.         sub     [bytes_per_line],4
  412.         jmp     redraw_all
  413. @@:
  414.         cmp     [menu_data_2.cursor_out],dword 4
  415.         jne     still
  416.         cmp     [bytes_per_line],8
  417.         jbe     still
  418.         sub     [bytes_per_line],8
  419.         jmp     redraw_all
  420.  
  421. .analyse_out_menu_3:    ;analyse result of Menu 2
  422.         cmp     [menu_data_3.cursor_out],dword 1
  423.         jne     still
  424.         call    create_help_window
  425.         jmp     still
  426.  
  427. .scroll_bar:
  428. ;       mcall   37,2
  429. ;       test    eax,eax
  430. ;       jnz     @f
  431. ;       btr     [flags],5
  432. ;       btr     [flags],7
  433. ;       jmp     still
  434.  
  435. .mouse:
  436. .vertical:
  437.         mcall   37,2
  438.         test    eax,eax
  439.         jnz     @f
  440.         btr     [flags],5
  441.         btr     [flags],7
  442.         jmp     still
  443. @@:
  444.         bt      [flags],5
  445.         jc      @f
  446.         bt      [flags],7
  447.         jc      .horizontal_0
  448.  
  449.         mcall   37,1
  450.         shr     eax,16
  451.         cmp     ax,[scroll_bar_data_vertical.start_x]
  452.         jb      .horizontal
  453.         sub     ax,[scroll_bar_data_vertical.start_x]
  454.         cmp     ax,[scroll_bar_data_vertical.size_x]
  455.         jge     still
  456.  
  457.  
  458. @@:
  459. ;       cmp     [scroll_bar_data_vertictal.delta2],0
  460.         ;       jne     .horizontal
  461.  
  462. ;       mov     eax,[scroll_bar_data_vertical.max_area]
  463. ;       cmp     eax,[scroll_bar_data_vertical.cur_area]
  464. ;       jbe     .horizontal
  465.  
  466.         ;       mouse event for Vertical ScrollBar
  467.         mov     edi,[screen_table]
  468.         mov     edi,[edi]
  469.         cmp     edi,[file_size]
  470.         jae     still
  471.         push    dword scroll_bar_data_vertical  ;draw for Vertical ScrollBar
  472.         call    [scrollbar_ver_mouse]
  473.  
  474.         xor     edx,edx
  475.         mov     ebx,[scroll_bar_data_vertical.max_area]
  476.         sub     ebx,[scroll_bar_data_vertical.cur_area]
  477.         mov     eax,[file_size]
  478.         mov     esi,[bytes_per_line]
  479.         mov     ecx,[scroll_bar_data_vertical.position]
  480.         div     esi
  481.         xor     edx,edx
  482.         mul     ecx
  483.         div     ebx
  484.         mul     esi
  485.         cmp     eax,[file_size]
  486.         jng     @f
  487.         sub     eax,esi;[bytes_per_line]
  488. @@:
  489.         mov     ecx,[cursor]
  490.         inc     ecx
  491.         shr     ecx,1
  492.         add     ecx,eax
  493. @@:
  494.         cmp     ecx,[file_size]
  495.         jle     @f
  496.         sub     ecx,esi;[bytes_per_line]
  497.         sub     eax,esi;[bytes_per_line]
  498.         jmp     @b
  499. @@:
  500.         mov     [begin_offset],eax
  501.         bts     [flags],5
  502.  
  503.         mov     eax,scroll_bar_data_vertical.redraw
  504.         xor     ebx,ebx
  505. ;       cmp     [eax],ebx
  506. ;       je      @f
  507.         mov     [eax],ebx
  508.         jmp     red
  509. ;@@:
  510. ;       cmp     [scroll_bar_data_vertical.delta2],0
  511. ;       jne     still
  512. .horizontal:
  513.         mov     eax,[scroll_bar_data_horizontal.max_area]
  514.         cmp     eax,[scroll_bar_data_horizontal.cur_area]
  515.         jbe     .other
  516.  
  517.         mcall   37,1
  518.         cmp     ax,[scroll_bar_data_horizontal.start_y]
  519.         jb      still
  520.         sub     ax,[scroll_bar_data_horizontal.start_y]
  521.         cmp     ax,[scroll_bar_data_horizontal.size_y]
  522.         jge     still
  523.  
  524.         ; mouse event for Horizontal ScrollBar
  525. .horizontal_0:
  526. ;       mcall   37,2
  527. ;       test    eax,eax
  528. ;       jnz     @f
  529. ;       btr     [flags],5
  530. ;       btr     [flags],7
  531. ;       jmp     still
  532. ;@@:;   bt      [flags],7
  533. ;       jc      @f
  534.  
  535. ;       mcall   37,1
  536. ;       shr     eax,16
  537. ;       cmp     ax,[scroll_bar_data_vertical.start_x]
  538. ;       jb      .horizontal
  539. ;       sub     ax,[scroll_bar_data_vertical.start_x]
  540. ;       cmp     ax,[scroll_bar_data_vertical.size_x]
  541. ;       jge     still
  542. ;@@:
  543.         ; mouse event for Vertical ScrollBar
  544.  
  545.         mov     eax,[ready_screen_buffer.string_size]
  546.         shr     eax,1
  547.         cmp     eax,[len_str_scr]
  548.         jle     still
  549.         push    dword scroll_bar_data_horizontal        ;draw for Horizontal ScrollBar
  550.         call    [scrollbar_hor_mouse]
  551.  
  552.         xor     edx,edx
  553.         mov     eax,[scroll_bar_data_horizontal.position]
  554.         mov     ebx,[ready_screen_buffer.string_size]
  555.         shr     ebx,1
  556.         mul     ebx
  557.         mov     ebx,[scroll_bar_data_horizontal.max_area]
  558.         sub     ebx,[scroll_bar_data_horizontal.cur_area]
  559.         div     ebx
  560.         mov     [beg_str_scr],eax
  561.         add     eax,[len_str_scr]
  562.         mov     ebx,[ready_screen_buffer.string_size]
  563.         shr     ebx,1
  564.         cmp     eax,ebx
  565.         jle     @f
  566.         mov     eax,[ready_screen_buffer.string_size]
  567.         shr     eax,1
  568.         sub     eax,[len_str_scr]
  569.         mov     [beg_str_scr],eax
  570. @@:
  571.         mov     eax,scroll_bar_data_horizontal.redraw
  572.         xor     ebx,ebx
  573.         cmp     [eax],ebx
  574.         je      .other
  575.         mov     [eax],ebx
  576. ;       call    draw_window
  577.         call    main_area
  578.         bts     [flags],7
  579.         jmp     still
  580. .other:
  581. ;       cmp     [scroll_bar_data_vertical.delta2],0
  582. ;       jne     still
  583. ;       cmp     [scroll_bar_data_horizontal.delta2],0
  584. ;       jne     still
  585.         jmp     still
  586.  
  587.  
  588.  
  589. ;------------------------------------------------
  590.  
  591. ;------------------------------------------------
  592.  
  593.  
  594. align   4
  595. ready_screen_buffer:
  596.         mov     [.fl],0
  597.         mov     esi,[screen_table]
  598.         add     esi,4
  599.         mov     ecx,[number_strings]
  600.         mov     [.number_strings],cx
  601.         push    [cursor]
  602.         pop     [.cursor]
  603.         push    [file_size]
  604.         pop     [.length_to_end]
  605.         mov     edi,[begin_offset]
  606.  
  607.         mov     [.shblock_end],0
  608.         mov     [.shblock_beg],0
  609.         bt      [flags],8
  610.         jnc     @f
  611.         mov     eax,[shblock_beg]
  612.         add     eax,[file_buffer]
  613.         mov     [.shblock_beg],eax
  614.         mov     eax,[shblock_end]
  615.         add     eax,[file_buffer]
  616.         mov     [.shblock_end],eax
  617. @@:
  618.         mov     [.offset],edi
  619.         sub     [.length_to_end],edi
  620.         jz      .pre_next_string
  621.         add     edi,[file_buffer]
  622.  
  623. .next_string:
  624.         mov     word [esi],0x2020
  625.         add     esi,2
  626.         mov     eax,0x20302030
  627.         mov     dword [esi],eax
  628.         mov     dword [esi+4],eax
  629.         mov     dword [esi+8],eax
  630.         mov     dword [esi+12],eax
  631.         push    edi
  632.         mov     ecx,8
  633.         mov     edi,[.offset]
  634. @@:
  635.         mov     eax,edi
  636.         and     eax,0xF
  637.         cmp     al,10
  638.         sbb     al,69h
  639.         das
  640.         mov     [esi+ecx*2-2],al
  641.         shr     edi,4
  642.         loop    @b
  643.         mov     word [esi+16],0x203a    ;двоеточие
  644.         mov     eax,[bytes_per_line]
  645.         add     [.offset],eax
  646.         mov     [.string_size],2+4*4+4+2
  647.         add     esi,4*4+4+2
  648.         pop     edi
  649.         mov     [.temp],edi
  650.         push    [.cursor]
  651.         pop     [.cursor_temp]
  652.  
  653.         ;hex    значения
  654.         mov     dword [esi-4],0x20202020
  655.  
  656.         mov     edx,[bytes_per_line]
  657. .next_group:
  658.         mov     ecx,[group_bytes]
  659.  
  660. .next_byte:
  661.         mov     al,[edi]
  662.         ror     ax,4
  663.         cmp     al,10
  664.         sbb     al,69h
  665.         das
  666.         mov     [esi],al
  667.         mov     byte [esi+1],0x20
  668.         cmp     edi,[.shblock_end]
  669.         ja      @f
  670.         cmp     edi,[.shblock_beg]
  671.         jl      @f
  672.         mov     byte [esi+1],(0x20+3*4)
  673. @@:
  674.         dec     [.cursor]
  675.         jnz     @f
  676.         mov     byte [esi+1],(0x20+2*4)
  677. @@:
  678.         shr     ax,16-4
  679.         cmp     al,10
  680.         sbb     al,69h
  681.         das
  682.         mov     [esi+2],al
  683.         mov     byte [esi+3],0x20
  684.         cmp     edi,[.shblock_end]
  685.         ja      @f
  686.         cmp     edi,[.shblock_beg]
  687.         jl      @f
  688.         mov     byte [esi+3],(0x20+3*4)
  689. @@:
  690.         dec     [.cursor]
  691.         jnz     @f
  692.         mov     byte [esi+3],(0x20+2*4)
  693. @@:
  694.         mov     word [esi+4],0x2020
  695.         add     [.string_size],6
  696.         add     esi,6
  697.         inc     edi
  698.         dec     [.length_to_end]
  699.         jz      .to_null
  700.         dec     ecx
  701.         jz      @f
  702.         dec     edx
  703.         jnz     .next_byte
  704.         jz      .ascii
  705. @@:
  706.         mov     word [esi],0x2020
  707.         add     esi,2
  708.         add     [.string_size],2
  709.         dec     edx
  710.         jnz     .next_group;byte
  711.         sub     esi,2
  712.         sub     [.string_size],2
  713.         jz      .ascii
  714. .ascii:
  715.         push    edi
  716.         mov     edi,[.temp]
  717.         mov     word [esi],0x2020
  718.         mov     ebx,[.cursor_temp]
  719.         add     esi,2
  720.         add     [.string_size],2
  721.         mov     ecx,[bytes_per_line]
  722. @@:
  723.         mov     al,[edi]
  724.         mov     [esi],al
  725.         mov     byte [esi+1],0x20
  726.         dec     ebx
  727.         jnz     .s1
  728.         mov     byte [esi+1],(0x20+3*4)
  729. .s1:
  730.         dec     ebx
  731.         jnz     .s2
  732.         mov     byte [esi+1],(0x20+3*4)
  733. .s2:
  734.         inc     edi
  735.         add     esi,2
  736.         add     [.string_size],2
  737.         loop    @b
  738.         pop     edi
  739.         mov     edx,[bytes_per_line]
  740.         dec     [.number_strings]
  741.         jnz     .next_string
  742.         ret
  743.  
  744. .fl     db 0
  745. .fl_buf dd 0
  746. .to_null:
  747.         dec     [.fl]
  748.         mov     [.fl_buf],edi
  749.         jmp     .pre_next_byte0
  750.  
  751. .pre_next_string:
  752.         mov     word [esi],0x2020
  753.         add     esi,2
  754.         mov     eax,0x20302030
  755.         mov     dword [esi],eax
  756.         mov     dword [esi+4],eax
  757.         mov     dword [esi+8],eax
  758.         mov     dword [esi+12],eax
  759.         mov     ecx,8
  760.         mov     edi,[.offset]
  761. @@:
  762.         mov     eax,edi
  763.         and     eax,0xF
  764.         cmp     al,10
  765.         sbb     al,69h
  766.         das
  767.         mov     [esi+ecx*2-2],al
  768.         shr     edi,4
  769.         loop    @b
  770.         mov     word [esi+16],0x203a    ;двоеточие
  771.         mov     eax,[bytes_per_line]
  772.         add     [.offset],eax
  773.         mov     [.string_size],2+4*4+4+2
  774.         add     esi,4*4+4+2
  775.         push    [.cursor]
  776.         pop     [.cursor_temp]
  777.  
  778.         ;hex значения
  779.         mov     dword [esi-4],0x20202020
  780.  
  781.         mov     edx,[bytes_per_line]
  782. .pre_next_group:
  783.         mov     ecx,[group_bytes]
  784.  
  785. .pre_next_byte:
  786.         mov     dword [esi],0x20202020
  787.         dec     [.cursor]
  788.         jnz     @f
  789.         mov     byte [esi+1],(0x20+2*4)
  790. @@:
  791.         dec     [.cursor]
  792.         jnz     @f
  793.         mov     byte [esi+3],(0x20+2*4)
  794. @@:
  795.         mov     word [esi+4],0x2020
  796.         add     [.string_size],6
  797.         add     esi,6
  798. .pre_next_byte0:
  799.         dec     ecx
  800.         jz      @f
  801.         dec     edx
  802.         jnz     .pre_next_byte
  803.         jz      .pre_ascii
  804. @@:
  805.         mov     word [esi],0x2020
  806.         add     esi,2
  807.         add     [.string_size],2
  808.         dec     edx
  809.         jnz     .pre_next_group;byte
  810.         sub     esi,2
  811.         sub     [.string_size],2
  812.         jz      .pre_ascii
  813.  
  814. .pre_ascii:
  815.         mov     word [esi],0x2020
  816.         add     esi,2
  817.         add     [.string_size],2
  818.         mov     ecx,[bytes_per_line]
  819.         cmp     [.fl],0 ;проверка флага
  820.         jne     .last_ascii
  821.         mov     ebx,[.cursor_temp]
  822. @@:
  823.         mov     word [esi],0x2020
  824.         dec     ebx
  825.         jnz     .ps1
  826.         mov     byte [esi+1],(0x20+3*4)
  827. .ps1:
  828.         dec     ebx
  829.         jnz     .ps2
  830.         mov     byte [esi+1],(0x20+3*4)
  831. .ps2:
  832.         add     esi,2
  833.         add     [.string_size],2
  834. .1:
  835.         loop    @b
  836.         mov     edx,[bytes_per_line]
  837.         dec     [.number_strings]
  838.         jnz     .pre_next_string
  839.         ret
  840.  
  841. ;корректно обрабатываем финальную строку файла, длина которой вариативна
  842. .last_ascii:
  843.         mov     ebx,[.fl_buf]
  844.         sub     ebx,[.temp]
  845.         sub     ecx,ebx
  846.         mov     edi,[.temp]
  847.         mov     [.fl],0
  848. @@:
  849.         mov     al,[edi]
  850.         mov     [esi],al
  851.         mov     byte [esi+1],0x20
  852.         dec     [.cursor_temp]
  853.         jnz     .la1
  854.         mov     byte [esi+1],(0x20+3*4)
  855. .la1:
  856.         dec     [.cursor_temp]
  857.         jnz     .la2
  858.         mov     byte [esi+1],(0x20+3*4)
  859. .la2:
  860.         inc     edi
  861.         add     esi,2
  862.         add     [.string_size],2
  863.         dec     ebx
  864.         jnz     @b
  865.         inc     ecx
  866.         jmp     .1
  867.  
  868. .string_size    dd 16
  869. .number_strings dw 0
  870. .length_to_end  dd 0
  871. .temp           dd 0
  872. .offset         dd 0
  873. .cursor         dd 0
  874. .cursor_temp    dd 0
  875. .shblock_beg    dd 0
  876. .shblock_end    dd 0
  877.  
  878.  
  879. align   4
  880. main_area:
  881.         mov     ecx,[number_strings]
  882.         mov     [.number_strings],cx
  883.         push    [len_str_scr]
  884.         pop     [.len_str_scr]
  885.         mov     eax,[ready_screen_buffer.string_size]
  886.         shr     eax,1
  887.         mov     [.string_size],eax
  888.         mov     edi,[screen_table]
  889.         mov     edi,[edi]
  890.         cmp     [file_size],edi
  891.         jbe     .4
  892.         xor     edx,edx ;ползунок
  893.         mov     ebx,[scroll_bar_data_vertical.max_area]
  894.         sub     ebx,[scroll_bar_data_vertical.cur_area]
  895.         mov     ecx,[file_size]
  896.         mov     eax,[current_offset]
  897.         test    eax,eax
  898.         jnz     .3
  899.         inc     eax
  900. .3:
  901.         mul     ebx
  902.         test    ecx,ecx
  903.         jnz     .5
  904.         inc     ecx
  905. .5:
  906.         div     ecx
  907.         mov     [scroll_bar_data_vertical.position],eax
  908.  
  909.         mcall   37,2    ;кпопка мыши нажата - нет смысла перерисовывать ScrollBar
  910.         test    eax,eax
  911.         jnz     .4
  912.         push    dword scroll_bar_data_vertical
  913.         call    [scrollbar_ver_mouse]
  914.  
  915.         push    dword scroll_bar_data_vertical  ;draw for Vertical ScrollBar
  916.         call    [scrollbar_ver_draw]
  917.  
  918. ;       push    dword scroll_bar_data_vertical  ;draw for Vertical ScrollBar
  919. ;       call    [scrollbar_ver_draw]
  920.  
  921. ;       xor     eax,eax
  922. ;       inc     eax
  923. ;       mov     [scroll_bar_data_vertical.all_redraw],eax
  924. ;       push    dword scroll_bar_data_vertical  ;draw for Vertical ScrollBar
  925. ;       call    [scrollbar_ver_draw]
  926. ;       xor     eax,eax ;reset  all_redraw      flag
  927. ;       mov     [scroll_bar_data_vertical.all_redraw],eax
  928.  
  929. .4:
  930.         mov     esi,0x000001    ;цвет и число бит на пиксель
  931.         mov     edx,FIRST_HEX   ;координаты первого hex
  932.         call    show_current_offset
  933.         mov     edi,[screen_table]
  934.         add     edi,4
  935.         mov     ecx,[beg_str_scr]
  936.         sub     [.string_size],ecx
  937.         shl     ecx,1
  938.         add     edi,ecx
  939. .out:
  940.         push    edi
  941.         movzx   ebx,byte [edi]
  942.         cmp     bl,128  ;проверка на принадлежность символа к расширенной таблице
  943.         jb      .7
  944.         add     ebx,[codepage_offset]
  945. .7:
  946.         movzx   edi,byte [edi+1]
  947.         lea     edi,[(edi*2-0x40)]
  948.         add     edi,palitra
  949.         shl     bx,4
  950.         add     ebx,font_buffer
  951.         mov     ecx,8*65536+16
  952.         mov     ebp,0
  953.         mcall   65
  954.         pop     edi
  955.  
  956.         add     edi,2
  957.         add     edx,8*65536
  958.  
  959.         dec     [.len_str_scr]
  960.         jz      .loop_str
  961.         dec     [.string_size]
  962.         jz      .next_string
  963.  
  964.         push    edi
  965.         movzx   ebx,byte [edi]
  966.         cmp     bl,128
  967.         jb      .8
  968.         add     ebx,[codepage_offset]
  969. .8:
  970.         movzx   edi,byte [edi+1]
  971.         lea     edi,[(edi*2-0x40)]
  972.         add     edi,palitra
  973.         shl     bx,4
  974.         add     ebx,font_buffer
  975.         mcall
  976.         pop     edi
  977.  
  978.         add     edi,2
  979.         add     edx,8*65536
  980.  
  981.         dec     [.len_str_scr]
  982.         jz      .loop_str
  983.         dec     [.string_size]
  984.         jnz     .out
  985.         jz      .next_string
  986.  
  987. .string_size    dd 0
  988. .number_strings dw 0
  989. .len_str_scr    dd 0
  990.  
  991. @@:
  992.         pushad
  993.         mov     ecx,edx
  994.         shl     ecx,16
  995.         mov     ebx,edx
  996.         shr     ebx,16
  997.         cmp     bx,[scroll_bar_data_vertical.start_x]
  998.         jge     .ls1
  999.         mov     ax,[scroll_bar_data_vertical.start_x]
  1000.         sub     ax,bx
  1001.         shl     ebx,16
  1002.         mov     bx,ax
  1003.         mov     cx,16
  1004.         mcall   13,,,frgrd_color
  1005. .ls1:
  1006.         popad
  1007.         jmp     @f
  1008. .loop_str:
  1009.         bt      [flags],6
  1010.         jc      @b
  1011. @@:
  1012.         dec     [.string_size]
  1013.         jz      .next_string
  1014.         add     edi,2
  1015.         add     edx,8*65536
  1016.         jmp     @b
  1017.  
  1018. @@:;очистка фоновым цветом незакрашенных областей
  1019.         pushad
  1020.         ror     edx,16
  1021.         mov     dx,16
  1022.         mov     ecx,edx
  1023.         mov     edx,frgrd_color
  1024.         movzx   ebx,[scroll_bar_data_vertical.start_x]
  1025.         sub     ecx,2*65536
  1026.         mov     cx,2
  1027.         mcall   13
  1028.         popad
  1029.  
  1030.         pushad
  1031.         mov     ecx,edx
  1032.         shl     ecx,16
  1033.         mov     ebx,edx
  1034.         shr     ebx,16
  1035.         cmp     bx,[scroll_bar_data_vertical.start_x]
  1036.         jge     .10
  1037.         mov     ax,[scroll_bar_data_vertical.start_x]
  1038.         sub     ax,bx
  1039.         shl     ebx,16
  1040.         mov     bx,ax
  1041.         mov     cx,16
  1042.         mcall   13,,,frgrd_color
  1043. .10:
  1044.         popad
  1045.         jmp     @f
  1046. .next_string:
  1047.         bt      [flags],6
  1048.         jc      @b
  1049. @@:
  1050.         push    [len_str_scr]
  1051.         pop     [.len_str_scr]
  1052.         mov     eax,[ready_screen_buffer.string_size]
  1053.         shr     eax,1
  1054.         mov     [.string_size],eax      ;коррекция смещения входных данных
  1055.         mov     ecx,[beg_str_scr]
  1056.         sub     [.string_size],ecx
  1057.         sub     eax,ecx
  1058.         shl     ecx,1
  1059.         add     edi,ecx
  1060.  
  1061.         shl     eax,19
  1062.         sub     edx,eax
  1063.         add     edx,18
  1064.         dec     [.number_strings]
  1065.         jnz     .out
  1066.         btr     [flags],6
  1067.         jmp     end_draw
  1068.  
  1069.  
  1070. align   4
  1071. show_current_offset:
  1072.         pushad
  1073.         push    edx     ;вывод текущего смещения в файле
  1074.         mov     edi,palitra.5
  1075.         mov     eax,[begin_offset]
  1076.         mov     ebx,[cursor]
  1077.         dec     ebx
  1078.         shr     bx,1
  1079.         add     ebx,eax
  1080.         mov     [current_offset],ebx
  1081.         mov     edx,[low_area]
  1082.         lea     eax,[8*8+8+8]
  1083.         shl     eax,16
  1084.         add     edx,eax
  1085.         mov     ecx,8
  1086.         call    hex_output
  1087.         lea     eax,[8*8+14]
  1088.         shl     eax,16
  1089.         add     edx,eax
  1090.         push    edx
  1091.         ;двоичное значение байта
  1092.         mov     edx,[file_buffer]
  1093.         add     edx,ebx;[current_offset]
  1094.         xor     eax,eax
  1095.         cmp     ebx,[file_size]
  1096.         jae     @f
  1097.         mov     al,[edx]
  1098. @@:
  1099.         mov     bx,2
  1100.         mov     ebp,8
  1101.         xor     ecx,ecx
  1102.         xor     edx,edx
  1103. @@:
  1104.         div     bx
  1105.         or      cl,dl
  1106.         ror     ecx,4
  1107.         dec     ebp
  1108.         jnz     @b
  1109.         mov     ebx,ecx
  1110.         pop     edx
  1111.         mov     ecx,8
  1112.         call    hex_output
  1113.  
  1114.         ;десятичное
  1115.         push    edx
  1116.         mov     edx,[file_buffer]
  1117.         mov     ebx,[current_offset]
  1118.         add     edx,ebx
  1119.         xor     eax,eax
  1120.         inc     ebx
  1121.         cmp     ebx,[file_size] ;0 если за границей файла
  1122.         jb      @f
  1123.         mov     edx,D_END
  1124. @@:
  1125.         mov     al,[edx]
  1126.         xor     ebx,ebx
  1127. ;       mov     ebp,3
  1128.         mov     cl,10
  1129. @@:
  1130.         div     cl
  1131.         mov     bl,ah
  1132.         xor     ah,ah
  1133.         shl     ebx,8
  1134.         test    al,al
  1135. ;       dec     ebp
  1136.         jnz     @b
  1137.         shr     ebx,8
  1138.         cmp     byte [edx],100
  1139.         jb      .1
  1140.         mov     ebp,3
  1141.         jmp     @f
  1142. .1:
  1143.         mov     ebp,1
  1144.         cmp     byte [edx],10
  1145.         jb      @f
  1146.         mov     ebp,2
  1147. @@:
  1148.         mov     al,bl
  1149.         shr     ebx,8
  1150.         cmp     al,10
  1151.         sbb     al,69h
  1152.         das
  1153.         shl     eax,8
  1154. ;       test    bx,bx
  1155.         dec     ebp
  1156.         jnz     @b
  1157.  
  1158.         mov     ecx,8*65536+16
  1159.         pop     edx
  1160.         add     edx,(8*8+30)*65536;268*65536
  1161.         mov     edi,palitra.5
  1162.         mov     ebp,0
  1163.         push    dword 3
  1164. @@:
  1165.         shr     eax,8
  1166.         xor     ebx,ebx
  1167.         mov     bl,al
  1168.         shl     ebx,4
  1169.         add     ebx,font_buffer
  1170.         push    eax
  1171.         mcall   65
  1172.         pop     eax
  1173.         sub     edx,8*65536
  1174.         dec     dword [esp]
  1175.         jnz     @b
  1176.         add     esp,4
  1177. ;       mov     edx,[low_area]  ;вывод esp
  1178. ;       add     edx,298*65536
  1179. ;       mov     ebx,esp
  1180. ;       mov     ecx,8
  1181. ;       call    hex_output
  1182.         pop     edx
  1183.         popad
  1184.         ret
  1185.  
  1186.  
  1187. align   4
  1188. hex_output:     ;вывод hex строки из 8 символов
  1189.         pushad
  1190.         mov     edi,(hex8_string)       ;адрес буфера
  1191.         mov     dword [edi],0x30303030
  1192.         mov     dword [edi+4],0x30303030
  1193.         push    ecx
  1194. .1:
  1195.         mov     eax,ebx
  1196.         and     eax,0xF
  1197.         cmp     al,10
  1198.         sbb     al,69h
  1199.         das
  1200.         mov     [edi+ecx-1],al
  1201.         shr     ebx,4
  1202.         loop    .1
  1203.         mov     ecx,8*65536+16
  1204. .2:
  1205.         push    edi
  1206.         xor     ebx,ebx
  1207.         mov     al,[edi]
  1208.         shl     eax,4
  1209.         add     eax,font_buffer
  1210.         xchg    eax,ebx
  1211.         mov     edi,palitra.5
  1212.         mov     ebp,0
  1213.         mcall   65
  1214.         add     edx,8*65536
  1215.         pop     edi
  1216.         inc     edi
  1217.         dec     dword [esp]
  1218.         jnz     .2
  1219.         add     esp,4
  1220.         popad
  1221.         ret
  1222. ;------------------------------------------------------
  1223. align   4
  1224. input_from_keyboard:
  1225.         xor     al,al
  1226.         sub     ah,48
  1227.         cmp     ah,9
  1228.         jle     .1
  1229.         sub     ah,7
  1230.         cmp     ah,15
  1231.         jle     .1
  1232.         sub     ah,32
  1233. .1:
  1234.         bt      [flags],1
  1235.         jnc     .2
  1236.         mov     ebx,[cursor]
  1237.         and     bl,1
  1238.         jz      .2
  1239.         inc     [file_size]
  1240.         call    raspred_mem
  1241.         mov     edi,[current_offset]
  1242.         add     edi,[file_buffer]
  1243.         mov     esi,[file_buffer]
  1244.         add     esi,[file_size]
  1245.         dec     esi
  1246. @@:
  1247.         cmp     edi,esi
  1248.         ja      @f
  1249.         mov     bl,[esi]
  1250.         mov     [esi+1],bl
  1251.         dec     esi
  1252.         jmp     @b
  1253. @@:
  1254.         call    show_file_size
  1255.         mov     ebx,[current_offset]
  1256.         add     ebx,[file_buffer]
  1257.         mov     byte [ebx],0
  1258. .2:
  1259.         mov     ecx,[current_offset]
  1260.         add     ecx,[file_buffer]
  1261.         ;см.    первую  версию  heed.asm
  1262.         mov     dl,[ecx]        ;оригинальный байт
  1263.         mov     ebx,[cursor]
  1264.         and     bl,1    ;нечет - редактируем старший полубайт
  1265.         jnz     .hi_half_byte ;чёт - старший
  1266.         and     dl,0xf0 ;обнуляем мл. п-байт оригинального байта
  1267.         jmp     .patch_byte
  1268. .hi_half_byte:  ;одновременно сдвигаем нужное значение в ст п-т и обнуляем младший
  1269.         shl     ax,4
  1270.         and     dl,0x0f ;обнуляем старший полубайт у оригинального байта
  1271. .patch_byte:
  1272.         or      ah,dl
  1273.         mov     [ecx],ah
  1274.         jmp     RIGHT
  1275.  
  1276. raspred_mem:
  1277.         pushad
  1278.         xor     edx,edx
  1279.         mov     ecx,4096
  1280.         mov     eax,[file_size]
  1281.         inc     eax
  1282.         div     ecx
  1283.         cmp     eax,[prev_f_size_bl]
  1284.         ja      @f
  1285.         je      .ret
  1286.         cmp     [file_size],4096
  1287.         jbe     .ret
  1288.         mov     [prev_f_size_bl],eax
  1289.         xor     edx,edx
  1290.         mul     ecx
  1291.         mov     ecx,eax
  1292.         jmp     .1
  1293. @@:
  1294.         mov     [prev_f_size_bl],eax
  1295.         xor     edx,edx
  1296.         mul     ecx
  1297.         add     ecx,eax
  1298. .1:
  1299.         mcall   68,20,,[file_buffer]
  1300. .ret:
  1301.         popad
  1302.         ret
  1303. ;---------------------------------------
  1304.  
  1305. align   4
  1306. show_file_size:
  1307.         mov     ebx,[file_size]
  1308.         mov     edx,[low_area];
  1309.         mov     esi,1
  1310.         mov     ecx,8
  1311.         call    hex_output
  1312.         ret
  1313.  
  1314.  
  1315. align   4
  1316. draw_window:
  1317.         xor     esi,esi
  1318.         mcall   0,100*65536+653,100*65536+360,((0x73 shl 24) + frgrd_color),,title
  1319.         mcall   9,threath_buf,-1
  1320.         cmp     byte [threath_buf+70],3 ;окно свёрнуто в заголовок?
  1321.         jnae    @f
  1322. .@d:
  1323.         call    end_draw
  1324.         add     esp,4
  1325.         jmp     still
  1326. @@:
  1327.         cmp     dword [threath_buf+66],(24*4)   ;проверка минимальной высоты
  1328.         jae     @f
  1329.         mov     esi,dword [threath_buf+46]
  1330.         sub     esi,dword [threath_buf+66]
  1331.         add     esi,24*4
  1332.         mcall   67,-1,-1,-1,
  1333.         jmp     .@d
  1334. @@:
  1335.         cmp     dword [threath_buf+62],(26*6)   ;проверка минимальной ширины
  1336.         jae     @f
  1337.         mov     edx,dword [threath_buf+42]
  1338.         sub     edx,dword [threath_buf+62]
  1339.         add     edx,26*6
  1340.         mcall   67,-1,-1,,-1
  1341.         jmp     .@d
  1342. @@:
  1343.         mov     eax,[file_size]
  1344.         mov     ebx,[bytes_per_line]
  1345.         xor     edx,edx
  1346.         div     ebx
  1347.         mov     [scroll_bar_data_vertical.size_x],0
  1348.         cmp     eax,[number_strings]
  1349.         jl      @f
  1350.         mov     [scroll_bar_data_vertical.size_x],scroll_width_size
  1351. @@:
  1352.         mov     eax,dword [threath_buf+62]      ;ширина клиентской области
  1353.         sub     ax,[scroll_bar_data_vertical.size_x]
  1354.         mov     [scroll_bar_data_vertical.start_x],ax
  1355.         mov     eax,dword [threath_buf+66]      ;высота клиентской области
  1356.         sub     eax,24+24-11
  1357.         mov     [scroll_bar_data_vertical.size_y],ax
  1358.         mov     ebx,eax
  1359.         push    eax
  1360.         add     ebx,20
  1361.         mov     [scroll_bar_data_vertical.max_area],ebx
  1362.         mov     ebx,[scroll_bar_data_vertical.btn_high]
  1363.         shl     ebx,1
  1364.         add     ebx,20
  1365.         mov     [scroll_bar_data_vertical.cur_area],ebx
  1366.         pop     eax
  1367.         sub     eax,3
  1368.         mov     ebx,18
  1369.         xor     edx,edx
  1370.         div     bx
  1371.         mov     [number_strings],eax    ;кол-во hex строк в окне
  1372.         mov     ebx,[bytes_per_line]
  1373.         mul     ebx
  1374.         mov     edi,[screen_table]      ;кол-во байтов для вывода
  1375.         mov     dword [edi],eax
  1376.  
  1377.         push    eax
  1378.  
  1379.         mov     ebx,dword [threath_buf+62]
  1380.         inc     ebx
  1381.         mov     ecx,(FIRST_HEX-18)
  1382.         ror     ecx,16
  1383.         mov     cx,18
  1384.         ror     ecx,16
  1385.         mcall   13,,,frgrd_color        ;полоса сверху
  1386.  
  1387.         mcall   ,,18,panel_clr1 ;верхняя панель
  1388.  
  1389.         dec     ebx
  1390.         mcall   38,,<18,18>,panel_clr2
  1391.         mov     ecx,dword [threath_buf+66]
  1392.         sub     cx,18
  1393.         push    cx
  1394.         shl     ecx,16
  1395.         pop     cx
  1396.         mcall   ,,,panel_clr3   ;нижняя панель
  1397.         add     ecx,1*65536
  1398.         mov     cx,18
  1399. ;       inc     ebx
  1400.         mcall   13,,,panel_clr1
  1401.  
  1402.  
  1403.         mov     eax,dword [threath_buf+62]
  1404.         sub     eax,scroll_width_size
  1405.         shr     eax,3   ;div 8
  1406.         mov     [len_str_scr],eax
  1407.  
  1408.  
  1409.         mov     eax,[len_str_scr]
  1410.         shl     eax,1
  1411.         cmp     eax,[ready_screen_buffer.string_size]
  1412.         jae     @f
  1413.  
  1414.         mov     edi,[screen_table]
  1415.         mov     eax,[bytes_per_line]
  1416.         sub     dword [edi],eax
  1417.         dec     [number_strings]
  1418.  
  1419. @@:
  1420.         shr     ecx,16
  1421.         mov     edx,ecx
  1422.         mov     ecx,(FIRST_HEX)
  1423.         shr     ecx,16
  1424.         mov     eax,[number_strings]
  1425.         lea     ebx,[eax*8];*18
  1426.         lea     ebx,[ebx*2]
  1427.         lea     eax,[eax*2]
  1428.         add     eax,ebx
  1429.         add     cx,ax
  1430.         add     cx,21
  1431.         sub     dx,cx
  1432.         shl     ecx,16
  1433.         add     cx,dx
  1434.         sub     ecx,1*65536
  1435.         movzx   ebx,    word [scroll_bar_data_vertical.start_x]
  1436.         mcall   13,,,frgrd_color
  1437.  
  1438.         pop     eax
  1439.  
  1440.         cmp     eax,[file_size]
  1441.         jge     @f
  1442. ;       push    dword scroll_bar_data_vertical
  1443. ;       call    [scrollbar_ver_mouse]
  1444.         xor     eax,eax
  1445.         inc     eax
  1446.         mov     [scroll_bar_data_vertical.all_redraw],eax
  1447.         push    dword scroll_bar_data_vertical  ;draw for Vertical ScrollBar
  1448.         call    [scrollbar_ver_draw]
  1449.         xor     eax,eax ;reset all_redraw flag
  1450.         mov     [scroll_bar_data_vertical.all_redraw],eax
  1451. @@:
  1452.         push    dword menu_data_1       ;draw for Menu 1
  1453.         call    [menu_bar_draw]
  1454.         push    dword menu_data_2       ;draw for Menu 2
  1455.         call    [menu_bar_draw]
  1456.         push    dword menu_data_3       ;draw for Menu 3
  1457.         call    [menu_bar_draw]
  1458.  
  1459. ;;;
  1460.  
  1461.         mov     eax,dword [threath_buf+66]
  1462.         add     eax,8*65536-15
  1463.         mov     [low_area],eax
  1464.  
  1465.         mov     ebx,[beg_str_scr]
  1466.         mov     [beg_str_scr],0
  1467.         mov     eax,[len_str_scr]
  1468.         shl     eax,1
  1469.         cmp     eax,[ready_screen_buffer.string_size]
  1470.         jae     @f
  1471.  
  1472.         mov     [beg_str_scr],ebx
  1473.         movzx   eax,word [threath_buf+66]
  1474.         sub     eax,34
  1475.         mov     [scroll_bar_data_horizontal.start_y],ax
  1476.  
  1477. ;cur_area/(size_x-30)=len_str_scr/string_size
  1478.  
  1479.         mov     eax,dword [threath_buf+62]
  1480.         sub     ax,[scroll_bar_data_vertical.size_x]
  1481.         mov     [scroll_bar_data_horizontal.size_x],ax
  1482.         sub     eax,[scroll_bar_data_horizontal.btn_high]
  1483.         sub     eax,[scroll_bar_data_horizontal.btn_high]
  1484.         mov     [scroll_bar_data_horizontal.max_area],eax
  1485.         xor     edx,edx
  1486.         mov     ebx,[len_str_scr]
  1487.         mul     ebx
  1488.         mov     ebx,[ready_screen_buffer.string_size]
  1489.         shr     ebx,1
  1490.         div     ebx
  1491.         mov     [scroll_bar_data_horizontal.cur_area],eax
  1492.  
  1493.         push    dword scroll_bar_data_horizontal        ;draw for Horizontal ScrollBar
  1494.         call    [scrollbar_hor_mouse]
  1495.         xor     eax,eax
  1496.         inc     eax
  1497.         mov     [scroll_bar_data_horizontal.all_redraw],eax
  1498.         push    dword scroll_bar_data_horizontal        ;draw for Vertical ScrollBar
  1499.         call    [scrollbar_hor_draw]
  1500.         xor     eax,eax ;reset all_redraw flag
  1501.         mov     [scroll_bar_data_horizontal.all_redraw],eax
  1502. @@:
  1503.         mov     eax,[low_area]
  1504.         mov     edi,[screen_table]
  1505.         mov     esi,[bytes_per_line]
  1506.         mov     ecx,esi
  1507.         shl     ecx,1
  1508.         mov     eax,[edi]
  1509.         mov     ebx,[cursor]
  1510.         inc     ebx
  1511.         shr     ebx,1
  1512. @@:
  1513.         cmp     eax,ebx
  1514.         jge     @f
  1515.         add     [begin_offset],esi
  1516.         sub     [cursor],ecx
  1517.         sub     ebx,esi
  1518.         jmp     @b
  1519. @@:
  1520.         bts     [flags],6
  1521.         ret
  1522.  
  1523. align   4
  1524. start_draw:
  1525.         mcall   12,1
  1526.         ret
  1527.  
  1528. end_draw:
  1529.         mcall   12,2
  1530.         ret
  1531.  
  1532. close_prog:
  1533.         mcall   -1
  1534. ;-------------------------------------------------------------------------------
  1535. change_codepage:        ;меняем вторую половину таблицы
  1536.         test    ah,ah
  1537.         jnz     @f
  1538.         btc     [flags],4
  1539.         jc      .1
  1540.         push    [codepage_offset]
  1541.         pop     [codepage_offset_previous]
  1542.         mov     [codepage_offset],2*128
  1543.         jmp     .end
  1544. .1:
  1545.         push    [codepage_offset_previous]
  1546.         pop     [codepage_offset]
  1547.         jmp     .end
  1548. @@:
  1549.         cmp     [codepage_offset],0
  1550.         jne     @f
  1551.         add     [codepage_offset],128
  1552.         jmp     .end
  1553. @@:
  1554.         mov     [codepage_offset],0
  1555. .end:
  1556.         call    show_codepage
  1557.         jmp     red
  1558.  
  1559. show_codepage:
  1560.         mov     ebp,6
  1561.         mov     edx,dword [threath_buf+62]
  1562.         sub     edx,73
  1563.         shl     edx,16
  1564.         add     edx,[low_area]
  1565.         mov     edi,string_cp866
  1566.         cmp     [codepage_offset],0
  1567.         je      @f
  1568.         add     edi,6
  1569.         cmp     [codepage_offset],128
  1570.         je      @f
  1571.         add     edi,6
  1572. @@:
  1573.         mov     ecx,8*65536+16
  1574.         mov     esi,1
  1575.         push    ebp
  1576.         mov     ebp,0
  1577. @@:
  1578.         xor     ebx,ebx
  1579.         push    edi
  1580.         mov     bl,[edi]
  1581.         shl     bx,4
  1582.         add     ebx,font_buffer
  1583.         mov     edi,palitra.5
  1584.         mcall   65
  1585.         add     edx,8*65536
  1586.         pop     edi
  1587.         inc     edi
  1588.         dec     dword [esp]
  1589.         jnz     @b
  1590.         add     esp,4
  1591.         ret
  1592.  
  1593. show_insert:    ;отображение режима вставки/замены
  1594.         mov     ebp,3
  1595.         mov     edx,dword [threath_buf+62]
  1596.         sub     edx,120
  1597.         shl     edx,16  ; mov edx,428*65536+335
  1598.         add     edx,[low_area]
  1599.         mov     edi,string_ins
  1600.         push    ebp
  1601.         mov     ecx,8*65536+16
  1602.         mov     esi,1
  1603.         mov     ebp,0
  1604. .1:
  1605.         xor     ebx,ebx
  1606.         push    edi
  1607.         bt      [flags],1
  1608.         jnc     .2
  1609.         mov     bl,[edi]
  1610.         shl     bx,4
  1611. .2:
  1612.         add     ebx,font_buffer
  1613.         mov     edi,palitra.5
  1614.         mcall   65
  1615.         add     edx,8*65536
  1616.         pop     edi
  1617.         inc     edi
  1618.         dec     dword [esp]
  1619.         jnz     .1
  1620.         add     esp,4
  1621.         ret
  1622. ;-------------------------------------------------------------------------------
  1623.         ;help window
  1624. create_help_window:
  1625.         pushad
  1626.         cmp     [help_is_open_already], 1
  1627.         jne     @f
  1628.         mov     ECX, [help_window_pid]
  1629.         mcall   18, 21
  1630.         xchg    EAX, ECX
  1631.         mcall   18, 3
  1632.         popad
  1633.         ret
  1634. @@:
  1635.         mcall   51,1,.thread,(.threat_stack+16*4)
  1636.         mov     [help_is_open_already], 1
  1637.         mov     [help_window_pid], EAX
  1638.         popad
  1639.         ret
  1640. .thread:
  1641.         call    .window
  1642. .still:
  1643.         mcall   10
  1644.         dec     al
  1645.         jz      .red
  1646.         dec     al
  1647.         jz      .key
  1648.         dec     al
  1649.         jz      .button
  1650.         jmp     .still
  1651.         and     [help_is_open_already], 0
  1652.         mcall   -1
  1653. .button:
  1654.         mcall   17,1
  1655.         cmp     ah,1
  1656.         jne     @f
  1657.         and     [help_is_open_already], 0
  1658.         mcall   -1
  1659. @@:
  1660.         cmp     ah,2
  1661.         jne     @f
  1662.         mov     edi,(help_end-help_text)/51
  1663.         movzx   eax,[cur_help_string]
  1664.         sub     edi,13
  1665.         sub     edi,eax
  1666.         jz      .still
  1667.         inc     [cur_help_string]
  1668.         jmp     .red
  1669. @@:
  1670.         cmp     ah,3
  1671.         jne     .still
  1672.         cmp     [cur_help_string],0
  1673.         je      .still
  1674.         dec     [cur_help_string]
  1675.         jmp     .red
  1676.  
  1677. .key:
  1678.         mcall   2
  1679.         jmp     .still
  1680.  
  1681. .red:
  1682.         call    .window
  1683.         jmp     .still
  1684.  
  1685. .window:
  1686.         pushad
  1687.         mcall   12,1
  1688.         mcall   0,50*65536+320,0x70*65536+240,0x13000000,,help_but_text
  1689.         mcall   8,<130,20>,<6,12>,2,0xaaaaaa
  1690.         mcall   ,<150,20>,,3,
  1691.         mov     ebx,8*65536+15
  1692.         mov     ecx,0x00DDDDDD
  1693.         xor     edx,edx
  1694.         movzx   eax,byte [cur_help_string]
  1695.         mov     edi,(help_end-help_text)/51
  1696.         sub     edi,eax
  1697.         mov     esi,51
  1698.         mul     si
  1699.         mov     edx,help_text
  1700.         add     edx,eax
  1701.         mov     eax,4
  1702. @@:
  1703.         add     ebx,0x10
  1704.         mcall
  1705.         add     edx,51
  1706.         dec     edi
  1707.         jnz     @b
  1708.         mcall   12,2
  1709.         popad
  1710.         ret
  1711.  
  1712. .threat_stack:  times   16      dd      0
  1713. ;-------------------------------------------------
  1714.  
  1715. open_file:
  1716.         mov     [func_70.func_n],5
  1717.         mov     [func_70.param1],0
  1718.         mov     [func_70.param2],0
  1719.         mov     [func_70.param3],0
  1720.         mov     [func_70.param4],bufferfinfo
  1721.         mov     [func_70.rezerv],0
  1722.         mov     [func_70.name],file_name
  1723.         mcall   70,func_70
  1724.  
  1725.         test    al,al   ;файл найден?
  1726.         jz      @f
  1727.         mcall   4,400*65536+31,0x80CC0000,error_open_file_string
  1728.         jmp     open_file
  1729. @@:
  1730. ;       mov     edx,[blocks_counter]
  1731. ;       mov     edi,[blocks_table]
  1732. ;       @@:     mov     ecx,[edi]       ;высвобождаем:
  1733. ;       mcall   68,13   ;блоки файла
  1734. ;       add     edi,8
  1735. ;       dec     edx
  1736. ;       jnz     @b
  1737. ;       mcall   68,13,[blocks_table]    ;таблицу
  1738.  
  1739.         mov     eax,    dword [bufferfinfo+32]  ;копируем размер файла
  1740.         mov     [file_size],eax
  1741.  
  1742. ;       mov     ebx,65536       ;64КБ блок
  1743. ;       xor     edx,edx
  1744. ;       div     ebx
  1745. ;       push    dx      ;длина последнего блока
  1746. ;       test    dx,dx
  1747. ;       jz      @f
  1748. ;       inc     eax
  1749. ;       @@:     test    eax,eax
  1750. ;       jnz     @f
  1751. ;       inc     eax
  1752. ;       @@:     mov     [blocks_counter],eax
  1753. ;       sal     eax,3;*8        ;размер таблицы с индексами блоков
  1754. ;;      add     eax,32  ;решаем проблему с 32МБ файлами
  1755.  
  1756. ;       mov     ecx,eax ;выделяем память:
  1757. ;       mcall   68,12   ;под таблицу
  1758. ;       mov     [blocks_table],eax
  1759. ;       mov     edi,eax
  1760. ;       mov     ecx,[blocks_counter]
  1761. ;       @@:     mov     dword [edi+4],65536
  1762. ;       add     edi,8
  1763. ;       loop    @b
  1764. ;       xor     edx,edx
  1765. ;       pop     dx      ;длина последнего блока
  1766. ;       mov     dword [edi-4],edx
  1767.  
  1768. ;       mov     edx,[blocks_counter]
  1769. ;       mov     edi,[blocks_table]
  1770. ;@@:    mcall   68,12,[edi+4]   ;под блок
  1771. ;       mov     [edi],eax
  1772. ;       add     edi,8
  1773. ;       dec     edx
  1774. ;       jnz     @b
  1775.  
  1776.         mcall   68,13,[file_buffer]
  1777.         test    eax,eax
  1778.         jnz     @f
  1779.         ;здесь ошибка на не освобождение блока
  1780. @@:
  1781.         mcall   68,12,[file_size]
  1782.         mov     [file_buffer],eax
  1783.  
  1784. ;;имеем таблицу: [ DWORD указатель на первый элемент блока : DWORD длина блока ]
  1785.  
  1786. ;       mov     ecx,[blocks_counter]    ;открываем файл
  1787. ;       mov     edi,[blocks_table]
  1788.         mov     [func_70.func_n],0
  1789.         mov     [func_70.param1],0
  1790.         mov     [func_70.param2],0
  1791.         mov     [func_70.rezerv],0
  1792.         mov     [func_70.name],file_name
  1793. ;@@:
  1794.         push    dword [file_size];dword [edi+4]
  1795.         pop     dword [func_70.param3]
  1796.         push    dword [file_buffer];dword [edi]
  1797.         pop     dword [func_70.param4]
  1798.         mcall   70,func_70
  1799. ;       add     edi,8
  1800. ;       add     dword [func_70.param1],65536
  1801. ;       loop    @b
  1802.  
  1803.         test    eax,eax
  1804.         jz      @f
  1805.         ;ошибка чтения
  1806. @@:
  1807.         call    Ctrl_HOME
  1808.  
  1809.         jmp     redraw_all
  1810. ;-------------------------------------------------------------------------------
  1811. open_dialog_save:
  1812.         mov     [OpenDialog_data.type],1        ; Save
  1813.  
  1814.         push    dword OpenDialog_data
  1815.         call    [OpenDialog_Start]
  1816.  
  1817. ;       cmp     [OpenDialog_data.status],2      ; OpenDialog does not start
  1818. ;;      je      .sysxtree       ; some kind of alternative, instead OpenDialog
  1819. ;       je      save_file
  1820.         cmp     [OpenDialog_data.status],1
  1821.         jne     still
  1822.         mov     esi,fname_buf
  1823.         mov     edi,file_name
  1824.         cld
  1825. @@:
  1826.         cmp     byte [esi],0
  1827.         je      @f
  1828.         movsb
  1829.         jmp     @b
  1830. @@:
  1831.         mov     byte [edi],0
  1832.         sub     esi,path
  1833.         mov     [edit1.size],esi
  1834.         mov     [edit1.pos],esi
  1835. ;       jmp     save_file
  1836. ;-------------------------------------------------------------------------------
  1837. save_file:      ;сохраняем файл
  1838.         mov     [func_70.func_n],2
  1839.         mov     [func_70.param1],0
  1840.         mov     [func_70.param2],0
  1841.         push    [file_size]
  1842.         pop     [func_70.param3]
  1843.         push    [file_buffer]
  1844.         pop     [func_70.param4]
  1845.         mov     [func_70.rezerv],0
  1846.         mov     [func_70.name],file_name
  1847.         mcall   70,func_70
  1848.         cmp     al,0    ;сохранён удачно?
  1849.         je      redraw_all
  1850.         mcall   4,400*65536+31,0x80CC0000,error_save_file_string
  1851.         jmp     save_file
  1852. ;-------------------------------------------------------------------------------
  1853. draw_ed_box:    ;рисование edit box'а
  1854. .1:
  1855.         push    eax     ebx     ecx     edx
  1856.         mcall   13,180*65536+220,25*65536+70,0xaaaaaa
  1857.         bt      [flags],9
  1858.         jnc     @f
  1859.         mcall   4,246*65536+35,0x80ffffff,sel_text
  1860. @@:
  1861.         bt      [flags],2
  1862.         jnc     @f
  1863.         push    dword Option_boxs
  1864.         call    [option_box_draw]
  1865. @@:
  1866.         bt      [flags],3
  1867.         jnc     @f
  1868.         push    dword Option_boxs2
  1869.         call    [option_box_draw]
  1870. @@:
  1871.         mov     eax,ed_box_data
  1872.         mov     ecx,[eax]
  1873. @@:
  1874.         add     eax,4
  1875.         push    dword [eax]
  1876.         call    [edit_box_draw]
  1877.         loop    @b
  1878.         pop     edx     ecx     ebx     eax
  1879. .2:
  1880.         mcall   10
  1881.         cmp     al,6
  1882.         je      .mouse
  1883.         cmp     al,3
  1884.         je      .button
  1885.         cmp     al,2
  1886.         je      .keys
  1887.         cmp     al,1
  1888.         jne     .2
  1889.         call    draw_window
  1890.         call    main_area
  1891.         bt      [flags],2
  1892.         jnc     @f
  1893.         push    dword Option_boxs
  1894.         call    [option_box_draw]
  1895. @@:
  1896.         bt      [flags],3
  1897.         jnc     @f
  1898.         push    dword Option_boxs2
  1899.         call    [option_box_draw]
  1900. @@:
  1901.         jmp     .1
  1902.  
  1903. .mouse:
  1904.         bt      [flags],2
  1905.         jnc     @f
  1906.         push    dword Option_boxs
  1907.         call    [option_box_mouse]
  1908. @@:
  1909.         bt      [flags],3
  1910.         jnc     @f
  1911.         push    dword Option_boxs2
  1912.         call    [option_box_mouse]
  1913. @@:
  1914.         jmp     .2
  1915.  
  1916. .keys:
  1917.         mcall   2
  1918.         cmp     ah,13
  1919.         je      .4
  1920.         cmp     ah,27
  1921.         je      .3
  1922.  
  1923.         bt      [flags],2       ;проверка на применимость символов 0-9,a-b
  1924.         jnc     .eb2
  1925. .eb1:
  1926.         cmp     ah,9
  1927.         jne     .eb1_1
  1928.         push    edx
  1929.         mov     edx,[option_group1]
  1930.         cmp     edx,op1
  1931.         jne     @f
  1932.         mov     edx,op2
  1933.         jmp     .eb1_2
  1934. @@:
  1935.         cmp     edx,op2
  1936.         jne     @f
  1937.         mov     edx,op3
  1938.         jmp     .eb1_2
  1939. @@:
  1940.         mov     edx,op1
  1941. .eb1_2:
  1942.         mov     [option_group1],edx
  1943.         pop     edx
  1944.         jmp     .1
  1945. .eb1_1:
  1946.         cmp     ah,48
  1947.         jb      .eb1_3
  1948.         cmp     ah,57
  1949.         jbe     .eb
  1950.         cmp     ah,102
  1951.         jg      .eb1_3
  1952.         cmp     ah,97
  1953.         jge     .eb
  1954. .eb1_3:
  1955.         cmp     ah,182
  1956.         je      .eb
  1957.         cmp     ah,8
  1958.         je      .eb
  1959.         cmp     ah,176
  1960.         je      .eb
  1961.         cmp     ah,179
  1962.         je      .eb
  1963.         dec     [edit2.shift]
  1964.         dec     [edit2.shift+4]
  1965.  
  1966.         push    dword [ed_box_data+4];  [esp]
  1967.         call    [edit_box_draw]
  1968.         jmp     .2
  1969.  
  1970. .eb2:
  1971.         bt      [flags],3
  1972.         jnc     .eb3
  1973.         cmp     ah,9
  1974.         jne     .eb2_2
  1975.         push    edx
  1976.         mov     edx,[option_group2]
  1977.         cmp     edx,op11
  1978.         jne     @f
  1979.         mov     edx,op12
  1980.         jmp     .eb2_1
  1981. @@:
  1982.         mov     edx,op11
  1983. .eb2_1:
  1984.         mov     [option_group2],edx
  1985.         pop     edx
  1986.         jmp     .1
  1987. .eb2_2:
  1988.         cmp     ah,182
  1989.         je      .eb
  1990.         cmp     ah,8
  1991.         je      .eb
  1992.         cmp     ah,176
  1993.         je      .eb
  1994.         cmp     ah,179
  1995.         je      .eb
  1996.         mov     edx,[option_group2]
  1997.         cmp     edx,op11
  1998.         jne     .eb
  1999.         cmp     ah,48
  2000.         jb      .eb2_3
  2001.         cmp     ah,57
  2002.         jbe     .eb
  2003.         cmp     ah,102
  2004.         jg      .eb2_3
  2005.         cmp     ah,97
  2006.         jge     .eb
  2007. .eb2_3:
  2008.         dec     [edit3.shift]
  2009.         dec     [edit3.shift+4]
  2010.         push    dword [ed_box_data+4];[esp]
  2011.         call    [edit_box_draw]
  2012.         jmp     .2
  2013. .eb3:
  2014.         bt      [flags],9
  2015.         jnc     .eb
  2016.         cmp     ah,9
  2017.         je      .eb3_1
  2018.         cmp     ah,182
  2019.         je      .eb3_2
  2020.         cmp     ah,8
  2021.         je      .eb3_2
  2022.         cmp     ah,176
  2023.         je      .eb3_2
  2024.         cmp     ah,179
  2025.         je      .eb3_2
  2026.         cmp     ah,48
  2027.         jb      .eb3_3
  2028.         cmp     ah,57
  2029.         jbe     .eb3_2
  2030.         cmp     ah,102
  2031.         jg      .eb3_3
  2032.         cmp     ah,97
  2033.         jge     .eb3_2
  2034. .eb3_3:
  2035.         push    edx
  2036.         mov     edx,[edit4.flags]
  2037.         and     edx,2
  2038.         jz      @f
  2039.         pop     edx
  2040.         dec     [edit4.shift]
  2041.         dec     [edit4.shift+4]
  2042.         jmp     .2
  2043. @@:
  2044.         pop     edx
  2045.         dec     [edit5.shift]
  2046.         dec     [edit5.shift+4]
  2047.         jmp     .2
  2048. .eb3_1:
  2049.         push    edx
  2050.         mov     edx,[edit4.flags]
  2051.         and     edx,2
  2052.         jz      @f
  2053.         pop     edx
  2054.         mov     [edit5.flags],2
  2055.         mov     [edit4.flags],0
  2056.         jmp     .eb3_2
  2057. @@:
  2058.         pop     edx
  2059.         mov     [edit4.flags],2
  2060.         mov     [edit5.flags],0
  2061. .eb3_2:
  2062.         push    dword [ed_box_data+4]
  2063.         call    [edit_box_key]
  2064.         push    dword [ed_box_data+8]
  2065.         call    [edit_box_key]
  2066.         jmp     .1
  2067.  
  2068. .eb:
  2069.         push    dword [ed_box_data+4];[esp]
  2070.         call    [edit_box_key]
  2071.         jmp     .2
  2072.  
  2073. .button:
  2074.         mcall   17
  2075.         cmp     ah,1
  2076.         jne     .2
  2077.         jmp     close_prog
  2078. .3:
  2079.         btr     [flags],2
  2080.         btr     [flags],3
  2081.         add     esp,4
  2082.         jmp     redraw_all
  2083. .4:
  2084.         mcall   13,180*65536+220,25*65536+70,frgrd_color
  2085.         ret
  2086.  
  2087.  
  2088. ;-------------------------------------------------
  2089. ;-------------------------------------------------
  2090. ;-------------------------------------------------
  2091.  
  2092. strtohex:
  2093. ;enter: edi - pointer to string,ebx - pointer to size of string; exit: eax in hex
  2094.         mov     esi,hex8_string
  2095. @@:
  2096.         mov     ah,[edi+ecx-1]  ;обработка введённых символов
  2097.         sub     ah,48
  2098.         cmp     ah,9
  2099.         jbe     .1
  2100.         sub     ah,7
  2101.         cmp     ah,15
  2102.         jbe     .1
  2103.         sub     ah,32
  2104. .1:
  2105.         mov     [esi+ecx-1],ah
  2106.         dec     ecx
  2107.         jnz     @b
  2108.         mov     ecx,[ebx]
  2109.         xor     eax,eax
  2110. .2:
  2111.         shl     eax,4
  2112.         or      al,[esi]
  2113.         inc     esi
  2114.         dec     ecx
  2115.         jnz     .2
  2116.         ret
  2117.  
  2118. Ctrl_G:
  2119.         bts     [flags],2
  2120.         mov     dword [ed_box_data],1
  2121.         mov     dword [ed_box_data+4],edit2
  2122.         call    draw_ed_box
  2123.         btr     [flags],2
  2124.         mov     ecx,[edit2.size]
  2125.         test    ecx,ecx
  2126.         jz      .end
  2127.         cmp     ecx,8
  2128.         jg      Ctrl_G
  2129.  
  2130.         mov     edi,go_to_string
  2131.         mov     ebx,edit2.size
  2132.         call    strtohex
  2133.  
  2134.         cmp     eax,[file_size] ;выбор check_box'а
  2135.         jg      Ctrl_G
  2136.         mov     edx,[option_group1]
  2137.         cmp     edx,op1 ;abs
  2138.         je      .abs
  2139.         cmp     edx,op2
  2140.         jne     .back
  2141.         add     eax,[current_offset]    ;forward
  2142.         cmp     eax,[file_size]
  2143.         jg      Ctrl_G
  2144.         mov     edi,[screen_table]
  2145.         mov     edi,[edi]
  2146.         xor     edx,edx
  2147. @@:
  2148.         add     edx,edi
  2149.         cmp     eax,edx
  2150.         jg      @b
  2151.         sub     edx,edi
  2152.         mov     [begin_offset],edx
  2153.         sub     eax,edx
  2154.         shl     eax,1
  2155.         inc     eax
  2156.         mov     [cursor],eax
  2157.         jmp     .end
  2158.  
  2159. .back:
  2160.         cmp     eax,[current_offset]    ;back
  2161.         jg      Ctrl_G
  2162.         mov     edi,[screen_table]
  2163.         mov     edi,[edi]
  2164.         mov     ebx,[current_offset]
  2165.         sub     ebx,eax
  2166.         xor     edx,edx
  2167. @@:
  2168.         add     edx,edi
  2169.         cmp     edx,ebx
  2170.         jb      @b
  2171.         sub     edx,edi
  2172.         mov     [begin_offset],edx
  2173.         sub     ebx,edx
  2174.         mov     edx,ebx
  2175.         shl     edx,1
  2176.         inc     edx
  2177.         mov     [cursor],edx
  2178.         jmp     .end
  2179. .abs:
  2180.         mov     esi,[screen_table]
  2181.         mov     esi,[esi]
  2182.         xor     ebx,ebx
  2183. .3:
  2184.         add     ebx,esi
  2185.         cmp     eax,ebx
  2186.         jg      .3
  2187.         sub     ebx,esi
  2188.         cmp     ebx,[file_size]
  2189.         jg      Ctrl_G
  2190.         mov     [begin_offset],ebx
  2191.         sub     eax,ebx
  2192.         shl     eax,1
  2193.         inc     eax
  2194.         mov     [cursor],eax
  2195. .end:
  2196.         jmp     red
  2197.  
  2198. Ctrl_B:
  2199.         bts     [flags],9
  2200.         mov     dword [ed_box_data],2
  2201.         mov     dword [ed_box_data+4],edit4
  2202.         mov     dword [ed_box_data+8],edit5
  2203.         call    draw_ed_box
  2204.         btr     [flags],9
  2205.  
  2206.         mov     ecx,[edit4.size]
  2207.         test    ecx,ecx
  2208.         jz      .end
  2209.         cmp     ecx,8
  2210.         jg      Ctrl_B
  2211.  
  2212.         mov     edi,sel1_string
  2213.         mov     ebx,edit4.size
  2214.         call    strtohex
  2215.  
  2216.         cmp     eax,[file_size]
  2217.         jge     Ctrl_B
  2218.         push    eax     ;from
  2219.         mov     ecx,[edit5.size]
  2220.         test    ecx,ecx
  2221.         jz      .end
  2222.         cmp     ecx,8
  2223.         jg      Ctrl_B
  2224.  
  2225.         mov     edi,sel2_string
  2226.         mov     ebx,edit5.size
  2227.         call    strtohex
  2228.  
  2229.         cmp     eax,[file_size]
  2230.         jb      @f
  2231.         pop     eax
  2232.         jmp     Ctrl_B
  2233. @@:
  2234.         pop     [shblock_beg]
  2235.         cmp     eax,[shblock_beg]
  2236.         jae     @f
  2237.         xchg    eax,[shblock_beg]
  2238. @@:
  2239.         mov     [shblock_end],eax
  2240.         bts     [flags],8
  2241. .end:
  2242.         jmp     red
  2243.  
  2244. Ctrl_F:
  2245.         bts     [flags],3
  2246.         mov     dword [ed_box_data],1
  2247.         mov     dword [ed_box_data+4],edit3
  2248.         call    draw_ed_box
  2249.         btr     [flags],3
  2250.         mov     ecx,[edit3.size]
  2251.         test    ecx,ecx
  2252.         jz      .end
  2253.         cmp     ecx,8
  2254.         jg      Ctrl_F
  2255.         mov     edi,find_string
  2256.         mov     edx,[option_group2]
  2257.         cmp     edx,op11
  2258.         jne     .find
  2259.         mov     eax,find_string
  2260.         push    dword [eax]
  2261.         push    dword [eax+4]
  2262.         bts     [flags],0
  2263.         mov     ebx,edit3.size
  2264.         call    strtohex
  2265.         mov     ecx,[edit3.size]
  2266.         bt      cx,0
  2267.         jnc     .3
  2268.         inc     ecx
  2269.         shl     eax,4
  2270. .3:
  2271.         shr     ecx,1
  2272. .4:
  2273.         mov     [edi+ecx-1],al
  2274.         shr     eax,8
  2275.         loop    .4
  2276. .find:
  2277.         mov     esi,[current_offset]
  2278.         mov     ebx,[file_size]
  2279.         mov     eax,ebx
  2280.         add     eax,[file_buffer]
  2281.         add     esi,[file_buffer]
  2282. .5:
  2283.         mov     ecx,[edit3.size]
  2284.         cmp     edx,op11
  2285.         jne     .7
  2286.         bt      cx,0
  2287.         jnc     .6
  2288.         inc     ecx
  2289. .6:
  2290.         shr     ecx,1
  2291. .7:
  2292.         cld
  2293. @@:
  2294.         cmp     esi,eax
  2295.         jg      .end
  2296.         cmpsb
  2297.         je      .8
  2298.         mov     edi,find_string
  2299.         jmp     .5
  2300. .8:
  2301.         loop    @b
  2302.         sub     esi,[file_buffer]
  2303.         mov     ecx,[edit3.size]
  2304.         cmp     edx,op11
  2305.         jne     .10
  2306.         bt      cx,0
  2307.         jnc     .9
  2308.         inc     ecx
  2309. .9:
  2310.         shr     ecx,1
  2311. .10:
  2312.         sub     esi,ecx
  2313.         xor     edx,edx
  2314.         mov     edi,[screen_table]
  2315.         mov     edi,[edi]
  2316. @@:
  2317.         add     edx,edi
  2318.         cmp     edx,esi
  2319.         jb      @b
  2320.         sub     edx,edi
  2321.         mov     [begin_offset],edx
  2322.         sub     esi,edx
  2323.         shl     esi,1
  2324.         inc     esi
  2325.         mov     [cursor],esi
  2326. .end:
  2327.         bt      [flags],0
  2328.         jnc     @f
  2329.         mov     eax,find_string
  2330.         pop     dword [eax+4]
  2331.         pop     dword [eax]
  2332.         btr     [flags],0
  2333. @@:
  2334.         jmp     red
  2335.  
  2336. invert_byte:
  2337.         mov     ebx,[current_offset]
  2338.         cmp     ebx,[file_size]
  2339.         jae     still
  2340.         add     ebx,[file_buffer]
  2341.         not     byte [ebx]
  2342.         jmp     red
  2343.  
  2344.  
  2345. Insert: ;переключение   режима  вставки/замены
  2346.         btc     [flags],1       ;not [insert_mod]
  2347.         call    show_insert
  2348.         jmp     red
  2349.  
  2350.  
  2351. DEL:
  2352.         bt      [flags],1
  2353.         jnc     still
  2354.         mov     edi,[current_offset]
  2355.         mov     esi,[file_buffer]
  2356.         mov     edx,[file_size]
  2357.         test    edx,edx
  2358.         jz      still
  2359.         dec     edx
  2360.         cmp     edi,edx
  2361.         jbe     @f
  2362.         call    LEFT
  2363.         call    LEFT
  2364.         jmp     red
  2365. @@:
  2366.         jb      @f
  2367.         call    LEFT
  2368.         call    LEFT
  2369. @@:
  2370.         cmp     edi,edx
  2371.         je      @f
  2372.         mov     al,[edi+esi+1]
  2373.         mov     [edi+esi],al
  2374.         inc     edi
  2375.         jmp     @b
  2376. @@:
  2377.         dec     [file_size]
  2378.         call    show_file_size
  2379.         jmp     red
  2380.  
  2381.  
  2382. BackSpace:
  2383.         bt      [flags],1       ;cmp [insert_mod],0
  2384.         jnc     still   ;je still
  2385.         mov     edi,[current_offset]
  2386.         mov     esi,[file_buffer]
  2387.         mov     edx,[file_size]
  2388.         test    edx,edx
  2389.         jz      still
  2390.         test    edi,edi
  2391.         jz      still
  2392.         call    LEFT
  2393.         call    LEFT
  2394.         cmp     [cursor],2
  2395.         jne     @f
  2396.         cmp     edx,1
  2397.         jne     @f
  2398.         dec     [cursor]
  2399. @@:
  2400.         cmp     edi,edx
  2401.         jge     @f
  2402.         mov     al,[edi+esi]
  2403.         mov     [edi+esi-1],al
  2404.         inc     edi
  2405.         jmp     @b
  2406. @@:
  2407.         dec     [file_size]
  2408.         call    show_file_size
  2409.         jmp     red
  2410.  
  2411.  
  2412. Ctrl_UP:
  2413.         cmp     [begin_offset],0
  2414.         je      @f
  2415.         mov     eax,[bytes_per_line]
  2416.         sub     [begin_offset],eax
  2417. @@:
  2418.         ret
  2419.  
  2420.  
  2421. Ctrl_DOWN:
  2422.         mov     eax,[cursor]
  2423.         dec     eax
  2424.         shr     eax,1
  2425.         add     eax,[begin_offset]
  2426.         mov     ebx,[bytes_per_line]
  2427.         add     eax,ebx
  2428.         cmp     eax,[file_size]
  2429.         jge     @f
  2430.         add     [begin_offset],ebx
  2431. @@:
  2432.         ret
  2433.  
  2434.  
  2435. UP:
  2436.         mov     eax,[current_offset]
  2437.         cmp     eax,[bytes_per_line]
  2438.         jb      still
  2439.         mov     eax,[cursor]
  2440.         dec     ax
  2441.         shr     ax,1
  2442.         cmp     eax,[bytes_per_line]
  2443.         jge     @f
  2444.         mov     eax,[bytes_per_line]
  2445.         sub     [begin_offset],eax
  2446.         jmp     red
  2447. @@:
  2448.         mov     eax,[bytes_per_line]
  2449.         shl     ax,1
  2450.         sub     [cursor],eax
  2451.         jmp     red
  2452.  
  2453.  
  2454. DOWN:   ;на     строку  вниз
  2455.         mov     eax,[current_offset]
  2456.         add     eax,[bytes_per_line]
  2457.         bt      [flags],1
  2458.         jnc     @f
  2459.         dec     eax
  2460. @@:
  2461.         cmp     eax,[file_size]
  2462.         jge     still   ;если мы на последней строке файла, то стоп
  2463.         mov     eax,[screen_table]
  2464.         mov     eax,[eax]
  2465.         mov     edx,[cursor]
  2466.         dec     dx
  2467.         shr     dx,1
  2468.         add     edx,[bytes_per_line]
  2469.         cmp     eax,edx ;на последней строке?
  2470.         jbe     @f
  2471.         mov     eax,[bytes_per_line]
  2472.         shl     ax,1
  2473.         add     [cursor],eax
  2474.         ret
  2475. @@:
  2476.         mov     eax,[bytes_per_line]
  2477.         add     [begin_offset],eax
  2478.         ret
  2479.  
  2480.  
  2481. LEFT:
  2482.         cmp     [cursor],1
  2483.         jbe     @f
  2484.         dec     [cursor]
  2485.         jmp     .end
  2486. @@:
  2487.         cmp     [begin_offset],0        ;курсор на первой строке со смещением 0?
  2488.         jne     @f      ;иначе смещаем с прокруткой вверх вверх и в конец строки
  2489. ;       inc     [cursor]
  2490.         jmp     .end;still      ;тогда стоп
  2491. @@:
  2492.         mov     eax,[bytes_per_line]
  2493.         sub     [begin_offset],eax
  2494.         shl     ax,1
  2495.         dec     eax
  2496.         add     [cursor],eax
  2497. .end:
  2498.         ret
  2499.  
  2500.  
  2501. RIGHT:
  2502.         mov     ecx,[begin_offset]      ;вычисляем смещение курсора
  2503.         mov     edx,[cursor]    ;для проверки существования
  2504.         shr     edx,1   ;следующего символа
  2505.         add     ecx,edx
  2506.         bt      [flags],1
  2507.         jnc     @f
  2508.         dec     ecx     ;сравниваем с размером файла
  2509. @@:
  2510.         cmp     ecx,[file_size] ;положением курсора - не далее 1 байта от конца файла
  2511.         jge     red
  2512.         cmp     [file_size],0
  2513.         je      still
  2514.         mov     eax,[screen_table]
  2515.         mov     eax,[eax]
  2516.         mov     ecx,[begin_offset]
  2517.         cmp     eax,edx ;сравнение на нижнюю строку
  2518.         jbe     @f
  2519.         inc     [cursor]        ;курсор вправо
  2520.         jmp     red
  2521. @@:
  2522.         mov     ecx,[bytes_per_line]    ;смещаемся на строчку вниз
  2523.         add     [begin_offset],ecx      ;с прокруткой
  2524.         shl     cx,1
  2525.         dec     cx
  2526.         sub     [cursor],ecx
  2527.         jmp     red
  2528.  
  2529.  
  2530. PGDN:
  2531.         mov     edi,[screen_table]
  2532.         mov     eax,[edi]
  2533.         shl     eax,1
  2534.         add     eax,[begin_offset]
  2535.         cmp     eax,[file_size] ;есть ли возможность сместиться на страницу?
  2536.         jg      Ctrl_END
  2537.         mov     eax,[edi]
  2538.         add     [begin_offset],eax
  2539. ;       mov     ebx,[cursor]
  2540. ;       dec     ebx
  2541. ;       xor     ecx,ecx
  2542. ;       bt      ebx,0
  2543. ;       jnc     @f
  2544. ;       inc     ecx
  2545. ;       @@:     shr     ebx,1
  2546. ;       add     ebx,eax
  2547. ;       @@:     cmp     ebx,[file_size]
  2548. ;       jbe     @f
  2549. ;       sub     ebx,[bytes_per_line]
  2550. ;       jmp     @b
  2551. ;       @@:     sub     ebx,eax
  2552. ;       shl     ebx,1
  2553. ;       inc     ebx
  2554. ;       add     ebx,ecx
  2555. ;       mov     [cursor],ebx
  2556.         jmp     red
  2557.  
  2558.  
  2559. PGUP:
  2560.         mov     eax,[screen_table]
  2561.         mov     eax,[eax]
  2562.         mov     edx,[begin_offset]
  2563.         cmp     eax,edx
  2564.         jbe     @f
  2565.         call    Ctrl_HOME
  2566.         jmp     red
  2567. @@:
  2568.         sub     [begin_offset],eax
  2569.         jmp     red
  2570.  
  2571.  
  2572. HOME:
  2573.         mov     eax,[cursor]
  2574.         dec     ax
  2575.         shr     ax,1
  2576.         mov     ecx,[bytes_per_line]
  2577.         xor     edx,edx
  2578.         div     ecx
  2579.         shl     dx,1
  2580.         sub     [cursor],edx
  2581.         bt      [cursor],0
  2582.         jc      @f
  2583.         dec     [cursor]
  2584. @@:
  2585.         ret
  2586.  
  2587.  
  2588. END_:
  2589.         mov     eax,[cursor]
  2590.         dec     ax
  2591.         shr     ax,1
  2592.         mov     ecx,[bytes_per_line]
  2593.         xor     edx,edx
  2594.         div     ecx
  2595.         mov     eax,[current_offset]
  2596.         sub     eax,edx
  2597.         add     eax,[bytes_per_line]
  2598.         mov     edx,[file_size]
  2599.         cmp     eax,edx
  2600.         jbe     @f
  2601.         sub     edx,eax
  2602.         add     eax,edx
  2603. @@:
  2604.         sub     eax,[begin_offset]
  2605.         shl     eax,1
  2606.         test    eax,eax
  2607.         jz      red
  2608.         dec     eax
  2609.         mov     [cursor],eax
  2610.         jmp     red
  2611.  
  2612.  
  2613. Ctrl_HOME:
  2614.         mov     [begin_offset],0
  2615.         mov     [cursor],1
  2616.         ret
  2617.  
  2618.  
  2619. Ctrl_END:
  2620.         mov     eax,[file_size]
  2621.         mov     ecx,[screen_table]
  2622.         mov     ecx,[ecx]
  2623.         xor     edx,edx
  2624.         div     ecx
  2625.         test    dx,dx
  2626.         jnz     @f
  2627.         test    eax,eax
  2628.         jz      @f
  2629.         mov     edx,ecx
  2630.         dec     eax
  2631. @@:
  2632.         push    dx
  2633.         xor     dx,dx
  2634.         mul     ecx
  2635.         pop     dx
  2636.         shl     edx,1
  2637.         cmp     edx,1
  2638.         jg      @f
  2639.         mov     edx,2
  2640. @@:
  2641.         dec     edx
  2642.         mov     [begin_offset],eax
  2643.         mov     [cursor],edx
  2644.         jmp     red
  2645.  
  2646.  
  2647. ESC:
  2648.         btr     [flags],8
  2649.         jmp     red
  2650.  
  2651. copy_to_buf:
  2652.         bt      [flags],8
  2653.         jnc     .1
  2654.         mov     eax,[shblock_end]
  2655.         sub     eax,[shblock_beg]
  2656.         inc     eax
  2657.         mov     ecx,eax
  2658.         mov     [copy_len],eax
  2659.         mcall   68,20,,[copy_buf]
  2660.         mov     esi,[shblock_beg]
  2661.         mov     edi,[copy_buf]
  2662.         add     esi,[file_buffer]
  2663.         mov     ecx,[copy_len]
  2664.         cld
  2665. @@:
  2666.         movsb
  2667.         loop    @b
  2668.         bts     [flags],10
  2669.         xor     eax,eax
  2670.         ret
  2671. .1:
  2672.         or      eax,-1
  2673.         ret
  2674.  
  2675. Ctrl_C:
  2676.         call    copy_to_buf
  2677.         jmp     still
  2678.  
  2679. shblock_sz      dd      0
  2680.  
  2681. Ctrl_V:
  2682.         bt      [flags],10
  2683.         jnc     still
  2684.         bt      [flags],8
  2685.         jnc     .past_kurs
  2686. ;вставляем блок в выделенную область
  2687.         mov     ebx,[shblock_end]
  2688.         sub     ebx,[shblock_beg]
  2689.         inc     ebx
  2690.         mov     [shblock_sz],ebx
  2691.         mov     esi,[copy_buf]
  2692.         mov     edi,[file_buffer]
  2693.         add     edi<