; 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'