Commit Graph

139 Commits

Author SHA1 Message Date
Vas Crabb
1615b8551a
util/ioprocs.cpp: Added wrappers for common patterns. (#11608)
emu/diimage.h: Removed fread overloads that allocate memory for output.

util/core_file.cpp: Changed output size of load to size_t.
2024-02-25 02:27:26 +11:00
Vas Crabb
25b2829bab -emu/ioport.cpp: Allow punching holes in IPT_UNUSED and IPT_UNKNOWN.
-bus/waveblaster: Hide card implementations.
2023-12-11 02:31:59 +11:00
AJR
598957ce03 ioport.cpp, rendfont.cpp: Use multibyte.h functions 2023-09-21 18:52:58 -04:00
AJR
7eb0f531e8 ioport.cpp: Trim extra spaces in keyboard key names more safely 2023-09-17 14:32:45 -04:00
hap
ddbc47fc9b ioport: put IPT_ADJUSTER in same class as IPT_CONFIG 2023-05-22 13:54:34 +02:00
Vas Crabb
82394e8569 Adjustments to option priority interactions:
emu/sound.cpp: Made -volume in source file INI or higher priority
context take precedence over volume read from CFG file.  This matches
behaviour of -bgfx_screen_chains.

emu/input.cpp: Made explicit -no{mouse|joystick|lightgun} take
precedence over -{mouse|trackball|adstick|paddle}_device etc. from lower
priority levels.

Alos got rid of a bunch of unnecessary simple_list.
2023-05-09 01:49:41 +10:00
Vas Crabb
5f97af903c
-Lua engine: run everything in coroutines. (#11019)
* This lets you use emu.wait(...) directly without mucking around creating coroutines.
* Allow emu.wait to accept an attotime argument.
* Added a couple more wait helper functions.

-emu/profiler.h: Actually use scope-based profiling helpers.
* This makes the comment at the top of emu/profile.h less dishonest, and makes it easier to write exception-safe code.
* Got rid of some do { ... } while (0) loops that only existed so break could be used like a goto.
2023-03-25 05:53:58 +11:00
Vas Crabb
678b56c7de emu/ioport.cpp: Changed config save/load behaviour for conditional fields.
* See GitHub #10937 for issues with current approach.
* Only save configuration for enabled fields.
* Apply loaded configuration to all matching fields.
2023-03-01 03:22:48 +11:00
AJR
46e2b791c9 ioport.cpp: Minor fix to error message 2023-02-22 21:47:34 -05:00
Vas Crabb
b98fb7c98e Small batch of input refactoring:
emu/input.cpp: Fixed regression in display of some joystick inputs.

osd/interface: Split up interface classes into a few more files to
reduce where the input device interface class needs to be included.
Made OSD independent of concrete input_device class.

osd/modules/input, emu/inputdev.cpp, emu/ioport.cpp: Allow input devices
to provide tokens for controls without standard item types and
additional default input assignments.  Fixes issues assigning Yen and
Backslash on Japanese keyboards.

ui/textbox.cpp: Added a fixed-content text box menu class for future
use.

Got main.h out of emu.h as it’s only used in a very small number of
places, mostly for getting the application name.  Added eminline.h to
attotime.h as it's used without emu.h.  Cleaned up forward declarations
in emufwd.h a little.
2023-02-05 05:01:40 +11:00
Vas Crabb
dd355e4d68 docs: Added an introduction to the input system for developers.
emu/ioport.cpp: Removed a long-outdated comment that is now rather
misleading.
2023-02-03 18:02:45 +11:00
Vas Crabb
68472d3d72 Various input and OSD refactoring:
osd: Supply OSD object to modules on initialisation.  Encapsulated some
event handling in the OSD objects rather than leaving it in free
functions.  Put various stuff in namespaces.

osd/modules/input: Enabled dinput, xinput and winhybrid modules for
Windows SDL builds, and enabled background input for dinput and xinput
(and by extension winhybrid) modules.  Also fixed some COM and X11
resource leaks.

osd/modules/input/input_sdl.cpp: Flipped SDL mouse button order to match
Windows, and exposed vertical and horizontal scroll as Z and rZ axes.
Moved SDL UI event handling out of input devices into OSD object.

osd/modules/input_rawinput.cpp: Changed lightgun Z axis token so it's
correctly identified as a relative axis (it maps to the scroll wheel
equivalent).

osd: Added an option to choose the network provider module.  Mostly
useful if you build with both TUN/TAP and pcap support included, or if
you want to disable emulated networking completely.

emu/input.cpp: Use a better strategy for assembling input code names
that uses fewer temporary strings and doesn't require use of the
non-Unicode-aware space trimming function (fixes MT08552).

osd/modules/input_dinput.cpp: Improved polling logic.

osd: Made various parts of the input code less dependent on concrete emu
objects, and reduced inappropriately passing around the machine object.
Made input modules less dependent on OSD implementation.  Encapsulated
some stuff and got rid of some vestigial newui and SDL1 support code.
Cleaned up some interfaces.  Moved OSD options classes to their own
files.

Prepare to remove main.h from emu.h - it's mostly used to get the
application name, which the vast majority of emulated devices don't need
to do.
2023-01-29 03:16:14 +11:00
Vas Crabb
2498f2b7cf Miscellaneous fixes and refactoring:
ui/analogipt.cpp: Fixed bar graph display for fields with ranges
that wrap through zero.

emu/inputdev.cpp: Separateed analog axis deadzone and switch threshold
settings, reduced default deadzone, and fixed a potential division by
zero if the deadzone and saturation settings are equal.

emu/ioport.cpp: Fixed behaviour of absolute analog fields where range
passes through zero - it previously only worked for specific
combinations of mask, minimum and default.  Removed a workaround from
universal/getaway.cpp that is no longer necessary.

emu/input.cpp: Fixed unintuitive behaviour when an absolute field is
assigned an OR combination of a relative control folled by an absolute
control (e.g. Mouse X or Joy 1 LSX).  Also fixed reading axis input
sequences where an axis code is followed by a switch code (these can
only be produced by manually editing configuration files, not through
MAME's UI), and fixed the returned type when multiple relative axes sum
to zero.

osd/modules/input_dinput.cpp: Fixed hat switches being stuck in up
position when input is suspended in the background

taito/taitoio_yoke.cpp: Give throttle control a distinct type, and don't
auto-centre.

osd: Added option to select MIDI provider module (currently only
PortMidi and the dummy module are available).  Also put various things
in namespaces, and fixed builds including SDL sound module with native
Windows OSD.

emu/validity.cpp: Added check to catch I/O port fields using UI input
types.

emu/inpttype.ipp: Renamed inputs that were causing confusion.  "Bill"
and "Track" were causing confusion for translators and hence likely
causing confusion for many users, especially those who are not native
English speakers.  "Track" as an abbreviation for "Trackball" was
frequently being mistranslated, e.g. in the sense of a CD track
selection button or even in the sense of a railway track.  There's no
reason to abbreviate it.  "Bill" in the US English sense as a banknote
is too ambiguous and was causing confusion for translators.  It's better
to use the less ambiguous "Banknote".  Corrected Greek translations of
"Trackball".

Don't run GitHub Actions on issue template changes.
2023-01-28 08:16:53 +11:00
Vas Crabb
1964365f34 Optimisation, and baby steps towards untangling stuff:
Optimised the scheduler's handling of unscheduled timers - gives a 50%
performance improvement in some timer-heavy drivers.

Added better endianness swizzling helpers.

Got rid of some of the OSD input modules' dependence on concrete input
classes from emu.
2022-06-16 03:32:46 +10:00
feos
300206e308
Lua engine: Make setting analog I/O port field values user-friendly. (#9322)
Exposed minimum/maximum values for analog fields. together with defvalue, they can be used to check range of values and neutral position.

Previously you had to send a normalised value between -65535 and 65535 which would be scaled depending on machine specifics.  You could read the scaled value from the port, but you couldn't send scaled values in.  This allows scripts to set scaled values as seen by the machine.
2022-02-28 02:12:25 +11:00
AJR
0cb0cfd4c6 Remove fileio.h from emu.h 2022-02-11 23:22:46 -05:00
Vas Crabb
7d8c657fad Moved localised I/O port name lookup into I/O port manager.
Added pseudo format specifiers to controller port names: %p for player
and %% for literal percent symbol.  This lets you get the localised
player identifier in overridden input names (see NES and Neo-Geo for
examples), and reduces the number of messages to translate.

For translators, the new messages are mostly previously existing
messages with wording adjusted for clarity (e.g. referring to "media"
rather than "ROMs" in several places, as things like disk and tape
images are included).  It's also possible to localise the "???"
dipslayed for an input without a valid name, but that should never
actually appear in practice.
2021-12-09 07:42:12 +11:00
Vas Crabb
7d1ff26fb3 Fixed MT07153 (SlikStick configuration for asteroid not working).
Since asteroid overrides the default input assignments, slikstik.cfg
needs to use the syntax for overriding specific inputs.  There was also
a bug in how specific input overrides are applied.
2021-12-06 03:13:53 +11:00
Vas Crabb
13612bbe0f -emu/ioport.cpp: Fixed some default setting handling issues.
* Issues were unlikely to actually manifest unless you use controller
  configuration files to change specific system input defaults.

-src/emu/output.h: Added size accessor to multi-element output finder.

* std::size will work on the top rank of an outut finder now.  Sorry for
  hitting emu.h again so soon.

-lua: Exposed a couple more input related things.

* Exposed constructor and a few methods on input_seq required for
  scripts to properly clear assignments or restore default settings.
* Exposed ioport_manager::set_type_seq which is required to configure
  general input assignments properly.
* Removed unnecessary use of sol::overload in favour of optional
  parameters.
* Updated documentation and also fixed a few errors.

-docs: Added description for axis setting assignments.
2021-11-04 03:11:29 +11:00
Vas Crabb
d29287e092 -emu/ioport.cpp: Made default behaviour better.
* If an input is configured to some combination of controls that are not
  present at all, ignore the setting altogether for the session.
* Fixed relative axes with PORT_RESET not responding to absolute
  controls (MT07685).
* Fixed relative axes not responding to an absolute control if the value
  doesn’t change every frame (eg. holding a stick against the stop).
* Changed the scaling for absolute controls assigned to relative axes to
  make defaults more sane (e.g. arkanoid or spdheat with a joystick).

-frontend: Fixed some localisation issues in Analog Controls menu.

-docs: Added documentation on assigning inputs.
2021-11-03 19:41:40 +11:00
Vas Crabb
dd43f801a1 -emu/ioport.cpp: Fixed "MAME lost my joystick settings!!!1!11!
-plugins: Gave the timecode plugin an option to count emulated frames.
2021-11-03 05:18:06 +11:00
Vas Crabb
d775a2731d plugins: Moved the timecode recording functionality to a plugin. 2021-11-02 15:31:03 +11:00
Vas Crabb
aeb9eae874
util: Further API cleanups: (#8661)
* Turned `core_file` into an implementation of `random_read_write`.
* Turned PNG errors into a standard error category.
* Added a helper for generating what look like derived classes on-the-fly.
2021-10-05 03:34:45 +11:00
Vas Crabb
4f495994c4 -ui: Made zoom controls a bit more intuitive.
* The UI controls are described as zoom in/out, but they had the
  opposite effect on the palette and tile viewers.  That has been
  changed to make them consistent with the tilemap viewer.
* Made the default zoom key not act as a toggle.  People are familiar
  with the function of Ctrl+0/=/- in web browsers, so making them behave
  similarly in MAME should make it more approachable.  Also added the
  default zoom key to the relevant documentation page.
* Implemented the default zoom key for the palette and tile viewers.
* In the tilemap viewer, if the view is in default expand to fit mode,
  zoom in/out starting from the actual zoom ratio.  Once again, this
  behaves more like the zoom controls in a web browser displaying an
  image so it should be more intuitive.
* Made more messages from the tilemap viewer localisable.

-util/zippath.cpp: Fixed MT08074.

* There were multiple issues at play here.  After #8443 was applied,
  is_root was simply never returning true on Windows, as OSD_WINDOWS
  isn't actually defined outside libosd and libocore.  This caused
  phantom parent items to appear in disk roots on Windows, but it meant
  that the check in zippath_resolve would always fail so the trailing
  backslash would be trimmed.  Fixing the macro test in is_root meant
  the trailing backslash from C:\ would no longer be trimmed, which
  caused the stat in zippath_resolve to fail.

-bigbord2.cpp: Hooked up floppy DRQ that had somehow got lost.

-Reduced tag map lookups in several drivers and devices.

-util/coretmpl.h: Removed an overload of bitswap that can be avoided
 using if constexpr.

-Added doxygen comments to some classes, and fixed several doxygen
 warnings.

-util, osd: Test for _WIN32 rather than WIN32.

* In C++17 mode, WIN32 is no longer a predefined macro, although various
  things in 3rdparty define it to maintain legacy support.  We're better
  off moving forward anyway for when WIN32 disappears entirely.  (WIN32
  is not a reserved name, while _WIN32 is, starting with an underscore
  follwed by an uppercase letter.)
2021-09-06 06:34:42 +10:00
Vas Crabb
e8bbea1fc6
formats, osd, util: Started refactoring file I/O stuff. (#8456)
Added more modern generic I/O interfaces with implementation backed by stdio, osd_file and core_file, replacing io_generic.  Also replaced core_file's build-in zlib compression with a filter.

unzip.cpp, un7z.cpp: Added option to supply abstract I/O interface rather than filename.

Converted osd_file, core_file, archive_file, chd_file and device_image_interface to use std::error_condition rather than their own error enums.

Allow mounting TI-99 RPK from inside archives.
2021-08-22 09:06:15 +10:00
Vas Crabb
23bd2ecf6a Slightly cleaned up OSD input modules.
Removed support for DirectInput 7 and earlier.  It hasn't been tested in
years, and it's not relevant on any supported OS.  DirectInput is
effectively finalised at version 8, and is unlikely to get an API update
in the future.

Use more string[_view] and fewer C strings, and tightened up scope of a
few things.
2021-07-29 15:22:51 +10:00
Vas Crabb
3715746131 API cleanups and miscellaneous fixes.
emu/ioport.cpp: Allow controller files to override input sequences for
inputs that don't use defaults, and to override the toggle setting for
digital inputs.

emu/config.cpp: Expose configuration level (mostly matters for
controller files), improved verbose diagnostic messages, and moved a few
things out of the global and preprocessor namespaces.

docs: Added documentation for some controller configuration file
features.  The device mapping feature documentation will be merged in at
some point.

util/unicode.cpp, emu/input.cpp: API cleanups.
2021-07-15 13:54:40 +10:00
Vas Crabb
c9a62818e9 -Miscellaneous improvements for software lists:
* Show list name in software selection menu (machines have multiple
  lists).
* Actually report software list parsing errors during validation.
* Check that software list name attribute matches filename.
* Limit software list names to 24 characters - they're getting too long,
  and they need to be practical in command lines.
* c128.cpp: Fix dangling reference to renamed software list.

-emu/ioport.cpp: Slightly better test for deselected slot cards.
2021-06-23 16:08:59 +10:00
Vas Crabb
44e550af74 emu/ioport.cpp: Preserve configuration for slot cards when not selected.
Have you carefully tuned the sensitivity for you Atari 2600 paddles,
then realised you have to do it again after you play a joystick game and
switch back to paddles?  Or are you sick of having to reconfigure your
virtual RS232 peripherals every time you switch devices?  This will make
your life a little easier.
2021-06-23 00:10:46 +10:00
AJR
bc0146c203 Eliminate ARRAY_LENGTH template in favor of C++17's std::size
* osdcomm.h: Move definition of EQUIVALENT_ARRAY to coretmpl.h

* sharc.cpp, gt64xxx.cpp, ym2413.cpp, gb_lcd.cpp, snes_ppu.cpp: Use STRUCT_MEMBER for save state registration

* gio/newport.cpp, megadrive/svp.cpp, nes_ctrl/bcbattle.cpp, arm7.cpp, tms9995.cpp, pckeybrd.cpp, sa1110.cpp, sa1111.cpp, jangou_blitter.cpp, vic4567.cpp: Use std::fill(_n) instead of memset

* emucore.h: Remove obsolete typedef
2021-02-14 11:05:57 -05:00
AJR
91921618c2 Much more core std::string_view modernization
- Remove corestr.h from emu.h; update a few source files to not use it at all
- Change strtrimspace, strtrimrightspace and core_filename_extract_* to be pure functions taking a std::string_view by value and returning the same type
- Change strmakeupper and strmakelower to be pure functions taking a std::string_view and constructing a std::string
- Remove the string-modifying version of zippath_parent
- Change tag-based lookup functions in device_t to take std::string_view instead of const std::string & or const char *
- Remove the subdevice tag cache from device_t (since device finders are now recommended) and replace it with a map covering directly owned subdevices only
- Move the working directory setup method out of device_image_interface (only the UI seems to actually use the full version of this)
- Change output_manager to use std::string_view for output name arguments
- Change core_options to accept std::string_view for most name and value arguments (return values are still C strings for now)
- Change miscellaneous other functions to accept std::string_view arguments
- Remove a few string accessor macros from romload.h
- Remove many unnecessary c_str() calls from logging/error messages
2021-01-20 18:06:15 -05:00
AJR
7eddaea846 ioport.cpp: Eliminate redundant std::string("...").c_str() pattern 2020-12-31 18:43:54 -05:00
AJR
c04e2cbe0b natkeyboard: Remove from ioport_manager 2020-12-26 13:39:34 -05:00
AJR
0a5d207e66 Eliminate many unnecessary c_str calls 2020-12-21 22:47:30 -05:00
AJR
2ca5f3a386 unicode.h: Updates
- Remove from emu.h (except for UTF8_xxx macros, which have been transplanted to emucore.h since a lot of drivers use them) and osdepend.h
- Add std::string_view overrides for uchar_from_utf8 and normalize_unicode
2020-12-15 13:36:55 -05:00
Vas Crabb
ec80428647 Fairly significant overhaul of Lua engine and some cleanup.
The things that were previously called device iterators are not
iterators in the C++ sense of the word.  This is confusing for
newcomers.  These have been renamed to be device enumerators.

Several Lua methods and properties that previously returned tables now
return lightweight wrappers for the underlying objects.  This means
creating them is a lot faster, but you can't modify them, and the
performance characteristics of different operations varies.

The render manager's target list uses 1-based indexing to be more like
idiomatic Lua.

It's now possible to create a device enumerator on any device, and then
get subdevices (or sibling devices) using a relative tag.

Much more render/layout functionality has been exposed to Lua.  Layout
scripts now have access to the layout file and can directly set the
state of an item with no bindings, or register callbacks to obtain
state.  Some things that were previously methods are now read-only
properties.

Layout files are no longer required to supply a "name".  This was
problematic because the same layout file could be loaded for multiple
instances of the same device, and each instance of the layout file
should use the correct inputs (and in the future outputs) for the device
instance it's associated with.

This should also fix video output with MSVC builds by avoiding delegates
that return things that don't fit in a register.
2020-11-25 19:18:26 +11:00
Vas Crabb
a52c2f2ca5 emu/ioport.cpp: Improved initial keyboard enable settings when changing slot options. 2020-10-11 14:23:14 +11:00
Vas Crabb
c751a5348a -emu/natkeyboard.cpp: Allow keyboard devices to be enabled/disabled.
This fixes the "typing on all keyboards at once" issue.  You can now
enable and disable keyboard/keypad inputs per device in the Keyboard
Mode menu.  Default is to enable the first device with keyboard inputs,
and all device with keypad inputs but no keyboard inputs.  The settings
are saved in the CFG file for the machine.

Typing in natural keyboard mode only ever types on one keyboard at a
time, but now you can control which keyboard it types on, as it will be
the first enabled keyboard.

You can easily try this out with something like:
mame64d zorba -rs232 terminal cpm

-ui/inputmap.cpp: Show device descriptions as well as tag paths.

-mac128.cpp: Fixed mouse axis wrap compensation, cleaned up mouse code,
eliminated static variables for mouse input state.

You could see the issue with wrap detection easily enough just by
running mac128k/mac512k/macplus and tapping the arrow keys to move the
mouse one pixel at a time.  As you moved past the point where the axis
count wrapped, it would move one pixel in the opposite direction.

There were two function static variables related to mouse input state,
probably still lurking from when the code was initially made to use a
driver state class.  This obviously messes with save states and prevents
multiple instances.

- bus/a2bus/mouse.cpp: Fixed mouse axis wrap compensation.

This device had the same bug with wrap compensation as mac128k.cpp.
2020-10-11 02:58:46 +11:00
Vas Crabb
4f05917494 Got rid of global_alloc/global_free.
The global_alloc/global_free functions have outlived their usefulness.
They don't allow consistently overriding the default memory allocation
behaviour because they aren't used consistently, and we don't have
standard library allocator wrappers for them that we'd need to use them
consistently with all the standard library containers we're using.  If
you need to change the default allocator behaviour, you can override the
new/delete operators, and there are ways to get more fine-grained
control that way.  We're already doing that to pre-fill memory in debug
builds.

Code was already starting to depend on global_alloc/global_free wrapping
new/delete.  For example some parts of the code (including the UI and
Windows debugger) was putting the result of global_alloc in a
std::unique_ptr wrappers without custom deleters, and the SPU sound
device was assuming it could use global_free to release memory allocated
with operator new.  There was also code misunderstanding the behaviour
of global_alloc, for example the GROM port cartridge code was checking
for nullptr when a failure will actually throw std::bad_alloc.

As well as substituting new/delete, I've made several things use smart
pointers to reduce the chance of leaks, and fixed a couple of leaks,
too.
2020-10-03 03:00:24 +10:00
AJR
35f708384d ioport: Transfer crosshair polling loop to render_crosshair 2020-08-30 23:34:27 -04:00
Vas Crabb
802de3995d Slotified Mac 128k/512k/512ke/Plus keyboard port.
Available keyboards are us (M0110, U.S.), gb (M0110B, British), fr
(M0110F, French), pad (M0120F, numeric keypad with passthrough port)
and plus (M0110A, U.S. with integrated numeric keypad).  The mac128k,
mac512k and mac512ke drivers default to the numeric keypad with the
U.S. keyboard connected to the passthrough port; the macplus driver
defaults to the U.S. keyboard with integrated numeric keypad.

Note that the numeric keypad may seem strange.  Four of the operators
work as cursor arrows if you don't hold shift.  There is a comma on one
of the keys, but by the time System 6 was released, Apple had decided
an equals sign was more useful, so that's what it will produces on
newer system versions.  The U.S. keyboard with integrated numeric
keypad emulates these aspects of the stand-alone keypad - pressing the
operator keys on the keypad sends fake shit key down/up events, and
using the arrow keys while holding shift will produces operator
characters rather than selecting text.

The ISO layout keyboards (M0110B and M0110F) produce different scan
codes to the ANSI keyboards (M0110 and M0110A) but they don't report a
different identification byte.  To use an ISO keyboard, you must open
the Keyboard control panel and change the layout to International (and
change it back to Domestic if you switch back to an ANSI keyboard).

This doesn't actually work at the moment due to issues with 6522 VIA
emulation, but it will work with macplus sys603 if applied on top of
revision 963a2c166d.
-----------------------------------------------------------------------
2020-07-01 02:37:55 +10:00
Vas Crabb
01661be41c srcclean and cleanup (nw) 2020-06-21 14:59:50 +10:00
hap
128640144a emu: correct some file headers (nw) 2020-06-19 12:38:41 +02:00
tim lindner
e0715320f7
Setting analog inputs don't work in LUA (#6812)
* fixed set_value for analog inputs.
2020-06-12 14:44:27 +02:00
Mirko
956c2bd661 new machines marked as working
-----------------------------
Super Motor (prototype) [Mirko Buffoni, Roberto Fresca, Retromaniacs, recreativas.org]
2020-06-11 16:07:04 +02:00
R. Belmont
1a5b900759
Merge pull request #6195 from firewave/includes
use C++ library includes (nw)
2020-01-22 22:04:35 -05:00
Oliver Stöneberg
7c3aea8928 fixed some clang-tidy warnings (nw) (#6197)
* fixed some bugprone-throw-keyword-missing clang-tidy warnings (nw)

* fixed some modernize-use-nullptr clang-tidy warnings (nw)

* fixed some readability-delete-null-pointer clang-tidy warnings (nw)

* fixed some performance-faster-string-find clang-tidy warnings (nw)

* fixed some performance-for-range-copy clang-tidy warnings (nw)

* fixed some readability-redundant-string-cstr clang-tidy warnings (nw)
2020-01-22 22:03:35 -05:00
firewave
399515c7a7 use C++ library includes (nw) 2020-01-22 13:31:52 +01:00
AJR
35f45085fe Eliminate simple_list_wrapper and replace its only use (nw)
The replacement of append with emplace_front alters the sequence, but that should cause no difference in behavior here.
2020-01-18 23:08:04 -05:00
Vas Crabb
eaf07fffa3 UI input menu: treat codes containing a postive and negative of the same thing as invalid (e.g. A S not A)
ioport.cpp:
* better than 50% reduction in compile time, and better locality for static data
* better encapsulation, const correctness and noexcept usage
2019-11-21 16:07:04 +11:00