asm_dip/toolchain/fasmw17332/SOURCE/IDE/FASMW/FASMW.ASM
2024-11-24 23:13:28 -05:00

3813 lines
101 KiB
NASM

; flat assembler IDE for Win32
; Copyright (c) 1999-2022, Tomasz Grysztar.
; All rights reserved.
format PE GUI 4.0 large NX
entry start
stack 20000h
include 'win32ax.inc'
include 'fedit.ash'
include '..\..\version.inc'
struct EDITITEM
header TC_ITEMHEADER
hwnd dd ?
pszpath dd ?
ends
FM_NEW = WM_USER + 0
FM_OPEN = WM_USER + 1
FM_SAVE = WM_USER + 2
FM_COMPILE = WM_USER + 3
FM_SELECT = WM_USER + 4
FM_ASSIGN = WM_USER + 5
FM_GETSELECTED = WM_USER + 6
FM_GETASSIGNED = WM_USER + 7
FM_GETHANDLE = WM_USER + 8
FM_OPENREADONLY = WM_USER + 11h
FM_SAVEMODIFIED = WM_USER + 12h
struct HH_AKLINK
cbStruct dd ?
fReserved dd ?
pszKeywords dd ?
pszUrl dd ?
pszMsgText dd ?
pszMsgTitle dd ?
pszWindow dd ?
fIndexOnFail dd ?
ends
HH_DISPLAY_TOPIC = 0
HH_KEYWORD_LOOKUP = 0Dh
CP_ARGUMENTS = 0
CP_DIRECTORY = 1
section '.data' data readable writeable
_caption db 'flat assembler ',VERSION_STRING,0
_class db 'FASMW_IDE32',0
_fedit_class db 'FEDIT',0
_listbox_class db 'LISTBOX',0
_tabctrl_class db 'SysTabControl32',0
_htmlhelp_library db 'HHCTRL.OCX',0
_htmlhelp_api db 'HtmlHelpA',0
_user_library db 'USER32.DLL',0
_setgestureconfig_api db 'SetGestureConfig',0
_getgestureinfo_api db 'GetGestureInfo',0
_closegestureinfohandle_api db 'CloseGestureInfoHandle',0
_memory_error db 'Not enough memory to complete this operation.',0
_loading_error db 'Could not load file %s.',0
_run_object_error db 'Cannot execute object file.',0
_saving_question db 'File was modified. Save it now?',0
_not_found db 'Text %s not found.',0
_not_found_after db 'Text %s not found after current position.',0
_not_found_before db 'Text %s not found before current position.',0
_replace_prompt db 'Replace this occurence?',0
_replaces_made db '%d replaces made.',0
_untitled db 'Untitled',0
_font_face db 'Courier New',0
_row_column db 9,'%d,'
_value db '%d'
_null db 0
_summary db '%d passes, %d.%d seconds, %d bytes.',0
_summary_short db '%d passes, %d bytes.',0
_assembler_error db 'Error: %s.',0
_line_number db '%s [%d]',0
_color db '%d,%d,%d',0
_modified_status db 9,'Modified',0
_readonly_status db 9,'Read-only',0
_pick_help db 'Pick help file',0
_find db 'Find',0
_replace db 'Replace',0
_asm_extension db 'ASM',0
_section_environment db 'Environment',0
_key_environment_include db 'Include',0
_section_compiler db 'Compiler',0
_key_compiler_memory db 'Memory',0
_key_compiler_priority db 'Priority',0
_key_compiler_passes db 'Passes',0
_section_options db 'Options',0
_key_options_securesel db 'SecureSelection',0
_key_options_autobrackets db 'AutoBrackets',0
_key_options_autoindent db 'AutoIndent',0
_key_options_smarttabs db 'SmartTabs',0
_key_options_optimalfill db 'OptimalFill',0
_key_options_revivedeadkeys db 'ReviveDeadKeys',0
_key_options_consolecaret db 'ConsoleCaret',0
_key_options_timescroll db 'TimeScroll',0
_key_options_oneinstanceonly db 'OneInstanceOnly',0
_section_colors db 'Colors',0
_key_color_text db 'Text',0
_key_color_background db 'Background',0
_key_color_seltext db 'SelectionText',0
_key_color_selbackground db 'SelectionBackground',0
_key_color_symbols db 'Symbols',0
_key_color_numbers db 'Numbers',0
_key_color_strings db 'Strings',0
_key_color_comments db 'Comments',0
_section_font db 'Font',0
_key_font_face db 'Face',0
_key_font_height db 'Height',0
_key_font_width db 'Width',0
_key_font_weight db 'Weight',0
_key_font_italic db 'Italic',0
_key_font_charset db 'CharSet',0
_section_window db 'Window',0
_key_window_top db 'Top',0
_key_window_left db 'Left',0
_key_window_right db 'Right',0
_key_window_bottom db 'Bottom',0
_key_window_maximized db 'Maximized',0
_section_help db 'Help',0
_key_help_path db 'Path',0
_reg_key_desktop db 'Control Panel\Desktop',0
_reg_value_wheelscrolllines db 'WheelScrollLines',0
_appearance_settings db 'Font',0
db 'Text color',0
db 'Background color',0
db 'Selection text color',0
db 'Selection background color',0
db 'Symbols color',0
db 'Numbers color',0
db 'Strings color',0
db 'Comments color',0
db 0
_memory_settings db '1024',0
db '2048',0
db '4096',0
db '8192',0
db '16384',0
db '32768',0
db '65536',0
db '131072',0
db '262144',0
db '524288',0
db 0
_priority_settings db 'Idle',0
db 'Low',0
db 'Normal',0
db 'High',0
db 'Realtime',0
db 0
fedit_style dd FES_AUTOINDENT+FES_SMARTTABS+FES_CONSOLECARET
editor_colors rd 4
asm_syntax_colors dd 0xF03030,0x009000,0x0000B0,0x808080
preview_text db 0Dh,0Ah
db ' org 100h',0Dh,0Ah
db 0Dh,0Ah
db ' mov ah,09h ',' ; write',0Dh,0Ah
db ' mov dx,text',0Dh,0Ah
db ' int 21h',0Dh,0Ah
db ' int 20h',0Dh,0Ah
db 0Dh,0Ah
db ' text db "Hello!",24h',0Dh,0Ah
db 0
preview_selection dd 1,5,1,6
asm_filter db 'Assembly files',0,'*.ASM;*.INC;*.ASH',0
db 'All files',0,'*.*',0
db 0
help_filter db 'Help files',0,'*.HLP;*.CHM',0
db 0
align 4
wheel_scroll_lines dd 3
HtmlHelp dd 0
SetGestureConfig dd 0
GetGestureInfo dd 0
CloseGestureInfoHandle dd 0
hinstance dd ?
hkey_main dd ?
hmenu_main dd ?
hmenu_edit dd ?
hmenu_tab dd ?
hacc dd ?
hfont dd ?
hwnd_main dd ?
hwnd_status dd ?
hwnd_tabctrl dd ?
hwnd_history dd ?
hwnd_fedit dd ?
hwnd_compiler dd ?
hwnd_progress dd ?
himl dd ?
hthread dd ?
hmem_display dd ?
hmem_error_data dd ?
hfile dd ?
mutex dd ?
instance_flags dd ?
command_flags dd ?
search_settings dd ?
replaces_count dd ?
compiler_memory dd ?
compiler_priority dd ?
assigned_file dd ?
program_arguments dd ?
resume_esp dd ?
resume_eip dd ?
param_buffer rd 10h
user_colors rd 10h
name_buffer rb 100h
search_string rb 1000h
replace_string rb 1000h
string_buffer rb 2000h
help_path rb 1000h
ini_path rb 1000h
include_path rb 1000h
path_buffer rb 4000h
msg MSG
wc WNDCLASS
rc RECT
pt POINT
ei EDITITEM
font LOGFONT
bm BITMAP
tcht TC_HITTESTINFO
wp WINDOWPLACEMENT
fepos FEPOS
ofn OPENFILENAME
cf CHOOSEFONT
cc CHOOSECOLOR
systime SYSTEMTIME
sinfo STARTUPINFO
pinfo PROCESS_INFORMATION
cp COPYDATASTRUCT
bytes_count dd ?
fedit_font dd ?
tmp_colors rd 8
tmp_font LOGFONT
backup_font LOGFONT
hhkey HH_AKLINK
upper_case_table rb 100h
section '.text' code readable executable
include 'fedit.inc'
start:
invoke GetModuleHandle,0
mov [hinstance],eax
invoke GetModuleHandle,_user_library
or eax,eax
jz gesture_api_unavailable
mov ebx,eax
invoke GetProcAddress,ebx,_setgestureconfig_api
or eax,eax
jz gesture_api_unavailable
mov esi,eax
invoke GetProcAddress,ebx,_getgestureinfo_api
or eax,eax
jz gesture_api_unavailable
mov edi,eax
invoke GetProcAddress,ebx,_closegestureinfohandle_api
or eax,eax
jz gesture_api_unavailable
mov [CloseGestureInfoHandle],eax
mov [SetGestureConfig],esi
mov [GetGestureInfo],edi
gesture_api_unavailable:
invoke GetCommandLine
mov esi,eax
mov edi,ini_path
find_program_path:
lodsb
cmp al,20h
je find_program_path
cmp al,22h
je quoted_program_path
cmp al,0Dh
je program_path_ok
or al,al
jnz get_program_path
dec esi
jmp program_path_ok
get_program_path:
stosb
lodsb
cmp al,20h
je program_path_ok
cmp al,0Dh
je program_path_ok
or al,al
jnz get_program_path
dec esi
jmp program_path_ok
quoted_program_path:
lodsb
cmp al,22h
je program_path_ok
cmp al,0Dh
je program_path_ok
stosb
or al,al
jnz quoted_program_path
dec esi
program_path_ok:
mov [program_arguments],esi
mov ebx,edi
find_program_extension:
cmp ebx,ini_path
je make_ini_extension
dec ebx
mov al,[ebx]
cmp al,'\'
je make_ini_extension
cmp al,'/'
je make_ini_extension
cmp al,'.'
jne find_program_extension
mov edi,ebx
jmp find_program_extension
make_ini_extension:
mov eax,'.INI'
stosd
xor al,al
stosb
invoke GetFullPathName,ini_path,1000h,ini_path,param_buffer
mov esi,ini_path
mov ecx,[param_buffer]
sub ecx,esi
mov edi,include_path
rep movsb
mov eax,'INCL'
stosd
mov eax,'UDE'
stosd
invoke GetFileAttributes,ini_path
cmp eax,-1
jne ini_ok
invoke WritePrivateProfileString,_section_environment,_key_environment_include,include_path,ini_path
ini_ok:
mov [instance_flags],0
stdcall GetIniBit,ini_path,_section_options,_key_options_oneinstanceonly,instance_flags,1
cmp [instance_flags],0
je create_new_window
invoke FindWindow,_class,NULL
or eax,eax
jnz window_already_exists
create_new_window:
invoke LoadCursor,0,IDC_IBEAM
mov [wc.hCursor],eax
mov [wc.style],CS_GLOBALCLASS+CS_DBLCLKS
mov [wc.lpfnWndProc],FlatEditor
mov eax,[hinstance]
mov [wc.hInstance],eax
mov [wc.cbWndExtra],4
xor eax,eax
mov [wc.hbrBackground],eax
mov [wc.cbClsExtra],eax
mov [wc.lpszMenuName],eax
mov [wc.lpszClassName],_fedit_class
invoke RegisterClass,wc
or eax,eax
jz end_loop
invoke CreateFont,0,0,0,0,0,FALSE,FALSE,FALSE,ANSI_CHARSET,OUT_RASTER_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FIXED_PITCH+FF_DONTCARE,NULL
or eax,eax
jz end_loop
mov [fedit_font],eax
mov edi,upper_case_table
xor ebx,ebx
mov esi,100h
make_case_table:
invoke CharUpper,ebx
stosb
inc bl
dec esi
jnz make_case_table
mov edi,characters
mov ecx,100h
xor al,al
prepare_characters_table:
stosb
inc al
loop prepare_characters_table
mov esi,characters+'a'
mov edi,characters+'A'
mov ecx,26
rep movsb
mov edi,characters
mov esi,symbol_characters+1
movzx ecx,byte [esi-1]
xor eax,eax
convert_table:
lodsb
mov byte [edi+eax],0
loop convert_table
invoke LoadIcon,[hinstance],IDI_MAIN
mov [wc.hIcon],eax
invoke LoadCursor,0,IDC_ARROW
mov [wc.hCursor],eax
mov [wc.style],0
mov [wc.lpfnWndProc],MainWindow
mov [wc.cbClsExtra],0
mov [wc.cbWndExtra],0
mov eax,[hinstance]
mov [wc.hInstance],eax
mov [wc.hbrBackground],COLOR_BTNFACE+1
mov [wc.lpszMenuName],0
mov [wc.lpszClassName],_class
invoke RegisterClass,wc
invoke LoadMenu,[hinstance],IDM_MAIN
mov [hmenu_main],eax
invoke GetSubMenu,eax,1
mov [hmenu_edit],eax
invoke LoadMenu,[hinstance],IDM_TAB
invoke GetSubMenu,eax,0
mov [hmenu_tab],eax
invoke LoadAccelerators,[hinstance],IDA_MAIN
mov [hacc],eax
invoke CreateWindowEx,0,_class,_caption,WS_OVERLAPPEDWINDOW+WS_CLIPCHILDREN+WS_CLIPSIBLINGS,96,64,384,324,NULL,[hmenu_main],[hinstance],NULL
or eax,eax
jz end_loop
mov [hwnd_main],eax
mov eax,SW_SHOW
test [wp.flags],WPF_RESTORETOMAXIMIZED
jz show_main_window
mov eax,SW_SHOWMAXIMIZED
show_main_window:
invoke ShowWindow,[hwnd_main],eax
invoke UpdateWindow,[hwnd_main]
msg_loop:
invoke GetMessage,msg,NULL,0,0
or eax,eax
jz end_loop
invoke TranslateAccelerator,[hwnd_main],[hacc],msg
or eax,eax
jnz msg_loop
cmp [msg.message],WM_KEYDOWN
je msg_dispatch
invoke TranslateMessage,msg
msg_dispatch:
invoke DispatchMessage,msg
jmp msg_loop
window_already_exists:
mov ebx,eax
invoke GetWindowPlacement,ebx,wp
mov eax,SW_SHOWNORMAL
cmp [wp.showCmd],SW_SHOWMAXIMIZED
jne show_existing_window
mov eax,SW_SHOWMAXIMIZED
show_existing_window:
invoke ShowWindow,ebx,eax
invoke SetForegroundWindow,ebx
invoke GetCurrentDirectory,4000h,path_buffer
inc eax
mov [cp.cbData],eax
mov [cp.lpData],path_buffer
mov [cp.dwData],CP_DIRECTORY
invoke SendMessage,ebx,WM_COPYDATA,NULL,cp
mov edi,[program_arguments]
mov [cp.lpData],edi
or ecx,-1
xor al,al
repne scasb
neg ecx
mov [cp.cbData],ecx
mov [cp.dwData],CP_ARGUMENTS
invoke SendMessage,ebx,WM_COPYDATA,NULL,cp
end_loop:
invoke ExitProcess,[msg.wParam]
proc MainWindow hwnd,wmsg,wparam,lparam
push ebx esi edi
cmp [wmsg],WM_CREATE
je wmcreate
cmp [wmsg],WM_COPYDATA
je wmcopydata
cmp [wmsg],WM_GETMINMAXINFO
je wmgetminmaxinfo
cmp [wmsg],WM_SIZE
je wmsize
cmp [wmsg],WM_SETFOCUS
je wmsetfocus
cmp [wmsg],FM_NEW
je fmnew
cmp [wmsg],FM_OPEN
je fmopen
cmp [wmsg],FM_OPENREADONLY
je fmopenreadonly
cmp [wmsg],FM_SAVE
je fmsave
cmp [wmsg],FM_SAVEMODIFIED
je fmsavemodified
cmp [wmsg],FM_COMPILE
je fmcompile
cmp [wmsg],FM_SELECT
je fmselect
cmp [wmsg],FM_ASSIGN
je fmassign
cmp [wmsg],FM_GETSELECTED
je fmgetselected
cmp [wmsg],FM_GETASSIGNED
je fmgetassigned
cmp [wmsg],FM_GETHANDLE
je fmgethandle
cmp [wmsg],WM_INITMENU
je wminitmenu
cmp [wmsg],WM_COMMAND
je wmcommand
cmp [wmsg],WM_NOTIFY
je wmnotify
cmp [wmsg],WM_DROPFILES
je wmdropfiles
cmp [wmsg],WM_CLOSE
je wmclose
cmp [wmsg],WM_DESTROY
je wmdestroy
invoke DefWindowProc,[hwnd],[wmsg],[wparam],[lparam]
jmp finish
wmcreate:
xor eax,eax
mov [search_settings],eax
mov [search_string],al
mov [replace_string],al
mov [compiler_memory],65536
mov [compiler_priority],THREAD_PRIORITY_NORMAL
mov [assigned_file],-1
mov [help_path],0
mov [ofn.lStructSize],sizeof.OPENFILENAME
mov eax,[hwnd]
mov [ofn.hwndOwner],eax
mov eax,[hinstance]
mov [ofn.hInstance],eax
mov [ofn.lpstrCustomFilter],NULL
mov [ofn.nFilterIndex],1
mov [ofn.nMaxFile],1000h
mov [ofn.lpstrFileTitle],name_buffer
mov [ofn.nMaxFileTitle],100h
mov [ofn.lpstrInitialDir],NULL
mov [ofn.lpstrDefExt],_asm_extension
mov [font.lfHeight],16
mov [font.lfWidth],0
mov [font.lfEscapement],0
mov [font.lfOrientation],0
mov [font.lfWeight],0
mov [font.lfItalic],FALSE
mov [font.lfUnderline],FALSE
mov [font.lfStrikeOut],FALSE
mov [font.lfCharSet],DEFAULT_CHARSET
mov [font.lfOutPrecision],OUT_RASTER_PRECIS
mov [font.lfClipPrecision],CLIP_DEFAULT_PRECIS
mov [font.lfQuality],DEFAULT_QUALITY
mov [font.lfPitchAndFamily],FIXED_PITCH+FF_DONTCARE
mov edi,font.lfFaceName
mov esi,_font_face
copy_font_face:
lodsb
stosb
or al,al
jnz copy_font_face
invoke GetSysColor,COLOR_WINDOWTEXT
mov [editor_colors],eax
invoke GetSysColor,COLOR_WINDOW
mov [editor_colors+4],eax
invoke GetSysColor,COLOR_HIGHLIGHTTEXT
mov [editor_colors+8],eax
invoke GetSysColor,COLOR_HIGHLIGHT
mov [editor_colors+12],eax
mov esi,editor_colors
mov edi,user_colors
mov ecx,8
rep movsd
mov [wp.length],sizeof.WINDOWPLACEMENT
invoke GetWindowPlacement,[hwnd],wp
invoke RegOpenKeyEx,HKEY_CURRENT_USER,_reg_key_desktop,0,KEY_READ,param_buffer
test eax,eax
jnz wheel_setting_ok
mov [bytes_count],100h
invoke RegQueryValueEx,[param_buffer],_reg_value_wheelscrolllines,0,param_buffer+4,string_buffer,bytes_count
test eax,eax
jnz no_valid_wheel_setting
cmp [param_buffer+4],REG_SZ
jne no_valid_wheel_setting
mov esi,string_buffer
cmp byte [esi],0
je no_valid_wheel_setting
call atoi
jc no_valid_wheel_setting
mov [wheel_scroll_lines],eax
no_valid_wheel_setting:
invoke RegCloseKey,[param_buffer]
wheel_setting_ok:
stdcall GetIniInteger,ini_path,_section_compiler,_key_compiler_memory,compiler_memory
stdcall GetIniInteger,ini_path,_section_compiler,_key_compiler_priority,compiler_priority
mov eax,100
mov [passes_limit],ax
mov [param_buffer],eax
stdcall GetIniInteger,ini_path,_section_compiler,_key_compiler_passes,param_buffer
mov eax,[param_buffer]
test eax,eax
jz passes_limit_ok
cmp eax,10000h
ja passes_limit_ok
mov [passes_limit],ax
passes_limit_ok:
stdcall GetIniBit,ini_path,_section_options,_key_options_securesel,fedit_style,FES_SECURESEL
stdcall GetIniBit,ini_path,_section_options,_key_options_autobrackets,fedit_style,FES_AUTOBRACKETS
stdcall GetIniBit,ini_path,_section_options,_key_options_autoindent,fedit_style,FES_AUTOINDENT
stdcall GetIniBit,ini_path,_section_options,_key_options_smarttabs,fedit_style,FES_SMARTTABS
stdcall GetIniBit,ini_path,_section_options,_key_options_optimalfill,fedit_style,FES_OPTIMALFILL
stdcall GetIniBit,ini_path,_section_options,_key_options_revivedeadkeys,fedit_style,FES_REVIVEDEADKEYS
stdcall GetIniBit,ini_path,_section_options,_key_options_consolecaret,fedit_style,FES_CONSOLECARET
stdcall GetIniBit,ini_path,_section_options,_key_options_timescroll,fedit_style,FES_TIMESCROLL
stdcall GetIniColor,ini_path,_section_colors,_key_color_text,editor_colors
stdcall GetIniColor,ini_path,_section_colors,_key_color_background,editor_colors+4
stdcall GetIniColor,ini_path,_section_colors,_key_color_seltext,editor_colors+8
stdcall GetIniColor,ini_path,_section_colors,_key_color_selbackground,editor_colors+12
stdcall GetIniColor,ini_path,_section_colors,_key_color_symbols,asm_syntax_colors
stdcall GetIniColor,ini_path,_section_colors,_key_color_numbers,asm_syntax_colors+4
stdcall GetIniColor,ini_path,_section_colors,_key_color_strings,asm_syntax_colors+8
stdcall GetIniColor,ini_path,_section_colors,_key_color_comments,asm_syntax_colors+12
invoke GetPrivateProfileString,_section_font,_key_font_face,font.lfFaceName,font.lfFaceName,32,ini_path
stdcall GetIniInteger,ini_path,_section_font,_key_font_height,font.lfHeight
stdcall GetIniInteger,ini_path,_section_font,_key_font_width,font.lfWidth
stdcall GetIniInteger,ini_path,_section_font,_key_font_weight,font.lfWeight
stdcall GetIniBit,ini_path,_section_font,_key_font_italic,font.lfItalic,1
stdcall GetIniByte,ini_path,_section_font,_key_font_charset,font.lfCharSet
stdcall GetIniInteger,ini_path,_section_window,_key_window_top,wp.rcNormalPosition.top
stdcall GetIniInteger,ini_path,_section_window,_key_window_left,wp.rcNormalPosition.left
stdcall GetIniInteger,ini_path,_section_window,_key_window_right,wp.rcNormalPosition.right
stdcall GetIniInteger,ini_path,_section_window,_key_window_bottom,wp.rcNormalPosition.bottom
stdcall GetIniBit,ini_path,_section_window,_key_window_maximized,wp.flags,WPF_RESTORETOMAXIMIZED
invoke GetPrivateProfileString,_section_help,_key_help_path,help_path,help_path,1000h,ini_path
mov [wp.showCmd],SW_HIDE
invoke SetWindowPlacement,[hwnd],wp
invoke CreateFontIndirect,font
mov [hfont],eax
invoke CreateStatusWindow,WS_CHILD+WS_VISIBLE+SBS_SIZEGRIP,NULL,[hwnd],0
or eax,eax
jz failed
mov [hwnd_status],eax
mov [param_buffer],48h
mov [param_buffer+4],90h
mov [param_buffer+8],-1
invoke SendMessage,eax,SB_SETPARTS,3,param_buffer
invoke CreateWindowEx,0,_listbox_class,NULL,WS_CHILD+LBS_HASSTRINGS,0,0,0,0,[hwnd],NULL,[hinstance],NULL
or eax,eax
jz failed
mov [hwnd_history],eax
invoke CreateWindowEx,0,_tabctrl_class,NULL,WS_VISIBLE+WS_CHILD+TCS_FOCUSNEVER+TCS_BOTTOM,0,0,0,0,[hwnd],NULL,[hinstance],NULL
or eax,eax
jz failed
mov [hwnd_tabctrl],eax
invoke SendMessage,[hwnd_tabctrl],TCM_SETITEMEXTRA,sizeof.EDITITEM-sizeof.TC_ITEMHEADER,0
invoke SendMessage,[hwnd_status],WM_GETFONT,0,0
invoke SendMessage,[hwnd_tabctrl],WM_SETFONT,eax,FALSE
invoke LoadBitmap,[hinstance],IDB_ASSIGN
mov ebx,eax
invoke GetObject,ebx,sizeof.BITMAP,bm
invoke ImageList_Create,[bm.bmWidth],[bm.bmHeight],ILC_COLOR4,1,0
or eax,eax
jz failed
mov [himl],eax
invoke ImageList_Add,[himl],ebx,NULL
invoke DeleteObject,ebx
invoke SendMessage,[hwnd_tabctrl],TCM_SETIMAGELIST,0,[himl]
invoke SendMessage,[hwnd],FM_NEW,_untitled,0
cmp eax,-1
je failed
invoke DragAcceptFiles,[hwnd],TRUE
mov esi,[program_arguments]
process_arguments:
xor ebx,ebx
ARG_ASSIGN = 1
ARG_READONLY = 2
find_argument:
lodsb
cmp al,20h
je find_argument
cmp al,'+'
je argument_assign
cmp al,'-'
je argument_readonly
xor ecx,ecx
cmp al,22h
je quoted_argument
cmp al,0Dh
je command_line_ok
or al,al
jz command_line_ok
lea edx,[esi-1]
find_argument_end:
inc ecx
lodsb
cmp al,20h
je argument_end
cmp al,0Dh
je argument_end
or al,al
jz argument_end
jmp find_argument_end
argument_assign:
or bl,ARG_ASSIGN
jmp find_argument
argument_readonly:
or bl,ARG_READONLY
jmp find_argument
quoted_argument:
mov edx,esi
find_quoted_argument_end:
lodsb
cmp al,22h
je quoted_argument_end
cmp al,0Dh
je quoted_argument_end
or al,al
jz quoted_argument_end
inc ecx
jmp find_quoted_argument_end
argument_end:
dec esi
quoted_argument_end:
push eax edx esi
mov esi,edx
mov edi,path_buffer
cmp ecx,1000h-1
jae process_next_argument
rep movsb
xor al,al
stosb
mov ecx,path_buffer+4000h
sub ecx,edi
invoke GetFullPathName,path_buffer,ecx,edi,param_buffer
invoke GetFileTitle,edi,name_buffer,100h
mov eax,FM_OPEN
test bl,ARG_READONLY
jz load_from_argument
mov eax,FM_OPENREADONLY
load_from_argument:
invoke SendMessage,[hwnd],eax,name_buffer,edi
cmp eax,-1
je loading_error
test bl,ARG_ASSIGN
jz process_next_argument
invoke SendMessage,[hwnd_tabctrl],TCM_GETCURSEL,0,0
invoke SendMessage,[hwnd],FM_ASSIGN,eax,0
jmp process_next_argument
loading_error:
cinvoke wsprintf,string_buffer,_loading_error,path_buffer
invoke MessageBox,[hwnd],string_buffer,_caption,MB_ICONERROR+MB_OK
process_next_argument:
pop esi edx eax
jmp process_arguments
command_line_ok:
xor eax,eax
jmp finish
wmcopydata:
mov ebx,[lparam]
virtual at ebx
cmd COPYDATASTRUCT
end virtual
mov eax,[cmd.dwData]
cmp eax,CP_ARGUMENTS
je copy_arguments
cmp eax,CP_DIRECTORY
jne failed
invoke SetCurrentDirectory,[cmd.lpData]
jmp finish
copy_arguments:
mov esi,[cmd.lpData]
jmp process_arguments
wmgetminmaxinfo:
mov ebx,[lparam]
virtual at ebx
mmi MINMAXINFO
end virtual
mov [mmi.ptMinTrackSize.x],240
mov [mmi.ptMinTrackSize.y],160
jmp finish
wmsize:
invoke SendMessage,[hwnd_status],WM_SIZE,0,0
xor eax,eax
mov [rc.left],eax
mov [rc.top],eax
mov [rc.right],eax
mov [rc.bottom],eax
invoke SendMessage,[hwnd_tabctrl],TCM_ADJUSTRECT,TRUE,rc
mov esi,[rc.bottom]
sub esi,[rc.top]
invoke GetWindowRect,[hwnd_status],rc
mov ebx,[rc.bottom]
sub ebx,[rc.top]
invoke GetClientRect,[hwnd],rc
sub [rc.bottom],ebx
sub [rc.bottom],esi
invoke SetWindowPos,[hwnd_tabctrl],[hwnd_fedit],0,[rc.bottom],[rc.right],esi,0
invoke GetSystemMetrics,SM_CYFIXEDFRAME
shl eax,1
add [rc.bottom],eax
invoke MoveWindow,[hwnd_fedit],0,0,[rc.right],[rc.bottom],TRUE
jmp finish
wmsetfocus:
invoke SetFocus,[hwnd_fedit]
jmp finish
fmnew:
invoke CreateWindowEx,WS_EX_STATICEDGE,_fedit_class,NULL,WS_CHILD+WS_HSCROLL+WS_VSCROLL+ES_NOHIDESEL,0,0,0,0,[hwnd],NULL,[hinstance],NULL
or eax,eax
jz failed
mov [ei.header.mask],TCIF_TEXT+TCIF_PARAM
mov [ei.hwnd],eax
mov eax,[wparam]
mov [ei.header.pszText],eax
and [ei.pszpath],0
invoke SendMessage,[hwnd_tabctrl],TCM_GETITEMCOUNT,0,0
invoke SendMessage,[hwnd_tabctrl],TCM_INSERTITEM,eax,ei
mov ebx,eax
invoke SendMessage,[hwnd_tabctrl],TCM_SETCURSEL,eax,0
invoke SendMessage,[hwnd],FM_SELECT,ebx,0
invoke SetFocus,[hwnd]
mov eax,ebx
jmp finish
fmopen:
and [command_flags],0
allocate_path_buffer:
invoke VirtualAlloc,0,1000h,MEM_COMMIT,PAGE_READWRITE
or eax,eax
jz failed
mov edi,eax
mov esi,[lparam]
mov [lparam],edi
copy_path_for_fedit:
lodsb
stosb
or al,al
jnz copy_path_for_fedit
xor ebx,ebx
check_if_already_loaded:
mov [ei.header.mask],TCIF_PARAM
invoke SendMessage,[hwnd_tabctrl],TCM_GETITEM,ebx,ei
or eax,eax
jz load_file
invoke lstrcmpi,[ei.pszpath],[lparam]
or eax,eax
jz show_already_loaded
inc ebx
jmp check_if_already_loaded
show_already_loaded:
invoke SendMessage,[hwnd_tabctrl],TCM_SETCURSEL,ebx,0
invoke SendMessage,[hwnd],FM_SELECT,ebx,0
jmp update_fedit_mode
load_file:
invoke CreateFile,[lparam],GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,0,0
cmp eax,-1
je open_failed
mov ebx,eax
invoke GetFileSize,ebx,NULL
inc eax
push eax
invoke VirtualAlloc,0,eax,MEM_COMMIT,PAGE_READWRITE
or eax,eax
pop ecx
jz load_out_of_memory
dec ecx
push MEM_RELEASE
push 0
push eax
mov byte [eax+ecx],0
invoke ReadFile,ebx,eax,ecx,param_buffer,0
invoke CloseHandle,ebx
invoke SendMessage,[hwnd_tabctrl],TCM_GETITEMCOUNT,0,0
cmp eax,1
jne new_fedit
mov [ei.header.mask],TCIF_PARAM
invoke SendMessage,[hwnd_tabctrl],TCM_GETITEM,0,ei
cmp [ei.pszpath],0
jne new_fedit
invoke SendMessage,[ei.hwnd],FEM_ISUNMODIFIED,0,0
or eax,eax
jz new_fedit
mov [ei.header.mask],TCIF_TEXT+TCIF_PARAM
mov eax,[wparam]
mov [ei.header.pszText],eax
mov eax,[lparam]
mov [ei.pszpath],eax
invoke SendMessage,[hwnd_tabctrl],TCM_SETITEM,0,ei
xor ebx,ebx
jmp set_fedit_text
new_fedit:
invoke SendMessage,[hwnd],FM_NEW,[wparam],0
cmp eax,-1
jne set_path
add esp,12
jmp open_failed
set_path:
mov ebx,eax
mov [ei.header.mask],TCIF_PARAM
invoke SendMessage,[hwnd_tabctrl],TCM_GETITEM,ebx,ei
mov eax,[lparam]
mov [ei.pszpath],eax
invoke SendMessage,[hwnd_tabctrl],TCM_SETITEM,ebx,ei
set_fedit_text:
invoke SendMessage,[hwnd_fedit],WM_SETTEXT,0,dword [esp]
call [VirtualFree]
update_fedit_mode:
invoke SendMessage,[hwnd_fedit],FEM_GETMODE,0,0
and eax,not FEMODE_READONLY
test [command_flags],1
jz set_fedit_mode
or eax,FEMODE_READONLY
set_fedit_mode:
invoke SendMessage,[hwnd_fedit],FEM_SETMODE,eax,0
jmp update_status_bar
load_out_of_memory:
invoke CloseHandle,ebx
open_failed:
invoke VirtualFree,[lparam],0,MEM_RELEASE
jmp failed
fmopenreadonly:
or [command_flags],1
jmp allocate_path_buffer
fmsavemodified:
or ebx,-1
jmp save_single_file
fmsave:
xor ebx,ebx
save_single_file:
mov [ei.header.mask],TCIF_PARAM
invoke SendMessage,[hwnd_tabctrl],TCM_GETITEM,[wparam],ei
or eax,eax
jz failed
cmp [ei.pszpath],0
je failed
invoke SendMessage,[ei.hwnd],FEM_GETMODE,0,0
test eax,FEMODE_READONLY
jnz ok
invoke SendMessage,[ei.hwnd],FEM_ISUNMODIFIED,0,0
and eax,ebx
jnz ok
invoke SendMessage,[ei.hwnd],WM_GETTEXTLENGTH,0,0
inc eax
mov [wparam],eax
invoke VirtualAlloc,0,eax,MEM_COMMIT,PAGE_READWRITE
or eax,eax
jz failed
mov [lparam],eax
invoke CreateFile,[ei.pszpath],GENERIC_WRITE,0,0,CREATE_ALWAYS,0,0
cmp eax,-1
je save_failed
mov ebx,eax
invoke SendMessage,[ei.hwnd],WM_GETTEXT,[wparam],[lparam]
invoke WriteFile,ebx,[lparam],eax,param_buffer,0
test eax,eax
jz save_failed
invoke CloseHandle,ebx
invoke VirtualFree,[lparam],0,MEM_RELEASE
invoke SendMessage,[ei.hwnd],FEM_MARKUNMODIFIED,0,0
xor ebx,ebx
mov eax,[ei.hwnd]
cmp eax,[hwnd_fedit]
je update_status_bar
xor eax,eax
jmp finish
save_failed:
invoke VirtualFree,[lparam],0,MEM_RELEASE
jmp failed
fmcompile:
mov eax,[assigned_file]
push eax
cmp eax,-1
jne assigned_ok
invoke SendMessage,[hwnd_tabctrl],TCM_GETCURSEL,0,0
mov [assigned_file],eax
assigned_ok:
invoke SendMessage,[hwnd_main],FM_SAVEMODIFIED,eax,0
xor ebx,ebx
or eax,eax
jz save_all
invoke SendMessage,[hwnd_tabctrl],TCM_SETCURSEL,[assigned_file],0
invoke SendMessage,[hwnd_main],FM_SELECT,[assigned_file],0
invoke SendMessage,[hwnd_main],WM_COMMAND,IDM_SAVEAS,0
or eax,eax
jz save_all
or eax,-1
jmp compile_done
save_all:
mov [ei.header.mask],TCIF_PARAM
invoke SendMessage,[hwnd_tabctrl],TCM_GETITEM,ebx,ei
or eax,eax
jz do_compile
invoke SendMessage,[hwnd_main],FM_SAVEMODIFIED,ebx,0
inc ebx
jmp save_all
do_compile:
mov eax,[wparam]
mov [output_file],eax
invoke DialogBoxParam,[hinstance],IDD_COMPILE,[hwnd],CompileDialog,[assigned_file]
cmp eax,-1
je compile_done
push eax
cmp eax,2
je error_details
or eax,eax
jnz make_summary
cmp [lparam],FALSE
jne make_summary
invoke GlobalFree,[hmem_display]
jmp summary_done
make_summary:
invoke DialogBoxParam,[hinstance],IDD_SUMMARY,[hwnd],SummaryDialog,eax
jmp summary_done
error_details:
invoke DialogBoxParam,[hinstance],IDD_ERRORSUMMARY,[hwnd],SummaryDialog,eax
invoke GlobalFree,[hmem_error_data]
summary_done:
pop eax
compile_done:
pop edx
cmp edx,-1
jne finish
or [assigned_file],-1
jmp finish
fmselect:
mov [ei.header.mask],TCIF_PARAM
invoke SendMessage,[hwnd_tabctrl],TCM_GETITEM,[wparam],ei
invoke GetWindowLong,[hwnd_fedit],GWL_STYLE
and eax,not WS_VISIBLE
invoke SetWindowLong,[hwnd_fedit],GWL_STYLE,eax
mov ebx,[ei.hwnd]
mov [hwnd_fedit],ebx
mov eax,WS_CHILD+WS_HSCROLL+WS_VSCROLL+ES_NOHIDESEL
or eax,[fedit_style]
invoke SetWindowLong,ebx,GWL_STYLE,eax
invoke SendMessage,ebx,WM_SETFONT,[hfont],0
invoke SendMessage,ebx,FEM_SETTEXTCOLOR,[editor_colors],[editor_colors+4]
invoke SendMessage,ebx,FEM_SETSELCOLOR,[editor_colors+8],[editor_colors+12]
invoke SendMessage,ebx,FEM_SETSYNTAXHIGHLIGHT,asm_syntax_colors,fasm_syntax
invoke SendMessage,ebx,FEM_SETRIGHTCLICKMENU,[hmenu_edit],[hwnd]
invoke SendMessage,[hwnd],WM_SIZE,0,0
invoke ShowWindow,ebx,SW_SHOW
invoke UpdateWindow,ebx
invoke SetFocus,[hwnd]
jmp finish
fmassign:
mov eax,[wparam]
cmp [assigned_file],-1
je new_assign
push eax
mov [ei.header.mask],TCIF_IMAGE
mov [ei.header.iImage],-1
invoke SendMessage,[hwnd_tabctrl],TCM_SETITEM,[assigned_file],ei
pop eax
new_assign:
mov [assigned_file],eax
mov [ei.header.mask],TCIF_IMAGE
mov [ei.header.iImage],0
invoke SendMessage,[hwnd_tabctrl],TCM_SETITEM,eax,ei
or eax,eax
jnz fmgetassigned
or eax,-1
mov [assigned_file],eax
jmp finish
fmgetassigned:
mov eax,[assigned_file]
jmp finish
fmgetselected:
invoke SendMessage,[hwnd_tabctrl],TCM_GETCURSEL,0,0
jmp finish
fmgethandle:
mov [ei.header.mask],TCIF_PARAM
invoke SendMessage,[hwnd_tabctrl],TCM_GETITEM,[wparam],ei
or eax,eax
jz finish
mov eax,[ei.hwnd]
jmp finish
wminitmenu:
mov esi,[hwnd_fedit]
invoke SendMessage,esi,EM_CANUNDO,0,0
or eax,eax
setz bl
neg bl
and ebx,MF_GRAYED
or ebx,MF_BYCOMMAND
invoke EnableMenuItem,[wparam],IDM_UNDO,ebx
invoke SendMessage,esi,FEM_CANREDO,0,0
or eax,eax
setz bl
neg bl
and ebx,MF_GRAYED
or ebx,MF_BYCOMMAND
invoke EnableMenuItem,[wparam],IDM_REDO,ebx
invoke SendMessage,esi,FEM_GETPOS,fepos,0
mov eax,[fepos.selectionLine]
cmp eax,[fepos.caretLine]
sete bh
mov eax,[fepos.selectionPosition]
cmp eax,[fepos.caretPosition]
sete bl
and bl,bh
neg bl
and ebx,MF_GRAYED
or ebx,MF_BYCOMMAND
invoke EnableMenuItem,[wparam],IDM_CUT,ebx
invoke EnableMenuItem,[wparam],IDM_COPY,ebx
invoke EnableMenuItem,[wparam],IDM_DELETE,ebx
invoke IsClipboardFormatAvailable,CF_TEXT
neg al
not al
and eax,MF_GRAYED
or eax,MF_BYCOMMAND
invoke EnableMenuItem,[wparam],IDM_PASTE,eax
invoke SendMessage,esi,FEM_GETMODE,0,0
mov ebx,eax
test eax,FEMODE_VERTICALSEL
setnz al
neg al
and eax,MF_CHECKED
or eax,MF_BYCOMMAND
invoke CheckMenuItem,[wparam],IDM_VERTICAL,eax
test ebx,FEMODE_READONLY
setnz bl
and ebx,MF_GRAYED
or ebx,MF_BYCOMMAND
invoke EnableMenuItem,[wparam],IDM_CUT,ebx
invoke EnableMenuItem,[wparam],IDM_PASTE,ebx
invoke EnableMenuItem,[wparam],IDM_DELETE,ebx
invoke EnableMenuItem,[wparam],IDM_REPLACE,ebx
invoke SendMessage,esi,FEM_CANFINDNEXT,0,0
or eax,eax
setz al
neg al
and eax,MF_GRAYED
or eax,MF_BYCOMMAND
invoke EnableMenuItem,[wparam],IDM_FINDNEXT,eax
test [fedit_style],FES_SECURESEL
setnz al
neg al
and eax,MF_CHECKED
or eax,MF_BYCOMMAND
invoke CheckMenuItem,[wparam],IDM_SECURESEL,eax
test [fedit_style],FES_AUTOBRACKETS
setnz al
neg al
and eax,MF_CHECKED
or eax,MF_BYCOMMAND
invoke CheckMenuItem,[wparam],IDM_AUTOBRACKETS,eax
test [fedit_style],FES_AUTOINDENT
setnz al
neg al
and eax,MF_CHECKED
or eax,MF_BYCOMMAND
invoke CheckMenuItem,[wparam],IDM_AUTOINDENT,eax
test [fedit_style],FES_SMARTTABS
setnz al
neg al
and eax,MF_CHECKED
or eax,MF_BYCOMMAND
invoke CheckMenuItem,[wparam],IDM_SMARTTABS,eax
test [fedit_style],FES_OPTIMALFILL
setnz al
neg al
and eax,MF_CHECKED
or eax,MF_BYCOMMAND
invoke CheckMenuItem,[wparam],IDM_OPTIMALFILL,eax
test [fedit_style],FES_REVIVEDEADKEYS
setnz al
neg al
and eax,MF_CHECKED
or eax,MF_BYCOMMAND
invoke CheckMenuItem,[wparam],IDM_REVIVEDEADKEYS,eax
test [fedit_style],FES_TIMESCROLL
setnz al
neg al
and eax,MF_CHECKED
or eax,MF_BYCOMMAND
invoke CheckMenuItem,[wparam],IDM_TIMESCROLL,eax
mov eax,[instance_flags]
neg al
and eax,MF_CHECKED
or eax,MF_BYCOMMAND
invoke CheckMenuItem,[wparam],IDM_ONEINSTANCEONLY,eax
cmp [help_path],0
sete bl
neg bl
and ebx,MF_GRAYED
or ebx,MF_BYCOMMAND
invoke EnableMenuItem,[wparam],IDM_CONTENTS,ebx
invoke EnableMenuItem,[wparam],IDM_KEYWORD,ebx
jmp finish
wmcommand:
mov eax,[wparam]
mov ebx,[lparam]
or ebx,ebx
jz menu_command
cmp ebx,[hwnd_fedit]
jne finish
xor ebx,ebx
shr eax,16
cmp eax,FEN_SETFOCUS
je update_status_bar
cmp eax,FEN_TEXTCHANGE
je update_status_bar
cmp eax,FEN_POSCHANGE
je update_status_bar
cmp eax,FEN_OUTOFMEMORY
je not_enough_mem
jmp finish
update_status_bar:
invoke SendMessage,[hwnd_fedit],FEM_GETPOS,fepos,0
cinvoke wsprintf,string_buffer,_row_column,[fepos.caretLine],[fepos.caretPosition]
invoke SendMessage,[hwnd_status],SB_SETTEXT,0,string_buffer
mov esi,_null
invoke SendMessage,[hwnd_fedit],FEM_GETMODE,0,0
test eax,FEMODE_READONLY
jnz readonly_status
invoke SendMessage,[hwnd_fedit],FEM_ISUNMODIFIED,0,0
or eax,eax
jnz modified_status_ok
mov esi,_modified_status
jmp modified_status_ok
readonly_status:
mov esi,_readonly_status
modified_status_ok:
invoke SendMessage,[hwnd_status],SB_SETTEXT,1,esi
mov eax,ebx
jmp finish
not_enough_mem:
invoke SendMessage,[hwnd_fedit],FEM_RELEASESEARCH,0,0
invoke MessageBox,[hwnd],_memory_error,_caption,MB_ICONERROR+MB_OK
mov eax,ebx
jmp finish
menu_command:
and eax,0FFFFh
mov ebx,[hwnd_fedit]
cmp eax,IDM_NEW
je new_file
cmp eax,IDM_OPEN
je open_file
cmp eax,IDM_SAVE
je save_file
cmp eax,IDM_SAVEAS
je save_file_as
cmp eax,IDM_NEXT
je next_file
cmp eax,IDM_PREVIOUS
je previous_file
cmp eax,IDM_OPENFOLDER
je open_folder
cmp eax,IDM_CLOSE
je close_file
cmp eax,IDM_EXIT
je exit
cmp eax,IDM_UNDO
je undo
cmp eax,IDM_REDO
je redo
cmp eax,IDM_DISCARD_UNDO
je discard_undo
cmp eax,IDM_CUT
je cut
cmp eax,IDM_COPY
je copy
cmp eax,IDM_PASTE
je paste
cmp eax,IDM_DELETE
je delete
cmp eax,IDM_SELECTALL
je select_all
cmp eax,IDM_VERTICAL
je vertical
cmp eax,IDM_READONLY
je read_only
cmp eax,IDM_POSITION
je position
cmp eax,IDM_FIND
je find
cmp eax,IDM_FINDNEXT
je findnext
cmp eax,IDM_REPLACE
je replace
cmp eax,IDM_RUN
je run
cmp eax,IDM_COMPILE
je compile
cmp eax,IDM_SYMBOLS
je build_symbols
cmp eax,IDM_ASSIGN
je assign
cmp eax,IDM_APPEARANCE
je appearance
cmp eax,IDM_COMPILERSETUP
je compiler_setup
cmp eax,IDM_SECURESEL
je option_securesel
cmp eax,IDM_AUTOBRACKETS
je option_autobrackets
cmp eax,IDM_AUTOINDENT
je option_autoindent
cmp eax,IDM_SMARTTABS
je option_smarttabs
cmp eax,IDM_OPTIMALFILL
je option_optimalfill
cmp eax,IDM_REVIVEDEADKEYS
je option_revivedeadkeys
cmp eax,IDM_TIMESCROLL
je option_timescroll
cmp eax,IDM_ONEINSTANCEONLY
je option_oneinstanceonly
cmp eax,IDM_CALCULATOR
je calculator
cmp eax,IDM_CONTENTS
je contents
cmp eax,IDM_KEYWORD
je keyword
cmp eax,IDM_PICKHELP
je pick_help
cmp eax,IDM_ABOUT
je about
sub eax,IDM_SELECTFILE
jc finish
cmp eax,9
ja finish
mov ebx,eax
invoke SendMessage,[hwnd_tabctrl],TCM_GETITEMCOUNT,0,0
cmp ebx,eax
ja finish
dec ebx
invoke SendMessage,[hwnd_tabctrl],TCM_SETCURSEL,ebx,0
invoke SendMessage,[hwnd],FM_SELECT,ebx,0
jmp finish
new_file:
invoke SendMessage,[hwnd],FM_NEW,_untitled,0
jmp finish
open_file:
mov [ofn.lpstrFile],path_buffer
mov [path_buffer],0
mov [ofn.lpstrFilter],asm_filter
mov [ofn.Flags],OFN_EXPLORER+OFN_ALLOWMULTISELECT+OFN_FILEMUSTEXIST
mov [ofn.lpstrFileTitle],name_buffer
mov [ofn.lpstrTitle],NULL
invoke GetOpenFileName,ofn
or eax,eax
jz finish
mov ebx,FM_OPEN
test [ofn.Flags],OFN_READONLY
jz open_chosen_files
mov ebx,FM_OPENREADONLY
open_chosen_files:
test [ofn.Flags],OFN_ALLOWMULTISELECT
jz open_single_file
mov esi,path_buffer
movzx eax,[ofn.nFileOffset]
add esi,eax
mov byte [esi-1],'\'
mov edi,esi
open_multiple_files:
cmp byte [esi],0
je finish
push edi
move_file_name:
lodsb
stosb
or al,al
jnz move_file_name
pop edi
invoke GetFileTitle,path_buffer,name_buffer,100h
invoke SendMessage,[hwnd],ebx,name_buffer,path_buffer
cmp eax,-1
jne open_multiple_files
invoke wvsprintf,string_buffer,_loading_error,ofn.lpstrFile
invoke MessageBox,[hwnd],string_buffer,_caption,MB_ICONERROR+MB_OK
jmp open_multiple_files
open_single_file:
invoke SendMessage,[hwnd],ebx,name_buffer,path_buffer
cmp eax,-1
jne finish
invoke wvsprintf,string_buffer,_loading_error,ofn.lpstrFile
invoke MessageBox,[hwnd],string_buffer,_caption,MB_ICONERROR+MB_OK
jmp finish
save_file:
invoke SendMessage,[hwnd_tabctrl],TCM_GETCURSEL,0,0
invoke SendMessage,[hwnd],FM_SAVE,eax,0
or eax,eax
jnz save_file_as
jmp finish
save_file_as:
invoke SendMessage,[hwnd_tabctrl],TCM_GETCURSEL,0,0
mov ebx,eax
mov [ei.header.mask],TCIF_PARAM
invoke SendMessage,[hwnd_tabctrl],TCM_GETITEM,ebx,ei
mov eax,[ei.pszpath]
or eax,eax
jnz alloc_ok
invoke VirtualAlloc,0,1000h,MEM_COMMIT,PAGE_READWRITE
mov [ei.pszpath],eax
and byte [eax],0
alloc_ok:
mov [lparam],eax
mov [ofn.lpstrFile],eax
mov [ofn.lpstrFilter],asm_filter
mov [ofn.Flags],OFN_EXPLORER+OFN_HIDEREADONLY+OFN_OVERWRITEPROMPT
mov [ofn.lpstrTitle],NULL
invoke GetSaveFileName,ofn
or eax,eax
jz save_cancelled
mov eax,[ei.pszpath]
mov [ei.header.pszText],name_buffer
mov [ei.header.mask],TCIF_TEXT+TCIF_PARAM
invoke SendMessage,[hwnd_tabctrl],TCM_SETITEM,ebx,ei
invoke SendMessage,[hwnd],FM_SAVE,ebx,0
xor esi,esi
check_if_overwritten:
cmp esi,ebx
je not_overwritten
mov [ei.header.mask],TCIF_PARAM
invoke SendMessage,[hwnd_tabctrl],TCM_GETITEM,esi,ei
or eax,eax
jz save_ok
invoke lstrcmpi,[ei.pszpath],[lparam]
or eax,eax
jz remove_overwritten
not_overwritten:
inc esi
jmp check_if_overwritten
remove_overwritten:
invoke VirtualFree,[ei.pszpath],0,MEM_RELEASE
invoke SendMessage,[hwnd_tabctrl],TCM_DELETEITEM,esi,0
cmp [assigned_file],-1
je save_ok
cmp esi,[assigned_file]
ja save_ok
je assigned_overwritten
dec [assigned_file]
jmp save_ok
assigned_overwritten:
mov [assigned_file],-1
save_ok:
xor eax,eax
jmp finish
save_cancelled:
mov eax,[ei.pszpath]
cmp byte [eax],0
jne preserve_save_path
invoke VirtualFree,[ei.pszpath],0,MEM_RELEASE
and [ei.pszpath],0
preserve_save_path:
invoke SendMessage,[hwnd_tabctrl],TCM_GETCURSEL,0,0
invoke SendMessage,[hwnd_tabctrl],TCM_SETITEM,eax,ei
jmp finish
next_file:
invoke SendMessage,[hwnd_tabctrl],TCM_GETITEMCOUNT,0,0
mov ebx,eax
invoke SendMessage,[hwnd_tabctrl],TCM_GETCURSEL,0,0
inc eax
cmp eax,ebx
jb select_file
xor eax,eax
select_file:
push eax
invoke SendMessage,[hwnd_tabctrl],TCM_SETCURSEL,eax,0
pop eax
invoke SendMessage,[hwnd],FM_SELECT,eax,0
jmp finish
previous_file:
invoke SendMessage,[hwnd_tabctrl],TCM_GETCURSEL,0,0
sub eax,1
jnc select_file
invoke SendMessage,[hwnd_tabctrl],TCM_GETITEMCOUNT,0,0
dec eax
call select_file
jmp select_file
open_folder:
invoke SendMessage,[hwnd_tabctrl],TCM_GETCURSEL,0,0
invoke SendMessage,[hwnd_tabctrl],TCM_GETITEM,eax,ei
or eax,eax
jz finish
mov eax,[ei.pszpath]
or eax,eax
jz finish
invoke GetFullPathName,eax,1000h,path_buffer,param_buffer
mov edi,[param_buffer]
xor al,al
stosb
invoke ShellExecute,HWND_DESKTOP,NULL,path_buffer,NULL,NULL,SW_SHOWNORMAL
jmp finish
close_file:
invoke SendMessage,[hwnd_tabctrl],TCM_GETITEMCOUNT,0,0
cmp eax,1
jbe close_window
invoke SendMessage,[hwnd_tabctrl],TCM_GETCURSEL,0,0
mov ebx,eax
mov [ei.header.mask],TCIF_PARAM+TCIF_TEXT
mov [ei.header.pszText],name_buffer
mov [ei.header.cchTextMax],100h
invoke SendMessage,[hwnd_tabctrl],TCM_GETITEM,ebx,ei
mov eax,[ei.hwnd]
mov [wparam],eax
invoke SendMessage,eax,FEM_ISUNMODIFIED,0,0
or eax,eax
jz close_modified
cmp [ei.pszpath],0
jne do_close
invoke SendMessage,[hwnd_tabctrl],TCM_GETITEMCOUNT,0,0
cmp eax,1
jne do_close
jmp failed
close_modified:
mov eax,MB_ICONQUESTION+MB_YESNOCANCEL
or eax,[lparam]
invoke MessageBox,[hwnd],_saving_question,[ei.header.pszText],eax
cmp eax,IDCANCEL
je failed
cmp eax,IDNO
je do_close
invoke SendMessage,[hwnd],WM_COMMAND,IDM_SAVE,0
or eax,eax
jnz failed
do_close:
cmp [ei.pszpath],0
je delete_tab
invoke VirtualFree,[ei.pszpath],0,MEM_RELEASE
delete_tab:
invoke SendMessage,[hwnd_tabctrl],TCM_DELETEITEM,ebx,0
cmp ebx,[assigned_file]
jg tab_deleted
je assigned_deleted
dec [assigned_file]
jmp tab_deleted
assigned_deleted:
mov [assigned_file],-1
tab_deleted:
invoke SendMessage,[hwnd_tabctrl],TCM_GETITEMCOUNT,0,0
dec eax
cmp eax,ebx
jge select_next
sub ebx,1
jnc select_next
invoke SendMessage,[hwnd],FM_NEW,_untitled,0
jmp destroy_fedit
select_next:
invoke SendMessage,[hwnd_tabctrl],TCM_SETCURSEL,ebx,0
invoke SendMessage,[hwnd],FM_SELECT,ebx,0
destroy_fedit:
invoke DestroyWindow,[wparam]
xor eax,eax
jmp finish
exit:
mov [lparam],0
jmp close_window
undo:
invoke SendMessage,ebx,WM_UNDO,0,0
jmp finish
redo:
invoke SendMessage,ebx,FEM_REDO,0,0
jmp finish
cut:
invoke SendMessage,ebx,WM_CUT,0,0
jmp finish
copy:
invoke SendMessage,ebx,WM_COPY,0,0
jmp finish
paste:
invoke SendMessage,ebx,WM_PASTE,0,0
jmp finish
delete:
invoke SendMessage,ebx,WM_CLEAR,0,0
jmp finish
discard_undo:
invoke SendMessage,ebx,EM_EMPTYUNDOBUFFER,0,0
jmp finish
select_all:
mov [fepos.selectionLine],1
mov [fepos.selectionPosition],1
mov [fepos.caretLine],-1
mov [fepos.caretPosition],1
invoke SendMessage,ebx,FEM_SETPOS,fepos,0
invoke SendMessage,ebx,FEM_GETPOS,fepos,0
invoke SendMessage,ebx,FEM_GETLINELENGTH,[fepos.caretLine],0
inc eax
mov [fepos.caretPosition],eax
invoke SendMessage,ebx,FEM_SETPOS,fepos,0
jmp finish
vertical:
invoke SendMessage,ebx,FEM_GETMODE,0,0
xor eax,FEMODE_VERTICALSEL
invoke SendMessage,ebx,FEM_SETMODE,eax,0
jmp finish
read_only:
invoke SendMessage,ebx,FEM_GETMODE,0,0
xor eax,FEMODE_READONLY
invoke SendMessage,ebx,FEM_SETMODE,eax,0
xor ebx,ebx
jmp update_status_bar
position:
invoke DialogBoxParam,[hinstance],IDD_POSITION,[hwnd],PositionDialog,0
jmp finish
find:
invoke DialogBoxParam,[hinstance],IDD_FIND,[hwnd],FindDialog,0
or eax,eax
jz finish
invoke SendMessage,ebx,FEM_FINDFIRST,[search_settings],search_string
or eax,eax
jnz finish
not_found:
mov [param_buffer],1000h
invoke SendMessage,[hwnd_fedit],FEM_GETSEARCHTEXT,search_string,param_buffer
invoke SendMessage,[hwnd_fedit],FEM_GETSEARCHFLAGS,0,0
mov esi,_not_found
test eax,FEFIND_INWHOLETEXT
jnz make_not_found_message
mov esi,_not_found_after
test eax,FEFIND_BACKWARD
jz make_not_found_message
mov esi,_not_found_before
make_not_found_message:
cinvoke wsprintf,string_buffer,esi,search_string
invoke SendMessage,[hwnd_fedit],FEM_RELEASESEARCH,0,0
invoke MessageBox,[hwnd],string_buffer,_find,MB_ICONINFORMATION+MB_OK
jmp finish
findnext:
invoke SendMessage,ebx,FEM_FINDNEXT,0,0
or eax,eax
jz not_found
jmp finish
replace:
invoke DialogBoxParam,[hinstance],IDD_REPLACE,[hwnd],ReplaceDialog,0
or eax,eax
jz finish
mov [replaces_count],0
invoke SendMessage,ebx,FEM_BEGINOPERATION,0,0
test [command_flags],1
jz .start_replacing
invoke SendMessage,ebx,FEM_ENDOPERATION,0,0
.start_replacing:
invoke SendMessage,ebx,FEM_FINDFIRST,[search_settings],search_string
or eax,eax
jz .not_found
invoke SendMessage,ebx,FEM_GETMODE,0,0
push eax
and eax,not (FEMODE_VERTICALSEL + FEMODE_OVERWRITE)
invoke SendMessage,ebx,FEM_SETMODE,eax,0
.confirm_replace:
test [command_flags],1
jz .replace
invoke UpdateWindow,edi
invoke MessageBox,[hwnd],_replace_prompt,_replace,MB_ICONQUESTION+MB_YESNOCANCEL
cmp eax,IDCANCEL
je .replace_finish
cmp eax,IDNO
je .replace_next
.replace:
push ebx edi
invoke SendMessage,ebx,EM_REPLACESEL,FALSE,replace_string
pop edi ebx
inc [replaces_count]
.replace_next:
invoke SendMessage,ebx,FEM_FINDNEXT,0,0
or eax,eax
jnz .confirm_replace
.replace_finish:
pop eax
invoke SendMessage,ebx,FEM_SETMODE,eax,0
test [command_flags],1
jnz .replace_summary
invoke SendMessage,ebx,FEM_ENDOPERATION,0,0
.replace_summary:
invoke SendMessage,[hwnd_fedit],FEM_RELEASESEARCH,0,0
cinvoke wsprintf,string_buffer,_replaces_made,[replaces_count]
invoke MessageBox,[hwnd],string_buffer,_find,MB_ICONINFORMATION+MB_OK
jmp finish
.not_found:
invoke SendMessage,ebx,FEM_ENDOPERATION,0,0
jmp not_found
run:
and [command_flags],0
invoke SendMessage,[hwnd],FM_COMPILE,0,FALSE
or eax,eax
jnz finish
mov [sinfo.cb],sizeof.STARTUPINFO
mov [sinfo.dwFlags],0
cmp [output_format],3
ja run_object
invoke GetFullPathName,path_buffer,1000h,path_buffer+2000h,param_buffer
mov edx,[param_buffer]
mov byte [edx-1],0
invoke CreateProcess,path_buffer,NULL,NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS,NULL,path_buffer+2000h,sinfo,pinfo
invoke CloseHandle,[pinfo.hThread]
invoke CloseHandle,[pinfo.hProcess]
jmp finish
run_object:
invoke MessageBox,[hwnd],_run_object_error,_caption,MB_ICONERROR+MB_OK
jmp finish
compile:
and [command_flags],0
invoke SendMessage,[hwnd],FM_COMPILE,0,TRUE
jmp finish
build_symbols:
mov [command_flags],2
invoke SendMessage,[hwnd],FM_COMPILE,0,TRUE
jmp finish
assign:
invoke SendMessage,[hwnd_tabctrl],TCM_GETCURSEL,0,0
cmp eax,[assigned_file]
jne do_assign
or eax,-1
do_assign:
invoke SendMessage,[hwnd],FM_ASSIGN,eax,0
jmp finish
appearance:
invoke DialogBoxParam,[hinstance],IDD_APPEARANCE,[hwnd],AppearanceSetup,0
or eax,eax
jnz update
jmp finish
compiler_setup:
invoke DialogBoxParam,[hinstance],IDD_COMPILERSETUP,[hwnd],CompilerSetup,0
jmp finish
option_securesel:
xor [fedit_style],FES_SECURESEL
jmp update
option_autobrackets:
xor [fedit_style],FES_AUTOBRACKETS
jmp update
option_autoindent:
xor [fedit_style],FES_AUTOINDENT
jmp update
option_smarttabs:
xor [fedit_style],FES_SMARTTABS
jmp update
option_optimalfill:
xor [fedit_style],FES_OPTIMALFILL
jmp update
option_revivedeadkeys:
xor [fedit_style],FES_REVIVEDEADKEYS
jmp update
option_timescroll:
xor [fedit_style],FES_TIMESCROLL
jmp update
option_oneinstanceonly:
xor [instance_flags],1
stdcall WriteIniBit,ini_path,_section_options,_key_options_oneinstanceonly,[instance_flags],1
jmp finish
calculator:
invoke DialogBoxParam,[hinstance],IDD_CALCULATOR,[hwnd],CalculatorDialog,0
jmp finish
contents:
call get_help_file_extension
cmp eax,'.hlp'
je winhelp_contents
call check_htmlhelp
jc winhelp_contents
invoke HtmlHelp,[hwnd],help_path,HH_DISPLAY_TOPIC,0
jmp finish
winhelp_contents:
invoke WinHelp,[hwnd],help_path,HELP_FINDER,0
jmp finish
get_help_file_extension:
mov esi,help_path
skip_help_path:
lodsb
or al,al
jnz skip_help_path
mov ebx,characters
dec esi
mov ecx,4
convert_extension:
dec esi
shl eax,8
mov al,[esi]
xlatb
loop convert_extension
retn
check_htmlhelp:
cmp [HtmlHelp],0
jne htmlhelp_ok
invoke LoadLibrary,_htmlhelp_library
or eax,eax
jz htmlhelp_unavailable
invoke GetProcAddress,eax,_htmlhelp_api
or eax,eax
jz htmlhelp_unavailable
mov [HtmlHelp],eax
htmlhelp_ok:
clc
retn
htmlhelp_unavailable:
stc
retn
keyword:
invoke SendMessage,[hwnd_fedit],FEM_GETWORDATCARET,1000h,string_buffer
call get_help_file_extension
cmp eax,'.hlp'
je winhelp_keyword
call check_htmlhelp
jc winhelp_keyword
mov [hhkey.cbStruct],sizeof.HH_AKLINK
mov [hhkey.pszKeywords],string_buffer
mov [hhkey.pszUrl],0
mov [hhkey.fIndexOnFail],TRUE
invoke HtmlHelp,[hwnd],help_path,HH_DISPLAY_TOPIC,0
invoke HtmlHelp,[hwnd],help_path,HH_KEYWORD_LOOKUP,hhkey
jmp finish
winhelp_keyword:
invoke WinHelp,[hwnd],help_path,HELP_KEY,string_buffer
jmp finish
pick_help:
mov [ofn.lpstrFile],help_path
mov [ofn.lpstrFilter],help_filter
mov [ofn.Flags],OFN_EXPLORER+OFN_FILEMUSTEXIST+OFN_HIDEREADONLY
mov [ofn.lpstrTitle],_pick_help
invoke GetOpenFileName,ofn
jmp finish
about:
invoke DialogBoxParam,[hinstance],IDD_ABOUT,[hwnd],AboutDialog,0
jmp finish
failed:
or eax,-1
jmp finish
wmnotify:
mov ebx,[lparam]
virtual at ebx
nmh NMHDR
end virtual
cmp [nmh.code],NM_RCLICK
je rclick
cmp [nmh.code],TCN_SELCHANGING
je selchanging
cmp [nmh.code],TCN_SELCHANGE
jne finish
update:
invoke SendMessage,[hwnd_tabctrl],TCM_GETCURSEL,0,0
invoke SendMessage,[hwnd],FM_SELECT,eax,0
jmp finish
selchanging:
xor eax,eax
jmp finish
rclick:
invoke GetCursorPos,pt
invoke GetWindowRect,[hwnd_tabctrl],rc
mov eax,[pt.x]
sub eax,[rc.left]
mov [tcht.pt.x],eax
mov eax,[pt.y]
sub eax,[rc.top]
mov [tcht.pt.y],eax
invoke SendMessage,[hwnd_tabctrl],TCM_HITTEST,0,tcht
cmp eax,-1
je finish
mov ebx,eax
invoke SendMessage,[hwnd_tabctrl],TCM_SETCURSEL,ebx,0
invoke SendMessage,[hwnd],FM_SELECT,ebx,0
cmp ebx,[assigned_file]
sete al
neg al
and eax,MF_CHECKED
or eax,MF_BYCOMMAND
invoke CheckMenuItem,[hmenu_tab],IDM_ASSIGN,eax
invoke SendMessage,[hwnd_fedit],FEM_GETMODE,0,0
test eax,FEMODE_READONLY
setnz al
neg al
and eax,MF_CHECKED
or eax,MF_BYCOMMAND
invoke CheckMenuItem,[hmenu_tab],IDM_READONLY,eax
invoke SendMessage,[hwnd_tabctrl],TCM_GETITEM,ebx,ei
invoke SendMessage,[hwnd_fedit],FEM_ISUNMODIFIED,0,0
test eax,eax
setz al
cmp [ei.pszpath],0
setz ah
or al,ah
neg al
and eax,MF_GRAYED
or eax,MF_BYCOMMAND
invoke EnableMenuItem,[hmenu_tab],IDM_READONLY,eax
invoke TrackPopupMenu,[hmenu_tab],TPM_RIGHTBUTTON,[pt.x],[pt.y],0,[hwnd],0
jmp finish
wmdropfiles:
invoke DragQueryFile,[wparam],-1,NULL,0
xor ebx,ebx
drop_files:
cmp ebx,eax
je drag_finish
push eax
invoke DragQueryFile,[wparam],ebx,path_buffer,1000h
push ebx
invoke GetFileTitle,path_buffer,name_buffer,100h
invoke SendMessage,[hwnd],FM_OPEN,name_buffer,path_buffer
cmp eax,-1
jne drop_ok
cinvoke wsprintf,string_buffer,_loading_error,path_buffer
invoke MessageBox,[hwnd],string_buffer,_caption,MB_ICONERROR+MB_OK
drop_ok:
pop ebx eax
inc ebx
jmp drop_files
drag_finish:
invoke DragFinish,[wparam]
xor eax,eax
jmp finish
wmclose:
mov [lparam],MB_DEFBUTTON2
close_window:
mov [wparam],0
check_before_exiting:
mov [ei.header.mask],TCIF_PARAM+TCIF_TEXT
mov [ei.header.pszText],name_buffer
mov [ei.header.cchTextMax],100h
invoke SendMessage,[hwnd_tabctrl],TCM_GETITEM,[wparam],ei
or eax,eax
jz check_done
mov esi,[ei.pszpath]
invoke SendMessage,[ei.hwnd],FEM_ISUNMODIFIED,0,0
or eax,eax
jnz check_next
invoke SendMessage,[hwnd_tabctrl],TCM_SETCURSEL,[wparam],0
invoke SendMessage,[hwnd],FM_SELECT,[wparam],0
mov eax,MB_ICONQUESTION+MB_YESNOCANCEL
or eax,[lparam]
invoke MessageBox,[hwnd],_saving_question,[ei.header.pszText],eax
cmp eax,IDCANCEL
je finish
cmp eax,IDNO
je check_next
invoke SendMessage,[hwnd],WM_COMMAND,IDM_SAVE,0
or eax,eax
jnz finish
check_next:
inc [wparam]
jmp check_before_exiting
check_done:
mov [wparam],0
release_paths:
mov [ei.header.mask],TCIF_PARAM+TCIF_TEXT
mov [ei.header.pszText],name_buffer
mov [ei.header.cchTextMax],100h
invoke SendMessage,[hwnd_tabctrl],TCM_GETITEM,[wparam],ei
or eax,eax
jz quit
mov esi,[ei.pszpath]
or esi,esi
jz release_next_path
invoke VirtualFree,esi,0,MEM_RELEASE
release_next_path:
inc [wparam]
jmp release_paths
quit:
stdcall WriteIniInteger,ini_path,_section_compiler,_key_compiler_memory,[compiler_memory]
movzx eax,[passes_limit]
stdcall WriteIniInteger,ini_path,_section_compiler,_key_compiler_passes,eax
stdcall WriteIniInteger,ini_path,_section_compiler,_key_compiler_priority,[compiler_priority]
stdcall WriteIniBit,ini_path,_section_options,_key_options_securesel,[fedit_style],FES_SECURESEL
stdcall WriteIniBit,ini_path,_section_options,_key_options_autobrackets,[fedit_style],FES_AUTOBRACKETS
stdcall WriteIniBit,ini_path,_section_options,_key_options_autoindent,[fedit_style],FES_AUTOINDENT
stdcall WriteIniBit,ini_path,_section_options,_key_options_smarttabs,[fedit_style],FES_SMARTTABS
stdcall WriteIniBit,ini_path,_section_options,_key_options_optimalfill,[fedit_style],FES_OPTIMALFILL
stdcall WriteIniBit,ini_path,_section_options,_key_options_revivedeadkeys,[fedit_style],FES_REVIVEDEADKEYS
stdcall WriteIniBit,ini_path,_section_options,_key_options_consolecaret,[fedit_style],FES_CONSOLECARET
stdcall WriteIniBit,ini_path,_section_options,_key_options_timescroll,[fedit_style],FES_TIMESCROLL
stdcall WriteIniColor,ini_path,_section_colors,_key_color_text,[editor_colors]
stdcall WriteIniColor,ini_path,_section_colors,_key_color_background,[editor_colors+4]
stdcall WriteIniColor,ini_path,_section_colors,_key_color_seltext,[editor_colors+8]
stdcall WriteIniColor,ini_path,_section_colors,_key_color_selbackground,[editor_colors+12]
stdcall WriteIniColor,ini_path,_section_colors,_key_color_symbols,[asm_syntax_colors]
stdcall WriteIniColor,ini_path,_section_colors,_key_color_numbers,[asm_syntax_colors+4]
stdcall WriteIniColor,ini_path,_section_colors,_key_color_strings,[asm_syntax_colors+8]
stdcall WriteIniColor,ini_path,_section_colors,_key_color_comments,[asm_syntax_colors+12]
invoke WritePrivateProfileString,_section_font,_key_font_face,font.lfFaceName,ini_path
stdcall WriteIniInteger,ini_path,_section_font,_key_font_height,[font.lfHeight]
stdcall WriteIniInteger,ini_path,_section_font,_key_font_width,[font.lfWidth]
stdcall WriteIniInteger,ini_path,_section_font,_key_font_weight,[font.lfWeight]
stdcall WriteIniBit,ini_path,_section_font,_key_font_italic,dword [font.lfItalic],1
movzx eax,[font.lfCharSet]
stdcall WriteIniInteger,ini_path,_section_font,_key_font_charset,eax
invoke GetWindowPlacement,[hwnd],wp
stdcall WriteIniInteger,ini_path,_section_window,_key_window_top,[wp.rcNormalPosition.top]
stdcall WriteIniInteger,ini_path,_section_window,_key_window_left,[wp.rcNormalPosition.left]
stdcall WriteIniInteger,ini_path,_section_window,_key_window_right,[wp.rcNormalPosition.right]
stdcall WriteIniInteger,ini_path,_section_window,_key_window_bottom,[wp.rcNormalPosition.bottom]
cmp [wp.showCmd],SW_SHOWMAXIMIZED
sete al
stdcall WriteIniBit,ini_path,_section_window,_key_window_maximized,eax,1
invoke WritePrivateProfileString,_section_help,_key_help_path,help_path,ini_path
invoke DestroyWindow,[hwnd]
jmp finish
wmdestroy:
invoke WinHelp,[hwnd],0,HELP_QUIT,0
invoke ImageList_Destroy,[himl]
invoke PostQuitMessage,0
ok:
xor eax,eax
finish:
pop edi esi ebx
ret
endp
proc WriteIniInteger ini,sec,key,val
cinvoke wsprintf,string_buffer,_value,[val]
invoke WritePrivateProfileString,[sec],[key],string_buffer,[ini]
ret
endp
proc WriteIniColor ini,sec,key,color
movzx eax,byte [color]
movzx ebx,byte [color+1]
movzx ecx,byte [color+2]
cinvoke wsprintf,string_buffer,_color,eax,ebx,ecx
invoke WritePrivateProfileString,[sec],[key],string_buffer,[ini]
ret
endp
proc WriteIniBit ini,sec,key,val,mask
mov eax,[val]
test eax,[mask]
setnz al
movzx eax,al
cinvoke wsprintf,string_buffer,_value,eax
invoke WritePrivateProfileString,[sec],[key],string_buffer,[ini]
ret
endp
proc GetIniInteger ini,sec,key,lpval
mov [string_buffer],0
invoke GetPrivateProfileString,[sec],[key],string_buffer,string_buffer,1000h,[ini]
mov esi,string_buffer
cmp byte [esi],0
je .done
call atoi
jc .done
mov ebx,[lpval]
mov [ebx],eax
.done:
ret
endp
proc atoi
lodsb
cmp al,20h
je atoi
cmp al,9
je atoi
mov bl,al
xor eax,eax
xor edx,edx
cmp bl,'-'
je atoi_digit
cmp bl,'+'
je atoi_digit
dec esi
atoi_digit:
mov dl,[esi]
sub dl,30h
jc atoi_done
cmp dl,9
ja atoi_done
mov ecx,eax
shl ecx,1
jc atoi_overflow
shl ecx,1
jc atoi_overflow
add eax,ecx
shl eax,1
jc atoi_overflow
js atoi_overflow
add eax,edx
jc atoi_overflow
inc esi
jmp atoi_digit
atoi_overflow:
stc
ret
atoi_done:
cmp bl,'-'
jne atoi_sign_ok
neg eax
atoi_sign_ok:
clc
ret
endp
proc GetIniColor ini,sec,key,lpcolor
mov [string_buffer],0
invoke GetPrivateProfileString,[sec],[key],string_buffer,string_buffer,1000h,[ini]
mov esi,string_buffer
cmp byte [esi],0
je .done
call atoi
jc .done
cmp eax,0FFh
ja .done
mov edi,eax
call .find
jne .done
call atoi
jc .done
cmp eax,0FFh
ja .done
shl eax,8
or edi,eax
call .find
jne .done
call atoi
jc .done
cmp eax,0FFh
ja .done
shl eax,16
or edi,eax
mov ebx,[lpcolor]
mov [ebx],edi
.done:
ret
.find:
lodsb
cmp al,20h
je .find
cmp al,9
je .find
cmp al,','
retn
endp
proc GetIniByte ini,sec,key,lpval
mov [string_buffer],0
invoke GetPrivateProfileString,[sec],[key],string_buffer,string_buffer,1000h,[ini]
mov esi,string_buffer
cmp byte [esi],0
je .done
call atoi
jc .done
cmp eax,100h
jae .done
mov ebx,[lpval]
mov [ebx],al
.done:
ret
endp
proc GetIniBit ini,sec,key,lpval,mask
mov [string_buffer],0
invoke GetPrivateProfileString,[sec],[key],string_buffer,string_buffer,1000h,[ini]
mov esi,string_buffer
xor eax,eax
.find:
lodsb
cmp al,20h
je .find
cmp al,9
je .find
sub al,30h
jc .done
cmp al,1
ja .done
neg eax
mov ebx,[lpval]
mov edx,[mask]
not edx
and [ebx],edx
and eax,[mask]
or [ebx],eax
.done:
ret
endp
proc fasm_syntax lpLine,uChars,lpColors
push ebx esi edi
mov esi,[lpLine]
mov edi,[lpColors]
mov ebx,characters
mov ecx,[uChars]
xor edx,edx
.scan_syntax:
lodsb
.check_character:
cmp al,20h
je .syntax_space
cmp al,3Bh
je .syntax_comment
mov ah,al
xlatb
or al,al
jz .syntax_symbol
or edx,edx
jnz .syntax_neutral
cmp ah,27h
je .syntax_string
cmp ah,22h
je .syntax_string
cmp ah,24h
je .syntax_pascal_hex
cmp ah,39h
ja .syntax_neutral
cmp ah,30h
jae .syntax_number
.syntax_neutral:
or edx,-1
inc edi
loop .scan_syntax
jmp .done
.syntax_space:
xor edx,edx
inc edi
loop .scan_syntax
jmp .done
.syntax_symbol:
mov al,1
stosb
xor edx,edx
loop .scan_syntax
jmp .done
.syntax_pascal_hex:
cmp ecx,1
je .syntax_neutral
mov al,[esi]
mov ah,al
xlatb
or al,al
jz .syntax_neutral
cmp ah,24h
jne .syntax_number
cmp ecx,2
je .syntax_neutral
mov al,[esi+1]
xlatb
or al,al
jz .syntax_neutral
.syntax_number:
mov al,2
stosb
loop .number_character
jmp .done
.number_character:
lodsb
mov ah,al
xlatb
xchg al,ah
or ah,ah
jz .check_character
cmp al,20h
je .check_character
cmp al,3Bh
je .check_character
mov al,2
stosb
loop .number_character
jmp .done
.syntax_string:
mov al,3
stosb
dec ecx
jz .done
lodsb
cmp al,ah
jne .syntax_string
mov al,3
stosb
dec ecx
jz .done
lodsb
cmp al,ah
je .syntax_string
xor edx,edx
jmp .check_character
.process_comment:
lodsb
cmp al,20h
jne .syntax_comment
inc edi
loop .process_comment
jmp .done
.syntax_comment:
mov al,4
stosb
loop .process_comment
.done:
pop edi esi ebx
ret
endp
proc PositionDialog 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_fedit],FEM_GETPOS,fepos,0
cinvoke wsprintf,string_buffer,_value,[fepos.caretLine]
invoke SetDlgItemText,[hwnd_dlg],ID_ROW,string_buffer
cinvoke wsprintf,string_buffer,_value,[fepos.caretPosition]
invoke SetDlgItemText,[hwnd_dlg],ID_COLUMN,string_buffer
jmp .processed
.command:
cmp [wparam],IDCANCEL
je .close
cmp [wparam],IDOK
jne .processed
invoke GetDlgItemInt,[hwnd_dlg],ID_ROW,param_buffer,FALSE
mov [fepos.caretLine],eax
mov [fepos.selectionLine],eax
invoke GetDlgItemInt,[hwnd_dlg],ID_COLUMN,param_buffer,FALSE
mov [fepos.caretPosition],eax
mov [fepos.selectionPosition],eax
invoke IsDlgButtonChecked,[hwnd_dlg],ID_SELECT
or eax,eax
jz .position
mov [fepos.selectionLine],0
mov [fepos.selectionPosition],0
.position:
invoke SendMessage,[hwnd_fedit],FEM_SETPOS,fepos,0
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 GetStringsFromHistory hwnd_combobox
push ebx esi
invoke SendMessage,[hwnd_history],LB_GETCOUNT,0,0
mov esi,eax
xor ebx,ebx
.get_string:
cmp ebx,esi
je .finish
invoke SendMessage,[hwnd_history],LB_GETTEXT,ebx,string_buffer
invoke SendMessage,[hwnd_combobox],CB_ADDSTRING,0,string_buffer
inc ebx
jmp .get_string
.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_fedit],FEM_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],FEFIND_CASESENSITIVE
setnz al
invoke CheckDlgButton,[hwnd_dlg],ID_CASESENSITIVE,eax
xor eax,eax
test [search_settings],FEFIND_WHOLEWORDS
setnz al
invoke CheckDlgButton,[hwnd_dlg],ID_WHOLEWORDS,eax
xor eax,eax
test [search_settings],FEFIND_BACKWARD
setnz al
invoke CheckDlgButton,[hwnd_dlg],ID_BACKWARD,eax
xor eax,eax
test [search_settings],FEFIND_INWHOLETEXT
setnz al
invoke CheckDlgButton,[hwnd_dlg],ID_INWHOLETEXT,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,FEFIND_CASESENSITIVE
.casesensitive_ok:
invoke IsDlgButtonChecked,[hwnd_dlg],ID_WHOLEWORDS
or eax,eax
jz .wholewords_ok
or ebx,FEFIND_WHOLEWORDS
.wholewords_ok:
invoke IsDlgButtonChecked,[hwnd_dlg],ID_BACKWARD
or eax,eax
jz .backward_ok
or ebx,FEFIND_BACKWARD
.backward_ok:
invoke IsDlgButtonChecked,[hwnd_dlg],ID_INWHOLETEXT
or eax,eax
jz .inwholetext_ok
or ebx,FEFIND_INWHOLETEXT
.inwholetext_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],1
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,1
.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 CreateMutex,NULL,FALSE,NULL
mov [mutex],eax
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 CloseHandle,[mutex]
invoke EndDialog,[hwnd_dlg],[param_buffer]
jmp .processed
.close:
invoke WaitForSingleObject,[mutex],-1
cmp eax,WAIT_ABANDONED
je .processed
invoke TerminateThread,[hthread],0FFh
invoke ReleaseMutex,[mutex]
invoke CloseHandle,[hthread]
invoke CloseHandle,[mutex]
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 [fepos.selectionLine],eax
mov [fepos.caretLine],eax
get_lines_to_show:
invoke SendMessage,[hwnd_fedit],FEM_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_fedit],FEM_GETLINE,[nLine],esi
push esi
mov ecx,eax
or ecx,ecx
jz no_more_lines
mov eax,[nLine]
mov [fepos.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 [fepos.selectionPosition],1
inc [fepos.caretLine]
mov [fepos.caretPosition],1
invoke SendMessage,[hwnd_fedit],FEM_GETLINELENGTH,[fepos.caretLine],0
cmp eax,-1
jne show_ok
dec [fepos.caretLine]
invoke SendMessage,[hwnd_fedit],FEM_GETLINELENGTH,[fepos.caretLine],0
inc eax
mov [fepos.caretPosition],eax
show_ok:
invoke SendMessage,[hwnd_fedit],FEM_SETPOS,fepos,0
invoke SendMessage,[hwnd_fedit],FEM_GETMODE,0,0
and eax,not FEMODE_VERTICALSEL
invoke SendMessage,[hwnd_fedit],FEM_SETMODE,eax,0
mov eax,[fepos.selectionLine]
xchg eax,[fepos.caretLine]
mov [fepos.selectionLine],eax
mov eax,[fepos.selectionPosition]
xchg eax,[fepos.caretPosition]
mov [fepos.selectionPosition],eax
invoke SendMessage,[hwnd_fedit],FEM_SETPOS,fepos,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 GetDlgItem,[hwnd_dlg],ID_DISPLAY
invoke SendMessage,eax,WM_SETFONT,[hfont],FALSE
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_short
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 GetDlgItem,[hwnd_dlg],ID_INSTRUCTION
invoke SendMessage,eax,WM_SETFONT,[hfont],FALSE
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 [fedit_style],FES_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,FEM_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,FEM_SETTEXTCOLOR,[tmp_colors],[tmp_colors+4]
invoke SendDlgItemMessage,[hwnd_dlg],ID_PREVIEW,FEM_SETSELCOLOR,[tmp_colors+8],[tmp_colors+12]
invoke SendDlgItemMessage,[hwnd_dlg],ID_PREVIEW,FEM_SETSYNTAXHIGHLIGHT,tmp_colors+16,fasm_syntax
jmp .processed
.destroy:
invoke SendDlgItemMessage,[hwnd_dlg],ID_PREVIEW,WM_GETFONT,0,0
invoke DeleteObject,eax
jmp .finish
.command:
cmp [wparam],IDCANCEL
je .close
cmp [wparam],IDOK
je .ok
cmp [wparam],ID_CHANGE
jne .processed
invoke SendDlgItemMessage,[hwnd_dlg],ID_SETTING,CB_GETCURSEL,0,0
or eax,eax
jz .change_font
cmp eax,8
ja .processed
lea ebx,[tmp_colors+(eax-1)*4]
mov eax,[ebx]
mov [cc.rgbResult],eax
invoke ChooseColor,cc
or eax,eax
jz .processed
mov eax,[cc.rgbResult]
mov [ebx],eax
jmp .update_colors
.change_font:
mov esi,tmp_font
mov edi,backup_font
mov ecx,sizeof.LOGFONT shr 2
rep movsd
invoke ChooseFont,cf
or eax,eax
jz .change_font_cancelled
invoke SendDlgItemMessage,[hwnd_dlg],ID_PREVIEW,WM_GETFONT,0,0
mov ebx,eax
invoke CreateFontIndirect,[cf.lpLogFont]
invoke SendDlgItemMessage,[hwnd_dlg],ID_PREVIEW,WM_SETFONT,eax,0
invoke DeleteObject,ebx
jmp .processed
.change_font_cancelled:
mov esi,backup_font
mov edi,tmp_font
mov ecx,sizeof.LOGFONT shr 2
rep movsd
jmp .processed
.ok:
mov esi,tmp_colors
mov edi,editor_colors
mov ecx,8
rep movsd
mov esi,tmp_font
mov edi,font
mov ecx,sizeof.LOGFONT shr 2
rep movsd
invoke CreateFontIndirect,font
xchg eax,[hfont]
invoke DeleteObject,eax
invoke IsDlgButtonChecked,[hwnd_dlg],ID_CONSOLECARET
or eax,eax
setnz al
neg eax
and eax,FES_CONSOLECARET
and [fedit_style],not FES_CONSOLECARET
or [fedit_style],eax
invoke EndDialog,[hwnd_dlg],TRUE
jmp .finish
.close:
invoke EndDialog,[hwnd_dlg],FALSE
.processed:
mov eax,1
.finish:
pop edi esi ebx
ret
endp
proc CompilerSetup 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
.notprocessed:
xor eax,eax
jmp .finish
.initdialog:
invoke SendDlgItemMessage,[hwnd_dlg],ID_INCLUDEPATH,CB_ADDSTRING,0,include_path
mov [string_buffer],0
invoke GetEnvironmentVariable,_key_environment_include,string_buffer,1000h
invoke GetPrivateProfileString,_section_environment,_key_environment_include,string_buffer,path_buffer,4000h,ini_path
invoke SetDlgItemText,[hwnd_dlg],ID_INCLUDEPATH,path_buffer
invoke GetDlgItem,[hwnd_dlg],ID_MEMORY
stdcall AddStrings,eax,_memory_settings
invoke GetDlgItem,[hwnd_dlg],ID_PRIORITY
stdcall AddStrings,eax,_priority_settings
cinvoke wsprintf,string_buffer,_value,[compiler_memory]
invoke SendDlgItemMessage,[hwnd_dlg],ID_MEMORY,CB_FINDSTRINGEXACT,-1,string_buffer
cmp eax,CB_ERR
je .set_memory
invoke SendDlgItemMessage,[hwnd_dlg],ID_MEMORY,CB_SETCURSEL,eax,0
jmp .memory_ok
.set_memory:
invoke SetDlgItemText,[hwnd_dlg],ID_MEMORY,string_buffer
.memory_ok:
movzx eax,[passes_limit]
invoke SetDlgItemInt,[hwnd_dlg],ID_PASSES,eax,FALSE
mov eax,[compiler_priority]
cmp eax,2
jg .realtime
cmp eax,-2
jl .idle
jmp .priority_ok
.idle:
mov eax,-4
jmp .priority_ok
.realtime:
mov eax,4
.priority_ok:
sar eax,1
add eax,2
invoke SendDlgItemMessage,[hwnd_dlg],ID_PRIORITY,CB_SETCURSEL,eax,0
jmp .processed
.command:
cmp [wparam],IDCANCEL
je .close
cmp [wparam],IDOK
jne .finish
invoke GetDlgItemInt,[hwnd_dlg],ID_MEMORY,param_buffer,FALSE
mov [compiler_memory],eax
invoke GetDlgItemInt,[hwnd_dlg],ID_PASSES,param_buffer,FALSE
cmp eax,0FFFFh
jbe .set_passes
mov ax,0FFFFh
.set_passes:
mov [passes_limit],ax
invoke SendDlgItemMessage,[hwnd_dlg],ID_PRIORITY,CB_GETCURSEL,0,0
sub eax,2
sal eax,1
cmp eax,4
je .set_realtime
cmp eax,-4
je .set_idle
jmp .set_priority
.set_idle:
mov eax,-15
jmp .set_priority
.set_realtime:
mov eax,15
.set_priority:
mov [compiler_priority],eax
invoke GetDlgItemText,[hwnd_dlg],ID_INCLUDEPATH,path_buffer,4000h
invoke WritePrivateProfileString,_section_environment,_key_environment_include,path_buffer,ini_path
invoke EndDialog,[hwnd_dlg],TRUE
jmp .finish
.close:
invoke EndDialog,[hwnd_dlg],FALSE
.processed:
mov eax,1
.finish:
pop edi esi ebx
ret
endp
proc CalculatorDialog hwnd,msg,wparam,lparam
push ebx esi edi
cmp [msg],WM_INITDIALOG
je .init
cmp [msg],WM_COMMAND
je .command
cmp [msg],WM_CLOSE
je .close
xor eax,eax
jmp .finish
.init:
invoke CheckDlgButton,[hwnd],ID_DECSELECT,BST_CHECKED
jmp .processed
.command:
cmp [wparam],IDCANCEL
je .close
cmp [wparam],IDOK
je .evaluate
cmp [wparam],ID_EXPRESSION + EN_CHANGE shl 16
jne .processed
.calculate:
mov esi,string_buffer
invoke GetDlgItemText,[hwnd],ID_EXPRESSION,esi,400h
lea edi,[esi+eax]
xor eax,eax
stosb
mov [hthread],eax
mov [hash_tree],eax
mov [macro_status],al
mov [symbols_file],eax
not eax
mov [source_start],eax
lea eax,[esi+1000h]
mov [memory_end],eax
mov [labels_list],eax
mov eax,esp
and eax,not 0FFFh
sub eax,1000h
mov [stack_limit],eax
push ebp
mov [resume_esp],esp
mov [resume_eip],.calculator_error
call convert_line
push edi
call convert_expression
cmp byte [esi],0
jne invalid_expression
mov al,')'
stosb
pop esi
mov [error_line],0
or [current_line],-1
mov [value_size],0
call calculate_expression
cmp [error_line],0
je .present_result
jmp [error]
.present_result:
mov esi,edi
cmp byte [esi+13],0
je .result_in_64bit_composite_range
test byte [esi+7],80h
jnz .result_in_64bit_composite_range
invoke SetDlgItemText,[hwnd],ID_BINRESULT,_null
invoke SetDlgItemText,[hwnd],ID_OCTRESULT,_null
invoke SetDlgItemText,[hwnd],ID_HEXRESULT,_null
jmp .present_decimal
.result_in_64bit_composite_range:
mov eax,[esi]
mov edx,[esi+4]
mov edi,name_buffer+100
mov word [edi],'b'
.make_binary:
mov bl,'0'
shrd eax,edx,1
adc bl,0
dec edi
mov [edi],bl
shr edx,1
jnz .make_binary
test eax,eax
jnz .make_binary
invoke SetDlgItemText,[hwnd],ID_BINRESULT,edi
mov ecx,[esi]
mov edx,[esi+4]
mov edi,name_buffer+100
mov word [edi],'o'
.make_octal:
mov al,cl
and al,111b
add al,'0'
dec edi
mov [edi],al
shrd ecx,edx,3
shr edx,3
jnz .make_octal
test ecx,ecx
jnz .make_octal
invoke SetDlgItemText,[hwnd],ID_OCTRESULT,edi
mov ecx,[esi]
mov edx,[esi+4]
mov edi,name_buffer+100
mov word [edi],'h'
.make_hexadecimal:
mov al,cl
and al,0Fh
cmp al,10
sbb al,69h
das
dec edi
mov [edi],al
shrd ecx,edx,4
shr edx,4
jnz .make_hexadecimal
test ecx,ecx
jnz .make_hexadecimal
cmp al,'A'
jb .hexadecimal_ok
dec edi
mov byte [edi],'0'
.hexadecimal_ok:
invoke SetDlgItemText,[hwnd],ID_HEXRESULT,edi
.present_decimal:
mov edi,name_buffer+100
mov byte [edi],0
mov ecx,10
xor bl,bl
cmp byte [esi+13],0
je .make_decimal
mov bl,'-'
mov eax,[esi]
mov edx,[esi+4]
not eax
not edx
add eax,1
adc edx,0
mov [esi],eax
mov [esi+4],edx
or eax,edx
jnz .make_decimal
dec edi
mov byte [edi],'6'
mov dword [esi],99999999h
mov dword [esi+4],19999999h
.make_decimal:
mov eax,[esi+4]
xor edx,edx
div ecx
mov [esi+4],eax
mov eax,[esi]
div ecx
mov [esi],eax
add dl,'0'
dec edi
mov [edi],dl
or eax,[esi+4]
jnz .make_decimal
test bl,bl
jz .decimal_ok
dec edi
mov [edi],bl
.decimal_ok:
invoke SetDlgItemText,[hwnd],ID_DECRESULT,edi
pop ebp
jmp .processed
.calculator_error:
pop ebp
invoke SetDlgItemText,[hwnd],ID_BINRESULT,_null
invoke SetDlgItemText,[hwnd],ID_DECRESULT,_null
invoke SetDlgItemText,[hwnd],ID_HEXRESULT,_null
invoke SetDlgItemText,[hwnd],ID_OCTRESULT,_null
jmp .processed
.evaluate:
mov ebx,ID_BINRESULT
invoke IsDlgButtonChecked,[hwnd],ID_BINSELECT
cmp eax,BST_CHECKED
je .get_result
mov ebx,ID_HEXRESULT
invoke IsDlgButtonChecked,[hwnd],ID_HEXSELECT
cmp eax,BST_CHECKED
je .get_result
mov ebx,ID_OCTRESULT
invoke IsDlgButtonChecked,[hwnd],ID_OCTSELECT
cmp eax,BST_CHECKED
je .get_result
mov ebx,ID_DECRESULT
.get_result:
invoke GetDlgItemText,[hwnd],ebx,string_buffer,100h
invoke SetDlgItemText,[hwnd],ID_EXPRESSION,string_buffer
invoke GetDlgItem,[hwnd],ID_EXPRESSION
invoke SendMessage,[hwnd],WM_NEXTDLGCTL,eax,TRUE
jmp .processed
.close:
invoke EndDialog,[hwnd],0
.processed:
mov eax,1
.finish:
pop edi esi ebx
ret
endp
proc AboutDialog hwnd,msg,wparam,lparam
push ebx esi edi
cmp [msg],WM_COMMAND
je .close
cmp [msg],WM_CLOSE
je .close
xor eax,eax
jmp .finish
.close:
invoke EndDialog,[hwnd],0
.processed:
mov eax,1
.finish:
pop edi esi ebx
ret
endp
include 'fasm.inc'
section '.idata' import data readable writeable
library kernel,'KERNEL32.DLL',\
advapi,'ADVAPI32.DLL',\
user,'USER32.DLL',\
gdi,'GDI32.DLL',\
comctl,'COMCTL32.DLL',\
comdlg,'COMDLG32.DLL',\
shell,'SHELL32.DLL'
import kernel,\
GetModuleHandle,'GetModuleHandleA',\
LoadLibrary,'LoadLibraryA',\
GetProcAddress,'GetProcAddress',\
GetCommandLine,'GetCommandLineA',\
GetFileAttributes,'GetFileAttributesA',\
GetFullPathName,'GetFullPathNameA',\
GetCurrentDirectory,'GetCurrentDirectoryA',\
SetCurrentDirectory,'SetCurrentDirectoryA',\
CreateFile,'CreateFileA',\
GetFileSize,'GetFileSize',\
ReadFile,'ReadFile',\
WriteFile,'WriteFile',\
SetFilePointer,'SetFilePointer',\
CloseHandle,'CloseHandle',\
lstrcmpi,'lstrcmpiA',\
GlobalAlloc,'GlobalAlloc',\
GlobalReAlloc,'GlobalReAlloc',\
GlobalLock,'GlobalLock',\
GlobalUnlock,'GlobalUnlock',\
GlobalFree,'GlobalFree',\
VirtualAlloc,'VirtualAlloc',\
VirtualFree,'VirtualFree',\
CreateThread,'CreateThread',\
SetThreadPriority,'SetThreadPriority',\
TerminateThread,'TerminateThread',\
ExitThread,'ExitThread',\
GetExitCodeThread,'GetExitCodeThread',\
WaitForSingleObject,'WaitForSingleObject',\
CreateMutex,'CreateMutexA',\
ReleaseMutex,'ReleaseMutex',\
CreateProcess,'CreateProcessA',\
AllocConsole,'AllocConsole',\
SetConsoleTitle,'SetConsoleTitleA',\
FreeConsole,'FreeConsole',\
GetEnvironmentVariable,'GetEnvironmentVariableA',\
GetSystemTime,'GetSystemTime',\
GetTickCount,'GetTickCount',\
GetPrivateProfileString,'GetPrivateProfileStringA',\
WritePrivateProfileString,'WritePrivateProfileStringA',\
GetLastError,'GetLastError',\
ExitProcess,'ExitProcess'
import advapi,\
RegOpenKeyEx,'RegOpenKeyExA',\
RegQueryValueEx,'RegQueryValueExA',\
RegCloseKey,'RegCloseKey'
import user,\
RegisterClass,'RegisterClassA',\
CreateCaret,'CreateCaret',\
ShowCaret,'ShowCaret',\
HideCaret,'HideCaret',\
SetCaretPos,'SetCaretPos',\
DestroyCaret,'DestroyCaret',\
BeginPaint,'BeginPaint',\
EndPaint,'EndPaint',\
GetDC,'GetDC',\
GetUpdateRect,'GetUpdateRect',\
ReleaseDC,'ReleaseDC',\
DrawText,'DrawTextA',\
FillRect,'FillRect',\
InvalidateRect,'InvalidateRect',\
GetKeyboardState,'GetKeyboardState',\
ToAscii,'ToAscii',\
GetScrollInfo,'GetScrollInfo',\
SetScrollInfo,'SetScrollInfo',\
SetCapture,'SetCapture',\
ReleaseCapture,'ReleaseCapture',\
GetCursorPos,'GetCursorPos',\
ClientToScreen,'ClientToScreen',\
OpenClipboard,'OpenClipboard',\
CloseClipboard,'CloseClipboard',\
EmptyClipboard,'EmptyClipboard',\
GetClipboardData,'GetClipboardData',\
SetClipboardData,'SetClipboardData',\
LoadCursor,'LoadCursorA',\
LoadIcon,'LoadIconA',\
LoadBitmap,'LoadBitmapA',\
LoadMenu,'LoadMenuA',\
EnableMenuItem,'EnableMenuItem',\
CheckMenuItem,'CheckMenuItem',\
GetSubMenu,'GetSubMenu',\
TrackPopupMenu,'TrackPopupMenu',\
LoadAccelerators,'LoadAcceleratorsA',\
IsClipboardFormatAvailable,'IsClipboardFormatAvailable',\
CharLower,'CharLowerA',\
CharUpper,'CharUpperA',\
wsprintf,'wsprintfA',\
wvsprintf,'wvsprintfA',\
MessageBox,'MessageBoxA',\
WinHelp,'WinHelpA',\
DialogBoxParam,'DialogBoxParamA',\
GetDlgItem,'GetDlgItem',\
GetDlgItemInt,'GetDlgItemInt',\
SetDlgItemInt,'SetDlgItemInt',\
GetDlgItemText,'GetDlgItemTextA',\
SetDlgItemText,'SetDlgItemTextA',\
CheckDlgButton,'CheckDlgButton',\
IsDlgButtonChecked,'IsDlgButtonChecked',\
SendDlgItemMessage,'SendDlgItemMessageA',\
EndDialog,'EndDialog',\
FindWindow,'FindWindowA',\
SetForegroundWindow,'SetForegroundWindow',\
CreateWindowEx,'CreateWindowExA',\
DestroyWindow,'DestroyWindow',\
GetWindowLong,'GetWindowLongA',\
SetWindowLong,'SetWindowLongA',\
DefWindowProc,'DefWindowProcA',\
GetClientRect,'GetClientRect',\
GetWindowRect,'GetWindowRect',\
MoveWindow,'MoveWindow',\
SetWindowPos,'SetWindowPos',\
GetWindowPlacement,'GetWindowPlacement',\
SetWindowPlacement,'SetWindowPlacement',\
ShowWindow,'ShowWindow',\
EnableWindow,'EnableWindow',\
UpdateWindow,'UpdateWindow',\
IsZoomed,'IsZoomed',\
SetFocus,'SetFocus',\
GetSystemMetrics,'GetSystemMetrics',\
GetSysColor,'GetSysColor',\
SendMessage,'SendMessageA',\
GetMessage,'GetMessageA',\
TranslateAccelerator,'TranslateAccelerator',\
TranslateMessage,'TranslateMessage',\
DispatchMessage,'DispatchMessageA',\
PostMessage,'PostMessageA',\
PostQuitMessage,'PostQuitMessage'
import gdi,\
SetBkColor,'SetBkColor',\
SetTextColor,'SetTextColor',\
CreateSolidBrush,'CreateSolidBrush',\
CreateFont,'CreateFontA',\
CreateFontIndirect,'CreateFontIndirectA',\
GetTextMetrics,'GetTextMetricsA',\
GetTextExtentPoint32,'GetTextExtentPoint32A',\
CreateCompatibleDC,'CreateCompatibleDC',\
DeleteDC,'DeleteDC',\
CreateBitmap,'CreateBitmap',\
SelectObject,'SelectObject',\
GetObject,'GetObjectA',\
DeleteObject,'DeleteObject'
import comctl,\
CreateStatusWindow,'CreateStatusWindowA',\
ImageList_Create,'ImageList_Create',\
ImageList_Add,'ImageList_Add',\
ImageList_Destroy,'ImageList_Destroy'
import comdlg,\
GetOpenFileName,'GetOpenFileNameA',\
GetSaveFileName,'GetSaveFileNameA',\
GetFileTitle,'GetFileTitleA',\
ChooseFont,'ChooseFontA',\
ChooseColor,'ChooseColorA'
import shell,\
DragAcceptFiles,'DragAcceptFiles',\
DragQueryFile,'DragQueryFile',\
DragFinish,'DragFinish',\
ShellExecute,'ShellExecuteA'
section '.rsrc' resource data readable
directory RT_MENU,menus,\
RT_ACCELERATOR,accelerators,\
RT_DIALOG,dialogs,\
RT_GROUP_ICON,group_icons,\
RT_ICON,icons,\
RT_BITMAP,bitmaps,\
RT_VERSION,versions
resource menus,\
IDM_MAIN,LANG_ENGLISH+SUBLANG_DEFAULT,main_menu,\
IDM_TAB,LANG_ENGLISH+SUBLANG_DEFAULT,popup_menu
resource accelerators,\
IDA_MAIN,LANG_ENGLISH+SUBLANG_DEFAULT,main_keys
resource dialogs,\
IDD_POSITION,LANG_ENGLISH+SUBLANG_DEFAULT,position_dialog,\
IDD_FIND,LANG_ENGLISH+SUBLANG_DEFAULT,find_dialog,\
IDD_REPLACE,LANG_ENGLISH+SUBLANG_DEFAULT,replace_dialog,\
IDD_COMPILE,LANG_ENGLISH+SUBLANG_DEFAULT,compile_dialog,\
IDD_SUMMARY,LANG_ENGLISH+SUBLANG_DEFAULT,summary_dialog,\
IDD_ERRORSUMMARY,LANG_ENGLISH+SUBLANG_DEFAULT,error_summary_dialog,\
IDD_APPEARANCE,LANG_ENGLISH+SUBLANG_DEFAULT,appearance_dialog,\
IDD_COMPILERSETUP,LANG_ENGLISH+SUBLANG_DEFAULT,compiler_setup_dialog,\
IDD_CALCULATOR,LANG_ENGLISH+SUBLANG_DEFAULT,calculator_dialog,\
IDD_ABOUT,LANG_ENGLISH+SUBLANG_DEFAULT,about_dialog
resource group_icons,\
IDI_MAIN,LANG_NEUTRAL,main_icon
resource icons,\
1,LANG_NEUTRAL,main_icon_data
resource bitmaps,\
IDB_ASSIGN,LANG_NEUTRAL,assign_bitmap
resource versions,\
1,LANG_NEUTRAL,version
IDM_MAIN = 101
IDM_TAB = 102
IDA_MAIN = 201
IDD_POSITION = 301
IDD_FIND = 302
IDD_REPLACE = 303
IDD_COMPILE = 304
IDD_SUMMARY = 305
IDD_ERRORSUMMARY = 306
IDD_APPEARANCE = 307
IDD_COMPILERSETUP = 308
IDD_ABOUT = 309
IDD_CALCULATOR = 310
IDI_MAIN = 401
IDB_ASSIGN = 501
IDM_NEW = 1101
IDM_OPEN = 1102
IDM_SAVE = 1103
IDM_SAVEAS = 1104
IDM_NEXT = 1105
IDM_PREVIOUS = 1106
IDM_OPENFOLDER = 1107
IDM_CLOSE = 1108
IDM_EXIT = 1109
IDM_SELECTFILE = 1110
IDM_UNDO = 1201
IDM_REDO = 1202
IDM_CUT = 1203
IDM_COPY = 1204
IDM_PASTE = 1205
IDM_DELETE = 1206
IDM_SELECTALL = 1207
IDM_VERTICAL = 1208
IDM_DISCARD_UNDO = 1209
IDM_READONLY = 1210
IDM_POSITION = 1301
IDM_FIND = 1302
IDM_FINDNEXT = 1303
IDM_REPLACE = 1304
IDM_RUN = 1401
IDM_COMPILE = 1402
IDM_DEBUG = 1403
IDM_SYMBOLS = 1404
IDM_ASSIGN = 1409
IDM_APPEARANCE = 1501
IDM_COMPILERSETUP = 1502
IDM_SECURESEL = 1505
IDM_AUTOBRACKETS = 1506
IDM_AUTOINDENT = 1507
IDM_SMARTTABS = 1508
IDM_OPTIMALFILL = 1509
IDM_REVIVEDEADKEYS = 1510
IDM_TIMESCROLL = 1511
IDM_ONEINSTANCEONLY = 1512
IDM_CONTENTS = 1901
IDM_KEYWORD = 1902
IDM_PICKHELP = 1903
IDM_CALCULATOR = 1904
IDM_ABOUT = 1909
ID_CHANGE = 2001
ID_SELECT = 2101
ID_CASESENSITIVE = 2102
ID_WHOLEWORDS = 2103
ID_BACKWARD = 2104
ID_INWHOLETEXT = 2105
ID_PROMPT = 2106
ID_CONSOLECARET = 2107
ID_ROW = 2201
ID_COLUMN = 2202
ID_DISPLAY = 2203
ID_INSTRUCTION = 2204
ID_EXPRESSION = 2205
ID_DECRESULT = 2206
ID_HEXRESULT = 2207
ID_BINRESULT = 2208
ID_OCTRESULT = 2209
ID_TEXT = 2301
ID_NEWTEXT = 2302
ID_SETTING = 2303
ID_MEMORY = 2304
ID_PRIORITY = 2305
ID_PASSES = 2306
ID_LINES = 2307
ID_INCLUDEPATH = 2308
ID_ICON = 2401
ID_MESSAGE = 2402
ID_DECSELECT = 2501
ID_HEXSELECT = 2502
ID_BINSELECT = 2503
ID_OCTSELECT = 2504
ID_PROGRESS = 2801
ID_PREVIEW = 2901
_ equ ,09h,
menu main_menu
menuitem '&File',0,MFR_POPUP
menuitem '&New' _ 'Ctrl+N',IDM_NEW
menuitem '&Open...' _ 'Ctrl+O',IDM_OPEN
menuitem '&Save' _ 'Ctrl+S',IDM_SAVE
menuitem 'Save &as...',IDM_SAVEAS
menuseparator
menuitem 'E&xit' _ 'Alt+X',IDM_EXIT,MFR_END
menuitem '&Edit',0,MFR_POPUP
menuitem '&Undo' _ 'Ctrl+Z',IDM_UNDO
menuitem '&Redo' _ 'Ctrl+Shift+Z',IDM_REDO
menuseparator
menuitem 'Cu&t' _ 'Ctrl+X',IDM_CUT
menuitem '&Copy' _ 'Ctrl+C',IDM_COPY
menuitem '&Paste' _ 'Ctrl+V',IDM_PASTE
menuitem '&Delete',IDM_DELETE
menuseparator
menuitem 'Select &all' _ 'Ctrl+A',IDM_SELECTALL
menuseparator
menuitem '&Vertical selection' _ 'Alt+Ins',IDM_VERTICAL,MFR_END
menuitem '&Search',0,MFR_POPUP
menuitem '&Position...' _ 'Ctrl+G',IDM_POSITION
menuseparator
menuitem '&Find...' _ 'Ctrl+F',IDM_FIND
menuitem 'Find &next' _ 'F3',IDM_FINDNEXT
menuitem '&Replace...' _ 'Ctrl+H',IDM_REPLACE,MFR_END
menuitem '&Run',0,MFR_POPUP
menuitem '&Run' _ 'F9',IDM_RUN
menuitem '&Compile' _ 'Ctrl+F9',IDM_COMPILE
menuseparator
;menuitem '&Debug' _ 'F8',IDM_DEBUG
menuitem 'Build &symbols' _ 'Ctrl+F8',IDM_SYMBOLS,MFR_END
menuitem '&Options',0,MFR_POPUP
menuitem '&Appearance...',IDM_APPEARANCE
menuitem '&Compiler setup...',IDM_COMPILERSETUP
menuseparator
menuitem '&Secure selection',IDM_SECURESEL
menuitem 'Automatic &brackets',IDM_AUTOBRACKETS
menuitem 'Automatic &indents',IDM_AUTOINDENT
menuitem 'Smart &tabulation',IDM_SMARTTABS
menuitem '&Optimal fill on saving',IDM_OPTIMALFILL
menuitem '&Revive dead keys',IDM_REVIVEDEADKEYS
menuitem 'Ti&me scrolling',IDM_TIMESCROLL
menuitem 'O&ne instance only',IDM_ONEINSTANCEONLY,MFR_END
menuitem '&Help',0,MFR_POPUP + MFR_END
menuitem '&Contents' _ 'Alt+F1',IDM_CONTENTS
menuitem '&Keyword search' _ 'F1',IDM_KEYWORD
menuseparator
menuitem '&Pick help file...',IDM_PICKHELP
menuseparator
menuitem 'Ca&lculator...' _ 'Ctrl+F6',IDM_CALCULATOR
menuseparator
menuitem '&About...',IDM_ABOUT,MFR_END
menu popup_menu
menuitem '',0,MFR_POPUP+MFR_END
menuitem '&Assign to compiler' _ 'Shift+F9',IDM_ASSIGN
menuitem 'Open &folder',IDM_OPENFOLDER
menuitem '&Read-only mode' _ 'Shift+F6',IDM_READONLY
menuseparator
menuitem '&Close' _ 'Esc',IDM_CLOSE,MFR_END
accelerator main_keys,\
FVIRTKEY+FNOINVERT+FCONTROL,'N',IDM_NEW,\
FVIRTKEY+FNOINVERT+FCONTROL,'O',IDM_OPEN,\
FVIRTKEY+FNOINVERT+FCONTROL,'S',IDM_SAVE,\
FVIRTKEY+FNOINVERT+FCONTROL,'Z',IDM_UNDO,\
FVIRTKEY+FNOINVERT+FCONTROL+FSHIFT,'Z',IDM_REDO,\
FVIRTKEY+FNOINVERT+FCONTROL,'X',IDM_CUT,\
FVIRTKEY+FNOINVERT+FCONTROL,'C',IDM_COPY,\
FVIRTKEY+FNOINVERT+FCONTROL,'V',IDM_PASTE,\
FVIRTKEY+FNOINVERT+FCONTROL,'A',IDM_SELECTALL,\
FVIRTKEY+FNOINVERT+FCONTROL,'G',IDM_POSITION,\
FVIRTKEY+FNOINVERT+FCONTROL,'F',IDM_FIND,\
FVIRTKEY+FNOINVERT+FCONTROL,'H',IDM_REPLACE,\
FVIRTKEY+FNOINVERT+FCONTROL,VK_TAB,IDM_NEXT,\
FVIRTKEY+FNOINVERT+FCONTROL+FSHIFT,VK_TAB,IDM_PREVIOUS,\
FVIRTKEY+FNOINVERT,VK_F1,IDM_KEYWORD,\
FVIRTKEY+FNOINVERT+FALT,VK_F1,IDM_CONTENTS,\
FVIRTKEY+FNOINVERT,VK_F2,IDM_SAVE,\
FVIRTKEY+FNOINVERT+FSHIFT,VK_F2,IDM_SAVEAS,\
FVIRTKEY+FNOINVERT,VK_F4,IDM_OPEN,\
FVIRTKEY+FNOINVERT,VK_F3,IDM_FINDNEXT,\
FVIRTKEY+FNOINVERT,VK_F5,IDM_POSITION,\
FVIRTKEY+FNOINVERT+FSHIFT,VK_F6,IDM_READONLY,\
FVIRTKEY+FNOINVERT,VK_F7,IDM_FIND,\
FVIRTKEY+FNOINVERT+FSHIFT,VK_F7,IDM_FINDNEXT,\
FVIRTKEY+FNOINVERT+FCONTROL,VK_F7,IDM_REPLACE,\
FVIRTKEY+FNOINVERT,VK_F9,IDM_RUN,\
FVIRTKEY+FNOINVERT+FCONTROL,VK_F9,IDM_COMPILE,\
FVIRTKEY+FNOINVERT,VK_F8,IDM_DEBUG,\
FVIRTKEY+FNOINVERT+FCONTROL,VK_F8,IDM_SYMBOLS,\
FVIRTKEY+FNOINVERT+FSHIFT,VK_F9,IDM_ASSIGN,\
FVIRTKEY+FNOINVERT+FCONTROL,VK_F6,IDM_CALCULATOR,\
FVIRTKEY+FNOINVERT,VK_ESCAPE,IDM_CLOSE,\
FVIRTKEY+FNOINVERT+FALT,VK_DELETE,IDM_DISCARD_UNDO,\
FVIRTKEY+FNOINVERT+FALT,'X',IDM_EXIT,\
FVIRTKEY+FNOINVERT+FALT,'1',IDM_SELECTFILE+1,\
FVIRTKEY+FNOINVERT+FALT,'2',IDM_SELECTFILE+2,\
FVIRTKEY+FNOINVERT+FALT,'3',IDM_SELECTFILE+3,\
FVIRTKEY+FNOINVERT+FALT,'4',IDM_SELECTFILE+4,\
FVIRTKEY+FNOINVERT+FALT,'5',IDM_SELECTFILE+5,\
FVIRTKEY+FNOINVERT+FALT,'6',IDM_SELECTFILE+6,\
FVIRTKEY+FNOINVERT+FALT,'7',IDM_SELECTFILE+7,\
FVIRTKEY+FNOINVERT+FALT,'8',IDM_SELECTFILE+8,\
FVIRTKEY+FNOINVERT+FALT,'9',IDM_SELECTFILE+9
dialog position_dialog,'Position',40,40,126,54,WS_CAPTION+WS_POPUP+WS_SYSMENU+DS_MODALFRAME
dialogitem 'STATIC','&Row:',-1,4,8,28,8,WS_VISIBLE+SS_RIGHT
dialogitem 'EDIT','',ID_ROW,36,6,34,12,WS_VISIBLE+WS_BORDER+WS_TABSTOP+ES_NUMBER
dialogitem 'STATIC','&Column:',-1,4,26,28,8,WS_VISIBLE+SS_RIGHT
dialogitem 'EDIT','',ID_COLUMN,36,24,34,12,WS_VISIBLE+WS_BORDER+WS_TABSTOP+ES_NUMBER
dialogitem 'BUTTON','&Select',ID_SELECT,36,42,48,8,WS_VISIBLE+WS_TABSTOP+BS_AUTOCHECKBOX
dialogitem 'BUTTON','OK',IDOK,78,6,42,14,WS_VISIBLE+WS_TABSTOP+BS_DEFPUSHBUTTON
dialogitem 'BUTTON','C&ancel',IDCANCEL,78,22,42,14,WS_VISIBLE+WS_TABSTOP+BS_PUSHBUTTON
enddialog
dialog find_dialog,'Find',60,60,254,54,WS_CAPTION+WS_POPUP+WS_SYSMENU+DS_MODALFRAME
dialogitem 'STATIC','&Text to find:',-1,4,8,40,8,WS_VISIBLE+SS_RIGHT
dialogitem 'COMBOBOX','',ID_TEXT,48,6,150,64,WS_VISIBLE+WS_BORDER+WS_TABSTOP+CBS_DROPDOWN+CBS_AUTOHSCROLL+WS_VSCROLL
dialogitem 'BUTTON','&Case sensitive',ID_CASESENSITIVE,48,24,70,8,WS_VISIBLE+WS_TABSTOP+BS_AUTOCHECKBOX
dialogitem 'BUTTON','&Whole words',ID_WHOLEWORDS,48,38,70,8,WS_VISIBLE+WS_TABSTOP+BS_AUTOCHECKBOX
dialogitem 'BUTTON','&Backward',ID_BACKWARD,124,24,70,8,WS_VISIBLE+WS_TABSTOP+BS_AUTOCHECKBOX
dialogitem 'BUTTON','&In whole text',ID_INWHOLETEXT,124,38,70,8,WS_VISIBLE+WS_TABSTOP+BS_AUTOCHECKBOX
dialogitem 'BUTTON','&Find first',IDOK,206,6,42,14,WS_VISIBLE+WS_TABSTOP+BS_DEFPUSHBUTTON
dialogitem 'BUTTON','C&ancel',IDCANCEL,206,22,42,14,WS_VISIBLE+WS_TABSTOP+BS_PUSHBUTTON
enddialog
dialog replace_dialog,'Replace',60,60,254,86,WS_CAPTION+WS_POPUP+WS_SYSMENU+DS_MODALFRAME
dialogitem 'STATIC','&Text to find:',-1,4,8,40,8,WS_VISIBLE+SS_RIGHT
dialogitem 'COMBOBOX','',ID_TEXT,48,6,150,64,WS_VISIBLE+WS_BORDER+WS_TABSTOP+CBS_DROPDOWN+CBS_AUTOHSCROLL+WS_VSCROLL
dialogitem 'STATIC','&New text:',-1,4,26,40,8,WS_VISIBLE+SS_RIGHT
dialogitem 'COMBOBOX','',ID_NEWTEXT,48,24,150,64,WS_VISIBLE+WS_BORDER+WS_TABSTOP+CBS_DROPDOWN+CBS_AUTOHSCROLL+WS_VSCROLL
dialogitem 'BUTTON','&Case sensitive',ID_CASESENSITIVE,48,42,70,8,WS_VISIBLE+WS_TABSTOP+BS_AUTOCHECKBOX
dialogitem 'BUTTON','&Whole words',ID_WHOLEWORDS,48,56,70,8,WS_VISIBLE+WS_TABSTOP+BS_AUTOCHECKBOX
dialogitem 'BUTTON','&Backward',ID_BACKWARD,124,42,70,8,WS_VISIBLE+WS_TABSTOP+BS_AUTOCHECKBOX
dialogitem 'BUTTON','&In whole text',ID_INWHOLETEXT,124,56,70,8,WS_VISIBLE+WS_TABSTOP+BS_AUTOCHECKBOX
dialogitem 'BUTTON','&Prompt on replace',ID_PROMPT,48,70,70,8,WS_VISIBLE+WS_TABSTOP+BS_AUTOCHECKBOX
dialogitem 'BUTTON','&Replace',IDOK,206,6,42,14,WS_VISIBLE+WS_TABSTOP+BS_DEFPUSHBUTTON
dialogitem 'BUTTON','C&ancel',IDCANCEL,206,22,42,14,WS_VISIBLE+WS_TABSTOP+BS_PUSHBUTTON
enddialog
dialog compile_dialog,'Compile',64,64,192,42,WS_CAPTION+WS_POPUP+WS_SYSMENU+DS_MODALFRAME
dialogitem 'msctls_progress32','',ID_PROGRESS,8,6,176,12,WS_VISIBLE
dialogitem 'BUTTON','C&ancel',IDCANCEL,75,24,42,14,WS_VISIBLE+WS_TABSTOP+BS_PUSHBUTTON
enddialog
dialog summary_dialog,'Compile',48,24,192,130,WS_CAPTION+WS_POPUP+WS_SYSMENU+DS_MODALFRAME
dialogitem 'BUTTON','OK',IDCANCEL,142,108,42,14,WS_VISIBLE+WS_TABSTOP+BS_DEFPUSHBUTTON
dialogitem 'STATIC',IDI_ASTERISK,ID_ICON,8,4,0,0,WS_VISIBLE+SS_ICON
dialogitem 'STATIC','',ID_MESSAGE,36,10,148,8,WS_VISIBLE
dialogitem 'STATIC','&Display:',-1,8,28,176,8,WS_VISIBLE
dialogitem 'EDIT','',ID_DISPLAY,8,40,176,64,WS_VISIBLE+WS_BORDER+WS_TABSTOP+ES_MULTILINE+ES_READONLY+ES_AUTOHSCROLL+ES_AUTOVSCROLL+WS_VSCROLL
enddialog
dialog error_summary_dialog,'Compile',48,24,192,144,WS_CAPTION+WS_POPUP+WS_SYSMENU+DS_MODALFRAME
dialogitem 'STATIC','&Source:',-1,8,96,176,8,WS_VISIBLE
dialogitem 'LISTBOX','',ID_LINES,8,108,126,32,WS_VISIBLE+WS_BORDER+WS_TABSTOP+WS_VSCROLL+LBS_NOTIFY
dialogitem 'BUTTON','OK',IDCANCEL,142,108,42,14,WS_VISIBLE+WS_TABSTOP+BS_DEFPUSHBUTTON
dialogitem 'STATIC',IDI_HAND,ID_ICON,8,4,0,0,WS_VISIBLE+SS_ICON
dialogitem 'STATIC','',ID_MESSAGE,36,10,148,8,WS_VISIBLE+SS_LEFTNOWORDWRAP
dialogitem 'STATIC','&Display:',-1,8,28,176,8,WS_VISIBLE
dialogitem 'EDIT','',ID_DISPLAY,8,40,176,24,WS_VISIBLE+WS_BORDER+WS_TABSTOP+ES_MULTILINE+ES_READONLY+ES_AUTOHSCROLL+ES_AUTOVSCROLL+WS_VSCROLL
dialogitem 'STATIC','&Instruction:',-1,8,68,176,8,WS_VISIBLE
dialogitem 'EDIT','',ID_INSTRUCTION,8,80,176,12,WS_VISIBLE+WS_BORDER+WS_TABSTOP+ES_READONLY+ES_AUTOHSCROLL
enddialog
dialog appearance_dialog,'Appearance',50,20,186,166,WS_CAPTION+WS_POPUP+WS_SYSMENU+DS_MODALFRAME
dialogitem 'COMBOBOX','',ID_SETTING,8,6,120,140,WS_VISIBLE+WS_TABSTOP+CBS_DROPDOWNLIST+WS_VSCROLL
dialogitem 'BUTTON','C&hange...',ID_CHANGE,134,6,42,13,WS_VISIBLE+WS_TABSTOP+BS_PUSHBUTTON
dialogitem 'FEDIT','',ID_PREVIEW,8,24,168,120,WS_VISIBLE+WS_BORDER+WS_DISABLED+ES_NOHIDESEL
dialogitem 'BUTTON','&Console caret',ID_CONSOLECARET,8,151,80,8,WS_VISIBLE+WS_TABSTOP+BS_AUTOCHECKBOX
dialogitem 'BUTTON','OK',IDOK,88,148,42,14,WS_VISIBLE+WS_TABSTOP+BS_DEFPUSHBUTTON
dialogitem 'BUTTON','C&ancel',IDCANCEL,134,148,42,14,WS_VISIBLE+WS_TABSTOP+BS_PUSHBUTTON
enddialog
dialog compiler_setup_dialog,'Compiler setup',54,28,200,82,WS_CAPTION+WS_POPUP+WS_SYSMENU+DS_MODALFRAME
dialogitem 'STATIC','&Include path(s):',-1,8,4,184,8,WS_VISIBLE+SS_LEFT
dialogitem 'COMBOBOX','',ID_INCLUDEPATH,8,14,184,48,WS_VISIBLE+WS_BORDER+WS_TABSTOP+CBS_DROPDOWN+WS_VSCROLL+CBS_AUTOHSCROLL
dialogitem 'STATIC','&Memory (KB):',-1,8,30,42,8,WS_VISIBLE+SS_LEFT
dialogitem 'COMBOBOX','',ID_MEMORY,8,40,54,96,WS_VISIBLE+WS_BORDER+WS_TABSTOP+ES_NUMBER+CBS_DROPDOWN+WS_VSCROLL
dialogitem 'STATIC','&Passes limit:',-1,72,30,60,8,WS_VISIBLE+SS_LEFT
dialogitem 'EDIT','',ID_PASSES,72,40,54,12,WS_VISIBLE+WS_BORDER+WS_TABSTOP+ES_NUMBER
dialogitem 'STATIC','&Thread priority:',-1,136,30,60,8,WS_VISIBLE+SS_LEFT
dialogitem 'COMBOBOX','',ID_PRIORITY,136,40,56,96,WS_VISIBLE+WS_TABSTOP+CBS_DROPDOWNLIST+WS_VSCROLL
dialogitem 'BUTTON','OK',IDOK,104,64,42,14,WS_VISIBLE+WS_TABSTOP+BS_DEFPUSHBUTTON
dialogitem 'BUTTON','C&ancel',IDCANCEL,150,64,42,14,WS_VISIBLE+WS_TABSTOP+BS_PUSHBUTTON
enddialog
dialog calculator_dialog,'Calculator',48,32,380,80,WS_CAPTION+WS_POPUP+WS_SYSMENU+DS_MODALFRAME
dialogitem 'STATIC','&Expression:',-1,4,8,44,8,WS_VISIBLE+SS_RIGHT
dialogitem 'EDIT','',ID_EXPRESSION,52,6,274,12,WS_VISIBLE+WS_BORDER+WS_TABSTOP+ES_AUTOHSCROLL
dialogitem 'BUTTON','&Decimal:',ID_DECSELECT,4,20,56,12,WS_VISIBLE+WS_TABSTOP+BS_AUTORADIOBUTTON+BS_RIGHT+BS_LEFTTEXT
dialogitem 'EDIT','',ID_DECRESULT,62,22,264,10,WS_VISIBLE+ES_READONLY+ES_AUTOHSCROLL
dialogitem 'BUTTON','&Hexadecimal:',ID_HEXSELECT,4,34,56,12,WS_VISIBLE+WS_TABSTOP+BS_AUTORADIOBUTTON+BS_RIGHT+BS_LEFTTEXT
dialogitem 'EDIT','',ID_HEXRESULT,62,36,264,10,WS_VISIBLE+ES_READONLY+ES_AUTOHSCROLL
dialogitem 'BUTTON','&Binary:',ID_BINSELECT,4,48,56,12,WS_VISIBLE+WS_TABSTOP+BS_AUTORADIOBUTTON+BS_RIGHT+BS_LEFTTEXT
dialogitem 'EDIT','',ID_BINRESULT,62,50,264,10,WS_VISIBLE+ES_READONLY+ES_AUTOHSCROLL
dialogitem 'BUTTON','&Octal:',ID_OCTSELECT,4,62,56,12,WS_VISIBLE+WS_TABSTOP+BS_AUTORADIOBUTTON+BS_RIGHT+BS_LEFTTEXT
dialogitem 'EDIT','',ID_OCTRESULT,62,64,264,10,WS_VISIBLE+ES_READONLY+ES_AUTOHSCROLL
dialogitem 'BUTTON','E&valuate',IDOK,332,6,42,14,WS_VISIBLE+WS_TABSTOP+BS_DEFPUSHBUTTON
dialogitem 'BUTTON','&Close',IDCANCEL,332,22,42,14,WS_VISIBLE+WS_TABSTOP+BS_PUSHBUTTON
enddialog
dialog about_dialog,'About',40,40,172,60,WS_CAPTION+WS_POPUP+WS_SYSMENU+DS_MODALFRAME
dialogitem 'STATIC',<'flat assembler IDE for Windows',0Dh,0Ah,'Copyright ',0A9h,' 1999-2024 Tomasz Grysztar.'>,-1,27,10,144,40,WS_VISIBLE+SS_CENTER
dialogitem 'STATIC',IDI_MAIN,-1,8,8,32,32,WS_VISIBLE+SS_ICON
dialogitem 'STATIC','',-1,4,34,164,11,WS_VISIBLE+SS_ETCHEDHORZ
dialogitem 'STATIC',<'flat assembler version ',VERSION_STRING>,-1,4,38,100,20,WS_VISIBLE+SS_LEFT
dialogitem 'STATIC',<'flat editor version ',FEDIT_VERSION_STRING>,-1,4,48,100,20,WS_VISIBLE+SS_LEFT
dialogitem 'BUTTON','OK',IDOK,124,40,42,14,WS_VISIBLE+WS_TABSTOP+BS_DEFPUSHBUTTON
enddialog
icon main_icon,main_icon_data,'resource\fasmw.ico'
bitmap assign_bitmap,'resource\assign.bmp'
versioninfo version,VOS__WINDOWS32,VFT_APP,VFT2_UNKNOWN,LANG_ENGLISH+SUBLANG_DEFAULT,0,\
'FileDescription','flat assembler',\
'LegalCopyright',<'Copyright ',0A9h,' 1999-2024 Tomasz Grysztar.'>,\
'FileVersion','1',\
'ProductVersion',VERSION_STRING,\
'OriginalFilename','FASMW.EXE'