Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 177 → Rev 178

/programs/develop/tinypad/trunk/tp-key.asm
0,0 → 1,1404
key:
mov ecx,1
mcall 66,3
xor ebx,ebx
test al,0x03
jz @f
or ebx,KM_SHIFT
@@: test al,0x0C
jz @f
or ebx,KM_CTRL
@@: test al,0x30
jz @f
or ebx,KM_ALT
@@: mov [shi],ebx
test al,0x03
jz @f
inc cl
@@: mcall 26,2,,key1
 
mcall 2
cmp al,0
jne still.skip_write
shr eax,8
cmp al,224
jne @f
mov [ext],0x01
jmp still.skip_write
@@: cmp al,225
jne @f
mov [ext],0x02
jmp still.skip_write
@@:
mov ah,[ext]
mov [ext],0
or eax,[shi]
 
test al,0x80
jnz still.skip_write
mov [chr],al
 
cmp [bot_mode],0
je @f
mov ebx,eax
mov al,2
call [bot_dlg_handler]
jmp still
@@:
 
mov esi,accel_table
.acc: cmp eax,[esi]
jne @f
test [options],OPTS_SECURESEL
jz .lp1
m2m [sel.x],[pos.x]
m2m [sel.y],[pos.y]
.lp1: mov [s_status],0
call dword[esi+4]
jmp still
@@: add esi,8
cmp byte[esi],0
jne .acc
 
test dword[shi],KM_CTRLALT
jnz still.skip_write
 
mov [s_status],0
 
movzx eax,[chr]
movzx eax,[eax+key0]
or al,al
jz still.skip_write
movzx eax,[eax+key1]
push eax
 
test [options],OPTS_SECURESEL
jz .lp2
m2m [sel.x],[pos.x]
m2m [sel.y],[pos.y]
jmp .put
.lp2: call delete_selection
 
test [options],OPTS_AUTOBRACES
jz .put
cmp al,'['
jne @f
mov al,']'
call .lp3
dec [pos.x]
jmp .put
@@: cmp al,'('
jne @f
mov al,')'
call .lp3
dec [pos.x]
jmp .put
@@: cmp al,'{'
jne .put
mov al,'}'
call .lp3
dec [pos.x]
 
.put: pop eax
push still
inc [sel.x]
.lp3: push [pos.x] eax
inc dword[esp+4]
mov eax,1
jmp key.tab.direct
 
;-----------------------------------------------------------------------------
func key.ctrl_a ;///// SELECT ALL DOCUMENT ///////////////////////////////////
;-----------------------------------------------------------------------------
xor eax,eax
mov [sel.x],eax
mov [sel.y],eax
mov ecx,[lines]
dec ecx
mov [pos.y],ecx
call get_line_offset
call get_real_length
mov [pos.x],eax
call draw_file
ret
endf
 
;-----------------------------------------------------------------------------
func key.ctrl_o ;///// ENTER OPEN FILENAME ///////////////////////////////////
;-----------------------------------------------------------------------------
mov [bot_dlg_mode2],0
 
.direct:
mov [s_status],s_enter_filename
 
mov [bot_mode],1
mov [bot_dlg_height],16*2+4*2-1
mov [bot_dlg_handler],osdlg_handler
mov [focused_tb],tb_opensave
 
mov ecx,[f_info.length]
mov [tb_opensave.length],cl
jecxz @f
mov esi,f_info.path
mov edi,tb_opensave.text
cld
rep movsb
 
@@: mov al,[tb_opensave.length]
mov [tb_opensave.pos.x],al
mov [tb_opensave.sel.x],0
mov [tb_casesen],1
call drawwindow
ret
endf
 
;-----------------------------------------------------------------------------
func key.ctrl_s ;///// ENTER SAVE FILENAME ///////////////////////////////////
;-----------------------------------------------------------------------------
cmp [modified],0
je .exit
cmp [f_info.length],0
je key.shift_ctrl_s
call save_file
call drawwindow
.exit:
ret
 
key.shift_ctrl_s:
mov [bot_dlg_mode2],1
jmp key.ctrl_o.direct
endf
 
;-----------------------------------------------------------------------------
func key.ctrl_n ;///// ENTER SAVE FILENAME ///////////////////////////////////
;-----------------------------------------------------------------------------
call new_file
ret
endf
 
