📄 fasmw.asm
字号:
.finish:
pop esi ebx
ret
endp
proc AddStringToHistory lpstr
mov eax,[lpstr]
cmp byte [eax],0
je .finish
invoke SendMessage,[hwnd_history],LB_FINDSTRINGEXACT,-1,[lpstr]
cmp eax,LB_ERR
je .insert
invoke SendMessage,[hwnd_history],LB_DELETESTRING,eax,0
.insert:
invoke SendMessage,[hwnd_history],LB_INSERTSTRING,0,[lpstr]
cmp eax,LB_ERRSPACE
jne .finish
invoke SendMessage,[hwnd_history],LB_GETCOUNT,0,0
sub eax,1
jc .finish
invoke SendMessage,[hwnd_history],LB_DELETESTRING,eax,0
jmp .insert
.finish:
ret
endp
proc FindDialog hwnd_dlg,msg,wparam,lparam
push ebx esi edi
cmp [msg],WM_INITDIALOG
je .initdialog
cmp [msg],WM_COMMAND
je .command
cmp [msg],WM_CLOSE
je .close
xor eax,eax
jmp .finish
.initdialog:
invoke SendMessage,[hwnd_asmedit],AEM_GETWORDATCARET,1000h,search_string
invoke SetDlgItemText,[hwnd_dlg],ID_TEXT,search_string
invoke GetDlgItem,[hwnd_dlg],ID_TEXT
stdcall GetStringsFromHistory,eax
xor eax,eax
test [search_settings],AEFIND_CASESENSITIVE
setnz al
invoke CheckDlgButton,[hwnd_dlg],ID_CASESENSITIVE,eax
xor eax,eax
test [search_settings],AEFIND_WHOLEWORDS
setnz al
invoke CheckDlgButton,[hwnd_dlg],ID_WHOLEWORDS,eax
xor eax,eax
test [search_settings],AEFIND_BACKWARD
setnz al
invoke CheckDlgButton,[hwnd_dlg],ID_BACKWARD,eax
jmp .update
.command:
cmp [wparam],ID_TEXT + CBN_EDITCHANGE shl 16
je .update
cmp [wparam],ID_TEXT + CBN_SELCHANGE shl 16
je .selchange
cmp [wparam],IDCANCEL
je .close
cmp [wparam],IDOK
jne .processed
xor ebx,ebx
invoke IsDlgButtonChecked,[hwnd_dlg],ID_CASESENSITIVE
or eax,eax
jz .casesensitive_ok
or ebx,AEFIND_CASESENSITIVE
.casesensitive_ok:
invoke IsDlgButtonChecked,[hwnd_dlg],ID_WHOLEWORDS
or eax,eax
jz .wholewords_ok
or ebx,AEFIND_WHOLEWORDS
.wholewords_ok:
invoke IsDlgButtonChecked,[hwnd_dlg],ID_BACKWARD
or eax,eax
jz .backward_ok
or ebx,AEFIND_BACKWARD
.backward_ok:
mov [search_settings],ebx
stdcall AddStringToHistory,search_string
invoke EndDialog,[hwnd_dlg],TRUE
jmp .processed
.selchange:
invoke PostMessage,[hwnd_dlg],WM_COMMAND,ID_TEXT + CBN_EDITCHANGE shl 16,0
jmp .processed
.update:
invoke GetDlgItemText,[hwnd_dlg],ID_TEXT,search_string,1000h
xor ebx,ebx
cmp [search_string],0
setnz bl
invoke GetDlgItem,[hwnd_dlg],IDOK
invoke EnableWindow,eax,ebx
jmp .processed
.close:
invoke EndDialog,[hwnd_dlg],FALSE
.processed:
mov eax,1
.finish:
pop edi esi ebx
ret
endp
proc ReplaceDialog hwnd_dlg,msg,wparam,lparam
push ebx esi edi
cmp [msg],WM_INITDIALOG
je .initdialog
cmp [msg],WM_COMMAND
je .command
jmp .finish
.initdialog:
invoke SetDlgItemText,[hwnd_dlg],ID_NEWTEXT,replace_string
invoke GetDlgItem,[hwnd_dlg],ID_NEWTEXT
stdcall GetStringsFromHistory,eax
xor eax,eax
test [command_flags],CF_REPLACEPROMPT
setnz al
invoke CheckDlgButton,[hwnd_dlg],ID_PROMPT,eax
jmp .finish
.command:
cmp [wparam],IDOK
jne .finish
invoke GetDlgItemText,[hwnd_dlg],ID_NEWTEXT,replace_string,1000h
xor ebx,ebx
invoke IsDlgButtonChecked,[hwnd_dlg],ID_PROMPT
or eax,eax
jz .prompt_ok
or ebx,CF_REPLACEPROMPT
.prompt_ok:
mov [command_flags],ebx
stdcall AddStringToHistory,replace_string
.finish:
stdcall FindDialog,[hwnd_dlg],[msg],[wparam],[lparam]
pop edi esi ebx
ret
endp
proc CompileDialog hwnd_dlg,msg,wparam,lparam
push ebx esi edi
cmp [msg],WM_INITDIALOG
je .initdialog
cmp [msg],WM_COMMAND
je .command
cmp [msg],WM_CLOSE
je .close
xor eax,eax
jmp .finish
.initdialog:
mov eax,[hwnd_dlg]
mov [hwnd_compiler],eax
invoke GetDlgItem,[hwnd_dlg],ID_PROGRESS
mov [hwnd_progress],eax
invoke SendMessage,eax,PBM_SETRANGE,0,40000h
mov [ei.header.mask],TCIF_PARAM
invoke SendMessage,[hwnd_tabctrl],TCM_GETITEM,[lparam],ei
invoke CreateThread,NULL,10000h,flat_assembler,[ei.pszpath],0,param_buffer
mov [hthread],eax
jmp .processed
.command:
cmp [wparam],IDCANCEL
je .close
cmp [wparam],IDOK
jne .finish
.get_exit_code:
invoke WaitForSingleObject,[hthread],-1
invoke GetExitCodeThread,[hthread],param_buffer
invoke CloseHandle,[hthread]
invoke EndDialog,[hwnd_dlg],[param_buffer]
jmp .processed
.close:
invoke TerminateThread,[hthread],0FFh
invoke CloseHandle,[hthread]
invoke GlobalFree,[hmem_display]
mov eax,[memory_start]
or eax,eax
jz .cancel
invoke VirtualFree,eax,0,MEM_RELEASE
mov [memory_start],0
cmp [error_data_size],0
je .cancel
invoke GlobalFree,[hmem_error_data]
.cancel:
invoke EndDialog,[hwnd_dlg],-1
.processed:
mov eax,1
.finish:
pop edi esi ebx
ret
endp
proc ShowLine pszPath,nLine
mov [ei.header.mask],TCIF_PARAM
invoke SendMessage,[hwnd_tabctrl],TCM_GETCURSEL,0,0
invoke SendMessage,[hwnd_tabctrl],TCM_GETITEM,eax,ei
invoke lstrcmpi,[ei.pszpath],[pszPath]
or eax,eax
jz current_file_ok
xor ebx,ebx
find_file_window:
invoke SendMessage,[hwnd_tabctrl],TCM_GETITEM,ebx,ei
or eax,eax
jz load_for_show
invoke lstrcmpi,[ei.pszpath],[pszPath]
or eax,eax
jz show_file
inc ebx
jmp find_file_window
load_for_show:
mov esi,[pszPath]
mov edi,path_buffer
copy_path_for_show:
lodsb
stosb
or al,al
jnz copy_path_for_show
invoke GetFileTitle,path_buffer,name_buffer,100h
invoke SendMessage,[hwnd_main],FM_OPEN,name_buffer,path_buffer
cmp eax,-1
je show_failed
jmp current_file_ok
show_file:
invoke SendMessage,[hwnd_tabctrl],TCM_SETCURSEL,ebx,0
invoke SendMessage,[hwnd_main],FM_SELECT,ebx,0
current_file_ok:
mov eax,[nLine]
mov [aepos.selectionLine],eax
mov [aepos.caretLine],eax
get_lines_to_show:
invoke SendMessage,[hwnd_asmedit],AEM_GETLINELENGTH,[nLine],0
mov esi,string_buffer
cmp eax,1000h
jb get_line_data
mov edi,eax
invoke VirtualAlloc,0,edi,MEM_COMMIT,PAGE_READWRITE
or eax,eax
jz show_lines
mov esi,eax
get_line_data:
invoke SendMessage,[hwnd_asmedit],AEM_GETLINE,[nLine],esi
push esi
mov ecx,eax
or ecx,ecx
jz no_more_lines
mov eax,[nLine]
mov [aepos.caretLine],eax
mov ebx,characters
xor edx,edx
check_for_more_lines:
lodsb
cmp al,3Bh
je no_more_lines
mov ah,al
xlatb
or al,al
jz .symbol
or edx,edx
jnz .neutral
cmp ah,27h
je .quoted
cmp ah,22h
je .quoted
.neutral:
or edx,-1
loop check_for_more_lines
jmp no_more_lines
.symbol:
cmp ah,'\'
je .backslash
xor edx,edx
loop check_for_more_lines
jmp no_more_lines
.quoted:
dec ecx
jz no_more_lines
lodsb
cmp al,ah
jne .quoted
dec ecx
jz no_more_lines
lodsb
cmp al,ah
je .quoted
dec esi
xor edx,edx
jmp check_for_more_lines
.backslash:
dec ecx
jz more_lines
lodsb
cmp al,20h
je .backslash
cmp al,3Bh
jne no_more_lines
more_lines:
inc [nLine]
pop esi
cmp esi,string_buffer
je get_lines_to_show
invoke VirtualFree,esi,edi,MEM_DECOMMIT
jmp get_lines_to_show
no_more_lines:
pop esi
cmp esi,string_buffer
je show_lines
invoke VirtualFree,esi,edi,MEM_DECOMMIT
show_lines:
mov [aepos.selectionPosition],1
inc [aepos.caretLine]
mov [aepos.caretPosition],1
invoke SendMessage,[hwnd_asmedit],AEM_GETLINELENGTH,[aepos.caretLine],0
cmp eax,-1
jne show_ok
dec [aepos.caretLine]
invoke SendMessage,[hwnd_asmedit],AEM_GETLINELENGTH,[aepos.caretLine],0
inc eax
mov [aepos.caretPosition],eax
show_ok:
invoke SendMessage,[hwnd_asmedit],AEM_SETPOS,aepos,0
invoke SendMessage,[hwnd_asmedit],AEM_GETMODE,0,0
and eax,not AEMODE_VERTICALSEL
invoke SendMessage,[hwnd_asmedit],AEM_SETMODE,eax,0
mov eax,[aepos.selectionLine]
xchg eax,[aepos.caretLine]
mov [aepos.selectionLine],eax
mov eax,[aepos.selectionPosition]
xchg eax,[aepos.caretPosition]
mov [aepos.selectionPosition],eax
invoke SendMessage,[hwnd_asmedit],AEM_SETPOS,aepos,0
xor eax,eax
ret
show_failed:
or eax,-1
ret
endp
proc SummaryDialog hwnd_dlg,msg,wparam,lparam
push ebx esi edi
cmp [msg],WM_INITDIALOG
je .initdialog
cmp [msg],WM_COMMAND
je .command
cmp [msg],WM_CLOSE
je .close
xor eax,eax
jmp .finish
.initdialog:
invoke GlobalLock,[hmem_display]
invoke SetDlgItemText,[hwnd_dlg],ID_DISPLAY,eax
invoke GlobalUnlock,[hmem_display]
invoke GlobalFree,[hmem_display]
cmp [lparam],2
je .error_details
cmp [lparam],0
jne .error_message
movzx eax,[current_pass]
inc eax
mov [param_buffer],eax
mov eax,[written_size]
mov [param_buffer+4],eax
mov [param_buffer+12],eax
mov eax,[total_time]
xor edx,edx
mov ebx,100
div ebx
mov ebx,_summary_small
or eax,eax
jz .summary_ok
xor edx,edx
mov ebx,10
div ebx
mov [param_buffer+4],eax
mov [param_buffer+8],edx
mov ebx,_summary
.summary_ok:
invoke wvsprintf,string_buffer,ebx,param_buffer
invoke SetDlgItemText,[hwnd_dlg],ID_MESSAGE,string_buffer
cmp [lparam],2
jne .processed
.show_line:
invoke SendDlgItemMessage,[hwnd_dlg],ID_LINES,LB_GETCURSEL,0,0
lea ebx,[eax+1]
invoke GlobalLock,[hmem_error_data]
mov esi,[eax+ebx*8]
add esi,eax
mov eax,[eax+ebx*8+4]
stdcall ShowLine,esi,eax
invoke GlobalUnlock,[hmem_error_data]
jmp .processed
.error_details:
invoke GlobalLock,[hmem_error_data]
mov edi,eax
xor ebx,ebx
.get_error_lines:
inc ebx
mov esi,[edi+ebx*8]
add esi,edi
mov eax,[edi+ebx*8+4]
mov [param_buffer+4],eax
invoke GetFullPathName,esi,1000h,path_buffer,param_buffer
invoke wvsprintf,string_buffer,_line_number,param_buffer
invoke SendDlgItemMessage,[hwnd_dlg],ID_LINES,LB_ADDSTRING,0,string_buffer
cmp ebx,[edi]
jb .get_error_lines
mov eax,[edi+4]
add eax,edi
invoke SetDlgItemText,[hwnd_dlg],ID_INSTRUCTION,eax
invoke GlobalUnlock,[hmem_error_data]
invoke SendDlgItemMessage,[hwnd_dlg],ID_LINES,LB_SETCURSEL,0,0
.error_message:
invoke LoadIcon,0,IDI_HAND
invoke SendDlgItemMessage,[hwnd_dlg],ID_ICON,STM_SETICON,eax,0
mov eax,[error_message]
mov [param_buffer],eax
mov ebx,_assembler_error
jmp .summary_ok
.command:
cmp [wparam],ID_LINES + LBN_SELCHANGE shl 16
je .show_line
cmp [wparam],IDCANCEL
je .close
cmp [wparam],IDOK
jne .finish
invoke EndDialog,[hwnd_dlg],TRUE
jmp .processed
.close:
invoke EndDialog,[hwnd_dlg],FALSE
.processed:
mov eax,1
.finish:
pop edi esi ebx
ret
endp
proc AddStrings hwnd_combobox,lpstrings
push ebx esi
mov esi,[lpstrings]
.add_string:
cmp byte [esi],0
je .finish
invoke SendMessage,[hwnd_combobox],CB_ADDSTRING,0,esi
.next_string:
lodsb
or al,al
jnz .next_string
jmp .add_string
.finish:
pop esi ebx
ret
endp
proc AppearanceSetup hwnd_dlg,msg,wparam,lparam
push ebx esi edi
cmp [msg],WM_INITDIALOG
je .initdialog
cmp [msg],WM_DESTROY
je .destroy
cmp [msg],WM_COMMAND
je .command
cmp [msg],WM_CLOSE
je .close
.notprocessed:
xor eax,eax
jmp .finish
.initdialog:
xor eax,eax
test [asmedit_style],AES_CONSOLECARET
setnz al
invoke CheckDlgButton,[hwnd_dlg],ID_CONSOLECARET,eax
mov [cf.lStructSize],sizeof.CHOOSEFONT
mov eax,[hwnd_dlg]
mov [cf.hwndOwner],eax
mov [cf.Flags],CF_FIXEDPITCHONLY+CF_SCREENFONTS+CF_FORCEFONTEXIST+CF_INITTOLOGFONTSTRUCT
mov [cf.lpLogFont],tmp_font
mov [cc.lStructSize],sizeof.CHOOSECOLOR
mov eax,[hinstance]
mov [cc.hInstance],eax
mov eax,[hwnd_dlg]
mov [cc.hwndOwner],eax
mov [cc.lpCustColors],user_colors
mov [cc.Flags],CC_RGBINIT
mov esi,font
mov edi,tmp_font
mov ecx,sizeof.LOGFONT shr 2
rep movsd
mov esi,editor_colors
mov edi,tmp_colors
mov ecx,8
rep movsd
mov esi,editor_colors
mov edi,user_colors+20h
mov ecx,8
rep movsd
invoke GetDlgItem,[hwnd_dlg],ID_SETTING
stdcall AddStrings,eax,_appearance_settings
invoke SendDlgItemMessage,[hwnd_dlg],ID_SETTING,CB_SETCURSEL,0,0
invoke SendDlgItemMessage,[hwnd_dlg],ID_PREVIEW,WM_SETTEXT,0,preview_text
invoke SendDlgItemMessage,[hwnd_dlg],ID_PREVIEW,AEM_SETPOS,preview_selection,0
invoke CreateFontIndirect,[cf.lpLogFont]
invoke SendDlgItemMessage,[hwnd_dlg],ID_PREVIEW,WM_SETFONT,eax,0
.update_colors:
invoke SendDlgItemMessage,[hwnd_dlg],ID_PREVIEW,AEM_SETTEXTCOLOR,[tmp_colors],[tmp_colors+4]
invoke SendDlgItemMessage,[hwnd_dlg],ID_PREVIEW,AEM_SETSELCOLOR,[tmp_colors+8],[tmp_colors+12]
invoke SendDlgItemMessage,[hwnd_dlg],ID_PREVIEW,AEM_SETSYNTAXHIGHLIGHT,tmp_colors+16,fasm_syntax
jmp .processed
.destroy:
invoke SendDlgItemMessage,[hwnd_dlg],ID_PREVIEW,WM_GETFONT,0,0
invoke DeleteObject,eax
jmp .
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -