Subversion Repositories Kolibri OS

Rev

Rev 1343 | Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. struct f70
  2.   func_n dd ?
  3.   param1 dd ?
  4.   param2 dd ?
  5.   param3 dd ?
  6.   param4 dd ?
  7.   rezerv db ?
  8.   name dd ?
  9. ends
  10.  
  11. struct TexSelect
  12.   x0 dd ?
  13.   y0 dd ?
  14.   x1 dd ?
  15.   y1 dd ?
  16. ends
  17.  
  18. struct TexColViv
  19.   Text rb MAX_COLOR_WORD_LEN; // ñëîâî
  20.   f1 dd 0
  21.   wwo db ? ; whole words only
  22.   endc db ? ; ñèìâîë êîíöà âûäåëåíèÿ (wwo&4)
  23.   color db ? ; íîìåð öâåòà
  24. ends
  25.  
  26. struct symbol
  27.   c db ?    ;  +0 ñèìâîë
  28.   col db ?  ;  +1 öâåò
  29.   perv dd ? ;  +2
  30.   next dd ? ;  +6 óêàçàòåëè
  31.   tc dd ?   ; +10 âðåì. ñîçäàíèÿ
  32.   td dd ?   ; +14 âðåì. óäàëåíèÿ
  33. ends
  34.  
  35. ColColor dd 1
  36. ColWords dd 0
  37. CURSOR_COLOR dd 0x808080
  38. WND_CAPT_COLOR dd 0x80
  39. WND_WORK_COLOR dd 0x0
  40. WND_BORD_COLOR dd 0xd0d0d0
  41. SELECT_COLOR dd 0x208080
  42. CUR_TEXT_COLOR dd 0xff0000
  43. WND_TEXT_COLOR dd 0xffff00
  44.  
  45. options_file dd 0
  46. options_file_end dd 0
  47. tex_colors dd 0
  48. tex_help_f1 dd 0
  49.  
  50. FkPos: rd 256
  51. Col dd 0 ;óêàçàòåëü íà ñòðóêòóðû êëþ÷åâûõ ñëîâ TexColViv
  52.  
  53. conv_tabl rb 128 ; òàáëèöà äëÿ êîíâåðòèðîâàíèÿ scan-êîäà â ascii-êîä
  54. keyUpr dd 0
  55. err_opn db 0 ;îøèáêà îòêðûòèÿ ôàéëà
  56. err_sav db 0 ;îøèáêà ñîõðàíåíèÿ ôàéëà
  57. panel_id db 0 ;íîìåð îòêðûòîé ïàíåëè
  58.  
  59. ch_tim   dd ? ; êîëè÷åñòâî èçìåíåíèé â ôàéëå
  60. ls_tim   dd ? ; âðåìÿ ïîñëåäíåãî ñîõðàíåíèÿ
  61. co_tim   dd ? ; âðåìÿ ïîñëåäíåé öâåòîâîé ðàçìåòêè
  62. tim_Undo dd ? ; êîëè÷åñòâî îòìåíåííûõ äåéñòâèé
  63. gpOpt db 0
  64. mode_colored db 1 ; ðåæèì âûäåëåíèÿ ñëîâ öâåòîì (0-âûêë. 1-âêë.)
  65.  
  66. key_new db 0 ; ñèìâîë, êîòîðûé áóäåò äîáàâëÿòñÿ ñ êëàâèàòóðû
  67. tex     dd 0 ;text memory pointer
  68. tex_1   dd 0 ;text first symbol pointer
  69. tex_end dd 0 ;text end memory pointer
  70.  
  71. hed db 'TextEditor 05.02.10',0 ;ïîäïèñü îêíà
  72. sc system_colors
  73.  
  74. wndMain BOX 0,50,440,150
  75. recMain BOX 30,23,7,10
  76.  
  77. curMod db 1
  78. cur_x dd 0
  79. cur_y dd 0
  80. invis db 0 ;ðåæèì ïîêàçà íåïå÷àòàåìûõ ñèìâîëîâ
  81. symbol_new_line db 20 ;ñèìâîë çàâåðøåíèÿ ñòðîêè
  82. dragm db 0 ;âûäåëåíèå îò ìûøè
  83. dragk db 0 ;âûäåëåíèå îò êëàâèàòóðû
  84. sel TexSelect 0,0,0,0 ;ñòðóêòóðà âûäåëåíèÿ
  85. seln TexSelect ;äîïîëíèòåëüíàÿ ñòðóêòóðà âûäåëåíèÿ
  86. help_id dd -1  ;èäåíòèôèêàòîð äëÿ ñïðàâêè
  87.  
  88. fn_icon db 'te_icon.bmp',0
  89. bmp_icon dd 0
  90. run_file_70 f70          
  91.  
  92.  
  93. ;input:
  94. ; reg = index
  95. ;output:
  96. ; reg = pointer to 'tex' struct
  97. macro ConvertIndexToPointer reg {
  98.   imul reg,sizeof.symbol
  99.   add reg,[tex]
  100. }
  101.  
  102.  
  103. ;output:
  104. ; al = 1 - can save
  105. CanSave:
  106.   push ecx
  107.   mov ecx,[ch_tim]
  108.   sub ecx,[tim_Undo]
  109.   mov al,1
  110.   cmp [ls_tim],ecx
  111.   jne @f
  112.     dec al
  113.   @@:
  114.   pop ecx
  115.   ret
  116.  
  117.  
  118. ;output:
  119. ; al = 1 - selected
  120. IsSel:
  121.   push ebx
  122.   xor al,al
  123.   cmp [dragm],1
  124.   je @f
  125.     mov al,1
  126.     mov ebx,[sel.x0]
  127.     cmp ebx,[sel.x1]
  128.     jne @f
  129.     mov ebx,[sel.y0]
  130.     cmp ebx,[sel.y1]
  131.     jne @f
  132.     xor al,al
  133.   @@:
  134.   pop ebx
  135.   ret
  136.  
  137. SelNormalize:
  138.   push ecx esi edi
  139.     mov esi,sel
  140.     mov edi,seln
  141.     mov ecx,sizeof.TexSelect
  142.     rep movsb
  143.  
  144.     jmp @f
  145.     .swp_f:
  146.       mov ecx,[seln.x0]
  147.       m2m [seln.x0],[seln.x1]
  148.       mov [seln.x1],ecx
  149.  
  150.       mov ecx,[seln.y0]
  151.       cmp ecx,[seln.y1] ;(sel.y0>sel.y1)
  152.       jle .end_f
  153.       m2m [seln.y0],[seln.y1]
  154.       mov [seln.y1],ecx
  155.  
  156.     jmp .end_f
  157.     @@:
  158.  
  159.     mov ecx,[seln.y0]
  160.     cmp ecx,[seln.y1] ;(sel.y0>sel.y1)
  161.     jg .swp_f
  162.  
  163.     cmp ecx,[seln.y1] ;(sel.y0==sel.y1)
  164.     jne .end_f
  165.       mov ecx,[seln.x0]
  166.       cmp ecx,[seln.x1] ;(sel.x0>sel.x1)
  167.       jg .swp_f
  168.  
  169.     .end_f:
  170.   pop edi esi ecx
  171.   ret
  172.  
  173. SelStart:
  174.   push ecx
  175.     mov ecx,[cur_x]
  176.     add ecx,[hScr.position]
  177.     mov [sel.x0],ecx
  178.     mov [sel.x1],ecx
  179.  
  180.     mov ecx,[cur_y]
  181.     add ecx,[wScr.position]
  182.     mov [sel.y0],ecx
  183.     mov [sel.y1],ecx
  184.   pop ecx
  185.   ret
  186.  
  187. align 4
  188. SelMove:
  189.   push ecx
  190.     mov ecx,[cur_x]
  191.     add ecx,[hScr.position]
  192.     mov [sel.x1],ecx
  193.  
  194.     mov ecx,[cur_y]
  195.     add ecx,[wScr.position]
  196.     mov [sel.y1],ecx
  197.   pop ecx
  198.   call draw_but_toolbar ;redraw toolbar (need to button Copy)
  199.   ret
  200.  
  201. ;input:
  202. ; al = 1 - clear all memory
  203. Clear:
  204.   mov [cur_x],0
  205.   mov [cur_y],0
  206.   mov [ch_tim],0
  207.   mov [ls_tim],0
  208.   mov [co_tim],0
  209.   mov [tim_Undo],0
  210.   mov [help_id],-1
  211.  
  212.   mov [wScr.position],0
  213.   mov [wScr.max_area],100
  214.   mov [wScr.redraw],1
  215.   mov [hScr.position],0
  216.   mov [hScr.max_area],100
  217.  
  218.   mov [sel.x0],0
  219.   mov [sel.y0],0
  220.   mov [sel.x1],0
  221.   mov [sel.y1],0
  222.  
  223.   cmp al,0
  224.   je .exit
  225.  
  226.   push ecx edx
  227.   mov ecx,sizeof.symbol*maxChars
  228.   mov edx,[tex]
  229.   @@:
  230.     mov byte [edx],0
  231.     inc edx
  232.   loop @b
  233.   mov edx,[tex]
  234.   mov dword [edx+6],1
  235.   pop edx ecx
  236.  
  237.   .exit:
  238.   ret
  239.  
  240.  
  241. ;--- out_reg = Col[keyw[ind_reg]].Text[0] ---
  242. macro ColToIndexOffset ind_reg,out_reg {
  243.   mov out_reg,ind_reg
  244.   imul out_reg,sizeof.TexColViv
  245.   add out_reg,[Col]
  246. }
  247.  
  248.  
  249.  
  250. InitColText:
  251.   push eax ebx ecx esi edi
  252.  
  253.   mov  ebx,dword[fn_col_option]
  254.   copy_path ebx,fn_syntax_dir,file_name_rez,0x0
  255.   copy_path file_name_rez,sys_path,file_name,0x0
  256.  
  257.   mov eax,70
  258.   mov [run_file_70.func_n], 0
  259.   mov [run_file_70.param1], 0
  260.   mov [run_file_70.param2], 0
  261.   mov ebx,[options_file_end]
  262.   sub ebx,[options_file]
  263.   mov [run_file_70.param3], ebx
  264.   m2m [run_file_70.param4], [options_file]
  265.   mov [run_file_70.rezerv], 0
  266.   mov [run_file_70.name], file_name
  267.   mov ebx,run_file_70
  268.   int 0x40
  269.  
  270.   mov ecx,0x100
  271.   mov edi,FkPos
  272.   @@:
  273.     mov dword[edi],-1
  274.     add edi,4
  275.   loop @b
  276.  
  277.   ;init: ColColor, ColWords, ...
  278.   mov dword[ColColor],1
  279.   mov dword[ColWords],0
  280.     mov dword[tex_help_f1],0
  281.   mov [help_id],-1 ;èäåíòèôèêàòîð ñëîâà äëÿ ñïðàâêè
  282.  
  283.   cmp eax,6
  284.   je @f
  285.   cmp eax,0
  286.   je @f
  287.     cmp ax,10
  288.     jl .zifra_0_9
  289.       mov al,'?'
  290.       sub ax,48
  291.     .zifra_0_9:
  292.     add ax,48
  293.  
  294.     mov byte[msgbox_3.err],al
  295.     push thread
  296.     push msgbox_3
  297.     call [mb_create] ;message: Can-t open color options file!
  298.     jmp .no_colors
  299.   @@:
  300.  
  301.   mov esi,[options_file]
  302.   mov edi,ColColor
  303.   mov ecx,9*4
  304.   rep movsb
  305.  
  306.   mov eax,[options_file]
  307.   add eax,32
  308.   mov dword[tex_colors],eax
  309.  
  310.   mov eax,dword[ColColor] ;init: Col (offset to key words)
  311.   add eax,8
  312.   shl eax,2
  313.   add eax,[options_file]
  314.   mov dword[Col],eax
  315.  
  316.   mov ecx,dword[ColWords] ;init: FkPos (first key positions)
  317.   xor eax,eax
  318.   @@:
  319.     ColToIndexOffset eax,edi
  320.     xor ebx,ebx
  321.     mov bl,byte[edi]
  322.     shl bx,2
  323.     mov esi,FkPos
  324.     add esi,ebx
  325.     cmp dword[esi],-1
  326.     jne .no_ch_key
  327.       mov dword[esi],eax
  328.     .no_ch_key:
  329.     inc eax
  330.   loop @b
  331.  
  332.   ;init: tex_help_f1
  333.   mov ecx,dword[ColWords]
  334.   imul ecx,sizeof.TexColViv
  335.   add ecx,dword[Col]
  336.   mov dword[tex_help_f1],ecx
  337.  
  338.   .no_colors:
  339.   pop edi esi ecx ebx eax
  340.   ret
  341.  
  342.  
  343. ;input:
  344. ; ebx = file size
  345. OpenFile:
  346.   mov [err_opn],0
  347.   push eax ;destination
  348.   push ecx ;for cycle
  349.   push edx ;source
  350.  
  351.     xor al,al
  352.     call Clear
  353.     mov eax,ebx
  354.     mov ecx,ebx
  355.     add eax,2
  356.     ConvertIndexToPointer eax
  357.     mov edx,[tex]
  358.     add edx,ebx
  359.   push ebx
  360.     @@:
  361.       mov ebx,[edx]
  362.       mov byte [eax],bl
  363.       mov dword [eax+2],ecx
  364.       inc dword [eax+2]
  365.       mov dword [eax+6],ecx
  366.       add dword [eax+6],3
  367.       ;mov byte[eax+1],0 ;col=0
  368.       mov dword [eax+10],-1 ;tc=-1
  369.       mov dword [eax+14],0 ;td=0
  370.  
  371.       cmp ecx,0
  372.       je @f
  373.       dec ecx
  374.       dec edx
  375.       sub eax,sizeof.symbol
  376.       jmp @b
  377.     @@:
  378.   pop ebx
  379.     add eax,2
  380.     mov dword [eax],0 ; first sumbol 'perv=0'
  381.  
  382.     mov edx,[tex]
  383.     ; begining sumbol 'perv=0' 'next=2'
  384.     mov dword [edx+2],0
  385.     mov dword [edx+6],2
  386.  
  387.     add edx,sizeof.symbol
  388.     mov dword [edx+6],0 ; last sumbol 'next=0'
  389.     mov dword [edx+2],ebx ; last sumbol 'perv=last'
  390.     inc dword [edx+2]
  391.  
  392.     mov edx,ebx
  393.     inc edx ;2 = rezerv sumbols
  394.     imul edx,sizeof.symbol
  395.     add edx,[tex]
  396.     mov dword [edx+6],1 ; last sumbol 'next=1'
  397.  
  398.     @@: ;clear memory, need if before was open big file
  399.       add edx,sizeof.symbol
  400.       cmp edx,[tex_end]
  401.       jge @f
  402.         mov dword[edx+10],0
  403.         mov dword[edx+14],0
  404.       jmp @b
  405.     @@:
  406.  
  407.     call GetNumLines
  408.     cmp eax,100
  409.     jge @f
  410.       mov eax,100
  411.     @@:
  412.     mov [wScr.max_area],eax
  413. ;    mov [wScr.redraw],1
  414.   pop edx ecx eax
  415.   call CmColored
  416.   ret
  417.  
  418. ;input:
  419. ; edx = pointer to symbol struct
  420. ;output:
  421. ; edx = pointer to 'perv' visible symbol struct
  422. IteratPerv:
  423.   cmp [tim_Undo],0
  424.   je .else
  425.   push ebx
  426.   @@:
  427.     call GetTexPervPos
  428.     cmp edx,[tex]
  429.     je @f
  430.     call SymbNotVis
  431.     cmp bl,1
  432.     je @b
  433.     cmp byte[edx],10 ;ïðîïóñê ñèìâîëà ñ êîäîì 10
  434.     je @b
  435.   @@:
  436.   pop ebx
  437.   ret
  438.   .else:
  439.     call GetTexPervPos
  440.     cmp edx,[tex]
  441.     je .endif
  442.     cmp dword [edx+14],0
  443.     jne .else
  444.     cmp byte[edx],10 ;ïðîïóñê ñèìâîëà ñ êîäîì 10
  445.     je .else
  446.   .endif:
  447.   ret
  448.  
  449.  
  450. ;input:
  451. ; edx = pointer to symbol struct
  452. ;output:
  453. ; edx = pointer to 'next' visible symbol struct
  454. IteratNext:
  455.   cmp [tim_Undo],0
  456.   je .else
  457.   push ebx
  458.   @@:
  459.     call GetTexNextPos
  460.     cmp edx,[tex_1]
  461.     jle @f
  462.     call SymbNotVis
  463.     cmp bl,1
  464.     je @b
  465.     cmp byte[edx],10 ;ïðîïóñê ñèìâîëà ñ êîäîì 10
  466.     je @b
  467.   @@:
  468.   pop ebx
  469.   ret
  470.   .else:
  471.     call GetTexNextPos
  472.     cmp edx,[tex_1]
  473.     jle .endif
  474.     cmp dword [edx+14],0
  475.     jne .else
  476.     cmp byte[edx],10 ;ïðîïóñê ñèìâîëà ñ êîäîì 10
  477.     je .else
  478.   .endif:
  479.   ret
  480.  
  481. ;input:
  482. ; edx = pointer to symbol struct
  483. ; bl = symbol end of select
  484. ItPoNextUc:
  485.   @@:
  486.     cmp bl,byte[edx]
  487.     je @f
  488.     cmp edx,[tex_1]
  489.     jle @f
  490.     call IteratNext
  491.     jmp @b
  492.   @@:
  493.   call IteratNext
  494.   ret
  495.  
  496. ;input:
  497. ; edx = pointer to symbol struct
  498. ItPervColorTag:
  499.   @@:
  500.     cmp byte[edx+1],0
  501.     jne @f
  502.     call IteratPerv
  503.     cmp edx,[tex_1]
  504.     jle @f
  505.     jmp @b
  506.   @@:
  507.   ret
  508.  
  509. ;input:
  510. ; edx = pointer to symbol struct
  511. ItNextColorTag:
  512.   @@:
  513.     call IteratNext
  514.     cmp byte[edx+1],0
  515.     jne @f
  516.     cmp edx,[tex_1]
  517.     jle @f
  518.     jmp @b
  519.   @@:
  520.   ;call IteratNext
  521.   ret
  522.  
  523. ;input:
  524. ; edx = pointer to symbol struct
  525. ;output:
  526. ; bl = 1 if sumbol not visible
  527. ; (tex[i].td+tim_Undo<=ch_tim && tex[i].td) || (tex[i].tc>ch_tim-tim_Undo)
  528. SymbNotVis:
  529.   push eax
  530.  
  531.   xor bl,bl
  532.  
  533.   cmp dword [edx+14],0
  534.   je @f
  535.   mov eax,[edx+14] ;eax=tex[i].td
  536.   add eax,[tim_Undo]
  537.   cmp eax,[ch_tim]
  538.   jg @f
  539.     mov bl,1
  540.     pop eax
  541.     ret
  542.   @@:
  543.  
  544.   mov eax,[ch_tim]
  545.   sub eax,[tim_Undo]
  546.   cmp [edx+10],eax
  547.   jle @f
  548.     or bl,1
  549.   @@:
  550.  
  551.   pop eax
  552.   ret
  553.  
  554.  
  555. ;input:
  556. ; bh = 1 - move cursor after text add
  557. ; bl = 1 - change time when text add
  558. ; esi = add text len
  559. ; edi = pointer to text string
  560. TextAdd:
  561.   push ebp
  562.   mov ebp,esp
  563.   sub esp,4*2
  564.  
  565.   push eax ;po_t
  566.   push ecx edx edi
  567.  
  568.   call GetPos
  569.   call GetTexPervPos
  570.   call GetTexArrIndex ;eax=po_t
  571.  
  572.   mov dword[ebp-4],0 ;count new spaces
  573.   cmp [gpOpt],2
  574.   je @f
  575.     push eax ebx ;c_sp=cur[cn].x+Scroller->XPos-StrLen(cur[cn].y+Scroller->YPos);
  576.       mov eax,[cur_x]
  577.       add eax,[hScr.position]
  578.       mov dword[ebp-4],eax
  579.  
  580.       mov eax,[cur_y]
  581.       add eax,[wScr.position]
  582.       call StrLen
  583.       sub dword[ebp-4],ebx
  584.     pop ebx eax
  585.   @@:
  586.  
  587.   mov dword[ebp-8],0 ;count new lines
  588.   cmp [gpOpt],0
  589.   jne @f
  590.     push eax
  591.       mov eax,[cur_y]
  592.       add eax,[wScr.position]
  593.       inc eax
  594.       mov dword[ebp-8],eax
  595.  
  596.       call GetNumLines
  597.       sub dword[ebp-8],eax
  598.     pop eax
  599.   @@:
  600.  
  601.   mov edx,sizeof.symbol
  602.   shl edx,1
  603.   add edx,[tex]
  604.   @@: ;for(i=2;i<texMax;i++)
  605.     cmp dword [edx+10],0 ;if(!tex[i].tc && !tex[i].td)
  606.     jne .u1f
  607.     cmp dword [edx+14],0
  608.     jne .u1f
  609.       cmp bl,0 ;if(n_tim) ch_tim++;
  610.       je .no_tim
  611.         inc [ch_tim]
  612.       .no_tim:
  613.       cmp bh,0
  614.       je .no_cur_mov
  615.       cmp dword[ebp-8],0 ;åñëè åñòü äîáàâî÷íûå ñòðîêè, òî êóðñîð åùå íå äâèãàåì
  616.       jg .no_cur_mov
  617.       cmp dword[ebp-4],0 ;åñëè íåò äîáàâî÷íûõ ïðîáåëîâ, òî êóðñîð òîæå íå äâèãàåì
  618.       jg .no_cur_mov
  619.         inc [cur_x] ;move cursor
  620.         ;call GoToPos
  621.         cmp byte [edi],13
  622.         jne .no_cur_mov
  623.           mov [cur_x],0
  624.           inc [cur_y]
  625.       .no_cur_mov:
  626.  
  627.       xor bl,bl ;n_tim=false;
  628.  
  629.       mov cl,byte [edi] ;tex[i].c=ta[ns];
  630.       mov byte [edx],cl
  631.       m2m dword [edx+10],dword [ch_tim] ;tex[i].tc=ch_tim;
  632.       mov [edx+2],eax ;tex[i].perv=po_t;
  633.  
  634.       mov ecx,eax
  635.       imul ecx,sizeof.symbol
  636.       add ecx,[tex] ; *** ecx = tex[po_t] ***
  637.       add ecx,6   ; *** ecx = tex[po_t].next ***
  638.       m2m dword [edx+6],dword [ecx] ;tex[i].next=tex[po_t].next;
  639.  
  640.       call GetTexArrIndex ;*** eax = i ***
  641.       cmp eax,maxChars
  642.       jge @f
  643.       mov [ecx],eax ;tex[po_t].next=i; // ññûëêè ïåðåíàïðàâëÿåì
  644.       mov ecx,[edx+6] ; *** ecx = tex[i].next ***
  645.       imul ecx,sizeof.symbol
  646.       add ecx,[tex] ; *** ecx = tex[tex[i].next] ***
  647.       mov [ecx+2],eax ;tex[tex[i].next].perv=i;
  648.  
  649.       cmp dword[ebp-8],0 ;add lines or text
  650.       jle .spc_add
  651.         dec dword[ebp-8]
  652.         mov byte [edx],13
  653.         jmp .u1f
  654.       .spc_add:
  655.       cmp dword[ebp-4],0 ;add spaces or text
  656.       jle .tex_add
  657.         dec dword[ebp-4]
  658.         mov byte [edx],' '
  659.         jmp .u1f
  660.       .tex_add:
  661.       inc edi
  662.       dec esi
  663.     .u1f:
  664.     add edx,sizeof.symbol
  665.     cmp edx,[tex_end]
  666.     jge @f ;out of memory
  667.     cmp esi,0
  668.     jne @b
  669.   @@:
  670.  
  671.   pop edi edx ecx eax
  672.   mov esp,ebp ; âîññòàíàâëèâàåì ñòåê
  673.   pop ebp
  674.   call CmColored
  675.   ret
  676.  
  677.  
  678.  
  679. ;input:
  680. ;  ecx = position to free insert cell
  681. ;  edx = pointer to sumbol, when insert
  682. ;  esi = pointer to added symbol
  683. ;output:
  684. ;  ecx = position to inserted cell
  685. CharAdd:
  686.  
  687.   .loop_b:
  688.     cmp ecx,[tex_end]
  689.     jge .end_f
  690.     cmp dword[ecx+10],0
  691.     jne @f
  692.       cmp dword[ecx+14],0
  693.       je .loop_e
  694.     @@:
  695.     add ecx,sizeof.symbol
  696.     jmp .loop_b
  697.   .loop_e:
  698.  
  699.   push eax ebx
  700.   mov eax,[ch_tim]
  701.   mov dword[ecx+10],eax
  702.   mov al,byte[esi]
  703.   mov byte[ecx],al
  704.  
  705.   call GetTexArrIndex ; *** eax=pos ***
  706.   mov [ecx+2],eax ;tex[i].perv=pos;
  707.   m2m dword[ecx+6],dword[edx+6] ;tex[i].next=tex[pos].next;
  708.  
  709.   push edx
  710.     mov edx,ecx
  711.     call GetTexArrIndex ; *** eax=i ***
  712.   pop edx
  713.  
  714.   mov [edx+6],eax ;tex[pos].next=i; // ññûëêè ïåðåíàïðàâëÿåì
  715.   mov ebx,[ecx+6]
  716.   ConvertIndexToPointer ebx
  717.   mov [ebx+2],eax ;tex[tex[i].next].perv=i; // ...
  718.   pop ebx eax
  719.  
  720.   .end_f:
  721.   call CmColored
  722.   ret
  723.  
  724.  
  725. ;input:
  726. ; conv_table = pointert to convert table
  727. ;output:
  728. ; edi = count converted symbols
  729. ConvertSelText:
  730.   xor edi,edi
  731.   push eax ebx ecx edx esi
  732.   call IsSel
  733.   cmp al,0
  734.   je .end_f
  735.     call SetUndo
  736.     call SelNormalize
  737.  
  738.     mov esi,[seln.x0]
  739.     mov ecx,[seln.y0]
  740.     call GetPosByParam
  741.     mov eax,edx
  742.     mov esi,[seln.x1]
  743.     mov ecx,[seln.y1]
  744.     call GetPosByParam
  745.     ;call GetTexPervPos
  746.     mov ebx,edx
  747.  
  748.     cmp eax,ebx
  749.     je .end_f
  750.  
  751.     inc [ch_tim]
  752.     mov edx,eax ;i=p0;
  753.     mov ecx,2
  754.     ConvertIndexToPointer ecx
  755.     @@:
  756.       mov esi,[edx]
  757.       and esi,0xff
  758.       add esi,[conv_table] ;EvUpper
  759.       cmp byte [esi],0
  760.       je .no_change
  761.         m2m dword [edx+14],dword [ch_tim]
  762.         call CharAdd ;b_pos=CharAdd(tex[i].c^32,i,false,b_pos);
  763.         call GetTexNextPos ;go to added symbol
  764.         inc edi
  765.       .no_change:
  766.  
  767.       call IteratNext
  768.       cmp edx,[tex]
  769.       je @f
  770.       cmp edx,ebx
  771.       je @f
  772.  
  773.       jmp @b
  774.     @@:
  775.     cmp edi,0
  776.     jne @f
  777.       dec [ch_tim]
  778.     @@:
  779.   .end_f:
  780.   pop esi edx ecx ebx eax
  781.  
  782.   ret
  783.  
  784. ;input:
  785. ; bh = (0-backspace, 1-delete)
  786. ; bl = 1 - change time
  787. ;output:
  788. ; bl = 0 - no delete
  789. ; bl = 1 - delete
  790. TextDel:
  791.   push edx cx
  792.   xor cl,cl
  793.   cmp bh,1
  794.   je @f
  795.     call CurMoveLeft
  796.     cmp dl,0
  797.     je .no_del
  798.   @@:
  799.   call GetPos
  800.   cmp [gpOpt],1
  801.   je .no_del
  802.     cmp bl,0
  803.     je @f
  804.       inc [ch_tim]
  805.     @@:
  806.     m2m dword [edx+14], dword [ch_tim]
  807.     mov cl,1
  808.   .no_del:
  809.   mov bl,cl
  810.   pop cx edx
  811.   ret
  812.  
  813.  
  814.  
  815. ;input:
  816. ; eax = pointer to begin select
  817. ; ebx = pointer to end select
  818. Revers:
  819.   cmp eax,ebx
  820.   jne @f
  821.     ret
  822.   @@:
  823.  
  824.   push ecx edx
  825.  
  826.   mov edx,[tex_1]
  827.   cmp edx,ebx ;if(p1==1)p1=tex[1].perv;
  828.   jne @f
  829.     call GetTexPervPos
  830.     mov ebx,edx
  831.   @@:
  832.  
  833.   push esi
  834.     mov edx,[eax+2] ; *** edx = tex[p0].perv ***
  835.     ConvertIndexToPointer edx
  836.     add edx,6
  837.     mov ecx,[edx] ;tmp = tex[tex[p0].perv].next;
  838.  
  839.     mov esi,[ebx+6] ; *** esi = tex[p1].next ***
  840.     ConvertIndexToPointer esi
  841.     add esi,2
  842.     m2m dword[edx],dword[esi] ;tex[tex[p0].perv].next = tex[tex[p1].next].perv;
  843.  
  844.     mov [esi],ecx ;tex[tex[p1].next].perv = tmp;
  845.   pop esi
  846.  
  847.   mov ecx,[eax+2] ;tmp = tex[p0].perv;
  848.   m2m dword[eax+2],dword[ebx+6] ;tex[p0].perv = tex[p1].next;
  849.   mov [ebx+6],ecx ;tex[p1].next = tmp;
  850.  
  851.   mov edx,eax ;i=p0;
  852.   @@:
  853.     mov ecx,[edx+6] ;tmp = tex[i].next;
  854.     m2m dword[edx+6],dword[edx+2] ;tex[i].next = tex[i].perv;
  855.     mov [edx+2],ecx ;tex[i].perv = tmp;
  856.     cmp edx,ebx ;if(i==p1)break;
  857.     je @f
  858. ; ---
  859. ;cmp edx,[tex]
  860. ;je @f
  861. ; ---
  862.     mov edx,ecx ;i = tmp;
  863.     ConvertIndexToPointer edx
  864.     jmp @b
  865.   @@:
  866.   pop edx ecx
  867.   call CmColored
  868.   ret
  869.  
  870.  
  871. ;output:
  872. ; dl = 0 not move
  873. ; dl = 2 if move up
  874. ; dl = 8 if scroll move up
  875. CurMoveUp:
  876.   cmp [cur_y],0
  877.   je @f
  878.     dec [cur_y]
  879.     mov dl,2
  880.     ret
  881.   @@:
  882.   cmp [wScr.position],0
  883.   je @f
  884.     dec [wScr.position]
  885.     mov dl,8
  886.     ret
  887.   @@:
  888.   mov dl,0
  889.   ret
  890.  
  891. ;output:
  892. ; dl = 0 not move
  893. ; dl = 2 if move down
  894. ; dl = 8 if scroll move down
  895. CurMoveDown:
  896.   push eax
  897.   mov dl,0
  898.   mov eax,[wScr.cur_area]
  899.   dec eax
  900.   cmp [cur_y],eax
  901.   jge @f
  902.     inc [cur_y]
  903.     mov dl,2
  904.     jmp .ret_f
  905.   @@:
  906.   mov eax,[cur_y]
  907.   add eax,[wScr.position]
  908.   inc eax
  909.   cmp [wScr.max_area],eax
  910.   jle @f
  911.     inc [wScr.position]
  912.     mov dl,8
  913.   @@:
  914.   .ret_f:
  915.   pop eax
  916.   ret
  917.  
  918.  
  919. ;output:
  920. ; dl = 0 not move
  921. ; dl = 1 if move up
  922. CurMovePageUp:
  923.   push eax
  924.   mov eax,[wScr.cur_area]
  925.   xor dl,dl
  926.   cmp eax,[wScr.position]
  927.   jg @f
  928.     sub [wScr.position],eax
  929.     mov dl,1
  930.   @@:
  931.   cmp [wScr.position],0
  932.   je @f
  933.   cmp dl,1
  934.   je @f
  935.     mov [wScr.position],0
  936.     mov dl,1
  937.   @@:
  938.   pop eax
  939.   ret
  940.  
  941. CurMovePageDown:
  942.   push eax ebx
  943.   xor dl,dl
  944.   mov eax,[wScr.max_area]
  945.   sub eax,[wScr.cur_area]
  946.   cmp [wScr.position],eax
  947.   jge @f
  948.     mov ebx,[wScr.cur_area]
  949.     add [wScr.position],ebx
  950.     mov dl,1
  951.     mov [wScr.redraw],1
  952.     cmp [wScr.position],eax
  953.     jle @f
  954.       mov [wScr.position],eax
  955.   @@:
  956.   pop ebx eax
  957.   ret
  958.  
  959. ;output:
  960. ; dl = 0 not move
  961. ; dl = 1 if move left
  962. ; dl = 3 if move left and up
  963. ; dl = 8 if scroll move up
  964. CurMoveLeft:
  965.   cmp [cur_x],0
  966.   je @f
  967.     dec [cur_x]
  968.     mov dl,1
  969.     ret
  970.   @@:
  971.   cmp [hScr.position],0
  972.   je @f
  973.     dec [hScr.position]
  974.     mov dl,8
  975.     ret
  976.   @@:
  977.   cmp [cur_y],0
  978.   jne @f
  979.     mov dl,0
  980.     cmp [wScr.position],0
  981.     je .ret_f
  982.       dec [wScr.position]
  983.       call OnInitialUpdate
  984.       call CurMoveX_LastChar
  985.       mov dl,8
  986.     jmp .ret_f
  987.   @@:
  988.   cmp [cur_y],0
  989.   je @f
  990.   dec [cur_y]
  991.   call CurMoveX_LastChar
  992.   cmp dl,8
  993.   je .ret_f
  994.   mov dl,3
  995.   ret
  996.   @@:
  997.   mov dl,0
  998.   .ret_f:
  999.   ret
  1000.  
  1001. CurMoveRight:
  1002.   push eax
  1003.   xor dl,dl
  1004.   mov eax,[hScr.cur_area]
  1005.   cmp [cur_x],eax
  1006.   jge @f
  1007.     inc [cur_x]
  1008.     mov dl,1
  1009.     jmp .ret_f
  1010.   @@:
  1011.     inc [hScr.position]
  1012.     mov dl,8
  1013.   .ret_f:
  1014.   pop eax
  1015.   ret
  1016.  
  1017. CurMoveX_LastChar:
  1018. ;[hScr.position]
  1019. ;[hScr.cur_area]
  1020. ;dl-???
  1021.   push eax ebx
  1022.   mov eax,[cur_y]
  1023.   add eax,[wScr.position]
  1024.   call StrLen
  1025.   xor dl,dl
  1026.  
  1027.   cmp ebx,[hScr.position]
  1028.   jge @f
  1029.     mov dl,8
  1030.     mov [hScr.position],ebx
  1031.   @@:
  1032.   sub ebx,[hScr.position]
  1033.  
  1034.   cmp ebx,[hScr.cur_area]
  1035.   jle @f ; b---[---]---e
  1036.     add [hScr.position],ebx
  1037.     mov ebx,[hScr.cur_area]
  1038.     sub [hScr.position],ebx
  1039.     mov dl,8
  1040.   @@:
  1041.   mov [cur_x],ebx
  1042.   pop ebx eax
  1043.   ret
  1044.  
  1045. ;output:
  1046. ; dl = 0 not move
  1047. ; dl = 1 move cursor
  1048. ; dl = 8 move cursor and scroll
  1049. CurMoveX_FirstChar:
  1050.   xor dl,dl
  1051.   cmp [cur_x],0
  1052.   je @f
  1053.   mov [cur_x],0
  1054.   mov dl,1
  1055.   @@:
  1056.   cmp [hScr.position],0
  1057.   je @f
  1058.     mov [hScr.position],0
  1059.     mov dl,8
  1060.   @@:
  1061.   ret
  1062.  
  1063. ;input:
  1064. ; edx = pointer to symbol struct
  1065. ;output:
  1066. ; eax = array index
  1067. GetTexArrIndex:
  1068.   push ecx edx
  1069.  
  1070.   mov eax,edx
  1071.   sub eax,[tex]
  1072.   xor edx,edx
  1073.   mov ecx,sizeof.symbol
  1074.   div ecx
  1075.  
  1076.   pop edx ecx
  1077.   ret
  1078.  
  1079. ;input:
  1080. ; edx = pointer to symbol struct
  1081. ;output:
  1082. ; edx = pointer to 'perv' struct
  1083. GetTexPervPos:
  1084.   push dword [edx+2]
  1085.   pop edx
  1086.   imul edx,sizeof.symbol
  1087.   add edx,[tex]
  1088.   ret
  1089.  
  1090. ;input:
  1091. ; edx = pointer to symbol struct
  1092. ;output:
  1093. ; edx = pointer to 'next' symbol struct
  1094. GetTexNextPos:
  1095.   push dword [edx+6]
  1096.   pop edx
  1097.   imul edx,sizeof.symbol
  1098.   add edx,[tex]
  1099.   ret
  1100.  
  1101.  
  1102. ;output:
  1103. ; edx = symbol under cursor
  1104. ; gpOpt = 1,2
  1105. ; edx = tex[1].perv if error
  1106. ; gpOpt = 0
  1107. GetPos:
  1108.   push esi ecx
  1109.     mov esi,[cur_x]
  1110.     add esi,[hScr.position]
  1111.     mov ecx,[cur_y]
  1112.     add ecx,[wScr.position]
  1113.     call GetPosByParam
  1114.   pop ecx esi
  1115.   ret
  1116.  
  1117.  
  1118. ;input:
  1119. ; esi = XPos
  1120. ; ecx = YPos
  1121. ;output:
  1122. ; edx = symbol under cursor
  1123. ; gpOpt = 1 if found text line
  1124. ; gpOpt = 2 if found text line and column
  1125. ; edx = tex[1] if error
  1126. ; gpOpt = 0 if text no found
  1127. GetPosByParam:
  1128.   push eax ;Row
  1129.   push ebx ;Col
  1130.  
  1131.   xor eax,eax
  1132.   xor ebx,ebx
  1133.   mov [gpOpt],0
  1134.   mov edx,[tex]
  1135.   @@:
  1136.     call IteratNext
  1137.     cmp edx,[tex_1]
  1138.     jle @f
  1139.     cmp ebx,esi
  1140.     jne .u1_0 ;Col <> cur_x
  1141.       mov [gpOpt],1
  1142.       cmp eax,ecx
  1143.       jge @f ; Row >= cur_y
  1144.     .u1_0:
  1145.     mov [gpOpt],0
  1146.     inc ebx
  1147.     cmp byte [edx],13
  1148.     jne @b
  1149.     cmp eax,ecx
  1150.     jge @f ; Row >= cur_y
  1151.     inc eax
  1152.     xor ebx,ebx
  1153.     jmp @b
  1154.   @@:
  1155.   cmp eax,ecx
  1156.   jne @f ; Row = cur_y
  1157.     inc [gpOpt]
  1158.   @@:
  1159.   cmp [gpOpt],0
  1160.   jne @f
  1161.     mov edx,[tex_1]
  1162.     ;call GetTexPervPos
  1163.   @@:
  1164.   pop ebx eax
  1165.   ret
  1166.  
  1167.  
  1168. ;input:
  1169. ; eax = Row
  1170. ;output:
  1171. ; ebx = str len
  1172. StrLen:
  1173.   push edx ecx
  1174.   ;ecx = Row, from cycle
  1175.  
  1176.   xor ebx,ebx
  1177.   xor ecx,ecx
  1178.   mov edx,[tex]
  1179.   @@:
  1180.     call IteratNext
  1181.     cmp edx,[tex_1]
  1182.     jle @f
  1183.     inc ebx
  1184.     cmp byte [edx],13
  1185.     jne @b
  1186.     dec ebx ;lenght minus 1 sumbol to paragraph
  1187.     cmp eax,ecx
  1188.     je @f
  1189.     xor ebx,ebx
  1190.     inc ecx
  1191.     jmp @b
  1192.   @@:
  1193.  
  1194.   cmp eax,ecx
  1195.   je @f
  1196.     xor ebx,ebx
  1197.   @@:
  1198.  
  1199.   pop ecx edx
  1200.   ret
  1201.  
  1202.  
  1203. ;output:
  1204. ; edx = symbol position
  1205. ;output:
  1206. ; eax = number of line
  1207. ; ebx = symbol position in line
  1208. GetTexCoords:
  1209.   push edx
  1210.   xor eax,eax
  1211.   xor ebx,ebx
  1212.   @@:
  1213.     call IteratPerv
  1214.  
  1215.     cmp eax,0
  1216.     jne .no_col_mov
  1217.     inc ebx
  1218.     .no_col_mov:
  1219.  
  1220.     cmp edx,[tex_1]
  1221.     jle @f
  1222.     cmp byte [edx],13
  1223.     jne @b
  1224.     inc eax
  1225.     jmp @b
  1226.   @@:
  1227.   dec ebx
  1228.   pop edx
  1229.   ret
  1230.  
  1231. ;output:
  1232. ; eax = num lines
  1233. GetNumLines:
  1234.   push edx
  1235.   mov eax,1
  1236.   mov edx,[tex]
  1237.   @@:
  1238.     call IteratNext
  1239.     cmp edx,[tex_1]
  1240.     jle @f
  1241.     cmp byte [edx],13
  1242.     jne @b
  1243.     inc eax
  1244.     jmp @b
  1245.   @@:
  1246. ;...
  1247. ;dec eax
  1248.   pop edx
  1249.   ret
  1250.  
  1251. SetUndo:
  1252.   mov [dragk],0 ;çàêàí÷èâàåì âûäåëåíèå îò êëàâèàòóðû
  1253.   cmp [tim_Undo],1
  1254.   jl .no_work
  1255.  
  1256.   push eax ebx edx
  1257.   mov edx,[tex]
  1258.   call GetTexNextPos ;long i=tex[0].next;
  1259.   mov eax,[tim_Undo]
  1260.   sub [ch_tim],eax ;ch_tim-=tim_Undo;
  1261.   mov eax,[ch_tim]
  1262.   cmp [ls_tim],eax ;if(ls_tim>ch_tim)
  1263.   jle @f
  1264.     mov dword [ls_tim],0
  1265.   @@:
  1266.     cmp edx,[tex]
  1267.     je @f
  1268.  
  1269.     ;if(tex[i].tc>ch_tim){ // åñëè ñîçäàíèå ñèìâîëà áûëî îòìåíåíî
  1270.     cmp [edx+10],eax
  1271.     jle .no_u1
  1272.       mov dword [edx+10],0
  1273.       mov dword [edx+14],0
  1274.  
  1275.       mov ebx,[edx+2]
  1276.       imul ebx,sizeof.symbol
  1277.       add ebx,[tex];.next
  1278.       m2m dword [ebx+6],dword [edx+6] ;tex[tex[i].perv].next=tex[i].next;
  1279.  
  1280.       mov ebx,[edx+6]
  1281.       imul ebx,sizeof.symbol
  1282.       add ebx,[tex];.perv
  1283.       m2m dword [ebx+2],dword [edx+2] ;tex[tex[i].next].perv=tex[i].perv;
  1284.  
  1285.     .no_u1:
  1286.  
  1287.     ;else if(tex[i].td>ch_tim) tex[i].td=0; // åñëè óäàëåíèå ñèìâîëà áûëî îòìåíåíî
  1288.     cmp [edx+14],eax
  1289.     jle .no_u2
  1290.       mov dword [edx+14],0
  1291.     .no_u2:
  1292.  
  1293.     call GetTexNextPos
  1294.     jmp @b
  1295.   @@:
  1296.   mov dword [tim_Undo],0
  1297.   mov eax,[co_tim]
  1298.   cmp [ch_tim],eax
  1299.   jge @f
  1300.     mov [co_tim],0
  1301.   @@:
  1302.   pop edx ebx eax
  1303.   .no_work:
  1304.   ret
  1305.  
  1306. ;input:
  1307. ; ecx = Col
  1308. ; edx = Row
  1309. GoToPos:
  1310.   mov [cur_x],ecx
  1311.   sub edx,[wScr.position]
  1312.  
  1313.   cmp edx,[wScr.cur_area] ;[cur_y] > [.cur_area]
  1314.   jl @f
  1315.     push ebx
  1316.     mov ebx,edx
  1317.     sub ebx,[wScr.cur_area]
  1318.     inc ebx
  1319.     add [wScr.position],ebx
  1320.     sub edx,ebx
  1321.     pop ebx
  1322.     ; ??? redrav
  1323.   @@:
  1324.   mov [cur_y],edx
  1325.   ret
  1326.  
  1327. ;input:
  1328. ; bl = 1 change time when delete text
  1329. ;output:
  1330. ; al = 1 if delete
  1331. SelTextDel:
  1332.   call IsSel
  1333.   cmp al,0
  1334.   jne @f
  1335.   ret
  1336.   @@:
  1337.   ;call SelEnd
  1338.   call SelNormalize
  1339.   push esi edi ecx edx
  1340.     mov esi,[seln.x1]
  1341.     mov ecx,[seln.y1]
  1342.     call GetPosByParam
  1343.     mov edi,edx
  1344.  
  1345.     mov esi,[seln.x0]
  1346.     mov ecx,[seln.y0]
  1347.     call GetPosByParam
  1348.  
  1349.     cmp bl,0
  1350.     je @f
  1351.       inc [ch_tim]
  1352.  
  1353.     @@:
  1354.       cmp edx,[tex]
  1355.       je @f
  1356.       cmp edx,edi ;if(i==te)break;
  1357.       je @f
  1358.       m2m dword[edx+14],dword[ch_tim]
  1359.       xor bl,bl   ;n_tim=false;
  1360.       call IteratNext
  1361.       jmp @b
  1362.     @@:
  1363.     cmp bl,0
  1364.     je @f
  1365.       dec [ch_tim]
  1366.       xor al,al
  1367.     @@:
  1368.     cmp bl,0
  1369.     jne @f
  1370.       mov ecx,[seln.x0]
  1371.       mov edx,[seln.y0]
  1372.       call GoToPos
  1373.       mov [sel.x0],0
  1374.       mov [sel.y0],0
  1375.       mov [sel.x1],0
  1376.       mov [sel.y1],0
  1377.     @@:
  1378.   pop edx ecx edi esi
  1379.  
  1380.   ret
  1381.  
  1382.  
  1383. CmColored:
  1384.   push eax edx
  1385.   mov eax,[ch_tim]
  1386.   sub eax,[tim_Undo]
  1387.   mov dword[co_tim],eax
  1388.   mov edx,[tex]
  1389.   @@:
  1390.     call IteratNext
  1391.     cmp edx,[tex_1]
  1392.     jle @f
  1393.     mov byte[edx+1],0
  1394.     jmp @b
  1395.   @@:
  1396.  
  1397.   cmp dword[ColWords],1
  1398.   jl .no_colors
  1399.   mov edx,[tex]
  1400.   @@:
  1401.     call TextFSColor
  1402.     cmp edx,[tex_1]
  1403.     jle .no_colors
  1404.     jmp @b
  1405.   .no_colors:
  1406.   pop edx eax
  1407.   ret
  1408.  
  1409.  
  1410.  
  1411. ;input:
  1412. ; edx = pointer to start symbol
  1413. ;output:
  1414. ; edx = pointer to next symbol
  1415. TextFSColor:
  1416.   ;eax = word_n
  1417.   ;ecx = l_pos
  1418.   push ebp
  1419.   mov ebp,esp
  1420.   sub esp,10 ;2*4+2*1
  1421.   ;bP  = dword[ebp-4]
  1422.   ;eP  = dword[ebp-8]
  1423.   ;fnd = byte[ebp-12]
  1424.   ;f_color = byte[ebp-13]
  1425.  
  1426.   push eax ebx ecx esi edi
  1427.   mov dword[ebp-4],1
  1428.   mov dword[ebp-4],1
  1429.   mov byte[ebp-12],0
  1430.   mov byte[ebp-13],1
  1431.   @@:
  1432.     call IteratNext
  1433.     cmp edx,[tex_1]
  1434.     jle @f
  1435.  
  1436.     xor ebx,ebx
  1437.     mov bl,byte[edx]
  1438. ;mov byte[buf],bl
  1439. ;mov byte[buf+1],0
  1440.     shl bx,2 ;ebx*=4
  1441.     add ebx,FkPos
  1442.     mov eax,dword[ebx]
  1443.     cmp eax,0
  1444.     jl @b ;if( (word_n=FkPos[(unsigned char)tex[i].c])>-1 ){
  1445.  
  1446.     mov ecx,eax
  1447.     ;while(l_pos<ColWords && Col[keyw[l_pos]].Text[0]==Col[keyw[word_n]].Text[0])
  1448.     .wh_1b:
  1449.       cmp ecx,dword[ColWords]
  1450.       jge .wh_1e
  1451.       ColToIndexOffset ecx,esi
  1452.       mov bh,byte[esi]
  1453.       ColToIndexOffset eax,esi
  1454.       mov bl,byte[esi]
  1455.       cmp bh,bl
  1456.       jne .wh_1e
  1457.         inc ecx
  1458.       jmp .wh_1b
  1459.     .wh_1e:
  1460.  
  1461.     mov dword[ebp-4],edx ;bP=i;
  1462.     mov edi,1
  1463.  
  1464.     .wh_2b: ;while(1){
  1465.       call IteratNext
  1466.  
  1467.       ;while(l_pos>word_n && Col[keyw[l_pos-1]].Text[pos]!=tex[i].c)
  1468.       .wh_3b:
  1469.         cmp ecx,eax
  1470.         jle .wh_3e
  1471.         dec ecx
  1472.         ColToIndexOffset ecx,ebx
  1473.         inc ecx
  1474.         ;cmp byte[ebx+edi],byte[edx]
  1475.         push ax
  1476.           mov al,byte[ebx+edi]
  1477.           mov bl,al
  1478.         pop ax
  1479.         cmp bl,byte[edx]
  1480.         je .wh_3e
  1481.           dec ecx
  1482.         jmp .wh_3b
  1483.       .wh_3e:
  1484.  
  1485.       ColToIndexOffset eax,ebx
  1486.       cmp byte[ebx+edi],0
  1487.       jne .if_0 ;if(Col[keyw[word_n]].Text[pos]==0){
  1488.         mov dword[ebp-8],edx ;eP=i;
  1489.         ColToIndexOffset eax,esi
  1490.         mov bl,byte[esi+MAX_COLOR_WORD_LEN+6]
  1491.         mov byte[ebp-13],bl ;f_color=Col[keyw[word_n]].color;
  1492.  
  1493. mov byte[ebp-12],1
  1494. ;... esi = Col[keyw[word_n]]
  1495.           mov bl,byte[esi+MAX_COLOR_WORD_LEN+4]
  1496.           cmp bl,0 ;if(Col[keyw[word_n]].wwo)
  1497.           je .if_2n
  1498.             push edx
  1499.             mov edx,dword[ebp-4]
  1500.      call IteratPerv
  1501. ;           mov bh,bl
  1502.  
  1503.             btr bx,0 ;1-1
  1504.             jae .if_3e ;if(Col[keyw[word_n]].wwo&1)
  1505.               ;u1= !(isalnum(cont_s)||cont_s=='_')
  1506.               call isalnum
  1507.               jae .if_3e
  1508.                 mov byte[ebp-12],0
  1509.             .if_3e:
  1510.  
  1511.             btr bx,3 ;4-1
  1512.             jae .if_4e ;if(Col[keyw[word_n]].wwo&8)
  1513.               ;u1= !isalpha(cont_s);
  1514.               call isalpha
  1515.               jae .if_4e
  1516.                 mov byte[ebp-12],0
  1517.             .if_4e:
  1518.  
  1519.  
  1520.             mov edx,dword[ebp-8]
  1521. ;     call IteratNext
  1522.  
  1523.             btr bx,1 ;2-1
  1524.             jae .if_5e ;if(Col[keyw[word_n]].wwo&2)
  1525.               ;u1= !(isalnum(cont_s)||cont_s=='_')
  1526.               call isalnum
  1527.               jae .if_5e
  1528.                 mov byte[ebp-12],0
  1529.             .if_5e:
  1530.  
  1531.             btr bx,4 ;5-1
  1532.             jae .if_6e ;if(Col[keyw[word_n]].wwo&16)
  1533.               ;u1= !isalpha(cont_s);
  1534.               call isalpha
  1535.               jae .if_6e
  1536.                 mov byte[ebp-12],0
  1537.             .if_6e:
  1538.  
  1539.             btr bx,2 ;3-1
  1540.             jae .if_7e ;if(Col[keyw[word_n]].wwo&4)
  1541.        mov bl,byte[esi+MAX_COLOR_WORD_LEN+5]
  1542.               call ItPoNextUc
  1543.        cmp edx,[tex_1]
  1544.        jle .if_7e
  1545.        mov dword[ebp-8],edx
  1546.             .if_7e:
  1547.  
  1548.             pop edx
  1549.           .if_2n:
  1550. ;                 if(i!=1){ // íå êîíåö äîêóìåíòà
  1551. ;                   cont_s=tex[eP].c;
  1552. ;                   if(Col[keyw[word_n]].wwo&2) u2= !(isalnum(cont_s)||cont_s=='_');  // íå áóêâ.-÷èñë. ñèìâîë
  1553. ;                   if(u2 && Col[keyw[word_n]].wwo&16) u2= !isalpha(cont_s); // íå ÷èñë. ñèìâîë
  1554. ;                   if(Col[keyw[word_n]].wwo&4) eP=ItPoNextUc(eP,Col[keyw[word_n]].endc);
  1555.  
  1556.         cmp eax,ecx
  1557.         je .wh_2e ;if(word_n==l_pos) break; // do double - åñëè ñëîâî òî÷íî ïîñëåäíåå
  1558.       .if_0:
  1559.  
  1560.       cmp edx,[tex_1]
  1561.       jle .wh_2e ;if(i==1) break;
  1562.  
  1563.       ;while(l_pos>word_n && Col[keyw[word_n]].Text[pos]!=tex[i].c)
  1564.       .wh_4b:
  1565.         cmp ecx,eax
  1566.         jle .wh_4e
  1567.         ColToIndexOffset eax,ebx
  1568.         ;cmp byte[ebx+edi],byte[edx]
  1569.         push ax
  1570.           mov al,byte[ebx+edi]
  1571.           mov bl,al
  1572.         pop ax
  1573.         cmp bl,byte[edx]
  1574.         je .wh_4e
  1575.           inc eax
  1576.         jmp .wh_4b
  1577.       .wh_4e:
  1578.  
  1579.       cmp eax,ecx
  1580.       je .wh_2e;if(word_n==l_pos) break;
  1581.       inc edi ;pos++;
  1582.       jmp .wh_2b
  1583.     .wh_2e:
  1584.  
  1585.     cmp byte[ebp-12],1 ;if(fnd)break;
  1586.     je @f
  1587.     mov edx,dword[ebp-4];i=bP;
  1588.     jmp @b
  1589.   @@:
  1590.  
  1591.   cmp byte[ebp-12],1
  1592.   jne .if_1e ;if(fnd){ // âûäåëåíèå íàéäåíîãî òåêñòà
  1593. ;    if(!mode_sf1 || (mode_sf1 && strlen(Col[keyw[word_n]].f1->c_str())>0)){
  1594.     mov eax,dword[ebp-4]
  1595.     mov bl,byte[ebp-13]
  1596.     mov byte[eax+1],bl ;tex[bP].col=f_color;
  1597.     mov eax,dword[ebp-8]
  1598.     mov byte[eax+1],0xff ;tex[eP].col=255;
  1599. ;    return ItPoPerv(eP); // âîçâðàùàåì ïîçèöèþ êîíöà âõîæäåíèÿ
  1600.     mov edx,dword[ebp-8]
  1601.     call GetTexPervPos
  1602.     jmp @f
  1603.   .if_1e:
  1604.     mov edx,[tex]
  1605.   @@:
  1606.  
  1607.   pop edi esi ecx ebx eax
  1608.   mov esp,ebp
  1609.   pop ebp
  1610.   ret
  1611.  
  1612.  
  1613. ;input:
  1614. ; edx = pointer to char (byte)
  1615. ;output:
  1616. ; cf=1 if symbol is...
  1617. tab_all_num db 0,0,0,0,0,0,11111111b,11b,11111110b,0xff,0xff,111b,11111110b,0xff,0xff,111b,0,0,0,0,0,0,0,0,0,0;,0,0,0,0,0,0 - tab_alpha_0,0,0,0,0,0
  1618. tab_alpha db 0,0,0,0,0,0,0,0,11111110b,0xff,0xff,111b,11111110b,0xff,0xff,111b,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  1619.   ;db 0,0,0,0,0,0,11111111b,11b,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  1620. isalnum:
  1621.   push eax ebx
  1622.   mov al,byte[edx] ;al=offset
  1623.   shr al,3
  1624.   and eax,11111b
  1625.   mov ebx,tab_all_num
  1626.   add ebx,eax
  1627.   mov ah,byte[ebx]
  1628.   mov al,byte[edx] ;al=bit
  1629.   and ax,111b
  1630.   m2m bx,word[ebx]
  1631.   btr bx,ax
  1632.   pop ebx eax
  1633.   ret
  1634. isalpha:
  1635.   push eax ebx
  1636.   mov al,byte[edx] ;al=offset
  1637.   shr al,3
  1638.   and eax,11111b
  1639.   mov ebx,tab_alpha
  1640.   add ebx,eax
  1641.   mov ah,byte[ebx]
  1642.   mov al,byte[edx] ;al=bit
  1643.   and ax,111b
  1644.   m2m bx,word[ebx]
  1645.   btr bx,ax
  1646.   pop ebx eax
  1647.   ret
  1648.  
  1649.  
  1650. ShowHelpF1:
  1651.   push eax edx
  1652.  
  1653.   call GetPos
  1654.   push edx
  1655.     call ItNextColorTag
  1656.     mov eax,edx
  1657.   pop edx
  1658.   call ItPervColorTag
  1659.  
  1660.   cmp eax,[tex]
  1661.   jle @f
  1662.   cmp edx,[tex_1]
  1663.   jle @f
  1664.     call FindHelpId
  1665.   @@:
  1666.   pop edx eax
  1667.   ;call draw_main_cursor
  1668.   call draw_help_f1
  1669.   ret
  1670.  
  1671. ;input:
  1672. ; edx = position begin 'symbol' struct
  1673. ; eax = position end 'symbol' struct
  1674. FindHelpId:
  1675. ; ecx = word_n
  1676. ; ebx = l_pos
  1677.   mov [help_id],-1
  1678.  
  1679.   push ebx ecx
  1680.     xor ebx,ebx
  1681.     mov bl,byte[edx]
  1682.     shl bx,2 ;ebx*=4
  1683.     add ebx,FkPos
  1684.     mov ecx,dword[ebx]
  1685.     cmp ecx,0
  1686.     jl .if_0e ;if( (word_n=FkPos[(unsigned char)tf[0]])>-1 ){
  1687.       push esi edi
  1688.       mov ebx,ecx ;l_pos=word_n;
  1689.       ColToIndexOffset ecx,esi
  1690.       push cx
  1691.       mov cl,byte[esi]
  1692.       @@:
  1693.         cmp ebx,dword[ColWords] ;while(l_pos<ColWords
  1694.         jge @f
  1695.         ;ColToIndexOffset ecx,esi
  1696.         ColToIndexOffset ebx,edi
  1697.         cmp cl,byte[edi] ;&& Col[keyw[l_pos]].Text[0]==Col[keyw[word_n]].Text[0])
  1698.         jne @f
  1699.           inc ebx ;l_pos++;
  1700.           jmp @b
  1701.       @@:
  1702.       pop cx
  1703.       call IteratNext ;pos=1;
  1704.       mov esi,1
  1705.       @@:
  1706.         push dx
  1707.         push word[edx]
  1708.         pop dx
  1709.           .wh_0b:
  1710.             cmp ebx,ecx ;while(l_pos>word_n
  1711.             jle .wh_0e
  1712.             dec ebx
  1713.             ColToIndexOffset ebx,edi
  1714.             inc ebx
  1715.             cmp byte[edi+esi],dl ;&& Col[keyw[l_pos-1]].Text[pos]!=tf[i])
  1716.             je .wh_0e
  1717.               dec ebx ;l_pos--;
  1718.             jmp .wh_0b
  1719.           .wh_0e:
  1720.  
  1721.           .wh_1b:
  1722.             cmp ebx,ecx ;while(l_pos>word_n
  1723.             jle .wh_1e
  1724.             ColToIndexOffset ecx,edi
  1725.             cmp byte[edi+esi],dl
  1726.             je .wh_1e
  1727.               inc ecx ;word_n++;
  1728.             jmp .wh_1b
  1729.           .wh_1e:
  1730.         pop dx
  1731.  
  1732.         cmp ecx,ebx ;if(word_n==l_pos) break;
  1733.         je @f
  1734.         call IteratNext ;pos++;
  1735.         cmp edx,eax ;for(...;i<strlen;...)
  1736.         je @f ;jge
  1737.         inc esi
  1738.         jmp @b
  1739.       @@:
  1740.       pop edi esi
  1741.  
  1742.       mov dword[help_id],ecx
  1743.       ;return keyw[word_n];
  1744.  
  1745.     .if_0e:
  1746.   pop ecx ebx
  1747.   ret
  1748.  
  1749. ;-----------------------------------------------------------------------------
  1750. ;ôóíêöèÿ äëÿ âûäåëåíèÿ ïàìÿòè
  1751. ;input:
  1752. ; ecx = size data
  1753. ;otput:
  1754. ; eax = pointer to memory
  1755. align 4
  1756. mem_Alloc:
  1757.   push ebx
  1758.   mov eax,68
  1759.   mov ebx,12
  1760.   int 0x40
  1761.   pop ebx
  1762.   ret
  1763. ;-----------------------------------------------------------------------------
  1764. ;ôóíêöèÿ äëÿ îñâîáîæäåíèÿ ïàìÿòè
  1765. ;input:
  1766. ; ecx = pointer to memory
  1767. align 4
  1768. mem_Free:
  1769.   push eax ebx
  1770.   cmp ecx,0
  1771.   jz @f
  1772.     mov eax,68
  1773.     mov ebx,13
  1774.     int 0x40
  1775.   @@:
  1776.   pop ebx eax
  1777.   ret
  1778.