;-----------------------------------------------------------------------------
func key.ctrl_f ;///// ENTER KEYWORD TO FIND /////////////////////////////////
;-----------------------------------------------------------------------------
mov [bot_dlg_mode2],0
mov [bot_dlg_height],16*2+4*2-1
 
mov [s_status],s_enter_text_to_find
 
.direct:
mov [bot_mode],1
mov [bot_dlg_handler],finddlg_handler
mov [focused_tb],tb_find
 
mov ecx,[s_search.size]
mov [tb_find.length],cl
jecxz @f
mov esi,s_search
mov edi,tb_find.text
cld
rep movsb
 
@@: mov al,[tb_find.length]
mov [tb_find.pos.x],al
mov [tb_find.sel.x],0
mov [tb_casesen],0
call drawwindow
ret
endf
 
func key.ctrl_h
mov [bot_dlg_mode2],1
mov [bot_dlg_height],16*3+4*2+1
 
mov [s_status],s_enter_text_to_replace
 
jmp key.ctrl_f.direct
endf
 
func key.ctrl_g
ret
macro comment {
mov [bot_dlg_mode2],0
mov [bot_dlg_height],16*2+4*2-1
 
mov [bot_mode],1
mov [bot_dlg_handler],gotodlg_handler
mov [focused_tb],tb_gotorow
 
mov al,[tb_gotorow.length]
mov [tb_gotorow.pos.x],al
mov [tb_gotorow.sel.x],0
mov [tb_casesen],0
call drawwindow
ret
}
endf
 
; CHANGE_LANG_LAYOUT { ; Ctrl + F8
; 3 times english -> russian
; 2 times russian -> english
; call layout
; jmp still
; CHANGE_LANG_LAYOUT }
 
;-----------------------------------------------------------------------------
func key.ctrl_left ;///// GO TO PREVIOUS WORD ////////////////////////////////
;-----------------------------------------------------------------------------
call clear_selection
 
;-----------------------------------------------------------------------------
key.shift_ctrl_left: ;///// GO TO PREVIOUS WORD, WITH SELECTION /////////
;-----------------------------------------------------------------------------
mov ebx,[pos.y]
mov edx,[pos.x]
cld
mov ecx,ebx
call get_line_offset
.lp1: cmp dx,[esi]
jle @f
movzx edx,word[esi]
@@: dec edx
jl .nx1
add esi,4
add esi,edx
mov ecx,edx
@@: push ecx
mov edi,symbols_ex
mov ecx,symbols_ex.size+symbols.size
mov al,[esi]
dec esi
repne scasb
pop ecx
jne @f
dec edx
dec ecx
jnz @b
.nx1: dec ebx
js .exit.2
mov ecx,ebx
call get_line_offset
movzx edx,word[esi]
dec edx
jmp .lp1
@@:
mov ecx,ebx
call get_line_offset
.lp2: cmp dx,[esi]
jle @f
movzx edx,word[esi]
@@: or edx,edx
jl .nx2
add esi,4
add esi,edx
@@: mov edi,symbols_ex
mov ecx,symbols_ex.size+symbols.size
mov al,[esi]
dec esi
repne scasb
je @f
dec edx
jns @b
jmp @f
.nx2: dec ebx
js .exit.2
mov ecx,ebx
call get_line_offset
movzx edx,word[esi]
dec edx
jmp .lp2
@@:
inc edx
mov [pos.y],ebx
mov [pos.x],edx
test byte[shi+2],0x01
jnz @f
mov [sel.y],ebx
mov [sel.x],edx
@@: sub ebx,[top_line]
jge @f
add [top_line],ebx
@@: mov eax,edx
sub eax,[left_col]
cmp eax,[columns.scr]
jl @f
sub eax,[columns.scr]
inc eax
add [left_col],eax
jmp .exit
@@: cmp edx,[left_col]
jge .exit
mov [left_col],edx
.exit:
call draw_file
.exit.2:
ret
endf
 
;-----------------------------------------------------------------------------
func key.ctrl_right ;///// GO TO NEXT WORD ///////////////////////////////////
;-----------------------------------------------------------------------------
call clear_selection
 
