Subversion Repositories Kolibri OS

Rev

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

  1. diff16 'tp-key.asm',0,$
  2.  
  3. key:
  4.         mov     ecx,1
  5.         mcall   66,3
  6.         mov     [shi],eax
  7.         xor     ebx,ebx
  8.         test    al,0x03
  9.         jz      @f
  10.         or      ebx,KM_SHIFT
  11.     @@: test    al,0x0C
  12.         jz      @f
  13.         or      ebx,KM_CTRL
  14.     @@: test    al,0x30
  15.         jz      @f
  16.         or      ebx,KM_ALT
  17.     @@: mov     edx,ebx
  18.         test    al,0x03
  19.         jz      @f
  20.         inc     cl
  21.     @@:
  22.         mcall   2
  23.         cmp     al,0
  24.         jne     still.skip_write
  25.         shr     eax,8
  26. ;--------------------------------------
  27. ; this code for Win-keys, works with
  28. ; kernel SVN r.3356 or later
  29.         test    [shi],0x200     ; LWin
  30.         jnz     still.skip_write
  31.         test    [shi],0x400     ; RWin
  32.         jnz     still.skip_write       
  33. ;--------------------------------------
  34.         cmp     al,224
  35.         jne     @f
  36.         mov     [ext],0x01
  37.         jmp     still.skip_write
  38.     @@: cmp     al,225
  39.         jne     @f
  40.         mov     [ext],0x02
  41.         jmp     still.skip_write
  42.     @@:
  43.         mov     ah,[ext]
  44.         mov     [ext],0
  45.  
  46.         mov     esi,numpad_table_off
  47.         test    [shi], 0x00000080 ; NumLock is on?
  48.         jz      .num
  49.         mov     esi,numpad_table_on
  50.   .num: cmp     eax,[esi]
  51.         jne     @f
  52.         mov     eax,[esi+4]
  53.         mov     ebx,eax
  54.         or      eax,edx
  55.         shr     ebx,8
  56.         or      ebx,0x0000FFFF
  57.         and     eax,ebx
  58.         mov     ecx,eax
  59.         shr     ecx,16
  60.         and     cl,1
  61.         inc     cl
  62.         jmp     .lp0
  63.     @@: add     esi,8
  64.         cmp     dword[esi],0
  65.         jne     .num
  66.  
  67.         or      eax,edx
  68.  
  69.   .lp0: test    al,0x80
  70.         jnz     still.skip_write
  71. ;--------------------------------------
  72. ; it is CAPS LOCK correct processing for chars
  73.         test    [shi], 0x00000040 ; CAPS LOCK is on?
  74.         jz      .no_caps_lock
  75.         cmp     ecx,1
  76.         jnz     @f
  77.         inc     ecx
  78.         jmp     .no_caps_lock
  79. @@:
  80.         cmp     ecx,2
  81.         jnz     .no_caps_lock
  82.         dec     ecx
  83. .no_caps_lock:
  84. ;--------------------------------------
  85.         push    eax
  86.         mcall   26,2,,key1
  87.         pop     eax
  88.  
  89.         mov     [chr],eax
  90.  
  91.         cmp     [bot_mode],0
  92.         je      @f
  93.         mov     ebx,eax
  94.         mov     al,2
  95.         call    [bot_dlg_handler]
  96.         jmp     still.skip_write
  97.     @@:
  98.  
  99.         mov     esi,accel_table_main
  100.   .acc: cmp     eax,[esi]
  101.         jne     @f
  102.         test    [secure_sel],1
  103.         jz      .lp1
  104.         m2m     [cur_editor.SelStart.X],[cur_editor.Caret.X]
  105.         m2m     [cur_editor.SelStart.Y],[cur_editor.Caret.Y]
  106.   .lp1: mov     [s_status],0
  107.         call    dword[esi+4]
  108.         call    editor_check_for_changes
  109.         jmp     still
  110.     @@: add     esi,8
  111.         cmp     dword[esi],0
  112.         jne     .acc
  113.  
  114.         test    [chr],KM_CTRLALT
  115.         jnz     still.skip_write
  116.  
  117.         mov     [s_status],0
  118.  
  119.         movzx   eax,byte[chr]
  120.         movzx   eax,[eax+key0]
  121.         or      al,al
  122.         jz      still.skip_write
  123.         movzx   eax,[eax+key1]
  124.         push    eax
  125.  
  126.         test    [secure_sel],1
  127.         jz      .lp2
  128.         m2m     [cur_editor.SelStart.X],[cur_editor.Caret.X]
  129.         m2m     [cur_editor.SelStart.Y],[cur_editor.Caret.Y]
  130.         jmp     .put
  131.   .lp2: call    delete_selection
  132.  
  133.         test    [auto_braces],1
  134.         jz      .put
  135.         cmp     al,'['
  136.         jne     @f
  137.         mov     al,']'
  138.         call    .lp3
  139.         dec     [cur_editor.Caret.X]
  140.         jmp     .put
  141.     @@: cmp     al,'('
  142.         jne     @f
  143.         mov     al,')'
  144.         call    .lp3
  145.         dec     [cur_editor.Caret.X]
  146.         jmp     .put
  147.     @@: cmp     al,'{'
  148.         jne     .put
  149.         mov     al,'}'
  150.         call    .lp3
  151.         dec     [cur_editor.Caret.X]
  152.  
  153.   .put: pop     eax
  154.         push    still editor_check_for_changes
  155.         inc     [cur_editor.SelStart.X]
  156.   .lp3: push    [cur_editor.Caret.X] eax
  157.         inc     dword[esp+4]
  158.         mov     eax,1
  159.         jmp     key.tab.direct
  160.  
  161. ;-----------------------------------------------------------------------------
  162. proc key.ctrl_a ;///// SELECT ALL DOCUMENT ///////////////////////////////////
  163. ;-----------------------------------------------------------------------------
  164.         xor     eax,eax
  165.         mov     [cur_editor.SelStart.X],eax
  166.         mov     [cur_editor.SelStart.Y],eax
  167.         mov     ecx,[cur_editor.Lines.Count]
  168.         dec     ecx
  169.         mov     [cur_editor.Caret.Y],ecx
  170.         call    get_line_offset
  171.         call    get_real_length
  172.         mov     [cur_editor.Caret.X],eax
  173.         call    draw_editor
  174.         ret
  175. endp
  176.  
  177. ;-----------------------------------------------------------------------------
  178. proc key.ctrl_o ;///// ENTER OPEN FILENAME ///////////////////////////////////
  179. ;-----------------------------------------------------------------------------
  180.         mov     [bot_mode2],0
  181.  
  182.   .direct:
  183.         cmp     [bot_mode2], 2
  184.         je      .ask
  185.         mov     [s_status],s_enter_filename
  186.         jmp     .ask1
  187.  
  188.    .ask:
  189.         mov     [s_status],s_ask_save
  190.   .ask1:
  191.         mov     [bot_mode],1
  192.         mov     [bot_dlg_height],16*2+4*2-1
  193.         mov     [bot_dlg_handler],osdlg_handler
  194.         mov     [focused_tb],tb_opensave
  195.  
  196.     @@: mov     al,[tb_opensave.length]
  197.         mov     [tb_opensave.pos.x],al
  198.         mov     [tb_opensave.sel.x],0
  199.         mov     [tb_casesen],0;1
  200.         call    drawwindow
  201.         ret
  202. endp
  203.  
  204. ;-----------------------------------------------------------------------------
  205. proc key.ctrl_s ;///// ENTER SAVE FILENAME ///////////////////////////////////
  206. ;-----------------------------------------------------------------------------
  207.         cmp     [cur_editor.FilePath], 0
  208.         je      key.shift_ctrl_s
  209.         cmp     [cur_editor.Modified],0
  210.         je      .exit
  211.         call    save_file
  212.         call    drawwindow
  213.   .exit:
  214.         ret
  215.  
  216.     key.shift_ctrl_s:
  217.         mov     [bot_mode2],1
  218.         jmp     key.ctrl_o.direct
  219. endp
  220.  
  221. ;-----------------------------------------------------------------------------
  222. proc key.ctrl_n ;///// CREATE NEW FILE (TAB) /////////////////////////////////
  223. ;-----------------------------------------------------------------------------
  224.         call    create_tab
  225.         ret
  226. endp
  227.  
  228. ;-----------------------------------------------------------------------------
  229. proc key.ctrl_f ;///// ENTER KEYWORD TO FIND /////////////////////////////////
  230. ;-----------------------------------------------------------------------------
  231.         mov     [bot_mode2],0
  232.         mov     [bot_dlg_height],16*2+4*2-1
  233.  
  234.         mov     [s_status],s_enter_text_to_find
  235.  
  236.   .direct:
  237.         mov     [bot_mode],1
  238.         mov     [bot_dlg_handler],finddlg_handler
  239.         mov     [focused_tb],tb_find
  240.  
  241.         mov     ecx,[s_search.size]
  242.         mov     [tb_find.length],cl
  243.         jecxz   @f
  244.         mov     esi,s_search
  245.         mov     edi,tb_find.text
  246.         cld
  247.         rep     movsb
  248.  
  249.     @@: mov     al,[tb_find.length]
  250.         mov     [tb_find.pos.x],al
  251.         mov     [tb_find.sel.x],0
  252.         mov     [tb_casesen],0
  253.         call    drawwindow
  254.         ret
  255. endp
  256.  
  257. proc key.ctrl_h
  258.         mov     [bot_mode2],1
  259.         mov     [bot_dlg_height],16*3+4*2+1
  260.  
  261.         mov     [s_status],s_enter_text_to_replace
  262.  
  263.         jmp     key.ctrl_f.direct
  264. endp
  265.  
  266. proc key.ctrl_g
  267.         ret
  268. @^
  269.         mov     [bot_mode2],0
  270.         mov     [bot_dlg_height],16*2+4*2-1
  271.  
  272.         mov     [bot_mode],1
  273.         mov     [bot_dlg_handler],gotodlg_handler
  274.         mov     [focused_tb],tb_gotorow
  275.  
  276.         mov     al,[tb_gotorow.length]
  277.         mov     [tb_gotorow.pos.x],al
  278.         mov     [tb_gotorow.sel.x],0
  279.         mov     [tb_casesen],0
  280.         call    drawwindow
  281.         ret
  282. ^@
  283. endp
  284.  
  285. ;-----------------------------------------------------------------------------
  286. proc key.ctrl_left ;///// GO TO PREVIOUS WORD ////////////////////////////////
  287. ;-----------------------------------------------------------------------------
  288.         call    clear_selection
  289.  
  290. ;-----------------------------------------------------------------------------
  291.      key.shift_ctrl_left: ;///// GO TO PREVIOUS WORD, WITH SELECTION /////////
  292. ;-----------------------------------------------------------------------------
  293.         mov     ebx,[cur_editor.Caret.Y]
  294.         mov     edx,[cur_editor.Caret.X]
  295.         cld
  296.         mov     ecx,ebx
  297.         call    get_line_offset
  298.   .lp1: cmp     edx,[esi+EDITOR_LINE_DATA.Size]
  299.         jle     @f
  300.         mov     edx,[esi+EDITOR_LINE_DATA.Size]
  301.     @@: dec     edx
  302.         jl      .nx1
  303.         add     esi,sizeof.EDITOR_LINE_DATA
  304.         add     esi,edx
  305.         mov     ecx,edx
  306.     @@: push    ecx
  307.         mov     edi,symbols_ex
  308.         mov     ecx,symbols_ex.size+symbols.size
  309.         mov     al,[esi]
  310.         dec     esi
  311.         repne   scasb
  312.         pop     ecx
  313.         jne     @f
  314.         dec     edx
  315.         dec     ecx
  316.         jnz     @b
  317.   .nx1: dec     ebx
  318.         js      .exit.2
  319.         mov     ecx,ebx
  320.         call    get_line_offset
  321.         mov     edx,[esi+EDITOR_LINE_DATA.Size]
  322.         dec     edx
  323.         jmp     .lp1
  324.     @@:
  325.         mov     ecx,ebx
  326.         call    get_line_offset
  327.   .lp2: cmp     edx,[esi+EDITOR_LINE_DATA.Size]
  328.         jle     @f
  329.         mov     edx,[esi+EDITOR_LINE_DATA.Size]
  330.     @@: or      edx,edx
  331.         jl      .nx2
  332.         add     esi,sizeof.EDITOR_LINE_DATA
  333.         add     esi,edx
  334.     @@: mov     edi,symbols_ex
  335.         mov     ecx,symbols_ex.size+symbols.size
  336.         mov     al,[esi]
  337.         dec     esi
  338.         repne   scasb
  339.         je      @f
  340.         dec     edx
  341.         jns     @b
  342.         jmp     @f
  343.   .nx2: dec     ebx
  344.         js      .exit.2
  345.         mov     ecx,ebx
  346.         call    get_line_offset
  347.         mov     edx,[esi+EDITOR_LINE_DATA.Size]
  348.         dec     edx
  349.         jmp     .lp2
  350.     @@:
  351.         inc     edx
  352.         mov     [cur_editor.Caret.Y],ebx
  353.         mov     [cur_editor.Caret.X],edx
  354.         test    [chr],KM_SHIFT
  355.         jnz     @f
  356.         mov     [cur_editor.SelStart.Y],ebx
  357.         mov     [cur_editor.SelStart.X],edx
  358.     @@: sub     ebx,[cur_editor.TopLeft.Y]
  359.         jge     @f
  360.         add     [cur_editor.TopLeft.Y],ebx
  361.     @@: mov     eax,edx
  362.         sub     eax,[cur_editor.TopLeft.X]
  363.         cmp     eax,[columns.scr]
  364.         jl      @f
  365.         sub     eax,[columns.scr]
  366.         inc     eax
  367.         add     [cur_editor.TopLeft.X],eax
  368.         jmp     .exit
  369.     @@: cmp     edx,[cur_editor.TopLeft.X]
  370.         jge     .exit
  371.         mov     [cur_editor.TopLeft.X],edx
  372.   .exit:
  373.         call    editor_check_for_changes
  374.   .exit.2:
  375.         ret
  376. endp
  377.  
  378. ;-----------------------------------------------------------------------------
  379. proc key.ctrl_right ;///// GO TO NEXT WORD ///////////////////////////////////
  380. ;-----------------------------------------------------------------------------
  381.         call    clear_selection
  382.  
  383. ;-----------------------------------------------------------------------------
  384.      key.shift_ctrl_right: ;///// GO TO NEXT WORD, WITH SELECTION ////////////
  385. ;-----------------------------------------------------------------------------
  386.         mov     ebx,[cur_editor.Caret.Y]
  387.         mov     edx,[cur_editor.Caret.X]
  388.         cld
  389.   .lp1: mov     ecx,ebx
  390.         call    get_line_offset
  391.         mov     ecx,[esi+EDITOR_LINE_DATA.Size]
  392.         cmp     edx,ecx
  393.         jge     .nx1
  394.         add     esi,sizeof.EDITOR_LINE_DATA
  395.         add     esi,edx
  396.         sub     ecx,edx
  397.     @@: push    ecx
  398.         mov     edi,symbols_ex
  399.         mov     ecx,symbols_ex.size+symbols.size
  400.         lodsb
  401.         repne   scasb
  402.         pop     ecx
  403.         je      @f
  404.         inc     edx
  405.         dec     ecx
  406.         jnz     @b
  407.   .nx1: inc     ebx
  408.         cmp     ebx,[cur_editor.Lines.Count]
  409.         jge     .exit.2
  410.         xor     edx,edx
  411.         jmp     .lp1
  412.     @@:
  413.  
  414.   .lp2: mov     ecx,ebx
  415.         call    get_line_offset
  416.         mov     ecx,[esi+EDITOR_LINE_DATA.Size]
  417.         cmp     edx,ecx
  418.         jge     .nx2
  419.         add     esi,sizeof.EDITOR_LINE_DATA
  420.         add     esi,edx
  421.         sub     ecx,edx
  422.     @@: push    ecx
  423.         mov     edi,symbols_ex
  424.         mov     ecx,symbols_ex.size+symbols.size
  425.         lodsb
  426.         repne   scasb
  427.         pop     ecx
  428.         jne     @f
  429.         inc     edx
  430.         dec     ecx
  431.         jnz     @b
  432.   .nx2: inc     ebx
  433.         cmp     ebx,[cur_editor.Lines.Count]
  434.         jge     .exit.2
  435.         xor     edx,edx
  436.         jmp     .lp2
  437.     @@:
  438.         mov     [cur_editor.Caret.Y],ebx
  439.         mov     [cur_editor.Caret.X],edx
  440.         test    [chr],KM_SHIFT
  441.         jnz     @f
  442.         mov     [cur_editor.SelStart.Y],ebx
  443.         mov     [cur_editor.SelStart.X],edx
  444.     @@: sub     ebx,[cur_editor.TopLeft.Y]
  445.         cmp     ebx,[lines.scr]
  446.         jl      @f
  447.         sub     ebx,[lines.scr]
  448.         inc     ebx
  449.         add     [cur_editor.TopLeft.Y],ebx
  450.     @@: mov     eax,edx
  451.         sub     eax,[cur_editor.TopLeft.X]
  452.         cmp     eax,[columns.scr]
  453.         jl      @f
  454.         sub     eax,[columns.scr]
  455.         inc     eax
  456.         add     [cur_editor.TopLeft.X],eax
  457.         jmp     .exit
  458.     @@: cmp     edx,[cur_editor.TopLeft.X]
  459.         jge     .exit
  460.         mov     [cur_editor.TopLeft.X],edx
  461.   .exit:
  462.         call    editor_check_for_changes
  463.   .exit.2:
  464.         ret
  465. endp
  466.  
  467. ;-----------------------------------------------------------------------------
  468. proc key.ctrl_x
  469.         cmp     [sel.selected],0
  470.         je      @f
  471.         call    key.ctrl_c
  472.         call    key.del
  473.         mov     [cur_editor.Modified],1
  474.     @@: ret
  475. endp
  476.  
  477. ;-----------------------------------------------------------------------------
  478. proc key.ctrl_c
  479.         mov     [copy_size],0
  480.         cmp     [sel.selected],0
  481.         je      .exit
  482.  
  483.         call    get_selection_size
  484.         stdcall mem.ReAlloc,[copy_buf],eax
  485.         mov     [copy_buf],eax
  486.  
  487.         cld
  488.         mov     eax,[sel.begin.y]
  489.         cmp     eax,[sel.end.y]
  490.         je      .single_line
  491.         mov     ecx,[sel.begin.y]
  492.         call    get_line_offset
  493.         inc     ecx
  494.         push    ecx
  495.         mov     edi,[copy_buf]
  496.         call    get_real_length
  497.         sub     eax,[sel.begin.x]
  498.         jge     @f
  499.         xor     eax,eax
  500.     @@: add     esi,[sel.begin.x]
  501.         add     esi,sizeof.EDITOR_LINE_DATA
  502.         mov     [edi+EDITOR_LINE_DATA.Size],eax
  503.         add     edi,sizeof.EDITOR_LINE_DATA
  504.         mov     ecx,eax
  505.         jecxz   @f
  506.         rep     movsb
  507.     @@: mov     ecx,[sel.end.y]
  508.         call    get_line_offset
  509.         pop     ecx
  510.         cmp     ecx,[sel.end.y]
  511.         je      @f
  512.         mov     eax,esi
  513.         call    get_line_offset
  514.         sub     eax,esi
  515.         mov     ecx,eax
  516.         rep     movsb
  517.         mov     ecx,[sel.end.y]
  518.     @@: call    get_line_offset
  519.         mov     eax,[esi+EDITOR_LINE_DATA.Size]
  520.         add     esi,sizeof.EDITOR_LINE_DATA
  521.         cmp     eax,[sel.end.x]
  522.         jle     @f
  523.         mov     eax,[sel.end.x]
  524.     @@: mov     ebx,edi
  525.         mov     [edi+EDITOR_LINE_DATA.Size],eax
  526.         add     edi,sizeof.EDITOR_LINE_DATA
  527.         mov     ecx,eax
  528.         jecxz   @f
  529.         rep     movsb
  530.         sub     eax,[sel.end.x]
  531.         jz      @f
  532.         neg     eax
  533.         mov     ecx,eax
  534.         add     [ebx],eax
  535.         mov     al,' '
  536.         rep     stosb
  537.     @@: sub     edi,[copy_buf]
  538.         mov     [copy_size],edi
  539.         mov     eax,[sel.end.y]
  540.         sub     eax,[sel.begin.y]
  541.         inc     eax
  542.         mov     [copy_count],eax
  543.   .exit:
  544.         ret
  545.  
  546.   .single_line:
  547.         mov     eax,[sel.end.x]
  548.         sub     eax,[sel.begin.x]
  549.         mov     edi,[copy_buf]
  550.         mov     [edi+EDITOR_LINE_DATA.Size],eax
  551.         add     edi,sizeof.EDITOR_LINE_DATA
  552.         mov     ecx,[sel.begin.y]
  553.         call    get_line_offset
  554.         mov     ebx,[sel.begin.x]
  555.         mov     ecx,[sel.end.x]
  556.         cmp     ebx,[esi+EDITOR_LINE_DATA.Size]
  557.         jge     .add_spaces
  558.         cmp     ecx,[esi+EDITOR_LINE_DATA.Size]
  559.         jle     .lp1
  560.         mov     ecx,[esi+EDITOR_LINE_DATA.Size]
  561.   .lp1: sub     ecx,[sel.begin.x]
  562.         sub     eax,ecx
  563.         lea     esi,[esi+ebx+sizeof.EDITOR_LINE_DATA]
  564.         rep     movsb
  565.  
  566.   .add_spaces:
  567.         mov     ecx,eax
  568.         mov     al,' '
  569.         jecxz   @b
  570.         rep     stosb
  571.         jmp     @b
  572. endp
  573.  
  574. ;-----------------------------------------------------------------------------
  575. proc key.ctrl_v
  576.         cmp     [copy_size],0
  577.         je      .exit
  578.  
  579.         call    delete_selection
  580.  
  581.         mov     eax,[copy_size]
  582.         call    editor_realloc_lines
  583.  
  584.         mov     ebx,[cur_editor.Lines.Size]
  585.         add     ebx,[copy_size]
  586.         mov     [cur_editor.Lines.Size],ebx
  587.         stdcall mem.ReAlloc,[cur_editor.Lines],ebx
  588.         mov     [cur_editor.Lines],eax
  589.  
  590.         mov     ecx,[cur_editor.Caret.Y]
  591.         call    get_line_offset
  592.         pushd   [esi+EDITOR_LINE_DATA.Size] esi
  593.         mov     ecx,[cur_editor.Caret.X]
  594.         call    line_add_spaces
  595.         add     [esp],eax
  596.         add     esi,eax
  597.         mov     ecx,[copy_size]
  598.         sub     ecx,sizeof.EDITOR_LINE_DATA
  599.         mov     edi,[cur_editor.Lines]
  600.         add     edi,[cur_editor.Lines.Size] ;*** add edi,[edi-4]
  601.         dec     edi
  602.         mov     eax,esi
  603.         mov     esi,edi
  604.         sub     esi,ecx
  605.         lea     ecx,[eax+sizeof.EDITOR_LINE_DATA]
  606.         add     ecx,[cur_editor.Caret.X]
  607.         neg     ecx
  608.         lea     ecx,[esi+ecx+1]
  609.         std
  610.         rep     movsb
  611.  
  612.         mov     ecx,[copy_count]
  613.         dec     ecx
  614.         jz      .single_line
  615.  
  616.         cld
  617.         pop     edi
  618.         add     edi,sizeof.EDITOR_LINE_DATA
  619.         mov     esi,[copy_buf]
  620.         mov     eax,[esi+EDITOR_LINE_DATA.Size]
  621.         add     esi,sizeof.EDITOR_LINE_DATA
  622.  
  623.         mov     ebx,[cur_editor.Caret.X]
  624.         add     eax,ebx
  625.         mov     [edi-sizeof.EDITOR_LINE_DATA+EDITOR_LINE_DATA.Size],eax
  626.         mov     [edi-sizeof.EDITOR_LINE_DATA+EDITOR_LINE_DATA.Flags],EDITOR_LINE_FLAG_MOFIFIED
  627.         sub     eax,ebx
  628.         call    .check_columns
  629.         add     edi,ebx
  630.     @@: push    ecx
  631.         mov     ecx,eax
  632.         rep     movsb
  633.         mov     eax,[esi+EDITOR_LINE_DATA.Size]
  634.         add     esi,sizeof.EDITOR_LINE_DATA
  635.         mov     [edi+EDITOR_LINE_DATA.Size],eax
  636.         mov     [edi+EDITOR_LINE_DATA.Flags],EDITOR_LINE_FLAG_MOFIFIED
  637.         add     edi,sizeof.EDITOR_LINE_DATA
  638.         pop     ecx
  639.         loop    @b
  640.  
  641.         pop     ecx
  642.         sub     ecx,ebx
  643.         add     [edi-sizeof.EDITOR_LINE_DATA+EDITOR_LINE_DATA.Size],ecx
  644.         call    .check_columns
  645.         mov     ecx,eax
  646.         rep     movsb
  647.  
  648.         mov     [cur_editor.Caret.X],eax
  649.         mov     [cur_editor.SelStart.X],eax
  650.         mov     eax,[copy_count]
  651.         dec     eax
  652.         add     [cur_editor.Caret.Y],eax
  653.         add     [cur_editor.SelStart.Y],eax
  654.         add     [cur_editor.Lines.Count],eax
  655.  
  656.         mov     [cur_editor.Modified],1
  657.         jmp     .exit
  658.  
  659.   .single_line:
  660.         cld
  661.         pop     edi
  662.         add     edi,sizeof.EDITOR_LINE_DATA
  663.         mov     esi,[copy_buf]
  664.         mov     eax,[esi+EDITOR_LINE_DATA.Size]
  665.         add     esi,sizeof.EDITOR_LINE_DATA
  666.         add     [edi-sizeof.EDITOR_LINE_DATA+EDITOR_LINE_DATA.Size],eax
  667.         and     [edi-sizeof.EDITOR_LINE_DATA+EDITOR_LINE_DATA.Flags],not EDITOR_LINE_FLAG_SAVED
  668.         or      [edi-sizeof.EDITOR_LINE_DATA+EDITOR_LINE_DATA.Flags],EDITOR_LINE_FLAG_MOFIFIED
  669.         call    .check_columns
  670.         add     edi,[cur_editor.Caret.X]
  671.         add     esp,4
  672.         mov     ecx,eax
  673.         rep     movsb
  674.  
  675.         add     [cur_editor.Caret.X],eax
  676.         add     [cur_editor.SelStart.X],eax
  677.  
  678.         mov     [cur_editor.Modified],1
  679.  
  680.   .exit:
  681.         ret
  682.  
  683.   .check_columns:
  684.         push    eax
  685.         mov     eax,[edi-sizeof.EDITOR_LINE_DATA+EDITOR_LINE_DATA.Size]
  686.         cmp     eax,[cur_editor.Columns.Count]
  687.         jbe     @f
  688.         mov     [cur_editor.Columns.Count],eax
  689.     @@: pop     eax
  690.         ret
  691. endp
  692.  
  693. ;-----------------------------------------------------------------------------
  694. proc key.ctrl_d ;///// INSERT SEPARATOR //////////////////////////////////////
  695. ;-----------------------------------------------------------------------------
  696.         mov     eax,90+sizeof.EDITOR_LINE_DATA
  697.         call    editor_realloc_lines
  698.  
  699.         mov     ecx,[cur_editor.Caret.Y]
  700.         call    get_line_offset
  701.         mov     ebx,esi
  702.  
  703.         mov     ecx,[cur_editor.Lines.Count]
  704.         call    get_line_offset
  705.         lea     edi,[esi+90+sizeof.EDITOR_LINE_DATA]
  706.         lea     ecx,[esi+sizeof.EDITOR_LINE_DATA]
  707.         sub     ecx,ebx
  708.         std
  709.         rep     movsb
  710.  
  711.         lea     edi,[ebx+sizeof.EDITOR_LINE_DATA+1]
  712.         mov     [ebx+EDITOR_LINE_DATA.Size],90
  713.         mov     al,ASEPC
  714.         mov     ecx,79
  715.         cld
  716.         rep     stosb
  717.         mov     al,' '
  718.         mov     ecx,10
  719.         rep     stosb
  720.         mov     byte[ebx+sizeof.EDITOR_LINE_DATA],';'
  721.  
  722.         inc     [cur_editor.Lines.Count]
  723.         inc     [cur_editor.Caret.Y]
  724.         m2m     [cur_editor.SelStart.Y],[cur_editor.Caret.Y]
  725.  
  726.         mov     [cur_editor.Modified],1
  727.  
  728.   .exit:
  729.         ret
  730. endp
  731.  
  732. ;-----------------------------------------------------------------------------
  733. proc key.ctrl_y ;///// DELETE CURRENT LINE ///////////////////////////////////
  734. ;-----------------------------------------------------------------------------
  735.         mov     eax,[cur_editor.Caret.Y]
  736.         inc     eax
  737.         cmp     eax,[cur_editor.Lines.Count]
  738.         jge     .exit
  739.  
  740.         mov     ecx,[cur_editor.Caret.Y]
  741.         call    get_line_offset
  742.         mov     edi,esi
  743.         mov     eax,[esi+EDITOR_LINE_DATA.Size]
  744.         lea     esi,[esi+eax+sizeof.EDITOR_LINE_DATA]
  745.         push    eax
  746.  
  747.         dec     [cur_editor.Lines.Count]
  748.         mov     ecx,[cur_editor.Lines]
  749.         add     ecx,[cur_editor.Lines.Size] ;*** add ecx,[ecx-4]
  750.         sub     ecx,esi
  751.         shr     ecx,2
  752.         cld
  753.         rep     movsd
  754.  
  755.         pop     eax
  756.         add     eax,sizeof.EDITOR_LINE_DATA
  757.         neg     eax
  758.         call    editor_realloc_lines
  759.  
  760.         m2m     [cur_editor.SelStart.X],[cur_editor.Caret.X]
  761.         m2m     [cur_editor.SelStart.Y],[cur_editor.Caret.Y]
  762.  
  763.         mov     [cur_editor.Modified],1
  764.  
  765.   .exit:
  766.         ret
  767. endp
  768.  
  769. ;-----------------------------------------------------------------------------
  770. proc key.up ;///// GO TO PREVIOUS LINE ///////////////////////////////////////
  771. ;-----------------------------------------------------------------------------
  772.         call    clear_selection
  773.  
  774. ;-----------------------------------------------------------------------------
  775.      key.shift_up: ;///// GO TO PREVIOUS LINE, WITH SELECTION ////////////////
  776. ;-----------------------------------------------------------------------------
  777.         mov     eax,[cur_editor.Caret.Y]
  778.         dec     eax
  779.         jns     @f
  780.         xor     eax,eax
  781.     @@: mov     ecx,[cur_editor.TopLeft.Y]
  782.         cmp     eax,ecx
  783.         jae     @f
  784.         dec     ecx
  785.         jns     @f
  786.         xor     ecx,ecx
  787.     @@: test    [chr],KM_SHIFT
  788.         jnz     @f
  789.         mov     [cur_editor.SelStart.Y],eax
  790.     @@: mov     [cur_editor.Caret.Y],eax
  791.         mov     [cur_editor.TopLeft.Y],ecx
  792.  
  793.   .exit:
  794.         ret
  795. endp
  796.  
  797. ;-----------------------------------------------------------------------------
  798. proc key.down ;///// GO TO NEXT LINE /////////////////////////////////////////
  799. ;-----------------------------------------------------------------------------
  800.         call    clear_selection
  801.  
  802. ;-----------------------------------------------------------------------------
  803.      key.shift_down: ;///// GO TO NEXT LINE, WITH SELECTION //////////////////
  804. ;-----------------------------------------------------------------------------
  805.  
  806.         mov     eax,[cur_editor.Caret.Y]
  807.         inc     eax
  808.         cmp     eax,[cur_editor.Lines.Count]
  809.         jb      @f
  810.         dec     eax
  811.     @@: mov     ecx,[cur_editor.TopLeft.Y]
  812.         mov     edx,eax
  813.         sub     edx,ecx
  814.         cmp     edx,[lines.scr]
  815.         jb      @f
  816.         inc     ecx
  817.     @@: test    [chr],KM_SHIFT
  818.         jnz     @f
  819.         mov     [cur_editor.SelStart.Y],eax
  820.     @@: mov     [cur_editor.Caret.Y],eax
  821.         mov     [cur_editor.TopLeft.Y],ecx
  822.  
  823.   .exit:
  824.         ret
  825. endp
  826.  
  827. ;-----------------------------------------------------------------------------
  828. proc key.left ;///// GO TO PREVIOUS CHAR /////////////////////////////////////
  829. ;-----------------------------------------------------------------------------
  830.         call    clear_selection
  831.  
  832. ;-----------------------------------------------------------------------------
  833.      key.shift_left: ;///// GO TO PREVIOUS CHAR, WITH SELECTION //////////////
  834. ;-----------------------------------------------------------------------------
  835.         mov     eax,[cur_editor.Caret.X]
  836.         dec     eax
  837.         jns     @f
  838.         inc     eax
  839.     @@: test    [chr],KM_SHIFT
  840.         jnz     @f
  841.         mov     [cur_editor.SelStart.X],eax
  842.     @@: mov     [cur_editor.Caret.X],eax
  843.  
  844.   .exit:
  845.         ret
  846. endp
  847.  
  848. ;-----------------------------------------------------------------------------
  849. proc key.right ;///// GO TO NEXT CHAR ////////////////////////////////////////
  850. ;-----------------------------------------------------------------------------
  851.         call    clear_selection
  852.  
  853. ;-----------------------------------------------------------------------------
  854.      key.shift_right: ;///// GO TO NEXT CHAR, WITH SELECTION /////////////////
  855. ;-----------------------------------------------------------------------------
  856.         mov     eax,[cur_editor.Caret.X]
  857.         inc     eax
  858.         cmp     eax,[cur_editor.Columns.Count]
  859.         jbe     @f
  860.         dec     eax
  861.     @@: test    [chr],KM_SHIFT
  862.         jnz     @f
  863.         mov     [cur_editor.SelStart.X],eax
  864.     @@: mov     [cur_editor.Caret.X],eax
  865.  
  866.   .exit:
  867.         ret
  868. endp
  869.  
  870. ;-----------------------------------------------------------------------------
  871. proc key.pgup ;///// GO TO PREVIOUS PAGE /////////////////////////////////////
  872. ;-----------------------------------------------------------------------------
  873.         call    clear_selection
  874.  
  875. ;-----------------------------------------------------------------------------
  876.      key.shift_pgup: ;///// GO TO PREVIOUS PAGE, WITH SELECTION //////////////
  877. ;-----------------------------------------------------------------------------
  878.         mov     edx,[lines.scr]
  879.         dec     edx
  880.         mov     eax,[cur_editor.Caret.Y]
  881.         mov     ecx,[cur_editor.TopLeft.Y]
  882.         sub     eax,edx
  883.         jns     @f
  884.         xor     eax,eax
  885.     @@: sub     ecx,edx
  886.         jns     @f
  887.         xor     ecx,ecx
  888.     @@: test    [chr],KM_SHIFT
  889.         jnz     @f
  890.         mov     [cur_editor.SelStart.Y],eax
  891.     @@: mov     [cur_editor.Caret.Y],eax
  892.         mov     [cur_editor.TopLeft.Y],ecx
  893.  
  894.   .exit:
  895.         ret
  896. endp
  897.  
  898. ;-----------------------------------------------------------------------------
  899. proc key.pgdn ;///// GO TO NEXT PAGE /////////////////////////////////////////
  900. ;-----------------------------------------------------------------------------
  901.         call    clear_selection
  902.  
  903. ;-----------------------------------------------------------------------------
  904.      key.shift_pgdn: ;///// GO TO NEXT PAGE, WITH SELECTION //////////////////
  905. ;-----------------------------------------------------------------------------
  906.         mov     edx,[lines.scr]
  907.         dec     edx
  908.         mov     eax,[cur_editor.Caret.Y]
  909.         mov     ecx,[cur_editor.TopLeft.Y]
  910.         add     eax,edx
  911.         add     ecx,edx
  912.         cmp     eax,[cur_editor.Lines.Count]
  913.         jb      @f
  914.         mov     eax,[cur_editor.Lines.Count]
  915.         dec     eax
  916.     @@: test    [chr],KM_SHIFT
  917.         jnz     @f
  918.         mov     [cur_editor.SelStart.Y],eax
  919.     @@: mov     [cur_editor.Caret.Y],eax
  920.         mov     [cur_editor.TopLeft.Y],ecx
  921.  
  922.   .exit:
  923.         ret
  924. endp
  925.  
  926. ;-----------------------------------------------------------------------------
  927. proc key.home ;///// GO TO LINE START ////////////////////////////////////////
  928. ;-----------------------------------------------------------------------------
  929.         call    clear_selection
  930.  
  931. ;-----------------------------------------------------------------------------
  932.      key.shift_home: ;///// GO TO LINE START, WITH SELECTION /////////////////
  933. ;-----------------------------------------------------------------------------
  934.         mov     [cur_editor.Caret.X],0
  935.         test    [chr],KM_SHIFT
  936.         jnz     @f
  937.         mov     [cur_editor.SelStart.X],0
  938.     @@:
  939.  
  940.   .exit:
  941.         ret
  942. endp
  943.  
  944. ;-----------------------------------------------------------------------------
  945. proc key.end ;///// GO TO LINE END ///////////////////////////////////////////
  946. ;-----------------------------------------------------------------------------
  947.         call    clear_selection
  948.  
  949. ;-----------------------------------------------------------------------------
  950.      key.shift_end: ;///// GO TO LINE END, WITH SELECTION ////////////////////
  951. ;-----------------------------------------------------------------------------
  952.         mov     ecx,[cur_editor.Caret.Y]
  953.         call    get_line_offset
  954.         call    get_real_length
  955.         mov     [cur_editor.Caret.X],eax
  956.         test    [chr],KM_SHIFT
  957.         jnz     @f
  958.         mov     [cur_editor.SelStart.X],eax
  959.     @@:
  960.  
  961.   .exit:
  962.         ret
  963. endp
  964.  
  965. ;-----------------------------------------------------------------------------
  966. proc key.ctrl_home ;///// GO TO PAGE START ///////////////////////////////////
  967. ;-----------------------------------------------------------------------------
  968.         call    clear_selection
  969.  
  970. ;-----------------------------------------------------------------------------
  971.      key.shift_ctrl_home: ;///// GO TO PAGE START, WITH SELECTION ////////////
  972. ;-----------------------------------------------------------------------------
  973.         mov     eax,[cur_editor.TopLeft.Y]
  974.         mov     ecx,eax
  975.         test    [chr],KM_SHIFT
  976.         jnz     @f
  977.         mov     [cur_editor.SelStart.Y],eax
  978.     @@: mov     [cur_editor.Caret.Y],eax
  979.         mov     [cur_editor.TopLeft.Y],ecx
  980.  
  981.   .exit:
  982.         ret
  983. endp
  984.  
  985. ;-----------------------------------------------------------------------------
  986. proc key.ctrl_end ;///// GO TO PAGE END //////////////////////////////////////
  987. ;-----------------------------------------------------------------------------
  988.         call    clear_selection
  989.  
  990. ;-----------------------------------------------------------------------------
  991.      key.shift_ctrl_end: ;///// GO TO PAGE END, WITH SELECTION ///////////////
  992. ;-----------------------------------------------------------------------------
  993.         mov     ecx,[cur_editor.TopLeft.Y]
  994.         mov     eax,[lines.scr]
  995.         cmp     eax,[cur_editor.Lines.Count]
  996.         jle     @f
  997.         mov     eax,[cur_editor.Lines.Count]
  998.     @@: add     eax,ecx
  999.         dec     eax
  1000.         test    [chr],KM_SHIFT
  1001.         jnz     @f
  1002.         mov     [cur_editor.SelStart.Y],eax
  1003.     @@: mov     [cur_editor.Caret.Y],eax
  1004.         mov     [cur_editor.TopLeft.Y],ecx
  1005.  
  1006.   .exit:
  1007.         ret
  1008. endp
  1009.  
  1010. ;-----------------------------------------------------------------------------
  1011. proc key.ctrl_pgup ;///// GO TO DOCUMENT START ///////////////////////////////
  1012. ;-----------------------------------------------------------------------------
  1013.         call    clear_selection
  1014.  
  1015. ;-----------------------------------------------------------------------------
  1016.      key.shift_ctrl_pgup: ;///// GO TO DOCUMENT START, WITH SELECTION ////////
  1017. ;-----------------------------------------------------------------------------
  1018.         xor     eax,eax
  1019.         mov     [cur_editor.TopLeft.Y],eax
  1020.         mov     [cur_editor.Caret.Y],eax
  1021.         test    [chr],KM_SHIFT
  1022.         jnz     @f
  1023.         mov     [cur_editor.SelStart.Y],eax
  1024.     @@:
  1025.  
  1026.   .exit:
  1027.         ret
  1028. endp
  1029.  
  1030. ;-----------------------------------------------------------------------------
  1031. proc key.ctrl_pgdn ;///// GO TO DOCUMENT END /////////////////////////////////
  1032. ;-----------------------------------------------------------------------------
  1033.         call    clear_selection
  1034.  
  1035. ;-----------------------------------------------------------------------------
  1036.      key.shift_ctrl_pgdn: ;///// GO TO DOCUMENT END, WITH SELECTION //////////
  1037. ;-----------------------------------------------------------------------------
  1038.         mov     eax,[cur_editor.Lines.Count]
  1039.         mov     [cur_editor.Caret.Y],eax
  1040.         sub     eax,[lines.scr]
  1041.         jns     @f
  1042.         xor     eax,eax
  1043.     @@: mov     [cur_editor.TopLeft.Y],eax
  1044.         dec     [cur_editor.Caret.Y]
  1045.         test    [chr],KM_SHIFT
  1046.         jnz     @f
  1047.         m2m     [cur_editor.SelStart.Y],[cur_editor.Caret.Y]
  1048.     @@:
  1049.  
  1050.   .exit:
  1051.         ret
  1052. endp
  1053.  
  1054. ;-----------------------------------------------------------------------------
  1055. proc key.del ;///// DELETE NEXT CHAR OR SELECTION ////////////////////////////
  1056. ;-----------------------------------------------------------------------------
  1057.         call    delete_selection
  1058.         jnc     .exit
  1059.  
  1060.         mov     ecx,[cur_editor.Caret.Y]
  1061.         call    get_line_offset
  1062.         and     [esi+EDITOR_LINE_DATA.Flags],not EDITOR_LINE_FLAG_SAVED
  1063.         or      [esi+EDITOR_LINE_DATA.Flags],EDITOR_LINE_FLAG_MOFIFIED
  1064.         lea     ebx,[esi+sizeof.EDITOR_LINE_DATA]
  1065.         mov     ebp,esi
  1066.  
  1067.         call    get_real_length
  1068.         or      eax,eax
  1069.         je      .line_up
  1070.  
  1071.         mov     ecx,[cur_editor.Caret.X]
  1072.         cmp     ecx,eax
  1073.         jae     .line_up
  1074.         lea     edi,[ebx+ecx]
  1075.         neg     ecx
  1076.         mov     eax,[ebp+EDITOR_LINE_DATA.Size]
  1077.         add     ecx,eax;[ebp]
  1078.         repe    scasb
  1079.         je      .line_up
  1080.  
  1081.         mov     edi,ebx
  1082.         mov     ecx,[cur_editor.Caret.X]
  1083.         add     edi,ecx
  1084.         lea     esi,[edi+1]
  1085.         neg     ecx
  1086.         mov     eax,[ebp+EDITOR_LINE_DATA.Size]
  1087.         add     ecx,eax;[ebp]
  1088.         dec     ecx
  1089.         rep     movsb
  1090.         mov     byte[edi],' '
  1091.  
  1092.         m2m     [cur_editor.SelStart.X],[cur_editor.Caret.X]
  1093.         m2m     [cur_editor.SelStart.Y],[cur_editor.Caret.Y]
  1094.         mov     [cur_editor.Modified],1
  1095.         ret
  1096.  
  1097.   .line_up:
  1098.         mov     eax,[cur_editor.Lines.Count]
  1099.         dec     eax
  1100.         cmp     eax,[cur_editor.Caret.Y]
  1101.         je      .exit
  1102.         mov     edi,[temp_buf]
  1103.         add     edi,sizeof.EDITOR_LINE_DATA
  1104.         mov     esi,ebx
  1105.         mov     ecx,[cur_editor.Caret.X]
  1106.         rep     movsb
  1107.         mov     ecx,[cur_editor.Caret.X]
  1108.         mov     eax,[temp_buf]
  1109.         mov     [eax+EDITOR_LINE_DATA.Size],ecx
  1110.         cmp     ecx,[ebp+EDITOR_LINE_DATA.Size]
  1111.         jbe     @f
  1112.         mov     eax,[ebp+EDITOR_LINE_DATA.Size]
  1113.         sub     ecx,eax
  1114.         sub     edi,ecx
  1115.         mov     al,' '
  1116.         rep     stosb
  1117.     @@: lea     esi,[ebx+sizeof.EDITOR_LINE_DATA]
  1118.         mov     eax,[ebp+EDITOR_LINE_DATA.Size]
  1119.         add     esi,eax
  1120.         mov     ecx,[esi-sizeof.EDITOR_LINE_DATA+EDITOR_LINE_DATA.Size]
  1121.         mov     eax,[temp_buf]
  1122.         add     [eax+EDITOR_LINE_DATA.Size],ecx
  1123.         or      [eax+EDITOR_LINE_DATA.Flags],EDITOR_LINE_FLAG_MOFIFIED
  1124.         rep     movsb
  1125.  
  1126.         mov     ecx,edi
  1127.         sub     ecx,[temp_buf]
  1128.  
  1129.         mov     esi,[temp_buf]
  1130.         call    get_real_length
  1131.         cmp     eax,[cur_editor.Columns.Count]
  1132.         jbe     @f
  1133.         mov     [cur_editor.Columns.Count],eax
  1134.     @@:
  1135.         push    ecx
  1136.         mov     edi,[cur_editor.Lines]
  1137.         add     edi,[cur_editor.Lines.Size] ;*** add edi,[edi-4]
  1138.         dec     edi
  1139.         lea     esi,[edi+sizeof.EDITOR_LINE_DATA*2] ; !!! CHECK THIS !!!
  1140.         sub     esi,ecx
  1141.         mov     eax,[ebp+EDITOR_LINE_DATA.Size]
  1142.         add     esi,eax
  1143.         mov     eax,[ebp+eax+sizeof.EDITOR_LINE_DATA+EDITOR_LINE_DATA.Size]
  1144.         add     esi,eax
  1145.         lea     ecx,[esi-sizeof.EDITOR_LINE_DATA]
  1146.         sub     ecx,ebp
  1147.         std
  1148.         cmp     esi,edi
  1149.         jb      @f
  1150.         jz      .lp1
  1151.         mov     edi,ebp
  1152.         add     edi,[esp]
  1153.         lea     esi,[ebp+sizeof.EDITOR_LINE_DATA*2] ; !!! CHECK THIS !!!
  1154.         mov     eax,[esi-sizeof.EDITOR_LINE_DATA*2+EDITOR_LINE_DATA.Size] ; !!! CHECK THIS !!!
  1155.         add     esi,eax
  1156.         mov     eax,[esi-sizeof.EDITOR_LINE_DATA+EDITOR_LINE_DATA.Size] ; !!! CHECK THIS !!!
  1157.         add     esi,eax
  1158.         mov     ecx,[cur_editor.Lines]
  1159.         add     ecx,[cur_editor.Lines.Size] ;*** add ecx,[ecx-4]
  1160.         sub     ecx,esi
  1161.         cld
  1162.     @@: rep     movsb
  1163.   .lp1: pop     ecx
  1164.         mov     esi,[temp_buf]
  1165.         mov     edi,ebp
  1166.         cld
  1167.         rep     movsb
  1168.  
  1169.   .ok.dec.lines:
  1170.         dec     [cur_editor.Lines.Count]
  1171.         mov     eax,[cur_editor.Lines.Count]
  1172.         cmp     [cur_editor.Caret.Y],eax
  1173.         jb      @f
  1174.         dec     eax
  1175.         mov     [cur_editor.Caret.Y],eax
  1176.     @@: m2m     [cur_editor.SelStart.X],[cur_editor.Caret.X]
  1177.         m2m     [cur_editor.SelStart.Y],[cur_editor.Caret.Y]
  1178.  
  1179.         mov     ecx,[cur_editor.Lines.Count]
  1180.         call    get_line_offset
  1181.         mov     eax,[esi+EDITOR_LINE_DATA.Size]
  1182.         lea     esi,[esi+eax+sizeof.EDITOR_LINE_DATA]
  1183.         mov     eax,[cur_editor.Lines]
  1184.         add     eax,[cur_editor.Lines.Size] ;*** add eax,[eax-4]
  1185.         sub     esi,eax
  1186.         lea     eax,[esi+4096]
  1187.         call    editor_realloc_lines
  1188.  
  1189.         mov     [cur_editor.Modified],1
  1190.  
  1191.   .exit:
  1192.         ret
  1193. endp
  1194.  
  1195. ;-----------------------------------------------------------------------------
  1196. proc key.ins ;///// TOGGLE INSERT/OVERWRITE MODE /////////////////////////////
  1197. ;-----------------------------------------------------------------------------
  1198.         xor     [ins_mode],1
  1199.         mov     eax,[cur_editor.Caret.Y]
  1200.         mov     ebx,eax
  1201.         call    draw_editor_text.part
  1202.         call    draw_editor_caret
  1203.         ret
  1204. endp
  1205.  
  1206. ;-----------------------------------------------------------------------------
  1207. proc key.bkspace ;///// DELETE PREVIOUS CHAR OR SELECTION ////////////////////
  1208. ;-----------------------------------------------------------------------------
  1209.         call    delete_selection
  1210.         jnc     key.del.exit
  1211.  
  1212.         mov     eax,[cur_editor.Caret.X]
  1213.         dec     eax
  1214.         js      .line_up
  1215.  
  1216.         dec     [cur_editor.Caret.X]
  1217.         mov     ecx,[cur_editor.Caret.Y]
  1218.         call    get_line_offset
  1219.         and     [esi+EDITOR_LINE_DATA.Flags],not EDITOR_LINE_FLAG_SAVED
  1220.         or      [esi+EDITOR_LINE_DATA.Flags],EDITOR_LINE_FLAG_MOFIFIED
  1221.  
  1222.         mov     ebx,eax
  1223.         call    get_real_length
  1224.         cmp     eax,[cur_editor.Caret.X]
  1225.         jae     @f
  1226.         m2m     [cur_editor.SelStart.X],[cur_editor.Caret.X]
  1227.         mov     [cur_editor.Modified],1
  1228.         ret
  1229.  
  1230.     @@: lea     edi,[esi+sizeof.EDITOR_LINE_DATA+ebx]
  1231.         mov     ecx,ebx
  1232.         neg     ecx
  1233.         mov     eax,[esi+EDITOR_LINE_DATA.Size]
  1234.         add     ecx,eax
  1235.         dec     ecx
  1236.         lea     esi,[edi+1]
  1237.         cld
  1238.         rep     movsb
  1239.         mov     byte[edi],' '
  1240.  
  1241.         m2m     [cur_editor.SelStart.X],[cur_editor.Caret.X]
  1242.         m2m     [cur_editor.SelStart.Y],[cur_editor.Caret.Y]
  1243.         mov     [cur_editor.Modified],1
  1244.         ret
  1245.  
  1246.   .line_up:
  1247.         cmp     [cur_editor.Caret.Y],0
  1248.         jne     @f
  1249.         ret
  1250.     @@: mov     ecx,[cur_editor.Caret.Y]
  1251.         dec     ecx
  1252.         call    get_line_offset
  1253.         and     [esi+EDITOR_LINE_DATA.Flags],not EDITOR_LINE_FLAG_SAVED
  1254.         or      [esi+EDITOR_LINE_DATA.Flags],EDITOR_LINE_FLAG_MOFIFIED
  1255.  
  1256.         mov     ebp,esi
  1257.         lea     ebx,[esi+sizeof.EDITOR_LINE_DATA]
  1258.         mov     ecx,[ebp+EDITOR_LINE_DATA.Size]
  1259.     @@: cmp     byte[ebx+ecx-1],' '
  1260.         jne     @f
  1261.         dec     ecx
  1262.         jg      @b
  1263.     @@: mov     [cur_editor.Caret.X],ecx
  1264.         dec     [cur_editor.Caret.Y]
  1265.         cld
  1266.         jmp     key.del.line_up
  1267. endp
  1268.  
  1269. ;-----------------------------------------------------------------------------
  1270. proc key.tab ;///// TABULATE /////////////////////////////////////////////////
  1271. ;-----------------------------------------------------------------------------
  1272.         call    delete_selection
  1273.         mov     eax,[cur_editor.Caret.X]
  1274.  
  1275.         mov     ecx,eax
  1276.         add     eax,ATABW
  1277.         and     eax,not(ATABW-1)
  1278.         push    eax ' '
  1279.         sub     eax,ecx
  1280.   .direct:
  1281.         push    eax
  1282.         call    editor_realloc_lines
  1283.         pop     eax
  1284.         mov     ecx,[cur_editor.Caret.Y]
  1285.         call    get_line_offset
  1286.         and     [esi+EDITOR_LINE_DATA.Flags],not EDITOR_LINE_FLAG_SAVED
  1287.         or      [esi+EDITOR_LINE_DATA.Flags],EDITOR_LINE_FLAG_MOFIFIED
  1288.  
  1289.         xchg    eax,ecx
  1290.  
  1291.         call    get_real_length
  1292.         cmp     eax,[cur_editor.Caret.X]
  1293.         jae     @f
  1294.         mov     eax,[cur_editor.Caret.X]
  1295.     @@: mov     edx,[esi+EDITOR_LINE_DATA.Size]
  1296.         sub     edx,eax
  1297.         cmp     ecx,edx
  1298.         jl      @f
  1299.         push    eax
  1300.         mov     eax,10
  1301.         call    editor_realloc_lines
  1302.         add     esi,eax
  1303.         pop     eax
  1304.         pushad
  1305.         mov     ecx,[cur_editor.Lines]
  1306.         add     ecx,[cur_editor.Lines.Size] ;*** add ecx,[ecx-4]
  1307.         dec     ecx
  1308.         mov     edi,ecx
  1309.         add     ecx,-10+1
  1310.         mov     eax,[esi+EDITOR_LINE_DATA.Size]
  1311.         lea     eax,[esi+eax+sizeof.EDITOR_LINE_DATA]
  1312.         sub     ecx,eax
  1313.         lea     esi,[edi-10]
  1314.         std
  1315.         rep     movsb
  1316.         mov     ecx,10
  1317.         mov     al,' '
  1318.         rep     stosb
  1319.         popad
  1320.         add     [esi+EDITOR_LINE_DATA.Size],10
  1321.         jmp     @b
  1322.     @@: lea     ebx,[esi+sizeof.EDITOR_LINE_DATA]
  1323.         push    ecx
  1324.         mov     edi,[esi+EDITOR_LINE_DATA.Size]
  1325.         lea     edi,[ebx+edi-1]
  1326.         mov     esi,edi
  1327.         sub     esi,ecx
  1328.         lea     ecx,[esi+1]
  1329.         sub     ecx,ebx
  1330.         sub     ecx,[cur_editor.Caret.X]
  1331.         std
  1332.         rep     movsb
  1333.   .ok:  pop     ecx
  1334.         pop     eax
  1335.         rep     stosb
  1336.         cld
  1337.         pop     [cur_editor.Caret.X]
  1338.         lea     esi,[ebx-sizeof.EDITOR_LINE_DATA]
  1339.         call    get_real_length
  1340.         cmp     eax,[cur_editor.Caret.X]
  1341.         jae     @f
  1342.         mov     eax,[cur_editor.Caret.X]
  1343.     @@: cmp     eax,[cur_editor.Columns.Count]
  1344.         jbe     @f
  1345.         mov     [cur_editor.Columns.Count],eax
  1346.     @@: m2m     [cur_editor.SelStart.X],[cur_editor.Caret.X]
  1347.         m2m     [cur_editor.SelStart.Y],[cur_editor.Caret.Y]
  1348.         mov     [cur_editor.Modified],1
  1349.  
  1350.   .exit:
  1351.         ret
  1352. endp
  1353.  
  1354. ;-----------------------------------------------------------------------------
  1355. proc key.return ;///// CARRIAGE RETURN ///////////////////////////////////////
  1356. ;-----------------------------------------------------------------------------
  1357.         call    delete_selection
  1358.  
  1359.         mov     eax,14
  1360.         call    editor_realloc_lines
  1361.  
  1362.         mov     ecx,[cur_editor.Caret.Y]
  1363.         call    get_line_offset
  1364.  
  1365.         mov     ebx,[cur_editor.Caret.X]
  1366.         cmp     ebx,[esi+EDITOR_LINE_DATA.Size]
  1367.         jb      @f
  1368.         mov     ebx,[esi+EDITOR_LINE_DATA.Size]
  1369.         dec     ebx
  1370.         jns     @f
  1371.         xor     ebx,ebx
  1372.     @@:
  1373.         cld
  1374.  
  1375.         mov     edi,[temp_buf]
  1376.         mov     ebp,esi
  1377.         lea     ecx,[ebx+1]
  1378.     @@: dec     ecx
  1379.         jz      @f
  1380.         cmp     byte[esi+ecx+sizeof.EDITOR_LINE_DATA-1],' '
  1381.         je      @b
  1382.     @@: lea     eax,[ecx+10]
  1383.         mov     [edi+EDITOR_LINE_DATA.Size],eax
  1384.         mov     [edi+EDITOR_LINE_DATA.Flags],EDITOR_LINE_FLAG_MOFIFIED
  1385.         add     edi,sizeof.EDITOR_LINE_DATA
  1386.         jecxz   @f
  1387.         push    esi
  1388.         add     esi,sizeof.EDITOR_LINE_DATA
  1389.         rep     movsb
  1390.         pop     esi
  1391.     @@: mov     al,' '
  1392.         mov     ecx,10
  1393.         rep     stosb
  1394.  
  1395.         mov     ecx,[esi+EDITOR_LINE_DATA.Size]
  1396.         sub     ecx,ebx
  1397.         add     esi,ebx
  1398.         add     esi,sizeof.EDITOR_LINE_DATA
  1399.         inc     ecx
  1400.     @@: dec     ecx
  1401.         jz      @f
  1402.         cmp     byte[esi+ecx-1],' '
  1403.         je      @b
  1404.     @@: jz      .lp1
  1405.     @@: cmp     byte[esi],' '
  1406.         jne     .lp1
  1407.         inc     esi
  1408.         loop    @b
  1409.   .lp1: test    [auto_indent],1
  1410.         jz      .lp2
  1411.         push    edi ecx
  1412.         mov     ecx,[ebp+EDITOR_LINE_DATA.Size]
  1413.         lea     edi,[ebp+sizeof.EDITOR_LINE_DATA]
  1414.         mov     al,' '
  1415.         repe    scasb
  1416.         mov     eax,ecx
  1417.         pop     ecx edi
  1418.         je      .lp2
  1419.         neg     eax
  1420.         mov     edx,[ebp+EDITOR_LINE_DATA.Size]
  1421.         add     eax,edx;[ebp]
  1422.         dec     eax
  1423.         jmp     @f
  1424.   .lp2: xor     eax,eax
  1425.     @@: mov     edx,edi
  1426.         add     edi,sizeof.EDITOR_LINE_DATA
  1427.         mov     [cur_editor.Caret.X],eax
  1428.         jecxz   @f
  1429.         push    ecx
  1430.         mov     ecx,eax
  1431.         mov     al,' '
  1432.         rep     stosb
  1433.         pop     ecx
  1434.     @@: jecxz   @f
  1435.         rep     movsb
  1436.     @@: mov     ecx,10
  1437.         mov     al,' '
  1438.         rep     stosb
  1439.  
  1440.         lea     eax,[edi-sizeof.EDITOR_LINE_DATA]
  1441.         sub     eax,edx
  1442.         mov     [edx+EDITOR_LINE_DATA.Size],eax
  1443.         mov     [edx+EDITOR_LINE_DATA.Flags],EDITOR_LINE_FLAG_MOFIFIED
  1444.  
  1445.         mov     ecx,edi
  1446.         sub     ecx,[temp_buf]
  1447.  
  1448.         push    ecx
  1449.         mov     edi,[cur_editor.Lines]
  1450.         add     edi,[cur_editor.Lines.Size] ;*** add edi,[edi-4]
  1451.         dec     edi
  1452.         lea     esi,[edi+sizeof.EDITOR_LINE_DATA]
  1453.         sub     esi,ecx
  1454.         mov     ecx,[ebp+EDITOR_LINE_DATA.Size]
  1455.         add     esi,ecx
  1456.         lea     ecx,[esi-sizeof.EDITOR_LINE_DATA]
  1457.         sub     ecx,ebp
  1458.         std
  1459.         cmp     esi,edi
  1460.         jb      @f
  1461.         je      .lp3
  1462.         lea     esi,[ebp+sizeof.EDITOR_LINE_DATA]
  1463.         mov     eax,[esp]
  1464.         lea     edi,[esi+eax-sizeof.EDITOR_LINE_DATA]
  1465.         mov     ecx,[ebp+EDITOR_LINE_DATA.Size]
  1466.         add     esi,ecx
  1467.         mov     ecx,[cur_editor.Lines]
  1468.         add     ecx,[cur_editor.Lines.Size] ;*** add ecx,[ecx-4]
  1469.         sub     ecx,esi
  1470.         cld
  1471.     @@: rep     movsb
  1472.   .lp3: pop     ecx
  1473.         mov     esi,[temp_buf]
  1474.         mov     edi,ebp
  1475.         cld
  1476.         rep     movsb
  1477.  
  1478.         inc     [cur_editor.Caret.Y]
  1479.         inc     [cur_editor.SelStart.Y]
  1480.         inc     [cur_editor.Lines.Count]
  1481.  
  1482.         m2m     [cur_editor.SelStart.X],[cur_editor.Caret.X]
  1483.  
  1484.         mov     [cur_editor.Modified],1
  1485.  
  1486.   .exit:
  1487.         ret
  1488. endp
  1489.  
  1490. ;-----------------------------------------------------------------------------
  1491. proc key.ctrl_tab ;///// SWITCH TO NEXT TAB //////////////////////////////////
  1492. ;-----------------------------------------------------------------------------
  1493.         cmp     [tab_bar.Items.Count],1
  1494.         je      .exit
  1495.         xor     eax,eax
  1496.         mov     ebp,[tab_bar.Items]
  1497.     @@: cmp     ebp,[tab_bar.Current.Ptr]
  1498.         je      @f
  1499.         inc     eax
  1500.         add     ebp,sizeof.TABITEM
  1501.         jmp     @b
  1502.     @@: add     ebp,sizeof.TABITEM
  1503.         inc     eax
  1504.         cmp     eax,[tab_bar.Items.Count]
  1505.         jb      @f
  1506.         mov     ebp,[tab_bar.Items]
  1507.     @@: call    set_cur_tab
  1508.         call    make_tab_visible
  1509.         call    align_editor_in_tab
  1510.         call    draw_editor
  1511.         call    draw_tabctl
  1512.         call    update_caption
  1513.   .exit:
  1514.         ret
  1515. endp
  1516.  
  1517. ;-----------------------------------------------------------------------------
  1518. proc key.shift_ctrl_tab ;///// SWITCH TO PREVIOUS TAB ////////////////////////
  1519. ;-----------------------------------------------------------------------------
  1520.         cmp     [tab_bar.Items.Count],1
  1521.         je      .exit
  1522.         xor     eax,eax
  1523.         mov     ebp,[tab_bar.Items]
  1524.     @@: cmp     ebp,[tab_bar.Current.Ptr]
  1525.         je      @f
  1526.         inc     eax
  1527.         add     ebp,sizeof.TABITEM
  1528.         jmp     @b
  1529.     @@: add     ebp,-sizeof.TABITEM
  1530.         dec     eax
  1531.         jge     @f
  1532.         imul    eax,[tab_bar.Items.Count],sizeof.TABITEM
  1533.         add     eax,[tab_bar.Items]
  1534.         lea     ebp,[eax-sizeof.TABITEM]
  1535.     @@: call    set_cur_tab
  1536.         call    make_tab_visible
  1537.         call    align_editor_in_tab
  1538.         call    draw_editor
  1539.         call    draw_tabctl
  1540.         call    update_caption
  1541.   .exit:
  1542.         ret
  1543. endp
  1544.  
  1545. ;-----------------------------------------------------------------------------
  1546. proc key.ctrl_f4 ;///// CLOSE CURRENT TAB ////////////////////////////////////
  1547. ;-----------------------------------------------------------------------------
  1548.         cmp     [cur_editor.Modified],0
  1549.         je      .close
  1550.         mov     [bot_mode2],2
  1551.         jmp     key.ctrl_o.direct
  1552.  .close:
  1553.         mov     [do_not_draw],1
  1554.         push    [tab_bar.Current.Ptr]
  1555.         cmp     [tab_bar.Items.Count],1
  1556.         jne     @f
  1557.         ;call    create_tab
  1558.         jmp     key.alt_x.close         ; close program
  1559.     @@: pop     ebp
  1560.         call    delete_tab
  1561.         dec     [do_not_draw]
  1562.         call    align_editor_in_tab
  1563.         call    draw_editor
  1564.         call    draw_tabctl
  1565.         call    draw_statusbar
  1566.         ret
  1567. endp
  1568.  
  1569. ;-----------------------------------------------------------------------------
  1570. proc key.shift_f9 ;///// SET DEFAULT TAB /////////////////////////////////////
  1571. ;-----------------------------------------------------------------------------
  1572.         mov     eax,[tab_bar.Current.Ptr]
  1573.         cmp     eax,[tab_bar.Default.Ptr]
  1574.         jne     @f
  1575.         xor     eax,eax
  1576.     @@: mov     [tab_bar.Default.Ptr],eax
  1577.         mov     ebp,[tab_bar.Current.Ptr]
  1578.         call    make_tab_visible
  1579.         cmp     [tab_bar.Style],2
  1580.         jbe     @f
  1581.         call    align_editor_in_tab
  1582.         call    draw_editor
  1583.     @@: call    draw_tabctl
  1584.         ret
  1585. endp
  1586.  
  1587. ;-----------------------------------------------------------------------------
  1588. proc key.f3 ;///// FIND NEXT MATCH ///////////////////////////////////////////
  1589. ;-----------------------------------------------------------------------------
  1590.         call    search
  1591.         jc      @f
  1592.     @@: ret
  1593. endp
  1594.  
  1595. ;-----------------------------------------------------------------------------
  1596. proc key.f9 ;///// COMPILE AND RUN ///////////////////////////////////////////
  1597. ;-----------------------------------------------------------------------------
  1598.         mov     bl,1
  1599.         call    start_fasm
  1600.         ret
  1601. endp
  1602.  
  1603. ;-----------------------------------------------------------------------------
  1604. proc key.ctrl_f9 ;///// COMPILE //////////////////////////////////////////////
  1605. ;-----------------------------------------------------------------------------
  1606.         mov     bl,0
  1607.         call    start_fasm
  1608.         ret
  1609. endp
  1610.  
  1611. ;-----------------------------------------------------------------------------
  1612. proc key.alt_x ;///// EXIT PROGRAM ///////////////////////////////////////////
  1613. ;-----------------------------------------------------------------------------
  1614.         mov     [main_closing],1
  1615.         mov     eax,[tab_bar.Items]
  1616.         mov     [exit_tab_item],eax
  1617.         mov     eax,[tab_bar.Items.Count]
  1618.         mov     [exit_tab_num],eax
  1619.   .direct:
  1620.         call    try_to_close_tabs
  1621.         or      eax,eax
  1622.         jz      @f
  1623.         mov     [bot_mode2],2
  1624.         jmp     key.ctrl_o.direct
  1625.  
  1626.     @@: stdcall save_settings
  1627.  
  1628.   .close:
  1629.         mov     [main_closed],1
  1630.         mcall   -1
  1631. endp
  1632.  
  1633. ;-----------------------------------------------------------------------------
  1634. proc try_to_close_tabs ;///// FIND TABS TO BE SAVED BEFORE CLOSE /////////////
  1635. ;-----------------------------------------------------------------------------
  1636.         push    ecx ebp
  1637.         call    flush_cur_tab
  1638.         mov     ebp,[exit_tab_item] ; [tab_bar.Items]
  1639.         add     ebp,-sizeof.TABITEM
  1640.     @@: dec     [exit_tab_num]
  1641.         js      .ok
  1642.         add     ebp,sizeof.TABITEM
  1643.         mov     al,[ebp+TABITEM.Editor.Modified]
  1644.         cmp     [ebp+TABITEM.Editor.Modified],0
  1645.         je      @b
  1646.         mov     [exit_tab_item],ebp
  1647.         call    set_cur_tab
  1648.         call    make_tab_visible
  1649.         xor     eax,eax
  1650.         inc     eax
  1651.     @@: pop     ebp ecx
  1652.         ret
  1653.   .ok:  xor     eax,eax
  1654.         jmp     @b
  1655. endp
  1656.