"3 ways to emulate Atomiswave and Naomi"
Ver. Française:
Emulation
1/
MEmu := "RetroArch"
MEmuV := "v05-11-2015 Nightly"
MURL := ["http://themaister.net/retroarch.html"]
MAuthor := ["djvj","zerojay"]
MVersion := "2.4.2"
MCRC := ""
iCRC := ""
MID := ""
MSystem := ["Acorn BBC Micro","AAE","Amstrad CPC","Amstrad GX4000","APF Imagination Machine","Applied Technology MicroBee","Apple IIGS","Atari 2600","Atari 5200","Atari 7800","Atari 8-Bit","Atari Classics","Atari Jaguar","Atari Lynx","Atari ST","Atari XEGS","Bally Astrocade","Bandai Gundam RX-78","Bandai Super Vision 8000","WonderSwan","WonderSwan Color","Benesse Pocket Challenge V2","Canon X07","Capcom Classics","Capcom Play System","Capcom Play System II","Capcom Play System III","Casio PV-1000","Casio PV-2000","Cave","Coleco ADAM","ColecoVision","Commodore MAX Machine","Commodore Amiga","Creatronic Mega Duck","Data East Classics","Dragon Data Dragon","Emerson Arcadia 2001","Entex Adventure Vision","Elektronika BK","Epoch Game Pocket Computer","Epoch Super Cassette Vision","Exidy Sorcerer","Fairchild Channel F","Final Burn Alpha","Funtech Super Acan","GamePark 32","GCE Vectrex","Hartung Game Master","Interton VC 4000","Irem Classics","JungleTac Sport Vii","Konami Classics","MAME","Magnavox Odyssey 2","Microsoft MSX","Microsoft MSX2","Matra & Hachette Alice","Mattel HyperScan","Mattel Aquarius","Mattel Intellivision","Midway Classics","M&D Monon Color","Namco Classics","Namco System 22","NEC PC Engine","NEC PC Engine CD","NEC PC-FX","NEC TurboGrafx-16","NEC SuperGrafx","NEC TurboGrafx-CD","Nintendo 64","Nintendo 64DD","Nintendo Arcade Systems","Nintendo Classics","Nintendo DS","Nintendo Entertainment System","Nintendo Famicom","Nintendo Famicom Disk System","Nintendo Game Boy","Nintendo Game Boy Color","Nintendo Game Boy Japan","Nintendo Game Boy Advance","Nintendo Game & Watch","Nintendo Super Game Boy","Nintendo Pokemon Mini","Nintendo Virtual Boy","Nintendo Super Famicom","Nintendo Satellaview","Nintendo SuFami Turbo","Panasonic 3DO","Elektronska Industrija Pecom 64","Philips CD-i","Philips Videopac","RCA Studio II","Samsung Gamboy","ScummVM","Sega 32X","Sega Classics","Sega Mega Drive 32X","Sega Mark III","Sega SC-3000","Sega SG-1000","Sega CD","Sega Dreamcast","Sega Game Gear","Sega Genesis","Sega Master System","Sega Mega Drive","Sega Meganet","Sega Nomad","Sega Pico","Sega Saturn","Sega Saturn Japan","Sega VMU","Sega ST-V","Sharp X1","Sinclair ZX Spectrum","Sony PlayStation","Sony PlayStation Minis","Sony PocketStation","Sony PSP","Sony PSP Minis","Sord M5","SNK Classics","SNK Neo Geo","SNK Neo Geo AES","SNK Neo Geo MVS","SNK Neo Geo Pocket","SNK Neo Geo CD","SNK Neo Geo Pocket Color","Spectravideo","Super Nintendo Entertainment System","Taito Classics","Tandy TRS-80 Color Computer","Technos","Texas Instruments TI 99-4A","Thomson MO5","Thomson TO7","Tiger Game.com","Tiki-100","Tomy Tutor","VTech CreatiVision","Watara Supervision","Williams Classics"]
;----------------------------------------------------------------------------
; Notes:
; If the emu doesn't load and you get no error, usually this means the LibRetro DLL is not working!
; Devs stated they will never add support for mounted images (like via DT)
; Fullscreen is controlled via the module setting in RocketLauncherUI
; This module uses the CLI version of RetroArch (retroarch.exe), not the GUI (retroarch-phoenix.exe).
; The emu may make a mouse cursor appear momentarily during launch, MouseMove and hide_cursor seem to have no effect
; Enable 7z support for archived roms
; Available CLI options: https://github.com/PyroFilmsFX/iOS/blob/master/docs/retroarch.1
;
; LibRetro DLLs:
; LibRetro DLLs come with the emu, but here is another source for them: http://forum.themaister.net/
; Whatever cores you decide to use, make sure they are extracted anywhere in your Emu_Path\cores folder. The module will find and load the default core unless you choose a custom one for each system.
; You can find supported cores that Retroarch supports simply by downloading them from the "retroarch-phoenix.exe" or by visiting here: https://github.com/libretro/libretro.github.com/wiki/Supported-cores
; Some good discussion on cores and filters: http://forum.themaister.net/viewtopic.php?id=270
;
; SRM files:
; srm are stored in a "srm" dir in the emu folder. Each system ran through retroarch gets its own folder inside srm
;
; Save states:
; Save states are stored in a "save" dir in the emu folder. Each system ran through retroarch gets its own folder inside save
;
; Config files:
; By default, the module looks for config files in a folder called config in the RetroArch folder. Example: C:\emus\RetroArch\config. You can change this folder to anything you like by changing the module's ConfigFolder setting in RocketLauncherUI.
; RetroArch's global config file is called "retroarch.cfg". RetroArch will use a system cfg file named to match your System Name (example: Nintendo Entertainment System.cfg).
; RetroArch will also load core config files named after the core name. Example: nestopia_libretro.cfg
; This allows different settings globally, for each system, and for each core. If you want all systems to use the same retroarch.cfg, do not have any system or core cfg files, only have the retroarch.cfg.
; If a core config exists, it takes precedence over the global config. And if a system config exists, it takes precedence over the core config.
;
; MultiGame:
; MultiGame support is currently only available for the Mednafen PSX core. Retroarch uses the same method as Mednafen to load multi-disc games. This method involves m3u playlists which are commonly used for music. The m3u files needed to load multi-disc games are generated for you by the module when you launch a multi-disc game and are saved to your corresponding rom directory. Due to m3u limitations, your multi-disc roms/images cannot be archived -- they must be unzipped. All single disc games can remain archived and you can still enable 7z under system settings. If you do not wish to use MultiGame support you can archive your roms/images and m3u generation will be skipped on launch.
; The m3u files generated by the module contain a list of paths to all roms/images in the multi-disc set. Retroarch automatically loads the first path in the m3u so the first path will always be the disc you are loading. For example, Final Fantasy VII has 3 discs and if you load Disc 2 first, the order of the paths in the m3u will be disc 2, disc 3, disc 1. If you load Disc 3 first, the order will be disc 3, disc 1, disc 2. The module anticipates this and will load the correct disk, selected from the Pause/MultiDisk menus. However if you choose to manually use Retroarch's UI or disk swap keys to change discs, you will need to keep this in mind.
; In order for RocketLauncher's MultiGame UI to swap discs, you must define Eject_Toggle_Key, Next_Disk_Key, and Previous_Disk_Key under global settings for the emulator in RocketLauncher. Because AHK and Retroarch use different naming conventions for some keyboard keys, it is best to use a letter, a number, or F1-F12.
;
; MAME:
; MAME BIOS roms should be placed in the system\mame folder
;
; System Specific Notes:
; Microsoft MSX/MSX2: Launch an MSX game and in the core options, set the console to be an MSX2 and it will play both just fine.
; Nintendo Famicom Disk System - Requires disksys.rom be placed in the folder you define as system_directory in the RetroArch's cfg.
; Sega CD - Requires "bios_CD_E.bin", "bios_CD_J.bin", "bios_CD_U.bin" all be placed in the folder you define as system_directory in the RetroArch's cfg.
; Super Nintendo Entertainment System - requires split all 10 dsp# & st### roms all be placed in the folder you define as system_directory in the RetroArch's cfg. Many games, like Super Mario Kart require these.
; NEC TurboGrafx-CD (using pce fast core) - Requires "syscard3.pce" be placed in the folder you define as system_directory in the RetroArch's cfg.
; NEC TurboGrafx-CD (using MAME core)
; - You'll need to update a couple mame specific options in the Retroarch core options file to get it to boot from the cli. These should probably be updated automagically by the module. Turning softlists off, but might not need to.
; mame_boot_from_cli = "enabled"
; mame_softlists_enable = "disabled"
; mame_softlists_auto_media = "disabled"
; - Requires hash folder from MAME/MESS/UME, either from the source or release package. Save this in the system_directory you've defined for RetroArch. Something like \RetroArch\system\mame\hash\
; - Requires the CD bios file(s) saved in the mame bios folder you've defined. Usually \RetroArch\system\mame\bios\
; For PC Engine-CD you'll need the file "[cd] cd-rom system (japan) (v2.1).pce" zipped as cdsys.zip and saved in a pce subfolder in your bios path, so \RetroArch\system\mame\bios\pce\cdsys.zip
; For PC Engine SuperGrafx-CD you'll need the file "[cd] super cd-rom system (japan) (v3.0).pce" zipped as scdsys.zip and saved in a pce subfolder in your bios path, so \RetroArch\system\mame\bios\pce\scdsys.zip
; For TurboGrafx-CD you'll need the file "[cd] turbografx cd system card (usa) (v2.0).pce" zipped as cdsys.zip and saved in a tg16 subfolder in your bios path, so \RetroArch\system\mame\bios\tg16\cdsys.zip
; For TurboDuo you'll need the file "[cd] turbografx cd super system card (usa) (v3.0).pce" zipped as scdsys.zip and saved in a tg16 subfolder in your bios path, so \RetroArch\system\mame\bios\tg16\scdsys.zip
; Nintendo Super Game Boy - Set the Module setting in RocketLauncherUI SuperGameBoy to true to enable a system or only a rom to use SGB mode. This is not needed if your systemName is set to the official name of "Nintendo Super Game Boy". Requires "sgb.boot.rom" and "Super Game Boy (World).sfc" to be placed in the folder you define as system_directory in the RetroArch's cfg. This is needed if you want to use Super game boy mode and color palettes. Also requires using the latest bsnes core. Not all games support SGB mode.
; MAME: The nag screen patch has been removed from the MAME core as of some point in March. We will be investigating our options for this. For MAME-based systems, make sure to set 7z use to false as MAME needs zip files.
; Sony PSP/PlayStation Minis: To avoid the dialog box complaining about ppge_atlas.zim, download it from https://github.com/libretro/libretro-ppsspp/blob/master/assets/ppge_atlas.zim and place it in your Retroarch/system/PPSSPP/ directory.
;----------------------------------------------------------------------------
StartModule()
BezelGUI()
FadeInStart()
primaryExe := new Emulator(emuPath . "\" . executable) ; instantiate emulator executable object
emuPrimaryWindow := new Window(new WindowTitle("RetroArch","RetroArch")) ; instantiate primary emulator window object
emuConsoleWindow := new Window(new WindowTitle(,"ConsoleWindowClass")) ; instantiate emulator console window object
; Here we define all supported systems for this module. This object controls how the module reacts to different systems. RetroArch can play a lot of systems, but needs to know what system you want to run, so this module has to adapt.
; 1 - Official System Name in RocketLauncher
; 2 - Short name used only for easy referencing within module
; 3 - Default core
; 4 - The system ID MAME core recognizes
RLLog.Debug("Module - Started building the " . MEmu . " object")
mTypeVar:="
( LTrim
AAE|LibRetro_AAE|mame_libretro
Acorn BBC Micro|LibRetro_BBCB|mess_libretro|bbcb
Amstrad CPC|LibRetro_CPC|mess_libretro|cpc464
Amstrad GX4000|LibRetro_GX4K|mess_libretro|gx4000
APF Imagination Machine|LibRetro_APF|mess_libretro|apfimag
Apple IIGS|LibRetro_AIIGS|mess_libretro|apple2gs
Applied Technology MicroBee|LibRetro_MBEE|mess_libretro|mbeeic
Atari 2600|LibRetro_2600|stella_libretro|a2600
Atari 5200|LibRetro_5200|mess_libretro|a5200
Atari 7800|LibRetro_7800|prosystem_libretro|a7800
Atari 8-Bit|LibRetro_ATARI8|mess_libretro|a800
Atari Classics|LibRetro_ACLS|mame_libretro
Atari Jaguar|LibRetro_JAG|virtualjaguar_libretro|jaguar
Atari Lynx|LibRetro_LYNX|handy_libretro|lynx
Atari ST|LibRetro_ST|hatari_libretro
Atari XEGS|LibRetro_XEGS|mess_libretro|xegs
Bally Astrocade|LibRetro_BAST|mess_libretro|astrocde
Bandai Gundam RX-78|LibRetro_BGRX|mess_libretro|rx78
Bandai Super Vision 8000|LibRetro_SV8K|mess_libretro|sv8000
Bandai Wonderswan|LibRetro_WSAN|mednafen_wswan_libretro|wswan
Bandai Wonderswan Color|LibRetro_WSANC|mednafen_wswan_libretro|wscolor
Benesse Pocket Challenge V2|LibRetro_BPC|mednafen_wswan_libretro
Canon X07|LibRetro_CX07|mess_libretro|x07
Capcom Classics|LibRetro_CAPC|mame_libretro
Capcom Play System|LibRetro_CPS1|fba_cores_cps1_libretro
Capcom Play System II|LibRetro_CPS2|fba_cores_cps2_libretro
Capcom Play System III|LibRetro_CPS3|mame_libretro
Casio PV-1000|LibRetro_CAS1K|mess_libretro|pv1000
Casio PV-2000|LibRetro_CAS2K|mess_libretro|pv2000
Cave|LibRetro_CAVE|mame_libretro
Coleco ADAM|LibRetro_ADAM|mess_libretro|adam
ColecoVision|LibRetro_COLEC|mess_libretro|coleco
Commodore Amiga|LibRetro_PUAE|puae_libretro
Commodore Max Machine|LibRetro_CMAX|mess_libretro|vic10
Creatronic Mega Duck|LibRetro_DUCK|mess_libretro|megaduck
Data East Classics|LibRetro_DATA|mame_libretro
Dragon Data Dragon|LibRetro_DRAG64|mess_libretro|dragon64
Elektronika BK|LibRetro_EBK|mess_libretro|bk0010
Elektronska Industrija Pecom 64|LibRetro_P64|mess_libretro|pecom64
Emerson Arcadia 2001|LibRetro_A2001|mess_libretro|arcadia
Entex Adventure Vision|LibRetro_AVISION|mess_libretro|advision
Epoch Game Pocket Computer|LibRetro_GPCKET|mess_libretro|gamepock
Epoch Super Cassette Vision|LibRetro_SCV|mess_libretro|scv
Exidy Sorcerer|LibRetro_SORCR|mess_libretro|sorcerer
Fairchild Channel F|LibRetro_CHANF|mess_libretro|channelf
Final Burn Alpha|LibRetro_FBA|fb_alpha_libretro
Funtech Super Acan|LibRetro_SACAN|mess_libretro|supracan
GamePark 32|LibRetro_GP32|mame_libretro|gp32
GCE Vectrex|LibRetro_VECTX|mess_libretro|vectrex
Hartung Game Master|LibRetro_GMASTR|mess_libretro|gmaster
Interton VC 4000|LibRetro_VC4K|mess_libretro|vc4000
Irem Classics|LibRetro_IREM|mame_libretro
JungleTac Sport Vii|LibRetro_SPORTV|mess_libretro|vii
Konami Classics|LibRetro_KONC|mame_libretro
Magnavox Odyssey 2|LibRetro_ODYS2|mess_libretro|odyssey2
MAME|LibRetro_MAME|mame_libretro|mame
Matra & Hachette Alice|LibRetro_ALICE|mess_libretro|alice32
Mattel HyperScan|LibRetro_SCAN|mame_libretro|hyprscan
Mattel Aquarius|LibRetro_AQUA|mess_libretro|aquarius
Mattel Intellivision|LibRetro_INTV|mess_libretro|intv
MGT Sam Coupe|LibRetro_SAMCP|mess_libretro|
Microsoft MS-DOS|LibRetro_MSDOS|dosbox_libretro
Microsoft MSX|LibRetro_MSX|bluemsx_libretro
Microsoft MSX2|LibRetro_MSX2|bluemsx_libretro
Microsoft Windows 3.x|LibRetro_WIN3X|dosbox_libretro
Midway Classics|LibRetro_MIDC|mame_libretro
M&D Monon Color|LibRetro_MDMC|mame_libretro|mononcol
Namco Classics|LibRetro_NAMC|mame_libretro
Namco System 22|LibRetro_NAM2|mame_libretro
NEC PC Engine|LibRetro_PCE|mednafen_pce_fast_libretro|pce,cart
NEC PC Engine CD|LibRetro_PCECD|mednafen_pce_fast_libretro|pce,cdrom
NEC PC-FX|LibRetro_PCFX|mednafen_pcfx_libretro|pcfx
NEC SuperGrafx|LibRetro_SGFX|mednafen_supergrafx_libretro|sgx,cart
NEC TurboGrafx-16|LibRetro_TG16|mednafen_pce_fast_libretro|tg16,cart
NEC TurboGrafx-CD|LibRetro_TGCD|mednafen_pce_fast_libretro|tg16,cdrom
Nintendo 64|LibRetro_N64|parallel_n64_libretro|n64
Nintendo 64DD|LibRetro_N64|mupen64plus_libretro
Nintendo Arcade Systems|LibRetro_NINARC|mame_libretro
Nintendo Classics|LibRetro_NINC|mame_libretro
Nintendo DS|LibRetro_DS|desmume_libretro
Nintendo Entertainment System|LibRetro_NES|nestopia_libretro|nes
Nintendo Famicom|LibRetro_NFAM|nestopia_libretro
Nintendo Famicom Disk System|LibRetro_NFDS|nestopia_libretro|famicom
Nintendo Game Boy|LibRetro_GB|gambatte_libretro|gameboy
Nintendo Game Boy Advance|LibRetro_GBA|vba_next_libretro|gba
Nintendo Game Boy Color|LibRetro_GBC|gambatte_libretro|gbcolor
Nintendo Game Boy Japan|LibRetro_GBJ|gambatte_libretro|gameboy
Nintendo Game & Watch|LibRetro_GW|gw_libretro
Nintendo Pokemon Mini|LibRetro_POKE|mess_libretro|pokemini
Nintendo Satellaview|LibRetro_NSFS|snes9x_libretro
Nintendo SuFami Turbo|LibRetro_NSFST|snes9x_libretro
Nintendo Super Famicom|LibRetro_NSF|bsnes_balanced_libretro
Nintendo Super Game Boy|LibRetro_SGB|bsnes_balanced_libretro
Nintendo Virtual Boy|LibRetro_NVB|mednafen_vb_libretro|vboy
Othello Multivision|LibRetro_OTHO|genesis_plus_gx_libretro
Panasonic 3DO|LibRetro_3DO|4do_libretro
Philips CD-i|LibRetro_CDI|mess_libretro|cdimono1
Philips Videopac|LibRetro_PVID|mess_libretro|videopac
RCA Studio II|LibRetro_STUD2|mess_libretro|studio2
Samsung Gamboy|LibRetro_SAMG|genesis_plus_gx_libretro|sms
SCUMMVM|LibRetro_SCUMM|scummvm_libretro
Sega 32X|LibRetro_32X|picodrive_libretro|32x
Sega CD|LibRetro_SCD|genesis_plus_gx_libretro|segacd
Sega Classics|LibRetro_SEGC|mame_libretro
Sega Dreamcast|LibRetro_DCAST|reicast_libretro
Sega Game Gear|LibRetro_GG|genesis_plus_gx_libretro|gamegear
Sega Genesis|LibRetro_GEN|genesis_plus_gx_libretro|genesis
Sega Mark III|Libretro_SM3|genesis_plus_gx_libretro
Sega Master System|LibRetro_SMS|genesis_plus_gx_libretro|sms
Sega Mega Drive|LibRetro_GEN|genesis_plus_gx_libretro|megadriv
Sega Mega Drive 32X|LibRetro_MD32X|picodrive_libretro
Sega Meganet|LibRetro_GEN|genesis_plus_gx_libretro|genesis
Sega Nomad|LibRetro_GEN|genesis_plus_gx_libretro|genesis
Sega Pico|LibRetro_PICO|picodrive_libretro
Sega Saturn|LibRetro_SAT|yabause_libretro|saturn
Sega Saturn Japan|LibRetro_SAT|yabause_libretro|saturnjp
Sega SC-3000|LibRetro_SC3K|mess_libretro|sc3000
Sega SG-1000|LibRetro_SG1K|genesis_plus_gx_libretro
Sega ST-V|LibRetro_STV|kronos_libretro|stvbios
Sega VMU|LibRetro_SVMU|mess_libretro|svmu
Sharp X1|LibRetro_SX1|mess_libretro|x1
Sinclair ZX Spectrum|LibRetro_SPECZX|fuse_libretro|spectrum
SNK Classics|LibRetro_SNKC|mame_libretro
SNK Neo Geo|LibRetro_NEO|fb_alpha_libretro
SNK Neo Geo AES|LibRetro_NEOAES|mame_libretro|aes
SNK Neo Geo CD|LibRetro_NEOCD|mess_libretro|neocdz
SNK Neo Geo MVS|LibRetro_NEOMVS|mame_libretro
SNK Neo Geo Pocket|LibRetro_NGP|mednafen_ngp_libretro|ngp
SNK Neo Geo Pocket Color|LibRetro_NGPC|mednafen_ngp_libretro|ngpc
Sony PlayStation|LibRetro_PSX|mednafen_psx_libretro|psu
Sony PlayStation Minis|LibRetro_PSXMIN|ppsspp_libretro
Sony PocketStation|LibRetro_POCKS|mess_libretro|pockstat
Sony PSP|LibRetro_PSP|ppsspp_libretro
Sony PSP Minis|LibRetro_PSP|ppsspp_libretro
Sord M5|LibRetro_SORD|mess_libretro|m5
Spectravideo|LibRetro_SV328|mess_libretro|svi328n
Super Nintendo Entertainment System|LibRetro_SNES|bsnes_balanced_libretro|snes
Taito Classics|LibRetro_TAIC|mame_libretro
Tandy TRS-80 Color Computer|LibRetro_TRS80|mame_libretro|coco3
Technos|LibRetro_TECHN|mame_libretro
Texas Instruments TI 99-4A|LibRetro_TI99|mess_libretro|ti99_4a
Thomson MO5|LibRetro_MO5|mess_libretro|mo5
Thomson TO7|LibRetro_TO7|mess_libretro|to7
Tiger Game.com|LibRetro_TCOM|mess_libretro|gamecom
Tiki-100|LibRetro_TIKI|mess_libretro|kontiki
Tomy Tutor|LibRetro_TOMY|mess_libretro|tutor
VTech CreatiVision|LibRetro_VTECH|mess_libretro|crvision
Watara Supervision|LibRetro_SUPRV|mess_libretro|svision
Williams Classics|LibRetro_WILLS|mame_libretro
)"
mType := Object()
Loop, Parse, mTypeVar, `n, `r
{
obj := {}
Loop, Parse, A_LoopField, |
{
If (A_Index = 1)
obj.System := A_LoopField
Else If (A_Index = 2)
obj.ID := A_LoopField
Else If (A_Index = 3)
obj.Core := A_LoopField
Else { ; 4
StringSplit, tmp, A_LoopField, `,
obj.MAMEID := tmp1
obj.MAMEMedia := tmp2
}
}
mType.Insert(obj["System"], obj)
}
RLLog.Debug("Module - Finished building the " . MEmu . " object")
; For easier use throughout the module
retroSystem := mType[systemName].System
retroID := mType[systemName].ID
retroCore := mType[systemName].Core
retroMAMEID := mType[systemName].MAMEID
retroMAMEMedia := mType[systemName].MAMEMedia
RLLog.Info("Module - Using these system variables:")
RLLog.Info("Module - retroSystem: " . retroSystem)
RLLog.Info("Module - retroID: " . retroID)
RLLog.Info("Module - retroCore: " . retroCore)
RLLog.Info("Module - retroMAMEID: " . retroMAMEID)
RLLog.Info("Module - retroMAMEMedia: " . retroMAMEMedia)
If !retroSystem
ScriptError("Your systemName is: " . systemName . "`nIt is not one of the known supported systems for this " . MEmu . " module: " . moduleName)
If !retroCore
ScriptError("Your Core ID is: " . retroID . "`nCould not find a default core to use. Please update the module with a default core.")
Fullscreen := moduleIni.Read("Settings", "Fullscreen","true",,1)
configFolder := moduleIni.Read("Settings", "ConfigFolder",emuPath . "\config",,1)
mameRomPath := moduleIni.Read("MAME", "BIOS_Roms_Folder",,,1)
mameHideNag := If moduleIni.Read("MAME", "Hide_Nag_Screen","false",,1) = "true" ? "enabled" : "disabled"
mameHideInfo := If moduleIni.Read("MAME", "Hide_Info_Screen","false",,1) = "true" ? "enabled" : "disabled"
mameHideWarn := If moduleIni.Read("MAME", "Hide_Warning_Screen","false",,1) = "true" ? "enabled" : "disabled"
hideConsole := moduleIni.Read("Settings", "HideConsole","true",,1)
ejectToggleKey := moduleIni.Read("Settings", "Eject_Toggle_Key",,,1)
nextDiskKey := moduleIni.Read("Settings", "Next_Disk_Key",,,1)
prevDiskKey := moduleIni.Read("Settings", "Previous_Disk_Key",,,1)
core := moduleIni.Read(romName . "|" . systemName, "LibRetro_Core",retroCore,,1)
superGB := moduleIni.Read(romName . "|" . systemName, "SuperGameBoy","false",,1)
enableNetworkPlay := moduleIni.Read(romName . "|Network", "Enable_Network_Play","false",,1)
overlay := moduleIni.Read(romName . "|" . systemName, "Overlay",,,1)
videoShader := moduleIni.Read(romName . "|" . systemName, "VideoShader",,,1)
aspectRatioIndex := moduleIni.Read(romName . "|" . systemName, "AspectRatioIndex",,,1)
customViewportWidth := moduleIni.Read(romName . "|" . systemName, "CustomViewportWidth",,,1)
customViewportHeight := moduleIni.Read(romName . "|" . systemName, "CustomViewportHeight",,,1)
customViewportX := moduleIni.Read(romName . "|" . systemName, "CustomViewportX",,,1)
customViewportY := moduleIni.Read(romName . "|" . systemName, "CustomViewportY",,,1)
stretchToFillBezel := moduleIni.Read(romName . "|" . systemName, "StretchToFillBezel","false",,1)
rotation := moduleIni.Read(romName . "|" . systemName, "Rotation",0,,1)
cropOverscan := moduleIni.Read(romName . "|" . systemName, "CropOverscan",,,1)
threadedVideo := moduleIni.Read(romName . "|" . systemName, "ThreadedVideo",,,1)
vSync := moduleIni.Read(romName . "|" . systemName, "VSync",,,1)
integerScale := moduleIni.Read(romName . "|" . systemName, "IntegerScale",,,1)
configurationPerCore := moduleIni.Read(romName . "|" . systemName, "ConfigurationPerCore","false",,1)
If (StringUtils.Contains(core, "^(mame|mess|ume)") && !retroMAMEID) {
retroMAMEID := "mame" ; set all systems that use a mame core to the default mame ID so any system name is supported
RLLog.Warning("Module - Setting MAMEID to default ""mame"" for """ . retroSystem . """")
}
configFolder := RLObject.getFullPathFromRelative(rlPath,configFolder)
mameRomPath := If mameRomPath ? RLObject.getFullPathFromRelative(rlPath,mameRomPath) : romPath
overlay := RLObject.getFullPathFromRelative(rlPath,overlay)
videoShader := RLObject.getFullPathFromRelative(rlPath,videoShader)
rotateBezel := false
configFolder := new Folder(configFolder)
If (retroID = "LibRetro_SGB" || superGB = "true") ; if system or rom is set to use Super Game Boy
{ superGB := "true" ; setting this just in case it's false and the system is Nintendo Super Game Boy
sgbRomPath := CheckFile(emuPath . "\system\Super Game Boy (World).sfc","Could not find the rom required for Super Game Boy support. Make sure the rom ""Super Game Boy (World).sfc"" is located in: " . emuPath . "\system")
CheckFile(emuPath . "\system\sgb.boot.rom","Could not find the bios required for Super Game Boy support. Make sure the bios ""sgb.boot.rom"" is located in: " . emuPath . "\system")
retroID := "LibRetro_SGB" ; switching to Super Game Boy mode
retroSystem := "Nintendo Super Game Boy"
}
; Find the dll for this system
libDll := CheckFile(emuPath . "\cores\" . core . ".dll", "Your " . retroID . " dll is set to " . core . " but could not locate this file:`n" . emuPath . "\cores\" . core . ".dll")
; Find the cfg file to use
If !configFolder.Exist()
ScriptError("You need to make sure ""ConfigFolder"" is pointing to your RetroArch config folder. By default it is looking here: """ . configFolder.FilePath . """")
globalRetroCfg := emuPath . "\retroarch.cfg"
systemRetroCfg := configFolder.FilePath . "\" . retroSystem . ".cfg"
coreRetroCfg := configFolder.FilePath . "\" . core . ".dll.cfg"
RLLog.Info("Module - Global cfg should be: " . globalRetroCfg)
RLLog.Info("Module - System cfg should be: " . systemRetroCfg)
RLLog.Info("Module - Core cfg should be: " . coreRetroCfg)
foundCfg := ""
systemRetroCfg := new File(systemRetroCfg)
coreRetroCfg := new File(coreRetroCfg)
globalRetroCfg := new File(globalRetroCfg)
If systemRetroCfg.Exist() { ; check for system cfg first
retroCFGFile := systemRetroCfg
foundCfg := 1
RLLog.Info("Module - Found a System cfg!")
} Else If coreRetroCfg.Exist() { ; 2nd option is a core config
retroCFGFile := coreRetroCfg
foundCfg := 1
RLLog.Info("Module - Found a Core cfg!")
} Else If globalRetroCfg.Exist() { ; 3rd is global cfg
retroCFGFile := globalRetroCfg
foundCfg := 1
RLLog.Info("Module - Found a Global cfg!")
}
If foundCfg {
RLLog.Info("Module - " . MEmu . " is using " . retroCFGFile.FileFullPath . " as its config file.")
retroCFG := LoadProperties(retroCFGFile.FileFullPath)
} Else
RLLog.Warning("Module - Could not find a cfg file to update settings. RetroArch will make one for you.")
If StringUtils.Contains(rotation,"1|3") ; use vertical bezel if RA rotation is set to 90 or 270 degrees
rotateBezel := true
If StringUtils.Contains(retroID, "LibRetro_NFDS|LibRetro_SCD|LibRetro_TGCD|LibRetro_PCECD|LibRetro_PCFX") { ; these systems require the retroarch settings to be read
retroSysDir := ReadProperty(retroCFG,"system_directory") ; read value
retroSysDir := ConvertRetroCFGKey(retroSysDir) ; remove dbl quotes
retroSysDirLeft := StringUtils.Left(retroSysDir, 2)
If (retroSysDirLeft = ":\") { ; if retroarch is set to use a default folder
retroSysDir := StringUtils.TrimLeft(retroSysDir, 1)
RLLog.Info("Module - RetroArch is using a relative system path: """ . retroSysDir . """")
retroSysDir := emuPath . retroSysDir
}
If !retroSysDir
ScriptError("RetroArch requires you to set your system_directory and place bios rom(s) in there for """ . retroSystem . """ to function. Please do this first by running ""retroarch-phoenix.exe"" manually.")
checkForSlash := StringUtils.Right(retroSysDir, 1)
If (checkForSlash = "\") ; check if a backslash is the last character. If it is, remove it, as this is non-standard method to define folders
retroSysDir := StringUtils.TrimRight(retroSysDir, 1)
}
If (StringUtils.Contains(core, "^(mame|mess|ume)")) || (StringUtils.Contains(retroID, "LibRetro_N64|LibRetro_NES|LibRetro_LYNX|LibRetro_PSX")) || (StringUtils.Contains(retroID, "LibRetro_NES") && (StringUtils.Contains(core, "nestopia_libretro"))) { ; these systems will use an ini to store game specific settings
RLLog.Info("Module - Reading / creating system ini for specific settings.")
If !StringUtils.Contains(core, "^(mame|mess|ume)") {
If !SystemModuleIni.Exist()
SystemModuleIni.Append ; create a new blank ini file if one does not exist
}
If (configurationPerCore = "true") {
coreOptionsCFGFile := new File(configFolder.FilePath . "\retroarch-core-options.cfg")
coreOptionsCFGFile.CheckFile("Could not find retroarch-core-options.cfg in retroarch directory: """ . configFolder.FilePath . """")
} Else {
coreOptionsCFGFile := new File(emuPath . "\retroarch-core-options.cfg")
coreOptionsCFGFile.CheckFile("Could not find retroarch-core-options.cfg in retroarch directory: """ . emuPath . """")
}
coreOptionsCFG := LoadProperties(coreOptionsCFGFile.FileFullPath)
If StringUtils.Contains(core, "^(mame|mess|ume)") { ; Set some MAME/MESS/UME core options.
tmpCore := If StringUtils.Contains(core, "mame") ? "mame" : "mess"
WriteProperty(coreOptionsCFG, tmpCore . "_read_config", """enabled""", 1)
WriteProperty(coreOptionsCFG, tmpCore . "_boot_from_cli", """enabled""", 1) ; This needs to be enabled in order to run games with RLauncher
WriteProperty(coreOptionsCFG, tmpCore . "_hide_nagscreen", "" . mameHideNag . "", 1)
WriteProperty(coreOptionsCFG, tmpCore . "_hide_infoscreen", "" . mameHideInfo . "", 1)
WriteProperty(coreOptionsCFG, tmpCore . "_hide_warnings", "" . mameHideWarn . "", 1)
} Else If StringUtils.Contains(retroID, "LibRetro_N64") { ; Nintendo 64
mupenGfx := moduleIni.Read(romName . "|" . systemName, "Mupen_Gfx_Plugin", "auto",,1)
mupenRsp := moduleIni.Read(romName . "|" . systemName, "Mupen_RSP_Plugin", "auto",,1)
mupenCpu := moduleIni.Read(romName . "|" . systemName, "Mupen_CPU_Core", "dynamic_recompiler",,1)
mupenPak1 := moduleIni.Read(romName . "|" . systemName, "Mupen_Pak_1", "memory",,1)
mupenPak2 := moduleIni.Read(romName . "|" . systemName, "Mupen_Pak_2", "memory",,1)
mupenPak3 := moduleIni.Read(romName . "|" . systemName, "Mupen_Pak_3", "memory",,1)
mupenPak4 := moduleIni.Read(romName . "|" . systemName, "Mupen_Pak_4", "memory",,1)
mupenGfxAccur := moduleIni.Read(romName . "|" . systemName, "Mupen_Gfx_Accuracy", "high",,1)
mupenExpMem := moduleIni.Read(romName . "|" . systemName, "Mupen_Disable_Exp_Memory", "no",,1)
mupenTexturFilt := moduleIni.Read(romName . "|" . systemName, "Mupen_Texture_Filtering", "nearest",,1)
mupenViRefresh := moduleIni.Read(romName . "|" . systemName, "Mupen_VI_Refresh", "2200",,1)
mupenFramerate := moduleIni.Read(romName . "|" . systemName, "Mupen_Framerate", "fullspeed",,1)
mupenResolution := moduleIni.Read(romName . "|" . systemName, "Mupen_Resolution", "640x480",,1)
mupenPolyOffstFctr := moduleIni.Read(romName . "|" . systemName, "Mupen_Polygon_Offset_Factor", "-3.0",,1)
mupenPolyOffstUnts := moduleIni.Read(romName . "|" . systemName, "Mupen_Polygon_Offset_Units", "-3.0",,1)
mupenViOverlay := moduleIni.Read(romName . "|" . systemName, "Mupen_VI_Overlay", "disabled",,1)
mupenAnalogDzone := moduleIni.Read(romName . "|" . systemName, "Mupen_Analog_Deadzone", "15",,1)
WriteProperty(coreOptionsCFG, "mupen64-gfxplugin", mupenGfx, 1)
WriteProperty(coreOptionsCFG, "mupen64-rspplugin", mupenRsp, 1)
WriteProperty(coreOptionsCFG, "mupen64-cpucore", mupenCpu, 1)
WriteProperty(coreOptionsCFG, "mupen64-pak1", mupenPak1, 1)
WriteProperty(coreOptionsCFG, "mupen64-pak2", mupenPak2, 1)
WriteProperty(coreOptionsCFG, "mupen64-pak3", mupenPak3, 1)
WriteProperty(coreOptionsCFG, "mupen64-pak4", mupenPak4, 1)
WriteProperty(coreOptionsCFG, "mupen64-gfxplugin-accuracy", mupenGfxAccur, 1)
WriteProperty(coreOptionsCFG, "mupen64-disableexpmem", mupenExpMem, 1)
WriteProperty(coreOptionsCFG, "mupen64-filtering", mupenTexturFilt, 1)
WriteProperty(coreOptionsCFG, "mupen64-virefresh", mupenViRefresh, 1)
WriteProperty(coreOptionsCFG, "mupen64-framerate", mupenFramerate, 1)
WriteProperty(coreOptionsCFG, "mupen64-screensize", mupenResolution, 1)
WriteProperty(coreOptionsCFG, "mupen64-polyoffset-factor", mupenPolyOffstFctr, 1)
WriteProperty(coreOptionsCFG, "mupen64-polyoffset-units", mupenPolyOffstUnts, 1)
WriteProperty(coreOptionsCFG, "mupen64-angrylion-vioverlay", mupenViOverlay, 1)
WriteProperty(coreOptionsCFG, "mupen64-astick-deadzone", mupenAnalogDzone, 1)
} Else If StringUtils.Contains(retroID, "LibRetro_NES") { ; these systems will use an ini to store game specific settings
If StringUtils.Contains(core, "nestopia_libretro") { ; Nestopia
nestopiaBlargg := moduleIni.Read(romName . "|Nestopia", "Nestopia_Blargg_NTSC_Filter", "disabled",,1)
nestopiaPalette := moduleIni.Read(romName . "|Nestopia", "Nestopia_Palette", "canonical",,1)
nestopiaNoSprteLimit := moduleIni.Read(romName . "|Nestopia", "Nestopia_Remove_Sprites_Limit", "disabled",,1)
WriteProperty(coreOptionsCFG, "nestopia_blargg_ntsc_filter", nestopiaBlargg, 1)
WriteProperty(coreOptionsCFG, "nestopia_palette", nestopiaPalette, 1)
WriteProperty(coreOptionsCFG, "nestopia_nospritelimit", nestopiaNoSprteLimit, 1)
}
} Else If StringUtils.Contains(retroID, "LibRetro_LYNX") { ; Atari Lynx
If StringUtils.Contains(core, "handy_libretro") { ; Handy
handyRotate := moduleIni.Read(romName . "|" . systemName, "Handy_Rotation", "None",,1)
If StringUtils.Contains(handyRotate, "240") or StringUtils.Contains(handyRotate, "90")
rotateBezel := true
WriteProperty(coreOptionsCFG, "handy_rot", handyRotate, 1)
}
} Else If StringUtils.Contains(retroID, "LibRetro_PSX") { ; Sony PlayStation
psxCdImageCache := moduleIni.Read(romName . "|" . systemName, "PSX_CD_Image_Cache", """enabled""",,1)
psxMemcardHandling := moduleIni.Read(romName . "|" . systemName, "PSX_Memcard_Handling", """libretro""",,1)
psxDualshockAnalogToggle := moduleIni.Read(romName . "|" . systemName, "PSX_Dualshock_Analog_Toggle", """enabled""",,1)
WriteProperty(coreOptionsCFG, "beetle_psx_cdimagecache", psxCdImageCache, 1)
WriteProperty(coreOptionsCFG, "beetle_psx_use_mednafen_memcard0_method", psxMemcardHandling, 1)
WriteProperty(coreOptionsCFG, "beetle_psx_analog_toggle", psxDualshockAnalogToggle, 1)
}
SaveProperties(coreOptionsCFGFile.FileFullPath, coreOptionsCFG)
}
hideEmuObj := Object(emuConsoleWindow,0,emuPrimaryWindow,1)
7z(romPath, romName, romExtension, sevenZExtractPath)
mgM3UFile := new File(romPath . "\" . romTable[1,4] . ".m3u")
mgRomExtensions := "cue|iso|ccd"
mgValidExtension := false
Loop, Parse, mgRomExtensions, |
If (romExtension = "." . A_LoopField)
mgValidExtension := true
If (StringUtils.Contains(retroID, "LibRetro_PSX") && romTable.MaxIndex() && mgValidExtension) { ; See if MultiGame table is populated
m3uRomIndex := Object()
mgType := romTable[1,6] . " "
mgMaxIndex := romTable.MaxIndex()
mgRomIndex := 0
If mgM3UFile.Exist()
mgM3UFile.Delete()
Loop % mgMaxIndex
{
If (romTable[A_Index, 3] = romName) {
tempType := romTable[A_Index, 5]
mgRomIndex := StringUtils.TrimLeft(tempType, StringUtils.StringLength(mgType))
RLLog.Info("Found rom index in rom set in romTable: " . mgRomIndex)
Break
}
}
If (mgRomIndex > 0) {
tempRomIndex := mgRomIndex
Loop % mgMaxIndex
{
mgTypeIndex := mgType . tempRomIndex
m3uRomIndex.Insert(tempRomIndex)
Loop % mgMaxIndex
{
If (romTable[A_Index, 5] = mgTypeIndex) {
tempRomPath := romTable[A_Index, 1]
mgM3UFile.Append(tempRomPath . "`n")
RLLog.Info("Module - Appending rom path to m3u: " . tempRomPath)
Break
}
}
If (tempRomIndex < mgMaxIndex)
tempRomIndex++
Else
tempRomIndex := 1
}
}
}
; MAME/MESS/UME core options
MAMEParam1 := ""
MAMEParam2 := ""
MAMEParam3 := ""
If StringUtils.Contains(core, "^(mame|mess|ume)") { ; if a MAME/MESS/UME core is used
If !retroMAMEID
ScriptError("Your systemName is: " . systemName . "`nIt is not one of the known supported systems for the MAME/MESS/UME LibRetro core")
Else
RLLog.Info("Module - MAME/MESS/UME mode using a known ident: " . retroMAMEID)
If !mameRomPath
ScriptError("Please set the RetroArch module setting ""BIOS_Roms_Folder"" to the folder that contains your MAME/MESS/UME BIOS roms to use with RetroArch.")
If (retroMAMEID = "mame") { ; want this for arcade mame only
RLLog.Info("Module - Retroarch MAME/MESS/UME Arcade mode enabled")
fullRomPath := " """ . romPath . "\" . romName . romExtension . """"
} Else {
RLLog.Info("Module - Retroarch MAME/MESS/UME Console/PC mode enabled")
MAMEParam1 := ""
MAMEParam2 := " -rompath \""" . mameRomPath . "\"""
; If we already have a media type, then use it.
If (StringUtils.Contains(retroMAMEID, "tg16|pce") && retroMAMEMedia = "cart") {
;MAMEParam3 := " -cart \" . """" . romPath . "\" . romName . romExtension . "\" . """"
MAMEParam3 := " -cart \""" . romPath . "\" . romName . romExtension . "\"""""
; TODO: This needs a better way to handle the cdrom bios files, in my opinion. As it is, there's no clean way to pick between the v2.00 or v3.00 bios.
; Defaulting to the TurboDuo cdrom bios since it will play 2.00 or 3.00 games.
} Else If (StringUtils.Contains(retroMAMEID, "tg16|pce") && retroMAMEMedia = "cdrom") {
;MAMEParam3 := " -cart cdsys -cdrm \" . """" . romPath . "\" . romName . romExtension . "\" . """"
MAMEParam3 := " -cart scdsys -cdrm \""" . romPath . "\" . romName . romExtension . "\"""""
} Else {
; Build a key/value object containing the different MAMEParam3 choices
MAMEP3 := Object("alice32","cass1","gp32","memc","cpc464","cass","spectrum","cass","dragon64","cass","cdimono1","cdrom","bk0010","cass","neocd","cdrom","neocdz","cdrom","saturn","cdrm","saturnjp","cdrm","svi328n","cass","pecom64","cass","psu","cdrm","svmu","quik","gamecom","cart1","mbeeic","quik1")
MAMEParam3 := MAMEP3[retroMAMEID] ; search object for the retroMAMEID pair
MAMEParam3 := " -" . (If MAMEParam3 ? MAMEParam3 : "cart") . " \" . """" . romPath . "\" . romName . romExtension . "\" . """"
}
If (retroMAMEID = "mbeeic") ; Applied Technology MicroBee
{ microbeeModel := IniReadCheck(MAMESysINI, romName, "MicroBee_Model","mbeeic",,1)
If microbeeModel not in mbee,mbeeic,mbeepc,mbeepc85,mbee56
ScriptError("This is not a known MicroBee model value: " . microbeeModel)
Else If (microbeeModel != "mbeeic")
retroMAMEID := microbeeModel
If romExtension in .mwb,.com,.bee
mediaDeviceType := "quik1"
Else If romExtension in .wav,.tap
mediaDeviceType := "cass"
Else If romExtension in .rom
mediaDeviceType := "cart"
Else If romExtension in .dsk
mediaDeviceType := "flop1"
Else ; .bin format
mediaDeviceType := "quik2"
MAMEParam3 := " -" . mediaDeviceType . " \" . """" . romPath . "\" . romName . romExtension . "\" . """"
}
fullRomPath := MAMEParam1 . MAMEParam2 . MAMEParam3
}
} Else If (superGB = "true") {
RLLog.Info("Module - Retroarch Super Game Boy mode enabled")
fullRomPath := " """ . sgbRomPath . """ --subsystem sgb """ . romPath . "\" . romName . romExtension . """"
} Else {
RLLog.Info("Module - Retroarch standard mode enabled")
fullRomPath := " """ . romPath . "\" . romName . romExtension . """"
}
If (retroID = "LibRetro_NFDS") ; Nintendo Famicom Disk System
{ disksysRom := new File(retroSysDir . "\disksys.rom")
If !disksysRom.Exist()
ScriptError("RetroArch requires ""disksys.rom"" for " . retroSystem . " but could not find it in your system_directory: """ . retroSysDir . """")
} Else If (retroID = "LibRetro_SCD") ; Sega CD
{ If !StringUtils.Contains(romExtension, "\.bin|\.cue|\.iso")
ScriptError("RetroArch only supports Sega CD games in bin|cue|iso format. It does not support:`n" . romExtension)
biosCDEBin := new File(retroSysDir . "\bios_CD_E.bin")
biosCDUBin := new File(retroSysDir . "\bios_CD_U.bin")
biosCDJBin := new File(retroSysDir . "\bios_CD_J.bin")
If !biosCDEBin.Exist()
ScriptError("RetroArch requires ""bios_CD_E.bin"" for " . retroSystem . " but could not find it in your system_directory: """ . retroSysDir . """")
If !biosCDUBin.Exist()
ScriptError("RetroArch requires ""bios_CD_U.bin"" for " . retroSystem . " but could not find it in your system_directory: """ . retroSysDir . """")
If !biosCDJBin.Exist()
ScriptError("RetroArch requires ""bios_CD_J.bin"" for " . retroSystem . " but could not find it in your system_directory: """ . retroSysDir . """")
} Else If StringUtils.Contains(retroID,"LibRetro_PCECD|LibRetro_TGCD") ; NEC PC Engine-CD and NEC TurboGrafx-CD
{ If !StringUtils.Contains(romExtension,"\.chd")
ScriptError("RetroArch only supports " . retroSystem . " games in chd format. It does not support:`n" . romExtension)
sysCard3Pce := new File(retroSysDir . "\syscard3.pce")
If !sysCard3Pce.Exist()
ScriptError("RetroArch requires ""syscard3.pce"" for " . retroSystem . " but could not find it in your system_directory: """ . retroSysDir . """")
} Else If (retroID = "LibRetro_PCFX")
{ If !StringUtils.Contains(romExtension,"\.chd")
ScriptError("RetroArch only supports " . retroSystem . " games in chd format. It does not support:`n" . romExtension)
pcfxBios := new File(retroSysDir . "\pcfx.bios")
If !pcfxBios.Exist()
ScriptError("RetroArch requires ""pcfx.bin"" for " . retroSystem . " but could not find it in your system_directory: """ . retroSysDir . """")
} Else If (retroID = "LibRetro_SCUMM")
{
scummFile := new File(romPath . "\" . romName . ".scummvm")
If !scummFile.Exist()
scummFile.Append("""" . romName . """")
}
networkSession := ""
If (enableNetworkPlay = "true") {
RLLog.Info("Module - Network Multi-Player is an available option for " . dbName)
netplayNickname := moduleIni.Read("Network", "NetPlay_Nickname","Player",,1)
getWANIP := moduleIni.Read("Network", "Get_WAN_IP","false",,1)
If (getWANIP = "true")
myPublicIP := GetPublicIP()
RLLog.Warning("Module - CAREFUL WHEN POSTING THIS LOG PUBLICLY AS IT CONTAINS YOUR IP ON THE NEXT LINE")
defaultServerIP := moduleIni.Read("Network", "Default_Server_IP", myPublicIP,,1)
defaultServerPort := moduleIni.Read("Network", "Default_Server_Port",,,1)
lastIP := moduleIni.Read("Network", "Last_IP", defaultServerIP,,1) ; does not need to be on the ISD
lastPort := moduleIni.Read("Network", "Last_Port", defaultServerPort,,1) ; does not need to be on the ISD
mpMenuStatus := MultiPlayerMenu(lastIP,lastPort,networkType,,0)
If (mpMenuStatus = -1) { ; if user exited menu early
RLLog.Warning("Module - Cancelled MultiPlayer Menu. Exiting module.")
ExitModule()
}
If networkSession {
RLLog.Info("Module - Using a Network for " . dbName)
moduleIni.Write(networkPort, "GlobalModuleIni", "Network", "Last_Port")
; msgbox lastIP: %lastIP%`nlastPort: %lastPort%`nnetworkIP: %networkIP%`nnetworkPort: %networkPort%
If (networkType = "client") {
moduleIni.Write(networkIP, "GlobalModuleIni", "Network", "Last_IP") ; Save last used IP and Port for quicker launching next time
netCommand := " -C " . networkIP . " --port " . networkPort . " --nick """ . netplayNickname . """" ; -C = connect as client
} Else { ; server
netCommand := " -H --port " . networkPort . " --nick """ . netplayNickname . """" ; -H = host as server
}
RLLog.Warning("Module - CAREFUL WHEN POSTING THIS LOG PUBLICLY AS IT CONTAINS YOUR IP ON THE NEXT LINE")
RLLog.Info("Module - Starting a network session using the IP """ . networkIP . """ and PORT """ . networkPort . """")
} Else
RLLog.Info("Module - User chose Single Player mode for this session")
}
BezelStart(,,(If rotateBezel ? 1:""))
If foundCfg {
If (stretchToFillBezel = "true" and bezelEnabled = "true" and bezelPath)
{
customViewportWidth := bezelScreenWidth
customViewportHeight := bezelScreenHeight
customViewportX := 0
customViewportY := 0
aspectRatioIndex := 22
RLLog.Info("Stretching viewport to fit bezel")
}
raCfgHasChanges := ""
WriteRetroProperty("input_overlay", overlay)
WriteRetroProperty("video_shader", videoShader)
WriteRetroProperty("aspect_ratio_index", aspectRatioIndex)
WriteRetroProperty("custom_viewport_width", customViewportWidth)
WriteRetroProperty("custom_viewport_height", customViewportHeight)
WriteRetroProperty("custom_viewport_x", customViewportX)
WriteRetroProperty("custom_viewport_y", customViewportY)
WriteRetroProperty("video_rotation", rotation)
WriteRetroProperty("video_crop_overscan", cropOverscan)
WriteRetroProperty("video_threaded", threadedVideo)
WriteRetroProperty("video_vsync", vSync)
WriteRetroProperty("video_scale_integer", integerScale)
WriteRetroProperty("input_disk_eject_toggle", ejectToggleKey)
WriteRetroProperty("input_disk_next", nextDiskKey)
WriteRetroProperty("input_disk_prev", prevDiskKey)
If StringUtils.Contains(retroID, "LibRetro_PSX") {
Loop, 8 ; Loop 8 times for 8 controllers
{ p%A_Index%ControllerType := moduleIni.Read(romName . "|" . systemName, "P" . A_Index . "_Controller_Type", 517,,1)
WriteRetroProperty("input_libretro_device_p" . A_Index, p%A_Index%ControllerType)
}
}
If raCfgHasChanges {
RLLog.Info("Module - Saving changed settings to: """ . retroCFGFile.FileFullPath . """")
SaveProperties(retroCFGFile.FileFullPath, retroCFG)
}
}
fullscreen := If fullscreen = "true" ? " -f" : ""
srmPath := new Folder(emuPath . "\srm\" . retroSystem) ; path for this system's srm files
saveStatePath := new Folder(emuPath . "\save\" . retroSystem) ; path for this system's save state files
retroCFGFileCLI := If foundCfg ? " -c """ . retroCFGFile.FileFullPath . """" : ""
If !srmPath.Exist("folder")
srmPath.CreateDir() ; creating srm dir if it doesn't exist
If !saveStatePath.Exist("folder")
saveStatePath.CreateDir() ; creating save dir if it doesn't exist
HideAppStart(hideEmuObj,hideEmu)
If (StringUtils.Contains(core, "^(mame|mess|ume)") && (retroMAMEID != "mame")) { ; if a MAME/MESS/UME core is used
primaryExe.Run(" """ . (retroMAMEID ? retroMAMEID : "") . fullRomPath . """ " . fullscreen . retroCFGFileCLI . " -L """ . libDll . """ -s """ . srmPath.FilePath . "\" . romName . ".srm"" -S """ . saveStatePath.FilePath . "\" . romName . ".state""" . netCommand, "Hide")
} Else If (retroID = "LibRetro_SCUMM") {
primaryExe.Run(" """ . scummFile . """" . fullscreen . retroCFGFileCLI . " -L """ . libDll . """ -s """ . srmPath.FilePath . "\" . romName . ".srm"" -S """ . saveStatePath.FilePath . "\" . romName . ".state""" . netCommand, "Hide")
} Else If (retroID = "LibRetro_SGB" || If superGB = "true") { ; For some reason, the order of our command line matters in this particular case.
primaryExe.Run(fullscreen . retroCFGFileCLI . " -L """ . libDll . """ -s """ . srmPath.FilePath . "\" . romName . ".srm"" -S """ . saveStatePath.FilePath . "\" . romName . ".state""" . fullRomPath . netCommand, "Hide")
} Else If mgM3UFile.Exist() {
primaryExe.Run(" """ . mgM3UFile.FileFullPath . """" . fullscreen . retroCFGFileCLI . " -L """ . libDll . """ -s """ . srmPath.FilePath . "\" . romName . ".srm"" -S """ . saveStatePath.FilePath . "\" . romName . ".state""" . netCommand, "Hide")
} Else {
primaryExe.Run(" " . fullRomPath . fullscreen . retroCFGFileCLI . " -L """ . libDll . """ -s """ . srmPath.FilePath . "\" . romName . ".srm"" -S """ . saveStatePath.FilePath . "\" . romName . ".state""" . netCommand, "Hide")
}
mpMenuStatus := ""
If networkSession {
canceledServerWait := false
multiplayerMenuExit := false
TimerUtils.SetTimer("NetworkConnectedCheck", 500)
If (networkType = "server") {
RLLog.Info("Module - Waiting for a client to connect to your server")
mpMenuStatus := MultiPlayerMenu(,,,,,,,,"You are the server. Please wait for your client to connect.")
} Else { ; client
RLLog.Info("Module - Trying to contact the server to establish a connection.")
mpMenuStatus := MultiPlayerMenu(,,,,,,,,"Attempting to connect to the server...")
}
If (mpMenuStatus = -1) { ; if user exited menu early before a client connected
RLLog.Warning("Module - Cancelled waiting for the " . If (networkType = "server") ? "client to connect" : "server to respond" . ". Exiting module.")
If primaryExe.Process("Exist")
primaryExe.Process("Close") ; must close process as the exe is waiting for a client to connect and no window was drawn yet
ExitModule()
} Else { ; blank response from MultiPlayerMenu, exited properly
RLLog.Info("Module - " . If (networkType = "server") ? "Client has connected" : "Connected to the server")
emuPrimaryWindow.Wait()
emuPrimaryWindow.WaitActive()
}
TimerUtils.SetTimer("NetworkConnectedCheck", "Off")
} Else { ; single player
emuPrimaryWindow.Wait()
emuPrimaryWindow.WaitActive()
}
If (hideConsole = "true")
emuConsoleWindow.Set("Transparent", "On") ; makes the console window transparent so you don't see it on exit
BezelDraw()
HideAppEnd(hideEmuObj,hideEmu)
FadeInExit()
primaryExe.Process("WaitClose")
7zCleanUp()
BezelExit()
FadeOutExit()
ExitModule()
; Writes new properties into the retroCFG if defined by user
WriteRetroProperty(key,value="") {
If (value != "") {
Global retroCFG,raCfgHasChanges
WriteProperty(retroCFG, key, value,1,1)
raCfgHasChanges := 1
}
}
; Used to convert between RetroArch keys and usable data
ConvertRetroCFGKey(txt,direction="read"){
Global emuPath,RLLog
If (direction = "read")
{ newtxt := StringUtils.TrimLeft(txt,1,0) ; removes the " from the left of the txt
newtxt := StringUtils.TrimRight(newtxt,1,0) ; removes the " from the right of the txt
relativeCheck := StringUtils.SubStr(newtxt,1,1,0)
If StringUtils.Contains(relativeCheck,":",0) { ; if the path contains a ":" then it is a relative path
RLLog.Debug("ConvertRetroCFGKey - " . newtxt . " is a relative path")
newtxt := StringUtils.TrimLeft(newtxt,1,0) ; removes the : from the left of the txt
newtxt := AbsoluteFromRelative(emuPath, "." . newtxt) ; convert relative to absolute
}
If StringUtils.Contains(newtxt,"/",0)
newtxt := StringUtils.Replace(newtxt,"/","\",1,,0) ; replaces all forward slashes with backslashes
} Else If (direction = "write")
{ newtxt := """" . txt . """" ; wraps the txt with ""
If StringUtils.Contains(newtxt,"\\",0)
newtxt := StringUtils.Replace(newtxt,"\","/",1,,0) ; replaces all backslashes with forward slashes
} Else
ScriptError("Not a valid use of ConvertRetroCFGKey. Only ""read"" or ""write"" are supported.")
RLLog.Debug("ConvertRetroCFGKey - Converted " . txt . " to " . newtxt)
Return newtxt
}
MultiGame:
KeyUtils.SetKeyDelay(100)
emuPrimaryWindow.Activate()
KeyUtils.Send("{" . ejectToggleKey . " down}{" . ejectToggleKey . " up}") ; eject disc in Retroarch
If (!mgLastRomIndex) {
mgLastRomIndex := mgRomIndex
}
selectedRomIndex := 0
selectedRomIndex := StringUtils.TrimLeft(selectedRomNum, StringUtils.StringLength(mgType,0))
Loop % mgMaxIndex
{
If (m3uRomIndex[A_index] = mgLastRomIndex) {
tempLastRomIndex := A_index
RLLog.Debug("Module - Last index: " . tempLastRomIndex)
}
If (m3uRomIndex[A_index] = selectedRomIndex) {
tempSelectedRomIndex := A_index
RLLog.Debug("Module - Selected index: " . tempSelectedRomIndex)
}
}
mgNewIndex := tempLastRomIndex - tempSelectedRomIndex
If (mgNewIndex < 0) {
mgNewIndex := mgNewIndex * -1
Loop % mgNewIndex
{
RLLog.Debug("Module - Sending the next disk key: " . nextDiskKey)
KeyUtils.Send("{" . nextDiskKey . " down}{" . nextDiskKey . " up}")
}
} Else If (mgNewIndex > 0) {
Loop % mgNewIndex
{
RLLog.Debug("Module - Sending the previous disk key: " . mgNewIndex)
KeyUtils.Send("{" . prevDiskKey . " down}{" . prevDiskKey . " up}")
}
}
KeyUtils.Send("{" . ejectToggleKey . " down}{" . ejectToggleKey . " up}") ; close disc in Retroarch
mgLastRomIndex := selectedRomIndex
Return
NetworkConnectedCheck:
If clientConnected
multiplayerMenuExit := true
Else If emuPrimaryWindow.Exist() {
RLLog.Info("Module - RetroArch session started, closing the MultiPlayer menu")
multiplayerMenuExit := true
}
Return
CloseProcess:
FadeOutStart()
emuPrimaryWindow.Close()
Return
2/
Reste également la possibilité avec un autre émulateur nullDC-Naomi-r150
Manuel d'utilisation de nullDC v1.0.3
-------------------------
Sommaire :
1. Qu'est-ce que c'est ?
2. Configuration système requise
3. Préparation/Autres prérequis
4. Utilisation
5.1. Menus
5.2. Menus spécifiques aux plugins
6. Jeu en réseau
7. Conseils, problèmes connus et solutions possibles
8. À propos
Informations pour les utilisateurs pressés :
Si vous rencontrez des problèmes pour lancer l'émulateur, consultez les sections 2 et 7.
Pour en savoir plus sur les options de l'émulateur, consultez les sections 4 et 5.
L'émulateur est préconfiguré avec des options qui conviennent à la plupart des utilisateurs, mais
elles ne sont ni les plus précises, ni les plus rapides.
Si vous rencontrez des erreurs sur certains jeux, modifiez les options ou
les plugins.
1. Qu'est-ce que c'est ?
--------------
nullDC est un émulateur Dreamcast basé sur des plugins pour les ordinateurs x86 fonctionnant sous Windows.
-- 2. Configuration système requise
-------------------
Configuration minimale :
- Processeur : Tout processeur compatible SSE1 (AMD Athlon XP et versions ultérieures, Intel Pentium 3 et versions ultérieures)
- Carte graphique : Carte graphique compatible DirectX 9 avec prise en charge des textures projetées.
(GeForce MX, ATI Radeon)
- Mémoire vive : 256 Mo
- Système d’exploitation : Windows 2000/XP/2003
- Redistributable de décembre de DirectX 9c La dernière version disponible à ce jour est
ici :
Programme d’installation en ligne :
http://www.microsoft.com/downloads/details.aspx?FamilyID=2da43d38-db71-4c1b
-bc6a-9b6652cd92a3&DisplayLang=en
Programme d’installation hors ligne :
http://www.microsoft.com/downloads/details.aspx?FamilyID=c1367bc3-4676-481a
-bfaa-5c15d1d7199d&DisplayLang=en
- Environnements d’exécution Visual C++ 2005 Service Pack 1. Ils sont disponibles ici :
http://www.microsoft.com/downloads/details.aspx?familyid=200B2FD9-AE1A-4A14
-984D-389C36F85647&displaylang=en
- WinPcap. Il est nécessaire pour l'émulation de modem et n'est pas requis autrement.
Il est disponible ici :
http://www.winpcap.org/install/default.htm
Les exigences ci-dessus sont considérées comme le strict minimum pour exécuter
l'émulateur avec un minimum d'erreurs,
à condition que les plugins/options sélectionnés soient compatibles avec le matériel. L'émulateur risque de mal fonctionner
ou de ne pas fonctionner du tout sur les systèmes ne répondant pas à ces exigences.
Configuration recommandée :
- Processeur : AMD 3000+ ou Intel Pentium 4 à 2,6 GHz ou équivalent.
- Carte graphique : Carte graphique compatible DirectX 9 avec prise en charge du Shader Model 2. (Ge
force FX, ATi Radeon 9600)
- RAM : 512 Mo DDR333 double canal
Les systèmes répondant aux exigences recommandées devraient offrir des performances acceptables pour la plupart des jeux, avec un minimum d'erreurs.
Configuration idéale :
- Processeur : Intel Core 2 Duo rapide ou AMD 4000+ ou équivalent.
- Carte graphique : Carte graphique compatible DirectX 9 avec prise en charge du Shader Model 4 (Ge
force série 8, Radeon série HD).
- RAM : 1 Go DDR400 double canal
Les systèmes répondant aux exigences idéales devraient offrir des performances optimales pour la plupart des jeux, même avec les options les plus exigeantes.
Remarques :
- Certains jeux ont des exigences plus élevées et peuvent rencontrer des problèmes de performances, même sur les systèmes répondant aux exigences recommandées. Dans ce cas, une configuration proche des exigences idéales est nécessaire pour atteindre les performances optimales.
- Les processeurs Pentium 4 exécutent certaines tâches plus lentement que les autres processeurs ; une fréquence d'horloge de 2,6 GHz est donc nécessaire. En revanche, les processeurs Pentium M exécutent les mêmes tâches beaucoup plus rapidement.
(Un Pentium M 750 à 1,86 GHz devrait suffire pour atteindre la pleine vitesse).
Les processeurs Intel Celeron et AMD Duron sont lents et leurs performances devraient être inférieures.
à celles des autres.
- nullDC fonctionnera sous Windows Vista. Cependant, la configuration matérielle requise sera légèrement supérieure à celle mentionnée ci-dessus et des problèmes de son sont probables (comme pour de nombreuses autres applications fonctionnant sous Vista).
3. Préparation/Autres exigences
----------------------------------
Avant d'exécuter l'émulateur, assurez-vous de disposer des fichiers nécessaires du BIOS Dreamcast, du système d'exploitation et de la mémoire Flash, extraits de votre Dreamcast.
Le BIOS doit être nommé « dc_boot.bin » et la mémoire Flash « dc_flash.bin ».
Ces deux fichiers doivent être placés dans le répertoire « Data », situé à l'emplacement d'installation de l'émulateur.
L'émulateur ne pourra pas se charger si ces fichiers sont absents. Veuillez noter que les disques Dreamcast originaux (GD-ROM) sont des disques spéciaux qui ne sont pas compatibles avec les lecteurs DVD/CD PC classiques.
De ce fait, il est impossible de les exécuter directement sur un émulateur.
La seule solution est d'en faire une copie de sauvegarde (un dump) à l'aide de méthodes spécifiques, soit avec une Dreamcast, soit avec un lecteur DVD/CD PC modifié.
4. Utilisation
--------
Lancer l'émulateur et sélectionner « Options → Sélectionner les plugins » ouvrira le menu de sélection des plugins.
Voici la liste des plugins fournis avec l'émulateur :
- Plugins PowerVR (Graphiques) :
« nullPVR » est le plugin graphique créé par l'équipe nullDC. C'est le plugin graphique recommandé.
« Chankast's video » est un portage du noyau PowerVR (graphiques) utilisé sur Chankast (un autre excellent émulateur Dreamcast).
MEmu := "NullDC"
MEmuV := "r150"
MURL := [""]
MAuthor := ["Ibn"]
MVersion := ""
MCRC := ""
iCRC := ""
MID := ""
MSystem := ["Sega Naomi","Sammy Atomiswave"]
;----------------------------------------------------------------------------
;
;----------------------------------------------------------------------------
StartModule()
BezelGUI()
FadeInStart()
BezelStart()
Run, %emuPath%.\nullDC_Win32_Release-NoTrace.exe
settingsFile := modulePath . "\" . moduleName . ".ini"
nullDCcfg := checkFile(emuPath . "\nullDC.cfg")
rom= %romPath%\%romName%%romExtension%
Sleep, 2000
Send, !{f}
Send, {enter}
Sleep, 2000
Send, %rom% ; sends rompath romfile from exe syntax
Send, {enter}
#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn ; Enable warnings to assist with detecting common errors.
SendMode Input ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory.
MyPath = C:\Program Files (x86)\iRotate\iRotate.exe
#+!Up::
Run %MyPath% /2:rotate=0
Return
#+!Down::
Run %MyPath% /2:rotate=180
Return
#+!Left::
Run %MyPath% /2:rotate=270
Return
#+!Right::
Run %MyPath% /2:rotate=90
Return
BezelDraw()
FadeInExit()
BezelExit()
Process("WaitClose", executable)
FadeOutExit()
ExitModule()
CloseProcess:
Process, Close, %executable%
FadeOutStart()
Sleep, 300
if winc_presses = 2 ; The key was pressed twice
SendInput {Esc}{Esc}
Return
à condition de posséder les fichiers lst nécessaires au démarrage des
ROMs bin ou dat
| nullDC_Naomi-r150.zip |
| null_DC.png |
exemple LST:
Nom du jeu
"bin-file-name", 0x0000000, <longueur du bin-file-name>
- Regardez la taille du fichier
(Propriétés du clic droit)
copiez le nombre en octets
puis dans la calculatrice windows
dans la vue menu sélectionnez scientifique
collez le nombre
et cliquez dans HEX
puis changez 0x0000000 en l'
exemple de valeur HEX souhaité :
Game123456 "Game123456", 0x0000000, 0x0 "0000000" (Insérez la valeur HEX souhaitée dans le devis)
exemple:
Game123456
"Game123456.bin or dat", 0x0000000, 0x01234567
| Akatsuki Bk Ausf Achse.dat |
| Akatsuki Bk Ausf Achse.lst |
| Animal Basket.bin |
| Animal Basket.lst |
| Atomiswave.dat |
| Azumanga Daioh Puzzle Bobble.dat |
| Azumanga Daioh Puzzle Bobble.lst |
| Bass Fishing Challenge.bin |
| Bass Fishing Challenge.lst |
| Beach Spikers.bin |
| Beach Spikers.lst |
| Border Down (Rev A).dat |
| Border Down (Rev A).lst |
| Capcom vs SNK 2 Millionaire Fighting 2001 (Rev A).dat |
| Capcom vs SNK 2 Millionaire Fighting 2001 (Rev A).lst |
| Capcom vs SNK Millenium Fight 2000 Pro.dat |
| Capcom vs SNK Millenium Fight 2000 Pro.lst |
| Capcom_Vs_SNK_2_Millionaire_Fighting_2001.bin |
| Chaos Field.dat |
| Chaos Field.txt |
| Clay Challenge.bin |
| Clay Challenge.lst |
| Cleopatra Fortune Plus.dat |
| Cleopatra Fortune Plus.lst |
| Confidential Mission.dat |
| Confidential Mission.lst |
| Cosmic Smash.bin |
| Cosmic Smash.lst |
| Crazy Taxi.lst |
| CrazyTaxi.bin |
| Dead Or Alive 2 Millenium.bin |
| Dead Or Alive 2 Millenium.lst |
| Death Crimson OX.dat |
| Death Crimson OX.txt |
| Demolish Fist.bin |
| Demolish Fist.lst |
| Dirty Pigskin.bin |
| Dirty Pigskin.lst |
| Doki Doki Idol Star Seeker.dat |
| Doki Doki Idol Star Seeker.lst |
| Dolphin Blue.bin |
| Dolphin Blue.lst |
| Dynamic Golf (Virtua Golf) (Japan) (Rev A).cue |
| Dynamite Deka Ex.dat |
| Dynamite Deka Ex.lst |
| Faster Than Speed.bin |
| Faster Than Speed.lst |
| Fist of the North Star.bin |
| Fist of the North Star.lst |
| Force Five.bin |
| Force Five.txt |
| Giant_Gram_EPR-21820_PATCHED.bin |
| Giga Wing 2.bin |
| Giga Wing 2.lst |
| Guilty Gear Isuka.bin |
| Guilty Gear Isuka.lst |
| Guilty Gear Isuka.zip |
| Guilty Gear Reload.zip |
| Guilty Gear X 1.5.bin |
| Guilty Gear X 1.5.lst |
| Guilty Gear X 1.5.zip |
| Guilty Gear XX |
| Guilty Gear XX Accent Core.dat |
| Guilty Gear XX Accent Core.lst |
| Guilty Gear XX Accent Core.zip |
| Guilty Gear XX Reload |
| Guilty Gear XX Reload.lst |
| Guilty Gear XX Slash.dat |
| Guilty Gear XX Slash.lst |
| Guilty Gear XX Slash.zip |
| Guilty Gear XX.lst |
| Guilty Gear XX.zip |
| Gun Spike - Cannon Spike.txt |
| Ikaruga.dat |
| Ikaruga.lst |
| Jambo Safari.bin |
| Jambo Safari.lst |
| Jingi Storm - The Arcade.dat |
| Jingi Storm - The Arcade.lst |
| Karous.dat |
| Karous.lst |
| Kidou Senshi Gundam - Renpou vs. Zeon DX (Japan).cue |
| KingOfFightersNewWave.bin |
| Knights of Valour.bin |
| Kuru Kuru Chameleon .dat |
| Kuru Kuru Chameleon.lst |
| La Keyboardxyu.dat |
| La Keyboardxyu.lst |
| Lupin The Third - The Shooting.dat |
| Lupin The Third - The Shooting.lst |
| Lupin The Third - The Typing (Rev A).dat |
| Lupin The Third - The Typing (Rev A).lst |
| Mamonoro.dat |
| Mamonoro.lst |
| Maximum Speed.bin |
| Maximum Speed.lst |
| Maze of the Kings, The.dat |
| Maze of the Kings, The.lst |
| Melty Blood Act Cadenza (Rev C).dat |
| Melty Blood Act Cadenza (Rev C).lst |
| Melty Blood Act Cadenza Ver B (Rev A).lst |
| Melty Blood Act Cadenza Ver B.dat |
| Melty Blood Act Cadenza Ver B.lst |
| Metal Slug 6.bin |
| Metal Slug 6.lst |
| Mobile Suit Gundam - Federation VS Zeon DX.dat |
| Mobile Suit Gundam - Federation VS Zeon DX.lst |
| Mobile Suit Gundam - Federation VS Zeon.dat |
| Mobile Suit Gundam - Federation VS Zeon.lst |
| Moeru Casinyo ~ Burning Casino.dat |
| Moeru Casinyo ~ Burning Casino.lst |
| Monkey Ball.dat |
| Monkey Ball.lst |
| Musapey's Choco Marker (Rev A).lst |
| Musapeys Choco Marker.dat |
| Naomi 2.dat |
| Naomi GD-ROM.dat |
| Neo Geo Battle Colliseum.bin |
| Neo Geo Battle Colliseum.lst |
| Noukone Puzzle Takoron.dat |
| Noukone Puzzle Takoron.lst |
| Power Stone 2.bin |
| Power Stone 2.lst |
| Power Stone.bat |
| Power Stone.bin |
| Power Stone.lst |
| Psyvariar 2 - The Will To Fabricate.dat |
| Psyvariar 2 - The Will To Fabricate.lst |
| Puyo Pop Fever (World).cue |
| Puyo Puyo Fever.dat |
| Puyo Puyo Fever.lst |
| Puzzle Takoron.dat |
| Quiz Ah Megamisama.dat |
| Quiz Ah Megamisama.lst |
| Quiz Ah My Goddess.dat |
| Quiz Keitai Q mode.dat |
| Quiz Keitai Q mode.lst |
| Radilgy Noir.dat |
| Radilgy Noir.lst |
| Radirgy.lst |
| Rival Schools 2 - Project Justice.bin |
| Rival Schools 2 - Project Justice.lst |
| Rumble Fish 2.lst |
| Rumble Fish.bin |
| Rumble Fish.lst |
| Salaryman Kintaro.bin |
| Salaryman Kintaro.lst |
| Salaryman Kintaro.zip |
| Samurai Showdown VI - Samurai Spirits.bin |
| Samurai Showdown VI - Samurai Spirits.lst |
| Sega Strike Fighter (Rev A).dat |
| Sega Strike Fighter (Rev A).lst |
| SegaTetris.bin |
| Senko No Ronde NEW ver. (Rev A).dat |
| Senko No Ronde NEW ver. (Rev A).lst |
| Senko No Ronde NEW ver. (Rev A).zip |
| Senko No Ronde Special.dat |
| Senko No Ronde Special.lst |
| Senko No Ronde Special.zip |
| Senko No Ronde.dat |
| Senko No Ronde.lst |
| Senko No Ronde.zip |
| Shikigami No Shiro II ~ The Castle of Shikigami II.dat |
| Shikigami No Shiro II ~ The Castle of Shikigami II.lst |
| Shooting Love 2007.dat |
| Shooting Love 2007.lst |
| Slashout.bin |
| Slashout.dat |
| Slashout.lst |
| Spikers Battle.dat |
| Spikers Battle.lst |
| SpikersBattle.bin |
| Sports Jam.dat |
| Sports Jam.lst |
| SportsJam.bin |
| Super Shanghai 2005 (Rev A).dat |
| Super Shanghai 2005 (Rev A).lst |
| Super Shanghai 2005.dat |
| Super Shanghai 2005.lst |
| Sushi Bar.bin |
| Sushi Bar.lst |
| Tetris Kiwamemichi.dat |
| Tetris Kiwamemichi.lst |
| The King of Fighters XI (All Fighters).bin |
| The King of Fighters XI (All Fighters).lst |
| The Maze of the Kings.dat |
| The Maze of the Kings.lst |
| Tokyo Bus Tour.bin |
| Tokyo Bus Tour.lst |
| Toy Fighter.dat |
| Toy Fighter.lst |
| ToyFighter.bin |
| Trigger Heart Exelica (Rev A).dat |
| Trigger Heart Exelica (Rev A).lst |
| Trizeal.dat |
| Trizeal.lst |
| UnderDefeat.dat |
| UnderDefeat.lst |
| Usagui - Yamashiro Mahjong Hen.dat |
| Usagui - Yamashiro Mahjong Hen.lst |
| Violent Metal Slug 6.rar |
| Virtua Athletics - Virtua Athlete.dat |
| Virtua Athletics - Virtua Athlete.lst |
| Virtua Golf - Dynamic Golf.dat |
| Virtua Golf - Dynamic Golf.lst |
| Virtua NBA.bin |
| Virtua NBA.dat |
| Virtua NBA.lst |
| Virtua Striker 3 (Japan).cue |
| Virtua Tennis - Power Smash.cue |
| Virtua Tennis - Power Smash.dat |
| Virtua Tennis - Power Smash.lst |
| Virtua Tennis 2 - Power Smash 2 (Rev A).dat |
| Virtua Tennis 2 - Power Smash 2 (Rev A).lst |
| VirtuaStriker2-2000.bin |
| VirtuaTennis.bin |
| VirtuaTennis.lst |
| World Series Baseball - Super Major League.dat |
| World Series Baseball - Super Major League.lst |
| airlbios.zip |
| akatsukibk.bin |
| alpilot.bin |
| alpilot.txt |
| azumanga.bin |
| bdrdown.bin |
| cfield.bin |
| chocomk.bin |
| cleoftp.bin |
| confmiss.bin |
| cvs2gd.bin |
| cvsgd.bin |
| dc.zip |
| dygolf.bin |
| dyndekaex.bin |
| gdrom-ftspeed_v6.bin |
| gdrom_KOFXI_controles_JVS_OK_Video_OK_v4.bin |
| gdrom_sprtshot_v11.bin |
| ggxx.bin |
| ggxxac.bin |
| ggxxrl.bin |
| ggxxsla.bin |
| gundmgd.bin |
| gundmxgd.bin |
| ikaruga.bin |
| jingystm.bin |
| karous.bin |
| keyboard.bin |
| kofnw.lst |
| kurucham.bin |
| lupinsho.bin |
| luptype.bin |
| mamonoro.bin |
| melty_blood_act_cadenza.dat |
| melty_blood_act_cadenza_vb2.dat |
| meltyb.bin |
| meltyba.bin |
| meltybld.bin |
| mie.zip |
| moeru.bin |
| mok.bin |
| monkeyba.bin |
| mvsc2gd.bin |
| ngdup23a.zip |
| ngdup23c.zip |
| psyvar2.bin |
| puyofev.bin |
| quizqgd.bin |
| radilgy.dat |
| radirgy.bin |
| radirgynoa.bin |
| rumblef2.bin |
| rumblef2.lst |
| senko.bin |
| senkoo.bin |
| senkosp.bin |
| settings.dc |
| sfz3ugd.bin |
| sfz3ugd.dat |
| sfz3ugd.lst |
| shaktamb.bin |
| shikgam2.bin |
| shootlove.bin |
| spkrbtl.bin |
| sprtjam.bin |
| ss2005.bin |
| ss2005a.bin |
| starseek.bin |
| takoron.bin |
| tetkiwam.bin |
| trgheart.bin |
| trizeal.bin |
| undefeat.bin |
| usagui.bin |
| vathlete.bin |
| vtennis2.bin |
| vtennisg.bin |
| wsbbgd.bin |
| CAPCOM VS SNK PRO.zip |
| Gundam DX.zip |
| Gundam.zip |
| IkaRuka.zip |
| Jingi Storm.zip |
| Marvel vs. Capcom 2 New Age of Heroes.zip |
| Melty Blood.zip |
| Spikers Battle.zip |
| Sports Jam.zip |
| Super Shangai 2005.zip |
| Virtua Athlete.zip |
| cvs2gd.zip |
NAOMI_3D_BOXES.zip |
| NAOMI_DISCS.zip |
3/
DEMUL
[Guide] Demul v0.7A (31.07.15) (Dreamcast Emulator) - Configuration.
Demul est un émulateur multi-systèmes qui prend en charge les plateformes suivantes :
Dreamcast, Naomi, Naomi 2, Atomis Wave, Hikaru, Cave CV1000 et Gaelco , mais
dans ce guide, nous nous concentrerons uniquement sur Dreamcast .
Au début, l'émulateur n'était pas très bon, mais grâce au travail constant de
quelques personnes, on peut dire
qu'il a finalement atteint un stade de développement assez mature, suffisant pour exécuter
un grand nombre de titres de manière acceptable. ou pratiquement parfait.
L'une des principales vertus de Demul est ses plugins vidéo basés sur l'API
D3D11 , qui corrigent ces problèmes fastidieux
liés àtransparences et ombres , anomalies subies par d'autres émulateurs
(Chankast, nullDC, Makaron, etc).
Une autre qualité à souligner est le support de Windows CE ,requis par certains jeux
comme Resident Evil 2 , Tomb Raider 4: The Last Revelation , etc. ,
en voici une liste très complète.
"Certains jeux Dreamcast nécessitent la prise en charge de WinCE"
J'ai analysé les différences avec nullDC dans cet article.
Considérations à garder à l'esprit avec Demul.
1) Dans les dernières versions , la prise en charge des GPU D3D10 a été supprimée ,
même s'il y en a ; l'émulation serait beaucoup plus lente et incorrecte par rapport à D3D11 ,
principalement pour cette raison :
" Besoin de transparence indépendant de l'ordre pour dreamcast. Idéal Oit besoin de Directx11. Directx10
" Besoin de transparence indépendant de l'ordre pour dreamcast. Idéal Oit besoin de Directx11. Directx10
ne supporte que 8 ou 16 (très lent) couches avec plus d'erreur sur la carte vidéo nvidia. "
Explication :
Transparence indépendante de l'ordre(Oit) est une technique; nécessaire pour dessiner correctement
Explication :
Transparence indépendante de l'ordre(Oit) est une technique; nécessaire pour dessiner correctement
les transparences et les ombres (entre autres effets) dans une scène, afin d'obtenir une émulation Dreamcast
correcte. L'implémentation idéale nécessite D3D11 , puisque D3D10 ne peut supporter qu'entre
8 et 16 couches de transparence (couches) avec de très faibles performances et de nombreuses erreurs
sur les GPU nVidia. De plus, cette quantité est insuffisante pour réaliser une émulation
correcte, il existe des jeux qui nécessitent au moins 32 couches de transparence et le cas
de Shenmue (I, II) 64 couches .
Le principal problème est que ce processus est extrêmement exigeant (utilisant beaucoup
Le principal problème est que ce processus est extrêmement exigeant (utilisant beaucoup
de ressources GPU) même sur des cartes vidéo haut de gamme., comme la série
actuelle Geforce GTX980 / Radeon FuryX .
Seuls quelques jeux PC utilisent cette méthode ; le plus connu est Tomb Raider (2013)
Seuls quelques jeux PC utilisent cette méthode ; le plus connu est Tomb Raider (2013)
avec sa technologie innovante TressFX .
Malheureusement, à l'heure actuelle, il n'existe pas (ou n'est pas encore connu)
Malheureusement, à l'heure actuelle, il n'existe pas (ou n'est pas encore connu)
d'autre méthode pour émuler le type de translucidité ( Translucency ) utilisé par le GPU
" PowerVR Series 2 (CLX)" , il convient de mentionner que Dreamcast prend en charge
le matériel accéléré Oit .
Mais au moins, le monde du hardware graphique avance de jour en jour ; tous les GPU
Mais au moins, le monde du hardware graphique avance de jour en jour ; tous les GPU
actuels (2009+) prennent en charge D3D11, et au fil du temps la puissance brute
s'améliorera beaucoup plus, peut-être qu'un jour cette fonction ne sera plus
un problème, ou peut-être qu'une autre méthode plus optimale sera découverte
grâce aux nouvelles API D3D12 / Vulkan .
2) J'ai remarqué que le filtre anisotrope
2) J'ai remarqué que le filtre anisotrope
ne fonctionne pas, peut-être parce qu'une
tentative a été faite pour émuler le mipmapping (?)
Plus précisément . Bien que dans les versions 0.7A
cela ait fonctionné à nouveau, c'est peut-être à cause du pilote vidéo (?)
Ou cela peut même dépendre du jeu (?).
Sur cette image agrandie on peut remarquer l'absence de filtre anisotrope
Sur cette image agrandie on peut remarquer l'absence de filtre anisotrope
(en le forçant encore) :
6) Demul n'utilise qu'un seul cœur (au moins sur Dreamcast ).
7) Les utilisateurs de GPU AMD ont détecté des défaillances graphiques dans certains jeux
3) L'émulateur nécessite un GPU très puissant avec beaucoup
de VRAM disponible , surtout lorsqu'on utilise
de nombreuses couches de transparence (supérieures à 16 couches) et encore plus
si une résolution interne supérieure à la résolution native (2x +) est utilisée, donc
Je recommande moins 3 Go de VRAM et un GPU qui peut le gérer
efficacement, peut-être que les futures mémoires HBM2 vous aideront.
4) Dans les versions 0.7A, le son s'est beaucoup amélioré !
4) Dans les versions 0.7A, le son s'est beaucoup amélioré !
maintenant, cela ressemble plus à du vrai matériel,
mais vous remarquez toujours le bug étrange.
De plus, le son est lié à la vitesse d'émulation (synchrone)
à l'aide de l'étirement du son , puis, si
le baisse de la fréquence d'images, le son est instantanément déformé.
5) Lorsque l'émulateur est exécuté en mode fenêtre, vous pouvez voir
l'écran VMU , mais il n'y a toujours pas d'option
pour l'afficher en mode plein écran, cette fonction est essentielle, car il existe
des jeux qui montrent des progrès ou des astuces dans ce domaine. L'interface manque encore de travail.
6) Demul n'utilise qu'un seul cœur (au moins sur Dreamcast ).
Pour cette raison, il est très important d'avoir un processeur
à hautes performances par cœur ( IPC ) et, si possible, de fonctionner à des fréquences élevées
(3,5 GHz +). C'est une règle de base pour la plupart des émulateurs existants.
7) Les utilisateurs de GPU AMD ont détecté des défaillances graphiques dans certains jeux
(textures anormales). Celles-ci sont attribuées aux "optimisations" (Hacks) qu'AMD a incluses
dans leurs pilotes, cependant, il est toujours conseillé de les maintenir à jour.
8) Dans l'émulateur, les jeux prenant en charge WinCE sont limités
8) Dans l'émulateur, les jeux prenant en charge WinCE sont limités
en CPU , en utilisant 100%, dans certains cas, la vitesse maximale
n'est pas atteinte, et comme Demul n'occupe qu'un seul cœur, le problème est encore amplifié.
Utilisation et configuration en Demul 0.7A.
Pour exécuter l'émulateur, Visual C++ 2010 x86 doit être installé sur notre ordinateur.
La dernière version de Demul l' obtenir d'ici t LSO besoin du bios .
Utilisation et configuration en Demul 0.7A.
Pour exécuter l'émulateur, Visual C++ 2010 x86 doit être installé sur notre ordinateur.
La dernière version de Demul l' obtenir d'ici t LSO besoin du bios .
Ces fichiers compressés ( .7zip ) doivent être copiés dans le dossier roms .
Lorsque nous exécutons l'émulateur, la fenêtre suivante s'ouvrira.
Fenêtre principale:
Lorsque nous exécutons l'émulateur, la fenêtre suivante s'ouvrira.
Fenêtre principale:
Comme dans nullDC ; nous avons des tabulations menus de type , ce qui est bon puisque
nous sommes plus familiers avec ces maintenant.
Les touches de raccourci par défaut sont :
Alt + Entrée : Bascule du mode fenêtré au mode plein écran (ou vice versa).
Alt + F4 : Fermez l'émulateur.
F3 : Il affiche/masque le menu (fonctionne uniquement en mode fenêtré).
F5 : Fait pivoter l'écran à 90° / 180° et 270° .
F6 : modifiez le rapport d' aspect (rapport d'aspect) en temps réel , les modes autorisés sont Strech
(étiré) 4: 3 et 16: 9 .
Fichier:
À partir de là, l'émulation des plates-formes prises en charge commence .
Enregistrer les États :
L'émulateur prend en charge la fonction Save States . Les touches
doivent être affectées dans le menu Config >>> Commandes .
REMARQUE : je vous rappelle que leur utilisation peut provoquer
un plantage , ajouté au problème que dans certaines versions cette option
est cassée, à utiliser avec prudence.
Configuration :
Dans cet onglet, nous pouvons accéder à la configuration de l'émulateur.
[Vidéo]
Avant de continuer, il est nécessaire de comprendre comment
fonctionne le GPU Dreamcast (ou presque n'importe quel autre) :
1- La première étape effectuée par un GPU ; est de collecter les textures
et la géométrie nécessaires pour un rendu ultérieur.
2- Une fois terminé, le GPU commence à rendre et à dessiner une scène.
3- L'image rendue est stockée dans la mémoire vidéo (VRAM), pendant le processus ;
Cela peut être mis à l' échelle , obtenir des données de couleur
et les transformer au format cible en utilisant le tramage, etc.
4- Le processeur SH4 peut lire ou écrire des données / informations vers (ou depuis)
l'image précédemment rendue, un processus appelé CPU Framebuffer Access .
5- Une ou plusieurs trames peuvent être lues ultérieurement à partir
de la mémoire vidéo (étape 3). Ce qui sera établi comme source
pour la sortie vidéo et sera finalement
ce qui est affiché à l'écran , pouvant utiliser une mise à l'échelle matérielle
optionnelle si nécessaire / nécessaire.
L'émulation des effets graphiques réalisés dans le frame buffer est indispensable
pour visualiser correctement les jeux. Il est très courant de voir
que la plupart des émulateurs modernes n'ont pas cette fonction ; par exemple.
Project64 (Jabo, Glide, etc.). Dans N64, il existe des jeux qui effectuent certains effets à ce stade
(par exemple, Perfect Dark >
"faisceaux de lumière", Beetle Adventure Racing > "transitions 2D")
et l'émulateur n'est pas en mesure d'effectuer cette tâche, ce qui rend ces jeux incomplets.
Dans le cas particulier de la Dreamcast ; Nous avons Sega Extreme Sports
qui a des effets de soleil spectaculaires, Vigilante8 a des effets de transition
intéressants dans les menus, Rayman2 affiche également des transitions
lorsque nous entrons dans un niveau, dans Silent Scope2,
vous pouvez voir le réticule dessiné sur l'écran VMU ,
qui est en fait une fraction de l'image réelle lue directement à partir de la mémoire vidéo,
Virtua Tennis fait également quelque chose de similaire , et
Dans l'émulateur on peut actuellement choisir deux plugins vidéo :
- gpuDX11 : Ce plugin est le premier à prendre en charge
l'api D3D11 , travaillant actuellement dessus
en corrigeant les fonctions, mais apparemment ses jours sont comptés, puisqu'il
ne prend en charge que les étapes 1 et 2 (décrit précédemment)
affichant immédiatement les informations à l'écran , devant recourir
aux infâmes hacks (connus dans certains émulateurs sous le nom de
« correctifs du jeu » toux toux toux PCSX2 toux toux ) ou des astuces pour obtenir des effets visibles.
- gpuDX11ng (new gen) : Ce plugin est nouveau et "révolutionnaire"
(fini en terme d'émulation) puisqu'en théorie il supporte les 5 étapes (décrit précédemment),
donc il pourrait être possible d' émuler un grand nombre d' effets utilisés dans certains jeux,
réalisant une émulation beaucoup plus précise .
Peut-être qu'à l'avenir ce sera le plugin choisi pour continuer
à travailler dessus , laissant gpuDX11 à ses propres appareils.
La mauvaise chose est qu'il souffre de lacunes, à l'heure actuelle
ce plugin ne supporte pas les résolutions supérieures au natif * (1x),
ni ne supporte les shaders (pour le moment) .
J'ai également remarqué que dans certains jeux,
cela peut être un peu plus exigeant (1x @ 64 couches
- Shenmue 2 dans la 1ère scène du navire).
Bien que si vous êtes un puriste, et que vous avez le bon matériel (moyen/haut de gamme)
c'est votre option ;).
* Et on ne sait pas si un jour je pourrais le supporter. cela demanderait beaucoup de travail.
Voyons maintenant les options de chaque plugin graphique.
Configuration graphique Demul Direct3D11 :
- Résolution Windows : Ici, nous sélectionnons la résolution
que nous utiliserons pour le mode fenêtre .
- V-Sync : Dans cette case vous pouvez désactiver/activer la synchronisation verticale ,
il est très important de garder cette option activée
pour synchroniser les fps avec le taux de rafraîchissement de notre moniteur (Hz),
afin d'obtenir une plus grande fluidité dans l'émulation,
bien que si vous n'avez pas une machine puissante, essayez de l'éteindre.
- Démarrer en plein écran : En ayant cette case automatiquement activée, l'émulation
démarrera en mode plein écran (réel) , avec Alt + Enter vous pourrez entrer et sortir de ce mode.
- Ratio d'aspect : Ici, vous configurez le rapport d'aspect ,
la majorité des jeux Dreamcast sont au 4: 3
(bien que s'il y en a quelques-uns, ils prennent en charge le panoramique)
et vous pouvez le modifier en temps réel en appuyant sur la touche F6 .
- Résolution interne (uniquement disponible avec gpuDX11 )
: Plus la valeur est élevée, meilleure est la qualité de l'image finale,
voici les résolutions internes disponibles :
1x : 640x480 * .
2x : 1280x960.
3x : 1920x1440.
4x : 2560x1920.
5x : 3200x2400.
6x : 3840x2880. * La grande majorité des jeux ont une résolution native de 480p, mais il y en a quelques-uns qui utilisent une résolution interne
plus élevée avec une réduction à 480p,
Wacky Races aurait un IR de 1280x960.
En revanche, le jeu Street Fighter 3 : Third Strike a un IR de 320x240,
1x @ 8 couches
Le problème avec l'augmentation de l'IR est qu'elle nécessite trop de VRAM ,
et si nous utilisons également de nombreuses couches (couches de transparence),
nous pouvons facilement faire s'effondrer l'émulateur en raison du manque de ressources :
Échec de la création du tampon :
Vous pouvez effectuer l'astuce de changer le nombre de couches
une fois que l'émulation a commencé pour essayer
d'échapper aux limites de la mémoire graphique, mais avec le risque conséquent de problèmes
graphiques et de plantage de l'émulateur à tout moment.
Je vous laisse quelques résultats référentiels utilisant le jeu Shenmue (I) ,
pour vous donner une idée de la quantité de VRAM nécessaire :
Testez la Geforce GTX970 3,5 Go VRAM@v355.60 (Win7 SP1 x86) :
1x @ 32 couches : 600 Mo de VRAM.
1x @ 64 couches : 750 Mo de VRAM.
2x @ 32 couches : 1100 Mo de VRAM.
2x @ 64 couches : 1700 Mo de VRAM.
3x @ 32 couches : 1900 Mo de VRAM.
3x @ 64 couches : 3 300 Mo de VRAM.
4x @ 32 couches : 3 100 Mo de VRAM.
En bref, l' IR que nous sélectionnerons dépendra de la quantité de couches utilisées,
de la VRAM disponible et de la puissance de notre GPU , ce dernier est le facteur limitant,
probablement une carte vidéo qui n'existe pas encore est nécessaire ,
bien qu'une Geforce GTX980Ti devrait beaucoup aider.
- Couches max : C'est la quantité de couches de transparence que l'émulateur va utiliser,
les valeurs disponibles sont : 8 , 16 , 32 et 64 , plus c'est mieux , mais l'émulateur
devient beaucoup plus exigeant à chaque augmentation de valeur.
J'ai fait quelques tests avec le jeu Shenmue II dans la scène mythique où Joy
a failli renverser Ryo dans le port avec sa toute nouvelle moto ,
c'est un excellent endroit pour tester l'impact de cette option,
en raison de la grande quantité de fumée qui est généré lorsque les roues de la moto dérapent.
8 couches est une valeur trop faible pour avoir l'un de ces effets ...
1x @ 16 couches
Avec 16 couches Ryo me rappelle beaucoup le protagoniste d' AC : Unity , je ne sais pas pourquoi...
1x @ 32 couches
Avec 32 couches ça a l'air beaucoup mieux, mais ce n'est pas parfait,
il y a quelques erreurs que je n'ai pas pu capturer dans cette image,
1x @ 64 couches :
Enfin avec le maximum de couches appliquées (64 couches) tout est parfait (?).
Fatigué de voir des images ? eh bien tu as de la chance, j'ai fait une vidéo comparative :
Fondamentalement, la valeur qui doit être attribuée dépendra exclusivement du jeu que
nous voulons émuler, en général, avec 32 couches,
des résultats acceptables sont obtenus, comme dans le cas de Shenmue ,
car il n'abuse pas de cette ressource, mais dans Shenmue 2 nous besoin de 64 couches
pour qu'il ait toujours l'air correct. Il doit y avoir d'autres jeux qui avec 16 couches passent bien,
c'est une question de test, même si autant on veut utiliser le maximum de couches,
ce ne sera pas toujours possible, par exemple. cette scène est très exigeante
et vous pouvez déjà
voir de sérieux ralentissements en utilisant 2x @64layers sur une Geforce GTX970 .
REMARQUE : chaque fois que le nombre de couches change ,
vous devez supprimer le dossier "scache" (cache de shader)
pour éviter une éventuelle corruption visuelle .
Le contenu temporaire est stocké dans ce dossier en tant que cache ,
pour cette raison, il est normal que la première fois que
vous lancez un jeu (ou entrez dans une nouvelle zone)
vous remarquez des macro-charges (bégaiement)
la deuxième fois ça devrait aller beaucoup mieux, comme c'est ainsi que fonctionne cet émulateur.
- Effets Shaders (uniquement disponible avec gpuDX11 ) :
Cet émulateur permet d'utiliser jusqu'à deux passes de Shaders , parmi lesquelles sont disponibles :
FXAA , HDR-TV , SCANLINES , CARTOON , RGB DOT et BLUR .
Le choix dépendra des goûts de chacun, par exemple, dans les jeux Shenmue
j'aime à quoi ils ressemblent quand on utilise le shader cartoon .
- Tweaks (uniquement disponible avec gpuDX11ng ) :
Deux options sont disponibles ici ; Activer Translucent Join et Network Sort ,
ce ne sont rien de plus que des optimisations , mais pour l'instant les deux produisent
des anomalies graphiques, je recommande donc de les laisser désactivées.
- Hacks : Ici, nous avons quatre hacks disponibles , mais chacun d'eux ruine l'image,
en particulier les transparences et les ombres .
Ils peuvent être utilisés si vous souhaitez utiliser Demul et que vous n'avez pas une équipe puissante,
le résultat de chaque option dépendra de chaque match.
- Rotation : Permet de faire pivoter l'écran , très utile pour les jeux de shoot-em-up ,
cela peut être fait en temps réel en appuyant sur la touche F5 .
- Blitter Limit Pix/sec : Apparemment cette option n'est utile que pour l'émulation des
jeux de shoot-em-up Cave , donc elle n'apporte aucune modification à l'émulation Dreamcast ,
ou du moins je n'ai pas remarqué qu'elle fait quelque chose (? ).
REMARQUE : il est conseillé de forcer le GPU
à fonctionner au maximum de ses performances
lorsque l'émulateur est actif, car il subit des variations de charge soudaines .
Parfois, la charge GPU
monte beaucoup en une fraction de seconde
laissant derrière elle l'auto-détection des horloges fournie par le pilote vidéo,
générant des ralentissements .
[Du son]
Démul SPU :
- Taille de la mémoire tampon : Pour les systèmes d'exploitation modernes ( Vista +) 2048
est généralement la valeur optimale.
- Désactiver le son : cela désactive tous les sons.
- Désactiver CDDA : Ici, seul l' audio BGM est désactivé .
- Désactiver le DSP : Il désactive certains effets audio utilisés dans des jeux comme Grandia II ,
mais il peut également corriger certains bugs d'émulation
dans le son et augmenter la fréquence d'images si vous n'avez pas un PC puissant.
- Désactiver le filtre : En théorie cela désactive le filtre audio
qui intègre le plugin audio, ce changement peut être fait en temps réel
si l'émulation est maintenue en mode fenêtré, peut-être que cela peut aider dans certains jeux...
- Filtre alternatif : vous permet d' utiliser un filtre audio alternatif ,
peut-être à partir d'une ancienne version de Demul (?).
- Enregistrer le son : En théorie cela permet d' enregistrer l'audio ,
mais il me semble que ce n'est pas activé (?).
[GD-ROM]
Ici, nous avons le choix entre trois plugins :
- gdrCHD : Ce plugin était à l'origine utilisé pour charger uniquement les images CHD ,
mais depuis la mise à jour v0.7 (19/07/2015),
il est recommandé de charger également les images .gdi , en raison des correctifs qu'il intègre,
mais c'est très probable qui ne peut pas charger des images modifiées
(par exemple une image avec une traduction appliquée)
et nous jeter dans le bios de la console, dans ce cas je recommande d'utiliser le plugin gdrImage .
- gdrDemul : Ceci est utilisé pour charger les jeux à partir d'un lecteur physique ou virtuel
(par exemple des outils démons).
- gdrImage : Ce plugin est le plus compatible, puisqu'il charge toutes sortes d'images :
.gdi, .cdi , .mds , .ccd , .nrg et .cue .
Alternativement, il est fortement recommandé d' activer l'option :
« popup this window before start emulation » :
Étant donné que cette fenêtre s'ouvrira à chaque fois que nous démarrons l'émulation,
nous pourrons choisir le chemin où se trouve le jeu.
REMARQUE : je recommande toujours d'utiliser des images .gdi ,
de cette façon vous éviterez certains problèmes.
NOTE2 : Si vous voulez entrer dans le bios
(pour régler l'heure, la date, formater une mémoire, etc.)
vous ne devriez avoir aucune image chargée dans le plugin GD-ROM ,
vous devez cliquer sur "Ejecter" et lancer l'émulation.
[Les contrôles]
padDemul :
Dans cette fenêtre , vous pouvez configurer les h ot les touches (raccourcis),
la zone morte ( zone morte ) du contrôle analogique,
ainsi que la carte chaque bouton sur notre joystick .
Si vous n'êtes pas familier avec le contrôle de la console Dreamcast, je laisse l'image suivante :
Il est très important de NE PAS mapper les boutons étendus
( Analog 2 , Digital 2 , C , D et Z )
car il y a plusieurs jeux que sur la vraie console ;
ils ne prennent pas en charge les contrôles non officiels
avec des fonctions étendues ;
résultant en un contrôle erratique,
par exemple, ils peuvent fonctionner correctement dans les menus,
mais une fois dans le jeu, aucun contrôle de plug-in n'a été détecté, etc.
[Plugins et chemins]
Plugins, Maple et chemins :
Ici, nous pouvons changer les plugins de Video , Sound , GD-ROM , Control et Netplay ,
ainsi que changer les chemins de l'émulateur.
Une erreur typique que font certains utilisateurs
est de mal attribuer les chemins du bios ou à un moment donné,
ils ont déplacé l'émulateur vers un autre dossier,
modifiant les chemins, ce qui pose des problèmes à l'émulateur.
[Gestionnaire de périphériques Mapple]
Dans cette fenêtre, chaque port peut se voir attribuer un Control , Keyboard ,
Lightgun ou Mouse , il permet également
d' activer la fonctionnalité multijoueur local en
ajoutant plus de contrôles (jusqu'à 4).
On peut aussi sélectionner le chemin du VMU/VMS
que l'on veut choisir, au cas où nous en aurions plusieurs créés ou dans des chemins différents :
Et enfin, nous pouvons désactiver l'écran VMU .
À ce stade, je veux m'arrêter pour expliquer que chaque
Joystick Dreamcast avait deux emplacements d'extension :
Les accessoires suivants peuvent y être insérés :
VMU : C'est la mémoire officielle/d'origine, elle avait un écran LCD monochrome .
Il existe un nombre considérable de jeux qui l'utilisent, par exemple dans
Resident Evil Code: Veronica,
nous pouvons voir notre statut sans avoir à entrer dans le menu, dans Shenmue,
nous obtenons des indices sur les boutons sur lesquels
nous devons appuyer lorsqu'ils nous apprennent un nouveau mouvement , etc.
Sa capacité est de 200 blocs où nous pouvons enregistrer des progrès.
Last but not least, la mémoire génère un bip aigu lorsqu'elle a sauvegardé le contenu
(ou lorsqu'une piste est donnée),
dans l'émulateur on l'entend aussi mais très bas, en fait,
beaucoup penseront que c'est un bruit dû à une mauvaise émulation audio.
VMS : Mémoire qui n'a pas d'écran LCD, le plus de ceux-ci est sa plus grande capacité
par rapport à l'original, par ex. Il y avait environ 800 blocs (200x4),
mais ils pouvaient être incompatibles avec un jeu et/ou se comporter de manière erratique
(non détectée) si la mémoire était modifiée au milieu du jeu.
Clavier / Souris : Dreamcast a été un pionnier en matière
d' Internet et de multijoueur en ligne ;
la console série comprenait un modem ( 33,6K , 56K ou un adaptateur haut débit )
avec lequel nous pouvions naviguer "librement" sur le Web en utilisant le navigateur qui intégrait le GD
( PlanetWeb Browser ). Pour cette raison, ces accessoires ont été mis en vente,
en plus il y avait quelques jeux de tir compatibles, comme Quake III Arena .
Microphone (non fonctionnel dans l'émulateur) :
Cet accessoire n'a pas été beaucoup utilisé, il n'est compatible qu'avec une
liste réduite de jeux , parmi lesquels Seaman se démarque .
L'émulateur prend en charge jusqu'à cinq accessoires,
mais je ne recommande pas de mettre plus de deux accessoires
par contrôleur, pour des raisons de compatibilité.
L'autre chose à prendre en compte est qu'il y a des rapports de certains jeux WinCE
qui se comportent/contrôlent de manière erratique ou
ne reconnaissent pas qu'il y a une mémoire insérée .
Dans ces cas, je vous recommande d'essayer d'échanger entre VMU et VMS ,
vous pouvez également désactiver les contrôles qui ne sont pas utilisés...
une de ces prdures a corrigé un bug dans le jeu Tomb Raider 4: The Last Revelation
[Dreamcast Bios]
Ici, nous sélectionnons le bios que nous voulons sélectionner / charger,
je recommande la v1.01d .
Il n'est plus nécessaire de le changer puisque l'émulateur est Region free
(s'il est configuré d'une certaine manière).
[Mode CPU]
Permet de choisir l' émulation CPU , l'option DynaRec
est recommandée pour être la plus rapide.
La version Interpreter est plus précise mais très lente, destinée au débogage et aux tests (blocages).
[Mode vidéo]
En mode Vidéo on peut choisir la sortie vidéo que l' on veut émuler,
Dreamcast disposait d'un accessoire intéressant appelé VGA-BOX
qui délivre une qualité d'image supérieure ( 480p )
par rapport au simple RCA , de nombreux jeux sont compatibles avec
( liste des jeux compatibles ), c'est donc l'option recommandée,
Si vous obtenez le message suivant ( Ce jeu n'est pas compatible avec le câble... ) :
Ils doivent sélectionner les autres modes disponibles : TV (RGB) et TV (VBS/S, RF) .
Par ex. le jeu Vigilante 8 - 2nd Offense ne démarre qu'en mode TV (VBS/S, RF),
donc le pire en terme de qualité d'image.
REMARQUE : Si lorsque vous démarrez un jeu vous voyez un écran de sélection Hz ,
c'est parce que vous avez sélectionné l'un des modes TV ,
il est crucial de savoir qu'il est choisi dès le début,
car cela pourrait être lié aux parties sauvegardées ,
si je me souviens bien, dans Shenmue si un jeu était enregistré en utilisant un mode TV,
alors il n'était pas possible de charger ce jeu en utilisant le mode VGA ,
je ne sais pas s'il s'agit d'un échec d'émulation,
car dans Dreamcast toutes les horloges étaient synchronisées
( CPU, GPU, Inputs, etc) et je n'ai jamais eu l'opportunité de posséder une VGA-BOX.
[Région]
Ici, nous pouvons changer la région de la console (émulée),
mais ce n'est pas nécessaire si nous avons activé les options
Auto Region et Auto Broadcast ensemble,
nous pouvons donc charger des jeux de n'importe quelle région, sans importer le bios sélectionné.
L'option Time Hack permet au bios (flash) de lire la date et l'heure de notre système
et de rester synchronisé de cette manière,
- Pause lorsque le focus est perdu : Lorsque cette option est activée,
l'émulation est arrêtée (en pause) si la fenêtre est en arrière-plan.
MEmu := "Demul"
MEmuV := "v0.7a 221215"
MURL := ["http://demul.emulation64.com/"]
MAuthor := ["djvj","bleasby"]
MVersion := "2.1.10"
MCRC :=
iCRC :=
MID := "636025126320548084"
MSystem := ["Cave 3rd","Gaelco","Gaelco 3D","Sammy Atomiswave","Sega System SP","Sega Dreamcast","Sega Hikaru","Sega Naomi","Sega Naomi 2"]
;----------------------------------------------------------------------------
; Notes:
; Required - control and nvram files setup for each game/control type
; Required - moduleName ini example can be found on GIT in the Demul module folder
; moduleName ini must be placed in same folder as this module if you use the provided example, just be sure to rename it to just Demul.ini first so it matches the module's name
; GDI images must match mame zip names and be extracted and have a .dat extension
; Rom_Extension should include 7z|zip|gdi|cue|cdi|chd|mds|ccd|nrg
; Module will automatically set your rom path for you on first launch
;
; Make sure the awbios, dc, hikaru, naomi, naomi2, saturn.zip bios archives are in any of your rom paths as they are needed to play all the games.
; Set your Video Plugin to gpuDX11 and set your desired resolution there
; In case your control codes do not match mine, set your desired control type in demul, then open the demul.ini and find section PORTB and look for the device key. Use this number instead of the one I provided
; gpuDX10 and gpuDX11 are the only supported plugins. You can define what plugin you want to use for each game in the module settings in RocketLauncherUI
; Read the tooltip for the Fullscreen module setting in RocketLauncherUI on how to control windowed fullscreen, true fullscreen, or windowed mode
; Windowed fullscreen will take effect the 2nd time you run the emu. It has to calculate your resolution on first run.
;
; Controls:
; Start a game of each control type (look in the RocketLauncherUI's module settings for these types, they all have their own tabs) and configure your controls to play the game. After configuring your controls manually in Demul, open padDemul.ini and Copy/paste the JAMMA0_0 and JAMMA0_1 (for naomi) or the ATOMISWAVE0_0 and ATOMISWAVE0_1 (for atomiswave) into RocketLauncherUI's module settings for each controls tab (standard, sfstyle, etc).
; Each pair of control tabs designates another real arcade control schema for a grouping of games. Demul does not handle this like MAME, so the module does instead.
;
; Gaelco:
; There is no known way to launch the desired Gaelco rom from CLI. You will always be presented with the rom selection window on launch.
; GPUDX11 does not yet support Gaelco in true fullscreen mode. Either use DX10 which does support fullscreen for Gaelco
; or if using DX11, choose fullscreen in the video options and then match the windows resolution to your desktop. This will give a pseudo fullscreen mode.
;
; Sega Hikaru:
; Windowed Fullscreen doesn't seem to work as demul does not allow stretching of its window
;
; Troubleshooting:
; For some reason demul's ini files can get corrupted and ahk can't read/write to them correctly.
; If your ini keys are not being read or not writing to their existing keys in the demul inis, create a new file and copy/paste everything from the old ini into the new one and save.
; If you use Fade_Out, the module will disable it. Demul crashes when Fade tries to draw on top of it in windowed and fullscreen modes.
;
;Bezel:
;If the game has the wrong aspect ratio, go to demul module settings, rom settings, and set the aspect ratio option to stretch. The game will follow the aspect ratio defined by the bezel.
;----------------------------------------------------------------------------
StartModule()
BezelGUI()
ExtraFixedResBezelGUI()
FadeInStart()
primaryExe := new Emulator(emuPath . "\" . executable) ; instantiate emulator executable object
emuPrimaryWindow := new Window(new WindowTitle("","window")) ; instantiate primary emulator window object
emuLCD0Window := new Window(new WindowTitle("LCD 0","LCD 0"))
-run=%2% -rom=%1%
sleep 4000
MouseMove, 1920,1080
; This object controls how the module reacts to different systems. Demul can play a few systems, but needs to know what system you want to run, so this module has to adapt.
mType := Object("Cave 3rd","cave3rd","Gaelco","gaelco","Gaelco 3D","gaelco","Sammy Atomiswave","awave","Sega System SP","naomi","Sega Dreamcast","dc","Sega Hikaru","hikaru","Sega Naomi","naomi","Sega Naomi 2","naomi2","Demul Gun Games","awave")
ident := mType[systemName] ; search object for the systemName identifier Demul uses
If !ident
ScriptError("Your systemName is: " . systemName . "`nIt is not one of the known supported systems for this Demul module: " . moduleName)
DemuleIni := new IniFile(emuPath . "\Demul.ini")
demuleIniEncoding := RLObject.getFileEncoding(DemuleIni.FileFullPath)
If demuleIniEncoding {
If (demuleIniEncoding = "ERROR")
RLLog.Warning("Module - Demul.ini set to Read-only and BOM cannot be changed. Check the DLL log for further details: " . DemuleIni.FileFullPath)
Else {
RLLog.Info("Module - Recreating " . DemuleIni.FileFullPath . " as ANSI because UTF-8 format cannot be read")
If RLObject.removeBOM(DemuleIni.FileFullPath)
RLLog.Info("Module - Successfully converted " . DemuleIni.FileFullPath . " to ANSI")
Else
RLLog.Error("Module - Failed to convert " . DemuleIni.FileFullPath . " to ANSI")
}
}
maxHideTaskbar := moduleIni.Read("Settings", "MaxHideTaskbar", "true",,1)
controllerCode := moduleIni.Read("Settings", "ControllerCode", "16777216",,1)
mouseCode := moduleIni.Read("Settings", "MouseCode", "131072",,1)
keyboardCode := moduleIni.Read("Settings", "KeyboardCode", "1073741824",,1)
lightgunCode := moduleIni.Read("Settings", "LightgunCode", "-2147483648",,1)
hideDemulGUI := moduleIni.Read("Settings", "HideDemulGUI", "true",,1)
PerGameMemoryCards := moduleIni.Read("Settings", "PerGameMemoryCards", "true",,1)
memCardPath := moduleIni.Read("Settings", "MemCardPath", emuPath . "\memsaves",,1)
memCardPath := AbsoluteFromRelative(emuPath, memCardPath)
fullscreen := moduleIni.Read(romName . "|Settings", "Fullscreen", "windowedfullscreen",,1)
plugin := moduleIni.Read(romName . "|Settings", "Plugin", "gpuDX11",,1)
shaderUsePass1 := moduleIni.Read(romName . "|Settings", "ShaderUsePass1", "false",,1)
shaderUsePass2 := moduleIni.Read(romName . "|Settings", "ShaderUsePass2", "false",,1)
shaderNamePass1 := moduleIni.Read(romName . "|Settings", "ShaderNamePass1",,,1)
shaderNamePass2 := moduleIni.Read(romName . "|Settings", "ShaderNamePass2",,,1)
listSorting := moduleIni.Read(romName . "|Settings", "ListSorting", "true",,1)
OpaqueMod := moduleIni.Read(romName . "|Settings", "OModifier", "true",,1)
TransMod := moduleIni.Read(romName . "|Settings", "TModifier", "true",,1)
internalResolutionScale := moduleIni.Read(romName . "|Settings", "InternalResolutionScale", "1",,1)
videomode := moduleIni.Read(romName . "|Settings", "VideoMode", "0",,1)
aspectRatio := moduleIni.Read(romName . "|Settings", "AspectRatio", "1",,1)
MaxLayers := moduleIni.Read(romName . "|Settings", "MaxLayers", "32",,1)
demulShooterEnabled := moduleIni.Read(romName . "|Settings", "DemulShooterEnabled", "false",,1)
showVMU := moduleIni.Read("Settings", "showVMU", "true",,1)
VMU1Pos := moduleIni.Read("Settings", "VMU1Pos", "topLeft",,1) ; topRight, topCenter, topLeft, leftCenter, bottomLeft, bottomCenter, bottomRight, rightCenter
VMU2Pos := moduleIni.Read("Settings", "VMU2Pos", "topRight",,1) ; topRight, topCenter, topLeft, leftCenter, bottomLeft, bottomCenter, bottomRight, rightCenter
VMU3Pos := moduleIni.Read("Settings", "VMU3Pos", "bottomLeft",,1) ; topRight, topCenter, topLeft, leftCenter, bottomLeft, bottomCenter, bottomRight, rightCenter
VMU4Pos := moduleIni.Read("Settings", "VMU4Pos", "bottomRight",,1) ; topRight, topCenter, topLeft, leftCenter, bottomLeft, bottomCenter, bottomRight, rightCenter
VMUHideKey := moduleIni.Read("Settings", "VMUHideKey","F10",,1)
Bios := moduleIni.Read(romName, "Bios",,,1)
LoadDecrypted := moduleIni.Read(romName, "LoadDecrypted",,,1) ; not currently supported
; Read all the control values
controls := moduleIni.Read(romname, "Controls", "standard",,1) ; have to read this first so the below ini reads work
push1_0 := moduleIni.Read(controls . "_JAMMA0_0", "push1",,,1)
push2_0 := moduleIni.Read(controls . "_JAMMA0_0", "push2",,,1)
push3_0 := moduleIni.Read(controls . "_JAMMA0_0", "push3",,,1)
push4_0 := moduleIni.Read(controls . "_JAMMA0_0", "push4",,,1)
push5_0 := moduleIni.Read(controls . "_JAMMA0_0", "push5",,,1)
push6_0 := moduleIni.Read(controls . "_JAMMA0_0", "push6",,,1)
push7_0 := moduleIni.Read(controls . "_JAMMA0_0", "push7",,,1)
push8_0 := moduleIni.Read(controls . "_JAMMA0_0", "push8",,,1)
service_0 := moduleIni.Read(controls . "_JAMMA0_0", "SERVICE",,,1)
start_0 := moduleIni.Read(controls . "_JAMMA0_0", "START",,,1)
coin_0 := moduleIni.Read(controls . "_JAMMA0_0", "COIN",,,1)
digitalup_0 := moduleIni.Read(controls . "_JAMMA0_0", "DIGITALUP",,,1)
digitaldown_0 := moduleIni.Read(controls . "_JAMMA0_0", "DIGITALDOWN",,,1)
digitalleft_0 := moduleIni.Read(controls . "_JAMMA0_0", "DIGITALLEFT",,,1)
digitalright_0 := moduleIni.Read(controls . "_JAMMA0_0", "DIGITALRIGHT",,,1)
analogup_0 := moduleIni.Read(controls . "_JAMMA0_0", "ANALOGUP",,,1)
analogdown_0 := moduleIni.Read(controls . "_JAMMA0_0", "ANALOGDOWN",,,1)
analogleft_0 := moduleIni.Read(controls . "_JAMMA0_0", "ANALOGLEFT",,,1)
analogright_0 := moduleIni.Read(controls . "_JAMMA0_0", "ANALOGRIGHT",,,1)
analogup2_0 := moduleIni.Read(controls . "_JAMMA0_0", "ANALOGUP2",,,1)
analogdown2_0 := moduleIni.Read(controls . "_JAMMA0_0", "ANALOGDOWN2",,,1)
analogleft2_0 := moduleIni.Read(controls . "_JAMMA0_0", "ANALOGLEFT2",,,1)
analogright2_0 := moduleIni.Read(controls . "_JAMMA0_0", "ANALOGRIGHT2",,,1)
push1_1 := moduleIni.Read(controls . "_JAMMA0_1", "push1",,,1)
push2_1 := moduleIni.Read(controls . "_JAMMA0_1", "push2",,,1)
push3_1 := moduleIni.Read(controls . "_JAMMA0_1", "push3",,,1)
push4_1 := moduleIni.Read(controls . "_JAMMA0_1", "push4",,,1)
push5_1 := moduleIni.Read(controls . "_JAMMA0_1", "push5",,,1)
push6_1 := moduleIni.Read(controls . "_JAMMA0_1", "push6",,,1)
push7_1 := moduleIni.Read(controls . "_JAMMA0_1", "push7",,,1)
push8_1 := moduleIni.Read(controls . "_JAMMA0_1", "push8",,,1)
service_1 := moduleIni.Read(controls . "_JAMMA0_1", "SERVICE",,,1)
start_1 := moduleIni.Read(controls . "_JAMMA0_1", "START",,,1)
coin_1 := moduleIni.Read(controls . "_JAMMA0_1", "COIN",,,1)
digitalup_1 := moduleIni.Read(controls . "_JAMMA0_1", "DIGITALUP",,,1)
digitaldown_1 := moduleIni.Read(controls . "_JAMMA0_1", "DIGITALDOWN",,,1)
digitalleft_1 := moduleIni.Read(controls . "_JAMMA0_1", "DIGITALLEFT",,,1)
digitalright_1 := moduleIni.Read(controls . "_JAMMA0_1", "DIGITALRIGHT",,,1)
analogup_1 := moduleIni.Read(controls . "_JAMMA0_1", "ANALOGUP",,,1)
analogdown_1 := moduleIni.Read(controls . "_JAMMA0_1", "ANALOGDOWN",,,1)
analogleft_1 := moduleIni.Read(controls . "_JAMMA0_1", "ANALOGLEFT",,,1)
analogright_1 := moduleIni.Read(controls . "_JAMMA0_1", "ANALOGRIGHT",,,1)
analogup2_1 := moduleIni.Read(controls . "_JAMMA0_1", "ANALOGUP2",,,1)
analogdown2_1 := moduleIni.Read(controls . "_JAMMA0_1", "ANALOGDOWN2",,,1)
analogleft2_1 := moduleIni.Read(controls . "_JAMMA0_1", "ANALOGLEFT2",,,1)
analogright2_1 := moduleIni.Read(controls . "_JAMMA0_1", "ANALOGRIGHT2",,,1)
;Bezel settings
bezelTopOffset := moduleIni.Read(romName . "|Settings", "Bezel_Top_Offset","0",,1)
bezelBottomOffset := moduleIni.Read(romName . "|Settings", "Bezel_Bottom_Offset","0",,1)
bezelRightOffset := moduleIni.Read(romName . "|Settings", "Bezel_Right_Offset", "0",,1)
bezelLeftOffset := moduleIni.Read(romName . "|Settings", "Bezel_Left_Offset", "0",,1)
If (plugin = "gpuDX11ng") ; this is for legacy support. Original demul 0.7 used gpuDX11ng
plugin := "gpuDX11old"
If (InStr(systemName, "Hikaru") && plugin != "gpuDX11")
plugin := "gpuDX11" ; Hikaru does not work with gpuDX10 gpu plugin, setting it dumps an error
; Verify user set desired gpu plugin name correctly
If (plugin != "gpuDX11old" && plugin != "gpuDX11" && plugin != "gpuDX10" && plugin != "")
ScriptError(plugin . " is not a supported gpu plugin.`nLeave the plugin blank to use the default ""gpuDX11"".`nValid options are gpuDX11old, gpuDX11 or gpuDX10.")
; Read and write videomode value for cable type
rvideomode := DemuleIni.Read("main", "videomode")
RLLog.Info("Module - Demul is reading the config with videomode = " . rvideomode)
DemuleIni.Write(videomode, "main", "videomode")
RLLog.Info("Module - Demul is updating the config with videomode = " . videomode)
; Handle Demul's rom paths so the user doesn't have to
romPathCount := DemuleIni.Read("files", "romsPathsCount")
RLLog.Info("Module - Demul is configured with " . romPathCount . " rom path(s). Scanning these for a romPath to this rom.")
Loop % romPathCount
{ demulRomPath := A_Index - 1 ; rompaths in demul start with 0
path%A_Index% := DemuleIni.Read("files", "roms" . demulRomPath)
RLLog.Info("Module - Path" . demulRomPath . ": " . path%A_Index%)
; msgbox % path%A_Index%
If (path%A_Index% = romPath . "\") ; demul tacks on the backslash at the end
{ romPathFound := 1 ; flag that demul has this romPath in its config and no need to add it
RLLog.Info("Module - Stopping search because Demul is already configured with the correct romPath to this rom: " . path%A_Index%)
Break ; stop looking for a correct romPath
}
}
If !romPathFound ; if demul doesn't have the romPath in its ini, add it
{ RLLog.Warning("Module - Demul does not have this romPath in Demul.ini, adding it for you.")
nextPath := romPathCount + 1 ; add 1 to the romPathCount and write that to the ini
DemuleIni.Write(nextPath, "files", "romsPathsCount")
DemuleIni.Write(romPath . "\", "files", "roms" . romPathCount) ; write the rompath to the ini
}
; Force Fade_Out to disabled as it causes demul to not close properly
; fadeOut = false
; RLLog.Warning("Module - Turning off Fade_Out because it doesn't let Demul exit properly.")
GpuIni := new IniFile(emuPath . "\" . plugin . ".ini")
GpuIni.CheckFile("Please run Demul manually first and select the " . plugin . " gpu plugin so it creates this file for you: " . GpuIni.FileFullPath)
demulFileEncoding := RLObject.getFileEncoding(GpuIni.FileFullPath)
If demulFileEncoding {
If (demulFileEncoding = "ERROR")
RLLog.Warning("Module - GPU ini set to Read-only and BOM cannot be changed. Check the DLL log for further details: " . GpuIni.FileFullPath)
Else {
RLLog.Info("Module - Recreating " . GpuIni.FileFullPath . " as ANSI because UTF-8 format cannot be read")
If RLObject.removeBOM(GpuIni.FileFullPath)
RLLog.Info("Module - Successfully converted " . GpuIni.FileFullPath . " to ANSI")
Else
RLLog.Error("Module - Failed to convert " . GpuIni.FileFullPath . " to ANSI")
}
}
BezelStart()
; Setting emu resolution if bezel is enabled
If (BezelPath)
{ If (plugin = "gpuDX11" || plugin = "gpuDX11old") {
GpuIni.Write(bezelScreenWidth, "resolution", "Width")
GpuIni.Write(bezelScreenHeight, "resolution", "Height")
} Else {
GpuIni.Write(bezelScreenWidth, "resolution", "wWidth")
GpuIni.Write(bezelScreenHeight, "resolution", "wHeight")
}
}
; This updates the DX11gpu ini file to turn List Sorting on or off. Depending on the games, turning this on for some games may remedy missing graphics, having it off on other games may fix corrupted graphics. Untill they improve the DX11gpu, this is the best it's gonna get.
If (ListSorting = "true")
GpuIni.Write(0, "main", "AutoSort")
Else
GpuIni.Write(1, "main", "AutoSort")
; This will set the Opaque or Trans modifier for each game
If (OpaqueMod = "true")
GpuIni.Write(0, "main", "OModifier")
Else
GpuIni.Write(1, "main", "OModifier")
If (TransMod = "true")
GpuIni.Write(0, "main", "TModifier")
Else
GpuIni.Write(1, "main", "TModifier")
; This updates the DX10gpu or DX11gpu ini file to the ratio and scale you want to use for this game
GpuIni.Write(aspectRatio, "main", "aspect")
GpuIni.Write(InternalResolutionScale, "main", "scaling")
If (plugin = "gpuDX11" || plugin = "gpuDX11old") {
GpuIni.Write(MaxLayers, "main", "MaxLayers")
}
; This updates the demul.ini with your gpu plugin choice for the selected rom
DemuleIni.Write(plugin . ".dll", "plugins", "gpu")
; This updates the demul.ini with your VMU display choice
VMUscreendisable := If (showVMU = "true") ? "false" : "true"
DemuleIni.Write(VMUscreendisable, "main", "VMUscreendisable")
; Shader Effects
Loop, 2 {
shaderUsePass%A_Index% := If (ShaderUsePass%A_Index% != "" and ShaderUsePass%A_Index% != "ERROR" ? (ShaderUsePass%A_Index%) : (GlobalShaderUsePass%A_Index%)) ; determine what shaderUsePass to use
currentusePass%A_Index% := GpuIni.Read("shaders", "usePass" . A_Index)
If (shaderUsePass%A_Index% = "true")
{
shaderNamePass%A_Index% := If (ShaderNamePass%A_Index% != "" and ShaderNamePass%A_Index% != "ERROR" ? (ShaderNamePass%A_Index%) : (GlobalShaderNamePass%A_Index%)) ; determine what shaderNamePass to use
If !StringUtils.Contains(shaderNamePass%A_Index%,"FXAA|HDR-TV|SCANLINES|CARTOON|RGB DOT\(MICRO\)|RGB DOT\(TINY\)|BLUR")
ScriptError(shaderNamePass%A_Index% . " is not a valid choice for a shader. Your options are FXAA, HDR-TV, SCANLINES, CARTOON, RGB DOT(MICRO), RGB DOT(TINY), or BLUR.")
If (currentusePass%A_Index% = 0)
GpuIni.Write(1, "shaders", "usePass" . A_Index) ; turn shader on in gpuDX11 ini
GpuIni.Write(shaderNamePass%A_Index%, "shaders", "shaderPass" . A_Index) ; update gpuDX11 ini with the shader name to use
}Else If (shaderUsePass%A_Index% != "true" and currentusePass%A_Index% = 1)
GpuIni.Write(0, "shaders", "usePass" . A_Index) ; turn shader off in gpuDX11 ini
}
If (ident = "dc")
{
7z(romPath, romName, romExtension, sevenZExtractPath)
defaultIni := "[main]`r`nimageFileName = `r`nopenDialog = false"
If (romExtension = ".cdi" || romExtension = ".mds" || romExtension = ".ccd" || romExtension = ".nrg" || romExtension = ".gdi" || romExtension = ".cue") {
GdrImageIni := new IniFile(emuPath . "\gdrImage.ini")
If !GdrImageIni.Exist() {
GdrImageIni.Append(defaultIni) ; Create a default gdrImage.ini in your emu folder if one does not exist already.
; GdrImageIni.Delete(gdrImageFile) ; don't know why this was in the old module, no point in deleting the file I just made
}
TimerUtils.Sleep(500)
DemuleIni.Write("gdrImage.dll", "plugins", "gdr")
GdrImageIni.Write("false", "Main", "openDialog")
GdrImageIni.Write(romPath . "\" . romName . romExtension, "Main", "imagefilename")
} Else If (romExtension = ".chd")
{
GdrCHDIni := new IniFile(emuPath . "\gdrCHD.ini")
If !GdrCHDIni.Exist() {
GdrCHDIni.Append(defaultIni) ; Create a default gdrCHD.ini in your emu folder if one does not exist already.
; GdrCHDIni.Delete(gdrCHDFile) ; don't know why this was in the old module, no point in deleting the file I just made
}
TimerUtils.Sleep(500)
GdrCHDIni.Write("false", "Main", "openDialog")
DemuleIni.Write("gdrCHD.dll", "plugins", "gdr")
GdrCHDIni.Write(romPath . "\" . romName . romExtension, "Main", "imagefilename")
} Else
ScriptError(romExtension . " is not a supported file type for this " . moduleName . " module.")
DemuleIni.Write(1, "main", "region") ; Set BIOS to Auto Region
} Else { ; all other systems, Naomi and Atomiswave
; This updates the demul.ini with your Bios choice for the selected rom
If (Bios != "" && Bios != "ERROR") {
Bios := StringUtils.RegExReplace(Bios,"\s.*") ; Cleans off the added text from the key's value so only the number is left
DemuleIni.Write("false", "main", "naomiBiosAuto") ; turning auto bios off so we can use a specific one instead
DemuleIni.Write(Bios, "main", "naomiBios") ; setting specific bios user has set from the moduleName ini
} Else
DemuleIni.Write("true", "main", "naomiBiosAuto") ; turning auto bios on if user did not specify a specific one
}
; This section writes your custom keys to the padDemul.ini. Naomi games had many control panel layouts. The only way we can accomodate these differing controls, is to keep track of them all and write them to the ini at the launch of each game.
; First we check if the last controls used are the same as the game we want to play, so we don't waste time updating the ini if it is not necessary. For example playing 2 sfstyle type games in a row, we wouldn't need to write to the ini.
; This section tells demul what arcade control type should be connected to the game. Options are standard (aka controller), mouse, lightgun, or keyboard
If (controls = "lightgun" || controls = "mouse") {
RLLog.Info("Module - This game uses a Mouse or Lightgun control type.")
DemuleIni.Write(MouseCode, "PORTB", "device")
} Else If (controls = "keyboard") {
RLLog.Info("Module - This game uses a Keyboard control type.")
DemuleIni.Write(KeyboardCode, "PORTB", "device")
} Else { ; accounts for all other control types
RLLog.Info("Module - This game uses a standard (controller) control type.")
DemuleIni.Write(ControllerCode, "PORTB", "device")
}
WriteControls(0,push1_0,push2_0,push3_0,push4_0,push5_0,push6_0,push7_0,push8_0,SERVICE_0,START_0,COIN_0,DIGITALUP_0,DIGITALDOWN_0,DIGITALLEFT_0,DIGITALRIGHT_0,ANALOGUP_0,ANALOGDOWN_0,ANALOGLEFT_0,ANALOGRIGHT_0,ANALOGUP2_0,ANALOGDOWN2_0,ANALOGLEFT2_0,ANALOGRIGHT2_0)
WriteControls(1,push1_1,push2_1,push3_1,push4_1,push5_1,push6_1,push7_1,push8_1,SERVICE_1,START_1,COIN_1,DIGITALUP_1,DIGITALDOWN_1,DIGITALLEFT_1,DIGITALRIGHT_1,ANALOGUP_1,ANALOGDOWN_1,ANALOGLEFT_1,ANALOGRIGHT_1,ANALOGUP2_1,ANALOGDOWN2_1,ANALOGLEFT2_1,ANALOGRIGHT2_1)
RLLog.Info("Module - Wrote " . controls . " controls to padDemul.ini.")
; This will check the save game files and create per game ones if enabled.
If (PerGameMemoryCards = "true")
{
MemCardFolder := new Folder(memCardPath)
DefaultMemCard := new File(memCardPath . "\default_vms.bin") ; defining default blank VMU file
If !DefaultMemCard.Exist("Folder")
DefaultMemCard.CreateDir() ; create memcard folder if it doesn't exist
If defaultMemCard.Exist()
{
RLLog.Info("VMU - Default VMU file location - " . defaultMemCard.FileFullPath)
Loop, 4
{
outerLoop := A_Index
If (A_Index = 1)
contrPort := "A"
Else If (A_Index = 2)
contrPort := "B"
Else If (A_Index = 3)
contrPort := "C"
Else If (A_Index = 4)
contrPort := "D"
controllerPort%contrPort% := DemuleIni.Read("PORT" . contrPort, "device")
RLLog.Info("VMU - Config for controller PORT" . contrPort . " = " . controllerPort%contrPort%)
If (controllerPort%contrPort% = -1)
Continue
Loop, 2
{
SubCount := A_Index - 1
VMUPort%SubCount% := DemuleIni.Read("PORT" . contrPort, "port" . SubCount)
RLLog.Info("VMU - Config Plugin VMUPort" . contrPort . SubCount . " for controller PORT" . contrPort . " = " . VMUPort%SubCount%)
If (VMUPort%SubCount% <> -1)
{
VMUPortFile%SubCount% := DemuleIni.Read("VMS", "VMS" . contrPort . SubCount)
RLLog.Info("VMU - VMUPortFile" . contrPort . SubCount . " controllerVMU" . contrPort . SubCount . " " . "VMS" . contrPort . SubCount . " = " . VMUPortFile%SubCount%)
memCardName := If romTable[1,5] ? romTable[1,4] : romName ; defining rom name for multi disc rom
PerGameVMUBin%A_Index% := new File(memCardPath . "\" . memCardName . "_vms_" . contrPort . SubCount . ".bin")
RLLog.Info("VMU - PerGameVMUBin = " . PerGameVMUBin%A_Index%.FileFullPath)
If PerGameVMUBin%A_Index%.Exist()
{
RLLog.Info("VMU - PerGameVMU file exists at " . PerGameVMUBin%A_Index%.FileFullPath)
} Else {
RLLog.Info("VMU - PerGameVMU file does not exist. So we will create one at " . PerGameVMUBin%A_Index%.FileFullPath)
DefaultMemCard.Copy(PerGameVMUBin%A_Index%.FileFullPath)
}
DemuleIni.Write(PerGameVMUBin%A_Index%.FileFullPath, "VMS", "VMS" . contrPort . SubCount)
RLLog.Info("VMU - PerGameVMU file written to " . DemuleIni.FileFullPath . " at section VMS to variable VMS" . contrPort . SubCount . " as " . PerGameVMUBin%A_Index%.FileFullPath)
} Else {
RLLog.Info("VMU - No VMU Plugged In.")
}
}
}
} Else {
RLLog.Info("VMU - No default VMU file at " . DefaultMemCard.FileFullPath)
}
}
; Setting demul to use true fullscreen if defined in settings.ini, otherwise sets demul to run windowed. This is for gpuDX11 plugin only
If (plugin = "gpuDX11" || plugin = "gpuDX11old")
If (fullscreen = "truefullscreen")
GpuIni.Write(1, "main", "UseFullscreen")
Else
GpuIni.Write(0, "main", "UseFullscreen")
If (fullscreen = "windowedfullscreen")
{
If (plugin = "gpuDX11" || plugin = "gpuDX11old") {
GpuIni.Write(appWidthNew, "resolution", "Width")
GpuIni.Write(appHeightNew, "resolution", "Height")
} Else {
GpuIni.Write(appWidthNew, "resolution", "wWidth")
GpuIni.Write(appHeightNew, "resolution", "wHeight")
}
If (maxHideTaskbar = "true") {
RLLog.Info("Module - Hiding Taskbar and Start Button.")
MiscUtils.TaskBar("off")
}
; Create black background to give the emu the fullscreen look
RLLog.Info("Module - Creating black background to simulate a fullscreen look.")
Gui demulGUI: -Caption +ToolWindow +0x08000000
Gui demulGUI: Color, Black
Gui demulGUI: Show, x0 y0 h%A_ScreenHeight% w%A_ScreenWidth%
}
If (ident != "dc" && demulShooterEnabled = "true") { ; If demulshooter is enabled for this game, launch it with relevant options
DemulShooterExe := New DemulShooter()
DemulShooterExe.Launch("demul07a",romName,"-noresize")
}
TimerUtils.Sleep(250)
; Construct the CLI for demul and send romName if naomi or atomiswave. Dreamcast needs a full path and romName.
If (LoadDecrypted = "true") ; decrypted naomi rom
romCLI := "-customrom=" . """" . romPath . "\" . romName . ".bin"""
Else If (ident = "dc") ; dreamcast game
romCLI := " -image=" . """" . romPath . "\" . romName . romExtension . """"
Else ; standard naomi rom
romCLI := "-rom=" . romName
hideEmuObj := Object(emuLCD0Window,0,emuPrimaryWindow,1)
HideAppStart(hideEmuObj,hideEmu)
primaryExe.Run(" -run=" . ident . " " . romCLI, (If hideDemulGUI = "true" ? "min" : "")) ; launching minimized, then restoring later hides the launch completely
TimerUtils.Sleep(1000) ; Need a second for demul to launch, increase if yours takes longer and the emu is NOT appearing and staying minimized. This is required otherwise bezel backgrounds do not appear
DetectHiddenWindows, On
If (hideDemulGUI = "true")
{
emuPrimaryWindow.Restore()
emuPrimaryWindow.Activate()
}
RLLog.Info("Module - Waiting for Demul to finish loading game.")
winTextSplit := []
Loop { ; looping until demul is done loading rom and gpu starts showing frames
TimerUtils.Sleep(200,0)
winTitle := emuPrimaryWindow.GetTitle(0) ; do not update the wintitle otherwise emu won't close on exit
winTextSplit := StringUtils.Split(winTitle, A_Space)
If (winTextSplit[5] = "gpu:" And winTextSplit[6] != "0" And winTextSplit[6] != "1")
Break
}
RLLog.Info("Module - Demul finished loading game.")
If (StringUtils.Contains(systemName, "Gaelco|Hikaru") && fullscreen = "truefullscreen")
KeyUtils.Send("!{Enter}") ; Automatic fullscreen seems to be broken in the Gaelco driver, must alt+Enter to get fullscreen
; This is where we calculate and maximize demul's window using our pseudo fullscreen code
If (fullscreen = "windowedfullscreen")
{
emuPrimaryWindow.Maximize() ; this will take effect after you run demul once because we cannot stretch demul's screen while it is running.
}
BezelDraw()
If (showVMU = "true"){
ExtraFixedResBezel := new Window(new WindowTitle("ahk_ID " . extraFixedRes_Bezel_hwnd))
SetTimer, CheckforVMU, 5000
}
HideAppEnd(hideEmuObj,hideEmu)
FadeInExit()
primaryExe.Process("WaitClose")
If (fullscreen = "windowedfullscreen")
{ Gui demulGUI: Destroy
RLLog.Info("Module - Destroyed black gui background.")
}
If (ident = "dc")
7zCleanUp()
BezelExit()
ExtraFixedResBezelExit()
FadeOutExit()
If (fullscreen = "windowedfullscreen" && maxHideTaskbar = "true") {
RLLog.Info("Module - Showing Taskbar and Start Button.")
MiscUtils.TaskBar("on")
}
ExitModule()
; Write new controls to padDemul.ini
WriteControls(player,push1,push2,push3,push4,push5,push6,push7,push8,service,start,coin,digitalup,digitaldown,digitalleft,digitalright,analogup,analogdown,analogleft,analogright,analogup2,analogdown2,analogleft2,analogright2) {
Global PadIni
PadIni.Write(push1, "JAMMA0_" . player, "PUSH1")
PadIni.Write(push2, "JAMMA0_" . player, "PUSH2")
PadIni.Write(push3, "JAMMA0_" . player, "PUSH3")
PadIni.Write(push4, "JAMMA0_" . player, "PUSH4")
PadIni.Write(push5, "JAMMA0_" . player, "PUSH5")
PadIni.Write(push6, "JAMMA0_" . player, "PUSH6")
PadIni.Write(push7, "JAMMA0_" . player, "PUSH7")
PadIni.Write(push8, "JAMMA0_" . player, "PUSH8")
PadIni.Write(service, "JAMMA0_" . player, "SERVICE")
PadIni.Write(start, "JAMMA0_" . player, "START")
PadIni.Write(coin, "JAMMA0_" . player, "COIN")
PadIni.Write(digitalup, "JAMMA0_" . player, "DIGITALUP")
PadIni.Write(digitaldown, "JAMMA0_" . player, "DIGITALDOWN")
PadIni.Write(digitalleft, "JAMMA0_" . player, "DIGITALLEFT")
PadIni.Write(digitalright, "JAMMA0_" . player, "DIGITALRIGHT")
PadIni.Write(analogup, "JAMMA0_" . player, "ANALOGUP")
PadIni.Write(analogdown, "JAMMA0_" . player, "ANALOGDOWN")
PadIni.Write(analogleft, "JAMMA0_" . player, "ANALOGLEFT")
PadIni.Write(analogright, "JAMMA0_" . player, "ANALOGRIGHT")
PadIni.Write(analogup2, "JAMMA0_" . player, "ANALOGUP2")
PadIni.Write(analogdown2, "JAMMA0_" . player, "ANALOGDOWN2")
PadIni.Write(analogleft2, "JAMMA0_" . player, "ANALOGLEFT2")
PadIni.Write(analogright2, "JAMMA0_" . player, "ANALOGRIGHT2")
}
HaltEmu:
If (fullscreen = "truefullscreen")
KeyUtils.Send("!{Enter}")
If VMUHideKey
XHotKeywrapper(VMUHideKey,"VMUHide","OFF")
Return
RestoreEmu:
If (fullscreen = "truefullscreen")
KeyUtils.Send("!{Enter}")
If (showVMU = "true") {
Loop, 4
{ VMUWindow%A_Index%.Set("Transparent", 0)
VMUWindow%A_Index%.Activate()
VMUWindow%A_Index%.Set("AlwaysOnTop", "On")
ExtraFixedResBezel.Set("AlwaysOnTop", "On")
If !(VMUHidden)
VMUWindow%A_Index%.Set("Transparent", "off")
}
emuPrimaryWindow.Activate()
}
If VMUHideKey
XHotKeywrapper(VMUHideKey,"VMUHide","ON")
Return
HideGUIWindow:
emuPrimaryWindow.Set("Transparent", "On")
emuPrimaryWindow.Activate() ; once activated, demul starts loading the rom
Return
CheckforVMU:
Loop, 4
{ Transform, letter, Chr, % A_Index + asc("A") - 1 ; transform number to letter
If ((!(VMUWindow%A_Index%)) and (VMUScreenID%A_Index%:=WinExist("PORT " . letter . " VMU 0 ahk_class PORT " . letter . " VMU 0")))
{ VMUWindow%A_Index% := new Window(new WindowTitle("ahk_ID " . VMUScreenID%A_Index%))
VMUWindow%A_Index%.Set("Transparent", 0)
ExtraFixedResBezelDraw(VMUScreenID%A_Index%, "VMU",VMU%A_Index%Pos, 144, 96, 8, 8, 28, 8)
VMUWindow%A_Index%.Activate()
VMUWindow%A_Index%.Set("AlwaysOnTop", "On")
ExtraFixedResBezel.Set("AlwaysOnTop", "On")
VMU%A_Index%Draw := true
If !(VMUHidden)
VMUWindow%A_Index%.Set("Transparent", "off")
If !(VMULoaded){
VMUHideKey := xHotKeyVarEdit(VMUHideKey,"VMUHideKey","~","Add")
xHotKeywrapper(VMUHideKey,"VMUHide")
VMULoaded := true
}
emuPrimaryWindow.Activate()
}
}
If ((VMU1Draw) and (VMU2Draw) and (VMU3Draw) and (VMU4Draw))
SetTimer, CheckforVMU, off
Return
VMUHide:
If VMUHidden {
Loop, 4
VMUWindow%a_index%.Set("Transparent", "off")
UpdateLayeredWindow(extraFixedRes_Bezel_hwnd, extraFixedRes_Bezel_hdc,0,0, A_ScreenWidth, A_ScreenHeight,255)
VMUHidden := false
} Else {
Loop, 4
VMUWindow%a_index%.Set("Transparent", 0)
UpdateLayeredWindow(extraFixedRes_Bezel_hwnd, extraFixedRes_Bezel_hdc,0,0, A_ScreenWidth, A_ScreenHeight,0)
VMUHidden := true
}
Return
CloseProcess:
FadeOutStart()
If (demulShooterEnabled = "true") {
DemulShooterExe.Close()
}
emuPrimaryWindow.PostMessage("0x111", "40085") ; Stop emulation first for a clean exit
TimerUtils.Sleep(5) ; just like to give a little time before closing
emuPrimaryWindow.PostMessage("0x111", "40080") ; Exit
~Escape::
Process, Close, demul.exe
ExitAPP
return
qui a besoin des
ROMs en Zip
| Atoms_v055.zip |
| DEMUL.png |
| demul0582.zip |
| demul07_111117.zip |
| demul07_180428.zip |
| Atomiswave.png |
| anmlbskt.zip |
| awbios.zip |
| basschal.zip |
| blokpong.zip |
| claychal.zip |
| demofist.zip |
| dirtypig.zip |
| dolphin.zip |
| fotns.zip |
| ftspeed.zip |
| ggisuka.zip |
| ggx15.zip |
| kofnw.zip |
| kofxi.zip |
| kov7sprt.zip |
| maxspeed.zip |
| mslug6.zip |
| ngbc.zip |
| rumblef.zip |
| rumblef2.zip |
| salmankt.zip |
| samsptk.zip |
| vfurlong.zip |
| waidrive.zip |
| xtrmhunt.zip |
| 18wheelr.zip |
| 18wheels.zip |
| 18whlrur.zip |
| alienfnt.zip |
| alienfnta.zip |
| alpilota.zip |
| alpiltdx.zip |
| asndynmt.zip |
| aurora.zip |
| ausfache.zip |
| azumanga.zip |
| bdrdown.zip |
| beachspi.zip |
| brickppl.zip |
| capsnk.zip |
| capsnka.zip |
| capsnkb.zip |
| cfield.zip |
| chocomk.zip |
| claychal.zip |
| cleoftp.zip |
| clubkrtd.zip |
| clubkrte.zip |
| confmiss.zip |
| crackndj.zip |
| crakndj2.zip |
| crzytaxi.zip |
| csmash.zip |
| csmasho.zip |
| cspike.zip |
| cvs2gd.zip |
| cvsgd.zip |
| dc.zip |
| deathcox.zip |
| derbyoc.zip |
| derbyoc2.zip |
| dinoki25.zip |
| dinoking.zip |
| dinokior.zip |
| doa2.zip |
| doa2m.zip |
| dybb99.zip |
| dybbnao.zip |
| dygolf.zip |
| f355.zip |
| f355bios.zip |
| f355dlx.zip |
| f355twin.zip |
| f355twn2.zip |
| ggram2.zip |
| ggx.zip |
| ggxx.zip |
| ggxxac.zip |
| ggxxrl.zip |
| ggxxsla.zip |
| gram2000.zip |
| gundmct.zip |
| gundmxgd.zip |
| gunsur2.zip |
| gunsur2e.zip |
| gwing2.zip |
| hikaru.zip |
| hmgeo.zip |
| hopperbd.zip |
| hotd2.zip |
| hotd2o.zip |
| ikaruga.zip |
| illvelo.zip |
| initd.zip |
| initdexp.zip |
| inunoos.zip |
| jambo.zip |
| jingystm.zip |
| karous.zip |
| keyboard.zip |
| kick4csh.zip |
| kingrt66.zip |
| kof11.zip |
| kofnwj.zip |
| kurucham.zip |
| loveber3.zip |
| lovebero.zip |
| lovebery.zip |
| lupinsho.zip |
| luptype.zip |
| marstv.zip |
| mazan.zip |
| mazana.zip |
| meltyb.zip |
| meltyba.zip |
| meltybld.zip |
| mie.zip |
| moeru.zip |
| mok.zip |
| monkeyba.zip |
| mvsc2.zip |
| mvsc2u.zip |
| naomi.zip |
| naomi2.zip |
| naomigd.zip |
| ninjaslt.zip |
| oinori.zip |
| otrigger.zip |
| pjustic.zip |
| pstone.zip |
| pstone2.zip |
| psyvar2.zip |
| puyofev.zip |
| qmegamis.zip |
| quizqgd.zip |
| radirgy.zip |
| radirgya.zip |
| radirgyn.zip |
| ringout.zip |
| samba.zip |
| samba2k.zip |
| sambap.zip |
| segasp.zip |
| senko.zip |
| senkoo.zip |
| senkosp.zip |
| sfz3ugd.zip |
| sgtetris.zip |
| shaktamb.zip |
| shaktmsp.zip |
| shangril.zip |
| shikgam2.zip |
| shootopl.zip |
| shootpl.zip |
| shootplm.zip |
| sl2007.zip |
| slasho.zip |
| slashout.zip |
| smarinef.zip |
| smlg99.zip |
| soulsurf.zip |
| spawn.zip |
| spkrbtl.zip |
| sprtjam.zip |
| ss2005.zip |
| ss2005a.zip |
| sstrkfgt.zip |
| starseek.zip |
| suchie3.zip |
| takoron.zip |
| tduno2.zip |
| tetkiwam.zip |
| totd.zip |
| toyfight.zip |
| trgheart.zip |
| trizeal.zip |
| undefeat.zip |
| usagui.zip |
| vathlete.zip |
| vf4.zip |
| vf4b.zip |
| vf4c.zip |
| vf4evo.zip |
| vf4evoa.zip |
| vf4tuned.zip |
| vf4tuneda.zip |
| vf4tunedd.zip |
| virnba.zip |
| virnbao.zip |
| virnbap.zip |
| vonot.zip |
| vs2_2k.zip |
| vstrik3.zip |
| vstrik3c.zip |
| vtenis2c.zip |
| vtennis.zip |
| vtennis2.zip |
| vtennisg.zip |
| wldkicks.zip |
| wldrider.zip |
| wsbbgd.zip |
| wwfroyal.zip |
| zombrvn.zip |
| zunou.zip |
| naomi.zip |
| vf4b.zip |
| vf4evo.zip |
| vf4evoa.zip |
| vf4tuned.zip |
| vf4tuneda.zip |
| vf4tunedd.zip |
SEGA
& various BIOS
| Atomiswave_Custom_1P_orange | Atomiswave_Insert_Coin_100_Yen | Atomiswave_Logo |
Click thumbnail to get the corresponding vector file.

Atomiswave_Custom_1P_green.ai 163 Kb back to top

Atomiswave_Custom_1P_orange.ai 173 Kb back to top

Atomiswave_Insert_Coin_100_Yen.pdf 1.1 Mb back to top

Atomiswave_Logo.ai 450 Kb back to top




















































































