;-----------------------------------------------------------------------------
key.shift_ctrl_right: ;///// GO TO NEXT WORD, WITH SELECTION ////////////
;-----------------------------------------------------------------------------
mov ebx,[pos.y]
mov edx,[pos.x]
cld
.lp1: mov ecx,ebx
call get_line_offset
movzx ecx,word[esi]
cmp edx,ecx
jge .nx1
add esi,4
add esi,edx
sub ecx,edx
@@: push ecx
mov edi,symbols_ex
mov ecx,symbols_ex.size+symbols.size
lodsb
repne scasb
pop ecx
je @f
inc edx
dec ecx
jnz @b
.nx1: inc ebx
cmp ebx,[lines]
jge .exit.2
xor edx,edx
jmp .lp1
@@:
 
.lp2: mov ecx,ebx
call get_line_offset
movzx ecx,word[esi]
cmp edx,ecx
jge .nx2
add esi,4
add esi,edx
sub ecx,edx
@@: push ecx
mov edi,symbols_ex
mov ecx,symbols_ex.size+symbols.size
lodsb
repne scasb
pop ecx
jne @f
inc edx
dec ecx
jnz @b
.nx2: inc ebx
cmp ebx,[lines]
jge .exit.2
xor edx,edx
jmp .lp2
@@:
mov [pos.y],ebx
mov [pos.x],edx
test byte[shi+2],0x01
jnz @f
mov [sel.y],ebx
mov [sel.x],edx
@@: sub ebx,[top_line]
cmp ebx,[lines.scr]
jl @f
sub ebx,[lines.scr]
inc ebx
add [top_line],ebx
@@: mov eax,edx
sub eax,[left_col]
cmp eax,[columns.scr]
jl @f
sub eax,[columns.scr]
inc eax
add [left_col],eax
jmp .exit
@@: cmp edx,[left_col]
jge .exit
mov [left_col],edx
.exit:
call draw_file
.exit.2:
ret
endf
 
;-----------------------------------------------------------------------------
func key.ctrl_x
cmp [sel.selected],0
je @f
call key.ctrl_c
call key.del
mov [modified],1
@@: ret
endf
 
;-----------------------------------------------------------------------------
func key.ctrl_c
mov [copy_size],0
cmp [sel.selected],0
je .exit
cld
mov eax,[sel.begin.y]
cmp eax,[sel.end.y]
je .single_line
mov ecx,[sel.begin.y]
call get_line_offset
inc ecx
push ecx
mov edi,AREA_CBUF
call get_real_length
sub eax,[sel.begin.x]
jge @f
xor eax,eax
@@: add esi,[sel.begin.x]
add esi,4
stosd
mov ecx,eax
jecxz @f
rep movsb
@@: mov ecx,[sel.end.y]
call get_line_offset
pop ecx
cmp ecx,[sel.end.y]
je @f
mov eax,esi
call get_line_offset
sub eax,esi
mov ecx,eax
rep movsb
mov ecx,[sel.end.y]
@@: call get_line_offset
movzx eax,word[esi]
add esi,4
; lodsd
cmp eax,[sel.end.x]
jle @f
mov eax,[sel.end.x]
@@: mov ebx,edi
stosd
; add esi,eax
mov ecx,eax
jecxz @f
rep movsb
sub eax,[sel.end.x]
jz @f
neg eax
mov ecx,eax
add [ebx],eax
mov al,' '
rep stosb
@@: sub edi,AREA_CBUF
mov [copy_size],edi
mov eax,[sel.end.y]
sub eax,[sel.begin.y]
inc eax
mov [copy_count],eax
.exit:
ret
 
.single_line:
mov eax,[sel.end.x]
sub eax,[sel.begin.x]
mov edi,AREA_CBUF
stosd
mov ecx,[sel.begin.y]
call get_line_offset
mov ebx,[sel.begin.x]
mov ecx,[sel.end.x]
cmp ebx,[esi]
jge .add_spaces
cmp ecx,[esi]
jle .lp1
mov ecx,[esi]
.lp1: sub ecx,[sel.begin.x]
sub eax,ecx
lea esi,[esi+ebx+4]
rep movsb
 
.add_spaces:
mov ecx,eax
mov al,' '
jecxz @b
rep stosb
jmp @b
endf
 
;-----------------------------------------------------------------------------
func key.ctrl_v
cmp [copy_size],0
je .exit
 
call delete_selection
 
