Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

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