Go to file
Vas Crabb f81fbdb8d4 Make devdelegate more like devcb for configuration. This is a
fundamental change to show device delegates are configured.

Device delegates are now aware of the current device during
configuration and will resolve string tags relative to it.  This means
that device delegates need a device to be supplied on construction so
they can find the machine configuration object.  There's a
one-dimensional array helper to make it easier to construct arrays of
device delegates with the same owner.  (I didn't make an n-dimensional
one because I didn't hit a use case, but it would be a simple addition.)

There's no more bind_relative_to member - just call resolve() like you
would for a devcb.  There's also no need to cast nullptr when creating a
late bind device delegate.  The flip side is that for an overloaded or
non-capturing lambda you'll need to cast to the desired type.

There is one less conditional branch in the hot path for calls for
delegates bound to a function pointer of member function pointer.  This
comes at the cost of one additional unconditional branch in the hot
path for calls to delegates bound to functoids (lambdas, functions that
don't take an object reference, other callable objects).  This applies
to all delegates, not just device delegates.

Address spaces will now print an error message if a late bind error is
encountered while installing a handler.  This will give the range and
address range, hopefully making it easier to guess which memory map is
faulty.

For the simple case of allowing a device_delegate member to be
configured, use a member like this:

    template <typename... T> void set_foo(T &&...args) { m_foo_cb.set(std::forward<T>(args)...); }

For a case where different delegates need to be used depending on the
function signature, see src/emu/screen.h (the screen update function
setters).

Device delegates now take a target specification and function pointer.
The target may be:
* Target omitted, implying the current device being configured.  This
  can only be used during configuration.  It will work as long as the
  current device is not removed/replaced.
* A tag string relative to the current device being configured.  This
  can only be used during configuration.  It will not be callable until
  .resolve() is called.  It will work as long as the current device is
  not removed/replaced.
* A device finder (required_device/optional_device).  The delegate will
  late bind to the current target of the device finder.  It will not
  be callable until .resolve() is called.  It will work properly if the
  target device is replaced, as long as the device finder's base object
  isn't removed/replaced.
* A reference to an object.  It will be callable immediately.  It will
  work as long as the target object is not removed/replaced.

The target types and restrictions are pretty similar to what you already
have on object finders and devcb, so it shouldn't cause any surprises.
Note that dereferencing a device finder will changes the effect.  To
illustrate this:

    ...
    required_device<some_device> m_dev;
    ...
    m_dev(*this, "dev")
    ...
    // will late bind to "dev" relative to *this
    // will work if "dev" hasn't been created yet or is replaced later
    // won't work if *this is removed/replaced
    // won't be callable until resolve() is called
    cb1.set(m_dev, FUNC(some_device::w));
    ...
    // will bind to current target of m_dev
    // will not work if m_dev is not resolved
    // will not work if "dev" is replaced later
    // will be callable immediately
    cb2.set(*m_dev, FUNC(some_device::w));
    ...

The order of the target and name has been reversed for functoids
(lambdas and other callable objects).  This allows the NAME macro to
be used on lambdas and functoids.  For example:

    foo.set_something(NAME([this] (u8 data) { m_something = data; }));

I realise the diagnostic messages get ugly if you use NAME on a large
lambda.  You can still give a literal name, you just have to place it
after the lambda rather than before.  This is uglier, but it's
intentional.  I'm trying to drive developers away from a certain style.
While it's nice that you can put half the driver code in the memory map,
it detracts from readability.  It's hard to visualise the memory range
mappings if the memory map functions are punctuated by large lambdas.
There's also slightly higher overhead for calling a delegate bound to a
functoid.

If the code is prettier for trivial lambdas but uglier for non-trivial
lambdas in address maps, it will hopefully steer people away from
putting non-trivial lambdas in memory maps.

There were some devices that were converted from using plain delegates
without adding bind_relative_to calls.  I fixed some of them (e.g.
LaserDisc) but I probably missed some.  These will likely crash on
unresolved delegate calls.

There are some devices that reset delegates at configuration complete or
start time, preventing them from being set up during configuration (e.g.
src/devices/video/ppu2c0x.cpp and src/devices/machine/68307.cpp).  This
goes against the design principles of how device delegates should be
used, but I didn't change them because I don't trust myself to find all
the places they're used.

I've definitely broken some stuff with this (I know about asterix), so
report issues and bear with me until I get it all fixed.
2019-10-26 12:47:04 +11:00
3rdparty Merge pull request #5758 from vadosnaprimer/luaengine_ram 2019-10-19 12:11:13 -04:00
android-project version bump (nw) 2019-09-25 07:25:34 +10:00
artwork rendlay: render 7seg off-segments and background with alpha, this allows lcd 7segs (nw) 2019-07-26 16:48:06 +02:00
benchmarks (nw) Clean up the mess on master 2019-03-26 11:13:37 +11:00
bgfx -bgfx: Fixed opengl backend, nw 2019-10-21 16:34:41 +02:00
ctrlr move some content for release archive out of build repo into main repo 2017-08-14 19:30:35 +10:00
docs Make devdelegate more like devcb for configuration. This is a 2019-10-26 12:47:04 +11:00
doxygen (nw) misc stuff: 2019-10-09 02:26:45 +11:00
hash srcclean (nw) 2019-10-26 10:40:50 +11:00
hlsl HLSL Color Transforms and 3D LUT (#4043) 2018-10-07 11:42:30 -04:00
ini HLSL Color Transforms and 3D LUT (#4043) 2018-10-07 11:42:30 -04:00
keymaps (nw) Clean up the mess on master 2019-03-26 11:13:37 +11:00
language a few translations... 2019-06-26 13:14:53 +03:00
nl_examples nl_examples: commit some long overdue changes. (nw) 2019-09-12 01:02:01 +02:00
plugins hiscore.dat: fix MT07454 (nw) 2019-10-16 17:20:11 -05:00
projects Enable building projects that are separate of MAME but use same core and lives in separate git tree (nw) 2016-12-08 11:46:15 +01:00
regtests (nw) Clean up the mess on master 2019-03-26 11:13:37 +11: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 Make devdelegate more like devcb for configuration. This is a 2019-10-26 12:47:04 +11:00
src Make devdelegate more like devcb for configuration. This is a 2019-10-26 12:47:04 +11:00
tests (nw) Clean up the mess on master 2019-03-26 11:13:37 +11:00
web (nw) Clean up the mess on master 2019-03-26 11:13:37 +11:00
.appveyor.yml Continuous integration improvements (#5703) 2019-10-18 10:30:48 -04:00
.drone.sec [skip CI] Add irc bot notification for tea-ci (nw) 2016-05-29 10:03:56 +01:00
.drone.yml Can tea-ci build tools? 2016-07-08 15:35:57 +10:00
.gitattributes move some content for release archive out of build repo into main repo 2017-08-14 19:30:35 +10:00
.gitignore mega32x.cpp: refactor and convert read/write handlers to 16-bit space [Angelo Salese] 2019-06-22 14:43:16 +02:00
.travis.yml Continuous integration improvements (#5703) 2019-10-18 10:30:48 -04:00
dist.mak Add ini/examples to dist.mak (#4234) 2018-11-02 21:07:16 -04:00
LICENSE.md (nw) Clean up the mess on master 2019-03-26 11:13:37 +11:00
makefile Odroid n2 build fixes (#5751) 2019-10-18 10:31:08 -04:00
README.md (nw) Clean up the mess on master 2019-03-26 11:13:37 +11:00
uismall.bdf (nw) Clean up the mess on master 2019-03-26 11:13:37 +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
Windows MSVC 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 vs2017

or use this command to build it directly using msbuild

make vs2017 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-2019  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.