mov ecx,[pos.y]
call get_line_offset
pushd [esi] esi
mov ecx,[pos.x]
call line_add_spaces
mov ecx,[copy_size]
sub ecx,4
mov edi,AREA_TEMP2
mov eax,esi
mov esi,edi
sub esi,ecx
lea ecx,[eax+4]
add ecx,[pos.x]
neg ecx
lea ecx,[esi+ecx+1]
std
rep movsb
 
mov ecx,[copy_count]
dec ecx
jz .single_line
 
cld
pop edi
add edi,4
mov esi,AREA_CBUF
lodsd
 
mov ebx,[pos.x]
add eax,ebx
mov [edi-4],ax
sub eax,ebx
call .check_columns
add edi,ebx
@@: push ecx
mov ecx,eax
rep movsb
lodsd
and eax,0x0000FFFF
stosd
or dword[edi-4],0x00010000
pop ecx
loop @b
 
pop ecx
sub ecx,ebx
add [edi-4],cx
call .check_columns
mov ecx,eax
rep movsb
 
mov [pos.x],eax
mov [sel.x],eax
mov eax,[copy_count]
dec eax
add [pos.y],eax
add [sel.y],eax
add [lines],eax
 
call check_inv_all
mov [modified],1
jmp .exit
 
.single_line:
cld
pop edi
add edi,4
mov esi,AREA_CBUF
lodsd
add [edi-4],ax
and dword[edi-4],not 0x00020000
or dword[edi-4],0x00010000
call .check_columns
add edi,[pos.x]
add esp,4
mov ecx,eax
rep movsb
 
add [pos.x],eax
add [sel.x],eax
 
call check_inv_all
mov [modified],1
 
.exit:
ret
 
.check_columns:
push eax
movzx eax,word[edi-4]
cmp eax,[columns]
jbe @f
mov [columns],eax
@@: pop eax
ret
; push eax ebx esi
; add esi,eax
; xor ebx,ebx
; neg eax
; jz .lp1
; @@: cmp byte[esi+ebx-1],' '
; jne .lp1
; dec ebx
; cmp ebx,eax
; jg @b
; .lp1: add ebx,[edi-4]
; cmp [columns],ebx
; jae @f
; mov [columns],ebx
; @@: pop esi ebx eax
; ret
 
endf
 
;-----------------------------------------------------------------------------
func key.ctrl_d ;///// INSERT SEPARATOR //////////////////////////////////////
;-----------------------------------------------------------------------------
mov ecx,[pos.y]
call get_line_offset
mov ebx,esi
 
mov ecx,[lines]
call get_line_offset
lea edi,[esi+90+4]
lea ecx,[esi+4]
sub ecx,ebx
std
rep movsb
 
lea edi,[ebx+5]
mov word[ebx],90
mov al,ASEPC
mov ecx,79
cld
rep stosb
mov al,' '
mov ecx,10
rep stosb
mov byte[ebx+4],';'
 
inc [lines]
inc [pos.y]
m2m [sel.y],[pos.y]
 
call check_inv_all
mov [modified],1
 
.exit:
ret
endf
 
;-----------------------------------------------------------------------------
func key.ctrl_y ;///// DELETE CURRENT LINE ///////////////////////////////////
;-----------------------------------------------------------------------------
mov eax,[pos.y]
inc eax
cmp eax,[lines]
jge .exit
 
mov ecx,[pos.y]
call get_line_offset
mov edi,esi
lodsd
add esi,eax
 
dec [lines]
mov ecx,AREA_TEMP2
sub ecx,esi
shr ecx,2 ;// fixed (was 4)
cld
rep movsd
call check_inv_all
mov [modified],1
 
.exit:
ret
endf
 
;-----------------------------------------------------------------------------
func key.up ;///// GO TO PREVIOUS LINE ///////////////////////////////////////
;-----------------------------------------------------------------------------
call clear_selection
 
;-----------------------------------------------------------------------------
key.shift_up: ;///// GO TO PREVIOUS LINE, WITH SELECTION ////////////////
;-----------------------------------------------------------------------------
mov eax,[pos.y]
dec eax
jns @f
xor eax,eax
@@: mov ecx,[top_line]
cmp eax,ecx
jae @f
dec ecx
jns @f
xor ecx,ecx
@@: test byte[shi+2],0x01
jnz @f
mov [sel.y],eax
@@: call check_inv_all.skip_init
 
