Subversion Repositories Kolibri OS

Rev

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

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