Files
libretro/emulators/mfme.yml
T

673 lines
22 KiB
YAML

emulator: MFME
type: standalone
core_classification: embedded_hle
source: "https://www.desertislandfruits.com/"
upstream: closed-source
profiled_date: "2026-08-08"
core_version: "20.1"
display_name: "MFME (Fruit Machines)"
cores:
- mfme
- mfme-windows
systems:
- fruitmachine
mode: standalone
notes: |
Closed-source Delphi emulator for fruit machine and slot machine hardware,
written by Chris Wren (Wizard) and distributed as a Windows installer. MFME.exe
carries FileVersion 20.1.0.0, FileDescription "Multiple Fruit Machine Emulator" and
copyright "C.J.Wren 1997-2020"; the installer targets Windows 10, defaults to
C:\MFME\v20 (history.txt:323) and writes HKCU\Software\CJW\MFME. The binary is
ASPack compressed, imports dinput8, xaudio2_9, d2d1 and d3d11 for input, sound
and the hardware accelerated scaler added in v19.0 (history.txt:8-9), and holds
its layout engine in Delphi units around an EasyCompression Library core.
Development ended with the author's death, and Update.exe, reached from File ->
Check For Updates (history.txt:235), no longer finds a server. ES-DE calls
MFME.exe with a .gam path and the working directory set to the emulator
folder, through find rules MFME and MFME-WINDOWS, and runs
it under Wine or Proton on Linux; .gam is in the arcade and mame extension
lists.
A machine is a folder holding a .gam file, the .fml layout it names and the ROM
set. The .gam is plain text: a System line naming the tech, DIP switch, reel,
stake, jackpot, percentage and meter state, a Layout line naming the .fml, a
Game line, and one ROM line per ROM file. Layouts before v5 used .dat and are
converted by loading them in v5 or v6 and saving; v20 loads .fml only. The .fml
is an AACS container whose password is derived from a four byte seed at the end
of the file through a mixer, hashed with RIPEMD-128 into a Rijndael key, and
each chunk is zlib compressed; it holds the Delphi layout stream with every
bitmap embedded, carries no external file path, and text components name a font
family rather than a font file. MFME.exe is started with the .gam path as its
argument (history.txt:271).
ROM sets are per machine and self contained. Barcrest S4 and S5 sets are .LO and
.HI program files with a .BIN sound ROM, MPU5 sets are .p1 to .p4, and other
techs use .hex or .rom members named by the .gam. Fruit machine hardware has no
system BIOS, so nothing is shared between machines, and sound ROMs belong to the
machine as well: an S4 game whose sound ROMs are absent still runs and reports
Wrong Snd Err (history.txt:301). v20.0 added an automatic ROM download for DIF
legacy layouts (history.txt:293). Ctrl-K resets a game with its alternate ROM
set (tips.txt).
Effect samples are the mechanical cabinet sounds MFME plays itself, distinct
from the game audio the sound ROM produces. Each effect has a fixed filename
resolved in the game folder first, then DefaultSounds\Custom\<tech>\<cabinet
style>, then DefaultSounds (DefaultSounds/Readme.txt:78-84), and files are
opened when required rather than at layout load (history.txt:210-211). A
preference forces the defaults over the ones a layout selects
(history.txt:219). The distribution ships Custom folders for 40 techs: ACEVIDEO,
ADDER5, ASTRASYSA1, BLACKBOX, COINMASTER, ELECTROCOIN, EPOCH, IGTS+, IGTS2000,
IMPACT, INDER, M1AB, M1VIDEO, MACH2000A, MACH2000E, MACH2000S, MMM, MPS2, MPU2,
MPU3, MPU4, MPU4PLASMA, MPU4VIDEO, MPU5, PCLMAXI, PHOENIX, PHOENIX2, PLUTO5,
PROCONN, SCORPION1, SCORPION2, SCORPION4, SCORPION5, SRU, SYS1, SYS5, SYS83,
SYS85, SYSTEM80 and spACE, with cabinet subfolders Eclipse for ADDER5,
SCORPION4 and SCORPION5, Elegance for EPOCH, and Genesis for MPU4 and MPU5.
DefaultSounds/Readme.txt:35-37 lists the electronic token mech effects as
CoinInToken, CoinInTokenSwitch and CoinInTokenRejected; the files that ship and
the entry that introduced them name them TokenIn, TokenInSwitch and
TokenInRejected (history.txt:80).
Three shipped directories are enumerated rather than looked up by name and
therefore expect no particular filename. DefaultBackdrops and DefaultTiles hold
the images offered as a backdrop or tiled background in the full screen modes,
picked at random when the preference is set (history.txt:48, 55-56), and ship
one wallpaper and six tiles. DefaultSounds/MiscSounds holds alternate payout,
coin and note recordings that a user copies over an effect name. Fonts is
scanned for the fonts a layout names, so its contents grow with the layouts
installed.
files:
# -- Output hardware library --
- name: PacDrive32.dll
system: fruitmachine
required: true
bundled: true
description: "Ultimarc PacDrive, PacLed64 and UltimateIO output library"
source_ref: "MFME.exe import directory, history.txt:278-279"
note: >-
Listed in the MFME.exe import descriptors, so the Windows loader resolves it
at process start and MFME does not launch when it is absent from the
application directory. Drives real cabinet lamps, hoppers and meters through
Ultimarc boards; v20.0 updated the library and added PacLed64 and UltimateIO
support.
# -- Fonts, scanned from the Fonts folder beside MFME.exe --
- name: LITHOGRB.TTF
system: fruitmachine
path: "Fonts/LITHOGRB.TTF"
required: false
bundled: true
category: game_data
description: "Lithograph Bold, the font layouts name for machine text"
source_ref: "history.txt:38, 309"
note: >-
v19.0 moved font loading from installed system fonts to the Fonts folder
where MFME is located. Layouts store a font family name, not a file: the
decoded layout stream names Lithograph. A layout whose font is missing shows
the name in red in the properties screen and renders with a substitute.
- name: LITHOGRL.TTF
system: fruitmachine
path: "Fonts/LITHOGRL.TTF"
required: false
bundled: true
category: game_data
description: "Lithograph Light, the font layouts name for machine text"
source_ref: "history.txt:38, 309"
note: "Same mechanism as LITHOGRB.TTF, the light weight of the same family."
- name: MFME.ttf
system: fruitmachine
path: "Fonts/MFME.ttf"
required: false
bundled: true
category: game_data
description: "MFME segment and display font"
source_ref: "history.txt:38, 168"
note: "Shipped font used by MFME's own displays, updated in v19.5."
# -- Reel masks, applied when the Default option is selected --
- name: ReelGradientMask.bmp
system: fruitmachine
path: "DefaultMasks/ReelGradientMask.bmp"
required: false
bundled: true
category: game_data
description: "Reel gradient mask applied to reel bands"
source_ref: "DefaultMasks/Readme.txt:1"
note: >-
Used when the Default option is chosen for the mask in the reel properties
window. A custom mask stored in the layout replaces it.
- name: ReelLampMask.bmp
system: fruitmachine
path: "DefaultMasks/ReelLampMask.bmp"
required: false
bundled: true
category: game_data
description: "Reel lamp mask applied to reel bands"
source_ref: "DefaultMasks/Readme.txt:1"
note: "Same mechanism as ReelGradientMask.bmp, for the reel lamp overlay."
# -- Payout solenoid slides --
- name: 2pSlide.wav
system: fruitmachine
path: "DefaultSounds/2pSlide.wav"
required: false
bundled: true
category: game_data
description: "2p payout solenoid"
source_ref: "DefaultSounds/Readme.txt:9, history.txt:44"
- name: 10pSlide.wav
system: fruitmachine
path: "DefaultSounds/10pSlide.wav"
required: false
bundled: true
category: game_data
description: "10p payout solenoid"
source_ref: "DefaultSounds/Readme.txt:10"
- name: 20pSlide.wav
system: fruitmachine
path: "DefaultSounds/20pSlide.wav"
required: false
bundled: true
category: game_data
description: "20p payout solenoid"
source_ref: "DefaultSounds/Readme.txt:11"
- name: 50pSlide.wav
system: fruitmachine
path: "DefaultSounds/50pSlide.wav"
required: false
bundled: true
category: game_data
description: "50p payout solenoid"
source_ref: "DefaultSounds/Readme.txt:12"
- name: PoundSlide.wav
system: fruitmachine
path: "DefaultSounds/PoundSlide.wav"
required: false
bundled: true
category: game_data
description: "One pound payout solenoid"
source_ref: "DefaultSounds/Readme.txt:13"
- name: TokenSlide.wav
system: fruitmachine
path: "DefaultSounds/TokenSlide.wav"
required: false
bundled: true
category: game_data
description: "10p and 20p token payout solenoid"
source_ref: "DefaultSounds/Readme.txt:14"
- name: MiscSlide.wav
system: fruitmachine
path: "DefaultSounds/MiscSlide.wav"
required: false
bundled: true
category: game_data
description: "Five by 50p slide"
source_ref: "DefaultSounds/Readme.txt:15"
# -- Meters and buttons --
- name: meter.wav
system: fruitmachine
path: "DefaultSounds/meter.wav"
required: false
bundled: true
category: game_data
description: "Electromechanical meter step"
source_ref: "DefaultSounds/Readme.txt:17"
note: "Listed as Meter.wav in the readme, shipped as meter.wav."
- name: ButtonDown.wav
system: fruitmachine
path: "DefaultSounds/ButtonDown.wav"
required: false
bundled: true
category: game_data
description: "Layout button pressed"
source_ref: "DefaultSounds/Readme.txt:19"
note: "PROCONN ships its own copy under DefaultSounds/Custom/PROCONN/."
- name: ButtonUp.wav
system: fruitmachine
path: "DefaultSounds/ButtonUp.wav"
required: false
bundled: true
category: game_data
description: "Layout button released"
source_ref: "DefaultSounds/Readme.txt:20"
note: "PROCONN ships its own copy under DefaultSounds/Custom/PROCONN/."
# -- Hoppers --
- name: HopperMotor1.wav
system: fruitmachine
path: "DefaultSounds/HopperMotor1.wav"
required: false
bundled: true
category: game_data
description: "Hopper 1 motor running"
source_ref: "DefaultSounds/Readme.txt:22"
note: >-
Cabinet specific copies ship under DefaultSounds/Custom/ for ADDER5/Eclipse,
EPOCH/Elegance, MPU4/Genesis, MPU5/Genesis, SCORPION4/Eclipse and
SCORPION5/Eclipse.
- name: HopperCoin1.wav
system: fruitmachine
path: "DefaultSounds/HopperCoin1.wav"
required: false
bundled: true
category: game_data
description: "Coin paid out from hopper 1"
source_ref: "DefaultSounds/Readme.txt:23"
note: "Same cabinet specific copies as HopperMotor1.wav."
- name: HopperMotor2.wav
system: fruitmachine
path: "DefaultSounds/HopperMotor2.wav"
required: false
bundled: true
category: game_data
description: "Hopper 2 motor running"
source_ref: "DefaultSounds/Readme.txt:24"
note: "Same cabinet specific copies as HopperMotor1.wav."
- name: HopperCoin2.wav
system: fruitmachine
path: "DefaultSounds/HopperCoin2.wav"
required: false
bundled: true
category: game_data
description: "Coin paid out from hopper 2"
source_ref: "DefaultSounds/Readme.txt:25"
note: >-
Same cabinet specific copies as HopperMotor1.wav, plus an alternate in
DefaultSounds/MiscSounds/.
# -- Note acceptor --
- name: NoteIn.wav
system: fruitmachine
path: "DefaultSounds/NoteIn.wav"
required: false
bundled: true
category: game_data
description: "Note inserted into the note acceptor"
source_ref: "DefaultSounds/Readme.txt:27"
- name: NoteInReject.wav
system: fruitmachine
path: "DefaultSounds/NoteInReject.wav"
required: false
bundled: true
category: game_data
description: "Note rejected by the note acceptor"
source_ref: "DefaultSounds/Readme.txt:28"
- name: NoteInStack.wav
system: fruitmachine
path: "DefaultSounds/NoteInStack.wav"
required: false
bundled: true
category: game_data
description: "Note accepted and sent to the stacker"
source_ref: "DefaultSounds/Readme.txt:29"
# -- Roll down electronic coin mech --
- name: CoinIn.wav
system: fruitmachine
path: "DefaultSounds/CoinIn.wav"
required: false
bundled: true
category: game_data
description: "Coin inserted into a roll down electronic mech"
source_ref: "DefaultSounds/Readme.txt:31"
- name: CoinInSwitch.wav
system: fruitmachine
path: "DefaultSounds/CoinInSwitch.wav"
required: false
bundled: true
category: game_data
description: "Coin accepted by the mech"
source_ref: "DefaultSounds/Readme.txt:32"
- name: CoinInRejected.wav
system: fruitmachine
path: "DefaultSounds/CoinInRejected.wav"
required: false
bundled: true
category: game_data
description: "Coin rejected by the mech into the payout tray"
source_ref: "DefaultSounds/Readme.txt:33"
- name: TokenIn.wav
system: fruitmachine
path: "DefaultSounds/TokenIn.wav"
required: false
bundled: true
category: game_data
description: "Token inserted into an electronic token mech"
source_ref: "history.txt:80, DefaultSounds/Readme.txt:35"
- name: TokenInSwitch.wav
system: fruitmachine
path: "DefaultSounds/TokenInSwitch.wav"
required: false
bundled: true
category: game_data
description: "Token accepted by an electronic token mech"
source_ref: "history.txt:80, DefaultSounds/Readme.txt:36"
- name: TokenInRejected.wav
system: fruitmachine
path: "DefaultSounds/TokenInRejected.wav"
required: false
bundled: true
category: game_data
description: "Token rejected by an electronic token mech"
source_ref: "history.txt:80, DefaultSounds/Readme.txt:37"
# -- S1 and S10 mechs --
- name: CoinInS1.wav
system: fruitmachine
path: "DefaultSounds/CoinInS1.wav"
required: false
bundled: true
category: game_data
description: "Coin inserted in an S1 type mech"
source_ref: "history.txt:148"
- name: CoinInS1Switch.wav
system: fruitmachine
path: "DefaultSounds/CoinInS1Switch.wav"
required: false
bundled: true
category: game_data
description: "Coin accepted by an S1 type mech"
source_ref: "history.txt:148"
- name: CoinInS1Token.wav
system: fruitmachine
path: "DefaultSounds/CoinInS1Token.wav"
required: false
bundled: true
category: game_data
description: "Token inserted in an S1 token type mech"
source_ref: "history.txt:148"
- name: CoinInS1TokenSwitch.wav
system: fruitmachine
path: "DefaultSounds/CoinInS1TokenSwitch.wav"
required: false
bundled: true
category: game_data
description: "Token accepted by an S1 token type mech"
source_ref: "history.txt:148"
- name: CoinInS10.wav
system: fruitmachine
path: "DefaultSounds/CoinInS10.wav"
required: false
bundled: true
category: game_data
description: "Coin inserted in an S1 or S10 type mech"
source_ref: "DefaultSounds/Readme.txt:39"
- name: CoinInS10Rejected.wav
system: fruitmachine
path: "DefaultSounds/CoinInS10Rejected.wav"
required: false
bundled: true
category: game_data
description: "Coin rejected from an S10 type mech"
source_ref: "DefaultSounds/Readme.txt:40, history.txt:47, 153"
- name: CoinInS10Switch.wav
system: fruitmachine
path: "DefaultSounds/CoinInS10Switch.wav"
required: false
bundled: true
category: game_data
description: "Coin accepted by an S1 or S10 type mech"
source_ref: "DefaultSounds/Readme.txt:41, history.txt:47"
- name: CoinInS10Token.wav
system: fruitmachine
path: "DefaultSounds/CoinInS10Token.wav"
required: false
bundled: true
category: game_data
description: "Token inserted in an S10 token type mech"
source_ref: "DefaultSounds/Readme.txt:43"
- name: CoinInS10TokenRejected.wav
system: fruitmachine
path: "DefaultSounds/CoinInS10TokenRejected.wav"
required: false
bundled: true
category: game_data
description: "Token rejected from an S10 token type mech"
source_ref: "DefaultSounds/Readme.txt:44, history.txt:47, 153"
- name: CoinInS10TokenSwitch.wav
system: fruitmachine
path: "DefaultSounds/CoinInS10TokenSwitch.wav"
required: false
bundled: true
category: game_data
description: "Token accepted by an S10 token type mech"
source_ref: "DefaultSounds/Readme.txt:45, history.txt:47"
- name: S1Locked.wav
system: fruitmachine
path: "DefaultSounds/S1Locked.wav"
required: false
bundled: true
category: game_data
description: "Coin refused by a locked out S1 mech"
source_ref: "DefaultSounds/Readme.txt:50"
# -- Comparator mech --
- name: CoinInDrop.wav
system: fruitmachine
path: "DefaultSounds/CoinInDrop.wav"
required: false
bundled: true
category: game_data
description: "Coin inserted in a comparator style mech"
source_ref: "DefaultSounds/Readme.txt:47"
- name: CoinDropReject.wav
system: fruitmachine
path: "DefaultSounds/CoinDropReject.wav"
required: false
bundled: true
category: game_data
description: "Coin rejected from a comparator style mech"
source_ref: "DefaultSounds/Readme.txt:48"
# -- Lockout solenoid --
- name: LockoutOn.wav
system: fruitmachine
path: "DefaultSounds/LockoutOn.wav"
required: false
bundled: true
category: game_data
description: "Lockout solenoid activated"
source_ref: "DefaultSounds/Readme.txt:52"
- name: LockoutOff.wav
system: fruitmachine
path: "DefaultSounds/LockoutOff.wav"
required: false
bundled: true
category: game_data
description: "Lockout solenoid deactivated"
source_ref: "DefaultSounds/Readme.txt:53"
# -- Stepper reels --
- name: Stepper.wav
system: fruitmachine
path: "DefaultSounds/Stepper.wav"
required: false
bundled: true
category: game_data
description: "SRU, SYS80 and MPS2 200 step reel motor"
source_ref: "DefaultSounds/Readme.txt:55, history.txt:74"
note: >-
Shipped only as tech copies under DefaultSounds/Custom/ for ELECTROCOIN,
MPS2, SRU and SYSTEM80, and as stepper.wav for M1AB. Reel effects were
extended to Maygay M1a and made available to other techs in v20.0.
# -- Prize vend --
- name: PrizeMotor.wav
system: fruitmachine
path: "DefaultSounds/PrizeMotor.wav"
required: false
bundled: true
category: game_data
description: "Prize vend motor started"
source_ref: "DefaultSounds/Readme.txt:57"
- name: PrizeVend.wav
system: fruitmachine
path: "DefaultSounds/PrizeVend.wav"
required: false
bundled: true
category: game_data
description: "Prize dispensed"
source_ref: "DefaultSounds/Readme.txt:58"
note: "Listed as Prizevend.wav in the readme, shipped as PrizeVend.wav."
# -- Pull handle --
- name: PullHandleSlow.wav
system: fruitmachine
path: "DefaultSounds/PullHandleSlow.wav"
required: false
bundled: true
category: game_data
description: "Pull handle drawn slowly"
source_ref: "DefaultSounds/Readme.txt:60, history.txt:207"
- name: PullHandleNormal.wav
system: fruitmachine
path: "DefaultSounds/PullHandleNormal.wav"
required: false
bundled: true
category: game_data
description: "Pull handle drawn at normal speed"
source_ref: "DefaultSounds/Readme.txt:61, history.txt:207"
- name: PullHandleFast.wav
system: fruitmachine
path: "DefaultSounds/PullHandleFast.wav"
required: false
bundled: true
category: game_data
description: "Pull handle drawn quickly"
source_ref: "DefaultSounds/Readme.txt:62, history.txt:207"
- name: PullHandleRelease.wav
system: fruitmachine
path: "DefaultSounds/PullHandleRelease.wav"
required: false
bundled: true
category: game_data
description: "Pull handle released"
source_ref: "DefaultSounds/Readme.txt:63, history.txt:207"
# -- Electromechanical cabinets --
- name: MotorOn.wav
system: fruitmachine
path: "DefaultSounds/MotorOn.wav"
required: false
bundled: true
category: game_data
description: "Reel motor activated on an EM machine"
source_ref: "DefaultSounds/Readme.txt:68"
- name: Wiper.wav
system: fruitmachine
path: "DefaultSounds/Wiper.wav"
required: false
bundled: true
category: game_data
description: "Reel with studs spinning on an EM machine"
source_ref: "DefaultSounds/Readme.txt:69"
- name: SolenoidOn.wav
system: fruitmachine
path: "DefaultSounds/SolenoidOn.wav"
required: false
bundled: true
category: game_data
description: "Reel solenoid activated on an EM machine"
source_ref: "DefaultSounds/Readme.txt:70"
- name: SolenoidOff.wav
system: fruitmachine
path: "DefaultSounds/SolenoidOff.wav"
required: false
bundled: true
category: game_data
description: "Reel solenoid deactivated on an EM machine"
source_ref: "DefaultSounds/Readme.txt:71"
- name: BellOn.wav
system: fruitmachine
path: "DefaultSounds/BellOn.wav"
required: false
bundled: true
category: game_data
description: "Bell switched on"
source_ref: "DefaultSounds/Readme.txt:72"
- name: BellOff.wav
system: fruitmachine
path: "DefaultSounds/BellOff.wav"
required: false
bundled: true
category: game_data
description: "Bell switched off"
source_ref: "DefaultSounds/Readme.txt:73"
- name: Buzzer.wav
system: fruitmachine
path: "DefaultSounds/Buzzer.wav"
required: false
bundled: true
category: game_data
description: "Nudge buzzer activated"
source_ref: "DefaultSounds/Readme.txt:74"
- name: Sounder.wav
system: fruitmachine
path: "DefaultSounds/Sounder.wav"
required: false
category: game_data
description: "Feature sounder activated on an EM machine"
source_ref: "DefaultSounds/Readme.txt:75"
note: "Effect name documented by MFME with no sample in the distribution."