.exit:
ret
endf
 
;-----------------------------------------------------------------------------
func key.down ;///// GO TO NEXT LINE /////////////////////////////////////////
;-----------------------------------------------------------------------------
call clear_selection
 
;-----------------------------------------------------------------------------
key.shift_down: ;///// GO TO NEXT LINE, WITH SELECTION //////////////////
;-----------------------------------------------------------------------------
 
mov eax,[pos.y]
inc eax
cmp eax,[lines]
jb @f
dec eax
@@: mov ecx,[top_line]
mov edx,eax
sub edx,ecx
cmp edx,[lines.scr]
jb @f
inc ecx
@@: test byte[shi+2],0x01
jnz @f
mov [sel.y],eax
@@: call check_inv_all.skip_init
 
.exit:
ret
endf
 
;-----------------------------------------------------------------------------
func key.left ;///// GO TO PREVIOUS CHAR /////////////////////////////////////
;-----------------------------------------------------------------------------
call clear_selection
 
;-----------------------------------------------------------------------------
key.shift_left: ;///// GO TO PREVIOUS CHAR, WITH SELECTION //////////////
;-----------------------------------------------------------------------------
mov eax,[pos.x]
dec eax
jns @f
inc eax
@@: test byte[shi+2],0x01
jnz @f
mov [sel.x],eax
@@: mov [pos.x],eax
call check_inv_all
 
.exit:
ret
endf
 
;-----------------------------------------------------------------------------
func key.right ;///// GO TO NEXT CHAR ////////////////////////////////////////
;-----------------------------------------------------------------------------
call clear_selection
 
;-----------------------------------------------------------------------------
key.shift_right: ;///// GO TO NEXT CHAR, WITH SELECTION /////////////////
;-----------------------------------------------------------------------------
mov eax,[pos.x]
inc eax
cmp eax,[columns]
jbe @f
dec eax
@@: test byte[shi+2],0x01
jnz @f
mov [sel.x],eax
@@: mov [pos.x],eax
call check_inv_all
 
.exit:
ret
endf
 
;-----------------------------------------------------------------------------
func key.pgup ;///// GO TO PREVIOUS PAGE /////////////////////////////////////
;-----------------------------------------------------------------------------
call clear_selection
 
;-----------------------------------------------------------------------------
key.shift_pgup: ;///// GO TO PREVIOUS PAGE, WITH SELECTION //////////////
;-----------------------------------------------------------------------------
mov edx,[lines.scr]
dec edx
mov eax,[pos.y]
mov ecx,[top_line]
sub eax,edx
jns @f
xor eax,eax
@@: sub ecx,edx
jns @f
xor ecx,ecx
@@: test byte[shi+2],0x01
jnz @f
mov [sel.y],eax
@@: call check_inv_all.skip_init
 
.exit:
ret
endf
 
;-----------------------------------------------------------------------------
func key.pgdn ;///// GO TO NEXT PAGE /////////////////////////////////////////
;-----------------------------------------------------------------------------
call clear_selection
 
;-----------------------------------------------------------------------------
key.shift_pgdn: ;///// GO TO NEXT PAGE, WITH SELECTION //////////////////
;-----------------------------------------------------------------------------
mov edx,[lines.scr]
dec edx
mov eax,[pos.y]
mov ecx,[top_line]
add eax,edx
add ecx,edx
cmp eax,[lines]
jb @f
mov eax,[lines]
dec eax
@@: test byte[shi+2],0x01
jnz @f
mov [sel.y],eax
@@: call check_inv_all.skip_init
 
.exit:
ret
endf
 
;-----------------------------------------------------------------------------
func key.home ;///// GO TO LINE START ////////////////////////////////////////
;-----------------------------------------------------------------------------
call clear_selection
 
;-----------------------------------------------------------------------------
key.shift_home: ;///// GO TO LINE START, WITH SELECTION /////////////////
;-----------------------------------------------------------------------------
mov [pos.x],0
test byte[shi+2],0x01
jnz @f
mov [sel.x],0
@@: call check_inv_all
 
.exit:
ret
endf
 
