Subversion Repositories Kolibri OS

Rev

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

  1. key:
  2.         mov     ecx,1
  3.         mcall   66,3
  4.         xor     ebx,ebx
  5.         test    al,0x03
  6.         jz      @f
  7.         or      ebx,KM_SHIFT
  8.     @@: test    al,0x0C
  9.         jz      @f
  10.         or      ebx,KM_CTRL
  11.     @@: test    al,0x30
  12.         jz      @f
  13.         or      ebx,KM_ALT
  14.     @@: mov     [shi],ebx
  15.         test    al,0x03
  16.         jz      @f
  17.         inc     cl
  18.     @@: mcall   26,2,,key1
  19.  
  20.         mcall   2
  21.         cmp     al,0
  22.         jne     still.skip_write
  23.         shr     eax,8
  24.         cmp     al,224
  25.         jne     @f
  26.         mov     [ext],0x01
  27.         jmp     still.skip_write
  28.     @@: cmp     al,225
  29.         jne     @f
  30.         mov     [ext],0x02
  31.         jmp     still.skip_write
  32.     @@:
  33.         mov     ah,[ext]
  34.         mov     [ext],0
  35.         or      eax,[shi]
  36.  
  37.         test    al,0x80
  38.         jnz     still.skip_write
  39.         mov     [chr],al
  40.  
  41.         cmp     [bot_mode],0
  42.         je      @f
  43.         mov     ebx,eax
  44.         mov     al,2
  45.         call    [bot_dlg_handler]
  46.         jmp     still
  47.     @@:
  48.  
  49.         mov     esi,accel_table
  50.   .acc: cmp     eax,[esi]
  51.         jne     @f
  52.         test    [options],OPTS_SECURESEL
  53.         jz      .lp1
  54.         m2m     [sel.x],[pos.x]
  55.         m2m     [sel.y],[pos.y]
  56.   .lp1: mov     [s_status],0
  57.         call    dword[esi+4]
  58.         jmp     still
  59.     @@: add     esi,8
  60.         cmp     byte[esi],0
  61.         jne     .acc
  62.  
  63.         test    dword[shi],KM_CTRLALT
  64.         jnz     still.skip_write
  65.  
  66.         mov     [s_status],0
  67.  
  68.         movzx   eax,[chr]
  69.         movzx   eax,[eax+key0]
  70.         or      al,al
  71.         jz      still.skip_write
  72.         movzx   eax,[eax+key1]
  73.         push    eax
  74.  
  75.         test    [options],OPTS_SECURESEL
  76.         jz      .lp2
  77.         m2m     [sel.x],[pos.x]
  78.         m2m     [sel.y],[pos.y]
  79.         jmp     .put
  80.   .lp2: call    delete_selection
  81.  
  82.         test    [options],OPTS_AUTOBRACES
  83.         jz      .put
  84.         cmp     al,'['
  85.         jne     @f
  86.         mov     al,']'
  87.         call    .lp3
  88.         dec     [pos.x]
  89.         jmp     .put
  90.     @@: cmp     al,'('
  91.         jne     @f
  92.         mov     al,')'
  93.         call    .lp3
  94.         dec     [pos.x]
  95.         jmp     .put
  96.     @@: cmp     al,'{'
  97.         jne     .put
  98.         mov     al,'}'
  99.         call    .lp3
  100.         dec     [pos.x]
  101.  
  102.   .put: pop     eax
  103.         push    still
  104.         inc     [sel.x]
  105.   .lp3: push    [pos.x] eax
  106.         inc     dword[esp+4]
  107.         mov     eax,1
  108.         jmp     key.tab.direct
  109.  
  110. ;-----------------------------------------------------------------------------
  111. func key.ctrl_a ;///// SELECT ALL DOCUMENT ///////////////////////////////////
  112. ;-----------------------------------------------------------------------------
  113.         xor     eax,eax
  114.         mov     [sel.x],eax
  115.         mov     [sel.y],eax
  116.         mov     ecx,[lines]
  117.         dec     ecx
  118.         mov     [pos.y],ecx
  119.         call    get_line_offset
  120.         call    get_real_length
  121.         mov     [pos.x],eax
  122.         call    draw_file
  123.         ret
  124. endf
  125.  
  126. ;-----------------------------------------------------------------------------
  127. func key.ctrl_o ;///// ENTER OPEN FILENAME ///////////////////////////////////
  128. ;-----------------------------------------------------------------------------
  129.         mov     [bot_dlg_mode2],0
  130.  
  131.   .direct:
  132.         mov     [s_status],s_enter_filename
  133.  
  134.         mov     [bot_mode],1
  135.         mov     [bot_dlg_height],16*2+4*2-1
  136.         mov     [bot_dlg_handler],osdlg_handler
  137.         mov     [focused_tb],tb_opensave
  138.  
  139.         mov     ecx,[f_info.length]
  140.         mov     [tb_opensave.length],cl
  141.         jecxz   @f
  142.         mov     esi,f_info.path
  143.         mov     edi,tb_opensave.text
  144.         cld
  145.         rep     movsb
  146.  
  147.     @@: mov     al,[tb_opensave.length]
  148.         mov     [tb_opensave.pos.x],al
  149.         mov     [tb_opensave.sel.x],0
  150.         mov     [tb_casesen],1
  151.         call    drawwindow
  152.         ret
  153. endf
  154.  
  155. ;-----------------------------------------------------------------------------
  156. func key.ctrl_s ;///// ENTER SAVE FILENAME ///////////////////////////////////
  157. ;-----------------------------------------------------------------------------
  158.         cmp     [modified],0
  159.         je      .exit
  160.         cmp     [f_info.length],0
  161.         je      key.shift_ctrl_s
  162.         call    save_file
  163.         call    drawwindow
  164.   .exit:
  165.         ret
  166.  
  167.     key.shift_ctrl_s:
  168.         mov     [bot_dlg_mode2],1
  169.         jmp     key.ctrl_o.direct
  170. endf
  171.  
  172. ;-----------------------------------------------------------------------------
  173. func key.ctrl_n ;///// ENTER SAVE FILENAME ///////////////////////////////////
  174. ;-----------------------------------------------------------------------------
  175.         call    new_file
  176.         ret
  177. endf
  178.  
  179. ;-----------------------------------------------------------------------------
  180. func key.ctrl_f ;///// ENTER KEYWORD TO FIND /////////////////////////////////
  181. ;-----------------------------------------------------------------------------
  182.         mov     [bot_dlg_mode2],0
  183.         mov     [bot_dlg_height],16*2+4*2-1
  184.  
  185.         mov     [s_status],s_enter_text_to_find
  186.  
  187.   .direct:
  188.         mov     [bot_mode],1
  189.         mov     [bot_dlg_handler],finddlg_handler
  190.         mov     [focused_tb],tb_find
  191.  
  192.         mov     ecx,[s_search.size]
  193.         mov     [tb_find.length],cl
  194.         jecxz   @f
  195.         mov     esi,s_search
  196.         mov     edi,tb_find.text
  197.         cld
  198.         rep     movsb
  199.  
  200.     @@: mov     al,[tb_find.length]
  201.         mov     [tb_find.pos.x],al
  202.         mov     [tb_find.sel.x],0
  203.         mov     [tb_casesen],0
  204.         call    drawwindow
  205.         ret
  206. endf
  207.  
  208. func key.ctrl_h
  209.         mov     [bot_dlg_mode2],1
  210.         mov     [bot_dlg_height],16*3+4*2+1
  211.  
  212.         mov     [s_status],s_enter_text_to_replace
  213.  
  214.         jmp     key.ctrl_f.direct
  215. endf
  216.  
  217. func key.ctrl_g
  218.         ret
  219. macro comment {
  220.         mov     [bot_dlg_mode2],0
  221.         mov     [bot_dlg_height],16*2+4*2-1
  222.  
  223.         mov     [bot_mode],1
  224.         mov     [bot_dlg_handler],gotodlg_handler
  225.         mov     [focused_tb],tb_gotorow
  226.  
  227.         mov     al,[tb_gotorow.length]
  228.         mov     [tb_gotorow.pos.x],al
  229.         mov     [tb_gotorow.sel.x],0
  230.         mov     [tb_casesen],0
  231.         call    drawwindow
  232.         ret
  233. }
  234. endf
  235.  
  236. ; CHANGE_LANG_LAYOUT { ; Ctrl + F8
  237. ; 3 times english -> russian
  238. ; 2 times russian -> english
  239. ;        call    layout
  240. ;        jmp     still
  241. ; CHANGE_LANG_LAYOUT }
  242.  
  243. ;-----------------------------------------------------------------------------
  244. func key.ctrl_left ;///// GO TO PREVIOUS WORD ////////////////////////////////
  245. ;-----------------------------------------------------------------------------
  246.         call    clear_selection
  247.  
  248. ;-----------------------------------------------------------------------------
  249.      key.shift_ctrl_left: ;///// GO TO PREVIOUS WORD, WITH SELECTION /////////
  250. ;-----------------------------------------------------------------------------
  251.         mov     ebx,[pos.y]
  252.         mov     edx,[pos.x]
  253.         cld
  254.         mov     ecx,ebx
  255.         call    get_line_offset
  256.   .lp1: cmp     dx,[esi]
  257.         jle     @f
  258.         movzx   edx,word[esi]
  259.     @@: dec     edx
  260.         jl      .nx1
  261.         add     esi,4
  262.         add     esi,edx
  263.         mov     ecx,edx
  264.     @@: push    ecx
  265.         mov     edi,symbols_ex
  266.         mov     ecx,symbols_ex.size+symbols.size
  267.         mov     al,[esi]
  268.         dec     esi
  269.         repne   scasb
  270.         pop     ecx
  271.         jne     @f
  272.         dec     edx
  273.         dec     ecx
  274.         jnz     @b
  275.   .nx1: dec     ebx
  276.         js      .exit.2
  277.         mov     ecx,ebx
  278.         call    get_line_offset
  279.         movzx   edx,word[esi]
  280.         dec     edx
  281.         jmp     .lp1
  282.     @@:
  283.         mov     ecx,ebx
  284.         call    get_line_offset
  285.   .lp2: cmp     dx,[esi]
  286.         jle     @f
  287.         movzx   edx,word[esi]
  288.     @@: or      edx,edx
  289.         jl      .nx2
  290.         add     esi,4
  291.         add     esi,edx
  292.     @@: mov     edi,symbols_ex
  293.         mov     ecx,symbols_ex.size+symbols.size
  294.         mov     al,[esi]
  295.         dec     esi
  296.         repne   scasb
  297.         je      @f
  298.         dec     edx
  299.         jns     @b
  300.         jmp     @f
  301.   .nx2: dec     ebx
  302.         js      .exit.2
  303.         mov     ecx,ebx
  304.         call    get_line_offset
  305.         movzx   edx,word[esi]
  306.         dec     edx
  307.         jmp     .lp2
  308.     @@:
  309.         inc     edx
  310.         mov     [pos.y],ebx
  311.         mov     [pos.x],edx
  312.         test    byte[shi+2],0x01
  313.         jnz     @f
  314.         mov     [sel.y],ebx
  315.         mov     [sel.x],edx
  316.     @@: sub     ebx,[top_line]
  317.         jge     @f
  318.         add     [top_line],ebx
  319.     @@: mov     eax,edx
  320.         sub     eax,[left_col]
  321.         cmp     eax,[columns.scr]
  322.         jl      @f
  323.         sub     eax,[columns.scr]
  324.         inc     eax
  325.         add     [left_col],eax
  326.         jmp     .exit
  327.     @@: cmp     edx,[left_col]
  328.         jge     .exit
  329.         mov     [left_col],edx
  330.   .exit:
  331.         call    draw_file
  332.   .exit.2:
  333.         ret
  334. endf
  335.  
  336. ;-----------------------------------------------------------------------------
  337. func key.ctrl_right ;///// GO TO NEXT WORD ///////////////////////////////////
  338. ;-----------------------------------------------------------------------------
  339.         call    clear_selection
  340.  
  341. ;-----------------------------------------------------------------------------
  342.      key.shift_ctrl_right: ;///// GO TO NEXT WORD, WITH SELECTION ////////////
  343. ;-----------------------------------------------------------------------------
  344.         mov     ebx,[pos.y]
  345.         mov     edx,[pos.x]
  346.         cld
  347.   .lp1: mov     ecx,ebx
  348.         call    get_line_offset
  349.         movzx   ecx,word[esi]
  350.         cmp     edx,ecx
  351.         jge     .nx1
  352.         add     esi,4
  353.         add     esi,edx
  354.         sub     ecx,edx
  355.     @@: push    ecx
  356.         mov     edi,symbols_ex
  357.         mov     ecx,symbols_ex.size+symbols.size
  358.         lodsb
  359.         repne   scasb
  360.         pop     ecx
  361.         je      @f
  362.         inc     edx
  363.         dec     ecx
  364.         jnz     @b
  365.   .nx1: inc     ebx
  366.         cmp     ebx,[lines]
  367.         jge     .exit.2
  368.         xor     edx,edx
  369.         jmp     .lp1
  370.     @@:
  371.  
  372.   .lp2: mov     ecx,ebx
  373.         call    get_line_offset
  374.         movzx   ecx,word[esi]
  375.         cmp     edx,ecx
  376.         jge     .nx2
  377.         add     esi,4
  378.         add     esi,edx
  379.         sub     ecx,edx
  380.     @@: push    ecx
  381.         mov     edi,symbols_ex
  382.         mov     ecx,symbols_ex.size+symbols.size
  383.         lodsb
  384.         repne   scasb
  385.         pop     ecx
  386.         jne     @f
  387.         inc     edx
  388.         dec     ecx
  389.         jnz     @b
  390.   .nx2: inc     ebx
  391.         cmp     ebx,[lines]
  392.         jge     .exit.2
  393.         xor     edx,edx
  394.         jmp     .lp2
  395.     @@:
  396.         mov     [pos.y],ebx
  397.         mov     [pos.x],edx
  398.         test    byte[shi+2],0x01
  399.         jnz     @f
  400.         mov     [sel.y],ebx
  401.         mov     [sel.x],edx
  402.     @@: sub     ebx,[top_line]
  403.         cmp     ebx,[lines.scr]
  404.         jl      @f
  405.         sub     ebx,[lines.scr]
  406.         inc     ebx
  407.         add     [top_line],ebx
  408.     @@: mov     eax,edx
  409.         sub     eax,[left_col]
  410.         cmp     eax,[columns.scr]
  411.         jl      @f
  412.         sub     eax,[columns.scr]
  413.         inc     eax
  414.         add     [left_col],eax
  415.         jmp     .exit
  416.     @@: cmp     edx,[left_col]
  417.         jge     .exit
  418.         mov     [left_col],edx
  419.   .exit:
  420.         call    draw_file
  421.   .exit.2:
  422.         ret
  423. endf
  424.  
  425. ;-----------------------------------------------------------------------------
  426. func key.ctrl_x
  427.         cmp     [sel.selected],0
  428.         je      @f
  429.         call    key.ctrl_c
  430.         call    key.del
  431.         mov     [modified],1
  432.     @@: ret
  433. endf
  434.  
  435. ;-----------------------------------------------------------------------------
  436. func key.ctrl_c
  437.         mov     [copy_size],0
  438.         cmp     [sel.selected],0
  439.         je      .exit
  440.         cld
  441.         mov     eax,[sel.begin.y]
  442.         cmp     eax,[sel.end.y]
  443.         je      .single_line
  444.         mov     ecx,[sel.begin.y]
  445.         call    get_line_offset
  446.         inc     ecx
  447.         push    ecx
  448.         mov     edi,AREA_CBUF
  449.         call    get_real_length
  450.         sub     eax,[sel.begin.x]
  451.         jge     @f
  452.         xor     eax,eax
  453.     @@: add     esi,[sel.begin.x]
  454.         add     esi,4
  455.         stosd
  456.         mov     ecx,eax
  457.         jecxz   @f
  458.         rep     movsb
  459.     @@: mov     ecx,[sel.end.y]
  460.         call    get_line_offset
  461.         pop     ecx
  462.         cmp     ecx,[sel.end.y]
  463.         je      @f
  464.         mov     eax,esi
  465.         call    get_line_offset
  466.         sub     eax,esi
  467.         mov     ecx,eax
  468.         rep     movsb
  469.         mov     ecx,[sel.end.y]
  470.     @@: call    get_line_offset
  471.         movzx   eax,word[esi]
  472.         add     esi,4
  473. ;       lodsd
  474.         cmp     eax,[sel.end.x]
  475.         jle     @f
  476.         mov     eax,[sel.end.x]
  477.     @@: mov     ebx,edi
  478.         stosd
  479. ;       add     esi,eax
  480.         mov     ecx,eax
  481.         jecxz   @f
  482.         rep     movsb
  483.         sub     eax,[sel.end.x]
  484.         jz      @f
  485.         neg     eax
  486.         mov     ecx,eax
  487.         add     [ebx],eax
  488.         mov     al,' '
  489.         rep     stosb
  490.     @@: sub     edi,AREA_CBUF
  491.         mov     [copy_size],edi
  492.         mov     eax,[sel.end.y]
  493.         sub     eax,[sel.begin.y]
  494.         inc     eax
  495.         mov     [copy_count],eax
  496.   .exit:
  497.         ret
  498.  
  499.   .single_line:
  500.         mov     eax,[sel.end.x]
  501.         sub     eax,[sel.begin.x]
  502.         mov     edi,AREA_CBUF
  503.         stosd
  504.         mov     ecx,[sel.begin.y]
  505.         call    get_line_offset
  506.         mov     ebx,[sel.begin.x]
  507.         mov     ecx,[sel.end.x]
  508.         cmp     ebx,[esi]
  509.         jge     .add_spaces
  510.         cmp     ecx,[esi]
  511.         jle     .lp1
  512.         mov     ecx,[esi]
  513.   .lp1: sub     ecx,[sel.begin.x]
  514.         sub     eax,ecx
  515.         lea     esi,[esi+ebx+4]
  516.         rep     movsb
  517.  
  518.   .add_spaces:
  519.         mov     ecx,eax
  520.         mov     al,' '
  521.         jecxz   @b
  522.         rep     stosb
  523.         jmp     @b
  524. endf
  525.  
  526. ;-----------------------------------------------------------------------------
  527. func key.ctrl_v
  528.         cmp     [copy_size],0
  529.         je      .exit
  530.  
  531.         call    delete_selection
  532.  
  533.         mov     ecx,[pos.y]
  534.         call    get_line_offset
  535.         pushd   [esi] esi
  536.         mov     ecx,[pos.x]
  537.         call    line_add_spaces
  538.         mov     ecx,[copy_size]
  539.         sub     ecx,4
  540.         mov     edi,AREA_TEMP2
  541.         mov     eax,esi
  542.         mov     esi,edi
  543.         sub     esi,ecx
  544.         lea     ecx,[eax+4]
  545.         add     ecx,[pos.x]
  546.         neg     ecx
  547.         lea     ecx,[esi+ecx+1]
  548.         std
  549.         rep     movsb
  550.  
  551.         mov     ecx,[copy_count]
  552.         dec     ecx
  553.         jz      .single_line
  554.  
  555.         cld
  556.         pop     edi
  557.         add     edi,4
  558.         mov     esi,AREA_CBUF
  559.         lodsd
  560.  
  561.         mov     ebx,[pos.x]
  562.         add     eax,ebx
  563.         mov     [edi-4],ax
  564.         sub     eax,ebx
  565.         call    .check_columns
  566.         add     edi,ebx
  567.     @@: push    ecx
  568.         mov     ecx,eax
  569.         rep     movsb
  570.         lodsd
  571.         and     eax,0x0000FFFF
  572.         stosd
  573.         or      dword[edi-4],0x00010000
  574.         pop     ecx
  575.         loop    @b
  576.  
  577.         pop     ecx
  578.         sub     ecx,ebx
  579.         add     [edi-4],cx
  580.         call    .check_columns
  581.         mov     ecx,eax
  582.         rep     movsb
  583.  
  584.         mov     [pos.x],eax
  585.         mov     [sel.x],eax
  586.         mov     eax,[copy_count]
  587.         dec     eax
  588.         add     [pos.y],eax
  589.         add     [sel.y],eax
  590.         add     [lines],eax
  591.  
  592.         call    check_inv_all
  593.         mov     [modified],1
  594.         jmp     .exit
  595.  
  596.   .single_line:
  597.         cld
  598.         pop     edi
  599.         add     edi,4
  600.         mov     esi,AREA_CBUF
  601.         lodsd
  602.         add     [edi-4],ax
  603.         and     dword[edi-4],not 0x00020000
  604.         or      dword[edi-4],0x00010000
  605.         call    .check_columns
  606.         add     edi,[pos.x]
  607.         add     esp,4
  608.         mov     ecx,eax
  609.         rep     movsb
  610.  
  611.         add     [pos.x],eax
  612.         add     [sel.x],eax
  613.  
  614.         call    check_inv_all
  615.         mov     [modified],1
  616.  
  617.   .exit:
  618.         ret
  619.  
  620.   .check_columns:
  621.         push    eax
  622.         movzx   eax,word[edi-4]
  623.         cmp     eax,[columns]
  624.         jbe     @f
  625.         mov     [columns],eax
  626.     @@: pop     eax
  627.         ret
  628. ;        push    eax ebx esi
  629. ;        add     esi,eax
  630. ;        xor     ebx,ebx
  631. ;        neg     eax
  632. ;        jz      .lp1
  633. ;    @@: cmp     byte[esi+ebx-1],' '
  634. ;        jne     .lp1
  635. ;        dec     ebx
  636. ;        cmp     ebx,eax
  637. ;        jg      @b
  638. ;  .lp1: add     ebx,[edi-4]
  639. ;        cmp     [columns],ebx
  640. ;        jae     @f
  641. ;        mov     [columns],ebx
  642. ;    @@: pop     esi ebx eax
  643. ;        ret
  644.  
  645. endf
  646.  
  647. ;-----------------------------------------------------------------------------
  648. func key.ctrl_d ;///// INSERT SEPARATOR //////////////////////////////////////
  649. ;-----------------------------------------------------------------------------
  650.         mov     ecx,[pos.y]
  651.         call    get_line_offset
  652.         mov     ebx,esi
  653.  
  654.         mov     ecx,[lines]
  655.         call    get_line_offset
  656.         lea     edi,[esi+90+4]
  657.         lea     ecx,[esi+4]
  658.         sub     ecx,ebx
  659.         std
  660.         rep     movsb
  661.  
  662.         lea     edi,[ebx+5]
  663.         mov     word[ebx],90
  664.         mov     al,ASEPC
  665.         mov     ecx,79
  666.         cld
  667.         rep     stosb
  668.         mov     al,' '
  669.         mov     ecx,10
  670.         rep     stosb
  671.         mov     byte[ebx+4],';'
  672.  
  673.         inc     [lines]
  674.         inc     [pos.y]
  675.         m2m     [sel.y],[pos.y]
  676.  
  677.         call    check_inv_all
  678.         mov     [modified],1
  679.  
  680.   .exit:
  681.         ret
  682. endf
  683.  
  684. ;-----------------------------------------------------------------------------
  685. func key.ctrl_y ;///// DELETE CURRENT LINE ///////////////////////////////////
  686. ;-----------------------------------------------------------------------------
  687.         mov     eax,[pos.y]
  688.         inc     eax
  689.         cmp     eax,[lines]
  690.         jge     .exit
  691.  
  692.         mov     ecx,[pos.y]
  693.         call    get_line_offset
  694.         mov     edi,esi
  695.         lodsd
  696.         add     esi,eax
  697.  
  698.         dec     [lines]
  699.         mov     ecx,AREA_TEMP2
  700.         sub     ecx,esi
  701.         shr     ecx,2                  ;// fixed (was 4)
  702.         cld
  703.         rep     movsd
  704.         call    check_inv_all
  705.         mov     [modified],1
  706.  
  707.   .exit:
  708.         ret
  709. endf
  710.  
  711. ;-----------------------------------------------------------------------------
  712. func key.up ;///// GO TO PREVIOUS LINE ///////////////////////////////////////
  713. ;-----------------------------------------------------------------------------
  714.         call    clear_selection
  715.  
  716. ;-----------------------------------------------------------------------------
  717.      key.shift_up: ;///// GO TO PREVIOUS LINE, WITH SELECTION ////////////////
  718. ;-----------------------------------------------------------------------------
  719.         mov     eax,[pos.y]
  720.         dec     eax
  721.         jns     @f
  722.         xor     eax,eax
  723.     @@: mov     ecx,[top_line]
  724.         cmp     eax,ecx
  725.         jae     @f
  726.         dec     ecx
  727.         jns     @f
  728.         xor     ecx,ecx
  729.     @@: test    byte[shi+2],0x01
  730.         jnz     @f
  731.         mov     [sel.y],eax
  732.     @@: call    check_inv_all.skip_init
  733.  
  734.   .exit:
  735.         ret
  736. endf
  737.  
  738. ;-----------------------------------------------------------------------------
  739. func key.down ;///// GO TO NEXT LINE /////////////////////////////////////////
  740. ;-----------------------------------------------------------------------------
  741.         call    clear_selection
  742.  
  743. ;-----------------------------------------------------------------------------
  744.      key.shift_down: ;///// GO TO NEXT LINE, WITH SELECTION //////////////////
  745. ;-----------------------------------------------------------------------------
  746.  
  747.         mov     eax,[pos.y]
  748.         inc     eax
  749.         cmp     eax,[lines]
  750.         jb      @f
  751.         dec     eax
  752.     @@: mov     ecx,[top_line]
  753.         mov     edx,eax
  754.         sub     edx,ecx
  755.         cmp     edx,[lines.scr]
  756.         jb      @f
  757.         inc     ecx
  758.     @@: test    byte[shi+2],0x01
  759.         jnz     @f
  760.         mov     [sel.y],eax
  761.     @@: call    check_inv_all.skip_init
  762.  
  763.   .exit:
  764.         ret
  765. endf
  766.  
  767. ;-----------------------------------------------------------------------------
  768. func key.left ;///// GO TO PREVIOUS CHAR /////////////////////////////////////
  769. ;-----------------------------------------------------------------------------
  770.         call    clear_selection
  771.  
  772. ;-----------------------------------------------------------------------------
  773.      key.shift_left: ;///// GO TO PREVIOUS CHAR, WITH SELECTION //////////////
  774. ;-----------------------------------------------------------------------------
  775.         mov     eax,[pos.x]
  776.         dec     eax
  777.         jns     @f
  778.         inc     eax
  779.     @@: test    byte[shi+2],0x01
  780.         jnz     @f
  781.         mov     [sel.x],eax
  782.     @@: mov     [pos.x],eax
  783.         call     check_inv_all
  784.  
  785.   .exit:
  786.         ret
  787. endf
  788.  
  789. ;-----------------------------------------------------------------------------
  790. func key.right ;///// GO TO NEXT CHAR ////////////////////////////////////////
  791. ;-----------------------------------------------------------------------------
  792.         call    clear_selection
  793.  
  794. ;-----------------------------------------------------------------------------
  795.      key.shift_right: ;///// GO TO NEXT CHAR, WITH SELECTION /////////////////
  796. ;-----------------------------------------------------------------------------
  797.         mov     eax,[pos.x]
  798.         inc     eax
  799.         cmp     eax,[columns]
  800.         jbe     @f
  801.         dec     eax
  802.     @@: test    byte[shi+2],0x01
  803.         jnz     @f
  804.         mov     [sel.x],eax
  805.     @@: mov     [pos.x],eax
  806.         call    check_inv_all
  807.  
  808.   .exit:
  809.         ret
  810. endf
  811.  
  812. ;-----------------------------------------------------------------------------
  813. func key.pgup ;///// GO TO PREVIOUS PAGE /////////////////////////////////////
  814. ;-----------------------------------------------------------------------------
  815.         call    clear_selection
  816.  
  817. ;-----------------------------------------------------------------------------
  818.      key.shift_pgup: ;///// GO TO PREVIOUS PAGE, WITH SELECTION //////////////
  819. ;-----------------------------------------------------------------------------
  820.         mov     edx,[lines.scr]
  821.         dec     edx
  822.         mov     eax,[pos.y]
  823.         mov     ecx,[top_line]
  824.         sub     eax,edx
  825.         jns     @f
  826.         xor     eax,eax
  827.     @@: sub     ecx,edx
  828.         jns     @f
  829.         xor     ecx,ecx
  830.     @@: test    byte[shi+2],0x01
  831.         jnz     @f
  832.         mov     [sel.y],eax
  833.     @@: call    check_inv_all.skip_init
  834.  
  835.   .exit:
  836.         ret
  837. endf
  838.  
  839. ;-----------------------------------------------------------------------------
  840. func key.pgdn ;///// GO TO NEXT PAGE /////////////////////////////////////////
  841. ;-----------------------------------------------------------------------------
  842.         call    clear_selection
  843.  
  844. ;-----------------------------------------------------------------------------
  845.      key.shift_pgdn: ;///// GO TO NEXT PAGE, WITH SELECTION //////////////////
  846. ;-----------------------------------------------------------------------------
  847.         mov     edx,[lines.scr]
  848.         dec     edx
  849.         mov     eax,[pos.y]
  850.         mov     ecx,[top_line]
  851.         add     eax,edx
  852.         add     ecx,edx
  853.         cmp     eax,[lines]
  854.         jb      @f
  855.         mov     eax,[lines]
  856.         dec     eax
  857.     @@: test    byte[shi+2],0x01
  858.         jnz     @f
  859.         mov     [sel.y],eax
  860.     @@: call    check_inv_all.skip_init
  861.  
  862.   .exit:
  863.         ret
  864. endf
  865.  
  866. ;-----------------------------------------------------------------------------
  867. func key.home ;///// GO TO LINE START ////////////////////////////////////////
  868. ;-----------------------------------------------------------------------------
  869.         call    clear_selection
  870.  
  871. ;-----------------------------------------------------------------------------
  872.      key.shift_home: ;///// GO TO LINE START, WITH SELECTION /////////////////
  873. ;-----------------------------------------------------------------------------
  874.         mov     [pos.x],0
  875.         test    byte[shi+2],0x01
  876.         jnz     @f
  877.         mov     [sel.x],0
  878.     @@: call    check_inv_all
  879.  
  880.   .exit:
  881.         ret
  882. endf
  883.  
  884. ;-----------------------------------------------------------------------------
  885. func key.end ;///// GO TO LINE END ///////////////////////////////////////////
  886. ;-----------------------------------------------------------------------------
  887.         call    clear_selection
  888.  
  889. ;-----------------------------------------------------------------------------
  890.      key.shift_end: ;///// GO TO LINE END, WITH SELECTION ////////////////////
  891. ;-----------------------------------------------------------------------------
  892.         mov     ecx,[pos.y]
  893.         call    get_line_offset
  894.         call    get_real_length
  895.         mov     [pos.x],eax
  896.         test    byte[shi+2],0x01
  897.         jnz     @f
  898.         mov     [sel.x],eax
  899.     @@: call    check_inv_all
  900.  
  901.   .exit:
  902.         ret
  903. endf
  904.  
  905. ;-----------------------------------------------------------------------------
  906. func key.ctrl_home ;///// GO TO PAGE START ///////////////////////////////////
  907. ;-----------------------------------------------------------------------------
  908.         call    clear_selection
  909.  
  910. ;-----------------------------------------------------------------------------
  911.      key.shift_ctrl_home: ;///// GO TO PAGE START, WITH SELECTION ////////////
  912. ;-----------------------------------------------------------------------------
  913.         mov     eax,[top_line]
  914.         mov     ecx,eax
  915.         test    byte[shi+2],0x01
  916.         jnz     @f
  917.         mov     [sel.y],eax
  918.     @@: call    check_inv_all.skip_init
  919.  
  920.   .exit:
  921.         ret
  922. endf
  923.  
  924. ;-----------------------------------------------------------------------------
  925. func key.ctrl_end ;///// GO TO PAGE END //////////////////////////////////////
  926. ;-----------------------------------------------------------------------------
  927.         call    clear_selection
  928.  
  929. ;-----------------------------------------------------------------------------
  930.      key.shift_ctrl_end: ;///// GO TO PAGE END, WITH SELECTION ///////////////
  931. ;-----------------------------------------------------------------------------
  932.         mov     ecx,[top_line]
  933.         mov     eax,[lines.scr]
  934.         cmp     eax,[lines]
  935.         jle     @f
  936.         mov     eax,[lines]
  937.     @@: add     eax,ecx
  938.         dec     eax
  939.         test    byte[shi+2],0x01
  940.         jnz     @f
  941.         mov     [sel.y],eax
  942.     @@: call    check_inv_all.skip_init
  943.  
  944.   .exit:
  945.         ret
  946. endf
  947.  
  948. ;-----------------------------------------------------------------------------
  949. func key.ctrl_pgup ;///// GO TO DOCUMENT START ///////////////////////////////
  950. ;-----------------------------------------------------------------------------
  951.         call    clear_selection
  952.  
  953. ;-----------------------------------------------------------------------------
  954.      key.shift_ctrl_pgup: ;///// GO TO DOCUMENT START, WITH SELECTION ////////
  955. ;-----------------------------------------------------------------------------
  956.         xor     eax,eax
  957.         mov     [top_line],eax
  958.         mov     [pos.y],eax
  959.         test    byte[shi+2],0x01
  960.         jnz     @f
  961.         mov     [sel.y],eax
  962.     @@: call    check_inv_all.skip_check
  963.  
  964.   .exit:
  965.         ret
  966. endf
  967.  
  968. ;-----------------------------------------------------------------------------
  969. func key.ctrl_pgdn ;///// GO TO DOCUMENT END /////////////////////////////////
  970. ;-----------------------------------------------------------------------------
  971.         call    clear_selection
  972.  
  973. ;-----------------------------------------------------------------------------
  974.      key.shift_ctrl_pgdn: ;///// GO TO DOCUMENT END, WITH SELECTION //////////
  975. ;-----------------------------------------------------------------------------
  976.         mov     eax,[lines]    ; eax = lines in the file
  977.         mov     [pos.y],eax
  978.         sub     eax,[lines.scr]   ; eax -= lines on the screen
  979.         jns     @f
  980.         xor     eax,eax
  981.     @@: mov     [top_line],eax
  982.         dec     [pos.y]
  983.         test    byte[shi+2],0x01
  984.         jnz     @f
  985.         push    [pos.y]
  986.         pop     [sel.y]
  987.     @@: call    check_inv_all.skip_check
  988.  
  989.   .exit:
  990.         ret
  991. endf
  992.  
  993. ;-----------------------------------------------------------------------------
  994. func key.del ;///// DELETE NEXT CHAR OR SELECTION ////////////////////////////
  995. ;-----------------------------------------------------------------------------
  996.         call    delete_selection
  997.         jnc     .exit.2
  998.  
  999.         mov     ecx,[pos.y]
  1000.         call    get_line_offset
  1001.         and     dword[esi],not 0x00020000
  1002.         or      dword[esi],0x00010000
  1003.         lea     ebx,[esi+4]
  1004.         mov     ebp,esi
  1005.  
  1006.         call    get_real_length
  1007.         or      eax,eax
  1008.         je      .line_up
  1009.  
  1010.         mov     ecx,[pos.x]
  1011.         cmp     ecx,eax
  1012.         jae     .line_up
  1013.         lea     edi,[ebx+ecx]
  1014.         neg     ecx
  1015.         movzx   eax,word[ebp]
  1016.         add     ecx,eax;[ebp]
  1017.         repe    scasb
  1018.         je      .line_up
  1019.  
  1020.         mov     edi,ebx
  1021.         mov     ecx,[pos.x]
  1022.         add     edi,ecx
  1023.         lea     esi,[edi+1]
  1024.         neg     ecx
  1025.         movzx   eax,word[ebp]
  1026.         add     ecx,eax;[ebp]
  1027.         dec     ecx
  1028.         rep     movsb
  1029.         mov     byte[edi],' '
  1030.  
  1031.         m2m     [sel.x],[pos.x]
  1032.         m2m     [sel.y],[pos.y]
  1033.         call    check_inv_all
  1034.         mov     [modified],1
  1035.         ret
  1036.  
  1037.   .line_up:
  1038.         mov     eax,[lines]
  1039.         dec     eax
  1040.         cmp     eax,[pos.y]
  1041.         je      .exit
  1042.         mov     edi,AREA_TEMP+4
  1043.         mov     esi,ebx
  1044.         mov     ecx,[pos.x]
  1045.         rep     movsb
  1046.         mov     ecx,[pos.x]
  1047.         mov     [AREA_TEMP],ecx
  1048.         cmp     cx,[ebp]
  1049.         jbe     @f
  1050.         movzx   eax,word[ebp]
  1051.         sub     ecx,eax;[ebp]
  1052.         sub     edi,ecx
  1053.         mov     al,' '
  1054.         rep     stosb
  1055.     @@: lea     esi,[ebx+4]
  1056.         movzx   eax,word[ebp]
  1057.         add     esi,eax;[ebp]
  1058.         movzx   ecx,word[esi-4]
  1059.         add     [AREA_TEMP],ecx
  1060.         or      dword[AREA_TEMP],0x00010000
  1061.         rep     movsb
  1062.  
  1063.         lea     ecx,[edi-AREA_TEMP]
  1064.  
  1065.         mov     esi,AREA_TEMP
  1066.         call    get_real_length
  1067.         cmp     eax,[columns]
  1068.         jbe     @f
  1069.         mov     [columns],eax
  1070.     @@:
  1071.         push    ecx
  1072.         mov     edi,AREA_TEMP2
  1073.         lea     esi,[edi+8]
  1074.         sub     esi,ecx
  1075.         movzx   eax,word[ebp]
  1076.         add     esi,eax;[ebp]
  1077. ;       lea     eax,[ebp+4]
  1078. ;       add     eax,[ebp]
  1079.         movzx   eax,word[ebp]
  1080.         movzx   eax,word[ebp+eax+4]
  1081.         add     esi,eax;[eax]
  1082.         lea     ecx,[esi-4]
  1083.         sub     ecx,ebp
  1084.         std
  1085.         cmp     esi,edi
  1086.         jb      @f
  1087.         jz      .lp1
  1088.         mov     edi,ebp
  1089.         add     edi,[esp]
  1090.         lea     esi,[ebp+8]
  1091.         movzx   eax,word[esi-8]
  1092.         add     esi,eax;[esi-8]
  1093.         movzx   eax,word[esi-4]
  1094.         add     esi,eax;[esi-4]
  1095.         mov     ecx,AREA_TEMP2
  1096.         sub     ecx,esi
  1097.         cld
  1098.     @@: rep     movsb
  1099.   .lp1: pop     ecx
  1100.         mov     esi,AREA_TEMP
  1101.         mov     edi,ebp
  1102.         cld
  1103.         rep     movsb
  1104.  
  1105.   .ok.dec.lines:
  1106.         dec     [lines]
  1107.         mov     eax,[lines]
  1108.         cmp     [pos.y],eax
  1109.         jb      @f
  1110.         dec     eax
  1111.         mov     [pos.y],eax
  1112.     @@: m2m     [sel.x],[pos.x]
  1113.         m2m     [sel.y],[pos.y]
  1114.  
  1115.         mov     [modified],1
  1116.   .exit.2:
  1117.         call    check_inv_all
  1118.  
  1119.   .exit:
  1120.         ret
  1121. endf
  1122.  
  1123. ;-----------------------------------------------------------------------------
  1124. ; INSERT {
  1125.   key.ins:
  1126. ;// ... toggle insert/overwrite mode here ...
  1127.         xor     [ins_mode],1
  1128.         call    check_inv_str
  1129.         ret
  1130. ; INSERT }
  1131.  
  1132. ;-----------------------------------------------------------------------------
  1133. func key.bkspace ;///// DELETE PREVIOUS CHAR OR SELECTION ////////////////////
  1134. ;-----------------------------------------------------------------------------
  1135.         call    delete_selection
  1136.         jnc     key.del.exit.2
  1137.  
  1138.         mov     eax,[pos.x]
  1139.         dec     eax
  1140.         js      .line_up
  1141.  
  1142.         dec     [pos.x]
  1143.         mov     ecx,[pos.y]
  1144.         call    get_line_offset
  1145.         and     dword[esi],not 0x00020000
  1146.         or      dword[esi],0x00010000
  1147.  
  1148.         mov     ebx,eax
  1149.         call    get_real_length
  1150.         cmp     eax,[pos.x]
  1151.         jae     @f
  1152.         m2m     [sel.x],[pos.x]
  1153.         call    check_inv_all
  1154.         mov     [modified],1
  1155.         ret
  1156.  
  1157.     @@: lea     edi,[esi+4+ebx]
  1158.         mov     ecx,ebx
  1159.         neg     ecx
  1160.         movzx   eax,word[esi]
  1161.         add     ecx,eax;[esi]
  1162.         dec     ecx
  1163.         lea     esi,[edi+1]
  1164.         cld
  1165.         rep     movsb
  1166.         mov     byte[edi],' '
  1167.  
  1168.         m2m     [sel.x],[pos.x]
  1169.         m2m     [sel.y],[pos.y]
  1170.         call    check_inv_str
  1171.         mov     [modified],1
  1172.         ret
  1173.  
  1174.   .line_up:
  1175.         cmp     [pos.y],0
  1176.         jne     @f
  1177.         ret
  1178.     @@: mov     ecx,[pos.y]
  1179.         dec     ecx
  1180.         call    get_line_offset
  1181.         and     dword[esi],not 0x00020000
  1182.         or      dword[esi],0x00010000
  1183.  
  1184.         mov     ebp,esi
  1185.         lea     ebx,[esi+4]
  1186.         movzx   ecx,word[ebp]
  1187.     @@: cmp     byte[ebx+ecx-1],' '
  1188.         jne     @f
  1189.         dec     ecx
  1190.         jg      @b
  1191.     @@: mov     [pos.x],ecx
  1192.         dec     [pos.y]
  1193.         cld
  1194.         jmp     key.del.line_up
  1195. endf
  1196.  
  1197. ;-----------------------------------------------------------------------------
  1198. func key.tab ;///// TABULATE /////////////////////////////////////////////////
  1199. ;-----------------------------------------------------------------------------
  1200.         call    delete_selection
  1201.         mov     eax,[pos.x]
  1202.  
  1203.         mov     ecx,eax
  1204.         add     eax,ATABW
  1205.         and     eax,not(ATABW-1)
  1206.         push    eax ' '
  1207.         sub     eax,ecx
  1208.   .direct:
  1209.         mov     ecx,[pos.y]
  1210.         call    get_line_offset
  1211.         and     dword[esi],not 0x00020000
  1212.         or      dword[esi],0x00010000
  1213.  
  1214.         xchg    eax,ecx
  1215.  
  1216.         call    get_real_length
  1217.         cmp     eax,[pos.x]
  1218.         jae     @f
  1219.         mov     eax,[pos.x]
  1220.     @@: movzx   edx,word[esi]
  1221.         sub     edx,eax
  1222.         cmp     ecx,edx
  1223.         jl      @f
  1224.         pushad; esi ecx eax
  1225.         mov     ecx,AREA_TEMP2-10+1
  1226. ;       lea     eax,[esi+4]
  1227. ;       add     eax,[esi]
  1228.         movzx   eax,word[esi]
  1229.         lea     eax,word[esi+eax+4]
  1230.         sub     ecx,eax
  1231.         mov     edi,AREA_TEMP2
  1232.         mov     esi,AREA_TEMP2-10
  1233.         std
  1234.         rep     movsb
  1235.         mov     ecx,10
  1236.         mov     al,' '
  1237.         rep     stosb
  1238.         popad;  eax ecx esi
  1239.         add     word[esi],10
  1240.         jmp     @b
  1241.     @@: lea     ebx,[esi+4]
  1242.         push    ecx
  1243. ;       lea     edi,[ebx-1]
  1244. ;       add     edi,[esi]
  1245.         movzx   edi,word[esi]
  1246.         lea     edi,[ebx+edi-1]
  1247.         mov     esi,edi
  1248.         sub     esi,ecx
  1249.         lea     ecx,[esi+1]
  1250.         sub     ecx,ebx
  1251.         sub     ecx,[pos.x]
  1252.         std
  1253.         rep     movsb
  1254.   .ok:  pop     ecx             ;*******
  1255.         pop     eax
  1256.         rep     stosb
  1257.         cld
  1258.         pop     [pos.x]
  1259.         lea     esi,[ebx-4]
  1260.         call    get_real_length
  1261.         cmp     eax,[pos.x]
  1262.         jae     @f
  1263.         mov     eax,[pos.x]
  1264.     @@: cmp     eax,[columns]
  1265.         jbe     @f
  1266.         mov     [columns],eax
  1267.     @@: m2m     [sel.x],[pos.x]
  1268.         m2m     [sel.y],[pos.y]
  1269.         call    check_inv_all
  1270.         mov     [modified],1
  1271.  
  1272.   .exit:
  1273.         ret
  1274. endf
  1275.  
  1276. ;-----------------------------------------------------------------------------
  1277. func key.return ;///// CARRIAGE RETURN ///////////////////////////////////////
  1278. ;-----------------------------------------------------------------------------
  1279.         call    delete_selection
  1280.  
  1281.         mov     ecx,[pos.y]
  1282.         call    get_line_offset
  1283.  
  1284.         mov     ebx,[pos.x]
  1285.         cmp     bx,[esi]
  1286.         jb      @f
  1287.         movzx   ebx,word[esi]
  1288.         dec     ebx
  1289.         jns     @f
  1290.         xor     ebx,ebx
  1291.     @@:
  1292.         cld
  1293.  
  1294.         mov     edi,AREA_TEMP
  1295.         mov     ebp,esi
  1296.         mov     ecx,ebx
  1297.         inc     ecx
  1298.     @@: dec     ecx
  1299.         jz      @f
  1300.         cmp     byte[esi+ecx+4-1],' '
  1301.         je      @b
  1302.     @@: lea     eax,[ecx+10]
  1303.         or      eax,0x00010000
  1304.         stosd
  1305.         jecxz   @f
  1306.         push    esi
  1307.         add     esi,4
  1308.         rep     movsb
  1309.         pop     esi
  1310.     @@: mov     al,' '
  1311.         mov     ecx,10
  1312.         rep     stosb
  1313.  
  1314.         movzx   ecx,word[esi]
  1315.         sub     ecx,ebx;[pos.x]
  1316.         add     esi,ebx;[pos.x]
  1317.         add     esi,4
  1318.         inc     ecx
  1319.     @@: dec     ecx
  1320.         jz      @f
  1321.         cmp     byte[esi+ecx-1],' '
  1322.         je      @b
  1323.     @@: jz      .lp1
  1324.     @@: cmp     byte[esi],' '
  1325.         jne     .lp1
  1326.         inc     esi
  1327.         loop    @b
  1328.   .lp1: test    [options],OPTS_AUTOINDENT
  1329.         jz      .lp2
  1330.         push    edi ecx
  1331.         movzx   ecx,word[ebp]
  1332.         lea     edi,[ebp+4]
  1333.         mov     al,' '
  1334.         repe    scasb
  1335.         mov     eax,ecx
  1336.         pop     ecx edi
  1337.         je      .lp2
  1338.         neg     eax
  1339.         movzx   edx,word[ebp]
  1340.         add     eax,edx;[ebp]
  1341.         dec     eax
  1342.         jmp     @f
  1343.   .lp2: xor     eax,eax
  1344.     @@: mov     edx,edi
  1345.         add     edi,4
  1346.         mov     [pos.x],eax
  1347.         jecxz   @f
  1348.         push    ecx
  1349.         mov     ecx,eax
  1350.         mov     al,' '
  1351.         rep     stosb
  1352.         pop     ecx
  1353.     @@: jecxz   @f
  1354.         rep     movsb
  1355.     @@: mov     ecx,10
  1356.         mov     al,' '
  1357.         rep     stosb
  1358.  
  1359.         lea     eax,[edi-4]
  1360.         sub     eax,edx
  1361.         or      eax,0x00010000
  1362.         mov     [edx],eax
  1363.  
  1364.         lea     ecx,[edi-AREA_TEMP]
  1365.  
  1366.         push    ecx
  1367.         mov     edi,AREA_TEMP2
  1368.         lea     esi,[edi+4]
  1369.         sub     esi,ecx
  1370.         movzx   ecx,word[ebp]
  1371.         add     esi,ecx;[ebp]
  1372.         lea     ecx,[esi-4]
  1373.         sub     ecx,ebp
  1374.         std
  1375.         cmp     esi,edi
  1376.         jb      @f
  1377.         je      .lp3
  1378.         lea     esi,[ebp+4]
  1379.         mov     eax,[esp]
  1380.         lea     edi,[esi+eax-4]
  1381.         movzx   ecx,word[ebp]
  1382.         add     esi,ecx;[ebp]
  1383.         mov     ecx,AREA_TEMP2
  1384.         sub     ecx,esi
  1385.         cld
  1386.     @@: rep     movsb
  1387.   .lp3: pop     ecx
  1388.         mov     esi,AREA_TEMP
  1389.         mov     edi,ebp
  1390.         cld
  1391.         rep     movsb
  1392.  
  1393.         inc     [pos.y]
  1394.         inc     [sel.y]
  1395.         inc     [lines]
  1396.  
  1397.         m2m     [sel.x],[pos.x]
  1398.  
  1399.         call    check_inv_all
  1400.         mov     [modified],1
  1401.  
  1402.   .exit:
  1403.         ret
  1404. endf