Go to file
Vas Crabb ffd19cda0f Restrict ROM labels to a filesystem- and shell-safe subset of printable
ASCII.

This has not been done unilaterally - I have the support of @galibert,
@Tafoid, and @rb6502 to do something about the current free-for-all.

The trouble with the ROM label field in MAME is that it serves multiple
competing purposes: it's supposed to identify the device in the original
system, and also act as a filename when searching for media image files
to load.  It also has to appear in listings of needed/missing files
(e.g. in cases where the image _isn't_ found).

To identify the original device, the ROM label field in MAME often
contains text derived from some combination of one or more of the text
on a label if present, the silkscreen on an IC package, the location on
the circuit board, and the device designation.  There's no standard for
the order in which these appear and how they're separated.  Some people
add arbitrary filename extensions and other annotations.

There are practical limitations on what can appear in the string, given
it's used as a filename:
* Path/name length limits.
* Restrictions on characters that can appear in a filename.
* Practicality of using the filename in a command-line environment.
* Ambiguity when describing a filename.

Filesystems themselves typically restrict characters in filenames:
* Windows defines MAX_PATH as 260 characters - longer paths are
  difficult to use with Win32 APIs and don't work properly in Windows
  Explorer
* Most filesystems don't allow ^@ or the path separator in names.
* Windows doesn't allow C0 control characters or <>:"/\|?* characters in
  filenames.
* Filesystems may have collation, e.g. FAT16 is case-folding, NTFS and
  HFS+ are case-preserving but case-insensitive, while EXT and XFS are
  case-sensitive.
* Filesystems may perform Unicode normalisation, e.g. NTFS forces NFC,
  HFS+ forces NFD, while ZFS stores filenames as supplied at creation,
  but may be configured to apply normalisation when testing equality.

Shells use various ASCII characters for special purposes:
* C0 control characters for line editing and control (e.g. ^C to cancel
  a line, ^V for control charecter escape, ^R for history search).
* The "'\ chracaters for quoting/escaping.
* The ><| characters for redirection.
* The *?[] characters for pattern matching.
* The ${}~ characters for variable substitution/sequence expansion.
* The ! or ^ characters for history substitution.
* The ()` characters for controlling subshells.
* The %& characters for job control.
* The ; character as a command separator.
* The # character for comments.

There's also the issue of whether users across a range of locales will
be able to type/display characters.  We still don't have good support
for Unicode console output on Windows (std::wcout doesn't seem to work
properly), many users don't install C/J/K fonts, and many users aren't
comfortable entering text in unfamiliar languages.  This means we're
limited to printable ASCII for practical purposes.

The practical limitations mean the subset of "safe" characters is
limited to ASCII digits, either uppercase or lowercase English Latin
(but not both due to collation behaving differently across systems), and
the +,-.=_ punctuation chracters.  We've decided on lowercase, digits,
and safe punctuation.  In addition to this, spaces are allowed, as they
can be quoted/escaped easily enough if no other special characters are
used.

There have been some arguments that allowing uppercase is "more
accurate", but in practical terms it doesn't add much value.  A string
in a C++ program can't represent layout, relative size of text, colour
and shape of the label, text font, graphics, and many other details.  It
also does nothing to address labels with text outside the English Latin
alphabet (e.g. labels with Chinese ideographs).  Besides missing
information, the lack of hard and fast rules means you need to intuit
what a label string in MAME is trying to represent.  There is simply no
substitute for photographs.  There wasn't even any consistency in case
within individual machine sets.  For example, several games in
vigilant.cpp had inconsistent case for "ic" vs "IC" in designation
suffixes, and ibm6850.cpp had inconsistent case for filename extensions
withing a set.  There were sets that used uppercase for text from the
label but not from the part number/PCB location, and vice versa.  It was
a huge mess.

There's some merit to the idea of allowing a wider variety of characters
in the label strings in the source, and mapping to a more restricted set
when searching for files.  However it creates more issues than it
solves.  It would require a change to the XML output to provide both the
label and filename, and a corresponding change to external ROM
management tools.  It would be impractical to do for software lists,
because it would require ROM management tools to implement the exact
same mapping algorithm as MAME.

But that aside, actually doing useful mapping would be impractical.
What would you do with C/J/K ideographs, like the chip labelled
東方不敗 (Dongfang Bubai)?  There's no intuitive way to do the mapping
wtihout incluing something like Unihan data, which would add a lot of
bloat.  Even the, without a language hint the Romanisation would be less
than ideal in many cases (using Chinese reading for Japanese text and
vice versa).  There's still the messy issue of filesystem collation to
deal with.

We do allow full Unicode in comments in the source.  If you want to
provide a more detailed description of a ROM label, that's the place for
it.  You've got more characters available, and the possibility of using
mulitple lines.  There are too many other competing requirements on the
label field in the ROM definitions.
2018-03-18 06:34:43 +11:00
3rdparty temp workaround for gcc 7.3 (nw) 2018-01-27 17:40:38 +02:00
android-project version bump (nw) 2018-02-28 02:59:06 +11:00
artwork move some content for release archive out of build repo into main repo 2017-08-14 19:30:35 +10:00
benchmarks Updates "2017" strings to "2018" where relevant. 2018-01-06 00:48:05 +11:00
bgfx Updated GENie, BGFX, BX, added BIMG since it is separated now, updated all shader binaries and MAME part of code to support new interfaces [Miodrag Milanovic] 2017-12-01 13:22:27 +01:00
ctrlr move some content for release archive out of build repo into main repo 2017-08-14 19:30:35 +10:00
docs Spelling fix in castool documentation (nw) 2018-03-06 13:37:56 +00:00
doxygen doc: update MAME short description (nw) 2017-11-05 18:12:28 +01:00
hash Merge pull request #3339 from FakeShemp/dc_g 2018-03-16 04:24:12 -04:00
hlsl Revert "New phosphor persistence shaders for HLSL" 2017-01-05 12:30:07 -05:00
ini/presets Revert "New phosphor persistence shaders for HLSL" 2017-01-05 12:30:07 -05:00
keymaps fix some typos (#2772) 2017-11-03 14:58:54 +01:00
language fix French spelling (github #3279) 2018-03-01 19:46:24 +11:00
nl_examples Doxygen work. How the heck can one enforce a consistent device 2017-02-05 17:19:51 +01:00
plugins plugins/portname: describe revised format 2018-03-14 17:13:59 -05:00
projects
regtests fix some typos (#2772) 2017-11-03 14:58:54 +01:00
roms Restore this, it's used when building packages (nw) 2017-10-25 01:34:02 +11:00
samples move some content for release archive out of build repo into main repo 2017-08-14 19:30:35 +10:00
scripts IEEE-488 remotizer device (#3241) 2018-03-18 05:20:00 +11:00
src Restrict ROM labels to a filesystem- and shell-safe subset of printable 2018-03-18 06:34:43 +11:00
tests Updates "2017" strings to "2018" where relevant. 2018-01-06 00:48:05 +11:00
web Updates "2017" strings to "2018" where relevant. 2018-01-06 00:48:05 +11:00
.drone.sec
.drone.yml
.gitattributes move some content for release archive out of build repo into main repo 2017-08-14 19:30:35 +10:00
.gitignore move some content for release archive out of build repo into main repo 2017-08-14 19:30:35 +10:00
.travis.yml Update .travis.yml 2017-07-23 00:45:52 +02:00
dist.mak add a clean target to dist.mak, mark targets phony (nw) 2017-08-14 21:05:28 +10:00
LICENSE.md missed one, sorry *nw* 2017-08-25 12:01:11 -04:00
makefile Start squeezing out the poor-performing parts of the output_manager: 2018-02-28 21:19:37 +11:00
README.md Updates "2017" strings to "2018" where relevant. 2018-01-06 00:48:05 +11:00
uismall.bdf Updates "2017" strings to "2018" where relevant. 2018-01-06 00:48:05 +11:00

MAME

Join the chat at https://gitter.im/mamedev/mame

Build status for tiny build only, containing just core parts of project:

OS/Compiler Status
Linux GCC / OSX Clang Build Status
Windows MinGW Build Status

Static analysis status for entire build (except for third-party parts of project):

Coverity Scan Status

What is MAME?

MAME is a multi-purpose emulation framework.

MAME's purpose is to preserve decades of software history. As electronic technology continues to rush forward, MAME prevents this important "vintage" software from being lost and forgotten. This is achieved by documenting the hardware and how it functions. The source code to MAME serves as this documentation. The fact that the software is usable serves primarily to validate the accuracy of the documentation (how else can you prove that you have recreated the hardware faithfully?). Over time, MAME (originally stood for Multiple Arcade Machine Emulator) absorbed the sister-project MESS (Multi Emulator Super System), so MAME now documents a wide variety of (mostly vintage) computers, video game consoles and calculators, in addition to the arcade video games that were its initial focus.

How to compile?

If you're on a *NIX or OSX system, it could be as easy as typing

make

for a MAME build,

make SUBTARGET=arcade

for an arcade-only build, or

make SUBTARGET=mess

for MESS build.

See the Compiling MAME page on our documentation site for more information, including prerequisites for Mac OS X and popular Linux distributions.

For recent versions of OSX you need to install Xcode including command-line tools and SDL 2.0.

For Windows users, we provide a ready-made build environment based on MinGW-w64.

Visual Studio builds are also possible, but you still need build environment based on MinGW-w64. In order to generate solution and project files just run:

make vs2015

or use this command to build it directly using msbuild

make vs2015 MSBUILD=1

Where can I find out more?

Contributing

Coding standard

MAME source code should be viewed and edited with your editor set to use four spaces per tab. Tabs are used for initial indentation of lines, with one tab used per indentation level. Spaces are used for other alignment within a line.

Some parts of the code follow Allman style; some parts of the code follow K&R style -- mostly depending on who wrote the original version. Above all else, be consistent with what you modify, and keep whitespace changes to a minimum when modifying existing source. For new code, the majority tends to prefer Allman style, so if you don't care much, use that.

All contributors need to either add a standard header for license info (on new files) or inform us of their wishes regarding which of the following licenses they would like their code to be made available under: the BSD-3-Clause license, the LGPL-2.1, or the GPL-2.0.

License

The MAME project as a whole is distributed under the terms of the GNU General Public License, version 2 or later (GPL-2.0+), since it contains code made available under multiple GPL-compatible licenses. A great majority of files (over 90% including core files) are under the BSD-3-Clause License and we would encourage new contributors to distribute files under this license.

Please note that MAME is a registered trademark of Gregory Ember, and permission is required to use the "MAME" name, logo, or wordmark.

Copyright (C) 1997-2018  MAMEDev and contributors

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

Please see LICENSE.md for further details.