;-----------------------------------------------------------------------------
func key.end ;///// GO TO LINE END ///////////////////////////////////////////
;-----------------------------------------------------------------------------
call clear_selection
 
;-----------------------------------------------------------------------------
key.shift_end: ;///// GO TO LINE END, WITH SELECTION ////////////////////
;-----------------------------------------------------------------------------
mov ecx,[pos.y]
call get_line_offset
call get_real_length
mov [pos.x],eax
test byte[shi+2],0x01
jnz @f
mov [sel.x],eax
@@: call check_inv_all
 
.exit:
ret
endf
 
;-----------------------------------------------------------------------------
func key.ctrl_home ;///// GO TO PAGE START ///////////////////////////////////
;-----------------------------------------------------------------------------
call clear_selection
 
;-----------------------------------------------------------------------------
key.shift_ctrl_home: ;///// GO TO PAGE START, WITH SELECTION ////////////
;-----------------------------------------------------------------------------
mov eax,[top_line]
mov ecx,eax
test byte[shi+2],0x01
jnz @f
mov [sel.y],eax
@@: call check_inv_all.skip_init
 
.exit:
ret
endf
 
;-----------------------------------------------------------------------------
func key.ctrl_end ;///// GO TO PAGE END //////////////////////////////////////
;-----------------------------------------------------------------------------
call clear_selection
 
;-----------------------------------------------------------------------------
key.shift_ctrl_end: ;///// GO TO PAGE END, WITH SELECTION ///////////////
;-----------------------------------------------------------------------------
mov ecx,[top_line]
mov eax,[lines.scr]
cmp eax,[lines]
jle @f
mov eax,[lines]
@@: add eax,ecx
dec eax
test byte[shi+2],0x01
jnz @f
mov [sel.y],eax
@@: call check_inv_all.skip_init
 
.exit:
ret
endf
 
;-----------------------------------------------------------------------------
func key.ctrl_pgup ;///// GO TO DOCUMENT START ///////////////////////////////
;-----------------------------------------------------------------------------
call clear_selection
 
;-----------------------------------------------------------------------------
key.shift_ctrl_pgup: ;///// GO TO DOCUMENT START, WITH SELECTION ////////
;-----------------------------------------------------------------------------
xor eax,eax
mov [top_line],eax
mov [pos.y],eax
test byte[shi+2],0x01
jnz @f
mov [sel.y],eax
@@: call check_inv_all.skip_check
 
.exit:
ret
endf
 
;-----------------------------------------------------------------------------
func key.ctrl_pgdn ;///// GO TO DOCUMENT END /////////////////////////////////
;-----------------------------------------------------------------------------
call clear_selection
 
;-----------------------------------------------------------------------------
key.shift_ctrl_pgdn: ;///// GO TO DOCUMENT END, WITH SELECTION //////////
;-----------------------------------------------------------------------------
mov eax,[lines] ; eax = lines in the file
mov [pos.y],eax
sub eax,[lines.scr] ; eax -= lines on the screen
jns @f
xor eax,eax
@@: mov [top_line],eax
dec [pos.y]
test byte[shi+2],0x01
jnz @f
push [pos.y]
pop [sel.y]
@@: call check_inv_all.skip_check
 
.exit:
ret
endf
 
;-----------------------------------------------------------------------------
func key.del ;///// DELETE NEXT CHAR OR SELECTION ////////////////////////////
;-----------------------------------------------------------------------------
call delete_selection
jnc .exit.2
 
mov ecx,[pos.y]
call get_line_offset
and dword[esi],not 0x00020000
or dword[esi],0x00010000
lea ebx,[esi+4]
mov ebp,esi
 
call get_real_length
or eax,eax
je .line_up
 
mov ecx,[pos.x]
cmp ecx,eax
jae .line_up
lea edi,[ebx+ecx]
neg ecx
movzx eax,word[ebp]
add ecx,eax;[ebp]
repe scasb
je .line_up
 
mov edi,ebx
mov ecx,[pos.x]
add edi,ecx
lea esi,[edi+1]
neg ecx
movzx eax,word[ebp]
add ecx,eax;[ebp]
dec ecx
rep movsb
mov byte[edi],' '
 
m2m [sel.x],[pos.x]
m2m [sel.y],[pos.y]
call check_inv_all
mov [modified],1
ret
 
