summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/ioport.cpp
Commit message (Collapse)AuthorAgeFilesLines
* -ui: Made zoom controls a bit more intuitive. Vas Crabb2021-09-061-4/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * 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.)
* formats, osd, util: Started refactoring file I/O stuff. (#8456) Vas Crabb2021-08-221-30/+47
| | | | | | | | | 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.
* Slightly cleaned up OSD input modules. Vas Crabb2021-07-291-4/+4
| | | | | | | | | | 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.
* API cleanups and miscellaneous fixes. Vas Crabb2021-07-151-193/+271
| | | | | | | | | | | | | | | | 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.
* -Miscellaneous improvements for software lists: Vas Crabb2021-06-231-10/+14
| | | | | | | | | | | | * 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.
* emu/ioport.cpp: Preserve configuration for slot cards when not selected. Vas Crabb2021-06-231-41/+94
| | | | | | | | 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.
* Eliminate ARRAY_LENGTH template in favor of C++17's std::size AJR2021-02-141-10/+7
| | | | | | | | | | * 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
* Much more core std::string_view modernization AJR2021-01-201-1/+2
| | | | | | | | | | | | | | | - 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
* ioport.cpp: Eliminate redundant std::string("...").c_str() pattern AJR2020-12-311-13/+13
|
* natkeyboard: Remove from ioport_manager AJR2020-12-261-18/+17
|
* Eliminate many unnecessary c_str calls AJR2020-12-211-2/+2
|
* unicode.h: Updates AJR2020-12-151-0/+1
| | | | | - 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
* Fairly significant overhaul of Lua engine and some cleanup. Vas Crabb2020-11-251-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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.
* emu/ioport.cpp: Improved initial keyboard enable settings when changing slot ↵ Vas Crabb2020-10-111-1/+39
| | | | options.
* -emu/natkeyboard.cpp: Allow keyboard devices to be enabled/disabled. Vas Crabb2020-10-111-2/+34
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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.
* Got rid of global_alloc/global_free. Vas Crabb2020-10-031-7/+7
| | | | | | | | | | | | | | | | | | | | | | | | | 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.
* ioport: Transfer crosshair polling loop to render_crosshair AJR2020-08-301-51/+5
|
* Slotified Mac 128k/512k/512ke/Plus keyboard port. Vas Crabb2020-07-011-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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 963a2c166d080e78e6de7fe432ed7944c59a6083. -----------------------------------------------------------------------
* srcclean and cleanup (nw) Vas Crabb2020-06-211-2/+2
|
* emu: correct some file headers (nw) hap2020-06-191-1/+1
|
* Setting analog inputs don't work in LUA (#6812) tim lindner2020-06-121-3/+26
| | | | * fixed set_value for analog inputs.
* new machines marked as working Mirko2020-06-111-0/+2
| | | | | ----------------------------- Super Motor (prototype) [Mirko Buffoni, Roberto Fresca, Retromaniacs, recreativas.org]
* Merge pull request #6195 from firewave/includes R. Belmont2020-01-221-2/+2
|\ | | | | use C++ library includes (nw)
| * use C++ library includes (nw) firewave2020-01-221-2/+2
| |
* | fixed some clang-tidy warnings (nw) (#6197) Oliver Stöneberg2020-01-221-2/+2
|/ | | | | | | | | | | | | | * 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)
* Eliminate simple_list_wrapper and replace its only use (nw) AJR2020-01-181-4/+4
| | | | The replacement of append with emplace_front alters the sequence, but that should cause no difference in behavior here.
* UI input menu: treat codes containing a postive and negative of the same ↵ Vas Crabb2019-11-211-31/+39
| | | | | | | | 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
* UI input mapping menu updates: Vas Crabb2019-11-211-1/+1
| | | | | | | | | | | | | | | | | | | | | | * When a switch-type input is selected, show feedback when it's pressed * If an invalid code is entered (e.g. only negatives) abandon the change rather than cycling default/none * If an invalid code is entered display a message until the user takes some other action input.cpp updates: * constexpr crusade on input_code and input_seq and some very slight optimisation to input_seq * seq_poll* is a frontend function and had no business being in the core, so it's a utility class now * seq_poll* now exposes a bit more detail, enabling improved interaction on the UI inputs menu * global state is reduced a little, but the poll_* functions are still members of the input manager with global state (nw) The Lua engine has been updated in a way that maintains source compatibility with existing Lua scripts. This is less than ideal, but it minimises impact. Ideally someone (possibly me) will be able to expose the input sequence poller helper properly. I tested the changes with the cheat and autofire plugins and I was able to assign sequences. However I found two issues: it's seems impossible to assign a more complex sequence than a single key/button in the autofire plugin (i.e. no AND or NOT conditions, I confirmed this is pre-existing, not a regression), and in both the cheat and autofire plugins I found it a bit unwieldy trying to enter a complex sequence without live feedback of the sequence as it's built (this was also applicable to MAME's own input mapping menu until I added the live display yesterday).
* ioport.cpp: small cleanup (nw) Vas Crabb2019-11-191-3/+4
|
* Remove internal autofire functionality as there's a plugin for that now (#5802) Vas Crabb2019-11-171-26/+5
|
* Make devdelegate more like devcb for configuration. This is a Vas Crabb2019-10-261-3/+6
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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.
* Make osd_printf_* use util/strformat semantics. Vas Crabb2019-09-261-9/+9
| | | | | | | | | | | | | | | | | (nw) This has been a long time coming but it's here at last. It should be easier now that logerror, popmessage and osd_printf_* behave like string_format and stream_format. Remember the differences from printf: * Any object with a stream out operator works with %s * %d, %i, %o, %x, %X, etc. work out the size by magic * No sign extending promotion to int for short/char * No widening/narrowing conversions for characters/strings * Same rules on all platforms, insulated from C runtime library * No format warnings from compiler * Assert in debug builds if number of arguments doesn't match format (nw) Also removed a pile of redundant c_str and string_format, and some workarounds for not being able to portably format 64-bit integers or long long.
* (nw) get rid of the rest of assert_always - it's better to be explicit about ↵ Vas Crabb2019-09-201-6/+12
| | | | what this thing is supposed to do
* PORT_CUSTOM simplification (nw) AJR2019-09-141-3/+2
| | | | | | | | | | | | - Remove both arguments from CUSTOM_INPUT_MEMBER (adding template parameters as necessary) - Remove 'param' from PORT_CUSTOM_MEMBER and assume 'device' is DEVICE_SELF (use PORT_CUSTOM_DEVICE_MEMBER if it isn't) - Replace PORT_CUSTOM_MEMBER with PORT_READ_LINE_MEMBER where applicable Add implicit DEVICE_SELF variants of PORT_READ_LINE_DEVICE_MEMBER and PORT_WRITE_LINE_DEVICE_MEMBER (nw) Remove ioport_field argument from PORT_CROSSHAIR_MAPPER (nw) captflag, gmgalax: Separate driver classes from base (nw)
* ioport: Change PORT_CHANGED_MEMBER param type from void * to u32 (nw) AJR2019-08-151-1/+1
|
* New working machine added hap2019-04-151-1/+1
| | | | | --------- Great Game Machine [hap, bataais]
* Make "Keypad ," and "Keypad =" standard keys AJR2018-05-111-0/+2
|
* Stop including random strings of question marks in key names AJR2017-12-191-1/+1
|
* Fix core rounding error with analog input sensitivity scaling (nw) AJR2017-11-211-1/+1
|
* Better wraparound handling for relative inputs AJR2017-11-131-27/+26
|
* Hit save (nw) angelosa2017-10-171-1/+1
|
* Proposed fix for MT #06154 (nw) angelosa2017-10-171-1/+7
|
* Added support for multiple PORT_CHAR() bindings, and adopted in the CoCo ↵ Nathan Woods2017-09-241-12/+30
| | | | driver (addresses MT#2618)
* Merge pull request #2647 from npwoods/key_name_switch_formatting hap2017-09-161-45/+45
|\ | | | | Changing switch statement in ioport_field::key_name() to MAME favored formatting
| * Changing switch statement in ioport_field::key_name() to MAME favored formatting Nathan Woods2017-09-101-45/+45
| |
* | ioport: remove really bad usage of machine->rand() (nw) hap2017-09-151-7/+2
| |
* | Using a better overload of utf8_from_uchar() in ioport_field::key_name (nw) Nathan Woods2017-09-101-6/+1
|/
* Added a natural keyboard validation to check for valid natural keyboard ↵ npwoods2017-09-051-9/+2
| | | | (uni)codes (#2618)
* ioport.cpp: return explicit "file not found" error if inp file isn't found ↵ angelosa2017-08-251-1/+8
| | | | on playback, added error code number to any other error found [Angelo Salese]
* Amiga keyboard updates: Vas Crabb2017-02-051-2/+2
| | | | | | | | | | | * Fixed Shift-Alt combinations with natural keyboard * Fixed crash on keyboard inputs with four characters * Corrected polarity of KB_DATA from Amiga to keyboard * Completely rewrote 68HC05CxA-based A1200 keyboard device, now working * Fixed KB_DATA mixing in A500 keyboard * Made A500 keyboard caps lock LED output name consistent with A1200 * Added Alt- and Alt-Shift- characters to A500 US keyboard * Fixed natural keyboard modifiers with LLE keyboards