home *** CD-ROM | disk | FTP | other *** search
/ Chip 2004 July / CMCD0704.ISO / Software / Freeware / Utilitare / VisualBoyAdvance-1.7.2 / src / win32 / MainWnd.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2004-05-13  |  46.1 KB  |  1,148 lines

  1. // VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator.
  2. // Copyright (C) 1999-2003 Forgotten
  3. // Copyright (C) 2004 Forgotten and the VBA development team
  4.  
  5. // This program is free software; you can redistribute it and/or modify
  6. // it under the terms of the GNU General Public License as published by
  7. // the Free Software Foundation; either version 2, or(at your option)
  8. // any later version.
  9. //
  10. // This program is distributed in the hope that it will be useful,
  11. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. // GNU General Public License for more details.
  14. //
  15. // You should have received a copy of the GNU General Public License
  16. // along with this program; if not, write to the Free Software Foundation,
  17. // Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  18.  
  19. // MainWnd.cpp : implementation file
  20. //
  21.  
  22. #include "stdafx.h"
  23. #include "VBA.h"
  24. #include "MainWnd.h"
  25.  
  26. #include <winsock.h>
  27.  
  28. #include "FileDlg.h"
  29. #include "Reg.h"
  30. #include "WinResUtil.h"
  31.  
  32. #include "../System.h"
  33. #include "../AutoBuild.h"
  34. #include "../cheatSearch.h"
  35. #include "../GBA.h"
  36. #include "../Globals.h"
  37. #include "../Flash.h"
  38. #include "../Globals.h"
  39. #include "../gb/GB.h"
  40. #include "../gb/gbCheats.h"
  41. #include "../gb/gbGlobals.h"
  42. #include "../RTC.h"
  43. #include "../Sound.h"
  44. #include "../Util.h"
  45.  
  46. #ifdef _DEBUG
  47. #define new DEBUG_NEW
  48. #undef THIS_FILE
  49. static char THIS_FILE[] = __FILE__;
  50. #endif
  51.  
  52. #define VBA_CONFIRM_MODE WM_APP + 100
  53.  
  54. extern void remoteCleanUp();
  55.  
  56. /////////////////////////////////////////////////////////////////////////////
  57. // MainWnd
  58.  
  59. MainWnd::MainWnd()
  60. {
  61.   m_hAccelTable = NULL;
  62.   arrow = LoadCursor(NULL, IDC_ARROW);
  63. }
  64.  
  65. MainWnd::~MainWnd()
  66. {
  67. }
  68.  
  69.  
  70. BEGIN_MESSAGE_MAP(MainWnd, CWnd)
  71.   //{{AFX_MSG_MAP(MainWnd)
  72.   ON_WM_CLOSE()
  73.   ON_COMMAND(ID_HELP_ABOUT, OnHelpAbout)
  74.   ON_COMMAND(ID_HELP_FAQ, OnHelpFaq)
  75.   ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
  76.   ON_WM_INITMENUPOPUP()
  77.   ON_COMMAND(ID_FILE_PAUSE, OnFilePause)
  78.   ON_UPDATE_COMMAND_UI(ID_FILE_PAUSE, OnUpdateFilePause)
  79.   ON_COMMAND(ID_FILE_RESET, OnFileReset)
  80.   ON_UPDATE_COMMAND_UI(ID_FILE_RESET, OnUpdateFileReset)
  81.   ON_UPDATE_COMMAND_UI(ID_FILE_RECENT_FREEZE, OnUpdateFileRecentFreeze)
  82.   ON_COMMAND(ID_FILE_RECENT_RESET, OnFileRecentReset)
  83.   ON_COMMAND(ID_FILE_RECENT_FREEZE, OnFileRecentFreeze)
  84.   ON_COMMAND(ID_FILE_EXIT, OnFileExit)
  85.   ON_COMMAND(ID_FILE_CLOSE, OnFileClose)
  86.   ON_UPDATE_COMMAND_UI(ID_FILE_CLOSE, OnUpdateFileClose)
  87.   ON_COMMAND(ID_FILE_OPENGAMEBOY, OnFileOpengameboy)
  88.   ON_COMMAND(ID_FILE_LOAD, OnFileLoad)
  89.   ON_UPDATE_COMMAND_UI(ID_FILE_LOAD, OnUpdateFileLoad)
  90.   ON_COMMAND(ID_FILE_SAVE, OnFileSave)
  91.   ON_UPDATE_COMMAND_UI(ID_FILE_SAVE, OnUpdateFileSave)
  92.   ON_COMMAND(ID_FILE_IMPORT_BATTERYFILE, OnFileImportBatteryfile)
  93.   ON_UPDATE_COMMAND_UI(ID_FILE_IMPORT_BATTERYFILE, OnUpdateFileImportBatteryfile)
  94.   ON_COMMAND(ID_FILE_IMPORT_GAMESHARKCODEFILE, OnFileImportGamesharkcodefile)
  95.   ON_UPDATE_COMMAND_UI(ID_FILE_IMPORT_GAMESHARKCODEFILE, OnUpdateFileImportGamesharkcodefile)
  96.   ON_COMMAND(ID_FILE_IMPORT_GAMESHARKSNAPSHOT, OnFileImportGamesharksnapshot)
  97.   ON_UPDATE_COMMAND_UI(ID_FILE_IMPORT_GAMESHARKSNAPSHOT, OnUpdateFileImportGamesharksnapshot)
  98.   ON_COMMAND(ID_FILE_EXPORT_BATTERYFILE, OnFileExportBatteryfile)
  99.   ON_UPDATE_COMMAND_UI(ID_FILE_EXPORT_BATTERYFILE, OnUpdateFileExportBatteryfile)
  100.   ON_COMMAND(ID_FILE_EXPORT_GAMESHARKSNAPSHOT, OnFileExportGamesharksnapshot)
  101.   ON_UPDATE_COMMAND_UI(ID_FILE_EXPORT_GAMESHARKSNAPSHOT, OnUpdateFileExportGamesharksnapshot)
  102.   ON_COMMAND(ID_FILE_SCREENCAPTURE, OnFileScreencapture)
  103.   ON_UPDATE_COMMAND_UI(ID_FILE_SCREENCAPTURE, OnUpdateFileScreencapture)
  104.   ON_COMMAND(ID_FILE_ROMINFORMATION, OnFileRominformation)
  105.   ON_UPDATE_COMMAND_UI(ID_FILE_ROMINFORMATION, OnUpdateFileRominformation)
  106.   ON_COMMAND(ID_FILE_TOGGLEMENU, OnFileTogglemenu)
  107.   ON_UPDATE_COMMAND_UI(ID_FILE_TOGGLEMENU, OnUpdateFileTogglemenu)
  108.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_FRAMESKIP_THROTTLE_NOTHROTTLE, OnUpdateOptionsFrameskipThrottleNothrottle)
  109.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_FRAMESKIP_THROTTLE_25, OnUpdateOptionsFrameskipThrottle25)
  110.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_FRAMESKIP_THROTTLE_50, OnUpdateOptionsFrameskipThrottle50)
  111.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_FRAMESKIP_THROTTLE_100, OnUpdateOptionsFrameskipThrottle100)
  112.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_FRAMESKIP_THROTTLE_150, OnUpdateOptionsFrameskipThrottle150)
  113.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_FRAMESKIP_THROTTLE_200, OnUpdateOptionsFrameskipThrottle200)
  114.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_FRAMESKIP_THROTTLE_OTHER, OnUpdateOptionsFrameskipThrottleOther)
  115.   ON_COMMAND(ID_OPTIONS_FRAMESKIP_THROTTLE_NOTHROTTLE, OnOptionsFrameskipThrottleNothrottle)
  116.   ON_COMMAND(ID_OPTIONS_FRAMESKIP_THROTTLE_25, OnOptionsFrameskipThrottle25)
  117.   ON_COMMAND(ID_OPTIONS_FRAMESKIP_THROTTLE_50, OnOptionsFrameskipThrottle50)
  118.   ON_COMMAND(ID_OPTIONS_FRAMESKIP_THROTTLE_100, OnOptionsFrameskipThrottle100)
  119.   ON_COMMAND(ID_OPTIONS_FRAMESKIP_THROTTLE_150, OnOptionsFrameskipThrottle150)
  120.   ON_COMMAND(ID_OPTIONS_FRAMESKIP_THROTTLE_200, OnOptionsFrameskipThrottle200)
  121.   ON_COMMAND(ID_OPTIONS_FRAMESKIP_THROTTLE_OTHER, OnOptionsFrameskipThrottleOther)
  122.   ON_COMMAND(ID_OPTIONS_FRAMESKIP_AUTOMATIC, OnOptionsFrameskipAutomatic)
  123.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_FRAMESKIP_AUTOMATIC, OnUpdateOptionsFrameskipAutomatic)
  124.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_VIDEO_FRAMESKIP_0, OnUpdateOptionsVideoFrameskip0)
  125.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_VIDEO_FRAMESKIP_1, OnUpdateOptionsVideoFrameskip1)
  126.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_VIDEO_FRAMESKIP_2, OnUpdateOptionsVideoFrameskip2)
  127.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_VIDEO_FRAMESKIP_3, OnUpdateOptionsVideoFrameskip3)
  128.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_VIDEO_FRAMESKIP_4, OnUpdateOptionsVideoFrameskip4)
  129.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_VIDEO_FRAMESKIP_5, OnUpdateOptionsVideoFrameskip5)
  130.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_VIDEO_FRAMESKIP_6, OnUpdateOptionsVideoFrameskip6)
  131.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_VIDEO_FRAMESKIP_7, OnUpdateOptionsVideoFrameskip7)
  132.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_VIDEO_FRAMESKIP_8, OnUpdateOptionsVideoFrameskip8)
  133.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_VIDEO_FRAMESKIP_9, OnUpdateOptionsVideoFrameskip9)
  134.   ON_COMMAND(ID_OPTIONS_VIDEO_VSYNC, OnOptionsVideoVsync)
  135.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_VIDEO_VSYNC, OnUpdateOptionsVideoVsync)
  136.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_VIDEO_X1, OnUpdateOptionsVideoX1)
  137.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_VIDEO_X2, OnUpdateOptionsVideoX2)
  138.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_VIDEO_X3, OnUpdateOptionsVideoX3)
  139.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_VIDEO_X4, OnUpdateOptionsVideoX4)
  140.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_VIDEO_FULLSCREEN320X240, OnUpdateOptionsVideoFullscreen320x240)
  141.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_VIDEO_FULLSCREEN640X480, OnUpdateOptionsVideoFullscreen640x480)
  142.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_VIDEO_FULLSCREEN800X600, OnUpdateOptionsVideoFullscreen800x600)
  143.   ON_COMMAND(ID_OPTIONS_VIDEO_FULLSCREEN320X240, OnOptionsVideoFullscreen320x240)
  144.   ON_COMMAND(ID_OPTIONS_VIDEO_FULLSCREEN640X480, OnOptionsVideoFullscreen640x480)
  145.   ON_COMMAND(ID_OPTIONS_VIDEO_FULLSCREEN800X600, OnOptionsVideoFullscreen800x600)
  146.   ON_COMMAND(ID_OPTIONS_VIDEO_FULLSCREEN, OnOptionsVideoFullscreen)
  147.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_VIDEO_FULLSCREEN, OnUpdateOptionsVideoFullscreen)
  148.   ON_WM_MOVE()
  149.   ON_WM_SIZE()
  150.   ON_COMMAND(ID_OPTIONS_VIDEO_DISABLESFX, OnOptionsVideoDisablesfx)
  151.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_VIDEO_DISABLESFX, OnUpdateOptionsVideoDisablesfx)
  152.   ON_COMMAND(ID_OPTIONS_VIDEO_FULLSCREENSTRETCHTOFIT, OnOptionsVideoFullscreenstretchtofit)
  153.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_VIDEO_FULLSCREENSTRETCHTOFIT, OnUpdateOptionsVideoFullscreenstretchtofit)
  154.   ON_COMMAND(ID_OPTIONS_VIDEO_RENDERMETHOD_GDI, OnOptionsVideoRendermethodGdi)
  155.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_VIDEO_RENDERMETHOD_GDI, OnUpdateOptionsVideoRendermethodGdi)
  156.   ON_COMMAND(ID_OPTIONS_VIDEO_RENDERMETHOD_DIRECTDRAW, OnOptionsVideoRendermethodDirectdraw)
  157.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_VIDEO_RENDERMETHOD_DIRECTDRAW, OnUpdateOptionsVideoRendermethodDirectdraw)
  158.   ON_COMMAND(ID_OPTIONS_VIDEO_RENDERMETHOD_DIRECT3D, OnOptionsVideoRendermethodDirect3d)
  159.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_VIDEO_RENDERMETHOD_DIRECT3D, OnUpdateOptionsVideoRendermethodDirect3d)
  160.   ON_COMMAND(ID_OPTIONS_VIDEO_RENDERMETHOD_OPENGL, OnOptionsVideoRendermethodOpengl)
  161.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_VIDEO_RENDERMETHOD_OPENGL, OnUpdateOptionsVideoRendermethodOpengl)
  162.   ON_COMMAND(ID_OPTIONS_VIDEO_TRIPLEBUFFERING, OnOptionsVideoTriplebuffering)
  163.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_VIDEO_TRIPLEBUFFERING, OnUpdateOptionsVideoTriplebuffering)
  164.   ON_COMMAND(ID_OPTIONS_VIDEO_DDRAWEMULATIONONLY, OnOptionsVideoDdrawemulationonly)
  165.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_VIDEO_DDRAWEMULATIONONLY, OnUpdateOptionsVideoDdrawemulationonly)
  166.   ON_COMMAND(ID_OPTIONS_VIDEO_DDRAWUSEVIDEOMEMORY, OnOptionsVideoDdrawusevideomemory)
  167.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_VIDEO_DDRAWUSEVIDEOMEMORY, OnUpdateOptionsVideoDdrawusevideomemory)
  168.   ON_COMMAND(ID_OPTIONS_VIDEO_RENDEROPTIONS_D3DNOFILTER, OnOptionsVideoRenderoptionsD3dnofilter)
  169.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_VIDEO_RENDEROPTIONS_D3DNOFILTER, OnUpdateOptionsVideoRenderoptionsD3dnofilter)
  170.   ON_COMMAND(ID_OPTIONS_VIDEO_RENDEROPTIONS_D3DBILINEAR, OnOptionsVideoRenderoptionsD3dbilinear)
  171.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_VIDEO_RENDEROPTIONS_D3DBILINEAR, OnUpdateOptionsVideoRenderoptionsD3dbilinear)
  172.   ON_COMMAND(ID_OPTIONS_VIDEO_RENDEROPTIONS_GLNEAREST, OnOptionsVideoRenderoptionsGlnearest)
  173.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_VIDEO_RENDEROPTIONS_GLNEAREST, OnUpdateOptionsVideoRenderoptionsGlnearest)
  174.   ON_COMMAND(ID_OPTIONS_VIDEO_RENDEROPTIONS_GLBILINEAR, OnOptionsVideoRenderoptionsGlbilinear)
  175.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_VIDEO_RENDEROPTIONS_GLBILINEAR, OnUpdateOptionsVideoRenderoptionsGlbilinear)
  176.   ON_COMMAND(ID_OPTIONS_VIDEO_RENDEROPTIONS_GLTRIANGLE, OnOptionsVideoRenderoptionsGltriangle)
  177.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_VIDEO_RENDEROPTIONS_GLTRIANGLE, OnUpdateOptionsVideoRenderoptionsGltriangle)
  178.   ON_COMMAND(ID_OPTIONS_VIDEO_RENDEROPTIONS_GLQUADS, OnOptionsVideoRenderoptionsGlquads)
  179.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_VIDEO_RENDEROPTIONS_GLQUADS, OnUpdateOptionsVideoRenderoptionsGlquads)
  180.   ON_COMMAND(ID_OPTIONS_VIDEO_RENDEROPTIONS_SELECTSKIN, OnOptionsVideoRenderoptionsSelectskin)
  181.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_VIDEO_RENDEROPTIONS_SELECTSKIN, OnUpdateOptionsVideoRenderoptionsSelectskin)
  182.   ON_COMMAND(ID_OPTIONS_VIDEO_RENDEROPTIONS_SKIN, OnOptionsVideoRenderoptionsSkin)
  183.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_VIDEO_RENDEROPTIONS_SKIN, OnUpdateOptionsVideoRenderoptionsSkin)
  184.   ON_WM_CONTEXTMENU()
  185.   ON_COMMAND(ID_OPTIONS_EMULATOR_ASSOCIATE, OnOptionsEmulatorAssociate)
  186.   ON_COMMAND(ID_OPTIONS_EMULATOR_DIRECTORIES, OnOptionsEmulatorDirectories)
  187.   ON_COMMAND(ID_OPTIONS_EMULATOR_DISABLESTATUSMESSAGES, OnOptionsEmulatorDisablestatusmessages)
  188.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_EMULATOR_DISABLESTATUSMESSAGES, OnUpdateOptionsEmulatorDisablestatusmessages)
  189.   ON_COMMAND(ID_OPTIONS_EMULATOR_SYNCHRONIZE, OnOptionsEmulatorSynchronize)
  190.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_EMULATOR_SYNCHRONIZE, OnUpdateOptionsEmulatorSynchronize)
  191.   ON_COMMAND(ID_OPTIONS_EMULATOR_PAUSEWHENINACTIVE, OnOptionsEmulatorPausewheninactive)
  192.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_EMULATOR_PAUSEWHENINACTIVE, OnUpdateOptionsEmulatorPausewheninactive)
  193.   ON_COMMAND(ID_OPTIONS_EMULATOR_SPEEDUPTOGGLE, OnOptionsEmulatorSpeeduptoggle)
  194.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_EMULATOR_SPEEDUPTOGGLE, OnUpdateOptionsEmulatorSpeeduptoggle)
  195.   ON_COMMAND(ID_OPTIONS_EMULATOR_REMOVEINTROSGBA, OnOptionsEmulatorRemoveintrosgba)
  196.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_EMULATOR_REMOVEINTROSGBA, OnUpdateOptionsEmulatorRemoveintrosgba)
  197.   ON_COMMAND(ID_OPTIONS_EMULATOR_AUTOMATICALLYIPSPATCH, OnOptionsEmulatorAutomaticallyipspatch)
  198.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_EMULATOR_AUTOMATICALLYIPSPATCH, OnUpdateOptionsEmulatorAutomaticallyipspatch)
  199.   ON_COMMAND(ID_OPTIONS_EMULATOR_AGBPRINT, OnOptionsEmulatorAgbprint)
  200.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_EMULATOR_AGBPRINT, OnUpdateOptionsEmulatorAgbprint)
  201.   ON_COMMAND(ID_OPTIONS_EMULATOR_REALTIMECLOCK, OnOptionsEmulatorRealtimeclock)
  202.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_EMULATOR_REALTIMECLOCK, OnUpdateOptionsEmulatorRealtimeclock)
  203.   ON_COMMAND(ID_OPTIONS_EMULATOR_AUTOHIDEMENU, OnOptionsEmulatorAutohidemenu)
  204.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_EMULATOR_AUTOHIDEMENU, OnUpdateOptionsEmulatorAutohidemenu)
  205.   ON_COMMAND(ID_OPTIONS_EMULATOR_REWINDINTERVAL, OnOptionsEmulatorRewindinterval)
  206.   ON_COMMAND(ID_OPTIONS_EMULATOR_SAVETYPE_AUTOMATIC, OnOptionsEmulatorSavetypeAutomatic)
  207.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_EMULATOR_SAVETYPE_AUTOMATIC, OnUpdateOptionsEmulatorSavetypeAutomatic)
  208.   ON_COMMAND(ID_OPTIONS_EMULATOR_SAVETYPE_EEPROM, OnOptionsEmulatorSavetypeEeprom)
  209.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_EMULATOR_SAVETYPE_EEPROM, OnUpdateOptionsEmulatorSavetypeEeprom)
  210.   ON_COMMAND(ID_OPTIONS_EMULATOR_SAVETYPE_SRAM, OnOptionsEmulatorSavetypeSram)
  211.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_EMULATOR_SAVETYPE_SRAM, OnUpdateOptionsEmulatorSavetypeSram)
  212.   ON_COMMAND(ID_OPTIONS_EMULATOR_SAVETYPE_FLASH, OnOptionsEmulatorSavetypeFlash)
  213.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_EMULATOR_SAVETYPE_FLASH, OnUpdateOptionsEmulatorSavetypeFlash)
  214.   ON_COMMAND(ID_OPTIONS_EMULATOR_SAVETYPE_EEPROMSENSOR, OnOptionsEmulatorSavetypeEepromsensor)
  215.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_EMULATOR_SAVETYPE_EEPROMSENSOR, OnUpdateOptionsEmulatorSavetypeEepromsensor)
  216.   ON_COMMAND(ID_OPTIONS_EMULATOR_SAVETYPE_NONE, OnOptionsEmulatorSavetypeNone)
  217.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_EMULATOR_SAVETYPE_NONE, OnUpdateOptionsEmulatorSavetypeNone)
  218.   ON_COMMAND(ID_OPTIONS_EMULATOR_SAVETYPE_FLASH512K, OnOptionsEmulatorSavetypeFlash512k)
  219.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_EMULATOR_SAVETYPE_FLASH512K, OnUpdateOptionsEmulatorSavetypeFlash512k)
  220.   ON_COMMAND(ID_OPTIONS_EMULATOR_SAVETYPE_FLASH1M, OnOptionsEmulatorSavetypeFlash1m)
  221.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_EMULATOR_SAVETYPE_FLASH1M, OnUpdateOptionsEmulatorSavetypeFlash1m)
  222.   ON_COMMAND(ID_OPTIONS_EMULATOR_USEBIOSFILE, OnOptionsEmulatorUsebiosfile)
  223.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_EMULATOR_USEBIOSFILE, OnUpdateOptionsEmulatorUsebiosfile)
  224.   ON_COMMAND(ID_OPTIONS_EMULATOR_SKIPBIOS, OnOptionsEmulatorSkipbios)
  225.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_EMULATOR_SKIPBIOS, OnUpdateOptionsEmulatorSkipbios)
  226.   ON_COMMAND(ID_OPTIONS_EMULATOR_SELECTBIOSFILE, OnOptionsEmulatorSelectbiosfile)
  227.   ON_COMMAND(ID_OPTIONS_EMULATOR_PNGFORMAT, OnOptionsEmulatorPngformat)
  228.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_EMULATOR_PNGFORMAT, OnUpdateOptionsEmulatorPngformat)
  229.   ON_COMMAND(ID_OPTIONS_EMULATOR_BMPFORMAT, OnOptionsEmulatorBmpformat)
  230.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_EMULATOR_BMPFORMAT, OnUpdateOptionsEmulatorBmpformat)
  231.   ON_COMMAND(ID_OPTIONS_SOUND_OFF, OnOptionsSoundOff)
  232.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_SOUND_OFF, OnUpdateOptionsSoundOff)
  233.   ON_COMMAND(ID_OPTIONS_SOUND_MUTE, OnOptionsSoundMute)
  234.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_SOUND_MUTE, OnUpdateOptionsSoundMute)
  235.   ON_COMMAND(ID_OPTIONS_SOUND_ON, OnOptionsSoundOn)
  236.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_SOUND_ON, OnUpdateOptionsSoundOn)
  237.   ON_COMMAND(ID_OPTIONS_SOUND_USEOLDSYNCHRONIZATION, OnOptionsSoundUseoldsynchronization)
  238.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_SOUND_USEOLDSYNCHRONIZATION, OnUpdateOptionsSoundUseoldsynchronization)
  239.   ON_COMMAND(ID_OPTIONS_SOUND_ECHO, OnOptionsSoundEcho)
  240.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_SOUND_ECHO, OnUpdateOptionsSoundEcho)
  241.   ON_COMMAND(ID_OPTIONS_SOUND_LOWPASSFILTER, OnOptionsSoundLowpassfilter)
  242.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_SOUND_LOWPASSFILTER, OnUpdateOptionsSoundLowpassfilter)
  243.   ON_COMMAND(ID_OPTIONS_SOUND_REVERSESTEREO, OnOptionsSoundReversestereo)
  244.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_SOUND_REVERSESTEREO, OnUpdateOptionsSoundReversestereo)
  245.   ON_COMMAND(ID_OPTIONS_SOUND_11KHZ, OnOptionsSound11khz)
  246.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_SOUND_11KHZ, OnUpdateOptionsSound11khz)
  247.   ON_COMMAND(ID_OPTIONS_SOUND_22KHZ, OnOptionsSound22khz)
  248.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_SOUND_22KHZ, OnUpdateOptionsSound22khz)
  249.   ON_COMMAND(ID_OPTIONS_SOUND_44KHZ, OnOptionsSound44khz)
  250.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_SOUND_44KHZ, OnUpdateOptionsSound44khz)
  251.   ON_COMMAND(ID_OPTIONS_SOUND_CHANNEL1, OnOptionsSoundChannel1)
  252.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_SOUND_CHANNEL1, OnUpdateOptionsSoundChannel1)
  253.   ON_COMMAND(ID_OPTIONS_SOUND_CHANNEL2, OnOptionsSoundChannel2)
  254.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_SOUND_CHANNEL2, OnUpdateOptionsSoundChannel2)
  255.   ON_COMMAND(ID_OPTIONS_SOUND_CHANNEL3, OnOptionsSoundChannel3)
  256.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_SOUND_CHANNEL3, OnUpdateOptionsSoundChannel3)
  257.   ON_COMMAND(ID_OPTIONS_SOUND_CHANNEL4, OnOptionsSoundChannel4)
  258.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_SOUND_CHANNEL4, OnUpdateOptionsSoundChannel4)
  259.   ON_COMMAND(ID_OPTIONS_SOUND_DIRECTSOUNDA, OnOptionsSoundDirectsounda)
  260.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_SOUND_DIRECTSOUNDA, OnUpdateOptionsSoundDirectsounda)
  261.   ON_COMMAND(ID_OPTIONS_SOUND_DIRECTSOUNDB, OnOptionsSoundDirectsoundb)
  262.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_SOUND_DIRECTSOUNDB, OnUpdateOptionsSoundDirectsoundb)
  263.   ON_COMMAND(ID_OPTIONS_GAMEBOY_BORDER, OnOptionsGameboyBorder)
  264.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_GAMEBOY_BORDER, OnUpdateOptionsGameboyBorder)
  265.   ON_COMMAND(ID_OPTIONS_GAMEBOY_PRINTER, OnOptionsGameboyPrinter)
  266.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_GAMEBOY_PRINTER, OnUpdateOptionsGameboyPrinter)
  267.   ON_COMMAND(ID_OPTIONS_GAMEBOY_BORDERAUTOMATIC, OnOptionsGameboyBorderAutomatic)
  268.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_GAMEBOY_BORDERAUTOMATIC, OnUpdateOptionsGameboyBorderAutomatic)
  269.   ON_COMMAND(ID_OPTIONS_GAMEBOY_AUTOMATIC, OnOptionsGameboyAutomatic)
  270.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_GAMEBOY_AUTOMATIC, OnUpdateOptionsGameboyAutomatic)
  271.   ON_COMMAND(ID_OPTIONS_GAMEBOY_GBA, OnOptionsGameboyGba)
  272.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_GAMEBOY_GBA, OnUpdateOptionsGameboyGba)
  273.   ON_COMMAND(ID_OPTIONS_GAMEBOY_CGB, OnOptionsGameboyCgb)
  274.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_GAMEBOY_CGB, OnUpdateOptionsGameboyCgb)
  275.   ON_COMMAND(ID_OPTIONS_GAMEBOY_SGB, OnOptionsGameboySgb)
  276.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_GAMEBOY_SGB, OnUpdateOptionsGameboySgb)
  277.   ON_COMMAND(ID_OPTIONS_GAMEBOY_SGB2, OnOptionsGameboySgb2)
  278.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_GAMEBOY_SGB2, OnUpdateOptionsGameboySgb2)
  279.   ON_COMMAND(ID_OPTIONS_GAMEBOY_GB, OnOptionsGameboyGb)
  280.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_GAMEBOY_GB, OnUpdateOptionsGameboyGb)
  281.   ON_COMMAND(ID_OPTIONS_GAMEBOY_REALCOLORS, OnOptionsGameboyRealcolors)
  282.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_GAMEBOY_REALCOLORS, OnUpdateOptionsGameboyRealcolors)
  283.   ON_COMMAND(ID_OPTIONS_GAMEBOY_GAMEBOYCOLORS, OnOptionsGameboyGameboycolors)
  284.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_GAMEBOY_GAMEBOYCOLORS, OnUpdateOptionsGameboyGameboycolors)
  285.   ON_COMMAND(ID_OPTIONS_GAMEBOY_COLORS, OnOptionsGameboyColors)
  286.   ON_COMMAND(ID_OPTIONS_FILTER_DISABLEMMX, OnOptionsFilterDisablemmx)
  287.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_FILTER_DISABLEMMX, OnUpdateOptionsFilterDisablemmx)
  288.   ON_COMMAND(ID_OPTIONS_LANGUAGE_SYSTEM, OnOptionsLanguageSystem)
  289.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_LANGUAGE_SYSTEM, OnUpdateOptionsLanguageSystem)
  290.   ON_COMMAND(ID_OPTIONS_LANGUAGE_ENGLISH, OnOptionsLanguageEnglish)
  291.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_LANGUAGE_ENGLISH, OnUpdateOptionsLanguageEnglish)
  292.   ON_COMMAND(ID_OPTIONS_LANGUAGE_OTHER, OnOptionsLanguageOther)
  293.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_LANGUAGE_OTHER, OnUpdateOptionsLanguageOther)
  294.   ON_COMMAND(ID_OPTIONS_JOYPAD_CONFIGURE_1, OnOptionsJoypadConfigure1)
  295.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_JOYPAD_CONFIGURE_1, OnUpdateOptionsJoypadConfigure1)
  296.   ON_COMMAND(ID_OPTIONS_JOYPAD_CONFIGURE_2, OnOptionsJoypadConfigure2)
  297.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_JOYPAD_CONFIGURE_2, OnUpdateOptionsJoypadConfigure2)
  298.   ON_COMMAND(ID_OPTIONS_JOYPAD_CONFIGURE_3, OnOptionsJoypadConfigure3)
  299.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_JOYPAD_CONFIGURE_3, OnUpdateOptionsJoypadConfigure3)
  300.   ON_COMMAND(ID_OPTIONS_JOYPAD_CONFIGURE_4, OnOptionsJoypadConfigure4)
  301.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_JOYPAD_CONFIGURE_4, OnUpdateOptionsJoypadConfigure4)
  302.   ON_COMMAND(ID_OPTIONS_JOYPAD_MOTIONCONFIGURE, OnOptionsJoypadMotionconfigure)
  303.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_JOYPAD_MOTIONCONFIGURE, OnUpdateOptionsJoypadMotionconfigure)
  304.   ON_COMMAND(ID_CHEATS_SEARCHFORCHEATS, OnCheatsSearchforcheats)
  305.   ON_UPDATE_COMMAND_UI(ID_CHEATS_SEARCHFORCHEATS, OnUpdateCheatsSearchforcheats)
  306.   ON_COMMAND(ID_CHEATS_CHEATLIST, OnCheatsCheatlist)
  307.   ON_UPDATE_COMMAND_UI(ID_CHEATS_CHEATLIST, OnUpdateCheatsCheatlist)
  308.   ON_COMMAND(ID_CHEATS_AUTOMATICSAVELOADCHEATS, OnCheatsAutomaticsaveloadcheats)
  309.   ON_COMMAND(ID_CHEATS_LOADCHEATLIST, OnCheatsLoadcheatlist)
  310.   ON_UPDATE_COMMAND_UI(ID_CHEATS_LOADCHEATLIST, OnUpdateCheatsLoadcheatlist)
  311.   ON_COMMAND(ID_CHEATS_SAVECHEATLIST, OnCheatsSavecheatlist)
  312.   ON_UPDATE_COMMAND_UI(ID_CHEATS_SAVECHEATLIST, OnUpdateCheatsSavecheatlist)
  313.   ON_COMMAND(ID_TOOLS_DISASSEMBLE, OnToolsDisassemble)
  314.   ON_UPDATE_COMMAND_UI(ID_TOOLS_DISASSEMBLE, OnUpdateToolsDisassemble)
  315.   ON_COMMAND(ID_TOOLS_LOGGING, OnToolsLogging)
  316.   ON_UPDATE_COMMAND_UI(ID_TOOLS_LOGGING, OnUpdateToolsLogging)
  317.   ON_COMMAND(ID_TOOLS_IOVIEWER, OnToolsIoviewer)
  318.   ON_UPDATE_COMMAND_UI(ID_TOOLS_IOVIEWER, OnUpdateToolsIoviewer)
  319.   ON_COMMAND(ID_TOOLS_MAPVIEW, OnToolsMapview)
  320.   ON_UPDATE_COMMAND_UI(ID_TOOLS_MAPVIEW, OnUpdateToolsMapview)
  321.   ON_COMMAND(ID_TOOLS_MEMORYVIEWER, OnToolsMemoryviewer)
  322.   ON_UPDATE_COMMAND_UI(ID_TOOLS_MEMORYVIEWER, OnUpdateToolsMemoryviewer)
  323.   ON_COMMAND(ID_TOOLS_OAMVIEWER, OnToolsOamviewer)
  324.   ON_UPDATE_COMMAND_UI(ID_TOOLS_OAMVIEWER, OnUpdateToolsOamviewer)
  325.   ON_COMMAND(ID_TOOLS_PALETTEVIEW, OnToolsPaletteview)
  326.   ON_UPDATE_COMMAND_UI(ID_TOOLS_PALETTEVIEW, OnUpdateToolsPaletteview)
  327.   ON_COMMAND(ID_TOOLS_TILEVIEWER, OnToolsTileviewer)
  328.   ON_UPDATE_COMMAND_UI(ID_TOOLS_TILEVIEWER, OnUpdateToolsTileviewer)
  329.   ON_COMMAND(ID_DEBUG_NEXTFRAME, OnDebugNextframe)
  330.   ON_UPDATE_COMMAND_UI(ID_CHEATS_AUTOMATICSAVELOADCHEATS, OnUpdateCheatsAutomaticsaveloadcheats)
  331.   ON_COMMAND(ID_TOOLS_DEBUG_GDB, OnToolsDebugGdb)
  332.   ON_UPDATE_COMMAND_UI(ID_TOOLS_DEBUG_GDB, OnUpdateToolsDebugGdb)
  333.   ON_COMMAND(ID_TOOLS_DEBUG_LOADANDWAIT, OnToolsDebugLoadandwait)
  334.   ON_UPDATE_COMMAND_UI(ID_TOOLS_DEBUG_LOADANDWAIT, OnUpdateToolsDebugLoadandwait)
  335.   ON_COMMAND(ID_TOOLS_DEBUG_BREAK, OnToolsDebugBreak)
  336.   ON_UPDATE_COMMAND_UI(ID_TOOLS_DEBUG_BREAK, OnUpdateToolsDebugBreak)
  337.   ON_COMMAND(ID_TOOLS_DEBUG_DISCONNECT, OnToolsDebugDisconnect)
  338.   ON_UPDATE_COMMAND_UI(ID_TOOLS_DEBUG_DISCONNECT, OnUpdateToolsDebugDisconnect)
  339.   ON_COMMAND(ID_OPTIONS_SOUND_STARTRECORDING, OnOptionsSoundStartrecording)
  340.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_SOUND_STARTRECORDING, OnUpdateOptionsSoundStartrecording)
  341.   ON_COMMAND(ID_OPTIONS_SOUND_STOPRECORDING, OnOptionsSoundStoprecording)
  342.   ON_UPDATE_COMMAND_UI(ID_OPTIONS_SOUND_STOPRECORDING, OnUpdateOptionsSoundStoprecording)
  343.   ON_COMMAND(ID_TOOLS_RECORD_STARTAVIRECORDING, OnToolsRecordStartavirecording)
  344.   ON_UPDATE_COMMAND_UI(ID_TOOLS_RECORD_STARTAVIRECORDING, OnUpdateToolsRecordStartavirecording)
  345.   ON_COMMAND(ID_TOOLS_RECORD_STOPAVIRECORDING, OnToolsRecordStopavirecording)
  346.   ON_UPDATE_COMMAND_UI(ID_TOOLS_RECORD_STOPAVIRECORDING, OnUpdateToolsRecordStopavirecording)
  347.   ON_WM_PAINT()
  348.   ON_COMMAND(ID_TOOLS_RECORD_STARTMOVIERECORDING, OnToolsRecordStartmovierecording)
  349.   ON_UPDATE_COMMAND_UI(ID_TOOLS_RECORD_STARTMOVIERECORDING, OnUpdateToolsRecordStartmovierecording)
  350.   ON_COMMAND(ID_TOOLS_RECORD_STOPMOVIERECORDING, OnToolsRecordStopmovierecording)
  351.   ON_UPDATE_COMMAND_UI(ID_TOOLS_RECORD_STOPMOVIERECORDING, OnUpdateToolsRecordStopmovierecording)
  352.   ON_COMMAND(ID_TOOLS_PLAY_STARTMOVIEPLAYING, OnToolsPlayStartmovieplaying)
  353.   ON_UPDATE_COMMAND_UI(ID_TOOLS_PLAY_STARTMOVIEPLAYING, OnUpdateToolsPlayStartmovieplaying)
  354.   ON_COMMAND(ID_TOOLS_PLAY_STOPMOVIEPLAYING, OnToolsPlayStopmovieplaying)
  355.   ON_UPDATE_COMMAND_UI(ID_TOOLS_PLAY_STOPMOVIEPLAYING, OnUpdateToolsPlayStopmovieplaying)
  356.   ON_COMMAND(ID_TOOLS_REWIND, OnToolsRewind)
  357.   ON_UPDATE_COMMAND_UI(ID_TOOLS_REWIND, OnUpdateToolsRewind)
  358.   ON_COMMAND(ID_TOOLS_CUSTOMIZE, OnToolsCustomize)
  359.   ON_UPDATE_COMMAND_UI(ID_TOOLS_CUSTOMIZE, OnUpdateToolsCustomize)
  360.   ON_COMMAND(ID_HELP_BUGREPORT, OnHelpBugreport)
  361.   ON_WM_MOUSEMOVE()
  362.   ON_WM_INITMENU()
  363.   ON_WM_ACTIVATE()
  364.   ON_WM_ACTIVATEAPP()
  365.   ON_WM_DROPFILES()
  366.   ON_COMMAND(ID_FILE_SAVEGAME_OLDESTSLOT, OnFileSavegameOldestslot)
  367.   ON_UPDATE_COMMAND_UI(ID_FILE_SAVEGAME_OLDESTSLOT, OnUpdateFileSavegameOldestslot)
  368.   ON_COMMAND(ID_FILE_LOADGAME_MOSTRECENT, OnFileLoadgameMostrecent)
  369.   ON_UPDATE_COMMAND_UI(ID_FILE_LOADGAME_MOSTRECENT, OnUpdateFileLoadgameMostrecent)
  370.     ON_COMMAND(ID_FILE_LOADGAME_AUTOLOADMOSTRECENT, OnFileLoadgameAutoloadmostrecent)
  371.     ON_UPDATE_COMMAND_UI(ID_FILE_LOADGAME_AUTOLOADMOSTRECENT, OnUpdateFileLoadgameAutoloadmostrecent)
  372.     ON_COMMAND(ID_OPTIONS_SOUND_VOLUME_25X, OnOptionsSoundVolume25x)
  373.     ON_UPDATE_COMMAND_UI(ID_OPTIONS_SOUND_VOLUME_25X, OnUpdateOptionsSoundVolume25x)
  374.     ON_COMMAND(ID_OPTIONS_SOUND_VOLUME_5X, OnOptionsSoundVolume5x)
  375.     ON_UPDATE_COMMAND_UI(ID_OPTIONS_SOUND_VOLUME_5X, OnUpdateOptionsSoundVolume5x)
  376.     ON_COMMAND(ID_CHEATS_DISABLECHEATS, OnCheatsDisablecheats)
  377.     ON_UPDATE_COMMAND_UI(ID_CHEATS_DISABLECHEATS, OnUpdateCheatsDisablecheats)
  378.     ON_COMMAND(ID_OPTIONS_VIDEO_FULLSCREENMAXSCALE, OnOptionsVideoFullscreenmaxscale)
  379.     //}}AFX_MSG_MAP
  380.   ON_COMMAND_EX_RANGE(ID_FILE_MRU_FILE1, ID_FILE_MRU_FILE10, OnFileRecentFile)
  381.   ON_COMMAND_EX_RANGE(ID_FILE_LOADGAME_SLOT1, ID_FILE_LOADGAME_SLOT10, OnFileLoadSlot)
  382.   ON_COMMAND_EX_RANGE(ID_FILE_SAVEGAME_SLOT1, ID_FILE_SAVEGAME_SLOT10, OnFileSaveSlot)
  383.   ON_UPDATE_COMMAND_UI_RANGE(ID_FILE_LOADGAME_SLOT1, ID_FILE_LOADGAME_SLOT10, OnUpdateFileLoadGameSlot)
  384.   ON_UPDATE_COMMAND_UI_RANGE(ID_FILE_SAVEGAME_SLOT1, ID_FILE_SAVEGAME_SLOT10, OnUpdateFileSaveGameSlot)
  385.   ON_COMMAND_EX_RANGE(ID_OPTIONS_VIDEO_FRAMESKIP_0, ID_OPTIONS_VIDEO_FRAMESKIP_5, OnOptionsFrameskip)
  386.   ON_COMMAND_EX_RANGE(ID_OPTIONS_VIDEO_FRAMESKIP_6, ID_OPTIONS_VIDEO_FRAMESKIP_9, OnOptionsFrameskip)
  387.   ON_COMMAND_EX_RANGE(ID_OPTIONS_VIDEO_X1, ID_OPTIONS_VIDEO_X4, OnOptionVideoSize)
  388.   ON_COMMAND_EX_RANGE(ID_OPTIONS_VIDEO_LAYERS_BG0, ID_OPTIONS_VIDEO_LAYERS_OBJWIN, OnVideoLayer)
  389.   ON_UPDATE_COMMAND_UI_RANGE(ID_OPTIONS_VIDEO_LAYERS_BG0, ID_OPTIONS_VIDEO_LAYERS_OBJWIN, OnUpdateVideoLayer)
  390.   ON_COMMAND(ID_SYSTEM_MINIMIZE, OnSystemMinimize)
  391.   ON_COMMAND_EX_RANGE(ID_OPTIONS_EMULATOR_SHOWSPEED_NONE, ID_OPTIONS_EMULATOR_SHOWSPEED_TRANSPARENT, OnOptionsEmulatorShowSpeed)
  392.   ON_UPDATE_COMMAND_UI_RANGE(ID_OPTIONS_EMULATOR_SHOWSPEED_NONE, ID_OPTIONS_EMULATOR_SHOWSPEED_TRANSPARENT, OnUpdateOptionsEmulatorShowSpeed)
  393.   ON_COMMAND_EX_RANGE(ID_OPTIONS_SOUND_VOLUME_1X, ID_OPTIONS_SOUND_VOLUME_4X, OnOptionsSoundVolume)
  394.   ON_UPDATE_COMMAND_UI_RANGE(ID_OPTIONS_SOUND_VOLUME_1X, ID_OPTIONS_SOUND_VOLUME_4X, OnUpdateOptionsSoundVolume)
  395.   ON_COMMAND_EX_RANGE(ID_OPTIONS_PRIORITY_HIGHEST, ID_OPTIONS_PRIORITY_BELOWNORMAL, OnOptionsPriority)
  396.   ON_UPDATE_COMMAND_UI_RANGE(ID_OPTIONS_PRIORITY_HIGHEST, ID_OPTIONS_PRIORITY_BELOWNORMAL, OnUpdateOptionsPriority)
  397.   ON_COMMAND_EX_RANGE(ID_OPTIONS_FILTER_NORMAL, ID_OPTIONS_FILTER_TVMODE, OnOptionsFilter)
  398.   ON_COMMAND_EX_RANGE(ID_OPTIONS_FILTER16BIT_PIXELATEEXPERIMENTAL, ID_OPTIONS_FILTER16BIT_MOTIONBLUREXPERIMENTAL, OnOptionsFilter)
  399.   ON_COMMAND_EX_RANGE(ID_OPTIONS_FILTER16BIT_ADVANCEMAMESCALE2X, ID_OPTIONS_FILTER16BIT_SIMPLE2X, OnOptionsFilter)
  400.   ON_COMMAND_EX_RANGE(ID_OPTIONS_FILTER_BILINEAR, ID_OPTIONS_FILTER_BILINEARPLUS, OnOptionsFilter)
  401.   ON_COMMAND_EX_RANGE(ID_OPTIONS_FILTER_SCANLINES, ID_OPTIONS_FILTER_SCANLINES, OnOptionsFilter)
  402.   ON_COMMAND_EX_RANGE(ID_OPTIONS_FILTER_HQ2X, ID_OPTIONS_FILTER_LQ2X, OnOptionsFilter)
  403.   ON_UPDATE_COMMAND_UI_RANGE(ID_OPTIONS_FILTER_NORMAL, ID_OPTIONS_FILTER_TVMODE, OnUpdateOptionsFilter)
  404.   ON_UPDATE_COMMAND_UI_RANGE(ID_OPTIONS_FILTER16BIT_PIXELATEEXPERIMENTAL, ID_OPTIONS_FILTER16BIT_MOTIONBLUREXPERIMENTAL, OnUpdateOptionsFilter)
  405.   ON_UPDATE_COMMAND_UI_RANGE(ID_OPTIONS_FILTER16BIT_ADVANCEMAMESCALE2X, ID_OPTIONS_FILTER16BIT_SIMPLE2X, OnUpdateOptionsFilter)
  406.   ON_UPDATE_COMMAND_UI_RANGE(ID_OPTIONS_FILTER_BILINEAR, ID_OPTIONS_FILTER_BILINEARPLUS, OnUpdateOptionsFilter)
  407.   ON_UPDATE_COMMAND_UI_RANGE(ID_OPTIONS_FILTER_SCANLINES, ID_OPTIONS_FILTER_SCANLINES, OnUpdateOptionsFilter)
  408.   ON_UPDATE_COMMAND_UI_RANGE(ID_OPTIONS_FILTER_HQ2X, ID_OPTIONS_FILTER_LQ2X, OnUpdateOptionsFilter)
  409.   ON_COMMAND_EX_RANGE(ID_OPTIONS_FILTER_INTERFRAMEBLENDING_NONE, ID_OPTIONS_FILTER_INTERFRAMEBLENDING_SMART, OnOptionsFilterIFB)
  410.   ON_UPDATE_COMMAND_UI_RANGE(ID_OPTIONS_FILTER_INTERFRAMEBLENDING_NONE, ID_OPTIONS_FILTER_INTERFRAMEBLENDING_SMART, OnUpdateOptionsFilterIFB)
  411.   ON_COMMAND_EX_RANGE(ID_OPTIONS_JOYPAD_DEFAULTJOYPAD_1, ID_OPTIONS_JOYPAD_DEFAULTJOYPAD_4, OnOptionsJoypadDefault)
  412.   ON_UPDATE_COMMAND_UI_RANGE(ID_OPTIONS_JOYPAD_DEFAULTJOYPAD_1, ID_OPTIONS_JOYPAD_DEFAULTJOYPAD_4, OnUpdateOptionsJoypadDefault)
  413.   ON_COMMAND_EX_RANGE(ID_OPTIONS_JOYPAD_AUTOFIRE_A, ID_OPTIONS_JOYPAD_AUTOFIRE_R, OnOptionsJoypadAutofire)
  414.   ON_UPDATE_COMMAND_UI_RANGE(ID_OPTIONS_JOYPAD_AUTOFIRE_A, ID_OPTIONS_JOYPAD_AUTOFIRE_R, OnUpdateOptionsJoypadAutofire)
  415.   ON_MESSAGE(VBA_CONFIRM_MODE, OnConfirmMode)
  416.   ON_MESSAGE(WM_SYSCOMMAND, OnMySysCommand)
  417.   END_MESSAGE_MAP()
  418.  
  419.  
  420.   /////////////////////////////////////////////////////////////////////////////
  421. // MainWnd message handlers
  422.  
  423. void MainWnd::OnClose() 
  424. {
  425.   CWnd::OnClose();
  426.  
  427.   delete this;
  428. }
  429.  
  430. bool MainWnd::FileRun()
  431. {
  432.   // save battery file before we change the filename...
  433.   if(rom != NULL || gbRom != NULL) {
  434.     if(theApp.autoSaveLoadCheatList)
  435.       winSaveCheatListDefault();
  436.     writeBatteryFile();
  437.     cheatSearchCleanup(&cheatSearchData);
  438.     theApp.emulator.emuCleanUp();
  439.     remoteCleanUp(); 
  440.     emulating = false;   
  441.   }
  442.   char tempName[2048];
  443.   char file[2048];
  444.   
  445.   utilGetBaseName(theApp.szFile, tempName);
  446.   
  447.   _fullpath(file, tempName, 1024);
  448.   theApp.filename = file;
  449.  
  450.   int index = theApp.filename.ReverseFind('.');
  451.   if(index != -1)
  452.     theApp.filename = theApp.filename.Left(index);
  453.  
  454.   CString ipsname;
  455.   ipsname.Format("%s.ips", theApp.filename);  
  456.  
  457.   if(!theApp.dir.GetLength()) {
  458.     int index = theApp.filename.ReverseFind('\\');
  459.     if(index != -1) {
  460.       theApp.dir = theApp.filename.Left(index-1);
  461.     }
  462.   }
  463.  
  464.   IMAGE_TYPE type = utilFindType(theApp.szFile);
  465.  
  466.   if(type == IMAGE_UNKNOWN) {
  467.     systemMessage(IDS_UNSUPPORTED_FILE_TYPE,
  468.                   "Unsupported file type: %s", theApp.szFile);
  469.     return false;
  470.   }
  471.   systemSaveUpdateCounter = SYSTEM_SAVE_NOT_UPDATED;
  472.   theApp.cartridgeType = (int)type;
  473.   if(type == IMAGE_GB) {
  474.     if(!gbLoadRom(theApp.szFile))
  475.       return false;
  476.     theApp.emulator = GBSystem;
  477.     gbBorderOn = theApp.winGbBorderOn;
  478.     theApp.romSize = gbRomSize;
  479.     if(theApp.autoIPS) {
  480.       int size = gbRomSize;
  481.       utilApplyIPS(ipsname, &gbRom, &size);
  482.       if(size != gbRomSize) {
  483.         extern bool gbUpdateSizes();
  484.         gbUpdateSizes();
  485.         gbReset();
  486.         theApp.romSize = size;
  487.       }
  488.     }
  489.   } else {
  490.     int size = CPULoadRom(theApp.szFile);
  491.     if(!size)
  492.       return false;
  493.  
  494.     theApp.romSize = size;
  495.     
  496.     flashSetSize(theApp.winFlashSize);
  497.     rtcEnable(theApp.winRtcEnable);
  498.     cpuSaveType = theApp.winSaveType;
  499.  
  500.     //    if(cpuEnhancedDetection && winSaveType == 0) {
  501.     //      utilGBAFindSave(rom, size);
  502.     //    }
  503.     GetModuleFileName(NULL, tempName, 2048);
  504.  
  505.     char *p = strrchr(tempName, '\\');
  506.     if(p)
  507.       *p = 0;
  508.     
  509.     char buffer[5];
  510.     strncpy(buffer, (const char *)&rom[0xac], 4);
  511.     buffer[4] = 0;
  512.  
  513.     strcat(tempName, "\\vba-over.ini");
  514.     
  515.     UINT i = GetPrivateProfileInt(buffer,
  516.                                   "rtcEnabled",
  517.                                   -1,
  518.                                   tempName);
  519.     if(i != (UINT)-1)
  520.       rtcEnable(i == 0 ? false : true);
  521.  
  522.     i = GetPrivateProfileInt(buffer,
  523.                              "flashSize",
  524.                              -1,
  525.                              tempName);
  526.     if(i != (UINT)-1 && (i == 0x10000 || i == 0x20000))
  527.       flashSetSize((int)i);
  528.  
  529.     i = GetPrivateProfileInt(buffer,
  530.                              "saveType",
  531.                              -1,
  532.                              tempName);
  533.     if(i != (UINT)-1 && (i <= 5))
  534.       cpuSaveType = (int)i;
  535.     
  536.     theApp.emulator = GBASystem;
  537.     /* disabled due to problems
  538.     if(theApp.removeIntros && rom != NULL) {
  539.       *((u32 *)rom)= 0xea00002e;
  540.     }
  541.     */
  542.     
  543.     if(theApp.autoIPS) {
  544.       int size = 0x2000000;
  545.       utilApplyIPS(ipsname, &rom, &size);
  546.       if(size != 0x2000000) {
  547.         CPUReset();
  548.       }
  549.     }
  550.   }
  551.     
  552.   if(theApp.soundInitialized) {
  553.     if(theApp.cartridgeType == 1)
  554.       gbSoundReset();
  555.     else
  556.       soundReset();
  557.   } else {
  558.     if(!soundOffFlag)
  559.       soundInit();
  560.     theApp.soundInitialized = true;
  561.   }
  562.  
  563.   if(type == IMAGE_GBA) {
  564.     skipBios = theApp.skipBiosFile ? true : false;
  565.     CPUInit((char *)(LPCTSTR)theApp.biosFileName, theApp.useBiosFile ? true : false);
  566.     CPUReset();
  567.   }
  568.   
  569.   readBatteryFile();
  570.  
  571.   if(theApp.autoSaveLoadCheatList)
  572.     winLoadCheatListDefault();
  573.   
  574.   theApp.addRecentFile(theApp.szFile);
  575.  
  576.   theApp.updateWindowSize(theApp.videoOption);
  577.  
  578.   theApp.updateFrameSkip();
  579.  
  580.   if(theApp.autoHideMenu && theApp.videoOption > VIDEO_4X && theApp.menuToggle)
  581.     OnFileTogglemenu();
  582.  
  583.   emulating = true;
  584.  
  585.   if(theApp.autoLoadMostRecent)
  586.     OnFileLoadgameMostrecent();
  587.  
  588.   theApp.frameskipadjust = 0;
  589.   theApp.renderedFrames = 0;
  590.   theApp.autoFrameSkipLastTime = theApp.throttleLastTime = systemGetClock();
  591.  
  592.   theApp.rewindCount = 0;
  593.   theApp.rewindCounter = 0;
  594.   theApp.rewindSaveNeeded = false;
  595.   
  596.   return true;
  597. }
  598.  
  599. void MainWnd::OnInitMenuPopup(CMenu* pMenu, UINT nIndex, BOOL bSysMenu) 
  600. {
  601.   ASSERT(pMenu != NULL);
  602.   
  603.   CCmdUI state;
  604.   state.m_pMenu = pMenu;
  605.   ASSERT(state.m_pOther == NULL);
  606.   ASSERT(state.m_pParentMenu == NULL);
  607.   
  608.   // determine if menu is popup in top-level menu and set m_pOther to
  609.   //  it if so (m_pParentMenu == NULL indicates that it is secondary popup)
  610.   HMENU hParentMenu;
  611.   if (AfxGetThreadState()->m_hTrackingMenu == pMenu->m_hMenu)
  612.     state.m_pParentMenu = pMenu;    // parent == child for tracking popup
  613.   else if ((hParentMenu = ::GetMenu(m_hWnd)) != NULL) {
  614.     CWnd* pParent = GetTopLevelParent();
  615.     // child windows don't have menus -- need to go to the top!
  616.     if (pParent != NULL &&
  617.         (hParentMenu = ::GetMenu(pParent->m_hWnd)) != NULL) {
  618.       int nIndexMax = ::GetMenuItemCount(hParentMenu);
  619.       for (int nIndex = 0; nIndex < nIndexMax; nIndex++) {
  620.         if (::GetSubMenu(hParentMenu, nIndex) == pMenu->m_hMenu) {
  621.           // when popup is found, m_pParentMenu is containing menu
  622.           state.m_pParentMenu = CMenu::FromHandle(hParentMenu);
  623.           break;
  624.         }
  625.       }
  626.     }
  627.   }
  628.   
  629.   state.m_nIndexMax = pMenu->GetMenuItemCount();
  630.   for (state.m_nIndex = 0; state.m_nIndex < state.m_nIndexMax;
  631.        state.m_nIndex++) {
  632.     state.m_nID = pMenu->GetMenuItemID(state.m_nIndex);
  633.     if (state.m_nID == 0)
  634.       continue; // menu separator or invalid cmd - ignore it
  635.     
  636.     ASSERT(state.m_pOther == NULL);
  637.     ASSERT(state.m_pMenu != NULL);
  638.     if (state.m_nID == (UINT)-1) {
  639.       // possibly a popup menu, route to first item of that popup
  640.       state.m_pSubMenu = pMenu->GetSubMenu(state.m_nIndex);
  641.       if (state.m_pSubMenu == NULL ||
  642.           (state.m_nID = state.m_pSubMenu->GetMenuItemID(0)) == 0 ||
  643.           state.m_nID == (UINT)-1) {
  644.         continue;       // first item of popup can't be routed to
  645.       }
  646.       state.DoUpdate(this, FALSE);    // popups are never auto disabled
  647.     } else {
  648.       // normal menu item
  649.       // Auto enable/disable if frame window has 'm_bAutoMenuEnable'
  650.       //    set and command is _not_ a system command.
  651.       state.m_pSubMenu = NULL;
  652.       state.DoUpdate(this, state.m_nID < 0xF000);
  653.     }
  654.     
  655.     // adjust for menu deletions and additions
  656.     UINT nCount = pMenu->GetMenuItemCount();
  657.     if (nCount < state.m_nIndexMax) {
  658.       state.m_nIndex -= (state.m_nIndexMax - nCount);
  659.       while (state.m_nIndex < nCount &&
  660.              pMenu->GetMenuItemID(state.m_nIndex) == state.m_nID) {
  661.         state.m_nIndex++;
  662.       }
  663.     }
  664.     state.m_nIndexMax = nCount;
  665.   }
  666. }
  667.  
  668. void MainWnd::OnMove(int x, int y) 
  669. {
  670.   CWnd::OnMove(x, y);
  671.   
  672.   if(!theApp.changingVideoSize) {
  673.     if(this) {
  674.       if(!IsIconic()) {
  675.         RECT r;
  676.             
  677.         GetWindowRect(&r);
  678.         theApp.windowPositionX = r.left;
  679.         theApp.windowPositionY = r.top;
  680.         theApp.adjustDestRect();
  681.         regSetDwordValue("windowX", theApp.windowPositionX);
  682.         regSetDwordValue("windowY", theApp.windowPositionY);
  683.       }
  684.     }
  685.   }
  686. }
  687.  
  688. void MainWnd::OnSize(UINT nType, int cx, int cy) 
  689. {
  690.   CWnd::OnSize(nType, cx, cy);
  691.   
  692.   if(!theApp.changingVideoSize) {
  693.     if(this) {
  694.       if(!IsIconic()) {
  695.         if(theApp.iconic) {
  696.           if(emulating) {
  697.             soundResume();
  698.             theApp.paused = false;
  699.           }
  700.         }
  701.         if(theApp.videoOption <= VIDEO_4X) {
  702.           theApp.surfaceSizeX = cx;
  703.           theApp.surfaceSizeY = cy;
  704.           theApp.adjustDestRect();
  705.           if(theApp.display)
  706.             theApp.display->resize(theApp.dest.right-theApp.dest.left, theApp.dest.bottom-theApp.dest.top);
  707.         }
  708.       } else {
  709.         if(emulating) {
  710.           if(!theApp.paused) {
  711.             theApp.paused = true;
  712.             soundPause();
  713.           }
  714.         }
  715.         theApp.iconic = true;                  
  716.       }
  717.     }
  718.   }
  719. }
  720.  
  721. void MainWnd::winSaveCheatListDefault()
  722. {
  723.   CString name;
  724.   CString filename;
  725.  
  726.   int index = theApp.filename.ReverseFind('\\');
  727.  
  728.   if(index != -1)
  729.     name = theApp.filename.Right(theApp.filename.GetLength()-index-1);
  730.   else
  731.     name = theApp.filename;
  732.   CString dir = regQueryStringValue("saveDir", NULL);
  733.  
  734.   if(!dir.GetLength())
  735.     dir = getDirFromFile(filename);
  736.  
  737.   if(isDriveRoot(dir))
  738.     filename.Format("%s%s.clt", dir, name);
  739.   else
  740.     filename.Format("%s\\%s.clt", dir, name);
  741.  
  742.   winSaveCheatList(filename);
  743. }
  744.  
  745. void MainWnd::winSaveCheatList(const char *name)
  746. {
  747.   if(theApp.cartridgeType == 0)
  748.     cheatsSaveCheatList(name);
  749.   else
  750.     gbCheatsSaveCheatList(name);
  751. }
  752.  
  753. void MainWnd::winLoadCheatListDefault()
  754. {
  755.   CString name;
  756.   CString filename;
  757.  
  758.   int index = theApp.filename.ReverseFind('\\');
  759.  
  760.   if(index != -1)
  761.     name = theApp.filename.Right(theApp.filename.GetLength()-index-1);
  762.   else
  763.     name = theApp.filename;
  764.   CString dir = regQueryStringValue("saveDir", NULL);
  765.  
  766.   if(!dir.GetLength())
  767.     dir = getDirFromFile(filename);
  768.  
  769.   if(isDriveRoot(dir))
  770.     filename.Format("%s%s.clt", dir, name);
  771.   else
  772.     filename.Format("%s\\%s.clt", dir, name);
  773.  
  774.   winLoadCheatList(filename);
  775. }
  776.  
  777. void MainWnd::winLoadCheatList(const char *name)
  778. {
  779.   bool res = false;
  780.  
  781.   if(theApp.cartridgeType == 0)
  782.     res = cheatsLoadCheatList(name);
  783.   else
  784.     res = gbCheatsLoadCheatList(name);
  785.  
  786.   if(res)
  787.     systemScreenMessage(winResLoadString(IDS_LOADED_CHEATS));
  788. }
  789.  
  790. CString MainWnd::getDirFromFile(CString& file)
  791. {
  792.   CString temp = file;
  793.   int index = temp.ReverseFind('\\');
  794.  
  795.   if(index != -1) {
  796.     temp = temp.Left(index);
  797.     if(temp.GetLength() == 2 && temp[1] == ':')
  798.       temp += "\\";
  799.   } else {
  800.     temp = "";
  801.   }
  802.   return temp;
  803. }
  804.  
  805. bool MainWnd::isDriveRoot(CString& file)
  806. {
  807.   if(file.GetLength() == 3) {
  808.     if(file[1] == ':' && file[2] == '\\')
  809.       return true;
  810.   }
  811.   return false;
  812. }
  813.  
  814. void MainWnd::writeBatteryFile()
  815. {
  816.   CString buffer;
  817.   CString filename;
  818.  
  819.   int index = theApp.filename.ReverseFind('\\');
  820.  
  821.   if(index != -1)
  822.     buffer = theApp.filename.Right(theApp.filename.GetLength()-index-1);
  823.   else
  824.     buffer = theApp.filename;
  825.  
  826.   CString saveDir = regQueryStringValue("batteryDir", NULL);
  827.  
  828.   if(saveDir.IsEmpty())
  829.     saveDir = getDirFromFile(theApp.filename);
  830.  
  831.   if(isDriveRoot(saveDir))
  832.     filename.Format("%s%s.sav", saveDir, buffer);
  833.   else
  834.     filename.Format("%s\\%s.sav", saveDir, buffer);
  835.  
  836.   if(theApp.emulator.emuWriteBattery)
  837.     theApp.emulator.emuWriteBattery(filename);
  838. }
  839.  
  840.  
  841. void MainWnd::readBatteryFile()
  842. {
  843.   CString buffer;
  844.   CString filename;
  845.  
  846.   int index = theApp.filename.ReverseFind('\\');
  847.  
  848.   if(index != -1)
  849.     buffer = theApp.filename.Right(theApp.filename.GetLength()-index-1);
  850.   else
  851.     buffer = theApp.filename;
  852.  
  853.   CString saveDir = regQueryStringValue("batteryDir", NULL);
  854.  
  855.   if(saveDir.IsEmpty())
  856.     saveDir = getDirFromFile(theApp.filename);
  857.  
  858.   if(isDriveRoot(saveDir))
  859.     filename.Format("%s%s.sav", saveDir, buffer);
  860.   else
  861.     filename.Format("%s\\%s.sav", saveDir, buffer);
  862.  
  863.   bool res = false;
  864.  
  865.   if(theApp.emulator.emuReadBattery)
  866.     res = theApp.emulator.emuReadBattery(filename);
  867.  
  868.   if(res)
  869.     systemScreenMessage(winResLoadString(IDS_LOADED_BATTERY));
  870. }
  871.  
  872. CString MainWnd::winLoadFilter(UINT id)
  873. {
  874.   CString res = winResLoadString(id);
  875.   res.Replace('_','|');
  876.   
  877.   return res;
  878. }
  879.  
  880. bool MainWnd::loadSaveGame(const char *name)
  881. {
  882.   if(theApp.emulator.emuReadState)
  883.     return theApp.emulator.emuReadState(name);
  884.   return false;
  885. }
  886.  
  887. bool MainWnd::writeSaveGame(const char *name)
  888. {
  889.   if(theApp.emulator.emuWriteState)
  890.     return theApp.emulator.emuWriteState(name);
  891.   return false;
  892. }
  893.  
  894. void MainWnd::OnContextMenu(CWnd* pWnd, CPoint point) 
  895. {
  896.   winMouseOn();
  897.   if(theApp.skin) {
  898.     if(theApp.popup == NULL) {
  899.       theApp.winAccelMgr.UpdateMenu(theApp.menu);
  900.       theApp.popup = CreatePopupMenu();
  901.       if(theApp.menu != NULL) {
  902.         int count = GetMenuItemCount(theApp.menu);
  903.         OSVERSIONINFO info;
  904.         info.dwOSVersionInfoSize = sizeof(info);
  905.         GetVersionEx(&info);
  906.  
  907.         if(info.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) {
  908.           for(int i = 0; i < count; i++) {
  909.             char buffer[256];
  910.             MENUITEMINFO info;
  911.             ZeroMemory(&info, sizeof(info));
  912.             info.cbSize = sizeof(info) - sizeof(HBITMAP);
  913.             info.fMask = MIIM_STRING | MIIM_SUBMENU;
  914.             info.dwTypeData = buffer;
  915.             info.cch = 256;
  916.             if(!GetMenuItemInfo(theApp.menu, i, MF_BYPOSITION, &info)) {
  917.             }
  918.             if(!AppendMenu(theApp.popup, MF_POPUP|MF_STRING, (UINT)info.hSubMenu, buffer)) {
  919.             }
  920.           }
  921.         } else {
  922.           for(int i = 0; i < count; i++) {
  923.             wchar_t buffer[256];
  924.             MENUITEMINFOW info;
  925.             ZeroMemory(&info, sizeof(info));
  926.             info.cbSize = sizeof(info) - sizeof(HBITMAP);
  927.             info.fMask = MIIM_STRING | MIIM_SUBMENU;
  928.             info.dwTypeData = buffer;
  929.             info.cch = 256;
  930.             if(!GetMenuItemInfoW(theApp.menu, i, MF_BYPOSITION, &info)) {
  931.             }
  932.             if(!AppendMenuW(theApp.popup, MF_POPUP|MF_STRING, (UINT)info.hSubMenu, buffer)) {
  933.             }
  934.           }
  935.         }
  936.       }
  937.     }
  938.     int x = point.x;
  939.     int y = point.y;
  940.     if(x == -1 && y == -1) {
  941.       x = (theApp.dest.left + theApp.dest.right) / 2;
  942.       y = (theApp.dest.top + theApp.dest.bottom) / 2;
  943.     }
  944.     if(!TrackPopupMenu(theApp.popup, 0, x, y, 0, m_hWnd, NULL)) {
  945.     }
  946.   }
  947. }
  948.  
  949. void MainWnd::OnSystemMinimize()
  950. {
  951.   ShowWindow(SW_SHOWMINIMIZED);
  952. }
  953.  
  954. bool MainWnd::fileOpenSelect()
  955. {
  956.   theApp.dir = "";
  957.   CString initialDir = regQueryStringValue("romdir",".");
  958.   if(!initialDir.IsEmpty())
  959.     theApp.dir = initialDir;
  960.  
  961.   int selectedFilter = regQueryDwordValue("selectedFilter", 0);
  962.   if(selectedFilter < 0 || selectedFilter > 2)
  963.     selectedFilter = 0;
  964.  
  965.   theApp.szFile = "";
  966.  
  967.   LPCTSTR exts[] = { "" };
  968.   CString filter = winLoadFilter(IDS_FILTER_ROM);
  969.   CString title = winResLoadString(IDS_SELECT_ROM);
  970.  
  971.   FileDlg dlg(this, "", filter, selectedFilter, "", exts, theApp.dir, title, false);
  972.  
  973.   if(dlg.DoModal() == IDOK) {
  974.     regSetDwordValue("selectedFilter", dlg.m_ofn.nFilterIndex);
  975.     theApp.szFile = dlg.GetPathName();
  976.     theApp.dir = theApp.szFile.Left(dlg.m_ofn.nFileOffset);
  977.     if(theApp.dir.GetLength() > 3 && theApp.dir[theApp.dir.GetLength()-1] == '\\')
  978.       theApp.dir = theApp.dir.Left(theApp.dir.GetLength()-1);
  979.     regSetStringValue("romdir", theApp.dir);
  980.     return true;
  981.   }
  982.   return false;
  983. }
  984.  
  985. void MainWnd::OnPaint() 
  986. {
  987.   CPaintDC dc(this); // device context for painting
  988.   
  989.   if(emulating) {
  990.     theApp.painting = true;
  991.     systemDrawScreen();
  992.     theApp.painting = false;
  993.     theApp.renderedFrames--;
  994.   }
  995. }
  996.  
  997. BOOL MainWnd::PreTranslateMessage(MSG* pMsg) 
  998. {
  999.   if (CWnd::PreTranslateMessage(pMsg))
  1000.     return TRUE;
  1001.  
  1002.   if(pMsg->message >= WM_KEYFIRST && pMsg->message <= WM_KEYLAST) {
  1003.     return theApp.hAccel != NULL &&  ::TranslateAccelerator(m_hWnd, theApp.hAccel, pMsg);
  1004.   }
  1005.   
  1006.   return FALSE;
  1007. }
  1008.  
  1009. void MainWnd::screenCapture(int captureNumber)
  1010. {
  1011.   CString buffer;
  1012.   
  1013.   CString captureDir = regQueryStringValue("captureDir", "");
  1014.   int index = theApp.filename.ReverseFind('\\');
  1015.   
  1016.   CString name;
  1017.   if(index != -1)
  1018.     name = theApp.filename.Right(theApp.filename.GetLength()-index-1);
  1019.   else
  1020.     name = theApp.filename;
  1021.   
  1022.   if(captureDir.IsEmpty())
  1023.     captureDir = getDirFromFile(theApp.filename);
  1024.  
  1025.   LPCTSTR ext = "png";
  1026.   if(theApp.captureFormat != 0)
  1027.     ext = "bmp";
  1028.   
  1029.   if(isDriveRoot(captureDir))
  1030.     buffer.Format("%s%s_%02d.%s",
  1031.                   captureDir,
  1032.                   name,
  1033.                   captureNumber,
  1034.                   ext);
  1035.   else
  1036.     buffer.Format("%s\\%s_%02d.%s",
  1037.                   captureDir,
  1038.                   name,
  1039.                   captureNumber,
  1040.                   ext);
  1041.  
  1042.   if(theApp.captureFormat == 0)
  1043.     theApp.emulator.emuWritePNG(buffer);
  1044.   else
  1045.     theApp.emulator.emuWriteBMP(buffer);
  1046.  
  1047.   CString msg = winResLoadString(IDS_SCREEN_CAPTURE);
  1048.   systemScreenMessage(msg);
  1049. }
  1050.  
  1051. void MainWnd::winMouseOn()
  1052. {
  1053.   SetCursor(arrow);
  1054.   if(theApp.videoOption > VIDEO_4X) {
  1055.     theApp.mouseCounter = 120;
  1056.   } else
  1057.     theApp.mouseCounter = 0;
  1058. }
  1059.  
  1060. void MainWnd::OnMouseMove(UINT nFlags, CPoint point) 
  1061. {
  1062.   winMouseOn();
  1063.   
  1064.   CWnd::OnMouseMove(nFlags, point);
  1065. }
  1066.  
  1067. void MainWnd::OnInitMenu(CMenu* pMenu) 
  1068. {
  1069.   CWnd::OnInitMenu(pMenu);
  1070.   
  1071.   soundPause();  
  1072. }
  1073.  
  1074. void MainWnd::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized) 
  1075. {
  1076.   CWnd::OnActivate(nState, pWndOther, bMinimized);
  1077.   
  1078.   bool a = (nState == WA_ACTIVE) || (nState == WA_CLICKACTIVE);
  1079.  
  1080.   if(a && theApp.input) {
  1081.     theApp.active = a;
  1082.     theApp.input->activate();
  1083.     if(!theApp.paused) {
  1084.       if(emulating) {
  1085.         soundResume();
  1086.       }
  1087.     }
  1088.   } else {
  1089.     theApp.wasPaused = true;
  1090.     if(theApp.pauseWhenInactive) {
  1091.       if(emulating) {
  1092.         soundPause();
  1093.       }
  1094.       theApp.active = a;
  1095.     }
  1096.  
  1097.     memset(theApp.delta,255,sizeof(theApp.delta));        
  1098.   }
  1099.  
  1100.   if(theApp.paused && emulating)
  1101.     systemDrawScreen();
  1102. }
  1103.  
  1104. #if _MSC_VER <= 1200
  1105. void MainWnd::OnActivateApp(BOOL bActive, HTASK hTask)
  1106. #else
  1107. void MainWnd::OnActivateApp(BOOL bActive, DWORD hTask)
  1108. #endif
  1109. {
  1110.   CWnd::OnActivateApp(bActive, hTask);
  1111.   
  1112.   if(theApp.tripleBuffering && theApp.videoOption > VIDEO_4X) {
  1113.     if(bActive) {
  1114.       if(theApp.display)
  1115.         theApp.display->clear();
  1116.     }
  1117.   }
  1118. }
  1119.  
  1120. void MainWnd::OnDropFiles(HDROP hDropInfo) 
  1121. {
  1122.   char szFile[1024];
  1123.  
  1124.   if(DragQueryFile(hDropInfo,
  1125.                    0,
  1126.                    szFile,
  1127.                    1024)) {
  1128.     theApp.szFile = szFile;
  1129.     if(FileRun()) {
  1130.       SetForegroundWindow();
  1131.       emulating = TRUE;
  1132.     } else {
  1133.       emulating = FALSE;
  1134.       soundPause();
  1135.     }
  1136.   }
  1137.   DragFinish(hDropInfo);
  1138. }
  1139.  
  1140. LRESULT MainWnd::OnMySysCommand(WPARAM wParam, LPARAM lParam)
  1141. {
  1142.   if(emulating && !theApp.paused) {
  1143.     if((wParam&0xFFF0) == SC_SCREENSAVE || (wParam&0xFFF0) == SC_MONITORPOWER)
  1144.       return 0;
  1145.   }
  1146.   return Default();
  1147. }
  1148.