.line_up:
mov eax,[lines]
dec eax
cmp eax,[pos.y]
je .exit
mov edi,AREA_TEMP+4
mov esi,ebx
mov ecx,[pos.x]
rep movsb
mov ecx,[pos.x]
mov [AREA_TEMP],ecx
cmp cx,[ebp]
jbe @f
movzx eax,word[ebp]
sub ecx,eax;[ebp]
sub edi,ecx
mov al,' '
rep stosb
@@: lea esi,[ebx+4]
movzx eax,word[ebp]
add esi,eax;[ebp]
movzx ecx,word[esi-4]
add [AREA_TEMP],ecx
or dword[AREA_TEMP],0x00010000
rep movsb
 
lea ecx,[edi-AREA_TEMP]
 
mov esi,AREA_TEMP
call get_real_length
cmp eax,[columns]
jbe @f
mov [columns],eax
@@:
push ecx
mov edi,AREA_TEMP2
lea esi,[edi+8]
sub esi,ecx
movzx eax,word[ebp]
add esi,eax;[ebp]
; lea eax,[ebp+4]
; add eax,[ebp]
movzx eax,word[ebp]
movzx eax,word[ebp+eax+4]
add esi,eax;[eax]
lea ecx,[esi-4]
sub ecx,ebp
std
cmp esi,edi
jb @f
jz .lp1
mov edi,ebp
add edi,[esp]
lea esi,[ebp+8]
movzx eax,word[esi-8]
add esi,eax;[esi-8]
movzx eax,word[esi-4]
add esi,eax;[esi-4]
mov ecx,AREA_TEMP2
sub ecx,esi
cld
@@: rep movsb
.lp1: pop ecx
mov esi,AREA_TEMP
mov edi,ebp
cld
rep movsb
 
.ok.dec.lines:
dec [lines]
mov eax,[lines]
cmp [pos.y],eax
jb @f
dec eax
mov [pos.y],eax
@@: m2m [sel.x],[pos.x]
m2m [sel.y],[pos.y]
 
mov [modified],1
.exit.2:
call check_inv_all
 
.exit:
ret
endf
 
;-----------------------------------------------------------------------------
; INSERT {
key.ins:
;// ... toggle insert/overwrite mode here ...
xor [ins_mode],1
call check_inv_str
ret
; INSERT }
 
;-----------------------------------------------------------------------------
func key.bkspace ;///// DELETE PREVIOUS CHAR OR SELECTION ////////////////////
;-----------------------------------------------------------------------------
call delete_selection
jnc key.del.exit.2
 
mov eax,[pos.x]
dec eax
js .line_up
 
dec [pos.x]
mov ecx,[pos.y]
call get_line_offset
and dword[esi],not 0x00020000
or dword[esi],0x00010000
 
mov ebx,eax
call get_real_length
cmp eax,[pos.x]
jae @f
m2m [sel.x],[pos.x]
call check_inv_all
mov [modified],1
ret
 
@@: lea edi,[esi+4+ebx]
mov ecx,ebx
neg ecx
movzx eax,word[esi]
add ecx,eax;[esi]
dec ecx
lea esi,[edi+1]
cld
rep movsb
mov byte[edi],' '
 
m2m [sel.x],[pos.x]
m2m [sel.y],[pos.y]
call check_inv_str
mov [modified],1
ret
 
.line_up:
cmp [pos.y],0
jne @f
ret
@@: mov ecx,[pos.y]
dec ecx
call get_line_offset
and dword[esi],not 0x00020000
or dword[esi],0x00010000
 
mov ebp,esi
lea ebx,[esi+4]
movzx ecx,word[ebp]
@@: cmp byte[ebx+ecx-1],' '
jne @f
dec ecx
jg @b
@@: mov [pos.x],ecx
dec [pos.y]
cld
jmp key.del.line_up
endf
 
;-----------------------------------------------------------------------------
func key.tab ;///// TABULATE /////////////////////////////////////////////////
;-----------------------------------------------------------------------------
call delete_selection
mov eax,[pos.x]
 
mov ecx,eax
add eax,ATABW
and eax,not(ATABW-1)
push eax ' '
sub eax,ecx
.direct:
mov ecx,[pos.y]
call get_line_offset
and dword[esi],not 0x00020000
or dword[esi],0x00010000
 
xchg eax,ecx
 
