Subversion Repositories Kolibri OS

Rev

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

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