Subversion Repositories Kolibri OS

Rev

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

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