call get_real_length
cmp eax,[pos.x]
jae @f
mov eax,[pos.x]
@@: movzx edx,word[esi]
sub edx,eax
cmp ecx,edx
jl @f
pushad; esi ecx eax
mov ecx,AREA_TEMP2-10+1
; lea eax,[esi+4]
; add eax,[esi]
movzx eax,word[esi]
lea eax,word[esi+eax+4]
sub ecx,eax
mov edi,AREA_TEMP2
mov esi,AREA_TEMP2-10
std
rep movsb
mov ecx,10
mov al,' '
rep stosb
popad; eax ecx esi
add word[esi],10
jmp @b
@@: lea ebx,[esi+4]
push ecx
; lea edi,[ebx-1]
; add edi,[esi]
movzx edi,word[esi]
lea edi,[ebx+edi-1]
mov esi,edi
sub esi,ecx
lea ecx,[esi+1]
sub ecx,ebx
sub ecx,[pos.x]
std
rep movsb
.ok: pop ecx ;*******
pop eax
rep stosb
cld
pop [pos.x]
lea esi,[ebx-4]
call get_real_length
cmp eax,[pos.x]
jae @f
mov eax,[pos.x]
@@: cmp eax,[columns]
jbe @f
mov [columns],eax
@@: m2m [sel.x],[pos.x]
m2m [sel.y],[pos.y]
call check_inv_all
mov [modified],1
 
.exit:
ret
endf
 
;-----------------------------------------------------------------------------
func key.return ;///// CARRIAGE RETURN ///////////////////////////////////////
;-----------------------------------------------------------------------------
call delete_selection
 
mov ecx,[pos.y]
call get_line_offset
 
mov ebx,[pos.x]
cmp bx,[esi]
jb @f
movzx ebx,word[esi]
dec ebx
jns @f
xor ebx,ebx
@@:
cld
 
mov edi,AREA_TEMP
mov ebp,esi
mov ecx,ebx
inc ecx
@@: dec ecx
jz @f
cmp byte[esi+ecx+4-1],' '
je @b
@@: lea eax,[ecx+10]
or eax,0x00010000
stosd
jecxz @f
push esi
add esi,4
rep movsb
pop esi
@@: mov al,' '
mov ecx,10
rep stosb
 
movzx ecx,word[esi]
sub ecx,ebx;[pos.x]
add esi,ebx;[pos.x]
add esi,4
inc ecx
@@: dec ecx
jz @f
cmp byte[esi+ecx-1],' '
je @b
@@: jz .lp1
@@: cmp byte[esi],' '
jne .lp1
inc esi
loop @b
.lp1: test [options],OPTS_AUTOINDENT
jz .lp2
push edi ecx
movzx ecx,word[ebp]
lea edi,[ebp+4]
mov al,' '
repe scasb
mov eax,ecx
pop ecx edi
je .lp2
neg eax
movzx edx,word[ebp]
add eax,edx;[ebp]
dec eax
jmp @f
.lp2: xor eax,eax
@@: mov edx,edi
add edi,4
mov [pos.x],eax
jecxz @f
push ecx
mov ecx,eax
mov al,' '
rep stosb
pop ecx
@@: jecxz @f
rep movsb
@@: mov ecx,10
mov al,' '
rep stosb
 
lea eax,[edi-4]
sub eax,edx
or eax,0x00010000
mov [edx],eax
 
lea ecx,[edi-AREA_TEMP]
 
push ecx
mov edi,AREA_TEMP2
lea esi,[edi+4]
sub esi,ecx
movzx ecx,word[ebp]
add esi,ecx;[ebp]
lea ecx,[esi-4]
sub ecx,ebp
std
cmp esi,edi
jb @f
je .lp3
lea esi,[ebp+4]
mov eax,[esp]
lea edi,[esi+eax-4]
movzx ecx,word[ebp]
add esi,ecx;[ebp]
mov ecx,AREA_TEMP2
sub ecx,esi
cld
@@: rep movsb
.lp3: pop ecx
mov esi,AREA_TEMP
mov edi,ebp
cld
rep movsb
 
inc [pos.y]
inc [sel.y]
inc [lines]
 
m2m [sel.x],[pos.x]
 
call check_inv_all
mov [modified],1
 
.exit:
ret
endf