📄 asmedit.inc
字号:
cdq
mov ecx,120
idiv ecx
imul eax,[whell_scroll_lines]
mov ecx,eax
cmp ecx,0
jg scroll_up
neg ecx
jnz scroll_down
jmp done
wm_size:
call update_positions
mov eax,[screen_width]
mul [screen_height]
mov [screen_size],eax
mov [screen_offset],0
shl eax,2
or eax,eax
jz screen_allocated
mov ebx,eax
mov eax,[screen_base]
or eax,eax
jz screen_released
invoke VirtualFree,eax,0,MEM_RELEASE
screen_released:
invoke VirtualAlloc,0,ebx,MEM_COMMIT,PAGE_READWRITE
screen_allocated:
mov [screen_base],eax
call update_screen
lea ebx,[rect]
invoke GetClientRect,[hwnd],ebx
invoke InvalidateRect,[hwnd],ebx,FALSE
jmp done
wm_keydown:
lea ebx,[kbstate]
invoke GetKeyboardState,ebx
cmp [was_selection],0
jne process_key
mov eax,[caret_line]
mov [selection_line],eax
mov eax,[caret_position]
mov [selection_position],eax
mov eax,[caret_line_number]
mov [selection_line_number],eax
process_key:
mov eax,[wparam]
cmp eax,VK_LEFT
je left_key
cmp eax,VK_RIGHT
je right_key
cmp eax,VK_UP
je up_key
cmp eax,VK_DOWN
je down_key
cmp eax,VK_BACK
je backspace__key
cmp eax,VK_HOME
je home_key
cmp eax,VK_END
je end_key
cmp eax,VK_PGUP
je pgup_key
cmp eax,VK_PGDN
je pgdn_key
cmp eax,VK_DELETE
je del_key
cmp eax,VK_INSERT
je ins_key
cmp eax,VK_F6
je duplicate_line
cmp eax,VK_APPS
je menu_key
test [kbstate+VK_CONTROL],80h
jz convert_to_ascii
cmp eax,'Y'
je remove_line
convert_to_ascii:
mov ax,word [lparam+2]
and eax,7Fh
lea ebx,[kbstate]
lea edx,[char]
invoke ToAscii,[wparam],eax,ebx,edx,FALSE
cmp eax,2
je two_characters
or eax,eax
jz ignore
jg process_character
test [editor_style],AES_REVIVEDEADKEYS
je ignore
lea edx,[char]
invoke ToAscii,VK_SPACE,0,ebx,edx,FALSE
jmp process_character
two_characters:
movzx eax,byte [char+1]
invoke PostMessage,[hwnd],WM_CHAR,eax,1 shl 31
process_character:
mov al,byte [char]
cmp al,20h
jae character
cmp al,0Dh
je character
cmp al,9
je character
jmp ignore
left_key:
test [kbstate+VK_CONTROL],80h
jnz word_left
cmp [caret_position],0
jle moved_caret
dec [caret_position]
jmp moved_caret
right_key:
test [kbstate+VK_CONTROL],80h
jnz word_right
mov eax,[caret_position]
cmp eax,[maximum_position]
jae moved_caret
inc [caret_position]
jmp moved_caret
up_key:
call move_line_up
jmp moved_caret
down_key:
call move_line_down
jmp moved_caret
home_key:
test [kbstate+VK_CONTROL],80h
jnz screen_home
mov [caret_position],0
jmp moved_caret
end_key:
test [kbstate+VK_CONTROL],80h
jnz screen_end
call move_to_line_end
jmp moved_caret
screen_home:
mov eax,[window_line]
mov [caret_line],eax
mov eax,[window_line_number]
mov [caret_line_number],eax
jmp moved_caret
screen_end:
mov eax,[window_line_number]
add eax,[window_height]
dec eax
call find_line
mov [caret_line],esi
mov [caret_line_number],ecx
jmp moved_caret
pgup_key:
test [kbstate+VK_CONTROL],80h
jnz text_home
call move_page_up
jmp moved_caret
pgdn_key:
test [kbstate+VK_CONTROL],80h
jnz text_end
call move_page_down
jmp moved_caret
text_home:
mov eax,[first_line]
mov [caret_line],eax
mov [caret_line_number],1
jmp moved_caret
text_end:
or eax,-1
call find_line
mov [caret_line],esi
mov [caret_line_number],ecx
jmp moved_caret
word_left:
call move_to_previous_word
jmp moved_caret
word_right:
call get_caret_segment
call move_to_next_word
jmp moved_caret
ins_key:
test [kbstate+VK_MENU],80h
jnz switch_blocks
test [kbstate+VK_CONTROL],80h
jnz wm_copy
test [kbstate+VK_SHIFT],80h
jnz wm_paste
xor [editor_mode],AEMODE_OVERWRITE
mov [notification],AEN_MODECHANGE
call create_caret
cmp [was_selection],1
je done
mov [selection_line],0
jmp done
del_key:
test [kbstate+VK_CONTROL],80h
jnz wm_clear
test [kbstate+VK_SHIFT],80h
jnz wm_cut
cmp [was_selection],0
je no_selection
test [editor_style],AES_SECURESEL
jz wm_clear
no_selection:
mov esi,[caret_line]
test [editor_mode],AEMODE_OVERWRITE
jnz delete_char
call check_line_length
cmp ecx,[caret_position]
ja delete_char
cmp dword [esi],0
je ignore
call store_status_for_undo
call cut_line_break
mov esi,[caret_line]
call check_line_length
mov [selection_line],0
jmp text_modified
delete_char:
mov [current_operation],VK_DELETE
cmp [last_operation],VK_DELETE
je undo_delete_ok
call store_status_for_undo
undo_delete_ok:
call delete_character
mov esi,[caret_line]
call check_line_length
mov [selection_line],0
jmp text_modified
backspace__key:
cmp [was_selection],0
je no_selection_to_clear
test [editor_style],AES_SECURESEL
jz wm_clear
no_selection_to_clear:
cmp [caret_position],0
je line_back
test [kbstate+VK_CONTROL],80h
jnz word_back
mov [current_operation],VK_BACK
cmp [last_operation],VK_BACK
je undo_back_ok
call store_status_for_undo
undo_back_ok:
dec [caret_position]
call delete_character
mov esi,[caret_line]
call check_line_length
mov [selection_line],0
jmp text_modified
line_back:
test [editor_mode],AEMODE_OVERWRITE
jnz ignore
mov esi,[caret_line]
mov esi,[esi+4]
or esi,esi
jz ignore
call store_status_for_undo
mov [caret_line],esi
dec [caret_line_number]
call check_line_length
mov [caret_position],ecx
call cut_line_break
mov esi,[caret_line]
call check_line_length
mov [selection_line],0
jmp text_modified
word_back:
call store_status_for_undo
push [caret_position]
mov esi,[caret_line]
xor eax,eax
xchg eax,[esi+4]
push eax
call move_to_previous_word
pop eax
mov esi,[caret_line]
mov [esi+4],eax
pop ecx
sub ecx,[caret_position]
call delete_from_line
mov esi,[caret_line]
call check_line_length
jmp text_modified
character:
cmp al,0Dh
je enter_key
cmp al,9
je tab_key
cmp [was_selection],0
je no_selection_to_replace
call store_status_for_undo
test [editor_style],AES_SECURESEL
jnz character_undo_ok
push eax
call delete_block
pop eax
call put_character
mov esi,[caret_line]
call check_line_length
mov [selection_line],0
jmp text_modified
no_selection_to_replace:
mov [current_operation],VK_SPACE
cmp [last_operation],VK_SPACE
je character_undo_ok
call store_status_for_undo
character_undo_ok:
call put_character
mov esi,[caret_line]
call check_line_length
mov [selection_line],0
jmp text_modified
tab_key:
call store_status_for_undo
cmp [was_selection],0
je tab_securesel
test [editor_style],AES_SECURESEL
jnz tab_securesel
call delete_block
call make_tab
mov [selection_line],0
jmp text_modified
tab_securesel:
call make_tab
mov [selection_line],0
jmp text_modified
make_tab:
test [editor_style],AES_SMARTTABS
jz standard_tab
mov esi,[caret_line]
mov esi,[esi+4]
or esi,esi
jz standard_tab
mov edx,[caret_position]
call find_segment
cmp edx,SEGMENT_DATA_LENGTH
jae standard_tab
push dword 0
find_space:
lea edi,[esi+SEGMENT_HEADER_LENGTH+edx]
mov ecx,SEGMENT_DATA_LENGTH
sub ecx,edx
mov ebx,ecx
mov al,20h
repne scasb
jne no_space_in_this_segment
sub ebx,ecx
dec ebx
add edx,ebx
add [esp],ebx
call get_indent
pop ecx
or ebx,ebx
jz standard_tab
add ecx,ebx
jmp insert_tab_spaces
no_space_in_this_segment:
pop ecx
mov esi,[esi]
btr esi,0
jnc standard_tab
add ecx,SEGMENT_DATA_LENGTH
sub ecx,edx
xor edx,edx
push ecx
jmp find_space
standard_tab:
mov ecx,[caret_position]
and ecx,not 111b
sub ecx,[caret_position]
add ecx,8
insert_tab_spaces:
xor esi,esi
push ecx
call insert_into_line
pop ecx
add [caret_position],ecx
mov esi,[caret_line]
call check_line_length
retn
enter_key:
call store_status_for_undo
cmp [was_selection],0
je enter_secureselection_ok
test [editor_style],AES_SECURESEL
jnz enter_secureselection_ok
call delete_block
enter_secureselection_ok:
xor ebx,ebx
test [editor_style],AES_AUTOINDENT
jz auto_indent_ok
test [editor_mode],AEMODE_OVERWRITE
jnz auto_indent_ok
call get_caret_segment
call get_indent
add [caret_position],ebx
mov esi,[caret_line]
xor edx,edx
call get_indent
auto_indent_ok:
call break_line
mov [selection_line],0
test [editor_mode],AEMODE_OVERWRITE
jnz text_modified
mov esi,[caret_line]
call check_line_length
jmp text_modified
get_indent:
xor ebx,ebx
find_indent_origin:
cmp edx,SEGMENT_DATA_LENGTH
jb find_indent
mov esi,[esi]
btr esi,0
jnc no_indent
sub edx,SEGMENT_DATA_LENGTH
jmp find_indent_origin
find_indent:
lea edi,[esi+SEGMENT_HEADER_LENGTH+edx]
mov ecx,SEGMENT_DATA_LENGTH
sub ecx,edx
add ebx,ecx
mov al,20h
repe scasb
je segment_indent
sub ebx,ecx
dec ebx
retn
segment_indent:
xor edx,edx
mov esi,[esi]
btr esi,0
jc find_indent
no_indent:
xor ebx,ebx
retn
remove_line:
mov esi,[caret_line]
mov esi,[esi]
or esi,esi
jnz do_remove
mov edi,[caret_line]
add edi,SEGMENT_HEADER_LENGTH
mov ecx,SEGMENT_DATA_LENGTH
mov al,20h
repe scasb
je ignore
do_remove:
call store_status_for_undo
cut_extra_segments:
btr esi,0
jnc replace_with_next_line
call store_segment_for_undo
or eax,-1
xchg eax,[esi]
mov esi,eax
inc [released_segments]
jmp cut_extra_segments
replace_with_next_line:
or esi,esi
jz clear_current_line
call store_segment_for_undo
mov ebx,esi
xchg esi,[caret_line]
mov eax,[esi+4]
mov [ebx+4],eax
call store_segment_for_undo
or dword [esi],-1
inc [released_segments]
call cancel_line
mov esi,[esi+4]
or esi,esi
jz line_removed
find_last_segment_of_previous_line:
mov eax,[esi]
btr eax,0
jnc link_to_new_next_line
mov esi,eax
jmp find_last_segment_of_previous_line
link_to_new_next_line:
call store_segment_for_undo
mov [esi],ebx
line_removed:
mov [caret_position],0
mov [selection_line],0
jmp text_modified
clear_current_line:
mov esi,[caret_line]
call store_segment_for_undo
mov dword [esi],0
lea edi,[esi+SEGMENT_HEADER_LENGTH]
mov ecx,SEGMENT_DATA_LENGTH
mov al,20h
rep stosb
jmp line_removed
duplicate_line:
call store_status_for_undo
call allocate_segment
jc memory_shortage
call store_free_segment_for_undo
mov esi,[caret_line]
mov edi,eax
mov [edi+4],esi
mov eax,[esi+8]
mov [edi+8],eax
call register_length
push edi
duplicate_segment:
mov ebx,edi
add edi,SEGMENT_HEADER_LENGTH
add esi,SEGMENT_HEADER_LENGTH
mov ecx,SEGMENT_DATA_LENGTH
rep movsb
sub esi,SEGMENT_LENGTH
mov eax,[esi]
btr eax,0
jnc all_segments_duplicated
mov esi,eax
call allocate_segment
jc memory_shortage
call store_free_segment_for_undo
mov edi,eax
or eax,1
mov [ebx],eax
or ebx,1
mov [edi+4],ebx
jmp duplicate_segment
all_segments_duplicated:
inc [lines_count]
call store_segment_for_undo
mov [ebx],eax
pop ebx
mov [esi],ebx
mov esi,eax
or esi,esi
jz text_modified
call store_segment_for_undo
mov [esi+4],ebx
jmp text_modified
menu_key:
cmp [menu_handle],0
je ignore
lea ebx,[point]
mov eax,[caret_x]
mov [ebx+POINT.x],eax
mov eax,[caret_y]
add eax,[font_height]
mov [ebx+POINT.y],eax
invoke ClientToScreen,[hwnd],ebx
invoke TrackPopupMenu,[menu_handle],TPM_RIGHTBUTTON,[ebx+POINT.x],[ebx+POINT.y],0,[menu_window],0
jmp ignore
wm_syskeydown:
mov eax,[wparam]
cmp eax,VK_INSERT
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -