Subversion Repositories Kolibri OS

Rev

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

  1. ; макрос для системной библиотеки box_lib.obj
  2. ; элемент TextEditor для Kolibri OS
  3. ; файл последний раз изменялся 03.05.2010 IgorA
  4. ; на код применена GPL2 лицензия
  5.  
  6. ;input:
  7. ; edi = pointer to tedit struct
  8. ; reg = index
  9. ;output:
  10. ; reg = pointer to 'tex' struct
  11. macro ConvertIndexToPointer reg {
  12.   imul reg,sizeof.symbol
  13.   add reg,ted_tex
  14. }
  15.  
  16. ;--- out_reg = ted_key_words_data[ind_reg].Text[0] ---
  17. macro ColToIndexOffset ind_reg,out_reg {
  18.         mov out_reg,ind_reg
  19.         imul out_reg,sizeof.TexColViv
  20.         add out_reg,ted_key_words_data
  21. }
  22.  
  23. macro use_text_edit
  24. {
  25. TED_PANEL_NULL   equ 0 ;нет открытой панели
  26. TED_PANEL_FIND   equ 1 ;панель поиска
  27. TED_PANEL_SYNTAX equ 2 ;панель выбора файлов подсветки
  28. TED_PANEL_WIDTH  equ 150 ;ширина панели
  29.  
  30. MAX_COLOR_WORD_LEN equ 40
  31. ;------------------------------------------------------------------------------
  32. struct TexSelect
  33.   x0 dd ?
  34.   y0 dd ?
  35.   x1 dd ?
  36.   y1 dd ?
  37. ends
  38.  
  39. struct TexColViv
  40.   Text rb MAX_COLOR_WORD_LEN ; слово для подсветки
  41.   f1 dd 0 ; справка по слову
  42.   wwo db ? ; whole words only
  43.   endc db ? ; символ конца выделения (wwo&4)
  44.   color db ? ; номер цвета
  45. ends
  46.  
  47. struct symbol
  48.   c db ?    ;  +0 символ
  49.   col db ?  ;  +1 цвет
  50.   perv dd ? ;  +2
  51.   next dd ? ;  +6 указатели
  52.   tc dd ?   ; +10 врем. создания
  53.   td dd ?   ; +14 врем. удаления
  54. ends
  55. ;------------------------------------------------------------------------------
  56.  
  57. ted_symbol_tab db 26
  58.  
  59. if lang eq ru
  60.  
  61. txtFindCapt db 'Поиск',0
  62. txtFindNext db 'Найти далее',0
  63. txtFormatCapt db 'Формат',0
  64. txtFormatApply db 'Применить',0
  65. txtRow db 'Строка',0
  66. txtCol db 'Знак',0
  67. txtOtm db 'Отмены',0
  68. txtBuf db 'Буфер:',0
  69.  
  70. else
  71.  
  72. txtFindCapt db 'Search',0
  73. txtFindNext db 'Find next',0
  74. txtFormatCapt db 'Format',0
  75. txtFormatApply db 'Apply',0
  76. txtRow db 'Rows',0
  77. txtCol db 'Cols',0
  78. txtOtm db 'Undo',0
  79. txtBuf db 'Buffer:',0
  80.  
  81. end if
  82.  
  83. ;------
  84. align 4
  85. EvChar db 0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0
  86.     db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  87.     db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
  88.     db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
  89.     db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
  90.     db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
  91.     db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
  92.     db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0
  93.     db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
  94.     db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
  95.     db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
  96.     db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  97.     db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  98.     db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  99.     db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
  100.     db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  101.  
  102. EvUpper db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  103.     db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  104.     db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  105.     db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  106.     db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  107.     db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  108.     db 0,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79
  109.     db 80,81,82,83,84,85,86,87,88,89,90,0,0,0,0,0
  110.     db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  111.     db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  112.     db 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143
  113.     db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  114.     db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  115.     db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  116.     db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  117.     db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  118. EvLover db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  119.     db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  120.     db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  121.     db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  122.     db 0,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111
  123.     db 112,113,114,115,116,117,118,119,120,121,122,0,0,0,0,0
  124.     db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  125.     db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  126.     db 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175
  127.     db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  128.     db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  129.     db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  130.     db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  131.     db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  132.     db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  133.     db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  134. conv_table dd 0
  135.  
  136.  
  137. KM_SHIFT equ 0x00010000
  138. KM_CTRL equ 0x00020000
  139. KM_ALT equ 0x00040000
  140. KM_NUMLOCK equ 0x00080000
  141.  
  142. ; KEY CODES
  143. KEY_F1 equ 0x0000003B
  144. KEY_F2 equ 0x0000003C
  145. KEY_F3 equ 0x0000003D
  146.  
  147.  
  148.  
  149. align 4
  150. proc ted_init, edit:dword
  151.         push eax ecx edi
  152.         mov edi,dword[edit]
  153.  
  154.         mov ecx,sizeof.symbol
  155.         imul ecx,ted_max_chars
  156.         call mem_Alloc ;выделяем память
  157.         mov ted_tex,eax
  158.         mov ted_tex_1,eax
  159.         add ted_tex_1,sizeof.symbol
  160.         add eax,ecx
  161.         mov ted_tex_end,eax
  162.  
  163.         stdcall ted_clear, edi,1
  164.  
  165. ;-------------------------------------------------
  166.         mov ecx,1024 ;1024 - для массива ted_arr_key_pos
  167.         add ecx,ted_syntax_file_size
  168.         call mem_Alloc
  169.         mov ted_arr_key_pos,eax
  170.         add eax,1024
  171.         mov ted_syntax_file,eax
  172.  
  173.         stdcall ted_init_scroll_bars,edi,3
  174.         pop edi ecx eax
  175.         ret
  176. endp
  177.  
  178. MIN_W_SCRL_ARE equ 3 ;минимальная отображаемая область для верт. скроллинга
  179. MIN_H_SCRL_ARE equ 3 ;минимальная отображаемая область для гориз. скроллинга
  180. ;input:
  181. ; opt = 1 - менять цвет скроллингов, 2 - менять внешние размеры
  182. align 4
  183. proc ted_init_scroll_bars, edit:dword, opt:dword
  184.         pushad
  185.         mov esi,ted_scr_w
  186.         mov ebx,ted_scr_h
  187.         bt dword[opt],0
  188.         jae @f
  189.                 mov ecx,ted_color_wnd_work
  190.                 mov dword[esi+sb_offs_bckg_col],ecx
  191.                 mov dword[ebx+sb_offs_bckg_col],ecx
  192.                 mov ecx,ted_color_wnd_capt
  193.                 mov dword[esi+sb_offs_frnt_col],ecx
  194.                 mov dword[ebx+sb_offs_frnt_col],ecx
  195.                 mov ecx,ted_color_wnd_bord
  196.                 mov dword[esi+sb_offs_line_col],ecx
  197.                 mov dword[ebx+sb_offs_line_col],ecx
  198.         @@:
  199.         bt dword[opt],1
  200.         jae .no_size
  201.                         mov edx,ted_wnd_l
  202.                         add edx,ted_rec_l
  203.                         mov word[ebx+sb_offs_start_x],dx ;выставляем левый отступ гориз. скроллинга
  204.                 mov eax,ted_wnd_h ;calculate lines in page
  205.                         mov edx,ted_wnd_t
  206.                         add edx,eax
  207.                         mov word[ebx+sb_offs_start_y],dx ;выставляем верхний отступ гориз. скроллинга
  208.                 sub eax,ted_rec_t
  209.                 xor edx,edx
  210.                 mov ecx,ted_rec_h
  211.                 div ecx
  212.                 cmp eax,MIN_W_SCRL_ARE
  213.                 jg @f
  214.                         mov eax,MIN_W_SCRL_ARE
  215.                 @@:
  216.                 mov dword[esi+sb_offs_cur_area],eax
  217.  
  218.                 mov eax,ted_wnd_w ;calculate cols in page
  219.                         mov edx,ted_wnd_l ;левый отступ окна
  220.                         add edx,eax ;добавляем ширину окна
  221.                         mov word[esi+sb_offs_start_x],dx ;выставляем левый отступ верт. скроллинга
  222.                         mov edx,ted_wnd_t
  223.                         mov word[esi+sb_offs_start_y],dx ;выставляем верхний отступ верт. скроллинга
  224.                         mov edx,ted_wnd_h
  225.                         mov word[esi+sb_offs_size_y],dx ;выставляем высоту верт. скроллинга
  226.                 sub eax,ted_rec_l
  227.                         mov word[ebx+sb_offs_size_x],ax ;выставляем ширину гориз. скроллинга
  228.                 xor edx,edx
  229.                 mov ecx,ted_rec_w
  230.                 div ecx
  231.                 cmp eax,MIN_H_SCRL_ARE
  232.                 jg @f
  233.                         mov eax,MIN_H_SCRL_ARE
  234.                 @@:
  235.                 dec eax
  236.                 mov dword[ebx+sb_offs_cur_area],eax ;устанавливаем число символов, которые влазят в экран для гориз. скроллинга
  237.         .no_size:
  238.         popad
  239.         ret
  240. endp
  241.  
  242. align 4
  243. proc ted_delete, edit:dword
  244.   push ecx edi
  245.   mov edi,dword[edit]
  246.  
  247.   mov ecx,ted_tex
  248.   call mem_Free
  249.   mov ecx,ted_arr_key_pos ;ted_syntax_file
  250.   call mem_Free
  251.  
  252.   pop edi ecx
  253.   ret
  254. endp
  255.  
  256.  
  257. ;input:
  258. ; eax = key kodes
  259. align 4
  260. proc ted_key, edit:dword, table:dword, control:dword
  261.         pushad
  262.         mov edi,dword[edit]
  263.         mov esi,ted_el_focus
  264.         cmp dword[esi],edi
  265.         jne .end_key_fun ;элемент не в фокусе выходим из функции
  266.         mov esi,dword[control]
  267.  
  268.         cmp ah,KEY_F1 ;[F1]
  269.         jne @f
  270.                 stdcall ted_show_help_f1,edi
  271.                 jmp .end_key_fun
  272.         @@:
  273.         cmp ah,KEY_F3 ;[F3]
  274.         jne @f
  275.                 stdcall ted_but_find_next,edi
  276.                 jmp .end_key_fun
  277.         @@:
  278.  
  279.         test esi,KM_CTRL ;Ctrl+...
  280.         jz .key_Ctrl
  281.                 cmp ah,24 ;Ctrl+O
  282.                 jne @f
  283.                         cmp ted_fun_on_key_ctrl_o,0
  284.                         je @f
  285.                                 call ted_fun_on_key_ctrl_o
  286.                 @@:
  287.                 cmp ah,31 ;Ctrl+S
  288.                 jne @f
  289.                         cmp ted_fun_on_key_ctrl_s,0
  290.                         je @f
  291.                                 call ted_fun_on_key_ctrl_s
  292.                 @@:
  293.                 cmp ah,33 ;Ctrl+F
  294.                 jne @f
  295.                 cmp ted_panel_id,TED_PANEL_FIND
  296.                 je @f
  297.                         cmp ted_fun_on_key_ctrl_f,0
  298.                         je @f
  299.                                 call ted_fun_on_key_ctrl_f
  300.                 @@:
  301.                 cmp ah,44 ;Ctrl+Z
  302.                 jne @f
  303.                         stdcall ted_but_undo,edi
  304.                 @@:
  305.                 cmp ah,46 ;Ctrl+C
  306.                 jne @f
  307.                         stdcall ted_but_copy,edi
  308.                 @@:
  309.                 cmp ah,47 ;Ctrl+V
  310.                 jne @f
  311.                         stdcall ted_but_paste,edi
  312.                 @@:
  313.                 cmp ah,49 ;Ctrl+N
  314.                 jne @f
  315.                         cmp ted_fun_on_key_ctrl_n,0
  316.                         je @f
  317.                                 call ted_fun_on_key_ctrl_n
  318.                 @@:
  319.                 cmp ah,199 ;Ctrl+Home
  320.                 jne @f
  321.                         call ted_key_ctrl_home
  322.                 @@:
  323.                 jmp .end_key_fun
  324.         .key_Ctrl:
  325.  
  326.         test esi,KM_SHIFT ;Shift+...
  327.         jz .key_Shift
  328.                 cmp ah,72 ;Shift+Up
  329.                 jne @f
  330.                         call ted_sel_key_up
  331.                 @@:
  332.                 cmp ah,75 ;Shift+Left
  333.                 jne @f
  334.                         call ted_sel_key_left
  335.                 @@:
  336.                 cmp ah,77 ;Shift+Right
  337.                 jne @f
  338.                         call ted_sel_key_right
  339.                 @@:
  340.                 cmp ah,80 ;Shift+Down
  341.                 jne @f
  342.                         call ted_sel_key_down
  343.                 @@:
  344.                 ;mov ted_drag_k,1 ;начинаем выделение от клавиатуры
  345.                 jmp .key_MoveCur
  346.         .key_Shift:
  347. ;-------------------------------------------------
  348.         cmp ah,72 ;178 ;Up
  349.         jne @f
  350.                 call ted_draw_cursor_sumb
  351.                 call ted_cur_move_up
  352.                 cmp dl,8
  353.                 jne .no_red_0
  354.                         call ted_scroll_set_redraw
  355.                         stdcall ted_draw,edi
  356.                         jmp @f
  357.                 .no_red_0:
  358.                 call ted_draw_main_cursor
  359.                 mov ted_drag_k,0 ;заканчиваем выделение от клавиатуры
  360.         @@:
  361.   cmp ah,80 ;177 ;Down
  362.   jne @f
  363.     call ted_draw_cursor_sumb
  364.     call ted_cur_move_down
  365.     cmp dl,8
  366.     jne .no_red_1
  367.       call ted_scroll_set_redraw
  368.       stdcall ted_draw,edi
  369.       jmp @f
  370.     .no_red_1:
  371.     call ted_draw_main_cursor
  372.     mov ted_drag_k,0 ;заканчиваем выделение от клавиатуры
  373.   @@:
  374.   cmp ah,75 ;176 ;Left
  375.   jne @f
  376.     call ted_draw_cursor_sumb
  377.     call ted_cur_move_left
  378.     cmp dl,8
  379.     jne .no_red_2
  380.       call ted_scroll_set_redraw
  381.       stdcall ted_draw,edi
  382.       jmp @f
  383.     .no_red_2:
  384.     call ted_draw_main_cursor
  385.     mov ted_drag_k,0 ;заканчиваем выделение от клавиатуры
  386.   @@:
  387.   cmp ah,77 ;179 ;Right
  388.   jne @f
  389.     call ted_draw_cursor_sumb
  390.     call ted_cur_move_right
  391.     cmp dl,8
  392.     jne .no_red_3
  393.       call ted_scroll_set_redraw
  394.       stdcall ted_draw,edi
  395.       jmp @f
  396.     .no_red_3:
  397.     call ted_draw_main_cursor
  398.     mov ted_drag_k,0 ;заканчиваем выделение от клавиатуры
  399.   @@:
  400.   cmp ah,71 ;180 ;Home
  401.   jne @f
  402.     call ted_draw_cursor_sumb
  403.     call ted_cur_move_x_first_char
  404.     cmp dl,8
  405.     jne .no_red_4
  406.       call ted_scroll_set_redraw
  407.       stdcall ted_draw,edi
  408.       jmp @f
  409.     .no_red_4:
  410.     call ted_draw_main_cursor
  411.     mov ted_drag_k,0 ;заканчиваем выделение от клавиатуры
  412.   @@:
  413.   cmp ah,79 ;181 ;End
  414.   jne @f
  415.     call ted_draw_cursor_sumb
  416.     call ted_cur_move_x_last_char
  417.     cmp dl,8
  418.     jne .no_red_5
  419.       call ted_scroll_set_redraw
  420.       stdcall ted_draw,edi
  421.       jmp @f
  422.     .no_red_5:
  423.     call ted_draw_main_cursor
  424.     mov ted_drag_k,0 ;заканчиваем выделение от клавиатуры
  425.   @@:
  426.   cmp ah,73 ;184 ;PageUp
  427.   jne @f
  428.     call ted_cur_move_page_up
  429.     cmp dl,0
  430.     je @f
  431.     call ted_scroll_set_redraw
  432.     stdcall ted_draw,edi
  433.   @@:
  434.   cmp ah,81 ;183 ;PageDown
  435.   jne @f
  436.     call ted_cur_move_page_down
  437.     cmp dl,0
  438.     je @f
  439.     call ted_scroll_set_redraw
  440.     stdcall ted_draw,edi
  441.     mov ted_drag_k,0 ;заканчиваем выделение от клавиатуры
  442.   @@:
  443. ;-------------------------------------------------
  444. ;       cmp esi,0
  445. ;       jne .end_key_fun
  446.         .key_MoveCur:
  447.  
  448.         cmp ah,69 ;[Pause Break]
  449.         je .end_key_fun
  450.         cmp ah,120 ;[Fn]
  451.         je .end_key_fun
  452.         cmp ah,0x80 ;if key up
  453.         ja .end_key_fun
  454.  
  455.         cmp dword[table],0
  456.         je @f
  457.                 stdcall KeyConvertToASCII, dword[table]
  458.         @@:
  459.  
  460.         ;mov ted_drag_k,0 ;заканчиваем выделение от клавиатуры
  461.  
  462.         lea edx,[EvChar] ;берем адрес таблицы с допустимыми символами
  463.         add dl,ah
  464.         jae @f
  465.                 add edx,0x100 ;если было переполнение при добавлении кода символа
  466.         @@:
  467.         cmp byte [edx],1
  468.         jne @f
  469.                 mov ted_key_new,ah
  470.                 call ted_set_undo
  471.                 mov edx,ted_opt_ed_change_time+ted_opt_ed_move_cursor
  472.                 stdcall ted_sel_text_del,edx
  473.                 cmp al,1
  474.                 jne .del
  475.                         mov edx,ted_opt_ed_move_cursor
  476.                 .del:
  477.                 cmp ted_cur_ins,1
  478.                 je .no_ins_mod
  479.                         stdcall ted_text_del,edi,ted_opt_ed_change_time
  480.                         mov edx,ted_opt_ed_move_cursor
  481.                 .no_ins_mod:
  482.                 mov ecx,edi
  483.                 add ecx,ted_offs_key_new
  484.                 stdcall ted_text_add,edi,ecx,1,edx ;добавляем символ введенный с клавиатуры
  485.                 cmp ted_key_new,13
  486.                 jne .dr_m_win
  487.                         stdcall ted_draw,edi
  488.                         jmp .dr_cur_l
  489.                 .dr_m_win:
  490.                         stdcall ted_draw_cur_line,edi
  491.                 .dr_cur_l:
  492.                 cmp ted_fun_draw_panel_buttons,0
  493.                 je @f
  494.                         call ted_fun_draw_panel_buttons
  495.         @@:
  496.  
  497.         cmp ah,8 ;[<-]
  498.         jne @f
  499.                 call ted_set_undo
  500.                 stdcall ted_sel_text_del,ted_opt_ed_change_time
  501.                 cmp al,1
  502.                 je .del_one_b
  503.                         stdcall ted_text_del,edi,ted_opt_ed_change_time+ted_opt_ed_move_cursor
  504.                 .del_one_b:
  505.                 stdcall ted_draw,edi
  506.                 cmp ted_fun_draw_panel_buttons,0
  507.                 je .end_key_fun
  508.                         call ted_fun_draw_panel_buttons
  509.                 jmp .end_key_fun
  510.         @@:
  511.  
  512.         cmp ah,182 ;Delete
  513.         jne @f
  514.                 call ted_set_undo
  515.                 stdcall ted_sel_text_del,ted_opt_ed_change_time
  516.                 cmp al,1
  517.                 je .del_one_d
  518.                         stdcall ted_text_del,edi,ted_opt_ed_change_time
  519.                 .del_one_d:
  520.                 stdcall ted_draw,edi
  521.                 cmp ted_fun_draw_panel_buttons,0
  522.                 je .end_key_fun
  523.                         call ted_fun_draw_panel_buttons
  524.                 jmp .end_key_fun
  525.         @@:
  526.  
  527.         cmp ah,185 ;Ins
  528.         jne @f
  529.                 call ted_draw_cursor_sumb
  530.                 xor ted_cur_ins,1
  531.                 call ted_draw_main_cursor
  532.         @@:
  533.  
  534.         .end_key_fun:
  535.         popad
  536.         ret
  537. endp
  538.  
  539. ;output:
  540. ; al = 1 - can save
  541. align 4
  542. proc ted_can_save, edit:dword
  543.         push ecx edi
  544.         mov edi,dword[edit]
  545.  
  546.         mov ecx,ted_tim_ch
  547.         sub ecx,ted_tim_undo
  548.         mov al,1
  549.         cmp ted_tim_ls,ecx
  550.         jne @f
  551.                 dec al
  552.         @@:
  553.         pop edi ecx
  554.         ret
  555. endp
  556.  
  557. ;input:
  558. ; edi = pointer to tedit struct
  559. ;output:
  560. ; al = 1 - selected
  561. align 4
  562. proc ted_is_select
  563.   push ebx
  564.   xor al,al
  565.   cmp ted_drag_m,1
  566.   je @f
  567.     mov al,1
  568.     mov ebx,ted_sel_x0
  569.     cmp ebx,ted_sel_x1
  570.     jne @f
  571.     mov ebx,ted_sel_y0
  572.     cmp ebx,ted_sel_y1
  573.     jne @f
  574.     xor al,al
  575.   @@:
  576.   pop ebx
  577.   ret
  578. endp
  579.  
  580. ;input:
  581. ; edi = pointer to tedit struct
  582. align 4
  583. proc ted_sel_normalize
  584.         push ecx esi
  585.         push edi
  586.                 mov esi,edi
  587.                 add esi,ted_offs_sel
  588.                 add edi,ted_offs_seln
  589.                 mov ecx,sizeof.TexSelect
  590.                 rep movsb
  591.         pop edi
  592.  
  593.         jmp @f
  594.                 .swp_f:
  595.                 mov ecx,ted_seln_x0
  596.                 m2m ted_seln_x0,ted_seln_x1
  597.                 mov ted_seln_x1,ecx
  598.  
  599.                 mov ecx,ted_seln_y0
  600.                 cmp ecx,ted_seln_y1 ;(sel_y0>sel_y1)
  601.                 jle .end_f
  602.                 m2m ted_seln_y0,ted_seln_y1
  603.                 mov ted_seln_y1,ecx
  604.  
  605.                 jmp .end_f
  606.         @@:
  607.  
  608.         mov ecx,ted_seln_y0
  609.         cmp ecx,ted_seln_y1 ;(sel_y0>sel_y1)
  610.         jg .swp_f
  611.  
  612.         cmp ecx,ted_seln_y1 ;(sel_y0==sel_y1)
  613.         jne .end_f
  614.                 mov ecx,ted_seln_x0
  615.                 cmp ecx,ted_seln_x1 ;(sel_x0>sel_x1)
  616.                 jg .swp_f
  617.  
  618.         .end_f:
  619.         pop esi ecx
  620.         ret
  621. endp
  622.  
  623. ;input:
  624. ; edi = pointer to tedit struct
  625. ;description:
  626. ; Функция вызываемая при начале выделения
  627. align 4
  628. proc ted_sel_start
  629.         push eax ecx
  630.                 mov eax,ted_scr_h
  631.                 mov ecx,ted_cur_x
  632.                 add ecx,dword[eax+sb_offs_position]
  633.                 mov ted_sel_x0,ecx
  634.                 mov ted_sel_x1,ecx
  635.  
  636.                 mov eax,ted_scr_w
  637.                 mov ecx,ted_cur_y
  638.                 add ecx,dword[eax+sb_offs_position]
  639.                 mov ted_sel_y0,ecx
  640.                 mov ted_sel_y1,ecx
  641.         pop ecx eax
  642.         ret
  643. endp
  644.  
  645. ;input:
  646. ; edi = pointer to tedit struct
  647. ;description:
  648. ; Функция вызываемая при перемещении выделения
  649. align 4
  650. proc ted_sel_move
  651.         push eax ecx
  652.                 mov ecx,ted_cur_x
  653.                 mov eax,ted_scr_h
  654.                 add ecx,dword[eax+sb_offs_position]
  655.                 mov ted_sel_x1,ecx
  656.  
  657.                 mov eax,ted_scr_w
  658.                 mov ecx,ted_cur_y
  659.                 add ecx,dword[eax+sb_offs_position]
  660.                 mov ted_sel_y1,ecx
  661.         pop ecx eax
  662.         cmp ted_fun_draw_panel_buttons,0 ;redraw toolbar (need to button Copy)
  663.         je @f
  664.                 call ted_fun_draw_panel_buttons
  665.         @@:
  666.         ret
  667. endp
  668.  
  669. ;input:
  670. ; cl_al_mem = 1 - clear all memory
  671. align 4
  672. proc ted_clear, edit:dword, cl_al_mem:dword
  673.   push ecx edi
  674.   mov edi,dword[edit]
  675.  
  676.   mov ted_cur_x,0
  677.   mov ted_cur_y,0
  678.   mov ted_tim_ch,0
  679.   mov ted_tim_ls,0
  680.   mov ted_tim_co,0
  681.   mov ted_tim_undo,0
  682.   mov ted_help_id,-1
  683.  
  684.   mov ecx,ted_scr_w
  685.   mov dword[ecx+sb_offs_position],0
  686.   mov dword[ecx+sb_offs_max_area],100 ;число строк видимых в новом документе
  687.   mov dword[ecx+sb_offs_redraw],1
  688.   mov ecx,ted_scr_h
  689.   mov dword[ecx+sb_offs_position],0
  690.   mov dword[ecx+sb_offs_max_area],100 ;число символов видимых в новом документе
  691.  
  692.   mov ted_sel_x0,0
  693.   mov ted_sel_y0,0
  694.   mov ted_sel_x1,0
  695.   mov ted_sel_y1,0
  696.  
  697.   cmp dword[cl_al_mem],0
  698.   je .exit
  699.  
  700.   push edx
  701.   mov ecx,sizeof.symbol
  702.   imul ecx,ted_max_chars
  703.   mov edx,ted_tex
  704.   @@:
  705.     mov byte [edx],0
  706.     inc edx
  707.   loop @b
  708.   mov edx,ted_tex
  709.   mov dword [edx+6],1
  710.   pop edx
  711.  
  712.   .exit:
  713.   pop edi ecx
  714.   ret
  715. endp
  716.  
  717.  
  718. align 4
  719. proc ted_init_syntax_file, edit:dword, file:dword, f_name:dword
  720.         pushad
  721.         mov edi,dword[edit]
  722.  
  723.         mov eax,70
  724.         mov ebx,dword[file]
  725.         mov dword[ebx], 0
  726.         mov dword[ebx+4], 0
  727.         mov dword[ebx+8], 0
  728.         mov ecx,ted_syntax_file_size
  729.         mov dword[ebx+12], ecx
  730.         m2m dword[ebx+16], ted_syntax_file
  731.         mov  byte[ebx+20], 0
  732.         m2m dword[ebx+21], dword[f_name]
  733.         int 0x40
  734.  
  735.         mov ecx,0x100
  736.         mov edx,ted_arr_key_pos
  737.         @@:
  738.                 mov dword[edx],-1
  739.                 add edx,4
  740.         loop @b
  741.  
  742.         ;init: ted_colors_text_count, ted_key_words_count, ...
  743.         mov ted_colors_text_count,1
  744.         mov ted_key_words_count,0
  745.         mov ted_help_text_f1,0
  746.         mov ted_help_id,-1 ;идентификатор слова для справки
  747.  
  748.         cmp eax,6
  749.         je @f
  750.         cmp eax,0
  751.         je @f
  752.                 cmp ax,10
  753.                 jl .zifra_0_9
  754.                         mov al,'?'
  755.                         sub ax,48
  756.                 .zifra_0_9:
  757.                 add ax,48
  758.                 cmp ted_fun_init_synt_err,0
  759.                 je .no_colors
  760.                         call ted_fun_init_synt_err
  761.                         jmp .no_colors
  762.         @@:
  763.  
  764.         mov eax,edi ;сохраняем значение edi
  765.         mov esi,ted_syntax_file
  766.         add edi,ted_offs_count_colors
  767.         mov ecx,9*4
  768.         rep movsb
  769.         mov edi,eax ;востанавливаем значение edi
  770.  
  771.         mov eax,ted_syntax_file
  772.         add eax,32
  773.         mov ted_text_colors,eax
  774.  
  775.         mov eax,ted_colors_text_count ;init: count_colors_text (offset to key words)
  776.         add eax,8
  777.         shl eax,2
  778.         add eax,ted_syntax_file
  779.         mov ted_key_words_data,eax
  780.  
  781.         mov ecx,ted_key_words_count ;init: ted_arr_key_pos (first key positions)
  782.         xor eax,eax
  783.         @@:
  784.                 ColToIndexOffset eax,edx
  785.                 xor ebx,ebx
  786.                 mov bl,byte[edx]
  787.                 shl bx,2
  788.                 mov esi,ted_arr_key_pos
  789.                 add esi,ebx
  790.                 cmp dword[esi],-1
  791.                 jne .no_ch_key
  792.                         mov dword[esi],eax
  793.                 .no_ch_key:
  794.                 inc eax
  795.         loop @b
  796.  
  797.         ;init: ted_help_text_f1
  798.         mov ecx,ted_key_words_count
  799.         imul ecx,sizeof.TexColViv
  800.         add ecx,ted_key_words_data
  801.         mov ted_help_text_f1,ecx
  802.  
  803.         stdcall ted_init_scroll_bars,edi,1 ;меняем цвета скроллингов
  804.         .no_colors:
  805.         popad
  806.         ret
  807. endp
  808.  
  809. ;input:
  810. ; ebx = file size
  811. ; edi = pointer to tedit struct
  812. ;description:
  813. ; Функция вызывается при открытии файла
  814. align 4
  815. proc ted_on_open_file
  816.         push eax ;destination
  817.         push ecx ;for cycle
  818.         push edx ;source
  819.         push esi
  820.  
  821.         stdcall ted_clear,edi,0 ;чистим не всю память, потому что ниже будем ее заполнять новыми даными
  822.         mov eax,ebx
  823.         mov ecx,ebx
  824.         add eax,2
  825.         ConvertIndexToPointer eax
  826.         mov edx,ted_tex
  827.         add edx,ebx
  828.         push ebx
  829.         @@:
  830.                 mov ebx,[edx]
  831.                 mov byte [eax],bl
  832.                 mov dword [eax+2],ecx
  833.                 inc dword [eax+2]
  834.                 mov dword [eax+6],ecx
  835.                 add dword [eax+6],3
  836.                 ;mov byte[eax+1],0 ;col=0
  837.                 mov dword [eax+10],-1 ;tc=-1
  838.                 mov dword [eax+14],0 ;td=0
  839.  
  840.                 cmp ecx,0
  841.                 je @f
  842.                 dec ecx
  843.                 dec edx
  844.                 sub eax,sizeof.symbol
  845.                 jmp @b
  846.         @@:
  847.         pop ebx
  848.         add eax,2
  849.         mov dword [eax],0 ; first sumbol 'perv=0'
  850.  
  851.         mov edx,ted_tex
  852.         ; begining sumbol 'perv=0' 'next=2'
  853.         mov dword [edx+2],0
  854.         mov dword [edx+6],2
  855.  
  856.         add edx,sizeof.symbol
  857.         mov dword [edx+6],0 ; last sumbol 'next=0'
  858.         mov dword [edx+2],ebx ; last sumbol 'perv=last'
  859.         inc dword [edx+2]
  860.  
  861.         mov edx,ebx
  862.         inc edx ;2 = rezerv sumbols
  863.         imul edx,sizeof.symbol
  864.         add edx,ted_tex
  865.         mov dword [edx+6],1 ; last sumbol 'next=1'
  866.  
  867.         @@: ;clear memory, need if before was open big file
  868.                 add edx,sizeof.symbol
  869.                 cmp edx,ted_tex_end
  870.                 jge @f
  871.                         mov dword[edx+10],0
  872.                         mov dword[edx+14],0
  873.                 jmp @b
  874.         @@:
  875.  
  876.         call ted_get_num_lines
  877.         cmp eax,100
  878.         jge @f
  879.                 mov eax,100
  880.         @@:
  881.         mov esi,ted_scr_w
  882.         mov dword[esi+sb_offs_max_area],eax
  883.         pop esi edx ecx eax
  884.  
  885.         call ted_text_colored
  886.         stdcall ted_draw,edi
  887.         cmp ted_fun_draw_panel_buttons,0
  888.         je @f
  889.                 call ted_fun_draw_panel_buttons
  890.         @@:
  891.         ret
  892. endp
  893.  
  894. ;input:
  895. ; edx = pointer to symbol struct
  896. ; edi = pointer to tedit struct
  897. ;output:
  898. ; edx = pointer to 'perv' visible symbol struct
  899. align 4
  900. ted_iterat_perv:
  901.   cmp ted_tim_undo,0
  902.   je .else
  903.   push ebx
  904.   @@:
  905.     call ted_get_text_perv_pos
  906.     cmp edx,ted_tex
  907.     je @f
  908.     call ted_symbol_not_vis
  909.     cmp bl,1
  910.     je @b
  911.     cmp byte[edx],10 ;пропуск символа с кодом 10
  912.     je @b
  913.   @@:
  914.   pop ebx
  915.   ret
  916.   .else:
  917.     call ted_get_text_perv_pos
  918.     cmp edx,ted_tex
  919.     je .endif
  920.     cmp dword [edx+14],0
  921.     jne .else
  922.     cmp byte[edx],10 ;пропуск символа с кодом 10
  923.     je .else
  924.   .endif:
  925.   ret
  926.  
  927.  
  928. ;input:
  929. ; edx = pointer to symbol struct
  930. ; edi = pointer to tedit struct
  931. ;output:
  932. ; edx = pointer to 'next' visible symbol struct
  933. align 4
  934. ted_iterat_next:
  935.   cmp ted_tim_undo,0
  936.   je .else
  937.   push ebx
  938.   @@:
  939.     call ted_get_text_next_pos
  940.     cmp edx,ted_tex_1
  941.     jle @f
  942.     call ted_symbol_not_vis
  943.     cmp bl,1
  944.     je @b
  945.     cmp byte[edx],10 ;пропуск символа с кодом 10
  946.     je @b
  947.   @@:
  948.   pop ebx
  949.   ret
  950.   .else:
  951.     call ted_get_text_next_pos
  952.     cmp edx,ted_tex_1
  953.     jle .endif
  954.     cmp dword [edx+14],0
  955.     jne .else
  956.     cmp byte[edx],10 ;пропуск символа с кодом 10
  957.     je .else
  958.   .endif:
  959.   ret
  960.  
  961. ;input:
  962. ; bl = symbol end of select
  963. ; edx = pointer to symbol struct
  964. ; edi = pointer to tedit struct
  965. ;description:
  966. ; найти следующую позицию указанного символа
  967. align 4
  968. ted_iterat_next_pos_char:
  969.         @@:
  970.                 cmp bl,byte[edx]
  971.                 je @f
  972.                 cmp edx,ted_tex_1
  973.                 jle @f
  974.                         call ted_iterat_next
  975.                         jmp @b
  976.         @@:
  977.         call ted_iterat_next
  978.         ret
  979.  
  980. ;input:
  981. ; edx = pointer to symbol struct
  982. ; edi = pointer to tedit struct
  983. align 4
  984. ted_iterat_perv_color_tag:
  985.   @@:
  986.     cmp byte[edx+1],0
  987.     jne @f
  988.     call ted_iterat_perv
  989.     cmp edx,ted_tex_1
  990.     jle @f
  991.     jmp @b
  992.   @@:
  993.   ret
  994.  
  995. ;input:
  996. ; edx = pointer to symbol struct
  997. ; edi = pointer to tedit struct
  998. align 4
  999. ted_iterat_next_color_tag:
  1000.   @@:
  1001.     call ted_iterat_next
  1002.     cmp byte[edx+1],0
  1003.     jne @f
  1004.     cmp edx,ted_tex_1
  1005.     jle @f
  1006.     jmp @b
  1007.   @@:
  1008.   ;call ted_iterat_next
  1009.   ret
  1010.  
  1011. ;input:
  1012. ; edx = pointer to symbol struct
  1013. ; edi = pointer to tedit struct
  1014. ;output:
  1015. ; bl = 1 if sumbol not visible
  1016. ; (tex[i].td+ted_tim_undo<=ted_tim_ch && tex[i].td) || (tex[i].tc>ted_tim_ch-ted_tim_undo)
  1017. align 4
  1018. ted_symbol_not_vis:
  1019.   push eax
  1020.  
  1021.   xor bl,bl
  1022.  
  1023.   cmp dword [edx+14],0
  1024.   je @f
  1025.   mov eax,[edx+14] ;eax=tex[i].td
  1026.   add eax,ted_tim_undo
  1027.   cmp eax,ted_tim_ch
  1028.   jg @f
  1029.     mov bl,1
  1030.     pop eax
  1031.     ret
  1032.   @@:
  1033.  
  1034.   mov eax,ted_tim_ch
  1035.   sub eax,ted_tim_undo
  1036.   cmp [edx+10],eax
  1037.   jle @f
  1038.     or bl,1
  1039.   @@:
  1040.  
  1041.   pop eax
  1042.   ret
  1043.  
  1044. ;input:
  1045. ; text:dword - pointer to text string
  1046. ; add_opt:dword - options
  1047. align 4
  1048. proc ted_text_add, edit:dword, text:dword, t_len:dword, add_opt:dword
  1049.         locals
  1050.                 new_spc dd ? ;count new spaces
  1051.                 new_lin dd ? ;count new lines
  1052.         endl
  1053. ;использование регистров внутри функции:
  1054. ;eax - позиция для вставки текста
  1055. ;ebx - для временных нужд, длинна вставляемого текста
  1056. ;ecx - для временных нужд
  1057. ;edx - указатель на структуру символа
  1058.         pushad
  1059.         mov edi,dword[edit]
  1060.         mov esi,dword[text]
  1061.  
  1062.         call ted_get_pos_by_cursor
  1063.         call ted_get_text_perv_pos
  1064.         call ted_get_text_arr_index ;eax=po_t
  1065.  
  1066.         mov dword[new_spc],0
  1067.         cmp ted_gp_opt,2
  1068.         je @f
  1069.                 push eax ;c_sp=cur[cn].x+Scroller->XPos-StrLen(cur[cn].y+Scroller->YPos);
  1070.                         mov eax,ted_scr_h
  1071.                         mov eax,dword[eax+sb_offs_position]
  1072.                         add eax,ted_cur_x ;eax - номер символа
  1073.                         mov dword[new_spc],eax
  1074.  
  1075.                         mov eax,ted_scr_w
  1076.                         mov eax,dword[eax+sb_offs_position]
  1077.                         add eax,ted_cur_y ;eax - номер строки
  1078.                         call ted_strlen ;ebx = line len
  1079.                         sub dword[new_spc],ebx ;от позиции курсора отнимаем длинну строки, узнаем колличество добавляемых пробелов
  1080.                 pop eax
  1081.         @@:
  1082.  
  1083.         mov ebx,dword[t_len]
  1084.  
  1085.         mov dword[new_lin],0
  1086.         cmp ted_gp_opt,0
  1087.         jne @f
  1088.                 push eax
  1089.                         mov eax,ted_scr_w
  1090.                         mov eax,dword[eax+sb_offs_position]
  1091.                         add eax,ted_cur_y
  1092.                         inc eax
  1093.                         mov dword[new_lin],eax
  1094.  
  1095.                         call ted_get_num_lines
  1096.                         sub dword[new_lin],eax
  1097.                 pop eax
  1098.         @@:
  1099.  
  1100.   mov edx,sizeof.symbol
  1101.   shl edx,1
  1102.   add edx,ted_tex
  1103.   @@: ;for(i=2;i<texMax;i++)
  1104.     cmp dword [edx+10],0 ;if(!tex[i].tc && !tex[i].td)
  1105.     jne .u1f
  1106.     cmp dword [edx+14],0
  1107.     jne .u1f
  1108.       test dword[add_opt],ted_opt_ed_change_time ;if(n_tim) ted_tim_ch++;
  1109.       jz .no_tim
  1110.         inc ted_tim_ch
  1111.       .no_tim:
  1112.       test dword[add_opt],ted_opt_ed_move_cursor
  1113.       jz .no_cur_mov
  1114.       cmp dword[new_lin],0 ;если есть добавочные строки, то курсор еще не двигаем
  1115.       jg .no_cur_mov
  1116.       cmp dword[new_spc],0 ;если нет добавочных пробелов, то курсор тоже не двигаем
  1117.       jg .no_cur_mov
  1118.         inc ted_cur_x ;move cursor
  1119.         ;call ted_go_to_pos
  1120.         cmp byte [esi],13
  1121.         jne .no_cur_mov
  1122.           mov ted_cur_x,0
  1123.           inc ted_cur_y
  1124.       .no_cur_mov:
  1125.  
  1126.       mov ecx,ted_opt_ed_change_time
  1127.           not ecx
  1128.           and dword[add_opt],ecx ;n_tim=false;
  1129.  
  1130.       mov cl,byte [esi] ;tex[i].c=ta[ns];
  1131.       mov byte [edx],cl
  1132.       m2m dword [edx+10],ted_tim_ch ;tex[i].tc=ted_tim_ch;
  1133.       mov [edx+2],eax ;tex[i].perv=po_t;
  1134.  
  1135.       mov ecx,eax
  1136.       imul ecx,sizeof.symbol
  1137.       add ecx,ted_tex ; *** ecx = tex[po_t] ***
  1138.       add ecx,6   ; *** ecx = tex[po_t].next ***
  1139.       m2m dword [edx+6],dword [ecx] ;tex[i].next=tex[po_t].next;
  1140.  
  1141.       call ted_get_text_arr_index ;*** eax = i ***
  1142.       cmp eax,ted_max_chars
  1143.       jge @f
  1144.       mov [ecx],eax ;tex[po_t].next=i; // ссылки перенаправляем
  1145.       mov ecx,[edx+6] ; *** ecx = tex[i].next ***
  1146.       imul ecx,sizeof.symbol
  1147.       add ecx,ted_tex ; *** ecx = tex[tex[i].next] ***
  1148.       mov [ecx+2],eax ;tex[tex[i].next].perv=i;
  1149.  
  1150.       cmp dword[new_lin],0 ;add lines or text
  1151.       jle .spc_add
  1152.         dec dword[new_lin]
  1153.         mov byte [edx],13
  1154.         jmp .u1f
  1155.       .spc_add:
  1156.       cmp dword[new_spc],0 ;add spaces or text
  1157.       jle .tex_add
  1158.         dec dword[new_spc]
  1159.         mov byte [edx],' '
  1160.         jmp .u1f
  1161.       .tex_add:
  1162.       inc esi
  1163.       dec ebx
  1164.     .u1f:
  1165.     add edx,sizeof.symbol
  1166.     cmp edx,ted_tex_end
  1167.     jge @f ;out of memory
  1168.     cmp ebx,0
  1169.     jne @b
  1170.   @@:
  1171.  
  1172.   call ted_text_colored
  1173.   popad
  1174.   ret
  1175. endp
  1176.  
  1177. ;input:
  1178. ;  ecx = position to free insert cell
  1179. ;  edx = pointer to sumbol, when insert
  1180. ;  esi = pointer to added symbol
  1181. ;  edi = pointer to tedit struct
  1182. ;output:
  1183. ;  ecx = position to inserted cell
  1184. align 4
  1185. ted_char_add:
  1186.  
  1187.   .loop_b:
  1188.     cmp ecx,ted_tex_end
  1189.     jge .end_f
  1190.     cmp dword[ecx+10],0
  1191.     jne @f
  1192.       cmp dword[ecx+14],0
  1193.       je .loop_e
  1194.     @@:
  1195.     add ecx,sizeof.symbol
  1196.     jmp .loop_b
  1197.   .loop_e:
  1198.  
  1199.   push eax ebx
  1200.   mov eax,ted_tim_ch
  1201.   mov dword[ecx+10],eax
  1202.   mov al,byte[esi]
  1203.   mov byte[ecx],al
  1204.  
  1205.   call ted_get_text_arr_index ; *** eax=pos ***
  1206.   mov [ecx+2],eax ;tex[i].perv=pos;
  1207.   m2m dword[ecx+6],dword[edx+6] ;tex[i].next=tex[pos].next;
  1208.  
  1209.   push edx
  1210.     mov edx,ecx
  1211.     call ted_get_text_arr_index ; *** eax=i ***
  1212.   pop edx
  1213.  
  1214.   mov [edx+6],eax ;tex[pos].next=i; // ссылки перенаправляем
  1215.   mov ebx,[ecx+6]
  1216.   ConvertIndexToPointer ebx
  1217.   mov [ebx+2],eax ;tex[tex[i].next].perv=i; // ...
  1218.   pop ebx eax
  1219.  
  1220.   .end_f:
  1221.   call ted_text_colored
  1222.   ret
  1223.  
  1224.  
  1225. ;input:
  1226. ; conv_table = pointert to convert table
  1227. ; edi = pointer to tedit struct
  1228. ;output:
  1229. ; esi = count converted symbols
  1230. ;description:
  1231. ; Функция используется для смены регистра выбранных символов
  1232. align 4
  1233. proc ted_convert_sel_text
  1234.   locals
  1235.     conv_cou dd ?
  1236.   endl
  1237.   mov dword[conv_cou],0
  1238.   pushad
  1239.  
  1240.   call ted_is_select
  1241.   cmp al,0
  1242.   je .end_f
  1243.     call ted_set_undo
  1244.     call ted_sel_normalize
  1245.  
  1246.     mov esi,ted_seln_x0
  1247.     mov ecx,ted_seln_y0
  1248.     call ted_get_pos_by_coords
  1249.     mov eax,edx
  1250.     mov esi,ted_seln_x1
  1251.     mov ecx,ted_seln_y1
  1252.     call ted_get_pos_by_coords
  1253.     ;call ted_get_text_perv_pos
  1254.     mov ebx,edx
  1255.  
  1256.     cmp eax,ebx
  1257.     je .end_f
  1258.  
  1259.     inc ted_tim_ch
  1260.     mov edx,eax ;i=p0;
  1261.     mov ecx,2
  1262.     ConvertIndexToPointer ecx
  1263.     @@:
  1264.       mov esi,[edx]
  1265.       and esi,0xff
  1266.       add esi,[conv_table] ;EvUpper
  1267.       cmp byte [esi],0
  1268.       je .no_change
  1269.         m2m dword [edx+14],ted_tim_ch
  1270.         call ted_char_add ;b_pos=ted_char_add(tex[i].c^32,i,false,b_pos);
  1271.         call ted_get_text_next_pos ;go to added symbol
  1272.         inc dword[conv_cou]
  1273.       .no_change:
  1274.  
  1275.       call ted_iterat_next
  1276.       cmp edx,ted_tex
  1277.       je @f
  1278.       cmp edx,ebx
  1279.       je @f
  1280.  
  1281.       jmp @b
  1282.     @@:
  1283.     cmp dword[conv_cou],0
  1284.     jne @f
  1285.       dec ted_tim_ch
  1286.     @@:
  1287.   .end_f:
  1288.   popad
  1289.   mov esi,dword[conv_cou]
  1290.   ret
  1291. endp
  1292.  
  1293. ;output:
  1294. ; bl = 0 - no delete
  1295. ; bl = 1 - delete
  1296. align 4
  1297. proc ted_text_del, edit:dword, del_opt:dword
  1298.   push cx edx edi
  1299.   mov edi,dword[edit]
  1300.   mov ebx,dword[del_opt]
  1301.  
  1302.   xor cl,cl
  1303.   test ebx,ted_opt_ed_move_cursor
  1304.   jz @f
  1305.     call ted_cur_move_left
  1306.     cmp dl,0
  1307.     je .no_del
  1308.   @@:
  1309.   call ted_get_pos_by_cursor
  1310.   cmp ted_gp_opt,1
  1311.   je .no_del
  1312.     test ebx,ted_opt_ed_change_time
  1313.     jz @f
  1314.       inc ted_tim_ch
  1315.     @@:
  1316.     m2m dword [edx+14], ted_tim_ch
  1317.     mov cl,1
  1318.   .no_del:
  1319.   mov bl,cl
  1320.   pop edi edx cx
  1321.   ret
  1322. endp
  1323.  
  1324. ;input:
  1325. ; edi = pointer to tedit struct
  1326. ;output:
  1327. ; al = 1 if delete
  1328. ;description:
  1329. ; Функция удаляет выделенный текст
  1330. align 4
  1331. proc ted_sel_text_del, del_opt:dword
  1332.         push ebx ecx edx esi
  1333.  
  1334.         call ted_is_select
  1335.         cmp al,0
  1336.         je .end_f
  1337.  
  1338.                 call ted_sel_normalize
  1339.  
  1340.                 mov esi,ted_seln_x1
  1341.                 mov ecx,ted_seln_y1
  1342.                 call ted_get_pos_by_coords
  1343.                 mov ebx,edx
  1344.  
  1345.                 mov esi,ted_seln_x0
  1346.                 mov ecx,ted_seln_y0
  1347.                 call ted_get_pos_by_coords
  1348.  
  1349.                 test dword[del_opt],ted_opt_ed_change_time
  1350.                 jz @f
  1351.                         inc ted_tim_ch
  1352.                 @@:
  1353.                 cmp edx,ted_tex
  1354.                 je @f
  1355.                 cmp edx,ebx ;if(i==te)break;
  1356.                 je @f
  1357.                         m2m dword[edx+14],ted_tim_ch
  1358.                         mov esi,ted_opt_ed_change_time
  1359.                         not esi
  1360.                         and dword[del_opt],esi ;n_tim=false;
  1361.                         call ted_iterat_next
  1362.                         jmp @b
  1363.                 @@:
  1364.                 test dword[del_opt],ted_opt_ed_change_time
  1365.                 jz @f
  1366.                         dec ted_tim_ch
  1367.                         xor al,al
  1368.                 @@:
  1369.                 test dword[del_opt],ted_opt_ed_change_time
  1370.                 jnz @f
  1371.                         mov ecx,ted_seln_x0
  1372.                         mov edx,ted_seln_y0
  1373.                         call ted_go_to_pos
  1374.                         mov ted_sel_x0,0
  1375.                         mov ted_sel_y0,0
  1376.                         mov ted_sel_x1,0
  1377.                         mov ted_sel_y1,0
  1378.                 @@:
  1379.         .end_f:
  1380.         pop esi edx ecx ebx
  1381.         ret
  1382. endp
  1383.  
  1384.  
  1385. ;input:
  1386. ; eax = pointer to begin select
  1387. ; ebx = pointer to end select
  1388. ; edi = pointer to tedit struct
  1389. align 4
  1390. ted_revers:
  1391.   cmp eax,ebx
  1392.   jne @f
  1393.     ret
  1394.   @@:
  1395.  
  1396.   push ecx edx
  1397.  
  1398.   mov edx,ted_tex_1
  1399.   cmp edx,ebx ;if(p1==1)p1=tex[1].perv;
  1400.   jne @f
  1401.     call ted_get_text_perv_pos
  1402.     mov ebx,edx
  1403.   @@:
  1404.  
  1405.   push esi
  1406.     mov edx,[eax+2] ; *** edx = tex[p0].perv ***
  1407.     ConvertIndexToPointer edx
  1408.     add edx,6
  1409.     mov ecx,[edx] ;tmp = tex[tex[p0].perv].next;
  1410.  
  1411.     mov esi,[ebx+6] ; *** esi = tex[p1].next ***
  1412.     ConvertIndexToPointer esi
  1413.     add esi,2
  1414.     m2m dword[edx],dword[esi] ;tex[tex[p0].perv].next = tex[tex[p1].next].perv;
  1415.  
  1416.     mov [esi],ecx ;tex[tex[p1].next].perv = tmp;
  1417.   pop esi
  1418.  
  1419.   mov ecx,[eax+2] ;tmp = tex[p0].perv;
  1420.   m2m dword[eax+2],dword[ebx+6] ;tex[p0].perv = tex[p1].next;
  1421.   mov [ebx+6],ecx ;tex[p1].next = tmp;
  1422.  
  1423.   mov edx,eax ;i=p0;
  1424.   @@:
  1425.     mov ecx,[edx+6] ;tmp = tex[i].next;
  1426.     m2m dword[edx+6],dword[edx+2] ;tex[i].next = tex[i].perv;
  1427.     mov [edx+2],ecx ;tex[i].perv = tmp;
  1428.     cmp edx,ebx ;if(i==p1)break;
  1429.     je @f
  1430. ; ---
  1431. ;cmp edx,ted_tex
  1432. ;je @f
  1433. ; ---
  1434.     mov edx,ecx ;i = tmp;
  1435.     ConvertIndexToPointer edx
  1436.     jmp @b
  1437.   @@:
  1438.   pop edx ecx
  1439.   call ted_text_colored
  1440.   ret
  1441.  
  1442.  
  1443. ;input:
  1444. ; edi = pointer to tedit struct
  1445. ;output:
  1446. ; dl = 0 not move
  1447. ; dl = 2 if move up
  1448. ; dl = 8 if scroll move up
  1449. align 4
  1450. ted_cur_move_up:
  1451.   cmp ted_cur_y,0
  1452.   je @f
  1453.     dec ted_cur_y
  1454.     mov dl,2
  1455.     ret
  1456.   @@:
  1457.   push eax
  1458.   mov eax,ted_scr_w
  1459.   cmp dword[eax+sb_offs_position],0
  1460.   je @f
  1461.     dec dword[eax+sb_offs_position]
  1462.     mov dl,8
  1463.     jmp .ret_f
  1464.   @@:
  1465.   mov dl,0
  1466.   .ret_f:
  1467.   pop eax
  1468.   ret
  1469.  
  1470. ;input:
  1471. ; edi = pointer to tedit struct
  1472. ;output:
  1473. ; dl = 0 not move
  1474. ; dl = 2 if move down
  1475. ; dl = 8 if scroll move down
  1476. align 4
  1477. ted_cur_move_down:
  1478.   push eax ebx
  1479.   mov ebx,ted_scr_w
  1480.   mov dl,0
  1481.   mov eax,dword[ebx+sb_offs_cur_area]
  1482.   dec eax
  1483.   cmp ted_cur_y,eax
  1484.   jge @f
  1485.     inc ted_cur_y
  1486.     mov dl,2
  1487.     jmp .ret_f
  1488.   @@:
  1489.   mov eax,ted_cur_y
  1490.   add eax,dword[ebx+sb_offs_position]
  1491.   inc eax
  1492.   cmp dword[ebx+sb_offs_max_area],eax
  1493.   jle @f
  1494.     inc dword[ebx+sb_offs_position]
  1495.     mov dl,8
  1496.   @@:
  1497.   .ret_f:
  1498.   pop ebx eax
  1499.   ret
  1500.  
  1501.  
  1502. ;input:
  1503. ; edi = pointer to tedit struct
  1504. ;output:
  1505. ; dl = 0 not move
  1506. ; dl = 1 if move up
  1507. align 4
  1508. ted_cur_move_page_up:
  1509.   push eax ebx
  1510.   mov ebx,ted_scr_w
  1511.   mov eax,dword[ebx+sb_offs_cur_area]
  1512.   xor dl,dl
  1513.   cmp eax,dword[ebx+sb_offs_position]
  1514.   jg @f
  1515.     sub dword[ebx+sb_offs_position],eax
  1516.     mov dl,1
  1517.   @@:
  1518.   cmp dword[ebx+sb_offs_position],0
  1519.   je @f
  1520.   cmp dl,1
  1521.   je @f
  1522.     mov dword[ebx+sb_offs_position],0
  1523.     mov dl,1
  1524.   @@:
  1525.   pop ebx eax
  1526.   ret
  1527.  
  1528. ;input:
  1529. ; edi = pointer to tedit struct
  1530. align 4
  1531. ted_cur_move_page_down:
  1532.         push eax ebx ecx
  1533.         mov ecx,ted_scr_w
  1534.  
  1535.         xor dl,dl
  1536.         mov eax,dword[ecx+sb_offs_max_area]
  1537.         sub eax,dword[ecx+sb_offs_cur_area]
  1538.         cmp dword[ecx+sb_offs_position],eax
  1539.         jge @f
  1540.                 mov ebx,dword[ecx+sb_offs_cur_area]
  1541.                 add dword[ecx+sb_offs_position],ebx
  1542.                 mov dl,1
  1543.                 mov dword[ecx+sb_offs_redraw],1
  1544.                 cmp dword[ecx+sb_offs_position],eax
  1545.                 jle @f
  1546.                         mov dword[ecx+sb_offs_position],eax
  1547.         @@:
  1548.         pop ecx ebx eax
  1549.         ret
  1550.  
  1551. ;input:
  1552. ; edi = pointer to tedit struct
  1553. ;output:
  1554. ; dl = 0 not move
  1555. ; dl = 1 if move left
  1556. ; dl = 3 if move left and up
  1557. ; dl = 8 if scroll move up
  1558. align 4
  1559. ted_cur_move_left:
  1560.         cmp ted_cur_x,0
  1561.         je @f
  1562.                 dec ted_cur_x
  1563.                 mov dl,1
  1564.                 ret
  1565.         @@:
  1566.         push eax
  1567.         mov eax,ted_scr_h
  1568.         cmp dword[eax+sb_offs_position],0
  1569.         je @f
  1570.                 dec dword[eax+sb_offs_position]
  1571.                 mov dl,8
  1572.                 jmp .ret_f
  1573.         @@:
  1574.         cmp ted_cur_y,0
  1575.         jne @f
  1576.                 mov eax,ted_scr_w
  1577.                 mov dl,0
  1578.                 cmp dword[eax+sb_offs_position],0
  1579.                 je .ret_f
  1580.                         dec dword[eax+sb_offs_position]
  1581.                         call ted_scroll_set_redraw
  1582.                         call ted_cur_move_x_last_char
  1583.                         mov dl,8
  1584.                         jmp .ret_f
  1585.         @@:
  1586.         cmp ted_cur_y,0
  1587.         je @f
  1588.                 dec ted_cur_y
  1589.                 call ted_cur_move_x_last_char
  1590.                 cmp dl,8
  1591.                 je .ret_f
  1592.                 mov dl,3
  1593.                 jmp .ret_f
  1594.         @@:
  1595.         mov dl,0
  1596.         .ret_f:
  1597.         pop eax
  1598.         ret
  1599.  
  1600. ;input:
  1601. ; edi = pointer to tedit struct
  1602. align 4
  1603. ted_cur_move_right:
  1604.         push eax ebx
  1605.         mov eax,ted_scr_h
  1606.         xor dl,dl
  1607.         mov ebx,dword[eax+sb_offs_cur_area]
  1608.         cmp ted_cur_x,ebx
  1609.         jge @f
  1610.                 inc ted_cur_x
  1611.                 mov dl,1
  1612.                 jmp .ret_f
  1613.         @@:
  1614.                 inc dword[eax+sb_offs_position]
  1615.                 mov dl,8
  1616.         .ret_f:
  1617.         pop ebx eax
  1618.         ret
  1619.  
  1620. ;input:
  1621. ; edi = pointer to tedit struct
  1622. align 4
  1623. ted_cur_move_x_last_char:
  1624. ;[hScr.position]
  1625. ;[hScr.cur_area]
  1626. ;dl-???
  1627.   push eax ebx ecx
  1628.   mov eax,ted_cur_y
  1629.   mov ecx,ted_scr_w
  1630.   add eax,dword[ecx+sb_offs_position]
  1631.   call ted_strlen
  1632.   xor dl,dl
  1633.  
  1634.   mov ecx,ted_scr_h
  1635.   cmp ebx,dword[ecx+sb_offs_position]
  1636.   jge @f
  1637.     mov dl,8
  1638.     mov dword[ecx+sb_offs_position],ebx
  1639.   @@:
  1640.   sub ebx,dword[ecx+sb_offs_position]
  1641.  
  1642.   cmp ebx,dword[ecx+sb_offs_cur_area]
  1643.   jle @f ; b---[---]---e
  1644.     add dword[ecx+sb_offs_position],ebx
  1645.     mov ebx,dword[ecx+sb_offs_cur_area]
  1646.     sub dword[ecx+sb_offs_position],ebx
  1647.     mov dl,8
  1648.   @@:
  1649.   mov ted_cur_x,ebx
  1650.   pop ecx ebx eax
  1651.   ret
  1652.  
  1653. ;input:
  1654. ; edi = pointer to tedit struct
  1655. ;output:
  1656. ; dl = 0 not move
  1657. ; dl = 1 move cursor
  1658. ; dl = 8 move cursor and scroll
  1659. align 4
  1660. ted_cur_move_x_first_char:
  1661.         xor dl,dl
  1662.         cmp ted_cur_x,0
  1663.         je @f
  1664.                 mov ted_cur_x,0
  1665.                 mov dl,1
  1666.         @@:
  1667.         push eax
  1668.         mov eax,ted_scr_h
  1669.         cmp dword[eax+sb_offs_position],0
  1670.         je @f
  1671.                 mov dword[eax+sb_offs_position],0
  1672.                 mov dl,8
  1673.         @@:
  1674.         pop eax
  1675.         ret
  1676.  
  1677. ;input:
  1678. ; edx = pointer to symbol struct
  1679. ; edi = pointer to tedit struct
  1680. ;output:
  1681. ; eax = array index
  1682. align 4
  1683. ted_get_text_arr_index:
  1684.         push ecx edx
  1685.                 mov eax,edx
  1686.                 sub eax,ted_tex
  1687.                 xor edx,edx
  1688.                 mov ecx,sizeof.symbol
  1689.                 div ecx
  1690.         pop edx ecx
  1691.         ret
  1692.  
  1693. ;input:
  1694. ; edx = pointer to symbol struct
  1695. ; edi = pointer to tedit struct
  1696. ;output:
  1697. ; edx = pointer to 'perv' struct
  1698. align 4
  1699. ted_get_text_perv_pos:
  1700.         mov edx,dword[edx+2]
  1701.         imul edx,sizeof.symbol
  1702.         add edx,ted_tex
  1703.         ret
  1704.  
  1705. ;input:
  1706. ; edx = pointer to symbol struct
  1707. ;output:
  1708. ; edx = pointer to 'next' symbol struct
  1709. align 4
  1710. ted_get_text_next_pos:
  1711.         mov edx,dword[edx+6]
  1712.         imul edx,sizeof.symbol
  1713.         add edx,ted_tex
  1714.         ret
  1715.  
  1716. ;input:
  1717. ; edi = pointer to tedit struct
  1718. ;output:
  1719. ; edx = symbol under cursor
  1720. ; ted_gp_opt = 1,2
  1721. ; edx = tex[1].perv if error
  1722. ; ted_gp_opt = 0
  1723. align 4
  1724. ted_get_pos_by_cursor:
  1725.         push eax ecx esi
  1726.                 mov esi,ted_cur_x
  1727.                 mov eax,ted_scr_h
  1728.                 add esi,dword[eax+sb_offs_position]
  1729.                 mov ecx,ted_cur_y
  1730.                 mov eax,ted_scr_w
  1731.                 add ecx,dword[eax+sb_offs_position]
  1732.                 call ted_get_pos_by_coords
  1733.         pop esi ecx eax
  1734.         ret
  1735.  
  1736. ;input:
  1737. ; esi = XPos
  1738. ; ecx = YPos
  1739. ; edi = pointer to tedit struct
  1740. ;output:
  1741. ; edx = symbol under cursor
  1742. ; ted_gp_opt = 1 if found text line
  1743. ; ted_gp_opt = 2 if found text line and column
  1744. ; edx = tex[1] if error
  1745. ; ted_gp_opt = 0 if text no found
  1746. align 4
  1747. ted_get_pos_by_coords:
  1748.   push eax ;Row
  1749.   push ebx ;Col
  1750.  
  1751.   xor eax,eax
  1752.   xor ebx,ebx
  1753.   mov ted_gp_opt,0
  1754.   mov edx,ted_tex
  1755.   @@:
  1756.     call ted_iterat_next
  1757.     cmp edx,ted_tex_1
  1758.     jle @f
  1759.     cmp ebx,esi
  1760.     jne .u1_0 ;Col <> ted_cur_x
  1761.       mov ted_gp_opt,1
  1762.       cmp eax,ecx
  1763.       jge @f ; Row >= ted_cur_y
  1764.     .u1_0:
  1765.     mov ted_gp_opt,0
  1766.     inc ebx
  1767.     cmp byte [edx],13
  1768.     jne @b
  1769.     cmp eax,ecx
  1770.     jge @f ; Row >= ted_cur_y
  1771.     inc eax
  1772.     xor ebx,ebx
  1773.     jmp @b
  1774.   @@:
  1775.   cmp eax,ecx
  1776.   jne @f ; Row = ted_cur_y
  1777.     inc ted_gp_opt
  1778.   @@:
  1779.   cmp ted_gp_opt,0
  1780.   jne @f
  1781.     mov edx,ted_tex_1
  1782.     ;call ted_get_text_perv_pos
  1783.   @@:
  1784.   pop ebx eax
  1785.   ret
  1786.  
  1787.  
  1788. ;input:
  1789. ; eax = Row
  1790. ; edi = pointer to tedit struct
  1791. ;output:
  1792. ; ebx = str len
  1793. align 4
  1794. ted_strlen:
  1795.   push edx ecx
  1796.   ;ecx = Row, from cycle
  1797.  
  1798.   xor ebx,ebx
  1799.   xor ecx,ecx
  1800.   mov edx,ted_tex
  1801.   @@:
  1802.     call ted_iterat_next
  1803.     cmp edx,ted_tex_1
  1804.     jle @f
  1805.     inc ebx
  1806.     cmp byte [edx],13
  1807.     jne @b
  1808.     dec ebx ;lenght minus 1 sumbol to paragraph
  1809.     cmp eax,ecx
  1810.     je @f
  1811.     xor ebx,ebx
  1812.     inc ecx
  1813.     jmp @b
  1814.   @@:
  1815.  
  1816.   cmp eax,ecx
  1817.   je @f
  1818.     xor ebx,ebx
  1819.   @@:
  1820.  
  1821.   pop ecx edx
  1822.   ret
  1823.  
  1824.  
  1825. ;input:
  1826. ; edx = symbol position
  1827. ; edi = pointer to tedit struct
  1828. ;output:
  1829. ; eax = number of line
  1830. ; ebx = symbol position in line
  1831. align 4
  1832. ted_get_text_coords:
  1833.   push edx
  1834.   xor eax,eax
  1835.   xor ebx,ebx
  1836.   @@:
  1837.     call ted_iterat_perv
  1838.  
  1839.     cmp eax,0
  1840.     jne .no_col_mov
  1841.     inc ebx
  1842.     .no_col_mov:
  1843.  
  1844.     cmp edx,ted_tex_1
  1845.     jle @f
  1846.     cmp byte [edx],13
  1847.     jne @b
  1848.     inc eax
  1849.     jmp @b
  1850.   @@:
  1851.   dec ebx
  1852.   pop edx
  1853.   ret
  1854.  
  1855. ;input:
  1856. ; edi = pointer to tedit struct
  1857. ;output:
  1858. ; eax = num lines
  1859. align 4
  1860. ted_get_num_lines:
  1861.   push edx
  1862.   mov eax,1
  1863.   mov edx,ted_tex
  1864.   @@:
  1865.     call ted_iterat_next
  1866.     cmp edx,ted_tex_1
  1867.     jle @f
  1868.     cmp byte [edx],13
  1869.     jne @b
  1870.     inc eax
  1871.     jmp @b
  1872.   @@:
  1873. ;...
  1874. ;dec eax
  1875.   pop edx
  1876.   ret
  1877.  
  1878.  
  1879. ;input:
  1880. ; edi = pointer to tedit struct
  1881. ;description:
  1882. ; отменяет отмененные действия, перед изменением документа
  1883. align 4
  1884. proc ted_set_undo
  1885.   mov ted_drag_k,0 ;заканчиваем выделение от клавиатуры
  1886.   cmp ted_tim_undo,1
  1887.   jl .no_work
  1888.  
  1889.   push eax ebx edx
  1890.   mov edx,ted_tex
  1891.   call ted_get_text_next_pos ;long i=tex[0].next;
  1892.   mov eax,ted_tim_undo
  1893.   sub ted_tim_ch,eax ;ted_tim_ch-=ted_tim_undo;
  1894.   mov eax,ted_tim_ch
  1895.   cmp ted_tim_ls,eax ;if(ted_tim_ls>ted_tim_ch)
  1896.   jle @f
  1897.     mov ted_tim_ls,0
  1898.   @@:
  1899.     cmp edx,ted_tex
  1900.     je @f
  1901.  
  1902.     ;if(tex[i].tc>ted_tim_ch){ // если создание символа было отменено
  1903.     cmp [edx+10],eax
  1904.     jle .no_u1
  1905.       mov dword [edx+10],0
  1906.       mov dword [edx+14],0
  1907.  
  1908.       mov ebx,[edx+2]
  1909.       imul ebx,sizeof.symbol
  1910.       add ebx,ted_tex;.next
  1911.       m2m dword [ebx+6],dword [edx+6] ;tex[tex[i].perv].next=tex[i].next;
  1912.  
  1913.       mov ebx,[edx+6]
  1914.       imul ebx,sizeof.symbol
  1915.       add ebx,ted_tex;.perv
  1916.       m2m dword [ebx+2],dword [edx+2] ;tex[tex[i].next].perv=tex[i].perv;
  1917.  
  1918.     .no_u1:
  1919.  
  1920.     ;else if(tex[i].td>ted_tim_ch) tex[i].td=0; // если удаление символа было отменено
  1921.     cmp [edx+14],eax
  1922.     jle .no_u2
  1923.       mov dword [edx+14],0
  1924.     .no_u2:
  1925.  
  1926.     call ted_get_text_next_pos
  1927.     jmp @b
  1928.   @@:
  1929.   mov ted_tim_undo,0
  1930.   mov eax,ted_tim_co
  1931.   cmp ted_tim_ch,eax
  1932.   jge @f
  1933.     mov ted_tim_co,0
  1934.   @@:
  1935.   pop edx ebx eax
  1936.   .no_work:
  1937.   ret
  1938. endp
  1939.  
  1940. ;input:
  1941. ; ecx = Col
  1942. ; edx = Row
  1943. ; edi = pointer to tedit struct
  1944. align 4
  1945. ted_go_to_pos:
  1946.         push eax
  1947.         mov eax,ted_scr_w
  1948.         mov ted_cur_x,ecx
  1949.         sub edx,dword[eax+sb_offs_position]
  1950.  
  1951.         cmp edx,dword[eax+sb_offs_cur_area] ;ted_cur_y > [.cur_area]
  1952.         jl @f
  1953.                 push ebx
  1954.                 mov ebx,edx
  1955.                 sub ebx,dword[eax+sb_offs_cur_area]
  1956.                 inc ebx
  1957.                 add dword[eax+sb_offs_position],ebx
  1958.                 sub edx,ebx
  1959.                 pop ebx
  1960.                 ; ??? redrav
  1961.         @@:
  1962.         mov ted_cur_y,edx
  1963.         pop eax
  1964.         ret
  1965.  
  1966. ;input:
  1967. ; edi = pointer to tedit struct
  1968. align 4
  1969. ted_text_colored:
  1970.   push eax edx
  1971.   mov eax,ted_tim_ch
  1972.   sub eax,ted_tim_undo
  1973.   mov ted_tim_co,eax
  1974.   mov edx,ted_tex
  1975.   @@:
  1976.     call ted_iterat_next
  1977.     cmp edx,ted_tex_1
  1978.     jle @f
  1979.     mov byte[edx+1],0
  1980.     jmp @b
  1981.   @@:
  1982.  
  1983.   cmp ted_key_words_count,1
  1984.   jl .no_colors
  1985.   mov edx,ted_tex
  1986.   @@:
  1987.     call ted_text_find_sel_color
  1988.     cmp edx,ted_tex_1
  1989.     jle .no_colors
  1990.     jmp @b
  1991.   .no_colors:
  1992.   pop edx eax
  1993.   ret
  1994.  
  1995.  
  1996. ;input:
  1997. ; edx = pointer to start symbol
  1998. ; edi = pointer to tedit struct
  1999. ;output:
  2000. ; edx = pointer to next symbol
  2001. ;description:
  2002. ; Функция для поиска и выделения подсвеченых слов
  2003. align 4
  2004. proc ted_text_find_sel_color
  2005. locals
  2006.   begPos dd ? ;начальная позиция
  2007.   endPos dd ? ;конечная позиция
  2008.   find db ? ;найдено / не найдено
  2009.   f_color db ? ;индекс цвета найденого слова
  2010. endl
  2011.   push eax ebx ecx esi
  2012. ;eax = word_n текущий номер (позиция) проверяемого слова в списке
  2013. ;ebx = для разных целей
  2014. ;ecx = l_pos последний номер (позиция) подходящего слова в списке
  2015. ;esi = для разных целей, номер проверяемого символа в слове
  2016.   mov dword[begPos],1
  2017.   mov dword[endPos],1
  2018.   mov byte[find],0
  2019.   mov byte[f_color],1
  2020.   @@:
  2021.     call ted_iterat_next
  2022.     cmp edx,ted_tex_1
  2023.     jle @f
  2024.  
  2025.     xor eax,eax
  2026.     mov al,byte[edx]
  2027.     shl ax,2 ;eax*=4
  2028.     add eax,ted_arr_key_pos
  2029.     mov eax,dword[eax]
  2030.     cmp eax,0
  2031.     jl @b ;if( (word_n=ted_arr_key_pos[(unsigned char)tex[i].c])>-1 ){
  2032.  
  2033.     mov ecx,eax
  2034.     ;while(l_pos<ted_key_words_count && Col[l_pos].Text[0]==Col[word_n].Text[0])
  2035.     .wh_1b:
  2036.       cmp ecx,ted_key_words_count
  2037.       jge .wh_1e
  2038.       ColToIndexOffset ecx,esi
  2039.       mov bl,byte[esi]
  2040.       ColToIndexOffset eax,esi
  2041.       cmp bl,byte[esi]
  2042.       jne .wh_1e
  2043.         inc ecx
  2044.       jmp .wh_1b
  2045.     .wh_1e:
  2046.  
  2047.     mov dword[begPos],edx ;bP=i;
  2048.     mov esi,1
  2049.  
  2050.     .wh_2b: ;while(1){
  2051.       call ted_iterat_next
  2052.  
  2053.       ;while(l_pos>word_n && Col[l_pos-1].Text[pos]!=tex[i].c)
  2054.       .wh_3b:
  2055.         cmp ecx,eax
  2056.         jle .wh_3e
  2057.         dec ecx
  2058.         ColToIndexOffset ecx,ebx
  2059.         inc ecx
  2060.         ;cmp byte[ebx+esi],byte[edx]
  2061.         mov bl,byte[ebx+esi]
  2062.         cmp bl,byte[edx]
  2063.         je .wh_3e
  2064.           dec ecx
  2065.         jmp .wh_3b
  2066.       .wh_3e:
  2067.  
  2068.       ColToIndexOffset eax,ebx
  2069.       cmp byte[ebx+esi],0
  2070.       jne .if_0 ;if(Col[word_n].Text[pos]==0){
  2071.         mov dword[endPos],edx ;eP=i;
  2072.         ColToIndexOffset eax,ebx
  2073.         mov bl,byte[ebx+MAX_COLOR_WORD_LEN+6]
  2074.         mov byte[f_color],bl ;f_color=Col[word_n].color;
  2075.  
  2076. mov byte[find],1
  2077.           ColToIndexOffset eax,ebx ;... ebx = Col[word_n]
  2078.           mov bl,byte[ebx+MAX_COLOR_WORD_LEN+4]
  2079.           cmp bl,0 ;if(Col[word_n].wwo)
  2080.           je .if_2n
  2081.             push edx
  2082.             mov edx,dword[begPos]
  2083.      call ted_iterat_perv
  2084.  
  2085.             btr bx,0 ;1-1
  2086.             jae .if_3e ;if(Col[word_n].wwo&1)
  2087.               ;u1= !(isalnum(cont_s)||cont_s=='_')
  2088.               call isalnum
  2089.               jae .if_3e
  2090.                 mov byte[find],0
  2091.             .if_3e:
  2092.  
  2093.             btr bx,3 ;4-1
  2094.             jae .if_4e ;if(Col[word_n].wwo&8)
  2095.               ;u1= !isalpha(cont_s);
  2096.               call isalpha
  2097.               jae .if_4e
  2098.                 mov byte[find],0
  2099.             .if_4e:
  2100.  
  2101.             mov edx,dword[endPos]
  2102. ;     call ted_iterat_next
  2103.  
  2104.             btr bx,1 ;2-1
  2105.             jae .if_5e ;if(Col[word_n].wwo&2)
  2106.               ;u1= !(isalnum(cont_s)||cont_s=='_')
  2107.               call isalnum
  2108.               jae .if_5e
  2109.                 mov byte[find],0
  2110.             .if_5e:
  2111.  
  2112.             btr bx,4 ;5-1
  2113.             jae .if_6e ;if(Col[word_n].wwo&16)
  2114.               ;u1= !isalpha(cont_s);
  2115.               call isalpha
  2116.               jae .if_6e
  2117.                 mov byte[find],0
  2118.             .if_6e:
  2119.  
  2120.             btr bx,2 ;3-1
  2121.             jae .if_7e ;if(Col[word_n].wwo&4)
  2122.             ColToIndexOffset eax,ebx
  2123.             mov bl,byte[ebx+MAX_COLOR_WORD_LEN+5]
  2124.             call ted_iterat_next_pos_char
  2125.        cmp edx,ted_tex_1
  2126.        jle .if_7e
  2127.        mov dword[endPos],edx
  2128.             .if_7e:
  2129.  
  2130.             pop edx
  2131.           .if_2n:
  2132. ;                 if(i!=1){ // не конец документа
  2133. ;                   cont_s=tex[eP].c;
  2134. ;                   if(Col[word_n].wwo&2) u2= !(isalnum(cont_s)||cont_s=='_');  // не букв.-числ. символ
  2135. ;                   if(u2 && Col[word_n].wwo&16) u2= !isalpha(cont_s); // не числ. символ
  2136. ;                   if(Col[word_n].wwo&4) eP=ted_iterat_next_pos_char(eP,Col[word_n].endc);
  2137.  
  2138.         cmp eax,ecx
  2139.         je .wh_2e ;if(word_n==l_pos) break; // do double - если слово точно последнее
  2140.       .if_0:
  2141.  
  2142.       cmp edx,ted_tex_1
  2143.       jle .wh_2e ;if(i==1) break;
  2144.  
  2145.       ;while(l_pos>word_n && Col[word_n].Text[pos]!=tex[i].c)
  2146.       .wh_4b:
  2147.         cmp ecx,eax
  2148.         jle .wh_4e
  2149.         ColToIndexOffset eax,ebx
  2150.         ;cmp byte[ebx+esi],byte[edx]
  2151.         mov bl,byte[ebx+esi]
  2152.         cmp bl,byte[edx]
  2153.         je .wh_4e
  2154.           inc eax
  2155.         jmp .wh_4b
  2156.       .wh_4e:
  2157.  
  2158.       cmp eax,ecx
  2159.       je .wh_2e;if(word_n==l_pos) break;
  2160.       inc esi ;pos++;
  2161.       jmp .wh_2b
  2162.     .wh_2e:
  2163.  
  2164.     cmp byte[find],1 ;if(fnd)break;
  2165.     je @f
  2166.     mov edx,dword[begPos];i=bP;
  2167.     jmp @b
  2168.   @@:
  2169.  
  2170.   cmp byte[find],1
  2171.   jne .if_1e ;if(fnd){ // выделение найденого текста
  2172. ;    if(!mode_sf1 || (mode_sf1 && strlen(Col[word_n].f1->c_str())>0)){
  2173.     mov eax,dword[begPos]
  2174.     mov bl,byte[f_color]
  2175.     mov byte[eax+1],bl ;tex[bP].col=f_color;
  2176.     mov eax,dword[endPos]
  2177.     mov byte[eax+1],0xff ;tex[eP].col=255;
  2178. ;    return ItPoPerv(eP); // возвращаем позицию конца вхождения
  2179.     mov edx,dword[endPos]
  2180.     call ted_get_text_perv_pos
  2181.     jmp @f
  2182.   .if_1e:
  2183.     mov edx,ted_tex
  2184.   @@:
  2185.  
  2186.   pop esi ecx ebx eax
  2187.   ret
  2188. endp
  2189.  
  2190. ;input:
  2191. ; edx = pointer to char (byte)
  2192. ;output:
  2193. ; cf=1 if symbol is...
  2194. align 4
  2195. tab_all_num db 0,0,0,0,0,0,11111111b,11b,11111110b,0xff,0xff,111b,11111110b,0xff,0xff,111b,0,0,0,0,0,0,0,0;,0,0,0,0,0,0,0,0 - tab_alpha_0,0,0,0,0,0,0,0
  2196. tab_alpha db 0,0,0,0,0,0,0,0,11111110b,0xff,0xff,111b,11111110b,0xff,0xff,111b,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  2197.  
  2198. align 4
  2199. isalnum:
  2200.   push eax ebx
  2201.   mov al,byte[edx] ;al=offset
  2202.   shr al,3
  2203.   and eax,11111b
  2204.   lea ebx,[tab_all_num]
  2205.   add ebx,eax
  2206.   mov ah,byte[ebx]
  2207.   mov al,byte[edx] ;al=bit
  2208.   and ax,111b
  2209.   mov bx,word[ebx]
  2210.   btr bx,ax
  2211.   pop ebx eax
  2212.   ret
  2213. align 4
  2214. isalpha:
  2215.   push eax ebx
  2216.   mov al,byte[edx] ;al=offset
  2217.   shr al,3
  2218.   and eax,11111b
  2219.   lea ebx,[tab_alpha]
  2220.   add ebx,eax
  2221.   mov ah,byte[ebx]
  2222.   mov al,byte[edx] ;al=bit
  2223.   and ax,111b
  2224.   mov bx,word[ebx]
  2225.   btr bx,ax
  2226.   pop ebx eax
  2227.   ret
  2228.  
  2229. align 4
  2230. proc ted_show_help_f1, edit:dword
  2231.   push eax edx edi
  2232.   mov edi,dword[edit]
  2233.  
  2234.   call ted_get_pos_by_cursor
  2235.   push edx
  2236.     call ted_iterat_next_color_tag
  2237.     mov eax,edx
  2238.   pop edx
  2239.   call ted_iterat_perv_color_tag
  2240.  
  2241.   cmp eax,ted_tex
  2242.   jle @f
  2243.   cmp edx,ted_tex_1
  2244.   jle @f
  2245.     stdcall ted_find_help_id,eax
  2246.   @@:
  2247.   ;call ted_draw_main_cursor
  2248.   call ted_draw_help_f1
  2249.   pop edi edx eax
  2250.   ret
  2251. endp
  2252.  
  2253. ;input:
  2254. ; edx = position begin 'symbol' struct
  2255. ; edi = pointer to tedit struct
  2256. ; end_pos = position end 'symbol' struct
  2257. align 4
  2258. proc ted_find_help_id, end_pos:dword
  2259. ; ecx = word_n
  2260. ; ebx = l_pos
  2261.   mov ted_help_id,-1
  2262.  
  2263.   push ebx ecx
  2264.     xor ebx,ebx
  2265.     mov bl,byte[edx]
  2266.     shl bx,2 ;ebx*=4
  2267.     add ebx,ted_arr_key_pos
  2268.     mov ecx,dword[ebx]
  2269.     cmp ecx,0
  2270.     jl .if_0e ;if( (word_n=ted_arr_key_pos[(unsigned char)tf[0]])>-1 ){
  2271.       push esi eax
  2272.       mov ebx,ecx ;l_pos=word_n;
  2273.       ColToIndexOffset ecx,esi
  2274.       push cx
  2275.       mov cl,byte[esi]
  2276.       @@:
  2277.         cmp ebx,ted_key_words_count ;while(l_pos<ted_key_words_count)
  2278.         jge @f
  2279.         ;ColToIndexOffset ecx,esi
  2280.         ColToIndexOffset ebx,eax
  2281.         cmp cl,byte[eax] ;&& Col[l_pos].Text[0]==Col[word_n].Text[0])
  2282.         jne @f
  2283.           inc ebx ;l_pos++;
  2284.           jmp @b
  2285.       @@:
  2286.       pop cx
  2287.       call ted_iterat_next ;pos=1;
  2288.       mov esi,1
  2289.       @@:
  2290.         push dx
  2291.         push word[edx]
  2292.         pop dx
  2293.           .wh_0b:
  2294.             cmp ebx,ecx ;while(l_pos>word_n
  2295.             jle .wh_0e
  2296.             dec ebx
  2297.             ColToIndexOffset ebx,eax
  2298.             inc ebx
  2299.             cmp byte[eax+esi],dl ;&& Col[l_pos-1].Text[pos]!=tf[i])
  2300.             je .wh_0e
  2301.               dec ebx ;l_pos--;
  2302.             jmp .wh_0b
  2303.           .wh_0e:
  2304.  
  2305.           .wh_1b:
  2306.             cmp ebx,ecx ;while(l_pos>word_n
  2307.             jle .wh_1e
  2308.             ColToIndexOffset ecx,eax
  2309.             cmp byte[eax+esi],dl
  2310.             je .wh_1e
  2311.               inc ecx ;word_n++;
  2312.             jmp .wh_1b
  2313.           .wh_1e:
  2314.         pop dx
  2315.  
  2316.         cmp ecx,ebx ;if(word_n==l_pos) break;
  2317.         je @f
  2318.         call ted_iterat_next ;pos++;
  2319.         cmp edx,dword[end_pos] ;for(...;i<strlen;...)
  2320.         je @f ;jge
  2321.         inc esi
  2322.         jmp @b
  2323.       @@:
  2324.       pop eax esi
  2325.  
  2326.       mov ted_help_id,ecx
  2327.       ;return word_n;
  2328.  
  2329.     .if_0e:
  2330.   pop ecx ebx
  2331.   ret
  2332. endp
  2333.  
  2334. ;output:
  2335. ; eax = код ошибки
  2336. ; ebx = колличество прочитанных байт
  2337. align 4
  2338. proc ted_open_file, edit:dword, file:dword, f_name:dword ;функция открытия файла
  2339.         push edi
  2340.         mov edi,dword[edit]
  2341.  
  2342.         mov eax,70
  2343.         mov ebx,dword[file]
  2344.         mov dword[ebx], 0
  2345.         mov dword[ebx+4], 0
  2346.         mov dword[ebx+8], 0
  2347.         m2m dword[ebx+12], ted_max_chars ;число байт, которые могут быть считаны с файла
  2348.         m2m dword[ebx+16], ted_tex
  2349.         mov  byte[ebx+20], 0
  2350.         push dword[f_name]
  2351.         pop dword[ebx+21]
  2352.         int 0x40
  2353.  
  2354.         cmp eax,0
  2355.         je @f
  2356.         cmp eax,6
  2357.         je @f
  2358.                 jmp .ret_f
  2359.         @@:
  2360.         cmp ebx,-1
  2361.         je .ret_f
  2362.                 ;if open file
  2363.                 call ted_on_open_file
  2364.         .ret_f:
  2365.         pop edi
  2366.         ret
  2367. endp
  2368.  
  2369. align 4
  2370. proc ted_but_select_word, edit:dword
  2371.         pushad
  2372.         mov edi,dword[edit]
  2373.  
  2374.         call ted_get_pos_by_cursor
  2375.         push edx
  2376.                 call ted_iterat_perv_color_tag
  2377.                 cmp edx,ted_tex_1
  2378.                 jle @f
  2379.                         call ted_get_text_coords
  2380.                         mov ted_sel_x0,ebx
  2381.                         mov ted_sel_y0,eax
  2382.                 @@:
  2383.         pop edx
  2384.         call ted_iterat_next_color_tag
  2385.         cmp edx,ted_tex_1
  2386.         jle @f
  2387.                 call ted_get_text_coords
  2388.                 mov ted_sel_x1,ebx
  2389.                 mov ted_sel_y1,eax
  2390.         @@:
  2391.  
  2392.         cmp ted_fun_draw_panel_buttons,0
  2393.         je @f
  2394.                 call ted_fun_draw_panel_buttons
  2395.         @@:
  2396.         stdcall ted_draw,edi
  2397.         popad
  2398.         ret
  2399. endp
  2400.  
  2401. align 4
  2402. proc ted_but_cut, edit:dword
  2403.         push edi
  2404.         mov edi,dword[edit]
  2405.  
  2406.         stdcall ted_but_copy,edi
  2407.         call ted_set_undo
  2408.         stdcall ted_sel_text_del,ted_opt_ed_change_time
  2409.  
  2410.         cmp al,1
  2411.         jne @f
  2412.                 stdcall ted_draw,edi
  2413.                 cmp ted_fun_draw_panel_buttons,0
  2414.                 je @f
  2415.                         call ted_fun_draw_panel_buttons
  2416.         @@:
  2417.         pop edi
  2418.         ret
  2419. endp
  2420.  
  2421. ;output:
  2422. ; al = 1 if copy text
  2423. align 4
  2424. proc ted_but_copy, edit:dword
  2425.         pushad
  2426.         mov edi,dword[edit]
  2427.  
  2428.         call ted_is_select
  2429.         cmp al,0
  2430.         je .end_f ;if not selected text
  2431.         call ted_sel_normalize
  2432.  
  2433.         mov esi,ted_seln_x1
  2434.         mov ecx,ted_seln_y1
  2435.         call ted_get_pos_by_coords
  2436.         mov ebx,edx
  2437.         mov esi,ted_seln_x0
  2438.         mov ecx,ted_seln_y0
  2439.         call ted_get_pos_by_coords
  2440.         mov esi,ebx
  2441.  
  2442.         xor ecx,ecx
  2443.         mov ebx,ted_buffer
  2444.         ;mov edx,ted_tex
  2445.         @@:
  2446.                 cmp edx,ted_tex_1 ;end of file
  2447.                 jle @f
  2448.                 cmp edx,esi ;end of select
  2449.                 je @f
  2450.                 inc ecx
  2451.                 cmp ecx,ted_buffer_size ;owerflow bufer
  2452.                 je @f
  2453.  
  2454.                 mov al,byte[edx]
  2455.                 mov byte[ebx],al
  2456.                 inc ebx
  2457.  
  2458.                 call ted_iterat_next
  2459.                 jmp @b
  2460.         @@:
  2461.         add ecx,ted_buffer
  2462.         mov byte[ebx],0
  2463.  
  2464.         cmp ecx,0
  2465.         je .end_f
  2466.                 call ted_draw_buffer
  2467.                 cmp ted_fun_draw_panel_buttons,0
  2468.                 je .end_f
  2469.                         call ted_fun_draw_panel_buttons
  2470.         .end_f:
  2471.         popad
  2472.         ret
  2473. endp
  2474.  
  2475.  
  2476. align 4
  2477. proc ted_but_paste, edit:dword
  2478.         push eax ebx esi edi
  2479.         mov edi,dword[edit]
  2480.  
  2481.         mov esi,ted_buffer
  2482.         call tl_strlen
  2483.         cmp eax,1
  2484.         jl @f
  2485.                 mov esi,eax
  2486.                 call ted_set_undo
  2487.                 mov ebx,ted_opt_ed_change_time+ted_opt_ed_move_cursor
  2488.                 stdcall ted_sel_text_del,ebx
  2489.                 cmp al,1
  2490.                 jne .del
  2491.                         mov ebx,ted_opt_ed_move_cursor
  2492.                 .del:
  2493.                 stdcall ted_text_add,edi,ted_buffer,esi,ebx
  2494.                 stdcall ted_draw,edi
  2495.                 cmp ted_fun_draw_panel_buttons,0
  2496.                 je @f
  2497.                         call ted_fun_draw_panel_buttons
  2498.         @@:
  2499.         pop edi esi ebx eax
  2500.         ret
  2501. endp
  2502.  
  2503. align 4
  2504. proc ted_but_sumb_upper, edit:dword
  2505.   push edi esi
  2506.   mov edi,dword[edit]
  2507.  
  2508.   mov [conv_table],EvUpper
  2509.   call ted_convert_sel_text
  2510.   cmp esi,0
  2511.   je @f
  2512.     stdcall ted_draw,edi
  2513.   @@:
  2514.   pop esi edi
  2515.   ret
  2516. endp
  2517.  
  2518. align 4
  2519. proc ted_but_sumb_lover, edit:dword
  2520.   push edi esi
  2521.   mov edi,dword[edit]
  2522.  
  2523.   mov [conv_table],EvLover
  2524.   call ted_convert_sel_text
  2525.   cmp esi,0
  2526.   je @f
  2527.     stdcall ted_draw,edi
  2528.   @@:
  2529.   pop esi edi
  2530.   ret
  2531. endp
  2532.  
  2533. align 4
  2534. proc ted_but_reverse, edit:dword
  2535.   push eax ebx edi
  2536.   mov edi,dword[edit]
  2537.  
  2538.   call ted_is_select
  2539.   cmp al,0
  2540.   je @f
  2541.     call ted_sel_normalize
  2542.     push esi ecx edx
  2543.       mov esi,ted_seln_x0
  2544.       mov ecx,ted_seln_y0
  2545.       call ted_get_pos_by_coords
  2546.       mov eax,edx
  2547.       mov esi,ted_seln_x1
  2548.       cmp esi,0
  2549.       je .beg_str
  2550.         dec esi
  2551.       .beg_str:
  2552.       mov ecx,ted_seln_y1
  2553.       call ted_get_pos_by_coords
  2554.       ;call ted_get_text_perv_pos
  2555.       mov ebx,edx
  2556.     pop edx ecx esi
  2557.     ;cmp eax,...
  2558.     ;je @f
  2559.     call ted_revers
  2560.   @@:
  2561.   stdcall ted_draw,edi
  2562.   pop edi ebx eax
  2563.   ret
  2564. endp
  2565.  
  2566. align 4
  2567. proc ted_but_undo, edit:dword
  2568.         push eax edi
  2569.         mov edi,dword[edit]
  2570.  
  2571.         mov eax,ted_tim_undo
  2572.         cmp ted_tim_ch,eax
  2573.         jbe @f
  2574.                 inc ted_tim_undo
  2575.                 ;call ted_text_colored
  2576.                 stdcall ted_draw,edi
  2577.                 cmp ted_fun_draw_panel_buttons,0
  2578.                 je @f
  2579.                         call ted_fun_draw_panel_buttons
  2580.         @@:
  2581.         pop edi eax
  2582.         ret
  2583. endp
  2584.  
  2585. align 4
  2586. proc ted_but_redo, edit:dword
  2587.         push edi
  2588.         mov edi,dword[edit]
  2589.  
  2590.         cmp ted_tim_undo,1
  2591.         jb @f
  2592.                 dec ted_tim_undo
  2593.                 ;call ted_text_colored
  2594.                 stdcall ted_draw,edi
  2595.                 cmp ted_fun_draw_panel_buttons,0
  2596.                 je @f
  2597.                         call ted_fun_draw_panel_buttons
  2598.         @@:
  2599.         pop edi
  2600.         ret
  2601. endp
  2602.  
  2603. align 4
  2604. proc ted_but_find_next, edit:dword
  2605.         pushad
  2606.         mov edi,dword[edit]
  2607.  
  2608.         call ted_get_pos_by_cursor
  2609.         mov eax,ted_buffer_find
  2610.         mov bl,byte[eax]
  2611.         @@:
  2612.                 call ted_get_find_rezult
  2613.                 cmp bh,1
  2614.                 je @f ; find
  2615.                         call ted_iterat_next
  2616.                         cmp edx,ted_tex_1
  2617.                         jle @f
  2618.                         jmp @b
  2619.         @@:
  2620.         cmp bh,0
  2621.         je @f
  2622.                 call ted_get_text_coords
  2623.                 inc ebx ;move cursor right
  2624.                 mov ted_sel_x1,ebx
  2625.                 mov ted_sel_y1,eax
  2626.                 mov edx,eax
  2627.                 mov ecx,ebx
  2628.                 call ted_go_to_pos
  2629.                 mov edx,esi ;esi было установлео в ted_get_find_rezult
  2630.                 call ted_get_text_coords
  2631.                 mov ted_sel_x0,ebx
  2632.                 mov ted_sel_y0,eax
  2633.                 stdcall ted_draw,edi
  2634.                 jmp .end_find
  2635.         @@:
  2636.                 ;попадаем сюда если текст не найден
  2637.                 cmp ted_fun_find_err,0
  2638.                 je .end_find
  2639.                         call ted_fun_find_err ;пользовательская функция
  2640.         .end_find:
  2641.         popad
  2642.         ret
  2643. endp
  2644.  
  2645. ;input:
  2646. ; edi = pointer to tedit struct
  2647. align 4
  2648. ted_key_ctrl_home:
  2649.         mov ted_cur_x,0
  2650.         mov ted_cur_y,0
  2651.         push eax
  2652.                 mov eax,ted_scr_w
  2653.                 mov dword[eax+sb_offs_position],0
  2654.                 mov eax,ted_scr_h
  2655.                 mov dword[eax+sb_offs_position],0
  2656.         pop eax
  2657.         stdcall ted_draw,edi
  2658.         cmp ted_fun_draw_panel_buttons,0
  2659.         je @f
  2660.                 call ted_fun_draw_panel_buttons
  2661.         @@:
  2662.         ret
  2663.  
  2664. ;input:
  2665. ; edi = pointer to tedit struct
  2666. align 4
  2667. proc ted_sel_key_up
  2668.   cmp ted_drag_k,1
  2669.   je @f
  2670.     call ted_sel_start
  2671.     mov ted_drag_k,1
  2672.   @@:
  2673.   push dx
  2674.     call ted_cur_move_up
  2675.     cmp dl,8
  2676.     jne @f
  2677.       call ted_scroll_set_redraw
  2678.     @@:
  2679.   pop dx
  2680.   call ted_sel_move
  2681.   stdcall ted_draw,edi
  2682.   ret
  2683. endp
  2684.  
  2685. ;input:
  2686. ; edi = pointer to tedit struct
  2687. align 4
  2688. proc ted_sel_key_down
  2689.   cmp ted_drag_k,1
  2690.   je @f
  2691.     call ted_sel_start
  2692.     mov ted_drag_k,1
  2693.   @@:
  2694.   push dx
  2695.     call ted_cur_move_down
  2696.     cmp dl,8
  2697.     jne @f
  2698.       call ted_scroll_set_redraw
  2699.     @@:
  2700.   pop dx
  2701.   call ted_sel_move
  2702.   stdcall ted_draw,edi
  2703.   ret
  2704. endp
  2705.  
  2706. ;input:
  2707. ; edi = pointer to tedit struct
  2708. align 4
  2709. proc ted_sel_key_left
  2710.   cmp ted_drag_k,1
  2711.   je @f
  2712.     call ted_sel_start
  2713.   @@:
  2714.   push dx
  2715.     call ted_cur_move_left
  2716.     call ted_sel_move
  2717.     cmp ted_drag_k,1
  2718.     je @f
  2719.       mov ted_drag_k,1
  2720.       mov dl,8
  2721.     @@:
  2722.     cmp dl,8
  2723.     jne @f
  2724.       call ted_scroll_set_redraw
  2725.       stdcall ted_draw,edi
  2726.       jmp .end_f
  2727.     @@:
  2728.       stdcall ted_draw_cur_line,edi
  2729.     .end_f:
  2730.   pop dx
  2731.   ret
  2732. endp
  2733.  
  2734. ;input:
  2735. ; edi = pointer to tedit struct
  2736. align 4
  2737. proc ted_sel_key_right
  2738.   cmp ted_drag_k,1
  2739.   je @f
  2740.     call ted_sel_start
  2741.   @@:
  2742.   push dx
  2743.     call ted_cur_move_right
  2744.     call ted_sel_move
  2745.     cmp ted_drag_k,1
  2746.     je @f
  2747.       mov ted_drag_k,1
  2748.       mov dl,8
  2749.     @@:
  2750.     cmp dl,8
  2751.     jne @f
  2752.       call ted_scroll_set_redraw
  2753.       stdcall ted_draw,edi
  2754.       jmp .end_f
  2755.     @@:
  2756.       stdcall ted_draw_cur_line,edi
  2757.     .end_f:
  2758.   pop dx
  2759.   ret
  2760. endp
  2761.  
  2762. ;input:
  2763. ; edi = pointer to tedit struct
  2764. ;description:
  2765. ; this function need to optimize output
  2766. align 4
  2767. proc ted_draw_cursor_sumb
  2768.   pushad
  2769.  
  2770.   mov eax,13 ;rect
  2771.   mov ebx,ted_wnd_l
  2772.   add ebx,ted_rec_l
  2773.   mov edx,ted_cur_x
  2774.   imul edx,ted_rec_w
  2775.   add ebx,edx
  2776.   shl ebx,16
  2777.   add ebx,ted_rec_w
  2778.  
  2779.   mov ecx,ted_wnd_t ;calc rect -> y0,y1
  2780.   add ecx,ted_rec_t
  2781.   mov edx,ted_cur_y
  2782.   imul edx,ted_rec_h
  2783.   add ecx,edx
  2784.   shl ecx,16
  2785.   add ecx,ted_rec_h
  2786.  
  2787.   mov edx,ted_color_wnd_work
  2788.   push ecx
  2789.     call ted_sel_normalize
  2790.  
  2791.     mov esi,ted_scr_w
  2792.         mov ecx,dword[esi+sb_offs_position]
  2793.     sub ted_seln_y0,ecx
  2794.     sub ted_seln_y1,ecx
  2795.  
  2796.     mov ecx,ted_cur_y
  2797.     cmp ecx,ted_seln_y0
  2798.     jl .no_cur_sel
  2799.     cmp ecx,ted_seln_y1
  2800.     jg .no_cur_sel
  2801.     mov edx,ted_color_select ;меняем цвет фона на цвет выделения
  2802.    
  2803.     mov esi,ted_scr_h
  2804.         cmp ecx,ted_seln_y0
  2805.     jne @f
  2806.       mov ecx,ted_cur_x
  2807.       add ecx,dword[esi+sb_offs_position]
  2808.       cmp ecx,ted_seln_x0
  2809.       jge @f
  2810.       mov edx,ted_color_wnd_work
  2811.     @@:
  2812.  
  2813.     mov ecx,ted_cur_y
  2814.     cmp ecx,ted_seln_y1
  2815.     jne .no_cur_sel
  2816.       mov ecx,ted_cur_x
  2817.       add ecx,dword[esi+sb_offs_position]
  2818.       cmp ecx,ted_seln_x1
  2819.       jl .no_cur_sel
  2820.       mov edx,ted_color_wnd_work
  2821.  
  2822.     .no_cur_sel:
  2823.   pop ecx
  2824.   int 0x40 ;рисование прямоугольника
  2825.  
  2826.   call ted_get_pos_by_cursor ;берем позицию символа
  2827.   cmp ted_gp_opt,2
  2828.   jne @f
  2829.     mov eax,4
  2830.     mov esi,1
  2831.     ror ecx,16
  2832.     mov bx,cx
  2833.     add ebx,0x10001
  2834.     call ted_get_symb_color
  2835.     call ted_convert_invis_symb
  2836.     int 0x40 ;рисование символа
  2837.   @@:
  2838.  
  2839.   popad
  2840.   ret
  2841. endp
  2842.  
  2843. ;input:
  2844. ; edx -> pointer to text
  2845. ; edi -> указатель на структуру tedit
  2846. ;output:
  2847. ; ecx = color
  2848. ; if ted_mode_color=0 then ecx=ted_color_wnd_text
  2849. align 4
  2850. ted_get_symb_color:
  2851.   mov ecx,ted_color_wnd_text ;задаем цвет текста по умолчанию
  2852.  
  2853.   push eax edx
  2854.   cmp ted_mode_color,0
  2855.   je .exit
  2856.     jmp .on_first
  2857.     @@:
  2858.       call ted_iterat_perv
  2859.       cmp edx,ted_tex_1
  2860.       jle .exit
  2861.     .on_first:
  2862.       xor eax,eax
  2863.       mov al,byte[edx+1]
  2864.       cmp al,0 ;если al=0 то цвет не меняется
  2865.     je @b
  2866.  
  2867.     cmp eax,ted_colors_text_count
  2868.     jge .exit
  2869.  
  2870.     shl ax,2 ;умножаем индекс цвета на 4 байта
  2871.     mov ecx,ted_text_colors ;прибавляем смещение 1-го цвета
  2872.     add ecx,eax
  2873.     mov ecx,dword[ecx] ;устанавливаем текущий цвет текста по смещению
  2874.   .exit:
  2875.   pop edx eax
  2876.   ret
  2877.  
  2878. ;input:
  2879. ; edx = pointer to text
  2880. ; edi = pointer to tedit struct
  2881. ;description:
  2882. ; Функция преобразует невидимые символы в печатаемые на экране
  2883. align 4
  2884. ted_convert_invis_symb:
  2885.         cmp ted_mode_invis,1
  2886.         jne .end_f
  2887.                 cmp byte[edx],9
  2888.                 jne @f
  2889.                         lea edx,[ted_symbol_tab]
  2890.                 @@:
  2891.                 cmp byte[edx],13
  2892.                 jne @f
  2893.                         mov edx,edi
  2894.                         add edx,ted_offs_symbol_new_line
  2895.                 @@:
  2896.         .end_f:
  2897.         ret
  2898.  
  2899. ;input:
  2900. ; edi = pointer to tedit struct
  2901. align 4
  2902. ted_scroll_set_redraw:
  2903.         push eax
  2904.         mov eax,ted_scr_w
  2905.         mov dword[eax+sb_offs_redraw],1
  2906.         mov eax,ted_scr_h
  2907.         mov dword[eax+sb_offs_redraw],1
  2908.         pop eax
  2909.         ret
  2910.  
  2911. align 4
  2912. proc ted_draw, edit:dword
  2913.         locals
  2914.                 line_num dd ?
  2915.         endl
  2916.         pushad
  2917.         mov edi,dword[edit]
  2918.  
  2919.         mov eax,4 ;draw text
  2920.         mov ecx,ted_text_colors
  2921.         mov ecx,dword[ecx]
  2922.  
  2923.         mov ebx,ted_wnd_l
  2924.         add ebx,ted_rec_l
  2925.         shl ebx,16
  2926.         add ebx,ted_wnd_t
  2927.         add ebx,ted_rec_t
  2928.         add ebx,0x10001 ;добавляем отступы для выравнивания буквы по центру
  2929.  
  2930.         call ted_sel_normalize ;need before draw select
  2931.         mov esi,ted_scr_w
  2932.         mov esi,dword[esi+sb_offs_position]
  2933.         mov dword[line_num],esi
  2934.  
  2935.         stdcall ted_clear_line_before_draw, edi,ebx,1,esi
  2936.         call ted_get_first_visible_pos
  2937.         cmp edx,0
  2938.         je .no_draw_text
  2939.         mov esi,1 ;длинна выводимого текста по 1-му символу
  2940.         @@:
  2941.                 call ted_iterat_next
  2942.                 cmp edx,ted_tex_1
  2943.                 jle .no_draw_text
  2944.  
  2945.                 ; *** цветовая разметка
  2946.                 cmp ted_mode_color,0
  2947.                 je .no_col_change
  2948.                 cmp byte[edx+1],0
  2949.                 je .no_col_change
  2950.                         call ted_get_symb_color
  2951.                 .no_col_change:
  2952.  
  2953.                 cmp byte [edx],13
  2954.                 jne .no_13
  2955.                         cmp ted_mode_invis,1
  2956.                         jne .no_invis
  2957.                                 push edx
  2958.                                 mov edx,edi
  2959.                                 add edx,ted_offs_symbol_new_line
  2960.                                 int 0x40
  2961.                                 pop edx
  2962.                         .no_invis:
  2963.                         add ebx,ted_rec_h
  2964.                         ;optimized output \/
  2965.                         mov eax,ted_wnd_h
  2966.                         add eax,ted_wnd_t
  2967.                         cmp bx,ax
  2968.                         jg .no_draw_text
  2969.                         mov eax,4
  2970.                         ;optimized output /\        
  2971.                         and ebx,0xffff
  2972.                         ror ebx,16
  2973.                         add ebx,ted_wnd_l
  2974.                         add ebx,ted_rec_l
  2975.                         inc ebx
  2976.                         ror ebx,16
  2977.                         inc dword[line_num] ;increment line number
  2978.                         stdcall ted_clear_line_before_draw,edi,ebx,1,dword[line_num]
  2979.                         call ted_opt_draw_line_left
  2980.                         jmp @b
  2981.                 .no_13:
  2982.  
  2983.                 int 0x40
  2984.                 ror ebx,16
  2985.                 add ebx,ted_rec_w
  2986.                 mov esi,ted_wnd_l
  2987.                 add esi,ted_wnd_w
  2988.                 cmp bx,si
  2989.                 jl .no_opt
  2990.                         call ted_opt_draw_line_right
  2991.                 .no_opt:
  2992.                 mov si,1
  2993.                 ror ebx,16
  2994.                 jmp @b
  2995.         .no_draw_text:
  2996.  
  2997.         stdcall ted_clear_line_before_draw,edi,ebx,0,dword[line_num]
  2998.         call ted_draw_line_numbers
  2999.         call ted_draw_main_cursor
  3000.  
  3001. ;---------------------------------------------
  3002. ; set all_redraw flag for draw all ScrollBar
  3003. ; In some cases it is necessity to draw only the area
  3004. ; of moving of a "runner", for acceleration of output -
  3005. ; in this case the flag needs to be reset to 0 (zero).
  3006.         mov eax,ted_scr_h
  3007.         mov esi,ted_scr_w
  3008.         mov dword[eax+sb_offs_all_redraw],1
  3009.         mov dword[esi+sb_offs_all_redraw],1
  3010.  
  3011. ; рисование полос прокрутки
  3012.         stdcall scroll_bar_horizontal.draw,eax ;[scrollbar_hor_draw]
  3013.         stdcall scroll_bar_vertical.draw,esi ;[scrollbar_ver_draw]
  3014. ; reset all_redraw flag
  3015.         mov dword[eax+sb_offs_all_redraw],0
  3016.         mov dword[esi+sb_offs_all_redraw],0
  3017. ;---------------------------------------------
  3018.  
  3019.   ;left-bottom square
  3020.   mov ebx,ted_wnd_l
  3021.   shl ebx,16
  3022.   add ebx,ted_rec_l
  3023.   mov ecx,ted_wnd_t
  3024.   add ecx,ted_wnd_h
  3025.   shl ecx,16
  3026.   mov cx,word[eax+sb_offs_size_y]
  3027.   inc cx
  3028.   mov edx,ted_color_wnd_capt ;[sc.work]
  3029.   mov eax,13
  3030.   int 0x40
  3031.  
  3032.         ;right-bottom square
  3033.         mov ebx,ted_wnd_l
  3034.         add ebx,ted_wnd_w
  3035.         shl ebx,16
  3036.         mov bx,word[esi+sb_offs_size_x]
  3037.         inc bx
  3038.         int 0x40
  3039.  
  3040.         cmp ted_fun_draw_panel_find,0
  3041.         je @f
  3042.                 call ted_fun_draw_panel_find
  3043.         @@:
  3044.         cmp ted_fun_draw_panel_syntax,0
  3045.         je @f
  3046.                 call ted_fun_draw_panel_syntax
  3047.         @@:
  3048.         popad
  3049.         ret
  3050. endp
  3051.  
  3052. ;input:
  3053. ; edi = pointer to tedit struct
  3054. align 4
  3055. proc ted_draw_main_cursor
  3056.   pushad
  3057.  
  3058.   mov eax,13 ;draw cursor
  3059.   mov ecx,ted_wnd_t ;calc rect -> y0,y1
  3060.   add ecx,ted_rec_t
  3061.   mov edx,ted_cur_y
  3062.   imul edx,ted_rec_h
  3063.   add ecx,edx
  3064.  
  3065.   cmp ted_cur_ins,1 ;проверка режима работы курсора (обычный или вставка)
  3066.   jne @f
  3067.     mov edx,ted_rec_h
  3068.     inc edx   ;1->1, 3->2, 5->3, ...
  3069.     shr edx,1 ;edx = высота строки деленная на 2 (когда курсор не полный)
  3070.     add ecx,edx
  3071.   @@:
  3072.   shl ecx,16
  3073.   add ecx,ted_rec_h
  3074.   cmp ted_cur_ins,1
  3075.   jne @f
  3076.     shr cx,1 ;делим высоту курсора на 2
  3077.   @@:
  3078.  
  3079.   mov ebx,ted_wnd_l ;calc rect -> x0,x1
  3080.   add ebx,ted_rec_l
  3081.   mov edx,ted_cur_x
  3082.   imul edx,ted_rec_w
  3083.   add ebx,edx
  3084.   shl ebx,16
  3085.   add ebx,ted_rec_w
  3086.  
  3087.   mov edx,ted_color_cursor
  3088.   int 0x40 ;вывод курсора
  3089.  
  3090.   call ted_get_pos_by_cursor
  3091.   cmp ted_gp_opt,2
  3092.   jne @f
  3093.     mov eax,4 ;draw text
  3094.     mov esi,1
  3095.     ror ecx,16
  3096.     mov bx,cx
  3097.     add ebx,0x10001
  3098.     cmp ted_cur_ins,1
  3099.     jne .no_up_tetx
  3100.       mov ecx,ted_rec_h
  3101.       inc cx ; 1->1, 3->2, 5->3, ...
  3102.       shr cx,1
  3103.       sub bx,cx
  3104.     .no_up_tetx:
  3105.     mov ecx,ted_color_cur_text
  3106.     call ted_convert_invis_symb
  3107.     int 0x40
  3108.   @@:
  3109.  
  3110.   mov eax,4
  3111.   mov ebx,ted_wnd_l
  3112.   add ebx,ted_rec_l
  3113.   shl ebx,16
  3114.   add ebx,ted_wnd_t
  3115.   add ebx,3
  3116.   mov ecx,ted_color_wnd_bord
  3117.   or  ecx,0x80000000
  3118.   lea edx,[txtRow]
  3119.   int 0x40 ;вывод подписи 'Строка'
  3120.  
  3121.   add ebx,0x500000
  3122.   lea edx,[txtCol]
  3123.   int 0x40 ;вывод подписи 'Знак'
  3124.  
  3125.   cmp ted_tim_undo,0
  3126.   je @f
  3127.     add ebx,0x500000
  3128.     lea edx,[txtOtm]
  3129.     int 0x40
  3130.     sub ebx,0x500000
  3131.   @@:
  3132.  
  3133.   call ted_draw_buffer
  3134.   call ted_draw_help_f1
  3135.  
  3136.   mov eax,47 ;draw cursor coords
  3137.   mov esi,ted_color_wnd_bord
  3138.   or  esi,0x40000000
  3139.  
  3140.   mov edx,ebx
  3141.   ror edx,16
  3142.   sub edx,35
  3143.   ror edx,16
  3144.   ;add edx,3
  3145.   mov ebx,0x40000 ;Row=...
  3146.   mov ecx,ted_scr_w
  3147.   mov ecx,dword[ecx+sb_offs_position]
  3148.   add ecx,ted_cur_y
  3149.   inc ecx
  3150.  
  3151. push edi
  3152.   mov edi,ted_color_wnd_work
  3153.   int 0x40 ;вывод числа текущей строки
  3154. pop edi
  3155.  
  3156.   ;mov ebx,0x40000 ;Col=...
  3157.   mov ecx,ted_scr_h
  3158.   mov ecx,dword[ecx+sb_offs_position]
  3159.   add ecx,ted_cur_x
  3160.   inc ecx
  3161.   add edx,0x500000
  3162. push edi
  3163.   mov edi,ted_color_wnd_work
  3164.   int 0x40 ;вывод числа знаков
  3165. pop edi
  3166.  
  3167.   cmp ted_tim_undo,0
  3168.   je @f
  3169.     mov ecx,ted_tim_undo
  3170.     add edx,0x500000
  3171.         mov edi,ted_color_wnd_work ;портим регистр edi, но в конце функции это уже не важно
  3172.     int 0x40 ;вывод числа отмененных действий
  3173.   @@:
  3174.  
  3175.   popad
  3176.   ret
  3177. endp
  3178.  
  3179. ;input:
  3180. ; edi = pointer to tedit struct
  3181. proc ted_draw_buffer
  3182.         pushad
  3183.  
  3184.         mov eax,ted_buffer
  3185.         cmp byte[eax],0 ;смотрим 1-й символ из буфера
  3186.         je @f
  3187.                 mov ebx,ted_rec_l
  3188.                 add bx,300
  3189.                 cmp ebx,ted_wnd_w ;сравниваем координату для вывод текста
  3190.                 jge @f ;подпись не влазит в окно
  3191.  
  3192.                 add ebx,ted_wnd_l
  3193.                 shl ebx,16
  3194.                 add ebx,ted_wnd_t
  3195.                 add ebx,3
  3196.                 mov ecx,ted_color_wnd_bord
  3197.                 or ecx,0x40000000
  3198.  
  3199.                 mov edx,ted_buffer
  3200.                 mov esi,edx
  3201.                 mov edi,ted_color_wnd_work ;edi - destroy not pointer to tedit
  3202.                 call tl_strlen
  3203.                 ;cmp eax,0 ;буфер пуст
  3204.                 ;je @f
  3205.                 cmp eax,20
  3206.                 jle .crop_buf
  3207.                         mov eax,20 ;обрезка подписи до 20 символов
  3208.                 .crop_buf:
  3209.                 mov esi,eax
  3210.                 mov eax,4
  3211.                 int 0x40 ;вывод содержимого буфера
  3212.  
  3213.                 sub ebx,50 shl 16
  3214.                 lea edx,[txtBuf]
  3215.                 mov esi,edx
  3216.                 call tl_strlen
  3217.                 mov esi,eax
  3218.                 mov eax,4
  3219.                 xor ecx,0x40000000 ;убираем цвет фона
  3220.                 int 0x40 ;вывод подписи для буфера
  3221.         @@:
  3222.         popad
  3223.         ret
  3224. endp
  3225.  
  3226. ;input:
  3227. ; edi = pointer to tedit struct
  3228. align 4
  3229. proc ted_draw_help_f1
  3230.         pushad
  3231.         cmp ted_rec_t,13 ;минимальная высота для рисования справки
  3232.         jle @f
  3233.                 mov eax,13 ;clear place before draw help
  3234.                 mov ebx,ted_wnd_l
  3235.                 add ebx,ted_rec_l
  3236.                 shl ebx,16
  3237.                 add ebx,ted_wnd_w
  3238.                 sub ebx,ted_rec_l
  3239.                 mov ecx,ted_wnd_t
  3240.                 add ecx,13
  3241.                 shl ecx,16
  3242.                 add ecx,ted_rec_h
  3243.                 mov edx,ted_color_wnd_capt
  3244.                 int 0x40
  3245.  
  3246.         cmp ted_help_id,-1
  3247.         je @f
  3248.                 mov eax,ted_help_id
  3249.                 ColToIndexOffset eax,edx
  3250.  
  3251.                 ;SetCoordinates
  3252.                 mov ebx,ted_wnd_l
  3253.                 add ebx,ted_rec_l
  3254.                 shl ebx,16
  3255.                 add ebx,ted_wnd_t
  3256.                 add ebx,13 ;=3+10
  3257.  
  3258.                 ;SetTextColor
  3259.                 xor eax,eax
  3260.                 mov al,byte[edx+MAX_COLOR_WORD_LEN+6]
  3261.                 shl ax,2
  3262.                 mov ecx,ted_text_colors
  3263.                 add ecx,eax
  3264.                 mov ecx,dword[ecx]
  3265.                 or      ecx,0xc0000000 ;SetTextStyles
  3266.                 mov esi,edi
  3267.                         mov edi,ted_color_wnd_work
  3268.                         mov eax,4
  3269.                         int 0x40
  3270.                 mov edi,esi
  3271.  
  3272.                 ;*** draw help string ***
  3273.                 mov ecx,ted_color_wnd_bord
  3274.                 or ecx,0x80000000
  3275.                 mov edx,dword[edx+MAX_COLOR_WORD_LEN]
  3276.                 cmp edx,0
  3277.                 je @f
  3278.                         add edx,ted_help_text_f1
  3279.                         add ebx,0x500000
  3280.                         int 0x40
  3281.         @@:
  3282.         popad
  3283.         ret
  3284. endp
  3285.  
  3286. ;input:
  3287. ; edi = pointer to tedit struct
  3288. align 4
  3289. proc ted_draw_line_numbers
  3290.   pushad
  3291.  
  3292.   ;top panel with caption
  3293.   mov ebx,ted_wnd_l
  3294. ;  add ebx,ted_rec_l
  3295.   shl ebx,16
  3296.   add ebx,ted_wnd_w
  3297. ;  sub ebx,ted_rec_l
  3298.   mov edx,ted_color_wnd_work
  3299.   mov ecx,ted_wnd_t
  3300.   shl ecx,16
  3301.   add ecx,ted_rec_t
  3302.   mov eax,13
  3303.   mov edx,ted_color_wnd_capt
  3304.   int 0x40
  3305.  
  3306.   ;line numbers
  3307.   mov ebx,0x40000 ;format
  3308.   mov ecx,ted_scr_w
  3309.   mov ecx,dword[ecx+sb_offs_position]
  3310.   inc ecx
  3311.   mov edx,3
  3312.   add edx,ted_wnd_l
  3313.   rol edx,16
  3314.   add edx,ted_wnd_t
  3315.   add edx,ted_rec_t
  3316.   @@:
  3317.  
  3318. push ebx ecx edx
  3319.   ;left panel with numbers
  3320.   mov ebx,ted_wnd_l
  3321.   shl ebx,16
  3322.   add ebx,ted_rec_l
  3323.   mov ecx,ted_rec_h
  3324.   rol ecx,16
  3325.   mov cx,dx
  3326.   rol ecx,16
  3327.   mov eax,13
  3328.   mov edx,ted_color_wnd_capt
  3329.   int 0x40 ;рисуем прямоугольник под номером строки
  3330. pop edx ecx ebx
  3331.  
  3332.     mov eax,47
  3333.     mov esi,ted_color_wnd_bord
  3334.     int 0x40 ;рисуем номер строки
  3335.     inc ecx
  3336.     add edx,ted_rec_h
  3337.     sub edx,ted_wnd_t
  3338.         mov esi,edx
  3339.         and esi,0xffff
  3340.     cmp esi,ted_wnd_h
  3341.     jge @f
  3342.     add edx,ted_wnd_t
  3343.     jmp @b
  3344.   @@:
  3345.  
  3346.   popad
  3347.   ret
  3348. endp
  3349.  
  3350. ;output:
  3351. ; ah = symbol
  3352. align 4
  3353. proc KeyConvertToASCII, table:dword
  3354.   push ebx
  3355.   mov ebx,dword[table] ;convert scan to ascii
  3356.   ror ax,8
  3357.   xor ah,ah
  3358.   add bx,ax
  3359.   mov ah,byte[ebx]
  3360.   pop ebx
  3361.   ret
  3362. endp
  3363.  
  3364. align 4
  3365. proc ted_draw_cur_line, edit:dword
  3366.   pushad
  3367.     mov edi,dword[edit]
  3368.  
  3369.     mov ebx,ted_wnd_l
  3370.     add ebx,ted_rec_l
  3371.     shl ebx,16
  3372.     mov eax,ted_cur_y
  3373.     imul eax,ted_rec_h
  3374.         mov bx,ax
  3375.     add ebx,ted_wnd_t
  3376.     add ebx,ted_rec_t ;ebx - координаты для прямоугольника очистки линии
  3377.         add ebx,0x10001   ;добавляем отступы для выравнивания буквы по центру
  3378.  
  3379.     call ted_sel_normalize ;need before draw select
  3380.         mov ecx,ted_cur_y
  3381.         mov eax,ted_scr_w
  3382.     add ecx,dword[eax+sb_offs_position]
  3383.     stdcall ted_clear_line_before_draw,edi,ebx,1,ecx
  3384.  
  3385.     mov eax,ted_scr_h
  3386.         mov esi,dword[eax+sb_offs_position]
  3387.     call ted_get_pos_by_coords
  3388.  
  3389.   cmp ted_gp_opt,2
  3390.   jne .no_draw_text
  3391. ;  mov eax,4 ;draw text
  3392.   call ted_get_symb_color
  3393.   mov esi,1 ;draw 1 symbol
  3394.   @@:
  3395.     ;call ted_iterat_next
  3396.     cmp edx,ted_tex_1
  3397.     jle .no_draw_text
  3398.  
  3399.     ; *** цветовая разметка
  3400.     cmp ted_mode_color,0
  3401.     je .no_col_change
  3402.     cmp byte[edx+1],0
  3403.     je .no_col_change
  3404.       call ted_get_symb_color
  3405.     .no_col_change:
  3406.  
  3407.     mov eax,4 ;draw text
  3408.     cmp byte [edx],13
  3409.     jne .no_13
  3410.       cmp ted_mode_invis,1
  3411.       jne .no_draw_text
  3412.  push edx
  3413.  mov edx,edi
  3414.  add edx,ted_offs_symbol_new_line
  3415.  int 0x40
  3416.  pop edx
  3417.       jmp .no_draw_text
  3418.     .no_13:
  3419.  
  3420.     int 0x40
  3421.     ror ebx,16
  3422.     add ebx,ted_rec_w
  3423.     mov eax,ted_wnd_w
  3424.     add eax,ted_wnd_l ;ax = отступ по оси x
  3425.     cmp bx,ax
  3426.     jge .no_draw_text ;Opt
  3427.     ror ebx,16
  3428.     call ted_iterat_next
  3429.     jmp @b
  3430.   .no_draw_text:
  3431.  
  3432.   call ted_draw_main_cursor
  3433.   popad
  3434.   ret
  3435. endp
  3436.  
  3437. ;input:
  3438. ; eax - text need find
  3439. ; bl - first symbol to find
  3440. ; edx - first symbol pointer
  3441. ; edi - pointer to tedit struct
  3442. ;output:
  3443. ; bh - rezult
  3444. ; edx - last text position (if find sucess)
  3445. ; esi - first symbol pointer
  3446. ;description:
  3447. ; Функция проверяет совпадает ли текст в буфере eax
  3448. ; с текстом редактора по указателю edx.
  3449. ; Стандартные функции (напр. strcmp) тут не подойдут, потому что
  3450. ; в памяти редактора текст содержится не в виде ascii строк.
  3451. align 4
  3452. ted_get_find_rezult:
  3453.   push eax
  3454.     mov bh,1
  3455.     mov esi,edx ;copy edx
  3456.     @@:
  3457.       cmp byte[edx],bl
  3458.       jne .no_text
  3459.  
  3460.       inc eax ;*** get next symbol (in find text) ***
  3461.       mov bl,byte[eax]
  3462.       cmp bl,0
  3463.       je @f ;end of find text
  3464.  
  3465.       call ted_iterat_next ;*** get next symbol (in editor text) ***
  3466.       cmp edx,ted_tex_1
  3467.       jle @f ;end of editor text
  3468.  
  3469.       jmp @b
  3470.       .no_text:
  3471.         xor bh,bh
  3472.         mov edx,esi ;restore edx
  3473.     @@:
  3474.   pop eax
  3475.   mov bl,byte[eax] ;restore bl
  3476.   ret
  3477.  
  3478. ;input:
  3479. ;  clear_o - если =1 очистить одну строку, =0 очистить все строки окна до низу
  3480. align 4
  3481. proc ted_clear_line_before_draw, edit:dword, coords:dword, clear_o:dword, numb_lin:dword
  3482.         pushad
  3483.         mov edi,dword[edit]
  3484.         mov ebx,dword[coords]   ;ebx = x*2^16+y coords to left up point clear line
  3485.         mov esi,dword[numb_lin] ;esi - number text line
  3486.  
  3487.         sub ebx,0x10001 ;отнимаем отступы для выравнивания буквы по центру
  3488.         cmp dword[clear_o],0
  3489.         jne @f
  3490.                 add ebx,ted_rec_h
  3491.                 inc esi
  3492.                 ror ebx,16
  3493.                 xor bx,bx
  3494.                 add ebx,ted_wnd_l
  3495.                 add ebx,ted_rec_l ;bx = ted_wnd_l+ted_rec_l
  3496.                 ror ebx,16
  3497.         @@:
  3498.  
  3499.         mov eax,ted_wnd_h
  3500.         add eax,ted_wnd_t
  3501.         cmp ax,bx
  3502.         jl .no_clear
  3503.         sub ax,bx
  3504.  
  3505.         mov cx,bx
  3506.         shl ecx,16
  3507.  
  3508.         xor bx,bx
  3509.         add ebx,ted_wnd_w
  3510.         sub ebx,ted_rec_l
  3511.         xor cx,cx
  3512.         add ecx,ted_rec_h
  3513.         mov edx,ted_color_wnd_work
  3514.  
  3515.         cmp dword[clear_o],0
  3516.         je .pusto
  3517.         cmp ax,cx
  3518.         jge @f
  3519.         .pusto:
  3520.                 mov cx,ax
  3521.         @@:
  3522.  
  3523.         call ted_is_select
  3524.         cmp al,0
  3525.         je @f
  3526.         cmp ted_seln_y0,esi
  3527.         jg @f
  3528.         cmp ted_seln_y1,esi
  3529.         jl @f
  3530.                 mov edx,ted_color_select ;draw selected line
  3531.         @@:
  3532.  
  3533.         mov eax,13 ;rect
  3534.         int 0x40
  3535.  
  3536.         call ted_is_select
  3537.         cmp al,0
  3538.         je .no_clear
  3539.  
  3540.         mov al,13 ;rect
  3541.         xor cx,cx
  3542.         add ecx,ted_rec_h
  3543.         cmp ted_seln_y0,esi
  3544.         jne @f
  3545.                 push bx esi
  3546.                 mov edx,ted_seln_x0 ; верхняя полоса (затирает слева)
  3547.                 mov esi,ted_scr_h
  3548.                 cmp edx,dword[esi+sb_offs_position]
  3549.                 jle .in_wnd
  3550.                         sub edx,dword[esi+sb_offs_position]
  3551.                         imul edx,ted_rec_w
  3552.                         mov bx,dx
  3553.                         jmp .no_wnd
  3554.                 .in_wnd:
  3555.                 mov bx,0
  3556.                 .no_wnd:
  3557.                 mov edx,ted_color_wnd_work
  3558.                 int 0x40
  3559.                 pop esi bx
  3560.         @@:
  3561.         cmp ted_seln_y1,esi
  3562.         jne @f
  3563.                 push esi
  3564.                 mov edx,ted_seln_x1 ; нижняя полоса (затирает справа)
  3565.                 mov esi,ted_scr_h
  3566.                 cmp edx,dword[esi+sb_offs_position]
  3567.                 jle .in_wnd2
  3568.                         sub edx,dword[esi+sb_offs_position]
  3569.                         imul edx,ted_rec_w
  3570.                         sub bx,dx
  3571.                         shl edx,16
  3572.                         add ebx,edx
  3573.                 .in_wnd2:
  3574.  
  3575.                 mov edx,ted_color_wnd_work
  3576.                 int 0x40
  3577.                 pop esi
  3578.         @@:
  3579.  
  3580.         .no_clear:
  3581.         popad
  3582.         ret
  3583. endp
  3584.  
  3585. ;input:
  3586. ; edi = pointer to tedit struct
  3587. ;output:
  3588. ; ecx = новый цвет символа
  3589. ; edx = pointer to symbol
  3590. ; edx = 0 if text not in screen
  3591. align 4
  3592. ted_get_first_visible_pos:
  3593.         push eax ecx
  3594.         mov eax,ted_scr_w
  3595.         mov edx,ted_tex
  3596.         xor ecx,ecx
  3597.         @@:
  3598.                 cmp ecx,dword[eax+sb_offs_position]
  3599.                 je @f
  3600.                 call ted_iterat_next
  3601.                 cmp edx,ted_tex_1
  3602.                 jle @f
  3603.                 cmp byte [edx],13
  3604.                 jne @b
  3605.                 inc ecx
  3606.                 jmp @b
  3607.         @@:
  3608.  
  3609.         cmp ecx,dword[eax+sb_offs_position]
  3610.         je @f
  3611.                 xor edx,edx
  3612.         @@:
  3613.         cmp ecx,dword[eax+sb_offs_max_area]
  3614.         jle @f
  3615.                 mov dword[eax+sb_offs_max_area],ecx
  3616.         @@:
  3617.         pop ecx eax
  3618.         call ted_opt_draw_line_left
  3619.         ret
  3620.  
  3621. ;input:
  3622. ; edx = pointer to symbol
  3623. ; edi = pointer to tedit struct
  3624. ;output:
  3625. ; ecx = цвет символа
  3626. ; edx = указатель на первый левый символ
  3627. ;description:
  3628. ; функция нужна для оптимизации вывода текста
  3629. align 4
  3630. proc ted_opt_draw_line_left
  3631.   push ebx
  3632.  
  3633.   mov ebx,ted_scr_h
  3634.   mov ebx,dword[ebx+sb_offs_position]
  3635.   cmp ebx,0
  3636.   je .ret_f
  3637.   push eax
  3638.   mov eax,edx
  3639.  
  3640.   cmp edx,ted_tex
  3641.   jne @f
  3642.     call ted_iterat_next
  3643.     jmp .beg_cycle
  3644.   @@:
  3645.  
  3646.   cmp ebx,0
  3647.   je @f
  3648.  
  3649.   cmp byte[edx],13
  3650.   jne @f
  3651.     call ted_iterat_next
  3652.     .beg_cycle:
  3653.   @@:
  3654.     cmp edx,ted_tex_1
  3655.     jle @f
  3656.     cmp byte[edx],13
  3657.     je @f
  3658.     cmp ebx,0
  3659.     je @f
  3660. ;--------------------------------------
  3661. xor eax,eax ;eax будет меняться
  3662. mov al,byte[edx+1]
  3663. cmp al,0
  3664. je .no_color
  3665. cmp eax,ted_colors_text_count
  3666. jge .no_color
  3667.   xor ecx,ecx
  3668.   mov cl,byte[edx+1]
  3669.   shl cx,2
  3670.   add ecx,ted_text_colors
  3671.   mov ecx,dword[ecx]
  3672. .no_color:
  3673. ;--------------------------------------
  3674.     mov eax,edx
  3675.     call ted_iterat_next
  3676.     dec ebx
  3677.     jmp @b
  3678.   @@:
  3679.     mov edx,eax
  3680.   pop eax
  3681.   .ret_f:
  3682.   call ted_get_symb_color
  3683.   pop ebx
  3684.   ret
  3685. endp
  3686.  
  3687. ;input:
  3688. ; edx = pointer to symbol
  3689. ; edi = pointer to tedit struct
  3690. ;output:
  3691. ; ecx = symbol color
  3692. ; edx = pointer to 13 symbol
  3693. ;description:
  3694. ; функция нужна для оптимизации вывода текста
  3695. align 4
  3696. proc ted_opt_draw_line_right
  3697.         push eax
  3698.         mov eax,edx
  3699.         @@:
  3700.                 cmp edx,ted_tex_1
  3701.                 jle @f
  3702.                 cmp byte[edx],13
  3703.                 je @f
  3704.                 mov eax,edx
  3705.                 call ted_iterat_next
  3706.                 jmp @b
  3707.         @@:
  3708.         mov edx,eax ;perv sumbol
  3709.         call ted_get_symb_color
  3710.  
  3711.         pop eax
  3712.         ret
  3713. endp
  3714.  
  3715. align 4
  3716. proc ted_mouse, edit:dword
  3717.         pushad
  3718.         mov edi,dword[edit]
  3719.  
  3720.         ;обрабатываем скроллинги
  3721.         mov edx,ted_scr_h
  3722.         mov ecx,ted_scr_w
  3723.  
  3724.         cmp word[edx+sb_offs_delta2],0
  3725.         jne .horizontal
  3726.  
  3727.         mov eax,dword[ecx+sb_offs_max_area]
  3728.         cmp eax,dword[ecx+sb_offs_cur_area]
  3729.         jbe .horizontal
  3730.         ; mouse event for Vertical ScrollBar
  3731.         stdcall scroll_bar_vertical.mouse,ecx ;[scrollbar_ver_mouse]
  3732.         cmp dword[ecx+sb_offs_redraw],0
  3733.         je @f
  3734.                 mov dword[ecx+sb_offs_redraw],0
  3735.                 stdcall ted_draw,edi
  3736.                 jmp .no_in_wnd
  3737.         @@:
  3738.         cmp word[ecx+sb_offs_delta2],0
  3739.         jne .no_in_wnd
  3740.         .horizontal:
  3741.         mov eax,dword[edx+sb_offs_max_area]
  3742.         cmp eax,dword[edx+sb_offs_cur_area]
  3743.         jbe .other
  3744.         ; mouse event for Horizontal ScrollBar
  3745.         stdcall scroll_bar_horizontal.mouse,edx ;[scrollbar_hor_mouse]
  3746.         cmp dword[edx+sb_offs_redraw],0
  3747.         je .other
  3748.                 mov dword[edx+sb_offs_redraw],0
  3749.                 stdcall ted_draw,edi
  3750.                 jmp .no_in_wnd
  3751.         .other:
  3752.         cmp word[ecx+sb_offs_delta2],0
  3753.         jne .no_in_wnd
  3754.         cmp word[edx+sb_offs_delta2],0
  3755.         jne .no_in_wnd
  3756.  
  3757.         ;обрабатываем окно редактора
  3758.         mcall 37,2 ;get mouse buttons
  3759.         cmp al,1
  3760.         jne @f
  3761.                 mcall 37,1 ;get mouse coords
  3762.                 mov ebx,ted_wnd_t
  3763.                 add ebx,ted_rec_t
  3764.                 cmp ax,bx
  3765.                 jl @f ;y_mouse<y_wnd
  3766.  
  3767.                 sub ebx,ted_rec_t
  3768.                 add ebx,ted_wnd_h
  3769.                 cmp bx,ax
  3770.                 jl @f ;y_mouse>y_wnd
  3771.  
  3772.                 mov ebx,ted_wnd_l
  3773.                 add ebx,ted_rec_l
  3774.                 mov ecx,eax
  3775.                 shr ecx,16
  3776.                 cmp cx,bx
  3777.                 jl @f ;x_mouse<x_wnd
  3778.  
  3779.                 sub ebx,ted_rec_l
  3780.                 add ebx,ted_wnd_w
  3781.                 cmp bx,cx
  3782.                 jl @f ;x_mouse>x_wnd
  3783.  
  3784.                 call ted_draw_cursor_sumb
  3785.                 call ted_wnd_main_click
  3786.                 jmp .no_in_wnd
  3787.         @@:
  3788.         mov edx,ted_el_focus
  3789.         cmp dword[edx],edi
  3790.         jne @f
  3791.                 call ted_wnd_main_mouse_scroll ;смотрим на прокрутку колеса мыши
  3792.         @@:
  3793.         cmp ted_drag_m,0
  3794.         je .no_in_wnd
  3795.                 mov ted_drag_m,0
  3796.                 stdcall ted_draw,edi
  3797.                 cmp ted_fun_draw_panel_buttons,0
  3798.                 je .no_in_wnd
  3799.                         call ted_fun_draw_panel_buttons
  3800.         .no_in_wnd:
  3801.         popad
  3802.         ret
  3803. endp
  3804.  
  3805. ;input:
  3806. ; eax -> (x,y)
  3807. ; edi -> указатель на структуру tedit
  3808. ;description:
  3809. ; функция вызывется при нажатии кнопкой мыши и попадении курсором в окно редактора
  3810. align 4
  3811. ted_wnd_main_click:
  3812.         push ebx ecx edx
  3813.         mov ebx,ted_el_focus
  3814.         mov dword[ebx],edi ;ставим фокус
  3815.  
  3816.   push eax
  3817.     shr eax,16
  3818.     and eax,0xffff
  3819.     sub eax,ted_wnd_l
  3820.     sub eax,ted_rec_l
  3821.  
  3822.     xor edx,edx
  3823.     mov ecx,ted_rec_w
  3824.     div cx
  3825.     ;inc eax
  3826.         mov ebx,ted_scr_h
  3827.     cmp eax,dword[ebx+sb_offs_cur_area]
  3828.     jle @f
  3829.       mov eax,dword[ebx+sb_offs_cur_area]
  3830.     @@:
  3831.     ;dec eax
  3832.     mov ted_cur_x,eax
  3833.   pop eax
  3834.  
  3835.   push eax
  3836.     and eax,0xffff
  3837.     sub eax,ted_wnd_t
  3838.     sub eax,ted_rec_t
  3839.  
  3840.     xor edx,edx
  3841.     mov ecx,ted_rec_h
  3842.     div cx
  3843.     inc eax
  3844.         mov ebx,ted_scr_w
  3845.     cmp eax,dword[ebx+sb_offs_cur_area]
  3846.     jle @f
  3847.       mov eax,dword[ebx+sb_offs_cur_area]
  3848.     @@:
  3849.     dec eax
  3850.     mov ted_cur_y,eax
  3851.   pop eax
  3852.  
  3853.         cmp ted_drag_m,0
  3854.         je @f
  3855.                 call ted_sel_move
  3856.                 jmp .sel_move
  3857.         @@:
  3858.                 mov ted_drag_m,1
  3859.                 call ted_sel_start
  3860.         .sel_move:
  3861.         pop edx ecx ebx
  3862.         ret
  3863.  
  3864. ;input:
  3865. ; edi = pointer to tedit struct
  3866. align 4
  3867. ted_wnd_main_mouse_scroll:
  3868.         push eax ebx ecx
  3869.         mcall 37,7 ;прокрутка колеса мыши
  3870.         cmp ax,0
  3871.         je .no_scroll
  3872.                 mov ecx,ted_scr_w
  3873.                 mov ebx,dword[ecx+sb_offs_position] ;copy old scroll position
  3874.                 and eax,0xffff
  3875.                 btr ax,15
  3876.                 jae @f
  3877.                         or eax,0xffff8000
  3878.                 @@:
  3879.                 add dword[ecx+sb_offs_position],eax
  3880.  
  3881.                 mov eax,[ecx+sb_offs_position]
  3882.                 cmp eax,[ecx+sb_offs_max_area]
  3883.                 jb @f
  3884.                         mov dword[ecx+sb_offs_position],ebx ;if scroll position out of range
  3885.                         jmp .no_scroll
  3886.                 @@:
  3887.                 stdcall ted_draw,edi
  3888.         .no_scroll:
  3889.         pop ecx ebx eax
  3890.         ret
  3891.  
  3892. align 4
  3893. proc ted_but_save_file, edit:dword, file:dword, f_name:dword
  3894.   pushad
  3895.   mov edi,dword[edit]
  3896.  
  3897.   stdcall ted_can_save,edi
  3898.   cmp al,0
  3899.   je .no_save
  3900.  
  3901.   mov ecx,ted_max_chars
  3902.   call mem_Alloc
  3903.   push eax ;запоминаем указатель на выделенную память
  3904.  
  3905.   mov edx,ted_tex
  3906.   xor ecx,ecx
  3907.   @@:
  3908.     call ted_iterat_next
  3909.     cmp edx,ted_tex_1
  3910.     jle @f ;edx = ted_tex or edx = ted_tex+sizeof.symbol
  3911.     mov bl,[edx]
  3912.     mov byte[eax],bl
  3913.     inc eax
  3914.     inc ecx
  3915.     jmp @b
  3916.   @@:
  3917.  
  3918.   cmp ecx,0
  3919.   je @f
  3920.     mov ebx,dword[file]
  3921.     pop eax ;записываем указатель на выделенную память
  3922.     mov dword[ebx+16],eax
  3923.     push eax ;обратно запоминаем указатель на выделенную память
  3924.     mov eax,70
  3925.     mov dword[ebx], 2
  3926.     mov dword[ebx+4], 0
  3927.     mov dword[ebx+8], 0
  3928.     mov dword[ebx+12], ecx
  3929.     mov  byte[ebx+20], 0
  3930.     push dword[f_name]
  3931.     pop dword[ebx+21]
  3932.     int 0x40
  3933.  
  3934.     mov ted_err_save,al
  3935.  
  3936.     cmp eax,0
  3937.     je .no_msg
  3938. ;    cmp eax,6
  3939. ;    je @f
  3940.       cmp ax,10
  3941.       jl .zifra_0_9
  3942.         mov al,'?'
  3943.         sub ax,48
  3944.       .zifra_0_9:
  3945.       add ax,48
  3946. cmp ted_fun_save_err,0
  3947. je @f
  3948. call ted_fun_save_err
  3949.       jmp @f
  3950.     .no_msg:
  3951.     m2m ted_tim_ls,ted_tim_ch
  3952.   @@:
  3953.  
  3954.   pop ecx ;записываем указатель на выделенную память
  3955.   call mem_Free
  3956.   .no_save:
  3957.   popad
  3958.   ret
  3959. endp
  3960. }