This should address outstanding concerns with PR#2231. I'm trying to turn emu_options into a self contained structure that encapsulates behaviors related to options, including the gymnastics pertaining to image/slot loading and interactions with get_default_card_software() and "just works".
When the MAME 0.186 development cycle starts up, I hope to take this further. I want to make core_options::entry an abstract base class so that the entries associated with image options and slot options can derive from it. This will eliminate the current need for emu_options to directly expose maps for image and slot options.
For now, I'm in stabilization mode, and I hope to get things working for a stable 0.185 release.
This fix really doesn't go far enough. I added hooks so that options specified at the command line can also be responded to when parsed from INI files, but in the long run much of the logic that is currently in mame_options should go into emu_options so that when an option is specified, all of the wacko logic around slot/image specification "just works" because it is encapsulated within emu_options.
We have a release 11 days away; I want to be in stabilization mode.
- more use of c++ features
- some CRTP in pfmtlog
- demangled code for truthtables
- use more constexpr
- rewrite main loop
- use default constructors and assignment operators were applicable.
- optimized 7448 and 9316
All of this has decreased startup time by approx. 25% to 30%. Complex
netlists like pong or kidniki are parsed, analyzed and constructed in
around 15 ms. Run performance has increased by about 5%.
All in all not to bad. A game like pong uses a clock of 7 MHz (after
division by 2). Thats 14 MHz clock invocations. Running at over 200%, 28
MHz. On a 3.9 GHz Machine about 140 cycles/clock change.
[Couriersud]
* Introduced an 'util::arbitrary_clock' template class, to represent a clock that "knows" when the epoch starts
Also:
- Converted the NTFS filetime code to use util::arbitrary_clock
- Converted the Mac datetime code to use util::atribrary_clock
This is in preparation for a bigger change to Imgtool where I eliminate usage of time_t
pstring:
- added support for UTF16LE to pstring.
- renamed size() to mem_t_size()
- renmaed len() to length()
- added size() == length()
- added empty()
- added simple compare()
pfmtlog:
- Simplified pfmtlog, added more c++
pdynlib:
- add a dynproc type to dynlib to wrap dynamic library calls.
various:
- fix two coverty scan issue.
- various clang warnings fixed.
(nw)
This removes all allocation code from pstring. const_iterator is
consequently now based on pstring::const_iterator.
Removed pstring_buffer. This was class wasn't a good idea.
Vas was right: This change did not impact runtime performance. Startup
performance (string intensive) increased. (nw)
There are a few changes to achieve this:
* Rename to const_iterator since it's immutable
* Typedef iterator to const_iterator for now as there's no mutable iterator
* Add default constrcutor and operator-> required by concept, const-qualify operators
* Remove operator+ and operator+= since it's not a random-access iterator (use std::next and std::advance instead)
* Return reference/pointer to a proxy rather than a code_t value from opertator*/operator->
The final change is required to meet the requirement that operator* for
two equivalent forward iterators return an equivalent reference. The
pstring doesn't actually contain a sequence of code_t, so there's no way
to return a reference to code_t directly. Instead, a reference to a
proxy object aliased on the string storage is returned. The proxy is
implicitly convertible to code_t. The most noticeable side effect is
that auto c = *s.begin() or for (auto c : s) won't work. You need to do
for (auto &c : s) or for (code_t c : s) instead.
Fixed -Winconsistent-missing-destructor-override warnings. Made
some constructors of template classes and classes with virtual .. = 0
methods protected. Fixed src/lib/netlist/build/makefile (nw)
Small improvement for 7493.
Convert 9316 from subdevice to delegate.
Convert 74107 from subdevice style to delegate.
Also refactored inconsistencies in other parts of the code. (nw)
This is currently not used since performance drops by about 40%. The
typical use case would be circuits a lot more complex than those we
currently emulate where the 2*log(n) advantage really applies. (nw)
This change also changes around how command line arguments are passed around; specifically I changed argc/argv to be std::vector<std::string>
Note this is not passed around 'const', the reason being that the command line processing will now "eat" the vector
* Eliminates the need for emu_options::update_cached_options() by providing a hook for when option values change
* This is a preliminary fix to the issue identified in PR#2065
* More softlist related refactoring:
- We now only parse the command line (with core_options::parse_command_line()) once
- Options that are set up during slot and image setup go through a 'value_specifier' function
- Eliminated the command line postprocessing
- Moved 9312 and 74279 to ttl macro library.
- Renamed TTL_9312_* to DM9312. This is more appropriate.
- Fixed a number of warnings from latest ubuntu clang-5.0.
* Use size_t for sizes and <algorithm> for algorithms
* Fix up some files that were getting linked into multiple libs
* Add missing virtual method to sh2 peripheral class
* Put shortname in driver struct for locality
* Use shared pointers in config LRU cache for safety
Per Vas' request. If the compile fails for you (i'm thinking osx and
windows native debuggers here in particular), add '#include "emu.h"'
as first include of the cpp files that fail.
Due to our use of precompilation and forced inclusion, emu.h must be
included as the very first non-comment thing we do if we want to be
sure msvc compiles are identical to gcc/clang ones. Doing it directly
instead of through an include increases the correctness probability by
a magnitude.
... for updates. This will make device implementation more flexible and
faster. A nice side-effect is that there was some minor (<5%)
performance increase already. Each input is now assigned a notification
handler. Currently this is update, but going forward this may be a
custom handler. In addition
- fixed MEMPOOL on OSX
- removed dead code
- avoid bit-rot
- added delegate support for emscripten and arm processors
- added delegate support for VS 2015 x64
[Couriersud]
- Fixed crashes on terminals without nets (i.e. connected to a rail)
- Reviewed "FIXMEs" and corrected some minor ones.
- Made m_cur_analog protected.
- Fixed pmf delegates to work with msvc.
- More optimizations to the solver code.
- Started work on a better signal pipeline in nlwav
- Only generate documentation for entities which are documented.
[Couriersud]
Device implementations (all cpp files in netlist/devices) now should
only include nl_base.h.
Netlist implementation sources should only include "net_lib.h".
Refactored netlist.h and netlist.cpp to avoid namespace congestion in
netlist.h.
Fixed VC2015 build. (nw)
For netlist device debugging one can now use
#define LOG(...) log().info(__VA_ARGS__)
to use debugging and the known
#define LOG(...) do {} while (0)
do disable debugging on device level.
To avoid bitrot one could as well use
#define LOG(...) log().info.log<true>(__VA_ARGS__)
and
#define LOG(...) log().info.log<false>(__VA_ARGS__)
The later disables debugging. If the compiler can assume that there are
no side effects from e.g. using foo(a/b), 'LOG("abc {1:04x}",
foo(a/b));' should be completely optimized away.
Log channels available are info, verbose, warning, error and fatal.
Don't use debug, it is enabled only on specific debug builds.
Use would be e.g.
LOG("abc {1:04x}", 2);
The format specifier in the string are enclosed in "{}". "{2}" is the
second parameter after the format string. Types are determined
automatically. "{3:04x}" would format a number as a hexadecimal with 4
leading zeros.
[Couriersud]
- Remove virtual from some destructors and make them protected.
- Various cleanups.
- Small performance improvement.
- Fixed some inconsistencies.
- More c++ refactoring. (nw)
Make streams provide binary access only. Use putf8_reader and
putf8_writer to actually access streams. Replace some char * parameters
with pstring where appropriate. Minor code refactoring and move
functionality were it belongs. (nw)
At the same time, any char pointer has to be explicitly converted to
pstring by specifying an encoding. Not yet optimal, but certainly better
than what was there before.
Removed unneeded methods from pstring. (nw)
- refactored reverse polish notation evaluator into own source files.
- added function parameter to current and voltage sources VS and CS.
You can now use those to e.g. produce a sine wave.
- Changed code to allow devices to optionally be treated as dynamic or
timestepping devices.
[Couriersud]
nltool now is able to create all defines from the factory definitions.
This will reduce the number of places needed to touch when adding
devices and always ensure that the parser and statically compiled
netlist code use the same syntax. This will enable us to delete most
device include files, e.g. nld_74107.h.
Netlist usage to create this header file:
./nltool -c header > src/lib/netlist/devices/nld_devinc.h
This is not yet used in production. It will be enabled after additional
tests.
[Couriersud]
- Fixed OPENMP compile
For congo bongo, using Solver.PARALLEL=1 significantly increases
performance from 270% to 380%. However, this has to be taken
with a grain of salt. Enabling this on predominantly logic netlists
can severly kill performance.
- Increased readability of timed queue code.
into these files as well. The code uses <cfenv> which is part of c++11
standard. Non-standard glib extensions are currently only used on linux
and (i386 or x86_64). (nw)
1. Changed the Win32 code to use _O_U8TEXT()
2. Reordered system #includes
3. Changed a number of 'std::wcout << ...' to use util::stream_format()
I'm getting massive code compilation issues, and it isn't clear to me what the problem is. I'm committing my WIP right now, with the intention of reviewing the specifics soon.
I really don't like the prevalence of '#ifdef WIN32' in this change, both the _setmode() and bypassing codecvt. I strongly suspect that the latter is the consequence of some mistake that in practice doesn't cause problems in MSVC. I welcome all eyes.
Mario driver now uses netlist audio implementation instead of discrete
implementation. The previous discrete sound emulation has not been
removed yet because it still contains a lot of documentation.
[Couriersud]
The identifier is used to load data from a source_t implementation. This
allos a consistent approach in netlists independent of netlist
implementation. Both sources code and parameter code needed quite some
rewrite to support this. [Couriersud]
Renamed DM9334 to 9334 to align with naming convention used for other
93XX chips.
Added proper connection information for a number of chips to
net_lib.cpp. This allows to parse and run nl_hazelvid.cpp using nltool:
nltool -t 1 -f nl_hazelvid.cpp
* 7473: Made device only transition on a falling clock.
* 74161: Inverted Clear and Clock inputs to match datasheet.
* 74260: Fixed number of inputs.
* Am2847: Fixed shift register size (was 160 bits, should have been 80 bits)
* DM9334: Inverted C and E inputs to match datasheet.
-netlist: Added new devices: [Ryan Holtz]
* Intel 2102A 1Kbit (1024 x 1) Static RAM
* 74365 Hex Bus Driver with 3-State Outputs
* Generic 2- and 3-terminal Tristate device
* Note: Tristate device and 74365 do not actually tristate, they are simply a way of combining multiple outputs + chip enables.
selmenu: use LRU cache so icons don't all need to be reloaded on scroll
uismall.bdf: set default character for missing glyphs
rendfont.cpp:
* encapsulate many BDF and BDC handling details
* make file I/O 64-bit clean, check for allocation errors
* more solid BDF parser with error messages and trace logging
* fix heap smash when building bitmaps for BDF fonts
* extend BDC format to support high planes and default character
* render default character if glyph not found for BDF/BDC
* move stuff to namespace util::xml
* scope down some enums
* split config load/save delegate types
* make config load take const so it can't mangle data
* New abbreviated types are in osd and util namespaces, and also in global namespace for things that #include "emu.h"
* Get rid of import of cstdint types to global namespace (C99 does this anyway)
* Remove the cstdint types from everything in emu
* Get rid of U64/S64 macros
* Fix a bug in dps16 caused by incorrect use of macro
* Fix debugcon not checking for "do " prefix case-insensitively
* Fix a lot of messed up tabulation
* More constexpr
* Fix up many __names
* an empty tag and a self-closing tag are semantically equivalent, so std::string can be used saving some manual allocation
* a valid tag can't have an empty name, so that can be std::string too
* still expose empty strings as nullptr to API users
* scope down the int_format enum
* # is not £ ffs
* instantiate static constant members for ODR context
* declare static members of template classes properly
* declare external template instantiations
* fix blind use of autocomplete ("treats" really?)
* fix ptype_traits on platforms where char is unsigned
* signed char is never an alias for char even if char is signed
* even if eclipse doesn't like using type, surely it supports typedef
- Make most class methods constexpr
- Make color constants (white, black, etc.) into constexpr factory methods, in order to fix a static initialization problem discussed on the MAMEWorld forums.
(Note that while C++14 allows constexpr member variables to be initialized outside classes, current compilers' support for C++14 constexpr rules has proven to be lamentably deficient.)
- Create bitmap_rgb32::erase to simplify syntax in update handlers
Use standard uint64_t, uint32_t, uint16_t or uint8_t instead of UINT64, UINT32, UINT16 or UINT8
also use standard int64_t, int32_t, int16_t or int8_t instead of INT64, INT32, INT16 or INT8
Caveats:
1. Because of how this trick works, it is no longer possible to declare an option guide as static, so I had to make a bunch of changes
2. I'm going to want the hardcore C++ guys (i.e. - Vas) to review this with a fine toothed comb
* Make iterators actually meet requirements of ForwardIterator (and by consequence, ForwardIterator, Iterator and EqualityComparable)
* Don't use function statics if they can be avoided - it isn't thread-safe
* Remove leftover crud from when dynamic_buffer and friends were templates in lib/util
It's still dangerous that the const behaviour of iterators doesn't match STL.
Also, simple_list members with similar functionality to STL container members should be renamed.
The main point of this change is to C++-ify option_guide. It was changed from a struct array to a class, namespaced etc, with the ultimate hope of incorporating an in-emulation image creation UI.
Imgtool got hit with a number of changes; I'll probably have to bring that off of the backburner and touch that up too
This is just better error checking. You can see this if you create a garbage file named 'foo.csw' and invoke the following command:
mame bbcb -cass1 foo.csw
With this change you get an invalid image error. Without it, you get this:
Caught unhandled St12length_error exception: vector::_M_default_append
Use macro NL_NOEXCEPT if debug builds would throw an exception (e.g. by
using nl_assert). This is not entirely safe. Going forward, nl_assert
should call log first and than throw. (nw)
In the interests of removing burdens from client code, I also changed the following:
- filetype() will always return the file extension in lower case
- device_image_interface::filetype() will return the correct extension for files loaded as a part of softlists
- The code for extracting a file extension is now encapsulated in core_filename_extract_extension()
Client code has been updated
When UNICODE is defined LoadLibrary is redefined to LoadLibraryW which expects a widechar string as library name, while libname is always UTF8. Fixed copying TCHAR conversion code from strconv.cpp since netlist is meant to be also a stand-alone library.
- Removed trampolines (OUTLOGIC, INPLOGIC and friends).
- Started using doxygen comment and documentation style. Added doxygen
files to documentation folder.
- Refactored code triggered by doxygen output.
- Moved internal and support classes into namespace detail.
- Use an anordered map in parser.
- -Wconversion fixes - All done now.
- Fixed -Wold-style-cast warnings in netlist code.
- Added iterators to pstring.
- Moved two macros, added more RAII and improved exceptions. Fixed some
bugs in parser code.
- Fixed a number of bugs in parser code and exception handling.
[Couriersud]
* fixed copy of texture data to bitmap in BGFX
* changed AVI dimension to a lowest integral multiple of 4
(2 was still to low for most video players, e.g. VLC)
* added audio to AVI record in HLSL
* HLSL AVI record now uses window dimension instead of snap dimension