diff options
715 files changed, 25641 insertions, 15946 deletions
diff --git a/3rdparty/README.md b/3rdparty/README.md index 98caa58240e..9eaf693124a 100644 --- a/3rdparty/README.md +++ b/3rdparty/README.md @@ -56,6 +56,8 @@ sol2 - [The MIT License (MIT)](http://opensource.org/licenses/MIT) sqlite3 - Public Domain +tap-windows6 - [The GNU General Public License, version 2](https://opensource.org/licenses/GPL-2.0) + winpcap - [The BSD 3-Clause License](http://opensource.org/licenses/BSD-3-Clause) zlib - [zlib license](http://opensource.org/licenses/Zlib) diff --git a/3rdparty/tap-windows6/license.txt b/3rdparty/tap-windows6/license.txt new file mode 100644 index 00000000000..ae85fb6c451 --- /dev/null +++ b/3rdparty/tap-windows6/license.txt @@ -0,0 +1,360 @@ +tap-windows6 license
+--------------------
+
+The source and object code of the tap-windows6 project
+is Copyright (C) 2002-2014 OpenVPN Technologies, Inc. The
+NSIS installer is Copyright (C) 2014 OpenVPN Technologies,
+Inc. and (C) 2012 Alon Bar-Lev. Both are released under the
+GPL version 2. See COPYRIGHT.GPL for the full GPL license.
+The licensors also make the following statement borrowed
+from the SPICE project:
+
+With respect to binaries built using the Microsoft(R)
+Windows Driver Kit (WDK), GPLv2 does not extend to any code
+contained in or derived from the WDK ("WDK Code"). As to
+WDK Code, by using or distributing such binaries you agree
+to be bound by the Microsoft Software License Terms for the
+WDK. All WDK Code is considered by the GPLv2 licensors to
+qualify for the special exception stated in section 3 of
+GPLv2 (commonly known as the system library exception).
+ + GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ 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.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
+ diff --git a/3rdparty/tap-windows6/tap-windows.h b/3rdparty/tap-windows6/tap-windows.h new file mode 100644 index 00000000000..d546a5b1cb9 --- /dev/null +++ b/3rdparty/tap-windows6/tap-windows.h @@ -0,0 +1,74 @@ +/* + * TAP-Windows -- A kernel driver to provide virtual tap + * device functionality on Windows. + * + * This code was inspired by the CIPE-Win32 driver by Damion K. Wilson. + * + * This source code is Copyright (C) 2002-2014 OpenVPN Technologies, Inc., + * and is released under the GPL version 2 (see below). + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation. + * + * 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 (see the file COPYING included with this + * distribution); if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#ifndef __TAP_WIN_H +#define __TAP_WIN_H + +/* + * ============= + * TAP IOCTLs + * ============= + */ + +#define TAP_WIN_CONTROL_CODE(request,method) \ + CTL_CODE (FILE_DEVICE_UNKNOWN, request, method, FILE_ANY_ACCESS) + +/* Present in 8.1 */ + +#define TAP_WIN_IOCTL_GET_MAC TAP_WIN_CONTROL_CODE (1, METHOD_BUFFERED) +#define TAP_WIN_IOCTL_GET_VERSION TAP_WIN_CONTROL_CODE (2, METHOD_BUFFERED) +#define TAP_WIN_IOCTL_GET_MTU TAP_WIN_CONTROL_CODE (3, METHOD_BUFFERED) +#define TAP_WIN_IOCTL_GET_INFO TAP_WIN_CONTROL_CODE (4, METHOD_BUFFERED) +#define TAP_WIN_IOCTL_CONFIG_POINT_TO_POINT TAP_WIN_CONTROL_CODE (5, METHOD_BUFFERED) +#define TAP_WIN_IOCTL_SET_MEDIA_STATUS TAP_WIN_CONTROL_CODE (6, METHOD_BUFFERED) +#define TAP_WIN_IOCTL_CONFIG_DHCP_MASQ TAP_WIN_CONTROL_CODE (7, METHOD_BUFFERED) +#define TAP_WIN_IOCTL_GET_LOG_LINE TAP_WIN_CONTROL_CODE (8, METHOD_BUFFERED) +#define TAP_WIN_IOCTL_CONFIG_DHCP_SET_OPT TAP_WIN_CONTROL_CODE (9, METHOD_BUFFERED) + +/* Added in 8.2 */ + +/* obsoletes TAP_WIN_IOCTL_CONFIG_POINT_TO_POINT */ +#define TAP_WIN_IOCTL_CONFIG_TUN TAP_WIN_CONTROL_CODE (10, METHOD_BUFFERED) + +/* + * ================= + * Registry keys + * ================= + */ + +#define ADAPTER_KEY "SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E972-E325-11CE-BFC1-08002BE10318}" + +#define NETWORK_CONNECTIONS_KEY "SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}" + +/* + * ====================== + * Filesystem prefixes + * ====================== + */ + +#define USERMODEDEVICEDIR "\\\\.\\Global\\" +#define SYSDEVICEDIR "\\Device\\" +#define USERDEVICEDIR "\\DosDevices\\Global\\" +#define TAP_WIN_SUFFIX ".tap" + +#endif // __TAP_WIN_H diff --git a/docs/source/techspecs/index.rst b/docs/source/techspecs/index.rst index 6ed4435772a..67775ae3a74 100644 --- a/docs/source/techspecs/index.rst +++ b/docs/source/techspecs/index.rst @@ -6,6 +6,7 @@ This section covers technical specifications useful to programmers working on MA .. toctree:: :titlesonly: + layout_files device_memory_interface device_rom_interface device_disasm_interface diff --git a/docs/source/techspecs/layout_files.rst b/docs/source/techspecs/layout_files.rst new file mode 100644 index 00000000000..976f51475ca --- /dev/null +++ b/docs/source/techspecs/layout_files.rst @@ -0,0 +1,1103 @@ +MAME Layout Files +================= + +.. contents:: :local: + + +.. _layout-intro: + +Introduction +------------ + +Layout files are used to tell MAME what to display when running an emulated +system, and how to arrange it. MAME can render emulated screens, images, text, +shapes, and specialised objects for common output devices. Elements can be +static, or dynamically update to reflect the state of inputs and outputs. +Layouts may be automatically generated based on the number/type of emulated +screens, built and linked into the MAME binary, or provided externally. MAME +layout files are an XML application, using the ``.lay`` filename extension. + + +.. _layout-concepts: + +Core concepts +------------- + +.. _layout-concepts-numbers: + +Numbers +~~~~~~~ + +There are two kinds of numbers in MAME layouts: integers and floating-point +numbers. + +Integers may be supplied in decimal or hexadecimal notation. A decimal integer +consists of and optional # (hash) prefix, an optional +/- (plus or minus) sign +character, and a sequence of digits 0-9. A hexadecimal number consists of one +of the prefixes $ (dollar sign) or 0x (zero ex) followed by a sequence of +hexadecimal digits 0-9 and A-F. Hexadecimal numbers are case-insensitive for +both the prefix and digits. + +Floating-point numbers may be supplied in decimal fixed-point or scientific +notation. Note that integer prefixes and hexadecimal values are *not* +accepted where a floating-point number is expected. + +For a few attributes, both integers and floating-point numbers are allowed. In +these cases, the presence of a # (hash), $ (dollar sign) or 0x (zero ex) prefix +causes the value to be interpreted as an integer. If no recognised integer +prefix is found and the value contains a decimal point or the letter E +(uppercase or lowercase) introducing an exponent, it is interpreted as a +floating-point number. If no integer prefix, decimal point or letter E is +found, the number will be interpreted as an integer. + +Numbers are parsed using the "C" locale for portability. + + +.. _layout-concepts-coordinates: + +Coordinates +~~~~~~~~~~~ + +Layout coordinates are internally represented as IEEE754 32-bit binary +floating-point numbers (also known as "single precision"). Coordinates increase +in the rightward and downward directions. The origin (0,0) has no particular +significance, and you may freely use negative coordinates in layouts. +Coordinates are supplied as floating-point numbers. + +MAME assumes that view coordinates have the same aspect ratio as pixel on the +output device (host screen or window). Assuming square pixels and no rotation, +this means equal distances in X and Y axes correspond to equal horizontal and +vertical distances in the rendered output. + +Views, groups and elements all have their own internal coordinate systems. When +an element or group is referenced from a view or another group, its coordinates +are scaled as necessary to fit the specified bounds. + +Objects are positioned and sized using ``bounds`` elements. A bounds element +may specify the position of the top left corner and the size using ``x``, ``y``, +``width`` and ``height`` attributes, or it may specify the coordinates of the +edges with the ``left``, ``top``, ``right`` and ``bottom`` attributes. These +two ``bounds`` elements are equivalent:: + + <bounds x="455" y="120" width="11" height="7" /> + <bounds left="455" top="120" right="466" bottom="127" /> + +Either the ``x`` or ``left`` attribute must be present to distinguish between +the two schemes. The ``width`` and ``height`` or ``right`` and ``bottom`` +default to 1.0 if not supplied. It is an error if ``width`` or ``height`` are +negative, if ``right`` is less than ``left``, or if ``bottom`` is less than +``top``. + + +.. _layout-concepts-colours: + +Colours +~~~~~~~ + +Colours are specified in RGBA space. MAME is not aware of colour profiles and +gamuts, so colours will typically be interpreted as sRGB with your system's +target gamma (usually 2.2). Channel values are specified as floating-point +numbers. Red, green and blue channel values range from 0.0 (off) to 1.0 (full +intensity). Alpha ranges from 0.0 (fully transparent) to 1.0 (opaque). Colour +channels values are not pre-multiplied by the alpha value. + +Component and view item colour is specified using ``color`` elements. +Meaningful attributes are ``red``, ``green``, ``blue`` and ``alpha``. This +example ``color`` element specifies all channel values:: + + <color red="0.85" green="0.4" blue="0.3" alpha="1.0" /> + +Any omitted channel attributes default to 1.0 (full intensity or opaque). It +is an error if any channel value falls outside the range of 0.0 to 1.0 +(inclusive). + + +.. _layout-concepts-params: + +Parameters +~~~~~~~~~~ + +Parameters are named variables that can be used in most attributes. To use +a parameter in an attribute, surround its name with tilde (~) characters. If a +parameter is not defined, no substitution occurs. Here is an examples showing +two instances of parameter use -- the values of the ``digitno`` and ``x`` +parameters will be substituted for ``~digitno~`` and ``~x~``:: + + <bezel name="digit~digitno~" element="digit"> + <bounds x="~x~" y="80" width="25" height="40" /> + </bezel> + +A parameter name is a sequence of uppercase English letters A-Z, lowercase +English letters a-z, decimal digits 0-9, and/or underscore (_) characters. +Parameter names are case-sensitive. When looking for a parameter, the layout +engine starts at the current, innermost scope and works outwards. The outermost +scope level corresponds to the top-level ``mamelayout`` element. Each +``repeat``, ``group`` or ``view`` element creates a new, nested scope level. + +Internally a parameter can hold a string, integer, or floating-point number, but +this is mostly transparent. Integers are stored as 64-bit signed +twos-complement values, and floating-point numbers are stored as IEEE754 64-bit +binary floating-point numbers (also known as "double precision"). Integers are +substituted in decimal notation, and floating point numbers are substituted in +default format, which may be decimal fixed-point or scientific notation +depending on the value). There is no way to override the default formatting of +integer and floating-point number parameters. + +There are two kinds of parameters: *value parameters* and *generator +parameters*. Value parameters keep their assigned value until reassigned. +Generator parameters have a starting value and an increment and/or shift to be +applied for each iteration. + +Value parameters are assigned using a ``param`` element with ``name`` and +``value`` attributes. Value parameters may appear inside the top-level +``mamelayout`` element, inside ``repeat``, and ``view`` elements, and inside +``group`` definition elements (that is, ``group`` elements in the top-level +``mamelayout`` element, as opposed to ``group`` reference elements inside +``view`` elements other ``group`` definition elements). A value parameter may +be reassigned at any point. + +Here's an example assigning the value "4" to the value parameter "firstdigit":: + + <param name="firstdigit" value="4" /> + +Generator parameters are assigned using a ``param`` element with ``name`` and +``start`` attributes, and ``increment``, ``lshift`` and/or ``rshift`` +attributes. Generator parameters may only appear inside ``repeat`` elements +(see :ref:`layout-parts-repeats` for details). A generator parameter must not +be reassigned in the same scope (an identically named parameter may be defined +in a child scope). Here are some example generator parameters:: + + <param name="nybble" start="3" increment="-1" /> + <param name="switchpos" start="74" increment="156" /> + <param name="mask" start="0x0800" rshift="4" /> + +* The ``nybble`` parameter generates values 3, 2, 1... +* The ``switchpos`` parameter generates values 74, 230, 386... +* The ``mask`` parameter generates values 2048, 128, 8... + +The ``increment`` attribute must be an integer or floating-point number to be +added to the parameter's value. The ``lshift`` and ``rshift`` attributes must +be non-negative integers specifying numbers of bits to shift the parameter's +value to the left or right. The increment and shift are applied at the end of +the repeating block before the next iteration starts. If both an increment and +shift are supplied, the increment is applied before the shift. + +If the ``increment`` attribute is present and is a floating-point number, the +parameter's value will be interpreted as an integer or floating-point number and +converted to a floating-point number before the increment is added. If the +``increment`` attribute is present and is an integer, the parameter's value will +be interpreted as an integer or floating number before the increment is added. +The increment will be converted to a floating-point number before the addition +if the parameter's value is a floating-point number. + +If the ``lshift`` and/or ``rshift`` attributes are present and not equal, the +parameter's value will be interpreted as an integer or floating-point number, +converted to an integer as necessary, and shifted accordingly. Shifting to the +left is defined as shifting towards the most significant bit. If both +``lshift`` and ``rshift`` are supplied, they are netted off before being +applied. This means you cannot, for example, use equal ``lshift`` and +``rshift`` attributes to clear bits at one end of a parameter's value after the +first iteration. + +It is an error if a ``param`` element has neither ``value`` nor ``start`` +attributes, and it is an error if a ``param`` element has both a ``value`` +attribute and any of the ``start``, ``increment``, ``lshift``, or ``rshift`` +attributes. + +A ``param`` element defines a parameter or reassigns its value in the current, +innermost scope. It is not possible to define or reassign parameters in a +containing scope. + + +.. _layout-concepts-predef-params: + +Pre-defined parameters +~~~~~~~~~~~~~~~~~~~~~~ + +A number of pre-defined value parameters are available providing information +about the running machine: + +devicetag + The full tag path of the device that caused the layout to be loaded, for + example ``:`` for the root driver device, or ``:tty:ie15`` for a terminal + connected to a port. This parameter is a string defined at layout (global) + scope. +devicebasetag + The base tag of the device that caused the layout to be loaded, for example + ``root`` for the root driver device, or ``ie15`` for a terminal connected to + a port. This parameter is a string defined at layout (global) scope. +devicename + The full name (description) of the device that caused the layout to be + loaded, for example ``AIM-65/40`` or ``IE15 Terminal``. This parameter is a + string defined at layout (global) scope. +deviceshortname + The short name of the device that caused the layout to be loaded, for + example ``aim65_40`` or ``ie15_terminal``. This parameter is a string + defined at layout (global) scope. +scr0physicalxaspect + The horizontal part of the physical aspect ratio of the first screen (if + present). The physical aspect ratio is provided as a reduced improper + fraction. Note that this is the horizontal component *before* rotation is + applied. This parameter is an integer defined at layout (global) scope. +scr0physicalyaspect + The vertical part of the physical aspect ratio of the first screen (if + present). The physical aspect ratio is provided as a reduced improper + fraction. Note that this is the vertical component *before* rotation is + applied. This parameter is an integer defined at layout (global) scope. +scr0nativexaspect + The horizontal part of the pixel aspect ratio of the first screen's visible + area (if present). The pixel aspect ratio is provided as a reduced improper + fraction. Note that this is the horizontal component *before* rotation is + applied. This parameter is an integer defined at layout (global) scope. +scr0nativeyaspect + The vertical part of the pixel aspect ratio of the first screen's visible + area (if present). The pixel aspect ratio is provided as a reduced improper + fraction. Note that this is the vertical component *before* rotation is + applied. This parameter is an integer defined at layout (global) scope. +scr0width + The width of the first screen's visible area (if present) in emulated + pixels. Note that this is the width *before* rotation is applied. This + parameter is an integer defined at layout (global) scope. +scr0height + The height of the first screen's visible area (if present) in emulated + pixels. Note that this is the height *before* rotation is applied. This + parameter is an integer defined at layout (global) scope. +scr1physicalxaspect + The horizontal part of the physical aspect ratio of the second screen (if + present). This parameter is an integer defined at layout (global) scope. +scr1physicalyaspect + The vertical part of the physical aspect ratio of the second screen (if + present). This parameter is an integer defined at layout (global) scope. +scr1nativexaspect + The horizontal part of the pixel aspect ratio of the second screen's visible + area (if present). This parameter is an integer defined at layout (global) + scope. +scr1nativeyaspect + The vertical part of the pixel aspect ratio of the second screen's visible + area (if present). This parameter is an integer defined at layout (global) + scope. +scr1width + The width of the second screen's visible area (if present) in emulated + pixels. This parameter is an integer defined at layout (global) scope. +scr1height + The height of the second screen's visible area (if present) in emulated + pixels. This parameter is an integer defined at layout (global) scope. +scr\ *N*\ physicalxaspect + The horizontal part of the physical aspect ratio of the (zero-based) *N*\ th + screen (if present). This parameter is an integer defined at layout + (global) scope. +scr\ *N*\ physicalyaspect + The vertical part of the physical aspect ratio of the (zero-based) *N*\ th + screen (if present). This parameter is an integer defined at layout + (global) scope. +scr\ *N*\ nativexaspect + The horizontal part of the pixel aspect ratio of the (zero-based) *N*\ th + screen's visible area (if present). This parameter is an integer defined at + layout (global) scope. +scr\ *N*\ nativeyaspect + The vertical part of the pixel aspect ratio of the (zero-based) *N*\ th + screen's visible area (if present). This parameter is an integer defined at + layout (global) scope. +scr\ *N*\ width + The width of the (zero-based) *N*\ th screen's visible area (if present) in + emulated pixels. This parameter is an integer defined at layout (global) + scope. +scr\ *N*\ height + The height of the (zero-based) *N*\ th screen's visible area (if present) in + emulated pixels. This parameter is an integer defined at layout (global) + scope. +viewname + The name of the current view. This parameter is a string defined at view + scope. It is not defined outside a view. + +For screen-related parameters, screens are numbered from zero in the order they +appear in machine configuration, and all screens are included (not just +subdevices of the device that caused the layout to be loaded). X/width and +Y/height refer to the horizontal and vertical dimensions of the screen *before* +rotation is applied. Values based on the visible area are calculated at the +end of configuration. Values are not updated and layouts are not recomputed if +the system reconfigures the screen while running. + + +.. _layout-concepts-layers: + +Layers +~~~~~~ + +Views are rendered as a stack of layers, named after parts of an arcade cabinet. +The layout supplies elements to be drawn in all layers besides the screen layer, +which is reserved for emulated screens. With the exception of the screen layer, +users can enable or disable layers using the in-emulation menu or command-line +options. + +The following layers are available: + +backdrop + Intended for use in situations were the screen image is projected over a + backdrop using a semi-reflective mirror (Pepper's ghost). This arrangement + is famously used in the Space Invaders deluxe cabinet. +screen + This layer is reserved for emulated screen images, and cannot be disabled by + the user. It is drawn using additive blending. +overlay + This layer is intended for use translucent overlays used to add colour to + games using monochrome monitors like Circus, Gee Bee, and of course Space + Invaders. It is drawn using RGB multiplication. +bezel + This layer is for elements that surround and potentially obscure the screen + image. It is drawn with standard alpha blending. +cpanel + This layer is intended for displaying controls/input devices (control + panels). It is drawn using standard alpha blending. +marquee + This layer is intended for displaying arcade cabinet marquee images. It is + drawn using standard alpha blending. + +By default, layers are drawn in this order (from back to front): + +* screen (add) +* overlay (multiply) +* backdrop (add) +* bezel (alpha) +* cpanel (alpha) +* marquee (alpha) + +If a view has multiple backdrop elements and no overlay elements, a different +order is used (from back to front): + +* backdrop (alpha) +* screen (add) +* bezel (alpha) +* cpanel (alpha) +* marquee (alpha) + +The alternate drawing order makes it simpler to build a backdrop from multiple +scanned/traced pieces of art, as they can have opaque parts. It can't be used +with overlay elements because colour overlays are conventionally placed between +the screen and mirror, and as such do not affect the backdrop. + + +.. _layout-parts: + +Parts of a layout +----------------- + +A *view* specifies an arrangement graphical object to display. A MAME layout +file can contain multiple views. Views are built up from *elements* and +*screens*. To simplify complex layouts, reusable groups and repeating blocks +are supported. + +The top-level element of a MAME layout file must be a ``mamelayout`` element +with a ``version`` attribute. The ``version`` attribute must be an integer. +Currently MAME only supports version 2, and will not load any other version. +This is an example opening tag for a top-level ``mamelayout`` element:: + + <mamelayout version="2"> + +In general, children of the top-level ``mamelayout`` element are processed in +reading order from top to bottom. The exception is that, for historical +reasons, views are processed last. This means views see the final values of all +parameters at the end of the ``mamelayout`` element, and may refer to elements +and groups that appear after them. + +The following elements are allowed inside the top-level ``mamelayout`` element: + +param + Defines or reassigns a value parameter. See :ref:`layout-concepts-params` + for details. +element + Defines an element -- one of the basic objects that can be arranged in a + view. See :ref:`layout-parts-elements` for details. +group + Defines a reusable group of elements/screens that may be referenced from + views or other groups. See :ref:`layout-parts-groups` for details. +repeat + A repeating group of elements -- may contain ``param``, ``element``, + ``group``, and ``repeat`` elements. See :ref:`layout-parts-repeats` for + details. +view + An arrangement of elements and/or screens that can be displayed on an output + device (a host screen/window). See :ref:`layout-parts-views` for details. +script + Allows lua script to be supplied for enhanced interactive layouts. + + +.. _layout-parts-elements: + +Elements +~~~~~~~~ + +Elements are one of the basic visual objects that may be arranged, along with +screens, to make up a view. Elements may be built up one or more *components*, +but an element is treated as as single surface when building the scene graph +and rendering. An element may be used in multiple views, and may be used +multiple times within a view. + +An element's appearance depends on its *state*. The state is an integer which +usually comes from an I/O port field or an emulated output (see the discussion +of :ref:`layout-parts-views` for information on connecting an element to an I/O +port or output). Any component of an element may be restricted to only drawing +when the element's state is a particular value. Some components (e.g. +multi-segment displays and reels) use the state directly to determine their +appearance. + +Each element has its own internal coordinate system. The bounds of the +element's coordinate system are computed as the union of the bounds of the +individual components it's composed of. + +Every element must have a ``name`` attribute specifying its name. Elements are +referred to by name when instantiated in groups or views. It is an error for a +layout file to contain multiple elements with identical ``name`` attributes. +Elements may optionally supply a default state value with a ``defstate`` +attribute, to be used if not connected to an emulated output or I/O port. If +present, the ``defstate`` attribute must be a non-negative integer. + +Child elements of the ``element`` element instantiate components, which are +drawn in reading order from first to last (components draw on top of components +that come before them). All components support a few common features: + +* Each component may have a ``state`` attribute. If present, the component will + only be drawn when the element's state matches its value (if absent, the + component will always be drawn). If present, the ``state`` attribute must be + a non-negative integer. +* Each component may have a ``bounds`` child element specifying its position and + size (see :ref:`layout-concepts-coordinates`). If no such element is present, + the bounds default to a unit square (width and height of 1.0) with the top + left corner at (0,0). +* Each component may have a ``color`` child element specifying an RGBA colour + (see :ref:`layout-concepts-colours` for details). This can be used to control + the colour of geometric, algorithmically drawn, or textual components. It is + ignored for ``image`` components. If no such element is present, the colour + defaults to opaque white. + +The following components are supported: + +rect + Draws a uniform colour rectangle filling its bounds. +disk + Draws a uniform colour ellipse fitted to its bounds. +image + Draws an image loaded from a PNG or JPEG file. The name of the file to load + (including the file name extension) is supplied with the required ``file`` + attribute. Additionally, an optional ``alphafile`` attribute may be used to + specify the name of a PNG file (including the file name extension) to load + into the alpha channel of the image. The image file(s) should be placed in + the same directory/archive as the layout file. If the ``alphafile`` + attribute refers refers to a file, it must have the same dimensions as the + file referred to by the ``file`` attribute, and must have a bit depth no + greater than eight bits per channel per pixel. The intensity from this + image (brightness) is copied to the alpha channel, with full intensity (white + in a greyscale image) corresponding to fully opaque, and black corresponding + to fully transparent. +text + Draws text in using the UI font in the specified colour. The text to draw + must be supplied using a ``string`` attribute. An ``align`` attribute may + be supplied to set text alignment. If present, the ``align`` attribute must + be an integer, where 0 (zero) means centred, 1 (one) means left-aligned, and + 2 (two) means right-aligned. If the ``align`` attribute is absent, the text + will be centred. +dotmatrix + Draws an eight-pixel horizontal segment of a dot matrix display, using + circular pixels in the specified colour. The bits of the element's state + determine which pixels are lit, with the least significant bit corresponding + to the leftmost pixel. Unlit pixels are drawn at low intensity (0x20/0xff). +dotmatrix5dot + Draws a five-pixel horizontal segment of a dot matrix display, using + circular pixels in the specified colour. The bits of the element's state + determine which pixels are lit, with the least significant bit corresponding + to the leftmost pixel. Unlit pixels are drawn at low intensity (0x20/0xff). +dotmatrixdot + Draws a single element of a dot matrix display as a circular pixels in the + specified colour. The least significant bit of the element's state + determines whether the pixel is lit. An unlit pixel is drawn at low + intensity (0x20/0xff). +led7seg + Draws a standard seven-segment (plus decimal point) digital LED/fluorescent + display in the specified colour. The low eight bits of the element's state + control which segments are lit. Starting from the least significant bit, + the bits correspond to the top segment, the upper right-hand segment, + continuing clockwise to the upper left segment, the middle bar, and the + decimal point. Unlit segments are drawn at low intensity (0x20/0xff). +led8seg_gts1 + Draws an eight-segment digital fluorescent display of the type used in + Gottlieb System 1 pinball machines (actually a Futaba part). Compared to + standard seven-segment displays, these displays have no decimal point, the + horizontal middle bar is broken in the centre, and there is a broken + vertical middle bar controlled by the bit that would control the decimal + point in a standard seven-segment display. Unlit segments are drawn at low + intensity (0x20/0xff). +led14seg + Draws a standard fourteen-segment alphanumeric LED/fluorescent display in + the specified colour. The low fourteen bits of the element's state control + which segments are lit. Starting from the least significant bit, the bits + correspond to the top segment, the upper right-hand segment, continuing + clockwise to the upper left segment, the left-hand and right-hand halves of + the horizontal middle bar, the upper and lower halves of the vertical middle + bar, and the diagonal bars clockwise from lower left to lower right. Unlit + segments are drawn at low intensity (0x20/0xff). +led14segsc + Draws a standard fourteen-segment alphanumeric LED/fluorescent display with + decimal point/comma in the specified colour. The low sixteen bits of the + element's state control which segments are lit. The low fourteen bits + correspond to the same segments as in the ``led14seg`` component. Two + additional bits correspond to the decimal point and comma tail. Unlit + segments are drawn at low intensity (0x20/0xff). +led16seg + Draws a standard sixteen-segment alphanumeric LED/fluorescent display in the + specified colour. The low sixteen bits of the element's state control which + segments are lit. Starting from the least significant bit, the bits + correspond to the left-hand half of the top bar, the right-hand half of the + top bar, continuing clockwise to the upper left segment, the left-hand and + right-hand halves of the horizontal middle bar, the upper and lower halves + of the vertical middle bar, and the diagonal bars clockwise from lower left + to lower right. Unlit segments are drawn at low intensity (0x20/0xff). +led16segsc + Draws a standard sixteen-segment alphanumeric LED/fluorescent display with + decimal point/comma in the specified colour. The low eighteen bits of the + element's state control which segments are lit. The low sixteen bits + correspond to the same segments as in the ``led16seg`` component. Two + additional bits correspond to the decimal point and comma tail. Unlit + segments are drawn at low intensity (0x20/0xff). +simplecounter + Displays the numeric value of the element's state using the system font in + the specified colour. The value is formatted in decimal notation. A + ``digits`` attribute may be supplied to specify the minimum number of digits + to display. If present, the ``digits`` attribute must be a positive + integer; if absent, a minimum of two digits will be displayed. A + ``maxstate`` attribute may be supplied to specify the maximum state value to + display. If present, the ``maxstate`` attribute must be a non-negative + number; if absent it defaults to 999. An ``align`` attribute may be supplied + to set text alignment. If present, the ``align`` attribute must be an + integer, where 0 (zero) means centred, 1 (one) means left-aligned, and 2 + (two) means right-aligned; if absent, the text will be centred. +reel + Used for drawing slot machine reels. Supported attributes include + ``symbollist``, ``stateoffset``, ``numsymbolsvisible``, ``reelreversed``, + and ``beltreel``. + +An example element that draws a static left-aligned text string:: + + <element name="label_reset_cpu"> + <text string="CPU" align="1"><color red="1.0" green="1.0" blue="1.0" /></text> + </element> + + +An example element that displays a circular LED where the intensity depends on +the state of an active-high output:: + + <element name="led" defstate="0"> + <rect state="0"><color red="0.43" green="0.35" blue="0.39" /></rect> + <rect state="1"><color red="1.0" green="0.18" blue="0.20" /></rect> + </element> + +An example element for a button that gives visual feedback when clicked:: + + <element name="btn_rst"> + <rect state="0"><bounds x="0.0" y="0.0" width="1.0" height="1.0" /><color red="0.2" green="0.2" blue="0.2" /></rect> + <rect state="1"><bounds x="0.0" y="0.0" width="1.0" height="1.0" /><color red="0.1" green="0.1" blue="0.1" /></rect> + <rect state="0"><bounds x="0.1" y="0.1" width="0.9" height="0.9" /><color red="0.1" green="0.1" blue="0.1" /></rect> + <rect state="1"><bounds x="0.1" y="0.1" width="0.9" height="0.9" /><color red="0.2" green="0.2" blue="0.2" /></rect> + <rect><bounds x="0.1" y="0.1" width="0.8" height="0.8" /><color red="0.15" green="0.15" blue="0.15" /></rect> + <text string="RESET"><bounds x="0.1" y="0.4" width="0.8" height="0.2" /><color red="1.0" green="1.0" blue="1.0" /></text> + </element> + + +.. _layout-parts-views: + +Views +~~~~~ + +A view defines an arrangement of elements and/or emulated screen images that can +be displayed in a window or on a screen. Views also connect elements to +emulated I/O ports and/or outputs. A layout file may contain multiple views. +If a view references a non-existent screen, it will be considered *unviable*. +MAME will print a warning message, skip over the unviable view, and continue to +load views from the layout file. This is particularly useful for systems where +a screen is optional, for example computer systems with front panel controls and +an optional serial terminal. + +Views are identified by name in MAME's user interface and in command-line +options. For layouts files associated with devices other than the root driver +device, view names are prefixed with the device's tag (with the initial colon +omitted) -- for example a view called "Keyboard LEDs" loaded for the device +``:tty:ie15`` will be called "tty:ie15 Keyboard LEDs" in MAME's user interface. +Views are listed in the order they are loaded. Within a layout file, views are +loaded in the order they appear, from top to bottom. + +Views are created with ``view`` elements inside the top-level ``mamelayout`` +element. Each ``view`` element must have a ``name`` attribute, supplying its +human-readable name for use in the user interface and command-line options. +This is an example of a valid opening tag for a ``view`` element:: + + <view name="Control panel"> + +A view creates a nested parameter scope inside the parameter scope of the +top-level ``mamelayout`` element. For historical reasons, ``view`` elements are +processed *after* all other child elements of the top-level ``mamelayout`` +element. This means a view can reference elements and groups that appear after +it in the file, and parameters from the enclosing scope will have their final +values from the end of the ``mamelayout`` element. + +The following child elements are allowed inside a ``view`` element: + +bounds + Sets the origin and size of the view's internal coordinate system if + present. See :ref:`layout-concepts-coordinates` for details. If absent, + the bounds of the view are computed as the union of the bounds of all + screens and elements within the view. It only makes sense to have one + ``bounds`` as a direct child of a view element. Any content outside the + view's bounds is cropped, and the view is scaled proportionally to fit the + output window or screen. +param + Defines or reassigns a value parameter in the view's scope. See + :ref:`layout-concepts-params` for details. +backdrop overlay bezel cpanel marquee + Adds an element to the relevant layer (see :ref:`layout-parts-elements` and + :ref:`layout-concepts-layers`). The name of the element to add is specified + using the required ``element`` attribute. It is an error if no element with + this name is defined in the layout file. May optionally be connected to an + emulated I/O port using ``inputtag`` and ``inputmask`` attributes, and/or an + emulated output using a ``name`` attribute. Within a layer, elements are + drawn in the order they appear in the layout file, from front to back. See + below for more details. +screen + Adds an emulated screen image to the view. The screen must be identified + using either an ``index`` attribute or a ``tag`` attribute (it is an error + for a ``screen`` element to have both ``index`` and ``tag`` attributes). + If present, the ``index`` attribute must be a non-negative integer. Screens + are numbered by the order they appear in machine configuration, starting at + zero (0). If present, the ``tag`` attribute must be the tag path to the + screen relative to the device that causes the layout to be loaded. Screens + are drawn in the order they appear in the layout file, from front to back. +group + Adds the content of the group to the view (see :ref:`layout-parts-groups`). + The name of the group to add is specified using the required ``ref`` + attribute. It is an error if no group with this name is defined in the + layout file. See below for more details on positioning. +repeat + Repeats its contents the number of times specified by the required ``count`` + attribute. The ``count`` attribute must be a positive integer. A + ``repeat`` element in a view may contain ``backdrop``, ``screen``, + ``overlay``, ``bezel``, ``cpanel``, ``marquee``, ``group``, and further + ``repeat`` elements, which function the same way they do when placed in a + view directly. See :ref:`layout-parts-repeats` for discussion on using + ``repeat`` elements. + +Screens (``screen`` elements), layout elements (``backdrop``, ``overlay``, +``bezel``, ``cpanel`` or ``marquee`` elements) and groups (``group`` elements) +may be have their orientation altered using an ``orientation`` child element. +For screens, the orientation modifiers are applied in addition to the +orientation modifiers specified on the screen device and on the machine. The +``orientation`` element supports the following attributes, all of which are +optional: + +rotate + If present, applies clockwise rotation in ninety degree implements. Must be + an integer equal to 0, 90, 180 or 270. +swapxy + Allows the screen, element or group to be mirrored along a line at + forty-five degrees to vertical from upper left to lower right. Must be + either ``yes`` or ``no`` if present. Mirroring applies logically after + rotation. +flipx + Allows the screen, element or group to be mirrored around its vertical axis, + from left to right. Must be either ``yes`` or ``no`` if present. Mirroring + applies logically after rotation. +flipy + Allows the screen, element or group to be mirrored around its horizontal + axis, from top to bottom. Must be either ``yes`` or ``no`` if present. + Mirroring applies logically after rotation. + +Screens (``screen`` elements), layout elements (``backdrop``, ``overlay``, +``bezel``, ``cpanel`` or ``marquee`` elements) and groups (``group`` elements) +may be positioned and sized using a ``bounds`` child element (see +:ref:`layout-concepts-coordinates` for details). In the absence of a ``bounds`` +child element, screens' and layout elements' bounds default to a unit square +(origin at 0,0 and height and width both equal to 1). In the absence of a +``bounds`` child element, groups are expanded with no translation/scaling (note +that groups may position screens/elements outside their bounds). This example +shows a view instantiating and positioning a screen, an individual layout +element, and two element groups:: + + <view name="LED Displays, Terminal and Keypad"> + <cpanel element="beige"><bounds x="320" y="0" width="172" height="372" /></cpanel> + <group ref="displays"><bounds x="0" y="0" width="320" height="132" /></group> + <group ref="keypad"><bounds x="336" y="16" width="140" height="260" /></group> + <screen index="0"><bounds x="0" y="132" width="320" height="240" /></screen> + </view> + +Screens (``screen`` elements), layout elements (``backdrop``, ``overlay``, +``bezel``, ``cpanel`` or ``marquee`` elements) and groups (``group`` elements) +may have a ``color`` child element (see :ref:`layout-concepts-colours`) +specifying a modifier colour. The components colours of the screen or layout +element(s) are multiplied by this colour. + +If an element instantiating a layout element (``backdrop``, ``overlay``, +``bezel``, ``cpanel`` or ``marquee``) has ``inputtag`` and ``inputmask`` +attributes, clicking it is equivalent to pressing a key/button mapped to the +corresponding input(s). The ``inputtag`` specifies the tag path of an I/O port +relative to the device that caused the layout file to be loaded. The +``inputmask`` attribute must be an integer specifying the bits of the I/O port +that the element should activate. This sample is shows instantiation of +clickable buttons:: + + <cpanel element="btn_3" inputtag="X2" inputmask="0x10"> + <bounds x="2.30" y="4.325" width="1.0" height="1.0" /> + </cpanel> + <cpanel element="btn_0" inputtag="X0" inputmask="0x20"> + <bounds x="0.725" y="5.375" width="1.0" height="1.0" /></cpanel> + <cpanel element="btn_rst" inputtag="RESET" inputmask="0x01"> + <bounds x="1.775" y="5.375" width="1.0" height="1.0" /> + </cpanel> + + +If an element instantiating a layout element (``backdrop``, ``overlay``, +``bezel``, ``cpanel`` or ``marquee``) has a ``name`` attribute, it will take its +state from the value of the correspondingly named emulated output. Note that +output names are global, which can become an issue when a machine uses multiple +instances of the same type of device. See :ref:`layout-parts-elements` for +details on how an element's state affects its appearance. This example shows +how digital displays may be connected to emulated outputs:: + + <cpanel name="digit6" element="digit"><bounds x="16" y="16" width="48" height="80" /></cpanel> + <cpanel name="digit5" element="digit"><bounds x="64" y="16" width="48" height="80" /></cpanel> + <cpanel name="digit4" element="digit"><bounds x="112" y="16" width="48" height="80" /></cpanel> + <cpanel name="digit3" element="digit"><bounds x="160" y="16" width="48" height="80" /></cpanel> + <cpanel name="digit2" element="digit"><bounds x="208" y="16" width="48" height="80" /></cpanel> + <cpanel name="digit1" element="digit"><bounds x="256" y="16" width="48" height="80" /></cpanel> + +If an element instantiating a layout element has ``inputtag`` and ``inputmask`` +attributes but lacks a ``name`` attribute, it will take its state from the value +of the corresponding I/O port, masked with the ``inputmask`` value, and shifted +to the right so that the least significant one bit of the mask aligns with the +least significant bit of the value (for example a mask of 0x05 will result in no +shift, while a mask of 0xb0 will result in the value being shifted four bits to +the right). This is often used to allow clickable buttons and toggle switches +to provide visible feedback. + +When handling mouse input, MAME treats all layout elements as being rectangular, +and only activates the frontmost element whose area includes the location of the +mouse pointer. + + +.. _layout-parts-groups: + +Reusable groups +~~~~~~~~~~~~~~~ + +Groups allow an arrangement of screens and/or layout elements to be used +multiple times in views or other groups. Groups can be beneficial even if you +only use the arrangement once, as they can be used to encapsulate part of a +complex layout. Groups are defined using ``group`` elements inside the +top-level ``mamelayout`` element, and instantiated using ``group`` elements +inside ``view`` and other ``group`` elements. + +Each group definition element must have a ``name`` attribute providing a unique +identifier. It is an error if a layout file contains multiple group definitions +with identical ``name`` attributes. The value of the ``name`` attribute is used +when instantiating the group from a view or another group. This is an example +opening tag for a group definition element inside the top-level ``mamelayout`` +element:: + + <group name="panel"> + +This group may then be instantiated in a view or another group element using a +group reference element, optionally supplying destination bounds, orientation, +and/or modifier colour. The ``ref`` attribute identifies the group to +instantiate -- in this example, destination bounds are supplied:: + + <group ref="panel"><bounds x="87" y="58" width="23" height="23.5" /></group> + +Group definition elements allow all the same child elements as views. +Positioning and orienting screens, layout elements and nested groups works the +same way as for views. See :ref:`layout-parts-views` for details. A group may +instantiate other groups, but recursive loops are not permitted. It is an error +if a group directly or indirectly instantiates itself. + +Groups have their own internal coordinate systems. If a group definition +element has no ``bounds`` element as a direct child, its bounds are computed as +the union of the bounds of all the screens, layout elements and/or nested groups +it instantiates. A ``bounds`` child element may be used to explicitly specify +group bounds (see :ref:`layout-concepts-coordinates` for details). Note that +groups' bounds are only used for the purpose of calculating the coordinate +transform when instantiating a group. A group may position screens and/or +elements outside its bounds, and they will not be cropped. + +To demonstrate how bounds calculation works, consider this example:: + + <group name="autobounds"> + <!-- bounds automatically calculated with origin at (5,10), width 30, and height 15 --> + <cpanel element="topleft"><bounds x="5" y="10" width="10" height="10" /></cpanel> + <cpanel element="bottomright"><bounds x="25" y="15" width="10" height="10" /></cpanel> + </group> + + <view name="Test"> + <!-- + group bounds translated and scaled to fit - 2/3 scale horizontally and double vertically + element topleft positioned at (0,0) with width 6.67 and height 20 + element bottomright positioned at (13.33,10) with width 6.67 and height 20 + view bounds calculated with origin at (0,0), width 20, and height 30 + --> + <group ref="autobounds"><bounds x="0" y="0" width="20" height="30" /></group> + </view> + +This is relatively straightforward, as all elements inherently fall within the +group's automatically computed bounds. Now consider what happens if a group +positions elements outside its explicit bounds:: + + <group name="periphery"> + <!-- elements are above the top edge and to the right of the right edge of the bounds --> + <bounds x="10" y="10" width="20" height="25" /> + <cpanel element="topleft"><bounds x="10" y="0" width="10" height="10" /></cpanel> + <cpanel element="bottomright"><bounds x="30" y="20" width="10" height="10" /></cpanel> + </group> + + <view name="Test"> + <!-- + group bounds translated and scaled to fit - 3/2 scale horizontally and unity vertically + element topleft positioned at (5,-5) with width 15 and height 10 + element bottomright positioned at (35,15) with width 15 and height 10 + view bounds calculated with origin at (5,-5), width 45, and height 30 + --> + <group ref="periphery"><bounds x="5" y="5" width="30" height="25" /></group> + </view> + +The group's elements are translated and scaled as necessary to distort the +group's internal bounds to the destination bounds in the view. The group's +content is not restricted to its bounds. The view considers the bounds of the +actual layout elements when computing its bounds, not the destination bounds +specified for the group. + +When a group is instantiated, it creates a nested parameter scope. The logical +parent scope is the parameter scope of the view, group or repeating block where +the group is instantiated (*not* its lexical parent, the top-level +``mamelayout`` element). Any ``param`` elements inside the group definition +element set parameters in the local scope for the group instantiation. Local +parameters do not persist across multiple instantiations. See +:ref:`layout-concepts-params` for more detail on parameters. (Note that the +group's name is not part of its content, and any parameter references in the +``name`` attribute itself will be substituted at the point where the group +definition appears in the top-level ``mamelayout`` element's scope.) + + +.. _layout-parts-repeats: + +Repeating blocks +~~~~~~~~~~~~~~~~ + +Repeating blocks provide a concise way to generate or arrange large numbers of +similar elements. Repeating blocks are generally used in conjunction with +generator parameters (see :ref:`layout-concepts-params`). Repeating blocks may +be nested for more complex arrangements. + +Repeating blocks are created with ``repeat`` elements. Each ``repeat`` element +requires a ``count`` attribute specifying the number of iterations to generate. +The ``count`` attribute must be a positive integer. Repeating blocks are +allowed inside the top-level ``mamelayout`` element, inside ``group`` and +``view`` elements, and insider other ``repeat`` elements. The exact child +elements allowed inside a ``repeat`` element depend on where it appears: + +* A repeating block inside the top-level ``mamelayout`` element may contain + ``param``, ``element``, ``group`` (definition), and ``repeat`` elements. +* A repeating block inside a ``group`` or ``view`` element may contain + ``param``, ``backdrop``, ``screen``, ``overlay``, ``bezel``, ``cpanel``, + ``marquee``, ``group`` (reference), and ``repeat`` elements. + +A repeating block effectively repeats its contents the number of times specified +by its ``count`` attribute. See the relevant sections for details on how the +child elements are used (:ref:`layout-parts`, :ref:`layout-parts-groups`, and +:ref:`layout-parts-views`). A repeating block creates a nested parameter scope +inside the parameter scope of its lexical (DOM) parent element. + +Generating white number labels from zero to eleven named ``label_0``, +``label_1``, and so on (inside the top-level ``mamelayout`` element):: + + <repeat count="12"> + <param name="labelnum" start="0" increment="1" /> + <element name="label_~labelnum~"> + <text string="~labelnum~"><color red="1.0" green="1.0" blue="1.0" /></text> + </element> + </repeat> + +A horizontal row of forty digital displays, with five units space between them, +controlled by outputs ``digit0`` to ``digit39`` (inside a ``group`` or ``view`` +element):: + + <repeat count="40"> + <param name="i" start="0" increment="1" /> + <param name="x" start="5" increment="30" /> + <bezel name="digit~i~" element="digit"> + <bounds x="~x~" y="5" width="25" height="50" /> + </bezel> + </repeat> + +Eight five-by-seven dot matrix displays in a row, with pixels controlled by +outputs ``Dot_000`` to ``Dot_764`` (inside a ``group`` or ``view`` element):: + + <repeat count="8"> <!-- 8 digits --> + <param name="digitno" start="1" increment="1" /> + <param name="digitx" start="0" increment="935" /> <!-- distance between digits ((111 * 5) + 380) --> + <repeat count="7"> <!-- 7 rows in each digit --> + <param name="rowno" start="1" increment="1" /> + <param name="rowy" start="0" increment="114" /> <!-- vertical distance between LEDs --> + <repeat count="5"> <!-- 5 columns in each digit --> + <param name="colno" start="1" increment="1" /> + <param name="colx" start="~digitx~" increment="111" /> <!-- horizontal distance between LEDs --> + <bezel name="Dot_~digitno~~rowno~~colno~" element="Pixel" state="0"> + <bounds x="~colx~" y="~rowy~" width="100" height="100" /> <!-- size of each LED --> + </bezel> + </repeat> + </repeat> + </repeat> + +Two horizontally separated, clickable, four-by-four keypads (inside a ``group`` +or ``view`` element):: + + <repeat count="2"> + <param name="group" start="0" increment="4" /> + <param name="padx" start="10" increment="530" /> + <param name="mask" start="0x01" lshift="4" /> + <repeat count="4"> + <param name="row" start="0" increment="1" /> + <param name="y" start="100" increment="110" /> + <repeat count="4"> + <param name="col" start="~group~" increment="1" /> + <param name="btnx" start="~padx~" increment="110" /> + <param name="mask" start="~mask~" lshift="1" /> + <bezel element="btn~row~~col~" inputtag="row~row~" inputmask="~mask~"> + <bounds x="~btnx~" y="~y~" width="80" height="80" /> + </bezel> + </repeat> + </repeat> + </repeat> + +The buttons are drawn using elements ``btn00`` in the top left, ``bnt07`` in the +top right, ``btn30`` in the bottom left, and ``btn37`` in the bottom right, +counting in between. The four rows are connected to I/O ports ``row0``, +``row1``, ``row2``, and ``row3``, from top to bottom. The columns are connected +to consecutive I/O port bits, starting with the least significant bit on the +left. Note that the ``mask`` parameter in the innermost ``repeat`` element +takes its initial value from the correspondingly named parameter in the +enclosing scope, but does not modify it. + +Generating a chequerboard pattern with alternating alpha values 0.4 and 0.2 +(inside a ``group`` or ``view`` element):: + + <repeat count="4"> + <param name="pairy" start="3" increment="20" /> + <param name="pairno" start="7" increment="-2" /> + <repeat count="2"> + <param name="rowy" start="~pairy~" increment="10" /> + <param name="rowno" start="~pairno~" increment="-1" /> + <param name="lalpha" start="0.4" increment="-0.2" /> + <param name="ralpha" start="0.2" increment="0.2" /> + <repeat count="4"> + <param name="lx" start="3" increment="20" /> + <param name="rx" start="13" increment="20" /> + <param name="lmask" start="0x01" lshift="2" /> + <param name="rmask" start="0x02" lshift="2" /> + <bezel element="hl" inputtag="board:IN.~rowno~" inputmask="~lmask~"> + <bounds x="~lx~" y="~rowy~" width="10" height="10" /> + <color alpha="~lalpha~" /> + </bezel> + <bezel element="hl" inputtag="board:IN.~rowno~" inputmask="~rmask~"> + <bounds x="~rx~" y="~rowy~" width="10" height="10" /> + <color alpha="~ralpha~" /> + </bezel> + </repeat> + </repeat> + </repeat> + +The outermost ``repeat`` element generates a group of two rows on each +iteration; the next ``repeat`` element generates an individual row on each +iteration; the innermost ``repeat`` element produces two horizontally adjacent +tiles on each iteration. Rows are connected to I/O ports ``board:IN.7`` at the +top to ``board.IN.0`` at the bottom. + + +.. _layout-errors: + +Error handling +-------------- + +* For internal (developer-supplied) layout files, errors detected by the + ``complay.py`` script result in a build failure. +* MAME will stop loading a layout file if a syntax error is encountered. No + views from the layout will be available. Examples of syntax errors include + undefined element or group references, invalid bounds, invalid colours, + recursively nested groups, and redefined generator parameters. +* When loading a layout file, if a view references a non-existent screen, MAME + will print a warning message and continue. Views referencing non-existent + screens are considered unviable and not available to the user. + + +.. _layout-autogen: + +Automatically-generated views +----------------------------- + +After loading internal (developer-supplied) and external (user-supplied) +layouts, MAME automatically generates views based on the machine configuration. +The following views will be automatically generated: + +* If the system has no screens and no viable views were found in the internal + and external layouts, MAME will load a view that shows the message "No screens + attached to the system". +* For each emulated screen, MAME will generate a view showing the screen at its + physical aspect ratio with rotation applied. +* For each emulated screen where the configured pixel aspect ratio doesn't match + the physical aspect ratio, MAME will generate a view showing the screen at an + aspect ratio that produces square pixels, with rotation applied. +* If the system has a single emulated screen, MAME will generate a view showing + two copies of the screen image above each other with a small gap between them. + The upper copy will be rotated by 180 degrees. This view can be used in a + "cocktail table" cabinet for simultaneous two-player games, or alternating + play games that don't automatically rotate the display for the second player. + The screen will be displayed at its physical aspect ratio, with rotation + applied. +* If the system has exactly two emulated screens and no view in the internal or + external layouts shows all screens, or if the system has more than two + emulated screens, MAME will generate views with the screens arranged + horizontally from left to right and vertically from top to bottom, both with + and without small gaps between them. The screens will be displayed at + physical aspect ratio, with rotation applied. +* If the system has three or more emulated screens, MAME will generate views + tiling the screens in grid patterns, in both row-major (left-to-right then + top-to-bottom) and column-major (top-to-bottom then left-to-right) order. + Views are generated with and without gaps between the screens. The screens + will be displayed at physical aspect ratio, with rotation applied. + + +.. _layout-complay: + +Using complay.py +---------------- + +The MAME source contains a Python script called ``complay.py``, found in the +``scripts/build`` subdirectory. This script is used as part of MAME's build +process to reduce the size of data for internal layouts and convert it to a form +that can be built into the executable. However, it can also detect many common +layout file format errors, and generally provides better error messages than +MAME does when loading a layout file. Note that it doesn't actually run the +whole layout engine, so it can't detect errors like undefined element references +when parameters are used, or recursively nested groups. The ``complay.py`` +script is compatible with both Python 2.7 and Python 3 interpreters. + +The ``complay.py`` script takes three parameters -- an input file name, an +output file name, and a base name for variables in the output:: + + python scripts/build/complay.py input [output [varname]] + +The input file name is required. If no output file name is supplied, +``complay.py`` will parse and check the input, reporting any errors found, +without producing output. If no base variable name is provided, ``complay.py`` +will generate one based on the input file name. This is not guaranteed to +produce valid identifiers. The exit status is 0 (zero) on success, 1 on an +error in the command invocation, 2 if error are found in the input file, or 3 +in case of an I/O error. If an output file name is specified, the file will be +created/overwritten on success or removed on failure. + +To check a layout file for common errors, run the script with the path to the +file no check and no output file name or base variable name. For example:: + + python scripts/build/complay.py artwork/dino/default.lay diff --git a/hash/ibm5150.xml b/hash/ibm5150.xml index 641dd785e15..d42e3c7567e 100644 --- a/hash/ibm5150.xml +++ b/hash/ibm5150.xml @@ -8903,6 +8903,25 @@ has been replaced with an all-zero block. --> </part> </software> + <software name="mathblst"> + <description>Math Blaster</description> + <year>1983</year> + <publisher>Davidson & Associates</publisher> + <info name="usage" value="Requires BASICA" /> + <part name="flop1" interface="floppy_5_25"> + <feature name="part_id" value="Side 1 - Program"/> + <dataarea name="flop" size = "163840"> + <rom name="Math Blaster! (USA) (Side 1 - Program).img" size="163840" crc="b73a1e48" sha1="01cedf6b1b079b2403e88803d26fb89818bda895" offset="0"/> + </dataarea> + </part> + <part name="flop2" interface="floppy_5_25"> + <feature name="part_id" value="Side 2 - Data"/> + <dataarea name="flop" size = "163840"> + <rom name="Math Blaster! (USA) (Side 2 - Data).img" size="163840" crc="8880c9f6" sha1="b09383d9746665d90d0d9435857e7d4e3e89eb28" offset="0"/> + </dataarea> + </part> + </software> + <software name="meanst"> <description>Mean Streets</description> <year>1989</year> @@ -10601,6 +10620,18 @@ has been replaced with an all-zero block. --> </part> </software> + <software name="writrrab"> + <description>Writer Rabbit</description> + <year>1988</year> + <publisher>The Learning Company</publisher> + <info name="version" value="1.3" /> + <part name="flop1" interface="floppy_5_25"> + <dataarea name="flop" size = "368640"> + <rom name="Writer Rabbit (USA) (v1.3) [5.25-inch].img" size="368640" crc="c5c51062" sha1="f56a708fb819fc73cd6b94f942c4103c09ea7e7d" offset="0"/> + </dataarea> + </part> + </software> + <software name="xenon"> <description>Xenon</description> <year>1988</year> diff --git a/hash/ibm5170.xml b/hash/ibm5170.xml index 5390872eee4..3e769666d49 100644 --- a/hash/ibm5170.xml +++ b/hash/ibm5170.xml @@ -57,6 +57,54 @@ </part> </software> + <software name="allinone"> + <description>The All In One Boot Floppy 1.0</description> + <year>2008</year> + <publisher>Michael Schierl</publisher> + <info name="version" value="1.0" /> + <part name="flop1" interface="floppy_3_5"> + <dataarea name="flop" size = "1474560"> + <rom name="allinone.img" size="1474560" crc="b9d206e2" sha1="48993ad7769f655a46180db1e4dd2cf6811299ed" offset="0"/> + </dataarea> + </part> + </software> + + <software name="allinonea" cloneof="allinone"> + <description>The All In One Boot Floppy 0.9</description> + <year>2006</year> + <publisher>Michael Schierl</publisher> + <info name="version" value="0.9" /> + <part name="flop1" interface="floppy_3_5"> + <dataarea name="rom" size = "1474560"> + <rom name="allinone09.img" size="1474560" crc="f97836fd" sha1="f1c6cdb2a56010d5cc7d36609c343c5f434c98dc" offset="0"/> + </dataarea> + </part> + </software> + + <software name="allinonel" cloneof="allinone"> + <description>The All In One Boot Floppy 0.9 (Lite Version)</description> + <year>2006</year> + <publisher>Michael Schierl</publisher> + <info name="version" value="0.9" /> + <part name="flop1" interface="floppy_3_5"> + <dataarea name="flop" size = "737280"> + <rom name="lite.img" size="737280" crc="a817a384" sha1="28d34559991788ce2e0b8ef486a8265c42e4e03d" offset="0"/> + </dataarea> + </part> + </software> + + <software name="allinonef" cloneof="allinone"> + <description>The All In One Boot Floppy 0.9 (FreeDOS only)</description> + <year>2006</year> + <publisher>Michael Schierl</publisher> + <info name="version" value="0.9" /> + <part name="flop1" interface="floppy_3_5"> + <dataarea name="flop" size = "737280"> + <rom name="freedos.img" size="737280" crc="57e02573" sha1="17226bd9bb3fc593084fadb52727defffdf51433" offset="0"/> + </dataarea> + </part> + </software> + <software name="brutware" supported="no"> <description>Brutalware Linux 1.1</description> <year>1999</year> @@ -2491,7 +2539,7 @@ </part> </software> - <software name="msdos622th"> + <software name="msdos622th" cloneof="msdos622"> <description>MS-DOS (Version 6.22, Thai)</description> <year>1994</year> <publisher>Microsoft</publisher> @@ -4746,6 +4794,19 @@ </part> </software> + <software name="mitscd" supported="no"> + <!-- from Acer CPR 1.2 recovery CD-ROM --> + <description>Mitsumi IDE CD-ROM Driver</description> + <year>1994</year> + <publisher>Mitsumi</publisher> + <info name="version" value="1.21" /> + <part name="flop1" interface="floppy_3_5"> + <dataarea name="flop" size = "1474560"> + <rom name="mtm disk1.img" size="1474560" crc="b174a5a1" sha1="8e540c920ec5737786f4bb2d0c10bc5362cd3fdc" offset="0"/> + </dataarea> + </part> + </software> + <software name="mitsmous"> <!-- from Acer CPR 1.2 recovery CD-ROM --> <description>Mitsumi Mouse Driver</description> @@ -5115,6 +5176,18 @@ </part> </software> + <software name="absdemo"> + <description>ABS Self Running Demo</description> + <year>1995</year> + <publisher>American Business Solutions</publisher> + <info name="version" value="2.0A" /> + <part name="flop1" interface="floppy_3_5"> + <dataarea name="flop" size = "1474560"> + <rom name="ABS Self Running Demo v2.0A (American Business Solutions, Inc.)(1995).img" size="1474560" crc="28b8c301" sha1="153dbf509d103110bd9c17ad43ba1e36c04f1b2e" offset="0"/> + </dataarea> + </part> + </software> + <software name="acerwin"> <!-- from Acer CPR 1.2 recovery CD-ROM --> <description>Acer/Win Supplement</description> @@ -5792,6 +5865,52 @@ </part> </software> + <software name="prodpack"> + <!-- from Acer CPR 1.2 recovery CD-ROM --> + <description>Microsoft Productivity Pack for Windows</description> + <year>1992</year> + <publisher>Microsoft</publisher> + <info name="version" value="3.1" /> + <part name="flop1" interface="floppy_3_5"> + <dataarea name="flop" size = "1474560"> + <rom name="prodpack disk1.img" size="1474560" crc="67c7b595" sha1="ca17fdba8e2bcc267e38e47cd919ef7955b72494" offset="0"/> + </dataarea> + </part> + <part name="flop2" interface="floppy_3_5"> + <dataarea name="flop" size = "1474560"> + <rom name="prodpack disk2.img" size="1474560" crc="68093322" sha1="54cc63457af4926f542b0445aedefef28b0bb59c" offset="0"/> + </dataarea> + </part> + </software> + + <software name="msworks3"> + <!-- from Acer CPR 1.2 recovery CD-ROM --> + <description>Microsoft Works 3.0b</description> + <year>1994</year> + <publisher>Microsoft</publisher> + <info name="version" value="3.0b" /> + <part name="flop1" interface="floppy_3_5"> + <dataarea name="flop" size = "1474560"> + <rom name="msworks disk1.img" size="1474560" crc="24ca92fe" sha1="f462e7da1704eccdc0fa6fcb51c938c585c98136" offset="0"/> + </dataarea> + </part> + <part name="flop2" interface="floppy_3_5"> + <dataarea name="flop" size = "1474560"> + <rom name="msworks disk2.img" size="1474560" crc="ed3d23d3" sha1="4ad83f15aabf69d3ae845656c2cf76378446dc5e" offset="0"/> + </dataarea> + </part> + <part name="flop3" interface="floppy_3_5"> + <dataarea name="flop" size = "1474560"> + <rom name="msworks disk3.img" size="1474560" crc="0d207897" sha1="c1332a1f8c59c746306a2f374dbd3aa62861c8be" offset="0"/> + </dataarea> + </part> + <part name="flop4" interface="floppy_3_5"> + <dataarea name="flop" size = "1474560"> + <rom name="msworks disk4.img" size="1474560" crc="2c98fcd2" sha1="1733f95eb545eee83d6afcf69600094ecae08758" offset="0"/> + </dataarea> + </part> + </software> + <software name="mbhh95"> <description>MikroBITTI Huvi- ja hyötylevyke 1995 (Fin)</description> <year>1995</year> @@ -5814,6 +5933,19 @@ </part> </software> + <software name="netcom"> + <!-- from Acer CPR 1.2 recovery CD-ROM --> + <description>NETCOM NetCruiser</description> + <year>1994</year> + <publisher>NETCOM</publisher> + <info name="version" value="1.51" /> + <part name="flop1" interface="floppy_3_5"> + <dataarea name="flop" size = "1474560"> + <rom name="netcom disk1.img" size="1474560" crc="ff7fa3f6" sha1="13099e622c0e1b1a127c433e8900e83b541a45dc" offset="0"/> + </dataarea> + </part> + </software> + <software name="bpdx301g"> <!-- KryoFlux dump from original media, many modified sectors --> <description>Paradox 3.01 (German)</description> @@ -8211,6 +8343,38 @@ </part> </software> + <software name="lionking"> + <description>Disney's The Lion King</description> + <year>1994</year> + <publisher>Virgin Interactive Entertainment, Inc.</publisher> + <part name="flop1" interface="floppy_3_5"> + <dataarea name="flop" size = "1474560"> + <rom name="Disney's The Lion King (USA) (Disk 1).img" size="1474560" crc="732d455a" sha1="20e85e8c381263363250c5b509fbc24415ed2e5d" offset="0"/> + </dataarea> + </part> + <part name="flop2" interface="floppy_3_5"> + <dataarea name="flop" size = "1474560"> + <rom name="Disney's The Lion King (USA) (Disk 2).img" size="1474560" crc="9101af49" sha1="ffa0965807bc23747d4aea77a67b3448df558b04" offset="0"/> + </dataarea> + </part> + <part name="flop3" interface="floppy_3_5"> + <dataarea name="flop" size = "1474560"> + <rom name="Disney's The Lion King (USA) (Disk 3).img" size="1474560" crc="2eb5e888" sha1="267b9fb48d5721d09dcc5fccbe2074024a2bb4bb" offset="0"/> + </dataarea> + </part> + </software> + + <software name="lionkingd" cloneof="lionking"> + <description>Disney's The Lion King (Playable Demo)</description> + <year>1994</year> + <publisher>Virgin Interactive Entertainment</publisher> + <part name="flop1" interface="floppy_3_5"> + <dataarea name="flop" size = "1474560"> + <rom name="lion.img" size="1474560" crc="e4767eb0" sha1="752b4b6268d464a6b7a8700152ca746f1e81b74b" offset="0"/> + </dataarea> + </part> + </software> + <software name="dogz"> <description>Dogz, Your Computer Pet</description> <year>1995</year> diff --git a/hash/sorcerer_cass.xml b/hash/sorcerer_cass.xml index 0d8cc9346e7..d0c7fb29301 100644 --- a/hash/sorcerer_cass.xml +++ b/hash/sorcerer_cass.xml @@ -777,7 +777,8 @@ <software name="interceptor"> <description>Interceptor</description> <year>1983</year> - <publisher>Blair Rideout</publisher> + <publisher>System Software</publisher> + <info name="developer" value="Blair Rideout"/> <info name="usage" value="Boot to Monitor, LOG" /> <part name="cass" interface="sorcerer_cass"> <dataarea name="cass" size="7201560"> @@ -1034,7 +1035,7 @@ <software name="grotnik"> <description>Grotnik Wars</description> <year>198?</year> - <publisher><unknown></publisher> + <publisher>System Software</publisher> <info name="developer" value="Ross Williams" /> <info name="usage" value="Boot to Monitor, LOG" /> <part name="cass" interface="sorcerer_cass"> diff --git a/language/Norwegian/strings.po b/language/Norwegian/strings.po index 86da32e8983..7d34fc95fbc 100644 --- a/language/Norwegian/strings.po +++ b/language/Norwegian/strings.po @@ -8,29 +8,32 @@ msgstr "" "Project-Id-Version: MAME\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-04-28 15:32+1000\n" -"PO-Revision-Date: 2016-02-20 18:03+0100\n" -"Last-Translator: Automatically generated\n" +"PO-Revision-Date: 2018-08-05 19:10+0200\n" +"Last-Translator: Imre Kristoffer Eilertsen <imreeil42@gmail.com>\n" "Language-Team: MAME Language Team\n" "Language: no\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 2.1.1\n" #: src/frontend/mame/ui/auditmenu.cpp:96 #, c-format msgid "Audit ROMs for %1$u machines marked unavailable?" msgstr "" +"Vil du undersøke ROM-filene til %1$u maskiner som er merket som " +"utilgjengelige?" #: src/frontend/mame/ui/auditmenu.cpp:99 #, c-format msgid "Audit ROMs for all %1$u machines?" -msgstr "" +msgstr "Vil du undersøke ROM-filene til alle %1$u maskinene?" #: src/frontend/mame/ui/auditmenu.cpp:104 #, c-format msgid "(results will be saved to %1$s)" -msgstr "" +msgstr "(utfallene vil bli lagret til %1$s)" #: src/frontend/mame/ui/auditmenu.cpp:130 #, c-format @@ -38,427 +41,439 @@ msgid "" "Auditing ROMs for machine %2$u of %3$u...\n" "%1$s" msgstr "" +"Undersøker ROM-filene til maskin nr. %2$u av %3$u...\n" +"%1$s" #: src/frontend/mame/ui/auditmenu.cpp:142 msgid "Start Audit" -msgstr "" +msgstr "Start undersøking" #: src/frontend/mame/ui/selmenu.cpp:49 src/frontend/mame/ui/dirmenu.cpp:45 msgid "Snapshots" -msgstr "" +msgstr "Skjermklipp" #: src/frontend/mame/ui/selmenu.cpp:50 src/frontend/mame/ui/dirmenu.cpp:46 msgid "Cabinets" -msgstr "" +msgstr "Kabinetter" #: src/frontend/mame/ui/selmenu.cpp:51 msgid "Control Panels" -msgstr "" +msgstr "Kontrollpaneler" #: src/frontend/mame/ui/selmenu.cpp:52 src/frontend/mame/ui/dirmenu.cpp:50 msgid "PCBs" -msgstr "" +msgstr "PCBer" #: src/frontend/mame/ui/selmenu.cpp:53 src/frontend/mame/ui/dirmenu.cpp:47 msgid "Flyers" -msgstr "" +msgstr "Plakater" #: src/frontend/mame/ui/selmenu.cpp:54 src/frontend/mame/ui/dirmenu.cpp:48 msgid "Titles" -msgstr "" +msgstr "Titteler" #: src/frontend/mame/ui/selmenu.cpp:55 src/frontend/mame/ui/dirmenu.cpp:49 msgid "Ends" -msgstr "" +msgstr "Slutter" #: src/frontend/mame/ui/selmenu.cpp:56 msgid "Artwork Preview" -msgstr "" +msgstr "Kunstverkforhåndsvisning" #: src/frontend/mame/ui/selmenu.cpp:57 src/frontend/mame/ui/dirmenu.cpp:55 msgid "Bosses" -msgstr "" +msgstr "Bosser" #: src/frontend/mame/ui/selmenu.cpp:58 src/frontend/mame/ui/dirmenu.cpp:60 msgid "Logos" -msgstr "" +msgstr "Logoer" #: src/frontend/mame/ui/selmenu.cpp:59 src/frontend/mame/ui/dirmenu.cpp:62 msgid "Versus" -msgstr "" +msgstr "Flerspiller" #: src/frontend/mame/ui/selmenu.cpp:60 msgid "Game Over" -msgstr "" +msgstr "Game Over" #: src/frontend/mame/ui/selmenu.cpp:61 src/frontend/mame/ui/dirmenu.cpp:59 msgid "HowTo" -msgstr "" +msgstr "Hvordan" #: src/frontend/mame/ui/selmenu.cpp:62 src/frontend/mame/ui/dirmenu.cpp:61 msgid "Scores" -msgstr "" +msgstr "Scorer" #: src/frontend/mame/ui/selmenu.cpp:63 src/frontend/mame/ui/dirmenu.cpp:57 msgid "Select" -msgstr "" +msgstr "Velg" #: src/frontend/mame/ui/selmenu.cpp:64 src/frontend/mame/ui/dirmenu.cpp:51 #: src/frontend/mame/ui/videoopt.cpp:224 msgid "Marquees" -msgstr "" +msgstr "Markier" #: src/frontend/mame/ui/selmenu.cpp:65 src/frontend/mame/ui/dirmenu.cpp:63 msgid "Covers" -msgstr "" +msgstr "Omslag" #: src/frontend/mame/ui/selmenu.cpp:69 msgid "Add or remove favorites" -msgstr "" +msgstr "Legg til eller fjern favoritter" #: src/frontend/mame/ui/selmenu.cpp:70 msgid "Export displayed list to file" -msgstr "" +msgstr "Eksporter den viste listen til en fil" #: src/frontend/mame/ui/selmenu.cpp:71 msgid "Show DATs view" -msgstr "" +msgstr "Vis DAT-oversikten" #: src/frontend/mame/ui/selmenu.cpp:237 msgid "Software part selection:" -msgstr "" +msgstr "Programvaredel-valg:" #: src/frontend/mame/ui/selmenu.cpp:343 msgid "BIOS selection:" -msgstr "" +msgstr "BIOS-valg:" #: src/frontend/mame/ui/selmenu.cpp:570 src/frontend/mame/ui/selmenu.cpp:606 #: src/frontend/mame/ui/simpleselgame.cpp:311 #, c-format msgid "%1$s, %2$-.100s" -msgstr "" +msgstr "%1$s, %2$-.100s" #: src/frontend/mame/ui/selmenu.cpp:574 #, c-format msgid "Software is clone of: %1$-.100s" -msgstr "" +msgstr "Programvaren er en klone av: %1$-.100s" #: src/frontend/mame/ui/selmenu.cpp:576 msgid "Software is parent" -msgstr "" +msgstr "Programvaren er overordnet" #: src/frontend/mame/ui/selmenu.cpp:581 msgid "Supported: No" -msgstr "" +msgstr "Støttet: Nei" #: src/frontend/mame/ui/selmenu.cpp:586 msgid "Supported: Partial" -msgstr "" +msgstr "Støttet: Delvis" #: src/frontend/mame/ui/selmenu.cpp:591 msgid "Supported: Yes" -msgstr "" +msgstr "Støttet: Ja" #: src/frontend/mame/ui/selmenu.cpp:596 #, c-format msgid "romset: %1$-.100s" -msgstr "" +msgstr "ROM-sett: %1$-.100s" #: src/frontend/mame/ui/selmenu.cpp:612 #, c-format msgid "Driver is clone of: %1$-.100s" -msgstr "" +msgstr "Driveren er en klone av: %1$-.100s" #: src/frontend/mame/ui/selmenu.cpp:614 msgid "Driver is parent" -msgstr "" +msgstr "Driveren er overordnet" #: src/frontend/mame/ui/selmenu.cpp:619 #: src/frontend/mame/ui/simpleselgame.cpp:330 msgid "Overall: NOT WORKING" -msgstr "" +msgstr "Alt i alt: VIRKER IKKE" #: src/frontend/mame/ui/selmenu.cpp:621 #: src/frontend/mame/ui/simpleselgame.cpp:332 msgid "Overall: Unemulated Protection" -msgstr "" +msgstr "Alt i alt: Uemulert beskyttelse" #: src/frontend/mame/ui/selmenu.cpp:623 #: src/frontend/mame/ui/simpleselgame.cpp:334 msgid "Overall: Working" -msgstr "" +msgstr "Alt i alt: Fungerer" #: src/frontend/mame/ui/selmenu.cpp:627 #: src/frontend/mame/ui/simpleselgame.cpp:338 msgid "Graphics: Unimplemented, " -msgstr "" +msgstr "Grafikk: Ikke implementert, " #: src/frontend/mame/ui/selmenu.cpp:629 #: src/frontend/mame/ui/simpleselgame.cpp:340 msgid "Graphics: Imperfect, " -msgstr "" +msgstr "Grafikk: Ikke perfekt, " #: src/frontend/mame/ui/selmenu.cpp:631 #: src/frontend/mame/ui/simpleselgame.cpp:342 msgid "Graphics: OK, " -msgstr "" +msgstr "Grafikk: OK, " #: src/frontend/mame/ui/selmenu.cpp:634 #: src/frontend/mame/ui/simpleselgame.cpp:345 msgid "Sound: None" -msgstr "" +msgstr "Lyd: Ingen" #: src/frontend/mame/ui/selmenu.cpp:636 #: src/frontend/mame/ui/simpleselgame.cpp:347 msgid "Sound: Unimplemented" -msgstr "" +msgstr "Lyd: Ikke implementert" #: src/frontend/mame/ui/selmenu.cpp:638 #: src/frontend/mame/ui/simpleselgame.cpp:349 msgid "Sound: Imperfect" -msgstr "" +msgstr "Lyd: Ikke perfekt" #: src/frontend/mame/ui/selmenu.cpp:640 #: src/frontend/mame/ui/simpleselgame.cpp:351 msgid "Sound: OK" -msgstr "" +msgstr "Lyd: OK" #: src/frontend/mame/ui/selmenu.cpp:650 #, c-format msgid "%1$s %2$s" -msgstr "" +msgstr "%1$s %2$s" #: src/frontend/mame/ui/selmenu.cpp:1975 msgid "Images" -msgstr "" +msgstr "Bilder" #: src/frontend/mame/ui/selmenu.cpp:1976 msgid "Infos" -msgstr "" +msgstr "Info" #: src/frontend/mame/ui/selmenu.cpp:2386 src/frontend/mame/ui/miscmenu.cpp:826 msgid " (default)" -msgstr "" +msgstr " (standard)" #: src/frontend/mame/ui/selmenu.cpp:2454 msgid "Usage" -msgstr "" +msgstr "Bruksområde" #: src/frontend/mame/ui/selmenu.cpp:2489 msgid "General Info" -msgstr "" +msgstr "Generell info" #: src/frontend/mame/ui/dirmenu.cpp:35 msgid "ROMs" -msgstr "" +msgstr "ROM-filer" #: src/frontend/mame/ui/dirmenu.cpp:36 msgid "Software Media" -msgstr "" +msgstr "Programvaremedier" #: src/frontend/mame/ui/dirmenu.cpp:37 msgid "UI" -msgstr "" +msgstr "Grensesnitt" #: src/frontend/mame/ui/dirmenu.cpp:38 src/frontend/mame/ui/custui.cpp:157 msgid "Language" -msgstr "" +msgstr "Språk" #: src/frontend/mame/ui/dirmenu.cpp:39 msgid "Samples" -msgstr "" +msgstr "Samplinger" #: src/frontend/mame/ui/dirmenu.cpp:40 msgid "DATs" -msgstr "" +msgstr "DATer" #: src/frontend/mame/ui/dirmenu.cpp:41 msgid "INIs" -msgstr "" +msgstr "INIer" #: src/frontend/mame/ui/dirmenu.cpp:42 msgid "Category INIs" -msgstr "" +msgstr "Kategori-INIer" #: src/frontend/mame/ui/dirmenu.cpp:43 msgid "Icons" -msgstr "" +msgstr "Ikoner" #: src/frontend/mame/ui/dirmenu.cpp:44 src/frontend/mame/ui/submenu.cpp:25 msgid "Cheats" -msgstr "" +msgstr "Juksekoder" #: src/frontend/mame/ui/dirmenu.cpp:52 msgid "Controls Panels" -msgstr "" +msgstr "Kontrollpaneler" #: src/frontend/mame/ui/dirmenu.cpp:53 msgid "Crosshairs" -msgstr "" +msgstr "Siktehår" #: src/frontend/mame/ui/dirmenu.cpp:54 msgid "Artworks" -msgstr "" +msgstr "Kunstverk" #: src/frontend/mame/ui/dirmenu.cpp:56 msgid "Artworks Preview" -msgstr "" +msgstr "Kunstverkforhåndsvisning" #: src/frontend/mame/ui/dirmenu.cpp:58 msgid "GameOver" -msgstr "" +msgstr "GameOver" #: src/frontend/mame/ui/dirmenu.cpp:116 msgid "Folders Setup" -msgstr "" +msgstr "Mappeoppsett" #: src/frontend/mame/ui/dirmenu.cpp:167 #, c-format msgid "Current %1$s Folders" -msgstr "" +msgstr "Nåværende %1$s-mapper" #: src/frontend/mame/ui/dirmenu.cpp:179 msgid "Change Folder" -msgstr "" +msgstr "Bytt mappe" #: src/frontend/mame/ui/dirmenu.cpp:179 msgid "Add Folder" -msgstr "" +msgstr "Legg til mappe" #: src/frontend/mame/ui/dirmenu.cpp:182 msgid "Remove Folder" -msgstr "" +msgstr "Fjern mappe" #: src/frontend/mame/ui/dirmenu.cpp:418 #, c-format msgid "Change %1$s Folder - Search: %2$s_" -msgstr "" +msgstr "Endre %1$s-mappe - Søk: %2$s_" #: src/frontend/mame/ui/dirmenu.cpp:418 #, c-format msgid "Add %1$s Folder - Search: %2$s_" -msgstr "" +msgstr "Legg til %1$s mappe - søk: %2$s_" #: src/frontend/mame/ui/dirmenu.cpp:429 msgid "Press TAB to set" -msgstr "" +msgstr "Trykk TAB for å velge" #: src/frontend/mame/ui/dirmenu.cpp:513 #, c-format msgid "Remove %1$s Folder" -msgstr "" +msgstr "Fjern %1$s mappe" #: src/frontend/mame/ui/info.cpp:30 msgid "protection" -msgstr "" +msgstr "beskyttelse" #: src/frontend/mame/ui/info.cpp:31 msgid "color palette" -msgstr "" +msgstr "fargepalett" #: src/frontend/mame/ui/info.cpp:32 msgid "graphics" -msgstr "" +msgstr "grafikk" #: src/frontend/mame/ui/info.cpp:33 msgid "sound" -msgstr "" +msgstr "lyd" #: src/frontend/mame/ui/info.cpp:34 msgid "controls" -msgstr "" +msgstr "kontrollere" #: src/frontend/mame/ui/info.cpp:35 msgid "keyboard" -msgstr "" +msgstr "tastatur" #: src/frontend/mame/ui/info.cpp:36 msgid "mouse" -msgstr "" +msgstr "mus" #: src/frontend/mame/ui/info.cpp:37 msgid "microphone" -msgstr "" +msgstr "mikrofon" #: src/frontend/mame/ui/info.cpp:38 msgid "camera" -msgstr "" +msgstr "kamera" #: src/frontend/mame/ui/info.cpp:39 msgid "disk" -msgstr "" +msgstr "disk" #: src/frontend/mame/ui/info.cpp:40 msgid "printer" -msgstr "" +msgstr "skriver" #: src/frontend/mame/ui/info.cpp:41 msgid "LAN" -msgstr "" +msgstr "LAN" #: src/frontend/mame/ui/info.cpp:42 msgid "WAN" -msgstr "" +msgstr "WAN" #: src/frontend/mame/ui/info.cpp:43 msgid "timing" -msgstr "" +msgstr "timing" #: src/frontend/mame/ui/info.cpp:180 msgid "" "One or more ROMs/CHDs for this machine are incorrect. The machine may not " "run correctly.\n" msgstr "" +"Én eller flere av ROM- eller CHD-filene til denne maskinen er feil. Maskinen " +"vil kanskje ikke kunne kjøre riktig.\n" #: src/frontend/mame/ui/info.cpp:190 msgid "" "There are known problems with this machine\n" "\n" msgstr "" +"Det er noen problemer med maskinen som vi kjenner til\n" +"\n" #: src/frontend/mame/ui/info.cpp:195 msgid "" "One or more ROMs/CHDs for this machine have not been correctly dumped.\n" msgstr "" +"Én eller flere av ROM- eller CHD-filene til denne maskinen har ikke blitt " +"riktig dumpet.\n" #: src/frontend/mame/ui/info.cpp:200 msgid "Completely unemulated features: " -msgstr "" +msgstr "Fullstendig uemulerte egenskaper: " #: src/frontend/mame/ui/info.cpp:206 src/frontend/mame/ui/info.cpp:222 #, c-format msgid "%s" -msgstr "" +msgstr "%s" #: src/frontend/mame/ui/info.cpp:206 src/frontend/mame/ui/info.cpp:222 #: src/frontend/mame/ui/info.cpp:267 #, c-format msgid ", %s" -msgstr "" +msgstr ", %s" #: src/frontend/mame/ui/info.cpp:216 msgid "Imperfectly emulated features: " -msgstr "" +msgstr "Funksjoner som ikke er perfekt emulert: " #: src/frontend/mame/ui/info.cpp:231 msgid "Screen flipping in cocktail mode is not supported.\n" -msgstr "" +msgstr "Skjermvending i cocktailmodus støttes ikke.\n" #: src/frontend/mame/ui/info.cpp:233 msgid "This machine requires external artwork files.\n" -msgstr "" +msgstr "Denne maskinen krever eksterne kunstverkfiler.\n" #: src/frontend/mame/ui/info.cpp:235 msgid "" "This machine was never completed. It may exhibit strange behavior or missing " "elements that are not bugs in the emulation.\n" msgstr "" +"Denne maskinen ble aldri laget ferdig. Den kan oppføre seg merkelig eller " +"mangle elementer som ikke er feil i emuleringen.\n" #: src/frontend/mame/ui/info.cpp:237 msgid "" "This machine has no sound hardware, MAME will produce no sounds, this is " "expected behaviour.\n" msgstr "" +"Denne maskinen har ingen maskinvare for lyd. MAME vil ikke sende ut noen " +"lyder, dette er forventet oppførsel.\n" #: src/frontend/mame/ui/info.cpp:241 msgid "" @@ -467,6 +482,10 @@ msgid "" "complete. There is nothing you can do to fix this problem except wait for " "the developers to improve the emulation.\n" msgstr "" +"\n" +"DENNE MASKINEN VIRKER IKKE. Emuleringen av denne maskinen er ikke fullført " +"ennå. Det er ingenting du kan gjøre med dette problemet, bortsett fra å " +"vente på at utviklerne forbedrer emuleringen.\n" #: src/frontend/mame/ui/info.cpp:243 msgid "" @@ -475,6 +494,10 @@ msgid "" "interaction or consist of mechanical devices. It is not possible to fully " "experience this machine.\n" msgstr "" +"\n" +"Noen elementer i denne maskinen kan ikke bli emulert, siden de krever fysisk " +"samhandling eller består av mekaniske deler. Det er ikke mulig å oppleve " +"denne maskinen fullt ut.\n" #: src/frontend/mame/ui/info.cpp:265 #, c-format @@ -483,6 +506,9 @@ msgid "" "\n" "There are working clones of this machine: %s" msgstr "" +"\n" +"\n" +"Denne maskinen har fungerende kloner av seg: %s" #: src/frontend/mame/ui/info.cpp:278 msgid "" @@ -490,6 +516,9 @@ msgid "" "\n" "Press any key to continue" msgstr "" +"\n" +"\n" +"Trykk på enhver knapp for å fortsette" #: src/frontend/mame/ui/info.cpp:293 #, c-format @@ -500,196 +529,205 @@ msgid "" "\n" "CPU:\n" msgstr "" +"%1$s\n" +"%2$s %3$s\n" +"Driver: %4$s\n" +"\n" +"CPU:\n" #: src/frontend/mame/ui/info.cpp:328 src/frontend/mame/ui/info.cpp:366 msgid "MHz" -msgstr "" +msgstr "MHz" #: src/frontend/mame/ui/info.cpp:328 src/frontend/mame/ui/info.cpp:366 msgid "kHz" -msgstr "" +msgstr "kHz" #: src/frontend/mame/ui/info.cpp:342 msgid "" "\n" "Sound:\n" msgstr "" +"\n" +"Lyd:\n" #: src/frontend/mame/ui/info.cpp:370 msgid "" "\n" "Video:\n" msgstr "" +"\n" +"Video:\n" #: src/frontend/mame/ui/info.cpp:374 msgid "None\n" -msgstr "" +msgstr "Ingen\n" #: src/frontend/mame/ui/info.cpp:381 msgid "Vector" -msgstr "" +msgstr "Vektor" #: src/frontend/mame/ui/info.cpp:392 #, c-format msgid "%1$s: %2$s\n" -msgstr "" +msgstr "%1$s: %2$s\n" #: src/frontend/mame/ui/info.cpp:392 msgid "%2$s\n" -msgstr "" +msgstr "%2$s\n" #: src/frontend/mame/ui/info.cpp:438 #, c-format msgid "Screen '%1$s'" -msgstr "" +msgstr "Skjerm '%1$s'" #: src/frontend/mame/ui/info.cpp:440 msgid "Screen" -msgstr "" +msgstr "Skjerm" #: src/frontend/mame/ui/info.cpp:525 msgid "Not supported" -msgstr "" +msgstr "Ikke støttet" #: src/frontend/mame/ui/info.cpp:528 msgid "Partially supported" -msgstr "" +msgstr "Delvis støttet" #: src/frontend/mame/ui/info.cpp:536 msgid "[empty]" -msgstr "" +msgstr "[tom]" #: src/frontend/mame/ui/optsmenu.cpp:193 msgid "Filter" -msgstr "" +msgstr "Filtrer" #: src/frontend/mame/ui/optsmenu.cpp:206 msgid "Customize UI" -msgstr "" +msgstr "Tilpass grensesnittet" #: src/frontend/mame/ui/optsmenu.cpp:207 msgid "Configure Directories" -msgstr "" +msgstr "Sett opp mapper" #: src/frontend/mame/ui/optsmenu.cpp:210 src/frontend/mame/ui/sndmenu.cpp:149 msgid "Sound Options" -msgstr "" +msgstr "Lydinnstillinger" #: src/frontend/mame/ui/optsmenu.cpp:213 msgid "General Inputs" -msgstr "" +msgstr "Kontrollerkartlegging" #: src/frontend/mame/ui/optsmenu.cpp:216 msgid "Save Configuration" -msgstr "" +msgstr "Lagre oppsettet" #: src/frontend/mame/ui/optsmenu.cpp:228 msgid "Settings" -msgstr "" +msgstr "Innstillinger" #: src/frontend/mame/ui/tapectrl.cpp:85 msgid "stopped" -msgstr "" +msgstr "stoppet" #: src/frontend/mame/ui/tapectrl.cpp:87 msgid "playing" -msgstr "" +msgstr "spiller av" #: src/frontend/mame/ui/tapectrl.cpp:87 msgid "(playing)" -msgstr "" +msgstr "(spiller av)" #: src/frontend/mame/ui/tapectrl.cpp:88 msgid "recording" -msgstr "" +msgstr "tar opp" #: src/frontend/mame/ui/tapectrl.cpp:88 msgid "(recording)" -msgstr "" +msgstr "(tar opp)" #: src/frontend/mame/ui/tapectrl.cpp:95 msgid "Pause/Stop" -msgstr "" +msgstr "Pause/Stopp" #: src/frontend/mame/ui/tapectrl.cpp:98 msgid "Play" -msgstr "" +msgstr "Spill av" #: src/frontend/mame/ui/tapectrl.cpp:101 msgid "Record" -msgstr "" +msgstr "Ta opp" #: src/frontend/mame/ui/tapectrl.cpp:104 src/frontend/mame/ui/submenu.cpp:66 msgid "Rewind" -msgstr "" +msgstr "Spol tilbake" #: src/frontend/mame/ui/tapectrl.cpp:107 msgid "Fast Forward" -msgstr "" +msgstr "Spol frem" #: src/frontend/mame/ui/inputmap.cpp:53 msgid "User Interface" -msgstr "" +msgstr "Brukergrensesnitt" #: src/frontend/mame/ui/inputmap.cpp:59 msgid "Other Controls" -msgstr "" +msgstr "Andre kontrolleringer" #: src/frontend/mame/ui/inputmap.cpp:628 src/frontend/mame/ui/miscmenu.cpp:96 #: src/frontend/mame/ui/slotopt.cpp:203 msgid "Reset" -msgstr "" +msgstr "Tilbakestill" #: src/frontend/mame/ui/selector.cpp:116 msgid "Selection List - Search: " -msgstr "" +msgstr "Utvalgsliste - Søk: " #: src/frontend/mame/ui/selector.cpp:124 #, c-format msgid "Double click or press %1$s to select" -msgstr "" +msgstr "Dobbeltklikk eller trykk %1$s for å velge" #: src/frontend/mame/ui/swlist.cpp:83 src/frontend/mame/ui/slotopt.cpp:220 #: src/frontend/mame/ui/filesel.cpp:256 msgid "[empty slot]" -msgstr "" +msgstr "[tomt felt]" #: src/frontend/mame/ui/swlist.cpp:88 msgid "[file manager]" -msgstr "" +msgstr "[filbehandler]" #: src/frontend/mame/ui/swlist.cpp:94 src/frontend/mame/ui/filesel.cpp:264 msgid "[software list]" -msgstr "" +msgstr "[programvareliste]" #: src/frontend/mame/ui/swlist.cpp:228 msgid "Switch Item Ordering" -msgstr "" +msgstr "Bytt om på gjenstandssortering" #: src/frontend/mame/ui/swlist.cpp:259 #, c-format msgid "Switched Order: entries now ordered by %s" -msgstr "" +msgstr "Byttet rekkefølge: oppføringer sorteres nå etter %s" #: src/frontend/mame/ui/swlist.cpp:259 msgid "shortname" -msgstr "" +msgstr "mininavn" #: src/frontend/mame/ui/swlist.cpp:259 msgid "description" -msgstr "" +msgstr "beskrivelse" #: src/frontend/mame/ui/swlist.cpp:389 msgid "[compatible lists]" -msgstr "" +msgstr "[kompatible lister]" #: src/frontend/mame/ui/datmenu.cpp:80 msgid "Software Usage" -msgstr "" +msgstr "Programvarebruk" #: src/frontend/mame/ui/datmenu.cpp:362 msgid "Revision: " -msgstr "" +msgstr "Revidering: " #: src/frontend/mame/ui/simpleselgame.cpp:149 msgid "" @@ -698,6 +736,10 @@ msgid "" "\n" "Press any key to continue." msgstr "" +"Det valgte spillet mangler én eller flere påkrevde ROM- eller CHD-bilder. " +"Vennligst velg et annet spill.\n" +"\n" +"Trykk på enhver knapp for å fortsette." #: src/frontend/mame/ui/simpleselgame.cpp:241 #, c-format @@ -707,126 +749,131 @@ msgid "" "If this is your first time using %2$s, please see the config.txt file in the " "docs directory for information on configuring %2$s." msgstr "" +"Ingen maskiner ble funnet. Vennligst sjekk ROM-filbanen som er spesifisert i " +"%1$s.ini-filen\n" +"\n" +"Dersom dette er første gang du bruker %2$s, vennligst se i config.txt-filen " +"i dokumentmappen for informasjon om hvordan man setter opp %2$s." #: src/frontend/mame/ui/simpleselgame.cpp:271 #: src/frontend/mame/ui/selgame.cpp:436 msgid "Configure Options" -msgstr "" +msgstr "Sett opp innstillingene" #: src/frontend/mame/ui/simpleselgame.cpp:292 #, c-format msgid "Type name or select: %1$s_" -msgstr "" +msgstr "Skriv inn navn eller velg: %1$s_" #: src/frontend/mame/ui/simpleselgame.cpp:294 msgid "Type name or select: (random)" -msgstr "" +msgstr "Skriv inn navn eller velg: (tilfeldig)" #: src/frontend/mame/ui/simpleselgame.cpp:308 #: src/frontend/mame/ui/selsoft.cpp:564 src/frontend/mame/ui/selsoft.cpp:571 #, c-format msgid "%1$-.100s" -msgstr "" +msgstr "%1$-.100s" #: src/frontend/mame/ui/simpleselgame.cpp:314 #, c-format msgid "Driver: %1$-.100s" -msgstr "" +msgstr "Driver: %1$-.100s" #: src/frontend/mame/ui/videoopt.cpp:56 #, c-format msgid "Screen #%d" -msgstr "" +msgstr "Skjerm nr. %d" #: src/frontend/mame/ui/videoopt.cpp:204 src/frontend/mame/ui/submenu.cpp:48 msgid "Rotate" -msgstr "" +msgstr "Rotering" #: src/frontend/mame/ui/videoopt.cpp:208 msgid "Backdrops" -msgstr "" +msgstr "Bakgrunner" #: src/frontend/mame/ui/videoopt.cpp:208 src/frontend/mame/ui/videoopt.cpp:212 #: src/frontend/mame/ui/videoopt.cpp:216 src/frontend/mame/ui/videoopt.cpp:220 #: src/frontend/mame/ui/videoopt.cpp:224 src/frontend/mame/ui/cheatopt.cpp:273 #: src/frontend/mame/ui/ui.cpp:1255 msgid "Enabled" -msgstr "" +msgstr "Skrudd på" #: src/frontend/mame/ui/videoopt.cpp:208 src/frontend/mame/ui/videoopt.cpp:212 #: src/frontend/mame/ui/videoopt.cpp:216 src/frontend/mame/ui/videoopt.cpp:220 #: src/frontend/mame/ui/videoopt.cpp:224 src/frontend/mame/ui/cheatopt.cpp:273 #: src/frontend/mame/ui/ui.cpp:1255 msgid "Disabled" -msgstr "" +msgstr "Skrudd av" #: src/frontend/mame/ui/videoopt.cpp:212 msgid "Overlays" -msgstr "" +msgstr "Overlegg" #: src/frontend/mame/ui/videoopt.cpp:216 msgid "Bezels" -msgstr "" +msgstr "Bezeler" #: src/frontend/mame/ui/videoopt.cpp:220 msgid "CPanels" -msgstr "" +msgstr "K.paneler" #: src/frontend/mame/ui/videoopt.cpp:228 msgid "View" -msgstr "" +msgstr "Vis" #: src/frontend/mame/ui/videoopt.cpp:228 msgid "Cropped" -msgstr "" +msgstr "Beskjært" #: src/frontend/mame/ui/videoopt.cpp:228 msgid "Full" -msgstr "" +msgstr "Full" #: src/frontend/mame/ui/filecreate.cpp:79 msgid "File Already Exists - Override?" -msgstr "" +msgstr "Filen finnes allerede - Vil du overskrive?" #: src/frontend/mame/ui/filecreate.cpp:81 src/frontend/mame/ui/utils.cpp:1047 msgid "No" -msgstr "" +msgstr "Nei" #: src/frontend/mame/ui/filecreate.cpp:82 src/frontend/mame/ui/utils.cpp:1047 msgid "Yes" -msgstr "" +msgstr "Ja" #: src/frontend/mame/ui/filecreate.cpp:171 msgid "New Image Name:" -msgstr "" +msgstr "Nytt bildenavn:" #: src/frontend/mame/ui/filecreate.cpp:177 msgid "Image Format:" -msgstr "" +msgstr "Bildeformat:" #: src/frontend/mame/ui/filecreate.cpp:183 msgid "Create" -msgstr "" +msgstr "Opprett" #: src/frontend/mame/ui/filecreate.cpp:214 msgid "Please enter a file extension too" -msgstr "" +msgstr "Vennligst skriv inn en filutvidelse også" #: src/frontend/mame/ui/filecreate.cpp:266 msgid "Select image format" -msgstr "" +msgstr "Velg bildeformat" #: src/frontend/mame/ui/miscmenu.cpp:43 msgid "Keyboard Mode:" -msgstr "" +msgstr "Tastaturmodus:" #: src/frontend/mame/ui/miscmenu.cpp:43 msgid "Natural" -msgstr "" +msgstr "Naturlig" #: src/frontend/mame/ui/miscmenu.cpp:43 msgid "Emulated" -msgstr "" +msgstr "Emulert" #: src/frontend/mame/ui/miscmenu.cpp:236 #, c-format @@ -834,6 +881,8 @@ msgid "" "Uptime: %1$d:%2$02d:%3$02d\n" "\n" msgstr "" +"Oppetid: %1$d:%2$02d:%3$02d\n" +"\n" #: src/frontend/mame/ui/miscmenu.cpp:238 #, c-format @@ -841,6 +890,8 @@ msgid "" "Uptime: %1$d:%2$02d\n" "\n" msgstr "" +"Oppetid: %1$d:%2$02d\n" +"\n" #: src/frontend/mame/ui/miscmenu.cpp:242 #, c-format @@ -848,49 +899,51 @@ msgid "" "Tickets dispensed: %1$d\n" "\n" msgstr "" +"Utskrevne billetter: %1$d\n" +"\n" #: src/frontend/mame/ui/miscmenu.cpp:253 msgid "Coin %1$c: NA%3$s\n" -msgstr "" +msgstr "Mynt %1$c: NA%3$s\n" #: src/frontend/mame/ui/miscmenu.cpp:253 #, c-format msgid "Coin %1$c: %2$d%3$s\n" -msgstr "" +msgstr "Mynt %1$c: %2$d%3$s\n" #: src/frontend/mame/ui/miscmenu.cpp:256 msgid " (locked)" -msgstr "" +msgstr " (låst)" #: src/frontend/mame/ui/miscmenu.cpp:503 msgid "Visible Delay" -msgstr "" +msgstr "Synlig forsinkelse" #: src/frontend/mame/ui/miscmenu.cpp:601 #, c-format msgid "%s.xml saved under ui folder." -msgstr "" +msgstr "%s.xml ble lagret i ui-mappen." #: src/frontend/mame/ui/miscmenu.cpp:627 msgid "Name: Description:\n" -msgstr "" +msgstr "Navn: Beskrivelse:\n" #: src/frontend/mame/ui/miscmenu.cpp:638 #, c-format msgid "%s.txt saved under ui folder." -msgstr "" +msgstr "%s.txt ble lagret i ui-mappen." #: src/frontend/mame/ui/miscmenu.cpp:655 msgid "Export list in XML format (like -listxml)" -msgstr "" +msgstr "Eksporter listen i XML-format (som i -listxml)" #: src/frontend/mame/ui/miscmenu.cpp:656 msgid "Export list in XML format (like -listxml, but exclude devices)" -msgstr "" +msgstr "Eksporter listen i XML-format (som i -listxml, men ekskluder enheter)" #: src/frontend/mame/ui/miscmenu.cpp:657 msgid "Export list in TXT format (like -listfull)" -msgstr "" +msgstr "Eksporter listen i TXT-format (som i -listfull)" #: src/frontend/mame/ui/miscmenu.cpp:710 src/frontend/mame/ui/ui.cpp:2230 msgid "" @@ -898,41 +951,44 @@ msgid "" " Configuration saved \n" "\n" msgstr "" +"\n" +" Oppsettet er lagret \n" +"\n" #: src/frontend/mame/ui/miscmenu.cpp:760 src/frontend/mame/ui/utils.cpp:66 msgid "BIOS" -msgstr "" +msgstr "BIOS" #: src/frontend/mame/ui/miscmenu.cpp:764 msgid "Driver" -msgstr "" +msgstr "Driver" #: src/frontend/mame/ui/miscmenu.cpp:767 msgid "This machine has no BIOS." -msgstr "" +msgstr "Denne maskinen har ingen BIOS." #: src/frontend/mame/ui/miscmenu.cpp:776 src/frontend/mame/ui/mainmenu.cpp:145 msgid "Add To Favorites" -msgstr "" +msgstr "Legg til i favorittene" #: src/frontend/mame/ui/miscmenu.cpp:778 src/frontend/mame/ui/mainmenu.cpp:147 msgid "Remove From Favorites" -msgstr "" +msgstr "Fjern fra favorittene" #: src/frontend/mame/ui/miscmenu.cpp:781 msgid "Save machine configuration" -msgstr "" +msgstr "Lagre maskinoppsettet" #: src/frontend/mame/ui/miscmenu.cpp:792 msgid "Configure machine:" -msgstr "" +msgstr "Sett opp maskinen:" #: src/frontend/mame/ui/miscmenu.cpp:895 src/frontend/mame/ui/sndmenu.cpp:135 #: src/frontend/mame/ui/sndmenu.cpp:137 src/frontend/mame/ui/menu.cpp:736 #: src/frontend/mame/ui/cheatopt.cpp:299 src/frontend/mame/ui/cheatopt.cpp:305 #: plugins/cheat/init.lua:551 plugins/cheatfind/init.lua:619 msgid "On" -msgstr "" +msgstr "På" #: src/frontend/mame/ui/miscmenu.cpp:895 src/frontend/mame/ui/sndmenu.cpp:135 #: src/frontend/mame/ui/sndmenu.cpp:137 src/frontend/mame/ui/menu.cpp:739 @@ -940,660 +996,660 @@ msgstr "" #: plugins/cheat/init.lua:554 plugins/cheat/init.lua:563 #: plugins/cheatfind/init.lua:616 msgid "Off" -msgstr "" +msgstr "Av" #: src/frontend/mame/ui/miscmenu.cpp:909 src/frontend/mame/ui/selgame.cpp:441 msgid "Plugins" -msgstr "" +msgstr "Tillegg" #: src/frontend/mame/ui/barcode.cpp:74 msgid "New Barcode:" -msgstr "" +msgstr "Ny strekkode:" #: src/frontend/mame/ui/barcode.cpp:78 msgid "Enter Code" -msgstr "" +msgstr "Skriv inn kode" #: src/frontend/mame/ui/barcode.cpp:119 msgid "Barcode length invalid!" -msgstr "" +msgstr "Strekkodelengden er ugyldig!" #: src/frontend/mame/ui/info_pty.cpp:30 src/frontend/mame/ui/mainmenu.cpp:99 msgid "Pseudo terminals" -msgstr "" +msgstr "Kvasiterminaler" #: src/frontend/mame/ui/info_pty.cpp:39 msgid "[failed]" -msgstr "" +msgstr "[mislyktes]" #: src/frontend/mame/ui/mainmenu.cpp:60 msgid "Input (general)" -msgstr "" +msgstr "Kontrollere (Generelt)" #: src/frontend/mame/ui/mainmenu.cpp:62 msgid "Input (this Machine)" -msgstr "" +msgstr "Kontrollere (Denne maskinen)" #: src/frontend/mame/ui/mainmenu.cpp:66 msgid "Analog Controls" -msgstr "" +msgstr "Analoge kontrollere" #: src/frontend/mame/ui/mainmenu.cpp:68 msgid "Dip Switches" -msgstr "" +msgstr "DIP-brytere" #: src/frontend/mame/ui/mainmenu.cpp:71 msgid "Machine Configuration" -msgstr "" +msgstr "Maskinoppsett" #: src/frontend/mame/ui/mainmenu.cpp:75 msgid "Bookkeeping Info" -msgstr "" +msgstr "Bokføringsinfo" #: src/frontend/mame/ui/mainmenu.cpp:78 msgid "Machine Information" -msgstr "" +msgstr "Maskininformasjon" #: src/frontend/mame/ui/mainmenu.cpp:85 msgid "Image Information" -msgstr "" +msgstr "Bildeinformasjon" #: src/frontend/mame/ui/mainmenu.cpp:88 msgid "File Manager" -msgstr "" +msgstr "Filbehandler" #: src/frontend/mame/ui/mainmenu.cpp:96 msgid "Tape Control" -msgstr "" +msgstr "Teipkontroll" #: src/frontend/mame/ui/mainmenu.cpp:102 msgid "BIOS Selection" -msgstr "" +msgstr "BIOS-valg" #: src/frontend/mame/ui/mainmenu.cpp:106 msgid "Slot Devices" -msgstr "" +msgstr "Feltenheter" #: src/frontend/mame/ui/mainmenu.cpp:110 msgid "Barcode Reader" -msgstr "" +msgstr "Strekkodeleser" #: src/frontend/mame/ui/mainmenu.cpp:114 msgid "Network Devices" -msgstr "" +msgstr "Nettverksenheter" #: src/frontend/mame/ui/mainmenu.cpp:118 msgid "Keyboard Mode" -msgstr "" +msgstr "Tastaturmodus" #: src/frontend/mame/ui/mainmenu.cpp:121 msgid "Slider Controls" -msgstr "" +msgstr "Glidekontrollere" #: src/frontend/mame/ui/mainmenu.cpp:124 src/frontend/mame/ui/submenu.cpp:101 msgid "Video Options" -msgstr "" +msgstr "Videoinnstillinger" #: src/frontend/mame/ui/mainmenu.cpp:128 msgid "Crosshair Options" -msgstr "" +msgstr "Siktehårinnstillinger" #: src/frontend/mame/ui/mainmenu.cpp:132 plugins/cheat/init.lua:735 msgid "Cheat" -msgstr "" +msgstr "Juks" #: src/frontend/mame/ui/mainmenu.cpp:135 msgid "Plugin Options" -msgstr "" +msgstr "Tilleggsinnstillinger" #: src/frontend/mame/ui/mainmenu.cpp:139 msgid "External DAT View" -msgstr "" +msgstr "Ekstern DAT-visning" #: src/frontend/mame/ui/mainmenu.cpp:154 msgid "Select New Machine" -msgstr "" +msgstr "Velg en ny maskin" #: src/frontend/mame/ui/custui.cpp:31 msgid "Show All" -msgstr "" +msgstr "Vis alle" #: src/frontend/mame/ui/custui.cpp:32 msgid "Hide Filters" -msgstr "" +msgstr "Skjul filtre" #: src/frontend/mame/ui/custui.cpp:33 msgid "Hide Info/Image" -msgstr "" +msgstr "Skjul Info/Bilder" #: src/frontend/mame/ui/custui.cpp:34 msgid "Hide Both" -msgstr "" +msgstr "Skjul begge" #: src/frontend/mame/ui/custui.cpp:151 msgid "Fonts" -msgstr "" +msgstr "Skrifttyper" #: src/frontend/mame/ui/custui.cpp:152 msgid "Colors" -msgstr "" +msgstr "Farger" #: src/frontend/mame/ui/custui.cpp:161 msgid "Show side panels" -msgstr "" +msgstr "Vis sidepanelene" #: src/frontend/mame/ui/custui.cpp:173 msgid "Custom UI Settings" -msgstr "" +msgstr "Tilpassede grensesnittinnstillinger" #: src/frontend/mame/ui/custui.cpp:223 msgid "default" -msgstr "" +msgstr "standard" #: src/frontend/mame/ui/custui.cpp:331 msgid "UI Font" -msgstr "" +msgstr "Grensesnittskrifttype" #: src/frontend/mame/ui/custui.cpp:336 msgid "Bold" -msgstr "" +msgstr "Fet" #: src/frontend/mame/ui/custui.cpp:337 msgid "Italic" -msgstr "" +msgstr "Kursiv" #: src/frontend/mame/ui/custui.cpp:342 msgid "Lines" -msgstr "" +msgstr "Linjer" #: src/frontend/mame/ui/custui.cpp:348 msgid "Infos text size" -msgstr "" +msgstr "Info-tekststørrelse" #: src/frontend/mame/ui/custui.cpp:362 msgid "UI Fonts Settings" -msgstr "" +msgstr "Grensesnittskrifttypeinnstillinger" #: src/frontend/mame/ui/custui.cpp:371 msgid "Sample text - Lorem ipsum dolor sit amet, consectetur adipiscing elit." -msgstr "" +msgstr "Prøvetekst - Lorem ipsum dolor sit amet, consectetur adipiscing elit." #: src/frontend/mame/ui/custui.cpp:451 msgid "Normal text" -msgstr "" +msgstr "Vanlig tekst" #: src/frontend/mame/ui/custui.cpp:452 msgid "Selected color" -msgstr "" +msgstr "Valgt farge" #: src/frontend/mame/ui/custui.cpp:453 msgid "Normal text background" -msgstr "" +msgstr "Bakgrunn for vanlig tekst" #: src/frontend/mame/ui/custui.cpp:454 msgid "Selected background color" -msgstr "" +msgstr "Valgt bakgrunnsfarge" #: src/frontend/mame/ui/custui.cpp:455 msgid "Subitem color" -msgstr "" +msgstr "Undergjenstandsfarge" #: src/frontend/mame/ui/custui.cpp:456 src/frontend/mame/ui/custui.cpp:511 msgid "Clone" -msgstr "" +msgstr "Klon" #: src/frontend/mame/ui/custui.cpp:457 msgid "Border" -msgstr "" +msgstr "Kant" #: src/frontend/mame/ui/custui.cpp:458 msgid "Background" -msgstr "" +msgstr "Bakgrunn" #: src/frontend/mame/ui/custui.cpp:459 msgid "Dipswitch" -msgstr "" +msgstr "DIP-brytere" #: src/frontend/mame/ui/custui.cpp:460 msgid "Unavailable color" -msgstr "" +msgstr "Utilgjengelig farge" #: src/frontend/mame/ui/custui.cpp:461 msgid "Slider color" -msgstr "" +msgstr "Gliderfarge" #: src/frontend/mame/ui/custui.cpp:462 msgid "Gfx viewer background" -msgstr "" +msgstr "Grafikkviserbakgrunn" #: src/frontend/mame/ui/custui.cpp:463 msgid "Mouse over color" -msgstr "" +msgstr "Museoverholdingsfarge" #: src/frontend/mame/ui/custui.cpp:464 msgid "Mouse over background color" -msgstr "" +msgstr "Museoverholdingsbakgrunnsfarge" #: src/frontend/mame/ui/custui.cpp:465 msgid "Mouse down color" -msgstr "" +msgstr "Musenedeholdingsfarge" #: src/frontend/mame/ui/custui.cpp:466 msgid "Mouse down background color" -msgstr "" +msgstr "Musenedeholdingsbakgrunnsfarge" #: src/frontend/mame/ui/custui.cpp:469 msgid "Restore originals colors" -msgstr "" +msgstr "Gjenopprett de opprinnelige fargene" #: src/frontend/mame/ui/custui.cpp:481 msgid "UI Colors Settings" -msgstr "" +msgstr "Grensesnittfargeinnstillinger" #: src/frontend/mame/ui/custui.cpp:490 #, c-format msgid "Double click or press %1$s to change the color value" -msgstr "" +msgstr "Dobbeltklikk eller trykk %1$s for å endre fargeverdien" #: src/frontend/mame/ui/custui.cpp:498 msgid "Menu Preview" -msgstr "" +msgstr "Menyforhåndsvisning" #: src/frontend/mame/ui/custui.cpp:507 msgid "Normal" -msgstr "" +msgstr "Normal" #: src/frontend/mame/ui/custui.cpp:508 msgid "Subitem" -msgstr "" +msgstr "Undergjenstand" #: src/frontend/mame/ui/custui.cpp:509 msgid "Selected" -msgstr "" +msgstr "Valgt" #: src/frontend/mame/ui/custui.cpp:510 msgid "Mouse Over" -msgstr "" +msgstr "Hold musen over" #: src/frontend/mame/ui/custui.cpp:740 msgid "ARGB Settings" -msgstr "" +msgstr "ARGB-innstillinger" #: src/frontend/mame/ui/custui.cpp:745 src/frontend/mame/ui/custui.cpp:748 msgid "Alpha" -msgstr "" +msgstr "Alfa" #: src/frontend/mame/ui/custui.cpp:753 src/frontend/mame/ui/custui.cpp:756 #: src/frontend/mame/ui/custui.cpp:898 msgid "Red" -msgstr "" +msgstr "Rød" #: src/frontend/mame/ui/custui.cpp:761 src/frontend/mame/ui/custui.cpp:764 #: src/frontend/mame/ui/custui.cpp:901 msgid "Green" -msgstr "" +msgstr "Grønn" #: src/frontend/mame/ui/custui.cpp:769 src/frontend/mame/ui/custui.cpp:772 #: src/frontend/mame/ui/custui.cpp:902 msgid "Blue" -msgstr "" +msgstr "Blå" #: src/frontend/mame/ui/custui.cpp:775 msgid "Choose from palette" -msgstr "" +msgstr "Velg fra palett" #: src/frontend/mame/ui/custui.cpp:813 msgid "Color preview =" -msgstr "" +msgstr "Fargeforhåndsvisning =" #: src/frontend/mame/ui/custui.cpp:894 msgid "White" -msgstr "" +msgstr "Hvit" #: src/frontend/mame/ui/custui.cpp:895 msgid "Silver" -msgstr "" +msgstr "Sølv" #: src/frontend/mame/ui/custui.cpp:896 msgid "Gray" -msgstr "" +msgstr "Grå" #: src/frontend/mame/ui/custui.cpp:897 msgid "Black" -msgstr "" +msgstr "Svart" #: src/frontend/mame/ui/custui.cpp:899 msgid "Orange" -msgstr "" +msgstr "Oransje" #: src/frontend/mame/ui/custui.cpp:900 msgid "Yellow" -msgstr "" +msgstr "Gul" #: src/frontend/mame/ui/custui.cpp:903 msgid "Violet" -msgstr "" +msgstr "Fiolett" #: src/frontend/mame/ui/submenu.cpp:22 msgid "Miscellaneous Options" -msgstr "" +msgstr "Diverse innstillinger" #: src/frontend/mame/ui/submenu.cpp:23 msgid "Re-select last machine played" -msgstr "" +msgstr "Gjenvelg den senest spilte maskinen" #: src/frontend/mame/ui/submenu.cpp:24 msgid "Enlarge images in the right panel" -msgstr "" +msgstr "Forstørr bildene i panelet til høyre" #: src/frontend/mame/ui/submenu.cpp:26 msgid "Show mouse pointer" -msgstr "" +msgstr "Vis musepekeren" #: src/frontend/mame/ui/submenu.cpp:27 msgid "Confirm quit from machines" -msgstr "" +msgstr "Bekreft at maskiner skal lukkes" #: src/frontend/mame/ui/submenu.cpp:28 msgid "Skip information screen at startup" -msgstr "" +msgstr "Vis informasjonsskjerm ved oppstart" #: src/frontend/mame/ui/submenu.cpp:29 msgid "Force 4:3 aspect for snapshot display" -msgstr "" +msgstr "Tving frem 4:3-forhold for skjermklippvisning" #: src/frontend/mame/ui/submenu.cpp:30 msgid "Use image as background" -msgstr "" +msgstr "Bruk bilde som bakgrunn" #: src/frontend/mame/ui/submenu.cpp:31 msgid "Skip BIOS selection menu" -msgstr "" +msgstr "Hopp over BIOS-valgmenyen" #: src/frontend/mame/ui/submenu.cpp:32 msgid "Skip software parts selection menu" -msgstr "" +msgstr "Hopp over maskinvaredel-valgmenyen" #: src/frontend/mame/ui/submenu.cpp:33 msgid "Info auto audit" -msgstr "" +msgstr "Autoundersøk info" #: src/frontend/mame/ui/submenu.cpp:34 msgid "Hide romless machine from available list" -msgstr "" +msgstr "Skjul ROM-løse maskiner fra Tilgjengelig-listen" #: src/frontend/mame/ui/submenu.cpp:38 msgid "Advanced Options" -msgstr "" +msgstr "Avanserte innstillinger" #: src/frontend/mame/ui/submenu.cpp:39 msgid "Performance Options" -msgstr "" +msgstr "Ytelsesinnstillinger" #: src/frontend/mame/ui/submenu.cpp:40 msgid "Auto frame skip" -msgstr "" +msgstr "Auto-hopping over rammer" #: src/frontend/mame/ui/submenu.cpp:41 msgid "Frame skip" -msgstr "" +msgstr "Hopp over rammer" #: src/frontend/mame/ui/submenu.cpp:42 msgid "Throttle" -msgstr "" +msgstr "Flaskehals" #: src/frontend/mame/ui/submenu.cpp:43 msgid "Sleep" -msgstr "" +msgstr "Sov" #: src/frontend/mame/ui/submenu.cpp:44 msgid "Speed" -msgstr "" +msgstr "Fart" #: src/frontend/mame/ui/submenu.cpp:45 msgid "Refresh speed" -msgstr "" +msgstr "Oppfriskningsfart" #: src/frontend/mame/ui/submenu.cpp:47 msgid "Rotation Options" -msgstr "" +msgstr "Roteringsinnstillinger" #: src/frontend/mame/ui/submenu.cpp:49 msgid "Rotate right" -msgstr "" +msgstr "Roter til høyre" #: src/frontend/mame/ui/submenu.cpp:50 msgid "Rotate left" -msgstr "" +msgstr "Roter til venstre" #: src/frontend/mame/ui/submenu.cpp:51 msgid "Auto rotate right" -msgstr "" +msgstr "Auto-roter til høyre" #: src/frontend/mame/ui/submenu.cpp:52 msgid "Auto rotate left" -msgstr "" +msgstr "Auto-roter til venstre" #: src/frontend/mame/ui/submenu.cpp:53 msgid "Flip X" -msgstr "" +msgstr "Snu X" #: src/frontend/mame/ui/submenu.cpp:54 msgid "Flip Y" -msgstr "" +msgstr "Snu Y" #: src/frontend/mame/ui/submenu.cpp:56 msgid "Artwork Options" -msgstr "" +msgstr "Kunstverkinnstillinger" #: src/frontend/mame/ui/submenu.cpp:57 msgid "Artwork Crop" -msgstr "" +msgstr "Kunstverkbeskjæring" #: src/frontend/mame/ui/submenu.cpp:58 msgid "Use Backdrops" -msgstr "" +msgstr "Bruk bakgrunner" #: src/frontend/mame/ui/submenu.cpp:59 msgid "Use Overlays" -msgstr "" +msgstr "Bruk overlegg" #: src/frontend/mame/ui/submenu.cpp:60 msgid "Use Bezels" -msgstr "" +msgstr "Bruk bezeler" #: src/frontend/mame/ui/submenu.cpp:61 msgid "Use Control Panels" -msgstr "" +msgstr "Bruk kontrollpaneler" #: src/frontend/mame/ui/submenu.cpp:62 msgid "Use Marquees" -msgstr "" +msgstr "Bruk markier" #: src/frontend/mame/ui/submenu.cpp:64 msgid "State/Playback Options" -msgstr "" +msgstr "Tilstands-/Tilbakespillings-innstillinger" #: src/frontend/mame/ui/submenu.cpp:65 msgid "Automatic save/restore" -msgstr "" +msgstr "Automatisk lagring/gjenoppretting" #: src/frontend/mame/ui/submenu.cpp:67 msgid "Rewind capacity" -msgstr "" +msgstr "Tilbakespolingskapasitet" #: src/frontend/mame/ui/submenu.cpp:68 msgid "Bilinear snapshot" -msgstr "" +msgstr "Bilineær skjermklipp" #: src/frontend/mame/ui/submenu.cpp:69 msgid "Burn-in" -msgstr "" +msgstr "Innbrenning" #: src/frontend/mame/ui/submenu.cpp:71 msgid "Input Options" -msgstr "" +msgstr "Inndatainnstillinger" #: src/frontend/mame/ui/submenu.cpp:72 msgid "Coin lockout" -msgstr "" +msgstr "Myntutlåsing" #: src/frontend/mame/ui/submenu.cpp:73 msgid "Mouse" -msgstr "" +msgstr "Mus" #: src/frontend/mame/ui/submenu.cpp:74 msgid "Joystick" -msgstr "" +msgstr "Kontroller" #: src/frontend/mame/ui/submenu.cpp:75 msgid "Lightgun" -msgstr "" +msgstr "Lyspistol" #: src/frontend/mame/ui/submenu.cpp:76 msgid "Multi-keyboard" -msgstr "" +msgstr "Flere tastaturer" #: src/frontend/mame/ui/submenu.cpp:77 msgid "Multi-mouse" -msgstr "" +msgstr "Flere mus" #: src/frontend/mame/ui/submenu.cpp:78 msgid "Steadykey" -msgstr "" +msgstr "Stødigtast" #: src/frontend/mame/ui/submenu.cpp:79 msgid "UI active" -msgstr "" +msgstr "Grensesnitt aktivt" #: src/frontend/mame/ui/submenu.cpp:80 msgid "Offscreen reload" -msgstr "" +msgstr "Omlasting utenfor skjermen" #: src/frontend/mame/ui/submenu.cpp:81 msgid "Joystick deadzone" -msgstr "" +msgstr "Kontrollerdødsone" #: src/frontend/mame/ui/submenu.cpp:82 msgid "Joystick saturation" -msgstr "" +msgstr "Kontrollermetning" #: src/frontend/mame/ui/submenu.cpp:83 msgid "Natural keyboard" -msgstr "" +msgstr "Naturlig tastatur" #: src/frontend/mame/ui/submenu.cpp:84 msgid "Simultaneous contradictory" -msgstr "" +msgstr "Samtidige selvmotsigende" #: src/frontend/mame/ui/submenu.cpp:85 msgid "Coin impulse" -msgstr "" +msgstr "Myntimpuls" #: src/frontend/mame/ui/submenu.cpp:89 msgid "Device Mapping" -msgstr "" +msgstr "Enhetskontrollvalg" #: src/frontend/mame/ui/submenu.cpp:90 msgid "Lightgun Device Assignment" -msgstr "" +msgstr "Lyspistolenhets-tilegning" #: src/frontend/mame/ui/submenu.cpp:91 msgid "Trackball Device Assignment" -msgstr "" +msgstr "Rulleballenhets-tilegning" #: src/frontend/mame/ui/submenu.cpp:92 msgid "Pedal Device Assignment" -msgstr "" +msgstr "Pedalenhets-tilegning" #: src/frontend/mame/ui/submenu.cpp:93 msgid "Adstick Device Assignment" -msgstr "" +msgstr "Styrepinneenhets-tilegning" #: src/frontend/mame/ui/submenu.cpp:94 msgid "Paddle Device Assignment" -msgstr "" +msgstr "Flappeenhets-tilegning" #: src/frontend/mame/ui/submenu.cpp:95 msgid "Dial Device Assignment" -msgstr "" +msgstr "Nummerpanelenhets-tilegning" #: src/frontend/mame/ui/submenu.cpp:96 msgid "Positional Device Assignment" -msgstr "" +msgstr "Posisjoneringsenhets-tilegning" #: src/frontend/mame/ui/submenu.cpp:97 msgid "Mouse Device Assignment" -msgstr "" +msgstr "Museenhets-tilegning" #: src/frontend/mame/ui/submenu.cpp:102 msgid "Video Mode" -msgstr "" +msgstr "Videomodus" #: src/frontend/mame/ui/submenu.cpp:103 msgid "Number Of Screens" -msgstr "" +msgstr "Antall skjermer" #: src/frontend/mame/ui/submenu.cpp:105 msgid "Triple Buffering" -msgstr "" +msgstr "Trippelbufring" #: src/frontend/mame/ui/submenu.cpp:106 msgid "HLSL" -msgstr "" +msgstr "HLSL" #: src/frontend/mame/ui/submenu.cpp:108 msgid "GLSL" -msgstr "" +msgstr "GLSL" #: src/frontend/mame/ui/submenu.cpp:109 msgid "Bilinear Filtering" -msgstr "" +msgstr "Bilineær filtrering" #: src/frontend/mame/ui/submenu.cpp:110 msgid "Bitmap Prescaling" -msgstr "" +msgstr "Bitmap-førskalering" #: src/frontend/mame/ui/submenu.cpp:111 msgid "Window Mode" -msgstr "" +msgstr "Vindusmodus" #: src/frontend/mame/ui/submenu.cpp:112 msgid "Enforce Aspect Ratio" -msgstr "" +msgstr "Tving frem visningsforhold" #: src/frontend/mame/ui/submenu.cpp:113 msgid "Start Out Maximized" -msgstr "" +msgstr "Start i maksimalisert modus" #: src/frontend/mame/ui/submenu.cpp:114 msgid "Synchronized Refresh" -msgstr "" +msgstr "Synkronisert oppfriskning" #: src/frontend/mame/ui/submenu.cpp:115 msgid "Wait Vertical Sync" -msgstr "" +msgstr "Avvent V-synkro" #: src/frontend/mame/ui/state.cpp:388 msgid "Load State" -msgstr "" +msgstr "Last inn tilstand" #: src/frontend/mame/ui/state.cpp:388 msgid "Select position to load from" -msgstr "" +msgstr "Velg en posisjon å laste inn ifra" #: src/frontend/mame/ui/state.cpp:412 msgid "Save State" -msgstr "" +msgstr "Lagre tilstanden" #: src/frontend/mame/ui/state.cpp:412 msgid "Select position to save to" -msgstr "" +msgstr "Velg en posisjon å lagre til" #: src/frontend/mame/ui/slotopt.cpp:192 #, c-format msgid "%s [internal]" -msgstr "" +msgstr "%s [internt]" #: src/frontend/mame/ui/selgame.cpp:309 src/frontend/mame/ui/selsoft.cpp:211 #, c-format @@ -1601,6 +1657,8 @@ msgid "" "%s\n" " added to favorites list." msgstr "" +"%s\n" +" ble lagt til i favorittlisten." #: src/frontend/mame/ui/selgame.cpp:314 src/frontend/mame/ui/selgame.cpp:320 #: src/frontend/mame/ui/selsoft.cpp:216 @@ -1609,285 +1667,291 @@ msgid "" "%s\n" " removed from favorites list." msgstr "" +"%s\n" +" ble fjernet fra favorittlisten." #: src/frontend/mame/ui/selgame.cpp:437 msgid "Configure Machine" -msgstr "" +msgstr "Sett opp maskinen" #: src/frontend/mame/ui/selgame.cpp:849 #, c-format msgid "Romset\t%1$-.100s\n" -msgstr "" +msgstr "ROM-sett\t%1$-.100s\n" #: src/frontend/mame/ui/selgame.cpp:850 #, c-format msgid "Year\t%1$s\n" -msgstr "" +msgstr "År\t%1$s\n" #: src/frontend/mame/ui/selgame.cpp:851 #, c-format msgid "Manufacturer\t%1$-.100s\n" -msgstr "" +msgstr "Produsent\t%1$-.100s\n" #: src/frontend/mame/ui/selgame.cpp:855 #, c-format msgid "Driver is Clone of\t%1$-.100s\n" -msgstr "" +msgstr "Driveren er klone av\t%1$-.100s\n" #: src/frontend/mame/ui/selgame.cpp:857 msgid "Driver is Parent\t\n" -msgstr "" +msgstr "Driveren er overordnet\n" #: src/frontend/mame/ui/selgame.cpp:860 msgid "Analog Controls\tYes\n" -msgstr "" +msgstr "Analog styring\tJa\n" #: src/frontend/mame/ui/selgame.cpp:862 msgid "Keyboard Inputs\tYes\n" -msgstr "" +msgstr "Tastaturinndata\tJa\n" #: src/frontend/mame/ui/selgame.cpp:865 msgid "Overall\tNOT WORKING\n" -msgstr "" +msgstr "Alt i alt\tVIRKER IKKE\n" #: src/frontend/mame/ui/selgame.cpp:867 msgid "Overall\tUnemulated Protection\n" -msgstr "" +msgstr "Alt i alt\tUemulert beskyttelse\n" #: src/frontend/mame/ui/selgame.cpp:869 msgid "Overall\tWorking\n" -msgstr "" +msgstr "Alt i alt\tFungerer\n" #: src/frontend/mame/ui/selgame.cpp:872 msgid "Graphics\tUnimplemented\n" -msgstr "" +msgstr "Grafikk\tIkke implementer\n" #: src/frontend/mame/ui/selgame.cpp:874 msgid "Graphics\tWrong Colors\n" -msgstr "" +msgstr "Grafikk\tFeil farger\n" #: src/frontend/mame/ui/selgame.cpp:876 msgid "Graphics\tImperfect Colors\n" -msgstr "" +msgstr "Grafikk\tNoen fargeproblemer\n" #: src/frontend/mame/ui/selgame.cpp:878 msgid "Graphics\tImperfect\n" -msgstr "" +msgstr "Grafikk\tIkke perfekt\n" #: src/frontend/mame/ui/selgame.cpp:880 msgid "Graphics\tOK\n" -msgstr "" +msgstr "Grafikk\tOK\n" #: src/frontend/mame/ui/selgame.cpp:883 msgid "Sound\tNone\n" -msgstr "" +msgstr "Lyd\tIngen\n" #: src/frontend/mame/ui/selgame.cpp:885 msgid "Sound\tUnimplemented\n" -msgstr "" +msgstr "Lyd\tIkke implementer\n" #: src/frontend/mame/ui/selgame.cpp:887 msgid "Sound\tImperfect\n" -msgstr "" +msgstr "Lyd\tIkke perfekt\n" #: src/frontend/mame/ui/selgame.cpp:889 msgid "Sound\tOK\n" -msgstr "" +msgstr "Lyd\tOK\n" #: src/frontend/mame/ui/selgame.cpp:892 msgid "Controls\tUnimplemented\n" -msgstr "" +msgstr "Kontrollere\tIkke implementert\n" #: src/frontend/mame/ui/selgame.cpp:894 msgid "Controls\tImperfect\n" -msgstr "" +msgstr "Kontrollere\tIkke perfekt\n" #: src/frontend/mame/ui/selgame.cpp:897 msgid "Keyboard\tUnimplemented\n" -msgstr "" +msgstr "Tastatur\tIkke implementert\n" #: src/frontend/mame/ui/selgame.cpp:899 msgid "Keyboard\tImperfect\n" -msgstr "" +msgstr "Tastatur\tIkke perfekt\n" #: src/frontend/mame/ui/selgame.cpp:902 msgid "Mouse\tUnimplemented\n" -msgstr "" +msgstr "Mus\tIkke implementert\n" #: src/frontend/mame/ui/selgame.cpp:904 msgid "Mouse\tImperfect\n" -msgstr "" +msgstr "Mus\tIkke perfekt\n" #: src/frontend/mame/ui/selgame.cpp:907 msgid "Microphone\tUnimplemented\n" -msgstr "" +msgstr "Mikrofon\tIkke implementert\n" #: src/frontend/mame/ui/selgame.cpp:909 msgid "Microphone\tImperfect\n" -msgstr "" +msgstr "Mikrofon\tIkke perfekt\n" #: src/frontend/mame/ui/selgame.cpp:912 msgid "Camera\tUnimplemented\n" -msgstr "" +msgstr "Kamera\tIkke implementert\n" #: src/frontend/mame/ui/selgame.cpp:914 msgid "Camera\tImperfect\n" -msgstr "" +msgstr "Kamera\tIkke perfekt\n" #: src/frontend/mame/ui/selgame.cpp:917 msgid "Disk\tUnimplemented\n" -msgstr "" +msgstr "Disk\tIkke implementert\n" #: src/frontend/mame/ui/selgame.cpp:919 msgid "Disk\tImperfect\n" -msgstr "" +msgstr "Disk\tIkke perfekt\n" #: src/frontend/mame/ui/selgame.cpp:922 msgid "Printer\tUnimplemented\n" -msgstr "" +msgstr "Skriver\tIkke implementert\n" #: src/frontend/mame/ui/selgame.cpp:924 msgid "Printer\tImperfect\n" -msgstr "" +msgstr "Skriver\tIkke perfekt\n" #: src/frontend/mame/ui/selgame.cpp:927 msgid "LAN\tUnimplemented\n" -msgstr "" +msgstr "LAN\tIkke implementert\n" #: src/frontend/mame/ui/selgame.cpp:929 msgid "LAN\tImperfect\n" -msgstr "" +msgstr "LAN\tIkke perfekt\n" #: src/frontend/mame/ui/selgame.cpp:932 msgid "WAN\tUnimplemented\n" -msgstr "" +msgstr "WAN\tIkke implementert\n" #: src/frontend/mame/ui/selgame.cpp:934 msgid "WAN\tImperfect\n" -msgstr "" +msgstr "WAN\tIkke perfekt\n" #: src/frontend/mame/ui/selgame.cpp:937 msgid "Timing\tUnimplemented\n" -msgstr "" +msgstr "Timing\tIkke implementert\n" #: src/frontend/mame/ui/selgame.cpp:939 msgid "Timing\tImperfect\n" -msgstr "" +msgstr "Timing\tIkke perfekt\n" #: src/frontend/mame/ui/selgame.cpp:941 msgid "Mechanical Machine\tYes\n" -msgstr "" +msgstr "Mekanisk maskin\tJa\n" #: src/frontend/mame/ui/selgame.cpp:941 msgid "Mechanical Machine\tNo\n" -msgstr "" +msgstr "Mekanisk maskin\tNei\n" #: src/frontend/mame/ui/selgame.cpp:942 msgid "Requires Artwork\tYes\n" -msgstr "" +msgstr "Krever kunstverk\tJa\n" #: src/frontend/mame/ui/selgame.cpp:942 msgid "Requires Artwork\tNo\n" -msgstr "" +msgstr "Krever kunstverk\tNei\n" #: src/frontend/mame/ui/selgame.cpp:943 msgid "Requires Clickable Artwork\tYes\n" -msgstr "" +msgstr "Krever klikkbare kunstverk\tJa\n" #: src/frontend/mame/ui/selgame.cpp:943 msgid "Requires Clickable Artwork\tNo\n" -msgstr "" +msgstr "Krever klikkbare kunstverk\tNei\n" #: src/frontend/mame/ui/selgame.cpp:944 msgid "Support Cocktail\tYes\n" -msgstr "" +msgstr "Støtter Cocktail\tJa\n" #: src/frontend/mame/ui/selgame.cpp:944 msgid "Support Cocktail\tNo\n" -msgstr "" +msgstr "Støtter Cocktail\tNei\n" #: src/frontend/mame/ui/selgame.cpp:945 msgid "Driver is BIOS\tYes\n" -msgstr "" +msgstr "Driveren er BIOS\tJa\n" #: src/frontend/mame/ui/selgame.cpp:945 msgid "Driver is BIOS\tNo\n" -msgstr "" +msgstr "Driveren er BIOS\tNei\n" #: src/frontend/mame/ui/selgame.cpp:946 msgid "Support Save\tYes\n" -msgstr "" +msgstr "Støtter lagring\tJa\n" #: src/frontend/mame/ui/selgame.cpp:946 msgid "Support Save\tNo\n" -msgstr "" +msgstr "Støtter lagring\tNei\n" #: src/frontend/mame/ui/selgame.cpp:947 msgid "Screen Orientation\tVertical\n" -msgstr "" +msgstr "Skjermposisjonering\tLoddrett\n" #: src/frontend/mame/ui/selgame.cpp:947 msgid "Screen Orientation\tHorizontal\n" -msgstr "" +msgstr "Skjermposisjonering\tVannrett\n" #: src/frontend/mame/ui/selgame.cpp:957 msgid "Requires CHD\tYes\n" -msgstr "" +msgstr "Krever CHD\tJa\n" #: src/frontend/mame/ui/selgame.cpp:957 msgid "Requires CHD\tNo\n" -msgstr "" +msgstr "Krever CHD\tNei\n" #: src/frontend/mame/ui/selgame.cpp:970 msgid "ROM Audit Result\tOK\n" -msgstr "" +msgstr "ROM-undersøkelsesresultat\tOK\n" #: src/frontend/mame/ui/selgame.cpp:972 msgid "ROM Audit Result\tBAD\n" -msgstr "" +msgstr "ROM-undersøkelsesresultat\tDÅRLIG\n" #: src/frontend/mame/ui/selgame.cpp:975 msgid "Samples Audit Result\tNone Needed\n" -msgstr "" +msgstr "Samplingsundersøkelsesresultat\tIkke nødvendig\n" #: src/frontend/mame/ui/selgame.cpp:977 msgid "Samples Audit Result\tOK\n" msgstr "" +"Samplingsundersøkelsesresultat\n" +"OK\n" #: src/frontend/mame/ui/selgame.cpp:979 msgid "Samples Audit Result\tBAD\n" -msgstr "" +msgstr "Samplingsundersøkelsesresultat\tDÅRLIG\n" #: src/frontend/mame/ui/selgame.cpp:983 msgid "" "ROM Audit \tDisabled\n" "Samples Audit \tDisabled\n" msgstr "" +"ROM-undersøkelse \tSkrudd av\n" +"Samplingsundersøkelse \tSkrudd av\n" #: src/frontend/mame/ui/selgame.cpp:1167 #, c-format msgid "%1$s %2$s ( %3$d / %4$d machines (%5$d BIOS) )" -msgstr "" +msgstr "%1$s %2$s ( %3$d / %4$d maskiner (%5$d BIOS) )" #: src/frontend/mame/ui/selgame.cpp:1183 src/frontend/mame/ui/selsoft.cpp:555 #, c-format msgid "%1$s: %2$s - Search: %3$s_" -msgstr "" +msgstr "%1$s: %2$s - Søk: %3$s_" #: src/frontend/mame/ui/selgame.cpp:1185 src/frontend/mame/ui/selsoft.cpp:557 #, c-format msgid "Search: %1$s_" -msgstr "" +msgstr "Søk: %1$s_" #: src/frontend/mame/ui/selgame.cpp:1195 #, c-format msgid "Romset: %1$-.100s" -msgstr "" +msgstr "ROM-sett: %1$-.100s" #: src/frontend/mame/ui/selgame.cpp:1202 #, c-format msgid "System: %1$-.100s" -msgstr "" +msgstr "System: %1$-.100s" #: src/frontend/mame/ui/selgame.cpp:1239 msgid "" @@ -1895,187 +1959,190 @@ msgid "" "Please select a different machine.\n" "\n" msgstr "" +"Den valgte maskinen mangler én eller flere påkrevde ROM- eller CHD-bilder. " +"Vennligst velg en annen maskin.\n" +"\n" #: src/frontend/mame/ui/selgame.cpp:1245 src/frontend/mame/ui/selsoft.cpp:462 msgid "Press any key to continue." -msgstr "" +msgstr "Trykk på enhver knapp for å fortsette." #: src/frontend/mame/ui/sndmenu.cpp:135 msgid "Sound" -msgstr "" +msgstr "Lyd" #: src/frontend/mame/ui/sndmenu.cpp:136 msgid "Sample Rate" -msgstr "" +msgstr "Samplingsfrekvens" #: src/frontend/mame/ui/sndmenu.cpp:137 msgid "Use External Samples" -msgstr "" +msgstr "Bruk eksterne samplinger" #: src/frontend/mame/ui/utils.cpp:57 src/frontend/mame/ui/utils.cpp:81 msgid "Unfiltered" -msgstr "" +msgstr "Ufiltrert" #: src/frontend/mame/ui/utils.cpp:58 src/frontend/mame/ui/utils.cpp:82 msgid "Available" -msgstr "" +msgstr "Tilgjengelig" #: src/frontend/mame/ui/utils.cpp:59 src/frontend/mame/ui/utils.cpp:83 msgid "Unavailable" -msgstr "" +msgstr "Utilgjengelig" #: src/frontend/mame/ui/utils.cpp:60 msgid "Working" -msgstr "" +msgstr "Fungerer" #: src/frontend/mame/ui/utils.cpp:61 msgid "Not Working" -msgstr "" +msgstr "Virker ikke" #: src/frontend/mame/ui/utils.cpp:62 msgid "Mechanical" -msgstr "" +msgstr "Mekanisk" #: src/frontend/mame/ui/utils.cpp:63 msgid "Not Mechanical" -msgstr "" +msgstr "Ikke mekanisk" #: src/frontend/mame/ui/utils.cpp:64 msgid "Category" -msgstr "" +msgstr "Kategori" #: src/frontend/mame/ui/utils.cpp:65 msgid "Favorites" -msgstr "" +msgstr "Favoritter" #: src/frontend/mame/ui/utils.cpp:67 msgid "Not BIOS" -msgstr "" +msgstr "Ikke BIOS" #: src/frontend/mame/ui/utils.cpp:68 src/frontend/mame/ui/utils.cpp:84 msgid "Parents" -msgstr "" +msgstr "Overordnede" #: src/frontend/mame/ui/utils.cpp:69 src/frontend/mame/ui/utils.cpp:85 msgid "Clones" -msgstr "" +msgstr "Kloner" #: src/frontend/mame/ui/utils.cpp:70 msgid "Manufacturer" -msgstr "" +msgstr "Produsent" #: src/frontend/mame/ui/utils.cpp:71 src/frontend/mame/ui/utils.cpp:86 msgid "Year" -msgstr "" +msgstr "År" #: src/frontend/mame/ui/utils.cpp:72 msgid "Save Supported" -msgstr "" +msgstr "Lagring er støttet" #: src/frontend/mame/ui/utils.cpp:73 msgid "Save Unsupported" -msgstr "" +msgstr "Lagring er ikke støttet" #: src/frontend/mame/ui/utils.cpp:74 msgid "CHD Required" -msgstr "" +msgstr "CHD er påkrevd" #: src/frontend/mame/ui/utils.cpp:75 msgid "No CHD Required" -msgstr "" +msgstr "Ingen CHD er påkrevd" #: src/frontend/mame/ui/utils.cpp:76 msgid "Vertical Screen" -msgstr "" +msgstr "Loddrett skjerm" #: src/frontend/mame/ui/utils.cpp:77 msgid "Horizontal Screen" -msgstr "" +msgstr "Vannrett skjerm" #: src/frontend/mame/ui/utils.cpp:78 src/frontend/mame/ui/utils.cpp:94 msgid "Custom Filter" -msgstr "" +msgstr "Tilpasset filter" #: src/frontend/mame/ui/utils.cpp:87 msgid "Publisher" -msgstr "" +msgstr "Publiserer" #: src/frontend/mame/ui/utils.cpp:88 msgid "Supported" -msgstr "" +msgstr "Støttet" #: src/frontend/mame/ui/utils.cpp:89 msgid "Partially Supported" -msgstr "" +msgstr "Delvis støttet" #: src/frontend/mame/ui/utils.cpp:90 msgid "Unsupported" -msgstr "" +msgstr "Ikke støttet" #: src/frontend/mame/ui/utils.cpp:91 msgid "Release Region" -msgstr "" +msgstr "Lanseringsregion" #: src/frontend/mame/ui/utils.cpp:92 msgid "Device Type" -msgstr "" +msgstr "Enhetstype" #: src/frontend/mame/ui/utils.cpp:93 msgid "Software List" -msgstr "" +msgstr "Programvareliste" #: src/frontend/mame/ui/utils.cpp:244 msgid "<set up filters>" -msgstr "" +msgstr "<Sett opp filtre>" #: src/frontend/mame/ui/utils.cpp:352 msgid "Select custom filters:" -msgstr "" +msgstr "Velg tilpassede filtre:" #: src/frontend/mame/ui/utils.cpp:503 #, c-format msgid "Filter %1$u" -msgstr "" +msgstr "Filtrer %1$u" #: src/frontend/mame/ui/utils.cpp:518 msgid "Remove last filter" -msgstr "" +msgstr "Fjern det forrige filteret" #: src/frontend/mame/ui/utils.cpp:520 msgid "Add filter" -msgstr "" +msgstr "Legg til et filter" #: src/frontend/mame/ui/utils.cpp:959 msgid "Select category:" -msgstr "" +msgstr "Velg kategori:" #: src/frontend/mame/ui/utils.cpp:990 msgid "[no category INI files]" -msgstr "" +msgstr "[ingen kategori-INI-filer]" #: src/frontend/mame/ui/utils.cpp:998 msgid "[no groups in INI file]" -msgstr "" +msgstr "[ingen grupper i INI-filen]" #: src/frontend/mame/ui/utils.cpp:1032 msgid "No category INI files found" -msgstr "" +msgstr "Ingen kategori-INI-filer ble funnet" #: src/frontend/mame/ui/utils.cpp:1037 msgid "File" -msgstr "" +msgstr "Fil" #: src/frontend/mame/ui/utils.cpp:1041 msgid "No groups found in category file" -msgstr "" +msgstr "Ingen grupper ble funnet i kategorifilen" #: src/frontend/mame/ui/utils.cpp:1046 msgid "Group" -msgstr "" +msgstr "Gruppe" #: src/frontend/mame/ui/utils.cpp:1047 msgid "Include clones" -msgstr "" +msgstr "Inkluder kloner" #: src/frontend/mame/ui/selsoft.cpp:456 msgid "" @@ -2083,71 +2150,76 @@ msgid "" "different software.\n" "\n" msgstr "" +"Den valgte programvaren mangler én eller flere påkrevde filer. Vennligst " +"velg en annen programver.\n" +"\n" #: src/frontend/mame/ui/selsoft.cpp:549 #, c-format msgid "%1$s %2$s ( %3$d / %4$d software packages )" -msgstr "" +msgstr "%1$s %2$s ( %3$d / %4$d programvarepakker )" #: src/frontend/mame/ui/selsoft.cpp:550 #, c-format msgid "Driver: \"%1$s\" software list " -msgstr "" +msgstr "Driver: «%1$s»-programvareliste " #: src/frontend/mame/ui/filesel.cpp:260 msgid "[create]" -msgstr "" +msgstr "[opprett]" #: src/frontend/mame/ui/filesel.cpp:419 #, c-format msgid "Error accessing %s" -msgstr "" +msgstr "Feil med å få tilgang til %s" #: src/frontend/mame/ui/filesel.cpp:515 msgid "Select access mode" -msgstr "" +msgstr "Velg tilgangsmodus" #: src/frontend/mame/ui/filesel.cpp:516 msgid "Read-only" -msgstr "" +msgstr "Skrivebeskyttet" #: src/frontend/mame/ui/filesel.cpp:518 msgid "Read-write" -msgstr "" +msgstr "Skriv og les" #: src/frontend/mame/ui/filesel.cpp:519 msgid "Read this image, write to another image" -msgstr "" +msgstr "Les inn dette bildet, skriv til et annet bilde" #: src/frontend/mame/ui/filesel.cpp:520 msgid "Read this image, write to diff" -msgstr "" +msgstr "Les dette bildet, skriv til diff" #: src/frontend/mame/ui/imgcntrl.cpp:117 msgid "Cannot save over directory" -msgstr "" +msgstr "Kan ikke lagre over mappen" #: src/frontend/mame/ui/imgcntrl.cpp:150 msgid "" "The software selected is missing one or more required ROM or CHD images. " "Please select a different one." msgstr "" +"Programvaren som er valgt, mangler én eller flere påkrevde ROM- eller CHD-" +"filer. Vennligst velg en annen en." #: src/frontend/mame/ui/menu.cpp:294 msgid "Return to Machine" -msgstr "" +msgstr "Tilbake til maskinen" #: src/frontend/mame/ui/menu.cpp:299 src/frontend/mame/ui/menu.cpp:301 msgid "Exit" -msgstr "" +msgstr "Avslutt" #: src/frontend/mame/ui/menu.cpp:306 src/frontend/mame/ui/menu.cpp:308 msgid "Return to Previous Menu" -msgstr "" +msgstr "Gå tilbake til forrige meny" #: src/frontend/mame/ui/menu.cpp:742 msgid "Auto" -msgstr "" +msgstr "Auto" #: src/frontend/mame/ui/cheatopt.cpp:92 plugins/cheat/init.lua:653 #, c-format, lua-format @@ -2155,66 +2227,69 @@ msgid "" "Cheat Comment:\n" "%s" msgstr "" +"Juksekodekommentar:\n" +"%s" #: src/frontend/mame/ui/cheatopt.cpp:105 msgid "All cheats reloaded" -msgstr "" +msgstr "Alle juksekoder er gjeninnlastet" #: src/frontend/mame/ui/cheatopt.cpp:136 msgid "Autofire Settings" -msgstr "" +msgstr "Autoskyteinnstillinger" #: src/frontend/mame/ui/cheatopt.cpp:157 plugins/cheat/init.lua:581 msgid "Reset All" -msgstr "" +msgstr "Tilbakestill alle" #: src/frontend/mame/ui/cheatopt.cpp:160 plugins/cheat/init.lua:582 msgid "Reload All" -msgstr "" +msgstr "Last inn alle på nytt" #: src/frontend/mame/ui/cheatopt.cpp:273 msgid "Autofire Status" -msgstr "" +msgstr "Autoskytestatus" #: src/frontend/mame/ui/cheatopt.cpp:316 msgid "No buttons found on this machine!" -msgstr "" +msgstr "Ingen knapper ble funnet på denne maskinen!" #: src/frontend/mame/ui/cheatopt.cpp:327 src/frontend/mame/ui/cheatopt.cpp:331 msgid "Autofire Delay" -msgstr "" +msgstr "Autoskyteforsinkelse" #: src/frontend/mame/ui/ui.cpp:337 msgid "This driver requires images to be loaded in the following device(s): " msgstr "" +"Denne driveren krever at bilder lastes inn i de(n) følgende enhet(en): " #: src/frontend/mame/ui/ui.cpp:1084 src/frontend/mame/ui/ui.cpp:1094 msgid "Keyboard Emulation Status" -msgstr "" +msgstr "Tastaturemuleringsstatus" #: src/frontend/mame/ui/ui.cpp:1086 msgid "Mode: PARTIAL Emulation" -msgstr "" +msgstr "Modus: DELVIS emulering" #: src/frontend/mame/ui/ui.cpp:1087 msgid "UI: Enabled" -msgstr "" +msgstr "Grensesnitt: Skrudd på" #: src/frontend/mame/ui/ui.cpp:1089 src/frontend/mame/ui/ui.cpp:1099 msgid "**Use ScrLock to toggle**" -msgstr "" +msgstr "**Bruk ScrLock for å skru av/på**" #: src/frontend/mame/ui/ui.cpp:1096 msgid "Mode: FULL Emulation" -msgstr "" +msgstr "Modus: FULL emulering" #: src/frontend/mame/ui/ui.cpp:1097 msgid "UI: Disabled" -msgstr "" +msgstr "Grensesnitt: Skrudd av" #: src/frontend/mame/ui/ui.cpp:1249 msgid "Autofire can't be enabled" -msgstr "" +msgstr "Autoskyting kan ikke bli aktivert" #: src/frontend/mame/ui/ui.cpp:1302 #, c-format @@ -2224,139 +2299,143 @@ msgid "" "Press ''%1$s'' to quit,\n" "Press ''%2$s'' to return to emulation." msgstr "" +"Er du sikker på at du vil avslutte?\n" +"\n" +"Trykk «%1$s» for å avslutte,\n" +"Trykk «%2$s» for å gå tilbake til emuleringen." #: src/frontend/mame/ui/ui.cpp:1374 msgid "Master Volume" -msgstr "" +msgstr "Hovedvolum" #: src/frontend/mame/ui/ui.cpp:1383 #, c-format msgid "%1$s Volume" -msgstr "" +msgstr "%1$s volum" #: src/frontend/mame/ui/ui.cpp:1407 #, c-format msgid "Overclock CPU %1$s" -msgstr "" +msgstr "Overklokk CPU %1$s" #: src/frontend/mame/ui/ui.cpp:1416 #, c-format msgid "Overclock %1$s sound" -msgstr "" +msgstr "Overklokk %1$s-lyd" #: src/frontend/mame/ui/ui.cpp:1437 #, c-format msgid "%1$s Refresh Rate" -msgstr "" +msgstr "%1$s-oppfriskningsfrekvens" #: src/frontend/mame/ui/ui.cpp:1442 #, c-format msgid "%1$s Brightness" -msgstr "" +msgstr "%1$s lysstyrke" #: src/frontend/mame/ui/ui.cpp:1444 #, c-format msgid "%1$s Contrast" -msgstr "" +msgstr "%1$s kontrast" #: src/frontend/mame/ui/ui.cpp:1446 #, c-format msgid "%1$s Gamma" -msgstr "" +msgstr "%1$s gamma" #: src/frontend/mame/ui/ui.cpp:1450 #, c-format msgid "%1$s Horiz Stretch" -msgstr "" +msgstr "%1$s vannrett strekk" #: src/frontend/mame/ui/ui.cpp:1452 #, c-format msgid "%1$s Horiz Position" -msgstr "" +msgstr "%1$s vannrett posisjon" #: src/frontend/mame/ui/ui.cpp:1454 #, c-format msgid "%1$s Vert Stretch" -msgstr "" +msgstr "%1$s loddrett strekk" #: src/frontend/mame/ui/ui.cpp:1456 #, c-format msgid "%1$s Vert Position" -msgstr "" +msgstr "%1$s loddrett posisjon" #: src/frontend/mame/ui/ui.cpp:1475 #, c-format msgid "Laserdisc '%1$s' Horiz Stretch" -msgstr "" +msgstr "Laserdisc %1$s vannrett strekk" #: src/frontend/mame/ui/ui.cpp:1477 #, c-format msgid "Laserdisc '%1$s' Horiz Position" -msgstr "" +msgstr "Laserdisc %1$s vannrett posisjon" #: src/frontend/mame/ui/ui.cpp:1479 #, c-format msgid "Laserdisc '%1$s' Vert Stretch" -msgstr "" +msgstr "Laserdisc %1$s loddrett strekk" #: src/frontend/mame/ui/ui.cpp:1481 #, c-format msgid "Laserdisc '%1$s' Vert Position" -msgstr "" +msgstr "Laserdisc %1$s loddrett posisjon" #: src/frontend/mame/ui/ui.cpp:1493 msgid "Vector Flicker" -msgstr "" +msgstr "Vektorflimring" #: src/frontend/mame/ui/ui.cpp:1494 msgid "Beam Width Minimum" -msgstr "" +msgstr "Minimum strålebredde" #: src/frontend/mame/ui/ui.cpp:1495 msgid "Beam Width Maximum" -msgstr "" +msgstr "Maks strålebredde" #: src/frontend/mame/ui/ui.cpp:1496 msgid "Beam Intensity Weight" -msgstr "" +msgstr "Stråleintensitetsvekt" #: src/frontend/mame/ui/ui.cpp:1511 #, c-format msgid "Crosshair Scale %1$s" -msgstr "" +msgstr "Siktehårskala %1$s" #: src/frontend/mame/ui/ui.cpp:1511 src/frontend/mame/ui/ui.cpp:1513 msgid "X" -msgstr "" +msgstr "X" #: src/frontend/mame/ui/ui.cpp:1511 src/frontend/mame/ui/ui.cpp:1513 msgid "Y" -msgstr "" +msgstr "Y" #: src/frontend/mame/ui/ui.cpp:1513 #, c-format msgid "Crosshair Offset %1$s" -msgstr "" +msgstr "Siktehåravvik %1$s" #: src/frontend/mame/ui/ui.cpp:1601 #, c-format msgid "%1$3ddB" -msgstr "" +msgstr "%1$3ddB" #: src/frontend/mame/ui/ui.cpp:1645 #, c-format msgid "%1$d%%" -msgstr "" +msgstr "%1$d%%" #: src/frontend/mame/ui/ui.cpp:1661 #, c-format msgid "%1$3.0f%%" -msgstr "" +msgstr "%1$3.0f%%" #: src/frontend/mame/ui/ui.cpp:1685 #, c-format msgid "%1$.3ffps" -msgstr "" +msgstr "%1$.3ffps" #: src/frontend/mame/ui/ui.cpp:1708 src/frontend/mame/ui/ui.cpp:1730 #: src/frontend/mame/ui/ui.cpp:1751 src/frontend/mame/ui/ui.cpp:1773 @@ -2366,50 +2445,50 @@ msgstr "" #: src/frontend/mame/ui/ui.cpp:1927 #, c-format msgid "%1$.3f" -msgstr "" +msgstr "%1$.3f" #: src/frontend/mame/ui/ui.cpp:1942 src/frontend/mame/ui/ui.cpp:1957 #: src/frontend/mame/ui/ui.cpp:1972 src/frontend/mame/ui/ui.cpp:1987 #, c-format msgid "%1$1.2f" -msgstr "" +msgstr "%1$1.2f" #: src/frontend/mame/ui/ui.cpp:2005 #, c-format msgid "Crosshair Scale X %1$1.3f" -msgstr "" +msgstr "Siktehårskala X %1$1.3f" #: src/frontend/mame/ui/ui.cpp:2005 #, c-format msgid "Crosshair Scale Y %1$1.3f" -msgstr "" +msgstr "Siktehårskala Y %1$1.3f" #: src/frontend/mame/ui/ui.cpp:2024 #, c-format msgid "Crosshair Offset X %1$1.3f" -msgstr "" +msgstr "Siktehåravvik X %1$1.3f" #: src/frontend/mame/ui/ui.cpp:2024 #, c-format msgid "Crosshair Offset Y %1$1.3f" -msgstr "" +msgstr "Siktehåravvik Y %1$1.3f" #: src/frontend/mame/ui/ui.cpp:2167 msgid "**Error saving ui.ini**" -msgstr "" +msgstr "**Feil under lagring av ui.ini**" #: src/frontend/mame/ui/ui.cpp:2226 #, c-format msgid "**Error saving %s.ini**" -msgstr "" +msgstr "Feil under lagring av %s.ini**" #: src/frontend/mame/ui/viewgfx.cpp:406 msgid " COLORS" -msgstr "" +msgstr " FARGER" #: src/frontend/mame/ui/viewgfx.cpp:406 msgid " PENS" -msgstr "" +msgstr " PENNER" #: src/frontend/mame/ui/devopt.cpp:39 #, c-format @@ -2421,6 +2500,12 @@ msgid "" "\n" "The selected option enables the following items:\n" msgstr "" +"[Denne innstillingen er for øyeblikket påmontert i det kjørende systemet\n" +"\n" +"Innstilling: %1$s\n" +"Enhet: %2$s\n" +"\n" +"Den valgte innstillingen skrur på de følgende gjenstandene:\n" #: src/frontend/mame/ui/devopt.cpp:40 #, c-format @@ -2432,59 +2517,67 @@ msgid "" "\n" "If you select this option, the following items will be enabled:\n" msgstr "" +"[Denne innstillingen er for øyeblikket IKKE påmontert i det kjørende " +"systemet\n" +"\n" +"Innstilling: %1$s\n" +"Enhet: %2$s\n" +"\n" +"Hvis du velger denne innstillingen, vil de følgende gjenstandene bli skrudd " +"på:\n" #: src/frontend/mame/ui/devopt.cpp:48 msgid "* CPU:\n" -msgstr "" +msgstr "* Prosessor:\n" #: src/frontend/mame/ui/devopt.cpp:72 src/frontend/mame/ui/devopt.cpp:133 #, c-format msgid " %1$d×%2$s %3$d.%4$06d MHz\n" -msgstr "" +msgstr " %1$d×%2$s %3$d.%4$06d MHz\n" #: src/frontend/mame/ui/devopt.cpp:72 src/frontend/mame/ui/devopt.cpp:133 msgid " %1$d×%2$s %5$d.%6$03d kHz\n" -msgstr "" +msgstr " %1$d×%2$s %5$d.%6$03d kHz\n" #: src/frontend/mame/ui/devopt.cpp:73 src/frontend/mame/ui/devopt.cpp:134 msgid " %2$s %3$d.%4$06d MHz\n" -msgstr "" +msgstr " %2$s %3$d.%4$06d MHz\n" #: src/frontend/mame/ui/devopt.cpp:73 src/frontend/mame/ui/devopt.cpp:134 msgid " %2$s %5$d.%6$03d kHz\n" -msgstr "" +msgstr " %2$s %5$d.%6$03d kHz\n" #: src/frontend/mame/ui/devopt.cpp:85 msgid "* Video:\n" -msgstr "" +msgstr "* Video:\n" #: src/frontend/mame/ui/devopt.cpp:90 #, c-format msgid " Screen '%1$s': Vector\n" -msgstr "" +msgstr " Skjerm '%1$s': Vektor\n" #: src/frontend/mame/ui/devopt.cpp:99 #, c-format msgid " Screen '%1$s': %2$d × %3$d (V) %4$f Hz\n" -msgstr "" +msgstr " Skjerm '%1$s': %2$d × %3$d (V) %4$f Hz\n" #: src/frontend/mame/ui/devopt.cpp:100 #, c-format msgid " Screen '%1$s': %2$d × %3$d (H) %4$f Hz\n" -msgstr "" +msgstr " Skjerm '%1$s': %2$d × %3$d (H) %4$f Hz\n" #: src/frontend/mame/ui/devopt.cpp:113 msgid "* Sound:\n" -msgstr "" +msgstr "* Lyd:\n" #: src/frontend/mame/ui/devopt.cpp:133 #, c-format msgid " %1$d×%2$s\n" -msgstr "" +msgstr " %1$d×%2$s\n" #: src/frontend/mame/ui/devopt.cpp:134 msgid " %2$s\n" -msgstr "" +msgstr " %2$s\n" #: src/frontend/mame/ui/devopt.cpp:164 #, c-format @@ -2492,163 +2585,165 @@ msgid "" "* BIOS settings:\n" " %1$d options [default: %2$s]\n" msgstr "" +"* BIOS-innstillinger:\n" +" %1$d innstillinger [forvalg: %2$s]\n" #: src/frontend/mame/ui/devopt.cpp:204 src/frontend/mame/ui/devopt.cpp:220 #: src/frontend/mame/ui/devopt.cpp:265 #, c-format msgid " %1$s [default: %2$s]\n" -msgstr "" +msgstr " %1$s [forvalg: %2$s]\n" #: src/frontend/mame/ui/devopt.cpp:209 src/frontend/mame/ui/devopt.cpp:225 #, c-format msgid " %1$s\n" -msgstr "" +msgstr " %1$s\n" #: src/frontend/mame/ui/devopt.cpp:230 msgid "* DIP switch settings:\n" -msgstr "" +msgstr "* DIP-bryterinnstillinger:\n" #: src/frontend/mame/ui/devopt.cpp:232 msgid "* Configuration settings:\n" -msgstr "" +msgstr "* Oppsettsinnstillinger:\n" #: src/frontend/mame/ui/devopt.cpp:234 msgid "* Input device(s):\n" -msgstr "" +msgstr "* Inndatainnstillinger(s):\n" #: src/frontend/mame/ui/devopt.cpp:236 #, c-format msgid " User inputs [%1$d inputs]\n" -msgstr "" +msgstr " Brukerinndata [%1$d inndata]\n" #: src/frontend/mame/ui/devopt.cpp:238 #, c-format msgid " Mahjong inputs [%1$d inputs]\n" -msgstr "" +msgstr " Mahjong-inndata [%1$d inndata]\n" #: src/frontend/mame/ui/devopt.cpp:240 #, c-format msgid " Hanafuda inputs [%1$d inputs]\n" -msgstr "" +msgstr " Hanafuda-inndata [%1$d inndata]\n" #: src/frontend/mame/ui/devopt.cpp:242 #, c-format msgid " Gambling inputs [%1$d inputs]\n" -msgstr "" +msgstr " Hasardspill-inndata [%1$d inndata]\n" #: src/frontend/mame/ui/devopt.cpp:244 #, c-format msgid " Analog inputs [%1$d inputs]\n" -msgstr "" +msgstr " Analoge inndata [%1$d inndata]\n" #: src/frontend/mame/ui/devopt.cpp:246 #, c-format msgid " Adjuster inputs [%1$d inputs]\n" -msgstr "" +msgstr " Justerer-inndata [%1$d inndata]\n" #: src/frontend/mame/ui/devopt.cpp:248 #, c-format msgid " Keypad inputs [%1$d inputs]\n" -msgstr "" +msgstr " Tastefelt-inndata [%1$d inndata]\n" #: src/frontend/mame/ui/devopt.cpp:250 #, c-format msgid " Keyboard inputs [%1$d inputs]\n" -msgstr "" +msgstr " Tastaturinndata [%1$d inndata]\n" #: src/frontend/mame/ui/devopt.cpp:255 msgid "* Media Options:\n" -msgstr "" +msgstr "* Medieinnstillinger:\n" #: src/frontend/mame/ui/devopt.cpp:257 #, c-format msgid " %1$s [tag: %2$s]\n" -msgstr "" +msgstr " %1$s [merking: %2$s]\n" #: src/frontend/mame/ui/devopt.cpp:263 msgid "* Slot Options:\n" -msgstr "" +msgstr "* Feltinnstillinger:\n" #: src/frontend/mame/ui/devopt.cpp:270 msgid "[None]\n" -msgstr "" +msgstr "[Ingen]\n" #: plugins/timer/init.lua:94 msgid "Current time" -msgstr "" +msgstr "Nåværende tid" #: plugins/timer/init.lua:96 msgid "Total time" -msgstr "" +msgstr "Totaltid" #: plugins/timer/init.lua:98 msgid "Play Count" -msgstr "" +msgstr "Spillteller" #: plugins/timer/init.lua:106 msgid "Timer" -msgstr "" +msgstr "Nedteller" #: plugins/cheat/init.lua:510 msgid "Select cheat to set hotkey" -msgstr "" +msgstr "Velg en juksekode å velge hurtigtasten til" #: plugins/cheat/init.lua:516 msgid "Press button for hotkey or wait to clear" -msgstr "" +msgstr "Trykk på en knapp for hurtigtasting eller vent på at den tømmes" #: plugins/cheat/init.lua:528 msgid "None" -msgstr "" +msgstr "Ingen" #: plugins/cheat/init.lua:533 msgid "Done" -msgstr "" +msgstr "Ferdig" #: plugins/cheat/init.lua:547 plugins/cheat/init.lua:561 msgid "Set" -msgstr "" +msgstr "Velg" #: plugins/cheat/init.lua:580 msgid "Set hotkeys" -msgstr "" +msgstr "Velg hurtigtaster" #: plugins/cheat/init.lua:720 #, lua-format msgid "Activated: %s = %s" -msgstr "" +msgstr "Aktivert: %s = %s" #: plugins/cheat/init.lua:723 plugins/cheat/init.lua:781 #, lua-format msgid "Activated: %s" -msgstr "" +msgstr "Aktivert: %s" #: plugins/cheat/init.lua:785 #, lua-format msgid "Enabled: %s" -msgstr "" +msgstr "Skrudd på: %s" #: plugins/cheat/init.lua:790 #, lua-format msgid "Disabled: %s" -msgstr "" +msgstr "Skrudd av: %s" #: plugins/cheat/init.lua:849 #, lua-format msgid "%s added" -msgstr "" +msgstr "%s er lagt til" #: plugins/data/data_command.lua:19 msgid "Command" -msgstr "" +msgstr "Kommando" #: plugins/data/data_hiscore.lua:770 plugins/data/data_hiscore.lua:818 msgid "High Scores" -msgstr "" +msgstr "Highscorer" #: plugins/data/data_history.lua:15 msgid "History" -msgstr "" +msgstr "Historikk" #: plugins/data/data_mameinfo.lua:18 plugins/data/data_messinfo.lua:19 msgid "" @@ -2657,243 +2752,249 @@ msgid "" "--- DRIVER INFO ---\n" "Driver: " msgstr "" +"\n" +"\n" +"— DRIVERINFO —\n" +"Driver: " #: plugins/data/data_mameinfo.lua:20 msgid "MAMEinfo" -msgstr "" +msgstr "MAMEinfo" #: plugins/data/data_messinfo.lua:21 msgid "MESSinfo" -msgstr "" +msgstr "MESSinfo" #: plugins/data/data_story.lua:22 msgid "Mamescore" -msgstr "" +msgstr "Mamescore" #: plugins/data/data_sysinfo.lua:15 msgid "Sysinfo" -msgstr "" +msgstr "Sysinfo" #: plugins/data/data_gameinit.lua:16 msgid "Gameinit" -msgstr "" +msgstr "Gameinit" #: plugins/data/data_marp.lua:140 msgid "MARPScore" -msgstr "" +msgstr "MARPScore" #: plugins/cheatfind/init.lua:373 msgid "Save Cheat" -msgstr "" +msgstr "Lagre juksekoden" #: plugins/cheatfind/init.lua:376 msgid "Default" -msgstr "" +msgstr "Standard" #: plugins/cheatfind/init.lua:376 msgid "Custom" -msgstr "" +msgstr "Tilpasset" #: plugins/cheatfind/init.lua:377 msgid "Cheat Name" -msgstr "" +msgstr "Juksekodens navn" #: plugins/cheatfind/init.lua:383 plugins/cheatfind/init.lua:748 #, lua-format msgid "Default name is %s" -msgstr "" +msgstr "Standardnavnet er %s" #: plugins/cheatfind/init.lua:391 msgid "Player" -msgstr "" +msgstr "Spiller" #: plugins/cheatfind/init.lua:396 msgid "Type" -msgstr "" +msgstr "Type" #: plugins/cheatfind/init.lua:402 msgid "Save" -msgstr "" +msgstr "Lagre" #: plugins/cheatfind/init.lua:429 #, lua-format msgid "Cheat written to %s and added to cheat.simple" -msgstr "" +msgstr "Juksekoden ble lagret i %s og ble lagt til i cheat.simple" #: plugins/cheatfind/init.lua:437 msgid "Cheat added to cheat.simple" -msgstr "" +msgstr "Juksekoden ble lagt til i cheat.simple" #: plugins/cheatfind/init.lua:442 msgid "" "Unable to write file\n" "Ensure that cheatpath folder exists" msgstr "" +"Klarte ikke å skrive til filen\n" +"Sørg for at juksekodefilbanens mappe eksisterer" #: plugins/cheatfind/init.lua:451 msgid "Cancel" -msgstr "" +msgstr "Lukk" #: plugins/cheatfind/init.lua:456 msgid "CPU or RAM" -msgstr "" +msgstr "CPU eller RAM" #: plugins/cheatfind/init.lua:460 msgid "Changes to this only take effect when \"Start new search\" is selected" -msgstr "" +msgstr "Endringer til dette tas kun i bruk når «Start et nytt søk» er valgt" #: plugins/cheatfind/init.lua:479 msgid "Data cleared and current state saved" -msgstr "" +msgstr "Dataene er tømt og den nåværende tilstanden har blitt lagret" #: plugins/cheatfind/init.lua:487 msgid "Start new search" -msgstr "" +msgstr "Start et nytt søk" #: plugins/cheatfind/init.lua:497 msgid "Current state saved" -msgstr "" +msgstr "Den nåværende tilstanden har blitt lagret" #: plugins/cheatfind/init.lua:504 msgid "Save current -- #" -msgstr "" +msgstr "Lagre nåværende — #" #: plugins/cheatfind/init.lua:536 #, lua-format msgid "%d total matches found" -msgstr "" +msgstr "%d antall samsvaringer ble funnet" #: plugins/cheatfind/init.lua:543 msgid "Compare" -msgstr "" +msgstr "Sammenlign" #: plugins/cheatfind/init.lua:546 msgid "Left operand" -msgstr "" +msgstr "Venstre operand" #: plugins/cheatfind/init.lua:549 msgid "Current" -msgstr "" +msgstr "Nåværende" #: plugins/cheatfind/init.lua:554 msgid "Operator" -msgstr "" +msgstr "Operatør" #: plugins/cheatfind/init.lua:561 msgid "Left less than right, value is difference" -msgstr "" +msgstr "Venstre er mindre enn høyre, verdien er forskjellen" #: plugins/cheatfind/init.lua:563 msgid "Left greater than right, value is difference" -msgstr "" +msgstr "Venstre er større enn høyre, verdien er forskjellen" #: plugins/cheatfind/init.lua:565 msgid "Left equal to right" -msgstr "" +msgstr "Venstre er det samme som høyre" #: plugins/cheatfind/init.lua:567 msgid "Left not equal to right, value is difference" -msgstr "" +msgstr "Venstre er ikke det samme som høyre, verdien er forskjellen" #: plugins/cheatfind/init.lua:569 msgid "Left equal to right with bitmask" -msgstr "" +msgstr "Venstre er det samme som høyre med bitmaskering" #: plugins/cheatfind/init.lua:571 msgid "Left not equal to right with bitmask" -msgstr "" +msgstr "Venstre er ikke det samme som høyre med bitmaskering" #: plugins/cheatfind/init.lua:573 msgid "Left less than value" -msgstr "" +msgstr "Venstre sin «Mindre enn»-verdi" #: plugins/cheatfind/init.lua:575 msgid "Left greater than value" -msgstr "" +msgstr "Venstre sin «Større enn»-verdi" #: plugins/cheatfind/init.lua:577 msgid "Left equal to value" -msgstr "" +msgstr "Venstre sin «Det samme som»-verdi" #: plugins/cheatfind/init.lua:579 msgid "Left not equal to value" -msgstr "" +msgstr "Venstre sin ikke «Ikke det samme som»-verdi" #: plugins/cheatfind/init.lua:590 msgid "Right operand" -msgstr "" +msgstr "Høyre operand" #: plugins/cheatfind/init.lua:598 msgid "Value" -msgstr "" +msgstr "Verdi" #: plugins/cheatfind/init.lua:602 msgid "Any" -msgstr "" +msgstr "Ethvert" #: plugins/cheatfind/init.lua:608 msgid "Data Format" -msgstr "" +msgstr "Dataformat" #: plugins/cheatfind/init.lua:632 msgid "Undo last search -- #" -msgstr "" +msgstr "Andre det forrige søket — #" #: plugins/cheatfind/init.lua:636 msgid "Match block" -msgstr "" +msgstr "Samsvar med blokk" #: plugins/cheatfind/init.lua:639 msgid "All" -msgstr "" +msgstr "Alle" #: plugins/cheatfind/init.lua:690 #, lua-format msgid "Test cheat at addr %08X" -msgstr "" +msgstr "Test juksekoden på adressen %08X" #: plugins/cheatfind/init.lua:722 msgid "Cheat engine not available" -msgstr "" +msgstr "Juksekodemotoren er ikke tilgjengelig" #: plugins/cheatfind/init.lua:771 msgid "Test" -msgstr "" +msgstr "Test" #: plugins/cheatfind/init.lua:771 msgid "Write" -msgstr "" +msgstr "Skriv" #: plugins/cheatfind/init.lua:771 msgid "Watch" -msgstr "" +msgstr "Overvåk" #: plugins/cheatfind/init.lua:788 msgid "Page" -msgstr "" +msgstr "Side" #: plugins/cheatfind/init.lua:806 msgid "Clear Watches" -msgstr "" +msgstr "Tøm overvåkningene" #: plugins/cheatfind/init.lua:816 msgid "Cheat Finder" -msgstr "" +msgstr "Juksekodefinner" #: plugins/portname/init.lua:69 msgid "Save input names to file" -msgstr "" +msgstr "Lagre inndatanavn til fil" #: plugins/portname/init.lua:100 plugins/portname/init.lua:105 #: plugins/portname/init.lua:121 msgid "Failed to save input name file" -msgstr "" +msgstr "Mislyktes i å lagre inndatanavnefilen" #: plugins/portname/init.lua:133 #, lua-format msgid "Input port name file saved to %s" -msgstr "" +msgstr "Inndataportnavnefilen ble lagret til %s" #: plugins/portname/init.lua:138 msgid "Input ports" -msgstr "" +msgstr "Inndataporter" @@ -912,12 +912,12 @@ endif ifeq ($(OS),windows) ifeq (posix,$(SHELLTYPE)) GCC_VERSION := $(shell $(TOOLCHAIN)$(subst @,,$(CC)) -dumpversion 2> /dev/null) -CLANG_VERSION := $(shell $(TOOLCHAIN)$(subst @,,$(CC)) --version 2> /dev/null| head -n 1 | grep clang | sed "s/^.*[^0-9]\([0-9]\+\.[0-9]\+\.[0-9]\+\).*$$/\1/" | head -n 1) +CLANG_VERSION := $(shell $(TOOLCHAIN)$(subst @,,$(CC)) --version 2> /dev/null| head -n 1 | grep clang | sed "s/^.*[^0-9]\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*$$/\1/" | head -n 1) PYTHON_AVAILABLE := $(shell $(PYTHON) --version > /dev/null 2>&1 && echo python) GIT_AVAILABLE := $(shell git --version > /dev/null 2>&1 && echo git) else GCC_VERSION := $(shell $(TOOLCHAIN)$(subst @,,$(CC)) -dumpversion 2> NUL) -CLANG_VERSION := $(shell $(TOOLCHAIN)$(subst @,,$(CC)) --version 2> NUL| head -n 1 | grep clang | sed "s/^.*[^0-9]\([0-9]\+\.[0-9]\+\.[0-9]\+\).*$$/\1/" | head -n 1) +CLANG_VERSION := $(shell $(TOOLCHAIN)$(subst @,,$(CC)) --version 2> NUL| head -n 1 | grep clang | sed "s/^.*[^0-9]\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*$$/\1/" | head -n 1) PYTHON_AVAILABLE := $(shell $(PYTHON) --version > NUL 2>&1 && echo python) GIT_AVAILABLE := $(shell git --version > NUL 2>&1 && echo git) endif diff --git a/scripts/build/complay.py b/scripts/build/complay.py index f6e7db4320e..dff981e65c9 100644 --- a/scripts/build/complay.py +++ b/scripts/build/complay.py @@ -4,6 +4,7 @@ ## copyright-holders:Vas Crabb import os +import os.path import re import sys import xml.sax @@ -95,8 +96,10 @@ class LayoutChecker(Minifyer): BADTAGPATTERN = re.compile('[^abcdefghijklmnopqrstuvwxyz0123456789_.:^$]') VARPATTERN = re.compile('^.*~[0-9A-Za-z_]+~.*$') FLOATCHARS = re.compile('^.*[.eE].*$') - SHAPES = frozenset(('disk', 'led14seg', 'led14segsc', 'led16seg', 'led16segsc', 'led7seg', 'led8seg_gts1', 'rect')) + SHAPES = frozenset(('disk', 'dotmatrix', 'dotmatrix5dot', 'dotmatrixdot', 'led14seg', 'led14segsc', 'led16seg', 'led16segsc', 'led7seg', 'led8seg_gts1', 'rect')) OBJECTS = frozenset(('backdrop', 'bezel', 'cpanel', 'marquee', 'overlay')) + ORIENTATIONS = frozenset((0, 90, 180, 270)) + YESNO = frozenset(("yes", "no")) def __init__(self, output, **kwargs): super(LayoutChecker, self).__init__(output=output, **kwargs) @@ -182,10 +185,10 @@ class LayoutChecker(Minifyer): self.checkNumericAttribute('param', attrs, 'increment', None) lshift = self.checkIntAttribute('param', attrs, 'lshift', None) if (lshift is not None) and (0 > lshift): - self.handleError('Element param attribute lshift "%s" is negative', (attrs['lshift'], )) + self.handleError('Element param attribute lshift "%s" is negative' % (attrs['lshift'], )) rshift = self.checkIntAttribute('param', attrs, 'rshift', None) if (rshift is not None) and (0 > rshift): - self.handleError('Element param attribute rshift "%s" is negative', (attrs['rshift'], )) + self.handleError('Element param attribute rshift "%s" is negative' % (attrs['rshift'], )) if self.repeat_depth and self.repeat_depth[-1]: if 'start' in attrs: if 'value' in attrs: @@ -194,7 +197,7 @@ class LayoutChecker(Minifyer): if name not in self.variable_scopes[-1]: self.variable_scopes[-1][name] = True elif not self.VARPATTERN.match(name): - self.handleError('Incrementing parameter "%s" redefined', (name, )) + self.handleError('Generator parameter "%s" redefined' % (name, )) else: if 'value' not in attrs: self.handleError('Element param missing attribute value') @@ -204,7 +207,7 @@ class LayoutChecker(Minifyer): if not self.variable_scopes[-1].get(name, False): self.variable_scopes[-1][name] = False elif not self.VARPATTERN.match(name): - self.handleError('Incrementing parameter "%s" redefined', (name, )) + self.handleError('Generator parameter "%s" redefined' % (name, )) else: if ('start' in attrs) or ('increment' in attrs) or ('lshift' in attrs) or ('rshift' in attrs): self.handleError('Element param with start/increment/lshift/rshift attribute(s) not in repeat scope') @@ -245,6 +248,17 @@ class LayoutChecker(Minifyer): if has_ltrb and has_origin_size: self.handleError('Element bounds has both left/top/right/bottom and origin/size attributes') + def checkOrientation(self, attrs): + if self.have_orientation[-1]: + self.handleError('Duplicate element orientation') + else: + self.have_orientation[-1] = True + if self.checkIntAttribute('orientation', attrs, 'rotate', 0) not in self.ORIENTATIONS: + self.handleError('Element orientation attribute rotate "%s" is unsupported' % (attrs['rotate'], )) + for name in ('swapxy', 'flipx', 'flipy'): + if attrs.get(name, 'no') not in self.YESNO: + self.handleError('Element orientation attribute %s "%s" is not "yes" or "no"' % (name, attrs[name])) + def checkColorChannel(self, attrs, name): channel = self.checkFloatAttribute('color', attrs, name, None) if (channel is not None) and ((0.0 > channel) or (1.0 < channel)): @@ -261,6 +275,14 @@ class LayoutChecker(Minifyer): if tag.find('::') >= 0: self.handleError('Element %s attribute %s "%s" contains double separator' % (element, attr, tag)) + def checkComponent(self, name, attrs): + state = self.checkIntAttribute(name, attrs, 'state', None) + if (state is not None) and (0 > state): + self.handleError('Element %s attribute state "%s" is negative' % (name, attrs['state'])) + self.handlers.append((self.componentStartHandler, self.componentEndHandler)) + self.have_bounds.append(False) + self.have_color.append(False) + def rootStartHandler(self, name, attrs): if 'mamelayout' != name: self.ignored_depth = 1 @@ -292,6 +314,9 @@ class LayoutChecker(Minifyer): self.elements[attrs['name']] = self.formatLocation() elif not generated_name: self.handleError('Element element has duplicate name (previous %s)' % (self.elements[attrs['name']], )) + defstate = self.checkIntAttribute(name, attrs, 'defstate', None) + if (defstate is not None) and (0 > defstate): + self.handleError('Element element attribute defstate "%s" is negative' % (attrs['defstate'], )) self.handlers.append((self.elementStartHandler, self.elementEndHandler)) elif 'group' == name: if 'name' not in attrs: @@ -308,7 +333,7 @@ class LayoutChecker(Minifyer): self.variable_scopes.append({ }) self.repeat_depth.append(0) self.have_bounds.append(False) - elif 'view' == name: + elif ('view' == name) and (not self.repeat_depth[-1]): if 'name' not in attrs: self.handleError('Element view missing attribute name') else: @@ -326,13 +351,13 @@ class LayoutChecker(Minifyer): else: count = self.checkIntAttribute(name, attrs, 'count', None) if (count is not None) and (0 >= count): - self.handleError('Element repeat attribute count "%s" is negative' % (attrs['count'], )) + self.handleError('Element repeat attribute count "%s" is not positive' % (attrs['count'], )) self.variable_scopes.append({ }) self.repeat_depth[-1] += 1 elif 'param' == name: self.checkParameter(attrs) self.ignored_depth = 1 - elif 'script' == name: + elif ('script' == name) and (not self.repeat_depth[-1]): self.ignored_depth = 1 else: self.handleError('Encountered unexpected element %s' % (name, )) @@ -351,35 +376,61 @@ class LayoutChecker(Minifyer): for group in self.referenced_groups: if (group not in self.groups) and (not self.VARPATTERN.match(group)): self.handleError('Group "%s" not found (first referenced at %s)' % (group, self.referenced_groups[group])) + if not self.views: + self.handleError('No view elements found') self.handlers.pop() def elementStartHandler(self, name, attrs): if name in self.SHAPES: - self.handlers.append((self.shapeStartHandler, self.shapeEndHandler)) - self.have_bounds.append(False) - self.have_color.append(False) + self.checkComponent(name, attrs) elif 'text' == name: if 'string' not in attrs: - self.handleError('Element bounds missing attribute string') - if 'align' in attrs: - align = self.checkIntAttribute(name, attrs, 'align', None) - if (align is not None) and ((0 > align) or (2 < align)): - self.handleError('Element text attribute align "%s" not in valid range 0-2' % (attrs['align'], )) - self.handlers.append((self.shapeStartHandler, self.shapeEndHandler)) - self.have_bounds.append(False) - self.have_color.append(False) + self.handleError('Element text missing attribute string') + align = self.checkIntAttribute(name, attrs, 'align', None) + if (align is not None) and ((0 > align) or (2 < align)): + self.handleError('Element text attribute align "%s" not in valid range 0-2' % (attrs['align'], )) + self.checkComponent(name, attrs) + elif 'simplecounter' == name: + maxstate = self.checkIntAttribute(name, attrs, 'maxstate', None) + if (maxstate is not None) and (0 > maxstate): + self.handleError('Element simplecounter attribute maxstate "%s" is negative' % (attrs['maxstate'], )) + digits = self.checkIntAttribute(name, attrs, 'digits', None) + if (digits is not None) and (0 >= digits): + self.handleError('Element simplecounter attribute digits "%s" is not positive' % (attrs['digits'], )) + align = self.checkIntAttribute(name, attrs, 'align', None) + if (align is not None) and ((0 > align) or (2 < align)): + self.handleError('Element simplecounter attribute align "%s" not in valid range 0-2' % (attrs['align'], )) + self.checkComponent(name, attrs) + elif 'image' == name: + if 'file' not in attrs: + self.handleError('Element image missing attribute file') + self.checkComponent(name, attrs) + elif 'reel' == name: + # TODO: validate symbollist and improve validation of other attributes + self.checkIntAttribute(name, attrs, 'stateoffset', None) + numsymbolsvisible = self.checkIntAttribute(name, attrs, 'numsymbolsvisible', None) + if (numsymbolsvisible is not None) and (0 >= numsymbolsvisible): + self.handleError('Element reel attribute numsymbolsvisible "%s" not positive' % (attrs['numsymbolsvisible'], )) + reelreversed = self.checkIntAttribute(name, attrs, 'reelreversed', None) + if (reelreversed is not None) and ((0 > reelreversed) or (1 < reelreversed)): + self.handleError('Element reel attribute reelreversed "%s" not in valid range 0-1' % (attrs['reelreversed'], )) + beltreel = self.checkIntAttribute(name, attrs, 'beltreel', None) + if (beltreel is not None) and ((0 > beltreel) or (1 < beltreel)): + self.handleError('Element reel attribute beltreel "%s" not in valid range 0-1' % (attrs['beltreel'], )) + self.checkComponent(name, attrs) else: + self.handleError('Encountered unexpected element %s' % (name, )) self.ignored_depth = 1 def elementEndHandler(self, name): self.handlers.pop() - def shapeStartHandler(self, name, attrs): + def componentStartHandler(self, name, attrs): if 'bounds' == name: self.checkBounds(attrs) elif 'color' == name: if self.have_color[-1]: - self.handleError('Duplicate bounds element') + self.handleError('Duplicate color element') else: self.have_color[-1] = True self.checkColorChannel(attrs, 'red') @@ -388,7 +439,7 @@ class LayoutChecker(Minifyer): self.checkColorChannel(attrs, 'alpha') self.ignored_depth = 1 - def shapeEndHandler(self, name): + def componentEndHandler(self, name): self.have_bounds.pop() self.have_color.pop() self.handlers.pop() @@ -396,16 +447,21 @@ class LayoutChecker(Minifyer): def groupViewStartHandler(self, name, attrs): if name in self.OBJECTS: if 'element' not in attrs: - self.handleError('Element %s missing attribute element', (name, )) + self.handleError('Element %s missing attribute element' % (name, )) elif attrs['element'] not in self.referenced_elements: self.referenced_elements[attrs['element']] = self.formatLocation() if 'inputtag' in attrs: if 'inputmask' not in attrs: - self.handleError('Element %s has inputtag without inputmask attribute' % (name, )) + self.handleError('Element %s has inputtag attribute without inputmask attribute' % (name, )) self.checkTag(attrs['inputtag'], name, 'inputtag') - self.checkIntAttribute(name, attrs, 'inputmask', None) + elif 'inputmask' in attrs: + self.handleError('Element %s has inputmask attribute without inputtag attirbute' % (name, )) + inputmask = self.checkIntAttribute(name, attrs, 'inputmask', None) + if (inputmask is not None) and (0 == inputmask): + self.handleError('Element %s has attribute inputmask "%s" is zero' % (name, attrs['inputmask'])) self.handlers.append((self.objectStartHandler, self.objectEndHandler)) self.have_bounds.append(False) + self.have_orientation.append(False) elif 'screen' == name: if 'index' in attrs: index = self.checkIntAttribute(name, attrs, 'index', None) @@ -420,6 +476,7 @@ class LayoutChecker(Minifyer): self.handleError('Element screen attribute tag "%s" contains invalid characters' % (tag, )) self.handlers.append((self.objectStartHandler, self.objectEndHandler)) self.have_bounds.append(False) + self.have_orientation.append(False) elif 'group' == name: if 'ref' not in attrs: self.handleError('Element group missing attribute ref') @@ -427,6 +484,7 @@ class LayoutChecker(Minifyer): self.referenced_groups[attrs['ref']] = self.formatLocation() self.handlers.append((self.objectStartHandler, self.objectEndHandler)) self.have_bounds.append(False) + self.have_orientation.append(False) elif 'repeat' == name: if 'count' not in attrs: self.handleError('Element repeat missing attribute count') @@ -460,10 +518,13 @@ class LayoutChecker(Minifyer): def objectStartHandler(self, name, attrs): if 'bounds' == name: self.checkBounds(attrs) + elif 'orientation' == name: + self.checkOrientation(attrs) self.ignored_depth = 1 def objectEndHandler(self, name): self.have_bounds.pop() + self.have_orientation.pop() self.handlers.pop() def setDocumentLocator(self, locator): @@ -476,6 +537,7 @@ class LayoutChecker(Minifyer): self.variable_scopes = [ ] self.repeat_depth = [ ] self.have_bounds = [ ] + self.have_orientation = [ ] self.have_color = [ ] self.generated_element_names = False self.generated_group_names = False @@ -493,6 +555,7 @@ class LayoutChecker(Minifyer): del self.variable_scopes del self.repeat_depth del self.have_bounds + del self.have_orientation del self.have_color del self.generated_element_names del self.generated_group_names @@ -549,19 +612,33 @@ def compressLayout(src, dst, comp): return state[1], state[0] +class BlackHole(object): + def write(self, *args): + pass + def close(self): + pass + + if __name__ == '__main__': - if len(sys.argv) != 4: + if (len(sys.argv) > 4) or (len(sys.argv) < 2): print('Usage:') - print(' complay <source.lay> <output.h> <varname>') + print(' complay <source.lay> [<output.h> [<varname>]]') sys.exit(0 if len(sys.argv) <= 1 else 1) srcfile = sys.argv[1] - dstfile = sys.argv[2] - varname = sys.argv[3] + dstfile = sys.argv[2] if len(sys.argv) >= 3 else None + if len(sys.argv) >= 4: + varname = sys.argv[3] + else: + varname = os.path.basename(srcfile) + base, ext = os.path.splitext(varname) + if ext.lower() == '.lay': + varname = base + varname = 'layout_' + re.sub('[^0-9A-Za-z_]', '_', varname) comp_type = 1 try: - dst = open(dstfile,'w') + dst = open(dstfile,'w') if dstfile is not None else BlackHole() dst.write('static const unsigned char %s_data[] = {\n' % (varname)) byte_count, comp_size = compressLayout(srcfile, lambda x: dst.write(x), zlib.compressobj()) dst.write('};\n\n') @@ -571,10 +648,12 @@ if __name__ == '__main__': dst.close() except XmlError: dst.close() - os.remove(dstfile) + if dstfile is not None: + os.remove(dstfile) sys.exit(2) except IOError: sys.stderr.write("Unable to open output file '%s'\n" % dstfile) - os.remove(dstfile) dst.close() + if dstfile is not None: + os.remove(dstfile) sys.exit(3) diff --git a/scripts/src/cpu.lua b/scripts/src/cpu.lua index a94c4c709a9..878fb8e1fcb 100644 --- a/scripts/src/cpu.lua +++ b/scripts/src/cpu.lua @@ -599,6 +599,8 @@ if (CPUS["H8"]~=null) then MAME_DIR .. "src/devices/cpu/h8/h83337.h", MAME_DIR .. "src/devices/cpu/h8/h83002.cpp", MAME_DIR .. "src/devices/cpu/h8/h83002.h", + MAME_DIR .. "src/devices/cpu/h8/h83003.cpp", + MAME_DIR .. "src/devices/cpu/h8/h83003.h", MAME_DIR .. "src/devices/cpu/h8/h83006.cpp", MAME_DIR .. "src/devices/cpu/h8/h83006.h", MAME_DIR .. "src/devices/cpu/h8/h83008.cpp", diff --git a/scripts/src/osd/windows_cfg.lua b/scripts/src/osd/windows_cfg.lua index 73598da6760..2735e4df4f0 100644 --- a/scripts/src/osd/windows_cfg.lua +++ b/scripts/src/osd/windows_cfg.lua @@ -41,6 +41,7 @@ if not _OPTIONS["DONT_USE_NETWORK"] then defines { "USE_NETWORK", "OSD_NET_USE_PCAP", + "OSD_NET_USE_TAPTUN", } end diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua index 8c24fcadf41..9c6239dfed1 100644 --- a/scripts/target/mame/mess.lua +++ b/scripts/target/mame/mess.lua @@ -3601,6 +3601,7 @@ files { MAME_DIR .. "src/mame/drivers/besta.cpp", MAME_DIR .. "src/mame/drivers/bitgraph.cpp", MAME_DIR .. "src/mame/drivers/bpmmicro.cpp", + MAME_DIR .. "src/mame/drivers/blw700i.cpp", MAME_DIR .. "src/mame/drivers/br8641.cpp", MAME_DIR .. "src/mame/drivers/busicom.cpp", MAME_DIR .. "src/mame/includes/busicom.h", @@ -3644,6 +3645,7 @@ files { MAME_DIR .. "src/mame/drivers/e100.cpp", MAME_DIR .. "src/mame/drivers/eacc.cpp", MAME_DIR .. "src/mame/drivers/elwro800.cpp", + MAME_DIR .. "src/mame/drivers/emate.cpp", MAME_DIR .. "src/mame/drivers/esprit.cpp", MAME_DIR .. "src/mame/drivers/eti660.cpp", MAME_DIR .. "src/mame/includes/eti660.h", @@ -3671,7 +3673,6 @@ files { MAME_DIR .. "src/mame/drivers/imsai.cpp", MAME_DIR .. "src/mame/drivers/indiana.cpp", MAME_DIR .. "src/mame/drivers/itt3030.cpp", - MAME_DIR .. "src/mame/drivers/jade.cpp", MAME_DIR .. "src/mame/drivers/jonos.cpp", MAME_DIR .. "src/mame/drivers/konin.cpp", MAME_DIR .. "src/mame/drivers/kron.cpp", @@ -3692,6 +3693,7 @@ files { MAME_DIR .. "src/mame/drivers/micronic.cpp", MAME_DIR .. "src/mame/includes/micronic.h", MAME_DIR .. "src/mame/drivers/microterm.cpp", + MAME_DIR .. "src/mame/drivers/microterm_f8.cpp", MAME_DIR .. "src/mame/drivers/mightyframe.cpp", MAME_DIR .. "src/mame/drivers/milton6805.cpp", MAME_DIR .. "src/mame/drivers/milwaukee.cpp", @@ -3760,12 +3762,14 @@ files { MAME_DIR .. "src/mame/drivers/tecnbras.cpp", MAME_DIR .. "src/mame/drivers/terak.cpp", MAME_DIR .. "src/mame/drivers/terco.cpp", + MAME_DIR .. "src/mame/drivers/terminal.cpp", MAME_DIR .. "src/mame/drivers/ti630.cpp", MAME_DIR .. "src/mame/drivers/tr175.cpp", MAME_DIR .. "src/mame/drivers/trs80dt1.cpp", MAME_DIR .. "src/mame/drivers/tsispch.cpp", MAME_DIR .. "src/mame/includes/tsispch.h", MAME_DIR .. "src/mame/drivers/tti.cpp", + MAME_DIR .. "src/mame/drivers/unkz80.cpp", MAME_DIR .. "src/mame/drivers/unistar.cpp", MAME_DIR .. "src/mame/drivers/v6809.cpp", MAME_DIR .. "src/mame/drivers/vector4.cpp", diff --git a/scripts/target/mame/virtual.lua b/scripts/target/mame/virtual.lua index 8407fe9df9e..0ea38d385f3 100644 --- a/scripts/target/mame/virtual.lua +++ b/scripts/target/mame/virtual.lua @@ -46,6 +46,7 @@ SOUNDS["YM2151"] = true SOUNDS["YM2203"] = true SOUNDS["YM2413"] = true SOUNDS["YM2608"] = true +SOUNDS["YM2610"] = true SOUNDS["YM2612"] = true SOUNDS["YM3526"] = true SOUNDS["YM3812"] = true diff --git a/src/devices/bus/a2bus/a2mockingboard.cpp b/src/devices/bus/a2bus/a2mockingboard.cpp index 3ddcc8bbd92..dbc9370bf69 100644 --- a/src/devices/bus/a2bus/a2mockingboard.cpp +++ b/src/devices/bus/a2bus/a2mockingboard.cpp @@ -38,72 +38,60 @@ DEFINE_DEVICE_TYPE(A2BUS_ECHOPLUS, a2bus_echoplus_device, "a2echop", "S // device_add_mconfig - add device configuration //------------------------------------------------- -MACHINE_CONFIG_START(a2bus_ayboard_device::device_add_mconfig) - MCFG_DEVICE_ADD(VIA1_TAG, VIA6522, 1022727) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, a2bus_ayboard_device, via1_out_a)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, a2bus_ayboard_device, via1_out_b)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, a2bus_ayboard_device, via1_irq_w)) +void a2bus_ayboard_device::add_common_devices(machine_config &config) +{ + VIA6522(config, m_via1, 1022727); + m_via1->writepa_handler().set(FUNC(a2bus_ayboard_device::via1_out_a)); + m_via1->writepb_handler().set(FUNC(a2bus_ayboard_device::via1_out_b)); + m_via1->irq_handler().set(FUNC(a2bus_ayboard_device::via1_irq_w)); - MCFG_DEVICE_ADD(VIA2_TAG, VIA6522, 1022727) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, a2bus_ayboard_device, via2_out_a)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, a2bus_ayboard_device, via2_out_b)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, a2bus_ayboard_device, via2_irq_w)) + VIA6522(config, m_via2, 1022727); + m_via2->writepa_handler().set(FUNC(a2bus_ayboard_device::via2_out_a)); + m_via2->writepb_handler().set(FUNC(a2bus_ayboard_device::via2_out_b)); + m_via2->irq_handler().set(FUNC(a2bus_ayboard_device::via2_irq_w)); SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); - MCFG_DEVICE_ADD(AY1_TAG, AY8913, 1022727) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0) - MCFG_DEVICE_ADD(AY2_TAG, AY8913, 1022727) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0) -MACHINE_CONFIG_END - -MACHINE_CONFIG_START(a2bus_phasor_device::device_add_mconfig) - MCFG_DEVICE_ADD(VIA1_TAG, VIA6522, 1022727) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, a2bus_ayboard_device, via1_out_a)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, a2bus_ayboard_device, via1_out_b)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, a2bus_ayboard_device, via1_irq_w)) - - MCFG_DEVICE_ADD(VIA2_TAG, VIA6522, 1022727) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, a2bus_ayboard_device, via2_out_a)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, a2bus_ayboard_device, via2_out_b)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, a2bus_ayboard_device, via2_irq_w)) + AY8913(config, m_ay1, 1022727); + m_ay1->add_route(ALL_OUTPUTS, "lspeaker", 1.0); +} + +void a2bus_ayboard_device::device_add_mconfig(machine_config &config) +{ + add_common_devices(config); + + AY8913(config, m_ay2, 1022727); + m_ay2->add_route(ALL_OUTPUTS, "rspeaker", 1.0); +} + +void a2bus_phasor_device::device_add_mconfig(machine_config &config) +{ + add_common_devices(config); + + m_via1->writepb_handler().set(FUNC(a2bus_phasor_device::via1_out_b)); + m_via2->writepb_handler().set(FUNC(a2bus_phasor_device::via2_out_b)); - SPEAKER(config, "lspeaker").front_left(); - SPEAKER(config, "rspeaker").front_right(); SPEAKER(config, "lspeaker2").front_left(); SPEAKER(config, "rspeaker2").front_right(); - MCFG_DEVICE_ADD(AY1_TAG, AY8913, 1022727) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0) - MCFG_DEVICE_ADD(AY2_TAG, AY8913, 1022727) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker2", 1.0) - MCFG_DEVICE_ADD(AY3_TAG, AY8913, 1022727) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0) - MCFG_DEVICE_ADD(AY4_TAG, AY8913, 1022727) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker2", 1.0) -MACHINE_CONFIG_END - -MACHINE_CONFIG_START(a2bus_echoplus_device::device_add_mconfig) - MCFG_DEVICE_ADD(VIA1_TAG, VIA6522, 1022727) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, a2bus_ayboard_device, via1_out_a)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, a2bus_ayboard_device, via1_out_b)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, a2bus_ayboard_device, via1_irq_w)) - - MCFG_DEVICE_ADD(VIA2_TAG, VIA6522, 1022727) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, a2bus_ayboard_device, via2_out_a)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, a2bus_ayboard_device, via2_out_b)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, a2bus_ayboard_device, via2_irq_w)) + AY8913(config, m_ay2, 1022727); + AY8913(config, m_ay3, 1022727); + AY8913(config, m_ay4, 1022727); + m_ay2->add_route(ALL_OUTPUTS, "lspeaker2", 1.0); + m_ay3->add_route(ALL_OUTPUTS, "rspeaker", 1.0); + m_ay4->add_route(ALL_OUTPUTS, "rspeaker2", 1.0); +} - SPEAKER(config, "lspeaker").front_left(); - SPEAKER(config, "rspeaker").front_right(); - MCFG_DEVICE_ADD(AY1_TAG, AY8913, 1022727) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0) - MCFG_DEVICE_ADD(AY2_TAG, AY8913, 1022727) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0) +void a2bus_echoplus_device::device_add_mconfig(machine_config &config) +{ + add_common_devices(config); + + AY8913(config, m_ay2, 1022727); + m_ay2->add_route(ALL_OUTPUTS, "rspeaker", 1.0); SPEAKER(config, "echosp").front_center(); - MCFG_DEVICE_ADD(E2P_TMS_TAG, TMS5220, 640000) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "echosp", 1.0) -MACHINE_CONFIG_END + TMS5220(config, m_tms, 640000); + m_tms->add_route(ALL_OUTPUTS, "echosp", 1.0); +} //************************************************************************** // LIVE DEVICE @@ -116,31 +104,28 @@ a2bus_ayboard_device::a2bus_ayboard_device(const machine_config &mconfig, device m_via2(*this, VIA2_TAG), m_ay1(*this, AY1_TAG), m_ay2(*this, AY2_TAG), - m_ay3(*this, AY3_TAG), - m_ay4(*this, AY4_TAG), m_isPhasor(false), m_PhasorNative(false), m_porta1(0), m_porta2(0) + m_porta1(0), + m_porta2(0) { } a2bus_mockingboard_device::a2bus_mockingboard_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : a2bus_ayboard_device(mconfig, A2BUS_MOCKINGBOARD, tag, owner, clock) { - m_isPhasor = false; - m_PhasorNative = false; } a2bus_phasor_device::a2bus_phasor_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - a2bus_ayboard_device(mconfig, A2BUS_PHASOR, tag, owner, clock) + a2bus_ayboard_device(mconfig, A2BUS_PHASOR, tag, owner, clock), + m_ay3(*this, AY3_TAG), + m_ay4(*this, AY4_TAG), + m_native(false) { - m_isPhasor = true; - m_PhasorNative = false; } a2bus_echoplus_device::a2bus_echoplus_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : a2bus_ayboard_device(mconfig, A2BUS_ECHOPLUS, tag, owner, clock), m_tms(*this, E2P_TMS_TAG) { - m_isPhasor = false; - m_PhasorNative = false; } //------------------------------------------------- @@ -164,48 +149,34 @@ void a2bus_ayboard_device::device_reset() uint8_t a2bus_ayboard_device::read_cnxx(uint8_t offset) { - if (m_isPhasor) - { - uint8_t retVal = 0; - int viaSel; + if (offset <= 0x10) + return m_via1->read(offset & 0xf); + else if (offset >= 0x80 && offset <= 0x90) + return m_via2->read(offset & 0xf); - if (m_PhasorNative) - { - viaSel = ((offset & 0x80)>> 6) | ((offset & 0x10)>> 4); - } - else - { - viaSel = (offset & 0x80) ? 2 : 1; - } + return 0; +} - if ((offset <= 0x20) || (offset >= 0x80 && offset <= 0xa0)) - { - if (viaSel & 1) - { - retVal |= m_via1->read(machine().dummy_space(), offset & 0xf); - } - - if (viaSel & 2) - { - retVal |= m_via2->read(machine().dummy_space(), offset & 0xf); - } - } +uint8_t a2bus_phasor_device::read_cnxx(uint8_t offset) +{ + uint8_t ret = 0; + int via_sel; - return retVal; - } + if (m_native) + via_sel = ((offset & 0x80) >> 6) | ((offset & 0x10) >> 4); else + via_sel = (offset & 0x80) ? 2 : 1; + + if ((offset <= 0x20) || (offset >= 0x80 && offset <= 0xa0)) { - if (offset <= 0x10) - { - return m_via1->read(machine().dummy_space(), offset & 0xf); - } - else if (offset >= 0x80 && offset <= 0x90) - { - return m_via2->read(machine().dummy_space(), offset & 0xf); - } + if (BIT(via_sel, 0)) + ret |= m_via1->read(offset & 0xf); + + if (BIT(via_sel, 1)) + ret |= m_via2->read(offset & 0xf); } - return 0; + return ret; } /*------------------------------------------------- @@ -214,71 +185,47 @@ uint8_t a2bus_ayboard_device::read_cnxx(uint8_t offset) void a2bus_ayboard_device::write_cnxx(uint8_t offset, uint8_t data) { - if (m_isPhasor) - { - if ((offset <= 0x20) || (offset >= 0x80 && offset <= 0xa0)) - { - int viaSel; - - if (m_PhasorNative) - { - viaSel = ((offset & 0x80)>> 6) | ((offset & 0x10)>> 4); - } - else - { - viaSel = (offset & 0x80) ? 2 : 1; - } - - if (viaSel & 1) - { - m_via1->write(machine().dummy_space(), offset&0xf, data); - } - if (viaSel & 2) - { - m_via2->write(machine().dummy_space(), offset&0xf, data); - } - } - } + if (offset <= 0x10) + m_via1->write(offset & 0xf, data); + else if (offset >= 0x80 && offset <= 0x90) + m_via2->write(offset & 0xf, data); else + logerror("Mockingboard(%d): unk write %02x to Cn%02X (%s)\n", slotno(), data, offset, machine().describe_context()); +} + +void a2bus_phasor_device::write_cnxx(uint8_t offset, uint8_t data) +{ + if ((offset <= 0x20) || (offset >= 0x80 && offset <= 0xa0)) { - if (offset <= 0x10) - { - m_via1->write(machine().dummy_space(), offset & 0xf, data); - } - else if (offset >= 0x80 && offset <= 0x90) - { - m_via2->write(machine().dummy_space(), offset & 0xf, data); - } + int via_sel; + + if (m_native) + via_sel = ((offset & 0x80) >> 6) | ((offset & 0x10) >> 4); else - { - logerror("Mockingboard(%d): unk write %02x to Cn%02X (%s)\n", slotno(), data, offset, machine().describe_context()); - } + via_sel = (offset & 0x80) ? 2 : 1; + + if (BIT(via_sel, 0)) + m_via1->write(offset & 0xf, data); + + if (BIT(via_sel, 1)) + m_via2->write(offset & 0xf, data); } } - WRITE_LINE_MEMBER( a2bus_ayboard_device::via1_irq_w ) { if (state) - { raise_slot_irq(); - } else - { lower_slot_irq(); - } } WRITE_LINE_MEMBER( a2bus_ayboard_device::via2_irq_w ) { if (state) - { raise_slot_irq(); - } else - { lower_slot_irq(); - } } WRITE8_MEMBER( a2bus_ayboard_device::via1_out_a ) @@ -288,88 +235,77 @@ WRITE8_MEMBER( a2bus_ayboard_device::via1_out_a ) WRITE8_MEMBER( a2bus_ayboard_device::via1_out_b ) { + if (!BIT(data, 2)) + { + m_ay1->reset_w(space, 0, 0); + } + else + { + switch (data & 3) + { + case 0: // BDIR=0, BC1=0 (inactive) + break; + + case 1: // BDIR=0, BC1=1 (read PSG) + m_porta1 = m_ay1->read_data(); + break; + + case 2: // BDIR=1, BC1=0 (write PSG) + m_ay1->write_data(m_porta1); + break; + + case 3: // BDIR=1, BC1=1 (latch) + m_ay1->write_address(m_porta1); + break; + } + } +} + +WRITE8_MEMBER( a2bus_phasor_device::via1_out_b ) +{ if (!(data & 4)) { m_ay1->reset_w(space, 0, 0); - if (m_isPhasor && m_PhasorNative) + if (m_native) { m_ay2->reset_w(space, 0, 0); } } else { - if (!m_isPhasor) + int chip_sel; + + if (m_native) + chip_sel = (~(data >> 3) & 3); + else + chip_sel = 1; + +// logerror("Phasor: %02x to AY1/2 CS %02x (BDIR/BC1 %02x, data %02x)\n", m_porta1, chipSel, data & 3, data); + switch (data & 3) { - switch (data & 3) - { - case 0: // BDIR=0, BC1=0 (inactive) - break; + case 0: // BDIR=0, BC1=0 (inactive) + break; - case 1: // BDIR=0, BC1=1 (read PSG) + case 1: // BDIR=0, BC1=1 (read PSG) + if (BIT(chip_sel, 0)) m_porta1 = m_ay1->read_data(); - break; + if (BIT(chip_sel, 1)) + m_porta1 = m_ay2->read_data(); + break; - case 2: // BDIR=1, BC1=0 (write PSG) + case 2: // BDIR=1, BC1=0 (write PSG) + if (BIT(chip_sel, 0)) m_ay1->write_data(m_porta1); - break; + if (BIT(chip_sel, 1)) + m_ay2->write_data(m_porta1); + break; - case 3: // BDIR=1, BC1=1 (latch) + case 3: // BDIR=1, BC1=1 (latch) + if (BIT(chip_sel, 0)) m_ay1->write_address(m_porta1); - break; - } - } - else - { - int chipSel; - - if (m_PhasorNative) - { - chipSel = (~(data >> 3) & 3); - } - else - { - chipSel = 1; - } - -// logerror("Phasor: %02x to AY1/2 CS %02x (BDIR/BC1 %02x, data %02x)\n", m_porta1, chipSel, data & 3, data); - switch (data & 3) - { - case 0: // BDIR=0, BC1=0 (inactive) - break; - - case 1: // BDIR=0, BC1=1 (read PSG) - if (chipSel & 1) - { - m_porta1 = m_ay1->read_data(); - } - if (chipSel & 2) - { - m_porta1 = m_ay2->read_data(); - } - break; - - case 2: // BDIR=1, BC1=0 (write PSG) - if (chipSel & 1) - { - m_ay1->write_data(m_porta1); - } - if (chipSel & 2) - { - m_ay2->write_data(m_porta1); - } - break; - - case 3: // BDIR=1, BC1=1 (latch) - if (chipSel & 1) - { - m_ay1->write_address(m_porta1); - } - if (chipSel & 2) - { - m_ay2->write_address(m_porta1); - } - break; - } + if (BIT(chip_sel, 1)) + m_ay2->write_address(m_porta1); + break; } } } @@ -381,9 +317,37 @@ WRITE8_MEMBER( a2bus_ayboard_device::via2_out_a ) WRITE8_MEMBER( a2bus_ayboard_device::via2_out_b ) { - if (!(data & 4)) + if (!BIT(data, 2)) + { + m_ay2->reset_w(space, 0, 0); + } + else + { + switch (data & 3) + { + case 0: // BDIR=0, BC1=0 (inactive) + break; + + case 1: // BDIR=0, BC1=1 (read PSG) + m_porta2 = m_ay2->read_data(); + break; + + case 2: // BDIR=1, BC1=0 (write PSG) + m_ay2->write_data(m_porta2); + break; + + case 3: // BDIR=1, BC1=1 (latch) + m_ay2->write_data(m_porta2); + break; + } + } +} + +WRITE8_MEMBER( a2bus_phasor_device::via2_out_b ) +{ + if (!BIT(data, 2)) { - if (m_isPhasor && m_PhasorNative) + if (m_native) { m_ay3->reset_w(space, 0, 0); m_ay4->reset_w(space, 0, 0); @@ -395,98 +359,53 @@ WRITE8_MEMBER( a2bus_ayboard_device::via2_out_b ) } else { - if (!m_isPhasor) - { - switch (data & 3) - { - case 0: // BDIR=0, BC1=0 (inactive) - break; - - case 1: // BDIR=0, BC1=1 (read PSG) - m_porta2 = m_ay2->read_data(); - break; - - case 2: // BDIR=1, BC1=0 (write PSG) - m_ay2->write_data(m_porta2); - break; - - case 3: // BDIR=1, BC1=1 (latch) - m_ay2->write_data(m_porta2); - break; - } - } + int chip_sel; + + if (m_native) + chip_sel = (~(data >> 3) & 3); else + chip_sel = 1; + +// logerror("Phasor: %02x to AY3/4 CS %02x (BDIR/BC1 %02x, data %02x)\n", m_porta2, chipSel, data & 3, data); + switch (data & 3) { - int chipSel; - - if (m_PhasorNative) - { - chipSel = (~(data >> 3) & 3); - } - else - { - chipSel = 1; - } - -// logerror("Phasor: %02x to AY3/4 CS %02x (BDIR/BC1 %02x, data %02x)\n", m_porta2, chipSel, data & 3, data); - switch (data & 3) - { - case 0: // BDIR=0, BC1=0 (inactive) - break; - - case 1: // BDIR=0, BC1=1 (read PSG) - if (chipSel & 1) - { - m_porta2 = m_ay3->read_data(); - } - if (chipSel & 2) - { - m_porta2 = m_ay4->read_data(); - } - break; - - case 2: // BDIR=1, BC1=0 (write PSG) - if (chipSel & 1) - { - m_ay3->write_data(m_porta2); - } - if (chipSel & 2) - { - m_ay4->write_data(m_porta2); - } - break; - - case 3: // BDIR=1, BC1=1 (latch) - if (chipSel & 1) - { - m_ay3->write_address(m_porta2); - } - if (chipSel & 2) - { - m_ay4->write_address(m_porta2); - } - break; - } + case 0: // BDIR=0, BC1=0 (inactive) + break; + + case 1: // BDIR=0, BC1=1 (read PSG) + if (BIT(chip_sel, 0)) + m_porta2 = m_ay3->read_data(); + if (BIT(chip_sel, 1)) + m_porta2 = m_ay4->read_data(); + break; + + case 2: // BDIR=1, BC1=0 (write PSG) + if (BIT(chip_sel, 0)) + m_ay3->write_data(m_porta2); + if (BIT(chip_sel, 1)) + m_ay4->write_data(m_porta2); + break; + + case 3: // BDIR=1, BC1=1 (latch) + if (BIT(chip_sel, 0)) + m_ay3->write_address(m_porta2); + if (BIT(chip_sel, 1)) + m_ay4->write_address(m_porta2); + break; } } } -uint8_t a2bus_ayboard_device::read_c0nx(uint8_t offset) -{ - if (m_isPhasor) - { - m_PhasorNative = (offset & 1) ? true : false; - } +uint8_t a2bus_phasor_device::read_c0nx(uint8_t offset) +{ + m_native = BIT(offset, 0); return 0xff; } -void a2bus_ayboard_device::write_c0nx(uint8_t offset, uint8_t data) +void a2bus_phasor_device::write_c0nx(uint8_t offset, uint8_t data) { - if (m_isPhasor) - { - m_PhasorNative = (offset & 1) ? true : false; - } + m_native = BIT(offset, 0); } uint8_t a2bus_echoplus_device::read_c0nx(uint8_t offset) diff --git a/src/devices/bus/a2bus/a2mockingboard.h b/src/devices/bus/a2bus/a2mockingboard.h index f647f1fc7a4..b7d6b7f3b97 100644 --- a/src/devices/bus/a2bus/a2mockingboard.h +++ b/src/devices/bus/a2bus/a2mockingboard.h @@ -28,9 +28,9 @@ public: DECLARE_WRITE_LINE_MEMBER( via1_irq_w ); DECLARE_WRITE_LINE_MEMBER( via2_irq_w ); DECLARE_WRITE8_MEMBER(via1_out_a); - DECLARE_WRITE8_MEMBER(via1_out_b); + virtual DECLARE_WRITE8_MEMBER(via1_out_b); DECLARE_WRITE8_MEMBER(via2_out_a); - DECLARE_WRITE8_MEMBER(via2_out_b); + virtual DECLARE_WRITE8_MEMBER(via2_out_b); protected: // construction/destruction @@ -41,22 +41,20 @@ protected: virtual void device_add_mconfig(machine_config &config) override; // overrides of standard a2bus slot functions - virtual uint8_t read_c0nx(uint8_t offset) override; - virtual void write_c0nx(uint8_t offset, uint8_t data) override; + virtual uint8_t read_c0nx(uint8_t offset) override { return 0xff; } + virtual void write_c0nx(uint8_t offset, uint8_t data) override { } virtual uint8_t read_cnxx(uint8_t offset) override; virtual void write_cnxx(uint8_t offset, uint8_t data) override; + void add_common_devices(machine_config &config); + required_device<via6522_device> m_via1; required_device<via6522_device> m_via2; required_device<ay8913_device> m_ay1; required_device<ay8913_device> m_ay2; - optional_device<ay8913_device> m_ay3; - optional_device<ay8913_device> m_ay4; - - bool m_isPhasor, m_PhasorNative; -private: - uint8_t m_porta1, m_porta2; + uint8_t m_porta1; + uint8_t m_porta2; }; class a2bus_mockingboard_device : public a2bus_ayboard_device @@ -70,8 +68,22 @@ class a2bus_phasor_device : public a2bus_ayboard_device public: a2bus_phasor_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + DECLARE_WRITE8_MEMBER(via1_out_b) override; + DECLARE_WRITE8_MEMBER(via2_out_b) override; + protected: virtual void device_add_mconfig(machine_config &config) override; + + virtual uint8_t read_c0nx(uint8_t offset) override; + virtual void write_c0nx(uint8_t offset, uint8_t data) override; + virtual uint8_t read_cnxx(uint8_t offset) override; + virtual void write_cnxx(uint8_t offset, uint8_t data) override; + + required_device<ay8913_device> m_ay3; + required_device<ay8913_device> m_ay4; + +private: + bool m_native; }; class a2bus_echoplus_device : public a2bus_ayboard_device diff --git a/src/devices/bus/a2bus/transwarp.cpp b/src/devices/bus/a2bus/transwarp.cpp index be81911b9bc..06557e28cb0 100644 --- a/src/devices/bus/a2bus/transwarp.cpp +++ b/src/devices/bus/a2bus/transwarp.cpp @@ -162,7 +162,6 @@ void a2bus_transwarp_device::device_reset() m_bEnabled = true; m_bReadA2ROM = false; set_maincpu_halt(ASSERT_LINE); - if (!(m_dsw2->read() & 0x80)) { if (m_dsw1->read() & 0x80) @@ -236,10 +235,10 @@ void a2bus_transwarp_device::hit_slot(int slot) if (!(m_dsw2->read() & 0x80)) { // accleration's on, check the specific slot - if (m_dsw2->read() & (1<<(slot-1))) + if (!(m_dsw2->read() & (1<<(slot-1)))) { m_ourcpu->set_unscaled_clock(1021800); - // slow down for around 20 cycles, should be more than enough + // slow down for 20 uSec, should be more than enough m_timer->adjust(attotime::from_usec(20)); } } diff --git a/src/devices/bus/abcbus/hdc.cpp b/src/devices/bus/abcbus/hdc.cpp index ae2339627a0..2febc491d79 100644 --- a/src/devices/bus/abcbus/hdc.cpp +++ b/src/devices/bus/abcbus/hdc.cpp @@ -83,15 +83,16 @@ static const z80_daisy_config daisy_chain[] = // device_add_mconfig - add device configuration //------------------------------------------------- -MACHINE_CONFIG_START(abc_hdc_device::device_add_mconfig) - MCFG_DEVICE_ADD(Z80_TAG, Z80, 4000000) - MCFG_DEVICE_PROGRAM_MAP(abc_hdc_mem) - MCFG_DEVICE_IO_MAP(abc_hdc_io) - MCFG_Z80_DAISY_CHAIN(daisy_chain) - - MCFG_DEVICE_ADD(SASIBUS_TAG, SCSI_PORT, 0) - MCFG_SCSIDEV_ADD(SASIBUS_TAG ":" SCSI_PORT_DEVICE1, "harddisk", SCSIHD, SCSI_ID_0) -MACHINE_CONFIG_END +void abc_hdc_device::device_add_mconfig(machine_config &config) +{ + Z80(config, m_maincpu, 4000000); + m_maincpu->set_memory_map(&abc_hdc_device::abc_hdc_mem); + m_maincpu->set_io_map(&abc_hdc_device::abc_hdc_io); + m_maincpu->set_daisy_config(daisy_chain); + + scsi_port_device &scsi(SCSI_PORT(config, SASIBUS_TAG)); + scsi.set_slot_device(1, "harddisk", SCSIHD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_0)); +} //************************************************************************** diff --git a/src/devices/bus/abcbus/hdc.h b/src/devices/bus/abcbus/hdc.h index 2f082286fa4..075caad3778 100644 --- a/src/devices/bus/abcbus/hdc.h +++ b/src/devices/bus/abcbus/hdc.h @@ -44,7 +44,7 @@ protected: virtual void abcbus_cs(uint8_t data) override; private: - required_device<cpu_device> m_maincpu; + required_device<z80_device> m_maincpu; void abc_hdc_io(address_map &map); void abc_hdc_mem(address_map &map); diff --git a/src/devices/bus/abcbus/lux21056.cpp b/src/devices/bus/abcbus/lux21056.cpp index 8ed2edcd3a2..b8c67ceb99a 100644 --- a/src/devices/bus/abcbus/lux21056.cpp +++ b/src/devices/bus/abcbus/lux21056.cpp @@ -247,32 +247,35 @@ WRITE_LINE_MEMBER( luxor_55_21056_device::write_sasi_msg ) // device_add_mconfig - add device configuration //------------------------------------------------- -MACHINE_CONFIG_START(luxor_55_21056_device::device_add_mconfig) - MCFG_DEVICE_ADD(Z80_TAG, Z80, XTAL(8'000'000)/2) - MCFG_DEVICE_PROGRAM_MAP(luxor_55_21056_mem) - MCFG_DEVICE_IO_MAP(luxor_55_21056_io) - MCFG_Z80_DAISY_CHAIN(daisy_chain) - - MCFG_DEVICE_ADD(Z80DMA_TAG, Z80DMA, XTAL(8'000'000)/2) - MCFG_Z80DMA_OUT_BUSREQ_CB(INPUTLINE(Z80_TAG, INPUT_LINE_HALT)) - MCFG_Z80DMA_OUT_INT_CB(INPUTLINE(Z80_TAG, INPUT_LINE_IRQ0)) - MCFG_Z80DMA_IN_MREQ_CB(READ8(*this, luxor_55_21056_device, memory_read_byte)) - MCFG_Z80DMA_OUT_MREQ_CB(WRITE8(*this, luxor_55_21056_device, memory_write_byte)) - MCFG_Z80DMA_IN_IORQ_CB(READ8(*this, luxor_55_21056_device, io_read_byte)) - MCFG_Z80DMA_OUT_IORQ_CB(WRITE8(*this, luxor_55_21056_device, io_write_byte)) - - MCFG_DEVICE_ADD(SASIBUS_TAG, SCSI_PORT, 0) - MCFG_SCSI_DATA_INPUT_BUFFER("sasi_data_in") - MCFG_SCSI_REQ_HANDLER(WRITELINE(*this, luxor_55_21056_device, write_sasi_req)) - MCFG_SCSI_IO_HANDLER(WRITELINE(*this, luxor_55_21056_device, write_sasi_io)) - MCFG_SCSI_CD_HANDLER(WRITELINE(*this, luxor_55_21056_device, write_sasi_cd)) - MCFG_SCSI_MSG_HANDLER(WRITELINE(*this, luxor_55_21056_device, write_sasi_msg)) - MCFG_SCSI_BSY_HANDLER(WRITELINE(*this, luxor_55_21056_device, write_sasi_bsy)) - MCFG_SCSIDEV_ADD(SASIBUS_TAG ":" SCSI_PORT_DEVICE1, "harddisk", S1410, SCSI_ID_0) - - MCFG_SCSI_OUTPUT_LATCH_ADD("sasi_data_out", SASIBUS_TAG) - MCFG_DEVICE_ADD("sasi_data_in", INPUT_BUFFER, 0) -MACHINE_CONFIG_END +void luxor_55_21056_device::device_add_mconfig(machine_config &config) +{ + Z80(config, m_maincpu, XTAL(8'000'000)/2); + m_maincpu->set_memory_map(&luxor_55_21056_device::luxor_55_21056_mem); + m_maincpu->set_io_map(&luxor_55_21056_device::luxor_55_21056_io); + m_maincpu->set_daisy_config(daisy_chain); + + Z80DMA(config, m_dma, XTAL(8'000'000)/2); + m_dma->out_busreq_callback().set_inputline(m_maincpu, INPUT_LINE_HALT); + m_dma->out_int_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0); + m_dma->in_mreq_callback().set(FUNC(luxor_55_21056_device::memory_read_byte)); + m_dma->out_mreq_callback().set(FUNC(luxor_55_21056_device::memory_write_byte)); + m_dma->in_iorq_callback().set(FUNC(luxor_55_21056_device::io_read_byte)); + m_dma->out_iorq_callback().set(FUNC(luxor_55_21056_device::io_write_byte)); + + SCSI_PORT(config, m_sasibus); + m_sasibus->set_data_input_buffer(m_sasi_data_in); + m_sasibus->req_handler().set(FUNC(luxor_55_21056_device::write_sasi_req)); + m_sasibus->io_handler().set(FUNC(luxor_55_21056_device::write_sasi_io)); + m_sasibus->cd_handler().set(FUNC(luxor_55_21056_device::write_sasi_cd)); + m_sasibus->msg_handler().set(FUNC(luxor_55_21056_device::write_sasi_msg)); + m_sasibus->bsy_handler().set(FUNC(luxor_55_21056_device::write_sasi_bsy)); + m_sasibus->set_slot_device(1, "harddisk", S1410, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_0)); + + OUTPUT_LATCH(config, m_sasi_data_out); + m_sasibus->set_output_latch(*m_sasi_data_out); + + INPUT_BUFFER(config, m_sasi_data_in); +} //------------------------------------------------- diff --git a/src/devices/bus/abcbus/lux21056.h b/src/devices/bus/abcbus/lux21056.h index 8961f8864a6..7103fa5ba9c 100644 --- a/src/devices/bus/abcbus/lux21056.h +++ b/src/devices/bus/abcbus/lux21056.h @@ -80,7 +80,7 @@ private: void luxor_55_21056_io(address_map &map); void luxor_55_21056_mem(address_map &map); - required_device<cpu_device> m_maincpu; + required_device<z80_device> m_maincpu; required_device<z80dma_device> m_dma; required_device<scsi_port_device> m_sasibus; required_device<output_latch_device> m_sasi_data_out; diff --git a/src/devices/bus/abcbus/lux4105.cpp b/src/devices/bus/abcbus/lux4105.cpp index f8b9e571a7c..1d00d071fc8 100644 --- a/src/devices/bus/abcbus/lux4105.cpp +++ b/src/devices/bus/abcbus/lux4105.cpp @@ -72,18 +72,21 @@ WRITE_LINE_MEMBER( luxor_4105_device::write_sasi_cd ) // device_add_mconfig - add device configuration //------------------------------------------------- -MACHINE_CONFIG_START(luxor_4105_device::device_add_mconfig) - MCFG_DEVICE_ADD(SASIBUS_TAG, SCSI_PORT, 0) - MCFG_SCSI_DATA_INPUT_BUFFER("sasi_data_in") - MCFG_SCSI_BSY_HANDLER(WRITELINE(*this, luxor_4105_device, write_sasi_bsy)) - MCFG_SCSI_REQ_HANDLER(WRITELINE(*this, luxor_4105_device, write_sasi_req)) - MCFG_SCSI_CD_HANDLER(WRITELINE(*this, luxor_4105_device, write_sasi_cd)) - MCFG_SCSI_IO_HANDLER(WRITELINE(*this, luxor_4105_device, write_sasi_io)) - MCFG_SCSIDEV_ADD(SASIBUS_TAG ":" SCSI_PORT_DEVICE1, "harddisk", S1410, SCSI_ID_0) - - MCFG_SCSI_OUTPUT_LATCH_ADD("sasi_data_out", SASIBUS_TAG) - MCFG_DEVICE_ADD("sasi_data_in", INPUT_BUFFER, 0) -MACHINE_CONFIG_END +void luxor_4105_device::device_add_mconfig(machine_config &config) +{ + SCSI_PORT(config, m_sasibus); + m_sasibus->set_data_input_buffer(m_sasi_data_in); + m_sasibus->bsy_handler().set(FUNC(luxor_4105_device::write_sasi_bsy)); + m_sasibus->req_handler().set(FUNC(luxor_4105_device::write_sasi_req)); + m_sasibus->cd_handler().set(FUNC(luxor_4105_device::write_sasi_cd)); + m_sasibus->io_handler().set(FUNC(luxor_4105_device::write_sasi_io)); + m_sasibus->set_slot_device(1, "harddisk", S1410, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_0)); + + OUTPUT_LATCH(config, m_sasi_data_out); + m_sasibus->set_output_latch(*m_sasi_data_out); + + INPUT_BUFFER(config, m_sasi_data_in); +} //------------------------------------------------- diff --git a/src/devices/bus/acorn/atom/econet.cpp b/src/devices/bus/acorn/atom/econet.cpp index 58f2fedee90..210ca895445 100644 --- a/src/devices/bus/acorn/atom/econet.cpp +++ b/src/devices/bus/acorn/atom/econet.cpp @@ -10,6 +10,7 @@ #include "emu.h" #include "econet.h" +#include "bus/econet/e01.h" //************************************************************************** // DEVICE DEFINITIONS @@ -21,18 +22,22 @@ DEFINE_DEVICE_TYPE(ATOM_ECONET, atom_econet_device, "atom_econet", "Acorn Atom E // device_add_mconfig - add device configuration //------------------------------------------------- -MACHINE_CONFIG_START(atom_econet_device::device_add_mconfig) +void atom_econet_device::device_add_mconfig(machine_config &config) +{ /* econet */ - MCFG_DEVICE_ADD(m_adlc, MC6854, 0) - MCFG_MC6854_OUT_TXD_CB(WRITELINE(m_econet, econet_device, host_data_w)) - MCFG_MC6854_OUT_IRQ_CB(WRITELINE(*this, atom_econet_device, bus_irq_w)) + MC6854(config, m_adlc); + m_adlc->out_txd_cb().set(m_econet, FUNC(econet_device::host_data_w)); + m_adlc->out_irq_cb().set(FUNC(atom_econet_device::bus_irq_w)); ECONET(config, m_econet, 0); m_econet->clk_wr_callback().set(m_adlc, FUNC(mc6854_device::txc_w)); m_econet->clk_wr_callback().append(m_adlc, FUNC(mc6854_device::rxc_w)); m_econet->data_wr_callback().set(m_adlc, FUNC(mc6854_device::set_rx)); - MCFG_ECONET_SLOT_ADD("econet254", 254, econet_devices, nullptr) -MACHINE_CONFIG_END + + econet_slot_device &slot(ECONET_SLOT(config, "econet254", 0)); + econet_devices(slot); + slot.set_slot(254); +} //************************************************************************** // LIVE DEVICE diff --git a/src/devices/bus/acorn/cms/4080term.cpp b/src/devices/bus/acorn/cms/4080term.cpp index d4e5514629d..0bf9cf5a7ea 100644 --- a/src/devices/bus/acorn/cms/4080term.cpp +++ b/src/devices/bus/acorn/cms/4080term.cpp @@ -146,7 +146,7 @@ void cms_4080term_device::device_start() address_space &space = m_bus->memspace(); space.install_readwrite_handler(0xfd20, 0xfd2f, read8_delegate(FUNC(ef9345_device::data_r), m_ef9345.target()), write8_delegate(FUNC(ef9345_device::data_w), m_ef9345.target())); - space.install_readwrite_handler(0xfd30, 0xfd3f, read8_delegate(FUNC(via6522_device::read), m_via.target()), write8_delegate(FUNC(via6522_device::write), m_via.target())); + space.install_readwrite_handler(0xfd30, 0xfd3f, read8sm_delegate(FUNC(via6522_device::read), m_via.target()), write8sm_delegate(FUNC(via6522_device::write), m_via.target())); space.install_readwrite_handler(0xfd40, 0xfd4f, read8_delegate(FUNC(mos6551_device::read), m_acia.target()), write8_delegate(FUNC(mos6551_device::write), m_acia.target())); uint8_t *FNT = memregion("ef9345")->base(); diff --git a/src/devices/bus/acorn/system/econet.cpp b/src/devices/bus/acorn/system/econet.cpp index 9c731593baa..d6613f35bf7 100644 --- a/src/devices/bus/acorn/system/econet.cpp +++ b/src/devices/bus/acorn/system/econet.cpp @@ -23,18 +23,22 @@ DEFINE_DEVICE_TYPE(ACORN_ECONET, acorn_econet_device, "acorn_econet", "Acorn Eco // device_add_mconfig - add device configuration //------------------------------------------------- -MACHINE_CONFIG_START(acorn_econet_device::device_add_mconfig) +void acorn_econet_device::device_add_mconfig(machine_config &config) +{ /* econet */ - MCFG_DEVICE_ADD(m_adlc, MC6854, 0) - MCFG_MC6854_OUT_TXD_CB(WRITELINE(m_econet, econet_device, host_data_w)) - MCFG_MC6854_OUT_IRQ_CB(WRITELINE(*this, acorn_econet_device, bus_irq_w)) + MC6854(config, m_adlc); + m_adlc->out_txd_cb().set(m_econet, FUNC(econet_device::host_data_w)); + m_adlc->out_irq_cb().set(FUNC(acorn_econet_device::bus_irq_w)); ECONET(config, m_econet, 0); m_econet->clk_wr_callback().set(m_adlc, FUNC(mc6854_device::txc_w)); m_econet->clk_wr_callback().append(m_adlc, FUNC(mc6854_device::rxc_w)); m_econet->data_wr_callback().set(m_adlc, FUNC(mc6854_device::set_rx)); - MCFG_ECONET_SLOT_ADD("econet254", 254, econet_devices, nullptr) -MACHINE_CONFIG_END + + econet_slot_device &slot(ECONET_SLOT(config, "econet254", 0)); + econet_devices(slot); + slot.set_slot(254); +} //************************************************************************** // LIVE DEVICE diff --git a/src/devices/bus/acorn/system/vib.cpp b/src/devices/bus/acorn/system/vib.cpp index 89d48b6fedb..f65cad7bb9b 100644 --- a/src/devices/bus/acorn/system/vib.cpp +++ b/src/devices/bus/acorn/system/vib.cpp @@ -93,7 +93,7 @@ void acorn_vib_device::device_reset() { address_space &space = m_bus->memspace(); - space.install_readwrite_handler(0x0c00, 0x0c0f, 0, 0x10, 0, read8_delegate(FUNC(via6522_device::read), m_via6522.target()), write8_delegate(FUNC(via6522_device::write), m_via6522.target())); + space.install_readwrite_handler(0x0c00, 0x0c0f, 0, 0x10, 0, read8sm_delegate(FUNC(via6522_device::read), m_via6522.target()), write8sm_delegate(FUNC(via6522_device::write), m_via6522.target())); space.install_readwrite_handler(0x0c20, 0x0c21, 0, 0x1e, 0, read8_delegate(FUNC(acia6850_device::read), m_acia.target()), write8_delegate(FUNC(acia6850_device::write), m_acia.target())); space.install_readwrite_handler(0x0c40, 0x0c43, 0, 0x1c, 0, read8_delegate(FUNC(i8255_device::read), m_ppi8255.target()), write8_delegate(FUNC(i8255_device::write), m_ppi8255.target())); } diff --git a/src/devices/bus/amiga/zorro/a590.cpp b/src/devices/bus/amiga/zorro/a590.cpp index bc651941b0e..32328b2f944 100644 --- a/src/devices/bus/amiga/zorro/a590.cpp +++ b/src/devices/bus/amiga/zorro/a590.cpp @@ -114,18 +114,21 @@ ioport_constructor a2091_device::device_input_ports() const // device_add_mconfig - add device configuration //------------------------------------------------- -MACHINE_CONFIG_START(dmac_hdc_device::device_add_mconfig) - MCFG_DMAC_ADD("dmac", 0) - MCFG_DMAC_SCSI_READ_HANDLER(READ8(*this, dmac_hdc_device, dmac_scsi_r)) - MCFG_DMAC_SCSI_WRITE_HANDLER(WRITE8(*this, dmac_hdc_device, dmac_scsi_w)) - MCFG_DMAC_INT_HANDLER(WRITELINE(*this, dmac_hdc_device, dmac_int_w)) - MCFG_DMAC_CFGOUT_HANDLER(WRITELINE(*this, dmac_hdc_device, dmac_cfgout_w)) - MCFG_DEVICE_ADD("scsi", SCSI_PORT, 0) - MCFG_SCSIDEV_ADD("scsi:" SCSI_PORT_DEVICE1, "harddisk", SCSIHD, SCSI_ID_1) - MCFG_DEVICE_ADD("wd33c93", WD33C93, 0) - MCFG_LEGACY_SCSI_PORT("scsi") - MCFG_WD33C93_IRQ_CB(WRITELINE(*this, dmac_hdc_device, scsi_irq_w)) -MACHINE_CONFIG_END +void dmac_hdc_device::device_add_mconfig(machine_config &config) +{ + amiga_dmac_device &dmac(AMIGA_DMAC(config, "dmac", 0)); + dmac.scsi_read_handler().set(FUNC(dmac_hdc_device::dmac_scsi_r)); + dmac.scsi_write_handler().set(FUNC(dmac_hdc_device::dmac_scsi_w)); + dmac.int_handler().set(FUNC(dmac_hdc_device::dmac_int_w)); + dmac.cfgout_handler().set(FUNC(dmac_hdc_device::dmac_cfgout_w)); + + scsi_port_device &scsi(SCSI_PORT(config, "scsi")); + scsi.set_slot_device(1, "harddisk", SCSIHD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_1)); + + wd33c93_device &scsi_ctrl(WD33C93(config, "wd33c93")); + scsi_ctrl.set_scsi_port("scsi"); + scsi_ctrl.irq_cb().set(FUNC(dmac_hdc_device::scsi_irq_w)); +} //------------------------------------------------- diff --git a/src/devices/bus/bbc/tube/tube_casper.cpp b/src/devices/bus/bbc/tube/tube_casper.cpp index 393305616b8..f6b052d8913 100644 --- a/src/devices/bus/bbc/tube/tube_casper.cpp +++ b/src/devices/bus/bbc/tube/tube_casper.cpp @@ -123,10 +123,10 @@ void bbc_tube_casper_device::device_reset() READ8_MEMBER(bbc_tube_casper_device::host_r) { - return m_via6522_0->read(space, offset & 0xf); + return m_via6522_0->read(offset & 0xf); } WRITE8_MEMBER(bbc_tube_casper_device::host_w) { - m_via6522_0->write(space, offset & 0xf, data); + m_via6522_0->write(offset & 0xf, data); } diff --git a/src/devices/bus/bbc/tube/tube_zep100.cpp b/src/devices/bus/bbc/tube/tube_zep100.cpp index 3687cf282bb..2096019c671 100644 --- a/src/devices/bus/bbc/tube/tube_zep100.cpp +++ b/src/devices/bus/bbc/tube/tube_zep100.cpp @@ -57,30 +57,31 @@ ROM_END // device_add_mconfig - add device configuration //------------------------------------------------- -MACHINE_CONFIG_START(bbc_tube_zep100_device::device_add_mconfig) - MCFG_DEVICE_ADD("z80", Z80, XTAL(4'000'000)) - MCFG_DEVICE_PROGRAM_MAP(tube_zep100_mem) - MCFG_DEVICE_IO_MAP(tube_zep100_io) - - MCFG_DEVICE_ADD("via", VIA6522, XTAL(4'000'000) / 2) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, bbc_tube_zep100_device, via_pb_w)) - MCFG_VIA6522_CB2_HANDLER(WRITELINE("ppi", i8255_device, pc2_w)) - MCFG_VIA6522_CA2_HANDLER(WRITELINE("ppi", i8255_device, pc6_w)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(DEVICE_SELF_OWNER, bbc_tube_slot_device, irq_w)) - - MCFG_DEVICE_ADD("ppi", I8255A, 0) - MCFG_I8255_OUT_PORTA_CB(WRITE8("via", via6522_device, write_pa)) - MCFG_I8255_IN_PORTB_CB(READ8(*this, bbc_tube_zep100_device, ppi_pb_r)) - MCFG_I8255_OUT_PORTC_CB(WRITE8(*this, bbc_tube_zep100_device, ppi_pc_w)) +void bbc_tube_zep100_device::device_add_mconfig(machine_config &config) +{ + Z80(config, m_z80, XTAL(4'000'000)); + m_z80->set_addrmap(AS_PROGRAM, &bbc_tube_zep100_device::tube_zep100_mem); + m_z80->set_addrmap(AS_IO, &bbc_tube_zep100_device::tube_zep100_io); + + VIA6522(config, m_via, XTAL(4'000'000) / 2); + m_via->writepb_handler().set(FUNC(bbc_tube_zep100_device::via_pb_w)); + m_via->cb2_handler().set(m_ppi, FUNC(i8255_device::pc2_w)); + m_via->ca2_handler().set(m_ppi, FUNC(i8255_device::pc6_w)); + m_via->irq_handler().set(DEVICE_SELF_OWNER, FUNC(bbc_tube_slot_device::irq_w)); + + I8255A(config, m_ppi, 0); + m_ppi->out_pa_callback().set(m_via, FUNC(via6522_device::write_pa)); + m_ppi->in_pb_callback().set(FUNC(bbc_tube_zep100_device::ppi_pb_r)); + m_ppi->out_pc_callback().set(FUNC(bbc_tube_zep100_device::ppi_pc_w)); /* internal ram */ - MCFG_RAM_ADD(RAM_TAG) - MCFG_RAM_DEFAULT_SIZE("64K") - MCFG_RAM_DEFAULT_VALUE(0x00) + RAM(config, m_ram); + m_ram->set_default_size("64K"); + m_ram->set_default_value(0x00); /* software lists */ - MCFG_SOFTWARE_LIST_ADD("flop_ls_torch", "bbc_flop_torch") -MACHINE_CONFIG_END + SOFTWARE_LIST(config, "flop_ls_torch").set_type("bbc_flop_torch", SOFTWARE_LIST_ORIGINAL_SYSTEM); +} //------------------------------------------------- // rom_region - device-specific ROM region @@ -139,7 +140,7 @@ void bbc_tube_zep100_device::device_reset() READ8_MEMBER(bbc_tube_zep100_device::host_r) { - return m_via->read(space, offset & 0x0f); + return m_via->read(offset & 0x0f); } WRITE8_MEMBER(bbc_tube_zep100_device::host_w) @@ -147,7 +148,7 @@ WRITE8_MEMBER(bbc_tube_zep100_device::host_w) if (offset & 0x10) m_z80->reset(); - m_via->write(space, offset & 0x0f, data); + m_via->write(offset & 0x0f, data); } diff --git a/src/devices/bus/bbc/tube/tube_zep100.h b/src/devices/bus/bbc/tube/tube_zep100.h index af6cae2d78d..5f6ddca8b09 100644 --- a/src/devices/bus/bbc/tube/tube_zep100.h +++ b/src/devices/bus/bbc/tube/tube_zep100.h @@ -45,7 +45,7 @@ protected: virtual DECLARE_WRITE8_MEMBER( host_w ) override; private: - required_device<cpu_device> m_z80; + required_device<z80_device> m_z80; required_device<via6522_device> m_via; required_device<i8255_device> m_ppi; required_device<ram_device> m_ram; diff --git a/src/devices/bus/c64/exp.cpp b/src/devices/bus/c64/exp.cpp index 7b11051da9b..521bc3e041f 100644 --- a/src/devices/bus/c64/exp.cpp +++ b/src/devices/bus/c64/exp.cpp @@ -295,6 +295,16 @@ int c64_expansion_slot_device::exrom_r(offs_t offset, int sphi2, int ba, int rw, } +void c64_expansion_slot_device::set_passthrough() +{ + irq_wr_callback().set(DEVICE_SELF_OWNER, FUNC(c64_expansion_slot_device::irq_w)); + nmi_wr_callback().set(DEVICE_SELF_OWNER, FUNC(c64_expansion_slot_device::nmi_w)); + reset_wr_callback().set(DEVICE_SELF_OWNER, FUNC(c64_expansion_slot_device::reset_w)); + cd_rd_callback().set(DEVICE_SELF_OWNER, FUNC(c64_expansion_slot_device::dma_cd_r)); + cd_wr_callback().set(DEVICE_SELF_OWNER, FUNC(c64_expansion_slot_device::dma_cd_w)); + dma_wr_callback().set(DEVICE_SELF_OWNER, FUNC(c64_expansion_slot_device::dma_w)); +} + //------------------------------------------------- // SLOT_INTERFACE( c64_expansion_cards ) //------------------------------------------------- diff --git a/src/devices/bus/c64/exp.h b/src/devices/bus/c64/exp.h index ff3c8eadbab..403625bf220 100644 --- a/src/devices/bus/c64/exp.h +++ b/src/devices/bus/c64/exp.h @@ -101,6 +101,16 @@ class c64_expansion_slot_device : public device_t, { public: // construction/destruction + template <typename T> + c64_expansion_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, T &&opts, const char *dflt) + : c64_expansion_slot_device(mconfig, tag, owner, (uint32_t)0) + { + option_reset(); + opts(*this); + set_default_option(dflt); + set_fixed(false); + } + c64_expansion_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); template <class Object> devcb_base &set_irq_wr_callback(Object &&cb) { return m_write_irq.set_callback(std::forward<Object>(cb)); } @@ -109,6 +119,12 @@ public: template <class Object> devcb_base &set_cd_rd_callback(Object &&cb) { return m_read_dma_cd.set_callback(std::forward<Object>(cb)); } template <class Object> devcb_base &set_cd_wr_callback(Object &&cb) { return m_write_dma_cd.set_callback(std::forward<Object>(cb)); } template <class Object> devcb_base &set_dma_wr_callback(Object &&cb) { return m_write_dma.set_callback(std::forward<Object>(cb)); } + auto irq_wr_callback() { return m_write_irq.bind(); } + auto nmi_wr_callback() { return m_write_nmi.bind(); } + auto reset_wr_callback() { return m_write_reset.bind(); } + auto cd_rd_callback() { return m_read_dma_cd.bind(); } + auto cd_wr_callback() { return m_write_dma_cd.bind(); } + auto dma_wr_callback() { return m_write_dma.bind(); } // computer interface uint8_t cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2); @@ -127,6 +143,8 @@ public: int dotclock() { return phi2() * 8; } int hiram() { return m_hiram; } + void set_passthrough(); + protected: // device-level overrides virtual void device_validity_check(validity_checker &valid) const override; diff --git a/src/devices/bus/c64/ieee488.cpp b/src/devices/bus/c64/ieee488.cpp index ef33798bdfc..ee07023f2cc 100644 --- a/src/devices/bus/c64/ieee488.cpp +++ b/src/devices/bus/c64/ieee488.cpp @@ -141,18 +141,22 @@ WRITE8_MEMBER( c64_ieee488_device::tpi_pc_w ) // device_add_mconfig - add device configuration //------------------------------------------------- -MACHINE_CONFIG_START(c64_ieee488_device::device_add_mconfig) - MCFG_DEVICE_ADD(MOS6525_TAG, TPI6525, 0) - MCFG_TPI6525_IN_PA_CB(READ8(*this, c64_ieee488_device, tpi_pa_r)) - MCFG_TPI6525_OUT_PA_CB(WRITE8(*this, c64_ieee488_device, tpi_pa_w)) - MCFG_TPI6525_IN_PB_CB(READ8(IEEE488_TAG, ieee488_device, dio_r)) - MCFG_TPI6525_OUT_PB_CB(WRITE8(IEEE488_TAG, ieee488_device, host_dio_w)) - MCFG_TPI6525_IN_PC_CB(READ8(*this, c64_ieee488_device, tpi_pc_r)) - MCFG_TPI6525_OUT_PC_CB(WRITE8(*this, c64_ieee488_device, tpi_pc_w)) - - MCFG_CBM_IEEE488_ADD(nullptr) - MCFG_C64_PASSTHRU_EXPANSION_SLOT_ADD() -MACHINE_CONFIG_END +void c64_ieee488_device::device_add_mconfig(machine_config &config) +{ + TPI6525(config, m_tpi, 0); + m_tpi->in_pa_cb().set(FUNC(c64_ieee488_device::tpi_pa_r)); + m_tpi->out_pa_cb().set(FUNC(c64_ieee488_device::tpi_pa_w)); + m_tpi->in_pb_cb().set(m_bus, FUNC(ieee488_device::dio_r)); + m_tpi->out_pb_cb().set(m_bus, FUNC(ieee488_device::host_dio_w)); + m_tpi->in_pc_cb().set(FUNC(c64_ieee488_device::tpi_pc_r)); + m_tpi->out_pc_cb().set(FUNC(c64_ieee488_device::tpi_pc_w)); + + IEEE488(config, m_bus, 0); + ieee488_slot_device::add_cbm_defaults(config, nullptr); + + C64_EXPANSION_SLOT(config, m_exp, c64_expansion_cards, nullptr); + m_exp->set_passthrough(); +} diff --git a/src/devices/bus/c64/magic_voice.cpp b/src/devices/bus/c64/magic_voice.cpp index 8ec79474d50..d7223c4efd3 100644 --- a/src/devices/bus/c64/magic_voice.cpp +++ b/src/devices/bus/c64/magic_voice.cpp @@ -219,29 +219,31 @@ WRITE_LINE_MEMBER( c64_magic_voice_cartridge_device::apd_w ) // device_add_mconfig - add device configuration //------------------------------------------------- -MACHINE_CONFIG_START(c64_magic_voice_cartridge_device::device_add_mconfig) - MCFG_DEVICE_ADD(MOS6525_TAG, TPI6525, 0) - MCFG_TPI6525_OUT_IRQ_CB(WRITELINE(*this, c64_magic_voice_cartridge_device, tpi_irq_w)) - MCFG_TPI6525_IN_PA_CB(READ8(*this, c64_magic_voice_cartridge_device, tpi_pa_r)) - MCFG_TPI6525_OUT_PA_CB(WRITE8(*this, c64_magic_voice_cartridge_device, tpi_pa_w)) - MCFG_TPI6525_IN_PB_CB(READ8(*this, c64_magic_voice_cartridge_device, tpi_pb_r)) - MCFG_TPI6525_OUT_PB_CB(WRITE8(*this, c64_magic_voice_cartridge_device, tpi_pb_w)) - MCFG_TPI6525_OUT_CA_CB(WRITELINE(*this, c64_magic_voice_cartridge_device, tpi_ca_w)) - MCFG_TPI6525_OUT_CA_CB(WRITELINE(*this, c64_magic_voice_cartridge_device, tpi_cb_w)) - - MCFG_DEVICE_ADD(CD40105_TAG, CD40105, 0) - MCFG_40105_DATA_IN_READY_CB(WRITELINE(MOS6525_TAG, tpi6525_device, i3_w)) +void c64_magic_voice_cartridge_device::device_add_mconfig(machine_config &config) +{ + TPI6525(config, m_tpi, 0); + m_tpi->out_irq_cb().set(FUNC(c64_magic_voice_cartridge_device::tpi_irq_w)); + m_tpi->in_pa_cb().set(FUNC(c64_magic_voice_cartridge_device::tpi_pa_r)); + m_tpi->out_pa_cb().set(FUNC(c64_magic_voice_cartridge_device::tpi_pa_w)); + m_tpi->in_pb_cb().set(FUNC(c64_magic_voice_cartridge_device::tpi_pb_r)); + m_tpi->out_pb_cb().set(FUNC(c64_magic_voice_cartridge_device::tpi_pb_w)); + m_tpi->out_ca_cb().set(FUNC(c64_magic_voice_cartridge_device::tpi_ca_w)); + m_tpi->out_cb_cb().set(FUNC(c64_magic_voice_cartridge_device::tpi_cb_w)); + + CD40105(config, m_fifo, 0); + m_fifo->in_ready_cb().set(m_tpi, FUNC(tpi6525_device::i3_w)); SPEAKER(config, "mono").front_center(); - MCFG_DEVICE_ADD(T6721A_TAG, T6721A, XTAL(640'000)) - MCFG_T6721A_EOS_HANDLER(WRITELINE(MOS6525_TAG, tpi6525_device, i2_w)) - MCFG_T6721A_PHI2_HANDLER(WRITELINE(DEVICE_SELF, c64_magic_voice_cartridge_device, phi2_w)) - MCFG_T6721A_DTRD_HANDLER(WRITELINE(DEVICE_SELF, c64_magic_voice_cartridge_device, dtrd_w)) - MCFG_T6721A_APD_HANDLER(WRITELINE(DEVICE_SELF, c64_magic_voice_cartridge_device, apd_w)) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) - - MCFG_C64_PASSTHRU_EXPANSION_SLOT_ADD() -MACHINE_CONFIG_END + T6721A(config, m_vslsi, XTAL(640'000)); + m_vslsi->eos_handler().set(m_tpi, FUNC(tpi6525_device::i2_w)); + m_vslsi->phi2_handler().set(FUNC(c64_magic_voice_cartridge_device::phi2_w)); + m_vslsi->dtrd_handler().set(FUNC(c64_magic_voice_cartridge_device::dtrd_w)); + m_vslsi->apd_handler().set(FUNC(c64_magic_voice_cartridge_device::apd_w)); + m_vslsi->add_route(ALL_OUTPUTS, "mono", 0.25); + + C64_EXPANSION_SLOT(config, m_exp, c64_expansion_cards, nullptr); + m_exp->set_passthrough(); +} diff --git a/src/devices/bus/cbmiec/c1541.cpp b/src/devices/bus/cbmiec/c1541.cpp index 13c866eac92..17f2ff59084 100644 --- a/src/devices/bus/cbmiec/c1541.cpp +++ b/src/devices/bus/cbmiec/c1541.cpp @@ -751,16 +751,6 @@ WRITE_LINE_MEMBER( c1541_device_base::byte_w ) //------------------------------------------------- -// SLOT_INTERFACE( c1540_floppies ) -//------------------------------------------------- - -static void c1540_floppies(device_slot_interface &device) -{ - device.option_add("525ssqd", ALPS_3255190X); -} - - -//------------------------------------------------- // FLOPPY_FORMATS( floppy_formats ) //------------------------------------------------- @@ -815,72 +805,79 @@ WRITE8_MEMBER( c1541_prologic_dos_classic_device::pia_pb_w ) // device_add_mconfig - add device configuration //------------------------------------------------- -MACHINE_CONFIG_START(c1541_device_base::device_add_mconfig) - MCFG_DEVICE_ADD(M6502_TAG, M6502, XTAL(16'000'000)/16) - MCFG_DEVICE_PROGRAM_MAP(c1541_mem) - MCFG_QUANTUM_PERFECT_CPU(M6502_TAG) - - MCFG_DEVICE_ADD(M6522_0_TAG, VIA6522, XTAL(16'000'000)/16) - MCFG_VIA6522_READPA_HANDLER(READ8(*this, c1541_device_base, via0_pa_r)) - MCFG_VIA6522_READPB_HANDLER(READ8(*this, c1541_device_base, via0_pb_r)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, c1541_device_base, via0_pa_w)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, c1541_device_base, via0_pb_w)) - MCFG_VIA6522_CB2_HANDLER(WRITELINE(*this, c1541_device_base, via0_ca2_w)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, c1541_device_base, via0_irq_w)) - - MCFG_DEVICE_ADD(M6522_1_TAG, VIA6522, XTAL(16'000'000)/16) - MCFG_VIA6522_READPA_HANDLER(READ8(C64H156_TAG, c64h156_device, yb_r)) - MCFG_VIA6522_READPB_HANDLER(READ8(*this, c1541_device_base, via1_pb_r)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(C64H156_TAG, c64h156_device, yb_w)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, c1541_device_base, via1_pb_w)) - MCFG_VIA6522_CA2_HANDLER(WRITELINE(C64H156_TAG, c64h156_device, soe_w)) - MCFG_VIA6522_CB2_HANDLER(WRITELINE(C64H156_TAG, c64h156_device, oe_w)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, c1541_device_base, via1_irq_w)) - - MCFG_DEVICE_ADD(C64H156_TAG, C64H156, XTAL(16'000'000)) - MCFG_64H156_ATN_CALLBACK(WRITELINE(*this, c1541_device_base, atn_w)) - MCFG_64H156_BYTE_CALLBACK(WRITELINE(*this, c1541_device_base, byte_w)) - MCFG_FLOPPY_DRIVE_ADD_FIXED(C64H156_TAG":0", c1540_floppies, "525ssqd", c1541_device_base::floppy_formats) -MACHINE_CONFIG_END - - -MACHINE_CONFIG_START(c1541c_device::device_add_mconfig) - c1541_device_base::device_add_mconfig(config); -MACHINE_CONFIG_END +void c1541_device_base::device_add_mconfig(machine_config &config) +{ + M6502(config, m_maincpu, XTAL(16'000'000)/16); + m_maincpu->set_addrmap(AS_PROGRAM, &c1541_device_base::c1541_mem); + config.m_perfect_cpu_quantum = subtag(M6502_TAG); + + VIA6522(config, m_via0, XTAL(16'000'000)/16); + m_via0->readpa_handler().set(FUNC(c1541_device_base::via0_pa_r)); + m_via0->readpb_handler().set(FUNC(c1541_device_base::via0_pb_r)); + m_via0->writepa_handler().set(FUNC(c1541_device_base::via0_pa_w)); + m_via0->writepb_handler().set(FUNC(c1541_device_base::via0_pb_w)); + m_via0->cb2_handler().set(FUNC(c1541_device_base::via0_ca2_w)); + m_via0->irq_handler().set(FUNC(c1541_device_base::via0_irq_w)); + + VIA6522(config, m_via1, XTAL(16'000'000)/16); + m_via1->readpa_handler().set(C64H156_TAG, FUNC(c64h156_device::yb_r)); + m_via1->readpb_handler().set(FUNC(c1541_device_base::via1_pb_r)); + m_via1->writepa_handler().set(C64H156_TAG, FUNC(c64h156_device::yb_w)); + m_via1->writepb_handler().set(FUNC(c1541_device_base::via1_pb_w)); + m_via1->ca2_handler().set(C64H156_TAG, FUNC(c64h156_device::soe_w)); + m_via1->cb2_handler().set(C64H156_TAG, FUNC(c64h156_device::oe_w)); + m_via1->irq_handler().set(FUNC(c1541_device_base::via1_irq_w)); + + C64H156(config, m_ga, XTAL(16'000'000)); + m_ga->atn_callback().set(FUNC(c1541_device_base::atn_w)); + m_ga->byte_callback().set(FUNC(c1541_device_base::byte_w)); + + floppy_connector &connector(FLOPPY_CONNECTOR(config, C64H156_TAG":0", 0)); + connector.option_add("525ssqd", ALPS_3255190X); + connector.set_default_option("525ssqd"); + connector.set_fixed(true); + connector.set_formats(c1541_device_base::floppy_formats); +} -MACHINE_CONFIG_START(c1541_dolphin_dos_device::device_add_mconfig) +void c1541c_device::device_add_mconfig(machine_config &config) +{ c1541_device_base::device_add_mconfig(config); - - MCFG_DEVICE_MODIFY(M6502_TAG) - MCFG_DEVICE_PROGRAM_MAP(c1541dd_mem) -MACHINE_CONFIG_END +} -MACHINE_CONFIG_START(c1541_professional_dos_v1_device::device_add_mconfig) +void c1541_dolphin_dos_device::device_add_mconfig(machine_config &config) +{ c1541_device_base::device_add_mconfig(config); + m_maincpu->set_addrmap(AS_PROGRAM, &c1541_dolphin_dos_device::c1541dd_mem); +} - MCFG_DEVICE_MODIFY(M6502_TAG) - MCFG_DEVICE_PROGRAM_MAP(c1541pd_mem) -MACHINE_CONFIG_END + +void c1541_professional_dos_v1_device::device_add_mconfig(machine_config &config) +{ + c1541_device_base::device_add_mconfig(config); + m_maincpu->set_addrmap(AS_PROGRAM, &c1541_professional_dos_v1_device::c1541pd_mem); +} -MACHINE_CONFIG_START(c1541_prologic_dos_classic_device::device_add_mconfig) +void c1541_prologic_dos_classic_device::device_add_mconfig(machine_config &config) +{ c1541_device_base::device_add_mconfig(config); - MCFG_DEVICE_MODIFY(M6502_TAG) - MCFG_DEVICE_PROGRAM_MAP(c1541pdc_mem) + m_maincpu->set_addrmap(AS_PROGRAM, &c1541_prologic_dos_classic_device::c1541pdc_mem); - MCFG_DEVICE_ADD(MC6821_TAG, PIA6821, 0) - MCFG_PIA_READPB_HANDLER(READ8(*this, c1541_prologic_dos_classic_device, pia_pb_r)) - MCFG_PIA_WRITEPA_HANDLER(WRITE8(*this, c1541_prologic_dos_classic_device, pia_pa_w)) - MCFG_PIA_WRITEPB_HANDLER(WRITE8(*this, c1541_prologic_dos_classic_device, pia_pb_w)) - MCFG_PIA_CA2_HANDLER(WRITELINE(CENTRONICS_TAG, centronics_device, write_strobe)) + PIA6821(config, m_pia, 0); + m_pia->readpb_handler().set(FUNC(c1541_prologic_dos_classic_device::pia_pb_r)); + m_pia->writepa_handler().set(FUNC(c1541_prologic_dos_classic_device::pia_pa_w)); + m_pia->writepb_handler().set(FUNC(c1541_prologic_dos_classic_device::pia_pb_w)); + m_pia->ca2_handler().set(CENTRONICS_TAG, FUNC(centronics_device::write_strobe)); - MCFG_DEVICE_ADD(CENTRONICS_TAG, CENTRONICS, centronics_devices, "printer") - MCFG_CENTRONICS_ACK_HANDLER(WRITELINE(MC6821_TAG, pia6821_device, ca1_w)) - MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", CENTRONICS_TAG) -MACHINE_CONFIG_END + centronics_device ¢ronics(CENTRONICS(config, CENTRONICS_TAG, centronics_devices, "printer")); + centronics.ack_handler().set(MC6821_TAG, FUNC(pia6821_device::ca1_w)); + + output_latch_device ¢_data_out(OUTPUT_LATCH(config, "cent_data_out", 0)); + centronics.set_output_latch(cent_data_out); +} //------------------------------------------------- diff --git a/src/devices/bus/cbmiec/c1541.h b/src/devices/bus/cbmiec/c1541.h index 490d00614c9..473fda5d51b 100644 --- a/src/devices/bus/cbmiec/c1541.h +++ b/src/devices/bus/cbmiec/c1541.h @@ -65,6 +65,8 @@ protected: void c1541dd_mem(address_map &map); void c1541pd_mem(address_map &map); + required_device<m6502_device> m_maincpu; + private: enum { @@ -88,7 +90,6 @@ private: DECLARE_FLOPPY_FORMATS( floppy_formats ); - required_device<m6502_device> m_maincpu; required_device<via6522_device> m_via0; required_device<via6522_device> m_via1; required_device<c64h156_device> m_ga; @@ -226,7 +227,7 @@ protected: // ======================> c1541_dolphin_dos_device -class c1541_dolphin_dos_device : public c1541_device_base +class c1541_dolphin_dos_device : public c1541_device_base { public: // construction/destruction diff --git a/src/devices/bus/cbmiec/c1571.cpp b/src/devices/bus/cbmiec/c1571.cpp index 9b5ac3bb3ac..91fe7d4bd96 100644 --- a/src/devices/bus/cbmiec/c1571.cpp +++ b/src/devices/bus/cbmiec/c1571.cpp @@ -384,7 +384,7 @@ WRITE8_MEMBER( c1571cr_device::via0_pb_w ) READ8_MEMBER( c1571_device::via1_r ) { - uint8_t data = m_via1->read(space, offset); + uint8_t data = m_via1->read(offset); m_ga->ted_w(!m_1_2mhz); m_ga->ted_w(1); @@ -394,7 +394,7 @@ READ8_MEMBER( c1571_device::via1_r ) WRITE8_MEMBER( c1571_device::via1_w ) { - m_via1->write(space, offset, data); + m_via1->write(offset, data); m_ga->ted_w(!m_1_2mhz); m_ga->ted_w(1); @@ -561,16 +561,6 @@ WRITE_LINE_MEMBER( c1571_device::byte_w ) //------------------------------------------------- -// SLOT_INTERFACE( c1571_floppies ) -//------------------------------------------------- - -static void c1571_floppies(device_slot_interface &device) -{ - device.option_add("525qd", FLOPPY_525_QD); -} - - -//------------------------------------------------- // floppy_interface c1571_floppy_interface //------------------------------------------------- @@ -604,150 +594,87 @@ static void mini_chief_isa8_cards(device_slot_interface &device) // device_add_mconfig - add device configuration //------------------------------------------------- -MACHINE_CONFIG_START(c1570_device::device_add_mconfig) - MCFG_DEVICE_ADD(M6502_TAG, M6502, 16_MHz_XTAL / 16) - MCFG_DEVICE_PROGRAM_MAP(c1571_mem) - MCFG_QUANTUM_PERFECT_CPU(M6502_TAG) - - MCFG_DEVICE_ADD(M6522_0_TAG, VIA6522, 16_MHz_XTAL / 16) - MCFG_VIA6522_READPA_HANDLER(READ8(*this, c1571_device, via0_pa_r)) - MCFG_VIA6522_READPB_HANDLER(READ8(*this, c1571_device, via0_pb_r)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, c1571_device, via0_pa_w)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, c1571_device, via0_pb_w)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, c1571_device, via0_irq_w)) - - MCFG_DEVICE_ADD(M6522_1_TAG, VIA6522, 16_MHz_XTAL / 16) - MCFG_VIA6522_READPA_HANDLER(READ8(C64H156_TAG, c64h156_device, yb_r)) - MCFG_VIA6522_READPB_HANDLER(READ8(*this, c1571_device, via1_pb_r)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(C64H156_TAG, c64h156_device, yb_w)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, c1571_device, via1_pb_w)) - MCFG_VIA6522_CA2_HANDLER(WRITELINE(C64H156_TAG, c64h156_device, soe_w)) - MCFG_VIA6522_CB2_HANDLER(WRITELINE(C64H156_TAG, c64h156_device, oe_w)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, c1571_device, via1_irq_w)) - - MCFG_DEVICE_ADD(M6526_TAG, MOS6526, 16_MHz_XTAL / 16) - MCFG_MOS6526_IRQ_CALLBACK(WRITELINE(*this, c1571_device, cia_irq_w)) - MCFG_MOS6526_CNT_CALLBACK(WRITELINE(*this, c1571_device, cia_cnt_w)) - MCFG_MOS6526_SP_CALLBACK(WRITELINE(*this, c1571_device, cia_sp_w)) - MCFG_MOS6526_PB_INPUT_CALLBACK(READ8(*this, c1571_device, cia_pb_r)) - MCFG_MOS6526_PB_OUTPUT_CALLBACK(WRITE8(*this, c1571_device, cia_pb_w)) - MCFG_MOS6526_PC_CALLBACK(WRITELINE(*this, c1571_device, cia_pc_w)) - - MCFG_DEVICE_ADD(WD1770_TAG, WD1770, 16_MHz_XTAL / 2) - - MCFG_DEVICE_ADD(C64H156_TAG, C64H156, 16_MHz_XTAL) - MCFG_64H156_BYTE_CALLBACK(WRITELINE(*this, c1571_device, byte_w)) - MCFG_FLOPPY_DRIVE_ADD_FIXED(C64H156_TAG":0", c1571_floppies, "525qd", c1571_device::floppy_formats) -MACHINE_CONFIG_END - - -MACHINE_CONFIG_START(c1571_device::device_add_mconfig) - MCFG_DEVICE_ADD(M6502_TAG, M6502, 16_MHz_XTAL / 16) - MCFG_DEVICE_PROGRAM_MAP(c1571_mem) - MCFG_QUANTUM_PERFECT_CPU(M6502_TAG) - - MCFG_DEVICE_ADD(M6522_0_TAG, VIA6522, 16_MHz_XTAL / 16) - MCFG_VIA6522_READPA_HANDLER(READ8(*this, c1571_device, via0_pa_r)) - MCFG_VIA6522_READPB_HANDLER(READ8(*this, c1571_device, via0_pb_r)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, c1571_device, via0_pa_w)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, c1571_device, via0_pb_w)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, c1571_device, via0_irq_w)) - - MCFG_DEVICE_ADD(M6522_1_TAG, VIA6522, 16_MHz_XTAL / 16) - MCFG_VIA6522_READPA_HANDLER(READ8(C64H156_TAG, c64h156_device, yb_r)) - MCFG_VIA6522_READPB_HANDLER(READ8(*this, c1571_device, via1_pb_r)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(C64H156_TAG, c64h156_device, yb_w)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, c1571_device, via1_pb_w)) - MCFG_VIA6522_CA2_HANDLER(WRITELINE(C64H156_TAG, c64h156_device, soe_w)) - MCFG_VIA6522_CB2_HANDLER(WRITELINE(C64H156_TAG, c64h156_device, oe_w)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, c1571_device, via1_irq_w)) - - MCFG_DEVICE_ADD(M6526_TAG, MOS6526, 16_MHz_XTAL / 16) - MCFG_MOS6526_IRQ_CALLBACK(WRITELINE(*this, c1571_device, cia_irq_w)) - MCFG_MOS6526_CNT_CALLBACK(WRITELINE(*this, c1571_device, cia_cnt_w)) - MCFG_MOS6526_SP_CALLBACK(WRITELINE(*this, c1571_device, cia_sp_w)) - MCFG_MOS6526_PB_INPUT_CALLBACK(READ8(*this, c1571_device, cia_pb_r)) - MCFG_MOS6526_PB_OUTPUT_CALLBACK(WRITE8(*this, c1571_device, cia_pb_w)) - MCFG_MOS6526_PC_CALLBACK(WRITELINE(*this, c1571_device, cia_pc_w)) - - MCFG_DEVICE_ADD(WD1770_TAG, WD1770, 16_MHz_XTAL / 2) - - MCFG_DEVICE_ADD(C64H156_TAG, C64H156, 16_MHz_XTAL) - MCFG_64H156_BYTE_CALLBACK(WRITELINE(*this, c1571_device, byte_w)) - MCFG_FLOPPY_DRIVE_ADD_FIXED(C64H156_TAG":0", c1571_floppies, "525qd", c1571_device::floppy_formats) -MACHINE_CONFIG_END - - -MACHINE_CONFIG_START(c1571cr_device::device_add_mconfig) - MCFG_DEVICE_ADD(M6502_TAG, M6502, 16_MHz_XTAL / 16) - MCFG_DEVICE_PROGRAM_MAP(c1571_mem) - MCFG_QUANTUM_PERFECT_CPU(M6502_TAG) - - MCFG_DEVICE_ADD(M6522_0_TAG, VIA6522, 16_MHz_XTAL / 16) - MCFG_VIA6522_READPA_HANDLER(READ8(*this, c1571_device, via0_pa_r)) - MCFG_VIA6522_READPB_HANDLER(READ8(*this, c1571_device, via0_pb_r)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, c1571cr_device, via0_pa_w)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, c1571cr_device, via0_pb_w)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, c1571_device, via0_irq_w)) - - MCFG_DEVICE_ADD(M6522_1_TAG, VIA6522, 16_MHz_XTAL / 16) - MCFG_VIA6522_READPA_HANDLER(READ8(C64H156_TAG, c64h156_device, yb_r)) - MCFG_VIA6522_READPB_HANDLER(READ8(*this, c1571_device, via1_pb_r)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(C64H156_TAG, c64h156_device, yb_w)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, c1571_device, via1_pb_w)) - MCFG_VIA6522_CA2_HANDLER(WRITELINE(C64H156_TAG, c64h156_device, soe_w)) - MCFG_VIA6522_CB2_HANDLER(WRITELINE(C64H156_TAG, c64h156_device, oe_w)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, c1571_device, via1_irq_w)) +void c1571_device::add_base_mconfig(machine_config &config) +{ + M6502(config, m_maincpu, 16_MHz_XTAL / 16); + m_maincpu->set_addrmap(AS_PROGRAM, &c1571_device::c1571_mem); + config.m_perfect_cpu_quantum = subtag(M6502_TAG); + + VIA6522(config, m_via0, 16_MHz_XTAL / 16); + m_via0->readpa_handler().set(FUNC(c1571_device::via0_pa_r)); + m_via0->readpb_handler().set(FUNC(c1571_device::via0_pb_r)); + m_via0->writepa_handler().set(FUNC(c1571_device::via0_pa_w)); + m_via0->writepb_handler().set(FUNC(c1571_device::via0_pb_w)); + m_via0->irq_handler().set(FUNC(c1571_device::via0_irq_w)); + + VIA6522(config, m_via1, 16_MHz_XTAL / 16); + m_via1->readpa_handler().set(C64H156_TAG, FUNC(c64h156_device::yb_r)); + m_via1->readpb_handler().set(FUNC(c1571_device::via1_pb_r)); + m_via1->writepa_handler().set(C64H156_TAG, FUNC(c64h156_device::yb_w)); + m_via1->writepb_handler().set(FUNC(c1571_device::via1_pb_w)); + m_via1->ca2_handler().set(C64H156_TAG, FUNC(c64h156_device::soe_w)); + m_via1->cb2_handler().set(C64H156_TAG, FUNC(c64h156_device::oe_w)); + m_via1->irq_handler().set(FUNC(c1571_device::via1_irq_w)); + + WD1770(config, m_fdc, 16_MHz_XTAL / 2); + + C64H156(config, m_ga, 16_MHz_XTAL); + m_ga->byte_callback().set(FUNC(c1571_device::byte_w)); + + floppy_connector &connector(FLOPPY_CONNECTOR(config, C64H156_TAG":0", 0)); + connector.option_add("525qd", FLOPPY_525_QD); + connector.set_default_option("525qd"); + connector.set_fixed(true); + connector.set_formats(c1571_device::floppy_formats); +} + +void c1571_device::add_cia_mconfig(machine_config &config) +{ + MOS6526(config, m_cia, 16_MHz_XTAL / 16); + m_cia->irq_wr_callback().set(FUNC(c1571_device::cia_irq_w)); + m_cia->cnt_wr_callback().set(FUNC(c1571_device::cia_cnt_w)); + m_cia->sp_wr_callback().set(FUNC(c1571_device::cia_sp_w)); + m_cia->pb_rd_callback().set(FUNC(c1571_device::cia_pb_r)); + m_cia->pb_wr_callback().set(FUNC(c1571_device::cia_pb_w)); + m_cia->pc_wr_callback().set(FUNC(c1571_device::cia_pc_w)); +} + +void c1570_device::device_add_mconfig(machine_config &config) +{ + add_base_mconfig(config); + add_cia_mconfig(config); +} + + +void c1571_device::device_add_mconfig(machine_config &config) +{ + add_base_mconfig(config); + add_cia_mconfig(config); +} + + +void c1571cr_device::device_add_mconfig(machine_config &config) +{ + add_base_mconfig(config); + + m_via0->writepa_handler().set(FUNC(c1571cr_device::via0_pa_w)); + m_via0->writepb_handler().set(FUNC(c1571cr_device::via0_pb_w)); //MCFG_MOS5710_ADD(M5710_TAG, 16_MHz_XTAL / 16, 0) +} + - MCFG_DEVICE_ADD(WD1770_TAG, WD1770, 16_MHz_XTAL / 2) - - MCFG_DEVICE_ADD(C64H156_TAG, C64H156, 16_MHz_XTAL) - MCFG_64H156_BYTE_CALLBACK(WRITELINE(*this, c1571_device, byte_w)) - MCFG_FLOPPY_DRIVE_ADD_FIXED(C64H156_TAG":0", c1571_floppies, "525qd", c1571_device::floppy_formats) -MACHINE_CONFIG_END - - -MACHINE_CONFIG_START(mini_chief_device::device_add_mconfig) - MCFG_DEVICE_ADD(M6502_TAG, M6502, 16_MHz_XTAL / 16) - MCFG_DEVICE_PROGRAM_MAP(mini_chief_mem) - MCFG_QUANTUM_PERFECT_CPU(M6502_TAG) - - MCFG_DEVICE_ADD(M6522_0_TAG, VIA6522, 16_MHz_XTAL / 16) - MCFG_VIA6522_READPA_HANDLER(READ8(*this, c1571_device, via0_pa_r)) - MCFG_VIA6522_READPB_HANDLER(READ8(*this, c1571_device, via0_pb_r)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, c1571_device, via0_pa_w)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, c1571_device, via0_pb_w)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, c1571_device, via0_irq_w)) - - MCFG_DEVICE_ADD(M6522_1_TAG, VIA6522, 16_MHz_XTAL / 16) - MCFG_VIA6522_READPA_HANDLER(READ8(C64H156_TAG, c64h156_device, yb_r)) - MCFG_VIA6522_READPB_HANDLER(READ8(*this, c1571_device, via1_pb_r)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(C64H156_TAG, c64h156_device, yb_w)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, c1571_device, via1_pb_w)) - MCFG_VIA6522_CA2_HANDLER(WRITELINE(C64H156_TAG, c64h156_device, soe_w)) - MCFG_VIA6522_CB2_HANDLER(WRITELINE(C64H156_TAG, c64h156_device, oe_w)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, c1571_device, via1_irq_w)) - - MCFG_DEVICE_ADD(M6526_TAG, MOS6526, 16_MHz_XTAL / 16) - MCFG_MOS6526_IRQ_CALLBACK(WRITELINE(*this, c1571_device, cia_irq_w)) - MCFG_MOS6526_CNT_CALLBACK(WRITELINE(*this, c1571_device, cia_cnt_w)) - MCFG_MOS6526_SP_CALLBACK(WRITELINE(*this, c1571_device, cia_sp_w)) - MCFG_MOS6526_PB_INPUT_CALLBACK(READ8(*this, c1571_device, cia_pb_r)) - MCFG_MOS6526_PB_OUTPUT_CALLBACK(WRITE8(*this, c1571_device, cia_pb_w)) - MCFG_MOS6526_PC_CALLBACK(WRITELINE(*this, c1571_device, cia_pc_w)) - - MCFG_DEVICE_ADD(WD1770_TAG, WD1770, 16_MHz_XTAL / 2) - - MCFG_DEVICE_ADD(C64H156_TAG, C64H156, 16_MHz_XTAL) - MCFG_64H156_BYTE_CALLBACK(WRITELINE(*this, c1571_device, byte_w)) - MCFG_FLOPPY_DRIVE_ADD_FIXED(C64H156_TAG":0", c1571_floppies, "525qd", c1571_device::floppy_formats) - - MCFG_DEVICE_ADD(ISA_BUS_TAG, ISA8, 0) - MCFG_ISA8_CPU(M6502_TAG) - MCFG_DEVICE_ADD("isa1", ISA8_SLOT, 0, ISA_BUS_TAG, mini_chief_isa8_cards, "wd1002a_wx1", false) -MACHINE_CONFIG_END +void mini_chief_device::device_add_mconfig(machine_config &config) +{ + add_base_mconfig(config); + add_cia_mconfig(config); + + m_maincpu->set_addrmap(AS_PROGRAM, &mini_chief_device::mini_chief_mem); + + isa8_device &isa8(ISA8(config, ISA_BUS_TAG, 0)); + isa8.set_cputag(m_maincpu); + ISA8_SLOT(config, "isa1", 0, ISA_BUS_TAG, mini_chief_isa8_cards, "wd1002a_wx1", false); +} //------------------------------------------------- diff --git a/src/devices/bus/cbmiec/c1571.h b/src/devices/bus/cbmiec/c1571.h index 679c5d6f5a3..467c959963e 100644 --- a/src/devices/bus/cbmiec/c1571.h +++ b/src/devices/bus/cbmiec/c1571.h @@ -91,6 +91,9 @@ protected: virtual void parallel_data_w(uint8_t data) override; virtual void parallel_strobe_w(int state) override; + void add_base_mconfig(machine_config &config); + void add_cia_mconfig(machine_config &config); + enum { LED_POWER = 0, diff --git a/src/devices/bus/cbmiec/cbmiec.cpp b/src/devices/bus/cbmiec/cbmiec.cpp index 34cd7d4a63b..277863930c8 100644 --- a/src/devices/bus/cbmiec/cbmiec.cpp +++ b/src/devices/bus/cbmiec/cbmiec.cpp @@ -273,7 +273,13 @@ void cbm_iec_slot_device::device_start() if (dev) bus->add_device(this, get_card_device()); } - +void cbm_iec_slot_device::add_slot(machine_config &config, const char *_tag, int _address, const char *_def_slot) +{ + cbm_iec_slot_device &slot(CBM_IEC_SLOT(config, _tag, 0)); + cbm_iec_devices(slot); + slot.set_default_option(_def_slot); + slot.set_address(_address); +} //************************************************************************** // LIVE DEVICE diff --git a/src/devices/bus/cbmiec/cbmiec.h b/src/devices/bus/cbmiec/cbmiec.h index 0ed382142e0..fb889573709 100644 --- a/src/devices/bus/cbmiec/cbmiec.h +++ b/src/devices/bus/cbmiec/cbmiec.h @@ -61,6 +61,7 @@ MCFG_CBM_IEC_BUS_ADD() +void cbm_iec_devices(device_slot_interface &device); //************************************************************************** // TYPE DEFINITIONS @@ -82,6 +83,11 @@ public: template <class Object> devcb_base &set_clk_callback(Object &&wr) { return m_write_clk.set_callback(std::forward<Object>(wr)); } template <class Object> devcb_base &set_data_callback(Object &&wr) { return m_write_data.set_callback(std::forward<Object>(wr)); } template <class Object> devcb_base &set_reset_callback(Object &&wr) { return m_write_reset.set_callback(std::forward<Object>(wr)); } + auto srq_callback() { return m_write_srq.bind(); } + auto atn_callback() { return m_write_atn.bind(); } + auto clk_callback() { return m_write_clk.bind(); } + auto data_callback() { return m_write_data.bind(); } + auto reset_callback() { return m_write_reset.bind(); } void add_device(cbm_iec_slot_device *slot, device_t *target); @@ -150,6 +156,8 @@ private: int m_line[SIGNAL_COUNT]; }; +DECLARE_DEVICE_TYPE(CBM_IEC, cbm_iec_device) + // ======================> cbm_iec_slot_device @@ -160,6 +168,18 @@ public: // construction/destruction cbm_iec_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + static void add_slot(machine_config &config, const char *_tag, int _address, const char *_def_slot); + template <typename T> static void add(machine_config &config, T &&_bus_tag, const char *_default_drive) + { + add_slot(config, "iec4", 4, nullptr); + add_slot(config, "iec8", 8, _default_drive); + add_slot(config, "iec9", 9, nullptr); + add_slot(config, "iec10", 10, nullptr); + add_slot(config, "iec11", 11, nullptr); + + CBM_IEC(config, std::forward<T>(_bus_tag), 0); + } + void set_address(int address) { m_address = address; } int get_address() { return m_address; } @@ -198,12 +218,6 @@ protected: cbm_iec_slot_device *m_slot; }; - -// device type definition -DECLARE_DEVICE_TYPE(CBM_IEC, cbm_iec_device) DECLARE_DEVICE_TYPE(CBM_IEC_SLOT, cbm_iec_slot_device) - -void cbm_iec_devices(device_slot_interface &device); - #endif // MAME_BUS_CBMIEC_CBMIEC_H diff --git a/src/devices/bus/cbmiec/cmdhd.cpp b/src/devices/bus/cbmiec/cmdhd.cpp index f46d24c44a4..13d8004445b 100644 --- a/src/devices/bus/cbmiec/cmdhd.cpp +++ b/src/devices/bus/cbmiec/cmdhd.cpp @@ -57,11 +57,7 @@ const tiny_rom_entry *cmd_hd_device::device_rom_region() const } -//------------------------------------------------- -// ADDRESS_MAP( cmd_hd_mem ) -//------------------------------------------------- - -void cmd_hd_device::cmd_hd_mem(address_map &map) +void cmd_hd_device::mem_map(address_map &map) { map(0x0000, 0x7fff).ram(); map(0x8000, 0xffff).rom().region(M6502_TAG, 0); @@ -77,18 +73,19 @@ void cmd_hd_device::cmd_hd_mem(address_map &map) // device_add_mconfig - add device configuration //------------------------------------------------- -MACHINE_CONFIG_START(cmd_hd_device::device_add_mconfig) - MCFG_DEVICE_ADD(M6502_TAG, M6502, 2000000) - MCFG_DEVICE_PROGRAM_MAP(cmd_hd_mem) +void cmd_hd_device::device_add_mconfig(machine_config &config) +{ + M6502(config, m_maincpu, 2000000); + m_maincpu->set_addrmap(AS_PROGRAM, &cmd_hd_device::mem_map); - MCFG_DEVICE_ADD(M6522_1_TAG, VIA6522, 2000000) - MCFG_DEVICE_ADD(M6522_2_TAG, VIA6522, 2000000) - MCFG_DEVICE_ADD(I8255A_TAG, I8255A, 0) - MCFG_DEVICE_ADD(RTC72421A_TAG, RTC72421, XTAL(32'768)) + VIA6522(config, M6522_1_TAG, 2000000); + VIA6522(config, M6522_2_TAG, 2000000); + I8255A(config, I8255A_TAG, 0); + RTC72421(config, RTC72421A_TAG, XTAL(32'768)); - MCFG_DEVICE_ADD(SCSIBUS_TAG, SCSI_PORT, 0) - MCFG_SCSIDEV_ADD(SCSIBUS_TAG ":" SCSI_PORT_DEVICE1, "harddisk", SCSIHD, SCSI_ID_0) -MACHINE_CONFIG_END + SCSI_PORT(config, m_scsibus); + m_scsibus->set_slot_device(1, "harddisk", SCSIHD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_0)); +} diff --git a/src/devices/bus/cbmiec/cmdhd.h b/src/devices/bus/cbmiec/cmdhd.h index 9749f81f547..2cdeada48df 100644 --- a/src/devices/bus/cbmiec/cmdhd.h +++ b/src/devices/bus/cbmiec/cmdhd.h @@ -56,12 +56,12 @@ protected: void cbm_iec_reset(int state) override; private: - required_device<cpu_device> m_maincpu; + required_device<m6502_device> m_maincpu; required_device<scsi_port_device> m_scsibus; DECLARE_WRITE8_MEMBER( led_w ); - void cmd_hd_mem(address_map &map); + void mem_map(address_map &map); }; diff --git a/src/devices/bus/cbmiec/fd2000.cpp b/src/devices/bus/cbmiec/fd2000.cpp index 94256ad02d1..9cd66c57b57 100644 --- a/src/devices/bus/cbmiec/fd2000.cpp +++ b/src/devices/bus/cbmiec/fd2000.cpp @@ -215,36 +215,32 @@ FLOPPY_FORMATS_END // device_add_mconfig - add device configuration //------------------------------------------------- -MACHINE_CONFIG_START(fd2000_device::device_add_mconfig) - MCFG_DEVICE_ADD(G65SC02PI2_TAG, M65C02, XTAL(24'000'000)/12) - MCFG_DEVICE_PROGRAM_MAP(fd2000_mem) - - MCFG_DEVICE_ADD(G65SC22P2_TAG, VIA6522, XTAL(24'000'000)/12) - MCFG_VIA6522_READPA_HANDLER(READ8(*this, fd2000_device, via_pa_r)) - MCFG_VIA6522_READPB_HANDLER(READ8(*this, fd2000_device, via_pb_r)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, fd2000_device, via_pa_w)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, fd2000_device, via_pb_w)) - - MCFG_DP8473_ADD(DP8473V_TAG) - - MCFG_FLOPPY_DRIVE_ADD_FIXED(DP8473V_TAG":0", fd2000_floppies, "35hd", floppy_image_device::default_floppy_formats)//fd2000_device::floppy_formats) -MACHINE_CONFIG_END - - -MACHINE_CONFIG_START(fd4000_device::device_add_mconfig) - MCFG_DEVICE_ADD(R65C02P4_TAG, M65C02, XTAL(24'000'000)/6) - MCFG_DEVICE_PROGRAM_MAP(fd4000_mem) +void fd2000_device::add_common_devices(machine_config &config) +{ + M65C02(config, m_maincpu, XTAL(24'000'000)/12); - MCFG_DEVICE_ADD(G65SC22P2_TAG, VIA6522, XTAL(24'000'000)/12) - MCFG_VIA6522_READPA_HANDLER(READ8(*this, fd2000_device, via_pa_r)) - MCFG_VIA6522_READPB_HANDLER(READ8(*this, fd2000_device, via_pb_r)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, fd2000_device, via_pa_w)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, fd2000_device, via_pb_w)) + via6522_device &via(VIA6522(config, G65SC22P2_TAG, XTAL(24'000'000)/12)); + via.readpa_handler().set(FUNC(fd2000_device::via_pa_r)); + via.readpb_handler().set(FUNC(fd2000_device::via_pb_r)); + via.writepa_handler().set(FUNC(fd2000_device::via_pa_w)); + via.writepb_handler().set(FUNC(fd2000_device::via_pb_w)); +} - MCFG_PC8477A_ADD(PC8477AV1_TAG) +void fd2000_device::device_add_mconfig(machine_config &config) +{ + add_common_devices(config); + m_maincpu->set_addrmap(AS_PROGRAM, &fd2000_device::fd2000_mem); + DP8473(config, m_fdc, 0); + FLOPPY_CONNECTOR(config, DP8473V_TAG":0", fd2000_floppies, "35hd", floppy_image_device::default_floppy_formats, true);//fd2000_device::floppy_formats); +} - MCFG_FLOPPY_DRIVE_ADD_FIXED(PC8477AV1_TAG":0", fd4000_floppies, "35ed", floppy_image_device::default_floppy_formats)//fd2000_device::floppy_formats) -MACHINE_CONFIG_END +void fd4000_device::device_add_mconfig(machine_config &config) +{ + add_common_devices(config); + m_maincpu->set_addrmap(AS_PROGRAM, &fd4000_device::fd4000_mem); + PC8477A(config, m_fdc, 0); + FLOPPY_CONNECTOR(config, PC8477AV1_TAG":0", fd4000_floppies, "35hd", floppy_image_device::default_floppy_formats, true);//fd2000_device::floppy_formats); +} //************************************************************************** diff --git a/src/devices/bus/cbmiec/fd2000.h b/src/devices/bus/cbmiec/fd2000.h index 740c1ce6441..2b79a93dd70 100644 --- a/src/devices/bus/cbmiec/fd2000.h +++ b/src/devices/bus/cbmiec/fd2000.h @@ -64,6 +64,8 @@ protected: void cbm_iec_data(int state) override; void cbm_iec_reset(int state) override; + void add_common_devices(machine_config &config); + required_device<m65c02_device> m_maincpu; required_device<upd765_family_device> m_fdc; required_device<floppy_connector> m_floppy0; diff --git a/src/devices/bus/centronics/ctronics.cpp b/src/devices/bus/centronics/ctronics.cpp index 2a63723ec9a..6a29a5b6a15 100644 --- a/src/devices/bus/centronics/ctronics.cpp +++ b/src/devices/bus/centronics/ctronics.cpp @@ -82,6 +82,18 @@ void centronics_device::device_start() m_select_in_handler(1); } +void centronics_device::set_output_latch(output_latch_device &latch) +{ + latch.bit_handler<0>().set(*this, FUNC(centronics_device::write_data0)); + latch.bit_handler<1>().set(*this, FUNC(centronics_device::write_data1)); + latch.bit_handler<2>().set(*this, FUNC(centronics_device::write_data2)); + latch.bit_handler<3>().set(*this, FUNC(centronics_device::write_data3)); + latch.bit_handler<4>().set(*this, FUNC(centronics_device::write_data4)); + latch.bit_handler<5>().set(*this, FUNC(centronics_device::write_data5)); + latch.bit_handler<6>().set(*this, FUNC(centronics_device::write_data6)); + latch.bit_handler<7>().set(*this, FUNC(centronics_device::write_data7)); +} + WRITE_LINE_MEMBER( centronics_device::write_strobe ) { if (m_dev) m_dev->input_strobe(state); } WRITE_LINE_MEMBER( centronics_device::write_data0 ) { if (m_dev) m_dev->input_data0(state); } WRITE_LINE_MEMBER( centronics_device::write_data1 ) { if (m_dev) m_dev->input_data1(state); } diff --git a/src/devices/bus/centronics/ctronics.h b/src/devices/bus/centronics/ctronics.h index dbbaa1ee5e1..c05d59a94c1 100644 --- a/src/devices/bus/centronics/ctronics.h +++ b/src/devices/bus/centronics/ctronics.h @@ -138,6 +138,8 @@ public: m_data7_handler.bind().set(tag, FUNC(input_buffer_device::write_bit7)); } + void set_output_latch(output_latch_device &latch); + DECLARE_WRITE_LINE_MEMBER( write_strobe ); DECLARE_WRITE_LINE_MEMBER( write_data0 ); DECLARE_WRITE_LINE_MEMBER( write_data1 ); diff --git a/src/devices/bus/econet/e01.cpp b/src/devices/bus/econet/e01.cpp index c50325bdc1b..b7e8bab4002 100644 --- a/src/devices/bus/econet/e01.cpp +++ b/src/devices/bus/econet/e01.cpp @@ -173,11 +173,6 @@ FLOPPY_FORMATS_MEMBER( econet_e01_device::floppy_formats_afs ) FLOPPY_AFS_FORMAT FLOPPY_FORMATS_END0 -static void e01_floppies(device_slot_interface &device) -{ - device.option_add("35dd", FLOPPY_35_DD); // NEC FD1036 A -} - WRITE_LINE_MEMBER( econet_e01_device::fdc_irq_w ) { m_fdc_irq = state; @@ -243,55 +238,67 @@ void econet_e01_device::e01_mem(address_map &map) // device_add_mconfig - add device configuration //------------------------------------------------- -MACHINE_CONFIG_START(econet_e01_device::device_add_mconfig) +void econet_e01_device::device_add_mconfig(machine_config &config) +{ // basic machine hardware - MCFG_DEVICE_ADD(R65C102_TAG, M65C02, XTAL(8'000'000)/4) // Rockwell R65C102P3 - MCFG_DEVICE_PROGRAM_MAP(e01_mem) + M65C02(config, m_maincpu, XTAL(8'000'000)/4); // Rockwell R65C102P3 + m_maincpu->set_addrmap(AS_PROGRAM, &econet_e01_device::e01_mem); - MCFG_DEVICE_ADD(HD146818_TAG, MC146818, 32.768_kHz_XTAL) - MCFG_MC146818_IRQ_HANDLER(WRITELINE(*this, econet_e01_device, rtc_irq_w)) + MC146818(config, m_rtc, 32.768_kHz_XTAL); + m_rtc->irq_callback().set(FUNC(econet_e01_device::rtc_irq_w)); // devices - MCFG_DEVICE_ADD(R6522_TAG, VIA6522, 8_MHz_XTAL / 4) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8("cent_data_out", output_latch_device, bus_w)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, econet_e01_device, via_irq_w)) - - MCFG_DEVICE_ADD(MC6854_TAG, MC6854, 0) - MCFG_MC6854_OUT_IRQ_CB(WRITELINE(*this, econet_e01_device, adlc_irq_w)) - MCFG_MC6854_OUT_TXD_CB(WRITELINE(*this, econet_e01_device, econet_data_w)) - - MCFG_DEVICE_ADD(WD2793_TAG, WD2793, 8_MHz_XTAL / 4) - MCFG_WD_FDC_INTRQ_CALLBACK(WRITELINE(*this, econet_e01_device, fdc_irq_w)) - MCFG_WD_FDC_DRQ_CALLBACK(WRITELINE(*this, econet_e01_device, fdc_drq_w)) - MCFG_FLOPPY_DRIVE_ADD(WD2793_TAG":0", e01_floppies, "35dd", floppy_formats_afs) - MCFG_FLOPPY_DRIVE_ADD(WD2793_TAG":1", e01_floppies, "35dd", floppy_formats_afs) - MCFG_SOFTWARE_LIST_ADD("flop_ls_e01", "e01_flop") - - MCFG_DEVICE_ADD(m_centronics, CENTRONICS, centronics_devices, "printer") - MCFG_CENTRONICS_ACK_HANDLER(WRITELINE(R6522_TAG, via6522_device, write_ca1)) - - MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", CENTRONICS_TAG) - - MCFG_DEVICE_ADD(SCSIBUS_TAG, SCSI_PORT, 0) - MCFG_SCSI_DATA_INPUT_BUFFER("scsi_data_in") - MCFG_SCSI_MSG_HANDLER(WRITELINE("scsi_ctrl_in", input_buffer_device, write_bit0)) - MCFG_SCSI_BSY_HANDLER(WRITELINE(*this, econet_e01_device, scsi_bsy_w)) // bit1 + via6522_device &via(VIA6522(config, R6522_TAG, 8_MHz_XTAL / 4)); + via.writepa_handler().set("cent_data_out", FUNC(output_latch_device::bus_w)); + via.irq_handler().set(FUNC(econet_e01_device::via_irq_w)); + + MC6854(config, m_adlc, 0); + m_adlc->out_irq_cb().set(FUNC(econet_e01_device::adlc_irq_w)); + m_adlc->out_txd_cb().set(FUNC(econet_e01_device::econet_data_w)); + + WD2793(config, m_fdc, 8_MHz_XTAL / 4); + m_fdc->intrq_wr_callback().set(FUNC(econet_e01_device::fdc_irq_w)); + m_fdc->drq_wr_callback().set(FUNC(econet_e01_device::fdc_drq_w)); + + for (int i = 0; i < 2; i++) + { + FLOPPY_CONNECTOR(config, m_floppy[i]); + m_floppy[i]->option_add("35dd", FLOPPY_35_DD); + m_floppy[i]->set_default_option("35dd"); + m_floppy[i]->set_formats(floppy_formats_afs); + } + + software_list_device &softlist(SOFTWARE_LIST(config, "flop_ls_e01")); + softlist.set_type("e01_flop", SOFTWARE_LIST_ORIGINAL_SYSTEM); + + CENTRONICS(config, m_centronics, centronics_devices, "printer"); + m_centronics->ack_handler().set(R6522_TAG, FUNC(via6522_device::write_ca1)); + + output_latch_device ¢_data_out(OUTPUT_LATCH(config, "cent_data_out")); + m_centronics->set_output_latch(cent_data_out); + + SCSI_PORT(config, m_scsibus); + m_scsibus->set_data_input_buffer(m_scsi_data_in); + m_scsibus->msg_handler().set(m_scsi_ctrl_in, FUNC(input_buffer_device::write_bit0)); + m_scsibus->bsy_handler().set(FUNC(econet_e01_device::scsi_bsy_w)); // bit1 // bit 2 0 // bit 3 0 // bit 4 NIRQ - MCFG_SCSI_REQ_HANDLER(WRITELINE(*this, econet_e01_device, scsi_req_w)) // bit5 - MCFG_SCSI_IO_HANDLER(WRITELINE("scsi_ctrl_in", input_buffer_device, write_bit6)) - MCFG_SCSI_CD_HANDLER(WRITELINE("scsi_ctrl_in", input_buffer_device, write_bit7)) - MCFG_SCSIDEV_ADD(SCSIBUS_TAG ":" SCSI_PORT_DEVICE1, "harddisk", SCSIHD, SCSI_ID_0) + m_scsibus->req_handler().set(FUNC(econet_e01_device::scsi_req_w)); // bit5 + m_scsibus->io_handler().set(m_scsi_ctrl_in, FUNC(input_buffer_device::write_bit6)); + m_scsibus->cd_handler().set(m_scsi_ctrl_in, FUNC(input_buffer_device::write_bit7)); + m_scsibus->set_slot_device(1, "harddisk", SCSIHD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_0)); + + OUTPUT_LATCH(config, m_scsi_data_out); + m_scsibus->set_output_latch(*m_scsi_data_out); - MCFG_SCSI_OUTPUT_LATCH_ADD("scsi_data_out", SCSIBUS_TAG) - MCFG_DEVICE_ADD("scsi_data_in", INPUT_BUFFER, 0) - MCFG_DEVICE_ADD("scsi_ctrl_in", INPUT_BUFFER, 0) + INPUT_BUFFER(config, m_scsi_data_in); + INPUT_BUFFER(config, m_scsi_ctrl_in); // internal ram - MCFG_RAM_ADD(RAM_TAG) - MCFG_RAM_DEFAULT_SIZE("64K") -MACHINE_CONFIG_END + RAM(config, m_ram); + m_ram->set_default_size("64K"); +} //------------------------------------------------- @@ -390,8 +397,7 @@ econet_e01_device::econet_e01_device(const machine_config &mconfig, device_type , m_scsi_data_out(*this, "scsi_data_out") , m_scsi_data_in(*this, "scsi_data_in") , m_scsi_ctrl_in(*this, "scsi_ctrl_in") - , m_floppy0(*this, WD2793_TAG":0") - , m_floppy1(*this, WD2793_TAG":1") + , m_floppy(*this, WD2793_TAG":%u", 0U) , m_rom(*this, R65C102_TAG) , m_centronics(*this, CENTRONICS_TAG) , m_adlc_ie(0) @@ -521,8 +527,8 @@ WRITE8_MEMBER( econet_e01_device::floppy_w ) // floppy select floppy_image_device *floppy = nullptr; - if (!BIT(data, 0)) floppy = m_floppy0->get_device(); - if (!BIT(data, 1)) floppy = m_floppy1->get_device(); + if (!BIT(data, 0)) floppy = m_floppy[0]->get_device(); + if (!BIT(data, 1)) floppy = m_floppy[1]->get_device(); m_fdc->set_floppy(floppy); diff --git a/src/devices/bus/econet/e01.h b/src/devices/bus/econet/e01.h index 883664da288..ef74396cd15 100644 --- a/src/devices/bus/econet/e01.h +++ b/src/devices/bus/econet/e01.h @@ -92,8 +92,7 @@ private: required_device<output_latch_device> m_scsi_data_out; required_device<input_buffer_device> m_scsi_data_in; required_device<input_buffer_device> m_scsi_ctrl_in; - required_device<floppy_connector> m_floppy0; - required_device<floppy_connector> m_floppy1; + required_device_array<floppy_connector, 2> m_floppy; required_memory_region m_rom; required_device<centronics_device> m_centronics; diff --git a/src/devices/bus/econet/econet.h b/src/devices/bus/econet/econet.h index cdaccc03a25..bbe4167cfa9 100644 --- a/src/devices/bus/econet/econet.h +++ b/src/devices/bus/econet/econet.h @@ -161,7 +161,6 @@ private: DECLARE_DEVICE_TYPE(ECONET, econet_device) DECLARE_DEVICE_TYPE(ECONET_SLOT, econet_slot_device) - void econet_devices(device_slot_interface &device); #endif // MAME_BUS_ECONET_ECONET_H diff --git a/src/devices/bus/electron/m2105.cpp b/src/devices/bus/electron/m2105.cpp index 0f32fff7331..c4887527927 100644 --- a/src/devices/bus/electron/m2105.cpp +++ b/src/devices/bus/electron/m2105.cpp @@ -54,49 +54,51 @@ ROM_END // device_add_mconfig - add device configuration //------------------------------------------------- -MACHINE_CONFIG_START(electron_m2105_device::device_add_mconfig) +void electron_m2105_device::device_add_mconfig(machine_config &config) +{ /* sound hardware */ SPEAKER(config, "mono").front_center(); - MCFG_INPUT_MERGER_ANY_HIGH("irqs") - MCFG_INPUT_MERGER_OUTPUT_HANDLER(WRITELINE(*this, electron_m2105_device, intrq_w)) + INPUT_MERGER_ANY_HIGH(config, m_irqs); + m_irqs->output_handler().set(FUNC(electron_m2105_device::intrq_w)); /* system via */ - MCFG_DEVICE_ADD("via6522_0", VIA6522, 1000000) - /*MCFG_VIA6522_READPA_HANDLER(READ8(*this, electron_m2105_device, m2105_via_system_read_porta)) - MCFG_VIA6522_READPB_HANDLER(READ8(*this, electron_m2105_device, m2105_via_system_read_portb)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, electron_m2105_device, m2105_via_system_write_porta)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, electron_m2105_device, m2105_via_system_write_portb))*/ - MCFG_VIA6522_IRQ_HANDLER(WRITELINE("irqs", input_merger_device, in_w<0>)) + VIA6522(config, m_via6522_0, 1000000); + /*m_via6522_0->readpa_handler().set(FUNC(electron_m2105_device::m2105_via_system_read_porta)); + m_via6522_0->readpb_handler().set(FUNC(electron_m2105_device::m2105_via_system_read_portb)); + m_via6522_0->writepa_handler().set(FUNC(electron_m2105_device::m2105_via_system_write_porta)); + m_via6522_0->writepb_handler().set(FUNC(electron_m2105_device::m2105_via_system_write_portb));*/ + m_via6522_0->irq_handler().set(m_irqs, FUNC(input_merger_device::in_w<0>)); /* user via */ - MCFG_DEVICE_ADD("via6522_1", VIA6522, 1000000) - //MCFG_VIA6522_READPB_HANDLER(READ8(*this, electron_m2105_device, m2105_via_user_read_portb)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8("cent_data_out", output_latch_device, bus_w)) - //MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, electron_m2105_device, m2105_via_user_write_portb)) - MCFG_VIA6522_CA2_HANDLER(WRITELINE(m_centronics, centronics_device, write_strobe)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE("irqs", input_merger_device, in_w<1>)) + VIA6522(config, m_via6522_1, 1000000); + //m_via6522_1->readpb_handler().set(FUNC(electron_m2105_device::m2105_via_user_read_portb)); + m_via6522_1->writepa_handler().set("cent_data_out", FUNC(output_latch_device::bus_w)); + //m_via6522_1->writepb_handler().set(FUNC(electron_m2105_device::m2105_via_user_write_portb)); + m_via6522_1->ca2_handler().set(m_centronics, FUNC(centronics_device::write_strobe)); + m_via6522_1->irq_handler().set(m_irqs, FUNC(input_merger_device::in_w<1>)); /* duart */ - MCFG_DEVICE_ADD("duart", SCN2681, XTAL(3'686'400)) - MCFG_MC68681_IRQ_CALLBACK(WRITELINE("irqs", input_merger_device, in_w<2>)) - MCFG_MC68681_A_TX_CALLBACK(WRITELINE("rs232", rs232_port_device, write_txd)) - //MCFG_MC68681_OUTPORT_CALLBACK(WRITE8(*this, electron_m2105_device, sio_out_w)) + SCN2681(config, m_duart, XTAL(3'686'400)); + m_duart->irq_cb().set(m_irqs, FUNC(input_merger_device::in_w<2>)); + m_duart->a_tx_cb().set("rs232", FUNC(rs232_port_device::write_txd)); + //m_duart->outport_cb().set(FUNC(electron_m2105_device::sio_out_w)); - MCFG_DEVICE_ADD("rs232", RS232_PORT, default_rs232_devices, nullptr) - MCFG_RS232_RXD_HANDLER(WRITELINE("duart", scn2681_device, rx_a_w)) + rs232_port_device &rs232(RS232_PORT(config, "rs232", default_rs232_devices, nullptr)); + rs232.rxd_handler().set(m_duart, FUNC(scn2681_device::rx_a_w)); /* printer */ CENTRONICS(config, m_centronics, centronics_devices, "printer"); m_centronics->ack_handler().set(m_via6522_1, FUNC(via6522_device::write_ca1)).invert(); // ack seems to be inverted? - MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics") + output_latch_device &latch(OUTPUT_LATCH(config, "cent_data_out")); + m_centronics->set_output_latch(latch); /* speech hardware */ - MCFG_DEVICE_ADD("vsm", SPEECHROM, 0) - MCFG_DEVICE_ADD("tms5220", TMS5220, 640000) - MCFG_TMS52XX_SPEECHROM("vsm") - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) -MACHINE_CONFIG_END + SPEECHROM(config, "vsm", 0); + TMS5220(config, m_tms, 640000); + m_tms->set_speechrom_tag("vsm"); + m_tms->add_route(ALL_OUTPUTS, "mono", 1.0); +} const tiny_rom_entry *electron_m2105_device::device_rom_region() const { @@ -168,7 +170,7 @@ uint8_t electron_m2105_device::expbus_r(address_space &space, offs_t offset, uin } else if (offset >= 0xfc40 && offset < 0xfc60) { - data = m_via6522_1->read(space, offset); + data = m_via6522_1->read(offset); } else if (offset >= 0xfc60 && offset < 0xfc70) { @@ -176,7 +178,7 @@ uint8_t electron_m2105_device::expbus_r(address_space &space, offs_t offset, uin } else if (offset >= 0xfc70 && offset < 0xfc90) { - data = m_via6522_0->read(space, offset); + data = m_via6522_0->read(offset); } return data; @@ -194,7 +196,7 @@ void electron_m2105_device::expbus_w(address_space &space, offs_t offset, uint8_ } else if (offset >= 0xfc40 && offset < 0xfc60) { - m_via6522_1->write(space, offset, data); + m_via6522_1->write(offset, data); } else if (offset >= 0xfc60 && offset < 0xfc70) { @@ -202,7 +204,7 @@ void electron_m2105_device::expbus_w(address_space &space, offs_t offset, uint8_ } else if (offset >= 0xfc70 && offset < 0xfc90) { - m_via6522_0->write(space, offset, data); + m_via6522_0->write(offset, data); } else if (offset == 0xfe05) { diff --git a/src/devices/bus/generic/slot.h b/src/devices/bus/generic/slot.h index 154be4db5ae..7c6b999d018 100644 --- a/src/devices/bus/generic/slot.h +++ b/src/devices/bus/generic/slot.h @@ -197,6 +197,16 @@ public: class generic_cartslot_device : public generic_slot_device { public: + template <typename T> + generic_cartslot_device(const machine_config &mconfig, const char *tag, device_t *owner, T &&opts, const char *intf, const char *exts) + : generic_cartslot_device(mconfig, tag, owner, (uint32_t)0) + { + opts(*this); + set_fixed(false); + set_interface(intf); + set_extensions(exts); + } + generic_cartslot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); virtual iodevice_t image_type() const override { return IO_CARTSLOT; } diff --git a/src/devices/bus/hexbus/hexbus.cpp b/src/devices/bus/hexbus/hexbus.cpp index 4b1e390363a..07313a45056 100644 --- a/src/devices/bus/hexbus/hexbus.cpp +++ b/src/devices/bus/hexbus/hexbus.cpp @@ -246,8 +246,8 @@ void hexbus_chained_device::hexbus_write(uint8_t data) // This is emulated by pulling the data lines to ones. uint8_t newvalue = (otherval | 0xc3) & m_myvalue; - // If it changed, propagate to both directions. - if (newvalue != m_current_bus_value) + // If it changed (with respect to HSK* or BAV*), propagate to both directions. + if ((newvalue & (HEXBUS_LINE_HSK | HEXBUS_LINE_BAV)) != (m_current_bus_value & (HEXBUS_LINE_HSK | HEXBUS_LINE_BAV))) { LOGMASKED(LOG_WRITE, "Trying to write %02x, actually: %02x (current=%02x)\n", data, newvalue, m_current_bus_value); @@ -260,6 +260,7 @@ void hexbus_chained_device::hexbus_write(uint8_t data) m_hexbus_outbound->write(OUTBOUND, m_current_bus_value); } + else LOGMASKED(LOG_WRITE, "No change on hexbus\n"); } /* @@ -318,9 +319,9 @@ void hexbus_chained_device::bus_write(int dir, uint8_t data) m_current_bus_value = data; // Notify device - // Caution: Calling hexbus_value_changed may cause further activities - // that change the bus again - if (data != oldvalue) + // Caution: Calling hexbus_value_changed may cause further activities that change the bus again + // Data changes alone shall not trigger the callback + if ((data & (HEXBUS_LINE_HSK | HEXBUS_LINE_BAV)) != (oldvalue & (HEXBUS_LINE_HSK | HEXBUS_LINE_BAV))) { LOGMASKED(LOG_WRITE, "Hexbus value changed: %02x -> %02x\n", oldvalue, data); hexbus_value_changed(data); diff --git a/src/devices/bus/hexbus/tp0370.cpp b/src/devices/bus/hexbus/tp0370.cpp index 6753f387015..5c620a47bd3 100644 --- a/src/devices/bus/hexbus/tp0370.cpp +++ b/src/devices/bus/hexbus/tp0370.cpp @@ -144,6 +144,7 @@ ibc_device::ibc_device(const machine_config &mconfig, const char *tag, device_t m_int_pending(false), m_incoming_message(false), m_message_started(false), + m_latch_inhibit(false), m_data(0), m_transmit(0xff) { @@ -229,12 +230,15 @@ void ibc_device::set_disable_inhibit(bool dis, bool inh) } /* - Called from the HSK latch or by command. + Called by a command, not automatically. */ void ibc_device::set_lines(bool bav, bool hsk) { LOGMASKED(LOG_LINES, "%s BAV*, %s HSK*\n", bav? "Pull down" : "Release", hsk? "Pull down" : "Release"); + // We're in the response phase. + if (hsk) m_latch_inhibit = true; + // Assert HSK* (110 0 0111) // Release HSK* (110 1 0111) // Assert BAV* (11010 0 11) @@ -245,7 +249,6 @@ void ibc_device::set_lines(bool bav, bool hsk) if (m_transmit != 0xff) LOGMASKED(LOG_LINES, "Data = %01x\n", m_transmit>>4); m_hexout(val); - m_transmit=0xff; // TODO: Check this } /* @@ -280,6 +283,14 @@ void ibc_device::from_hexbus(uint8_t val) m_inhibit = false; m_incoming_message = true; } + else + { + if (!m_bav && m_bavold) + { + LOGMASKED(LOG_LINES, "Bus released\n"); + m_latch_inhibit = false; + } + } // The message may combine a change of BAV* and of HSK*. if (!m_inhibit) @@ -287,27 +298,34 @@ void ibc_device::from_hexbus(uint8_t val) // Falling edge of HSK* if (m_hsk && !m_hskold) { - // On this falling edge, the nibble is supposed to be stable, - // so keep it - m_data = data; - if (m_incoming_message && !m_message_started) + if (m_latch_inhibit) { - // Set flag for new message - m_incoming_message = false; - m_message_started = true; - LOGMASKED(LOG_DETAIL, "New message started\n", data); + LOGMASKED(LOG_LINES, "Not latching HSK* in response phase\n"); } else - m_message_started = false; - - LOGMASKED(LOG_DETAIL, "Data reg <- %1x\n", data); - - // set the latch - m_latch(ASSERT_LINE); - - // and set interrupt - m_int_pending = true; - m_int(ASSERT_LINE); + { + // On this falling edge, the nibble is supposed to be stable, + // so keep it + m_data = data; + if (m_incoming_message && !m_message_started) + { + // Set flag for new message + m_incoming_message = false; + m_message_started = true; + LOGMASKED(LOG_DETAIL, "New message started\n", data); + } + else + m_message_started = false; + + LOGMASKED(LOG_DETAIL, "Data reg <- %1x\n", data); + + // set the latch + m_latch(ASSERT_LINE); + + // and set interrupt + m_int_pending = true; + m_int(ASSERT_LINE); + } } } } diff --git a/src/devices/bus/hexbus/tp0370.h b/src/devices/bus/hexbus/tp0370.h index 0888f7ad859..5f5c02489c0 100644 --- a/src/devices/bus/hexbus/tp0370.h +++ b/src/devices/bus/hexbus/tp0370.h @@ -57,6 +57,7 @@ private: bool m_int_pending; bool m_incoming_message; bool m_message_started; + bool m_latch_inhibit; uint8_t m_data; uint8_t m_transmit; diff --git a/src/devices/bus/hp80_io/82937.cpp b/src/devices/bus/hp80_io/82937.cpp index e5aff4fac43..6f36b5991fc 100644 --- a/src/devices/bus/hp80_io/82937.cpp +++ b/src/devices/bus/hp80_io/82937.cpp @@ -328,29 +328,33 @@ const tiny_rom_entry *hp82937_io_card_device::device_rom_region() const return ROM_NAME(hp82937); } -MACHINE_CONFIG_START(hp82937_io_card_device::device_add_mconfig) - MCFG_DEVICE_ADD("cpu" , I8049 , XTAL(11'000'000)) - MCFG_DEVICE_IO_MAP(cpu_io_map) - MCFG_MCS48_PORT_T0_IN_CB(READLINE(*this, hp82937_io_card_device , t0_r)) - MCFG_MCS48_PORT_T1_IN_CB(READLINE("xlator" , hp_1mb5_device , int_r)) - MCFG_MCS48_PORT_P1_IN_CB(READ8(*this, hp82937_io_card_device , p1_r)) - MCFG_MCS48_PORT_P1_OUT_CB(WRITE8(*this, hp82937_io_card_device , p1_w)) - MCFG_MCS48_PORT_P2_IN_CB(READ8(*this, hp82937_io_card_device , dio_r)) - MCFG_MCS48_PORT_P2_OUT_CB(WRITE8(*this, hp82937_io_card_device , dio_w)) - - MCFG_DEVICE_ADD("xlator" , HP_1MB5 , 0) - MCFG_1MB5_IRL_HANDLER(WRITELINE(*this, hp82937_io_card_device , irl_w)) - MCFG_1MB5_HALT_HANDLER(WRITELINE(*this, hp82937_io_card_device , halt_w)) - MCFG_1MB5_RESET_HANDLER(WRITELINE(*this, hp82937_io_card_device , reset_w)) - - MCFG_IEEE488_SLOT_ADD("ieee_dev" , 0 , hp_ieee488_devices , nullptr) - MCFG_IEEE488_SLOT_ADD("ieee_rem" , 0 , remote488_devices , nullptr) - MCFG_IEEE488_BUS_ADD() - MCFG_IEEE488_IFC_CALLBACK(WRITELINE(*this, hp82937_io_card_device , ieee488_ctrl_w)) - MCFG_IEEE488_ATN_CALLBACK(WRITELINE(*this, hp82937_io_card_device , ieee488_ctrl_w)) - MCFG_IEEE488_REN_CALLBACK(WRITELINE(*this, hp82937_io_card_device , ieee488_ctrl_w)) - MCFG_IEEE488_EOI_CALLBACK(WRITELINE(*this, hp82937_io_card_device , ieee488_ctrl_w)) -MACHINE_CONFIG_END +void hp82937_io_card_device::device_add_mconfig(machine_config &config) +{ + I8049(config, m_cpu, XTAL(11'000'000)); + m_cpu->set_addrmap(AS_IO, &hp82937_io_card_device::cpu_io_map); + m_cpu->t0_in_cb().set(FUNC(hp82937_io_card_device::t0_r)); + m_cpu->t1_in_cb().set("xlator", FUNC(hp_1mb5_device::int_r)); + m_cpu->p1_in_cb().set(FUNC(hp82937_io_card_device::p1_r)); + m_cpu->p1_out_cb().set(FUNC(hp82937_io_card_device::p1_w)); + m_cpu->p2_in_cb().set(FUNC(hp82937_io_card_device::dio_r)); + m_cpu->p2_out_cb().set(FUNC(hp82937_io_card_device::dio_w)); + + HP_1MB5(config, m_translator, 0); + m_translator->irl_handler().set(FUNC(hp82937_io_card_device::irl_w)); + m_translator->halt_handler().set(FUNC(hp82937_io_card_device::halt_w)); + m_translator->reset_handler().set(FUNC(hp82937_io_card_device::reset_w)); + + ieee488_slot_device &ieee_dev(IEEE488_SLOT(config, "ieee_dev", 0)); + hp_ieee488_devices(ieee_dev); + ieee488_slot_device &ieee_rem(IEEE488_SLOT(config, "ieee_rem", 0)); + remote488_devices(ieee_rem); + + IEEE488(config, m_ieee488, 0); + m_ieee488->ifc_callback().set(FUNC(hp82937_io_card_device::ieee488_ctrl_w)); + m_ieee488->atn_callback().set(FUNC(hp82937_io_card_device::ieee488_ctrl_w)); + m_ieee488->ren_callback().set(FUNC(hp82937_io_card_device::ieee488_ctrl_w)); + m_ieee488->eoi_callback().set(FUNC(hp82937_io_card_device::ieee488_ctrl_w)); +} // device type definition DEFINE_DEVICE_TYPE(HP82937_IO_CARD, hp82937_io_card_device, "hp82937", "HP82937 card") diff --git a/src/devices/bus/ieee488/c2031.cpp b/src/devices/bus/ieee488/c2031.cpp index b70b2c89e7f..e80c25ff1eb 100644 --- a/src/devices/bus/ieee488/c2031.cpp +++ b/src/devices/bus/ieee488/c2031.cpp @@ -281,16 +281,6 @@ WRITE_LINE_MEMBER( c2031_device::byte_w ) //------------------------------------------------- -// SLOT_INTERFACE( c2031_floppies ) -//------------------------------------------------- - -static void c2031_floppies(device_slot_interface &device) -{ - device.option_add("525ssqd", FLOPPY_525_SSQD); -} - - -//------------------------------------------------- // FLOPPY_FORMATS( floppy_formats ) //------------------------------------------------- @@ -304,31 +294,37 @@ FLOPPY_FORMATS_END // device_add_mconfig - add device configuration //------------------------------------------------- -MACHINE_CONFIG_START(c2031_device::device_add_mconfig) - MCFG_DEVICE_ADD(M6502_TAG, M6502, XTAL(16'000'000)/16) - MCFG_DEVICE_PROGRAM_MAP(c2031_mem) - MCFG_QUANTUM_PERFECT_CPU(M6502_TAG) - - MCFG_DEVICE_ADD(M6522_0_TAG, VIA6522, XTAL(16'000'000)/16) - MCFG_VIA6522_READPA_HANDLER(READ8(*this, c2031_device, via0_pa_r)) - MCFG_VIA6522_READPB_HANDLER(READ8(*this, c2031_device, via0_pb_r)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, c2031_device, via0_pa_w)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, c2031_device, via0_pb_w)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, c2031_device, via0_irq_w)) - - MCFG_DEVICE_ADD(M6522_1_TAG, VIA6522, XTAL(16'000'000)/16) - MCFG_VIA6522_READPA_HANDLER(READ8(C64H156_TAG, c64h156_device, yb_r)) - MCFG_VIA6522_READPB_HANDLER(READ8(*this, c2031_device, via1_pb_r)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(C64H156_TAG, c64h156_device, yb_w)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, c2031_device, via1_pb_w)) - MCFG_VIA6522_CA2_HANDLER(WRITELINE(C64H156_TAG, c64h156_device, soe_w)) - MCFG_VIA6522_CB2_HANDLER(WRITELINE(C64H156_TAG, c64h156_device, oe_w)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, c2031_device, via1_irq_w)) - - MCFG_DEVICE_ADD(C64H156_TAG, C64H156, XTAL(16'000'000)) - MCFG_64H156_BYTE_CALLBACK(WRITELINE(*this, c2031_device, byte_w)) - MCFG_FLOPPY_DRIVE_ADD_FIXED(C64H156_TAG":0", c2031_floppies, "525ssqd", c2031_device::floppy_formats) -MACHINE_CONFIG_END +void c2031_device::device_add_mconfig(machine_config &config) +{ + M6502(config, m_maincpu, XTAL(16'000'000)/16); + m_maincpu->set_addrmap(AS_PROGRAM, &c2031_device::c2031_mem); + config.m_perfect_cpu_quantum = subtag(M6502_TAG); + + VIA6522(config, m_via0, XTAL(16'000'000)/16); + m_via0->readpa_handler().set(FUNC(c2031_device::via0_pa_r)); + m_via0->readpb_handler().set(FUNC(c2031_device::via0_pb_r)); + m_via0->writepa_handler().set(FUNC(c2031_device::via0_pa_w)); + m_via0->writepb_handler().set(FUNC(c2031_device::via0_pb_w)); + m_via0->irq_handler().set(FUNC(c2031_device::via0_irq_w)); + + VIA6522(config, m_via1, XTAL(16'000'000)/16); + m_via1->readpa_handler().set(C64H156_TAG, FUNC(c64h156_device::yb_r)); + m_via1->readpb_handler().set(FUNC(c2031_device::via1_pb_r)); + m_via1->writepa_handler().set(C64H156_TAG, FUNC(c64h156_device::yb_w)); + m_via1->writepb_handler().set(FUNC(c2031_device::via1_pb_w)); + m_via1->ca2_handler().set(C64H156_TAG, FUNC(c64h156_device::soe_w)); + m_via1->cb2_handler().set(C64H156_TAG, FUNC(c64h156_device::oe_w)); + m_via1->irq_handler().set(FUNC(c2031_device::via1_irq_w)); + + C64H156(config, m_ga, XTAL(16'000'000)); + m_ga->byte_callback().set(FUNC(c2031_device::byte_w)); + + floppy_connector &connector(FLOPPY_CONNECTOR(config, C64H156_TAG":0", 0)); + connector.option_add("525ssqd", FLOPPY_525_SSQD); + connector.set_default_option("525ssqd"); + connector.set_fixed(true); + connector.set_formats(c2031_device::floppy_formats); +} //------------------------------------------------- diff --git a/src/devices/bus/ieee488/c2031.h b/src/devices/bus/ieee488/c2031.h index e322267d5c0..99d97a0201a 100644 --- a/src/devices/bus/ieee488/c2031.h +++ b/src/devices/bus/ieee488/c2031.h @@ -62,7 +62,7 @@ private: DECLARE_FLOPPY_FORMATS( floppy_formats ); - required_device<cpu_device> m_maincpu; + required_device<m6502_device> m_maincpu; required_device<via6522_device> m_via0; required_device<via6522_device> m_via1; required_device<c64h156_device> m_ga; diff --git a/src/devices/bus/ieee488/c2040.cpp b/src/devices/bus/ieee488/c2040.cpp index 0348912b9c2..53a2f9f95e8 100644 --- a/src/devices/bus/ieee488/c2040.cpp +++ b/src/devices/bus/ieee488/c2040.cpp @@ -450,133 +450,67 @@ FLOPPY_FORMATS_END // device_add_mconfig - add device configuration //------------------------------------------------- -MACHINE_CONFIG_START(c2040_device::device_add_mconfig) - // DOS - MCFG_DEVICE_ADD(M6502_TAG, M6502, XTAL(16'000'000)/16) - MCFG_DEVICE_PROGRAM_MAP(c2040_main_mem) - - MCFG_DEVICE_ADD(M6532_0_TAG, MOS6532_NEW, XTAL(16'000'000)/16) - MCFG_MOS6530n_IN_PA_CB(READ8(*this, c2040_device, dio_r)) - MCFG_MOS6530n_OUT_PB_CB(WRITE8(*this, c2040_device, dio_w)) - - MCFG_DEVICE_ADD(M6532_1_TAG, MOS6532_NEW, XTAL(16'000'000)/16) - MCFG_MOS6530n_IN_PA_CB(READ8(*this, c2040_device, riot1_pa_r)) - MCFG_MOS6530n_OUT_PA_CB(WRITE8(*this, c2040_device, riot1_pa_w)) - MCFG_MOS6530n_IN_PB_CB(READ8(*this, c2040_device, riot1_pb_r)) - MCFG_MOS6530n_OUT_PB_CB(WRITE8(*this, c2040_device, riot1_pb_w)) - MCFG_MOS6530n_IRQ_CB(INPUTLINE(M6502_TAG, INPUT_LINE_IRQ0)) - - // controller - MCFG_DEVICE_ADD(M6504_TAG, M6504, XTAL(16'000'000)/16) - MCFG_DEVICE_PROGRAM_MAP(c2040_fdc_mem) - - MCFG_DEVICE_ADD(M6522_TAG, VIA6522, XTAL(16'000'000)/16) - MCFG_VIA6522_READPA_HANDLER(READ8(FDC_TAG, c2040_fdc_device, read)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, c2040_device, via_pb_w)) - MCFG_VIA6522_CA2_HANDLER(WRITELINE(FDC_TAG, c2040_fdc_device, mode_sel_w)) - MCFG_VIA6522_CB2_HANDLER(WRITELINE(FDC_TAG, c2040_fdc_device, rw_sel_w)) - - MCFG_DEVICE_ADD(M6530_TAG, MOS6530_NEW, XTAL(16'000'000)/16) - MCFG_MOS6530n_OUT_PA_CB(WRITE8(FDC_TAG, c2040_fdc_device, write)) - MCFG_MOS6530n_OUT_PB0_CB(WRITELINE(FDC_TAG, c2040_fdc_device, drv_sel_w)) - MCFG_MOS6530n_OUT_PB1_CB(WRITELINE(FDC_TAG, c2040_fdc_device, ds0_w)) - MCFG_MOS6530n_OUT_PB2_CB(WRITELINE(FDC_TAG, c2040_fdc_device, ds1_w)) - MCFG_MOS6530n_OUT_PB7_CB(INPUTLINE(M6504_TAG, M6502_IRQ_LINE)) - MCFG_MOS6530n_IN_PB3_CB(READLINE(FDC_TAG, c2040_fdc_device, wps_r)) - - MCFG_DEVICE_ADD(FDC_TAG, C2040_FDC, XTAL(16'000'000)) - MCFG_C2040_SYNC_CALLBACK(WRITELINE(M6530_TAG, mos6530_new_device, pb6_w)) - MCFG_C2040_READY_CALLBACK(WRITELINE(M6522_TAG, via6522_device, write_ca1)) - MCFG_C2040_ERROR_CALLBACK(WRITELINE(M6522_TAG, via6522_device, write_cb1)) - MCFG_FLOPPY_DRIVE_ADD_FIXED(FDC_TAG":0", c2040_floppies, "525ssqd", c2040_device::floppy_formats) - MCFG_FLOPPY_DRIVE_ADD_FIXED(FDC_TAG":1", c2040_floppies, "525ssqd", c2040_device::floppy_formats) -MACHINE_CONFIG_END - - -MACHINE_CONFIG_START(c3040_device::device_add_mconfig) +void c2040_device::add_common_devices(machine_config &config) +{ // DOS - MCFG_DEVICE_ADD(M6502_TAG, M6502, XTAL(16'000'000)/16) - MCFG_DEVICE_PROGRAM_MAP(c2040_main_mem) + M6502(config, m_maincpu, XTAL(16'000'000)/16); + m_maincpu->set_addrmap(AS_PROGRAM, &c2040_device::c2040_main_mem); - MCFG_DEVICE_ADD(M6532_0_TAG, MOS6532_NEW, XTAL(16'000'000)/16) - MCFG_MOS6530n_IN_PA_CB(READ8(*this, c2040_device, dio_r)) - MCFG_MOS6530n_OUT_PB_CB(WRITE8(*this, c2040_device, dio_w)) + MOS6532_NEW(config, m_riot0, XTAL(16'000'000)/16); + m_riot0->pa_rd_callback().set(FUNC(c2040_device::dio_r)); + m_riot0->pb_wr_callback().set(FUNC(c2040_device::dio_w)); - MCFG_DEVICE_ADD(M6532_1_TAG, MOS6532_NEW, XTAL(16'000'000)/16) - MCFG_MOS6530n_IN_PA_CB(READ8(*this, c2040_device, riot1_pa_r)) - MCFG_MOS6530n_OUT_PA_CB(WRITE8(*this, c2040_device, riot1_pa_w)) - MCFG_MOS6530n_IN_PB_CB(READ8(*this, c2040_device, riot1_pb_r)) - MCFG_MOS6530n_OUT_PB_CB(WRITE8(*this, c2040_device, riot1_pb_w)) - MCFG_MOS6530n_IRQ_CB(INPUTLINE(M6502_TAG, INPUT_LINE_IRQ0)) + MOS6532_NEW(config, m_riot1, XTAL(16'000'000)/16); + m_riot1->pa_rd_callback().set(FUNC(c2040_device::riot1_pa_r)); + m_riot1->pa_wr_callback().set(FUNC(c2040_device::riot1_pa_w)); + m_riot1->pb_rd_callback().set(FUNC(c2040_device::riot1_pb_r)); + m_riot1->pb_wr_callback().set(FUNC(c2040_device::riot1_pb_w)); + m_riot1->irq_wr_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0); // controller - MCFG_DEVICE_ADD(M6504_TAG, M6504, XTAL(16'000'000)/16) - MCFG_DEVICE_PROGRAM_MAP(c2040_fdc_mem) - - MCFG_DEVICE_ADD(M6522_TAG, VIA6522, XTAL(16'000'000)/16) - MCFG_VIA6522_READPA_HANDLER(READ8(FDC_TAG, c2040_fdc_device, read)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, c2040_device, via_pb_w)) - MCFG_VIA6522_CA2_HANDLER(WRITELINE(FDC_TAG, c2040_fdc_device, mode_sel_w)) - MCFG_VIA6522_CB2_HANDLER(WRITELINE(FDC_TAG, c2040_fdc_device, rw_sel_w)) - - MCFG_DEVICE_ADD(M6530_TAG, MOS6530_NEW, XTAL(16'000'000)/16) - MCFG_MOS6530n_OUT_PA_CB(WRITE8(FDC_TAG, c2040_fdc_device, write)) - MCFG_MOS6530n_OUT_PB0_CB(WRITELINE(FDC_TAG, c2040_fdc_device, drv_sel_w)) - MCFG_MOS6530n_OUT_PB1_CB(WRITELINE(FDC_TAG, c2040_fdc_device, ds0_w)) - MCFG_MOS6530n_OUT_PB2_CB(WRITELINE(FDC_TAG, c2040_fdc_device, ds1_w)) - MCFG_MOS6530n_IN_PB3_CB(READLINE(FDC_TAG, c2040_fdc_device, wps_r)) - MCFG_MOS6530n_OUT_PB7_CB(INPUTLINE(M6504_TAG, M6502_IRQ_LINE)) - - MCFG_DEVICE_ADD(FDC_TAG, C2040_FDC, XTAL(16'000'000)) - MCFG_C2040_SYNC_CALLBACK(WRITELINE(M6530_TAG, mos6530_new_device, pb6_w)) - MCFG_C2040_READY_CALLBACK(WRITELINE(M6522_TAG, via6522_device, write_ca1)) - MCFG_C2040_ERROR_CALLBACK(WRITELINE(M6522_TAG, via6522_device, write_cb1)) - MCFG_FLOPPY_DRIVE_ADD_FIXED(FDC_TAG":0", c2040_floppies, "525ssqd", c3040_device::floppy_formats) - MCFG_FLOPPY_DRIVE_ADD_FIXED(FDC_TAG":1", c2040_floppies, "525ssqd", c3040_device::floppy_formats) -MACHINE_CONFIG_END - - -MACHINE_CONFIG_START(c4040_device::device_add_mconfig) - // DOS - MCFG_DEVICE_ADD(M6502_TAG, M6502, XTAL(16'000'000)/16) - MCFG_DEVICE_PROGRAM_MAP(c2040_main_mem) + M6504(config, m_fdccpu, XTAL(16'000'000)/16); + m_fdccpu->set_addrmap(AS_PROGRAM, &c2040_device::c2040_fdc_mem); + + VIA6522(config, m_via, XTAL(16'000'000)/16); + m_via->readpa_handler().set(m_fdc, FUNC(c2040_fdc_device::read)); + m_via->writepb_handler().set(FUNC(c2040_device::via_pb_w)); + m_via->ca2_handler().set(m_fdc, FUNC(c2040_fdc_device::mode_sel_w)); + m_via->cb2_handler().set(m_fdc, FUNC(c2040_fdc_device::rw_sel_w)); + + MOS6530_NEW(config, m_miot, XTAL(16'000'000)/16); + m_miot->pa_wr_callback().set(m_fdc, FUNC(c2040_fdc_device::write)); + m_miot->pb_wr_callback<0>().set(m_fdc, FUNC(c2040_fdc_device::drv_sel_w)); + m_miot->pb_wr_callback<1>().set(m_fdc, FUNC(c2040_fdc_device::ds0_w)); + m_miot->pb_wr_callback<2>().set(m_fdc, FUNC(c2040_fdc_device::ds1_w)); + m_miot->pb_wr_callback<7>().set_inputline(m_fdccpu, M6502_IRQ_LINE); + m_miot->pb_rd_callback<3>().set(m_fdc, FUNC(c2040_fdc_device::wps_r)); + + C2040_FDC(config, m_fdc, XTAL(16'000'000)); + m_fdc->sync_wr_callback().set(m_miot, FUNC(mos6530_new_device::pb6_w)); + m_fdc->ready_wr_callback().set(m_via, FUNC(via6522_device::write_ca1)); + m_fdc->error_wr_callback().set(m_via, FUNC(via6522_device::write_cb1)); +} - MCFG_DEVICE_ADD(M6532_0_TAG, MOS6532_NEW, XTAL(16'000'000)/16) - MCFG_MOS6530n_IN_PA_CB(READ8(*this, c2040_device, dio_r)) - MCFG_MOS6530n_OUT_PB_CB(WRITE8(*this, c2040_device, dio_w)) +void c2040_device::device_add_mconfig(machine_config &config) +{ + add_common_devices(config); + FLOPPY_CONNECTOR(config, FDC_TAG":0", c2040_floppies, "525ssqd", c2040_device::floppy_formats, true); + FLOPPY_CONNECTOR(config, FDC_TAG":1", c2040_floppies, "525ssqd", c2040_device::floppy_formats, true); +} - MCFG_DEVICE_ADD(M6532_1_TAG, MOS6532_NEW, XTAL(16'000'000)/16) - MCFG_MOS6530n_IN_PA_CB(READ8(*this, c2040_device, riot1_pa_r)) - MCFG_MOS6530n_OUT_PA_CB(WRITE8(*this, c2040_device, riot1_pa_w)) - MCFG_MOS6530n_IN_PB_CB(READ8(*this, c2040_device, riot1_pb_r)) - MCFG_MOS6530n_OUT_PB_CB(WRITE8(*this, c2040_device, riot1_pb_w)) - MCFG_MOS6530n_IRQ_CB(INPUTLINE(M6502_TAG, INPUT_LINE_IRQ0)) +void c3040_device::device_add_mconfig(machine_config &config) +{ + add_common_devices(config); + FLOPPY_CONNECTOR(config, FDC_TAG":0", c2040_floppies, "525ssqd", c3040_device::floppy_formats, true); + FLOPPY_CONNECTOR(config, FDC_TAG":1", c2040_floppies, "525ssqd", c3040_device::floppy_formats, true); +} - // controller - MCFG_DEVICE_ADD(M6504_TAG, M6504, XTAL(16'000'000)/16) - MCFG_DEVICE_PROGRAM_MAP(c2040_fdc_mem) - - MCFG_DEVICE_ADD(M6522_TAG, VIA6522, XTAL(16'000'000)/16) - MCFG_VIA6522_READPA_HANDLER(READ8(FDC_TAG, c2040_fdc_device, read)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, c2040_device, via_pb_w)) - MCFG_VIA6522_CA2_HANDLER(WRITELINE(FDC_TAG, c2040_fdc_device, mode_sel_w)) - MCFG_VIA6522_CB2_HANDLER(WRITELINE(FDC_TAG, c2040_fdc_device, rw_sel_w)) - - MCFG_DEVICE_ADD(M6530_TAG, MOS6530_NEW, XTAL(16'000'000)/16) - MCFG_MOS6530n_OUT_PA_CB(WRITE8(FDC_TAG, c2040_fdc_device, write)) - MCFG_MOS6530n_OUT_PB0_CB(WRITELINE(FDC_TAG, c2040_fdc_device, drv_sel_w)) - MCFG_MOS6530n_OUT_PB1_CB(WRITELINE(FDC_TAG, c2040_fdc_device, ds0_w)) - MCFG_MOS6530n_OUT_PB2_CB(WRITELINE(FDC_TAG, c2040_fdc_device, ds1_w)) - MCFG_MOS6530n_IN_PB3_CB(READLINE(FDC_TAG, c2040_fdc_device, wps_r)) - MCFG_MOS6530n_OUT_PB7_CB(INPUTLINE(M6504_TAG, M6502_IRQ_LINE)) - - MCFG_DEVICE_ADD(FDC_TAG, C2040_FDC, XTAL(16'000'000)) - MCFG_C2040_SYNC_CALLBACK(WRITELINE(M6530_TAG, mos6530_new_device, pb6_w)) - MCFG_C2040_READY_CALLBACK(WRITELINE(M6522_TAG, via6522_device, write_ca1)) - MCFG_C2040_ERROR_CALLBACK(WRITELINE(M6522_TAG, via6522_device, write_cb1)) - MCFG_FLOPPY_DRIVE_ADD_FIXED(FDC_TAG":0", c2040_floppies, "525ssqd", c4040_device::floppy_formats) - MCFG_FLOPPY_DRIVE_ADD_FIXED(FDC_TAG":1", c2040_floppies, "525ssqd", c4040_device::floppy_formats) -MACHINE_CONFIG_END +void c4040_device::device_add_mconfig(machine_config &config) +{ + add_common_devices(config); + FLOPPY_CONNECTOR(config, FDC_TAG":0", c2040_floppies, "525ssqd", c4040_device::floppy_formats, true); + FLOPPY_CONNECTOR(config, FDC_TAG":1", c2040_floppies, "525ssqd", c4040_device::floppy_formats, true); +} //------------------------------------------------- diff --git a/src/devices/bus/ieee488/c2040.h b/src/devices/bus/ieee488/c2040.h index dd72623c150..1b7c1c69618 100644 --- a/src/devices/bus/ieee488/c2040.h +++ b/src/devices/bus/ieee488/c2040.h @@ -66,6 +66,7 @@ protected: LED_ERR }; + void add_common_devices(machine_config &config); inline void update_ieee_signals(); DECLARE_FLOPPY_FORMATS( floppy_formats ); diff --git a/src/devices/bus/ieee488/c2040fdc.h b/src/devices/bus/ieee488/c2040fdc.h index 7e27f1f1b81..c73e9826fbf 100644 --- a/src/devices/bus/ieee488/c2040fdc.h +++ b/src/devices/bus/ieee488/c2040fdc.h @@ -49,6 +49,9 @@ public: template <class Object> devcb_base &set_sync_wr_callback(Object &&cb) { return m_write_sync.set_callback(std::forward<Object>(cb)); } template <class Object> devcb_base &set_ready_wr_callback(Object &&cb) { return m_write_ready.set_callback(std::forward<Object>(cb)); } template <class Object> devcb_base &set_error_wr_callback(Object &&cb) { return m_write_error.set_callback(std::forward<Object>(cb)); } + auto sync_wr_callback() { return m_write_sync.bind(); } + auto ready_wr_callback() { return m_write_ready.bind(); } + auto error_wr_callback() { return m_write_error.bind(); } DECLARE_READ8_MEMBER( read ); DECLARE_WRITE8_MEMBER( write ); diff --git a/src/devices/bus/ieee488/c8050.cpp b/src/devices/bus/ieee488/c8050.cpp index 94d8e9a89dc..9594b26cf7e 100644 --- a/src/devices/bus/ieee488/c8050.cpp +++ b/src/devices/bus/ieee488/c8050.cpp @@ -528,39 +528,34 @@ FLOPPY_FORMATS_MEMBER( sfd1001_device::floppy_formats ) FLOPPY_FORMATS_END -//------------------------------------------------- -// device_add_mconfig - add device configuration -//------------------------------------------------- - -MACHINE_CONFIG_START(c8050_device::device_add_mconfig) +void c8050_device::add_common_devices(machine_config &config) +{ // DOS - MCFG_DEVICE_ADD(M6502_TAG, M6502, XTAL(12'000'000)/12) - MCFG_DEVICE_PROGRAM_MAP(c8050_main_mem) + M6502(config, m_maincpu, XTAL(12'000'000)/12); + m_maincpu->set_addrmap(AS_PROGRAM, &c8050_device::c8050_main_mem); - MCFG_DEVICE_ADD(M6532_0_TAG, MOS6532_NEW, XTAL(12'000'000)/12) - MCFG_MOS6530n_IN_PA_CB(READ8(*this, c8050_device, dio_r)) - MCFG_MOS6530n_OUT_PB_CB(WRITE8(*this, c8050_device, dio_w)) + MOS6532_NEW(config, m_riot0, XTAL(12'000'000)/12); + m_riot0->pa_rd_callback().set(FUNC(c8050_device::dio_r)); + m_riot0->pb_wr_callback().set(FUNC(c8050_device::dio_w)); - MCFG_DEVICE_ADD(M6532_1_TAG, MOS6532_NEW, XTAL(12'000'000)/12) - MCFG_MOS6530n_IN_PA_CB(READ8(*this, c8050_device, riot1_pa_r)) - MCFG_MOS6530n_OUT_PA_CB(WRITE8(*this, c8050_device, riot1_pa_w)) - MCFG_MOS6530n_IN_PB_CB(READ8(*this, c8050_device, riot1_pb_r)) - MCFG_MOS6530n_OUT_PB_CB(WRITE8(*this, c8050_device, riot1_pb_w)) - MCFG_MOS6530n_IRQ_CB(INPUTLINE(M6502_TAG, INPUT_LINE_IRQ0)) + MOS6532_NEW(config, m_riot1, XTAL(12'000'000)/12); + m_riot1->pa_rd_callback().set(FUNC(c8050_device::riot1_pa_r)); + m_riot1->pa_wr_callback().set(FUNC(c8050_device::riot1_pa_w)); + m_riot1->pb_rd_callback().set(FUNC(c8050_device::riot1_pb_r)); + m_riot1->pb_wr_callback().set(FUNC(c8050_device::riot1_pb_w)); + m_riot1->irq_wr_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0); // controller - MCFG_DEVICE_ADD(m_fdccpu, M6504, XTAL(12'000'000)/12) - MCFG_DEVICE_PROGRAM_MAP(c8050_fdc_mem) + M6504(config, m_fdccpu, XTAL(12'000'000)/12); - MCFG_DEVICE_ADD(m_via, VIA6522, XTAL(12'000'000)/12) - MCFG_VIA6522_READPA_HANDLER(READ8(m_fdc, c8050_fdc_device, read)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, c8050_device, via_pb_w)) - MCFG_VIA6522_CA2_HANDLER(WRITELINE(m_fdc, c8050_fdc_device, mode_sel_w)) - MCFG_VIA6522_CB2_HANDLER(WRITELINE(m_fdc, c8050_fdc_device, rw_sel_w)) + VIA6522(config, m_via, XTAL(12'000'000)/12); + m_via->readpa_handler().set(m_fdc, FUNC(c8050_fdc_device::read)); + m_via->writepb_handler().set(FUNC(c8050_device::via_pb_w)); + m_via->ca2_handler().set(m_fdc, FUNC(c8050_fdc_device::mode_sel_w)); + m_via->cb2_handler().set(m_fdc, FUNC(c8050_fdc_device::rw_sel_w)); MOS6530_NEW(config, m_miot, XTAL(12'000'000)/12); m_miot->pa_wr_callback().set(m_fdc, FUNC(c8050_fdc_device::write)); - m_miot->pb_wr_callback<0>().set(m_fdc, FUNC(c8050_fdc_device::drv_sel_w)); m_miot->pb_wr_callback<1>().set(m_fdc, FUNC(c8050_fdc_device::ds0_w)); m_miot->pb_wr_callback<2>().set(m_fdc, FUNC(c8050_fdc_device::ds1_w)); m_miot->pb_rd_callback<3>().set(m_fdc, FUNC(c8050_fdc_device::wps_r)); @@ -572,145 +567,56 @@ MACHINE_CONFIG_START(c8050_device::device_add_mconfig) m_fdc->ready_wr_callback().set(m_via, FUNC(via6522_device::write_ca1)); m_fdc->brdy_wr_callback().set_inputline(m_fdccpu, M6502_SET_OVERFLOW).invert(); m_fdc->error_wr_callback().set(m_via, FUNC(via6522_device::write_cb1)); - MCFG_FLOPPY_DRIVE_ADD(FDC_TAG ":0", c8050_floppies, "525ssqd", c8050_device::floppy_formats) - MCFG_FLOPPY_DRIVE_ADD(FDC_TAG ":1", c8050_floppies, "525ssqd", c8050_device::floppy_formats) -MACHINE_CONFIG_END - - -MACHINE_CONFIG_START(c8250_device::device_add_mconfig) - // DOS - MCFG_DEVICE_ADD(M6502_TAG, M6502, XTAL(12'000'000)/12) - MCFG_DEVICE_PROGRAM_MAP(c8050_main_mem) +} - MCFG_DEVICE_ADD(M6532_0_TAG, MOS6532_NEW, XTAL(12'000'000)/12) - MCFG_MOS6530n_IN_PA_CB(READ8(*this, c8050_device, dio_r)) - MCFG_MOS6530n_OUT_PB_CB(WRITE8(*this, c8050_device, dio_w)) +void c8050_device::device_add_mconfig(machine_config &config) +{ + add_common_devices(config); + m_fdccpu->set_addrmap(AS_PROGRAM, &c8050_device::c8050_fdc_mem); - MCFG_DEVICE_ADD(M6532_1_TAG, MOS6532_NEW, XTAL(12'000'000)/12) - MCFG_MOS6530n_IN_PA_CB(READ8(*this, c8050_device, riot1_pa_r)) - MCFG_MOS6530n_OUT_PA_CB(WRITE8(*this, c8050_device, riot1_pa_w)) - MCFG_MOS6530n_IN_PB_CB(READ8(*this, c8050_device, riot1_pb_r)) - MCFG_MOS6530n_OUT_PB_CB(WRITE8(*this, c8050_device, riot1_pb_w)) - MCFG_MOS6530n_IRQ_CB(INPUTLINE(M6502_TAG, INPUT_LINE_IRQ0)) + m_miot->pb_wr_callback<0>().set(m_fdc, FUNC(c8050_fdc_device::drv_sel_w)); + m_miot->pb_rd_callback<6>().set_constant(1); // SINGLE SIDED - // controller - MCFG_DEVICE_ADD(m_fdccpu, M6504, XTAL(12'000'000)/12) - MCFG_DEVICE_PROGRAM_MAP(c8050_fdc_mem) + FLOPPY_CONNECTOR(config, FDC_TAG ":0", c8050_floppies, "525ssqd", c8050_device::floppy_formats); + FLOPPY_CONNECTOR(config, FDC_TAG ":1", c8050_floppies, "525ssqd", c8050_device::floppy_formats); +} - MCFG_DEVICE_ADD(m_via, VIA6522, XTAL(12'000'000)/12) - MCFG_VIA6522_READPA_HANDLER(READ8(m_fdc, c8050_fdc_device, read)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, c8050_device, via_pb_w)) - MCFG_VIA6522_CA2_HANDLER(WRITELINE(m_fdc, c8050_fdc_device, mode_sel_w)) - MCFG_VIA6522_CB2_HANDLER(WRITELINE(m_fdc, c8050_fdc_device, rw_sel_w)) +void c8250_device::device_add_mconfig(machine_config &config) +{ + add_common_devices(config); + m_fdccpu->set_addrmap(AS_PROGRAM, &c8250_device::c8050_fdc_mem); - MOS6530_NEW(config, m_miot, XTAL(12'000'000)/12); - m_miot->pa_wr_callback().set(m_fdc, FUNC(c8050_fdc_device::write)); m_miot->pb_wr_callback<0>().set(m_fdc, FUNC(c8050_fdc_device::drv_sel_w)); - m_miot->pb_wr_callback<1>().set(m_fdc, FUNC(c8050_fdc_device::ds0_w)); - m_miot->pb_wr_callback<2>().set(m_fdc, FUNC(c8050_fdc_device::ds1_w)); - m_miot->pb_rd_callback<3>().set(m_fdc, FUNC(c8050_fdc_device::wps_r)); m_miot->pb_wr_callback<4>().set(m_fdc, FUNC(c8050_fdc_device::odd_hd_w)); m_miot->pb_rd_callback<6>().set_constant(0); // DOUBLE SIDED - m_miot->pb_wr_callback<7>().set_inputline(m_fdccpu, M6502_IRQ_LINE); - C8050_FDC(config, m_fdc, XTAL(12'000'000)/2); - m_fdc->sync_wr_callback().set(m_via, FUNC(via6522_device::write_pb7)); - m_fdc->ready_wr_callback().set(m_via, FUNC(via6522_device::write_ca1)); - m_fdc->brdy_wr_callback().set_inputline(m_fdccpu, M6502_SET_OVERFLOW).invert(); - m_fdc->error_wr_callback().set(m_via, FUNC(via6522_device::write_cb1)); - MCFG_FLOPPY_DRIVE_ADD(FDC_TAG ":0", c8250_floppies, "525qd", c8250_device::floppy_formats) - MCFG_FLOPPY_DRIVE_ADD(FDC_TAG ":1", c8250_floppies, "525qd", c8250_device::floppy_formats) -MACHINE_CONFIG_END - - -MACHINE_CONFIG_START(c8250lp_device::device_add_mconfig) - // DOS - MCFG_DEVICE_ADD(M6502_TAG, M6502, XTAL(12'000'000)/12) - MCFG_DEVICE_PROGRAM_MAP(c8050_main_mem) - - MCFG_DEVICE_ADD(M6532_0_TAG, MOS6532_NEW, XTAL(12'000'000)/12) - MCFG_MOS6530n_IN_PA_CB(READ8(*this, c8050_device, dio_r)) - MCFG_MOS6530n_OUT_PB_CB(WRITE8(*this, c8050_device, dio_w)) - - MCFG_DEVICE_ADD(M6532_1_TAG, MOS6532_NEW, XTAL(12'000'000)/12) - MCFG_MOS6530n_IN_PA_CB(READ8(*this, c8050_device, riot1_pa_r)) - MCFG_MOS6530n_OUT_PA_CB(WRITE8(*this, c8050_device, riot1_pa_w)) - MCFG_MOS6530n_IN_PB_CB(READ8(*this, c8050_device, riot1_pb_r)) - MCFG_MOS6530n_OUT_PB_CB(WRITE8(*this, c8050_device, riot1_pb_w)) - MCFG_MOS6530n_IRQ_CB(INPUTLINE(M6502_TAG, INPUT_LINE_IRQ0)) - - // controller - MCFG_DEVICE_ADD(m_fdccpu, M6504, XTAL(12'000'000)/12) - MCFG_DEVICE_PROGRAM_MAP(c8250lp_fdc_mem) + FLOPPY_CONNECTOR(config, FDC_TAG ":0", c8250_floppies, "525qd", c8250_device::floppy_formats); + FLOPPY_CONNECTOR(config, FDC_TAG ":1", c8250_floppies, "525qd", c8250_device::floppy_formats); +} - MCFG_DEVICE_ADD(m_via, VIA6522, XTAL(12'000'000)/12) - MCFG_VIA6522_READPA_HANDLER(READ8(m_fdc, c8050_fdc_device, read)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, c8050_device, via_pb_w)) - MCFG_VIA6522_CA2_HANDLER(WRITELINE(m_fdc, c8050_fdc_device, mode_sel_w)) - MCFG_VIA6522_CB2_HANDLER(WRITELINE(m_fdc, c8050_fdc_device, rw_sel_w)) +void c8250lp_device::device_add_mconfig(machine_config &config) +{ + add_common_devices(config); + m_fdccpu->set_addrmap(AS_PROGRAM, &c8250lp_device::c8250lp_fdc_mem); - MOS6530_NEW(config, m_miot, XTAL(12'000'000)/12); - m_miot->pa_wr_callback().set(m_fdc, FUNC(c8050_fdc_device::write)); m_miot->pb_wr_callback<0>().set(m_fdc, FUNC(c8050_fdc_device::drv_sel_w)); - m_miot->pb_wr_callback<1>().set(m_fdc, FUNC(c8050_fdc_device::ds0_w)); - m_miot->pb_wr_callback<2>().set(m_fdc, FUNC(c8050_fdc_device::ds1_w)); - m_miot->pb_rd_callback<3>().set(m_fdc, FUNC(c8050_fdc_device::wps_r)); m_miot->pb_wr_callback<4>().set(m_fdc, FUNC(c8050_fdc_device::odd_hd_w)); m_miot->pb_rd_callback<6>().set_constant(0); // DOUBLE SIDED - m_miot->pb_wr_callback<7>().set_inputline(m_fdccpu, M6502_IRQ_LINE); - - C8050_FDC(config, m_fdc, XTAL(12'000'000)/2); - m_fdc->sync_wr_callback().set(m_via, FUNC(via6522_device::write_pb7)); - m_fdc->ready_wr_callback().set(m_via, FUNC(via6522_device::write_ca1)); - m_fdc->brdy_wr_callback().set_inputline(m_fdccpu, M6502_SET_OVERFLOW).invert(); - m_fdc->error_wr_callback().set(m_via, FUNC(via6522_device::write_cb1)); - MCFG_FLOPPY_DRIVE_ADD(FDC_TAG ":0", c8250_floppies, "525qd", c8250lp_device::floppy_formats) - MCFG_FLOPPY_DRIVE_ADD(FDC_TAG ":1", c8250_floppies, "525qd", c8250lp_device::floppy_formats) -MACHINE_CONFIG_END - - -MACHINE_CONFIG_START(sfd1001_device::device_add_mconfig) - // DOS - MCFG_DEVICE_ADD(M6502_TAG, M6502, XTAL(12'000'000)/12) - MCFG_DEVICE_PROGRAM_MAP(c8050_main_mem) - - MCFG_DEVICE_ADD(M6532_0_TAG, MOS6532_NEW, XTAL(12'000'000)/12) - MCFG_MOS6530n_IN_PA_CB(READ8(*this, c8050_device, dio_r)) - MCFG_MOS6530n_OUT_PB_CB(WRITE8(*this, c8050_device, dio_w)) - MCFG_DEVICE_ADD(M6532_1_TAG, MOS6532_NEW, XTAL(12'000'000)/12) - MCFG_MOS6530n_IN_PA_CB(READ8(*this, c8050_device, riot1_pa_r)) - MCFG_MOS6530n_OUT_PA_CB(WRITE8(*this, c8050_device, riot1_pa_w)) - MCFG_MOS6530n_IN_PB_CB(READ8(*this, c8050_device, riot1_pb_r)) - MCFG_MOS6530n_OUT_PB_CB(WRITE8(*this, c8050_device, riot1_pb_w)) - MCFG_MOS6530n_IRQ_CB(INPUTLINE(M6502_TAG, INPUT_LINE_IRQ0)) - - // controller - MCFG_DEVICE_ADD(m_fdccpu, M6504, XTAL(12'000'000)/12) - MCFG_DEVICE_PROGRAM_MAP(sfd1001_fdc_mem) + FLOPPY_CONNECTOR(config, FDC_TAG ":0", c8250_floppies, "525qd", c8250lp_device::floppy_formats); + FLOPPY_CONNECTOR(config, FDC_TAG ":1", c8250_floppies, "525qd", c8250lp_device::floppy_formats); +} - MCFG_DEVICE_ADD(m_via, VIA6522, XTAL(12'000'000)/12) - MCFG_VIA6522_READPA_HANDLER(READ8(m_fdc, c8050_fdc_device, read)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, c8050_device, via_pb_w)) - MCFG_VIA6522_CA2_HANDLER(WRITELINE(m_fdc, c8050_fdc_device, mode_sel_w)) - MCFG_VIA6522_CB2_HANDLER(WRITELINE(m_fdc, c8050_fdc_device, rw_sel_w)) +void sfd1001_device::device_add_mconfig(machine_config &config) +{ + add_common_devices(config); + m_fdccpu->set_addrmap(AS_PROGRAM, &sfd1001_device::sfd1001_fdc_mem); - MOS6530_NEW(config, m_miot, XTAL(12'000'000)/12); - m_miot->pa_wr_callback().set(m_fdc, FUNC(c8050_fdc_device::write)); - m_miot->pb_wr_callback<1>().set(m_fdc, FUNC(c8050_fdc_device::ds0_w)); - m_miot->pb_wr_callback<2>().set(m_fdc, FUNC(c8050_fdc_device::ds1_w)); - m_miot->pb_rd_callback<3>().set(m_fdc, FUNC(c8050_fdc_device::wps_r)); m_miot->pb_wr_callback<4>().set(m_fdc, FUNC(c8050_fdc_device::odd_hd_w)); m_miot->pb_rd_callback<6>().set_constant(0); // DOUBLE SIDED - m_miot->pb_wr_callback<7>().set_inputline(m_fdccpu, M6502_IRQ_LINE); - C8050_FDC(config, m_fdc, XTAL(12'000'000)/2); - m_fdc->sync_wr_callback().set(m_via, FUNC(via6522_device::write_pb7)); - m_fdc->ready_wr_callback().set(m_via, FUNC(via6522_device::write_ca1)); - m_fdc->brdy_wr_callback().set_inputline(m_fdccpu, M6502_SET_OVERFLOW).invert(); - m_fdc->error_wr_callback().set(m_via, FUNC(via6522_device::write_cb1)); - MCFG_FLOPPY_DRIVE_ADD(FDC_TAG ":0", sfd1001_floppies, "525qd", sfd1001_device::floppy_formats) -MACHINE_CONFIG_END + FLOPPY_CONNECTOR(config, FDC_TAG ":0", sfd1001_floppies, "525qd", sfd1001_device::floppy_formats); +} //------------------------------------------------- diff --git a/src/devices/bus/ieee488/c8050.h b/src/devices/bus/ieee488/c8050.h index c4d236f1888..c8f96c4605f 100644 --- a/src/devices/bus/ieee488/c8050.h +++ b/src/devices/bus/ieee488/c8050.h @@ -60,6 +60,7 @@ protected: virtual void ieee488_atn(int state) override; virtual void ieee488_ifc(int state) override; + void add_common_devices(machine_config &config); inline void update_ieee_signals(); required_device<m6502_device> m_maincpu; diff --git a/src/devices/bus/ieee488/d9060.cpp b/src/devices/bus/ieee488/d9060.cpp index c94a89551b5..0005220c1e3 100644 --- a/src/devices/bus/ieee488/d9060.cpp +++ b/src/devices/bus/ieee488/d9060.cpp @@ -105,16 +105,12 @@ const tiny_rom_entry *d9060_device_base::device_rom_region() const } -//------------------------------------------------- -// ADDRESS_MAP( d9060_main_mem ) -//------------------------------------------------- - -void d9060_device_base::d9060_main_mem(address_map &map) +void d9060_device_base::main_mem(address_map &map) { - map(0x0000, 0x007f).mirror(0x0100).m(M6532_0_TAG, FUNC(mos6532_new_device::ram_map)); - map(0x0080, 0x00ff).mirror(0x0100).m(M6532_1_TAG, FUNC(mos6532_new_device::ram_map)); - map(0x0200, 0x021f).mirror(0x0d60).m(M6532_0_TAG, FUNC(mos6532_new_device::io_map)); - map(0x0280, 0x029f).mirror(0x0d60).m(M6532_1_TAG, FUNC(mos6532_new_device::io_map)); + map(0x0000, 0x007f).mirror(0x0100).m(m_riot0, FUNC(mos6532_new_device::ram_map)); + map(0x0080, 0x00ff).mirror(0x0100).m(m_riot1, FUNC(mos6532_new_device::ram_map)); + map(0x0200, 0x021f).mirror(0x0d60).m(m_riot0, FUNC(mos6532_new_device::io_map)); + map(0x0280, 0x029f).mirror(0x0d60).m(m_riot1, FUNC(mos6532_new_device::io_map)); map(0x1000, 0x13ff).mirror(0x0c00).ram().share("share1"); map(0x2000, 0x23ff).mirror(0x0c00).ram().share("share2"); map(0x3000, 0x33ff).mirror(0x0c00).ram().share("share3"); @@ -123,15 +119,11 @@ void d9060_device_base::d9060_main_mem(address_map &map) } -//------------------------------------------------- -// ADDRESS_MAP( d9060_hdc_mem ) -//------------------------------------------------- - -void d9060_device_base::d9060_hdc_mem(address_map &map) +void d9060_device_base::hdc_mem(address_map &map) { map.global_mask(0x1fff); map(0x0000, 0x007f).mirror(0x300).ram(); - map(0x0080, 0x008f).mirror(0x370).rw(M6522_TAG, FUNC(via6522_device::read), FUNC(via6522_device::write)); + map(0x0080, 0x008f).mirror(0x370).rw(m_via, FUNC(via6522_device::read), FUNC(via6522_device::write)); map(0x0400, 0x07ff).ram().share("share1"); map(0x0800, 0x0bff).ram().share("share2"); map(0x0c00, 0x0fff).ram().share("share3"); @@ -370,52 +362,54 @@ WRITE8_MEMBER( d9060_device_base::scsi_data_w ) // device_add_mconfig - add device configuration //------------------------------------------------- -MACHINE_CONFIG_START(d9060_device_base::device_add_mconfig) +void d9060_device_base::device_add_mconfig(machine_config &config) +{ // DOS - MCFG_DEVICE_ADD(M6502_DOS_TAG, M6502, XTAL(4'000'000)/4) - MCFG_DEVICE_PROGRAM_MAP(d9060_main_mem) + M6502(config, m_maincpu, XTAL(4'000'000)/4); + m_maincpu->set_addrmap(AS_PROGRAM, &d9060_device::main_mem); - MCFG_DEVICE_ADD(M6532_0_TAG, MOS6532_NEW, XTAL(4'000'000)/4) - MCFG_MOS6530n_IN_PA_CB(READ8(*this, d9060_device_base, dio_r)) - MCFG_MOS6530n_OUT_PB_CB(WRITE8(*this, d9060_device_base, dio_w)) + MOS6532_NEW(config, m_riot0, XTAL(4'000'000)/4); + m_riot0->pa_rd_callback().set(FUNC(d9060_device_base::dio_r)); + m_riot0->pb_wr_callback().set(FUNC(d9060_device_base::dio_w)); - MCFG_DEVICE_ADD(M6532_1_TAG, MOS6532_NEW, XTAL(4'000'000)/4) - MCFG_MOS6530n_IN_PA_CB(READ8(*this, d9060_device_base, riot1_pa_r)) - MCFG_MOS6530n_OUT_PA_CB(WRITE8(*this, d9060_device_base, riot1_pa_w)) - MCFG_MOS6530n_IN_PB_CB(READ8(*this, d9060_device_base, riot1_pb_r)) - MCFG_MOS6530n_OUT_PB_CB(WRITE8(*this, d9060_device_base, riot1_pb_w)) - MCFG_MOS6530n_IRQ_CB(INPUTLINE(M6502_DOS_TAG, INPUT_LINE_IRQ0)) + MOS6532_NEW(config, m_riot1, XTAL(4'000'000)/4); + m_riot1->pa_rd_callback().set(FUNC(d9060_device_base::riot1_pa_r)); + m_riot1->pa_wr_callback().set(FUNC(d9060_device_base::riot1_pa_w)); + m_riot1->pb_rd_callback().set(FUNC(d9060_device_base::riot1_pb_r)); + m_riot1->pb_wr_callback().set(FUNC(d9060_device_base::riot1_pb_w)); + m_riot1->irq_wr_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0); // controller - MCFG_DEVICE_ADD(M6502_HDC_TAG, M6502, XTAL(4'000'000)/4) - MCFG_DEVICE_PROGRAM_MAP(d9060_hdc_mem) - - MCFG_DEVICE_ADD(M6522_TAG, VIA6522, XTAL(4'000'000)/4) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, d9060_device_base, scsi_data_w)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, d9060_device_base, via_pb_w)) - MCFG_VIA6522_CA2_HANDLER(WRITELINE(*this, d9060_device_base, ack_w)) - MCFG_VIA6522_CB2_HANDLER(WRITELINE(*this, d9060_device_base, enable_w)) - MCFG_VIA6522_IRQ_HANDLER(INPUTLINE(M6502_HDC_TAG, M6502_IRQ_LINE)) - - MCFG_DEVICE_ADD(SASIBUS_TAG, SCSI_PORT, 0) - MCFG_SCSI_REQ_HANDLER(WRITELINE(M6522_TAG, via6522_device, write_ca1)) - MCFG_SCSI_CD_HANDLER(WRITELINE(M6522_TAG, via6522_device, write_pb2)) - MCFG_SCSI_BSY_HANDLER(WRITELINE(M6522_TAG, via6522_device, write_pb3)) - MCFG_SCSI_IO_HANDLER(WRITELINE(M6522_TAG, via6522_device, write_pb6)) - MCFG_SCSI_MSG_HANDLER(WRITELINE(M6522_TAG, via6522_device, write_pb7)) - MCFG_SCSI_DATA0_HANDLER(WRITELINE(M6522_TAG, via6522_device, write_pa0)) - MCFG_SCSI_DATA1_HANDLER(WRITELINE(M6522_TAG, via6522_device, write_pa1)) - MCFG_SCSI_DATA2_HANDLER(WRITELINE(M6522_TAG, via6522_device, write_pa2)) - MCFG_SCSI_DATA3_HANDLER(WRITELINE(M6522_TAG, via6522_device, write_pa3)) - MCFG_SCSI_DATA4_HANDLER(WRITELINE(M6522_TAG, via6522_device, write_pa4)) - MCFG_SCSI_DATA5_HANDLER(WRITELINE(M6522_TAG, via6522_device, write_pa5)) - MCFG_SCSI_DATA6_HANDLER(WRITELINE(M6522_TAG, via6522_device, write_pa6)) - MCFG_SCSI_DATA7_HANDLER(WRITELINE(M6522_TAG, via6522_device, write_pa7)) - - MCFG_SCSI_OUTPUT_LATCH_ADD("sasi_data_out", SASIBUS_TAG) - - MCFG_SCSIDEV_ADD(SASIBUS_TAG ":" SCSI_PORT_DEVICE1, "harddisk", D9060HD, SCSI_ID_0) -MACHINE_CONFIG_END + M6502(config, m_hdccpu, XTAL(4'000'000)/4); + m_hdccpu->set_addrmap(AS_PROGRAM, &d9060_device::hdc_mem); + + VIA6522(config, m_via, XTAL(4'000'000)/4); + m_via->writepa_handler().set(FUNC(d9060_device_base::scsi_data_w)); + m_via->writepb_handler().set(FUNC(d9060_device_base::via_pb_w)); + m_via->ca2_handler().set(FUNC(d9060_device_base::ack_w)); + m_via->cb2_handler().set(FUNC(d9060_device_base::enable_w)); + m_via->irq_handler().set_inputline(m_hdccpu, M6502_IRQ_LINE); + + SCSI_PORT(config, m_sasibus); + m_sasibus->req_handler().set(M6522_TAG, FUNC(via6522_device::write_ca1)); + m_sasibus->cd_handler().set(M6522_TAG, FUNC(via6522_device::write_pb2)); + m_sasibus->bsy_handler().set(M6522_TAG, FUNC(via6522_device::write_pb3)); + m_sasibus->io_handler().set(M6522_TAG, FUNC(via6522_device::write_pb6)); + m_sasibus->msg_handler().set(M6522_TAG, FUNC(via6522_device::write_pb7)); + m_sasibus->data0_handler().set(M6522_TAG, FUNC(via6522_device::write_pa0)); + m_sasibus->data1_handler().set(M6522_TAG, FUNC(via6522_device::write_pa1)); + m_sasibus->data2_handler().set(M6522_TAG, FUNC(via6522_device::write_pa2)); + m_sasibus->data3_handler().set(M6522_TAG, FUNC(via6522_device::write_pa3)); + m_sasibus->data4_handler().set(M6522_TAG, FUNC(via6522_device::write_pa4)); + m_sasibus->data5_handler().set(M6522_TAG, FUNC(via6522_device::write_pa5)); + m_sasibus->data6_handler().set(M6522_TAG, FUNC(via6522_device::write_pa6)); + m_sasibus->data7_handler().set(M6522_TAG, FUNC(via6522_device::write_pa7)); + + OUTPUT_LATCH(config, m_sasi_data_out); + m_sasibus->set_output_latch(*m_sasi_data_out); + + m_sasibus->set_slot_device(1, "harddisk", D9060HD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_0)); +} //------------------------------------------------- diff --git a/src/devices/bus/ieee488/d9060.h b/src/devices/bus/ieee488/d9060.h index d08d43ab740..b9d720090f2 100644 --- a/src/devices/bus/ieee488/d9060.h +++ b/src/devices/bus/ieee488/d9060.h @@ -65,8 +65,8 @@ private: DECLARE_WRITE_LINE_MEMBER( enable_w ); DECLARE_WRITE8_MEMBER( scsi_data_w ); - required_device<cpu_device> m_maincpu; - required_device<cpu_device> m_hdccpu; + required_device<m6502_device> m_maincpu; + required_device<m6502_device> m_hdccpu; required_device<mos6532_new_device> m_riot0; required_device<mos6532_new_device> m_riot1; required_device<via6522_device> m_via; @@ -86,8 +86,8 @@ private: uint8_t m_data; int m_variant; - void d9060_hdc_mem(address_map &map); - void d9060_main_mem(address_map &map); + void hdc_mem(address_map &map); + void main_mem(address_map &map); }; diff --git a/src/devices/bus/ieee488/ieee488.cpp b/src/devices/bus/ieee488/ieee488.cpp index 9241d5670ac..6228136e1cd 100644 --- a/src/devices/bus/ieee488/ieee488.cpp +++ b/src/devices/bus/ieee488/ieee488.cpp @@ -93,6 +93,13 @@ void ieee488_slot_device::device_start() } +void ieee488_slot_device::add_cbm_slot(machine_config &config, const char *_tag, int _address, const char *_def_slot) +{ + ieee488_slot_device &slot(IEEE488_SLOT(config, _tag, 0)); + cbm_ieee488_devices(slot); + slot.set_default_option(_def_slot); + slot.set_address(_address); +} //************************************************************************** // LIVE DEVICE diff --git a/src/devices/bus/ieee488/ieee488.h b/src/devices/bus/ieee488/ieee488.h index 9dd05039e0a..e734b356d5b 100644 --- a/src/devices/bus/ieee488/ieee488.h +++ b/src/devices/bus/ieee488/ieee488.h @@ -107,6 +107,16 @@ public: template <class Object> devcb_base &set_ren_callback(Object &&cb) { return m_write_ren.set_callback(std::forward<Object>(cb)); } template <class Object> devcb_base &set_dio_callback(Object &&cb) { return m_write_dio.set_callback(std::forward<Object>(cb)); } + auto eoi_callback() { return m_write_eoi.bind(); } + auto dav_callback() { return m_write_dav.bind(); } + auto nrfd_callback() { return m_write_nrfd.bind(); } + auto ndac_callback() { return m_write_ndac.bind(); } + auto ifc_callback() { return m_write_ifc.bind(); } + auto srq_callback() { return m_write_srq.bind(); } + auto atn_callback() { return m_write_atn.bind(); } + auto ren_callback() { return m_write_ren.bind(); } + auto dio_callback() { return m_write_dio.bind(); } + void add_device(ieee488_slot_device *slot, device_t *target); // reads for both host and peripherals @@ -198,6 +208,8 @@ private: uint8_t m_dio; }; +DECLARE_DEVICE_TYPE(IEEE488, ieee488_device) + // ======================> ieee488_slot_device @@ -208,6 +220,20 @@ public: // construction/destruction ieee488_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + static void add_cbm_slot(machine_config &config, const char *_tag, int _address, const char *_def_slot); + static void add_cbm_defaults(machine_config &config, const char *_default_drive) + { + add_cbm_slot(config, "ieee4", 4, nullptr); + add_cbm_slot(config, "ieee8", 8, _default_drive); + add_cbm_slot(config, "ieee9", 9, nullptr); + add_cbm_slot(config, "ieee10", 10, nullptr); + add_cbm_slot(config, "ieee11", 11, nullptr); + add_cbm_slot(config, "ieee12", 12, nullptr); + add_cbm_slot(config, "ieee13", 13, nullptr); + add_cbm_slot(config, "ieee14", 14, nullptr); + add_cbm_slot(config, "ieee15", 15, nullptr); + } + void set_address(int address) { m_address = address; } int get_address() { return m_address; } @@ -218,6 +244,8 @@ protected: int m_address; }; +DECLARE_DEVICE_TYPE(IEEE488_SLOT, ieee488_slot_device) + // ======================> device_ieee488_interface @@ -253,11 +281,6 @@ private: }; -// device type definition -DECLARE_DEVICE_TYPE(IEEE488, ieee488_device) -DECLARE_DEVICE_TYPE(IEEE488_SLOT, ieee488_slot_device) - - void cbm_ieee488_devices(device_slot_interface &device); void hp_ieee488_devices(device_slot_interface &device); void remote488_devices(device_slot_interface &device); diff --git a/src/devices/bus/interpro/keyboard/keyboard.cpp b/src/devices/bus/interpro/keyboard/keyboard.cpp index 518ae7176f3..10b0a038d9e 100644 --- a/src/devices/bus/interpro/keyboard/keyboard.cpp +++ b/src/devices/bus/interpro/keyboard/keyboard.cpp @@ -10,22 +10,13 @@ DEFINE_DEVICE_TYPE(INTERPRO_KEYBOARD_PORT, interpro_keyboard_port_device, "interpro_keyboard_port", "InterPro Keyboard Port") interpro_keyboard_port_device::interpro_keyboard_port_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock) - : interpro_keyboard_port_device(mconfig, INTERPRO_KEYBOARD_PORT, tag, owner, clock) -{ -} - -interpro_keyboard_port_device::interpro_keyboard_port_device(machine_config const &mconfig, device_type type, char const *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, type, tag, owner, clock) + : device_t(mconfig, INTERPRO_KEYBOARD_PORT, tag, owner, clock) , device_slot_interface(mconfig, *this) , m_rxd_handler(*this) , m_dev(nullptr) { } -interpro_keyboard_port_device::~interpro_keyboard_port_device() -{ -} - void interpro_keyboard_port_device::device_config_complete() { m_dev = dynamic_cast<device_interpro_keyboard_port_interface *>(get_card_device()); @@ -34,8 +25,6 @@ void interpro_keyboard_port_device::device_config_complete() void interpro_keyboard_port_device::device_start() { m_rxd_handler.resolve_safe(); - - save_item(NAME(m_rxd)); } WRITE_LINE_MEMBER(interpro_keyboard_port_device::write_txd) @@ -50,10 +39,6 @@ device_interpro_keyboard_port_interface::device_interpro_keyboard_port_interface { } -device_interpro_keyboard_port_interface::~device_interpro_keyboard_port_interface() -{ -} - #include "hle.h" #include "lle.h" diff --git a/src/devices/bus/interpro/keyboard/keyboard.h b/src/devices/bus/interpro/keyboard/keyboard.h index 9d40e5a9e96..83347f17114 100644 --- a/src/devices/bus/interpro/keyboard/keyboard.h +++ b/src/devices/bus/interpro/keyboard/keyboard.h @@ -5,13 +5,6 @@ #pragma once -#define MCFG_INTERPRO_KEYBOARD_PORT_ADD(tag, slot_intf, def_slot) \ - MCFG_DEVICE_ADD(tag, INTERPRO_KEYBOARD_PORT, 0) \ - MCFG_DEVICE_SLOT_INTERFACE(slot_intf, def_slot, false) - -#define MCFG_INTERPRO_KEYBOARD_RXD_HANDLER(cb) \ - downcast<interpro_keyboard_port_device &>(*device).set_rxd_handler(DEVCB_##cb); - class device_interpro_keyboard_port_interface; class interpro_keyboard_port_device : public device_t, public device_slot_interface @@ -19,25 +12,31 @@ class interpro_keyboard_port_device : public device_t, public device_slot_interf friend class device_interpro_keyboard_port_interface; public: - interpro_keyboard_port_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock); - virtual ~interpro_keyboard_port_device(); - - // static configuration helpers - template <class Object> devcb_base &set_rxd_handler(Object &&cb) { return m_rxd_handler.set_callback(std::forward<Object>(cb)); } - + template <typename T> + interpro_keyboard_port_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&slot_options, const char *default_option) + : interpro_keyboard_port_device(mconfig, tag, owner) + { + option_reset(); + slot_options(*this); + set_default_option(default_option); + set_fixed(false); + } + + interpro_keyboard_port_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock = 0); + + // callback configuration + auto rxd_handler_cb() { return m_rxd_handler.bind(); } + + // input lines DECLARE_WRITE_LINE_MEMBER(write_txd); protected: - interpro_keyboard_port_device(machine_config const &mconfig, device_type type, char const *tag, device_t *owner, uint32_t clock); - virtual void device_start() override; virtual void device_config_complete() override; - int m_rxd; - +private: devcb_write_line m_rxd_handler; -private: device_interpro_keyboard_port_interface *m_dev; }; @@ -46,15 +45,14 @@ class device_interpro_keyboard_port_interface : public device_slot_card_interfac friend class interpro_keyboard_port_device; public: - virtual ~device_interpro_keyboard_port_interface() override; - + // input lines virtual DECLARE_WRITE_LINE_MEMBER(input_txd) { } - - DECLARE_WRITE_LINE_MEMBER(output_rxd) { m_port->m_rxd = state; m_port->m_rxd_handler(state); } + DECLARE_WRITE_LINE_MEMBER(output_rxd) { m_port->m_rxd_handler(state); } protected: device_interpro_keyboard_port_interface(machine_config const &mconfig, device_t &device); +private: interpro_keyboard_port_device *m_port; }; diff --git a/src/devices/bus/interpro/keyboard/lle.cpp b/src/devices/bus/interpro/keyboard/lle.cpp index 0bab0a00863..d99797f2cec 100644 --- a/src/devices/bus/interpro/keyboard/lle.cpp +++ b/src/devices/bus/interpro/keyboard/lle.cpp @@ -97,8 +97,8 @@ * relevant make/break codes that are then output via the serial interface. * * TODO - * - upper matrix mapping - * - mappings for hold screen, superimpose, repeat + * - remaining upper matrix mapping + * - mapping for superimpose */ /* @@ -164,112 +164,112 @@ namespace { INPUT_PORTS_START(interpro_en_us) PORT_START("upper.0") - // nothing - // fc 4c - // fc 6c + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("2nd F R") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("B16") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("C16") // nothing // nothing // nothing PORT_START("upper.1") - // fc 28 - // fc 46 - // fc 66 - // fc 64 - // fc 44 - // fc 26 + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("A13") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("B13") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("C13") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("C12") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("B12") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("A12") PORT_START("upper.2") - // fc 2a - // fc 48 - // fc 68 - // fc 62 - // fc 42 - // fc 24 + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("A14") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("B14") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("C14") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("C11") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("B11") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("A11") PORT_START("upper.3") - // fc 2c - // fc 4a - // fc 6a - // fc 60 - // fc 40 - // fc 22 + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("A15") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("B15") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("C15") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("C10") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("B10") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("A10") PORT_START("upper.4") - // fc 1c - // fc 3a - // fc 5a - // fc 58 - // fc 38 - // fc 1a + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("A7") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("B7") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("C7") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("C6") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("B6") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("A6") PORT_START("upper.5") - // fc 1e - // fc 3c - // fc 5c - // fc 56 - // fc 36 - // fc 18 + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("A8") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("B8") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("C8") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("C5") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("B5") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("A5") PORT_START("upper.6") - // fc 20 - // fc 3e - // fc 5e - // fc 54 - // fc 34 - // fc 16 + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("A9") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("B9") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("C9") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("C4") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("B4") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("A4") PORT_START("upper.7") - // fc 14 - // fc 32 - // fc 52 - // fc 01 - // fc 04 - // fc 07 + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("A3") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("B3") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("C3") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Select") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Find") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Help") PORT_START("upper.8") - // fc 12 - // fc 30 - // fc 50 - // fc 02 - // fc 05 - // fc 08 + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("A2") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("B2") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("C2") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Prev Screen") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Insert Here") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Clear Screen") PORT_START("upper.9") - // fc 10 - // fc 2e - // fc 4e - // fc 03 - // fc 06 - // nothing? + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("A1") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("B1") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("C1") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Next Screen") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Remove") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("2nd F L") PORT_START("upper.a") - // fc 6e - // fc 76 - // fc 7e + // 6e + // 76 + // 7e // nothing // nothing // nothing PORT_START("upper.b") - // fc 70 - // fc 78 - // fc 80 + // 70 + // 78 + // 80 // nothing // nothing // nothing PORT_START("upper.c") - // fc 72 - // fc 7a - // fc 82 + // 72 + // 7a + // 82 // nothing // nothing // nothing PORT_START("upper.d") - // fc 74 - // fc 7c + // 74 + // 7c // nothing // nothing // nothing @@ -385,13 +385,13 @@ INPUT_PORTS_START(interpro_en_us) PORT_START("lower.9") // 0x48-0x4f: none 0x83 0x84 0xb2 0xb3 0x00 0x82 lf - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Repeat") // ? + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Repeat") PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_DOWN) PORT_NAME("Down") PORT_CHAR(UCHAR_MAMEKEY(DOWN)) PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_RIGHT) PORT_NAME("Right") PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Keypad 2") PORT_CHAR(UCHAR_MAMEKEY(2_PAD)) PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Keypad 3") PORT_CHAR(UCHAR_MAMEKEY(3_PAD)) PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) // 0x00 - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) // 0x82 + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Hold Screen") PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Line Feed") PORT_CHAR(10) PORT_START("lower.a") diff --git a/src/devices/bus/interpro/mouse/mouse.h b/src/devices/bus/interpro/mouse/mouse.h index d13ee669e48..c5969ba4667 100644 --- a/src/devices/bus/interpro/mouse/mouse.h +++ b/src/devices/bus/interpro/mouse/mouse.h @@ -5,9 +5,6 @@ #pragma once -#define MCFG_MOUSE_STATE_CB(_state_cb) \ - downcast<interpro_mouse_port_device &>(*device).set_state_callback(DEVCB_##_state_cb); - class device_interpro_mouse_port_interface; class interpro_mouse_port_device : public device_t, public device_slot_interface @@ -15,9 +12,20 @@ class interpro_mouse_port_device : public device_t, public device_slot_interface friend class device_interpro_mouse_port_interface; public: - interpro_mouse_port_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock); + template <typename T> + interpro_mouse_port_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&slot_options, const char *default_option) + : interpro_mouse_port_device(mconfig, tag, owner) + { + option_reset(); + slot_options(*this); + set_default_option(default_option); + set_fixed(false); + } + + interpro_mouse_port_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock = 0); - template <class Object> devcb_base &set_state_callback(Object &&cb) { return m_state_func.set_callback(std::forward<Object>(cb)); } + // callback configuration + auto state_func() { return m_state_func.bind(); } protected: // device-level overrides @@ -25,9 +33,9 @@ protected: virtual void device_start() override; virtual void device_config_complete() override; +private: devcb_write32 m_state_func; -private: device_interpro_mouse_port_interface *m_device; }; @@ -41,6 +49,7 @@ public: protected: device_interpro_mouse_port_interface(machine_config const &mconfig, device_t &device); +private: interpro_mouse_port_device *m_port; }; diff --git a/src/devices/bus/interpro/sr/edge.cpp b/src/devices/bus/interpro/sr/edge.cpp index ec9598bb663..e9b39e363ce 100644 --- a/src/devices/bus/interpro/sr/edge.cpp +++ b/src/devices/bus/interpro/sr/edge.cpp @@ -80,6 +80,12 @@ * Y3 33.3333MHz crystal * Y4? 40.0MHz crystal * + * TMS44C256-80SD 256Kx4 Fast Page DRAM (total 6MiB) + * U242-U253 12 parts + * U256-U267 12 parts + * U275-U286 12 parts + * U289-U300 12 parts + * * EDGE-2 Plus Frame Buffer (PCB896) * * Ref Part Function @@ -91,8 +97,15 @@ * U360 164.609300MHz crystal Pixel clock * * MCM6294P20 16Kx4 Bit Synchronous Static RAM (total 256KiB) - * U233-240 group 1, 8 parts = 16Kx32 - * U300-323 group 2, 24 parts = 16Kx32x3 + * U233-240 8 parts + * U300-323 24 parts + * + * M5M442256AL-8 256Kx4 Video DRAM (total 9MiB) + * U73-U80 8 parts + * U82-U97 16 parts + * U99-U114 16 parts + * U116-U131 16 parts + * U133-U148 16 parts * * Processor board idprom feature byte 0 contains various flags: * @@ -194,7 +207,8 @@ #include "emu.h" #include "edge.h" -#define LOG_GENERAL (1U << 0) +#define LOG_GENERAL (1U << 0) +#define LOG_INTERRUPT (1U << 1) #define VERBOSE (LOG_GENERAL) @@ -207,10 +221,53 @@ DEFINE_DEVICE_TYPE(MPCBA63, mpcba63_device, "mpcba63", "EDGE-2 Frame Buffer f/1M DEFINE_DEVICE_TYPE(MSMT094, msmt094_device, "msmt094", "EDGE-2 Plus Processor f/1 2Mp-FB") DEFINE_DEVICE_TYPE(MPCB896, mpcb896_device, "mpcb896", "EDGE-2/Plus Frame Buffer f/2Mp Monitor (V-60)") -void edge1_device_base::map(address_map &map) +// TODO: move masks to the header when finalised +enum control_mask { - srx_card_device_base::map(map); + NO_HOLD = 0x01, // release DSP hold + DSP_1_HOLD_L = 0x02, // hold DSP 1 + // 0x04 maybe reset? + FIFO_LW_ENB = 0x08, // fifo low water interrupt enable + HOLD_ENB = 0x10, // DSP hold interrupt enable + HOLDA_INT_H = 0x20, // DSP hold interrupt asserted (aka HOLD_INTR) + FIFO_LW_INTR = 0x40, // fifo low water interrupt asserted (ififo) + FIFO_HW_INTR = 0x80, // fifo high water interrupt asserted (ififo) +}; + +enum status_mask +{ + DSP_1_HOLDA_H = 0x01, // aka DSP_HOLDA + FIFO_EMPTY = 0x02, // aka IFIFO_EMPTY? + FIFO_HFULL = 0x04, + KREG_OUT_FULL = 0x08, + KREG_IN_FULL = 0x10, + + // SRX_INT0_H + // SRX_PORT_RDY +}; + +enum attention_mask +{ + ATN_TRACK = 0x00010000, // cursor change + ATN_DISP = 0x00020000, // changing contrast or blanking + ATN_MMOUT = 0x00040000, // request for memory-mapped output + ATN_KREQ = 0x00080000, // verify following request is from kernel +}; + +enum reg0_mask +{ +/* + 0x08, + 0x10, // mouse button interrupt? + 0x20, + 0x40, +*/ + SCC_INT = 0x80, // serial controller + VBLANK = 0x1000, // vertical blank? +}; +void edge1_device_base::map(address_map &map) +{ /* * ODT reports * 000 user 1 mouse/interrupt @@ -248,12 +305,14 @@ void edge1_device_base::map_dynamic(address_map &map) [this](address_space &space, offs_t offset, u8 mem_mask) { return m_sram->read(offset); }, [this](address_space &space, offs_t offset, u8 data, u8 mem_mask) { m_sram->write(offset, data); }); + map(0x01000000, 0x013fffff).lrw8("vram", [this](address_space &space, offs_t offset, u8 mem_mask) { return m_vram->read((offset >> 2) | (offset & 0x3)); }, [this](address_space &space, offs_t offset, u8 data, u8 mem_mask) { m_vram->write((offset >> 2) | (offset & 0x3), data); }); //map(0x02028200, 0x0202827f).lr32("idprom", // [this](address_space &space, offs_t offset, u8 mem_mask) { return memregion("idprom")->as_u32(offset); }); + map(0x02028508, 0x0202850b).rw(FUNC(edge1_device_base::srx_master_control_r), FUNC(edge1_device_base::srx_master_control_w)); map(0x02410000, 0x0241000f).m("ramdac", FUNC(bt458_device::map)).umask32(0x000000ff); @@ -265,13 +324,13 @@ void edge1_device_base::map_dynamic(address_map &map) // 0x02410014 // 0x02410018 - ramdac/screen/buffer select? + map(0x02410018, 0x0241001b).noprw(); // 0x02410040 - reg0? + map(0x02410040, 0x02410043).noprw(); } void edge2_processor_device_base::map(address_map &map) { - srx_card_device_base::map(map); - map(0x100, 0x103).nopr(); // control map(0x104, 0x107).nopr(); // status/attention map(0x108, 0x10b).nopr(); // fifo @@ -289,10 +348,11 @@ void edge2_processor_device_base::map(address_map &map) void edge2plus_processor_device_base::map(address_map &map) { - srx_card_device_base::map(map); - map(0x000, 0x003).rw(FUNC(edge2plus_processor_device_base::reg0_r), FUNC(edge2plus_processor_device_base::reg0_w)); + map(0x008, 0x008).lr8("mouse_x", []() { return 0; }); + map(0x00c, 0x00c).lr8("mouse_y", []() { return 0; }); + map(0x010, 0x01f).rw("scc", FUNC(z80scc_device::cd_ab_r), FUNC(z80scc_device::cd_ab_w)).umask32(0x000000ff); map(0x100, 0x103).rw(FUNC(edge2plus_processor_device_base::control_r), FUNC(edge2plus_processor_device_base::control_w)); @@ -337,12 +397,10 @@ void edge2plus_framebuffer_device_base::map_dynamic(address_map &map) void edge2_framebuffer_device_base::map(address_map &map) { - srx_card_device_base::map(map); } void edge2plus_framebuffer_device_base::map(address_map &map) { - srx_card_device_base::map(map); } ROM_START(mpcb828) @@ -368,6 +426,24 @@ ROM_END ROM_START(msmt094) ROM_REGION(0x80, "idprom", 0) ROM_LOAD32_BYTE("msmt0940.bin", 0x0, 0x20, CRC(55493b9e) SHA1(6e0668f7e85e1bb5b2ecc6e5a5ab53e5281f22e9)) + + // 40 and 70 are sequential and have same date stamp + ROM_REGION(0x40000, "prg1", 0) + ROMX_LOAD("mprgp040b_apr_02_92.u313", 0, 0x10000, CRC(3b3fce3d) SHA1(077ddf9124d1cbca4be1f1deffa39b10f6a80fb2), ROM_SKIP(3)) + ROMX_LOAD("mprgp070b_apr_02_92.u310", 2, 0x10000, CRC(29020df3) SHA1(e3c20d361acf5a9d496c3057a9baa108bd840acc), ROM_SKIP(3)) + ROMX_LOAD("mprgp080b_apr_02_92.u306", 3, 0x10000, CRC(61efb8f7) SHA1(4f70230d01b9e1ee76b187a2d6653601b120578e), ROM_SKIP(3)) + ROMX_LOAD("mprgp050b_apr_02_92.u239", 1, 0x10000, CRC(866975b2) SHA1(b8caa30bd2824ee28bb82afe9275268822ac8f40), ROM_SKIP(3)) + + // 64k treated as 256k? + ROM_REGION(0x40000, "mprgp060b", 0) + ROM_LOAD32_BYTE("mprgp060b_16_mar_92.u222", 0, 0x10000, CRC(9bac2c00) SHA1(b31b8930d501277dd2a8d3438ac8422de412c8f6)) + + ROM_REGION(0x4000, "mprgp010a", 0) + ROM_LOAD("mprgp010a_04_01_92.u207", 0, 0x4000, CRC(e461ab92) SHA1(ddf0a9ed635e54f2b32e54b39850204a3532f9f9)) + + ROM_REGION(0x4000, "mprgp020a", 0) + ROM_LOAD("mprgp020a_31_mar_92.u206", 0, 0x4000, CRC(38c129b4) SHA1(a33cd5c0f3e45fdd7e22df2ff1648f4d73b09b19)) + ROM_END ROM_START(mpcb896) @@ -376,21 +452,21 @@ ROM_START(mpcb896) ROM_END /* -* MPCB828: EDGE-1 graphics, 1 megapixel, single screen, 60Hz refresh. -* -* Screen timings to match PCB963. -* -* "9 planes (1 for highlights) of double-buffered graphics, 256 colours from 16.7 million" -* 1024x1024x10x2 == 2621440 bytes == 2560KiB == 2.5MiB -* FIXME: diag reports 128KiB static ram, 1MiB video ram, 4 screens, 1 user, z-buffer absent -* -*/ + * MPCB828: EDGE-1 graphics, 1 megapixel, single screen, 60Hz refresh. + * + * Screen timings to match PCB963. + * + * "9 planes (1 for highlights) of double-buffered graphics, 256 colours from 16.7 million" + * 1024x1024x10x2 == 2621440 bytes == 2560KiB == 2.5MiB + * FIXME: diag reports 128KiB static ram, 1MiB video ram, 4 screens, 1 user, z-buffer absent + * + */ MACHINE_CONFIG_START(mpcb828_device::device_add_mconfig) MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_RAW_PARAMS(83'020'800, 1504, 296 + 20, 1184 + 296 + 20, 920, 34, 884 + 34) //MCFG_SCREEN_RAW_PARAMS(83'020'800, 1184, 0, 1184, 884, 0, 884) MCFG_SCREEN_UPDATE_DEVICE(DEVICE_SELF, mpcb828_device, screen_update) - MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(DEVICE_SELF, device_srx_card_interface, vblank)) + MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(DEVICE_SELF, mpcb828_device, vblank)) MCFG_DEVICE_ADD("sram", RAM, 0) MCFG_RAM_DEFAULT_SIZE("128KiB") @@ -402,6 +478,7 @@ MACHINE_CONFIG_START(mpcb828_device::device_add_mconfig) MCFG_DEVICE_ADD("dsp", TMS32030, 1) // 30_MHz_XTAL MCFG_TMS3203X_HOLDA_CB(WRITELINE(DEVICE_SELF, mpcb828_device, holda)) + //MCFG_DEVICE_ADDRESS_MAP(0, map_dynamic<2>) MCFG_DEVICE_ADD("ramdac", BT458, 83'020'800) @@ -409,8 +486,7 @@ MACHINE_CONFIG_START(mpcb828_device::device_add_mconfig) MCFG_Z80SCC_OUT_INT_CB(WRITELINE(DEVICE_SELF, mpcb828_device, scc_irq)) MCFG_Z80SCC_OUT_TXDA_CB(WRITELINE("kbd", interpro_keyboard_port_device, write_txd)) - MCFG_INTERPRO_KEYBOARD_PORT_ADD("kbd", interpro_keyboard_devices, "hle_en_us") - MCFG_INTERPRO_KEYBOARD_RXD_HANDLER(WRITELINE("scc", z80scc_device, rxa_w)) + INTERPRO_KEYBOARD_PORT(config, "kbd", interpro_keyboard_devices, "hle_en_us").rxd_handler_cb().set("scc", FUNC(z80scc_device::rxa_w)); MACHINE_CONFIG_END /* @@ -444,8 +520,7 @@ MACHINE_CONFIG_START(mpcb849_device::device_add_mconfig) MCFG_Z80SCC_OUT_INT_CB(WRITELINE(DEVICE_SELF, mpcb849_device, scc_irq)) MCFG_Z80SCC_OUT_TXDA_CB(WRITELINE("kbd", interpro_keyboard_port_device, write_txd)) - MCFG_INTERPRO_KEYBOARD_PORT_ADD("kbd", interpro_keyboard_devices, "hle_en_us") - MCFG_INTERPRO_KEYBOARD_RXD_HANDLER(WRITELINE("scc", z80scc_device, rxa_w)) + INTERPRO_KEYBOARD_PORT(config, "kbd", interpro_keyboard_devices, "hle_en_us").rxd_handler_cb().set("scc", FUNC(z80scc_device::rxa_w)); MACHINE_CONFIG_END /* @@ -482,6 +557,12 @@ MACHINE_CONFIG_START(msmt094_device::device_add_mconfig) // FIXME: actually 33.333_MHz_XTAL MCFG_DEVICE_ADD("dsp1", TMS32030, 1) MCFG_TMS3203X_HOLDA_CB(WRITELINE(DEVICE_SELF, msmt094_device, holda)) + MCFG_DEVICE_ADDRESS_MAP(0, dsp1_map) + + MCFG_DEVICE_ADD("ram", RAM, 0) + MCFG_RAM_DEFAULT_SIZE("6MiB") + MCFG_RAM_DEFAULT_VALUE(0) + //MCFG_DEVICE_ADD("dsp2", TMS32030, 40_MHz_XTAL) //MCFG_DEVICE_ADD("dsp3", TMS32030, 40_MHz_XTAL) @@ -490,8 +571,7 @@ MACHINE_CONFIG_START(msmt094_device::device_add_mconfig) MCFG_Z80SCC_OUT_INT_CB(WRITELINE(DEVICE_SELF, msmt094_device, scc_irq)) MCFG_Z80SCC_OUT_TXDA_CB(WRITELINE("kbd", interpro_keyboard_port_device, write_txd)) - MCFG_INTERPRO_KEYBOARD_PORT_ADD("kbd", interpro_keyboard_devices, "hle_en_us") - MCFG_INTERPRO_KEYBOARD_RXD_HANDLER(WRITELINE("scc", z80scc_device, rxa_w)) + INTERPRO_KEYBOARD_PORT(config, "kbd", interpro_keyboard_devices, "hle_en_us").rxd_handler_cb().set("scc", FUNC(z80scc_device::rxa_w)); MACHINE_CONFIG_END MACHINE_CONFIG_START(mpcb896_device::device_add_mconfig) @@ -515,7 +595,7 @@ MACHINE_CONFIG_END edge1_device_base::edge1_device_base(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, type, tag, owner, clock) - , srx_card_device_base(mconfig, *this) + , device_srx_card_interface(mconfig, *this) , m_screen(*this, "screen") , m_sram(*this, "sram") , m_vram(*this, "vram") @@ -527,13 +607,13 @@ edge1_device_base::edge1_device_base(const machine_config &mconfig, device_type edge2_processor_device_base::edge2_processor_device_base(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, type, tag, owner, clock) - , srx_card_device_base(mconfig, *this) + , device_srx_card_interface(mconfig, *this) { } edge2plus_processor_device_base::edge2plus_processor_device_base(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, type, tag, owner, clock) - , srx_card_device_base(mconfig, *this) + , device_srx_card_interface(mconfig, *this) , m_dsp1(*this, "dsp1") , m_screen(nullptr) { @@ -541,13 +621,13 @@ edge2plus_processor_device_base::edge2plus_processor_device_base(const machine_c edge2_framebuffer_device_base::edge2_framebuffer_device_base(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, type, tag, owner, clock) - , srx_card_device_base(mconfig, *this) + , device_srx_card_interface(mconfig, *this) { } edge2plus_framebuffer_device_base::edge2plus_framebuffer_device_base(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, type, tag, owner, clock) - , srx_card_device_base(mconfig, *this) + , device_srx_card_interface(mconfig, *this) , m_screen(*this, "screen") , m_sram(*this, "sram") , m_vram(*this, "vram") @@ -617,42 +697,26 @@ const tiny_rom_entry *mpcb896_device::device_rom_region() const void edge1_device_base::device_start() { - set_bus_device(); - // FIXME: dynamically allocate SR region 4 m_bus->install_map(*this, 0x90000000, 0x93ffffff, &edge1_device_base::map_dynamic); } -void edge2_processor_device_base::device_start() -{ - set_bus_device(); -} - -void edge2plus_processor_device_base::device_start() -{ - set_bus_device(); -} - -void edge2_framebuffer_device_base::device_start() -{ - set_bus_device(); -} void edge2plus_framebuffer_device_base::device_start() { - set_bus_device(); - // find the processor board and notify it of our screen edge2plus_processor_device_base *processor = m_bus->get_card<edge2plus_processor_device_base>(); if (processor != nullptr) { LOG("found processor device %s\n", processor->tag()); - processor->register_screen(m_screen); + processor->register_screen(m_screen, m_sram); } // FIXME: dynamically allocate SR region 4 m_bus->install_map(*this, 0x90000000, 0x93ffffff, &edge2plus_framebuffer_device_base::map_dynamic); + + processor->m_dsp1->set_addrmap(0, address_map_constructor(&edge2plus_framebuffer_device_base::map_dynamic, processor->m_dsp1->tag(), this)); } u32 mpcb849_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) @@ -665,6 +729,18 @@ u32 mpcba63_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, c return 0; } +WRITE_LINE_MEMBER(edge1_device_base::vblank) +{ + if (state) + { + // TODO: set vblank status + m_bus->vblank_w(ASSERT_LINE); + m_bus->vblank_w(CLEAR_LINE); + } + else + ; // TODO: clear vblank status +} + u32 edge1_device_base::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { u8 *pixel_data = m_vram->pointer(); @@ -698,6 +774,10 @@ u32 edge2plus_framebuffer_device_base::screen_update(screen_device &screen, bitm WRITE32_MEMBER(edge1_device_base::control_w) { + // clear interrupt + if (m_control & HOLDA_INT_H && !(data & HOLDA_INT_H)) + irq0(CLEAR_LINE); + COMBINE_DATA(&m_control); // release dsp 1 hold @@ -711,7 +791,7 @@ WRITE32_MEMBER(edge1_device_base::control_w) WRITE_LINE_MEMBER(edge1_device_base::holda) { - LOG("hold acknowledge %d\n", state); + LOGMASKED(LOG_INTERRUPT, "hold acknowledge %d\n", state); if (state) { @@ -743,7 +823,7 @@ WRITE32_MEMBER(edge2plus_processor_device_base::control_w) WRITE_LINE_MEMBER(edge2plus_processor_device_base::holda) { - LOG("hold acknowledge %d\n", state); + LOGMASKED(LOG_INTERRUPT, "hold acknowledge %d\n", state); if (state) { @@ -759,16 +839,73 @@ WRITE_LINE_MEMBER(edge2plus_processor_device_base::holda) m_status &= ~DSP_1_HOLDA_H; } +void edge2plus_processor_device_base::dsp1_map(address_map &map) +{ + map(0x00000, 0x3ffff).lrw8("sram", + [this](address_space &space, offs_t offset, u8 mem_mask) { return m_sram->read(offset); }, + [this](address_space &space, offs_t offset, u8 data, u8 mem_mask) { m_sram->write(offset, data); }); + + map(0x40000, 0x7ffff).lr32("prg1", + [this](address_space &space, offs_t offset, u32 mem_mask) { return memregion("prg1")->as_u32(offset); }); +} + + WRITE32_MEMBER(edge2plus_framebuffer_device_base::lut_select_w) { LOG("select ramdac %d\n", data); - void (bt457_device::*map)(address_map &) = &bt457_device::map; + //void (bt457_device::*map)(address_map &) = &bt457_device::map; // TODO: not sure what should happen for values > 2 // FIXME: this should probably be some kind of bank device, including the idprom - m_bus->main_space()->install_device(0x92028280U, 0x9202828fU, *m_ramdac[data % 3], map, 0xff, 8); - m_bus->io_space()->install_device(0x92028280U, 0x9202828fU, *m_ramdac[data % 3], map, 0xff, 8); + //m_bus->main_space()->install_device(0x92028280U, 0x9202828fU, *m_ramdac[data % 3], map, 0xff, 8); + //m_bus->io_space()->install_device(0x92028280U, 0x9202828fU, *m_ramdac[data % 3], map, 0xff, 8); // lookup table 3 enables address range 92030000-92030fff, written with zeroes } + +WRITE_LINE_MEMBER(edge1_device_base::scc_irq) +{ + if (state) + m_reg0 |= SCC_INT; + else + m_reg0 &= ~SCC_INT; + + irq0(state); +} + +READ32_MEMBER(edge1_device_base::reg0_r) +{ + return ((m_reg0 & ~VBLANK) | (m_screen->vblank() ? VBLANK : 0)); +} + +WRITE32_MEMBER(edge1_device_base::kernel_w) +{ + COMBINE_DATA(&m_kernel); + + m_status |= KREG_IN_FULL; // FIXME: what clears this? +} + +WRITE_LINE_MEMBER(edge2plus_processor_device_base::scc_irq) +{ + if (state) + m_reg0 |= SCC_INT; + else + m_reg0 &= ~SCC_INT; + + irq0(state); +} + +WRITE32_MEMBER(edge2plus_processor_device_base::kernel_w) +{ + COMBINE_DATA(&m_kernel); + + m_status |= KREG_IN_FULL; // FIXME: what clears this? +} + +READ32_MEMBER(edge2plus_processor_device_base::reg0_r) +{ + LOG("reg0_r vblank %d\n", m_screen->vblank()); + + return (m_screen == nullptr) ? (m_reg0 & ~VBLANK) : ((m_reg0 & ~VBLANK) | (m_screen->vblank() ? VBLANK : 0)); +} diff --git a/src/devices/bus/interpro/sr/edge.h b/src/devices/bus/interpro/sr/edge.h index 5f3247b5158..e8a66459271 100644 --- a/src/devices/bus/interpro/sr/edge.h +++ b/src/devices/bus/interpro/sr/edge.h @@ -14,52 +14,11 @@ #include "machine/z80scc.h" #include "bus/interpro/keyboard/keyboard.h" -enum control_mask -{ - NO_HOLD = 0x01, // release DSP hold - DSP_1_HOLD_L = 0x02, // hold DSP 1 - // 0x04 maybe reset? - FIFO_LW_ENB = 0x08, // fifo low water interrupt enable - HOLD_ENB = 0x10, // DSP hold interrupt enable - HOLDA_INT_H = 0x20, // DSP hold interrupt asserted (aka HOLD_INTR) - FIFO_LW_INTR = 0x40, // fifo low water interrupt asserted (ififo) - FIFO_HW_INTR = 0x80, // fifo high water interrupt asserted (ififo) -}; - -enum status_mask -{ - DSP_1_HOLDA_H = 0x01, // aka DSP_HOLDA - FIFO_EMPTY = 0x02, // aka IFIFO_EMPTY? - FIFO_HFULL = 0x04, - KREG_OUT_FULL = 0x08, - KREG_IN_FULL = 0x10, - - // SRX_INT0_H - // SRX_PORT_RDY -}; - -enum attention_mask -{ -}; - -enum reg0_mask -{ -/* - 0x08, - 0x10, // mouse button interrupt? - 0x20, - 0x40, -*/ - SCC_INT = 0x80, // serial controller - VBLANK = 0x1000, // vertical blank? -}; - -class edge1_device_base : public device_t, public srx_card_device_base +class edge1_device_base : public device_t, public device_srx_card_interface { public: - const char *tag() const { return device_t::tag(); } - DECLARE_WRITE_LINE_MEMBER(holda); + DECLARE_WRITE_LINE_MEMBER(vblank); protected: edge1_device_base(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); @@ -70,9 +29,9 @@ protected: u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); - DECLARE_WRITE_LINE_MEMBER(scc_irq) { if (state) m_reg0 |= SCC_INT; else m_reg0 &= ~SCC_INT; irq0(state); } + DECLARE_WRITE_LINE_MEMBER(scc_irq); - DECLARE_READ32_MEMBER(reg0_r) { return ((m_reg0 & ~VBLANK) | (m_screen->vblank() ? VBLANK : 0)); } + DECLARE_READ32_MEMBER(reg0_r); DECLARE_WRITE32_MEMBER(reg0_w) { COMBINE_DATA(&m_reg0); } DECLARE_READ32_MEMBER(control_r) { return m_control; }; @@ -82,7 +41,7 @@ protected: DECLARE_READ32_MEMBER(fifo_r) { return m_fifo; }; DECLARE_WRITE32_MEMBER(fifo_w) { COMBINE_DATA(&m_fifo); } DECLARE_READ32_MEMBER(kernel_r) { return m_kernel; }; - DECLARE_WRITE32_MEMBER(kernel_w) { COMBINE_DATA(&m_kernel); m_status |= KREG_IN_FULL; } // FIXME: what clears this? + DECLARE_WRITE32_MEMBER(kernel_w); DECLARE_READ32_MEMBER(attention_r) { return m_attention; }; DECLARE_WRITE32_MEMBER(attention_w) { COMBINE_DATA(&m_attention); } @@ -90,6 +49,9 @@ protected: DECLARE_WRITE32_MEMBER(ififo_lwm_w) { COMBINE_DATA(&m_ififo_lwm); } DECLARE_WRITE32_MEMBER(ififo_hwm_w) { COMBINE_DATA(&m_ififo_hwm); } + DECLARE_READ32_MEMBER(srx_master_control_r) { return m_srx_master_control; } + DECLARE_WRITE32_MEMBER(srx_master_control_w) { COMBINE_DATA(&m_srx_master_control); } + required_device<screen_device> m_screen; required_device<ram_device> m_sram; required_device<ram_device> m_vram; @@ -108,57 +70,54 @@ private: u32 m_ififo_lwm; u32 m_ififo_hwm; + + u32 m_srx_master_control; }; -class edge2_processor_device_base : public device_t, public srx_card_device_base +class edge2_processor_device_base : public device_t, public device_srx_card_interface { -public: - const char *tag() const { return device_t::tag(); } - protected: edge2_processor_device_base(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); virtual void map(address_map &map) override; - virtual void device_start() override; + virtual void device_start() override {}; }; -class edge2_framebuffer_device_base : public device_t, public srx_card_device_base +class edge2_framebuffer_device_base : public device_t, public device_srx_card_interface { -public: - const char *tag() const { return device_t::tag(); } - protected: edge2_framebuffer_device_base(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); virtual void map(address_map &map) override; - virtual void device_start() override; + virtual void device_start() override {}; }; -class edge2plus_processor_device_base : public device_t, public srx_card_device_base +class edge2plus_processor_device_base : public device_t, public device_srx_card_interface { public: - const char *tag() const { return device_t::tag(); } - - void register_screen(screen_device *screen) { m_screen = screen; } + void register_screen(screen_device *screen, ram_device *ram) { m_screen = screen; m_sram = ram; } + required_device<tms3203x_device> m_dsp1; protected: edge2plus_processor_device_base(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); virtual void map(address_map &map) override; - virtual void device_start() override; + void dsp1_map(address_map &map); + + virtual void device_start() override {}; DECLARE_WRITE_LINE_MEMBER(holda); - DECLARE_WRITE_LINE_MEMBER(scc_irq) { if (state) m_reg0 |= SCC_INT; else m_reg0 &= ~SCC_INT; irq0(state); } + DECLARE_WRITE_LINE_MEMBER(scc_irq); DECLARE_READ32_MEMBER(control_r) { return m_control; }; DECLARE_WRITE32_MEMBER(control_w); DECLARE_READ32_MEMBER(status_r) { return m_status; }; DECLARE_WRITE32_MEMBER(status_w) { COMBINE_DATA(&m_status); } DECLARE_READ32_MEMBER(kernel_r) { return m_kernel; }; - DECLARE_WRITE32_MEMBER(kernel_w) { COMBINE_DATA(&m_kernel); m_status |= KREG_IN_FULL; } // FIXME: what clears this? + DECLARE_WRITE32_MEMBER(kernel_w); DECLARE_WRITE32_MEMBER(mapping_w) { COMBINE_DATA(&m_mapping); } DECLARE_READ32_MEMBER(attention_r) { return m_attention; }; DECLARE_WRITE32_MEMBER(attention_w) { COMBINE_DATA(&m_attention); } @@ -166,11 +125,9 @@ protected: DECLARE_WRITE32_MEMBER(ififo_lwm_w) { COMBINE_DATA(&m_ififo_lwm); } DECLARE_WRITE32_MEMBER(ififo_hwm_w) { COMBINE_DATA(&m_ififo_hwm); } - DECLARE_READ32_MEMBER(reg0_r) { m_reg0 ^= VBLANK; return m_reg0; } - //DECLARE_READ32_MEMBER(reg0_r) { logerror("reg0_r vblank %d\n", m_screen->vblank()); return (m_screen == nullptr) ? (m_reg0 & ~VBLANK) : ((m_reg0 & ~VBLANK) | (m_screen->vblank() ? VBLANK : 0)); } + DECLARE_READ32_MEMBER(reg0_r); DECLARE_WRITE32_MEMBER(reg0_w) { COMBINE_DATA(&m_reg0); } - required_device<tms3203x_device> m_dsp1; private: u32 m_control; @@ -185,14 +142,14 @@ private: u32 m_reg0; screen_device *m_screen; + ram_device *m_sram; }; -class edge2plus_framebuffer_device_base : public device_t, public srx_card_device_base +class edge2plus_framebuffer_device_base : public device_t, public device_srx_card_interface { -public: - const char *tag() const { return device_t::tag(); } - protected: + friend class edge2plus_processor_device_base; + edge2plus_framebuffer_device_base(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); virtual void map(address_map &map) override; diff --git a/src/devices/bus/interpro/sr/gt.cpp b/src/devices/bus/interpro/sr/gt.cpp index 409ddcd18f8..bcb4b03538c 100644 --- a/src/devices/bus/interpro/sr/gt.cpp +++ b/src/devices/bus/interpro/sr/gt.cpp @@ -153,7 +153,8 @@ void gt_device_base::map(address_map &map) void single_gt_device_base::map(address_map &map) { gt_device_base::map(map); - map(0x00000080, 0x0000008f).m("ramdac0", FUNC(bt459_device::map)).umask32(0x000000ff); + + map(0x00000080, 0x0000008f).m(get_gt(0).ramdac, FUNC(bt459_device::map)).umask32(0x000000ff); map(0x00000090, 0x0000009f).nopw(); // second (missing) ramdac map(0x00400000, 0x005fffff).rw(FUNC(single_gt_device_base::buffer_r), FUNC(single_gt_device_base::buffer_w)); @@ -163,8 +164,8 @@ void dual_gt_device_base::map(address_map &map) { gt_device_base::map(map); - map(0x00000080, 0x0000008f).m("ramdac0", FUNC(bt459_device::map)).umask32(0x000000ff); - map(0x00000090, 0x0000009f).m("ramdac1", FUNC(bt459_device::map)).umask32(0x000000ff); + map(0x00000080, 0x0000008f).m(get_gt(0).ramdac, FUNC(bt459_device::map)).umask32(0x000000ff); + map(0x00000090, 0x0000009f).m(get_gt(1).ramdac, FUNC(bt459_device::map)).umask32(0x000000ff); map(0x00400000, 0x007fffff).rw(FUNC(dual_gt_device_base::buffer_r), FUNC(dual_gt_device_base::buffer_w)); } @@ -217,28 +218,28 @@ ROM_END * These inputs give htotal=1504 and vtotal=920 with high confidence. */ MACHINE_CONFIG_START(mpcb963_device::device_add_mconfig) - MCFG_SCREEN_ADD("screen0", RASTER) + MCFG_SCREEN_ADD(get_gt(0).screen, RASTER) MCFG_SCREEN_RAW_PARAMS(83'020'800, 1504, 296 + GT_X_DELTA, 1184 + 296 + GT_X_DELTA, 920, 34, 884 + 34) MCFG_SCREEN_UPDATE_DEVICE(DEVICE_SELF, mpcb963_device, screen_update0) MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(DEVICE_SELF, device_cbus_card_interface, vblank)) - MCFG_DEVICE_ADD("ramdac0", BT459, 83'020'800) - MCFG_DEVICE_ADD("bpu0", DP8510, 0) + MCFG_DEVICE_ADD(get_gt(0).ramdac, BT459, 83'020'800) + MCFG_DEVICE_ADD(get_gt(0).bpu, DP8510, 0) MACHINE_CONFIG_END // Same as MPCB963, but dual screen. MACHINE_CONFIG_START(mpcba79_device::device_add_mconfig) - MCFG_SCREEN_ADD("screen0", RASTER) + MCFG_SCREEN_ADD(get_gt(0).screen, RASTER) MCFG_SCREEN_RAW_PARAMS(83'020'800, 1504, 296 + GT_X_DELTA, 1184 + 296 + GT_X_DELTA, 920, 34, 884 + 34) MCFG_SCREEN_UPDATE_DEVICE(DEVICE_SELF, mpcba79_device, screen_update0) MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(DEVICE_SELF, device_cbus_card_interface, vblank)) - MCFG_DEVICE_ADD("ramdac0", BT459, 83'020'800) - MCFG_DEVICE_ADD("bpu0", DP8510, 0) + MCFG_DEVICE_ADD(get_gt(0).ramdac, BT459, 83'020'800) + MCFG_DEVICE_ADD(get_gt(0).bpu, DP8510, 0) - MCFG_SCREEN_ADD("screen1", RASTER) + MCFG_SCREEN_ADD(get_gt(1).screen, RASTER) MCFG_SCREEN_RAW_PARAMS(83'020'800, 1504, 296 + GT_X_DELTA, 1184 + 296 + GT_X_DELTA, 920, 34, 884 + 34) MCFG_SCREEN_UPDATE_DEVICE(DEVICE_SELF, mpcba79_device, screen_update1) - MCFG_DEVICE_ADD("ramdac1", BT459, 83'020'800) - MCFG_DEVICE_ADD("bpu1", DP8510, 0) + MCFG_DEVICE_ADD(get_gt(1).ramdac, BT459, 83'020'800) + MCFG_DEVICE_ADD(get_gt(1).bpu, DP8510, 0) MACHINE_CONFIG_END /* @@ -252,28 +253,28 @@ MACHINE_CONFIG_END * giving hsync=71.744kHz and vsync~=75.97Hz. */ MACHINE_CONFIG_START(msmt070_device::device_add_mconfig) - MCFG_SCREEN_ADD("screen0", RASTER) + MCFG_SCREEN_ADD(get_gt(0).screen, RASTER) MCFG_SCREEN_RAW_PARAMS(105'561'000, 1472, 264 + GT_X_DELTA, 1184 + 264 + GT_X_DELTA, 944, 57, 884 + 57) MCFG_SCREEN_UPDATE_DEVICE(DEVICE_SELF, msmt070_device, screen_update0) MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(DEVICE_SELF, device_cbus_card_interface, vblank)) - MCFG_DEVICE_ADD("ramdac0", BT459, 0) - MCFG_DEVICE_ADD("bpu0", DP8510, 0) + MCFG_DEVICE_ADD(get_gt(0).ramdac, BT459, 0) + MCFG_DEVICE_ADD(get_gt(0).bpu, DP8510, 0) MACHINE_CONFIG_END // Same as MSMT070, but dual screen. MACHINE_CONFIG_START(msmt071_device::device_add_mconfig) - MCFG_SCREEN_ADD("screen0", RASTER) + MCFG_SCREEN_ADD(get_gt(0).screen, RASTER) MCFG_SCREEN_RAW_PARAMS(105'561'000, 1472, 264 + GT_X_DELTA, 1184 + 264 + GT_X_DELTA, 944, 57, 884 + 57) MCFG_SCREEN_UPDATE_DEVICE(DEVICE_SELF, msmt071_device, screen_update0) MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(DEVICE_SELF, device_cbus_card_interface, vblank)) - MCFG_DEVICE_ADD("ramdac0", BT459, 0) - MCFG_DEVICE_ADD("bpu0", DP8510, 0) + MCFG_DEVICE_ADD(get_gt(0).ramdac, BT459, 0) + MCFG_DEVICE_ADD(get_gt(0).bpu, DP8510, 0) - MCFG_SCREEN_ADD("screen1", RASTER) + MCFG_SCREEN_ADD(get_gt(1).screen, RASTER) MCFG_SCREEN_RAW_PARAMS(105'561'000, 1472, 264 + GT_X_DELTA, 1184 + 264 + GT_X_DELTA, 944, 57, 884 + 57) MCFG_SCREEN_UPDATE_DEVICE(DEVICE_SELF, msmt071_device, screen_update1) - MCFG_DEVICE_ADD("ramdac1", BT459, 0) - MCFG_DEVICE_ADD("bpu1", DP8510, 0) + MCFG_DEVICE_ADD(get_gt(1).ramdac, BT459, 0) + MCFG_DEVICE_ADD(get_gt(1).bpu, DP8510, 0) MACHINE_CONFIG_END /* @@ -288,12 +289,12 @@ MACHINE_CONFIG_END * giving pixel clock 209.2608MHz and vsync 76.13Hz. */ MACHINE_CONFIG_START(msmt081_device::device_add_mconfig) - MCFG_SCREEN_ADD("screen0", RASTER) + MCFG_SCREEN_ADD(get_gt(0).screen, RASTER) MCFG_SCREEN_RAW_PARAMS(209'260'800, 2076, 391 + GT_X_DELTA, 1664 + 391 + GT_X_DELTA, 1324, 74, 1248 + 74) MCFG_SCREEN_UPDATE_DEVICE(DEVICE_SELF, msmt081_device, screen_update0) MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(DEVICE_SELF, device_cbus_card_interface, vblank)) - MCFG_DEVICE_ADD("ramdac0", BT459, 0) - MCFG_DEVICE_ADD("bpu0", DP8510, 0) + MCFG_DEVICE_ADD(get_gt(0).ramdac, BT459, 0) + MCFG_DEVICE_ADD(get_gt(0).bpu, DP8510, 0) MACHINE_CONFIG_END /* @@ -306,12 +307,12 @@ MACHINE_CONFIG_END * giving pixel clock 209.2608MHz and vsync 76.13Hz. */ MACHINE_CONFIG_START(mpcbb92_device::device_add_mconfig) - MCFG_SCREEN_ADD("screen0", RASTER) + MCFG_SCREEN_ADD(get_gt(0).screen, RASTER) MCFG_SCREEN_RAW_PARAMS(209'260'800, 2076, 391 + GT_X_DELTA, 1664 + 391 + GT_X_DELTA, 1324, 74, 1248 + 74) MCFG_SCREEN_UPDATE_DEVICE(DEVICE_SELF, mpcbb92_device, screen_update0) //MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(DEVICE_SELF, srx_card_device_base, irq0)) - MCFG_DEVICE_ADD("ramdac0", BT459, 0) - MCFG_DEVICE_ADD("bpu0", DP8510, 0) + MCFG_DEVICE_ADD(get_gt(0).ramdac, BT459, 0) + MCFG_DEVICE_ADD(get_gt(0).bpu, DP8510, 0) MACHINE_CONFIG_END gt_device_base::gt_device_base(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) @@ -333,37 +334,37 @@ dual_gt_device_base::dual_gt_device_base(const machine_config &mconfig, device_t mpcb963_device::mpcb963_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : single_gt_device_base(mconfig, MPCB963, tag, owner, clock) - , cbus_card_device_base(mconfig, *this) + , device_cbus_card_interface(mconfig, *this) { } mpcba79_device::mpcba79_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : dual_gt_device_base(mconfig, MPCBA79, tag, owner, clock) - , cbus_card_device_base(mconfig, *this) + , device_cbus_card_interface(mconfig, *this) { } msmt070_device::msmt070_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : single_gt_device_base(mconfig, MSMT070, tag, owner, clock) - , cbus_card_device_base(mconfig, *this) + , device_cbus_card_interface(mconfig, *this) { } msmt071_device::msmt071_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : dual_gt_device_base(mconfig, MSMT071, tag, owner, clock) - , cbus_card_device_base(mconfig, *this) + , device_cbus_card_interface(mconfig, *this) { } msmt081_device::msmt081_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : single_gt_device_base(mconfig, MSMT081, tag, owner, clock) - , cbus_card_device_base(mconfig, *this) + , device_cbus_card_interface(mconfig, *this) { } mpcbb92_device::mpcbb92_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : single_gt_device_base(mconfig, MPCBB92, tag, owner, clock) - , srx_card_device_base(mconfig, *this) + , device_srx_card_interface(mconfig, *this) { } diff --git a/src/devices/bus/interpro/sr/gt.h b/src/devices/bus/interpro/sr/gt.h index ecb5da0a3a2..f2e277dafad 100644 --- a/src/devices/bus/interpro/sr/gt.h +++ b/src/devices/bus/interpro/sr/gt.h @@ -296,81 +296,69 @@ private: gt_t m_gt[GT_SCREEN_COUNT]; }; -class mpcb963_device : public single_gt_device_base, public cbus_card_device_base +class mpcb963_device : public single_gt_device_base, public device_cbus_card_interface { public: mpcb963_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); protected: - virtual void device_start() override { gt_device_base::device_start(); set_bus_device(); } - - virtual void map(address_map &map) override { cbus_card_device_base::map(map); single_gt_device_base::map(map); } + virtual void map(address_map &map) override { single_gt_device_base::map(map); } virtual const tiny_rom_entry *device_rom_region() const override; virtual void device_add_mconfig(machine_config &config) override; }; -class mpcba79_device : public dual_gt_device_base, public cbus_card_device_base +class mpcba79_device : public dual_gt_device_base, public device_cbus_card_interface { public: mpcba79_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); protected: - virtual void device_start() override { gt_device_base::device_start(); set_bus_device(); } - - virtual void map(address_map &map) override { cbus_card_device_base::map(map); dual_gt_device_base::map(map); } + virtual void map(address_map &map) override { dual_gt_device_base::map(map); } virtual const tiny_rom_entry *device_rom_region() const override; virtual void device_add_mconfig(machine_config &config) override; }; -class msmt070_device : public single_gt_device_base, public cbus_card_device_base +class msmt070_device : public single_gt_device_base, public device_cbus_card_interface { public: msmt070_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); protected: - virtual void device_start() override { gt_device_base::device_start(); set_bus_device(); } - - virtual void map(address_map &map) override { cbus_card_device_base::map(map); single_gt_device_base::map(map); } + virtual void map(address_map &map) override { single_gt_device_base::map(map); } virtual const tiny_rom_entry *device_rom_region() const override; virtual void device_add_mconfig(machine_config &config) override; }; -class msmt071_device : public dual_gt_device_base, public cbus_card_device_base +class msmt071_device : public dual_gt_device_base, public device_cbus_card_interface { public: msmt071_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); protected: - virtual void device_start() override { gt_device_base::device_start(); set_bus_device(); } - - virtual void map(address_map &map) override { cbus_card_device_base::map(map); dual_gt_device_base::map(map); } + virtual void map(address_map &map) override { dual_gt_device_base::map(map); } virtual const tiny_rom_entry *device_rom_region() const override; virtual void device_add_mconfig(machine_config &config) override; }; -class msmt081_device : public single_gt_device_base, public cbus_card_device_base +class msmt081_device : public single_gt_device_base, public device_cbus_card_interface { public: msmt081_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); protected: - virtual void device_start() override { gt_device_base::device_start(); set_bus_device(); } - - virtual void map(address_map &map) override { cbus_card_device_base::map(map); single_gt_device_base::map(map); } + virtual void map(address_map &map) override { single_gt_device_base::map(map); } virtual const tiny_rom_entry *device_rom_region() const override; virtual void device_add_mconfig(machine_config &config) override; }; -class mpcbb92_device : public single_gt_device_base, public srx_card_device_base +class mpcbb92_device : public single_gt_device_base, public device_srx_card_interface { public: mpcbb92_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); protected: - virtual void device_start() override { gt_device_base::device_start(); set_bus_device(); } - - virtual void map(address_map &map) override { srx_card_device_base::map(map); single_gt_device_base::map(map); } + virtual void map(address_map &map) override { single_gt_device_base::map(map); } virtual const tiny_rom_entry *device_rom_region() const override; virtual void device_add_mconfig(machine_config &config) override; }; diff --git a/src/devices/bus/interpro/sr/sr.cpp b/src/devices/bus/interpro/sr/sr.cpp index e8efa39cbef..5a516abd1d4 100644 --- a/src/devices/bus/interpro/sr/sr.cpp +++ b/src/devices/bus/interpro/sr/sr.cpp @@ -259,204 +259,98 @@ #define VERBOSE 0 #include "logmacro.h" -DEFINE_DEVICE_TYPE(CBUS, cbus_device, "cbus", "InterPro CBUS") +DEFINE_DEVICE_TYPE(CBUS_BUS, cbus_bus_device, "cbus_bus", "InterPro CBUS bus") DEFINE_DEVICE_TYPE(CBUS_SLOT, cbus_slot_device, "cbus_slot", "InterPro CBUS slot") -DEFINE_DEVICE_TYPE(SRX, srx_device, "srx", "InterPro SRX") +DEFINE_DEVICE_TYPE(SRX_BUS, srx_bus_device, "srx_bus", "InterPro SRX bus") DEFINE_DEVICE_TYPE(SRX_SLOT, srx_slot_device, "srx_slot", "InterPro SRX slot") -cbus_slot_device::cbus_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) - : device_t(mconfig, CBUS_SLOT, tag, owner, clock) - , device_slot_interface(mconfig, *this) - , m_bus_tag(nullptr) - , m_slot_tag(nullptr) -{ -} - -void cbus_slot_device::set_tags(const char *bus_tag, const char *slot_tag) -{ - m_bus_tag = bus_tag; - m_slot_tag = slot_tag; -} - -void cbus_slot_device::device_start() -{ - device_cbus_card_interface *dev = dynamic_cast<device_cbus_card_interface *>(get_card_device()); - - if (dev) - dev->set_tags(m_bus_tag, m_slot_tag); -} - -cbus_device::cbus_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) - : device_t(mconfig, CBUS, tag, owner, clock) - , m_out_irq0_cb(*this) - , m_out_irq1_cb(*this) - , m_out_irq2_cb(*this) - , m_out_vblank_cb(*this) - , m_memory_tag(nullptr) -{ -} - -void cbus_device::set_memory(const char *const tag, const int main_spacenum, const int io_spacenum) -{ - m_memory_tag = tag; - m_main_spacenum = main_spacenum; - m_io_spacenum = io_spacenum; -} - -void cbus_device::device_start() +void interpro_bus_device::device_resolve_objects() { - assert_always(m_memory_tag != nullptr, "memory tag and address spaces must be configured"); - - // get the memory spaces - device_memory_interface *memory; - siblingdevice(m_memory_tag)->interface(memory); - m_main_space = &memory->space(m_main_spacenum); - m_io_space = &memory->space(m_io_spacenum); + m_main_space = &m_maincpu->space(0); + m_io_space = &m_maincpu->space(1); // resolve callbacks m_out_irq0_cb.resolve_safe(); m_out_irq1_cb.resolve_safe(); m_out_irq2_cb.resolve_safe(); m_out_vblank_cb.resolve_safe(); - - // FIXME: silence the slot address map - m_main_space->nop_read(CBUS_BASE, CBUS_BASE + (CBUS_STRIDE * (CBUS_COUNT - 1)) + (CBUS_SIZE - 1)); - m_io_space->nop_read(CBUS_BASE, CBUS_BASE + (CBUS_STRIDE * (CBUS_COUNT - 1)) + (CBUS_SIZE - 1)); - - // empty the slots - m_slot_count = 0; - for (device_cbus_card_interface *&slot : m_slot) - slot = nullptr; } -void cbus_device::device_reset() +cbus_bus_device::cbus_bus_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : interpro_bus_device(mconfig, CBUS_BUS, tag, owner, clock) + , m_slot_count(0) { + std::fill(std::begin(m_slot), std::end(m_slot), nullptr); } -device_cbus_card_interface::device_cbus_card_interface(const machine_config &mconfig, device_t &device) - : device_slot_card_interface(mconfig, device) - , m_bus(nullptr) - , m_bus_tag(nullptr) - , m_slot_tag(nullptr) +void cbus_bus_device::device_start() { } -void device_cbus_card_interface::set_bus_device() -{ - // get a reference to the bus - m_bus = dynamic_cast<cbus_device *>(device().machine().device(m_bus_tag)); - - // install the card in the next available slot - m_bus->install_card(*this, &device_cbus_card_interface::map); -} - -cbus_card_device_base::cbus_card_device_base(const machine_config &mconfig, device_t &device, const char *idprom_region) - : device_cbus_card_interface(mconfig, device) - , m_idprom_region(idprom_region) +cbus_slot_device::cbus_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : device_t(mconfig, CBUS_SLOT, tag, owner, clock) + , device_slot_interface(mconfig, *this) + , m_bus(*this, finder_base::DUMMY_TAG) { } -void cbus_card_device_base::map(address_map &map) +void cbus_slot_device::device_resolve_objects() { - // TODO: use lambda until device submaps support unit masks - map(0x00, 0x7f).lr32(m_idprom_region, - [this](address_space &space, offs_t offset, u32 mem_mask) { return device().memregion(m_idprom_region)->as_u32(offset); }); -} + device_cbus_card_interface *const card(dynamic_cast<device_cbus_card_interface *>(get_card_device())); -srx_slot_device::srx_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) - : device_t(mconfig, SRX_SLOT, tag, owner, clock) - , device_slot_interface(mconfig, *this) - , m_bus_tag(nullptr) - , m_slot_tag(nullptr) -{ + if (card) + card->set_bus_device(*m_bus); } -void srx_slot_device::set_tags(const char *bus_tag, const char *slot_tag) +void cbus_slot_device::device_start() { - m_bus_tag = bus_tag; - m_slot_tag = slot_tag; } -void srx_slot_device::device_start() +void device_cbus_card_interface::set_bus_device(cbus_bus_device &bus_device) { - device_srx_card_interface *dev = dynamic_cast<device_srx_card_interface *>(get_card_device()); + // keep a reference to the bus + m_bus = &bus_device; - if (dev) - dev->set_tags(m_bus_tag, m_slot_tag); + // install the card in the next available slot + m_bus->install_card(*this, device().memregion(m_idprom_region), &device_cbus_card_interface::map); } -srx_device::srx_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) - : device_t(mconfig, SRX, tag, owner, clock) - , m_out_irq0_cb(*this) - , m_out_irq1_cb(*this) - , m_out_irq2_cb(*this) - , m_out_vblank_cb(*this) - , m_memory_tag(nullptr) +srx_bus_device::srx_bus_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : interpro_bus_device(mconfig, SRX_BUS, tag, owner, clock) + , m_slot_count(1) // first slot is used by the system board { + std::fill(std::begin(m_slot), std::end(m_slot), nullptr); } -void srx_device::set_memory(const char *const tag, const int main_spacenum, const int io_spacenum) +void srx_bus_device::device_start() { - m_memory_tag = tag; - m_main_spacenum = main_spacenum; - m_io_spacenum = io_spacenum; } -void srx_device::device_start() +srx_slot_device::srx_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : device_t(mconfig, SRX_SLOT, tag, owner, clock) + , device_slot_interface(mconfig, *this) + , m_bus(*this, finder_base::DUMMY_TAG) { - assert_always(m_memory_tag != nullptr, "memory tag and address spaces must be configured"); - - // get the memory spaces - device_memory_interface *memory; - siblingdevice(m_memory_tag)->interface(memory); - m_main_space = &memory->space(m_main_spacenum); - m_io_space = &memory->space(m_io_spacenum); - - // resolve callbacks - m_out_irq0_cb.resolve_safe(); - m_out_irq1_cb.resolve_safe(); - m_out_irq2_cb.resolve_safe(); - m_out_vblank_cb.resolve_safe(); - - // empty the slots - for (device_srx_card_interface *&slot : m_slot) - slot = nullptr; - - // first slot is used by the system board - m_slot_count = 1; } -void srx_device::device_reset() +void srx_slot_device::device_resolve_objects() { -} + device_srx_card_interface *const card(dynamic_cast<device_srx_card_interface *>(get_card_device())); -device_srx_card_interface::device_srx_card_interface(const machine_config &mconfig, device_t &device) - : device_slot_card_interface(mconfig, device) - , m_bus(nullptr) - , m_bus_tag(nullptr) - , m_slot_tag(nullptr) -{ + if (card) + card->set_bus_device(*m_bus); } -void device_srx_card_interface::set_bus_device() +void srx_slot_device::device_start() { - // get a reference to the bus - m_bus = dynamic_cast<srx_device *>(device().machine().device(m_bus_tag)); - - // install the card in the next available slot - m_bus->install_card(*this, &device_srx_card_interface::map); } -srx_card_device_base::srx_card_device_base(const machine_config &mconfig, device_t &device, const char *idprom_region) - : device_srx_card_interface(mconfig, device) - , m_idprom_region(idprom_region) +void device_srx_card_interface::set_bus_device(srx_bus_device &bus_device) { -} + // keep a reference to the bus + m_bus = &bus_device; -void srx_card_device_base::map(address_map &map) -{ - // TODO: use lambda until device submaps support unit masks - map(0x7f80, 0x7fff).lr32(m_idprom_region, - [this](address_space &space, offs_t offset, u32 mem_mask) { return device().memregion(m_idprom_region)->as_u32(offset); }); + // install the card in the next available slot + m_bus->install_card(*this, device().memregion(m_idprom_region), &device_srx_card_interface::map); } diff --git a/src/devices/bus/interpro/sr/sr.h b/src/devices/bus/interpro/sr/sr.h index 9d23fad04e5..d36f79f0f76 100644 --- a/src/devices/bus/interpro/sr/sr.h +++ b/src/devices/bus/interpro/sr/sr.h @@ -6,96 +6,70 @@ #pragma once -#define MCFG_CBUS_OUT_IRQ0_CB(_devcb) \ - downcast<cbus_device &>(*device).set_out_irq0_callback(DEVCB_##_devcb); - -#define MCFG_CBUS_OUT_IRQ1_CB(_devcb) \ - downcast<cbus_device &>(*device).set_out_irq1_callback(DEVCB_##_devcb); - -#define MCFG_CBUS_OUT_IRQ2_CB(_devcb) \ - downcast<cbus_device &>(*device).set_out_irq2_callback(DEVCB_##_devcb); - -#define MCFG_CBUS_OUT_VBLANK_CB(_devcb) \ - downcast<cbus_device &>(*device).set_out_vblank_callback(DEVCB_##_devcb); - -#define MCFG_CBUS_SLOT_ADD(_bus_tag, _slot_tag, _slot_intf, _def_slot, _fixed) \ - MCFG_DEVICE_ADD(_slot_tag, CBUS_SLOT, 0) \ - MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, _fixed) \ - downcast<cbus_slot_device &>(*device).set_tags(_bus_tag, _slot_tag); - -#define MCFG_CBUS_MEMORY(_tag, _main_spacenum, _io_spacenum) \ - downcast<cbus_device &>(*device).set_memory(_tag, _main_spacenum, _io_spacenum); - - -#define MCFG_SRX_OUT_IRQ0_CB(_devcb) \ - downcast<srx_device &>(*device).set_out_irq0_callback(DEVCB_##_devcb); - -#define MCFG_SRX_OUT_IRQ1_CB(_devcb) \ - downcast<srx_device &>(*device).set_out_irq1_callback(DEVCB_##_devcb); - -#define MCFG_SRX_OUT_IRQ2_CB(_devcb) \ - downcast<srx_device &>(*device).set_out_irq2_callback(DEVCB_##_devcb); - -#define MCFG_SRX_OUT_VBLANK_CB(_devcb) \ - downcast<srx_device &>(*device).set_out_vblank_callback(DEVCB_##_devcb); - -#define MCFG_SRX_SLOT_ADD(_bus_tag, _slot_tag, _slot_intf, _def_slot, _fixed) \ - MCFG_DEVICE_ADD(_slot_tag, SRX_SLOT, 0) \ - MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, _fixed) \ - downcast<srx_slot_device &>(*device).set_tags(_bus_tag, _slot_tag); - -#define MCFG_SRX_MEMORY(_tag, _main_spacenum, _io_spacenum) \ - downcast<srx_device &>(*device).set_memory(_tag, _main_spacenum, _io_spacenum); - - -class cbus_slot_device : public device_t, public device_slot_interface +class interpro_bus_device : public device_t { public: - // construction/destruction - cbus_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + // callback configuration + auto out_irq0_cb() { return m_out_irq0_cb.bind(); } + auto out_irq1_cb() { return m_out_irq1_cb.bind(); } + auto out_irq2_cb() { return m_out_irq2_cb.bind(); } + auto out_vblank_cb() { return m_out_vblank_cb.bind(); } - // inline configuration - void set_tags(const char *bus_tag, const char *slot_tag); + DECLARE_WRITE_LINE_MEMBER(irq0_w) { m_out_irq0_cb(state); } + DECLARE_WRITE_LINE_MEMBER(irq1_w) { m_out_irq1_cb(state); } + DECLARE_WRITE_LINE_MEMBER(irq2_w) { m_out_irq2_cb(state); } + DECLARE_WRITE_LINE_MEMBER(vblank_w) { m_out_vblank_cb(state); } protected: - cbus_slot_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock); + // construction/destruction + interpro_bus_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock) + : device_t(mconfig, type, tag, owner, clock) + , m_maincpu(*this, finder_base::DUMMY_TAG) + , m_main_space(nullptr) + , m_io_space(nullptr) + , m_out_irq0_cb(*this) + , m_out_irq1_cb(*this) + , m_out_irq2_cb(*this) + , m_out_vblank_cb(*this) + { + } // device-level overrides - virtual void device_start() override; + virtual void device_resolve_objects() override; + + // internal state + required_device<cpu_device> m_maincpu; + address_space *m_main_space; + address_space *m_io_space; - // configuration - const char *m_bus_tag; - const char *m_slot_tag; +private: + devcb_write_line m_out_irq0_cb; + devcb_write_line m_out_irq1_cb; + devcb_write_line m_out_irq2_cb; + devcb_write_line m_out_vblank_cb; }; class device_cbus_card_interface; -class cbus_device : public device_t +class cbus_bus_device : public interpro_bus_device { public: // construction/destruction - cbus_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); - - // inline configuration - template <class Object> devcb_base &set_out_irq0_callback(Object &&cb) { return m_out_irq0_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_out_irq1_callback(Object &&cb) { return m_out_irq1_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_out_irq2_callback(Object &&cb) { return m_out_irq2_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_out_vblank_callback(Object &&cb) { return m_out_vblank_cb.set_callback(std::forward<Object>(cb)); } - - void set_memory(const char *const tag, const int main_spacenum, const int io_spacenum); + template <typename T> + cbus_bus_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock, T &&cpu_device) + : cbus_bus_device(mconfig, tag, owner, clock) + { + m_maincpu.set_tag(std::forward<T>(cpu_device)); + } + cbus_bus_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); static const u32 CBUS_BASE = 0x87000000; static const u32 CBUS_SIZE = 0x01000000; static const u32 CBUS_STRIDE = 0x08000000; static const int CBUS_COUNT = 16; - DECLARE_WRITE_LINE_MEMBER(irq0_w) { m_out_irq0_cb(state); } - DECLARE_WRITE_LINE_MEMBER(irq1_w) { m_out_irq1_cb(state); } - DECLARE_WRITE_LINE_MEMBER(irq2_w) { m_out_irq2_cb(state); } - DECLARE_WRITE_LINE_MEMBER(vblank_w) { m_out_vblank_cb(state); } - // installation function for card devices - template <typename T> void install_card(T &device, void (T::*map)(address_map &map)) + template <typename T> void install_card(T &device, memory_region *idprom, void (T::*map)(address_map &map)) { // record the device in the next free slot m_slot[m_slot_count] = &device; @@ -104,6 +78,11 @@ public: offs_t start = CBUS_BASE + m_slot_count * CBUS_STRIDE; offs_t end = start + (CBUS_SIZE - 1); + // install the idprom region + read32_delegate idprom_r([idprom](address_space &space, offs_t offset, u32 mem_mask) { return idprom->as_u32(offset); }, idprom->name()); + m_main_space->install_read_handler(start, start | 0x7f, idprom_r); + m_io_space->install_read_handler(start, start | 0x7f, idprom_r); + // install the device address map m_main_space->install_device(start, end, device, map); m_io_space->install_device(start, end, device, map); @@ -112,115 +91,87 @@ public: } protected: - cbus_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock); - // device-level overrides virtual void device_start() override; - virtual void device_reset() override; - - // internal state - address_space *m_main_space; - address_space *m_io_space; - - devcb_write_line m_out_irq0_cb; - devcb_write_line m_out_irq1_cb; - devcb_write_line m_out_irq2_cb; - devcb_write_line m_out_vblank_cb; private: device_cbus_card_interface *m_slot[CBUS_COUNT]; int m_slot_count; - - const char *m_memory_tag; - int m_main_spacenum; - int m_io_spacenum; }; -class device_cbus_card_interface : public device_slot_card_interface +class cbus_slot_device : public device_t, public device_slot_interface { public: - void set_bus_device(); - - // inline configuration - void set_tags(const char *bus_tag, const char *slot_tag) { m_bus_tag = bus_tag; m_slot_tag = slot_tag; } - - DECLARE_WRITE_LINE_MEMBER(irq0) { m_bus->irq0_w(state); } - DECLARE_WRITE_LINE_MEMBER(irq1) { m_bus->irq1_w(state); } - DECLARE_WRITE_LINE_MEMBER(irq2) { m_bus->irq2_w(state); } - DECLARE_WRITE_LINE_MEMBER(vblank) { m_bus->vblank_w(state); } + // construction/destruction + template <typename T, typename U> + cbus_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock, T &&bus_tag, U &&slot_options, const char *default_option, const bool fixed) + : cbus_slot_device(mconfig, tag, owner, clock) + { + m_bus.set_tag(std::forward<T>(bus_tag)); + option_reset(); + slot_options(*this); + set_default_option(default_option); + set_fixed(fixed); + } + cbus_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); protected: - device_cbus_card_interface(const machine_config &mconfig, device_t &device); - - virtual void map(address_map &map) = 0; + // device-level overrides + virtual void device_resolve_objects() override; + virtual void device_start() override; - cbus_device *m_bus; - const char *m_bus_tag; - const char *m_slot_tag; +private: + required_device<cbus_bus_device> m_bus; }; -class cbus_card_device_base : public device_cbus_card_interface +class device_cbus_card_interface : public device_slot_card_interface { protected: - cbus_card_device_base(const machine_config &mconfig, device_t &device, const char *idprom_region = "idprom"); + friend class cbus_slot_device; public: - const char *tag() { return device().tag(); } + DECLARE_WRITE_LINE_MEMBER(irq0) { m_bus->irq0_w(state); } + DECLARE_WRITE_LINE_MEMBER(irq1) { m_bus->irq1_w(state); } + DECLARE_WRITE_LINE_MEMBER(irq2) { m_bus->irq2_w(state); } + DECLARE_WRITE_LINE_MEMBER(vblank) { m_bus->vblank_w(state); } protected: - virtual void map(address_map &map) override; - -private: - const char *const m_idprom_region; -}; - -class srx_slot_device : public device_t, public device_slot_interface -{ -public: - // construction/destruction - srx_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); - - // inline configuration - void set_tags(const char *bus_tag, const char *slot_tag); + device_cbus_card_interface(const machine_config &mconfig, device_t &device, const char *idprom_region = "idprom") + : device_slot_card_interface(mconfig, device) + , m_bus(nullptr) + , m_idprom_region(idprom_region) + { + } -protected: - srx_slot_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock); + virtual void map(address_map &map) = 0; - // device-level overrides - virtual void device_start() override; +private: + void set_bus_device(cbus_bus_device &bus_device); - // configuration - const char *m_bus_tag; - const char *m_slot_tag; + cbus_bus_device *m_bus; + const char *const m_idprom_region; }; class device_srx_card_interface; -class srx_device : public device_t +class srx_bus_device : public interpro_bus_device { public: // construction/destruction - srx_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); - - // inline configuration - template <class Object> devcb_base &set_out_irq0_callback(Object &&cb) { return m_out_irq0_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_out_irq1_callback(Object &&cb) { return m_out_irq1_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_out_irq2_callback(Object &&cb) { return m_out_irq2_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_out_vblank_callback(Object &&cb) { return m_out_vblank_cb.set_callback(std::forward<Object>(cb)); } - - void set_memory(const char *const tag, const int main_spacenum, const int io_spacenum); + template <typename T> + srx_bus_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock, T &&cpu_device) + : srx_bus_device(mconfig, tag, owner, clock) + { + m_maincpu.set_tag(std::forward<T>(cpu_device)); + } + srx_bus_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); static const u32 SRX_BASE = 0x8f000000; static const u32 SRX_SIZE = 0x8000; static const int SRX_COUNT = 32; - DECLARE_WRITE_LINE_MEMBER(irq0_w) { m_out_irq0_cb(state); } - DECLARE_WRITE_LINE_MEMBER(irq1_w) { m_out_irq1_cb(state); } - DECLARE_WRITE_LINE_MEMBER(irq2_w) { m_out_irq2_cb(state); } - DECLARE_WRITE_LINE_MEMBER(vblank_w) { m_out_vblank_cb(state); } - // installation function for card devices - template <typename T> void install_card(T &device, void (T::*map)(address_map &map)) + template <typename T> void install_card(T &device, memory_region *idprom, void (T::*map)(address_map &map)) { // record the device in the next free slot m_slot[m_slot_count] = &device; @@ -229,6 +180,11 @@ public: offs_t start = SRX_BASE + m_slot_count * SRX_SIZE; offs_t end = start + (SRX_SIZE - 1); + // install the idprom region + read32_delegate idprom_r([idprom](address_space &space, offs_t offset, u32 mem_mask) { return idprom->as_u32(offset); }, idprom->name()); + m_main_space->install_read_handler(start | 0x7f80, start | 0x7fff, idprom_r); + m_io_space->install_read_handler(start | 0x7f80, start | 0x7fff, idprom_r); + // install the device address map m_main_space->install_device(start, end, device, map); m_io_space->install_device(start, end, device, map); @@ -252,75 +208,72 @@ public: m_io_space->install_device(start, end, device, map); } - address_space *main_space() { return m_main_space; } - address_space *io_space() { return m_io_space; } - protected: - srx_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock); - // device-level overrides virtual void device_start() override; - virtual void device_reset() override; - - // internal state - address_space *m_main_space; - address_space *m_io_space; - - devcb_write_line m_out_irq0_cb; - devcb_write_line m_out_irq1_cb; - devcb_write_line m_out_irq2_cb; - devcb_write_line m_out_vblank_cb; private: device_srx_card_interface *m_slot[SRX_COUNT]; int m_slot_count; - - const char *m_memory_tag; - int m_main_spacenum; - int m_io_spacenum; }; -class device_srx_card_interface : public device_slot_card_interface +class srx_slot_device : public device_t, public device_slot_interface { public: - void set_bus_device(); - - // inline configuration - void set_tags(const char *bus_tag, const char *slot_tag) { m_bus_tag = bus_tag; m_slot_tag = slot_tag; } - - DECLARE_WRITE_LINE_MEMBER(irq0) { m_bus->irq0_w(state); } - DECLARE_WRITE_LINE_MEMBER(irq1) { m_bus->irq1_w(state); } - DECLARE_WRITE_LINE_MEMBER(irq2) { m_bus->irq2_w(state); } - DECLARE_WRITE_LINE_MEMBER(vblank) { m_bus->vblank_w(state); } + // construction/destruction + template <typename T, typename U> + srx_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock, T &&bus_tag, U &&slot_options, const char *default_option, const bool fixed) + : srx_slot_device(mconfig, tag, owner, clock) + { + m_bus.set_tag(std::forward<T>(bus_tag)); + option_reset(); + slot_options(*this); + set_default_option(default_option); + set_fixed(fixed); + } + srx_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); protected: - device_srx_card_interface(const machine_config &mconfig, device_t &device); - - virtual void map(address_map &map) = 0; + // device-level overrides + virtual void device_resolve_objects() override; + virtual void device_start() override; - srx_device *m_bus; - const char *m_bus_tag; - const char *m_slot_tag; +private: + required_device<srx_bus_device> m_bus; }; -class srx_card_device_base : public device_srx_card_interface +class device_srx_card_interface : public device_slot_card_interface { protected: - srx_card_device_base(const machine_config &mconfig, device_t &device, const char *idprom_region = "idprom"); + friend class srx_slot_device; public: - const char *tag() { return device().tag(); } + DECLARE_WRITE_LINE_MEMBER(irq0) { m_bus->irq0_w(state); } + DECLARE_WRITE_LINE_MEMBER(irq1) { m_bus->irq1_w(state); } + DECLARE_WRITE_LINE_MEMBER(irq2) { m_bus->irq2_w(state); } + DECLARE_WRITE_LINE_MEMBER(vblank) { m_bus->vblank_w(state); } protected: - virtual void map(address_map &map) override; + device_srx_card_interface(const machine_config &mconfig, device_t &device, const char *idprom_region = "idprom") + : device_slot_card_interface(mconfig, device) + , m_bus(nullptr) + , m_idprom_region(idprom_region) + { + } -private: + virtual void map(address_map &map) = 0; + +// FIXME: when we sort out the EDGE cards this stuff will be private +//private: + void set_bus_device(srx_bus_device &bus_device); + + srx_bus_device *m_bus; const char *const m_idprom_region; }; -DECLARE_DEVICE_TYPE(CBUS, cbus_device) +DECLARE_DEVICE_TYPE(CBUS_BUS, cbus_bus_device) DECLARE_DEVICE_TYPE(CBUS_SLOT, cbus_slot_device) -DECLARE_DEVICE_TYPE(SRX, srx_device) +DECLARE_DEVICE_TYPE(SRX_BUS, srx_bus_device) DECLARE_DEVICE_TYPE(SRX_SLOT, srx_slot_device) #endif // MAME_BUS_INTERPRO_SR_SR_H diff --git a/src/devices/bus/isa/ega.cpp b/src/devices/bus/isa/ega.cpp index bc8251ddb66..01c73066088 100644 --- a/src/devices/bus/isa/ega.cpp +++ b/src/devices/bus/isa/ega.cpp @@ -576,7 +576,7 @@ isa8_ega_device::isa8_ega_device(const machine_config &mconfig, const char *tag, isa8_ega_device::isa8_ega_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, type, tag, owner, clock), device_isa8_card_interface(mconfig, *this), - m_crtc_ega(nullptr), m_vram(nullptr), m_videoram(nullptr), m_charA(nullptr), m_charB(nullptr), + m_crtc_ega(nullptr), m_videoram(nullptr), m_charA(nullptr), m_charB(nullptr), m_misc_output(0), m_feature_control(0), m_frame_cnt(0), m_hsync(0), m_vsync(0), m_vblank(0), m_display_enable(0), m_video_mode(0), m_palette(*this, "palette") { @@ -618,17 +618,13 @@ void isa8_ega_device::device_start() memcpy(memregion(subtag("user2").c_str())->base(), memregion(subtag("user1").c_str())->base(), 0x4000); /* Install 256KB Video ram on our EGA card */ - m_vram = machine().memory().region_alloc(subtag("vram").c_str(), 256 * 1024, 1, ENDIANNESS_LITTLE); + m_vram = make_unique_clear<uint8_t[]>(256 * 1024); - m_videoram = m_vram->base(); + m_videoram = m_vram.get(); m_plane[0] = m_videoram + 0x00000; - memset(m_plane[0], 0, sizeof(uint8_t) * 0x10000); m_plane[1] = m_videoram + 0x10000; - memset(m_plane[1], 0, sizeof(uint8_t) * 0x10000); m_plane[2] = m_videoram + 0x20000; - memset(m_plane[2], 0, sizeof(uint8_t) * 0x10000); m_plane[3] = m_videoram + 0x30000; - memset(m_plane[3], 0, sizeof(uint8_t) * 0x10000); m_crtc_ega = subdevice<crtc_ega_device>(EGA_CRTC_NAME); diff --git a/src/devices/bus/isa/ega.h b/src/devices/bus/isa/ega.h index ef7db51c407..4e7bc4394a3 100644 --- a/src/devices/bus/isa/ega.h +++ b/src/devices/bus/isa/ega.h @@ -66,7 +66,7 @@ public: DECLARE_READ8_MEMBER(pc_ega8_3X0_r); /* Video memory and related variables */ - memory_region *m_vram; + std::unique_ptr<uint8_t[]> m_vram; uint8_t *m_plane[4]; uint8_t m_read_latch[4]; uint8_t *m_videoram; diff --git a/src/devices/bus/isa/pc1640_iga.cpp b/src/devices/bus/isa/pc1640_iga.cpp index 83accf6794c..04ef54c2d42 100644 --- a/src/devices/bus/isa/pc1640_iga.cpp +++ b/src/devices/bus/isa/pc1640_iga.cpp @@ -95,17 +95,13 @@ void isa8_pc1640_iga_device::device_start() } /* Install 256KB Video ram on our EGA card */ - m_vram = machine().memory().region_alloc(subtag("vram").c_str(), 256 * 1024, 1, ENDIANNESS_LITTLE); + m_vram = make_unique_clear<uint8_t[]>(256 * 1024); - m_videoram = m_vram->base(); + m_videoram = m_vram.get(); m_plane[0] = m_videoram + 0x00000; - memset(m_plane[0], 0, sizeof(uint8_t) * 0x10000); m_plane[1] = m_videoram + 0x10000; - memset(m_plane[1], 0, sizeof(uint8_t) * 0x10000); m_plane[2] = m_videoram + 0x20000; - memset(m_plane[2], 0, sizeof(uint8_t) * 0x10000); m_plane[3] = m_videoram + 0x30000; - memset(m_plane[3], 0, sizeof(uint8_t) * 0x10000); m_crtc_ega = subdevice<crtc_ega_device>(EGA_CRTC_NAME); diff --git a/src/devices/bus/lpci/pci.h b/src/devices/bus/lpci/pci.h index aa9721435f8..41258ad226f 100644 --- a/src/devices/bus/lpci/pci.h +++ b/src/devices/bus/lpci/pci.h @@ -44,7 +44,7 @@ class pci_connector_device : public device_t, public device_slot_interface { public: - pci_connector_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + pci_connector_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); virtual ~pci_connector_device(); pci_device_interface *get_device(); diff --git a/src/devices/bus/macpds/macpds.h b/src/devices/bus/macpds/macpds.h index 7e92ec71087..d37a393a78a 100644 --- a/src/devices/bus/macpds/macpds.h +++ b/src/devices/bus/macpds/macpds.h @@ -19,15 +19,6 @@ // INTERFACE CONFIGURATION MACROS //************************************************************************** -#define MCFG_MACPDS_BUS_ADD(_tag, _cputag) \ - MCFG_DEVICE_ADD(_tag, MACPDS, 0) \ - downcast<macpds_device &>(*device).set_cputag(_cputag); - -#define MCFG_MACPDS_SLOT_ADD(_nbtag, _tag, _slot_intf, _def_slot) \ - MCFG_DEVICE_ADD(_tag, MACPDS_SLOT, 0) \ - MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) \ - downcast<macpds_slot_device &>(*device).set_macpds_slot(_nbtag, _tag); - #define MCFG_MACPDS_SLOT_REMOVE(_tag) \ MCFG_DEVICE_REMOVE(_tag) @@ -50,6 +41,16 @@ class macpds_slot_device : public device_t, { public: // construction/destruction + template <typename T> + macpds_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, const char *nbtag, T &&opts, const char *dflt) + : macpds_slot_device(mconfig, tag, owner, (uint32_t)0) + { + option_reset(); + opts(*this); + set_default_option(dflt); + set_macpds_slot(nbtag, tag); + } + macpds_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); // inline configuration @@ -76,7 +77,14 @@ class macpds_device : public device_t { public: // construction/destruction + macpds_device(const machine_config &mconfig, const char *tag, device_t *owner, const char *cputag) + : macpds_device(mconfig, tag, owner, (uint32_t)0) + { + set_cputag(cputag); + } + macpds_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + ~macpds_device() { m_device_list.detach_all(); } // inline configuration void set_cputag(const char *tag) { m_cputag = tag; } diff --git a/src/devices/bus/nubus/nubus.h b/src/devices/bus/nubus/nubus.h index 37c5700df6e..919f989ebfb 100644 --- a/src/devices/bus/nubus/nubus.h +++ b/src/devices/bus/nubus/nubus.h @@ -62,6 +62,16 @@ class nubus_slot_device : public device_t, public device_slot_interface { public: // construction/destruction + template <typename T> + nubus_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, const char *nbtag, T &&opts, const char *dflt) + : nubus_slot_device(mconfig, tag, owner, (uint32_t)0) + { + option_reset(); + opts(*this); + set_default_option(dflt); + set_nubus_slot(nbtag, tag); + } + nubus_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); // inline configuration @@ -97,6 +107,12 @@ public: template <class Object> devcb_base &set_out_irqc_callback(Object &&cb) { return m_out_irqc_cb.set_callback(std::forward<Object>(cb)); } template <class Object> devcb_base &set_out_irqd_callback(Object &&cb) { return m_out_irqd_cb.set_callback(std::forward<Object>(cb)); } template <class Object> devcb_base &set_out_irqe_callback(Object &&cb) { return m_out_irqe_cb.set_callback(std::forward<Object>(cb)); } + auto out_irq9_callback() { return m_out_irq9_cb.bind(); } + auto out_irqa_callback() { return m_out_irqa_cb.bind(); } + auto out_irqb_callback() { return m_out_irqb_cb.bind(); } + auto out_irqc_callback() { return m_out_irqc_cb.bind(); } + auto out_irqd_callback() { return m_out_irqd_cb.bind(); } + auto out_irqe_callback() { return m_out_irqe_cb.bind(); } void add_nubus_card(device_nubus_card_interface *card); void install_device(offs_t start, offs_t end, read8_delegate rhandler, write8_delegate whandler, uint32_t mask=0xffffffff); diff --git a/src/devices/bus/oricext/oricext.cpp b/src/devices/bus/oricext/oricext.cpp index f5623e4548a..8f1204d0f57 100644 --- a/src/devices/bus/oricext/oricext.cpp +++ b/src/devices/bus/oricext/oricext.cpp @@ -7,11 +7,11 @@ DEFINE_DEVICE_TYPE(ORICEXT_CONNECTOR, oricext_connector, "oricext_connector", "ORIC extension connector") -oricext_connector::oricext_connector(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig, ORICEXT_CONNECTOR, tag, owner, clock), - device_slot_interface(mconfig, *this), - irq_handler(*this), - cputag(nullptr) +oricext_connector::oricext_connector(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, ORICEXT_CONNECTOR, tag, owner, clock) + , device_slot_interface(mconfig, *this) + , irq_handler(*this) + , cputag(nullptr) { } diff --git a/src/devices/bus/oricext/oricext.h b/src/devices/bus/oricext/oricext.h index 0daf45dc612..233724c1501 100644 --- a/src/devices/bus/oricext/oricext.h +++ b/src/devices/bus/oricext/oricext.h @@ -13,23 +13,28 @@ #include "cpu/m6502/m6502.h" -#define MCFG_ORICEXT_ADD(_tag, _slot_intf, _def_slot, _cputag, _irq) \ - MCFG_DEVICE_ADD(_tag, ORICEXT_CONNECTOR, 0) \ - MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) \ - downcast<oricext_connector *>(device)->set_cputag(_cputag); \ - downcast<oricext_connector &>(*device).set_irq_handler(DEVCB_##_irq); - - class oricext_device; class oricext_connector: public device_t, public device_slot_interface { public: + template <typename T> + oricext_connector(const machine_config &mconfig, const char *tag, device_t *owner, T &&opts, const char *dflt, const char *cputag) + : oricext_connector(mconfig, tag, owner, (uint32_t)0) + { + option_reset(); + opts(*this); + set_default_option(dflt); + set_fixed(false); + set_cputag(cputag); + } + oricext_connector(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); virtual ~oricext_connector(); void set_cputag(const char *tag); template <class Object> devcb_base &set_irq_handler(Object &&cb) { return irq_handler.set_callback(std::forward<Object>(cb)); } + auto irq_callback() { return irq_handler.bind(); } void irq_w(int state); protected: diff --git a/src/devices/bus/pet/cass.h b/src/devices/bus/pet/cass.h index 29d64278a3b..d5a43fee19c 100644 --- a/src/devices/bus/pet/cass.h +++ b/src/devices/bus/pet/cass.h @@ -54,12 +54,22 @@ class device_pet_datassette_port_interface; class pet_datassette_port_device : public device_t, public device_slot_interface { public: - // construction/destruction + template <typename T> + pet_datassette_port_device(const machine_config &mconfig, const char *tag, device_t *owner, T &&opts, const char *dflt) + : pet_datassette_port_device(mconfig, tag, owner, 0) + { + option_reset(); + opts(*this); + set_default_option(dflt); + set_fixed(false); + } + pet_datassette_port_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); virtual ~pet_datassette_port_device(); // static configuration helpers template <class Object> devcb_base &set_read_handler(Object &&cb) { return m_read_handler.set_callback(std::forward<Object>(cb)); } + auto read_handler() { return m_read_handler.bind(); } // computer interface DECLARE_READ_LINE_MEMBER( read ); diff --git a/src/devices/bus/pet/exp.h b/src/devices/bus/pet/exp.h index 0bf7db60f05..d44dcea6d19 100644 --- a/src/devices/bus/pet/exp.h +++ b/src/devices/bus/pet/exp.h @@ -50,7 +50,16 @@ class pet_expansion_slot_device : public device_t, public device_slot_interface { public: - // construction/destruction + template <typename T> + pet_expansion_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, T &&opts, const char *dflt) + : pet_expansion_slot_device(mconfig, tag, owner, clock) + { + option_reset(); + opts(*this); + set_default_option(dflt); + set_fixed(false); + } + pet_expansion_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); virtual ~pet_expansion_slot_device(); @@ -59,6 +68,9 @@ public: m_write_dma.set_callback(std::forward<Write>(wr)); } + auto dma_read_callback() { return m_read_dma.bind(); } + auto dma_write_callback() { return m_write_dma.bind(); } + // computer interface int norom_r(address_space &space, offs_t offset, int sel); uint8_t read(address_space &space, offs_t offset, uint8_t data, int &sel); diff --git a/src/devices/bus/plus4/c1551.cpp b/src/devices/bus/plus4/c1551.cpp index 0190a0b922e..63cda307f2b 100644 --- a/src/devices/bus/plus4/c1551.cpp +++ b/src/devices/bus/plus4/c1551.cpp @@ -322,16 +322,6 @@ void c1551_device::c1551_mem(address_map &map) //------------------------------------------------- -// SLOT_INTERFACE( c1551_floppies ) -//------------------------------------------------- - -static void c1551_floppies(device_slot_interface &device) -{ - device.option_add("525ssqd", FLOPPY_525_SSQD); -} - - -//------------------------------------------------- // FLOPPY_FORMATS( floppy_formats ) //------------------------------------------------- @@ -345,33 +335,47 @@ FLOPPY_FORMATS_END // device_add_mconfig - add device configuration //------------------------------------------------- -MACHINE_CONFIG_START(c1551_device::device_add_mconfig) - MCFG_DEVICE_ADD(M6510T_TAG, M6510T, XTAL(16'000'000)/8) - MCFG_DEVICE_PROGRAM_MAP(c1551_mem) - MCFG_M6510T_PORT_CALLBACKS(READ8(*this, c1551_device, port_r), WRITE8(*this, c1551_device, port_w)) - MCFG_QUANTUM_PERFECT_CPU(M6510T_TAG) - - MCFG_PLS100_ADD(PLA_TAG) - MCFG_DEVICE_ADD(M6523_0_TAG, TPI6525, 0) - MCFG_TPI6525_IN_PA_CB(READ8(*this, c1551_device, tcbm_data_r)) - MCFG_TPI6525_OUT_PA_CB(WRITE8(*this, c1551_device, tcbm_data_w)) - MCFG_TPI6525_IN_PB_CB(READ8(C64H156_TAG, c64h156_device, yb_r)) - MCFG_TPI6525_OUT_PB_CB(WRITE8(C64H156_TAG, c64h156_device, yb_w)) - MCFG_TPI6525_IN_PC_CB(READ8(*this, c1551_device, tpi0_pc_r)) - MCFG_TPI6525_OUT_PC_CB(WRITE8(*this, c1551_device, tpi0_pc_w)) - MCFG_DEVICE_ADD(M6523_1_TAG, TPI6525, 0) - MCFG_TPI6525_IN_PA_CB(READ8(*this, c1551_device, tcbm_data_r)) - MCFG_TPI6525_OUT_PA_CB(WRITE8(*this, c1551_device, tcbm_data_w)) - MCFG_TPI6525_IN_PB_CB(READ8(*this, c1551_device, tpi1_pb_r)) - MCFG_TPI6525_IN_PC_CB(READ8(*this, c1551_device, tpi1_pc_r)) - MCFG_TPI6525_OUT_PC_CB(WRITE8(*this, c1551_device, tpi1_pc_w)) - - MCFG_DEVICE_ADD(C64H156_TAG, C64H156, XTAL(16'000'000)) - MCFG_64H156_BYTE_CALLBACK(WRITELINE(C64H156_TAG, c64h156_device, atni_w)) - MCFG_FLOPPY_DRIVE_ADD_FIXED(C64H156_TAG":0", c1551_floppies, "525ssqd", c1551_device::floppy_formats) - - MCFG_PLUS4_PASSTHRU_EXPANSION_SLOT_ADD() -MACHINE_CONFIG_END +void c1551_device::device_add_mconfig(machine_config &config) +{ + M6510T(config, m_maincpu, XTAL(16'000'000)/8); + m_maincpu->set_addrmap(AS_PROGRAM, &c1551_device::c1551_mem); + m_maincpu->read_callback().set(FUNC(c1551_device::port_r)); + m_maincpu->write_callback().set(FUNC(c1551_device::port_w)); + config.m_perfect_cpu_quantum = subtag(M6510T_TAG); + + PLS100(config, m_pla); + + TPI6525(config, m_tpi0, 0); + m_tpi0->in_pa_cb().set(FUNC(c1551_device::tcbm_data_r)); + m_tpi0->out_pa_cb().set(FUNC(c1551_device::tcbm_data_w)); + m_tpi0->in_pb_cb().set(C64H156_TAG, FUNC(c64h156_device::yb_r)); + m_tpi0->out_pb_cb().set(C64H156_TAG, FUNC(c64h156_device::yb_w)); + m_tpi0->in_pc_cb().set(FUNC(c1551_device::tpi0_pc_r)); + m_tpi0->out_pc_cb().set(FUNC(c1551_device::tpi0_pc_w)); + + TPI6525(config, m_tpi1, 0); + m_tpi1->in_pa_cb().set(FUNC(c1551_device::tcbm_data_r)); + m_tpi1->out_pa_cb().set(FUNC(c1551_device::tcbm_data_w)); + m_tpi1->in_pb_cb().set(FUNC(c1551_device::tpi1_pb_r)); + m_tpi1->in_pc_cb().set(FUNC(c1551_device::tpi1_pc_r)); + m_tpi1->out_pc_cb().set(FUNC(c1551_device::tpi1_pc_w)); + + C64H156(config, m_ga, XTAL(16'000'000)); + m_ga->byte_callback().set(C64H156_TAG, FUNC(c64h156_device::atni_w)); + + floppy_connector &connector(FLOPPY_CONNECTOR(config, C64H156_TAG":0", 0)); + connector.option_add("525ssqd", FLOPPY_525_SSQD); + connector.set_default_option("525ssqd"); + connector.set_fixed(true); + connector.set_formats(c1551_device::floppy_formats); + + PLUS4_EXPANSION_SLOT(config, m_exp, 0); + m_exp->irq_wr_callback().set(DEVICE_SELF_OWNER, FUNC(plus4_expansion_slot_device::irq_w)); + m_exp->cd_rd_callback().set(DEVICE_SELF_OWNER, FUNC(plus4_expansion_slot_device::dma_cd_r)); + m_exp->cd_wr_callback().set(DEVICE_SELF_OWNER, FUNC(plus4_expansion_slot_device::dma_cd_w)); + m_exp->aec_wr_callback().set(DEVICE_SELF_OWNER, FUNC(plus4_expansion_slot_device::aec_w)); + plus4_expansion_cards(*m_exp); +} //------------------------------------------------- diff --git a/src/devices/bus/plus4/c1551.h b/src/devices/bus/plus4/c1551.h index 4d057ccb2bb..2cfc00786fb 100644 --- a/src/devices/bus/plus4/c1551.h +++ b/src/devices/bus/plus4/c1551.h @@ -78,7 +78,7 @@ private: required_device<tpi6525_device> m_tpi0; required_device<tpi6525_device> m_tpi1; required_device<c64h156_device> m_ga; - required_device<pla_device> m_pla; + required_device<pls100_device> m_pla; required_device<floppy_image_device> m_floppy; required_device<plus4_expansion_slot_device> m_exp; required_ioport m_jp1; diff --git a/src/devices/bus/plus4/exp.h b/src/devices/bus/plus4/exp.h index 35dc291fa52..0fc56396ca9 100644 --- a/src/devices/bus/plus4/exp.h +++ b/src/devices/bus/plus4/exp.h @@ -101,6 +101,11 @@ public: template <class Object> devcb_base &set_cd_wr_callback(Object &&cb) { return m_write_dma_cd.set_callback(std::forward<Object>(cb)); } template <class Object> devcb_base &set_aec_wr_callback(Object &&cb) { return m_write_aec.set_callback(std::forward<Object>(cb)); } + auto irq_wr_callback() { return m_write_irq.bind(); } + auto cd_rd_callback() { return m_read_dma_cd.bind(); } + auto cd_wr_callback() { return m_write_dma_cd.bind(); } + auto aec_wr_callback() { return m_write_aec.bind(); } + // computer interface uint8_t cd_r(address_space &space, offs_t offset, uint8_t data, int ba, int cs0, int c1l, int c2l, int cs1, int c1h, int c2h); void cd_w(address_space &space, offs_t offset, uint8_t data, int ba, int cs0, int c1l, int c2l, int cs1, int c1h, int c2h); diff --git a/src/devices/bus/scsi/scsi.cpp b/src/devices/bus/scsi/scsi.cpp index 1642ad51408..5997266b84d 100644 --- a/src/devices/bus/scsi/scsi.cpp +++ b/src/devices/bus/scsi/scsi.cpp @@ -23,6 +23,7 @@ scsi_port_device::scsi_port_device(const machine_config &mconfig, const char *ta m_data5_handler(*this), m_data6_handler(*this), m_data7_handler(*this), + m_slot(*this, "%u", 1U), m_device_count(0), m_bsy_in(0), m_sel_in(0), @@ -61,36 +62,19 @@ scsi_port_device::scsi_port_device(const machine_config &mconfig, const char *ta { } -MACHINE_CONFIG_START(scsi_port_device::device_add_mconfig) - MCFG_DEVICE_ADD( SCSI_PORT_DEVICE1, SCSI_PORT_SLOT, 0 ) - MCFG_DEVICE_ADD( SCSI_PORT_DEVICE2, SCSI_PORT_SLOT, 0 ) - MCFG_DEVICE_ADD( SCSI_PORT_DEVICE3, SCSI_PORT_SLOT, 0 ) - MCFG_DEVICE_ADD( SCSI_PORT_DEVICE4, SCSI_PORT_SLOT, 0 ) - MCFG_DEVICE_ADD( SCSI_PORT_DEVICE5, SCSI_PORT_SLOT, 0 ) - MCFG_DEVICE_ADD( SCSI_PORT_DEVICE6, SCSI_PORT_SLOT, 0 ) - MCFG_DEVICE_ADD( SCSI_PORT_DEVICE7, SCSI_PORT_SLOT, 0 ) -MACHINE_CONFIG_END +void scsi_port_device::device_add_mconfig(machine_config &config) +{ + for (int i = 0; i < 7; i++) + SCSI_PORT_SLOT(config, m_slot[i]); +} void scsi_port_device::device_start() { - const char *deviceName[] = - { - SCSI_PORT_DEVICE1, - SCSI_PORT_DEVICE2, - SCSI_PORT_DEVICE3, - SCSI_PORT_DEVICE4, - SCSI_PORT_DEVICE5, - SCSI_PORT_DEVICE6, - SCSI_PORT_DEVICE7 - }; - m_device_count = 0; for (int i = 0; i < 7; i++) { - scsi_port_slot_device *slot = subdevice<scsi_port_slot_device>(deviceName[i]); - m_slot[i] = slot; - + scsi_port_slot_device *slot = subdevice<scsi_port_slot_device>(m_slot[i].finder_tag()); if (slot != nullptr) m_device_count = i + 1; } @@ -660,6 +644,31 @@ WRITE_LINE_MEMBER( scsi_port_device::write_data7 ) } } +scsi_port_slot_device &scsi_port_device::slot(int index) +{ + assert(index >= 1 && index <= 7); + return *subdevice<scsi_port_slot_device>(m_slot[index-1].finder_tag()); +} + +void scsi_port_device::set_slot_device(int index, const char *option, const device_type &type, const input_device_default *id) +{ + slot(index).option_add(option, type); + slot(index).set_option_device_input_defaults(option, id); + slot(index).set_default_option(option); +} + +void scsi_port_device::set_output_latch(output_latch_device &latch) +{ + latch.bit_handler<0>().set(*this, FUNC(scsi_port_device::write_data0)); + latch.bit_handler<1>().set(*this, FUNC(scsi_port_device::write_data1)); + latch.bit_handler<2>().set(*this, FUNC(scsi_port_device::write_data2)); + latch.bit_handler<3>().set(*this, FUNC(scsi_port_device::write_data3)); + latch.bit_handler<4>().set(*this, FUNC(scsi_port_device::write_data4)); + latch.bit_handler<5>().set(*this, FUNC(scsi_port_device::write_data5)); + latch.bit_handler<6>().set(*this, FUNC(scsi_port_device::write_data6)); + latch.bit_handler<7>().set(*this, FUNC(scsi_port_device::write_data7)); +} + DEFINE_DEVICE_TYPE(SCSI_PORT, scsi_port_device, "scsi", "SCSI Port") scsi_port_slot_device::scsi_port_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : diff --git a/src/devices/bus/scsi/scsi.h b/src/devices/bus/scsi/scsi.h index 154b346d6a4..e5995f970ab 100644 --- a/src/devices/bus/scsi/scsi.h +++ b/src/devices/bus/scsi/scsi.h @@ -98,7 +98,7 @@ class scsi_port_device : public device_t public: // construction/destruction - scsi_port_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + scsi_port_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); template <class Object> devcb_base &set_bsy_handler(Object &&cb) { return m_bsy_handler.set_callback(std::forward<Object>(cb)); } template <class Object> devcb_base &set_sel_handler(Object &&cb) { return m_sel_handler.set_callback(std::forward<Object>(cb)); } @@ -148,6 +148,8 @@ public: data7_handler().set(tag, FUNC(input_buffer_device::write_bit7)); } + void set_output_latch(output_latch_device &latch); + DECLARE_WRITE_LINE_MEMBER( write_bsy ); DECLARE_WRITE_LINE_MEMBER( write_sel ); DECLARE_WRITE_LINE_MEMBER( write_cd ); @@ -166,6 +168,9 @@ public: DECLARE_WRITE_LINE_MEMBER( write_data6 ); DECLARE_WRITE_LINE_MEMBER( write_data7 ); + scsi_port_slot_device &slot(int index); + void set_slot_device(int index, const char *option, const device_type &type, const input_device_default *id); + protected: // device-level overrides virtual void device_start() override; @@ -208,7 +213,7 @@ private: devcb_write_line m_data6_handler; devcb_write_line m_data7_handler; - scsi_port_slot_device *m_slot[7]; + optional_device_array<scsi_port_slot_device, 7> m_slot; int m_device_count; int m_bsy_in; @@ -258,7 +263,7 @@ class scsi_port_slot_device : public device_t, friend class scsi_port_interface; public: - scsi_port_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + scsi_port_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); scsi_port_interface *dev() { return m_dev; } scsi_port_device *port() { return m_port; } diff --git a/src/devices/bus/ss50/mpc.cpp b/src/devices/bus/ss50/mpc.cpp index 25a6ed43951..ff606f5e087 100644 --- a/src/devices/bus/ss50/mpc.cpp +++ b/src/devices/bus/ss50/mpc.cpp @@ -121,8 +121,8 @@ MACHINE_CONFIG_START(ss50_mpc_device::device_add_mconfig) MCFG_INPUT_MERGER_ANY_HIGH("loopback") MCFG_INPUT_MERGER_OUTPUT_HANDLER(WRITELINE("outgate", input_merger_device, in_w<1>)) - MCFG_DEVICE_ADD("counter", RIPPLE_COUNTER, 0) // CD4024AE (IC3) - MCFG_RIPPLE_COUNTER_STAGES(7) // only Q5 (÷32) and Q4 (÷16) are actually used + RIPPLE_COUNTER(config, m_counter); // CD4024AE (IC3) + m_counter->set_stages(7); // only Q5 (÷32) and Q4 (÷16) are actually used MACHINE_CONFIG_END diff --git a/src/devices/bus/ti99/internal/992board.cpp b/src/devices/bus/ti99/internal/992board.cpp index 210256bcd82..330bcee4566 100644 --- a/src/devices/bus/ti99/internal/992board.cpp +++ b/src/devices/bus/ti99/internal/992board.cpp @@ -12,7 +12,6 @@ ***************************************************************************/ #include "emu.h" -#include "998board.h" #define LOG_WARN (1U<<1) // Warnings #define LOG_CRU (1U<<2) // CRU logging @@ -21,7 +20,7 @@ #define LOG_BANK (1U<<5) // Change ROM banks #define LOG_KEYBOARD (1U<<6) // Keyboard operation -#define VERBOSE ( LOG_GENERAL | LOG_WARN ) +#define VERBOSE ( LOG_WARN ) #include "logmacro.h" #include "992board.h" @@ -357,7 +356,8 @@ io992_device::io992_device(const machine_config &mconfig, device_type type, cons m_key_row(0), m_latch_out(0xd7), m_latch_in(0xd7), - m_communication_disable(true) + m_communication_disable(true), + m_response_phase(false) { } @@ -479,6 +479,9 @@ READ8_MEMBER(io992_device::cruread) if ((m_latch_in & m_hexbval[i])==0) value &= ~bit; bit <<= 1; } + // e80c (bit 6) seems to be a latch for the response phase + if (!m_response_phase) + value &= ~0x40; inp = m_cassette->input(); if (inp > 0) @@ -540,8 +543,12 @@ WRITE8_MEMBER(io992_device::cruwrite) else m_latch_out &= ~m_hexbval[offset & 0x07]; LOGMASKED(LOG_HEXBUS, "Hexbus latch out = %02x\n", m_latch_out); break; - case 0xe808: // HSK case 0xe80a: // BAV + // Undocumented, but makes sense according to the ROM + if (data==0) + m_response_phase = false; + // no break + case 0xe808: // HSK if (data != 0) m_latch_out |= m_hexbval[offset & 0x07]; else m_latch_out &= ~m_hexbval[offset & 0x07]; @@ -556,6 +563,7 @@ WRITE8_MEMBER(io992_device::cruwrite) LOGMASKED(LOG_HEXBUS, "Enabling Hexbus\n"); m_communication_disable = false; } + LOGMASKED(LOG_HEXBUS, "Writing to Hexbus: BAV*=%d, HSK*=%d, DATA=%01x\n", (m_latch_out&0x04)!=0, (m_latch_out&0x10)!=0, ((m_latch_out>>4)&0x0c)|(m_latch_out&0x03)); hexbus_write(m_latch_out); // Check how the bus has changed. This depends on the states of all // connected peripherals @@ -598,6 +606,21 @@ void io992_device::hexbus_value_changed(uint8_t data) { LOGMASKED(LOG_HEXBUS, "Hexbus changed and latched: %02x\n", data); m_latch_in = data; + + if ((data & bus::hexbus::HEXBUS_LINE_HSK)==0) + { + // If HSK* is lowered and we as the host have it up, this indicates + // the response phase. + if (!m_response_phase && (m_myvalue & bus::hexbus::HEXBUS_LINE_HSK)!=0) + { + LOGMASKED(LOG_HEXBUS, "Incoming response\n"); + m_response_phase = true; + } + // We cannot wait for the CPU explicitly latching HSK* + // as designed, because this implies a true parallel execution + LOGMASKED(LOG_HEXBUS, "Latching HSK*\n"); + m_myvalue &= ~bus::hexbus::HEXBUS_LINE_HSK; + } } else LOGMASKED(LOG_HEXBUS, "Ignoring Hexbus change (to %02x), latch=%s, BAV*=%d\n", data, m_communication_disable? "inhibit":"enabled", bav_asserted? 0:1); diff --git a/src/devices/bus/ti99/internal/992board.h b/src/devices/bus/ti99/internal/992board.h index 7e79c8d1358..786aed36381 100644 --- a/src/devices/bus/ti99/internal/992board.h +++ b/src/devices/bus/ti99/internal/992board.h @@ -137,6 +137,9 @@ private: // Hexbus inhibit. This prevents the incoming latches to store the data. bool m_communication_disable; + + // Bit 6. It is not documented, but likely to indicate the response phase. + bool m_response_phase; }; diff --git a/src/devices/bus/vcs_ctrl/ctrl.h b/src/devices/bus/vcs_ctrl/ctrl.h index 271001b3486..3f9b77b4c35 100644 --- a/src/devices/bus/vcs_ctrl/ctrl.h +++ b/src/devices/bus/vcs_ctrl/ctrl.h @@ -71,6 +71,7 @@ public: // static configuration helpers template <class Object> devcb_base &set_trigger_wr_callback(Object &&cb) { return m_write_trigger.set_callback(std::forward<Object>(cb)); } + auto trigger_wr_callback() { return m_write_trigger.bind(); } // computer interface diff --git a/src/devices/bus/vic20/exp.cpp b/src/devices/bus/vic20/exp.cpp index 5556dcba3e9..4bc6136553b 100644 --- a/src/devices/bus/vic20/exp.cpp +++ b/src/devices/bus/vic20/exp.cpp @@ -201,6 +201,14 @@ void vic20_expansion_slot_device::cd_w(address_space &space, offs_t offset, uint } } +void vic20_expansion_slot_device::add_passthrough(machine_config &config, const char *_tag) +{ + vic20_expansion_slot_device &slot(VIC20_EXPANSION_SLOT(config, _tag, DERIVED_CLOCK(1, 1), vic20_expansion_cards, nullptr)); + slot.irq_wr_callback().set(DEVICE_SELF_OWNER, FUNC(vic20_expansion_slot_device::irq_w)); + slot.nmi_wr_callback().set(DEVICE_SELF_OWNER, FUNC(vic20_expansion_slot_device::nmi_w)); + slot.res_wr_callback().set(DEVICE_SELF_OWNER, FUNC(vic20_expansion_slot_device::res_w)); +} + //------------------------------------------------- // SLOT_INTERFACE( vic20_expansion_cards ) diff --git a/src/devices/bus/vic20/exp.h b/src/devices/bus/vic20/exp.h index eadac324dfb..b6b0dbd1346 100644 --- a/src/devices/bus/vic20/exp.h +++ b/src/devices/bus/vic20/exp.h @@ -48,28 +48,6 @@ //************************************************************************** -// INTERFACE CONFIGURATION MACROS -//************************************************************************** - -#define MCFG_VIC20_PASSTHRU_EXPANSION_SLOT_ADD(_tag) \ - MCFG_DEVICE_ADD(_tag, VIC20_EXPANSION_SLOT, DERIVED_CLOCK(1, 1), vic20_expansion_cards, nullptr) \ - MCFG_VIC20_EXPANSION_SLOT_IRQ_CALLBACK(WRITELINE(DEVICE_SELF_OWNER, vic20_expansion_slot_device, irq_w)) \ - MCFG_VIC20_EXPANSION_SLOT_NMI_CALLBACK(WRITELINE(DEVICE_SELF_OWNER, vic20_expansion_slot_device, nmi_w)) \ - MCFG_VIC20_EXPANSION_SLOT_RES_CALLBACK(WRITELINE(DEVICE_SELF_OWNER, vic20_expansion_slot_device, res_w)) - - -#define MCFG_VIC20_EXPANSION_SLOT_IRQ_CALLBACK(_write) \ - downcast<vic20_expansion_slot_device &>(*device).set_irq_wr_callback(DEVCB_##_write); - -#define MCFG_VIC20_EXPANSION_SLOT_NMI_CALLBACK(_write) \ - downcast<vic20_expansion_slot_device &>(*device).set_nmi_wr_callback(DEVCB_##_write); - -#define MCFG_VIC20_EXPANSION_SLOT_RES_CALLBACK(_write) \ - downcast<vic20_expansion_slot_device &>(*device).set_res_wr_callback(DEVCB_##_write); - - - -//************************************************************************** // TYPE DEFINITIONS //************************************************************************** @@ -94,9 +72,11 @@ public: } vic20_expansion_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template <class Object> devcb_base &set_irq_wr_callback(Object &&cb) { return m_write_irq.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_nmi_wr_callback(Object &&cb) { return m_write_nmi.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_res_wr_callback(Object &&cb) { return m_write_res.set_callback(std::forward<Object>(cb)); } + static void add_passthrough(machine_config &config, const char *_tag); + + auto irq_wr_callback() { return m_write_irq.bind(); } + auto nmi_wr_callback() { return m_write_nmi.bind(); } + auto res_wr_callback() { return m_write_res.bind(); } // computer interface uint8_t cd_r(address_space &space, offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3); diff --git a/src/devices/bus/vic20/vic1010.cpp b/src/devices/bus/vic20/vic1010.cpp index daf191aef7b..3c00365a4bc 100644 --- a/src/devices/bus/vic20/vic1010.cpp +++ b/src/devices/bus/vic20/vic1010.cpp @@ -22,14 +22,15 @@ DEFINE_DEVICE_TYPE(VIC1010, vic1010_device, "vic1010", "VIC-1010 Expansion Modul // device_add_mconfig - add device configuration //------------------------------------------------- -MACHINE_CONFIG_START(vic1010_device::device_add_mconfig) - MCFG_VIC20_PASSTHRU_EXPANSION_SLOT_ADD("slot1") - MCFG_VIC20_PASSTHRU_EXPANSION_SLOT_ADD("slot2") - MCFG_VIC20_PASSTHRU_EXPANSION_SLOT_ADD("slot3") - MCFG_VIC20_PASSTHRU_EXPANSION_SLOT_ADD("slot4") - MCFG_VIC20_PASSTHRU_EXPANSION_SLOT_ADD("slot5") - MCFG_VIC20_PASSTHRU_EXPANSION_SLOT_ADD("slot6") -MACHINE_CONFIG_END +void vic1010_device::device_add_mconfig(machine_config &config) +{ + vic20_expansion_slot_device::add_passthrough(config, "slot1"); + vic20_expansion_slot_device::add_passthrough(config, "slot2"); + vic20_expansion_slot_device::add_passthrough(config, "slot3"); + vic20_expansion_slot_device::add_passthrough(config, "slot4"); + vic20_expansion_slot_device::add_passthrough(config, "slot5"); + vic20_expansion_slot_device::add_passthrough(config, "slot6"); +} //************************************************************************** diff --git a/src/devices/bus/vic20/vic1112.cpp b/src/devices/bus/vic20/vic1112.cpp index b709b6f281b..e8d55e1e89b 100644 --- a/src/devices/bus/vic20/vic1112.cpp +++ b/src/devices/bus/vic20/vic1112.cpp @@ -97,22 +97,24 @@ WRITE_LINE_MEMBER( vic1112_device::via1_irq_w ) // device_add_mconfig - add device configuration //------------------------------------------------- -MACHINE_CONFIG_START(vic1112_device::device_add_mconfig) - MCFG_DEVICE_ADD(M6522_0_TAG, VIA6522, DERIVED_CLOCK(1, 1)) - MCFG_VIA6522_READPB_HANDLER(READ8(*this, vic1112_device, via0_pb_r)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, vic1112_device, via0_pb_w)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, vic1112_device, via0_irq_w)) - - MCFG_DEVICE_ADD(M6522_1_TAG, VIA6522, DERIVED_CLOCK(1, 1)) - MCFG_VIA6522_READPB_HANDLER(READ8(IEEE488_TAG, ieee488_device, dio_r)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(IEEE488_TAG, ieee488_device, host_dio_w)) - MCFG_VIA6522_CA2_HANDLER(WRITELINE(IEEE488_TAG, ieee488_device, host_atn_w)) - MCFG_VIA6522_CB2_HANDLER(WRITELINE(IEEE488_TAG, ieee488_device, host_eoi_w)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, vic1112_device, via1_irq_w)) - - MCFG_CBM_IEEE488_ADD(nullptr) - MCFG_IEEE488_SRQ_CALLBACK(WRITELINE(M6522_1_TAG, via6522_device, write_cb1)) -MACHINE_CONFIG_END +void vic1112_device::device_add_mconfig(machine_config &config) +{ + VIA6522(config, m_via0, DERIVED_CLOCK(1, 1)); + m_via0->readpb_handler().set(FUNC(vic1112_device::via0_pb_r)); + m_via0->writepb_handler().set(FUNC(vic1112_device::via0_pb_w)); + m_via0->irq_handler().set(FUNC(vic1112_device::via0_irq_w)); + + VIA6522(config, m_via1, DERIVED_CLOCK(1, 1)); + m_via1->readpb_handler().set(IEEE488_TAG, FUNC(ieee488_device::dio_r)); + m_via1->writepa_handler().set(IEEE488_TAG, FUNC(ieee488_device::host_dio_w)); + m_via1->ca2_handler().set(IEEE488_TAG, FUNC(ieee488_device::host_atn_w)); + m_via1->cb2_handler().set(IEEE488_TAG, FUNC(ieee488_device::host_eoi_w)); + m_via1->irq_handler().set(FUNC(vic1112_device::via1_irq_w)); + + IEEE488(config, m_bus, 0); + ieee488_slot_device::add_cbm_defaults(config, nullptr); + m_bus->srq_callback().set(m_via1, FUNC(via6522_device::write_cb1)); +} @@ -166,7 +168,7 @@ uint8_t vic1112_device::vic20_cd_r(address_space &space, offs_t offset, uint8_t { if (!io2) { - data = (BIT(offset, 4) ? m_via1 : m_via0)->read(space, offset & 0x0f); + data = (BIT(offset, 4) ? m_via1 : m_via0)->read(offset & 0x0f); } else if (!blk5) { @@ -186,6 +188,6 @@ void vic1112_device::vic20_cd_w(address_space &space, offs_t offset, uint8_t dat { if (!io2) { - (BIT(offset, 4) ? m_via1 : m_via0)->write(space, offset & 0x0f, data); + (BIT(offset, 4) ? m_via1 : m_via0)->write(offset & 0x0f, data); } } diff --git a/src/devices/bus/vme/vme_fccpu20.cpp b/src/devices/bus/vme/vme_fccpu20.cpp index af999f0f664..1e38411a44f 100644 --- a/src/devices/bus/vme/vme_fccpu20.cpp +++ b/src/devices/bus/vme/vme_fccpu20.cpp @@ -243,6 +243,15 @@ void vme_fccpu20_device::cpu20_mem(address_map &map) } +static DEVICE_INPUT_DEFAULTS_START( terminal ) + DEVICE_INPUT_DEFAULTS( "RS232_RXBAUD", 0xff, RS232_BAUD_9600 ) + DEVICE_INPUT_DEFAULTS( "RS232_TXBAUD", 0xff, RS232_BAUD_9600 ) + DEVICE_INPUT_DEFAULTS( "RS232_STARTBITS", 0xff, RS232_STARTBITS_1 ) + DEVICE_INPUT_DEFAULTS( "RS232_DATABITS", 0xff, RS232_DATABITS_7 ) + DEVICE_INPUT_DEFAULTS( "RS232_PARITY", 0xff, RS232_PARITY_NONE ) + DEVICE_INPUT_DEFAULTS( "RS232_STOPBITS", 0xff, RS232_STOPBITS_2 ) +DEVICE_INPUT_DEFAULTS_END + MACHINE_CONFIG_START(vme_fccpu20_device::device_add_mconfig) /* basic machine hardware */ MCFG_DEVICE_ADD ("maincpu", M68020, CLOCK50 / 3) /* Crytstal verified from picture HCI */ @@ -294,6 +303,7 @@ MACHINE_CONFIG_START(vme_fccpu20_device::device_add_mconfig) MCFG_DEVICE_ADD (RS232P1_TAG, RS232_PORT, default_rs232_devices, "terminal") MCFG_RS232_RXD_HANDLER (WRITELINE ("mpcc", mpcc68561_device, write_rx)) MCFG_RS232_CTS_HANDLER (WRITELINE ("mpcc", mpcc68561_device, cts_w)) + MCFG_SLOT_OPTION_DEVICE_INPUT_DEFAULTS("terminal", terminal) // MPCC2 - RS232 MCFG_DEVICE_ADD (RS232P2_TAG, RS232_PORT, default_rs232_devices, nullptr) diff --git a/src/devices/bus/x68k/x68k_scsiext.cpp b/src/devices/bus/x68k/x68k_scsiext.cpp index 1ab4c275153..557d70d3f36 100644 --- a/src/devices/bus/x68k/x68k_scsiext.cpp +++ b/src/devices/bus/x68k/x68k_scsiext.cpp @@ -38,25 +38,26 @@ const tiny_rom_entry *x68k_scsiext_device::device_rom_region() const // device machine config MACHINE_CONFIG_START(x68k_scsiext_device::device_add_mconfig) - MCFG_DEVICE_ADD("scsi", SCSI_PORT, 0) - MCFG_SCSIDEV_ADD("scsi:" SCSI_PORT_DEVICE1, "harddisk", SCSIHD, SCSI_ID_0) - MCFG_SCSIDEV_ADD("scsi:" SCSI_PORT_DEVICE2, "harddisk", SCSIHD, SCSI_ID_1) - MCFG_SCSIDEV_ADD("scsi:" SCSI_PORT_DEVICE3, "harddisk", SCSIHD, SCSI_ID_2) - MCFG_SCSIDEV_ADD("scsi:" SCSI_PORT_DEVICE4, "harddisk", SCSIHD, SCSI_ID_3) - MCFG_SCSIDEV_ADD("scsi:" SCSI_PORT_DEVICE5, "harddisk", SCSIHD, SCSI_ID_4) - MCFG_SCSIDEV_ADD("scsi:" SCSI_PORT_DEVICE6, "harddisk", SCSIHD, SCSI_ID_5) - MCFG_SCSIDEV_ADD("scsi:" SCSI_PORT_DEVICE7, "harddisk", SCSIHD, SCSI_ID_6) - - MCFG_DEVICE_ADD("mb89352", MB89352A, 0) - MCFG_LEGACY_SCSI_PORT("scsi") - MCFG_MB89352A_IRQ_CB(WRITELINE(*this, x68k_scsiext_device, irq_w)) - MCFG_MB89352A_DRQ_CB(WRITELINE(*this, x68k_scsiext_device, drq_w)) + SCSI_PORT(config, m_scsibus); + m_scsibus->set_slot_device(1, "harddisk", SCSIHD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_0)); + m_scsibus->set_slot_device(2, "harddisk", SCSIHD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_1)); + m_scsibus->set_slot_device(3, "harddisk", SCSIHD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_2)); + m_scsibus->set_slot_device(4, "harddisk", SCSIHD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_3)); + m_scsibus->set_slot_device(5, "harddisk", SCSIHD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_4)); + m_scsibus->set_slot_device(6, "harddisk", SCSIHD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_5)); + m_scsibus->set_slot_device(7, "harddisk", SCSIHD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_6)); + + MB89352A(config, m_spc); + m_spc->set_scsi_port("scsi"); + m_spc->irq_cb().set(FUNC(x68k_scsiext_device::irq_w)); + m_spc->drq_cb().set(FUNC(x68k_scsiext_device::drq_w)); MACHINE_CONFIG_END x68k_scsiext_device::x68k_scsiext_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, X68K_SCSIEXT, tag, owner, clock) , device_x68k_expansion_card_interface(mconfig, *this) , m_slot(nullptr), + m_scsibus(*this, "scsi"), m_spc(*this, "mb89352") { } diff --git a/src/devices/bus/x68k/x68k_scsiext.h b/src/devices/bus/x68k/x68k_scsiext.h index 40f5b17b6ae..03950d778fd 100644 --- a/src/devices/bus/x68k/x68k_scsiext.h +++ b/src/devices/bus/x68k/x68k_scsiext.h @@ -37,6 +37,7 @@ private: x68k_expansion_slot_device *m_slot; + required_device<scsi_port_device> m_scsibus; required_device<mb89352_device> m_spc; }; diff --git a/src/devices/cpu/arm7/arm7.cpp b/src/devices/cpu/arm7/arm7.cpp index 86cb34eb344..154d6ad405e 100644 --- a/src/devices/cpu/arm7/arm7.cpp +++ b/src/devices/cpu/arm7/arm7.cpp @@ -47,6 +47,7 @@ void (*arm7_coproc_dt_w_callback)(arm_state *arm, uint32_t insn, uint32_t *prn, DEFINE_DEVICE_TYPE(ARM7, arm7_cpu_device, "arm7_le", "ARM7 (little)") DEFINE_DEVICE_TYPE(ARM7_BE, arm7_be_cpu_device, "arm7_be", "ARM7 (big)") +DEFINE_DEVICE_TYPE(ARM710A, arm710a_cpu_device, "arm710a", "ARM710a") DEFINE_DEVICE_TYPE(ARM7500, arm7500_cpu_device, "arm7500", "ARM7500") DEFINE_DEVICE_TYPE(ARM9, arm9_cpu_device, "arm9", "ARM9") DEFINE_DEVICE_TYPE(ARM920T, arm920t_cpu_device, "arm920t", "ARM920T") @@ -96,6 +97,15 @@ arm7_be_cpu_device::arm7_be_cpu_device(const machine_config &mconfig, const char } +arm710a_cpu_device::arm710a_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : arm7_cpu_device(mconfig, ARM710A, tag, owner, clock, 4, ARCHFLAG_MODE26, ENDIANNESS_LITTLE) +{ + m_copro_id = ARM9_COPRO_ID_MFR_ARM + | ARM9_COPRO_ID_ARCH_V4 + | ARM9_COPRO_ID_PART_ARM710; +} + + arm7500_cpu_device::arm7500_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : arm7_cpu_device(mconfig, ARM7500, tag, owner, clock, 4, ARCHFLAG_MODE26, ENDIANNESS_LITTLE) { diff --git a/src/devices/cpu/arm7/arm7.h b/src/devices/cpu/arm7/arm7.h index d7d66766664..d59eb7ed732 100644 --- a/src/devices/cpu/arm7/arm7.h +++ b/src/devices/cpu/arm7/arm7.h @@ -599,6 +599,12 @@ public: arm7500_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); }; +class arm710a_cpu_device : public arm7_cpu_device +{ +public: + // construction/destruction + arm710a_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); +}; class arm9_cpu_device : public arm7_cpu_device { @@ -691,6 +697,7 @@ public: DECLARE_DEVICE_TYPE(ARM7, arm7_cpu_device) DECLARE_DEVICE_TYPE(ARM7_BE, arm7_be_cpu_device) +DECLARE_DEVICE_TYPE(ARM710A, arm710a_cpu_device) DECLARE_DEVICE_TYPE(ARM7500, arm7500_cpu_device) DECLARE_DEVICE_TYPE(ARM9, arm9_cpu_device) DECLARE_DEVICE_TYPE(ARM920T, arm920t_cpu_device) diff --git a/src/devices/cpu/clipper/clipper.cpp b/src/devices/cpu/clipper/clipper.cpp index f758db66eaf..67eebf611cf 100644 --- a/src/devices/cpu/clipper/clipper.cpp +++ b/src/devices/cpu/clipper/clipper.cpp @@ -31,25 +31,22 @@ #define R1 (m_info.r1) #define R2 (m_info.r2) -// macros for setting psw condition codes +#define BIT31(x) BIT(x, 31) +#define BIT63(x) BIT(x, 63) + +// macros for computing and setting condition codes #define FLAGS(C,V,Z,N) \ - m_psw = (m_psw & ~(PSW_C | PSW_V | PSW_Z | PSW_N)) | (((C) << 3) | ((V) << 2) | ((Z) << 1) | ((N) << 0)); -#define FLAGS_CV(C,V) \ - m_psw = (m_psw & ~(PSW_C | PSW_V)) | (((C) << 3) | ((V) << 2)); -#define FLAGS_ZN(Z,N) \ - m_psw = (m_psw & ~(PSW_Z | PSW_N)) | (((Z) << 1) | ((N) << 0)); - -// over/underflow for addition/subtraction from here: http://stackoverflow.com/questions/199333/how-to-detect-integer-overflow-in-c-c -#define OF_ADD(a, b) ((b > 0) && (a > INT32_MAX - b)) -#define UF_ADD(a, b) ((b < 0) && (a < INT32_MIN - b)) -#define OF_SUB(a, b) ((b < 0) && (a > INT32_MAX + b)) -#define UF_SUB(a, b) ((b > 0) && (a < INT32_MIN + b)) - -// CLIPPER logic for carry and overflow flags -#define C_ADD(a, b) (u32(a) + u32(b) < u32(a)) -#define V_ADD(a, b) (OF_ADD(s32(a), s32(b)) || UF_ADD(s32(a), s32(b))) -#define C_SUB(a, b) (u32(a) < u32(b)) -#define V_SUB(a, b) (OF_SUB(s32(a), s32(b)) || UF_SUB(s32(a), s32(b))) + m_psw = (m_psw & ~(PSW_C | PSW_V | PSW_Z | PSW_N)) | (((C) << 3) | ((V) << 2) | ((Z) << 1) | ((N) << 0)) + +#define FLAGS_ADD(op2, op1, result) FLAGS( \ + (BIT31(op2) && BIT31(op1)) || (!BIT31(result) && (BIT31(op2) || BIT31(op1))), \ + (BIT31(op2) == BIT31(op1)) && (BIT31(result) != BIT31(op2)), \ + result == 0, BIT31(result)) + +#define FLAGS_SUB(op2, op1, result) FLAGS( \ + (!BIT31(op2) && BIT31(op1)) || (BIT31(result) && (!BIT31(op2) || BIT31(op1))), \ + (BIT31(op2) != BIT31(op1)) && (BIT31(result) != BIT31(op2)), \ + result == 0, BIT31(result)) DEFINE_DEVICE_TYPE(CLIPPER_C100, clipper_c100_device, "clipper_c100", "C100 CLIPPER") DEFINE_DEVICE_TYPE(CLIPPER_C300, clipper_c300_device, "clipper_c300", "C300 CLIPPER") @@ -114,12 +111,9 @@ inline u64 rotr64(u64 x, u8 shift) void clipper_device::device_start() { - // map spaces to system tags - std::vector<address_space *> spaces = { &space(0), &space(0), &space(0), &space(0), &space(1), &space(2), &space(0), &machine().dummy_space() }; - // configure the cammu address spaces - get_icammu().set_spaces(spaces); - get_dcammu().set_spaces(spaces); + get_dcammu().set_spaces(space(0), space(1), space(2)); + get_icammu().set_spaces(space(0), space(1), space(2)); // set our instruction counter set_icountptr(m_icount); @@ -580,7 +574,7 @@ void clipper_device::execute_instruction() break; case 0x25: // cmps: compare single floating - FLAGS(0, 0, float32_eq(get_fp32(R2), get_fp32(R1)), float32_lt(get_fp32(R2), get_fp32(R1))) + FLAGS(0, 0, float32_eq(get_fp32(R2), get_fp32(R1)), float32_lt(get_fp32(R2), get_fp32(R1))); // flag unordered if (float_exception_flags & float_flag_invalid) m_psw |= PSW_Z | PSW_N; @@ -592,7 +586,7 @@ void clipper_device::execute_instruction() break; case 0x27: // cmpd: compare double floating - FLAGS(0, 0, float64_eq(get_fp64(R2), get_fp64(R1)), float64_lt(get_fp64(R2), get_fp64(R1))) + FLAGS(0, 0, float64_eq(get_fp64(R2), get_fp64(R1)), float64_lt(get_fp64(R2), get_fp64(R1))); // flag unordered if (float_exception_flags & float_flag_invalid) m_psw |= PSW_Z | PSW_N; @@ -636,7 +630,7 @@ void clipper_device::execute_instruction() break; case 0x30: // shaw: shift arithmetic word - if (s32(m_r[R1]) > 0) + if (!BIT31(m_r[R1])) { // save the bits that will be shifted out plus new sign bit const s32 v = s32(m_r[R2]) >> (31 - m_r[R1]); @@ -644,18 +638,18 @@ void clipper_device::execute_instruction() m_r[R2] <<= m_r[R1]; // overflow is set if sign changes during shift - FLAGS(0, v != 0 && v != -1, m_r[R2] == 0, s32(m_r[R2]) < 0) + FLAGS(0, v != 0 && v != -1, m_r[R2] == 0, BIT31(m_r[R2])); } else { m_r[R2] = s32(m_r[R2]) >> -m_r[R1]; - FLAGS(0, 0, m_r[R2] == 0, s32(m_r[R2]) < 0) + FLAGS(0, 0, m_r[R2] == 0, BIT31(m_r[R2])); } // FLAGS: 0VZN break; case 0x31: // shal: shift arithmetic longword - if (s32(m_r[R1]) > 0) + if (!BIT31(m_r[R1])) { // save the bits that will be shifted out plus new sign bit const s64 v = s64(get_64(R2)) >> (63 - m_r[R1]); @@ -663,55 +657,55 @@ void clipper_device::execute_instruction() set_64(R2, get_64(R2) << m_r[R1]); // overflow is set if sign changes during shift - FLAGS(0, v != 0 && v != -1, get_64(R2) == 0, s64(get_64(R2)) < 0) + FLAGS(0, v != 0 && v != -1, get_64(R2) == 0, BIT63(get_64(R2))); } else { set_64(R2, s64(get_64(R2)) >> -m_r[R1]); - FLAGS(0, 0, get_64(R2) == 0, s64(get_64(R2)) < 0) + FLAGS(0, 0, get_64(R2) == 0, BIT63(get_64(R2))); } // FLAGS: 0VZN break; case 0x32: // shlw: shift logical word - if (s32(m_r[R1]) > 0) + if (!BIT31(m_r[R1])) m_r[R2] <<= m_r[R1]; else m_r[R2] >>= -m_r[R1]; // FLAGS: 00ZN - FLAGS(0, 0, m_r[R2] == 0, s32(m_r[R2]) < 0); + FLAGS(0, 0, m_r[R2] == 0, BIT31(m_r[R2])); break; case 0x33: // shll: shift logical longword - if (s32(m_r[R1]) > 0) + if (!BIT31(m_r[R1])) set_64(R2, get_64(R2) << m_r[R1]); else set_64(R2, get_64(R2) >> -m_r[R1]); // FLAGS: 00ZN - FLAGS(0, 0, get_64(R2) == 0, s64(get_64(R2)) < 0); + FLAGS(0, 0, get_64(R2) == 0, BIT63(get_64(R2))); break; case 0x34: // rotw: rotate word - if (s32(m_r[R1]) > 0) + if (!BIT31(m_r[R1])) m_r[R2] = rotl32(m_r[R2], m_r[R1]); else m_r[R2] = rotr32(m_r[R2], -m_r[R1]); // FLAGS: 00ZN - FLAGS(0, 0, m_r[R2] == 0, s32(m_r[R2]) < 0); + FLAGS(0, 0, m_r[R2] == 0, BIT31(m_r[R2])); break; case 0x35: // rotl: rotate longword - if (s32(m_r[R1]) > 0) + if (!BIT31(m_r[R1])) set_64(R2, rotl64(get_64(R2), m_r[R1])); else set_64(R2, rotr64(get_64(R2), -m_r[R1])); // FLAGS: 00ZN - FLAGS(0, 0, get_64(R2) == 0, s64(get_64(R2)) < 0); + FLAGS(0, 0, get_64(R2) == 0, BIT63(get_64(R2))); break; case 0x38: // shai: shift arithmetic immediate - if (s32(m_info.imm) > 0) + if (!BIT31(m_info.imm)) { // save the bits that will be shifted out plus new sign bit const s32 v = s32(m_r[R2]) >> (31 - m_info.imm); @@ -719,19 +713,19 @@ void clipper_device::execute_instruction() m_r[R2] <<= m_info.imm; // overflow is set if sign changes during shift - FLAGS(0, v != 0 && v != -1, m_r[R2] == 0, s32(m_r[R2]) < 0) + FLAGS(0, v != 0 && v != -1, m_r[R2] == 0, BIT31(m_r[R2])); } else { m_r[R2] = s32(m_r[R2]) >> -m_info.imm; - FLAGS(0, 0, m_r[R2] == 0, s32(m_r[R2]) < 0) + FLAGS(0, 0, m_r[R2] == 0, BIT31(m_r[R2])); } // FLAGS: 0VZN // TRAPS: I break; case 0x39: // shali: shift arithmetic longword immediate - if (s32(m_info.imm) > 0) + if (!BIT31(m_info.imm)) { // save the bits that will be shifted out plus new sign bit const s64 v = s64(get_64(R2)) >> (63 - m_info.imm); @@ -739,53 +733,53 @@ void clipper_device::execute_instruction() set_64(R2, get_64(R2) << m_info.imm); // overflow is set if sign changes during shift - FLAGS(0, v != 0 && v != -1, get_64(R2) == 0, s64(get_64(R2)) < 0) + FLAGS(0, v != 0 && v != -1, get_64(R2) == 0, BIT63(get_64(R2))); } else { set_64(R2, s64(get_64(R2)) >> -m_info.imm); - FLAGS(0, 0, get_64(R2) == 0, s64(get_64(R2)) < 0) + FLAGS(0, 0, get_64(R2) == 0, BIT63(get_64(R2))); } // FLAGS: 0VZN // TRAPS: I break; case 0x3a: // shli: shift logical immediate - if (s32(m_info.imm) > 0) + if (!BIT31(m_info.imm)) m_r[R2] <<= m_info.imm; else m_r[R2] >>= -m_info.imm; - FLAGS(0, 0, m_r[R2] == 0, s32(m_r[R2]) < 0); + FLAGS(0, 0, m_r[R2] == 0, BIT31(m_r[R2])); // FLAGS: 00ZN // TRAPS: I break; case 0x3b: // shlli: shift logical longword immediate - if (s32(m_info.imm) > 0) + if (!BIT31(m_info.imm)) set_64(R2, get_64(R2) << m_info.imm); else set_64(R2, get_64(R2) >> -m_info.imm); - FLAGS(0, 0, get_64(R2) == 0, s64(get_64(R2)) < 0); + FLAGS(0, 0, get_64(R2) == 0, BIT63(get_64(R2))); // FLAGS: 00ZN // TRAPS: I break; case 0x3c: // roti: rotate immediate - if (s32(m_info.imm) > 0) + if (!BIT31(m_info.imm)) m_r[R2] = rotl32(m_r[R2], m_info.imm); else m_r[R2] = rotr32(m_r[R2], -m_info.imm); - FLAGS(0, 0, m_r[R2] == 0, s32(m_r[R2]) < 0); + FLAGS(0, 0, m_r[R2] == 0, BIT31(m_r[R2])); // FLAGS: 00ZN // TRAPS: I break; case 0x3d: // rotli: rotate longword immediate - if (s32(m_info.imm) > 0) + if (!BIT31(m_info.imm)) set_64(R2, rotl64(get_64(R2), m_info.imm)); else set_64(R2, rotr64(get_64(R2), -m_info.imm)); - FLAGS(0, 0, get_64(R2) == 0, s64(get_64(R2)) < 0); + FLAGS(0, 0, get_64(R2) == 0, BIT63(get_64(R2))); // FLAGS: 00ZN // TRAPS: I break; @@ -924,95 +918,123 @@ void clipper_device::execute_instruction() case 0x80: // addw: add word - FLAGS_CV(C_ADD(m_r[R2], m_r[R1]), V_ADD(m_r[R2], m_r[R1])) - m_r[R2] += m_r[R1]; - FLAGS_ZN(m_r[R2] == 0, s32(m_r[R2]) < 0) + { + const u32 result = m_r[R2] + m_r[R1]; + + FLAGS_ADD(m_r[R2], m_r[R1], result); + + m_r[R2] = result; + } // FLAGS: CVZN break; case 0x82: // addq: add quick - FLAGS_CV(C_ADD(m_r[R2], R1), V_ADD(m_r[R2], R1)) - m_r[R2] += R1; - FLAGS_ZN(m_r[R2] == 0, s32(m_r[R2]) < 0) + { + const u32 result = m_r[R2] + m_info.r1; + + FLAGS_ADD(m_r[R2], m_info.r1, result); + + m_r[R2] = result; + } // FLAGS: CVZN break; case 0x83: // addi: add immediate - FLAGS_CV(C_ADD(m_r[R2], m_info.imm), V_ADD(m_r[R2], m_info.imm)) - m_r[R2] += m_info.imm; - FLAGS_ZN(m_r[R2] == 0, s32(m_r[R2]) < 0) + { + const u32 result = m_r[R2] + m_info.imm; + + FLAGS_ADD(m_r[R2], m_info.imm, result); + + m_r[R2] = result; + } // FLAGS: CVZN // TRAPS: I break; case 0x84: // movw: move word m_r[R2] = m_r[R1]; - FLAGS(0, 0, m_r[R2] == 0, s32(m_r[R2]) < 0) + FLAGS(0, 0, m_r[R2] == 0, BIT31(m_r[R2])); // FLAGS: 00ZN break; case 0x86: // loadq: load quick - m_r[R2] = R1; - FLAGS(0, 0, m_r[R2] == 0, 0) + m_r[R2] = m_info.r1; + FLAGS(0, 0, m_r[R2] == 0, 0); // FLAGS: 00Z0 break; case 0x87: // loadi: load immediate m_r[R2] = m_info.imm; - FLAGS(0, 0, m_r[R2] == 0, s32(m_r[R2]) < 0) + FLAGS(0, 0, m_r[R2] == 0, BIT31(m_r[R2])); // FLAGS: 00ZN // TRAPS: I break; case 0x88: // andw: and word m_r[R2] &= m_r[R1]; - FLAGS(0, 0, m_r[R2] == 0, s32(m_r[R2]) < 0) + FLAGS(0, 0, m_r[R2] == 0, BIT31(m_r[R2])); // FLAGS: 00ZN break; case 0x8b: // andi: and immediate m_r[R2] &= m_info.imm; - FLAGS(0, 0, m_r[R2] == 0, s32(m_r[R2]) < 0) + FLAGS(0, 0, m_r[R2] == 0, BIT31(m_r[R2])); // FLAGS: 00ZN // TRAPS: I break; case 0x8c: // orw: or word m_r[R2] |= m_r[R1]; - FLAGS(0, 0, m_r[R2] == 0, s32(m_r[R2]) < 0) + FLAGS(0, 0, m_r[R2] == 0, BIT31(m_r[R2])); // FLAGS: 00ZN break; case 0x8f: // ori: or immediate m_r[R2] |= m_info.imm; - FLAGS(0, 0, m_r[R2] == 0, s32(m_r[R2]) < 0) + FLAGS(0, 0, m_r[R2] == 0, BIT31(m_r[R2])); // FLAGS: 00ZN // TRAPS: I break; case 0x90: // addwc: add word with carry - FLAGS_CV(C_ADD(m_r[R2], (m_r[R1] + (PSW(C) ? 1 : 0))), V_ADD(m_r[R2], (m_r[R1] + (PSW(C) ? 1 : 0)))) - m_r[R2] += m_r[R1] + (PSW(C) ? 1 : 0); - FLAGS_ZN(m_r[R2] == 0, s32(m_r[R2]) < 0) + { + const u32 result = m_r[R2] + m_r[R1] + (PSW(C) ? 1 : 0); + + FLAGS_ADD(m_r[R2], m_r[R1], result); + + m_r[R2] = result; + } // FLAGS: CVZN break; case 0x91: // subwc: subtract word with carry - FLAGS_CV(C_SUB(m_r[R2], (m_r[R1] + (PSW(C) ? 1 : 0))), V_SUB(m_r[R2], (m_r[R1] + (PSW(C) ? 1 : 0)))) - m_r[R2] -= m_r[R1] + (PSW(C) ? 1 : 0); - FLAGS_ZN(m_r[R2] == 0, s32(m_r[R2]) < 0) + { + const u32 result = m_r[R2] - m_r[R1] - (PSW(C) ? 1 : 0); + + FLAGS_SUB(m_r[R2], m_r[R1], result); + + m_r[R2] = result; + } // FLAGS: CVZN break; case 0x93: // negw: negate word - FLAGS_CV(m_r[R1] != 0, s32(m_r[R1]) == INT32_MIN) - m_r[R2] = -m_r[R1]; - FLAGS_ZN(m_r[R2] == 0, s32(m_r[R2]) < 0) + { + const u32 result = -m_r[R1]; + + FLAGS( + m_r[R1] != 0, + s32(m_r[R1]) == INT32_MIN, + result == 0, + BIT31(result)); + + m_r[R2] = result; + } // FLAGS: CVZN break; @@ -1021,7 +1043,7 @@ void clipper_device::execute_instruction() { const s64 product = mul_32x32(m_r[R1], m_r[R2]); m_r[R2] = s32(product); - FLAGS(0, (u64(product) >> 32) != (BIT(product, 31) ? ~u32(0) : 0), 0, 0) + FLAGS(0, (u64(product) >> 32) != (BIT31(product) ? ~u32(0) : 0), 0, 0); // FLAGS: 0V00 } break; @@ -1030,7 +1052,7 @@ void clipper_device::execute_instruction() { const s64 product = mul_32x32(m_r[R1], m_r[R2]); set_64(R2, product); - FLAGS(0, (u64(product) >> 32) != (BIT(product, 31) ? ~u32(0) : 0), 0, 0) + FLAGS(0, (u64(product) >> 32) != (BIT31(product) ? ~u32(0) : 0), 0, 0); // FLAGS: 0V00 } break; @@ -1039,7 +1061,7 @@ void clipper_device::execute_instruction() { const u64 product = mulu_32x32(m_r[R1], m_r[R2]); m_r[R2] = u32(product); - FLAGS(0, (product >> 32) != 0, 0, 0) + FLAGS(0, (product >> 32) != 0, 0, 0); // FLAGS: 0V00 } break; @@ -1048,7 +1070,7 @@ void clipper_device::execute_instruction() { const u64 product = mulu_32x32(m_r[R1], m_r[R2]); set_64(R2, product); - FLAGS(0, (product >> 32) != 0, 0, 0) + FLAGS(0, (product >> 32) != 0, 0, 0); // FLAGS: 0V00 } break; @@ -1057,7 +1079,7 @@ void clipper_device::execute_instruction() if (m_r[R1] != 0) { // FLAGS: 0V00 - FLAGS(0, s32(m_r[R2]) == INT32_MIN && s32(m_r[R1]) == -1, 0, 0) + FLAGS(0, s32(m_r[R2]) == INT32_MIN && s32(m_r[R1]) == -1, 0, 0); m_r[R2] = s32(m_r[R2]) / s32(m_r[R1]); } else @@ -1069,7 +1091,7 @@ void clipper_device::execute_instruction() if (m_r[R1] != 0) { // FLAGS: 0V00 - FLAGS(0, s32(m_r[R2]) == INT32_MIN && s32(m_r[R1]) == -1, 0, 0) + FLAGS(0, s32(m_r[R2]) == INT32_MIN && s32(m_r[R1]) == -1, 0, 0); m_r[R2] = s32(m_r[R2]) % s32(m_r[R1]); } else @@ -1082,7 +1104,7 @@ void clipper_device::execute_instruction() { m_r[R2] = m_r[R2] / m_r[R1]; // FLAGS: 0000 - FLAGS(0, 0, 0, 0) + FLAGS(0, 0, 0, 0); } else // TRAPS: D @@ -1094,7 +1116,7 @@ void clipper_device::execute_instruction() { m_r[R2] = m_r[R2] % m_r[R1]; // FLAGS: 0000 - FLAGS(0, 0, 0, 0) + FLAGS(0, 0, 0, 0); } else // TRAPS: D @@ -1102,69 +1124,93 @@ void clipper_device::execute_instruction() break; case 0xa0: // subw: subtract word - FLAGS_CV(C_SUB(m_r[R2], m_r[R1]), V_SUB(m_r[R2], m_r[R1])) - m_r[R2] -= m_r[R1]; - FLAGS_ZN(m_r[R2] == 0, s32(m_r[R2]) < 0) + { + const u32 result = m_r[R2] - m_r[R1]; + + FLAGS_SUB(m_r[R2], m_r[R1], result); + + m_r[R2] = result; + } // FLAGS: CVZN break; case 0xa2: // subq: subtract quick - FLAGS_CV(C_SUB(m_r[R2], R1), V_SUB(m_r[R2], R1)) - m_r[R2] -= R1; - FLAGS_ZN(m_r[R2] == 0, s32(m_r[R2]) < 0) + { + const u32 result = m_r[R2] - m_info.r1; + + FLAGS_SUB(m_r[R2], m_info.r1, result); + + m_r[R2] = result; + } // FLAGS: CVZN break; case 0xa3: // subi: subtract immediate - FLAGS_CV(C_SUB(m_r[R2], m_info.imm), V_SUB(m_r[R2], m_info.imm)) - m_r[R2] -= m_info.imm; - FLAGS_ZN(m_r[R2] == 0, s32(m_r[R2]) < 0) + { + const u32 result = m_r[R2] - m_info.imm; + + FLAGS_SUB(m_r[R2], m_info.imm, result); + + m_r[R2] = result; + } // FLAGS: CVZN // TRAPS: I break; case 0xa4: // cmpw: compare word - FLAGS(C_SUB(m_r[R2], m_r[R1]), V_SUB(m_r[R2], m_r[R1]), m_r[R2] == m_r[R1], s32(m_r[R2]) < s32(m_r[R1])) + { + const u32 result = m_r[R2] - m_r[R1]; + + FLAGS_SUB(m_r[R2], m_r[R1], result); + } // FLAGS: CVZN break; case 0xa6: // cmpq: compare quick - FLAGS(C_SUB(m_r[R2], R1), V_SUB(m_r[R2], R1), m_r[R2] == R1, s32(m_r[R2]) < s32(R1)) + { + const u32 result = m_r[R2] - m_info.r1; + + FLAGS_SUB(m_r[R2], m_info.r1, result); + } // FLAGS: CVZN break; case 0xa7: // cmpi: compare immediate - FLAGS(C_SUB(m_r[R2], m_info.imm), V_SUB(m_r[R2], m_info.imm), m_r[R2] == m_info.imm, s32(m_r[R2]) < s32(m_info.imm)) + { + const u32 result = m_r[R2] - m_info.imm; + + FLAGS_SUB(m_r[R2], m_info.imm, result); + } // FLAGS: CVZN // TRAPS: I break; case 0xa8: // xorw: exclusive or word m_r[R2] ^= m_r[R1]; - FLAGS(0, 0, m_r[R2] == 0, s32(m_r[R2]) < 0) + FLAGS(0, 0, m_r[R2] == 0, BIT31(m_r[R2])); // FLAGS: 00ZN break; case 0xab: // xori: exclusive or immediate m_r[R2] ^= m_info.imm; - FLAGS(0, 0, m_r[R2] == 0, s32(m_r[R2]) < 0) + FLAGS(0, 0, m_r[R2] == 0, BIT31(m_r[R2])); // FLAGS: 00ZN // TRAPS: I break; case 0xac: // notw: not word m_r[R2] = ~m_r[R1]; - FLAGS(0, 0, m_r[R2] == 0, s32(m_r[R2]) < 0) + FLAGS(0, 0, m_r[R2] == 0, BIT31(m_r[R2])); // FLAGS: 00ZN break; case 0xae: // notq: not quick m_r[R2] = ~R1; - FLAGS(0, 0, 0, 1) + FLAGS(0, 0, 0, 1); // FLAGS: 0001 break; @@ -1229,10 +1275,15 @@ void clipper_device::execute_instruction() while (m_r[0]) { // read and compare bytes (as signed 32 bit integers) - get_dcammu().load<s8>(m_ssw, m_r[1], [this](s32 byte1) { - get_dcammu().load<s8>(m_ssw, m_r[2], [this, byte1](s32 byte2) { - if (byte1 != byte2) - FLAGS(C_SUB(byte2, byte1), V_SUB(byte2, byte1), byte2 == byte1, byte2 < byte1); }); }); + get_dcammu().load<s8>(m_ssw, m_r[1], [this](s32 byte1) + { + get_dcammu().load<s8>(m_ssw, m_r[2], [this, byte1](s32 byte2) + { + const s32 result = byte2 - byte1; + + FLAGS_SUB(byte2, byte1, result); + }); + }); // abort on exception or mismatch if (m_exception || !PSW(Z)) @@ -1424,14 +1475,14 @@ void clipper_device::execute_instruction() case 0x00: // movus: move user to supervisor m_rs[m_info.macro & 0xf] = m_ru[(m_info.macro >> 4) & 0xf]; - FLAGS(0, 0, m_rs[m_info.macro & 0xf] == 0, s32(m_rs[m_info.macro & 0xf]) < 0) + FLAGS(0, 0, m_rs[m_info.macro & 0xf] == 0, BIT31(m_rs[m_info.macro & 0xf])); // FLAGS: 00ZN // TRAPS: S break; case 0x01: // movsu: move supervisor to user m_ru[m_info.macro & 0xf] = m_rs[(m_info.macro >> 4) & 0xf]; - FLAGS(0, 0, m_ru[m_info.macro & 0xf] == 0, s32(m_ru[m_info.macro & 0xf]) < 0) + FLAGS(0, 0, m_ru[m_info.macro & 0xf] == 0, BIT31(m_ru[m_info.macro & 0xf])); // FLAGS: 00ZN // TRAPS: S break; diff --git a/src/devices/cpu/cop400/cop400.h b/src/devices/cpu/cop400/cop400.h index 5dbff8a9281..3fa806d2b06 100644 --- a/src/devices/cpu/cop400/cop400.h +++ b/src/devices/cpu/cop400/cop400.h @@ -135,6 +135,13 @@ public: template<class Object> devcb_base &set_write_sk_callback(Object &&cb) { return m_write_sk.set_callback(std::forward<Object>(cb)); } template<class Object> devcb_base &set_read_cko_callback(Object &&cb) { return m_read_cko.set_callback(std::forward<Object>(cb)); } + void set_config(cop400_cki_bond cki, cop400_cko_bond cko, bool has_microbus) + { + set_cki(cki); + set_cko(cko); + set_microbus(has_microbus); + } + void set_cki(cop400_cki_bond cki) { m_cki = cki; } void set_cko(cop400_cko_bond cko) { m_cko = cko; } void set_microbus(bool has_microbus) { m_has_microbus = has_microbus; } diff --git a/src/devices/cpu/f8/f8.cpp b/src/devices/cpu/f8/f8.cpp index 136f6cec2a7..79ed7b9644e 100644 --- a/src/devices/cpu/f8/f8.cpp +++ b/src/devices/cpu/f8/f8.cpp @@ -7,6 +7,27 @@ * This work is based on Frank Palazzolo's F8 emulation in a standalone * Fairchild Channel F emulator and the 'Fairchild F3850 CPU' data sheets. * + * The 3850 CPU itself does not include the address bus, pointer registers + * or an interrupt controller. Those functions are provided by at least one + * of the following devices: + * + * - 3851 Program Storage Unit (PSU) + * - 3852 Dynamic Memory Interface (DMI) + * - 3853 Static Memory Interface (SMI) + * - 3856 Program Storage Unit (PSU) + * - 3861 Peripheral Input/Output (PIO) + * - 3871 Peripheral Input/Output (PIO) + * + * Of these support devices, the 3851 PSU includes 1024 bytes of mask ROM, + * and the 3856 PSU includes 2048 bytes of mask ROM; addressing for the PSU + * is also determined by mask option. The 3853 SMI may be used with external + * program ROMs. + * + * The PSU does not have DC0 and DC1, only DC0; as a result, it does not + * respond to the main CPU's DC0/DC1 swap instruction. This may lead to two + * devices responding to the same DC0 address and attempting to place their + * bytes on the data bus simultaneously! + * *****************************************************************************/ #include "emu.h" diff --git a/src/devices/cpu/h6280/h6280.cpp b/src/devices/cpu/h6280/h6280.cpp index 4fb069d5390..001305f619b 100644 --- a/src/devices/cpu/h6280/h6280.cpp +++ b/src/devices/cpu/h6280/h6280.cpp @@ -150,6 +150,14 @@ enum #define PCW m_pc.w.l #define PCD m_pc.d +void h6280_device::internal_map(address_map &map) +{ + map(0x1fe800, 0x1fe80f).mirror(0x3f0).rw(FUNC(h6280_device::io_buffer_r), FUNC(h6280_device::psg_w)); + map(0x1fec00, 0x1fec01).mirror(0x3fe).rw(FUNC(h6280_device::timer_r), FUNC(h6280_device::timer_w)); + map(0x1ff000, 0x1ff000).mirror(0x3ff).rw(FUNC(h6280_device::port_r), FUNC(h6280_device::port_w)); + map(0x1ff400, 0x1ff403).mirror(0x3fc).rw(FUNC(h6280_device::irq_status_r), FUNC(h6280_device::irq_status_w)); +} + //************************************************************************** // DEVICE INTERFACE //************************************************************************** @@ -162,8 +170,12 @@ DEFINE_DEVICE_TYPE(H6280, h6280_device, "h6280", "Hudson Soft HuC6280") h6280_device::h6280_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : cpu_device(mconfig, H6280, tag, owner, clock) - , m_program_config("program", ENDIANNESS_LITTLE, 8, 21) + , device_mixer_interface(mconfig, *this, 2) + , m_program_config("program", ENDIANNESS_LITTLE, 8, 21, 0, address_map_constructor(FUNC(h6280_device::internal_map), this)) , m_io_config("io", ENDIANNESS_LITTLE, 8, 2) + , m_port_in_cb(*this) + , m_port_out_cb(*this) + , m_psg(*this, "psg") { // build the opcode table for (int op = 0; op < 256; op++) @@ -214,8 +226,21 @@ const h6280_device::ophandler h6280_device::s_opcodetable[256] = &h6280_device::op_f8, &h6280_device::op_f9, &h6280_device::op_fa, &h6280_device::op_fb, &h6280_device::op_fc, &h6280_device::op_fd, &h6280_device::op_fe, &h6280_device::op_ff }; +//------------------------------------------------- +// device_add_mconfig - add machine configuration +//------------------------------------------------- +void h6280_device::device_add_mconfig(machine_config &config) +{ + C6280(config, m_psg, DERIVED_CLOCK(1,2)); + m_psg->add_route(0, *this, 1.0, AUTO_ALLOC_INPUT, 0); + m_psg->add_route(1, *this, 1.0, AUTO_ALLOC_INPUT, 1); +} + void h6280_device::device_start() { + m_port_in_cb.resolve_safe(0xff); + m_port_out_cb.resolve_safe(); + // register our state for the debugger state_add(STATE_GENPC, "GENPC", m_pc.w.l).noshow(); state_add(STATE_GENPCBASE, "CURPC", m_pc.w.l).noshow(); @@ -2560,6 +2585,33 @@ WRITE8_MEMBER( h6280_device::timer_w ) } } +READ8_MEMBER( h6280_device::port_r ) +{ + if (!m_port_in_cb.isnull()) + return m_port_in_cb(); + + return m_io_buffer; +} + +WRITE8_MEMBER( h6280_device::port_w ) +{ + m_io_buffer = data; + + if (!m_port_out_cb.isnull()) + m_port_out_cb(data); +} + +READ8_MEMBER( h6280_device::io_buffer_r ) +{ + return m_io_buffer; +} + +WRITE8_MEMBER( h6280_device::psg_w ) +{ + m_io_buffer = data; + m_psg->c6280_w(space,offset,data,mem_mask); +} + bool h6280_device::memory_translate(int spacenum, int intention, offs_t &address) { if (spacenum == AS_PROGRAM) diff --git a/src/devices/cpu/h6280/h6280.h b/src/devices/cpu/h6280/h6280.h index 7c73187ab36..5e45a0fe7b9 100644 --- a/src/devices/cpu/h6280/h6280.h +++ b/src/devices/cpu/h6280/h6280.h @@ -17,6 +17,7 @@ #pragma once +#include "sound/c6280.h" #define H6280_LAZY_FLAGS 0 @@ -27,7 +28,7 @@ // ======================> h6280_device // Used by core CPU interface -class h6280_device : public cpu_device +class h6280_device : public cpu_device, public device_mixer_interface { public: // construction/destruction @@ -36,11 +37,9 @@ public: // public interfaces void set_irq_line(int irqline, int state); - DECLARE_READ8_MEMBER( irq_status_r ); - DECLARE_WRITE8_MEMBER( irq_status_w ); - - DECLARE_READ8_MEMBER( timer_r ); - DECLARE_WRITE8_MEMBER( timer_w ); + // configuration + auto port_in_cb() { return m_port_in_cb.bind(); } // K0-7 at Pinout + auto port_out_cb() { return m_port_out_cb.bind(); } // O0-7 at Pinout /* functions for use by the PSG and joypad port only! */ uint8_t io_get_buffer(); @@ -73,6 +72,7 @@ protected: }; // device-level overrides + virtual void device_add_mconfig(machine_config &config) override; virtual void device_start() override; virtual void device_reset() override; virtual void device_stop() override; @@ -352,6 +352,25 @@ protected: #endif uint8_t m_io_buffer; /* last value written to the PSG, timer, and interrupt pages */ + // internal registers + void internal_map(address_map &map); + DECLARE_READ8_MEMBER( irq_status_r ); + DECLARE_WRITE8_MEMBER( irq_status_w ); + + DECLARE_READ8_MEMBER( timer_r ); + DECLARE_WRITE8_MEMBER( timer_w ); + + DECLARE_READ8_MEMBER( port_r ); + DECLARE_WRITE8_MEMBER( port_w ); + + DECLARE_READ8_MEMBER( io_buffer_r ); + DECLARE_WRITE8_MEMBER( psg_w ); + + devcb_read8 m_port_in_cb; + devcb_write8 m_port_out_cb; + + required_device<c6280_device> m_psg; + // other internal states int m_icount; diff --git a/src/devices/cpu/h8/h83003.cpp b/src/devices/cpu/h8/h83003.cpp new file mode 100644 index 00000000000..69213cd164e --- /dev/null +++ b/src/devices/cpu/h8/h83003.cpp @@ -0,0 +1,288 @@ +// license:BSD-3-Clause +// copyright-holders:Olivier Galibert +#include "emu.h" +#include "h83003.h" + +DEFINE_DEVICE_TYPE(H83003, h83003_device, "h83003", "Hitachi H8/3003") + +h83003_device::h83003_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + h8h_device(mconfig, H83003, tag, owner, clock, address_map_constructor(FUNC(h83003_device::map), this)), + intc(*this, "intc"), + adc(*this, "adc"), + dma(*this, "dma"), + dma0(*this, "dma:0"), + dma1(*this, "dma:1"), + dma2(*this, "dma:2"), + port4(*this, "port4"), + port6(*this, "port6"), + port7(*this, "port7"), + port8(*this, "port8"), + port9(*this, "port9"), + porta(*this, "porta"), + portb(*this, "portb"), + timer16(*this, "timer16"), + timer16_0(*this, "timer16:0"), + timer16_1(*this, "timer16:1"), + timer16_2(*this, "timer16:2"), + timer16_3(*this, "timer16:3"), + timer16_4(*this, "timer16:4"), + sci0(*this, "sci0"), + sci1(*this, "sci1"), + watchdog(*this, "watchdog"), + tend0_cb(*this), + tend1_cb(*this) +{ + syscr = 0; +} + +void h83003_device::map(address_map &map) +{ + map(0xfffd10, 0xffff0f).ram(); + + // DMA: only full address mode supported + map(0xffff20, 0xffff21).rw("dma:0", FUNC(h8_dma_channel_device::marah_r), FUNC(h8_dma_channel_device::marah_w)); + map(0xffff22, 0xffff23).rw("dma:0", FUNC(h8_dma_channel_device::maral_r), FUNC(h8_dma_channel_device::maral_w)); + map(0xffff24, 0xffff25).rw("dma:0", FUNC(h8_dma_channel_device::etcra_r), FUNC(h8_dma_channel_device::etcra_w)); + map(0xffff27, 0xffff27).rw("dma:0", FUNC(h8_dma_channel_device::dtcra_r), FUNC(h8_dma_channel_device::dtcra_w)); + map(0xffff28, 0xffff29).rw("dma:0", FUNC(h8_dma_channel_device::marbh_r), FUNC(h8_dma_channel_device::marbh_w)); + map(0xffff2a, 0xffff2b).rw("dma:0", FUNC(h8_dma_channel_device::marbl_r), FUNC(h8_dma_channel_device::marbl_w)); + map(0xffff2c, 0xffff2d).rw("dma:0", FUNC(h8_dma_channel_device::etcrb_r), FUNC(h8_dma_channel_device::etcrb_w)); + map(0xffff2f, 0xffff2f).rw("dma:0", FUNC(h8_dma_channel_device::dtcrb_r), FUNC(h8_dma_channel_device::dtcrb_w)); + map(0xffff30, 0xffff31).rw("dma:1", FUNC(h8_dma_channel_device::marah_r), FUNC(h8_dma_channel_device::marah_w)); + map(0xffff32, 0xffff33).rw("dma:1", FUNC(h8_dma_channel_device::maral_r), FUNC(h8_dma_channel_device::maral_w)); + map(0xffff34, 0xffff35).rw("dma:1", FUNC(h8_dma_channel_device::etcra_r), FUNC(h8_dma_channel_device::etcra_w)); + map(0xffff37, 0xffff37).rw("dma:1", FUNC(h8_dma_channel_device::dtcra_r), FUNC(h8_dma_channel_device::dtcra_w)); + map(0xffff38, 0xffff39).rw("dma:1", FUNC(h8_dma_channel_device::marbh_r), FUNC(h8_dma_channel_device::marbh_w)); + map(0xffff3a, 0xffff3b).rw("dma:1", FUNC(h8_dma_channel_device::marbl_r), FUNC(h8_dma_channel_device::marbl_w)); + map(0xffff3c, 0xffff3d).rw("dma:1", FUNC(h8_dma_channel_device::etcrb_r), FUNC(h8_dma_channel_device::etcrb_w)); + map(0xffff3f, 0xffff3f).rw("dma:1", FUNC(h8_dma_channel_device::dtcrb_r), FUNC(h8_dma_channel_device::dtcrb_w)); + map(0xffff40, 0xffff41).rw("dma:2", FUNC(h8_dma_channel_device::marah_r), FUNC(h8_dma_channel_device::marah_w)); + map(0xffff42, 0xffff43).rw("dma:2", FUNC(h8_dma_channel_device::maral_r), FUNC(h8_dma_channel_device::maral_w)); + map(0xffff44, 0xffff45).rw("dma:2", FUNC(h8_dma_channel_device::etcra_r), FUNC(h8_dma_channel_device::etcra_w)); + map(0xffff47, 0xffff47).rw("dma:2", FUNC(h8_dma_channel_device::dtcra_r), FUNC(h8_dma_channel_device::dtcra_w)); + map(0xffff48, 0xffff49).rw("dma:2", FUNC(h8_dma_channel_device::marbh_r), FUNC(h8_dma_channel_device::marbh_w)); + map(0xffff4a, 0xffff4b).rw("dma:2", FUNC(h8_dma_channel_device::marbl_r), FUNC(h8_dma_channel_device::marbl_w)); + map(0xffff4c, 0xffff4d).rw("dma:2", FUNC(h8_dma_channel_device::etcrb_r), FUNC(h8_dma_channel_device::etcrb_w)); + map(0xffff4f, 0xffff4f).rw("dma:2", FUNC(h8_dma_channel_device::dtcrb_r), FUNC(h8_dma_channel_device::dtcrb_w)); + map(0xffff50, 0xffff51).rw("dma:3", FUNC(h8_dma_channel_device::marah_r), FUNC(h8_dma_channel_device::marah_w)); + map(0xffff52, 0xffff53).rw("dma:3", FUNC(h8_dma_channel_device::maral_r), FUNC(h8_dma_channel_device::maral_w)); + map(0xffff54, 0xffff55).rw("dma:3", FUNC(h8_dma_channel_device::etcra_r), FUNC(h8_dma_channel_device::etcra_w)); + map(0xffff57, 0xffff57).rw("dma:3", FUNC(h8_dma_channel_device::dtcra_r), FUNC(h8_dma_channel_device::dtcra_w)); + + map(0xffff60, 0xffff60).rw("timer16", FUNC(h8_timer16_device::tstr_r), FUNC(h8_timer16_device::tstr_w)); + map(0xffff61, 0xffff61).rw("timer16", FUNC(h8_timer16_device::tsyr_r), FUNC(h8_timer16_device::tsyr_w)); + map(0xffff62, 0xffff62).rw("timer16", FUNC(h8_timer16_device::tmdr_r), FUNC(h8_timer16_device::tmdr_w)); + map(0xffff63, 0xffff63).rw("timer16", FUNC(h8_timer16_device::tfcr_r), FUNC(h8_timer16_device::tfcr_w)); + map(0xffff64, 0xffff64).rw("timer16:0", FUNC(h8_timer16_channel_device::tcr_r), FUNC(h8_timer16_channel_device::tcr_w)); + map(0xffff65, 0xffff65).rw("timer16:0", FUNC(h8_timer16_channel_device::tior_r), FUNC(h8_timer16_channel_device::tior_w)); + map(0xffff66, 0xffff66).rw("timer16:0", FUNC(h8_timer16_channel_device::tier_r), FUNC(h8_timer16_channel_device::tier_w)); + map(0xffff67, 0xffff67).rw("timer16:0", FUNC(h8_timer16_channel_device::tsr_r), FUNC(h8_timer16_channel_device::tsr_w)); + map(0xffff68, 0xffff69).rw("timer16:0", FUNC(h8_timer16_channel_device::tcnt_r), FUNC(h8_timer16_channel_device::tcnt_w)); + map(0xffff6a, 0xffff6d).rw("timer16:0", FUNC(h8_timer16_channel_device::tgr_r), FUNC(h8_timer16_channel_device::tgr_w)); + map(0xffff6e, 0xffff6e).rw("timer16:1", FUNC(h8_timer16_channel_device::tcr_r), FUNC(h8_timer16_channel_device::tcr_w)); + map(0xffff6f, 0xffff6f).rw("timer16:1", FUNC(h8_timer16_channel_device::tior_r), FUNC(h8_timer16_channel_device::tior_w)); + map(0xffff70, 0xffff70).rw("timer16:1", FUNC(h8_timer16_channel_device::tier_r), FUNC(h8_timer16_channel_device::tier_w)); + map(0xffff71, 0xffff71).rw("timer16:1", FUNC(h8_timer16_channel_device::tsr_r), FUNC(h8_timer16_channel_device::tsr_w)); + map(0xffff72, 0xffff73).rw("timer16:1", FUNC(h8_timer16_channel_device::tcnt_r), FUNC(h8_timer16_channel_device::tcnt_w)); + map(0xffff74, 0xffff77).rw("timer16:1", FUNC(h8_timer16_channel_device::tgr_r), FUNC(h8_timer16_channel_device::tgr_w)); + map(0xffff78, 0xffff78).rw("timer16:2", FUNC(h8_timer16_channel_device::tcr_r), FUNC(h8_timer16_channel_device::tcr_w)); + map(0xffff79, 0xffff79).rw("timer16:2", FUNC(h8_timer16_channel_device::tior_r), FUNC(h8_timer16_channel_device::tior_w)); + map(0xffff7a, 0xffff7a).rw("timer16:2", FUNC(h8_timer16_channel_device::tier_r), FUNC(h8_timer16_channel_device::tier_w)); + map(0xffff7b, 0xffff7b).rw("timer16:2", FUNC(h8_timer16_channel_device::tsr_r), FUNC(h8_timer16_channel_device::tsr_w)); + map(0xffff7c, 0xffff7d).rw("timer16:2", FUNC(h8_timer16_channel_device::tcnt_r), FUNC(h8_timer16_channel_device::tcnt_w)); + map(0xffff7e, 0xffff81).rw("timer16:2", FUNC(h8_timer16_channel_device::tgr_r), FUNC(h8_timer16_channel_device::tgr_w)); + map(0xffff82, 0xffff82).rw("timer16:3", FUNC(h8_timer16_channel_device::tcr_r), FUNC(h8_timer16_channel_device::tcr_w)); + map(0xffff83, 0xffff83).rw("timer16:3", FUNC(h8_timer16_channel_device::tior_r), FUNC(h8_timer16_channel_device::tior_w)); + map(0xffff84, 0xffff84).rw("timer16:3", FUNC(h8_timer16_channel_device::tier_r), FUNC(h8_timer16_channel_device::tier_w)); + map(0xffff85, 0xffff85).rw("timer16:3", FUNC(h8_timer16_channel_device::tsr_r), FUNC(h8_timer16_channel_device::tsr_w)); + map(0xffff86, 0xffff87).rw("timer16:3", FUNC(h8_timer16_channel_device::tcnt_r), FUNC(h8_timer16_channel_device::tcnt_w)); + map(0xffff88, 0xffff8b).rw("timer16:3", FUNC(h8_timer16_channel_device::tgr_r), FUNC(h8_timer16_channel_device::tgr_w)); + map(0xffff8c, 0xffff8f).rw("timer16:3", FUNC(h8_timer16_channel_device::tbr_r), FUNC(h8_timer16_channel_device::tbr_w)); + map(0xffff90, 0xffff90).rw("timer16", FUNC(h8_timer16_device::toer_r), FUNC(h8_timer16_device::toer_w)); + map(0xffff91, 0xffff91).rw("timer16", FUNC(h8_timer16_device::tocr_r), FUNC(h8_timer16_device::tocr_w)); + map(0xffff92, 0xffff92).rw("timer16:4", FUNC(h8_timer16_channel_device::tcr_r), FUNC(h8_timer16_channel_device::tcr_w)); + map(0xffff93, 0xffff93).rw("timer16:4", FUNC(h8_timer16_channel_device::tior_r), FUNC(h8_timer16_channel_device::tior_w)); + map(0xffff94, 0xffff94).rw("timer16:4", FUNC(h8_timer16_channel_device::tier_r), FUNC(h8_timer16_channel_device::tier_w)); + map(0xffff95, 0xffff95).rw("timer16:4", FUNC(h8_timer16_channel_device::tsr_r), FUNC(h8_timer16_channel_device::tsr_w)); + map(0xffff96, 0xffff97).rw("timer16:4", FUNC(h8_timer16_channel_device::tcnt_r), FUNC(h8_timer16_channel_device::tcnt_w)); + map(0xffff98, 0xffff9b).rw("timer16:4", FUNC(h8_timer16_channel_device::tgr_r), FUNC(h8_timer16_channel_device::tgr_w)); + map(0xffff9c, 0xffff9f).rw("timer16:4", FUNC(h8_timer16_channel_device::tbr_r), FUNC(h8_timer16_channel_device::tbr_w)); + + map(0xffffa8, 0xffffa9).rw("watchdog", FUNC(h8_watchdog_device::wd_r), FUNC(h8_watchdog_device::wd_w)); + map(0xffffaa, 0xffffab).rw("watchdog", FUNC(h8_watchdog_device::rst_r), FUNC(h8_watchdog_device::rst_w)); + map(0xffffad, 0xffffad).rw(FUNC(h83003_device::rtmcsr_r), FUNC(h83003_device::rtmcsr_w)); + + map(0xffffb0, 0xffffb0).rw("sci0", FUNC(h8_sci_device::smr_r), FUNC(h8_sci_device::smr_w)); + map(0xffffb1, 0xffffb1).rw("sci0", FUNC(h8_sci_device::brr_r), FUNC(h8_sci_device::brr_w)); + map(0xffffb2, 0xffffb2).rw("sci0", FUNC(h8_sci_device::scr_r), FUNC(h8_sci_device::scr_w)); + map(0xffffb3, 0xffffb3).rw("sci0", FUNC(h8_sci_device::tdr_r), FUNC(h8_sci_device::tdr_w)); + map(0xffffb4, 0xffffb4).rw("sci0", FUNC(h8_sci_device::ssr_r), FUNC(h8_sci_device::ssr_w)); + map(0xffffb5, 0xffffb5).r("sci0", FUNC(h8_sci_device::rdr_r)); + map(0xffffb8, 0xffffb8).rw("sci1", FUNC(h8_sci_device::smr_r), FUNC(h8_sci_device::smr_w)); + map(0xffffb9, 0xffffb9).rw("sci1", FUNC(h8_sci_device::brr_r), FUNC(h8_sci_device::brr_w)); + map(0xffffba, 0xffffba).rw("sci1", FUNC(h8_sci_device::scr_r), FUNC(h8_sci_device::scr_w)); + map(0xffffbb, 0xffffbb).rw("sci1", FUNC(h8_sci_device::tdr_r), FUNC(h8_sci_device::tdr_w)); + map(0xffffbc, 0xffffbc).rw("sci1", FUNC(h8_sci_device::ssr_r), FUNC(h8_sci_device::ssr_w)); + map(0xffffbd, 0xffffbd).r("sci1", FUNC(h8_sci_device::rdr_r)); + map(0xffffc5, 0xffffc5).w("port4", FUNC(h8_port_device::ddr_w)); + map(0xffffc7, 0xffffc7).rw("port4", FUNC(h8_port_device::port_r), FUNC(h8_port_device::dr_w)); + map(0xffffc9, 0xffffc9).w("port6", FUNC(h8_port_device::ddr_w)); + map(0xffffcb, 0xffffcb).rw("port6", FUNC(h8_port_device::port_r), FUNC(h8_port_device::dr_w)); + map(0xffffcd, 0xffffcd).w("port8", FUNC(h8_port_device::ddr_w)); + map(0xffffce, 0xffffce).r("port7", FUNC(h8_port_device::port_r)); + map(0xffffcf, 0xffffcf).rw("port8", FUNC(h8_port_device::port_r), FUNC(h8_port_device::dr_w)); + map(0xffffd0, 0xffffd0).w("port9", FUNC(h8_port_device::ddr_w)); + map(0xffffd1, 0xffffd1).w("porta", FUNC(h8_port_device::ddr_w)); + map(0xffffd2, 0xffffd2).rw("port9", FUNC(h8_port_device::port_r), FUNC(h8_port_device::dr_w)); + map(0xffffd3, 0xffffd3).rw("porta", FUNC(h8_port_device::port_r), FUNC(h8_port_device::dr_w)); + map(0xffffd4, 0xffffd4).w("portb", FUNC(h8_port_device::ddr_w)); + map(0xffffd6, 0xffffd6).rw("portb", FUNC(h8_port_device::port_r), FUNC(h8_port_device::dr_w)); + map(0xffffda, 0xffffda).rw("port4", FUNC(h8_port_device::pcr_r), FUNC(h8_port_device::pcr_w)); + + map(0xffffe0, 0xffffe7).r("adc", FUNC(h8_adc_device::addr8_r)); + map(0xffffe8, 0xffffe8).rw("adc", FUNC(h8_adc_device::adcsr_r), FUNC(h8_adc_device::adcsr_w)); + map(0xffffe9, 0xffffe9).rw("adc", FUNC(h8_adc_device::adcr_r), FUNC(h8_adc_device::adcr_w)); + + map(0xfffff2, 0xfffff2).rw(FUNC(h83003_device::syscr_r), FUNC(h83003_device::syscr_w)); + map(0xfffff4, 0xfffff4).rw("intc", FUNC(h8h_intc_device::iscr_r), FUNC(h8h_intc_device::iscr_w)); + map(0xfffff5, 0xfffff5).rw("intc", FUNC(h8h_intc_device::ier_r), FUNC(h8h_intc_device::ier_w)); + map(0xfffff6, 0xfffff6).rw("intc", FUNC(h8h_intc_device::isr_r), FUNC(h8h_intc_device::isr_w)); + map(0xfffff8, 0xfffff9).rw("intc", FUNC(h8h_intc_device::icr_r), FUNC(h8h_intc_device::icr_w)); +} + +MACHINE_CONFIG_START(h83003_device::device_add_mconfig) + MCFG_H8H_INTC_ADD("intc") + MCFG_H8_ADC_3337_ADD("adc", "intc", 60) + MCFG_H8_DMA_ADD("dma") + // (H8/2002.pdf) Table 8-11 DMAC Activation Sources + MCFG_H8_DMA_CHANNEL_ADD("dma:0", "intc", 44, h8_dma_channel_device::NONE, 24, h8_dma_channel_device::DREQ_EDGE, h8_dma_channel_device::DREQ_LEVEL, 28, 32, 36, 54, 53, h8_dma_channel_device::NONE, h8_dma_channel_device::NONE, h8_dma_channel_device::NONE, h8_dma_channel_device::NONE, h8_dma_channel_device::NONE, h8_dma_channel_device::NONE, h8_dma_channel_device::NONE) + MCFG_H8_DMA_CHANNEL_ADD("dma:1", "intc", 46, h8_dma_channel_device::NONE, 24, h8_dma_channel_device::DREQ_EDGE, h8_dma_channel_device::DREQ_LEVEL, 28, 32, 36, 54, 53, h8_dma_channel_device::NONE, h8_dma_channel_device::NONE, h8_dma_channel_device::NONE, h8_dma_channel_device::NONE, h8_dma_channel_device::NONE, h8_dma_channel_device::NONE, h8_dma_channel_device::NONE) + MCFG_H8_DMA_CHANNEL_ADD("dma:2", "intc", 48, h8_dma_channel_device::NONE, 24, h8_dma_channel_device::DREQ_EDGE, h8_dma_channel_device::DREQ_LEVEL, 28, 32, 36, 54, 53, h8_dma_channel_device::NONE, h8_dma_channel_device::NONE, h8_dma_channel_device::NONE, h8_dma_channel_device::NONE, h8_dma_channel_device::NONE, h8_dma_channel_device::NONE, h8_dma_channel_device::NONE) + MCFG_H8_DMA_CHANNEL_ADD("dma:3", "intc", 50, h8_dma_channel_device::NONE, 24, h8_dma_channel_device::DREQ_EDGE, h8_dma_channel_device::DREQ_LEVEL, 28, 32, 36, 54, 53, h8_dma_channel_device::NONE, h8_dma_channel_device::NONE, h8_dma_channel_device::NONE, h8_dma_channel_device::NONE, h8_dma_channel_device::NONE, h8_dma_channel_device::NONE, h8_dma_channel_device::NONE) + MCFG_H8_PORT_ADD("port4", h8_device::PORT_4, 0x00, 0x00) + MCFG_H8_PORT_ADD("port6", h8_device::PORT_6, 0x80, 0x80) + MCFG_H8_PORT_ADD("port7", h8_device::PORT_7, 0x00, 0x00) + MCFG_H8_PORT_ADD("port8", h8_device::PORT_8, 0xf0, 0xe0) + MCFG_H8_PORT_ADD("port9", h8_device::PORT_9, 0x00, 0xc0) + MCFG_H8_PORT_ADD("porta", h8_device::PORT_A, 0x00, 0x00) + MCFG_H8_PORT_ADD("portb", h8_device::PORT_B, 0x00, 0x00) + MCFG_H8_TIMER16_ADD("timer16", 5, 0xe0) + MCFG_H8H_TIMER16_CHANNEL_ADD("timer16:0", 2, 2, "intc", 24) + MCFG_H8H_TIMER16_CHANNEL_ADD("timer16:1", 2, 2, "intc", 28) + MCFG_H8H_TIMER16_CHANNEL_ADD("timer16:2", 2, 2, "intc", 32) + MCFG_H8H_TIMER16_CHANNEL_ADD("timer16:3", 2, 2, "intc", 36) + MCFG_H8H_TIMER16_CHANNEL_ADD("timer16:4", 2, 2, "intc", 40) + MCFG_H8_SCI_ADD("sci0", "intc", 52, 53, 54, 55) + MCFG_H8_SCI_ADD("sci1", "intc", 56, 57, 58, 59) + MCFG_H8_WATCHDOG_ADD("watchdog", "intc", 20, h8_watchdog_device::H) +MACHINE_CONFIG_END + +void h83003_device::execute_set_input(int inputnum, int state) +{ + if(inputnum == H8_INPUT_LINE_TEND0 && !tend0_cb.isnull()) + tend0_cb(state); + else if(inputnum == H8_INPUT_LINE_TEND1 && !tend1_cb.isnull()) + tend1_cb(state); + else if(inputnum >= H8_INPUT_LINE_DREQ0 && inputnum <= H8_INPUT_LINE_DREQ3) + dma->set_input(inputnum, state); + else + intc->set_input(inputnum, state); +} + +int h83003_device::trapa_setup() +{ + if(syscr & 0x08) + CCR |= F_I; + else + CCR |= F_I|F_UI; + return 8; +} + +void h83003_device::irq_setup() +{ + if(syscr & 0x08) + CCR |= F_I; + else + CCR |= F_I|F_UI; +} + +void h83003_device::update_irq_filter() +{ + switch(syscr & 0x08) { + case 0x00: + if((CCR & (F_I|F_UI)) == (F_I|F_UI)) + intc->set_filter(2, -1); + else if(CCR & F_I) + intc->set_filter(1, -1); + else + intc->set_filter(0, -1); + break; + case 0x08: + if(CCR & F_I) + intc->set_filter(2, -1); + else + intc->set_filter(0, -1); + break; + } +} + +void h83003_device::interrupt_taken() +{ + standard_irq_callback(intc->interrupt_taken(taken_irq_vector)); +} + +void h83003_device::internal_update(uint64_t current_time) +{ + uint64_t event_time = 0; + + add_event(event_time, adc->internal_update(current_time)); + add_event(event_time, sci0->internal_update(current_time)); + add_event(event_time, sci1->internal_update(current_time)); + add_event(event_time, timer16_0->internal_update(current_time)); + add_event(event_time, timer16_1->internal_update(current_time)); + add_event(event_time, timer16_2->internal_update(current_time)); + add_event(event_time, timer16_3->internal_update(current_time)); + add_event(event_time, timer16_4->internal_update(current_time)); + add_event(event_time, watchdog->internal_update(current_time)); + + recompute_bcount(event_time); +} + +void h83003_device::device_start() +{ + h8h_device::device_start(); + dma_device = dma; + + tend0_cb.resolve(); + tend1_cb.resolve(); +} + +void h83003_device::device_reset() +{ + h8h_device::device_reset(); + syscr = 0x09; +} + +READ8_MEMBER(h83003_device::syscr_r) +{ + return syscr; +} + +WRITE8_MEMBER(h83003_device::syscr_w) +{ + syscr = data; + update_irq_filter(); + logerror("syscr = %02x\n", data); +} + +READ8_MEMBER(h83003_device::rtmcsr_r) +{ + // set bit 7 -- Compare Match Flag (CMF): This status flag indicates that the RTCNT and RTCOR values have matched. + return rtmcsr | 0x80; +} + +WRITE8_MEMBER(h83003_device::rtmcsr_w) +{ + rtmcsr = data; + logerror("rtmcsr = %02x\n", data); +} diff --git a/src/devices/cpu/h8/h83003.h b/src/devices/cpu/h8/h83003.h new file mode 100644 index 00000000000..6f57155faf2 --- /dev/null +++ b/src/devices/cpu/h8/h83003.h @@ -0,0 +1,90 @@ +// license:BSD-3-Clause +// copyright-holders:Olivier Galibert +/*************************************************************************** + + h83003.h + + H8/3003 + + H8/300H-based mcus. + + +***************************************************************************/ + +#ifndef MAME_CPU_H8_H83003_H +#define MAME_CPU_H8_H83003_H + +#pragma once + +#include "h8h.h" +#include "h8_adc.h" +#include "h8_dma.h" +#include "h8_port.h" +#include "h8_intc.h" +#include "h8_timer16.h" +#include "h8_sci.h" +#include "h8_watchdog.h" + +#define MCFG_H83003_TEND0_CALLBACK(_devcb) \ + downcast<h83003_device &>(*device).set_tend0_callback(DEVCB_##_devcb); +#define MCFG_H83003_TEND1_CALLBACK(_devcb) \ + downcast<h83003_device &>(*device).set_tend1_callback(DEVCB_##_devcb); + +class h83003_device : public h8h_device { +public: + h83003_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + + template<class Object> devcb_base &set_tend0_callback(Object &&cb) { return tend0_cb.set_callback(std::forward<Object>(cb)); } + template<class Object> devcb_base &set_tend1_callback(Object &&cb) { return tend1_cb.set_callback(std::forward<Object>(cb)); } + + DECLARE_READ8_MEMBER(syscr_r); + DECLARE_WRITE8_MEMBER(syscr_w); + + DECLARE_READ8_MEMBER(rtmcsr_r); + DECLARE_WRITE8_MEMBER(rtmcsr_w); + +protected: + required_device<h8h_intc_device> intc; + required_device<h8_adc_device> adc; + optional_device<h8_dma_device> dma; + optional_device<h8_dma_channel_device> dma0; + optional_device<h8_dma_channel_device> dma1; + optional_device<h8_dma_channel_device> dma2; + required_device<h8_port_device> port4; + required_device<h8_port_device> port6; + required_device<h8_port_device> port7; + required_device<h8_port_device> port8; + required_device<h8_port_device> port9; + required_device<h8_port_device> porta; + required_device<h8_port_device> portb; + required_device<h8_timer16_device> timer16; + required_device<h8h_timer16_channel_device> timer16_0; + required_device<h8h_timer16_channel_device> timer16_1; + required_device<h8h_timer16_channel_device> timer16_2; + required_device<h8h_timer16_channel_device> timer16_3; + required_device<h8h_timer16_channel_device> timer16_4; + required_device<h8_sci_device> sci0; + required_device<h8_sci_device> sci1; + required_device<h8_watchdog_device> watchdog; + + uint8_t syscr; + uint8_t rtmcsr; + + devcb_write_line tend0_cb, tend1_cb; + + virtual void update_irq_filter() override; + virtual void interrupt_taken() override; + virtual int trapa_setup() override; + virtual void irq_setup() override; + virtual void internal_update(uint64_t current_time) override; + virtual void device_add_mconfig(machine_config &config) override; + void map(address_map &map); + + virtual void device_start() override; + virtual void device_reset() override; + virtual void execute_set_input(int inputnum, int state) override; +}; + +DECLARE_DEVICE_TYPE(H83003, h83003_device) + +#endif // MAME_CPU_H8_H83003_H diff --git a/src/devices/cpu/i386/i486ops.hxx b/src/devices/cpu/i386/i486ops.hxx index fd346e6109d..d151de8a922 100644 --- a/src/devices/cpu/i386/i486ops.hxx +++ b/src/devices/cpu/i386/i486ops.hxx @@ -152,14 +152,16 @@ void i386_device::i486_xadd_rm8_r8() // Opcode 0x0f c0 if( modrm >= 0xc0 ) { uint8_t dst = LOAD_RM8(modrm); uint8_t src = LOAD_REG8(modrm); + uint8_t sum = ADD8(dst, src); STORE_REG8(modrm, dst); - STORE_RM8(modrm, dst + src); + STORE_RM8(modrm, sum); CYCLES(CYCLES_XADD_REG_REG); } else { uint32_t ea = GetEA(modrm,1); uint8_t dst = READ8(ea); uint8_t src = LOAD_REG8(modrm); - WRITE8(ea, dst + src); + uint8_t sum = ADD8(dst, src); + WRITE8(ea, sum); STORE_REG8(modrm, dst); CYCLES(CYCLES_XADD_REG_MEM); } @@ -171,14 +173,16 @@ void i386_device::i486_xadd_rm16_r16() // Opcode 0x0f c1 if( modrm >= 0xc0 ) { uint16_t dst = LOAD_RM16(modrm); uint16_t src = LOAD_REG16(modrm); + uint16_t sum = ADD16(dst, src); STORE_REG16(modrm, dst); - STORE_RM16(modrm, dst + src); + STORE_RM16(modrm, sum); CYCLES(CYCLES_XADD_REG_REG); } else { uint32_t ea = GetEA(modrm,1); uint16_t dst = READ16(ea); uint16_t src = LOAD_REG16(modrm); - WRITE16(ea, dst + src); + uint16_t sum = ADD16(dst, src); + WRITE16(ea, sum); STORE_REG16(modrm, dst); CYCLES(CYCLES_XADD_REG_MEM); } @@ -190,14 +194,16 @@ void i386_device::i486_xadd_rm32_r32() // Opcode 0x0f c1 if( modrm >= 0xc0 ) { uint32_t dst = LOAD_RM32(modrm); uint32_t src = LOAD_REG32(modrm); + uint32_t sum = ADD32(dst, src); STORE_REG32(modrm, dst); - STORE_RM32(modrm, dst + src); + STORE_RM32(modrm, sum); CYCLES(CYCLES_XADD_REG_REG); } else { uint32_t ea = GetEA(modrm,1); uint32_t dst = READ32(ea); uint32_t src = LOAD_REG32(modrm); - WRITE32(ea, dst + src); + uint32_t sum = ADD32(dst, src); + WRITE32(ea, sum); STORE_REG32(modrm, dst); CYCLES(CYCLES_XADD_REG_MEM); } diff --git a/src/devices/cpu/i86/i286.h b/src/devices/cpu/i86/i286.h index 0012cd63699..97752a5d102 100644 --- a/src/devices/cpu/i86/i286.h +++ b/src/devices/cpu/i86/i286.h @@ -74,6 +74,7 @@ public: typedef delegate<uint32_t (bool)> a20_cb; template <typename Object> void set_a20_callback(Object &&cb) { m_a20_callback = std::forward<Object>(cb); } template <class Object> devcb_base &set_shutdown_callback(Object &&cb) { return m_out_shutdown_func.set_callback(std::forward<Object>(cb)); } + auto shutdown_callback() { return m_out_shutdown_func.bind(); } protected: virtual void execute_run() override; diff --git a/src/devices/cpu/m6502/m6510.h b/src/devices/cpu/m6502/m6510.h index bedcb78a224..4e686560f5a 100644 --- a/src/devices/cpu/m6502/m6510.h +++ b/src/devices/cpu/m6502/m6510.h @@ -31,6 +31,8 @@ public: read_port.set_callback(std::forward<Read>(rd)); write_port.set_callback(std::forward<Write>(wr)); } + auto read_callback() { return read_port.bind(); } + auto write_callback() { return write_port.bind(); } virtual std::unique_ptr<util::disasm_interface> create_disassembler() override; virtual void do_exec_full() override; diff --git a/src/devices/cpu/psx/psx.cpp b/src/devices/cpu/psx/psx.cpp index f74d998fed4..9ea179f6716 100644 --- a/src/devices/cpu/psx/psx.cpp +++ b/src/devices/cpu/psx/psx.cpp @@ -137,6 +137,10 @@ #define CAUSE_EXC ( 31L << 2 ) #define CAUSE_IP ( 255L << 8 ) +// software interrupts +#define CAUSE_IP0 ( 1L << 8 ) +#define CAUSE_IP1 ( 1L << 9 ) +// hardware interrupts #define CAUSE_IP2 ( 1L << 10 ) #define CAUSE_IP3 ( 1L << 11 ) #define CAUSE_IP4 ( 1L << 12 ) @@ -1436,21 +1440,32 @@ void psxcpu_device::update_rom_config() } } -void psxcpu_device::update_cop0( int reg ) +void psxcpu_device::update_cop0(int reg) { - if( reg == CP0_SR ) + if (reg == CP0_SR) { update_memory_handlers(); update_address_masks(); } - if( ( reg == CP0_SR || reg == CP0_CAUSE ) && - ( m_cp0r[ CP0_SR ] & SR_IEC ) != 0 && - ( m_cp0r[ CP0_SR ] & m_cp0r[ CP0_CAUSE ] & CAUSE_IP ) != 0 ) + if ((reg == CP0_SR || reg == CP0_CAUSE) && + (m_cp0r[CP0_SR] & SR_IEC) != 0) { - m_op = m_cache->read_dword( m_pc ); - execute_unstoppable_instructions( 1 ); - exception( EXC_INT ); + uint32_t ip = m_cp0r[CP0_SR] & m_cp0r[CP0_CAUSE] & CAUSE_IP; + if (ip != 0) + { + if (ip & CAUSE_IP0) debugger_exception_hook(EXC_INT); + if (ip & CAUSE_IP1) debugger_exception_hook(EXC_INT); + //if (ip & CAUSE_IP2) debugger_interrupt_hook(PSXCPU_IRQ0); + //if (ip & CAUSE_IP3) debugger_interrupt_hook(PSXCPU_IRQ1); + //if (ip & CAUSE_IP4) debugger_interrupt_hook(PSXCPU_IRQ2); + //if (ip & CAUSE_IP5) debugger_interrupt_hook(PSXCPU_IRQ3); + //if (ip & CAUSE_IP6) debugger_interrupt_hook(PSXCPU_IRQ4); + //if (ip & CAUSE_IP7) debugger_interrupt_hook(PSXCPU_IRQ5); + m_op = m_cache->read_dword(m_pc); + execute_unstoppable_instructions(1); + exception(EXC_INT); + } } } @@ -1588,9 +1603,12 @@ void psxcpu_device::common_exception( int exception, uint32_t romOffset, uint32_ m_cp0r[ CP0_EPC ] = m_pc; } - if( LOG_BIOSCALL && exception != EXC_INT ) + if (exception != EXC_INT) { - logerror( "%08x: Exception %d\n", m_pc, exception ); + if (LOG_BIOSCALL) + logerror("%08x: Exception %d\n", m_pc, exception); + + debugger_exception_hook(exception); } m_delayr = 0; diff --git a/src/devices/cpu/score/score.cpp b/src/devices/cpu/score/score.cpp index 3a3b1ce6b15..bf5b434cb06 100644 --- a/src/devices/cpu/score/score.cpp +++ b/src/devices/cpu/score/score.cpp @@ -325,7 +325,7 @@ void score7_cpu_device::check_irq() if (m_pending_interrupt[i]) { m_pending_interrupt[i] = false; - debugger_interrupt_hook(i); + standard_irq_callback(i); gen_exception(EXCEPTION_INTERRUPT, i); return; } diff --git a/src/devices/cpu/tlcs870/tlcs870.cpp b/src/devices/cpu/tlcs870/tlcs870.cpp index db201179719..43a167f9427 100644 --- a/src/devices/cpu/tlcs870/tlcs870.cpp +++ b/src/devices/cpu/tlcs870/tlcs870.cpp @@ -36,7 +36,7 @@ void tlcs870_device::tmp87ph40an_mem(address_map &map) map(0x000b, 0x000b).w(FUNC(tlcs870_device::p1cr_w)); // Port 1 I/O control map(0x000c, 0x000c).w(FUNC(tlcs870_device::p6cr_w)); // Port 6 I/O control map(0x000d, 0x000d).w(FUNC(tlcs870_device::p7cr_w)); // Port 7 I/O control -#if 0 + map(0x000e, 0x000e).rw(FUNC(tlcs870_device::adccr_r), FUNC(tlcs870_device::adccr_w)); // A/D converter control map(0x000f, 0x000f).r(FUNC(tlcs870_device::adcdr_r)); // A/D converter result @@ -51,12 +51,11 @@ void tlcs870_device::tmp87ph40an_mem(address_map &map) map(0x0018, 0x0018).rw(FUNC(tlcs870_device::treg3a_r), FUNC(tlcs870_device::treg3a_w)); // Timer register 3A map(0x0019, 0x0019).r(FUNC(tlcs870_device::treg3b_r)); // Timer register 3B map(0x001a, 0x001a).w(FUNC(tlcs870_device::tc3cr_w)); // TC3 control - map(0x001b, 0x001b).r(FUNC(tlcs870_device::treg4_r)); // Timer register 4 + map(0x001b, 0x001b).w(FUNC(tlcs870_device::treg4_w)); // Timer register 4 map(0x001c, 0x001c).w(FUNC(tlcs870_device::tc4cr_w)); // TC4 control // 0x1d reserved // 0x1e reserved // 0x1f reserved - map(0x0020, 0x0020).rw(FUNC(tlcs870_device::sio1sr_r), FUNC(tlcs870_device::sio1cr1_w)); // SIO1 status / SIO1 control map(0x0021, 0x0021).w(FUNC(tlcs870_device::sio1cr2_w)); // SIO1 control map(0x0022, 0x0022).rw(FUNC(tlcs870_device::sio2sr_r), FUNC(tlcs870_device::sio2cr1_w)); // SIO2 status / SIO2 control @@ -82,6 +81,7 @@ void tlcs870_device::tmp87ph40an_mem(address_map &map) map(0x0035, 0x0035).w(FUNC(tlcs870_device::wdtcr2_w)); // map(0x0036, 0x0036).rw(FUNC(tlcs870_device::tbtcr_r), FUNC(tlcs870_device::tbtcr_w)); // TBT / TG / DVO control + map(0x0037, 0x0037).rw(FUNC(tlcs870_device::eintcr_r), FUNC(tlcs870_device::eintcr_w)); // External interrupt control map(0x0038, 0x0038).rw(FUNC(tlcs870_device::syscr1_r), FUNC(tlcs870_device::syscr1_w)); // System Control @@ -92,12 +92,13 @@ void tlcs870_device::tmp87ph40an_mem(address_map &map) map(0x003c, 0x003c).rw(FUNC(tlcs870_device::il_l_r), FUNC(tlcs870_device::il_l_w)); // Interrupt latch map(0x003d, 0x003d).rw(FUNC(tlcs870_device::il_h_r), FUNC(tlcs870_device::il_h_w)); // + // 0x3e reserved map(0x003f, 0x003f).rw(FUNC(tlcs870_device::psw_r), FUNC(tlcs870_device::rbs_w)); // Program status word / Register bank selector -#endif - map(0x0040, 0x023f).ram().share("intram"); // register banks + internal RAM, not, code execution NOT allowed here - map(0x0f80, 0x0fff).ram(); // DBR + map(0x0040, 0x023f).ram().share("intram"); // register banks + internal RAM, not, code execution NOT allowed here (fetches FF and causes SWI) + map(0x0f80, 0x0fef).ram(); // DBR (0f80 - 0fef = reserved) + map(0x0ff0, 0x0fff).ram().share("dbr"); // DBR 0ff0-0ff7 = SIO1 buffer, 0ff8 - 0fff = SIO2 buffer) map(0xc000, 0xffff).rom(); } @@ -107,8 +108,11 @@ tlcs870_device::tlcs870_device(const machine_config &mconfig, device_type optype , m_program_config("program", ENDIANNESS_LITTLE, 8, 16, 0, program_map) , m_io_config("io", ENDIANNESS_LITTLE, 8, 16, 0) , m_intram(*this, "intram") + , m_dbr(*this, "dbr") , m_port_in_cb{{*this}, {*this}, {*this}, {*this}, {*this}, {*this}, {*this}, {*this}} , m_port_out_cb{{*this}, {*this}, {*this}, {*this}, {*this}, {*this}, {*this}, {*this}} + , m_port_analog_in_cb{{*this}, {*this}, {*this}, {*this}, {*this}, {*this}, {*this}, {*this}} + , m_serial_out_cb{{*this}, {*this}} { } @@ -272,36 +276,734 @@ WRITE8_MEMBER(tlcs870_device::p7cr_w) m_port7_cr = data; } +// Timer emulation + +// 16-Bit Timer / Counter 2 (TC1) + +TIMER_CALLBACK_MEMBER(tlcs870_device::tc1_cb) +{ + +} + +WRITE8_MEMBER(tlcs870_device::tc1cr_w) +{ + m_TC1CR = data; + + logerror("%s m_TC1CR (16-bit TC1 Timer Control Register) bits set to\n", machine().describe_context()); + logerror("%d: TFF1 (Timer F/F1 control for PPG mode)\n", (m_TC1CR & 0x80) ? 1 : 0); + logerror("%d: SCAP1/MCAP1/METT1/MPPG1\n", (m_TC1CR & 0x40) ? 1 : 0); + logerror("%d: TC1S-1 (TC1 Start Control)\n", (m_TC1CR & 0x20) ? 1 : 0); + logerror("%d: TC1S-0 (TC1 Start Control)\n", (m_TC1CR & 0x10) ? 1 : 0); + logerror("%d: TC1CK-1 (TC1 Source Clock select)\n", (m_TC1CR & 0x08) ? 1 : 0); + logerror("%d: TC1CK-0 (TC1 Source Clock select)\n", (m_TC1CR & 0x04) ? 1 : 0); + logerror("%d: TC1M-1 (TC1 Mode Select)\n", (m_TC1CR & 0x02) ? 1 : 0); + logerror("%d: TC1M-0 (TC1 Mode Select)\n", (m_TC1CR & 0x01) ? 1 : 0); +} + +WRITE8_MEMBER(tlcs870_device::treg1a_l_w) +{ + m_TREG1A = (m_TREG1A & 0xff00) | data; +} + +WRITE8_MEMBER(tlcs870_device::treg1a_h_w) +{ + m_TREG1A = (m_TREG1A & 0x00ff) | (data << 8); +} + +WRITE8_MEMBER(tlcs870_device::treg1b_l_w) +{ + m_TREG1B = (m_TREG1B & 0xff00) | data; +} + +WRITE8_MEMBER(tlcs870_device::treg1b_h_w) +{ + m_TREG1B = (m_TREG1B & 0x00ff) | (data << 8); +} + +READ8_MEMBER(tlcs870_device::treg1b_l_r) +{ + return m_TREG1B & 0xff; +} + +READ8_MEMBER(tlcs870_device::treg1b_h_r) +{ + return (m_TREG1B >>8) & 0xff; +} + +// 16-Bit Timer / Counter 2 (TC2) + +TIMER_CALLBACK_MEMBER(tlcs870_device::tc2_cb) +{ + m_IL |= 1 << (15-TLCS870_IRQ_INTTC2); + tc2_reload(); +} + +void tlcs870_device::tc2_reload() +{ + m_tcx_timer[1]->adjust(cycles_to_attotime(1500)); // TODO: use real value +} + +void tlcs870_device::tc2_cancel() +{ + m_tcx_timer[1]->adjust(attotime::never); +} + +WRITE8_MEMBER(tlcs870_device::tc2cr_w) +{ + if (data & 0x20) + { + if (!(m_TC2CR & 0x20)) + { + tc2_reload(); + } + } + else + { + tc2_cancel(); + } + + m_TC2CR = data; + + logerror("%s m_TC2CR (16-bit TC2 Timer Control Register) bits set to\n", machine().describe_context()); + logerror("%d: (invalid)\n", (m_TC2CR & 0x80) ? 1 : 0); + logerror("%d: (invalid)\n", (m_TC2CR & 0x40) ? 1 : 0); + logerror("%d: TC2S (TC2 Start Control)\n", (m_TC2CR & 0x20) ? 1 : 0); + logerror("%d: TC2CK-2 (TC2 Source Clock select)\n", (m_TC2CR & 0x10) ? 1 : 0); + logerror("%d: TC2CK-1 (TC2 Source Clock select)\n", (m_TC2CR & 0x08) ? 1 : 0); + logerror("%d: TC2CK-0 (TC2 Source Clock select)\n", (m_TC2CR & 0x04) ? 1 : 0); + logerror("%d: (invalid)\n", (m_TC2CR & 0x02) ? 1 : 0); + logerror("%d: TC2M (TC2 Mode Select)\n", (m_TC2CR & 0x01) ? 1 : 0); +} + +WRITE8_MEMBER(tlcs870_device::treg2_l_w) +{ + m_TREG2 = (m_TREG2 & 0xff00) | data; +} + +WRITE8_MEMBER(tlcs870_device::treg2_h_w) +{ + m_TREG2 = (m_TREG2 & 0x00ff) | (data << 8); +} + +// 8-Bit Timer / Counter 3 (TC3) + +TIMER_CALLBACK_MEMBER(tlcs870_device::tc3_cb) +{ + +} + +WRITE8_MEMBER(tlcs870_device::tc3cr_w) +{ + m_TC3CR = data; + + logerror("%s m_TC3CR (8-bit TC3 Timer Control Register) bits set to\n", machine().describe_context()); + logerror("%d: (invalid)\n", (m_TC3CR & 0x80) ? 1 : 0); + logerror("%d: SCAP (Software Capture Control)\n", (m_TC3CR & 0x40) ? 1 : 0); + logerror("%d: (invalid)\n", (m_TC3CR & 0x20) ? 1 : 0); + logerror("%d: TC3S (TC3 Start Control)\n", (m_TC3CR & 0x10) ? 1 : 0); + logerror("%d: TC3CK-1 (TC3 Source Clock select)\n", (m_TC3CR & 0x08) ? 1 : 0); + logerror("%d: TC3CK-0 (TC3 Source Clock select)\n", (m_TC3CR & 0x04) ? 1 : 0); + logerror("%d: (invalid)\n", (m_TC3CR & 0x02) ? 1 : 0); + logerror("%d: TC3M (TC3 Mode Select)\n", (m_TC3CR & 0x01) ? 1 : 0); +} + +WRITE8_MEMBER(tlcs870_device::treg3a_w) +{ + m_TREG3A = data; +} + +READ8_MEMBER(tlcs870_device::treg3a_r) +{ + return m_TREG3A; +} + +READ8_MEMBER(tlcs870_device::treg3b_r) +{ + return m_TREG3B; +} + +// 8-Bit Timer / Counter 3 (TC4) + +TIMER_CALLBACK_MEMBER(tlcs870_device::tc4_cb) +{ + +} + +WRITE8_MEMBER(tlcs870_device::tc4cr_w) +{ + m_TC4CR = data; + + logerror("%s m_TC4CR (8-bit TC4 Timer Control Register) bits set to\n", machine().describe_context()); + logerror("%d: TFF4-1 (Timer F/F 4 Control)\n", (m_TC4CR & 0x80) ? 1 : 0); + logerror("%d: TFF4-0 (Timer F/F 4 Control)\n", (m_TC4CR & 0x40) ? 1 : 0); + logerror("%d: (invalid)\n", (m_TC4CR & 0x20) ? 1 : 0); + logerror("%d: TC4S (TC4 Start Control)\n", (m_TC4CR & 0x10) ? 1 : 0); + logerror("%d: TC4CK-1 (TC4 Source Clock select)\n", (m_TC4CR & 0x08) ? 1 : 0); + logerror("%d: TC4CK-0 (TC4 Source Clock select)\n", (m_TC4CR & 0x04) ? 1 : 0); + logerror("%d: TC4M-1 (TC4 Mode Select)\n", (m_TC4CR & 0x02) ? 1 : 0); + logerror("%d: TC4M-0 (TC4 Mode Select)\n", (m_TC4CR & 0x01) ? 1 : 0); +} + +WRITE8_MEMBER(tlcs870_device::treg4_w) +{ + m_TREG4 = data; +} + +// Time Base Timer + +// this is used with TLCS870_IRQ_INTTBT (FFF2 INTTBT) (not used by hng64) +// the divider output makes use of PORT1 bit 3, which must be properly configured +WRITE8_MEMBER(tlcs870_device::tbtcr_w) +{ + m_TBTCR = data; + + logerror("%s m_TBTCR (Time Base Timer) bits set to\n", machine().describe_context()); + logerror("%d: DV0EN (Divider Output Enable)\n", (m_TBTCR & 0x80) ? 1 : 0); + logerror("%d: DVOCK-1 (Divide Output Frequency Selection)n", (m_TBTCR & 0x40) ? 1 : 0); + logerror("%d: DVOCK-0 (Divide Output Frequency Selection)\n", (m_TBTCR & 0x20) ? 1 : 0); + logerror("%d: DV7CK (?)\n", (m_TBTCR & 0x10) ? 1 : 0); + logerror("%d: TBTEN (Time Base Timer Enable)\n", (m_TBTCR & 0x08) ? 1 : 0); + logerror("%d: TBTCK-2 (Time Base Timer Interrupt Frequency)\n", (m_TBTCR & 0x04) ? 1 : 0); + logerror("%d: TBTCK-1 (Time Base Timer Interrupt Frequency)\n", (m_TBTCR & 0x02) ? 1 : 0); + logerror("%d: TBTCK-0 (Time Base Timer Interrupt Frequency)\n", (m_TBTCR & 0x01) ? 1 : 0); +} + +READ8_MEMBER(tlcs870_device::tbtcr_r) +{ + return m_TBTCR; +} + +/* SIO emulation */ + +// TODO: use templates for SIO1/2 ports, as they're the same except for the DBR region they use? + +// Serial Port 1 +WRITE8_MEMBER(tlcs870_device::sio1cr1_w) +{ + m_SIOCR1[0] = data; + + logerror("%s m_SIOCR1[0] (Serial IO Port 1 Control Register 1) bits set to\n", machine().describe_context()); + logerror("%d: SIOS1 (Start/Stop transfer)\n", (m_SIOCR1[0] & 0x80) ? 1 : 0); + logerror("%d: SIOINH1 (Abort/Continue transfer)\n", (m_SIOCR1[0] & 0x40) ? 1 : 0); + logerror("%d: SIOM1-2 (Serial Mode)\n", (m_SIOCR1[0] & 0x20) ? 1 : 0); + logerror("%d: SIOM1-1 (Serial Mode)\n", (m_SIOCR1[0] & 0x10) ? 1 : 0); + logerror("%d: SIOM1-0 (Serial Mode)\n", (m_SIOCR1[0] & 0x08) ? 1 : 0); + logerror("%d: SCK1-2 (Serial Clock)\n", (m_SIOCR1[0] & 0x04) ? 1 : 0); + logerror("%d: SCK1-1 (Serial Clock)\n", (m_SIOCR1[0] & 0x02) ? 1 : 0); + logerror("%d: SCK1-0 (Serial Clock)\n", (m_SIOCR1[0] & 0x01) ? 1 : 0); + + m_transfer_mode[0] = (m_SIOCR1[0] & 0x38) >> 3; + switch (m_transfer_mode[0]) + { + case 0x0: + logerror("(Serial set to 8-bit transmit mode)\n"); + m_transmit_bits[0] = 8; + m_receive_bits[0] = 0; + break; + + case 0x2: + logerror("(Serial set to 4-bit transmit mode)\n"); + m_transmit_bits[0] = 4; + m_receive_bits[0] = 0; + break; + + case 0x4: + logerror("(Serial set to 8-bit transmit/receive mode)\n"); + m_transmit_bits[0] = 8; + m_receive_bits[0] = 8; + break; + + case 0x5: logerror("(Serial set to 8-bit receive mode)\n"); + m_transmit_bits[0] = 0; + m_receive_bits[0] = 8; + break; + + case 0x6: + logerror("(Serial set to 4-bit receive mode)\n"); + m_transmit_bits[0] = 0; + m_receive_bits[0] = 4; + break; + + default: + logerror("(Serial set to invalid mode)\n"); + m_transmit_bits[0] = 0; + m_receive_bits[0] = 0; + break; + } + + if ((m_SIOCR1[0] & 0xc0) == 0x80) + { + // start transfer + m_transfer_shiftpos[0] = 0; + m_transfer_shiftreg[0] = 0; + m_transfer_pos[0] = 0; + + m_serial_transmit_timer[0]->adjust(attotime::zero); + } +} + + +WRITE8_MEMBER(tlcs870_device::sio1cr2_w) +{ + m_SIOCR2[0] = data; + + logerror("%s m_SIOCR2[0] (Serial IO Port 1 Control Register 2) bits set to\n", machine().describe_context()); + logerror("%d: (invalid)\n", (m_SIOCR2[0] & 0x80) ? 1 : 0); + logerror("%d: (invalid)\n", (m_SIOCR2[0] & 0x40) ? 1 : 0); + logerror("%d: (invalid)\n", (m_SIOCR2[0] & 0x20) ? 1 : 0); + logerror("%d: WAIT1-1 (Wait Control\n", (m_SIOCR2[0] & 0x10) ? 1 : 0); + logerror("%d: WAIT1-0 (Wait Control)\n", (m_SIOCR2[0] & 0x08) ? 1 : 0); + logerror("%d: BUF1-2 (Number of Transfer Bytes)\n", (m_SIOCR2[0] & 0x04) ? 1 : 0); + logerror("%d: BUF1-1 (Number of Transfer Bytes)\n", (m_SIOCR2[0] & 0x02) ? 1 : 0); + logerror("%d: BUF1-0 (Number of Transfer Bytes)\n", (m_SIOCR2[0] & 0x01) ? 1 : 0); + + m_transfer_numbytes[0] = (m_SIOCR2[0] & 0x7); + logerror("(serial set to transfer %01x bytes)\n", m_transfer_numbytes[0]+1); + +} + +READ8_MEMBER(tlcs870_device::sio1sr_r) +{ + /* TS-- ---- + + T = Transfer in Progress + S = Shift in Progress + + */ + return 0x00; +} + +TIMER_CALLBACK_MEMBER(tlcs870_device::sio0_transmit_cb) +{ + if (m_transmit_bits[0]) // TODO: handle receive cases + { + int finish = 0; + if (m_transfer_shiftpos[0] == 0) + { + m_transfer_shiftreg[0] = m_dbr[m_transfer_pos[0]]; + logerror("transmitting byte %02x\n", m_transfer_shiftreg[0]); + } + + int dataout = m_transfer_shiftreg[0] & 0x01; + + m_serial_out_cb[0](dataout); + + m_transfer_shiftreg[0] >>= 1; + m_transfer_shiftpos[0]++; + + if (m_transfer_shiftpos[0] == 8) + { + logerror("transmitted\n"); + + m_transfer_shiftpos[0] = 0; + m_transfer_pos[0]++; + + if (m_transfer_pos[0] > m_transfer_numbytes[0]) + { + logerror("end of transmission\n"); + m_SIOCR1[0] &= ~0x80; + // set interrupt latch + m_IL |= 1 << (15 - TLCS870_IRQ_INTSIO1); + finish = 1; + } + } + + if (!finish) + m_serial_transmit_timer[0]->adjust(cycles_to_attotime(1000)); // TODO: use real speed + } +} + +// Serial Port 2 +WRITE8_MEMBER(tlcs870_device::sio2cr1_w) +{ + m_SIOCR1[1] = data; + + logerror("%s m_SIOCR1[1] (Serial IO Port 2 Control Register 1) bits set to\n", machine().describe_context()); + logerror("%d: SIOS2 (Start/Stop transfer)\n", (m_SIOCR1[1] & 0x80) ? 1 : 0); + logerror("%d: SIOINH2 (Abort/Continue transfer)\n", (m_SIOCR1[1] & 0x40) ? 1 : 0); + logerror("%d: SIOM2-2 (Serial Mode)\n", (m_SIOCR1[1] & 0x20) ? 1 : 0); + logerror("%d: SIOM2-1 (Serial Mode)\n", (m_SIOCR1[1] & 0x10) ? 1 : 0); + logerror("%d: SIOM2-0 (Serial Mode)\n", (m_SIOCR1[1] & 0x08) ? 1 : 0); + logerror("%d: SCK2-2 (Serial Clock)\n", (m_SIOCR1[1] & 0x04) ? 1 : 0); + logerror("%d: SCK2-1 (Serial Clock)\n", (m_SIOCR1[1] & 0x02) ? 1 : 0); + logerror("%d: SCK2-0 (Serial Clock)\n", (m_SIOCR1[1] & 0x01) ? 1 : 0); +} + +WRITE8_MEMBER(tlcs870_device::sio2cr2_w) +{ + m_SIOCR2[1] = data; + + logerror("%s m_SIOCR2[1] (Serial IO Port 2 Control Register 2) bits set to\n", machine().describe_context()); + logerror("%d: (invalid)\n", (m_SIOCR2[1] & 0x80) ? 1 : 0); + logerror("%d: (invalid)\n", (m_SIOCR2[1] & 0x40) ? 1 : 0); + logerror("%d: (invalid)\n", (m_SIOCR2[1] & 0x20) ? 1 : 0); + logerror("%d: WAIT2-1 (Wait Control\n", (m_SIOCR2[1] & 0x10) ? 1 : 0); + logerror("%d: WAIT2-0 (Wait Control)\n", (m_SIOCR2[1] & 0x08) ? 1 : 0); + logerror("%d: BUF2-2 (Number of Transfer Bytes)\n", (m_SIOCR2[1] & 0x04) ? 1 : 0); + logerror("%d: BUF2-1 (Number of Transfer Bytes)\n", (m_SIOCR2[1] & 0x02) ? 1 : 0); + logerror("%d: BUF2-0 (Number of Transfer Bytes)\n", (m_SIOCR2[1] & 0x01) ? 1 : 0); +} + +TIMER_CALLBACK_MEMBER(tlcs870_device::sio1_transmit_cb) +{ +} + +READ8_MEMBER(tlcs870_device::sio2sr_r) +{ + /* TS-- ---- + + T = Transfer in Progress + S = Shift in Progress + + */ + return 0x00; +} + +// WDT emulation (Watchdog Timer) + +WRITE8_MEMBER(tlcs870_device::wdtcr1_w) +{ + m_WDTCR1 = data; + + logerror("%s m_WDTCR1 (Watchdog Timer Control 1) bits set to\n", machine().describe_context()); + logerror("%d: (invalid)\n", (m_WDTCR1 & 0x80) ? 1 : 0); + logerror("%d: (invalid)\n", (m_WDTCR1 & 0x40) ? 1 : 0); + logerror("%d: (invalid)\n", (m_WDTCR1 & 0x20) ? 1 : 0); + logerror("%d: (invalid)\n", (m_WDTCR1 & 0x10) ? 1 : 0); + logerror("%d: WDTEN (Watchdog Timer Enable, also req disable code to WDTCR2)\n", (m_WDTCR1 & 0x08) ? 1 : 0); + logerror("%d: WDTT-1 (Watchdog Timer Detection Time)\n", (m_WDTCR1 & 0x04) ? 1 : 0); + logerror("%d: WDTT-0 (Watchdog Timer Detection Time)\n", (m_WDTCR1 & 0x02) ? 1 : 0); + logerror("%d: WDTOUT (Watchdog Timer Output select, 0 = interrupt, 1 = reset out)\n",(m_WDTCR1 & 0x01) ? 1 : 0); + + // WDTOUT cannot be set to 1 by software +} + +WRITE8_MEMBER(tlcs870_device::wdtcr2_w) +{ + if (data == 0x4e) + { + // clear watchdog counter + } + else if (data == 0xb1) + { + // disable code + if (!(m_WDTCR1 & 0x08)) + { + logerror("%s wdtcr2_w - Watchdog disabled\n", machine().describe_context()); + } + } +} + +// Misc + +// not used by hng64 +WRITE8_MEMBER(tlcs870_device::syscr1_w) +{ + m_SYSCR1 = data; + + logerror("%s m_SYSCR1 (System Control Register 1) bits set to\n", machine().describe_context()); + logerror("%d: STOP (STOP mode start)\n", (m_SYSCR1 & 0x80) ? 1 : 0); + logerror("%d: RELM (release method for STOP, 0 edge, 1 level)\n", (m_SYSCR1 & 0x40) ? 1 : 0); + logerror("%d: RETM (return mode after STOP, 0 normal, 1 slow)\n", (m_SYSCR1 & 0x20) ? 1 : 0); + logerror("%d: OUTEN (port output control during STOP)\n", (m_SYSCR1 & 0x10) ? 1 : 0); + logerror("%d: WUT-1 (warm up time at STOP release)\n", (m_SYSCR1 & 0x08) ? 1 : 0); + logerror("%d: WUT-0 (warm up time at STOP release)\n", (m_SYSCR1 & 0x04) ? 1 : 0); + logerror("%d: (invalid)\n", (m_SYSCR1 & 0x02) ? 1 : 0); + logerror("%d: (invalid)\n", (m_SYSCR1 & 0x01) ? 1 : 0); +} + +WRITE8_MEMBER(tlcs870_device::syscr2_w) +{ + m_SYSCR2 = data; + + logerror("%s m_SYSCR2 (System Control Register 2) bits set to\n", machine().describe_context()); + logerror("%d: XEN (High Frequency Oscillator control)\n", (m_SYSCR2 & 0x80) ? 1 : 0); + logerror("%d: XTEN (Low Frequency Oscillator control)\n", (m_SYSCR2 & 0x40) ? 1 : 0); + logerror("%d: SYSCK (system clock select 0 high, 1 low)\n", (m_SYSCR2 & 0x20) ? 1 : 0); + logerror("%d: IDLE (IDLE mode start)\n", (m_SYSCR2 & 0x10) ? 1 : 0); // hng64 sets this in case of ram test failures + logerror("%d: (invalid)\n", (m_SYSCR2 & 0x08) ? 1 : 0); + logerror("%d: (invalid)\n", (m_SYSCR2 & 0x04) ? 1 : 0); + logerror("%d: (invalid)\n", (m_SYSCR2 & 0x02) ? 1 : 0); + logerror("%d: (invalid)\n", (m_SYSCR2 & 0x01) ? 1 : 0); +} + +READ8_MEMBER(tlcs870_device::syscr1_r) +{ + return m_SYSCR1; // low 2 bits are 'undefined' +} + +READ8_MEMBER(tlcs870_device::syscr2_r) +{ + return m_SYSCR2 | 0x0f; // low bits always read as 1 +} + +// RBS / PSW direct access + +WRITE8_MEMBER(tlcs870_device::rbs_w) +{ + // upper bits of PSW (status flags) cannot be written, only the register bank + m_RBS = data & 0x0f; +} + +READ8_MEMBER(tlcs870_device::psw_r) +{ + // outside of checking the results of opcodes that use it directly (DAA / DAS) this is the only way to read / check the 'half' flag + return get_PSW(); +} + +// ADC emulation + +READ8_MEMBER(tlcs870_device::adcdr_r) +{ + return m_ADCDR; +} + +/* + + ADCCR register bits + + es-apppp + + e = end flag (1 = done, data available in ADCDR, 0 = not requested / not finished) (r/o) + s = start flag (1 = request data be processed and put in ADCDR) + + a = analog input enable (won't function at all with this disabled?) + + p = analog port to use (upper bit is 'reserved', so 8 ports) + + current emulation assumes this is instant + + bits in P6CR (0x0c) should also be set to '1' to enable analog input on the port as the + same pins are otherwise used as a normal input port, not this multiplexed ADC + + */ + +READ8_MEMBER(tlcs870_device::adccr_r) +{ + return m_ADCCR | 0x80; // return with 'finished' bit set +} + +WRITE8_MEMBER(tlcs870_device::adccr_w) +{ + m_ADCCR = data; + + if (data & 0x40) + { + m_ADCDR = m_port_analog_in_cb[data&0x07](); + } +} + + +READ8_MEMBER(tlcs870_device::eintcr_r) +{ + return 0x00; +} + +WRITE8_MEMBER(tlcs870_device::eintcr_w) +{ + m_EINTCR = data; + + logerror("%s m_EINTCR (External Interrupt Control) bits set to\n", machine().describe_context()); + logerror("%d: INT1NC (Interrupt noise reject)\n", (m_EINTCR & 0x80) ? 1 : 0); + logerror("%d: INT0EN (Interrupt 0 enable)\n", (m_EINTCR & 0x40) ? 1 : 0); + logerror("%d: (invalid)\n", (m_EINTCR & 0x20) ? 1 : 0); + logerror("%d: INT4ES (edge select)\n", (m_EINTCR & 0x10) ? 1 : 0); + logerror("%d: INT3ES (edge select)\n", (m_EINTCR & 0x08) ? 1 : 0); + logerror("%d: INT2ES (edge select)\n", (m_EINTCR & 0x04) ? 1 : 0); + logerror("%d: INT1ES (edge select)\n", (m_EINTCR & 0x02) ? 1 : 0); + logerror("%d: (invalid)\n", (m_EINTCR & 0x01) ? 1 : 0); + + /* For edge select register 0 = rising edge, 1 = falling edge + + For INT0EN if 1 then Port 1 bit 0 is used for IRQ0, otherwise it is used for a port bit + if it is used as an IRQ pin then it should also be configured as an input in P1CR + */ +} + +READ8_MEMBER(tlcs870_device::eir_l_r) +{ + return m_EIR & 0xff; +} + +READ8_MEMBER(tlcs870_device::eir_h_r) +{ + return (m_EIR >> 8) & 0xff; +} + +WRITE8_MEMBER(tlcs870_device::eir_l_w) +{ + m_EIR = (m_EIR & 0xff00) | data; + + logerror("%s m_EIR(LSB) (Interrupt Enable) bits set to\n", machine().describe_context()); + logerror("%d: EF7 (External Interrupt 2)\n", (m_EIR & 0x0080) ? 1 : 0); + logerror("%d: EF6 (Time Base Timer Interrupt)\n", (m_EIR & 0x0040) ? 1 : 0); + logerror("%d: EF5 (External Interrupt 1)\n", (m_EIR & 0x0020) ? 1 : 0); + logerror("%d: EF4 (16-bit TC1 Interrupt)\n", (m_EIR & 0x0010) ? 1 : 0); + logerror("%d: (invalid)\n", (m_EIR & 0x0008) ? 1 : 0); // can't be External Int 0 (bit in different register is used) + logerror("%d: (invalid)\n", (m_EIR & 0x0004) ? 1 : 0); // can't be Watchdog interrupt (non-maskable) + logerror("%d: (invalid)\n", (m_EIR & 0x0002) ? 1 : 0); // can't be Software interrupt (non-maskable) + logerror("%d: IMF\n", (m_EIR & 0x0001) ? 1 : 0); // can't be Reset interrupt (non-maskable) +} + +WRITE8_MEMBER(tlcs870_device::eir_h_w) +{ + m_EIR = (m_EIR & 0x00ff) | (data << 8); + + logerror("%s m_EIR(MSB) (Interrupt Enable) bits set to\n", machine().describe_context()); + logerror("%d: EF15 (External Interrupt 5)\n", (m_EIR & 0x8000) ? 1 : 0); + logerror("%d: EF14 (16-bit TC2 Interrupt)\n", (m_EIR & 0x4000) ? 1 : 0); + logerror("%d: EF13 (Serial Interface 2 Interrupt)\n", (m_EIR & 0x2000) ? 1 : 0); + logerror("%d: EF12 (External Interrupt 4)\n", (m_EIR & 0x1000) ? 1 : 0); + logerror("%d: EF11 (External Interrupt 3)\n", (m_EIR & 0x0800) ? 1 : 0); + logerror("%d: EF10 (8-bit TC4 Interrupt)\n", (m_EIR & 0x0400) ? 1 : 0); + logerror("%d: EF9 (Serial Interface 1 Interrupt)\n", (m_EIR & 0x0200) ? 1 : 0); + logerror("%d: EF8 (8-bit TC3 Interrupt)\n", (m_EIR & 0x0100) ? 1 : 0); +} + +/* + the READ/WRITE/MODIFY operations cannot be used to clear interrupt latches + + also you can't set a latch by writing '1' to it, only clear a latch + by writing 0 to it + +*/ +READ8_MEMBER(tlcs870_device::il_l_r) +{ + return m_IL & 0xff; +} + +READ8_MEMBER(tlcs870_device::il_h_r) +{ + return (m_IL >> 8) & 0xff; +} + +WRITE8_MEMBER(tlcs870_device::il_l_w) +{ + // probably not this logic + m_IL = (m_IL & 0xff00) | data; +} + +WRITE8_MEMBER(tlcs870_device::il_h_w) +{ + // probably not this logic + m_IL = (m_EIR & 0x00ff) | (data << 8); +} + void tlcs870_device::execute_set_input(int inputnum, int state) { -#if 0 - switch (inputnum) { - case INPUT_LINE_NMI: - set_irq_line(INTNMI, state); + int32_t irqline = -1; + + switch (inputnum) + { + case INPUT_LINE_IRQ5: + irqline = 15; break; - case INPUT_LINE_IRQ0: - set_irq_line(INT0, state); + + case INPUT_LINE_IRQ4: + irqline = 12; break; - case INPUT_LINE_IRQ1: - set_irq_line(INT1, state); + + case INPUT_LINE_IRQ3: + irqline = 11; break; + case INPUT_LINE_IRQ2: - set_irq_line(INT2, state); + irqline = 7; + break; + + case INPUT_LINE_IRQ1: + irqline = 5; + break; + + case INPUT_LINE_IRQ0: + irqline = 3; break; } -#endif + + if (irqline != -1) + { + set_irq_line(irqline, state); + } } -void tlcs870_device::execute_run() +void tlcs870_device::set_irq_line(int irqline, int state) { - + //logerror("set_irq_line %d %d\n", irqline, state); + if (!(m_irqstate & (1 << irqline))) + { + // rising edge + if (state) + { + m_irqstate |= 1<<irqline; + + // TODO: add checks to see if interrupt pin(s) are configured, and if they're in rising edge mode + m_IL |= 1<<irqline; + } + } + else + { + if (!state) + { + m_irqstate &= ~(1<<irqline); + } + } +} + +void tlcs870_device::check_interrupts() +{ + // priority 0-2 are non-maskable, and should have already been processed before we get here + for (int priority = 0; priority <= 15; priority++) + { + if (priority >= 3) // only priorities 0,1,2 are non-maskable + { + if (!(m_EIR & 1)) + { + // maskable interrupts are disabled, bail + continue; + } + + int is_latched = m_IL & (1<<priority); + + if (is_latched) + { + take_interrupt(priority); + return; + } + } + else + { + // TODO: handle non-maskable here + } + } +} + +void tlcs870_device::take_interrupt(int priority) +{ + m_IL &= ~(1<<priority); + m_EIR &= ~1; + logerror("taken interrupt %d\n", priority); + + uint16_t vector = RM16(0xffe0 + ((15-priority)*2)); + + WM8(m_sp.d, get_PSW()); + WM16(m_sp.d - 2, m_addr); + m_sp.d -= 3; + + m_pc.d = vector; + logerror("setting PC to %04x\n", m_pc.d); + +} + +void tlcs870_device::execute_run() +{ while (m_icount > 0) { + check_interrupts(); + m_prvpc.d = m_pc.d; debugger_instruction_hook(m_pc.d); - //check_interrupts(); m_addr = m_pc.d; m_tmppc = m_addr; // used for jumps etc. m_cycles = 0; @@ -311,7 +1013,8 @@ void tlcs870_device::execute_run() if (m_cycles) { - m_icount -= m_cycles * 4; // 1 machine cycle = 4 clock cycles? + //m_icount -= m_cycles * 4; // 1 machine cycle = 4 clock cycles? (unclear, execution seems far too slow even for the ram test this way) + m_icount -= m_cycles; } else { @@ -323,7 +1026,51 @@ void tlcs870_device::execute_run() void tlcs870_device::device_reset() { m_pc.d = RM16(0xfffe); - m_RBS = 0; + + m_RBS = 0x00; + m_EIR = 0x0000; + m_IL = 0x0000; + m_EINTCR = 0x00; + m_ADCCR = 0x00; + m_ADCDR = 0x00; + m_SYSCR1 = 0x00; + m_SYSCR2 = 0x80; // | 0x40, can order parts with low frequency oscillator enabled by default too (although default state is always to use high one?) + m_TBTCR = 0x00; + + m_TREG1A = 0x1234; // not initialized? + m_TREG1B = 0x4321; // not initialized? + m_TC1CR = 0x00; + + m_TREG2 = 0x2301; // not initialized? + m_TC2CR = 0x00; + + m_TREG3A = 0x10; // not initialized? + m_TREG3B = 0x32; // not initialized? + m_TC3CR = 0x00; + + m_TREG4 = 0x30; // not initialized? + m_TC3CR = 0x00; + + m_SIOCR1[0] = 0x00; + m_SIOCR1[1] = 0x00; + + m_SIOCR2[0] = 0x00; + m_SIOCR2[1] = 0x00; + + m_WDTCR1 = 0x09; + + m_irqstate = 0; + m_transfer_numbytes[0] = 0; + m_transfer_numbytes[1] = 0; + m_transfer_mode[0] = 0; + m_transfer_mode[1] = 0; + m_transfer_pos[0] = 0; + m_transfer_pos[1] = 0; + m_transfer_shiftreg[0] = 0; + m_transfer_shiftreg[1] = 0; + m_transfer_shiftpos[0] = 0; + m_transfer_shiftpos[1] = 0; + m_port_out_latch[0] = 0x00; m_port_out_latch[1] = 0x00; @@ -391,6 +1138,10 @@ void tlcs870_device::state_import(const device_state_entry &entry) case DEBUGGER_REG_HL: set_reg16(REG_HL, m_debugger_temp); break; + + case DEBUGGER_REG_RB: + m_RBS = m_debugger_temp; + break; } } @@ -447,6 +1198,10 @@ void tlcs870_device::state_export(const device_state_entry &entry) m_debugger_temp = get_reg16(REG_HL); break; + case DEBUGGER_REG_RB: + m_debugger_temp = m_RBS; + break; + } } @@ -474,6 +1229,7 @@ void tlcs870_device::device_start() state_add(DEBUGGER_REG_DE, "DE", m_debugger_temp).callimport().callexport().formatstr("%04X"); state_add(DEBUGGER_REG_HL, "HL", m_debugger_temp).callimport().callexport().formatstr("%04X"); + state_add(DEBUGGER_REG_RB, "RB", m_debugger_temp).callimport().callexport().formatstr("%01X"); state_add(STATE_GENPC, "GENPC", m_pc.w.l).formatstr("%04X"); state_add(STATE_GENPCBASE, "CURPC", m_prvpc.w.l).formatstr("%04X").noshow(); @@ -486,9 +1242,22 @@ void tlcs870_device::device_start() cb.resolve_safe(0xff); for (auto &cb : m_port_out_cb) cb.resolve_safe(); + for (auto &cb : m_port_analog_in_cb) + cb.resolve_safe(0xff); + for (auto &cb : m_serial_out_cb) + cb.resolve_safe(); + + m_serial_transmit_timer[0] = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(tlcs870_device::sio0_transmit_cb), this)); + m_serial_transmit_timer[1] = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(tlcs870_device::sio1_transmit_cb), this)); + + m_tcx_timer[0] = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(tlcs870_device::tc1_cb), this)); + m_tcx_timer[1] = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(tlcs870_device::tc2_cb), this)); + m_tcx_timer[2] = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(tlcs870_device::tc3_cb), this)); + m_tcx_timer[3] = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(tlcs870_device::tc4_cb), this)); } + void tlcs870_device::state_string_export(const device_state_entry &entry, std::string &str) const { int F = m_F; diff --git a/src/devices/cpu/tlcs870/tlcs870.h b/src/devices/cpu/tlcs870/tlcs870.h index 7b8c8c256be..7d23d08c71e 100644 --- a/src/devices/cpu/tlcs870/tlcs870.h +++ b/src/devices/cpu/tlcs870/tlcs870.h @@ -8,6 +8,7 @@ class tlcs870_device : public cpu_device { public: + auto p0_in_cb() { return m_port_in_cb[0].bind(); } auto p1_in_cb() { return m_port_in_cb[1].bind(); } auto p2_in_cb() { return m_port_in_cb[2].bind(); } @@ -26,6 +27,19 @@ public: auto p6_out_cb() { return m_port_out_cb[6].bind(); } auto p7_out_cb() { return m_port_out_cb[7].bind(); } + auto an0_in_cb() { return m_port_analog_in_cb[0].bind(); } + auto an1_in_cb() { return m_port_analog_in_cb[1].bind(); } + auto an2_in_cb() { return m_port_analog_in_cb[2].bind(); } + auto an3_in_cb() { return m_port_analog_in_cb[3].bind(); } + auto an4_in_cb() { return m_port_analog_in_cb[4].bind(); } + auto an5_in_cb() { return m_port_analog_in_cb[5].bind(); } + auto an6_in_cb() { return m_port_analog_in_cb[6].bind(); } + auto an7_in_cb() { return m_port_analog_in_cb[7].bind(); } + + auto serial0_out_cb() { return m_serial_out_cb[0].bind(); } + auto serial1_out_cb() { return m_serial_out_cb[1].bind(); } + + protected: // construction/destruction tlcs870_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, address_map_constructor program_map); @@ -57,6 +71,26 @@ protected: uint32_t m_debugger_temp; + enum _tlcs870interrupts + { + TLCS870_IRQ_INT5, // FFE0 INT5 (External Interrupt 5) - priority 15 (lowest) + TLCS870_IRQ_INTTC2, // FFE2 INTTC2 (16-bit TC2 Interrupt) + TLCS870_IRQ_INTSIO2, // FFE4 INTSIO2 (Serial Interface 2 Interrupt) + TLCS870_IRQ_INT4, // FFE6 INT4 (External Interrupt 4) + TLCS870_IRQ_INT3, // FFE8 INT3 (External Interrupt 3) + TLCS870_IRQ_INTTC4, // FFEA INTTC4 (8-bit TC4 Interrupt) + TLCS870_IRQ_INTSIO1, // FFEC INTSIO1 (Serial Interface 1 Interrupt) + TLCS870_IRQ_INTTC3, // FFEE INTTC3 (8-bit TC3 Interrupt) + TLCS870_IRQ_INT2, // FFF0 INT2 (External Interrupt 2) + TLCS870_IRQ_INTTBT, // FFF2 INTTBT (Time Base Timer Interrupt) + TLCS870_IRQ_INT1, // FFF4 INT1 (External Interrupt 1) + TLCS870_IRQ_INTTC1, // FFF6 INTTC1 (16-bit TC1 Interrupt) + TLCS870_IRQ_INT0, // FFF8 INT0 (External Interrupt 0) + TLCS870_IRQ_INTWDT, // FFFA INTWDT (Watchdog Timer Interrupt) + TLCS870_IRQ_INTSW, // FFFC INTSW (Software Interrupt) + TLCS870_IRQ_RESET, // FFFE RESET (Reset Interrupt) - priority 0 (highest) + }; + private: enum _regs8 @@ -92,7 +126,8 @@ private: DEBUGGER_REG_WA, DEBUGGER_REG_BC, DEBUGGER_REG_DE, - DEBUGGER_REG_HL + DEBUGGER_REG_HL, + DEBUGGER_REG_RB }; enum _conditions @@ -122,6 +157,7 @@ private: address_space_config m_program_config; address_space_config m_io_config; required_shared_ptr<uint8_t> m_intram; + required_shared_ptr<uint8_t> m_dbr; PAIR m_prvpc, m_pc, m_sp; @@ -131,10 +167,14 @@ private: devcb_read8 m_port_in_cb[8]; devcb_write8 m_port_out_cb[8]; + devcb_read8 m_port_analog_in_cb[8]; + devcb_write_line m_serial_out_cb[2]; + + uint8_t m_port_out_latch[8]; int m_read_input_port; uint8_t m_port0_cr, m_port1_cr, m_port6_cr, m_port7_cr; - + DECLARE_READ8_MEMBER(port0_r); DECLARE_READ8_MEMBER(port1_r); DECLARE_READ8_MEMBER(port2_r); @@ -158,6 +198,65 @@ private: DECLARE_WRITE8_MEMBER(p6cr_w); DECLARE_WRITE8_MEMBER(p7cr_w); + DECLARE_READ8_MEMBER(eir_l_r); + DECLARE_READ8_MEMBER(eir_h_r); + DECLARE_READ8_MEMBER(il_l_r); + DECLARE_READ8_MEMBER(il_h_r); + + DECLARE_WRITE8_MEMBER(eir_l_w); + DECLARE_WRITE8_MEMBER(eir_h_w); + DECLARE_WRITE8_MEMBER(il_l_w); + DECLARE_WRITE8_MEMBER(il_h_w); + + DECLARE_READ8_MEMBER(eintcr_r); + + DECLARE_WRITE8_MEMBER(eintcr_w); + + DECLARE_WRITE8_MEMBER(treg1a_l_w); + DECLARE_WRITE8_MEMBER(treg1a_h_w); + DECLARE_WRITE8_MEMBER(treg1b_l_w); + DECLARE_WRITE8_MEMBER(treg1b_h_w); + DECLARE_WRITE8_MEMBER(tc1cr_w); + DECLARE_WRITE8_MEMBER(tc2cr_w); + DECLARE_WRITE8_MEMBER(treg2_l_w); + DECLARE_WRITE8_MEMBER(treg2_h_w); + DECLARE_WRITE8_MEMBER(treg3a_w); + DECLARE_WRITE8_MEMBER(tc3cr_w); + DECLARE_WRITE8_MEMBER(tc4cr_w); + + DECLARE_READ8_MEMBER(treg1b_l_r); + DECLARE_READ8_MEMBER(treg1b_h_r); + DECLARE_READ8_MEMBER(treg3a_r); + DECLARE_READ8_MEMBER(treg3b_r); + DECLARE_WRITE8_MEMBER(treg4_w); + + + DECLARE_WRITE8_MEMBER(sio1cr1_w); + DECLARE_WRITE8_MEMBER(sio1cr2_w); + DECLARE_WRITE8_MEMBER(sio2cr1_w); + DECLARE_WRITE8_MEMBER(sio2cr2_w); + DECLARE_READ8_MEMBER(sio2sr_r); + DECLARE_READ8_MEMBER(sio1sr_r); + + DECLARE_WRITE8_MEMBER(wdtcr1_w); + DECLARE_WRITE8_MEMBER(wdtcr2_w); + + DECLARE_WRITE8_MEMBER(tbtcr_w); + + DECLARE_READ8_MEMBER(tbtcr_r); + + DECLARE_WRITE8_MEMBER(syscr1_w); + DECLARE_WRITE8_MEMBER(syscr2_w); + DECLARE_READ8_MEMBER(syscr1_r); + DECLARE_READ8_MEMBER(syscr2_r); + DECLARE_WRITE8_MEMBER(rbs_w); + DECLARE_READ8_MEMBER(psw_r); + + DECLARE_READ8_MEMBER(adccr_r); + DECLARE_READ8_MEMBER(adcdr_r); + + DECLARE_WRITE8_MEMBER(adccr_w); + // Work registers uint8_t m_cycles; uint16_t m_tmppc; @@ -168,6 +267,58 @@ private: /* CPU registers */ uint8_t m_RBS; // register base (4-bits) + uint16_t m_IL; // 3D / 3C + uint16_t m_EIR; // 3B / 3A + uint8_t m_EINTCR; + uint8_t m_ADCCR; + uint8_t m_ADCDR; + uint8_t m_SYSCR1; + uint8_t m_SYSCR2; + uint8_t m_TBTCR; + uint16_t m_TREG1A; + uint16_t m_TREG1B; + uint8_t m_TC1CR; + uint16_t m_TREG2; + uint8_t m_TC2CR; + uint8_t m_TREG3A; + uint8_t m_TREG3B; + uint8_t m_TC3CR; + uint8_t m_TREG4; + uint8_t m_TC4CR; + uint8_t m_SIOCR1[2]; + uint8_t m_SIOCR2[2]; + uint8_t m_WDTCR1; + + uint16_t m_irqstate; + + // serial stuff + TIMER_CALLBACK_MEMBER(sio0_transmit_cb); + TIMER_CALLBACK_MEMBER(sio1_transmit_cb); + uint8_t m_transfer_numbytes[2]; + uint8_t m_transfer_pos[2]; + uint8_t m_transfer_shiftreg[2]; + uint8_t m_transfer_shiftpos[2]; + uint8_t m_transfer_mode[2]; + int m_transmit_bits[2]; + int m_receive_bits[2]; + + emu_timer *m_serial_transmit_timer[2]; + + TIMER_CALLBACK_MEMBER(tc1_cb); + TIMER_CALLBACK_MEMBER(tc2_cb); + TIMER_CALLBACK_MEMBER(tc3_cb); + TIMER_CALLBACK_MEMBER(tc4_cb); + + void tc2_reload(); + void tc2_cancel(); + + emu_timer *m_tcx_timer[4]; + + + void set_irq_line(int irqline, int state); + void check_interrupts(); + void take_interrupt(int priority); + uint8_t RM8(const uint32_t a) { return m_program->read_byte(a); } uint16_t RM16(const uint32_t a) { return RM8(a) | (RM8((a + 1) & 0xffff) << 8); } @@ -308,8 +459,6 @@ private: void do_CALL_insrc(const uint8_t opbyte0, const uint8_t opbyte1, const uint16_t srcaddr); void do_JP_insrc(const uint8_t opbyte0, const uint8_t opbyte1, const uint16_t srcaddr); - uint16_t do_alu(int op, uint16_t param1, uint16_t param2); - // tlcs870_ops_dst.cpp void do_dstprefixtype_opcode(const uint8_t opbyte0); @@ -362,17 +511,32 @@ private: void do_CALL_gg(const uint8_t opbyte0, const uint8_t opbyte1); void do_JP_gg(const uint8_t opbyte0, const uint8_t opbyte1); + + // ALU related + uint16_t do_or(uint16_t param1, uint16_t param2); + uint16_t do_xor(uint16_t param1, uint16_t param2); + uint16_t do_and(uint16_t param1, uint16_t param2); + + uint8_t do_add_8bit(uint16_t param1, uint16_t param2); + uint8_t do_sub_8bit(uint16_t param1, uint16_t param2); + void do_cmp_8bit(uint16_t param1, uint16_t param2); + uint8_t do_alu_8bit(int op, uint16_t param1, uint16_t param2); + + uint16_t do_add_16bit(uint32_t param1, uint32_t param2); + uint16_t do_sub_16bit(uint32_t param1, uint32_t param2); + void do_cmp_16bit(uint32_t param1, uint32_t param2); + uint16_t do_alu_16bit(int op, uint32_t param1, uint32_t param2); + + // Generic opcode helpers void handle_div(const int reg); void handle_mul(const int reg); void handle_swap(const int reg); - uint8_t handle_SHLC(uint8_t val); uint8_t handle_SHRC(uint8_t val); uint8_t handle_DAS(uint8_t val); uint8_t handle_DAA(uint8_t val); uint8_t handle_ROLC(uint8_t val); uint8_t handle_RORC(uint8_t val); - void handle_take_interrupt(int level); const bool check_jump_condition(int param1); diff --git a/src/devices/cpu/tlcs870/tlcs870_ops.cpp b/src/devices/cpu/tlcs870/tlcs870_ops.cpp index 034d967bca6..3a14f319ae2 100644 --- a/src/devices/cpu/tlcs870/tlcs870_ops.cpp +++ b/src/devices/cpu/tlcs870/tlcs870_ops.cpp @@ -208,7 +208,10 @@ void tlcs870_device::do_RETI(const uint8_t opbyte0) m_sp.d += 3; m_addr = RM16(m_sp.d - 2); - set_PSW(RM8(m_sp.d - 1)); + set_PSW(RM8(m_sp.d)); + + // Interrupts always get reenabled after a RETI. The RETN behavior is different + m_EIR |= 1; } void tlcs870_device::do_RET(const uint8_t opbyte0) @@ -231,8 +234,8 @@ void tlcs870_device::do_POP_PSW(const uint8_t opbyte0) */ m_cycles = 3; - m_sp.d += 2; - const uint16_t val = RM16(m_sp.d - 1); + m_sp.d += 1; + const uint8_t val = RM8(m_sp.d); set_PSW(val); } @@ -244,9 +247,9 @@ void tlcs870_device::do_PUSH_PSW(const uint8_t opbyte0) */ m_cycles = 2; - const uint16_t val = get_PSW(); - WM16(m_sp.d - 1, val); - m_sp.d -= 2; + const uint8_t val = get_PSW(); + WM8(m_sp.d, val); + m_sp.d -= 1; } void tlcs870_device::do_DAA_A(const uint8_t opbyte0) @@ -407,7 +410,7 @@ void tlcs870_device::do_DEC_rr(const uint8_t opbyte0) } else { - set_ZF(); + clear_ZF(); } } @@ -616,7 +619,7 @@ void tlcs870_device::do_DEC_inx(const uint8_t opbyte0) } else { - set_ZF(); + clear_ZF(); } } @@ -650,7 +653,7 @@ void tlcs870_device::do_DEC_inHL(const uint8_t opbyte0) } else { - set_ZF(); + clear_ZF(); } } @@ -778,6 +781,7 @@ void tlcs870_device::do_SET_inxbit(const uint8_t opbyte0) const uint8_t srcaddr = READ8(); + m_read_input_port = 0; // reads output latch, not actual ports if accessing memory mapped ports uint8_t val = RM8(srcaddr); const uint8_t bitpos = opbyte0 & 0x7; @@ -811,6 +815,7 @@ void tlcs870_device::do_CLR_inxbit(const uint8_t opbyte0) const uint8_t srcaddr = READ8(); + m_read_input_port = 0; // not sure, might read uint8_t val = RM8(srcaddr); const uint8_t bitpos = opbyte0 & 0x7; @@ -921,7 +926,7 @@ void tlcs870_device::do_DEC_r(const uint8_t opbyte0) } else { - set_ZF(); + clear_ZF(); } } @@ -944,8 +949,10 @@ void tlcs870_device::do_JRS_T_a(const uint8_t opbyte0) { m_cycles += 2; m_addr = m_tmppc + 2 + val; - set_JF(); } + + // always gets set? + set_JF(); } void tlcs870_device::do_JRS_F_a(const uint8_t opbyte0) @@ -967,8 +974,10 @@ void tlcs870_device::do_JRS_F_a(const uint8_t opbyte0) { m_cycles += 2; m_addr = m_tmppc + 2 + val; - set_JF(); } + + // manual isn't clear in description, but probably always set? + set_JF(); } void tlcs870_device::do_CALLV_n(const uint8_t opbyte0) @@ -1015,8 +1024,10 @@ void tlcs870_device::do_JR_cc_a(const uint8_t opbyte0) { m_cycles += 2; m_addr = m_tmppc + 2 + val; - set_JF(); } + + // manual isn't clear in description, but probably always set? + set_JF(); } void tlcs870_device::do_LD_CF_inxbit(const uint8_t opbyte0) @@ -1119,12 +1130,13 @@ void tlcs870_device::do_JP_mn(const uint8_t opbyte0) void tlcs870_device::do_ff_opcode(const uint8_t opbyte0) { /* - OP (opbyte0) (immval0) (opbyte1) (immval1) (immval2) JF ZF CF HF cycles + OP (opbyte0) (immval0) (opbyte1) (immval1) (immval2) JF ZF CF HF cycles SWI 1111 1111 - - - - 9 (1 if already in NMI) */ - m_cycles = 9; // TODO: 1 if in NMI (acts as NOP?) + m_cycles = 9; // TODO: 1 if in NMI this acts as a NOP - handle_take_interrupt(0x0e); + // set interrupt latch + m_IL |= 1 << (15 - TLCS870_IRQ_INTSW); } /**********************************************************************************************************************/ @@ -1149,7 +1161,7 @@ void tlcs870_device::do_ALUOP_A_n(const uint8_t opbyte0) const int aluop = (opbyte0 & 0x7); const uint8_t val = READ8(); - const uint8_t result = do_alu(aluop, get_reg8(REG_A), val); + const uint8_t result = do_alu_8bit(aluop, get_reg8(REG_A), val); if (aluop != 0x07) // CMP doesn't write back { @@ -1176,7 +1188,7 @@ void tlcs870_device::do_ALUOP_A_inx(const uint8_t opbyte0) const uint16_t addr = READ8(); const uint8_t val = RM8(addr); - const uint8_t result = do_alu(aluop, get_reg8(REG_A), val); + const uint8_t result = do_alu_8bit(aluop, get_reg8(REG_A), val); if (aluop != 0x07) // CMP doesn't write back { diff --git a/src/devices/cpu/tlcs870/tlcs870_ops_helper.cpp b/src/devices/cpu/tlcs870/tlcs870_ops_helper.cpp index e2a11b57661..c2fb2fb90cb 100644 --- a/src/devices/cpu/tlcs870/tlcs870_ops_helper.cpp +++ b/src/devices/cpu/tlcs870/tlcs870_ops_helper.cpp @@ -47,7 +47,7 @@ void tlcs870_device::set_PSW(uint8_t data) { // used by the push/pop opcodes, flags can't be written by memory access m_F = data & 0xf0; - m_RBS = data & 0xf0; + m_RBS = data & 0x0f; } void tlcs870_device::handle_div(const int reg) @@ -216,60 +216,404 @@ const bool tlcs870_device::check_jump_condition(int param1) return takejump; } +/* + All 16-bit ALU ops that would set the 'H' flag list the behavior as undefined. + Logically the half flag would be the 8/9 bit carry (usual C flag) in a 16-bit + op, but since this isn't listed as being the case there's a chance the behavior + is something unexpected, such as still using the 3/4 carry, or, if it's + internally handled as 4 4-bit operations, maybe the 12/13 bit carry + + This needs testing on hardware. + + (8-bit) JF ZF CF HF + ADDC C Z C H + ADD C Z C H + SUBB C Z C H + SUB C Z C H + AND Z Z - - + XOR Z Z - - + OR Z Z - - + CMP Z Z C H + + (16-bit) + ADDC C Z C U + ADD C Z C U + SUBB C Z C U + SUB C Z C U + AND Z Z - - + XOR Z Z - - + OR Z Z - - + CMP Z Z C U + +*/ + +uint8_t tlcs870_device::do_add_8bit(uint16_t param1, uint16_t param2) +{ + uint16_t result = param1 + param2; + + if (result & 0x100) + { + set_CF(); + } + else + { + clear_CF(); + } + + if ((result & 0xff) == 0x00) + { + set_ZF(); + } + else + { + clear_ZF(); + } + + uint8_t temp = (param1 & 0xf) + (param2 & 0xf); + + if (temp & 0x10) + { + set_HF(); + } + else + { + clear_HF(); + } + + // JF is copied from CF + is_ZF() ? set_CF() : clear_CF(); + + return result; +} + +uint16_t tlcs870_device::do_add_16bit(uint32_t param1, uint32_t param2) +{ + uint32_t result = param1 + param2; + + if (result & 0x10000) + { + set_CF(); + } + else + { + clear_CF(); + } + + if ((result & 0xffff) == 0x00) + { + set_ZF(); + } + else + { + clear_ZF(); + } + + // unknown, manual says undefined, see note above + uint16_t temp = (param1 & 0xff) + (param2 & 0xff); + + if (temp & 0x100) + { + set_HF(); + } + else + { + clear_HF(); + } + + // JF is copied from CF + is_ZF() ? set_CF() : clear_CF(); + + return result; +} + +uint8_t tlcs870_device::do_sub_8bit(uint16_t param1, uint16_t param2) +{ + uint16_t result = param1 - param2; + + if (param1 < param2) + { + set_CF(); + } + else + { + clear_CF(); + } + + if ((param1 & 0xf) < (param2 & 0xf)) + { + set_HF(); + } + else + { + clear_HF(); + } + + if ((result & 0xff) == 0x00) + { + set_ZF(); + } + else + { + clear_ZF(); + } + + // JF is copied from CF + is_ZF() ? set_CF() : clear_CF(); + + return result; +} + + +uint16_t tlcs870_device::do_sub_16bit(uint32_t param1, uint32_t param2) +{ + uint32_t result = param1 - param2; + + if (param1 < param2) + { + set_CF(); + } + else + { + clear_CF(); + } + + // unknown, manual says undefined, see note above + if ((param1 & 0xff) < (param2 & 0xff)) + { + set_HF(); + } + else + { + clear_HF(); + } + + if ((result & 0xffff) == 0x0000) + { + set_ZF(); + } + else + { + clear_ZF(); + } + + // JF is copied from CF + is_ZF() ? set_CF() : clear_CF(); + + return result; +} + +void tlcs870_device::do_cmp_8bit(uint16_t param1, uint16_t param2) +{ + if (param1 < param2) + { + set_CF(); + } + else + { + clear_CF(); + } + + if ((param1 & 0xf) < (param2 & 0xf)) // see note above about half flag + { + set_HF(); + } + else + { + clear_HF(); + } + + if (param1 == param2) + { + set_ZF(); + } + else + { + clear_ZF(); + } + + // JF is copied from ZF + is_ZF() ? set_JF() : clear_JF(); +} + +void tlcs870_device::do_cmp_16bit(uint32_t param1, uint32_t param2) +{ + if (param1 < param2) + { + set_CF(); + } + else + { + clear_CF(); + } + + // unknown, manual says undefined, see note above + if ((param1 & 0xff) < (param2 & 0xff)) + { + set_HF(); + } + else + { + clear_HF(); + } + + if (param1 == param2) + { + set_ZF(); + } + else + { + clear_ZF(); + } + + // JF is copied from ZF + is_ZF() ? set_JF() : clear_JF(); +} + + +uint16_t tlcs870_device::do_and(uint16_t param1, uint16_t param2) +{ + uint16_t result = param1 & param2; + + if (result == 0x00) + { + set_ZF(); + } + else + { + clear_ZF(); + } + + // JF is copied from ZF + is_ZF() ? set_JF() : clear_JF(); + + return result; +} + +uint16_t tlcs870_device::do_xor(uint16_t param1, uint16_t param2) +{ + uint16_t result = param1 ^ param2; + + if (result == 0x00) + { + set_ZF(); + } + else + { + clear_ZF(); + } + + // JF is copied from ZF + is_ZF() ? set_JF() : clear_JF(); + + return result; +} + +uint16_t tlcs870_device::do_or(uint16_t param1, uint16_t param2) +{ + uint16_t result = param1 | param2; + + if (result == 0x00) + { + set_ZF(); + } + else + { + clear_ZF(); + } + + // JF is copied from ZF + is_ZF() ? set_JF() : clear_JF(); -uint16_t tlcs870_device::do_alu(int op, uint16_t param1, uint16_t param2) + return result; +} + +uint8_t tlcs870_device::do_alu_8bit(int op, uint16_t param1, uint16_t param2) { uint16_t result = 0x00; - // TODO: flags switch (op) { case 0x0: // ADDC - result = param1 + param2; - result += is_CF(); + param2 += is_CF(); + result = do_add_8bit(param1, param2); break; case 0x1: // ADD - result = param1 + param2; + result = do_add_8bit(param1, param2); break; case 0x2: // SUBB - result = param1 - param2; - result -= is_CF(); + param2 += is_CF(); + result = do_sub_8bit(param1, param2); break; case 0x3: // SUB - result = param1 - param2; + result = do_sub_8bit(param1, param2); break; case 0x4: // AND - result = param1 & param2; + result = do_and(param1, param2); break; case 0x5: // XOR - result = param1 ^ param2; + result = do_xor(param1, param2); break; case 0x6: // OR - result = param1 | param2; + result = do_or(param1, param2); break; case 0x7: // CMP - if (param1 < param2) - { - set_CF(); - } - else - { - clear_CF(); - } + do_cmp_8bit(param1, param2); break; - } return result; } +uint16_t tlcs870_device::do_alu_16bit(int op, uint32_t param1, uint32_t param2) +{ + uint32_t result = 0x0000; + + switch (op) + { + case 0x0: // ADDC + param2 += is_CF(); + result = do_add_16bit(param1, param2); + break; + + case 0x1: // ADD + result = do_add_16bit(param1, param2); + break; + + case 0x2: // SUBB + param2 += is_CF(); + result = do_sub_16bit(param1, param2); + break; + + case 0x3: // SUB + result = do_sub_16bit(param1, param2); + break; + + case 0x4: // AND + result = do_and(param1, param2); + break; + + case 0x5: // XOR + result = do_xor(param1, param2); + break; + + case 0x6: // OR + result = do_or(param1, param2); + break; + + case 0x7: // CMP + do_cmp_16bit(param1, param2); + break; + } + + return result; +} uint8_t tlcs870_device::handle_SHLC(uint8_t val) { @@ -465,36 +809,3 @@ uint8_t tlcs870_device::handle_RORC(uint8_t val) return val; } - -/* - -(Priority Low - 15) -FFE0 INT5 (External Interrupt 5) -FFE2 INTTC2 (16-bit TC2 Interrupt) -FFE4 INTSIO2 (Serial Interface 2 Interrupt) -FFE6 INT4 (External Interrupt 4) -FFE8 INT3 (External Interrupt 3) -FFEA INTTC4 (8-bit TC4 Interrupt) -FFEC INTSIO1 (Serial Interface 1 Interrupt) -FFEE INTTC3 (8-bit TC3 Interrupt) -FFF0 INT2 (External Interrupt 2) -FFF2 INTTBT (Time Base Timer Interrupt) -FFF4 INT1 (External Interrupt 1) -FFF6 INTTC1 (16-bit TC1 Interrupt) -FFF8 INT0 (External Interrupt 0) -FFFA INTWDT (Watchdog Timer Interrupt) -FFFC INTSW (Software Interrupt) -FFFE RESET (Reset Vector) -(Priority High - 0) - -*/ - -void tlcs870_device::handle_take_interrupt(int level) -{ - WM8(m_sp.d - 1, get_PSW()); - WM16(m_sp.d - 2, m_addr); - m_sp.d -= 3; - - m_addr = RM16(0xffe0 + ((level &0xf)*2)); -} - diff --git a/src/devices/cpu/tlcs870/tlcs870_ops_reg.cpp b/src/devices/cpu/tlcs870/tlcs870_ops_reg.cpp index 4bcc361c51d..9a5177d5831 100644 --- a/src/devices/cpu/tlcs870/tlcs870_ops_reg.cpp +++ b/src/devices/cpu/tlcs870/tlcs870_ops_reg.cpp @@ -19,10 +19,10 @@ EF H (16-bit mode operations) - E8 invalid - E9 invalid - EA invalid - EB invalid + E8 WA + E9 BC + EA DE + EB HL EC WA ED BC EE DE @@ -333,7 +333,7 @@ void tlcs870_device::do_ALUOP_A_g(const uint8_t opbyte0, const uint8_t opbyte1) const int aluop = (opbyte1 & 0x7); - const uint8_t result = do_alu(aluop, get_reg8(REG_A), get_reg8(opbyte0 & 0x7)); + const uint8_t result = do_alu_8bit(aluop, get_reg8(REG_A), get_reg8(opbyte0 & 0x7)); if (aluop != 0x07) // CMP doesn't write back { @@ -357,7 +357,7 @@ void tlcs870_device::do_ALUOP_g_A(const uint8_t opbyte0, const uint8_t opbyte1) m_cycles = 3; const int aluop = (opbyte1 & 0x7); - const uint8_t result = do_alu(aluop, get_reg8(opbyte0 & 0x7), get_reg8(REG_A)); + const uint8_t result = do_alu_8bit(aluop, get_reg8(opbyte0 & 0x7), get_reg8(REG_A)); if (aluop != 0x07) // CMP doesn't write back { @@ -384,7 +384,7 @@ void tlcs870_device::do_ALUOP_g_n(const uint8_t opbyte0, const uint8_t opbyte1) const uint8_t n = READ8(); - const uint8_t result = do_alu(aluop, get_reg8(opbyte0 & 0x7), n); + const uint8_t result = do_alu_8bit(aluop, get_reg8(opbyte0 & 0x7), n); if (aluop != 0x07) // CMP doesn't write back { @@ -413,7 +413,7 @@ void tlcs870_device::do_ALUOP_WA_gg(const uint8_t opbyte0, const uint8_t opbyte1 const int aluop = (opbyte1 & 0x7); - const uint16_t result = do_alu(aluop, get_reg16(REG_WA), get_reg16(opbyte0 & 0x3)); + const uint16_t result = do_alu_16bit(aluop, get_reg16(REG_WA), get_reg16(opbyte0 & 0x3)); if (aluop != 0x07) // CMP doesn't write back { @@ -441,7 +441,7 @@ void tlcs870_device::do_ALUOP_gg_mn(const uint8_t opbyte0, const uint8_t opbyte1 const uint16_t mn = READ16(); - const uint16_t result = do_alu(aluop, get_reg16(opbyte0 & 0x3), mn); + const uint16_t result = do_alu_16bit(aluop, get_reg16(opbyte0 & 0x3), mn); if (aluop != 0x07) // CMP doesn't write back { @@ -497,6 +497,7 @@ void tlcs870_device::do_CLR_inppbit(const uint8_t opbyte0, const uint8_t opbyte1 const uint8_t bitpos = get_reg8(opbyte0 & 7) & 0x7; const uint8_t bitused = 1 << bitpos; const uint16_t addr = get_reg16((opbyte1 & 1) + 2); // DE or HL + m_read_input_port = 0; // reads output latch, not actual ports if accessing memory mapped ports uint8_t val = RM8(addr); if (val & bitused) // Zero flag gets set based on original value of bit? @@ -527,6 +528,7 @@ void tlcs870_device::do_CPL_inpp_indirectbit(const uint8_t opbyte0, const uint8_ const uint8_t bitpos = get_reg8(opbyte0 & 7) & 0x7; const uint8_t bitused = 1 << bitpos; const uint16_t addr = get_reg16((opbyte1 & 1) + 2); // DE or HL + m_read_input_port = 0; // reads output latch, not actual ports if accessing memory mapped ports uint8_t val = RM8(addr); uint8_t bit = val & bitused; diff --git a/src/devices/cpu/tlcs870/tlcs870_ops_src.cpp b/src/devices/cpu/tlcs870/tlcs870_ops_src.cpp index 22c718a2078..6295d9c06b3 100644 --- a/src/devices/cpu/tlcs870/tlcs870_ops_src.cpp +++ b/src/devices/cpu/tlcs870/tlcs870_ops_src.cpp @@ -416,6 +416,7 @@ void tlcs870_device::do_XCH_r_insrc(const uint8_t opbyte0, const uint8_t opbyte1 */ m_cycles += 4; + m_read_input_port = 0; // reads output latch, not actual ports if accessing memory mapped ports const uint8_t val = RM8(srcaddr); const uint8_t temp = get_reg8(opbyte1 & 0x7); @@ -520,11 +521,14 @@ void tlcs870_device::do_ALUOP_insrc_inHL(const uint8_t opbyte0, const uint8_t op m_cycles += 6; const int aluop = (opbyte1 & 0x7); + if (aluop != 0x07) + m_read_input_port = 0; // reads output latch, not actual ports if accessing memory mapped ports const uint8_t val = RM8(srcaddr); + m_read_input_port = 1; const uint16_t HL = get_reg16(REG_HL); - const uint8_t result = do_alu(aluop, val, RM8(HL)); + const uint8_t result = do_alu_8bit(aluop, val, RM8(HL)); if (aluop != 0x07) // CMP doesn't write back { @@ -616,9 +620,13 @@ void tlcs870_device::do_ALUOP_insrc_n(const uint8_t opbyte0, const uint8_t opbyt const uint8_t n = READ8(); const int aluop = (opbyte1 & 0x7); + + if (aluop != 0x07) + m_read_input_port = 0; // reads output latch, not actual ports if accessing memory mapped ports + const uint8_t val = RM8(srcaddr); - const uint8_t result = do_alu(aluop, val, n); + const uint8_t result = do_alu_8bit(aluop, val, n); if (aluop != 0x07) // CMP doesn't write back { @@ -710,7 +718,7 @@ void tlcs870_device::do_ALUOP_A_insrc(const uint8_t opbyte0, const uint8_t opbyt const int aluop = (opbyte1 & 0x7); const uint8_t val = RM8(srcaddr); - const uint8_t result = do_alu(aluop, get_reg8(REG_A), val); + const uint8_t result = do_alu_8bit(aluop, get_reg8(REG_A), val); if (aluop != 0x07) // CMP doesn't write back { @@ -848,6 +856,7 @@ void tlcs870_device::do_LD_insrcbit_CF(const uint8_t opbyte0, const uint8_t opby */ m_cycles += 4; + m_read_input_port = 0; // reads output latch, not actual ports if accessing memory mapped ports uint8_t val = RM8(srcaddr); const uint8_t bitpos = opbyte1 & 0x7; @@ -885,6 +894,7 @@ void tlcs870_device::do_CPL_insrcbit(const uint8_t opbyte0, const uint8_t opbyte */ m_cycles += 4; + m_read_input_port = 0; // reads output latch, not actual ports if accessing memory mapped ports uint8_t val = RM8(srcaddr); const uint8_t bitpos = opbyte1 & 0x7; @@ -956,6 +966,7 @@ void tlcs870_device::do_SET_insrcbit(const uint8_t opbyte0, const uint8_t opbyte */ m_cycles += 4; + m_read_input_port = 0; // reads output latch, not actual ports if accessing memory mapped ports uint8_t val = RM8(srcaddr); const uint8_t bitpos = opbyte1 & 0x7; @@ -994,6 +1005,7 @@ void tlcs870_device::do_CLR_insrcbit(const uint8_t opbyte0, const uint8_t opbyte */ m_cycles += 4; + m_read_input_port = 0; // reads output latch, not actual ports if accessing memory mapped ports uint8_t val = RM8(srcaddr); const uint8_t bitpos = opbyte1 & 0x7; diff --git a/src/devices/imagedev/floppy.h b/src/devices/imagedev/floppy.h index c486018defd..d06ce318e27 100644 --- a/src/devices/imagedev/floppy.h +++ b/src/devices/imagedev/floppy.h @@ -317,13 +317,13 @@ class floppy_connector: public device_t, { public: template <typename T> - floppy_connector(const machine_config &mconfig, const char *tag, device_t *owner, T &&opts, const char *dflt, const floppy_format_type *formats) + floppy_connector(const machine_config &mconfig, const char *tag, device_t *owner, T &&opts, const char *dflt, const floppy_format_type *formats, bool fixed = false) : floppy_connector(mconfig, tag, owner, 0) { option_reset(); opts(*this); set_default_option(dflt); - set_fixed(false); + set_fixed(fixed); set_formats(formats); } floppy_connector(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); diff --git a/src/devices/machine/1mb5.h b/src/devices/machine/1mb5.h index 09c05d2fd8c..18f8107896a 100644 --- a/src/devices/machine/1mb5.h +++ b/src/devices/machine/1mb5.h @@ -13,18 +13,6 @@ #pragma once -#define MCFG_1MB5_IRL_HANDLER(_devcb) \ - downcast<hp_1mb5_device &>(*device).set_irl_handler(DEVCB_##_devcb); - -#define MCFG_1MB5_HALT_HANDLER(_devcb) \ - downcast<hp_1mb5_device &>(*device).set_halt_handler(DEVCB_##_devcb); - -#define MCFG_1MB5_RESET_HANDLER(_devcb) \ - downcast<hp_1mb5_device &>(*device).set_reset_handler(DEVCB_##_devcb); - -#define MCFG_1MB5_INT_HANDLER(_devcb) \ - downcast<hp_1mb5_device &>(*device).set_int_handler(DEVCB_##_devcb); - class hp_1mb5_device : public device_t { public: @@ -32,10 +20,10 @@ public: hp_1mb5_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); // static configuration helpers - template <class Object> devcb_base &set_irl_handler(Object &&cb) { return m_irl_handler.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_halt_handler(Object &&cb) { return m_halt_handler.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_reset_handler(Object &&cb) { return m_reset_handler.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_int_handler(Object &&cb) { return m_int_handler.set_callback(std::forward<Object>(cb)); } + auto irl_handler() { return m_irl_handler.bind(); } + auto halt_handler() { return m_halt_handler.bind(); } + auto reset_handler() { return m_reset_handler.bind(); } + auto int_handler() { return m_int_handler.bind(); } // CPU access DECLARE_READ8_MEMBER(cpu_r); diff --git a/src/devices/machine/28fxxx.h b/src/devices/machine/28fxxx.h index 313cda82873..e045a91f27c 100644 --- a/src/devices/machine/28fxxx.h +++ b/src/devices/machine/28fxxx.h @@ -69,13 +69,13 @@ private: class intel_28f010_device : public base_28fxxx_device { public: - intel_28f010_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + intel_28f010_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0); }; class amd_28f010_device : public base_28fxxx_device { public: - amd_28f010_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + amd_28f010_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0); }; DECLARE_DEVICE_TYPE(INTEL_28F010, intel_28f010_device) diff --git a/src/devices/machine/40105.h b/src/devices/machine/40105.h index 77b58bbaf08..6edea9cc6f6 100644 --- a/src/devices/machine/40105.h +++ b/src/devices/machine/40105.h @@ -56,6 +56,9 @@ public: template <class Object> devcb_base &set_dir_callback(Object &&dir) { return m_write_dir.set_callback(std::forward<Object>(dir)); } template <class Object> devcb_base &set_dor_callback(Object &&dor) { return m_write_dor.set_callback(std::forward<Object>(dor)); } template <class Object> devcb_base &set_data_out_callback(Object &&out) { return m_write_q.set_callback(std::forward<Object>(out)); } + auto in_ready_cb() { return m_write_dir.bind(); } + auto out_ready_cb() { return m_write_dor.bind(); } + auto out_cb() { return m_write_q.bind(); } u8 read(); void write(u8 data); diff --git a/src/devices/machine/53c7xx.h b/src/devices/machine/53c7xx.h index 8887a78a5ef..50d59c1d1b4 100644 --- a/src/devices/machine/53c7xx.h +++ b/src/devices/machine/53c7xx.h @@ -16,15 +16,6 @@ #include "machine/nscsi_bus.h" -#define MCFG_NCR53C7XX_IRQ_HANDLER(_devcb) \ - downcast<ncr53c7xx_device &>(*device).set_irq_handler(DEVCB_##_devcb); - -#define MCFG_NCR53C7XX_HOST_WRITE(_devcb) \ - downcast<ncr53c7xx_device &>(*device).set_host_write(DEVCB_##_devcb); - -#define MCFG_NCR53C7XX_HOST_READ(_devcb) \ - downcast<ncr53c7xx_device &>(*device).set_host_read(DEVCB_##_devcb); - class ncr53c7xx_device : public nscsi_device, public device_execute_interface { public: @@ -32,9 +23,9 @@ public: ncr53c7xx_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); // static configuration helpers - template <class Object> devcb_base &set_irq_handler(Object &&cb) { return m_irq_handler.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_host_write(Object &&cb) { return m_host_write.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_host_read(Object &&cb) { return m_host_read.set_callback(std::forward<Object>(cb)); } + auto irq_handler() { return m_irq_handler.bind(); } + auto host_write() { return m_host_write.bind(); } + auto host_read() { return m_host_read.bind(); } // our API DECLARE_READ32_MEMBER(read); diff --git a/src/devices/machine/53c810.h b/src/devices/machine/53c810.h index 0e0d0743b14..b80c0aa2c4a 100644 --- a/src/devices/machine/53c810.h +++ b/src/devices/machine/53c810.h @@ -7,11 +7,6 @@ #include "legscsi.h" -#define LSI53C810_IRQ_CB(name) void name(int state) -#define LSI53C810_DMA_CB(name) void name(uint32_t src, uint32_t dst, int length, int byteswap) -#define LSI53C810_FETCH_CB(name) uint32_t name(uint32_t dsp) - - class lsi53c810_device : public legacy_scsi_host_adapter { public: @@ -20,11 +15,22 @@ public: typedef device_delegate<uint32_t (uint32_t dsp)> fetch_delegate; // construction/destruction - lsi53c810_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + lsi53c810_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); + + template <class FunctionClass> void set_irq_callback(void (FunctionClass::*callback)(int), const char *name) + { + m_irq_cb = irq_delegate(callback, name, nullptr, static_cast<FunctionClass *>(nullptr)); + } + + template <class FunctionClass> void set_dma_callback(void (FunctionClass::*callback)(uint32_t, uint32_t, int, int), const char *name) + { + m_dma_cb = dma_delegate(callback, name, nullptr, static_cast<FunctionClass *>(nullptr)); + } - template <typename Object> void set_irq_callback(Object &&cb) { m_irq_cb = std::forward<Object>(cb); } - template <typename Object> void set_dma_callback(Object &&cb) { m_dma_cb = std::forward<Object>(cb); } - template <typename Object> void set_fetch_callback(Object &&cb) { m_fetch_cb = std::forward<Object>(cb); } + template <class FunctionClass> void set_fetch_callback(uint32_t (FunctionClass::*callback)(uint32_t), const char *name) + { + m_fetch_cb = fetch_delegate(callback, name, nullptr, static_cast<FunctionClass *>(nullptr)); + } uint8_t reg_r(int offset); void reg_w(int offset, uint8_t data); @@ -101,14 +107,4 @@ private: // device type definition DECLARE_DEVICE_TYPE(LSI53C810, lsi53c810_device) - -#define MCFG_LSI53C810_IRQ_CB(_class, _method) \ - downcast<lsi53c810_device &>(*device).set_irq_callback(lsi53c810_device::irq_delegate(&_class::_method, #_class "::" #_method, this)); - -#define MCFG_LSI53C810_DMA_CB(_class, _method) \ - downcast<lsi53c810_device &>(*device).set_dma_callback(lsi53c810_device::dma_delegate(&_class::_method, #_class "::" #_method, this)); - -#define MCFG_LSI53C810_FETCH_CB(_class, _method) \ - downcast<lsi53c810_device &>(*device).set_fetch_callback(lsi53c810_device::fetch_delegate(&_class::_method, #_class "::" #_method, this)); - #endif // MAME_MACHINE_53C810_H diff --git a/src/devices/machine/64h156.h b/src/devices/machine/64h156.h index 24244e64517..0db1c0a2883 100644 --- a/src/devices/machine/64h156.h +++ b/src/devices/machine/64h156.h @@ -67,21 +67,6 @@ //************************************************************************** -// INTERFACE CONFIGURATION MACROS -//************************************************************************** - -#define MCFG_64H156_ATN_CALLBACK(_write) \ - downcast<c64h156_device &>(*device).set_atn_wr_callback(DEVCB_##_write); - -#define MCFG_64H156_SYNC_CALLBACK(_write) \ - downcast<c64h156_device &>(*device).set_sync_wr_callback(DEVCB_##_write); - -#define MCFG_64H156_BYTE_CALLBACK(_write) \ - downcast<c64h156_device &>(*device).set_byte_wr_callback(DEVCB_##_write); - - - -//************************************************************************** // TYPE DEFINITIONS //************************************************************************** @@ -93,9 +78,9 @@ public: // construction/destruction c64h156_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template <class Object> devcb_base &set_atn_wr_callback(Object &&cb) { return m_write_atn.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_sync_wr_callback(Object &&cb) { return m_write_sync.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_byte_wr_callback(Object &&cb) { return m_write_byte.set_callback(std::forward<Object>(cb)); } + auto atn_callback() { return m_write_atn.bind(); } + auto sync_callback() { return m_write_sync.bind(); } + auto byte_callback() { return m_write_byte.bind(); } DECLARE_READ8_MEMBER( yb_r ); DECLARE_WRITE8_MEMBER( yb_w ); diff --git a/src/devices/machine/6522via.cpp b/src/devices/machine/6522via.cpp index cd6588374c5..eae073196b0 100644 --- a/src/devices/machine/6522via.cpp +++ b/src/devices/machine/6522via.cpp @@ -535,7 +535,7 @@ void via6522_device::output_pb() via_r - CPU interface for VIA read -------------------------------------------------*/ -READ8_MEMBER( via6522_device::read ) +u8 via6522_device::read(offs_t offset) { int val = 0; if (machine().side_effects_disabled()) @@ -715,7 +715,7 @@ READ8_MEMBER( via6522_device::read ) via_w - CPU interface for VIA write -------------------------------------------------*/ -WRITE8_MEMBER( via6522_device::write ) +void via6522_device::write(offs_t offset, u8 data) { offset &=0x0f; diff --git a/src/devices/machine/6522via.h b/src/devices/machine/6522via.h index 5b3823b2b5c..074f0581fd5 100644 --- a/src/devices/machine/6522via.h +++ b/src/devices/machine/6522via.h @@ -18,37 +18,6 @@ #pragma once -//************************************************************************** -// INTERFACE CONFIGURATION MACROS -//************************************************************************** - -// TODO: REMOVE THESE -#define MCFG_VIA6522_READPA_HANDLER(_devcb) \ - downcast<via6522_device &>(*device).set_readpa_handler(DEVCB_##_devcb); - -#define MCFG_VIA6522_READPB_HANDLER(_devcb) \ - downcast<via6522_device &>(*device).set_readpb_handler(DEVCB_##_devcb); - -// TODO: CONVERT THESE TO WRITE LINE -#define MCFG_VIA6522_WRITEPA_HANDLER(_devcb) \ - downcast<via6522_device &>(*device).set_writepa_handler(DEVCB_##_devcb); - -#define MCFG_VIA6522_WRITEPB_HANDLER(_devcb) \ - downcast<via6522_device &>(*device).set_writepb_handler(DEVCB_##_devcb); - -#define MCFG_VIA6522_CA2_HANDLER(_devcb) \ - downcast<via6522_device &>(*device).set_ca2_handler(DEVCB_##_devcb); - -#define MCFG_VIA6522_CB1_HANDLER(_devcb) \ - downcast<via6522_device &>(*device).set_cb1_handler(DEVCB_##_devcb); - -#define MCFG_VIA6522_CB2_HANDLER(_devcb) \ - downcast<via6522_device &>(*device).set_cb2_handler(DEVCB_##_devcb); - -#define MCFG_VIA6522_IRQ_HANDLER(_devcb) \ - downcast<via6522_device &>(*device).set_irq_handler(DEVCB_##_devcb); - - /*************************************************************************** TYPE DEFINITIONS ***************************************************************************/ @@ -83,21 +52,13 @@ public: via6522_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); // TODO: REMOVE THESE - template <class Object> devcb_base &set_readpa_handler(Object &&cb) { return m_in_a_handler.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_readpb_handler(Object &&cb) { return m_in_b_handler.set_callback(std::forward<Object>(cb)); } auto readpa_handler() { return m_in_a_handler.bind(); } auto readpb_handler() { return m_in_b_handler.bind(); } // TODO: CONVERT THESE TO WRITE LINE - template <class Object> devcb_base &set_writepa_handler(Object &&cb) { return m_out_a_handler.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_writepb_handler(Object &&cb) { return m_out_b_handler.set_callback(std::forward<Object>(cb)); } auto writepa_handler() { return m_out_a_handler.bind(); } auto writepb_handler() { return m_out_b_handler.bind(); } - template <class Object> devcb_base &set_ca2_handler(Object &&cb) { return m_ca2_handler.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_cb1_handler(Object &&cb) { return m_cb1_handler.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_cb2_handler(Object &&cb) { return m_cb2_handler.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_irq_handler(Object &&cb) { return m_irq_handler.set_callback(std::forward<Object>(cb)); } auto ca2_handler() { return m_ca2_handler.bind(); } auto cb1_handler() { return m_cb1_handler.bind(); } auto cb2_handler() { return m_cb2_handler.bind(); } @@ -105,8 +66,8 @@ public: virtual void map(address_map &map); - DECLARE_READ8_MEMBER( read ); - DECLARE_WRITE8_MEMBER( write ); + u8 read(offs_t offset); + void write(offs_t offset, u8 data); DECLARE_WRITE_LINE_MEMBER( write_pa0 ) { set_pa_line(0, state); } DECLARE_WRITE_LINE_MEMBER( write_pa1 ) { set_pa_line(1, state); } diff --git a/src/devices/machine/6525tpi.h b/src/devices/machine/6525tpi.h index a17b0ebb01c..5e1ec394fe4 100644 --- a/src/devices/machine/6525tpi.h +++ b/src/devices/machine/6525tpi.h @@ -43,15 +43,15 @@ class tpi6525_device : public device_t public: tpi6525_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template <class Object> devcb_base &set_out_irq_callback(Object &&cb) { return m_out_irq_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_in_pa_callback(Object &&cb) { return m_in_pa_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_out_pa_callback(Object &&cb) { return m_out_pa_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_in_pb_callback(Object &&cb) { return m_in_pb_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_out_pb_callback(Object &&cb) { return m_out_pb_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_in_pc_callback(Object &&cb) { return m_in_pc_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_out_pc_callback(Object &&cb) { return m_out_pc_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_out_ca_callback(Object &&cb) { return m_out_ca_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_out_cb_callback(Object &&cb) { return m_out_cb_cb.set_callback(std::forward<Object>(cb)); } + auto out_irq_cb() { return m_out_irq_cb.bind(); } + auto in_pa_cb() { return m_in_pa_cb.bind(); } + auto out_pa_cb() { return m_out_pa_cb.bind(); } + auto in_pb_cb() { return m_in_pb_cb.bind(); } + auto out_pb_cb() { return m_out_pb_cb.bind(); } + auto in_pc_cb() { return m_in_pc_cb.bind(); } + auto out_pc_cb() { return m_out_pc_cb.bind(); } + auto out_ca_cb() { return m_out_ca_cb.bind(); } + auto out_cb_cb() { return m_out_cb_cb.bind(); } DECLARE_READ8_MEMBER( read ); DECLARE_WRITE8_MEMBER( write ); @@ -123,33 +123,4 @@ private: DECLARE_DEVICE_TYPE(TPI6525, tpi6525_device) - -#define MCFG_TPI6525_OUT_IRQ_CB(_devcb) \ - downcast<tpi6525_device &>(*device).set_out_irq_callback(DEVCB_##_devcb); - -#define MCFG_TPI6525_IN_PA_CB(_devcb) \ - downcast<tpi6525_device &>(*device).set_in_pa_callback(DEVCB_##_devcb); - -#define MCFG_TPI6525_OUT_PA_CB(_devcb) \ - downcast<tpi6525_device &>(*device).set_out_pa_callback(DEVCB_##_devcb); - -#define MCFG_TPI6525_IN_PB_CB(_devcb) \ - downcast<tpi6525_device &>(*device).set_in_pb_callback(DEVCB_##_devcb); - -#define MCFG_TPI6525_OUT_PB_CB(_devcb) \ - downcast<tpi6525_device &>(*device).set_out_pb_callback(DEVCB_##_devcb); - -#define MCFG_TPI6525_IN_PC_CB(_devcb) \ - downcast<tpi6525_device &>(*device).set_in_pc_callback(DEVCB_##_devcb); - -#define MCFG_TPI6525_OUT_PC_CB(_devcb) \ - downcast<tpi6525_device &>(*device).set_out_pc_callback(DEVCB_##_devcb); - -#define MCFG_TPI6525_OUT_CA_CB(_devcb) \ - downcast<tpi6525_device &>(*device).set_out_ca_callback(DEVCB_##_devcb); - -#define MCFG_TPI6525_OUT_CB_CB(_devcb) \ - downcast<tpi6525_device &>(*device).set_out_cb_callback(DEVCB_##_devcb); - - #endif // MAME_MACHINE_6525TPI_H diff --git a/src/devices/machine/6532riot.h b/src/devices/machine/6532riot.h index fb700312475..fc70dd82624 100644 --- a/src/devices/machine/6532riot.h +++ b/src/devices/machine/6532riot.h @@ -13,26 +13,6 @@ -//************************************************************************** -// INTERFACE CONFIGURATION MACROS -//************************************************************************** - -#define MCFG_RIOT6532_IN_PA_CB(_devcb) \ - downcast<riot6532_device &>(*device).set_in_pa_callback(DEVCB_##_devcb); - -#define MCFG_RIOT6532_OUT_PA_CB(_devcb) \ - downcast<riot6532_device &>(*device).set_out_pa_callback(DEVCB_##_devcb); - -#define MCFG_RIOT6532_IN_PB_CB(_devcb) \ - downcast<riot6532_device &>(*device).set_in_pb_callback(DEVCB_##_devcb); - -#define MCFG_RIOT6532_OUT_PB_CB(_devcb) \ - downcast<riot6532_device &>(*device).set_out_pb_callback(DEVCB_##_devcb); - -#define MCFG_RIOT6532_IRQ_CB(_devcb) \ - downcast<riot6532_device &>(*device).set_irq_callback(DEVCB_##_devcb); - - /*************************************************************************** TYPE DEFINITIONS ***************************************************************************/ @@ -46,11 +26,6 @@ public: // construction/destruction riot6532_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template <class Object> devcb_base &set_in_pa_callback(Object &&cb) { return m_in_pa_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_out_pa_callback(Object &&cb) { return m_out_pa_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_in_pb_callback(Object &&cb) { return m_in_pb_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_out_pb_callback(Object &&cb) { return m_out_pb_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_irq_callback(Object &&cb) { return m_irq_cb.set_callback(std::forward<Object>(cb)); } auto in_pa_callback() { return m_in_pa_cb.bind(); } auto out_pa_callback() { return m_out_pa_cb.bind(); } auto in_pb_callback() { return m_in_pb_cb.bind(); } diff --git a/src/devices/machine/74145.h b/src/devices/machine/74145.h index c396c1c1fbf..642ffbe29c7 100644 --- a/src/devices/machine/74145.h +++ b/src/devices/machine/74145.h @@ -70,6 +70,17 @@ public: template <class Object> devcb_base &set_output_line_8_callback(Object &&cb) { return m_output_line_8_cb.set_callback(std::forward<Object>(cb)); } template <class Object> devcb_base &set_output_line_9_callback(Object &&cb) { return m_output_line_9_cb.set_callback(std::forward<Object>(cb)); } + auto output_line0_callback() { return m_output_line_0_cb.bind(); } + auto output_line1_callback() { return m_output_line_1_cb.bind(); } + auto output_line2_callback() { return m_output_line_2_cb.bind(); } + auto output_line3_callback() { return m_output_line_3_cb.bind(); } + auto output_line4_callback() { return m_output_line_4_cb.bind(); } + auto output_line5_callback() { return m_output_line_5_cb.bind(); } + auto output_line6_callback() { return m_output_line_6_cb.bind(); } + auto output_line7_callback() { return m_output_line_7_cb.bind(); } + auto output_line8_callback() { return m_output_line_8_cb.bind(); } + auto output_line9_callback() { return m_output_line_9_cb.bind(); } + uint16_t read(); void write(uint8_t data); diff --git a/src/devices/machine/8042kbdc.h b/src/devices/machine/8042kbdc.h index 7b285d08688..f2e7fdfbf04 100644 --- a/src/devices/machine/8042kbdc.h +++ b/src/devices/machine/8042kbdc.h @@ -17,28 +17,6 @@ #include "machine/pckeybrd.h" //************************************************************************** -// INTERFACE CONFIGURATION MACROS -//************************************************************************** - -#define MCFG_KBDC8042_KEYBOARD_TYPE(_kbdt) \ - downcast<kbdc8042_device &>(*device).set_keyboard_type(kbdc8042_device::_kbdt); - -#define MCFG_KBDC8042_SYSTEM_RESET_CB(_devcb) \ - downcast<kbdc8042_device &>(*device).set_system_reset_callback(DEVCB_##_devcb); - -#define MCFG_KBDC8042_GATE_A20_CB(_devcb) \ - downcast<kbdc8042_device &>(*device).set_gate_a20_callback(DEVCB_##_devcb); - -#define MCFG_KBDC8042_INPUT_BUFFER_FULL_CB(_devcb) \ - downcast<kbdc8042_device &>(*device).set_input_buffer_full_callback(DEVCB_##_devcb); - -#define MCFG_KBDC8042_OUTPUT_BUFFER_EMPTY_CB(_devcb) \ - downcast<kbdc8042_device &>(*device).set_output_buffer_empty_callback(DEVCB_##_devcb); - -#define MCFG_KBDC8042_SPEAKER_CB(_devcb) \ - downcast<kbdc8042_device &>(*device).set_speaker_callback(DEVCB_##_devcb); - -//************************************************************************** // TYPE DEFINITIONS //************************************************************************** @@ -55,14 +33,9 @@ public: }; // construction/destruction - kbdc8042_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + kbdc8042_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); void set_keyboard_type(kbdc8042_type_t keybtype) { m_keybtype = keybtype; } - template <class Object> devcb_base &set_system_reset_callback(Object &&cb) { return m_system_reset_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_gate_a20_callback(Object &&cb) { return m_gate_a20_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_input_buffer_full_callback(Object &&cb) { return m_input_buffer_full_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_output_buffer_empty_callback(Object &&cb) { return m_output_buffer_empty_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_speaker_callback(Object &&cb) { return m_speaker_cb.set_callback(std::forward<Object>(cb)); } auto system_reset_callback() { return m_system_reset_cb.bind(); } auto gate_a20_callback() { return m_gate_a20_cb.bind(); } auto input_buffer_full_callback() { return m_input_buffer_full_cb.bind(); } diff --git a/src/devices/machine/82s129.h b/src/devices/machine/82s129.h index 9b5ef9d3bf1..2c90fd6d896 100644 --- a/src/devices/machine/82s129.h +++ b/src/devices/machine/82s129.h @@ -46,51 +46,14 @@ #pragma once -#define MCFG_82S126_OUTPUT_CB(_devcb) \ - downcast<prom82s129_base_device &>(*device).set_out_cb(DEVCB_##_devcb); - -#define MCFG_82S126_O1_CB(_devcb) \ - downcast<prom82s129_base_device &>(*device).set_o1_cb(DEVCB_##_devcb); - -#define MCFG_82S126_O2_CB(_devcb) \ - downcast<prom82s129_base_device &>(*device).set_o2_cb(DEVCB_##_devcb); - -#define MCFG_82S126_O3_CB(_devcb) \ - downcast<prom82s129_base_device &>(*device).set_o3_cb(DEVCB_##_devcb); - -#define MCFG_82S126_O4_CB(_devcb) \ - downcast<prom82s129_base_device &>(*device).set_o4_cb(DEVCB_##_devcb); - -#define MCFG_82S129_OUTPUT_CB(_devcb) \ - downcast<prom82s129_base_device &>(*device).set_out_cb(DEVCB_##_devcb); - -#define MCFG_82S129_O1_CB(_devcb) \ - downcast<prom82s129_base_device &>(*device).set_o1_cb(DEVCB_##_devcb); - -#define MCFG_82S129_O2_CB(_devcb) \ - downcast<prom82s129_base_device &>(*device).set_o2_cb(DEVCB_##_devcb); - -#define MCFG_82S129_O3_CB(_devcb) \ - downcast<prom82s129_base_device &>(*device).set_o3_cb(DEVCB_##_devcb); - -#define MCFG_82S129_O4_CB(_devcb) \ - downcast<prom82s129_base_device &>(*device).set_o4_cb(DEVCB_##_devcb); - -#define MCFG_82S129_ADD(_tag) \ - MCFG_DEVICE_ADD(_tag, PROM82S129, 0) - -#define MCFG_82S126_ADD(_tag) \ - MCFG_DEVICE_ADD(_tag, PROM82S126, 0) - class prom82s129_base_device : public device_t { public: - // static configuration helpers - template <class Object> devcb_base &set_out_cb(Object &&cb) { return m_out_func.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_o1_cb(Object &&cb) { return m_o1_func.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_o2_cb(Object &&cb) { return m_o2_func.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_o3_cb(Object &&cb) { return m_o3_func.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_o4_cb(Object &&cb) { return m_o4_func.set_callback(std::forward<Object>(cb)); } + auto out_callback() { return m_out_func.bind(); } + auto o1_callback() { return m_o1_func.bind(); } + auto o2_callback() { return m_o2_func.bind(); } + auto o3_callback() { return m_o3_func.bind(); } + auto o4_callback() { return m_o4_func.bind(); } DECLARE_WRITE_LINE_MEMBER( ce1_w ); DECLARE_WRITE_LINE_MEMBER( ce2_w ); diff --git a/src/devices/machine/8530scc.h b/src/devices/machine/8530scc.h index 457a0d36334..c95d2d7bdc7 100644 --- a/src/devices/machine/8530scc.h +++ b/src/devices/machine/8530scc.h @@ -32,6 +32,7 @@ public: scc8530_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); template <class Object> devcb_base &set_intrq_wr_callback(Object &&cb) { return intrq_cb.set_callback(std::forward<Object>(cb)); } + auto intrq_callback() { return intrq_cb.bind(); } uint8_t get_reg_a(int reg); uint8_t get_reg_b(int reg); diff --git a/src/devices/machine/applefdc.h b/src/devices/machine/applefdc.h index 0190b57e4e6..eede57199f7 100644 --- a/src/devices/machine/applefdc.h +++ b/src/devices/machine/applefdc.h @@ -72,6 +72,8 @@ public: // accessor uint8_t get_lines(); + virtual void device_reset() override; + protected: enum applefdc_t { @@ -85,7 +87,6 @@ protected: // device-level overrides virtual void device_start() override; - virtual void device_reset() override; virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; // other protecteds @@ -135,6 +136,12 @@ public: class iwm_device : public applefdc_base_device { public: + iwm_device(const machine_config &mconfig, const char *tag, device_t *owner, const applefdc_interface *intrf) + : iwm_device(mconfig, tag, owner, (uint32_t)0) + { + set_config(intrf); + } + iwm_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); }; diff --git a/src/devices/machine/ataintf.cpp b/src/devices/machine/ataintf.cpp index 0e377c5e0ed..8f2db0ba0d3 100644 --- a/src/devices/machine/ataintf.cpp +++ b/src/devices/machine/ataintf.cpp @@ -17,6 +17,23 @@ #include "debugger.h" +void abstract_ata_interface_device::set_default_ata_devices(const char* _master, const char* _slave) +{ + for (size_t slot_index = 0; slot_index < SLOT_COUNT; slot_index++) + { + slot(slot_index).option_add("hdd", IDE_HARDDISK); + slot(slot_index).option_add("cdrom", ATAPI_CDROM); + } + slot(SLOT_MASTER).set_default_option(_master); + slot(SLOT_SLAVE).set_default_option(_slave); +} + +ata_slot_device &abstract_ata_interface_device::slot(int index) +{ + assert(index < 2); + return *subdevice<ata_slot_device>(m_slot[index].finder_tag()); +} + void abstract_ata_interface_device::set_irq(int state) { // logerror( "%s: irq %d\n", machine().describe_context(), state ); @@ -212,9 +229,11 @@ void ata_devices(device_slot_interface &device) abstract_ata_interface_device::abstract_ata_interface_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, type, tag, owner, clock), + m_slot(*this, "%u", 0U), m_irq_handler(*this), m_dmarq_handler(*this), - m_dasp_handler(*this){ + m_dasp_handler(*this) +{ } @@ -235,10 +254,6 @@ void abstract_ata_interface_device::device_start() m_dmarq_handler.resolve_safe(); m_dasp_handler.resolve_safe(); - /* set MAME harddisk handle */ - m_slot[0] = subdevice<ata_slot_device>("0"); - m_slot[1] = subdevice<ata_slot_device>("1"); - for (int i = 0; i < 2; i++) { m_irq[i] = 0; @@ -274,10 +289,11 @@ void abstract_ata_interface_device::device_start() // device_add_mconfig - add device configuration //------------------------------------------------- -MACHINE_CONFIG_START(abstract_ata_interface_device::device_add_mconfig) - MCFG_DEVICE_ADD( "0", ATA_SLOT, 0 ) - MCFG_DEVICE_ADD( "1", ATA_SLOT, 0 ) -MACHINE_CONFIG_END +void abstract_ata_interface_device::device_add_mconfig(machine_config &config) +{ + for (size_t slot = 0; slot < SLOT_COUNT; slot++) + ATA_SLOT(config, m_slot[slot]); +} //************************************************************************** diff --git a/src/devices/machine/ataintf.h b/src/devices/machine/ataintf.h index cd11d90180c..acd65a21b3f 100644 --- a/src/devices/machine/ataintf.h +++ b/src/devices/machine/ataintf.h @@ -26,7 +26,7 @@ class ata_slot_device : public device_t, { public: // construction/destruction - ata_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + ata_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); device_ata_interface *dev() { return m_dev; } @@ -82,6 +82,12 @@ public: template <class Object> devcb_base &set_irq_handler(Object &&cb) { return m_irq_handler.set_callback(std::forward<Object>(cb)); } template <class Object> devcb_base &set_dmarq_handler(Object &&cb) { return m_dmarq_handler.set_callback(std::forward<Object>(cb)); } template <class Object> devcb_base &set_dasp_handler(Object &&cb) { return m_dasp_handler.set_callback(std::forward<Object>(cb)); } + auto irq_handler() { return m_irq_handler.bind(); } + auto dmarq_handler() { return m_dmarq_handler.bind(); } + auto dasp_handler() { return m_dasp_handler.bind(); } + + ata_slot_device &slot(int index); + virtual void set_default_ata_devices(const char* _master, const char* _slave); uint16_t read_dma(); void write_dma(uint16_t data); @@ -103,6 +109,14 @@ protected: virtual void set_dmarq(int state); virtual void set_dasp(int state); + enum : size_t + { + SLOT_MASTER, + SLOT_SLAVE, + + SLOT_COUNT + }; + private: DECLARE_WRITE_LINE_MEMBER(irq0_write_line); DECLARE_WRITE_LINE_MEMBER(dmarq0_write_line); @@ -114,11 +128,11 @@ private: DECLARE_WRITE_LINE_MEMBER(dasp1_write_line); DECLARE_WRITE_LINE_MEMBER(pdiag1_write_line); - ata_slot_device *m_slot[2]; - int m_irq[2]; - int m_dmarq[2]; - int m_dasp[2]; - int m_pdiag[2]; + required_device_array<ata_slot_device, SLOT_COUNT> m_slot; + int m_irq[SLOT_COUNT]; + int m_dmarq[SLOT_COUNT]; + int m_dasp[SLOT_COUNT]; + int m_pdiag[SLOT_COUNT]; devcb_write_line m_irq_handler; devcb_write_line m_dmarq_handler; diff --git a/src/devices/machine/dmac.h b/src/devices/machine/dmac.h index 8c72c02d05d..203317dd742 100644 --- a/src/devices/machine/dmac.h +++ b/src/devices/machine/dmac.h @@ -17,39 +17,9 @@ //************************************************************************** -// INTERFACE CONFIGURATION MACROS -//************************************************************************** - -#define MCFG_DMAC_ADD(_tag, _clock) \ - MCFG_DEVICE_ADD(_tag, AMIGA_DMAC, _clock) -#define MCFG_DMAC_CFGOUT_HANDLER(_devcb) \ - downcast<amiga_dmac_device &>(*device).set_cfgout_handler(DEVCB_##_devcb); - -#define MCFG_DMAC_INT_HANDLER(_devcb) \ - downcast<amiga_dmac_device &>(*device).set_int_handler(DEVCB_##_devcb); - -#define MCFG_DMAC_XDACK_HANDLER(_devcb) \ - downcast<amiga_dmac_device &>(*device).set_xdack_handler(DEVCB_##_devcb); - -#define MCFG_DMAC_SCSI_READ_HANDLER(_devcb) \ - downcast<amiga_dmac_device &>(*device).set_scsi_read_handler(DEVCB_##_devcb); - -#define MCFG_DMAC_SCSI_WRITE_HANDLER(_devcb) \ - downcast<amiga_dmac_device &>(*device).set_scsi_write_handler(DEVCB_##_devcb); - -#define MCFG_DMAC_IO_READ_HANDLER(_devcb) \ - downcast<amiga_dmac_device &>(*device).set_io_read_handler(DEVCB_##_devcb); - -#define MCFG_DMAC_IO_WRITE_HANDLER(_devcb) \ - downcast<amiga_dmac_device &>(*device).set_io_write_handler(DEVCB_##_devcb); - - -//************************************************************************** // TYPE DEFINITIONS //************************************************************************** -// ======================> amiga_dmac_device - class amiga_dmac_device : public device_t, public amiga_autoconfig { public: @@ -57,13 +27,13 @@ public: amiga_dmac_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); // callbacks - template <class Object> devcb_base &set_cfgout_handler(Object &&cb) { return m_cfgout_handler.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_int_handler(Object &&cb) { return m_int_handler.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_xdack_handler(Object &&cb) { return m_xdack_handler.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_scsi_read_handler(Object &&cb) { return m_scsi_read_handler.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_scsi_write_handler(Object &&cb) { return m_scsi_write_handler.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_io_read_handler(Object &&cb) { return m_io_read_handler.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_io_write_handler(Object &&cb) { return m_io_write_handler.set_callback(std::forward<Object>(cb)); } + auto cfgout_handler() { return m_cfgout_handler.bind(); } + auto int_handler() { return m_int_handler.bind(); } + auto xdack_handler() { return m_xdack_handler.bind(); } + auto scsi_read_handler() { return m_scsi_read_handler.bind(); } + auto scsi_write_handler() { return m_scsi_write_handler.bind(); } + auto io_read_handler() { return m_io_read_handler.bind(); } + auto io_write_handler() { return m_io_write_handler.bind(); } void set_address_space(address_space *space) { m_space = space; } void set_rom(uint8_t *rom) { m_rom = rom; } diff --git a/src/devices/machine/f3853.cpp b/src/devices/machine/f3853.cpp index e7b90245e5d..19e5a1b388a 100644 --- a/src/devices/machine/f3853.cpp +++ b/src/devices/machine/f3853.cpp @@ -10,11 +10,6 @@ Based on a datasheet obtained from www.freetradezone.com - The SMI does not have DC0 and DC1, only DC0; as a result, it does - not respond to the main CPU's DC0/DC1 swap instruction. This may - lead to two devices responding to the same DC0 address and - attempting to place their bytes on the data bus simultaneously! - 8-bit shift register: Feedback in0 = !((out3 ^ out4) ^ (out5 ^ out7)) Interrupts are at 0xfe @@ -36,7 +31,7 @@ //************************************************************************** // device type definition -DEFINE_DEVICE_TYPE(F3853, f3853_device, "f3853_device", "F3853") +DEFINE_DEVICE_TYPE(F3853, f3853_device, "f3853_device", "F3853 SMI") //------------------------------------------------- // f3853_device - constructor @@ -97,7 +92,7 @@ void f3853_device::set_interrupt_request_line() if (m_interrupt_req_cb.isnull()) return; - if (m_external_enable && !m_priority_line) + if (m_external_enable && !m_priority_line && m_request_flipflop) m_interrupt_req_cb(external_interrupt_vector(), true); else if (m_timer_enable && !m_priority_line && m_request_flipflop) m_interrupt_req_cb(timer_interrupt_vector(), true); diff --git a/src/devices/machine/fdc37c93x.cpp b/src/devices/machine/fdc37c93x.cpp index f6cd3171fa2..d30d6080716 100644 --- a/src/devices/machine/fdc37c93x.cpp +++ b/src/devices/machine/fdc37c93x.cpp @@ -11,6 +11,10 @@ SMSC FDC37C93x Plug and Play Compatible Ultra I/O Controller #include "emu.h" #include "bus/isa/isa.h" #include "machine/ds128x.h" +#include "bus/rs232/rs232.h" +#include "bus/rs232/ser_mouse.h" +#include "bus/rs232/terminal.h" +#include "bus/rs232/null_modem.h" #include "machine/fdc37c93x.h" DEFINE_DEVICE_TYPE(FDC37C93X, fdc37c93x_device, "fdc37c93x", "SMSC FDC37C93X") @@ -30,6 +34,8 @@ fdc37c93x_device::fdc37c93x_device(const machine_config &mconfig, const char *ta , m_irq9_callback(*this) , floppy_controller_fdcdev(*this, "fdc") , pc_lpt_lptdev(*this, "lpt") + , pc_serial1_comdev(*this, "uart_0") + , pc_serial2_comdev(*this, "uart_1") , ds12885_rtcdev(*this, "rtc") , m_kbdc(*this, "pc_kbdc") , sysopt_pin(0) @@ -227,6 +233,14 @@ static void pc_hd_floppies(device_slot_interface &device) device.option_add("35dd", FLOPPY_35_DD); } +static void isa_com(device_slot_interface &device) +{ + device.option_add("microsoft_mouse", MSFT_SERIAL_MOUSE); + device.option_add("msystems_mouse", MSYSTEM_SERIAL_MOUSE); + device.option_add("terminal", SERIAL_TERMINAL); + device.option_add("null_modem", NULL_MODEM); +} + FLOPPY_FORMATS_MEMBER(fdc37c93x_device::floppy_formats) FLOPPY_PC_FORMAT, FLOPPY_NASLITE_FORMAT @@ -242,16 +256,39 @@ MACHINE_CONFIG_START(fdc37c93x_device::device_add_mconfig) // parallel port MCFG_DEVICE_ADD("lpt", PC_LPT, 0) MCFG_PC_LPT_IRQ_HANDLER(WRITELINE(*this, fdc37c93x_device, irq_parallel_w)) + // serial ports + MCFG_DEVICE_ADD("uart_0", NS16450, XTAL(1'843'200)) // or NS16550 ? + MCFG_INS8250_OUT_TX_CB(WRITELINE("serport0", rs232_port_device, write_txd)) + MCFG_INS8250_OUT_DTR_CB(WRITELINE("serport0", rs232_port_device, write_dtr)) + MCFG_INS8250_OUT_RTS_CB(WRITELINE("serport0", rs232_port_device, write_rts)) + MCFG_INS8250_OUT_INT_CB(WRITELINE(*this, fdc37c93x_device, irq_serial1_w)) + MCFG_DEVICE_ADD("uart_1", NS16450, XTAL(1'843'200)) + MCFG_INS8250_OUT_TX_CB(WRITELINE("serport1", rs232_port_device, write_txd)) + MCFG_INS8250_OUT_DTR_CB(WRITELINE("serport1", rs232_port_device, write_dtr)) + MCFG_INS8250_OUT_RTS_CB(WRITELINE("serport1", rs232_port_device, write_rts)) + MCFG_INS8250_OUT_INT_CB(WRITELINE(*this, fdc37c93x_device, irq_serial2_w)) + MCFG_DEVICE_ADD("serport0", RS232_PORT, isa_com, "microsoft_mouse") + MCFG_RS232_RXD_HANDLER(WRITELINE("uart_0", ins8250_uart_device, rx_w)) + MCFG_RS232_DCD_HANDLER(WRITELINE("uart_0", ins8250_uart_device, dcd_w)) + MCFG_RS232_DSR_HANDLER(WRITELINE("uart_0", ins8250_uart_device, dsr_w)) + MCFG_RS232_RI_HANDLER(WRITELINE("uart_0", ins8250_uart_device, ri_w)) + MCFG_RS232_CTS_HANDLER(WRITELINE("uart_0", ins8250_uart_device, cts_w)) + MCFG_DEVICE_ADD("serport1", RS232_PORT, isa_com, nullptr) + MCFG_RS232_RXD_HANDLER(WRITELINE("uart_1", ins8250_uart_device, rx_w)) + MCFG_RS232_DCD_HANDLER(WRITELINE("uart_1", ins8250_uart_device, dcd_w)) + MCFG_RS232_DSR_HANDLER(WRITELINE("uart_1", ins8250_uart_device, dsr_w)) + MCFG_RS232_RI_HANDLER(WRITELINE("uart_1", ins8250_uart_device, ri_w)) + MCFG_RS232_CTS_HANDLER(WRITELINE("uart_1", ins8250_uart_device, cts_w)) // RTC MCFG_DS12885_ADD("rtc") MCFG_MC146818_IRQ_HANDLER(WRITELINE(*this, fdc37c93x_device, irq_rtc_w)) MCFG_MC146818_CENTURY_INDEX(0x32) // keyboard - MCFG_DEVICE_ADD("pc_kbdc", KBDC8042, 0) - MCFG_KBDC8042_KEYBOARD_TYPE(KBDC8042_PS2) - MCFG_KBDC8042_INPUT_BUFFER_FULL_CB(WRITELINE(*this, fdc37c93x_device, irq_keyboard_w)) - MCFG_KBDC8042_SYSTEM_RESET_CB(WRITELINE(*this, fdc37c93x_device, kbdp20_gp20_reset_w)) - MCFG_KBDC8042_GATE_A20_CB(WRITELINE(*this, fdc37c93x_device, kbdp21_gp25_gatea20_w)) + KBDC8042(config, m_kbdc); + m_kbdc->set_keyboard_type(kbdc8042_device::KBDC8042_PS2); + m_kbdc->input_buffer_full_callback().set(FUNC(fdc37c93x_device::irq_keyboard_w)); + m_kbdc->system_reset_callback().set(FUNC(fdc37c93x_device::kbdp20_gp20_reset_w)); + m_kbdc->gate_a20_callback().set(FUNC(fdc37c93x_device::kbdp21_gp25_gatea20_w)); MACHINE_CONFIG_END WRITE_LINE_MEMBER(fdc37c93x_device::irq_floppy_w) @@ -275,6 +312,20 @@ WRITE_LINE_MEMBER(fdc37c93x_device::irq_parallel_w) request_irq(configuration_registers[LogicalDevice::Parallel][0x70], state ? ASSERT_LINE : CLEAR_LINE); } +WRITE_LINE_MEMBER(fdc37c93x_device::irq_serial1_w) +{ + if (enabled_logical[LogicalDevice::Serial1] == false) + return; + request_irq(configuration_registers[LogicalDevice::Serial1][0x70], state ? ASSERT_LINE : CLEAR_LINE); +} + +WRITE_LINE_MEMBER(fdc37c93x_device::irq_serial2_w) +{ + if (enabled_logical[LogicalDevice::Serial2] == false) + return; + request_irq(configuration_registers[LogicalDevice::Serial2][0x70], state ? ASSERT_LINE : CLEAR_LINE); +} + WRITE_LINE_MEMBER(fdc37c93x_device::irq_rtc_w) { if (enabled_logical[LogicalDevice::RTC] == false) @@ -444,6 +495,64 @@ void fdc37c93x_device::unmap_lpt_addresses() m_isa->unmap_device(base, base + 3); } +void fdc37c93x_device::map_serial1(address_map &map) +{ + map(0x0, 0x7).rw(FUNC(fdc37c93x_device::serial1_read), FUNC(fdc37c93x_device::serial1_write)); +} + +READ8_MEMBER(fdc37c93x_device::serial1_read) +{ + return pc_serial1_comdev->ins8250_r(space, offset, mem_mask); +} + +WRITE8_MEMBER(fdc37c93x_device::serial1_write) +{ + pc_serial1_comdev->ins8250_w(space, offset, data, mem_mask); +} + +void fdc37c93x_device::map_serial1_addresses() +{ + uint16_t base = get_base_address(LogicalDevice::Serial1, 0); + + m_isa->install_device(base, base + 7, *this, &fdc37c93x_device::map_serial1); +} + +void fdc37c93x_device::unmap_serial1_addresses() +{ + uint16_t base = get_base_address(LogicalDevice::Serial1, 0); + + m_isa->unmap_device(base, base + 7); +} + +void fdc37c93x_device::map_serial2(address_map &map) +{ + map(0x0, 0x7).rw(FUNC(fdc37c93x_device::serial2_read), FUNC(fdc37c93x_device::serial2_write)); +} + +READ8_MEMBER(fdc37c93x_device::serial2_read) +{ + return pc_serial2_comdev->ins8250_r(space, offset, mem_mask); +} + +WRITE8_MEMBER(fdc37c93x_device::serial2_write) +{ + pc_serial2_comdev->ins8250_w(space, offset, data, mem_mask); +} + +void fdc37c93x_device::map_serial2_addresses() +{ + uint16_t base = get_base_address(LogicalDevice::Serial2, 0); + + m_isa->install_device(base, base + 7, *this, &fdc37c93x_device::map_serial2); +} + +void fdc37c93x_device::unmap_serial2_addresses() +{ + uint16_t base = get_base_address(LogicalDevice::Serial2, 0); + + m_isa->unmap_device(base, base + 3); +} + void fdc37c93x_device::map_rtc(address_map &map) { map(0x0, 0xf).rw(FUNC(fdc37c93x_device::rtc_read), FUNC(fdc37c93x_device::rtc_write)); @@ -541,6 +650,10 @@ void fdc37c93x_device::remap(int space_id, offs_t start, offs_t end) map_fdc_addresses(); if (enabled_logical[LogicalDevice::Parallel] == true) map_lpt_addresses(); + if (enabled_logical[LogicalDevice::Serial1] == true) + map_serial1_addresses(); + if (enabled_logical[LogicalDevice::Serial2] == true) + map_serial2_addresses(); if (enabled_logical[LogicalDevice::RTC] == true) map_rtc_addresses(); if (enabled_logical[LogicalDevice::Keyboard] == true) @@ -641,6 +754,46 @@ void fdc37c93x_device::write_parallel_configuration_register(int index, int data } } +void fdc37c93x_device::write_serial1_configuration_register(int index, int data) +{ + if (index == 0x30) + { + if (data & 1) + { + if (enabled_logical[LogicalDevice::Serial1] == false) + map_serial1_addresses(); + enabled_logical[LogicalDevice::Serial1] = true; + logerror("Enabled Serial1 at %04X\n", get_base_address(LogicalDevice::Serial1, 0)); + } + else + { + if (enabled_logical[LogicalDevice::Serial1] == true) + unmap_serial1_addresses(); + enabled_logical[LogicalDevice::Serial1] = false; + } + } +} + +void fdc37c93x_device::write_serial2_configuration_register(int index, int data) +{ + if (index == 0x30) + { + if (data & 1) + { + if (enabled_logical[LogicalDevice::Serial2] == false) + map_serial2_addresses(); + enabled_logical[LogicalDevice::Serial2] = true; + logerror("Enabled Serial2 at %04X\n", get_base_address(LogicalDevice::Serial2, 0)); + } + else + { + if (enabled_logical[LogicalDevice::Serial2] == true) + unmap_serial2_addresses(); + enabled_logical[LogicalDevice::Serial2] = false; + } + } +} + void fdc37c93x_device::write_rtc_configuration_register(int index, int data) { if (index == 0x30) diff --git a/src/devices/machine/fdc37c93x.h b/src/devices/machine/fdc37c93x.h index d334a0ab2eb..30150b4b3c3 100644 --- a/src/devices/machine/fdc37c93x.h +++ b/src/devices/machine/fdc37c93x.h @@ -20,6 +20,8 @@ SMSC FDC37C93x Plug and Play Compatible Ultra I/O Controller #include "formats/naslite_dsk.h" // parallel port #include "machine/pc_lpt.h" +// serial port +#include "machine/ins8250.h" // make sure that pckeybrd.cpp 8042kbdc.cpp are present in project @@ -49,6 +51,9 @@ public: DECLARE_WRITE_LINE_MEMBER(drq_floppy_w); // for the internal parallel port DECLARE_WRITE_LINE_MEMBER(irq_parallel_w); + // for the internal serial ports + DECLARE_WRITE_LINE_MEMBER(irq_serial1_w); + DECLARE_WRITE_LINE_MEMBER(irq_serial2_w); // rtc DECLARE_WRITE_LINE_MEMBER(irq_rtc_w); // keyboard @@ -58,9 +63,9 @@ public: void unmap_fdc(address_map &map); void map_lpt(address_map &map); - void unmap_lpt(address_map &map); + void map_serial1(address_map &map); + void map_serial2(address_map &map); void map_rtc(address_map &map); - void unmap_rtc(address_map &map); void map_keyboard(address_map &map); void unmap_keyboard(address_map &map); @@ -68,6 +73,10 @@ public: DECLARE_WRITE8_MEMBER(disabled_write); DECLARE_READ8_MEMBER(lpt_read); DECLARE_WRITE8_MEMBER(lpt_write); + DECLARE_READ8_MEMBER(serial1_read); + DECLARE_WRITE8_MEMBER(serial1_write); + DECLARE_READ8_MEMBER(serial2_read); + DECLARE_WRITE8_MEMBER(serial2_write); DECLARE_READ8_MEMBER(rtc_read); DECLARE_WRITE8_MEMBER(rtc_write); DECLARE_READ8_MEMBER(at_keybc_r); @@ -118,6 +127,8 @@ private: devcb_write_line m_irq9_callback; required_device<pc_fdc_interface> floppy_controller_fdcdev; required_device<pc_lpt_device> pc_lpt_lptdev; + required_device<ns16450_device> pc_serial1_comdev; + required_device<ns16450_device> pc_serial2_comdev; required_device<ds12885_device> ds12885_rtcdev; required_device<kbdc8042_device> m_kbdc; int sysopt_pin; @@ -131,6 +142,10 @@ private: void unmap_fdc_addresses(); void map_lpt_addresses(); void unmap_lpt_addresses(); + void map_serial1_addresses(); + void unmap_serial1_addresses(); + void map_serial2_addresses(); + void unmap_serial2_addresses(); void map_rtc_addresses(); void unmap_rtc_addresses(); void map_keyboard_addresses(); @@ -141,8 +156,8 @@ private: void write_ide1_configuration_register(int index, int data) {} void write_ide2_configuration_register(int index, int data) {} void write_parallel_configuration_register(int index, int data); - void write_serial1_configuration_register(int index, int data) {} - void write_serial2_configuration_register(int index, int data) {} + void write_serial1_configuration_register(int index, int data); + void write_serial2_configuration_register(int index, int data); void write_rtc_configuration_register(int index, int data); void write_keyboard_configuration_register(int index, int data); void write_auxio_configuration_register(int index, int data); diff --git a/src/devices/machine/hdc92x4.cpp b/src/devices/machine/hdc92x4.cpp index 06c0c9a8044..e7c42d31452 100644 --- a/src/devices/machine/hdc92x4.cpp +++ b/src/devices/machine/hdc92x4.cpp @@ -1670,7 +1670,6 @@ void hdc92x4_device::drive_select() // Calculate the head load delays head_load_delay = head_load_delay_enable? m_register_w[DATA] * head_load_timer_increment[m_selected_drive_type] : 0; - if (fm_mode()) head_load_delay <<= 1; LOGMASKED(LOG_SELECT, "DRIVE SELECT command (%02x): head load delay=%d, type=%d, drive=%d, pout=%02x, step_rate=%d\n", current_command(), head_load_delay, m_selected_drive_type, driveparm&3, m_register_w[RETRY_COUNT]&0x0f, pulse_width() + step_time()); @@ -1687,6 +1686,12 @@ void hdc92x4_device::drive_select() m_output1 = (m_selected_drive_number != NODRIVE)? (0x10 << m_selected_drive_number) : 0; m_output1 |= (m_register_w[RETRY_COUNT]&0x0f); LOGMASKED(LOG_AUXBUS, "Setting OUTPUT1 to %02x\n", m_output1); + + // We assume a minimum head delay of 4 ms that compensates for the + // spin-up of the floppy motor, even when no delay is set + if ((m_selected_drive_type == TYPE_FLOPPY5 || m_selected_drive_type == TYPE_FLOPPY8) && (head_load_delay < 4000)) + head_load_delay = 4000; + if (fm_mode()) head_load_delay <<= 1; m_substate = (head_load_delay>0)? HEAD_DELAY : DONE; } diff --git a/src/devices/machine/i82371sb.cpp b/src/devices/machine/i82371sb.cpp index 9408cfe352d..6cd1b331255 100644 --- a/src/devices/machine/i82371sb.cpp +++ b/src/devices/machine/i82371sb.cpp @@ -103,15 +103,15 @@ MACHINE_CONFIG_START(i82371sb_isa_device::device_add_mconfig) MCFG_DEVICE_ADD("isabus", ISA16, 0) MCFG_ISA16_CPU(":maincpu") - MCFG_ISA_OUT_IRQ2_CB(WRITELINE("pic8259_slave", pic8259_device, ir2_w)) // in place of irq 2 on at irq 9 is used MCFG_ISA_OUT_IRQ3_CB(WRITELINE("pic8259_master", pic8259_device, ir3_w)) MCFG_ISA_OUT_IRQ4_CB(WRITELINE("pic8259_master", pic8259_device, ir4_w)) MCFG_ISA_OUT_IRQ5_CB(WRITELINE("pic8259_master", pic8259_device, ir5_w)) MCFG_ISA_OUT_IRQ6_CB(WRITELINE("pic8259_master", pic8259_device, ir6_w)) MCFG_ISA_OUT_IRQ7_CB(WRITELINE("pic8259_master", pic8259_device, ir7_w)) - MCFG_ISA_OUT_IRQ10_CB(WRITELINE("pic8259_slave", pic8259_device, ir3_w)) - MCFG_ISA_OUT_IRQ11_CB(WRITELINE("pic8259_slave", pic8259_device, ir4_w)) - MCFG_ISA_OUT_IRQ12_CB(WRITELINE("pic8259_slave", pic8259_device, ir5_w)) + MCFG_ISA_OUT_IRQ2_CB(WRITELINE("pic8259_slave", pic8259_device, ir1_w)) // in place of irq 2 on at irq 9 is used + MCFG_ISA_OUT_IRQ10_CB(WRITELINE("pic8259_slave", pic8259_device, ir2_w)) + MCFG_ISA_OUT_IRQ11_CB(WRITELINE("pic8259_slave", pic8259_device, ir3_w)) + MCFG_ISA_OUT_IRQ12_CB(WRITELINE("pic8259_slave", pic8259_device, ir4_w)) MCFG_ISA_OUT_IRQ14_CB(WRITELINE("pic8259_slave", pic8259_device, ir6_w)) MCFG_ISA_OUT_IRQ15_CB(WRITELINE("pic8259_slave", pic8259_device, ir7_w)) MCFG_ISA_OUT_DRQ0_CB(WRITELINE("dma8237_1", am9517a_device, dreq0_w)) @@ -123,7 +123,6 @@ MACHINE_CONFIG_START(i82371sb_isa_device::device_add_mconfig) MCFG_ISA_OUT_DRQ7_CB(WRITELINE("dma8237_2", am9517a_device, dreq3_w)) MACHINE_CONFIG_END - i82371sb_isa_device::i82371sb_isa_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : pci_device(mconfig, I82371SB_ISA, tag, owner, clock), m_smi_callback(*this), diff --git a/src/devices/machine/i8255.h b/src/devices/machine/i8255.h index 59ead81e797..3db43e06bb4 100644 --- a/src/devices/machine/i8255.h +++ b/src/devices/machine/i8255.h @@ -74,7 +74,7 @@ class i8255_device : public device_t { public: // construction/destruction - i8255_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + i8255_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); template <class Object> devcb_base &set_in_pa_callback(Object &&cb) { return m_in_pa_cb.set_callback(std::forward<Object>(cb)); } template <class Object> devcb_base &set_in_pb_callback(Object &&cb) { return m_in_pb_cb.set_callback(std::forward<Object>(cb)); } diff --git a/src/devices/machine/i82586.h b/src/devices/machine/i82586.h index 93f45d82574..e45e46fe4f4 100644 --- a/src/devices/machine/i82586.h +++ b/src/devices/machine/i82586.h @@ -6,9 +6,6 @@ #pragma once -#define MCFG_I82586_IRQ_CB(_out_irq) \ - downcast<i82586_base_device &>(*device).set_out_irq_callback(DEVCB_##_out_irq); - class i82586_base_device : public device_t, public device_memory_interface, @@ -157,7 +154,8 @@ public: static const u32 FCS_RESIDUE = 0xdebb20e3; // the residue after computing the fcs over a complete frame (including fcs) - template <class Object> devcb_base &set_out_irq_callback(Object &&cb) { return m_out_irq.set_callback(std::forward<Object>(cb)); } + // callback configuration + auto out_irq_cb() { return m_out_irq.bind(); } DECLARE_WRITE_LINE_MEMBER(ca); virtual void recv_cb(u8 *buf, int length) override; diff --git a/src/devices/machine/i8279.h b/src/devices/machine/i8279.h index 80c492b2b6e..fd78d23ed62 100644 --- a/src/devices/machine/i8279.h +++ b/src/devices/machine/i8279.h @@ -82,6 +82,13 @@ public: template <class Object> devcb_base &set_in_rl_callback(Object &&cb) { return m_in_rl_cb.set_callback(std::forward<Object>(cb)); } template <class Object> devcb_base &set_in_shift_callback(Object &&cb) { return m_in_shift_cb.set_callback(std::forward<Object>(cb)); } template <class Object> devcb_base &set_in_ctrl_callback(Object &&cb) { return m_in_ctrl_cb.set_callback(std::forward<Object>(cb)); } + auto out_irq_callback() { return m_out_irq_cb.bind(); } + auto out_sl_callback() { return m_out_sl_cb.bind(); } + auto out_disp_callback() { return m_out_disp_cb.bind(); } + auto out_bd_callback() { return m_out_bd_cb.bind(); } + auto in_rl_callback() { return m_in_rl_cb.bind(); } + auto in_shift_callback() { return m_in_shift_cb.bind(); } + auto in_ctrl_callback() { return m_in_ctrl_cb.bind(); } // read & write handlers DECLARE_READ8_MEMBER(read); diff --git a/src/devices/machine/idectrl.cpp b/src/devices/machine/idectrl.cpp index 7687cfe673e..17e92488511 100644 --- a/src/devices/machine/idectrl.cpp +++ b/src/devices/machine/idectrl.cpp @@ -86,7 +86,6 @@ void ide_controller_device::write_cs1(offs_t offset, uint16_t data, uint16_t mem } } - DEFINE_DEVICE_TYPE(IDE_CONTROLLER_32, ide_controller_32_device, "idectrl32", "IDE Controller (32-bit)") ide_controller_32_device::ide_controller_32_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : diff --git a/src/devices/machine/idectrl.h b/src/devices/machine/idectrl.h index 546bc2a649b..de5579d3b49 100644 --- a/src/devices/machine/idectrl.h +++ b/src/devices/machine/idectrl.h @@ -30,7 +30,7 @@ class ide_controller_device : public abstract_ata_interface_device { public: - ide_controller_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + ide_controller_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); uint16_t read_cs0(offs_t offset, uint16_t mem_mask = 0xffff); uint16_t read_cs1(offs_t offset, uint16_t mem_mask = 0xffff); diff --git a/src/devices/machine/im6402.h b/src/devices/machine/im6402.h index 6908db0d9c6..7feb7fed1c2 100644 --- a/src/devices/machine/im6402.h +++ b/src/devices/machine/im6402.h @@ -87,6 +87,11 @@ public: template <class Object> devcb_base &set_tbre_wr_callback(Object &&cb) { return m_write_tbre.set_callback(std::forward<Object>(cb)); } template <class Object> devcb_base &set_tre_wr_callback(Object &&cb) { return m_write_tre.set_callback(std::forward<Object>(cb)); } + auto tro_callback() { return m_write_tro.bind(); } + auto dr_callback() { return m_write_dr.bind(); } + auto tbre_callback() { return m_write_tbre.bind(); } + auto tre_callback() { return m_write_tre.bind(); } + DECLARE_READ8_MEMBER( read ) { return m_rbr; } DECLARE_WRITE8_MEMBER( write ); diff --git a/src/devices/machine/intelfsh.h b/src/devices/machine/intelfsh.h index 9f93f40e49c..6a87d243909 100644 --- a/src/devices/machine/intelfsh.h +++ b/src/devices/machine/intelfsh.h @@ -15,97 +15,97 @@ //************************************************************************** #define MCFG_INTEL_28F016S5_ADD(_tag) \ - MCFG_DEVICE_ADD(_tag, INTEL_28F016S5, 0) + MCFG_DEVICE_ADD(_tag, INTEL_28F016S5) #define MCFG_SHARP_LH28F016S_ADD(_tag) \ - MCFG_DEVICE_ADD(_tag, SHARP_LH28F016S, 0) + MCFG_DEVICE_ADD(_tag, SHARP_LH28F016S) #define MCFG_SHARP_LH28F016S_16BIT_ADD(_tag) \ - MCFG_DEVICE_ADD(_tag, SHARP_LH28F016S_16BIT, 0) + MCFG_DEVICE_ADD(_tag, SHARP_LH28F016S_16BIT) #define MCFG_ATMEL_29C010_ADD(_tag) \ - MCFG_DEVICE_ADD(_tag, ATMEL_29C010, 0) + MCFG_DEVICE_ADD(_tag, ATMEL_29C010) #define MCFG_ATMEL_49F4096_ADD(_tag) \ - MCFG_DEVICE_ADD(_tag, ATMEL_49F4096, 0) + MCFG_DEVICE_ADD(_tag, ATMEL_49F4096) #define MCFG_AMD_29F010_ADD(_tag) \ - MCFG_DEVICE_ADD(_tag, AMD_29F010, 0) + MCFG_DEVICE_ADD(_tag, AMD_29F010) #define MCFG_AMD_29F040_ADD(_tag) \ - MCFG_DEVICE_ADD(_tag, AMD_29F040, 0) + MCFG_DEVICE_ADD(_tag, AMD_29F040) #define MCFG_AMD_29F080_ADD(_tag) \ - MCFG_DEVICE_ADD(_tag, AMD_29F080, 0) + MCFG_DEVICE_ADD(_tag, AMD_29F080) #define MCFG_AMD_29F400T_ADD(_tag) \ - MCFG_DEVICE_ADD(_tag, AMD_29F400T, 0) + MCFG_DEVICE_ADD(_tag, AMD_29F400T) #define MCFG_AMD_29F800T_ADD(_tag) \ - MCFG_DEVICE_ADD(_tag, AMD_29F800T, 0) + MCFG_DEVICE_ADD(_tag, AMD_29F800T) #define MCFG_AMD_29F800B_16BIT_ADD(_tag) \ - MCFG_DEVICE_ADD(_tag, AMD_29F800B_16BIT, 0) + MCFG_DEVICE_ADD(_tag, AMD_29F800B_16BIT) #define MCFG_AMD_29LV200T_ADD(_tag) \ - MCFG_DEVICE_ADD(_tag, AMD_29LV200T, 0) + MCFG_DEVICE_ADD(_tag, AMD_29LV200T) #define MCFG_FUJITSU_29F160T_ADD(_tag) \ - MCFG_DEVICE_ADD(_tag, FUJITSU_29F160T, 0) + MCFG_DEVICE_ADD(_tag, FUJITSU_29F160T) #define MCFG_FUJITSU_29F016A_ADD(_tag) \ - MCFG_DEVICE_ADD(_tag, FUJITSU_29F016A, 0) + MCFG_DEVICE_ADD(_tag, FUJITSU_29F016A) #define MCFG_FUJITSU_29DL16X_ADD(_tag) \ - MCFG_DEVICE_ADD(_tag, FUJITSU_29DL16X, 0) + MCFG_DEVICE_ADD(_tag, FUJITSU_29DL16X) #define MCFG_INTEL_E28F400B_ADD(_tag) \ - MCFG_DEVICE_ADD(_tag, INTEL_E28F400B, 0) + MCFG_DEVICE_ADD(_tag, INTEL_E28F400B) #define MCFG_MACRONIX_29L001MC_ADD(_tag) \ - MCFG_DEVICE_ADD(_tag, MACRONIX_29L001MC, 0) + MCFG_DEVICE_ADD(_tag, MACRONIX_29L001MC) #define MCFG_MACRONIX_29LV160TMC_ADD(_tag) \ - MCFG_DEVICE_ADD(_tag, MACRONIX_29LV160TMC, 0) + MCFG_DEVICE_ADD(_tag, MACRONIX_29LV160TMC) #define MCFG_PANASONIC_MN63F805MNP_ADD(_tag) \ - MCFG_DEVICE_ADD(_tag, PANASONIC_MN63F805MNP, 0) + MCFG_DEVICE_ADD(_tag, PANASONIC_MN63F805MNP) #define MCFG_SANYO_LE26FV10N1TS_ADD(_tag) \ - MCFG_DEVICE_ADD(_tag, SANYO_LE26FV10N1TS, 0) + MCFG_DEVICE_ADD(_tag, SANYO_LE26FV10N1TS) #define MCFG_SST_28SF040_ADD(_tag) \ - MCFG_DEVICE_ADD(_tag, SST_28SF040, 0) + MCFG_DEVICE_ADD(_tag, SST_28SF040) #define MCFG_SST_39VF020_ADD(_tag) \ - MCFG_DEVICE_ADD(_tag, SST_39VF020, 0) + MCFG_DEVICE_ADD(_tag, SST_39VF020) #define MCFG_SHARP_LH28F400_ADD(_tag) \ - MCFG_DEVICE_ADD(_tag, SHARP_LH28F400, 0) + MCFG_DEVICE_ADD(_tag, SHARP_LH28F400) #define MCFG_INTEL_E28F008SA_ADD(_tag) \ - MCFG_DEVICE_ADD(_tag, INTEL_E28F008SA, 0) + MCFG_DEVICE_ADD(_tag, INTEL_E28F008SA) #define MCFG_INTEL_TE28F160_ADD(_tag) \ - MCFG_DEVICE_ADD(_tag, INTEL_TE28F160, 0) + MCFG_DEVICE_ADD(_tag, INTEL_TE28F160) #define MCFG_INTEL_TE28F320_ADD(_tag) \ - MCFG_DEVICE_ADD(_tag, INTEL_TE28F320, 0) + MCFG_DEVICE_ADD(_tag, INTEL_TE28F320) #define MCFG_SHARP_UNK128MBIT_ADD(_tag) \ - MCFG_DEVICE_ADD(_tag, SHARP_UNK128MBIT, 0) + MCFG_DEVICE_ADD(_tag, SHARP_UNK128MBIT) #define MCFG_INTEL_28F320J3D_ADD(_tag) \ - MCFG_DEVICE_ADD(_tag, INTEL_28F320J3D, 0) + MCFG_DEVICE_ADD(_tag, INTEL_28F320J3D) #define MCFG_INTEL_28F320J5_ADD(_tag) \ - MCFG_DEVICE_ADD(_tag, INTEL_28F320J5, 0) + MCFG_DEVICE_ADD(_tag, INTEL_28F320J5) #define MCFG_SST_39VF400A_ADD(_tag) \ - MCFG_DEVICE_ADD(_tag, SST_39VF400A, 0) + MCFG_DEVICE_ADD(_tag, SST_39VF400A) #define MCFG_TMS_29F040_ADD(_tag) \ - MCFG_DEVICE_ADD(_tag, TMS_29F040, 0) + MCFG_DEVICE_ADD(_tag, TMS_29F040) //************************************************************************** // TYPE DEFINITIONS @@ -242,188 +242,188 @@ protected: class intel_28f016s5_device : public intelfsh8_device { public: - intel_28f016s5_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + intel_28f016s5_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); }; class fujitsu_29f160t_device : public intelfsh8_device { public: - fujitsu_29f160t_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + fujitsu_29f160t_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); }; class fujitsu_29f016a_device : public intelfsh8_device { public: - fujitsu_29f016a_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + fujitsu_29f016a_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); }; class fujitsu_29dl16x_device : public intelfsh8_device { public: - fujitsu_29dl16x_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + fujitsu_29dl16x_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); }; class atmel_29c010_device : public intelfsh8_device { public: - atmel_29c010_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + atmel_29c010_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); }; class amd_29f010_device : public intelfsh8_device { public: - amd_29f010_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + amd_29f010_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); }; class amd_29f040_device : public intelfsh8_device { public: - amd_29f040_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + amd_29f040_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); }; class amd_29f080_device : public intelfsh8_device { public: - amd_29f080_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + amd_29f080_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); }; class amd_29f400t_device : public intelfsh8_device { public: - amd_29f400t_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + amd_29f400t_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); }; class amd_29f800t_device : public intelfsh8_device { public: - amd_29f800t_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + amd_29f800t_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); }; class amd_29f800b_16bit_device : public intelfsh16_device { public: - amd_29f800b_16bit_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + amd_29f800b_16bit_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); }; class amd_29lv200t_device : public intelfsh8_device { public: - amd_29lv200t_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + amd_29lv200t_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); }; class sharp_lh28f016s_device : public intelfsh8_device { public: - sharp_lh28f016s_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + sharp_lh28f016s_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); }; class sharp_lh28f016s_16bit_device : public intelfsh16_device { public: - sharp_lh28f016s_16bit_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + sharp_lh28f016s_16bit_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); }; class intel_e28f008sa_device : public intelfsh8_device { public: - intel_e28f008sa_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + intel_e28f008sa_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); }; class macronix_29l001mc_device : public intelfsh8_device { public: - macronix_29l001mc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + macronix_29l001mc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); }; class macronix_29lv160tmc_device : public intelfsh8_device { public: - macronix_29lv160tmc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + macronix_29lv160tmc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); }; class panasonic_mn63f805mnp_device : public intelfsh8_device { public: - panasonic_mn63f805mnp_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + panasonic_mn63f805mnp_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); }; class sanyo_le26fv10n1ts_device : public intelfsh8_device { public: - sanyo_le26fv10n1ts_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + sanyo_le26fv10n1ts_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); }; class sst_28sf040_device : public intelfsh8_device { public: - sst_28sf040_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + sst_28sf040_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); }; class sst_39vf020_device : public intelfsh8_device { public: - sst_39vf020_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + sst_39vf020_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); }; class tms_29f040_device : public intelfsh8_device { public: - tms_29f040_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + tms_29f040_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); }; // 16-bit variants class sharp_lh28f400_device : public intelfsh16_device { public: - sharp_lh28f400_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + sharp_lh28f400_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); }; class intel_te28f160_device : public intelfsh16_device { public: - intel_te28f160_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + intel_te28f160_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); }; class intel_te28f320_device : public intelfsh16_device { public: - intel_te28f320_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + intel_te28f320_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); }; class intel_e28f400b_device : public intelfsh16_device { public: - intel_e28f400b_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + intel_e28f400b_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); }; class sharp_unk128mbit_device : public intelfsh16_device { public: - sharp_unk128mbit_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + sharp_unk128mbit_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); }; class intel_28f320j3d_device : public intelfsh16_device { public: - intel_28f320j3d_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + intel_28f320j3d_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); }; class intel_28f320j5_device : public intelfsh16_device { public: - intel_28f320j5_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + intel_28f320j5_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); }; class sst_39vf400a_device : public intelfsh16_device { public: - sst_39vf400a_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + sst_39vf400a_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); }; class atmel_49f4096_device : public intelfsh16_device { public: - atmel_49f4096_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + atmel_49f4096_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); }; diff --git a/src/devices/machine/legscsi.h b/src/devices/machine/legscsi.h index b86bb61505c..fee1b333061 100644 --- a/src/devices/machine/legscsi.h +++ b/src/devices/machine/legscsi.h @@ -13,7 +13,7 @@ class legacy_scsi_host_adapter : public device_t { public: - void set_scsi_port(const char *tag) { m_scsi_port.set_tag(tag); } + template <typename T> void set_scsi_port(T && tag) { m_scsi_port.set_tag(std::forward<T>(tag)); } protected: legacy_scsi_host_adapter(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); diff --git a/src/devices/machine/mb8421.cpp b/src/devices/machine/mb8421.cpp index ceb3b843577..02a25b1b7ad 100644 --- a/src/devices/machine/mb8421.cpp +++ b/src/devices/machine/mb8421.cpp @@ -23,9 +23,9 @@ DEFINE_DEVICE_TYPE(MB8421_MB8431_16BIT, mb8421_mb8431_16_device, "mb8421_mb8431_ //------------------------------------------------- mb8421_master_device::mb8421_master_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock) - : device_t(mconfig, type, tag, owner, clock), - m_intl_handler(*this), - m_intr_handler(*this) + : device_t(mconfig, type, tag, owner, clock) + , m_intl_callback(*this) + , m_intr_callback(*this) { } @@ -48,20 +48,24 @@ mb8421_mb8431_16_device::mb8421_mb8431_16_device(const machine_config &mconfig, } //------------------------------------------------- -// device_start - device-specific startup +// device_resolve_objects - resolve objects that +// may be needed for other devices to set +// initial conditions at start time //------------------------------------------------- -void mb8421_master_device::device_start() +void mb8421_master_device::device_resolve_objects() { // resolve callbacks - m_intl_handler.resolve_safe(); - m_intr_handler.resolve_safe(); + m_intl_callback.resolve_safe(); + m_intr_callback.resolve_safe(); } +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + void mb8421_device::device_start() { - mb8421_master_device::device_start(); - m_ram = make_unique_clear<u8[]>(0x800); // state save @@ -70,8 +74,6 @@ void mb8421_device::device_start() void mb8421_mb8431_16_device::device_start() { - mb8421_master_device::device_start(); - m_ram = make_unique_clear<u16[]>(0x800); // state save @@ -84,8 +86,8 @@ void mb8421_mb8431_16_device::device_start() void mb8421_master_device::device_reset() { - m_intl_handler(0); - m_intr_handler(0); + m_intl_callback(CLEAR_LINE); + m_intr_callback(CLEAR_LINE); } //------------------------------------------------- @@ -100,9 +102,9 @@ void mb8421_master_device::update_intr(offs_t offset) return; if (row == read_or_write::WRITE && offset == (is_right ? 0x7fe : 0x7ff)) - (is_right ? m_intl_handler : m_intr_handler)(1); + (is_right ? m_intl_callback : m_intr_callback)(ASSERT_LINE); else if (row == read_or_write::READ && offset == (is_right ? 0x7ff : 0x7fe)) - (is_right ? m_intr_handler : m_intl_handler)(0); + (is_right ? m_intr_callback : m_intl_callback)(CLEAR_LINE); } //------------------------------------------------- @@ -120,7 +122,7 @@ WRITE8_MEMBER(mb8421_device::left_w) WRITE16_MEMBER(mb8421_mb8431_16_device::left_w) { offset &= 0x7ff; - m_ram[offset] = data; + COMBINE_DATA(&m_ram[offset]); update_intr<read_or_write::WRITE, false>(offset); } @@ -158,7 +160,7 @@ WRITE8_MEMBER(mb8421_device::right_w) WRITE16_MEMBER(mb8421_mb8431_16_device::right_w) { offset &= 0x7ff; - m_ram[offset] = data; + COMBINE_DATA(&m_ram[offset]); update_intr<read_or_write::WRITE, true>(offset); } diff --git a/src/devices/machine/mb8421.h b/src/devices/machine/mb8421.h index e0ac6edd610..35ece9738c0 100644 --- a/src/devices/machine/mb8421.h +++ b/src/devices/machine/mb8421.h @@ -5,6 +5,61 @@ Fujitsu MB8421/22/31/32-90/-90L/-90LL/-12/-12L/-12LL CMOS 16K-bit (2KB) dual-port SRAM +*********************************************************************** + _____________ + _CS(L) 1 |* \_/ | 52 Vcc + _WE(L) 2 | | 51 _CS(R) + _BUSY(L) 3 | | 50 _WE(R) + _INT(L) 4 | | 49 _BUSY(R) + NC 5 | | 48 _INT(R) + A10(L) 6 | | 47 NC + _OE(L) 7 | | 46 A10(R) + A0(L) 8 | | 45 _OE(R) + A1(L) 9 | | 44 A0(R) + A2(L) 10 | | 43 A1(R) + A3(L) 11 | | 42 A2(R) + A4(L) 12 | | 41 A3(R) + A5(L) 13 | MB8421 | 40 A4(R) + A6(L) 14 | MB8431 | 39 A5(R) + A7(L) 15 | | 38 A6(R) + A8(L) 16 | | 37 A7(R) + A9(L) 17 | | 36 A8(R) + I/O0(L) 18 | | 35 A9(R) + I/O1(L) 19 | | 34 I/O7(R) + I/O2(L) 20 | | 33 I/O6(R) + I/O3(L) 21 | | 32 I/O5(R) + I/O4(L) 22 | | 31 I/O4(R) + I/O5(L) 23 | | 30 I/O3(R) + I/O6(L) 24 | | 29 I/O2(R) + I/O7(L) 25 | | 28 I/O1(R) + Vss 26 |_____________| 27 I/O0(R) + + _____________ + _CS(L) 1 |* \_/ | 48 Vcc + _WE(L) 2 | | 47 _CS(R) + _BUSY(L) 3 | | 46 _WE(R) + A10(L) 4 | | 45 _BUSY(R) + _OE(L) 5 | | 44 A10(R) + A0(L) 6 | | 43 _OE(R) + A1(L) 7 | | 42 A0(R) + A2(L) 8 | | 41 A1(R) + A3(L) 9 | | 40 A2(R) + A4(L) 10 | | 39 A3(R) + A5(L) 11 | MB8422 | 38 A4(R) + A6(L) 12 | MB8432 | 37 A5(R) + A7(L) 13 | | 36 A6(R) + A8(L) 14 | | 35 A7(R) + A9(L) 15 | | 34 A8(R) + I/O0(L) 16 | | 33 A9(R) + I/O1(L) 17 | | 32 I/O7(R) + I/O2(L) 18 | | 31 I/O6(R) + I/O3(L) 19 | | 30 I/O5(R) + I/O4(L) 20 | | 29 I/O4(R) + I/O5(L) 21 | | 28 I/O3(R) + I/O6(L) 22 | | 27 I/O2(R) + I/O7(L) 23 | | 26 I/O1(R) + Vss 24 |_____________| 25 I/O0(R) + **********************************************************************/ #ifndef MAME_MACHINE_MB8421_H @@ -14,19 +69,6 @@ //************************************************************************** -// INTERFACE CONFIGURATION MACROS -//************************************************************************** - -// note: INT pins are only available on MB84x1 -// INTL is for the CPU on the left side, INTR for the one on the right -#define MCFG_MB8421_INTL_HANDLER(_devcb) \ - downcast<mb8421_master_device &>(*device).set_intl_handler(DEVCB_##_devcb); - -#define MCFG_MB8421_INTR_HANDLER(_devcb) \ - downcast<mb8421_master_device &>(*device).set_intr_handler(DEVCB_##_devcb); - - -//************************************************************************** // TYPE DEFINITIONS //************************************************************************** @@ -35,9 +77,10 @@ class mb8421_master_device : public device_t { public: - // configuration helpers - template <class Object> devcb_base &set_intl_handler(Object &&cb) { return m_intl_handler.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_intr_handler(Object &&cb) { return m_intr_handler.set_callback(std::forward<Object>(cb)); } + // note: INT pins are only available on MB84x1 + // INTL is for the CPU on the left side, INTR for the one on the right + auto intl_callback() { return m_intl_callback.bind(); } + auto intr_callback() { return m_intr_callback.bind(); } DECLARE_READ_LINE_MEMBER(busy_r) { return 0; } // _BUSY pin - not emulated @@ -45,15 +88,15 @@ protected: mb8421_master_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock); // device-level overrides - virtual void device_start() override; + virtual void device_resolve_objects() override; virtual void device_reset() override; // internal helpers template<read_or_write row, bool is_right> void update_intr(offs_t offset); private: - devcb_write_line m_intl_handler; - devcb_write_line m_intr_handler; + devcb_write_line m_intl_callback; + devcb_write_line m_intr_callback; }; // ======================> mb8421_device @@ -61,9 +104,9 @@ private: class mb8421_device : public mb8421_master_device { public: - mb8421_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + mb8421_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0); - u8 peek(offs_t offset) { return m_ram[offset & 0x7ff]; } + u8 peek(offs_t offset) const { return m_ram[offset & 0x7ff]; } DECLARE_WRITE8_MEMBER(left_w); DECLARE_READ8_MEMBER(left_r); @@ -83,9 +126,9 @@ private: class mb8421_mb8431_16_device : public mb8421_master_device { public: - mb8421_mb8431_16_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + mb8421_mb8431_16_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0); - u16 peek(offs_t offset) { return m_ram[offset & 0x7ff]; } + u16 peek(offs_t offset) const { return m_ram[offset & 0x7ff]; } DECLARE_WRITE16_MEMBER(left_w); DECLARE_READ16_MEMBER(left_r); diff --git a/src/devices/machine/mb89352.h b/src/devices/machine/mb89352.h index dce6fe59ce9..b9723b314d6 100644 --- a/src/devices/machine/mb89352.h +++ b/src/devices/machine/mb89352.h @@ -11,20 +11,14 @@ #include "legscsi.h" -#define MCFG_MB89352A_IRQ_CB(_devcb) \ - downcast<mb89352_device &>(*device).set_irq_callback(DEVCB_##_devcb); - -#define MCFG_MB89352A_DRQ_CB(_devcb) \ - downcast<mb89352_device &>(*device).set_drq_callback(DEVCB_##_devcb); - class mb89352_device : public legacy_scsi_host_adapter { public: // construction/destruction - mb89352_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + mb89352_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); - template <class Object> devcb_base &set_irq_callback(Object &&cb) { return m_irq_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_drq_callback(Object &&cb) { return m_drq_cb.set_callback(std::forward<Object>(cb)); } + auto irq_cb() { return m_irq_cb.bind(); } + auto drq_cb() { return m_drq_cb.bind(); } // any publically accessible interfaces needed for runtime DECLARE_READ8_MEMBER( mb89352_r ); diff --git a/src/devices/machine/mc146818.cpp b/src/devices/machine/mc146818.cpp index c1a391b6ed6..990d6f3ec35 100644 --- a/src/devices/machine/mc146818.cpp +++ b/src/devices/machine/mc146818.cpp @@ -556,7 +556,7 @@ READ8_MEMBER( mc146818_device::read_direct ) break; default: - data = m_data[m_index]; + data = m_data[offset]; break; } @@ -617,7 +617,7 @@ WRITE8_MEMBER( mc146818_device::write_direct ) break; default: - m_data[m_index] = data; + m_data[offset] = data; break; } } diff --git a/src/devices/machine/mc2661.h b/src/devices/machine/mc2661.h index 44e319a292d..9c6decef34c 100644 --- a/src/devices/machine/mc2661.h +++ b/src/devices/machine/mc2661.h @@ -92,6 +92,15 @@ public: template <class Object> devcb_base &set_bkdet_callback(Object &&cb) { return m_write_bkdet.set_callback(std::forward<Object>(cb)); } template <class Object> devcb_base &set_xsync_callback(Object &&cb) { return m_write_xsync.set_callback(std::forward<Object>(cb)); } + auto txd_handler() { return m_write_txd.bind(); } + auto rxrdy_handler() { return m_write_rxrdy.bind(); } + auto txrdy_handler() { return m_write_txrdy.bind(); } + auto rts_handler() { return m_write_rts.bind(); } + auto dtr_handler() { return m_write_dtr.bind(); } + auto txemt_dschg_handler() { return m_write_txemt_dschg.bind(); } + auto bkdet_handler() { return m_write_bkdet.bind(); } + auto xsync_handler() { return m_write_xsync.bind(); } + DECLARE_READ8_MEMBER( read ); DECLARE_WRITE8_MEMBER( write ); diff --git a/src/devices/machine/mc6846.cpp b/src/devices/machine/mc6846.cpp index 56b2a49f786..75c76b8d283 100644 --- a/src/devices/machine/mc6846.cpp +++ b/src/devices/machine/mc6846.cpp @@ -129,7 +129,7 @@ inline uint16_t mc6846_device::counter() if ( m_timer_started ) { attotime delay = m_interval ->remaining( ); - return delay.as_ticks(1000000) / FACTOR; + return attotime_to_clocks(delay) / FACTOR; } else return m_preset; @@ -201,7 +201,7 @@ inline void mc6846_device::timer_launch() case 0x20: /* single-shot */ m_cto = 0; - m_one_shot->reset( attotime::from_usec(FACTOR) ); + m_one_shot->reset(clocks_to_attotime(FACTOR)); break; case 0x30: /* cascaded single-shot */ @@ -214,7 +214,7 @@ inline void mc6846_device::timer_launch() return; } - m_interval->reset( attotime::from_usec(delay) ); + m_interval->reset(clocks_to_attotime(delay)); m_timer_started = 1; m_csr &= ~1; @@ -255,12 +255,12 @@ TIMER_CALLBACK_MEMBER( mc6846_device::timer_expire ) default: logerror( "mc6846 timer mode %i not implemented\n", MODE ); - m_interval->reset( ); + m_interval->reset(); m_timer_started = 0; return; } - m_interval->reset( attotime::from_usec(delay) ); + m_interval->reset(clocks_to_attotime(delay)); m_csr |= 1; update_cto(); diff --git a/src/devices/machine/mc6852.h b/src/devices/machine/mc6852.h index 43076544e45..798529db3ef 100644 --- a/src/devices/machine/mc6852.h +++ b/src/devices/machine/mc6852.h @@ -75,6 +75,11 @@ public: template <class Object> devcb_base &set_sm_dtr_wr_callback(Object &&cb) { return m_write_sm_dtr.set_callback(std::forward<Object>(cb)); } template <class Object> devcb_base &set_tuf_wr_callback(Object &&cb) { return m_write_tuf.set_callback(std::forward<Object>(cb)); } + auto tx_data_callback() { return m_write_tx_data.bind(); } + auto irq_callback() { return m_write_irq.bind(); } + auto sm_dtr_callback() { return m_write_sm_dtr.bind(); } + auto tuf_callback() { return m_write_tuf.bind(); } + DECLARE_READ8_MEMBER( read ); DECLARE_WRITE8_MEMBER( write ); diff --git a/src/devices/machine/mc6854.h b/src/devices/machine/mc6854.h index a43cb4fa57c..99f09f5d3a7 100644 --- a/src/devices/machine/mc6854.h +++ b/src/devices/machine/mc6854.h @@ -14,25 +14,6 @@ #pragma once -#define MC6854_OUT_FRAME_CB(name) void name(uint8_t * data, int length) - - -#define MCFG_MC6854_OUT_IRQ_CB(_devcb) \ - downcast<mc6854_device &>(*device).set_out_irq_callback(DEVCB_##_devcb); - -#define MCFG_MC6854_OUT_TXD_CB(_devcb) \ - downcast<mc6854_device &>(*device).set_out_txd_callback(DEVCB_##_devcb); - -#define MCFG_MC6854_OUT_FRAME_CB(_class, _method) \ - downcast<mc6854_device &>(*device).set_out_frame_callback(mc6854_device::out_frame_delegate(&_class::_method, #_class "::" #_method, this)); - -#define MCFG_MC6854_OUT_RTS_CB(_devcb) \ - downcast<mc6854_device &>(*device).set_out_rts_callback(DEVCB_##_devcb); - -#define MCFG_MC6854_OUT_DTR_CB(_devcb) \ - downcast<mc6854_device &>(*device).set_out_dtr_callback(DEVCB_##_devcb); - - class mc6854_device : public device_t { public: @@ -40,13 +21,23 @@ public: typedef device_delegate<void (uint8_t *data, int length)> out_frame_delegate; - mc6854_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + mc6854_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); + + auto out_irq_cb() { return m_out_irq_cb.bind(); } + auto out_txd_cb() { return m_out_txd_cb.bind(); } + auto out_rts_cb() { return m_out_rts_cb.bind(); } + auto out_dtr_cb() { return m_out_dtr_cb.bind(); } - template <class Object> devcb_base &set_out_irq_callback(Object &&cb) { return m_out_irq_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_out_txd_callback(Object &&cb) { return m_out_txd_cb.set_callback(std::forward<Object>(cb)); } template <typename Object> void set_out_frame_callback(Object &&cb) { m_out_frame_cb = std::forward<Object>(cb); } - template <class Object> devcb_base &set_out_rts_callback(Object &&cb) { return m_out_rts_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_out_dtr_callback(Object &&cb) { return m_out_dtr_cb.set_callback(std::forward<Object>(cb)); } + void set_out_frame_callback(out_frame_delegate callback) { m_out_frame_cb = callback; } + template <class FunctionClass> void set_out_frame_callback(const char *devname, void (FunctionClass::*callback)(uint8_t *, int), const char *name) + { + set_out_frame_callback(out_frame_delegate(callback, name, devname, static_cast<FunctionClass *>(nullptr))); + } + template <class FunctionClass> void set_out_frame_callback(void (FunctionClass::*callback)(uint8_t *, int), const char *name) + { + set_out_frame_callback(out_frame_delegate(callback, name, nullptr, static_cast<FunctionClass *>(nullptr))); + } /* interface to CPU via address/data bus*/ DECLARE_READ8_MEMBER( read ); diff --git a/src/devices/machine/mc68901.h b/src/devices/machine/mc68901.h index efba92e734b..d1598b41a00 100644 --- a/src/devices/machine/mc68901.h +++ b/src/devices/machine/mc68901.h @@ -42,47 +42,6 @@ //************************************************************************** -// INTERFACE CONFIGURATION MACROS -//************************************************************************** - -#define MCFG_MC68901_TIMER_CLOCK(_clk) \ - downcast<mc68901_device &>(*device).set_timer_clock(_clk); - -#define MCFG_MC68901_RX_CLOCK(_clk) \ - downcast<mc68901_device &>(*device).set_rx_clock(_clk); - -#define MCFG_MC68901_TX_CLOCK(_clk) \ - downcast<mc68901_device &>(*device).set_tx_clock(_clk); - -#define MCFG_MC68901_OUT_IRQ_CB(_devcb) \ - downcast<mc68901_device &>(*device).set_out_irq_callback(DEVCB_##_devcb); - -#define MCFG_MC68901_OUT_GPIO_CB(_devcb) \ - downcast<mc68901_device &>(*device).set_out_gpio_callback(DEVCB_##_devcb); - -#define MCFG_MC68901_OUT_TAO_CB(_devcb) \ - downcast<mc68901_device &>(*device).set_out_tao_callback(DEVCB_##_devcb); - -#define MCFG_MC68901_OUT_TBO_CB(_devcb) \ - downcast<mc68901_device &>(*device).set_out_tbo_callback(DEVCB_##_devcb); - -#define MCFG_MC68901_OUT_TCO_CB(_devcb) \ - downcast<mc68901_device &>(*device).set_out_tco_callback(DEVCB_##_devcb); - -#define MCFG_MC68901_OUT_TDO_CB(_devcb) \ - downcast<mc68901_device &>(*device).set_out_tdo_callback(DEVCB_##_devcb); - -#define MCFG_MC68901_OUT_SO_CB(_devcb) \ - downcast<mc68901_device &>(*device).set_out_so_callback(DEVCB_##_devcb); - -/*#define MCFG_MC68901_OUT_RR_CB(_devcb) \ - downcast<mc68901_device &>(*device).set_out_rr_callback(DEVCB_##_devcb); - -#define MCFG_MC68901_OUT_TR_CB(_devcb) \ - downcast<mc68901_device &>(*device).set_out_tr_callback(DEVCB_##_devcb);*/ - - -//************************************************************************** // TYPE DEFINITIONS //************************************************************************** @@ -102,15 +61,16 @@ public: void set_timer_clock(const XTAL &xtal) { set_timer_clock(xtal.value()); } void set_rx_clock(const XTAL &xtal) { set_rx_clock(xtal.value()); } void set_tx_clock(const XTAL &xtal) { set_tx_clock(xtal.value()); } - template <class Object> devcb_base &set_out_irq_callback(Object &&cb) { return m_out_irq_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_out_gpio_callback(Object &&cb) { return m_out_gpio_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_out_tao_callback(Object &&cb) { return m_out_tao_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_out_tbo_callback(Object &&cb) { return m_out_tbo_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_out_tco_callback(Object &&cb) { return m_out_tco_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_out_tdo_callback(Object &&cb) { return m_out_tdo_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_out_so_callback(Object &&cb) { return m_out_so_cb.set_callback(std::forward<Object>(cb)); } - //template <class Object> devcb_base &set_rr_callback(Object &&cb) { return m_out_rr_cb.set_callback(std::forward<Object>(cb)); } - //template <class Object> devcb_base &set_tr_callback(Object &&cb) { return m_out_tr_cb.set_callback(std::forward<Object>(cb)); } + + auto out_irq_cb() { return m_out_irq_cb.bind(); } + auto out_gpio_cb() { return m_out_gpio_cb.bind(); } + auto out_tao_cb() { return m_out_tao_cb.bind(); } + auto out_tbo_cb() { return m_out_tbo_cb.bind(); } + auto out_tco_cb() { return m_out_tco_cb.bind(); } + auto out_tdo_cb() { return m_out_tdo_cb.bind(); } + auto out_so_cb() { return m_out_so_cb.bind(); } + //auto out_rr_cb() { return m_out_rr_cb.bind(); } + //auto out_tr_cb() { return m_out_tr_cb.bind(); } DECLARE_READ8_MEMBER( read ); DECLARE_WRITE8_MEMBER( write ); diff --git a/src/devices/machine/ncr5380.h b/src/devices/machine/ncr5380.h index d6f5eb76d06..b2f7e4f2509 100644 --- a/src/devices/machine/ncr5380.h +++ b/src/devices/machine/ncr5380.h @@ -46,6 +46,7 @@ public: ncr5380_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); template <class Object> devcb_base &set_irq_callback(Object &&cb) { return m_irq_cb.set_callback(std::forward<Object>(cb)); } + auto irq_callback() { return m_irq_cb.bind(); } // our API uint8_t ncr5380_read_reg(uint32_t offset); diff --git a/src/devices/machine/ncr539x.h b/src/devices/machine/ncr539x.h index 2f024d643ec..8caa26c25a1 100644 --- a/src/devices/machine/ncr539x.h +++ b/src/devices/machine/ncr539x.h @@ -28,6 +28,8 @@ public: template <class Object> devcb_base &set_out_irq_callback(Object &&cb) { return m_out_irq_cb.set_callback(std::forward<Object>(cb)); } template <class Object> devcb_base &set_out_drq_callback(Object &&cb) { return m_out_drq_cb.set_callback(std::forward<Object>(cb)); } + auto irq_callback() { return m_out_irq_cb.bind(); } + auto drq_callback() { return m_out_drq_cb.bind(); } // our API DECLARE_READ8_MEMBER(read); diff --git a/src/devices/machine/netlist.h b/src/devices/machine/netlist.h index 050ffad69d6..828e2497af6 100644 --- a/src/devices/machine/netlist.h +++ b/src/devices/machine/netlist.h @@ -284,7 +284,7 @@ class netlist_mame_analog_input_device : public device_t, public netlist_mame_su public: // construction/destruction - netlist_mame_analog_input_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + netlist_mame_analog_input_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); void set_name(const char *param_name) { m_param_name = param_name; } @@ -323,7 +323,7 @@ public: typedef device_delegate<void (const double, const attotime &)> output_delegate; // construction/destruction - netlist_mame_analog_output_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + netlist_mame_analog_output_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); void set_params(const char *in_name, output_delegate &&adelegate); @@ -347,9 +347,17 @@ public: typedef device_delegate<void(const int, const attotime &)> output_delegate; // construction/destruction - netlist_mame_logic_output_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + netlist_mame_logic_output_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); void set_params(const char *in_name, output_delegate &&adelegate); + template <class FunctionClass> void set_params(const char *in_name, void (FunctionClass::*callback)(const int, const attotime &), const char *name) + { + set_params(in_name, output_delegate(callback, name, nullptr, static_cast<FunctionClass *>(nullptr))); + } + template <class FunctionClass> void set_params(const char *in_name, const char *devname, void (FunctionClass::*callback)(const int, const attotime &), const char *name) + { + set_params(in_name, output_delegate(callback, name, devname, static_cast<FunctionClass *>(nullptr))); + } protected: // device-level overrides @@ -369,7 +377,7 @@ class netlist_mame_int_input_device : public device_t, public netlist_mame_sub_i { public: // construction/destruction - netlist_mame_int_input_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + netlist_mame_int_input_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); void set_params(const char *param_name, const uint32_t mask, const uint32_t shift); @@ -403,7 +411,7 @@ class netlist_mame_logic_input_device : public device_t, public netlist_mame_sub { public: // construction/destruction - netlist_mame_logic_input_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + netlist_mame_logic_input_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); void set_params(const char *param_name, const uint32_t shift); @@ -435,7 +443,7 @@ class netlist_mame_ram_pointer_device : public device_t, public netlist_mame_sub { public: // construction/destruction - netlist_mame_ram_pointer_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + netlist_mame_ram_pointer_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); uint8_t* ptr() const { return m_data; } @@ -460,7 +468,7 @@ class netlist_mame_stream_input_device : public device_t, public netlist_mame_su { public: // construction/destruction - netlist_mame_stream_input_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + netlist_mame_stream_input_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); void set_params(int channel, const char *param_name); @@ -481,7 +489,7 @@ class netlist_mame_stream_output_device : public device_t, public netlist_mame_s { public: // construction/destruction - netlist_mame_stream_output_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + netlist_mame_stream_output_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); void set_params(int channel, const char *out_name); diff --git a/src/devices/machine/nvram.h b/src/devices/machine/nvram.h index 8a1e031844d..dd5a89660ba 100644 --- a/src/devices/machine/nvram.h +++ b/src/devices/machine/nvram.h @@ -83,6 +83,14 @@ public: m_default_value = DEFAULT_CUSTOM; m_custom_handler = std::forward<Object>(cb); } + template <class FunctionClass> void set_custom_handler(const char *devname, void (FunctionClass::*callback)(nvram_device &, void *, size_t), const char *name) + { + set_custom_handler(init_delegate(callback, name, devname, static_cast<FunctionClass *>(nullptr))); + } + template <class FunctionClass> void set_custom_handler(void (FunctionClass::*callback)(nvram_device &, void *, size_t), const char *name) + { + set_custom_handler(init_delegate(callback, name, nullptr, static_cast<FunctionClass *>(nullptr))); + } // controls void set_base(void *base, size_t length) { m_base = base; m_length = length; } diff --git a/src/devices/machine/pla.cpp b/src/devices/machine/pla.cpp index a17335628f5..2b73ba36a14 100644 --- a/src/devices/machine/pla.cpp +++ b/src/devices/machine/pla.cpp @@ -13,13 +13,14 @@ DEFINE_DEVICE_TYPE(PLA, pla_device, "pla", "PLA") +DEFINE_DEVICE_TYPE(PLS100, pls100_device, "pls100", "82S100-series PLA") //------------------------------------------------- // pla_device - constructor //------------------------------------------------- -pla_device::pla_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, PLA, tag, owner, clock) +pla_device::pla_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, type, tag, owner, clock) , m_region(*this, DEVICE_SELF) , m_format(FMT::JEDBIN) , m_inputs(0) @@ -31,6 +32,18 @@ pla_device::pla_device(const machine_config &mconfig, const char *tag, device_t { } +pla_device::pla_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : pla_device(mconfig, PLA, tag, owner, clock) +{ +} + +pls100_device::pls100_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : pla_device(mconfig, PLS100, tag, owner, clock) +{ + set_num_inputs(16); + set_num_outputs(8); + set_num_terms(48); +} //------------------------------------------------- // device_start - device-specific startup diff --git a/src/devices/machine/pla.h b/src/devices/machine/pla.h index 94d7a178ea6..0d3fef80cc0 100644 --- a/src/devices/machine/pla.h +++ b/src/devices/machine/pla.h @@ -11,9 +11,6 @@ #pragma once - - - ///************************************************************************* // INTERFACE CONFIGURATION MACROS ///************************************************************************* @@ -52,7 +49,7 @@ GND 14 |_____________| 15 F3 */ #define MCFG_PLS100_ADD(tag) \ - MCFG_PLA_ADD((tag), 16, 8, 48) + MCFG_DEVICE_ADD((tag), PLS100) // MOS 8721 PLA // TODO: actual number of terms is unknown @@ -78,6 +75,7 @@ public: // construction/destruction pla_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + pla_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); // configuration helpers void set_num_inputs(uint32_t i) { m_inputs = i; } @@ -125,7 +123,13 @@ private: }; -// device type definition +class pls100_device : public pla_device +{ +public: + pls100_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); +}; + DECLARE_DEVICE_TYPE(PLA, pla_device) +DECLARE_DEVICE_TYPE(PLS100, pls100_device) #endif // MAME_MACHINE_PLA_H diff --git a/src/devices/machine/ram.h b/src/devices/machine/ram.h index dcf005cc1ee..19b487517b5 100644 --- a/src/devices/machine/ram.h +++ b/src/devices/machine/ram.h @@ -60,7 +60,7 @@ public: using extra_option_vector = std::vector<extra_option>; // construction/destruction - ram_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock); + ram_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock = 0); // accessors u32 size() const { return m_size; } diff --git a/src/devices/machine/ripple_counter.h b/src/devices/machine/ripple_counter.h index c322b4fa718..5a4ad3e1295 100644 --- a/src/devices/machine/ripple_counter.h +++ b/src/devices/machine/ripple_counter.h @@ -12,19 +12,6 @@ #pragma once //************************************************************************** -// CONFIGURATION MACROS -//************************************************************************** - -#define MCFG_RIPPLE_COUNTER_STAGES(_stages) \ - downcast<ripple_counter_device &>(*device).set_stages(_stages); - -// output callbacks -#define MCFG_RIPPLE_COUNTER_COUNT_OUT_CB(_devcb) \ - downcast<ripple_counter_device &>(*device).set_count_out_cb(DEVCB_##_devcb); -#define MCFG_RIPPLE_COUNTER_ROM_OUT_CB(_devcb) \ - downcast<ripple_counter_device &>(*device).set_rom_out_cb(DEVCB_##_devcb); - -//************************************************************************** // TYPE DEFINITIONS //************************************************************************** @@ -34,12 +21,10 @@ class ripple_counter_device : public device_t, public device_rom_interface { public: // construction/destruction - ripple_counter_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + ripple_counter_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0); // configuration void set_stages(u8 stages) { m_count_mask = (1U << stages) - 1; set_rom_addr_width(stages); } - template<class Object> devcb_base &set_count_out_cb(Object &&cb) { return m_count_out_cb.set_callback(std::forward<Object>(cb)); } - template<class Object> devcb_base &set_rom_out_cb(Object &&cb) { return m_rom_out_cb.set_callback(std::forward<Object>(cb)); } auto count_out_cb() { return m_count_out_cb.bind(); } auto rom_out_cb() { return m_rom_out_cb.bind(); } diff --git a/src/devices/machine/sonydriv.cpp b/src/devices/machine/sonydriv.cpp index c18b6429ae0..f6f1a604648 100644 --- a/src/devices/machine/sonydriv.cpp +++ b/src/devices/machine/sonydriv.cpp @@ -578,3 +578,9 @@ void sonydriv_floppy_image_device::call_unload() legacy_floppy_image_device::call_unload(); } + +void sonydriv_floppy_image_device::legacy_2_drives_add(machine_config &mconfig, const floppy_interface *config) +{ + FLOPPY_SONY(mconfig, FLOPPY_0).set_floppy_config(config); + FLOPPY_SONY(mconfig, FLOPPY_1).set_floppy_config(config); +} diff --git a/src/devices/machine/sonydriv.h b/src/devices/machine/sonydriv.h index 82404805a16..f547d93216b 100644 --- a/src/devices/machine/sonydriv.h +++ b/src/devices/machine/sonydriv.h @@ -40,7 +40,9 @@ class sonydriv_floppy_image_device : public legacy_floppy_image_device { public: // construction/destruction - sonydriv_floppy_image_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + sonydriv_floppy_image_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); + + static void legacy_2_drives_add(machine_config &mconfig, const floppy_interface *config); virtual void call_unload() override; diff --git a/src/devices/machine/timekpr.h b/src/devices/machine/timekpr.h index c0f7fcdc83a..4742a1b1ae8 100644 --- a/src/devices/machine/timekpr.h +++ b/src/devices/machine/timekpr.h @@ -23,17 +23,6 @@ //************************************************************************** -// INTERFACE CONFIGURATION MACROS -//************************************************************************** - -#define MCFG_M48T37_RESET_HANDLER(_devcb) \ - downcast<timekeeper_device &>(*device).set_reset_handler(DEVCB_##_devcb); - -#define MCFG_M48T37_IRQ_HANDLER(_devcb) \ - downcast<timekeeper_device &>(*device).set_irq_handler(DEVCB_##_devcb); - - -//************************************************************************** // TYPE DEFINITIONS //************************************************************************** @@ -46,8 +35,9 @@ public: DECLARE_WRITE8_MEMBER( write ); DECLARE_READ8_MEMBER( read ); DECLARE_WRITE8_MEMBER(watchdog_write); - template <class Object> devcb_base &set_reset_handler(Object &&cb) { return m_reset_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_irq_handler(Object &&cb) { return m_irq_cb.set_callback(std::forward<Object>(cb)); } + + auto reset_cb() { return m_reset_cb.bind(); } + auto irq_cb() { return m_irq_cb.bind(); } protected: // construction/destruction @@ -105,37 +95,37 @@ protected: class m48t02_device : public timekeeper_device { public: - m48t02_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + m48t02_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); }; class m48t35_device : public timekeeper_device { public: - m48t35_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + m48t35_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); }; class m48t37_device : public timekeeper_device { public: - m48t37_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + m48t37_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); }; class m48t58_device : public timekeeper_device { public: - m48t58_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + m48t58_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); }; class mk48t08_device : public timekeeper_device { public: - mk48t08_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + mk48t08_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); }; class mk48t12_device : public timekeeper_device { public: - mk48t12_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + mk48t12_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); }; // device type definition diff --git a/src/devices/machine/tms5501.cpp b/src/devices/machine/tms5501.cpp index 54d0855bbb0..f7581a30a72 100644 --- a/src/devices/machine/tms5501.cpp +++ b/src/devices/machine/tms5501.cpp @@ -58,7 +58,7 @@ void tms5501_device::io_map(address_map &map) tms5501_device::tms5501_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, TMS5501, tag, owner, clock), device_serial_interface(mconfig, *this), - m_write_irq(*this), + m_write_int(*this), m_write_xmt(*this), m_read_xi(*this), m_write_xo(*this), @@ -82,7 +82,7 @@ tms5501_device::tms5501_device(const machine_config &mconfig, const char *tag, d void tms5501_device::device_start() { // resolve callbacks - m_write_irq.resolve_safe(); + m_write_int.resolve_safe(); m_write_xmt.resolve_safe(); m_read_xi.resolve_safe(0); m_write_xo.resolve_safe(); @@ -496,11 +496,11 @@ void tms5501_device::check_interrupt() if (m_cmd & CMD_IAE) { - m_write_irq(state); + m_write_int(state); } else { - m_write_irq(CLEAR_LINE); + m_write_int(CLEAR_LINE); } } diff --git a/src/devices/machine/tms5501.h b/src/devices/machine/tms5501.h index 8510ccaced3..17a1cd19b87 100644 --- a/src/devices/machine/tms5501.h +++ b/src/devices/machine/tms5501.h @@ -39,24 +39,6 @@ //************************************************************************** -// INTERFACE CONFIGURATION MACROS -//************************************************************************** - -#define MCFG_TMS5501_IRQ_CALLBACK(_write) \ - downcast<tms5501_device &>(*device).set_irq_wr_callback(DEVCB_##_write); - -#define MCFG_TMS5501_XMT_CALLBACK(_write) \ - downcast<tms5501_device &>(*device).set_xmt_wr_callback(DEVCB_##_write); - -#define MCFG_TMS5501_XI_CALLBACK(_read) \ - downcast<tms5501_device &>(*device).set_xi_rd_callback(DEVCB_##_read); - -#define MCFG_TMS5501_XO_CALLBACK(_write) \ - downcast<tms5501_device &>(*device).set_xo_wr_callback(DEVCB_##_write); - - - -//************************************************************************** // TYPE DEFINITIONS //************************************************************************** @@ -69,10 +51,10 @@ public: // construction/destruction tms5501_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template <class Object> devcb_base &set_irq_wr_callback(Object &&cb) { return m_write_irq.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_xmt_wr_callback(Object &&cb) { return m_write_xmt.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_xi_rd_callback(Object &&cb) { return m_read_xi.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_xo_wr_callback(Object &&cb) { return m_write_xo.set_callback(std::forward<Object>(cb)); } + auto int_callback() { return m_write_int.bind(); } + auto xmt_callback() { return m_write_xmt.bind(); } + auto xi_callback() { return m_read_xi.bind(); } + auto xo_callback() { return m_write_xo.bind(); } DECLARE_WRITE_LINE_MEMBER( rcv_w ); @@ -167,7 +149,7 @@ private: void set_interrupt(uint8_t mask); void check_interrupt(); - devcb_write_line m_write_irq; + devcb_write_line m_write_int; devcb_write_line m_write_xmt; devcb_read8 m_read_xi; devcb_write8 m_write_xo; diff --git a/src/devices/machine/upd765.cpp b/src/devices/machine/upd765.cpp index d753859ede7..8d324ea91a7 100644 --- a/src/devices/machine/upd765.cpp +++ b/src/devices/machine/upd765.cpp @@ -584,6 +584,15 @@ void upd765_family_device::disable_transfer() void upd765_family_device::fifo_push(uint8_t data, bool internal) { + // MZ: A bit speculative. These lines help to avoid some FIFO mess-up + // with the HX5102 that happens when WRITE DATA fails to find the sector + // but the host already starts pushing the sector data. Should not hurt. + if (fifo_expected == 0) + { + LOGFIFO("Fifo not expecting data, discarding\n"); + return; + } + if(fifo_pos == 16) { if(internal) { if(!(st1 & ST1_OR)) diff --git a/src/devices/machine/watchdog.h b/src/devices/machine/watchdog.h index cb01199e417..d7cb3d25db7 100644 --- a/src/devices/machine/watchdog.h +++ b/src/devices/machine/watchdog.h @@ -31,12 +31,7 @@ class watchdog_timer_device : public device_t { public: // construction/destruction - watchdog_timer_device(const machine_config &mconfig, const char *tag, device_t *owner) - : watchdog_timer_device(mconfig, tag, owner, (uint32_t)0) - { - } - - watchdog_timer_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + watchdog_timer_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); // inline configuration helpers void set_vblank_count(const char *screen_tag, int32_t count) { m_screen_tag = screen_tag; m_vblank_count = count; } diff --git a/src/devices/machine/wd33c93.h b/src/devices/machine/wd33c93.h index 6f3e8ad2408..d7d14d91e37 100644 --- a/src/devices/machine/wd33c93.h +++ b/src/devices/machine/wd33c93.h @@ -19,9 +19,15 @@ class wd33c93_device : public legacy_scsi_host_adapter { public: // construction/destruction + wd33c93_device(const machine_config &mconfig, const char *tag, device_t *owner) + : wd33c93_device(mconfig, tag, owner, (uint32_t)0) + { + } + wd33c93_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); template<class Object> devcb_base &set_irq_callback(Object &&cb) { return m_irq_cb.set_callback(std::forward<Object>(cb)); } + auto irq_cb() { return m_irq_cb.bind(); } DECLARE_READ8_MEMBER(read); DECLARE_WRITE8_MEMBER(write); diff --git a/src/devices/machine/z80scc.cpp b/src/devices/machine/z80scc.cpp index 209202b4bde..66c3e0b1af6 100644 --- a/src/devices/machine/z80scc.cpp +++ b/src/devices/machine/z80scc.cpp @@ -1459,13 +1459,15 @@ void z80scc_channel::update_rts() if (m_wr5 & WR5_RTS) { // when the RTS bit is set, the _RTS output goes low - set_rts(0); m_rts = 1; + set_rts(!m_rts); } else { // when the RTS bit is reset, the _RTS output goes high after the transmitter empties m_rts = 0; + if (!(m_wr3 & WR3_AUTO_ENABLES) || (m_rr1 & RR1_ALL_SENT)) + set_rts(!m_rts); } // data terminal ready output follows the state programmed into the DTR bit*/ @@ -2621,8 +2623,6 @@ void z80scc_channel::data_write(uint8_t data) LOGTX("- TX FIFO has more room, setting TBE bit\n"); m_rr0 |= RR0_TX_BUFFER_EMPTY; // or there is a slot in the FIFO available } - LOGTX("- TX FIFO now has data to send, clearing ALL_SENT bit\n"); - m_rr1 &= ~RR1_ALL_SENT; // All is definitelly not sent anymore } check_waitrequest(); @@ -2636,7 +2636,8 @@ void z80scc_channel::data_write(uint8_t data) LOGTX("- Setting up transmitter\n"); transmit_register_setup(m_tx_data_fifo[m_tx_fifo_rp]); // Load the shift register, reload is done in tra_complete() m_tx_fifo_rp_step(); - m_rr1 |= RR1_ALL_SENT; // Now stuff is on its way again + LOGTX("- TX shift register loaded, clearing ALL_SENT bit\n"); + m_rr1 &= ~RR1_ALL_SENT; // All is definitely not sent anymore m_rr0 |= RR0_TX_BUFFER_EMPTY; // And there is a slot in the FIFO available } else @@ -2730,7 +2731,7 @@ WRITE_LINE_MEMBER( z80scc_channel::cts_w ) { LOG("\"%s\"%s: %c : CTS %u\n", owner()->tag(), FUNCNAME, 'A' + m_index, state); - if ((m_rr0 & RR0_CTS) != (state ? RR0_CTS : 0)) // SCC change detection logic + if ((m_rr0 & RR0_CTS) != (state ? 0 : RR0_CTS)) // SCC change detection logic { // enable transmitter if in auto enables mode if (!state) @@ -2743,7 +2744,7 @@ WRITE_LINE_MEMBER( z80scc_channel::cts_w ) } } - if (state) m_rr0 |= RR0_CTS; else m_rr0 &= ~RR0_CTS; // Raw pin/status value + if (state) m_rr0 &= ~RR0_CTS; else m_rr0 |= RR0_CTS; // Raw pin/status value if (m_extint_latch == 0 && (m_wr1 & WR1_EXT_INT_ENABLE) && (m_wr15 & WR15_CTS)) { @@ -2767,7 +2768,7 @@ WRITE_LINE_MEMBER( z80scc_channel::dcd_w ) { LOGDCD("\"%s\": %c : DCD %u\n", owner()->tag(), 'A' + m_index, state); - if ((m_rr0 & RR0_DCD) != (state ? RR0_DCD : 0)) // SCC change detection logic + if ((m_rr0 & RR0_DCD) != (state ? 0 : RR0_DCD)) // SCC change detection logic { // enable transmitter if in auto enables mode if (!state) @@ -2783,7 +2784,7 @@ WRITE_LINE_MEMBER( z80scc_channel::dcd_w ) } } - if (state) m_rr0 |= RR0_DCD; else m_rr0 &= ~RR0_DCD; // Raw pin/status value + if (state) m_rr0 &= ~RR0_DCD; else m_rr0 |= RR0_DCD; // Raw pin/status value if (m_extint_latch == 0 && (m_wr1 & WR1_EXT_INT_ENABLE) && (m_wr15 & WR15_DCD)) { @@ -2799,25 +2800,42 @@ WRITE_LINE_MEMBER( z80scc_channel::dcd_w ) } } - -//------------------------------------------------- -// ri_w - ring indicator handler -//------------------------------------------------- -WRITE_LINE_MEMBER( z80scc_channel::ri_w ) -{ - LOGINT("\"%s\": %c : RI %u - not implemented\n", owner()->tag(), 'A' + m_index, state); -} - //------------------------------------------------- // sync_w - sync handler for external sync mode //------------------------------------------------- WRITE_LINE_MEMBER( z80scc_channel::sync_w ) { LOGSYNC("\"%s\": %c : SYNC %u\n", owner()->tag(), 'A' + m_index, state); - if ((m_rr0 & RR0_SYNC_HUNT) != (state ? RR0_SYNC_HUNT : 0)) // SCC change detection logic + + /* + * The /SYNC pin is a general purpose input whose state is reported in the + * Sync/Hunt bit in RR0. If the crystal oscillator is enabled, this pin is + * not available and the Sync/Hunt bit is forced to 0. Otherwise, the /SYNC + * pin may be used to carry the Ring Indicator signal. + */ + if (!(m_wr11 & WR11_RCVCLK_TYPE)) { - if (state) m_rr0 |= RR0_SYNC_HUNT; else m_rr0 &= ~RR0_SYNC_HUNT; // Raw pin/status value + // check for state change + if ((m_rr0 & RR0_SYNC_HUNT) != (state ? 0 : RR0_SYNC_HUNT)) + { + // record pin state (inverted) + if (state) + m_rr0 &= ~RR0_SYNC_HUNT; + else + m_rr0 |= RR0_SYNC_HUNT; + + // trigger an external interrupt if enabled + if (m_extint_latch == 0 && (m_wr1 & WR1_EXT_INT_ENABLE) && (m_wr15 & WR15_SYNC)) + { + m_extint_latch = 1; + m_extint_states = m_rr0; + + m_uart->trigger_interrupt(m_index, INT_EXTERNAL); + } + } } + else + fatalerror("/SYNC cannot be used as an input in RTxC-XTAL clock mode."); } //------------------------------------------------- diff --git a/src/devices/machine/z80scc.h b/src/devices/machine/z80scc.h index 50ba0ee0c02..b4c92f01385 100644 --- a/src/devices/machine/z80scc.h +++ b/src/devices/machine/z80scc.h @@ -176,7 +176,6 @@ public: DECLARE_WRITE_LINE_MEMBER( write_rx ); DECLARE_WRITE_LINE_MEMBER( cts_w ); DECLARE_WRITE_LINE_MEMBER( dcd_w ); - DECLARE_WRITE_LINE_MEMBER( ri_w ); DECLARE_WRITE_LINE_MEMBER( rxc_w ); DECLARE_WRITE_LINE_MEMBER( txc_w ); DECLARE_WRITE_LINE_MEMBER( sync_w ); @@ -388,6 +387,22 @@ public: template <unsigned N, class Object> devcb_base &set_out_txdrq_callback(Object &&cb) { return m_out_txdrq_cb[N].set_callback(std::forward<Object>(cb)); } template <class Object> devcb_base &set_out_int_callback(Object &&cb) { return m_out_int_cb.set_callback(std::forward<Object>(cb)); } + auto out_txda_callback() { return m_out_txd_cb[0].bind(); } + auto out_dtra_callback() { return m_out_dtr_cb[0].bind(); } + auto out_rtsa_callback() { return m_out_rts_cb[0].bind(); } + auto out_wreqa_callback() { return m_out_wreq_cb[0].bind(); } + auto out_synca_callback() { return m_out_sync_cb[0].bind(); } + auto out_rxdrqa_callback() { return m_out_rxdrq_cb[0].bind(); } + auto out_txdrqa_callback() { return m_out_txdrq_cb[0].bind(); } + auto out_txdb_callback() { return m_out_txd_cb[1].bind(); } + auto out_dtrb_callback() { return m_out_dtr_cb[1].bind(); } + auto out_rtsb_callback() { return m_out_rts_cb[1].bind(); } + auto out_wreqb_callback() { return m_out_wreq_cb[1].bind(); } + auto out_syncb_callback() { return m_out_sync_cb[1].bind(); } + auto out_rxdrqb_callback() { return m_out_rxdrq_cb[1].bind(); } + auto out_txdrqb_callback() { return m_out_txdrq_cb[1].bind(); } + auto out_int_callback() { return m_out_int_cb.bind(); } + void set_cputag(const char *tag) { m_cputag = tag; } void configure_channels(int rxa, int txa, int rxb, int txb) @@ -433,8 +448,6 @@ public: DECLARE_WRITE_LINE_MEMBER( ctsb_w ) { m_chanB->cts_w(state); } DECLARE_WRITE_LINE_MEMBER( dcda_w ) { m_chanA->dcd_w(state); } DECLARE_WRITE_LINE_MEMBER( dcdb_w ) { m_chanB->dcd_w(state); } - DECLARE_WRITE_LINE_MEMBER( ria_w ) { m_chanA->ri_w(state); } - DECLARE_WRITE_LINE_MEMBER( rib_w ) { m_chanB->ri_w(state); } DECLARE_WRITE_LINE_MEMBER( rxca_w ) { m_chanA->rxc_w(state); } DECLARE_WRITE_LINE_MEMBER( rxcb_w ) { m_chanB->rxc_w(state); } DECLARE_WRITE_LINE_MEMBER( txca_w ) { m_chanA->txc_w(state); } diff --git a/src/devices/sound/2203intf.cpp b/src/devices/sound/2203intf.cpp index 8b415d08b5d..faf3072e94e 100644 --- a/src/devices/sound/2203intf.cpp +++ b/src/devices/sound/2203intf.cpp @@ -40,7 +40,7 @@ void ym2203_device::device_timer(emu_timer &timer, device_timer_id id, int param void ym2203_device::timer_handler(int c, int count, int clock) { - if( count == 0 ) + if( count == 0 || clock == 0) { /* Reset FM Timer */ m_timer[c]->enable(false); } diff --git a/src/devices/sound/2608intf.cpp b/src/devices/sound/2608intf.cpp index 959f29e14b1..4dc5bedf02f 100644 --- a/src/devices/sound/2608intf.cpp +++ b/src/devices/sound/2608intf.cpp @@ -11,9 +11,6 @@ - Control Write B - Data Write B - TODO: - - fix set_unscaled_clock() changes (currently done only by vgmplay driver) - ***************************************************************************/ #include "emu.h" @@ -52,7 +49,7 @@ void ym2608_device::device_timer(emu_timer &timer, device_timer_id id, int param void ym2608_device::timer_handler(int c,int count,int clock) { - if( count == 0 ) + if( count == 0 || clock == 0 ) { /* Reset FM Timer */ m_timer[c]->enable(false); } @@ -111,6 +108,16 @@ void ym2608_device::device_start() } //------------------------------------------------- +// device_clock_changed +//------------------------------------------------- + +void ym2608_device::device_clock_changed() +{ + m_stream->set_sample_rate(clock() / 72); + ym2608_clock_changed(m_chip, clock(), clock() / 72); +} + +//------------------------------------------------- // device_stop - device-specific stop //------------------------------------------------- diff --git a/src/devices/sound/2608intf.h b/src/devices/sound/2608intf.h index 7272f5778e9..d3ba76506ee 100644 --- a/src/devices/sound/2608intf.h +++ b/src/devices/sound/2608intf.h @@ -21,6 +21,7 @@ public: // configuration helpers template <class Object> devcb_base &set_irq_handler(Object &&cb) { return m_irq_handler.set_callback(std::forward<Object>(cb)); } + auto irq_handler() { return m_irq_handler.bind(); } DECLARE_READ8_MEMBER( read ); DECLARE_WRITE8_MEMBER( write ); @@ -32,6 +33,7 @@ protected: // device-level overrides virtual const tiny_rom_entry *device_rom_region() const override; virtual void device_start() override; + virtual void device_clock_changed() override; virtual void device_post_load() override; virtual void device_stop() override; virtual void device_reset() override; diff --git a/src/devices/sound/2610intf.cpp b/src/devices/sound/2610intf.cpp index ae208511d03..6b2e2886d8c 100644 --- a/src/devices/sound/2610intf.cpp +++ b/src/devices/sound/2610intf.cpp @@ -51,7 +51,7 @@ void ym2610_device::device_timer(emu_timer &timer, device_timer_id id, int param void ym2610_device::timer_handler(int c,int count,int clock) { - if( count == 0 ) + if( count == 0 || clock == 0 ) { /* Reset FM Timer */ m_timer[c]->enable(false); } @@ -129,6 +129,16 @@ void ym2610_device::device_start() } //------------------------------------------------- +// device_clock_changed +//------------------------------------------------- + +void ym2610_device::device_clock_changed() +{ + m_stream->set_sample_rate(clock() / 72); + ym2610_clock_changed(m_chip, clock(), clock() / 72); +} + +//------------------------------------------------- // device_stop - device-specific stop //------------------------------------------------- diff --git a/src/devices/sound/2610intf.h b/src/devices/sound/2610intf.h index bb25f97b51e..583091a666b 100644 --- a/src/devices/sound/2610intf.h +++ b/src/devices/sound/2610intf.h @@ -37,6 +37,7 @@ protected: // device-level overrides virtual void device_start() override; + virtual void device_clock_changed() override; virtual void device_post_load() override; virtual void device_stop() override; virtual void device_reset() override; diff --git a/src/devices/sound/2612intf.cpp b/src/devices/sound/2612intf.cpp index 7350d04a624..21ca436a004 100644 --- a/src/devices/sound/2612intf.cpp +++ b/src/devices/sound/2612intf.cpp @@ -42,7 +42,7 @@ void ym2612_device::device_timer(emu_timer &timer, device_timer_id id, int param void ym2612_device::timer_handler(int c,int count,int clock) { - if( count == 0 ) + if( count == 0 || clock == 0 ) { /* Reset FM Timer */ m_timer[c]->enable(false); } diff --git a/src/devices/sound/262intf.cpp b/src/devices/sound/262intf.cpp index c4da329ecff..905d9afd8b6 100644 --- a/src/devices/sound/262intf.cpp +++ b/src/devices/sound/262intf.cpp @@ -109,6 +109,17 @@ void ymf262_device::device_reset() ymf262_reset_chip(m_chip); } +//------------------------------------------------- +// device_clock_changed - called if the clock +// changes +//------------------------------------------------- + +void ymf262_device::device_clock_changed() +{ + int rate = clock()/288; + ymf262_clock_changed(m_chip,clock(),rate); + m_stream->set_sample_rate(rate); +} READ8_MEMBER( ymf262_device::read ) { diff --git a/src/devices/sound/262intf.h b/src/devices/sound/262intf.h index 9f1575ccb01..cefaebd814c 100644 --- a/src/devices/sound/262intf.h +++ b/src/devices/sound/262intf.h @@ -26,6 +26,7 @@ protected: virtual void device_start() override; virtual void device_stop() override; virtual void device_reset() override; + virtual void device_clock_changed() override; virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; diff --git a/src/devices/sound/8950intf.cpp b/src/devices/sound/8950intf.cpp index a6f8be7aa2b..da0049f0a91 100644 --- a/src/devices/sound/8950intf.cpp +++ b/src/devices/sound/8950intf.cpp @@ -101,6 +101,16 @@ void y8950_device::device_start() } //------------------------------------------------- +// device_clock_changed +//------------------------------------------------- + +void y8950_device::device_clock_changed() +{ + m_stream->set_sample_rate(clock() / 72); + y8950_clock_changed(m_chip, clock(), clock() / 72); +} + +//------------------------------------------------- // device_stop - device-specific stop //------------------------------------------------- diff --git a/src/devices/sound/8950intf.h b/src/devices/sound/8950intf.h index 83aad8781c0..c1f3163a9ee 100644 --- a/src/devices/sound/8950intf.h +++ b/src/devices/sound/8950intf.h @@ -44,6 +44,7 @@ public: protected: // device-level overrides virtual void device_start() override; + virtual void device_clock_changed() override; virtual void device_stop() override; virtual void device_reset() override; diff --git a/src/devices/sound/aica.cpp b/src/devices/sound/aica.cpp index 3c66130fb77..4ad7c2f5995 100644 --- a/src/devices/sound/aica.cpp +++ b/src/devices/sound/aica.cpp @@ -4,10 +4,17 @@ /* Sega/Yamaha AICA emulation + Confirmed Part numbers: + SEGA 315-6232 G21003 (Later) + SEGA 315-6119 FQ1003 (Earlier) + This is effectively a 64-voice SCSP, with the following differences: - No FM mode - A third sample format (ADPCM) has been added - Some minor other tweeks (no EGHOLD, slighly more capable DSP) + + TODO: + - Where are EXTS Connected? */ #include "emu.h" @@ -972,8 +979,8 @@ void aica_device::w16(address_space &space,unsigned int addr,unsigned short val) } else if(addr<0x45c0) *((unsigned short *) (m_DSP.EFREG+(addr-0x4580)/4))=val; - else if(addr<0x45c8) - *((unsigned short *) (m_DSP.EXTS+(addr-0x45c0)/2))=val; + //else if(addr<0x45c8) + // *((unsigned short *) (m_DSP.EXTS+(addr-0x45c0)/2))=val; // Read only } } @@ -1264,10 +1271,13 @@ int32_t aica_device::UpdateSlot(AICA_SLOT *slot) void aica_device::DoMasterSamples(int nsamples) { stream_sample_t *bufr,*bufl; + stream_sample_t *exts[2]; int sl, s, i; bufr=m_bufferr; bufl=m_bufferl; + exts[0]=m_exts0; + exts[1]=m_exts1; for(s=0;s<nsamples;++s) { @@ -1313,6 +1323,18 @@ void aica_device::DoMasterSamples(int nsamples) } } + // mix EXTS output + for(i=0;i<2;++i) + { + if(EFSDL(i+16)) // 16,17 for EXTS + { + m_DSP.EXTS[i]=exts[i][s]; + unsigned int Enc=((EFPAN(i+16))<<0x8)|((EFSDL(i+16))<<0xd); + smpl+=(m_DSP.EXTS[i]*m_LPANTABLE[Enc])>>SHIFT; + smpr+=(m_DSP.EXTS[i]*m_RPANTABLE[Enc])>>SHIFT; + } + } + *bufl++ = (ICLIP16(smpl>>3)*m_LPANTABLE[MVOL()<<0xd])>>SHIFT; *bufr++ = (ICLIP16(smpr>>3)*m_LPANTABLE[MVOL()<<0xd])>>SHIFT; } @@ -1416,6 +1438,8 @@ void aica_device::sound_stream_update(sound_stream &stream, stream_sample_t **in { m_bufferl = outputs[0]; m_bufferr = outputs[1]; + m_exts0 = inputs[0]; + m_exts1 = inputs[1]; m_length = samples; DoMasterSamples(samples); } @@ -1433,7 +1457,7 @@ void aica_device::device_start() m_irq_cb.resolve_safe(); m_main_irq_cb.resolve_safe(); - m_stream = machine().sound().stream_alloc(*this, 0, 2, (int)m_rate); + m_stream = machine().sound().stream_alloc(*this, 2, 2, (int)m_rate); // save state save_item(NAME(m_IrqTimA)); @@ -1529,6 +1553,8 @@ aica_device::aica_device(const machine_config &mconfig, const char *tag, device_ m_mcipd(0), m_bufferl(nullptr), m_bufferr(nullptr), + m_exts0(nullptr), + m_exts1(nullptr), m_length(0), m_RBUFDST(nullptr) diff --git a/src/devices/sound/aica.h b/src/devices/sound/aica.h index 3c78692ee97..957f6a9336f 100644 --- a/src/devices/sound/aica.h +++ b/src/devices/sound/aica.h @@ -206,6 +206,8 @@ private: stream_sample_t *m_bufferl; stream_sample_t *m_bufferr; + stream_sample_t *m_exts0; + stream_sample_t *m_exts1; int m_length; diff --git a/src/devices/sound/aicadsp.cpp b/src/devices/sound/aicadsp.cpp index 8ede8c6822f..4cf56872401 100644 --- a/src/devices/sound/aicadsp.cpp +++ b/src/devices/sound/aicadsp.cpp @@ -161,7 +161,7 @@ void AICADSP::step() else if(IRA<=0x2F) INPUTS=MIXS[IRA-0x20]<<4; //MIXS is 20 bit else if(IRA<=0x31) - INPUTS=0; + INPUTS=EXTS[IRA-0x30]<<8; //EXTS is 16 bit INPUTS<<=8; INPUTS>>=8; diff --git a/src/devices/sound/asc.h b/src/devices/sound/asc.h index a723707a9e9..582f7ce5e93 100644 --- a/src/devices/sound/asc.h +++ b/src/devices/sound/asc.h @@ -59,18 +59,20 @@ public: ARDBEG = 7 // Subset of ASC included in the Ardbeg ASIC (LC520) }; + asc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, asc_type type) + : asc_device(mconfig, tag, owner, clock) + { + set_type(type); + } - // construction/destruction asc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - // inline configuration helpers void set_type(asc_type type) { m_chip_type = type; } - - template <class Write> devcb_base &set_irqf(Write &&wr) { return write_irq.set_callback(std::forward<Write>(wr)); } + auto irqf_callback() { return write_irq.bind(); } DECLARE_READ8_MEMBER(read); DECLARE_WRITE8_MEMBER(write); diff --git a/src/devices/sound/c140.cpp b/src/devices/sound/c140.cpp index 826f8cc5036..0d72ac8be24 100644 --- a/src/devices/sound/c140.cpp +++ b/src/devices/sound/c140.cpp @@ -89,14 +89,13 @@ static inline int limit(int32_t in) c140_device::c140_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, C140, tag, owner, clock) , device_sound_interface(mconfig, *this) + , device_rom_interface(mconfig, *this, 21) , m_sample_rate(0) , m_stream(nullptr) , m_banking_type(C140_TYPE::SYSTEM2) , m_mixer_buffer_left(nullptr) , m_mixer_buffer_right(nullptr) , m_baserate(0) - , m_rom_ptr(*this, DEVICE_SELF) - , m_pRom(nullptr) { memset(m_REG, 0, sizeof(uint8_t)*0x200); memset(m_pcmtbl, 0, sizeof(int16_t)*8); @@ -113,11 +112,6 @@ void c140_device::device_start() m_stream = stream_alloc(0, 2, m_sample_rate); - if (m_rom_ptr != nullptr) - { - m_pRom = m_rom_ptr; - } - /* make decompress pcm table */ //2000.06.26 CAB int32_t segbase = 0; for(int i = 0; i < 8; i++) @@ -135,7 +129,7 @@ void c140_device::device_start() /* allocate a pair of buffers to mix into - 1 second's worth should be more than enough */ m_mixer_buffer_left = std::make_unique<int16_t[]>(m_sample_rate); - m_mixer_buffer_right = std::make_unique<int16_t[]>(m_sample_rate);; + m_mixer_buffer_right = std::make_unique<int16_t[]>(m_sample_rate); save_item(NAME(m_REG)); @@ -159,6 +153,24 @@ void c140_device::device_start() } +void c140_device::device_clock_changed() +{ + m_sample_rate = m_baserate = clock(); + + m_stream->set_sample_rate(m_sample_rate); + + /* allocate a pair of buffers to mix into - 1 second's worth should be more than enough */ + m_mixer_buffer_left = std::make_unique<int16_t[]>(m_sample_rate); + m_mixer_buffer_right = std::make_unique<int16_t[]>(m_sample_rate);; +} + + +void c140_device::rom_bank_updated() +{ + m_stream->update(); +} + + //------------------------------------------------- // sound_stream_update - handle a stream update //------------------------------------------------- @@ -172,7 +184,7 @@ void c140_device::sound_stream_update(sound_stream &stream, stream_sample_t **in int32_t sdt; int32_t st,ed,sz; - int8_t *pSampleData; + long sampleData; int32_t frequency,delta,offset,pos; int32_t cnt, voicecnt; int32_t lastdt,prevdt,dltdt; @@ -219,7 +231,7 @@ void c140_device::sound_stream_update(sound_stream &stream, stream_sample_t **in sz=ed-st; /* Retrieve base pointer to the sample data */ - pSampleData = m_pRom + find_sample(st, v->bank, i); + sampleData = find_sample(st, v->bank, i); /* Fetch back previous data pointers */ offset=v->ptoffset; @@ -257,7 +269,7 @@ void c140_device::sound_stream_update(sound_stream &stream, stream_sample_t **in } /* Read the chosen sample byte */ - dt=pSampleData[pos]; + dt = (int8_t) read_byte(sampleData + pos); /* decompress to 13bit range */ //2000.06.26 CAB sdt=dt>>3; //signed @@ -307,7 +319,7 @@ void c140_device::sound_stream_update(sound_stream &stream, stream_sample_t **in if (m_banking_type == C140_TYPE::ASIC219) { - lastdt = pSampleData[BYTE_XOR_BE(pos)]; + lastdt = (int8_t) read_byte(sampleData + BYTE_XOR_BE(pos)); // Sign + magnitude format if ((v->mode & 0x01) && (lastdt & 0x80)) @@ -319,7 +331,7 @@ void c140_device::sound_stream_update(sound_stream &stream, stream_sample_t **in } else { - lastdt=pSampleData[pos]; + lastdt = (int8_t) read_byte(sampleData + pos); } dltdt = (lastdt - prevdt); @@ -431,12 +443,6 @@ WRITE8_MEMBER( c140_device::c140_w ) } -void c140_device::set_base(void *base) -{ - m_pRom = (int8_t *)base; -} - - void c140_device::init_voice( C140_VOICE *v ) { v->key=0; diff --git a/src/devices/sound/c140.h b/src/devices/sound/c140.h index 25f9f06f0eb..cdc84a38fd1 100644 --- a/src/devices/sound/c140.h +++ b/src/devices/sound/c140.h @@ -16,7 +16,8 @@ // ======================> c140_device class c140_device : public device_t, - public device_sound_interface + public device_sound_interface, + public device_rom_interface { public: enum class C140_TYPE @@ -34,11 +35,12 @@ public: DECLARE_READ8_MEMBER( c140_r ); DECLARE_WRITE8_MEMBER( c140_w ); - void set_base(void *base); - protected: // device-level overrides virtual void device_start() override; + virtual void device_clock_changed() override; + + virtual void rom_bank_updated() override; // sound stream update overrides virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) override; @@ -80,8 +82,6 @@ private: std::unique_ptr<int16_t[]> m_mixer_buffer_right; int m_baserate; - optional_region_ptr<int8_t> m_rom_ptr; - int8_t *m_pRom; uint8_t m_REG[0x200]; int16_t m_pcmtbl[8]; //2000.06.26 CAB diff --git a/src/devices/sound/c6280.cpp b/src/devices/sound/c6280.cpp index c0a91f36651..1b3665d40f8 100644 --- a/src/devices/sound/c6280.cpp +++ b/src/devices/sound/c6280.cpp @@ -1,7 +1,7 @@ // license:BSD-3-Clause // copyright-holders:Charles MacDonald /* - HuC6280 sound chip emulator + Hudson PSG emulator by Charles MacDonald E-mail: cgfm2@hotmail.com WWW: http://cgfm2.emuviews.com @@ -36,6 +36,10 @@ - http://www.hudsonsoft.net/ww/about/about.html - http://www.hudson.co.jp/corp/eng/coinfo/history.html + Integrated on: + HuC6280 CPU (PC Engine/TurboGrafx 16) + HuC6230 Sound Chip (PC-FX, with OKI ADPCM) + */ #include "emu.h" @@ -167,15 +171,8 @@ void c6280_device::sound_stream_update(sound_stream &stream, stream_sample_t **i /* MAME specific code */ /*--------------------------------------------------------------------------*/ -READ8_MEMBER( c6280_device::c6280_r ) -{ - return m_cpudevice->io_get_buffer(); -} - WRITE8_MEMBER( c6280_device::c6280_w ) { - m_cpudevice->io_set_buffer(data); - channel *chan = &m_channel[m_select]; /* Update stream */ @@ -256,12 +253,11 @@ WRITE8_MEMBER( c6280_device::c6280_w ) } } -DEFINE_DEVICE_TYPE(C6280, c6280_device, "c6280", "Hudson HuC6280") +DEFINE_DEVICE_TYPE(C6280, c6280_device, "c6280", "Hudson Soft HuC6280 PSG") c6280_device::c6280_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, C6280, tag, owner, clock) , device_sound_interface(mconfig, *this) - , m_cpudevice(*this, finder_base::DUMMY_TAG) { } @@ -277,14 +273,14 @@ void c6280_device::calculate_clocks() /* Make waveform frequency table */ for (int i = 0; i < 4096; i += 1) { - double step = ((clock() / rate) * 4096) / (i + 1); + double step = (16 * 4096) / (i + 1); m_wave_freq_tab[(1 + i) & 0xFFF] = (uint32_t)step; } /* Make noise frequency table */ for (int i = 0; i < 32; i += 1) { - double step = ((clock() / rate) * 32) / (i+1); + double step = (16 * 32) / (i+1); m_noise_freq_tab[i] = (uint32_t)step; } diff --git a/src/devices/sound/c6280.h b/src/devices/sound/c6280.h index 1c5474e3adf..ea54ad17188 100644 --- a/src/devices/sound/c6280.h +++ b/src/devices/sound/c6280.h @@ -5,17 +5,12 @@ #pragma once -#include "cpu/h6280/h6280.h" - class c6280_device : public device_t, public device_sound_interface { public: c6280_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - void set_devicecpu_tag(const char *tag) { m_cpudevice.set_tag(tag); } - - // read/write - DECLARE_READ8_MEMBER( c6280_r ); + // write only DECLARE_WRITE8_MEMBER( c6280_w ); protected: @@ -43,7 +38,6 @@ private: // internal state sound_stream *m_stream; - required_device<h6280_device> m_cpudevice; uint8_t m_select; uint8_t m_balance; uint8_t m_lfo_frequency; diff --git a/src/devices/sound/es5503.cpp b/src/devices/sound/es5503.cpp index f3127b69261..2344a7c695b 100644 --- a/src/devices/sound/es5503.cpp +++ b/src/devices/sound/es5503.cpp @@ -228,11 +228,21 @@ void es5503_device::device_start() save_item(NAME(oscillators[osc].irqpend), osc); } - output_rate = (clock()/8)/34; // (input clock / 8) / # of oscs. enabled + 2 + output_rate = (clock() / 8) / (2 + oscsenabled); m_stream = machine().sound().stream_alloc(*this, 0, output_channels, output_rate); m_timer = timer_alloc(0, nullptr); - m_timer->adjust(attotime::from_hz(output_rate), 0, attotime::from_hz(output_rate)); + attotime update_rate = output_rate ? attotime::from_hz(output_rate) : attotime::never; + m_timer->adjust(update_rate, 0, update_rate); +} + +void es5503_device::device_clock_changed() +{ + output_rate = (clock() / 8) / (2 + oscsenabled); + m_stream->set_sample_rate(output_rate); + + attotime update_rate = output_rate ? attotime::from_hz(output_rate) : attotime::never; + m_timer->adjust(update_rate, 0, update_rate); } void es5503_device::device_reset() @@ -416,12 +426,16 @@ WRITE8_MEMBER( es5503_device::write ) break; case 0xe1: // oscillator enable + { oscsenabled = (data>>1) & 0x1f; output_rate = (clock()/8)/(2+oscsenabled); m_stream->set_sample_rate(output_rate); - m_timer->adjust(attotime::from_hz(output_rate), 0, attotime::from_hz(output_rate)); + + attotime update_rate = output_rate ? attotime::from_hz(output_rate) : attotime::never; + m_timer->adjust(update_rate, 0, update_rate); break; + } case 0xe2: // A/D converter break; diff --git a/src/devices/sound/es5503.h b/src/devices/sound/es5503.h index 8bf49b6e3ba..1625f864851 100644 --- a/src/devices/sound/es5503.h +++ b/src/devices/sound/es5503.h @@ -33,6 +33,8 @@ public: template <class Object> devcb_base &set_irqf(Object &&cb) { return m_irq_func.set_callback(std::forward<Object>(cb)); } template <class Object> devcb_base &set_adcf(Object &&cb) { return m_adc_func.set_callback(std::forward<Object>(cb)); } + auto irq_func() { return m_irq_func.bind(); } + auto adc_func() { return m_adc_func.bind(); } DECLARE_READ8_MEMBER(read); DECLARE_WRITE8_MEMBER(write); @@ -42,6 +44,7 @@ public: protected: // device-level overrides virtual void device_start() override; + virtual void device_clock_changed() override; virtual void device_reset() override; virtual void device_timer(emu_timer &timer, device_timer_id tid, int param, void *ptr) override; diff --git a/src/devices/sound/es5506.cpp b/src/devices/sound/es5506.cpp index 01ef0f580eb..f243f0c06e7 100644 --- a/src/devices/sound/es5506.cpp +++ b/src/devices/sound/es5506.cpp @@ -301,6 +301,17 @@ void es5506_device::device_start() } //------------------------------------------------- +// device_clock_changed +//------------------------------------------------- + +void es550x_device::device_clock_changed() +{ + m_master_clock = clock(); + m_sample_rate = m_master_clock / (16 * (m_active_voices + 1)); + m_stream->set_sample_rate(m_sample_rate); +} + +//------------------------------------------------- // device_reset - device-specific reset //------------------------------------------------- diff --git a/src/devices/sound/es5506.h b/src/devices/sound/es5506.h index d8d87408402..9022042f33d 100644 --- a/src/devices/sound/es5506.h +++ b/src/devices/sound/es5506.h @@ -102,6 +102,7 @@ protected: // device-level overrides virtual void device_start() override; + virtual void device_clock_changed() override; virtual void device_stop() override; virtual void device_reset() override; diff --git a/src/devices/sound/fm.cpp b/src/devices/sound/fm.cpp index 9213e230b88..e93d009f65f 100644 --- a/src/devices/sound/fm.cpp +++ b/src/devices/sound/fm.cpp @@ -3011,6 +3011,14 @@ void * ym2608_init(device_t *device, int clock, int rate, void *pcmrom,int pcmsi return F2608; } +void ym2608_clock_changed(void *chip, int clock, int rate) +{ + ym2608_state *F2608 = (ym2608_state *)chip; + + F2608->OPN.ST.clock = clock; + F2608->OPN.ST.rate = rate; +} + /* shut down emulator */ void ym2608_shutdown(void *chip) { @@ -3683,6 +3691,14 @@ void *ym2610_init(device_t *device, int clock, int rate, void *pcmroma,int pcmsi return F2610; } +void ym2610_clock_changed(void *chip, int clock, int rate) +{ + ym2610_state *F2610 = (ym2610_state *)chip; + + F2610->OPN.ST.clock = clock; + F2610->OPN.ST.rate = rate; +} + /* shut down emulator */ void ym2610_shutdown(void *chip) { diff --git a/src/devices/sound/fm.h b/src/devices/sound/fm.h index 60bdb9c4ec0..7b919ea7402 100644 --- a/src/devices/sound/fm.h +++ b/src/devices/sound/fm.h @@ -136,6 +136,7 @@ void ym2203_postload(void *chip); void * ym2608_init(device_t *device, int baseclock, int rate, void *pcmroma,int pcmsizea, FM_TIMERHANDLER TimerHandler,FM_IRQHANDLER IRQHandler, const ssg_callbacks *ssg); +void ym2608_clock_changed(void *chip, int clock, int rate); void ym2608_shutdown(void *chip); void ym2608_reset_chip(void *chip); void ym2608_update_one(void *chip, FMSAMPLE **buffer, int length); @@ -151,6 +152,7 @@ void ym2608_postload(void *chip); void * ym2610_init(device_t *device, int baseclock, int rate, void *pcmroma,int pcmasize,void *pcmromb,int pcmbsize, FM_TIMERHANDLER TimerHandler,FM_IRQHANDLER IRQHandler, const ssg_callbacks *ssg); +void ym2610_clock_changed(void *chip, int clock, int rate); void ym2610_shutdown(void *chip); void ym2610_reset_chip(void *chip); void ym2610_update_one(void *chip, FMSAMPLE **buffer, int length); diff --git a/src/devices/sound/fmopl.cpp b/src/devices/sound/fmopl.cpp index 2e1be1b4266..c7390842710 100644 --- a/src/devices/sound/fmopl.cpp +++ b/src/devices/sound/fmopl.cpp @@ -1631,7 +1631,7 @@ void FM_OPL::initialize() /*logerror("freqbase=%f\n", freqbase);*/ /* Timer base time */ - TimerBase = attotime::from_hz(clock) * 72; + TimerBase = clock ? attotime::from_hz(clock) * 72 : attotime::zero; /* make fnumber -> increment counter table */ for( i=0 ; i < 1024 ; i++ ) @@ -2408,6 +2408,11 @@ static void Y8950_deltat_status_reset(void *chip, uint8_t changebits) Y8950->STATUS_RESET(changebits); } +void y8950_clock_changed(void *chip, uint32_t clock, uint32_t rate) +{ + reinterpret_cast<FM_OPL *>(chip)->clock_changed(clock, rate); +} + void *y8950_init(device_t *device, uint32_t clock, uint32_t rate) { /* emulator create */ diff --git a/src/devices/sound/fmopl.h b/src/devices/sound/fmopl.h index c5366d7badb..5da3f110830 100644 --- a/src/devices/sound/fmopl.h +++ b/src/devices/sound/fmopl.h @@ -92,6 +92,7 @@ void y8950_set_keyboard_handler(void *chip, OPL_PORTHANDLER_W KeyboardHandler_w, void y8950_set_delta_t_memory(void *chip, void * deltat_mem_ptr, int deltat_mem_size ); void * y8950_init(device_t *device, uint32_t clock, uint32_t rate); +void y8950_clock_changed(void *chip, uint32_t clock, uint32_t rate); void y8950_shutdown(void *chip); void y8950_reset_chip(void *chip); int y8950_write(void *chip, int a, int v); diff --git a/src/devices/sound/gb.cpp b/src/devices/sound/gb.cpp index c65b3872d00..c662d456ef6 100644 --- a/src/devices/sound/gb.cpp +++ b/src/devices/sound/gb.cpp @@ -170,6 +170,16 @@ void gameboy_sound_device::device_start() //------------------------------------------------- +// device_clock_changed +//------------------------------------------------- + +void gameboy_sound_device::device_clock_changed() +{ + m_timer->adjust(clocks_to_attotime(FRAME_CYCLES / 128), 0, clocks_to_attotime(FRAME_CYCLES / 128)); +} + + +//------------------------------------------------- // device_reset //------------------------------------------------- diff --git a/src/devices/sound/gb.h b/src/devices/sound/gb.h index f4139d0b1a6..e559f5c7301 100644 --- a/src/devices/sound/gb.h +++ b/src/devices/sound/gb.h @@ -21,6 +21,7 @@ protected: // device-level overrides virtual void device_start() override; + virtual void device_clock_changed() override; virtual void device_reset() override; // sound stream update overrides diff --git a/src/devices/sound/k053260.cpp b/src/devices/sound/k053260.cpp index 764f02487f9..cc5294b0b59 100644 --- a/src/devices/sound/k053260.cpp +++ b/src/devices/sound/k053260.cpp @@ -105,6 +105,16 @@ void k053260_device::device_start() //------------------------------------------------- +// device_clock_changed +//------------------------------------------------- + +void k053260_device::device_clock_changed() +{ + m_stream->set_sample_rate(clock() / CLOCKS_PER_SAMPLE); +} + + +//------------------------------------------------- // device_reset - device-specific reset //------------------------------------------------- diff --git a/src/devices/sound/k053260.h b/src/devices/sound/k053260.h index a938a420090..9edb1d522f5 100644 --- a/src/devices/sound/k053260.h +++ b/src/devices/sound/k053260.h @@ -47,6 +47,7 @@ public: protected: // device-level overrides virtual void device_start() override; + virtual void device_clock_changed() override; virtual void device_reset() override; // sound stream update overrides diff --git a/src/devices/sound/k054539.cpp b/src/devices/sound/k054539.cpp index 862f8e2f175..35f45bf4fa6 100644 --- a/src/devices/sound/k054539.cpp +++ b/src/devices/sound/k054539.cpp @@ -535,6 +535,11 @@ void k054539_device::device_start() init_chip(); } +void k054539_device::device_clock_changed() +{ + stream->set_sample_rate(clock() / 384); +} + void k054539_device::device_reset() { regs[0x22c] = 0; diff --git a/src/devices/sound/k054539.h b/src/devices/sound/k054539.h index a8a6507963a..0b79173f205 100644 --- a/src/devices/sound/k054539.h +++ b/src/devices/sound/k054539.h @@ -67,6 +67,7 @@ public: protected: // device-level overrides virtual void device_start() override; + virtual void device_clock_changed() override; virtual void device_reset() override; virtual void device_post_load() override; virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; diff --git a/src/devices/sound/mos6560.h b/src/devices/sound/mos6560.h index d4ee91e8ba2..8b9f20bd02f 100644 --- a/src/devices/sound/mos6560.h +++ b/src/devices/sound/mos6560.h @@ -37,55 +37,6 @@ #include "screen.h" -//*************************************************************************** -// DEVICE CONFIGURATION MACROS -//*************************************************************************** - -#define MCFG_MOS6560_ADD(_tag, _screen_tag, _clock, _videoram_map, _colorram_map) \ - MCFG_SCREEN_ADD(_screen_tag, RASTER) \ - MCFG_SCREEN_REFRESH_RATE(MOS6560_VRETRACERATE) \ - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) \ - MCFG_SCREEN_SIZE((MOS6560_XSIZE + 7) & ~7, MOS6560_YSIZE) \ - MCFG_SCREEN_VISIBLE_AREA(MOS6560_MAME_XPOS, MOS6560_MAME_XPOS + MOS6560_MAME_XSIZE - 1, MOS6560_MAME_YPOS, MOS6560_MAME_YPOS + MOS6560_MAME_YSIZE - 1) \ - MCFG_SCREEN_UPDATE_DEVICE(_tag, mos6560_device, screen_update) \ - MCFG_DEVICE_ADD(_tag, MOS6560, _clock) \ - MCFG_VIDEO_SET_SCREEN(_screen_tag) \ - MCFG_DEVICE_ADDRESS_MAP(0, _videoram_map) \ - MCFG_DEVICE_ADDRESS_MAP(1, _colorram_map) - -#define MCFG_MOS6561_ADD(_tag, _screen_tag, _clock, _videoram_map, _colorram_map) \ - MCFG_SCREEN_ADD(_screen_tag, RASTER) \ - MCFG_SCREEN_REFRESH_RATE(MOS6561_VRETRACERATE) \ - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) \ - MCFG_SCREEN_SIZE((MOS6561_XSIZE + 7) & ~7, MOS6561_YSIZE) \ - MCFG_SCREEN_VISIBLE_AREA(MOS6561_MAME_XPOS, MOS6561_MAME_XPOS + MOS6561_MAME_XSIZE - 1, MOS6561_MAME_YPOS, MOS6561_MAME_YPOS + MOS6561_MAME_YSIZE - 1) \ - MCFG_SCREEN_UPDATE_DEVICE(_tag, mos6560_device, screen_update) \ - MCFG_DEVICE_ADD(_tag, MOS6561, _clock) \ - MCFG_VIDEO_SET_SCREEN(_screen_tag) \ - MCFG_DEVICE_ADDRESS_MAP(0, _videoram_map) \ - MCFG_DEVICE_ADDRESS_MAP(1, _colorram_map) - -#define MCFG_MOS656X_ATTACK_UFO_ADD(_tag, _screen_tag, _clock, _videoram_map, _colorram_map) \ - MCFG_SCREEN_ADD(_screen_tag, RASTER) \ - MCFG_SCREEN_REFRESH_RATE(MOS6560_VRETRACERATE) \ - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) \ - MCFG_SCREEN_SIZE((MOS6560_XSIZE + 7) & ~7, MOS6560_YSIZE) \ - MCFG_SCREEN_VISIBLE_AREA(0, 23*8 - 1, 0, 22*8 - 1) \ - MCFG_SCREEN_UPDATE_DEVICE(_tag, mos6560_device, screen_update) \ - MCFG_DEVICE_ADD(_tag, MOS656X_ATTACK_UFO, _clock) \ - MCFG_VIDEO_SET_SCREEN(_screen_tag) \ - MCFG_DEVICE_ADDRESS_MAP(0, _videoram_map) \ - MCFG_DEVICE_ADDRESS_MAP(1, _colorram_map) - - -#define MCFG_MOS6560_POTX_CALLBACK(_read) \ - downcast<mos6560_device &>(*device).set_potx_rd_callback(DEVCB_##_read); - -#define MCFG_MOS6560_POTY_CALLBACK(_read) \ - downcast<mos6560_device &>(*device).set_poty_rd_callback(DEVCB_##_read); - - - //************************************************************************** // MACROS / CONSTANTS //************************************************************************** @@ -139,6 +90,9 @@ public: template <class Object> devcb_base &set_potx_rd_callback(Object &&cb) { return m_read_potx.set_callback(std::forward<Object>(cb)); } template <class Object> devcb_base &set_poty_rd_callback(Object &&cb) { return m_read_poty.set_callback(std::forward<Object>(cb)); } + auto potx_rd_callback() { return m_read_potx.bind(); } + auto poty_rd_callback() { return m_read_poty.bind(); } + virtual space_config_vector memory_space_config() const override; DECLARE_READ8_MEMBER( read ); diff --git a/src/devices/sound/qsound.cpp b/src/devices/sound/qsound.cpp index 197c1f03be7..31d4f08ac6c 100644 --- a/src/devices/sound/qsound.cpp +++ b/src/devices/sound/qsound.cpp @@ -227,6 +227,14 @@ void qsound_device::device_start() save_item(NAME(m_channel)); } +//------------------------------------------------- +// device_clock_changed +//------------------------------------------------- + +void qsound_device::device_clock_changed() +{ + m_stream->set_sample_rate(clock() / 2 / 1248); +} //------------------------------------------------- // device_reset - device-specific reset @@ -275,7 +283,7 @@ READ16_MEMBER(qsound_device::dsp_sample_r) // FIXME: DSP16 doesn't like bytes, only signed words - should this zero-pad or byte-smear? u8 const byte(read_byte((u32(m_rom_bank) << 16) | m_rom_offset)); if (!machine().side_effects_disabled()) - m_rom_bank = offset; + m_rom_bank = (m_rom_bank & 0x8000U) | offset; return (u16(byte) << 8) | u16(byte); } @@ -323,25 +331,11 @@ WRITE_LINE_MEMBER(qsound_device::dsp_ock_w) WRITE16_MEMBER(qsound_device::dsp_pio_w) { - /* - * FIXME: what does this do when PDX is high? - * There are seemingly two significant points where the program writes PDX1 every sample interval. - * - * Before writing the right-channel sample to SDX - this causes the PSEL 0->1 transition: - * 0:5d4: 996e if true a0 = rnd(a0) - * 0:5d5: 51e0 0000 pdx1 = 0x0000 - * 0:5d7: 49a0 move sdx = a0 - * - * This curious code where it writes out the a word from RAM@0x00f1 - this value seems significant: - * 0:335: 18f1 set r0 = 0x00f1 - * 0:336: 3cd0 nop, a0 = *r0 - * 0:337: d850 p = x*y, y = a1, x = *pt++i - * 0:338: 49e0 move pdx1 = a0 - */ - if (offset) - LOG("QSound: DSP PDX1 = %04X\n", data); - else - m_rom_offset = data; + // PDX0 is used for QSound ROM offset, and PDX1 is used for ADPCM ROM offset + // this prevents spurious PSEL transitions between sending samples to the DAC + // it could still be used to have separate QSound/ADPCM ROM banks + m_rom_bank = (m_rom_bank & 0x7fffU) | u16(offset << 15); + m_rom_offset = data; } diff --git a/src/devices/sound/qsound.h b/src/devices/sound/qsound.h index f5be0c106d8..10c6c93c4cb 100644 --- a/src/devices/sound/qsound.h +++ b/src/devices/sound/qsound.h @@ -27,6 +27,7 @@ protected: tiny_rom_entry const *device_rom_region() const override; virtual void device_add_mconfig(machine_config &config) override; virtual void device_start() override; + virtual void device_clock_changed() override; virtual void device_reset() override; // device_sound_interface implementation diff --git a/src/devices/sound/qsoundhle.cpp b/src/devices/sound/qsoundhle.cpp index 5a57f098454..8d182bb4b1a 100644 --- a/src/devices/sound/qsoundhle.cpp +++ b/src/devices/sound/qsoundhle.cpp @@ -29,6 +29,19 @@ #include "emu.h" #include "qsoundhle.h" +#include <algorithm> +#include <limits> + + +namespace { + +constexpr u32 saturate(s64 val) +{ + return std::min<s64>(std::max<s64>(val, std::numeric_limits<s32>::min()), std::numeric_limits<s32>::max()); +} + +} // anonymous namespace + // device type definition DEFINE_DEVICE_TYPE(QSOUND_HLE, qsound_hle_device, "qsound_hle", "QSound (HLE)") @@ -41,7 +54,7 @@ DEFINE_DEVICE_TYPE(QSOUND_HLE, qsound_hle_device, "qsound_hle", "QSound (HLE)") // qsound_hle_device - constructor //------------------------------------------------- -qsound_hle_device::qsound_hle_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) +qsound_hle_device::qsound_hle_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : device_t(mconfig, QSOUND_HLE, tag, owner, clock) , device_sound_interface(mconfig, *this) , device_rom_interface(mconfig, *this, 24) @@ -124,14 +137,14 @@ void qsound_hle_device::sound_stream_update(sound_stream &stream, stream_sample_ offs_t const addr(ch.reg[1] | (bank << 16)); // update based on playback rate - uint32_t updated(uint32_t(ch.reg[2] << 4) + ((uint32_t(ch.reg[1]) << 16) | ch.reg[3])); - ch.reg[3] = uint16_t(updated); - if (updated >= (uint32_t(ch.reg[5]) << 16)) - updated -= uint32_t(ch.reg[4]) << 16; - ch.reg[1] = uint16_t(updated >> 16); + s64 updated(s32(u32(ch.reg[2]) << 4) + s32((u32(ch.reg[1]) << 16) | ch.reg[3])); + ch.reg[3] = u16(saturate(updated)); + if (updated >= s32(u32(ch.reg[5]) << 16)) + updated -= s32(u32(ch.reg[4]) << 16); + ch.reg[1] = u16(saturate(updated) >> 16); // get the scaled sample - int32_t const scaled(int32_t(int16_t(ch.reg[6])) * read_sample(addr)); + s32 const scaled(s32(s16(ch.reg[6])) * read_sample(addr)); // apply simple panning *lmix++ += (((scaled >> 8) * ch.lvol) >> 14); @@ -172,7 +185,7 @@ READ8_MEMBER(qsound_hle_device::qsound_r) } -void qsound_hle_device::write_data(uint8_t address, uint16_t data) +void qsound_hle_device::write_data(u8 address, u16 data) { int ch = 0, reg; diff --git a/src/devices/sound/qsoundhle.h b/src/devices/sound/qsoundhle.h index 8f4def443a0..498343ba6cb 100644 --- a/src/devices/sound/qsoundhle.h +++ b/src/devices/sound/qsoundhle.h @@ -34,13 +34,12 @@ protected: virtual void rom_bank_updated() override; private: - // MAME resources sound_stream *m_stream; struct qsound_channel { - uint16_t reg[8]; // channel control registers + u16 reg[8]; // channel control registers // work variables int lvol; // left volume @@ -48,10 +47,10 @@ private: } m_channel[16]; int m_pan_table[33]; // pan volume table - uint16_t m_data; // register latch data + u16 m_data; // register latch data - inline int16_t read_sample(uint32_t offset) { return uint16_t(read_byte(offset)) << 8; } - void write_data(uint8_t address, uint16_t data); + inline s16 read_sample(u32 offset) { return u16(read_byte(offset)) << 8; } + void write_data(u8 address, u16 data); }; DECLARE_DEVICE_TYPE(QSOUND_HLE, qsound_hle_device) diff --git a/src/devices/sound/rf5c68.cpp b/src/devices/sound/rf5c68.cpp index 1509ab8d8b8..2af393c884b 100644 --- a/src/devices/sound/rf5c68.cpp +++ b/src/devices/sound/rf5c68.cpp @@ -13,6 +13,7 @@ // device type definition DEFINE_DEVICE_TYPE(RF5C68, rf5c68_device, "rf5c68", "Ricoh RF5C68") +DEFINE_DEVICE_TYPE(RF5C164, rf5c164_device, "rf5c164", "Ricoh RF5C164") //************************************************************************** @@ -23,8 +24,8 @@ DEFINE_DEVICE_TYPE(RF5C68, rf5c68_device, "rf5c68", "Ricoh RF5C68") // rf5c68_device - constructor //------------------------------------------------- -rf5c68_device::rf5c68_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, RF5C68, tag, owner, clock) +rf5c68_device::rf5c68_device(const machine_config & mconfig, device_type type, const char * tag, device_t * owner, u32 clock) + : device_t(mconfig, type, tag, owner, clock) , device_sound_interface(mconfig, *this) , device_memory_interface(mconfig, *this) , m_data_config("data", ENDIANNESS_LITTLE, 8, 16) // 15 bit Address + 2 Memory select outputs(total 64KB), PSRAM/SRAM/ROM @@ -35,6 +36,21 @@ rf5c68_device::rf5c68_device(const machine_config &mconfig, const char *tag, dev { } +rf5c68_device::rf5c68_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : rf5c68_device(mconfig, RF5C68, tag, owner, clock) +{ +} + + +//------------------------------------------------- +// rf5c68_device - constructor +//------------------------------------------------- + +rf5c164_device::rf5c164_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : rf5c68_device(mconfig, RF5C164, tag, owner, clock) +{ +} + //------------------------------------------------- // device_start - device-specific startup @@ -66,6 +82,15 @@ void rf5c68_device::device_start() } //------------------------------------------------- +// device_clock_changed +//------------------------------------------------- + +void rf5c68_device::device_clock_changed() +{ + m_stream->set_sample_rate(clock() / 384); +} + +//------------------------------------------------- // memory_space_config - return a description of // any address spaces owned by this device //------------------------------------------------- diff --git a/src/devices/sound/rf5c68.h b/src/devices/sound/rf5c68.h index f0c202e0e04..5594e32f3e8 100644 --- a/src/devices/sound/rf5c68.h +++ b/src/devices/sound/rf5c68.h @@ -44,8 +44,11 @@ public: DECLARE_WRITE8_MEMBER( rf5c68_mem_w ); protected: + rf5c68_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock); + // device-level overrides virtual void device_start() override; + virtual void device_clock_changed() override; // sound stream update overrides virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) override; @@ -81,6 +84,13 @@ private: sample_end_cb_delegate m_sample_end_cb; }; +class rf5c164_device : public rf5c68_device +{ +public: + rf5c164_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); +}; + DECLARE_DEVICE_TYPE(RF5C68, rf5c68_device) +DECLARE_DEVICE_TYPE(RF5C164, rf5c164_device) #endif // MAME_SOUND_RF5C68_H diff --git a/src/devices/sound/saa1099.cpp b/src/devices/sound/saa1099.cpp index c8c6c527221..ca1232e13f4 100644 --- a/src/devices/sound/saa1099.cpp +++ b/src/devices/sound/saa1099.cpp @@ -201,6 +201,19 @@ void saa1099_device::device_start() //------------------------------------------------- +// device_clock_changed +//------------------------------------------------- + +void saa1099_device::device_clock_changed() +{ + m_master_clock = clock(); + m_sample_rate = clock() / 256; + + m_stream->set_sample_rate(m_sample_rate); +} + + +//------------------------------------------------- // sound_stream_update - handle a stream update //------------------------------------------------- diff --git a/src/devices/sound/saa1099.h b/src/devices/sound/saa1099.h index 061f39ecc5f..30df65988df 100644 --- a/src/devices/sound/saa1099.h +++ b/src/devices/sound/saa1099.h @@ -40,6 +40,7 @@ public: protected: // device-level overrides virtual void device_start() override; + virtual void device_clock_changed() override; // sound stream update overrides virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) override; diff --git a/src/devices/sound/scsp.h b/src/devices/sound/scsp.h index 983e37c3a9f..ef2268f5101 100644 --- a/src/devices/sound/scsp.h +++ b/src/devices/sound/scsp.h @@ -38,6 +38,9 @@ public: template <class Object> devcb_base &set_irq_callback(Object &&cb) { return m_irq_cb.set_callback(std::forward<Object>(cb)); } template <class Object> devcb_base &set_main_irq_callback(Object &&cb) { return m_main_irq_cb.set_callback(std::forward<Object>(cb)); } template <class Object> devcb_base &set_exts_callback(Object &&cb) { return m_exts_cb.set_callback(std::forward<Object>(cb)); } + auto irq_cb() { return m_irq_cb.bind(); } + auto main_irq_cb() { return m_main_irq_cb.bind(); } + auto exts_cb() { return m_exts_cb.bind(); } // SCSP register access DECLARE_READ16_MEMBER( read ); diff --git a/src/devices/sound/sn76496.cpp b/src/devices/sound/sn76496.cpp index 0c08ca0cb2e..87f1a95486e 100644 --- a/src/devices/sound/sn76496.cpp +++ b/src/devices/sound/sn76496.cpp @@ -267,6 +267,11 @@ void sn76496_base_device::device_start() register_for_save_states(); } +void sn76496_base_device::device_clock_changed() +{ + m_sound->set_sample_rate(clock()/2); +} + WRITE8_MEMBER( sn76496_base_device::stereo_w ) { m_sound->update(); diff --git a/src/devices/sound/sn76496.h b/src/devices/sound/sn76496.h index 0a129260e4d..b3d330e0c2c 100644 --- a/src/devices/sound/sn76496.h +++ b/src/devices/sound/sn76496.h @@ -48,6 +48,7 @@ protected: uint32_t clock); virtual void device_start() override; + virtual void device_clock_changed() override; virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) override; private: diff --git a/src/devices/sound/t6721a.h b/src/devices/sound/t6721a.h index 49e77498118..4fd78923dd0 100644 --- a/src/devices/sound/t6721a.h +++ b/src/devices/sound/t6721a.h @@ -73,6 +73,10 @@ public: template <class Object> devcb_base &set_phi2_callback(Object &&phi2) { return m_write_phi2.set_callback(std::forward<Object>(phi2)); } template <class Object> devcb_base &set_dtrd_callback(Object &&dtrd) { return m_write_dtrd.set_callback(std::forward<Object>(dtrd)); } template <class Object> devcb_base &set_apd_callback(Object &&apd) { return m_write_apd.set_callback(std::forward<Object>(apd)); } + auto eos_handler() { return m_write_eos.bind(); } + auto phi2_handler() { return m_write_phi2.bind(); } + auto dtrd_handler() { return m_write_dtrd.bind(); } + auto apd_handler() { return m_write_apd.bind(); } DECLARE_READ8_MEMBER( read ); DECLARE_WRITE8_MEMBER( write ); diff --git a/src/devices/sound/upd7759.cpp b/src/devices/sound/upd7759.cpp index 5c20e7c13da..8788abe78d8 100644 --- a/src/devices/sound/upd7759.cpp +++ b/src/devices/sound/upd7759.cpp @@ -221,7 +221,7 @@ void upd775x_device::device_start() m_step = 4 * FRAC_ONE; // compute the clock period - m_clock_period = attotime::from_hz(clock()); + m_clock_period = clock() ? attotime::from_hz(clock()) : attotime::zero; // set the intial state m_state = STATE_IDLE; @@ -275,6 +275,13 @@ void upd775x_device::device_start() save_item(NAME(m_romoffset)); } +void upd775x_device::device_clock_changed() +{ + m_clock_period = clock() ? attotime::from_hz(clock()) : attotime::zero; + + m_channel->set_sample_rate(clock() / 4); +} + void upd7759_device::device_start() { upd775x_device::device_start(); diff --git a/src/devices/sound/upd7759.h b/src/devices/sound/upd7759.h index ab128998f8e..f3b2d9e8e2f 100644 --- a/src/devices/sound/upd7759.h +++ b/src/devices/sound/upd7759.h @@ -47,6 +47,7 @@ protected: // device-level overrides virtual void device_start() override; + virtual void device_clock_changed() override; virtual void device_reset() override; virtual void device_post_load() override; diff --git a/src/devices/sound/volt_reg.h b/src/devices/sound/volt_reg.h index f687b3a7713..6493dbc7bd4 100644 --- a/src/devices/sound/volt_reg.h +++ b/src/devices/sound/volt_reg.h @@ -22,6 +22,11 @@ class voltage_regulator_device : public device_t, public device_sound_interface public: void set_output(double analogue_dc) { m_output = (analogue_dc * 32768) / 5.0f; } + voltage_regulator_device(const machine_config &mconfig, const char *tag, device_t *owner) + : voltage_regulator_device(mconfig, tag, owner, (uint32_t)0) + { + } + voltage_regulator_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); virtual bool issound() override { return false; } diff --git a/src/devices/sound/x1_010.cpp b/src/devices/sound/x1_010.cpp index b94851c0510..f6847a2df08 100644 --- a/src/devices/sound/x1_010.cpp +++ b/src/devices/sound/x1_010.cpp @@ -91,7 +91,6 @@ x1_010_device::x1_010_device(const machine_config &mconfig, const char *tag, dev , device_sound_interface(mconfig, *this) , device_rom_interface(mconfig, *this, 20) , m_rate(0) - , m_xor(0) , m_stream(nullptr) , m_sound_enable(0) , m_reg(nullptr) @@ -165,17 +164,14 @@ void x1_010_device::enable_w(int data) /* Use these for 8 bit CPUs */ - -READ8_MEMBER( x1_010_device::read ) +u8 x1_010_device::read(offs_t offset) { - offset ^= m_xor; return m_reg[offset]; } -WRITE8_MEMBER( x1_010_device::write ) +void x1_010_device::write(offs_t offset, u8 data) { int channel, reg; - offset ^= m_xor; channel = offset/sizeof(X1_010_CHANNEL); reg = offset%sizeof(X1_010_CHANNEL); @@ -192,20 +188,20 @@ WRITE8_MEMBER( x1_010_device::write ) /* Use these for 16 bit CPUs */ -READ16_MEMBER( x1_010_device::word_r ) +u16 x1_010_device::word_r(offs_t offset) { uint16_t ret; ret = m_HI_WORD_BUF[offset]<<8; - ret += (read( space, offset )&0xff); + ret += (read( offset )&0xff); LOG_REGISTER_READ("%s: Read X1-010 Offset:%04X Data:%04X\n", machine().describe_context(), offset, ret); return ret; } -WRITE16_MEMBER( x1_010_device::word_w ) +void x1_010_device::word_w(offs_t offset, u16 data) { m_HI_WORD_BUF[offset] = (data>>8)&0xff; - write( space, offset, data&0xff ); + write( offset, data&0xff ); LOG_REGISTER_WRITE("%s: Write X1-010 Offset:%04X Data:%04X\n", machine().describe_context(), offset, data); } diff --git a/src/devices/sound/x1_010.h b/src/devices/sound/x1_010.h index 45801d0bb2c..fc616e99cfd 100644 --- a/src/devices/sound/x1_010.h +++ b/src/devices/sound/x1_010.h @@ -10,14 +10,11 @@ class x1_010_device : public device_t, public device_sound_interface, public dev public: x1_010_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - // configuration - void set_address_xor(int addr) { m_xor = addr; } + u8 read(offs_t offset); + void write(offs_t offset, u8 data); - DECLARE_READ8_MEMBER ( read ); - DECLARE_WRITE8_MEMBER( write ); - - DECLARE_READ16_MEMBER ( word_r ); - DECLARE_WRITE16_MEMBER( word_w ); + u16 word_r(offs_t offset); + void word_w(offs_t offset, u16 data); void enable_w(int data); @@ -39,7 +36,6 @@ private: /* Variables only used here */ int m_rate; // Output sampling rate (Hz) - int m_xor; // address XOR sound_stream * m_stream; // Stream handle int m_sound_enable; // sound output enable/disable std::unique_ptr<uint8_t[]> m_reg; // X1-010 Register & wave form area @@ -52,7 +48,4 @@ private: DECLARE_DEVICE_TYPE(X1_010, x1_010_device) -#define MCFG_X1_010_ADDRESS_XOR(_addr) \ - downcast<x1_010_device &>(*device).set_address_xor(_addr); - #endif // MAME_SOUND_X1_010_H diff --git a/src/devices/sound/ym2413.cpp b/src/devices/sound/ym2413.cpp index 4d9da3d1dee..69ad6b31e33 100644 --- a/src/devices/sound/ym2413.cpp +++ b/src/devices/sound/ym2413.cpp @@ -1616,6 +1616,14 @@ void ym2413_device::device_start() } //------------------------------------------------- +// device_clock_changed +//------------------------------------------------- +void ym2413_device::device_clock_changed() +{ + m_stream->set_sample_rate(clock() / 72); +} + +//------------------------------------------------- // device_reset - device-specific reset //------------------------------------------------- diff --git a/src/devices/sound/ym2413.h b/src/devices/sound/ym2413.h index 410ed10fcf9..8f496645ee9 100644 --- a/src/devices/sound/ym2413.h +++ b/src/devices/sound/ym2413.h @@ -19,6 +19,7 @@ public: protected: // device-level overrides virtual void device_start() override; + virtual void device_clock_changed() override; virtual void device_reset() override; // sound stream update overrides diff --git a/src/devices/sound/ymf262.cpp b/src/devices/sound/ymf262.cpp index f69c15da9d4..280168ef4c1 100644 --- a/src/devices/sound/ymf262.cpp +++ b/src/devices/sound/ymf262.cpp @@ -1351,7 +1351,7 @@ static void OPL3_initalize(OPL3 *chip) /* logerror("YMF262: freqbase=%f\n", chip->freqbase); */ /* Timer base time */ - chip->TimerBase = attotime::from_hz(chip->clock) * (8*36); + chip->TimerBase = chip->clock ? attotime::from_hz(chip->clock) * (8 * 36) : attotime::zero; /* make fnumber -> increment counter table */ for( i=0 ; i < 1024 ; i++ ) @@ -1401,6 +1401,15 @@ static void OPL3_initalize(OPL3 *chip) } +static void OPL3_clock_changed(OPL3 *chip, int clock, int rate) +{ + chip->clock = clock; + chip->rate = rate; + + /* init global tables */ + OPL3_initalize(chip); +} + static inline void FM_KEYON(OPL3_SLOT *SLOT, uint32_t key_set) { if( !SLOT->key ) @@ -2360,11 +2369,7 @@ static OPL3 *OPL3Create(device_t *device, int clock, int rate, int type) chip->device = device; chip->type = type; - chip->clock = clock; - chip->rate = rate; - - /* init global tables */ - OPL3_initalize(chip); + OPL3_clock_changed(chip, clock, rate); /* reset chip */ OPL3ResetChip(chip); @@ -2531,6 +2536,11 @@ void * ymf262_init(device_t *device, int clock, int rate) return chip; } +void ymf262_clock_changed(void *chip, int clock, int rate) +{ + OPL3_clock_changed((OPL3 *)chip, clock, rate); +} + void ymf262_post_load(void *chip) { OPL3 *opl3 = (OPL3 *)chip; for (int ch=0; ch<18; ch++) { diff --git a/src/devices/sound/ymf262.h b/src/devices/sound/ymf262.h index b82a89b9724..bd1eed7cbe7 100644 --- a/src/devices/sound/ymf262.h +++ b/src/devices/sound/ymf262.h @@ -24,6 +24,7 @@ typedef void (*OPL3_UPDATEHANDLER)(device_t *device,int min_interval_us); void *ymf262_init(device_t *device, int clock, int rate); +void ymf262_clock_changed(void *chip, int clock, int rate); void ymf262_post_load(void *chip); void ymf262_shutdown(void *chip); void ymf262_reset_chip(void *chip); diff --git a/src/devices/sound/ymf278b.cpp b/src/devices/sound/ymf278b.cpp index d44f8cdaf00..18451d71732 100644 --- a/src/devices/sound/ymf278b.cpp +++ b/src/devices/sound/ymf278b.cpp @@ -778,6 +778,14 @@ READ8_MEMBER( ymf278b_device::read ) /**************************************************************************/ //------------------------------------------------- +// device_post_load - device-specific post load +//------------------------------------------------- +void ymf278b_device::device_post_load() +{ + ymf262_post_load(m_ymf262); +} + +//------------------------------------------------- // device_reset - device-specific reset //------------------------------------------------- @@ -841,6 +849,20 @@ void ymf278b_device::device_stop() m_ymf262 = nullptr; } +void ymf278b_device::device_clock_changed() +{ + m_stream->set_sample_rate(clock()/768); + + m_clock = clock(); + m_timer_base = m_clock ? attotime::from_hz(m_clock) * (19 * 36) : attotime::zero; + + // YMF262 related + + int ymf262_clock = clock() / (19/8.0); + ymf262_clock_changed(m_ymf262, ymf262_clock, ymf262_clock / 288); + m_stream_ymf262->set_sample_rate(ymf262_clock / 288); +} + void ymf278b_device::rom_bank_updated() { m_stream->update(); @@ -949,7 +971,7 @@ void ymf278b_device::device_start() m_clock = clock(); m_irq_handler.resolve(); - m_timer_base = attotime::from_hz(m_clock) * (19*36); + m_timer_base = m_clock ? attotime::from_hz(m_clock) * (19*36) : attotime::zero; m_timer_a = timer_alloc(TIMER_A); m_timer_b = timer_alloc(TIMER_B); m_timer_busy = timer_alloc(TIMER_BUSY_CLEAR); diff --git a/src/devices/sound/ymf278b.h b/src/devices/sound/ymf278b.h index 39456acfbe1..7b12ae322f9 100644 --- a/src/devices/sound/ymf278b.h +++ b/src/devices/sound/ymf278b.h @@ -24,9 +24,11 @@ public: protected: // device-level overrides + virtual void device_post_load() override; virtual void device_start() override; virtual void device_reset() override; virtual void device_stop() override; + virtual void device_clock_changed() override; virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; diff --git a/src/devices/sound/zsg2.cpp b/src/devices/sound/zsg2.cpp index 7a06ac072ef..42107792265 100644 --- a/src/devices/sound/zsg2.cpp +++ b/src/devices/sound/zsg2.cpp @@ -175,7 +175,7 @@ int16_t *zsg2_device::prepare_samples(uint32_t offset) m_mem_copy[offset] = block; offset *= 4; - // decompress 32 byte block to 4 16-bit samples + // decompress 32 bit block to 4 16-bit samples // 42222222 51111111 60000000 ssss3333 m_full_samples[offset|0] = block >> 8 & 0x7f; m_full_samples[offset|1] = block >> 16 & 0x7f; diff --git a/src/devices/video/hp1ll3.cpp b/src/devices/video/hp1ll3.cpp index 380fc6aa250..ede0a04ca01 100644 --- a/src/devices/video/hp1ll3.cpp +++ b/src/devices/video/hp1ll3.cpp @@ -1,5 +1,5 @@ // license:BSD-3-Clause -// copyright-holders:Sergey Svishchev +// copyright-holders:Sergey Svishchev, F. Ulivi /* HP 1LL3-0005 GPU emulation. @@ -47,12 +47,12 @@ * 0 -- no data * 1 -- write 1 word of data, then command * 2 -- write 2 words of data, then command - * 3 -- write command, then 12 words of data (= CONF only?) + * 3 -- write command, then 12 words of data (= CONF only) * 4 -- write 1 word of data, then command, then write X words of data, then write NOP * * (read) * - * 3 -- ??? + * 3 -- write command, then read 2 words of data (X & Y coordinates) * 4 -- write 1 word of data, then command, then read X words of data, then write NOP */ #define NOP 0 // type 0 @@ -62,39 +62,39 @@ #define WRMEM 7 // type 4, write GPU memory at offset, terminate by NOP #define RDMEM 8 // type 4, read GPU memory from offset, terminate by NOP #define WRSAD 9 // type 1, set screen area start address -#define WRORG 10 // type 1, set ??? +#define WRORG 10 // type 1, set raster start address #define WRDAD 11 // type 1, set data area start address (16x16 area fill, sprite and cursor) #define WRRR 12 // type 1, set replacement rule (rasterop) #define MOVEP 13 // type 2, move pointer -#define IMOVEP 14 +#define IMOVEP 14 // type 2, incremental move pointer #define DRAWP 15 // type 2, draw line -#define IDRAWP 16 -#define RDP 17 +#define IDRAWP 16 // type 2, incremental draw line +#define RDP 17 // type 3, read pointer position #define WRUDL 18 // type 1, set user-defined line pattern (16-bit) -#define WRWINSIZ 19 // type 2, set ??? -#define WRWINORG 20 // type 2, set ??? -#define COPY 21 // type 2 +#define WRWINSIZ 19 // type 2, set window size +#define WRWINORG 20 // type 2, set window origin +#define COPY 21 // type 2, block copy #define FILL 22 // type 1, fill area -#define FRAME 23 // type _, draw rectangle -#define SCROLUP 24 // type 2 -#define SCROLDN 25 // type 2 -#define SCROLLF 26 // type 2 -#define SCROLRT 27 // type 2 -#define RDWIN 28 // type 1 -#define WRWIN 29 // type 1 +#define FRAME 23 // type 0, draw rectangle +#define SCROLUP 24 // type 2, scroll up +#define SCROLDN 25 // type 2, scroll down +#define SCROLLF 26 // type 2, scroll left +#define SCROLRT 27 // type 2, scroll right +#define RDWIN 28 // type 4, read window raster +#define WRWIN 29 // type 4, write window raster #define RDWINPARM 30 -#define CR 31 -#define CRLFx 32 +#define CR 31 // type 0, carriage return +#define CRLFx 32 // type 0, CR + LF #define LABEL 36 // type 1, draw text -#define ENSP 38 // type 0, enable sprite +#define ENSP 38 // type 1, enable sprite #define DISSP 39 // type 0, disable sprite #define MOVESP 40 // type 2, move sprite -#define IMOVESP 41 -#define RDSP 42 -#define DRAWPX 43 // type _, draw single pixel +#define IMOVESP 41 // type 2, incremental move sprite +#define RDSP 42 // type 3, read sprite position +#define DRAWPX 43 // type 2, draw single pixel #define WRFAD 44 // type 1, set font area start address -#define ENCURS 45 // type 0 -#define DISCURS 46 // type 0 +#define ENCURS 45 // type 2, enable cursor +#define DISCURS 46 // type 0, disable cursor #define ID 63 @@ -126,8 +126,8 @@ #define RR_NAND 0xe #define RR_FORCE_ONE 0xf -#define WS 16 // bits in a word - +constexpr unsigned WS = 16; // bits in a word +constexpr uint16_t MSB_MASK = 0x8000; // Mask of MSB //************************************************************************** // MACROS / CONSTANTS @@ -145,10 +145,35 @@ } \ } while (0) +// This is the size for 9807. To be made configurable. +#define HPGPU_VRAM_SIZE 16384 -// enough for 9807a and 9808a both. -#define HPGPU_VRAM_SIZE (16384 * 4) - +// Index of words in configuration vector +enum +{ + CONF_HOR_0 = 0, // Horizontal timing, 1st word + CONF_HOR_1 = 1, // Horizontal timing, 2nd word + CONF_HOR_2 = 2, // Horizontal timing, 3rd word + CONF_HOR_3 = 3, // Horizontal timing, 4th word + CONF_VER_0 = 4, // Vertical timing, 1st word + CONF_VER_1 = 5, // Vertical timing, 2nd word + CONF_VER_2 = 6, // Vertical timing, 3rd word + CONF_VER_3 = 7, // Vertical timing, 4th word + CONF_WPL = 8, // Words per line + CONF_LINES = 9, // Lines + CONF_RAM_SIZE = 10 // RAM size (?) +}; + +// Fields of hor/ver timing words +enum +{ + HV_CNT_MASK = 0x3ff, // Mask of counter part + HV_ZONE_MASK = 0xc000, // Mask of zone part + HV_ZONE_0 = 0x0000, // Value for zone 0 + HV_ZONE_1 = 0x4000, // Value for zone 1 + HV_ZONE_2 = 0x8000, // Value for zone 2 + HV_ZONE_3 = 0xc000 // Value for zone 3 +}; //************************************************************************** // GLOBAL VARIABLES @@ -186,33 +211,32 @@ void hp1ll3_device::device_start() screen().register_screen_bitmap(m_bitmap); - m_cursor.allocate(16, 16); - m_sprite.allocate(16, 16); - - m_videoram = std::make_unique<uint16_t[]>(HPGPU_VRAM_SIZE*2); // x2 size to make WRWIN/RDWIN easier + m_videoram = std::make_unique<uint16_t[]>(HPGPU_VRAM_SIZE); + save_pointer(NAME(m_videoram) , HPGPU_VRAM_SIZE); + m_ram_addr_mask = 0x3fff; m_horiz_pix_total = visarea.max_x + 1; m_vert_pix_total = visarea.max_y + 1; } void hp1ll3_device::device_reset() { - m_input_ptr = m_command = 0; + m_io_ptr = m_command = 0; m_sad = m_fad = m_dad = m_org = m_rr = m_udl = 0; m_enable_video = m_enable_cursor = m_enable_sprite = m_busy = false; } - -inline void hp1ll3_device::point(int x, int y, int px) +uint16_t hp1ll3_device::get_pix_addr(uint16_t x , uint16_t y) const { - uint16_t offset = m_sad; + return m_org + y * m_conf[ CONF_WPL ] + x / WS; +} - offset += y*(m_horiz_pix_total/16) + (x >> 4); +inline void hp1ll3_device::point(int x, int y, bool pix, const uint16_t masks[]) +{ + uint16_t offset = get_pix_addr(x, y); + uint16_t pix_mask = MSB_MASK >> (x % WS); - if (px) - m_videoram[offset] |= (1 << (15-(x%16))); - else - m_videoram[offset] &= ~(1 << (15-(x%16))); + rmw_rop(offset, pix ? ~0 : 0, pix_mask, masks); } // Bresenham algorithm -- from ef9365.cpp @@ -226,6 +250,11 @@ void hp1ll3_device::line(int x1, int y1, int x2, int y2) int diago,horiz; unsigned char c1; + uint16_t rop_masks[ 4 ]; + get_rop_masks(m_rr, rop_masks); + + uint16_t udl_scan = MSB_MASK; + c1=0; incy=1; @@ -283,7 +312,11 @@ void hp1ll3_device::line(int x1, int y1, int x2, int y2) { do { - point(y,x,m_udl); + point(y,x,m_udl & udl_scan,rop_masks); + udl_scan >>= 1; + if (!udl_scan) { + udl_scan = MSB_MASK; + } if( e > 0 ) { @@ -303,7 +336,11 @@ void hp1ll3_device::line(int x1, int y1, int x2, int y2) { do { - point(x,y,m_udl); + point(x,y,m_udl & udl_scan,rop_masks); + udl_scan >>= 1; + if (!udl_scan) { + udl_scan = MSB_MASK; + } if( e > 0 ) { @@ -323,127 +360,289 @@ void hp1ll3_device::line(int x1, int y1, int x2, int y2) return; } -void hp1ll3_device::fill(int org_x, int org_y, int w, int h, int arg) +void hp1ll3_device::label(uint8_t chr, int width) +{ + draw_cursor_sprite(); + + Rectangle clip = get_window(); + Rectangle dst{{ m_cursor_x , m_cursor_y } , { uint16_t(width) , m_fontheight }}; + bitblt(m_fontdata + chr * 16 , 16 , 16 , Point { 0 , 0 } , clip , dst , m_rr); + m_cursor_x += width; + draw_cursor_sprite(); +} + +void hp1ll3_device::wr_video(uint16_t addr , uint16_t v) +{ + m_videoram[ addr & m_ram_addr_mask ] = v; +} + +uint16_t hp1ll3_device::rd_video(uint16_t addr) const { - uint16_t gfx, offset, mask, max_x = org_x + w; + return m_videoram[ addr & m_ram_addr_mask ]; +} - if (m_enable_cursor) bitblt(m_cursor_x, m_cursor_y, m_dad, 16, 16, RR_XOR); - if (m_enable_sprite) bitblt(m_sprite_x, m_sprite_y, m_dad + 16, 16, 16, RR_XOR); +void hp1ll3_device::get_rop_masks(uint16_t rop , uint16_t masks[]) +{ + masks[ 0 ] = BIT(rop , 0) ? ~0 : 0; + masks[ 1 ] = BIT(rop , 1) ? ~0 : 0; + masks[ 2 ] = BIT(rop , 2) ? ~0 : 0; + masks[ 3 ] = BIT(rop , 3) ? ~0 : 0; +} - for (int y = org_y; y < org_y + h; y++) { - gfx = m_videoram[m_dad + (0x10 * arg) + y%16]; - if (m_rr == RR_COPYINVERTED) gfx ^= 0xffff; - for (int x = org_x; x < max_x;) { - mask = 0xffff; - offset = m_sad + m_org + y * (m_horiz_pix_total/16) + (x >> 4); +uint16_t hp1ll3_device::apply_rop(uint16_t old_pix , uint16_t new_pix , uint16_t glob_mask , const uint16_t masks[]) +{ + uint16_t diff0 = old_pix & new_pix; + uint16_t diff1 = ~old_pix & new_pix; + uint16_t diff2 = old_pix & ~new_pix; + uint16_t diff3 = ~old_pix & ~new_pix; + + // The idea here is that ROP is forced to be "RR_OLD" for all zero bits in glob_mask + // so that the corresponding bits in new_pix are ignored + return + ((masks[ 0 ] | ~glob_mask) & diff0) | + (masks[ 1 ] & glob_mask & diff1) | + ((masks[ 2 ] | ~glob_mask) & diff2) | + (masks[ 3 ] & glob_mask & diff3); +} - if (offset >= m_sad + (m_vert_pix_total * m_horiz_pix_total/WS)) - DBG_LOG(0,"HPGPU",("buffer overflow in FILL: %04x (%d, %d)\n", offset, 16*x, y)); +void hp1ll3_device::rmw_rop(uint16_t addr , uint16_t new_pix , uint16_t glob_mask , const uint16_t masks[]) +{ + wr_video(addr , apply_rop(rd_video(addr), new_pix, glob_mask, masks)); +} - // clipping - if (x == org_x) { - mask >>= (org_x % WS); - x += (WS - (org_x % WS)); - } else { - if ((max_x - x) < WS) { - mask &= ~((1 << (WS - (max_x % WS))) - 1); - } - x += WS; - } - m_videoram[offset] &= ~mask; - m_videoram[offset] |= gfx & mask; +void hp1ll3_device::clip_coord(int size_1 , int& p1 , int origin_clip , int size_clip , int& origin_2 , int& size_2) const +{ + // origin_1 is implicitly 0 + int corner_2 = origin_2 + size_2; + // Clip origin_2 & p1 w.r.t. clip rectangle + int t = origin_2 - origin_clip; + if (t < 0) { + p1 -= t; + origin_2 = origin_clip; + } + // Clip size_2 w.r.t. clip rectangle + int corner_clip = origin_clip + size_clip; + if (corner_2 > corner_clip) { + size_2 = corner_clip - origin_2; + } + // Clip size_2 w.r.t. rectangle 1 (whose origin is 0,0) + t = p1 + size_2 - size_1; + if (t > 0) { + size_2 -= t; + } +} + +bool hp1ll3_device::bitblt(uint16_t src_base_addr , unsigned src_width , unsigned src_height , Point src_p , + const Rectangle& clip_rect , const Rectangle& dst_rect , uint16_t rop , bool use_m_org) +{ + DBG_LOG(3,0,("bitblt %04x,%u,%u,(%u,%u),(%u,%u,%u,%u),(%u,%u,%u,%u),%u\n" , src_base_addr , + src_width , + src_height , + src_p.x , + src_p.y , + clip_rect.origin.x , clip_rect.origin.y , clip_rect.size.x , clip_rect.size.y , + dst_rect.origin.x , dst_rect.origin.y , dst_rect.size.x , dst_rect.size.y , + rop)); + int src_x = src_p.x; + int dst_x = dst_rect.origin.x; + int dst_width = dst_rect.size.x; + int src_y = src_p.y; + int dst_y = dst_rect.origin.y; + int dst_height = dst_rect.size.y; + // Clip x-coordinates + clip_coord(src_width, src_x, clip_rect.origin.x, clip_rect.size.x, dst_x, dst_width); + // Clip y-coordinates + clip_coord(src_height, src_y, clip_rect.origin.y, clip_rect.size.y, dst_y, dst_height); + + DBG_LOG(3,0,("bitblt (%u,%u) (%u,%u,%u,%u)\n" , src_x , src_y , + dst_x , dst_y , dst_width , dst_height)); + if (dst_width <= 0 || dst_height <= 0) { + return false; + } + + unsigned dst_rounded_width = m_conf[ CONF_WPL ] * WS; + + // p1_pix & p2_pix point to a uniquely identified pixel in video RAM + unsigned p1_pix = unsigned(src_base_addr) * WS + src_x + src_width * src_y; + unsigned p2_pix = unsigned(use_m_org ? m_org : m_sad) * WS + dst_x + dst_rounded_width * dst_y; + + DBG_LOG(3,0,("bitblt p1_pix=%u p2_pix=%u\n" , p1_pix , p2_pix)); + uint16_t rop_masks[ 4 ]; + get_rop_masks(rop, rop_masks); + + if (p1_pix < p2_pix) { + // Move block going up (decrease y) + p1_pix += dst_height * src_width + dst_width - 1; + p2_pix += dst_height * dst_rounded_width + dst_width - 1; + DBG_LOG(3,0,("bitblt rev p1_pix=%u p2_pix=%u\n" , p1_pix , p2_pix)); + while (dst_height--) { + p1_pix -= src_width; + p2_pix -= dst_rounded_width; + rowbltneg(p1_pix , p2_pix , dst_width , rop_masks); + } + } else { + // Move block going down (increase y) + DBG_LOG(3,0,("bitblt fwd\n")); + while (dst_height--) { + rowbltpos(p1_pix , p2_pix , dst_width , rop_masks); + p1_pix += src_width; + p2_pix += dst_rounded_width; } } - if (m_enable_cursor) bitblt(m_cursor_x, m_cursor_y, m_dad, 16, 16, RR_XOR); - if (m_enable_sprite) bitblt(m_sprite_x, m_sprite_y, m_dad + 16, 16, 16, RR_XOR); + return true; } -// sprite drawing -- source is 16x16 px max, no window clipping -void hp1ll3_device::bitblt(int dstx, int dsty, uint16_t srcaddr, int width, int height, int op) +void hp1ll3_device::rowbltpos(unsigned p1_pix , unsigned p2_pix , int width , const uint16_t masks[]) { - uint16_t gfx, offset, mask; - int max_x, max_y; + // p1_pix and p2_pix point to the leftmost pixel of the row + while (width > 0) { + unsigned p1_word = p1_pix / WS; + unsigned p1_bit = p1_pix % WS; + // Get src pixels and align to MSB + uint16_t new_pix = rd_video(p1_word) << p1_bit; + if (p1_bit) { + new_pix |= rd_video(p1_word + 1) >> (WS - p1_bit); + } + unsigned p2_word = p2_pix / WS; + unsigned p2_bit = p2_pix % WS; + uint16_t old_pix = rd_video(p2_word); + unsigned w = p2_bit + width; + uint16_t glob_mask = ~0; + if (p2_bit) { + // Left end + new_pix >>= p2_bit; + glob_mask >>= p2_bit; + } + if (w < WS) { + // Right end + glob_mask &= ~0 << (WS - w); + } + rmw_rop(p2_word, new_pix, glob_mask, masks); + DBG_LOG(3,0,("rowbltpos %04x %04x %04x>%04x %u %u %u\n" , old_pix , new_pix , glob_mask , rd_video(p2_word) , p1_pix , p2_pix , width)); + w = WS - p2_bit; + p1_pix += w; + p2_pix += w; + width -= w; + } +} - max_x = dstx + width; - if (max_x >= m_horiz_pix_total) - max_x = m_horiz_pix_total; +void hp1ll3_device::rowbltneg(unsigned p1_pix , unsigned p2_pix , int width , const uint16_t masks[]) +{ + // p1_pix and p2_pix point to the rightmost pixel of the row + while (width > 0) { + unsigned p1_word = p1_pix / WS; + unsigned p1_bit = p1_pix % WS; + // Get src pixels and align to LSB + uint16_t new_pix = rd_video(p1_word) >> (WS - 1 - p1_bit); + if (p1_bit != (WS - 1)) { + new_pix |= rd_video(p1_word - 1) << (p1_bit + 1); + } + unsigned p2_word = p2_pix / WS; + unsigned p2_bit = p2_pix % WS; + uint16_t old_pix = rd_video(p2_word); + int w = p2_bit - width; + uint16_t glob_mask = ~0; + if (p2_bit != (WS - 1)) { + // Right end + new_pix <<= (WS - 1 - p2_bit); + glob_mask <<= (WS - 1 - p2_bit); + } + if (w >= 0) { + // Left end + uint16_t tmp = ~0; + glob_mask &= tmp >> (w + 1); + } + rmw_rop(p2_word, new_pix, glob_mask, masks); + DBG_LOG(3,0,("rowbltneg %04x %04x %04x>%04x %u %u %u\n" , old_pix , new_pix , glob_mask , rd_video(p2_word) , p1_pix , p2_pix , width)); + w = p2_bit + 1; + p1_pix -= w; + p2_pix -= w; + width -= w; + } +} - max_y = dsty + height; - if (max_y >= m_vert_pix_total) - max_y = m_vert_pix_total; +void hp1ll3_device::fill(const Rectangle& fill_rect , uint16_t pattern_no) +{ + uint16_t pattern_addr = get_pattern_addr(pattern_no); + + Point src_p{ 0 , 0 }; + // Align to 16x16 tiles in absolute coordinates + uint16_t start_x = fill_rect.origin.x & ~0xf; + Rectangle dst_rect{{ start_x , uint16_t(fill_rect.origin.y & ~0xf) } , { 16 , 16 }}; + + // Iterate over vertical span + while (bitblt(pattern_addr, 16, 16, src_p, fill_rect, dst_rect, m_rr)) { + // Iterate over horizontal span + do { + dst_rect.origin.x += 16; + } while (bitblt(pattern_addr, 16, 16, src_p, fill_rect, dst_rect, m_rr)); + dst_rect.origin.x = start_x; + dst_rect.origin.y += 16; + } +} - for (int y = dsty; y < max_y; y++) { - mask = 0xffff; - gfx = m_videoram[srcaddr + y - dsty] & mask; - offset = m_sad + y * (m_horiz_pix_total/16) + (dstx >> 4); +uint16_t hp1ll3_device::get_pattern_addr(uint16_t pattern_no) const +{ + return m_dad + pattern_no * 16; +} - if (offset >= m_sad + (m_vert_pix_total * m_horiz_pix_total/16)) - DBG_LOG(0,"HPGPU",("buffer overflow in bitblt: %04x (%d, %d)\n", offset, 16*dstx, y)); +void hp1ll3_device::draw_cursor() +{ + if (m_enable_cursor) { + Rectangle dst{{ uint16_t(m_cursor_x + m_cursor_offset) , m_cursor_y } , { 16 , 16 }}; + bitblt(get_pattern_addr(m_cursor_pattern), 16, 16, Point{ 0 , 0 }, get_screen(), dst, RR_XOR , false); + } +} - // are we crossing word boundary? - if (dstx % 16) { - if (op == RR_XOR) - { - m_videoram[offset ] ^= gfx >> (dstx % 16); - m_videoram[offset + 1] ^= gfx << (16 - (dstx % 16)); - } - } else { - if (op == RR_XOR) - { - m_videoram[offset] ^= (gfx & mask); - } - } +void hp1ll3_device::draw_sprite() +{ + if (m_enable_sprite) { + Rectangle dst{{ m_sprite_x , m_sprite_y } , { 16 , 16 }}; + bitblt(get_pattern_addr(m_sprite_pattern), 16, 16, Point{ 0 , 0 }, get_screen(), dst, RR_XOR , false); } } -void hp1ll3_device::label(uint8_t chr, int width) +void hp1ll3_device::draw_cursor_sprite() { - uint16_t x, gfx, bg = 0x3f, offset, font = m_fontdata + chr * 16; - int max_y = m_cursor_y + m_fontheight; + draw_cursor(); + draw_sprite(); +} - if (max_y >= m_window.org_y + m_window.height) - max_y = m_window.org_y + m_window.height - 1 - m_cursor_y; - else - max_y -= m_cursor_y; - - if (m_enable_cursor) bitblt(m_cursor_x, m_cursor_y, m_dad, 16, 16, RR_XOR); - if (m_enable_sprite) bitblt(m_sprite_x, m_sprite_y, m_dad + 16, 16, 16, RR_XOR); - - for (int y = 0; y < max_y; y++) { - x = m_cursor_x; - offset = m_sad + (m_cursor_y + y) * (m_horiz_pix_total/16) + (x >> 4); - gfx = m_videoram[font + y] >> (16 - width); - - if (offset >= m_sad + (m_vert_pix_total * m_horiz_pix_total/16)) - DBG_LOG(0,"HPGPU",("buffer overflow in LABEL: %04x (%d, %d)\n", offset, 16*x, y)); - - // are we crossing word boundary? - if ((x % 16) > (16 - width)) { - if (m_rr == RR_COPYINVERTED) { - m_videoram[offset ] |= bg >> ((x % 16) - (16 - width)); - m_videoram[offset + 1] |= bg << (16 - ((x + width) % 16)); - } else { - m_videoram[offset ] &= ~(bg>> ((x % 16) - (16 - width))); - m_videoram[offset + 1] &= ~(bg<< (16 - ((x + width) % 16))); - } - m_videoram[offset ] ^= gfx >> ((x % 16) - (16 - width)); - m_videoram[offset + 1] ^= gfx << (16 - ((x + width) % 16)); - } else { - if (m_rr == RR_COPYINVERTED) { - m_videoram[offset ] |= bg << ((16 - width) - (x % 16)); - } else { - m_videoram[offset ] &= ~(bg<< ((16 - width) - (x % 16))); - } - m_videoram[offset ] ^= gfx << ((16 - width) - (x % 16)); - } +void hp1ll3_device::set_pen_pos(Point p) +{ + if (p.x != m_cursor_x || p.y != m_cursor_y) { + draw_cursor(); + m_cursor_x = p.x; + m_cursor_y = p.y; + draw_cursor(); } +} - m_cursor_x += width; - if (m_enable_cursor) bitblt(m_cursor_x, m_cursor_y, m_dad, 16, 16, RR_XOR); - if (m_enable_sprite) bitblt(m_sprite_x, m_sprite_y, m_dad + 16, 16, 16, RR_XOR); +void hp1ll3_device::set_sprite_pos(Point p) +{ + if (p.x != m_sprite_x || p.y != m_sprite_y) { + draw_sprite(); + m_sprite_x = p.x; + m_sprite_y = p.y; + draw_sprite(); + } } +hp1ll3_device::Rectangle hp1ll3_device::get_window() const +{ + return Rectangle{{ m_window.org_x , m_window.org_y } , { m_window.width , m_window.height }}; +} + +hp1ll3_device::Rectangle hp1ll3_device::get_screen() const +{ + return Rectangle{{ 0 , 0 } , { uint16_t(m_horiz_pix_total) , uint16_t(m_vert_pix_total) }}; +} + +void hp1ll3_device::apply_conf() +{ + // TODO: +} uint32_t hp1ll3_device::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { @@ -456,7 +655,7 @@ uint32_t hp1ll3_device::screen_update(screen_device &screen, bitmap_ind16 &bitma } // XXX last line is not actually drawn on real hw - for (y = 0; y < m_vert_pix_total-1; y++) { + for (y = 0; y < m_vert_pix_total; y++) { offset = m_sad + y*(m_horiz_pix_total/16); p = &m_bitmap.pix16(y); @@ -507,41 +706,73 @@ READ8_MEMBER( hp1ll3_device::read ) { uint8_t data = 0; - switch (offset) - { - case 0: + if (offset == 0) { data = m_busy ? 1 : 0; data |= 2; data |= (screen().vblank() ? 8 : 0); - break; - - case 2: - switch (m_command) - { - case RDMEM: - if (m_memory_ptr < HPGPU_VRAM_SIZE*2) { - if (m_memory_ptr & 1) { - data = m_videoram[m_memory_ptr >> 1] & 0xff; - } else { - data = m_videoram[m_memory_ptr >> 1] >> 8; + } else { + if ((m_io_ptr & 1) == 0) { + switch (m_command) + { + case RDMEM: + m_io_word = rd_video(m_memory_ptr++); + break; + + case RDWIN: + { + uint16_t addr = get_pix_addr(m_rw_win_x , m_rw_win_y); + unsigned bit = m_rw_win_x % WS; + int width = m_window.width + m_window.org_x - m_rw_win_x; + if (width <= 0) { + m_command = NOP; + break; + } + unsigned w = std::min(WS , unsigned(width)); + + m_io_word = rd_video(addr) << bit; + if ((bit + w) > WS) { + m_io_word |= rd_video(addr + 1) >> (WS - bit); + } + m_io_word &= ~0 << (WS - w); + m_rw_win_x += w; + if (m_rw_win_x >= (m_window.width + m_window.org_x)) { + m_rw_win_x = m_window.org_x; + m_rw_win_y++; + if (m_rw_win_y >= (m_window.height + m_window.org_y)) { + m_command = NOP; + } + } + } + break; + + case RDP: + if (m_io_ptr == 0) { + m_io_word = m_cursor_x; + } else if (m_io_ptr == 2) { + m_io_word = m_cursor_y; + } + break; + + case RDSP: + if (m_io_ptr == 0) { + m_io_word = m_sprite_x; + } else if (m_io_ptr == 2) { + m_io_word = m_sprite_y; + } + break; + case ID: + /* + * 'diagb' ROM accepts either of these ID values + * 0x3003, 0x4004, 0x5005, 0x6006 + */ + m_io_word = 0x4004; + break; } - m_memory_ptr++; - } - break; - - /* - * 'diagb' ROM accepts either of these ID values - * 0x3003, 0x4004, 0x5005, 0x6006 - */ - case ID: - data = 0x40; - break; + data = uint8_t(m_io_word >> 8); + } else { + data = m_io_word & 0xff; } - break; - - case 3: - if (m_command == ID) data = 0x04; - break; + m_io_ptr++; } DBG_LOG(1,"HPGPU", ("R @ %d == %02x\n", offset, data)); @@ -558,68 +789,77 @@ WRITE8_MEMBER( hp1ll3_device::write ) { DBG_LOG(1,"HPGPU", ("W @ %d <- %02x\n", offset, data)); - switch (offset) - { - case 0: + if (offset == 0) { command(data); - break; - - case 2: - case 3: - switch (m_command) - { - case CONF: - if (m_conf_ptr < 2 * ARRAY_LENGTH(m_conf)) { - if (m_conf_ptr & 1) { - m_conf[m_conf_ptr >> 1] |= data; - DBG_LOG(1,"HPGPU",("CONF data word %d received: %04X\n", m_conf_ptr >> 1, m_conf[m_conf_ptr >> 1])); - } else { - m_conf[m_conf_ptr >> 1] = data << 8; - } - } else { - if (m_conf_ptr & 1) { - m_input[0] |= data; - DBG_LOG(1,"HPGPU",("unexpected CONF data word %d discarded: %04X\n", m_conf_ptr >> 1, m_input[0])); - } else { - m_input[0] = data << 8; - } - } - m_conf_ptr++; - break; - - case WRMEM: - if (m_memory_ptr < HPGPU_VRAM_SIZE*2) { - if (m_memory_ptr & 1) { - m_videoram[m_memory_ptr >> 1] |= data; - } else { - m_videoram[m_memory_ptr >> 1] = data << 8; + } else { + if ((m_io_ptr & 1) == 0) { + m_io_word = uint16_t(data) << 8; + } else { + m_io_word |= data; + switch (m_command) + { + case CONF: + m_conf[ m_io_ptr >> 1 ] = m_io_word; + DBG_LOG(1,"HPGPU",("CONF data word %d received: %04X\n", m_io_ptr >> 1, m_io_word)); + if ((m_io_ptr >> 1) == 10) { + apply_conf(); + m_io_ptr = -1; + m_command = NOP; + } + break; + + case WRMEM: + wr_video(m_memory_ptr++ , m_io_word); + break; + + case WRWIN: + { + uint16_t rop_masks[ 4 ]; + get_rop_masks(m_rr , rop_masks); + + uint16_t addr = get_pix_addr(m_rw_win_x , m_rw_win_y); + uint16_t glob_mask = ~0; + unsigned bit = m_rw_win_x % WS; + int width = m_window.width + m_window.org_x - m_rw_win_x; + if (width <= 0) { + m_command = NOP; + draw_cursor_sprite(); + } else { + unsigned w = std::min(WS , unsigned(width)); + + glob_mask >>= bit; + if ((bit + w) < WS) { + glob_mask &= ~0 << (WS - (bit + w)); + } + rmw_rop(addr , m_io_word >> bit , glob_mask , rop_masks); + DBG_LOG(3, 0, ("WRWIN (%u,%u) %d %04x %04x\n" , m_rw_win_x , m_rw_win_y , width , m_io_word >> bit , glob_mask)); + if ((bit + w) > WS) { + unsigned pad = WS - bit; + glob_mask = ~0 << (2 * WS - bit - w); + rmw_rop(addr + 1 , uint16_t(m_io_word << pad) , glob_mask , rop_masks); + DBG_LOG(3, 0, ("WRWIN %u %04x %04x\n" , pad , m_io_word << pad , glob_mask)); + } + m_rw_win_x += w; + if (m_rw_win_x >= (m_window.width + m_window.org_x)) { + m_rw_win_x = m_window.org_x; + m_rw_win_y++; + if (m_rw_win_y >= (m_window.height + m_window.org_y)) { + m_command = NOP; + draw_cursor_sprite(); + } + } + } + } + break; + + default: + if (m_io_ptr <= 4) { + m_input[ m_io_ptr / 2 ] = m_io_word; + } + DBG_LOG(2,"HPGPU",("wrote %02x at %d, input buffer is %04X %04X\n", data, m_io_ptr, m_input[0], m_input[1])); } - m_memory_ptr++; - } - break; - - default: - switch (m_input_ptr) - { - case 0: - m_input[0] = data << 8; - break; - - case 1: - m_input[0] |= data; - break; - - case 2: - m_input[1] = data << 8; - break; - - case 3: - m_input[1] |= data; - break; - } - DBG_LOG(2,"HPGPU",("wrote %02x at %d, input buffer is %04X %04X\n", data, m_input_ptr, m_input[0], m_input[1])); - m_input_ptr++; } + m_io_ptr++; } } @@ -638,11 +878,15 @@ void hp1ll3_device::command(int command) switch (m_command) { case RDMEM: - DBG_LOG(1,"HPGPU",("RDMEM of %d words at %04X complete\n", (m_memory_ptr >> 1) - m_input[0], m_input[0])); + DBG_LOG(1,"HPGPU",("RDMEM of %d words at %04X complete\n", m_memory_ptr - m_input[0], m_input[0])); break; case WRMEM: - DBG_LOG(1,"HPGPU",("WRMEM of %d words to %04X complete\n", (m_memory_ptr >> 1) - m_input[0], m_input[0])); + DBG_LOG(1,"HPGPU",("WRMEM of %d words to %04X complete\n", m_memory_ptr - m_input[0], m_input[0])); + break; + + case WRWIN: + draw_cursor_sprite(); break; } break; @@ -661,38 +905,23 @@ void hp1ll3_device::command(int command) case DISSP: DBG_LOG(2,"HPGPU",("command: DISSP [%d, 0x%x]\n", command, command)); - if (m_enable_sprite) { - bitblt(m_sprite_x, m_sprite_y, m_dad + 16, 16, 16, RR_XOR); - m_enable_sprite = false; - } + draw_sprite(); + m_enable_sprite = false; break; case ENSP: DBG_LOG(2,"HPGPU",("command: ENSP [%d, 0x%x]\n", command, command)); - if (m_enable_sprite) { - bitblt(m_sprite_x, m_sprite_y, m_dad + 16, 16, 16, RR_XOR); - } - bitblt(m_sprite_x, m_sprite_y, m_dad + 16, 16, 16, RR_XOR); + draw_sprite(); + m_sprite_pattern = m_input[ 0 ]; m_enable_sprite = true; + draw_sprite(); DBG_LOG(1,"HPGPU",("enable sprite; cursor %d,%d sprite %d,%d\n", m_cursor_x, m_cursor_y, m_sprite_x, m_sprite_y)); break; case DISCURS: DBG_LOG(2,"HPGPU",("command: DISCURS [%d, 0x%x]\n", command, command)); - if (m_enable_cursor) { - bitblt(m_cursor_x, m_cursor_y, m_dad, 16, 16, RR_XOR); - m_enable_cursor = false; - } - break; - - case ENCURS: - DBG_LOG(2,"HPGPU",("command: ENCURS [%d, 0x%x]\n", command, command)); - if (m_enable_cursor) { - bitblt(m_cursor_x, m_cursor_y, m_dad, 16, 16, RR_XOR); - } - bitblt(m_cursor_x, m_cursor_y, m_dad, 16, 16, RR_XOR); - m_enable_cursor = true; - DBG_LOG(1,"HPGPU",("enable cursor; cursor %d,%d sprite %d,%d\n", m_cursor_x, m_cursor_y, m_sprite_x, m_sprite_y)); + draw_cursor(); + m_enable_cursor = false; break; // type 1 commands -- 1 word of data expected in the buffer @@ -710,10 +939,10 @@ void hp1ll3_device::command(int command) // ?? used by diagnostic ROM case 6: - m_fontheight = m_videoram[m_fad]; - m_fontdata = m_fad + m_videoram[m_fad + 1] + 2; + m_fontheight = rd_video(m_fad); + m_fontdata = m_fad + rd_video(m_fad + 1) + 2; DBG_LOG(1,"HPGPU",("font data set: FAD %04X header %d bitmaps %04X height %d\n", - m_fad, m_videoram[m_fad + 1], m_fontdata, m_fontheight)); + m_fad, rd_video(m_fad + 1), m_fontdata, m_fontheight)); break; // start of data area @@ -731,7 +960,7 @@ void hp1ll3_device::command(int command) // set replacement rule (raster op) case WRRR: DBG_LOG(2,"HPGPU",("command: WRRR [%d, 0x%x] (0x%04x)\n", command, command, m_input[0])); - m_rr = m_input[0]; + m_rr = m_input[ 0 ]; break; // set user-defined line pattern @@ -743,9 +972,11 @@ void hp1ll3_device::command(int command) // area fill case FILL: DBG_LOG(2,"HPGPU",("command: FILL [%d, 0x%x] (0x%04x) from (%d,%d) size (%d,%d) rop 0x%x\n", - command, command, m_input[0], - m_window.org_x, m_window.org_y, m_window.width, m_window.height, m_rr)); - fill(m_window.org_x, m_window.org_y, m_window.width, m_window.height, m_input[0]); + command, command, m_input[0], + m_window.org_x, m_window.org_y, m_window.width, m_window.height, m_rr)); + draw_cursor_sprite(); + fill(get_window() , m_input[0]); + draw_cursor_sprite(); break; case LABEL: @@ -753,16 +984,37 @@ void hp1ll3_device::command(int command) (m_input[0]<32||m_input[0]>127) ? ' ' : m_input[0], m_cursor_x, m_cursor_y)); c = m_input[0] & 255; w = (c & 1) ? - (m_videoram[m_fad + 2 + (c>>1)] & 255) : - (m_videoram[m_fad + 2 + (c>>1)] >> 8); + (rd_video(m_fad + 2 + (c>>1)) & 255) : + (rd_video(m_fad + 2 + (c>>1)) >> 8); label(c, w); break; + // Write window + case WRWIN: + DBG_LOG(2,"HPGPU",("command: WRWIN [%d, 0x%x] offset=%u size(%d,%d)\n",command, command, m_input[0], m_window.width, m_window.height)); + // m_input[0] is offset (to be implemented) + m_rw_win_x = m_window.org_x; + m_rw_win_y = m_window.org_y; + draw_cursor_sprite(); + break; + + // Read window + case RDWIN: + DBG_LOG(2,"HPGPU",("command: RDWIN [%d, 0x%x] offset=%u\n",command, command, m_input[0])); + // m_input[0] is offset (to be implemented) + m_rw_win_x = m_window.org_x; + m_rw_win_y = m_window.org_y; + break; + // type 2 commands -- 2 words of data expected in the buffer case DRAWPX: - DBG_LOG(2,"HPGPU",("command: DRAWPX [%d, 0x%x] (%d, %d)\n", command, command, m_input[0], m_input[1])); - point(m_input[0], m_input[1],(m_rr != RR_COPYINVERTED)); + { + DBG_LOG(2,"HPGPU",("command: DRAWPX [%d, 0x%x] (%d, %d)\n", command, command, m_input[0], m_input[1])); + uint16_t rop_masks[ 4 ]; + get_rop_masks(m_rr , rop_masks); + point(m_input[0], m_input[1], true, rop_masks); + } break; // set window size @@ -779,34 +1031,80 @@ void hp1ll3_device::command(int command) m_window.org_y = m_input[1]; break; + // Copy + case COPY: + { + DBG_LOG(2,"HPGPU",("command: COPY [%d, 0x%x] (%d, %d)\n", command, command, m_input[0], m_input[1])); + draw_cursor_sprite(); + unsigned rounded_width = m_conf[ CONF_WPL ] * WS; + Rectangle dst_rect{{ m_input[ 0 ] , m_input[ 1 ] } , { m_window.width , m_window.height }}; + // COPY apparently doesn't clip anything + bitblt(m_org , rounded_width , 0xffff , Point{ m_window.org_x , m_window.org_y } , + Rectangle{{ 0 , 0 } , { uint16_t(rounded_width) , 0xffff }} , dst_rect , m_rr); + draw_cursor_sprite(); + } + break; + // move pointer absolute case MOVEP: DBG_LOG(2,"HPGPU",("command: MOVEP [%d, 0x%x] (%d, %d)\n", command, command, m_input[0], m_input[1])); - if (m_enable_cursor) bitblt(m_cursor_x, m_cursor_y, m_dad, 16, 16, RR_XOR); - if (m_enable_sprite) bitblt(m_sprite_x, m_sprite_y, m_dad + 16, 16, 16, RR_XOR); - m_cursor_x = m_input[0]; - m_cursor_y = m_input[1]; + set_pen_pos(Point{ m_input[ 0 ] , m_input[ 1 ] }); m_saved_x = m_cursor_x; - if (m_enable_cursor) bitblt(m_cursor_x, m_cursor_y, m_dad, 16, 16, RR_XOR); - if (m_enable_sprite) bitblt(m_sprite_x, m_sprite_y, m_dad + 16, 16, 16, RR_XOR); + break; + + // Scroll UP + case SCROLUP: + { + DBG_LOG(2,"HPGPU",("command: SCROLUP [%d, 0x%x] (%d, %d)\n", command, command, m_input[0], m_input[1])); + draw_cursor_sprite(); + Point src_p{ m_window.org_x , uint16_t(m_window.org_y + m_input[ 1 ]) }; + Rectangle dst_rect = get_window(); + dst_rect.size.y -= m_input[ 1 ]; + bitblt(m_org , m_horiz_pix_total , m_vert_pix_total , src_p , get_window() , dst_rect , m_rr); + dst_rect.origin.y += dst_rect.size.y; + dst_rect.size.y = m_input[ 1 ]; + fill(dst_rect , m_input[ 0 ]); + draw_cursor_sprite(); + } + break; + + // Scroll DOWN + case SCROLDN: + { + DBG_LOG(2,"HPGPU",("command: SCROLDN [%d, 0x%x] (%d, %d)\n", command, command, m_input[0], m_input[1])); + draw_cursor_sprite(); + Point src_p{ m_window.org_x , m_window.org_y }; + Rectangle dst_rect = get_window(); + dst_rect.origin.y += m_input[ 1 ]; + dst_rect.size.y -= m_input[ 1 ]; + bitblt(m_org , m_horiz_pix_total , m_vert_pix_total , src_p , get_window() , dst_rect , m_rr); + dst_rect.origin.y = m_window.org_y; + dst_rect.size.y = m_input[ 1 ]; + fill(dst_rect , m_input[ 0 ]); + draw_cursor_sprite(); + } + break; + + case ENCURS: + DBG_LOG(2,"HPGPU",("command: ENCURS [%d, 0x%x]\n", command, command)); + draw_cursor(); + m_cursor_pattern = m_input[ 0 ]; + m_cursor_offset = m_input[ 1 ]; + m_enable_cursor = true; + draw_cursor(); + DBG_LOG(1,"HPGPU",("enable cursor; cursor %d,%d sprite %d,%d\n", m_cursor_x, m_cursor_y, m_sprite_x, m_sprite_y)); break; // carriage return, line feed case CRLFx: DBG_LOG(2,"HPGPU",("command: CRLF [%d, 0x%x] (%d, %d)\n", command, command, m_input[0], m_input[1])); - if (m_enable_cursor) bitblt(m_cursor_x, m_cursor_y, m_dad, 16, 16, RR_XOR); - if (m_enable_sprite) bitblt(m_sprite_x, m_sprite_y, m_dad + 16, 16, 16, RR_XOR); - m_cursor_x = m_saved_x; - m_cursor_y += m_fontheight; - if (m_enable_cursor) bitblt(m_cursor_x, m_cursor_y, m_dad, 16, 16, RR_XOR); - if (m_enable_sprite) bitblt(m_sprite_x, m_sprite_y, m_dad + 16, 16, 16, RR_XOR); + set_pen_pos(Point{ m_saved_x , uint16_t(m_cursor_y + m_fontheight) }); break; // move sprite absolute case MOVESP: DBG_LOG(2,"HPGPU",("command: MOVESP [%d, 0x%x] (%d, %d)\n", command, command, m_input[0], m_input[1])); - m_sprite_x = m_input[0]; - m_sprite_y = m_input[1]; + set_sprite_pos(Point{ m_input[ 0 ] , m_input[ 1 ] }); break; // draw to ... @@ -814,14 +1112,12 @@ void hp1ll3_device::command(int command) DBG_LOG(2,"HPGPU",("command: DRAWP [%d, 0x%x] (%d, %d) to (%d, %d)\n", command, command, m_cursor_x, m_cursor_y, m_input[0], m_input[1])); line(m_cursor_x, m_cursor_y, m_input[0], m_input[1]); - m_cursor_x = m_input[0]; - m_cursor_y = m_input[1]; + set_pen_pos(Point{ m_input[ 0 ] , m_input[ 1 ] }); break; // type 3 command -- CONF -- accept configuration parameters (11 words) case CONF: - m_conf_ptr = 0; break; // type 4 commands -- like type 1 plus data is read or written after command, terminated by NOP @@ -830,7 +1126,12 @@ void hp1ll3_device::command(int command) case WRMEM: DBG_LOG(2,"HPGPU",("command: %s [%d, 0x%x] (0x%04x)\n", command == RDMEM?"RDMEM":"WRMEM", command, command, m_input[0])); - m_memory_ptr = m_input[0] << 1; // memory is word-addressable + m_memory_ptr = m_input[0]; // memory is word-addressable + break; + + // type 3 read commands + case RDP: + case RDSP: break; default: @@ -838,6 +1139,6 @@ void hp1ll3_device::command(int command) break; } - m_input_ptr = 0; + m_io_ptr = 0; m_command = command; } diff --git a/src/devices/video/hp1ll3.h b/src/devices/video/hp1ll3.h index b8c9b45e007..2360b190af6 100644 --- a/src/devices/video/hp1ll3.h +++ b/src/devices/video/hp1ll3.h @@ -43,16 +43,43 @@ protected: virtual void device_reset() override; private: + struct Point { + uint16_t x , y; + }; + struct Rectangle { + Point origin; + Point size; + }; + void command(int command); - inline void point(int x, int y, int px); + uint16_t get_pix_addr(uint16_t x , uint16_t y) const; + inline void point(int x, int y, bool pix, const uint16_t masks[]); void label(uint8_t chr, int width); - void fill(int x, int y, int w, int h, int arg); void line(int x_from, int y_from, int x_to, int y_to); - void bitblt(int dstx, int dsty, uint16_t srcaddr, int width, int height, int op); - - uint16_t m_conf[12], m_input[2]; - int m_input_ptr, m_memory_ptr, m_conf_ptr; + void wr_video(uint16_t addr , uint16_t v); + uint16_t rd_video(uint16_t addr) const; + static void get_rop_masks(uint16_t rop , uint16_t masks[]); + static uint16_t apply_rop(uint16_t old_pix , uint16_t new_pix , uint16_t glob_mask , const uint16_t masks[]); + void rmw_rop(uint16_t addr , uint16_t new_pix , uint16_t glob_mask , const uint16_t masks[]); + void clip_coord(int size_1 , int& p1 , int origin_clip , int size_clip , int& origin_2 , int& size_2) const; + bool bitblt(uint16_t src_base_addr , unsigned src_width , unsigned src_height , Point src_p , + const Rectangle& clip_rect , const Rectangle& dst_rect , uint16_t rop , bool use_m_org = true); + void rowbltpos(unsigned p1_pix , unsigned p2_pix , int width , const uint16_t masks[]); + void rowbltneg(unsigned p1_pix , unsigned p2_pix , int width , const uint16_t masks[]); + void fill(const Rectangle& fill_rect , uint16_t pattern_no); + uint16_t get_pattern_addr(uint16_t pattern_no) const; + void draw_cursor(); + void draw_sprite(); + void draw_cursor_sprite(); + void set_pen_pos(Point p); + void set_sprite_pos(Point p); + Rectangle get_window() const; + Rectangle get_screen() const; + void apply_conf(); + + uint16_t m_conf[ 11 ] , m_input[2] , m_io_word; + int m_io_ptr, m_memory_ptr; int m_command, m_horiz_pix_total, m_vert_pix_total; uint16_t m_sad; @@ -64,15 +91,20 @@ private: bool m_enable_video, m_enable_cursor, m_enable_sprite; uint16_t m_cursor_x, m_cursor_y, m_saved_x; + uint16_t m_cursor_pattern; + uint16_t m_cursor_offset; uint16_t m_sprite_x, m_sprite_y; + uint16_t m_sprite_pattern; struct { - uint16_t width, height, org_x, org_y, width_w; + uint16_t width, height, org_x, org_y; } m_window; std::unique_ptr<uint16_t[]> m_videoram; + uint16_t m_ram_addr_mask; + uint16_t m_rw_win_x , m_rw_win_y; bool m_busy; - bitmap_ind16 m_bitmap, m_cursor, m_sprite; + bitmap_ind16 m_bitmap; }; diff --git a/src/devices/video/huc6272.cpp b/src/devices/video/huc6272.cpp index 839bf285e20..3755a1d870d 100644 --- a/src/devices/video/huc6272.cpp +++ b/src/devices/video/huc6272.cpp @@ -379,21 +379,23 @@ WRITE32_MEMBER( huc6272_device::write ) // device_add_mconfig - add device configuration //------------------------------------------------- -MACHINE_CONFIG_START(huc6272_device::device_add_mconfig) - MCFG_DEVICE_ADD("scsi", SCSI_PORT, 0) - MCFG_SCSI_RST_HANDLER(WRITELINE("scsi_ctrl_in", input_buffer_device, write_bit7)) - MCFG_SCSI_BSY_HANDLER(WRITELINE("scsi_ctrl_in", input_buffer_device, write_bit6)) - MCFG_SCSI_REQ_HANDLER(WRITELINE("scsi_ctrl_in", input_buffer_device, write_bit5)) - MCFG_SCSI_MSG_HANDLER(WRITELINE("scsi_ctrl_in", input_buffer_device, write_bit4)) - MCFG_SCSI_CD_HANDLER(WRITELINE("scsi_ctrl_in", input_buffer_device, write_bit3)) - MCFG_SCSI_IO_HANDLER(WRITELINE("scsi_ctrl_in", input_buffer_device, write_bit2)) - MCFG_SCSI_SEL_HANDLER(WRITELINE("scsi_ctrl_in", input_buffer_device, write_bit1)) - - MCFG_SCSI_DATA_INPUT_BUFFER("scsi_data_in") - - MCFG_SCSI_OUTPUT_LATCH_ADD("scsi_data_out", "scsi") - MCFG_DEVICE_ADD("scsi_ctrl_in", INPUT_BUFFER, 0) - MCFG_DEVICE_ADD("scsi_data_in", INPUT_BUFFER, 0) - - MCFG_SCSIDEV_ADD("scsi:" SCSI_PORT_DEVICE1, "cdrom", SCSICD, SCSI_ID_1) -MACHINE_CONFIG_END +void huc6272_device::device_add_mconfig(machine_config &config) +{ + scsi_port_device &scsibus(SCSI_PORT(config, "scsi")); + scsibus.set_data_input_buffer("scsi_data_in"); + scsibus.rst_handler().set("scsi_ctrl_in", FUNC(input_buffer_device::write_bit7)); + scsibus.bsy_handler().set("scsi_ctrl_in", FUNC(input_buffer_device::write_bit6)); + scsibus.req_handler().set("scsi_ctrl_in", FUNC(input_buffer_device::write_bit5)); + scsibus.msg_handler().set("scsi_ctrl_in", FUNC(input_buffer_device::write_bit4)); + scsibus.cd_handler().set("scsi_ctrl_in", FUNC(input_buffer_device::write_bit3)); + scsibus.io_handler().set("scsi_ctrl_in", FUNC(input_buffer_device::write_bit2)); + scsibus.sel_handler().set("scsi_ctrl_in", FUNC(input_buffer_device::write_bit1)); + + output_latch_device &scsiout(OUTPUT_LATCH(config, "scsi_data_out")); + scsibus.set_output_latch(scsiout); + + INPUT_BUFFER(config, "scsi_ctrl_in"); + INPUT_BUFFER(config, "scsi_data_in"); + + scsibus.set_slot_device(1, "cdrom", SCSICD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_1)); +} diff --git a/src/devices/video/pc_vga.cpp b/src/devices/video/pc_vga.cpp index 86385b658cd..78575c56e7d 100644 --- a/src/devices/video/pc_vga.cpp +++ b/src/devices/video/pc_vga.cpp @@ -314,6 +314,7 @@ void vga_device::device_start() save_item(NAME(vga.crtc.map13)); save_item(NAME(vga.crtc.irq_clear)); save_item(NAME(vga.crtc.irq_disable)); + save_item(NAME(vga.crtc.no_wrap)); save_item(NAME(vga.gc.index)); save_item(NAME(vga.gc.latch)); @@ -359,6 +360,7 @@ void svga_device::device_start() save_item(NAME(svga.bank_r)); save_item(NAME(svga.bank_w)); + save_item(NAME(svga.rgb8_en)); save_item(NAME(svga.rgb15_en)); save_item(NAME(svga.rgb16_en)); save_item(NAME(svga.rgb24_en)); @@ -575,6 +577,7 @@ void vga_device::vga_vh_vga(bitmap_rgb32 &bitmap, const rectangle &cliprect) int yi; int xi; int pel_shift = (vga.attribute.pel_shift & 6); + int addrmask = vga.crtc.no_wrap ? -1 : 0xffff; /* line compare is screen sensitive */ mask_comp = 0x3ff; //| (LINES & 0x300); @@ -605,7 +608,7 @@ void vga_device::vga_vh_vga(bitmap_rgb32 &bitmap, const rectangle &cliprect) { if(!screen().visible_area().contains(c+xi-(pel_shift), line + yi)) continue; - bitmapline[c+xi-(pel_shift)] = pen(vga.memory[(pos & 0xffff)+((xi >> 1)*0x10000)]); + bitmapline[c+xi-(pel_shift)] = pen(vga.memory[(pos & addrmask)+((xi >> 1)*0x10000)]); } } } @@ -632,7 +635,7 @@ void vga_device::vga_vh_vga(bitmap_rgb32 &bitmap, const rectangle &cliprect) { if(!screen().visible_area().contains(c+xi-(pel_shift), line + yi)) continue; - bitmapline[c+xi-pel_shift] = pen(vga.memory[(pos+(xi >> 1)) & 0xffff]); + bitmapline[c+xi-pel_shift] = pen(vga.memory[(pos+(xi >> 1)) & addrmask]); } } } diff --git a/src/devices/video/pc_vga.h b/src/devices/video/pc_vga.h index 6dc4fa6737e..afde9bfdfd6 100644 --- a/src/devices/video/pc_vga.h +++ b/src/devices/video/pc_vga.h @@ -184,6 +184,7 @@ protected: /**/ uint8_t map13; /**/ uint8_t irq_clear; /**/ uint8_t irq_disable; + uint8_t no_wrap; } crtc; struct diff --git a/src/devices/video/poly.h b/src/devices/video/poly.h index 3f1053e65c6..cda1c46dc3b 100644 --- a/src/devices/video/poly.h +++ b/src/devices/video/poly.h @@ -513,8 +513,8 @@ uint32_t poly_manager<_BaseType, _ObjectData, _MaxParams, _MaxPolys>::render_til // clip coordinates int32_t v1yclip = v1y; int32_t v2yclip = v2y + ((m_flags & FLAG_INCLUDE_BOTTOM_EDGE) ? 1 : 0); - v1yclip = std::max(v1yclip, cliprect.min_y); - v2yclip = std::min(v2yclip, cliprect.max_y + 1); + v1yclip = std::max(v1yclip, cliprect.top()); + v2yclip = std::min(v2yclip, cliprect.bottom() + 1); if (v2yclip - v1yclip <= 0) return 0; @@ -558,10 +558,10 @@ uint32_t poly_manager<_BaseType, _ObjectData, _MaxParams, _MaxPolys>::render_til istopx++; // apply left/right clipping - if (istartx < cliprect.min_x) - istartx = cliprect.min_x; - if (istopx > cliprect.max_x) - istopx = cliprect.max_x + 1; + if (istartx < cliprect.left()) + istartx = cliprect.left(); + if (istopx > cliprect.right()) + istopx = cliprect.right() + 1; if (istartx >= istopx) return 0; @@ -658,8 +658,8 @@ uint32_t poly_manager<_BaseType, _ObjectData, _MaxParams, _MaxPolys>::render_tri // clip coordinates int32_t v1yclip = v1y; int32_t v3yclip = v3y + ((m_flags & FLAG_INCLUDE_BOTTOM_EDGE) ? 1 : 0); - v1yclip = std::max(v1yclip, cliprect.min_y); - v3yclip = std::min(v3yclip, cliprect.max_y + 1); + v1yclip = std::max(v1yclip, cliprect.top()); + v3yclip = std::min(v3yclip, cliprect.bottom() + 1); if (v3yclip - v1yclip <= 0) return 0; @@ -772,10 +772,10 @@ uint32_t poly_manager<_BaseType, _ObjectData, _MaxParams, _MaxPolys>::render_tri istopx++; // apply left/right clipping - if (istartx < cliprect.min_x) - istartx = cliprect.min_x; - if (istopx > cliprect.max_x) - istopx = cliprect.max_x + 1; + if (istartx < cliprect.left()) + istartx = cliprect.left(); + if (istopx > cliprect.right()) + istopx = cliprect.right() + 1; // set the extent and update the total pixel count if (istartx >= istopx) @@ -848,8 +848,8 @@ template<typename _BaseType, class _ObjectData, int _MaxParams, int _MaxPolys> uint32_t poly_manager<_BaseType, _ObjectData, _MaxParams, _MaxPolys>::render_triangle_custom(const rectangle &cliprect, render_delegate callback, int startscanline, int numscanlines, const extent_t *extents) { // clip coordinates - int32_t v1yclip = std::max(startscanline, cliprect.min_y); - int32_t v3yclip = std::min(startscanline + numscanlines, cliprect.max_y + 1); + int32_t v1yclip = std::max(startscanline, cliprect.top()); + int32_t v3yclip = std::min(startscanline + numscanlines, cliprect.bottom() + 1); if (v3yclip - v1yclip <= 0) return 0; @@ -883,14 +883,14 @@ uint32_t poly_manager<_BaseType, _ObjectData, _MaxParams, _MaxPolys>::render_tri int32_t istartx = srcextent.startx, istopx = srcextent.stopx; // apply left/right clipping - if (istartx < cliprect.min_x) - istartx = cliprect.min_x; - if (istartx > cliprect.max_x) - istartx = cliprect.max_x + 1; - if (istopx < cliprect.min_x) - istopx = cliprect.min_x; - if (istopx > cliprect.max_x) - istopx = cliprect.max_x + 1; + if (istartx < cliprect.left()) + istartx = cliprect.left(); + if (istartx > cliprect.right()) + istartx = cliprect.right() + 1; + if (istopx < cliprect.left()) + istopx = cliprect.left(); + if (istopx > cliprect.right()) + istopx = cliprect.right() + 1; // set the extent and update the total pixel count extent_t &extent = unit.extent[extnum]; @@ -956,8 +956,8 @@ uint32_t poly_manager<_BaseType, _ObjectData, _MaxParams, _MaxPolys>::render_pol // clip coordinates int32_t minyclip = miny; int32_t maxyclip = maxy + ((m_flags & FLAG_INCLUDE_BOTTOM_EDGE) ? 1 : 0); - minyclip = std::max(minyclip, cliprect.min_y); - maxyclip = std::min(maxyclip, cliprect.max_y + 1); + minyclip = std::max(minyclip, cliprect.top()); + maxyclip = std::min(maxyclip, cliprect.bottom() + 1); if (maxyclip - minyclip <= 0) return 0; @@ -1092,14 +1092,14 @@ uint32_t poly_manager<_BaseType, _ObjectData, _MaxParams, _MaxPolys>::render_pol istopx++; // apply left/right clipping - if (istartx < cliprect.min_x) + if (istartx < cliprect.left()) { for (int paramnum = 0; paramnum < paramcount; paramnum++) - extent.param[paramnum].start += (cliprect.min_x - istartx) * extent.param[paramnum].dpdx; - istartx = cliprect.min_x; + extent.param[paramnum].start += (cliprect.left() - istartx) * extent.param[paramnum].dpdx; + istartx = cliprect.left(); } - if (istopx > cliprect.max_x) - istopx = cliprect.max_x + 1; + if (istopx > cliprect.right()) + istopx = cliprect.right() + 1; // set the extent and update the total pixel count if (istartx >= istopx) diff --git a/src/devices/video/ramdac.h b/src/devices/video/ramdac.h index e090257023c..be8e885b54a 100644 --- a/src/devices/video/ramdac.h +++ b/src/devices/video/ramdac.h @@ -18,10 +18,10 @@ // INTERFACE CONFIGURATION MACROS //************************************************************************** -#define MCFG_RAMDAC_ADD(_tag, _map, _palette_tag) \ +#define MCFG_RAMDAC_ADD(_tag, _map, _palette) \ MCFG_DEVICE_ADD(_tag, RAMDAC, 0) \ MCFG_DEVICE_ADDRESS_MAP(0, _map) \ - downcast<ramdac_device &>(*device).set_palette_tag(_palette_tag); + downcast<ramdac_device &>(*device).set_palette(_palette); #define MCFG_RAMDAC_COLOR_BASE(_color_base) \ downcast<ramdac_device &>(*device).set_color_base(_color_base); @@ -44,7 +44,7 @@ public: ramdac_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); // configuration - void set_palette_tag(const char *tag) { m_palette.set_tag(tag); } + template <typename T> void set_palette(T &&tag) { m_palette.set_tag(std::forward<T>(tag)); } void set_color_base(uint32_t color_base) { m_color_base = color_base; } void set_split_read(int split) { m_split_read_reg = split; } diff --git a/src/devices/video/stvvdp2.cpp b/src/devices/video/stvvdp2.cpp index cc1da5b39d3..3c64fce6690 100644 --- a/src/devices/video/stvvdp2.cpp +++ b/src/devices/video/stvvdp2.cpp @@ -2502,27 +2502,27 @@ void saturn_state::stv_vdp2_drawgfxzoom( y_index = 0; } - if( sx < myclip.min_x) + if( sx < myclip.left()) { /* clip left */ - int pixels = myclip.min_x-sx; + int pixels = myclip.left()-sx; sx += pixels; x_index_base += pixels*dx; } - if( sy < myclip.min_y ) + if( sy < myclip.top() ) { /* clip top */ - int pixels = myclip.min_y-sy; + int pixels = myclip.top()-sy; sy += pixels; y_index += pixels*dy; } /* NS 980211 - fixed incorrect clipping */ - if( ex > myclip.max_x+1 ) + if( ex > myclip.right()+1 ) { /* clip right */ - int pixels = ex-myclip.max_x-1; + int pixels = ex-myclip.right()-1; ex -= pixels; } - if( ey > myclip.max_y+1 ) + if( ey > myclip.bottom()+1 ) { /* clip bottom */ - int pixels = ey-myclip.max_y-1; + int pixels = ey-myclip.bottom()-1; ey -= pixels; } @@ -2703,27 +2703,27 @@ void saturn_state::stv_vdp2_drawgfxzoom_rgb555( y_index = 0; } - if( sx < myclip.min_x) + if( sx < myclip.left()) { /* clip left */ - int pixels = myclip.min_x-sx; + int pixels = myclip.left()-sx; sx += pixels; x_index_base += pixels*dx; } - if( sy < myclip.min_y ) + if( sy < myclip.top() ) { /* clip top */ - int pixels = myclip.min_y-sy; + int pixels = myclip.top()-sy; sy += pixels; y_index += pixels*dy; } /* NS 980211 - fixed incorrect clipping */ - if( ex > myclip.max_x+1 ) + if( ex > myclip.right()+1 ) { /* clip right */ - int pixels = ex-myclip.max_x-1; + int pixels = ex-myclip.right()-1; ex -= pixels; } - if( ey > myclip.max_y+1 ) + if( ey > myclip.bottom()+1 ) { /* clip bottom */ - int pixels = ey-myclip.max_y-1; + int pixels = ey-myclip.bottom()-1; ey -= pixels; } @@ -2893,27 +2893,27 @@ void saturn_state::stv_vdp2_drawgfx_rgb555( bitmap_rgb32 &dest_bmp, const rectan y_index = 0; } - if( sx < myclip.min_x) + if( sx < myclip.left()) { /* clip left */ - int pixels = myclip.min_x-sx; + int pixels = myclip.left()-sx; sx += pixels; x_index_base += pixels*dx; } - if( sy < myclip.min_y ) + if( sy < myclip.top() ) { /* clip top */ - int pixels = myclip.min_y-sy; + int pixels = myclip.top()-sy; sy += pixels; y_index += pixels*dy; } /* NS 980211 - fixed incorrect clipping */ - if( ex > myclip.max_x+1 ) + if( ex > myclip.right()+1 ) { /* clip right */ - int pixels = ex-myclip.max_x-1; + int pixels = ex-myclip.right()-1; ex -= pixels; } - if( ey > myclip.max_y+1 ) + if( ey > myclip.bottom()+1 ) { /* clip bottom */ - int pixels = ey-myclip.max_y-1; + int pixels = ey-myclip.bottom()-1; ey -= pixels; } @@ -3006,27 +3006,27 @@ void saturn_state::stv_vdp2_drawgfx_rgb888( bitmap_rgb32 &dest_bmp, const rectan y_index = 0; } - if( sx < myclip.min_x) + if( sx < myclip.left()) { /* clip left */ - int pixels = myclip.min_x-sx; + int pixels = myclip.left()-sx; sx += pixels; x_index_base += pixels*dx; } - if( sy < myclip.min_y ) + if( sy < myclip.top() ) { /* clip top */ - int pixels = myclip.min_y-sy; + int pixels = myclip.top()-sy; sy += pixels; y_index += pixels*dy; } /* NS 980211 - fixed incorrect clipping */ - if( ex > myclip.max_x+1 ) + if( ex > myclip.right()+1 ) { /* clip right */ - int pixels = ex-myclip.max_x-1; + int pixels = ex-myclip.right()-1; ex -= pixels; } - if( ey > myclip.max_y+1 ) + if( ey > myclip.bottom()+1 ) { /* clip bottom */ - int pixels = ey-myclip.max_y-1; + int pixels = ey-myclip.bottom()-1; ey -= pixels; } @@ -3096,29 +3096,29 @@ void saturn_state::stv_vdp2_drawgfx_alpha(bitmap_rgb32 &dest_bmp,const rectangle ey = sy + gfx->height(); /* clip left */ - if (sx < clip.min_x) + if (sx < clip.left()) { - int pixels = clip.min_x-sx; + int pixels = clip.left()-sx; sx += pixels; x_index_base += xinc*pixels; } /* clip top */ - if (sy < clip.min_y) - { int pixels = clip.min_y-sy; + if (sy < clip.top()) + { int pixels = clip.top()-sy; sy += pixels; y_index += yinc*pixels; } /* clip right */ - if (ex > clip.max_x+1) + if (ex > clip.right()+1) { - ex = clip.max_x+1; + ex = clip.right()+1; } /* clip bottom */ - if (ey > clip.max_y+1) + if (ey > clip.bottom()+1) { - ey = clip.max_y+1; + ey = clip.bottom()+1; } /* skip if inner loop doesn't draw anything */ @@ -3173,29 +3173,29 @@ void saturn_state::stv_vdp2_drawgfx_transpen(bitmap_rgb32 &dest_bmp,const rectan ey = sy + gfx->height(); /* clip left */ - if (sx < clip.min_x) + if (sx < clip.left()) { - int pixels = clip.min_x-sx; + int pixels = clip.left()-sx; sx += pixels; x_index_base += xinc*pixels; } /* clip top */ - if (sy < clip.min_y) - { int pixels = clip.min_y-sy; + if (sy < clip.top()) + { int pixels = clip.top()-sy; sy += pixels; y_index += yinc*pixels; } /* clip right */ - if (ex > clip.max_x+1) + if (ex > clip.right()+1) { - ex = clip.max_x+1; + ex = clip.right()+1; } /* clip bottom */ - if (ey > clip.max_y+1) + if (ey > clip.bottom()+1) { - ey = clip.max_y+1; + ey = clip.bottom()+1; } /* skip if inner loop doesn't draw anything */ @@ -3251,9 +3251,9 @@ void saturn_state::draw_4bpp_bitmap(bitmap_rgb32 &bitmap, const rectangle &clipr if(stv2_current_tilemap.fade_control & 1) pal_bank += ((stv2_current_tilemap.fade_control & 2) ? (2*2048) : (2048)); - for(ydst=cliprect.min_y;ydst<=cliprect.max_y;ydst++) + for(ydst=cliprect.top();ydst<=cliprect.bottom();ydst++) { - for(xdst=cliprect.min_x;xdst<=cliprect.max_x;xdst++) + for(xdst=cliprect.left();xdst<=cliprect.right();xdst++) { if(!stv_vdp2_window_process(xdst,ydst)) continue; @@ -3308,9 +3308,9 @@ void saturn_state::draw_8bpp_bitmap(bitmap_rgb32 &bitmap, const rectangle &clipr if(stv2_current_tilemap.fade_control & 1) pal_bank += ((stv2_current_tilemap.fade_control & 2) ? (2*2048) : (2048)); - for(ydst=cliprect.min_y;ydst<=cliprect.max_y;ydst++) + for(ydst=cliprect.top();ydst<=cliprect.bottom();ydst++) { - for(xdst=cliprect.min_x;xdst<=cliprect.max_x;xdst++) + for(xdst=cliprect.left();xdst<=cliprect.right();xdst++) { if(!stv_vdp2_window_process(xdst,ydst)) continue; @@ -3364,9 +3364,9 @@ void saturn_state::draw_11bpp_bitmap(bitmap_rgb32 &bitmap, const rectangle &clip if(stv2_current_tilemap.fade_control & 1) pal_bank = ((stv2_current_tilemap.fade_control & 2) ? (2*2048) : (2048)); - for(ydst=cliprect.min_y;ydst<=cliprect.max_y;ydst++) + for(ydst=cliprect.top();ydst<=cliprect.bottom();ydst++) { - for(xdst=cliprect.min_x;xdst<=cliprect.max_x;xdst++) + for(xdst=cliprect.left();xdst<=cliprect.right();xdst++) { if(!stv_vdp2_window_process(xdst,ydst)) continue; @@ -3418,9 +3418,9 @@ void saturn_state::draw_rgb15_bitmap(bitmap_rgb32 &bitmap, const rectangle &clip xsize_mask = (stv2_current_tilemap.linescroll_enable) ? 1024 : xsize; ysize_mask = (stv2_current_tilemap.vertical_linescroll_enable) ? 512 : ysize; - for(ydst=cliprect.min_y;ydst<=cliprect.max_y;ydst++) + for(ydst=cliprect.top();ydst<=cliprect.bottom();ydst++) { - for(xdst=cliprect.min_x;xdst<=cliprect.max_x;xdst++) + for(xdst=cliprect.left();xdst<=cliprect.right();xdst++) { if(!stv_vdp2_window_process(xdst,ydst)) continue; @@ -3476,9 +3476,9 @@ void saturn_state::draw_rgb32_bitmap(bitmap_rgb32 &bitmap, const rectangle &clip xsize_mask = (stv2_current_tilemap.linescroll_enable) ? 1024 : xsize; ysize_mask = (stv2_current_tilemap.vertical_linescroll_enable) ? 512 : ysize; - for(ydst=cliprect.min_y;ydst<=cliprect.max_y;ydst++) + for(ydst=cliprect.top();ydst<=cliprect.bottom();ydst++) { - for(xdst=cliprect.min_x;xdst<=cliprect.max_x;xdst++) + for(xdst=cliprect.left();xdst<=cliprect.right();xdst++) { if(!stv_vdp2_window_process(xdst,ydst)) continue; @@ -3958,7 +3958,7 @@ void saturn_state::stv_vdp2_draw_basic_tilemap(bitmap_rgb32 &bitmap, const recta { int drawyposinc = tilesizey*(stv2_current_tilemap.tile_size ? 2 : 1); drawypos = -(stv2_current_tilemap.scrolly*scaley); - while( ((drawypos + drawyposinc) >> 16) < cliprect.min_y ) + while( ((drawypos + drawyposinc) >> 16) < cliprect.top() ) { drawypos += drawyposinc; y++; @@ -3969,7 +3969,7 @@ void saturn_state::stv_vdp2_draw_basic_tilemap(bitmap_rgb32 &bitmap, const recta { drawypos += tilesizey*(stv2_current_tilemap.tile_size ? 2 : 1); } - if ((drawypos >> 16) > cliprect.max_y) break; + if ((drawypos >> 16) > cliprect.bottom()) break; ypageoffs = y & (pgtiles_y-1); @@ -3981,7 +3981,7 @@ void saturn_state::stv_vdp2_draw_basic_tilemap(bitmap_rgb32 &bitmap, const recta { int drawxposinc = tilesizex*(stv2_current_tilemap.tile_size ? 2 : 1); drawxpos = -(stv2_current_tilemap.scrollx*scalex); - while( ((drawxpos + drawxposinc) >> 16) < cliprect.min_x ) + while( ((drawxpos + drawxposinc) >> 16) < cliprect.left() ) { drawxpos += drawxposinc; x++; @@ -3992,7 +3992,7 @@ void saturn_state::stv_vdp2_draw_basic_tilemap(bitmap_rgb32 &bitmap, const recta { drawxpos+=tilesizex*(stv2_current_tilemap.tile_size ? 2 : 1); } - if ( (drawxpos >> 16) > cliprect.max_x ) break; + if ( (drawxpos >> 16) > cliprect.right() ) break; xpageoffs = x & (pgtiles_x-1); @@ -4190,7 +4190,7 @@ void saturn_state::stv_vdp2_draw_basic_tilemap(bitmap_rgb32 &bitmap, const recta if ( LOG_VDP2 ) { - logerror( "Layer RBG%d, size %d x %d\n", stv2_current_tilemap.layer_name & 0x7f, cliprect.max_x + 1, cliprect.max_y + 1 ); + logerror( "Layer RBG%d, size %d x %d\n", stv2_current_tilemap.layer_name & 0x7f, cliprect.right() + 1, cliprect.bottom() + 1 ); logerror( "Tiles: min %08X, max %08X\n", tilecodemin, tilecodemax ); logerror( "MAP size in dwords %08X\n", mpsize_dwords ); for (i = 0; i < stv2_current_tilemap.map_count; i++) @@ -4240,7 +4240,7 @@ void saturn_state::stv_vdp2_draw_basic_tilemap(bitmap_rgb32 &bitmap, const recta void saturn_state::stv_vdp2_check_tilemap_with_linescroll(bitmap_rgb32 &bitmap, const rectangle &cliprect) { rectangle mycliprect; - int cur_line = cliprect.min_y; + int cur_line = cliprect.top(); int address; int active_functions = 0; int32_t scroll_values[3], prev_scroll_values[3]; @@ -4278,7 +4278,7 @@ void saturn_state::stv_vdp2_check_tilemap_with_linescroll(bitmap_rgb32 &bitmap, if ( linezoom_enable ) active_functions++; // address of data table - address = stv2_current_tilemap.linescroll_table_address + active_functions*4*cliprect.min_y; + address = stv2_current_tilemap.linescroll_table_address + active_functions*4*cliprect.top(); // get the first scroll values for ( i = 0; i < active_functions; i++ ) @@ -4294,7 +4294,7 @@ void saturn_state::stv_vdp2_check_tilemap_with_linescroll(bitmap_rgb32 &bitmap, } } - while( cur_line <= cliprect.max_y ) + while( cur_line <= cliprect.bottom() ) { lines = 0; do @@ -4325,12 +4325,11 @@ void saturn_state::stv_vdp2_check_tilemap_with_linescroll(bitmap_rgb32 &bitmap, { scroll_values_equal &= (scroll_values[i] == prev_scroll_values[i]); } - } while( scroll_values_equal && ((cur_line + lines) <= cliprect.max_y) ); + } while( scroll_values_equal && ((cur_line + lines) <= cliprect.bottom()) ); // determined how many lines can be drawn // prepare clipping rectangle - mycliprect.min_y = cur_line; - mycliprect.max_y = cur_line + lines - 1; + mycliprect.sety(cur_line, cur_line + lines - 1); // prepare scroll values i = 0; @@ -4358,7 +4357,7 @@ void saturn_state::stv_vdp2_check_tilemap_with_linescroll(bitmap_rgb32 &bitmap, i++; } -// if ( LOG_VDP2 ) logerror( "Linescroll: y < %d, %d >, scrollx = %d, scrolly = %d, incx = %f\n", mycliprect.min_y, mycliprect.max_y, stv2_current_tilemap.scrollx, stv2_current_tilemap.scrolly, (float)stv2_current_tilemap.incx/65536.0 ); +// if ( LOG_VDP2 ) logerror( "Linescroll: y < %d, %d >, scrollx = %d, scrolly = %d, incx = %f\n", mycliprect.top(), mycliprect.bottom(), stv2_current_tilemap.scrollx, stv2_current_tilemap.scrolly, (float)stv2_current_tilemap.incx/65536.0 ); // render current tilemap portion if (stv2_current_tilemap.bitmap_enable) // this layer is a bitmap { @@ -4389,14 +4388,14 @@ void saturn_state::stv_vdp2_draw_line(bitmap_rgb32 &bitmap, const rectangle &cli { base_mask = STV_VDP2_VRAMSZ ? 0x7ffff : 0x3ffff; - for(y=cliprect.min_y;y<=cliprect.max_y;y++) + for(y=cliprect.top();y<=cliprect.bottom();y++) { base_offs = (STV_VDP2_LCTA & base_mask) << 1; if(STV_VDP2_LCCLMD) base_offs += (y / interlace) << 1; - for(x=cliprect.min_x;x<=cliprect.max_x;x++) + for(x=cliprect.left();x<=cliprect.right();x++) { uint16_t pen; @@ -4427,9 +4426,9 @@ void saturn_state::stv_vdp2_draw_mosaic(bitmap_rgb32 &bitmap, const rectangle &c if(STV_VDP2_LSMD == 3) v_size <<= 1; - for(y=cliprect.min_y;y<=cliprect.max_y;y+=v_size) + for(y=cliprect.top();y<=cliprect.bottom();y+=v_size) { - for(x=cliprect.min_x;x<=cliprect.max_x;x+=h_size) + for(x=cliprect.left();x<=cliprect.right();x+=h_size) { pix = bitmap.pix32(y, x); @@ -4484,10 +4483,9 @@ void saturn_state::stv_vdp2_check_tilemap(bitmap_rgb32 &bitmap, const rectangle //base_incx = stv2_current_tilemap.incx; //base_incy = stv2_current_tilemap.incy; - while(cur_char <= cliprect.max_x) + while(cur_char <= cliprect.right()) { - mycliprect.min_x = cur_char; - mycliprect.max_x = cur_char + 8 - 1; + mycliprect.setx(cur_char, cur_char + 8 - 1); uint32_t cur_address; int16_t char_scroll; @@ -4755,7 +4753,7 @@ void saturn_state::stv_vdp2_copy_roz_bitmap(bitmap_rgb32 &bitmap, xp = mul_fixed32( RP.A, RP.px - RP.cx ) + mul_fixed32( RP.B, RP.py - RP.cy ) + mul_fixed32( RP.C, RP.pz - RP.cz ) + RP.cx + RP.mx; yp = mul_fixed32( RP.D, RP.px - RP.cx ) + mul_fixed32( RP.E, RP.py - RP.cy ) + mul_fixed32( RP.F, RP.pz - RP.cz ) + RP.cy + RP.my; - for (vcnt = cliprect.min_y; vcnt <= cliprect.max_y; vcnt++ ) + for (vcnt = cliprect.top(); vcnt <= cliprect.bottom(); vcnt++ ) { /*xsp = RP.A * ( ( RP.xst + RP.dxst * (vcnt << 16) ) - RP.px ) + RP.B * ( ( RP.yst + RP.dyst * (vcnt << 16) ) - RP.py ) + @@ -4847,7 +4845,7 @@ void saturn_state::stv_vdp2_copy_roz_bitmap(bitmap_rgb32 &bitmap, dxs = mul_fixed32( kx, mul_fixed32( dx, 1 << (16-hcnt_shift))); dys = mul_fixed32( ky, mul_fixed32( dy, 1 << (16-hcnt_shift))); - for (hcnt = cliprect.min_x; hcnt <= cliprect.max_x; xs+=dxs, ys+=dys, hcnt++ ) + for (hcnt = cliprect.left(); hcnt <= cliprect.right(); xs+=dxs, ys+=dys, hcnt++ ) { x = xs >> 16; y = ys >> 16; @@ -4904,7 +4902,7 @@ void saturn_state::stv_vdp2_copy_roz_bitmap(bitmap_rgb32 &bitmap, } else { - for (hcnt = cliprect.min_x; hcnt <= cliprect.max_x; hcnt++ ) + for (hcnt = cliprect.left(); hcnt <= cliprect.right(); hcnt++ ) { switch( coeff_table_size ) { @@ -5830,13 +5828,13 @@ void saturn_state::stv_vdp2_draw_back(bitmap_rgb32 &bitmap, const rectangle &cli { base_mask = STV_VDP2_VRAMSZ ? 0x7ffff : 0x3ffff; - for(y=cliprect.min_y;y<=cliprect.max_y;y++) + for(y=cliprect.top();y<=cliprect.bottom();y++) { base_offs = ((STV_VDP2_BKTA ) & base_mask) << 1; if(STV_VDP2_BKCLMD) base_offs += ((y / interlace) << 1); - for(x=cliprect.min_x;x<=cliprect.max_x;x++) + for(x=cliprect.left();x<=cliprect.right();x++) { int r,g,b; uint16_t dot; @@ -6182,7 +6180,7 @@ uint8_t saturn_state::get_hblank( void ) const rectangle &visarea = m_screen->visible_area(); int cur_h = m_screen->hpos(); - if (cur_h > visarea.max_x) //TODO + if (cur_h > visarea.right()) //TODO return 1; return 0; @@ -6791,7 +6789,7 @@ void saturn_state::draw_sprites(bitmap_rgb32 &bitmap, const rectangle &cliprect, { if ( alpha_enabled == 0 ) { - for ( y = cliprect.min_y; y <= cliprect.max_y; y++ ) + for ( y = cliprect.top(); y <= cliprect.bottom(); y++ ) { if ( stv_sprite_priorities_usage_valid ) if (stv_sprite_priorities_in_fb_line[y][pri] == 0) @@ -6800,7 +6798,7 @@ void saturn_state::draw_sprites(bitmap_rgb32 &bitmap, const rectangle &cliprect, framebuffer_line = m_vdp1.framebuffer_display_lines[y]; bitmap_line = &bitmap.pix32(y); - for ( x = cliprect.min_x; x <= cliprect.max_x; x++ ) + for ( x = cliprect.left(); x <= cliprect.right(); x++ ) { if(!stv_vdp2_window_process(x,y)) continue; @@ -6884,7 +6882,7 @@ void saturn_state::draw_sprites(bitmap_rgb32 &bitmap, const rectangle &cliprect, } else //alpha_enabled == 1 { - for ( y = cliprect.min_y; y <= cliprect.max_y; y++ ) + for ( y = cliprect.top(); y <= cliprect.bottom(); y++ ) { if ( stv_sprite_priorities_usage_valid ) if (stv_sprite_priorities_in_fb_line[y][pri] == 0) @@ -6893,7 +6891,7 @@ void saturn_state::draw_sprites(bitmap_rgb32 &bitmap, const rectangle &cliprect, framebuffer_line = m_vdp1.framebuffer_display_lines[y]; bitmap_line = &bitmap.pix32(y); - for ( x = cliprect.min_x; x <= cliprect.max_x; x++ ) + for ( x = cliprect.left(); x <= cliprect.right(); x++ ) { if(!stv_vdp2_window_process(x,y)) continue; @@ -6993,7 +6991,7 @@ void saturn_state::draw_sprites(bitmap_rgb32 &bitmap, const rectangle &cliprect, } else { - for ( y = cliprect.min_y; y <= cliprect.max_y / (interlace_framebuffer+1); y++ ) + for ( y = cliprect.top(); y <= cliprect.bottom() / (interlace_framebuffer+1); y++ ) { if ( stv_sprite_priorities_usage_valid ) if (stv_sprite_priorities_in_fb_line[y][pri] == 0) @@ -7010,7 +7008,7 @@ void saturn_state::draw_sprites(bitmap_rgb32 &bitmap, const rectangle &cliprect, bitmap_line2 = &bitmap.pix32(2*y + 1); } - for ( x = cliprect.min_x; x <= cliprect.max_x /(double_x+1) ; x++ ) + for ( x = cliprect.left(); x <= cliprect.right() /(double_x+1) ; x++ ) { if(!stv_vdp2_window_process(x,y)) continue; diff --git a/src/devices/video/tlc34076.h b/src/devices/video/tlc34076.h index c9e678cde12..fb816dd1181 100644 --- a/src/devices/video/tlc34076.h +++ b/src/devices/video/tlc34076.h @@ -29,6 +29,12 @@ public: }; // construction/destruction + tlc34076_device(const machine_config &mconfig, const char *tag, device_t *owner, tlc34076_bits bits) + : tlc34076_device(mconfig, tag, owner, (uint32_t)0) + { + set_bits(bits); + } + tlc34076_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); // configuration helpers diff --git a/src/devices/video/tms34061.h b/src/devices/video/tms34061.h index f4f674b1083..e4f92e75ac2 100644 --- a/src/devices/video/tms34061.h +++ b/src/devices/video/tms34061.h @@ -47,6 +47,7 @@ public: void set_rowshift(uint8_t rowshift) { m_rowshift = rowshift; } void set_vram_size(uint32_t vramsize) { m_vramsize = vramsize; } template <class Object> devcb_base &set_interrupt_callback(Object &&cb) { return m_interrupt_cb.set_callback(std::forward<Object>(cb)); } + auto int_callback() { return m_interrupt_cb.bind(); } /* reads/writes to the 34061 */ uint8_t read(address_space &space, int col, int row, int func); diff --git a/src/devices/video/upd7220.cpp b/src/devices/video/upd7220.cpp index f7174ae4543..16bbc507a5a 100644 --- a/src/devices/video/upd7220.cpp +++ b/src/devices/video/upd7220.cpp @@ -408,15 +408,14 @@ inline void upd7220_device::recompute_parameters() attoseconds_t refresh = HZ_TO_ATTOSECONDS(clock() * 8) * horiz_pix_total * vert_pix_total; - rectangle visarea; - - visarea.min_x = 0; //(m_hs + m_hbp) * 8; - visarea.min_y = m_vbp; //m_vs + m_vbp; - visarea.max_x = m_aw * horiz_mult - 1;//horiz_pix_total - (m_hfp * 8) - 1; - visarea.max_y = m_al * vert_mult + m_vbp - 1;//vert_pix_total - m_vfp - 1; + rectangle visarea( + 0, //(m_hs + m_hbp) * 8; + m_aw * horiz_mult - 1,//horiz_pix_total - (m_hfp * 8) - 1; + m_vbp, //m_vs + m_vbp; + m_al * vert_mult + m_vbp - 1);//vert_pix_total - m_vfp - 1; LOG("uPD7220 Screen: %u x %u @ %f Hz\n", horiz_pix_total, vert_pix_total, 1 / ATTOSECONDS_TO_DOUBLE(refresh)); - LOG("Visible Area: (%u, %u) - (%u, %u)\n", visarea.min_x, visarea.min_y, visarea.max_x, visarea.max_y); + LOG("Visible Area: (%u, %u) - (%u, %u)\n", visarea.left(), visarea.top(), visarea.right(), visarea.bottom()); LOG("%d %d %d %d %d\n",m_hs,m_hbp,m_aw,m_hfp,m_pitch); LOG("%d %d %d %d\n",m_vs,m_vbp,m_al,m_vfp); diff --git a/src/devices/video/vic4567.cpp b/src/devices/video/vic4567.cpp index 8154f6a9458..14e22461c23 100644 --- a/src/devices/video/vic4567.cpp +++ b/src/devices/video/vic4567.cpp @@ -1906,25 +1906,25 @@ void vic3_device::draw_bitplanes() if (XPOS > 0) { - vis.set(0, XPOS - 1, 0, visarea.max_y); + vis.set(0, XPOS - 1, 0, visarea.bottom()); m_bitmap->fill(FRAMECOLOR, vis); } - if (XPOS + VIC3_BITPLANES_WIDTH < visarea.max_x) + if (XPOS + VIC3_BITPLANES_WIDTH < visarea.right()) { - vis.set(XPOS + VIC3_BITPLANES_WIDTH, visarea.max_x, 0, visarea.max_y); + vis.set(XPOS + VIC3_BITPLANES_WIDTH, visarea.right(), 0, visarea.bottom()); m_bitmap->fill(FRAMECOLOR, vis); } if (YPOS > 0) { - vis.set(0, visarea.max_x, 0, YPOS - 1); + vis.set(0, visarea.right(), 0, YPOS - 1); m_bitmap->fill(FRAMECOLOR, vis); } - if (YPOS + VIC3_LINES < visarea.max_y) + if (YPOS + VIC3_LINES < visarea.bottom()) { - vis.set(0, visarea.max_x, YPOS + VIC3_LINES, visarea.max_y); + vis.set(0, visarea.right(), YPOS + VIC3_LINES, visarea.bottom()); m_bitmap->fill(FRAMECOLOR, vis); } } diff --git a/src/emu/addrmap.cpp b/src/emu/addrmap.cpp index 3a3fb07c899..7e6b56ed3a1 100644 --- a/src/emu/addrmap.cpp +++ b/src/emu/addrmap.cpp @@ -162,29 +162,80 @@ address_map_entry &address_map_entry::m(device_t *device, address_map_constructo address_map_entry &address_map_entry::r(read8_delegate func) { assert(!func.isnull()); - m_read.m_type = AMH_DEVICE_DELEGATE; + m_read.m_type = AMH_DEVICE_DELEGATE_F; m_read.m_bits = 8; m_read.m_name = func.name(); m_rproto8 = func; return *this; } - address_map_entry &address_map_entry::w(write8_delegate func) { assert(!func.isnull()); - m_write.m_type = AMH_DEVICE_DELEGATE; + m_write.m_type = AMH_DEVICE_DELEGATE_F; m_write.m_bits = 8; m_write.m_name = func.name(); m_wproto8 = func; return *this; } +address_map_entry &address_map_entry::r(read8s_delegate func) +{ + assert(!func.isnull()); + m_read.m_type = AMH_DEVICE_DELEGATE_S; + m_read.m_bits = 8; + m_read.m_name = func.name(); + m_rproto8s = func; + return *this; +} + +address_map_entry &address_map_entry::w(write8s_delegate func) +{ + assert(!func.isnull()); + m_write.m_type = AMH_DEVICE_DELEGATE_S; + m_write.m_bits = 8; + m_write.m_name = func.name(); + m_wproto8s = func; + return *this; +} + +address_map_entry &address_map_entry::r(read8sm_delegate func) +{ + assert(!func.isnull()); + m_read.m_type = AMH_DEVICE_DELEGATE_SM; + m_read.m_bits = 8; + m_read.m_name = func.name(); + m_rproto8sm = func; + return *this; +} + +address_map_entry &address_map_entry::w(write8sm_delegate func) +{ + assert(!func.isnull()); + m_write.m_type = AMH_DEVICE_DELEGATE_SM; + m_write.m_bits = 8; + m_write.m_name = func.name(); + m_wproto8sm = func; + return *this; +} + +address_map_entry &address_map_entry::r(read8smo_delegate func) +{ + assert(!func.isnull()); + m_read.m_type = AMH_DEVICE_DELEGATE_SMO; + m_read.m_bits = 8; + m_read.m_name = func.name(); + m_rproto8smo = func; + return *this; +} -address_map_entry &address_map_entry::rw(read8_delegate rfunc, write8_delegate wfunc) +address_map_entry &address_map_entry::w(write8smo_delegate func) { - r(rfunc); - w(wfunc); + assert(!func.isnull()); + m_write.m_type = AMH_DEVICE_DELEGATE_SMO; + m_write.m_bits = 8; + m_write.m_name = func.name(); + m_wproto8smo = func; return *this; } @@ -197,29 +248,80 @@ address_map_entry &address_map_entry::rw(read8_delegate rfunc, write8_delegate w address_map_entry &address_map_entry::r(read16_delegate func) { assert(!func.isnull()); - m_read.m_type = AMH_DEVICE_DELEGATE; + m_read.m_type = AMH_DEVICE_DELEGATE_F; m_read.m_bits = 16; m_read.m_name = func.name(); m_rproto16 = func; return *this; } - address_map_entry &address_map_entry::w(write16_delegate func) { assert(!func.isnull()); - m_write.m_type = AMH_DEVICE_DELEGATE; + m_write.m_type = AMH_DEVICE_DELEGATE_F; m_write.m_bits = 16; m_write.m_name = func.name(); m_wproto16 = func; return *this; } +address_map_entry &address_map_entry::r(read16s_delegate func) +{ + assert(!func.isnull()); + m_read.m_type = AMH_DEVICE_DELEGATE_S; + m_read.m_bits = 16; + m_read.m_name = func.name(); + m_rproto16s = func; + return *this; +} -address_map_entry &address_map_entry::rw(read16_delegate rfunc, write16_delegate wfunc) +address_map_entry &address_map_entry::w(write16s_delegate func) { - r(rfunc); - w(wfunc); + assert(!func.isnull()); + m_write.m_type = AMH_DEVICE_DELEGATE_S; + m_write.m_bits = 16; + m_write.m_name = func.name(); + m_wproto16s = func; + return *this; +} + +address_map_entry &address_map_entry::r(read16sm_delegate func) +{ + assert(!func.isnull()); + m_read.m_type = AMH_DEVICE_DELEGATE_SM; + m_read.m_bits = 16; + m_read.m_name = func.name(); + m_rproto16sm = func; + return *this; +} + +address_map_entry &address_map_entry::w(write16sm_delegate func) +{ + assert(!func.isnull()); + m_write.m_type = AMH_DEVICE_DELEGATE_SM; + m_write.m_bits = 16; + m_write.m_name = func.name(); + m_wproto16sm = func; + return *this; +} + +address_map_entry &address_map_entry::r(read16smo_delegate func) +{ + assert(!func.isnull()); + m_read.m_type = AMH_DEVICE_DELEGATE_SMO; + m_read.m_bits = 16; + m_read.m_name = func.name(); + m_rproto16smo = func; + return *this; +} + +address_map_entry &address_map_entry::w(write16smo_delegate func) +{ + assert(!func.isnull()); + m_write.m_type = AMH_DEVICE_DELEGATE_SMO; + m_write.m_bits = 16; + m_write.m_name = func.name(); + m_wproto16smo = func; return *this; } @@ -232,32 +334,82 @@ address_map_entry &address_map_entry::rw(read16_delegate rfunc, write16_delegate address_map_entry &address_map_entry::r(read32_delegate func) { assert(!func.isnull()); - m_read.m_type = AMH_DEVICE_DELEGATE; + m_read.m_type = AMH_DEVICE_DELEGATE_F; m_read.m_bits = 32; m_read.m_name = func.name(); m_rproto32 = func; return *this; } - address_map_entry &address_map_entry::w(write32_delegate func) { assert(!func.isnull()); - m_write.m_type = AMH_DEVICE_DELEGATE; + m_write.m_type = AMH_DEVICE_DELEGATE_F; m_write.m_bits = 32; m_write.m_name = func.name(); m_wproto32 = func; return *this; } +address_map_entry &address_map_entry::r(read32s_delegate func) +{ + assert(!func.isnull()); + m_read.m_type = AMH_DEVICE_DELEGATE_S; + m_read.m_bits = 32; + m_read.m_name = func.name(); + m_rproto32s = func; + return *this; +} -address_map_entry &address_map_entry::rw(read32_delegate rfunc, write32_delegate wfunc) +address_map_entry &address_map_entry::w(write32s_delegate func) { - r(rfunc); - w(wfunc); + assert(!func.isnull()); + m_write.m_type = AMH_DEVICE_DELEGATE_S; + m_write.m_bits = 32; + m_write.m_name = func.name(); + m_wproto32s = func; return *this; } +address_map_entry &address_map_entry::r(read32sm_delegate func) +{ + assert(!func.isnull()); + m_read.m_type = AMH_DEVICE_DELEGATE_SM; + m_read.m_bits = 32; + m_read.m_name = func.name(); + m_rproto32sm = func; + return *this; +} + +address_map_entry &address_map_entry::w(write32sm_delegate func) +{ + assert(!func.isnull()); + m_write.m_type = AMH_DEVICE_DELEGATE_SM; + m_write.m_bits = 32; + m_write.m_name = func.name(); + m_wproto32sm = func; + return *this; +} + +address_map_entry &address_map_entry::r(read32smo_delegate func) +{ + assert(!func.isnull()); + m_read.m_type = AMH_DEVICE_DELEGATE_SMO; + m_read.m_bits = 32; + m_read.m_name = func.name(); + m_rproto32smo = func; + return *this; +} + +address_map_entry &address_map_entry::w(write32smo_delegate func) +{ + assert(!func.isnull()); + m_write.m_type = AMH_DEVICE_DELEGATE_SMO; + m_write.m_bits = 32; + m_write.m_name = func.name(); + m_wproto32smo = func; + return *this; +} //------------------------------------------------- // r/w/rw - handler setters for @@ -267,29 +419,80 @@ address_map_entry &address_map_entry::rw(read32_delegate rfunc, write32_delegate address_map_entry &address_map_entry::r(read64_delegate func) { assert(!func.isnull()); - m_read.m_type = AMH_DEVICE_DELEGATE; + m_read.m_type = AMH_DEVICE_DELEGATE_F; m_read.m_bits = 64; m_read.m_name = func.name(); m_rproto64 = func; return *this; } - address_map_entry &address_map_entry::w(write64_delegate func) { assert(!func.isnull()); - m_write.m_type = AMH_DEVICE_DELEGATE; + m_write.m_type = AMH_DEVICE_DELEGATE_F; m_write.m_bits = 64; m_write.m_name = func.name(); m_wproto64 = func; return *this; } +address_map_entry &address_map_entry::r(read64s_delegate func) +{ + assert(!func.isnull()); + m_read.m_type = AMH_DEVICE_DELEGATE_S; + m_read.m_bits = 64; + m_read.m_name = func.name(); + m_rproto64s = func; + return *this; +} + +address_map_entry &address_map_entry::w(write64s_delegate func) +{ + assert(!func.isnull()); + m_write.m_type = AMH_DEVICE_DELEGATE_S; + m_write.m_bits = 64; + m_write.m_name = func.name(); + m_wproto64s = func; + return *this; +} + +address_map_entry &address_map_entry::r(read64sm_delegate func) +{ + assert(!func.isnull()); + m_read.m_type = AMH_DEVICE_DELEGATE_SM; + m_read.m_bits = 64; + m_read.m_name = func.name(); + m_rproto64sm = func; + return *this; +} + +address_map_entry &address_map_entry::w(write64sm_delegate func) +{ + assert(!func.isnull()); + m_write.m_type = AMH_DEVICE_DELEGATE_SM; + m_write.m_bits = 64; + m_write.m_name = func.name(); + m_wproto64sm = func; + return *this; +} + +address_map_entry &address_map_entry::r(read64smo_delegate func) +{ + assert(!func.isnull()); + m_read.m_type = AMH_DEVICE_DELEGATE_SMO; + m_read.m_bits = 64; + m_read.m_name = func.name(); + m_rproto64smo = func; + return *this; +} -address_map_entry &address_map_entry::rw(read64_delegate rfunc, write64_delegate wfunc) +address_map_entry &address_map_entry::w(write64smo_delegate func) { - r(rfunc); - w(wfunc); + assert(!func.isnull()); + m_write.m_type = AMH_DEVICE_DELEGATE_SMO; + m_write.m_bits = 64; + m_write.m_name = func.name(); + m_wproto64smo = func; return *this; } @@ -749,16 +952,55 @@ void address_map::map_validity_check(validity_checker &valid, int spacenum) cons } // make sure all devices exist - if (entry.m_read.m_type == AMH_DEVICE_DELEGATE) + if (entry.m_read.m_type == AMH_DEVICE_DELEGATE_F || entry.m_read.m_type == AMH_DEVICE_DELEGATE_S || entry.m_read.m_type == AMH_DEVICE_DELEGATE_SM || entry.m_read.m_type == AMH_DEVICE_DELEGATE_SMO) { // extract the device tag from the proto-delegate const char *devtag = nullptr; switch (entry.m_read.m_bits) { - case 8: devtag = entry.m_rproto8.device_name(); break; - case 16: devtag = entry.m_rproto16.device_name(); break; - case 32: devtag = entry.m_rproto32.device_name(); break; - case 64: devtag = entry.m_rproto64.device_name(); break; + case 8: + if (entry.m_read.m_type == AMH_DEVICE_DELEGATE_F) + devtag = entry.m_rproto8.device_name(); + else if (entry.m_read.m_type == AMH_DEVICE_DELEGATE_S) + devtag = entry.m_rproto8s.device_name(); + else if (entry.m_read.m_type == AMH_DEVICE_DELEGATE_SM) + devtag = entry.m_rproto8sm.device_name(); + else + devtag = entry.m_rproto8smo.device_name(); + break; + + case 16: + if (entry.m_read.m_type == AMH_DEVICE_DELEGATE_F) + devtag = entry.m_rproto16.device_name(); + else if (entry.m_read.m_type == AMH_DEVICE_DELEGATE_S) + devtag = entry.m_rproto16s.device_name(); + else if (entry.m_read.m_type == AMH_DEVICE_DELEGATE_SM) + devtag = entry.m_rproto16sm.device_name(); + else + devtag = entry.m_rproto16smo.device_name(); + break; + + case 32: + if (entry.m_read.m_type == AMH_DEVICE_DELEGATE_F) + devtag = entry.m_rproto32.device_name(); + else if (entry.m_read.m_type == AMH_DEVICE_DELEGATE_S) + devtag = entry.m_rproto32s.device_name(); + else if (entry.m_read.m_type == AMH_DEVICE_DELEGATE_SM) + devtag = entry.m_rproto32sm.device_name(); + else + devtag = entry.m_rproto32smo.device_name(); + break; + + case 64: + if (entry.m_read.m_type == AMH_DEVICE_DELEGATE_F) + devtag = entry.m_rproto64.device_name(); + else if (entry.m_read.m_type == AMH_DEVICE_DELEGATE_S) + devtag = entry.m_rproto64s.device_name(); + else if (entry.m_read.m_type == AMH_DEVICE_DELEGATE_SM) + devtag = entry.m_rproto64sm.device_name(); + else + devtag = entry.m_rproto64smo.device_name(); + break; } if (entry.m_devbase.subdevice(devtag) == nullptr) osd_printf_error("%s space memory map entry reads from nonexistent device '%s'\n", spaceconfig.m_name, devtag ? devtag : "<unspecified>"); @@ -766,16 +1008,55 @@ void address_map::map_validity_check(validity_checker &valid, int spacenum) cons (void)entry.unitmask_is_appropriate(entry.m_read.m_bits, entry.m_mask, entry.m_read.m_name); #endif } - if (entry.m_write.m_type == AMH_DEVICE_DELEGATE) + if (entry.m_write.m_type == AMH_DEVICE_DELEGATE_F || entry.m_write.m_type == AMH_DEVICE_DELEGATE_S || entry.m_write.m_type == AMH_DEVICE_DELEGATE_SM || entry.m_write.m_type == AMH_DEVICE_DELEGATE_SMO) { // extract the device tag from the proto-delegate const char *devtag = nullptr; switch (entry.m_write.m_bits) { - case 8: devtag = entry.m_wproto8.device_name(); break; - case 16: devtag = entry.m_wproto16.device_name(); break; - case 32: devtag = entry.m_wproto32.device_name(); break; - case 64: devtag = entry.m_wproto64.device_name(); break; + case 8: + if (entry.m_write.m_type == AMH_DEVICE_DELEGATE_F) + devtag = entry.m_wproto8.device_name(); + else if (entry.m_write.m_type == AMH_DEVICE_DELEGATE_S) + devtag = entry.m_wproto8s.device_name(); + else if (entry.m_write.m_type == AMH_DEVICE_DELEGATE_SM) + devtag = entry.m_wproto8sm.device_name(); + else + devtag = entry.m_wproto8smo.device_name(); + break; + + case 16: + if (entry.m_write.m_type == AMH_DEVICE_DELEGATE_F) + devtag = entry.m_wproto16.device_name(); + else if (entry.m_write.m_type == AMH_DEVICE_DELEGATE_S) + devtag = entry.m_wproto16s.device_name(); + else if (entry.m_write.m_type == AMH_DEVICE_DELEGATE_SM) + devtag = entry.m_wproto16sm.device_name(); + else + devtag = entry.m_wproto16smo.device_name(); + break; + + case 32: + if (entry.m_write.m_type == AMH_DEVICE_DELEGATE_F) + devtag = entry.m_wproto32.device_name(); + else if (entry.m_write.m_type == AMH_DEVICE_DELEGATE_S) + devtag = entry.m_wproto32s.device_name(); + else if (entry.m_write.m_type == AMH_DEVICE_DELEGATE_SM) + devtag = entry.m_wproto32sm.device_name(); + else + devtag = entry.m_wproto32smo.device_name(); + break; + + case 64: + if (entry.m_write.m_type == AMH_DEVICE_DELEGATE_F) + devtag = entry.m_wproto64.device_name(); + else if (entry.m_write.m_type == AMH_DEVICE_DELEGATE_S) + devtag = entry.m_wproto64s.device_name(); + else if (entry.m_write.m_type == AMH_DEVICE_DELEGATE_SM) + devtag = entry.m_wproto64sm.device_name(); + else + devtag = entry.m_wproto64smo.device_name(); + break; } if (entry.m_devbase.subdevice(devtag) == nullptr) osd_printf_error("%s space memory map entry writes to nonexistent device '%s'\n", spaceconfig.m_name, devtag ? devtag : "<unspecified>"); diff --git a/src/emu/addrmap.h b/src/emu/addrmap.h index 90dd8898533..56d50ef4f7e 100644 --- a/src/emu/addrmap.h +++ b/src/emu/addrmap.h @@ -32,7 +32,10 @@ enum map_handler_type AMH_ROM, AMH_NOP, AMH_UNMAP, - AMH_DEVICE_DELEGATE, + AMH_DEVICE_DELEGATE_F, + AMH_DEVICE_DELEGATE_S, + AMH_DEVICE_DELEGATE_SM, + AMH_DEVICE_DELEGATE_SMO, AMH_PORT, AMH_BANK, AMH_DEVICE_SUBMAP @@ -180,7 +183,7 @@ public: template <typename T, typename RetR, typename... ParamsR, typename U, typename RetW, typename... ParamsW> address_map_entry &rw(RetR (T::*read)(ParamsR...), const char *read_name, RetW (U::*write)(ParamsW...), const char *write_name) - { return rw(emu::detail::make_delegate(read, read_name, m_devbase.tag(), make_pointer<T>(m_devbase)), emu::detail::make_delegate(write, write_name, m_devbase.tag(), make_pointer<U>(m_devbase))); } + { return r(emu::detail::make_delegate(read, read_name, m_devbase.tag(), make_pointer<T>(m_devbase))).w(emu::detail::make_delegate(write, write_name, m_devbase.tag(), make_pointer<U>(m_devbase))); } template <typename T, typename Ret, typename... Params> address_map_entry &m(Ret (T::*map)(Params...), const char *map_name) @@ -198,7 +201,7 @@ public: template <typename T, typename RetR, typename... ParamsR, typename U, typename RetW, typename... ParamsW> address_map_entry &rw(const char *tag, RetR (T::*read)(ParamsR...), const char *read_name, RetW (U::*write)(ParamsW...), const char *write_name) - { return rw(emu::detail::make_delegate(read, read_name, tag, nullptr), emu::detail::make_delegate(write, write_name, tag, nullptr)); } + { return r(emu::detail::make_delegate(read, read_name, tag, nullptr)).w(emu::detail::make_delegate(write, write_name, tag, nullptr)); } template <typename T, typename Ret, typename... Params> address_map_entry &m(const char *tag, Ret (T::*map)(Params...), const char *map_name) @@ -216,7 +219,7 @@ public: template <typename T, typename U, typename RetR, typename... ParamsR, typename V, typename RetW, typename... ParamsW> address_map_entry &rw(T &obj, RetR (U::*read)(ParamsR...), const char *read_name, RetW (V::*write)(ParamsW...), const char *write_name) - { return rw(emu::detail::make_delegate(read, read_name, get_tag(obj), make_pointer<U>(obj)), emu::detail::make_delegate(write, write_name, get_tag(obj), make_pointer<V>(obj))); } + { return r(emu::detail::make_delegate(read, read_name, get_tag(obj), make_pointer<U>(obj))).w(emu::detail::make_delegate(write, write_name, get_tag(obj), make_pointer<V>(obj))); } template <typename T, typename U, typename Ret, typename... Params> address_map_entry &m(T &obj, Ret (U::*map)(Params...), const char *map_name) @@ -242,11 +245,11 @@ public: template <typename T, bool Reqd, typename U, typename RetR, typename... ParamsR, typename V, typename RetW, typename... ParamsW> address_map_entry &rw(device_finder<T, Reqd> &finder, RetR (U::*read)(ParamsR...), const char *read_name, RetW (V::*write)(ParamsW...), const char *write_name) - { const std::pair<device_t &, const char *> target(finder.finder_target()); device_t &device(*target.first.subdevice(target.second)); return rw(emu::detail::make_delegate(read, read_name, device.tag(), make_pointer<U>(device)), emu::detail::make_delegate(write, write_name, device.tag(), make_pointer<V>(device))); } + { const std::pair<device_t &, const char *> target(finder.finder_target()); device_t &device(*target.first.subdevice(target.second)); return r(emu::detail::make_delegate(read, read_name, device.tag(), make_pointer<U>(device))).w(emu::detail::make_delegate(write, write_name, device.tag(), make_pointer<V>(device))); } template <typename T, bool Reqd, typename U, typename RetR, typename... ParamsR, typename V, typename RetW, typename... ParamsW> address_map_entry &rw(const device_finder<T, Reqd> &finder, RetR (U::*read)(ParamsR...), const char *read_name, RetW (V::*write)(ParamsW...), const char *write_name) - { const std::pair<device_t &, const char *> target(finder.finder_target()); device_t &device(*target.first.subdevice(target.second)); return rw(emu::detail::make_delegate(read, read_name, device.tag(), make_pointer<U>(device)), emu::detail::make_delegate(write, write_name, device.tag(), make_pointer<V>(device))); } + { const std::pair<device_t &, const char *> target(finder.finder_target()); device_t &device(*target.first.subdevice(target.second)); return r(emu::detail::make_delegate(read, read_name, device.tag(), make_pointer<U>(device))).w(emu::detail::make_delegate(write, write_name, device.tag(), make_pointer<V>(device))); } template <typename T, bool Reqd, typename U, typename Ret, typename... Params> address_map_entry &m(device_finder<T, Reqd> &finder, Ret (U::*map)(Params...), const char *map_name) @@ -259,51 +262,51 @@ public: // lambda -> delegate converter template<typename _lr> address_map_entry &lr8(const char *name, _lr &&read) { - return r(read8_delegate(read, name)); + return r(emu::detail::make_lr8_delegate(read, name)); } template<typename _lr> address_map_entry &lr16(const char *name, _lr &&read) { - return r(read16_delegate(read, name)); + return r(emu::detail::make_lr16_delegate(read, name)); } template<typename _lr> address_map_entry &lr32(const char *name, _lr &&read) { - return r(read32_delegate(read, name)); + return r(emu::detail::make_lr32_delegate(read, name)); } template<typename _lr> address_map_entry &lr64(const char *name, _lr &&read) { - return r(read64_delegate(read, name)); + return r(emu::detail::make_lr64_delegate(read, name)); } template<typename _lw> address_map_entry &lw8(const char *name, _lw &&write) { - return w(write8_delegate(write, name)); + return w(emu::detail::make_lw8_delegate(write, name)); } template<typename _lw> address_map_entry &lw16(const char *name, _lw &&write) { - return w(write16_delegate(write, name)); + return w(emu::detail::make_lw16_delegate(write, name)); } template<typename _lw> address_map_entry &lw32(const char *name, _lw &&write) { - return w(write32_delegate(write, name)); + return w(emu::detail::make_lw32_delegate(write, name)); } template<typename _lw> address_map_entry &lw64(const char *name, _lw &&write) { - return w(write64_delegate(write, name)); + return w(emu::detail::make_lw64_delegate(write, name)); } template<typename _lr, typename _lw> address_map_entry &lrw8(const char *name, _lr &&read, _lw &&write) { - return rw(read8_delegate(read, name), write8_delegate(write, name)); + return r(emu::detail::make_lr8_delegate(read, name)).w(emu::detail::make_lw8_delegate(write, name)); } template<typename _lr, typename _lw> address_map_entry &lrw16(const char *name, _lr &&read, _lw &&write) { - return rw(read16_delegate(read, name), write16_delegate(write, name)); + return r(emu::detail::make_lr16_delegate(read, name)).w(emu::detail::make_lw16_delegate(write, name)); } template<typename _lr, typename _lw> address_map_entry &lrw32(const char *name, _lr &&read, _lw &&write) { - return rw(read32_delegate(read, name), write32_delegate(write, name)); + return r(emu::detail::make_lr32_delegate(read, name)).w(emu::detail::make_lw32_delegate(write, name)); } template<typename _lr, typename _lw> address_map_entry &lrw64(const char *name, _lr &&read, _lw &&write) { - return rw(read64_delegate(read, name), write64_delegate(write, name)); + return r(emu::detail::make_lr64_delegate(read, name)).w(emu::detail::make_lw64_delegate(write, name)); } // public state @@ -335,6 +338,33 @@ public: write32_delegate m_wproto32; // 32-bit write proto-delegate write64_delegate m_wproto64; // 64-bit write proto-delegate + read8s_delegate m_rproto8s; // 8-bit read proto-delegate + read16s_delegate m_rproto16s; // 16-bit read proto-delegate + read32s_delegate m_rproto32s; // 32-bit read proto-delegate + read64s_delegate m_rproto64s; // 64-bit read proto-delegate + write8s_delegate m_wproto8s; // 8-bit write proto-delegate + write16s_delegate m_wproto16s; // 16-bit write proto-delegate + write32s_delegate m_wproto32s; // 32-bit write proto-delegate + write64s_delegate m_wproto64s; // 64-bit write proto-delegate + + read8sm_delegate m_rproto8sm; // 8-bit read proto-delegate + read16sm_delegate m_rproto16sm; // 16-bit read proto-delegate + read32sm_delegate m_rproto32sm; // 32-bit read proto-delegate + read64sm_delegate m_rproto64sm; // 64-bit read proto-delegate + write8sm_delegate m_wproto8sm; // 8-bit write proto-delegate + write16sm_delegate m_wproto16sm; // 16-bit write proto-delegate + write32sm_delegate m_wproto32sm; // 32-bit write proto-delegate + write64sm_delegate m_wproto64sm; // 64-bit write proto-delegate + + read8smo_delegate m_rproto8smo; // 8-bit read proto-delegate + read16smo_delegate m_rproto16smo; // 16-bit read proto-delegate + read32smo_delegate m_rproto32smo; // 32-bit read proto-delegate + read64smo_delegate m_rproto64smo; // 64-bit read proto-delegate + write8smo_delegate m_wproto8smo; // 8-bit write proto-delegate + write16smo_delegate m_wproto16smo; // 16-bit write proto-delegate + write32smo_delegate m_wproto32smo; // 32-bit write proto-delegate + write64smo_delegate m_wproto64smo; // 64-bit write proto-delegate + device_t *m_submap_device; address_map_constructor m_submap_delegate; @@ -344,22 +374,42 @@ public: // handler setters for 8-bit delegates address_map_entry &r(read8_delegate func); address_map_entry &w(write8_delegate func); - address_map_entry &rw(read8_delegate rfunc, write8_delegate wfunc); + address_map_entry &r(read8s_delegate func); + address_map_entry &w(write8s_delegate func); + address_map_entry &r(read8sm_delegate func); + address_map_entry &w(write8sm_delegate func); + address_map_entry &r(read8smo_delegate func); + address_map_entry &w(write8smo_delegate func); // handler setters for 16-bit delegates address_map_entry &r(read16_delegate func); address_map_entry &w(write16_delegate func); - address_map_entry &rw(read16_delegate rfunc, write16_delegate wfunc); + address_map_entry &r(read16s_delegate func); + address_map_entry &w(write16s_delegate func); + address_map_entry &r(read16sm_delegate func); + address_map_entry &w(write16sm_delegate func); + address_map_entry &r(read16smo_delegate func); + address_map_entry &w(write16smo_delegate func); // handler setters for 32-bit delegates address_map_entry &r(read32_delegate func); address_map_entry &w(write32_delegate func); - address_map_entry &rw(read32_delegate rfunc, write32_delegate wfunc); + address_map_entry &r(read32s_delegate func); + address_map_entry &w(write32s_delegate func); + address_map_entry &r(read32sm_delegate func); + address_map_entry &w(write32sm_delegate func); + address_map_entry &r(read32smo_delegate func); + address_map_entry &w(write32smo_delegate func); // handler setters for 64-bit delegates address_map_entry &r(read64_delegate func); address_map_entry &w(write64_delegate func); - address_map_entry &rw(read64_delegate rfunc, write64_delegate wfunc); + address_map_entry &r(read64s_delegate func); + address_map_entry &w(write64s_delegate func); + address_map_entry &r(read64sm_delegate func); + address_map_entry &w(write64sm_delegate func); + address_map_entry &r(read64smo_delegate func); + address_map_entry &w(write64smo_delegate func); private: // helper functions diff --git a/src/emu/devcb.h b/src/emu/devcb.h index beaba738592..4d858f8b82a 100644 --- a/src/emu/devcb.h +++ b/src/emu/devcb.h @@ -206,16 +206,16 @@ protected: // Mapping method types to delegate types template <typename T, typename Enable = void> struct delegate_type; - template <typename T> struct delegate_type<T, void_t<emu::detail::read8_device_class_t<std::remove_reference_t<T> > > > { using type = read8_delegate; using device_class = emu::detail::read8_device_class_t<std::remove_reference_t<T> >; }; - template <typename T> struct delegate_type<T, void_t<emu::detail::read16_device_class_t<std::remove_reference_t<T> > > > { using type = read16_delegate; using device_class = emu::detail::read16_device_class_t<std::remove_reference_t<T> >; }; - template <typename T> struct delegate_type<T, void_t<emu::detail::read32_device_class_t<std::remove_reference_t<T> > > > { using type = read32_delegate; using device_class = emu::detail::read32_device_class_t<std::remove_reference_t<T> >; }; - template <typename T> struct delegate_type<T, void_t<emu::detail::read64_device_class_t<std::remove_reference_t<T> > > > { using type = read64_delegate; using device_class = emu::detail::read64_device_class_t<std::remove_reference_t<T> >; }; - template <typename T> struct delegate_type<T, void_t<emu::detail::read_line_device_class_t<std::remove_reference_t<T> > > > { using type = read_line_delegate; using device_class = emu::detail::read_line_device_class_t<std::remove_reference_t<T> >; }; - template <typename T> struct delegate_type<T, void_t<emu::detail::write8_device_class_t<std::remove_reference_t<T> > > > { using type = write8_delegate; using device_class = emu::detail::write8_device_class_t<std::remove_reference_t<T> >; }; - template <typename T> struct delegate_type<T, void_t<emu::detail::write16_device_class_t<std::remove_reference_t<T> > > > { using type = write16_delegate; using device_class = emu::detail::write16_device_class_t<std::remove_reference_t<T> >; }; - template <typename T> struct delegate_type<T, void_t<emu::detail::write32_device_class_t<std::remove_reference_t<T> > > > { using type = write32_delegate; using device_class = emu::detail::write32_device_class_t<std::remove_reference_t<T> >; }; - template <typename T> struct delegate_type<T, void_t<emu::detail::write64_device_class_t<std::remove_reference_t<T> > > > { using type = write64_delegate; using device_class = emu::detail::write64_device_class_t<std::remove_reference_t<T> >; }; - template <typename T> struct delegate_type<T, void_t<emu::detail::write_line_device_class_t<std::remove_reference_t<T> > > > { using type = write_line_delegate; using device_class = emu::detail::write_line_device_class_t<std::remove_reference_t<T> >; }; + template <typename T> struct delegate_type<T, void_t<emu::detail::rw_device_class_t<read8_delegate, std::remove_reference_t<T> > > > { using type = read8_delegate; using device_class = emu::detail::rw_device_class_t<type, std::remove_reference_t<T> >; }; + template <typename T> struct delegate_type<T, void_t<emu::detail::rw_device_class_t<read16_delegate, std::remove_reference_t<T> > > > { using type = read16_delegate; using device_class = emu::detail::rw_device_class_t<type, std::remove_reference_t<T> >; }; + template <typename T> struct delegate_type<T, void_t<emu::detail::rw_device_class_t<read32_delegate, std::remove_reference_t<T> > > > { using type = read32_delegate; using device_class = emu::detail::rw_device_class_t<type, std::remove_reference_t<T> >; }; + template <typename T> struct delegate_type<T, void_t<emu::detail::rw_device_class_t<read64_delegate, std::remove_reference_t<T> > > > { using type = read64_delegate; using device_class = emu::detail::rw_device_class_t<type, std::remove_reference_t<T> >; }; + template <typename T> struct delegate_type<T, void_t<emu::detail::rw_device_class_t<read_line_delegate, std::remove_reference_t<T> > > > { using type = read_line_delegate; using device_class = emu::detail::rw_device_class_t<type, std::remove_reference_t<T> >; }; + template <typename T> struct delegate_type<T, void_t<emu::detail::rw_device_class_t<write8_delegate, std::remove_reference_t<T> > > > { using type = write8_delegate; using device_class = emu::detail::rw_device_class_t<type, std::remove_reference_t<T> >; }; + template <typename T> struct delegate_type<T, void_t<emu::detail::rw_device_class_t<write16_delegate, std::remove_reference_t<T> > > > { using type = write16_delegate; using device_class = emu::detail::rw_device_class_t<type, std::remove_reference_t<T> >; }; + template <typename T> struct delegate_type<T, void_t<emu::detail::rw_device_class_t<write32_delegate, std::remove_reference_t<T> > > > { using type = write32_delegate; using device_class = emu::detail::rw_device_class_t<type, std::remove_reference_t<T> >; }; + template <typename T> struct delegate_type<T, void_t<emu::detail::rw_device_class_t<write64_delegate, std::remove_reference_t<T> > > > { using type = write64_delegate; using device_class = emu::detail::rw_device_class_t<type, std::remove_reference_t<T> >; }; + template <typename T> struct delegate_type<T, void_t<emu::detail::rw_device_class_t<write_line_delegate, std::remove_reference_t<T> > > > { using type = write_line_delegate; using device_class = emu::detail::rw_device_class_t<type, std::remove_reference_t<T> >; }; template <typename T> using delegate_type_t = typename delegate_type<T>::type; template <typename T> using delegate_device_class_t = typename delegate_type<T>::device_class; @@ -330,11 +330,11 @@ protected: // Detecting candidates for read delegates template <typename T, typename Enable = void> struct is_read_method { static constexpr bool value = false; }; - template <typename T> struct is_read_method<T, void_t<emu::detail::read8_device_class_t<std::remove_reference_t<T> > > > { static constexpr bool value = true; }; - template <typename T> struct is_read_method<T, void_t<emu::detail::read16_device_class_t<std::remove_reference_t<T> > > > { static constexpr bool value = true; }; - template <typename T> struct is_read_method<T, void_t<emu::detail::read32_device_class_t<std::remove_reference_t<T> > > > { static constexpr bool value = true; }; - template <typename T> struct is_read_method<T, void_t<emu::detail::read64_device_class_t<std::remove_reference_t<T> > > > { static constexpr bool value = true; }; - template <typename T> struct is_read_method<T, void_t<emu::detail::read_line_device_class_t<std::remove_reference_t<T> > > > { static constexpr bool value = true; }; + template <typename T> struct is_read_method<T, void_t<emu::detail::rw_device_class_t<read8_delegate, std::remove_reference_t<T> > > > { static constexpr bool value = true; }; + template <typename T> struct is_read_method<T, void_t<emu::detail::rw_device_class_t<read16_delegate, std::remove_reference_t<T> > > > { static constexpr bool value = true; }; + template <typename T> struct is_read_method<T, void_t<emu::detail::rw_device_class_t<read32_delegate, std::remove_reference_t<T> > > > { static constexpr bool value = true; }; + template <typename T> struct is_read_method<T, void_t<emu::detail::rw_device_class_t<read64_delegate, std::remove_reference_t<T> > > > { static constexpr bool value = true; }; + template <typename T> struct is_read_method<T, void_t<emu::detail::rw_device_class_t<read_line_delegate, std::remove_reference_t<T> > > > { static constexpr bool value = true; }; // Invoking read callbacks template <typename Result, typename T> static std::enable_if_t<is_read_form1<Result, T>::value, mask_t<read_result_t<Result, T>, Result> > invoke_read(T const &cb, address_space &space, offs_t offset, std::make_unsigned_t<Result> mem_mask) { return std::make_unsigned_t<read_result_t<Result, T> >(cb(space, offset, mem_mask)); } @@ -380,11 +380,11 @@ protected: // Detecting candidates for write delegates template <typename T, typename Enable = void> struct is_write_method { static constexpr bool value = false; }; - template <typename T> struct is_write_method<T, void_t<emu::detail::write8_device_class_t<std::remove_reference_t<T> > > > { static constexpr bool value = true; }; - template <typename T> struct is_write_method<T, void_t<emu::detail::write16_device_class_t<std::remove_reference_t<T> > > > { static constexpr bool value = true; }; - template <typename T> struct is_write_method<T, void_t<emu::detail::write32_device_class_t<std::remove_reference_t<T> > > > { static constexpr bool value = true; }; - template <typename T> struct is_write_method<T, void_t<emu::detail::write64_device_class_t<std::remove_reference_t<T> > > > { static constexpr bool value = true; }; - template <typename T> struct is_write_method<T, void_t<emu::detail::write_line_device_class_t<std::remove_reference_t<T> > > > { static constexpr bool value = true; }; + template <typename T> struct is_write_method<T, void_t<emu::detail::rw_device_class_t<write8_delegate, std::remove_reference_t<T> > > > { static constexpr bool value = true; }; + template <typename T> struct is_write_method<T, void_t<emu::detail::rw_device_class_t<write16_delegate, std::remove_reference_t<T> > > > { static constexpr bool value = true; }; + template <typename T> struct is_write_method<T, void_t<emu::detail::rw_device_class_t<write32_delegate, std::remove_reference_t<T> > > > { static constexpr bool value = true; }; + template <typename T> struct is_write_method<T, void_t<emu::detail::rw_device_class_t<write64_delegate, std::remove_reference_t<T> > > > { static constexpr bool value = true; }; + template <typename T> struct is_write_method<T, void_t<emu::detail::rw_device_class_t<write_line_delegate, std::remove_reference_t<T> > > > { static constexpr bool value = true; }; // Invoking write callbacks template <typename Input, typename T> static std::enable_if_t<is_write_form1<Input, T>::value> invoke_write(T const &cb, address_space &space, offs_t &offset, Input data, std::make_unsigned_t<Input> mem_mask) { return cb(space, offset, data, mem_mask); } diff --git a/src/emu/devfind.h b/src/emu/devfind.h index fef6843029e..1fe2ed78439 100644 --- a/src/emu/devfind.h +++ b/src/emu/devfind.h @@ -508,6 +508,8 @@ template <class DeviceClass, bool Required> class device_finder : public object_finder_base<DeviceClass, Required> { public: + using object_finder_base<DeviceClass, Required>::set_tag; + /// \brief Device finder constructor /// \param [in] base Base device to search from. /// \param [in] tag Device tag to search for. This is not copied, @@ -515,6 +517,16 @@ public: /// remains valid until resolution time. device_finder(device_t &base, char const *tag) : object_finder_base<DeviceClass, Required>(base, tag) { } + /// \brief Set search tag + /// + /// Allows search tag to be changed after construction. Note that + /// this must be done before resolution time to take effect. Note + /// that this binds to a particular instance, so the device must not + /// be removed or replaced, as it will cause a use-after-free when + /// resolving objects. + /// \param [in] object Object to refer to. + void set_tag(DeviceClass &object) { set_tag(object, DEVICE_SELF); } + /// \brief Set target during configuration /// /// During configuration, device_finder instances may be assigned diff --git a/src/emu/didisasm.h b/src/emu/didisasm.h index 407fb69f399..751ba86b2b6 100644 --- a/src/emu/didisasm.h +++ b/src/emu/didisasm.h @@ -39,6 +39,12 @@ public: // Override template <typename Obj> void set_dasm_override(Obj &&cb) { m_dasm_override = std::forward<Obj>(cb); } + void set_dasm_override(dasm_override_delegate callback) { m_dasm_override = callback; } + template <class FunctionClass> void set_dasm_override(offs_t (FunctionClass::*callback)(std::ostream &, offs_t, + const util::disasm_interface::data_buffer &, const util::disasm_interface::data_buffer &), const char *name) + { + set_dasm_override(dasm_override_delegate(callback, name, nullptr, static_cast<FunctionClass *>(nullptr))); + } // disassembler request util::disasm_interface &get_disassembler(); diff --git a/src/emu/diexec.cpp b/src/emu/diexec.cpp index 37fdcaa362c..67cb9bd123f 100644 --- a/src/emu/diexec.cpp +++ b/src/emu/diexec.cpp @@ -522,7 +522,9 @@ int device_execute_interface::standard_irq_callback(int irqline) vector = m_driver_irq(device(), irqline); // notify the debugger - debugger_interrupt_hook(irqline); + if (device().machine().debug_flags & DEBUG_FLAG_ENABLED) + device().debug()->interrupt_hook(irqline); + return vector; } diff --git a/src/emu/diexec.h b/src/emu/diexec.h index 3c9d754434e..6192264f62e 100644 --- a/src/emu/diexec.h +++ b/src/emu/diexec.h @@ -140,17 +140,54 @@ public: // inline configuration helpers void set_disable() { m_disabled = true; } - template <typename Object> void set_vblank_int(Object &&cb, const char *tag, int rate = 0) + template <typename Object> void set_vblank_int(Object &&cb, const char *tag) { m_vblank_interrupt = std::forward<Object>(cb); m_vblank_interrupt_screen = tag; } + void set_vblank_int(device_interrupt_delegate callback, const char *tag) + { + m_vblank_interrupt = callback; + m_vblank_interrupt_screen = tag; + } + template <class FunctionClass> void set_vblank_int(const char *tag, const char *devname, void (FunctionClass::*callback)(device_t &), const char *name) + { + set_vblank_int(device_interrupt_delegate(callback, name, devname, static_cast<FunctionClass *>(nullptr)), tag); + } + template <class FunctionClass> void set_vblank_int(const char *tag, void (FunctionClass::*callback)(device_t &), const char *name) + { + set_vblank_int(device_interrupt_delegate(callback, name, nullptr, static_cast<FunctionClass *>(nullptr)), tag); + } + template <typename Object> void set_periodic_int(Object &&cb, const attotime &rate) { m_timed_interrupt = std::forward<Object>(cb); m_timed_interrupt_period = rate; } + void set_periodic_int(device_interrupt_delegate callback, const attotime &rate) + { + m_timed_interrupt = callback; + m_timed_interrupt_period = rate; + } + template <class FunctionClass> void set_periodic_int(const char *devname, void (FunctionClass::*callback)(device_t &), const char *name, const attotime &rate) + { + set_periodic_int(device_interrupt_delegate(callback, name, devname, static_cast<FunctionClass *>(nullptr)), rate); + } + template <class FunctionClass> void set_periodic_int(void (FunctionClass::*callback)(device_t &), const char *name, const attotime &rate) + { + set_periodic_int(device_interrupt_delegate(callback, name, nullptr, static_cast<FunctionClass *>(nullptr)), rate); + } + template <typename Object> void set_irq_acknowledge_callback(Object &&cb) { m_driver_irq = std::forward<Object>(cb); } + void set_irq_acknowledge_callback(device_irq_acknowledge_delegate callback) { m_driver_irq = callback; } + template <class FunctionClass> void set_irq_acknowledge_callback(const char *devname, int (FunctionClass::*callback)(device_t &, int), const char *name) + { + set_irq_acknowledge_callback(device_irq_acknowledge_delegate(callback, name, devname, static_cast<FunctionClass *>(nullptr))); + } + template <class FunctionClass> void set_irq_acknowledge_callback(int (FunctionClass::*callback)(device_t &, int), const char *name) + { + set_irq_acknowledge_callback(device_irq_acknowledge_delegate(callback, name, nullptr, static_cast<FunctionClass *>(nullptr))); + } // execution management device_scheduler &scheduler() const { assert(m_scheduler != nullptr); return *m_scheduler; } @@ -237,11 +274,6 @@ protected: if (device().machine().debug_flags & DEBUG_FLAG_ENABLED) device().debug()->exception_hook(exception); } - void debugger_interrupt_hook(int irqline) - { - if (device().machine().debug_flags & DEBUG_FLAG_ENABLED) - device().debug()->interrupt_hook(irqline); - } private: // internal information about the state of inputs diff --git a/src/emu/drawgfx.cpp b/src/emu/drawgfx.cpp index 8c86de6ad9a..3a00569e32c 100644 --- a/src/emu/drawgfx.cpp +++ b/src/emu/drawgfx.cpp @@ -2014,8 +2014,7 @@ static inline void copyscrollbitmap_trans_common(_BitmapClass &dest, const _Bitm for (s32 sx = xscroll - src.width(); sx < dest.width(); sx += src.width()) { // compute the cliprect for this group - subclip.min_x = col * colwidth + sx; - subclip.max_x = (col + groupcols) * colwidth - 1 + sx; + subclip.setx(col * colwidth + sx, (col + groupcols) * colwidth - 1 + sx); subclip &= cliprect; // iterate over all portions of the scroll that overlap the destination @@ -2051,8 +2050,7 @@ static inline void copyscrollbitmap_trans_common(_BitmapClass &dest, const _Bitm for (s32 sy = yscroll - src.height(); sy < dest.height(); sy += src.height()) { // compute the cliprect for this group - subclip.min_y = row * rowheight + sy; - subclip.max_y = (row + grouprows) * rowheight - 1 + sy; + subclip.sety(row * rowheight + sy, (row + grouprows) * rowheight - 1 + sy); subclip &= cliprect; // iterate over all portions of the scroll that overlap the destination diff --git a/src/emu/drawgfxm.h b/src/emu/drawgfxm.h index 1bef8e15237..f4566e9b59f 100644 --- a/src/emu/drawgfxm.h +++ b/src/emu/drawgfxm.h @@ -419,37 +419,37 @@ do { \ /* compute final pixel in X and exit if we are entirely clipped */ \ destendx = destx + width() - 1; \ - if (destx > cliprect.max_x || destendx < cliprect.min_x) \ + if (destx > cliprect.right() || destendx < cliprect.left()) \ break; \ \ /* apply left clip */ \ srcx = 0; \ - if (destx < cliprect.min_x) \ + if (destx < cliprect.left()) \ { \ - srcx = cliprect.min_x - destx; \ - destx = cliprect.min_x; \ + srcx = cliprect.left() - destx; \ + destx = cliprect.left(); \ } \ \ /* apply right clip */ \ - if (destendx > cliprect.max_x) \ - destendx = cliprect.max_x; \ + if (destendx > cliprect.right()) \ + destendx = cliprect.right(); \ \ /* compute final pixel in Y and exit if we are entirely clipped */ \ destendy = desty + height() - 1; \ - if (desty > cliprect.max_y || destendy < cliprect.min_y) \ + if (desty > cliprect.bottom() || destendy < cliprect.top()) \ break; \ \ /* apply top clip */ \ srcy = 0; \ - if (desty < cliprect.min_y) \ + if (desty < cliprect.top()) \ { \ - srcy = cliprect.min_y - desty; \ - desty = cliprect.min_y; \ + srcy = cliprect.top() - desty; \ + desty = cliprect.top(); \ } \ \ /* apply bottom clip */ \ - if (destendy > cliprect.max_y) \ - destendy = cliprect.max_y; \ + if (destendy > cliprect.bottom()) \ + destendy = cliprect.bottom(); \ \ /* apply X flipping */ \ if (flipx) \ @@ -601,24 +601,24 @@ do { \ /* compute final pixel in X and exit if we are entirely clipped */ \ destendx = destx + dstwidth - 1; \ - if (destx > cliprect.max_x || destendx < cliprect.min_x) \ + if (destx > cliprect.right() || destendx < cliprect.left()) \ break; \ \ /* apply left clip */ \ srcx = 0; \ - if (destx < cliprect.min_x) \ + if (destx < cliprect.left()) \ { \ - srcx = (cliprect.min_x - destx) * dx; \ - destx = cliprect.min_x; \ + srcx = (cliprect.left() - destx) * dx; \ + destx = cliprect.left(); \ } \ \ /* apply right clip */ \ - if (destendx > cliprect.max_x) \ - destendx = cliprect.max_x; \ + if (destendx > cliprect.right()) \ + destendx = cliprect.right(); \ \ /* compute final pixel in Y and exit if we are entirely clipped */ \ destendy = desty + dstheight - 1; \ - if (desty > cliprect.max_y || destendy < cliprect.min_y) \ + if (desty > cliprect.bottom() || destendy < cliprect.top()) \ { \ g_profiler.stop(); \ return; \ @@ -626,15 +626,15 @@ do { \ /* apply top clip */ \ srcy = 0; \ - if (desty < cliprect.min_y) \ + if (desty < cliprect.top()) \ { \ - srcy = (cliprect.min_y - desty) * dy; \ - desty = cliprect.min_y; \ + srcy = (cliprect.top() - desty) * dy; \ + desty = cliprect.top(); \ } \ \ /* apply bottom clip */ \ - if (destendy > cliprect.max_y) \ - destendy = cliprect.max_y; \ + if (destendy > cliprect.bottom()) \ + destendy = cliprect.bottom(); \ \ /* apply X flipping */ \ if (flipx) \ @@ -740,37 +740,37 @@ do { \ /* compute final pixel in X and exit if we are entirely clipped */ \ destendx = destx + src.width() - 1; \ - if (destx > cliprect.max_x || destendx < cliprect.min_x) \ + if (destx > cliprect.right() || destendx < cliprect.left()) \ break; \ \ /* apply left clip */ \ srcx = 0; \ - if (destx < cliprect.min_x) \ + if (destx < cliprect.left()) \ { \ - srcx = cliprect.min_x - destx; \ - destx = cliprect.min_x; \ + srcx = cliprect.left() - destx; \ + destx = cliprect.left(); \ } \ \ /* apply right clip */ \ - if (destendx > cliprect.max_x) \ - destendx = cliprect.max_x; \ + if (destendx > cliprect.right()) \ + destendx = cliprect.right(); \ \ /* compute final pixel in Y and exit if we are entirely clipped */ \ destendy = desty + src.height() - 1; \ - if (desty > cliprect.max_y || destendy < cliprect.min_y) \ + if (desty > cliprect.bottom() || destendy < cliprect.top()) \ break; \ \ /* apply top clip */ \ srcy = 0; \ - if (desty < cliprect.min_y) \ + if (desty < cliprect.top()) \ { \ - srcy = cliprect.min_y - desty; \ - desty = cliprect.min_y; \ + srcy = cliprect.top() - desty; \ + desty = cliprect.top(); \ } \ \ /* apply bottom clip */ \ - if (destendy > cliprect.max_y) \ - destendy = cliprect.max_y; \ + if (destendy > cliprect.bottom()) \ + destendy = cliprect.bottom(); \ \ /* apply X flipping */ \ if (flipx) \ @@ -912,8 +912,8 @@ do { srcfixheight = src.height() << 16; \ \ /* advance the starting coordinates to the top-left of the cliprect */ \ - startx += cliprect.min_x * incxx + cliprect.min_y * incyx; \ - starty += cliprect.min_x * incxy + cliprect.min_y * incyy; \ + startx += cliprect.left() * incxx + cliprect.top() * incyx; \ + starty += cliprect.left() * incxy + cliprect.top() * incyy; \ \ /* compute how many blocks of 4 pixels we have */ \ numblocks = cliprect.width() / 4; \ @@ -926,10 +926,10 @@ do { if (!wraparound) \ { \ /* iterate over pixels in Y */ \ - for (cury = cliprect.min_y; cury <= cliprect.max_y; cury++) \ + for (cury = cliprect.top(); cury <= cliprect.bottom(); cury++) \ { \ - PRIORITY_TYPE *priptr = PRIORITY_ADDR(priority, PRIORITY_TYPE, cury, cliprect.min_x); \ - PIXEL_TYPE *destptr = &dest.pixt<PIXEL_TYPE>(cury, cliprect.min_x); \ + PRIORITY_TYPE *priptr = PRIORITY_ADDR(priority, PRIORITY_TYPE, cury, cliprect.left()); \ + PIXEL_TYPE *destptr = &dest.pixt<PIXEL_TYPE>(cury, cliprect.left()); \ const PIXEL_TYPE *srcptr; \ s32 srcx = startx; \ s32 srcy = starty; \ @@ -987,10 +987,10 @@ do { starty &= srcfixheight; \ \ /* iterate over pixels in Y */ \ - for (cury = cliprect.min_y; cury <= cliprect.max_y; cury++) \ + for (cury = cliprect.top(); cury <= cliprect.bottom(); cury++) \ { \ - PRIORITY_TYPE *priptr = PRIORITY_ADDR(priority, PRIORITY_TYPE, cury, cliprect.min_x); \ - PIXEL_TYPE *destptr = &dest.pixt<PIXEL_TYPE>(cury, cliprect.min_x); \ + PRIORITY_TYPE *priptr = PRIORITY_ADDR(priority, PRIORITY_TYPE, cury, cliprect.left()); \ + PIXEL_TYPE *destptr = &dest.pixt<PIXEL_TYPE>(cury, cliprect.left()); \ const PIXEL_TYPE *srcptr = &src.pixt<PIXEL_TYPE>(starty >> 16); \ s32 srcx = startx; \ \ @@ -1034,10 +1034,10 @@ do { if (!wraparound) \ { \ /* iterate over pixels in Y */ \ - for (cury = cliprect.min_y; cury <= cliprect.max_y; cury++) \ + for (cury = cliprect.top(); cury <= cliprect.bottom(); cury++) \ { \ - PRIORITY_TYPE *priptr = PRIORITY_ADDR(priority, PRIORITY_TYPE, cury, cliprect.min_x); \ - PIXEL_TYPE *destptr = &dest.pixt<PIXEL_TYPE>(cury, cliprect.min_x); \ + PRIORITY_TYPE *priptr = PRIORITY_ADDR(priority, PRIORITY_TYPE, cury, cliprect.left()); \ + PIXEL_TYPE *destptr = &dest.pixt<PIXEL_TYPE>(cury, cliprect.left()); \ const PIXEL_TYPE *srcptr; \ s32 srcx = startx; \ s32 srcy = starty; \ @@ -1110,10 +1110,10 @@ do { starty &= srcfixheight; \ \ /* iterate over pixels in Y */ \ - for (cury = cliprect.min_y; cury <= cliprect.max_y; cury++) \ + for (cury = cliprect.top(); cury <= cliprect.bottom(); cury++) \ { \ - PRIORITY_TYPE *priptr = PRIORITY_ADDR(priority, PRIORITY_TYPE, cury, cliprect.min_x); \ - PIXEL_TYPE *destptr = &dest.pixt<PIXEL_TYPE>(cury, cliprect.min_x); \ + PRIORITY_TYPE *priptr = PRIORITY_ADDR(priority, PRIORITY_TYPE, cury, cliprect.left()); \ + PIXEL_TYPE *destptr = &dest.pixt<PIXEL_TYPE>(cury, cliprect.left()); \ const PIXEL_TYPE *srcptr; \ s32 srcx = startx; \ s32 srcy = starty; \ diff --git a/src/emu/emumem.cpp b/src/emu/emumem.cpp index 0cfb6f07d93..0ba90cb45ab 100644 --- a/src/emu/emumem.cpp +++ b/src/emu/emumem.cpp @@ -222,7 +222,7 @@ const int MEMORY_BLOCK_CHUNK = 65536; // minimum chunk size of template<int Width, int AddrShift, endianness_t Endian> class address_space_specific : public address_space { - using uX = typename handler_entry_size<Width>::uX; + using uX = typename emu::detail::handler_entry_size<Width>::uX; using NativeType = uX; using this_type = address_space_specific<Width, AddrShift, Endian>; @@ -244,6 +244,7 @@ public: void install_bank_generic(offs_t addrstart, offs_t addrend, offs_t addrmirror, memory_bank *rbank, memory_bank *wbank) override; void install_readwrite_port(offs_t addrstart, offs_t addrend, offs_t addrmirror, const char *rtag, const char *wtag) override; void install_device_delegate(offs_t addrstart, offs_t addrend, device_t &device, address_map_constructor &map, u64 unitmask = 0, int cswidth = 0) override; + void install_read_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read8_delegate rhandler, u64 unitmask = 0, int cswidth = 0) override; void install_write_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, write8_delegate whandler, u64 unitmask = 0, int cswidth = 0) override; void install_readwrite_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read8_delegate rhandler, write8_delegate whandler, u64 unitmask = 0, int cswidth = 0) override; @@ -257,6 +258,45 @@ public: void install_write_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, write64_delegate whandler, u64 unitmask = 0, int cswidth = 0) override; void install_readwrite_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read64_delegate rhandler, write64_delegate whandler, u64 unitmask = 0, int cswidth = 0) override; + void install_read_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read8s_delegate rhandler, u64 unitmask = 0, int cswidth = 0) override; + void install_write_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, write8s_delegate whandler, u64 unitmask = 0, int cswidth = 0) override; + void install_readwrite_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read8s_delegate rhandler, write8s_delegate whandler, u64 unitmask = 0, int cswidth = 0) override; + void install_read_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read16s_delegate rhandler, u64 unitmask = 0, int cswidth = 0) override; + void install_write_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, write16s_delegate whandler, u64 unitmask = 0, int cswidth = 0) override; + void install_readwrite_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read16s_delegate rhandler, write16s_delegate whandler, u64 unitmask = 0, int cswidth = 0) override; + void install_read_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read32s_delegate rhandler, u64 unitmask = 0, int cswidth = 0) override; + void install_write_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, write32s_delegate whandler, u64 unitmask = 0, int cswidth = 0) override; + void install_readwrite_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read32s_delegate rhandler, write32s_delegate whandler, u64 unitmask = 0, int cswidth = 0) override; + void install_read_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read64s_delegate rhandler, u64 unitmask = 0, int cswidth = 0) override; + void install_write_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, write64s_delegate whandler, u64 unitmask = 0, int cswidth = 0) override; + void install_readwrite_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read64s_delegate rhandler, write64s_delegate whandler, u64 unitmask = 0, int cswidth = 0) override; + + void install_read_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read8sm_delegate rhandler, u64 unitmask = 0, int cswidth = 0) override; + void install_write_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, write8sm_delegate whandler, u64 unitmask = 0, int cswidth = 0) override; + void install_readwrite_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read8sm_delegate rhandler, write8sm_delegate whandler, u64 unitmask = 0, int cswidth = 0) override; + void install_read_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read16sm_delegate rhandler, u64 unitmask = 0, int cswidth = 0) override; + void install_write_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, write16sm_delegate whandler, u64 unitmask = 0, int cswidth = 0) override; + void install_readwrite_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read16sm_delegate rhandler, write16sm_delegate whandler, u64 unitmask = 0, int cswidth = 0) override; + void install_read_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read32sm_delegate rhandler, u64 unitmask = 0, int cswidth = 0) override; + void install_write_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, write32sm_delegate whandler, u64 unitmask = 0, int cswidth = 0) override; + void install_readwrite_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read32sm_delegate rhandler, write32sm_delegate whandler, u64 unitmask = 0, int cswidth = 0) override; + void install_read_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read64sm_delegate rhandler, u64 unitmask = 0, int cswidth = 0) override; + void install_write_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, write64sm_delegate whandler, u64 unitmask = 0, int cswidth = 0) override; + void install_readwrite_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read64sm_delegate rhandler, write64sm_delegate whandler, u64 unitmask = 0, int cswidth = 0) override; + + void install_read_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read8smo_delegate rhandler, u64 unitmask = 0, int cswidth = 0) override; + void install_write_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, write8smo_delegate whandler, u64 unitmask = 0, int cswidth = 0) override; + void install_readwrite_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read8smo_delegate rhandler, write8smo_delegate whandler, u64 unitmask = 0, int cswidth = 0) override; + void install_read_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read16smo_delegate rhandler, u64 unitmask = 0, int cswidth = 0) override; + void install_write_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, write16smo_delegate whandler, u64 unitmask = 0, int cswidth = 0) override; + void install_readwrite_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read16smo_delegate rhandler, write16smo_delegate whandler, u64 unitmask = 0, int cswidth = 0) override; + void install_read_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read32smo_delegate rhandler, u64 unitmask = 0, int cswidth = 0) override; + void install_write_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, write32smo_delegate whandler, u64 unitmask = 0, int cswidth = 0) override; + void install_readwrite_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read32smo_delegate rhandler, write32smo_delegate whandler, u64 unitmask = 0, int cswidth = 0) override; + void install_read_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read64smo_delegate rhandler, u64 unitmask = 0, int cswidth = 0) override; + void install_write_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, write64smo_delegate whandler, u64 unitmask = 0, int cswidth = 0) override; + void install_readwrite_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read64smo_delegate rhandler, write64smo_delegate whandler, u64 unitmask = 0, int cswidth = 0) override; + using address_space::install_read_tap; using address_space::install_write_tap; using address_space::install_readwrite_tap; @@ -470,9 +510,9 @@ public: std::unordered_set<handler_entry *> m_delayed_unrefs; private: - template<int AccessWidth> std::enable_if_t<(Width == AccessWidth)> + template<int AccessWidth, typename READ> std::enable_if_t<(Width == AccessWidth)> install_read_handler_helper(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, u64 unitmask, int cswidth, - typename handler_entry_size<AccessWidth>::READ handler_r) + READ handler_r) { VPRINTF(("address_space::install_read_handler(%s-%s mask=%s mirror=%s, space width=%d, handler width=%d, %s, %s)\n", core_i64_hex_format(addrstart, m_addrchars), core_i64_hex_format(addrend, m_addrchars), @@ -485,15 +525,15 @@ private: int ncswidth; check_optimize_all("install_read_handler", 8 << AccessWidth, addrstart, addrend, addrmask, addrmirror, addrselect, unitmask, cswidth, nstart, nend, nmask, nmirror, nunitmask, ncswidth); - auto hand_r = new handler_entry_read_delegate<Width, AddrShift, Endian>(this, handler_r); + auto hand_r = new handler_entry_read_delegate<Width, AddrShift, Endian, READ>(this, handler_r); hand_r->set_address_info(nstart, nmask); m_root_read->populate(nstart, nend, nmirror, hand_r); invalidate_caches(read_or_write::READ); } - template<int AccessWidth> std::enable_if_t<(Width > AccessWidth)> + template<int AccessWidth, typename READ> std::enable_if_t<(Width > AccessWidth)> install_read_handler_helper(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, u64 unitmask, int cswidth, - typename handler_entry_size<AccessWidth>::READ handler_r) + READ handler_r) { VPRINTF(("address_space::install_read_handler(%s-%s mask=%s mirror=%s, space width=%d, handler width=%d, %s, %s)\n", core_i64_hex_format(addrstart, m_addrchars), core_i64_hex_format(addrend, m_addrchars), @@ -506,7 +546,7 @@ private: int ncswidth; check_optimize_all("install_read_handler", 8 << AccessWidth, addrstart, addrend, addrmask, addrmirror, addrselect, unitmask, cswidth, nstart, nend, nmask, nmirror, nunitmask, ncswidth); - auto hand_r = new handler_entry_read_delegate<AccessWidth, -AccessWidth, Endian>(this, handler_r); + auto hand_r = new handler_entry_read_delegate<AccessWidth, -AccessWidth, Endian, READ>(this, handler_r); memory_units_descriptor<Width, AddrShift, Endian> descriptor(AccessWidth, Endian, hand_r, nstart, nend, nmask, nunitmask, ncswidth); hand_r->set_address_info(descriptor.get_handler_start(), descriptor.get_handler_mask()); m_root_read->populate_mismatched(nstart, nend, nmirror, descriptor); @@ -515,16 +555,16 @@ private: } - template<int AccessWidth> std::enable_if_t<(Width < AccessWidth)> + template<int AccessWidth, typename READ> std::enable_if_t<(Width < AccessWidth)> install_read_handler_helper(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, u64 unitmask, int cswidth, - typename handler_entry_size<AccessWidth>::READ handler_r) + READ handler_r) { fatalerror("install_read_handler: cannot install a %d-wide handler in a %d-wide bus", 8 << AccessWidth, 8 << Width); } - template<int AccessWidth> std::enable_if_t<(Width == AccessWidth)> + template<int AccessWidth, typename WRITE> std::enable_if_t<(Width == AccessWidth)> install_write_handler_helper(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, u64 unitmask, int cswidth, - typename handler_entry_size<AccessWidth>::WRITE handler_w) + WRITE handler_w) { VPRINTF(("address_space::install_write_handler(%s-%s mask=%s mirror=%s, space width=%d, handler width=%d, %s, %s)\n", core_i64_hex_format(addrstart, m_addrchars), core_i64_hex_format(addrend, m_addrchars), @@ -537,15 +577,15 @@ private: int ncswidth; check_optimize_all("install_write_handler", 8 << AccessWidth, addrstart, addrend, addrmask, addrmirror, addrselect, unitmask, cswidth, nstart, nend, nmask, nmirror, nunitmask, ncswidth); - auto hand_w = new handler_entry_write_delegate<Width, AddrShift, Endian>(this, handler_w); + auto hand_w = new handler_entry_write_delegate<Width, AddrShift, Endian, WRITE>(this, handler_w); hand_w->set_address_info(nstart, nmask); m_root_write->populate(nstart, nend, nmirror, hand_w); invalidate_caches(read_or_write::WRITE); } - template<int AccessWidth> std::enable_if_t<(Width > AccessWidth)> + template<int AccessWidth, typename WRITE> std::enable_if_t<(Width > AccessWidth)> install_write_handler_helper(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, u64 unitmask, int cswidth, - typename handler_entry_size<AccessWidth>::WRITE handler_w) + WRITE handler_w) { VPRINTF(("address_space::install_write_handler(%s-%s mask=%s mirror=%s, space width=%d, handler width=%d, %s, %s)\n", core_i64_hex_format(addrstart, m_addrchars), core_i64_hex_format(addrend, m_addrchars), @@ -558,7 +598,7 @@ private: int ncswidth; check_optimize_all("install_write_handler", 8 << AccessWidth, addrstart, addrend, addrmask, addrmirror, addrselect, unitmask, cswidth, nstart, nend, nmask, nmirror, nunitmask, ncswidth); - auto hand_w = new handler_entry_write_delegate<AccessWidth, -AccessWidth, Endian>(this, handler_w); + auto hand_w = new handler_entry_write_delegate<AccessWidth, -AccessWidth, Endian, WRITE>(this, handler_w); memory_units_descriptor<Width, AddrShift, Endian> descriptor(AccessWidth, Endian, hand_w, nstart, nend, nmask, nunitmask, ncswidth); hand_w->set_address_info(descriptor.get_handler_start(), descriptor.get_handler_mask()); m_root_write->populate_mismatched(nstart, nend, nmirror, descriptor); @@ -567,19 +607,19 @@ private: } - template<int AccessWidth> std::enable_if_t<(Width < AccessWidth)> + template<int AccessWidth, typename WRITE> std::enable_if_t<(Width < AccessWidth)> install_write_handler_helper(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, u64 unitmask, int cswidth, - typename handler_entry_size<AccessWidth>::WRITE handler_w) + WRITE handler_w) { fatalerror("install_write_handler: cannot install a %d-wide handler in a %d-wide bus", 8 << AccessWidth, 8 << Width); } - template<int AccessWidth> std::enable_if_t<(Width == AccessWidth)> + template<int AccessWidth, typename READ, typename WRITE> std::enable_if_t<(Width == AccessWidth)> install_readwrite_handler_helper(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, u64 unitmask, int cswidth, - typename handler_entry_size<AccessWidth>::READ handler_r, - typename handler_entry_size<AccessWidth>::WRITE handler_w) + READ handler_r, + WRITE handler_w) { VPRINTF(("address_space::install_readwrite_handler(%s-%s mask=%s mirror=%s, space width=%d, handler width=%d, %s, %s, %s)\n", core_i64_hex_format(addrstart, m_addrchars), core_i64_hex_format(addrend, m_addrchars), @@ -592,21 +632,21 @@ private: int ncswidth; check_optimize_all("install_readwrite_handler", 8 << AccessWidth, addrstart, addrend, addrmask, addrmirror, addrselect, unitmask, cswidth, nstart, nend, nmask, nmirror, nunitmask, ncswidth); - auto hand_r = new handler_entry_read_delegate <Width, AddrShift, Endian>(this, handler_r); + auto hand_r = new handler_entry_read_delegate <Width, AddrShift, Endian, READ>(this, handler_r); hand_r->set_address_info(nstart, nmask); m_root_read ->populate(nstart, nend, nmirror, hand_r); - auto hand_w = new handler_entry_write_delegate<Width, AddrShift, Endian>(this, handler_w); + auto hand_w = new handler_entry_write_delegate<Width, AddrShift, Endian, WRITE>(this, handler_w); hand_w->set_address_info(nstart, nmask); m_root_write->populate(nstart, nend, nmirror, hand_w); invalidate_caches(read_or_write::READWRITE); } - template<int AccessWidth> std::enable_if_t<(Width > AccessWidth)> + template<int AccessWidth, typename READ, typename WRITE> std::enable_if_t<(Width > AccessWidth)> install_readwrite_handler_helper(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, u64 unitmask, int cswidth, - typename handler_entry_size<AccessWidth>::READ handler_r, - typename handler_entry_size<AccessWidth>::WRITE handler_w) + READ handler_r, + WRITE handler_w) { VPRINTF(("address_space::install_readwrite_handler(%s-%s mask=%s mirror=%s, space width=%d, handler width=%d, %s, %s, %s)\n", core_i64_hex_format(addrstart, m_addrchars), core_i64_hex_format(addrend, m_addrchars), @@ -619,13 +659,13 @@ private: int ncswidth; check_optimize_all("install_readwrite_handler", 8 << AccessWidth, addrstart, addrend, addrmask, addrmirror, addrselect, unitmask, cswidth, nstart, nend, nmask, nmirror, nunitmask, ncswidth); - auto hand_r = new handler_entry_read_delegate <AccessWidth, -AccessWidth, Endian>(this, handler_r); + auto hand_r = new handler_entry_read_delegate <AccessWidth, -AccessWidth, Endian, READ>(this, handler_r); memory_units_descriptor<Width, AddrShift, Endian> descriptor(AccessWidth, Endian, hand_r, nstart, nend, nmask, nunitmask, ncswidth); hand_r->set_address_info(descriptor.get_handler_start(), descriptor.get_handler_mask()); m_root_read ->populate_mismatched(nstart, nend, nmirror, descriptor); hand_r->unref(); - auto hand_w = new handler_entry_write_delegate<AccessWidth, -AccessWidth, Endian>(this, handler_w); + auto hand_w = new handler_entry_write_delegate<AccessWidth, -AccessWidth, Endian, WRITE>(this, handler_w); descriptor.set_subunit_handler(hand_w); hand_w->set_address_info(descriptor.get_handler_start(), descriptor.get_handler_mask()); m_root_write->populate_mismatched(nstart, nend, nmirror, descriptor); @@ -635,10 +675,10 @@ private: } - template<int AccessWidth> std::enable_if_t<(Width < AccessWidth)> + template<int AccessWidth, typename READ, typename WRITE> std::enable_if_t<(Width < AccessWidth)> install_readwrite_handler_helper(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, u64 unitmask, int cswidth, - typename handler_entry_size<AccessWidth>::READ handler_r, - typename handler_entry_size<AccessWidth>::WRITE handler_w) + READ handler_r, + WRITE handler_w) { fatalerror("install_readwrite_handler: cannot install a %d-wide handler in a %d-wide bus", 8 << AccessWidth, 8 << Width); } @@ -1255,7 +1295,7 @@ void address_space::populate_map_entry(const address_map_entry &entry, read_or_w unmap_generic(entry.m_addrstart, entry.m_addrend, entry.m_addrmirror, readorwrite, false); break; - case AMH_DEVICE_DELEGATE: + case AMH_DEVICE_DELEGATE_F: if (readorwrite == read_or_write::READ) switch (data.m_bits) { @@ -1274,6 +1314,63 @@ void address_space::populate_map_entry(const address_map_entry &entry, read_or_w } break; + case AMH_DEVICE_DELEGATE_S: + if (readorwrite == read_or_write::READ) + switch (data.m_bits) + { + case 8: install_read_handler(entry.m_addrstart, entry.m_addrend, entry.m_addrmask, entry.m_addrmirror, entry.m_addrselect, read8s_delegate(entry.m_rproto8s, entry.m_devbase), entry.m_mask, entry.m_cswidth); break; + case 16: install_read_handler(entry.m_addrstart, entry.m_addrend, entry.m_addrmask, entry.m_addrmirror, entry.m_addrselect, read16s_delegate(entry.m_rproto16s, entry.m_devbase), entry.m_mask, entry.m_cswidth); break; + case 32: install_read_handler(entry.m_addrstart, entry.m_addrend, entry.m_addrmask, entry.m_addrmirror, entry.m_addrselect, read32s_delegate(entry.m_rproto32s, entry.m_devbase), entry.m_mask, entry.m_cswidth); break; + case 64: install_read_handler(entry.m_addrstart, entry.m_addrend, entry.m_addrmask, entry.m_addrmirror, entry.m_addrselect, read64s_delegate(entry.m_rproto64s, entry.m_devbase), entry.m_mask, entry.m_cswidth); break; + } + else + switch (data.m_bits) + { + case 8: install_write_handler(entry.m_addrstart, entry.m_addrend, entry.m_addrmask, entry.m_addrmirror, entry.m_addrselect, write8s_delegate(entry.m_wproto8s, entry.m_devbase), entry.m_mask, entry.m_cswidth); break; + case 16: install_write_handler(entry.m_addrstart, entry.m_addrend, entry.m_addrmask, entry.m_addrmirror, entry.m_addrselect, write16s_delegate(entry.m_wproto16s, entry.m_devbase), entry.m_mask, entry.m_cswidth); break; + case 32: install_write_handler(entry.m_addrstart, entry.m_addrend, entry.m_addrmask, entry.m_addrmirror, entry.m_addrselect, write32s_delegate(entry.m_wproto32s, entry.m_devbase), entry.m_mask, entry.m_cswidth); break; + case 64: install_write_handler(entry.m_addrstart, entry.m_addrend, entry.m_addrmask, entry.m_addrmirror, entry.m_addrselect, write64s_delegate(entry.m_wproto64s, entry.m_devbase), entry.m_mask, entry.m_cswidth); break; + } + break; + + case AMH_DEVICE_DELEGATE_SM: + if (readorwrite == read_or_write::READ) + switch (data.m_bits) + { + case 8: install_read_handler(entry.m_addrstart, entry.m_addrend, entry.m_addrmask, entry.m_addrmirror, entry.m_addrselect, read8sm_delegate(entry.m_rproto8sm, entry.m_devbase), entry.m_mask, entry.m_cswidth); break; + case 16: install_read_handler(entry.m_addrstart, entry.m_addrend, entry.m_addrmask, entry.m_addrmirror, entry.m_addrselect, read16sm_delegate(entry.m_rproto16sm, entry.m_devbase), entry.m_mask, entry.m_cswidth); break; + case 32: install_read_handler(entry.m_addrstart, entry.m_addrend, entry.m_addrmask, entry.m_addrmirror, entry.m_addrselect, read32sm_delegate(entry.m_rproto32sm, entry.m_devbase), entry.m_mask, entry.m_cswidth); break; + case 64: install_read_handler(entry.m_addrstart, entry.m_addrend, entry.m_addrmask, entry.m_addrmirror, entry.m_addrselect, read64sm_delegate(entry.m_rproto64sm, entry.m_devbase), entry.m_mask, entry.m_cswidth); break; + } + else + switch (data.m_bits) + { + case 8: install_write_handler(entry.m_addrstart, entry.m_addrend, entry.m_addrmask, entry.m_addrmirror, entry.m_addrselect, write8sm_delegate(entry.m_wproto8sm, entry.m_devbase), entry.m_mask, entry.m_cswidth); break; + case 16: install_write_handler(entry.m_addrstart, entry.m_addrend, entry.m_addrmask, entry.m_addrmirror, entry.m_addrselect, write16sm_delegate(entry.m_wproto16sm, entry.m_devbase), entry.m_mask, entry.m_cswidth); break; + case 32: install_write_handler(entry.m_addrstart, entry.m_addrend, entry.m_addrmask, entry.m_addrmirror, entry.m_addrselect, write32sm_delegate(entry.m_wproto32sm, entry.m_devbase), entry.m_mask, entry.m_cswidth); break; + case 64: install_write_handler(entry.m_addrstart, entry.m_addrend, entry.m_addrmask, entry.m_addrmirror, entry.m_addrselect, write64sm_delegate(entry.m_wproto64sm, entry.m_devbase), entry.m_mask, entry.m_cswidth); break; + } + break; + + case AMH_DEVICE_DELEGATE_SMO: + if (readorwrite == read_or_write::READ) + switch (data.m_bits) + { + case 8: install_read_handler(entry.m_addrstart, entry.m_addrend, entry.m_addrmask, entry.m_addrmirror, entry.m_addrselect, read8smo_delegate(entry.m_rproto8smo, entry.m_devbase), entry.m_mask, entry.m_cswidth); break; + case 16: install_read_handler(entry.m_addrstart, entry.m_addrend, entry.m_addrmask, entry.m_addrmirror, entry.m_addrselect, read16smo_delegate(entry.m_rproto16smo, entry.m_devbase), entry.m_mask, entry.m_cswidth); break; + case 32: install_read_handler(entry.m_addrstart, entry.m_addrend, entry.m_addrmask, entry.m_addrmirror, entry.m_addrselect, read32smo_delegate(entry.m_rproto32smo, entry.m_devbase), entry.m_mask, entry.m_cswidth); break; + case 64: install_read_handler(entry.m_addrstart, entry.m_addrend, entry.m_addrmask, entry.m_addrmirror, entry.m_addrselect, read64smo_delegate(entry.m_rproto64smo, entry.m_devbase), entry.m_mask, entry.m_cswidth); break; + } + else + switch (data.m_bits) + { + case 8: install_write_handler(entry.m_addrstart, entry.m_addrend, entry.m_addrmask, entry.m_addrmirror, entry.m_addrselect, write8smo_delegate(entry.m_wproto8smo, entry.m_devbase), entry.m_mask, entry.m_cswidth); break; + case 16: install_write_handler(entry.m_addrstart, entry.m_addrend, entry.m_addrmask, entry.m_addrmirror, entry.m_addrselect, write16smo_delegate(entry.m_wproto16smo, entry.m_devbase), entry.m_mask, entry.m_cswidth); break; + case 32: install_write_handler(entry.m_addrstart, entry.m_addrend, entry.m_addrmask, entry.m_addrmirror, entry.m_addrselect, write32smo_delegate(entry.m_wproto32smo, entry.m_devbase), entry.m_mask, entry.m_cswidth); break; + case 64: install_write_handler(entry.m_addrstart, entry.m_addrend, entry.m_addrmask, entry.m_addrmirror, entry.m_addrselect, write64smo_delegate(entry.m_wproto64smo, entry.m_devbase), entry.m_mask, entry.m_cswidth); break; + } + break; + case AMH_PORT: install_readwrite_port(entry.m_addrstart, entry.m_addrend, entry.m_addrmirror, (readorwrite == read_or_write::READ) ? data.m_tag : nullptr, @@ -1894,6 +1991,51 @@ template<int Width, int AddrShift, endianness_t Endian> void address_space_speci install_readwrite_handler_helper<0>(addrstart, addrend, addrmask, addrmirror, addrselect, unitmask, cswidth, rhandler, whandler); } +template<int Width, int AddrShift, endianness_t Endian> void address_space_specific<Width, AddrShift, Endian>::install_read_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read8s_delegate handler, u64 unitmask, int cswidth) +{ + install_read_handler_helper<0>(addrstart, addrend, addrmask, addrmirror, addrselect, unitmask, cswidth, handler); +} + +template<int Width, int AddrShift, endianness_t Endian> void address_space_specific<Width, AddrShift, Endian>::install_write_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, write8s_delegate handler, u64 unitmask, int cswidth) +{ + install_write_handler_helper<0>(addrstart, addrend, addrmask, addrmirror, addrselect, unitmask, cswidth, handler); +} + +template<int Width, int AddrShift, endianness_t Endian> void address_space_specific<Width, AddrShift, Endian>::install_readwrite_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read8s_delegate rhandler, write8s_delegate whandler, u64 unitmask, int cswidth) +{ + install_readwrite_handler_helper<0>(addrstart, addrend, addrmask, addrmirror, addrselect, unitmask, cswidth, rhandler, whandler); +} + +template<int Width, int AddrShift, endianness_t Endian> void address_space_specific<Width, AddrShift, Endian>::install_read_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read8sm_delegate handler, u64 unitmask, int cswidth) +{ + install_read_handler_helper<0>(addrstart, addrend, addrmask, addrmirror, addrselect, unitmask, cswidth, handler); +} + +template<int Width, int AddrShift, endianness_t Endian> void address_space_specific<Width, AddrShift, Endian>::install_write_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, write8sm_delegate handler, u64 unitmask, int cswidth) +{ + install_write_handler_helper<0>(addrstart, addrend, addrmask, addrmirror, addrselect, unitmask, cswidth, handler); +} + +template<int Width, int AddrShift, endianness_t Endian> void address_space_specific<Width, AddrShift, Endian>::install_readwrite_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read8sm_delegate rhandler, write8sm_delegate whandler, u64 unitmask, int cswidth) +{ + install_readwrite_handler_helper<0>(addrstart, addrend, addrmask, addrmirror, addrselect, unitmask, cswidth, rhandler, whandler); +} + +template<int Width, int AddrShift, endianness_t Endian> void address_space_specific<Width, AddrShift, Endian>::install_read_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read8smo_delegate handler, u64 unitmask, int cswidth) +{ + install_read_handler_helper<0>(addrstart, addrend, addrmask, addrmirror, addrselect, unitmask, cswidth, handler); +} + +template<int Width, int AddrShift, endianness_t Endian> void address_space_specific<Width, AddrShift, Endian>::install_write_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, write8smo_delegate handler, u64 unitmask, int cswidth) +{ + install_write_handler_helper<0>(addrstart, addrend, addrmask, addrmirror, addrselect, unitmask, cswidth, handler); +} + +template<int Width, int AddrShift, endianness_t Endian> void address_space_specific<Width, AddrShift, Endian>::install_readwrite_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read8smo_delegate rhandler, write8smo_delegate whandler, u64 unitmask, int cswidth) +{ + install_readwrite_handler_helper<0>(addrstart, addrend, addrmask, addrmirror, addrselect, unitmask, cswidth, rhandler, whandler); +} + //------------------------------------------------- // install_handler - install 16-bit read/write @@ -1915,6 +2057,51 @@ template<int Width, int AddrShift, endianness_t Endian> void address_space_speci install_readwrite_handler_helper<1>(addrstart, addrend, addrmask, addrmirror, addrselect, unitmask, cswidth, rhandler, whandler); } +template<int Width, int AddrShift, endianness_t Endian> void address_space_specific<Width, AddrShift, Endian>::install_read_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read16s_delegate handler, u64 unitmask, int cswidth) +{ + install_read_handler_helper<1>(addrstart, addrend, addrmask, addrmirror, addrselect, unitmask, cswidth, handler); +} + +template<int Width, int AddrShift, endianness_t Endian> void address_space_specific<Width, AddrShift, Endian>::install_write_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, write16s_delegate handler, u64 unitmask, int cswidth) +{ + install_write_handler_helper<1>(addrstart, addrend, addrmask, addrmirror, addrselect, unitmask, cswidth, handler); +} + +template<int Width, int AddrShift, endianness_t Endian> void address_space_specific<Width, AddrShift, Endian>::install_readwrite_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read16s_delegate rhandler, write16s_delegate whandler, u64 unitmask, int cswidth) +{ + install_readwrite_handler_helper<1>(addrstart, addrend, addrmask, addrmirror, addrselect, unitmask, cswidth, rhandler, whandler); +} + +template<int Width, int AddrShift, endianness_t Endian> void address_space_specific<Width, AddrShift, Endian>::install_read_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read16sm_delegate handler, u64 unitmask, int cswidth) +{ + install_read_handler_helper<1>(addrstart, addrend, addrmask, addrmirror, addrselect, unitmask, cswidth, handler); +} + +template<int Width, int AddrShift, endianness_t Endian> void address_space_specific<Width, AddrShift, Endian>::install_write_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, write16sm_delegate handler, u64 unitmask, int cswidth) +{ + install_write_handler_helper<1>(addrstart, addrend, addrmask, addrmirror, addrselect, unitmask, cswidth, handler); +} + +template<int Width, int AddrShift, endianness_t Endian> void address_space_specific<Width, AddrShift, Endian>::install_readwrite_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read16sm_delegate rhandler, write16sm_delegate whandler, u64 unitmask, int cswidth) +{ + install_readwrite_handler_helper<1>(addrstart, addrend, addrmask, addrmirror, addrselect, unitmask, cswidth, rhandler, whandler); +} + +template<int Width, int AddrShift, endianness_t Endian> void address_space_specific<Width, AddrShift, Endian>::install_read_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read16smo_delegate handler, u64 unitmask, int cswidth) +{ + install_read_handler_helper<1>(addrstart, addrend, addrmask, addrmirror, addrselect, unitmask, cswidth, handler); +} + +template<int Width, int AddrShift, endianness_t Endian> void address_space_specific<Width, AddrShift, Endian>::install_write_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, write16smo_delegate handler, u64 unitmask, int cswidth) +{ + install_write_handler_helper<1>(addrstart, addrend, addrmask, addrmirror, addrselect, unitmask, cswidth, handler); +} + +template<int Width, int AddrShift, endianness_t Endian> void address_space_specific<Width, AddrShift, Endian>::install_readwrite_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read16smo_delegate rhandler, write16smo_delegate whandler, u64 unitmask, int cswidth) +{ + install_readwrite_handler_helper<1>(addrstart, addrend, addrmask, addrmirror, addrselect, unitmask, cswidth, rhandler, whandler); +} + //------------------------------------------------- // install_handler - install 32-bit read/write @@ -1936,6 +2123,51 @@ template<int Width, int AddrShift, endianness_t Endian> void address_space_speci install_readwrite_handler_helper<2>(addrstart, addrend, addrmask, addrmirror, addrselect, unitmask, cswidth, rhandler, whandler); } +template<int Width, int AddrShift, endianness_t Endian> void address_space_specific<Width, AddrShift, Endian>::install_read_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read32s_delegate handler, u64 unitmask, int cswidth) +{ + install_read_handler_helper<2>(addrstart, addrend, addrmask, addrmirror, addrselect, unitmask, cswidth, handler); +} + +template<int Width, int AddrShift, endianness_t Endian> void address_space_specific<Width, AddrShift, Endian>::install_write_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, write32s_delegate handler, u64 unitmask, int cswidth) +{ + install_write_handler_helper<2>(addrstart, addrend, addrmask, addrmirror, addrselect, unitmask, cswidth, handler); +} + +template<int Width, int AddrShift, endianness_t Endian> void address_space_specific<Width, AddrShift, Endian>::install_readwrite_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read32s_delegate rhandler, write32s_delegate whandler, u64 unitmask, int cswidth) +{ + install_readwrite_handler_helper<2>(addrstart, addrend, addrmask, addrmirror, addrselect, unitmask, cswidth, rhandler, whandler); +} + +template<int Width, int AddrShift, endianness_t Endian> void address_space_specific<Width, AddrShift, Endian>::install_read_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read32sm_delegate handler, u64 unitmask, int cswidth) +{ + install_read_handler_helper<2>(addrstart, addrend, addrmask, addrmirror, addrselect, unitmask, cswidth, handler); +} + +template<int Width, int AddrShift, endianness_t Endian> void address_space_specific<Width, AddrShift, Endian>::install_write_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, write32sm_delegate handler, u64 unitmask, int cswidth) +{ + install_write_handler_helper<2>(addrstart, addrend, addrmask, addrmirror, addrselect, unitmask, cswidth, handler); +} + +template<int Width, int AddrShift, endianness_t Endian> void address_space_specific<Width, AddrShift, Endian>::install_readwrite_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read32sm_delegate rhandler, write32sm_delegate whandler, u64 unitmask, int cswidth) +{ + install_readwrite_handler_helper<2>(addrstart, addrend, addrmask, addrmirror, addrselect, unitmask, cswidth, rhandler, whandler); +} + +template<int Width, int AddrShift, endianness_t Endian> void address_space_specific<Width, AddrShift, Endian>::install_read_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read32smo_delegate handler, u64 unitmask, int cswidth) +{ + install_read_handler_helper<2>(addrstart, addrend, addrmask, addrmirror, addrselect, unitmask, cswidth, handler); +} + +template<int Width, int AddrShift, endianness_t Endian> void address_space_specific<Width, AddrShift, Endian>::install_write_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, write32smo_delegate handler, u64 unitmask, int cswidth) +{ + install_write_handler_helper<2>(addrstart, addrend, addrmask, addrmirror, addrselect, unitmask, cswidth, handler); +} + +template<int Width, int AddrShift, endianness_t Endian> void address_space_specific<Width, AddrShift, Endian>::install_readwrite_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read32smo_delegate rhandler, write32smo_delegate whandler, u64 unitmask, int cswidth) +{ + install_readwrite_handler_helper<2>(addrstart, addrend, addrmask, addrmirror, addrselect, unitmask, cswidth, rhandler, whandler); +} + //------------------------------------------------- // install_handler64 - install 64-bit read/write @@ -1957,6 +2189,51 @@ template<int Width, int AddrShift, endianness_t Endian> void address_space_speci install_readwrite_handler_helper<3>(addrstart, addrend, addrmask, addrmirror, addrselect, unitmask, cswidth, rhandler, whandler); } +template<int Width, int AddrShift, endianness_t Endian> void address_space_specific<Width, AddrShift, Endian>::install_read_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read64s_delegate handler, u64 unitmask, int cswidth) +{ + install_read_handler_helper<3>(addrstart, addrend, addrmask, addrmirror, addrselect, unitmask, cswidth, handler); +} + +template<int Width, int AddrShift, endianness_t Endian> void address_space_specific<Width, AddrShift, Endian>::install_write_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, write64s_delegate handler, u64 unitmask, int cswidth) +{ + install_write_handler_helper<3>(addrstart, addrend, addrmask, addrmirror, addrselect, unitmask, cswidth, handler); +} + +template<int Width, int AddrShift, endianness_t Endian> void address_space_specific<Width, AddrShift, Endian>::install_readwrite_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read64s_delegate rhandler, write64s_delegate whandler, u64 unitmask, int cswidth) +{ + install_readwrite_handler_helper<3>(addrstart, addrend, addrmask, addrmirror, addrselect, unitmask, cswidth, rhandler, whandler); +} + +template<int Width, int AddrShift, endianness_t Endian> void address_space_specific<Width, AddrShift, Endian>::install_read_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read64sm_delegate handler, u64 unitmask, int cswidth) +{ + install_read_handler_helper<3>(addrstart, addrend, addrmask, addrmirror, addrselect, unitmask, cswidth, handler); +} + +template<int Width, int AddrShift, endianness_t Endian> void address_space_specific<Width, AddrShift, Endian>::install_write_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, write64sm_delegate handler, u64 unitmask, int cswidth) +{ + install_write_handler_helper<3>(addrstart, addrend, addrmask, addrmirror, addrselect, unitmask, cswidth, handler); +} + +template<int Width, int AddrShift, endianness_t Endian> void address_space_specific<Width, AddrShift, Endian>::install_readwrite_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read64sm_delegate rhandler, write64sm_delegate whandler, u64 unitmask, int cswidth) +{ + install_readwrite_handler_helper<3>(addrstart, addrend, addrmask, addrmirror, addrselect, unitmask, cswidth, rhandler, whandler); +} + +template<int Width, int AddrShift, endianness_t Endian> void address_space_specific<Width, AddrShift, Endian>::install_read_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read64smo_delegate handler, u64 unitmask, int cswidth) +{ + install_read_handler_helper<3>(addrstart, addrend, addrmask, addrmirror, addrselect, unitmask, cswidth, handler); +} + +template<int Width, int AddrShift, endianness_t Endian> void address_space_specific<Width, AddrShift, Endian>::install_write_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, write64smo_delegate handler, u64 unitmask, int cswidth) +{ + install_write_handler_helper<3>(addrstart, addrend, addrmask, addrmirror, addrselect, unitmask, cswidth, handler); +} + +template<int Width, int AddrShift, endianness_t Endian> void address_space_specific<Width, AddrShift, Endian>::install_readwrite_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read64smo_delegate rhandler, write64smo_delegate whandler, u64 unitmask, int cswidth) +{ + install_readwrite_handler_helper<3>(addrstart, addrend, addrmask, addrmirror, addrselect, unitmask, cswidth, rhandler, whandler); +} + //************************************************************************** // MEMORY MAPPING HELPERS //************************************************************************** diff --git a/src/emu/emumem.h b/src/emu/emumem.h index d631fd29985..ec7fae2b258 100644 --- a/src/emu/emumem.h +++ b/src/emu/emumem.h @@ -94,149 +94,308 @@ using read16_delegate = device_delegate<u16 (address_space &, offs_t, u16)>; using read32_delegate = device_delegate<u32 (address_space &, offs_t, u32)>; using read64_delegate = device_delegate<u64 (address_space &, offs_t, u64)>; +using read8s_delegate = device_delegate<u8 (offs_t, u8 )>; +using read16s_delegate = device_delegate<u16 (offs_t, u16)>; +using read32s_delegate = device_delegate<u32 (offs_t, u32)>; +using read64s_delegate = device_delegate<u64 (offs_t, u64)>; + +using read8sm_delegate = device_delegate<u8 (offs_t)>; +using read16sm_delegate = device_delegate<u16 (offs_t)>; +using read32sm_delegate = device_delegate<u32 (offs_t)>; +using read64sm_delegate = device_delegate<u64 (offs_t)>; + +using read8smo_delegate = device_delegate<u8 ()>; +using read16smo_delegate = device_delegate<u16 ()>; +using read32smo_delegate = device_delegate<u32 ()>; +using read64smo_delegate = device_delegate<u64 ()>; + // ======================> write_delegate // declare delegates for each width -typedef device_delegate<void (address_space &, offs_t, u8, u8 )> write8_delegate; -typedef device_delegate<void (address_space &, offs_t, u16, u16)> write16_delegate; -typedef device_delegate<void (address_space &, offs_t, u32, u32)> write32_delegate; -typedef device_delegate<void (address_space &, offs_t, u64, u64)> write64_delegate; +using write8_delegate = device_delegate<void (address_space &, offs_t, u8, u8 )>; +using write16_delegate = device_delegate<void (address_space &, offs_t, u16, u16)>; +using write32_delegate = device_delegate<void (address_space &, offs_t, u32, u32)>; +using write64_delegate = device_delegate<void (address_space &, offs_t, u64, u64)>; + +using write8s_delegate = device_delegate<void (offs_t, u8, u8 )>; +using write16s_delegate = device_delegate<void (offs_t, u16, u16)>; +using write32s_delegate = device_delegate<void (offs_t, u32, u32)>; +using write64s_delegate = device_delegate<void (offs_t, u64, u64)>; + +using write8sm_delegate = device_delegate<void (offs_t, u8 )>; +using write16sm_delegate = device_delegate<void (offs_t, u16)>; +using write32sm_delegate = device_delegate<void (offs_t, u32)>; +using write64sm_delegate = device_delegate<void (offs_t, u64)>; + +using write8smo_delegate = device_delegate<void (u8 )>; +using write16smo_delegate = device_delegate<void (u16)>; +using write32smo_delegate = device_delegate<void (u32)>; +using write64smo_delegate = device_delegate<void (u64)>; + namespace emu { namespace detail { -template <typename T, typename Enable = void> struct read8_device_class { }; -template <typename T, typename Enable = void> struct read16_device_class { }; -template <typename T, typename Enable = void> struct read32_device_class { }; -template <typename T, typename Enable = void> struct read64_device_class { }; - -template <typename T, typename Ret, typename... Params> -struct read8_device_class<Ret (T::*)(Params...), std::enable_if_t<std::is_constructible<read8_delegate, Ret (T::*)(Params...), const char *, const char *, T *>::value> > { using type = T; }; -template <typename T, typename Ret, typename... Params> -struct read8_device_class<Ret (T::*)(Params...) const, std::enable_if_t<std::is_constructible<read8_delegate, Ret (T::*)(Params...) const, const char *, const char *, T *>::value> > { using type = T; }; -template <typename T, typename Ret, typename... Params> -struct read8_device_class<Ret (*)(T &, Params...), std::enable_if_t<std::is_constructible<read8_delegate, Ret (*)(T &, Params...), const char *, const char *, T *>::value> > { using type = T; }; -template <typename T, typename Ret, typename... Params> -struct read8_device_class<Ret (*)(T *, Params...), std::enable_if_t<std::is_constructible<read8_delegate, Ret (*)(T *, Params...), const char *, const char *, T *>::value> > { using type = T; }; - -template <typename T, typename Ret, typename... Params> -struct read16_device_class<Ret (T::*)(Params...), std::enable_if_t<std::is_constructible<read16_delegate, Ret (T::*)(Params...), const char *, const char *, T *>::value> > { using type = T; }; -template <typename T, typename Ret, typename... Params> -struct read16_device_class<Ret (T::*)(Params...) const, std::enable_if_t<std::is_constructible<read16_delegate, Ret (T::*)(Params...) const, const char *, const char *, T *>::value> > { using type = T; }; -template <typename T, typename Ret, typename... Params> -struct read16_device_class<Ret (*)(T &, Params...), std::enable_if_t<std::is_constructible<read16_delegate, Ret (*)(T &, Params...), const char *, const char *, T *>::value> > { using type = T; }; -template <typename T, typename Ret, typename... Params> -struct read16_device_class<Ret (*)(T *, Params...), std::enable_if_t<std::is_constructible<read16_delegate, Ret (*)(T *, Params...), const char *, const char *, T *>::value> > { using type = T; }; - -template <typename T, typename Ret, typename... Params> -struct read32_device_class<Ret (T::*)(Params...), std::enable_if_t<std::is_constructible<read32_delegate, Ret (T::*)(Params...), const char *, const char *, T *>::value> > { using type = T; }; -template <typename T, typename Ret, typename... Params> -struct read32_device_class<Ret (T::*)(Params...) const, std::enable_if_t<std::is_constructible<read32_delegate, Ret (T::*)(Params...) const, const char *, const char *, T *>::value> > { using type = T; }; -template <typename T, typename Ret, typename... Params> -struct read32_device_class<Ret (*)(T &, Params...), std::enable_if_t<std::is_constructible<read32_delegate, Ret (*)(T &, Params...), const char *, const char *, T *>::value> > { using type = T; }; -template <typename T, typename Ret, typename... Params> -struct read32_device_class<Ret (*)(T *, Params...), std::enable_if_t<std::is_constructible<read32_delegate, Ret (*)(T *, Params...), const char *, const char *, T *>::value> > { using type = T; }; - -template <typename T, typename Ret, typename... Params> -struct read64_device_class<Ret (T::*)(Params...), std::enable_if_t<std::is_constructible<read64_delegate, Ret (T::*)(Params...), const char *, const char *, T *>::value> > { using type = T; }; -template <typename T, typename Ret, typename... Params> -struct read64_device_class<Ret (T::*)(Params...) const, std::enable_if_t<std::is_constructible<read64_delegate, Ret (T::*)(Params...) const, const char *, const char *, T *>::value> > { using type = T; }; -template <typename T, typename Ret, typename... Params> -struct read64_device_class<Ret (*)(T &, Params...), std::enable_if_t<std::is_constructible<read64_delegate, Ret (*)(T &, Params...), const char *, const char *, T *>::value> > { using type = T; }; -template <typename T, typename Ret, typename... Params> -struct read64_device_class<Ret (*)(T *, Params...), std::enable_if_t<std::is_constructible<read64_delegate, Ret (*)(T *, Params...), const char *, const char *, T *>::value> > { using type = T; }; - -template <typename T> using read8_device_class_t = typename read8_device_class<T>::type; -template <typename T> using read16_device_class_t = typename read16_device_class<T>::type; -template <typename T> using read32_device_class_t = typename read32_device_class<T>::type; -template <typename T> using read64_device_class_t = typename read64_device_class<T>::type; - -template <typename T, typename Enable = void> struct write8_device_class { }; -template <typename T, typename Enable = void> struct write16_device_class { }; -template <typename T, typename Enable = void> struct write32_device_class { }; -template <typename T, typename Enable = void> struct write64_device_class { }; - -template <typename T, typename Ret, typename... Params> -struct write8_device_class<Ret (T::*)(Params...), std::enable_if_t<std::is_constructible<write8_delegate, Ret (T::*)(Params...), const char *, const char *, T *>::value> > { using type = T; }; -template <typename T, typename Ret, typename... Params> -struct write8_device_class<Ret (T::*)(Params...) const, std::enable_if_t<std::is_constructible<write8_delegate, Ret (T::*)(Params...) const, const char *, const char *, T *>::value> > { using type = T; }; -template <typename T, typename Ret, typename... Params> -struct write8_device_class<Ret (*)(T &, Params...), std::enable_if_t<std::is_constructible<write8_delegate, Ret (*)(T &, Params...), const char *, const char *, T *>::value> > { using type = T; }; -template <typename T, typename Ret, typename... Params> -struct write8_device_class<Ret (*)(T *, Params...), std::enable_if_t<std::is_constructible<write8_delegate, Ret (*)(T *, Params...), const char *, const char *, T *>::value> > { using type = T; }; - -template <typename T, typename Ret, typename... Params> -struct write16_device_class<Ret (T::*)(Params...), std::enable_if_t<std::is_constructible<write16_delegate, Ret (T::*)(Params...), const char *, const char *, T *>::value> > { using type = T; }; -template <typename T, typename Ret, typename... Params> -struct write16_device_class<Ret (T::*)(Params...) const, std::enable_if_t<std::is_constructible<write16_delegate, Ret (T::*)(Params...) const, const char *, const char *, T *>::value> > { using type = T; }; -template <typename T, typename Ret, typename... Params> -struct write16_device_class<Ret (*)(T &, Params...), std::enable_if_t<std::is_constructible<write16_delegate, Ret (*)(T &, Params...), const char *, const char *, T *>::value> > { using type = T; }; -template <typename T, typename Ret, typename... Params> -struct write16_device_class<Ret (*)(T *, Params...), std::enable_if_t<std::is_constructible<write16_delegate, Ret (*)(T *, Params...), const char *, const char *, T *>::value> > { using type = T; }; - -template <typename T, typename Ret, typename... Params> -struct write32_device_class<Ret (T::*)(Params...), std::enable_if_t<std::is_constructible<write32_delegate, Ret (T::*)(Params...), const char *, const char *, T *>::value> > { using type = T; }; -template <typename T, typename Ret, typename... Params> -struct write32_device_class<Ret (T::*)(Params...) const, std::enable_if_t<std::is_constructible<write32_delegate, Ret (T::*)(Params...) const, const char *, const char *, T *>::value> > { using type = T; }; -template <typename T, typename Ret, typename... Params> -struct write32_device_class<Ret (*)(T &, Params...), std::enable_if_t<std::is_constructible<write32_delegate, Ret (*)(T &, Params...), const char *, const char *, T *>::value> > { using type = T; }; -template <typename T, typename Ret, typename... Params> -struct write32_device_class<Ret (*)(T *, Params...), std::enable_if_t<std::is_constructible<write32_delegate, Ret (*)(T *, Params...), const char *, const char *, T *>::value> > { using type = T; }; - -template <typename T, typename Ret, typename... Params> -struct write64_device_class<Ret (T::*)(Params...), std::enable_if_t<std::is_constructible<write64_delegate, Ret (T::*)(Params...), const char *, const char *, T *>::value> > { using type = T; }; -template <typename T, typename Ret, typename... Params> -struct write64_device_class<Ret (T::*)(Params...) const, std::enable_if_t<std::is_constructible<write64_delegate, Ret (T::*)(Params...) const, const char *, const char *, T *>::value> > { using type = T; }; -template <typename T, typename Ret, typename... Params> -struct write64_device_class<Ret (*)(T &, Params...), std::enable_if_t<std::is_constructible<write64_delegate, Ret (*)(T &, Params...), const char *, const char *, T *>::value> > { using type = T; }; -template <typename T, typename Ret, typename... Params> -struct write64_device_class<Ret (*)(T *, Params...), std::enable_if_t<std::is_constructible<write64_delegate, Ret (*)(T *, Params...), const char *, const char *, T *>::value> > { using type = T; }; - -template <typename T> using write8_device_class_t = typename write8_device_class<T>::type; -template <typename T> using write16_device_class_t = typename write16_device_class<T>::type; -template <typename T> using write32_device_class_t = typename write32_device_class<T>::type; -template <typename T> using write64_device_class_t = typename write64_device_class<T>::type; +template <typename D, typename T, typename Enable = void> struct rw_device_class { }; + +template <typename D, typename T, typename Ret, typename... Params> +struct rw_device_class<D, Ret (T::*)(Params...), std::enable_if_t<std::is_constructible<D, Ret (T::*)(Params...), const char *, const char *, T *>::value> > { using type = T; }; +template <typename D, typename T, typename Ret, typename... Params> +struct rw_device_class<D, Ret (T::*)(Params...) const, std::enable_if_t<std::is_constructible<D, Ret (T::*)(Params...) const, const char *, const char *, T *>::value> > { using type = T; }; +template <typename D, typename T, typename Ret, typename... Params> +struct rw_device_class<D, Ret (*)(T &, Params...), std::enable_if_t<std::is_constructible<D, Ret (*)(T &, Params...), const char *, const char *, T *>::value> > { using type = T; }; +template <typename D, typename T, typename Ret, typename... Params> +struct rw_device_class<D, Ret (*)(T *, Params...), std::enable_if_t<std::is_constructible<D, Ret (*)(T *, Params...), const char *, const char *, T *>::value> > { using type = T; }; + +template <typename D, typename T> using rw_device_class_t = typename rw_device_class <D, T>::type; template <typename T> -inline read8_delegate make_delegate(T &&func, const char *name, const char *tag, read8_device_class_t<std::remove_reference_t<T> > *obj) +inline read8_delegate make_delegate(T &&func, const char *name, const char *tag, rw_device_class_t<read8_delegate, std::remove_reference_t<T> > *obj) { return read8_delegate(func, name, tag, obj); } template <typename T> -inline read16_delegate make_delegate(T &&func, const char *name, const char *tag, read16_device_class_t<std::remove_reference_t<T> > *obj) +inline read16_delegate make_delegate(T &&func, const char *name, const char *tag, rw_device_class_t<read16_delegate, std::remove_reference_t<T> > *obj) { return read16_delegate(func, name, tag, obj); } template <typename T> -inline read32_delegate make_delegate(T &&func, const char *name, const char *tag, read32_device_class_t<std::remove_reference_t<T> > *obj) +inline read32_delegate make_delegate(T &&func, const char *name, const char *tag, rw_device_class_t<read32_delegate, std::remove_reference_t<T> > *obj) { return read32_delegate(func, name, tag, obj); } template <typename T> -inline read64_delegate make_delegate(T &&func, const char *name, const char *tag, read64_device_class_t<std::remove_reference_t<T> > *obj) +inline read64_delegate make_delegate(T &&func, const char *name, const char *tag, rw_device_class_t<read64_delegate, std::remove_reference_t<T> > *obj) { return read64_delegate(func, name, tag, obj); } template <typename T> -inline write8_delegate make_delegate(T &&func, const char *name, const char *tag, write8_device_class_t<std::remove_reference_t<T> > *obj) +inline write8_delegate make_delegate(T &&func, const char *name, const char *tag, rw_device_class_t<write8_delegate, std::remove_reference_t<T> > *obj) { return write8_delegate(func, name, tag, obj); } template <typename T> -inline write16_delegate make_delegate(T &&func, const char *name, const char *tag, write16_device_class_t<std::remove_reference_t<T> > *obj) +inline write16_delegate make_delegate(T &&func, const char *name, const char *tag, rw_device_class_t<write16_delegate, std::remove_reference_t<T> > *obj) { return write16_delegate(func, name, tag, obj); } template <typename T> -inline write32_delegate make_delegate(T &&func, const char *name, const char *tag, write32_device_class_t<std::remove_reference_t<T> > *obj) +inline write32_delegate make_delegate(T &&func, const char *name, const char *tag, rw_device_class_t<write32_delegate, std::remove_reference_t<T> > *obj) { return write32_delegate(func, name, tag, obj); } template <typename T> -inline write64_delegate make_delegate(T &&func, const char *name, const char *tag, write64_device_class_t<std::remove_reference_t<T> > *obj) +inline write64_delegate make_delegate(T &&func, const char *name, const char *tag, rw_device_class_t<write64_delegate, std::remove_reference_t<T> > *obj) { return write64_delegate(func, name, tag, obj); } -} } // namespace emu::detail -// =====================-> Width -> types +template <typename T> +inline read8s_delegate make_delegate(T &&func, const char *name, const char *tag, rw_device_class_t<read8s_delegate, std::remove_reference_t<T> > *obj) +{ return read8s_delegate(func, name, tag, obj); } +template <typename T> +inline read16s_delegate make_delegate(T &&func, const char *name, const char *tag, rw_device_class_t<read16s_delegate, std::remove_reference_t<T> > *obj) +{ return read16s_delegate(func, name, tag, obj); } +template <typename T> +inline read32s_delegate make_delegate(T &&func, const char *name, const char *tag, rw_device_class_t<read32s_delegate, std::remove_reference_t<T> > *obj) +{ return read32s_delegate(func, name, tag, obj); } +template <typename T> +inline read64s_delegate make_delegate(T &&func, const char *name, const char *tag, rw_device_class_t<read64s_delegate, std::remove_reference_t<T> > *obj) +{ return read64s_delegate(func, name, tag, obj); } -template<int Width> struct handler_entry_size {}; -template<> struct handler_entry_size<0> { using uX = u8; using READ = read8_delegate; using WRITE = write8_delegate; }; -template<> struct handler_entry_size<1> { using uX = u16; using READ = read16_delegate; using WRITE = write16_delegate; }; -template<> struct handler_entry_size<2> { using uX = u32; using READ = read32_delegate; using WRITE = write32_delegate; }; -template<> struct handler_entry_size<3> { using uX = u64; using READ = read64_delegate; using WRITE = write64_delegate; }; +template <typename T> +inline write8s_delegate make_delegate(T &&func, const char *name, const char *tag, rw_device_class_t<write8s_delegate, std::remove_reference_t<T> > *obj) +{ return write8s_delegate(func, name, tag, obj); } +template <typename T> +inline write16s_delegate make_delegate(T &&func, const char *name, const char *tag, rw_device_class_t<write16s_delegate, std::remove_reference_t<T> > *obj) +{ return write16s_delegate(func, name, tag, obj); } +template <typename T> +inline write32s_delegate make_delegate(T &&func, const char *name, const char *tag, rw_device_class_t<write32s_delegate, std::remove_reference_t<T> > *obj) +{ return write32s_delegate(func, name, tag, obj); } +template <typename T> +inline write64s_delegate make_delegate(T &&func, const char *name, const char *tag, rw_device_class_t<write64s_delegate, std::remove_reference_t<T> > *obj) +{ return write64s_delegate(func, name, tag, obj); } -// ======================> memopry_units_descritor forwards declaration +template <typename T> +inline read8sm_delegate make_delegate(T &&func, const char *name, const char *tag, rw_device_class_t<read8sm_delegate, std::remove_reference_t<T> > *obj) +{ return read8sm_delegate(func, name, tag, obj); } +template <typename T> +inline read16sm_delegate make_delegate(T &&func, const char *name, const char *tag, rw_device_class_t<read16sm_delegate, std::remove_reference_t<T> > *obj) +{ return read16sm_delegate(func, name, tag, obj); } +template <typename T> +inline read32sm_delegate make_delegate(T &&func, const char *name, const char *tag, rw_device_class_t<read32sm_delegate, std::remove_reference_t<T> > *obj) +{ return read32sm_delegate(func, name, tag, obj); } +template <typename T> +inline read64sm_delegate make_delegate(T &&func, const char *name, const char *tag, rw_device_class_t<read64sm_delegate, std::remove_reference_t<T> > *obj) +{ return read64sm_delegate(func, name, tag, obj); } -template<int Width, int AddrShift, int Endian> class memory_units_descriptor; +template <typename T> +inline write8sm_delegate make_delegate(T &&func, const char *name, const char *tag, rw_device_class_t<write8sm_delegate, std::remove_reference_t<T> > *obj) +{ return write8sm_delegate(func, name, tag, obj); } +template <typename T> +inline write16sm_delegate make_delegate(T &&func, const char *name, const char *tag, rw_device_class_t<write16sm_delegate, std::remove_reference_t<T> > *obj) +{ return write16sm_delegate(func, name, tag, obj); } +template <typename T> +inline write32sm_delegate make_delegate(T &&func, const char *name, const char *tag, rw_device_class_t<write32sm_delegate, std::remove_reference_t<T> > *obj) +{ return write32sm_delegate(func, name, tag, obj); } +template <typename T> +inline write64sm_delegate make_delegate(T &&func, const char *name, const char *tag, rw_device_class_t<write64sm_delegate, std::remove_reference_t<T> > *obj) +{ return write64sm_delegate(func, name, tag, obj); } + + +template <typename T> +inline read8smo_delegate make_delegate(T &&func, const char *name, const char *tag, rw_device_class_t<read8smo_delegate, std::remove_reference_t<T> > *obj) +{ return read8smo_delegate(func, name, tag, obj); } +template <typename T> +inline read16smo_delegate make_delegate(T &&func, const char *name, const char *tag, rw_device_class_t<read16smo_delegate, std::remove_reference_t<T> > *obj) +{ return read16smo_delegate(func, name, tag, obj); } +template <typename T> +inline read32smo_delegate make_delegate(T &&func, const char *name, const char *tag, rw_device_class_t<read32smo_delegate, std::remove_reference_t<T> > *obj) +{ return read32smo_delegate(func, name, tag, obj); } +template <typename T> +inline read64smo_delegate make_delegate(T &&func, const char *name, const char *tag, rw_device_class_t<read64smo_delegate, std::remove_reference_t<T> > *obj) +{ return read64smo_delegate(func, name, tag, obj); } + +template <typename T> +inline write8smo_delegate make_delegate(T &&func, const char *name, const char *tag, rw_device_class_t<write8smo_delegate, std::remove_reference_t<T> > *obj) +{ return write8smo_delegate(func, name, tag, obj); } +template <typename T> +inline write16smo_delegate make_delegate(T &&func, const char *name, const char *tag, rw_device_class_t<write16smo_delegate, std::remove_reference_t<T> > *obj) +{ return write16smo_delegate(func, name, tag, obj); } +template <typename T> +inline write32smo_delegate make_delegate(T &&func, const char *name, const char *tag, rw_device_class_t<write32smo_delegate, std::remove_reference_t<T> > *obj) +{ return write32smo_delegate(func, name, tag, obj); } +template <typename T> +inline write64smo_delegate make_delegate(T &&func, const char *name, const char *tag, rw_device_class_t<write64smo_delegate, std::remove_reference_t<T> > *obj) +{ return write64smo_delegate(func, name, tag, obj); } + + + +template <typename L> +inline std::enable_if_t<std::is_constructible<read8_delegate, L, const char *>::value, read8_delegate> make_lr8_delegate(L l, const char *name) +{ return read8_delegate(l, name); } + +template <typename L> +inline std::enable_if_t<std::is_constructible<read8s_delegate, L, const char *>::value, read8s_delegate> make_lr8_delegate(L l, const char *name) +{ return read8s_delegate(l, name); } + +template <typename L> +inline std::enable_if_t<std::is_constructible<read8sm_delegate, L, const char *>::value, read8sm_delegate> make_lr8_delegate(L l, const char *name) +{ return read8sm_delegate(l, name); } + +template <typename L> +inline std::enable_if_t<std::is_constructible<read8smo_delegate, L, const char *>::value, read8smo_delegate> make_lr8_delegate(L l, const char *name) +{ return read8smo_delegate(l, name); } + +template <typename L> +inline std::enable_if_t<std::is_constructible<read16_delegate, L, const char *>::value, read16_delegate> make_lr16_delegate(L l, const char *name) +{ return read16_delegate(l, name); } + +template <typename L> +inline std::enable_if_t<std::is_constructible<read16s_delegate, L, const char *>::value, read16s_delegate> make_lr16_delegate(L l, const char *name) +{ return read16s_delegate(l, name); } + +template <typename L> +inline std::enable_if_t<std::is_constructible<read16sm_delegate, L, const char *>::value, read16sm_delegate> make_lr16_delegate(L l, const char *name) +{ return read16sm_delegate(l, name); } + +template <typename L> +inline std::enable_if_t<std::is_constructible<read16smo_delegate, L, const char *>::value, read16smo_delegate> make_lr16_delegate(L l, const char *name) +{ return read16smo_delegate(l, name); } + +template <typename L> +inline std::enable_if_t<std::is_constructible<read32_delegate, L, const char *>::value, read32_delegate> make_lr32_delegate(L l, const char *name) +{ return read32_delegate(l, name); } + +template <typename L> +inline std::enable_if_t<std::is_constructible<read32s_delegate, L, const char *>::value, read32s_delegate> make_lr32_delegate(L l, const char *name) +{ return read32s_delegate(l, name); } + +template <typename L> +inline std::enable_if_t<std::is_constructible<read32sm_delegate, L, const char *>::value, read32sm_delegate> make_lr32_delegate(L l, const char *name) +{ return read32sm_delegate(l, name); } + +template <typename L> +inline std::enable_if_t<std::is_constructible<read32smo_delegate, L, const char *>::value, read32smo_delegate> make_lr32_delegate(L l, const char *name) +{ return read32smo_delegate(l, name); } + +template <typename L> +inline std::enable_if_t<std::is_constructible<read64_delegate, L, const char *>::value, read64_delegate> make_lr64_delegate(L l, const char *name) +{ return read64_delegate(l, name); } + +template <typename L> +inline std::enable_if_t<std::is_constructible<read64s_delegate, L, const char *>::value, read64s_delegate> make_lr64_delegate(L l, const char *name) +{ return read64s_delegate(l, name); } + +template <typename L> +inline std::enable_if_t<std::is_constructible<read64sm_delegate, L, const char *>::value, read64sm_delegate> make_lr64_delegate(L l, const char *name) +{ return read64sm_delegate(l, name); } + +template <typename L> +inline std::enable_if_t<std::is_constructible<read64smo_delegate, L, const char *>::value, read64smo_delegate> make_lr64_delegate(L l, const char *name) +{ return read64smo_delegate(l, name); } + + +template <typename L> +inline std::enable_if_t<std::is_constructible<write8_delegate, L, const char *>::value, write8_delegate> make_lw8_delegate(L l, const char *name) +{ return write8_delegate(l, name); } + +template <typename L> +inline std::enable_if_t<std::is_constructible<write8s_delegate, L, const char *>::value, write8s_delegate> make_lw8_delegate(L l, const char *name) +{ return write8s_delegate(l, name); } + +template <typename L> +inline std::enable_if_t<std::is_constructible<write8sm_delegate, L, const char *>::value, write8sm_delegate> make_lw8_delegate(L l, const char *name) +{ return write8sm_delegate(l, name); } + +template <typename L> +inline std::enable_if_t<std::is_constructible<write8smo_delegate, L, const char *>::value, write8smo_delegate> make_lw8_delegate(L l, const char *name) +{ return write8smo_delegate(l, name); } + +template <typename L> +inline std::enable_if_t<std::is_constructible<write16_delegate, L, const char *>::value, write16_delegate> make_lw16_delegate(L l, const char *name) +{ return write16_delegate(l, name); } + +template <typename L> +inline std::enable_if_t<std::is_constructible<write16s_delegate, L, const char *>::value, write16s_delegate> make_lw16_delegate(L l, const char *name) +{ return write16s_delegate(l, name); } + +template <typename L> +inline std::enable_if_t<std::is_constructible<write16sm_delegate, L, const char *>::value, write16sm_delegate> make_lw16_delegate(L l, const char *name) +{ return write16sm_delegate(l, name); } + +template <typename L> +inline std::enable_if_t<std::is_constructible<write16smo_delegate, L, const char *>::value, write16smo_delegate> make_lw16_delegate(L l, const char *name) +{ return write16smo_delegate(l, name); } + +template <typename L> +inline std::enable_if_t<std::is_constructible<write32_delegate, L, const char *>::value, write32_delegate> make_lw32_delegate(L l, const char *name) +{ return write32_delegate(l, name); } + +template <typename L> +inline std::enable_if_t<std::is_constructible<write32s_delegate, L, const char *>::value, write32s_delegate> make_lw32_delegate(L l, const char *name) +{ return write32s_delegate(l, name); } + +template <typename L> +inline std::enable_if_t<std::is_constructible<write32sm_delegate, L, const char *>::value, write32sm_delegate> make_lw32_delegate(L l, const char *name) +{ return write32sm_delegate(l, name); } + +template <typename L> +inline std::enable_if_t<std::is_constructible<write32smo_delegate, L, const char *>::value, write32smo_delegate> make_lw32_delegate(L l, const char *name) +{ return write32smo_delegate(l, name); } + +template <typename L> +inline std::enable_if_t<std::is_constructible<write64_delegate, L, const char *>::value, write64_delegate> make_lw64_delegate(L l, const char *name) +{ return write64_delegate(l, name); } + +template <typename L> +inline std::enable_if_t<std::is_constructible<write64s_delegate, L, const char *>::value, write64s_delegate> make_lw64_delegate(L l, const char *name) +{ return write64s_delegate(l, name); } + +template <typename L> +inline std::enable_if_t<std::is_constructible<write64sm_delegate, L, const char *>::value, write64sm_delegate> make_lw64_delegate(L l, const char *name) +{ return write64sm_delegate(l, name); } + +template <typename L> +inline std::enable_if_t<std::is_constructible<write64smo_delegate, L, const char *>::value, write64smo_delegate> make_lw64_delegate(L l, const char *name) +{ return write64smo_delegate(l, name); } + + + +// =====================-> Width -> types + +template<int Width> struct handler_entry_size {}; +template<> struct handler_entry_size<0> { using uX = u8; }; +template<> struct handler_entry_size<1> { using uX = u16; }; +template<> struct handler_entry_size<2> { using uX = u32; }; +template<> struct handler_entry_size<3> { using uX = u64; }; // =====================-> Address segmentation for the search tree @@ -248,6 +407,14 @@ constexpr int handler_entry_dispatch_lowbits(int highbits, int width, int ashift width + ashift; } +} } // namespace emu::detail + + +// ======================> memory_units_descritor forwards declaration + +template<int Width, int AddrShift, int Endian> class memory_units_descriptor; + + // =====================-> The root class of all handlers @@ -334,7 +501,7 @@ template<int Width, int AddrShift, int Endian> class handler_entry_read_passthro template<int Width, int AddrShift, int Endian> class handler_entry_read : public handler_entry { public: - using uX = typename handler_entry_size<Width>::uX; + using uX = typename emu::detail::handler_entry_size<Width>::uX; struct mapping { handler_entry_read<Width, AddrShift, Endian> *original; @@ -395,7 +562,7 @@ template<int Width, int AddrShift, int Endian> class handler_entry_write_passthr template<int Width, int AddrShift, int Endian> class handler_entry_write : public handler_entry { public: - using uX = typename handler_entry_size<Width>::uX; + using uX = typename emu::detail::handler_entry_size<Width>::uX; struct mapping { handler_entry_write<Width, AddrShift, Endian> *original; @@ -477,10 +644,10 @@ constexpr offs_t memory_offset_to_byte(offs_t offset, int AddrShift) { return Ad // ======================> generic read/write decomposition routines // generic direct read -template<int Width, int AddrShift, int Endian, int TargetWidth, bool Aligned, typename T> typename handler_entry_size<TargetWidth>::uX memory_read_generic(T rop, offs_t address, typename handler_entry_size<TargetWidth>::uX mask) +template<int Width, int AddrShift, int Endian, int TargetWidth, bool Aligned, typename T> typename emu::detail::handler_entry_size<TargetWidth>::uX memory_read_generic(T rop, offs_t address, typename emu::detail::handler_entry_size<TargetWidth>::uX mask) { - using TargetType = typename handler_entry_size<TargetWidth>::uX; - using NativeType = typename handler_entry_size<Width>::uX; + using TargetType = typename emu::detail::handler_entry_size<TargetWidth>::uX; + using NativeType = typename emu::detail::handler_entry_size<Width>::uX; constexpr u32 TARGET_BYTES = 1 << TargetWidth; constexpr u32 TARGET_BITS = 8 * TARGET_BYTES; @@ -611,9 +778,9 @@ template<int Width, int AddrShift, int Endian, int TargetWidth, bool Aligned, ty } // generic direct write -template<int Width, int AddrShift, int Endian, int TargetWidth, bool Aligned, typename T> void memory_write_generic(T wop, offs_t address, typename handler_entry_size<TargetWidth>::uX data, typename handler_entry_size<TargetWidth>::uX mask) +template<int Width, int AddrShift, int Endian, int TargetWidth, bool Aligned, typename T> void memory_write_generic(T wop, offs_t address, typename emu::detail::handler_entry_size<TargetWidth>::uX data, typename emu::detail::handler_entry_size<TargetWidth>::uX mask) { - using NativeType = typename handler_entry_size<Width>::uX; + using NativeType = typename emu::detail::handler_entry_size<Width>::uX; constexpr u32 TARGET_BYTES = 1 << TargetWidth; constexpr u32 TARGET_BITS = 8 * TARGET_BYTES; @@ -740,7 +907,7 @@ template<int Width, int AddrShift, int Endian, int TargetWidth, bool Aligned, ty // memory_access_cache contains state data for cached access template<int Width, int AddrShift, int Endian> class memory_access_cache { - using NativeType = typename handler_entry_size<Width>::uX; + using NativeType = typename emu::detail::handler_entry_size<Width>::uX; static constexpr u32 NATIVE_BYTES = 1 << Width; static constexpr u32 NATIVE_MASK = Width + AddrShift >= 0 ? (1 << (Width + AddrShift)) - 1 : 0; @@ -1073,6 +1240,45 @@ public: void install_write_handler(offs_t addrstart, offs_t addrend, write64_delegate whandler, u64 unitmask = 0, int cswidth = 0) { install_write_handler(addrstart, addrend, 0, 0, 0, whandler, unitmask, cswidth); } void install_readwrite_handler(offs_t addrstart, offs_t addrend, read64_delegate rhandler, write64_delegate whandler, u64 unitmask = 0, int cswidth = 0) { install_readwrite_handler(addrstart, addrend, 0, 0, 0, rhandler, whandler, unitmask, cswidth); } + void install_read_handler(offs_t addrstart, offs_t addrend, read8s_delegate rhandler, u64 unitmask = 0, int cswidth = 0) { install_read_handler(addrstart, addrend, 0, 0, 0, rhandler, unitmask, cswidth); } + void install_write_handler(offs_t addrstart, offs_t addrend, write8s_delegate whandler, u64 unitmask = 0, int cswidth = 0) { install_write_handler(addrstart, addrend, 0, 0, 0, whandler, unitmask, cswidth); } + void install_readwrite_handler(offs_t addrstart, offs_t addrend, read8s_delegate rhandler, write8s_delegate whandler, u64 unitmask = 0, int cswidth = 0) { return install_readwrite_handler(addrstart, addrend, 0, 0, 0, rhandler, whandler, unitmask, cswidth); } + void install_read_handler(offs_t addrstart, offs_t addrend, read16s_delegate rhandler, u64 unitmask = 0, int cswidth = 0) { install_read_handler(addrstart, addrend, 0, 0, 0, rhandler, unitmask, cswidth); } + void install_write_handler(offs_t addrstart, offs_t addrend, write16s_delegate whandler, u64 unitmask = 0, int cswidth = 0) { install_write_handler(addrstart, addrend, 0, 0, 0, whandler, unitmask, cswidth); } + void install_readwrite_handler(offs_t addrstart, offs_t addrend, read16s_delegate rhandler, write16s_delegate whandler, u64 unitmask = 0, int cswidth = 0) { return install_readwrite_handler(addrstart, addrend, 0, 0, 0, rhandler, whandler, unitmask, cswidth); } + void install_read_handler(offs_t addrstart, offs_t addrend, read32s_delegate rhandler, u64 unitmask = 0, int cswidth = 0) { install_read_handler(addrstart, addrend, 0, 0, 0, rhandler, unitmask, cswidth); } + void install_write_handler(offs_t addrstart, offs_t addrend, write32s_delegate whandler, u64 unitmask = 0, int cswidth = 0) { install_write_handler(addrstart, addrend, 0, 0, 0, whandler, unitmask, cswidth); } + void install_readwrite_handler(offs_t addrstart, offs_t addrend, read32s_delegate rhandler, write32s_delegate whandler, u64 unitmask = 0, int cswidth = 0) { return install_readwrite_handler(addrstart, addrend, 0, 0, 0, rhandler, whandler, unitmask, cswidth); } + void install_read_handler(offs_t addrstart, offs_t addrend, read64s_delegate rhandler, u64 unitmask = 0, int cswidth = 0) { install_read_handler(addrstart, addrend, 0, 0, 0, rhandler, unitmask, cswidth); } + void install_write_handler(offs_t addrstart, offs_t addrend, write64s_delegate whandler, u64 unitmask = 0, int cswidth = 0) { install_write_handler(addrstart, addrend, 0, 0, 0, whandler, unitmask, cswidth); } + void install_readwrite_handler(offs_t addrstart, offs_t addrend, read64s_delegate rhandler, write64s_delegate whandler, u64 unitmask = 0, int cswidth = 0) { install_readwrite_handler(addrstart, addrend, 0, 0, 0, rhandler, whandler, unitmask, cswidth); } + + void install_read_handler(offs_t addrstart, offs_t addrend, read8sm_delegate rhandler, u64 unitmask = 0, int cswidth = 0) { install_read_handler(addrstart, addrend, 0, 0, 0, rhandler, unitmask, cswidth); } + void install_write_handler(offs_t addrstart, offs_t addrend, write8sm_delegate whandler, u64 unitmask = 0, int cswidth = 0) { install_write_handler(addrstart, addrend, 0, 0, 0, whandler, unitmask, cswidth); } + void install_readwrite_handler(offs_t addrstart, offs_t addrend, read8sm_delegate rhandler, write8sm_delegate whandler, u64 unitmask = 0, int cswidth = 0) { return install_readwrite_handler(addrstart, addrend, 0, 0, 0, rhandler, whandler, unitmask, cswidth); } + void install_read_handler(offs_t addrstart, offs_t addrend, read16sm_delegate rhandler, u64 unitmask = 0, int cswidth = 0) { install_read_handler(addrstart, addrend, 0, 0, 0, rhandler, unitmask, cswidth); } + void install_write_handler(offs_t addrstart, offs_t addrend, write16sm_delegate whandler, u64 unitmask = 0, int cswidth = 0) { install_write_handler(addrstart, addrend, 0, 0, 0, whandler, unitmask, cswidth); } + void install_readwrite_handler(offs_t addrstart, offs_t addrend, read16sm_delegate rhandler, write16sm_delegate whandler, u64 unitmask = 0, int cswidth = 0) { return install_readwrite_handler(addrstart, addrend, 0, 0, 0, rhandler, whandler, unitmask, cswidth); } + void install_read_handler(offs_t addrstart, offs_t addrend, read32sm_delegate rhandler, u64 unitmask = 0, int cswidth = 0) { install_read_handler(addrstart, addrend, 0, 0, 0, rhandler, unitmask, cswidth); } + void install_write_handler(offs_t addrstart, offs_t addrend, write32sm_delegate whandler, u64 unitmask = 0, int cswidth = 0) { install_write_handler(addrstart, addrend, 0, 0, 0, whandler, unitmask, cswidth); } + void install_readwrite_handler(offs_t addrstart, offs_t addrend, read32sm_delegate rhandler, write32sm_delegate whandler, u64 unitmask = 0, int cswidth = 0) { return install_readwrite_handler(addrstart, addrend, 0, 0, 0, rhandler, whandler, unitmask, cswidth); } + void install_read_handler(offs_t addrstart, offs_t addrend, read64sm_delegate rhandler, u64 unitmask = 0, int cswidth = 0) { install_read_handler(addrstart, addrend, 0, 0, 0, rhandler, unitmask, cswidth); } + void install_write_handler(offs_t addrstart, offs_t addrend, write64sm_delegate whandler, u64 unitmask = 0, int cswidth = 0) { install_write_handler(addrstart, addrend, 0, 0, 0, whandler, unitmask, cswidth); } + void install_readwrite_handler(offs_t addrstart, offs_t addrend, read64sm_delegate rhandler, write64sm_delegate whandler, u64 unitmask = 0, int cswidth = 0) { install_readwrite_handler(addrstart, addrend, 0, 0, 0, rhandler, whandler, unitmask, cswidth); } + + void install_read_handler(offs_t addrstart, offs_t addrend, read8smo_delegate rhandler, u64 unitmask = 0, int cswidth = 0) { install_read_handler(addrstart, addrend, 0, 0, 0, rhandler, unitmask, cswidth); } + void install_write_handler(offs_t addrstart, offs_t addrend, write8smo_delegate whandler, u64 unitmask = 0, int cswidth = 0) { install_write_handler(addrstart, addrend, 0, 0, 0, whandler, unitmask, cswidth); } + void install_readwrite_handler(offs_t addrstart, offs_t addrend, read8smo_delegate rhandler, write8smo_delegate whandler, u64 unitmask = 0, int cswidth = 0) { return install_readwrite_handler(addrstart, addrend, 0, 0, 0, rhandler, whandler, unitmask, cswidth); } + void install_read_handler(offs_t addrstart, offs_t addrend, read16smo_delegate rhandler, u64 unitmask = 0, int cswidth = 0) { install_read_handler(addrstart, addrend, 0, 0, 0, rhandler, unitmask, cswidth); } + void install_write_handler(offs_t addrstart, offs_t addrend, write16smo_delegate whandler, u64 unitmask = 0, int cswidth = 0) { install_write_handler(addrstart, addrend, 0, 0, 0, whandler, unitmask, cswidth); } + void install_readwrite_handler(offs_t addrstart, offs_t addrend, read16smo_delegate rhandler, write16smo_delegate whandler, u64 unitmask = 0, int cswidth = 0) { return install_readwrite_handler(addrstart, addrend, 0, 0, 0, rhandler, whandler, unitmask, cswidth); } + void install_read_handler(offs_t addrstart, offs_t addrend, read32smo_delegate rhandler, u64 unitmask = 0, int cswidth = 0) { install_read_handler(addrstart, addrend, 0, 0, 0, rhandler, unitmask, cswidth); } + void install_write_handler(offs_t addrstart, offs_t addrend, write32smo_delegate whandler, u64 unitmask = 0, int cswidth = 0) { install_write_handler(addrstart, addrend, 0, 0, 0, whandler, unitmask, cswidth); } + void install_readwrite_handler(offs_t addrstart, offs_t addrend, read32smo_delegate rhandler, write32smo_delegate whandler, u64 unitmask = 0, int cswidth = 0) { return install_readwrite_handler(addrstart, addrend, 0, 0, 0, rhandler, whandler, unitmask, cswidth); } + void install_read_handler(offs_t addrstart, offs_t addrend, read64smo_delegate rhandler, u64 unitmask = 0, int cswidth = 0) { install_read_handler(addrstart, addrend, 0, 0, 0, rhandler, unitmask, cswidth); } + void install_write_handler(offs_t addrstart, offs_t addrend, write64smo_delegate whandler, u64 unitmask = 0, int cswidth = 0) { install_write_handler(addrstart, addrend, 0, 0, 0, whandler, unitmask, cswidth); } + void install_readwrite_handler(offs_t addrstart, offs_t addrend, read64smo_delegate rhandler, write64smo_delegate whandler, u64 unitmask = 0, int cswidth = 0) { install_readwrite_handler(addrstart, addrend, 0, 0, 0, rhandler, whandler, unitmask, cswidth); } + // install new-style delegate handlers (with mirror/mask) virtual void install_read_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read8_delegate rhandler, u64 unitmask = 0, int cswidth = 0) = 0; virtual void install_write_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, write8_delegate whandler, u64 unitmask = 0, int cswidth = 0) = 0; @@ -1087,6 +1293,45 @@ public: virtual void install_write_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, write64_delegate whandler, u64 unitmask = 0, int cswidth = 0) = 0; virtual void install_readwrite_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read64_delegate rhandler, write64_delegate whandler, u64 unitmask = 0, int cswidth = 0) = 0; + virtual void install_read_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read8s_delegate rhandler, u64 unitmask = 0, int cswidth = 0) = 0; + virtual void install_write_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, write8s_delegate whandler, u64 unitmask = 0, int cswidth = 0) = 0; + virtual void install_readwrite_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read8s_delegate rhandler, write8s_delegate whandler, u64 unitmask = 0, int cswidth = 0) = 0; + virtual void install_read_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read16s_delegate rhandler, u64 unitmask = 0, int cswidth = 0) = 0; + virtual void install_write_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, write16s_delegate whandler, u64 unitmask = 0, int cswidth = 0) = 0; + virtual void install_readwrite_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read16s_delegate rhandler, write16s_delegate whandler, u64 unitmask = 0, int cswidth = 0) = 0; + virtual void install_read_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read32s_delegate rhandler, u64 unitmask = 0, int cswidth = 0) = 0; + virtual void install_write_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, write32s_delegate whandler, u64 unitmask = 0, int cswidth = 0) = 0; + virtual void install_readwrite_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read32s_delegate rhandler, write32s_delegate whandler, u64 unitmask = 0, int cswidth = 0) = 0; + virtual void install_read_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read64s_delegate rhandler, u64 unitmask = 0, int cswidth = 0) = 0; + virtual void install_write_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, write64s_delegate whandler, u64 unitmask = 0, int cswidth = 0) = 0; + virtual void install_readwrite_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read64s_delegate rhandler, write64s_delegate whandler, u64 unitmask = 0, int cswidth = 0) = 0; + + virtual void install_read_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read8sm_delegate rhandler, u64 unitmask = 0, int cswidth = 0) = 0; + virtual void install_write_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, write8sm_delegate whandler, u64 unitmask = 0, int cswidth = 0) = 0; + virtual void install_readwrite_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read8sm_delegate rhandler, write8sm_delegate whandler, u64 unitmask = 0, int cswidth = 0) = 0; + virtual void install_read_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read16sm_delegate rhandler, u64 unitmask = 0, int cswidth = 0) = 0; + virtual void install_write_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, write16sm_delegate whandler, u64 unitmask = 0, int cswidth = 0) = 0; + virtual void install_readwrite_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read16sm_delegate rhandler, write16sm_delegate whandler, u64 unitmask = 0, int cswidth = 0) = 0; + virtual void install_read_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read32sm_delegate rhandler, u64 unitmask = 0, int cswidth = 0) = 0; + virtual void install_write_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, write32sm_delegate whandler, u64 unitmask = 0, int cswidth = 0) = 0; + virtual void install_readwrite_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read32sm_delegate rhandler, write32sm_delegate whandler, u64 unitmask = 0, int cswidth = 0) = 0; + virtual void install_read_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read64sm_delegate rhandler, u64 unitmask = 0, int cswidth = 0) = 0; + virtual void install_write_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, write64sm_delegate whandler, u64 unitmask = 0, int cswidth = 0) = 0; + virtual void install_readwrite_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read64sm_delegate rhandler, write64sm_delegate whandler, u64 unitmask = 0, int cswidth = 0) = 0; + + virtual void install_read_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read8smo_delegate rhandler, u64 unitmask = 0, int cswidth = 0) = 0; + virtual void install_write_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, write8smo_delegate whandler, u64 unitmask = 0, int cswidth = 0) = 0; + virtual void install_readwrite_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read8smo_delegate rhandler, write8smo_delegate whandler, u64 unitmask = 0, int cswidth = 0) = 0; + virtual void install_read_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read16smo_delegate rhandler, u64 unitmask = 0, int cswidth = 0) = 0; + virtual void install_write_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, write16smo_delegate whandler, u64 unitmask = 0, int cswidth = 0) = 0; + virtual void install_readwrite_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read16smo_delegate rhandler, write16smo_delegate whandler, u64 unitmask = 0, int cswidth = 0) = 0; + virtual void install_read_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read32smo_delegate rhandler, u64 unitmask = 0, int cswidth = 0) = 0; + virtual void install_write_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, write32smo_delegate whandler, u64 unitmask = 0, int cswidth = 0) = 0; + virtual void install_readwrite_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read32smo_delegate rhandler, write32smo_delegate whandler, u64 unitmask = 0, int cswidth = 0) = 0; + virtual void install_read_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read64smo_delegate rhandler, u64 unitmask = 0, int cswidth = 0) = 0; + virtual void install_write_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, write64smo_delegate whandler, u64 unitmask = 0, int cswidth = 0) = 0; + virtual void install_readwrite_handler(offs_t addrstart, offs_t addrend, offs_t addrmask, offs_t addrmirror, offs_t addrselect, read64smo_delegate rhandler, write64smo_delegate whandler, u64 unitmask = 0, int cswidth = 0) = 0; + // setup void prepare_map(); void populate_from_map(address_map *map = nullptr); @@ -1474,13 +1719,13 @@ private: #define QWORD_ALIGNED(a) (((a) & 7) == 0) -template<int Width, int AddrShift, int Endian> typename handler_entry_size<Width>::uX memory_access_cache<Width, AddrShift, Endian>::read_native(offs_t address, typename handler_entry_size<Width>::uX mask) +template<int Width, int AddrShift, int Endian> typename emu::detail::handler_entry_size<Width>::uX memory_access_cache<Width, AddrShift, Endian>::read_native(offs_t address, typename emu::detail::handler_entry_size<Width>::uX mask) { check_address_r(address); return m_cache_r->read(address, mask); } -template<int Width, int AddrShift, int Endian> void memory_access_cache<Width, AddrShift, Endian>::write_native(offs_t address, typename handler_entry_size<Width>::uX data, typename handler_entry_size<Width>::uX mask) +template<int Width, int AddrShift, int Endian> void memory_access_cache<Width, AddrShift, Endian>::write_native(offs_t address, typename emu::detail::handler_entry_size<Width>::uX data, typename emu::detail::handler_entry_size<Width>::uX mask) { check_address_w(address); m_cache_w->write(address, data, mask); diff --git a/src/emu/emumem_hea.h b/src/emu/emumem_hea.h index 7de0d7913a0..e19a04b4613 100644 --- a/src/emu/emumem_hea.h +++ b/src/emu/emumem_hea.h @@ -8,7 +8,7 @@ template<int Width, int AddrShift, int Endian> class handler_entry_read_address : public handler_entry_read<Width, AddrShift, Endian> { public: - using uX = typename handler_entry_size<Width>::uX; + using uX = typename emu::detail::handler_entry_size<Width>::uX; handler_entry_read_address(address_space *space, u32 flags) : handler_entry_read<Width, AddrShift, Endian>(space, flags) {} ~handler_entry_read_address() = default; @@ -25,7 +25,7 @@ protected: template<int Width, int AddrShift, int Endian> class handler_entry_write_address : public handler_entry_write<Width, AddrShift, Endian> { public: - using uX = typename handler_entry_size<Width>::uX; + using uX = typename emu::detail::handler_entry_size<Width>::uX; handler_entry_write_address(address_space *space, u32 flags) : handler_entry_write<Width, AddrShift, Endian>(space, flags) {} ~handler_entry_write_address() = default; diff --git a/src/emu/emumem_hedp.cpp b/src/emu/emumem_hedp.cpp index 330117f2637..c0215493193 100644 --- a/src/emu/emumem_hedp.cpp +++ b/src/emu/emumem_hedp.cpp @@ -5,22 +5,102 @@ #include "emumem_hea.h" #include "emumem_hedp.h" -template<int Width, int AddrShift, int Endian> typename handler_entry_size<Width>::uX handler_entry_read_delegate<Width, AddrShift, Endian>::read(offs_t offset, uX mem_mask) +template<int Width, int AddrShift, int Endian, typename READ> template<typename R> + std::enable_if_t<std::is_same<R, read8_delegate>::value || + std::is_same<R, read16_delegate>::value || + std::is_same<R, read32_delegate>::value || + std::is_same<R, read64_delegate>::value, + typename emu::detail::handler_entry_size<Width>::uX> handler_entry_read_delegate<Width, AddrShift, Endian, READ>::read_impl(offs_t offset, uX mem_mask) { return m_delegate(*inh::m_space, ((offset - inh::m_address_base) & inh::m_address_mask) >> (Width + AddrShift), mem_mask); } -template<int Width, int AddrShift, int Endian> std::string handler_entry_read_delegate<Width, AddrShift, Endian>::name() const +template<int Width, int AddrShift, int Endian, typename READ> template<typename R> + std::enable_if_t<std::is_same<R, read8s_delegate>::value || + std::is_same<R, read16s_delegate>::value || + std::is_same<R, read32s_delegate>::value || + std::is_same<R, read64s_delegate>::value, + typename emu::detail::handler_entry_size<Width>::uX> handler_entry_read_delegate<Width, AddrShift, Endian, READ>::read_impl(offs_t offset, uX mem_mask) +{ + return m_delegate(((offset - inh::m_address_base) & inh::m_address_mask) >> (Width + AddrShift), mem_mask); +} + +template<int Width, int AddrShift, int Endian, typename READ> template<typename R> + std::enable_if_t<std::is_same<R, read8sm_delegate>::value || + std::is_same<R, read16sm_delegate>::value || + std::is_same<R, read32sm_delegate>::value || + std::is_same<R, read64sm_delegate>::value, + typename emu::detail::handler_entry_size<Width>::uX> handler_entry_read_delegate<Width, AddrShift, Endian, READ>::read_impl(offs_t offset, uX mem_mask) +{ + return m_delegate(((offset - inh::m_address_base) & inh::m_address_mask) >> (Width + AddrShift)); +} + +template<int Width, int AddrShift, int Endian, typename READ> template<typename R> + std::enable_if_t<std::is_same<R, read8smo_delegate>::value || + std::is_same<R, read16smo_delegate>::value || + std::is_same<R, read32smo_delegate>::value || + std::is_same<R, read64smo_delegate>::value, + typename emu::detail::handler_entry_size<Width>::uX> handler_entry_read_delegate<Width, AddrShift, Endian, READ>::read_impl(offs_t offset, uX mem_mask) +{ + return m_delegate(); +} + +template<int Width, int AddrShift, int Endian, typename READ> typename emu::detail::handler_entry_size<Width>::uX handler_entry_read_delegate<Width, AddrShift, Endian, READ>::read(offs_t offset, uX mem_mask) +{ + return read_impl<READ>(offset, mem_mask); +} + +template<int Width, int AddrShift, int Endian, typename READ> std::string handler_entry_read_delegate<Width, AddrShift, Endian, READ>::name() const { return m_delegate.name(); } -template<int Width, int AddrShift, int Endian> void handler_entry_write_delegate<Width, AddrShift, Endian>::write(offs_t offset, uX data, uX mem_mask) +template<int Width, int AddrShift, int Endian, typename WRITE> template<typename W> + std::enable_if_t<std::is_same<W, write8_delegate>::value || + std::is_same<W, write16_delegate>::value || + std::is_same<W, write32_delegate>::value || + std::is_same<W, write64_delegate>::value, + void> handler_entry_write_delegate<Width, AddrShift, Endian, WRITE>::write_impl(offs_t offset, uX data, uX mem_mask) { m_delegate(*inh::m_space, ((offset - inh::m_address_base) & inh::m_address_mask) >> (Width + AddrShift), data, mem_mask); } -template<int Width, int AddrShift, int Endian> std::string handler_entry_write_delegate<Width, AddrShift, Endian>::name() const +template<int Width, int AddrShift, int Endian, typename WRITE> template<typename W> + std::enable_if_t<std::is_same<W, write8s_delegate>::value || + std::is_same<W, write16s_delegate>::value || + std::is_same<W, write32s_delegate>::value || + std::is_same<W, write64s_delegate>::value, + void> handler_entry_write_delegate<Width, AddrShift, Endian, WRITE>::write_impl(offs_t offset, uX data, uX mem_mask) +{ + m_delegate(((offset - inh::m_address_base) & inh::m_address_mask) >> (Width + AddrShift), data, mem_mask); +} + +template<int Width, int AddrShift, int Endian, typename WRITE> template<typename W> + std::enable_if_t<std::is_same<W, write8sm_delegate>::value || + std::is_same<W, write16sm_delegate>::value || + std::is_same<W, write32sm_delegate>::value || + std::is_same<W, write64sm_delegate>::value, + void> handler_entry_write_delegate<Width, AddrShift, Endian, WRITE>::write_impl(offs_t offset, uX data, uX mem_mask) +{ + m_delegate(((offset - inh::m_address_base) & inh::m_address_mask) >> (Width + AddrShift), data); +} + +template<int Width, int AddrShift, int Endian, typename WRITE> template<typename W> + std::enable_if_t<std::is_same<W, write8smo_delegate>::value || + std::is_same<W, write16smo_delegate>::value || + std::is_same<W, write32smo_delegate>::value || + std::is_same<W, write64smo_delegate>::value, + void> handler_entry_write_delegate<Width, AddrShift, Endian, WRITE>::write_impl(offs_t offset, uX data, uX mem_mask) +{ + m_delegate(data); +} + +template<int Width, int AddrShift, int Endian, typename WRITE> void handler_entry_write_delegate<Width, AddrShift, Endian, WRITE>::write(offs_t offset, uX data, uX mem_mask) +{ + write_impl<WRITE>(offset, data, mem_mask); +} + +template<int Width, int AddrShift, int Endian, typename WRITE> std::string handler_entry_write_delegate<Width, AddrShift, Endian, WRITE>::name() const { return m_delegate.name(); } @@ -28,7 +108,7 @@ template<int Width, int AddrShift, int Endian> std::string handler_entry_write_d -template<int Width, int AddrShift, int Endian> typename handler_entry_size<Width>::uX handler_entry_read_ioport<Width, AddrShift, Endian>::read(offs_t offset, uX mem_mask) +template<int Width, int AddrShift, int Endian> typename emu::detail::handler_entry_size<Width>::uX handler_entry_read_ioport<Width, AddrShift, Endian>::read(offs_t offset, uX mem_mask) { return m_port->read(); } @@ -50,51 +130,189 @@ template<int Width, int AddrShift, int Endian> std::string handler_entry_write_i -template class handler_entry_read_delegate<0, 0, ENDIANNESS_LITTLE>; -template class handler_entry_read_delegate<0, 0, ENDIANNESS_BIG>; -template class handler_entry_read_delegate<1, 3, ENDIANNESS_LITTLE>; -template class handler_entry_read_delegate<1, 3, ENDIANNESS_BIG>; -template class handler_entry_read_delegate<1, 0, ENDIANNESS_LITTLE>; -template class handler_entry_read_delegate<1, 0, ENDIANNESS_BIG>; -template class handler_entry_read_delegate<1, -1, ENDIANNESS_LITTLE>; -template class handler_entry_read_delegate<1, -1, ENDIANNESS_BIG>; -template class handler_entry_read_delegate<2, 0, ENDIANNESS_LITTLE>; -template class handler_entry_read_delegate<2, 0, ENDIANNESS_BIG>; -template class handler_entry_read_delegate<2, -1, ENDIANNESS_LITTLE>; -template class handler_entry_read_delegate<2, -1, ENDIANNESS_BIG>; -template class handler_entry_read_delegate<2, -2, ENDIANNESS_LITTLE>; -template class handler_entry_read_delegate<2, -2, ENDIANNESS_BIG>; -template class handler_entry_read_delegate<3, 0, ENDIANNESS_LITTLE>; -template class handler_entry_read_delegate<3, 0, ENDIANNESS_BIG>; -template class handler_entry_read_delegate<3, -1, ENDIANNESS_LITTLE>; -template class handler_entry_read_delegate<3, -1, ENDIANNESS_BIG>; -template class handler_entry_read_delegate<3, -2, ENDIANNESS_LITTLE>; -template class handler_entry_read_delegate<3, -2, ENDIANNESS_BIG>; -template class handler_entry_read_delegate<3, -3, ENDIANNESS_LITTLE>; -template class handler_entry_read_delegate<3, -3, ENDIANNESS_BIG>; - -template class handler_entry_write_delegate<0, 0, ENDIANNESS_LITTLE>; -template class handler_entry_write_delegate<0, 0, ENDIANNESS_BIG>; -template class handler_entry_write_delegate<1, 3, ENDIANNESS_LITTLE>; -template class handler_entry_write_delegate<1, 3, ENDIANNESS_BIG>; -template class handler_entry_write_delegate<1, 0, ENDIANNESS_LITTLE>; -template class handler_entry_write_delegate<1, 0, ENDIANNESS_BIG>; -template class handler_entry_write_delegate<1, -1, ENDIANNESS_LITTLE>; -template class handler_entry_write_delegate<1, -1, ENDIANNESS_BIG>; -template class handler_entry_write_delegate<2, 0, ENDIANNESS_LITTLE>; -template class handler_entry_write_delegate<2, 0, ENDIANNESS_BIG>; -template class handler_entry_write_delegate<2, -1, ENDIANNESS_LITTLE>; -template class handler_entry_write_delegate<2, -1, ENDIANNESS_BIG>; -template class handler_entry_write_delegate<2, -2, ENDIANNESS_LITTLE>; -template class handler_entry_write_delegate<2, -2, ENDIANNESS_BIG>; -template class handler_entry_write_delegate<3, 0, ENDIANNESS_LITTLE>; -template class handler_entry_write_delegate<3, 0, ENDIANNESS_BIG>; -template class handler_entry_write_delegate<3, -1, ENDIANNESS_LITTLE>; -template class handler_entry_write_delegate<3, -1, ENDIANNESS_BIG>; -template class handler_entry_write_delegate<3, -2, ENDIANNESS_LITTLE>; -template class handler_entry_write_delegate<3, -2, ENDIANNESS_BIG>; -template class handler_entry_write_delegate<3, -3, ENDIANNESS_LITTLE>; -template class handler_entry_write_delegate<3, -3, ENDIANNESS_BIG>; +template class handler_entry_read_delegate<0, 0, ENDIANNESS_LITTLE, read8_delegate>; +template class handler_entry_read_delegate<0, 0, ENDIANNESS_BIG, read8_delegate>; +template class handler_entry_read_delegate<1, 3, ENDIANNESS_LITTLE, read16_delegate>; +template class handler_entry_read_delegate<1, 3, ENDIANNESS_BIG, read16_delegate>; +template class handler_entry_read_delegate<1, 0, ENDIANNESS_LITTLE, read16_delegate>; +template class handler_entry_read_delegate<1, 0, ENDIANNESS_BIG, read16_delegate>; +template class handler_entry_read_delegate<1, -1, ENDIANNESS_LITTLE, read16_delegate>; +template class handler_entry_read_delegate<1, -1, ENDIANNESS_BIG, read16_delegate>; +template class handler_entry_read_delegate<2, 0, ENDIANNESS_LITTLE, read32_delegate>; +template class handler_entry_read_delegate<2, 0, ENDIANNESS_BIG, read32_delegate>; +template class handler_entry_read_delegate<2, -1, ENDIANNESS_LITTLE, read32_delegate>; +template class handler_entry_read_delegate<2, -1, ENDIANNESS_BIG, read32_delegate>; +template class handler_entry_read_delegate<2, -2, ENDIANNESS_LITTLE, read32_delegate>; +template class handler_entry_read_delegate<2, -2, ENDIANNESS_BIG, read32_delegate>; +template class handler_entry_read_delegate<3, 0, ENDIANNESS_LITTLE, read64_delegate>; +template class handler_entry_read_delegate<3, 0, ENDIANNESS_BIG, read64_delegate>; +template class handler_entry_read_delegate<3, -1, ENDIANNESS_LITTLE, read64_delegate>; +template class handler_entry_read_delegate<3, -1, ENDIANNESS_BIG, read64_delegate>; +template class handler_entry_read_delegate<3, -2, ENDIANNESS_LITTLE, read64_delegate>; +template class handler_entry_read_delegate<3, -2, ENDIANNESS_BIG, read64_delegate>; +template class handler_entry_read_delegate<3, -3, ENDIANNESS_LITTLE, read64_delegate>; +template class handler_entry_read_delegate<3, -3, ENDIANNESS_BIG, read64_delegate>; + +template class handler_entry_read_delegate<0, 0, ENDIANNESS_LITTLE, read8s_delegate>; +template class handler_entry_read_delegate<0, 0, ENDIANNESS_BIG, read8s_delegate>; +template class handler_entry_read_delegate<1, 3, ENDIANNESS_LITTLE, read16s_delegate>; +template class handler_entry_read_delegate<1, 3, ENDIANNESS_BIG, read16s_delegate>; +template class handler_entry_read_delegate<1, 0, ENDIANNESS_LITTLE, read16s_delegate>; +template class handler_entry_read_delegate<1, 0, ENDIANNESS_BIG, read16s_delegate>; +template class handler_entry_read_delegate<1, -1, ENDIANNESS_LITTLE, read16s_delegate>; +template class handler_entry_read_delegate<1, -1, ENDIANNESS_BIG, read16s_delegate>; +template class handler_entry_read_delegate<2, 0, ENDIANNESS_LITTLE, read32s_delegate>; +template class handler_entry_read_delegate<2, 0, ENDIANNESS_BIG, read32s_delegate>; +template class handler_entry_read_delegate<2, -1, ENDIANNESS_LITTLE, read32s_delegate>; +template class handler_entry_read_delegate<2, -1, ENDIANNESS_BIG, read32s_delegate>; +template class handler_entry_read_delegate<2, -2, ENDIANNESS_LITTLE, read32s_delegate>; +template class handler_entry_read_delegate<2, -2, ENDIANNESS_BIG, read32s_delegate>; +template class handler_entry_read_delegate<3, 0, ENDIANNESS_LITTLE, read64s_delegate>; +template class handler_entry_read_delegate<3, 0, ENDIANNESS_BIG, read64s_delegate>; +template class handler_entry_read_delegate<3, -1, ENDIANNESS_LITTLE, read64s_delegate>; +template class handler_entry_read_delegate<3, -1, ENDIANNESS_BIG, read64s_delegate>; +template class handler_entry_read_delegate<3, -2, ENDIANNESS_LITTLE, read64s_delegate>; +template class handler_entry_read_delegate<3, -2, ENDIANNESS_BIG, read64s_delegate>; +template class handler_entry_read_delegate<3, -3, ENDIANNESS_LITTLE, read64s_delegate>; +template class handler_entry_read_delegate<3, -3, ENDIANNESS_BIG, read64s_delegate>; + +template class handler_entry_read_delegate<0, 0, ENDIANNESS_LITTLE, read8sm_delegate>; +template class handler_entry_read_delegate<0, 0, ENDIANNESS_BIG, read8sm_delegate>; +template class handler_entry_read_delegate<1, 3, ENDIANNESS_LITTLE, read16sm_delegate>; +template class handler_entry_read_delegate<1, 3, ENDIANNESS_BIG, read16sm_delegate>; +template class handler_entry_read_delegate<1, 0, ENDIANNESS_LITTLE, read16sm_delegate>; +template class handler_entry_read_delegate<1, 0, ENDIANNESS_BIG, read16sm_delegate>; +template class handler_entry_read_delegate<1, -1, ENDIANNESS_LITTLE, read16sm_delegate>; +template class handler_entry_read_delegate<1, -1, ENDIANNESS_BIG, read16sm_delegate>; +template class handler_entry_read_delegate<2, 0, ENDIANNESS_LITTLE, read32sm_delegate>; +template class handler_entry_read_delegate<2, 0, ENDIANNESS_BIG, read32sm_delegate>; +template class handler_entry_read_delegate<2, -1, ENDIANNESS_LITTLE, read32sm_delegate>; +template class handler_entry_read_delegate<2, -1, ENDIANNESS_BIG, read32sm_delegate>; +template class handler_entry_read_delegate<2, -2, ENDIANNESS_LITTLE, read32sm_delegate>; +template class handler_entry_read_delegate<2, -2, ENDIANNESS_BIG, read32sm_delegate>; +template class handler_entry_read_delegate<3, 0, ENDIANNESS_LITTLE, read64sm_delegate>; +template class handler_entry_read_delegate<3, 0, ENDIANNESS_BIG, read64sm_delegate>; +template class handler_entry_read_delegate<3, -1, ENDIANNESS_LITTLE, read64sm_delegate>; +template class handler_entry_read_delegate<3, -1, ENDIANNESS_BIG, read64sm_delegate>; +template class handler_entry_read_delegate<3, -2, ENDIANNESS_LITTLE, read64sm_delegate>; +template class handler_entry_read_delegate<3, -2, ENDIANNESS_BIG, read64sm_delegate>; +template class handler_entry_read_delegate<3, -3, ENDIANNESS_LITTLE, read64sm_delegate>; +template class handler_entry_read_delegate<3, -3, ENDIANNESS_BIG, read64sm_delegate>; + +template class handler_entry_read_delegate<0, 0, ENDIANNESS_LITTLE, read8smo_delegate>; +template class handler_entry_read_delegate<0, 0, ENDIANNESS_BIG, read8smo_delegate>; +template class handler_entry_read_delegate<1, 3, ENDIANNESS_LITTLE, read16smo_delegate>; +template class handler_entry_read_delegate<1, 3, ENDIANNESS_BIG, read16smo_delegate>; +template class handler_entry_read_delegate<1, 0, ENDIANNESS_LITTLE, read16smo_delegate>; +template class handler_entry_read_delegate<1, 0, ENDIANNESS_BIG, read16smo_delegate>; +template class handler_entry_read_delegate<1, -1, ENDIANNESS_LITTLE, read16smo_delegate>; +template class handler_entry_read_delegate<1, -1, ENDIANNESS_BIG, read16smo_delegate>; +template class handler_entry_read_delegate<2, 0, ENDIANNESS_LITTLE, read32smo_delegate>; +template class handler_entry_read_delegate<2, 0, ENDIANNESS_BIG, read32smo_delegate>; +template class handler_entry_read_delegate<2, -1, ENDIANNESS_LITTLE, read32smo_delegate>; +template class handler_entry_read_delegate<2, -1, ENDIANNESS_BIG, read32smo_delegate>; +template class handler_entry_read_delegate<2, -2, ENDIANNESS_LITTLE, read32smo_delegate>; +template class handler_entry_read_delegate<2, -2, ENDIANNESS_BIG, read32smo_delegate>; +template class handler_entry_read_delegate<3, 0, ENDIANNESS_LITTLE, read64smo_delegate>; +template class handler_entry_read_delegate<3, 0, ENDIANNESS_BIG, read64smo_delegate>; +template class handler_entry_read_delegate<3, -1, ENDIANNESS_LITTLE, read64smo_delegate>; +template class handler_entry_read_delegate<3, -1, ENDIANNESS_BIG, read64smo_delegate>; +template class handler_entry_read_delegate<3, -2, ENDIANNESS_LITTLE, read64smo_delegate>; +template class handler_entry_read_delegate<3, -2, ENDIANNESS_BIG, read64smo_delegate>; +template class handler_entry_read_delegate<3, -3, ENDIANNESS_LITTLE, read64smo_delegate>; +template class handler_entry_read_delegate<3, -3, ENDIANNESS_BIG, read64smo_delegate>; + +template class handler_entry_write_delegate<0, 0, ENDIANNESS_LITTLE, write8_delegate>; +template class handler_entry_write_delegate<0, 0, ENDIANNESS_BIG, write8_delegate>; +template class handler_entry_write_delegate<1, 3, ENDIANNESS_LITTLE, write16_delegate>; +template class handler_entry_write_delegate<1, 3, ENDIANNESS_BIG, write16_delegate>; +template class handler_entry_write_delegate<1, 0, ENDIANNESS_LITTLE, write16_delegate>; +template class handler_entry_write_delegate<1, 0, ENDIANNESS_BIG, write16_delegate>; +template class handler_entry_write_delegate<1, -1, ENDIANNESS_LITTLE, write16_delegate>; +template class handler_entry_write_delegate<1, -1, ENDIANNESS_BIG, write16_delegate>; +template class handler_entry_write_delegate<2, 0, ENDIANNESS_LITTLE, write32_delegate>; +template class handler_entry_write_delegate<2, 0, ENDIANNESS_BIG, write32_delegate>; +template class handler_entry_write_delegate<2, -1, ENDIANNESS_LITTLE, write32_delegate>; +template class handler_entry_write_delegate<2, -1, ENDIANNESS_BIG, write32_delegate>; +template class handler_entry_write_delegate<2, -2, ENDIANNESS_LITTLE, write32_delegate>; +template class handler_entry_write_delegate<2, -2, ENDIANNESS_BIG, write32_delegate>; +template class handler_entry_write_delegate<3, 0, ENDIANNESS_LITTLE, write64_delegate>; +template class handler_entry_write_delegate<3, 0, ENDIANNESS_BIG, write64_delegate>; +template class handler_entry_write_delegate<3, -1, ENDIANNESS_LITTLE, write64_delegate>; +template class handler_entry_write_delegate<3, -1, ENDIANNESS_BIG, write64_delegate>; +template class handler_entry_write_delegate<3, -2, ENDIANNESS_LITTLE, write64_delegate>; +template class handler_entry_write_delegate<3, -2, ENDIANNESS_BIG, write64_delegate>; +template class handler_entry_write_delegate<3, -3, ENDIANNESS_LITTLE, write64_delegate>; +template class handler_entry_write_delegate<3, -3, ENDIANNESS_BIG, write64_delegate>; + +template class handler_entry_write_delegate<0, 0, ENDIANNESS_LITTLE, write8s_delegate>; +template class handler_entry_write_delegate<0, 0, ENDIANNESS_BIG, write8s_delegate>; +template class handler_entry_write_delegate<1, 3, ENDIANNESS_LITTLE, write16s_delegate>; +template class handler_entry_write_delegate<1, 3, ENDIANNESS_BIG, write16s_delegate>; +template class handler_entry_write_delegate<1, 0, ENDIANNESS_LITTLE, write16s_delegate>; +template class handler_entry_write_delegate<1, 0, ENDIANNESS_BIG, write16s_delegate>; +template class handler_entry_write_delegate<1, -1, ENDIANNESS_LITTLE, write16s_delegate>; +template class handler_entry_write_delegate<1, -1, ENDIANNESS_BIG, write16s_delegate>; +template class handler_entry_write_delegate<2, 0, ENDIANNESS_LITTLE, write32s_delegate>; +template class handler_entry_write_delegate<2, 0, ENDIANNESS_BIG, write32s_delegate>; +template class handler_entry_write_delegate<2, -1, ENDIANNESS_LITTLE, write32s_delegate>; +template class handler_entry_write_delegate<2, -1, ENDIANNESS_BIG, write32s_delegate>; +template class handler_entry_write_delegate<2, -2, ENDIANNESS_LITTLE, write32s_delegate>; +template class handler_entry_write_delegate<2, -2, ENDIANNESS_BIG, write32s_delegate>; +template class handler_entry_write_delegate<3, 0, ENDIANNESS_LITTLE, write64s_delegate>; +template class handler_entry_write_delegate<3, 0, ENDIANNESS_BIG, write64s_delegate>; +template class handler_entry_write_delegate<3, -1, ENDIANNESS_LITTLE, write64s_delegate>; +template class handler_entry_write_delegate<3, -1, ENDIANNESS_BIG, write64s_delegate>; +template class handler_entry_write_delegate<3, -2, ENDIANNESS_LITTLE, write64s_delegate>; +template class handler_entry_write_delegate<3, -2, ENDIANNESS_BIG, write64s_delegate>; +template class handler_entry_write_delegate<3, -3, ENDIANNESS_LITTLE, write64s_delegate>; +template class handler_entry_write_delegate<3, -3, ENDIANNESS_BIG, write64s_delegate>; + +template class handler_entry_write_delegate<0, 0, ENDIANNESS_LITTLE, write8sm_delegate>; +template class handler_entry_write_delegate<0, 0, ENDIANNESS_BIG, write8sm_delegate>; +template class handler_entry_write_delegate<1, 3, ENDIANNESS_LITTLE, write16sm_delegate>; +template class handler_entry_write_delegate<1, 3, ENDIANNESS_BIG, write16sm_delegate>; +template class handler_entry_write_delegate<1, 0, ENDIANNESS_LITTLE, write16sm_delegate>; +template class handler_entry_write_delegate<1, 0, ENDIANNESS_BIG, write16sm_delegate>; +template class handler_entry_write_delegate<1, -1, ENDIANNESS_LITTLE, write16sm_delegate>; +template class handler_entry_write_delegate<1, -1, ENDIANNESS_BIG, write16sm_delegate>; +template class handler_entry_write_delegate<2, 0, ENDIANNESS_LITTLE, write32sm_delegate>; +template class handler_entry_write_delegate<2, 0, ENDIANNESS_BIG, write32sm_delegate>; +template class handler_entry_write_delegate<2, -1, ENDIANNESS_LITTLE, write32sm_delegate>; +template class handler_entry_write_delegate<2, -1, ENDIANNESS_BIG, write32sm_delegate>; +template class handler_entry_write_delegate<2, -2, ENDIANNESS_LITTLE, write32sm_delegate>; +template class handler_entry_write_delegate<2, -2, ENDIANNESS_BIG, write32sm_delegate>; +template class handler_entry_write_delegate<3, 0, ENDIANNESS_LITTLE, write64sm_delegate>; +template class handler_entry_write_delegate<3, 0, ENDIANNESS_BIG, write64sm_delegate>; +template class handler_entry_write_delegate<3, -1, ENDIANNESS_LITTLE, write64sm_delegate>; +template class handler_entry_write_delegate<3, -1, ENDIANNESS_BIG, write64sm_delegate>; +template class handler_entry_write_delegate<3, -2, ENDIANNESS_LITTLE, write64sm_delegate>; +template class handler_entry_write_delegate<3, -2, ENDIANNESS_BIG, write64sm_delegate>; +template class handler_entry_write_delegate<3, -3, ENDIANNESS_LITTLE, write64sm_delegate>; +template class handler_entry_write_delegate<3, -3, ENDIANNESS_BIG, write64sm_delegate>; + +template class handler_entry_write_delegate<0, 0, ENDIANNESS_LITTLE, write8smo_delegate>; +template class handler_entry_write_delegate<0, 0, ENDIANNESS_BIG, write8smo_delegate>; +template class handler_entry_write_delegate<1, 3, ENDIANNESS_LITTLE, write16smo_delegate>; +template class handler_entry_write_delegate<1, 3, ENDIANNESS_BIG, write16smo_delegate>; +template class handler_entry_write_delegate<1, 0, ENDIANNESS_LITTLE, write16smo_delegate>; +template class handler_entry_write_delegate<1, 0, ENDIANNESS_BIG, write16smo_delegate>; +template class handler_entry_write_delegate<1, -1, ENDIANNESS_LITTLE, write16smo_delegate>; +template class handler_entry_write_delegate<1, -1, ENDIANNESS_BIG, write16smo_delegate>; +template class handler_entry_write_delegate<2, 0, ENDIANNESS_LITTLE, write32smo_delegate>; +template class handler_entry_write_delegate<2, 0, ENDIANNESS_BIG, write32smo_delegate>; +template class handler_entry_write_delegate<2, -1, ENDIANNESS_LITTLE, write32smo_delegate>; +template class handler_entry_write_delegate<2, -1, ENDIANNESS_BIG, write32smo_delegate>; +template class handler_entry_write_delegate<2, -2, ENDIANNESS_LITTLE, write32smo_delegate>; +template class handler_entry_write_delegate<2, -2, ENDIANNESS_BIG, write32smo_delegate>; +template class handler_entry_write_delegate<3, 0, ENDIANNESS_LITTLE, write64smo_delegate>; +template class handler_entry_write_delegate<3, 0, ENDIANNESS_BIG, write64smo_delegate>; +template class handler_entry_write_delegate<3, -1, ENDIANNESS_LITTLE, write64smo_delegate>; +template class handler_entry_write_delegate<3, -1, ENDIANNESS_BIG, write64smo_delegate>; +template class handler_entry_write_delegate<3, -2, ENDIANNESS_LITTLE, write64smo_delegate>; +template class handler_entry_write_delegate<3, -2, ENDIANNESS_BIG, write64smo_delegate>; +template class handler_entry_write_delegate<3, -3, ENDIANNESS_LITTLE, write64smo_delegate>; +template class handler_entry_write_delegate<3, -3, ENDIANNESS_BIG, write64smo_delegate>; template class handler_entry_read_ioport<0, 0, ENDIANNESS_LITTLE>; diff --git a/src/emu/emumem_hedp.h b/src/emu/emumem_hedp.h index e9539bd21d9..af16088f21e 100644 --- a/src/emu/emumem_hedp.h +++ b/src/emu/emumem_hedp.h @@ -5,11 +5,10 @@ // Executes an access through called a delegate, usually containing a handler or a lambda -template<int Width, int AddrShift, int Endian> class handler_entry_read_delegate : public handler_entry_read_address<Width, AddrShift, Endian> +template<int Width, int AddrShift, int Endian, typename READ> class handler_entry_read_delegate : public handler_entry_read_address<Width, AddrShift, Endian> { public: - using uX = typename handler_entry_size<Width>::uX; - using READ = typename handler_entry_size<Width>::READ; + using uX = typename emu::detail::handler_entry_size<Width>::uX; using inh = handler_entry_read_address<Width, AddrShift, Endian>; handler_entry_read_delegate(address_space *space, READ delegate) : handler_entry_read_address<Width, AddrShift, Endian>(space, 0), m_delegate(delegate) {} @@ -21,13 +20,40 @@ public: private: READ m_delegate; + + template<typename R> + std::enable_if_t<std::is_same<R, read8_delegate>::value || + std::is_same<R, read16_delegate>::value || + std::is_same<R, read32_delegate>::value || + std::is_same<R, read64_delegate>::value, + uX> read_impl(offs_t offset, uX mem_mask); + + template<typename R> + std::enable_if_t<std::is_same<R, read8s_delegate>::value || + std::is_same<R, read16s_delegate>::value || + std::is_same<R, read32s_delegate>::value || + std::is_same<R, read64s_delegate>::value, + uX> read_impl(offs_t offset, uX mem_mask); + + template<typename R> + std::enable_if_t<std::is_same<R, read8sm_delegate>::value || + std::is_same<R, read16sm_delegate>::value || + std::is_same<R, read32sm_delegate>::value || + std::is_same<R, read64sm_delegate>::value, + uX> read_impl(offs_t offset, uX mem_mask); + + template<typename R> + std::enable_if_t<std::is_same<R, read8smo_delegate>::value || + std::is_same<R, read16smo_delegate>::value || + std::is_same<R, read32smo_delegate>::value || + std::is_same<R, read64smo_delegate>::value, + uX> read_impl(offs_t offset, uX mem_mask); }; -template<int Width, int AddrShift, int Endian> class handler_entry_write_delegate : public handler_entry_write_address<Width, AddrShift, Endian> +template<int Width, int AddrShift, int Endian, typename WRITE> class handler_entry_write_delegate : public handler_entry_write_address<Width, AddrShift, Endian> { public: - using uX = typename handler_entry_size<Width>::uX; - using WRITE = typename handler_entry_size<Width>::WRITE; + using uX = typename emu::detail::handler_entry_size<Width>::uX; using inh = handler_entry_write_address<Width, AddrShift, Endian>; handler_entry_write_delegate(address_space *space, WRITE delegate) : handler_entry_write_address<Width, AddrShift, Endian>(space, 0), m_delegate(delegate) {} @@ -39,6 +65,34 @@ public: private: WRITE m_delegate; + + template<typename W> + std::enable_if_t<std::is_same<W, write8_delegate>::value || + std::is_same<W, write16_delegate>::value || + std::is_same<W, write32_delegate>::value || + std::is_same<W, write64_delegate>::value, + void> write_impl(offs_t offset, uX data, uX mem_mask); + + template<typename W> + std::enable_if_t<std::is_same<W, write8s_delegate>::value || + std::is_same<W, write16s_delegate>::value || + std::is_same<W, write32s_delegate>::value || + std::is_same<W, write64s_delegate>::value, + void> write_impl(offs_t offset, uX data, uX mem_mask); + + template<typename W> + std::enable_if_t<std::is_same<W, write8sm_delegate>::value || + std::is_same<W, write16sm_delegate>::value || + std::is_same<W, write32sm_delegate>::value || + std::is_same<W, write64sm_delegate>::value, + void> write_impl(offs_t offset, uX data, uX mem_mask); + + template<typename W> + std::enable_if_t<std::is_same<W, write8smo_delegate>::value || + std::is_same<W, write16smo_delegate>::value || + std::is_same<W, write32smo_delegate>::value || + std::is_same<W, write64smo_delegate>::value, + void> write_impl(offs_t offset, uX data, uX mem_mask); }; @@ -49,7 +103,7 @@ private: template<int Width, int AddrShift, int Endian> class handler_entry_read_ioport : public handler_entry_read<Width, AddrShift, Endian> { public: - using uX = typename handler_entry_size<Width>::uX; + using uX = typename emu::detail::handler_entry_size<Width>::uX; using inh = handler_entry_read<Width, AddrShift, Endian>; handler_entry_read_ioport(address_space *space, ioport_port *port) : handler_entry_read<Width, AddrShift, Endian>(space, 0), m_port(port) {} @@ -66,7 +120,7 @@ private: template<int Width, int AddrShift, int Endian> class handler_entry_write_ioport : public handler_entry_write<Width, AddrShift, Endian> { public: - using uX = typename handler_entry_size<Width>::uX; + using uX = typename emu::detail::handler_entry_size<Width>::uX; using inh = handler_entry_write<Width, AddrShift, Endian>; handler_entry_write_ioport(address_space *space, ioport_port *port) : handler_entry_write<Width, AddrShift, Endian>(space, 0), m_port(port) {} diff --git a/src/emu/emumem_hedr.h b/src/emu/emumem_hedr.h index 87fff01635e..b30dfb95637 100644 --- a/src/emu/emumem_hedr.h +++ b/src/emu/emumem_hedr.h @@ -8,7 +8,7 @@ template<int HighBits, int Width, int AddrShift, int Endian> class handler_entry_read_dispatch : public handler_entry_read<Width, AddrShift, Endian> { public: - using uX = typename handler_entry_size<Width>::uX; + using uX = typename emu::detail::handler_entry_size<Width>::uX; using inh = handler_entry_read<Width, AddrShift, Endian>; using mapping = typename inh::mapping; @@ -36,7 +36,7 @@ public: void enumerate_references(handler_entry::reflist &refs) const override; protected: - static constexpr u32 LowBits = handler_entry_dispatch_lowbits(HighBits, Width, AddrShift); + static constexpr u32 LowBits = emu::detail::handler_entry_dispatch_lowbits(HighBits, Width, AddrShift); static constexpr u32 BITCOUNT = HighBits > LowBits ? HighBits - LowBits : 0; static constexpr u32 COUNT = 1 << BITCOUNT; static constexpr offs_t BITMASK = make_bitmask<offs_t>(BITCOUNT); diff --git a/src/emu/emumem_hedr.ipp b/src/emu/emumem_hedr.ipp index 626f43a6d3f..af259b33b01 100644 --- a/src/emu/emumem_hedr.ipp +++ b/src/emu/emumem_hedr.ipp @@ -47,7 +47,7 @@ template<int HighBits, int Width, int AddrShift, int Endian> void handler_entry_ } -template<int HighBits, int Width, int AddrShift, int Endian> typename handler_entry_size<Width>::uX handler_entry_read_dispatch<HighBits, Width, AddrShift, Endian>::read(offs_t offset, uX mem_mask) +template<int HighBits, int Width, int AddrShift, int Endian> typename emu::detail::handler_entry_size<Width>::uX handler_entry_read_dispatch<HighBits, Width, AddrShift, Endian>::read(offs_t offset, uX mem_mask) { return m_dispatch[(offset >> LowBits) & BITMASK]->read(offset, mem_mask); } diff --git a/src/emu/emumem_hedw.h b/src/emu/emumem_hedw.h index ed51d826f97..72143402c6f 100644 --- a/src/emu/emumem_hedw.h +++ b/src/emu/emumem_hedw.h @@ -8,7 +8,7 @@ template<int HighBits, int Width, int AddrShift, int Endian> class handler_entry_write_dispatch : public handler_entry_write<Width, AddrShift, Endian> { public: - using uX = typename handler_entry_size<Width>::uX; + using uX = typename emu::detail::handler_entry_size<Width>::uX; using inh = handler_entry_write<Width, AddrShift, Endian>; using mapping = typename inh::mapping; @@ -36,7 +36,7 @@ public: void enumerate_references(handler_entry::reflist &refs) const override; protected: - static constexpr u32 LowBits = handler_entry_dispatch_lowbits(HighBits, Width, AddrShift); + static constexpr u32 LowBits = emu::detail::handler_entry_dispatch_lowbits(HighBits, Width, AddrShift); static constexpr u32 BITCOUNT = HighBits > LowBits ? HighBits - LowBits : 0; static constexpr u32 COUNT = 1 << BITCOUNT; static constexpr offs_t BITMASK = make_bitmask<offs_t>(BITCOUNT); diff --git a/src/emu/emumem_hem.cpp b/src/emu/emumem_hem.cpp index 6a897b2c07c..45f83d75d12 100644 --- a/src/emu/emumem_hem.cpp +++ b/src/emu/emumem_hem.cpp @@ -5,7 +5,7 @@ #include "emumem_hea.h" #include "emumem_hem.h" -template<int Width, int AddrShift, int Endian> typename handler_entry_size<Width>::uX handler_entry_read_memory<Width, AddrShift, Endian>::read(offs_t offset, uX mem_mask) +template<int Width, int AddrShift, int Endian> typename emu::detail::handler_entry_size<Width>::uX handler_entry_read_memory<Width, AddrShift, Endian>::read(offs_t offset, uX mem_mask) { return m_base[((offset - inh::m_address_base) & inh::m_address_mask) >> (Width + AddrShift)]; } @@ -51,7 +51,7 @@ template<int Width, int AddrShift, int Endian> std::string handler_entry_write_m -template<int Width, int AddrShift, int Endian> typename handler_entry_size<Width>::uX handler_entry_read_memory_bank<Width, AddrShift, Endian>::read(offs_t offset, uX mem_mask) +template<int Width, int AddrShift, int Endian> typename emu::detail::handler_entry_size<Width>::uX handler_entry_read_memory_bank<Width, AddrShift, Endian>::read(offs_t offset, uX mem_mask) { return static_cast<uX *>(m_bank.base())[((offset - inh::m_address_base) & inh::m_address_mask) >> (Width + AddrShift)]; } diff --git a/src/emu/emumem_hem.h b/src/emu/emumem_hem.h index 554f6957a18..184c752625c 100644 --- a/src/emu/emumem_hem.h +++ b/src/emu/emumem_hem.h @@ -8,7 +8,7 @@ template<int Width, int AddrShift, int Endian> class handler_entry_read_memory : public handler_entry_read_address<Width, AddrShift, Endian> { public: - using uX = typename handler_entry_size<Width>::uX; + using uX = typename emu::detail::handler_entry_size<Width>::uX; using inh = handler_entry_read_address<Width, AddrShift, Endian>; handler_entry_read_memory(address_space *space) : handler_entry_read_address<Width, AddrShift, Endian>(space, 0) {} @@ -28,7 +28,7 @@ private: template<int Width, int AddrShift, int Endian> class handler_entry_write_memory : public handler_entry_write_address<Width, AddrShift, Endian> { public: - using uX = typename handler_entry_size<Width>::uX; + using uX = typename emu::detail::handler_entry_size<Width>::uX; using inh = handler_entry_write_address<Width, AddrShift, Endian>; handler_entry_write_memory(address_space *space) : handler_entry_write_address<Width, AddrShift, Endian>(space, 0) {} @@ -53,7 +53,7 @@ private: template<int Width, int AddrShift, int Endian> class handler_entry_read_memory_bank : public handler_entry_read_address<Width, AddrShift, Endian> { public: - using uX = typename handler_entry_size<Width>::uX; + using uX = typename emu::detail::handler_entry_size<Width>::uX; using inh = handler_entry_read_address<Width, AddrShift, Endian>; handler_entry_read_memory_bank(address_space *space, memory_bank &bank) : handler_entry_read_address<Width, AddrShift, Endian>(space, 0), m_bank(bank) {} @@ -71,7 +71,7 @@ private: template<int Width, int AddrShift, int Endian> class handler_entry_write_memory_bank : public handler_entry_write_address<Width, AddrShift, Endian> { public: - using uX = typename handler_entry_size<Width>::uX; + using uX = typename emu::detail::handler_entry_size<Width>::uX; using inh = handler_entry_write_address<Width, AddrShift, Endian>; handler_entry_write_memory_bank(address_space *space, memory_bank &bank) : handler_entry_write_address<Width, AddrShift, Endian>(space, 0), m_bank(bank) {} diff --git a/src/emu/emumem_hep.h b/src/emu/emumem_hep.h index 11da1dc2bca..0b166d77698 100644 --- a/src/emu/emumem_hep.h +++ b/src/emu/emumem_hep.h @@ -8,7 +8,7 @@ template<int Width, int AddrShift, int Endian> class handler_entry_read_passthrough : public handler_entry_read<Width, AddrShift, Endian> { public: - using uX = typename handler_entry_size<Width>::uX; + using uX = typename emu::detail::handler_entry_size<Width>::uX; handler_entry_read_passthrough(address_space *space, memory_passthrough_handler &mph) : handler_entry_read<Width, AddrShift, Endian>(space, handler_entry::F_PASSTHROUGH), m_mph(mph), m_next(nullptr) {} ~handler_entry_read_passthrough(); @@ -29,7 +29,7 @@ protected: template<int Width, int AddrShift, int Endian> class handler_entry_write_passthrough : public handler_entry_write<Width, AddrShift, Endian> { public: - using uX = typename handler_entry_size<Width>::uX; + using uX = typename emu::detail::handler_entry_size<Width>::uX; handler_entry_write_passthrough(address_space *space, memory_passthrough_handler &mph) : handler_entry_write<Width, AddrShift, Endian>(space, handler_entry::F_PASSTHROUGH), m_mph(mph), m_next(nullptr) {} ~handler_entry_write_passthrough(); diff --git a/src/emu/emumem_het.cpp b/src/emu/emumem_het.cpp index 6870284d61d..5d948eccfeb 100644 --- a/src/emu/emumem_het.cpp +++ b/src/emu/emumem_het.cpp @@ -5,7 +5,7 @@ #include "emumem_hep.h" #include "emumem_het.h" -template<int Width, int AddrShift, int Endian> typename handler_entry_size<Width>::uX handler_entry_read_tap<Width, AddrShift, Endian>::read(offs_t offset, uX mem_mask) +template<int Width, int AddrShift, int Endian> typename emu::detail::handler_entry_size<Width>::uX handler_entry_read_tap<Width, AddrShift, Endian>::read(offs_t offset, uX mem_mask) { uX data = inh::m_next->read(offset, mem_mask); m_tap(offset, data, mem_mask); diff --git a/src/emu/emumem_het.h b/src/emu/emumem_het.h index 785c840d75d..274aa138403 100644 --- a/src/emu/emumem_het.h +++ b/src/emu/emumem_het.h @@ -8,7 +8,7 @@ template<int Width, int AddrShift, int Endian> class handler_entry_read_tap : public handler_entry_read_passthrough<Width, AddrShift, Endian> { public: - using uX = typename handler_entry_size<Width>::uX; + using uX = typename emu::detail::handler_entry_size<Width>::uX; using inh = handler_entry_read_passthrough<Width, AddrShift, Endian>; handler_entry_read_tap(address_space *space, memory_passthrough_handler &mph, std::string name, std::function<void (offs_t offset, uX &data, uX mem_mask)> tap) : handler_entry_read_passthrough<Width, AddrShift, Endian>(space, mph), m_name(name), m_tap(std::move(tap)) {} @@ -30,7 +30,7 @@ protected: template<int Width, int AddrShift, int Endian> class handler_entry_write_tap : public handler_entry_write_passthrough<Width, AddrShift, Endian> { public: - using uX = typename handler_entry_size<Width>::uX; + using uX = typename emu::detail::handler_entry_size<Width>::uX; using inh = handler_entry_write_passthrough<Width, AddrShift, Endian>; handler_entry_write_tap(address_space *space, memory_passthrough_handler &mph, std::string name, std::function<void (offs_t offset, uX &data, uX mem_mask)> tap) : handler_entry_write_passthrough<Width, AddrShift, Endian>(space, mph), m_name(name), m_tap(std::move(tap)) {} diff --git a/src/emu/emumem_heu.cpp b/src/emu/emumem_heu.cpp index d56c62498d8..3806e0916ac 100644 --- a/src/emu/emumem_heu.cpp +++ b/src/emu/emumem_heu.cpp @@ -60,7 +60,7 @@ template<int Width, int AddrShift, int Endian> void handler_entry_read_units<Wid } -template<int Width, int AddrShift, int Endian> typename handler_entry_size<Width>::uX handler_entry_read_units<Width, AddrShift, Endian>::read(offs_t offset, uX mem_mask) +template<int Width, int AddrShift, int Endian> typename emu::detail::handler_entry_size<Width>::uX handler_entry_read_units<Width, AddrShift, Endian>::read(offs_t offset, uX mem_mask) { uX result = m_unmap; for (int index = 0; index < m_subunits; index++) { @@ -94,7 +94,7 @@ template<int Width, int AddrShift, int Endian> typename handler_entry_size<Width return result; } -template<int Width, int AddrShift, int Endian> std::string handler_entry_read_units<Width, AddrShift, Endian>::m2r(typename handler_entry_size<Width>::uX mask) +template<int Width, int AddrShift, int Endian> std::string handler_entry_read_units<Width, AddrShift, Endian>::m2r(typename emu::detail::handler_entry_size<Width>::uX mask) { constexpr u32 mbits = 8*sizeof(uX); u32 start, end; @@ -204,7 +204,7 @@ template<int Width, int AddrShift, int Endian> void handler_entry_write_units<Wi } -template<int Width, int AddrShift, int Endian> std::string handler_entry_write_units<Width, AddrShift, Endian>::m2r(typename handler_entry_size<Width>::uX mask) +template<int Width, int AddrShift, int Endian> std::string handler_entry_write_units<Width, AddrShift, Endian>::m2r(typename emu::detail::handler_entry_size<Width>::uX mask) { constexpr u32 mbits = 8*sizeof(uX); u32 start, end; diff --git a/src/emu/emumem_heu.h b/src/emu/emumem_heu.h index 4b1857f0c6c..dbc0cf064f7 100644 --- a/src/emu/emumem_heu.h +++ b/src/emu/emumem_heu.h @@ -8,8 +8,7 @@ template<int Width, int AddrShift, int Endian> class handler_entry_read_units : public handler_entry_read<Width, AddrShift, Endian> { public: - using uX = typename handler_entry_size<Width>::uX; - using READ = typename handler_entry_size<Width>::READ; + using uX = typename emu::detail::handler_entry_size<Width>::uX; using inh = handler_entry_read<Width, AddrShift, Endian>; handler_entry_read_units(const memory_units_descriptor<Width, AddrShift, Endian> &descriptor, u8 ukey, address_space *space); @@ -50,8 +49,7 @@ private: template<int Width, int AddrShift, int Endian> class handler_entry_write_units : public handler_entry_write<Width, AddrShift, Endian> { public: - using uX = typename handler_entry_size<Width>::uX; - using WRITE = typename handler_entry_size<Width>::WRITE; + using uX = typename emu::detail::handler_entry_size<Width>::uX; using inh = handler_entry_write<Width, AddrShift, Endian>; handler_entry_write_units(const memory_units_descriptor<Width, AddrShift, Endian> &descriptor, u8 ukey, address_space *space); diff --git a/src/emu/emumem_heun.cpp b/src/emu/emumem_heun.cpp index 1ab59b17c2f..e76ddfe7078 100644 --- a/src/emu/emumem_heun.cpp +++ b/src/emu/emumem_heun.cpp @@ -5,7 +5,7 @@ #include "emumem_hea.h" #include "emumem_heun.h" -template<int Width, int AddrShift, int Endian> typename handler_entry_size<Width>::uX handler_entry_read_unmapped<Width, AddrShift, Endian>::read(offs_t offset, uX mem_mask) +template<int Width, int AddrShift, int Endian> typename emu::detail::handler_entry_size<Width>::uX handler_entry_read_unmapped<Width, AddrShift, Endian>::read(offs_t offset, uX mem_mask) { if (inh::m_space->log_unmap() && !inh::m_space->m_manager.machine().side_effects_disabled()) inh::m_space->device().logerror(inh::m_space->is_octal() @@ -43,7 +43,7 @@ template<int Width, int AddrShift, int Endian> std::string handler_entry_write_u -template<int Width, int AddrShift, int Endian> typename handler_entry_size<Width>::uX handler_entry_read_nop<Width, AddrShift, Endian>::read(offs_t offset, uX mem_mask) +template<int Width, int AddrShift, int Endian> typename emu::detail::handler_entry_size<Width>::uX handler_entry_read_nop<Width, AddrShift, Endian>::read(offs_t offset, uX mem_mask) { return inh::m_space->unmap(); } diff --git a/src/emu/emumem_heun.h b/src/emu/emumem_heun.h index 2bc4a02a2dc..02a79d825ab 100644 --- a/src/emu/emumem_heun.h +++ b/src/emu/emumem_heun.h @@ -8,7 +8,7 @@ template<int Width, int AddrShift, int Endian> class handler_entry_read_unmapped : public handler_entry_read<Width, AddrShift, Endian> { public: - using uX = typename handler_entry_size<Width>::uX; + using uX = typename emu::detail::handler_entry_size<Width>::uX; using inh = handler_entry_read<Width, AddrShift, Endian>; handler_entry_read_unmapped(address_space *space) : handler_entry_read<Width, AddrShift, Endian>(space, 0) {} @@ -22,7 +22,7 @@ public: template<int Width, int AddrShift, int Endian> class handler_entry_write_unmapped : public handler_entry_write<Width, AddrShift, Endian> { public: - using uX = typename handler_entry_size<Width>::uX; + using uX = typename emu::detail::handler_entry_size<Width>::uX; using inh = handler_entry_write<Width, AddrShift, Endian>; handler_entry_write_unmapped(address_space *space) : handler_entry_write<Width, AddrShift, Endian>(space, 0) {} @@ -42,7 +42,7 @@ public: template<int Width, int AddrShift, int Endian> class handler_entry_read_nop : public handler_entry_read<Width, AddrShift, Endian> { public: - using uX = typename handler_entry_size<Width>::uX; + using uX = typename emu::detail::handler_entry_size<Width>::uX; using inh = handler_entry_read<Width, AddrShift, Endian>; handler_entry_read_nop(address_space *space) : handler_entry_read<Width, AddrShift, Endian>(space, 0) {} @@ -56,7 +56,7 @@ public: template<int Width, int AddrShift, int Endian> class handler_entry_write_nop : public handler_entry_write<Width, AddrShift, Endian> { public: - using uX = typename handler_entry_size<Width>::uX; + using uX = typename emu::detail::handler_entry_size<Width>::uX; using inh = handler_entry_write<Width, AddrShift, Endian>; handler_entry_write_nop(address_space *space) : handler_entry_write<Width, AddrShift, Endian>(space, 0) {} diff --git a/src/emu/emumem_mud.cpp b/src/emu/emumem_mud.cpp index 98e83c7055f..01e9916b9a0 100644 --- a/src/emu/emumem_mud.cpp +++ b/src/emu/emumem_mud.cpp @@ -35,7 +35,7 @@ template<> u8 mask_to_ukey<u64>(u64 mask) (mask & 0x00000000000000ff ? 0x01 : 0x00); } -template<int Width, int AddrShift, int Endian> memory_units_descriptor<Width, AddrShift, Endian>::memory_units_descriptor(u8 access_width, u8 access_endian, handler_entry *handler, offs_t addrstart, offs_t addrend, offs_t mask, typename handler_entry_size<Width>::uX unitmask, int cswidth) : m_handler(handler), m_access_width(access_width), m_access_endian(access_endian) +template<int Width, int AddrShift, int Endian> memory_units_descriptor<Width, AddrShift, Endian>::memory_units_descriptor(u8 access_width, u8 access_endian, handler_entry *handler, offs_t addrstart, offs_t addrend, offs_t mask, typename emu::detail::handler_entry_size<Width>::uX unitmask, int cswidth) : m_handler(handler), m_access_width(access_width), m_access_endian(access_endian) { constexpr u32 NATIVE_MASK = Width + AddrShift >= 0 ? make_bitmask<u32>(Width + AddrShift) : 0; u32 bits_per_access = 8 << access_width; @@ -82,7 +82,7 @@ template<int Width, int AddrShift, int Endian> memory_units_descriptor<Width, Ad generate(m_keymap[i], umasks[i], cswidth, bits_per_access, base_shift, shift, active_count); } -template<int Width, int AddrShift, int Endian> void memory_units_descriptor<Width, AddrShift, Endian>::generate(u8 ukey, typename handler_entry_size<Width>::uX umask, u32 cswidth, u32 bits_per_access, u8 base_shift, s8 shift, u32 active_count) +template<int Width, int AddrShift, int Endian> void memory_units_descriptor<Width, AddrShift, Endian>::generate(u8 ukey, typename emu::detail::handler_entry_size<Width>::uX umask, u32 cswidth, u32 bits_per_access, u8 base_shift, s8 shift, u32 active_count) { auto &entries = m_entries_for_key[ukey]; diff --git a/src/emu/emumem_mud.h b/src/emu/emumem_mud.h index e1299ed7fcc..eff76575c72 100644 --- a/src/emu/emumem_mud.h +++ b/src/emu/emumem_mud.h @@ -5,7 +5,7 @@ template<int Width, int AddrShift, int Endian> class memory_units_descriptor { public: - using uX = typename handler_entry_size<Width>::uX; + using uX = typename emu::detail::handler_entry_size<Width>::uX; struct entry { uX m_amask; diff --git a/src/emu/emupal.h b/src/emu/emupal.h index 4169dabe858..a9ccdc99565 100644 --- a/src/emu/emupal.h +++ b/src/emu/emupal.h @@ -365,6 +365,16 @@ public: // configuration template <typename Object> void set_init(Object &&init) { m_init = std::forward<Object>(init); } + void set_init(palette_init_delegate callback) { m_init = callback; } + template <class FunctionClass> void set_init(const char *devname, void (FunctionClass::*callback)(palette_device &), const char *name) + { + set_init(palette_init_delegate(callback, name, devname, static_cast<FunctionClass *>(nullptr))); + } + template <class FunctionClass> void set_init(void (FunctionClass::*callback)(palette_device &), const char *name) + { + set_init(palette_init_delegate(callback, name, nullptr, static_cast<FunctionClass *>(nullptr))); + } + void set_format(raw_to_rgb_converter raw_to_rgb) { m_raw_to_rgb = raw_to_rgb; } void set_membits(int membits) { m_membits = membits; m_membits_supplied = true; } void set_endianness(endianness_t endianness) { m_endianness = endianness; m_endianness_supplied = true; } diff --git a/src/emu/render.cpp b/src/emu/render.cpp index a65a47e2cf6..d06c617d0c6 100644 --- a/src/emu/render.cpp +++ b/src/emu/render.cpp @@ -112,8 +112,20 @@ static const render_quad_texuv oriented_texcoords[8] = }; // layer orders -static const int layer_order_standard[] = { ITEM_LAYER_SCREEN, ITEM_LAYER_OVERLAY, ITEM_LAYER_BACKDROP, ITEM_LAYER_BEZEL, ITEM_LAYER_CPANEL, ITEM_LAYER_MARQUEE }; -static const int layer_order_alternate[] = { ITEM_LAYER_BACKDROP, ITEM_LAYER_SCREEN, ITEM_LAYER_OVERLAY, ITEM_LAYER_BEZEL, ITEM_LAYER_CPANEL, ITEM_LAYER_MARQUEE }; +static constexpr std::pair<item_layer, int> layer_order_standard[]{ + { ITEM_LAYER_SCREEN, -1 }, // FIXME: invalid blend mode - we're relying on the goodness of the OSD + { ITEM_LAYER_OVERLAY, BLENDMODE_RGB_MULTIPLY }, + { ITEM_LAYER_BACKDROP, BLENDMODE_ADD }, + { ITEM_LAYER_BEZEL, BLENDMODE_ALPHA }, + { ITEM_LAYER_CPANEL, BLENDMODE_ALPHA }, + { ITEM_LAYER_MARQUEE, BLENDMODE_ALPHA } }; +static constexpr std::pair<item_layer, int> layer_order_alternate[]{ + { ITEM_LAYER_BACKDROP, BLENDMODE_ALPHA }, + { ITEM_LAYER_SCREEN, BLENDMODE_ADD }, + { ITEM_LAYER_OVERLAY, BLENDMODE_RGB_MULTIPLY }, + { ITEM_LAYER_BEZEL, BLENDMODE_ALPHA }, + { ITEM_LAYER_CPANEL, BLENDMODE_ALPHA }, + { ITEM_LAYER_MARQUEE, BLENDMODE_ALPHA } }; @@ -177,24 +189,11 @@ inline item_layer get_layer_and_blendmode(layout_view &view, int index, int &ble // else render: // screens (add) + overlays (RGB multiply) + backdrop (add) + bezels (alpha) + cpanels (alpha) + marquees (alpha) - const int *layer_order = layer_order_standard; - if (view.items(ITEM_LAYER_BACKDROP).size() > 1 && view.items(ITEM_LAYER_OVERLAY).empty()) - layer_order = layer_order_alternate; + std::pair<item_layer, int> const *const layer_order(((view.items(ITEM_LAYER_BACKDROP).size() > 1) && view.items(ITEM_LAYER_OVERLAY).empty()) ? layer_order_alternate : layer_order_standard); - // select the layer - int layer = layer_order[index]; - - // pick a blendmode - if (layer == ITEM_LAYER_SCREEN && layer_order == layer_order_standard) - blendmode = -1; - else if (layer == ITEM_LAYER_SCREEN || (layer == ITEM_LAYER_BACKDROP && layer_order == layer_order_standard)) - blendmode = BLENDMODE_ADD; - else if (layer == ITEM_LAYER_OVERLAY) - blendmode = BLENDMODE_RGB_MULTIPLY; - else - blendmode = BLENDMODE_ALPHA; - - return item_layer(layer); + // select the layer and blend mode + blendmode = layer_order[index].second; + return layer_order[index].first; } //************************************************************************** @@ -457,7 +456,7 @@ void render_texture::get_scaled(u32 dwidth, u32 dheight, render_texinfo &texinfo // add a reference and set up the source bitmap primlist.add_reference(m_bitmap); - texinfo.base = m_bitmap->raw_pixptr(m_sbounds.min_y, m_sbounds.min_x); + texinfo.base = m_bitmap->raw_pixptr(m_sbounds.top(), m_sbounds.left()); texinfo.rowpixels = m_bitmap->rowpixels(); texinfo.width = swidth; texinfo.height = sheight; diff --git a/src/emu/render.h b/src/emu/render.h index 387b4fc141d..d65a1111851 100644 --- a/src/emu/render.h +++ b/src/emu/render.h @@ -49,6 +49,7 @@ #include "screen.h" #include <math.h> +#include <array> #include <map> #include <memory> #include <mutex> @@ -759,14 +760,16 @@ class layout_group public: using environment = emu::render::detail::layout_environment; using group_map = std::unordered_map<std::string, layout_group>; + using transform = std::array<std::array<float, 3>, 3>; layout_group(util::xml::data_node const &groupnode); ~layout_group(); util::xml::data_node const &get_groupnode() const { return m_groupnode; } - render_bounds make_transform(render_bounds const &dest) const; - render_bounds make_transform(render_bounds const &dest, render_bounds const &transform) const; + transform make_transform(int orientation, render_bounds const &dest) const; + transform make_transform(int orientation, transform const &trans) const; + transform make_transform(int orientation, render_bounds const &dest, transform const &trans) const; void set_bounds_unresolved(); void resolve_bounds(environment &env, group_map &groupmap); @@ -818,7 +821,9 @@ public: environment &env, util::xml::data_node const &itemnode, element_map &elemmap, - render_bounds const &transform); + int orientation, + layout_group::transform const &trans, + render_color const &color); ~item(); // getters @@ -886,7 +891,9 @@ private: util::xml::data_node const &parentnode, element_map &elemmap, group_map &groupmap, - render_bounds const &transform, + int orientation, + layout_group::transform const &trans, + render_color const &color, bool root, bool repeat, bool init); diff --git a/src/emu/rendfont.cpp b/src/emu/rendfont.cpp index 5e7f0329fd2..a71a119f75f 100644 --- a/src/emu/rendfont.cpp +++ b/src/emu/rendfont.cpp @@ -524,10 +524,9 @@ inline render_font::glyph &render_font::get_char(char32_t chnum) gl.bmheight = int(glyph_ch.bmheight * scale + 0.5f); gl.bitmap.allocate(gl.bmwidth, gl.bmheight); - rectangle clip; - clip.min_x = clip.min_y = 0; - clip.max_x = glyph_ch.bitmap.width() - 1; - clip.max_y = glyph_ch.bitmap.height() - 1; + rectangle clip( + 0, glyph_ch.bitmap.width() - 1, + 0, glyph_ch.bitmap.height() - 1); render_texture::hq_scale(gl.bitmap, glyph_ch.bitmap, clip, nullptr); /* wrap a texture around the bitmap */ diff --git a/src/emu/rendlay.cpp b/src/emu/rendlay.cpp index 2c4057501d6..b47d643e254 100644 --- a/src/emu/rendlay.cpp +++ b/src/emu/rendlay.cpp @@ -20,6 +20,7 @@ #include <ctype.h> #include <algorithm> +#include <cmath> #include <cstddef> #include <cstdio> #include <cstring> @@ -69,23 +70,26 @@ enum std::locale const f_portable_locale("C"); +constexpr layout_group::transform identity_transform{{ {{ 1.0F, 0.0F, 0.0F }}, {{ 0.0F, 1.0F, 0.0F }}, {{ 0.0F, 0.0F, 1.0F }} }}; + //************************************************************************** // INLINE HELPERS //************************************************************************** -//------------------------------------------------- -// render_bounds_transform - apply translation/ -// scaling -//------------------------------------------------- +inline void render_bounds_transform(render_bounds &bounds, layout_group::transform const &trans) +{ + bounds = render_bounds{ + (bounds.x0 * trans[0][0]) + (bounds.y0 * trans[0][1]) + trans[0][2], + (bounds.x0 * trans[1][0]) + (bounds.y0 * trans[1][1]) + trans[1][2], + (bounds.x1 * trans[0][0]) + (bounds.y1 * trans[0][1]) + trans[0][2], + (bounds.x1 * trans[1][0]) + (bounds.y1 * trans[1][1]) + trans[1][2] }; +} -inline void render_bounds_transform(render_bounds &bounds, render_bounds const &transform) +constexpr render_color render_color_multiply(render_color const &x, render_color const &y) { - bounds.x0 = (bounds.x0 * transform.x1) + transform.x0; - bounds.y0 = (bounds.y0 * transform.y1) + transform.y0; - bounds.x1 = (bounds.x1 * transform.x1) + transform.x0; - bounds.y1 = (bounds.y1 * transform.y1) + transform.y0; + return render_color{ x.a * y.a, x.r * y.r, x.g * y.g, x.b * y.b }; } @@ -129,7 +133,7 @@ private: , m_int_increment(i) , m_shift(s) , m_text_valid(true) - , m_incrementing(true) + , m_generator(true) { } entry(std::string &&name, std::string &&t, double i, int s) : m_name(std::move(name)) @@ -137,7 +141,7 @@ private: , m_float_increment(i) , m_shift(s) , m_text_valid(true) - , m_incrementing(true) + , m_generator(true) { } entry(entry &&) = default; entry &operator=(entry &&) = default; @@ -165,7 +169,7 @@ private: } std::string const &name() const { return m_name; } - bool is_incrementing() const { return m_incrementing; } + bool is_generator() const { return m_generator; } std::string const &get_text() { @@ -187,7 +191,7 @@ private: void increment() { - if (is_incrementing()) + if (is_generator()) { // apply increment if (m_float_increment) @@ -342,7 +346,7 @@ private: bool m_text_valid = false; bool m_int_valid = false; bool m_float_valid = false; - bool m_incrementing = false; + bool m_generator = false; }; using entry_vector = std::vector<entry>; @@ -631,7 +635,7 @@ public: throw layout_syntax_error("increment attribute must be a number"); } - // don't allow incrementing parameters to be redefined + // don't allow generator parameters to be redefined if (init) { entry_vector::iterator const pos( @@ -641,7 +645,7 @@ public: name, [] (entry const &lhs, auto const &rhs) { return lhs.name() < rhs; })); if ((m_entries.end() != pos) && (pos->name() == name)) - throw layout_syntax_error("incrementing parameters must be defined exactly once per scope"); + throw layout_syntax_error("generator parameters must be defined exactly once per scope"); std::pair<char const *, char const *> const expanded(expand(start)); if (floatincrement) @@ -668,8 +672,8 @@ public: [] (entry const &lhs, auto const &rhs) { return lhs.name() < rhs; })); if ((m_entries.end() == pos) || (pos->name() != name)) m_entries.emplace(pos, std::move(name), std::string(expanded.first, expanded.second)); - else if (pos->is_incrementing()) - throw layout_syntax_error("incrementing parameters must be defined exactly once per scope"); + else if (pos->is_generator()) + throw layout_syntax_error("generator parameters must be defined exactly once per scope"); else pos->set(std::string(expanded.first, expanded.second)); } @@ -677,8 +681,18 @@ public: void increment_parameters() { - for (entry &e : m_entries) - e.increment(); + m_entries.erase( + std::remove_if( + m_entries.begin(), + m_entries.end(), + [] (entry &e) + { + if (!e.is_generator()) + return true; + e.increment(); + return false; + }), + m_entries.end()); } char const *get_attribute_string(util::xml::data_node const &node, char const *name, char const *defvalue) @@ -778,53 +792,50 @@ public: } } - void parse_color(util::xml::data_node const *node, render_color &result) + render_color parse_color(util::xml::data_node const *node) { - // default to white + // default to opaque white if (!node) - { - result.r = result.g = result.b = result.a = 1.0F; - } - else - { - // parse attributes - result.r = get_attribute_float(*node, "red", 1.0F); - result.g = get_attribute_float(*node, "green", 1.0F); - result.b = get_attribute_float(*node, "blue", 1.0F); - result.a = get_attribute_float(*node, "alpha", 1.0F); + return render_color{ 1.0F, 1.0F, 1.0F, 1.0F }; - // check for errors - if ((0.0F > (std::min)({ result.r, result.g, result.b, result.a })) || (1.0F < (std::max)({ result.r, result.g, result.b, result.a }))) - throw layout_syntax_error(util::string_format("illegal RGBA color %f,%f,%f,%f", result.r, result.g, result.b, result.a)); - } + // parse attributes + render_color const result{ + get_attribute_float(*node, "alpha", 1.0F), + get_attribute_float(*node, "red", 1.0F), + get_attribute_float(*node, "green", 1.0F), + get_attribute_float(*node, "blue", 1.0F) }; + + // check for errors + if ((0.0F > (std::min)({ result.r, result.g, result.b, result.a })) || (1.0F < (std::max)({ result.r, result.g, result.b, result.a }))) + throw layout_syntax_error(util::string_format("illegal RGBA color %f,%f,%f,%f", result.r, result.g, result.b, result.a)); + + return result; } - void parse_orientation(util::xml::data_node const *node, int &result) + int parse_orientation(util::xml::data_node const *node) { // default to no transform if (!node) - { - result = ROT0; - } - else - { - // parse attributes - int const rotate(get_attribute_int(*node, "rotate", 0)); - switch (rotate) - { - case 0: result = ROT0; break; - case 90: result = ROT90; break; - case 180: result = ROT180; break; - case 270: result = ROT270; break; - default: throw layout_syntax_error(util::string_format("invalid rotate attribute %d", rotate)); - } - if (!std::strcmp("yes", get_attribute_string(*node, "swapxy", "no"))) - result ^= ORIENTATION_SWAP_XY; - if (!std::strcmp("yes", get_attribute_string(*node, "flipx", "no"))) - result ^= ORIENTATION_FLIP_X; - if (!std::strcmp("yes", get_attribute_string(*node, "flipy", "no"))) - result ^= ORIENTATION_FLIP_Y; - } + return ROT0; + + // parse attributes + int result; + int const rotate(get_attribute_int(*node, "rotate", 0)); + switch (rotate) + { + case 0: result = ROT0; break; + case 90: result = ROT90; break; + case 180: result = ROT180; break; + case 270: result = ROT270; break; + default: throw layout_syntax_error(util::string_format("invalid rotate attribute %d", rotate)); + } + if (!std::strcmp("yes", get_attribute_string(*node, "swapxy", "no"))) + result ^= ORIENTATION_SWAP_XY; + if (!std::strcmp("yes", get_attribute_string(*node, "flipx", "no"))) + result ^= ORIENTATION_FLIP_X; + if (!std::strcmp("yes", get_attribute_string(*node, "flipy", "no"))) + result ^= ORIENTATION_FLIP_Y; + return result; } }; @@ -955,25 +966,65 @@ layout_group::~layout_group() // matrix for given destination bounds //------------------------------------------------- -render_bounds layout_group::make_transform(render_bounds const &dest) const +layout_group::transform layout_group::make_transform(int orientation, render_bounds const &dest) const +{ + assert(m_bounds_resolved); + + // make orientation matrix + transform result{{ {{ 1.0F, 0.0F, 0.0F }}, {{ 0.0F, 1.0F, 0.0F }}, {{ 0.0F, 0.0F, 1.0F }} }}; + if (orientation & ORIENTATION_SWAP_XY) + { + std::swap(result[0][0], result[0][1]); + std::swap(result[1][0], result[1][1]); + } + if (orientation & ORIENTATION_FLIP_X) + { + result[0][0] = -result[0][0]; + result[0][1] = -result[0][1]; + } + if (orientation & ORIENTATION_FLIP_Y) + { + result[1][0] = -result[1][0]; + result[1][1] = -result[1][1]; + } + + // apply to bounds and force into destination rectangle + render_bounds bounds(m_bounds); + render_bounds_transform(bounds, result); + result[0][0] *= (dest.x1 - dest.x0) / std::fabs(bounds.x1 - bounds.x0); + result[0][1] *= (dest.x1 - dest.x0) / std::fabs(bounds.x1 - bounds.x0); + result[0][2] = dest.x0 - ((std::min)(bounds.x0, bounds.x1) * (dest.x1 - dest.x0) / std::fabs(bounds.x1 - bounds.x0)); + result[1][0] *= (dest.y1 - dest.y0) / std::fabs(bounds.y1 - bounds.y0); + result[1][1] *= (dest.y1 - dest.y0) / std::fabs(bounds.y1 - bounds.y0); + result[1][2] = dest.y0 - ((std::min)(bounds.y0, bounds.y1) * (dest.y1 - dest.y0) / std::fabs(bounds.y1 - bounds.y0)); + return result; +} + +layout_group::transform layout_group::make_transform(int orientation, transform const &trans) const { assert(m_bounds_resolved); - return render_bounds{ - dest.x0 - (m_bounds.x0 * (dest.x1 - dest.x0) / (m_bounds.x1 - m_bounds.x0)), - dest.y0 - (m_bounds.y0 * (dest.y1 - dest.y0) / (m_bounds.y1 - m_bounds.y0)), - (dest.x1 - dest.x0) / (m_bounds.x1 - m_bounds.x0), - (dest.y1 - dest.y0) / (m_bounds.y1 - m_bounds.y0) }; + render_bounds const dest{ + m_bounds.x0, + m_bounds.y0, + (orientation & ORIENTATION_SWAP_XY) ? (m_bounds.x0 + m_bounds.y1 - m_bounds.y0) : m_bounds.x1, + (orientation & ORIENTATION_SWAP_XY) ? (m_bounds.y0 + m_bounds.x1 - m_bounds.x0) : m_bounds.y1 }; + return make_transform(orientation, dest, trans); } -render_bounds layout_group::make_transform(render_bounds const &dest, render_bounds const &transform) const +layout_group::transform layout_group::make_transform(int orientation, render_bounds const &dest, transform const &trans) const { - render_bounds const next(make_transform(dest)); - return render_bounds{ - (transform.x0 * next.x1) + next.x0, - (transform.y0 * next.y1) + next.y0, - transform.x1 * next.x1, - transform.y1 * next.y1 }; + transform const next(make_transform(orientation, dest)); + transform result{{ {{ 0.0F, 0.0F, 0.0F }}, {{ 0.0F, 0.0F, 0.0F }}, {{ 0.0F, 0.0F, 0.0F }} }}; + for (unsigned y = 0; 3U > y; ++y) + { + for (unsigned x = 0; 3U > x; ++x) + { + for (unsigned i = 0; 3U > i; ++i) + result[y][x] += trans[y][i] * next[i][x]; + } + } + return result; } @@ -1003,8 +1054,8 @@ void layout_group::resolve_bounds(environment &env, group_map &groupmap, std::ve // a wild loop appears! std::ostringstream path; for (layout_group const *const group : seen) - path << ' ' << group->m_groupnode.get_name(); - path << ' ' << m_groupnode.get_name(); + path << ' ' << group->m_groupnode.get_attribute_string("name", nullptr); + path << ' ' << m_groupnode.get_attribute_string("name", nullptr); throw layout_syntax_error(util::string_format("recursively nested groups %s", path.str())); } @@ -1014,6 +1065,7 @@ void layout_group::resolve_bounds(environment &env, group_map &groupmap, std::ve environment local(env); resolve_bounds(local, m_groupnode, groupmap, seen, false, true); } + seen.pop_back(); } void layout_group::resolve_bounds( @@ -1061,17 +1113,33 @@ void layout_group::resolve_bounds( } else if (!strcmp(itemnode->get_name(), "group")) { - char const *ref(env.get_attribute_string(*itemnode, "ref", nullptr)); - if (!ref) - throw layout_syntax_error("nested group must have ref attribute"); - - group_map::iterator const found(groupmap.find(ref)); - if (groupmap.end() == found) - throw layout_syntax_error(util::string_format("unable to find group %s", ref)); - - environment local(env); - found->second.resolve_bounds(local, groupmap, seen); - union_render_bounds(m_bounds, found->second.m_bounds); + util::xml::data_node const *const itemboundsnode(itemnode->get_child("bounds")); + if (itemboundsnode) + { + render_bounds itembounds; + env.parse_bounds(itemboundsnode, itembounds); + union_render_bounds(m_bounds, itembounds); + } + else + { + char const *ref(env.get_attribute_string(*itemnode, "ref", nullptr)); + if (!ref) + throw layout_syntax_error("nested group must have ref attribute"); + + group_map::iterator const found(groupmap.find(ref)); + if (groupmap.end() == found) + throw layout_syntax_error(util::string_format("unable to find group %s", ref)); + + int const orientation(env.parse_orientation(itemnode->get_child("orientation"))); + environment local(env); + found->second.resolve_bounds(local, groupmap, seen); + render_bounds const itembounds{ + found->second.m_bounds.x0, + found->second.m_bounds.y0, + (orientation & ORIENTATION_SWAP_XY) ? (found->second.m_bounds.x0 + found->second.m_bounds.y1 - found->second.m_bounds.y0) : found->second.m_bounds.x1, + (orientation & ORIENTATION_SWAP_XY) ? (found->second.m_bounds.y0 + found->second.m_bounds.x1 - found->second.m_bounds.x0) : found->second.m_bounds.y1 }; + union_render_bounds(m_bounds, itembounds); + } } else if (!strcmp(itemnode->get_name(), "repeat")) { @@ -1139,11 +1207,11 @@ void layout_element::element_scale(bitmap_argb32 &dest, bitmap_argb32 &source, c if (curcomp->state() == -1 || curcomp->state() == elemtex->m_state) { // get the local scaled bounds - rectangle bounds; - bounds.min_x = render_round_nearest(curcomp->bounds().x0 * dest.width()); - bounds.min_y = render_round_nearest(curcomp->bounds().y0 * dest.height()); - bounds.max_x = render_round_nearest(curcomp->bounds().x1 * dest.width()); - bounds.max_y = render_round_nearest(curcomp->bounds().y1 * dest.height()); + rectangle bounds( + render_round_nearest(curcomp->bounds().x0 * dest.width()), + render_round_nearest(curcomp->bounds().x1 * dest.width()), + render_round_nearest(curcomp->bounds().y0 * dest.height()), + render_round_nearest(curcomp->bounds().y1 * dest.height())); bounds &= dest.cliprect(); // based on the component type, add to the texture @@ -1188,24 +1256,24 @@ private: ru_imgformat const format = render_detect_image(*m_file, m_dirname.c_str(), m_imagefile.c_str()); switch (format) { - case RENDUTIL_IMGFORMAT_ERROR: - break; - - case RENDUTIL_IMGFORMAT_PNG: - // load the basic bitmap - m_hasalpha = render_load_png(m_bitmap, *m_file, m_dirname.c_str(), m_imagefile.c_str()); + case RENDUTIL_IMGFORMAT_ERROR: + break; - // load the alpha bitmap if specified - if (m_bitmap.valid() && !m_alphafile.empty()) - render_load_png(m_bitmap, *m_file, m_dirname.c_str(), m_alphafile.c_str(), true); - break; + case RENDUTIL_IMGFORMAT_PNG: + // load the basic bitmap + m_hasalpha = render_load_png(m_bitmap, *m_file, m_dirname.c_str(), m_imagefile.c_str()); + break; - default: - // try JPG - render_load_jpeg(m_bitmap, *m_file, m_dirname.c_str(), m_imagefile.c_str()); - break; + default: + // try JPG + render_load_jpeg(m_bitmap, *m_file, m_dirname.c_str(), m_imagefile.c_str()); + break; } + // load the alpha bitmap if specified + if (m_bitmap.valid() && !m_alphafile.empty()) + render_load_png(m_bitmap, *m_file, m_dirname.c_str(), m_alphafile.c_str(), true); + // if we can't load the bitmap, allocate a dummy one and report an error if (!m_bitmap.valid()) { @@ -1255,9 +1323,9 @@ protected: u32 const inva = (1.0f - color().a) * 255.0f; // iterate over X and Y - for (u32 y = bounds.min_y; y <= bounds.max_y; y++) + for (u32 y = bounds.top(); y <= bounds.bottom(); y++) { - for (u32 x = bounds.min_x; x <= bounds.max_x; x++) + for (u32 x = bounds.left(); x <= bounds.right(); x++) { u32 finalr = r; u32 finalg = g; @@ -1308,7 +1376,7 @@ protected: float const ooyradius2 = 1.0f / (yradius * yradius); // iterate over y - for (u32 y = bounds.min_y; y <= bounds.max_y; y++) + for (u32 y = bounds.top(); y <= bounds.bottom(); y++) { float ycoord = ycenter - ((float)y + 0.5f); float xval = xradius * sqrtf(1.0f - (ycoord * ycoord) * ooyradius2); @@ -1399,31 +1467,31 @@ protected: tempbitmap.fill(rgb_t(0xff,0x00,0x00,0x00)); // top bar - draw_segment_horizontal(tempbitmap, 0 + 2*segwidth/3, bmwidth - 2*segwidth/3, 0 + segwidth/2, segwidth, (state & (1 << 0)) ? onpen : offpen); + draw_segment_horizontal(tempbitmap, 0 + 2*segwidth/3, bmwidth - 2*segwidth/3, 0 + segwidth/2, segwidth, BIT(state, 0) ? onpen : offpen); // top-right bar - draw_segment_vertical(tempbitmap, 0 + 2*segwidth/3, bmheight/2 - segwidth/3, bmwidth - segwidth/2, segwidth, (state & (1 << 1)) ? onpen : offpen); + draw_segment_vertical(tempbitmap, 0 + 2*segwidth/3, bmheight/2 - segwidth/3, bmwidth - segwidth/2, segwidth, BIT(state, 1) ? onpen : offpen); // bottom-right bar - draw_segment_vertical(tempbitmap, bmheight/2 + segwidth/3, bmheight - 2*segwidth/3, bmwidth - segwidth/2, segwidth, (state & (1 << 2)) ? onpen : offpen); + draw_segment_vertical(tempbitmap, bmheight/2 + segwidth/3, bmheight - 2*segwidth/3, bmwidth - segwidth/2, segwidth, BIT(state, 2) ? onpen : offpen); // bottom bar - draw_segment_horizontal(tempbitmap, 0 + 2*segwidth/3, bmwidth - 2*segwidth/3, bmheight - segwidth/2, segwidth, (state & (1 << 3)) ? onpen : offpen); + draw_segment_horizontal(tempbitmap, 0 + 2*segwidth/3, bmwidth - 2*segwidth/3, bmheight - segwidth/2, segwidth, BIT(state, 3) ? onpen : offpen); // bottom-left bar - draw_segment_vertical(tempbitmap, bmheight/2 + segwidth/3, bmheight - 2*segwidth/3, 0 + segwidth/2, segwidth, (state & (1 << 4)) ? onpen : offpen); + draw_segment_vertical(tempbitmap, bmheight/2 + segwidth/3, bmheight - 2*segwidth/3, 0 + segwidth/2, segwidth, BIT(state, 4) ? onpen : offpen); // top-left bar - draw_segment_vertical(tempbitmap, 0 + 2*segwidth/3, bmheight/2 - segwidth/3, 0 + segwidth/2, segwidth, (state & (1 << 5)) ? onpen : offpen); + draw_segment_vertical(tempbitmap, 0 + 2*segwidth/3, bmheight/2 - segwidth/3, 0 + segwidth/2, segwidth, BIT(state, 5) ? onpen : offpen); // middle bar - draw_segment_horizontal(tempbitmap, 0 + 2*segwidth/3, bmwidth - 2*segwidth/3, bmheight/2, segwidth, (state & (1 << 6)) ? onpen : offpen); + draw_segment_horizontal(tempbitmap, 0 + 2*segwidth/3, bmwidth - 2*segwidth/3, bmheight/2, segwidth, BIT(state, 6) ? onpen : offpen); // apply skew apply_skew(tempbitmap, 40); // decimal point - draw_segment_decimal(tempbitmap, bmwidth + segwidth/2, bmheight - segwidth/2, segwidth, (state & (1 << 7)) ? onpen : offpen); + draw_segment_decimal(tempbitmap, bmwidth + segwidth/2, bmheight - segwidth/2, segwidth, BIT(state, 7) ? onpen : offpen); // resample to the target size render_resample_argb_bitmap_hq(dest, tempbitmap, color()); @@ -2014,7 +2082,7 @@ protected: tempbitmap.fill(rgb_t(0xff, 0x00, 0x00, 0x00)); for (int i = 0; i < m_dots; i++) - draw_segment_decimal(tempbitmap, ((dotwidth/2 )+ (i * dotwidth)), bmheight/2, dotwidth, (state & (1 << i))?onpen:offpen); + draw_segment_decimal(tempbitmap, ((dotwidth / 2) + (i * dotwidth)), bmheight / 2, dotwidth, BIT(state, i) ? onpen : offpen); // resample to the target size render_resample_argb_bitmap_hq(dest, tempbitmap, color()); @@ -2155,25 +2223,25 @@ protected: { int basey; - if (m_reelreversed==1) + if (m_reelreversed) { - basey = bounds.min_y + ((use_state)*(ourheight/num_shown)/(max_state_used/m_numstops)) + curry; + basey = bounds.top() + ((use_state)*(ourheight/num_shown)/(max_state_used/m_numstops)) + curry; } else { - basey = bounds.min_y - ((use_state)*(ourheight/num_shown)/(max_state_used/m_numstops)) + curry; + basey = bounds.top() - ((use_state)*(ourheight/num_shown)/(max_state_used/m_numstops)) + curry; } // wrap around... - if (basey < bounds.min_y) + if (basey < bounds.top()) basey += ((max_state_used)*(ourheight/num_shown)/(max_state_used/m_numstops)); - if (basey > bounds.max_y) + if (basey > bounds.bottom()) basey -= ((max_state_used)*(ourheight/num_shown)/(max_state_used/m_numstops)); int endpos = basey+ourheight/num_shown; // only render the symbol / text if it's atually in view because the code is SLOW - if ((endpos >= bounds.min_y) && (basey <= bounds.max_y)) + if ((endpos >= bounds.top()) && (basey <= bounds.bottom())) { while (1) { @@ -2184,7 +2252,7 @@ protected: } s32 curx; - curx = bounds.min_x + (bounds.width() - width) / 2; + curx = bounds.left() + (bounds.width() - width) / 2; if (m_file[fruit]) if (!m_bitmap[fruit].valid()) @@ -2202,14 +2270,14 @@ protected: { int effy = basey + y; - if (effy >= bounds.min_y && effy <= bounds.max_y) + if (effy >= bounds.top() && effy <= bounds.bottom()) { u32 *src = &tempbitmap2.pix32(y); u32 *d = &dest.pix32(effy); for (int x = 0; x < dest.width(); x++) { int effx = x; - if (effx >= bounds.min_x && effx <= bounds.max_x) + if (effx >= bounds.left() && effx <= bounds.right()) { u32 spix = rgb_t(src[x]).a(); if (spix != 0) @@ -2249,14 +2317,14 @@ protected: { int effy = basey + y; - if (effy >= bounds.min_y && effy <= bounds.max_y) + if (effy >= bounds.top() && effy <= bounds.bottom()) { u32 *src = &tempbitmap.pix32(y); u32 *d = &dest.pix32(effy); for (int x = 0; x < chbounds.width(); x++) { - int effx = curx + x + chbounds.min_x; - if (effx >= bounds.min_x && effx <= bounds.max_x) + int effx = curx + x + chbounds.left(); + if (effx >= bounds.left() && effx <= bounds.right()) { u32 spix = rgb_t(src[x]).a(); if (spix != 0) @@ -2324,15 +2392,15 @@ private: } // wrap around... - if (basex < bounds.min_x) + if (basex < bounds.left()) basex += ((max_state_used)*(ourwidth/num_shown)/(max_state_used/m_numstops)); - if (basex > bounds.max_x) + if (basex > bounds.right()) basex -= ((max_state_used)*(ourwidth/num_shown)/(max_state_used/m_numstops)); int endpos = basex+(ourwidth/num_shown); // only render the symbol / text if it's atually in view because the code is SLOW - if ((endpos >= bounds.min_x) && (basex <= bounds.max_x)) + if ((endpos >= bounds.left()) && (basex <= bounds.right())) { while (1) { @@ -2343,7 +2411,7 @@ private: } s32 curx; - curx = bounds.min_x; + curx = bounds.left(); if (m_file[fruit]) if (!m_bitmap[fruit].valid()) @@ -2361,14 +2429,14 @@ private: { int effy = y; - if (effy >= bounds.min_y && effy <= bounds.max_y) + if (effy >= bounds.top() && effy <= bounds.bottom()) { u32 *src = &tempbitmap2.pix32(y); u32 *d = &dest.pix32(effy); for (int x = 0; x < ourwidth/num_shown; x++) { int effx = basex + x; - if (effx >= bounds.min_x && effx <= bounds.max_x) + if (effx >= bounds.left() && effx <= bounds.right()) { u32 spix = rgb_t(src[x]).a(); if (spix != 0) @@ -2410,14 +2478,14 @@ private: { int effy = y; - if (effy >= bounds.min_y && effy <= bounds.max_y) + if (effy >= bounds.top() && effy <= bounds.bottom()) { u32 *src = &tempbitmap.pix32(y); u32 *d = &dest.pix32(effy); for (int x = 0; x < chbounds.width(); x++) { int effx = basex + curx + x; - if (effx >= bounds.min_x && effx <= bounds.max_x) + if (effx >= bounds.left() && effx <= bounds.right()) { u32 spix = rgb_t(src[x]).a(); if (spix != 0) @@ -2566,12 +2634,10 @@ layout_element::texture &layout_element::texture::operator=(texture &&that) //------------------------------------------------- layout_element::component::component(environment &env, util::xml::data_node const &compnode, const char *dirname) - : m_state(0) + : m_state(env.get_attribute_int(compnode, "state", -1)) + , m_color(env.parse_color(compnode.get_child("color"))) { - // fetch common data - m_state = env.get_attribute_int(compnode, "state", -1); env.parse_bounds(compnode.get_child("bounds"), m_bounds); - env.parse_color(compnode.get_child("color"), m_color); } @@ -2618,17 +2684,17 @@ void layout_element::component::draw_text(render_font &font, bitmap_argb32 &dest { // left case 1: - curx = bounds.min_x; + curx = bounds.left(); break; // right case 2: - curx = bounds.max_x - width; + curx = bounds.right() - width; break; // default to center default: - curx = bounds.min_x + (bounds.width() - width) / 2; + curx = bounds.left() + (bounds.width() - width) / 2; break; } @@ -2656,15 +2722,15 @@ void layout_element::component::draw_text(render_font &font, bitmap_argb32 &dest // copy the data into the target for (int y = 0; y < chbounds.height(); y++) { - int effy = bounds.min_y + y; - if (effy >= bounds.min_y && effy <= bounds.max_y) + int effy = bounds.top() + y; + if (effy >= bounds.top() && effy <= bounds.bottom()) { u32 *src = &tempbitmap.pix32(y); u32 *d = &dest.pix32(effy); for (int x = 0; x < chbounds.width(); x++) { - int effx = curx + x + chbounds.min_x; - if (effx >= bounds.min_x && effx <= bounds.max_x) + int effx = curx + x + chbounds.left(); + if (effx >= bounds.left() && effx <= bounds.right()) { u32 spix = rgb_t(src[x]).a(); if (spix != 0) @@ -2894,7 +2960,7 @@ layout_view::layout_view( m_expbounds.x0 = m_expbounds.y0 = m_expbounds.x1 = m_expbounds.y1 = 0; environment local(env); local.set_parameter("viewname", std::string(m_name)); - add_items(local, viewnode, elemmap, groupmap, render_bounds{ 0.0f, 0.0f, 1.0f, 1.0f }, true, false, true); + add_items(local, viewnode, elemmap, groupmap, ROT0, identity_transform, render_color{ 1.0F, 1.0F, 1.0F, 1.0F }, true, false, true); recompute(render_layer_config()); for (group_map::value_type &group : groupmap) group.second.set_bounds_unresolved(); @@ -3055,7 +3121,9 @@ void layout_view::add_items( util::xml::data_node const &parentnode, element_map &elemmap, group_map &groupmap, - render_bounds const &transform, + int orientation, + layout_group::transform const &trans, + render_color const &color, bool root, bool repeat, bool init) @@ -3086,27 +3154,27 @@ void layout_view::add_items( } else if (!strcmp(itemnode->get_name(), "backdrop")) { - m_backdrop_list.emplace_back(env, *itemnode, elemmap, transform); + m_backdrop_list.emplace_back(env, *itemnode, elemmap, orientation, trans, color); } else if (!strcmp(itemnode->get_name(), "screen")) { - m_screen_list.emplace_back(env, *itemnode, elemmap, transform); + m_screen_list.emplace_back(env, *itemnode, elemmap, orientation, trans, color); } else if (!strcmp(itemnode->get_name(), "overlay")) { - m_overlay_list.emplace_back(env, *itemnode, elemmap, transform); + m_overlay_list.emplace_back(env, *itemnode, elemmap, orientation, trans, color); } else if (!strcmp(itemnode->get_name(), "bezel")) { - m_bezel_list.emplace_back(env, *itemnode, elemmap, transform); + m_bezel_list.emplace_back(env, *itemnode, elemmap, orientation, trans, color); } else if (!strcmp(itemnode->get_name(), "cpanel")) { - m_cpanel_list.emplace_back(env, *itemnode, elemmap, transform); + m_cpanel_list.emplace_back(env, *itemnode, elemmap, orientation, trans, color); } else if (!strcmp(itemnode->get_name(), "marquee")) { - m_marquee_list.emplace_back(env, *itemnode, elemmap, transform); + m_marquee_list.emplace_back(env, *itemnode, elemmap, orientation, trans, color); } else if (!strcmp(itemnode->get_name(), "group")) { @@ -3120,17 +3188,33 @@ void layout_view::add_items( unresolved = false; found->second.resolve_bounds(env, groupmap); - render_bounds grouptrans(transform); + layout_group::transform grouptrans(trans); util::xml::data_node const *const itemboundsnode(itemnode->get_child("bounds")); + util::xml::data_node const *const itemorientnode(itemnode->get_child("orientation")); + int const grouporient(env.parse_orientation(itemorientnode)); if (itemboundsnode) { render_bounds itembounds; env.parse_bounds(itemboundsnode, itembounds); - grouptrans = found->second.make_transform(itembounds, transform); + grouptrans = found->second.make_transform(grouporient, itembounds, trans); + } + else if (itemorientnode) + { + grouptrans = found->second.make_transform(grouporient, trans); } environment local(env); - add_items(local, found->second.get_groupnode(), elemmap, groupmap, grouptrans, false, false, true); + add_items( + local, + found->second.get_groupnode(), + elemmap, + groupmap, + orientation_add(grouporient, orientation), + grouptrans, + render_color_multiply(env.parse_color(itemnode->get_child("color")), color), + false, + false, + true); } else if (!strcmp(itemnode->get_name(), "repeat")) { @@ -3140,7 +3224,7 @@ void layout_view::add_items( environment local(env); for (int i = 0; count > i; ++i) { - add_items(local, *itemnode, elemmap, groupmap, transform, false, true, !i); + add_items(local, *itemnode, elemmap, groupmap, orientation, trans, color, false, true, !i); local.increment_parameters(); } } @@ -3190,7 +3274,9 @@ layout_view::item::item( environment &env, util::xml::data_node const &itemnode, element_map &elemmap, - render_bounds const &transform) + int orientation, + layout_group::transform const &trans, + render_color const &color) : m_element(nullptr) , m_output(env.device(), env.get_attribute_string(itemnode, "name", "")) , m_have_output(env.get_attribute_string(itemnode, "name", "")[0]) @@ -3198,7 +3284,8 @@ layout_view::item::item( , m_input_port(nullptr) , m_input_mask(0) , m_screen(nullptr) - , m_orientation(ROT0) + , m_orientation(orientation_add(env.parse_orientation(itemnode.get_child("orientation")), orientation)) + , m_color(render_color_multiply(env.parse_color(itemnode.get_child("color")), color)) { // find the associated element char const *const name(env.get_attribute_string(itemnode, "element", nullptr)); @@ -3224,9 +3311,11 @@ layout_view::item::item( if (m_have_output && m_element) m_output = m_element->default_state(); env.parse_bounds(itemnode.get_child("bounds"), m_rawbounds); - render_bounds_transform(m_rawbounds, transform); - env.parse_color(itemnode.get_child("color"), m_color); - env.parse_orientation(itemnode.get_child("orientation"), m_orientation); + render_bounds_transform(m_rawbounds, trans); + if (m_rawbounds.x0 > m_rawbounds.x1) + std::swap(m_rawbounds.x0, m_rawbounds.x1); + if (m_rawbounds.y0 > m_rawbounds.y1) + std::swap(m_rawbounds.y0, m_rawbounds.y1); // sanity checks if (strcmp(itemnode.get_name(), "screen") == 0) diff --git a/src/emu/schedule.cpp b/src/emu/schedule.cpp index d281446d6c6..e2b1497995f 100644 --- a/src/emu/schedule.cpp +++ b/src/emu/schedule.cpp @@ -460,8 +460,12 @@ void device_scheduler::timeslice() delta += ATTOSECONDS_PER_SECOND; assert(delta == (target - exec->m_localtime).as_attoseconds()); + if (exec->m_attoseconds_per_cycle == 0) + { + exec->m_localtime = target; + } // if we have enough for at least 1 cycle, do the math - if (delta >= exec->m_attoseconds_per_cycle) + else if (delta >= exec->m_attoseconds_per_cycle) { // compute how many cycles we want to execute int ran = exec->m_cycles_running = divu_64x32(u64(delta) >> exec->m_divshift, exec->m_divisor); diff --git a/src/emu/screen.cpp b/src/emu/screen.cpp index 26ef04c43ce..2ec5b660876 100644 --- a/src/emu/screen.cpp +++ b/src/emu/screen.cpp @@ -615,7 +615,7 @@ void screen_device::device_validity_check(validity_checker &valid) const // sanity check display area if (m_type != SCREEN_TYPE_VECTOR && m_type != SCREEN_TYPE_SVG) { - if (m_visarea.empty() || m_visarea.max_x >= m_width || m_visarea.max_y >= m_height) + if (m_visarea.empty() || m_visarea.right() >= m_width || m_visarea.bottom() >= m_height) osd_printf_error("Invalid display area\n"); // sanity check screen formats @@ -722,10 +722,15 @@ void screen_device::device_start() m_svg = std::make_unique<svg_renderer>(reg); machine().output().set_notifier(nullptr, svg_renderer::output_notifier, m_svg.get()); - // The OSD picks up the size before start is called, so this only affect the info display if it's called up in-game - m_width = m_svg->width(); - m_height = m_svg->height(); - m_visarea.set(0, m_width-1, 0, m_height-1); + // don't do this - SVG units are arbitrary and interpreting them as pixels causes bad things to happen + // just render at the size/aspect ratio supplied by the driver + if (false) + { + // The OSD picks up the size before start is called, so this only affect the info display if it's called up in-game + m_width = m_svg->width(); + m_height = m_svg->height(); + m_visarea.set(0, m_width - 1, 0, m_height - 1); + } } // if we have a palette and it's not started, wait for it @@ -886,8 +891,8 @@ void screen_device::device_timer(emu_timer &timer, device_timer_id id, int param // compute the next visible scanline param++; - if (param > m_visarea.max_y) - param = m_visarea.min_y; + if (param > m_visarea.bottom()) + param = m_visarea.top(); m_scanline_timer->adjust(time_until_pos(param), param); break; } @@ -903,12 +908,12 @@ void screen_device::configure(int width, int height, const rectangle &visarea, a // validate arguments assert(width > 0); assert(height > 0); - assert(visarea.min_x >= 0); - assert(visarea.min_y >= 0); -// assert(visarea.max_x < width); -// assert(visarea.max_y < height); - assert(m_type == SCREEN_TYPE_VECTOR || m_type == SCREEN_TYPE_SVG || visarea.min_x < width); - assert(m_type == SCREEN_TYPE_VECTOR || m_type == SCREEN_TYPE_SVG || visarea.min_y < height); + assert(visarea.left() >= 0); + assert(visarea.top() >= 0); +// assert(visarea.right() < width); +// assert(visarea.bottom() < height); + assert(m_type == SCREEN_TYPE_VECTOR || m_type == SCREEN_TYPE_SVG || visarea.left() < width); + assert(m_type == SCREEN_TYPE_VECTOR || m_type == SCREEN_TYPE_SVG || visarea.top() < height); assert(frame_period > 0); // fill in the new parameters @@ -973,9 +978,9 @@ void screen_device::reset_origin(int beamy, int beamx) else m_scanline0_timer->adjust(time_until_pos(0)); - // if we are resetting relative to (visarea.max_y + 1, 0) == VBLANK start, + // if we are resetting relative to (visarea.bottom() + 1, 0) == VBLANK start, // call the VBLANK start timer now; otherwise, adjust it for the future - if (beamy == ((m_visarea.max_y + 1) % m_height) && beamx == 0) + if (beamy == ((m_visarea.bottom() + 1) % m_height) && beamx == 0) vblank_begin(); else m_vblank_begin_timer->adjust(time_until_vblank_start()); @@ -994,8 +999,8 @@ void screen_device::realloc_screen_bitmaps() return; // determine effective size to allocate - s32 effwidth = std::max(m_width, m_visarea.max_x + 1); - s32 effheight = std::max(m_height, m_visarea.max_y + 1); + s32 effwidth = std::max(m_width, m_visarea.right() + 1); + s32 effheight = std::max(m_height, m_visarea.bottom() + 1); // reize all registered screen bitmaps for (auto &item : m_auto_bitmap_list) @@ -1063,21 +1068,20 @@ bool screen_device::update_partial(int scanline) } // set the range of scanlines to render - rectangle clip = m_visarea; - if (m_last_partial_scan > clip.min_y) - clip.min_y = m_last_partial_scan; - if (scanline < clip.max_y) - clip.max_y = scanline; + rectangle clip(m_visarea); + clip.sety( + (std::max)(clip.top(), m_last_partial_scan), + (std::min)(clip.bottom(), scanline)); // skip if entirely outside of visible area - if (clip.min_y > clip.max_y) + if (clip.top() > clip.bottom()) { LOG_PARTIAL_UPDATES(("skipped because outside of visible area\n")); return false; } // otherwise, render - LOG_PARTIAL_UPDATES(("updating %d-%d\n", clip.min_y, clip.max_y)); + LOG_PARTIAL_UPDATES(("updating %d-%d\n", clip.top(), clip.bottom())); g_profiler.start(PROFILER_VIDEO); u32 flags; @@ -1137,7 +1141,7 @@ void screen_device::update_now() int current_hpos = hpos(); rectangle clip = m_visarea; - LOG_PARTIAL_UPDATES(("update_now(): Y=%d, X=%d, last partial %d, partial hpos %d (vis %d %d)\n", current_vpos, current_hpos, m_last_partial_scan, m_partial_scan_hpos, m_visarea.max_x, m_visarea.max_y)); + LOG_PARTIAL_UPDATES(("update_now(): Y=%d, X=%d, last partial %d, partial hpos %d (vis %d %d)\n", current_vpos, current_hpos, m_last_partial_scan, m_partial_scan_hpos, m_visarea.right(), m_visarea.bottom())); // start off by doing a partial update up to the line before us, in case that was necessary if (current_vpos > m_last_partial_scan) @@ -1154,17 +1158,14 @@ void screen_device::update_now() // now finish the previous partial scanline int scanline = current_vpos - 1; - if (m_partial_scan_hpos > clip.min_x) - clip.min_x = m_partial_scan_hpos; - if (current_hpos < clip.max_x) - clip.max_x = current_hpos; - if (m_last_partial_scan > clip.min_y) - clip.min_y = m_last_partial_scan; - if (scanline < clip.max_y) - clip.max_y = scanline; + clip.set( + (std::max)(clip.left(), m_partial_scan_hpos), + (std::min)(clip.right(), current_hpos), + (std::max)(clip.top(), m_last_partial_scan), + (std::min)(clip.bottom(), scanline)); // if there's something to draw, do it - if ((clip.min_x <= clip.max_x) && (clip.min_y <= clip.max_y)) + if (!clip.empty()) { g_profiler.start(PROFILER_VIDEO); @@ -1191,21 +1192,18 @@ void screen_device::update_now() // now draw this partial scanline clip = m_visarea; - if (m_partial_scan_hpos > clip.min_x) - clip.min_x = m_partial_scan_hpos; - if (current_hpos < clip.max_x) - clip.max_x = current_hpos; - if (current_vpos > clip.min_y) - clip.min_y = current_vpos; - if (current_vpos < clip.max_y) - clip.max_y = current_vpos; + clip.set( + (std::max)(clip.left(), m_partial_scan_hpos), + (std::min)(clip.right(), current_hpos), + (std::max)(clip.top(), current_vpos), + (std::min)(clip.bottom(), current_vpos)); // and if there's something to draw, do it - if ((clip.min_x <= clip.max_x) && (clip.min_y <= clip.max_y)) + if (!clip.empty()) { g_profiler.start(PROFILER_VIDEO); - LOG_PARTIAL_UPDATES(("doing scanline partial draw: Y %d X %d-%d\n", clip.max_y, clip.min_x, clip.max_x)); + LOG_PARTIAL_UPDATES(("doing scanline partial draw: Y %d X %d-%d\n", clip.bottom(), clip.left(), clip.right())); u32 flags; screen_bitmap &curbitmap = m_bitmap[m_curbitmap]; @@ -1227,7 +1225,7 @@ void screen_device::update_now() m_last_partial_scan = current_vpos; // if we completed the line, mark it so - if (current_hpos >= m_visarea.max_x) + if (current_hpos >= m_visarea.right()) { m_partial_scan_hpos = 0; m_last_partial_scan = current_vpos + 1; @@ -1267,7 +1265,7 @@ int screen_device::vpos() const vpos = delta / m_scantime; // adjust for the fact that VBLANK starts at the bottom of the visible area - return (m_visarea.max_y + 1 + vpos) % m_height; + return (m_visarea.bottom() + 1 + vpos) % m_height; } @@ -1307,7 +1305,7 @@ attotime screen_device::time_until_pos(int vpos, int hpos) const assert(hpos >= 0); // since we measure time relative to VBLANK, compute the scanline offset from VBLANK - vpos += m_height - (m_visarea.max_y + 1); + vpos += m_height - (m_visarea.bottom() + 1); vpos %= m_height; // compute the delta for the given X,Y position @@ -1545,11 +1543,11 @@ void screen_device::finalize_burnin() return; // compute the scaled visible region - rectangle scaledvis; - scaledvis.min_x = m_visarea.min_x * m_burnin.width() / m_width; - scaledvis.max_x = m_visarea.max_x * m_burnin.width() / m_width; - scaledvis.min_y = m_visarea.min_y * m_burnin.height() / m_height; - scaledvis.max_y = m_visarea.max_y * m_burnin.height() / m_height; + rectangle scaledvis( + m_visarea.left() * m_burnin.width() / m_width, + m_visarea.right() * m_burnin.width() / m_width, + m_visarea.top() * m_burnin.height() / m_height, + m_visarea.bottom() * m_burnin.height() / m_height); // wrap a bitmap around the memregion we care about bitmap_argb32 finalmap(scaledvis.width(), scaledvis.height()); diff --git a/src/emu/screen.h b/src/emu/screen.h index 4d0fddf17ef..45374fef1e7 100644 --- a/src/emu/screen.h +++ b/src/emu/screen.h @@ -279,11 +279,11 @@ public: int vpos() const; int hpos() const; DECLARE_READ_LINE_MEMBER(vblank) const { return (machine().time() < m_vblank_end_time) ? 1 : 0; } - DECLARE_READ_LINE_MEMBER(hblank) const { int const curpos = hpos(); return (curpos < m_visarea.min_x || curpos > m_visarea.max_x) ? 1 : 0; } + DECLARE_READ_LINE_MEMBER(hblank) const { int const curpos = hpos(); return (curpos < m_visarea.left() || curpos > m_visarea.right()) ? 1 : 0; } // timing attotime time_until_pos(int vpos, int hpos = 0) const; - attotime time_until_vblank_start() const { return time_until_pos(m_visarea.max_y + 1); } + attotime time_until_vblank_start() const { return time_until_pos(m_visarea.bottom() + 1); } attotime time_until_vblank_end() const; attotime time_until_update() const { return (m_video_attributes & VIDEO_UPDATE_AFTER_VBLANK) ? time_until_vblank_end() : time_until_vblank_start(); } attotime scan_period() const { return attotime(0, m_scantime); } diff --git a/src/emu/sound.cpp b/src/emu/sound.cpp index 775d85057dd..ce72846a9c3 100644 --- a/src/emu/sound.cpp +++ b/src/emu/sound.cpp @@ -53,7 +53,7 @@ sound_stream::sound_stream(device_t &device, int inputs, int outputs, int sample : m_device(device), m_next(nullptr), m_sample_rate(sample_rate), - m_new_sample_rate(0), + m_new_sample_rate(0xffffffff), m_attoseconds_per_sample(0), m_max_samples_per_update(0), m_input(inputs), @@ -264,6 +264,9 @@ void sound_stream::set_input(int index, sound_stream *input_stream, int output_i void sound_stream::update() { + if (!m_attoseconds_per_sample) + return; + // determine the number of samples since the start of this second attotime time = m_device.machine().time(); s32 update_sampindex = s32(time.attoseconds() / m_attoseconds_per_sample); @@ -427,25 +430,35 @@ void sound_stream::update_with_accounting(bool second_tick) void sound_stream::apply_sample_rate_changes() { // skip if nothing to do - if (m_new_sample_rate == 0) + if (m_new_sample_rate == 0xffffffff) return; // update to the new rate and remember the old rate u32 old_rate = m_sample_rate; m_sample_rate = m_new_sample_rate; - m_new_sample_rate = 0; + m_new_sample_rate = 0xffffffff; // recompute all the data recompute_sample_rate_data(); // reset our sample indexes to the current time - m_output_sampindex = s64(m_output_sampindex) * s64(m_sample_rate) / old_rate; - m_output_update_sampindex = s64(m_output_update_sampindex) * s64(m_sample_rate) / old_rate; + if (old_rate) + { + m_output_sampindex = s64(m_output_sampindex) * s64(m_sample_rate) / old_rate; + m_output_update_sampindex = s64(m_output_update_sampindex) * s64(m_sample_rate) / old_rate; + } + else + { + m_output_sampindex = m_attoseconds_per_sample ? m_device.machine().sound().last_update().attoseconds() / m_attoseconds_per_sample : 0; + m_output_update_sampindex = m_output_sampindex; + } + m_output_base_sampindex = m_output_sampindex - m_max_samples_per_update; // clear out the buffer - for (auto & elem : m_output) - memset(&elem.m_buffer[0], 0, m_max_samples_per_update * sizeof(elem.m_buffer[0])); + if (m_max_samples_per_update) + for (auto & elem : m_output) + memset(&elem.m_buffer[0], 0, m_max_samples_per_update * sizeof(elem.m_buffer[0])); } @@ -471,15 +484,22 @@ void sound_stream::recompute_sample_rate_data() throw emu_fatalerror("Incompatible sample rates as input of a synchronous stream: %d and %d\n", m_sample_rate, input.m_source->m_stream->m_sample_rate); } } - if (!m_sample_rate) - m_sample_rate = 1000; } // recompute the timing parameters attoseconds_t update_attoseconds = m_device.machine().sound().update_attoseconds(); - m_attoseconds_per_sample = ATTOSECONDS_PER_SECOND / m_sample_rate; - m_max_samples_per_update = (update_attoseconds + m_attoseconds_per_sample - 1) / m_attoseconds_per_sample; + + if (m_sample_rate) + { + m_attoseconds_per_sample = ATTOSECONDS_PER_SECOND / m_sample_rate; + m_max_samples_per_update = (update_attoseconds + m_attoseconds_per_sample - 1) / m_attoseconds_per_sample; + } + else + { + m_attoseconds_per_sample = 0; + m_max_samples_per_update = 0; + } // update resample and output buffer sizes allocate_resample_buffers(); @@ -490,7 +510,7 @@ void sound_stream::recompute_sample_rate_data() { // if we have a source, see if its sample rate changed - if (input.m_source != nullptr) + if (input.m_source != nullptr && input.m_source->m_stream->m_sample_rate) { // okay, we have a new sample rate; recompute the latency to be the maximum // sample period between us and our input @@ -511,14 +531,23 @@ void sound_stream::recompute_sample_rate_data() input.m_latency_attoseconds = std::max(input.m_latency_attoseconds, latency); assert(input.m_latency_attoseconds < update_attoseconds); } + else + { + input.m_latency_attoseconds = 0; + } } // If synchronous, prime the timer if (m_synchronous) { attotime time = m_device.machine().time(); - attoseconds_t next_edge = m_attoseconds_per_sample - (time.attoseconds() % m_attoseconds_per_sample); - m_sync_timer->adjust(attotime(0, next_edge)); + if (m_attoseconds_per_sample) + { + attoseconds_t next_edge = m_attoseconds_per_sample - (time.attoseconds() % m_attoseconds_per_sample); + m_sync_timer->adjust(attotime(0, next_edge)); + } + else + m_sync_timer->adjust(attotime::never); } } @@ -587,7 +616,7 @@ void sound_stream::postload() memset(&elem.m_buffer[0], 0, m_output_bufalloc * sizeof(elem.m_buffer[0])); // recompute the sample indexes to make sense - m_output_sampindex = m_device.machine().sound().last_update().attoseconds() / m_attoseconds_per_sample; + m_output_sampindex = m_attoseconds_per_sample ? m_device.machine().sound().last_update().attoseconds() / m_attoseconds_per_sample : 0; m_output_update_sampindex = m_output_sampindex; m_output_base_sampindex = m_output_sampindex - m_max_samples_per_update; } @@ -653,7 +682,7 @@ stream_sample_t *sound_stream::generate_resampled_data(stream_input &input, u32 { // if we don't have an output to pull data from, generate silence stream_sample_t *dest = &input.m_resample[0]; - if (input.m_source == nullptr) + if (input.m_source == nullptr || input.m_source->m_stream->m_attoseconds_per_sample == 0) { memset(dest, 0, numsamples * sizeof(*dest)); return &input.m_resample[0]; diff --git a/src/emu/sound.h b/src/emu/sound.h index 37c3492588a..b429326264c 100644 --- a/src/emu/sound.h +++ b/src/emu/sound.h @@ -97,7 +97,7 @@ public: // getters sound_stream *next() const { return m_next; } device_t &device() const { return m_device; } - int sample_rate() const { return (m_new_sample_rate != 0) ? m_new_sample_rate : m_sample_rate; } + int sample_rate() const { return (m_new_sample_rate != 0xffffffff) ? m_new_sample_rate : m_sample_rate; } attotime sample_time() const; attotime sample_period() const { return attotime(0, m_attoseconds_per_sample); } int input_count() const { return m_input.size(); } diff --git a/src/emu/tilemap.cpp b/src/emu/tilemap.cpp index 0b7b748a494..9425ee88c16 100644 --- a/src/emu/tilemap.cpp +++ b/src/emu/tilemap.cpp @@ -953,8 +953,8 @@ g_profiler.start(PROFILER_TILEMAP_DRAW); // flip the tilemap around the center of the visible area rectangle visarea = screen.visible_area(); - u32 width = visarea.min_x + visarea.max_x + 1; - u32 height = visarea.min_y + visarea.max_y + 1; + u32 width = visarea.left() + visarea.right() + 1; + u32 height = visarea.top() + visarea.bottom() + 1; // XY scrolling playfield if (m_scrollrows == 1 && m_scrollcols == 1) @@ -962,8 +962,8 @@ g_profiler.start(PROFILER_TILEMAP_DRAW); // iterate to handle wraparound int scrollx = effective_rowscroll(0, width); int scrolly = effective_colscroll(0, height); - for (int ypos = scrolly - m_height; ypos <= blit.cliprect.max_y; ypos += m_height) - for (int xpos = scrollx - m_width; xpos <= blit.cliprect.max_x; xpos += m_width) + for (int ypos = scrolly - m_height; ypos <= blit.cliprect.bottom(); ypos += m_height) + for (int xpos = scrollx - m_width; xpos <= blit.cliprect.right(); xpos += m_width) draw_instance(screen, dest, blit, xpos, ypos); } @@ -975,10 +975,10 @@ g_profiler.start(PROFILER_TILEMAP_DRAW); // iterate over Y to handle wraparound int rowheight = m_height / m_scrollrows; int scrolly = effective_colscroll(0, height); - for (int ypos = scrolly - m_height; ypos <= original_cliprect.max_y; ypos += m_height) + for (int ypos = scrolly - m_height; ypos <= original_cliprect.bottom(); ypos += m_height) { - int const firstrow = std::max((original_cliprect.min_y - ypos) / rowheight, 0); - int const lastrow = std::min((original_cliprect.max_y - ypos) / rowheight, s32(m_scrollrows) - 1); + int const firstrow = std::max((original_cliprect.top() - ypos) / rowheight, 0); + int const lastrow = std::min((original_cliprect.bottom() - ypos) / rowheight, s32(m_scrollrows) - 1); // iterate over rows in the tilemap int nextrow; @@ -995,12 +995,11 @@ g_profiler.start(PROFILER_TILEMAP_DRAW); continue; // update the cliprect just for this set of rows - blit.cliprect.min_y = currow * rowheight + ypos; - blit.cliprect.max_y = nextrow * rowheight - 1 + ypos; + blit.cliprect.sety(currow * rowheight + ypos, nextrow * rowheight - 1 + ypos); blit.cliprect &= original_cliprect; // iterate over X to handle wraparound - for (int xpos = scrollx - m_width; xpos <= original_cliprect.max_x; xpos += m_width) + for (int xpos = scrollx - m_width; xpos <= original_cliprect.right(); xpos += m_width) draw_instance(screen, dest, blit, xpos, ypos); } } @@ -1028,15 +1027,14 @@ g_profiler.start(PROFILER_TILEMAP_DRAW); continue; // iterate over X to handle wraparound - for (int xpos = scrollx - m_width; xpos <= original_cliprect.max_x; xpos += m_width) + for (int xpos = scrollx - m_width; xpos <= original_cliprect.right(); xpos += m_width) { // update the cliprect just for this set of columns - blit.cliprect.min_x = curcol * colwidth + xpos; - blit.cliprect.max_x = nextcol * colwidth - 1 + xpos; + blit.cliprect.setx(curcol * colwidth + xpos, nextcol * colwidth - 1 + xpos); blit.cliprect &= original_cliprect; // iterate over Y to handle wraparound - for (int ypos = scrolly - m_height; ypos <= original_cliprect.max_y; ypos += m_height) + for (int ypos = scrolly - m_height; ypos <= original_cliprect.bottom(); ypos += m_height) draw_instance(screen, dest, blit, xpos, ypos); } } @@ -1115,10 +1113,10 @@ void tilemap_t::draw_instance(screen_device &screen, _BitmapClass &dest, const b { // clip destination coordinates to the tilemap // note that x2/y2 are exclusive, not inclusive - int x1 = std::max(xpos, blit.cliprect.min_x); - int x2 = std::min(xpos + (int)m_width, blit.cliprect.max_x + 1); - int y1 = std::max(ypos, blit.cliprect.min_y); - int y2 = std::min(ypos + (int)m_height, blit.cliprect.max_y + 1); + int x1 = (std::max)(xpos, blit.cliprect.left()); + int x2 = (std::min)(xpos + int(m_width), blit.cliprect.right() + 1); + int y1 = (std::max)(ypos, blit.cliprect.top()); + int y2 = (std::min)(ypos + int(m_height), blit.cliprect.bottom() + 1); // if totally clipped, stop here if (x1 >= x2 || y1 >= y2) @@ -1305,14 +1303,14 @@ void tilemap_t::draw_roz_core(screen_device &screen, _BitmapClass &destbitmap, c u8 alpha = blit.alpha; // pre-advance based on the cliprect - startx += blit.cliprect.min_x * incxx + blit.cliprect.min_y * incyx; - starty += blit.cliprect.min_x * incxy + blit.cliprect.min_y * incyy; + startx += blit.cliprect.left() * incxx + blit.cliprect.top() * incyx; + starty += blit.cliprect.left() * incxy + blit.cliprect.top() * incyy; // extract start/end points - int sx = blit.cliprect.min_x; - int sy = blit.cliprect.min_y; - int ex = blit.cliprect.max_x; - int ey = blit.cliprect.max_y; + int sx = blit.cliprect.left(); + int sy = blit.cliprect.top(); + int ex = blit.cliprect.right(); + int ey = blit.cliprect.bottom(); // optimized loop for the not rotated case if (incxy == 0 && incyx == 0 && !wraparound) @@ -1476,8 +1474,8 @@ void tilemap_t::draw_debug(screen_device &screen, bitmap_rgb32 &dest, u32 scroll realize_all_dirty_tiles(); // iterate to handle wraparound - for (int ypos = scrolly - m_height; ypos <= blit.cliprect.max_y; ypos += m_height) - for (int xpos = scrollx - m_width; xpos <= blit.cliprect.max_x; xpos += m_width) + for (int ypos = scrolly - m_height; ypos <= blit.cliprect.bottom(); ypos += m_height) + for (int xpos = scrollx - m_width; xpos <= blit.cliprect.right(); xpos += m_width) draw_instance(screen, dest, blit, xpos, ypos); } diff --git a/src/emu/xtal.cpp b/src/emu/xtal.cpp index c05b475be04..ef6d003e6a6 100644 --- a/src/emu/xtal.cpp +++ b/src/emu/xtal.cpp @@ -210,6 +210,7 @@ const double XTAL::known_xtals[] = { 16'128'000, /* 16.128_MHz_XTAL Fujitsu FM-7 */ 16'384'000, /* 16.384_MHz_XTAL - */ 16'400'000, /* 16.4_MHz_XTAL MS 6102 */ + 16'572'000, /* 16.572_MHz_XTAL Micro-Term ACT-5A */ 16'588'800, /* 16.5888_MHz_XTAL SM 7238 */ 16'669'800, /* 16.6698_MHz_XTAL Qume QVT-102 */ 16'670'000, /* 16.67_MHz_XTAL - */ diff --git a/src/frontend/mame/clifront.cpp b/src/frontend/mame/clifront.cpp index 60260556606..581d6edd62f 100644 --- a/src/frontend/mame/clifront.cpp +++ b/src/frontend/mame/clifront.cpp @@ -83,7 +83,7 @@ const options_entry cli_option_entries[] = /* core commands */ { nullptr, nullptr, OPTION_HEADER, "CORE COMMANDS" }, { CLICOMMAND_HELP ";h;?", "0", OPTION_COMMAND, "show help message" }, - { CLICOMMAND_VALIDATE ";valid", "0", OPTION_COMMAND, "perform driver validation on game drivers" }, + { CLICOMMAND_VALIDATE ";valid", "0", OPTION_COMMAND, "perform validation on system drivers and devices" }, /* configuration commands */ { nullptr, nullptr, OPTION_HEADER, "CONFIGURATION COMMANDS" }, @@ -552,7 +552,7 @@ void cli_frontend::listcrc(const std::vector<std::string> &args) // determine which drivers to output; return an error if none found driver_enumerator drivlist(m_options, gamename); if (drivlist.count() == 0) - throw emu_fatalerror(EMU_ERR_NO_SUCH_GAME, "No matching games found for '%s'", gamename); + throw emu_fatalerror(EMU_ERR_NO_SUCH_GAME, "No matching systems found for '%s'", gamename); // iterate through matches, and then through ROMs while (drivlist.next()) @@ -720,7 +720,7 @@ void cli_frontend::listsamples(const std::vector<std::string> &args) // determine which drivers to output; return an error if none found driver_enumerator drivlist(m_options, gamename); if (drivlist.count() == 0) - throw emu_fatalerror(EMU_ERR_NO_SUCH_GAME, "No matching games found for '%s'", gamename); + throw emu_fatalerror(EMU_ERR_NO_SUCH_GAME, "No matching systems found for '%s'", gamename); // iterate over drivers, looking for SAMPLES devices bool first = true; @@ -760,7 +760,7 @@ void cli_frontend::listdevices(const std::vector<std::string> &args) // determine which drivers to output; return an error if none found driver_enumerator drivlist(m_options, gamename); if (drivlist.count() == 0) - throw emu_fatalerror(EMU_ERR_NO_SUCH_GAME, "No matching games found for '%s'", gamename); + throw emu_fatalerror(EMU_ERR_NO_SUCH_GAME, "No matching systems found for '%s'", gamename); // iterate over drivers, looking for SAMPLES devices bool first = true; @@ -845,7 +845,7 @@ void cli_frontend::listslots(const std::vector<std::string> &args) // determine which drivers to output; return an error if none found driver_enumerator drivlist(m_options, gamename); if (drivlist.count() == 0) - throw emu_fatalerror(EMU_ERR_NO_SUCH_GAME, "No matching games found for '%s'", gamename); + throw emu_fatalerror(EMU_ERR_NO_SUCH_GAME, "No matching systems found for '%s'", gamename); // print header printf("%-16s %-16s %-16s %s\n", "SYSTEM", "SLOT NAME", "SLOT OPTIONS", "SLOT DEVICE NAME"); @@ -913,7 +913,7 @@ void cli_frontend::listmedia(const std::vector<std::string> &args) // determine which drivers to output; return an error if none found driver_enumerator drivlist(m_options, gamename); if (drivlist.count() == 0) - throw emu_fatalerror(EMU_ERR_NO_SUCH_GAME, "No matching games found for '%s'", gamename); + throw emu_fatalerror(EMU_ERR_NO_SUCH_GAME, "No matching systems found for '%s'", gamename); // print header printf("%-16s %-16s %-10s %s\n", "SYSTEM", "MEDIA NAME", "(brief)", "IMAGE FILE EXTENSIONS SUPPORTED"); @@ -1114,7 +1114,7 @@ void cli_frontend::verifysamples(const std::vector<std::string> &args) // return an error if none found if (matched == 0) - throw emu_fatalerror(EMU_ERR_NO_SUCH_GAME, "No matching games found for '%s'", gamename); + throw emu_fatalerror(EMU_ERR_NO_SUCH_GAME, "No matching systems found for '%s'", gamename); // if we didn't get anything at all, display a generic end message if (matched > 0 && correct == 0 && incorrect == 0) @@ -1327,7 +1327,7 @@ void cli_frontend::listsoftware(const std::vector<std::string> &args) // determine which drivers to output; return an error if none found driver_enumerator drivlist(m_options, gamename); if (drivlist.count() == 0) - throw emu_fatalerror(EMU_ERR_NO_SUCH_GAME, "No matching games found for '%s'", gamename); + throw emu_fatalerror(EMU_ERR_NO_SUCH_GAME, "No matching systems found for '%s'", gamename); while (drivlist.next()) { @@ -1372,9 +1372,7 @@ void cli_frontend::verifysoftware(const std::vector<std::string> &args) // determine which drivers to process; return an error if none found driver_enumerator drivlist(m_options, gamename); if (drivlist.count() == 0) - { - throw emu_fatalerror(EMU_ERR_NO_SUCH_GAME, "No matching games found for '%s'", gamename); - } + throw emu_fatalerror(EMU_ERR_NO_SUCH_GAME, "No matching systems found for '%s'", gamename); media_auditor auditor(drivlist); util::ovectorstream summary_string; @@ -1412,7 +1410,7 @@ void cli_frontend::verifysoftware(const std::vector<std::string> &args) // return an error if none found if (matched == 0) - throw emu_fatalerror(EMU_ERR_NO_SUCH_GAME, "No matching games found for '%s'", gamename); + throw emu_fatalerror(EMU_ERR_NO_SUCH_GAME, "No matching systems found for '%s'", gamename); // if we didn't get anything at all, display a generic end message if (matched > 0 && correct == 0 && incorrect == 0) diff --git a/src/frontend/mame/info.cpp b/src/frontend/mame/info.cpp index 3e7af8a43c5..6110c5c5fa9 100644 --- a/src/frontend/mame/info.cpp +++ b/src/frontend/mame/info.cpp @@ -108,7 +108,7 @@ const char info_xml_creator::s_dtd_string[] = "\t\t\t<!ATTLIST display vbstart CDATA #IMPLIED>\n" "\t\t<!ELEMENT sound EMPTY>\n" "\t\t\t<!ATTLIST sound channels CDATA #REQUIRED>\n" -"\t\t\t<!ELEMENT condition EMPTY>\n" +"\t\t<!ELEMENT condition EMPTY>\n" "\t\t\t<!ATTLIST condition tag CDATA #REQUIRED>\n" "\t\t\t<!ATTLIST condition mask CDATA #REQUIRED>\n" "\t\t\t<!ATTLIST condition relation (eq|ne|gt|le|lt|ge) #REQUIRED>\n" diff --git a/src/frontend/mame/luaengine.cpp b/src/frontend/mame/luaengine.cpp index 894767e0838..c8d9b81b2f1 100644 --- a/src/frontend/mame/luaengine.cpp +++ b/src/frontend/mame/luaengine.cpp @@ -201,7 +201,10 @@ namespace sol case AMH_UNMAP: typestr = "unmap"; break; - case AMH_DEVICE_DELEGATE: + case AMH_DEVICE_DELEGATE_F: + case AMH_DEVICE_DELEGATE_S: + case AMH_DEVICE_DELEGATE_SM: + case AMH_DEVICE_DELEGATE_SMO: typestr = "delegate"; break; case AMH_PORT: diff --git a/src/frontend/mame/ui/imgcntrl.cpp b/src/frontend/mame/ui/imgcntrl.cpp index ab502a39834..3312e5d54e7 100644 --- a/src/frontend/mame/ui/imgcntrl.cpp +++ b/src/frontend/mame/ui/imgcntrl.cpp @@ -206,7 +206,7 @@ void menu_control_device_image::handle() break; } m_software_info_name.clear(); - menu::stack_push<menu_software_list>(ui(), container(), m_sld, m_image.image_interface(), m_software_info_name); + menu::stack_push_special_main<menu_software_list>(ui(), container(), m_sld, m_image.image_interface(), m_software_info_name); m_state = SELECT_PARTLIST; break; diff --git a/src/lib/formats/ap2_dsk.cpp b/src/lib/formats/ap2_dsk.cpp index 2cc0e0d0db1..e5e2e252e48 100644 --- a/src/lib/formats/ap2_dsk.cpp +++ b/src/lib/formats/ap2_dsk.cpp @@ -1716,6 +1716,8 @@ bool a2_woz_format::load(io_generic *io, uint32_t form_factor, floppy_image *ima uint8_t idx = r8(img, off_tmap + trkid); if(idx != 0xff) { uint32_t boff = off_trks + 6656*idx; + if (r16(img, boff + 6648) == 0) + return false; generate_track_from_bitstream(track, head, &img[boff], r16(img, boff + 6648), image, subtrack, r16(img, boff + 6650)); } } diff --git a/src/lib/formats/flopimg.h b/src/lib/formats/flopimg.h index fe6d8ed35dd..b7f4d542db2 100644 --- a/src/lib/formats/flopimg.h +++ b/src/lib/formats/flopimg.h @@ -735,7 +735,7 @@ public: @param head head number @return a pointer to the data buffer for this track and head */ - std::vector<uint32_t> &get_buffer(int track, int head, int subtrack = 0) { return track_array[track*4+subtrack][head].cell_data; } + std::vector<uint32_t> &get_buffer(int track, int head, int subtrack = 0) { assert(track < tracks && head < heads); return track_array[track*4+subtrack][head].cell_data; } //! Sets the write splice position. //! The "track splice" information indicates where to start writing @@ -749,9 +749,9 @@ public: @param head @param pos the position */ - void set_write_splice_position(int track, int head, uint32_t pos, int subtrack = 0) { track_array[track*4+subtrack][head].write_splice = pos; } + void set_write_splice_position(int track, int head, uint32_t pos, int subtrack = 0) { assert(track < tracks && head < heads); track_array[track*4+subtrack][head].write_splice = pos; } //! @return the current write splice position. - uint32_t get_write_splice_position(int track, int head, int subtrack = 0) const { return track_array[track*4+subtrack][head].write_splice; } + uint32_t get_write_splice_position(int track, int head, int subtrack = 0) const { assert(track < tracks && head < heads); return track_array[track*4+subtrack][head].write_splice; } //! @return the maximal geometry supported by this format. void get_maximal_geometry(int &tracks, int &heads) const; diff --git a/src/lib/formats/imd_dsk.cpp b/src/lib/formats/imd_dsk.cpp index 8476da6ac38..51337a7f890 100644 --- a/src/lib/formats/imd_dsk.cpp +++ b/src/lib/formats/imd_dsk.cpp @@ -433,6 +433,9 @@ bool imd_format::load(io_generic *io, uint32_t form_factor, floppy_image *image) if(pos >= size) return false; + int tracks, heads; + image->get_maximal_geometry(tracks, heads); + while(pos < size) { uint8_t mode = img[pos++]; uint8_t track = img[pos++]; @@ -440,8 +443,23 @@ bool imd_format::load(io_generic *io, uint32_t form_factor, floppy_image *image) uint8_t sector_count = img[pos++]; uint8_t ssize = img[pos++]; + if(track >= tracks) + { + osd_printf_error("imd_format: Track %d exceeds maximum of %d\n", track, tracks); + return false; + } + + if((head & 0x3f) >= heads) + { + osd_printf_error("imd_format: Head %d exceeds maximum of %d\n", head & 0x3f, heads); + return false; + } + if(ssize == 0xff) - throw emu_fatalerror("imd_format: Unsupported variable sector size on track %d head %d", track, head); + { + osd_printf_error("imd_format: Unsupported variable sector size on track %d head %d", track, head & 0x3f); + return false; + } uint32_t actual_size = ssize < 7 ? 128 << ssize : 8192; diff --git a/src/lib/formats/ti99_dsk.cpp b/src/lib/formats/ti99_dsk.cpp index 1b198295947..b248c9dd594 100644 --- a/src/lib/formats/ti99_dsk.cpp +++ b/src/lib/formats/ti99_dsk.cpp @@ -1,44 +1,49 @@ // license:BSD-3-Clause // copyright-holders:Michael Zapf /********************************************************************* - * - * TI-99 family disk images - * - * used by TI-99/4, TI-99/4A, TI-99/8, SGCPU ("TI-99/4P"), and Geneve - * - * Sector Dump Format, aka "v9t9" format - * customized wd177x_format - * no track data - * - * Track Dump Format, aka "pc99" format - * contains all track information, but no clock patterns - * - * Both formats allow for a broad range of medium sizes. All sectors are 256 - * bytes long. The most common formats are 9 sectors per track, single-sided, - * 40 tracks, which yields 90 KiB of sector data (known as SSSD), and 18 - * sectors per track, double-sided, and 40 tracks, which is 360 KiB (known as - * DSDD). There are rare occurances of 8/16 sectors/track - * (prototypical TI double-density controller) and 35 track media. Newer - * controllers and ROMs allow for up to 36 sectors per track and 80 tracks on - * both sides, which is 1,44 MiB (DSHD80). - * - * Double stepping - * -------------- - * When using a 40-track disk in an 80-track drive, it seems as if each - * track appears twice in sequence (0,0,1,1,2,2,...,39,39). - * The system will write to each second track and leave the others untouched. - * When we write back that image, there is no simple way to know that - * the 80 tracks are in fact doubled 40 tracks. We will actually write - * all 80 tracks, doubling the size of the image file. This disk image will - * now become unusable in a 40-track drive - which is exactly what happens in reality. - * - * Michael Zapf, July 2015 - * - ********************************************************************/ + + TI-99 family disk images + + used by TI-99/4, TI-99/4A, TI-99/8, SGCPU ("TI-99/4P"), and Geneve + + Sector Dump Format, aka "v9t9" format + customized wd177x_format + no track data + + Track Dump Format, aka "pc99" format + contains all track information, but no clock patterns + + Both formats allow for a broad range of medium sizes. All sectors are 256 + bytes long. The most common formats are 9 sectors per track, single-sided, + 40 tracks, which yields 90 KiB of sector data (known as SSSD), and 18 + sectors per track, double-sided, and 40 tracks, which is 360 KiB (known as + DSDD). There are rare occurances of 16 sectors/track + (prototypical TI double-density controller) and 35 track media. Newer + controllers and ROMs allow for up to 36 sectors per track and 80 tracks on + both sides, which is 1,44 MiB (DSHD80). + + Double stepping + -------------- + When using a 40-track disk in an 80-track drive, it seems as if each + track appears twice in sequence (0,0,1,1,2,2,...,39,39). + The system will write to each second track and leave the others untouched. + When we write back that image, there is no simple way to know that + the 80 tracks are in fact doubled 40 tracks. We will actually write + all 80 tracks, doubling the size of the image file. This disk image will + now become unusable in a 40-track drive - which is exactly what happens in reality. + + Michael Zapf, July 2015 + Updated August 2018 + + TODO: + - Support for 77 track images for HX5102 + +********************************************************************/ #include <string.h> #include <time.h> #include <assert.h> +#include <iomanip> #include "emu.h" // osd_printf_* (in osdcore.h) #include "imageutl.h" @@ -46,46 +51,25 @@ #define SECTOR_SIZE 256 -// Debugging -#define TRACE 0 +#undef LOG_OUTPUT_FUNC +#define LOG_OUTPUT_FUNC osd_printf_info + +#define LOG_WARN (1U<<1) // Warnings +#define LOG_HEADER (1U<<2) // Header +#define LOG_SHIFT (1U<<3) // Shift register +#define LOG_INTERLEAVE (1U<<4) // Interleave information +#define LOG_INFO (1U<<5) // Disk info +#define LOG_DETAIL (1U<<6) // Details +#define LOG_TRACK (1U<<7) // Track output + +#define VERBOSE ( LOG_WARN ) + +#include "logmacro.h" // ==================================================== // Common methods for both formats. // ==================================================== -/* - Find out whether there are IDAMs and DAMs (without having clock bits). - As said above, let's not spend too much effort allowing format deviations. - If the image does not exactly adhere to the format, give up. -*/ -bool ti99_floppy_format::check_for_address_marks(uint8_t* trackdata, int encoding) -{ - int i=0; - - if (encoding==floppy_image::FM) - { - // Check 5 sectors of track 0 - while (i < 5) - { - if (trackdata[16 + 6 + i*334] != 0xfe) break; - if (trackdata[16 + 30 + i*334] != 0xfb && trackdata[16 + 30 + i*334] != 0xf8) break; - i++; - } - } - else - { - // Try MFM - i = 0; - while (i < 5) - { - if (trackdata[40 + 13 + i*340] != 0xfe) break; - if (trackdata[40 + 57 + i*340] != 0xfb && trackdata[40 + 57 + i*340] != 0xf8) break; - i++; - } - } - return (i==5); -} - int ti99_floppy_format::get_encoding(int cell_size) { return (cell_size==4000)? floppy_image::FM : floppy_image::MFM; @@ -100,18 +84,30 @@ bool ti99_floppy_format::load(io_generic *io, uint32_t form_factor, floppy_image int sector_count = 0; int heads = 0; int log_track_count = 0; - determine_sizes(io, cell_size, sector_count, heads, log_track_count); + int file_size = io_generic_size(io); - if (cell_size == 0) return false; + bool img_high_tpi = false; + bool drive_high_tpi = false; + bool skip_track = false; + int track_count, head_count; - // Be ready to hold a track of up to 36 sectors (with gaps and marks) - uint8_t trackdata[13000]; + // Get information about cell size, sector count, and logical track count + // (the track count as defined by the file system) + determine_sizes(io, cell_size, sector_count, heads, log_track_count); - int maxtrack, maxheads; - image->get_maximal_geometry(maxtrack, maxheads); + image->get_maximal_geometry(track_count, head_count); + drive_high_tpi = (track_count > 44); - int file_size = io_generic_size(io); - int track_size = get_track_size(cell_size, sector_count); + // Depends on the image format (SDF or TDF) + int track_size = get_track_size(sector_count); + + // Adding support for a variant of the sector image format which adds 768 bytes + // as a bad sector map. Only applies for SDF; TDF will not yield that result + if (((file_size - 768) % (SECTOR_SIZE*360)) == 0) + { + LOGMASKED(LOG_INFO, "[ti99_dsk] Stripping map of bad sectors at image end\n"); + file_size -= 768; + } // Problem: If the disk is improperly formatted, the track count will be // wrong. For instance, a disk could be reformatted to single-side. @@ -119,379 +115,426 @@ bool ti99_floppy_format::load(io_generic *io, uint32_t form_factor, floppy_image if ((heads==1) && (file_size > track_size*40)) heads = 2; - int phys_track_count = file_size / (track_size*heads); + // TI formats are known as having a constant track size, so the physical + // track count on the medium can easily be calculated. + int img_track_count = file_size / (track_size*heads); + img_high_tpi = (img_track_count > 44); // Some disks are known to have an incomplete header. // PASCAL disks have a track count of 0. - if (log_track_count==0) log_track_count = phys_track_count; + if (log_track_count == 0) log_track_count = img_track_count; - if (TRACE) osd_printf_info("ti99_dsk: logical tracks = %d, physical tracks = %d\n", log_track_count, phys_track_count); + LOGMASKED(LOG_INFO, "[ti99_dsk] logical tracks = %d, image tracks = %d, drive track_count = %d\n", log_track_count, img_track_count, track_count); - if (phys_track_count > maxtrack) + // If the floppy disk has 80 tracks but the drive has 40 tracks, force + // the floppy to 40 tracks (will make it unreadable) + if (img_high_tpi && !drive_high_tpi) { - osd_printf_error("ti99_dsk: Floppy disk has too many tracks for this drive.\n"); - return false; + LOGMASKED(LOG_WARN, "[ti99_dsk] Floppy disk has too many tracks for this drive, will skip every second track.\n"); + img_high_tpi = false; + skip_track = true; // only read the even numbered tracks } // Is this the first time that this disk is read in an 80-track drive? - bool double_step = ((log_track_count * 2) <= maxtrack); - bool first_time_double = ((phys_track_count * 2) <= maxtrack); + bool double_step = (drive_high_tpi && log_track_count <= 44); + bool first_time_double = (drive_high_tpi && !img_high_tpi); - if (first_time_double) - { - osd_printf_warning("ti99_dsk: 40-track image in an 80-track drive. On save, image size will double.\n"); - } + if (double_step) + LOGMASKED(LOG_INFO, "[ti99_dsk] Applying double stepping\n"); - int acttrack; + if (first_time_double) + LOGMASKED(LOG_WARN, "[ti99_dsk] 40-track image in an 80-track drive. On save, image size will double.\n"); + int trackid; // Read the image + uint8_t sectordata[36*SECTOR_SIZE]; + int sectornmb[36]; + int sectoroff[36]; + for (int head=0; head < heads; head++) { - for (int track=0; track < phys_track_count; track++) + for (int track=0; track < img_track_count; track++) { - if (double_step && !first_time_double) acttrack = track/2; - else acttrack = track; + LOGMASKED(LOG_TRACK, "[ti99_dsk] Reading track %d, head %d\n", track, head); + if (double_step && !first_time_double) trackid = track/2; + else trackid = track; - load_track(io, trackdata, head, track, acttrack, sector_count, phys_track_count, cell_size); + load_track(io, sectordata, sectornmb, sectoroff, head, track, sector_count, img_track_count); - if (first_time_double) + if (double_step) { - // Create two tracks from each medium track. This reflects the - // fact that the drive head will find the same data after - // a single step - if (get_encoding(cell_size)==floppy_image::FM) + if (first_time_double) { - generate_track_fm(track*2, head, cell_size, trackdata, image); - generate_track_fm(track*2+1, head, cell_size, trackdata, image); + // Create two tracks from each medium track. This reflects the + // fact that the drive head will find the same data after + // a single step + if (sector_count < 10) + { + generate_fm_track_from_sectors(image, sectordata, sector_count, sectornmb, sectoroff, track*2, trackid, head); + generate_fm_track_from_sectors(image, sectordata, sector_count, sectornmb, sectoroff, track*2+1, trackid, head); + } + else + { + generate_mfm_track_from_sectors(image, sectordata, sector_count, sectornmb, sectoroff, track*2, trackid, head); + generate_mfm_track_from_sectors(image, sectordata, sector_count, sectornmb, sectoroff, track*2+1, trackid, head); + } } else { - generate_track_mfm(track*2, head, cell_size, trackdata, image); - generate_track_mfm(track*2+1, head, cell_size, trackdata, image); + // Reading 80 track image for double stepping + if (sector_count < 10) + generate_fm_track_from_sectors(image, sectordata, sector_count, sectornmb, sectoroff, track, trackid, head); + else + generate_mfm_track_from_sectors(image, sectordata, sector_count, sectornmb, sectoroff, track, trackid, head); } } else { + // No double stepping now, but maybe the image was created under double stepping + int drivetrack = (skip_track)? track / 2 : track; + // Normal tracks - if (get_encoding(cell_size)==floppy_image::FM) - generate_track_fm(track, head, cell_size, trackdata, image); + if (sector_count < 10) + generate_fm_track_from_sectors(image, sectordata, sector_count, sectornmb, sectoroff, drivetrack, drivetrack, head); else - generate_track_mfm(track, head, cell_size, trackdata, image); + generate_mfm_track_from_sectors(image, sectordata, sector_count, sectornmb, sectoroff, drivetrack, drivetrack, head); } + if (skip_track) track++; } } return true; } +/* + Save all tracks to the image file. +*/ bool ti99_floppy_format::save(io_generic *io, floppy_image *image) { int act_track_size = 0; uint8_t bitstream[500000/8]; - uint8_t trackdata[9216]; // max size + uint8_t sectordata[9216]; // max size (36*256) int cellsizes[] = { 2000, 4000, 1000, 2000 }; // Do we use double-stepping? // If our image was loaded into a 80-track drive, we will always write 80 tracks. - int maxtrack, maxheads; - image->get_maximal_geometry(maxtrack, maxheads); + int track_count, head_count; + image->get_maximal_geometry(track_count, head_count); - if (maxtrack > 80) maxtrack = 80; + if (track_count > 80) track_count = 80; else { - if (maxtrack > 35 && maxtrack < 80) maxtrack = 40; - else maxtrack = 35; + if (track_count > 35 && track_count < 80) track_count = 40; + else track_count = 35; } int attempt = 0; int sector[36]; - int maxsect = 18; - bool write = true; + int seccount = 0; - // We expect a bitstream of length 50000 for FM and 100000 for MFM - for(int head=0; head < 2; head++) + int head = 0; + int cell_size = cellsizes[0]; + int encoding = get_encoding(cell_size); + int expected_sectors = (encoding==floppy_image::MFM)? 16:9; + + while (head < 2) { - int track = 0; - while (track < maxtrack) + for (int track = 0; track < track_count; track++) { - int cell_size = cellsizes[attempt]; - int encoding = get_encoding(cell_size); - int track_size = get_track_size(cell_size, 36); // max number of sectors - - // Retrieve the cells from the flux sequence + // Retrieve the cells from the flux sequence. This also delivers the actual track size. generate_bitstream_from_track(track, head, cell_size, bitstream, act_track_size, image); // Maybe the track has become longer due to moving splices if (act_track_size > 200000000/cell_size) act_track_size = 200000000/cell_size; - int marks = decode_bitstream(bitstream, trackdata, sector, act_track_size, encoding, (encoding==floppy_image::FM)? 0xff:0x4e, track_size); + LOGMASKED(LOG_DETAIL, "[ti99_dsk] Getting sectors from track %d, head %d\n", track, head); + seccount = get_sectors(bitstream, act_track_size, encoding, track, head, expected_sectors, sectordata, sector); + LOGMASKED(LOG_DETAIL, "[ti99_dsk] Seccount = %d\n", seccount); - if (track==0) + // We may have more sectors in MFM (18). This is OK in track 0; otherwise we need to restart the process. + if (track==0 && head==0) { - if (head==0) + if (seccount==18 && expected_sectors==16) { - // Find the highest sector in the track - // This is only needed for the SDF format - int i=35; - while (i>=0 && sector[i]==-1) i--; + LOGMASKED(LOG_INFO, "[ti99_dsk] Using full 18 sectors/track format for MFM\n"); + expected_sectors=18; + } + } + else + { + if (seccount==18 && expected_sectors==16) + { + // This happens when we assumed 16 sectors/track up to here + // and now the track uses 18 tracks. We need to start over, + // assuming 18 sectors/track, and adding empty sectors + // where necessary + head = -1; + LOGMASKED(LOG_WARN, "[ti99_dsk] Tracks with variable sector count; assuming 18 sectors/track\n"); + break; + } + } - if (i>18) maxsect = 36; - else + if (seccount < 3 && track == 0) + { + if (head == 0) + { + // Bad cell size. + LOGMASKED(LOG_DETAIL, "[ti99_dsk] Decoding with cell size %d failed.\n", cell_size); + attempt++; + if (attempt == 4) { - if (i>16) maxsect = 18; - else - { - if (i>9) maxsect = 16; - else maxsect = 9; - } + LOGMASKED(LOG_INFO, "[ti99_dsk] Unsupported cell size or unformatted medium.\n"); + return false; } - if (TRACE) osd_printf_info("ti99_dsk: Sectors/track: %d\n", maxsect); - - // We try different cell sizes until we find a fitting size. - // If this fails, we fall back to a size of 2000 ns - // The criterion for a successful decoding is that we find at least - // 6 ID or data address marks on the track. It is highly unlikely - // to find so many marks with a wrong cell size. - if (marks < 6 && attempt < 3) + else { - if (TRACE) osd_printf_verbose("ti99_dsk: Decoding with cell size %d failed.\n", cell_size); - attempt++; - write = false; + // Pick a new cell size + cell_size = cellsizes[attempt]; + encoding = get_encoding(cell_size); + expected_sectors = (encoding==floppy_image::MFM)? 16:9; } - else write = true; + head = -1; + break; } else { - if (marks < 6) + // head 0 already done, but head 1 failing + if (min_heads()==1) { - // There are no address marks on track 0, head 1. - if (min_heads()==1) - { - if (TRACE) osd_printf_info("ti99_dsk: We don't have a second side and the format allows for single-sided recording.\n"); - return true; - } - else - { - osd_printf_warning("ti99_dsk: No second side, but this format requires two-sided recording. Saving empty tracks.\n"); - } + LOGMASKED(LOG_INFO, "[ti99_dsk] Saving as single-sided\n"); + break; } - } - } - - if (write) - { - if (TRACE) - { - if (head == 0 && track == 0) + else { - if (marks >=6) { if (TRACE) osd_printf_info("ti99_dsk: Decoding with cell size %d successful.\n", cell_size); } - else osd_printf_info("ti99_dsk: No address marks found on track 0. Assuming FM format.\n"); + LOGMASKED(LOG_WARN, "[ti99_dsk] Saving empty tracks on second side\n"); } } - // Save to the file - write_track(io, trackdata, sector, track, head, maxsect, maxtrack, track_size); - track++; } + + // Save to the file + write_track(io, sectordata, sector, track, head, seccount, track_count); } + head++; } - return true; } -void ti99_floppy_format::generate_track_fm(int track, int head, int cell_size, uint8_t* trackdata, floppy_image *image) +enum +{ + GAP0 = 0, GAP1, GAP2, GAP3, GAPBYTE, SYNC +}; + +/* + Build a new track from sector contents. +*/ +void ti99_floppy_format::generate_fm_track_from_sectors(floppy_image *image, uint8_t *sectordata, int sector_count, int *sectornmb, int *secoffset, int track, int trackid, int head) { - int track_size_cells = 200000000/cell_size; std::vector<uint32_t> buffer; - // The TDF has a long track lead-out that makes the track length sum up - // to 3253; this is too long for the number of cells in the real track. - // This was either an error when that format was defined, - // or it is due to the fact that when reading a track via - // the controller, after the track has been read, the controller still - // delivers some FF values until it times out. + const int param[6] = { 10, 26, 11, 28, 0xff, 6 }; - // Accordingly, we limit the track size to cell_number / 16, - // which means 3125 for FM - // This also means that Gap 4 (lead-out) is not 231 bytes long but only 103 bytes + // cell size in ns + const int cell_size = 4000; + const int cell_count = 200000000/cell_size; - int track_size = track_size_cells / 16; + int sectorpartlen = 2*param[SYNC] + 10 + param[GAP2] + SECTOR_SIZE + param[GAP3]; + int tracklen = param[GAP1] + sector_count * sectorpartlen; + if (param[GAP0]!=0) tracklen += param[GAP0] + param[SYNC] + 1; + // The remaining bytes are filled with the gap byte as gap 4. + int gap4 = cell_count/16 - tracklen; - short crc1, crc2, found_crc; - int start = 16; + uint16_t crc = 0; - if (check_for_address_marks(trackdata, floppy_image::FM)==false) - { - if (head==0 && track==0) osd_printf_warning("ti99_dsk: Cannot find FM address marks on track %d, head %d; likely broken or unformatted.\n", track, head); - return; - } + // Create Gap 0 and Index AM + for (int i=0; i < param[GAP0]; i++) + fm_w(buffer, 8, param[GAPBYTE], cell_size); + + for (int i=0; i < param[SYNC]; i++) + fm_w(buffer, 8, 0x00, cell_size); + + raw_w(buffer, 16, 0xf77a, cell_size); // IXAM - // Found a track; we now know where the address marks are: - // (start is positioned at the pre-id gap) - // IDAM: start + 6 + n*334 - // DAM: start + 30 + n*334 - // and the CRCs are at - // CRC1: start + 11 + n*334 - // CRC2: start + 287 + n*334 - // If the CRCs are F7F7, we recalculate them. - for (int i=0; i < track_size; i++) + // and Gap 1 + for (int i=0; i < param[GAP1]; i++) + fm_w(buffer, 8, param[GAPBYTE], cell_size); + + // For each sector + for (int j=0; j < sector_count; j++) { - if (((i-start-6)%334==0) && (i < start + 9*334)) + // If the sector is not available, create an empty space of zeros + if (sectornmb[j]==-1) { - // IDAM - raw_w(buffer, 16, 0xf57e, cell_size); + for (int i=0; i < sectorpartlen; i++) + raw_w(buffer, 16, 0x0000, cell_size); } else { - if (((i-start-30)%334==0) && (i < start + 9*334)) + // Sync + for (int i=0; i < param[SYNC]; i++) + fm_w(buffer, 8, 0x00, cell_size); + raw_w(buffer, 16, 0xf57e, cell_size); // IDAM + + crc = ccitt_crc16_one(0xffff, 0xfe); + + // Header + fm_w(buffer, 8, trackid, cell_size); + crc = ccitt_crc16_one(crc, trackid); + fm_w(buffer, 8, head, cell_size); + crc = ccitt_crc16_one(crc, head); + fm_w(buffer, 8, sectornmb[j], cell_size); + crc = ccitt_crc16_one(crc, sectornmb[j]); + fm_w(buffer, 8, 0x01, cell_size); + crc = ccitt_crc16_one(crc, 0x01); + // CRC + fm_w(buffer, 8, (crc>>8)&0xff, cell_size); + fm_w(buffer, 8, crc&0xff, cell_size); + + // Gap 2 + for (int i=0; i < param[GAP2]; i++) + fm_w(buffer, 8, param[GAPBYTE], cell_size); + // Sync + for (int i=0; i < param[SYNC]; i++) + fm_w(buffer, 8, 0x00, cell_size); + raw_w(buffer, 16, 0xf56f, cell_size); // DAM + crc = ccitt_crc16_one(0xffff, 0xfb); + + // Sector contents + for (int k=0; k < SECTOR_SIZE; k++) { - // DAM - // FB (1111010101101111) = normal data, F8 (1111010101101010)= deleted data - raw_w(buffer, 16, (trackdata[i]==0xf8)? 0xf56a : 0xf56f, cell_size); - } - else - { - if (((i-start-11)%334==0) && (i < start + 9*334)) - { - // CRC1 - crc1 = ccitt_crc16(0xffff, &trackdata[i-5], 5); - found_crc = (trackdata[i]<<8 | trackdata[i+1]); - if ((found_crc & 0xffff) == 0xf7f7) - { - // PC99 format: no real CRC; replace it - // Also, when converting from SDF we let this method create the proper CRC. - // osd_printf_verbose("Warning: PC99 format using pseudo CRC1; replace by %04x\n", crc1); - trackdata[i] = (crc1 >> 8) & 0xff; - trackdata[i+1] = crc1 & 0xff; - found_crc = crc1; - } - if (crc1 != found_crc) - { - osd_printf_error("ti99_dsk: Warning: CRC1 does not match (track=%d, head=%d). Found = %04x, calc = %04x\n", track, head, found_crc& 0xffff, crc1& 0xffff); - } - } - else - { - if (((i-start-287)%334==0) && (i < start + 9*334)) - { - // CRC2 - crc2 = ccitt_crc16(0xffff, &trackdata[i-SECTOR_SIZE-1], SECTOR_SIZE+1); - found_crc = (trackdata[i]<<8 | trackdata[i+1]); - if ((found_crc & 0xffff) == 0xf7f7) - { - // PC99 format: no real CRC; replace it - // osd_printf_verbose("Warning: PC99 format using pseudo CRC2; replace by %04x\n", crc2); - trackdata[i] = (crc2 >> 8) & 0xff; - trackdata[i+1] = crc2 & 0xff; - found_crc = crc2; - } - if (crc2 != found_crc) - { - osd_printf_error("ti99_dsk: Warning: CRC2 does not match (track=%d, head=%d). Found = %04x, calc = %04x\n", track, head, found_crc& 0xffff, crc2& 0xffff); - } - } - } - fm_w(buffer, 8, trackdata[i], cell_size); + fm_w(buffer, 8, sectordata[secoffset[j]+k], cell_size); + crc = ccitt_crc16_one(crc, sectordata[secoffset[j]+k]); } + // CRC + fm_w(buffer, 8, (crc>>8)&0xff, cell_size); + fm_w(buffer, 8, crc&0xff, cell_size); + + // Gap 3 + for (int i=0; i < param[GAP3]; i++) + fm_w(buffer, 8, param[GAPBYTE], cell_size); } } + // and fill the remaining bytes with gap bytes + for (int i=0; i < gap4; i++) + fm_w(buffer, 8, param[GAPBYTE], cell_size); + generate_track_from_levels(track, head, buffer, 0, image); } -void ti99_floppy_format::generate_track_mfm(int track, int head, int cell_size, uint8_t* trackdata, floppy_image *image) +void ti99_floppy_format::generate_mfm_track_from_sectors(floppy_image *image, uint8_t *sectordata, int sector_count, int *sectornmb, int *secoffset, int track, int trackid, int head) { - int track_size_cells = 200000000/cell_size; + // MFM16: (80,50,22,50,4e,12) + // MFM18/36: (10,30,22,21,4e,12) + // A1: 0x4489 01 00 01 00 10 *00 10 01 + // C2: 0x5224 01 01 00 10 *00 10 01 00 std::vector<uint32_t> buffer; - // See above - // We limit the track size to cell_number / 16, which means 6250 for MFM - // Here, Gap 4 is actually only 90 bytes long - // (not 712 as specified in the TDF format) - int track_size = track_size_cells / 16; + const int mfm16param[7] = { 80, 50, 22, 50, 0x4e, 12 }; + const int mfm18param[7] = { 10, 30, 22, 21, 0x4e, 12 }; + const int *param = mfm18param; - short crc1, crc2, found_crc; - int start = 40; + // cell size in ns + int cell_size = 2000; - if (check_for_address_marks(trackdata, floppy_image::MFM)==false) + if (sector_count < 30) { - if (track==0 && head==0) osd_printf_error("ti99_dsk: Cannot find MFM address marks on track %d, head %d; likely broken or unformatted.\n", track, head); - return; + cell_size = 2000; + if (sector_count == 16) param = mfm16param; } + else cell_size = 1000; + + int cell_count = 200000000/cell_size; + + int sectorpartlen = 2*param[SYNC] + 16 + param[GAP2] + SECTOR_SIZE + param[GAP3]; + int tracklen = param[GAP1] + sector_count * sectorpartlen; + if (param[GAP0]!=0) tracklen += param[GAP0] + param[SYNC] + 4; + // The remaining bytes are filled with the gap byte as gap 4. + int gap4 = cell_count/16 - tracklen; + + uint16_t crc = 0; + + // Create Gap 0 and Index AM + for (int i=0; i < param[GAP0]; i++) + mfm_w(buffer, 8, param[GAPBYTE], cell_size); - // Found a track; we now know where the address marks are: - // (start is positioned at the pre-id gap) - // IDAM: start + 10 + n*340 (starting at first a1) - // DAM: start + 54 + n*340 (starting at first a1) - // and the CRCs are at - // CRC1: start + 18 + n*340 - // CRC2: start + 314 + n*334 + for (int i=0; i < param[SYNC]; i++) + mfm_w(buffer, 8, 0x00, cell_size); - for (int i=0; i < track_size; i++) + for (int i=0; i < 3; i++) + raw_w(buffer, 16, 0x5224, cell_size); + mfm_w(buffer, 8, 0xfc, cell_size); + + // and Gap 1 + for (int i=0; i < param[GAP1]; i++) + mfm_w(buffer, 8, param[GAPBYTE], cell_size); + + // For each sector + for (int j=0; j < sector_count; j++) { - if (((i-start-10)%340==0) && (i < start + 18*340)) + // If the sector is not available, create an empty space of zeros + if (sectornmb[j]==-1) { - // IDAM - for (int j=0; j < 3; j++) - raw_w(buffer, 16, 0x4489, cell_size); // 3 times A1 - i += 2; + for (int i=0; i < sectorpartlen; i++) + raw_w(buffer, 16, 0x0000, cell_size); } else { - if (((i-start-54)%340==0) && (i < start + 18*340)) + // Sync + for (int i=0; i < param[SYNC]; i++) + mfm_w(buffer, 8, 0x00, cell_size); + // IDAM + for (int i=0; i < 3; i++) + raw_w(buffer, 16, 0x4489, cell_size); + mfm_w(buffer, 8, 0xfe, cell_size); + + crc = 0xb230; // pre-init including IDAM + + // Header + mfm_w(buffer, 8, trackid, cell_size); + crc = ccitt_crc16_one(crc, trackid); + mfm_w(buffer, 8, head, cell_size); + crc = ccitt_crc16_one(crc, head); + mfm_w(buffer, 8, sectornmb[j], cell_size); + crc = ccitt_crc16_one(crc, sectornmb[j]); + mfm_w(buffer, 8, 0x01, cell_size); + crc = ccitt_crc16_one(crc, 0x01); + // CRC + mfm_w(buffer, 8, (crc>>8)&0xff, cell_size); + mfm_w(buffer, 8, crc&0xff, cell_size); + + // Gap 2 + for (int i=0; i < param[GAP2]; i++) + mfm_w(buffer, 8, param[GAPBYTE], cell_size); + // Sync + for (int i=0; i < param[SYNC]; i++) + mfm_w(buffer, 8, 0x00, cell_size); + + // DAM + for (int i=0; i < 3; i++) + raw_w(buffer, 16, 0x4489, cell_size); + mfm_w(buffer, 8, 0xfb, cell_size); + crc = 0xe295; // pre-init including DAM + + // Sector contents + for (int k=0; k < SECTOR_SIZE; k++) { - // DAM - for (int j=0; j < 3; j++) - raw_w(buffer, 16, 0x4489, cell_size); // 3 times A1 - i += 2; - } - else - { - if (((i-start-18)%340==0) && (i < start + 18*340)) - { - // CRC1 - // The CRC also covers the three A1 bytes! - crc1 = ccitt_crc16(0xffff, &trackdata[i-8], 8); - found_crc = (trackdata[i]<<8 | trackdata[i+1]); - if ((found_crc & 0xffff) == 0xf7f7) - { - // PC99 format: pseudo CRC; replace it - // osd_printf_verbose("Warning: PC99 format using pseudo CRC1; replace by %04x\n", crc1); - trackdata[i] = (crc1 >> 8) & 0xff; - trackdata[i+1] = crc1 & 0xff; - found_crc = crc1; - } - if (crc1 != found_crc) - { - osd_printf_error("ti99_dsk: Warning: CRC1 does not match (track=%d, head=%d). Found = %04x, calc = %04x\n", track, head, found_crc & 0xffff, crc1& 0xffff); - } - } - else - { - if ((i > 340) && ((i-start-314)%340==0) && (i < start + 18*340)) - { - // CRC2 - crc2 = ccitt_crc16(0xffff, &trackdata[i-SECTOR_SIZE-4], SECTOR_SIZE+4); - found_crc = (trackdata[i]<<8 | trackdata[i+1]); - if ((found_crc & 0xffff) == 0xf7f7) - { - // PC99 format: pseudo CRC; replace it - // osd_printf_verbose("Warning: PC99 format using pseudo CRC2; replace by %04x\n", crc2); - trackdata[i] = (crc2 >> 8) & 0xff; - trackdata[i+1] = crc2 & 0xff; - found_crc = crc2; - } - if (crc2 != found_crc) - { - osd_printf_error("ti99_dsk: Warning: CRC2 does not match (track=%d, head=%d). Found = %04x, calc = %04x\n", track, head, found_crc& 0xffff, crc2& 0xffff); - } - } - } - mfm_w(buffer, 8, trackdata[i], cell_size); + mfm_w(buffer, 8, sectordata[secoffset[j]+k], cell_size); + crc = ccitt_crc16_one(crc, sectordata[secoffset[j]+k]); } + // CRC + mfm_w(buffer, 8, (crc>>8)&0xff, cell_size); + mfm_w(buffer, 8, crc&0xff, cell_size); + + // Gap 3 + for (int i=0; i < param[GAP3]; i++) + mfm_w(buffer, 8, param[GAPBYTE], cell_size); } } + // and fill the remaining bytes with gap bytes + for (int i=0; i < gap4; i++) + mfm_w(buffer, 8, param[GAPBYTE], cell_size); generate_track_from_levels(track, head, buffer, 0, image); } @@ -500,44 +543,57 @@ void ti99_floppy_format::generate_track_mfm(int track, int head, int cell_size, enum { FMIDAM, + A1IDAM1, + A1IDAM2, + A1IDAM3, MFMIDAM, + MFMIDENT, HEADER, FMDAM, + A1DAM1, + A1DAM2, + A1DAM3, MFMDAM, DATA }; /* - Decodes the bitstream into a TDF track image. - Returns the number of detected marks. + Retrieve all sectors from the track, given as a bitstream. + The sectors are assumed to have a length of 256 byte, and their sequence + is stored in the secnumber array. */ -int ti99_floppy_format::decode_bitstream(const uint8_t *bitstream, uint8_t *trackdata, int* sector, int cell_count, int encoding, uint8_t gapbytes, int track_size) +int ti99_floppy_format::get_sectors(const uint8_t *bitstream, int cell_count, int encoding, int track, int head, int sectors, uint8_t *sectordata, int *secnumber) { - int databytes = 0; - int a1count = 0; + int bitpos = 0; int lastpos = 0; - int headerbytes = 0; - int curpos = 0; - uint8_t curbyte = 0; + int spos = 0; + int seccount = 0; uint16_t shift_reg = 0; - int tpos = 0; - int pos = 0; - int state; - int marks = 0; - int current_sector = 0; - - // Init track - memset(trackdata, 0x00, track_size); + int bytepos = 0; + uint8_t databyte = 0; + uint8_t curbyte = 0; + int rep = 0; + int cursect = 0; - for (int i=0; i < 36; i++) sector[i] = -1; + // An array of flags (max 32), set for each found sector + uint32_t foundsectors = 0; - state = (encoding==floppy_image::MFM)? MFMIDAM : FMIDAM; + int maxsect = (encoding==floppy_image::MFM)? 18 : 9; + int first = (encoding==floppy_image::MFM)? A1IDAM1 : FMIDAM; + int state = first; - while (pos < cell_count && tpos < track_size) + while (bitpos < cell_count) { + LOGMASKED(LOG_SHIFT, "[ti99_dsk] shift = %04x\n", shift_reg); shift_reg = (shift_reg << 1) & 0xffff; - if ((pos & 0x07)==0) curbyte = bitstream[curpos++]; + if ((bitpos & 0x07)==0) curbyte = bitstream[bytepos++]; if ((curbyte & 0x80) != 0) shift_reg |= 1; + + if (((bitpos - lastpos) & 1)==0) + { + databyte = (databyte << 1) & 0xff; + databyte |= shift_reg & 1; + } curbyte <<= 1; switch (state) @@ -545,157 +601,273 @@ int ti99_floppy_format::decode_bitstream(const uint8_t *bitstream, uint8_t *trac case FMIDAM: if (shift_reg == 0xf57e) { - marks++; - // Found a header - headerbytes = 5; - // Create GAP0 at the beginning or GAP3 later - if (tpos==0) - tpos += 16; - else - for (int i=0; i < 45; i++) trackdata[tpos++] = gapbytes; - - // IDAM sync bytes - tpos += 6; - trackdata[tpos++] = 0xfe; + // IDAM found + LOGMASKED(LOG_DETAIL, "[ti99_dsk] IDAM found at %05x\n", bitpos); state = HEADER; - lastpos = pos; + lastpos = bitpos; + rep = 0; } break; - - case MFMIDAM: - // Count three subsequent A1 + case A1IDAM1: if (shift_reg == 0x4489) { - if (lastpos > 0) + state = A1IDAM2; + lastpos = bitpos; + } + break; + case A1IDAM2: + case A1IDAM3: + if (bitpos - lastpos == 16) + { + if (shift_reg == 0x4489) { - if (pos - lastpos == 16) a1count++; - else a1count = 1; + state = (state==A1IDAM2)? A1IDAM3 : MFMIDENT; } - else a1count = 1; - - lastpos = pos; + else + { + LOGMASKED(LOG_WARN, "[ti99_dsk] Error: Missing A1, not a header at %05x\n", bitpos); + state = A1IDAM1; + } + lastpos = bitpos; } - if (a1count == 3) + break; + + case MFMIDENT: + if (bitpos - lastpos == 16) { - marks++; - // Found a header - headerbytes = 6; - // Create GAP0 at the beginning or GAP3 later - if (tpos==0) - for (int i=0; i < 40; i++) trackdata[tpos++] = gapbytes; + if (databyte != 0xfe) + { + LOGMASKED(LOG_WARN, "[ti99_dsk] Error: Ident (found) = %02x, expected = fe; skipping header\n", databyte); + state = A1IDAM1; + } else - for (int i=0; i < 24; i++) trackdata[tpos++] = gapbytes; - - // IDAM sync bytes - tpos += 10; - state = HEADER; - trackdata[tpos++] = 0xa1; - trackdata[tpos++] = 0xa1; - trackdata[tpos++] = 0xa1; + { + rep = 0; + state = HEADER; + } + lastpos = bitpos; } break; - case HEADER: - if (pos - lastpos == 16) + // Get the header, store the sector number, and report any + // unexpected contents in the other fields. When invalid, skip + // that header. + if (bitpos - lastpos == 16) { - // Transfer header bytes - trackdata[tpos] = get_data_from_encoding(shift_reg); + LOGMASKED(LOG_HEADER, "[ti99_dsk] Header byte: %02x\n", databyte); - if (headerbytes == 3) current_sector = trackdata[tpos]; - tpos++; - - if (headerbytes == 0) + switch (rep) { - state = (encoding==floppy_image::MFM)? MFMDAM : FMDAM; - a1count = 0; + case 0: + if (databyte > 79) + { + // Illegal cylinder, ignore this header. + LOGMASKED(LOG_WARN, "[ti99_dsk] Error: Track (found) = %d, must be less than 80; skipping header.\n", databyte); + state = (encoding==floppy_image::MFM)? A1IDAM1 : FMIDAM; + break; + } + // Consider double stepping + if (databyte != track && databyte != track/2) + LOGMASKED(LOG_WARN, "[ti99_dsk] Warning: Track (found) = %d, assuming %d\n", databyte, track); + break; + case 1: + if (databyte > 2) + { + // Illegal head, ignore this header. + LOGMASKED(LOG_WARN, "[ti99_dsk] Error: Head (found) = %d, must be less than 2; skipping header.\n", databyte); + state = (encoding==floppy_image::MFM)? A1IDAM1 : FMIDAM; + break; + } + if (databyte != head) + LOGMASKED(LOG_WARN, "[ti99_dsk] Warning: Head (found) = %d, assuming = %d\n", databyte, head); + break; + case 2: + if (databyte >= maxsect) + { + // Illegal sector, ignore this header. + LOGMASKED(LOG_WARN, "[ti99_dsk] Error: Sector number (found) = %d, must be less than %d; skipping header\n", databyte, maxsect); + state = (encoding==floppy_image::MFM)? A1IDAM1 : FMIDAM; + } + else cursect = databyte; + + if ((foundsectors & (1 << cursect)) != 0) + { + // Sector already appeared; discard it + LOGMASKED(LOG_WARN, "[ti99_dsk] Error: Sector number (found) = %d already appeared; skipping header\n", databyte); + state = (encoding==floppy_image::MFM)? A1IDAM1 : FMIDAM; + } + break; + case 3: + if (databyte != 1) + { + // Illegal sector, ignore this header. + LOGMASKED(LOG_WARN, "[ti99_dsk] Error: Sector size (found) = %d, must be 1; skipping header\n", databyte); + state = (encoding==floppy_image::MFM)? A1IDAM1 : FMIDAM; + } + else + { + state = (encoding==floppy_image::MFM)? A1DAM1 : FMDAM; + } + rep = -1; + break; } - else headerbytes--; - lastpos = pos; + rep++; + lastpos = bitpos; } break; - case FMDAM: + if (bitpos - lastpos > 500) + { + LOGMASKED(LOG_WARN, "[ti99_dsk] Error: DAM too far away, skipping header\n"); + state = FMIDAM; + break; + } + if (shift_reg == 0xf57e) + { + LOGMASKED(LOG_WARN, "[ti99_dsk] Error: Expected DAM, found next IDAM; skipping header\n"); + state = HEADER; // continue with reading the header + lastpos = bitpos; + break; + } if (shift_reg == 0xf56a || shift_reg == 0xf56f) { - if (pos - lastpos > 400) + // DAM found + LOGMASKED(LOG_DETAIL, "[ti99_dsk] DAM found: %04x\n", bitpos); + state = DATA; + rep = 0; + lastpos = bitpos; + secnumber[seccount++] = cursect; + // Keep track of the found sectors + foundsectors |= (1 << cursect); + } + break; + case A1DAM1: + if (bitpos - lastpos > 1000) + { + LOGMASKED(LOG_WARN, "[ti99_dsk] Error: A1/DAM too far away, skipping header\n"); + state = A1IDAM1; + break; + } + if (shift_reg == 0x4489) + { + state = A1DAM2; + lastpos = bitpos; + } + break; + case A1DAM2: + case A1DAM3: + if (bitpos - lastpos == 16) + { + if (shift_reg == 0x4489) { - // Too far apart - state = FMIDAM; - // Abort this sector, skip to the next - tpos += 321; - a1count = 1; - break; + state = (state==A1DAM2)? A1DAM3 : MFMDAM; } - marks++; - // Add GAP2 and DAM sync - for (int i=0; i < 11; i++) trackdata[tpos++] = 0xff; - tpos += 6; - state = DATA; - databytes = 257; - trackdata[tpos++] = (shift_reg==0xf56a)? 0xf8 : 0xfb; - lastpos = pos; - sector[current_sector] = tpos; + else + { + LOGMASKED(LOG_WARN, "[ti99_dsk] Error: Missing A1, not a data field at %05x\n", bitpos); + state = A1IDAM1; + } + lastpos = bitpos; } break; case MFMDAM: - // Count three subsequent A1 - if (shift_reg == 0x4489) + if (bitpos - lastpos == 16) { - if (pos - lastpos > 560) + if (databyte == 0xfe) { - // Too far apart - state = MFMIDAM; - // Abort this sector, skip to the next - tpos += 320; - a1count = 1; + LOGMASKED(LOG_WARN, "[ti99_dsk] Error: Expected DAM, found next IDAM; skipping header\n"); + state = HEADER; // continue with reading the header + lastpos = bitpos; break; } - if (lastpos > 0) + if (databyte != 0xf8 && databyte != 0xfb) { - if (pos - lastpos == 16) a1count++; - else a1count = 1; + LOGMASKED(LOG_WARN, "[ti99_dsk] Error: DAM (found) = %02x, expected = f8 or fb; skipping header\n", databyte); + state = HEADER; // continue with reading the header } - else a1count = 1; - - lastpos = pos; - } - if (a1count == 3) - { - marks++; - // Add GAP2 and DAM sync - for (int i=0; i < 22; i++) trackdata[tpos++] = gapbytes; - tpos += 12; - trackdata[tpos++] = 0xa1; - trackdata[tpos++] = 0xa1; - trackdata[tpos++] = 0xa1; - state = DATA; - databytes = 258; - sector[current_sector] = tpos+1; + else + { + state = DATA; + secnumber[seccount++] = cursect; + // Keep track of the found sectors + foundsectors |= (1 << cursect); + } + rep = 0; + lastpos = bitpos; } break; case DATA: - if (pos - lastpos == 16) + if (bitpos - lastpos == 16) { - // Ident byte - trackdata[tpos++] = get_data_from_encoding(shift_reg); - if (databytes > 0) databytes--; + if (rep < 256) + { + sectordata[spos++] = databyte; + } else { - state = (encoding==floppy_image::MFM)? MFMIDAM : FMIDAM; - a1count = 0; + state = first; } - lastpos = pos; + rep++; + lastpos = bitpos; } break; } - pos++; + bitpos++; + } + + // We start with 9 sectors (FM) and 16 sectors (MFM) + // If we have 18 sectors in MFM, and we have track 0/head 0, then accept + // it, and switch to expected = 18. + // If we have expected=16 and find sectors past sector 15, + // and track!=0 or head!=0, then stop + // the creation and restart with expected=18. + + // We now add all remaining, unfound sectors to complete the track + // If all sectors were found, this loop is skipped + int j = 0; + int actual_sectors = seccount; + LOGMASKED(LOG_DETAIL, "[ti99_dsk] Sector map: %08x\n", foundsectors); + + // Don't try to fill the first track + if (track==0 && head==0 && seccount<3) + return seccount; + + if (seccount < sectors) + { + LOGMASKED(LOG_INFO, "[ti99_dsk] %d missing sectors in track %d, head %d, adding as empty\n", sectors-seccount, track, head); + } + + for (int i = seccount; i < sectors; i++) + { + // Search the next missing sector number. All sectors that were + // found have a 1 at their bit position in foundsectors. + while ((foundsectors & 1)!=0 && j < sectors) + { + foundsectors >>= 1; + j++; + } + LOGMASKED(LOG_INFO, "[ti99_dsk] add empty sector %d\n", j); + // Add the sector + secnumber[seccount++] = j; + foundsectors >>= 1; + j++; + // Create an empty sector + for (int k=0; k < 256; k++) + sectordata[spos++] = 0xe5; } - return marks; + + LOGMASKED(LOG_INTERLEAVE, "[ti99_dsk] End of track reached, sectors = %d\n", seccount); + LOGMASKED(LOG_INTERLEAVE, "[ti99_dsk] Sector sequence: "); + for (int i=0; i < seccount; i++) + LOGMASKED(LOG_INTERLEAVE, "%d ", secnumber[i]); + LOGMASKED(LOG_INTERLEAVE, "\n"); + return actual_sectors; } + uint8_t ti99_floppy_format::get_data_from_encoding(uint16_t raw) { return (raw & 0x4000 ? 0x80 : 0x00) | @@ -758,36 +930,26 @@ int ti99_sdf_format::identify(io_generic *io, uint32_t form_factor) // Adding support for another sector image format which adds 768 bytes // as a bad sector map - if ((file_size / SECTOR_SIZE) % 10 == 3) - { - if (TRACE) osd_printf_info("ti99_dsk: Stripping map of bad sectors at image end\n"); - file_size -= SECTOR_SIZE*3; - } - - // Formats with 9 or 18 sectors per track (multiples of SSSD) - // 40-track formats: SSSD/9/40 (1), DSSD/9/40 (2), SSDD/18/40 (2), DSDD/18/40 (4) - // 80-track formats: SSSD/9/80 (2), DSSD/9/80 (4), SSDD/18/80 (4), DSDD/18/80,(8) - // High density: DSQD/36/80 (16) (experimental) + if (((file_size - 768) % (SECTOR_SIZE*360)) == 0) + file_size -= 768; // All formats apply for 5.25" and 3.5" form factors - - // Default formats (when the geometry cannot be determined from the VIB) - // (1) -> SSSD - // (2) -> DSSD - // (4) -> DSDD - // (8) -> DSDD80 - // (16) -> DSQD - - if ((file_size % 92160)==0) + switch (file_size) { - int multiple = file_size/92160; - if ((multiple == 1) || (multiple == 2) || (multiple == 4) || (multiple == 8) || (multiple == 16)) vote = 50; + case 92160: // SSSD + case 163840: // SSDD16 + case 184320: // DSSD + case 327680: // DSDD16 + case 368640: // DSDD + case 737280: // DSDD80 + case 1474560: // DSQD + vote = 50; + break; + default: + vote = 0; + break; } - // Formats with 16 sectors per track (rare, SSDD/16/40, DSDD/16/40). - if (file_size == 163840) vote = 50; - if (file_size == 327680) vote = 50; - if (vote > 0) { // Read first sector (Volume Information Block) @@ -797,15 +959,15 @@ int ti99_sdf_format::identify(io_generic *io, uint32_t form_factor) // Check from contents if ((vib.id[0]=='D')&&(vib.id[1]=='S')&&(vib.id[2]=='K')) { - if (TRACE) osd_printf_info("ti99_dsk: Found formatted SDF disk medium\n"); + LOGMASKED(LOG_INFO, "[ti99_dsk] Found formatted SDF disk medium\n"); vote = 100; } else { - if (TRACE) osd_printf_info("ti99_dsk: No valid VIB found; disk may be unformatted\n"); + LOGMASKED(LOG_INFO, "[ti99_dsk] No valid VIB found; disk may be unformatted\n"); } } - else if (TRACE) osd_printf_info("ti99_dsk: Disk image is not a SDF image\n"); + else LOGMASKED(LOG_INFO, "[ti99_dsk] Disk image is not a SDF image\n"); return vote; } @@ -820,8 +982,9 @@ void ti99_sdf_format::determine_sizes(io_generic *io, int& cell_size, int& secto bool have_vib = false; - // See above - if ((file_size / SECTOR_SIZE) % 10 == 3) file_size -= SECTOR_SIZE*3; + // Remove the bad sector map + if (((file_size - 768) % (SECTOR_SIZE*360)) == 0) + file_size -= 768; // Read first sector io_generic_read(io, &vib, 0, sizeof(ti99vib)); @@ -841,7 +1004,7 @@ void ti99_sdf_format::determine_sizes(io_generic *io, int& cell_size, int& secto if (vib.density < 4) cell_size = 2000; else cell_size = 1000; } - if (TRACE) osd_printf_info("ti99_dsk: VIB says that this disk is %s density with %d sectors per track, %d tracks, and %d heads\n", (cell_size==4000)? "single": ((cell_size==2000)? "double" : "high"), sector_count, vib.tracksperside, heads); + LOGMASKED(LOG_INFO, "[ti99_dsk] VIB says that this disk is %s density with %d sectors per track, %d tracks, and %d heads\n", (cell_size==4000)? "single": ((cell_size==2000)? "double" : "high"), sector_count, vib.tracksperside, heads); have_vib = true; tracks = vib.tracksperside; } @@ -881,169 +1044,119 @@ void ti99_sdf_format::determine_sizes(io_generic *io, int& cell_size, int& secto { if (sector_count == 16 && sector_count1 == 18) { - osd_printf_warning("ti99_dsk: Warning: Invalid 16-sector format. Assuming 18 sectors.\n"); + LOGMASKED(LOG_WARN, "[ti99_dsk] Warning: Invalid 16-sector format. Assuming 18 sectors.\n"); sector_count = 18; } else { if (heads == 2 && ((cell_size1 != cell_size) || (sector_count1 != sector_count))) - osd_printf_warning("ti99_dsk: Warning: Disk image size does not correspond with format information in VIB.\n"); + LOGMASKED(LOG_WARN, "[ti99_dsk] Warning: Disk image size does not correspond with format information in VIB.\n"); } } else { - heads = (file_size < 100000)? 1 : 2; // for SSSD + heads = (file_size < 180000)? 1 : 2; // for SSSD, SSDD16 cell_size = cell_size1; sector_count = sector_count1; } } -int ti99_sdf_format::get_track_size(int cell_size, int sector_count) +int ti99_sdf_format::get_track_size(int sector_count) { return sector_count * SECTOR_SIZE; } -/* - Load a SDF image track. Essentially, we want to end up in the same - kind of track image as with the TDF, so the easiest thing is to produce - a TDF image track from the sectors and process them as if it came from TDF. - - acttrack is the actual track when double stepping is used and changes - every two physical tracks. -*/ -void ti99_sdf_format::load_track(io_generic *io, uint8_t *trackdata, int head, int track, int acttrack, int sectorcount, int trackcount, int cellsize) +void ti99_sdf_format::load_track(io_generic *io, uint8_t *sectordata, int *sector, int *secoffset, int head, int track, int sectorcount, int trackcount) { - bool fm = (cellsize==4000); - int tracksize = sectorcount * SECTOR_SIZE; - // Calculate the track offset from the beginning of the image file - int logicaltrack = head * trackcount; - logicaltrack += ((head&1)==0)? track : (trackcount - 1 - track); - - // Interleave and skew - int interleave = fm? 4 : 5; - int skew = fm? 6 : 0; + int logicaltrack = (head==0)? track : (2*trackcount - track - 1); + int position = logicaltrack * get_track_size(sectorcount); - int secsize = fm? 334 : 340; - int position = 0; - int count = 0; + io_generic_read(io, sectordata, position, sectorcount*SECTOR_SIZE); - memset(trackdata, 0x00, 9216); + // Interleave and skew + int interleave = 7; + if (sectorcount == 18) interleave = 11; + else if (sectorcount == 16) interleave = 9; - int secno = 0; - secno = (acttrack * skew) % sectorcount; + int skew = (sectorcount<10)? 6 : 0; - // Gap 1 - int gap1 = fm? 16 : 40; - for (int i=0; i < gap1; i++) trackdata[position+i] = fm? 0x00 : 0x4e; + int secno = (track * skew) % sectorcount; + // Construct the sector sequence for (int i=0; i < sectorcount; i++) { - position = secno * secsize + gap1; - // Sync - count = fm? 6 : 10; - while (count-- > 0) trackdata[position++] = 0x00; - - if (!fm) + sector[i] = secno; + secoffset[i] = secno*SECTOR_SIZE; + secno = (secno + interleave) % sectorcount; + } + if (track==0 && head==0) + { + dumpbytes(sectordata, sectorcount*SECTOR_SIZE); + LOGMASKED(LOG_TRACK, "[ti99_dsk] Sectors = "); + for (int i=0; i < sectorcount; i++) { - trackdata[position++] = 0xa1; - trackdata[position++] = 0xa1; - trackdata[position++] = 0xa1; + LOGMASKED(LOG_TRACK, "%02d ", sector[i]); } - trackdata[position++] = 0xfe; // IDAM / ident - - // Header - trackdata[position++] = acttrack; - trackdata[position++] = head; - trackdata[position++] = i; - trackdata[position++] = 1; - - trackdata[position++] = 0xf7; - trackdata[position++] = 0xf7; - - // Gap 2 - count = fm? 11 : 22; - while (count-- > 0) trackdata[position++] = fm? 0xff : 0x4e; - - // Sync - count = fm? 6 : 12; - while (count-- > 0) trackdata[position++] = 0x00; - - if (!fm) + LOGMASKED(LOG_TRACK, "\n[ti99_dsk] Offset = "); + for (int i=0; i < sectorcount; i++) { - trackdata[position++] = 0xa1; - trackdata[position++] = 0xa1; - trackdata[position++] = 0xa1; + LOGMASKED(LOG_TRACK, "%04x ", secoffset[i]); } - trackdata[position++] = 0xfb; - - io_generic_read(io, trackdata + position, logicaltrack * tracksize + i*SECTOR_SIZE, SECTOR_SIZE); - - position += SECTOR_SIZE; - trackdata[position++] = 0xf7; - trackdata[position++] = 0xf7; - - // Gap 3 - count = fm? 45 : 24; - while (count-- > 0) trackdata[position++] = fm? 0xff : 0x4e; - secno = (secno + interleave) % sectorcount; + LOGMASKED(LOG_TRACK, "\n"); } - - // Gap 4 - count = fm? 231 : 712; - position = sectorcount * secsize + gap1; - while (count-- > 0) trackdata[position++] = fm? 0xff : 0x4e; - - // if (head==0 && track==0) showtrack(trackdata, 9216); } /* For debugging. Outputs the byte array in a xxd-like way. */ -void ti99_floppy_format::showtrack(uint8_t* trackdata, int length) +void ti99_floppy_format::dumpbytes(uint8_t* trackdata, int length) { for (int i=0; i < length; i+=16) { - osd_printf_verbose("%07x: ", i); - for (int j=0; j < 16; j++) - { - osd_printf_verbose("%02x", trackdata[i+j]); - if ((j&1)==1) osd_printf_verbose(" "); - } - osd_printf_verbose(" "); - for (int j=0; j < 16; j++) - { - if (trackdata[i+j] >= 32 && trackdata[i+j]<128) osd_printf_verbose("%c", trackdata[i+j]); - else osd_printf_verbose("."); - } - osd_printf_verbose("\n"); + LOGMASKED(LOG_TRACK, "[ti99_dsk] %s\n", dumpline(trackdata+i, i).c_str()); } } +std::string ti99_floppy_format::dumpline(uint8_t* line, int address) const +{ + std::ostringstream stream; + stream << std::hex << std::setfill('0') << std::setw(6) << unsigned(address); + + for (int i=0; i < 16; i++) + { + stream << " " << std::setw(2) << (int)line[i]; + } + stream << " " ; + for (int i=0; i < 16; i++) + { + char ch = (line[i] >= 32 && line[i] < 127)? (char)line[i] : '.'; + stream << std::setw(1) << ch; + } + return stream.str(); +} + /* Write the data to the disk. We have a list of sector positions, so we - just need to go through that list and save each sector in the track data. + just need to go through that list and save each sector in the sector data. */ -void ti99_sdf_format::write_track(io_generic *io, uint8_t *trackdata, int *sector, int track, int head, int maxsect, int maxtrack, int numbytes) +void ti99_sdf_format::write_track(io_generic *io, uint8_t *sectordata, int *sector, int track, int head, int sector_count, int track_count) { uint8_t* buf; - // For creating an empty space where the sector did not exist - uint8_t empty[256]; - memset(empty, 0, 256); - int logicaltrack = head * maxtrack; - logicaltrack += ((head&1)==0)? track : (maxtrack - 1 - track); - int trackoffset = logicaltrack * maxsect * SECTOR_SIZE; + int logicaltrack = head * track_count; + logicaltrack += ((head&1)==0)? track : (track_count - 1 - track); + int trackoffset = logicaltrack * sector_count * SECTOR_SIZE; -// if (head==0 && track==0) showtrack(trackdata, 9216); - - for (int i=0; i < maxsect; i++) { - if (sector[i]==-1) buf = empty; - else buf = trackdata + sector[i]; - io_generic_write(io, buf, trackoffset + i * SECTOR_SIZE, SECTOR_SIZE); + for (int i=0; i < sector_count; i++) + { + buf = sectordata + i * SECTOR_SIZE; + LOGMASKED(LOG_DETAIL, "[ti99_dsk] Writing sector %d (offset %06x)\n", sector[i], sector[i] * SECTOR_SIZE); + io_generic_write(io, buf, trackoffset + sector[i] * SECTOR_SIZE, SECTOR_SIZE); } } + const floppy_format_type FLOPPY_TI99_SDF_FORMAT = &floppy_image_format_creator<ti99_sdf_format>; /* @@ -1078,6 +1191,9 @@ const floppy_format_type FLOPPY_TI99_SDF_FORMAT = &floppy_image_format_creator<t modified in an 80-track drive. This will automatically cause the creation of an 80-track image. + DSSD80: 520480 bytes + DSDD80: 1099520 bytes + Tracks are stored from outside to inside of head 0, then outside to inside of head 1: (Head,Track): (0,0) (0,1) (0,2) ... (0,38) (0,39) (1,0) (1,1) ... (1,39) @@ -1102,70 +1218,290 @@ const char *ti99_tdf_format::extensions() const */ int ti99_tdf_format::identify(io_generic *io, uint32_t form_factor) { - uint64_t file_size = io_generic_size(io); int vote = 0; - uint8_t trackdata[2000]; + uint8_t fulltrack[6872]; + + int cell_size = 0; + int sector_count = 0; + int heads = 0; + int tracks = 0; + int sectorinterval = 0; + int headsectoff = 0; + int pos = 0; + determine_sizes(io, cell_size, sector_count, heads, tracks); // Do we have a plausible image size? From the size alone we only give a 50 percent vote. - if ((file_size == 260240) || (file_size == 549760) || (file_size == 1099520)) + if (sector_count != 0) vote = 50; if (vote > 0) { - if (TRACE) osd_printf_error("ti99_dsk: Image looks like a TDF image\n"); + LOGMASKED(LOG_INFO, "[ti99_dsk] Image file length matches TDF\n"); + + // Fetch track 0 + io_generic_read(io, fulltrack, 0, get_track_size(sector_count)); + + if (sector_count == 9) + { + headsectoff = 24; + sectorinterval = 334; + } + else + { + headsectoff = 44; + sectorinterval = (sector_count==16)? 368 : 340; + } + + while (fulltrack[pos] != 0xfe && pos < 70) pos++; - // Get some bytes from track 0 - io_generic_read(io, trackdata, 0, 2000); + bool failed = false; + // Find the IDAMs and DAMs on track 0 + for (int i=0; i < sector_count; i++) + { + int idam = fulltrack[pos+i*sectorinterval]; + int dam = fulltrack[pos+headsectoff+i*sectorinterval]; + if ((idam != 0xfe) || ((dam != 0xfb) && (dam != 0xf8))) + { + LOGMASKED(LOG_WARN, "[ti99_dsk] Failed at %04x or %04x\n", pos+i*sectorinterval, pos+headsectoff+i*sectorinterval); + failed = true; + break; + } + } - if (check_for_address_marks(trackdata, floppy_image::FM)==true || check_for_address_marks(trackdata, floppy_image::MFM)==true) vote=100; + if (failed) + { + LOGMASKED(LOG_WARN, "[ti99_dsk] Image does not comply with TDF; may be broken or unformatted\n"); + } else { - if (TRACE) osd_printf_error("ti99_dsk: Image does not comply with TDF; may be broken or unformatted\n"); + LOGMASKED(LOG_INFO, "[ti99_dsk] Image format complies with TDF\n"); + vote = 100; } } - else if (TRACE) osd_printf_error("ti99_dsk: Disk image is not a TDF image\n"); + else LOGMASKED(LOG_INFO, "[ti99_dsk] Disk image is not a TDF image\n"); return vote; } /* - Find the proper format for a given image file. We determine the cell size, - but we do not care about the sector size (only needed by the SDF converter). + Find the proper format for a given image file. */ void ti99_tdf_format::determine_sizes(io_generic *io, int& cell_size, int& sector_count, int& heads, int& tracks) { uint64_t file_size = io_generic_size(io); heads = 2; // TDF only supports two-sided recordings - - if (file_size % get_track_size(2000, 0)==0) cell_size = 2000; - else if (file_size % get_track_size(4000, 0)==0) cell_size = 4000; - - // We could check for the content, but if we find that the content is - // FM and the size implies MFM, the calculated track count will be wrong. + tracks = 40; + // LOGMASKED(LOG_INFO, "[ti99_dsk] Image size = %ld\n", file_size); // doesn't compile + switch (file_size) + { + case 260240: // used in PC99 + cell_size = 4000; + sector_count = 9; + break; + case 491520: // 320K HX5102 + cell_size = 2000; + sector_count = 16; + break; + case 549760: // used in PC99 + cell_size = 2000; + sector_count = 18; + break; + case 520480: + cell_size = 4000; + sector_count = 9; + break; + case 983040: + cell_size = 2000; + sector_count = 16; + tracks = 80; + break; + case 1099520: + cell_size = 2000; + sector_count = 18; + tracks = 80; + break; + case 2007040: + cell_size = 1000; + sector_count = 18; + tracks = 80; + break; + default: + cell_size = 0; + sector_count = 0; + break; + } } /* - For TDF this just amounts to loading the track from the image file. - acttrack is not used here, since the file contains the track data. + Load a track. Although TDF provides us with a near-precise image of the + track, we just copy the sectors, store the sequence, and recreate the + track from scratch. TDF is not as flexible as it suggests, it does not + allow different gap lengths and so on. */ -void ti99_tdf_format::load_track(io_generic *io, uint8_t *trackdata, int head, int track, int acttrack, int sectorcount, int trackcount, int cellsize) +void ti99_tdf_format::load_track(io_generic *io, uint8_t *sectordata, int *sector, int *secoffset, int head, int track, int sectorcount, int trackcount) { - int offset = ((trackcount * head) + track) * get_track_size(cellsize, 0); - io_generic_read(io, trackdata, offset, get_track_size(cellsize, 0)); + uint8_t fulltrack[6872]; // space for a full TDF track + + // Read beginning of track 0. We need this to get the first gap, according + // to the format + io_generic_read(io, fulltrack, 0, 100); + + int offset = 0; + int tracksize = get_track_size(sectorcount); + int sectorinterval = 0; + int headsectoff = 0; + int pos = 0; + int img_sect = 0; + + if (sectorcount == 9) + { + headsectoff = 25; + sectorinterval = 334; + } + else + { + headsectoff = 45; + sectorinterval = (sectorcount==16)? 368 : 340; + } + + // Initialize the sequence lists + for (int i=0; i < sectorcount; i++) + { + sector[i] = -1; + secoffset[0] = 0; + } + + // We already verified that this is TDF, but the disk may be unformatted + while (fulltrack[pos] != 0xfe && pos < tracksize) pos++; + + if (pos==tracksize) + { + // No sectors found + LOGMASKED(LOG_WARN, "[ti99_dsk] No sectors on track %d, head %d\n", track, head); + return; + } + + offset = pos; + + int base = (head * trackcount + track) * tracksize; + int position = 0; + io_generic_read(io, fulltrack, base, tracksize); + + for (int i=0; i < sectorcount; i++) + { + position = i*sectorinterval + offset; + if (position >= 6872) + { + LOGMASKED(LOG_WARN, "[ti99_dsk] No more sectors on track %d, head %d\n", track, head); + break; // no more sectors + } + if (fulltrack[position] != 0xfe) + { + LOGMASKED(LOG_WARN, "[ti99_dsk] Invalid header (no FE) on track %d, head %d\n", track, head); + continue; // no valid header + } + img_sect = fulltrack[position+3]; + if (img_sect >= 18) + { + LOGMASKED(LOG_WARN, "[ti99_dsk] Invalid sector number (%d) on track %d, head %d\n", img_sect, track, head); + continue; // invalid sector number + } + sector[i] = img_sect; + secoffset[i] = i*SECTOR_SIZE; + position += headsectoff; + memcpy(sectordata + i*SECTOR_SIZE, fulltrack+position, SECTOR_SIZE); + } + + // dumpbytes(sectordata, sectorcount*SECTOR_SIZE); + LOGMASKED(LOG_TRACK, "[ti99_dsk] Sectors = "); + for (int i=0; i < sectorcount; i++) + { + LOGMASKED(LOG_TRACK, "%02d ", sector[i]); + } + LOGMASKED(LOG_TRACK, "\n[ti99_dsk] Offset = "); + for (int i=0; i < sectorcount; i++) + { + LOGMASKED(LOG_TRACK, "%04x ", secoffset[i]); + } + LOGMASKED(LOG_TRACK, "\n"); } /* - Also here, we just need to write the complete track on the image file. + Rebuild TDF track image + The TDF format is a bit more restrictive than it could be. The gaps need + to be of the exact size and contain the expected bytes. So we only + need the sector contents and the sector sequence, which are passed via + sectordata, sector, and sector_count. */ -void ti99_tdf_format::write_track(io_generic *io, uint8_t *trackdata, int *sector, int track, int head, int maxsect, int maxtrack, int numbytes) +void ti99_tdf_format::write_track(io_generic *io, uint8_t *sectordata, int *sector, int track, int head, int sector_count, int track_count) { - int offset = ((maxtrack * head) + track) * numbytes; - io_generic_write(io, trackdata, offset, numbytes); + uint8_t trackdata[14000]; + int offset = ((track_count * head) + track) * get_track_size(sector_count); + int a1 = 0; + + enum + { + WGAP1 = 0, WGAP2, WGAP3, WGAP4, WGAP1BYTE, WGAPBYTE, WSYNC1, WSYNC2 + }; + + const int fm9param[8] = { 16, 11, 45, 231, 0x00, 0xff, 6, 6 }; + const int mfm16param[8] = { 50, 22, 50, 206, 0x4e, 0x4e, 12, 12 }; + const int mfm18param[8] = { 40, 22, 24, 712, 0x4e, 0x4e, 10, 12 }; + const int mfm36param[8] = { 40, 22, 24, 264, 0x4e, 0x4e, 10, 12 }; + + const int *param = fm9param; + + if (sector_count == 16) + param = mfm16param; + else if (sector_count == 18) + param = mfm18param; + else if (sector_count == 36) + param = mfm36param; + + LOGMASKED(LOG_TRACK, "[ti99_dsk] Writing track %d, head %d\n", track, head); + + if (sector_count >= 16) a1 = 3; + + // Create track + int pos = 0; + for (int i=0; i < param[WGAP1]; i++) trackdata[pos++] = param[WGAP1BYTE]; + for (int j=0; j < sector_count; j++) + { + for (int i=0; i < param[WSYNC1]; i++) trackdata[pos++] = 0x00; + for (int i=0; i < a1; i++) trackdata[pos++] = 0xa1; + trackdata[pos++] = 0xfe; + trackdata[pos++] = track; + trackdata[pos++] = head; + trackdata[pos++] = sector[j]; + trackdata[pos++] = 0x01; + trackdata[pos++] = 0xf7; // PC99 does not accept real CRC values + trackdata[pos++] = 0xf7; + for (int i=0; i < param[WGAP2]; i++) trackdata[pos++] = param[WGAPBYTE]; + for (int i=0; i < param[WSYNC2]; i++) trackdata[pos++] = 0x00; + for (int i=0; i < a1; i++) trackdata[pos++] = 0xa1; + trackdata[pos++] = 0xfb; + memcpy(trackdata + pos, sectordata + j * SECTOR_SIZE, SECTOR_SIZE); + pos +=256; + trackdata[pos++] = 0xf7; + trackdata[pos++] = 0xf7; + for (int i=0; i < param[WGAP3]; i++) trackdata[pos++] = param[WGAPBYTE]; + } + for (int i=0; i < param[WGAP4]; i++) trackdata[pos++] = param[WGAPBYTE]; + io_generic_write(io, trackdata, offset, get_track_size(sector_count)); } -int ti99_tdf_format::get_track_size(int cell_size, int sector_count) +int ti99_tdf_format::get_track_size(int sector_count) { - if (cell_size == 4000) return 3253; - if (cell_size == 2000) return 6872; + switch (sector_count) + { + case 9: + return 3253; + case 16: + return 6144; + case 18: + return 6872; + case 36: + return 12544; + } return 0; } diff --git a/src/lib/formats/ti99_dsk.h b/src/lib/formats/ti99_dsk.h index d596f4bb17c..d67f38acaae 100644 --- a/src/lib/formats/ti99_dsk.h +++ b/src/lib/formats/ti99_dsk.h @@ -14,7 +14,7 @@ #define TI99_DSK_H #include "flopimg.h" -#include "wd177x_dsk.h" +#include <sstream> class ti99_floppy_format : public floppy_image_format_t { @@ -26,23 +26,23 @@ public: protected: int decode_bitstream(const uint8_t *bitstream, uint8_t *trackdata, int *sector, int cell_count, int encoding, uint8_t gapbytes, int track_size); uint8_t get_data_from_encoding(uint16_t raw); + int get_sectors(const uint8_t *bitstream, int cell_count, int encoding, int track, int head, int sectors, uint8_t *sectordata, int *secnumber); virtual int min_heads() =0; virtual void determine_sizes(io_generic *io, int& cell_size, int& sector_count, int& heads, int& tracks) =0; - virtual int get_track_size(int cell_size, int sector_count) =0; - virtual void load_track(io_generic *io, uint8_t *trackdata, int head, int track, int acttrack, int sectorcount, int trackcount, int cellsize) =0; - virtual void write_track(io_generic *io, uint8_t *trackdata, int *sector, int track, int head, int maxsect, int maxtrack, int numbytes) =0; + virtual int get_track_size(int sector_count) =0; + virtual void load_track(io_generic *io, uint8_t *sectordata, int *sector, int *secoffset, int head, int track, int sectorcount, int trackcount) =0; + virtual void write_track(io_generic *io, uint8_t *sectordata, int *sector, int track, int head, int sector_count, int track_count) =0; int get_encoding(int cell_size); - void generate_track_fm(int track, int head, int cell_size, uint8_t* trackdata, floppy_image *image); - void generate_track_mfm(int track, int head, int cell_size, uint8_t* trackdata, floppy_image *image); - - bool check_for_address_marks(uint8_t* trackdata, int encoding); + void generate_fm_track_from_sectors(floppy_image *image, uint8_t *sectordata, int sector_count, int *sector, int *secoffset, int track, int trackid, int head); + void generate_mfm_track_from_sectors(floppy_image *image, uint8_t *sectordata, int sector_count, int *sector, int *secoffset, int track, int trackid, int head); // Debugging - void showtrack(uint8_t* trackdata, int length); + void dumpbytes(uint8_t* trackdata, int length); + std::string dumpline(uint8_t* line, int address) const; }; /* @@ -58,9 +58,9 @@ public: private: void determine_sizes(io_generic *io, int& cell_size, int& sector_count, int& heads, int& tracks) override; - int get_track_size(int cell_size, int sector_count) override; - void write_track(io_generic *io, uint8_t *trackdata, int *sector, int track, int head, int maxsect, int maxtrack, int numbytes) override; - void load_track(io_generic *io, uint8_t *trackdata, int head, int track, int acttrack, int sectorcount, int trackcount, int cellsize) override; + int get_track_size(int sector_count) override; + void write_track(io_generic *io, uint8_t *sectordata, int *sector, int track, int head, int sector_count, int track_count) override; + void load_track(io_generic *io, uint8_t *sectordata, int *sector, int *secoffset, int head, int track, int sector_count, int track_count) override; // This format supports single-sided images int min_heads() override { return 1; } @@ -97,9 +97,9 @@ public: private: void determine_sizes(io_generic *io, int& cell_size, int& sector_count, int& heads, int& tracks) override; - void load_track(io_generic *io, uint8_t *trackdata, int head, int track, int acttrack, int sectorcount, int trackcount, int cellsize) override; - void write_track(io_generic *io, uint8_t *trackdata, int *sector, int track, int head, int maxsect, int maxtrack, int numbytes) override; - int get_track_size(int cell_size, int sector_count) override; + void load_track(io_generic *io, uint8_t *sectordata, int *sector, int *secoffset, int head, int track, int sectorcount, int trackcount) override; + void write_track(io_generic *io, uint8_t *sectordata, int *sector, int track, int head, int sector_count, int track_count) override; + int get_track_size(int sector_count) override; // This format only supports double-sided images int min_heads() override { return 2; } diff --git a/src/lib/util/bitmap.cpp b/src/lib/util/bitmap.cpp index c8ceb5d3eab..a0a1e92f4d9 100644 --- a/src/lib/util/bitmap.cpp +++ b/src/lib/util/bitmap.cpp @@ -129,7 +129,7 @@ bitmap_t::bitmap_t(bitmap_format format, uint8_t bpp, void *base, int width, int bitmap_t::bitmap_t(bitmap_format format, uint8_t bpp, bitmap_t &source, const rectangle &subrect) : m_alloc() , m_allocbytes(0) - , m_base(source.raw_pixptr(subrect.min_y, subrect.min_x)) + , m_base(source.raw_pixptr(subrect.top(), subrect.left())) , m_rowpixels(source.m_rowpixels) , m_width(subrect.width()) , m_height(subrect.height()) @@ -332,7 +332,7 @@ void bitmap_t::wrap(const bitmap_t &source, const rectangle &subrect) reset(); // copy relevant fields - m_base = source.raw_pixptr(subrect.min_y, subrect.min_x); + m_base = source.raw_pixptr(subrect.top(), subrect.left()); m_rowpixels = source.m_rowpixels; m_width = subrect.width(); m_height = subrect.height(); @@ -391,29 +391,29 @@ void bitmap_t::fill(uint32_t color, const rectangle &cliprect) { case 8: // 8bpp always uses memset - for (int32_t y = fill.min_y; y <= fill.max_y; y++) - memset(raw_pixptr(y, fill.min_x), (uint8_t)color, fill.width()); + for (int32_t y = fill.top(); y <= fill.bottom(); y++) + memset(raw_pixptr(y, fill.left()), uint8_t(color), fill.width()); break; case 16: // 16bpp can use memset if the bytes are equal - if ((uint8_t)(color >> 8) == (uint8_t)color) + if (uint8_t(color >> 8) == uint8_t(color)) { - for (int32_t y = fill.min_y; y <= fill.max_y; y++) - memset(raw_pixptr(y, fill.min_x), (uint8_t)color, fill.width() * 2); + for (int32_t y = fill.top(); y <= fill.bottom(); y++) + memset(raw_pixptr(y, fill.left()), uint8_t(color), fill.width() * 2); } else { // Fill the first line the hard way - uint16_t *destrow = &pixt<uint16_t>(fill.min_y); - for (int32_t x = fill.min_x; x <= fill.max_x; x++) - destrow[x] = (uint16_t)color; + uint16_t *destrow = &pixt<uint16_t>(fill.top()); + for (int32_t x = fill.left(); x <= fill.right(); x++) + destrow[x] = uint16_t(color); // For the other lines, just copy the first one - void *destrow0 = &pixt<uint16_t>(fill.min_y, fill.min_x); - for (int32_t y = fill.min_y + 1; y <= fill.max_y; y++) + void *destrow0 = &pixt<uint16_t>(fill.top(), fill.left()); + for (int32_t y = fill.top() + 1; y <= fill.bottom(); y++) { - destrow = &pixt<uint16_t>(y, fill.min_x); + destrow = &pixt<uint16_t>(y, fill.left()); memcpy(destrow, destrow0, fill.width() * 2); } } @@ -423,21 +423,21 @@ void bitmap_t::fill(uint32_t color, const rectangle &cliprect) // 32bpp can use memset if the bytes are equal if ((uint8_t)(color >> 8) == (uint8_t)color && (uint16_t)(color >> 16) == (uint16_t)color) { - for (int32_t y = fill.min_y; y <= fill.max_y; y++) - memset(&pixt<uint32_t>(y, fill.min_x), (uint8_t)color, fill.width() * 4); + for (int32_t y = fill.top(); y <= fill.bottom(); y++) + memset(&pixt<uint32_t>(y, fill.left()), uint8_t(color), fill.width() * 4); } else { // Fill the first line the hard way - uint32_t *destrow = &pixt<uint32_t>(fill.min_y); - for (int32_t x = fill.min_x; x <= fill.max_x; x++) - destrow[x] = (uint32_t)color; + uint32_t *destrow = &pixt<uint32_t>(fill.top()); + for (int32_t x = fill.left(); x <= fill.right(); x++) + destrow[x] = uint32_t(color); // For the other lines, just copy the first one - uint32_t *destrow0 = &pixt<uint32_t>(fill.min_y, fill.min_x); - for (int32_t y = fill.min_y + 1; y <= fill.max_y; y++) + uint32_t *destrow0 = &pixt<uint32_t>(fill.top(), fill.left()); + for (int32_t y = fill.top() + 1; y <= fill.bottom(); y++) { - destrow = &pixt<uint32_t>(y, fill.min_x); + destrow = &pixt<uint32_t>(y, fill.left()); memcpy(destrow, destrow0, fill.width() * 4); } } @@ -445,23 +445,23 @@ void bitmap_t::fill(uint32_t color, const rectangle &cliprect) case 64: // 64bpp can use memset if the bytes are equal - if ((uint8_t)(color >> 8) == (uint8_t)color && (uint16_t)(color >> 16) == (uint16_t)color) + if (uint8_t(color >> 8) == uint8_t(color) && uint16_t(color >> 16) == uint16_t(color)) // FIXME: really? wat about the upper bits that would be zeroed when done the "hard way"? { - for (int32_t y = fill.min_y; y <= fill.max_y; y++) - memset(&pixt<uint64_t>(y, fill.min_x), (uint8_t)color, fill.width() * 8); + for (int32_t y = fill.top(); y <= fill.bottom(); y++) + memset(&pixt<uint64_t>(y, fill.left()), uint8_t(color), fill.width() * 8); } else { // Fill the first line the hard way - uint64_t *destrow = &pixt<uint64_t>(fill.min_y); - for (int32_t x = fill.min_x; x <= fill.max_x; x++) - destrow[x] = (uint64_t)color; + uint64_t *destrow = &pixt<uint64_t>(fill.top()); + for (int32_t x = fill.left(); x <= fill.right(); x++) + destrow[x] = uint64_t(color); // For the other lines, just copy the first one - uint64_t *destrow0 = &pixt<uint64_t>(fill.min_y, fill.min_x); - for (int32_t y = fill.min_y + 1; y <= fill.max_y; y++) + uint64_t *destrow0 = &pixt<uint64_t>(fill.top(), fill.left()); + for (int32_t y = fill.top() + 1; y <= fill.bottom(); y++) { - destrow = &pixt<uint64_t>(y, fill.min_x); + destrow = &pixt<uint64_t>(y, fill.left()); memcpy(destrow, destrow0, fill.width() * 8); } } diff --git a/src/lib/util/bitmap.h b/src/lib/util/bitmap.h index 7b0fc34610f..efb18f7e456 100644 --- a/src/lib/util/bitmap.h +++ b/src/lib/util/bitmap.h @@ -43,16 +43,16 @@ class rectangle { public: // construction/destruction - rectangle() - : min_x(0), max_x(0), min_y(0), max_y(0) { } - rectangle(int32_t minx, int32_t maxx, int32_t miny, int32_t maxy) - : min_x(minx), max_x(maxx), min_y(miny), max_y(maxy) { } + constexpr rectangle() { } + constexpr rectangle(int32_t minx, int32_t maxx, int32_t miny, int32_t maxy) + : min_x(minx), max_x(maxx), min_y(miny), max_y(maxy) + { } // getters - int32_t left() const { return min_x; } - int32_t right() const { return max_x; } - int32_t top() const { return min_y; } - int32_t bottom() const { return max_y; } + constexpr int32_t left() const { return min_x; } + constexpr int32_t right() const { return max_x; } + constexpr int32_t top() const { return min_y; } + constexpr int32_t bottom() const { return max_y; } // compute intersection with another rect rectangle &operator&=(const rectangle &src) @@ -75,21 +75,21 @@ public: } // comparisons - bool operator==(const rectangle &rhs) const { return min_x == rhs.min_x && max_x == rhs.max_x && min_y == rhs.min_y && max_y == rhs.max_y; } - bool operator!=(const rectangle &rhs) const { return min_x != rhs.min_x || max_x != rhs.max_x || min_y != rhs.min_y || max_y != rhs.max_y; } - bool operator>(const rectangle &rhs) const { return min_x < rhs.min_x && min_y < rhs.min_y && max_x > rhs.max_x && max_y > rhs.max_y; } - bool operator>=(const rectangle &rhs) const { return min_x <= rhs.min_x && min_y <= rhs.min_y && max_x >= rhs.max_x && max_y >= rhs.max_y; } - bool operator<(const rectangle &rhs) const { return min_x >= rhs.min_x || min_y >= rhs.min_y || max_x <= rhs.max_x || max_y <= rhs.max_y; } - bool operator<=(const rectangle &rhs) const { return min_x > rhs.min_x || min_y > rhs.min_y || max_x < rhs.max_x || max_y < rhs.max_y; } + constexpr bool operator==(const rectangle &rhs) const { return min_x == rhs.min_x && max_x == rhs.max_x && min_y == rhs.min_y && max_y == rhs.max_y; } + constexpr bool operator!=(const rectangle &rhs) const { return min_x != rhs.min_x || max_x != rhs.max_x || min_y != rhs.min_y || max_y != rhs.max_y; } + constexpr bool operator>(const rectangle &rhs) const { return min_x < rhs.min_x && min_y < rhs.min_y && max_x > rhs.max_x && max_y > rhs.max_y; } + constexpr bool operator>=(const rectangle &rhs) const { return min_x <= rhs.min_x && min_y <= rhs.min_y && max_x >= rhs.max_x && max_y >= rhs.max_y; } + constexpr bool operator<(const rectangle &rhs) const { return min_x >= rhs.min_x || min_y >= rhs.min_y || max_x <= rhs.max_x || max_y <= rhs.max_y; } + constexpr bool operator<=(const rectangle &rhs) const { return min_x > rhs.min_x || min_y > rhs.min_y || max_x < rhs.max_x || max_y < rhs.max_y; } // other helpers - bool empty() const { return (min_x > max_x || min_y > max_y); } - bool contains(int32_t x, int32_t y) const { return (x >= min_x && x <= max_x && y >= min_y && y <= max_y); } - bool contains(const rectangle &rect) const { return (min_x <= rect.min_x && max_x >= rect.max_x && min_y <= rect.min_y && max_y >= rect.max_y); } - int32_t width() const { return max_x + 1 - min_x; } - int32_t height() const { return max_y + 1 - min_y; } - int32_t xcenter() const { return (min_x + max_x + 1) / 2; } - int32_t ycenter() const { return (min_y + max_y + 1) / 2; } + constexpr bool empty() const { return (min_x > max_x) || (min_y > max_y); } + constexpr bool contains(int32_t x, int32_t y) const { return (x >= min_x) && (x <= max_x) && (y >= min_y) && (y <= max_y); } + constexpr bool contains(const rectangle &rect) const { return (min_x <= rect.min_x) && (max_x >= rect.max_x) && (min_y <= rect.min_y) && (max_y >= rect.max_y); } + constexpr int32_t width() const { return max_x + 1 - min_x; } + constexpr int32_t height() const { return max_y + 1 - min_y; } + constexpr int32_t xcenter() const { return (min_x + max_x + 1) / 2; } + constexpr int32_t ycenter() const { return (min_y + max_y + 1) / 2; } // setters void set(int32_t minx, int32_t maxx, int32_t miny, int32_t maxy) { min_x = minx; max_x = maxx; min_y = miny; max_y = maxy; } @@ -106,10 +106,10 @@ public: void offsety(int32_t delta) { min_y += delta; max_y += delta; } // internal state - int32_t min_x; // minimum X, or left coordinate - int32_t max_x; // maximum X, or right coordinate (inclusive) - int32_t min_y; // minimum Y, or top coordinate - int32_t max_y; // maximum Y, or bottom coordinate (inclusive) + int32_t min_x = 0; // minimum X, or left coordinate + int32_t max_x = 0; // maximum X, or right coordinate (inclusive) + int32_t min_y = 0; // minimum Y, or top coordinate + int32_t max_y = 0; // maximum Y, or bottom coordinate (inclusive) }; diff --git a/src/mame/audio/exidy.cpp b/src/mame/audio/exidy.cpp index 973a5a255aa..da7d8966e78 100644 --- a/src/mame/audio/exidy.cpp +++ b/src/mame/audio/exidy.cpp @@ -754,12 +754,12 @@ MACHINE_CONFIG_START(venture_sound_device::device_add_mconfig) MCFG_DEVICE_ADD("audiocpu", M6502, 3579545/4) MCFG_DEVICE_PROGRAM_MAP(venture_audio_map) - MCFG_DEVICE_ADD("riot", RIOT6532, SH6532_CLOCK) - MCFG_RIOT6532_IN_PA_CB(READ8(*this, venture_sound_device, r6532_porta_r)) - MCFG_RIOT6532_OUT_PA_CB(WRITE8(*this, venture_sound_device, r6532_porta_w)) - MCFG_RIOT6532_IN_PB_CB(READ8(*this, venture_sound_device, r6532_portb_r)) - MCFG_RIOT6532_OUT_PB_CB(WRITE8(*this, venture_sound_device, r6532_portb_w)) - MCFG_RIOT6532_IRQ_CB(WRITELINE("audioirq", input_merger_device, in_w<0>)) + RIOT6532(config, m_riot, SH6532_CLOCK); + m_riot->in_pa_callback().set(FUNC(venture_sound_device::r6532_porta_r)); + m_riot->out_pa_callback().set(FUNC(venture_sound_device::r6532_porta_w)); + m_riot->in_pb_callback().set(FUNC(venture_sound_device::r6532_portb_r)); + m_riot->out_pb_callback().set(FUNC(venture_sound_device::r6532_portb_w)); + m_riot->irq_callback().set("audioirq", FUNC(input_merger_device::in_w<0>)); MCFG_DEVICE_ADD("pia", PIA6821, 0) MCFG_PIA_WRITEPA_HANDLER(WRITE8(*this, venture_sound_device, pia_pa_w)) @@ -985,12 +985,12 @@ MACHINE_CONFIG_START(victory_sound_device::device_add_mconfig) MCFG_DEVICE_ADD("audiocpu", M6502, VICTORY_AUDIO_CPU_CLOCK) MCFG_DEVICE_PROGRAM_MAP(victory_audio_map) - MCFG_DEVICE_ADD("riot", RIOT6532, SH6532_CLOCK) - MCFG_RIOT6532_IN_PA_CB(READ8(*this, victory_sound_device, r6532_porta_r)) - MCFG_RIOT6532_OUT_PA_CB(WRITE8(*this, victory_sound_device, r6532_porta_w)) - MCFG_RIOT6532_IN_PB_CB(READ8(*this, victory_sound_device, r6532_portb_r)) - MCFG_RIOT6532_OUT_PB_CB(WRITE8(*this, victory_sound_device, r6532_portb_w)) - MCFG_RIOT6532_IRQ_CB(WRITELINE("audioirq", input_merger_device, in_w<0>)) + RIOT6532(config, m_riot, SH6532_CLOCK); + m_riot->in_pa_callback().set(FUNC(victory_sound_device::r6532_porta_r)); + m_riot->out_pa_callback().set(FUNC(victory_sound_device::r6532_porta_w)); + m_riot->in_pb_callback().set(FUNC(victory_sound_device::r6532_portb_r)); + m_riot->out_pb_callback().set(FUNC(victory_sound_device::r6532_portb_w)); + m_riot->irq_callback().set("audioirq", FUNC(input_merger_device::in_w<0>)); MCFG_DEVICE_ADD("pia", PIA6821, 0) MCFG_PIA_CA2_HANDLER(WRITELINE(*this, victory_sound_device, irq_clear_w)) diff --git a/src/mame/audio/seibu.cpp b/src/mame/audio/seibu.cpp index 35da2f855cd..25debce9fc1 100644 --- a/src/mame/audio/seibu.cpp +++ b/src/mame/audio/seibu.cpp @@ -170,18 +170,18 @@ IRQ_CALLBACK_MEMBER(seibu_sound_device::im0_vector_cb) } -WRITE8_MEMBER( seibu_sound_device::irq_clear_w ) +void seibu_sound_device::irq_clear_w(u8) { /* Denjin Makai and SD Gundam doesn't like this, it's tied to the rst18 ack ONLY so it could be related to it. */ //update_irq_lines(VECTOR_INIT); } -WRITE8_MEMBER( seibu_sound_device::rst10_ack_w ) +void seibu_sound_device::rst10_ack_w(u8) { /* Unused for now */ } -WRITE8_MEMBER( seibu_sound_device::rst18_ack_w ) +void seibu_sound_device::rst18_ack_w(u8) { update_irq_lines(RST18_CLEAR); } @@ -191,51 +191,51 @@ WRITE_LINE_MEMBER( seibu_sound_device::fm_irqhandler ) update_irq_lines(state ? RST10_ASSERT : RST10_CLEAR); } -READ8_MEMBER( seibu_sound_device::ym_r ) +u8 seibu_sound_device::ym_r(offs_t offset) { return m_ym_read_cb(offset); } -WRITE8_MEMBER( seibu_sound_device::ym_w ) +void seibu_sound_device::ym_w(offs_t offset, u8 data) { m_ym_write_cb(offset, data); } -WRITE8_MEMBER( seibu_sound_device::bank_w ) +void seibu_sound_device::bank_w(u8 data) { if (m_rom_bank.found()) m_rom_bank->set_entry(data & 1); } -WRITE8_MEMBER( seibu_sound_device::coin_w ) +void seibu_sound_device::coin_w(u8 data) { machine().bookkeeping().coin_counter_w(0, data & 1); machine().bookkeeping().coin_counter_w(1, data & 2); } -READ8_MEMBER( seibu_sound_device::soundlatch_r ) +u8 seibu_sound_device::soundlatch_r(offs_t offset) { return m_main2sub[offset]; } -READ8_MEMBER( seibu_sound_device::main_data_pending_r ) +u8 seibu_sound_device::main_data_pending_r() { return m_sub2main_pending ? 1 : 0; } -WRITE8_MEMBER( seibu_sound_device::main_data_w ) +void seibu_sound_device::main_data_w(offs_t offset, u8 data) { m_sub2main[offset] = data; } -WRITE8_MEMBER( seibu_sound_device::pending_w ) +void seibu_sound_device::pending_w(u8) { /* just a guess */ m_main2sub_pending = 0; m_sub2main_pending = 1; } -READ8_MEMBER( seibu_sound_device::main_r ) +u8 seibu_sound_device::main_r(offs_t offset) { //logerror("%s: seibu_main_r(%x)\n",machine().describe_context(),offset); switch (offset) @@ -251,7 +251,7 @@ READ8_MEMBER( seibu_sound_device::main_r ) } } -WRITE8_MEMBER( seibu_sound_device::main_w ) +void seibu_sound_device::main_w(offs_t offset, u8 data) { switch (offset) { @@ -275,7 +275,7 @@ WRITE8_MEMBER( seibu_sound_device::main_w ) } // used only by NMK16 bootlegs -WRITE16_MEMBER( seibu_sound_device::main_mustb_w ) +void seibu_sound_device::main_mustb_w(offs_t, u16 data, u16 mem_mask) { if (ACCESSING_BITS_0_7) m_main2sub[0] = data & 0xff; @@ -318,7 +318,7 @@ sei80bu_device::sei80bu_device(const machine_config &mconfig, const char *tag, d { } -READ8_MEMBER(sei80bu_device::data_r) +u8 sei80bu_device::data_r(offs_t offset) { u16 a = offset; u8 src = read_byte(offset); @@ -335,7 +335,7 @@ READ8_MEMBER(sei80bu_device::data_r) return src; } -READ8_MEMBER(sei80bu_device::opcode_r) +u8 sei80bu_device::opcode_r(offs_t offset) { u16 a = offset; u8 src = read_byte(offset); @@ -406,7 +406,7 @@ void seibu_adpcm_device::decrypt() } } -WRITE8_MEMBER( seibu_adpcm_device::adr_w ) +void seibu_adpcm_device::adr_w(offs_t offset, u8 data) { if (m_stream) m_stream->update(); @@ -422,7 +422,7 @@ WRITE8_MEMBER( seibu_adpcm_device::adr_w ) } } -WRITE8_MEMBER( seibu_adpcm_device::ctl_w ) +void seibu_adpcm_device::ctl_w(u8 data) { // sequence is 00 02 01 each time. if (m_stream) diff --git a/src/mame/audio/seibu.h b/src/mame/audio/seibu.h index e4c8473ffa3..d5d0a0a744b 100644 --- a/src/mame/audio/seibu.h +++ b/src/mame/audio/seibu.h @@ -51,21 +51,21 @@ public: template<class Object> devcb_base &set_ym_read_callback(Object &&object) { return m_ym_read_cb.set_callback(std::forward<Object>(object)); } template<class Object> devcb_base &set_ym_write_callback(Object &&object) { return m_ym_write_cb.set_callback(std::forward<Object>(object)); } - DECLARE_READ8_MEMBER( main_r ); - DECLARE_WRITE8_MEMBER( main_w ); - DECLARE_WRITE16_MEMBER( main_mustb_w ); - DECLARE_WRITE8_MEMBER( irq_clear_w ); - DECLARE_WRITE8_MEMBER( rst10_ack_w ); - DECLARE_WRITE8_MEMBER( rst18_ack_w ); - DECLARE_READ8_MEMBER( ym_r ); - DECLARE_WRITE8_MEMBER( ym_w ); - DECLARE_WRITE8_MEMBER( bank_w ); - DECLARE_WRITE8_MEMBER( coin_w ); + u8 main_r(offs_t offset); + void main_w(offs_t offset, u8 data); + void main_mustb_w(offs_t, u16 data, u16 mem_mask); + void irq_clear_w(u8); + void rst10_ack_w(u8); + void rst18_ack_w(u8); + u8 ym_r(offs_t offset); + void ym_w(offs_t offset, u8 data); + void bank_w(u8 data); + void coin_w(u8 data); WRITE_LINE_MEMBER( fm_irqhandler ); - DECLARE_READ8_MEMBER( soundlatch_r ); - DECLARE_READ8_MEMBER( main_data_pending_r ); - DECLARE_WRITE8_MEMBER( main_data_w ); - DECLARE_WRITE8_MEMBER( pending_w ); + u8 soundlatch_r(offs_t offset); + u8 main_data_pending_r(); + void main_data_w(offs_t offset, u8 data); + void pending_w(u8); IRQ_CALLBACK_MEMBER(im0_vector_cb); @@ -113,8 +113,8 @@ class sei80bu_device : public device_t, public device_rom_interface public: sei80bu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - DECLARE_READ8_MEMBER(data_r); - DECLARE_READ8_MEMBER(opcode_r); + u8 data_r(offs_t offset); + u8 opcode_r(offs_t offset); protected: // device-level overrides @@ -134,8 +134,8 @@ public: ~seibu_adpcm_device() {} void decrypt(); - DECLARE_WRITE8_MEMBER( adr_w ); - DECLARE_WRITE8_MEMBER( ctl_w ); + void adr_w(offs_t offset, u8 data); + void ctl_w(u8 data); protected: // device-level overrides diff --git a/src/mame/audio/targ.cpp b/src/mame/audio/targ.cpp index fbdfc484172..08567e3e1de 100644 --- a/src/mame/audio/targ.cpp +++ b/src/mame/audio/targ.cpp @@ -63,15 +63,15 @@ WRITE8_MEMBER( exidy_state::targ_audio_1_w ) /* shot */ if (FALLING_EDGE(0x02) && !m_samples->playing(0)) m_samples->start(0,1); - if (RISING_EDGE(0x02)) m_samples->stop(0); + if (RISING_EDGE(0x02)) m_samples->start(0,1); /* crash */ if (RISING_EDGE(0x20)) { if (data & 0x40) - m_samples->start(1,2); - else m_samples->start(1,0); + else + m_samples->start(1,2); } /* Sspec */ @@ -137,6 +137,7 @@ static const char *const sample_names[] = }; + void exidy_state::common_audio_start(int freq) { m_max_freq = freq; diff --git a/src/mame/audio/tx1.cpp b/src/mame/audio/tx1.cpp index 8c44033191b..355a501a09e 100644 --- a/src/mame/audio/tx1.cpp +++ b/src/mame/audio/tx1.cpp @@ -575,6 +575,7 @@ MACHINE_CONFIG_START(tx1_sound_device::device_add_mconfig) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "frontleft", 0.1) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "frontright", 0.1) + MCFG_DEVICE_MODIFY(DEVICE_SELF) MCFG_SOUND_ROUTE(0, "frontleft", 0.2) MCFG_SOUND_ROUTE(1, "frontright", 0.2) MACHINE_CONFIG_END @@ -1084,6 +1085,7 @@ MACHINE_CONFIG_START(buggyboy_sound_device::device_add_mconfig) MCFG_AY8910_PORT_B_WRITE_CB(WRITE8(*this, buggyboy_sound_device, ym2_b_w)) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "frontright", 0.15) + MCFG_DEVICE_MODIFY(DEVICE_SELF) MCFG_SOUND_ROUTE(0, "frontleft", 0.2) MCFG_SOUND_ROUTE(1, "frontright", 0.2) MACHINE_CONFIG_END @@ -1109,6 +1111,7 @@ MACHINE_CONFIG_START(buggyboyjr_sound_device::device_add_mconfig) MCFG_AY8910_PORT_B_WRITE_CB(WRITE8(*this, buggyboy_sound_device, ym2_b_w)) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "frontright", 0.15) + MCFG_DEVICE_MODIFY(DEVICE_SELF) MCFG_SOUND_ROUTE(0, "frontleft", 0.2) MCFG_SOUND_ROUTE(1, "frontright", 0.2) MACHINE_CONFIG_END diff --git a/src/mame/audio/vboy.cpp b/src/mame/audio/vboy.cpp index 4b6d7d73fa0..6dca938d66f 100644 --- a/src/mame/audio/vboy.cpp +++ b/src/mame/audio/vboy.cpp @@ -191,9 +191,6 @@ static inline void mputb(uint8_t *ptr, int8_t data) { *ptr = data; } // LIVE DEVICE //************************************************************************** -constexpr unsigned vboysnd_device::AUDIO_FREQ; - - //------------------------------------------------- // vboysnd_device - constructor //------------------------------------------------- @@ -210,25 +207,37 @@ vboysnd_device::vboysnd_device(const machine_config &mconfig, const char *tag, d void vboysnd_device::device_start() { - int i; - + uint32_t rate = clock() / 120; // create the stream - m_stream = machine().sound().stream_alloc(*this, 0, 2, AUDIO_FREQ); + m_stream = machine().sound().stream_alloc(*this, 0, 2, rate); - for (i=0; i<2048; i++) - waveFreq2LenTbl[i] = AUDIO_FREQ / (5000000.0f/(float)((2048-i) * 32)); - for (i=0; i<32; i++) - waveTimer2LenTbl[i] = ((0.00384f*(float)(i+1)) * (float)AUDIO_FREQ); - for (i=0; i<8; i++) - waveEnv2LenTbl[i] = ((0.01536f*(float)(i+1)) * (float)AUDIO_FREQ); + m_timer = timer_alloc(0, nullptr); + m_timer->adjust(attotime::zero, 0, rate ? attotime::from_hz(rate / 4) : attotime::never); + + for (int i=0; i<2048; i++) + waveFreq2LenTbl[i] = ((2048 - i) * 32) / 120; + for (int i=0; i<32; i++) + waveTimer2LenTbl[i] = (i+1) * 120; + for (int i=0; i<8; i++) + waveEnv2LenTbl[i] = (i + 1) * 4 * 120; - for (i = 0; i < 5; i++) + for (int i = 0; i < 5; i++) memset(&snd_channel[i], 0, sizeof(s_snd_channel)); memset(m_aram, 0, 0x600); +} - m_timer = timer_alloc(0, nullptr); - m_timer->adjust(attotime::zero, 0, attotime::from_hz(AUDIO_FREQ/4)); + +//------------------------------------------------- +// device_clock_changed +//------------------------------------------------- + +void vboysnd_device::device_clock_changed() +{ + uint32_t rate = clock() / 120; + m_stream->set_sample_rate(rate); + + m_timer->adjust(attotime::zero, 0, rate ? attotime::from_hz(rate / 4) : attotime::never); } diff --git a/src/mame/audio/vboy.h b/src/mame/audio/vboy.h index 0414370bf77..5ba9bbff8c9 100644 --- a/src/mame/audio/vboy.h +++ b/src/mame/audio/vboy.h @@ -21,10 +21,8 @@ class vboysnd_device : public device_t, public device_sound_interface { public: - static constexpr unsigned AUDIO_FREQ = 44100; - // construction/destruction - vboysnd_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = AUDIO_FREQ); + vboysnd_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 5'000'000); DECLARE_READ8_MEMBER(read); DECLARE_WRITE8_MEMBER(write); @@ -70,6 +68,7 @@ protected: // device-level overrides virtual void device_start() override; + virtual void device_clock_changed() override; virtual void device_reset() override; virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; diff --git a/src/mame/audio/wswan.cpp b/src/mame/audio/wswan.cpp index f86afd635af..e8638bbc850 100644 --- a/src/mame/audio/wswan.cpp +++ b/src/mame/audio/wswan.cpp @@ -32,6 +32,7 @@ DEFINE_DEVICE_TYPE(WSWAN_SND, wswan_sound_device, "wswan_sound", "WonderSwan Cus wswan_sound_device::wswan_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, WSWAN_SND, tag, owner, clock), device_sound_interface(mconfig, *this), + device_rom_interface(mconfig, *this, 14), m_channel(nullptr), m_sweep_step(0), m_sweep_time(0), @@ -39,12 +40,12 @@ wswan_sound_device::wswan_sound_device(const machine_config &mconfig, const char m_noise_type(0), m_noise_reset(0), m_noise_enable(0), + m_noise_output(0), m_sample_address(0), m_audio2_voice(0), m_audio3_sweep(0), m_audio4_noise(0), m_mono(0), - m_voice_data(0), m_output_volume(0), m_external_stereo(0), m_external_speaker(0), @@ -53,6 +54,7 @@ wswan_sound_device::wswan_sound_device(const machine_config &mconfig, const char { } +constexpr int clk_div = 64; //------------------------------------------------- // device_start - device-specific startup @@ -60,7 +62,7 @@ wswan_sound_device::wswan_sound_device(const machine_config &mconfig, const char void wswan_sound_device::device_start() { - m_channel = stream_alloc(0, 2, machine().sample_rate()); + m_channel = stream_alloc(0, 2, clock() / clk_div); save_item(NAME(m_sweep_step)); save_item(NAME(m_sweep_time)); @@ -73,7 +75,6 @@ void wswan_sound_device::device_start() save_item(NAME(m_audio3_sweep)); save_item(NAME(m_audio4_noise)); save_item(NAME(m_mono)); - save_item(NAME(m_voice_data)); save_item(NAME(m_output_volume)); save_item(NAME(m_external_stereo)); save_item(NAME(m_external_speaker)); @@ -86,6 +87,7 @@ void wswan_sound_device::device_start() save_item(NAME(m_audio1.vol_left)); save_item(NAME(m_audio1.vol_right)); save_item(NAME(m_audio1.on)); + save_item(NAME(m_audio1.offset)); save_item(NAME(m_audio1.signal)); save_item(NAME(m_audio2.freq)); @@ -94,6 +96,7 @@ void wswan_sound_device::device_start() save_item(NAME(m_audio2.vol_left)); save_item(NAME(m_audio2.vol_right)); save_item(NAME(m_audio2.on)); + save_item(NAME(m_audio2.offset)); save_item(NAME(m_audio2.signal)); save_item(NAME(m_audio3.freq)); @@ -102,6 +105,7 @@ void wswan_sound_device::device_start() save_item(NAME(m_audio3.vol_left)); save_item(NAME(m_audio3.vol_right)); save_item(NAME(m_audio3.on)); + save_item(NAME(m_audio3.offset)); save_item(NAME(m_audio3.signal)); save_item(NAME(m_audio4.freq)); @@ -110,9 +114,19 @@ void wswan_sound_device::device_start() save_item(NAME(m_audio4.vol_left)); save_item(NAME(m_audio4.vol_right)); save_item(NAME(m_audio4.on)); + save_item(NAME(m_audio4.offset)); save_item(NAME(m_audio4.signal)); } +void wswan_sound_device::device_clock_changed() +{ + m_channel->set_sample_rate(clock() / clk_div); +} + +void wswan_sound_device::rom_bank_updated() +{ + m_channel->update(); +} //------------------------------------------------- // device_reset @@ -121,19 +135,33 @@ void wswan_sound_device::device_start() void wswan_sound_device::device_reset() { m_audio1.on = 0; - m_audio1.signal = 16; + m_audio1.signal = 0; + m_audio1.offset = 0; m_audio1.pos = 0; m_audio2.on = 0; - m_audio2.signal = 16; + m_audio2.signal = 0; + m_audio2.offset = 0; m_audio2.pos = 0; m_audio3.on = 0; - m_audio3.signal = 16; + m_audio3.signal = 0; + m_audio3.offset = 0; m_audio3.pos = 0; m_audio4.on = 0; - m_audio4.signal = 16; + m_audio4.signal = 0; + m_audio4.offset = 0; m_audio4.pos = 0; + m_noise_output = 0; } +int wswan_sound_device::fetch_sample(int channel, int offset) +{ + uint8_t b = read_byte(m_sample_address + ((channel & 3) << 4) + ((offset & 0x1f) >> 1)); + + if (offset & 1) + return b >> 4; + else + return b & 0xf; +} //------------------------------------------------- // sound_stream_update - handle a stream update @@ -150,11 +178,11 @@ void wswan_sound_device::sound_stream_update(sound_stream &stream, stream_sample if ( m_audio1.on ) { sample = m_audio1.signal; - m_audio1.pos++; - if ( m_audio1.pos >= m_audio1.period / 2 ) + m_audio1.pos += clk_div; + if (m_audio1.pos >= m_audio1.period) { - m_audio1.pos = 0; - m_audio1.signal = -m_audio1.signal; + m_audio1.pos -= m_audio1.period; + m_audio1.signal = fetch_sample(0, m_audio1.offset++); } left += m_audio1.vol_left * sample; right += m_audio1.vol_right * sample; @@ -164,17 +192,18 @@ void wswan_sound_device::sound_stream_update(sound_stream &stream, stream_sample { if ( m_audio2_voice ) { - left += (m_voice_data - 128)*(m_master_volume & 0x0f); - right += (m_voice_data - 128)*(m_master_volume & 0x0f); + uint8_t voice_data = m_audio2.vol_left << 4 | m_audio2.vol_right; + left += voice_data * (m_master_volume & 0x0f); + right += voice_data * (m_master_volume & 0x0f); } else { sample = m_audio2.signal; - m_audio2.pos++; - if ( m_audio2.pos >= m_audio2.period / 2 ) + m_audio2.pos += clk_div; + if (m_audio2.pos >= m_audio2.period) { - m_audio2.pos = 0; - m_audio2.signal = -m_audio2.signal; + m_audio2.pos -= m_audio2.period; + m_audio2.signal = fetch_sample(1, m_audio2.offset++); } left += m_audio2.vol_left * sample; right += m_audio2.vol_right * sample; @@ -184,20 +213,21 @@ void wswan_sound_device::sound_stream_update(sound_stream &stream, stream_sample if ( m_audio3.on ) { sample = m_audio3.signal; - m_audio3.pos++; - if ( m_audio3.pos >= m_audio3.period / 2 ) + m_audio3.pos += clk_div; + if (m_audio3.pos >= m_audio3.period) { - m_audio3.pos = 0; - m_audio3.signal = -m_audio3.signal; + m_audio3.pos -= m_audio3.period; + m_audio3.signal = fetch_sample(2, m_audio3.offset++); } if ( m_audio3_sweep && m_sweep_time ) { - m_sweep_count++; + m_sweep_count += clk_div; if ( m_sweep_count >= m_sweep_time ) { - m_sweep_count = 0; + m_sweep_count -= m_sweep_time; m_audio3.freq += m_sweep_step; - m_audio3.period = machine().sample_rate() / (3072000 / ((2048 - (m_audio3.freq & 0x7ff)) << 5)); + m_audio3.freq &= 0x7ff; + m_audio3.period = 2048 - m_audio3.freq; } } left += m_audio3.vol_left * sample; @@ -207,39 +237,29 @@ void wswan_sound_device::sound_stream_update(sound_stream &stream, stream_sample if ( m_audio4.on ) { sample = m_audio4.signal; - m_audio4.pos++; - if ( m_audio4.pos >= m_audio4.period / 2 ) + m_audio4.pos += clk_div; + if (m_audio4.pos >= m_audio4.period) { - m_audio4.signal = -m_audio4.signal; - m_audio4.pos = 0; + if (m_audio4_noise) + m_audio4.signal = m_noise_output ? 0xf : 0; + else + m_audio4.signal = fetch_sample(3, m_audio4.offset++); + + m_audio4.pos -= m_audio4.period; + + if (m_noise_reset) + { + m_noise_reset = 0; + m_noise_shift = 0; + m_noise_output = 0; + } if (m_noise_enable) { - uint16_t new_bit = 0; - - if (m_noise_type == 0) - { - new_bit = (m_noise_shift ^ (m_noise_shift >> 5) ^ (m_noise_shift >> 8)) & 1; - } - else - { - static int shift_bit[] = { 0, 10, 13, 4, 8, 6, 9, 11 }; - - new_bit = (1 ^ (m_noise_shift >> 7) ^ (m_noise_shift >> shift_bit[m_noise_type])) & 1; - } - m_noise_shift = (m_noise_shift << 1) | new_bit; - - if (m_audio4_noise) - { - m_audio4.signal = (m_noise_shift & 0x8000) ? 16 : -16; - } - - m_noise_shift &= 0x7fff; - - if (m_noise_shift == 0x7fff) - { - m_noise_shift = (m_noise_type == 0) ? 0x80 : 0; - } + static int shift_bit[] = { 14, 10, 13, 4, 8, 6, 9, 11 }; + + m_noise_output = (1 ^ (m_noise_shift >> 7) ^ (m_noise_shift >> shift_bit[m_noise_type])) & 1; + m_noise_shift = m_noise_shift << 1 | m_noise_output; } } left += m_audio4.vol_left * sample; @@ -259,7 +279,7 @@ void wswan_sound_device::wswan_ch_set_freq( CHAN *ch, uint16_t freq ) { freq &= 0x7ff; // docs say freq is 11bits and a few games (Morita Shougi, World Stadium + others) write 0x800 causing a divide by 0 crash ch->freq = freq; - ch->period = machine().sample_rate() / (3072000 / ((2048 - freq) << 5)); + ch->period = 2048 - freq; } WRITE8_MEMBER( wswan_sound_device::port_w ) @@ -306,7 +326,6 @@ WRITE8_MEMBER( wswan_sound_device::port_w ) break; case 0x89: /* Audio 2 volume */ - m_voice_data = data; m_audio2.vol_left = ( data & 0xF0 ) >> 4; m_audio2.vol_right = data & 0x0F; break; @@ -326,17 +345,13 @@ WRITE8_MEMBER( wswan_sound_device::port_w ) break; case 0x8D: /* Sweep time */ - m_sweep_time = machine().sample_rate() / ( 3072000 / ( 8192 * (data + 1) ) ); + m_sweep_time = 8192 * (data + 1); break; case 0x8E: /* Noise control */ m_noise_type = data & 0x07; m_noise_reset = ( data & 0x08 ) >> 3; m_noise_enable = ( data & 0x10 ) >> 4; - if (m_noise_reset) - { - m_noise_shift = (m_noise_type == 0) ? 0x80 : 0; - } break; case 0x8F: /* Sample location */ diff --git a/src/mame/audio/wswan.h b/src/mame/audio/wswan.h index b2f5ffcc65b..2e1e473e632 100644 --- a/src/mame/audio/wswan.h +++ b/src/mame/audio/wswan.h @@ -19,7 +19,8 @@ // ======================> wswan_sound_device class wswan_sound_device : public device_t, - public device_sound_interface + public device_sound_interface, + public device_rom_interface { public: wswan_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); @@ -36,26 +37,32 @@ protected: vol_left(0), vol_right(0), on(0), + offset(0), signal(0) { } uint16_t freq; /* frequency */ - uint32_t period; /* period */ - uint32_t pos; /* position */ + uint16_t period; /* period */ + int32_t pos; /* position */ uint8_t vol_left; /* volume left */ uint8_t vol_right; /* volume right */ uint8_t on; /* on/off */ - int8_t signal; /* signal */ + uint8_t offset; /* sample offset */ + uint8_t signal; /* signal */ }; // device-level overrides virtual void device_start() override; + virtual void device_clock_changed() override; virtual void device_reset() override; + virtual void rom_bank_updated() override; + // sound stream update overrides virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) override; private: void wswan_ch_set_freq( CHAN *ch, uint16_t freq ); + int fetch_sample(int channel, int offset); sound_stream *m_channel; CHAN m_audio1; /* Audio channel 1 */ @@ -64,16 +71,16 @@ private: CHAN m_audio4; /* Audio channel 4 */ int8_t m_sweep_step; /* Sweep step */ uint32_t m_sweep_time; /* Sweep time */ - uint32_t m_sweep_count; /* Sweep counter */ + int32_t m_sweep_count; /* Sweep counter */ uint8_t m_noise_type; /* Noise generator type */ uint8_t m_noise_reset; /* Noise reset */ uint8_t m_noise_enable; /* Noise enable */ + uint8_t m_noise_output; /* Noise output */ uint16_t m_sample_address; /* Sample address */ uint8_t m_audio2_voice; /* Audio 2 voice */ uint8_t m_audio3_sweep; /* Audio 3 sweep */ uint8_t m_audio4_noise; /* Audio 4 noise */ uint8_t m_mono; /* mono */ - uint8_t m_voice_data; /* voice data */ uint8_t m_output_volume; /* output volume */ uint8_t m_external_stereo; /* external stereo */ uint8_t m_external_speaker; /* external speaker */ diff --git a/src/mame/drivers/a2600.cpp b/src/mame/drivers/a2600.cpp index ea2b6f73960..de364526c90 100644 --- a/src/mame/drivers/a2600.cpp +++ b/src/mame/drivers/a2600.cpp @@ -535,12 +535,12 @@ MACHINE_CONFIG_START(a2600_state::a2600) MCFG_MOS6530n_OUT_PB_CB(WRITE8(*this, a2600_state, switch_B_w)) MCFG_MOS6530n_IRQ_CB(WRITELINE(*this, a2600_state, irq_callback)) #else - MCFG_DEVICE_ADD("riot", RIOT6532, MASTER_CLOCK_NTSC / 3) - MCFG_RIOT6532_IN_PA_CB(READ8(*this, a2600_state, switch_A_r)) - MCFG_RIOT6532_OUT_PA_CB(WRITE8(*this, a2600_state, switch_A_w)) - MCFG_RIOT6532_IN_PB_CB(READ8(*this, a2600_state, riot_input_port_8_r)) - MCFG_RIOT6532_OUT_PB_CB(WRITE8(*this, a2600_state, switch_B_w)) - MCFG_RIOT6532_IRQ_CB(WRITELINE(*this, a2600_state, irq_callback)) + RIOT6532(config, m_riot, MASTER_CLOCK_NTSC / 3); + m_riot->in_pa_callback().set(FUNC(a2600_state::switch_A_r)); + m_riot->out_pa_callback().set(FUNC(a2600_state::switch_A_w)); + m_riot->in_pb_callback().set(FUNC(a2600_state::riot_input_port_8_r)); + m_riot->out_pb_callback().set(FUNC(a2600_state::switch_B_w)); + m_riot->irq_callback().set(FUNC(a2600_state::irq_callback)); #endif MCFG_VCS_CONTROL_PORT_ADD(CONTROL1_TAG, vcs_control_port_devices, "joy") @@ -583,12 +583,12 @@ MACHINE_CONFIG_START(a2600_state::a2600p) MCFG_MOS6530n_OUT_PB_CB(WRITE8(*this, a2600_state, switch_B_w)) MCFG_MOS6530n_IRQ_CB(WRITELINE(*this, a2600_state, irq_callback)) #else - MCFG_DEVICE_ADD("riot", RIOT6532, MASTER_CLOCK_PAL / 3) - MCFG_RIOT6532_IN_PA_CB(READ8(*this, a2600_state, switch_A_r)) - MCFG_RIOT6532_OUT_PA_CB(WRITE8(*this, a2600_state, switch_A_w)) - MCFG_RIOT6532_IN_PB_CB(READ8(*this, a2600_state, riot_input_port_8_r)) - MCFG_RIOT6532_OUT_PB_CB(WRITE8(*this, a2600_state, switch_B_w)) - MCFG_RIOT6532_IRQ_CB(WRITELINE(*this, a2600_state, irq_callback)) + RIOT6532(config, m_riot, MASTER_CLOCK_PAL / 3); + m_riot->in_pa_callback().set(FUNC(a2600_state::switch_A_r)); + m_riot->out_pa_callback().set(FUNC(a2600_state::switch_A_w)); + m_riot->in_pb_callback().set(FUNC(a2600_state::riot_input_port_8_r)); + m_riot->out_pb_callback().set(FUNC(a2600_state::switch_B_w)); + m_riot->irq_callback().set(FUNC(a2600_state::irq_callback)); #endif MCFG_VCS_CONTROL_PORT_ADD(CONTROL1_TAG, vcs_control_port_devices, "joy") diff --git a/src/mame/drivers/accomm.cpp b/src/mame/drivers/accomm.cpp index 4670a882007..473f44efb4d 100644 --- a/src/mame/drivers/accomm.cpp +++ b/src/mame/drivers/accomm.cpp @@ -238,17 +238,15 @@ uint32_t accomm_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap { int i; int x = 0; - int pal[16]; int scanline = screen.vpos(); rectangle r = cliprect; - r.min_y = r.max_y = scanline; + r.sety(scanline, scanline); if (scanline == 0) - { m_ula.screen_addr = m_ula.screen_start - m_ula.screen_base; - } /* set up palette */ + int pal[16]; switch( m_ula.screen_mode ) { case 0: case 3: case 4: case 6: case 7: /* 2 colour mode */ @@ -832,9 +830,9 @@ static INPUT_PORTS_START( accomm ) INPUT_PORTS_END MACHINE_CONFIG_START(accomm_state::accomm) - MCFG_DEVICE_ADD("maincpu", G65816, 16_MHz_XTAL / 8) - MCFG_DEVICE_PROGRAM_MAP(main_map) - MCFG_DEVICE_VBLANK_INT_DRIVER("screen", accomm_state, vbl_int) + G65816(config, m_maincpu, 16_MHz_XTAL / 8); + m_maincpu->set_addrmap(AS_PROGRAM, &accomm_state::main_map); + m_maincpu->set_vblank_int("screen", FUNC(accomm_state::vbl_int)); MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE( 50.08 ) @@ -864,9 +862,9 @@ MACHINE_CONFIG_START(accomm_state::accomm) /* rtc pcf8573 */ /* via */ - MCFG_DEVICE_ADD("via6522", VIA6522, XTAL(16'000'000) / 16) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8("cent_data_out", output_latch_device, bus_w)) - MCFG_VIA6522_CA2_HANDLER(WRITELINE("centronics", centronics_device, write_strobe)) + VIA6522(config, m_via, XTAL(16'000'000) / 16); + m_via->writepa_handler().set("cent_data_out", FUNC(output_latch_device::bus_w)); + m_via->ca2_handler().set("centronics", FUNC(centronics_device::write_strobe)); /* acia */ MCFG_DEVICE_ADD("acia", ACIA6850, 0) @@ -883,9 +881,9 @@ MACHINE_CONFIG_START(accomm_state::accomm) MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(*this, accomm_state, write_acia_clock)) /* econet */ - MCFG_DEVICE_ADD("mc6854", MC6854, 0) - MCFG_MC6854_OUT_TXD_CB(WRITELINE(ECONET_TAG, econet_device, host_data_w)) - MCFG_MC6854_OUT_IRQ_CB(INPUTLINE("maincpu", G65816_LINE_NMI)) + MC6854(config, m_adlc); + m_adlc->out_txd_cb().set(ECONET_TAG, FUNC(econet_device::host_data_w)); + m_adlc->out_irq_cb().set_inputline(m_maincpu, G65816_LINE_NMI); MCFG_ECONET_ADD() MCFG_ECONET_CLK_CALLBACK(WRITELINE(*this, accomm_state, econet_clk_w)) MCFG_ECONET_DATA_CALLBACK(WRITELINE("mc6854", mc6854_device, set_rx)) diff --git a/src/mame/drivers/actfancr.cpp b/src/mame/drivers/actfancr.cpp index 5ab8720cfe0..3c66891f729 100644 --- a/src/mame/drivers/actfancr.cpp +++ b/src/mame/drivers/actfancr.cpp @@ -58,7 +58,7 @@ READ8_MEMBER(actfancr_state::triothep_control_r) /******************************************************************************/ -WRITE8_MEMBER(actfancr_state::actfancr_buffer_spriteram_w) +WRITE8_MEMBER(actfancr_state::buffer_spriteram_w) { uint8_t *src = reinterpret_cast<uint8_t *>(memshare("spriteram")->ptr()); // copy to a 16-bit region for our sprite draw code too @@ -71,14 +71,14 @@ WRITE8_MEMBER(actfancr_state::actfancr_buffer_spriteram_w) void actfancr_state::actfan_map(address_map &map) { map(0x000000, 0x02ffff).rom(); - map(0x060000, 0x060007).w(m_tilegen1, FUNC(deco_bac06_device::pf_control0_8bit_w)); - map(0x060010, 0x06001f).w(m_tilegen1, FUNC(deco_bac06_device::pf_control1_8bit_swap_w)); - map(0x062000, 0x063fff).rw(m_tilegen1, FUNC(deco_bac06_device::pf_data_8bit_swap_r), FUNC(deco_bac06_device::pf_data_8bit_swap_w)); - map(0x070000, 0x070007).w(m_tilegen2, FUNC(deco_bac06_device::pf_control0_8bit_w)); - map(0x070010, 0x07001f).w(m_tilegen2, FUNC(deco_bac06_device::pf_control1_8bit_swap_w)); - map(0x072000, 0x0727ff).rw(m_tilegen2, FUNC(deco_bac06_device::pf_data_8bit_swap_r), FUNC(deco_bac06_device::pf_data_8bit_swap_w)); + map(0x060000, 0x060007).w(m_tilegen[0], FUNC(deco_bac06_device::pf_control0_8bit_w)); + map(0x060010, 0x06001f).w(m_tilegen[0], FUNC(deco_bac06_device::pf_control1_8bit_swap_w)); + map(0x062000, 0x063fff).rw(m_tilegen[0], FUNC(deco_bac06_device::pf_data_8bit_swap_r), FUNC(deco_bac06_device::pf_data_8bit_swap_w)); + map(0x070000, 0x070007).w(m_tilegen[1], FUNC(deco_bac06_device::pf_control0_8bit_w)); + map(0x070010, 0x07001f).w(m_tilegen[1], FUNC(deco_bac06_device::pf_control1_8bit_swap_w)); + map(0x072000, 0x0727ff).rw(m_tilegen[1], FUNC(deco_bac06_device::pf_data_8bit_swap_r), FUNC(deco_bac06_device::pf_data_8bit_swap_w)); map(0x100000, 0x1007ff).ram().share("spriteram"); - map(0x110000, 0x110001).w(FUNC(actfancr_state::actfancr_buffer_spriteram_w)); + map(0x110000, 0x110001).w(FUNC(actfancr_state::buffer_spriteram_w)); map(0x120000, 0x1205ff).ram().w("palette", FUNC(palette_device::write8)).share("palette"); map(0x130000, 0x130000).portr("P1"); map(0x130001, 0x130001).portr("P2"); @@ -86,28 +86,26 @@ void actfancr_state::actfan_map(address_map &map) map(0x130003, 0x130003).portr("DSW2"); map(0x140000, 0x140001).portr("SYSTEM"); /* VBL */ map(0x150000, 0x150000).w(m_soundlatch, FUNC(generic_latch_8_device::write)); - map(0x1f0000, 0x1f3fff).ram().share("main_ram"); /* Main ram */ + map(0x1f0000, 0x1f3fff).ram(); /* Main ram */ } void actfancr_state::triothep_map(address_map &map) { map(0x000000, 0x03ffff).rom(); - map(0x040000, 0x040007).w(m_tilegen2, FUNC(deco_bac06_device::pf_control0_8bit_w)); - map(0x040010, 0x04001f).w(m_tilegen2, FUNC(deco_bac06_device::pf_control1_8bit_swap_w)); - map(0x044000, 0x045fff).rw(m_tilegen2, FUNC(deco_bac06_device::pf_data_8bit_swap_r), FUNC(deco_bac06_device::pf_data_8bit_swap_w)); - map(0x046400, 0x0467ff).rw(m_tilegen2, FUNC(deco_bac06_device::pf_rowscroll_8bit_swap_r), FUNC(deco_bac06_device::pf_rowscroll_8bit_swap_w)); - map(0x060000, 0x060007).w(m_tilegen1, FUNC(deco_bac06_device::pf_control0_8bit_w)); - map(0x060010, 0x06001f).w(m_tilegen1, FUNC(deco_bac06_device::pf_control1_8bit_swap_w)); - map(0x064000, 0x0647ff).rw(m_tilegen1, FUNC(deco_bac06_device::pf_data_8bit_swap_r), FUNC(deco_bac06_device::pf_data_8bit_swap_w)); - map(0x066400, 0x0667ff).rw(m_tilegen1, FUNC(deco_bac06_device::pf_rowscroll_8bit_swap_r), FUNC(deco_bac06_device::pf_rowscroll_8bit_swap_w)); + map(0x040000, 0x040007).w(m_tilegen[1], FUNC(deco_bac06_device::pf_control0_8bit_w)); + map(0x040010, 0x04001f).w(m_tilegen[1], FUNC(deco_bac06_device::pf_control1_8bit_swap_w)); + map(0x044000, 0x045fff).rw(m_tilegen[1], FUNC(deco_bac06_device::pf_data_8bit_swap_r), FUNC(deco_bac06_device::pf_data_8bit_swap_w)); + map(0x046400, 0x0467ff).rw(m_tilegen[1], FUNC(deco_bac06_device::pf_rowscroll_8bit_swap_r), FUNC(deco_bac06_device::pf_rowscroll_8bit_swap_w)); + map(0x060000, 0x060007).w(m_tilegen[0], FUNC(deco_bac06_device::pf_control0_8bit_w)); + map(0x060010, 0x06001f).w(m_tilegen[0], FUNC(deco_bac06_device::pf_control1_8bit_swap_w)); + map(0x064000, 0x0647ff).rw(m_tilegen[0], FUNC(deco_bac06_device::pf_data_8bit_swap_r), FUNC(deco_bac06_device::pf_data_8bit_swap_w)); + map(0x066400, 0x0667ff).rw(m_tilegen[0], FUNC(deco_bac06_device::pf_rowscroll_8bit_swap_r), FUNC(deco_bac06_device::pf_rowscroll_8bit_swap_w)); map(0x100000, 0x100000).w(m_soundlatch, FUNC(generic_latch_8_device::write)); - map(0x110000, 0x110001).w(FUNC(actfancr_state::actfancr_buffer_spriteram_w)); + map(0x110000, 0x110001).w(FUNC(actfancr_state::buffer_spriteram_w)); map(0x120000, 0x1207ff).ram().share("spriteram"); map(0x130000, 0x1305ff).ram().w("palette", FUNC(palette_device::write8)).share("palette"); map(0x140000, 0x140001).nopr(); /* Value doesn't matter */ - map(0x1f0000, 0x1f3fff).ram().share("main_ram"); /* Main ram */ - map(0x1ff000, 0x1ff001).rw(FUNC(actfancr_state::triothep_control_r), FUNC(actfancr_state::triothep_control_select_w)); - map(0x1ff400, 0x1ff403).w(m_maincpu, FUNC(h6280_device::irq_status_w)); + map(0x1f0000, 0x1f3fff).ram(); /* Main ram */ } /******************************************************************************/ @@ -290,9 +288,9 @@ MACHINE_RESET_MEMBER(actfancr_state,triothep) MACHINE_CONFIG_START(actfancr_state::actfancr) /* basic machine hardware */ - MCFG_DEVICE_ADD("maincpu", H6280, 21477200/3) /* Should be accurate */ - MCFG_DEVICE_PROGRAM_MAP(actfan_map) - MCFG_DEVICE_VBLANK_INT_DRIVER("screen", actfancr_state, irq0_line_hold) /* VBL */ + H6280(config, m_maincpu, 21477200/3); /* Should be accurate */ + m_maincpu->set_addrmap(AS_PROGRAM, &actfancr_state::actfan_map); + m_maincpu->add_route(ALL_OUTPUTS, "mono", 0); // internal sound unused MCFG_DEVICE_ADD("audiocpu",M6502, 1500000) /* Should be accurate */ MCFG_DEVICE_PROGRAM_MAP(dec0_s_map) @@ -303,7 +301,8 @@ MACHINE_CONFIG_START(actfancr_state::actfancr) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529)) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE_DRIVER(actfancr_state, screen_update_actfancr) + MCFG_SCREEN_UPDATE_DRIVER(actfancr_state, screen_update) + MCFG_SCREEN_VBLANK_CALLBACK(HOLDLINE("maincpu", 0)) /* VBL */ MCFG_SCREEN_PALETTE("palette") MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_actfan) @@ -345,9 +344,11 @@ MACHINE_CONFIG_END MACHINE_CONFIG_START(actfancr_state::triothep) /* basic machine hardware */ - MCFG_DEVICE_ADD("maincpu",H6280,XTAL(21'477'272)/3) /* XIN=21.4772Mhz, verified on pcb */ - MCFG_DEVICE_PROGRAM_MAP(triothep_map) - MCFG_DEVICE_VBLANK_INT_DRIVER("screen", actfancr_state, irq0_line_hold) /* VBL */ + H6280(config, m_maincpu, XTAL(21'477'272)/3); /* XIN=21.4772Mhz, verified on pcb */ + m_maincpu->set_addrmap(AS_PROGRAM, &actfancr_state::triothep_map); + m_maincpu->port_in_cb().set(FUNC(actfancr_state::triothep_control_r)); + m_maincpu->port_out_cb().set(FUNC(actfancr_state::triothep_control_select_w)); + m_maincpu->add_route(ALL_OUTPUTS, "mono", 0); // internal sound unused MCFG_DEVICE_ADD("audiocpu",M6502, XTAL(12'000'000)/8) /* verified on pcb */ MCFG_DEVICE_PROGRAM_MAP(dec0_s_map) @@ -361,7 +362,8 @@ MACHINE_CONFIG_START(actfancr_state::triothep) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529)) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE_DRIVER(actfancr_state, screen_update_actfancr) + MCFG_SCREEN_UPDATE_DRIVER(actfancr_state, screen_update) + MCFG_SCREEN_VBLANK_CALLBACK(HOLDLINE("maincpu", 0)) /* VBL */ MCFG_SCREEN_PALETTE("palette") MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_triothep) diff --git a/src/mame/drivers/aim65.cpp b/src/mame/drivers/aim65.cpp index d8d941bdde0..082871eba0f 100644 --- a/src/mame/drivers/aim65.cpp +++ b/src/mame/drivers/aim65.cpp @@ -215,17 +215,17 @@ MACHINE_CONFIG_START(aim65_state::aim65) MCFG_MOS6530n_IN_PB_CB(READ8(*this, aim65_state, aim65_riot_b_r)) MCFG_MOS6530n_IRQ_CB(INPUTLINE("maincpu", M6502_IRQ_LINE)) - MCFG_DEVICE_ADD("via6522_0", VIA6522, AIM65_CLOCK) - MCFG_VIA6522_READPB_HANDLER(READ8(*this, aim65_state, aim65_pb_r)) + via6522_device &via0(VIA6522(config, "via6522_0", AIM65_CLOCK)); + via0.readpb_handler().set(FUNC(aim65_state::aim65_pb_r)); // in CA1 printer ready? - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, aim65_state, aim65_pb_w)) + via0.writepb_handler().set(FUNC(aim65_state::aim65_pb_w)); // out CB1 printer start // out CA2 cass control (H=in) // out CB2 turn printer on - MCFG_VIA6522_IRQ_HANDLER(INPUTLINE("maincpu", M6502_IRQ_LINE)) + via0.irq_handler().set_inputline("maincpu", M6502_IRQ_LINE); - MCFG_DEVICE_ADD("via6522_1", VIA6522, AIM65_CLOCK) - MCFG_VIA6522_IRQ_HANDLER(INPUTLINE("maincpu", M6502_IRQ_LINE)) + via6522_device &via1(VIA6522(config, "via6522_1", AIM65_CLOCK)); + via1.irq_handler().set_inputline("maincpu", M6502_IRQ_LINE); MCFG_DEVICE_ADD("pia6821", PIA6821, 0) MCFG_PIA_WRITEPA_HANDLER(WRITE8(*this, aim65_state, aim65_pia_a_w)) diff --git a/src/mame/drivers/alg.cpp b/src/mame/drivers/alg.cpp index b72d8a61b3a..96dc185ba6b 100644 --- a/src/mame/drivers/alg.cpp +++ b/src/mame/drivers/alg.cpp @@ -102,8 +102,8 @@ int alg_state::get_lightgun_pos(int player, int *x, int *y) if (xpos == -1 || ypos == -1) return false; - *x = visarea.min_x + xpos * visarea.width() / 255; - *y = visarea.min_y + ypos * visarea.height() / 255; + *x = visarea.left() + xpos * visarea.width() / 255; + *y = visarea.top() + ypos * visarea.height() / 255; return true; } diff --git a/src/mame/drivers/amiga.cpp b/src/mame/drivers/amiga.cpp index debff0fdf97..91cb1fe3449 100644 --- a/src/mame/drivers/amiga.cpp +++ b/src/mame/drivers/amiga.cpp @@ -1606,16 +1606,16 @@ MACHINE_CONFIG_START(cdtv_state::cdtv) MCFG_DEVICE_ADD("u61", MSM6242, XTAL(32'768)) // cd-rom controller - MCFG_DMAC_ADD("u36", amiga_state::CLK_7M_PAL) - MCFG_DMAC_SCSI_READ_HANDLER(READ8(*this, cdtv_state, dmac_scsi_data_read)) - MCFG_DMAC_SCSI_WRITE_HANDLER(WRITE8(*this, cdtv_state, dmac_scsi_data_write)) - MCFG_DMAC_IO_READ_HANDLER(READ8(*this, cdtv_state, dmac_io_read)) - MCFG_DMAC_IO_WRITE_HANDLER(WRITE8(*this, cdtv_state, dmac_io_write)) - MCFG_DMAC_INT_HANDLER(WRITELINE(*this, cdtv_state, dmac_int_w)) - - MCFG_DEVICE_ADD("u32", TPI6525, 0) - MCFG_TPI6525_OUT_IRQ_CB(WRITELINE(*this, cdtv_state, tpi_int_w)) - MCFG_TPI6525_OUT_PB_CB(WRITE8(*this, cdtv_state, tpi_port_b_write)) + AMIGA_DMAC(config, m_dmac, amiga_state::CLK_7M_PAL); + m_dmac->scsi_read_handler().set(FUNC(cdtv_state::dmac_scsi_data_read)); + m_dmac->scsi_write_handler().set(FUNC(cdtv_state::dmac_scsi_data_write)); + m_dmac->io_read_handler().set(FUNC(cdtv_state::dmac_io_read)); + m_dmac->io_write_handler().set(FUNC(cdtv_state::dmac_io_write)); + m_dmac->int_handler().set(FUNC(cdtv_state::dmac_int_w)); + + tpi6525_device &tpi(TPI6525(config, "u32", 0)); + tpi.out_irq_cb().set(FUNC(cdtv_state::tpi_int_w)); + tpi.out_pb_cb().set(FUNC(cdtv_state::tpi_port_b_write)); // cd-rom CR511B(config, m_cdrom, 0); diff --git a/src/mame/drivers/apple1.cpp b/src/mame/drivers/apple1.cpp index bb81a6bdc85..36b9ecf6fa3 100644 --- a/src/mame/drivers/apple1.cpp +++ b/src/mame/drivers/apple1.cpp @@ -358,14 +358,14 @@ uint32_t apple1_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap // the cursor 555 timer counts 0.52 of a second; the cursor is ON for // 2 of those counts and OFF for the last one. - if (((int)(machine().time().as_double() / (0.52 / 3.0)) % 3) < 2) + if ((int(machine().time().as_double() / (0.52 / 3.0)) % 3) < 2) { curs_save = m_vram[(m_cursy * 40) + m_cursx]; m_vram[(m_cursy * 40) + m_cursx] = 0x40; cursor_blink = 1; } - for (int row = 0; row < cliprect.max_y; row += 8) + for (int row = 0; row < cliprect.bottom(); row += 8) { for (int col = 0; col < 40; col++) { diff --git a/src/mame/drivers/apple2.cpp b/src/mame/drivers/apple2.cpp index 80df5c3356b..8c5ef0bf354 100644 --- a/src/mame/drivers/apple2.cpp +++ b/src/mame/drivers/apple2.cpp @@ -1740,6 +1740,36 @@ ROM_START(laba2p) /* II Plus clone with on-board Disk II controller and Videx-co ROM_END #endif +ROM_START( basis108 ) + ROM_REGION(0x4000, "maincpu", 0) // all roms overdumped + ROM_LOAD( "d0.d83", 0x1000, 0x0800, CRC(bb4ac440) SHA1(7901203845adab588850ae35f81e4ee2a2248686) ) + ROM_IGNORE( 0x0800 ) + ROM_LOAD( "d8.d70", 0x1800, 0x0800, CRC(3e8cdbcd) SHA1(b2a418818e4130859afd6c08b5695328a3edd2c5) ) + ROM_IGNORE( 0x0800 ) + ROM_LOAD( "e0.d56", 0x2000, 0x0800, CRC(0575ba28) SHA1(938884eb3ebd0870f99df33ee7a03e93cd625ab4) ) + ROM_IGNORE( 0x0800 ) + ROM_LOAD( "e8.d40", 0x2800, 0x0800, CRC(fc7229f6) SHA1(380ffcf0dba008f0bc43a483931e98034b1d0d52) ) + ROM_IGNORE( 0x0800 ) + ROM_LOAD( "f0.d39", 0x3000, 0x0800, CRC(bae4b24d) SHA1(b5ffc9b3552b13b2f577a42196addae71289203d) ) + ROM_IGNORE( 0x0800 ) + ROM_LOAD( "f8.d25", 0x3800, 0x0800, CRC(f84efac5) SHA1(66b7eadfdb938cda0de01dbeab1b74aa88bd096c) ) + ROM_IGNORE( 0x0800 ) + + ROM_REGION(0x2000, "gfx1", 0) + ROM_LOAD( "cg.d29", 0x0000, 0x1000, CRC(120de575) SHA1(e6e4e357b3834a143df9e5834abfb4a9139457d4) ) + + ROM_REGION(0x1000, "cg80col", 0) + ROM_LOAD( "dispcard_cg.bin", 0x0000, 0x1000, CRC(cf84811c) SHA1(135f4f35607dd74941f0a3cae813227bf8a8a020) ) + + ROM_REGION(0x1000, "fw80col", 0) + ROM_LOAD( "dispcard_ctrl_17.43.bin", 0x0000, 0x0800, CRC(bf04eda4) SHA1(86047c0ec6b06d647b95304d7f95d3d116f60e4a) ) + + ROM_REGION(0x800, "diskii", 0) + ROM_LOAD( "fdccard_fdc4_slot6.bin", 0x0000, 0x0800, CRC(2bd452bb) SHA1(10ba81d34117ef713c546d748bf0e1a8c04d1ae3) ) +ROM_END + + + // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME COMP( 1977, apple2, 0, 0, apple2, apple2, napple2_state, empty_init, "Apple Computer", "Apple ][", MACHINE_SUPPORTS_SAVE ) COMP( 1979, apple2p, apple2, 0, apple2p, apple2p, napple2_state, empty_init, "Apple Computer", "Apple ][+", MACHINE_SUPPORTS_SAVE ) @@ -1759,4 +1789,5 @@ COMP( 1985, prav8m, apple2, 0, apple2p, apple2p, napple2_state, empty_in COMP( 1985, space84, apple2, 0, space84, apple2p, napple2_state, empty_init, "ComputerTechnik/IBS", "Space 84", MACHINE_NOT_WORKING ) COMP( 1985, am64, apple2, 0, space84, apple2p, napple2_state, empty_init, "ASEM", "AM 64", MACHINE_SUPPORTS_SAVE ) //COMP( 19??, laba2p, apple2, 0, laba2p, apple2p, napple2_state, empty_init, "<unknown>", "Lab equipment Apple II Plus clone", MACHINE_SUPPORTS_SAVE ) -COMP( 1985, laser2c, apple2, 0, space84, apple2p, napple2_state, empty_init, "Milmar", "Laser //c", MACHINE_SUPPORTS_SAVE ) +COMP( 1985, laser2c, apple2, 0, space84, apple2p, napple2_state, empty_init, "Milmar", "Laser //c", MACHINE_SUPPORTS_SAVE ) +COMP( 1982, basis108, apple2, 0, apple2, apple2p, napple2_state, empty_init, "Basis", "Basis 108", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/drivers/apple2e.cpp b/src/mame/drivers/apple2e.cpp index d485237893b..72e0a243d07 100644 --- a/src/mame/drivers/apple2e.cpp +++ b/src/mame/drivers/apple2e.cpp @@ -171,7 +171,7 @@ Address bus A0-A11 is Y0-Y11 #define A2_UPPERBANK_TAG "inhbank" #define IIC_ACIA1_TAG "acia1" #define IIC_ACIA2_TAG "acia2" -#define IICP_IWM_TAG "iwm" +#define IICP_IWM_TAG "fdc" #define LASER128_UDC_TAG "l128udc" #define PRINTER_PORT_TAG "printer" #define MODEM_PORT_TAG "modem" @@ -393,6 +393,9 @@ public: void r2000bank_map(address_map &map); void r4000bank_map(address_map &map); void spectred_keyb_map(address_map &map); + + bool m_35sel, m_hdsel, m_intdrive; + private: int m_speaker_state; int m_cassette_state, m_cassette_out; @@ -435,6 +438,9 @@ private: uint8_t m_migram[0x800]; uint16_t m_migpage; + bool m_zipunlocked; + int m_zipstage; + uint8_t *m_ram_ptr, *m_rom_ptr, *m_cec_ptr; int m_ram_size; @@ -486,21 +492,36 @@ private: uint8_t apple2e_state::mig_r(uint16_t offset) { + //printf("mig_r @ %x\n", offset + 0xc00); // MIG RAM window - if (offset < 0x20) + if ((offset >= 0x200) && (offset < 0x220)) { return m_migram[m_migpage + offset]; } - // increment MIG RAM window - if (offset == 0x20) + // increment MIG RAM window and return previous value + if ((offset >= 0x220) && (offset < 0x240)) { + uint8_t rv = m_migram[m_migpage + offset]; m_migpage += 0x20; - m_migpage &= 0x7ff; // make sure we wrap + m_migpage &= 0x7ff; + return rv; + } + + if ((offset >= 0x240) && (offset < 0x260)) + { + m_hdsel = false; + sony_set_sel_line(m_iicpiwm, 0); + } + + if ((offset >= 0x260) && (offset < 0x280)) + { + m_hdsel = true; + sony_set_sel_line(m_iicpiwm, 0x80); } // reset MIG RAM window - if (offset == 0xa0) + if (offset == 0x2a0) { m_migpage = 0; } @@ -510,22 +531,58 @@ uint8_t apple2e_state::mig_r(uint16_t offset) void apple2e_state::mig_w(uint16_t offset, uint8_t data) { + //printf("mig_w %x @ %x\n", data, offset + 0xc00); + + if (offset == 0x40) + { + m_iicpiwm->device_reset(); + return; + } + + if ((offset >= 0x80) && (offset < 0xa0)) + { + //printf("MIG: enable internal drive on d2\n"); + m_intdrive = true; + return; + } + + if ((offset >= 0xc0) && (offset < 0xe0)) + { + //printf("MIG: disable internal drive\n"); + m_intdrive = false; + return; + } + // MIG RAM window - if (offset < 0x20) + if ((offset >= 0x200) && (offset < 0x220)) { m_migram[m_migpage + offset] = data; return; } - // increment MIG RAM window - if (offset == 0x20) + // increment MIG RAM window, but write value at old location first + if ((offset >= 0x220) && (offset < 0x240)) { + m_migram[m_migpage + offset] = data; m_migpage += 0x20; m_migpage &= 0x7ff; // make sure we wrap + return; + } + + if ((offset >= 0x240) && (offset < 0x260)) + { + m_35sel = false; + return; + } + + if ((offset >= 0x260) && (offset < 0x280)) + { + m_35sel = true; + return; } // reset MIG RAM window - if (offset == 0xa0) + if (offset == 0x2a0) { m_migpage = 0; } @@ -853,6 +910,11 @@ void apple2e_state::machine_start() save_item(NAME(m_mockingboard4c)); save_item(NAME(m_intc8rom)); save_item(NAME(m_cec_bank)); + save_item(NAME(m_35sel)); + save_item(NAME(m_hdsel)); + save_item(NAME(m_intdrive)); + save_item(NAME(m_zipunlocked)); + save_item(NAME(m_zipstage)); } void apple2e_state::machine_reset() @@ -875,6 +937,8 @@ void apple2e_state::machine_reset() m_mockingboard4c = false; m_intc8rom = false; m_cec_bank = 0; + m_zipunlocked = false; + m_zipstage = 0; // IIe prefers INTCXROM default to off, IIc has it always on if (m_rom_ptr[0x3bc0] == 0x00) @@ -1391,6 +1455,14 @@ void apple2e_state::do_io(address_space &space, int offset, bool is_iic) m_romswitch = !m_romswitch; update_slotrom_banks(); + // MIG is reset when ROMSWITCH turns off + if ((m_isiicplus) && !(m_romswitch)) + { + m_migpage = 0; + m_intdrive = false; + m_35sel = false; + } + // if LC is not enabled if (!m_lcram) { @@ -1986,6 +2058,34 @@ WRITE8_MEMBER(apple2e_state::c000_iic_w) m_strobe = 0; break; + case 0x5a: // IIC+ accelerator unlock + if (m_isiicplus) + { + if (data == 0x5a) + { + m_zipstage++; + if (m_zipstage == 4) + { + m_zipunlocked = true; + } + } + else if (data == 0xa5) + { + // put settings into effect and lock + m_zipunlocked = false; + m_zipstage = 0; + } + else + { + // disable acceleration and lock + m_zipunlocked = false; + m_zipstage = 0; + } + } + break; + + case 0x5b: + case 0x78: case 0x79: m_vbl = false; @@ -2113,6 +2213,11 @@ READ8_MEMBER(apple2e_state::c080_r) } else { + if ((m_isiicplus) && (slot == 6)) + { + return m_iicpiwm->read(offset % 0x10); + } + if (m_slotdevice[slot] != nullptr) { return m_slotdevice[slot]->read_c0nx(offset % 0x10); @@ -2143,6 +2248,12 @@ WRITE8_MEMBER(apple2e_state::c080_w) } else { + if ((m_isiicplus) && (slot == 6)) + { + m_iicpiwm->write(offset % 0x10, data); + return; + } + if (m_slotdevice[slot] != nullptr) { m_slotdevice[slot]->write_c0nx(offset % 0x10, data); @@ -2291,11 +2402,6 @@ READ8_MEMBER(apple2e_state::c400_cec_bank_r) { return m_rom_ptr[0x4400 + offset READ8_MEMBER(apple2e_state::c800_r) { - if ((m_isiicplus) && (m_romswitch) && (offset >= 0x600) && (offset < 0x700)) - { - return mig_r(offset-0x600); - } - if ((offset == 0x7ff) && !machine().side_effects_disabled()) { m_cnxx_slot = CNXX_UNCLAIMED; @@ -2313,11 +2419,6 @@ READ8_MEMBER(apple2e_state::c800_r) READ8_MEMBER(apple2e_state::c800_int_r) { - if ((m_isiicplus) && (m_romswitch) && (offset >= 0x600) && (offset < 0x700)) - { - return mig_r(offset-0x600); - } - if ((offset == 0x7ff) && !machine().side_effects_disabled()) { m_cnxx_slot = CNXX_UNCLAIMED; @@ -2335,9 +2436,9 @@ READ8_MEMBER(apple2e_state::c800_int_r) READ8_MEMBER(apple2e_state::c800_b2_int_r) { - if ((m_isiicplus) && (m_romswitch) && (offset >= 0x600) && (offset < 0x700)) + if ((m_isiicplus) && (m_romswitch) && (((offset >= 0x400) && (offset < 0x500)) || ((offset >= 0x600) && (offset < 0x700)))) { - return mig_r(offset-0x600); + return mig_r(offset-0x400); } if ((offset == 0x7ff) && !machine().side_effects_disabled()) @@ -2352,9 +2453,9 @@ READ8_MEMBER(apple2e_state::c800_b2_int_r) WRITE8_MEMBER(apple2e_state::c800_w) { - if ((m_isiicplus) && (m_romswitch) && (offset >= 0x600) && (offset < 0x700)) + if ((m_isiicplus) && (m_romswitch) && (((offset >= 0x400) && (offset < 0x500)) || ((offset >= 0x600) && (offset < 0x700)))) { - mig_w(offset-0x600, data); + mig_w(offset-0x400, data); return; } @@ -2400,22 +2501,11 @@ WRITE8_MEMBER(apple2e_state::inh_w) READ8_MEMBER(apple2e_state::lc_romswitch_r) { - if ((offset >= 0xc00) && (offset < 0xd00)) - { - return mig_r(offset-0xc00); - } - return m_rom_ptr[0x5000 + offset]; } WRITE8_MEMBER(apple2e_state::lc_romswitch_w) { - if ((offset >= 0xc00) && (offset < 0xd00)) - { - mig_w(offset-0xc00, data); - return; - } - lc_w(space, offset, data); } @@ -4126,14 +4216,92 @@ MACHINE_CONFIG_START(apple2e_state::apple2c) MCFG_RAM_EXTRA_OPTIONS("128K") MACHINE_CONFIG_END +static void apple2cp_set_lines(device_t *device, uint8_t lines) +{ + apple2e_state *state = device->machine().driver_data<apple2e_state>(); + + if (state->m_35sel) + { + sony_set_lines(device, lines); + } + else + { + apple525_set_lines(device, lines); + } +} + +static void apple2cp_set_enable_lines(device_t *device,int enable_mask) +{ + apple2e_state *state = device->machine().driver_data<apple2e_state>(); + +// printf("set_enable_lines: 35sel %d int %d enable_mask %d\n", state->m_35sel, state->m_intdrive, enable_mask); + + if ((state->m_35sel) && (state->m_intdrive) && (enable_mask == 2)) + { + sony_set_enable_lines(device, 1); + } + else if (!state->m_35sel) + { + apple525_set_enable_lines(device, enable_mask); + } + else + { + sony_set_enable_lines(device, 0); + } +} + +static uint8_t apple2cp_read_data(device_t *device) +{ + apple2e_state *state = device->machine().driver_data<apple2e_state>(); + + if (state->m_35sel) + { + return sony_read_data(device); + } + else + { + return apple525_read_data(device); + } + + return 0; +} + +static void apple2cp_write_data(device_t *device, uint8_t data) +{ + apple2e_state *state = device->machine().driver_data<apple2e_state>(); + + if (state->m_35sel) + { + sony_write_data(device, data); + } + else + { + apple525_write_data(device, data); + } +} + +static int apple2cp_read_status(device_t *device) +{ + apple2e_state *state = device->machine().driver_data<apple2e_state>(); + + if (state->m_35sel) + { + return sony_read_status(device); + } + else + { + return apple525_read_status(device); + } +} + const applefdc_interface a2cp_interface = { - sony_set_lines, /* set_lines */ - sony_set_enable_lines, /* set_enable_lines */ + apple2cp_set_lines, /* set_lines */ + apple2cp_set_enable_lines, /* set_enable_lines */ - sony_read_data, /* read_data */ - sony_write_data, /* write_data */ - sony_read_status /* read_status */ + apple2cp_read_data, /* read_data */ + apple2cp_write_data, /* write_data */ + apple2cp_read_status /* read_status */ }; static const floppy_interface apple2cp_floppy35_floppy_interface = @@ -4143,12 +4311,27 @@ static const floppy_interface apple2cp_floppy35_floppy_interface = "floppy_3_5" }; +static const floppy_interface floppy_interface = +{ + FLOPPY_STANDARD_5_25_DSHD, + LEGACY_FLOPPY_OPTIONS_NAME(apple2), + "floppy_5_25" +}; + MACHINE_CONFIG_START(apple2e_state::apple2cp) apple2c(config); + MCFG_DEVICE_REPLACE("maincpu", M65C02, 1021800) /* close to actual CPU frequency of 1.020484 MHz */ + MCFG_DEVICE_PROGRAM_MAP(apple2c_memexp_map) + MCFG_DEVICE_REMOVE("sl4") MCFG_DEVICE_REMOVE("sl6") MCFG_IWM_ADD(IICP_IWM_TAG, a2cp_interface) - MCFG_LEGACY_FLOPPY_SONY_2_DRIVES_ADD(apple2cp_floppy35_floppy_interface) + MCFG_LEGACY_FLOPPY_APPLE_2_DRIVES_ADD(floppy_interface,15,16) + MCFG_LEGACY_FLOPPY_SONY_2_DRIVES_ADDITIONAL_ADD(apple2cp_floppy35_floppy_interface) + + MCFG_RAM_MODIFY(RAM_TAG) + MCFG_RAM_DEFAULT_SIZE("128K") + MCFG_RAM_EXTRA_OPTIONS("128K, 384K, 640K, 896K, 1152K") MACHINE_CONFIG_END MACHINE_CONFIG_START(apple2e_state::apple2c_iwm) @@ -4181,13 +4364,6 @@ const applefdc_interface fdc_interface = apple525_read_status /* read_status */ }; -static const floppy_interface floppy_interface = -{ - FLOPPY_STANDARD_5_25_DSHD, - LEGACY_FLOPPY_OPTIONS_NAME(apple2), - "floppy_5_25" -}; - MACHINE_CONFIG_START(apple2e_state::laser128) apple2c(config); MCFG_DEVICE_REPLACE("maincpu", M65C02, 1021800) /* close to actual CPU frequency of 1.020484 MHz */ @@ -4553,4 +4729,4 @@ COMP( 1985, apple2c0, apple2c, 0, apple2c_iwm, apple2c, apple2e_state, COMP( 1986, apple2c3, apple2c, 0, apple2c_mem, apple2c, apple2e_state, empty_init, "Apple Computer", "Apple //c (Original Memory Expansion)", MACHINE_SUPPORTS_SAVE ) COMP( 1986, apple2c4, apple2c, 0, apple2c_mem, apple2c, apple2e_state, empty_init, "Apple Computer", "Apple //c (rev 4)", MACHINE_SUPPORTS_SAVE ) COMP( 1987, ceci, 0, apple2, ceci, ceci, apple2e_state, empty_init, "Shaanxi Province Computer Factory", "China Education Computer I", MACHINE_SUPPORTS_SAVE ) -COMP( 1988, apple2cp, apple2c, 0, apple2cp, apple2c, apple2e_state, empty_init, "Apple Computer", "Apple //c Plus", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) +COMP( 1988, apple2cp, apple2c, 0, apple2cp, apple2c, apple2e_state, empty_init, "Apple Computer", "Apple //c Plus", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/drivers/apple3.cpp b/src/mame/drivers/apple3.cpp index b5671602f57..be1be563c2f 100644 --- a/src/mame/drivers/apple3.cpp +++ b/src/mame/drivers/apple3.cpp @@ -135,15 +135,15 @@ MACHINE_CONFIG_START(apple3_state::apple3) MCFG_DEVICE_ADD("rtc", MM58167, XTAL(32'768)) /* via */ - MCFG_DEVICE_ADD("via6522_0", VIA6522, 1000000) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, apple3_state, apple3_via_0_out_a)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, apple3_state, apple3_via_0_out_b)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, apple3_state, apple3_via_0_irq_func)) - - MCFG_DEVICE_ADD("via6522_1", VIA6522, 1000000) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, apple3_state, apple3_via_1_out_a)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, apple3_state, apple3_via_1_out_b)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, apple3_state, apple3_via_1_irq_func)) + VIA6522(config, m_via[0], 1000000); + m_via[0]->writepa_handler().set(FUNC(apple3_state::apple3_via_0_out_a)); + m_via[0]->writepb_handler().set(FUNC(apple3_state::apple3_via_0_out_b)); + m_via[0]->irq_handler().set(FUNC(apple3_state::apple3_via_0_irq_func)); + + VIA6522(config, m_via[1], 1000000); + m_via[1]->writepa_handler().set(FUNC(apple3_state::apple3_via_1_out_a)); + m_via[1]->writepb_handler().set(FUNC(apple3_state::apple3_via_1_out_b)); + m_via[1]->irq_handler().set(FUNC(apple3_state::apple3_via_1_irq_func)); /* sound */ SPEAKER(config, "speaker").front_center(); diff --git a/src/mame/drivers/applix.cpp b/src/mame/drivers/applix.cpp index f46e363de44..6c8f094dcf9 100644 --- a/src/mame/drivers/applix.cpp +++ b/src/mame/drivers/applix.cpp @@ -893,14 +893,14 @@ MACHINE_CONFIG_START(applix_state::applix) MCFG_MC6845_UPDATE_ROW_CB(applix_state, crtc_update_row) MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(*this, applix_state, vsync_w)) - MCFG_DEVICE_ADD("via6522", VIA6522, 30_MHz_XTAL / 4 / 10) // VIA uses 68000 E clock - MCFG_VIA6522_READPB_HANDLER(READ8(*this, applix_state, applix_pb_r)) + VIA6522(config, m_via, 30_MHz_XTAL / 4 / 10); // VIA uses 68000 E clock + m_via->readpb_handler().set(FUNC(applix_state::applix_pb_r)); // in CB1 kbd clk // in CA2 vsync // in CB2 kdb data - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, applix_state, applix_pa_w)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, applix_state, applix_pb_w)) - MCFG_VIA6522_IRQ_HANDLER(INPUTLINE("maincpu", M68K_IRQ_2)) + m_via->writepa_handler().set(FUNC(applix_state::applix_pa_w)); + m_via->writepb_handler().set(FUNC(applix_state::applix_pb_w)); + m_via->irq_handler().set_inputline("maincpu", M68K_IRQ_2); MCFG_DEVICE_ADD(m_centronics, CENTRONICS, centronics_devices, "printer") MCFG_CENTRONICS_ACK_HANDLER(WRITELINE("via6522", via6522_device, write_ca1)) diff --git a/src/mame/drivers/apricotp.cpp b/src/mame/drivers/apricotp.cpp index aa44e5389c4..f801f6f2449 100644 --- a/src/mame/drivers/apricotp.cpp +++ b/src/mame/drivers/apricotp.cpp @@ -9,8 +9,6 @@ 11/09/2011 - modernised. The portable doesn't seem to have scroll registers, and it sets the palette to black. - I've added a temporary video output so that you can get - an idea of what the screen should look like. [Robbbert] ****************************************************************************/ diff --git a/src/mame/drivers/aristmk4.cpp b/src/mame/drivers/aristmk4.cpp index a2ff4bc9606..fd36775d135 100644 --- a/src/mame/drivers/aristmk4.cpp +++ b/src/mame/drivers/aristmk4.cpp @@ -378,6 +378,13 @@ public: void init_aristmk4(); private: + enum + { + TIMER_POWER_FAIL + }; + + virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; + required_device<cpu_device> m_maincpu; required_device<mc146818_device> m_rtc; required_device<ay8910_device> m_ay1; @@ -409,6 +416,8 @@ private: int m_insnote; int m_cashcade_c; int m_printer_motor; + emu_timer *m_power_timer; + DECLARE_READ8_MEMBER(ldsw); DECLARE_READ8_MEMBER(cgdrr); DECLARE_WRITE8_MEMBER(cgdrw); @@ -442,17 +451,17 @@ private: virtual void machine_start() override; virtual void machine_reset() override; virtual void video_start() override; - DECLARE_PALETTE_INIT(aristmk4); - DECLARE_PALETTE_INIT(lions); + void aristmk4_palette(palette_device &palette); + void lions_palette(palette_device &palette); uint32_t screen_update_aristmk4(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); TIMER_CALLBACK_MEMBER(note_input_reset); TIMER_CALLBACK_MEMBER(coin_input_reset); TIMER_CALLBACK_MEMBER(hopper_reset); - TIMER_DEVICE_CALLBACK_MEMBER(aristmk4_pf); + void power_fail(); inline void uBackgroundColour(); - void aristmk4_map(address_map &map); - void aristmk4_poker_map(address_map &map); + void slots_mem(address_map &map); + void poker_mem(address_map &map); }; /* Partial Cashcade protocol */ @@ -1016,7 +1025,7 @@ ADDRESS MAP - SLOT GAMES ******************************************************************************/ -void aristmk4_state::aristmk4_map(address_map &map) +void aristmk4_state::slots_mem(address_map &map) { map(0x0000, 0x07ff).ram().share("mkiv_vram"); // video ram - chips U49 / U50 map(0x0800, 0x17ff).ram(); @@ -1061,7 +1070,7 @@ The graphics rom is mapped from 0x4000 - 0x4fff The U87 personality rom is not required, therefore game rom code mapping is from 0x8000-0xffff */ -void aristmk4_state::aristmk4_poker_map(address_map &map) +void aristmk4_state::poker_mem(address_map &map) { map(0x0000, 0x07ff).ram().share("mkiv_vram"); // video ram - chips U49 / U50 map(0x0800, 0x17ff).ram(); @@ -1692,29 +1701,18 @@ READ8_MEMBER(aristmk4_state::pc1_r) } /* same as Casino Winner HW */ -PALETTE_INIT_MEMBER(aristmk4_state, aristmk4) +void aristmk4_state::aristmk4_palette(palette_device &palette) { const uint8_t *color_prom = memregion("proms")->base(); - int i; - for (i = 0;i < palette.entries();i++) + for (int i = 0; i < palette.entries(); i++) { - int bit0,bit1,bit2,r,g,b; - - bit0 = (color_prom[0] >> 0) & 0x01; - bit1 = (color_prom[0] >> 1) & 0x01; - b = 0x4f * bit0 + 0xa8 * bit1; - bit0 = (color_prom[0] >> 2) & 0x01; - bit1 = (color_prom[0] >> 3) & 0x01; - bit2 = (color_prom[0] >> 4) & 0x01; - g = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - bit0 = (color_prom[0] >> 5) & 0x01; - bit1 = (color_prom[0] >> 6) & 0x01; - bit2 = (color_prom[0] >> 7) & 0x01; - r = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; + const uint8_t data = color_prom[i]; + const int b = 0x4f * BIT(data, 0) + 0xa8 * BIT(data, 1); + const int g = 0x21 * BIT(data, 2) + 0x47 * BIT(data, 3) + 0x97 * BIT(data, 4); + const int r = 0x21 * BIT(data, 5) + 0x47 * BIT(data, 6) + 0x97 * BIT(data, 7); palette.set_pen_color(i, rgb_t(r, g, b)); - color_prom++; } } @@ -1732,6 +1730,7 @@ void aristmk4_state::machine_start() m_credit_out_meter.resolve(); m_hopper_motor_out.resolve(); m_lamps.resolve(); + m_power_timer = timer_alloc(TIMER_POWER_FAIL); } void aristmk4_state::machine_reset() @@ -1746,9 +1745,20 @@ void aristmk4_state::machine_reset() m_maincpu->set_unscaled_clock(MAIN_CLOCK/8); // 1.5 MHz break; } + + m_power_timer->adjust(attotime::from_hz(1), 0, attotime::from_hz(1)); } -TIMER_DEVICE_CALLBACK_MEMBER(aristmk4_state::aristmk4_pf) +void aristmk4_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) +{ + switch (id) + { + case TIMER_POWER_FAIL: power_fail(); break; + default: assert_always(false, "Unknown id in aristmk4_state::device_timer"); + } +} + +void aristmk4_state::power_fail() { /* IRQ generator pulses the NMI signal to CPU in the event of power down or power failure. @@ -1768,118 +1778,106 @@ TIMER_DEVICE_CALLBACK_MEMBER(aristmk4_state::aristmk4_pf) if(ioport("powerfail")->read()) // send NMI signal if L pressed { - m_maincpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE ); + m_maincpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE); } } -MACHINE_CONFIG_START(aristmk4_state::aristmk4) +void aristmk4_state::aristmk4(machine_config &config) +{ /* basic machine hardware */ - MCFG_DEVICE_ADD("maincpu", MC6809E, MAIN_CLOCK/8) // M68B09E @ 1.5 MHz - MCFG_DEVICE_PROGRAM_MAP(aristmk4_map) - MCFG_DEVICE_VBLANK_INT_DRIVER("screen", aristmk4_state, irq0_line_hold) + MC6809E(config, m_maincpu, MAIN_CLOCK/8); // M68B09E @ 1.5 MHz + m_maincpu->set_addrmap(AS_PROGRAM, &aristmk4_state::slots_mem); - MCFG_NVRAM_ADD_0FILL("nvram") - MCFG_TIMER_DRIVER_ADD_PERIODIC("power_fail", aristmk4_state, aristmk4_pf, attotime::from_hz(1)) + NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); /* video hardware */ - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_SIZE(320, 256) - MCFG_SCREEN_VISIBLE_AREA(0, 304-1, 0, 216-1) /* from the crtc registers... updated by crtc */ - MCFG_SCREEN_UPDATE_DRIVER(aristmk4_state, screen_update_aristmk4) - MCFG_SCREEN_PALETTE("palette") - - MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_aristmk4) - MCFG_PALETTE_ADD("palette", 512) - MCFG_PALETTE_INIT_OWNER(aristmk4_state, aristmk4) - - MCFG_DEVICE_ADD("ppi8255_0", I8255A, 0) - MCFG_I8255_IN_PORTA_CB(READ8(*this, aristmk4_state, pa1_r)) - MCFG_I8255_IN_PORTB_CB(READ8(*this, aristmk4_state, pb1_r)) - MCFG_I8255_IN_PORTC_CB(READ8(*this, aristmk4_state, pc1_r)) - - MCFG_DEVICE_ADD("via6522_0", VIA6522, MAIN_CLOCK/8) // R65C22P2 - MCFG_VIA6522_READPA_HANDLER(READ8(*this, aristmk4_state, via_a_r)) - MCFG_VIA6522_READPB_HANDLER(READ8(*this, aristmk4_state, via_b_r)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, aristmk4_state, via_a_w)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, aristmk4_state, via_b_w)) - MCFG_VIA6522_CA2_HANDLER(WRITELINE(*this, aristmk4_state, via_ca2_w)) - MCFG_VIA6522_CB2_HANDLER(WRITELINE(*this, aristmk4_state, via_cb2_w)) - MCFG_VIA6522_IRQ_HANDLER(INPUTLINE("maincpu", M6809_FIRQ_LINE)) + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); + screen.set_refresh_hz(60); + screen.set_vblank_time(ATTOSECONDS_IN_USEC(0)); + screen.set_size(320, 256); + screen.set_visarea(0, 304-1, 0, 216-1); /* from the crtc registers... updated by crtc */ + screen.set_screen_update(FUNC(aristmk4_state::screen_update_aristmk4)); + screen.screen_vblank().set_inputline(m_maincpu, M6809_IRQ_LINE, HOLD_LINE); + screen.set_palette(m_palette); + + GFXDECODE(config, m_gfxdecode, m_palette, gfx_aristmk4); + PALETTE(config, m_palette, 512); + m_palette->set_init(DEVICE_SELF_OWNER, FUNC(aristmk4_state::aristmk4_palette)); + + i8255_device &ppi(I8255A(config, "ppi8255_0")); + ppi.in_pa_callback().set(FUNC(aristmk4_state::pa1_r)); + ppi.in_pb_callback().set(FUNC(aristmk4_state::pb1_r)); + ppi.in_pc_callback().set(FUNC(aristmk4_state::pc1_r)); + + via6522_device &via(VIA6522(config, "via6522_0", MAIN_CLOCK/8)); // R65C22P2 + via.readpa_handler().set(FUNC(aristmk4_state::via_a_r)); + via.readpb_handler().set(FUNC(aristmk4_state::via_b_r)); + via.writepa_handler().set(FUNC(aristmk4_state::via_a_w)); + via.writepb_handler().set(FUNC(aristmk4_state::via_b_w)); + via.ca2_handler().set(FUNC(aristmk4_state::via_ca2_w)); + via.cb2_handler().set(FUNC(aristmk4_state::via_cb2_w)); + via.irq_handler().set_inputline(m_maincpu, M6809_FIRQ_LINE); // CA1 is connected to +5V, CB1 is not connected. - MCFG_DEVICE_ADD("pia6821_0", PIA6821, 0) - MCFG_PIA_READPA_HANDLER(READ8(*this, aristmk4_state, mkiv_pia_ina)) - MCFG_PIA_WRITEPA_HANDLER(WRITE8(*this, aristmk4_state, mkiv_pia_outa)) - MCFG_PIA_WRITEPB_HANDLER(WRITE8(*this, aristmk4_state, mkiv_pia_outb)) - MCFG_PIA_CA2_HANDLER(WRITELINE(*this, aristmk4_state, mkiv_pia_ca2)) - MCFG_PIA_CB2_HANDLER(WRITELINE(*this, aristmk4_state, mkiv_pia_cb2)) + pia6821_device &pia(PIA6821(config, "pia6821_0", 0)); + pia.readpa_handler().set(FUNC(aristmk4_state::mkiv_pia_ina)); + pia.writepa_handler().set(FUNC(aristmk4_state::mkiv_pia_outa)); + pia.writepb_handler().set(FUNC(aristmk4_state::mkiv_pia_outb)); + pia.ca2_handler().set(FUNC(aristmk4_state::mkiv_pia_ca2)); + pia.cb2_handler().set(FUNC(aristmk4_state::mkiv_pia_cb2)); - MCFG_MC6845_ADD("crtc", C6545_1, "screen", MAIN_CLOCK/8) // TODO: type is unknown + mc6845_device &crtc(C6545_1(config, "crtc", MAIN_CLOCK/8)); // TODO: type is unknown + crtc.set_screen("screen"); /* in fact is a mc6845 driving 4 pixels by memory address. that's why the big horizontal parameters */ - MCFG_MC6845_SHOW_BORDER_AREA(false) - MCFG_MC6845_CHAR_WIDTH(4) + crtc.set_show_border_area(false); + crtc.set_char_width(4); - MCFG_DEVICE_ADD("rtc", MC146818, 4.194304_MHz_XTAL) + MC146818(config, m_rtc, 4.194304_MHz_XTAL); SPEAKER(config, "mono").front_center(); // the Mark IV has X 2 AY8910 sound chips which are tied to the VIA - MCFG_DEVICE_ADD("ay1", AY8910 , MAIN_CLOCK/8) - MCFG_AY8910_PORT_A_READ_CB(IOPORT("DSW1")) - MCFG_AY8910_PORT_B_WRITE_CB(WRITE8(*this, aristmk4_state, zn434_w)) // Port write to set Vout of the DA convertors ( 2 x ZN434 ) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.40) - - MCFG_DEVICE_ADD("ay2", AY8910 , MAIN_CLOCK/8) - MCFG_AY8910_PORT_A_WRITE_CB(WRITE8(*this, aristmk4_state, pblp_out)) // Port A write - goes to lamps on the buttons x8 - MCFG_AY8910_PORT_B_WRITE_CB(WRITE8(*this, aristmk4_state, pbltlp_out)) // Port B write - goes to lamps on the buttons x4 and light tower x4 - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.40) - - MCFG_DEVICE_ADD("samples", SAMPLES) - MCFG_SAMPLES_CHANNELS(5) /* one for each meter - can pulse simultaneously */ - MCFG_SAMPLES_NAMES(meter_sample_names) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.05) - -MACHINE_CONFIG_END + AY8910(config, m_ay1, MAIN_CLOCK/8); + m_ay1->port_a_read_callback().set_ioport("DSW1"); + m_ay1->port_b_write_callback().set(FUNC(aristmk4_state::zn434_w)); // Port write to set Vout of the DA convertors ( 2 x ZN434 ) + m_ay1->add_route(ALL_OUTPUTS, "mono", 0.40); + + AY8910(config, m_ay2, MAIN_CLOCK/8); + m_ay2->port_a_write_callback().set(FUNC(aristmk4_state::pblp_out)); // Port A write - goes to lamps on the buttons x8 + m_ay2->port_b_write_callback().set(FUNC(aristmk4_state::pbltlp_out)); // Port B write - goes to lamps on the buttons x4 and light tower x4 + m_ay2->add_route(ALL_OUTPUTS, "mono", 0.40); + + SAMPLES(config, m_samples); + m_samples->set_channels(5); /* one for each meter - can pulse simultaneously */ + m_samples->set_samples_names(meter_sample_names); + m_samples->add_route(ALL_OUTPUTS, "mono", 0.05); +} -MACHINE_CONFIG_START(aristmk4_state::aristmk4_poker) +void aristmk4_state::aristmk4_poker(machine_config &config) +{ aristmk4(config); - /* basic machine hardware */ - MCFG_DEVICE_MODIFY("maincpu") - MCFG_DEVICE_PROGRAM_MAP(aristmk4_poker_map) - MCFG_DEVICE_VBLANK_INT_DRIVER("screen", aristmk4_state, irq0_line_hold) -MACHINE_CONFIG_END + m_maincpu->set_addrmap(AS_PROGRAM, &aristmk4_state::poker_mem); +} /* same as Aristocrat Mark-IV HW color offset 7 */ -PALETTE_INIT_MEMBER(aristmk4_state,lions) +void aristmk4_state::lions_palette(palette_device &palette) { - int i; - - for (i = 0;i < palette.entries();i++) + for (int i = 0; i < palette.entries(); i++) { - int bit0,bit1,r,g,b; - - bit0 = (i >> 0) & 0x01; - bit1 = (i >> 1) & 0x01; - b = 0x4f * bit0 + 0xa8 * bit1; - bit0 = (i >> 2) & 0x01; - bit1 = (i >> 3) & 0x01; - g = 0x4f * bit0 + 0xa8 * bit1; - bit0 = (i >> 4) & 0x01; - bit1 = (i >> 5) & 0x01; - r = 0x4f * bit0 + 0xa8 * bit1; + const int b = 0x4f * BIT(i, 0) + 0xa8 * BIT(i, 1); + const int g = 0x4f * BIT(i, 2) + 0xa8 * BIT(i, 3); + const int r = 0x4f * BIT(i, 4) + 0xa8 * BIT(i, 5); palette.set_pen_color(i, rgb_t(r, g, b)); } } -MACHINE_CONFIG_START(aristmk4_state::_86lions) +void aristmk4_state::_86lions(machine_config &config) +{ aristmk4(config); - MCFG_PALETTE_MODIFY("palette") - MCFG_PALETTE_INIT_OWNER(aristmk4_state,lions) -MACHINE_CONFIG_END + m_palette->set_init(DEVICE_SELF_OWNER, FUNC(aristmk4_state::lions_palette)); +} ROM_START( 3bagflvt ) ROM_REGION(0x10000, "maincpu", 0 ) diff --git a/src/mame/drivers/astrof.cpp b/src/mame/drivers/astrof.cpp index c6f3f85802b..954418c4465 100644 --- a/src/mame/drivers/astrof.cpp +++ b/src/mame/drivers/astrof.cpp @@ -374,7 +374,7 @@ void astrof_state::video_update_common( bitmap_rgb32 &bitmap, const rectangle &c if (!m_flipscreen) y = ~y; - if ((y <= cliprect.min_y) || (y >= cliprect.max_y)) + if ((y <= cliprect.top()) || (y >= cliprect.bottom())) continue; if (m_screen_off) diff --git a/src/mame/drivers/atarist.cpp b/src/mame/drivers/atarist.cpp index d01e603bf76..0c4e4a44eef 100644 --- a/src/mame/drivers/atarist.cpp +++ b/src/mame/drivers/atarist.cpp @@ -2050,13 +2050,13 @@ MACHINE_CONFIG_START(st_state::st) MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics") - MCFG_DEVICE_ADD(MC68901_TAG, MC68901, Y2/8) - MCFG_MC68901_TIMER_CLOCK(Y1) - MCFG_MC68901_RX_CLOCK(0) - MCFG_MC68901_TX_CLOCK(0) - MCFG_MC68901_OUT_IRQ_CB(INPUTLINE(M68000_TAG, M68K_IRQ_6)) - MCFG_MC68901_OUT_TDO_CB(WRITELINE(*this, st_state, mfp_tdo_w)) - MCFG_MC68901_OUT_SO_CB(WRITELINE(RS232_TAG, rs232_port_device, write_txd)) + MC68901(config, m_mfp, Y2/8); + m_mfp->set_timer_clock(Y1); + m_mfp->set_rx_clock(0); + m_mfp->set_tx_clock(0); + m_mfp->out_irq_cb().set_inputline(M68000_TAG, M68K_IRQ_6); + m_mfp->out_tdo_cb().set(FUNC(st_state::mfp_tdo_w)); + m_mfp->out_so_cb().set(RS232_TAG, FUNC(rs232_port_device::write_txd)); MCFG_DEVICE_ADD(RS232_TAG, RS232_PORT, default_rs232_devices, nullptr) MCFG_RS232_RXD_HANDLER(WRITELINE(MC68901_TAG, mc68901_device, write_rx)) @@ -2144,13 +2144,13 @@ MACHINE_CONFIG_START(megast_state::megast) MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics") - MCFG_DEVICE_ADD(MC68901_TAG, MC68901, Y2/8) - MCFG_MC68901_TIMER_CLOCK(Y1) - MCFG_MC68901_RX_CLOCK(0) - MCFG_MC68901_TX_CLOCK(0) - MCFG_MC68901_OUT_IRQ_CB(INPUTLINE(M68000_TAG, M68K_IRQ_6)) - MCFG_MC68901_OUT_TDO_CB(WRITELINE(*this, st_state, mfp_tdo_w)) - MCFG_MC68901_OUT_SO_CB(WRITELINE(RS232_TAG, rs232_port_device, write_txd)) + MC68901(config, m_mfp, Y2/8); + m_mfp->set_timer_clock(Y1); + m_mfp->set_rx_clock(0); + m_mfp->set_tx_clock(0); + m_mfp->out_irq_cb().set_inputline(M68000_TAG, M68K_IRQ_6); + m_mfp->out_tdo_cb().set(FUNC(st_state::mfp_tdo_w)); + m_mfp->out_so_cb().set(RS232_TAG, FUNC(rs232_port_device::write_txd)); MCFG_DEVICE_ADD(RS232_TAG, RS232_PORT, default_rs232_devices, nullptr) MCFG_RS232_RXD_HANDLER(WRITELINE(MC68901_TAG, mc68901_device, write_rx)) @@ -2246,13 +2246,13 @@ MACHINE_CONFIG_START(ste_state::ste) MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics") - MCFG_DEVICE_ADD(MC68901_TAG, MC68901, Y2/8) - MCFG_MC68901_TIMER_CLOCK(Y1) - MCFG_MC68901_RX_CLOCK(0) - MCFG_MC68901_TX_CLOCK(0) - MCFG_MC68901_OUT_IRQ_CB(INPUTLINE(M68000_TAG, M68K_IRQ_6)) - MCFG_MC68901_OUT_TDO_CB(WRITELINE(*this, st_state, mfp_tdo_w)) - MCFG_MC68901_OUT_SO_CB(WRITELINE(RS232_TAG, rs232_port_device, write_txd)) + MC68901(config, m_mfp, Y2/8); + m_mfp->set_timer_clock(Y1); + m_mfp->set_rx_clock(0); + m_mfp->set_tx_clock(0); + m_mfp->out_irq_cb().set_inputline(M68000_TAG, M68K_IRQ_6); + m_mfp->out_tdo_cb().set(FUNC(st_state::mfp_tdo_w)); + m_mfp->out_so_cb().set(RS232_TAG, FUNC(rs232_port_device::write_txd)); MCFG_DEVICE_ADD(RS232_TAG, RS232_PORT, default_rs232_devices, nullptr) MCFG_RS232_RXD_HANDLER(WRITELINE(MC68901_TAG, mc68901_device, write_rx)) @@ -2344,13 +2344,13 @@ static MACHINE_CONFIG_START(stbook_state::stbook) MCFG_AY8910_PORT_B_WRITE_CB(WRITE8("cent_data_out", output_latch_device, bus_w)) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00) - MCFG_DEVICE_ADD(MC68901_TAG, MC68901, U517/8) - MCFG_MC68901_TIMER_CLOCK(Y1) - MCFG_MC68901_RX_CLOCK(0) - MCFG_MC68901_TX_CLOCK(0) - MCFG_MC68901_OUT_IRQ_CB(INPUTLINE(M68000_TAG, M68K_IRQ_6)) - MCFG_MC68901_OUT_TDO_CB(WRITELINE(*this, st_state, mfp_tdo_w)) - MCFG_MC68901_OUT_SO_CB(WRITELINE(RS232_TAG, rs232_port_device, write_txd)) + MC68901(config, m_mfp, U517/8); + m_mfp->set_timer_clock(Y1); + m_mfp->set_rx_clock(0); + m_mfp->set_tx_clock(0); + m_mfp->out_irq_cb().set_inputline(M68000_TAG, M68K_IRQ_6); + m_mfp->out_tdo_cb().set(FUNC(st_state::mfp_tdo_w)); + m_mfp->out_so_cb().set(RS232_TAG, FUNC(rs232_port_device::write_txd)); WD1772(config, m_fdc, U517/2); m_fdc->intrq_wr_callback().set(m_mfp, FUNC(mc68901_device::i5_w)).invert(); diff --git a/src/mame/drivers/atarisy1.cpp b/src/mame/drivers/atarisy1.cpp index 40a6027420c..f1b5ed8af50 100644 --- a/src/mame/drivers/atarisy1.cpp +++ b/src/mame/drivers/atarisy1.cpp @@ -791,11 +791,11 @@ MACHINE_CONFIG_START(atarisy1_state::atarisy1) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0) /* via */ - MCFG_DEVICE_ADD("via6522_0", VIA6522, ATARI_CLOCK_14MHz/8) - MCFG_VIA6522_READPA_HANDLER(READ8(*this, atarisy1_state, via_pa_r)) - MCFG_VIA6522_READPB_HANDLER(READ8(*this, atarisy1_state, via_pb_r)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, atarisy1_state, via_pa_w)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, atarisy1_state, via_pb_w)) + via6522_device &via(VIA6522(config, "via6522_0", ATARI_CLOCK_14MHz/8)); + via.readpa_handler().set(FUNC(atarisy1_state::via_pa_r)); + via.readpb_handler().set(FUNC(atarisy1_state::via_pb_r)); + via.writepa_handler().set(FUNC(atarisy1_state::via_pa_w)); + via.writepb_handler().set(FUNC(atarisy1_state::via_pb_w)); MACHINE_CONFIG_END MACHINE_CONFIG_START(atarisy1_state::marble) diff --git a/src/mame/drivers/atarisy4.cpp b/src/mame/drivers/atarisy4.cpp index 977845b7795..4ccb756928e 100644 --- a/src/mame/drivers/atarisy4.cpp +++ b/src/mame/drivers/atarisy4.cpp @@ -245,13 +245,13 @@ uint32_t atarisy4_state::screen_update_atarisy4(screen_device &screen, bitmap_rg //uint32_t offset = m_gpu.dpr << 5; - for (y = cliprect.min_y; y <= cliprect.max_y; ++y) + for (y = cliprect.top(); y <= cliprect.bottom(); ++y) { uint16_t *src = &m_screen_ram[(offset + (4096 * y)) / 2]; - uint32_t *dest = &bitmap.pix32(y, cliprect.min_x); + uint32_t *dest = &bitmap.pix32(y, cliprect.left()); int x; - for (x = cliprect.min_x; x < cliprect.max_x; x += 2) + for (x = cliprect.left(); x < cliprect.right(); x += 2) { uint16_t data = *src++; diff --git a/src/mame/drivers/atlantis.cpp b/src/mame/drivers/atlantis.cpp index 681e4562586..160f26db830 100644 --- a/src/mame/drivers/atlantis.cpp +++ b/src/mame/drivers/atlantis.cpp @@ -828,9 +828,9 @@ MACHINE_CONFIG_START(atlantis_state::mwskins) MCFG_PCI9050_USER_OUTPUT_CALLBACK(WRITE32(*this, atlantis_state, user_io_output)) MCFG_PCI9050_USER_INPUT_CALLBACK(READ32(*this, atlantis_state, user_io_input)) - MCFG_DEVICE_ADD(m_rtc, M48T37, 0) - MCFG_M48T37_RESET_HANDLER(WRITELINE(*this, atlantis_state, watchdog_reset)) - MCFG_M48T37_IRQ_HANDLER(WRITELINE(*this, atlantis_state, watchdog_irq)) + M48T37(config, m_rtc); + m_rtc->reset_cb().set(FUNC(atlantis_state::watchdog_reset)); + m_rtc->irq_cb().set(FUNC(atlantis_state::watchdog_irq)); MCFG_DEVICE_ADD(m_ide, IDE_PCI, 0, 0x10950646, 0x07, 0x0) MCFG_IDE_PCI_IRQ_HANDLER(WRITELINE(*this, atlantis_state, ide_irq)) diff --git a/src/mame/drivers/atom.cpp b/src/mame/drivers/atom.cpp index b57b652e7d5..18f542d4160 100644 --- a/src/mame/drivers/atom.cpp +++ b/src/mame/drivers/atom.cpp @@ -727,10 +727,10 @@ MACHINE_CONFIG_START(atom_state::atom) /* devices */ MCFG_TIMER_DRIVER_ADD_PERIODIC("hz2400", atom_state, cassette_output_tick, attotime::from_hz(4806)) - MCFG_DEVICE_ADD(R6522_TAG, VIA6522, X2/4) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8("cent_data_out", output_latch_device, bus_w)) - MCFG_VIA6522_CA2_HANDLER(WRITELINE(m_centronics, centronics_device, write_strobe)) - MCFG_VIA6522_IRQ_HANDLER(INPUTLINE(SY6502_TAG, M6502_IRQ_LINE)) + via6522_device &via(VIA6522(config, R6522_TAG, X2/4)); + via.writepa_handler().set("cent_data_out", FUNC(output_latch_device::bus_w)); + via.ca2_handler().set(m_centronics, FUNC(centronics_device::write_strobe)); + via.irq_handler().set_inputline(SY6502_TAG, M6502_IRQ_LINE); MCFG_DEVICE_ADD(INS8255_TAG, I8255, 0) MCFG_I8255_OUT_PORTA_CB(WRITE8(*this, atom_state, ppi_pa_w)) @@ -837,10 +837,10 @@ MACHINE_CONFIG_START(atom_state::atombb) /* devices */ MCFG_TIMER_DRIVER_ADD_PERIODIC("hz2400", atom_state, cassette_output_tick, attotime::from_hz(4806)) - MCFG_DEVICE_ADD(R6522_TAG, VIA6522, X2/4) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8("cent_data_out", output_latch_device, bus_w)) - MCFG_VIA6522_CA2_HANDLER(WRITELINE(m_centronics, centronics_device, write_strobe)) - MCFG_VIA6522_IRQ_HANDLER(INPUTLINE(SY6502_TAG, M6502_IRQ_LINE)) + via6522_device &via(VIA6522(config, R6522_TAG, X2/4)); + via.writepa_handler().set("cent_data_out", FUNC(output_latch_device::bus_w)); + via.ca2_handler().set(m_centronics, FUNC(centronics_device::write_strobe)); + via.irq_handler().set_inputline(SY6502_TAG, M6502_IRQ_LINE); MCFG_DEVICE_ADD(INS8255_TAG, I8255, 0) MCFG_I8255_OUT_PORTA_CB(WRITE8(*this, atom_state, ppi_pa_w)) diff --git a/src/mame/drivers/attckufo.cpp b/src/mame/drivers/attckufo.cpp index 873c183f434..39741ed52a3 100644 --- a/src/mame/drivers/attckufo.cpp +++ b/src/mame/drivers/attckufo.cpp @@ -128,7 +128,18 @@ MACHINE_CONFIG_START(attckufo_state::attckufo) MCFG_PIA_READPB_HANDLER(IOPORT("INPUT")) SPEAKER(config, "mono").front_center(); - MCFG_MOS656X_ATTACK_UFO_ADD("mos6560", "screen", XTAL(14'318'181) / 14, vic_videoram_map, vic_colorram_map) + + MCFG_SCREEN_ADD("screen", RASTER) + MCFG_SCREEN_REFRESH_RATE(MOS6560_VRETRACERATE) + MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) + MCFG_SCREEN_SIZE((MOS6560_XSIZE + 7) & ~7, MOS6560_YSIZE) + MCFG_SCREEN_VISIBLE_AREA(0, 23*8 - 1, 0, 22*8 - 1) + MCFG_SCREEN_UPDATE_DEVICE("mos6560", mos6560_device, screen_update) + + MCFG_DEVICE_ADD("mos6560", MOS656X_ATTACK_UFO, XTAL(14'318'181) / 14) + MCFG_VIDEO_SET_SCREEN("screen") + MCFG_DEVICE_ADDRESS_MAP(0, vic_videoram_map) + MCFG_DEVICE_ADDRESS_MAP(1, vic_colorram_map) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) MACHINE_CONFIG_END diff --git a/src/mame/drivers/battlera.cpp b/src/mame/drivers/battlera.cpp index 55f940fd384..375de03892c 100644 --- a/src/mame/drivers/battlera.cpp +++ b/src/mame/drivers/battlera.cpp @@ -95,7 +95,6 @@ Notes: #include "emu.h" #include "includes/battlera.h" #include "sound/2203intf.h" -#include "sound/c6280.h" #include "speaker.h" @@ -108,17 +107,6 @@ void battlera_state::machine_start() /******************************************************************************/ -WRITE8_MEMBER(battlera_state::sound_w) -{ - if (offset == 0) - { - m_soundlatch->write(space, 0, data); - m_audiocpu->set_input_line(0, HOLD_LINE); - } -} - -/******************************************************************************/ - WRITE8_MEMBER(battlera_state::control_data_w) { m_control_port_select=data; @@ -143,16 +131,11 @@ READ8_MEMBER(battlera_state::control_data_r) void battlera_state::battlera_map(address_map &map) { map(0x000000, 0x0fffff).rom(); - map(0x1e0800, 0x1e0801).w(FUNC(battlera_state::sound_w)); + map(0x1e0800, 0x1e0800).w(m_soundlatch, FUNC(generic_latch_8_device::write)); map(0x1e1000, 0x1e13ff).rw(m_huc6260, FUNC(huc6260_device::palette_direct_read), FUNC(huc6260_device::palette_direct_write)).share("paletteram"); - map(0x1f0000, 0x1f1fff).bankrw("bank8"); /* Main ram */ - map(0x1ff000, 0x1ff001).rw(FUNC(battlera_state::control_data_r), FUNC(battlera_state::control_data_w)); - - map(0x1FE000, 0x1FE3FF).rw("huc6270", FUNC(huc6270_device::read), FUNC(huc6270_device::write)); - map(0x1FE400, 0x1FE7FF).rw(m_huc6260, FUNC(huc6260_device::read), FUNC(huc6260_device::write)); - map(0x1FEC00, 0x1FEFFF).rw(m_maincpu, FUNC(h6280_device::timer_r), FUNC(h6280_device::timer_w)); - map(0x1FF400, 0x1FF7FF).rw(m_maincpu, FUNC(h6280_device::irq_status_r), FUNC(h6280_device::irq_status_w)); - + map(0x1f0000, 0x1f1fff).ram(); /* Main ram */ + map(0x1fe000, 0x1fe3ff).rw("huc6270", FUNC(huc6270_device::read), FUNC(huc6270_device::write)); + map(0x1fe400, 0x1fe7ff).rw(m_huc6260, FUNC(huc6260_device::read), FUNC(huc6260_device::write)); } void battlera_state::battlera_portmap(address_map &map) @@ -188,10 +171,7 @@ void battlera_state::sound_map(address_map &map) map(0x000000, 0x00ffff).rom(); map(0x040000, 0x040001).w("ymsnd", FUNC(ym2203_device::write)); map(0x080000, 0x080001).w(FUNC(battlera_state::adpcm_data_w)); - map(0x1fe800, 0x1fe80f).w("c6280", FUNC(c6280_device::c6280_w)); - map(0x1f0000, 0x1f1fff).bankrw("bank7"); /* Main ram */ - map(0x1ff000, 0x1ff001).r(m_soundlatch, FUNC(generic_latch_8_device::read)).w(FUNC(battlera_state::adpcm_reset_w)); - map(0x1ff400, 0x1ff403).w(m_audiocpu, FUNC(h6280_device::irq_status_w)); + map(0x1f0000, 0x1f1fff).ram(); /* Main ram */ } /******************************************************************************/ @@ -273,12 +253,18 @@ uint32_t battlera_state::screen_update(screen_device &screen, bitmap_ind16 &bitm MACHINE_CONFIG_START(battlera_state::battlera) /* basic machine hardware */ - MCFG_DEVICE_ADD("maincpu", H6280,21477200/3) - MCFG_DEVICE_PROGRAM_MAP(battlera_map) - MCFG_DEVICE_IO_MAP(battlera_portmap) - - MCFG_DEVICE_ADD("audiocpu", H6280,21477200/3) - MCFG_DEVICE_PROGRAM_MAP(sound_map) + H6280(config, m_maincpu, 21477200/3); + m_maincpu->set_addrmap(AS_PROGRAM, &battlera_state::battlera_map); + m_maincpu->set_addrmap(AS_IO, &battlera_state::battlera_portmap); + m_maincpu->port_in_cb().set(FUNC(battlera_state::control_data_r)); + m_maincpu->port_out_cb().set(FUNC(battlera_state::control_data_w)); + m_maincpu->add_route(ALL_OUTPUTS, "mono", 0); // internal sound unused + + H6280(config, m_audiocpu, 21477200/3); + m_audiocpu->set_addrmap(AS_PROGRAM, &battlera_state::sound_map); + m_audiocpu->port_in_cb().set(m_soundlatch, FUNC(generic_latch_8_device::read)); + m_audiocpu->port_out_cb().set(FUNC(battlera_state::adpcm_reset_w)); + m_audiocpu->add_route(ALL_OUTPUTS, "mono", 0.60); // music data is stereo, but hardware isn't /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) @@ -299,7 +285,8 @@ MACHINE_CONFIG_START(battlera_state::battlera) /* sound hardware */ SPEAKER(config, "mono").front_center(); - MCFG_GENERIC_LATCH_8_ADD("soundlatch") + GENERIC_LATCH_8(config, m_soundlatch); + m_soundlatch->data_pending_callback().set_inputline(m_audiocpu, 0); MCFG_DEVICE_ADD("ymsnd", YM2203, 12000000 / 8) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.40) @@ -308,10 +295,6 @@ MACHINE_CONFIG_START(battlera_state::battlera) MCFG_MSM5205_VCLK_CB(WRITELINE(*this, battlera_state, adpcm_int)) /* interrupt function */ MCFG_MSM5205_PRESCALER_SELECTOR(S48_4B) /* 8KHz */ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.85) - - MCFG_DEVICE_ADD("c6280", C6280, 21477270/6) - MCFG_C6280_CPU("audiocpu") - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.60) MACHINE_CONFIG_END /******************************************************************************/ diff --git a/src/mame/drivers/bbc.cpp b/src/mame/drivers/bbc.cpp index caf5041d3ea..0b22650b78f 100644 --- a/src/mame/drivers/bbc.cpp +++ b/src/mame/drivers/bbc.cpp @@ -907,12 +907,12 @@ MACHINE_CONFIG_START(bbc_state::bbca) MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(*this, bbc_state, write_acia_clock)) /* system via */ - MCFG_DEVICE_ADD("via6522_0", VIA6522, 16_MHz_XTAL / 16) - MCFG_VIA6522_READPA_HANDLER(READ8(*this, bbc_state, bbcb_via_system_read_porta)) - MCFG_VIA6522_READPB_HANDLER(READ8(*this, bbc_state, bbcb_via_system_read_portb)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, bbc_state, bbcb_via_system_write_porta)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, bbc_state, bbcb_via_system_write_portb)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE("irqs", input_merger_device, in_w<1>)) + VIA6522(config, m_via6522_0, 16_MHz_XTAL / 16); + m_via6522_0->readpa_handler().set(FUNC(bbc_state::bbcb_via_system_read_porta)); + m_via6522_0->readpb_handler().set(FUNC(bbc_state::bbcb_via_system_read_portb)); + m_via6522_0->writepa_handler().set(FUNC(bbc_state::bbcb_via_system_write_porta)); + m_via6522_0->writepb_handler().set(FUNC(bbc_state::bbcb_via_system_write_portb)); + m_via6522_0->irq_handler().set("irqs", FUNC(input_merger_device::in_w<1>)); /* EPROM sockets */ bbc_eprom_sockets(config); @@ -940,12 +940,12 @@ MACHINE_CONFIG_START(bbc_state::bbcb) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) /* user via */ - MCFG_DEVICE_ADD("via6522_1", VIA6522, 16_MHz_XTAL / 16) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8("cent_data_out", output_latch_device, bus_w)) - MCFG_VIA6522_READPB_HANDLER(READ8("userport", bbc_userport_slot_device, pb_r)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8("userport", bbc_userport_slot_device, pb_w)) - MCFG_VIA6522_CA2_HANDLER(WRITELINE("centronics", centronics_device, write_strobe)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE("irqs", input_merger_device, in_w<2>)) + VIA6522(config, m_via6522_1, 16_MHz_XTAL / 16); + m_via6522_1->writepa_handler().set("cent_data_out", FUNC(output_latch_device::bus_w)); + m_via6522_1->readpb_handler().set("userport", FUNC(bbc_userport_slot_device::pb_r)); + m_via6522_1->writepb_handler().set("userport", FUNC(bbc_userport_slot_device::pb_w)); + m_via6522_1->ca2_handler().set("centronics", FUNC(centronics_device::write_strobe)); + m_via6522_1->irq_handler().set("irqs", FUNC(input_merger_device::in_w<2>)); /* adc */ MCFG_DEVICE_ADD("upd7002", UPD7002, 0) @@ -963,9 +963,9 @@ MACHINE_CONFIG_START(bbc_state::bbcb) MCFG_BBC_FDC_SLOT_DRQ_HANDLER(WRITELINE(*this, bbc_state, fdc_drq_w)) /* econet */ - MCFG_DEVICE_ADD("mc6854", MC6854, 0) - MCFG_MC6854_OUT_TXD_CB(WRITELINE(ECONET_TAG, econet_device, host_data_w)) - MCFG_MC6854_OUT_IRQ_CB(WRITELINE(*this, bbc_state, adlc_irq_w)) + MC6854(config, m_adlc); + m_adlc->out_txd_cb().set(ECONET_TAG, FUNC(econet_device::host_data_w)); + m_adlc->out_irq_cb().set(FUNC(bbc_state::adlc_irq_w)); MCFG_ECONET_ADD() MCFG_ECONET_CLK_CALLBACK(WRITELINE(*this, bbc_state, econet_clk_w)) MCFG_ECONET_DATA_CALLBACK(WRITELINE("mc6854", mc6854_device, set_rx)) @@ -1153,18 +1153,29 @@ MACHINE_CONFIG_START(bbc_state::abc110) MCFG_SLOT_FIXED(true) /* Add ADAPTEC ACB-4000 Winchester Disc Controller */ - //MCFG_DEVICE_ADD(SCSIBUS_TAG, SCSI_PORT, 0) - //MCFG_SCSI_DATA_INPUT_BUFFER("scsi_data_in") - //MCFG_SCSI_MSG_HANDLER(WRITELINE("scsi_ctrl_in", input_buffer_device, write_bit0)) - //MCFG_SCSI_BSY_HANDLER(WRITELINE(*this, bbc_state, scsi_bsy_w)) - //MCFG_SCSI_REQ_HANDLER(WRITELINE(*this, bbc_state, scsi_req_w)) - //MCFG_SCSI_IO_HANDLER(WRITELINE("scsi_ctrl_in", input_buffer_device, write_bit6)) - //MCFG_SCSI_CD_HANDLER(WRITELINE("scsi_ctrl_in", input_buffer_device, write_bit7)) - //MCFG_SCSIDEV_ADD(SCSIBUS_TAG ":" SCSI_PORT_DEVICE1, "harddisk", ACB4070, SCSI_ID_0) - - //MCFG_SCSI_OUTPUT_LATCH_ADD("scsi_data_out", SCSIBUS_TAG) - //MCFG_DEVICE_ADD("scsi_data_in", INPUT_BUFFER, 0) - //MCFG_DEVICE_ADD("scsi_ctrl_in", INPUT_BUFFER, 0) + //scsi_port_device &scsibus(SCSI_PORT(config, SCSIBUS_TAG)); + //scsibus.set_data_input_buffer("scsi_data_in"); + //scsibus.msg_handler().set("scsi_ctrl_in", FUNC(input_buffer_device::write_bit0)); + //scsibus.bsy_handler().set("scsi_ctrl_in", FUNC(input_buffer_device::scsi_bsy_w)) + //scsibus.req_handler().set("scsi_ctrl_in", FUNC(input_buffer_device::scsi_req_w)) + //scsibus.io_handler().set("scsi_ctrl_in", FUNC(input_buffer_device::write_bit6)); + //scsibus.cd_handler().set("scsi_ctrl_in", FUNC(input_buffer_device::write_bit7)); + //scsibus.set_slot_device(1, "harddisk", ACB4070, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_0)); + + //output_latch_device &scsiout(OUTPUT_LATCH(config, "scsi_data_out")); + //scsibus.set_output_latch(scsiout); + //scsiout.bit_handler<0>().set("scsi", FUNC(scsi_port_device::write_data0)); + //scsiout.bit_handler<1>().set("scsi", FUNC(scsi_port_device::write_data1)); + //scsiout.bit_handler<2>().set("scsi", FUNC(scsi_port_device::write_data2)); + //scsiout.bit_handler<3>().set("scsi", FUNC(scsi_port_device::write_data3)); + //scsiout.bit_handler<4>().set("scsi", FUNC(scsi_port_device::write_data4)); + //scsiout.bit_handler<5>().set("scsi", FUNC(scsi_port_device::write_data5)); + //scsiout.bit_handler<6>().set("scsi", FUNC(scsi_port_device::write_data6)); + //scsiout.bit_handler<7>().set("scsi", FUNC(scsi_port_device::write_data7)); + + //INPUT_BUFFER(config, "scsi_ctrl_in"); + //INPUT_BUFFER(config, "scsi_data_in"); + /* Add 10MB ST-412 Winchester */ /* software lists */ @@ -1398,20 +1409,20 @@ MACHINE_CONFIG_START(bbc_state::bbcm) MCFG_UPD7002_EOC_CB(bbc_state, BBC_uPD7002_EOC) /* system via */ - MCFG_DEVICE_ADD("via6522_0", VIA6522, 16_MHz_XTAL / 16) - MCFG_VIA6522_READPA_HANDLER(READ8(*this, bbc_state, bbcb_via_system_read_porta)) - MCFG_VIA6522_READPB_HANDLER(READ8(*this, bbc_state, bbcb_via_system_read_portb)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, bbc_state, bbcb_via_system_write_porta)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, bbc_state, bbcb_via_system_write_portb)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE("irqs", input_merger_device, in_w<1>)) + VIA6522(config, m_via6522_0, 16_MHz_XTAL / 16); + m_via6522_0->readpa_handler().set(FUNC(bbc_state::bbcb_via_system_read_porta)); + m_via6522_0->readpb_handler().set(FUNC(bbc_state::bbcb_via_system_read_portb)); + m_via6522_0->writepa_handler().set(FUNC(bbc_state::bbcb_via_system_write_porta)); + m_via6522_0->writepb_handler().set(FUNC(bbc_state::bbcb_via_system_write_portb)); + m_via6522_0->irq_handler().set("irqs", FUNC(input_merger_device::in_w<1>)); /* user via */ - MCFG_DEVICE_ADD("via6522_1", VIA6522, 16_MHz_XTAL / 16) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8("cent_data_out", output_latch_device, bus_w)) - MCFG_VIA6522_READPB_HANDLER(READ8("userport", bbc_userport_slot_device, pb_r)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8("userport", bbc_userport_slot_device, pb_w)) - MCFG_VIA6522_CA2_HANDLER(WRITELINE("centronics", centronics_device, write_strobe)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE("irqs", input_merger_device, in_w<2>)) + VIA6522(config, m_via6522_1, 16_MHz_XTAL / 16); + m_via6522_1->writepa_handler().set("cent_data_out", FUNC(output_latch_device::bus_w)); + m_via6522_1->readpb_handler().set("userport", FUNC(bbc_userport_slot_device::pb_r)); + m_via6522_1->writepb_handler().set("userport", FUNC(bbc_userport_slot_device::pb_w)); + m_via6522_1->ca2_handler().set("centronics", FUNC(centronics_device::write_strobe)); + m_via6522_1->irq_handler().set("irqs", FUNC(input_merger_device::in_w<2>)); /* fdc */ MCFG_DEVICE_ADD("wd1770", WD1770, 16_MHz_XTAL / 2) @@ -1424,9 +1435,9 @@ MACHINE_CONFIG_START(bbc_state::bbcm) MCFG_FLOPPY_DRIVE_SOUND(true) /* econet */ - MCFG_DEVICE_ADD("mc6854", MC6854, 0) - MCFG_MC6854_OUT_TXD_CB(WRITELINE(ECONET_TAG, econet_device, host_data_w)) - MCFG_MC6854_OUT_IRQ_CB(WRITELINE(*this, bbc_state, adlc_irq_w)) + MC6854(config, m_adlc); + m_adlc->out_txd_cb().set(ECONET_TAG, FUNC(econet_device::host_data_w)); + m_adlc->out_irq_cb().set(FUNC(bbc_state::adlc_irq_w)); MCFG_ECONET_ADD() MCFG_ECONET_CLK_CALLBACK(WRITELINE(*this, bbc_state, econet_clk_w)) MCFG_ECONET_DATA_CALLBACK(WRITELINE("mc6854", mc6854_device, set_rx)) @@ -1629,10 +1640,9 @@ MACHINE_CONFIG_START(bbc_state::bbcmc) MCFG_MACHINE_RESET_OVERRIDE(bbc_state, bbcmc) /* user via */ - MCFG_DEVICE_MODIFY("via6522_1") // TODO: Joyport connected to PB0-PB4 only. PB5-PB7 are expansion port. - MCFG_VIA6522_READPB_HANDLER(READ8("joyport", bbc_joyport_slot_device, pb_r)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8("joyport", bbc_joyport_slot_device, pb_w)) + m_via6522_1->readpb_handler().set("joyport", FUNC(bbc_joyport_slot_device::pb_r)); + m_via6522_1->writepb_handler().set("joyport", FUNC(bbc_joyport_slot_device::pb_w)); /* cartridge sockets */ MCFG_DEVICE_REMOVE("exp_rom1") diff --git a/src/mame/drivers/bebox.cpp b/src/mame/drivers/bebox.cpp index 380defc55c9..50fe68e9899 100644 --- a/src/mame/drivers/bebox.cpp +++ b/src/mame/drivers/bebox.cpp @@ -15,7 +15,6 @@ /* Components */ #include "video/clgd542x.h" #include "bus/lpci/cirrus.h" -#include "cpu/powerpc/ppc.h" #include "sound/3812intf.h" #include "machine/mc146818.h" #include "machine/pckeybrd.h" @@ -29,10 +28,10 @@ #include "formats/pc_dsk.h" #include "machine/8042kbdc.h" -READ8_MEMBER(bebox_state::at_dma8237_1_r) { return m_dma8237_2->read(space, offset / 2); } -WRITE8_MEMBER(bebox_state::at_dma8237_1_w) { m_dma8237_2->write(space, offset / 2, data); } +READ8_MEMBER(bebox_state::at_dma8237_1_r) { return m_dma8237[1]->read(space, offset / 2); } +WRITE8_MEMBER(bebox_state::at_dma8237_1_w) { m_dma8237[1]->write(space, offset / 2, data); } -void bebox_state::bebox_mem(address_map &map) +void bebox_state::main_mem(address_map &map) { map(0x7FFFF0F0, 0x7FFFF0F7).rw(FUNC(bebox_state::bebox_cpu0_imask_r), FUNC(bebox_state::bebox_cpu0_imask_w)); map(0x7FFFF1F0, 0x7FFFF1F7).rw(FUNC(bebox_state::bebox_cpu1_imask_r), FUNC(bebox_state::bebox_cpu1_imask_w)); @@ -40,13 +39,13 @@ void bebox_state::bebox_mem(address_map &map) map(0x7FFFF3F0, 0x7FFFF3F7).rw(FUNC(bebox_state::bebox_crossproc_interrupts_r), FUNC(bebox_state::bebox_crossproc_interrupts_w)); map(0x7FFFF4F0, 0x7FFFF4F7).w(FUNC(bebox_state::bebox_processor_resets_w)); - map(0x80000000, 0x8000001F).rw(m_dma8237_1, FUNC(am9517a_device::read), FUNC(am9517a_device::write)); - map(0x80000020, 0x8000003F).rw(m_pic8259_1, FUNC(pic8259_device::read), FUNC(pic8259_device::write)); + map(0x80000000, 0x8000001F).rw(m_dma8237[0], FUNC(am9517a_device::read), FUNC(am9517a_device::write)); + map(0x80000020, 0x8000003F).rw(m_pic8259[0], FUNC(pic8259_device::read), FUNC(pic8259_device::write)); map(0x80000040, 0x8000005f).rw(m_pit8254, FUNC(pit8254_device::read), FUNC(pit8254_device::write)); map(0x80000060, 0x8000006F).rw("kbdc", FUNC(kbdc8042_device::data_r), FUNC(kbdc8042_device::data_w)); map(0x80000070, 0x8000007F).rw("rtc", FUNC(mc146818_device::read), FUNC(mc146818_device::write)); map(0x80000080, 0x8000009F).rw(FUNC(bebox_state::bebox_page_r), FUNC(bebox_state::bebox_page_w)); - map(0x800000A0, 0x800000BF).rw(m_pic8259_2, FUNC(pic8259_device::read), FUNC(pic8259_device::write)); + map(0x800000A0, 0x800000BF).rw(m_pic8259[1], FUNC(pic8259_device::read), FUNC(pic8259_device::write)); map(0x800000C0, 0x800000DF).rw(FUNC(bebox_state::at_dma8237_1_r), FUNC(bebox_state::at_dma8237_1_w)); map(0x800001F0, 0x800001F7).rw("ide", FUNC(ide_controller_device::cs0_r), FUNC(ide_controller_device::cs0_w)); map(0x800002F8, 0x800002FF).rw("ns16550_1", FUNC(ns16550_device::ins8250_r), FUNC(ns16550_device::ins8250_w)); @@ -75,7 +74,7 @@ void bebox_state::bebox_mem(address_map &map) READ64_MEMBER(bebox_state::bb_slave_64be_r) { // 2e94 is the real address, 2e84 is where the PC appears to be under full DRC - if ((m_ppc2->pc() == 0xfff02e94) || (m_ppc2->pc() == 0xfff02e84)) + if ((m_ppc[1]->pc() == 0xfff02e94) || (m_ppc[1]->pc() == 0xfff02e84)) { return 0x108000ff; // indicate slave CPU } @@ -83,9 +82,9 @@ READ64_MEMBER(bebox_state::bb_slave_64be_r) return m_pcibus->read_64be(space, offset, mem_mask); } -void bebox_state::bebox_slave_mem(address_map &map) +void bebox_state::slave_mem(address_map &map) { - bebox_mem(map); + main_mem(map); map(0x80000cf8, 0x80000cff).r(FUNC(bebox_state::bb_slave_64be_r)); map(0x80000cf8, 0x80000cff).w(m_pcibus, FUNC(pci_bus_device::write_64be)); } @@ -95,20 +94,20 @@ void bebox_state::bebox_slave_mem(address_map &map) ((x << 8) & 0xff0000) | \ ((x << 24) & 0xff000000)) -LSI53C810_FETCH_CB(bebox_state::scsi_fetch) +uint32_t bebox_state::scsi_fetch(uint32_t dsp) { - uint32_t result = m_ppc1->space(AS_PROGRAM).read_dword(dsp & 0x7FFFFFFF); + const uint32_t result = m_ppc[0]->space(AS_PROGRAM).read_dword(dsp & 0x7FFFFFFF); return BYTE_REVERSE32(result); } -LSI53C810_IRQ_CB(bebox_state::scsi_irq_callback) +void bebox_state::scsi_irq_callback(int state) { bebox_set_irq_bit(21, state); } -LSI53C810_DMA_CB(bebox_state::scsi_dma_callback) +void bebox_state::scsi_dma_callback(uint32_t src, uint32_t dst, int length, int byteswap) { } @@ -116,11 +115,6 @@ FLOPPY_FORMATS_MEMBER( bebox_state::floppy_formats ) FLOPPY_PC_FORMAT FLOPPY_FORMATS_END -static void bebox_floppies(device_slot_interface &device) -{ - device.option_add("35hd", FLOPPY_35_HD); -} - void bebox_state::mpc105_config(device_t *device) { MCFG_MPC105_CPU( "ppc1" ) @@ -136,122 +130,141 @@ void bebox_state::mpc105_config(device_t *device) WRITE_LINE_MEMBER(bebox_state::bebox_keyboard_interrupt) { bebox_set_irq_bit(16, state); - m_pic8259_1->ir1_w(state); + m_pic8259[0]->ir1_w(state); } -static void pci_devices(device_slot_interface &device) +pci_connector_device &bebox_state::add_pci_slot(machine_config &config, const char *tag, size_t index, const char *default_tag) { - device.option_add("mpc105", MPC105); - device.option_add("cirrus", PCI_CIRRUS_SVGA); + pci_connector_device &pcislot(PCI_CONNECTOR(config, tag, index)); + pcislot.option_add("mpc105", MPC105); + pcislot.option_add("cirrus", PCI_CIRRUS_SVGA); + pcislot.set_default_option(default_tag); + pcislot.set_fixed(true); + return pcislot; } -MACHINE_CONFIG_START(bebox_state::bebox) - /* basic machine hardware */ - MCFG_DEVICE_ADD("ppc1", PPC603, 66000000) /* 66 MHz */ - MCFG_DEVICE_PROGRAM_MAP(bebox_mem) - - MCFG_DEVICE_ADD("ppc2", PPC603, 66000000) /* 66 MHz */ - MCFG_DEVICE_PROGRAM_MAP(bebox_slave_mem) - - MCFG_QUANTUM_TIME(attotime::from_hz(60)) - - MCFG_DEVICE_ADD("pit8254", PIT8254, 0) - MCFG_PIT8253_CLK0(4772720/4) /* heartbeat IRQ */ - MCFG_PIT8253_OUT0_HANDLER(WRITELINE(*this, bebox_state, bebox_timer0_w)) - MCFG_PIT8253_CLK1(4772720/4) /* dram refresh */ - MCFG_PIT8253_CLK2(4772720/4) /* pio port c pin 4, and speaker polling enough */ - MCFG_PIT8253_OUT2_HANDLER(WRITELINE("kbdc", kbdc8042_device, write_out2)) - - AM9517A(config, m_dma8237_1, XTAL(14'318'181)/3); - m_dma8237_1->out_hreq_callback().set(FUNC(bebox_state::bebox_dma_hrq_changed)); - m_dma8237_1->out_eop_callback().set(FUNC(bebox_state::bebox_dma8237_out_eop)); - m_dma8237_1->in_memr_callback().set(FUNC(bebox_state::bebox_dma_read_byte)); - m_dma8237_1->out_memw_callback().set(FUNC(bebox_state::bebox_dma_write_byte)); - m_dma8237_1->in_ior_callback<2>().set(FUNC(bebox_state::bebox_dma8237_fdc_dack_r)); - m_dma8237_1->out_iow_callback<2>().set(FUNC(bebox_state::bebox_dma8237_fdc_dack_w)); - m_dma8237_1->out_dack_callback<0>().set(FUNC(bebox_state::pc_dack0_w)); - m_dma8237_1->out_dack_callback<1>().set(FUNC(bebox_state::pc_dack1_w)); - m_dma8237_1->out_dack_callback<2>().set(FUNC(bebox_state::pc_dack2_w)); - m_dma8237_1->out_dack_callback<3>().set(FUNC(bebox_state::pc_dack3_w)); - - AM9517A(config, m_dma8237_2, XTAL(14'318'181)/3); - - PIC8259(config, m_pic8259_1, 0); - m_pic8259_1->out_int_callback().set(FUNC(bebox_state::bebox_pic8259_master_set_int_line)); - m_pic8259_1->in_sp_callback().set_constant(1); - m_pic8259_1->read_slave_ack_callback().set(FUNC(bebox_state::get_slave_ack)); - - PIC8259(config, m_pic8259_2, 0); - m_pic8259_2->out_int_callback().set(FUNC(bebox_state::bebox_pic8259_slave_set_int_line)); - m_pic8259_2->in_sp_callback().set_constant(0); - - MCFG_DEVICE_ADD( "ns16550_0", NS16550, 0 ) /* TODO: Verify model */ - MCFG_DEVICE_ADD( "ns16550_1", NS16550, 0 ) /* TODO: Verify model */ - MCFG_DEVICE_ADD( "ns16550_2", NS16550, 0 ) /* TODO: Verify model */ - MCFG_DEVICE_ADD( "ns16550_3", NS16550, 0 ) /* TODO: Verify model */ +void bebox_state::bebox_peripherals(machine_config &config) +{ + config.m_minimum_quantum = attotime::from_hz(60); + + PIT8254(config, m_pit8254, 0); + m_pit8254->set_clk<0>(4772720/4); /* heartbeat IRQ */ + m_pit8254->set_clk<1>(4772720/4); /* dram refresh */ + m_pit8254->set_clk<2>(4772720/4); /* pio port c pin 4, and speaker polling */ + m_pit8254->out_handler<0>().set(FUNC(bebox_state::bebox_timer0_w)); + m_pit8254->out_handler<2>().set("kbdc", FUNC(kbdc8042_device::write_out2)); + + AM9517A(config, m_dma8237[0], XTAL(14'318'181)/3); + m_dma8237[0]->out_hreq_callback().set(FUNC(bebox_state::bebox_dma_hrq_changed)); + m_dma8237[0]->out_eop_callback().set(FUNC(bebox_state::bebox_dma8237_out_eop)); + m_dma8237[0]->in_memr_callback().set(FUNC(bebox_state::bebox_dma_read_byte)); + m_dma8237[0]->out_memw_callback().set(FUNC(bebox_state::bebox_dma_write_byte)); + m_dma8237[0]->in_ior_callback<2>().set(FUNC(bebox_state::bebox_dma8237_fdc_dack_r)); + m_dma8237[0]->out_iow_callback<2>().set(FUNC(bebox_state::bebox_dma8237_fdc_dack_w)); + m_dma8237[0]->out_dack_callback<0>().set(FUNC(bebox_state::pc_dack0_w)); + m_dma8237[0]->out_dack_callback<1>().set(FUNC(bebox_state::pc_dack1_w)); + m_dma8237[0]->out_dack_callback<2>().set(FUNC(bebox_state::pc_dack2_w)); + m_dma8237[0]->out_dack_callback<3>().set(FUNC(bebox_state::pc_dack3_w)); + + AM9517A(config, m_dma8237[1], XTAL(14'318'181)/3); + + PIC8259(config, m_pic8259[0], 0); + m_pic8259[0]->out_int_callback().set(FUNC(bebox_state::bebox_pic8259_master_set_int_line)); + m_pic8259[0]->in_sp_callback().set_constant(1); + m_pic8259[0]->read_slave_ack_callback().set(FUNC(bebox_state::get_slave_ack)); + + PIC8259(config, m_pic8259[1], 0); + m_pic8259[1]->out_int_callback().set(FUNC(bebox_state::bebox_pic8259_slave_set_int_line)); + m_pic8259[1]->in_sp_callback().set_constant(0); + + NS16550(config, "ns16550_0", 0); /* TODO: Verify model */ + NS16550(config, "ns16550_1", 0); /* TODO: Verify model */ + NS16550(config, "ns16550_2", 0); /* TODO: Verify model */ + NS16550(config, "ns16550_3", 0); /* TODO: Verify model */ /* video hardware */ - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_RAW_PARAMS(XTAL(25'174'800),900,0,640,526,0,480) - MCFG_SCREEN_UPDATE_DEVICE("vga", cirrus_gd5428_device, screen_update) + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); + screen.set_raw(XTAL(25'174'800), 900, 0, 640, 526, 0, 480); + screen.set_screen_update("vga", FUNC(cirrus_gd5428_device::screen_update)); + + cirrus_gd5428_device &vga(CIRRUS_GD5428(config, "vga", 0)); + vga.set_screen("screen"); - MCFG_DEVICE_ADD("vga", CIRRUS_GD5428, 0) - MCFG_VIDEO_SET_SCREEN("screen") + speaker_device &speaker(SPEAKER(config, "mono")); + speaker.front_center(); - SPEAKER(config, "mono").front_center(); - MCFG_DEVICE_ADD("ym3812", YM3812, 3579545) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00) + ym3812_device &ym3812(YM3812(config, "ym3812", 3579545)); + ym3812.add_route(ALL_OUTPUTS, speaker, 1.0); - MCFG_FUJITSU_29F016A_ADD("flash") + FUJITSU_29F016A(config, "flash"); - MCFG_DEVICE_ADD("scsi", SCSI_PORT, 0) - MCFG_SCSIDEV_ADD("scsi:" SCSI_PORT_DEVICE1, "harddisk", SCSIHD, SCSI_ID_0) - MCFG_SCSIDEV_ADD("scsi:" SCSI_PORT_DEVICE2, "cdrom", SCSICD, SCSI_ID_3) + scsi_port_device &scsibus(SCSI_PORT(config, "scsi")); + scsibus.set_slot_device(1, "harddisk", SCSIHD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_0)); + scsibus.set_slot_device(2, "cdrom", SCSICD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_3)); - MCFG_DEVICE_ADD("lsi53c810", LSI53C810, 0) - MCFG_LSI53C810_IRQ_CB(bebox_state, scsi_irq_callback) - MCFG_LSI53C810_DMA_CB(bebox_state, scsi_dma_callback) - MCFG_LSI53C810_FETCH_CB(bebox_state, scsi_fetch) - MCFG_LEGACY_SCSI_PORT("scsi") + lsi53c810_device &scsictrl(LSI53C810(config, "lsi53c810")); + scsictrl.set_irq_callback(FUNC(bebox_state::scsi_irq_callback)); + scsictrl.set_dma_callback(FUNC(bebox_state::scsi_dma_callback)); + scsictrl.set_fetch_callback(FUNC(bebox_state::scsi_fetch)); + scsictrl.set_scsi_port("scsi"); - MCFG_IDE_CONTROLLER_ADD( "ide", ata_devices, "hdd", nullptr, false ) /* FIXME */ - MCFG_ATA_INTERFACE_IRQ_HANDLER(WRITELINE(*this, bebox_state, bebox_ide_interrupt)) + ide_controller_device &idectrl(IDE_CONTROLLER(config, "ide")); + idectrl.set_default_ata_devices("hdd", nullptr); + idectrl.irq_handler().set(FUNC(bebox_state::bebox_ide_interrupt)); /* pci */ - MCFG_PCI_BUS_ADD("pcibus", 0) - MCFG_PCI_BUS_DEVICE("pcibus:0", pci_devices, "mpc105", true) - MCFG_SLOT_OPTION_MACHINE_CONFIG("mpc105", mpc105_config) + PCI_BUS(config, m_pcibus, 0); + m_pcibus->set_busnum(0); - MCFG_PCI_BUS_DEVICE("pcibus:1", pci_devices, "cirrus", true) + pci_connector_device &pcislot0 = add_pci_slot(config, "pcibus:0", 0, "mpc105"); + pcislot0.set_option_machine_config("mpc105", mpc105_config); + add_pci_slot(config, "pcibus:1", 1, "cirrus"); /*MCFG_PCI_BUS_DEVICE(12, nullptr, scsi53c810_pci_read, scsi53c810_pci_write)*/ - MCFG_SMC37C78_ADD("smc37c78") - MCFG_UPD765_INTRQ_CALLBACK(WRITELINE(*this, bebox_state, fdc_interrupt)) - MCFG_UPD765_DRQ_CALLBACK(WRITELINE("dma8237_1", am9517a_device, dreq2_w)) - MCFG_FLOPPY_DRIVE_ADD("smc37c78:0", bebox_floppies, "35hd", bebox_state::floppy_formats) + SMC37C78(config, m_smc37c78, 0); + m_smc37c78->intrq_wr_callback().set(FUNC(bebox_state::fdc_interrupt)); + m_smc37c78->drq_wr_callback().set(m_dma8237[0], FUNC(am9517a_device::dreq2_w)); - MCFG_DEVICE_ADD("rtc", MC146818, 32.768_kHz_XTAL) + floppy_connector &fdc(FLOPPY_CONNECTOR(config, "smc37c78:0")); + fdc.option_add("35hd", FLOPPY_35_HD); + fdc.set_default_option("35hd"); + fdc.set_formats(bebox_state::floppy_formats); - MCFG_DEVICE_ADD("kbdc", KBDC8042, 0) - MCFG_KBDC8042_KEYBOARD_TYPE(KBDC8042_STANDARD) - MCFG_KBDC8042_SYSTEM_RESET_CB(INPUTLINE("ppc1", INPUT_LINE_RESET)) - MCFG_KBDC8042_INPUT_BUFFER_FULL_CB(WRITELINE(*this, bebox_state, bebox_keyboard_interrupt)) + MC146818(config, "rtc", 32.768_kHz_XTAL); + + kbdc8042_device &kbdc(KBDC8042(config, "kbdc")); + kbdc.set_keyboard_type(kbdc8042_device::KBDC8042_STANDARD); + kbdc.system_reset_callback().set_inputline(m_ppc[0], INPUT_LINE_RESET); + kbdc.input_buffer_full_callback().set(FUNC(bebox_state::bebox_keyboard_interrupt)); /* internal ram */ - MCFG_RAM_ADD(RAM_TAG) - MCFG_RAM_DEFAULT_SIZE("32M") - MCFG_RAM_EXTRA_OPTIONS("8M,16M") -MACHINE_CONFIG_END - -MACHINE_CONFIG_START(bebox_state::bebox2) - bebox(config); - MCFG_DEVICE_REPLACE("ppc1", PPC603E, 133000000) /* 133 MHz */ - MCFG_DEVICE_PROGRAM_MAP(bebox_mem) - - MCFG_DEVICE_REPLACE("ppc2", PPC603E, 133000000) /* 133 MHz */ - MCFG_DEVICE_PROGRAM_MAP(bebox_slave_mem) -MACHINE_CONFIG_END + RAM(config, m_ram); + m_ram->set_default_size("32M"); + m_ram->set_extra_options("8M,16M"); +} + +void bebox_state::bebox(machine_config &config) +{ + PPC603(config, m_ppc[0], 66000000); /* 66 MHz */ + m_ppc[0]->set_addrmap(AS_PROGRAM, &bebox_state::main_mem); + + PPC603(config, m_ppc[1], 66000000); /* 66 MHz */ + m_ppc[1]->set_addrmap(AS_PROGRAM, &bebox_state::slave_mem); + + bebox_peripherals(config); +} + +void bebox_state::bebox2(machine_config &config) +{ + PPC603E(config, m_ppc[0], 133000000); /* 133 MHz */ + m_ppc[0]->set_addrmap(AS_PROGRAM, &bebox_state::main_mem); + + PPC603E(config, m_ppc[1], 133000000); /* 133 MHz */ + m_ppc[1]->set_addrmap(AS_PROGRAM, &bebox_state::slave_mem); + + bebox_peripherals(config); +} static INPUT_PORTS_START( bebox ) PORT_INCLUDE( at_keyboard ) diff --git a/src/mame/drivers/beezer.cpp b/src/mame/drivers/beezer.cpp index 99472bbf6cc..edb4c13ede9 100644 --- a/src/mame/drivers/beezer.cpp +++ b/src/mame/drivers/beezer.cpp @@ -60,7 +60,8 @@ public: m_via_audio(*this, "via_u18"), m_ptm(*this, "ptm"), m_dac(*this, "dac"), - m_timer_count(nullptr), + m_dac_timer(nullptr), + m_scanline_timer(nullptr), m_count(0), m_noise(0), m_pbus(0xff), m_x(0), m_y(0), m_z(0) { @@ -68,9 +69,10 @@ public: m_dac_data[0] = m_dac_data[1] = m_dac_data[2] = m_dac_data[3] = 0; } - TIMER_DEVICE_CALLBACK_MEMBER(scanline_cb); - uint32_t screen_update_beezer(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - DECLARE_PALETTE_INIT(beezer); + void scanline_cb(); + void dac_update_cb(); + uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + void palette_init(palette_device &palette); DECLARE_WRITE8_MEMBER(palette_w); DECLARE_READ8_MEMBER(line_r); @@ -98,6 +100,13 @@ public: protected: virtual void machine_start() override; virtual void machine_reset() override; + + enum + { + TIMER_DAC, + TIMER_SCANLINE + }; + virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; private: @@ -118,7 +127,8 @@ private: double m_weights_g[3]; double m_weights_b[2]; - emu_timer *m_timer_count; + emu_timer *m_dac_timer; + emu_timer *m_scanline_timer; int m_ch_sign[4]; uint8_t m_dac_data[4]; @@ -223,19 +233,24 @@ INPUT_PORTS_END // VIDEO EMULATION //************************************************************************** -TIMER_DEVICE_CALLBACK_MEMBER( beezer_state::scanline_cb ) +void beezer_state::scanline_cb() { + const int scanline = m_screen->vpos(); + // TDISP, each 32 lines - m_via_system->write_ca2((param & 32) ? 1 : 0); + m_via_system->write_ca2((scanline & 32) ? 1 : 0); // actually unused by the game (points to a tight loop) - if (param == 240) + if (scanline == 240) m_maincpu->set_input_line(M6809_FIRQ_LINE, ASSERT_LINE); else m_maincpu->set_input_line(M6809_FIRQ_LINE, CLEAR_LINE); + + + m_scanline_timer->adjust(m_screen->time_until_pos(scanline + 1)); } -uint32_t beezer_state::screen_update_beezer(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +uint32_t beezer_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { for (int y = cliprect.min_y; y <= cliprect.max_y; y++) { @@ -249,7 +264,7 @@ uint32_t beezer_state::screen_update_beezer(screen_device &screen, bitmap_ind16 return 0; } -PALETTE_INIT_MEMBER(beezer_state, beezer) +void beezer_state::palette_init(palette_device &device) { const int resistances_rg[3] = { 1200, 560, 330 }; const int resistances_b[2] = { 560, 330 }; @@ -283,6 +298,16 @@ READ8_MEMBER( beezer_state::line_r ) void beezer_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) { + switch (id) + { + case TIMER_DAC: dac_update_cb(); break; + case TIMER_SCANLINE: scanline_cb(); break; + default: assert_always(false, "Unknown id in beezer_state::device_timer"); + } +} + +void beezer_state::dac_update_cb() +{ // channel multiplexer at u52 int ch = m_count++ & 3; @@ -438,7 +463,8 @@ void beezer_state::machine_start() m_rombank[i]->configure_entries(0, 2, m_banked_roms->base() + (i * 0x2000), 0x1000); // allocate timers - m_timer_count = timer_alloc(0); + m_dac_timer = timer_alloc(TIMER_DAC); + m_scanline_timer = timer_alloc(TIMER_SCANLINE); // register for state saving save_pointer(NAME(m_ch_sign), 4); @@ -459,7 +485,8 @@ void beezer_state::machine_reset() bankswitch_w(machine().dummy_space(), 0, 0); // start timer - m_timer_count->adjust(attotime::zero, 0, attotime::from_hz((XTAL(4'000'000) / 4) / 16)); + m_dac_timer->adjust(attotime::zero, 0, attotime::from_hz((XTAL(4'000'000) / 4) / 16)); + m_scanline_timer->adjust(m_screen->scan_period()); } @@ -467,64 +494,63 @@ void beezer_state::machine_reset() // MACHINE DEFINTIONS //************************************************************************** -MACHINE_CONFIG_START(beezer_state::beezer) +void beezer_state::beezer(machine_config &config) +{ // basic machine hardware - MCFG_DEVICE_ADD("maincpu", MC6809, XTAL(12'000'000) / 3) - MCFG_DEVICE_PROGRAM_MAP(main_map) - - MCFG_DEVICE_ADD("sysbank", ADDRESS_MAP_BANK, 0) - MCFG_DEVICE_PROGRAM_MAP(banked_map) - MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_BIG) - MCFG_ADDRESS_MAP_BANK_DATA_WIDTH(8) - MCFG_ADDRESS_MAP_BANK_ADDR_WIDTH(15) - MCFG_ADDRESS_MAP_BANK_STRIDE(0x1000) - - MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", beezer_state, scanline_cb, "screen", 0, 1) - - MCFG_DEVICE_ADD("via_u6", VIA6522, XTAL(12'000'000) / 12) - MCFG_VIA6522_READPA_HANDLER(READ8(*this, beezer_state, via_system_pa_r)) - MCFG_VIA6522_READPB_HANDLER(READ8(*this, beezer_state, via_system_pb_r)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, beezer_state, via_system_pa_w)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, beezer_state, via_system_pb_w)) - MCFG_VIA6522_CB1_HANDLER(WRITELINE("via_u18", via6522_device, write_ca2)) - MCFG_VIA6522_CB2_HANDLER(WRITELINE("via_u18", via6522_device, write_ca1)) - MCFG_VIA6522_IRQ_HANDLER(INPUTLINE("maincpu", M6809_IRQ_LINE)) - - MCFG_WATCHDOG_ADD("watchdog") + MC6809(config, m_maincpu, XTAL(12'000'000) / 3); + m_maincpu->set_addrmap(AS_PROGRAM, &beezer_state::main_map); + + ADDRESS_MAP_BANK(config, m_sysbank, 0); + m_sysbank->set_addrmap(AS_PROGRAM, &beezer_state::banked_map); + m_sysbank->set_endianness(ENDIANNESS_BIG); + m_sysbank->set_data_width(8); + m_sysbank->set_addr_width(15); + m_sysbank->set_stride(0x1000); + + VIA6522(config, m_via_system, XTAL(12'000'000) / 12); + m_via_system->readpa_handler().set(FUNC(beezer_state::via_system_pa_r)); + m_via_system->readpb_handler().set(FUNC(beezer_state::via_system_pb_r)); + m_via_system->writepa_handler().set(FUNC(beezer_state::via_system_pa_w)); + m_via_system->writepb_handler().set(FUNC(beezer_state::via_system_pb_w)); + m_via_system->cb1_handler().set(m_via_audio, FUNC(via6522_device::write_ca2)); + m_via_system->cb2_handler().set(m_via_audio, FUNC(via6522_device::write_ca1)); + m_via_system->irq_handler().set_inputline(m_maincpu, M6809_IRQ_LINE); + + WATCHDOG_TIMER(config, "watchdog"); // video hardware - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_SIZE(384, 256) - MCFG_SCREEN_VISIBLE_AREA(16, 304-1, 0, 240-1) // 288 x 240, correct? - MCFG_SCREEN_UPDATE_DRIVER(beezer_state, screen_update_beezer) - MCFG_SCREEN_PALETTE("palette") + SCREEN(config, m_screen, SCREEN_TYPE_RASTER); + m_screen->set_refresh_hz(60); + m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */ + m_screen->set_size(384, 256); + m_screen->set_visarea(16, 304-1, 0, 240-1); // 288 x 240, correct? + m_screen->set_screen_update(FUNC(beezer_state::screen_update)); + m_screen->set_palette(m_palette); - MCFG_PALETTE_ADD("palette", 16) - MCFG_PALETTE_INIT_OWNER(beezer_state, beezer) + PALETTE(config, m_palette, 16); + m_palette->set_init(DEVICE_SELF_OWNER, FUNC(beezer_state::palette_init)); // sound hardware - MCFG_DEVICE_ADD("audiocpu", MC6809, XTAL(4'000'000)) - MCFG_DEVICE_PROGRAM_MAP(sound_map) - - MCFG_INPUT_MERGER_ANY_HIGH("audio_irqs") - MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("audiocpu", M6809_IRQ_LINE)) - - MCFG_DEVICE_ADD("via_u18", VIA6522, XTAL(4'000'000) / 4) - MCFG_VIA6522_READPA_HANDLER(READ8(*this, beezer_state, via_audio_pa_r)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, beezer_state, via_audio_pa_w)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, beezer_state, via_audio_pb_w)) - MCFG_VIA6522_CA2_HANDLER(WRITELINE("via_u6", via6522_device, write_cb1)) - MCFG_VIA6522_CB1_HANDLER(WRITELINE(*this, beezer_state, dmod_clr_w)) - MCFG_VIA6522_CB2_HANDLER(WRITELINE(*this, beezer_state, dmod_data_w)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE("audio_irqs", input_merger_device, in_w<0>)) - - MCFG_DEVICE_ADD("ptm", PTM6840, XTAL(4'000'000) / 4) - MCFG_PTM6840_O1_CB(WRITELINE(*this, beezer_state, ptm_o1_w)) - MCFG_PTM6840_O2_CB(WRITELINE(*this, beezer_state, ptm_o2_w)) - MCFG_PTM6840_O3_CB(WRITELINE(*this, beezer_state, ptm_o3_w)) - MCFG_PTM6840_IRQ_CB(WRITELINE("audio_irqs", input_merger_device, in_w<1>)) + MC6809(config, m_audiocpu, XTAL(4'000'000)); + m_audiocpu->set_addrmap(AS_PROGRAM, &beezer_state::sound_map); + + input_merger_device &audio_irqs(INPUT_MERGER_ANY_HIGH(config, "audio_irqs")); + audio_irqs.output_handler().set_inputline(m_audiocpu, M6809_IRQ_LINE); + + VIA6522(config, m_via_audio, XTAL(4'000'000) / 4); + m_via_audio->readpa_handler().set(FUNC(beezer_state::via_audio_pa_r)); + m_via_audio->writepa_handler().set(FUNC(beezer_state::via_audio_pa_w)); + m_via_audio->writepb_handler().set(FUNC(beezer_state::via_audio_pb_w)); + m_via_audio->ca2_handler().set(m_via_system, FUNC(via6522_device::write_cb1)); + m_via_audio->cb1_handler().set(FUNC(beezer_state::dmod_clr_w)); + m_via_audio->cb2_handler().set(FUNC(beezer_state::dmod_data_w)); + m_via_audio->irq_handler().set("audio_irqs", FUNC(input_merger_device::in_w<0>)); + + PTM6840(config, m_ptm, XTAL(4'000'000) / 4); + m_ptm->o1_callback().set(FUNC(beezer_state::ptm_o1_w)); + m_ptm->o2_callback().set(FUNC(beezer_state::ptm_o2_w)); + m_ptm->o3_callback().set(FUNC(beezer_state::ptm_o3_w)); + m_ptm->irq_callback().set("audio_irqs", FUNC(input_merger_device::in_w<1>)); // schematics show an input labeled VCO to channel 2, but the source is unknown mm5837_device &noise(MM5837(config, "noise")); @@ -532,9 +558,9 @@ MACHINE_CONFIG_START(beezer_state::beezer) noise.output_callback().set(FUNC(beezer_state::noise_w)); SPEAKER(config, "speaker").front_center(); - MCFG_DEVICE_ADD("dac", DAC76, 0) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0) -MACHINE_CONFIG_END + DAC76(config, m_dac, 0); + m_dac->add_route(ALL_OUTPUTS, "speaker", 1.0); +} //************************************************************************** diff --git a/src/mame/drivers/bfcobra.cpp b/src/mame/drivers/bfcobra.cpp index 0215b85ce1c..c38ea142449 100644 --- a/src/mame/drivers/bfcobra.cpp +++ b/src/mame/drivers/bfcobra.cpp @@ -408,13 +408,13 @@ uint32_t bfcobra_state::screen_update_bfcobra(screen_device &screen, bitmap_rgb3 lorescol = m_col8bit; } - for (y = cliprect.min_y; y <= cliprect.max_y; ++y) + for (y = cliprect.top(); y <= cliprect.bottom(); ++y) { uint16_t y_offset = (y + m_v_scroll) * 256; src = &m_video_ram[offset + y_offset]; dest = &bitmap.pix32(y); - for (x = cliprect.min_x; x <= cliprect.max_x / 2; ++x) + for (x = cliprect.left(); x <= cliprect.right() / 2; ++x) { uint8_t x_offset = x + m_h_scroll; uint8_t pen = *(src + x_offset); diff --git a/src/mame/drivers/bloodbro.cpp b/src/mame/drivers/bloodbro.cpp index acabec2672c..698937d46f0 100644 --- a/src/mame/drivers/bloodbro.cpp +++ b/src/mame/drivers/bloodbro.cpp @@ -184,9 +184,9 @@ void bloodbro_state::skysmash_map(address_map &map) map(0xc0000, 0xc004f).rw("crtc", FUNC(seibu_crtc_device::read_alt), FUNC(seibu_crtc_device::write_alt)); } -WRITE8_MEMBER(bloodbro_state::weststry_soundlatch_w) +void bloodbro_state::weststry_soundlatch_w(offs_t offset, u8 data) { - m_seibu_sound->main_w(space, offset, data, mem_mask); + m_seibu_sound->main_w(offset, data); if (offset == 1) m_audiocpu->set_input_line(0, ASSERT_LINE); diff --git a/src/mame/drivers/blw700i.cpp b/src/mame/drivers/blw700i.cpp new file mode 100644 index 00000000000..b0471c08b22 --- /dev/null +++ b/src/mame/drivers/blw700i.cpp @@ -0,0 +1,290 @@ +// license:BSD-3-Clause +// copyright-holders:R. Belmont +/*************************************************************************** + + Brother LW-700i and friends word processor/typewriters + + Preliminary driver by R. Belmont + + Main CPU: Hitachi H8/3003 + FDC: HD63266F (uPD765 derivative) + 256KiB RAM + Dot-matrix LCD (480x128) + +****************************************************************************/ + +#include "emu.h" +#include "cpu/h8/h83003.h" +#include "machine/nvram.h" +#include "machine/at28c16.h" +#include "screen.h" +#include "speaker.h" +#include "machine/timer.h" + +class lw700i_state : public driver_device +{ +public: + lw700i_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_mainram(*this, "mainram"), + m_screen(*this, "screen"), + m_keyboard(*this, "X%u", 0) + { } + + void lw700i(machine_config &config); + + DECLARE_READ16_MEMBER(status_r) { return 0x8080; } // "ready" + DECLARE_WRITE16_MEMBER(data_w) { } + + DECLARE_READ8_MEMBER(p7_r); + DECLARE_READ8_MEMBER(pb_r); + DECLARE_WRITE8_MEMBER(pb_w); + +private: + virtual void machine_reset() override; + virtual void machine_start() override; + + uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + + void main_map(address_map &map); + void io_map(address_map &map); + + TIMER_DEVICE_CALLBACK_MEMBER(vbl_interrupt); + + // devices + required_device<h83003_device> m_maincpu; + required_shared_ptr<uint16_t> m_mainram; + required_device<screen_device> m_screen; + required_ioport_array<9> m_keyboard; + + // driver_device overrides + virtual void video_start() override; + + uint8_t m_keyrow; +}; + +READ8_MEMBER(lw700i_state::p7_r) +{ + //("Read P7 (PC=%x)\n", m_maincpu->pc()); + // must be non-zero; f0 = French, fe = German, ff = English + if (m_keyrow == 0xf) + { + return 0xff; + } + + if (m_keyrow < 9) + { + return m_keyboard[m_keyrow]->read(); + } + + return 0xff; +} + +READ8_MEMBER(lw700i_state::pb_r) +{ + return 0; +} + +WRITE8_MEMBER(lw700i_state::pb_w) +{ + //printf("%x to keyboard row\n", data); + m_keyrow = data; +} + +TIMER_DEVICE_CALLBACK_MEMBER(lw700i_state::vbl_interrupt) +{ + int scanline = m_screen->vpos(); + + if (scanline == 1) + { + m_maincpu->set_input_line(5, ASSERT_LINE); + // not sure where this is coming from, fix hang + m_maincpu->space(0).write_byte(0xffffff05, 0); + } + else if (scanline == 2) + { + m_maincpu->set_input_line(5, CLEAR_LINE); + } +} + +void lw700i_state::machine_reset() +{ +} + +void lw700i_state::machine_start() +{ +} + +void lw700i_state::video_start() +{ +} + +uint32_t lw700i_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +{ + uint32_t *scanline; + int x, y; + uint8_t pixels; + static const uint32_t palette[2] = { 0xffffff, 0 }; + uint8_t *pVRAM = (uint8_t *)m_mainram.target(); + + pVRAM += 0x3e200; + + for (y = 0; y < 128; y++) + { + scanline = &bitmap.pix32(y); + for (x = 0; x < 480/8; x++) + { + pixels = pVRAM[(y * (480/8)) + (BYTE_XOR_BE(x))]; + + *scanline++ = palette[(pixels>>7)&1]; + *scanline++ = palette[(pixels>>6)&1]; + *scanline++ = palette[(pixels>>5)&1]; + *scanline++ = palette[(pixels>>4)&1]; + *scanline++ = palette[(pixels>>3)&1]; + *scanline++ = palette[(pixels>>2)&1]; + *scanline++ = palette[(pixels>>1)&1]; + *scanline++ = palette[(pixels&1)]; + } + } + + return 0; +} + +void lw700i_state::main_map(address_map &map) +{ + map(0x000000, 0x1fffff).rom().region("maincpu", 0x0000); + map(0x600000, 0x63ffff).ram().share("mainram"); // 256K of main RAM + map(0xe00000, 0xe00001).rw(FUNC(lw700i_state::status_r), FUNC(lw700i_state::data_w)); + map(0xf00048, 0xf00049).ram(); +} + +void lw700i_state::io_map(address_map &map) +{ + map(h83003_device::PORT_7, h83003_device::PORT_7).r(FUNC(lw700i_state::p7_r)); + map(h83003_device::PORT_B, h83003_device::PORT_B).rw(FUNC(lw700i_state::pb_r), FUNC(lw700i_state::pb_w)); +} + +// row 0: | 4 | 3 | W | E | D | X | ? | Enter? | +// row 1: | 5 | 6 | R | T | C | F | ? | DArr | +// row 2: | 8 | 7 | Y | H | G | V | ? | ? | +// row 3: | 1 | 2 | Q | Z | A | S | ? | Shift Lock? | +// row 4: | 9 | J | I | U | B | N | ? | RArr | +// row 5: | - | 0 | P | O | M | , | ? | Menu | +// row 6: | ? | ; |2/3| | |LAr|UAr| ? | ? | +// row 7: | ? | ? |ENT|BkS| ? | ? | ? | Shift? | +// row 8: |3/4| L | = | K | . |1/2| * | ? | + +static INPUT_PORTS_START( lw700i ) + PORT_START("X0") + PORT_BIT(0x001, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('@') + PORT_BIT(0x002, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('/') + PORT_BIT(0x004, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W') + PORT_BIT(0x008, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E') + PORT_BIT(0x010, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D') + PORT_BIT(0x020, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') + PORT_BIT(0x040, IP_ACTIVE_LOW, IPT_UNKNOWN) + PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_UNKNOWN) + + PORT_START("X1") + PORT_BIT(0x001, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR(0xa3) + PORT_BIT(0x002, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('_') + PORT_BIT(0x004, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R') + PORT_BIT(0x008, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T') + PORT_BIT(0x010, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C') + PORT_BIT(0x020, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F') + PORT_BIT(0x040, IP_ACTIVE_LOW, IPT_UNKNOWN) + PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(UTF8_DOWN) PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN)) + + PORT_START("X2") + PORT_BIT(0x001, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('\'') + PORT_BIT(0x002, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('&') + PORT_BIT(0x004, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y') + PORT_BIT(0x008, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H') + PORT_BIT(0x010, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G') + PORT_BIT(0x020, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V') + PORT_BIT(0x040, IP_ACTIVE_LOW, IPT_UNKNOWN) + PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_UNKNOWN) + + PORT_START("X3") + PORT_BIT(0x001, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR(0x2021) + PORT_BIT(0x002, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('"') + PORT_BIT(0x004, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q') + PORT_BIT(0x008, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z') + PORT_BIT(0x010, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A') + PORT_BIT(0x020, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S') + PORT_BIT(0x040, IP_ACTIVE_LOW, IPT_UNKNOWN) + PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_CAPSLOCK) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) + + PORT_START("X4") + PORT_BIT(0x001, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR('(') + PORT_BIT(0x002, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J') + PORT_BIT(0x004, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I') + PORT_BIT(0x008, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U') + PORT_BIT(0x010, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B') + PORT_BIT(0x020, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N') + PORT_BIT(0x040, IP_ACTIVE_LOW, IPT_UNKNOWN) + PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(UTF8_RIGHT) PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) + + PORT_START("X5") + PORT_BIT(0x001, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('-') PORT_CHAR('?') + PORT_BIT(0x002, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR(')') + PORT_BIT(0x004, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P') + PORT_BIT(0x008, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O') + PORT_BIT(0x010, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M') + PORT_BIT(0x020, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') + PORT_BIT(0x040, IP_ACTIVE_LOW, IPT_UNKNOWN) + PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Menu") PORT_CODE(KEYCODE_ESC) PORT_CHAR(27) + + PORT_START("X6") + PORT_BIT(0x001, IP_ACTIVE_LOW, IPT_UNKNOWN) + PORT_BIT(0x002, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR(';') PORT_CHAR(':') + PORT_BIT(0x004, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(0x2154) PORT_CHAR(0x2153) + PORT_BIT(0x008, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('|') PORT_CHAR('$') + PORT_BIT(0x010, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(UTF8_LEFT) PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT)) + PORT_BIT(0x020, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(UTF8_UP) PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP)) + PORT_BIT(0x040, IP_ACTIVE_LOW, IPT_UNKNOWN) + PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_UNKNOWN) + + PORT_START("X7") + PORT_BIT(0x001, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Print") + PORT_BIT(0x002, IP_ACTIVE_LOW, IPT_UNKNOWN) + PORT_BIT(0x004, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Return") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) + PORT_BIT(0x008, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) + PORT_BIT(0x010, IP_ACTIVE_LOW, IPT_UNKNOWN) + PORT_BIT(0x020, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Clear") + PORT_BIT(0x040, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') + PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Left Shift") PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1) + + PORT_START("X8") + PORT_BIT(0x001, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR(0xbe) PORT_CHAR(0xbc) + PORT_BIT(0x002, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L') + PORT_BIT(0x004, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('=') PORT_CHAR('+') + PORT_BIT(0x008, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K') + PORT_BIT(0x010, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') + PORT_BIT(0x020, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS) PORT_CHAR(0xbd) PORT_CHAR('%') + PORT_BIT(0x040, IP_ACTIVE_LOW, IPT_UNKNOWN) + PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_UNKNOWN) + +INPUT_PORTS_END + +MACHINE_CONFIG_START(lw700i_state::lw700i) + MCFG_DEVICE_ADD("maincpu", H83003, XTAL(16'000'000)) + MCFG_DEVICE_PROGRAM_MAP(main_map) + MCFG_DEVICE_IO_MAP(io_map) + MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", lw700i_state, vbl_interrupt, "screen", 0, 1) + + MCFG_SCREEN_ADD("screen", LCD) + MCFG_SCREEN_REFRESH_RATE(60) + MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) + MCFG_SCREEN_UPDATE_DRIVER(lw700i_state, screen_update) + MCFG_SCREEN_SIZE(640, 400) + MCFG_SCREEN_VISIBLE_AREA(0, 480, 0, 128) +MACHINE_CONFIG_END + +ROM_START(blw700i) + ROM_REGION(0x200000, "maincpu", 0) /* H8/3003 program ROM */ + ROM_LOAD16_WORD_SWAP( "mx24969b.bin", 0x000000, 0x200000, CRC(78d88d04) SHA1(3cda632c7190257abd20e121575767e8e9a18b1c) ) +ROM_END + +SYST( 1995, blw700i, 0, 0, lw700i, lw700i, lw700i_state, empty_init, "Brother", "LW-700i", MACHINE_NOT_WORKING|MACHINE_NO_SOUND ) diff --git a/src/mame/drivers/bmcbowl.cpp b/src/mame/drivers/bmcbowl.cpp index 57803ab89b1..2ca7256b8bf 100644 --- a/src/mame/drivers/bmcbowl.cpp +++ b/src/mame/drivers/bmcbowl.cpp @@ -125,16 +125,18 @@ public: m_stats_ram(*this, "nvram", 16), m_vid1(*this, "vid1"), m_vid2(*this, "vid2"), - m_palette(*this, "palette") { } + m_palette(*this, "palette"), + m_input(*this, "IN%u", 1) + { } - required_device<cpu_device> m_maincpu; - optional_shared_ptr<uint8_t> m_stats_ram; - required_shared_ptr<uint16_t> m_vid1; - required_shared_ptr<uint16_t> m_vid2; - required_device<palette_device> m_palette; - int m_bmc_input; - DECLARE_READ16_MEMBER(bmc_random_read); - DECLARE_READ16_MEMBER(bmc_protection_r); + void bmcbowl(machine_config &config); + +private: + virtual void machine_start() override; + virtual void machine_reset() override; + + DECLARE_READ16_MEMBER(random_read); + DECLARE_READ16_MEMBER(protection_r); DECLARE_WRITE16_MEMBER(scroll_w); DECLARE_READ8_MEMBER(via_b_in); DECLARE_WRITE8_MEMBER(via_a_out); @@ -142,24 +144,23 @@ public: DECLARE_WRITE_LINE_MEMBER(via_ca2_out); DECLARE_READ8_MEMBER(dips1_r); DECLARE_WRITE8_MEMBER(input_mux_w); - void init_bmcbowl(); - virtual void machine_reset() override; - virtual void video_start() override; - uint32_t screen_update_bmcbowl(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); void init_stats(const uint8_t *table, int table_len, int address); - void bmcbowl(machine_config &config); - void bmcbowl_mem(address_map &map); + void main_mem(address_map &map); void ramdac_map(address_map &map); -}; - + required_device<cpu_device> m_maincpu; + optional_shared_ptr<uint8_t> m_stats_ram; + required_shared_ptr<uint16_t> m_vid1; + required_shared_ptr<uint16_t> m_vid2; + required_device<palette_device> m_palette; + required_ioport_array<2> m_input; + uint8_t m_selected_input; +}; -void bmcbowl_state::video_start() -{ -} -uint32_t bmcbowl_state::screen_update_bmcbowl(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +uint32_t bmcbowl_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { /* 280x230,4 bitmap layers, 8bpp, @@ -208,12 +209,12 @@ uint32_t bmcbowl_state::screen_update_bmcbowl(screen_device &screen, bitmap_ind1 return 0; } -READ16_MEMBER(bmcbowl_state::bmc_random_read) +READ16_MEMBER(bmcbowl_state::random_read) { return machine().rand(); } -READ16_MEMBER(bmcbowl_state::bmc_protection_r) +READ16_MEMBER(bmcbowl_state::protection_r) { switch(m_maincpu->pcbase()) { @@ -301,6 +302,11 @@ void bmcbowl_state::init_stats(const uint8_t *table, int table_len, int address) } #endif +void bmcbowl_state::machine_start() +{ + save_item(NAME(m_selected_input)); +} + void bmcbowl_state::machine_reset() { #ifdef NVRAM_HACK @@ -313,7 +319,7 @@ void bmcbowl_state::machine_reset() #endif } -void bmcbowl_state::bmcbowl_mem(address_map &map) +void bmcbowl_state::main_mem(address_map &map) { map(0x000000, 0x01ffff).rom(); @@ -345,9 +351,9 @@ void bmcbowl_state::bmcbowl_mem(address_map &map) map(0x30c040, 0x30c041).nopw(); map(0x30c080, 0x30c081).nopw(); map(0x30c0c0, 0x30c0c1).nopw(); - map(0x30c100, 0x30c101).r(FUNC(bmcbowl_state::bmc_protection_r)); + map(0x30c100, 0x30c101).r(FUNC(bmcbowl_state::protection_r)); map(0x30c140, 0x30c141).nopw(); - map(0x30ca00, 0x30ca01).r(FUNC(bmcbowl_state::bmc_random_read)).nopw(); + map(0x30ca00, 0x30ca01).r(FUNC(bmcbowl_state::random_read)).nopw(); } @@ -436,19 +442,19 @@ INPUT_PORTS_END READ8_MEMBER(bmcbowl_state::dips1_r) { - switch(m_bmc_input) + switch(m_selected_input) { - case 0x00: return ioport("IN1")->read(); - case 0x40: return ioport("IN2")->read(); + case 0x00: return m_input[0]->read(); + case 0x40: return m_input[1]->read(); } - logerror("%s:unknown input - %X\n",machine().describe_context(),m_bmc_input); + logerror("%s: unknown input - %X\n", machine().describe_context(), m_selected_input); return 0xff; } WRITE8_MEMBER(bmcbowl_state::input_mux_w) { - m_bmc_input=data; + m_selected_input = data; } void bmcbowl_state::ramdac_map(address_map &map) @@ -456,49 +462,52 @@ void bmcbowl_state::ramdac_map(address_map &map) map(0x000, 0x3ff).rw("ramdac", FUNC(ramdac_device::ramdac_pal_r), FUNC(ramdac_device::ramdac_rgb666_w)); } -MACHINE_CONFIG_START(bmcbowl_state::bmcbowl) - MCFG_DEVICE_ADD("maincpu", M68000, XTAL(21'477'272) / 2 ) - MCFG_DEVICE_PROGRAM_MAP(bmcbowl_mem) - MCFG_DEVICE_VBLANK_INT_DRIVER("screen", bmcbowl_state, irq2_line_hold) +void bmcbowl_state::bmcbowl(machine_config &config) +{ + M68000(config, m_maincpu, XTAL(21'477'272) / 2); + m_maincpu->set_addrmap(AS_PROGRAM, &bmcbowl_state::main_mem); - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_SIZE(35*8, 30*8) - MCFG_SCREEN_VISIBLE_AREA(0*8, 35*8-1, 0*8, 29*8-1) - MCFG_SCREEN_UPDATE_DRIVER(bmcbowl_state, screen_update_bmcbowl) - MCFG_SCREEN_PALETTE("palette") + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); + screen.set_refresh_hz(60); + screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */ + screen.set_size(35*8, 30*8); + screen.set_visarea(0*8, 35*8-1, 0*8, 29*8-1); + screen.set_screen_update(FUNC(bmcbowl_state::screen_update)); + screen.set_palette(m_palette); + screen.screen_vblank().set_inputline(m_maincpu, M68K_IRQ_2, HOLD_LINE); - MCFG_PALETTE_ADD("palette", 256) - MCFG_RAMDAC_ADD("ramdac", ramdac_map, "palette") + PALETTE(config, m_palette, 256); + ramdac_device &ramdac(RAMDAC(config, "ramdac", 0)); + ramdac.set_palette(m_palette); + ramdac.set_addrmap(0, &bmcbowl_state::ramdac_map); - MCFG_NVRAM_ADD_1FILL("nvram") + NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1); SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); - MCFG_DEVICE_ADD("ymsnd", YM2413, XTAL(3'579'545) ) // guessed chip type, clock not verified - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.50) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.50) + ym2413_device &ymsnd(YM2413(config, "ymsnd", XTAL(3'579'545))); // guessed chip type, clock not verified + ymsnd.add_route(ALL_OUTPUTS, "lspeaker", 0.50); + ymsnd.add_route(ALL_OUTPUTS, "rspeaker", 0.50); - MCFG_DEVICE_ADD("aysnd", AY8910, XTAL(3'579'545) / 2) - MCFG_AY8910_PORT_A_READ_CB(READ8(*this, bmcbowl_state, dips1_r)) - MCFG_AY8910_PORT_B_WRITE_CB(WRITE8(*this, bmcbowl_state, input_mux_w)) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.50) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.50) + ay8910_device &aysnd(AY8910(config, "aysnd", XTAL(3'579'545) / 2)); + aysnd.port_a_read_callback().set(FUNC(bmcbowl_state::dips1_r)); + aysnd.port_b_write_callback().set(FUNC(bmcbowl_state::input_mux_w)); + aysnd.add_route(ALL_OUTPUTS, "lspeaker", 0.50); + aysnd.add_route(ALL_OUTPUTS, "rspeaker", 0.50); - MCFG_DEVICE_ADD("oki", OKIM6295, 1122000, okim6295_device::PIN7_HIGH) // clock frequency & pin 7 not verified - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.50) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.50) + okim6295_device &oki(OKIM6295(config, "oki", 1122000, okim6295_device::PIN7_HIGH)); // clock frequency & pin 7 not verified + oki.add_route(ALL_OUTPUTS, "lspeaker", 0.50); + oki.add_route(ALL_OUTPUTS, "rspeaker", 0.50); /* via */ - MCFG_DEVICE_ADD("via6522_0", VIA6522, 1000000) - MCFG_VIA6522_READPB_HANDLER(READ8(*this, bmcbowl_state,via_b_in)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, bmcbowl_state, via_a_out)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, bmcbowl_state, via_b_out)) - MCFG_VIA6522_CA2_HANDLER(WRITELINE(*this, bmcbowl_state, via_ca2_out)) - MCFG_VIA6522_IRQ_HANDLER(INPUTLINE("maincpu", M68K_IRQ_4)) -MACHINE_CONFIG_END + via6522_device &via(VIA6522(config, "via6522_0", 1000000)); + via.readpb_handler().set(FUNC(bmcbowl_state::via_b_in)); + via.writepa_handler().set(FUNC(bmcbowl_state::via_a_out)); + via.writepb_handler().set(FUNC(bmcbowl_state::via_b_out)); + via.ca2_handler().set(FUNC(bmcbowl_state::via_ca2_out)); + via.irq_handler().set_inputline(m_maincpu, M68K_IRQ_4); +} ROM_START( bmcbowl ) ROM_REGION( 0x200000, "maincpu", 0 ) /* 68000 Code */ @@ -518,9 +527,4 @@ ROM_START( bmcbowl ) ROM_END -void bmcbowl_state::init_bmcbowl() -{ - save_item(NAME(m_bmc_input)); -} - -GAME( 1994, bmcbowl, 0, bmcbowl, bmcbowl, bmcbowl_state, init_bmcbowl, ROT0, "BMC", "Konkyuu no Hoshi", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE) +GAME( 1994, bmcbowl, 0, bmcbowl, bmcbowl, bmcbowl_state, empty_init, ROT0, "BMC", "Konkyuu no Hoshi", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE) diff --git a/src/mame/drivers/bmcpokr.cpp b/src/mame/drivers/bmcpokr.cpp index 288882bc8de..fcd3c212560 100644 --- a/src/mame/drivers/bmcpokr.cpp +++ b/src/mame/drivers/bmcpokr.cpp @@ -236,11 +236,10 @@ void bmcpokr_state::draw_layer(screen_device &screen, bitmap_ind16 &bitmap, cons { if (linescroll) { - if ( (y < cliprect.min_y) || (y > cliprect.max_y) ) + if ( (y < cliprect.top()) || (y > cliprect.bottom()) ) continue; - clip.min_y = y; - clip.max_y = y; + clip.sety(y, y); } int sx = (scroll[y] & 0xff) * 4; diff --git a/src/mame/drivers/boogwing.cpp b/src/mame/drivers/boogwing.cpp index 0d207317bdf..bd2a19485ed 100644 --- a/src/mame/drivers/boogwing.cpp +++ b/src/mame/drivers/boogwing.cpp @@ -174,8 +174,6 @@ void boogwing_state::audio_map(address_map &map) map(0x130000, 0x130001).rw(m_oki[1], FUNC(okim6295_device::read), FUNC(okim6295_device::write)); map(0x140000, 0x140000).r(m_deco104, FUNC(deco104_device::soundlatch_r)); map(0x1f0000, 0x1f1fff).ram(); - map(0x1fec00, 0x1fec01).rw(m_audiocpu, FUNC(h6280_device::timer_r), FUNC(h6280_device::timer_w)).mirror(0x3fe); - map(0x1ff400, 0x1ff403).rw(m_audiocpu, FUNC(h6280_device::irq_status_r), FUNC(h6280_device::irq_status_w)).mirror(0x3fc); } @@ -346,8 +344,10 @@ MACHINE_CONFIG_START(boogwing_state::boogwing) MCFG_DEVICE_OPCODES_MAP(decrypted_opcodes_map) MCFG_DEVICE_VBLANK_INT_DRIVER("screen", boogwing_state, irq6_line_hold) - MCFG_DEVICE_ADD("audiocpu", H6280, SOUND_XTAL/4) - MCFG_DEVICE_PROGRAM_MAP(audio_map) + H6280(config, m_audiocpu, SOUND_XTAL/4); + m_audiocpu->set_addrmap(AS_PROGRAM, &boogwing_state::audio_map); + m_audiocpu->add_route(ALL_OUTPUTS, "lspeaker", 0); // internal sound unused + m_audiocpu->add_route(ALL_OUTPUTS, "rspeaker", 0); /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) diff --git a/src/mame/drivers/c65.cpp b/src/mame/drivers/c65.cpp index 770b4a7fd61..597a6ed16c1 100644 --- a/src/mame/drivers/c65.cpp +++ b/src/mame/drivers/c65.cpp @@ -147,9 +147,9 @@ uint32_t c65_state::screen_update( screen_device &screen, bitmap_ind16 &bitmap, uint8_t *cptr = &m_iplrom[((m_VIC3_ControlA & 0x40) ? 0x9000: 0xd000) + ((m_VIC2_VS_CB_Base & 0x2) << 10)]; // TODO: border area - for(int y=cliprect.min_y;y<=cliprect.max_y;y++) + for(int y=cliprect.top();y<=cliprect.bottom();y++) { - for(int x=cliprect.min_x;x<=cliprect.max_x;x++) + for(int x=cliprect.left();x<=cliprect.right();x++) { //int, xi,yi,xm,ym,dot_x; int xi = inner_x_char(x / pixel_width); diff --git a/src/mame/drivers/cabal.cpp b/src/mame/drivers/cabal.cpp index 0a900107f25..8a24021bba1 100644 --- a/src/mame/drivers/cabal.cpp +++ b/src/mame/drivers/cabal.cpp @@ -86,10 +86,10 @@ WRITE16_MEMBER(cabal_state::cabalbl_sndcmd_w) -WRITE16_MEMBER(cabal_state::sound_irq_trigger_word_w) +void cabal_state::sound_irq_trigger_word_w(offs_t, u16 data, u16 mem_mask) { if (ACCESSING_BITS_0_7) - m_seibu_sound->main_w(space, 4, data & 0x00ff); + m_seibu_sound->main_w(4, data & 0x00ff); /* spin for a while to let the Z80 read the command, otherwise coins "stick" */ m_maincpu->spin_until_time(attotime::from_usec(50)); diff --git a/src/mame/drivers/candela.cpp b/src/mame/drivers/candela.cpp index efc6c7ad76c..a06804da965 100644 --- a/src/mame/drivers/candela.cpp +++ b/src/mame/drivers/candela.cpp @@ -6,7 +6,7 @@ *--------------------------- * The Candela computer was designed to be the big breakthough and developed by Candela Data AB, "a Didact Company". * The Candela system was based around a main unit that could run OS-9 or Flex and a terminal unit that had a - * propietary software including CDBASIC. The Candela system lost the battle of the swedish schools to + * proprietory software including CDBASIC. The Candela system lost the battle of the Swedish schools to * the Compis computer by TeleNova which was based on CP/M initially. Later both lost to IBM PC as we know. * Candela Data continued to sell their system to the swedish industry without major successes despite great * innovation and spririt. @@ -485,7 +485,7 @@ INPUT_PORTS_END * Candela Main Unit * TODO: * - Map PIA:S - * - ROM/RAM paging by using the PIA:s and the myriad of 74138:s on the board + * - ROM/RAM paging by using the PIAs and the myriad of 74138s on the board * - Vram and screen for the 6845 CRTC * - Keyboard * - Serial port @@ -504,6 +504,10 @@ public: ,m_bank1(*this, "bank1") ,m_crtc(*this, "crtc") { } + + void can09(machine_config &config); + +protected: required_device<cpu_device> m_maincpu; virtual void machine_reset() override; virtual void machine_start() override; @@ -513,9 +517,7 @@ public: DECLARE_WRITE8_MEMBER( pia1_B_w ); DECLARE_WRITE_LINE_MEMBER( pia1_cb2_w); uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - void can09(machine_config &config); void can09_map(address_map &map); -protected: required_device<pia6821_device> m_pia1; required_device<ram_device> m_ram; required_memory_bank m_bank1; @@ -626,7 +628,7 @@ static INPUT_PORTS_START( can09 ) INPUT_PORTS_END // traced and guessed from pcb images and debugger -// It is very likelly that this is a PIA based dynamic address map, needs more analysis +// It is very likely that this is a PIA based dynamic address map, needs more analysis void can09_state::can09_map(address_map &map) { /* diff --git a/src/mame/drivers/casloopy.cpp b/src/mame/drivers/casloopy.cpp index ff2df37a817..060dfdd4a95 100644 --- a/src/mame/drivers/casloopy.cpp +++ b/src/mame/drivers/casloopy.cpp @@ -297,7 +297,7 @@ uint32_t casloopy_state::screen_update(screen_device &screen, bitmap_ind16 &bitm count = test; - for (y=cliprect.min_y;y<cliprect.max_y;y++) + for (y=cliprect.top(); y<cliprect.bottom(); y++) // FIXME: off-by-one? { for(x=0;x<256;x++) { diff --git a/src/mame/drivers/cbm2.cpp b/src/mame/drivers/cbm2.cpp index e69661d8526..a212bccd53c 100644 --- a/src/mame/drivers/cbm2.cpp +++ b/src/mame/drivers/cbm2.cpp @@ -2343,19 +2343,22 @@ MACHINE_CONFIG_START(p500_state::p500_ntsc) // devices MCFG_PLS100_ADD(PLA1_TAG) MCFG_PLS100_ADD(PLA2_TAG) - MCFG_DEVICE_ADD(MOS6525_1_TAG, TPI6525, 0) - MCFG_TPI6525_OUT_IRQ_CB(WRITELINE(*this, p500_state, tpi1_irq_w)) - MCFG_TPI6525_IN_PA_CB(READ8(*this, cbm2_state, tpi1_pa_r)) - MCFG_TPI6525_OUT_PA_CB(WRITE8(*this, cbm2_state, tpi1_pa_w)) - MCFG_TPI6525_IN_PB_CB(READ8(*this, cbm2_state, tpi1_pb_r)) - MCFG_TPI6525_OUT_PB_CB(WRITE8(*this, cbm2_state, tpi1_pb_w)) - MCFG_TPI6525_OUT_CA_CB(WRITELINE(*this, p500_state, tpi1_ca_w)) - MCFG_TPI6525_OUT_CB_CB(WRITELINE(*this, p500_state, tpi1_cb_w)) - MCFG_DEVICE_ADD(MOS6525_2_TAG, TPI6525, 0) - MCFG_TPI6525_OUT_PA_CB(WRITE8(*this, cbm2_state, tpi2_pa_w)) - MCFG_TPI6525_OUT_PB_CB(WRITE8(*this, cbm2_state, tpi2_pb_w)) - MCFG_TPI6525_IN_PC_CB(READ8(*this, p500_state, tpi2_pc_r)) - MCFG_TPI6525_OUT_PC_CB(WRITE8(*this, p500_state, tpi2_pc_w)) + + TPI6525(config, m_tpi1, 0); + m_tpi1->out_irq_cb().set(FUNC(p500_state::tpi1_irq_w)); + m_tpi1->in_pa_cb().set(FUNC(cbm2_state::tpi1_pa_r)); + m_tpi1->out_pa_cb().set(FUNC(cbm2_state::tpi1_pa_w)); + m_tpi1->in_pb_cb().set(FUNC(cbm2_state::tpi1_pb_r)); + m_tpi1->out_pa_cb().set(FUNC(cbm2_state::tpi1_pb_w)); + m_tpi1->out_ca_cb().set(FUNC(p500_state::tpi1_ca_w)); + m_tpi1->out_cb_cb().set(FUNC(p500_state::tpi1_cb_w)); + + TPI6525(config, m_tpi2, 0); + m_tpi2->out_pa_cb().set(FUNC(cbm2_state::tpi2_pa_w)); + m_tpi2->out_pb_cb().set(FUNC(cbm2_state::tpi2_pb_w)); + m_tpi2->in_pc_cb().set(FUNC(p500_state::tpi2_pc_r)); + m_tpi2->out_pc_cb().set(FUNC(p500_state::tpi2_pc_w)); + MCFG_DEVICE_ADD(MOS6551A_TAG, MOS6551, VIC6567_CLOCK) MCFG_MOS6551_XTAL(XTAL(1'843'200)) MCFG_MOS6551_IRQ_HANDLER(WRITELINE(MOS6525_1_TAG, tpi6525_device, i4_w)) @@ -2459,19 +2462,22 @@ MACHINE_CONFIG_START(p500_state::p500_pal) // devices MCFG_PLS100_ADD(PLA1_TAG) MCFG_PLS100_ADD(PLA2_TAG) - MCFG_DEVICE_ADD(MOS6525_1_TAG, TPI6525, 0) - MCFG_TPI6525_OUT_IRQ_CB(WRITELINE(*this, p500_state, tpi1_irq_w)) - MCFG_TPI6525_IN_PA_CB(READ8(*this, cbm2_state, tpi1_pa_r)) - MCFG_TPI6525_OUT_PA_CB(WRITE8(*this, cbm2_state, tpi1_pa_w)) - MCFG_TPI6525_IN_PB_CB(READ8(*this, cbm2_state, tpi1_pb_r)) - MCFG_TPI6525_OUT_PB_CB(WRITE8(*this, cbm2_state, tpi1_pb_w)) - MCFG_TPI6525_OUT_CA_CB(WRITELINE(*this, p500_state, tpi1_ca_w)) - MCFG_TPI6525_OUT_CB_CB(WRITELINE(*this, p500_state, tpi1_cb_w)) - MCFG_DEVICE_ADD(MOS6525_2_TAG, TPI6525, 0) - MCFG_TPI6525_OUT_PA_CB(WRITE8(*this, cbm2_state, tpi2_pa_w)) - MCFG_TPI6525_OUT_PB_CB(WRITE8(*this, cbm2_state, tpi2_pb_w)) - MCFG_TPI6525_IN_PC_CB(READ8(*this, p500_state, tpi2_pc_r)) - MCFG_TPI6525_OUT_PC_CB(WRITE8(*this, p500_state, tpi2_pc_w)) + + TPI6525(config, m_tpi1, 0); + m_tpi1->out_irq_cb().set(FUNC(p500_state::tpi1_irq_w)); + m_tpi1->in_pa_cb().set(FUNC(cbm2_state::tpi1_pa_r)); + m_tpi1->out_pa_cb().set(FUNC(cbm2_state::tpi1_pa_w)); + m_tpi1->in_pb_cb().set(FUNC(cbm2_state::tpi1_pb_r)); + m_tpi1->out_pa_cb().set(FUNC(cbm2_state::tpi1_pb_w)); + m_tpi1->out_ca_cb().set(FUNC(p500_state::tpi1_ca_w)); + m_tpi1->out_cb_cb().set(FUNC(p500_state::tpi1_cb_w)); + + TPI6525(config, m_tpi2, 0); + m_tpi2->out_pa_cb().set(FUNC(cbm2_state::tpi2_pa_w)); + m_tpi2->out_pb_cb().set(FUNC(cbm2_state::tpi2_pb_w)); + m_tpi2->in_pc_cb().set(FUNC(p500_state::tpi2_pc_r)); + m_tpi2->out_pc_cb().set(FUNC(p500_state::tpi2_pc_w)); + MCFG_DEVICE_ADD(MOS6551A_TAG, MOS6551, 0) MCFG_MOS6551_XTAL(XTAL(1'843'200)) MCFG_MOS6551_IRQ_HANDLER(WRITELINE(MOS6525_1_TAG, tpi6525_device, i4_w)) @@ -2574,17 +2580,20 @@ MACHINE_CONFIG_START(cbm2_state::cbm2lp_ntsc) // devices MCFG_PLS100_ADD(PLA1_TAG) - MCFG_DEVICE_ADD(MOS6525_1_TAG, TPI6525, 0) - MCFG_TPI6525_OUT_IRQ_CB(WRITELINE(*this, cbm2_state, tpi1_irq_w)) - MCFG_TPI6525_IN_PA_CB(READ8(*this, cbm2_state, tpi1_pa_r)) - MCFG_TPI6525_OUT_PA_CB(WRITE8(*this, cbm2_state, tpi1_pa_w)) - MCFG_TPI6525_IN_PA_CB(READ8(*this, cbm2_state, tpi1_pb_r)) - MCFG_TPI6525_OUT_PB_CB(WRITE8(*this, cbm2_state, tpi1_pb_w)) - MCFG_TPI6525_OUT_CA_CB(WRITELINE(*this, cbm2_state, tpi1_ca_w)) - MCFG_DEVICE_ADD(MOS6525_2_TAG, TPI6525, 0) - MCFG_TPI6525_OUT_PA_CB(WRITE8(*this, cbm2_state, tpi2_pa_w)) - MCFG_TPI6525_OUT_PB_CB(WRITE8(*this, cbm2_state, tpi2_pb_w)) - MCFG_TPI6525_IN_PC_CB(READ8(*this, cbm2_state, tpi2_pc_r)) + + TPI6525(config, m_tpi1, 0); + m_tpi1->out_irq_cb().set(FUNC(cbm2_state::tpi1_irq_w)); + m_tpi1->in_pa_cb().set(FUNC(cbm2_state::tpi1_pa_r)); + m_tpi1->out_pa_cb().set(FUNC(cbm2_state::tpi1_pa_w)); + m_tpi1->in_pb_cb().set(FUNC(cbm2_state::tpi1_pb_r)); + m_tpi1->out_pb_cb().set(FUNC(cbm2_state::tpi1_pb_w)); + m_tpi1->out_ca_cb().set(FUNC(cbm2_state::tpi1_ca_w)); + + TPI6525(config, m_tpi2, 0); + m_tpi2->out_pa_cb().set(FUNC(cbm2_state::tpi2_pa_w)); + m_tpi2->out_pb_cb().set(FUNC(cbm2_state::tpi2_pb_w)); + m_tpi2->in_pc_cb().set(FUNC(cbm2_state::tpi2_pc_r)); + MCFG_DEVICE_ADD(MOS6551A_TAG, MOS6551, 0) MCFG_MOS6551_XTAL(XTAL(1'843'200)) MCFG_MOS6551_IRQ_HANDLER(WRITELINE(MOS6525_1_TAG, tpi6525_device, i4_w)) @@ -2703,8 +2712,7 @@ MACHINE_CONFIG_END MACHINE_CONFIG_START(cbm2_state::cbm2hp_ntsc) cbm2lp_ntsc(config); - MCFG_DEVICE_MODIFY(MOS6525_2_TAG) - MCFG_TPI6525_IN_PC_CB(READ8(*this, cbm2hp_state, tpi2_pc_r)) + m_tpi2->in_pc_cb().set(FUNC(cbm2hp_state::tpi2_pc_r)); MACHINE_CONFIG_END @@ -2744,11 +2752,11 @@ MACHINE_CONFIG_START(cbm2hp_state::bx256hp) MCFG_DEVICE_ADD(EXT_I8259A_TAG, PIC8259, 0) MCFG_PIC8259_OUT_INT_CB(INPUTLINE(EXT_I8088_TAG, INPUT_LINE_IRQ0)) - MCFG_DEVICE_ADD(EXT_MOS6525_TAG, TPI6525, 0) - MCFG_TPI6525_IN_PA_CB(READ8(EXT_MOS6526_TAG, mos6526_device, pa_r)) - MCFG_TPI6525_IN_PB_CB(READ8(*this, cbm2_state, ext_tpi_pb_r)) - MCFG_TPI6525_OUT_PB_CB(WRITE8(*this, cbm2_state, ext_tpi_pb_w)) - MCFG_TPI6525_OUT_PC_CB(WRITE8(*this, cbm2_state, ext_tpi_pc_w)) + TPI6525(config, m_ext_tpi, 0); + m_ext_tpi->in_pa_cb().set(EXT_MOS6526_TAG, FUNC(mos6526_device::pa_r)); + m_ext_tpi->in_pb_cb().set(FUNC(cbm2_state::ext_tpi_pb_r)); + m_ext_tpi->out_pb_cb().set(FUNC(cbm2_state::ext_tpi_pb_w)); + m_ext_tpi->out_pc_cb().set(FUNC(cbm2_state::ext_tpi_pc_w)); MCFG_DEVICE_ADD(EXT_MOS6526_TAG, MOS6526, XTAL(18'000'000)/9) MCFG_MOS6526_TOD(60) @@ -2770,8 +2778,7 @@ MACHINE_CONFIG_START(cbm2_state::cbm2hp_pal) MCFG_MACHINE_START_OVERRIDE(cbm2_state, cbm2_pal) // devices - MCFG_DEVICE_MODIFY(MOS6525_2_TAG) - MCFG_TPI6525_IN_PC_CB(READ8(*this, cbm2hp_state, tpi2_pc_r)) + m_tpi2->in_pc_cb().set(FUNC(cbm2hp_state::tpi2_pc_r)); MCFG_DEVICE_MODIFY(MOS6526_TAG) MCFG_MOS6526_TOD(50) @@ -2814,11 +2821,11 @@ MACHINE_CONFIG_START(cbm2hp_state::cbm730) MCFG_DEVICE_ADD(EXT_I8259A_TAG, PIC8259, 0) MCFG_PIC8259_OUT_INT_CB(INPUTLINE(EXT_I8088_TAG, INPUT_LINE_IRQ0)) - MCFG_DEVICE_ADD(EXT_MOS6525_TAG, TPI6525, 0) - MCFG_TPI6525_IN_PA_CB(READ8(EXT_MOS6526_TAG, mos6526_device, pa_r)) - MCFG_TPI6525_IN_PB_CB(READ8(*this, cbm2_state, ext_tpi_pb_r)) - MCFG_TPI6525_OUT_PB_CB(WRITE8(*this, cbm2_state, ext_tpi_pb_w)) - MCFG_TPI6525_OUT_PC_CB(WRITE8(*this, cbm2_state, ext_tpi_pc_w)) + TPI6525(config, m_ext_tpi, 0); + m_ext_tpi->in_pa_cb().set(EXT_MOS6526_TAG, FUNC(mos6526_device::pa_r)); + m_ext_tpi->in_pb_cb().set(FUNC(cbm2_state::ext_tpi_pb_r)); + m_ext_tpi->out_pb_cb().set(FUNC(cbm2_state::ext_tpi_pb_w)); + m_ext_tpi->out_pc_cb().set(FUNC(cbm2_state::ext_tpi_pc_w)); MCFG_DEVICE_ADD(EXT_MOS6526_TAG, MOS6526, XTAL(18'000'000)/9) MCFG_MOS6526_TOD(50) diff --git a/src/mame/drivers/cbuster.cpp b/src/mame/drivers/cbuster.cpp index 65619763907..01c5feda7bd 100644 --- a/src/mame/drivers/cbuster.cpp +++ b/src/mame/drivers/cbuster.cpp @@ -161,8 +161,6 @@ void cbuster_state::sound_map(address_map &map) map(0x130000, 0x130001).rw("oki2", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); map(0x140000, 0x140001).r(m_soundlatch, FUNC(generic_latch_8_device::read)); map(0x1f0000, 0x1f1fff).ram(); - map(0x1fec00, 0x1fec01).rw(m_audiocpu, FUNC(h6280_device::timer_r), FUNC(h6280_device::timer_w)).mirror(0x3fe); - map(0x1ff400, 0x1ff403).rw(m_audiocpu, FUNC(h6280_device::irq_status_r), FUNC(h6280_device::irq_status_w)).mirror(0x3fc); } /******************************************************************************/ @@ -308,8 +306,9 @@ MACHINE_CONFIG_START(cbuster_state::twocrude) MCFG_DEVICE_PROGRAM_MAP(twocrude_map) MCFG_DEVICE_VBLANK_INT_DRIVER("screen", cbuster_state, irq4_line_assert)/* VBL */ - MCFG_DEVICE_ADD("audiocpu", H6280, XTAL(24'000'000)/4) /* Custom chip 45, 6MHz Verified */ - MCFG_DEVICE_PROGRAM_MAP(sound_map) + H6280(config, m_audiocpu, XTAL(24'000'000)/4); /* Custom chip 45, 6MHz Verified */ + m_audiocpu->set_addrmap(AS_PROGRAM, &cbuster_state::sound_map); + m_audiocpu->add_route(ALL_OUTPUTS, "mono", 0); // internal sound unused MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58) diff --git a/src/mame/drivers/ccs300.cpp b/src/mame/drivers/ccs300.cpp index 170f211315c..3a1366331f9 100644 --- a/src/mame/drivers/ccs300.cpp +++ b/src/mame/drivers/ccs300.cpp @@ -105,13 +105,12 @@ void ccs300_state::init_ccs300() membank("bankw0")->configure_entry(0, &main[0x0000]); } -// bit 7 needs to be stripped off, we do this by choosing 7 bits and even parity static DEVICE_INPUT_DEFAULTS_START( terminal ) DEVICE_INPUT_DEFAULTS( "RS232_RXBAUD", 0xff, RS232_BAUD_9600 ) DEVICE_INPUT_DEFAULTS( "RS232_TXBAUD", 0xff, RS232_BAUD_9600 ) DEVICE_INPUT_DEFAULTS( "RS232_STARTBITS", 0xff, RS232_STARTBITS_1 ) DEVICE_INPUT_DEFAULTS( "RS232_DATABITS", 0xff, RS232_DATABITS_7 ) - DEVICE_INPUT_DEFAULTS( "RS232_PARITY", 0xff, RS232_PARITY_EVEN ) + DEVICE_INPUT_DEFAULTS( "RS232_PARITY", 0xff, RS232_PARITY_NONE ) DEVICE_INPUT_DEFAULTS( "RS232_STOPBITS", 0xff, RS232_STOPBITS_2 ) DEVICE_INPUT_DEFAULTS_END diff --git a/src/mame/drivers/cdc721.cpp b/src/mame/drivers/cdc721.cpp index 8095ba851c1..ee1fbb12eed 100644 --- a/src/mame/drivers/cdc721.cpp +++ b/src/mame/drivers/cdc721.cpp @@ -431,6 +431,11 @@ ROM_START( cdc721 ) ROM_REGION( 0x2000, "chargen", 0 ) ROM_LOAD( "66315039", 0x0000, 0x1000, CRC(5c9aa968) SHA1(3ec7c5f25562579e6ed3fda7562428ff5e6b9550) ) ROM_LOAD( "66307828", 0x1000, 0x1000, CRC(ac97136f) SHA1(0d280e1aa4b9502bd390d260f83af19bf24905cd) ) // foreign character ROM + + // Graphics Firmware pack + ROM_REGION( 0x4000, "gfxfw", 0 ) // load at 0x8000 + ROM_LOAD( "66315369.bin", 0x0000, 0x2000, CRC(224d3368) SHA1(e335ef6cd56d77194235f5a2a7cf2af9ebf42342) ) + ROM_LOAD( "66315370.bin", 0x2000, 0x2000, CRC(2543bf32) SHA1(1ac73a0e475d9fd86fba054e1a7a443d5bad1987) ) ROM_END COMP( 1981, cdc721, 0, 0, cdc721, cdc721, cdc721_state, empty_init, "Control Data Corporation", "721 Display Terminal", MACHINE_NOT_WORKING | MACHINE_NO_SOUND_HW ) diff --git a/src/mame/drivers/cedar_magnet.cpp b/src/mame/drivers/cedar_magnet.cpp index 7223111e9f4..f2b6f81a13f 100644 --- a/src/mame/drivers/cedar_magnet.cpp +++ b/src/mame/drivers/cedar_magnet.cpp @@ -4,7 +4,7 @@ /* todo: - - fix sound emulation + - fix sound emulation (speed needs verifying + sample playback) - fix sprite communication / banking * bit "output bit 0x02 %d (IC21)" at 0x42 might be important * mag_exzi currently requires a gross hack to stop the sprite CPU crashing on startup @@ -25,8 +25,9 @@ - layer enables on War Mission? (transitions from title screen etc.) notes: - - 2 player mode can be enabled in service mode for War Mission, it is disabled by default - (settings are stored on the disk) + - high scores will be defaulted if the data in the table is corrupt, the games give no + option to do this otherwise. A backup copy of the score table is kept, so you also + have to enter and exit service mode. */ @@ -865,16 +866,54 @@ ROM_START( mag_xain ) ROM_LOAD( "xain.img", 0x00000, 0xf0000, CRC(5647849f) SHA1(edd2f3f6359424583bf526bf4601476dc849e617) ) ROM_END + +/* + Data after 0xd56b0 would not read consistently, however the game only appears to use the first 24 tracks (up to 0x48fff) + as it loads once on startup, not during gameplay, and all tracks before that gave consistent reads. There is data after this + point but it is likely leftovers from another game / whatever was on the disk before, so for our purposes this should be fine. + + Some bullets do seem to spawn from locations where there are no enemies, but I think this is just annoying game design. +*/ ROM_START( mag_war ) BIOS_ROM - /* Data after 0xd56b0 would not read consistently, however the game only appears to use the first 24 tracks (up to 0x48fff) - as it loads once on startup, not during gameplay, and all tracks before that gave consistent reads. There is data after this - point but it is likely leftovers from another game / whatever was on the disk before, so for our purposes this should be fine. - Some bullets do seem to spawn from locations where there are no enemies, but I think this is just annoying game design. - */ ROM_REGION( 0x100000, "flop:disk", ROMREGION_ERASE00 ) - ROM_LOAD( "war mission wm 4_6_87.img", 0x00000, 0xf0000, CRC(e6b35710) SHA1(e24f9adde09e4eacbfb58e359a2df263748fc7de) ) + ROM_LOAD( "war mission wm 4_6_87.img", 0x00000, 0xf0000, CRC(7c813520) SHA1(2ba5999709a52302aa367fb46199b331421a0d56) ) +ROM_END + +/* + Data read 100% consistently with multiple drives +*/ +ROM_START( mag_wara ) + BIOS_ROM + + ROM_REGION( 0x100000, "flop:disk", ROMREGION_ERASE00 ) + ROM_LOAD( "war mission wm 9_4_87.img", 0x00000, 0xf0000, CRC(6296ea6f) SHA1(c0aaf51362bfa3362ef39c3fb1e1c848b73fd780) ) +ROM_END + +/* + Data read 100% consistently with multiple drives +*/ +ROM_START( mag_burn ) + BIOS_ROM + + ROM_REGION( 0x100000, "flop:disk", ROMREGION_ERASE00 ) // + ROM_LOAD( "theburningcavern 31_3_87.img", 0x00000, 0xf0000, CRC(c95911f8) SHA1(eda3bdbbcc3e00a7da83253209e832855c2968b1) ) +ROM_END + +/* + Data read 100% consistently with non-original drive (usually gives worse results) + later tracks showed differences with original drive on each read (around 0xeef80 onwards, doesn't seem to be game data) + + weirdly there's was a single byte in an earlier track that read consistently, but in a different way for each drive + 0x2480e: 9d (non-original) vs 1d (original drive) + 1d seems to be correct as the same data is also elsewhere on the disc +*/ +ROM_START( mag_day ) + BIOS_ROM + + ROM_REGION( 0x100000, "flop:disk", ROMREGION_ERASE00 ) + ROM_LOAD( "adayinspace 31_3_87.img", 0x00000, 0xf0000, CRC(bc65302d) SHA1(6ace68a0b5f7a07a8f5c318c5359011074e7f2ec) ) ROM_END /* @@ -934,7 +973,14 @@ void cedar_magnet_state::kludge_protection() GAME( 1987, cedmag, 0, cedar_magnet, cedar_magnet, cedar_magnet_state, empty_init, ROT0, "EFO SA / Cedar", "Magnet System", MACHINE_IS_BIOS_ROOT ) GAME( 1987, mag_time, cedmag, cedar_magnet, cedar_magnet, cedar_magnet_state, empty_init, ROT90, "EFO SA / Cedar", "Time Scanner (TS 2.0, Magnet System)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // original game was by Sega + GAME( 1987, mag_exzi, cedmag, cedar_magnet, cedar_magnet, cedar_magnet_state, empty_init, ROT0, "EFO SA / Cedar", "Exzisus (EX 1.0, Magnet System)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // original game was by Taito + GAME( 1987, mag_xain, cedmag, cedar_magnet, cedar_magnet, cedar_magnet_state, empty_init, ROT0, "EFO SA / Cedar", "Xain'd Sleena (SC 3.0, Magnet System)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // original game was by Technos -GAME( 1987, mag_war, cedmag, cedar_magnet, cedar_magnet, cedar_magnet_state, empty_init, ROT90, "EFO SA / Cedar", "War Mission (WM 4/6/87)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) +GAME( 1987, mag_war, cedmag, cedar_magnet, cedar_magnet, cedar_magnet_state, empty_init, ROT90, "EFO SA / Cedar", "War Mission (WM 04/06/87)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // date in program +GAME( 1987, mag_wara, mag_war,cedar_magnet, cedar_magnet, cedar_magnet_state, empty_init, ROT90, "EFO SA / Cedar", "War Mission (WM 09/04/87)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // the '9' was handwritten over a printed letter on disk label, date not in program + +GAME( 1987, mag_burn, cedmag, cedar_magnet, cedar_magnet, cedar_magnet_state, empty_init, ROT0, "EFO SA / Cedar", "The Burning Cavern (31/03/87)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // date on label + +GAME( 1987, mag_day, cedmag, cedar_magnet, cedar_magnet, cedar_magnet_state, empty_init, ROT90, "EFO SA / Cedar", "A Day In Space (31/03/87)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // date on label diff --git a/src/mame/drivers/chexx.cpp b/src/mame/drivers/chexx.cpp index 091b2e6b44a..e263087927f 100644 --- a/src/mame/drivers/chexx.cpp +++ b/src/mame/drivers/chexx.cpp @@ -36,16 +36,15 @@ public: , m_maincpu(*this, "maincpu") , m_via(*this, "via6522") , m_digitalker(*this, "digitalker") - , m_aysnd(*this, "aysnd") , m_digits(*this, "digit%u", 0U) , m_leds(*this, "led%u", 0U) , m_lamps(*this, "lamp%u", 0U) + , m_dsw(*this, "DSW") + , m_input(*this, "INPUT") + , m_coin(*this, "COIN") { } - // callbacks - TIMER_DEVICE_CALLBACK_MEMBER(update); - // handlers DECLARE_READ8_MEMBER(via_a_in); DECLARE_READ8_MEMBER(via_b_in); @@ -60,21 +59,20 @@ public: DECLARE_READ8_MEMBER(input_r); - DECLARE_WRITE8_MEMBER(ay_w); DECLARE_WRITE8_MEMBER(lamp_w); - void faceoffh(machine_config &config); - void chexx83(machine_config &config); - void chexx83_map(address_map &map); - void faceoffh_map(address_map &map); + void chexx(machine_config &config); + void mem(address_map &map); -private: - // vars - uint8_t m_port_a, m_port_b; - uint8_t m_bank; - uint32_t m_shift; - uint8_t m_lamp; - uint8_t m_ay_cmd, m_ay_data; +protected: + enum + { + TIMER_UPDATE + }; + + void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; + + void update(); // digitalker void digitalker_set_bank(uint8_t bank); @@ -87,10 +85,42 @@ private: required_device<cpu_device> m_maincpu; required_device<via6522_device> m_via; required_device<digitalker_device> m_digitalker; - optional_device<ay8910_device> m_aysnd; // only faceoffh output_finder<4> m_digits; output_finder<3> m_leds; output_finder<2> m_lamps; + + required_ioport m_dsw; + required_ioport m_input; + required_ioport m_coin; + + // vars + emu_timer *m_update_timer; + uint8_t m_port_a; + uint8_t m_port_b; + uint8_t m_bank; + uint32_t m_shift; + uint8_t m_lamp; +}; + +class faceoffh_state : public chexx_state +{ +public: + faceoffh_state(const machine_config &mconfig, device_type type, const char *tag) + : chexx_state(mconfig, type, tag) + , m_aysnd(*this, "aysnd") + { + } + + void faceoffh(machine_config &config); + +protected: + DECLARE_WRITE8_MEMBER(ay_w); + + void mem(address_map &map); + + required_device<ay8910_device> m_aysnd; // only faceoffh + uint8_t m_ay_cmd; + uint8_t m_ay_data; }; @@ -102,6 +132,7 @@ READ8_MEMBER(chexx_state::via_a_in) logerror("%s: VIA read A: %02X\n", machine().describe_context(), ret); return ret; } + READ8_MEMBER(chexx_state::via_b_in) { uint8_t ret = 0; @@ -112,11 +143,10 @@ READ8_MEMBER(chexx_state::via_b_in) WRITE8_MEMBER(chexx_state::via_a_out) { m_port_a = data; // multiplexer - m_digitalker->digitalker_data_w(space, 0, data, 0); - // logerror("%s: VIA write A = %02X\n", machine().describe_context(), data); } + WRITE8_MEMBER(chexx_state::via_b_out) { m_port_b = data; @@ -138,10 +168,12 @@ WRITE_LINE_MEMBER(chexx_state::via_ca2_out) // logerror("%s: VIA write CA2 = %02X\n", machine().describe_context(), state); } + WRITE_LINE_MEMBER(chexx_state::via_cb1_out) { // logerror("%s: VIA write CB1 = %02X\n", machine().describe_context(), state); } + WRITE_LINE_MEMBER(chexx_state::via_cb2_out) { m_shift = ((m_shift << 1) & 0xffffff) | state; @@ -161,6 +193,7 @@ WRITE_LINE_MEMBER(chexx_state::via_cb2_out) // logerror("%s: VIA write CB2 = %02X\n", machine().describe_context(), state); } + WRITE_LINE_MEMBER(chexx_state::via_irq_out) { m_maincpu->set_input_line(INPUT_LINE_IRQ0, state ? ASSERT_LINE : CLEAR_LINE); @@ -169,11 +202,11 @@ WRITE_LINE_MEMBER(chexx_state::via_irq_out) READ8_MEMBER(chexx_state::input_r) { - uint8_t ret = ioport("DSW")->read(); // bits 0-3 - uint8_t inp = ioport("INPUT")->read(); // bit 7 (multiplexed) + uint8_t ret = m_dsw->read(); // bits 0-3 + uint8_t inp = m_input->read(); // bit 7 (multiplexed) for (int i = 0; i < 8; ++i) - if ( ((~m_port_a) & (1 << i)) && ((~inp) & (1 << i)) ) + if (BIT(~m_port_a, i) && BIT(~inp, i)) ret &= 0x7f; return ret; @@ -181,7 +214,7 @@ READ8_MEMBER(chexx_state::input_r) // Chexx Memory Map -void chexx_state::chexx83_map(address_map &map) +void chexx_state::mem(address_map &map) { map(0x0000, 0x007f).ram().mirror(0x100); // 6810 - 128 x 8 static RAM map(0x4000, 0x400f).rw(m_via, FUNC(via6522_device::read), FUNC(via6522_device::write)); @@ -189,7 +222,15 @@ void chexx_state::chexx83_map(address_map &map) map(0xf800, 0xffff).rom().region("maincpu", 0); } -// Face-Off Memory Map +void chexx_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) +{ + switch (id) + { + case TIMER_UPDATE: + update(); + break; + } +} WRITE8_MEMBER(chexx_state::lamp_w) { @@ -198,7 +239,19 @@ WRITE8_MEMBER(chexx_state::lamp_w) m_lamps[1] = BIT(m_lamp,1); } -WRITE8_MEMBER(chexx_state::ay_w) +// Face-Off Memory Map + +void faceoffh_state::mem(address_map &map) +{ + map(0x0000, 0x007f).ram().mirror(0x100); // M58725P - 2KB + map(0x4000, 0x400f).rw(m_via, FUNC(via6522_device::read), FUNC(via6522_device::write)); + map(0x8000, 0x8000).r(FUNC(faceoffh_state::input_r)); + map(0xa000, 0xa001).w(FUNC(faceoffh_state::ay_w)); + map(0xc000, 0xc000).w(FUNC(faceoffh_state::lamp_w)); + map(0xf000, 0xffff).rom().region("maincpu", 0); +} + +WRITE8_MEMBER(faceoffh_state::ay_w) { if (offset) { @@ -219,16 +272,6 @@ WRITE8_MEMBER(chexx_state::ay_w) m_ay_cmd = data; } -void chexx_state::faceoffh_map(address_map &map) -{ - map(0x0000, 0x007f).ram().mirror(0x100); // M58725P - 2KB - map(0x4000, 0x400f).rw(m_via, FUNC(via6522_device::read), FUNC(via6522_device::write)); - map(0x8000, 0x8000).r(FUNC(chexx_state::input_r)); - map(0xa000, 0xa001).w(FUNC(chexx_state::ay_w)); - map(0xc000, 0xc000).w(FUNC(chexx_state::lamp_w)); - map(0xf000, 0xffff).rom().region("maincpu", 0); -} - // Inputs static INPUT_PORTS_START( chexx83 ) @@ -268,6 +311,8 @@ void chexx_state::machine_start() m_digits.resolve(); m_leds.resolve(); m_lamps.resolve(); + + m_update_timer = timer_alloc(TIMER_UPDATE); } void chexx_state::digitalker_set_bank(uint8_t bank) @@ -287,12 +332,13 @@ void chexx_state::machine_reset() { m_bank = -1; digitalker_set_bank(0); + m_update_timer->adjust(attotime::from_hz(60), 0, attotime::from_hz(60)); } -TIMER_DEVICE_CALLBACK_MEMBER(chexx_state::update) +void chexx_state::update() { // NMI on coin-in - uint8_t coin = (~ioport("COIN")->read()) & 0x03; + uint8_t coin = (~m_coin->read()) & 0x03; m_maincpu->set_input_line(INPUT_LINE_NMI, coin ? ASSERT_LINE : CLEAR_LINE); // VIA CA1 connected to Digitalker INTR line @@ -329,44 +375,42 @@ TIMER_DEVICE_CALLBACK_MEMBER(chexx_state::update) #endif } -MACHINE_CONFIG_START(chexx_state::chexx83) - - // basic machine hardware - MCFG_DEVICE_ADD("maincpu", M6502, MAIN_CLOCK/2) - MCFG_DEVICE_PROGRAM_MAP(chexx83_map) - MCFG_TIMER_DRIVER_ADD_PERIODIC("update", chexx_state, update, attotime::from_hz(60)) +void chexx_state::chexx(machine_config &config) +{ + M6502(config, m_maincpu, MAIN_CLOCK/2); + m_maincpu->set_addrmap(AS_PROGRAM, &chexx_state::mem); // via - MCFG_DEVICE_ADD("via6522", VIA6522, MAIN_CLOCK/4) + VIA6522(config, m_via, MAIN_CLOCK/4); - MCFG_VIA6522_READPA_HANDLER(READ8(*this, chexx_state, via_a_in)) - MCFG_VIA6522_READPB_HANDLER(READ8(*this, chexx_state, via_b_in)) + m_via->readpa_handler().set(FUNC(chexx_state::via_a_in)); + m_via->readpb_handler().set(FUNC(chexx_state::via_b_in)); - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, chexx_state, via_a_out)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, chexx_state, via_b_out)) + m_via->writepa_handler().set(FUNC(chexx_state::via_a_out)); + m_via->writepb_handler().set(FUNC(chexx_state::via_b_out)); - MCFG_VIA6522_CA2_HANDLER(WRITELINE(*this, chexx_state, via_ca2_out)) - MCFG_VIA6522_CB1_HANDLER(WRITELINE(*this, chexx_state, via_cb1_out)) - MCFG_VIA6522_CB2_HANDLER(WRITELINE(*this, chexx_state, via_cb2_out)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, chexx_state, via_irq_out)) + m_via->ca2_handler().set(FUNC(chexx_state::via_ca2_out)); + m_via->cb1_handler().set(FUNC(chexx_state::via_cb1_out)); + m_via->cb2_handler().set(FUNC(chexx_state::via_cb2_out)); + m_via->irq_handler().set(FUNC(chexx_state::via_irq_out)); // Layout config.set_default_layout(layout_chexx); // sound hardware SPEAKER(config, "mono").front_center(); - MCFG_DIGITALKER_ADD("digitalker", MAIN_CLOCK) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.16) -MACHINE_CONFIG_END + DIGITALKER(config, m_digitalker, MAIN_CLOCK); + m_digitalker->add_route(ALL_OUTPUTS, "mono", 0.16); +} -MACHINE_CONFIG_START(chexx_state::faceoffh) - chexx83(config); - MCFG_DEVICE_MODIFY("maincpu") - MCFG_DEVICE_PROGRAM_MAP(faceoffh_map) +void faceoffh_state::faceoffh(machine_config &config) +{ + chexx(config); + m_maincpu->set_addrmap(AS_PROGRAM, &faceoffh_state::mem); - MCFG_DEVICE_ADD("aysnd", AY8910, MAIN_CLOCK/2) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30) -MACHINE_CONFIG_END + AY8910(config, m_aysnd, MAIN_CLOCK/2); + m_aysnd->add_route(ALL_OUTPUTS, "mono", 0.30); +} // ROMs @@ -437,5 +481,5 @@ ROM_START( faceoffh ) ROM_FILL( 0xe000, 0x2000, 0xff ) // unpopulated ROM_END -GAME( 1983, chexx83, 0, chexx83, chexx83, chexx_state, empty_init, ROT270, "ICE", "Chexx (EM Bubble Hockey, 1983 1.1)", MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_NO_SOUND ) -GAME( 1983, faceoffh, chexx83, faceoffh, chexx83, chexx_state, empty_init, ROT270, "SoftLogic (Entertainment Enterprises, Ltd. license)", "Face-Off (EM Bubble Hockey)", MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_IMPERFECT_SOUND ) +GAME( 1983, chexx83, 0, chexx, chexx83, chexx_state, empty_init, ROT270, "ICE", "Chexx (EM Bubble Hockey, 1983 1.1)", MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_NO_SOUND ) +GAME( 1983, faceoffh, chexx83, faceoffh, chexx83, faceoffh_state, empty_init, ROT270, "SoftLogic (Entertainment Enterprises, Ltd. license)", "Face-Off (EM Bubble Hockey)", MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_IMPERFECT_SOUND ) diff --git a/src/mame/drivers/circus.cpp b/src/mame/drivers/circus.cpp index d28aaaeab5b..6f0d7eb959d 100644 --- a/src/mame/drivers/circus.cpp +++ b/src/mame/drivers/circus.cpp @@ -513,6 +513,21 @@ ROM_START( crash ) ROM_LOAD( "crash.d14", 0x0000, 0x0200, CRC(833f81e4) SHA1(78a0ace3510546691ecaf6f6275cb3269495edc9) ) ROM_END +// colours: the playfield is cyan. The entire centre box (and contents) is pale green +// see http://forum.arcadecontrols.com/index.php/topic,146323.msg1526542.html +ROM_START( crasha ) + ROM_REGION( 0x10000, "maincpu", 0 ) // code + ROM_LOAD( "nsa7.a7", 0x1000, 0x0800, CRC(2e47c5ee) SHA1(4712ec3080ce3797420266d6efb26e7d146a965a) ) + ROM_LOAD( "nsa3.a4", 0x1800, 0x0800, CRC(11c8c461) SHA1(197b903ad7626a4055530c8c9c99299ffd94cd37) ) + ROM_RELOAD( 0xf800, 0x0800 ) /* for the reset and interrupt vectors */ + + ROM_REGION( 0x0800, "gfx1", 0 ) // character set + ROM_LOAD( "nsc2.c2", 0x0000, 0x0800, CRC(a16cd133) SHA1(a3ec34b7f9e58948b2ce45261f05071e2ef7427f) ) + + ROM_REGION( 0x0200, "gfx2", 0 ) // car sprite + ROM_LOAD( "sd14.d14", 0x0000, 0x0200, CRC(833f81e4) SHA1(78a0ace3510546691ecaf6f6275cb3269495edc9) ) +ROM_END + ROM_START( smash ) ROM_REGION( 0x10000, "maincpu", 0 ) // code ROM_LOAD( "smash.a1", 0x1000, 0x0200, CRC(b9571203) SHA1(1299e476598d07a67aa1640f3320de1198280296) ) @@ -581,5 +596,6 @@ GAMEL( 1977, circus, 0, circus, circus, circus_state, init_circus, GAMEL( 1977, springbd, circus, circus, circus, circus_state, init_circus, ROT0, "bootleg (Sub-Electro)", "Springboard (bootleg of Circus)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND, layout_circus ) // looks like a text hack, but we've seen 2 identical copies so it's worth supporting GAME( 1977, robotbwl, 0, robotbwl, robotbwl, circus_state, init_robotbwl, ROT0, "Exidy", "Robot Bowl", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) GAMEL( 1979, crash, 0, crash, crash, circus_state, init_crash, ROT0, "Exidy", "Crash", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND, layout_crash ) +GAMEL( 1979, crasha, crash, crash, crash, circus_state, init_crash, ROT0, "Exidy", "Crash (Alt)", MACHINE_IMPERFECT_COLORS | MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND, layout_crash ) GAMEL( 1979, smash, crash, crash, crash, circus_state, init_crash, ROT0, "bootleg", "Smash (Crash bootleg)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND, layout_crash ) // looks like a text hack, but it also had a different bezel GAME( 1979, ripcord, 0, ripcord, ripcord, circus_state, init_ripcord, ROT0, "Exidy", "Rip Cord", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) diff --git a/src/mame/drivers/cninja.cpp b/src/mame/drivers/cninja.cpp index 1384308e5f1..d6ceb9b728a 100644 --- a/src/mame/drivers/cninja.cpp +++ b/src/mame/drivers/cninja.cpp @@ -315,8 +315,6 @@ void cninja_state::sound_map(address_map &map) map(0x130000, 0x130001).rw(m_oki2, FUNC(okim6295_device::read), FUNC(okim6295_device::write)); map(0x140000, 0x140000).r(m_ioprot, FUNC(deco_146_base_device::soundlatch_r)); map(0x1f0000, 0x1f1fff).ram(); - map(0x1fec00, 0x1fec01).rw("audiocpu", FUNC(h6280_device::timer_r), FUNC(h6280_device::timer_w)).mirror(0x3fe); - map(0x1ff400, 0x1ff403).rw("audiocpu", FUNC(h6280_device::irq_status_r), FUNC(h6280_device::irq_status_w)).mirror(0x3fc); } void cninja_state::sound_map_mutantf(address_map &map) @@ -328,8 +326,6 @@ void cninja_state::sound_map_mutantf(address_map &map) map(0x130000, 0x130001).rw(m_oki2, FUNC(okim6295_device::read), FUNC(okim6295_device::write)); map(0x140000, 0x140001).r(m_ioprot, FUNC(deco_146_base_device::soundlatch_r)); map(0x1f0000, 0x1f1fff).ram(); - map(0x1fec00, 0x1fec01).rw("audiocpu", FUNC(h6280_device::timer_r), FUNC(h6280_device::timer_w)).mirror(0x3fe); - map(0x1ff400, 0x1ff403).rw("audiocpu", FUNC(h6280_device::irq_status_r), FUNC(h6280_device::irq_status_w)).mirror(0x3fc); } void cninja_state::stoneage_s_map(address_map &map) @@ -801,8 +797,9 @@ MACHINE_CONFIG_START(cninja_state::cninja) MCFG_DEVICE_ADD("maincpu", M68000, XTAL(24'000'000) / 2) MCFG_DEVICE_PROGRAM_MAP(cninja_map) - MCFG_DEVICE_ADD("audiocpu", H6280, XTAL(32'220'000) / 8) - MCFG_DEVICE_PROGRAM_MAP(sound_map) + h6280_device &audiocpu(H6280(config, m_audiocpu, XTAL(32'220'000) / 8)); + audiocpu.set_addrmap(AS_PROGRAM, &cninja_state::sound_map); + audiocpu.add_route(ALL_OUTPUTS, "mono", 0); // internal sound unused MCFG_DECO_IRQ_ADD("irq", "screen") MCFG_DECO_IRQ_RASTER1_IRQ_CB(INPUTLINE("maincpu", 3)) @@ -1061,8 +1058,9 @@ MACHINE_CONFIG_START(cninja_state::edrandy) MCFG_DEVICE_ADD("maincpu", M68000, XTAL(24'000'000) / 2) MCFG_DEVICE_PROGRAM_MAP(edrandy_map) - MCFG_DEVICE_ADD("audiocpu", H6280, XTAL(32'220'000) / 8) - MCFG_DEVICE_PROGRAM_MAP(sound_map) + h6280_device &audiocpu(H6280(config, m_audiocpu, XTAL(32'220'000) / 8)); + audiocpu.set_addrmap(AS_PROGRAM, &cninja_state::sound_map); + audiocpu.add_route(ALL_OUTPUTS, "mono", 0); // internal sound unused MCFG_DECO_IRQ_ADD("irq", "screen") MCFG_DECO_IRQ_RASTER1_IRQ_CB(INPUTLINE("maincpu", 3)) @@ -1148,8 +1146,10 @@ MACHINE_CONFIG_START(cninja_state::robocop2) MCFG_DEVICE_ADD("maincpu", M68000, XTAL(28'000'000) / 2) MCFG_DEVICE_PROGRAM_MAP(robocop2_map) - MCFG_DEVICE_ADD("audiocpu", H6280, XTAL(32'220'000) / 8) - MCFG_DEVICE_PROGRAM_MAP(sound_map) + h6280_device &audiocpu(H6280(config, m_audiocpu, XTAL(32'220'000) / 8)); + audiocpu.set_addrmap(AS_PROGRAM, &cninja_state::sound_map); + audiocpu.add_route(ALL_OUTPUTS, "lspeaker", 0); // internal sound unused + audiocpu.add_route(ALL_OUTPUTS, "rspeaker", 0); MCFG_DECO_IRQ_ADD("irq", "screen") MCFG_DECO_IRQ_RASTER1_IRQ_CB(INPUTLINE("maincpu", 3)) @@ -1246,8 +1246,10 @@ MACHINE_CONFIG_START(cninja_state::mutantf) MCFG_DEVICE_PROGRAM_MAP(mutantf_map) MCFG_DEVICE_VBLANK_INT_DRIVER("screen", cninja_state, irq6_line_hold) - MCFG_DEVICE_ADD("audiocpu", H6280, XTAL(32'220'000) / 8) - MCFG_DEVICE_PROGRAM_MAP(sound_map_mutantf) + h6280_device &audiocpu(H6280(config, m_audiocpu, XTAL(32'220'000) / 8)); + audiocpu.set_addrmap(AS_PROGRAM, &cninja_state::sound_map_mutantf); + audiocpu.add_route(ALL_OUTPUTS, "lspeaker", 0); // internal sound unused + audiocpu.add_route(ALL_OUTPUTS, "rspeaker", 0); /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) diff --git a/src/mame/drivers/cntsteer.cpp b/src/mame/drivers/cntsteer.cpp index f34bf620848..305ffd4bc23 100644 --- a/src/mame/drivers/cntsteer.cpp +++ b/src/mame/drivers/cntsteer.cpp @@ -979,11 +979,9 @@ MACHINE_CONFIG_START(cntsteer_state::zerotrgt) /* basic machine hardware */ MCFG_DEVICE_ADD("maincpu", MC6809E, 2000000) /* ? */ MCFG_DEVICE_PROGRAM_MAP(gekitsui_cpu1_map) - MCFG_DEVICE_VBLANK_INT_DRIVER("screen", cntsteer_state, nmi_line_pulse) /* ? */ MCFG_DEVICE_ADD("subcpu", MC6809E, 2000000) /* ? */ MCFG_DEVICE_PROGRAM_MAP(gekitsui_cpu2_map) - MCFG_DEVICE_VBLANK_INT_DRIVER("screen", cntsteer_state, nmi_line_pulse) /* ? */ MCFG_DEVICE_ADD("audiocpu", M6502, 1500000) /* ? */ MCFG_DEVICE_PROGRAM_MAP(sound_map) @@ -1002,6 +1000,7 @@ MACHINE_CONFIG_START(cntsteer_state::zerotrgt) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) MCFG_SCREEN_UPDATE_DRIVER(cntsteer_state, screen_update_zerotrgt) MCFG_SCREEN_PALETTE("palette") + MCFG_SCREEN_VBLANK_CALLBACK(INPUTLINE("maincpu", INPUT_LINE_NMI)) // ? MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_zerotrgt) MCFG_PALETTE_ADD("palette", 256) diff --git a/src/mame/drivers/compucolor.cpp b/src/mame/drivers/compucolor.cpp index 264048fab80..f1f2d75657d 100644 --- a/src/mame/drivers/compucolor.cpp +++ b/src/mame/drivers/compucolor.cpp @@ -419,11 +419,11 @@ MACHINE_CONFIG_START(compucolor2_state::compucolor2) blink.count_out_cb().set(m_mioc, FUNC(tms5501_device::sens_w)).bit(4); // devices - MCFG_DEVICE_ADD(TMS5501_TAG, TMS5501, XTAL(17'971'200)/9) - MCFG_TMS5501_IRQ_CALLBACK(INPUTLINE(I8080_TAG, I8085_INTR_LINE)) - MCFG_TMS5501_XMT_CALLBACK(WRITELINE(*this, compucolor2_state, xmt_w)) - MCFG_TMS5501_XI_CALLBACK(READ8(*this, compucolor2_state, xi_r)) - MCFG_TMS5501_XO_CALLBACK(WRITE8(*this, compucolor2_state, xo_w)) + TMS5501(config, m_mioc, XTAL(17'971'200)/9); + m_mioc->int_callback().set_inputline(I8080_TAG, I8085_INTR_LINE); + m_mioc->xmt_callback().set(FUNC(compucolor2_state::xmt_w)); + m_mioc->xi_callback().set(FUNC(compucolor2_state::xi_r)); + m_mioc->xo_callback().set(FUNC(compucolor2_state::xo_w)); MCFG_DEVICE_ADD(RS232_TAG, RS232_PORT, default_rs232_devices, nullptr) MCFG_RS232_RXD_HANDLER(WRITELINE(TMS5501_TAG, tms5501_device, rcv_w)) diff --git a/src/mame/drivers/concept.cpp b/src/mame/drivers/concept.cpp index 44ce8d2e8b5..68a168b01d6 100644 --- a/src/mame/drivers/concept.cpp +++ b/src/mame/drivers/concept.cpp @@ -198,10 +198,6 @@ static INPUT_PORTS_START( concept ) INPUT_PORTS_END - -/* init with simple, fixed, B/W palette */ -/* Is the palette black on white or white on black??? */ - void concept_a2_cards(device_slot_interface &device) { device.option_add("fchdd", A2BUS_CORVUS); // Corvus flat-cable HDD interface (see notes in a2corvus.c) @@ -210,56 +206,58 @@ void concept_a2_cards(device_slot_interface &device) } - -MACHINE_CONFIG_START(concept_state::concept) +void concept_state::concept(machine_config &config) +{ /* basic machine hardware */ - MCFG_DEVICE_ADD(m_maincpu, M68000, 8182000) /* 16.364 MHz / 2 */ - MCFG_DEVICE_PROGRAM_MAP(concept_memmap) + M68000(config, m_maincpu, 8182000); /* 16.364 MHz / 2 */ + m_maincpu->set_addrmap(AS_PROGRAM, &concept_state::concept_memmap); - MCFG_QUANTUM_TIME(attotime::from_hz(60)) + config.m_minimum_quantum = attotime::from_hz(60); /* video hardware */ - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK) - MCFG_SCREEN_REFRESH_RATE(60) /* 50 or 60, jumper-selectable */ - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */ - MCFG_SCREEN_SIZE(720, 560) - MCFG_SCREEN_VISIBLE_AREA(0, 720-1, 0, 560-1) - MCFG_SCREEN_UPDATE_DRIVER(concept_state, screen_update_concept) - MCFG_SCREEN_PALETTE("palette") - - MCFG_PALETTE_ADD_MONOCHROME("palette") + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); + screen.set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK); + screen.set_refresh_hz(60); /* 50 or 60, jumper-selectable */ + screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */ + screen.set_size(720, 560); + screen.set_visarea(0, 720-1, 0, 560-1); + screen.set_screen_update(FUNC(concept_state::screen_update)); + screen.set_palette("palette"); + + /* Is the palette black on white or white on black??? */ + palette_device &palette(PALETTE(config, "palette", 2)); + palette.set_init("palette", FUNC(palette_device::palette_init_monochrome)); /* sound */ SPEAKER(config, "mono").front_center(); - MCFG_DEVICE_ADD(SPEAKER_TAG, SPEAKER_SOUND) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00) + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 1.00); /* rtc */ - MCFG_DEVICE_ADD("mm58274c", MM58274C, 0) - MCFG_MM58274C_MODE24(0) // 12 hour - MCFG_MM58274C_DAY1(1) // monday + MM58274C(config, m_mm58274, 0); + m_mm58274->set_mode24(0); // 12 hour + m_mm58274->set_day1(1); // monday /* via */ - MCFG_DEVICE_ADD(m_via0, VIA6522, 1022750) - MCFG_VIA6522_READPA_HANDLER(READ8(*this, concept_state, via_in_a)) - MCFG_VIA6522_READPB_HANDLER(READ8(*this, concept_state, via_in_b)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, concept_state, via_out_a)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, concept_state, via_out_b)) - MCFG_VIA6522_CB2_HANDLER(WRITELINE(*this, concept_state, via_out_cb2)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, concept_state, via_irq_func)) + VIA6522(config, m_via0, 1022750); + m_via0->readpa_handler().set(FUNC(concept_state::via_in_a)); + m_via0->readpb_handler().set(FUNC(concept_state::via_in_b)); + m_via0->writepa_handler().set(FUNC(concept_state::via_out_a)); + m_via0->writepb_handler().set(FUNC(concept_state::via_out_b)); + m_via0->cb2_handler().set(FUNC(concept_state::via_out_cb2)); + m_via0->irq_handler().set(FUNC(concept_state::via_irq_func)); /* ACIAs */ - MCFG_DEVICE_ADD(m_acia0, MOS6551, 0) - MCFG_MOS6551_XTAL(XTAL(1'843'200)) - MCFG_MOS6551_TXD_HANDLER(WRITELINE("rs232a", rs232_port_device, write_txd)) + MOS6551(config, m_acia0, 0); + m_acia0->set_xtal(XTAL(1'843'200)); + m_acia0->txd_handler().set("rs232a", FUNC(rs232_port_device::write_txd)); - MCFG_DEVICE_ADD(m_acia1, MOS6551, 0) - MCFG_MOS6551_XTAL(XTAL(1'843'200)) - MCFG_MOS6551_TXD_HANDLER(WRITELINE("rs232b", rs232_port_device, write_txd)) + MOS6551(config, m_acia1, 0); + m_acia1->set_xtal(XTAL(1'843'200)); + m_acia1->txd_handler().set("rs232b", FUNC(rs232_port_device::write_txd)); - MCFG_DEVICE_ADD(m_kbdacia, MOS6551, 0) - MCFG_MOS6551_XTAL(XTAL(1'843'200)) + MOS6551(config, m_kbdacia, 0); + m_kbdacia->set_xtal(XTAL(1'843'200)); /* Apple II bus */ A2BUS(config, m_a2bus, 0).set_cputag(m_maincpu); @@ -269,18 +267,18 @@ MACHINE_CONFIG_START(concept_state::concept) A2BUS_SLOT(config, "sl4", m_a2bus, concept_a2_cards, "fdc01"); /* 2x RS232 ports */ - MCFG_DEVICE_ADD("rs232a", RS232_PORT, default_rs232_devices, nullptr) - MCFG_RS232_RXD_HANDLER(WRITELINE(ACIA_0_TAG, mos6551_device, write_rxd)) - MCFG_RS232_DCD_HANDLER(WRITELINE(ACIA_0_TAG, mos6551_device, write_dcd)) - MCFG_RS232_DSR_HANDLER(WRITELINE(ACIA_0_TAG, mos6551_device, write_dsr)) - MCFG_RS232_CTS_HANDLER(WRITELINE(ACIA_0_TAG, mos6551_device, write_cts)) - - MCFG_DEVICE_ADD("rs232b", RS232_PORT, default_rs232_devices, nullptr) - MCFG_RS232_RXD_HANDLER(WRITELINE(ACIA_1_TAG, mos6551_device, write_rxd)) - MCFG_RS232_DCD_HANDLER(WRITELINE(ACIA_1_TAG, mos6551_device, write_dcd)) - MCFG_RS232_DSR_HANDLER(WRITELINE(ACIA_1_TAG, mos6551_device, write_dsr)) - MCFG_RS232_CTS_HANDLER(WRITELINE(ACIA_1_TAG, mos6551_device, write_cts)) -MACHINE_CONFIG_END + rs232_port_device &rs232a(RS232_PORT(config, "rs232a", default_rs232_devices, nullptr)); + rs232a.rxd_handler().set(m_acia0, FUNC(mos6551_device::write_rxd)); + rs232a.dcd_handler().set(m_acia0, FUNC(mos6551_device::write_dcd)); + rs232a.dsr_handler().set(m_acia0, FUNC(mos6551_device::write_dsr)); + rs232a.cts_handler().set(m_acia0, FUNC(mos6551_device::write_cts)); + + rs232_port_device &rs232b(RS232_PORT(config, "rs232b", default_rs232_devices, nullptr)); + rs232b.rxd_handler().set(m_acia1, FUNC(mos6551_device::write_rxd)); + rs232b.dcd_handler().set(m_acia1, FUNC(mos6551_device::write_dcd)); + rs232b.dsr_handler().set(m_acia1, FUNC(mos6551_device::write_dsr)); + rs232b.cts_handler().set(m_acia1, FUNC(mos6551_device::write_cts)); +} ROM_START( concept ) diff --git a/src/mame/drivers/cops.cpp b/src/mame/drivers/cops.cpp index ad3a6439eb1..7dcb02ab709 100644 --- a/src/mame/drivers/cops.cpp +++ b/src/mame/drivers/cops.cpp @@ -69,6 +69,7 @@ public: uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); void revlatns(machine_config &config); + void base(machine_config &config); void cops(machine_config &config); void cops_map(address_map &map); void revlatns_map(address_map &map); @@ -918,70 +919,54 @@ void cops_state::init_cops() membank("sysbank1")->set_entry(2); } -MACHINE_CONFIG_START(cops_state::cops) +void cops_state::base(machine_config &config) +{ + M6502(config, m_maincpu, MAIN_CLOCK/2); - /* basic machine hardware */ - MCFG_DEVICE_ADD("maincpu", M6502, MAIN_CLOCK/2) - MCFG_DEVICE_PROGRAM_MAP(cops_map) + SONY_LDP1450(config, m_ld, 9600); + m_ld->set_screen("screen"); - /* video hardware */ - MCFG_LASERDISC_LDP1450_ADD("laserdisc",9600) - MCFG_LASERDISC_SCREEN_ADD_NTSC("screen", "laserdisc") + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); + screen.set_video_attributes(VIDEO_SELF_RENDER); + screen.set_raw(XTAL(14'318'181)*2, 910, 0, 704, 525, 44, 524); + screen.set_screen_update("laserdisc", FUNC(laserdisc_device::screen_update)); /* via */ - MCFG_DEVICE_ADD("via6522_1", VIA6522, MAIN_CLOCK/2) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, cops_state, via1_irq)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, cops_state, via1_b_w)) - MCFG_VIA6522_CB1_HANDLER(WRITE8(*this, cops_state, via1_cb1_w)) - - MCFG_DEVICE_ADD("via6522_2", VIA6522, MAIN_CLOCK/2) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, cops_state, via2_irq)) + via6522_device &via1(VIA6522(config, "via6522_1", MAIN_CLOCK/2)); + via1.irq_handler().set(FUNC(cops_state::via1_irq)); + via1.writepb_handler().set(FUNC(cops_state::via1_b_w)); + via1.cb1_handler().set(FUNC(cops_state::via1_cb1_w)); - MCFG_DEVICE_ADD("via6522_3", VIA6522, MAIN_CLOCK/2) - MCFG_VIA6522_READPA_HANDLER(READ8(*this, cops_state, cdrom_data_r)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, cops_state, cdrom_data_w)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, cops_state, cdrom_ctrl_w)) + SPEAKER(config, "mono").front_center(); /* acia (really a 65C52)*/ - /* sound hardware */ - SPEAKER(config, "mono").front_center(); - /* TODO: Verify clock */ - MCFG_DEVICE_ADD("snsnd", SN76489, MAIN_CLOCK/2) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) - -MACHINE_CONFIG_END - - -MACHINE_CONFIG_START(cops_state::revlatns) - - /* basic machine hardware */ - MCFG_DEVICE_ADD("maincpu", M6502, MAIN_CLOCK/2) - MCFG_DEVICE_PROGRAM_MAP(revlatns_map) - - /* video hardware */ - MCFG_LASERDISC_LDP1450_ADD("laserdisc",9600) - MCFG_LASERDISC_SCREEN_ADD_NTSC("screen", "laserdisc") - - /* via */ - MCFG_DEVICE_ADD("via6522_1", VIA6522, MAIN_CLOCK/2) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, cops_state, via1_irq)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, cops_state, via1_b_w)) - MCFG_VIA6522_CB1_HANDLER(WRITE8(*this, cops_state, via1_cb1_w)) + SN76489(config, m_sn, MAIN_CLOCK/2); + m_sn->add_route(ALL_OUTPUTS, "mono", 0.50); +} - MCFG_DEVICE_ADD("rtc", MSM6242, XTAL(32'768)) +void cops_state::cops(machine_config &config) +{ + base(config); + m_maincpu->set_addrmap(AS_PROGRAM, &cops_state::cops_map); - /* acia (really a 65C52)*/ + via6522_device &via2(VIA6522(config, "via6522_2", MAIN_CLOCK/2)); + via2.irq_handler().set(FUNC(cops_state::via2_irq)); - /* sound hardware */ - SPEAKER(config, "mono").front_center(); + via6522_device &via3(VIA6522(config, "via6522_3", MAIN_CLOCK/2)); + via3.readpa_handler().set(FUNC(cops_state::cdrom_data_r)); + via3.writepa_handler().set(FUNC(cops_state::cdrom_data_w)); + via3.writepb_handler().set(FUNC(cops_state::cdrom_ctrl_w)); +} - /* TODO: Verify clock */ - MCFG_DEVICE_ADD("snsnd", SN76489, MAIN_CLOCK/2) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) +void cops_state::revlatns(machine_config &config) +{ + base(config); + m_maincpu->set_addrmap(AS_PROGRAM, &cops_state::revlatns_map); -MACHINE_CONFIG_END + MSM6242(config, "rtc", XTAL(32'768)); +} /*************************************************************************** diff --git a/src/mame/drivers/cosmic.cpp b/src/mame/drivers/cosmic.cpp index f423b1fac74..f76aff7990e 100644 --- a/src/mame/drivers/cosmic.cpp +++ b/src/mame/drivers/cosmic.cpp @@ -1455,7 +1455,7 @@ ROM_START( magspot2 ) ROM_END ROM_START( devzone ) - ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_REGION( 0x10000, "maincpu", 0 ) /* all 2716 */ ROM_LOAD( "dv1.e3", 0x0000, 0x0800, CRC(c70faf00) SHA1(d3f0f071e6c7552724eba64a7182637dae4438c7) ) ROM_LOAD( "dv2.e4", 0x0800, 0x0800, CRC(eacfed61) SHA1(493c0d21fd1574b12978dd1f52e8735df6c1732c) ) ROM_LOAD( "dv3.e5", 0x1000, 0x0800, CRC(7973317e) SHA1(d236e3dad8c991c32a2550e561518b522a4580bc) ) @@ -1463,21 +1463,21 @@ ROM_START( devzone ) ROM_LOAD( "dv4.e6", 0x2000, 0x0800, CRC(a58c5b8c) SHA1(7ff08007aedd2ff1d7ef64263da92a5b77ae2dc4) ) ROM_LOAD( "dv6.e8", 0x2800, 0x0800, CRC(3930fb67) SHA1(919883e833d6caa8fe7c3ceaa184575a3b4932b6) ) - ROM_REGION( 0x1000, "gfx1", 0 ) /* sprites */ + ROM_REGION( 0x1000, "gfx1", 0 ) /* sprites, all 2716 */ ROM_LOAD( "dv8.n2", 0x0000, 0x0800, CRC(da1cbec1) SHA1(08a668f19c68335f4fc9f98cd53b44047dd8aad9) ) ROM_LOAD( "dv7.n1", 0x0800, 0x0800, CRC(e7562fcf) SHA1(0a0833dbb8d4be69fbf8897aa3e045a87ae42024) ) ROM_REGION( 0x0020, "proms", 0 ) - ROM_LOAD( "ms.d9", 0x0000, 0x0020, CRC(36e2aa2a) SHA1(4813b013cb8260157858e3adc7323efc6654e170) ) + ROM_LOAD( "m13.d9", 0x0000, 0x0020, CRC(36e2aa2a) SHA1(4813b013cb8260157858e3adc7323efc6654e170) ) // 82S123 ROM_REGION( 0x0400, "user1", 0 ) /* color map */ - ROM_LOAD( "dz9.e2", 0x0000, 0x0400, CRC(693855b6) SHA1(1c29d72be511c1d38b30b9534d647d0813b2ef57) ) + ROM_LOAD( "db9.e2", 0x0000, 0x0400, CRC(693855b6) SHA1(1c29d72be511c1d38b30b9534d647d0813b2ef57) ) // 2708 ROM_REGION( 0x0800, "user2", 0 ) /* grid horizontal line positions */ - ROM_LOAD( "ic12.sub", 0x0000, 0x0800, CRC(f61c1c45) SHA1(9016710409ae2bccfc60f8e3d1131c125333c034) ) + ROM_LOAD( "dv9.ic12", 0x0000, 0x0800, CRC(f61c1c45) SHA1(9016710409ae2bccfc60f8e3d1131c125333c034) ) // 2716 ROM_REGION( 0x0020, "user3", 0 ) /* grid vertical line positions */ - ROM_LOAD( "ic1.sub", 0x0000, 0x0020, CRC(df974878) SHA1(2ef2e1b771923f9a0bfe1841444de61200298605) ) + ROM_LOAD( "22.ic1", 0x0000, 0x0020, CRC(df974878) SHA1(2ef2e1b771923f9a0bfe1841444de61200298605) ) // 82S123 ROM_END ROM_START( devzone2 ) diff --git a/src/mame/drivers/cps3.cpp b/src/mame/drivers/cps3.cpp index 5f5ece2d0b9..78b470f1aab 100644 --- a/src/mame/drivers/cps3.cpp +++ b/src/mame/drivers/cps3.cpp @@ -564,26 +564,26 @@ inline void cps3_state::cps3_drawgfxzoom(bitmap_rgb32 &dest_bmp,const rectangle y_index = 0; } - if( sx < myclip.min_x) + if( sx < myclip.left()) { /* clip left */ - int pixels = myclip.min_x-sx; + int pixels = myclip.left()-sx; sx += pixels; x_index_base += pixels*dx; } - if( sy < myclip.min_y ) + if( sy < myclip.top() ) { /* clip top */ - int pixels = myclip.min_y-sy; + int pixels = myclip.top()-sy; sy += pixels; y_index += pixels*dy; } - if( ex > myclip.max_x+1 ) + if( ex > myclip.right()+1 ) { /* clip right */ - int pixels = ex-myclip.max_x-1; + int pixels = ex-myclip.right()-1; ex -= pixels; } - if( ey > myclip.max_y+1 ) + if( ey > myclip.bottom()+1 ) { /* clip bottom */ - int pixels = ey-myclip.max_y-1; + int pixels = ey-myclip.bottom()-1; ey -= pixels; } @@ -985,11 +985,11 @@ void cps3_state::cps3_draw_tilemapsprite_line(int tmnum, int drawline, bitmap_rg drawline&=0x3ff; - if (drawline>cliprect.max_y+4) return; + if (drawline>cliprect.bottom()+4) return; - clip.set(cliprect.min_x, cliprect.max_x, drawline, drawline); + clip.set(cliprect.left(), cliprect.right(), drawline, drawline); - for (x=0;x<(cliprect.max_x/16)+2;x++) + for (x=0;x<(cliprect.right()/16)+2;x++) { uint32_t dat; int tileno; @@ -1057,10 +1057,9 @@ uint32_t cps3_state::screen_update_cps3(screen_device &screen, bitmap_rgb32 &bit fszx = (fullscreenzoomx<<16)/0x40; fszy = (fullscreenzoomy<<16)/0x40; - m_renderbuffer_clip.min_x = 0; - m_renderbuffer_clip.max_x = ((m_screenwidth*fszx)>>16)-1; - m_renderbuffer_clip.min_y = 0; - m_renderbuffer_clip.max_y = ((224*fszx)>>16)-1; + m_renderbuffer_clip.set( + 0, ((m_screenwidth*fszx)>>16)-1, + 0, ((224*fszx)>>16)-1); m_renderbuffer_bitmap.fill(0, m_renderbuffer_clip); diff --git a/src/mame/drivers/d6809.cpp b/src/mame/drivers/d6809.cpp index c0b839ab88b..9dffe813196 100644 --- a/src/mame/drivers/d6809.cpp +++ b/src/mame/drivers/d6809.cpp @@ -2,12 +2,12 @@ // copyright-holders:Robbbert /******************************************************************************* - 6809 Portable +Dunfield 6809 Portable - 12/05/2009 Skeleton driver. - 21/09/2011 connected to terminal, notes added [Robbbert] +2009-05-12 Skeleton driver. +2011-09-21 connected to terminal, notes added [Robbbert] -Chips used: +Chips used (planned?): - 6809E CPU - 6845 CRTC - 6840 CTC @@ -80,11 +80,29 @@ devices. 'maincpu' (FA6E): unmapped program memory read from 00F0 & FF <-- now it gives up & prints an error +Layout of devices differences: + Schematic Actual +6551 1 0000 0000 +6551 2 0100 0004 +Disk status 0400 00F0 +Disk commands 0401 00F0-00F7 +Parallel terminal not there 00FF +CE on UPD765 0400 0200 +TC on UPD765 0500 0300 + +Also, pins 16,17,18 on the UPD765 are incorrect in the schematic. + + +ToDo: +- Need better documentation +- Need a boot disk image + **********************************************************************************/ #include "emu.h" #include "cpu/m6809/m6809.h" #include "machine/mos6551.h" +#include "machine/upd765.h" #include "machine/terminal.h" @@ -95,6 +113,8 @@ public: : driver_device(mconfig, type, tag) , m_maincpu(*this, "maincpu") , m_terminal(*this, "terminal") + , m_fdc(*this, "fdc") + , m_floppy0(*this, "fdc:0") { } void d6809(machine_config &config); @@ -110,6 +130,8 @@ private: virtual void machine_reset() override; required_device<cpu_device> m_maincpu; required_device<generic_terminal_device> m_terminal; + required_device<upd765a_device> m_fdc; + required_device<floppy_connector> m_floppy0; }; READ8_MEMBER( d6809_state::term_r ) @@ -131,7 +153,11 @@ void d6809_state::mem_map(address_map &map) // 00-FF is for various devices. map(0x0000, 0x0003).rw("acia1", FUNC(mos6551_device::read), FUNC(mos6551_device::write)); map(0x0004, 0x0007).rw("acia2", FUNC(mos6551_device::read), FUNC(mos6551_device::write)); + map(0x00f0, 0x00f7).ram(); // for now + //map(0x00f0, 0x00f0).r(m_fdc, FUNC(upd765a_device::msr_r)); map(0x00ff, 0x00ff).rw(FUNC(d6809_state::term_r), FUNC(d6809_state::term_w)); + map(0x0200, 0x0201).mirror(0xfe).m(m_fdc, FUNC(upd765a_device::map)); + map(0x0300, 0x0300).mirror(0xff).lw8("tc", [this](u8 data){ m_fdc->tc_w(1); m_fdc->tc_w(0); } ); map(0x1000, 0xdfff).ram(); map(0xe000, 0xffff).rom().region("roms", 0); } @@ -149,6 +175,16 @@ void d6809_state::kbd_put(u8 data) void d6809_state::machine_reset() { + m_fdc->set_ready_line_connected(1); + m_fdc->set_unscaled_clock(8_MHz_XTAL / 2); // 4MHz for minifloppy + floppy_image_device *floppy = m_floppy0->get_device(); + m_fdc->set_floppy(floppy); + floppy->mon_w(0); +} + +static void floppies(device_slot_interface &device) +{ + device.option_add("525qd", FLOPPY_525_QD); } @@ -163,6 +199,12 @@ MACHINE_CONFIG_START(d6809_state::d6809) /* video hardware */ MCFG_DEVICE_ADD("terminal", GENERIC_TERMINAL, 0) MCFG_GENERIC_TERMINAL_KEYBOARD_CB(PUT(d6809_state, kbd_put)) + + // Floppy + UPD765A(config, m_fdc, true, true); + //m_fdc->drq_wr_callback().set(m_fdc, FUNC(upd765a_device::dack_w)); // pin not emulated + MCFG_FLOPPY_DRIVE_ADD("fdc:0", floppies, "525qd", floppy_image_device::default_floppy_formats) + MCFG_FLOPPY_DRIVE_SOUND(true) MACHINE_CONFIG_END /* ROM definition */ diff --git a/src/mame/drivers/dai.cpp b/src/mame/drivers/dai.cpp index f46b2090c5b..1d004d21717 100644 --- a/src/mame/drivers/dai.cpp +++ b/src/mame/drivers/dai.cpp @@ -232,10 +232,10 @@ MACHINE_CONFIG_START(dai_state::dai) MCFG_CASSETTE_INTERFACE("dai_cass") /* tms5501 */ - MCFG_DEVICE_ADD("tms5501", TMS5501, 2000000) - MCFG_TMS5501_IRQ_CALLBACK(INPUTLINE("maincpu", I8085_INTR_LINE)) - MCFG_TMS5501_XI_CALLBACK(READ8(*this, dai_state, dai_keyboard_r)) - MCFG_TMS5501_XO_CALLBACK(WRITE8(*this, dai_state, dai_keyboard_w)) + TMS5501(config, m_tms5501, 2000000); + m_tms5501->int_callback().set_inputline("maincpu", I8085_INTR_LINE); + m_tms5501->xi_callback().set(FUNC(dai_state::dai_keyboard_r)); + m_tms5501->xo_callback().set(FUNC(dai_state::dai_keyboard_w)); /* internal ram */ MCFG_RAM_ADD(RAM_TAG) diff --git a/src/mame/drivers/darkseal.cpp b/src/mame/drivers/darkseal.cpp index 636785a7103..6eac007f008 100644 --- a/src/mame/drivers/darkseal.cpp +++ b/src/mame/drivers/darkseal.cpp @@ -76,8 +76,6 @@ void darkseal_state::sound_map(address_map &map) map(0x130000, 0x130001).rw("oki2", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); map(0x140000, 0x140001).r(m_soundlatch, FUNC(generic_latch_8_device::read)); map(0x1f0000, 0x1f1fff).ram(); - map(0x1fec00, 0x1fec01).rw(m_audiocpu, FUNC(h6280_device::timer_r), FUNC(h6280_device::timer_w)).mirror(0x3fe); - map(0x1ff400, 0x1ff403).rw(m_audiocpu, FUNC(h6280_device::irq_status_r), FUNC(h6280_device::irq_status_w)).mirror(0x3fc); } /******************************************************************************/ @@ -210,8 +208,9 @@ MACHINE_CONFIG_START(darkseal_state::darkseal) MCFG_DEVICE_PROGRAM_MAP(darkseal_map) MCFG_DEVICE_VBLANK_INT_DRIVER("screen", darkseal_state, irq6_line_assert)/* VBL */ - MCFG_DEVICE_ADD(m_audiocpu, H6280, XTAL(32'220'000)/4) /* Custom chip 45, Audio section crystal is 32.220 MHz */ - MCFG_DEVICE_PROGRAM_MAP(sound_map) + H6280(config, m_audiocpu, XTAL(32'220'000)/4); /* Custom chip 45, Audio section crystal is 32.220 MHz */ + m_audiocpu->set_addrmap(AS_PROGRAM, &darkseal_state::sound_map); + m_audiocpu->add_route(ALL_OUTPUTS, "mono", 0); // internal sound unused /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) @@ -259,7 +258,6 @@ MACHINE_CONFIG_START(darkseal_state::darkseal) MCFG_DECO_SPRITE_GFX_REGION(3) MCFG_DECO_SPRITE_GFXDECODE("gfxdecode") - /* sound hardware */ SPEAKER(config, "mono").front_center(); diff --git a/src/mame/drivers/dassault.cpp b/src/mame/drivers/dassault.cpp index 9d4cbf112e2..4376c02bd5a 100644 --- a/src/mame/drivers/dassault.cpp +++ b/src/mame/drivers/dassault.cpp @@ -330,8 +330,6 @@ void dassault_state::sound_map(address_map &map) map(0x130000, 0x130001).rw(m_oki2, FUNC(okim6295_device::read), FUNC(okim6295_device::write)); map(0x140000, 0x140001).r(m_soundlatch, FUNC(generic_latch_8_device::read)); map(0x1f0000, 0x1f1fff).ram(); - map(0x1fec00, 0x1fec01).rw(m_audiocpu, FUNC(h6280_device::timer_r), FUNC(h6280_device::timer_w)).mirror(0x3fe); - map(0x1ff400, 0x1ff403).rw(m_audiocpu, FUNC(h6280_device::irq_status_r), FUNC(h6280_device::irq_status_w)).mirror(0x3fc); } /**********************************************************************************/ @@ -535,15 +533,17 @@ MACHINE_CONFIG_START(dassault_state::dassault) MCFG_DEVICE_PROGRAM_MAP(dassault_sub_map) MCFG_DEVICE_VBLANK_INT_DRIVER("screen", dassault_state, irq5_line_assert) - MCFG_DEVICE_ADD("audiocpu", H6280, XTAL(32'220'000)/8) /* Accurate */ - MCFG_DEVICE_PROGRAM_MAP(sound_map) + H6280(config, m_audiocpu, XTAL(32'220'000)/8); /* Accurate */ + m_audiocpu->set_addrmap(AS_PROGRAM, &dassault_state::sound_map); + m_audiocpu->add_route(ALL_OUTPUTS, "lspeaker", 0); // internal sound unused + m_audiocpu->add_route(ALL_OUTPUTS, "rspeaker", 0); // MCFG_QUANTUM_TIME(attotime::from_hz(8400)) /* 140 CPU slices per frame */ MCFG_QUANTUM_PERFECT_CPU("maincpu") // I was seeing random lockups.. let's see if this helps - MCFG_DEVICE_ADD("sharedram", MB8421_MB8431_16BIT, 0) - MCFG_MB8421_INTL_HANDLER(INPUTLINE("maincpu", M68K_IRQ_5)) - MCFG_MB8421_INTR_HANDLER(INPUTLINE("sub", M68K_IRQ_6)) + mb8421_mb8431_16_device &sharedram(MB8421_MB8431_16BIT(config, "sharedram")); + sharedram.intl_callback().set_inputline("maincpu", M68K_IRQ_5); + sharedram.intr_callback().set_inputline("sub", M68K_IRQ_6); /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) diff --git a/src/mame/drivers/datum.cpp b/src/mame/drivers/datum.cpp index def02c65eab..7463e718f56 100644 --- a/src/mame/drivers/datum.cpp +++ b/src/mame/drivers/datum.cpp @@ -10,8 +10,7 @@ Described in Electronics Australia magazine in 1982/1983. - The ROM was keyed in by hand from a printout, so is therefore considered a bad dump. - It has routines for adc, dac, cassette, but there's no hardware to support these. -- The basic machine is fully emulated as per the schematic, but still marked not working - until the ROM can be confirmed as ok. +- The basic machine is fully emulated as per the schematic. Memory Map: 0000-007F = RAM inside the cpu @@ -214,4 +213,4 @@ ROM_START( datum ) ROM_END // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -COMP( 1982, datum, 0, 0, datum, datum, datum_state, empty_init, "Gammatron", "Datum", MACHINE_NOT_WORKING | MACHINE_NO_SOUND_HW ) +COMP( 1982, datum, 0, 0, datum, datum, datum_state, empty_init, "Gammatron", "Datum", MACHINE_NO_SOUND_HW ) diff --git a/src/mame/drivers/dbox.cpp b/src/mame/drivers/dbox.cpp index f0d1da02110..87e3ef09b7d 100644 --- a/src/mame/drivers/dbox.cpp +++ b/src/mame/drivers/dbox.cpp @@ -32,10 +32,10 @@ * * History of Nokia Multimedia Division *------------------------------------- - * Luxor AB was a swedish home electronics and computer manufacturer located in Motala from 1923 and aquired + * Luxor AB was a swedish home electronics and computer manufacturer located in Motala from 1923 and acquired * by Nokia 1985. Luxor designed among other things TV setsm Radios and the famous ABC-80. The Nokia Multimedia * Division was formed in Linköping as a result of the Luxor aquesition. Their main design was a satellite - * receiver, the first satellite in Europee was launched in 1988 and market was growing fast however it took + * receiver, the first satellite in Europe was launched in 1988 and the market was growing fast however it took * a long time, almost 10 years before the breakthrough came for Nokia, a deal with the Kirsch Gruppe was struck and * in 1996 the 68340 based Dbox-1 was released in Germany. The original design was expensive, so soon a cost reduced * version based on PPC, the Dbox-2, was released. The boxes sold in millions but the margins were negative or very diff --git a/src/mame/drivers/dccons.cpp b/src/mame/drivers/dccons.cpp index 7735b9f98bc..41997c7fa2c 100644 --- a/src/mame/drivers/dccons.cpp +++ b/src/mame/drivers/dccons.cpp @@ -577,8 +577,8 @@ INPUT_PORTS_END void dc_cons_state::gdrom_config(device_t *device) { device = device->subdevice("cdda"); - MCFG_SOUND_ROUTE(0, "^^lspeaker", 1.0) - MCFG_SOUND_ROUTE(1, "^^rspeaker", 1.0) + MCFG_SOUND_ROUTE(0, "^^aica", 1.0) + MCFG_SOUND_ROUTE(1, "^^aica", 1.0) } MACHINE_CONFIG_START(dc_cons_state::dc) diff --git a/src/mame/drivers/dcon.cpp b/src/mame/drivers/dcon.cpp index 9f99f91d0de..27e1d561ff3 100644 --- a/src/mame/drivers/dcon.cpp +++ b/src/mame/drivers/dcon.cpp @@ -29,13 +29,13 @@ /***************************************************************************/ -READ8_MEMBER(dcon_state::sdgndmps_sound_comms_r) +u8 dcon_state::sdgndmps_sound_comms_r(offs_t offset) { // Routine at 134C sends no sound commands if lowest bit is 0 if (offset == 5) // ($a000a) return 1; - return m_seibu_sound->main_r(space, offset); + return m_seibu_sound->main_r(offset); } void dcon_state::dcon_map(address_map &map) diff --git a/src/mame/drivers/ddenlovr.cpp b/src/mame/drivers/ddenlovr.cpp index fce55440bad..0097e04ec0d 100644 --- a/src/mame/drivers/ddenlovr.cpp +++ b/src/mame/drivers/ddenlovr.cpp @@ -1633,9 +1633,9 @@ void ddenlovr_state::copylayer(bitmap_ind16 &bitmap, const rectangle &cliprect, if (((m_ddenlovr_layer_enable2 << 4) | m_ddenlovr_layer_enable) & (1 << layer)) { - for (y = cliprect.min_y; y <= cliprect.max_y; y++) + for (y = cliprect.top(); y <= cliprect.bottom(); y++) { - for (x = cliprect.min_x; x <= cliprect.max_x; x++) + for (x = cliprect.left(); x <= cliprect.right(); x++) { int pen = m_ddenlovr_pixmap[layer][512 * ((y + scrolly) & 0x1ff) + ((x + scrollx) & 0x1ff)]; if ((pen & transmask) != transpen) diff --git a/src/mame/drivers/ddragon3.cpp b/src/mame/drivers/ddragon3.cpp index ddd459e6bf3..a364b8b0520 100644 --- a/src/mame/drivers/ddragon3.cpp +++ b/src/mame/drivers/ddragon3.cpp @@ -932,7 +932,7 @@ MACHINE_CONFIG_START(wwfwfest_state::wwfwfest) MCFG_SOUND_ROUTE(0, "mono", 0.45) MCFG_SOUND_ROUTE(1, "mono", 0.45) - MCFG_DEVICE_ADD("oki", OKIM6295, 1024188, okim6295_device::PIN7_HIGH) /* Verified - Pin 7 tied to +5VDC */ + MCFG_DEVICE_ADD("oki", OKIM6295, 1.056_MHz_XTAL, okim6295_device::PIN7_HIGH) /* Verified - Pin 7 tied to +5VDC */ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.90) MACHINE_CONFIG_END @@ -981,8 +981,8 @@ ROM_END ROM_START( ddragon3j ) ROM_REGION( 0x80000, "maincpu", 0 ) /* 64k for cpu code */ - ROM_LOAD16_BYTE( "30j15.ic78", 0x00001, 0x40000, CRC(40618cbc) SHA1(cb05498003a45d773983501d3a0f1584a25dcdd3) ) - ROM_LOAD16_BYTE( "30j14.ic79", 0x00000, 0x20000, CRC(96827e80) SHA1(499c0c67d55ff4816ad8832d1d8836eb7432bd13) ) + ROM_LOAD16_BYTE( "30j15-0.ic78", 0x00001, 0x40000, CRC(40618cbc) SHA1(cb05498003a45d773983501d3a0f1584a25dcdd3) ) + ROM_LOAD16_BYTE( "30j14-0.ic79", 0x00000, 0x20000, CRC(96827e80) SHA1(499c0c67d55ff4816ad8832d1d8836eb7432bd13) ) ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for sound cpu code */ ROM_LOAD( "30j13.ic43", 0x00000, 0x10000, CRC(1e974d9b) SHA1(8e54ff747efe587a2e971c15e729445c4e232f0f) ) @@ -1115,7 +1115,7 @@ ROM_START( ctribe ) ROM_REGION( 0x80000, "maincpu", 0 ) /* 64k for cpu code */ ROM_LOAD16_BYTE( "28a16-2.ic26", 0x00001, 0x20000, CRC(c46b2e63) SHA1(86ace715dca48c78a46da1d102de47e5f948a86c) ) ROM_LOAD16_BYTE( "28a15-2.ic25", 0x00000, 0x20000, CRC(3221c755) SHA1(0f6fe5cd6947f6547585eedb7fc5e6af8544b1f7) ) - ROM_LOAD16_BYTE( "28j17-0.104", 0x40001, 0x10000, CRC(8c2c6dbd) SHA1(b99b9be6e0bdc8340fedd258819c4df587926a84) ) + ROM_LOAD16_BYTE( "28j17-0.104", 0x40001, 0x10000, CRC(8c2c6dbd) SHA1(b99b9be6e0bdc8340fedd258819c4df587926a84) ) /* No EVEN rom! */ ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for sound cpu code */ @@ -1145,11 +1145,11 @@ ROM_START( ctribe ) ROM_LOAD( "28.ic44", 0x0000, 0x0100, CRC(964329ef) SHA1(f26846571a16d27b726f689049deb0188103aadb) ) ROM_END -ROM_START( ctribe1 ) +ROM_START( ctribeua ) ROM_REGION( 0x80000, "maincpu", 0 ) /* 64k for cpu code */ ROM_LOAD16_BYTE( "1_28a16-2.ic26", 0x00001, 0x20000, CRC(f00f8443) SHA1(3c099b6bea9956cc60ce4a9a5d790ac2bf7d77bd) ) ROM_LOAD16_BYTE( "1_28a15-2.ic25", 0x00000, 0x20000, CRC(dd70079f) SHA1(321b523fefec2a962d0afa20b33428e7caea8958) ) - ROM_LOAD16_BYTE( "28j17-0.104", 0x40001, 0x10000, CRC(8c2c6dbd) SHA1(b99b9be6e0bdc8340fedd258819c4df587926a84) ) + ROM_LOAD16_BYTE( "28j17-0.104", 0x40001, 0x10000, CRC(8c2c6dbd) SHA1(b99b9be6e0bdc8340fedd258819c4df587926a84) ) /* No EVEN rom! */ ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for sound cpu code */ @@ -1179,11 +1179,11 @@ ROM_START( ctribe1 ) ROM_LOAD( "28.ic44", 0x0000, 0x0100, CRC(964329ef) SHA1(f26846571a16d27b726f689049deb0188103aadb) ) ROM_END -ROM_START( ctribeo ) // only main program code differs from ctribe1 set +ROM_START( ctribeu1 ) // only main program code differs from ctribe1 set ROM_REGION( 0x80000, "maincpu", 0 ) /* 64k for cpu code */ ROM_LOAD16_BYTE( "28a16-1.ic26", 0x00001, 0x20000, CRC(d108f36f) SHA1(af53fa441b9ddfc639abb573864a9b351633c6b7) ) ROM_LOAD16_BYTE( "28a15-1.ic25", 0x00000, 0x20000, CRC(3f5693a3) SHA1(2d4516506ad1d68ac45242fe149bba1b4b53eb45) ) - ROM_LOAD16_BYTE( "28j17-0.104", 0x40001, 0x10000, CRC(8c2c6dbd) SHA1(b99b9be6e0bdc8340fedd258819c4df587926a84) ) + ROM_LOAD16_BYTE( "28j17-0.104", 0x40001, 0x10000, CRC(8c2c6dbd) SHA1(b99b9be6e0bdc8340fedd258819c4df587926a84) ) /* No EVEN rom! */ ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for sound cpu code */ @@ -1215,9 +1215,9 @@ ROM_END ROM_START( ctribej ) ROM_REGION( 0x80000, "maincpu", 0 ) /* 64k for cpu code */ - ROM_LOAD16_BYTE( "28j16-02.26", 0x00001, 0x20000, CRC(658b8568) SHA1(899682f6ab28b184654c51c1169216974043f1b9) ) - ROM_LOAD16_BYTE( "28j15-12.25", 0x00000, 0x20000, CRC(50aac7e7) SHA1(af77107f325f9b45a92c544328d3073ed1db5465) ) - ROM_LOAD16_BYTE( "28j17-0.104", 0x40001, 0x10000, CRC(8c2c6dbd) SHA1(b99b9be6e0bdc8340fedd258819c4df587926a84) ) + ROM_LOAD16_BYTE( "28j16-2.ic26", 0x00001, 0x20000, CRC(658b8568) SHA1(899682f6ab28b184654c51c1169216974043f1b9) ) + ROM_LOAD16_BYTE( "28j15-2.ic25", 0x00000, 0x20000, CRC(50aac7e7) SHA1(af77107f325f9b45a92c544328d3073ed1db5465) ) + ROM_LOAD16_BYTE( "28j17-0.104", 0x40001, 0x10000, CRC(8c2c6dbd) SHA1(b99b9be6e0bdc8340fedd258819c4df587926a84) ) /* No EVEN rom! */ ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for sound cpu code */ @@ -1385,7 +1385,36 @@ ROM_START( wwfwfestu ) ROM_LOAD( "31j1.ic2", 0x00000, 0x40000, CRC(82ed7155) SHA1(b338e1150ffe3277c11d4d6e801a7d3bd7c58492) ) /* 2,3 */ ROM_END -ROM_START( wwfwfestb ) +ROM_START( wwfwfestu1 ) + ROM_REGION( 0x80000, "maincpu", 0 ) /* Main CPU (68000) */ + ROM_LOAD16_BYTE( "31a13-0.ic19", 0x00001, 0x40000, CRC(a01c7c95) SHA1(298b9eeaeb8a207cbb02f4bea87436f0421697fe) ) /* label had a blue stripe down the side */ + ROM_LOAD16_BYTE( "31a14-0.ic18", 0x00000, 0x40000, CRC(30824d0b) SHA1(54281c76f380225516877648645a619d8417816e) ) /* label had a blue stripe down the side */ + + ROM_REGION( 0x10000, "audiocpu", 0 ) /* Sound CPU (Z80) */ + ROM_LOAD( "31a11-0.ic42", 0x00000, 0x10000, CRC(5ddebfea) SHA1(30073963e965250d94f0dc3bd261a054850adf95) ) /* labeled as 31A11-0 but same data 31A11-2 */ + + ROM_REGION( 0x80000, "oki", 0 ) /* ADPCM samples */ + ROM_LOAD( "31j10.ic73", 0x00000, 0x80000, CRC(6c522edb) SHA1(8005d59c94160638ba2ea7caf4e991fff03003d5) ) + + ROM_REGION( 0x20000, "gfx1", 0 ) /* FG0 Tiles (8x8) */ + ROM_LOAD( "31a12-0.ic33", 0x00000, 0x20000, CRC(d0803e20) SHA1(b68758e9a5522396f831a3972571f8aed54c64de) ) + + ROM_REGION( 0x800000, "gfx2", 0 ) /* SPR Tiles (16x16), 27080 Mask ROM's */ + ROM_LOAD( "31j3.ic9", 0x000000, 0x100000, CRC(e395cf1d) SHA1(241f98145e295993c9b6a44dc087a9b61fbc9a6f) ) /* Tiles 0 */ + ROM_LOAD( "31j2.ic8", 0x100000, 0x100000, CRC(b5a97465) SHA1(08d82c29a5c02b83fdbd0bad649b74eb35ab7e54) ) /* Tiles 1 */ + ROM_LOAD( "31j5.ic11", 0x200000, 0x100000, CRC(2ce545e8) SHA1(82173e58a8476a6fe9d2c990fce1f71af117a0ea) ) /* Tiles 0 */ + ROM_LOAD( "31j4.ic10", 0x300000, 0x100000, CRC(00edb66a) SHA1(926606d1923936b6e75391b1ab03b369d9822d13) ) /* Tiles 1 */ + ROM_LOAD( "31j6.ic12", 0x400000, 0x100000, CRC(79956cf8) SHA1(52207263620a6b6dde66d3f8749b772577899ea5) ) /* Tiles 0 */ + ROM_LOAD( "31j7.ic13", 0x500000, 0x100000, CRC(74d774c3) SHA1(a723ac5d481bf91b12e17652fbb2d869c886dec0) ) /* Tiles 1 */ + ROM_LOAD( "31j9.ic15", 0x600000, 0x100000, CRC(dd387289) SHA1(2cad42d4e7cd1a49346f844058ae18c38bc686a8) ) /* Tiles 0 */ + ROM_LOAD( "31j8.ic14", 0x700000, 0x100000, CRC(44abe127) SHA1(c723e1dea117534e976d2d383e634faf073cd57b) ) /* Tiles 1 */ + + ROM_REGION( 0x80000, "gfx3", 0 ) /* BG0 / BG1 Tiles (16x16) */ + ROM_LOAD( "31j0.ic1", 0x40000, 0x40000, CRC(8a12b450) SHA1(2e15c949efcda8bb6f11afe3ff07ba1dee9c771c) ) /* 0,1 */ + ROM_LOAD( "31j1.ic2", 0x00000, 0x40000, CRC(82ed7155) SHA1(b338e1150ffe3277c11d4d6e801a7d3bd7c58492) ) /* 2,3 */ +ROM_END + +ROM_START( wwfwfestub ) ROM_REGION( 0x80000, "maincpu", 0 ) /* Main CPU (68000) */ ROM_LOAD16_BYTE( "3", 0x00000, 0x40000, CRC(ea73369c) SHA1(be614a342f9014251810fa30ec56fec03f7c8ef3) ) ROM_LOAD16_BYTE( "2", 0x00001, 0x40000, CRC(632bb3a4) SHA1(9c04fed5aeefc683810cfbd9b3318e155ed9813f) ) @@ -1486,15 +1515,16 @@ GAME( 1990, ddragon3j, ddragon3, ddragon3, ddragon3, ddragon3_state, empty_ini GAME( 1990, ddragon3p, ddragon3, ddragon3, ddragon3, ddragon3_state, empty_init, ROT0, "Technos Japan", "Double Dragon 3 - The Rosetta Stone (prototype)", MACHINE_SUPPORTS_SAVE ) GAME( 1990, ddragon3b, ddragon3, ddragon3b, ddragon3b, ddragon3_state, empty_init, ROT0, "bootleg", "Double Dragon 3 - The Rosetta Stone (bootleg)", MACHINE_SUPPORTS_SAVE ) -GAME( 1990, ctribe, 0, ctribe, ctribe, ddragon3_state, empty_init, ROT0, "Technos Japan", "The Combatribes (US)", MACHINE_SUPPORTS_SAVE ) -GAME( 1990, ctribe1, ctribe, ctribe, ctribe, ddragon3_state, empty_init, ROT0, "Technos Japan", "The Combatribes (US set 1?)", MACHINE_SUPPORTS_SAVE ) -GAME( 1990, ctribeo, ctribe, ctribe, ctribe, ddragon3_state, empty_init, ROT0, "Technos Japan", "The Combatribes (US, older)", MACHINE_SUPPORTS_SAVE ) -GAME( 1990, ctribej, ctribe, ctribe, ctribe, ddragon3_state, empty_init, ROT0, "Technos Japan", "The Combatribes (Japan)", MACHINE_SUPPORTS_SAVE ) -GAME( 1990, ctribeb, ctribe, ctribe, ctribeb, ddragon3_state, empty_init, ROT0, "bootleg", "The Combatribes (bootleg set 1)", MACHINE_SUPPORTS_SAVE ) -GAME( 1990, ctribeb2, ctribe, ctribe, ctribeb, ddragon3_state, empty_init, ROT0, "bootleg", "The Combatribes (bootleg set 2)", MACHINE_SUPPORTS_SAVE ) - -GAME( 1991, wwfwfest, 0, wwfwfest, wwfwfest, wwfwfest_state, empty_init, ROT0, "Technos Japan (Tecmo license)", "WWF WrestleFest (World)", MACHINE_SUPPORTS_SAVE ) // Euro label but shows FBI "Winners Don't Do drugs" logo -GAME( 1991, wwfwfestu, wwfwfest, wwfwfest, wwfwfest, wwfwfest_state, empty_init, ROT0, "Technos Japan", "WWF WrestleFest (US)", MACHINE_SUPPORTS_SAVE ) -GAME( 1991, wwfwfestb, wwfwfest, wwfwfstb, wwfwfest, wwfwfest_state, empty_init, ROT0, "bootleg", "WWF WrestleFest (US bootleg)", MACHINE_SUPPORTS_SAVE ) -GAME( 1991, wwfwfestj, wwfwfest, wwfwfest, wwfwfesta, wwfwfest_state, empty_init, ROT0, "Technos Japan (Tecmo license)", "WWF WrestleFest (Japan)", MACHINE_SUPPORTS_SAVE ) -GAME( 1991, wwfwfestk, wwfwfest, wwfwfest, wwfwfesta, wwfwfest_state, empty_init, ROT0, "Technos Japan (Tecmo license)", "WWF WrestleFest (Korea)", MACHINE_SUPPORTS_SAVE ) +GAME( 1990, ctribe, 0, ctribe, ctribe, ddragon3_state, empty_init, ROT0, "Technos Japan", "The Combatribes (US, rev 2, set 1)", MACHINE_SUPPORTS_SAVE ) +GAME( 1990, ctribeua, ctribe, ctribe, ctribe, ddragon3_state, empty_init, ROT0, "Technos Japan", "The Combatribes (US, rev 2, set 2)", MACHINE_SUPPORTS_SAVE ) +GAME( 1990, ctribeu1, ctribe, ctribe, ctribe, ddragon3_state, empty_init, ROT0, "Technos Japan", "The Combatribes (US, rev 1)", MACHINE_SUPPORTS_SAVE ) +GAME( 1990, ctribej, ctribe, ctribe, ctribe, ddragon3_state, empty_init, ROT0, "Technos Japan", "The Combatribes (Japan, rev 2)", MACHINE_SUPPORTS_SAVE ) +GAME( 1990, ctribeb, ctribe, ctribe, ctribeb, ddragon3_state, empty_init, ROT0, "bootleg", "The Combatribes (bootleg set 1)", MACHINE_SUPPORTS_SAVE ) +GAME( 1990, ctribeb2, ctribe, ctribe, ctribeb, ddragon3_state, empty_init, ROT0, "bootleg", "The Combatribes (bootleg set 2)", MACHINE_SUPPORTS_SAVE ) + +GAME( 1991, wwfwfest, 0, wwfwfest, wwfwfest, wwfwfest_state, empty_init, ROT0, "Technos Japan (Tecmo license)", "WWF WrestleFest (World)", MACHINE_SUPPORTS_SAVE ) // Euro label but shows FBI "Winners Don't Do drugs" logo +GAME( 1991, wwfwfestu, wwfwfest, wwfwfest, wwfwfest, wwfwfest_state, empty_init, ROT0, "Technos Japan", "WWF WrestleFest (US, rev 2)", MACHINE_SUPPORTS_SAVE ) +GAME( 1991, wwfwfestu1, wwfwfest, wwfwfest, wwfwfest, wwfwfest_state, empty_init, ROT0, "Technos Japan", "WWF WrestleFest (US)", MACHINE_SUPPORTS_SAVE ) +GAME( 1991, wwfwfestub, wwfwfest, wwfwfstb, wwfwfest, wwfwfest_state, empty_init, ROT0, "bootleg", "WWF WrestleFest (US bootleg)", MACHINE_SUPPORTS_SAVE ) +GAME( 1991, wwfwfestj, wwfwfest, wwfwfest, wwfwfesta, wwfwfest_state, empty_init, ROT0, "Technos Japan (Tecmo license)", "WWF WrestleFest (Japan)", MACHINE_SUPPORTS_SAVE ) +GAME( 1991, wwfwfestk, wwfwfest, wwfwfest, wwfwfesta, wwfwfest_state, empty_init, ROT0, "Technos Japan (Tecmo license)", "WWF WrestleFest (Korea)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/drivers/dec0.cpp b/src/mame/drivers/dec0.cpp index aa7d433fe06..ce24fe9289a 100644 --- a/src/mame/drivers/dec0.cpp +++ b/src/mame/drivers/dec0.cpp @@ -430,24 +430,24 @@ WRITE16_MEMBER(dec0_state::midres_sound_w) void dec0_state::dec0_map(address_map &map) { map(0x000000, 0x05ffff).rom(); - map(0x240000, 0x240007).w(m_tilegen1, FUNC(deco_bac06_device::pf_control_0_w)); /* text layer */ - map(0x240010, 0x240017).w(m_tilegen1, FUNC(deco_bac06_device::pf_control_1_w)); - map(0x242000, 0x24207f).rw(m_tilegen1, FUNC(deco_bac06_device::pf_colscroll_r), FUNC(deco_bac06_device::pf_colscroll_w)); - map(0x242400, 0x2427ff).rw(m_tilegen1, FUNC(deco_bac06_device::pf_rowscroll_r), FUNC(deco_bac06_device::pf_rowscroll_w)); + map(0x240000, 0x240007).w(m_tilegen[0], FUNC(deco_bac06_device::pf_control_0_w)); /* text layer */ + map(0x240010, 0x240017).w(m_tilegen[0], FUNC(deco_bac06_device::pf_control_1_w)); + map(0x242000, 0x24207f).rw(m_tilegen[0], FUNC(deco_bac06_device::pf_colscroll_r), FUNC(deco_bac06_device::pf_colscroll_w)); + map(0x242400, 0x2427ff).rw(m_tilegen[0], FUNC(deco_bac06_device::pf_rowscroll_r), FUNC(deco_bac06_device::pf_rowscroll_w)); map(0x242800, 0x243fff).ram(); /* Robocop only */ - map(0x244000, 0x245fff).rw(m_tilegen1, FUNC(deco_bac06_device::pf_data_r), FUNC(deco_bac06_device::pf_data_w)); + map(0x244000, 0x245fff).rw(m_tilegen[0], FUNC(deco_bac06_device::pf_data_r), FUNC(deco_bac06_device::pf_data_w)); - map(0x246000, 0x246007).w(m_tilegen2, FUNC(deco_bac06_device::pf_control_0_w)); /* first tile layer */ - map(0x246010, 0x246017).w(m_tilegen2, FUNC(deco_bac06_device::pf_control_1_w)); - map(0x248000, 0x24807f).rw(m_tilegen2, FUNC(deco_bac06_device::pf_colscroll_r), FUNC(deco_bac06_device::pf_colscroll_w)); - map(0x248400, 0x2487ff).rw(m_tilegen2, FUNC(deco_bac06_device::pf_rowscroll_r), FUNC(deco_bac06_device::pf_rowscroll_w)); - map(0x24a000, 0x24a7ff).rw(m_tilegen2, FUNC(deco_bac06_device::pf_data_r), FUNC(deco_bac06_device::pf_data_w)); + map(0x246000, 0x246007).w(m_tilegen[1], FUNC(deco_bac06_device::pf_control_0_w)); /* first tile layer */ + map(0x246010, 0x246017).w(m_tilegen[1], FUNC(deco_bac06_device::pf_control_1_w)); + map(0x248000, 0x24807f).rw(m_tilegen[1], FUNC(deco_bac06_device::pf_colscroll_r), FUNC(deco_bac06_device::pf_colscroll_w)); + map(0x248400, 0x2487ff).rw(m_tilegen[1], FUNC(deco_bac06_device::pf_rowscroll_r), FUNC(deco_bac06_device::pf_rowscroll_w)); + map(0x24a000, 0x24a7ff).rw(m_tilegen[1], FUNC(deco_bac06_device::pf_data_r), FUNC(deco_bac06_device::pf_data_w)); - map(0x24c000, 0x24c007).w(m_tilegen3, FUNC(deco_bac06_device::pf_control_0_w)); /* second tile layer */ - map(0x24c010, 0x24c017).w(m_tilegen3, FUNC(deco_bac06_device::pf_control_1_w)); - map(0x24c800, 0x24c87f).rw(m_tilegen3, FUNC(deco_bac06_device::pf_colscroll_r), FUNC(deco_bac06_device::pf_colscroll_w)); - map(0x24cc00, 0x24cfff).rw(m_tilegen3, FUNC(deco_bac06_device::pf_rowscroll_r), FUNC(deco_bac06_device::pf_rowscroll_w)); - map(0x24d000, 0x24d7ff).rw(m_tilegen3, FUNC(deco_bac06_device::pf_data_r), FUNC(deco_bac06_device::pf_data_w)); + map(0x24c000, 0x24c007).w(m_tilegen[2], FUNC(deco_bac06_device::pf_control_0_w)); /* second tile layer */ + map(0x24c010, 0x24c017).w(m_tilegen[2], FUNC(deco_bac06_device::pf_control_1_w)); + map(0x24c800, 0x24c87f).rw(m_tilegen[2], FUNC(deco_bac06_device::pf_colscroll_r), FUNC(deco_bac06_device::pf_colscroll_w)); + map(0x24cc00, 0x24cfff).rw(m_tilegen[2], FUNC(deco_bac06_device::pf_rowscroll_r), FUNC(deco_bac06_device::pf_rowscroll_w)); + map(0x24d000, 0x24d7ff).rw(m_tilegen[2], FUNC(deco_bac06_device::pf_data_r), FUNC(deco_bac06_device::pf_data_w)); map(0x300000, 0x300001).portr("AN0"); map(0x300008, 0x300009).portr("AN1"); @@ -461,29 +461,38 @@ void dec0_state::dec0_map(address_map &map) map(0xffc000, 0xffc7ff).ram().share("spriteram"); /* Sprites */ } +void dec0_state::robocop_map(address_map &map) +{ + dec0_map(map); + map(0x180000, 0x180fff).rw(FUNC(dec0_state::robocop_68000_share_r), FUNC(dec0_state::robocop_68000_share_w)); +} + void dec0_state::robocop_sub_map(address_map &map) { map(0x000000, 0x00ffff).rom(); map(0x1f0000, 0x1f1fff).ram(); /* Main ram */ map(0x1f2000, 0x1f3fff).ram().share("robocop_shared"); /* Shared ram */ - map(0x1ff400, 0x1ff403).w(m_subcpu, FUNC(h6280_device::irq_status_w)); +} + +void dec0_state::hippodrm_map(address_map &map) +{ + dec0_map(map); + map(0x180000, 0x18003f).rw(FUNC(dec0_state::hippodrm_68000_share_r), FUNC(dec0_state::hippodrm_68000_share_w)); + map(0xffc800, 0xffcfff).w(FUNC(dec0_state::sprite_mirror_w)); } void dec0_state::hippodrm_sub_map(address_map &map) { map(0x000000, 0x00ffff).rom(); map(0x180000, 0x18001f).ram().share("hippodrm_shared"); - map(0x1a0000, 0x1a0007).w(m_tilegen3, FUNC(deco_bac06_device::pf_control0_8bit_packed_w)); - map(0x1a0010, 0x1a001f).w(m_tilegen3, FUNC(deco_bac06_device::pf_control1_8bit_swap_w)); - map(0x1a1000, 0x1a17ff).rw(m_tilegen3, FUNC(deco_bac06_device::pf_data_8bit_swap_r), FUNC(deco_bac06_device::pf_data_8bit_swap_w)); + map(0x1a0000, 0x1a0007).w(m_tilegen[2], FUNC(deco_bac06_device::pf_control0_8bit_packed_w)); + map(0x1a0010, 0x1a001f).w(m_tilegen[2], FUNC(deco_bac06_device::pf_control1_8bit_swap_w)); + map(0x1a1000, 0x1a17ff).rw(m_tilegen[2], FUNC(deco_bac06_device::pf_data_8bit_swap_r), FUNC(deco_bac06_device::pf_data_8bit_swap_w)); map(0x1d0000, 0x1d00ff).rw(FUNC(dec0_state::hippodrm_prot_r), FUNC(dec0_state::hippodrm_prot_w)); - map(0x1f0000, 0x1f1fff).bankrw("bank8"); /* Main ram */ - map(0x1ff400, 0x1ff403).w(m_subcpu, FUNC(h6280_device::irq_status_w)); - map(0x1ff402, 0x1ff403).portr("VBLANK"); + map(0x1f0000, 0x1f1fff).ram(); /* Main ram */ } - READ16_MEMBER(dec0_state::slyspy_controls_r) { switch (offset<<1) @@ -576,26 +585,26 @@ void dec0_state::slyspy_protection_map(address_map &map) map(0x04000, 0x04001).mirror(0x30000).r(FUNC(dec0_state::slyspy_state_r)).nopw(); map(0x0a000, 0x0a001).mirror(0x30000).w(FUNC(dec0_state::slyspy_state_w)); // Default state (called by Traps 1, 3, 4, 7, C) - map(0x00000, 0x00007).w(m_tilegen2, FUNC(deco_bac06_device::pf_control_0_w)); - map(0x00010, 0x00017).w(m_tilegen2, FUNC(deco_bac06_device::pf_control_1_w)); - map(0x02000, 0x0207f).w(m_tilegen2, FUNC(deco_bac06_device::pf_colscroll_w)); - map(0x02400, 0x027ff).w(m_tilegen2, FUNC(deco_bac06_device::pf_rowscroll_w)); - map(0x06000, 0x07fff).w(m_tilegen2, FUNC(deco_bac06_device::pf_data_w)); - map(0x08000, 0x08007).w(m_tilegen1, FUNC(deco_bac06_device::pf_control_0_w)); - map(0x08010, 0x08017).w(m_tilegen1, FUNC(deco_bac06_device::pf_control_1_w)); - map(0x0c000, 0x0c07f).w(m_tilegen1, FUNC(deco_bac06_device::pf_colscroll_w)); - map(0x0c400, 0x0c7ff).w(m_tilegen1, FUNC(deco_bac06_device::pf_rowscroll_w)); - map(0x0e000, 0x0ffff).w(m_tilegen1, FUNC(deco_bac06_device::pf_data_w)); + map(0x00000, 0x00007).w(m_tilegen[1], FUNC(deco_bac06_device::pf_control_0_w)); + map(0x00010, 0x00017).w(m_tilegen[1], FUNC(deco_bac06_device::pf_control_1_w)); + map(0x02000, 0x0207f).w(m_tilegen[1], FUNC(deco_bac06_device::pf_colscroll_w)); + map(0x02400, 0x027ff).w(m_tilegen[1], FUNC(deco_bac06_device::pf_rowscroll_w)); + map(0x06000, 0x07fff).w(m_tilegen[1], FUNC(deco_bac06_device::pf_data_w)); + map(0x08000, 0x08007).w(m_tilegen[0], FUNC(deco_bac06_device::pf_control_0_w)); + map(0x08010, 0x08017).w(m_tilegen[0], FUNC(deco_bac06_device::pf_control_1_w)); + map(0x0c000, 0x0c07f).w(m_tilegen[0], FUNC(deco_bac06_device::pf_colscroll_w)); + map(0x0c400, 0x0c7ff).w(m_tilegen[0], FUNC(deco_bac06_device::pf_rowscroll_w)); + map(0x0e000, 0x0ffff).w(m_tilegen[0], FUNC(deco_bac06_device::pf_data_w)); // State 1 (Called by Trap 9) - map(0x18000, 0x19fff).w(m_tilegen1, FUNC(deco_bac06_device::pf_data_w)); - map(0x1c000, 0x1dfff).w(m_tilegen2, FUNC(deco_bac06_device::pf_data_w)); + map(0x18000, 0x19fff).w(m_tilegen[0], FUNC(deco_bac06_device::pf_data_w)); + map(0x1c000, 0x1dfff).w(m_tilegen[1], FUNC(deco_bac06_device::pf_data_w)); // State 2 (Called by Trap A) - map(0x20000, 0x21fff).w(m_tilegen2, FUNC(deco_bac06_device::pf_data_w)); - map(0x22000, 0x23fff).w(m_tilegen1, FUNC(deco_bac06_device::pf_data_w)); - map(0x2e000, 0x2ffff).w(m_tilegen1, FUNC(deco_bac06_device::pf_data_w)); + map(0x20000, 0x21fff).w(m_tilegen[1], FUNC(deco_bac06_device::pf_data_w)); + map(0x22000, 0x23fff).w(m_tilegen[0], FUNC(deco_bac06_device::pf_data_w)); + map(0x2e000, 0x2ffff).w(m_tilegen[0], FUNC(deco_bac06_device::pf_data_w)); // State 3 (Called by Trap B) - map(0x30000, 0x31fff).w(m_tilegen1, FUNC(deco_bac06_device::pf_data_w)); - map(0x38000, 0x39fff).w(m_tilegen2, FUNC(deco_bac06_device::pf_data_w)); + map(0x30000, 0x31fff).w(m_tilegen[0], FUNC(deco_bac06_device::pf_data_w)); + map(0x38000, 0x39fff).w(m_tilegen[1], FUNC(deco_bac06_device::pf_data_w)); } void dec0_state::slyspy_map(address_map &map) @@ -606,11 +615,11 @@ void dec0_state::slyspy_map(address_map &map) map(0x240000, 0x24ffff).m(m_pfprotect, FUNC(address_map_bank_device::amap16)); /* Pf3 is unaffected by protection */ - map(0x300000, 0x300007).w(m_tilegen3, FUNC(deco_bac06_device::pf_control_0_w)); - map(0x300010, 0x300017).w(m_tilegen3, FUNC(deco_bac06_device::pf_control_1_w)); - map(0x300800, 0x30087f).rw(m_tilegen3, FUNC(deco_bac06_device::pf_colscroll_r), FUNC(deco_bac06_device::pf_colscroll_w)); - map(0x300c00, 0x300fff).rw(m_tilegen3, FUNC(deco_bac06_device::pf_rowscroll_r), FUNC(deco_bac06_device::pf_rowscroll_w)); - map(0x301000, 0x3017ff).rw(m_tilegen3, FUNC(deco_bac06_device::pf_data_r), FUNC(deco_bac06_device::pf_data_w)); + map(0x300000, 0x300007).w(m_tilegen[2], FUNC(deco_bac06_device::pf_control_0_w)); + map(0x300010, 0x300017).w(m_tilegen[2], FUNC(deco_bac06_device::pf_control_1_w)); + map(0x300800, 0x30087f).rw(m_tilegen[2], FUNC(deco_bac06_device::pf_colscroll_r), FUNC(deco_bac06_device::pf_colscroll_w)); + map(0x300c00, 0x300fff).rw(m_tilegen[2], FUNC(deco_bac06_device::pf_rowscroll_r), FUNC(deco_bac06_device::pf_rowscroll_w)); + map(0x301000, 0x3017ff).rw(m_tilegen[2], FUNC(deco_bac06_device::pf_data_r), FUNC(deco_bac06_device::pf_data_w)); map(0x304000, 0x307fff).ram().share("ram"); /* Sly spy main ram */ map(0x308000, 0x3087ff).ram().share("spriteram"); /* Sprites */ @@ -633,24 +642,24 @@ void dec0_state::midres_map(address_map &map) map(0x180008, 0x18000f).nopw(); /* ?? watchdog ?? */ map(0x1a0001, 0x1a0001).w(m_soundlatch, FUNC(generic_latch_8_device::write)); - map(0x200000, 0x200007).w(m_tilegen2, FUNC(deco_bac06_device::pf_control_0_w)); - map(0x200010, 0x200017).w(m_tilegen2, FUNC(deco_bac06_device::pf_control_1_w)); - map(0x220000, 0x2207ff).rw(m_tilegen2, FUNC(deco_bac06_device::pf_data_r), FUNC(deco_bac06_device::pf_data_w)); - map(0x220800, 0x220fff).rw(m_tilegen2, FUNC(deco_bac06_device::pf_data_r), FUNC(deco_bac06_device::pf_data_w)); /* mirror address used in end sequence */ - map(0x240000, 0x24007f).rw(m_tilegen2, FUNC(deco_bac06_device::pf_colscroll_r), FUNC(deco_bac06_device::pf_colscroll_w)); - map(0x240400, 0x2407ff).rw(m_tilegen2, FUNC(deco_bac06_device::pf_rowscroll_r), FUNC(deco_bac06_device::pf_rowscroll_w)); - - map(0x280000, 0x280007).w(m_tilegen3, FUNC(deco_bac06_device::pf_control_0_w)); - map(0x280010, 0x280017).w(m_tilegen3, FUNC(deco_bac06_device::pf_control_1_w)); - map(0x2a0000, 0x2a07ff).rw(m_tilegen3, FUNC(deco_bac06_device::pf_data_r), FUNC(deco_bac06_device::pf_data_w)); - map(0x2c0000, 0x2c007f).rw(m_tilegen3, FUNC(deco_bac06_device::pf_colscroll_r), FUNC(deco_bac06_device::pf_colscroll_w)); - map(0x2c0400, 0x2c07ff).rw(m_tilegen3, FUNC(deco_bac06_device::pf_rowscroll_r), FUNC(deco_bac06_device::pf_rowscroll_w)); - - map(0x300000, 0x300007).w(m_tilegen1, FUNC(deco_bac06_device::pf_control_0_w)); - map(0x300010, 0x300017).w(m_tilegen1, FUNC(deco_bac06_device::pf_control_1_w)); - map(0x320000, 0x321fff).rw(m_tilegen1, FUNC(deco_bac06_device::pf_data_r), FUNC(deco_bac06_device::pf_data_w)); - map(0x340000, 0x34007f).rw(m_tilegen1, FUNC(deco_bac06_device::pf_colscroll_r), FUNC(deco_bac06_device::pf_colscroll_w)); - map(0x340400, 0x3407ff).rw(m_tilegen1, FUNC(deco_bac06_device::pf_rowscroll_r), FUNC(deco_bac06_device::pf_rowscroll_w)); + map(0x200000, 0x200007).w(m_tilegen[1], FUNC(deco_bac06_device::pf_control_0_w)); + map(0x200010, 0x200017).w(m_tilegen[1], FUNC(deco_bac06_device::pf_control_1_w)); + map(0x220000, 0x2207ff).rw(m_tilegen[1], FUNC(deco_bac06_device::pf_data_r), FUNC(deco_bac06_device::pf_data_w)); + map(0x220800, 0x220fff).rw(m_tilegen[1], FUNC(deco_bac06_device::pf_data_r), FUNC(deco_bac06_device::pf_data_w)); /* mirror address used in end sequence */ + map(0x240000, 0x24007f).rw(m_tilegen[1], FUNC(deco_bac06_device::pf_colscroll_r), FUNC(deco_bac06_device::pf_colscroll_w)); + map(0x240400, 0x2407ff).rw(m_tilegen[1], FUNC(deco_bac06_device::pf_rowscroll_r), FUNC(deco_bac06_device::pf_rowscroll_w)); + + map(0x280000, 0x280007).w(m_tilegen[2], FUNC(deco_bac06_device::pf_control_0_w)); + map(0x280010, 0x280017).w(m_tilegen[2], FUNC(deco_bac06_device::pf_control_1_w)); + map(0x2a0000, 0x2a07ff).rw(m_tilegen[2], FUNC(deco_bac06_device::pf_data_r), FUNC(deco_bac06_device::pf_data_w)); + map(0x2c0000, 0x2c007f).rw(m_tilegen[2], FUNC(deco_bac06_device::pf_colscroll_r), FUNC(deco_bac06_device::pf_colscroll_w)); + map(0x2c0400, 0x2c07ff).rw(m_tilegen[2], FUNC(deco_bac06_device::pf_rowscroll_r), FUNC(deco_bac06_device::pf_rowscroll_w)); + + map(0x300000, 0x300007).w(m_tilegen[0], FUNC(deco_bac06_device::pf_control_0_w)); + map(0x300010, 0x300017).w(m_tilegen[0], FUNC(deco_bac06_device::pf_control_1_w)); + map(0x320000, 0x321fff).rw(m_tilegen[0], FUNC(deco_bac06_device::pf_data_r), FUNC(deco_bac06_device::pf_data_w)); + map(0x340000, 0x34007f).rw(m_tilegen[0], FUNC(deco_bac06_device::pf_colscroll_r), FUNC(deco_bac06_device::pf_colscroll_w)); + map(0x340400, 0x3407ff).rw(m_tilegen[0], FUNC(deco_bac06_device::pf_rowscroll_r), FUNC(deco_bac06_device::pf_rowscroll_w)); } void dec0_state::midresb_map(address_map &map) @@ -682,8 +691,7 @@ void dec0_state::slyspy_s_map(address_map &map) { map(0x000000, 0x00ffff).rom(); map(0x080000, 0x0fffff).m(m_sndprotect, FUNC(address_map_bank_device::amap8)); - map(0x1f0000, 0x1f1fff).bankrw("bank8"); - map(0x1ff400, 0x1ff403).w("audiocpu", FUNC(h6280_device::irq_status_w)); + map(0x1f0000, 0x1f1fff).ram(); } // sly spy sound state protection machine emulation @@ -742,18 +750,16 @@ void dec0_state::midres_s_map(address_map &map) map(0x118000, 0x118001).w("ym1", FUNC(ym2203_device::write)); map(0x130000, 0x130001).rw("oki", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); map(0x138000, 0x138001).r(m_soundlatch, FUNC(generic_latch_8_device::read)); - map(0x1f0000, 0x1f1fff).bankrw("bank8"); - map(0x1ff400, 0x1ff403).w("audiocpu", FUNC(h6280_device::irq_status_w)); + map(0x1f0000, 0x1f1fff).ram(); } void dec0_automat_state::machine_start() { - m_adpcm_toggle1 = false; - m_adpcm_toggle2 = false; - save_item(NAME(m_adpcm_toggle1)); - save_item(NAME(m_adpcm_toggle2)); + m_adpcm_toggle[0] = false; + m_adpcm_toggle[1] = false; + save_item(NAME(m_adpcm_toggle)); save_item(NAME(m_automat_scroll_regs)); m_soundbank->configure_entries(0, 8, memregion("audiocpu")->base(), 0x4000); @@ -785,19 +791,19 @@ void dec0_automat_state::automat_map(address_map &map) map(0x242000, 0x24207f).ram(); map(0x242400, 0x2427ff).ram(); map(0x242800, 0x243fff).ram(); - map(0x244000, 0x245fff).ram().rw(m_tilegen1, FUNC(deco_bac06_device::pf_data_r), FUNC(deco_bac06_device::pf_data_w)); + map(0x244000, 0x245fff).ram().rw(m_tilegen[0], FUNC(deco_bac06_device::pf_data_r), FUNC(deco_bac06_device::pf_data_w)); map(0x246000, 0x246007).ram(); /* first tile layer */ map(0x246010, 0x246017).ram(); map(0x248000, 0x24807f).ram(); map(0x248400, 0x2487ff).ram(); - map(0x24a000, 0x24a7ff).ram().rw(m_tilegen2, FUNC(deco_bac06_device::pf_data_r), FUNC(deco_bac06_device::pf_data_w)); + map(0x24a000, 0x24a7ff).ram().rw(m_tilegen[1], FUNC(deco_bac06_device::pf_data_r), FUNC(deco_bac06_device::pf_data_w)); map(0x24c000, 0x24c007).ram(); /* second tile layer */ map(0x24c010, 0x24c017).ram(); map(0x24c800, 0x24c87f).ram(); map(0x24cc00, 0x24cfff).ram(); - map(0x24d000, 0x24d7ff).ram().rw(m_tilegen3, FUNC(deco_bac06_device::pf_data_r), FUNC(deco_bac06_device::pf_data_w)); + map(0x24d000, 0x24d7ff).ram().rw(m_tilegen[2], FUNC(deco_bac06_device::pf_data_r), FUNC(deco_bac06_device::pf_data_w)); map(0x300000, 0x300001).portr("AN0"); map(0x300008, 0x300009).portr("AN1"); @@ -821,13 +827,13 @@ void dec0_automat_state::secretab_map(address_map &map) map(0x000000, 0x05ffff).rom(); // AM_RANGE(0x240000, 0x240007) AM_DEVWRITE("tilegen2", deco_bac06_device, pf_control_0_w) // AM_RANGE(0x240010, 0x240017) AM_DEVWRITE("tilegen2", deco_bac06_device, pf_control_1_w) - map(0x246000, 0x247fff).rw(m_tilegen2, FUNC(deco_bac06_device::pf_data_r), FUNC(deco_bac06_device::pf_data_w)); + map(0x246000, 0x247fff).rw(m_tilegen[1], FUNC(deco_bac06_device::pf_data_r), FUNC(deco_bac06_device::pf_data_w)); // AM_RANGE(0x240000, 0x24007f) AM_DEVREADWRITE("tilegen2", deco_bac06_device, pf_colscroll_r, pf_colscroll_w) // AM_RANGE(0x240400, 0x2407ff) AM_DEVREADWRITE("tilegen2", deco_bac06_device, pf_rowscroll_r, pf_rowscroll_w) // AM_RANGE(0x200000, 0x300007) AM_DEVWRITE("tilegen1", deco_bac06_device, pf_control_0_w) // AM_RANGE(0x300010, 0x300017) AM_DEVWRITE("tilegen1", deco_bac06_device, pf_control_1_w) - map(0x24e000, 0x24ffff).rw(m_tilegen1, FUNC(deco_bac06_device::pf_data_r), FUNC(deco_bac06_device::pf_data_w)); + map(0x24e000, 0x24ffff).rw(m_tilegen[0], FUNC(deco_bac06_device::pf_data_r), FUNC(deco_bac06_device::pf_data_w)); // AM_RANGE(0x340000, 0x34007f) AM_DEVREADWRITE("tilegen1", deco_bac06_device, pf_colscroll_r, pf_colscroll_w) // AM_RANGE(0x340400, 0x3407ff) AM_DEVREADWRITE("tilegen1", deco_bac06_device, pf_rowscroll_r, pf_rowscroll_w) @@ -838,7 +844,7 @@ void dec0_automat_state::secretab_map(address_map &map) map(0x300010, 0x300017).ram(); map(0x300800, 0x30087f).ram(); map(0x300c00, 0x300fff).ram(); - map(0x301000, 0x3017ff).rw(m_tilegen3, FUNC(deco_bac06_device::pf_data_r), FUNC(deco_bac06_device::pf_data_w)); + map(0x301000, 0x3017ff).rw(m_tilegen[2], FUNC(deco_bac06_device::pf_data_r), FUNC(deco_bac06_device::pf_data_w)); map(0x301800, 0x307fff).ram().share("ram"); /* Sly spy main ram */ map(0x310000, 0x3107ff).rw(FUNC(dec0_automat_state::automat_palette_r), FUNC(dec0_automat_state::automat_palette_w)).share("palette"); map(0xb08000, 0xb08fff).ram().share("spriteram"); /* Sprites */ @@ -853,9 +859,9 @@ void dec0_automat_state::automat_s_map(address_map &map) map(0xc800, 0xc801).rw("2203a", FUNC(ym2203_device::read), FUNC(ym2203_device::write)); map(0xd000, 0xd001).rw("2203b", FUNC(ym2203_device::read), FUNC(ym2203_device::write)); map(0xd800, 0xd800).r(m_soundlatch, FUNC(generic_latch_8_device::read)); - map(0xe000, 0xe000).w(m_adpcm_select2, FUNC(ls157_device::ba_w)); + map(0xe000, 0xe000).w(m_adpcm_select[1], FUNC(ls157_device::ba_w)); map(0xe800, 0xe800).w(FUNC(dec0_automat_state::sound_bankswitch_w)); - map(0xf000, 0xf000).w(m_adpcm_select1, FUNC(ls157_device::ba_w)); + map(0xf000, 0xf000).w(m_adpcm_select[0], FUNC(ls157_device::ba_w)); } void dec0_automat_state::secretab_s_map(address_map &map) @@ -866,9 +872,9 @@ void dec0_automat_state::secretab_s_map(address_map &map) map(0xc800, 0xc801).rw("2203a", FUNC(ym2203_device::read), FUNC(ym2203_device::write)); map(0xd000, 0xd001).rw("ym3812", FUNC(ym3812_device::read), FUNC(ym3812_device::write)); map(0xd800, 0xd800).r(m_soundlatch, FUNC(generic_latch_8_device::read)); - map(0xe000, 0xe000).w(m_adpcm_select2, FUNC(ls157_device::ba_w)); + map(0xe000, 0xe000).w(m_adpcm_select[1], FUNC(ls157_device::ba_w)); map(0xe800, 0xe800).w(FUNC(dec0_automat_state::sound_bankswitch_w)); - map(0xf000, 0xf000).w(m_adpcm_select1, FUNC(ls157_device::ba_w)); + map(0xf000, 0xf000).w(m_adpcm_select[0], FUNC(ls157_device::ba_w)); } /******************************************************************************/ @@ -1252,9 +1258,6 @@ static INPUT_PORTS_START( hippodrm ) PORT_DIPSETTING( 0x0000, "3 Dots" ) // 3 Dots less PORT_DIPUNUSED_DIPLOC( 0x8000, IP_ACTIVE_LOW, "SW2:8" ) // Always OFF - PORT_START("VBLANK") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_VBLANK("screen") - PORT_INCLUDE( rotary_null ) INPUT_PORTS_END @@ -1275,6 +1278,9 @@ static INPUT_PORTS_START( ffantasybl ) PORT_DIPSETTING( 0x4000, "2 Dots" ) // 2 Dots less PORT_DIPSETTING( 0x0000, DEF_STR( None ) ) // 0 Dot less + PORT_START("VBLANK") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_VBLANK("screen") + PORT_MODIFY("SYSTEM") PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // Game does not want vblank here INPUT_PORTS_END @@ -1578,10 +1584,6 @@ static GFXDECODE_START( gfx_midres ) GFXDECODE_ENTRY( "gfx4", 0, tilelayout, 0, 16 ) /* Sprites 16x16 */ GFXDECODE_END - - - - static GFXDECODE_START( gfx_automat ) GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0, 16 ) /* Characters 8x8 */ GFXDECODE_ENTRY( "gfx2", 0, automat_tilelayout3, 512, 16 ) /* Tiles 16x16 */ @@ -1705,8 +1707,8 @@ MACHINE_CONFIG_END WRITE8_MEMBER(dec0_automat_state::sound_bankswitch_w) { - m_msm1->reset_w(BIT(data, 3)); - m_msm2->reset_w(BIT(data, 4)); + m_msm[0]->reset_w(BIT(data, 3)); + m_msm[1]->reset_w(BIT(data, 4)); m_soundbank->set_entry(data & 7); } @@ -1716,9 +1718,9 @@ WRITE_LINE_MEMBER(dec0_automat_state::msm1_vclk_cb) if (!state) return; - m_adpcm_toggle1 = !m_adpcm_toggle1; - m_adpcm_select1->select_w(m_adpcm_toggle1); - m_audiocpu->set_input_line(INPUT_LINE_NMI, m_adpcm_toggle1); + m_adpcm_toggle[0] = !m_adpcm_toggle[0]; + m_adpcm_select[0]->select_w(m_adpcm_toggle[0]); + m_audiocpu->set_input_line(INPUT_LINE_NMI, m_adpcm_toggle[0]); } WRITE_LINE_MEMBER(dec0_automat_state::msm2_vclk_cb) @@ -1726,8 +1728,8 @@ WRITE_LINE_MEMBER(dec0_automat_state::msm2_vclk_cb) if (!state) return; - m_adpcm_toggle2 = !m_adpcm_toggle2; - m_adpcm_select2->select_w(m_adpcm_toggle2); + m_adpcm_toggle[1] = !m_adpcm_toggle[1]; + m_adpcm_select[1]->select_w(m_adpcm_toggle[1]); } @@ -1927,8 +1929,12 @@ MACHINE_CONFIG_END MACHINE_CONFIG_START(dec0_state::robocop) dec0(config); - MCFG_DEVICE_ADD("sub", H6280, XTAL(21'477'272) / 16) - MCFG_DEVICE_PROGRAM_MAP(robocop_sub_map) + MCFG_DEVICE_MODIFY("maincpu") + MCFG_DEVICE_PROGRAM_MAP(robocop_map) + + H6280(config, m_subcpu, XTAL(21'477'272) / 16); + m_subcpu->set_addrmap(AS_PROGRAM, &dec0_state::robocop_sub_map); + m_subcpu->add_route(ALL_OUTPUTS, "mono", 0); // internal sound unused MCFG_QUANTUM_TIME(attotime::from_hz(3000)) /* Interleave between HuC6280 & 68000 */ @@ -1948,21 +1954,27 @@ MACHINE_CONFIG_END MACHINE_CONFIG_START(dec0_state::hippodrm) dec0(config); - MCFG_DEVICE_ADD("sub", H6280, XTAL(21'477'272) / 16) - MCFG_DEVICE_PROGRAM_MAP(hippodrm_sub_map) + MCFG_DEVICE_MODIFY("maincpu") + MCFG_DEVICE_PROGRAM_MAP(hippodrm_map) + + H6280(config, m_subcpu, XTAL(21'477'272) / 16); + m_subcpu->set_addrmap(AS_PROGRAM, &dec0_state::hippodrm_sub_map); + m_subcpu->add_route(ALL_OUTPUTS, "mono", 0); // internal sound unused MCFG_QUANTUM_TIME(attotime::from_hz(300)) /* Interleave between H6280 & 68000 */ /* video hardware */ MCFG_SCREEN_MODIFY("screen") MCFG_SCREEN_UPDATE_DRIVER(dec0_state, screen_update_hippodrm) + MCFG_SCREEN_VBLANK_CALLBACK(INPUTLINE("sub", 1)) /* VBL */ MACHINE_CONFIG_END MACHINE_CONFIG_START(dec0_state::ffantasybl) dec0(config); -// MCFG_DEVICE_ADD("sub", H6280, XTAL(21'477'272) / 16) -// MCFG_DEVICE_PROGRAM_MAP(hippodrm_sub_map) +// H6280(config, m_subcpu, XTAL(21'477'272) / 16); +// m_subcpu->set_addrmap(AS_PROGRAM, &dec0_state::hippodrm_sub_map); +// m_subcpu->add_route(ALL_OUTPUTS, "mono", 0); // internal sound unused // MCFG_QUANTUM_TIME(attotime::from_hz(300)) /* Interleave between H6280 & 68000 */ @@ -1989,8 +2001,9 @@ MACHINE_CONFIG_START(dec0_state::slyspy) MCFG_DEVICE_VBLANK_INT_DRIVER("screen", dec0_state, irq6_line_hold) /* VBL, apparently it auto-acks */ // TODO: both games doesn't like /3 here, MT #06740 - MCFG_DEVICE_ADD("audiocpu", H6280, XTAL(12'000'000)/2/2) /* verified on pcb (6Mhz is XIN on pin 10 of H6280) */ - MCFG_DEVICE_PROGRAM_MAP(slyspy_s_map) + h6280_device &audiocpu(H6280(config, m_audiocpu, XTAL(12'000'000)/2/2)); /* verified on pcb (6Mhz is XIN on pin 10 of H6280) */ + audiocpu.set_addrmap(AS_PROGRAM, &dec0_state::slyspy_s_map); + audiocpu.add_route(ALL_OUTPUTS, "mono", 0); // internal sound unused MCFG_DEVICE_ADD("pfprotect", ADDRESS_MAP_BANK, 0) MCFG_DEVICE_PROGRAM_MAP(slyspy_protection_map) @@ -2022,8 +2035,9 @@ MACHINE_CONFIG_START(dec0_state::midres) MCFG_DEVICE_PROGRAM_MAP(midres_map) MCFG_DEVICE_VBLANK_INT_DRIVER("screen", dec0_state, irq6_line_hold)/* VBL */ - MCFG_DEVICE_ADD("audiocpu", H6280, XTAL(24'000'000)/4/3) /* verified on pcb (6Mhz is XIN on pin 10 of H6280, verified on pcb */ - MCFG_DEVICE_PROGRAM_MAP(midres_s_map) + h6280_device &audiocpu(H6280(config, m_audiocpu, XTAL(24'000'000)/4/3)); /* verified on pcb (6Mhz is XIN on pin 10 of H6280, verified on pcb */ + audiocpu.set_addrmap(AS_PROGRAM, &dec0_state::midres_s_map); + audiocpu.add_route(ALL_OUTPUTS, "mono", 0); // internal sound unused /* video hardware */ MCFG_SCREEN_MODIFY("screen") @@ -3763,11 +3777,11 @@ GAME( 1987, hbarrelw, hbarrel, hbarrel, hbarrel, dec0_state, init_hbarr GAME( 1988, baddudes, 0, baddudes, baddudes, dec0_state, init_hbarrel, ROT0, "Data East USA", "Bad Dudes vs. Dragonninja (US)", MACHINE_SUPPORTS_SAVE ) GAME( 1988, drgninja, baddudes, baddudes, drgninja, dec0_state, init_hbarrel, ROT0, "Data East Corporation", "Dragonninja (Japan)", MACHINE_SUPPORTS_SAVE ) GAME( 1988, birdtry, 0, birdtry, birdtry, dec0_state, init_birdtry, ROT270, "Data East Corporation", "Birdie Try (Japan)", MACHINE_UNEMULATED_PROTECTION | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // protection controls game related data, impossible to emulate without a working PCB -GAME( 1988, robocop, 0, robocop, robocop, dec0_state, init_robocop, ROT0, "Data East Corporation", "Robocop (World revision 4)", MACHINE_SUPPORTS_SAVE ) -GAME( 1988, robocopw, robocop, robocop, robocop, dec0_state, init_robocop, ROT0, "Data East Corporation", "Robocop (World revision 3)", MACHINE_SUPPORTS_SAVE ) -GAME( 1988, robocopj, robocop, robocop, robocop, dec0_state, init_robocop, ROT0, "Data East Corporation", "Robocop (Japan)", MACHINE_SUPPORTS_SAVE ) -GAME( 1988, robocopu, robocop, robocop, robocop, dec0_state, init_robocop, ROT0, "Data East USA", "Robocop (US revision 1)", MACHINE_SUPPORTS_SAVE ) -GAME( 1988, robocopu0, robocop, robocop, robocop, dec0_state, init_robocop, ROT0, "Data East USA", "Robocop (US revision 0)", MACHINE_SUPPORTS_SAVE ) +GAME( 1988, robocop, 0, robocop, robocop, dec0_state, empty_init, ROT0, "Data East Corporation", "Robocop (World revision 4)", MACHINE_SUPPORTS_SAVE ) +GAME( 1988, robocopw, robocop, robocop, robocop, dec0_state, empty_init, ROT0, "Data East Corporation", "Robocop (World revision 3)", MACHINE_SUPPORTS_SAVE ) +GAME( 1988, robocopj, robocop, robocop, robocop, dec0_state, empty_init, ROT0, "Data East Corporation", "Robocop (Japan)", MACHINE_SUPPORTS_SAVE ) +GAME( 1988, robocopu, robocop, robocop, robocop, dec0_state, empty_init, ROT0, "Data East USA", "Robocop (US revision 1)", MACHINE_SUPPORTS_SAVE ) +GAME( 1988, robocopu0, robocop, robocop, robocop, dec0_state, empty_init, ROT0, "Data East USA", "Robocop (US revision 0)", MACHINE_SUPPORTS_SAVE ) GAME( 1989, hippodrm, 0, hippodrm, hippodrm, dec0_state, init_hippodrm, ROT0, "Data East USA", "Hippodrome (US)", MACHINE_SUPPORTS_SAVE ) GAME( 1989, ffantasy, hippodrm, hippodrm, ffantasy, dec0_state, init_hippodrm, ROT0, "Data East Corporation", "Fighting Fantasy (Japan revision 3)", MACHINE_SUPPORTS_SAVE ) GAME( 1989, ffantasyj, hippodrm, hippodrm, ffantasy, dec0_state, init_hippodrm, ROT0, "Data East Corporation", "Fighting Fantasy (Japan revision 2)", MACHINE_SUPPORTS_SAVE ) @@ -3787,7 +3801,7 @@ GAME( 1990, bouldashj, bouldash, slyspy, bouldash, dec0_state, init_slysp // bootlegs // more or less just an unprotected versions of the game, everything intact -GAME( 1988, robocopb, robocop, robocopb, robocop, dec0_state, init_robocop, ROT0, "bootleg", "Robocop (World bootleg)", MACHINE_SUPPORTS_SAVE ) +GAME( 1988, robocopb, robocop, robocopb, robocop, dec0_state, empty_init, ROT0, "bootleg", "Robocop (World bootleg)", MACHINE_SUPPORTS_SAVE ) GAME( 1988, drgninjab, baddudes, drgninjab, drgninja, dec0_state, init_drgninja, ROT0, "bootleg", "Dragonninja (bootleg)", MACHINE_SUPPORTS_SAVE ) @@ -3798,5 +3812,5 @@ GAME( 1989, ffantasybl, hippodrm, ffantasybl, ffantasybl, dec0_state, init_ffant GAME( 1988, drgninjab2, baddudes, drgninjab, drgninja, dec0_state, init_drgninja, ROT0, "bootleg", "Dragonninja (bootleg with 68705)", MACHINE_SUPPORTS_SAVE ) // is this the same board as above? (region warning hacked to World, but still shows Japanese text) // these are different to the above but quite similar to each other -GAME( 1988, automat, robocop, automat, robocop, dec0_automat_state, init_robocop, ROT0, "bootleg", "Automat (bootleg of Robocop)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) // sound rom / music from section z with mods for ADPCM? +GAME( 1988, automat, robocop, automat, robocop, dec0_automat_state, empty_init, ROT0, "bootleg", "Automat (bootleg of Robocop)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) // sound rom / music from section z with mods for ADPCM? GAME( 1989, secretab, secretag, secretab, slyspy, dec0_automat_state, empty_init, ROT0, "bootleg", "Secret Agent (bootleg)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/drivers/deco32.cpp b/src/mame/drivers/deco32.cpp index e182c7bcd40..88d46984215 100644 --- a/src/mame/drivers/deco32.cpp +++ b/src/mame/drivers/deco32.cpp @@ -650,8 +650,6 @@ void deco32_state::h6280_sound_map(address_map &map) map(0x130000, 0x130001).rw("oki2", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); map(0x140000, 0x140000).r(m_ioprot, FUNC(deco_146_base_device::soundlatch_r)); map(0x1f0000, 0x1f1fff).ram(); - map(0x1fec00, 0x1fec01).rw("audiocpu", FUNC(h6280_device::timer_r), FUNC(h6280_device::timer_w)).mirror(0x3fe); - map(0x1ff400, 0x1ff403).rw("audiocpu", FUNC(h6280_device::irq_status_r), FUNC(h6280_device::irq_status_w)).mirror(0x3fc); } void deco32_state::h6280_sound_custom_latch_map(address_map &map) @@ -1869,8 +1867,10 @@ MACHINE_CONFIG_START(captaven_state::captaven) MCFG_DEVICE_ADD("maincpu", ARM, XTAL(28'000'000)/4) /* verified on pcb (Data East 101 custom)*/ MCFG_DEVICE_PROGRAM_MAP(captaven_map) - MCFG_DEVICE_ADD("audiocpu", H6280, XTAL(32'220'000)/4/3) /* pin 10 is 32mhz/4, pin 14 is High so internal divisor is 3 (verified on pcb) */ - MCFG_DEVICE_PROGRAM_MAP(h6280_sound_map) + h6280_device &audiocpu(H6280(config, m_audiocpu, XTAL(32'220'000)/4/3)); /* pin 10 is 32mhz/4, pin 14 is High so internal divisor is 3 (verified on pcb) */ + audiocpu.set_addrmap(AS_PROGRAM, &captaven_state::h6280_sound_map); + audiocpu.add_route(ALL_OUTPUTS, "lspeaker", 0); // internal sound unused + audiocpu.add_route(ALL_OUTPUTS, "rspeaker", 0); MCFG_INPUT_MERGER_ANY_HIGH("irq_merger") MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("maincpu", ARM_IRQ_LINE)) @@ -1956,8 +1956,10 @@ MACHINE_CONFIG_START(fghthist_state::fghthist) MCFG_DEVICE_PROGRAM_MAP(fghthist_map) MCFG_DEVICE_VBLANK_INT_DRIVER("screen", deco32_state, irq0_line_assert) - MCFG_DEVICE_ADD("audiocpu", H6280, XTAL(32'220'000) / 8) - MCFG_DEVICE_PROGRAM_MAP(h6280_sound_custom_latch_map) + h6280_device &audiocpu(H6280(config, m_audiocpu, XTAL(32'220'000) / 8)); + audiocpu.set_addrmap(AS_PROGRAM, &fghthist_state::h6280_sound_custom_latch_map); + audiocpu.add_route(ALL_OUTPUTS, "lspeaker", 0); // internal sound unused + audiocpu.add_route(ALL_OUTPUTS, "rspeaker", 0); MCFG_DEVICE_ADD("eeprom", EEPROM_SERIAL_93C46_16BIT) @@ -2079,8 +2081,10 @@ MACHINE_CONFIG_START(dragngun_state::dragngun) MCFG_DEVICE_ADD("maincpu", ARM, XTAL(28'000'000) / 4) MCFG_DEVICE_PROGRAM_MAP(dragngun_map) - MCFG_DEVICE_ADD("audiocpu", H6280, 32220000/8) - MCFG_DEVICE_PROGRAM_MAP(h6280_sound_map) + h6280_device &audiocpu(H6280(config, m_audiocpu, 32220000/8)); + audiocpu.set_addrmap(AS_PROGRAM, &dragngun_state::h6280_sound_map); + audiocpu.add_route(ALL_OUTPUTS, "lspeaker", 0); // internal sound unused + audiocpu.add_route(ALL_OUTPUTS, "rspeaker", 0); MCFG_INPUT_MERGER_ANY_HIGH("irq_merger") MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("maincpu", ARM_IRQ_LINE)) @@ -2469,9 +2473,12 @@ MACHINE_CONFIG_END // the US release uses a H6280 instead of a Z80, much like Lock 'n' Loaded MACHINE_CONFIG_START(nslasher_state::nslasheru) nslasher(config); + MCFG_DEVICE_REMOVE("audiocpu") - MCFG_DEVICE_REPLACE("audiocpu", H6280, 32220000/8) - MCFG_DEVICE_PROGRAM_MAP(h6280_sound_map) + h6280_device &audiocpu(H6280(config, m_audiocpu, 32220000/8)); + audiocpu.set_addrmap(AS_PROGRAM, &nslasher_state::h6280_sound_map); + audiocpu.add_route(ALL_OUTPUTS, "lspeaker", 0); // internal sound unused + audiocpu.add_route(ALL_OUTPUTS, "rspeaker", 0); MCFG_DEVICE_REMOVE("sound_irq_merger") diff --git a/src/mame/drivers/diablo1300.cpp b/src/mame/drivers/diablo1300.cpp index de029270cd4..868a3f7867b 100644 --- a/src/mame/drivers/diablo1300.cpp +++ b/src/mame/drivers/diablo1300.cpp @@ -6,7 +6,7 @@ - Microprocessor based control logic for increased capacity and flexibility, plus provision for implementation of additional features. - Advanced servo design for improved efficiency and performance. - - Rigid one piece cast aluminum frame to better maintain print quality, and reduce maintenance requirements. + - Rigid one piece cast aluminium frame to better maintain print quality, and reduce maintenance requirements. - Rugged highly stable carriage assembly for enhanced print position accuracy and reduced maintenance. - Plug-in interchangeable printed pircuit boards (PCB's), readily accessible for ease and simplicity of service, and implementation of options and interfaces. @@ -96,7 +96,7 @@ The board is marked 40510 and has no connectors except the 56 signal bus edge co 4 74S289 4x16 bit RAM 1 74107 Dual J-K M/S flip flops w clear 1 74LS155 7731 1/2/3 to 4/8 lines decoder nwih totem pole ouputs - 2 74161 7904 synchronous binary 4 bit counter + 2 74161 7904 Synchronous binary 4 bit counter 4 74LS259 7906 8 bit addressable latches 4 74298 7849 Quad 2 input mux with storage 1 74367 7840 Non inverted 3 state outputs, 2 and 4 line enabled inputs @@ -117,7 +117,7 @@ The serial interface card is z80 based and marked DIABLO-1300-V24 3 7432N 7832 QUAD OR gates 1 1489 7841 Quad line receivers 1 1488 7823 Quad line tranceivers - 1 74163 7827 Synchrounous 4 bit counters + 1 74163 7827 Synchronous 4 bit counters 2 7493 7822 4 bit binary counters 2 7404 7849 Hex inverters 1 7410 7849 Tripple 3-input NAND gates diff --git a/src/mame/drivers/didact.cpp b/src/mame/drivers/didact.cpp index aa23a5fcf71..02ffff4052f 100644 --- a/src/mame/drivers/didact.cpp +++ b/src/mame/drivers/didact.cpp @@ -232,7 +232,7 @@ WRITE8_MEMBER( md6802_state::pia2_kbA_w ) m_7segs[digit_nbr] = m_segments; } -/* PIA 2 Port B is all outputs to drive the display so it is very unlikelly that this function is called */ +/* PIA 2 Port B is all outputs to drive the display so it is very unlikely that this function is called */ READ8_MEMBER( md6802_state::pia2_kbB_r ) { LOG("Warning, trying to read from Port B designated to drive the display, please check why\n"); @@ -379,7 +379,7 @@ WRITE8_MEMBER( mp68a_state::pia2_kbA_w ) uint8_t const digit_nbr = (data >> 4) & 0x07; /* There is actually only one 9368 and a 74145 to drive the cathode of the right digit low */ - /* This can be emulated by prentending there are one 9368 per digit, at least for now */ + /* This can be emulated by pretending there are one 9368 per digit, at least for now */ switch (digit_nbr) { case 0: diff --git a/src/mame/drivers/dietgo.cpp b/src/mame/drivers/dietgo.cpp index 9ce2b3f3273..9e8a9702740 100644 --- a/src/mame/drivers/dietgo.cpp +++ b/src/mame/drivers/dietgo.cpp @@ -82,8 +82,6 @@ void dietgo_state::sound_map(address_map &map) map(0x130000, 0x130001).noprw(); /* This board only has 1 oki chip */ map(0x140000, 0x140000).r(m_deco104, FUNC(deco104_device::soundlatch_r)); map(0x1f0000, 0x1f1fff).ram(); - map(0x1fec00, 0x1fec01).rw(m_audiocpu, FUNC(h6280_device::timer_r), FUNC(h6280_device::timer_w)).mirror(0x3fe); - map(0x1ff400, 0x1ff403).rw(m_audiocpu, FUNC(h6280_device::irq_status_r), FUNC(h6280_device::irq_status_w)).mirror(0x3fc); } @@ -204,7 +202,7 @@ GFXDECODE_END DECO16IC_BANK_CB_MEMBER(dietgo_state::bank_callback) { - return ((bank >> 4) & 0x7) * 0x1000; + return (bank & 0x70) << 8; } MACHINE_CONFIG_START(dietgo_state::dietgo) @@ -215,8 +213,9 @@ MACHINE_CONFIG_START(dietgo_state::dietgo) MCFG_DEVICE_OPCODES_MAP(decrypted_opcodes_map) MCFG_DEVICE_VBLANK_INT_DRIVER("screen", dietgo_state, irq6_line_hold) - MCFG_DEVICE_ADD("audiocpu", H6280, XTAL(32'220'000)/4/3) /* Custom chip 45; XIN is 32.220MHZ/4, verified on pcb */ - MCFG_DEVICE_PROGRAM_MAP(sound_map) + H6280(config, m_audiocpu, XTAL(32'220'000)/4/3); /* Custom chip 45; XIN is 32.220MHZ/4, verified on pcb */ + m_audiocpu->set_addrmap(AS_PROGRAM, &dietgo_state::sound_map); + m_audiocpu->add_route(ALL_OUTPUTS, "mono", 0); // internal sound unused /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) diff --git a/src/mame/drivers/dooyong.cpp b/src/mame/drivers/dooyong.cpp index 148e828b8c5..fa73754a06d 100644 --- a/src/mame/drivers/dooyong.cpp +++ b/src/mame/drivers/dooyong.cpp @@ -691,7 +691,7 @@ void dooyong_68k_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap int const color = buffered_spriteram[offs+7] & 0x000f; //TODO: This priority mechanism works for known games, but seems a bit strange. //Are we missing something? (The obvious spare palette bit isn't it.) - int const pri = (((color == 0x00) || (color == 0x0f)) ? 0xfc : 0xf0); + int const pri = GFX_PMASK_4 | (((color == 0x00) || (color == 0x0f)) ? GFX_PMASK_2 : 0); int const width = buffered_spriteram[offs+1] & 0x000f; int const height = (buffered_spriteram[offs+1] & 0x00f0) >> 4; @@ -753,12 +753,12 @@ uint32_t popbingo_state::screen_update_popbingo(screen_device &screen, bitmap_in m_bg_bitmap[1].fill(m_palette->black_pen(), cliprect); m_bg[1]->draw(screen, m_bg_bitmap[1], cliprect, 0, 1); - for (int y = cliprect.min_y; cliprect.max_y >= y; y++) + for (int y = cliprect.top(); cliprect.bottom() >= y; y++) { uint16_t const *const bg_src(&m_bg_bitmap[0].pix16(y, 0)); uint16_t const *const bg2_src(&m_bg_bitmap[1].pix16(y, 0)); uint16_t *const dst(&bitmap.pix16(y, 0)); - for (int x = cliprect.min_x; cliprect.max_x >= x; x++) + for (int x = cliprect.left(); cliprect.right() >= x; x++) dst[x] = 0x100U | (bg_src[x] << 4) | bg2_src[x]; } diff --git a/src/mame/drivers/e100.cpp b/src/mame/drivers/e100.cpp index defef190edf..67264bd920e 100644 --- a/src/mame/drivers/e100.cpp +++ b/src/mame/drivers/e100.cpp @@ -10,7 +10,7 @@ * extended with commands suitable for educational experiments using the exapansion bus and its built in * io control capabilities. * - * The Esselte 1000 was an educational package based on Apple II plus software and litterature but the relation + * The Esselte 1000 was an educational package based on Apple II plus software and literature but the relation * to Didact is at this point unknown so it is probably a pure Esselte software production. If this branded * distribution is recovered it will be added as a clone of the Apple II driver or just as softlist item. * @@ -97,7 +97,7 @@ * |DIDACT ESS 100 CPU +----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ +----++ | * |___________________________________________________________________________________________________________+----+__+----+__+----+_____+---- * - * rev2 board had 4Kb more ROM memory, 2 x 2764 instead of the 6 x 2716 (note the rev1 piggy back on righ most 2716) with funny address decoding. + * rev2 board had 4Kb more ROM memory, 2 x 2764 instead of the 6 x 2716 (note the rev1 piggyback on rightmost 2716) with funny address decoding. * Once we get a rom dump for rev 1 the driver need to accomodate another keymap too so probably needs to be splitted somehow. * __________________________________________________________________________________________________________________________________________ * | The Didact Esselte 100 CPU board rev2, 15/4 1983 in-PCB coil +---- @@ -344,7 +344,7 @@ READ8_MEMBER( e100_state::pia1_kbA_r ) PB4-PB5 together with CA1, CA2, CB1 and CB2 are used for the printer interface PB6-PB7 forms the cassette interface - The serial bitbanging perform enreliable atm, can be poor original code or inexact CPU timing. + The serial bitbanging perform unreliable atm, can be poor original code or inexact CPU timing. Best results is achieved with 8 bit at 9600 baud as follows: mame e100 -window -rs232 null_modem -bitbngr socket.127.0.0.1:4321 diff --git a/src/mame/drivers/efdt.cpp b/src/mame/drivers/efdt.cpp index 78c113c60cc..7a6bfbb2280 100644 --- a/src/mame/drivers/efdt.cpp +++ b/src/mame/drivers/efdt.cpp @@ -162,6 +162,7 @@ #include "includes/efdt.h" #include "cpu/z80/z80.h" #include "cpu/m6800/m6800.h" +#include "machine/watchdog.h" #include "sound/ay8910.h" #include "screen.h" #include "speaker.h" @@ -229,12 +230,22 @@ VIDEO_START_MEMBER(efdt_state, efdt) m_tilemap[1]->set_transparent_pen(0); } -uint32_t efdt_state::screen_update_efdt(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +WRITE_LINE_MEMBER(efdt_state::vblank_nmi_w) { - int bank = m_vregs1[7]; + if (state && m_vlatch[0]->q0_r()) + m_maincpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE); +} + +WRITE_LINE_MEMBER(efdt_state::nmi_clear_w) +{ + if (!state) + m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE); +} - if (m_vregs1[4] != 0xff) //startup tests require tile bank 1, but 0 is set to the vregs (reset sets it to 1?) - bank = 1; +uint32_t efdt_state::screen_update_efdt(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + int bank = m_vlatch[0]->q7_r() | (m_vlatch[1]->q0_r() << 1) | (m_vlatch[1]->q1_r() << 2); + //startup tests require tile bank 1, but 0 is set to the vregs (reset sets it to 1?) m_tilebank = bank << 8; @@ -336,7 +347,7 @@ uint32_t efdt_state::screen_update_efdt(screen_device &screen, bitmap_ind16 &bit void efdt_state::efdt_map(address_map &map) { - map(0x0000, 0x7fff).rom(); + map(0x0000, 0x7fff).rom().region("maincpu", 0); map(0x8000, 0x87ff).ram(); map(0x8800, 0x8803).rw(FUNC(efdt_state::main_soundlatch_r), FUNC(efdt_state::main_soundlatch_w)); @@ -346,13 +357,16 @@ void efdt_state::efdt_map(address_map &map) map(0x9400, 0x97ff).portr("P2"); map(0xa000, 0xafff).ram().share("videoram"); - map(0xb400, 0xb40f).ram().share("vregs1"); - map(0xb800, 0xb80f).ram().share("vregs2"); + map(0xb000, 0xb000).r("watchdog", FUNC(watchdog_timer_device::reset_r)); + map(0xb400, 0xb407).w(m_vlatch[0], FUNC(ls259_device::write_d0)); + map(0xb800, 0xb807).w(m_vlatch[1], FUNC(ls259_device::write_d0)); } void efdt_state::efdt_snd_map(address_map &map) { map(0x0000, 0x007f).ram(); + map(0x6000, 0x6000).nopw(); + map(0x7000, 0x7000).nopw(); map(0x8000, 0x83ff).ram(); map(0x9000, 0x9000).rw("ay1", FUNC(ay8910_device::data_r), FUNC(ay8910_device::data_w)); @@ -361,7 +375,7 @@ void efdt_state::efdt_snd_map(address_map &map) map(0x9400, 0x9400).rw("ay2", FUNC(ay8910_device::data_r), FUNC(ay8910_device::data_w)); map(0x9600, 0x9600).w("ay2", FUNC(ay8910_device::address_w)); - map(0xe000, 0xffff).rom(); + map(0xe000, 0xffff).rom().region("audiocpu", 0); } @@ -537,12 +551,18 @@ MACHINE_CONFIG_START( efdt_state::efdt ) /* basic machine hardware */ MCFG_DEVICE_ADD("maincpu", Z80, Z80_CLOCK) MCFG_DEVICE_PROGRAM_MAP(efdt_map) - MCFG_DEVICE_VBLANK_INT_DRIVER("screen", efdt_state, nmi_line_pulse) MCFG_DEVICE_ADD("audiocpu", M6802, F6802_CLOCK) MCFG_DEVICE_PROGRAM_MAP(efdt_snd_map) MCFG_DEVICE_PERIODIC_INT_DRIVER(efdt_state, irq0_line_hold, F6802_CLOCK / 8192) + LS259(config, m_vlatch[0]); + m_vlatch[0]->q_out_cb<0>().set(FUNC(efdt_state::nmi_clear_w)); + + LS259(config, m_vlatch[1]); + + WATCHDOG_TIMER(config, "watchdog"); + /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) @@ -551,6 +571,7 @@ MACHINE_CONFIG_START( efdt_state::efdt ) MCFG_SCREEN_VISIBLE_AREA(0, 32*8 - 1, 16, 30*8 - 1) MCFG_SCREEN_UPDATE_DRIVER(efdt_state, screen_update_efdt) MCFG_SCREEN_PALETTE("palette") + MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, efdt_state, vblank_nmi_w)) MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_efdt) MCFG_PALETTE_ADD("palette", 64) @@ -591,9 +612,9 @@ ROM_START( efdt ) ROM_LOAD( "22801.a10", 0x4000, 0x1000, CRC(ea646049) SHA1(bca30cb2dde8b5c78f6108cb9a43e0dce697f761)) ROM_LOAD( "22802.a9", 0x5000, 0x1000, CRC(74457952) SHA1(f5f4ece564cbdb650204ccd5abdf39d0d3c595b3)) - ROM_REGION( 0x10000, "audiocpu", 0 ) - ROM_LOAD( "1811.d8", 0xE000, 0x1000, CRC(0ff5d0c2) SHA1(93df487d3236284765dd3d690474c130464e3e27)) - ROM_LOAD( "1812.d7", 0xF000, 0x1000, CRC(48e5a4ac) SHA1(9da4800215c91b2be9df3375f9601b19353c0ec0)) + ROM_REGION( 0x2000, "audiocpu", 0 ) + ROM_LOAD( "1811.d8", 0x0000, 0x1000, CRC(0ff5d0c2) SHA1(93df487d3236284765dd3d690474c130464e3e27)) + ROM_LOAD( "1812.d7", 0x1000, 0x1000, CRC(48e5a4ac) SHA1(9da4800215c91b2be9df3375f9601b19353c0ec0)) ROM_REGION( 0x9000, "gfx1", 0 ) ROM_LOAD( "12822.j3", 0x2000, 0x1000, CRC(f4d28a60) SHA1(bc1d7f4392805cd204ecfe9c3301990a7b710567) ) diff --git a/src/mame/drivers/emate.cpp b/src/mame/drivers/emate.cpp new file mode 100644 index 00000000000..38b165ef06f --- /dev/null +++ b/src/mame/drivers/emate.cpp @@ -0,0 +1,96 @@ +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz +/*************************************************************************** + + Apple eMate 300 skeleton driver + + CPU: ARM 710a (32 bit RISC Processor) + Memory: 1Mbyte of RAM, 2Mbytes of flash ROM + Graphics: 480x320 16-level grayscale LCD with backlight + Sound: Unknown + Input: Keyboard, touchscreen + Other: 2 serial ports, 1 IR port, 1 PCMCIA slot + +****************************************************************************/ + +#include "emu.h" +#include "cpu/arm7/arm7.h" +#include "cpu/arm7/arm7core.h" +#include "machine/ram.h" +#include "emupal.h" +#include "screen.h" + +class emate_state : public driver_device +{ +public: + emate_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) + , m_maincpu(*this, "maincpu") + , m_ram(*this, "ram") + { } + + void emate(machine_config &config); + +protected: + void palette_init(palette_device &palette); + uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + + void mem_map(address_map &map); + + required_device<arm710a_cpu_device> m_maincpu; + required_device<ram_device> m_ram; +}; + +void emate_state::mem_map(address_map &map) +{ + map(0x00000000, 0x001fffff).rom().region("maincpu", 0); +} + +static INPUT_PORTS_START( emate ) +INPUT_PORTS_END + +void emate_state::palette_init(palette_device &palette) +{ + for (int i = 0; i < 16; i++) + { + const uint8_t gray = (i << 4) | i; + palette.set_pen_color(15 - i, rgb_t(gray, gray, gray)); + } +} + +uint32_t emate_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +{ + bitmap.fill(0); + return 0; +} + +void emate_state::emate(machine_config &config) +{ + ARM710A(config, m_maincpu, XTAL(25'000'000)); + m_maincpu->set_addrmap(AS_PROGRAM, &emate_state::mem_map); + + /* video hardware */ + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD)); + screen.set_refresh_hz(60); + screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */ + screen.set_size(480, 320); + screen.set_visarea(0, 480-1, 0, 320-1); + screen.set_screen_update(FUNC(emate_state::screen_update)); + + palette_device &palette(PALETTE(config, "palette", 16)); + palette.set_init(DEVICE_SELF_OWNER, FUNC(emate_state::palette_init)); + + RAM(config, m_ram); + m_ram->set_default_size("2M"); +} + +/* ROM definition */ +ROM_START( emate ) + ROM_REGION32_LE( 0x800000, "maincpu", 0 ) + ROM_LOAD( "ematev22.bin", 0x000000, 0x800000, CRC(5fb47dd8) SHA1(6ae880493ddde880827d1e9f08e9cb2c38f9f2ec) ) +ROM_END + +/* Driver */ + +// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS +CONS( 1997, emate, 0, 0, emate, emate, emate_state, empty_init, "Apple Computer", "eMate 300", MACHINE_IS_SKELETON ) diff --git a/src/mame/drivers/enmirage.cpp b/src/mame/drivers/enmirage.cpp index d299c13dc17..a41abd4f9e1 100644 --- a/src/mame/drivers/enmirage.cpp +++ b/src/mame/drivers/enmirage.cpp @@ -220,36 +220,36 @@ WRITE8_MEMBER(enmirage_state::mirage_via_write_portb) } } -MACHINE_CONFIG_START(enmirage_state::mirage) - MCFG_DEVICE_ADD("maincpu", MC6809E, 2000000) - MCFG_DEVICE_PROGRAM_MAP(mirage_map) +void enmirage_state::mirage(machine_config &config) +{ + MC6809E(config, m_maincpu, 2000000); + m_maincpu->set_addrmap(AS_PROGRAM, &enmirage_state::mirage_map); config.set_default_layout(layout_mirage); SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); - MCFG_ES5503_ADD("es5503", 7000000) - MCFG_ES5503_OUTPUT_CHANNELS(2) - MCFG_ES5503_IRQ_FUNC(WRITELINE(*this, enmirage_state, mirage_doc_irq)) - MCFG_ES5503_ADC_FUNC(READ8(*this, enmirage_state, mirage_adc_read)) - - MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) - MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) - - MCFG_DEVICE_ADD("via6522", VIA6522, 1000000) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, enmirage_state, mirage_via_write_porta)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, enmirage_state, mirage_via_write_portb)) - MCFG_VIA6522_IRQ_HANDLER(INPUTLINE("maincpu", M6809_IRQ_LINE)) - - MCFG_DEVICE_ADD("acia6850", ACIA6850, 0) - MCFG_ACIA6850_IRQ_HANDLER(INPUTLINE("maincpu", M6809_FIRQ_LINE)) - - MCFG_DEVICE_ADD("wd1772", WD1772, 8000000) - MCFG_WD_FDC_INTRQ_CALLBACK(INPUTLINE("maincpu", INPUT_LINE_NMI)) - MCFG_WD_FDC_DRQ_CALLBACK(INPUTLINE("maincpu", M6809_IRQ_LINE)) - - MCFG_FLOPPY_DRIVE_ADD("wd1772:0", ensoniq_floppies, "35dd", enmirage_state::floppy_formats) -MACHINE_CONFIG_END + es5503_device &es5503(ES5503(config, "es5503", 7000000)); + es5503.set_channels(2); + es5503.irq_func().set(FUNC(enmirage_state::mirage_doc_irq)); + es5503.adc_func().set(FUNC(enmirage_state::mirage_adc_read)); + es5503.add_route(0, "lspeaker", 1.0); + es5503.add_route(1, "rspeaker", 1.0); + + VIA6522(config, m_via, 1000000); + m_via->writepa_handler().set(FUNC(enmirage_state::mirage_via_write_porta)); + m_via->writepb_handler().set(FUNC(enmirage_state::mirage_via_write_portb)); + m_via->irq_handler().set_inputline(m_maincpu, M6809_IRQ_LINE); + + acia6850_device &acia6850(ACIA6850(config, "acia6850", 0)); + acia6850.irq_handler().set_inputline(m_maincpu, M6809_FIRQ_LINE); + + WD1772(config, m_fdc, 8000000); + m_fdc->intrq_wr_callback().set_inputline(m_maincpu, INPUT_LINE_NMI); + m_fdc->drq_wr_callback().set_inputline(m_maincpu, M6809_IRQ_LINE); + + FLOPPY_CONNECTOR(config, "wd1772:0", ensoniq_floppies, "35dd", enmirage_state::floppy_formats); +} static INPUT_PORTS_START( mirage ) INPUT_PORTS_END diff --git a/src/mame/drivers/fccpu30.cpp b/src/mame/drivers/fccpu30.cpp index 848b0ed0de5..e89a2fa61e1 100644 --- a/src/mame/drivers/fccpu30.cpp +++ b/src/mame/drivers/fccpu30.cpp @@ -72,10 +72,10 @@ *--------------------------- * 1981 Force Computers was founded in San Jose, California. Over time a European headquarter was opened * in Munich, Germany, and a Japanese headquarter in Tokyo - * 1996 Force was aquired by Solectron Corporation in 1996 + * 1996 Force was acquired by Solectron Corporation in 1996 * 2004 Force was sold off from Solectron to Motorola - * 2008 Force was aquired by Emerson as part of the Motorola Embedded Division - * 2016 Force was aquired by Platinum Equity as part of the Emerson Network Power Division + * 2008 Force was acquired by Emerson as part of the Motorola Embedded Division + * 2016 Force was acquired by Platinum Equity as part of the Emerson Network Power Division * * Force developed and produced VME board products based on SPARC, Pentium, PowerPC and 68K. * diff --git a/src/mame/drivers/firefox.cpp b/src/mame/drivers/firefox.cpp index 994b6f47edb..8aaf78ffc7b 100644 --- a/src/mame/drivers/firefox.cpp +++ b/src/mame/drivers/firefox.cpp @@ -251,14 +251,14 @@ void firefox_state::video_start() { m_bgtiles = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(firefox_state::bgtile_get_info),this), TILEMAP_SCAN_ROWS, 8,8, 64,64); m_bgtiles->set_transparent_pen(0); - m_bgtiles->set_scrolldy(m_screen->visible_area().min_y, 0); + m_bgtiles->set_scrolldy(m_screen->visible_area().top(), 0); } uint32_t firefox_state::screen_update_firefox(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { int sprite; - int gfxtop = screen.visible_area().min_y; + int gfxtop = screen.visible_area().top(); bitmap.fill(m_palette->pen_color(256), cliprect); @@ -701,12 +701,12 @@ MACHINE_CONFIG_START(firefox_state::firefox) X2212(config, "nvram_1c").set_auto_save(true); X2212(config, "nvram_1d").set_auto_save(true); - MCFG_DEVICE_ADD("riot", RIOT6532, MASTER_XTAL/8) - MCFG_RIOT6532_IN_PA_CB(READ8(*this, firefox_state, riot_porta_r)) - MCFG_RIOT6532_OUT_PA_CB(WRITE8(*this, firefox_state, riot_porta_w)) - MCFG_RIOT6532_IN_PB_CB(READ8("tms", tms5220_device, status_r)) - MCFG_RIOT6532_OUT_PB_CB(WRITE8("tms", tms5220_device, data_w)) - MCFG_RIOT6532_IRQ_CB(INPUTLINE("audiocpu", M6502_IRQ_LINE)) + riot6532_device &riot(RIOT6532(config, "riot", MASTER_XTAL/8)); + riot.in_pa_callback().set(FUNC(firefox_state::riot_porta_r)); + riot.out_pa_callback().set(FUNC(firefox_state::riot_porta_w)); + riot.in_pb_callback().set("tms", FUNC(tms5220_device::status_r)); + riot.out_pb_callback().set("tms", FUNC(tms5220_device::data_w)); + riot.irq_callback().set_inputline("audiocpu", M6502_IRQ_LINE); /* sound hardware */ SPEAKER(config, "lspeaker").front_left(); diff --git a/src/mame/drivers/fontwriter.cpp b/src/mame/drivers/fontwriter.cpp index ff07676d05a..0663d015b89 100644 --- a/src/mame/drivers/fontwriter.cpp +++ b/src/mame/drivers/fontwriter.cpp @@ -10,6 +10,7 @@ FDC: NEC 72068 (entire PC controller on a chip) 512k RAM Custom gate array + AT28C16 parallel EPROM 640x400 dot-matrix LCD Things to check @@ -22,6 +23,7 @@ #include "emu.h" #include "cpu/m37710/m37710.h" #include "machine/nvram.h" +#include "machine/at28c16.h" #include "screen.h" #include "speaker.h" @@ -34,6 +36,7 @@ public: { } void fontwriter(machine_config &config); + void fw600(machine_config &config); private: virtual void machine_reset() override; @@ -46,15 +49,21 @@ private: m_vbl ^= 0xff; return m_vbl; } + DECLARE_READ8_MEMBER(vbl2_r) + { + m_vbl2 ^= 0x88; + return m_vbl; + } void io_map(address_map &map); void main_map(address_map &map); + void fw600_map(address_map &map); // devices required_device<m37720s1_device> m_maincpu; // driver_device overrides virtual void video_start() override; - uint8_t m_vbl; + uint8_t m_vbl, m_vbl2; }; void fontwriter_state::machine_reset() @@ -80,13 +89,24 @@ void fontwriter_state::main_map(address_map &map) map(0x002000, 0x007fff).ram(); map(0x008000, 0x00ffff).rom().region("maincpu", 0x0000); map(0x020000, 0x04ffff).ram(); - map(0x100000, 0x1007ff).ram(); + map(0x100000, 0x1007ff).rw("at28c16", FUNC(at28c16_device::read), FUNC(at28c16_device::write)); map(0x200000, 0x3fffff).rom().region("maincpu", 0x0000); } void fontwriter_state::io_map(address_map &map) { map(M37710_PORT6, M37710_PORT6).r(FUNC(fontwriter_state::vbl_r)); + map(M37710_PORT7, M37710_PORT7).r(FUNC(fontwriter_state::vbl2_r)); +} + +void fontwriter_state::fw600_map(address_map &map) +{ + map(0x000280, 0x0002ff).ram(); + map(0x000800, 0x000fff).rw("at28c16", FUNC(at28c16_device::read), FUNC(at28c16_device::write)); + map(0x002000, 0x007fff).ram(); + map(0x008000, 0x00ffff).rom().region("maincpu", 0x1f8000); + map(0x020000, 0x04ffff).ram(); + map(0x200000, 0x3fffff).rom().region("maincpu", 0x0000); } static INPUT_PORTS_START( fontwriter ) @@ -97,6 +117,23 @@ MACHINE_CONFIG_START(fontwriter_state::fontwriter) MCFG_DEVICE_PROGRAM_MAP(main_map) MCFG_DEVICE_IO_MAP(io_map) + MCFG_DEVICE_ADD("at28c16", AT28C16, 0) + + MCFG_SCREEN_ADD("screen", RASTER) + MCFG_SCREEN_REFRESH_RATE(60) + MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) + MCFG_SCREEN_UPDATE_DRIVER(fontwriter_state, screen_update) + MCFG_SCREEN_SIZE(640, 400) + MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 399) +MACHINE_CONFIG_END + +MACHINE_CONFIG_START(fontwriter_state::fw600) + MCFG_DEVICE_ADD("maincpu", M37720S1, XTAL(16'000'000)) /* M37720S1 @ 16MHz - main CPU */ + MCFG_DEVICE_PROGRAM_MAP(fw600_map) + MCFG_DEVICE_IO_MAP(io_map) + + MCFG_DEVICE_ADD("at28c16", AT28C16, 0) + MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) @@ -105,9 +142,21 @@ MACHINE_CONFIG_START(fontwriter_state::fontwriter) MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 399) MACHINE_CONFIG_END +ROM_START(fw600) + ROM_REGION(0x200000, "maincpu", 0) /* M37720 program ROM */ + ROM_LOAD( "lh5388n5.bin", 0x000000, 0x100000, CRC(3bcc5c19) SHA1(510e3795faf18e10f2fef69110f96183e7cfee35) ) + ROM_LOAD( "lh5388n9.bin", 0x100000, 0x100000, CRC(be2198df) SHA1(9e42f3a933c6f247c452910af3a2e9196291574a) ) + + ROM_REGION(0x800, "at28c16", 0) /* AT28C16 parallel EPROM */ + ROM_LOAD( "at28c16.bin", 0x000000, 0x000800, CRC(a84eafd9) SHA1(12503a71e98f80819959d41643b1d2773739b923) ) +ROM_END + ROM_START(fw700ger) ROM_REGION(0x200000, "maincpu", 0) /* M37720 program ROM */ ROM_LOAD( "lh5370pd.ic7", 0x000000, 0x200000, CRC(29083e13) SHA1(7e1605f91b53580e75f638f9e6b0917305c35f84) ) + + ROM_REGION(0x800, "at28c16", ROMREGION_ERASE00) /* AT28C16 parallel EPROM */ ROM_END +SYST( 1994, fw600, 0, 0, fw600, fontwriter, fontwriter_state, empty_init, "Sharp", "FontWriter FW-600", MACHINE_NOT_WORKING|MACHINE_NO_SOUND ) SYST( 1994, fw700ger, 0, 0, fontwriter, fontwriter, fontwriter_state, empty_init, "Sharp", "FontWriter FW-700 (German)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND ) diff --git a/src/mame/drivers/fp200.cpp b/src/mame/drivers/fp200.cpp index 478ac7c536a..61753f3f7ad 100644 --- a/src/mame/drivers/fp200.cpp +++ b/src/mame/drivers/fp200.cpp @@ -98,7 +98,7 @@ uint32_t fp200_state::screen_update( screen_device &screen, bitmap_ind16 &bitmap l_offs = 0; r_offs = 0; - for(int y=cliprect.min_y;y<cliprect.max_y;y++) + for(int y=cliprect.top(); y<cliprect.bottom(); y++) // FIXME: off-by-one? { for(int x=0;x<80;x++) { @@ -110,7 +110,7 @@ uint32_t fp200_state::screen_update( screen_device &screen, bitmap_ind16 &bitmap } } - for(int y=cliprect.min_y;y<cliprect.max_y;y++) + for(int y=cliprect.top(); y<cliprect.bottom(); y++) // FIXME: off-by-one? { for(int x=80;x<160;x++) { @@ -122,7 +122,7 @@ uint32_t fp200_state::screen_update( screen_device &screen, bitmap_ind16 &bitmap } } - for(int y=cliprect.min_y;y<cliprect.max_y;y++) + for(int y=cliprect.top(); y<cliprect.bottom(); y++) // FIXME: off-by-one? { for(int x=0;x<80;x++) { @@ -153,7 +153,7 @@ uint32_t fp200_state::screen_update( screen_device &screen, bitmap_ind16 &bitmap } } - for(int y=cliprect.min_y;y<cliprect.max_y;y++) + for(int y=cliprect.top(); y<cliprect.bottom(); y++) // FIXME: off-by-one? { for(int x=80;x<160;x++) { diff --git a/src/mame/drivers/funkball.cpp b/src/mame/drivers/funkball.cpp index 69f8d5ccc11..5a1da62df52 100644 --- a/src/mame/drivers/funkball.cpp +++ b/src/mame/drivers/funkball.cpp @@ -70,14 +70,15 @@ Notes: #include "emu.h" +#include "bus/rs232/rs232.h" #include "cpu/i386/i386.h" #include "machine/bankdev.h" #include "machine/idectrl.h" +#include "machine/ins8250.h" #include "machine/intelfsh.h" #include "machine/lpci.h" #include "machine/pckeybrd.h" #include "machine/pcshare.h" -#include "machine/terminal.h" #include "video/voodoo.h" #include "screen.h" @@ -90,7 +91,6 @@ public: , m_voodoo(*this, "voodoo_0") , m_unk_ram(*this, "unk_ram") , m_flashbank(*this, "flashbank") - , m_terminal(*this, "terminal") , m_inputs(*this, "IN.%u", 0) { } @@ -111,14 +111,11 @@ private: required_shared_ptr<uint32_t> m_unk_ram; required_device<address_map_bank_device> m_flashbank; - required_device<generic_terminal_device> m_terminal; required_ioport_array<16> m_inputs; DECLARE_WRITE32_MEMBER( flash_w ); // DECLARE_WRITE8_MEMBER( bios_ram_w ); DECLARE_READ8_MEMBER( in_r ); - DECLARE_READ8_MEMBER( serial_r ); - DECLARE_WRITE8_MEMBER( serial_w ); uint8_t funkball_config_reg_r(); void funkball_config_reg_w(uint8_t data); @@ -220,21 +217,6 @@ void funkball_state::cx5510_pci_w(int function, int reg, uint32_t data, uint32_t COMBINE_DATA(&m_cx5510_regs[reg/4]); } -READ8_MEMBER( funkball_state::serial_r ) -{ - //printf("%02x\n",offset); - if(offset == 5) - return 0x20; - - return 0; -} - -WRITE8_MEMBER( funkball_state::serial_w ) -{ - if(offset == 0) - m_terminal->write(space,0,data); -} - uint8_t funkball_state::funkball_config_reg_r() { //osd_printf_debug("funkball_config_reg_r %02X\n", funkball_config_reg_sel); @@ -368,7 +350,7 @@ void funkball_state::funkball_io(address_map &map) map(0x01f0, 0x01f7).rw("ide", FUNC(ide_controller_device::cs0_r), FUNC(ide_controller_device::cs0_w)); map(0x03f0, 0x03f7).rw("ide", FUNC(ide_controller_device::cs1_r), FUNC(ide_controller_device::cs1_w)); - map(0x03f8, 0x03ff).rw(FUNC(funkball_state::serial_r), FUNC(funkball_state::serial_w)); + map(0x03f8, 0x03ff).rw("uart", FUNC(ns16550_device::ins8250_r), FUNC(ns16550_device::ins8250_w)); map(0x0cf8, 0x0cff).rw("pcibus", FUNC(pci_bus_legacy_device::read), FUNC(pci_bus_legacy_device::write)); @@ -771,6 +753,16 @@ void funkball_state::machine_reset() m_voodoo_pci_regs.base_addr = 0xff000000; } +static DEVICE_INPUT_DEFAULTS_START( terminal ) + DEVICE_INPUT_DEFAULTS( "RS232_RXBAUD", 0xff, RS232_BAUD_57600 ) + DEVICE_INPUT_DEFAULTS( "RS232_TXBAUD", 0xff, RS232_BAUD_57600 ) + DEVICE_INPUT_DEFAULTS( "RS232_STARTBITS", 0xff, RS232_STARTBITS_1 ) + DEVICE_INPUT_DEFAULTS( "RS232_DATABITS", 0xff, RS232_DATABITS_8 ) + DEVICE_INPUT_DEFAULTS( "RS232_PARITY", 0xff, RS232_PARITY_NONE ) + DEVICE_INPUT_DEFAULTS( "RS232_STOPBITS", 0xff, RS232_STOPBITS_1 ) + DEVICE_INPUT_DEFAULTS( "TERM_CONF", 0x080, 0x080 ) // Auto LF on CR +DEVICE_INPUT_DEFAULTS_END + MACHINE_CONFIG_START(funkball_state::funkball) MCFG_DEVICE_ADD("maincpu", MEDIAGX, 66666666*3.5) // 66,6 MHz x 3.5 MCFG_DEVICE_PROGRAM_MAP(funkball_map) @@ -807,7 +799,17 @@ MACHINE_CONFIG_START(funkball_state::funkball) MCFG_SCREEN_SIZE(1024, 1024) MCFG_SCREEN_VISIBLE_AREA(0, 511, 16, 447) - MCFG_DEVICE_ADD("terminal", GENERIC_TERMINAL, 0) + ns16550_device &uart(NS16550(config, "uart", 1843200)); // exact type unknown + uart.out_tx_callback().set("rs232", FUNC(rs232_port_device::write_txd)); + uart.out_dtr_callback().set("rs232", FUNC(rs232_port_device::write_dtr)); + uart.out_rts_callback().set("rs232", FUNC(rs232_port_device::write_rts)); + + rs232_port_device &rs232(RS232_PORT(config, "rs232", default_rs232_devices, "terminal")); + rs232.set_option_device_input_defaults("terminal", DEVICE_INPUT_DEFAULTS_NAME(terminal)); + rs232.rxd_handler().set("uart", FUNC(ns16550_device::rx_w)); + rs232.dcd_handler().set("uart", FUNC(ns16550_device::dcd_w)); + rs232.dsr_handler().set("uart", FUNC(ns16550_device::dsr_w)); + rs232.cts_handler().set("uart", FUNC(ns16550_device::cts_w)); MCFG_INTEL_28F320J5_ADD("u29") MCFG_INTEL_28F320J5_ADD("u30") diff --git a/src/mame/drivers/funkyjet.cpp b/src/mame/drivers/funkyjet.cpp index bd52ed1bcfd..ae529c63665 100644 --- a/src/mame/drivers/funkyjet.cpp +++ b/src/mame/drivers/funkyjet.cpp @@ -157,8 +157,6 @@ void funkyjet_state::sound_map(address_map &map) map(0x130000, 0x130001).noprw(); /* This board only has 1 oki chip */ map(0x140000, 0x140000).r(m_deco146, FUNC(deco146_device::soundlatch_r)); map(0x1f0000, 0x1f1fff).ram(); - map(0x1fec00, 0x1fec01).rw(m_audiocpu, FUNC(h6280_device::timer_r), FUNC(h6280_device::timer_w)).mirror(0x3fe); - map(0x1ff400, 0x1ff403).rw(m_audiocpu, FUNC(h6280_device::irq_status_r), FUNC(h6280_device::irq_status_w)).mirror(0x3fc); } /******************************************************************************/ @@ -311,8 +309,10 @@ MACHINE_CONFIG_START(funkyjet_state::funkyjet) MCFG_DEVICE_PROGRAM_MAP(funkyjet_map) MCFG_DEVICE_VBLANK_INT_DRIVER("screen", funkyjet_state, irq6_line_hold) - MCFG_DEVICE_ADD("audiocpu", H6280, XTAL(32'220'000)/4) /* Custom chip 45, Audio section crystal is 32.220 MHz */ - MCFG_DEVICE_PROGRAM_MAP(sound_map) + H6280(config, m_audiocpu, XTAL(32'220'000)/4); /* Custom chip 45, Audio section crystal is 32.220 MHz */ + m_audiocpu->set_addrmap(AS_PROGRAM, &funkyjet_state::sound_map); + m_audiocpu->add_route(ALL_OUTPUTS, "lspeaker", 0); // internal sound unused + m_audiocpu->add_route(ALL_OUTPUTS, "rspeaker", 0); /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) diff --git a/src/mame/drivers/gaelco.cpp b/src/mame/drivers/gaelco.cpp index e84e7e250a5..4d30a6877dd 100644 --- a/src/mame/drivers/gaelco.cpp +++ b/src/mame/drivers/gaelco.cpp @@ -352,6 +352,36 @@ static INPUT_PORTS_START( biomtoy ) PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) ) INPUT_PORTS_END +static INPUT_PORTS_START( biomtoyc ) + PORT_INCLUDE( biomtoy ) + + PORT_MODIFY("DSW1") + PORT_DIPNAME( 0x0f, 0x0f, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("SW1:8,7,6,5") + PORT_DIPSETTING( 0x0e, DEF_STR( 4C_1C ) ) + PORT_DIPSETTING( 0x0a, DEF_STR( 3C_2C ) ) + PORT_DIPSETTING( 0x09, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0x0f, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x07, DEF_STR( 1C_2C ) ) + PORT_DIPSETTING( 0x06, DEF_STR( 2C_3C ) ) + PORT_DIPSETTING( 0x0b, DEF_STR( 1C_3C ) ) + PORT_DIPSETTING( 0x0d, DEF_STR( 1C_5C ) ) + PORT_DIPSETTING( 0x08, "Free Play (if Coin A too)" ) + PORT_DIPSETTING( 0x0c, "Free Play (if Coin A too)" ) + PORT_DIPSETTING( 0x00, "Free Play (if Coin A too)" ) + PORT_DIPNAME( 0xf0, 0xf0, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SW1:4,3,2,1") + PORT_DIPSETTING( 0xe0, DEF_STR( 4C_1C ) ) + PORT_DIPSETTING( 0xa0, DEF_STR( 3C_2C ) ) + PORT_DIPSETTING( 0x90, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0xf0, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x70, DEF_STR( 1C_2C ) ) + PORT_DIPSETTING( 0x60, DEF_STR( 2C_3C ) ) + PORT_DIPSETTING( 0xb0, DEF_STR( 1C_3C ) ) + PORT_DIPSETTING( 0xd0, DEF_STR( 1C_5C ) ) + PORT_DIPSETTING( 0x80, "Free Play (if Coin B too)" ) + PORT_DIPSETTING( 0xc0, "Free Play (if Coin B too)" ) + PORT_DIPSETTING( 0x00, "Free Play (if Coin B too)" ) +INPUT_PORTS_END + static INPUT_PORTS_START( bioplayc ) PORT_INCLUDE( biomtoy ) @@ -868,13 +898,17 @@ Video: TMS TCP1020AFN-084C (x2) VR1: Volume pot SW: Two 8 switch dipswitches +NOTE: Sadly Gaelco didn't differentiate between versions on the ROM labels. + Just a version number on the initial boot up screen and ROM checksum + on the calibration screen which followed. + ***************************************************************************/ ROM_START( biomtoy ) /* PCB - REF.922804/2 */ ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 code */ - ROM_LOAD16_BYTE( "d18", 0x000000, 0x080000, CRC(4569ce64) SHA1(96557aca55779c23f7c2c11fddc618823c04ead0) ) /* v1.0.1885 */ - ROM_LOAD16_BYTE( "d16", 0x000001, 0x080000, CRC(739449bd) SHA1(711a8ea5081f15dea6067577516c9296239c4145) ) /* v1.0.1885 */ + ROM_LOAD16_BYTE( "18.d18", 0x000000, 0x080000, CRC(4569ce64) SHA1(96557aca55779c23f7c2c11fddc618823c04ead0) ) /* v1.0.1885 */ + ROM_LOAD16_BYTE( "16.d16", 0x000001, 0x080000, CRC(739449bd) SHA1(711a8ea5081f15dea6067577516c9296239c4145) ) /* v1.0.1885 */ ROM_REGION( 0x400000, "gfx1", 0 ) /* weird gfx ordering */ @@ -904,8 +938,8 @@ ROM_END ROM_START( biomtoya ) /* PCB - REF.922804/2 */ ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 code */ - ROM_LOAD16_BYTE( "biomtoya.d18", 0x000000, 0x080000, CRC(39b6cdbd) SHA1(3a22eb2e304d85ecafff677d83c3c4fca3f869d5) ) /* v1.0.1884 */ - ROM_LOAD16_BYTE( "biomtoya.d16", 0x000001, 0x080000, CRC(ab340671) SHA1(83f708a535048e927fd1c7de85a65282e460f98a) ) /* v1.0.1884 */ + ROM_LOAD16_BYTE( "18.d18", 0x000000, 0x080000, CRC(39b6cdbd) SHA1(3a22eb2e304d85ecafff677d83c3c4fca3f869d5) ) /* v1.0.1884 - sldh */ + ROM_LOAD16_BYTE( "16.d16", 0x000001, 0x080000, CRC(ab340671) SHA1(83f708a535048e927fd1c7de85a65282e460f98a) ) /* v1.0.1884 - sldh */ ROM_REGION( 0x400000, "gfx1", 0 ) /* weird gfx ordering */ @@ -935,8 +969,8 @@ ROM_END ROM_START( biomtoyb ) /* PCB - REF.922804/2 */ ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 code */ - ROM_LOAD16_BYTE( "18.d18", 0x000000, 0x080000, CRC(2dfadee3) SHA1(55ab563a9a69da940ca015f292476068cf21b01c) ) /* v1.0.1878 */ - ROM_LOAD16_BYTE( "16.d16", 0x000001, 0x080000, CRC(b35e3ca6) SHA1(b323fcca99d088e6fbf6a1d660ef860987af77e4) ) /* v1.0.1878 */ + ROM_LOAD16_BYTE( "18.d18", 0x000000, 0x080000, CRC(2dfadee3) SHA1(55ab563a9a69da940ca015f292476068cf21b01c) ) /* v1.0.1878 - sldh */ + ROM_LOAD16_BYTE( "16.d16", 0x000001, 0x080000, CRC(b35e3ca6) SHA1(b323fcca99d088e6fbf6a1d660ef860987af77e4) ) /* v1.0.1878 - sldh */ ROM_REGION( 0x400000, "gfx1", 0 ) /* Graphics & Sound ROMs soldered in, not verified 100% correct for this set */ /* weird gfx ordering */ @@ -963,6 +997,37 @@ ROM_START( biomtoyb ) /* PCB - REF.922804/2 */ ROM_LOAD( "c3", 0x080000, 0x080000, CRC(c3aea660) SHA1(639d4195391e2608e94759e8a4385b518872263a) ) // sldh ROM_END + +ROM_START( biomtoyc ) /* PCB - REF.922804/1 & REF.922804/2 */ + ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 code */ + ROM_LOAD16_BYTE( "18.d18", 0x000000, 0x080000, CRC(05ad7d30) SHA1(4b2596d225bf9b314db5a150921d7d6c99096ddb) ) /* v1.0.1870 - sldh */ + ROM_LOAD16_BYTE( "16.d16", 0x000001, 0x080000, CRC(a288e73f) SHA1(13a53981e3fe6961494013e7466badae56481958) ) /* v1.0.1870 - sldh */ + + ROM_REGION( 0x400000, "gfx1", 0 ) /* Graphics & Sound ROMs soldered in, not verified 100% correct for this set Using prototype graphics from the set below */ + /* weird gfx ordering */ + ROM_LOAD( "toy-high-3.h6", 0x040000, 0x040000, CRC(ab19a1ce) SHA1(3cc896f8c20f692b02d43db8c30f410bd93fe3ca)) + ROM_CONTINUE( 0x0c0000, 0x040000 ) + ROM_LOAD( "toy-low-3.j6", 0x000000, 0x040000, CRC(927f5cd7) SHA1(ad5e75091146ca7935a18e5dd045410e28d8b170) ) + ROM_CONTINUE( 0x080000, 0x040000 ) + ROM_LOAD( "toy-high-2.h7", 0x140000, 0x040000, CRC(fd975d89) SHA1(89bb85ccb1ba0bb82f393ef27757c0778dd696b3) ) + ROM_CONTINUE( 0x1c0000, 0x040000 ) + ROM_LOAD( "toy-low-2.j7", 0x100000, 0x040000, CRC(6cbf9937) SHA1(77123a8afea3108df54f45033dfb7f86c1d0d1b8) ) + ROM_CONTINUE( 0x180000, 0x040000 ) + ROM_LOAD( "toy-high-1.h9", 0x240000, 0x040000, CRC(09de4799) SHA1(120b7bd8e20288c3aec62d3b2bf3f87e251c3eea) ) + ROM_CONTINUE( 0x2c0000, 0x040000 ) + ROM_LOAD( "toy-low-1.j9", 0x200000, 0x040000, CRC(57922c41) SHA1(ffbe5b418ed93e8705a7aabe69d3fad2919a160f) ) + ROM_CONTINUE( 0x280000, 0x040000 ) + ROM_LOAD( "toy-high-0.h10", 0x340000, 0x040000, CRC(5bee6df7) SHA1(ecf759de2f0909f793c84c71feb08801896e2474) ) + ROM_CONTINUE( 0x3c0000, 0x040000 ) + ROM_LOAD( "toy-low-0.j10", 0x300000, 0x040000, CRC(26c49ca2) SHA1(82079eaa2c9523c9acb72fccfbbe9493bc62e84f) ) + ROM_CONTINUE( 0x380000, 0x040000 ) + + ROM_REGION( 0x100000, "oki", 0 ) /* ADPCM samples - sound chip is OKIM6295 */ + ROM_LOAD( "c1", 0x000000, 0x080000, CRC(edf77532) SHA1(cf198b14c25e1b242a65af8ce23538404cd2b12d) ) // sldh + /* 0x00000-0x2ffff is fixed, 0x30000-0x3ffff is bank switched from all the ROMs */ + ROM_LOAD( "c3", 0x080000, 0x080000, CRC(c3aea660) SHA1(639d4195391e2608e94759e8a4385b518872263a) ) // sldh +ROM_END + ROM_START( bioplayc ) /* PCB - REF.922804/2?? - Spanish version */ ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 code */ ROM_LOAD16_BYTE( "t.d18", 0x000000, 0x080000, CRC(ec518c6c) SHA1(8b96313582d252bebb4bcce8f2d993f751ad0a74) ) /* v1.0.1823 */ @@ -989,7 +1054,6 @@ ROM_START( bioplayc ) /* PCB - REF.922804/2?? - Spanish version */ ROM_REGION( 0x100000, "oki", 0 ) /* ADPCM samples - sound chip is OKIM6295 */ // Missing the audio rom, the board didn't have it populated. The programmer said it was not there because the audio was ripped from other games. - // however these roms, strangely from the newer revision not the older ones, give good sound for most situations. ROM_LOAD( "c1", 0x000000, 0x080000, BAD_DUMP CRC(edf77532) SHA1(cf198b14c25e1b242a65af8ce23538404cd2b12d) ) // sldh /* 0x00000-0x2ffff is fixed, 0x30000-0x3ffff is bank switched from all the ROMs */ ROM_LOAD( "c3", 0x080000, 0x080000, BAD_DUMP CRC(c3aea660) SHA1(639d4195391e2608e94759e8a4385b518872263a) ) // sldh @@ -1126,7 +1190,8 @@ GAME( 1991, bigkarnk, 0, bigkarnk, bigkarnk, gaelco_state, empty_init, RO GAME( 1995, biomtoy, 0, maniacsq, biomtoy, gaelco_state, empty_init, ROT0, "Gaelco", "Biomechanical Toy (Ver. 1.0.1885)", MACHINE_SUPPORTS_SAVE ) GAME( 1995, biomtoya, biomtoy, maniacsq, biomtoy, gaelco_state, empty_init, ROT0, "Gaelco", "Biomechanical Toy (Ver. 1.0.1884)", MACHINE_SUPPORTS_SAVE ) GAME( 1995, biomtoyb, biomtoy, maniacsq, biomtoy, gaelco_state, empty_init, ROT0, "Gaelco", "Biomechanical Toy (Ver. 1.0.1878)", MACHINE_SUPPORTS_SAVE ) -GAME( 1995, bioplayc, biomtoy, maniacsq, bioplayc, gaelco_state, empty_init, ROT0, "Gaelco", "Bioplaything Cop (Ver. 1.0.1823, prototype)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) +GAME( 1994, biomtoyc, biomtoy, maniacsq, biomtoyc, gaelco_state, empty_init, ROT0, "Gaelco", "Biomechanical Toy (Ver. 1.0.1870)", MACHINE_SUPPORTS_SAVE ) +GAME( 1994, bioplayc, biomtoy, maniacsq, bioplayc, gaelco_state, empty_init, ROT0, "Gaelco", "Bioplaything Cop (Ver. 1.0.1823, prototype)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) // copyright based on Ver. 1.0.1870 GAME( 1996, maniacsp, maniacsq, maniacsq, maniacsq, gaelco_state, empty_init, ROT0, "Gaelco", "Maniac Square (prototype)", MACHINE_SUPPORTS_SAVE ) // sometimes listed as a 1992 proto? GAME( 1995, lastkm, 0, maniacsq, lastkm, gaelco_state, empty_init, ROT0, "Gaelco", "Last KM (Ver 1.0.0275)", MACHINE_SUPPORTS_SAVE ) // used on 'Salter' exercise bikes GAME( 1992, squash, 0, squash, squash, gaelco_state, empty_init, ROT0, "Gaelco", "Squash (Ver. 1.0)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/drivers/gameplan.cpp b/src/mame/drivers/gameplan.cpp index 49a96999e17..57fdb0a0629 100644 --- a/src/mame/drivers/gameplan.cpp +++ b/src/mame/drivers/gameplan.cpp @@ -959,18 +959,17 @@ MACHINE_RESET_MEMBER(gameplan_state,gameplan) m_video_data = 0; } -MACHINE_CONFIG_START(gameplan_state::gameplan) - - /* basic machine hardware */ - MCFG_DEVICE_ADD("maincpu", M6502, GAMEPLAN_MAIN_CPU_CLOCK) - MCFG_DEVICE_PROGRAM_MAP(gameplan_main_map) +void gameplan_state::gameplan(machine_config &config) +{ + M6502(config, m_maincpu, GAMEPLAN_MAIN_CPU_CLOCK); + m_maincpu->set_addrmap(AS_PROGRAM, &gameplan_state::gameplan_main_map); - MCFG_DEVICE_ADD("audiocpu", M6502, GAMEPLAN_AUDIO_CPU_CLOCK) - MCFG_DEVICE_PROGRAM_MAP(gameplan_audio_map) + M6502(config, m_audiocpu, GAMEPLAN_AUDIO_CPU_CLOCK); + m_audiocpu->set_addrmap(AS_PROGRAM, &gameplan_state::gameplan_audio_map); - MCFG_DEVICE_ADD("riot", RIOT6532, GAMEPLAN_AUDIO_CPU_CLOCK) - MCFG_RIOT6532_OUT_PB_CB(WRITE8(*this, gameplan_state, r6532_soundlatch_w)) - MCFG_RIOT6532_IRQ_CB(WRITELINE(*this, gameplan_state, r6532_irq)) + RIOT6532(config, m_riot, GAMEPLAN_AUDIO_CPU_CLOCK); + m_riot->out_pb_callback().set(FUNC(gameplan_state::r6532_soundlatch_w)); + m_riot->irq_callback().set(FUNC(gameplan_state::r6532_irq)); MCFG_MACHINE_START_OVERRIDE(gameplan_state,gameplan) MCFG_MACHINE_RESET_OVERRIDE(gameplan_state,gameplan) @@ -981,50 +980,47 @@ MACHINE_CONFIG_START(gameplan_state::gameplan) /* audio hardware */ SPEAKER(config, "mono").front_center(); - MCFG_GENERIC_LATCH_8_ADD("soundlatch") + GENERIC_LATCH_8(config, m_soundlatch, 0); - MCFG_DEVICE_ADD("aysnd", AY8910, GAMEPLAN_AY8910_CLOCK) - MCFG_AY8910_PORT_A_READ_CB(IOPORT("DSW2")) - MCFG_AY8910_PORT_B_READ_CB(IOPORT("DSW3")) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.33) + ay8910_device &aysnd(AY8910(config, "aysnd", GAMEPLAN_AY8910_CLOCK)); + aysnd.port_a_read_callback().set_ioport("DSW2"); + aysnd.port_b_read_callback().set_ioport("DSW3"); + aysnd.add_route(ALL_OUTPUTS, "mono", 0.33); /* via */ - MCFG_DEVICE_ADD("via6522_0", VIA6522, GAMEPLAN_MAIN_CPU_CLOCK) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, gameplan_state, video_data_w)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, gameplan_state, gameplan_video_command_w)) - MCFG_VIA6522_CA2_HANDLER(WRITELINE(*this, gameplan_state, video_command_trigger_w)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, gameplan_state, via_irq)) - - MCFG_DEVICE_ADD("via6522_1", VIA6522, GAMEPLAN_MAIN_CPU_CLOCK) - MCFG_VIA6522_READPA_HANDLER(READ8(*this, gameplan_state, io_port_r)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, gameplan_state, io_select_w)) - MCFG_VIA6522_CB2_HANDLER(WRITELINE(*this, gameplan_state, coin_w)) - - MCFG_DEVICE_ADD("via6522_2", VIA6522, GAMEPLAN_MAIN_CPU_CLOCK) - MCFG_VIA6522_READPB_HANDLER(READ8("soundlatch", generic_latch_8_device, read)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, gameplan_state, audio_cmd_w)) - MCFG_VIA6522_CA2_HANDLER(WRITELINE(*this, gameplan_state, audio_trigger_w)) - MCFG_VIA6522_CB2_HANDLER(WRITELINE(*this, gameplan_state, audio_reset_w)) -MACHINE_CONFIG_END - - -MACHINE_CONFIG_START(gameplan_state::leprechn) + VIA6522(config, m_via_0, GAMEPLAN_MAIN_CPU_CLOCK); + m_via_0->writepa_handler().set(FUNC(gameplan_state::video_data_w)); + m_via_0->writepb_handler().set(FUNC(gameplan_state::gameplan_video_command_w)); + m_via_0->ca2_handler().set(FUNC(gameplan_state::video_command_trigger_w)); + m_via_0->irq_handler().set(FUNC(gameplan_state::via_irq)); + + VIA6522(config, m_via_1, GAMEPLAN_MAIN_CPU_CLOCK); + m_via_1->readpa_handler().set(FUNC(gameplan_state::io_port_r)); + m_via_1->writepb_handler().set(FUNC(gameplan_state::io_select_w)); + m_via_1->cb2_handler().set(FUNC(gameplan_state::coin_w)); + + VIA6522(config, m_via_2, GAMEPLAN_MAIN_CPU_CLOCK); + m_via_2->readpb_handler().set(m_soundlatch, FUNC(generic_latch_8_device::read)); + m_via_2->writepa_handler().set(FUNC(gameplan_state::audio_cmd_w)); + m_via_2->ca2_handler().set(FUNC(gameplan_state::audio_trigger_w)); + m_via_2->cb2_handler().set(FUNC(gameplan_state::audio_reset_w)); +} + +void gameplan_state::leprechn(machine_config &config) +{ gameplan(config); - MCFG_DEVICE_MODIFY("maincpu") - MCFG_DEVICE_CLOCK(LEPRECHAUN_MAIN_CPU_CLOCK) + m_maincpu->set_clock(LEPRECHAUN_MAIN_CPU_CLOCK); /* basic machine hardware */ - MCFG_DEVICE_MODIFY("audiocpu") - MCFG_DEVICE_PROGRAM_MAP(leprechn_audio_map) + m_audiocpu->set_addrmap(AS_PROGRAM, &gameplan_state::leprechn_audio_map); /* video hardware */ leprechn_video(config); /* via */ - MCFG_DEVICE_MODIFY("via6522_0") - MCFG_VIA6522_READPB_HANDLER(READ8(*this, gameplan_state, leprechn_videoram_r)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, gameplan_state, leprechn_video_command_w)) -MACHINE_CONFIG_END + m_via_0->readpb_handler().set(FUNC(gameplan_state::leprechn_videoram_r)); + m_via_0->writepb_handler().set(FUNC(gameplan_state::leprechn_video_command_w)); +} diff --git a/src/mame/drivers/ggconnie.cpp b/src/mame/drivers/ggconnie.cpp index 94ddd0f3338..4507667f359 100644 --- a/src/mame/drivers/ggconnie.cpp +++ b/src/mame/drivers/ggconnie.cpp @@ -24,7 +24,6 @@ #include "video/huc6270.h" #include "video/huc6260.h" #include "video/huc6202.h" -#include "sound/c6280.h" #include "sound/okim6295.h" #include "machine/msm6242.h" #include "screen.h" @@ -78,19 +77,15 @@ void ggconnie_state::sgx_mem(address_map &map) map(0x1f7000, 0x1f7000).portr("SWA"); map(0x1f7100, 0x1f7100).portr("SWB"); map(0x1f7200, 0x1f7200).portr("SWC"); + map(0x1f7300, 0x1f7300).rw(m_oki, FUNC(okim6295_device::read), FUNC(okim6295_device::write)); + map(0x1f7400, 0x1f74ff).w(FUNC(ggconnie_state::oki_bank_w)); + map(0x1f7500, 0x1f750f).rw(m_rtc, FUNC(msm6242_device::read), FUNC(msm6242_device::write)); map(0x1f7700, 0x1f7700).portr("IN1"); map(0x1f7800, 0x1f7800).w(FUNC(ggconnie_state::output_w)); map(0x1fe000, 0x1fe007).rw("huc6270_0", FUNC(huc6270_device::read), FUNC(huc6270_device::write)).mirror(0x03E0); map(0x1fe008, 0x1fe00f).rw("huc6202", FUNC(huc6202_device::read), FUNC(huc6202_device::write)).mirror(0x03E0); map(0x1fe010, 0x1fe017).rw("huc6270_1", FUNC(huc6270_device::read), FUNC(huc6270_device::write)).mirror(0x03E0); map(0x1fe400, 0x1fe7ff).rw(m_huc6260, FUNC(huc6260_device::read), FUNC(huc6260_device::write)); - map(0x1fe800, 0x1febff).rw("c6280", FUNC(c6280_device::c6280_r), FUNC(c6280_device::c6280_w)); - map(0x1fec00, 0x1fefff).rw(m_maincpu, FUNC(h6280_device::timer_r), FUNC(h6280_device::timer_w)); - map(0x1f7300, 0x1f7300).rw(m_oki, FUNC(okim6295_device::read), FUNC(okim6295_device::write)); - map(0x1f7400, 0x1f74ff).w(FUNC(ggconnie_state::oki_bank_w)); - map(0x1f7500, 0x1f750f).rw(m_rtc, FUNC(msm6242_device::read), FUNC(msm6242_device::write)); - map(0x1ff000, 0x1ff000).portr("IN0").w(FUNC(ggconnie_state::lamp_w)); - map(0x1ff400, 0x1ff7ff).rw(m_maincpu, FUNC(h6280_device::irq_status_r), FUNC(h6280_device::irq_status_w)); } void ggconnie_state::sgx_io(address_map &map) @@ -269,9 +264,13 @@ INPUT_PORTS_END MACHINE_CONFIG_START(ggconnie_state::ggconnie) /* basic machine hardware */ - MCFG_DEVICE_ADD("maincpu", H6280, PCE_MAIN_CLOCK/3) - MCFG_DEVICE_PROGRAM_MAP(sgx_mem) - MCFG_DEVICE_IO_MAP(sgx_io) + H6280(config, m_maincpu, PCE_MAIN_CLOCK/3); + m_maincpu->set_addrmap(AS_PROGRAM, &ggconnie_state::sgx_mem); + m_maincpu->set_addrmap(AS_IO, &ggconnie_state::sgx_io); + m_maincpu->port_in_cb().set_ioport("IN0"); + m_maincpu->port_out_cb().set(FUNC(ggconnie_state::lamp_w)); + m_maincpu->add_route(0, "lspeaker", 1.00); + m_maincpu->add_route(1, "rspeaker", 1.00); /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) @@ -308,10 +307,6 @@ MACHINE_CONFIG_START(ggconnie_state::ggconnie) SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); - MCFG_DEVICE_ADD("c6280", C6280, PCE_MAIN_CLOCK/6) - MCFG_C6280_CPU("maincpu") - MCFG_SOUND_ROUTE(0, "lspeaker", 1.00) - MCFG_SOUND_ROUTE(1, "rspeaker", 1.00) MCFG_DEVICE_ADD("oki", OKIM6295, PCE_MAIN_CLOCK/12, okim6295_device::PIN7_HIGH) /* unknown clock / pin 7 */ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.00) @@ -345,4 +340,4 @@ ROM_START(smf) ROM_END GAME( 1996, ggconnie, 0, ggconnie, ggconnie, ggconnie_state, init_pce_common, ROT0, "Eighting", "Go! Go! Connie chan Jaka Jaka Janken", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) -GAME( 1997, smf, 0, ggconnie, smf, ggconnie_state, init_pce_common, ROT0, "Eighting", "Super Medal Fighters (Japan 970228)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) +GAME( 1997, smf, 0, ggconnie, smf, ggconnie_state, init_pce_common, ROT0, "Eighting (Capcom license)", "Super Medal Fighters (Japan 970228)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) diff --git a/src/mame/drivers/goupil.cpp b/src/mame/drivers/goupil.cpp index 6e754618e6c..2edb7938366 100644 --- a/src/mame/drivers/goupil.cpp +++ b/src/mame/drivers/goupil.cpp @@ -43,74 +43,101 @@ #define VIDEO_CLOCK MAIN_CLOCK / 8 /* 1.75 Mhz */ #define CPU_CLOCK MAIN_CLOCK / 4 /* 1 Mhz */ -class goupil_g1_state : public driver_device +class goupil_base_state : public driver_device { public: - goupil_g1_state(const machine_config &mconfig, device_type type, const char *tag) + goupil_base_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) - , m_acia(*this, "ef6850") - , m_ef9364(*this, "ef9364") , m_maincpu(*this, "maincpu") + , m_acia(*this, "ef6850") , m_via_video(*this, "m_via_video") , m_via_keyb(*this, "m_via_keyb") , m_via_modem(*this, "m_via_modem") + , m_palette(*this, "palette") + , m_screen(*this, "screen") , m_fdc(*this, "fd1791") , m_floppy0(*this, "fd1791:0") , m_floppy1(*this, "fd1791:1") + , m_ctrl(*this, "CTR0") , m_floppy(nullptr) { } - DECLARE_WRITE8_MEMBER(via_video_pba_w); - DECLARE_WRITE8_MEMBER(via_video_pbb_w); - DECLARE_WRITE_LINE_MEMBER(via_video_ca2_w); - DECLARE_READ8_MEMBER(kbd1_r); DECLARE_READ8_MEMBER(kbd2_r); DECLARE_READ8_MEMBER(shift_kb1_r); - DECLARE_READ8_MEMBER(shift_kb2_r); DECLARE_READ8_MEMBER(ctrl_kb1_r); - DECLARE_READ8_MEMBER(ctrl_kb2_r); DECLARE_WRITE8_MEMBER(scanlines_kbd1_w); DECLARE_WRITE8_MEMBER(scanlines_kbd2_w); - DECLARE_READ_LINE_MEMBER(via_keyb_ca2_r); - - virtual void machine_start() override; + void base(machine_config &config); +protected: virtual void machine_reset() override; - uint8_t m_row_kbd1; - uint8_t m_row_kbd2; - int old_state_ca2; - uint8_t via_video_pbb_data; - uint8_t cnttim; - uint8_t valkeyb; - TIMER_DEVICE_CALLBACK_MEMBER(goupil_scanline); - - void goupil_g1(machine_config &config); - void goupil_mem(address_map &map); -protected: + required_device<m6808_cpu_device> m_maincpu; required_device<acia6850_device> m_acia; - optional_device<ef9364_device> m_ef9364; - required_device<cpu_device> m_maincpu; required_device<via6522_device> m_via_video; required_device<via6522_device> m_via_keyb; required_device<via6522_device> m_via_modem; + required_device<palette_device> m_palette; + required_device<screen_device> m_screen; required_device<fd1791_device> m_fdc; required_device<floppy_connector> m_floppy0; required_device<floppy_connector> m_floppy1; + required_ioport m_ctrl; floppy_image_device *m_floppy; + + uint8_t m_row_kbd1; + uint8_t m_row_kbd2; + uint8_t m_cnttim; + uint8_t m_valkeyb; }; -class goupil_g2_state : public goupil_g1_state +class goupil_g1_state : public goupil_base_state +{ +public: + goupil_g1_state(const machine_config &mconfig, device_type type, const char *tag) + : goupil_base_state(mconfig, type, tag) + , m_ef9364(*this, "ef9364") + , m_scanline_timer(nullptr) + , m_old_state_ca2(0) + , m_via_video_pbb_data(0) + { } + + DECLARE_WRITE8_MEMBER(via_video_pba_w); + DECLARE_WRITE8_MEMBER(via_video_pbb_w); + DECLARE_WRITE_LINE_MEMBER(via_video_ca2_w); + + void goupil_g1(machine_config &config); +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + + enum + { + TIMER_SCANLINE + }; + + virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; + +private: + void mem(address_map &map); + + required_device<ef9364_device> m_ef9364; + + emu_timer *m_scanline_timer; + int m_old_state_ca2; + uint8_t m_via_video_pbb_data; +}; + +class goupil_g2_state : public goupil_base_state { public: goupil_g2_state(const machine_config &mconfig, device_type type, const char *tag) - : goupil_g1_state(mconfig, type, tag), - m_palette(*this, "palette"), - m_visu24x80_ram(*this, RAM_TAG), - m_visu24x80_rom(*this, "visu_24x80") + : goupil_base_state(mconfig, type, tag) + , m_visu24x80_ram(*this, RAM_TAG) + , m_visu24x80_rom(*this, "visu_24x80") { } @@ -121,10 +148,10 @@ public: DECLARE_WRITE8_MEMBER(visu24x80_ram_w); void goupil_g2(machine_config &config); - void goupil_g2_mem(address_map &map); -protected: - required_device<palette_device> m_palette; +private: + void mem(address_map &map); + required_device<ram_device> m_visu24x80_ram; required_region_ptr<uint8_t> m_visu24x80_rom; }; @@ -138,12 +165,20 @@ protected: * Keyboard I/O Handlers * ***********************************/ -TIMER_DEVICE_CALLBACK_MEMBER( goupil_g1_state::goupil_scanline ) +void goupil_g1_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) { - m_ef9364->update_scanline((uint16_t)param); + switch (id) + { + case TIMER_SCANLINE: + m_ef9364->update_scanline((uint16_t)m_screen->vpos()); + m_scanline_timer->adjust(m_screen->time_until_pos(m_screen->vpos() + 10)); + break; + default: + assert_always(false, "Unknown id in goupil_g1_state::device_timer"); + } } -void goupil_g1_state::goupil_mem(address_map &map) +void goupil_g1_state::mem(address_map &map) { map.unmap_value_high(); map(0x0000, 0x3FFF).ram(); @@ -171,7 +206,7 @@ void goupil_g1_state::goupil_mem(address_map &map) map(0xF800, 0xFFFF).rom().region("maincpu", 0xF800); // Monitor (MON 1 + MON 2) } -void goupil_g2_state::goupil_g2_mem(address_map &map) +void goupil_g2_state::mem(address_map &map) { map.unmap_value_high(); map(0x0000, 0x3FFF).ram(); @@ -202,58 +237,22 @@ void goupil_g2_state::goupil_g2_mem(address_map &map) map(0xF800, 0xFFFF).rom().region("maincpu", 0xF800); // Monitor (MON 2) } -WRITE8_MEMBER( goupil_g1_state::scanlines_kbd1_w ) +WRITE8_MEMBER( goupil_base_state::scanlines_kbd1_w ) { m_row_kbd1 = data; } -READ8_MEMBER( goupil_g1_state::ctrl_kb1_r ) +READ8_MEMBER( goupil_base_state::ctrl_kb1_r ) { - char kbdrow[6]; - unsigned char data; - - kbdrow[0] = 'C'; - kbdrow[1] = 'T'; - kbdrow[2] = 'R'; - kbdrow[3] = '0'; - kbdrow[4] = 0; - - data = ioport(kbdrow)->read(); - if( data & 0x02 ) - return 1; - else - return 0; + return BIT(m_ctrl->read(), 1); } -READ8_MEMBER( goupil_g1_state::ctrl_kb2_r ) +READ8_MEMBER( goupil_base_state::shift_kb1_r ) { - return 1; + return BIT(m_ctrl->read(), 0); } -READ8_MEMBER( goupil_g1_state::shift_kb1_r ) -{ - char kbdrow[6]; - unsigned char data; - - kbdrow[0] = 'C'; - kbdrow[1] = 'T'; - kbdrow[2] = 'R'; - kbdrow[3] = '0'; - kbdrow[4] = 0; - - data = ioport(kbdrow)->read(); - if( data & 0x01 ) - return 1; - else - return 0; -} - -READ8_MEMBER( goupil_g1_state::shift_kb2_r ) -{ - return 1; -} - -READ8_MEMBER( goupil_g1_state::kbd1_r ) +READ8_MEMBER( goupil_base_state::kbd1_r ) { char kbdrow[6]; uint8_t data = 0xff; @@ -268,17 +267,12 @@ READ8_MEMBER( goupil_g1_state::kbd1_r ) return data; } -WRITE8_MEMBER( goupil_g1_state::scanlines_kbd2_w ) +WRITE8_MEMBER( goupil_base_state::scanlines_kbd2_w ) { m_row_kbd2 = data & 7; } -READ_LINE_MEMBER( goupil_g1_state::via_keyb_ca2_r ) -{ - return 0; -} - -READ8_MEMBER( goupil_g1_state::kbd2_r ) +READ8_MEMBER( goupil_base_state::kbd2_r ) { char kbdrow[6]; uint8_t data = 0xff; @@ -451,40 +445,44 @@ static void goupil_floppies(device_slot_interface &device) device.option_add("525qd", FLOPPY_525_QD); } -void goupil_g1_state::machine_start() +void goupil_base_state::machine_reset() { - std::string region_tag; - m_floppy = nullptr; - valkeyb = 0xFF; + m_valkeyb = 0xFF; +} + +void goupil_g1_state::machine_start() +{ + m_scanline_timer = timer_alloc(TIMER_SCANLINE); } void goupil_g1_state::machine_reset() { + goupil_base_state::machine_reset(); + m_scanline_timer->adjust(m_screen->time_until_pos(m_screen->vpos() + 10)); + m_old_state_ca2 = 0; + m_via_video_pbb_data = 0; } WRITE8_MEMBER(goupil_g1_state::via_video_pba_w) { LOG("%s: write via_video_pba_w reg : 0x%X\n",machine().describe_context(),data); - - if(m_ef9364) - m_ef9364->char_latch_w(data); + m_ef9364->char_latch_w(data); } WRITE8_MEMBER(goupil_g1_state::via_video_pbb_w) { LOG("%s: write via_video_pbb_w reg : 0x%X\n",machine().describe_context(),data); - - via_video_pbb_data = data; + m_via_video_pbb_data = data; } WRITE_LINE_MEMBER( goupil_g1_state::via_video_ca2_w ) { - if(old_state_ca2==0 && state==1 && m_ef9364) + if (!m_old_state_ca2 && state) { - m_ef9364->command_w(via_video_pbb_data&0xF); + m_ef9364->command_w(m_via_video_pbb_data & 0xF); } - old_state_ca2 = state; + m_old_state_ca2 = state; } // Visu 24x80 video card update row. @@ -496,7 +494,7 @@ MC6845_UPDATE_ROW(goupil_g2_state::crtc_update_row) { uint16_t const offset = ( 0x400 + ( ma + x ) ) & 0x7FF; uint8_t const chr = m_visu24x80_ram->pointer()[offset]; - uint8_t const gfx = m_visu24x80_rom[ ( ( chr & 0x7F ) << 4 ) + ra ]; + uint8_t const gfx = m_visu24x80_rom[ ( ( chr & 0x7F ) << 4 ) + ra ] ^ ((x == cursor_x) ? 0xff : 0); for (unsigned bit = 0; 8 > bit; ++bit) { @@ -527,143 +525,107 @@ READ8_MEMBER( goupil_g2_state::visu24x80_ram_r ) return data; } -MACHINE_CONFIG_START(goupil_g1_state::goupil_g1) - /* basic machine hardware */ - MCFG_DEVICE_ADD("maincpu",M6808, CPU_CLOCK) - MCFG_DEVICE_PROGRAM_MAP(goupil_mem) - - /* sound hardware */ - // TODO ! - - MCFG_DEVICE_ADD ("ef6850", ACIA6850, 0) +void goupil_base_state::base(machine_config &config) +{ + M6808(config, m_maincpu, CPU_CLOCK); - /* screen */ - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(50) - MCFG_SCREEN_UPDATE_DEVICE("ef9364", ef9364_device, screen_update) + SCREEN(config, m_screen, SCREEN_TYPE_RASTER); + m_screen->set_refresh_hz(50); - MCFG_SCREEN_SIZE((64*8), (16*(8+4))) - MCFG_SCREEN_VISIBLE_AREA(0, (64*8)-1, 0, (16*(8+4))-1) - MCFG_PALETTE_ADD("palette", 16) + // TODO: sound hardware - MCFG_DEVICE_ADD("ef9364", EF9364, VIDEO_CLOCK) - MCFG_EF9364_PALETTE("palette") - MCFG_EF9364_PAGES_CNT(1); - MCFG_TIMER_DRIVER_ADD_SCANLINE("goupil_sl", goupil_g1_state, goupil_scanline, "screen", 0, 10) + ACIA6850(config, m_acia, 0); - MCFG_DEVICE_ADD("m_via_video", VIA6522, CPU_CLOCK / 4) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, goupil_g1_state, via_video_pba_w)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, goupil_g1_state, via_video_pbb_w)) - MCFG_VIA6522_CA2_HANDLER(WRITELINE(*this, goupil_g1_state, via_video_ca2_w)) + // TODO: Is this specific to the G1? + VIA6522(config, m_via_video, CPU_CLOCK / 4); - MCFG_DEVICE_ADD("m_via_keyb", VIA6522, CPU_CLOCK / 4) - MCFG_VIA6522_IRQ_HANDLER(INPUTLINE("maincpu", M6808_IRQ_LINE)) + VIA6522(config, m_via_keyb, CPU_CLOCK / 4); + m_via_keyb->irq_handler().set_inputline(m_maincpu, M6808_IRQ_LINE); - MCFG_DEVICE_ADD("m_via_modem", VIA6522, CPU_CLOCK / 4) - MCFG_VIA6522_IRQ_HANDLER(INPUTLINE("maincpu", M6808_IRQ_LINE)) + VIA6522(config, m_via_modem, CPU_CLOCK / 4); + m_via_modem->irq_handler().set_inputline(m_maincpu, M6808_IRQ_LINE); /* Floppy */ - MCFG_DEVICE_ADD("fd1791", FD1791, 8_MHz_XTAL) - MCFG_FLOPPY_DRIVE_ADD("fd1791:0", goupil_floppies, "525qd", floppy_image_device::default_floppy_formats) - MCFG_FLOPPY_DRIVE_ADD("fd1791:1", goupil_floppies, "525qd", floppy_image_device::default_floppy_formats) + FD1791(config, m_fdc, 8_MHz_XTAL); + FLOPPY_CONNECTOR(config, m_floppy0, goupil_floppies, "525qd", floppy_image_device::default_floppy_formats); + FLOPPY_CONNECTOR(config, m_floppy1, goupil_floppies, "525qd", floppy_image_device::default_floppy_formats); + + i8279_device &i8279_kb1(I8279(config, "i8279_kb1", CPU_CLOCK)); + i8279_kb1.out_sl_callback().set(FUNC(goupil_g1_state::scanlines_kbd1_w)); // scan SL lines + i8279_kb1.in_rl_callback().set(FUNC(goupil_g1_state::kbd1_r)); // kbd RL lines + i8279_kb1.in_shift_callback().set(FUNC(goupil_g1_state::shift_kb1_r)); + i8279_kb1.in_ctrl_callback().set(FUNC(goupil_g1_state::ctrl_kb1_r)); + i8279_kb1.out_irq_callback().set(m_via_keyb, FUNC(via6522_device::write_ca1)); + + i8279_device &i8279_kb2(I8279(config, "i8279_kb2", CPU_CLOCK)); + i8279_kb2.out_sl_callback().set(FUNC(goupil_g1_state::scanlines_kbd2_w)); // scan SL lines + i8279_kb2.in_rl_callback().set(FUNC(goupil_g1_state::kbd2_r)); // kbd RL lines + i8279_kb2.in_shift_callback().set_constant(1); + i8279_kb2.in_ctrl_callback().set_constant(1); +} - MCFG_DEVICE_ADD("i8279_kb1", I8279, CPU_CLOCK) - MCFG_I8279_OUT_SL_CB(WRITE8(*this, goupil_g1_state, scanlines_kbd1_w)) // scan SL lines - MCFG_I8279_IN_RL_CB(READ8(*this, goupil_g1_state, kbd1_r)) // kbd RL lines - MCFG_I8279_IN_SHIFT_CB(READ8(*this, goupil_g1_state, shift_kb1_r)) - MCFG_I8279_IN_CTRL_CB(READ8(*this, goupil_g1_state, ctrl_kb1_r)) - MCFG_I8279_OUT_IRQ_CB(WRITELINE("m_via_keyb", via6522_device, write_ca1)) +void goupil_g1_state::goupil_g1(machine_config &config) +{ + base(config); + m_maincpu->set_addrmap(AS_PROGRAM, &goupil_g1_state::mem); - MCFG_DEVICE_ADD("i8279_kb2", I8279, CPU_CLOCK) - MCFG_I8279_OUT_SL_CB(WRITE8(*this, goupil_g1_state, scanlines_kbd2_w)) // scan SL lines - MCFG_I8279_IN_RL_CB(READ8(*this, goupil_g1_state, kbd2_r)) // kbd RL lines - MCFG_I8279_IN_SHIFT_CB(READ8(*this, goupil_g1_state, shift_kb2_r)) - MCFG_I8279_IN_CTRL_CB(READ8(*this, goupil_g1_state, ctrl_kb2_r)) + m_screen->set_screen_update("ef9364", FUNC(ef9364_device::screen_update)); + m_screen->set_size(64*8, 16*(8+4)); + m_screen->set_visarea(0, 64*8-1, 0, 16*(8+4)-1); -MACHINE_CONFIG_END + PALETTE(config, m_palette, 16); -MACHINE_CONFIG_START(goupil_g2_state::goupil_g2) - /* basic machine hardware */ - MCFG_DEVICE_ADD("maincpu",M6808, CPU_CLOCK) - MCFG_DEVICE_PROGRAM_MAP(goupil_g2_mem) + EF9364(config, m_ef9364, VIDEO_CLOCK); + m_ef9364->set_palette_tag("palette"); + m_ef9364->set_nb_of_pages(1); - /* sound hardware */ - // TODO ! + m_via_video->writepa_handler().set(FUNC(goupil_g1_state::via_video_pba_w)); + m_via_video->writepb_handler().set(FUNC(goupil_g1_state::via_video_pbb_w)); + m_via_video->ca2_handler().set(FUNC(goupil_g1_state::via_video_ca2_w)); +} - MCFG_DEVICE_ADD ("ef6850", ACIA6850, 0) +void goupil_g2_state::goupil_g2(machine_config &config) +{ + base(config); + m_maincpu->set_addrmap(AS_PROGRAM, &goupil_g2_state::mem); - /* screen */ // "visu 24x80" board + RAM(config, m_visu24x80_ram); + m_visu24x80_ram->set_default_size("2K"); // visu24x80 2K ram - MCFG_RAM_ADD(RAM_TAG) - MCFG_RAM_DEFAULT_SIZE("2K") // visu24x80 2K ram - - MCFG_SCREEN_ADD("screen" ,RASTER) - MCFG_SCREEN_REFRESH_RATE(50) - MCFG_SCREEN_NO_PALETTE - MCFG_SCREEN_UPDATE_DEVICE("crtc", mc6845_device, screen_update) - - MCFG_SCREEN_SIZE((80*8), (24*(8+4))) - MCFG_SCREEN_VISIBLE_AREA(0, (80*8)-1, 0, (24*(8+4))-1) - MCFG_PALETTE_ADD_MONOCHROME_HIGHLIGHT("palette") - - MCFG_MC6845_ADD("crtc", MC6845, "screen", 14.318181_MHz_XTAL / 8) - MCFG_MC6845_SHOW_BORDER_AREA(false) - MCFG_MC6845_CHAR_WIDTH(8) - MCFG_MC6845_UPDATE_ROW_CB(goupil_g2_state, crtc_update_row) - MCFG_MC6845_ADDR_CHANGED_CB(goupil_g2_state, crtc_update_addr_changed) + m_screen->set_screen_update("crtc", FUNC(mc6845_device::screen_update)); + m_screen->set_size((80*8), (24*(8+4))); + m_screen->set_visarea(0, (80*8)-1, 0, (24*(8+4))-1); - MCFG_DEVICE_ADD("m_via_video", VIA6522, CPU_CLOCK / 4) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, goupil_g2_state, via_video_pba_w)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, goupil_g2_state, via_video_pbb_w)) - MCFG_VIA6522_CA2_HANDLER(WRITELINE(*this, goupil_g2_state, via_video_ca2_w)) + PALETTE(config, m_palette, 2); + m_palette->set_init("palette", FUNC(palette_device::palette_init_monochrome_highlight)); - MCFG_DEVICE_ADD("m_via_keyb", VIA6522, CPU_CLOCK / 4) - MCFG_VIA6522_IRQ_HANDLER(INPUTLINE("maincpu", M6808_IRQ_LINE)) + mc6845_device &crtc(MC6845(config, "crtc", 14.318181_MHz_XTAL / 8)); + crtc.set_show_border_area(false); + crtc.set_char_width(8); + crtc.set_update_row_callback(FUNC(goupil_g2_state::crtc_update_row), this); + crtc.set_on_update_addr_change_callback(FUNC(goupil_g2_state::crtc_update_addr_changed), this); - MCFG_DEVICE_ADD("m_via_modem", VIA6522, CPU_CLOCK / 4) - MCFG_VIA6522_IRQ_HANDLER(INPUTLINE("maincpu", M6808_IRQ_LINE)) - - /* Floppy */ - MCFG_DEVICE_ADD("fd1791", FD1791, 8_MHz_XTAL) - MCFG_FLOPPY_DRIVE_ADD("fd1791:0", goupil_floppies, "525qd", floppy_image_device::default_floppy_formats) - MCFG_FLOPPY_DRIVE_ADD("fd1791:1", goupil_floppies, "525qd", floppy_image_device::default_floppy_formats) - - MCFG_DEVICE_ADD("i8279_kb1", I8279, CPU_CLOCK) - MCFG_I8279_OUT_SL_CB(WRITE8(*this, goupil_g2_state, scanlines_kbd1_w)) // scan SL lines - MCFG_I8279_IN_RL_CB(READ8(*this, goupil_g2_state, kbd1_r)) // kbd RL lines - MCFG_I8279_IN_SHIFT_CB(READ8(*this, goupil_g2_state, shift_kb1_r)) - MCFG_I8279_IN_CTRL_CB(READ8(*this, goupil_g2_state, ctrl_kb1_r)) - MCFG_I8279_OUT_IRQ_CB(WRITELINE("m_via_keyb", via6522_device, write_ca1)) - - MCFG_DEVICE_ADD("i8279_kb2", I8279, CPU_CLOCK) - MCFG_I8279_OUT_SL_CB(WRITE8(*this, goupil_g2_state, scanlines_kbd2_w)) // scan SL lines - MCFG_I8279_IN_RL_CB(READ8(*this, goupil_g2_state, kbd2_r)) // kbd RL lines - MCFG_I8279_IN_SHIFT_CB(READ8(*this, goupil_g2_state, shift_kb2_r)) - MCFG_I8279_IN_CTRL_CB(READ8(*this, goupil_g2_state, ctrl_kb2_r)) - -MACHINE_CONFIG_END + m_via_video->writepa_handler().set_nop(); + m_via_video->writepb_handler().set_nop(); + m_via_video->ca2_handler().set_nop(); +} /* ROM definition */ ROM_START( goupilg1 ) ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_DEFAULT_BIOS("v1_0") - - ROM_SYSTEM_BIOS(0, "v1_0", "Version 1.0") - ROMX_LOAD( "smt_goupil_g1_mon_1.bin", 0xF800, 0x0400, CRC(98b7be69) SHA1(69e83fe78a43fcf2b08fb0bcefb0d217a57b1ecb), ROM_BIOS(0) ) - ROM_LOAD ( "smt_goupil_g1_mon_2.bin", 0xFC00, 0x0400, CRC(19386b81) SHA1(e52f63fd29d374319781e9677de6d3fd61a3684c) ) - - ROM_LOAD ( "smt_goupil_g1_mod_3.bin", 0xF400, 0x0400, CRC(e662f152) SHA1(11b91c5737e7572a2c18472b66bbd16b485132d5) ) - - ROMX_LOAD( "smt_goupil_g1_basic_1.bin", 0xC000, 0x0400, CRC(ad105b12) SHA1(631cd4b997f76b57bf2509e4bff30b1595c8bd13), ROM_BIOS(0) ) - ROMX_LOAD( "smt_goupil_g1_basic_2.bin", 0xC400, 0x0400, CRC(0c5c309c) SHA1(f1cab4b0f9191e53113790a95f1ab7108f9406a1), ROM_BIOS(0) ) - ROMX_LOAD( "smt_goupil_g1_basic_3.bin", 0xC800, 0x0400, CRC(1f1eb127) SHA1(dbbb880c79d515acbfcb2be9a4c96962f3e4edea), ROM_BIOS(0) ) - ROMX_LOAD( "smt_goupil_g1_basic_4.bin", 0xCC00, 0x0400, CRC(09be48e4) SHA1(86cae0d159583c1d572a5754f3bb6b4a2e479359), ROM_BIOS(0) ) - ROMX_LOAD( "smt_goupil_g1_basic_5.bin", 0xD000, 0x0400, CRC(bdeb395c) SHA1(32a50468f1ca772ee45a1f5c61c66f3ecc774074), ROM_BIOS(0) ) - ROMX_LOAD( "smt_goupil_g1_basic_6.bin", 0xD400, 0x0400, CRC(850a4000) SHA1(720f0bb3e45877835219b7e1d943ef4f19b9977d), ROM_BIOS(0) ) - ROMX_LOAD( "smt_goupil_g1_basic_7.bin", 0xD800, 0x0400, CRC(586c7670) SHA1(13e2e96b9f1a53555ce0d55f657cf3c6b96f10a0), ROM_BIOS(0) ) - ROMX_LOAD( "smt_goupil_g1_basic_8.bin", 0xDC00, 0x0400, CRC(33281300) SHA1(ce631fa8157a3f8869c5fefe24b7f40e06696df9), ROM_BIOS(0) ) - ROMX_LOAD( "smt_goupil_g1_basic_9.bin", 0xE000, 0x0400, CRC(a3911201) SHA1(8623a0a2d83eb3a27a795030643c5c05a4350a9f), ROM_BIOS(0) ) + ROM_LOAD( "smt_goupil_g1_basic_1.bin", 0xC000, 0x0400, CRC(ad105b12) SHA1(631cd4b997f76b57bf2509e4bff30b1595c8bd13) ) + ROM_LOAD( "smt_goupil_g1_basic_2.bin", 0xC400, 0x0400, CRC(0c5c309c) SHA1(f1cab4b0f9191e53113790a95f1ab7108f9406a1) ) + ROM_LOAD( "smt_goupil_g1_basic_3.bin", 0xC800, 0x0400, CRC(1f1eb127) SHA1(dbbb880c79d515acbfcb2be9a4c96962f3e4edea) ) + ROM_LOAD( "smt_goupil_g1_basic_4.bin", 0xCC00, 0x0400, CRC(09be48e4) SHA1(86cae0d159583c1d572a5754f3bb6b4a2e479359) ) + ROM_LOAD( "smt_goupil_g1_basic_5.bin", 0xD000, 0x0400, CRC(bdeb395c) SHA1(32a50468f1ca772ee45a1f5c61c66f3ecc774074) ) + ROM_LOAD( "smt_goupil_g1_basic_6.bin", 0xD400, 0x0400, CRC(850a4000) SHA1(720f0bb3e45877835219b7e1d943ef4f19b9977d) ) + ROM_LOAD( "smt_goupil_g1_basic_7.bin", 0xD800, 0x0400, CRC(586c7670) SHA1(13e2e96b9f1a53555ce0d55f657cf3c6b96f10a0) ) + ROM_LOAD( "smt_goupil_g1_basic_8.bin", 0xDC00, 0x0400, CRC(33281300) SHA1(ce631fa8157a3f8869c5fefe24b7f40e06696df9) ) + ROM_LOAD( "smt_goupil_g1_basic_9.bin", 0xE000, 0x0400, CRC(a3911201) SHA1(8623a0a2d83eb3a27a795030643c5c05a4350a9f) ) + ROM_LOAD( "smt_goupil_g1_mod_3.bin", 0xF400, 0x0400, CRC(e662f152) SHA1(11b91c5737e7572a2c18472b66bbd16b485132d5) ) + ROM_LOAD( "smt_goupil_g1_mon_1.bin", 0xF800, 0x0400, CRC(98b7be69) SHA1(69e83fe78a43fcf2b08fb0bcefb0d217a57b1ecb) ) + ROM_LOAD( "smt_goupil_g1_mon_2.bin", 0xFC00, 0x0400, CRC(19386b81) SHA1(e52f63fd29d374319781e9677de6d3fd61a3684c) ) ROM_REGION( 0x400, "ef9364", 0 ) ROM_LOAD( "smt_goupil_g1_charset.bin", 0x0000, 0x0400, CRC(8b6da54b) SHA1(ac2204600f45c6dd0df1e759b62ed25928f02a12) ) @@ -672,17 +634,13 @@ ROM_END /* ROM definition */ ROM_START( goupilg2 ) ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_DEFAULT_BIOS("v1_4") - - ROM_SYSTEM_BIOS(0, "v1_4", "Version 1.4") - ROMX_LOAD( "smt_goupil_g2_mon_1.bin", 0xF000, 0x0800, CRC(91a4f256) SHA1(ece3b47a17e47fc87e2262be806ce8015f5f5db6), ROM_BIOS(0) ) - ROM_LOAD ( "smt_goupil_g2_mon_2.bin", 0xF800, 0x0800, CRC(f7783a32) SHA1(7368fc0bd86b48e6727367bd7d1922f219741015) ) - - ROM_LOAD ( "smt_goupil_g2_mod_1.bin", 0xC000, 0x0400, CRC(4d585e40) SHA1(7558f89db52299c4c305755259d5c908b3f66ac7) ) - ROM_LOAD ( "smt_goupil_g2_mod_2.bin", 0xC400, 0x0400, CRC(c5531667) SHA1(24b0a1d3b812b95e68f4dc4323581b1fd14eb4fb) ) + ROM_LOAD( "smt_goupil_g2_mod_1.bin", 0xC000, 0x0400, CRC(4d585e40) SHA1(7558f89db52299c4c305755259d5c908b3f66ac7) ) + ROM_LOAD( "smt_goupil_g2_mod_2.bin", 0xC400, 0x0400, CRC(c5531667) SHA1(24b0a1d3b812b95e68f4dc4323581b1fd14eb4fb) ) + ROM_LOAD( "smt_goupil_g2_mon_1.bin", 0xF000, 0x0800, CRC(91a4f256) SHA1(ece3b47a17e47fc87e2262be806ce8015f5f5db6) ) + ROM_LOAD( "smt_goupil_g2_mon_2.bin", 0xF800, 0x0800, CRC(f7783a32) SHA1(7368fc0bd86b48e6727367bd7d1922f219741015) ) ROM_REGION( 0x400, "ef9364", 0 ) - ROM_LOAD ( "smt_goupil_g2_charset.bin", 0x0000, 0x0400, CRC(d3930877) SHA1(7b790fb18f8893cfc753bf622c8b795075741d22) ) + ROM_LOAD( "smt_goupil_g2_charset.bin", 0x0000, 0x0400, CRC(d3930877) SHA1(7b790fb18f8893cfc753bf622c8b795075741d22) ) ROM_REGION( 0x800, "visu_24x80", 0 ) ROM_LOAD( "smt_goupil_g2_charset_24x80.bin", 0x0000, 0x0800, CRC(f0f83b99) SHA1(75a7730aec30280ee4ccf3dcaf587eea4f861196) ) diff --git a/src/mame/drivers/gts3.cpp b/src/mame/drivers/gts3.cpp index 11832e8271c..839b3cec390 100644 --- a/src/mame/drivers/gts3.cpp +++ b/src/mame/drivers/gts3.cpp @@ -285,35 +285,34 @@ void gts3_state::init_gts3() { } -MACHINE_CONFIG_START(gts3_state::gts3) - /* basic machine hardware */ - MCFG_DEVICE_ADD("maincpu", M65C02, XTAL(4'000'000) / 2) - MCFG_DEVICE_PROGRAM_MAP(gts3_map) - MCFG_NVRAM_ADD_0FILL("nvram") +void gts3_state::gts3(machine_config &config) +{ + M65C02(config, m_maincpu, XTAL(4'000'000) / 2); + m_maincpu->set_addrmap(AS_PROGRAM, >s3_state::gts3_map); + + NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); - /* Video */ config.set_default_layout(layout_gts3); - /* Sound */ genpin_audio(config); - MCFG_DEVICE_ADD("u4", VIA6522, XTAL(4'000'000) / 2) - MCFG_VIA6522_IRQ_HANDLER(INPUTLINE("maincpu", M65C02_IRQ_LINE)) - MCFG_VIA6522_READPA_HANDLER(READ8(*this, gts3_state, u4a_r)) - MCFG_VIA6522_READPB_HANDLER(READ8(*this, gts3_state, u4b_r)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, gts3_state, u4b_w)) - //MCFG_VIA6522_CA2_HANDLER(WRITELINE(*this, gts3_state, u4ca2_w)) - MCFG_VIA6522_CB2_HANDLER(WRITELINE(*this, gts3_state, nmi_w)) - - MCFG_DEVICE_ADD("u5", VIA6522, XTAL(4'000'000) / 2) - MCFG_VIA6522_IRQ_HANDLER(INPUTLINE("maincpu", M65C02_IRQ_LINE)) - //MCFG_VIA6522_READPA_HANDLER(READ8(*this, gts3_state, u5a_r)) - //MCFG_VIA6522_READPB_HANDLER(READ8(*this, gts3_state, u5b_r)) - //MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, gts3_state, u5b_w)) - //MCFG_VIA6522_CA2_HANDLER(WRITELINE(*this, gts3_state, u5ca2_w)) - //MCFG_VIA6522_CB1_HANDLER(WRITELINE(*this, gts3_state, u5cb1_w)) - //MCFG_VIA6522_CB2_HANDLER(WRITELINE(*this, gts3_state, u5cb2_w)) -MACHINE_CONFIG_END + VIA6522(config, m_u4, XTAL(4'000'000) / 2); + m_u4->irq_handler().set_inputline(m_maincpu, M65C02_IRQ_LINE); + m_u4->readpa_handler().set(FUNC(gts3_state::u4a_r)); + m_u4->readpb_handler().set(FUNC(gts3_state::u4b_r)); + m_u4->writepb_handler().set(FUNC(gts3_state::u4b_w)); + //m_u4->ca2_handler().set(FUNC(gts3_state::u4ca2_w)); + m_u4->cb2_handler().set(FUNC(gts3_state::nmi_w)); + + VIA6522(config, m_u5, XTAL(4'000'000) / 2); + m_u5->irq_handler().set_inputline(m_maincpu, M65C02_IRQ_LINE); + //m_u5->readpa_handler().set(FUNC(gts3_state::u5a_r)); + //m_u5->readpb_handler().set(FUNC(gts3_state::u5b_r)); + //m_u5->writepb_handler().set(FUNC(gts3_state::u5b_w)); + //m_u5->ca2_handler().set(FUNC(gts3_state::u5ca2_w)); + //m_u5->cb1_handler().set(FUNC(gts3_state::u5cb1_w)); + //m_u5->cb2_handler().set(FUNC(gts3_state::u5cb2_w)); +} /*------------------------------------------------------------------- / Amazon Hunt III (#684D) diff --git a/src/mame/drivers/gts3a.cpp b/src/mame/drivers/gts3a.cpp index 7381d4c723f..1c973f5c28f 100644 --- a/src/mame/drivers/gts3a.cpp +++ b/src/mame/drivers/gts3a.cpp @@ -57,7 +57,7 @@ private: DECLARE_WRITE8_MEMBER(dmd_w); DECLARE_WRITE_LINE_MEMBER(nmi_w); MC6845_UPDATE_ROW(crtc_update_row); - DECLARE_PALETTE_INIT(gts3a); + void palette_init(palette_device &palette); required_device<palette_device> m_palette; void gts3a_dmd_map(address_map &map); void gts3a_map(address_map &map); @@ -313,7 +313,7 @@ WRITE8_MEMBER( gts3a_state::dmd_w ) membank("bank1")->set_entry(data & 0x1f); } -PALETTE_INIT_MEMBER( gts3a_state, gts3a ) +void gts3a_state::palette_init(palette_device &palette) { palette.set_pen_color(0, rgb_t(0x00, 0x00, 0x00)); palette.set_pen_color(1, rgb_t(0xf7, 0x00, 0x00)); @@ -343,50 +343,53 @@ MC6845_UPDATE_ROW( gts3a_state::crtc_update_row ) } } -MACHINE_CONFIG_START(gts3a_state::gts3a) - /* basic machine hardware */ - MCFG_DEVICE_ADD("maincpu", M65C02, XTAL(4'000'000) / 2) - MCFG_DEVICE_PROGRAM_MAP(gts3a_map) - MCFG_NVRAM_ADD_0FILL("nvram") // 6116LP + DS1210 +void gts3a_state::gts3a(machine_config &config) +{ + M65C02(config, m_maincpu, XTAL(4'000'000) / 2); + m_maincpu->set_addrmap(AS_PROGRAM, >s3a_state::gts3a_map); + + NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); // 6116LP + DS1210 - MCFG_DEVICE_ADD("dmdcpu", M65C02, XTAL(3'579'545) / 2) - MCFG_DEVICE_PROGRAM_MAP(gts3a_dmd_map) + M65C02(config, m_dmdcpu, XTAL(3'579'545) / 2); + m_dmdcpu->set_addrmap(AS_PROGRAM, >s3a_state::gts3a_dmd_map); /* Video */ - MCFG_SCREEN_ADD("screen", LCD) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) - MCFG_SCREEN_UPDATE_DEVICE("crtc", mc6845_device, screen_update) - MCFG_SCREEN_SIZE(128, 32) - MCFG_SCREEN_VISIBLE_AREA(0, 127, 0, 31) - MCFG_PALETTE_ADD( "palette", 2 ) - MCFG_PALETTE_INIT_OWNER(gts3a_state, gts3a) - - MCFG_MC6845_ADD("crtc", MC6845, "screen", XTAL(3'579'545) / 2) - MCFG_MC6845_SHOW_BORDER_AREA(false) - MCFG_MC6845_CHAR_WIDTH(8) - MCFG_MC6845_UPDATE_ROW_CB(gts3a_state, crtc_update_row) + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD)); + screen.set_refresh_hz(60); + screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); + screen.set_screen_update("crtc", FUNC(mc6845_device::screen_update)); + screen.set_size(128, 32); + screen.set_visarea(0, 127, 0, 31); + + PALETTE(config, m_palette, 2); + m_palette->set_init(DEVICE_SELF_OWNER, FUNC(gts3a_state::palette_init)); + + mc6845_device &crtc(MC6845(config, "crtc", XTAL(3'579'545) / 2)); + crtc.set_screen("screen"); + crtc.set_show_border_area(false); + crtc.set_char_width(8); + crtc.set_update_row_callback(FUNC(gts3a_state::crtc_update_row), this); /* Sound */ genpin_audio(config); - MCFG_DEVICE_ADD("u4", VIA6522, XTAL(4'000'000) / 2) - MCFG_VIA6522_IRQ_HANDLER(INPUTLINE("maincpu", M65C02_IRQ_LINE)) - MCFG_VIA6522_READPA_HANDLER(READ8(*this, gts3a_state, u4a_r)) - MCFG_VIA6522_READPB_HANDLER(READ8(*this, gts3a_state, u4b_r)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, gts3a_state, u4b_w)) - //MCFG_VIA6522_CA2_HANDLER(WRITELINE(*this, gts3a_state, u4ca2_w)) - MCFG_VIA6522_CB2_HANDLER(WRITELINE(*this, gts3a_state, nmi_w)) - - MCFG_DEVICE_ADD("u5", VIA6522, XTAL(4'000'000) / 2) - MCFG_VIA6522_IRQ_HANDLER(INPUTLINE("maincpu", M65C02_IRQ_LINE)) - //MCFG_VIA6522_READPA_HANDLER(READ8(*this, gts3a_state, u5a_r)) - //MCFG_VIA6522_READPB_HANDLER(READ8(*this, gts3a_state, u5b_r)) - //MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, gts3a_state, u5b_w)) - //MCFG_VIA6522_CA2_HANDLER(WRITELINE(*this, gts3a_state, u5ca2_w)) - //MCFG_VIA6522_CB1_HANDLER(WRITELINE(*this, gts3a_state, u5cb1_w)) - //MCFG_VIA6522_CB2_HANDLER(WRITELINE(*this, gts3a_state, u5cb2_w)) -MACHINE_CONFIG_END + VIA6522(config, m_u4, XTAL(4'000'000) / 2); + m_u4->irq_handler().set_inputline(m_maincpu, M65C02_IRQ_LINE); + m_u4->readpa_handler().set(FUNC(gts3a_state::u4a_r)); + m_u4->readpb_handler().set(FUNC(gts3a_state::u4b_r)); + m_u4->writepb_handler().set(FUNC(gts3a_state::u4b_w)); + //m_u4->ca2_handler().set(FUNC(gts3a_state::u4ca2_w)); + m_u4->cb2_handler().set(FUNC(gts3a_state::nmi_w)); + + VIA6522(config, m_u5, XTAL(4'000'000) / 2); + m_u5->irq_handler().set_inputline(m_maincpu, M65C02_IRQ_LINE); + //m_u5->readpa_handler().set(FUNC(gts3a_state::u5a_r)); + //m_u5->readpb_handler().set(FUNC(gts3a_state::u5b_r)); + //m_u5->writepb_Handler().set(FUNC(gts3a_state::u5b_w)); + //m_u5->ca2_Handler().set(FUNC(gts3a_state::u5ca2_w)); + //m_u5->cb1_Handler().set(FUNC(gts3a_state::u5cb1_w)); + //m_u5->cb2_Handler().set(FUNC(gts3a_state::u5cb2_w)); +} /*------------------------------------------------------------------- / Barb Wire (#748) diff --git a/src/mame/drivers/gts80.cpp b/src/mame/drivers/gts80.cpp index 3c525acea07..80e2c2b2e59 100644 --- a/src/mame/drivers/gts80.cpp +++ b/src/mame/drivers/gts80.cpp @@ -367,24 +367,26 @@ MACHINE_CONFIG_START(gts80_state::gts80) config.set_default_layout(layout_gts80); /* Devices */ - MCFG_DEVICE_ADD("riot1", RIOT6532, XTAL(3'579'545)/4) - MCFG_RIOT6532_IN_PA_CB(READ8(*this, gts80_state, port1a_r)) // sw_r - //MCFG_RIOT6532_OUT_PA_CB(WRITE8(*this, gts80_state, port1a_w)) - //MCFG_RIOT6532_IN_PB_CB(READ8(*this, gts80_state, port1b_r)) - MCFG_RIOT6532_OUT_PB_CB(WRITE8(*this, gts80_state, port1b_w)) // sw_w - MCFG_RIOT6532_IRQ_CB(INPUTLINE("maincpu", M6502_IRQ_LINE)) - MCFG_DEVICE_ADD("riot2", RIOT6532, XTAL(3'579'545)/4) - MCFG_RIOT6532_IN_PA_CB(READ8(*this, gts80_state, port2a_r)) // pa7 - slam tilt - MCFG_RIOT6532_OUT_PA_CB(WRITE8(*this, gts80_state, port2a_w)) // digit select - //MCFG_RIOT6532_IN_PB_CB(READ8(*this, gts80_state, port2b_r)) - MCFG_RIOT6532_OUT_PB_CB(WRITE8(*this, gts80_state, port2b_w)) // seg - MCFG_RIOT6532_IRQ_CB(INPUTLINE("maincpu", M6502_IRQ_LINE)) - MCFG_DEVICE_ADD("riot3", RIOT6532, XTAL(3'579'545)/4) - //MCFG_RIOT6532_IN_PA_CB(READ8(*this, gts80_state, port3a_r)) - MCFG_RIOT6532_OUT_PA_CB(WRITE8(*this, gts80_state, port3a_w)) // sol, snd - //MCFG_RIOT6532_IN_PB_CB(READ8(*this, gts80_state, port3b_r)) - MCFG_RIOT6532_OUT_PB_CB(WRITE8(*this, gts80_state, port3b_w)) // lamps - MCFG_RIOT6532_IRQ_CB(INPUTLINE("maincpu", M6502_IRQ_LINE)) + riot6532_device &riot1(RIOT6532(config, "riot1", XTAL(3'579'545)/4)); + riot1.in_pa_callback().set(FUNC(gts80_state::port1a_r)); // sw_r + //riot1.out_pa_callback().set(FUNC(gts80_state::port1a_w)); + //riot1.in_pb_callback().set(FUNC(gts80_state::port1b_r)); + riot1.out_pb_callback().set(FUNC(gts80_state::port1b_w)); // sw_w + riot1.irq_callback().set_inputline("maincpu", M6502_IRQ_LINE); + + riot6532_device &riot2(RIOT6532(config, "riot2", XTAL(3'579'545)/4)); + riot2.in_pa_callback().set(FUNC(gts80_state::port2a_r)); // pa7 - slam tilt + riot2.out_pa_callback().set(FUNC(gts80_state::port2a_w)); // digit select + //riot2.in_pb_callback().set(FUNC(gts80_state::port2b_r)); + riot2.out_pb_callback().set(FUNC(gts80_state::port2b_w)); // seg + riot2.irq_callback().set_inputline("maincpu", M6502_IRQ_LINE); + + riot6532_device &riot3(RIOT6532(config, "riot3", XTAL(3'579'545)/4)); + //riot3.in_pa_callback().set(FUNC(gts80_state::port3a_r)); + riot3.out_pa_callback().set(FUNC(gts80_state::port3a_w)); // sol, snd + //riot3.in_pb_callback().set(FUNC(gts80_state::port3b_r)); + riot3.out_pb_callback().set(FUNC(gts80_state::port3b_w)); // lamps + riot3.irq_callback().set_inputline("maincpu", M6502_IRQ_LINE); /* Sound */ genpin_audio(config); diff --git a/src/mame/drivers/gts80a.cpp b/src/mame/drivers/gts80a.cpp index d0ff17e18b2..fb42ca45704 100644 --- a/src/mame/drivers/gts80a.cpp +++ b/src/mame/drivers/gts80a.cpp @@ -358,24 +358,26 @@ MACHINE_CONFIG_START(gts80a_state::gts80a) config.set_default_layout(layout_gts80a); /* Devices */ - MCFG_DEVICE_ADD("riot1", RIOT6532, XTAL(3'579'545)/4) - MCFG_RIOT6532_IN_PA_CB(READ8(*this, gts80a_state, port1a_r)) // sw_r - //MCFG_RIOT6532_OUT_PA_CB(WRITE8(*this, gts80a_state, port1a_w)) - //MCFG_RIOT6532_IN_PB_CB(READ8(*this, gts80a_state, port1b_r)) - MCFG_RIOT6532_OUT_PB_CB(WRITE8(*this, gts80a_state, port1b_w)) // sw_w - MCFG_RIOT6532_IRQ_CB(INPUTLINE("maincpu", M6502_IRQ_LINE)) - MCFG_DEVICE_ADD("riot2", RIOT6532, XTAL(3'579'545)/4) - MCFG_RIOT6532_IN_PA_CB(READ8(*this, gts80a_state, port2a_r)) // pa7 - slam tilt - MCFG_RIOT6532_OUT_PA_CB(WRITE8(*this, gts80a_state, port2a_w)) // digit select - //MCFG_RIOT6532_IN_PB_CB(READ8(*this, gts80a_state, port2b_r)) - MCFG_RIOT6532_OUT_PB_CB(WRITE8(*this, gts80a_state, port2b_w)) // seg - MCFG_RIOT6532_IRQ_CB(INPUTLINE("maincpu", M6502_IRQ_LINE)) - MCFG_DEVICE_ADD("riot3", RIOT6532, XTAL(3'579'545)/4) - //MCFG_RIOT6532_IN_PA_CB(READ8(*this, gts80a_state, port3a_r)) - MCFG_RIOT6532_OUT_PA_CB(WRITE8(*this, gts80a_state, port3a_w)) // sol, snd - //MCFG_RIOT6532_IN_PB_CB(READ8(*this, gts80a_state, port3b_r)) - MCFG_RIOT6532_OUT_PB_CB(WRITE8(*this, gts80a_state, port3b_w)) // lamps - MCFG_RIOT6532_IRQ_CB(INPUTLINE("maincpu", M6502_IRQ_LINE)) + riot6532_device &riot1(RIOT6532(config, "riot1", XTAL(3'579'545)/4)); + riot1.in_pa_callback().set(FUNC(gts80a_state::port1a_r)); // sw_r + //riot1.out_pa_callback().set(FUNC(gts80a_state::port1a_w)); + //riot1.in_pb_callback().set(FUNC(gts80a_state::port1b_r)); + riot1.out_pb_callback().set(FUNC(gts80a_state::port1b_w)); // sw_w + riot1.irq_callback().set_inputline("maincpu", M6502_IRQ_LINE); + + riot6532_device &riot2(RIOT6532(config, "riot2", XTAL(3'579'545)/4)); + riot2.in_pa_callback().set(FUNC(gts80a_state::port2a_r)); // pa7 - slam tilt + riot2.out_pa_callback().set(FUNC(gts80a_state::port2a_w)); // digit select + //riot2.in_pb_callback().set(FUNC(gts80a_state::port2b_r)); + riot2.out_pb_callback().set(FUNC(gts80a_state::port2b_w)); // seg + riot2.irq_callback().set_inputline("maincpu", M6502_IRQ_LINE); + + riot6532_device &riot3(RIOT6532(config, "riot3", XTAL(3'579'545)/4)); + //riot3.in_pa_callback().set(FUNC(gts80a_state::port3a_r)); + riot3.out_pa_callback().set(FUNC(gts80a_state::port3a_w)); // sol, snd + //riot3.in_pb_callback().set(FUNC(gts80a_state::port3b_r)); + riot3.out_pb_callback().set(FUNC(gts80a_state::port3b_w)); // lamps + riot3.irq_callback().set_inputline("maincpu", M6502_IRQ_LINE); /* Sound */ genpin_audio(config); diff --git a/src/mame/drivers/gts80b.cpp b/src/mame/drivers/gts80b.cpp index 2a5663d8c03..92e0efd4e06 100644 --- a/src/mame/drivers/gts80b.cpp +++ b/src/mame/drivers/gts80b.cpp @@ -399,24 +399,26 @@ MACHINE_CONFIG_START(gts80b_state::gts80b) config.set_default_layout(layout_gts80b); /* Devices */ - MCFG_DEVICE_ADD("riot1", RIOT6532, XTAL(3'579'545)/4) - MCFG_RIOT6532_IN_PA_CB(READ8(*this, gts80b_state, port1a_r)) // sw_r - //MCFG_RIOT6532_OUT_PA_CB(WRITE8(*this, gts80b_state, port1a_w)) - //MCFG_RIOT6532_IN_PB_CB(READ8(*this, gts80b_state, port1b_r)) - MCFG_RIOT6532_OUT_PB_CB(WRITE8(*this, gts80b_state, port1b_w)) // sw_w - MCFG_RIOT6532_IRQ_CB(INPUTLINE("maincpu", M6502_IRQ_LINE)) - MCFG_DEVICE_ADD("riot2", RIOT6532, XTAL(3'579'545)/4) - MCFG_RIOT6532_IN_PA_CB(READ8(*this, gts80b_state, port2a_r)) // pa7 - slam tilt - MCFG_RIOT6532_OUT_PA_CB(WRITE8(*this, gts80b_state, port2a_w)) // digit select - //MCFG_RIOT6532_IN_PB_CB(READ8(*this, gts80b_state, port2b_r)) - MCFG_RIOT6532_OUT_PB_CB(WRITE8(*this, gts80b_state, port2b_w)) // seg - MCFG_RIOT6532_IRQ_CB(INPUTLINE("maincpu", M6502_IRQ_LINE)) - MCFG_DEVICE_ADD("riot3", RIOT6532, XTAL(3'579'545)/4) - //MCFG_RIOT6532_IN_PA_CB(READ8(*this, gts80b_state, port3a_r)) - MCFG_RIOT6532_OUT_PA_CB(WRITE8(*this, gts80b_state, port3a_w)) // sol, snd - //MCFG_RIOT6532_IN_PB_CB(READ8(*this, gts80b_state, port3b_r)) - MCFG_RIOT6532_OUT_PB_CB(WRITE8(*this, gts80b_state, port3b_w)) // lamps - MCFG_RIOT6532_IRQ_CB(INPUTLINE("maincpu", M6502_IRQ_LINE)) + riot6532_device &riot1(RIOT6532(config, "riot1", XTAL(3'579'545)/4)); + riot1.in_pa_callback().set(FUNC(gts80b_state::port1a_r)); // sw_r + //riot1.out_pa_callback().set(FUNC(gts80b_state::port1a_w)); + //riot1.in_pb_callback().set(FUNC(gts80b_state::port1b_r)); + riot1.out_pb_callback().set(FUNC(gts80b_state::port1b_w)); // sw_w + riot1.irq_callback().set_inputline("maincpu", M6502_IRQ_LINE); + + riot6532_device &riot2(RIOT6532(config, "riot2", XTAL(3'579'545)/4)); + riot2.in_pa_callback().set(FUNC(gts80b_state::port2a_r)); // pa7 - slam tilt + riot2.out_pa_callback().set(FUNC(gts80b_state::port2a_w)); // digit select + //riot2.in_pb_callback().set(FUNC(gts80b_state::port2b_r)); + riot2.out_pb_callback().set(FUNC(gts80b_state::port2b_w)); // seg + riot2.irq_callback().set_inputline("maincpu", M6502_IRQ_LINE); + + riot6532_device &riot3(RIOT6532(config, "riot3", XTAL(3'579'545)/4)); + //riot3.in_pa_callback().set(FUNC(gts80b_state::port3a_r)); + riot3.out_pa_callback().set(FUNC(gts80b_state::port3a_w)); // sol, snd + //riot3.in_pb_callback().set(FUNC(gts80b_state::port3b_r)); + riot3.out_pb_callback().set(FUNC(gts80b_state::port3b_w)); // lamps + riot3.irq_callback().set_inputline("maincpu", M6502_IRQ_LINE); /* Sound */ genpin_audio(config); diff --git a/src/mame/drivers/harriet.cpp b/src/mame/drivers/harriet.cpp index c5da86323e3..38965474c70 100644 --- a/src/mame/drivers/harriet.cpp +++ b/src/mame/drivers/harriet.cpp @@ -90,13 +90,13 @@ MACHINE_CONFIG_START(harriet_state::harriet) MCFG_DEVICE_ADD("duart", MC68681, 3.6864_MHz_XTAL) - MCFG_DEVICE_ADD("mfp", MC68901, 40_MHz_XTAL / 16) - MCFG_MC68901_TIMER_CLOCK(2.4576_MHz_XTAL) - MCFG_MC68901_RX_CLOCK(9600) - MCFG_MC68901_TX_CLOCK(9600) - MCFG_MC68901_OUT_SO_CB(WRITELINE("rs232", rs232_port_device, write_txd)) - //MCFG_MC68901_OUT_TCO_CB(WRITELINE("mfp", mc68901_device, rc_w)) - //MCFG_MC68901_OUT_TDO_CB(WRITELINE("mfp", mc68901_device, tc_w)) + mc68901_device &mfp(MC68901(config, "mfp", 40_MHz_XTAL / 16)); + mfp.set_timer_clock(2.4576_MHz_XTAL); + mfp.set_rx_clock(9600); + mfp.set_tx_clock(9600); + mfp.out_so_cb().set("rs232", FUNC(rs232_port_device::write_txd)); + //mfp.out_tco_cb().set("mfp", FUNC(mc68901_device::rc_w)); + //mfp.out_tdo_cb().set("mfp", FUNC(mc68901_device::tc_w)); MCFG_DEVICE_ADD("dmac", HD63450, 40_MHz_XTAL / 4) // MC68450R10 (or HD68450Y-10) MCFG_HD63450_CPU("maincpu") diff --git a/src/mame/drivers/hikaru.cpp b/src/mame/drivers/hikaru.cpp index 677636d5e2a..633e05ff366 100644 --- a/src/mame/drivers/hikaru.cpp +++ b/src/mame/drivers/hikaru.cpp @@ -552,10 +552,13 @@ MACHINE_CONFIG_END ROM_SYSTEM_BIOS( 1, "bios1", "epr23400" ) \ ROM_LOAD16_WORD_SWAP_BIOS( 1, "epr-23400.ic94", 0x000000, 0x200000, CRC(3d557104) SHA1(d39879f5a1acbd54ad8ee4fbd412f870c9ff4aa5) ) \ ROM_SYSTEM_BIOS( 2, "bios2", "epr21904" ) \ - ROM_LOAD16_WORD_SWAP_BIOS( 1, "epr-21904.ic94", 0x000000, 0x200000, CRC(d96298b6) SHA1(d10d837bc7d68eb7125c34beffe21a91305627b0) ) + ROM_LOAD16_WORD_SWAP_BIOS( 1, "epr-21904.ic94", 0x000000, 0x200000, CRC(d96298b6) SHA1(d10d837bc7d68eb7125c34beffe21a91305627b0) ) \ + ROM_SYSTEM_BIOS( 3, "bios3", "Development / prototype" ) \ + ROM_LOAD16_WORD_SWAP_BIOS( 1, "prot_bot.ic94", 0x000000, 0x200000, CRC(7cbf2fb6) SHA1(7384e3c9314add7d61f93c9edd9fb7788d08f423) ) // bios 0 is SAMURAI boot rom 0.96 / 2000/8/10 // bios 1 is SAMURAI boot rom 0.92 / 1999/7/2 // bios 2 is SAMURAI boot rom 0.84 / 1999/7/22 +// bios 3 is SAMURAI boot rom 0.74 / 1999/5/01 Development version, have options to change country, SCSI ID, boot into debugger mode (will wait for commands from host via SCSI). ROM_START( hikaru ) diff --git a/src/mame/drivers/hk68v10.cpp b/src/mame/drivers/hk68v10.cpp index 434ab9aee56..b3a4bafc41f 100644 --- a/src/mame/drivers/hk68v10.cpp +++ b/src/mame/drivers/hk68v10.cpp @@ -71,7 +71,7 @@ * * History of Heurikon *--------------------- - * The company was founded 1972 as cellar company. Heurikon was aquired + * The company was founded 1972 as cellar company. Heurikon was acquired * 1989 by Computer Products, 1990 by Artesyn and finally in 2005 by Emerson * Electric who consolidated it fully by 2009 and closed the office. * diff --git a/src/mame/drivers/hng64.cpp b/src/mame/drivers/hng64.cpp index 0ca4a5ea2e2..1d51b593080 100644 --- a/src/mame/drivers/hng64.cpp +++ b/src/mame/drivers/hng64.cpp @@ -188,7 +188,7 @@ LVS-JAM SNK 1999.1.20 No. PCB Label IC Markings IC Package ---------------------------------------------------- -01 DPRAM1 DT 71321 LA55PF QFP64 +01 DPRAM1 DT 71321 LA55PF QFP64 * 02 IC1 MC44200FT QFP44 03 IOCTR1 TOSHIBA TMP87CH40N-4828 SDIP64 04 BACKUP EPSON RTC62423 SOP24 @@ -204,6 +204,9 @@ Notes: 2. If the game cart is not plugged in, the hardware shows nothing on screen. 3. The IOCTR I/O MCU runs at 8 MHz. + *"IDT71321 is function-compatible (but not pin-compatible) with MB8421" ( src\devices\machine\mb8421.cpp ) + It appears unlikely the interrupt function of the DPRAM is unused unless address pins are all inverted as + there aren't any accesses to 7ff / 7fe outside of the RAM testing, commands are put at byte 0 by the MIPS Hyper Neo Geo game cartridges ----------------------------- @@ -527,9 +530,13 @@ READ32_MEMBER(hng64_state::hng64_sysregs_r) case 0x001c: return machine().rand(); // hng64 hangs on start-up if zero. //case 0x106c: //case 0x107c: - case 0x1084: return 0x00000002; //MCU->MIPS latch port + case 0x1084: + logerror("%s: HNG64 reading MCU status port (%08x)\n", machine().describe_context(), mem_mask); + return 0x00000002; //MCU->MIPS latch port //case 0x108c: - case 0x1104: return m_irq_level; + case 0x1104: + logerror("%s: irq level READ %04x\n", machine().describe_context(),m_irq_level); + return m_irq_level; case 0x111c: //printf("Read to IRQ ACK?\n"); break; @@ -590,7 +597,7 @@ WRITE32_MEMBER(hng64_state::hng64_sysregs_w) { case 0x1084: //MIPS->MCU latch port m_mcu_en = (data & 0xff); //command-based, i.e. doesn't control halt line and such? - //printf("HNG64 writing to SYSTEM Registers 0x%08x == 0x%08x. (PC=%08x)\n", offset*4, m_sysregs[offset], m_maincpu->pc()); + logerror("%s: HNG64 writing to MCU control port %08x (%08x)\n", machine().describe_context(), data, mem_mask); break; //0x110c global irq mask? /* irq ack */ @@ -601,173 +608,47 @@ WRITE32_MEMBER(hng64_state::hng64_sysregs_w) m_dma_len = m_sysregs[offset]; do_dma(space); break; - //default: - // printf("HNG64 writing to SYSTEM Registers 0x%08x == 0x%08x. (PC=%08x)\n", offset*4, m_sysregs[offset], m_maincpu->pc()); + case 0x21c4: + // guess, written after a write to 0x00 in dpram, which is where the command goes, and the IRQ onthe MCU reads the command + logerror("%s: HNG64 writing to SYSTEM Registers %08x %08x (%08x) (IO MCU IRQ TRIGGER?)\n", machine().describe_context(), offset*4, data, mem_mask); + if (mem_mask & 0xffff0000) m_tempio_irqon_timer->adjust(attotime::zero); + break; + + default: + logerror("%s: HNG64 writing to SYSTEM Registers %08x %08x (%08x)\n", machine().describe_context(), offset*4, data, mem_mask); } } /************************************** -* MCU simulations +* MCU simulation / hacks **************************************/ -/* Fatal Fury Wild Ambition / Buriki One */ -READ32_MEMBER(hng64_state::fight_io_r) -{ - /* - TODO: reads to i/o but coins doesn't work? Let's put a cheap hack for now - */ - if(ioport("SYSTEM")->read() & 0x00030000 && m_mcu_type == BURIKI_MCU) - { - m_maincpu->space(AS_PROGRAM).write_byte(0xf3ce4, 1); - } - - switch (offset*4) - { - case 0x000: return 0x00000400; - case 0x004: return ioport("SYSTEM")->read(); - case 0x008: return ioport("P1_P2")->read(); - case 0x600: return m_no_machine_error_code; - } - - return m_dualport[offset]; -} - -/* Samurai Shodown 64 / Samurai Shodown 64 2 */ -READ32_MEMBER(hng64_state::samsho_io_r) -{ - switch (offset*4) - { - case 0x000: - { - /* this is used on post by the io mcu to signal that a init task is complete, zeroed otherwise. */ - //popmessage("%04x", m_mcu_fake_time); - - if(m_mcu_fake_time < 0x100) - m_mcu_fake_time++; - - if(m_mcu_fake_time < 0x80) //i/o init 1 - return 0x300; - else if(m_mcu_fake_time < 0x100)//i/o init 2 - return 0x400; - else - return 0x000; - } - case 0x004: return ioport("SYSTEM")->read(); - case 0x008: return ioport("P1_P2")->read(); - case 0x600: return m_no_machine_error_code; - } - - return m_dualport[offset]; -} - -/* Beast Busters 2 */ -/* FIXME: trigger input doesn't work? */ -READ32_MEMBER(hng64_state::shoot_io_r) -{ - switch (offset*4) - { - case 0x000: - { - if(m_mcu_fake_time < 0x100)//i/o init - { - m_mcu_fake_time++; - return 0x400; - } - else - return 0x000; - } - case 0x010: - { - /* Quick kludge for use the input test items */ - if(ioport("D_IN")->read() & 0x01000000) - m_p1_trig = machine().rand() & 0x01000000; - - return (ioport("D_IN")->read() & ~0x01000000) | (m_p1_trig); - } - case 0x018: - { - uint8_t p1_x, p1_y, p2_x, p2_y; - p1_x = ioport("LIGHT_P1_X")->read() & 0xff; - p1_y = ioport("LIGHT_P1_Y")->read() & 0xff; - p2_x = ioport("LIGHT_P2_X")->read() & 0xff; - p2_y = ioport("LIGHT_P2_Y")->read() & 0xff; - - return p1_x<<24 | p1_y<<16 | p2_x<<8 | p2_y; - } - case 0x01c: - { - uint8_t p3_x, p3_y; - p3_x = ioport("LIGHT_P3_X")->read() & 0xff; - p3_y = ioport("LIGHT_P3_Y")->read() & 0xff; - - return p3_x<<24 | p3_y<<16 | p3_x<<8 | p3_y; //FIXME: see what's the right bank here when the trigger works - } - case 0x600: return m_no_machine_error_code; - } - - return m_dualport[offset]; -} +// real IO MCU only has 8 multiplexed 8-bit digital input ports, so some of these fake inputs are probably processed representations of the same thing -/* Roads Edge / Xtreme Rally */ -READ32_MEMBER(hng64_state::racing_io_r) +READ8_MEMBER(hng64_state::hng64_dualport_r) { - switch (offset*4) - { - case 0x000: - { - if(m_mcu_fake_time < 0x100)//i/o init - { - m_mcu_fake_time++; - return 0x400; - } - else - return 0x000; - } - case 0x004: return ioport("SYSTEM")->read(); - case 0x008: return ioport("IN0")->read(); - case 0x014: return ioport("VIEW")->read(); - case 0x018: - { - uint8_t handle, acc, brake; - handle = ioport("HANDLE")->read() & 0xff; - acc = ioport("ACCELERATOR")->read() & 0xff; - brake = ioport("BRAKE")->read() & 0xff; - - return (handle<<24) | (acc<<16) | (brake<<8) | (0xff<<0); - } - - case 0x600: return m_no_machine_error_code; - } - - return m_dualport[offset]; -} - -READ32_MEMBER(hng64_state::hng64_dualport_r) -{ - //printf("dualport R %08x %08x (PC=%08x)\n", offset*4, hng64_dualport[offset], m_maincpu->pc()); + logerror("%s: dualport R %04x\n", machine().describe_context(), offset); /* + I'm not really convinced these are commands in this sense based on code analysis, probably just a non-standard way of controlling the lines + command table: 0x0b = ? mode input polling (sams64, bbust2, sams64_2 & roadedge) (*) 0x0c = cut down connections, treats the dualport to be normal RAM 0x11 = ? mode input polling (fatfurwa, xrally, buriki) (*) - 0x20 = asks for MCU machine code + 0x20 = asks for MCU machine code (probably not, this is also written in the function after the TLCS870 requests an interrupt on the MIPS) (*) 0x11 is followed by 0x0b if the latter is used, JVS-esque indirect/direct mode? */ - if (m_mcu_en == 0x0c) - return m_dualport[offset]; - - switch (m_mcu_type) + if (!(m_mcu_en == 0x0c)) { - case FIGHT_MCU: - case BURIKI_MCU: return fight_io_r(space, offset,0xffffffff); - case SHOOT_MCU: return shoot_io_r(space, offset,0xffffffff); - case RACING_MCU: return racing_io_r(space, offset,0xffffffff); - case SAMSHO_MCU: return samsho_io_r(space, offset,0xffffffff); + switch (offset) + { + case 0x600: return m_no_machine_error_code; + } } - return m_dualport[offset]; + return m_dt7133_dpram->right_r(space, offset); } /* @@ -780,10 +661,26 @@ Beast Busters 2 outputs (all at offset == 0x1c): 0x00004000 gun #3 */ -WRITE32_MEMBER(hng64_state::hng64_dualport_w) + +/* + MIPS clearly writes commands for the TLCS870 MCU at 00 here + first command it writes after the startup checks is 0x0a, it should also trigger an EXTINT0 on the TLCS870 + around that time, as the EXTINT0 reads the command. + + call at CBB0 in the MCU is to read the command from shared RAM + value is used in the jump table at CBC5 + command 0x0a points at ccbd + which starts with a call to copy 0x40 bytes of data from 0x200 in shared RAM to the internal RAM of the MCU + the MIPS (at least in Fatal Fury) uploads this data to shared RAM prior to the call. + + need to work out what triggers the interrupt, as a write to 0 wouldn't as the Dual Port RAM interrupts + are on addresses 0x7fe and 0x7ff +*/ + +WRITE8_MEMBER(hng64_state::hng64_dualport_w) { - //printf("dualport WRITE %08x %08x (PC=%08x)\n", offset*4, hng64_dualport[offset], m_maincpu->pc()); - COMBINE_DATA (&m_dualport[offset]); + m_dt7133_dpram->right_w(space,offset, data); + logerror("%s: dualport WRITE %04x %02x\n", machine().describe_context(), offset, data); } @@ -960,7 +857,7 @@ void hng64_state::hng_map(address_map &map) map(0x1F800000, 0x1F803fff).ram().share("nvram"); // Dualport RAM - map(0x1F808000, 0x1F8087ff).rw(FUNC(hng64_state::hng64_dualport_r), FUNC(hng64_state::hng64_dualport_w)).share("dualport"); + map(0x1F808000, 0x1F8087ff).rw(FUNC(hng64_state::hng64_dualport_r), FUNC(hng64_state::hng64_dualport_w)).umask32(0xffffffff); // BIOS map(0x1fc00000, 0x1fc7ffff).nopw().rom().region("user1", 0).share("rombase"); @@ -1005,265 +902,427 @@ void hng64_state::hng_map(address_map &map) } -static INPUT_PORTS_START( hng64 ) +static INPUT_PORTS_START( hng64 ) // base port, for debugging PORT_START("VBLANK") PORT_BIT( 0xffffffff, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_VBLANK("screen") - PORT_START("IPT_TEST") - PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE( KEYCODE_Q ) - PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - - PORT_START("SYSTEM") - PORT_BIT( 0x0000ffff, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x00010000, IP_ACTIVE_HIGH, IPT_COIN1 ) PORT_IMPULSE(1) - PORT_BIT( 0x00020000, IP_ACTIVE_HIGH, IPT_COIN2 ) PORT_IMPULSE(1) - PORT_BIT( 0x00040000, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x00080000, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x00100000, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x00200000, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x00400000, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x00800000, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x01000000, IP_ACTIVE_HIGH, IPT_SERVICE1 ) - PORT_BIT( 0x02000000, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x04000000, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x08000000, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x10000000, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x20000000, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x40000000, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x80000000, IP_ACTIVE_HIGH, IPT_SERVICE ) - - PORT_START("P1_P2") - PORT_BIT( 0x00000001, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(2) - PORT_BIT( 0x00000002, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) - PORT_BIT( 0x00000004, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) - PORT_BIT( 0x00000008, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) - PORT_BIT( 0x00000010, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) - PORT_BIT( 0x00000020, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2) - PORT_BIT( 0x00000040, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(2) - PORT_BIT( 0x00000080, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(2) - PORT_BIT( 0x00000100, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x00000200, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x00000400, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x00000800, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x00001000, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x00002000, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x00004000, IP_ACTIVE_HIGH, IPT_START2 ) - PORT_BIT( 0x00008000, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x00010000, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1) - PORT_BIT( 0x00020000, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) - PORT_BIT( 0x00040000, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) - PORT_BIT( 0x00080000, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) - PORT_BIT( 0x00100000, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1) - PORT_BIT( 0x00200000, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1) - PORT_BIT( 0x00400000, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(1) - PORT_BIT( 0x00800000, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(1) - PORT_BIT( 0x01000000, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x02000000, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x04000000, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x08000000, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x10000000, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x20000000, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x40000000, IP_ACTIVE_HIGH, IPT_START1 ) - PORT_BIT( 0x80000000, IP_ACTIVE_HIGH, IPT_UNKNOWN ) -INPUT_PORTS_END + PORT_START("IN0") + PORT_DIPNAME( 0x01, 0x01, "IN0" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x01, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x02, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x04, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x08, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x10, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x20, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x40, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x80, DEF_STR( On ) ) + PORT_START("IN1") + PORT_DIPNAME( 0x01, 0x01, "IN1" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x01, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x02, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x04, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x08, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x10, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x20, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x40, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x80, DEF_STR( On ) ) -CUSTOM_INPUT_MEMBER(hng64_state::left_handle_r) -{ - return (ioport("HANDLE")->read() == 0); -} + PORT_START("IN2") + PORT_DIPNAME( 0x01, 0x01, "IN2" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x01, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x02, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x04, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x08, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x10, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x20, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x40, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x80, DEF_STR( On ) ) -CUSTOM_INPUT_MEMBER(hng64_state::right_handle_r) -{ - return (ioport("HANDLE")->read() == 0xff); -} + PORT_START("IN3") + PORT_DIPNAME( 0x01, 0x01, "IN3" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x01, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x02, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x04, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x08, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x10, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x20, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x40, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x80, DEF_STR( On ) ) -CUSTOM_INPUT_MEMBER(hng64_state::acc_down_r) -{ - return (ioport("ACCELERATOR")->read() == 0); -} + PORT_START("IN4") + PORT_DIPNAME( 0x01, 0x01, "IN4" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x01, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x02, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x04, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x08, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x10, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x20, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x40, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x80, DEF_STR( On ) ) -CUSTOM_INPUT_MEMBER(hng64_state::brake_down_r) -{ - return (ioport("BRAKE")->read() == 0); -} + PORT_START("IN5") + PORT_DIPNAME( 0x01, 0x01, "IN5" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x01, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x02, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x04, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x08, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x10, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x20, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x40, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x80, DEF_STR( On ) ) -static INPUT_PORTS_START( roadedge ) - PORT_START("VBLANK") - PORT_BIT( 0xffffffff, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_VBLANK("screen") + PORT_START("IN6") + PORT_DIPNAME( 0x01, 0x01, "IN6" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x01, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x02, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x04, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x08, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x10, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x20, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x40, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x80, DEF_STR( On ) ) - PORT_START("SYSTEM") - PORT_DIPNAME( 0x01, 0x00, "SYSA" ) + PORT_START("IN7") + PORT_DIPNAME( 0x01, 0x01, "IN7" ) PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x01, DEF_STR( On ) ) - PORT_DIPNAME( 0x02, 0x00, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x02, DEF_STR( On ) ) - PORT_DIPNAME( 0x04, 0x00, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x04, DEF_STR( On ) ) - PORT_DIPNAME( 0x08, 0x00, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x08, DEF_STR( On ) ) - PORT_DIPNAME( 0x10, 0x00, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x10, DEF_STR( On ) ) - PORT_DIPNAME( 0x20, 0x00, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x20, DEF_STR( On ) ) - PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x40, DEF_STR( On ) ) - PORT_DIPNAME( 0x80, 0x00, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x80, DEF_STR( On ) ) - PORT_BIT( 0x00000100, IP_ACTIVE_HIGH, IPT_BUTTON7 ) PORT_NAME("Shift Up") - PORT_BIT( 0x00000200, IP_ACTIVE_HIGH, IPT_BUTTON8 ) PORT_NAME("Shift Down") - PORT_BIT( 0x00000400, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, hng64_state, left_handle_r, nullptr) - PORT_BIT( 0x00000800, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, hng64_state, right_handle_r, nullptr) - PORT_BIT( 0x00001000, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, hng64_state, acc_down_r, nullptr) - PORT_BIT( 0x00002000, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, hng64_state, brake_down_r, nullptr) - - PORT_DIPNAME( 0x4000, 0x0000, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x4000, DEF_STR( On ) ) - PORT_DIPNAME( 0x8000, 0x0000, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x8000, DEF_STR( On ) ) - PORT_DIPNAME( 0x010000, 0x000000, "SYSA" ) - PORT_DIPSETTING( 0x000000, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x010000, DEF_STR( On ) ) - PORT_DIPNAME( 0x020000, 0x000000, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x000000, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x020000, DEF_STR( On ) ) - PORT_DIPNAME( 0x040000, 0x000000, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x000000, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x040000, DEF_STR( On ) ) - PORT_DIPNAME( 0x080000, 0x000000, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x000000, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x080000, DEF_STR( On ) ) - PORT_DIPNAME( 0x100000, 0x000000, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x000000, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x100000, DEF_STR( On ) ) - PORT_DIPNAME( 0x200000, 0x000000, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x000000, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x200000, DEF_STR( On ) ) - PORT_DIPNAME( 0x400000, 0x000000, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x000000, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x400000, DEF_STR( On ) ) - PORT_DIPNAME( 0x800000, 0x000000, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x000000, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x800000, DEF_STR( On ) ) - PORT_DIPNAME( 0x01000000, 0x00000000, "SYSA" ) - PORT_DIPSETTING( 0x00000000, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x01000000, DEF_STR( On ) ) - PORT_DIPNAME( 0x02000000, 0x00000000, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x00000000, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x02000000, DEF_STR( On ) ) - PORT_DIPNAME( 0x04000000, 0x00000000, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x00000000, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x04000000, DEF_STR( On ) ) - PORT_DIPNAME( 0x08000000, 0x00000000, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x00000000, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x08000000, DEF_STR( On ) ) - PORT_DIPNAME( 0x10000000, 0x00000000, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x00000000, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x10000000, DEF_STR( On ) ) - PORT_DIPNAME( 0x20000000, 0x00000000, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x00000000, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x20000000, DEF_STR( On ) ) - PORT_DIPNAME( 0x40000000, 0x00000000, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x00000000, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x40000000, DEF_STR( On ) ) - PORT_DIPNAME( 0x80000000, 0x00000000, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x00000000, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x80000000, DEF_STR( On ) ) + PORT_START("AN0") + PORT_START("AN1") + PORT_START("AN2") + PORT_START("AN3") + PORT_START("AN4") + PORT_START("AN5") + PORT_START("AN6") + PORT_START("AN7") +INPUT_PORTS_END - PORT_START("IN0") - PORT_BIT( 0x00000010, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("BGM 1") - PORT_BIT( 0x00000020, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("BGM 2") - PORT_BIT( 0x00000040, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("BGM 3") - PORT_BIT( 0x00000080, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("BGM 4") - PORT_BIT( 0x40000000, IP_ACTIVE_HIGH, IPT_START1 ) +static INPUT_PORTS_START( hng64_fight ) + PORT_INCLUDE( hng64 ) + + PORT_MODIFY("IN0") + PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + + PORT_MODIFY("IN1") + PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + + PORT_MODIFY("IN2") + PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + + PORT_MODIFY("IN3") + PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + + PORT_MODIFY("IN4") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(1) + + PORT_MODIFY("IN5") // why is this shifted, is it a bug in the TLCS870 emulation or intentional? + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) + + PORT_MODIFY("IN6") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(2) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_MODIFY("IN7") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE1 ) // Service + PORT_SERVICE_NO_TOGGLE(0x02, IP_ACTIVE_LOW) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(1) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_IMPULSE(1) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START1 ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START2 ) +INPUT_PORTS_END - PORT_START("VIEW") - PORT_BIT( 0x00000800, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("View 1") - PORT_BIT( 0x00001000, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("View 2") - PORT_START("HANDLE") +static INPUT_PORTS_START( hng64_drive ) + PORT_INCLUDE( hng64 ) + + PORT_MODIFY("IN0") + PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_MODIFY("IN1") + PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_MODIFY("IN2") + PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_MODIFY("IN3") + PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_MODIFY("IN4") + PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_MODIFY("IN5") + PORT_BIT( 0x1f, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("BGM 1") + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("BGM 2") + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("BGM 3") + + PORT_MODIFY("IN6") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("BGM 4") + PORT_BIT( 0x06, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_NAME("View 1") + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_NAME("View 2") + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON7 ) PORT_NAME("Shift Down") + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON8 ) PORT_NAME("Shift Up") + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_MODIFY("IN7") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE1 ) // Service + PORT_SERVICE_NO_TOGGLE(0x02, IP_ACTIVE_LOW) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(1) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_IMPULSE(1) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START1 ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_MODIFY("AN0") PORT_BIT( 0xff, 0x80, IPT_PADDLE ) PORT_MINMAX(0x00,0xff) PORT_SENSITIVITY(30) PORT_KEYDELTA(60) PORT_PLAYER(1) PORT_NAME("Handle") - PORT_START("ACCELERATOR") - PORT_BIT( 0xff, 0x00, IPT_PEDAL ) PORT_MINMAX(0x00,0xff) PORT_SENSITIVITY(50) PORT_KEYDELTA(60) PORT_PLAYER(1) PORT_REVERSE PORT_NAME("Accelerator") + PORT_MODIFY("AN1") + PORT_BIT( 0xff, 0x00, IPT_PEDAL ) PORT_MINMAX(0x00,0xff) PORT_SENSITIVITY(50) PORT_KEYDELTA(60) PORT_PLAYER(1) PORT_NAME("Accelerator") - PORT_START("BRAKE") - PORT_BIT( 0xff, 0x00, IPT_PEDAL2 ) PORT_MINMAX(0x00,0xff) PORT_SENSITIVITY(50) PORT_KEYDELTA(60) PORT_PLAYER(1) PORT_REVERSE PORT_NAME("Brake") + PORT_MODIFY("AN2") + PORT_BIT( 0xff, 0x00, IPT_PEDAL2 ) PORT_MINMAX(0x00,0xff) PORT_SENSITIVITY(50) PORT_KEYDELTA(60) PORT_PLAYER(1) PORT_NAME("Brake") INPUT_PORTS_END -static INPUT_PORTS_START( bbust2 ) - PORT_START("VBLANK") - PORT_BIT( 0xffffffff, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_VBLANK("screen") - - PORT_START("D_IN") - PORT_BIT( 0x000000ff, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x00000100, IP_ACTIVE_HIGH, IPT_COIN1 ) PORT_IMPULSE(1) - PORT_BIT( 0x00000200, IP_ACTIVE_HIGH, IPT_COIN2 ) PORT_IMPULSE(1) - PORT_BIT( 0x00000400, IP_ACTIVE_HIGH, IPT_COIN3 ) PORT_IMPULSE(1) - PORT_BIT( 0x00000800, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x00001000, IP_ACTIVE_HIGH, IPT_SERVICE1 ) - PORT_BIT( 0x00002000, IP_ACTIVE_HIGH, IPT_SERVICE2 ) - PORT_BIT( 0x00004000, IP_ACTIVE_HIGH, IPT_SERVICE3 ) - PORT_BIT( 0x00008000, IP_ACTIVE_HIGH, IPT_SERVICE ) - PORT_BIT( 0x00010000, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(3) //trigger - PORT_BIT( 0x00020000, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(3) //pump - PORT_BIT( 0x00040000, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(3) //bomb - PORT_BIT( 0x00080000, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x00100000, IP_ACTIVE_HIGH, IPT_START1 ) - PORT_BIT( 0x00200000, IP_ACTIVE_HIGH, IPT_START2 ) - PORT_BIT( 0x00400000, IP_ACTIVE_HIGH, IPT_START3 ) - PORT_BIT( 0x00800000, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x01000000, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1) //trigger - PORT_BIT( 0x02000000, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1) //pump - PORT_BIT( 0x04000000, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(1) //bomb - PORT_BIT( 0x08000000, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x10000000, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) //trigger - PORT_BIT( 0x20000000, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2) //pump - PORT_BIT( 0x40000000, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(2) //bomb - PORT_BIT( 0x80000000, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("LIGHT_P1_X") +static INPUT_PORTS_START( hng64_shoot ) + PORT_INCLUDE( hng64 ) + + PORT_MODIFY("IN0") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) //trigger + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) //pump + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1) //bomb + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) //trigger + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) //pump + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) //bomb + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_MODIFY("IN1") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(3) //trigger + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(3) //pump + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(3) //bomb + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START1 ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_START2 ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START3 ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_MODIFY("IN2") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(1) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_IMPULSE(1) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN3 ) PORT_IMPULSE(1) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_SERVICE1 ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_SERVICE2 ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SERVICE3 ) + PORT_SERVICE_NO_TOGGLE(0x80, IP_ACTIVE_LOW) + + PORT_MODIFY("IN3") // Debug Port? + PORT_DIPNAME( 0x01, 0x01, "DEBUG" ) + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + + PORT_MODIFY("IN4") // usual inputs are disconnected + PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_MODIFY("IN5") // usual inputs are disconnected + PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_MODIFY("IN6") // usual inputs are disconnected + PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_MODIFY("IN7") // usual inputs are disconnected + PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_MODIFY("AN0") PORT_BIT( 0xff, 0x80, IPT_AD_STICK_X ) PORT_SENSITIVITY(25) PORT_KEYDELTA(7) PORT_REVERSE PORT_PLAYER(1) - PORT_START("LIGHT_P1_Y") + PORT_MODIFY("AN1") PORT_BIT( 0xff, 0x80, IPT_AD_STICK_Y ) PORT_SENSITIVITY(25) PORT_KEYDELTA(7) PORT_REVERSE PORT_PLAYER(1) - PORT_START("LIGHT_P2_X") + PORT_MODIFY("AN2") PORT_BIT( 0xff, 0x80, IPT_AD_STICK_X ) PORT_SENSITIVITY(25) PORT_KEYDELTA(7) PORT_REVERSE PORT_PLAYER(2) - PORT_START("LIGHT_P2_Y") + PORT_MODIFY("AN3") PORT_BIT( 0xff, 0x80, IPT_AD_STICK_Y ) PORT_SENSITIVITY(25) PORT_KEYDELTA(7) PORT_REVERSE PORT_PLAYER(2) - PORT_START("LIGHT_P3_X") + PORT_MODIFY("AN4") PORT_BIT( 0xff, 0x80, IPT_AD_STICK_X ) PORT_SENSITIVITY(25) PORT_KEYDELTA(7) PORT_REVERSE PORT_PLAYER(3) - PORT_START("LIGHT_P3_Y") + PORT_MODIFY("AN5") PORT_BIT( 0xff, 0x80, IPT_AD_STICK_Y ) PORT_SENSITIVITY(25) PORT_KEYDELTA(7) PORT_REVERSE PORT_PLAYER(3) INPUT_PORTS_END @@ -1407,40 +1466,25 @@ void hng64_state::init_hng64() void hng64_state::init_hng64_fght() { - m_no_machine_error_code = 0x01000000; + m_no_machine_error_code = 0x01; init_hng64(); } -void hng64_state::init_fatfurwa() -{ - /* FILE* fp = fopen("/tmp/test.bin", "wb"); fwrite(memregion("verts")->base(), 1, 0x0c00000*2, fp); fclose(fp); */ - init_hng64_fght(); - m_mcu_type = FIGHT_MCU; -} - -void hng64_state::init_buriki() -{ - init_hng64_fght(); - m_mcu_type = BURIKI_MCU; -} - void hng64_state::init_ss64() { init_hng64_fght(); - m_mcu_type = SAMSHO_MCU; + m_samsho64_3d_hack = 1; } void hng64_state::init_hng64_race() { - m_no_machine_error_code = 0x02000000; - m_mcu_type = RACING_MCU; + m_no_machine_error_code = 0x02; init_hng64(); } void hng64_state::init_hng64_shoot() { - m_mcu_type = SHOOT_MCU; - m_no_machine_error_code = 0x03000000; + m_no_machine_error_code = 0x03; init_hng64(); } @@ -1453,15 +1497,229 @@ void hng64_state::set_irq(uint32_t irq_vector) - is there an irq mask mechanism? - is irq level cleared too when the irq acks? - This is written with irqs DISABLED - HNG64 writing to SYSTEM Registers 0x0000111c == 0x00000001. (PC=80009b54) 0 vblank irq - HNG64 writing to SYSTEM Registers 0x0000111c == 0x00000002. (PC=80009b5c) 1 <empty> - HNG64 writing to SYSTEM Registers 0x0000111c == 0x00000004. (PC=80009b64) 2 <empty> - HNG64 writing to SYSTEM Registers 0x0000111c == 0x00000008. (PC=80009b6c) 3 3d fifo processed irq - HNG64 writing to SYSTEM Registers 0x0000111c == 0x00000200. (PC=80009b70) 9 - HNG64 writing to SYSTEM Registers 0x0000111c == 0x00000400. (PC=80009b78) 10 - HNG64 writing to SYSTEM Registers 0x0000111c == 0x00020000. (PC=80009b80) 17 MCU related irq - HNG64 writing to SYSTEM Registers 0x0000111c == 0x00000800. (PC=80009b88) 11 network irq, needed by xrally and roadedge + IRQ level read at 0x80008cac + IO RAM is at bf808000 on the MIPS + + -- irq table in Fatal Fury WA - 'empty' entries just do minimum 'interrupt service' with no real function. + 80000400: 80039F20 irq00 vblank irq + 80000404: 80039F84 1rq01 jump based on ram content + 80000408: 8003A08C irq02 'empty' + 8000040C: 8006FF04 irq03 3d FIFO? + 80000410: A0000410 irq04 INVALID + 80000414: A0000414 irq05 INVALID + 80000418: A0000418 irq06 INVALID + 8000041C: A000041C irq07 INVALID + 80000420: A0000420 irq08 INVALID + 80000424: 8003A00C irq09 'empty' writes to sysreg 1074 instead of loading/storing regs tho + 80000428: 80039FD0 irq0a 'empty' writes to sysreg 1074 instead of loading/storing regs tho + 8000042C: 8003A0C0 irq0b 'empty'(network on xrally?) writes to sysreg 1074 instead of loading/storing regs tho + 80000430: 8003A050 irq0c 'empty' writes to sysreg 1074 instead of loading/storing regs tho + 80000434: A0000434 irq0d INVALID + 80000438: A0000438 irq0e INVALID + 8000043C: A000043C irq0f INVALID + 80000440: A0000440 irq10 INVALID + 80000444: 8003A0FC irq11 IO MCU related? write to sysreg 1084 instead of loading/storing regs, accesses dualport RAM + 80000448: A0000448 irq12 INVALID + 8000044C: A000044C irq13 INVALID + 80000450: A0000450 irq14 INVALID + 80000454: A0000454 irq15 INVALID + 80000458: A0000458 irq16 INVALID + 8000045C: 8003A1D4 irq17 'empty' write to sysreg 1084 instead of loading/storing regs tho (like irq 0x11) + 80000460: A0000460 irq18 INVALID + (all other entries, invalid) + + Xrally (invalid IRQs are more obviously invalid, pointing at 0) + 80000400: 80016ED0 irq00 + 80000404: 80016F58 irq01 + 80000408: 80017048 irq02 + 8000040C: 80013484 irq03 + 80000410: 00000000 irq04 INVALID + 80000414: 00000000 irq05 INVALID + 80000418: 00000000 irq06 INVALID + 8000041C: 00000000 irq07 INVALID + 80000420: 00000000 irq08 INVALID + 80000424: 80016FC8 irq09 + 80000428: 80016F8C irq0a + 8000042C: 8001707C irq0b + 80000430: 8001700C irq0c + 80000434: 00000000 irq0d INVALID + 80000438: 00000000 irq0e INVALID + 8000043C: 00000000 irq0f INVALID + 80000440: 00000000 irq10 INVALID + 80000444: 800170C0 irq11 + 80000448: 00000000 irq12 INVALID + 8000044C: 00000000 irq13 INVALID + 80000450: 00000000 irq14 INVALID + 80000454: 00000000 irq15 INVALID + 80000458: 00000000 irq16 INVALID + 8000045C: 80017198 irq17 + 80000460: 00000000 irq18 INVALID + (all other entries, invalid) + + Buriki + 80000400: 800C49C4 + 80000404: 800C4748 + 80000408: 800C4828 + 8000040C: 800C4B80 + 80000410: 00000000 + 80000414: 00000000 + 80000418: 00000000 + 8000041C: 00000000 + 80000420: 00000000 + 80000424: 800C47B0 + 80000428: 800C4778 + 8000042C: 800C4858 + 80000430: 800C47F0 + 80000434: 00000000 + 80000438: 00000000 + 8000043C: 00000000 + 80000440: 00000000 + 80000444: 800C4890 + 80000448: 00000000 + 8000044C: 00000000 + 80000450: 00000000 + 80000454: 00000000 + 80000458: 00000000 + 8000045C: 800C498C + 80000460: 00000000 + + Beast Busters 2 + 80000400: 8000E9D8 + 80000404: 8000EAFC + 80000408: 8000EBFC + 8000040C: 80012D90 + 80000410: FFFFFFFF + 80000414: FFFFFFFF + 80000418: FFFFFFFF + 8000041C: FFFFFFFF + 80000420: FFFFFFFF + 80000424: 8000EB74 + 80000428: 8000EB34 + 8000042C: 8000EC34 + 80000430: 8000EBBC + 80000434: FFFFFFFF + 80000438: FFFFFFFF + 8000043C: FFFFFFFF + 80000440: FFFFFFFF + 80000444: 8000E508 + 80000448: FFFFFFFF + 8000044C: FFFFFFFF + 80000450: FFFFFFFF + 80000454: FFFFFFFF + 80000458: FFFFFFFF + 8000045C: FFFFFFFF irq17 INVALID (not even a stub routine here) + 80000460: FFFFFFFF + + Roads Edge + 80000400: 80028B04 + 80000404: 80028B88 + 80000408: 80028C68 + 8000040C: 80036FAC + 80000410: 00000000 + 80000414: 00000000 + 80000418: 00000000 + 8000041C: 00000000 + 80000420: 00000000 + 80000424: 80028BF0 + 80000428: 80028BB8 + 8000042C: 80028C98 + 80000430: 80028C30 + 80000434: 00000000 + 80000438: 00000000 + 8000043C: 00000000 + 80000440: 00000000 + 80000444: 80027340 + 80000448: 00000000 + 8000044C: 00000000 + 80000450: 00000000 + 80000454: 00000000 + 80000458: 00000000 + 8000045C: 00000000 irq17 INVALID (not even a stub routine here) + 80000460: 00000000 + + SamSho 64 code is more complex, irqs point to functions that get a jump address from a fixed ram location for each IRQ, most are invalid tho? + the ingame table is copied from 80005DD0 + bootup ingame + 80000400: 800C03E0 irq00 80005dd0 800c02e0 800cfcc8 + 80000404: 800C041C irq01 80005dd4 800c0000 + 80000408: 800C0458 irq02 80005dd8 800c0000 + 8000040C: 800C0494 irq03 80005ddc 800c3054 800cfd58 + 80000410: 800C04D0 irq04 80005de0 800c3070 800cfdf8 - interesting because this level is invalid on other games + 80000414: 800C032C irq05 80000478 00000000 + 80000418: 800C0368 irq06 80000478 00000000 + 8000041C: 800C03A4 irq07 80000478 00000000 + 80000420: 800C050C irq08 80005df0 800c0000 + 80000424: 800C0548 irq09 80005df4 800c0000 + 80000428: 800C0584 irq0a 80005df8 800c0000 + 8000042C: 800C05C0 irq0b 80005dfc 800c0000 + 80000430: 800C05FC irq0c 80005e00 800c0000 + 80000434: 800C02F0 irq0d 80000478 00000000 + 80000438: 800C02F0 irq0e 80000478 00000000 + 8000043C: 800C02F0 irq0f 80000478 00000000 + 80000440: 800C0638 irq10 80005e10 800c0000 + 80000444: 800C0674 irq11 80005e14 800c0000 + 80000448: 800C06B0 irq12 80005e18 800c0000 + 8000044C: 800C06EC irq13 80005e1c 800c0000 + 80000450: 800C0728 irq14 80005e20 800c0000 + 80000454: 800C0764 irq15 80005e24 800c0000 + 80000458: 800C07A0 irq16 80005e28 800c0000 + 8000045C: 800C07DC irq17 80005e2c 800c0000 + 80000460: 00000000 (invalid) + + SamSho 64 2 is the same types as SamSho 64 + bootup ingame + 80000400: 801008DC irq00 802011e0 801007e0 8011f6b4 + 80000404: 80100918 irq01 802011e4 80100500 + 80000408: 80100954 irq02 802011e8 80100500 + 8000040C: 80100990 irq03 802011ec 80101b38 8011f7b8 + 80000410: 801009CC irq04 802011f0 80101b54 80101b54 + 80000414: 80100828 irq05 80000478 0000000b + 80000418: 80100864 irq06 80000478 0000000b + 8000041C: 801008A0 irq07 80000478 0000000b + 80000420: 80100A08 irq08 80201200 80100500 + 80000424: 80100A44 irq09 80201204 80100500 + 80000428: 80100A80 irq0a 80201208 80100500 + 8000042C: 80100ABC irq0b 8020120c 80100500 + 80000430: 80100AF8 irq0c 80201210 80100500 + 80000434: 801007EC irq0d 80000478 0000000b + 80000438: 801007EC irq0e 80000478 0000000b + 8000043C: 801007EC irq0f 80000478 0000000b + 80000440: 80100B34 irq10 80201220 80100500 + 80000444: 80100B70 irq11 80201224 80100500 + 80000448: 80100BAC irq12 80201228 80100500 + 8000044C: 80100BE8 irq13 8020122c 80100500 + 80000450: 80100C24 irq14 80201230 80100500 + 80000454: 80100C60 irq15 80201234 80100500 + 80000458: 80100C9C irq16 80201238 80100500 + 8000045C: 80100CD8 irq17 8020123c 80100500 + 80000460: 00000000 (invalid) + + Register 111c is connected to the interrupts and written in each one (IRQ ack / latch clear?) + + HNG64 writing to SYSTEM Registers 0x0000111c == 0x00000001. (PC=80009b54) 0x00 vblank irq + HNG64 writing to SYSTEM Registers 0x0000111c == 0x00000002. (PC=80009b5c) 0x01 <empty> (not empty of ffwa) + HNG64 writing to SYSTEM Registers 0x0000111c == 0x00000004. (PC=80009b64) 0x02 <empty> + HNG64 writing to SYSTEM Registers 0x0000111c == 0x00000008. (PC=80009b6c) 0x03 3d fifo processed irq + 00010 + 00020 + 00040 + 00080 + 00100 + HNG64 writing to SYSTEM Registers 0x0000111c == 0x00000200. (PC=80009b70) 0x09 + HNG64 writing to SYSTEM Registers 0x0000111c == 0x00000400. (PC=80009b78) 0x0a + HNG64 writing to SYSTEM Registers 0x0000111c == 0x00000800. (PC=80009b88) 0x0b network irq, needed by xrally and roadedge + 01000 + 02000 + 04000 + 08000 + 10000 + HNG64 writing to SYSTEM Registers 0x0000111c == 0x00020000. (PC=80009b80) 0x11 MCU related irq? + 40000 + 80000 + 100000 + 200000 + 400000 + 800000 0x17 MCU related irq? samsho64 / samsho64_2 does this during running: HNG64 writing to SYSTEM Registers 0x0000111c == 0x00000000. (PC=800008fc) just checking? @@ -1520,36 +1778,204 @@ void hng64_state::machine_start() } m_3dfifo_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(hng64_state::hng64_3dfifo_processed), this)); + + init_io(); } void hng64_state::machine_reset() { /* For simulate MCU stepping */ - m_mcu_fake_time = 0; m_mcu_en = 0; reset_net(); reset_sound(); } -READ8_MEMBER(hng64_state::ioport0_r) { logerror("ioport0_r\n"); return 0xff; } -READ8_MEMBER(hng64_state::ioport1_r) { logerror("ioport1_r\n"); return 0xff; } -READ8_MEMBER(hng64_state::ioport2_r) { logerror("ioport2_r\n"); return 0xff; } -READ8_MEMBER(hng64_state::ioport3_r) { logerror("ioport3_r\n"); return 0xff; } -READ8_MEMBER(hng64_state::ioport4_r) { logerror("ioport4_r\n"); return 0xff; } -READ8_MEMBER(hng64_state::ioport5_r) { logerror("ioport5_r\n"); return 0xff; } -READ8_MEMBER(hng64_state::ioport6_r) { logerror("ioport6_r\n"); return 0xff; } -READ8_MEMBER(hng64_state::ioport7_r) { logerror("ioport7_r\n"); return 0xff; } - -WRITE8_MEMBER(hng64_state::ioport0_w) { logerror("ioport0_w %02x\n", data); } -WRITE8_MEMBER(hng64_state::ioport1_w) { logerror("ioport1_w %02x\n", data); } -WRITE8_MEMBER(hng64_state::ioport2_w) { logerror("ioport2_w %02x\n", data); } -WRITE8_MEMBER(hng64_state::ioport3_w) { logerror("ioport3_w %02x\n", data); } -WRITE8_MEMBER(hng64_state::ioport4_w) { logerror("ioport4_w %02x\n", data); } -WRITE8_MEMBER(hng64_state::ioport5_w) { logerror("ioport5_w %02x\n", data); } -WRITE8_MEMBER(hng64_state::ioport6_w) { logerror("ioport6_w %02x\n", data); } -WRITE8_MEMBER(hng64_state::ioport7_w) { logerror("ioport7_w %02x\n", data); } +/*********************************************** + + Control / Lamp etc. access from MCU side? + + this is probably 8 multiplexed 8-bit input / output ports (probably joysticks, coins etc.) + +***********************************************/ + +WRITE8_MEMBER(hng64_state::ioport1_w) +{ + logerror("%s: ioport1_w %02x\n", machine().describe_context(), data); + + /* Port bits + + aaac w-?- + + a = external port number / address? + c = toggled during read / write accesses, probably clocking byte from/to latch + + ? = toggled at the start of extint 0 , set during reads? + + w = set during writes? + + */ + + m_port1 = data; +} + +// it does write 0xff here before each set of reading, but before setting a new output address? +WRITE8_MEMBER(hng64_state::ioport3_w) +{ + int addr = (m_port1&0xe0)>>5; + + logerror("%s: ioport3_w %02x (to address %02x) (other bits of m_port1 %02x)\n", machine().describe_context(), data, addr, m_port1 & 0x1f); +} + +READ8_MEMBER(hng64_state::ioport3_r) +{ + int addr = (m_port1&0xe0)>>5; + + //logerror("%s: ioport3_r (from address %02x) (other bits of m_port1 %02x)\n", machine().describe_context(), addr, m_port1 & 0x1f); + return m_intest[addr]->read(); +} + +/*********************************************** + + Dual Port RAM access from MCU side + +***********************************************/ + +WRITE8_MEMBER(hng64_state::ioport7_w) +{ + /* Port bits + + i?xR Aacr + + a = 0x200 of address bit to external RAM (direct?) + A = 0x400 of address bit to external RAM (direct?) + R = read / write mode? (if 1, write, if 0, read?) + + r = counter reset? ( 1->0 ?) + c = clock address? ( 1->0 ?) + + x = written with clock bits, might be latch related? + ? = written before some operations + + i = generate interrupt on MIPS? (written after the MCU has completed writing 'results' of some operations to shared ram, before executing more code to write another result, so needs to be processed quickly by the MIPS?) + + */ + //logerror("%s: ioport7_w %02x\n", machine().describe_context(), data); + + m_ex_ramaddr_upper = (data & 0x0c) >> 2; + + if ((!(data & 0x80)) && (m_port7 & 0x80)) + { + logerror("%s: MCU request MIPS IRQ?\n", machine().describe_context()); + set_irq(0x00020000); + } + + if ((!(data & 0x01)) && (m_port7 & 0x01)) + { + m_ex_ramaddr = 0; + } + + if ((!(data & 0x02)) && (m_port7 & 0x02)) + { + m_ex_ramaddr++; + m_ex_ramaddr &= 0x1ff; + } + + m_port7 = data; +} + +READ8_MEMBER(hng64_state::ioport0_r) +{ + uint16_t addr = (m_ex_ramaddr | (m_ex_ramaddr_upper<<9)) & 0x7ff; + uint8_t ret = m_dt7133_dpram->left_r(space, addr); + + logerror("%s: ioport0_r %02x (from address %04x)\n", machine().describe_context(), ret, addr); + return ret; +} + +WRITE8_MEMBER(hng64_state::ioport0_w) +{ + uint16_t addr = (m_ex_ramaddr | (m_ex_ramaddr_upper<<9)) & 0x7ff; + m_dt7133_dpram->left_w(space, addr, data); + + logerror("%s: ioport0_w %02x (to address %04x)\n", machine().describe_context(), data, addr); +} + + +/*********************************************** + + Unknown (LED?) access from MCU side + +***********************************************/ + +/* This port is dual purpose, with the upper pins being used as a serial input / output / clock etc. and the output latch (written data) being configured appropriately however the lower 2 bits also seem to be used + maybe these lower 2 bits were intended for serial comms LEDs, although none are documented in the PCB layouts. +*/ +WRITE8_MEMBER(hng64_state::ioport4_w) +{ + logerror("%s: ioport4_w %02x\n", machine().describe_context(), data); +} + +/*********************************************** + + Other port accesses from MCU side + +***********************************************/ + +READ8_MEMBER(hng64_state::anport0_r) { return ioport("AN0")->read(); } +READ8_MEMBER(hng64_state::anport1_r) { return ioport("AN1")->read(); } +READ8_MEMBER(hng64_state::anport2_r) { return ioport("AN2")->read(); } +READ8_MEMBER(hng64_state::anport3_r) { return ioport("AN3")->read(); } +READ8_MEMBER(hng64_state::anport4_r) { return ioport("AN4")->read(); } +READ8_MEMBER(hng64_state::anport5_r) { return ioport("AN5")->read(); } +READ8_MEMBER(hng64_state::anport6_r) { return ioport("AN6")->read(); } +READ8_MEMBER(hng64_state::anport7_r) { return ioport("AN7")->read(); } + +/*********************************************** + + Serial Accesses from MCU side + +***********************************************/ + +/* I think the serial reads / writes actually go to the network hardware, and the IO MCU is acting as an interface between the actual network and the KL5C80A12CFP + because the network connectors are on the IO board. This might also be related to the 'm_no_machine_error_code' value required which differs per IO board + type as the game startup sequences read that from the 0x6xx region of shared RAM, which also seems to be where a lot of the serial stuff is stored. +*/ + +// there are also serial reads, TLCS870 core doesn't support them yet + +WRITE_LINE_MEMBER( hng64_state::sio0_w ) +{ + // tlcs870 core provides better logging than anything we could put here at the moment +} + + + + +TIMER_CALLBACK_MEMBER(hng64_state::tempio_irqon_callback) +{ + logerror("timer_hack_on\n"); + m_iomcu->set_input_line(INPUT_LINE_IRQ0, ASSERT_LINE ); + m_tempio_irqoff_timer->adjust(m_maincpu->cycles_to_attotime(1000)); +} + +TIMER_CALLBACK_MEMBER(hng64_state::tempio_irqoff_callback) +{ + logerror("timer_hack_off\n"); + m_iomcu->set_input_line(INPUT_LINE_IRQ0, CLEAR_LINE ); +} + +void hng64_state::init_io() +{ + m_tempio_irqon_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(hng64_state::tempio_irqon_callback), this)); + m_tempio_irqoff_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(hng64_state::tempio_irqoff_callback), this)); + + m_port7 = 0x00; + m_port1 = 0x00; + m_ex_ramaddr = 0; + m_ex_ramaddr_upper = 0; +} MACHINE_CONFIG_START(hng64_state::hng64) /* basic machine hardware */ @@ -1577,22 +2003,37 @@ MACHINE_CONFIG_START(hng64_state::hng64) hng64_network(config); tmp87ph40an_device &iomcu(TMP87PH40AN(config, m_iomcu, 8_MHz_XTAL)); - iomcu.p0_in_cb().set(FUNC(hng64_state::ioport0_r)); - iomcu.p1_in_cb().set(FUNC(hng64_state::ioport1_r)); - iomcu.p2_in_cb().set(FUNC(hng64_state::ioport2_r)); - iomcu.p3_in_cb().set(FUNC(hng64_state::ioport3_r)); - iomcu.p4_in_cb().set(FUNC(hng64_state::ioport4_r)); - iomcu.p5_in_cb().set(FUNC(hng64_state::ioport5_r)); - iomcu.p6_in_cb().set(FUNC(hng64_state::ioport6_r)); - iomcu.p7_in_cb().set(FUNC(hng64_state::ioport7_r)); - iomcu.p0_out_cb().set(FUNC(hng64_state::ioport0_w)); - iomcu.p1_out_cb().set(FUNC(hng64_state::ioport1_w)); - iomcu.p2_out_cb().set(FUNC(hng64_state::ioport2_w)); - iomcu.p3_out_cb().set(FUNC(hng64_state::ioport3_w)); - iomcu.p4_out_cb().set(FUNC(hng64_state::ioport4_w)); - iomcu.p5_out_cb().set(FUNC(hng64_state::ioport5_w)); - iomcu.p6_out_cb().set(FUNC(hng64_state::ioport6_w)); - iomcu.p7_out_cb().set(FUNC(hng64_state::ioport7_w)); + iomcu.p0_in_cb().set(FUNC(hng64_state::ioport0_r)); // reads from shared ram + //iomcu.p1_in_cb().set(FUNC(hng64_state::ioport1_r)); // the IO MCU code uses opcodes that only access the output latch, never read from the port + //iomcu.p2_in_cb().set(FUNC(hng64_state::ioport2_r)); // the IO MCU uses EXTINT0 which shares one of the pins on this port, but the port is not used for IO + iomcu.p3_in_cb().set(FUNC(hng64_state::ioport3_r)); // probably reads input ports? + //iomcu.p4_in_cb().set(FUNC(hng64_state::ioport4_r)); // the IO MCU code uses opcodes that only access the output latch, never read from the port + //iomcu.p5_in_cb().set(FUNC(hng64_state::ioport5_r)); // simply seems to be unused, neither used for an IO port, nor any of the other features + //iomcu.p6_in_cb().set(FUNC(hng64_state::ioport6_r)); // the IO MCU code uses the ADC which shares pins with port 6, meaning port 6 isn't used as an IO port + //iomcu.p7_in_cb().set(FUNC(hng64_state::ioport7_r)); // the IO MCU code uses opcodes that only access the output latch, never read from the port + iomcu.p0_out_cb().set(FUNC(hng64_state::ioport0_w)); // writes to shared ram + iomcu.p1_out_cb().set(FUNC(hng64_state::ioport1_w)); // configuration / clocking for input port (port 3) accesses + //iomcu.p2_out_cb().set(FUNC(hng64_state::ioport2_w)); // the IO MCU uses EXTINT0 which shares one of the pins on this port, but the port is not used for IO + iomcu.p3_out_cb().set(FUNC(hng64_state::ioport3_w)); // writes to input ports? maybe lamps, coin counters etc.? + iomcu.p4_out_cb().set(FUNC(hng64_state::ioport4_w)); // unknown, lower 2 IO bits accessed along with serial accesses + //iomcu.p5_out_cb().set(FUNC(hng64_state::ioport5_w)); // simply seems to be unused, neither used for an IO port, nor any of the other features + //iomcu.p6_out_cb().set(FUNC(hng64_state::ioport6_w)); // the IO MCU code uses the ADC which shares pins with port 6, meaning port 6 isn't used as an IO port + iomcu.p7_out_cb().set(FUNC(hng64_state::ioport7_w)); // configuration / clocking for shared ram (port 0) accesses + // most likely the analog inputs, up to a maximum of 8 + iomcu.an0_in_cb().set(FUNC(hng64_state::anport0_r)); + iomcu.an1_in_cb().set(FUNC(hng64_state::anport1_r)); + iomcu.an2_in_cb().set(FUNC(hng64_state::anport2_r)); + iomcu.an3_in_cb().set(FUNC(hng64_state::anport3_r)); + iomcu.an4_in_cb().set(FUNC(hng64_state::anport4_r)); + iomcu.an5_in_cb().set(FUNC(hng64_state::anport5_r)); + iomcu.an6_in_cb().set(FUNC(hng64_state::anport6_r)); + iomcu.an7_in_cb().set(FUNC(hng64_state::anport7_r)); + // network related? + iomcu.serial0_out_cb().set(FUNC(hng64_state::sio0_w)); + //iomcu.serial1_out_cb().set(FUNC(hng64_state::sio1_w)); // not initialized / used + + MCFG_DEVICE_ADD("dt7133_dpram", MB8421, 0) + //MCFG_MB8421_INTL_AN0R(INPUTLINE("xxx", 0)) // I don't think the IRQs are connected MACHINE_CONFIG_END @@ -2047,13 +2488,13 @@ ROM_START( buriki ) ROM_END /* Bios */ -GAME( 1997, hng64, 0, hng64, hng64, hng64_state, init_hng64, ROT0, "SNK", "Hyper NeoGeo 64 Bios", MACHINE_NOT_WORKING|MACHINE_NO_SOUND|MACHINE_IS_BIOS_ROOT ) +GAME( 1997, hng64, 0, hng64, hng64, hng64_state, init_hng64, ROT0, "SNK", "Hyper NeoGeo 64 Bios", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_SOUND|MACHINE_IS_BIOS_ROOT ) /* Games */ -GAME( 1997, roadedge, hng64, hng64, roadedge, hng64_state, init_hng64_race, ROT0, "SNK", "Roads Edge / Round Trip (rev.B)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND ) /* 001 */ -GAME( 1998, sams64, hng64, hng64, hng64, hng64_state, init_ss64, ROT0, "SNK", "Samurai Shodown 64 / Samurai Spirits 64", MACHINE_NOT_WORKING|MACHINE_NO_SOUND ) /* 002 */ -GAME( 1998, xrally, hng64, hng64, roadedge, hng64_state, init_hng64_race, ROT0, "SNK", "Xtreme Rally / Off Beat Racer!", MACHINE_NOT_WORKING|MACHINE_NO_SOUND ) /* 003 */ -GAME( 1998, bbust2, hng64, hng64, bbust2, hng64_state, init_hng64_shoot, ROT0, "SNK", "Beast Busters 2nd Nightmare", MACHINE_NOT_WORKING|MACHINE_NO_SOUND ) /* 004 */ -GAME( 1998, sams64_2, hng64, hng64, hng64, hng64_state, init_ss64, ROT0, "SNK", "Samurai Shodown: Warrior's Rage / Samurai Spirits 2: Asura Zanmaden", MACHINE_NOT_WORKING|MACHINE_NO_SOUND ) /* 005 */ -GAME( 1998, fatfurwa, hng64, hng64, hng64, hng64_state, init_fatfurwa, ROT0, "SNK", "Fatal Fury: Wild Ambition (rev.A)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND ) /* 006 */ -GAME( 1999, buriki, hng64, hng64, hng64, hng64_state, init_buriki, ROT0, "SNK", "Buriki One (rev.B)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND ) /* 007 */ +GAME( 1997, roadedge, hng64, hng64, hng64_drive, hng64_state, init_hng64_race, ROT0, "SNK", "Roads Edge / Round Trip (rev.B)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_SOUND ) /* 001 */ +GAME( 1998, sams64, hng64, hng64, hng64_fight, hng64_state, init_ss64, ROT0, "SNK", "Samurai Shodown 64 / Samurai Spirits 64", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_SOUND ) /* 002 */ +GAME( 1998, xrally, hng64, hng64, hng64_drive, hng64_state, init_hng64_race, ROT0, "SNK", "Xtreme Rally / Off Beat Racer!", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_SOUND ) /* 003 */ +GAME( 1998, bbust2, hng64, hng64, hng64_shoot, hng64_state, init_hng64_shoot, ROT0, "SNK", "Beast Busters 2nd Nightmare", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_SOUND ) /* 004 */ +GAME( 1998, sams64_2, hng64, hng64, hng64_fight, hng64_state, init_ss64, ROT0, "SNK", "Samurai Shodown: Warrior's Rage / Samurai Spirits 2: Asura Zanmaden", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_SOUND ) /* 005 */ +GAME( 1998, fatfurwa, hng64, hng64, hng64_fight, hng64_state, init_hng64_fght, ROT0, "SNK", "Fatal Fury: Wild Ambition (rev.A)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_SOUND ) /* 006 */ +GAME( 1999, buriki, hng64, hng64, hng64_fight, hng64_state, init_hng64_fght, ROT0, "SNK", "Buriki One (rev.B)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_SOUND ) /* 007 */ diff --git a/src/mame/drivers/hp_ipc.cpp b/src/mame/drivers/hp_ipc.cpp index fcbe52ff23f..522470c5d60 100644 --- a/src/mame/drivers/hp_ipc.cpp +++ b/src/mame/drivers/hp_ipc.cpp @@ -495,7 +495,7 @@ void hp_ipc_state::hp_ipc_mem_inner_base(address_map &map) map(0x0600000, 0x060FFFF).rw(FUNC(hp_ipc_state::mmu_r), FUNC(hp_ipc_state::mmu_w)); map(0x0610000, 0x0610007).rw(FUNC(hp_ipc_state::floppy_id_r), FUNC(hp_ipc_state::floppy_id_w)).umask16(0x00ff); map(0x0610008, 0x061000F).rw(m_fdc, FUNC(wd2797_device::read), FUNC(wd2797_device::write)).umask16(0x00ff); - map(0x0620000, 0x062000F).rw("gpu", FUNC(hp1ll3_device::read), FUNC(hp1ll3_device::write)).umask16(0x00ff); + map(0x0620000, 0x0620007).rw("gpu", FUNC(hp1ll3_device::read), FUNC(hp1ll3_device::write)).umask16(0x00ff); map(0x0630000, 0x063FFFF).mask(0xf).rw("hpib" , FUNC(tms9914_device::reg8_r) , FUNC(tms9914_device::reg8_w)).umask16(0x00ff); map(0x0640000, 0x064002F).rw("rtc", FUNC(mm58167_device::read), FUNC(mm58167_device::write)).umask16(0x00ff); map(0x0660000, 0x06600FF).rw("mlc", FUNC(hp_hil_mlc_device::read), FUNC(hp_hil_mlc_device::write)).umask16(0x00ff); // 'caravan', scrn/caravan.h @@ -738,9 +738,7 @@ MACHINE_CONFIG_START(hp_ipc_state::hp_ipc_base) MCFG_DEVICE_ADD("maincpu", M68000, 15.92_MHz_XTAL / 2) MCFG_DEVICE_PROGRAM_MAP(hp_ipc_mem_outer) - MCFG_HP1LL3_ADD("gpu") -// MCFG_HP1LL3_IRQ_CALLBACK(WRITELINE(*this, hp_ipc_state, irq_4)) - MCFG_VIDEO_SET_SCREEN("screen") + HP1LL3(config , "gpu" , 24_MHz_XTAL / 8).set_screen("screen"); // XXX actual clock is 1MHz; remove this workaround (and change 2000 to 100 in hp_ipc_dsk.cpp) // XXX when floppy code correctly handles 600 rpm drives. @@ -799,12 +797,13 @@ MACHINE_CONFIG_START(hp_ipc_state::hp_ipc) // horizontal time = 60 us (min) // ver.refresh period = ~300 us // ver.period = 16.7ms (~60 hz) - MCFG_SCREEN_ADD_MONOCHROME("screen", LCD, rgb_t::amber()) // actually a kind of EL display - MCFG_SCREEN_UPDATE_DEVICE("gpu", hp1ll3_device, screen_update) - MCFG_SCREEN_RAW_PARAMS(6_MHz_XTAL * 2, 720, 0, 512, 278, 0, 256) - MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE("mlc", hp_hil_mlc_device, ap_w)) // XXX actually it's driven by 555 (U59) + SCREEN(config , m_screen , SCREEN_TYPE_LCD); + m_screen->set_color(rgb_t::amber()); // actually a kind of EL display + m_screen->set_screen_update("gpu" , FUNC(hp1ll3_device::screen_update)); + m_screen->set_raw(6_MHz_XTAL * 2 , 720 , 0 , 512 , 261 , 0 , 255); + m_screen->screen_vblank().set("mlc", FUNC(hp_hil_mlc_device::ap_w)); // XXX actually it's driven by 555 (U59) + m_screen->set_palette("palette"); - MCFG_SCREEN_PALETTE("palette") MCFG_PALETTE_ADD_MONOCHROME("palette") MACHINE_CONFIG_END diff --git a/src/mame/drivers/indiana.cpp b/src/mame/drivers/indiana.cpp index 0dc1b19d87e..6c68971be71 100644 --- a/src/mame/drivers/indiana.cpp +++ b/src/mame/drivers/indiana.cpp @@ -108,11 +108,11 @@ MACHINE_CONFIG_START(indiana_state::indiana) MCFG_DEVICE_ADD("isa3", ISA16_SLOT, 0, ISABUS_TAG, indiana_isa_cards, "comat", false) MCFG_DEVICE_ADD("isa4", ISA16_SLOT, 0, ISABUS_TAG, indiana_isa_cards, "ide", false) - MCFG_DEVICE_ADD(MFP_TAG, MC68901, XTAL(16'000'000)/4) - MCFG_MC68901_TIMER_CLOCK(XTAL(16'000'000)/4) - MCFG_MC68901_RX_CLOCK(0) - MCFG_MC68901_TX_CLOCK(0) - MCFG_MC68901_OUT_SO_CB(WRITELINE("keyboard", rs232_port_device, write_txd)) + mc68901_device &mfp(MC68901(config, MFP_TAG, XTAL(16'000'000)/4)); + mfp.set_timer_clock(XTAL(16'000'000)/4); + mfp.set_rx_clock(0); + mfp.set_tx_clock(0); + mfp.out_so_cb().set("keyboard", FUNC(rs232_port_device::write_txd)); MCFG_DEVICE_ADD("keyboard", RS232_PORT, default_rs232_devices, "keyboard") MCFG_RS232_RXD_HANDLER(WRITELINE(MFP_TAG, mc68901_device, write_rx)) diff --git a/src/mame/drivers/indigo.cpp b/src/mame/drivers/indigo.cpp index 7d9b1939ccd..4281179f99b 100644 --- a/src/mame/drivers/indigo.cpp +++ b/src/mame/drivers/indigo.cpp @@ -627,7 +627,7 @@ MACHINE_CONFIG_START(indigo_state::indigo4k) MACHINE_CONFIG_END ROM_START( indigo3k ) - ROM_REGION( 0x40000, "user1", 0 ) + ROM_REGION32_BE( 0x40000, "user1", 0 ) ROM_SYSTEM_BIOS( 0, "401-rev-c", "SGI Version 4.0.1 Rev C LG1/GR2, Jul 9, 1992" ) // dumped over serial connection from boot monitor and swapped ROMX_LOAD( "ip12prom.070-8088-xxx.u56", 0x000000, 0x040000, CRC(25ca912f) SHA1(94b3753d659bfe50b914445cef41290122f43880), ROM_GROUPWORD | ROM_REVERSE | ROM_BIOS(0) ) ROM_SYSTEM_BIOS( 1, "401-rev-d", "SGI Version 4.0.1 Rev D LG1/GR2, Mar 24, 1992" ) // dumped with EPROM programmer @@ -635,8 +635,8 @@ ROM_START( indigo3k ) ROM_END ROM_START( indigo4k ) - ROM_REGION( 0x80000, "user1", 0 ) - ROM_LOAD( "ip20prom.070-8116-004.bin", 0x000000, 0x080000, CRC(940d960e) SHA1(596aba530b53a147985ff3f6f853471ce48c866c) ) + ROM_REGION32_BE( 0x80000, "user1", 0 ) + ROMX_LOAD( "ip20prom.070-8116-004.bin", 0x000000, 0x080000, CRC(940d960e) SHA1(596aba530b53a147985ff3f6f853471ce48c866c), ROM_GROUPDWORD | ROM_REVERSE ) ROM_END // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS diff --git a/src/mame/drivers/indy_indigo2.cpp b/src/mame/drivers/indy_indigo2.cpp index f93815ce62a..b020cc494d7 100644 --- a/src/mame/drivers/indy_indigo2.cpp +++ b/src/mame/drivers/indy_indigo2.cpp @@ -70,10 +70,9 @@ public: : driver_device(mconfig, type, tag) , m_maincpu(*this, "maincpu") , m_mainram(*this, "mainram") - , m_sgi_mc(*this, "sgi_mc") + , m_mem_ctrl(*this, "memctrl") + , m_scsi_ctrl(*this, "wd33c93") , m_newport(*this, "newport") - , m_dac(*this, "dac") - , m_scsi(*this, "wd33c93") , m_hal2(*this, HAL2_TAG) , m_hpc3(*this, HPC3_TAG) , m_ioc2(*this, IOC2_TAG) @@ -104,10 +103,9 @@ private: required_device<mips3_device> m_maincpu; required_shared_ptr<uint32_t> m_mainram; - required_device<sgi_mc_device> m_sgi_mc; + required_device<sgi_mc_device> m_mem_ctrl; + required_device<wd33c93_device> m_scsi_ctrl; required_device<newport_video_device> m_newport; - required_device<dac_word_interface> m_dac; - required_device<wd33c93_device> m_scsi; required_device<hal2_device> m_hal2; required_device<hpc3_device> m_hpc3; required_device<ioc2_device> m_ioc2; @@ -140,14 +138,14 @@ inline void ATTR_PRINTF(3,4) ip22_state::verboselog(int n_level, const char *s_f WRITE32_MEMBER(ip22_state::ip22_write_ram) { // if banks 2 or 3 are enabled, do nothing, we don't support that much memory - if (m_sgi_mc->read(space, 0xc8/4, 0xffffffff) & 0x10001000) + if (m_mem_ctrl->read(space, 0xc8/4, 0xffffffff) & 0x10001000) { // a random perturbation so the memory test fails data ^= 0xffffffff; } // if banks 0 or 1 have 2 membanks, also kill it, we only want 128 MB - if (m_sgi_mc->read(space, 0xc0/4, 0xffffffff) & 0x40004000) + if (m_mem_ctrl->read(space, 0xc0/4, 0xffffffff) & 0x40004000) { // a random perturbation so the memory test fails data ^= 0xffffffff; @@ -160,7 +158,7 @@ void ip22_state::ip225015_map(address_map &map) map(0x00000000, 0x0007ffff).bankrw("bank1"); /* mirror of first 512k of main RAM */ map(0x08000000, 0x0fffffff).share("mainram").ram().w(FUNC(ip22_state::ip22_write_ram)); /* 128 MB of main RAM */ map(0x1f0f0000, 0x1f0f1fff).rw(m_newport, FUNC(newport_video_device::rex3_r), FUNC(newport_video_device::rex3_w)); - map(0x1fa00000, 0x1fa1ffff).rw(m_sgi_mc, FUNC(sgi_mc_device::read), FUNC(sgi_mc_device::write)); + map(0x1fa00000, 0x1fa1ffff).rw(m_mem_ctrl, FUNC(sgi_mc_device::read), FUNC(sgi_mc_device::write)); map(0x1fb90000, 0x1fb9ffff).rw(m_hpc3, FUNC(hpc3_device::hd_enet_r), FUNC(hpc3_device::hd_enet_w)); map(0x1fbb0000, 0x1fbb0003).ram(); /* unknown, but read a lot and discarded */ map(0x1fbc0000, 0x1fbc7fff).rw(m_hpc3, FUNC(hpc3_device::hd0_r), FUNC(hpc3_device::hd0_w)); @@ -210,47 +208,51 @@ void ip22_state::cdrom_config(device_t *device) MCFG_SOUND_ROUTE(1, ":rspeaker", 1.0) } -MACHINE_CONFIG_START(ip22_state::ip225015) - MCFG_DEVICE_ADD("maincpu", R5000BE, 50000000*3) - //MCFG_MIPS3_ICACHE_SIZE(32768) - //MCFG_MIPS3_DCACHE_SIZE(32768) - MCFG_DEVICE_PROGRAM_MAP(ip225015_map) +void ip22_state::ip225015(machine_config &config) +{ + R5000BE(config, m_maincpu, 50000000*3); + m_maincpu->set_addrmap(AS_PROGRAM, &ip22_state::ip225015_map); /* video hardware */ - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE( 60 ) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */ - MCFG_SCREEN_SIZE(1280+64, 1024+64) - MCFG_SCREEN_VISIBLE_AREA(0, 1279, 0, 1023) - MCFG_SCREEN_UPDATE_DEVICE("newport", newport_video_device, screen_update) + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); + screen.set_refresh_hz(60); + screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */ + screen.set_size(1280+64, 1024+64); + screen.set_visarea(0, 1279, 0, 1023); + screen.set_screen_update("newport", FUNC(newport_video_device::screen_update)); - MCFG_PALETTE_ADD("palette", 65536) + PALETTE(config, "palette", 65536); - MCFG_DEVICE_ADD("newport", NEWPORT_VIDEO, 0) + NEWPORT_VIDEO(config, m_newport); - MCFG_DEVICE_ADD("sgi_mc", SGI_MC, 0) + SGI_MC(config, m_mem_ctrl); SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); - MCFG_DEVICE_ADD("dac", DAC_16BIT_R2R_TWOS_COMPLEMENT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.25) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.25) // unknown DAC - MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0) - MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT) + dac_16bit_r2r_twos_complement_device &dac(DAC_16BIT_R2R_TWOS_COMPLEMENT(config, "dac", 0)); + dac.add_route(ALL_OUTPUTS, "lspeaker", 0.25); + dac.add_route(ALL_OUTPUTS, "rspeaker", 0.25); + + voltage_regulator_device &vreg = VOLTAGE_REGULATOR(config, "vref"); + vreg.set_output(5.0); + vreg.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); + vreg.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT); - MCFG_DEVICE_ADD("scsi", SCSI_PORT, 0) - MCFG_SCSIDEV_ADD("scsi:" SCSI_PORT_DEVICE1, "harddisk", SCSIHD, SCSI_ID_1) - MCFG_SCSIDEV_ADD("scsi:" SCSI_PORT_DEVICE2, "cdrom", SCSICD, SCSI_ID_4) - MCFG_SLOT_OPTION_MACHINE_CONFIG("cdrom", cdrom_config) + scsi_port_device &scsi(SCSI_PORT(config, "scsi")); + scsi.set_slot_device(1, "harddisk", SCSIHD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_1)); + scsi.set_slot_device(2, "cdrom", SCSICD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_4)); + scsi.slot(2).set_option_machine_config("cdrom", cdrom_config); - MCFG_DEVICE_ADD("wd33c93", WD33C93, 0) - MCFG_LEGACY_SCSI_PORT("scsi") - MCFG_WD33C93_IRQ_CB(WRITELINE(HPC3_TAG, hpc3_device, scsi_irq)) + WD33C93(config, m_scsi_ctrl); + m_scsi_ctrl->set_scsi_port("scsi"); + m_scsi_ctrl->irq_cb().set(m_hpc3, FUNC(hpc3_device::scsi_irq)); - MCFG_DEVICE_ADD(HAL2_TAG, SGI_HAL2, 0) - MCFG_DEVICE_ADD(IOC2_TAG, SGI_IOC2_GUINNESS, 0, "maincpu") - MCFG_DEVICE_ADD(HPC3_TAG, SGI_HPC3, 0, "maincpu", "wd33c93", "ioc2") + SGI_HAL2(config, m_hal2); + SGI_IOC2_GUINNESS(config, m_ioc2, m_maincpu); + SGI_HPC3(config, m_hpc3, m_maincpu, m_scsi_ctrl, m_ioc2); - MCFG_DEVICE_ADD(RTC_TAG, DS1386_8K, 32768) + DS1386_8K(config, m_rtc, 32768); MACHINE_CONFIG_END MACHINE_CONFIG_START(ip22_state::ip224613) diff --git a/src/mame/drivers/interpro.cpp b/src/mame/drivers/interpro.cpp index e4a252547f7..e2f17436e82 100644 --- a/src/mame/drivers/interpro.cpp +++ b/src/mame/drivers/interpro.cpp @@ -40,9 +40,9 @@ * 6600 1991 C400 40 MIPS emerald IOI, SRX bus? * 2400 1992 C4T 36 MIPS/33 SPECmarks 40MHz? sapphire CBUS * 6400 1992 C4T 36 MIPS/33 SPECmarks 40MHz sapphire SRX - * 2700 1993 C400I 40.1 SPECmark89 sapphire 2 CBUS - * 6700 1993 C400I 40.1 SPECmark89 sapphire 2 SRX - * 6800 1993 C400I 67.2 SPECmark89 sapphire 3 SRX + * 2700 1993 C400I 61 MIPS?/40.1 SPECmark89 sapphire 2 CBUS + * 6700 1993 C400I 61 MIPS?/40.1 SPECmark89 sapphire 2 SRX + * 6800 1993 C400I 85 MIPS/67.2 SPECmark89 sapphire 3 SRX * 2500 1993 C400I 19.9 SPECint92 sapphire * 2800 1994 C400I sapphire 3 CBUS? * @@ -53,12 +53,9 @@ * * A: case type (2=desktop, 6=minicase) * B: CPU type (0=C300, 4=C4T, 6=C400?, 7/8/5 = C400I) - * C: graphics type (0=none, 3/5=GT, 4=EDGE-1, 8 = EDGE-2) + * C: graphics type (0=none, 2=GT, 3=GT+, 5=GTII, 4=EDGE-1, 8=EDGE-2/2+) * D: usually 0, 6xxx systems have 5, 7 and 9 options (backplane type?) * - * Graphics type 3 is for GT graphics fitted to a 2xxx system, and type 5 when - * fitted to a 6xxx system. The latter is possibly also known as GTDB. - * * Both the desktop and minicase units supported expansion slots with a variety * of cards, although with different profiles and connectors between 2xxx and * 6xxx systems. The 2xxx bus is referred to as CBUS, with the 6xxx bus known @@ -663,19 +660,11 @@ void sapphire_state::sapphire_main_map(address_map &map) void emerald_state::emerald_io_map(address_map &map) { emerald_base_map(map); - - map(0x00000800, 0x000009ff).m(m_d_cammu, FUNC(cammu_c3_device::map)); - map(0x00000a00, 0x00000bff).m(m_i_cammu, FUNC(cammu_c3_device::map)); - map(0x00000c00, 0x00000dff).m(m_d_cammu, FUNC(cammu_c3_device::map_global)); } void turquoise_state::turquoise_io_map(address_map &map) { turquoise_base_map(map); - - map(0x00000800, 0x000009ff).m(m_d_cammu, FUNC(cammu_c3_device::map)); - map(0x00000a00, 0x00000bff).m(m_i_cammu, FUNC(cammu_c3_device::map)); - map(0x00000c00, 0x00000dff).m(m_d_cammu, FUNC(cammu_c3_device::map_global)); } void sapphire_state::sapphire_io_map(address_map &map) @@ -740,13 +729,13 @@ MACHINE_CONFIG_END MACHINE_CONFIG_START(interpro_state::interpro_scc2) MCFG_DEVICE_MODIFY(INTERPRO_SCC2_TAG) - MCFG_Z80SCC_OUT_TXDA_CB(WRITELINE(INTERPRO_KEYBOARD_PORT_TAG, interpro_keyboard_port_device, write_txd)) + MCFG_Z80SCC_OUT_TXDA_CB(WRITELINE(m_keyboard, interpro_keyboard_port_device, write_txd)) MCFG_Z80SCC_OUT_TXDB_CB(WRITELINE(INTERPRO_SERIAL_PORT0_TAG, rs232_port_device, write_txd)) MCFG_Z80SCC_OUT_INT_CB(WRITELINE(m_ioga, interpro_ioga_device, ir11_w)) MCFG_Z80SCC_OUT_WREQB_CB(WRITELINE(m_ioga, interpro_ioga_device, drq_serial0)) - MCFG_INTERPRO_KEYBOARD_PORT_ADD(INTERPRO_KEYBOARD_PORT_TAG, interpro_keyboard_devices, "lle_en_us") - MCFG_INTERPRO_KEYBOARD_RXD_HANDLER(WRITELINE(m_scc2, z80scc_device, rxa_w)) + INTERPRO_KEYBOARD_PORT(config, m_keyboard, interpro_keyboard_devices, "lle_en_us"); + m_keyboard->rxd_handler_cb().set(m_scc2, FUNC(z80scc_device::rxa_w)); MCFG_DEVICE_ADD(INTERPRO_SERIAL_PORT0_TAG, RS232_PORT, default_rs232_devices, nullptr) MCFG_RS232_RXD_HANDLER(WRITELINE(m_scc2, z80scc_device, rxb_w)) @@ -817,15 +806,15 @@ static INPUT_PORTS_START(interpro) INPUT_PORTS_END MACHINE_CONFIG_START(interpro_state::interpro) - MCFG_RAM_ADD(RAM_TAG) - MCFG_RAM_DEFAULT_SIZE("16M") - MCFG_RAM_EXTRA_OPTIONS("32M,64M,128M,256M") + RAM(config, m_ram, 0); + m_ram->set_default_size("16M"); + m_ram->set_extra_options("32M,64M,128M,256M"); // memory control gate array // srx gate array - MCFG_DEVICE_ADD(m_sga, INTERPRO_SGA, 0) - MCFG_INTERPRO_SGA_BERR_CB(WRITE32(m_ioga, interpro_ioga_device, bus_error)) + INTERPRO_SGA(config, m_sga, 0); + m_sga->berr_callback().set(m_ioga, FUNC(interpro_ioga_device::bus_error)); // floppy @@ -852,9 +841,8 @@ MACHINE_CONFIG_START(interpro_state::interpro) // i/o gate array // mouse - MCFG_DEVICE_ADD(INTERPRO_MOUSE_PORT_TAG, INTERPRO_MOUSE_PORT, 0) - MCFG_DEVICE_SLOT_INTERFACE(interpro_mouse_devices, "interpro_mouse", false) - MCFG_MOUSE_STATE_CB(WRITE32(m_ioga, interpro_ioga_device, mouse_status_w)) + interpro_mouse_port_device &mouse(INTERPRO_MOUSE_PORT(config, INTERPRO_MOUSE_PORT_TAG, interpro_mouse_devices, "interpro_mouse")); + mouse.state_func().set(m_ioga, FUNC(interpro_ioga_device::mouse_status_w)); // system layout config.set_default_layout(layout_interpro); @@ -872,19 +860,18 @@ MACHINE_CONFIG_START(emerald_state::emerald) MCFG_DEVICE_ADDRESS_MAP(2, interpro_boot_map) MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE(INTERPRO_IOGA_TAG, interpro_ioga_device, acknowledge_interrupt) - MCFG_DEVICE_ADD(m_i_cammu, CAMMU_C3, 0) - MCFG_CAMMU_EXCEPTION_CB(WRITE16(m_maincpu, clipper_device, set_exception)) + CAMMU_C3(config, m_i_cammu, 0); + m_i_cammu->exception_callback().set(m_maincpu, FUNC(clipper_device::set_exception)); - MCFG_DEVICE_ADD(m_d_cammu, CAMMU_C3, 0) - MCFG_CAMMU_EXCEPTION_CB(WRITE16(m_maincpu, clipper_device, set_exception)) - MCFG_CAMMU_LINK(INTERPRO_MMU_TAG "_i") + CAMMU_C3(config, m_d_cammu, 0); + m_d_cammu->exception_callback().set(m_maincpu, FUNC(clipper_device::set_exception)); + m_d_cammu->add_linked(m_i_cammu); // boot fails memory test without this - MCFG_DEVICE_MODIFY(RAM_TAG) - MCFG_RAM_DEFAULT_VALUE(0x00) + m_ram->set_default_value(0); // memory control gate array - MCFG_DEVICE_ADD(m_mcga, INTERPRO_MCGA, 0) + INTERPRO_MCGA(config, m_mcga, 0); // floppy controller MCFG_I82072_ADD(m_fdc, false) @@ -897,9 +884,9 @@ MACHINE_CONFIG_START(emerald_state::emerald) MCFG_FLOPPY_DRIVE_SOUND(false) // serial controllers and ports - MCFG_DEVICE_ADD(m_scc1, SCC85C30, 4.9152_MHz_XTAL) + SCC85C30(config, m_scc1, 4.9152_MHz_XTAL); interpro_scc1(config); - MCFG_DEVICE_ADD(m_scc2, SCC85C30, 4.9152_MHz_XTAL) + SCC85C30(config, m_scc2, 4.9152_MHz_XTAL); interpro_scc2(config); // scsi controller @@ -907,9 +894,9 @@ MACHINE_CONFIG_START(emerald_state::emerald) MCFG_SLOT_OPTION_MACHINE_CONFIG(INTERPRO_SCSI_ADAPTER_TAG, interpro_scsi_adapter) // ethernet controller - MCFG_DEVICE_ADD(m_eth, I82586, 10_MHz_XTAL) - MCFG_I82586_IRQ_CB(WRITELINE(m_ioga, interpro_ioga_device, ir12_w)) - MCFG_DEVICE_ADDRESS_MAP(0, interpro_82586_map) + I82586(config, m_eth, 10_MHz_XTAL); + m_eth->out_irq_cb().set(m_ioga, FUNC(interpro_ioga_device::ir12_w)); + m_eth->set_addrmap(0, &emerald_state::interpro_82586_map); // i/o gate array EMERALD_IOGA(config, m_ioga, 0); @@ -919,25 +906,25 @@ MACHINE_CONFIG_END MACHINE_CONFIG_START(turquoise_state::turquoise) interpro(config); + MCFG_DEVICE_ADD(m_maincpu, CLIPPER_C300, 12.5_MHz_XTAL) MCFG_DEVICE_ADDRESS_MAP(0, turquoise_main_map) MCFG_DEVICE_ADDRESS_MAP(1, turquoise_io_map) MCFG_DEVICE_ADDRESS_MAP(2, interpro_boot_map) MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE(INTERPRO_IOGA_TAG, interpro_ioga_device, acknowledge_interrupt) - MCFG_DEVICE_ADD(m_i_cammu, CAMMU_C3, 0) - MCFG_CAMMU_EXCEPTION_CB(WRITE16(m_maincpu, clipper_device, set_exception)) + CAMMU_C3(config, m_i_cammu, 0); + m_i_cammu->exception_callback().set(m_maincpu, FUNC(clipper_device::set_exception)); - MCFG_DEVICE_ADD(m_d_cammu, CAMMU_C3, 0) - MCFG_CAMMU_EXCEPTION_CB(WRITE16(m_maincpu, clipper_device, set_exception)) - MCFG_CAMMU_LINK(INTERPRO_MMU_TAG "_i") + CAMMU_C3(config, m_d_cammu, 0); + m_d_cammu->exception_callback().set(m_maincpu, FUNC(clipper_device::set_exception)); + m_d_cammu->add_linked(m_i_cammu); // boot fails memory test without this - MCFG_DEVICE_MODIFY(RAM_TAG) - MCFG_RAM_DEFAULT_VALUE(0x00) + m_ram->set_default_value(0); // memory control gate array - MCFG_DEVICE_ADD(m_mcga, INTERPRO_MCGA, 0) + INTERPRO_MCGA(config, m_mcga, 0); // floppy controller MCFG_I82072_ADD(m_fdc, false) @@ -949,9 +936,9 @@ MACHINE_CONFIG_START(turquoise_state::turquoise) MCFG_FLOPPY_DRIVE_SOUND(false) // serial controllers and ports - MCFG_DEVICE_ADD(m_scc1, SCC85C30, 4.9152_MHz_XTAL) + SCC85C30(config, m_scc1, 4.9152_MHz_XTAL); interpro_scc1(config); - MCFG_DEVICE_ADD(m_scc2, SCC85C30, 4.9152_MHz_XTAL) + SCC85C30(config, m_scc2, 4.9152_MHz_XTAL); interpro_scc2(config); // scsi controller @@ -959,24 +946,14 @@ MACHINE_CONFIG_START(turquoise_state::turquoise) MCFG_SLOT_OPTION_MACHINE_CONFIG(INTERPRO_SCSI_ADAPTER_TAG, interpro_scsi_adapter) // ethernet controller - MCFG_DEVICE_ADD(m_eth, I82586, 0) - MCFG_I82586_IRQ_CB(WRITELINE(m_ioga, interpro_ioga_device, ir12_w)) - MCFG_DEVICE_ADDRESS_MAP(0, interpro_82586_map) + I82586(config, m_eth, 10_MHz_XTAL); + m_eth->out_irq_cb().set(m_ioga, FUNC(interpro_ioga_device::ir12_w)); + m_eth->set_addrmap(0, &turquoise_state::interpro_82586_map); // i/o gate array TURQUOISE_IOGA(config, m_ioga, 0); m_ioga->set_memory(m_maincpu, 0); ioga(config); - - // cbus and slots - MCFG_DEVICE_ADD(INTERPRO_SLOT_TAG, CBUS, 0) - MCFG_CBUS_MEMORY(INTERPRO_CPU_TAG, 0, 1) - MCFG_CBUS_OUT_IRQ0_CB(WRITELINE(m_ioga, interpro_ioga_device, ir3_w)) - MCFG_CBUS_OUT_IRQ1_CB(WRITELINE(m_ioga, interpro_ioga_device, ir4_w)) - MCFG_CBUS_OUT_IRQ2_CB(WRITELINE(m_ioga, interpro_ioga_device, ir5_w)) - MCFG_CBUS_OUT_VBLANK_CB(WRITELINE(m_ioga, interpro_ioga_device, ir6_w)) - MCFG_CBUS_SLOT_ADD(INTERPRO_SLOT_TAG, INTERPRO_SLOT_TAG ":0", cbus_cards, nullptr, false) - MCFG_CBUS_SLOT_ADD(INTERPRO_SLOT_TAG, INTERPRO_SLOT_TAG ":1", cbus_cards, nullptr, false) MACHINE_CONFIG_END MACHINE_CONFIG_START(sapphire_state::sapphire) @@ -988,11 +965,11 @@ MACHINE_CONFIG_START(sapphire_state::sapphire) MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE(INTERPRO_IOGA_TAG, interpro_ioga_device, acknowledge_interrupt) // FIXME: 2400/6400 should be C4T cammu? - MCFG_DEVICE_ADD(m_mmu, CAMMU_C4I, 0) - MCFG_CAMMU_EXCEPTION_CB(WRITE16(m_maincpu, clipper_device, set_exception)) + CAMMU_C4I(config, m_mmu, 0); + m_mmu->exception_callback().set(m_maincpu, FUNC(clipper_device::set_exception)); // memory control gate array - MCFG_DEVICE_ADD(m_mcga, INTERPRO_FMCC, 0) + INTERPRO_FMCC(config, m_mcga, 0); // floppy controller MCFG_N82077AA_ADD(m_fdc, n82077aa_device::MODE_PS2) @@ -1004,12 +981,12 @@ MACHINE_CONFIG_START(sapphire_state::sapphire) MCFG_FLOPPY_DRIVE_SOUND(false) // srx arbiter gate array - MCFG_DEVICE_ADD(m_arbga, INTERPRO_ARBGA, 0) + INTERPRO_ARBGA(config, m_arbga, 0); // serial controllers and ports - MCFG_DEVICE_ADD(m_scc1, SCC85230, 4.9152_MHz_XTAL) + SCC85230(config, m_scc1, 4.9152_MHz_XTAL); interpro_scc1(config); - MCFG_DEVICE_ADD(m_scc2, SCC85C30, 4.9152_MHz_XTAL) + SCC85C30(config, m_scc2, 4.9152_MHz_XTAL); interpro_scc2(config); // scsi controller @@ -1017,9 +994,9 @@ MACHINE_CONFIG_START(sapphire_state::sapphire) MCFG_SLOT_OPTION_MACHINE_CONFIG(INTERPRO_SCSI_ADAPTER_TAG, interpro_scsi_adapter) // ethernet controller - MCFG_DEVICE_ADD(m_eth, I82596_LE16, 20_MHz_XTAL) - MCFG_I82586_IRQ_CB(WRITELINE(m_ioga, interpro_ioga_device, ir12_w)) - MCFG_DEVICE_ADDRESS_MAP(0, interpro_82596_map) + I82596_LE16(config, m_eth, 20_MHz_XTAL); + m_eth->out_irq_cb().set(m_ioga, FUNC(interpro_ioga_device::ir12_w)); + m_eth->set_addrmap(0, &sapphire_state::interpro_82596_map); // i/o gate array SAPPHIRE_IOGA(config, m_ioga, 0); @@ -1027,202 +1004,213 @@ MACHINE_CONFIG_START(sapphire_state::sapphire) ioga(config); // flash memory - MCFG_DEVICE_ADD(m_flash_lsb, INTEL_28F010, 0) - MCFG_DEVICE_ADD(m_flash_msb, INTEL_28F010, 0) + INTEL_28F010(config, m_flash_lsb); + INTEL_28F010(config, m_flash_msb); MACHINE_CONFIG_END MACHINE_CONFIG_START(turquoise_state::ip2000) turquoise(config); - //MCFG_DEVICE_MODIFY(INTERPRO_CPU_TAG) - //MCFG_DEVICE_CLOCK(40_MHz_XTAL) + //m_maincpu->set_clock(40_MHz_XTAL); - // GT graphics (2020) - MCFG_DEVICE_MODIFY(INTERPRO_SLOT_TAG ":0") - MCFG_SLOT_DEFAULT_OPTION("mpcb963") + // bus and slots (default to 2020 with GT graphics) + cbus_bus_device &bus(CBUS_BUS(config, INTERPRO_SLOT_TAG, 0, m_maincpu)); + + bus.out_irq0_cb().set(m_ioga, FUNC(interpro_ioga_device::ir3_w)); + bus.out_irq1_cb().set(m_ioga, FUNC(interpro_ioga_device::ir4_w)); + bus.out_irq2_cb().set(m_ioga, FUNC(interpro_ioga_device::ir5_w)); + bus.out_vblank_cb().set(m_ioga, FUNC(interpro_ioga_device::ir6_w)); + + CBUS_SLOT(config, INTERPRO_SLOT_TAG ":0", 0, bus, cbus_cards, "mpcb963", false); + CBUS_SLOT(config, INTERPRO_SLOT_TAG ":1", 0, bus, cbus_cards, nullptr, false); MCFG_SOFTWARE_LIST_FILTER("softlist", "2000") MACHINE_CONFIG_END MACHINE_CONFIG_START(sapphire_state::ip2400) sapphire(config); - //MCFG_DEVICE_MODIFY(INTERPRO_CPU_TAG) - //MCFG_DEVICE_CLOCK(50_MHz_XTAL) + //m_maincpu->set_clock(50_MHz_XTAL); + + m_mmu->set_cammu_id(cammu_c4i_device::CID_C4IR0); + + // bus and slots (default to 2430 with GT+ graphics) + cbus_bus_device &bus(CBUS_BUS(config, INTERPRO_SLOT_TAG, 0, m_maincpu)); - MCFG_DEVICE_MODIFY(INTERPRO_MMU_TAG) - MCFG_CAMMU_ID(cammu_c4i_device::CID_C4IR0) + bus.out_irq0_cb().set(m_ioga, FUNC(interpro_ioga_device::ir3_w)); + bus.out_irq1_cb().set(m_ioga, FUNC(interpro_ioga_device::ir4_w)); + bus.out_irq2_cb().set(m_ioga, FUNC(interpro_ioga_device::ir5_w)); + bus.out_vblank_cb().set(m_ioga, FUNC(interpro_ioga_device::ir6_w)); - // cbus and slots (default to 2430 with GT+ graphics) - MCFG_DEVICE_ADD(INTERPRO_SLOT_TAG, CBUS, 0) - MCFG_CBUS_MEMORY(INTERPRO_CPU_TAG, 0, 1) - MCFG_CBUS_OUT_IRQ0_CB(WRITELINE(m_ioga, interpro_ioga_device, ir6_w)) - MCFG_CBUS_SLOT_ADD(INTERPRO_SLOT_TAG, INTERPRO_SLOT_TAG ":0", cbus_cards, "msmt070", false) - MCFG_CBUS_SLOT_ADD(INTERPRO_SLOT_TAG, INTERPRO_SLOT_TAG ":1", cbus_cards, nullptr, false) + CBUS_SLOT(config, INTERPRO_SLOT_TAG ":0", 0, bus, cbus_cards, "msmt070", false); + CBUS_SLOT(config, INTERPRO_SLOT_TAG ":1", 0, bus, cbus_cards, nullptr, false); MCFG_SOFTWARE_LIST_FILTER("softlist", "2400") MACHINE_CONFIG_END MACHINE_CONFIG_START(sapphire_state::ip2500) sapphire(config); - //MCFG_DEVICE_MODIFY(INTERPRO_CPU_TAG) - //MCFG_DEVICE_CLOCK(XTAL(?) + //m_maincpu->set_clock(?); - // cbus and slots (default to 2530 with GT+ graphics) - MCFG_DEVICE_ADD(INTERPRO_SLOT_TAG, CBUS, 0) - MCFG_CBUS_MEMORY(INTERPRO_CPU_TAG, 0, 1) - MCFG_CBUS_OUT_IRQ0_CB(WRITELINE(m_ioga, interpro_ioga_device, ir6_w)) - MCFG_CBUS_SLOT_ADD(INTERPRO_SLOT_TAG, INTERPRO_SLOT_TAG ":0", cbus_cards, "msmt070", false) - MCFG_CBUS_SLOT_ADD(INTERPRO_SLOT_TAG, INTERPRO_SLOT_TAG ":1", cbus_cards, nullptr, false) + // FIXME: don't know which cammu revision + m_mmu->set_cammu_id(cammu_c4i_device::CID_C4IR0); - // GT II graphics? - //MCFG_SLOT_DEFAULT_OPTION("msmt135") + // bus and slots (default to 2530 with GT+ graphics) + cbus_bus_device &bus(CBUS_BUS(config, INTERPRO_SLOT_TAG, 0, m_maincpu)); - // FIXME: don't know which cammu revision - MCFG_DEVICE_MODIFY(INTERPRO_MMU_TAG) - MCFG_CAMMU_ID(cammu_c4i_device::CID_C4IR0) + bus.out_irq0_cb().set(m_ioga, FUNC(interpro_ioga_device::ir3_w)); + bus.out_irq1_cb().set(m_ioga, FUNC(interpro_ioga_device::ir4_w)); + bus.out_irq2_cb().set(m_ioga, FUNC(interpro_ioga_device::ir5_w)); + bus.out_vblank_cb().set(m_ioga, FUNC(interpro_ioga_device::ir6_w)); + + // GT II graphics (msmt135)? + CBUS_SLOT(config, INTERPRO_SLOT_TAG ":0", 0, bus, cbus_cards, "msmt070", false); + CBUS_SLOT(config, INTERPRO_SLOT_TAG ":1", 0, bus, cbus_cards, nullptr, false); MCFG_SOFTWARE_LIST_FILTER("softlist", "2500") MACHINE_CONFIG_END MACHINE_CONFIG_START(sapphire_state::ip2700) sapphire(config); - //MCFG_DEVICE_MODIFY(INTERPRO_CPU_TAG) - //MCFG_DEVICE_CLOCK(?) + //m_maincpu->set_clock(?); + + m_mmu->set_cammu_id(cammu_c4i_device::CID_C4IR2); - // cbus and slots (default to 2730 with GT+ graphics) - MCFG_DEVICE_ADD(INTERPRO_SLOT_TAG, CBUS, 0) - MCFG_CBUS_MEMORY(INTERPRO_CPU_TAG, 0, 1) - MCFG_CBUS_OUT_IRQ0_CB(WRITELINE(m_ioga, interpro_ioga_device, ir6_w)) - MCFG_CBUS_SLOT_ADD(INTERPRO_SLOT_TAG, INTERPRO_SLOT_TAG ":0", cbus_cards, "msmt070", false) - MCFG_CBUS_SLOT_ADD(INTERPRO_SLOT_TAG, INTERPRO_SLOT_TAG ":1", cbus_cards, nullptr, false) + // bus and slots (default to 2730 with GT+ graphics) + cbus_bus_device &bus(CBUS_BUS(config, INTERPRO_SLOT_TAG, 0, m_maincpu)); - // GT II graphics? - //MCFG_SLOT_DEFAULT_OPTION("msmt135") + bus.out_irq0_cb().set(m_ioga, FUNC(interpro_ioga_device::ir3_w)); + bus.out_irq1_cb().set(m_ioga, FUNC(interpro_ioga_device::ir4_w)); + bus.out_irq2_cb().set(m_ioga, FUNC(interpro_ioga_device::ir5_w)); + bus.out_vblank_cb().set(m_ioga, FUNC(interpro_ioga_device::ir6_w)); - MCFG_DEVICE_MODIFY(INTERPRO_MMU_TAG) - MCFG_CAMMU_ID(cammu_c4i_device::CID_C4IR2) + // GT II graphics (msmt135)? + CBUS_SLOT(config, INTERPRO_SLOT_TAG ":0", 0, bus, cbus_cards, "msmt070", false); + CBUS_SLOT(config, INTERPRO_SLOT_TAG ":1", 0, bus, cbus_cards, nullptr, false); MCFG_SOFTWARE_LIST_FILTER("softlist", "2700") MACHINE_CONFIG_END MACHINE_CONFIG_START(sapphire_state::ip2800) sapphire(config); - //MCFG_DEVICE_MODIFY(INTERPRO_CPU_TAG) - //MCFG_DEVICE_CLOCK(?) + //m_maincpu->set_clock(?); - // cbus and slots (default to 2830 with GT+ graphics) - MCFG_DEVICE_ADD(INTERPRO_SLOT_TAG, CBUS, 0) - MCFG_CBUS_MEMORY(INTERPRO_CPU_TAG, 0, 1) - MCFG_CBUS_OUT_IRQ0_CB(WRITELINE(m_ioga, interpro_ioga_device, ir6_w)) - MCFG_CBUS_SLOT_ADD(INTERPRO_SLOT_TAG, INTERPRO_SLOT_TAG ":0", cbus_cards, "msmt070", false) - MCFG_CBUS_SLOT_ADD(INTERPRO_SLOT_TAG, INTERPRO_SLOT_TAG ":1", cbus_cards, nullptr, false) + // FIXME: don't know which cammu revision + m_mmu->set_cammu_id(cammu_c4i_device::CID_C4IR2); - // GT II graphics? - //MCFG_SLOT_DEFAULT_OPTION("msmt135") + // bus and slots (default to 2830 with GT+ graphics) + cbus_bus_device &bus(CBUS_BUS(config, INTERPRO_SLOT_TAG, 0, m_maincpu)); - // FIXME: don't know which cammu revision - MCFG_DEVICE_MODIFY(INTERPRO_MMU_TAG) - MCFG_CAMMU_ID(cammu_c4i_device::CID_C4IR2) + bus.out_irq0_cb().set(m_ioga, FUNC(interpro_ioga_device::ir3_w)); + bus.out_irq1_cb().set(m_ioga, FUNC(interpro_ioga_device::ir4_w)); + bus.out_irq2_cb().set(m_ioga, FUNC(interpro_ioga_device::ir5_w)); + bus.out_vblank_cb().set(m_ioga, FUNC(interpro_ioga_device::ir6_w)); + + // GT II graphics (msmt135)? + CBUS_SLOT(config, INTERPRO_SLOT_TAG ":0", 0, bus, cbus_cards, "msmt070", false); + CBUS_SLOT(config, INTERPRO_SLOT_TAG ":1", 0, bus, cbus_cards, nullptr, false); MCFG_SOFTWARE_LIST_FILTER("softlist", "2800") MACHINE_CONFIG_END MACHINE_CONFIG_START(emerald_state::ip6000) emerald(config); - - //MCFG_DEVICE_MODIFY(INTERPRO_CPU_TAG) - //MCFG_DEVICE_CLOCK(80_MHz_XTAL / 2) + //m_maincpu->set_clock(80_MHz_XTAL / 2); // EDGE systems use graphics keyboard - MCFG_DEVICE_MODIFY(INTERPRO_KEYBOARD_PORT_TAG) - MCFG_SLOT_DEFAULT_OPTION(nullptr) - - // srx and slots (default to 6040 with EDGE-1 graphics) - MCFG_DEVICE_ADD(INTERPRO_SLOT_TAG, SRX, 0) - MCFG_SRX_MEMORY(INTERPRO_CPU_TAG, 0, 1) - MCFG_SRX_OUT_IRQ0_CB(WRITELINE(m_ioga, interpro_ioga_device, ir3_w)) - MCFG_SRX_OUT_IRQ1_CB(WRITELINE(m_ioga, interpro_ioga_device, ir4_w)) - MCFG_SRX_OUT_IRQ2_CB(WRITELINE(m_ioga, interpro_ioga_device, ir5_w)) - MCFG_SRX_OUT_VBLANK_CB(WRITELINE(m_ioga, interpro_ioga_device, ir6_w)) - MCFG_SRX_SLOT_ADD(INTERPRO_SLOT_TAG, INTERPRO_SLOT_TAG ":1", srx_cards, "mpcb828", false) - MCFG_SRX_SLOT_ADD(INTERPRO_SLOT_TAG, INTERPRO_SLOT_TAG ":2", srx_cards, nullptr, false) - MCFG_SRX_SLOT_ADD(INTERPRO_SLOT_TAG, INTERPRO_SLOT_TAG ":3", srx_cards, nullptr, false) - MCFG_SRX_SLOT_ADD(INTERPRO_SLOT_TAG, INTERPRO_SLOT_TAG ":4", srx_cards, nullptr, false) + m_keyboard->set_default_option(nullptr); + + // bus and slots (default to 6040 with EDGE-1 graphics) + srx_bus_device &bus(SRX_BUS(config, INTERPRO_SLOT_TAG, 0, m_maincpu)); + + bus.out_irq0_cb().set(m_ioga, FUNC(interpro_ioga_device::ir3_w)); + bus.out_irq1_cb().set(m_ioga, FUNC(interpro_ioga_device::ir4_w)); + bus.out_irq2_cb().set(m_ioga, FUNC(interpro_ioga_device::ir5_w)); + bus.out_vblank_cb().set(m_ioga, FUNC(interpro_ioga_device::ir6_w)); + + SRX_SLOT(config, INTERPRO_SLOT_TAG ":1", 0, bus, srx_cards, "mpcb828", false); + SRX_SLOT(config, INTERPRO_SLOT_TAG ":2", 0, bus, srx_cards, nullptr, false); + SRX_SLOT(config, INTERPRO_SLOT_TAG ":3", 0, bus, srx_cards, nullptr, false); + SRX_SLOT(config, INTERPRO_SLOT_TAG ":4", 0, bus, srx_cards, nullptr, false); MCFG_SOFTWARE_LIST_FILTER("softlist", "6000") MACHINE_CONFIG_END MACHINE_CONFIG_START(sapphire_state::ip6400) sapphire(config); - //MCFG_DEVICE_MODIFY(INTERPRO_CPU_TAG) - //MCFG_DEVICE_CLOCK(36_MHz_XTAL) - - MCFG_DEVICE_MODIFY(INTERPRO_MMU_TAG) - MCFG_CAMMU_ID(cammu_c4i_device::CID_C4IR0) - - // srx and slots (default to 6450 with GT II graphics) - MCFG_DEVICE_ADD(INTERPRO_SLOT_TAG, SRX, 0) - MCFG_SRX_MEMORY(INTERPRO_CPU_TAG, 0, 1) - MCFG_SRX_OUT_IRQ0_CB(WRITELINE(m_ioga, interpro_ioga_device, ir3_w)) - MCFG_SRX_OUT_IRQ1_CB(WRITELINE(m_ioga, interpro_ioga_device, ir4_w)) - MCFG_SRX_OUT_IRQ2_CB(WRITELINE(m_ioga, interpro_ioga_device, ir5_w)) - MCFG_SRX_SLOT_ADD(INTERPRO_SLOT_TAG, INTERPRO_SLOT_TAG ":1", srx_cards, "mpcbb92", false) - MCFG_SRX_SLOT_ADD(INTERPRO_SLOT_TAG, INTERPRO_SLOT_TAG ":2", srx_cards, nullptr, false) - MCFG_SRX_SLOT_ADD(INTERPRO_SLOT_TAG, INTERPRO_SLOT_TAG ":3", srx_cards, nullptr, false) - MCFG_SRX_SLOT_ADD(INTERPRO_SLOT_TAG, INTERPRO_SLOT_TAG ":4", srx_cards, nullptr, false) + //m_maincpu->set_clock(36_MHz_XTAL); + + m_mmu->set_cammu_id(cammu_c4i_device::CID_C4IR0); + + // bus and slots (default to 6450 with GT II graphics) + srx_bus_device &bus(SRX_BUS(config, INTERPRO_SLOT_TAG, 0, m_maincpu)); + + bus.out_irq0_cb().set(m_ioga, FUNC(interpro_ioga_device::ir3_w)); + bus.out_irq1_cb().set(m_ioga, FUNC(interpro_ioga_device::ir4_w)); + bus.out_irq2_cb().set(m_ioga, FUNC(interpro_ioga_device::ir5_w)); + bus.out_vblank_cb().set(m_ioga, FUNC(interpro_ioga_device::ir6_w)); + + SRX_SLOT(config, INTERPRO_SLOT_TAG ":1", 0, bus, srx_cards, "mpcbb92", false); + SRX_SLOT(config, INTERPRO_SLOT_TAG ":2", 0, bus, srx_cards, nullptr, false); + SRX_SLOT(config, INTERPRO_SLOT_TAG ":3", 0, bus, srx_cards, nullptr, false); + SRX_SLOT(config, INTERPRO_SLOT_TAG ":4", 0, bus, srx_cards, nullptr, false); + + // EDGE systems use graphics keyboard + //m_keyboard->set_default_option(nullptr); // EDGE-2 graphics (6480) - //MCFG_SRX_SLOT_ADD(INTERPRO_SRBUS_TAG, INTERPRO_SRBUS_TAG ":1", srx_cards, "mpcb030", false) - //MCFG_SRX_SLOT_ADD(INTERPRO_SRBUS_TAG, INTERPRO_SRBUS_TAG ":2", srx_cards, "mpcba63", false) + //SRX_SLOT(config, INTERPRO_SLOT_TAG ":1", 0, bus, srx_cards, "mpcb030", false); + //SRX_SLOT(config, INTERPRO_SLOT_TAG ":2", 0, bus, srx_cards, "mpcba63", false); MCFG_SOFTWARE_LIST_FILTER("softlist", "6400") MACHINE_CONFIG_END MACHINE_CONFIG_START(sapphire_state::ip6700) sapphire(config); - //MCFG_DEVICE_MODIFY(INTERPRO_CPU_TAG) - //MCFG_DEVICE_CLOCK(?) + //m_maincpu->set_clock(?); // FIXME: don't know which cammu revision - MCFG_DEVICE_MODIFY(INTERPRO_MMU_TAG) - MCFG_CAMMU_ID(cammu_c4i_device::CID_C4IR2) - - // srx and slots (default to 6780 with EDGE-2 Plus graphics) - MCFG_DEVICE_ADD(INTERPRO_SLOT_TAG, SRX, 0) - MCFG_SRX_MEMORY(INTERPRO_CPU_TAG, 0, 1) - MCFG_SRX_OUT_IRQ0_CB(WRITELINE(m_ioga, interpro_ioga_device, ir3_w)) - MCFG_SRX_OUT_IRQ1_CB(WRITELINE(m_ioga, interpro_ioga_device, ir4_w)) - MCFG_SRX_OUT_IRQ2_CB(WRITELINE(m_ioga, interpro_ioga_device, ir5_w)) - MCFG_SRX_SLOT_ADD(INTERPRO_SLOT_TAG, INTERPRO_SLOT_TAG ":1", srx_cards, "msmt094", false) - MCFG_SRX_SLOT_ADD(INTERPRO_SLOT_TAG, INTERPRO_SLOT_TAG ":2", srx_cards, "mpcb896", false) - MCFG_SRX_SLOT_ADD(INTERPRO_SLOT_TAG, INTERPRO_SLOT_TAG ":3", srx_cards, nullptr, false) - MCFG_SRX_SLOT_ADD(INTERPRO_SLOT_TAG, INTERPRO_SLOT_TAG ":4", srx_cards, nullptr, false) + m_mmu->set_cammu_id(cammu_c4i_device::CID_C4IR2); + + // EDGE systems use graphics keyboard + m_keyboard->set_default_option(nullptr); + + // bus and slots (default to 6780 with EDGE-2 Plus graphics) + srx_bus_device &bus(SRX_BUS(config, INTERPRO_SLOT_TAG, 0, m_maincpu)); + + bus.out_irq0_cb().set(m_ioga, FUNC(interpro_ioga_device::ir3_w)); + bus.out_irq1_cb().set(m_ioga, FUNC(interpro_ioga_device::ir4_w)); + bus.out_irq2_cb().set(m_ioga, FUNC(interpro_ioga_device::ir5_w)); + bus.out_vblank_cb().set(m_ioga, FUNC(interpro_ioga_device::ir6_w)); + + SRX_SLOT(config, INTERPRO_SLOT_TAG ":1", 0, bus, srx_cards, "msmt094", false); + SRX_SLOT(config, INTERPRO_SLOT_TAG ":2", 0, bus, srx_cards, "mpcb896", false); + SRX_SLOT(config, INTERPRO_SLOT_TAG ":3", 0, bus, srx_cards, nullptr, false); + SRX_SLOT(config, INTERPRO_SLOT_TAG ":4", 0, bus, srx_cards, nullptr, false); MCFG_SOFTWARE_LIST_FILTER("softlist", "6700") MACHINE_CONFIG_END MACHINE_CONFIG_START(sapphire_state::ip6800) sapphire(config); - //MCFG_DEVICE_MODIFY(INTERPRO_CPU_TAG) - //MCFG_DEVICE_CLOCK(?) + //m_maincpu->set_clock(?); // FIXME: don't know which cammu revision - MCFG_DEVICE_MODIFY(INTERPRO_MMU_TAG) - MCFG_CAMMU_ID(cammu_c4i_device::CID_C4IR2) + m_mmu->set_cammu_id(cammu_c4i_device::CID_C4IR2); // EDGE systems use graphics keyboard - MCFG_DEVICE_MODIFY(INTERPRO_KEYBOARD_PORT_TAG) - MCFG_SLOT_DEFAULT_OPTION(nullptr) - - // srx and slots (default to 6880 with EDGE-2 Plus graphics) - MCFG_DEVICE_ADD(INTERPRO_SLOT_TAG, SRX, 0) - MCFG_SRX_MEMORY(INTERPRO_CPU_TAG, 0, 1) - MCFG_SRX_OUT_IRQ0_CB(WRITELINE(m_ioga, interpro_ioga_device, ir3_w)) - MCFG_SRX_OUT_IRQ1_CB(WRITELINE(m_ioga, interpro_ioga_device, ir4_w)) - MCFG_SRX_OUT_IRQ2_CB(WRITELINE(m_ioga, interpro_ioga_device, ir5_w)) - MCFG_SRX_SLOT_ADD(INTERPRO_SLOT_TAG, INTERPRO_SLOT_TAG ":1", srx_cards, nullptr, false) - MCFG_SRX_SLOT_ADD(INTERPRO_SLOT_TAG, INTERPRO_SLOT_TAG ":2", srx_cards, nullptr, false) - MCFG_SRX_SLOT_ADD(INTERPRO_SLOT_TAG, INTERPRO_SLOT_TAG ":3", srx_cards, "msmt094", false) - MCFG_SRX_SLOT_ADD(INTERPRO_SLOT_TAG, INTERPRO_SLOT_TAG ":4", srx_cards, "mpcb896", false) + m_keyboard->set_default_option(nullptr); + + // bus and slots (default to 6880 with EDGE-2 Plus graphics) + srx_bus_device &bus(SRX_BUS(config, INTERPRO_SLOT_TAG, 0, m_maincpu)); + + bus.out_irq0_cb().set(m_ioga, FUNC(interpro_ioga_device::ir3_w)); + bus.out_irq1_cb().set(m_ioga, FUNC(interpro_ioga_device::ir4_w)); + bus.out_irq2_cb().set(m_ioga, FUNC(interpro_ioga_device::ir5_w)); + bus.out_vblank_cb().set(m_ioga, FUNC(interpro_ioga_device::ir6_w)); + + SRX_SLOT(config, INTERPRO_SLOT_TAG ":1", 0, bus, srx_cards, nullptr, false); + SRX_SLOT(config, INTERPRO_SLOT_TAG ":2", 0, bus, srx_cards, nullptr, false); + SRX_SLOT(config, INTERPRO_SLOT_TAG ":3", 0, bus, srx_cards, "msmt094", false); + SRX_SLOT(config, INTERPRO_SLOT_TAG ":4", 0, bus, srx_cards, "mpcb896", false); MCFG_SOFTWARE_LIST_FILTER("softlist", "6800") MACHINE_CONFIG_END diff --git a/src/mame/drivers/itech32.cpp b/src/mame/drivers/itech32.cpp index 3a0a971b22a..c4763adf3ca 100644 --- a/src/mame/drivers/itech32.cpp +++ b/src/mame/drivers/itech32.cpp @@ -357,10 +357,8 @@ Notes: #include "cpu/m68000/m68000.h" #include "cpu/m6809/m6809.h" #include "cpu/tms32031/tms32031.h" -#include "machine/6522via.h" #include "machine/nvram.h" #include "machine/watchdog.h" -#include "sound/es5506.h" #include "speaker.h" @@ -381,42 +379,16 @@ Notes: * *************************************/ -inline int itech32_state::determine_irq_state(int vint, int xint, int qint) -{ - int level = 0; - - - /* determine which level is active */ - if (m_vint_state) level = 1; - if (m_xint_state) level = 2; - if (m_qint_state) level = 3; - - /* Driver's Edge shifts the interrupts a bit */ - if (m_is_drivedge && level) level += 2; - - return level; -} - - -void itech32_state::itech32_update_interrupts(int vint, int xint, int qint) +void itech32_state::update_interrupts(int vint, int xint, int qint) { /* update the states */ if (vint != -1) m_vint_state = vint; if (xint != -1) m_xint_state = xint; if (qint != -1) m_qint_state = qint; - if (m_is_drivedge) - { - m_maincpu->set_input_line(3, m_vint_state ? ASSERT_LINE : CLEAR_LINE); - m_maincpu->set_input_line(4, m_xint_state ? ASSERT_LINE : CLEAR_LINE); - m_maincpu->set_input_line(5, m_qint_state ? ASSERT_LINE : CLEAR_LINE); - } - else - { - m_maincpu->set_input_line(1, m_vint_state ? ASSERT_LINE : CLEAR_LINE); - m_maincpu->set_input_line(2, m_xint_state ? ASSERT_LINE : CLEAR_LINE); - m_maincpu->set_input_line(3, m_qint_state ? ASSERT_LINE : CLEAR_LINE); - } + m_maincpu->set_input_line(1 + m_irq_base, m_vint_state ? ASSERT_LINE : CLEAR_LINE); + m_maincpu->set_input_line(2 + m_irq_base, m_xint_state ? ASSERT_LINE : CLEAR_LINE); + m_maincpu->set_input_line(3 + m_irq_base, m_qint_state ? ASSERT_LINE : CLEAR_LINE); } @@ -425,7 +397,7 @@ WRITE_LINE_MEMBER(itech32_state::generate_int1) if (state) { /* signal the NMI */ - itech32_update_interrupts(1, -1, -1); + update_interrupts(1, -1, -1); if (FULL_LOGGING) logerror("------------ VBLANK (%d) --------------\n", m_screen->vpos()); } } @@ -433,7 +405,7 @@ WRITE_LINE_MEMBER(itech32_state::generate_int1) WRITE16_MEMBER(itech32_state::int1_ack_w) { - itech32_update_interrupts(0, -1, -1); + update_interrupts(0, -1, -1); } @@ -447,15 +419,15 @@ WRITE16_MEMBER(itech32_state::int1_ack_w) void itech32_state::machine_start() { membank("soundbank")->configure_entries(0, 256, memregion("soundcpu")->base() + 0x10000, 0x4000); - m_leds.resolve(); + m_irq_base = 0; save_item(NAME(m_vint_state)); save_item(NAME(m_xint_state)); save_item(NAME(m_qint_state)); + save_item(NAME(m_irq_base)); save_item(NAME(m_sound_data)); save_item(NAME(m_sound_return)); save_item(NAME(m_sound_int_state)); - save_item(NAME(m_tms_spinning)); save_item(NAME(m_special_result)); save_item(NAME(m_p1_effx)); save_item(NAME(m_p1_effy)); @@ -476,8 +448,16 @@ void itech32_state::machine_reset() m_sound_int_state = 0; } +void drivedge_state::machine_start() +{ + itech32_state::machine_start(); + + m_leds.resolve(); -MACHINE_RESET_MEMBER(itech32_state,drivedge) + save_item(NAME(m_tms_spinning)); +} + +void drivedge_state::machine_reset() { itech32_state::machine_reset(); @@ -485,6 +465,8 @@ MACHINE_RESET_MEMBER(itech32_state,drivedge) m_dsp2->set_input_line(INPUT_LINE_RESET, ASSERT_LINE); STOP_TMS_SPINNING(machine(), 0); STOP_TMS_SPINNING(machine(), 1); + + m_irq_base = 2; } @@ -609,18 +591,17 @@ READ32_MEMBER(itech32_state::trackball32_4bit_combined_r) } -READ32_MEMBER(itech32_state::drivedge_steering_r) +READ32_MEMBER(drivedge_state::steering_r) { - int val = ioport("STEER")->read() * 2 - 0x100; + int val = m_steer->read() * 2 - 0x100; if (val < 0) val = 0x100 | (-val); return val << 16; } -READ32_MEMBER(itech32_state::drivedge_gas_r) +READ32_MEMBER(drivedge_state::gas_r) { - int val = ioport("GAS")->read(); - return val << 16; + return m_gas->read() << 16; } @@ -731,7 +712,7 @@ READ8_MEMBER(itech32_state::sound_data_buffer_r) * *************************************/ -WRITE8_MEMBER(itech32_state::drivedge_portb_out) +WRITE8_MEMBER(drivedge_state::portb_out) { // logerror("PIA port B write = %02x\n", data); @@ -749,7 +730,7 @@ WRITE8_MEMBER(itech32_state::drivedge_portb_out) } -WRITE_LINE_MEMBER(itech32_state::drivedge_turbo_light) +WRITE_LINE_MEMBER(drivedge_state::turbo_light) { m_leds[0] = state ? 1 : 0; } @@ -787,14 +768,14 @@ WRITE8_MEMBER(itech32_state::firq_clear_w) * *************************************/ -WRITE32_MEMBER(itech32_state::tms_reset_assert_w) +WRITE32_MEMBER(drivedge_state::tms_reset_assert_w) { m_dsp1->set_input_line(INPUT_LINE_RESET, ASSERT_LINE); m_dsp2->set_input_line(INPUT_LINE_RESET, ASSERT_LINE); } -WRITE32_MEMBER(itech32_state::tms_reset_clear_w) +WRITE32_MEMBER(drivedge_state::tms_reset_clear_w) { /* kludge to prevent crash on first boot */ if ((m_tms1_ram[0] & 0xff000000) == 0) @@ -810,7 +791,7 @@ WRITE32_MEMBER(itech32_state::tms_reset_clear_w) } -WRITE32_MEMBER(itech32_state::tms1_68k_ram_w) +WRITE32_MEMBER(drivedge_state::tms1_68k_ram_w) { COMBINE_DATA(&m_tms1_ram[offset]); if (offset == 0) COMBINE_DATA(m_tms1_boot); @@ -820,7 +801,7 @@ WRITE32_MEMBER(itech32_state::tms1_68k_ram_w) } -WRITE32_MEMBER(itech32_state::tms2_68k_ram_w) +WRITE32_MEMBER(drivedge_state::tms2_68k_ram_w) { COMBINE_DATA(&m_tms2_ram[offset]); if (offset == 0x382 && m_tms_spinning[1]) STOP_TMS_SPINNING(machine(), 1); @@ -829,28 +810,28 @@ WRITE32_MEMBER(itech32_state::tms2_68k_ram_w) } -WRITE32_MEMBER(itech32_state::tms1_trigger_w) +WRITE32_MEMBER(drivedge_state::tms1_trigger_w) { COMBINE_DATA(&m_tms1_ram[offset]); machine().scheduler().boost_interleave(attotime::from_hz(CPU020_CLOCK/256), attotime::from_usec(20)); } -WRITE32_MEMBER(itech32_state::tms2_trigger_w) +WRITE32_MEMBER(drivedge_state::tms2_trigger_w) { COMBINE_DATA(&m_tms2_ram[offset]); machine().scheduler().boost_interleave(attotime::from_hz(CPU020_CLOCK/256), attotime::from_usec(20)); } -READ32_MEMBER(itech32_state::drivedge_tms1_speedup_r) +READ32_MEMBER(drivedge_state::tms1_speedup_r) { if (m_tms1_ram[0x382] == 0 && m_dsp1->pc() == 0xee) START_TMS_SPINNING(0); return m_tms1_ram[0x382]; } -READ32_MEMBER(itech32_state::drivedge_tms2_speedup_r) +READ32_MEMBER(drivedge_state::tms2_speedup_r) { if (m_tms2_ram[0x382] == 0 && m_dsp2->pc() == 0x809808) START_TMS_SPINNING(1); return m_tms2_ram[0x382]; @@ -883,13 +864,16 @@ void itech32_state::nvram_init(nvram_device &nvram, void *base, size_t length) int start = (base == m_main_ram) ? 0x80 : 0x00; for (int i = start; i < length; i++) ((uint8_t *)base)[i] = machine().rand(); +} + +void drivedge_state::nvram_init(nvram_device &nvram, void *base, size_t length) +{ + itech32_state::nvram_init(nvram, base, length); // due to accessing uninitialized RAM, we need this hack - if (m_is_drivedge) - ((uint32_t *)m_main_ram.target())[0x2ce4/4] = 0x0000001e; + ((uint32_t *)m_main_ram.target())[0x2ce4/4] = 0x0000001e; } - /************************************* * * Main CPU memory handlers @@ -977,7 +961,7 @@ WRITE32_MEMBER(itech32_state::test2_w) } #endif -void itech32_state::drivedge_map(address_map &map) +void drivedge_state::main_map(address_map &map) { map(0x000000, 0x03ffff).mirror(0x40000).ram().share("nvram"); #if LOG_DRIVEDGE_UNINIT_RAM @@ -986,36 +970,36 @@ map(0x000c00, 0x007fff).mirror(0x40000).rw(FUNC(itech32_state::test2_r), FUNC(it #endif map(0x080000, 0x080003).portr("80000"); map(0x082000, 0x082003).portr("82000"); - map(0x084000, 0x084003).rw(FUNC(itech32_state::sound_data32_r), FUNC(itech32_state::sound_data32_w)); + map(0x084000, 0x084003).rw(FUNC(drivedge_state::sound_data32_r), FUNC(drivedge_state::sound_data32_w)); // AM_RANGE(0x086000, 0x08623f) AM_RAM -- networking -- first 0x40 bytes = our data, next 0x40*8 bytes = their data, r/w on IRQ2 - map(0x088000, 0x088003).r(FUNC(itech32_state::drivedge_steering_r)); - map(0x08a000, 0x08a003).r(FUNC(itech32_state::drivedge_gas_r)).nopw(); + map(0x088000, 0x088003).r(FUNC(drivedge_state::steering_r)); + map(0x08a000, 0x08a003).r(FUNC(drivedge_state::gas_r)).nopw(); map(0x08c000, 0x08c003).portr("8c000"); map(0x08e000, 0x08e003).portr("8e000").nopw(); - map(0x100000, 0x10000f).w(FUNC(itech32_state::drivedge_zbuf_control_w)).share("drivedge_zctl"); - map(0x180000, 0x180003).w(FUNC(itech32_state::drivedge_color0_w)); + map(0x100000, 0x10000f).w(FUNC(drivedge_state::zbuf_control_w)).share("zctl"); + map(0x180000, 0x180003).w(FUNC(drivedge_state::color0_w)); map(0x1a0000, 0x1bffff).ram().w(m_palette, FUNC(palette_device::write32)).share("palette"); map(0x1c0000, 0x1c0003).nopw(); - map(0x1e0000, 0x1e0113).rw(FUNC(itech32_state::itech020_video_r), FUNC(itech32_state::itech020_video_w)).share("video"); - map(0x1e4000, 0x1e4003).w(FUNC(itech32_state::tms_reset_assert_w)); - map(0x1ec000, 0x1ec003).w(FUNC(itech32_state::tms_reset_clear_w)); + map(0x1e0000, 0x1e0113).rw(FUNC(drivedge_state::itech020_video_r), FUNC(drivedge_state::itech020_video_w)).share("video"); + map(0x1e4000, 0x1e4003).w(FUNC(drivedge_state::tms_reset_assert_w)); + map(0x1ec000, 0x1ec003).w(FUNC(drivedge_state::tms_reset_clear_w)); map(0x200000, 0x200003).portr("200000"); - map(0x280000, 0x280fff).ram().w(FUNC(itech32_state::tms1_68k_ram_w)).share("tms1_ram"); - map(0x300000, 0x300fff).ram().w(FUNC(itech32_state::tms2_68k_ram_w)).share("tms2_ram"); + map(0x280000, 0x280fff).ram().w(FUNC(drivedge_state::tms1_68k_ram_w)).share("tms1_ram"); + map(0x300000, 0x300fff).ram().w(FUNC(drivedge_state::tms2_68k_ram_w)).share("tms2_ram"); map(0x380000, 0x380003).nopw(); // AM_DEVWRITE("watchdog", watchdog_timer_device, reset16_w) map(0x600000, 0x607fff).rom().region("user1", 0).share("main_rom"); } -void itech32_state::drivedge_tms1_map(address_map &map) +void drivedge_state::tms1_map(address_map &map) { map(0x000000, 0x001fff).ram().share("tms1_boot"); - map(0x008000, 0x0083ff).mirror(0x400).ram().w(FUNC(itech32_state::tms1_trigger_w)).share("tms1_ram"); + map(0x008000, 0x0083ff).mirror(0x400).ram().w(FUNC(drivedge_state::tms1_trigger_w)).share("tms1_ram"); map(0x080000, 0x0bffff).ram(); } -void itech32_state::drivedge_tms2_map(address_map &map) +void drivedge_state::tms2_map(address_map &map) { - map(0x000000, 0x0003ff).mirror(0x8400).ram().w(FUNC(itech32_state::tms2_trigger_w)).share("tms2_ram"); + map(0x000000, 0x0003ff).mirror(0x8400).ram().w(FUNC(drivedge_state::tms2_trigger_w)).share("tms2_ram"); map(0x080000, 0x08ffff).ram(); } @@ -1682,137 +1666,127 @@ INPUT_PORTS_END * *************************************/ -MACHINE_CONFIG_START(itech32_state::timekill) - - /* basic machine hardware */ - MCFG_DEVICE_ADD("maincpu", M68000, CPU_CLOCK) - MCFG_DEVICE_PROGRAM_MAP(timekill_map) - - MCFG_DEVICE_ADD("soundcpu", MC6809, SOUND_CLOCK/2) - MCFG_DEVICE_PROGRAM_MAP(sound_map) +void itech32_state::base_devices(machine_config &config) +{ + MC6809(config, m_soundcpu, SOUND_CLOCK/2); + m_soundcpu->set_addrmap(AS_PROGRAM, &itech32_state::sound_map); - MCFG_NVRAM_ADD_CUSTOM_DRIVER("nvram", itech32_state, nvram_init) + nvram_device &nvram(NVRAM(config, "nvram")); + nvram.set_custom_handler(FUNC(itech32_state::nvram_init)); - MCFG_TICKET_DISPENSER_ADD("ticket", attotime::from_msec(200), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_HIGH) + TICKET_DISPENSER(config, m_ticket, attotime::from_msec(200), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_HIGH); - MCFG_WATCHDOG_ADD("watchdog") + WATCHDOG_TIMER(config, "watchdog"); - /* video hardware */ - MCFG_PALETTE_ADD("palette", 8192) - MCFG_PALETTE_FORMAT(GRBX) + PALETTE(config, m_palette, 8192); + m_palette->set_format(PALETTE_FORMAT_GRBX); - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK) - MCFG_SCREEN_RAW_PARAMS(VIDEO_CLOCK, 508, 0, 384, 262, 0, 240) // most games configure the screen this way -// MCFG_SCREEN_RAW_PARAMS(VIDEO_CLOCK, 508, 0, 384, 286, 0, 256) // sftm, wcbowl and shufshot configure it this way - MCFG_SCREEN_UPDATE_DRIVER(itech32_state, screen_update_itech32) - MCFG_SCREEN_PALETTE("palette") - MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, itech32_state, generate_int1)) + SCREEN(config, m_screen, SCREEN_TYPE_RASTER); + m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK); + m_screen->set_raw(VIDEO_CLOCK, 508, 0, 384, 262, 0, 240); // most games configure the screen this way +// m_screen->set_raw(VIDEO_CLOCK, 508, 0, 384, 286, 0, 256); // sftm, wcbowl and shufshot configure it this way + m_screen->set_screen_update(FUNC(itech32_state::screen_update_itech32)); + m_screen->set_palette(m_palette); + m_screen->screen_vblank().set(FUNC(itech32_state::generate_int1)); - /* sound hardware */ SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); - MCFG_DEVICE_ADD("ensoniq", ES5506, SOUND_CLOCK) - MCFG_ES5506_REGION0("ensoniq.0") - MCFG_ES5506_REGION1("ensoniq.1") - MCFG_ES5506_REGION2("ensoniq.2") - MCFG_ES5506_REGION3("ensoniq.3") - MCFG_ES5506_CHANNELS(1) /* channels */ - MCFG_SOUND_ROUTE(0, "rspeaker", 0.1) /* swapped stereo */ - MCFG_SOUND_ROUTE(1, "lspeaker", 0.1) + ES5506(config, m_ensoniq, SOUND_CLOCK); + m_ensoniq->set_region0("ensoniq.0"); + m_ensoniq->set_region1("ensoniq.1"); + m_ensoniq->set_region2("ensoniq.2"); + m_ensoniq->set_region3("ensoniq.3"); + m_ensoniq->set_channels(1); /* channels */ + m_ensoniq->add_route(0, "rspeaker", 0.1); /* swapped stereo */ + m_ensoniq->add_route(1, "lspeaker", 0.1); +} - /* via */ - MCFG_DEVICE_ADD("via6522_0", VIA6522, SOUND_CLOCK/8) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, itech32_state,pia_portb_out)) - MCFG_VIA6522_IRQ_HANDLER(INPUTLINE("soundcpu", M6809_FIRQ_LINE)) -MACHINE_CONFIG_END +void itech32_state::via(machine_config &config) +{ + VIA6522(config, m_via, SOUND_CLOCK/8); + m_via->writepb_handler().set(FUNC(itech32_state::pia_portb_out)); + m_via->irq_handler().set_inputline(m_soundcpu, M6809_FIRQ_LINE); +} +void itech32_state::timekill(machine_config &config) +{ + M68000(config, m_maincpu, CPU_CLOCK); + m_maincpu->set_addrmap(AS_PROGRAM, &itech32_state::timekill_map); -MACHINE_CONFIG_START(itech32_state::bloodstm) - timekill(config); + base_devices(config); + via(config); +} - /* basic machine hardware */ +void itech32_state::bloodstm(machine_config &config) +{ + M68000(config, m_maincpu, CPU_CLOCK); + m_maincpu->set_addrmap(AS_PROGRAM, &itech32_state::bloodstm_map); - MCFG_DEVICE_MODIFY("maincpu") - MCFG_DEVICE_PROGRAM_MAP(bloodstm_map) + base_devices(config); - /* video hardware */ - MCFG_PALETTE_MODIFY("palette") - MCFG_PALETTE_ENTRIES(32768) - MCFG_PALETTE_FORMAT(XBGR) - MCFG_PALETTE_ENDIANNESS(ENDIANNESS_LITTLE) -MACHINE_CONFIG_END + m_palette->set_entries(32768); + m_palette->set_format(PALETTE_FORMAT_XBGR); + m_palette->set_endianness(ENDIANNESS_LITTLE); + via(config); +} -MACHINE_CONFIG_START(itech32_state::drivedge) - timekill(config); +void drivedge_state::drivedge(machine_config &config) +{ + base_devices(config); /* basic machine hardware */ + M68EC020(config, m_maincpu, CPU020_CLOCK); + m_maincpu->set_addrmap(AS_PROGRAM, &drivedge_state::main_map); - MCFG_DEVICE_REPLACE("maincpu", M68EC020, CPU020_CLOCK) - MCFG_DEVICE_PROGRAM_MAP(drivedge_map) - - MCFG_DEVICE_ADD("dsp1", TMS32031, TMS_CLOCK) - MCFG_DEVICE_PROGRAM_MAP(drivedge_tms1_map) + TMS32031(config, m_dsp1, TMS_CLOCK); + m_dsp1->set_addrmap(AS_PROGRAM, &drivedge_state::tms1_map); - MCFG_DEVICE_ADD("dsp2", TMS32031, TMS_CLOCK) - MCFG_DEVICE_PROGRAM_MAP(drivedge_tms2_map) + TMS32031(config, m_dsp2, TMS_CLOCK); + m_dsp2->set_addrmap(AS_PROGRAM, &drivedge_state::tms2_map); - MCFG_PALETTE_MODIFY("palette") - MCFG_PALETTE_ENTRIES(32768) - MCFG_PALETTE_FORMAT(XBGR) + m_palette->set_entries(32768); + m_palette->set_format(PALETTE_FORMAT_XBGR); - MCFG_DEVICE_MODIFY("via6522_0") - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, itech32_state,drivedge_portb_out)) - MCFG_VIA6522_CB2_HANDLER(WRITELINE(*this, itech32_state,drivedge_turbo_light)) + via(config); + m_via->writepb_handler().set(FUNC(drivedge_state::portb_out)); + m_via->cb2_handler().set(FUNC(drivedge_state::turbo_light)); -// MCFG_DEVICE_ADD("comm", M6803, 8000000/4) -- network CPU +// M6803(config, "comm", 8000000/4); -- network CPU - MCFG_MACHINE_RESET_OVERRIDE(itech32_state,drivedge) - MCFG_QUANTUM_TIME(attotime::from_hz(6000)) + config.m_minimum_quantum = attotime::from_hz(6000); - MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_VBLANK_CALLBACK(NOOP) // interrupt not used? + m_screen->screen_vblank().set_nop(); // interrupt not used? SPEAKER(config, "left_back").front_left(); SPEAKER(config, "right_back").front_right(); - MCFG_DEVICE_MODIFY("ensoniq") - MCFG_ES5506_CHANNELS(2) /* channels */ - MCFG_SOUND_ROUTE(2, "right_back", 0.1) /* swapped stereo */ - MCFG_SOUND_ROUTE(3, "left_back", 0.1) -MACHINE_CONFIG_END - - -MACHINE_CONFIG_START(itech32_state::sftm) - timekill(config); - - /* basic machine hardware */ - - MCFG_DEVICE_REPLACE("maincpu", M68EC020, CPU020_CLOCK) - MCFG_DEVICE_PROGRAM_MAP(itech020_map) + m_ensoniq->set_channels(2); + m_ensoniq->add_route(2, "right_back", 0.1); /* swapped stereo */ + m_ensoniq->add_route(3, "left_back", 0.1); +} - MCFG_DEVICE_MODIFY("soundcpu") - MCFG_DEVICE_PROGRAM_MAP(sound_020_map) - MCFG_DEVICE_PERIODIC_INT_DRIVER(itech32_state, irq1_line_assert, 4*60) +void itech32_state::sftm(machine_config &config) +{ + base_devices(config); + via(config); - MCFG_PALETTE_MODIFY("palette") - MCFG_PALETTE_ENTRIES(32768) - MCFG_PALETTE_FORMAT(XRGB) + M68EC020(config, m_maincpu, CPU020_CLOCK); + m_maincpu->set_addrmap(AS_PROGRAM, &itech32_state::itech020_map); - /* via */ - MCFG_DEVICE_REMOVE("via6522_0") -MACHINE_CONFIG_END + m_soundcpu->set_addrmap(AS_PROGRAM, &itech32_state::sound_020_map); + m_soundcpu->set_periodic_int(FUNC(itech32_state::irq1_line_assert), attotime::from_hz(4*60)); + m_palette->set_entries(32768); + m_palette->set_format(PALETTE_FORMAT_XRGB); +} -MACHINE_CONFIG_START(itech32_state::tourny) +void itech32_state::tourny(machine_config &config) +{ sftm(config); - - /* basic machine hardware */ - - MCFG_DEVICE_ADD(m_timekeeper, M48T02, 0) -MACHINE_CONFIG_END + M48T02(config, m_timekeeper); +} @@ -4388,7 +4362,6 @@ void itech32_state::init_timekill() init_program_rom(); m_vram_height = 512; m_planes = 2; - m_is_drivedge = 0; } @@ -4397,7 +4370,6 @@ void itech32_state::init_hardyard() init_program_rom(); m_vram_height = 1024; m_planes = 1; - m_is_drivedge = 0; } @@ -4406,19 +4378,17 @@ void itech32_state::init_bloodstm() init_program_rom(); m_vram_height = 1024; m_planes = 1; - m_is_drivedge = 0; } -void itech32_state::init_drivedge() +void drivedge_state::driver_init() { init_program_rom(); m_vram_height = 1024; m_planes = 1; - m_is_drivedge = 1; - m_dsp1->space(AS_PROGRAM).install_read_handler(0x8382, 0x8382, read32_delegate(FUNC(itech32_state::drivedge_tms1_speedup_r),this)); - m_dsp2->space(AS_PROGRAM).install_read_handler(0x8382, 0x8382, read32_delegate(FUNC(itech32_state::drivedge_tms2_speedup_r),this)); + m_dsp1->space(AS_PROGRAM).install_read_handler(0x8382, 0x8382, read32_delegate(FUNC(drivedge_state::tms1_speedup_r),this)); + m_dsp2->space(AS_PROGRAM).install_read_handler(0x8382, 0x8382, read32_delegate(FUNC(drivedge_state::tms2_speedup_r),this)); } @@ -4468,7 +4438,6 @@ void itech32_state::init_sftm_common(int prot_addr) init_program_rom(); m_vram_height = 1024; m_planes = 1; - m_is_drivedge = 0; m_itech020_prot_address = prot_addr; @@ -4499,7 +4468,6 @@ void itech32_state::init_shuffle_bowl_common(int prot_addr) init_program_rom(); m_vram_height = 1024; m_planes = 1; - m_is_drivedge = 0; m_itech020_prot_address = prot_addr; @@ -4540,7 +4508,6 @@ void itech32_state::init_gt_common() init_program_rom(); m_vram_height = 1024; m_planes = 2; - m_is_drivedge = 0; m_itech020_prot_address = 0x112f; } @@ -4661,45 +4628,45 @@ Label1 bne.s Label1 ; Infinite loop if result isn't 0x80 * *************************************/ -GAME( 1992, timekill, 0, timekill, timekill, itech32_state, init_timekill, ROT0, "Strata/Incredible Technologies", "Time Killers (v1.32)", MACHINE_SUPPORTS_SAVE ) -GAME( 1992, timekill132i, timekill, timekill, timekill, itech32_state, init_timekill, ROT0, "Strata/Incredible Technologies", "Time Killers (v1.32I)", MACHINE_SUPPORTS_SAVE ) -GAME( 1992, timekill131, timekill, timekill, timekill, itech32_state, init_timekill, ROT0, "Strata/Incredible Technologies", "Time Killers (v1.31)", MACHINE_SUPPORTS_SAVE ) -GAME( 1992, timekill121, timekill, timekill, timekill, itech32_state, init_timekill, ROT0, "Strata/Incredible Technologies", "Time Killers (v1.21)", MACHINE_SUPPORTS_SAVE ) -GAME( 1992, timekill121a, timekill, timekill, timekill, itech32_state, init_timekill, ROT0, "Strata/Incredible Technologies", "Time Killers (v1.21, alternate ROM board)", MACHINE_SUPPORTS_SAVE ) -GAME( 1993, hardyard, 0, bloodstm, hardyard, itech32_state, init_hardyard, ROT0, "Strata/Incredible Technologies", "Hard Yardage (v1.20)", MACHINE_SUPPORTS_SAVE ) -GAME( 1993, hardyard11, hardyard, bloodstm, hardyard, itech32_state, init_hardyard, ROT0, "Strata/Incredible Technologies", "Hard Yardage (v1.10)", MACHINE_SUPPORTS_SAVE ) -GAME( 1993, hardyard10, hardyard, bloodstm, hardyard, itech32_state, init_hardyard, ROT0, "Strata/Incredible Technologies", "Hard Yardage (v1.00)", MACHINE_SUPPORTS_SAVE ) -GAME( 1994, bloodstm, 0, bloodstm, bloodstm, itech32_state, init_bloodstm, ROT0, "Strata/Incredible Technologies", "Blood Storm (v2.22)", MACHINE_SUPPORTS_SAVE ) -GAME( 1994, bloodstm22, bloodstm, bloodstm, bloodstm, itech32_state, init_bloodstm, ROT0, "Strata/Incredible Technologies", "Blood Storm (v2.20)", MACHINE_SUPPORTS_SAVE ) -GAME( 1994, bloodstm21, bloodstm, bloodstm, bloodstm, itech32_state, init_bloodstm, ROT0, "Strata/Incredible Technologies", "Blood Storm (v2.10)", MACHINE_SUPPORTS_SAVE ) -GAME( 1994, bloodstm11, bloodstm, bloodstm, bloodstm, itech32_state, init_bloodstm, ROT0, "Strata/Incredible Technologies", "Blood Storm (v1.10)", MACHINE_SUPPORTS_SAVE ) -GAME( 1994, bloodstm10, bloodstm, bloodstm, bloodstm, itech32_state, init_bloodstm, ROT0, "Strata/Incredible Technologies", "Blood Storm (v1.04)", MACHINE_SUPPORTS_SAVE ) -GAME( 1994, pairsred, 0, bloodstm, pairs, itech32_state, init_bloodstm, ROT0, "Strata/Incredible Technologies", "Pairs Redemption (V1.0, 10/25/94)", MACHINE_SUPPORTS_SAVE ) -GAME( 1994, pairs, 0, bloodstm, pairs, itech32_state, init_bloodstm, ROT0, "Strata/Incredible Technologies", "Pairs (V1.2, 09/30/94)", MACHINE_SUPPORTS_SAVE ) -GAME( 1994, pairsa, pairs, bloodstm, pairs, itech32_state, init_bloodstm, ROT0, "Strata/Incredible Technologies", "Pairs (V1, 09/07/94)", MACHINE_SUPPORTS_SAVE ) -GAME( 1994, hotmemry, pairs, bloodstm, pairs, itech32_state, init_bloodstm, ROT0, "Incredible Technologies (Tuning license)", "Hot Memory (V1.2, Germany, 12/28/94)", MACHINE_SUPPORTS_SAVE ) -GAME( 1994, hotmemry11, pairs, bloodstm, pairs, itech32_state, init_bloodstm, ROT0, "Incredible Technologies (Tuning license)", "Hot Memory (V1.1, Germany, 11/30/94)", MACHINE_SUPPORTS_SAVE ) -GAME( 1994, drivedge, 0, drivedge, drivedge, itech32_state, init_drivedge, ROT0, "Strata/Incredible Technologies", "Driver's Edge (v1.6)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) -GAME( 1995, wcbowl, 0, sftm, wcbowln, itech32_state, init_wcbowln, ROT0, "Incredible Technologies", "World Class Bowling (v1.66)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITBWL-3 */ -GAME( 1995, wcbowl165, wcbowl, sftm, wcbowlo, itech32_state, init_wcbowln, ROT0, "Incredible Technologies", "World Class Bowling (v1.65)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITBWL-3 */ -GAME( 1995, wcbowl161, wcbowl, sftm, wcbowlo, itech32_state, init_wcbowln, ROT0, "Incredible Technologies", "World Class Bowling (v1.61)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITBWL-3 */ -GAME( 1995, wcbowl16, wcbowl, sftm, wcbowlo, itech32_state, init_wcbowln, ROT0, "Incredible Technologies", "World Class Bowling (v1.6)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITBWL-3 */ -GAME( 1995, wcbowl15, wcbowl, bloodstm, wcbowl, itech32_state, init_wcbowl, ROT0, "Incredible Technologies", "World Class Bowling (v1.5)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITBWL-1 */ -GAME( 1995, wcbowl14, wcbowl, bloodstm, wcbowl, itech32_state, init_wcbowl, ROT0, "Incredible Technologies", "World Class Bowling (v1.4)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITBWL-1 */ -GAME( 1995, wcbowl13, wcbowl, bloodstm, wcbowl, itech32_state, init_wcbowl, ROT0, "Incredible Technologies", "World Class Bowling (v1.3)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITBWL-1 */ -GAME( 1995, wcbowl13j, wcbowl, bloodstm, wcbowlj, itech32_state, init_wcbowlj, ROT0, "Incredible Technologies", "World Class Bowling (v1.3J, Japan)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITBWL-1 */ -GAME( 1995, wcbowl12, wcbowl, bloodstm, wcbowl, itech32_state, init_wcbowl, ROT0, "Incredible Technologies", "World Class Bowling (v1.2)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITBWL-1 */ -GAME( 1995, wcbowl11, wcbowl, bloodstm, wcbowl, itech32_state, init_wcbowl, ROT0, "Incredible Technologies", "World Class Bowling (v1.1)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITBWL-1 */ -GAME( 1995, wcbowl10, wcbowl, bloodstm, wcbowl, itech32_state, init_wcbowl, ROT0, "Incredible Technologies", "World Class Bowling (v1.0)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITBWL-1 */ -GAME( 1995, sftm, 0, sftm, sftm, itech32_state, init_sftm, ROT0, "Capcom / Incredible Technologies", "Street Fighter: The Movie (v1.12)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITSF-1 */ -GAME( 1995, sftm111, sftm, sftm, sftm, itech32_state, init_sftm110, ROT0, "Capcom / Incredible Technologies", "Street Fighter: The Movie (v1.11)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITSF-1 */ -GAME( 1995, sftm110, sftm, sftm, sftm, itech32_state, init_sftm110, ROT0, "Capcom / Incredible Technologies", "Street Fighter: The Movie (v1.10)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITSF-1 */ -GAME( 1995, sftmj, sftm, sftm, sftm, itech32_state, init_sftm, ROT0, "Capcom / Incredible Technologies", "Street Fighter: The Movie (v1.12N, Japan)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITSF-1 */ -GAME( 1997, shufshot, 0, sftm, shufshot, itech32_state, init_shufshot, ROT0, "Strata/Incredible Technologies", "Shuffleshot (v1.40)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITSHF-1 */ -GAME( 1997, shufshot139, shufshot, sftm, shufshot, itech32_state, init_shufshot, ROT0, "Strata/Incredible Technologies", "Shuffleshot (v1.39)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITSHF-1 */ -GAME( 1997, shufshot137, shufshot, sftm, shufshto, itech32_state, init_shufshot, ROT0, "Strata/Incredible Technologies", "Shuffleshot (v1.37)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITSHF-1 */ -GAME( 1997, wcbowl140, wcbowldx, tourny, wcbowldx, itech32_state, init_wcbowlt, ROT0, "Incredible Technologies", "World Class Bowling Tournament (v1.40)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITBWL-3 */ -GAME( 1999, wcbowldx, 0, sftm, wcbowldx, itech32_state, init_shufshot, ROT0, "Incredible Technologies", "World Class Bowling Deluxe (v2.00)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITBWL-4 */ +GAME( 1992, timekill, 0, timekill, timekill, itech32_state, init_timekill, ROT0, "Strata/Incredible Technologies", "Time Killers (v1.32)", MACHINE_SUPPORTS_SAVE ) +GAME( 1992, timekill132i, timekill, timekill, timekill, itech32_state, init_timekill, ROT0, "Strata/Incredible Technologies", "Time Killers (v1.32I)", MACHINE_SUPPORTS_SAVE ) +GAME( 1992, timekill131, timekill, timekill, timekill, itech32_state, init_timekill, ROT0, "Strata/Incredible Technologies", "Time Killers (v1.31)", MACHINE_SUPPORTS_SAVE ) +GAME( 1992, timekill121, timekill, timekill, timekill, itech32_state, init_timekill, ROT0, "Strata/Incredible Technologies", "Time Killers (v1.21)", MACHINE_SUPPORTS_SAVE ) +GAME( 1992, timekill121a, timekill, timekill, timekill, itech32_state, init_timekill, ROT0, "Strata/Incredible Technologies", "Time Killers (v1.21, alternate ROM board)", MACHINE_SUPPORTS_SAVE ) +GAME( 1993, hardyard, 0, bloodstm, hardyard, itech32_state, init_hardyard, ROT0, "Strata/Incredible Technologies", "Hard Yardage (v1.20)", MACHINE_SUPPORTS_SAVE ) +GAME( 1993, hardyard11, hardyard, bloodstm, hardyard, itech32_state, init_hardyard, ROT0, "Strata/Incredible Technologies", "Hard Yardage (v1.10)", MACHINE_SUPPORTS_SAVE ) +GAME( 1993, hardyard10, hardyard, bloodstm, hardyard, itech32_state, init_hardyard, ROT0, "Strata/Incredible Technologies", "Hard Yardage (v1.00)", MACHINE_SUPPORTS_SAVE ) +GAME( 1994, bloodstm, 0, bloodstm, bloodstm, itech32_state, init_bloodstm, ROT0, "Strata/Incredible Technologies", "Blood Storm (v2.22)", MACHINE_SUPPORTS_SAVE ) +GAME( 1994, bloodstm22, bloodstm, bloodstm, bloodstm, itech32_state, init_bloodstm, ROT0, "Strata/Incredible Technologies", "Blood Storm (v2.20)", MACHINE_SUPPORTS_SAVE ) +GAME( 1994, bloodstm21, bloodstm, bloodstm, bloodstm, itech32_state, init_bloodstm, ROT0, "Strata/Incredible Technologies", "Blood Storm (v2.10)", MACHINE_SUPPORTS_SAVE ) +GAME( 1994, bloodstm11, bloodstm, bloodstm, bloodstm, itech32_state, init_bloodstm, ROT0, "Strata/Incredible Technologies", "Blood Storm (v1.10)", MACHINE_SUPPORTS_SAVE ) +GAME( 1994, bloodstm10, bloodstm, bloodstm, bloodstm, itech32_state, init_bloodstm, ROT0, "Strata/Incredible Technologies", "Blood Storm (v1.04)", MACHINE_SUPPORTS_SAVE ) +GAME( 1994, pairsred, 0, bloodstm, pairs, itech32_state, init_bloodstm, ROT0, "Strata/Incredible Technologies", "Pairs Redemption (V1.0, 10/25/94)", MACHINE_SUPPORTS_SAVE ) +GAME( 1994, pairs, 0, bloodstm, pairs, itech32_state, init_bloodstm, ROT0, "Strata/Incredible Technologies", "Pairs (V1.2, 09/30/94)", MACHINE_SUPPORTS_SAVE ) +GAME( 1994, pairsa, pairs, bloodstm, pairs, itech32_state, init_bloodstm, ROT0, "Strata/Incredible Technologies", "Pairs (V1, 09/07/94)", MACHINE_SUPPORTS_SAVE ) +GAME( 1994, hotmemry, pairs, bloodstm, pairs, itech32_state, init_bloodstm, ROT0, "Incredible Technologies (Tuning license)", "Hot Memory (V1.2, Germany, 12/28/94)", MACHINE_SUPPORTS_SAVE ) +GAME( 1994, hotmemry11, pairs, bloodstm, pairs, itech32_state, init_bloodstm, ROT0, "Incredible Technologies (Tuning license)", "Hot Memory (V1.1, Germany, 11/30/94)", MACHINE_SUPPORTS_SAVE ) +GAME( 1994, drivedge, 0, drivedge, drivedge, drivedge_state, empty_init, ROT0, "Strata/Incredible Technologies", "Driver's Edge (v1.6)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) +GAME( 1995, wcbowl, 0, sftm, wcbowln, itech32_state, init_wcbowln, ROT0, "Incredible Technologies", "World Class Bowling (v1.66)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITBWL-3 */ +GAME( 1995, wcbowl165, wcbowl, sftm, wcbowlo, itech32_state, init_wcbowln, ROT0, "Incredible Technologies", "World Class Bowling (v1.65)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITBWL-3 */ +GAME( 1995, wcbowl161, wcbowl, sftm, wcbowlo, itech32_state, init_wcbowln, ROT0, "Incredible Technologies", "World Class Bowling (v1.61)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITBWL-3 */ +GAME( 1995, wcbowl16, wcbowl, sftm, wcbowlo, itech32_state, init_wcbowln, ROT0, "Incredible Technologies", "World Class Bowling (v1.6)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITBWL-3 */ +GAME( 1995, wcbowl15, wcbowl, bloodstm, wcbowl, itech32_state, init_wcbowl, ROT0, "Incredible Technologies", "World Class Bowling (v1.5)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITBWL-1 */ +GAME( 1995, wcbowl14, wcbowl, bloodstm, wcbowl, itech32_state, init_wcbowl, ROT0, "Incredible Technologies", "World Class Bowling (v1.4)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITBWL-1 */ +GAME( 1995, wcbowl13, wcbowl, bloodstm, wcbowl, itech32_state, init_wcbowl, ROT0, "Incredible Technologies", "World Class Bowling (v1.3)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITBWL-1 */ +GAME( 1995, wcbowl13j, wcbowl, bloodstm, wcbowlj, itech32_state, init_wcbowlj, ROT0, "Incredible Technologies", "World Class Bowling (v1.3J, Japan)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITBWL-1 */ +GAME( 1995, wcbowl12, wcbowl, bloodstm, wcbowl, itech32_state, init_wcbowl, ROT0, "Incredible Technologies", "World Class Bowling (v1.2)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITBWL-1 */ +GAME( 1995, wcbowl11, wcbowl, bloodstm, wcbowl, itech32_state, init_wcbowl, ROT0, "Incredible Technologies", "World Class Bowling (v1.1)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITBWL-1 */ +GAME( 1995, wcbowl10, wcbowl, bloodstm, wcbowl, itech32_state, init_wcbowl, ROT0, "Incredible Technologies", "World Class Bowling (v1.0)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITBWL-1 */ +GAME( 1995, sftm, 0, sftm, sftm, itech32_state, init_sftm, ROT0, "Capcom / Incredible Technologies", "Street Fighter: The Movie (v1.12)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITSF-1 */ +GAME( 1995, sftm111, sftm, sftm, sftm, itech32_state, init_sftm110, ROT0, "Capcom / Incredible Technologies", "Street Fighter: The Movie (v1.11)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITSF-1 */ +GAME( 1995, sftm110, sftm, sftm, sftm, itech32_state, init_sftm110, ROT0, "Capcom / Incredible Technologies", "Street Fighter: The Movie (v1.10)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITSF-1 */ +GAME( 1995, sftmj, sftm, sftm, sftm, itech32_state, init_sftm, ROT0, "Capcom / Incredible Technologies", "Street Fighter: The Movie (v1.12N, Japan)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITSF-1 */ +GAME( 1997, shufshot, 0, sftm, shufshot, itech32_state, init_shufshot, ROT0, "Strata/Incredible Technologies", "Shuffleshot (v1.40)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITSHF-1 */ +GAME( 1997, shufshot139, shufshot, sftm, shufshot, itech32_state, init_shufshot, ROT0, "Strata/Incredible Technologies", "Shuffleshot (v1.39)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITSHF-1 */ +GAME( 1997, shufshot137, shufshot, sftm, shufshto, itech32_state, init_shufshot, ROT0, "Strata/Incredible Technologies", "Shuffleshot (v1.37)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITSHF-1 */ +GAME( 1997, wcbowl140, wcbowldx, tourny, wcbowldx, itech32_state, init_wcbowlt, ROT0, "Incredible Technologies", "World Class Bowling Tournament (v1.40)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITBWL-3 */ +GAME( 1999, wcbowldx, 0, sftm, wcbowldx, itech32_state, init_shufshot, ROT0, "Incredible Technologies", "World Class Bowling Deluxe (v2.00)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITBWL-4 */ /* The following naming conventions are used: diff --git a/src/mame/drivers/itech8.cpp b/src/mame/drivers/itech8.cpp index 7797eea896d..b36a38432ef 100644 --- a/src/mame/drivers/itech8.cpp +++ b/src/mame/drivers/itech8.cpp @@ -630,6 +630,13 @@ void itech8_state::machine_start() save_item(NAME(m_pia_portb_data)); } +void grmatch_state::machine_start() +{ + itech8_state::machine_start(); + + m_palette_timer = timer_alloc(TIMER_PALETTE); +} + void itech8_state::machine_reset() { device_type main_cpu_type = m_maincpu->type(); @@ -649,6 +656,11 @@ void itech8_state::machine_reset() } } +void grmatch_state::machine_reset() +{ + itech8_state::machine_reset(); + m_palette_timer->adjust(m_screen->time_until_pos(m_screen->vpos()+1)); +} void itech8_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) { @@ -1685,312 +1697,247 @@ WRITE_LINE_MEMBER(itech8_state::generate_tms34061_interrupt) /************* core pieces ******************/ -MACHINE_CONFIG_START(itech8_state::itech8_core_lo) - - /* basic machine hardware */ - MCFG_DEVICE_ADD("maincpu", MC6809, CLOCK_8MHz) - MCFG_DEVICE_PROGRAM_MAP(tmslo_map) - - MCFG_NVRAM_ADD_RANDOM_FILL("nvram") +void itech8_state::itech8_core_devices(machine_config &config) +{ + NVRAM(config, "nvram", nvram_device::DEFAULT_RANDOM); - MCFG_TICKET_DISPENSER_ADD("ticket", attotime::from_msec(200), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_LOW) + TICKET_DISPENSER(config, m_ticket, attotime::from_msec(200), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_LOW); - /* video hardware */ - MCFG_TLC34076_ADD("tlc34076", TLC34076_6_BIT) + TLC34076(config, m_tlc34076, tlc34076_device::TLC34076_6_BIT); - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_SIZE(512, 263) - MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, itech8_state, generate_nmi)) + SCREEN(config, m_screen, SCREEN_TYPE_RASTER); + m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK); + m_screen->set_refresh_hz(60); + m_screen->set_size(512, 263); + m_screen->screen_vblank().set(FUNC(itech8_state::generate_nmi)); - MCFG_DEVICE_ADD("tms34061", TMS34061, 0) - MCFG_TMS34061_ROWSHIFT(8) /* VRAM address is (row << rowshift) | col */ - MCFG_TMS34061_VRAM_SIZE(itech8_state::VRAM_SIZE) - MCFG_TMS34061_INTERRUPT_CB(WRITELINE(*this, itech8_state, generate_tms34061_interrupt)) /* interrupt gen callback */ + TMS34061(config, m_tms34061, 0); + m_tms34061->set_rowshift(8); /* VRAM address is (row << rowshift) | col */ + m_tms34061->set_vram_size(itech8_state::VRAM_SIZE); + m_tms34061->int_callback().set(FUNC(itech8_state::generate_tms34061_interrupt)); /* interrupt gen callback */ - /* sound hardware */ SPEAKER(config, "mono").front_center(); - /* via */ - MCFG_DEVICE_ADD("via6522_0", VIA6522, CLOCK_8MHz/4) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, itech8_state, pia_portb_out)) - MCFG_VIA6522_IRQ_HANDLER(INPUTLINE("soundcpu", M6809_FIRQ_LINE)) -MACHINE_CONFIG_END - - -MACHINE_CONFIG_START(itech8_state::itech8_core_hi) - itech8_core_lo(config); + via6522_device &via(VIA6522(config, "via6522_0", CLOCK_8MHz/4)); + via.writepb_handler().set(FUNC(itech8_state::pia_portb_out)); + via.irq_handler().set_inputline(m_soundcpu, M6809_FIRQ_LINE); +} - /* basic machine hardware */ - MCFG_DEVICE_MODIFY("maincpu") - MCFG_DEVICE_PROGRAM_MAP(tmshi_map) -MACHINE_CONFIG_END +void itech8_state::itech8_core_lo(machine_config &config) +{ + MC6809(config, m_maincpu, CLOCK_8MHz); + m_maincpu->set_addrmap(AS_PROGRAM, &itech8_state::tmslo_map); + itech8_core_devices(config); +} -MACHINE_CONFIG_START(itech8_state::itech8_sound_ym2203) +void itech8_state::itech8_core_hi(machine_config &config) +{ + itech8_core_lo(config); + m_maincpu->set_addrmap(AS_PROGRAM, &itech8_state::tmshi_map); +} +void itech8_state::itech8_sound_ym2203(machine_config &config) +{ /* basic machine hardware */ - MCFG_DEVICE_ADD("soundcpu", MC6809, CLOCK_8MHz) - MCFG_DEVICE_PROGRAM_MAP(sound2203_map) + MC6809(config, m_soundcpu, CLOCK_8MHz); + m_soundcpu->set_addrmap(AS_PROGRAM, &itech8_state::sound2203_map); /* sound hardware */ - MCFG_DEVICE_ADD("ymsnd", YM2203, CLOCK_8MHz/2) - MCFG_YM2203_IRQ_HANDLER(INPUTLINE("soundcpu", M6809_FIRQ_LINE)) - MCFG_AY8910_PORT_B_WRITE_CB(WRITE8(*this, itech8_state, ym2203_portb_out)) - MCFG_SOUND_ROUTE(0, "mono", 0.07) - MCFG_SOUND_ROUTE(1, "mono", 0.07) - MCFG_SOUND_ROUTE(2, "mono", 0.07) - MCFG_SOUND_ROUTE(3, "mono", 0.75) - - MCFG_DEVICE_ADD("oki", OKIM6295, CLOCK_8MHz/8, okim6295_device::PIN7_HIGH) // was /128, not /132, so unsure so pin 7 not verified - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.75) -MACHINE_CONFIG_END - - -MACHINE_CONFIG_START(itech8_state::itech8_sound_ym2608b) + ym2203_device &ymsnd(YM2203(config, "ymsnd", CLOCK_8MHz/2)); + ymsnd.irq_handler().set_inputline(m_soundcpu, M6809_FIRQ_LINE); + ymsnd.port_b_write_callback().set(FUNC(itech8_state::ym2203_portb_out)); + ymsnd.add_route(0, "mono", 0.07); + ymsnd.add_route(1, "mono", 0.07); + ymsnd.add_route(2, "mono", 0.07); + ymsnd.add_route(3, "mono", 0.75); + + okim6295_device &oki(OKIM6295(config, "oki", CLOCK_8MHz/8, okim6295_device::PIN7_HIGH)); // was /128, not /132, so unsure so pin 7 not verified + oki.add_route(ALL_OUTPUTS, "mono", 0.75); +} +void itech8_state::itech8_sound_ym2608b(machine_config &config) +{ /* basic machine hardware */ - MCFG_DEVICE_ADD("soundcpu", MC6809, CLOCK_8MHz) - MCFG_DEVICE_PROGRAM_MAP(sound2608b_map) + MC6809(config, m_soundcpu, CLOCK_8MHz); + m_soundcpu->set_addrmap(AS_PROGRAM, &itech8_state::sound2608b_map); /* sound hardware */ - MCFG_DEVICE_ADD("ymsnd", YM2608, CLOCK_8MHz) - MCFG_YM2608_IRQ_HANDLER(INPUTLINE("soundcpu", M6809_FIRQ_LINE)) - MCFG_AY8910_PORT_B_WRITE_CB(WRITE8(*this, itech8_state, ym2203_portb_out)) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.75) -MACHINE_CONFIG_END - - -MACHINE_CONFIG_START(itech8_state::itech8_sound_ym3812) + ym2608_device &ymsnd(YM2608(config, "ymsnd", CLOCK_8MHz)); + ymsnd.irq_handler().set_inputline(m_soundcpu, M6809_FIRQ_LINE); + ymsnd.port_b_write_callback().set(FUNC(itech8_state::ym2203_portb_out)); + ymsnd.add_route(ALL_OUTPUTS, "mono", 0.75); +} +void itech8_state::itech8_sound_ym3812(machine_config &config) +{ /* basic machine hardware */ - MCFG_DEVICE_ADD("soundcpu", MC6809, CLOCK_8MHz) - MCFG_DEVICE_PROGRAM_MAP(sound3812_map) + MC6809(config, m_soundcpu, CLOCK_8MHz); + m_soundcpu->set_addrmap(AS_PROGRAM, &itech8_state::sound3812_map); - MCFG_DEVICE_ADD("pia", PIA6821, 0) - MCFG_PIA_READPB_HANDLER(READLINE("ticket", ticket_dispenser_device, line_r)) - MCFG_PIA_WRITEPA_HANDLER(WRITE8(*this, itech8_state, pia_porta_out)) - MCFG_PIA_WRITEPB_HANDLER(WRITE8(*this, itech8_state, pia_portb_out)) + pia6821_device &pia(PIA6821(config, "pia", 0)); + pia.readpb_handler().set("ticket", FUNC(ticket_dispenser_device::line_r)); + pia.writepa_handler().set(FUNC(itech8_state::pia_porta_out)); + pia.writepb_handler().set(FUNC(itech8_state::pia_portb_out)); /* sound hardware */ - MCFG_DEVICE_ADD("ymsnd", YM3812, CLOCK_8MHz/2) - MCFG_YM3812_IRQ_HANDLER(INPUTLINE("soundcpu", M6809_FIRQ_LINE)) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.75) + ym3812_device &ymsnd(YM3812(config, "ymsnd", CLOCK_8MHz/2)); + ymsnd.irq_handler().set_inputline(m_soundcpu, M6809_FIRQ_LINE); + ymsnd.add_route(ALL_OUTPUTS, "mono", 0.75); - MCFG_DEVICE_ADD("oki", OKIM6295, CLOCK_8MHz/8, okim6295_device::PIN7_HIGH) // was /128, not /132, so unsure so pin 7 not verified - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.75) -MACHINE_CONFIG_END - - -MACHINE_CONFIG_START(itech8_state::itech8_sound_ym3812_external) + okim6295_device &oki(OKIM6295(config, "oki", CLOCK_8MHz/8, okim6295_device::PIN7_HIGH)); // was /128, not /132, so unsure so pin 7 not verified + oki.add_route(ALL_OUTPUTS, "mono", 0.75); +} +void itech8_state::itech8_sound_ym3812_external(machine_config &config) +{ /* basic machine hardware */ - MCFG_DEVICE_ADD("soundcpu", MC6809, CLOCK_8MHz) - MCFG_DEVICE_PROGRAM_MAP(sound3812_external_map) + MC6809(config, m_soundcpu, CLOCK_8MHz); + m_soundcpu->set_addrmap(AS_PROGRAM, &itech8_state::sound3812_external_map); /* sound hardware */ - MCFG_DEVICE_ADD("ymsnd", YM3812, CLOCK_8MHz/2) - MCFG_YM3812_IRQ_HANDLER(INPUTLINE("soundcpu", M6809_FIRQ_LINE)) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.75) + ym3812_device &ymsnd(YM3812(config, "ymsnd", CLOCK_8MHz/2)); + ymsnd.irq_handler().set_inputline(m_soundcpu, M6809_FIRQ_LINE); + ymsnd.add_route(ALL_OUTPUTS, "mono", 0.75); - MCFG_DEVICE_ADD("oki", OKIM6295, CLOCK_8MHz/8, okim6295_device::PIN7_HIGH) // was /128, not /132, so unsure so pin 7 not verified - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.75) -MACHINE_CONFIG_END + okim6295_device &oki(OKIM6295(config, "oki", CLOCK_8MHz/8, okim6295_device::PIN7_HIGH)); // was /128, not /132, so unsure so pin 7 not verified + oki.add_route(ALL_OUTPUTS, "mono", 0.75); +} /************* full drivers ******************/ -MACHINE_CONFIG_START(itech8_state::wfortune) +void itech8_state::wfortune(machine_config &config) +{ itech8_core_hi(config); - - /* basic machine hardware */ itech8_sound_ym2203(config); - /* video hardware */ - MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_VISIBLE_AREA(0, 255, 0, 239) - MCFG_SCREEN_UPDATE_DRIVER(itech8_state, screen_update_2layer) - - -MACHINE_CONFIG_END - + m_screen->set_visarea(0, 255, 0, 239); + m_screen->set_screen_update(FUNC(itech8_state::screen_update_2layer)); +} -MACHINE_CONFIG_START(itech8_state::grmatch) +void grmatch_state::grmatch(machine_config &config) +{ itech8_core_hi(config); - - /* basic machine hardware */ itech8_sound_ym2608b(config); - /* video hardware */ - MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_VISIBLE_AREA(0, 399, 0, 239) - MCFG_SCREEN_UPDATE_DRIVER(itech8_state, screen_update_grmatch) - - /* palette updater */ - MCFG_TIMER_DRIVER_ADD_SCANLINE("palette_timer", itech8_state, grmatch_palette_update, "screen", 0, 0) - -MACHINE_CONFIG_END - + m_screen->set_visarea(0, 399, 0, 239); + m_screen->set_screen_update(FUNC(grmatch_state::screen_update)); +} -MACHINE_CONFIG_START(itech8_state::stratab_hi) +void itech8_state::stratab_hi(machine_config &config) +{ itech8_core_hi(config); - - /* basic machine hardware */ itech8_sound_ym2203(config); - /* video hardware */ - MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_VISIBLE_AREA(0, 255, 0, 239) - MCFG_SCREEN_UPDATE_DRIVER(itech8_state, screen_update_2layer) - -MACHINE_CONFIG_END - + m_screen->set_visarea(0, 255, 0, 239); + m_screen->set_screen_update(FUNC(itech8_state::screen_update_2layer)); +} -MACHINE_CONFIG_START(itech8_state::stratab_lo) +void itech8_state::stratab_lo(machine_config &config) +{ itech8_core_lo(config); - - /* basic machine hardware */ itech8_sound_ym2203(config); - /* video hardware */ - MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_VISIBLE_AREA(0, 255, 0, 239) - MCFG_SCREEN_UPDATE_DRIVER(itech8_state, screen_update_2layer) -MACHINE_CONFIG_END - + m_screen->set_visarea(0, 255, 0, 239); + m_screen->set_screen_update(FUNC(itech8_state::screen_update_2layer)); +} -MACHINE_CONFIG_START(itech8_state::slikshot_hi) +void itech8_state::slikshot_hi(machine_config &config) +{ itech8_core_hi(config); - - /* basic machine hardware */ itech8_sound_ym2203(config); - MCFG_DEVICE_ADD("sub", Z80, CLOCK_8MHz/2) - MCFG_DEVICE_PROGRAM_MAP(slikz80_mem_map) - MCFG_DEVICE_IO_MAP(slikz80_io_map) - - /* video hardware */ - MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_VISIBLE_AREA(0, 255, 0, 239) - MCFG_SCREEN_UPDATE_DRIVER(itech8_state, screen_update_slikshot) - MCFG_VIDEO_START_OVERRIDE(itech8_state,slikshot) -MACHINE_CONFIG_END + Z80(config, m_subcpu, CLOCK_8MHz/2); + m_subcpu->set_addrmap(AS_PROGRAM, &itech8_state::slikz80_mem_map); + m_subcpu->set_addrmap(AS_IO, &itech8_state::slikz80_io_map); + m_screen->set_visarea(0, 255, 0, 239); + m_screen->set_screen_update(FUNC(itech8_state::screen_update_slikshot)); + MCFG_VIDEO_START_OVERRIDE(itech8_state, slikshot) +} -MACHINE_CONFIG_START(itech8_state::slikshot_lo) +void itech8_state::slikshot_lo(machine_config &config) +{ itech8_core_lo(config); - - /* basic machine hardware */ itech8_sound_ym2203(config); - MCFG_DEVICE_ADD("sub", Z80, CLOCK_8MHz/2) - MCFG_DEVICE_PROGRAM_MAP(slikz80_mem_map) - MCFG_DEVICE_IO_MAP(slikz80_io_map) - - /* video hardware */ - MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_VISIBLE_AREA(0, 255, 0, 239) - MCFG_SCREEN_UPDATE_DRIVER(itech8_state, screen_update_slikshot) - MCFG_VIDEO_START_OVERRIDE(itech8_state,slikshot) -MACHINE_CONFIG_END + Z80(config, m_subcpu, CLOCK_8MHz/2); + m_subcpu->set_addrmap(AS_PROGRAM, &itech8_state::slikz80_mem_map); + m_subcpu->set_addrmap(AS_IO, &itech8_state::slikz80_io_map); + m_screen->set_visarea(0, 255, 0, 239); + m_screen->set_screen_update(FUNC(itech8_state::screen_update_slikshot)); + MCFG_VIDEO_START_OVERRIDE(itech8_state, slikshot) +} -MACHINE_CONFIG_START(itech8_state::slikshot_lo_noz80) +void itech8_state::slikshot_lo_noz80(machine_config &config) +{ itech8_core_lo(config); - - /* basic machine hardware */ itech8_sound_ym2203(config); - /* video hardware */ - MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_VISIBLE_AREA(0, 255, 0, 239) - MCFG_SCREEN_UPDATE_DRIVER(itech8_state, screen_update_2page) -MACHINE_CONFIG_END - + m_screen->set_visarea(0, 255, 0, 239); + m_screen->set_screen_update(FUNC(itech8_state::screen_update_2page)); +} -MACHINE_CONFIG_START(itech8_state::sstrike) +void itech8_state::sstrike(machine_config &config) +{ slikshot_lo(config); - - /* basic machine hardware */ MCFG_MACHINE_START_OVERRIDE(itech8_state,sstrike) +} -MACHINE_CONFIG_END - - -MACHINE_CONFIG_START(itech8_state::hstennis_hi) +void itech8_state::hstennis_hi(machine_config &config) +{ itech8_core_hi(config); - - /* basic machine hardware */ itech8_sound_ym3812(config); - /* video hardware */ - MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_VISIBLE_AREA(0, 399, 0, 239) - MCFG_SCREEN_UPDATE_DRIVER(itech8_state, screen_update_2page_large) -MACHINE_CONFIG_END - + m_screen->set_visarea(0, 399, 0, 239); + m_screen->set_screen_update(FUNC(itech8_state::screen_update_2page_large)); +} -MACHINE_CONFIG_START(itech8_state::hstennis_lo) +void itech8_state::hstennis_lo(machine_config &config) +{ itech8_core_lo(config); - - /* basic machine hardware */ itech8_sound_ym3812(config); - /* video hardware */ - MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_VISIBLE_AREA(0, 399, 0, 239) - MCFG_SCREEN_UPDATE_DRIVER(itech8_state, screen_update_2page_large) -MACHINE_CONFIG_END - - -MACHINE_CONFIG_START(itech8_state::rimrockn) - itech8_core_hi(config); + m_screen->set_visarea(0, 399, 0, 239); + m_screen->set_screen_update(FUNC(itech8_state::screen_update_2page_large)); +} - /* basic machine hardware */ +void itech8_state::rimrockn(machine_config &config) +{ + itech8_core_devices(config); itech8_sound_ym3812_external(config); - MCFG_DEVICE_REPLACE("maincpu", HD6309, CLOCK_12MHz) - MCFG_DEVICE_PROGRAM_MAP(tmshi_map) + HD6309(config, m_maincpu, CLOCK_12MHz); + m_maincpu->set_addrmap(AS_PROGRAM, &itech8_state::tmshi_map); - /* video hardware */ - MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_VISIBLE_AREA(24, 375, 0, 239) - MCFG_SCREEN_UPDATE_DRIVER(itech8_state, screen_update_2page_large) -MACHINE_CONFIG_END - - -MACHINE_CONFIG_START(itech8_state::ninclown) - itech8_core_hi(config); + m_screen->set_visarea(24, 375, 0, 239); + m_screen->set_screen_update(FUNC(itech8_state::screen_update_2page_large)); +} - /* basic machine hardware */ +void itech8_state::ninclown(machine_config &config) +{ + itech8_core_devices(config); itech8_sound_ym3812_external(config); - MCFG_DEVICE_REPLACE("maincpu", M68000, CLOCK_12MHz) - MCFG_DEVICE_PROGRAM_MAP(ninclown_map) - - /* video hardware */ - MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_VISIBLE_AREA(64, 423, 0, 239) - MCFG_SCREEN_UPDATE_DRIVER(itech8_state, screen_update_2page_large) - MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, itech8_state, ninclown_irq)) -MACHINE_CONFIG_END + M68000(config, m_maincpu, CLOCK_12MHz); + m_maincpu->set_addrmap(AS_PROGRAM, &itech8_state::ninclown_map); + m_screen->set_visarea(64, 423, 0, 239); + m_screen->set_screen_update(FUNC(itech8_state::screen_update_2page_large)); + m_screen->screen_vblank().set(FUNC(itech8_state::ninclown_irq)); +} -MACHINE_CONFIG_START(itech8_state::gtg2) +void itech8_state::gtg2(machine_config &config) +{ itech8_core_lo(config); - - /* basic machine hardware */ itech8_sound_ym3812_external(config); + m_maincpu->set_addrmap(AS_PROGRAM, &itech8_state::gtg2_map); - MCFG_DEVICE_MODIFY("maincpu") - MCFG_DEVICE_PROGRAM_MAP(gtg2_map) - - /* video hardware */ - MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_VISIBLE_AREA(0, 255, 0, 239) - MCFG_SCREEN_UPDATE_DRIVER(itech8_state, screen_update_2layer) -MACHINE_CONFIG_END + m_screen->set_visarea(0, 255, 0, 239); + m_screen->set_screen_update(FUNC(itech8_state::screen_update_2layer)); +} @@ -2707,15 +2654,15 @@ ROM_END * *************************************/ -void itech8_state::init_grmatch() +void grmatch_state::driver_init() { - m_maincpu->space(AS_PROGRAM).install_write_handler(0x0160, 0x0160, write8_delegate(FUNC(itech8_state::grmatch_palette_w),this)); - m_maincpu->space(AS_PROGRAM).install_write_handler(0x0180, 0x0180, write8_delegate(FUNC(itech8_state::grmatch_xscroll_w),this)); + m_maincpu->space(AS_PROGRAM).install_write_handler(0x0160, 0x0160, write8_delegate(FUNC(grmatch_state::palette_w),this)); + m_maincpu->space(AS_PROGRAM).install_write_handler(0x0180, 0x0180, write8_delegate(FUNC(grmatch_state::xscroll_w),this)); m_maincpu->space(AS_PROGRAM).unmap_write(0x01e0, 0x01ff); - save_item(NAME(m_grmatch_palcontrol)); - save_item(NAME(m_grmatch_xscroll)); - save_item(NAME(m_grmatch_palette)); + save_item(NAME(m_palcontrol)); + save_item(NAME(m_xscroll)); + save_item(NAME(m_palette)); } @@ -2806,7 +2753,7 @@ GAME( 1989, wfortune, 0, wfortune, wfortune, itech8_state, emp GAME( 1989, wfortunea, wfortune, wfortune, wfortune, itech8_state, empty_init, ROT0, "GameTek", "Wheel Of Fortune (set 2)", 0 ) /* Grudge Match-style PCB */ -GAME( 1989, grmatch, 0, grmatch, grmatch, itech8_state, init_grmatch, ROT0, "Yankee Game Technology", "Grudge Match (Yankee Game Technology)", 0 ) +GAME( 1989, grmatch, 0, grmatch, grmatch, grmatch_state, empty_init, ROT0, "Yankee Game Technology", "Grudge Match (Yankee Game Technology)", 0 ) /* Strata Bowling-style PCB */ GAME( 1990, stratab, 0, stratab_hi, stratab, itech8_state, empty_init, ROT270, "Strata/Incredible Technologies", "Strata Bowling (V3)", 0 ) // still says V1 in service mode? diff --git a/src/mame/drivers/jr100.cpp b/src/mame/drivers/jr100.cpp index 89988173412..7cb360c5680 100644 --- a/src/mame/drivers/jr100.cpp +++ b/src/mame/drivers/jr100.cpp @@ -67,7 +67,7 @@ private: virtual void machine_reset() override; virtual void video_start() override; uint32_t screen_update_jr100(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - TIMER_DEVICE_CALLBACK_MEMBER(sound_tick); + TIMER_CALLBACK_MEMBER(sound_tick); DECLARE_READ8_MEMBER(jr100_via_read_b); DECLARE_WRITE8_MEMBER(jr100_via_write_a); DECLARE_WRITE8_MEMBER(jr100_via_write_b); @@ -92,10 +92,10 @@ private: required_ioport m_line6; required_ioport m_line7; required_ioport m_line8; - required_device<cpu_device> m_maincpu; -}; - + required_device<m6802_cpu_device> m_maincpu; + emu_timer *m_sound_timer; +}; WRITE8_MEMBER(jr100_state::jr100_via_w) @@ -130,7 +130,7 @@ WRITE8_MEMBER(jr100_state::jr100_via_w) m_beeper->set_clock(894886.25 / (double)(m_t1latch) / 2.0); } } - m_via->write(space,offset,data); + m_via->write(offset,data); } void jr100_state::jr100_mem(address_map &map) @@ -212,10 +212,14 @@ INPUT_PORTS_END void jr100_state::machine_start() { + if (!m_sound_timer) + m_sound_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(jr100_state::sound_tick), this)); } void jr100_state::machine_reset() { + attotime timer_period = attotime::from_hz(XTAL(14'318'181) / 16); + m_sound_timer->adjust(timer_period, 0, timer_period); } void jr100_state::video_start() @@ -303,7 +307,7 @@ WRITE_LINE_MEMBER(jr100_state::jr100_via_write_cb2) m_cassette->output(state ? -1.0 : +1.0); } -TIMER_DEVICE_CALLBACK_MEMBER(jr100_state::sound_tick) +TIMER_CALLBACK_MEMBER(jr100_state::sound_tick) { m_speaker->level_w(m_speaker_data); m_speaker_data = 0; @@ -371,45 +375,42 @@ QUICKLOAD_LOAD_MEMBER( jr100_state,jr100) return image_init_result::PASS; } -MACHINE_CONFIG_START(jr100_state::jr100) - +void jr100_state::jr100(machine_config &config) +{ /* basic machine hardware */ - MCFG_DEVICE_ADD("maincpu",M6802, XTAL(14'318'181) / 4) // clock devided internaly by 4 - MCFG_DEVICE_PROGRAM_MAP(jr100_mem) + M6802(config, m_maincpu, XTAL(14'318'181) / 4); // clock divided internally by 4 + m_maincpu->set_addrmap(AS_PROGRAM, &jr100_state::jr100_mem); /* video hardware */ - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */ - MCFG_SCREEN_SIZE(256, 192) /* border size not accurate */ - MCFG_SCREEN_VISIBLE_AREA(0, 256 - 1, 0, 192 - 1) - MCFG_SCREEN_UPDATE_DRIVER(jr100_state, screen_update_jr100) - MCFG_SCREEN_PALETTE("palette") - - MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_jr100) - MCFG_PALETTE_ADD_MONOCHROME("palette") - - MCFG_DEVICE_ADD("via", VIA6522, XTAL(14'318'181) / 16) - MCFG_VIA6522_READPB_HANDLER(READ8(*this, jr100_state,jr100_via_read_b)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, jr100_state,jr100_via_write_a)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, jr100_state,jr100_via_write_b)) - MCFG_VIA6522_CB2_HANDLER(WRITELINE(*this, jr100_state, jr100_via_write_cb2)) + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); + screen.set_refresh_hz(60); + screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */ + screen.set_size(256, 192); /* border size not accurate */ + screen.set_visarea(0, 256 - 1, 0, 192 - 1); + screen.set_screen_update(FUNC(jr100_state::screen_update_jr100)); + screen.set_palette("palette"); + + GFXDECODE(config, "gfxdecode", "palette", gfx_jr100); + PALETTE(config, "palette", 2).set_init("palette", FUNC(palette_device::palette_init_monochrome)); + + VIA6522(config, m_via, XTAL(14'318'181) / 16); + m_via->readpb_handler().set(FUNC(jr100_state::jr100_via_read_b)); + m_via->writepa_handler().set(FUNC(jr100_state::jr100_via_write_a)); + m_via->writepb_handler().set(FUNC(jr100_state::jr100_via_write_b)); + m_via->cb2_handler().set(FUNC(jr100_state::jr100_via_write_cb2)); SPEAKER(config, "mono").front_center(); WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "mono", 0.25); - SPEAKER_SOUND(config, "speaker").add_route(ALL_OUTPUTS, "mono", 1.00); - - MCFG_DEVICE_ADD("beeper", BEEP, 0) - MCFG_SOUND_ROUTE(ALL_OUTPUTS,"mono",0.50) + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 1.00); + BEEP(config, m_beeper, 0).add_route(ALL_OUTPUTS, "mono", 0.50); - MCFG_CASSETTE_ADD( "cassette" ) - MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_SPEAKER_ENABLED | CASSETTE_MOTOR_ENABLED) - - MCFG_TIMER_DRIVER_ADD_PERIODIC("sound_tick", jr100_state, sound_tick, attotime::from_hz(XTAL(14'318'181) / 16)) + CASSETTE(config, m_cassette, 0); + m_cassette->set_default_state((cassette_state)(CASSETTE_STOPPED | CASSETTE_SPEAKER_ENABLED | CASSETTE_MOTOR_ENABLED)); /* quickload */ - MCFG_QUICKLOAD_ADD("quickload", jr100_state, jr100, "prg", 2) -MACHINE_CONFIG_END + quickload_image_device &quickload(QUICKLOAD(config, "quickload", 0)); + quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(jr100_state, jr100), this), "prg", 2); +} /* ROM definition */ diff --git a/src/mame/drivers/jvh.cpp b/src/mame/drivers/jvh.cpp index 5dcfd10de99..9c7ec1a908c 100644 --- a/src/mame/drivers/jvh.cpp +++ b/src/mame/drivers/jvh.cpp @@ -21,8 +21,9 @@ public: m_maincpu(*this, "maincpu") { } - void jvh2(machine_config &config); + void common(machine_config &config); void jvh(machine_config &config); + void jvh2(machine_config &config); void init_jvh(); @@ -119,27 +120,30 @@ void jvh_state::init_jvh() { } -MACHINE_CONFIG_START(jvh_state::jvh) +void jvh_state::common(machine_config &config) +{ // CPU TMS9980A; no line connections - MCFG_TMS99xx_ADD("maincpu", TMS9980A, 1000000, jvh_map, escape_io) + TMS9980A(config, m_maincpu, 1000000); + m_maincpu->set_addrmap(AS_PROGRAM, &jvh_state::jvh_map); - MCFG_DEVICE_ADD("soundcpu", M6802, XTAL(4'000'000)) - MCFG_DEVICE_PROGRAM_MAP(jvh_sub_map) + m6802_cpu_device &soundcpu(M6802(config, "soundcpu", XTAL(4'000'000))); + soundcpu.set_addrmap(AS_PROGRAM, &jvh_state::jvh_sub_map); - MCFG_DEVICE_ADD("via", VIA6522, XTAL(4'000'000) / 4) // MC6802 E clock - MCFG_VIA6522_IRQ_HANDLER(INPUTLINE("soundcpu", M6802_IRQ_LINE)) -MACHINE_CONFIG_END - -MACHINE_CONFIG_START(jvh_state::jvh2) - // CPU TMS9980At; no line connections - MCFG_TMS99xx_ADD("maincpu", TMS9980A, 1000000, jvh_map, movmastr_io) + via6522_device &via(VIA6522(config, "via", XTAL(4'000'000) / 4)); // MC6802 E clock + via.irq_handler().set_inputline("soundcpu", M6802_IRQ_LINE); +} - MCFG_DEVICE_ADD("soundcpu", M6802, XTAL(4'000'000)) - MCFG_DEVICE_PROGRAM_MAP(jvh_sub_map) +void jvh_state::jvh(machine_config &config) +{ + common(config); + m_maincpu->set_addrmap(AS_IO, &jvh_state::escape_io); +} - MCFG_DEVICE_ADD("via", VIA6522, XTAL(4'000'000) / 4) - MCFG_VIA6522_IRQ_HANDLER(INPUTLINE("soundcpu", M6802_IRQ_LINE)) -MACHINE_CONFIG_END +void jvh_state::jvh2(machine_config &config) +{ + common(config); + m_maincpu->set_addrmap(AS_IO, &jvh_state::movmastr_io); +} diff --git a/src/mame/drivers/kron.cpp b/src/mame/drivers/kron.cpp index 1660034a8af..611e681bd2d 100644 --- a/src/mame/drivers/kron.cpp +++ b/src/mame/drivers/kron.cpp @@ -6,9 +6,9 @@ * * 27/10/2015 * - * I baught this hardware on Ebay to have something with a Z80 CPU to play with. + * I bought this hardware on Ebay to have something with a Z80 CPU to play with. * The hardware is a serial terminal controller with VGA output and a PC keyboard - * and was manufactured mid 90:ies by a company from Vinnitsa,Ukraine called KRON. + * and was manufactured mid 90s by a company from Vinnitsa, Ukraine called KRON. * There is a character generator with support for both western and cyrilic characters. * The PCB is also filled with chips with cyrrilic characters on but thanks to this * page I managed to translate most of them into western TTL logic names: @@ -192,7 +192,7 @@ void kron180_state::kron180_mem(address_map &map) * 0 1 1 0 x x x x - Reset KBD * 0 1 1 1 x x x x - DKA/DREQ0 Z180 = D0 * - * Now, in paralell there is alot of stuff going on in the upper I/O address lines + * Now, in parallel there is a lot of stuff going on in the upper I/O address lines * they are driving the character generator and some other signals * A19 - not available on the DIP64 package * A18 - multiplexed pin used as Tout pulsing the VT1 signal @@ -312,7 +312,7 @@ MACHINE_CONFIG_START(kron180_state::kron180) MCFG_SCREEN_REFRESH_RATE(50) MCFG_SCREEN_UPDATE_DRIVER(kron180_state, screen_update) MCFG_SCREEN_SIZE(80 * 10, 24 * 10) - MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 199) // TODO: This need to be fixed once the real chartable is used... + MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 199) // TODO: This need to be fixed once the real char table is used... MCFG_SCREEN_PALETTE("palette") MCFG_PALETTE_ADD_MONOCHROME("palette") diff --git a/src/mame/drivers/legionna.cpp b/src/mame/drivers/legionna.cpp index 195117ea3ce..63e319c3cb8 100644 --- a/src/mame/drivers/legionna.cpp +++ b/src/mame/drivers/legionna.cpp @@ -94,13 +94,13 @@ Preliminary COP MCU memory map /*****************************************************************************/ -READ8_MEMBER(legionna_state::denjinmk_sound_comms_r) +u8 legionna_state::denjinmk_sound_comms_r(offs_t offset) { // Routine at 5FDC spins indefinitely until the lowest bit becomes 1 if (offset == 10) // ($100714) return 1; - return m_seibu_sound->main_r(space, (offset >> 1) & 7); + return m_seibu_sound->main_r((offset >> 1) & 7); } void legionna_state::legionna_cop_map(address_map &map) @@ -189,12 +189,8 @@ void legionna_state::legionna_map(address_map &map) map(0x100600, 0x10064f).rw(m_crtc, FUNC(seibu_crtc_device::read), FUNC(seibu_crtc_device::write)); map(0x100680, 0x100681).nopw(); // irq ack? map(0x100700, 0x10071f).lrw8("seibu_sound_rw", - [this](address_space &space, offs_t offset, u8 mem_mask) { - return m_seibu_sound->main_r(space, offset >> 1, mem_mask); - }, - [this](address_space &space, offs_t offset, u8 data, u8 mem_mask) { - m_seibu_sound->main_w(space, offset >> 1, data, mem_mask); - }).umask16(0x00ff); + [this](offs_t offset) { return m_seibu_sound->main_r(offset >> 1); }, + [this](offs_t offset, u8 data) { m_seibu_sound->main_w(offset >> 1, data); }).umask16(0x00ff); map(0x100740, 0x100741).portr("DSW1"); map(0x100744, 0x100745).portr("PLAYERS12"); map(0x100748, 0x100749).portr("PLAYERS34"); @@ -223,12 +219,8 @@ void legionna_state::heatbrl_map(address_map &map) map(0x100748, 0x100749).portr("PLAYERS34"); map(0x10074c, 0x10074d).portr("SYSTEM"); map(0x1007c0, 0x1007df).lrw8("seibu_sound_rw", - [this](address_space &space, offs_t offset, u8 mem_mask) { - return m_seibu_sound->main_r(space, offset >> 1, mem_mask); - }, - [this](address_space &space, offs_t offset, u8 data, u8 mem_mask) { - m_seibu_sound->main_w(space, offset >> 1, data, mem_mask); - }).umask16(0x00ff); + [this](offs_t offset) { return m_seibu_sound->main_r(offset >> 1); }, + [this](offs_t offset, u8 data) { m_seibu_sound->main_w(offset >> 1, data); }).umask16(0x00ff); map(0x100800, 0x100fff).ram(); // .w(FUNC(legionna_state::legionna_background_w)).share("back_data"); map(0x101000, 0x1017ff).ram(); // .w(FUNC(legionna_state::legionna_foreground_w).share("fore_data"); map(0x101800, 0x101fff).ram(); // .w(FUNC(legionna_state::legionna_midground_w).share("mid_data"); @@ -247,12 +239,8 @@ void legionna_state::godzilla_map(address_map &map) map(0x100600, 0x10064f).rw(m_crtc, FUNC(seibu_crtc_device::read), FUNC(seibu_crtc_device::write)); map(0x100680, 0x100681).nopw(); // irq ack? map(0x100700, 0x10071f).lrw8("seibu_sound_rw", - [this](address_space &space, offs_t offset, u8 mem_mask) { - return m_seibu_sound->main_r(space, offset >> 1, mem_mask); - }, - [this](address_space &space, offs_t offset, u8 data, u8 mem_mask) { - m_seibu_sound->main_w(space, offset >> 1, data, mem_mask); - }).umask16(0x00ff); + [this](offs_t offset) { return m_seibu_sound->main_r(offset >> 1); }, + [this](offs_t offset, u8 data) { m_seibu_sound->main_w(offset >> 1, data); }).umask16(0x00ff); map(0x100740, 0x100741).portr("DSW1"); map(0x100744, 0x100745).portr("PLAYERS12"); map(0x100748, 0x100749).portr("PLAYERS34"); @@ -306,10 +294,7 @@ void legionna_state::denjinmk_map(address_map &map) map(0x100600, 0x10064f).rw(m_crtc, FUNC(seibu_crtc_device::read), FUNC(seibu_crtc_device::write)); map(0x100680, 0x100681).nopw(); // irq ack? map(0x100700, 0x10071f).r(FUNC(legionna_state::denjinmk_sound_comms_r)) - .lw8("seibu_sound_w", - [this](address_space &space, offs_t offset, u8 data, u8 mem_mask) { - m_seibu_sound->main_w(space, offset >> 1, data, mem_mask); - }).umask16(0x00ff); + .lw8("seibu_sound_w", [this](offs_t offset, u8 data) { m_seibu_sound->main_w(offset >> 1, data); }).umask16(0x00ff); map(0x100740, 0x100741).portr("DSW1"); map(0x100744, 0x100745).portr("PLAYERS12"); map(0x100748, 0x100749).portr("PLAYERS34"); @@ -337,12 +322,8 @@ void legionna_state::grainbow_map(address_map &map) map(0x100600, 0x10064f).rw(m_crtc, FUNC(seibu_crtc_device::read), FUNC(seibu_crtc_device::write)); map(0x100680, 0x100681).nopw(); // irq ack? map(0x100700, 0x10071f).lrw8("seibu_sound_rw", - [this](address_space &space, offs_t offset, u8 mem_mask) { - return m_seibu_sound->main_r(space, offset >> 1, mem_mask); - }, - [this](address_space &space, offs_t offset, u8 data, u8 mem_mask) { - m_seibu_sound->main_w(space, offset >> 1, data, mem_mask); - }).umask16(0x00ff); + [this](offs_t offset) { return m_seibu_sound->main_r(offset >> 1); }, + [this](offs_t offset, u8 data) { m_seibu_sound->main_w(offset >> 1, data); }).umask16(0x00ff); map(0x100740, 0x100741).portr("DSW1"); map(0x100744, 0x100745).portr("PLAYERS12"); map(0x100748, 0x100749).portr("PLAYERS34"); @@ -368,12 +349,8 @@ void legionna_state::cupsoc_map(address_map &map) map(0x100600, 0x10064f).rw(m_crtc, FUNC(seibu_crtc_device::read), FUNC(seibu_crtc_device::write)); map(0x100680, 0x100681).nopw(); // irq ack? map(0x100700, 0x10071f).lrw8("seibu_sound_rw", - [this](address_space &space, offs_t offset, u8 mem_mask) { - return m_seibu_sound->main_r(space, offset >> 1, mem_mask); - }, - [this](address_space &space, offs_t offset, u8 data, u8 mem_mask) { - m_seibu_sound->main_w(space, offset >> 1, data, mem_mask); - }).umask16(0x00ff); + [this](offs_t offset) { return m_seibu_sound->main_r(offset >> 1); }, + [this](offs_t offset, u8 data) { m_seibu_sound->main_w(offset >> 1, data); }).umask16(0x00ff); map(0x100740, 0x100741).portr("DSW1"); map(0x100744, 0x100745).portr("PLAYERS12"); map(0x100748, 0x100749).portr("PLAYERS34"); @@ -413,12 +390,8 @@ void legionna_state::cupsocs_map(address_map &map) map(0x10070c, 0x10070d).portr("SYSTEM"); map(0x10071c, 0x10071d).portr("DSW2"); map(0x100740, 0x10075f).lrw8("seibu_sound_rw", - [this](address_space &space, offs_t offset, u8 mem_mask) { - return m_seibu_sound->main_r(space, offset >> 1, mem_mask); - }, - [this](address_space &space, offs_t offset, u8 data, u8 mem_mask) { - m_seibu_sound->main_w(space, offset >> 1, data, mem_mask); - }).umask16(0x00ff); + [this](offs_t offset) { return m_seibu_sound->main_r(offset >> 1); }, + [this](offs_t offset, u8 data) { m_seibu_sound->main_w(offset >> 1, data); }).umask16(0x00ff); map(0x100800, 0x100fff).ram(); // .w(FUNC(legionna_state::legionna_background_w)).share("back_data"); map(0x101000, 0x1017ff).ram(); // .w(FUNC(legionna_state::legionna_foreground_w).share("fore_data"); map(0x101800, 0x101fff).ram(); // .w(FUNC(legionna_state::legionna_midground_w).share("mid_data"); diff --git a/src/mame/drivers/lisa.cpp b/src/mame/drivers/lisa.cpp index 8130793584c..62e4f28530a 100644 --- a/src/mame/drivers/lisa.cpp +++ b/src/mame/drivers/lisa.cpp @@ -12,7 +12,6 @@ #include "emu.h" #include "includes/lisa.h" -#include "cpu/m6502/m6504.h" #include "cpu/cop400/cop400.h" #include "formats/ap_dsk35.h" #include "screen.h" @@ -98,96 +97,95 @@ static const floppy_interface lisa_floppy_interface = ***************************************************************************/ /* Lisa1 and Lisa 2 machine */ -MACHINE_CONFIG_START(lisa_state::lisa) +void lisa_state::lisa(machine_config &config) +{ /* basic machine hardware */ - MCFG_DEVICE_ADD("maincpu", M68000, 5093760) /* 20.37504 MHz / 4 */ - MCFG_DEVICE_PROGRAM_MAP(lisa_map) - MCFG_DEVICE_VBLANK_INT_DRIVER(SCREEN_TAG, lisa_state, lisa_interrupt) + M68000(config, m_maincpu, 5093760); /* 20.37504 MHz / 4 */ + m_maincpu->set_addrmap(AS_PROGRAM, &lisa_state::lisa_map); + m_maincpu->set_vblank_int(SCREEN_TAG, FUNC(lisa_state::lisa_interrupt)); - MCFG_DEVICE_ADD(COP421_TAG, COP421, 3900000) - MCFG_COP400_CONFIG( COP400_CKI_DIVISOR_16, COP400_CKO_OSCILLATOR_OUTPUT, true ) + cop421_cpu_device &cop(COP421(config, COP421_TAG, 3900000)); + cop.set_config(COP400_CKI_DIVISOR_16, COP400_CKO_OSCILLATOR_OUTPUT, true); - MCFG_DEVICE_ADD(KB_COP421_TAG, COP421, 3900000) // ? - MCFG_COP400_CONFIG( COP400_CKI_DIVISOR_16, COP400_CKO_OSCILLATOR_OUTPUT, true ) + cop421_cpu_device &kbcop(COP421(config, KB_COP421_TAG, 3900000)); // ? + kbcop.set_config(COP400_CKI_DIVISOR_16, COP400_CKO_OSCILLATOR_OUTPUT, true); - MCFG_DEVICE_ADD("fdccpu", M6504, 2000000) /* 16.000 MHz / 8 in when DIS asserted, 16.000 MHz / 9 otherwise (?) */ - MCFG_DEVICE_PROGRAM_MAP(lisa_fdc_map) + M6504(config, m_fdc_cpu, 2000000); /* 16.000 MHz / 8 in when DIS asserted, 16.000 MHz / 9 otherwise (?) */ + m_fdc_cpu->set_addrmap(AS_PROGRAM, &lisa_state::lisa_fdc_map); - MCFG_QUANTUM_TIME(attotime::from_hz(60)) + config.m_minimum_quantum = attotime::from_hz(60); - MCFG_DEVICE_ADD("latch", LS259, 0) // U4E - MCFG_ADDRESSABLE_LATCH_Q0_OUT_CB(WRITELINE(*this, lisa_state, diag1_w)) - MCFG_ADDRESSABLE_LATCH_Q1_OUT_CB(WRITELINE(*this, lisa_state, diag2_w)) - MCFG_ADDRESSABLE_LATCH_Q2_OUT_CB(WRITELINE(*this, lisa_state, seg1_w)) - MCFG_ADDRESSABLE_LATCH_Q3_OUT_CB(WRITELINE(*this, lisa_state, seg2_w)) - MCFG_ADDRESSABLE_LATCH_Q4_OUT_CB(WRITELINE(*this, lisa_state, setup_w)) - MCFG_ADDRESSABLE_LATCH_Q5_OUT_CB(WRITELINE(*this, lisa_state, sfmsk_w)) - MCFG_ADDRESSABLE_LATCH_Q6_OUT_CB(WRITELINE(*this, lisa_state, vtmsk_w)) - MCFG_ADDRESSABLE_LATCH_Q7_OUT_CB(WRITELINE(*this, lisa_state, hdmsk_w)) + LS259(config, m_latch, 0); // U4E - MCFG_SCREEN_ADD(SCREEN_TAG, RASTER) - MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */ - MCFG_SCREEN_SIZE(880, 380) - MCFG_SCREEN_VISIBLE_AREA(0, 720-1, 0, 364-1) - MCFG_SCREEN_UPDATE_DRIVER(lisa_state, screen_update_lisa) - MCFG_SCREEN_PALETTE("palette") + m_latch->q_out_cb<0>().set(FUNC(lisa_state::diag1_w)); + m_latch->q_out_cb<1>().set(FUNC(lisa_state::diag2_w)); + m_latch->q_out_cb<2>().set(FUNC(lisa_state::seg1_w)); + m_latch->q_out_cb<3>().set(FUNC(lisa_state::seg2_w)); + m_latch->q_out_cb<4>().set(FUNC(lisa_state::setup_w)); + m_latch->q_out_cb<5>().set(FUNC(lisa_state::sfmsk_w)); + m_latch->q_out_cb<6>().set(FUNC(lisa_state::vtmsk_w)); + m_latch->q_out_cb<7>().set(FUNC(lisa_state::hdmsk_w)); - MCFG_PALETTE_ADD_MONOCHROME("palette") + SCREEN(config, m_screen, SCREEN_TYPE_RASTER); + m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK); + m_screen->set_refresh_hz(60); + m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */ + m_screen->set_size(880, 380); + m_screen->set_visarea(0, 720-1, 0, 364-1); + m_screen->set_screen_update(FUNC(lisa_state::screen_update_lisa)); + m_screen->set_palette("palette"); + PALETTE(config, m_palette, 2); + m_palette->set_init("palette", FUNC(palette_device::palette_init_monochrome)); /* sound hardware */ SPEAKER(config, "mono").front_center(); - MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00) + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 1.00); /* nvram */ - MCFG_NVRAM_ADD_CUSTOM_DRIVER("nvram", lisa_state, nvram_init) + NVRAM(config, m_nvram); + m_nvram->set_custom_handler(FUNC(lisa_state::nvram_init)); /* devices */ - MCFG_IWM_ADD("fdc", lisa2_fdc_interface) - MCFG_LEGACY_FLOPPY_SONY_2_DRIVES_ADD(lisa_floppy_interface) + IWM(config, m_fdc, &lisa2_fdc_interface); + sonydriv_floppy_image_device::legacy_2_drives_add(config, &lisa_floppy_interface); /* software lists */ - MCFG_SOFTWARE_LIST_ADD("disk_list","lisa") + SOFTWARE_LIST(config, "disk_list").set_type("lisa", SOFTWARE_LIST_ORIGINAL_SYSTEM); /* via */ - MCFG_DEVICE_ADD("via6522_0", VIA6522, 500000) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, lisa_state, COPS_via_out_a)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, lisa_state, COPS_via_out_b)) - MCFG_VIA6522_CA2_HANDLER(WRITELINE(*this, lisa_state, COPS_via_out_ca2)) - MCFG_VIA6522_CB2_HANDLER(WRITELINE(*this, lisa_state, COPS_via_out_cb2)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, lisa_state, COPS_via_irq_func)) - - MCFG_DEVICE_ADD("via6522_1", VIA6522, 500000) + VIA6522(config, m_via0, 500000); + m_via0->writepa_handler().set(FUNC(lisa_state::COPS_via_out_a)); + m_via0->writepb_handler().set(FUNC(lisa_state::COPS_via_out_b)); + m_via0->ca2_handler().set(FUNC(lisa_state::COPS_via_out_ca2)); + m_via0->cb2_handler().set(FUNC(lisa_state::COPS_via_out_cb2)); + m_via0->irq_handler().set(FUNC(lisa_state::COPS_via_irq_func)); - MCFG_DEVICE_ADD("scc", SCC8530, 7833600) -MACHINE_CONFIG_END + VIA6522(config, m_via1, 500000); + SCC8530(config, m_scc, 7833600); +} -MACHINE_CONFIG_START(lisa_state::lisa210) +void lisa_state::lisa210(machine_config &config) +{ lisa(config); - MCFG_DEVICE_MODIFY( "fdccpu" ) - MCFG_DEVICE_PROGRAM_MAP(lisa210_fdc_map) + m_fdc_cpu->set_addrmap(AS_PROGRAM, &lisa_state::lisa210_fdc_map); /* Lisa 2/10 and MacXL had a slightly different FDC interface */ - MCFG_IWM_MODIFY("fdc", lisa210_fdc_interface) + m_fdc->set_config(&lisa210_fdc_interface); /* via */ - MCFG_DEVICE_MODIFY("via6522_0") - MCFG_DEVICE_CLOCK(1250000) - MCFG_DEVICE_MODIFY("via6522_1") - MCFG_DEVICE_CLOCK(1250000) -MACHINE_CONFIG_END - + m_via0->set_clock(1250000); + m_via1->set_clock(1250000); +} -MACHINE_CONFIG_START(lisa_state::macxl) +void lisa_state::macxl(machine_config &config) +{ lisa210(config); - MCFG_SCREEN_MODIFY(SCREEN_TAG) - MCFG_SCREEN_SIZE( 768/* ???? */, 447/* ???? */) - MCFG_SCREEN_VISIBLE_AREA(0, 608-1, 0, 431-1) -MACHINE_CONFIG_END + m_screen->set_size( 768/* ???? */, 447/* ???? */); + m_screen->set_visarea(0, 608-1, 0, 431-1); +} /* 2008-05 FP: Small note about natural keyboard support: currently, diff --git a/src/mame/drivers/lwriter.cpp b/src/mame/drivers/lwriter.cpp index bfc357ae6ca..551c4f8a89e 100644 --- a/src/mame/drivers/lwriter.cpp +++ b/src/mame/drivers/lwriter.cpp @@ -355,46 +355,47 @@ WRITE_LINE_MEMBER(lwriter_state::scc_int) #define CPU_CLK (22.321_MHz_XTAL / 2) // Based on pictures form here: http://picclick.co.uk/Apple-Postscript-LaserWriter-IINT-Printer-640-4105-M6009-Mainboard-282160713108.html#&gid=1&pid=7 #define RXC_CLK ((CPU_CLK.value() - (87 * 16 * 70)) / 3) // Tuned to get 9600 baud according to manual, needs rework based on real hardware -MACHINE_CONFIG_START(lwriter_state::lwriter) - MCFG_DEVICE_ADD("maincpu", M68000, CPU_CLK) - MCFG_DEVICE_PROGRAM_MAP(maincpu_map) +void lwriter_state::lwriter(machine_config &config) +{ + M68000(config, m_maincpu, CPU_CLK); + m_maincpu->set_addrmap(AS_PROGRAM, &lwriter_state::maincpu_map); - MCFG_DEVICE_ADD("scc", SCC8530N, CPU_CLK) - MCFG_Z80SCC_OFFSETS(RXC_CLK, 0, RXC_CLK, 0) + SCC8530N(config, m_scc, CPU_CLK); + m_scc->configure_channels(RXC_CLK, 0, RXC_CLK, 0); /* Port A */ - MCFG_Z80SCC_OUT_TXDA_CB(WRITELINE("rs232a", rs232_port_device, write_txd)) - MCFG_Z80SCC_OUT_DTRA_CB(WRITELINE("rs232a", rs232_port_device, write_dtr)) - MCFG_Z80SCC_OUT_RTSA_CB(WRITELINE("rs232a", rs232_port_device, write_rts)) + m_scc->out_txda_callback().set("rs232a", FUNC(rs232_port_device::write_txd)); + m_scc->out_dtra_callback().set("rs232a", FUNC(rs232_port_device::write_dtr)); + m_scc->out_rtsa_callback().set("rs232a", FUNC(rs232_port_device::write_rts)); /* Port B */ - MCFG_Z80SCC_OUT_TXDB_CB(WRITELINE("rs232b", rs232_port_device, write_txd)) - MCFG_Z80SCC_OUT_DTRB_CB(WRITELINE("rs232b", rs232_port_device, write_dtr)) - MCFG_Z80SCC_OUT_RTSB_CB(WRITELINE("rs232b", rs232_port_device, write_rts)) + m_scc->out_txdb_callback().set("rs232b", FUNC(rs232_port_device::write_txd)); + m_scc->out_dtrb_callback().set("rs232b", FUNC(rs232_port_device::write_dtr)); + m_scc->out_rtsb_callback().set("rs232b", FUNC(rs232_port_device::write_rts)); /* Interrupt */ - MCFG_Z80SCC_OUT_INT_CB(WRITELINE("via", via6522_device, write_ca1)) - //MCFG_Z80SCC_OUT_INT_CB(WRITELINE(*this, lwriter_state, scc_int)) + m_scc->out_int_callback().set("via", FUNC(via6522_device::write_ca1)); + //m_scc->out_int_callback().set(FUNC(lwriter_state::scc_int)); - MCFG_DEVICE_ADD("rs232a", RS232_PORT, default_rs232_devices, "terminal") - MCFG_RS232_RXD_HANDLER(WRITELINE("scc", scc8530_device, rxa_w)) - MCFG_RS232_CTS_HANDLER(WRITELINE("scc", scc8530_device, ctsa_w)) + rs232_port_device &rs232a(RS232_PORT(config, "rs232a", default_rs232_devices, "terminal")); + rs232a.rxd_handler().set("scc", FUNC(scc8530_device::rxa_w)); + rs232a.cts_handler().set("scc", FUNC(scc8530_device::ctsa_w)); - MCFG_DEVICE_ADD("rs232b", RS232_PORT, default_rs232_devices, "terminal") - MCFG_RS232_RXD_HANDLER(WRITELINE("scc", scc8530_device, rxb_w)) - MCFG_RS232_CTS_HANDLER(WRITELINE("scc", scc8530_device, ctsb_w)) + rs232_port_device &rs232b(RS232_PORT(config, "rs232b", default_rs232_devices, "terminal")); + rs232b.rxd_handler().set("scc", FUNC(scc8530_device::rxb_w)); + rs232b.cts_handler().set("scc", FUNC(scc8530_device::ctsb_w)); #if TPI - MCFG_DEVICE_ADD("tpi", TPI6525, 0) + TPI6525(config, "tpi", 0); #else - MCFG_DEVICE_ADD("via", VIA6522, CPU_CLK/10) // 68000 E clock presumed - MCFG_VIA6522_READPA_HANDLER(READ8(*this, lwriter_state, via_pa_r)) - MCFG_VIA6522_READPB_HANDLER(READ8(*this, lwriter_state, via_pb_r)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, lwriter_state, via_pa_w)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, lwriter_state, via_pb_w)) - MCFG_VIA6522_CB1_HANDLER(WRITELINE(*this, lwriter_state, via_cb1_w)) - MCFG_VIA6522_CA2_HANDLER(WRITELINE(*this, lwriter_state, via_ca2_w)) - MCFG_VIA6522_CB2_HANDLER(WRITELINE(*this, lwriter_state, via_cb2_w)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, lwriter_state, via_int_w)) + VIA6522(config, m_via, CPU_CLK/10); // 68000 E clock presumed + m_via->readpa_handler().set(FUNC(lwriter_state::via_pa_r)); + m_via->readpb_handler().set(FUNC(lwriter_state::via_pb_r)); + m_via->writepa_handler().set(FUNC(lwriter_state::via_pa_w)); + m_via->writepb_handler().set(FUNC(lwriter_state::via_pb_w)); + m_via->cb1_handler().set(FUNC(lwriter_state::via_cb1_w)); + m_via->ca2_handler().set(FUNC(lwriter_state::via_ca2_w)); + m_via->cb2_handler().set(FUNC(lwriter_state::via_cb2_w)); + m_via->irq_handler().set(FUNC(lwriter_state::via_int_w)); #endif -MACHINE_CONFIG_END +} /* SCC init sequence * :scc B Reg 09 <- c0 - Master Interrupt Control - Device reset diff --git a/src/mame/drivers/m72.cpp b/src/mame/drivers/m72.cpp index 855ccdacf92..a7703df3c44 100644 --- a/src/mame/drivers/m72.cpp +++ b/src/mame/drivers/m72.cpp @@ -226,7 +226,7 @@ TIMER_CALLBACK_MEMBER(m72_state::synch_callback) void m72_state::machine_reset() { m_mcu_sample_addr = 0; - m_mcu_snd_cmd_latch = 0; + //m_mcu_snd_cmd_latch = 0; m_scanline_timer->adjust(m_screen->time_until_pos(0)); machine().scheduler().synchronize(timer_expired_delegate(FUNC(m72_state::synch_callback),this)); @@ -306,76 +306,45 @@ The protection device does TIMER_CALLBACK_MEMBER(m72_state::delayed_ram16_w) { - uint16_t val = ((uint32_t) param) & 0xffff; - uint16_t offset = (((uint32_t) param) >> 16) & 0xffff; - uint16_t *ram = (uint16_t *)ptr; + uint16_t val = param & 0xffff; + uint16_t offset = (param >> 16) & 0x07ff; + uint16_t mem_mask = (BIT(param, 28) ? 0xff00 : 0x0000) | (BIT(param, 27) ? 0x00ff : 0x0000); - ram[offset] = val; + logerror("MB8421/MB8431 left_w(0x%03x, 0x%04x, 0x%04x)\n", offset, val, mem_mask); + m_dpram->left_w(machine().dummy_space(), offset, val, mem_mask); } - -WRITE16_MEMBER(m72_state::main_mcu_sound_w) +TIMER_CALLBACK_MEMBER(m72_state::delayed_ram8_w) { - if (data & 0xfff0) - logerror("sound_w: %04x %04x\n", mem_mask, data); + uint8_t val = param & 0xff; + uint16_t offset = (param >> 9) & 0x07ff; - if (ACCESSING_BITS_0_7) - { - m_mcu_snd_cmd_latch = data; - m_mcu->set_input_line(1, ASSERT_LINE); - } + if (BIT(param, 8)) + m_dpram->right_w(machine().dummy_space(), offset, val << 8, 0xff00); + else + m_dpram->right_w(machine().dummy_space(), offset, val, 0x00ff); } + WRITE16_MEMBER(m72_state::main_mcu_w) { - uint16_t val = m_protection_ram[offset]; - - COMBINE_DATA(&val); - - /* 0x07fe is used for synchronization as well. - * This address however will not trigger an interrupt - */ - - if (offset == 0x0fff/2 && ACCESSING_BITS_8_15) - { - m_protection_ram[offset] = val; - m_mcu->set_input_line(0, ASSERT_LINE); - /* Line driven, most likely by write line */ - //machine().scheduler().timer_set(m_mcu->cycles_to_attotime(2), FUNC(mcu_irq0_clear)); - //machine().scheduler().timer_set(m_mcu->cycles_to_attotime(0), FUNC(mcu_irq0_raise)); - } - else - machine().scheduler().synchronize( timer_expired_delegate(FUNC(m72_state::delayed_ram16_w),this), (offset<<16) | val, m_protection_ram.get()); + machine().scheduler().synchronize(timer_expired_delegate(FUNC(m72_state::delayed_ram16_w), this), offset << 16 | data | (mem_mask & 0x0180) << 20); } WRITE8_MEMBER(m72_state::mcu_data_w) { - uint16_t val; - if (offset&1) val = (m_protection_ram[offset/2] & 0x00ff) | (data << 8); - else val = (m_protection_ram[offset/2] & 0xff00) | (data&0xff); - - machine().scheduler().synchronize( timer_expired_delegate(FUNC(m72_state::delayed_ram16_w),this), ((offset >>1 ) << 16) | val, m_protection_ram.get()); + machine().scheduler().synchronize(timer_expired_delegate(FUNC(m72_state::delayed_ram8_w), this), offset << 8 | uint32_t(data)); } READ8_MEMBER(m72_state::mcu_data_r) { - uint8_t ret; - - if (offset == 0x0fff || offset == 0x0ffe) - { - m_mcu->set_input_line(0, CLEAR_LINE); - } - - if (offset&1) ret = (m_protection_ram[offset/2] & 0xff00)>>8; - else ret = (m_protection_ram[offset/2] & 0x00ff); - - return ret; + return (m_dpram->right_r(space, offset >> 1) >> (BIT(offset, 0) ? 8 : 0)) & 0xff; } INTERRUPT_GEN_MEMBER(m72_state::mcu_int) { //m_mcu_snd_cmd_latch |= 0x11; /* 0x10 is special as well - FIXME */ - m_mcu_snd_cmd_latch = 0x11;// | (machine().rand() & 1); /* 0x10 is special as well - FIXME */ + //m_mcu_snd_cmd_latch = 0x11;// | (machine().rand() & 1); /* 0x10 is special as well - FIXME */ device.execute().set_input_line(1, ASSERT_LINE); } @@ -386,17 +355,6 @@ READ8_MEMBER(m72_state::mcu_sample_r) return sample; } -WRITE8_MEMBER(m72_state::mcu_ack_w) -{ - m_mcu->set_input_line(1, CLEAR_LINE); - m_mcu_snd_cmd_latch = 0; -} - -READ8_MEMBER(m72_state::mcu_snd_r) -{ - return m_mcu_snd_cmd_latch; -} - WRITE8_MEMBER(m72_state::mcu_port1_w) { m_mcu_sample_latch = data; @@ -427,24 +385,11 @@ READ8_MEMBER(m72_state::snd_cpu_sample_r) void m72_state::init_m72_8751() { - address_space &program = m_maincpu->space(AS_PROGRAM); - address_space &io = m_maincpu->space(AS_IO); - address_space &sndio = m_soundcpu->space(AS_IO); - - m_protection_ram = std::make_unique<uint16_t[]>(0x10000/2); - program.install_read_bank(0xb0000, 0xbffff, "bank1"); - program.install_write_handler(0xb0000, 0xb0fff, write16_delegate(FUNC(m72_state::main_mcu_w),this)); - membank("bank1")->configure_entry(0, m_protection_ram.get()); - - save_pointer(NAME(m_protection_ram), 0x10000/2); save_item(NAME(m_mcu_sample_latch)); save_item(NAME(m_mcu_sample_addr)); - save_item(NAME(m_mcu_snd_cmd_latch)); - - //io.install_write_handler(0xc0, 0xc1, write16_delegate(FUNC(m72_state::loht_sample_trigger_w),this)); - io.install_write_handler(0xc0, 0xc1, write16_delegate(FUNC(m72_state::main_mcu_sound_w),this)); /* sound cpu */ + address_space &sndio = m_soundcpu->space(AS_IO); sndio.install_write_handler(0x82, 0x82, write8_delegate(FUNC(dac_byte_interface::data_w),(dac_byte_interface *)m_dac)); sndio.install_read_handler (0x84, 0x84, read8_delegate(FUNC(m72_state::snd_cpu_sample_r),this)); @@ -883,11 +828,18 @@ void m72_state::rtype_map(address_map &map) map(0x40000, 0x43fff).ram(); /* work RAM */ } +void m72_state::m72_protected_map(address_map &map) +{ + m72_map(map); + map(0xb0000, 0xb0fff).r(m_dpram, FUNC(mb8421_mb8431_16_device::left_r)).w(FUNC(m72_state::main_mcu_w)); +} + void m72_state::xmultiplm72_map(address_map &map) { m72_cpu1_common_map(map); map(0x00000, 0x7ffff).rom(); map(0x80000, 0x83fff).ram(); /* work RAM */ + map(0xb0000, 0xb0fff).r(m_dpram, FUNC(mb8421_mb8431_16_device::left_r)).w(FUNC(m72_state::main_mcu_w)); } void m72_state::dbreedm72_map(address_map &map) @@ -1004,6 +956,12 @@ void m72_state::m72_portmap(address_map &map) /* { 0xc0, 0xc0 trigger sample, filled by init_ function */ } +void m72_state::m72_protected_portmap(address_map &map) +{ + m72_portmap(map); + map(0xc0, 0xc0).w("mculatch", FUNC(generic_latch_8_device::write)); +} + void m72_state::m84_portmap(address_map &map) { map(0x00, 0x01).portr("IN0"); @@ -1138,7 +1096,7 @@ void m72_state::mcu_io_map(address_map &map) /* External access */ map(0x0000, 0x0000).rw(FUNC(m72_state::mcu_sample_r), FUNC(m72_state::mcu_low_w)); map(0x0001, 0x0001).w(FUNC(m72_state::mcu_high_w)); - map(0x0002, 0x0002).rw(FUNC(m72_state::mcu_snd_r), FUNC(m72_state::mcu_ack_w)); + map(0x0002, 0x0002).rw("mculatch", FUNC(generic_latch_8_device::read), FUNC(generic_latch_8_device::acknowledge_w)); /* shared at b0000 - b0fff on the main cpu */ map(0xc000, 0xcfff).rw(FUNC(m72_state::mcu_data_r), FUNC(m72_state::mcu_data_w)); } @@ -1915,12 +1873,23 @@ MACHINE_CONFIG_END MACHINE_CONFIG_START(m72_state::m72_8751) m72_base(config); + MCFG_DEVICE_MODIFY("maincpu") + MCFG_DEVICE_PROGRAM_MAP(m72_protected_map) + MCFG_DEVICE_IO_MAP(m72_protected_portmap) + + MB8421_MB8431_16BIT(config, m_dpram); + //m_dpram->intl_callback().set("upd71059c", FUNC(pic8259_device::ir3_w)); // not actually used? + m_dpram->intr_callback().set_inputline("mcu", MCS51_INT0_LINE); + + MCFG_GENERIC_LATCH_8_ADD("mculatch") + MCFG_GENERIC_LATCH_DATA_PENDING_CB(INPUTLINE("mcu", MCS51_INT1_LINE)) + MCFG_GENERIC_LATCH_SEPARATE_ACKNOWLEDGE(true) - MCFG_DEVICE_ADD("mcu",I8751, XTAL(8'000'000)) /* Uses its own XTAL */ + MCFG_DEVICE_ADD("mcu", I8751, XTAL(8'000'000)) /* Uses its own XTAL */ MCFG_DEVICE_IO_MAP(mcu_io_map) MCFG_MCS51_PORT_P1_OUT_CB(WRITE8(*this, m72_state, mcu_port1_w)) MCFG_MCS51_PORT_P3_OUT_CB(WRITE8(*this, m72_state, mcu_port3_w)) - MCFG_DEVICE_VBLANK_INT_DRIVER("screen", m72_state, mcu_int) + //MCFG_DEVICE_VBLANK_INT_DRIVER("screen", m72_state, mcu_int) MACHINE_CONFIG_END diff --git a/src/mame/drivers/mac.cpp b/src/mame/drivers/mac.cpp index 40721c34360..18f9a8b7996 100644 --- a/src/mame/drivers/mac.cpp +++ b/src/mame/drivers/mac.cpp @@ -569,27 +569,6 @@ WRITE8_MEMBER(mac_state::mac_5396_w) } } -#define MAC_MAIN_SND_BUF_OFFSET 0x0300 -#define MAC_ALT_SND_BUF_OFFSET 0x5F00 - -TIMER_DEVICE_CALLBACK_MEMBER(mac_state::mac_scanline) -{ - int scanline = param; - uint16_t *mac_snd_buf_ptr; - - if (m_main_buffer) - { - mac_snd_buf_ptr = (uint16_t *)(m_ram->pointer() + m_ram->size() - MAC_MAIN_SND_BUF_OFFSET); - } - else - { - mac_snd_buf_ptr = (uint16_t *)(m_ram->pointer() + m_ram->size() - MAC_ALT_SND_BUF_OFFSET); - } - - m_dac->write(mac_snd_buf_ptr[scanline] >> 8); -} - - /*************************************************************************** ADDRESS MAPS ***************************************************************************/ @@ -933,1082 +912,780 @@ static const floppy_interface mac_floppy_interface = "floppy_3_5" }; -MACHINE_CONFIG_START(mac_state::mac512ke) +void mac_state::add_base_devices(machine_config &config, bool rtc, bool super_woz) +{ + if (rtc) + RTC3430042(config, m_rtc, XTAL(32'768)); - /* basic machine hardware */ - MCFG_DEVICE_ADD("maincpu", M68000, C7M) /* 7.8336 MHz */ - MCFG_DEVICE_PROGRAM_MAP(mac512ke_map) - MCFG_DEVICE_DISASSEMBLE_OVERRIDE(mac_state, mac_dasm_override) - MCFG_QUANTUM_TIME(attotime::from_hz(60)) + if (super_woz) + SWIM(config, m_fdc, &mac_iwm_interface); + else + IWM(config, m_fdc, &mac_iwm_interface); + sonydriv_floppy_image_device::legacy_2_drives_add(config, &mac_floppy_interface); - /* video hardware */ - MCFG_SCREEN_ADD(MAC_SCREEN_NAME, RASTER) - MCFG_SCREEN_RAW_PARAMS(C7M*2, MAC_H_TOTAL, 0, MAC_H_VIS, MAC_V_TOTAL, 0, MAC_V_VIS) - MCFG_SCREEN_UPDATE_DRIVER(mac_state, screen_update_mac) - MCFG_SCREEN_PALETTE("palette") + SCC8530(config, m_scc, C7M); + m_scc->intrq_callback().set(FUNC(mac_state::set_scc_interrupt)); +} - MCFG_PALETTE_ADD("palette", 2) - MCFG_PALETTE_INIT_OWNER(mac_state,mac) +void mac_state::add_mackbd(machine_config &config) +{ +#ifdef MAC_USE_EMULATED_KBD + MACKBD(config, m_mackbd, 0); + m_mackbd->dataout_handler().set(m_via, FUNC(via6522_device::write_cb2)); + m_mackbd->clkout_handler().set(FUNC(mac_state::mac_kbd_clk_in)); +#else + MACKBD(config, m_mackbd, 0); +#endif +} - MCFG_VIDEO_START_OVERRIDE(mac_state,mac) +void mac_state::add_scsi(machine_config &config, bool cdrom) +{ + scsi_port_device &scsibus(SCSI_PORT(config, "scsi")); + scsibus.set_slot_device(1, "harddisk", SCSIHD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_6)); + scsibus.set_slot_device(2, "harddisk", SCSIHD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_5)); + if (cdrom) + scsibus.set_slot_device(3, "cdrom", SCSICD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_4)); - MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", mac_state, mac_scanline, "screen", 0, 1) + NCR5380(config, m_ncr5380, C7M); + m_ncr5380->set_scsi_port("scsi"); + m_ncr5380->irq_callback().set(FUNC(mac_state::mac_scsi_irq)); - /* sound hardware */ - SPEAKER(config, "speaker").front_center(); - MCFG_DEVICE_ADD("dac", DAC_8BIT_PWM, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25) // 2 x ls161 - MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0) - MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT) + SOFTWARE_LIST(config, "hdd_list").set_type("mac_hdd", SOFTWARE_LIST_ORIGINAL_SYSTEM); +} - /* devices */ - MCFG_RTC3430042_ADD("rtc", XTAL(32'768)) - MCFG_IWM_ADD("fdc", mac_iwm_interface) - MCFG_LEGACY_FLOPPY_SONY_2_DRIVES_ADD(mac_floppy_interface) - - MCFG_DEVICE_ADD("scc", SCC8530, C7M) - MCFG_Z8530_INTRQ_CALLBACK(WRITELINE(*this, mac_state, set_scc_interrupt)) - - MCFG_DEVICE_ADD("via6522_0", VIA6522, 1000000) - MCFG_VIA6522_READPA_HANDLER(READ8(*this, mac_state,mac_via_in_a)) - MCFG_VIA6522_READPB_HANDLER(READ8(*this, mac_state,mac_via_in_b)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, mac_state,mac_via_out_a)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, mac_state,mac_via_out_b)) - MCFG_VIA6522_CB2_HANDLER(WRITELINE(*this, mac_state,mac_via_out_cb2)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, mac_state,mac_via_irq)) - - MCFG_MACKBD_ADD(MACKBD_TAG) -#ifdef MAC_USE_EMULATED_KBD - MCFG_MACKBD_DATAOUT_HANDLER(WRITELINE("via6522_0", via6522_device, write_cb2)) - MCFG_MACKBD_CLKOUT_HANDLER(WRITELINE(*this, mac_state, mac_kbd_clk_in)) -#endif +void mac_state::add_via1_adb(machine_config &config, bool macii) +{ + VIA6522(config, m_via1, C7M/10); + m_via1->readpa_handler().set(FUNC(mac_state::mac_via_in_a)); + if (macii) + m_via1->readpb_handler().set(FUNC(mac_state::mac_via_in_b_ii)); + else + m_via1->readpb_handler().set(FUNC(mac_state::mac_via_in_b)); + m_via1->writepa_handler().set(FUNC(mac_state::mac_via_out_a)); + m_via1->writepb_handler().set(FUNC(mac_state::mac_via_out_b_bbadb)); + m_via1->cb2_handler().set(FUNC(mac_state::mac_adb_via_out_cb2)); + m_via1->irq_handler().set(FUNC(mac_state::mac_via_irq)); +} - /* internal ram */ - MCFG_RAM_ADD(RAM_TAG) - MCFG_RAM_DEFAULT_SIZE("512K") -MACHINE_CONFIG_END +void mac_state::add_via2(machine_config &config) +{ + VIA6522(config, m_via2, C7M/10); + m_via2->readpa_handler().set(FUNC(mac_state::mac_via2_in_a)); + m_via2->readpb_handler().set(FUNC(mac_state::mac_via2_in_b)); + m_via2->writepa_handler().set(FUNC(mac_state::mac_via2_out_a)); + m_via2->writepb_handler().set(FUNC(mac_state::mac_via2_out_b)); + m_via2->irq_handler().set(FUNC(mac_state::mac_via2_irq)); +} -MACHINE_CONFIG_START(mac_state::macplus) - mac512ke(config); - MCFG_DEVICE_MODIFY( "maincpu" ) - MCFG_DEVICE_PROGRAM_MAP(macplus_map) +void mac_state::add_egret(machine_config &config, int type) +{ + EGRET(config, m_egret, type); + m_egret->reset_callback().set(FUNC(mac_state::cuda_reset_w)); + m_egret->linechange_callback().set(FUNC(mac_state::adb_linechange_w)); + m_egret->via_clock_callback().set(m_via1, FUNC(via6522_device::write_cb1)); + m_egret->via_data_callback().set(m_via1, FUNC(via6522_device::write_cb2)); + config.m_perfect_cpu_quantum = subtag("maincpu"); +} - MCFG_DEVICE_ADD("scsi", SCSI_PORT, 0) - MCFG_SCSIDEV_ADD("scsi:" SCSI_PORT_DEVICE1, "harddisk", SCSIHD, SCSI_ID_6) - MCFG_SCSIDEV_ADD("scsi:" SCSI_PORT_DEVICE2, "harddisk", SCSIHD, SCSI_ID_5) +void mac_state::add_cuda(machine_config &config, int type) +{ + CUDA(config, m_cuda, type); + m_cuda->reset_callback().set(FUNC(mac_state::cuda_reset_w)); + m_cuda->linechange_callback().set(FUNC(mac_state::adb_linechange_w)); + m_cuda->via_clock_callback().set(m_via1, FUNC(via6522_device::write_cb1)); + m_cuda->via_data_callback().set(m_via1, FUNC(via6522_device::write_cb2)); +} - MCFG_DEVICE_ADD("ncr5380", NCR5380, C7M) - MCFG_LEGACY_SCSI_PORT("scsi") - MCFG_NCR5380_IRQ_CB(WRITELINE(*this, mac_state, mac_scsi_irq)) +void mac_state::add_asc(machine_config &config, asc_device::asc_type type) +{ + SPEAKER(config, "lspeaker").front_left(); + SPEAKER(config, "rspeaker").front_right(); + ASC(config, m_asc, C15M, type); + m_asc->irqf_callback().set(FUNC(mac_state::mac_asc_irq)); + m_asc->add_route(0, "lspeaker", 1.0); + m_asc->add_route(1, "rspeaker", 1.0); +} - MCFG_LEGACY_FLOPPY_SONY_2_DRIVES_MODIFY(mac_floppy_interface) +void mac_state::add_pb1xx_screen(machine_config &config) +{ + SCREEN(config, m_screen, SCREEN_TYPE_RASTER); + m_screen->set_refresh_hz(60.15); + m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(1260)); + m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK); + m_screen->set_size(700, 480); + m_screen->set_visarea(0, 639, 0, 399); + m_screen->set_palette(m_palette); +} - /* internal ram */ - MCFG_RAM_MODIFY(RAM_TAG) - MCFG_RAM_DEFAULT_SIZE("4M") - MCFG_RAM_EXTRA_OPTIONS("1M,2M,2560K,4M") +void mac_state::add_pb1xx_vias(machine_config &config) +{ + VIA6522(config, m_via1, 783360); + m_via1->readpa_handler().set(FUNC(mac_state::mac_via_in_a)); + m_via1->readpb_handler().set(FUNC(mac_state::mac_via_in_b_via2pmu)); + m_via1->writepa_handler().set(FUNC(mac_state::mac_via_out_a)); + m_via1->writepb_handler().set(FUNC(mac_state::mac_via_out_b_via2pmu)); + m_via1->cb2_handler().set(FUNC(mac_state::mac_adb_via_out_cb2)); + m_via1->irq_handler().set(FUNC(mac_state::mac_via_irq)); + + VIA6522(config, m_via2, 783360); + m_via2->readpa_handler().set(FUNC(mac_state::mac_via2_in_a_pmu)); + m_via2->readpb_handler().set(FUNC(mac_state::mac_via2_in_b_pmu)); + m_via2->writepa_handler().set(FUNC(mac_state::mac_via2_out_a_pmu)); + m_via2->writepb_handler().set(FUNC(mac_state::mac_via2_out_b_pmu)); + m_via2->irq_handler().set(FUNC(mac_state::mac_via2_irq)); +} - // software list - MCFG_SOFTWARE_LIST_ADD("flop35_list","mac_flop") - MCFG_SOFTWARE_LIST_ADD("hdd_list", "mac_hdd") -MACHINE_CONFIG_END - -MACHINE_CONFIG_START(mac_state::macse) - macplus(config); - MCFG_DEVICE_MODIFY("maincpu") - MCFG_DEVICE_PROGRAM_MAP(macse_map) - - MCFG_DEVICE_REMOVE("via6522_0") - MCFG_DEVICE_ADD("via6522_0", VIA6522, 1000000) - MCFG_VIA6522_READPA_HANDLER(READ8(*this, mac_state,mac_via_in_a)) - MCFG_VIA6522_READPB_HANDLER(READ8(*this, mac_state,mac_via_in_b)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, mac_state,mac_via_out_a)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, mac_state,mac_via_out_b_bbadb)) - MCFG_VIA6522_CB2_HANDLER(WRITELINE(*this, mac_state,mac_adb_via_out_cb2)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, mac_state,mac_via_irq)) +void mac_state::mac512ke_base(machine_config &config) +{ + M68000(config, m_maincpu, C7M); /* 7.8336 MHz */ + m_maincpu->set_addrmap(AS_PROGRAM, &mac_state::mac512ke_map); + m_maincpu->set_dasm_override(FUNC(mac_state::mac_dasm_override)); + config.m_minimum_quantum = attotime::from_hz(60); - /* internal ram */ - MCFG_RAM_MODIFY(RAM_TAG) - MCFG_RAM_DEFAULT_SIZE("4M") - MCFG_RAM_EXTRA_OPTIONS("2M,2560K,4M") - - MCFG_MACKBD_REMOVE(MACKBD_TAG) - - MCFG_MACPDS_BUS_ADD("sepds", "maincpu") - MCFG_MACPDS_SLOT_ADD("sepds", "pds", mac_sepds_cards, nullptr) -MACHINE_CONFIG_END - -MACHINE_CONFIG_START(mac_state::macclasc) - macplus(config); - MCFG_DEVICE_MODIFY("maincpu") - MCFG_DEVICE_PROGRAM_MAP(macse_map) - - MCFG_DEVICE_REMOVE("via6522_0") - MCFG_DEVICE_ADD("via6522_0", VIA6522, 1000000) - MCFG_VIA6522_READPA_HANDLER(READ8(*this, mac_state,mac_via_in_a)) - MCFG_VIA6522_READPB_HANDLER(READ8(*this, mac_state,mac_via_in_b)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, mac_state,mac_via_out_a)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, mac_state,mac_via_out_b_bbadb)) - MCFG_VIA6522_CB2_HANDLER(WRITELINE(*this, mac_state,mac_adb_via_out_cb2)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, mac_state,mac_via_irq)) + SCREEN(config, m_screen, SCREEN_TYPE_RASTER); + m_screen->set_raw(C7M*2, MAC_H_TOTAL, 0, MAC_H_VIS, MAC_V_TOTAL, 0, MAC_V_VIS); + m_screen->set_screen_update(FUNC(mac_state::screen_update_mac)); + m_screen->set_palette(m_palette); - /* internal ram */ - MCFG_RAM_MODIFY(RAM_TAG) - MCFG_RAM_DEFAULT_SIZE("4M") - MCFG_RAM_EXTRA_OPTIONS("2M,2560K,4M") + PALETTE(config, m_palette, 2); + m_palette->set_init(DEVICE_SELF_OWNER, FUNC(mac_state::palette_init_mac)); - MCFG_MACKBD_REMOVE(MACKBD_TAG) -MACHINE_CONFIG_END + MCFG_VIDEO_START_OVERRIDE(mac_state,mac) -MACHINE_CONFIG_START(mac_state::macprtb) - /* basic machine hardware */ - MCFG_DEVICE_ADD("maincpu", M68000, C15M) - MCFG_DEVICE_PROGRAM_MAP(macprtb_map) - MCFG_DEVICE_DISASSEMBLE_OVERRIDE(mac_state, mac_dasm_override) - MCFG_QUANTUM_TIME(attotime::from_hz(60)) + SPEAKER(config, "speaker").front_center(); + DAC_8BIT_PWM(config, m_dac, 0); + m_dac->add_route(ALL_OUTPUTS, "speaker", 0.25); // 2 x ls161 + voltage_regulator_device &vreg(VOLTAGE_REGULATOR(config, "vref", 0)); + vreg.set_output(5.0); + vreg.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); + vreg.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT); + + add_base_devices(config, true, false); + + VIA6522(config, m_via1, 1000000); + m_via1->readpa_handler().set(FUNC(mac_state::mac_via_in_a)); + m_via1->readpb_handler().set(FUNC(mac_state::mac_via_in_b)); + m_via1->writepa_handler().set(FUNC(mac_state::mac_via_out_a)); + m_via1->writepb_handler().set(FUNC(mac_state::mac_via_out_b)); + m_via1->cb2_handler().set(FUNC(mac_state::mac_via_out_cb2)); + m_via1->irq_handler().set(FUNC(mac_state::mac_via_irq)); + + RAM(config, m_ram); + m_ram->set_default_size("512K"); +} - /* video hardware */ - MCFG_SCREEN_ADD(MAC_SCREEN_NAME, RASTER) - MCFG_SCREEN_REFRESH_RATE(60.15) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(1260)) - MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK) - MCFG_SCREEN_SIZE(700, 480) - MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 399) - MCFG_SCREEN_UPDATE_DRIVER(mac_state, screen_update_macprtb) - MCFG_SCREEN_PALETTE("palette") - - MCFG_PALETTE_ADD("palette", 2) - MCFG_PALETTE_INIT_OWNER(mac_state,mac) +void mac_state::mac512ke(machine_config &config) +{ + mac512ke_base(config); + add_mackbd(config); +} - MCFG_VIDEO_START_OVERRIDE(mac_state,macprtb) +void mac_state::add_macplus_additions(machine_config &config) +{ + m_maincpu->set_addrmap(AS_PROGRAM, &mac_state::macplus_map); - /* sound hardware */ - SPEAKER(config, "lspeaker").front_left(); - SPEAKER(config, "rspeaker").front_right(); - MCFG_ASC_ADD("asc", C15M, ASC, WRITELINE(*this, mac_state, mac_asc_irq)) - MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) - MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) + add_scsi(config); - /* devices */ - MCFG_RTC3430042_ADD("rtc", XTAL(32'768)) + /* internal ram */ + m_ram->set_default_size("4M"); + m_ram->set_extra_options("1M,2M,2560K,4M"); - MCFG_DEVICE_ADD("scsi", SCSI_PORT, 0) - MCFG_SCSIDEV_ADD("scsi:" SCSI_PORT_DEVICE1, "harddisk", SCSIHD, SCSI_ID_6) - MCFG_SCSIDEV_ADD("scsi:" SCSI_PORT_DEVICE2, "harddisk", SCSIHD, SCSI_ID_5) + // software list + SOFTWARE_LIST(config, "flop35_list").set_type("mac_flop", SOFTWARE_LIST_ORIGINAL_SYSTEM); +} - MCFG_DEVICE_ADD("ncr5380", NCR5380, C7M) - MCFG_LEGACY_SCSI_PORT("scsi") - MCFG_NCR5380_IRQ_CB(WRITELINE(*this, mac_state, mac_scsi_irq)) +void mac_state::add_nubus(machine_config &config, bool bank1, bool bank2) +{ + nubus_device &nubus(NUBUS(config, "nubus", 0)); + nubus.set_cputag("maincpu"); + nubus.out_irq9_callback().set(FUNC(mac_state::nubus_irq_9_w)); + nubus.out_irqa_callback().set(FUNC(mac_state::nubus_irq_a_w)); + nubus.out_irqb_callback().set(FUNC(mac_state::nubus_irq_b_w)); + nubus.out_irqc_callback().set(FUNC(mac_state::nubus_irq_c_w)); + nubus.out_irqd_callback().set(FUNC(mac_state::nubus_irq_d_w)); + nubus.out_irqe_callback().set(FUNC(mac_state::nubus_irq_e_w)); + if (bank1) + { + NUBUS_SLOT(config, "nb9", "nubus", mac_nubus_cards, "48gc"); + NUBUS_SLOT(config, "nba", "nubus", mac_nubus_cards, nullptr); + NUBUS_SLOT(config, "nbb", "nubus", mac_nubus_cards, nullptr); + } + if (bank2) + { + NUBUS_SLOT(config, "nbc", "nubus", mac_nubus_cards, nullptr); + NUBUS_SLOT(config, "nbd", "nubus", mac_nubus_cards, nullptr); + NUBUS_SLOT(config, "nbe", "nubus", mac_nubus_cards, nullptr); + } +} - MCFG_IWM_ADD("fdc", mac_iwm_interface) - MCFG_LEGACY_FLOPPY_SONY_2_DRIVES_ADD(mac_floppy_interface) +template <typename T> void mac_state::add_nubus_pds(machine_config &config, const char *slot_tag, T &&opts) +{ + nubus_device &nubus(NUBUS(config, "pds", 0)); + nubus.set_cputag("maincpu"); + nubus.out_irq9_callback().set(FUNC(mac_state::nubus_irq_9_w)); + nubus.out_irqa_callback().set(FUNC(mac_state::nubus_irq_a_w)); + nubus.out_irqb_callback().set(FUNC(mac_state::nubus_irq_b_w)); + nubus.out_irqc_callback().set(FUNC(mac_state::nubus_irq_c_w)); + nubus.out_irqd_callback().set(FUNC(mac_state::nubus_irq_d_w)); + nubus.out_irqe_callback().set(FUNC(mac_state::nubus_irq_e_w)); + NUBUS_SLOT(config, slot_tag, "pds", std::forward<T>(opts), nullptr); +} - MCFG_DEVICE_ADD("scc", SCC8530, C7M) - MCFG_Z8530_INTRQ_CALLBACK(WRITELINE(*this, mac_state, set_scc_interrupt)) - MCFG_DEVICE_ADD("via6522_0", VIA6522, 783360) - MCFG_VIA6522_READPA_HANDLER(READ8(*this, mac_state,mac_via_in_a_pmu)) - MCFG_VIA6522_READPB_HANDLER(READ8(*this, mac_state,mac_via_in_b_pmu)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, mac_state,mac_via_out_a_pmu)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, mac_state,mac_via_out_b_pmu)) - MCFG_VIA6522_CB2_HANDLER(WRITELINE(*this, mac_state,mac_via_out_cb2)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, mac_state,mac_via_irq)) +void mac_state::macplus(machine_config &config) +{ + mac512ke_base(config); + add_macplus_additions(config); + add_mackbd(config); +} + +void mac_state::macse(machine_config &config) +{ + mac512ke_base(config); + add_macplus_additions(config); + m_maincpu->set_addrmap(AS_PROGRAM, &mac_state::macse_map); + + m_via1->writepb_handler().set(FUNC(mac_state::mac_via_out_b_bbadb)); + m_via1->cb2_handler().set(FUNC(mac_state::mac_adb_via_out_cb2)); /* internal ram */ - MCFG_RAM_ADD(RAM_TAG) - MCFG_RAM_DEFAULT_SIZE("1M") - MCFG_RAM_EXTRA_OPTIONS("1M,3M,5M,7M,9M") + m_ram->set_default_size("4M"); + m_ram->set_extra_options("2M,2560K,4M"); - // software list - MCFG_SOFTWARE_LIST_ADD("hdd_list", "mac_hdd") -MACHINE_CONFIG_END + MACPDS(config, "sepds", "maincpu"); + MACPDS_SLOT(config, "pds", "sepds", mac_sepds_cards, nullptr); +} + +void mac_state::macclasc(machine_config &config) +{ + mac512ke_base(config); + add_macplus_additions(config); + m_maincpu->set_addrmap(AS_PROGRAM, &mac_state::macse_map); + + m_via1->writepb_handler().set(FUNC(mac_state::mac_via_out_b_bbadb)); + m_via1->cb2_handler().set(FUNC(mac_state::mac_adb_via_out_cb2)); -MACHINE_CONFIG_START(mac_state::macii) + /* internal ram */ + m_ram->set_default_size("4M"); + m_ram->set_extra_options("2M,2560K,4M"); +} +void mac_state::macprtb(machine_config &config) +{ /* basic machine hardware */ - MCFG_DEVICE_ADD("maincpu", M68020PMMU, C15M) - MCFG_DEVICE_PROGRAM_MAP(macii_map) - MCFG_DEVICE_DISASSEMBLE_OVERRIDE(mac_state, mac_dasm_override) + M68000(config, m_maincpu, C15M); + m_maincpu->set_addrmap(AS_PROGRAM, &mac_state::macprtb_map); + m_maincpu->set_dasm_override(FUNC(mac_state::mac_dasm_override)); - MCFG_PALETTE_ADD("palette", 256) + config.m_minimum_quantum = attotime::from_hz(60); - /* sound hardware */ - SPEAKER(config, "lspeaker").front_left(); - SPEAKER(config, "rspeaker").front_right(); - MCFG_ASC_ADD("asc", C15M, ASC, WRITELINE(*this, mac_state, mac_asc_irq)) - MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) - MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) + add_pb1xx_screen(config); + m_screen->set_screen_update(FUNC(mac_state::screen_update_macprtb)); + + PALETTE(config, m_palette, 2); + m_palette->set_init(DEVICE_SELF_OWNER, FUNC(mac_state::palette_init_mac)); + + MCFG_VIDEO_START_OVERRIDE(mac_state,macprtb) /* devices */ - MCFG_RTC3430042_ADD("rtc", XTAL(32'768)) - MCFG_DEVICE_ADD("nubus", NUBUS, 0) - MCFG_NUBUS_CPU("maincpu") - MCFG_NUBUS_OUT_IRQ9_CB(WRITELINE(*this, mac_state, nubus_irq_9_w)) - MCFG_NUBUS_OUT_IRQA_CB(WRITELINE(*this, mac_state, nubus_irq_a_w)) - MCFG_NUBUS_OUT_IRQB_CB(WRITELINE(*this, mac_state, nubus_irq_b_w)) - MCFG_NUBUS_OUT_IRQC_CB(WRITELINE(*this, mac_state, nubus_irq_c_w)) - MCFG_NUBUS_OUT_IRQD_CB(WRITELINE(*this, mac_state, nubus_irq_d_w)) - MCFG_NUBUS_OUT_IRQE_CB(WRITELINE(*this, mac_state, nubus_irq_e_w)) - MCFG_NUBUS_SLOT_ADD("nubus","nb9", mac_nubus_cards, "48gc") - MCFG_NUBUS_SLOT_ADD("nubus","nba", mac_nubus_cards, nullptr) - MCFG_NUBUS_SLOT_ADD("nubus","nbb", mac_nubus_cards, nullptr) - MCFG_NUBUS_SLOT_ADD("nubus","nbc", mac_nubus_cards, nullptr) - MCFG_NUBUS_SLOT_ADD("nubus","nbd", mac_nubus_cards, nullptr) - MCFG_NUBUS_SLOT_ADD("nubus","nbe", mac_nubus_cards, nullptr) - - MCFG_DEVICE_ADD("scsi", SCSI_PORT, 0) - MCFG_SCSIDEV_ADD("scsi:" SCSI_PORT_DEVICE1, "harddisk", SCSIHD, SCSI_ID_6) - MCFG_SCSIDEV_ADD("scsi:" SCSI_PORT_DEVICE2, "harddisk", SCSIHD, SCSI_ID_5) - MCFG_SCSIDEV_ADD("scsi:" SCSI_PORT_DEVICE3, "cdrom", SCSICD, SCSI_ID_4) - - MCFG_DEVICE_ADD("ncr5380", NCR5380, C7M) - MCFG_LEGACY_SCSI_PORT("scsi") - MCFG_NCR5380_IRQ_CB(WRITELINE(*this, mac_state, mac_scsi_irq)) - - MCFG_IWM_ADD("fdc", mac_iwm_interface) - MCFG_LEGACY_FLOPPY_SONY_2_DRIVES_ADD(mac_floppy_interface) - - MCFG_DEVICE_ADD("scc", SCC8530, C7M) - MCFG_Z8530_INTRQ_CALLBACK(WRITELINE(*this, mac_state, set_scc_interrupt)) - - MCFG_DEVICE_ADD("via6522_0", VIA6522, C7M/10) - MCFG_VIA6522_READPA_HANDLER(READ8(*this, mac_state,mac_via_in_a)) - MCFG_VIA6522_READPB_HANDLER(READ8(*this, mac_state,mac_via_in_b_ii)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, mac_state,mac_via_out_a)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, mac_state,mac_via_out_b_bbadb)) - MCFG_VIA6522_CB2_HANDLER(WRITELINE(*this, mac_state,mac_adb_via_out_cb2)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, mac_state,mac_via_irq)) - - MCFG_DEVICE_ADD("via6522_1", VIA6522, C7M/10) - MCFG_VIA6522_READPA_HANDLER(READ8(*this, mac_state, mac_via2_in_a)) - MCFG_VIA6522_READPB_HANDLER(READ8(*this, mac_state, mac_via2_in_b)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, mac_state,mac_via2_out_a)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, mac_state,mac_via2_out_b)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, mac_state,mac_via2_irq)) + add_base_devices(config); + add_scsi(config); + add_asc(config, asc_device::asc_type::ASC); + + VIA6522(config, m_via1, 783360); + m_via1->readpa_handler().set(FUNC(mac_state::mac_via_in_a_pmu)); + m_via1->readpb_handler().set(FUNC(mac_state::mac_via_in_b_pmu)); + m_via1->writepa_handler().set(FUNC(mac_state::mac_via_out_a_pmu)); + m_via1->writepb_handler().set(FUNC(mac_state::mac_via_out_b_pmu)); + m_via1->cb2_handler().set(FUNC(mac_state::mac_via_out_cb2)); + m_via1->irq_handler().set(FUNC(mac_state::mac_via_irq)); + + RAM(config, m_ram); + m_ram->set_default_size("1M"); + m_ram->set_extra_options("1M,3M,5M,7M,9M"); +} - /* internal ram */ - MCFG_RAM_ADD(RAM_TAG) - MCFG_RAM_DEFAULT_SIZE("2M") - MCFG_RAM_EXTRA_OPTIONS("8M,32M,64M,96M,128M") +void mac_state::macii(machine_config &config, bool cpu, asc_device::asc_type asc_type, bool nubus, bool nubus_bank1, bool nubus_bank2) +{ + if (cpu) + { + M68020PMMU(config, m_maincpu, C15M); + m_maincpu->set_addrmap(AS_PROGRAM, &mac_state::macii_map); + m_maincpu->set_dasm_override(FUNC(mac_state::mac_dasm_override)); + } - // software list - MCFG_SOFTWARE_LIST_ADD("flop35_list","mac_flop") - MCFG_SOFTWARE_LIST_ADD("hdd_list", "mac_hdd") -MACHINE_CONFIG_END + PALETTE(config, m_palette, 256); + + add_asc(config, asc_type); + add_base_devices(config); + add_scsi(config, true); + if (nubus) + add_nubus(config, nubus_bank1, nubus_bank2); + + add_via1_adb(config, true); + add_via2(config); -MACHINE_CONFIG_START(mac_state::maciihmu) - macii(config); - MCFG_DEVICE_REPLACE("maincpu", M68020HMMU, C15M) - MCFG_DEVICE_PROGRAM_MAP(macii_map) - MCFG_DEVICE_DISASSEMBLE_OVERRIDE(mac_state, mac_dasm_override) -MACHINE_CONFIG_END + RAM(config, m_ram); + m_ram->set_default_size("2M"); + m_ram->set_extra_options("8M,32M,64M,96M,128M"); -MACHINE_CONFIG_START(mac_state::maciifx) + SOFTWARE_LIST(config, "flop35_list").set_type("mac_flop", SOFTWARE_LIST_ORIGINAL_SYSTEM); +} + +void mac_state::maciihmu(machine_config &config) +{ + macii(config, false); + M68020HMMU(config, m_maincpu, C15M); + m_maincpu->set_addrmap(AS_PROGRAM, &mac_state::macii_map); + m_maincpu->set_dasm_override(FUNC(mac_state::mac_dasm_override)); +} + +void mac_state::maciifx(machine_config &config) +{ /* basic machine hardware */ - MCFG_DEVICE_ADD("maincpu", M68030, 40000000) - MCFG_DEVICE_PROGRAM_MAP(maciifx_map) - MCFG_DEVICE_DISASSEMBLE_OVERRIDE(mac_state, mac_dasm_override) + M68030(config, m_maincpu, 40000000); + m_maincpu->set_addrmap(AS_PROGRAM, &mac_state::maciifx_map); + m_maincpu->set_dasm_override(FUNC(mac_state::mac_dasm_override)); - /* sound hardware */ - SPEAKER(config, "lspeaker").front_left(); - SPEAKER(config, "rspeaker").front_right(); - MCFG_ASC_ADD("asc", C15M, ASC, WRITELINE(*this, mac_state, mac_asc_irq)) - MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) - MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) + add_asc(config, asc_device::asc_type::ASC); + add_base_devices(config); + add_scsi(config); - /* devices */ - MCFG_RTC3430042_ADD("rtc", XTAL(32'768)) - MCFG_DEVICE_ADD("nubus", NUBUS, 0) - MCFG_NUBUS_CPU("maincpu") - MCFG_NUBUS_OUT_IRQ9_CB(WRITELINE(*this, mac_state, nubus_irq_9_w)) - MCFG_NUBUS_OUT_IRQA_CB(WRITELINE(*this, mac_state, nubus_irq_a_w)) - MCFG_NUBUS_OUT_IRQB_CB(WRITELINE(*this, mac_state, nubus_irq_b_w)) - MCFG_NUBUS_OUT_IRQC_CB(WRITELINE(*this, mac_state, nubus_irq_c_w)) - MCFG_NUBUS_OUT_IRQD_CB(WRITELINE(*this, mac_state, nubus_irq_d_w)) - MCFG_NUBUS_OUT_IRQE_CB(WRITELINE(*this, mac_state, nubus_irq_e_w)) - MCFG_NUBUS_SLOT_ADD("nubus","nb9", mac_nubus_cards, "48gc") - MCFG_NUBUS_SLOT_ADD("nubus","nba", mac_nubus_cards, nullptr) - MCFG_NUBUS_SLOT_ADD("nubus","nbb", mac_nubus_cards, nullptr) - MCFG_NUBUS_SLOT_ADD("nubus","nbc", mac_nubus_cards, nullptr) - MCFG_NUBUS_SLOT_ADD("nubus","nbd", mac_nubus_cards, nullptr) - MCFG_NUBUS_SLOT_ADD("nubus","nbe", mac_nubus_cards, nullptr) - - MCFG_DEVICE_ADD("scsi", SCSI_PORT, 0) - MCFG_SCSIDEV_ADD("scsi:" SCSI_PORT_DEVICE1, "harddisk", SCSIHD, SCSI_ID_6) - MCFG_SCSIDEV_ADD("scsi:" SCSI_PORT_DEVICE2, "harddisk", SCSIHD, SCSI_ID_5) - - MCFG_DEVICE_ADD("ncr5380", NCR5380, C7M) - MCFG_LEGACY_SCSI_PORT("scsi") - MCFG_NCR5380_IRQ_CB(WRITELINE(*this, mac_state, mac_scsi_irq)) - - MCFG_IWM_ADD("fdc", mac_iwm_interface) - MCFG_LEGACY_FLOPPY_SONY_2_DRIVES_ADD(mac_floppy_interface) - - MCFG_DEVICE_ADD("scc", SCC8530, C7M) - MCFG_Z8530_INTRQ_CALLBACK(WRITELINE(*this, mac_state, set_scc_interrupt)) - - MCFG_DEVICE_ADD("via6522_0", VIA6522, C7M/10) - MCFG_VIA6522_READPA_HANDLER(READ8(*this, mac_state,mac_via_in_a)) - MCFG_VIA6522_READPB_HANDLER(READ8(*this, mac_state,mac_via_in_b_ii)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, mac_state,mac_via_out_a)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, mac_state,mac_via_out_b)) - MCFG_VIA6522_CB2_HANDLER(WRITELINE(*this, mac_state,mac_adb_via_out_cb2)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, mac_state,mac_via_irq)) + VIA6522(config, m_via1, C7M/10); + m_via1->readpa_handler().set(FUNC(mac_state::mac_via_in_a)); + m_via1->readpb_handler().set(FUNC(mac_state::mac_via_in_b_ii)); + m_via1->writepa_handler().set(FUNC(mac_state::mac_via_out_a)); + m_via1->writepb_handler().set(FUNC(mac_state::mac_via_out_b)); + m_via1->cb2_handler().set(FUNC(mac_state::mac_adb_via_out_cb2)); + m_via1->irq_handler().set(FUNC(mac_state::mac_via_irq)); - /* internal ram */ - MCFG_RAM_ADD(RAM_TAG) - MCFG_RAM_DEFAULT_SIZE("4M") - MCFG_RAM_EXTRA_OPTIONS("8M,16M,32M,64M,96M,128M") + RAM(config, m_ram); + m_ram->set_default_size("4M"); + m_ram->set_extra_options("8M,16M,32M,64M,96M,128M"); - // software list - MCFG_SOFTWARE_LIST_ADD("flop35_list","mac_flop") - MCFG_SOFTWARE_LIST_ADD("hdd_list", "mac_hdd") -MACHINE_CONFIG_END + SOFTWARE_LIST(config, "flop35_list").set_type("mac_flop", SOFTWARE_LIST_ORIGINAL_SYSTEM); -MACHINE_CONFIG_START(mac_state::maclc) - macii(config); + add_nubus(config); +} - MCFG_DEVICE_REPLACE("maincpu", M68020HMMU, C15M) - MCFG_DEVICE_PROGRAM_MAP(maclc_map) - MCFG_DEVICE_DISASSEMBLE_OVERRIDE(mac_state, mac_dasm_override) +void mac_state::maclc(machine_config &config, bool cpu, bool egret, asc_device::asc_type asc_type) +{ + macii(config, false, asc_type, false); - MCFG_PALETTE_MODIFY("palette") - MCFG_PALETTE_ENTRIES(256) + if (cpu) + { + M68020HMMU(config, m_maincpu, C15M); + m_maincpu->set_addrmap(AS_PROGRAM, &mac_state::maclc_map); + m_maincpu->set_dasm_override(FUNC(mac_state::mac_dasm_override)); + } MCFG_VIDEO_START_OVERRIDE(mac_state,macv8) MCFG_VIDEO_RESET_OVERRIDE(mac_state,macrbv) - MCFG_SCREEN_ADD(MAC_SCREEN_NAME, RASTER) - MCFG_SCREEN_RAW_PARAMS(25175000, 800, 0, 640, 525, 0, 480) - MCFG_SCREEN_SIZE(1024,768) - MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1) - MCFG_SCREEN_UPDATE_DRIVER(mac_state, screen_update_macv8) - MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, mac_state, mac_rbv_vbl)) + SCREEN(config, m_screen, SCREEN_TYPE_RASTER); + m_screen->set_raw(25175000, 800, 0, 640, 525, 0, 480); + m_screen->set_size(1024, 768); + m_screen->set_visarea(0, 640-1, 0, 480-1); + m_screen->set_screen_update(FUNC(mac_state::screen_update_macv8)); + m_screen->screen_vblank().set(FUNC(mac_state::mac_rbv_vbl)); config.set_default_layout(layout_mac); - MCFG_RAM_MODIFY(RAM_TAG) - MCFG_RAM_DEFAULT_SIZE("2M") - MCFG_RAM_EXTRA_OPTIONS("4M,6M,8M,10M") - - MCFG_DEVICE_MODIFY("via6522_0") - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, mac_state,mac_via_out_b_egadb)) - - MCFG_NUBUS_SLOT_REMOVE("nb9") - MCFG_NUBUS_SLOT_REMOVE("nba") - MCFG_NUBUS_SLOT_REMOVE("nbb") - MCFG_NUBUS_SLOT_REMOVE("nbc") - MCFG_NUBUS_SLOT_REMOVE("nbd") - MCFG_NUBUS_SLOT_REMOVE("nbe") - MCFG_DEVICE_REMOVE("nubus") - - MCFG_DEVICE_ADD("pds", NUBUS, 0) - MCFG_NUBUS_CPU("maincpu") - MCFG_NUBUS_OUT_IRQ9_CB(WRITELINE(*this, mac_state, nubus_irq_9_w)) - MCFG_NUBUS_OUT_IRQA_CB(WRITELINE(*this, mac_state, nubus_irq_a_w)) - MCFG_NUBUS_OUT_IRQB_CB(WRITELINE(*this, mac_state, nubus_irq_b_w)) - MCFG_NUBUS_OUT_IRQC_CB(WRITELINE(*this, mac_state, nubus_irq_c_w)) - MCFG_NUBUS_OUT_IRQD_CB(WRITELINE(*this, mac_state, nubus_irq_d_w)) - MCFG_NUBUS_OUT_IRQE_CB(WRITELINE(*this, mac_state, nubus_irq_e_w)) - MCFG_NUBUS_SLOT_ADD("pds","lcpds", mac_lcpds_cards, nullptr) - - MCFG_ASC_REPLACE("asc", C15M, V8, WRITELINE(*this, mac_state, mac_asc_irq)) - MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) - MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) - - MCFG_EGRET_ADD(EGRET_341S0850) - MCFG_EGRET_RESET_CALLBACK(WRITELINE(*this, mac_state, cuda_reset_w)) - MCFG_EGRET_LINECHANGE_CALLBACK(WRITELINE(*this, mac_state, adb_linechange_w)) - MCFG_EGRET_VIA_CLOCK_CALLBACK(WRITELINE("via6522_0", via6522_device, write_cb1)) - MCFG_EGRET_VIA_DATA_CALLBACK(WRITELINE("via6522_0", via6522_device, write_cb2)) - MCFG_QUANTUM_PERFECT_CPU("maincpu") -MACHINE_CONFIG_END - -MACHINE_CONFIG_START(mac_state::maclc2) - maclc(config); - - MCFG_DEVICE_REPLACE("maincpu", M68030, C15M) - MCFG_DEVICE_PROGRAM_MAP(maclc_map) - MCFG_DEVICE_DISASSEMBLE_OVERRIDE(mac_state, mac_dasm_override) - - MCFG_RAM_MODIFY(RAM_TAG) - MCFG_RAM_DEFAULT_SIZE("4M") - MCFG_RAM_EXTRA_OPTIONS("6M,8M,10M") -MACHINE_CONFIG_END - -MACHINE_CONFIG_START(mac_state::maccclas) - maclc2(config); - - MCFG_EGRET_REMOVE() - MCFG_CUDA_ADD(CUDA_341S0788) // should be 0417, but that version won't sync up properly with the '030 right now - MCFG_CUDA_RESET_CALLBACK(WRITELINE(*this, mac_state, cuda_reset_w)) - MCFG_CUDA_LINECHANGE_CALLBACK(WRITELINE(*this, mac_state, adb_linechange_w)) - MCFG_CUDA_VIA_CLOCK_CALLBACK(WRITELINE("via6522_0", via6522_device, write_cb1)) - MCFG_CUDA_VIA_DATA_CALLBACK(WRITELINE("via6522_0", via6522_device, write_cb2)) - - MCFG_DEVICE_MODIFY("via6522_0") - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, mac_state,mac_via_out_b_cdadb)) -MACHINE_CONFIG_END - -MACHINE_CONFIG_START(mac_state::maclc3) - maclc(config); - - MCFG_DEVICE_REPLACE("maincpu", M68030, 25000000) - MCFG_DEVICE_PROGRAM_MAP(maclc3_map) - MCFG_DEVICE_DISASSEMBLE_OVERRIDE(mac_state, mac_dasm_override) + m_ram->set_default_size("2M"); + m_ram->set_extra_options("4M,6M,8M,10M"); - MCFG_VIDEO_START_OVERRIDE(mac_state,macsonora) - MCFG_VIDEO_RESET_OVERRIDE(mac_state,macsonora) + m_via1->writepb_handler().set(FUNC(mac_state::mac_via_out_b_egadb)); + + add_nubus_pds(config, "lcpds", mac_lcpds_cards); + + if (egret) + add_egret(config, EGRET_341S0850); +} + +void mac_state::maclc2(machine_config &config, bool egret) +{ + maclc(config, false, egret); + + M68030(config, m_maincpu, C15M); + m_maincpu->set_addrmap(AS_PROGRAM, &mac_state::maclc_map); + m_maincpu->set_dasm_override(FUNC(mac_state::mac_dasm_override)); - MCFG_SCREEN_MODIFY(MAC_SCREEN_NAME) - MCFG_SCREEN_UPDATE_DRIVER(mac_state, screen_update_macsonora) + m_ram->set_default_size("4M"); + m_ram->set_extra_options("6M,8M,10M"); +} - MCFG_RAM_MODIFY(RAM_TAG) - MCFG_RAM_DEFAULT_SIZE("4M") - MCFG_RAM_EXTRA_OPTIONS("8M,16M,32M,48M,64M,80M") +void mac_state::maccclas(machine_config &config) +{ + maclc2(config, false); + add_cuda(config, CUDA_341S0788); // should be 0417, but that version won't sync up properly with the '030 right now + m_via1->writepb_handler().set(FUNC(mac_state::mac_via_out_b_cdadb)); +} - MCFG_ASC_REPLACE("asc", C15M, SONORA, WRITELINE(*this, mac_state, mac_asc_irq)) - MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) - MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) +void mac_state::maclc3(machine_config &config, bool egret) +{ + maclc(config, false, false, asc_device::asc_type::SONORA); + + M68030(config, m_maincpu, 25000000); + m_maincpu->set_addrmap(AS_PROGRAM, &mac_state::maclc3_map); + m_maincpu->set_dasm_override(FUNC(mac_state::mac_dasm_override)); + + MCFG_VIDEO_START_OVERRIDE(mac_state,macsonora) + MCFG_VIDEO_RESET_OVERRIDE(mac_state,macsonora) - MCFG_EGRET_REPLACE(EGRET_341S0851) - MCFG_EGRET_RESET_CALLBACK(WRITELINE(*this, mac_state, cuda_reset_w)) - MCFG_EGRET_LINECHANGE_CALLBACK(WRITELINE(*this, mac_state, adb_linechange_w)) - MCFG_EGRET_VIA_CLOCK_CALLBACK(WRITELINE("via6522_0", via6522_device, write_cb1)) - MCFG_EGRET_VIA_DATA_CALLBACK(WRITELINE("via6522_0", via6522_device, write_cb2)) -MACHINE_CONFIG_END + m_screen->set_screen_update(FUNC(mac_state::screen_update_macsonora)); -MACHINE_CONFIG_START(mac_state::maclc520) - maclc3(config); + m_ram->set_default_size("4M"); + m_ram->set_extra_options("8M,16M,32M,48M,64M,80M"); - MCFG_EGRET_REMOVE() - MCFG_CUDA_ADD(CUDA_341S0060) - MCFG_CUDA_RESET_CALLBACK(WRITELINE(*this, mac_state, cuda_reset_w)) - MCFG_CUDA_LINECHANGE_CALLBACK(WRITELINE(*this, mac_state, adb_linechange_w)) - MCFG_CUDA_VIA_CLOCK_CALLBACK(WRITELINE("via6522_0", via6522_device, write_cb1)) - MCFG_CUDA_VIA_DATA_CALLBACK(WRITELINE("via6522_0", via6522_device, write_cb2)) + if (egret) + add_egret(config, EGRET_341S0851); +} - MCFG_DEVICE_MODIFY("via6522_0") - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, mac_state,mac_via_out_b_cdadb)) -MACHINE_CONFIG_END +void mac_state::maclc520(machine_config &config) +{ + maclc3(config, false); + add_cuda(config, CUDA_341S0060); + m_via1->writepb_handler().set(FUNC(mac_state::mac_via_out_b_cdadb)); +} -MACHINE_CONFIG_START(mac_state::maciivx) - maclc(config); +void mac_state::maciivx(machine_config &config) +{ + maclc(config, false); - MCFG_DEVICE_REPLACE("maincpu", M68030, C32M) - MCFG_DEVICE_PROGRAM_MAP(maclc3_map) - MCFG_DEVICE_DISASSEMBLE_OVERRIDE(mac_state, mac_dasm_override) + M68030(config, m_maincpu, C32M); + m_maincpu->set_addrmap(AS_PROGRAM, &mac_state::maclc3_map); + m_maincpu->set_dasm_override(FUNC(mac_state::mac_dasm_override)); MCFG_VIDEO_START_OVERRIDE(mac_state,macv8) MCFG_VIDEO_RESET_OVERRIDE(mac_state,macrbv) - MCFG_SCREEN_MODIFY(MAC_SCREEN_NAME) - MCFG_SCREEN_UPDATE_DRIVER(mac_state, screen_update_macrbvvram) - - MCFG_DEVICE_ADD("nubus", NUBUS, 0) - MCFG_NUBUS_CPU("maincpu") - MCFG_NUBUS_OUT_IRQ9_CB(WRITELINE(*this, mac_state, nubus_irq_9_w)) - MCFG_NUBUS_OUT_IRQA_CB(WRITELINE(*this, mac_state, nubus_irq_a_w)) - MCFG_NUBUS_OUT_IRQB_CB(WRITELINE(*this, mac_state, nubus_irq_b_w)) - MCFG_NUBUS_OUT_IRQC_CB(WRITELINE(*this, mac_state, nubus_irq_c_w)) - MCFG_NUBUS_OUT_IRQD_CB(WRITELINE(*this, mac_state, nubus_irq_d_w)) - MCFG_NUBUS_OUT_IRQE_CB(WRITELINE(*this, mac_state, nubus_irq_e_w)) - MCFG_NUBUS_SLOT_ADD("nubus","nbc", mac_nubus_cards, nullptr) - MCFG_NUBUS_SLOT_ADD("nubus","nbd", mac_nubus_cards, nullptr) - MCFG_NUBUS_SLOT_ADD("nubus","nbe", mac_nubus_cards, nullptr) - - MCFG_RAM_MODIFY(RAM_TAG) - MCFG_RAM_DEFAULT_SIZE("4M") - MCFG_RAM_EXTRA_OPTIONS("8M,12M,16M,20M,24M,28M,32M,36M,40M,44M,48M,52M,56M,60M,64M") - - MCFG_EGRET_REPLACE(EGRET_341S0851) - MCFG_EGRET_RESET_CALLBACK(WRITELINE(*this, mac_state, cuda_reset_w)) - MCFG_EGRET_LINECHANGE_CALLBACK(WRITELINE(*this, mac_state, adb_linechange_w)) - MCFG_EGRET_VIA_CLOCK_CALLBACK(WRITELINE("via6522_0", via6522_device, write_cb1)) - MCFG_EGRET_VIA_DATA_CALLBACK(WRITELINE("via6522_0", via6522_device, write_cb2)) -MACHINE_CONFIG_END - -MACHINE_CONFIG_START(mac_state::maciivi) - maclc(config); - - MCFG_DEVICE_REPLACE("maincpu", M68030, C15M) - MCFG_DEVICE_PROGRAM_MAP(maclc3_map) - MCFG_DEVICE_DISASSEMBLE_OVERRIDE(mac_state, mac_dasm_override) + m_screen->set_screen_update(FUNC(mac_state::screen_update_macrbvvram)); - MCFG_VIDEO_START_OVERRIDE(mac_state,macv8) - MCFG_VIDEO_RESET_OVERRIDE(mac_state,macrbv) + add_nubus(config, false); - MCFG_SCREEN_MODIFY(MAC_SCREEN_NAME) - MCFG_SCREEN_UPDATE_DRIVER(mac_state, screen_update_macrbvvram) - - MCFG_DEVICE_ADD("nubus", NUBUS, 0) - MCFG_NUBUS_CPU("maincpu") - MCFG_NUBUS_OUT_IRQ9_CB(WRITELINE(*this, mac_state, nubus_irq_9_w)) - MCFG_NUBUS_OUT_IRQA_CB(WRITELINE(*this, mac_state, nubus_irq_a_w)) - MCFG_NUBUS_OUT_IRQB_CB(WRITELINE(*this, mac_state, nubus_irq_b_w)) - MCFG_NUBUS_OUT_IRQC_CB(WRITELINE(*this, mac_state, nubus_irq_c_w)) - MCFG_NUBUS_OUT_IRQD_CB(WRITELINE(*this, mac_state, nubus_irq_d_w)) - MCFG_NUBUS_OUT_IRQE_CB(WRITELINE(*this, mac_state, nubus_irq_e_w)) - MCFG_NUBUS_SLOT_ADD("nubus","nbc", mac_nubus_cards, nullptr) - MCFG_NUBUS_SLOT_ADD("nubus","nbd", mac_nubus_cards, nullptr) - MCFG_NUBUS_SLOT_ADD("nubus","nbe", mac_nubus_cards, nullptr) - - MCFG_RAM_MODIFY(RAM_TAG) - MCFG_RAM_DEFAULT_SIZE("4M") - MCFG_RAM_EXTRA_OPTIONS("8M,12M,16M,20M,24M,28M,32M,36M,40M,44M,48M,52M,56M,60M,64M") - - MCFG_EGRET_REPLACE(EGRET_341S0851) - MCFG_EGRET_RESET_CALLBACK(WRITELINE(*this, mac_state, cuda_reset_w)) - MCFG_EGRET_LINECHANGE_CALLBACK(WRITELINE(*this, mac_state, adb_linechange_w)) - MCFG_EGRET_VIA_CLOCK_CALLBACK(WRITELINE("via6522_0", via6522_device, write_cb1)) - MCFG_EGRET_VIA_DATA_CALLBACK(WRITELINE("via6522_0", via6522_device, write_cb2)) -MACHINE_CONFIG_END - -MACHINE_CONFIG_START(mac_state::maciix) - macii(config); - - MCFG_DEVICE_REPLACE("maincpu", M68030, C15M) - MCFG_DEVICE_PROGRAM_MAP(macii_map) - MCFG_DEVICE_DISASSEMBLE_OVERRIDE(mac_state, mac_dasm_override) - - MCFG_RAM_MODIFY(RAM_TAG) - MCFG_RAM_DEFAULT_SIZE("2M") - MCFG_RAM_EXTRA_OPTIONS("8M,32M,64M,96M,128M") -MACHINE_CONFIG_END - -MACHINE_CONFIG_START(mac_state::maciicx) // IIcx is a IIx with only slots 9/a/b - maciix(config); - MCFG_NUBUS_SLOT_REMOVE("nbc") - MCFG_NUBUS_SLOT_REMOVE("nbd") - MCFG_NUBUS_SLOT_REMOVE("nbe") -MACHINE_CONFIG_END - -MACHINE_CONFIG_START(mac_state::macse30) - - MCFG_DEVICE_ADD("maincpu", M68030, C15M) - MCFG_DEVICE_PROGRAM_MAP(macse30_map) - MCFG_DEVICE_DISASSEMBLE_OVERRIDE(mac_state, mac_dasm_override) + m_ram->set_default_size("4M"); + m_ram->set_extra_options("8M,12M,16M,20M,24M,28M,32M,36M,40M,44M,48M,52M,56M,60M,64M"); + + m_egret->set_type(EGRET_341S0851); +} + +void mac_state::maciivi(machine_config &config) +{ + maciivx(config); + m_maincpu->set_clock(C15M); +} + +void mac_state::maciix(machine_config &config, bool nubus_bank1, bool nubus_bank2) +{ + macii(config, false, asc_device::asc_type::ASC, true, nubus_bank1, nubus_bank2); + + M68030(config, m_maincpu, C15M); + m_maincpu->set_addrmap(AS_PROGRAM, &mac_state::macii_map); + m_maincpu->set_dasm_override(FUNC(mac_state::mac_dasm_override)); + + m_ram->set_default_size("2M"); + m_ram->set_extra_options("8M,32M,64M,96M,128M"); +} + +void mac_state::maciicx(machine_config &config) // IIcx is a IIx with only slots 9/a/b +{ + maciix(config, true, false); +} + +void mac_state::macse30(machine_config &config) +{ + M68030(config, m_maincpu, C15M); + m_maincpu->set_addrmap(AS_PROGRAM, &mac_state::macse30_map); + m_maincpu->set_dasm_override(FUNC(mac_state::mac_dasm_override)); /* video hardware */ - MCFG_SCREEN_ADD(MAC_SCREEN_NAME, RASTER) - MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK) - MCFG_SCREEN_REFRESH_RATE(60.15) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(1260)) - MCFG_SCREEN_SIZE(MAC_H_TOTAL, MAC_V_TOTAL) - MCFG_SCREEN_VISIBLE_AREA(0, MAC_H_VIS-1, 0, MAC_V_VIS-1) - MCFG_SCREEN_UPDATE_DRIVER(mac_state, screen_update_macse30) - MCFG_SCREEN_PALETTE("palette") - - MCFG_PALETTE_ADD("palette", 2) - MCFG_PALETTE_INIT_OWNER(mac_state,mac) + SCREEN(config, m_screen, SCREEN_TYPE_RASTER); + m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK); + m_screen->set_refresh_hz(60.15); + m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(1260)); + m_screen->set_size(MAC_H_TOTAL, MAC_V_TOTAL); + m_screen->set_visarea(0, MAC_H_VIS-1, 0, MAC_V_VIS-1); + m_screen->set_screen_update(FUNC(mac_state::screen_update_macse30)); + m_screen->set_palette(m_palette); + + PALETTE(config, m_palette, 2); + m_palette->set_init(DEVICE_SELF_OWNER, FUNC(mac_state::palette_init_mac)); MCFG_VIDEO_START_OVERRIDE(mac_state,mac) - /* sound hardware */ - SPEAKER(config, "lspeaker").front_left(); - SPEAKER(config, "rspeaker").front_right(); - MCFG_ASC_ADD("asc", C15M, ASC, WRITELINE(*this, mac_state, mac_asc_irq)) - MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) - MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) + add_base_devices(config, true, true); + add_asc(config, asc_device::asc_type::ASC); + add_scsi(config); - /* devices */ - MCFG_RTC3430042_ADD("rtc", XTAL(32'768)) - - MCFG_DEVICE_ADD("scsi", SCSI_PORT, 0) - MCFG_SCSIDEV_ADD("scsi:" SCSI_PORT_DEVICE1, "harddisk", SCSIHD, SCSI_ID_6) - MCFG_SCSIDEV_ADD("scsi:" SCSI_PORT_DEVICE2, "harddisk", SCSIHD, SCSI_ID_5) - - MCFG_DEVICE_ADD("ncr5380", NCR5380, C7M) - MCFG_LEGACY_SCSI_PORT("scsi") - MCFG_NCR5380_IRQ_CB(WRITELINE(*this, mac_state, mac_scsi_irq)) - - MCFG_DEVICE_ADD("pds", NUBUS, 0) - MCFG_NUBUS_CPU("maincpu") - MCFG_NUBUS_OUT_IRQ9_CB(WRITELINE(*this, mac_state, nubus_irq_9_w)) - MCFG_NUBUS_OUT_IRQA_CB(WRITELINE(*this, mac_state, nubus_irq_a_w)) - MCFG_NUBUS_OUT_IRQB_CB(WRITELINE(*this, mac_state, nubus_irq_b_w)) - MCFG_NUBUS_OUT_IRQC_CB(WRITELINE(*this, mac_state, nubus_irq_c_w)) - MCFG_NUBUS_OUT_IRQD_CB(WRITELINE(*this, mac_state, nubus_irq_d_w)) - MCFG_NUBUS_OUT_IRQE_CB(WRITELINE(*this, mac_state, nubus_irq_e_w)) - MCFG_NUBUS_SLOT_ADD("pds","pds030", mac_pds030_cards, nullptr) - - MCFG_SWIM_ADD("fdc", mac_iwm_interface) - MCFG_LEGACY_FLOPPY_SONY_2_DRIVES_ADD(mac_floppy_interface) - - MCFG_DEVICE_ADD("scc", SCC8530, C7M) - MCFG_Z8530_INTRQ_CALLBACK(WRITELINE(*this, mac_state, set_scc_interrupt)) - - MCFG_DEVICE_ADD("via6522_0", VIA6522, 783360) - MCFG_VIA6522_READPA_HANDLER(READ8(*this, mac_state,mac_via_in_a)) - MCFG_VIA6522_READPB_HANDLER(READ8(*this, mac_state,mac_via_in_b)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, mac_state,mac_via_out_a)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, mac_state,mac_via_out_b_bbadb)) - MCFG_VIA6522_CB2_HANDLER(WRITELINE(*this, mac_state,mac_adb_via_out_cb2)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, mac_state,mac_via_irq)) - - MCFG_DEVICE_ADD("via6522_1", VIA6522, 783360) - MCFG_VIA6522_READPA_HANDLER(READ8(*this, mac_state, mac_via2_in_a)) - MCFG_VIA6522_READPB_HANDLER(READ8(*this, mac_state, mac_via2_in_b)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, mac_state,mac_via2_out_a)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, mac_state,mac_via2_out_b)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, mac_state,mac_via2_irq)) + add_nubus_pds(config, "pds030", mac_pds030_cards); - /* internal ram */ - MCFG_RAM_ADD(RAM_TAG) - MCFG_RAM_DEFAULT_SIZE("2M") - MCFG_RAM_EXTRA_OPTIONS("8M,16M,32M,48M,64M,96M,128M") + add_via1_adb(config, false); + add_via2(config); - MCFG_SOFTWARE_LIST_ADD("flop35_list","mac_flop") - MCFG_SOFTWARE_LIST_ADD("hdd_list", "mac_hdd") -MACHINE_CONFIG_END + RAM(config, m_ram); + m_ram->set_default_size("2M"); + m_ram->set_extra_options("8M,16M,32M,48M,64M,96M,128M"); -MACHINE_CONFIG_START(mac_state::macpb140) + SOFTWARE_LIST(config, "flop35_list").set_type("mac_flop", SOFTWARE_LIST_ORIGINAL_SYSTEM); +} - MCFG_DEVICE_ADD("maincpu", M68030, C15M) - MCFG_DEVICE_PROGRAM_MAP(macpb140_map) - MCFG_DEVICE_DISASSEMBLE_OVERRIDE(mac_state, mac_dasm_override) +void mac_state::macpb140(machine_config &config) +{ + M68030(config, m_maincpu, C15M); + m_maincpu->set_addrmap(AS_PROGRAM, &mac_state::macpb140_map); + m_maincpu->set_dasm_override(FUNC(mac_state::mac_dasm_override)); - /* video hardware */ - MCFG_SCREEN_ADD(MAC_SCREEN_NAME, RASTER) - MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK) - MCFG_SCREEN_REFRESH_RATE(60.15) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(1260)) - MCFG_SCREEN_SIZE(700, 480) - MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 399) - MCFG_SCREEN_UPDATE_DRIVER(mac_state, screen_update_macpb140) - MCFG_SCREEN_PALETTE("palette") - - MCFG_PALETTE_ADD("palette", 2) - MCFG_PALETTE_INIT_OWNER(mac_state,mac) + add_pb1xx_screen(config); + m_screen->set_screen_update(FUNC(mac_state::screen_update_macpb140)); + + PALETTE(config, m_palette, 2); + m_palette->set_init(DEVICE_SELF_OWNER, FUNC(mac_state::palette_init_mac)); MCFG_VIDEO_START_OVERRIDE(mac_state,macprtb) - /* sound hardware */ - SPEAKER(config, "lspeaker").front_left(); - SPEAKER(config, "rspeaker").front_right(); - MCFG_ASC_ADD("asc", C15M, ASC, WRITELINE(*this, mac_state, mac_asc_irq)) - MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) - MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) + add_asc(config, asc_device::asc_type::ASC); + add_scsi(config); + add_base_devices(config, false, true); + add_pb1xx_vias(config); - /* devices */ - MCFG_DEVICE_ADD("scsi", SCSI_PORT, 0) - MCFG_SCSIDEV_ADD("scsi:" SCSI_PORT_DEVICE1, "harddisk", SCSIHD, SCSI_ID_6) - MCFG_SCSIDEV_ADD("scsi:" SCSI_PORT_DEVICE2, "harddisk", SCSIHD, SCSI_ID_5) - - MCFG_DEVICE_ADD("ncr5380", NCR5380, C7M) - MCFG_LEGACY_SCSI_PORT("scsi") - MCFG_NCR5380_IRQ_CB(WRITELINE(*this, mac_state, mac_scsi_irq)) - - MCFG_SWIM_ADD("fdc", mac_iwm_interface) - MCFG_LEGACY_FLOPPY_SONY_2_DRIVES_ADD(mac_floppy_interface) - - MCFG_DEVICE_ADD("scc", SCC8530, C7M) - MCFG_Z8530_INTRQ_CALLBACK(WRITELINE(*this, mac_state, set_scc_interrupt)) - - MCFG_DEVICE_ADD("via6522_0", VIA6522, 783360) - MCFG_VIA6522_READPA_HANDLER(READ8(*this, mac_state,mac_via_in_a)) - MCFG_VIA6522_READPB_HANDLER(READ8(*this, mac_state,mac_via_in_b_via2pmu)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, mac_state,mac_via_out_a)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, mac_state,mac_via_out_b_via2pmu)) - MCFG_VIA6522_CB2_HANDLER(WRITELINE(*this, mac_state,mac_adb_via_out_cb2)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, mac_state,mac_via_irq)) - - MCFG_DEVICE_ADD("via6522_1", VIA6522, 783360) - MCFG_VIA6522_READPA_HANDLER(READ8(*this, mac_state, mac_via2_in_a_pmu)) - MCFG_VIA6522_READPB_HANDLER(READ8(*this, mac_state, mac_via2_in_b_pmu)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, mac_state,mac_via2_out_a_pmu)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, mac_state,mac_via2_out_b_pmu)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, mac_state,mac_via2_irq)) + RAM(config, m_ram); + m_ram->set_default_size("2M"); + m_ram->set_extra_options("4M,6M,8M"); - /* internal ram */ - MCFG_RAM_ADD(RAM_TAG) - MCFG_RAM_DEFAULT_SIZE("2M") - MCFG_RAM_EXTRA_OPTIONS("4M,6M,8M") - - MCFG_SOFTWARE_LIST_ADD("flop35_list","mac_flop") - MCFG_SOFTWARE_LIST_ADD("hdd_list", "mac_hdd") -MACHINE_CONFIG_END + SOFTWARE_LIST(config, "flop35_list").set_type("mac_flop", SOFTWARE_LIST_ORIGINAL_SYSTEM); +} // PowerBook 145 = 140 @ 25 MHz (still 2MB RAM - the 145B upped that to 4MB) -MACHINE_CONFIG_START(mac_state::macpb145) +void mac_state::macpb145(machine_config &config) +{ macpb140(config); - MCFG_DEVICE_REPLACE("maincpu", M68030, 25000000) - MCFG_DEVICE_PROGRAM_MAP(macpb140_map) - MCFG_DEVICE_DISASSEMBLE_OVERRIDE(mac_state, mac_dasm_override) + m_maincpu->set_clock(25000000); - MCFG_RAM_MODIFY(RAM_TAG) - MCFG_RAM_DEFAULT_SIZE("4M") - MCFG_RAM_EXTRA_OPTIONS("6M,8M") -MACHINE_CONFIG_END + m_ram->set_default_size("4M"); + m_ram->set_extra_options("6M,8M"); +} // PowerBook 170 = 140 @ 25 MHz with an active-matrix LCD (140/145/145B were passive) -MACHINE_CONFIG_START(mac_state::macpb170) +void mac_state::macpb170(machine_config &config) +{ macpb140(config); - MCFG_DEVICE_REPLACE("maincpu", M68030, 25000000) - MCFG_DEVICE_PROGRAM_MAP(macpb140_map) - MCFG_DEVICE_DISASSEMBLE_OVERRIDE(mac_state, mac_dasm_override) + m_maincpu->set_clock(25000000); - MCFG_RAM_MODIFY(RAM_TAG) - MCFG_RAM_DEFAULT_SIZE("4M") - MCFG_RAM_EXTRA_OPTIONS("6M,8M") -MACHINE_CONFIG_END + m_ram->set_default_size("4M"); + m_ram->set_extra_options("6M,8M"); +} -MACHINE_CONFIG_START(mac_state::macpb160) +void mac_state::macpb160(machine_config &config) +{ + M68030(config, m_maincpu, 25000000); + m_maincpu->set_addrmap(AS_PROGRAM, &mac_state::macpb160_map); + m_maincpu->set_dasm_override(FUNC(mac_state::mac_dasm_override)); - MCFG_DEVICE_ADD("maincpu", M68030, 25000000) - MCFG_DEVICE_PROGRAM_MAP(macpb160_map) - MCFG_DEVICE_DISASSEMBLE_OVERRIDE(mac_state, mac_dasm_override) + add_pb1xx_screen(config); + m_screen->set_screen_update(FUNC(mac_state::screen_update_macpb160)); - /* video hardware */ - MCFG_SCREEN_ADD(MAC_SCREEN_NAME, RASTER) - MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK) - MCFG_SCREEN_REFRESH_RATE(60.15) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(1260)) - MCFG_SCREEN_SIZE(700, 480) - MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 399) - MCFG_SCREEN_UPDATE_DRIVER(mac_state, screen_update_macpb160) - MCFG_SCREEN_PALETTE("palette") - - MCFG_PALETTE_ADD("palette", 16) - MCFG_PALETTE_INIT_OWNER(mac_state,macgsc) + PALETTE(config, m_palette, 16); + m_palette->set_init(DEVICE_SELF_OWNER, FUNC(mac_state::palette_init_macgsc)); MCFG_VIDEO_START_OVERRIDE(mac_state,macprtb) - /* sound hardware */ - SPEAKER(config, "lspeaker").front_left(); - SPEAKER(config, "rspeaker").front_right(); - MCFG_ASC_ADD("asc", C15M, ASC, WRITELINE(*this, mac_state, mac_asc_irq)) - MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) - MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) + add_asc(config, asc_device::asc_type::ASC); + add_scsi(config); + add_base_devices(config, false, true); + add_pb1xx_vias(config); - /* devices */ - MCFG_DEVICE_ADD("scsi", SCSI_PORT, 0) - MCFG_SCSIDEV_ADD("scsi:" SCSI_PORT_DEVICE1, "harddisk", SCSIHD, SCSI_ID_6) - MCFG_SCSIDEV_ADD("scsi:" SCSI_PORT_DEVICE2, "harddisk", SCSIHD, SCSI_ID_5) - - MCFG_DEVICE_ADD("ncr5380", NCR5380, C7M) - MCFG_LEGACY_SCSI_PORT("scsi") - MCFG_NCR5380_IRQ_CB(WRITELINE(*this, mac_state, mac_scsi_irq)) - - MCFG_SWIM_ADD("fdc", mac_iwm_interface) - MCFG_LEGACY_FLOPPY_SONY_2_DRIVES_ADD(mac_floppy_interface) - - MCFG_DEVICE_ADD("scc", SCC8530, C7M) - MCFG_Z8530_INTRQ_CALLBACK(WRITELINE(*this, mac_state, set_scc_interrupt)) - - MCFG_DEVICE_ADD("via6522_0", VIA6522, 783360) - MCFG_VIA6522_READPA_HANDLER(READ8(*this, mac_state,mac_via_in_a)) - MCFG_VIA6522_READPB_HANDLER(READ8(*this, mac_state,mac_via_in_b_via2pmu)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, mac_state,mac_via_out_a)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, mac_state,mac_via_out_b_via2pmu)) - MCFG_VIA6522_CB2_HANDLER(WRITELINE(*this, mac_state,mac_adb_via_out_cb2)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, mac_state,mac_via_irq)) - - MCFG_DEVICE_ADD("via6522_1", VIA6522, 783360) - MCFG_VIA6522_READPA_HANDLER(READ8(*this, mac_state, mac_via2_in_a_pmu)) - MCFG_VIA6522_READPB_HANDLER(READ8(*this, mac_state, mac_via2_in_b_pmu)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, mac_state,mac_via2_out_a_pmu)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, mac_state,mac_via2_out_b_pmu)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, mac_state,mac_via2_irq)) + RAM(config, m_ram); + m_ram->set_default_size("4M"); + m_ram->set_extra_options("8M,12M,16M"); - /* internal ram */ - MCFG_RAM_ADD(RAM_TAG) - MCFG_RAM_DEFAULT_SIZE("4M") - MCFG_RAM_EXTRA_OPTIONS("8M,12M,16M") + SOFTWARE_LIST(config, "flop35_list").set_type("mac_flop", SOFTWARE_LIST_ORIGINAL_SYSTEM); +} - MCFG_SOFTWARE_LIST_ADD("flop35_list","mac_flop") - MCFG_SOFTWARE_LIST_ADD("hdd_list", "mac_hdd") -MACHINE_CONFIG_END +void mac_state::macpb180(machine_config &config) +{ + macpb160(config); + m_maincpu->set_clock(33000000); +} -MACHINE_CONFIG_START(mac_state::macpb180) +void mac_state::macpb180c(machine_config &config) +{ macpb160(config); - MCFG_DEVICE_REPLACE("maincpu", M68030, 33000000) - MCFG_DEVICE_PROGRAM_MAP(macpb160_map) - MCFG_DEVICE_DISASSEMBLE_OVERRIDE(mac_state, mac_dasm_override) + m_maincpu->set_clock(33000000); + m_maincpu->set_addrmap(AS_PROGRAM, &mac_state::macpb165c_map); - MCFG_RAM_MODIFY(RAM_TAG) - MCFG_RAM_DEFAULT_SIZE("4M") - MCFG_RAM_EXTRA_OPTIONS("8M,12M,16M") -MACHINE_CONFIG_END + m_screen->set_size(800, 525); + m_screen->set_visarea(0, 640-1, 0, 480-1); + m_screen->set_screen_update(FUNC(mac_state::screen_update_macpbwd)); + m_screen->set_palette(finder_base::DUMMY_TAG); +} -MACHINE_CONFIG_START(mac_state::macpb180c) - macpb160(config); - MCFG_DEVICE_REPLACE("maincpu", M68030, 33000000) - MCFG_DEVICE_PROGRAM_MAP(macpb165c_map) - MCFG_DEVICE_DISASSEMBLE_OVERRIDE(mac_state, mac_dasm_override) - - MCFG_SCREEN_MODIFY(MAC_SCREEN_NAME) - MCFG_SCREEN_SIZE(800, 525) - MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1) - MCFG_SCREEN_UPDATE_DRIVER(mac_state, screen_update_macpbwd) - MCFG_SCREEN_NO_PALETTE - - MCFG_RAM_MODIFY(RAM_TAG) - MCFG_RAM_DEFAULT_SIZE("4M") - MCFG_RAM_EXTRA_OPTIONS("8M,12M,16M") -MACHINE_CONFIG_END - -MACHINE_CONFIG_START(mac_state::macpd210) +void mac_state::macpd210(machine_config &config) +{ macpb160(config); - MCFG_DEVICE_REPLACE("maincpu", M68030, 25000000) - MCFG_DEVICE_PROGRAM_MAP(macpd210_map) - MCFG_DEVICE_DISASSEMBLE_OVERRIDE(mac_state, mac_dasm_override) + m_maincpu->set_addrmap(AS_PROGRAM, &mac_state::macpd210_map); - MCFG_RAM_MODIFY(RAM_TAG) - MCFG_RAM_DEFAULT_SIZE("4M") - MCFG_RAM_EXTRA_OPTIONS("8M,12M,16M,20M,24M") -MACHINE_CONFIG_END + m_ram->set_extra_options("8M,12M,16M,20M,24M"); +} -MACHINE_CONFIG_START(mac_state::macclas2) - maclc(config); - MCFG_DEVICE_REPLACE("maincpu", M68030, C15M) - MCFG_DEVICE_PROGRAM_MAP(maclc_map) - MCFG_DEVICE_DISASSEMBLE_OVERRIDE(mac_state, mac_dasm_override) +void mac_state::macclas2(machine_config &config) +{ + maclc(config, false, true, asc_device::asc_type::EAGLE); + + M68030(config, m_maincpu, C15M); + m_maincpu->set_addrmap(AS_PROGRAM, &mac_state::maclc_map); + m_maincpu->set_dasm_override(FUNC(mac_state::mac_dasm_override)); MCFG_VIDEO_START_OVERRIDE(mac_state,macv8) MCFG_VIDEO_RESET_OVERRIDE(mac_state,maceagle) - MCFG_SCREEN_MODIFY(MAC_SCREEN_NAME) - MCFG_SCREEN_SIZE(MAC_H_TOTAL, MAC_V_TOTAL) - MCFG_SCREEN_VISIBLE_AREA(0, MAC_H_VIS-1, 0, MAC_V_VIS-1) - MCFG_SCREEN_UPDATE_DRIVER(mac_state, screen_update_macrbv) - - MCFG_ASC_REPLACE("asc", C15M, EAGLE, WRITELINE(*this, mac_state, mac_asc_irq)) - MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) - MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) + m_screen->set_size(MAC_H_TOTAL, MAC_V_TOTAL); + m_screen->set_visarea(0, MAC_H_VIS-1, 0, MAC_V_VIS-1); + m_screen->set_screen_update(FUNC(mac_state::screen_update_macrbv)); - MCFG_RAM_MODIFY(RAM_TAG) - MCFG_RAM_DEFAULT_SIZE("10M") - MCFG_RAM_EXTRA_OPTIONS("2M,4M,6M,8M,10M") + m_asc->set_type(asc_device::asc_type::EAGLE); - MCFG_EGRET_REPLACE(EGRET_341S0851) - MCFG_EGRET_RESET_CALLBACK(WRITELINE(*this, mac_state, cuda_reset_w)) - MCFG_EGRET_LINECHANGE_CALLBACK(WRITELINE(*this, mac_state, adb_linechange_w)) - MCFG_EGRET_VIA_CLOCK_CALLBACK(WRITELINE("via6522_0", via6522_device, write_cb1)) - MCFG_EGRET_VIA_DATA_CALLBACK(WRITELINE("via6522_0", via6522_device, write_cb2)) -MACHINE_CONFIG_END + m_ram->set_default_size("10M"); + m_ram->set_extra_options("2M,4M,6M,8M,10M"); -MACHINE_CONFIG_START(mac_state::maciici) - macii(config); - - MCFG_DEVICE_REPLACE("maincpu", M68030, 25000000) - MCFG_DEVICE_PROGRAM_MAP(maciici_map) - MCFG_DEVICE_DISASSEMBLE_OVERRIDE(mac_state, mac_dasm_override) + m_egret->set_type(EGRET_341S0851); +} - MCFG_PALETTE_MODIFY("palette") - MCFG_PALETTE_ENTRIES(256) +void mac_state::maciici(machine_config &config) +{ + macii(config, false, asc_device::asc_type::ASC, true, false, true); - // IIci only has slots c/d/e - MCFG_NUBUS_SLOT_REMOVE("nb9") - MCFG_NUBUS_SLOT_REMOVE("nba") - MCFG_NUBUS_SLOT_REMOVE("nbb") + M68030(config, m_maincpu, 25000000); + m_maincpu->set_addrmap(AS_PROGRAM, &mac_state::maciici_map); + m_maincpu->set_dasm_override(FUNC(mac_state::mac_dasm_override)); MCFG_VIDEO_START_OVERRIDE(mac_state,macrbv) MCFG_VIDEO_RESET_OVERRIDE(mac_state,macrbv) - MCFG_SCREEN_ADD(MAC_SCREEN_NAME, RASTER) - MCFG_SCREEN_RAW_PARAMS(25175000, 800, 0, 640, 525, 0, 480) - MCFG_SCREEN_SIZE(640, 870) - MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1) - MCFG_SCREEN_UPDATE_DRIVER(mac_state, screen_update_macrbv) - MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, mac_state, mac_rbv_vbl)) + SCREEN(config, m_screen, SCREEN_TYPE_RASTER); + m_screen->set_raw(25175000, 800, 0, 640, 525, 0, 480); + m_screen->set_size(640, 870); + m_screen->set_visarea(0, 640-1, 0, 480-1); + m_screen->set_screen_update(FUNC(mac_state::screen_update_macrbv)); + m_screen->screen_vblank().set(FUNC(mac_state::mac_rbv_vbl)); config.set_default_layout(layout_mac); /* internal ram */ - MCFG_RAM_MODIFY(RAM_TAG) - MCFG_RAM_DEFAULT_SIZE("2M") - MCFG_RAM_EXTRA_OPTIONS("4M,8M,16M,32M,48M,64M,128M") -MACHINE_CONFIG_END - -MACHINE_CONFIG_START(mac_state::maciisi) - macii(config); - - MCFG_DEVICE_REPLACE("maincpu", M68030, 20000000) - MCFG_DEVICE_PROGRAM_MAP(maciici_map) - MCFG_DEVICE_DISASSEMBLE_OVERRIDE(mac_state, mac_dasm_override) + m_ram->set_default_size("2M"); + m_ram->set_extra_options("4M,8M,16M,32M,48M,64M,128M"); +} - MCFG_PALETTE_MODIFY("palette") - MCFG_PALETTE_ENTRIES(256) +void mac_state::maciisi(machine_config &config) +{ + macii(config, false, asc_device::asc_type::ASC, false); - MCFG_NUBUS_SLOT_REMOVE("nb9") - MCFG_NUBUS_SLOT_REMOVE("nba") - MCFG_NUBUS_SLOT_REMOVE("nbb") - MCFG_NUBUS_SLOT_REMOVE("nbc") - MCFG_NUBUS_SLOT_REMOVE("nbd") - MCFG_NUBUS_SLOT_REMOVE("nbe") - MCFG_DEVICE_REMOVE("nubus") + M68030(config, m_maincpu, 20000000); + m_maincpu->set_addrmap(AS_PROGRAM, &mac_state::maciici_map); + m_maincpu->set_dasm_override(FUNC(mac_state::mac_dasm_override)); MCFG_VIDEO_START_OVERRIDE(mac_state,macrbv) MCFG_VIDEO_RESET_OVERRIDE(mac_state,macrbv) - MCFG_SCREEN_ADD(MAC_SCREEN_NAME, RASTER) - MCFG_SCREEN_RAW_PARAMS(25175000, 800, 0, 640, 525, 0, 480) - MCFG_SCREEN_SIZE(640, 870) - MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1) - MCFG_SCREEN_UPDATE_DRIVER(mac_state, screen_update_macrbv) - MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, mac_state, mac_rbv_vbl)) + SCREEN(config, m_screen, SCREEN_TYPE_RASTER); + m_screen->set_raw(25175000, 800, 0, 640, 525, 0, 480); + m_screen->set_size(640, 870); + m_screen->set_visarea(0, 640-1, 0, 480-1); + m_screen->set_screen_update(FUNC(mac_state::screen_update_macrbv)); + m_screen->screen_vblank().set(FUNC(mac_state::mac_rbv_vbl)); config.set_default_layout(layout_mac); - /* internal ram */ - MCFG_RAM_MODIFY(RAM_TAG) - MCFG_RAM_DEFAULT_SIZE("2M") - MCFG_RAM_EXTRA_OPTIONS("4M,8M,16M,32M,48M,64M,128M") - - MCFG_DEVICE_MODIFY("via6522_0") - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, mac_state,mac_via_out_b_egadb)) + m_ram->set_default_size("2M"); + m_ram->set_extra_options("4M,8M,16M,32M,48M,64M,128M"); - MCFG_EGRET_ADD(EGRET_344S0100) - MCFG_EGRET_RESET_CALLBACK(WRITELINE(*this, mac_state, cuda_reset_w)) - MCFG_EGRET_LINECHANGE_CALLBACK(WRITELINE(*this, mac_state, adb_linechange_w)) - MCFG_EGRET_VIA_CLOCK_CALLBACK(WRITELINE("via6522_0", via6522_device, write_cb1)) - MCFG_EGRET_VIA_DATA_CALLBACK(WRITELINE("via6522_0", via6522_device, write_cb2)) - MCFG_QUANTUM_PERFECT_CPU("maincpu") -MACHINE_CONFIG_END + m_via1->writepb_handler().set(FUNC(mac_state::mac_via_out_b_egadb)); -MACHINE_CONFIG_START(mac_state::pwrmac) + add_egret(config, EGRET_344S0100); +} - /* basic machine hardware */ - MCFG_DEVICE_ADD("maincpu", PPC601, 60000000) - MCFG_DEVICE_PROGRAM_MAP(pwrmac_map) +void mac_state::pwrmac(machine_config &config) +{ + PPC601(config, m_maincpu, 60000000); + m_maincpu->set_addrmap(AS_PROGRAM, &mac_state::pwrmac_map); - /* video hardware */ - MCFG_SCREEN_ADD(MAC_SCREEN_NAME, RASTER) + SCREEN(config, m_screen, SCREEN_TYPE_RASTER); // dot clock, htotal, hstart, hend, vtotal, vstart, vend - MCFG_SCREEN_RAW_PARAMS(25175000, 800, 0, 640, 525, 0, 480) - MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK) - MCFG_SCREEN_SIZE(1024, 768) - MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1) - MCFG_SCREEN_UPDATE_DRIVER(mac_state, screen_update_macrbv) + m_screen->set_raw(25175000, 800, 0, 640, 525, 0, 480); + m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK); + m_screen->set_size(1024, 768); + m_screen->set_visarea(0, 640-1, 0, 480-1); + m_screen->set_screen_update(FUNC(mac_state::screen_update_macrbv)); - MCFG_PALETTE_ADD("palette", 256) + PALETTE(config, m_palette, 256); MCFG_VIDEO_START_OVERRIDE(mac_state,macsonora) MCFG_VIDEO_RESET_OVERRIDE(mac_state,macrbv) - /* sound hardware */ SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); - MCFG_AWACS_ADD("awacs", 44100) - MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) - MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) + AWACS(config, m_awacs, 44100); + m_awacs->add_route(0, "lspeaker", 1.0); + m_awacs->add_route(1, "rspeaker", 1.0); - /* devices */ - MCFG_DEVICE_ADD("scsi", SCSI_PORT, 0) - MCFG_SCSIDEV_ADD("scsi:" SCSI_PORT_DEVICE1, "harddisk", SCSIHD, SCSI_ID_6) - MCFG_SCSIDEV_ADD("scsi:" SCSI_PORT_DEVICE2, "harddisk", SCSIHD, SCSI_ID_5) - - MCFG_DEVICE_ADD("ncr5380", NCR5380, C7M) - MCFG_LEGACY_SCSI_PORT("scsi") - MCFG_NCR5380_IRQ_CB(WRITELINE(*this, mac_state, mac_scsi_irq)) - - MCFG_IWM_ADD("fdc", mac_iwm_interface) - MCFG_LEGACY_FLOPPY_SONY_2_DRIVES_ADD(mac_floppy_interface) - - MCFG_DEVICE_ADD("scc", SCC8530, C7M) - MCFG_Z8530_INTRQ_CALLBACK(WRITELINE(*this, mac_state, set_scc_interrupt)) - - MCFG_DEVICE_ADD("via6522_0", VIA6522, 783360) - MCFG_VIA6522_READPA_HANDLER(READ8(*this, mac_state,mac_via_in_a)) - MCFG_VIA6522_READPB_HANDLER(READ8(*this, mac_state,mac_via_in_b)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, mac_state,mac_via_out_a)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, mac_state,mac_via_out_b_cdadb)) - MCFG_VIA6522_CB2_HANDLER(WRITELINE(*this, mac_state,mac_adb_via_out_cb2)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, mac_state,mac_via_irq)) - - MCFG_DEVICE_ADD("via6522_1", VIA6522, 783360) - MCFG_VIA6522_READPA_HANDLER(READ8(*this, mac_state, mac_via2_in_a)) - MCFG_VIA6522_READPB_HANDLER(READ8(*this, mac_state, mac_via2_in_b)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, mac_state,mac_via2_out_a)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, mac_state,mac_via2_out_b)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, mac_state,mac_via2_irq)) + add_scsi(config); + add_base_devices(config, false, false); - /* internal ram */ - MCFG_RAM_ADD(RAM_TAG) - MCFG_RAM_DEFAULT_SIZE("8M") - MCFG_RAM_EXTRA_OPTIONS("16M,32M,64M,128M") - - MCFG_CUDA_ADD(CUDA_341S0060) - MCFG_CUDA_RESET_CALLBACK(WRITELINE(*this, mac_state, cuda_reset_w)) - MCFG_CUDA_LINECHANGE_CALLBACK(WRITELINE(*this, mac_state, adb_linechange_w)) - MCFG_CUDA_VIA_CLOCK_CALLBACK(WRITELINE("via6522_0", via6522_device, write_cb1)) - MCFG_CUDA_VIA_DATA_CALLBACK(WRITELINE("via6522_0", via6522_device, write_cb2)) -MACHINE_CONFIG_END - -MACHINE_CONFIG_START(mac_state::macqd700) + add_via1_adb(config, false); + m_via1->writepb_handler().set(FUNC(mac_state::mac_via_out_b_cdadb)); + + add_via2(config); + + RAM(config, m_ram); + m_ram->set_default_size("8M"); + m_ram->set_extra_options("16M,32M,64M,128M"); + + add_cuda(config, CUDA_341S0060); +} + +void mac_state::macqd700(machine_config &config) +{ /* basic machine hardware */ - MCFG_DEVICE_ADD("maincpu", M68040, 25000000) - MCFG_DEVICE_PROGRAM_MAP(quadra700_map) - MCFG_DEVICE_DISASSEMBLE_OVERRIDE(mac_state, mac_dasm_override) + M68040(config, m_maincpu, 25000000); + m_maincpu->set_addrmap(AS_PROGRAM, &mac_state::quadra700_map); + m_maincpu->set_dasm_override(FUNC(mac_state::mac_dasm_override)); - MCFG_SCREEN_ADD(MAC_SCREEN_NAME, RASTER) - MCFG_SCREEN_REFRESH_RATE(75.08) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(1260)) - MCFG_SCREEN_SIZE(1152, 870) - MCFG_SCREEN_VISIBLE_AREA(0, 1152-1, 0, 870-1) - MCFG_SCREEN_UPDATE_DRIVER(mac_state, screen_update_macdafb) + SCREEN(config, m_screen, SCREEN_TYPE_RASTER); + m_screen->set_refresh_hz(75.08); + m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(1260)); + m_screen->set_size(1152, 870); + m_screen->set_visarea(0, 1152-1, 0, 870-1); + m_screen->set_screen_update(FUNC(mac_state::screen_update_macdafb)); MCFG_VIDEO_START_OVERRIDE(mac_state,macdafb) MCFG_VIDEO_RESET_OVERRIDE(mac_state,macdafb) - MCFG_PALETTE_ADD("palette", 256) + PALETTE(config, m_palette, 256); - /* sound hardware */ - SPEAKER(config, "lspeaker").front_left(); - SPEAKER(config, "rspeaker").front_right(); - MCFG_ASC_ADD("asc", C15M, EASC, WRITELINE(*this, mac_state, mac_asc_irq)) - MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) - MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) + add_asc(config, asc_device::asc_type::EASC); + add_base_devices(config, true, false); - /* devices */ - MCFG_RTC3430042_ADD("rtc", XTAL(32'768)) - MCFG_DEVICE_ADD("nubus", NUBUS, 0) - MCFG_NUBUS_CPU("maincpu") - MCFG_NUBUS_OUT_IRQ9_CB(WRITELINE(*this, mac_state, nubus_irq_9_w)) - MCFG_NUBUS_OUT_IRQA_CB(WRITELINE(*this, mac_state, nubus_irq_a_w)) - MCFG_NUBUS_OUT_IRQB_CB(WRITELINE(*this, mac_state, nubus_irq_b_w)) - MCFG_NUBUS_OUT_IRQC_CB(WRITELINE(*this, mac_state, nubus_irq_c_w)) - MCFG_NUBUS_OUT_IRQD_CB(WRITELINE(*this, mac_state, nubus_irq_d_w)) - MCFG_NUBUS_OUT_IRQE_CB(WRITELINE(*this, mac_state, nubus_irq_e_w)) - MCFG_NUBUS_SLOT_ADD("nubus","nbd", mac_nubus_cards, nullptr) - MCFG_NUBUS_SLOT_ADD("nubus","nbe", mac_nubus_cards, nullptr) - - MCFG_IWM_ADD("fdc", mac_iwm_interface) - MCFG_LEGACY_FLOPPY_SONY_2_DRIVES_ADD(mac_floppy_interface) - - MCFG_DEVICE_ADD("scc", SCC8530, C7M) - MCFG_Z8530_INTRQ_CALLBACK(WRITELINE(*this, mac_state, set_scc_interrupt)) - - MCFG_DEVICE_ADD("via6522_0", VIA6522, C7M/10) - MCFG_VIA6522_READPA_HANDLER(READ8(*this, mac_state,mac_via_in_a)) - MCFG_VIA6522_READPB_HANDLER(READ8(*this, mac_state,mac_via_in_b)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, mac_state,mac_via_out_a)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, mac_state,mac_via_out_b_bbadb)) - MCFG_VIA6522_CB2_HANDLER(WRITELINE(*this, mac_state,mac_adb_via_out_cb2)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, mac_state,mac_via_irq)) - - MCFG_DEVICE_ADD("via6522_1", VIA6522, C7M/10) - MCFG_VIA6522_READPA_HANDLER(READ8(*this, mac_state, mac_via2_in_a)) - MCFG_VIA6522_READPB_HANDLER(READ8(*this, mac_state, mac_via2_in_b)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, mac_state,mac_via2_out_a)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, mac_state,mac_via2_out_b)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, mac_state,mac_via2_irq)) - - MCFG_DEVICE_ADD("scsi", SCSI_PORT, 0) - MCFG_SCSIDEV_ADD("scsi:" SCSI_PORT_DEVICE1, "harddisk", SCSIHD, SCSI_ID_6) - MCFG_SCSIDEV_ADD("scsi:" SCSI_PORT_DEVICE2, "harddisk", SCSIHD, SCSI_ID_5) - - MCFG_DEVICE_ADD(MAC_539X_1_TAG, NCR539X, C7M) - MCFG_LEGACY_SCSI_PORT("scsi") - MCFG_NCR539X_OUT_IRQ_CB(WRITELINE(*this, mac_state, irq_539x_1_w)) - MCFG_NCR539X_OUT_DRQ_CB(WRITELINE(*this, mac_state, drq_539x_1_w)) + add_nubus(config, false, false); + NUBUS_SLOT(config, "nbd", "nubus", mac_nubus_cards, nullptr); + NUBUS_SLOT(config, "nbe", "nubus", mac_nubus_cards, nullptr); + + add_via1_adb(config, false); + m_via1->readpb_handler().set(FUNC(mac_state::mac_via_in_b)); + + add_via2(config); + + scsi_port_device &scsibus(SCSI_PORT(config, "scsi")); + scsibus.set_slot_device(1, "harddisk", SCSIHD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_6)); + scsibus.set_slot_device(2, "harddisk", SCSIHD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_5)); + + NCR539X(config, m_539x_1, C7M); + m_539x_1->set_scsi_port("scsi"); + m_539x_1->irq_callback().set(FUNC(mac_state::irq_539x_1_w)); + m_539x_1->drq_callback().set(FUNC(mac_state::drq_539x_1_w)); /* internal ram */ - MCFG_RAM_ADD(RAM_TAG) - MCFG_RAM_DEFAULT_SIZE("4M") - MCFG_RAM_EXTRA_OPTIONS("8M,16M,32M,64M,68M,72M,80M,96M,128M") + RAM(config, m_ram); + m_ram->set_default_size("4M"); + m_ram->set_extra_options("8M,16M,32M,64M,68M,72M,80M,96M,128M"); - // software list - MCFG_SOFTWARE_LIST_ADD("flop35_list","mac_flop") - MCFG_SOFTWARE_LIST_ADD("hdd_list", "mac_hdd") -MACHINE_CONFIG_END + SOFTWARE_LIST(config, "flop35_list").set_type("mac_flop", SOFTWARE_LIST_ORIGINAL_SYSTEM); +} static INPUT_PORTS_START( macadb ) PORT_START("MOUSE0") /* Mouse - button */ diff --git a/src/mame/drivers/mac128.cpp b/src/mame/drivers/mac128.cpp index a53a0d014fc..84ab5acf0ca 100644 --- a/src/mame/drivers/mac128.cpp +++ b/src/mame/drivers/mac128.cpp @@ -170,7 +170,7 @@ public: void init_macplus(); private: - required_device<cpu_device> m_maincpu; + required_device<m68000_device> m_maincpu; required_device<via6522_device> m_via; required_device<ram_device> m_ram; optional_device<ncr5380_device> m_ncr5380; @@ -219,6 +219,7 @@ private: int count_x, count_y; int m_last_was_x; int m_screen_buffer; + emu_timer *m_scan_timer; // interrupts int m_scc_interrupt, m_via_interrupt, m_scsi_interrupt, m_last_taken_interrupt; @@ -244,9 +245,9 @@ private: DECLARE_WRITE_LINE_MEMBER(mac_scsi_irq); DECLARE_WRITE_LINE_MEMBER(set_scc_interrupt); - TIMER_DEVICE_CALLBACK_MEMBER(mac_scanline); + TIMER_CALLBACK_MEMBER(mac_scanline); DECLARE_VIDEO_START(mac); - DECLARE_PALETTE_INIT(mac); + void palette_init(palette_device &palette); uint32_t screen_update_mac(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); #ifndef MAC_USE_EMULATED_KBD TIMER_CALLBACK_MEMBER(kbd_clock); @@ -288,6 +289,9 @@ void mac128_state::machine_start() m_ram_size = m_ram->size()>>1; m_ram_mask = m_ram_size - 1; m_rom_ptr = (u16*)memregion("bootrom")->base(); + + if (!m_scan_timer) + m_scan_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(mac128_state::mac_scanline), this)); } void mac128_state::machine_reset() @@ -312,6 +316,9 @@ void mac128_state::machine_reset() m_irq_count = 0; m_ca1_data = 0; m_ca2_data = 0; + + const int next_vpos = m_screen->vpos() + 1; + m_scan_timer->adjust(m_screen->time_until_pos(next_vpos), next_vpos); } READ16_MEMBER(mac128_state::ram_r) @@ -433,7 +440,7 @@ void mac128_state::update_volume() } } -TIMER_DEVICE_CALLBACK_MEMBER(mac128_state::mac_scanline) +TIMER_CALLBACK_MEMBER(mac128_state::mac_scanline) { int scanline = param; uint16_t *mac_snd_buf_ptr; @@ -458,6 +465,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(mac128_state::mac_scanline) } m_dac->write(mac_snd_buf_ptr[scanline] >> 8); + m_scan_timer->adjust(m_screen->time_until_pos(scanline+1), (scanline+1) % m_screen->height()); } WRITE_LINE_MEMBER(mac128_state::mac_scsi_irq) @@ -673,7 +681,7 @@ READ16_MEMBER ( mac128_state::mac_via_r ) if (LOG_VIA) logerror("mac_via_r: offset=0x%02x\n", offset); - data = m_via->read(space, offset); + data = m_via->read(offset); m_maincpu->adjust_icount(m_via_cycles); @@ -689,9 +697,9 @@ WRITE16_MEMBER ( mac128_state::mac_via_w ) logerror("mac_via_w: offset=0x%02x data=0x%08x\n", offset, data); if (ACCESSING_BITS_0_7) - m_via->write(space, offset, data & 0xff); + m_via->write(offset, data & 0xff); if (ACCESSING_BITS_8_15) - m_via->write(space, offset, (data >> 8) & 0xff); + m_via->write(offset, (data >> 8) & 0xff); m_maincpu->adjust_icount(m_via_cycles); } @@ -1221,7 +1229,7 @@ void mac128_state::mac128_state_load() { } -PALETTE_INIT_MEMBER(mac128_state,mac) +void mac128_state::palette_init(palette_device &palette) { palette.set_pen_color(0, 0xff, 0xff, 0xff); palette.set_pen_color(1, 0x00, 0x00, 0x00); @@ -1324,92 +1332,90 @@ static const floppy_interface mac_floppy_interface = "floppy_3_5" }; -MACHINE_CONFIG_START(mac128_state::mac512ke) +void mac128_state::mac512ke(machine_config &config) +{ /* basic machine hardware */ - MCFG_DEVICE_ADD("maincpu", M68000, C7M) /* 7.8336 MHz */ - MCFG_DEVICE_PROGRAM_MAP(mac512ke_map) - MCFG_QUANTUM_TIME(attotime::from_hz(60)) + M68000(config, m_maincpu, C7M); /* 7.8336 MHz */ + m_maincpu->set_addrmap(AS_PROGRAM, &mac128_state::mac512ke_map); + config.m_minimum_quantum = attotime::from_hz(60); /* video hardware */ - MCFG_SCREEN_ADD(MAC_SCREEN_NAME, RASTER) - MCFG_SCREEN_RAW_PARAMS(C7M*2, MAC_H_TOTAL, 0, MAC_H_VIS, MAC_V_TOTAL, 0, MAC_V_VIS) - MCFG_SCREEN_UPDATE_DRIVER(mac128_state, screen_update_mac) - MCFG_SCREEN_PALETTE("palette") + SCREEN(config, m_screen, SCREEN_TYPE_RASTER); + m_screen->set_raw(C7M*2, MAC_H_TOTAL, 0, MAC_H_VIS, MAC_V_TOTAL, 0, MAC_V_VIS); + m_screen->set_screen_update(FUNC(mac128_state::screen_update_mac)); + m_screen->set_palette("palette"); - MCFG_PALETTE_ADD("palette", 2) - MCFG_PALETTE_INIT_OWNER(mac128_state,mac) + palette_device &palette(PALETTE(config, "palette", 2)); + palette.set_init(DEVICE_SELF_OWNER, FUNC(mac128_state::palette_init)); MCFG_VIDEO_START_OVERRIDE(mac128_state,mac) - MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", mac128_state, mac_scanline, "screen", 0, 1) - /* sound hardware */ SPEAKER(config, "speaker").front_center(); - MCFG_DEVICE_ADD(DAC_TAG, DAC_8BIT_PWM, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25) // 2 x ls161 - MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0) - MCFG_SOUND_ROUTE(0, DAC_TAG, 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, DAC_TAG, -1.0, DAC_VREF_NEG_INPUT) + DAC_8BIT_PWM(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25); // 2 x ls161 + voltage_regulator_device &vreg(VOLTAGE_REGULATOR(config, "vref")); + vreg.set_output(5.0); + vreg.add_route(0, DAC_TAG, 1.0, DAC_VREF_POS_INPUT); + vreg.add_route(0, DAC_TAG, -1.0, DAC_VREF_NEG_INPUT); /* devices */ - MCFG_RTC3430042_ADD("rtc", 32.768_kHz_XTAL) - MCFG_IWM_ADD("fdc", mac_iwm_interface) - MCFG_LEGACY_FLOPPY_SONY_2_DRIVES_ADD(mac_floppy_interface) - - MCFG_DEVICE_ADD("scc", SCC85C30, C7M) - MCFG_Z80SCC_OFFSETS(C3_7M, 0, C3_7M, 0) - MCFG_Z80SCC_OUT_INT_CB(WRITELINE(*this, mac128_state, set_scc_interrupt)) - - MCFG_DEVICE_ADD("via6522_0", VIA6522, 1000000) - MCFG_VIA6522_READPA_HANDLER(READ8(*this, mac128_state,mac_via_in_a)) - MCFG_VIA6522_READPB_HANDLER(READ8(*this, mac128_state,mac_via_in_b)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, mac128_state,mac_via_out_a)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, mac128_state,mac_via_out_b)) - MCFG_VIA6522_CB2_HANDLER(WRITELINE(*this, mac128_state,mac_via_out_cb2)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, mac128_state,mac_via_irq)) - - MCFG_MACKBD_ADD(MACKBD_TAG) + RTC3430042(config, m_rtc, 32.768_kHz_XTAL); + IWM(config, m_iwm, 0).set_config(&mac_iwm_interface); + sonydriv_floppy_image_device::legacy_2_drives_add(config, &mac_floppy_interface); + + SCC85C30(config, m_scc, C7M); + m_scc->configure_channels(C3_7M, 0, C3_7M, 0); + m_scc->out_int_callback().set(FUNC(mac128_state::set_scc_interrupt)); + + VIA6522(config, m_via, 1000000); + m_via->readpa_handler().set(FUNC(mac128_state::mac_via_in_a)); + m_via->readpb_handler().set(FUNC(mac128_state::mac_via_in_b)); + m_via->writepa_handler().set(FUNC(mac128_state::mac_via_out_a)); + m_via->writepb_handler().set(FUNC(mac128_state::mac_via_out_b)); + m_via->cb2_handler().set(FUNC(mac128_state::mac_via_out_cb2)); + m_via->irq_handler().set(FUNC(mac128_state::mac_via_irq)); + #ifdef MAC_USE_EMULATED_KBD - MCFG_MACKBD_DATAOUT_HANDLER(WRITELINE("via6522_0", via6522_device, write_cb2)) - MCFG_MACKBD_CLKOUT_HANDLER(WRITELINE(*this, mac128_state, mac_kbd_clk_in)) + mackbd_device &mackbd(MACKBD(config, MACKBD_TAG, 0)); + mackbd.dataout_handler().set(m_via, FUNC(via6522_device::write_cb2)); + mackbd.clkout_handler().set(FUNC(mac128_state::mac_kbd_clk_in)); +#else + MACKBD(config, MACKBD_TAG, 0); #endif /* internal ram */ - MCFG_RAM_ADD(RAM_TAG) - MCFG_RAM_DEFAULT_SIZE("512K") + RAM(config, m_ram); + m_ram->set_default_size("512K"); // software list - MCFG_SOFTWARE_LIST_ADD("flop35_list","mac_flop") - MCFG_SOFTWARE_LIST_ADD("hdd_list", "mac_hdd") -MACHINE_CONFIG_END + SOFTWARE_LIST(config, "flop35_list").set_type("mac_flop", SOFTWARE_LIST_ORIGINAL_SYSTEM); + SOFTWARE_LIST(config, "hdd_list").set_type("mac_hdd", SOFTWARE_LIST_ORIGINAL_SYSTEM); +} -MACHINE_CONFIG_START(mac128_state::mac128k) +void mac128_state::mac128k(machine_config &config) +{ mac512ke(config); - - /* internal ram */ - MCFG_RAM_MODIFY(RAM_TAG) - MCFG_RAM_DEFAULT_SIZE("128K") -MACHINE_CONFIG_END + m_ram->set_default_size("128K"); +} -MACHINE_CONFIG_START(mac128_state::macplus) +void mac128_state::macplus(machine_config &config) +{ mac512ke(config); - MCFG_DEVICE_MODIFY( "maincpu" ) - MCFG_DEVICE_PROGRAM_MAP(macplus_map) - - MCFG_DEVICE_ADD("scsi", SCSI_PORT, 0) - MCFG_SCSIDEV_ADD("scsi:" SCSI_PORT_DEVICE1, "harddisk", SCSIHD, SCSI_ID_6) - MCFG_SCSIDEV_ADD("scsi:" SCSI_PORT_DEVICE2, "harddisk", SCSIHD, SCSI_ID_5) + m_maincpu->set_addrmap(AS_PROGRAM, &mac128_state::macplus_map); - MCFG_DEVICE_ADD("ncr5380", NCR5380, C7M) - MCFG_LEGACY_SCSI_PORT("scsi") - MCFG_NCR5380_IRQ_CB(WRITELINE(*this, mac128_state, mac_scsi_irq)) + scsi_port_device &scsibus(SCSI_PORT(config, "scsi")); + scsibus.set_slot_device(1, "harddisk", SCSIHD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_6)); + scsibus.set_slot_device(2, "harddisk", SCSIHD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_5)); - MCFG_LEGACY_FLOPPY_SONY_2_DRIVES_MODIFY(mac_floppy_interface) + NCR5380(config, m_ncr5380, C7M); + m_ncr5380->set_scsi_port("scsi"); + m_ncr5380->irq_callback().set(FUNC(mac128_state::mac_scsi_irq)); /* internal ram */ - MCFG_RAM_MODIFY(RAM_TAG) - MCFG_RAM_DEFAULT_SIZE("4M") - MCFG_RAM_EXTRA_OPTIONS("1M,2M,2560K,4M") -MACHINE_CONFIG_END + m_ram->set_default_size("4M"); + m_ram->set_extra_options("1M,2M,2560K,4M"); +} static INPUT_PORTS_START( macplus ) PORT_START("MOUSE0") /* Mouse - button */ diff --git a/src/mame/drivers/macpci.cpp b/src/mame/drivers/macpci.cpp index a4b9ad2c86a..3bc9360b946 100644 --- a/src/mame/drivers/macpci.cpp +++ b/src/mame/drivers/macpci.cpp @@ -91,54 +91,57 @@ uint32_t macpci_state::screen_update_pippin(screen_device &screen, bitmap_ind16 return 0; } -MACHINE_CONFIG_START(macpci_state::pippin) +void macpci_state::pippin(machine_config &config) +{ /* basic machine hardware */ - MCFG_DEVICE_ADD("maincpu", PPC603, 66000000) - MCFG_DEVICE_PROGRAM_MAP(pippin_mem) + PPC603(config, m_maincpu, 66000000); + m_maincpu->set_addrmap(AS_PROGRAM, &macpci_state::pippin_mem); /* video hardware */ - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */ - MCFG_SCREEN_SIZE(640, 480) - MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1) - MCFG_SCREEN_UPDATE_DRIVER(macpci_state, screen_update_pippin) - MCFG_SCREEN_PALETTE("palette") + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); + screen.set_refresh_hz(60); + screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */ + screen.set_size(640, 480); + screen.set_visarea(0, 640-1, 0, 480-1); + screen.set_screen_update(FUNC(macpci_state::screen_update_pippin)); + screen.set_palette("palette"); - MCFG_PALETTE_ADD_MONOCHROME("palette") + palette_device &palette(PALETTE(config, "palette", 2)); + palette.set_init("palette", FUNC(palette_device::palette_init_monochrome)); /* sound hardware */ SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); - MCFG_DEVICE_ADD( "cdda", CDDA ) - MCFG_SOUND_ROUTE( 0, "lspeaker", 1.00 ) - MCFG_SOUND_ROUTE( 1, "rspeaker", 1.00 ) + cdda_device &cdda(CDDA(config, "cdda")); + cdda.add_route(0, "lspeaker", 1.00); + cdda.add_route(1, "rspeaker", 1.00); - MCFG_CDROM_ADD("cdrom") - MCFG_CDROM_INTERFACE("pippin_cdrom") - MCFG_SOFTWARE_LIST_ADD("cd_list","pippin") + cdrom_image_device &cdrom(CDROM(config, "cdrom", 0)); + cdrom.set_interface("pippin_cdrom"); + SOFTWARE_LIST(config, "cd_list").set_type("pippin", SOFTWARE_LIST_ORIGINAL_SYSTEM); - MCFG_RAM_ADD(RAM_TAG) - MCFG_RAM_DEFAULT_SIZE("32M") + RAM(config, m_ram); + m_ram->set_default_size("32M"); - MCFG_DEVICE_ADD("via6522_0", VIA6522, C7M/10) - MCFG_VIA6522_READPA_HANDLER(READ8(*this, macpci_state, mac_via_in_a)) - MCFG_VIA6522_READPB_HANDLER(READ8(*this, macpci_state, mac_via_in_b)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, macpci_state,mac_via_out_a)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, macpci_state,mac_via_out_b)) - MCFG_VIA6522_CB2_HANDLER(WRITELINE(*this, macpci_state, mac_adb_via_out_cb2)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, macpci_state,mac_via_irq)) + VIA6522(config, m_via1, C7M/10); + m_via1->readpa_handler().set(FUNC(macpci_state::mac_via_in_a)); + m_via1->readpb_handler().set(FUNC(macpci_state::mac_via_in_b)); + m_via1->writepa_handler().set(FUNC(macpci_state::mac_via_out_a)); + m_via1->writepb_handler().set(FUNC(macpci_state::mac_via_out_b)); + m_via1->cb2_handler().set(FUNC(macpci_state::mac_adb_via_out_cb2)); + m_via1->irq_handler().set(FUNC(macpci_state::mac_via_irq)); //MCFG_DEVICE_ADD("scc", SCC8530, C7M) //MCFG_Z8530_INTRQ_CALLBACK(WRITELINE(*this, macpci_state, set_scc_interrupt)) - MCFG_CUDA_ADD(CUDA_341S0060) - MCFG_CUDA_RESET_CALLBACK(WRITELINE(*this, macpci_state, cuda_reset_w)) - MCFG_CUDA_LINECHANGE_CALLBACK(WRITELINE(*this, macpci_state, cuda_adb_linechange_w)) - MCFG_CUDA_VIA_CLOCK_CALLBACK(WRITELINE("via6522_0", via6522_device, write_cb1)) - MCFG_CUDA_VIA_DATA_CALLBACK(WRITELINE("via6522_0", via6522_device, write_cb2)) - MCFG_QUANTUM_PERFECT_CPU("maincpu") -MACHINE_CONFIG_END + CUDA(config, m_cuda, 0); + m_cuda->set_type(CUDA_341S0060); + m_cuda->reset_callback().set(FUNC(macpci_state::cuda_reset_w)); + m_cuda->linechange_callback().set(FUNC(macpci_state::cuda_adb_linechange_w)); + m_cuda->via_clock_callback().set(m_via1, FUNC(via6522_device::write_cb1)); + m_cuda->via_data_callback().set(m_via1, FUNC(via6522_device::write_cb2)); + config.m_perfect_cpu_quantum = subtag("maincpu"); +} /* ROM definition */ /* diff --git a/src/mame/drivers/madmotor.cpp b/src/mame/drivers/madmotor.cpp index 51877c3130b..921471b9f71 100644 --- a/src/mame/drivers/madmotor.cpp +++ b/src/mame/drivers/madmotor.cpp @@ -104,8 +104,6 @@ void madmotor_state::sound_map(address_map &map) map(0x130000, 0x130001).rw("oki2", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); map(0x140000, 0x140001).r("soundlatch", FUNC(generic_latch_8_device::read)); map(0x1f0000, 0x1f1fff).ram(); - map(0x1fec00, 0x1fec01).rw(m_audiocpu, FUNC(h6280_device::timer_r), FUNC(h6280_device::timer_w)).mirror(0x3fe); - map(0x1ff400, 0x1ff403).rw(m_audiocpu, FUNC(h6280_device::irq_status_r), FUNC(h6280_device::irq_status_w)).mirror(0x3fc); } /******************************************************************************/ @@ -267,8 +265,9 @@ MACHINE_CONFIG_START(madmotor_state::madmotor) MCFG_DEVICE_PROGRAM_MAP(madmotor_map) MCFG_DEVICE_VBLANK_INT_DRIVER("screen", madmotor_state, irq6_line_hold)/* VBL */ - MCFG_DEVICE_ADD("audiocpu", H6280, 8053000/2) /* Custom chip 45, Crystal near CPU is 8.053 MHz */ - MCFG_DEVICE_PROGRAM_MAP(sound_map) + H6280(config, m_audiocpu, 8053000/2); /* Custom chip 45, Crystal near CPU is 8.053 MHz */ + m_audiocpu->set_addrmap(AS_PROGRAM, &madmotor_state::sound_map); + m_audiocpu->add_route(ALL_OUTPUTS, "mono", 0); // internal sound unused /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) diff --git a/src/mame/drivers/mainevt.cpp b/src/mame/drivers/mainevt.cpp index 87f50233ce5..e5d3b83e146 100644 --- a/src/mame/drivers/mainevt.cpp +++ b/src/mame/drivers/mainevt.cpp @@ -11,14 +11,21 @@ Notes: - Schematics show a palette/work RAM bank selector, but this doesn't seem to be used? -- In Devastators, shadows don't work. Bit 7 of the sprite attribute is always 0, +- Devastators: has player-trench collision detection issues, player isn't + supposed to go through them. + +- Devastators: shadows don't work. Bit 7 of the sprite attribute is always 0, could there be a global enable flag in the 051960? This is particularly evident in level 2 where plane shadows cover other sprites. The priority/shadow encoder PROM is quite complex, however bits 5-7 of the sprite attribute don't seem to be used, at least not in the first two levels, so the PROM just maps to the fixed priority order currently implemented. -- In Devastators, sprite zooming for the planes in level 2 is particularly bad. +- Devastators: sprite zooming for the planes in level 2 is particularly bad. + +- Devastators: title screen white backdrop is always supposed to flicker, + it currently do that only from second/fourth attract cycles (supposed to always + flicker from PCB video); ***************************************************************************/ @@ -370,7 +377,7 @@ static INPUT_PORTS_START( devstors ) INPUT_PORTS_END /* Same as 'devstors', but additional "Cocktail" Dip Switch (even if I don't see the use) */ -static INPUT_PORTS_START( devstor2 ) +static INPUT_PORTS_START( devstors_ct ) PORT_INCLUDE( devstors ) PORT_MODIFY("DSW2") @@ -425,10 +432,11 @@ MACHINE_CONFIG_START(mainevt_state::mainevt) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_SIZE(64*8, 32*8) - MCFG_SCREEN_VISIBLE_AREA(14*8, (64-14)*8-1, 2*8, 30*8-1 ) +// MCFG_SCREEN_REFRESH_RATE(60) +// MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) +// MCFG_SCREEN_SIZE(64*8, 32*8) +// MCFG_SCREEN_VISIBLE_AREA(14*8, (64-14)*8-1, 2*8, 30*8-1 ) + MCFG_SCREEN_RAW_PARAMS(XTAL(24'000'000)/3, 528, 14*8, (64-14)*8, 256, 16, 240) // assume 59.17 like Devastators MCFG_SCREEN_UPDATE_DRIVER(mainevt_state, screen_update_mainevt) MCFG_SCREEN_PALETTE("palette") @@ -473,10 +481,11 @@ MACHINE_CONFIG_START(mainevt_state::devstors) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_SIZE(64*8, 32*8) - MCFG_SCREEN_VISIBLE_AREA(13*8, (64-13)*8-1, 2*8, 30*8-1 ) +// MCFG_SCREEN_REFRESH_RATE(60) +// MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) +// MCFG_SCREEN_SIZE(64*8, 32*8) +// MCFG_SCREEN_VISIBLE_AREA(13*8, (64-13)*8-1, 2*8, 30*8-1 ) + MCFG_SCREEN_RAW_PARAMS(XTAL(24'000'000)/3, 528, 13*8, (64-13)*8, 256, 16, 240) // measured 59.17 MCFG_SCREEN_UPDATE_DRIVER(mainevt_state, screen_update_dv) MCFG_SCREEN_PALETTE("palette") @@ -652,7 +661,7 @@ ROM_START( devstors ) ROM_LOAD( "890f03.d4", 0x00000, 0x80000, CRC(19065031) SHA1(12c47fbe28f85fa2f901fe52601188a5e9633f22) ) ROM_END -ROM_START( devstors2 ) +ROM_START( devstorsx ) ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "890x02.k11", 0x00000, 0x10000, CRC(e58ebb35) SHA1(4253b6a7128534cc0866bc910a271d91ac8b40fd) ) @@ -676,7 +685,7 @@ ROM_START( devstors2 ) ROM_LOAD( "890f03.d4", 0x00000, 0x80000, CRC(19065031) SHA1(12c47fbe28f85fa2f901fe52601188a5e9633f22) ) ROM_END -ROM_START( devstors3 ) +ROM_START( devstorsv ) ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "890v02.k11", 0x00000, 0x10000, CRC(52f4ccdd) SHA1(074e526ed170a5f2083c8c0808734291a2ea7403) ) @@ -700,6 +709,30 @@ ROM_START( devstors3 ) ROM_LOAD( "890f03.d4", 0x00000, 0x80000, CRC(19065031) SHA1(12c47fbe28f85fa2f901fe52601188a5e9633f22) ) ROM_END +ROM_START( devstors2 ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "890_202.k11", 0x00000, 0x10000, CRC(afbf0951) SHA1(6eb5d7e1de58058bd50d184d4c7e8dbea9cce13d) ) + + ROM_REGION( 0x8000, "audiocpu", 0 ) + ROM_LOAD( "890k01.f7", 0x00000, 0x08000, CRC(d44b3eb0) SHA1(26109fc56668b65f1a5aa6d8ec2c08fd70ca7c51) ) + + ROM_REGION( 0x40000, "k052109", 0 ) /* tiles */ + ROM_LOAD32_BYTE( "890f06.f22", 0x00000, 0x10000, CRC(26592155) SHA1(aa1f8662f091ca1eb495223e41a35edd861ae9e9) ) + ROM_LOAD32_BYTE( "890f07.h22", 0x00001, 0x10000, CRC(6c74fa2e) SHA1(419a2ad31d269fafe4c474bf512e935d5e018846) ) + ROM_LOAD32_BYTE( "890f08.j22", 0x00002, 0x10000, CRC(29e12e80) SHA1(6d09e190055218e2dfd07838f1446dfb5f801206) ) + ROM_LOAD32_BYTE( "890f09.k22", 0x00003, 0x10000, CRC(67ca40d5) SHA1(ff719f55d2534ff076fbdd2bcb7d12c683bfe958) ) + + ROM_REGION( 0x100000, "k051960", 0 ) /* sprites */ + ROM_LOAD32_WORD( "890f04.h4", 0x00000, 0x80000, CRC(f16cd1fa) SHA1(60ea19c19918a71aded3c9ea398c956908e217f1) ) + ROM_LOAD32_WORD( "890f05.k4", 0x00002, 0x80000, CRC(da37db05) SHA1(0b48d1021cf0dec78dae0ef183b4c61fea783533) ) + + ROM_REGION( 0x0100, "proms", 0 ) + ROM_LOAD( "63s141n.k14", 0x0000, 0x0100, CRC(d3620106) SHA1(528a0a34754902d0f262a9619c6105da6de99354) ) /* priority encoder (not used) */ + + ROM_REGION( 0x80000, "k007232", 0 ) /* 512k for 007232 samples */ + ROM_LOAD( "890f03.d4", 0x00000, 0x80000, CRC(19065031) SHA1(12c47fbe28f85fa2f901fe52601188a5e9633f22) ) +ROM_END + ROM_START( garuka ) ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "890w02.k11", 0x00000, 0x10000, CRC(b2f6f538) SHA1(95dad3258a2e4c5648d0fc22c06fa3e2da3b5ed1) ) @@ -730,7 +763,8 @@ GAME( 1988, mainevt, 0, mainevt, mainevt, mainevt_state, empty_init, R GAME( 1988, mainevto, mainevt, mainevt, mainevt, mainevt_state, empty_init, ROT0, "Konami", "The Main Event (4 Players ver. F)", MACHINE_SUPPORTS_SAVE ) GAME( 1988, mainevt2p,mainevt, mainevt, mainev2p, mainevt_state, empty_init, ROT0, "Konami", "The Main Event (2 Players ver. X)", MACHINE_SUPPORTS_SAVE ) GAME( 1988, ringohja, mainevt, mainevt, mainev2p, mainevt_state, empty_init, ROT0, "Konami", "Ring no Ohja (Japan 2 Players ver. N)", MACHINE_SUPPORTS_SAVE ) -GAME( 1988, devstors, 0, devstors, devstors, mainevt_state, empty_init, ROT90, "Konami", "Devastators (ver. Z)", MACHINE_SUPPORTS_SAVE ) -GAME( 1988, devstors2,devstors, devstors, devstor2, mainevt_state, empty_init, ROT90, "Konami", "Devastators (ver. X)", MACHINE_SUPPORTS_SAVE ) -GAME( 1988, devstors3,devstors, devstors, devstors, mainevt_state, empty_init, ROT90, "Konami", "Devastators (ver. V)", MACHINE_SUPPORTS_SAVE ) -GAME( 1988, garuka, devstors, devstors, devstor2, mainevt_state, empty_init, ROT90, "Konami", "Garuka (Japan ver. W)", MACHINE_SUPPORTS_SAVE ) +GAME( 1988, devstors, 0, devstors, devstors, mainevt_state, empty_init, ROT90, "Konami", "Devastators (ver. Z)", MACHINE_SUPPORTS_SAVE ) +GAME( 1988, devstorsx,devstors, devstors, devstors_ct, mainevt_state, empty_init, ROT90, "Konami", "Devastators (ver. X)", MACHINE_SUPPORTS_SAVE ) +GAME( 1988, devstorsv,devstors, devstors, devstors, mainevt_state, empty_init, ROT90, "Konami", "Devastators (ver. V)", MACHINE_SUPPORTS_SAVE ) +GAME( 1988, devstors2,devstors, devstors, devstors_ct, mainevt_state, empty_init, ROT90, "Konami", "Devastators (ver. 2)", MACHINE_SUPPORTS_SAVE ) +GAME( 1988, garuka, devstors, devstors, devstors_ct, mainevt_state, empty_init, ROT90, "Konami", "Garuka (Japan ver. W)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/drivers/mcb216.cpp b/src/mame/drivers/mcb216.cpp index af285312122..bed9565e0a0 100644 --- a/src/mame/drivers/mcb216.cpp +++ b/src/mame/drivers/mcb216.cpp @@ -128,9 +128,9 @@ MACHINE_CONFIG_START(mcb216_state::mcb216) MCFG_MACHINE_RESET_OVERRIDE(mcb216_state, mcb216) - MCFG_DEVICE_ADD("tms5501", TMS5501, 8_MHz_XTAL / 4) - MCFG_TMS5501_XMT_CALLBACK(WRITELINE("rs232", rs232_port_device, write_txd)) - MCFG_TMS5501_IRQ_CALLBACK(INPUTLINE("maincpu", 0)) + TMS5501(config, m_tms5501, 8_MHz_XTAL / 4); + m_tms5501->xmt_callback().set("rs232", FUNC(rs232_port_device::write_txd)); + m_tms5501->int_callback().set_inputline("maincpu", 0); MCFG_DEVICE_ADD("rs232", RS232_PORT, default_rs232_devices, "terminal") MCFG_RS232_RXD_HANDLER(WRITELINE("tms5501", tms5501_device, rcv_w)) @@ -145,9 +145,9 @@ MACHINE_CONFIG_START(mcb216_state::cb308) MCFG_MACHINE_RESET_OVERRIDE(mcb216_state, cb308) - MCFG_DEVICE_ADD("tms5501", TMS5501, 8_MHz_XTAL / 4) - MCFG_TMS5501_XMT_CALLBACK(WRITELINE("rs232", rs232_port_device, write_txd)) - MCFG_TMS5501_IRQ_CALLBACK(INPUTLINE("maincpu", 0)) + TMS5501(config, m_tms5501, 8_MHz_XTAL / 4); + m_tms5501->xmt_callback().set("rs232", FUNC(rs232_port_device::write_txd)); + m_tms5501->int_callback().set_inputline("maincpu", 0); MCFG_DEVICE_ADD("rs232", RS232_PORT, default_rs232_devices, "terminal") MCFG_RS232_RXD_HANDLER(WRITELINE("tms5501", tms5501_device, rcv_w)) diff --git a/src/mame/drivers/megadriv.cpp b/src/mame/drivers/megadriv.cpp index f901d6aa070..7469144511c 100644 --- a/src/mame/drivers/megadriv.cpp +++ b/src/mame/drivers/megadriv.cpp @@ -612,7 +612,7 @@ MACHINE_CONFIG_START(md_cons_state::genesis_32x) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", (0.25)/2) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", (0.25)/2) - MCFG_DEVICE_ADD("sega32x", SEGA_32X_NTSC, 0, m_maincpu, m_scan_timer) + MCFG_DEVICE_ADD("sega32x", SEGA_32X_NTSC, (MASTER_CLOCK_NTSC * 3) / 7, m_maincpu, m_scan_timer) MCFG_SEGA_32X_PALETTE("gen_vdp:palette") MCFG_SCREEN_MODIFY("megadriv") @@ -650,7 +650,7 @@ MACHINE_CONFIG_START(md_cons_state::mdj_32x) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", (0.25)/2) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", (0.25)/2) - MCFG_DEVICE_ADD("sega32x", SEGA_32X_NTSC, 0, m_maincpu, m_scan_timer) + MCFG_DEVICE_ADD("sega32x", SEGA_32X_NTSC, (MASTER_CLOCK_NTSC * 3) / 7, m_maincpu, m_scan_timer) MCFG_SEGA_32X_PALETTE("gen_vdp:palette") MCFG_SCREEN_MODIFY("megadriv") @@ -688,7 +688,7 @@ MACHINE_CONFIG_START(md_cons_state::md_32x) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", (0.25)/2) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", (0.25)/2) - MCFG_DEVICE_ADD("sega32x", SEGA_32X_PAL, 0, m_maincpu, m_scan_timer) + MCFG_DEVICE_ADD("sega32x", SEGA_32X_PAL, (MASTER_CLOCK_PAL * 3) / 7, m_maincpu, m_scan_timer) MCFG_SEGA_32X_PALETTE("gen_vdp:palette") MCFG_SCREEN_MODIFY("megadriv") diff --git a/src/mame/drivers/mermaid.cpp b/src/mame/drivers/mermaid.cpp index 4ae015c8fee..fd8c2a7e8c8 100644 --- a/src/mame/drivers/mermaid.cpp +++ b/src/mame/drivers/mermaid.cpp @@ -484,10 +484,10 @@ MACHINE_CONFIG_START(mermaid_state::rougien) MCFG_MSM5205_PRESCALER_SELECTOR(S96_4B) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00) - MCFG_DEVICE_ADD("adpcm_counter", RIPPLE_COUNTER, 0) - MCFG_DEVICE_ROM("adpcm") - MCFG_RIPPLE_COUNTER_STAGES(12) - MCFG_RIPPLE_COUNTER_ROM_OUT_CB(WRITE8(*this, mermaid_state, adpcm_data_w)) + RIPPLE_COUNTER(config, m_adpcm_counter); + m_adpcm_counter->set_device_rom_tag("adpcm"); + m_adpcm_counter->set_stages(12); + m_adpcm_counter->rom_out_cb().set(FUNC(mermaid_state::adpcm_data_w)); MACHINE_CONFIG_END /* ROMs */ diff --git a/src/mame/drivers/micro20.cpp b/src/mame/drivers/micro20.cpp index 05b11e2b6a0..26ad1f003a7 100644 --- a/src/mame/drivers/micro20.cpp +++ b/src/mame/drivers/micro20.cpp @@ -30,8 +30,8 @@ class micro20_state : public driver_device { public: - micro20_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), + micro20_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), m_maincpu(*this, MAINCPU_TAG), m_rom(*this, "bootrom"), m_mainram(*this, "mainram"), diff --git a/src/mame/drivers/micro3d.cpp b/src/mame/drivers/micro3d.cpp index 08768fc7b5c..6ff9b75db5f 100644 --- a/src/mame/drivers/micro3d.cpp +++ b/src/mame/drivers/micro3d.cpp @@ -343,14 +343,14 @@ MACHINE_CONFIG_START(micro3d_state::micro3d) MCFG_MC68681_INPORT_CALLBACK(READ8(*this, micro3d_state, duart_input_r)) MCFG_MC68681_OUTPORT_CALLBACK(WRITE8(*this, micro3d_state, duart_output_w)) - MCFG_DEVICE_ADD("mfp", MC68901, 4000000) - MCFG_MC68901_TIMER_CLOCK(4000000) - MCFG_MC68901_RX_CLOCK(0) - MCFG_MC68901_TX_CLOCK(0) - MCFG_MC68901_OUT_IRQ_CB(INPUTLINE("maincpu", M68K_IRQ_4)) - //MCFG_MC68901_OUT_TAO_CB(WRITELINE("mfp", mc68901_device, rc_w)) - //MCFG_DEVCB_CHAIN_OUTPUT(WRITELINE("mfp", mc68901_device, tc_w)) - MCFG_MC68901_OUT_TCO_CB(WRITELINE("mfp", mc68901_device, tbi_w)) + mc68901_device &mfp(MC68901(config, "mfp", 4000000)); + mfp.set_timer_clock(4000000); + mfp.set_rx_clock(0); + mfp.set_tx_clock(0); + mfp.out_irq_cb().set_inputline("maincpu", M68K_IRQ_4); + //mfp.out_tao_cb().set("mfp", FUNC(mc68901_device::rc_w)); + //mfp.out_tao_cb().append("mfp", FUNC(mc68901_device::tc_w)); + mfp.out_tco_cb().set("mfp", FUNC(mc68901_device::tbi_w)); MCFG_NVRAM_ADD_0FILL("nvram") MCFG_QUANTUM_TIME(attotime::from_hz(3000)) diff --git a/src/mame/drivers/microdec.cpp b/src/mame/drivers/microdec.cpp index 4093dd1aae6..bd1cfb699a9 100644 --- a/src/mame/drivers/microdec.cpp +++ b/src/mame/drivers/microdec.cpp @@ -96,6 +96,7 @@ READ8_MEMBER( microdec_state::portf6_r ) READ8_MEMBER( microdec_state::portf7_r ) { m_fdc->tc_w(1); + m_fdc->tc_w(0); return 0xff; } @@ -188,6 +189,8 @@ void microdec_state::init_microdec() membank("bankr0")->configure_entry(1, &main[0x0000]); membank("bankr0")->configure_entry(0, &main[0x1000]); membank("bankw0")->configure_entry(0, &main[0x1000]); + m_fdc->set_ready_line_connected(1); + m_fdc->set_unscaled_clock(4000000); // 4MHz for minifloppy } void microdec_state::microdec(machine_config &config) diff --git a/src/mame/drivers/microterm_f8.cpp b/src/mame/drivers/microterm_f8.cpp new file mode 100644 index 00000000000..99f90a85a26 --- /dev/null +++ b/src/mame/drivers/microterm_f8.cpp @@ -0,0 +1,494 @@ +// license:BSD-3-Clause +// copyright-holders:AJR +/******************************************************************************* + + Driver for Micro-Term ACT-5A and other F8-based terminals. + +*******************************************************************************/ + +#include "emu.h" +#include "bus/rs232/rs232.h" +#include "cpu/f8/f8.h" +#include "machine/ay31015.h" +#include "machine/f3853.h" +#include "sound/beep.h" +#include "screen.h" +#include "speaker.h" + +class microterm_f8_state : public driver_device +{ +public: + microterm_f8_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) + , m_maincpu(*this, "maincpu") + , m_uart(*this, "uart") + , m_io(*this, "io") + , m_aux(*this, "aux") + , m_screen(*this, "screen") + , m_bell(*this, "bell") + , m_kbdecode(*this, "kbdecode") + , m_chargen(*this, "chargen") + , m_keys(*this, "KEY%u", 0U) + , m_modifiers(*this, "MODIFIERS") + , m_special(*this, "SPECIAL") + , m_dsw(*this, "DSW%u", 1U) + , m_jumpers(*this, "JUMPERS") + { } + + void act5a(machine_config &config); + +private: + virtual void machine_start() override; + virtual void machine_reset() override; + + u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + + F3853_INTERRUPT_REQ_CB(f3853_interrupt); + DECLARE_WRITE_LINE_MEMBER(vblank_w); + + DECLARE_READ8_MEMBER(bell_r); + DECLARE_WRITE8_MEMBER(scroll_w); + DECLARE_READ8_MEMBER(vram_r); + DECLARE_WRITE8_MEMBER(vram_w); + bool poll_keyboard(); + DECLARE_READ8_MEMBER(key_r); + DECLARE_READ8_MEMBER(port00_r); + DECLARE_WRITE8_MEMBER(port00_w); + DECLARE_READ8_MEMBER(port01_r); + + void f8_mem(address_map &map); + void f8_io(address_map &map); + + required_device<cpu_device> m_maincpu; + required_device<ay51013_device> m_uart; + required_device<rs232_port_device> m_io; + required_device<rs232_port_device> m_aux; + required_device<screen_device> m_screen; + required_device<beep_device> m_bell; + required_region_ptr<u8> m_kbdecode; + required_region_ptr<u8> m_chargen; + required_ioport_array<11> m_keys; + required_ioport m_modifiers; + required_ioport m_special; + required_ioport_array<3> m_dsw; + required_ioport m_jumpers; + + u8 m_port00; + u8 m_keylatch; + u8 m_scroll; + std::unique_ptr<u16[]> m_vram; +}; + +void microterm_f8_state::machine_start() +{ + m_port00 = 0; + m_keylatch = 0; + m_vram = make_unique_clear<u16[]>(0x800); // 6x MM2114 with weird addressing + + save_item(NAME(m_port00)); + save_item(NAME(m_keylatch)); + save_item(NAME(m_scroll)); + save_pointer(NAME(m_vram), 0x800); +} + +void microterm_f8_state::machine_reset() +{ + m_scroll = 0; +} + +u32 microterm_f8_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +{ + const ioport_value jumpers = m_jumpers->read(); + unsigned y = cliprect.top(); + offs_t rowbase = (((y / 12) + m_scroll) % 24) * 80; + unsigned line = y % 12; + if (line >= 6) + line += 2; + + while (y <= cliprect.bottom()) + { + const bool allow_underline = (line == 13) || (line == 12 && !BIT(jumpers, 1)); + + for (unsigned x = cliprect.left(); x <= cliprect.right(); x++) + { + u16 ch = m_vram[rowbase + (x / 9)]; + u8 chdata = m_chargen[(line << 7) | (ch & 0x7f)]; + bool dot = (!BIT(ch, 8) && allow_underline) || BIT(chdata, 8 - (x % 9)); + bitmap.pix32(y, x) = dot ? rgb_t::white() : rgb_t::black(); + } + + y++; + line++; + if ((line & 7) >= 6) + { + line = (line + 2) & 15; + if (line == 0) + { + rowbase += 80; + if (rowbase == 24 * 80) + rowbase = 0; + } + } + } + + return 0; +} + +F3853_INTERRUPT_REQ_CB(microterm_f8_state::f3853_interrupt) +{ + m_maincpu->set_input_line_and_vector(F8_INPUT_LINE_INT_REQ, level ? ASSERT_LINE : CLEAR_LINE, addr); +} + +WRITE_LINE_MEMBER(microterm_f8_state::vblank_w) +{ + if (state) + m_bell->set_state(0); +} + +READ8_MEMBER(microterm_f8_state::bell_r) +{ + if (!machine().side_effects_disabled()) + m_bell->set_state(1); + return 0; +} + +WRITE8_MEMBER(microterm_f8_state::scroll_w) +{ + m_scroll++; + if (m_scroll == 24) + m_scroll = 0; +} + +READ8_MEMBER(microterm_f8_state::vram_r) +{ + offs_t vaddr = (offset >> 8) * 80 + (offset & 0x007f); + assert(vaddr < 0x800); + if ((m_port00 & 0x05) == 0 && !machine().side_effects_disabled()) + m_port00 = (m_port00 & 0x0f) | ((m_vram[vaddr] >> 4) & 0xf0); + return m_vram[vaddr] & 0xff; +} + +WRITE8_MEMBER(microterm_f8_state::vram_w) +{ + offs_t vaddr = (offset >> 8) * 80 + (offset & 0x007f); + assert(vaddr < 0x800); + m_vram[vaddr] = data | (m_port00 & 0xf0) << 4; +} + +bool microterm_f8_state::poll_keyboard() +{ + for (int row = 0; row < 11; row++) + { + u8 polled = m_keys[row]->read(); + if (polled == 0xff) + continue; + + offs_t keyaddr = (m_modifiers->read() << 7) | (row << 3); + while (BIT(polled, 0)) + { + polled >>= 1; + keyaddr++; + } + m_keylatch = m_kbdecode[keyaddr]; + return true; + } + + return false; +} + +READ8_MEMBER(microterm_f8_state::key_r) +{ + return m_keylatch; +} + +READ8_MEMBER(microterm_f8_state::port00_r) +{ + u8 flags = m_port00; + + // On-line/Local mode switch? + if (BIT(m_special->read(), 1)) + flags |= 0x02; + + return flags; +} + +WRITE8_MEMBER(microterm_f8_state::port00_w) +{ + m_port00 = data; +} + +READ8_MEMBER(microterm_f8_state::port01_r) +{ + u8 flags = 0; + + // Some timing flag (not necessarily HBLANK?) + if (!m_screen->hblank()) + flags |= 0x80; + + // Keyboard polling + if (poll_keyboard()) + flags |= 0x40; + + // ??? + if (!m_screen->vblank()) + flags |= 0x20; + + // Protected field setting + flags |= ~m_dsw[2]->read() & 0x06; + + return flags; +} + +void microterm_f8_state::f8_mem(address_map &map) +{ + map(0x0000, 0x0bff).rom().region("maincpu", 0); + map(0x0c00, 0x0c00).r(FUNC(microterm_f8_state::bell_r)); + map(0x2000, 0x2000).mirror(0x1fff).w(FUNC(microterm_f8_state::scroll_w)); + map(0x4000, 0x407f).select(0x1f00).rw(FUNC(microterm_f8_state::vram_r), FUNC(microterm_f8_state::vram_w)); + map(0x5800, 0x5fff).unmaprw(); + map(0x8000, 0x8000).rw(m_uart, FUNC(ay51013_device::receive), FUNC(ay51013_device::transmit)); + map(0xf000, 0xf000).r(FUNC(microterm_f8_state::key_r)); +} + +void microterm_f8_state::f8_io(address_map &map) +{ + map.unmap_value_high(); + map(0x00, 0x00).rw(FUNC(microterm_f8_state::port00_r), FUNC(microterm_f8_state::port00_w)); + map(0x01, 0x01).r(FUNC(microterm_f8_state::port01_r)).nopw(); + map(0x0c, 0x0f).rw("smi", FUNC(f3853_device::read), FUNC(f3853_device::write)); +} + +static INPUT_PORTS_START(act5a) + PORT_START("KEY0") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(' ') PORT_CODE(KEYCODE_SPACE) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("N") PORT_CHAR('n') PORT_CHAR('N') PORT_CHAR(0x0e) PORT_CODE(KEYCODE_N) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("B") PORT_CHAR('b') PORT_CHAR('B') PORT_CHAR(0x02) PORT_CODE(KEYCODE_B) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("V") PORT_CHAR('v') PORT_CHAR('V') PORT_CHAR(0x16) PORT_CODE(KEYCODE_V) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("C") PORT_CHAR('c') PORT_CHAR('C') PORT_CHAR(0x03) PORT_CODE(KEYCODE_C) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("X") PORT_CHAR('x') PORT_CHAR('X') PORT_CHAR(0x18) PORT_CODE(KEYCODE_X) + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Z") PORT_CHAR('z') PORT_CHAR('Z') PORT_CHAR(0x1a) PORT_CODE(KEYCODE_Z) + + PORT_START("KEY1") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(COMMA_PAD)) PORT_CODE(KEYCODE_PLUS_PAD) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(MINUS_PAD)) PORT_CODE(KEYCODE_MINUS_PAD) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("H") PORT_CHAR('h') PORT_CHAR('H') PORT_CHAR(0x08) PORT_CODE(KEYCODE_H) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("G") PORT_CHAR('g') PORT_CHAR('G') PORT_CHAR(0x07) PORT_CODE(KEYCODE_G) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F") PORT_CHAR('f') PORT_CHAR('F') PORT_CHAR(0x06) PORT_CODE(KEYCODE_F) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("D") PORT_CHAR('d') PORT_CHAR('D') PORT_CHAR(0x04) PORT_CODE(KEYCODE_D) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("S") PORT_CHAR('s') PORT_CHAR('S') PORT_CHAR(0x13) PORT_CODE(KEYCODE_S) + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("A") PORT_CHAR('a') PORT_CHAR('A') PORT_CHAR(0x01) PORT_CODE(KEYCODE_A) + + PORT_START("KEY2") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("8 * -") PORT_CHAR('8') PORT_CHAR('*') PORT_CODE(KEYCODE_8) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Y") PORT_CHAR('y') PORT_CHAR('Y') PORT_CHAR(0x19) PORT_CODE(KEYCODE_Y) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("T") PORT_CHAR('t') PORT_CHAR('T') PORT_CHAR(0x14) PORT_CODE(KEYCODE_T) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("R") PORT_CHAR('r') PORT_CHAR('R') PORT_CHAR(0x12) PORT_CODE(KEYCODE_R) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("E") PORT_CHAR('e') PORT_CHAR('E') PORT_CHAR(0x05) PORT_CODE(KEYCODE_E) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("W") PORT_CHAR('w') PORT_CHAR('W') PORT_CHAR(0x17) PORT_CODE(KEYCODE_W) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Q") PORT_CHAR('q') PORT_CHAR('Q') PORT_CHAR(0x11) PORT_CODE(KEYCODE_Q) + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(0x09) PORT_CODE(KEYCODE_TAB) + + PORT_START("KEY3") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('7') PORT_CHAR('&') PORT_CODE(KEYCODE_7) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('6') PORT_CHAR('^') PORT_CODE(KEYCODE_6) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('5') PORT_CHAR('%') PORT_CODE(KEYCODE_5) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('4') PORT_CHAR('$') PORT_CODE(KEYCODE_4) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('3') PORT_CHAR('#') PORT_CODE(KEYCODE_3) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('2') PORT_CHAR('@') PORT_CODE(KEYCODE_2) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('1') PORT_CHAR('!') PORT_CODE(KEYCODE_1) + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(0x1b) PORT_CODE(KEYCODE_ESC) + + PORT_START("KEY4") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("] }") PORT_CHAR(']') PORT_CHAR('}') PORT_CHAR(0x1d) PORT_CODE(KEYCODE_CLOSEBRACE) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('-') PORT_CHAR('_') PORT_CODE(KEYCODE_MINUS) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("[ {") PORT_CHAR('[') PORT_CHAR('{') PORT_CODE(KEYCODE_OPENBRACE) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(", <") PORT_CHAR(',') PORT_CHAR('<') PORT_CHAR(0x10) PORT_CODE(KEYCODE_P) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('0') PORT_CHAR(')') PORT_CODE(KEYCODE_0) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("\\ |") PORT_CHAR('\\') PORT_CHAR('|') PORT_CHAR(0x1c) PORT_CODE(KEYCODE_BACKSLASH) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('`') PORT_CHAR('~') PORT_CODE(KEYCODE_TILDE) + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('=') PORT_CHAR('+') PORT_CODE(KEYCODE_EQUALS) + + PORT_START("KEY5") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('\'') PORT_CHAR('"') PORT_CODE(KEYCODE_QUOTE) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(';') PORT_CHAR(':') PORT_CODE(KEYCODE_COLON) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('/') PORT_CHAR('?') PORT_CODE(KEYCODE_SLASH) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(". > 9") PORT_CHAR('.') PORT_CHAR('>') PORT_CODE(KEYCODE_STOP) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(", < 8") PORT_CHAR(',') PORT_CHAR('<') PORT_CODE(KEYCODE_COMMA) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("M 7") PORT_CHAR('m') PORT_CHAR('M') PORT_CODE(KEYCODE_M) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("L 6") PORT_CHAR('l') PORT_CHAR('L') PORT_CHAR(0x0c) PORT_CODE(KEYCODE_L) + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("K 5") PORT_CHAR('k') PORT_CHAR('K') PORT_CHAR(0x0b) PORT_CODE(KEYCODE_K) + + PORT_START("KEY6") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("J 4") PORT_CHAR('j') PORT_CHAR('J') PORT_CODE(KEYCODE_J) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("O 3") PORT_CHAR('o') PORT_CHAR('O') PORT_CHAR(0x0f) PORT_CODE(KEYCODE_O) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("I 2") PORT_CHAR('i') PORT_CHAR('I') PORT_CODE(KEYCODE_I) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("U 1") PORT_CHAR('u') PORT_CHAR('U') PORT_CHAR(0x15) PORT_CODE(KEYCODE_U) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("9 ( 0") PORT_CHAR('9') PORT_CHAR('(') PORT_CODE(KEYCODE_9) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Line Feed") PORT_CHAR(0x0a) PORT_CODE(KEYCODE_RALT) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Delete") PORT_CHAR(0x7f) PORT_CODE(KEYCODE_BACKSPACE) + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Return") PORT_CHAR(0x0d) PORT_CODE(KEYCODE_ENTER) + + PORT_START("KEY7") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(ENTER_PAD)) PORT_CODE(KEYCODE_ENTER_PAD) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(3_PAD)) PORT_CODE(KEYCODE_3_PAD) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(6_PAD)) PORT_CODE(KEYCODE_6_PAD) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(9_PAD)) PORT_CODE(KEYCODE_9_PAD) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(DEL_PAD)) PORT_CODE(KEYCODE_DEL_PAD) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(2_PAD)) PORT_CODE(KEYCODE_2_PAD) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(5_PAD)) PORT_CODE(KEYCODE_5_PAD) + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(8_PAD)) PORT_CODE(KEYCODE_8_PAD) + + PORT_START("KEY8") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(0_PAD)) PORT_CODE(KEYCODE_0_PAD) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(1_PAD)) PORT_CODE(KEYCODE_1_PAD) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(4_PAD)) PORT_CODE(KEYCODE_4_PAD) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(7_PAD)) PORT_CODE(KEYCODE_7_PAD) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(DOWN)) PORT_CODE(KEYCODE_DOWN) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(UP)) PORT_CODE(KEYCODE_UP) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) PORT_CODE(KEYCODE_RIGHT) + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(LEFT)) PORT_CODE(KEYCODE_LEFT) + + PORT_START("KEY9") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("B/W Blink") PORT_CODE(KEYCODE_F8) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Intens Undl") PORT_CODE(KEYCODE_F7) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Format On/Off") PORT_CODE(KEYCODE_F6) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Split On/Off") PORT_CODE(KEYCODE_F5) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Clear Home") PORT_CHAR(UCHAR_MAMEKEY(HOME)) PORT_CODE(KEYCODE_F4) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Clear EOL/EOF") PORT_CHAR(UCHAR_MAMEKEY(END)) PORT_CODE(KEYCODE_F3) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Ins Char/Line") PORT_CHAR(UCHAR_MAMEKEY(INSERT)) PORT_CODE(KEYCODE_F2) + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Del Char/Line") PORT_CHAR(UCHAR_MAMEKEY(DEL)) PORT_CODE(KEYCODE_F1) + + PORT_START("KEY10") + PORT_BIT(0x3f, IP_ACTIVE_LOW, IPT_UNUSED) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Send Line/Page") PORT_CODE(KEYCODE_F11) + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Print Line/Page") PORT_CHAR(UCHAR_MAMEKEY(PRTSCR)) PORT_CODE(KEYCODE_F12) + + PORT_START("MODIFIERS") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Shift") PORT_CHAR(UCHAR_SHIFT_1) PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Num") PORT_CHAR(UCHAR_MAMEKEY(NUMLOCK)) PORT_CODE(KEYCODE_LALT) PORT_TOGGLE + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Ctrl") PORT_CHAR(UCHAR_SHIFT_2) PORT_CODE(KEYCODE_LCONTROL) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Caps Lock") PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) PORT_CODE(KEYCODE_CAPSLOCK) PORT_TOGGLE + + PORT_START("SPECIAL") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Break") PORT_CODE(KEYCODE_F9) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Line/Loc") PORT_CODE(KEYCODE_F10) PORT_TOGGLE + + PORT_START("DSW1") + PORT_DIPNAME(0xff, 0xfd, "Printer Data Rate") PORT_DIPLOCATION("S1:8,7,6,5,4,3,2,1") + PORT_DIPSETTING(0x7f, "110") + PORT_DIPSETTING(0xbf, "300") + PORT_DIPSETTING(0xdf, "600") + PORT_DIPSETTING(0xef, "1,200") + PORT_DIPSETTING(0xf7, "2,400") + PORT_DIPSETTING(0xfb, "4,800") + PORT_DIPSETTING(0xfd, "9,600") + PORT_DIPSETTING(0xfe, "19,200") + + PORT_START("DSW2") + PORT_DIPNAME(0xff, 0xfd, "I/O Data Rate") PORT_DIPLOCATION("S2:1,2,3,4,5,6,7,8") + PORT_DIPSETTING(0x7f, "110") + PORT_DIPSETTING(0xbf, "300") + PORT_DIPSETTING(0xdf, "600") + PORT_DIPSETTING(0xef, "1,200") + PORT_DIPSETTING(0xf7, "2,400") + PORT_DIPSETTING(0xfb, "4,800") + PORT_DIPSETTING(0xfd, "9,600") + PORT_DIPSETTING(0xfe, "19,200") + + PORT_START("DSW3") + PORT_DIPNAME(0x001, 0x001, "Conversation Mode") PORT_DIPLOCATION("S3:1") + PORT_DIPSETTING(0x001, "Half Duplex") + PORT_DIPSETTING(0x000, "Full Duplex") + PORT_DIPNAME(0x006, 0x006, "Protected Field Attribute") PORT_DIPLOCATION("S3:2,3") + PORT_DIPSETTING(0x006, "Reduced Intensity") + PORT_DIPSETTING(0x002, "Blinking") + PORT_DIPSETTING(0x004, "Reverse Video") + PORT_DIPSETTING(0x000, "Underline") + PORT_DIPNAME(0x008, 0x008, "Display Null Character") PORT_DIPLOCATION("S3:4") + PORT_DIPSETTING(0x000, DEF_STR(Off)) + PORT_DIPSETTING(0x008, DEF_STR(On)) + PORT_DIPNAME(0x010, 0x010, "8th Bit Transmit") PORT_DIPLOCATION("S3:5") + PORT_DIPSETTING(0x000, "0 (Space)") + PORT_DIPSETTING(0x010, "1 (Mark)") + PORT_DIPNAME(0x060, 0x060, "Word Length") PORT_DIPLOCATION("S3:6,7") + PORT_DIPSETTING(0x000, "5 Bits") + PORT_DIPSETTING(0x040, "6 Bits") + PORT_DIPSETTING(0x020, "7 Bits") + PORT_DIPSETTING(0x060, "8 Bits") + PORT_DIPNAME(0x280, 0x280, "Parity") PORT_DIPLOCATION("S3:8,10") + PORT_DIPSETTING(0x280, "None") + PORT_DIPSETTING(0x080, "Even") + PORT_DIPSETTING(0x000, "Odd") + PORT_DIPNAME(0x100, 0x100, "Number of Stop Bits") PORT_DIPLOCATION("S3:9") + PORT_DIPSETTING(0x000, "1") + PORT_DIPSETTING(0x100, "2") + + PORT_START("JUMPERS") + PORT_DIPNAME(0x0003, 0x0002, "Underline") PORT_DIPLOCATION("W1:1,2") + PORT_DIPSETTING(0x0002, "Single") + PORT_DIPSETTING(0x0001, "Double") + PORT_DIPNAME(0x003c, 0x0034, "Cursor Rate") PORT_DIPLOCATION("W2:1,2,3,4") + PORT_DIPSETTING(0x001c, "0 Hz") + PORT_DIPSETTING(0x002c, "1 Hz") + PORT_DIPSETTING(0x0034, "2 Hz") + PORT_DIPSETTING(0x0038, "4 Hz") + PORT_DIPNAME(0x01c0, 0x00c0, "Blinking Rate") PORT_DIPLOCATION("W3:1,2,3") + PORT_DIPSETTING(0x00c0, "1 Hz") + PORT_DIPSETTING(0x0140, "2 Hz") + PORT_DIPSETTING(0x0180, "4 Hz") + PORT_DIPNAME(0x1e00, 0x0e00, "Protected Video Attribute") PORT_DIPLOCATION("W4:4,3,2,1") + PORT_DIPSETTING(0x0e00, "Reduced Intensity") + PORT_DIPSETTING(0x1600, "Blinking") + PORT_DIPSETTING(0x1a00, "Reverse Video") + PORT_DIPSETTING(0x1c00, "Underline") + PORT_DIPNAME(0xe000, 0x6000, "Keyboard Auto Repeat Rate") PORT_DIPLOCATION("W5:1,2,3") + PORT_DIPSETTING(0x6000, "7.5 cps") + PORT_DIPSETTING(0xa000, "15 cps") + PORT_DIPSETTING(0xc000, "30 cps") +INPUT_PORTS_END + +void microterm_f8_state::act5a(machine_config &config) +{ + cpu_device &maincpu(F8(config, "maincpu", 2_MHz_XTAL)); + maincpu.set_addrmap(AS_PROGRAM, µterm_f8_state::f8_mem); + maincpu.set_addrmap(AS_IO, µterm_f8_state::f8_io); + + f3853_device &smi(F3853(config, "smi", 2_MHz_XTAL)); + smi.set_interrupt_req_callback(f3853_device::interrupt_req_delegate(FUNC(microterm_f8_state::f3853_interrupt), this)); + + AY51013(config, m_uart, 0); + m_uart->read_si_callback().set(m_io, FUNC(rs232_port_device::rxd_r)); + m_uart->write_so_callback().set(m_io, FUNC(rs232_port_device::write_txd)); + m_uart->write_dav_callback().set("smi", FUNC(f3853_device::set_external_interrupt_in_line)).invert(); + m_uart->set_auto_rdav(true); + + RS232_PORT(config, m_io, default_rs232_devices, nullptr); + RS232_PORT(config, m_aux, default_rs232_devices, nullptr); + + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); + screen.set_raw(16.572_MHz_XTAL, 918, 0, 720, 301, 0, 288); // more or less guessed + screen.set_screen_update(FUNC(microterm_f8_state::screen_update)); + screen.screen_vblank().set(FUNC(microterm_f8_state::vblank_w)); + + SPEAKER(config, "mono").front_center(); + BEEP(config, m_bell, 1760); + m_bell->add_route(ALL_OUTPUTS, "mono", 0.50); +} + +ROM_START(act5a) + ROM_REGION(0x0c00, "maincpu", 0) // xtals 16.572MHz, 2.000MHz + ROM_LOAD("act5a_2708.u1", 0x0000, 0x0400, CRC(ad3bfa5a) SHA1(723c7bfefbf96177171b8e58a8e20ee69daa27f0)) + ROM_LOAD("act5a_2708.u12", 0x0400, 0x0400, CRC(be4a148d) SHA1(69bf838ed9fccdf7f225bc380bcce8e7e0bd88bc)) + ROM_LOAD("act5a_2708.u22", 0x0800, 0x0400, CRC(f0ec3b9f) SHA1(7785eba9993c23a767b84fff2c44d5cb6210ad80)) + + ROM_REGION(0x2000, "kbdecode", 0) + ROM_LOAD("act5a_9316.u39", 0x0000, 0x2000, CRC(6f9eac71) SHA1(0488bdd19a6bff4e869a3480c7e9d8c5ca9938eb)) + + ROM_REGION(0x2000, "chargen", 0) + ROM_LOAD("act5a_9316.u55", 0x0000, 0x2000, CRC(8f96b7c8) SHA1(652d420ab5be9412cae322cd1799f8a9e3959c44)) +ROM_END + +//COMP(1976, act4, 0, 0, act5a, act5a, microterm_f8_state, empty_init, "Micro-Term", "ACT-IV", MACHINE_NOT_WORKING) +//COMP(1978, act5, 0, 0, act5a, act5a, microterm_f8_state, empty_init, "Micro-Term", "ACT-V", MACHINE_NOT_WORKING) +COMP(1980, act5a, 0, 0, act5a, act5a, microterm_f8_state, empty_init, "Micro-Term", "ACT-5A", MACHINE_NOT_WORKING) diff --git a/src/mame/drivers/miniforce.cpp b/src/mame/drivers/miniforce.cpp index 8578a3d3433..2e9feea1184 100644 --- a/src/mame/drivers/miniforce.cpp +++ b/src/mame/drivers/miniforce.cpp @@ -45,8 +45,8 @@ *--------------------------- * See fccpu30.cpp * - * Misc links about Force Computes and this board: - *------------------------------------------------ + * Misc links about Force Computers and this board: + *------------------------------------------------- * http://bitsavers.org/pdf/forceComputers/ * * Description, from datasheets etc diff --git a/src/mame/drivers/minitel_2_rpic.cpp b/src/mame/drivers/minitel_2_rpic.cpp index b2a131a1152..6dbee1fa3ab 100644 --- a/src/mame/drivers/minitel_2_rpic.cpp +++ b/src/mame/drivers/minitel_2_rpic.cpp @@ -26,6 +26,7 @@ - Modem and sound output. - The rear serial port. - Parameters I2C 24C02 EEPROM. + - Screen should go blank when switched off The original firmware and the experimental demo rom are currently both working. @@ -435,6 +436,9 @@ ROM_START( minitel2 ) ROM_SYSTEM_BIOS(1, "demov1", "Minitel 2 Demo") ROMX_LOAD( "demo_minitel.bin", 0x0000, 0x8000, CRC(607f2482) SHA1(7965edbef68e45d09dc67a4684da56003eff6328), ROM_BIOS(1) ) + ROM_SYSTEM_BIOS(2, "ft_bv9", "Minitel 2 ROM Bv9") + ROMX_LOAD( "bv9.1402", 0x0000, 0x8000, CRC(ace5d65e) SHA1(c8d589f8af6bd7d339964fdece937a76db972115), ROM_BIOS(2) ) + ROM_REGION( 0x4000, "ts9347", 0 ) ROM_LOAD( "charset.rom", 0x0000, 0x2000, BAD_DUMP CRC(b2f49eb3) SHA1(d0ef530be33bfc296314e7152302d95fdf9520fc) ) // from dcvg5k ROM_END diff --git a/src/mame/drivers/missile.cpp b/src/mame/drivers/missile.cpp index 0cb8247b342..ceb7416cab1 100644 --- a/src/mame/drivers/missile.cpp +++ b/src/mame/drivers/missile.cpp @@ -685,8 +685,8 @@ uint32_t missile_state::screen_update_missile(screen_device &screen, bitmap_ind1 uint8_t *videoram = m_videoram; int x, y; - /* draw the bitmap to the screen, looping over Y */ - for (y = cliprect.min_y; y <= cliprect.max_y; y++) + // draw the bitmap to the screen, looping over Y + for (y = cliprect.top(); y <= cliprect.bottom(); y++) { uint16_t *dst = &bitmap.pix16(y); @@ -694,18 +694,18 @@ uint32_t missile_state::screen_update_missile(screen_device &screen, bitmap_ind1 uint8_t *src = &videoram[effy * 64]; uint8_t *src3 = nullptr; - /* compute the base of the 3rd pixel row */ + // compute the base of the 3rd pixel row if (effy >= 224) src3 = &videoram[get_bit3_addr(effy << 8)]; - /* loop over X */ - for (x = cliprect.min_x; x <= cliprect.max_x; x++) + // loop over X + for (x = cliprect.left(); x <= cliprect.right(); x++) { uint8_t pix = src[x / 4] >> (x & 3); pix = ((pix >> 2) & 4) | ((pix << 1) & 2); - /* if we're in the lower region, get the 3rd bit */ - if (src3 != nullptr) + // if we're in the lower region, get the 3rd bit + if (src3) pix |= (src3[(x / 8) * 2] >> (x & 7)) & 1; dst[x] = pix; diff --git a/src/mame/drivers/model2.cpp b/src/mame/drivers/model2.cpp index 9de895032a9..67e9d9c0a41 100644 --- a/src/mame/drivers/model2.cpp +++ b/src/mame/drivers/model2.cpp @@ -1418,6 +1418,12 @@ void model2a_state::model2a_5881_mem(address_map &map) model2_5881_mem(map); } +void model2a_state::model2a_0229_mem(address_map &map) +{ + model2a_crx_mem(map); + model2_0229_mem(map); +} + /* 2B-CRX overrides */ void model2b_state::model2b_crx_mem(address_map &map) { @@ -1458,6 +1464,12 @@ void model2b_state::model2b_5881_mem(address_map &map) model2_5881_mem(map); } +void model2b_state::model2b_0229_mem(address_map &map) +{ + model2b_crx_mem(map); + model2_0229_mem(map); +} + /* 2C-CRX overrides */ void model2c_state::model2c_crx_mem(address_map &map) { @@ -2720,10 +2732,16 @@ MACHINE_CONFIG_START(model2a_state::model2a_5881) MCFG_SET_READ_CALLBACK(model2_state, crypt_read_callback) MACHINE_CONFIG_END + + MACHINE_CONFIG_START(model2a_state::model2a_0229) model2a(config); + + MCFG_DEVICE_MODIFY("maincpu") + MCFG_DEVICE_PROGRAM_MAP(model2a_0229_mem) + MCFG_DEVICE_ADD("317_0229", SEGA315_5838_COMP, 0) -// MCFG_SET_5838_READ_CALLBACK(model2_state, crypt_read_callback) + MCFG_DEVICE_ADDRESS_MAP(0, sega_0229_map) MACHINE_CONFIG_END void model2a_state::zeroguna(machine_config &config) @@ -2784,8 +2802,12 @@ MACHINE_CONFIG_END MACHINE_CONFIG_START(model2b_state::model2b_0229) model2b(config); + + MCFG_DEVICE_MODIFY("maincpu") + MCFG_DEVICE_PROGRAM_MAP(model2b_0229_mem) + MCFG_DEVICE_ADD("317_0229", SEGA315_5838_COMP, 0) -// MCFG_SET_5838_READ_CALLBACK(model2_state, crypt_read_callback) + MCFG_DEVICE_ADDRESS_MAP(0, sega_0229_map) MACHINE_CONFIG_END void model2b_state::indy500(machine_config &config) @@ -6559,13 +6581,57 @@ void model2_state::init_sgt24h() //ROM[0x5b3e8/4] = 0x08000004; } -void model2_state::init_doa() +READ32_MEMBER(model2_state::doa_prot_r) +{ + // doa only reads 16-bits at a time, while STV reads 32-bits + uint32 ret = 0; + + if (mem_mask&0xffff0000) ret |= (m_0229crypt->data_r(space,0,0xffff)<<16); + if (mem_mask&0x0000ffff) ret |= m_0229crypt->data_r(space,0,0xffff); + + return ret; +} + +READ32_MEMBER(model2_state::doa_unk_r) +{ + uint32_t retval = 0; + + // this actually looks a busy status flag + m_prot_a = !m_prot_a; + if (m_prot_a) + retval = 0xffff; + else + retval = 0xfff0; + + return retval; +} + +void model2_state::sega_0229_map(address_map &map) { - m_0229crypt->install_doa_protection(); + // view the protection device has into RAM, this might need endian swapping + map(0x000000, 0x007fff).ram().share("protram0229"); +} +/* common map for 0229 protection */ +void model2_state::model2_0229_mem(address_map &map) +{ + // the addresses here suggest this is only connected to a 0x8000 byte window, not 0x80000 like ST-V + map(0x01d80000, 0x01d87fff).ram().share("protram0229"); + map(0x01d87ff0, 0x01d87ff3).w(m_0229crypt, FUNC(sega_315_5838_comp_device::srcaddr_w)); + map(0x01d87ff4, 0x01d87ff7).w(m_0229crypt, FUNC(sega_315_5838_comp_device::data_w_doa)); + map(0x01d87ff8, 0x01d87ffb).r(FUNC(model2_state::doa_prot_r)); + + // is this protection related? it's in the same ram range but other games with the device don't use the address for any kind of status doesn't access the device otherwise? + map(0x01d8400c, 0x01d8400f).r(FUNC(model2_state::doa_unk_r)); +} + +void model2_state::init_doa() +{ uint32_t *ROM = (uint32_t *)memregion("maincpu")->base(); - ROM[0x630/4] = 0x08000004; - ROM[0x808/4] = 0x08000004; + ROM[0x630 / 4] = 0x08000004; + ROM[0x808 / 4] = 0x08000004; + + m_0229crypt->set_hack_mode(sega_315_5838_comp_device::HACK_MODE_DOA); } // Model 2 (TGPs, Model 1 sound board) diff --git a/src/mame/drivers/model3.cpp b/src/mame/drivers/model3.cpp index 1a2e67bff50..891dcf2a85a 100644 --- a/src/mame/drivers/model3.cpp +++ b/src/mame/drivers/model3.cpp @@ -1129,14 +1129,13 @@ WRITE64_MEMBER(model3_state::scsi_w) } } -LSI53C810_FETCH_CB(model3_state::scsi_fetch) +uint32_t model3_state::scsi_fetch(uint32_t dsp) { - address_space &space = m_maincpu->space(AS_PROGRAM); - uint32_t result = space.read_dword(dsp); + const uint32_t result = m_maincpu->space(AS_PROGRAM).read_dword(dsp); return flipendian_int32(result); } -LSI53C810_IRQ_CB(model3_state::scsi_irq_callback) +void model3_state::scsi_irq_callback(int state) { m_scsi_irq_state = state; update_irq_state(); @@ -1229,7 +1228,7 @@ WRITE64_MEMBER(model3_state::real3d_dma_w) logerror("real3d_dma_w: %08X, %08X%08X, %08X%08X", offset, (uint32_t)(data >> 32), (uint32_t)(data), (uint32_t)(mem_mask >> 32), (uint32_t)(mem_mask)); } -LSI53C810_DMA_CB(model3_state::real3d_dma_callback) +void model3_state::real3d_dma_callback(uint32_t src, uint32_t dst, int length, int byteswap) { switch(dst >> 24) { @@ -1283,12 +1282,45 @@ TIMER_CALLBACK_MEMBER(model3_state::real3d_dma_timer_callback) m_dma_busy = 0; } +/* IRQs */ +/* + 0x80: Unknown (no clearing logic in scud) + 0x40: SCSP + 0x20: Unknown (no clearing logic in scud) + 0x10: Network + 0x08: Video (unknown -- has callback hook in scud) + 0x04: Video (unknown -- has callback hook in scud) + 0x02: Video (VBLANK start?) + 0x01: Video (unused?) + + IRQ 0x08 and 0x04 directly affect the game speed in magtruck, once per scanline seems fast enough + Un-syncing the interrupts breaks the progress bar in magtruck +*/ + +TIMER_CALLBACK_MEMBER(model3_state::model3_scan_timer_tick) +{ + m_scan_timer->adjust(m_screen->time_until_pos(m_screen->vpos() + 1), m_screen->vpos() + 1); + + int scanline = param; + + if (scanline == 384) + { + set_irq_line(0x02, ASSERT_LINE); + } + else + { + //if ((scanline & 0x1) == 0) + set_irq_line(0x0c, ASSERT_LINE); + } +} + MACHINE_START_MEMBER(model3_state,model3_10) { configure_fast_ram(); m_sound_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(model3_state::model3_sound_timer_tick),this)); m_real3d_dma_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(model3_state::real3d_dma_timer_callback),this)); + m_scan_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(model3_state::model3_scan_timer_tick),this)); } MACHINE_START_MEMBER(model3_state,model3_15) { @@ -1296,6 +1328,7 @@ MACHINE_START_MEMBER(model3_state,model3_15) m_sound_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(model3_state::model3_sound_timer_tick),this)); m_real3d_dma_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(model3_state::real3d_dma_timer_callback),this)); + m_scan_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(model3_state::model3_scan_timer_tick),this)); } MACHINE_START_MEMBER(model3_state,model3_20) { @@ -1303,6 +1336,7 @@ MACHINE_START_MEMBER(model3_state,model3_20) m_sound_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(model3_state::model3_sound_timer_tick),this)); m_real3d_dma_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(model3_state::real3d_dma_timer_callback),this)); + m_scan_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(model3_state::model3_scan_timer_tick),this)); } MACHINE_START_MEMBER(model3_state,model3_21) { @@ -1310,6 +1344,7 @@ MACHINE_START_MEMBER(model3_state,model3_21) m_sound_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(model3_state::model3_sound_timer_tick),this)); m_real3d_dma_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(model3_state::real3d_dma_timer_callback),this)); + m_scan_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(model3_state::model3_scan_timer_tick),this)); } void model3_state::model3_init(int step) @@ -1334,6 +1369,8 @@ void model3_state::model3_init(int step) memcpy(m_soundram, memregion("audiocpu")->base()+0x80000, 16); m_audiocpu->reset(); + m_scan_timer->adjust(m_screen->time_until_pos(m_screen->vpos() + 1), m_screen->vpos() + 1); + m_m3_step = step; // step = BCD hardware rev. 0x10 for 1.0, 0x15 for 1.5, 0x20 for 2.0, etc. tap_reset(); @@ -1365,6 +1402,7 @@ void model3_state::model3_init(int step) } } +//void model3_state::reset_model3_10() { model3_init(0x10); } MACHINE_RESET_MEMBER(model3_state,model3_10){ model3_init(0x10); } MACHINE_RESET_MEMBER(model3_state,model3_15){ model3_init(0x15); } MACHINE_RESET_MEMBER(model3_state,model3_20){ model3_init(0x20); } @@ -5716,132 +5754,101 @@ WRITE8_MEMBER(model3_state::scsp_irq) m_audiocpu->set_input_line(offset, data); } -/* IRQs */ -/* - 0x80: Unknown (no clearing logic in scud) - 0x40: SCSP - 0x20: Unknown (no clearing logic in scud) - 0x10: Network - 0x08: Video (unknown -- has callback hook in scud) - 0x04: Video (unknown -- has callback hook in scud) - 0x02: Video (VBLANK start?) - 0x01: Video (unused?) - - IRQ 0x08 and 0x04 directly affect the game speed in magtruck, once per scanline seems fast enough - Un-syncing the interrupts breaks the progress bar in magtruck -*/ -TIMER_DEVICE_CALLBACK_MEMBER(model3_state::model3_interrupt) +void model3_state::add_cpu_66mhz(machine_config &config) { - int scanline = param; - - if (scanline == 384) - { - set_irq_line(0x02, ASSERT_LINE); - } - else - { - //if ((scanline & 0x1) == 0) - set_irq_line(0x0c, ASSERT_LINE); - } + PPC603E(config, m_maincpu, 66000000); + m_maincpu->set_bus_frequency(66000000); /* Multiplier 1, Bus = 66MHz, Core = 66MHz */ + m_maincpu->set_addrmap(AS_PROGRAM, &model3_state::model3_10_mem); } -MACHINE_CONFIG_START(model3_state::model3_10) - MCFG_DEVICE_ADD("maincpu", PPC603E, 66000000) - MCFG_PPC_BUS_FREQUENCY(66000000) /* Multiplier 1, Bus = 66MHz, Core = 66MHz */ - MCFG_DEVICE_PROGRAM_MAP(model3_10_mem) - MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", model3_state, model3_interrupt, "screen", 0, 1) - - MCFG_DEVICE_ADD("audiocpu", M68000, 12000000) - MCFG_DEVICE_PROGRAM_MAP(model3_snd) - - MCFG_QUANTUM_TIME(attotime::from_hz(600)) +void model3_state::add_cpu_100mhz(machine_config &config) +{ + PPC603E(config, m_maincpu, 100000000); + m_maincpu->set_bus_frequency(66000000); /* Multiplier 1.5, Bus = 66MHz, Core = 100MHz */ + m_maincpu->set_addrmap(AS_PROGRAM, &model3_state::model3_mem); +} - MCFG_MACHINE_START_OVERRIDE(model3_state,model3_10) - MCFG_MACHINE_RESET_OVERRIDE(model3_state,model3_10) +void model3_state::add_cpu_166mhz(machine_config &config) +{ + PPC603R(config, m_maincpu, 166000000); + m_maincpu->set_bus_frequency(66000000); /* Multiplier 2.5, Bus = 66MHz, Core = 166MHz */ + m_maincpu->set_addrmap(AS_PROGRAM, &model3_state::model3_mem); +} - MCFG_DEVICE_ADD("eeprom", EEPROM_SERIAL_93C46_16BIT) - MCFG_NVRAM_ADD_1FILL("backup") - MCFG_DEVICE_ADD("rtc", RTC72421, XTAL(32'768)) // internal oscillator +void model3_state::add_base_devices(machine_config &config) +{ + M68000(config, m_audiocpu, 12000000); + m_audiocpu->set_addrmap(AS_PROGRAM, &model3_state::model3_snd); + EEPROM_SERIAL_93C46_16BIT(config, m_eeprom); + NVRAM(config, "backup", nvram_device::DEFAULT_ALL_1); + RTC72421(config, m_rtc, XTAL(32'768)); // internal oscillator - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_VISIBLE_AREA(0, 495, 0, 383) - MCFG_SCREEN_SIZE(512, 400) - MCFG_SCREEN_UPDATE_DRIVER(model3_state, screen_update_model3) + SCREEN(config, m_screen, SCREEN_TYPE_RASTER); + m_screen->set_refresh_hz(60); + m_screen->set_visarea(0, 495, 0, 383); + m_screen->set_size(512, 400); + m_screen->set_screen_update(FUNC(model3_state::screen_update_model3)); - MCFG_PALETTE_ADD_RRRRRGGGGGBBBBB("palette") - MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfxdecode_device::empty) + PALETTE(config, m_palette, 32768); + m_palette->set_init("palette", FUNC(palette_device::palette_init_RRRRRGGGGGBBBBB)); + GFXDECODE(config, m_gfxdecode, m_palette, gfxdecode_device::empty); SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); - MCFG_DEVICE_ADD("scsp1", SCSP) - MCFG_SCSP_IRQ_CB(WRITE8(*this, model3_state, scsp_irq)) - MCFG_SOUND_ROUTE(0, "lspeaker", 2.0) - MCFG_SOUND_ROUTE(0, "rspeaker", 2.0) - - MCFG_DEVICE_ADD("scsp2", SCSP) - MCFG_SOUND_ROUTE(0, "lspeaker", 2.0) - MCFG_SOUND_ROUTE(0, "rspeaker", 2.0) - - MCFG_DEVICE_ADD("scsi", SCSI_PORT, 0) - - MCFG_DEVICE_ADD("lsi53c810", LSI53C810, 0) - MCFG_LSI53C810_IRQ_CB(model3_state, scsi_irq_callback) - MCFG_LSI53C810_DMA_CB(model3_state, real3d_dma_callback) - MCFG_LSI53C810_FETCH_CB(model3_state, scsi_fetch) - MCFG_LEGACY_SCSI_PORT("scsi") -MACHINE_CONFIG_END - -MACHINE_CONFIG_START(model3_state::model3_15) - MCFG_DEVICE_ADD("maincpu", PPC603E, 100000000) - MCFG_PPC_BUS_FREQUENCY(66000000) /* Multiplier 1.5, Bus = 66MHz, Core = 100MHz */ - MCFG_DEVICE_PROGRAM_MAP(model3_mem) - MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", model3_state, model3_interrupt, "screen", 0, 1) - - MCFG_DEVICE_ADD("audiocpu", M68000, 12000000) - MCFG_DEVICE_PROGRAM_MAP(model3_snd) - - MCFG_MACHINE_START_OVERRIDE(model3_state,model3_15) - MCFG_MACHINE_RESET_OVERRIDE(model3_state,model3_15) + SCSP(config, m_scsp1); + m_scsp1->irq_cb().set(FUNC(model3_state::scsp_irq)); + m_scsp1->add_route(0, "lspeaker", 2.0); + m_scsp1->add_route(0, "rspeaker", 2.0); + + scsp_device &scsp2(SCSP(config, "scsp2")); + scsp2.add_route(0, "lspeaker", 2.0); + scsp2.add_route(0, "rspeaker", 2.0); +} - MCFG_DEVICE_ADD("eeprom", EEPROM_SERIAL_93C46_16BIT) - MCFG_NVRAM_ADD_1FILL("backup") - MCFG_DEVICE_ADD("rtc", RTC72421, XTAL(32'768)) // internal oscillator +void model3_state::add_scsi_devices(machine_config &config) +{ + SCSI_PORT(config, "scsi", 0); + LSI53C810(config, m_lsi53c810, 0); + m_lsi53c810->set_irq_callback(FUNC(model3_state::scsi_irq_callback)); + m_lsi53c810->set_dma_callback(FUNC(model3_state::real3d_dma_callback)); + m_lsi53c810->set_fetch_callback(FUNC(model3_state::scsi_fetch)); + m_lsi53c810->set_scsi_port("scsi"); +} - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_VISIBLE_AREA(0, 495, 0, 383) - MCFG_SCREEN_SIZE(496, 400) - MCFG_SCREEN_UPDATE_DRIVER(model3_state, screen_update_model3) +void model3_state::add_crypt_devices(machine_config &config) +{ + m_maincpu->set_addrmap(AS_PROGRAM, &model3_state::model3_5881_mem); - MCFG_PALETTE_ADD_RRRRRGGGGGBBBBB("palette") - MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfxdecode_device::empty) + SEGA315_5881_CRYPT(config, m_cryptdevice, 0); + m_cryptdevice->set_read_cb(FUNC(model3_state::crypt_read_callback)); +} +void model3_state::model3_10(machine_config &config) +{ + add_cpu_66mhz(config); + add_base_devices(config); + add_scsi_devices(config); - SPEAKER(config, "lspeaker").front_left(); - SPEAKER(config, "rspeaker").front_right(); - MCFG_DEVICE_ADD("scsp1", SCSP) - MCFG_SCSP_IRQ_CB(WRITE8(*this, model3_state, scsp_irq)) - MCFG_SOUND_ROUTE(0, "lspeaker", 2.0) - MCFG_SOUND_ROUTE(0, "rspeaker", 2.0) + config.m_minimum_quantum = attotime::from_hz(600); - MCFG_DEVICE_ADD("scsp2", SCSP) - MCFG_SOUND_ROUTE(0, "lspeaker", 2.0) - MCFG_SOUND_ROUTE(0, "rspeaker", 2.0) + MCFG_MACHINE_START_OVERRIDE(model3_state,model3_10) + MCFG_MACHINE_RESET_OVERRIDE(model3_state,model3_10) +} - MCFG_DEVICE_ADD("scsi", SCSI_PORT, 0) +void model3_state::model3_15(machine_config &config) +{ + add_cpu_100mhz(config); + add_base_devices(config); + add_scsi_devices(config); - MCFG_DEVICE_ADD("lsi53c810", LSI53C810, 0) - MCFG_LSI53C810_IRQ_CB(model3_state, scsi_irq_callback) - MCFG_LSI53C810_DMA_CB(model3_state, real3d_dma_callback) - MCFG_LSI53C810_FETCH_CB(model3_state, scsi_fetch) - MCFG_LEGACY_SCSI_PORT("scsi") + MCFG_MACHINE_START_OVERRIDE(model3_state,model3_15) + MCFG_MACHINE_RESET_OVERRIDE(model3_state,model3_15) - MCFG_M3COMM_ADD("comm_board") -MACHINE_CONFIG_END + M3COMM(config, "comm_board", 0); +} void model3_state::scud(machine_config &config) { @@ -5859,46 +5866,16 @@ void model3_state::scud(machine_config &config) uart_clock.signal_handler().append(m_uart, FUNC(i8251_device::write_rxc)); } -MACHINE_CONFIG_START(model3_state::model3_20) - MCFG_DEVICE_ADD("maincpu", PPC603R, 166000000) - MCFG_PPC_BUS_FREQUENCY(66000000) /* Multiplier 2.5, Bus = 66MHz, Core = 166MHz */ - MCFG_DEVICE_PROGRAM_MAP(model3_mem) - MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", model3_state, model3_interrupt, "screen", 0, 1) - - MCFG_DEVICE_ADD("audiocpu", M68000, 12000000) - MCFG_DEVICE_PROGRAM_MAP(model3_snd) +void model3_state::model3_20(machine_config &config) +{ + add_cpu_166mhz(config); + add_base_devices(config); MCFG_MACHINE_START_OVERRIDE(model3_state, model3_20) MCFG_MACHINE_RESET_OVERRIDE(model3_state, model3_20) - MCFG_DEVICE_ADD("eeprom", EEPROM_SERIAL_93C46_16BIT) - MCFG_NVRAM_ADD_1FILL("backup") - MCFG_DEVICE_ADD("rtc", RTC72421, XTAL(32'768)) // internal oscillator - - - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_VISIBLE_AREA(0, 495, 0, 383) - MCFG_SCREEN_SIZE(496, 400) - MCFG_SCREEN_UPDATE_DRIVER(model3_state, screen_update_model3) - - MCFG_PALETTE_ADD_RRRRRGGGGGBBBBB("palette") - MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfxdecode_device::empty) - - - SPEAKER(config, "lspeaker").front_left(); - SPEAKER(config, "rspeaker").front_right(); - MCFG_DEVICE_ADD("scsp1", SCSP) - MCFG_SCSP_IRQ_CB(WRITE8(*this, model3_state, scsp_irq)) - MCFG_SOUND_ROUTE(0, "lspeaker", 2.0) - MCFG_SOUND_ROUTE(0, "rspeaker", 2.0) - - MCFG_DEVICE_ADD("scsp2", SCSP) - MCFG_SOUND_ROUTE(0, "lspeaker", 2.0) - MCFG_SOUND_ROUTE(0, "rspeaker", 2.0) - - MCFG_M3COMM_ADD("comm_board") -MACHINE_CONFIG_END + M3COMM(config, "comm_board", 0); +} uint16_t model3_state::crypt_read_callback(uint32_t addr) { @@ -5914,67 +5891,28 @@ uint16_t model3_state::crypt_read_callback(uint32_t addr) return dat; } -MACHINE_CONFIG_START(model3_state::model3_20_5881) +void model3_state::model3_20_5881(machine_config &config) +{ model3_20(config); + add_crypt_devices(config); +} - MCFG_DEVICE_MODIFY("maincpu") - MCFG_DEVICE_PROGRAM_MAP(model3_5881_mem) - - MCFG_DEVICE_ADD("315_5881", SEGA315_5881_CRYPT, 0) - MCFG_SET_READ_CALLBACK(model3_state, crypt_read_callback) -MACHINE_CONFIG_END - -MACHINE_CONFIG_START(model3_state::model3_21) - MCFG_DEVICE_ADD("maincpu", PPC603R, 166000000) - MCFG_PPC_BUS_FREQUENCY(66000000) /* Multiplier 2.5, Bus = 66MHz, Core = 166MHz */ - MCFG_DEVICE_PROGRAM_MAP(model3_mem) - MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", model3_state, model3_interrupt, "screen", 0, 1) - - MCFG_DEVICE_ADD("audiocpu", M68000, 12000000) - MCFG_DEVICE_PROGRAM_MAP(model3_snd) +void model3_state::model3_21(machine_config &config) +{ + add_cpu_166mhz(config); + add_base_devices(config); MCFG_MACHINE_START_OVERRIDE(model3_state, model3_21) MCFG_MACHINE_RESET_OVERRIDE(model3_state, model3_21) - MCFG_DEVICE_ADD("eeprom", EEPROM_SERIAL_93C46_16BIT) - MCFG_NVRAM_ADD_1FILL("backup") - MCFG_DEVICE_ADD("rtc", RTC72421, XTAL(32'768)) // internal oscillator - - - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_VISIBLE_AREA(0, 495, 0, 383) - MCFG_SCREEN_SIZE(496, 400) - MCFG_SCREEN_UPDATE_DRIVER(model3_state, screen_update_model3) - - MCFG_PALETTE_ADD_RRRRRGGGGGBBBBB("palette") - MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfxdecode_device::empty) - - SPEAKER(config, "lspeaker").front_left(); - SPEAKER(config, "rspeaker").front_right(); - MCFG_DEVICE_ADD("scsp1", SCSP) - MCFG_SCSP_IRQ_CB(WRITE8(*this, model3_state, scsp_irq)) - MCFG_SOUND_ROUTE(0, "lspeaker", 2.0) - MCFG_SOUND_ROUTE(0, "rspeaker", 2.0) - - MCFG_DEVICE_ADD("scsp2", SCSP) - MCFG_SOUND_ROUTE(0, "lspeaker", 2.0) - MCFG_SOUND_ROUTE(0, "rspeaker", 2.0) - - MCFG_M3COMM_ADD("comm_board") -MACHINE_CONFIG_END + M3COMM(config, "comm_board", 0); +} -MACHINE_CONFIG_START(model3_state::model3_21_5881) +void model3_state::model3_21_5881(machine_config &config) +{ model3_21(config); - - MCFG_DEVICE_MODIFY("maincpu") - MCFG_DEVICE_PROGRAM_MAP(model3_5881_mem) - - MCFG_DEVICE_ADD("315_5881", SEGA315_5881_CRYPT, 0) - MCFG_SET_READ_CALLBACK(model3_state, crypt_read_callback) -MACHINE_CONFIG_END - + add_crypt_devices(config); +} void model3_state::interleave_vroms() { diff --git a/src/mame/drivers/mrgame.cpp b/src/mame/drivers/mrgame.cpp index 3c460b5ebd4..aa9ddfe0b45 100644 --- a/src/mame/drivers/mrgame.cpp +++ b/src/mame/drivers/mrgame.cpp @@ -10,7 +10,7 @@ Status: - motrshow, motrshowa, dakar working in the electronic sense, but not mechanically - macattck most roms are missing -- wcup90 different hardware, not coded +- wcup90 different hardware, partially coded based on macattck schematic How to set up the machine (motrshow, motrshowa, dakar): - These machines need to be loaded with default settings before they can accept coins @@ -27,16 +27,17 @@ ToDo: - Support for electronic volume control - Audio rom banking - Most sounds missing due to unemulated M114 chip -- wcup90 is different hardware and there's no schematic *****************************************************************************************/ #include "emu.h" #include "cpu/m68000/m68000.h" #include "cpu/z80/z80.h" +#include "machine/74259.h" #include "machine/i8255.h" #include "machine/nvram.h" #include "machine/timer.h" +//#include "machine/watchdog.h" #include "sound/dac.h" #include "sound/tms5220.h" #include "sound/volt_reg.h" @@ -58,6 +59,7 @@ public: , m_maincpu(*this, "maincpu") , m_audiocpu1(*this, "audiocpu1") , m_audiocpu2(*this, "audiocpu2") + , m_videocpu(*this, "videocpu") , m_io_dsw0(*this, "DSW0") , m_io_dsw1(*this, "DSW1") , m_io_x0(*this, "X0") @@ -65,6 +67,7 @@ public: { } void mrgame(machine_config &config); + void wcup90(machine_config &config); void init_mrgame(); @@ -77,42 +80,55 @@ private: DECLARE_WRITE8_MEMBER(sound_w); DECLARE_WRITE8_MEMBER(triple_w); DECLARE_WRITE8_MEMBER(video_w); - DECLARE_WRITE8_MEMBER(video_ctrl_w); + DECLARE_WRITE_LINE_MEMBER(video_a11_w); + DECLARE_WRITE_LINE_MEMBER(video_a12_w); + DECLARE_WRITE_LINE_MEMBER(video_a13_w); + DECLARE_WRITE_LINE_MEMBER(intst_w); + DECLARE_WRITE_LINE_MEMBER(nmi_intst_w); + DECLARE_WRITE_LINE_MEMBER(flip_w); DECLARE_READ8_MEMBER(col_r); DECLARE_READ8_MEMBER(sound_r); DECLARE_READ8_MEMBER(porta_r); DECLARE_READ8_MEMBER(portc_r); DECLARE_READ8_MEMBER(rsw_r); + DECLARE_WRITE_LINE_MEMBER(vblank_int_w); + DECLARE_WRITE_LINE_MEMBER(vblank_nmi_w); TIMER_DEVICE_CALLBACK_MEMBER(irq_timer); uint32_t screen_update_mrgame(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - std::unique_ptr<bitmap_ind16> m_tile_bitmap; - required_device<palette_device> m_palette; - required_shared_ptr<uint8_t> m_p_videoram; - required_shared_ptr<uint8_t> m_p_objectram; - required_device<gfxdecode_device> m_gfxdecode; + void audio1_io(address_map &map); void audio1_map(address_map &map); void audio2_io(address_map &map); void audio2_map(address_map &map); void main_map(address_map &map); void video_map(address_map &map); + void wcup90_video_map(address_map &map); + + virtual void machine_start() override; + virtual void machine_reset() override; + + std::unique_ptr<bitmap_ind16> m_tile_bitmap; + required_device<palette_device> m_palette; + required_shared_ptr<uint8_t> m_p_videoram; + required_shared_ptr<uint8_t> m_p_objectram; + required_device<gfxdecode_device> m_gfxdecode; bool m_ack1; bool m_ack2; bool m_ackv; bool m_flip; + bool m_intst; uint8_t m_irq_state; uint8_t m_row_data; uint8_t m_sound_data; uint8_t m_gfx_bank; uint8_t m_video_data; uint8_t m_video_status; - uint8_t m_video_ctrl[8]; - virtual void machine_start() override; - virtual void machine_reset() override; + required_device<m68000_device> m_maincpu; required_device<z80_device> m_audiocpu1; required_device<z80_device> m_audiocpu2; + required_device<z80_device> m_videocpu; required_ioport m_io_dsw0; required_ioport m_io_dsw1; required_ioport m_io_x0; @@ -140,11 +156,22 @@ void mrgame_state::video_map(address_map &map) map(0x4000, 0x47ff).ram(); map(0x4800, 0x4bff).mirror(0x0400).ram().share("videoram"); map(0x5000, 0x50ff).mirror(0x0700).ram().share("objectram"); - map(0x6800, 0x6807).mirror(0x07f8).w(FUNC(mrgame_state::video_ctrl_w)); - map(0x7000, 0x77ff).nopr(); //AFR - looks like a watchdog + map(0x6800, 0x6807).mirror(0x07f8).w("selectlatch", FUNC(ls259_device::write_d0)); + map(0x7000, 0x7000).mirror(0x07ff).nopr(); //AFR - watchdog reset map(0x8100, 0x8103).mirror(0x7efc).rw("ppi", FUNC(i8255_device::read), FUNC(i8255_device::write)); } +void mrgame_state::wcup90_video_map(address_map &map) +{ + map(0x0000, 0x7fff).rom().region("video", 0); + map(0x8000, 0x87ff).ram(); + map(0x8800, 0x8bff).mirror(0x0400).ram().share("videoram"); + map(0x9000, 0x90ff).mirror(0x0700).ram().share("objectram"); + map(0xa800, 0xa807).mirror(0x07f8).w("selectlatch", FUNC(ls259_device::write_d0)); + map(0xb000, 0xb000).mirror(0x07ff).nopr(); //AFR - watchdog reset + map(0xc000, 0xc003).mirror(0x3ffc).rw("ppi", FUNC(i8255_device::read), FUNC(i8255_device::write)); +} + void mrgame_state::audio1_map(address_map &map) { map(0x0000, 0x7fff).rom().region("audio1", 0); @@ -225,13 +252,13 @@ static INPUT_PORTS_START( mrgame ) PORT_BIT( 0xe9, IP_ACTIVE_LOW, IPT_UNUSED ) INPUT_PORTS_END -READ8_MEMBER( mrgame_state::rsw_r ) +READ8_MEMBER(mrgame_state::rsw_r) { return m_io_dsw0->read() | ((uint8_t)m_ack1 << 5) | ((uint8_t)m_ack2 << 4); } // this is like a keyboard, energise a row and read the column data -READ8_MEMBER( mrgame_state::col_r ) +READ8_MEMBER(mrgame_state::col_r) { if (m_row_data == 0) return m_io_x0->read(); @@ -246,17 +273,17 @@ READ8_MEMBER( mrgame_state::col_r ) return 0xff; } -WRITE8_MEMBER( mrgame_state::row_w ) +WRITE8_MEMBER(mrgame_state::row_w) { m_row_data = data & 7; } -READ8_MEMBER( mrgame_state::sound_r ) +READ8_MEMBER(mrgame_state::sound_r) { return m_sound_data; } -WRITE8_MEMBER( mrgame_state::sound_w ) +WRITE8_MEMBER(mrgame_state::sound_w) { m_sound_data = data; m_audiocpu1->set_input_line(INPUT_LINE_NMI, BIT(data, 7) ? CLEAR_LINE : ASSERT_LINE); @@ -264,56 +291,73 @@ WRITE8_MEMBER( mrgame_state::sound_w ) } // this produces 24 outputs from three driver chips to drive lamps & solenoids -WRITE8_MEMBER( mrgame_state::triple_w ) +WRITE8_MEMBER(mrgame_state::triple_w) { if ((data & 0x18)==0) m_ackv = BIT(data, 7); } -WRITE8_MEMBER( mrgame_state::video_w ) +WRITE8_MEMBER(mrgame_state::video_w) { m_video_data = data; } -WRITE8_MEMBER( mrgame_state::video_ctrl_w ) +WRITE_LINE_MEMBER(mrgame_state::video_a11_w) { - m_video_ctrl[offset] = data; + m_gfx_bank = (m_gfx_bank & 6) | (state ? 1 : 0); +} - if (offset == 0) - m_gfx_bank = (m_gfx_bank & 6) | BIT(data, 0); - else - if (offset == 3) - m_gfx_bank = (m_gfx_bank & 5) | (BIT(data, 0) << 1); - else - if (offset == 4) - m_gfx_bank = (m_gfx_bank & 3) | (BIT(data, 0) << 2); - else - if (offset == 6) - m_flip = BIT(data, 0); +WRITE_LINE_MEMBER(mrgame_state::video_a12_w) +{ + m_gfx_bank = (m_gfx_bank & 5) | (state ? 2 : 0); +} + +WRITE_LINE_MEMBER(mrgame_state::video_a13_w) +{ + m_gfx_bank = (m_gfx_bank & 3) | (state ? 4 : 0); +} + +WRITE_LINE_MEMBER(mrgame_state::intst_w) +{ + m_intst = state; + if (!state) + m_videocpu->set_input_line(INPUT_LINE_IRQ0, CLEAR_LINE); +} + +WRITE_LINE_MEMBER(mrgame_state::nmi_intst_w) +{ + m_intst = state; + if (!state) + m_videocpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE); } -WRITE8_MEMBER( mrgame_state::ack1_w ) +WRITE_LINE_MEMBER(mrgame_state::flip_w) +{ + m_flip = state; +} + +WRITE8_MEMBER(mrgame_state::ack1_w) { m_ack1 = BIT(data, 0); } -WRITE8_MEMBER( mrgame_state::ack2_w ) +WRITE8_MEMBER(mrgame_state::ack2_w) { m_ack2 = BIT(data, 0); } -READ8_MEMBER( mrgame_state::porta_r ) +READ8_MEMBER(mrgame_state::porta_r) { return m_video_data; } -WRITE8_MEMBER( mrgame_state::portb_w ) +WRITE8_MEMBER(mrgame_state::portb_w) { m_video_status = data; m_ackv = 0; } -READ8_MEMBER( mrgame_state::portc_r ) +READ8_MEMBER(mrgame_state::portc_r) { return m_io_dsw1->read() | ((uint8_t)m_ackv << 4); } @@ -341,9 +385,21 @@ void mrgame_state::init_mrgame() { } +WRITE_LINE_MEMBER(mrgame_state::vblank_int_w) +{ + if (state && m_intst) + m_videocpu->set_input_line(INPUT_LINE_IRQ0, ASSERT_LINE); +} + +WRITE_LINE_MEMBER(mrgame_state::vblank_nmi_w) +{ + if (state && m_intst) + m_videocpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE); +} + // This pulses the IRQ pins of both audio cpus. The schematic does not //show which 4040 output is used, so we have guessed. -TIMER_DEVICE_CALLBACK_MEMBER( mrgame_state::irq_timer ) +TIMER_DEVICE_CALLBACK_MEMBER(mrgame_state::irq_timer) { m_irq_state++; // pulse_line of IRQ not allowed, so trying this instead @@ -383,12 +439,12 @@ static const gfx_layout spritelayout = 32*8 }; -static GFXDECODE_START( gfx_mrgame ) - GFXDECODE_ENTRY( "chargen", 0, charlayout, 0, 16 ) - GFXDECODE_ENTRY( "chargen", 0, spritelayout, 0, 16 ) +static GFXDECODE_START(gfx_mrgame) + GFXDECODE_ENTRY("chargen", 0, charlayout, 0, 16) + GFXDECODE_ENTRY("chargen", 0, spritelayout, 0, 16) GFXDECODE_END -PALETTE_INIT_MEMBER( mrgame_state, mrgame) +PALETTE_INIT_MEMBER(mrgame_state, mrgame) { static const int resistances[3] = { 1000, 470, 220 }; double rweights[3], gweights[3], bweights[2]; @@ -479,31 +535,43 @@ uint32_t mrgame_state::screen_update_mrgame(screen_device &screen, bitmap_ind16 MACHINE_CONFIG_START(mrgame_state::mrgame) /* basic machine hardware */ - MCFG_DEVICE_ADD("maincpu", M68000, XTAL(6'000'000)) + MCFG_DEVICE_ADD("maincpu", M68000, 6_MHz_XTAL) MCFG_DEVICE_PROGRAM_MAP(main_map) MCFG_DEVICE_PERIODIC_INT_DRIVER(mrgame_state, irq1_line_hold, 183) - MCFG_DEVICE_ADD("videocpu", Z80, XTAL(18'432'000)/6) + + MCFG_DEVICE_ADD("videocpu", Z80, 18.432_MHz_XTAL / 6) MCFG_DEVICE_PROGRAM_MAP(video_map) - MCFG_DEVICE_VBLANK_INT_DRIVER("screen", mrgame_state, nmi_line_pulse) - MCFG_DEVICE_ADD("audiocpu1", Z80, XTAL(4'000'000)) + + MCFG_DEVICE_ADD("audiocpu1", Z80, 4_MHz_XTAL) MCFG_DEVICE_PROGRAM_MAP(audio1_map) MCFG_DEVICE_IO_MAP(audio1_io) - MCFG_DEVICE_ADD("audiocpu2", Z80, XTAL(4'000'000)) + + MCFG_DEVICE_ADD("audiocpu2", Z80, 4_MHz_XTAL) MCFG_DEVICE_PROGRAM_MAP(audio2_map) MCFG_DEVICE_IO_MAP(audio2_io) - MCFG_NVRAM_ADD_0FILL("nvram") + MCFG_NVRAM_ADD_0FILL("nvram") // 5564 (x2) + battery + + ls259_device &select(LS259(config, "selectlatch")); // 5B + select.q_out_cb<0>().set(FUNC(mrgame_state::video_a11_w)); + select.q_out_cb<1>().set(FUNC(mrgame_state::nmi_intst_w)); + select.q_out_cb<3>().set(FUNC(mrgame_state::video_a12_w)); + select.q_out_cb<4>().set(FUNC(mrgame_state::video_a13_w)); + select.q_out_cb<6>().set(FUNC(mrgame_state::flip_w)); + + //watchdog_timer_device &watchdog(WATCHDOG_TIMER(config, "watchdog")); // LS393 at 5D (video board) driven by VBLANK + //watchdog.set_vblank_count("screen", 8); /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(50) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */ - MCFG_SCREEN_SIZE(256, 256) - MCFG_SCREEN_VISIBLE_AREA(0, 255, 8, 247) // If you align with X on test screen some info is chopped off + MCFG_SCREEN_RAW_PARAMS(18.432_MHz_XTAL / 3, 384, 0, 256, 264, 8, 248) // If you align with X on test screen some info is chopped off MCFG_SCREEN_UPDATE_DRIVER(mrgame_state, screen_update_mrgame) MCFG_SCREEN_PALETTE("palette") + MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, mrgame_state, vblank_nmi_w)) + MCFG_PALETTE_ADD("palette", 64) MCFG_PALETTE_INIT_OWNER(mrgame_state, mrgame) + MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_mrgame) /* Sound */ @@ -530,6 +598,19 @@ MACHINE_CONFIG_START(mrgame_state::mrgame) MCFG_I8255_IN_PORTC_CB(READ8(*this, mrgame_state, portc_r)) MACHINE_CONFIG_END +MACHINE_CONFIG_START(mrgame_state::wcup90) + mrgame(config); + + MCFG_DEVICE_MODIFY("videocpu") + MCFG_DEVICE_PROGRAM_MAP(wcup90_video_map) + + MCFG_DEVICE_MODIFY("selectlatch") // U48 + MCFG_ADDRESSABLE_LATCH_Q1_OUT_CB(WRITELINE(*this, mrgame_state, intst_w)) + + MCFG_DEVICE_MODIFY("screen") + MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, mrgame_state, vblank_int_w)) +MACHINE_CONFIG_END + /*------------------------------------------------------------------- / Dakar (06/1988) /-------------------------------------------------------------------*/ @@ -538,14 +619,14 @@ ROM_START(dakar) ROM_LOAD16_BYTE("cpu_ic13.rom", 0x000001, 0x8000, CRC(83183929) SHA1(977ac10a1e78c759eb0550794f2639fe0e2d1507)) ROM_LOAD16_BYTE("cpu_ic14.rom", 0x000000, 0x8000, CRC(2010d28d) SHA1(d262dabd9298566df43df298cf71c974bee1434a)) - ROM_REGION(0x10000, "video", 0) - ROM_LOAD("vid_ic14.rom", 0x00000, 0x8000, CRC(88a9ca81) SHA1(9660d416b2b8f1937cda7bca51bd287641c7730c)) + ROM_REGION(0x8000, "video", 0) + ROM_LOAD("vid_ic14.rom", 0x0000, 0x8000, CRC(88a9ca81) SHA1(9660d416b2b8f1937cda7bca51bd287641c7730c)) - ROM_REGION( 0x10000, "chargen", 0 ) + ROM_REGION(0x10000, "chargen", 0) ROM_LOAD("vid_ic55.rom", 0x0000, 0x8000, CRC(3c68b448) SHA1(f416f00d2de0c71c021fec0e9702ba79b761d5e7)) ROM_LOAD("vid_ic56.rom", 0x8000, 0x8000, CRC(0aac43e9) SHA1(28edfeddb2d54e40425488bad37e3819e4488b0b)) - ROM_REGION( 0x0020, "proms", 0 ) + ROM_REGION(0x0020, "proms", 0) ROM_LOAD("vid_ic66.rom", 0x0000, 0x0020, CRC(c8269b27) SHA1(daa83bfdb1e255b846bbade7f200abeaa9399c06)) ROM_REGION(0x10000, "audio1", 0) @@ -568,14 +649,14 @@ ROM_START(motrshow) ROM_LOAD16_BYTE("cpu_ic13.rom", 0x000001, 0x8000, CRC(e862ca71) SHA1(b02e5f39f9427d58b70b7999a5ff6075beff05ae)) ROM_LOAD16_BYTE("cpu_ic14.rom", 0x000000, 0x8000, CRC(c898ae25) SHA1(f0e1369284a1e0f394f1d40281fd46252016602e)) - ROM_REGION(0x10000, "video", 0) - ROM_LOAD("vid_ic14.rom", 0x00000, 0x8000, CRC(1d4568e2) SHA1(bfc2bb59708ce3a09f9a1b3460ed8d5269840c97)) + ROM_REGION(0x8000, "video", 0) + ROM_LOAD("vid_ic14.rom", 0x0000, 0x8000, CRC(1d4568e2) SHA1(bfc2bb59708ce3a09f9a1b3460ed8d5269840c97)) - ROM_REGION( 0x10000, "chargen", 0 ) + ROM_REGION(0x10000, "chargen", 0) ROM_LOAD("vid_ic55.rom", 0x0000, 0x8000, CRC(c27a4ded) SHA1(9c2c9b17f1e71afb74bdfbdcbabb99ef935d32db)) ROM_LOAD("vid_ic56.rom", 0x8000, 0x8000, CRC(1664ec8d) SHA1(e7b15acdac7dfc51b668e908ca95f02a2b569737)) - ROM_REGION( 0x0020, "proms", 0 ) + ROM_REGION(0x0020, "proms", 0) ROM_LOAD("vid_ic66.rom", 0x0000, 0x0020, CRC(5b585252) SHA1(b88e56ebdce2c3a4b170aff4b05018e7c21a79b8)) ROM_REGION(0x10000, "audio1", 0) @@ -594,14 +675,14 @@ ROM_START(motrshowa) ROM_LOAD16_BYTE("cpuic13a.rom", 0x000001, 0x8000, CRC(2dbdd9d4) SHA1(b404814a4e83ead6da3c57818ae97f23d380f9da)) ROM_LOAD16_BYTE("cpuic14b.rom", 0x000000, 0x8000, CRC(0bd98fec) SHA1(b90a7e997db59740398003ba94a69118b1ee70af)) - ROM_REGION(0x10000, "video", 0) - ROM_LOAD("vid_ic14.rom", 0x00000, 0x8000, CRC(1d4568e2) SHA1(bfc2bb59708ce3a09f9a1b3460ed8d5269840c97)) + ROM_REGION(0x8000, "video", 0) + ROM_LOAD("vid_ic14.rom", 0x0000, 0x8000, CRC(1d4568e2) SHA1(bfc2bb59708ce3a09f9a1b3460ed8d5269840c97)) - ROM_REGION( 0x10000, "chargen", 0 ) + ROM_REGION(0x10000, "chargen", 0) ROM_LOAD("vid_ic55.rom", 0x0000, 0x8000, CRC(c27a4ded) SHA1(9c2c9b17f1e71afb74bdfbdcbabb99ef935d32db)) ROM_LOAD("vid_ic56.rom", 0x8000, 0x8000, CRC(1664ec8d) SHA1(e7b15acdac7dfc51b668e908ca95f02a2b569737)) - ROM_REGION( 0x0020, "proms", 0 ) + ROM_REGION(0x0020, "proms", 0) ROM_LOAD("vid_ic66.rom", 0x0000, 0x0020, CRC(5b585252) SHA1(b88e56ebdce2c3a4b170aff4b05018e7c21a79b8)) ROM_REGION(0x10000, "audio1", 0) @@ -623,17 +704,17 @@ ROM_START(macattck) ROM_LOAD16_BYTE("cpu_ic13.rom", 0x000001, 0x8000, NO_DUMP) ROM_LOAD16_BYTE("cpu_ic14.rom", 0x000000, 0x8000, NO_DUMP) - ROM_REGION(0x10000, "video", 0) - ROM_LOAD("vid_ic91.rom", 0x00000, 0x8000, CRC(42d2ba01) SHA1(c13d38c2798575760461912cef65dde57dfd938c)) + ROM_REGION(0x8000, "video", 0) + ROM_LOAD("vid_ic91.rom", 0x0000, 0x8000, CRC(42d2ba01) SHA1(c13d38c2798575760461912cef65dde57dfd938c)) - ROM_REGION( 0x30000, "chargen", 0 ) + ROM_REGION(0x30000, "chargen", 0) ROM_LOAD("vid_ic14.rom", 0x00000, 0x8000, CRC(f6e047fb) SHA1(6be712dda60257b9e7014315c8fee19812622bf6)) ROM_LOAD("vid_ic15.rom", 0x08000, 0x8000, CRC(405a8f54) SHA1(4d58915763db3c3be2bfc166be1a12285ff2c38b)) ROM_LOAD("vid_ic16.rom", 0x10000, 0x8000, CRC(063ea783) SHA1(385dbfcc8ecd3a784f9a8752d00e060b48d70d6a)) ROM_LOAD("vid_ic17.rom", 0x18000, 0x8000, CRC(9f95abf8) SHA1(d71cf36c8bf27ad41b2d3cebd0af620a34ce0062) BAD_DUMP) ROM_LOAD("vid_ic18.rom", 0x20000, 0x8000, CRC(83ef25f8) SHA1(bab482badb8646b099dbb197ca9af3a126b274e3)) - ROM_REGION( 0x0020, "proms", 0 ) + ROM_REGION(0x0020, "proms", 0) ROM_LOAD("vid_ic61.rom", 0x0000, 0x0020, CRC(538c72ae) SHA1(f704492568257fcc4a4f1189207c6fb6526eb81c) BAD_DUMP) ROM_REGION(0x10000, "audio1", 0) @@ -655,17 +736,17 @@ ROM_START(wcup90) ROM_LOAD16_BYTE("cpu_ic13.rom", 0x000001, 0x8000, CRC(0e2edfb0) SHA1(862fb1f6509fb1f560d0b2bb8a5764f64b259f04)) ROM_LOAD16_BYTE("cpu_ic14.rom", 0x000000, 0x8000, CRC(fdd03165) SHA1(6dc6e68197218f8808436098c26cd04fc3215b1c)) - ROM_REGION(0x10000, "video", 0) - ROM_LOAD("vid_ic91.rom", 0x00000, 0x8000, CRC(3287ad20) SHA1(d5a453efc7292670073f157dca04897be857b8ed)) + ROM_REGION(0x8000, "video", 0) + ROM_LOAD("vid_ic91.rom", 0x0000, 0x8000, CRC(3287ad20) SHA1(d5a453efc7292670073f157dca04897be857b8ed)) - ROM_REGION( 0x30000, "chargen", 0 ) + ROM_REGION(0x30000, "chargen", 0) ROM_LOAD("vid_ic14.rom", 0x00000, 0x8000, CRC(a101d562) SHA1(ad9ad3968f13169572ec60e22e84acf43382b51e)) ROM_LOAD("vid_ic15.rom", 0x08000, 0x8000, CRC(40791e7a) SHA1(788760b8527df48d1825be88099491b6e94f0a19)) ROM_LOAD("vid_ic16.rom", 0x10000, 0x8000, CRC(a7214157) SHA1(a4660180e8491a37028fec8533cf13daf839a7c4)) ROM_LOAD("vid_ic17.rom", 0x18000, 0x8000, CRC(caf4fb04) SHA1(81784a4dc7c671090cf39cafa7d34a6b34523168)) ROM_LOAD("vid_ic18.rom", 0x20000, 0x8000, CRC(83ad2a10) SHA1(37664e5872e6322ee6bb61ec9385876626598152)) - ROM_REGION( 0x0020, "proms", 0 ) + ROM_REGION(0x0020, "proms", 0) ROM_LOAD("vid_ic61.rom", 0x0000, 0x0020, CRC(538c72ae) SHA1(f704492568257fcc4a4f1189207c6fb6526eb81c)) ROM_REGION(0x10000, "audio1", 0) @@ -686,5 +767,5 @@ ROM_END GAME(1988, dakar, 0, mrgame, mrgame, mrgame_state, init_mrgame, ROT0, "Mr Game", "Dakar", MACHINE_MECHANICAL | MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) GAME(1989, motrshow, 0, mrgame, mrgame, mrgame_state, init_mrgame, ROT0, "Mr Game", "Motor Show (set 1)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) GAME(1989, motrshowa, motrshow, mrgame, mrgame, mrgame_state, init_mrgame, ROT0, "Mr Game", "Motor Show (set 2)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) -GAME(1990, macattck, 0, mrgame, mrgame, mrgame_state, init_mrgame, ROT0, "Mr Game", "Mac Attack", MACHINE_IS_SKELETON_MECHANICAL) -GAME(1990, wcup90, 0, mrgame, mrgame, mrgame_state, init_mrgame, ROT0, "Mr Game", "World Cup 90", MACHINE_IS_SKELETON_MECHANICAL) +GAME(1990, macattck, 0, wcup90, mrgame, mrgame_state, init_mrgame, ROT0, "Mr Game", "Mac Attack", MACHINE_IS_SKELETON_MECHANICAL) +GAME(1990, wcup90, 0, wcup90, mrgame, mrgame_state, init_mrgame, ROT0, "Mr Game", "World Cup 90", MACHINE_MECHANICAL | MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) diff --git a/src/mame/drivers/ms6102.cpp b/src/mame/drivers/ms6102.cpp index e7ab393ffb6..320e27d9c85 100644 --- a/src/mame/drivers/ms6102.cpp +++ b/src/mame/drivers/ms6102.cpp @@ -346,9 +346,9 @@ MACHINE_CONFIG_START(ms6102_state::ms6102) MCFG_AY31015_WRITE_DAV_CB(WRITELINE(*this, ms6102_state, irq<1>)) MCFG_AY31015_AUTO_RDAV(true) - MCFG_DEVICE_ADD("ie5", RIPPLE_COUNTER, XTAL(16'400'000) / 30) - MCFG_RIPPLE_COUNTER_STAGES(2) - MCFG_RIPPLE_COUNTER_COUNT_OUT_CB(WRITE8(*this, ms6102_state, kbd_uart_clock_w)) + ripple_counter_device &ie5(RIPPLE_COUNTER(config, "ie5", XTAL(16'400'000) / 30)); + ie5.set_stages(2); + ie5.count_out_cb().set(FUNC(ms6102_state::kbd_uart_clock_w)); MS7002(config, m_keyboard, 0).signal_out_callback().set(m_kbd_uart, FUNC(ay31015_device::write_si)); diff --git a/src/mame/drivers/ms9540.cpp b/src/mame/drivers/ms9540.cpp index e59afb62396..8646eaa4900 100644 --- a/src/mame/drivers/ms9540.cpp +++ b/src/mame/drivers/ms9540.cpp @@ -92,8 +92,8 @@ MACHINE_CONFIG_END /* ROM definition */ ROM_START( ms9540 ) ROM_REGION16_BE(0x4000, "9540", 0) - ROM_LOAD16_BYTE("0954-0135-01.20n", 0x00000, 0x2000, CRC(93ee9363) SHA1(73bc09e0379e06e0da96279cb5cc1581a0f0bf77) ) - ROM_LOAD16_BYTE("0954-0135-02.16n", 0x00001, 0x2000, CRC(a21077c5) SHA1(51dcbe543317d2042fb1acb1885461ba1790721e) ) + ROM_LOAD16_BYTE("0954-0135-01.20n", 0x00001, 0x2000, CRC(93ee9363) SHA1(73bc09e0379e06e0da96279cb5cc1581a0f0bf77) ) + ROM_LOAD16_BYTE("0954-0135-02.16n", 0x00000, 0x2000, CRC(a21077c5) SHA1(51dcbe543317d2042fb1acb1885461ba1790721e) ) ROM_REGION(0x1800, "9520", 0) ROM_LOAD( "z80-hd.bin", 0x0000, 0x1000, CRC(b1c37286) SHA1(36b38fec9ef46e3e594423bbd1c64c5e9a4bc74d) ) diff --git a/src/mame/drivers/mstation.cpp b/src/mame/drivers/mstation.cpp index 14fd5ad2c22..8d7804dc9eb 100644 --- a/src/mame/drivers/mstation.cpp +++ b/src/mame/drivers/mstation.cpp @@ -63,7 +63,7 @@ private: uint8_t m_bank1[2]; uint8_t m_bank2[2]; - uint8_t *m_vram; + std::unique_ptr<uint8_t[]> m_vram; uint8_t m_screen_column; uint8_t m_port2; uint8_t m_irq; @@ -396,7 +396,7 @@ INPUT_PORTS_END void mstation_state::machine_start() { // allocate the videoram - m_vram = (uint8_t*)machine().memory().region_alloc( "vram", 9600, 1, ENDIANNESS_LITTLE )->base(); + m_vram = make_unique_clear<uint8_t[]>(9600); // map firsh RAM bank at 0xc000-0xffff membank("sysram")->set_base(m_nvram); @@ -407,7 +407,6 @@ void mstation_state::machine_reset() { m_bank1[0] = m_bank1[1] = 0; m_bank2[0] = m_bank2[1] = 0; - memset(m_vram, 0, 9600); // reset banks m_bankdev1->set_bank(0); diff --git a/src/mame/drivers/mtouchxl.cpp b/src/mame/drivers/mtouchxl.cpp index fc5a26679ed..d534cb0c0e4 100644 --- a/src/mame/drivers/mtouchxl.cpp +++ b/src/mame/drivers/mtouchxl.cpp @@ -240,11 +240,12 @@ MACHINE_CONFIG_START(mtxl_state::at486) // remove the keyboard controller and use the HLE one which allow keys to be unmapped MCFG_DEVICE_REMOVE("mb:keybc"); MCFG_DEVICE_REMOVE("mb:pc_kbdc"); - MCFG_DEVICE_ADD("kbdc", KBDC8042, 0) - MCFG_KBDC8042_KEYBOARD_TYPE(KBDC8042_AT386) - MCFG_KBDC8042_SYSTEM_RESET_CB(INPUTLINE("maincpu", INPUT_LINE_RESET)) - MCFG_KBDC8042_GATE_A20_CB(INPUTLINE("maincpu", INPUT_LINE_A20)) - MCFG_KBDC8042_INPUT_BUFFER_FULL_CB(WRITELINE("mb:pic8259_master", pic8259_device, ir1_w)) + kbdc8042_device &kbdc(KBDC8042(config, "kbdc")); + kbdc.set_keyboard_type(kbdc8042_device::KBDC8042_AT386); + kbdc.system_reset_callback().set_inputline(m_maincpu, INPUT_LINE_RESET); + kbdc.gate_a20_callback().set_inputline(m_maincpu, INPUT_LINE_A20); + kbdc.input_buffer_full_callback().set("mb:pic8259_master", FUNC(pic8259_device::ir1_w)); + MCFG_DEVICE_REMOVE("mb:rtc") MCFG_DS12885_ADD("mb:rtc") MCFG_MC146818_IRQ_HANDLER(WRITELINE("mb:pic8259_slave", pic8259_device, ir0_w)) diff --git a/src/mame/drivers/mvme147.cpp b/src/mame/drivers/mvme147.cpp index 6894782c4b7..acece7fa57b 100644 --- a/src/mame/drivers/mvme147.cpp +++ b/src/mame/drivers/mvme147.cpp @@ -8,7 +8,7 @@ * * Thanks to Plamen Mihaylov and his site http://www.m88k.com/ I got the information * required to start the work with this driver. The goal is to boot a tape through - * the MVME-350 devide connected over a VME bus device. + * the MVME-350 device connected over a VME bus device. * * * || diff --git a/src/mame/drivers/myb3k.cpp b/src/mame/drivers/myb3k.cpp index e04dd150407..45641a44e23 100644 --- a/src/mame/drivers/myb3k.cpp +++ b/src/mame/drivers/myb3k.cpp @@ -23,7 +23,7 @@ - Keyboard is not interfaced through 8255 - Non standard graphics board - These and other incompatibilities required many PC software's to be + These and other incompatibilities required many PC softwares to be recompiled to work on this computer. ****************************************************************************/ diff --git a/src/mame/drivers/mzr8105.cpp b/src/mame/drivers/mzr8105.cpp index 64c4d4256d6..a029c2a45c4 100644 --- a/src/mame/drivers/mzr8105.cpp +++ b/src/mame/drivers/mzr8105.cpp @@ -6,7 +6,7 @@ * * 19/08/2015 * - * I baught this board from http://www.retrotechnology.com without documentation. + * I bought this board from http://www.retrotechnology.com without documentation. * It has a Motorola 68000 CPU @ 10MHz and two 27128 EPROMS with OS9 DEBUG labels * and not much more except 16 or so TTLs, 2 PALs and a VME P1 connector. It is a * 2 layered pcb so it shold be possible to trace the schematics quite easily. @@ -91,7 +91,7 @@ * mailbox interrupt support. Standard MXbus side modules include additional DRAM. * SRAM, and I/O. * - * Mizar's standard double- height (6U) processors provide additional features such + * Mizar's standard double-height (6U) processors provide additional features such * as a high-speed cache to enhance 68030 performance, floating, point coprocessor * support, up to four MB dual ported DRAM, VSB memory interface, Ethernet, and SCSI. * diff --git a/src/mame/drivers/nakajies.cpp b/src/mame/drivers/nakajies.cpp index 16015369b1f..e5a6e01579c 100644 --- a/src/mame/drivers/nakajies.cpp +++ b/src/mame/drivers/nakajies.cpp @@ -340,7 +340,7 @@ private: uint32_t m_rom_size; /* RAM */ - uint8_t *m_ram_base; + std::unique_ptr<uint8_t[]> m_ram_base; uint32_t m_ram_size; /* Banking */ @@ -364,13 +364,13 @@ void nakajies_state::update_banks() { /* RAM banking */ /* Not entirely sure if bank 0x1f refers to first or second ram bank ... */ - m_bank_base[i] = m_ram_base + ( ( ( ( m_bank[i] & 0x0f ) ^ 0xf ) << 17 ) % m_ram_size ); + m_bank_base[i] = &m_ram_base[(((m_bank[i] & 0x0f) ^ 0xf) << 17) % m_ram_size]; } else { /* ROM banking */ /* 0 is last bank, 1 bank before last, etc */ - m_bank_base[i] = m_rom_base + ( ( ( ( m_bank[i] & 0x0f ) ^ 0xf ) << 17 ) % m_rom_size ); + m_bank_base[i] = &m_rom_base[(((m_bank[i] & 0x0f) ^ 0xf) << 17) % m_rom_size]; } } membank( "bank0" )->set_base( m_bank_base[0] ); @@ -651,7 +651,7 @@ void nakajies_state::machine_start() { m_ram_size = 256 * 1024; } - m_ram_base = machine().memory().region_alloc( "mainram", m_ram_size, 1, ENDIANNESS_LITTLE )->base(); + m_ram_base = make_unique_clear<uint8_t[]>(m_ram_size); } @@ -667,13 +667,12 @@ void nakajies_state::machine_reset() { elem = 0; } - memset(m_ram_base, 0, m_ram_size); update_banks(); } uint32_t nakajies_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { - uint8_t* lcd_memory_start = m_ram_base + (m_lcd_memory_start<<9); + uint8_t* lcd_memory_start = &m_ram_base[m_lcd_memory_start << 9]; int height = screen.height(); for (int y=0; y<height; y++) diff --git a/src/mame/drivers/namcona1.cpp b/src/mame/drivers/namcona1.cpp index a18a5e58e6f..043732a1d09 100644 --- a/src/mame/drivers/namcona1.cpp +++ b/src/mame/drivers/namcona1.cpp @@ -568,6 +568,11 @@ void namcona1_state::namcona1_main_map(address_map &map) map(0xfff000, 0xffffff).ram().share("spriteram"); /* spriteram */ } +void namcona1_state::namcona1_c140_map(address_map &map) +{ + map(0x000000, 0x07ffff).ram().share("workram"); +} + READ8_MEMBER(xday2_namcona2_state::printer_r) { // --xx ---- printer status related, if bit 5 held 1 long enough causes printer error @@ -718,8 +723,6 @@ WRITE8_MEMBER(namcona1_state::port8_w) void namcona1_state::machine_start() { m_mEnableInterrupts = 0; - m_c140->set_base(m_workram); - save_item(NAME(m_mEnableInterrupts)); save_item(NAME(m_count)); save_item(NAME(m_mcu_mailbox)); @@ -993,6 +996,7 @@ MACHINE_CONFIG_START(namcona1_state::namcona1) C140(config, m_c140, 44100); m_c140->set_bank_type(c140_device::C140_TYPE::ASIC219); + m_c140->set_addrmap(0, &namcona1_state::namcona1_c140_map); m_c140->add_route(0, "rspeaker", 1.00); m_c140->add_route(1, "lspeaker", 1.00); MACHINE_CONFIG_END diff --git a/src/mame/drivers/naomi.cpp b/src/mame/drivers/naomi.cpp index c22823d8c85..fa3685626b3 100644 --- a/src/mame/drivers/naomi.cpp +++ b/src/mame/drivers/naomi.cpp @@ -3152,7 +3152,8 @@ EPR-21577e - NAOMI BOOT ROM 2000 08/25 1.50 (USA) EPR-21578e - NAOMI BOOT ROM 2000 08/25 1.50 (Export) Korea and Australia is missing. -EPR-21576f - NAOMI BOOT ROM 2001 ??/?? 1.60 (Japan) (not dumped) had critical bugs, was quickly replaced by 1.70, only Japan ver was released. +EPR-21578f - NAOMI BOOT ROM 2001 06/20 1.60 (Export) had critical bugs, was quickly replaced by 1.70 +Japan, USA, Korea and Australia is missing. EPR-21576g - NAOMI BOOT ROM 2001 09/10 1.70 (Japan) EPR-21577g - NAOMI BOOT ROM 2001 09/10 1.70 (USA) @@ -3183,6 +3184,8 @@ EPR-21329 & EPR-21330 & EPR-21331 differ by 7 bytes: Ferrari F355 specific Naomi BIOS roms: +EPR-21862P- NAOMI BOOT ROM 1999 05/07 1.31 (Japan) preview / prototype +EPR-21864P- NAOMI BOOT ROM 1999 05/07 1.31 (Export) preview / prototype EPR-21862 - NAOMI BOOT ROM 1999 07/02 1.34 (Japan) EPR-21863 - NAOMI BOOT ROM 1999 07/02 1.34 (USA) EPR-21864 - NAOMI BOOT ROM 1999 07/02 1.34 (Export) @@ -3207,8 +3210,10 @@ Scan ROM for the text string "LOADING TEST MODE NOW" back up four (4) bytes for NOTE: this doesn't work for the HOTD2 or multi screen boot roms -Dev BIOS v1.10: (some sources call it "NAOMI Test BIOS ROM") -NAOMI DEVELOP 1999 01/10 1.10 +Dev BIOS: older version, from about mid November 1998 (some sources call it "NAOMI Test BIOS ROM") + +Dev BIOS v1.10: NAOMI DEVELOP 1999 01/10 1.10 +have been added support of: 93C46 SN# EEPROM, RTC, VMU and NRS (M1/Actel) type Flash ROM boards. to boot into BIOS menu DIPSW 1-4 must be ON with other values various tests will be run instead @@ -3272,34 +3277,38 @@ OFF OFF ON Australia ROM_LOAD16_WORD_SWAP_BIOS( 8, "epr-21578h.ic27", 0x000000, 0x200000, CRC(7b452946) SHA1(8e9f153bbada24b37066dc45b64a7bf0d4f26a9b) ) \ ROM_SYSTEM_BIOS( 9, "bios9", "epr-21578g (Export)" ) \ ROM_LOAD16_WORD_SWAP_BIOS( 9, "epr-21578g.ic27", 0x000000, 0x200000, CRC(55413214) SHA1(bd2748365a9fc1821c9369aa7155d7c41c4df43e) ) \ - ROM_SYSTEM_BIOS( 10, "bios10", "epr-21578e (Export)" ) \ - ROM_LOAD16_WORD_SWAP_BIOS( 10, "epr-21578e.ic27", 0x000000, 0x200000, CRC(087f09a3) SHA1(0418eb2cf9766f0b1b874a4e92528779e22c0a4a) ) \ - ROM_SYSTEM_BIOS( 11, "bios11", "epr-21578d (Export)" ) \ - ROM_LOAD16_WORD_SWAP_BIOS( 11, "epr-21578d.ic27", 0x000000, 0x200000, CRC(dfd5f42a) SHA1(614a0db4743a5e5a206190d6786ade24325afbfd) ) \ - ROM_SYSTEM_BIOS( 12, "bios12", "epr-21578a (Export)" ) \ - ROM_LOAD16_WORD_SWAP_BIOS( 12, "epr-21578a.ic27", 0x000000, 0x200000, CRC(6c9aad83) SHA1(555918de76d8dbee2a97d8a95297ef694b3e803f) ) \ - ROM_SYSTEM_BIOS( 13, "bios13", "epr-21577h (USA)" ) \ - ROM_LOAD16_WORD_SWAP_BIOS( 13, "epr-21577h.ic27", 0x000000, 0x200000, CRC(fdf17452) SHA1(5f3e4b677f0046ce690a4f096b0481e5dd8bb6e6) ) \ - ROM_SYSTEM_BIOS( 14, "bios14", "epr-21577g (USA)" ) \ - ROM_LOAD16_WORD_SWAP_BIOS( 14, "epr-21577g.ic27", 0x000000, 0x200000, CRC(25f64af7) SHA1(99f9e6cc0642319bd2da492611220540add573e8) ) \ - ROM_SYSTEM_BIOS( 15, "bios15", "epr-21577e (USA)" ) \ - ROM_LOAD16_WORD_SWAP_BIOS( 15, "epr-21577e.ic27", 0x000000, 0x200000, CRC(cf36e97b) SHA1(b085305982e7572e58b03a9d35f17ae319c3bbc6) ) \ - ROM_SYSTEM_BIOS( 16, "bios16", "epr-21577d (USA)" ) \ - ROM_LOAD16_WORD_SWAP_BIOS( 16, "epr-21577d.ic27", 0x000000, 0x200000, CRC(60ddcbbe) SHA1(58b15096d269d6df617ca1810b66b47deb184958) ) \ - ROM_SYSTEM_BIOS( 17, "bios17", "epr-21577a (USA)" ) \ - ROM_LOAD16_WORD_SWAP_BIOS( 17, "epr-21577a.ic27", 0x000000, 0x200000, CRC(969dc491) SHA1(581d1eae328b87b67508a7586ffc60cee256f70f) ) \ - ROM_SYSTEM_BIOS( 18, "bios18", "epr-21579d (Korea)" ) \ - ROM_LOAD16_WORD_SWAP_BIOS( 18, "epr-21579d.ic27", 0x000000, 0x200000, CRC(33513691) SHA1(b1d8c7c516e1471a788fcf7a02a794ad2f05aeeb) ) \ - ROM_SYSTEM_BIOS( 19, "bios19", "epr-21579 (Korea)" ) \ - ROM_LOAD16_WORD_SWAP_BIOS( 19, "epr-21579.ic27", 0x000000, 0x200000, CRC(71f9c918) SHA1(d15af8b947f41eea7c203b565cd403e3f37a2017) ) \ - ROM_SYSTEM_BIOS( 20, "bios20", "Set4 Dev BIOS" ) \ - ROM_LOAD16_WORD_SWAP_BIOS( 20, "boot_rom_64b8.ic606", 0x000000, 0x080000, CRC(7a50fab9) SHA1(ef79f448e0bf735d1264ad4f051d24178822110f) ) \ - ROM_SYSTEM_BIOS( 21, "bios21", "Dev BIOS v1.10" ) \ - ROM_LOAD16_WORD_SWAP_BIOS( 21, "develop110.ic27", 0x000000, 0x200000, CRC(de7cfdb0) SHA1(da16800edc4d49f70481c124d487f544c2fa8ce7) ) \ - ROM_SYSTEM_BIOS( 22, "bios22", "Development ROM Board" ) \ - ROM_LOAD16_WORD_SWAP_BIOS( 22, "zukinver0930.ic25", 0x000000, 0x200000, CRC(58e17c23) SHA1(19330f906accf1b859f56bbcedc2edff73747599) ) \ - ROM_SYSTEM_BIOS( 23, "bios23", "epr-21576h (multi-region hack)" ) \ - ROM_LOAD16_WORD_SWAP_BIOS( 23, "epr-21576h_multi.ic27", 0x000000, 0x200000, CRC(cce01f1f) SHA1(cca17119ad13e3a4ef7cb6902a37b65d6a844aee) ) \ + ROM_SYSTEM_BIOS( 10, "bios10", "epr-21578f (Export)" ) \ + ROM_LOAD16_WORD_SWAP_BIOS( 10, "epr-21578f.ic27", 0x000000, 0x200000, CRC(628a27fd) SHA1(dae7add616b1a2478f00608823e88c3b82a0e78f) ) \ + ROM_SYSTEM_BIOS( 11, "bios11", "epr-21578e (Export)" ) \ + ROM_LOAD16_WORD_SWAP_BIOS( 11, "epr-21578e.ic27", 0x000000, 0x200000, CRC(087f09a3) SHA1(0418eb2cf9766f0b1b874a4e92528779e22c0a4a) ) \ + ROM_SYSTEM_BIOS( 12, "bios12", "epr-21578d (Export)" ) \ + ROM_LOAD16_WORD_SWAP_BIOS( 12, "epr-21578d.ic27", 0x000000, 0x200000, CRC(dfd5f42a) SHA1(614a0db4743a5e5a206190d6786ade24325afbfd) ) \ + ROM_SYSTEM_BIOS( 13, "bios13", "epr-21578a (Export)" ) \ + ROM_LOAD16_WORD_SWAP_BIOS( 13, "epr-21578a.ic27", 0x000000, 0x200000, CRC(6c9aad83) SHA1(555918de76d8dbee2a97d8a95297ef694b3e803f) ) \ + ROM_SYSTEM_BIOS( 14, "bios14", "epr-21577h (USA)" ) \ + ROM_LOAD16_WORD_SWAP_BIOS( 14, "epr-21577h.ic27", 0x000000, 0x200000, CRC(fdf17452) SHA1(5f3e4b677f0046ce690a4f096b0481e5dd8bb6e6) ) \ + ROM_SYSTEM_BIOS( 15, "bios15", "epr-21577g (USA)" ) \ + ROM_LOAD16_WORD_SWAP_BIOS( 15, "epr-21577g.ic27", 0x000000, 0x200000, CRC(25f64af7) SHA1(99f9e6cc0642319bd2da492611220540add573e8) ) \ + ROM_SYSTEM_BIOS( 16, "bios16", "epr-21577e (USA)" ) \ + ROM_LOAD16_WORD_SWAP_BIOS( 16, "epr-21577e.ic27", 0x000000, 0x200000, CRC(cf36e97b) SHA1(b085305982e7572e58b03a9d35f17ae319c3bbc6) ) \ + ROM_SYSTEM_BIOS( 17, "bios17", "epr-21577d (USA)" ) \ + ROM_LOAD16_WORD_SWAP_BIOS( 17, "epr-21577d.ic27", 0x000000, 0x200000, CRC(60ddcbbe) SHA1(58b15096d269d6df617ca1810b66b47deb184958) ) \ + ROM_SYSTEM_BIOS( 18, "bios18", "epr-21577a (USA)" ) \ + ROM_LOAD16_WORD_SWAP_BIOS( 18, "epr-21577a.ic27", 0x000000, 0x200000, CRC(969dc491) SHA1(581d1eae328b87b67508a7586ffc60cee256f70f) ) \ + ROM_SYSTEM_BIOS( 19, "bios19", "epr-21579d (Korea)" ) \ + ROM_LOAD16_WORD_SWAP_BIOS( 19, "epr-21579d.ic27", 0x000000, 0x200000, CRC(33513691) SHA1(b1d8c7c516e1471a788fcf7a02a794ad2f05aeeb) ) \ + ROM_SYSTEM_BIOS( 20, "bios20", "epr-21579 (Korea)" ) \ + ROM_LOAD16_WORD_SWAP_BIOS( 20, "epr-21579.ic27", 0x000000, 0x200000, CRC(71f9c918) SHA1(d15af8b947f41eea7c203b565cd403e3f37a2017) ) \ + ROM_SYSTEM_BIOS( 21, "bios21", "Set4 Dev BIOS" ) \ + ROM_LOAD16_WORD_SWAP_BIOS( 21, "boot_rom_64b8.ic606", 0x000000, 0x080000, CRC(7a50fab9) SHA1(ef79f448e0bf735d1264ad4f051d24178822110f) ) \ + ROM_SYSTEM_BIOS( 22, "bios22", "Dev BIOS v1.10" ) \ + ROM_LOAD16_WORD_SWAP_BIOS( 22, "develop110.ic27", 0x000000, 0x200000, CRC(de7cfdb0) SHA1(da16800edc4d49f70481c124d487f544c2fa8ce7) ) \ + ROM_SYSTEM_BIOS( 23, "bios23", "Dev BIOS (Nov 1998)" ) \ + ROM_LOAD16_WORD_SWAP_BIOS( 23, "develop.ic27", 0x000000, 0x200000, CRC(309a196a) SHA1(409b50371feb648f10efd6b7ac420bf08d9a3b5a) ) \ + ROM_SYSTEM_BIOS( 24, "bios24", "Development ROM Board" ) \ + ROM_LOAD16_WORD_SWAP_BIOS( 24, "zukinver0930.ic25", 0x000000, 0x200000, CRC(58e17c23) SHA1(19330f906accf1b859f56bbcedc2edff73747599) ) \ + ROM_SYSTEM_BIOS( 25, "bios25", "epr-21576h (multi-region hack)" ) \ + ROM_LOAD16_WORD_SWAP_BIOS( 25, "epr-21576h_multi.ic27", 0x000000, 0x200000, CRC(cce01f1f) SHA1(cca17119ad13e3a4ef7cb6902a37b65d6a844aee) ) \ ROM_REGION( 0x4000, "altera_pof", 0) \ ROM_LOAD("315-6188.ic31", 0x0000, 0x2034, CRC(7c9fea46) SHA1(f77c07ae65dfed18c1c4c632c8945be21d02ddaf) ) @@ -3349,7 +3358,11 @@ OFF OFF ON Australia ROM_SYSTEM_BIOS( 1, "bios1", "Ferrari F355 Deluxe (USA)" ) \ ROM_LOAD16_WORD_SWAP_BIOS( 1, "epr-21863.ic27", 0x000000, 0x200000, CRC(0615a4d1) SHA1(2c6986580b84278af75f396229fdd587bebc1768) ) \ ROM_SYSTEM_BIOS( 2, "bios2", "Ferrari F355 Deluxe (Japan)" ) \ - ROM_LOAD16_WORD_SWAP_BIOS( 2, "epr-21862.ic27", 0x000000, 0x200000, CRC(1f630716) SHA1(8d157809770467c3e7618c6299f3b96b5f10518c) ) + ROM_LOAD16_WORD_SWAP_BIOS( 2, "epr-21862.ic27", 0x000000, 0x200000, CRC(1f630716) SHA1(8d157809770467c3e7618c6299f3b96b5f10518c) ) \ + ROM_SYSTEM_BIOS( 3, "bios3", "Ferrari F355 Deluxe (Export, prototype)" ) \ + ROM_LOAD16_WORD_SWAP_BIOS( 3, "epr-21864p.ic27", 0x000000, 0x200000, CRC(05128861) SHA1(5bdb320d84015b8429527a8eb4524958031862aa) ) \ + ROM_SYSTEM_BIOS( 4, "bios4", "Ferrari F355 Deluxe (Japan, prototype)" ) \ + ROM_LOAD16_WORD_SWAP_BIOS( 4, "epr-21862p.ic27", 0x000000, 0x200000, CRC(f0cd4aaa) SHA1(9a9157992bf7a104c096efcdb8b02ceece186cbb) ) #define F355_BIOS \ ROM_REGION( 0x200000, "maincpu", 0) \ @@ -4323,6 +4336,7 @@ ROM_START( f355 ) ROM_LOAD("mpr-21901.ic21s", 0xa800000, 0x0800000, CRC(266a3eea) SHA1(795ecc5589a0152b9cf1e03e454ed1ea01501942) ) ROM_REGION( 0x10000, "drivebd", 0 ) /* drive board ROM */ + ROM_LOAD( "epr-21867p.bin", 0x000000, 0x010000, CRC(6143b911) SHA1(360ebc53696da7a29e6404376c82947563274835) ) // prototype / prewiev ROM_LOAD( "epr-21867.bin", 0x000000, 0x010000, CRC(4f93a2a0) SHA1(875907e7fcfc44850e2c60c12268ac61c742f217) ) // 834-13842 1999 317-0254-COM Naomi @@ -4541,6 +4555,37 @@ ROM_START( hotd2o ) ROM_PARAMETER( ":rom_board:segam2crypt:key", "-1") // 315-5881 not populated ROM_END +ROM_START( hotd2e ) + HOTD2_BIOS + NAOMI_DEFAULT_EEPROM + + ROM_REGION( 0xa800000, "rom_board", ROMREGION_ERASEFF) + ROM_LOAD( "epr-21805.ic22", 0x0000000, 0x200000, CRC(cc404674) SHA1(61d9faabeb3c23e1c195343a1fcad31a260f5bee) ) + ROM_RELOAD( 0x0200000, 0x200000 ) + ROM_LOAD( "mpr-21386.ic1", 0x0800000, 0x800000, CRC(88fb0562) SHA1(185a0eab68d86617cb6325d64c48a2dd4854622b) ) + ROM_LOAD( "mpr-21387.ic2", 0x1000000, 0x800000, CRC(5f4dd576) SHA1(5483c3949e587bbcca7e8fc7db9aff4cd2a33f02) ) + ROM_LOAD( "mpr-21388.ic3", 0x1800000, 0x800000, CRC(3e62fca4) SHA1(8cdebdebabc88160f458e1e779d9ebb4e6a14523) ) + ROM_LOAD( "mpr-21389.ic4", 0x2000000, 0x800000, CRC(6f73a852) SHA1(d5fd4c0800b3a1ea04231018fcaba79184fa1d87) ) + ROM_LOAD( "mpr-21390.ic5", 0x2800000, 0x800000, CRC(c7950445) SHA1(4f56768f07703452ef92d183e4ee654ab9711283) ) + ROM_LOAD( "mpr-21391.ic6", 0x3000000, 0x800000, CRC(5a812247) SHA1(7636661da0cc9bd5a1a2062f9f3ef65889c86fd5) ) + ROM_LOAD( "mpr-21392.ic7", 0x3800000, 0x800000, CRC(17e9414a) SHA1(9f291c4dd9a049eeed88d80867f7fca1d15c6095) ) + ROM_LOAD( "mpr-21393.ic8", 0x4000000, 0x800000, CRC(5d2d8134) SHA1(a2941b6afd0302822133d932064d1aad873b1c04) ) + ROM_LOAD( "mpr-21394.ic9", 0x4800000, 0x800000, CRC(eacaf26d) SHA1(21e35def0ed998a70cc982f373feb50b7974612a) ) + ROM_LOAD( "mpr-21395.ic10", 0x5000000, 0x800000, CRC(1e3686be) SHA1(7ec1b3c9c94882c5fe7b6ba6ffe9220e90824870) ) + ROM_LOAD( "mpr-21396.ic11", 0x5800000, 0x800000, CRC(5ada00a2) SHA1(981c65310c89e7a26e2b2c3e57623e78f6ad33d0) ) + ROM_LOAD( "mpr-21397.ic12s", 0x6000000, 0x800000, CRC(9eff6247) SHA1(9257492fc3e48516897002dd3ff247093af27d87) ) + ROM_LOAD( "mpr-21398.ic13s", 0x6800000, 0x800000, CRC(8a80b16a) SHA1(ffeb061b31027ac322c14b9050c686b2b844d2e1) ) + ROM_LOAD( "mpr-21399.ic14s", 0x7000000, 0x800000, CRC(7ae20daf) SHA1(b36d8e490ac477db178b8df08f7997448308d3fd) ) + ROM_LOAD( "mpr-21400.ic15s", 0x7800000, 0x800000, CRC(fbb8641b) SHA1(6cb44f0a3f80eb68a218bba97b2395961c596b9c) ) + ROM_LOAD( "mpr-21401.ic16s", 0x8000000, 0x800000, CRC(3881ec23) SHA1(e4b87a6c6fd6a2eeda8e0e5ae7bed01b18386e54) ) + ROM_LOAD( "mpr-21402.ic17s", 0x8800000, 0x800000, CRC(66bff6e4) SHA1(f87d618231b71b65952fc7ea7ccabdd208622a00) ) + ROM_LOAD( "mpr-21403.ic18s", 0x9000000, 0x800000, CRC(8cd2f654) SHA1(77eb7061caaf0288aad04ed88c4247d27617f338) ) + ROM_LOAD( "mpr-21404.ic19s", 0x9800000, 0x800000, CRC(6cf6e705) SHA1(68d7e9becefe27b556e0c5d7ba00efd2d1fb71ca) ) + ROM_LOAD( "mpr-21405.ic20s", 0xa000000, 0x800000, CRC(495e6265) SHA1(57936367fec0000691641525682fb8aefc4e4f56) ) + + ROM_PARAMETER( ":rom_board:segam2crypt:key", "-1") // 315-5881 not populated +ROM_END + // IC22 shown in ROM TEST as BAD, but its byte summ matches written on label, verified on 2 cartridges ROM_START( hotd2p ) HOTD2_BIOS @@ -5265,6 +5310,50 @@ ROM_START( jambo ) ROM_PARAMETER( ":rom_board:segam2crypt:key", "280fab95" ) ROM_END +/* 18 Wheeler (deluxe) (no Rev) */ +ROM_START( 18wheelro ) + NAOMI_BIOS + NAOMI_DEFAULT_EEPROM + + ROM_REGION( 0xa800000, "rom_board", ROMREGION_ERASEFF) + ROM_LOAD( "epr-22185.ic22", 0x0000000, 0x400000, CRC(bd910478) SHA1(6db3bfa23246c250e334bbd54dcb5038a2d18dbc) ) + ROM_LOAD( "mpr-22164.ic1", 0x0800000, 0x800000, CRC(ca045315) SHA1(0c5becb5220659fa86f1e7901032f8c9a1329a51) ) + ROM_LOAD( "mpr-22165.ic2", 0x1000000, 0x800000, CRC(e43f4ba8) SHA1(768159bccae6a72c809e9f374538df304c92fbfe) ) + ROM_LOAD( "mpr-22166.ic3", 0x1800000, 0x800000, CRC(ea67edb1) SHA1(1214fdbfd8ce9f7a2b33e97f7c4e22ebb3eee988) ) + ROM_LOAD( "mpr-22167.ic4", 0x2000000, 0x800000, CRC(df6125e2) SHA1(7244278cf89b88dbc7b8b1e3a537bf0b3f521c3a) ) + ROM_LOAD( "mpr-22168.ic5", 0x2800000, 0x800000, CRC(8a919f9c) SHA1(28f1f9d8943e0a0b7bc186808cdab5d21d914e05) ) + ROM_LOAD( "mpr-22169.ic6", 0x3000000, 0x800000, CRC(a0fa7d68) SHA1(010fc87f0df3cf9e3d01a5ca4d4aa7e84728652d) ) + ROM_LOAD( "mpr-22170.ic7", 0x3800000, 0x800000, CRC(1f407049) SHA1(3c11b25168715d200f8d78a3db7bfc8cb3c29897) ) + ROM_LOAD( "mpr-22171.ic8", 0x4000000, 0x800000, CRC(03ce8dcd) SHA1(9bf1eb0a2628317bea5d8899e34f6f4363729c52) ) + ROM_LOAD( "mpr-22172.ic9", 0x4800000, 0x800000, CRC(c3e8c978) SHA1(96cbaa0f13e22365b04818cb5cad2ddc2027e38a) ) + ROM_LOAD( "mpr-22173.ic10", 0x5000000, 0x800000, CRC(3caec8fc) SHA1(88ee6b0a1735788570d0a6507eec14a31ebabb9a) ) + ROM_LOAD( "mpr-22174.ic11", 0x5800000, 0x800000, CRC(17245a27) SHA1(b3701155b1bbdbcbfb5ea686470c3c432d2573b7) ) + ROM_LOAD( "mpr-22175.ic12s", 0x6000000, 0x800000, CRC(4d984682) SHA1(60270d6caa3bbc0025a0c01cf4d7b10783216e0b) ) + ROM_LOAD( "mpr-22176.ic13s", 0x6800000, 0x800000, CRC(3ea2403f) SHA1(efde74c621a8fe17d8aa3a24da35e2ca6bc0bd9a) ) + ROM_LOAD( "mpr-22177.ic14s", 0x7000000, 0x800000, CRC(15514cbc) SHA1(0171d67560b8d72ca3f718dcce301acc60dee1fa) ) + ROM_LOAD( "mpr-22178.ic15s", 0x7800000, 0x800000, CRC(9ea0552f) SHA1(4b282110ef9f60f942518f3849acfff4a5faf4bd) ) + ROM_LOAD( "mpr-22179.ic16s", 0x8000000, 0x800000, CRC(6915c4e6) SHA1(b44d49edcfdc0f2958bf1a3856b09b5442e8f1a3) ) + ROM_LOAD( "mpr-22180.ic17s", 0x8800000, 0x800000, CRC(744c3a40) SHA1(56fba6ebc45d542ba6e4f4dd205194344f127ac2) ) + ROM_LOAD( "mpr-22181.ic18s", 0x9000000, 0x800000, CRC(5a39b68e) SHA1(0f81ed1116b1829262f320fc82f93df107b6f848) ) + ROM_LOAD( "mpr-22182.ic19s", 0x9800000, 0x800000, CRC(c5606c42) SHA1(5871104ff1c7acde0493e13b9a4d0abdf8a40728) ) + ROM_LOAD( "mpr-22183.ic20s", 0xa000000, 0x800000, CRC(776af308) SHA1(7d29cb4dce75d34c622549fea7e102868d0da60a) ) + + // JVS I/O board 837-13844, external Z80 code for Sega 315-6146 "MIE" MCU + ROM_REGION( 0x20000, "jvsio", ROMREGION_ERASEFF) + ROM_LOAD( "epr-21868.ic7", 0x000000, 0x010000, CRC(c306a51f) SHA1(7833b73dc34c4c62401a30637968f46b949ceac0) ) + // later version of the same I/O board (temporary, we'll handle this properly later) + ROM_LOAD( "epr-22082.ic7", 0x010000, 0x010000, CRC(de26fc6c) SHA1(cf8ef7969770fff8697299c3e3152413b898a967) ) + // 837-14645 JVS I/O, uses same PCB as 837-13844 + ROM_LOAD( "epr-24354.ic7", 0x000000, 0x010000, CRC(0ce43505) SHA1(7700e3acfb756dfbf95f3ff14786d1bcb57e2f7d) ) + + // 18 Wheeler motor controller 838-13992, code is for a TMPZ84C015 which is Z80 compatible + ROM_REGION( 0x10000, "motorio", ROMREGION_ERASEFF) + ROM_LOAD( "epr-23000.ic8", 0x000000, 0x010000, CRC(e3b162f7) SHA1(52c7ad759c3c4a3148764e14d77ba5006bc8af48) ) + + // 840-0023 2000 317-0273-COM Naomi + ROM_PARAMETER( ":rom_board:segam2crypt:key", "2807cf54" ) +ROM_END + /* 18 Wheeler (deluxe) (Rev A) */ ROM_START( 18wheelr ) NAOMI_BIOS @@ -5309,6 +5398,50 @@ ROM_START( 18wheelr ) ROM_PARAMETER( ":rom_board:segam2crypt:key", "2807cf54" ) ROM_END +/* 18 Wheeler (deluxe) (Rev T) */ +ROM_START( 18wheelrt ) + NAOMI_BIOS + NAOMI_DEFAULT_EEPROM + + ROM_REGION( 0xa800000, "rom_board", ROMREGION_ERASEFF) + ROM_LOAD( "epr-22185t.ic22", 0x0000000, 0x400000, CRC(67b0122d) SHA1(86bf96cc1ce5052d40f7295068a4c591511382db) ) + ROM_LOAD( "mpr-22164.ic1", 0x0800000, 0x800000, CRC(ca045315) SHA1(0c5becb5220659fa86f1e7901032f8c9a1329a51) ) + ROM_LOAD( "mpr-22165.ic2", 0x1000000, 0x800000, CRC(e43f4ba8) SHA1(768159bccae6a72c809e9f374538df304c92fbfe) ) + ROM_LOAD( "mpr-22166.ic3", 0x1800000, 0x800000, CRC(ea67edb1) SHA1(1214fdbfd8ce9f7a2b33e97f7c4e22ebb3eee988) ) + ROM_LOAD( "mpr-22167.ic4", 0x2000000, 0x800000, CRC(df6125e2) SHA1(7244278cf89b88dbc7b8b1e3a537bf0b3f521c3a) ) + ROM_LOAD( "mpr-22168.ic5", 0x2800000, 0x800000, CRC(8a919f9c) SHA1(28f1f9d8943e0a0b7bc186808cdab5d21d914e05) ) + ROM_LOAD( "mpr-22169.ic6", 0x3000000, 0x800000, CRC(a0fa7d68) SHA1(010fc87f0df3cf9e3d01a5ca4d4aa7e84728652d) ) + ROM_LOAD( "mpr-22170.ic7", 0x3800000, 0x800000, CRC(1f407049) SHA1(3c11b25168715d200f8d78a3db7bfc8cb3c29897) ) + ROM_LOAD( "mpr-22171.ic8", 0x4000000, 0x800000, CRC(03ce8dcd) SHA1(9bf1eb0a2628317bea5d8899e34f6f4363729c52) ) + ROM_LOAD( "mpr-22172.ic9", 0x4800000, 0x800000, CRC(c3e8c978) SHA1(96cbaa0f13e22365b04818cb5cad2ddc2027e38a) ) + ROM_LOAD( "mpr-22173.ic10", 0x5000000, 0x800000, CRC(3caec8fc) SHA1(88ee6b0a1735788570d0a6507eec14a31ebabb9a) ) + ROM_LOAD( "mpr-22174.ic11", 0x5800000, 0x800000, CRC(17245a27) SHA1(b3701155b1bbdbcbfb5ea686470c3c432d2573b7) ) + ROM_LOAD( "mpr-22175.ic12s", 0x6000000, 0x800000, CRC(4d984682) SHA1(60270d6caa3bbc0025a0c01cf4d7b10783216e0b) ) + ROM_LOAD( "mpr-22176.ic13s", 0x6800000, 0x800000, CRC(3ea2403f) SHA1(efde74c621a8fe17d8aa3a24da35e2ca6bc0bd9a) ) + ROM_LOAD( "mpr-22177.ic14s", 0x7000000, 0x800000, CRC(15514cbc) SHA1(0171d67560b8d72ca3f718dcce301acc60dee1fa) ) + ROM_LOAD( "mpr-22178.ic15s", 0x7800000, 0x800000, CRC(9ea0552f) SHA1(4b282110ef9f60f942518f3849acfff4a5faf4bd) ) + ROM_LOAD( "mpr-22179.ic16s", 0x8000000, 0x800000, CRC(6915c4e6) SHA1(b44d49edcfdc0f2958bf1a3856b09b5442e8f1a3) ) + ROM_LOAD( "mpr-22180.ic17s", 0x8800000, 0x800000, CRC(744c3a40) SHA1(56fba6ebc45d542ba6e4f4dd205194344f127ac2) ) + ROM_LOAD( "mpr-22181.ic18s", 0x9000000, 0x800000, CRC(5a39b68e) SHA1(0f81ed1116b1829262f320fc82f93df107b6f848) ) + ROM_LOAD( "mpr-22182.ic19s", 0x9800000, 0x800000, CRC(c5606c42) SHA1(5871104ff1c7acde0493e13b9a4d0abdf8a40728) ) + ROM_LOAD( "mpr-22183.ic20s", 0xa000000, 0x800000, CRC(776af308) SHA1(7d29cb4dce75d34c622549fea7e102868d0da60a) ) + + // JVS I/O board 837-13844, external Z80 code for Sega 315-6146 "MIE" MCU + ROM_REGION( 0x20000, "jvsio", ROMREGION_ERASEFF) + ROM_LOAD( "epr-21868.ic7", 0x000000, 0x010000, CRC(c306a51f) SHA1(7833b73dc34c4c62401a30637968f46b949ceac0) ) + // later version of the same I/O board (temporary, we'll handle this properly later) + ROM_LOAD( "epr-22082.ic7", 0x010000, 0x010000, CRC(de26fc6c) SHA1(cf8ef7969770fff8697299c3e3152413b898a967) ) + // 837-14645 JVS I/O, uses same PCB as 837-13844 + ROM_LOAD( "epr-24354.ic7", 0x000000, 0x010000, CRC(0ce43505) SHA1(7700e3acfb756dfbf95f3ff14786d1bcb57e2f7d) ) + + // 18 Wheeler motor controller 838-13992, code is for a TMPZ84C015 which is Z80 compatible + ROM_REGION( 0x10000, "motorio", ROMREGION_ERASEFF) + ROM_LOAD( "epr-23000.ic8", 0x000000, 0x010000, CRC(e3b162f7) SHA1(52c7ad759c3c4a3148764e14d77ba5006bc8af48) ) + + // 840-0023 2000 317-0273-COM Naomi + ROM_PARAMETER( ":rom_board:segam2crypt:key", "2807cf54" ) +ROM_END + /* 18 Wheeler (standard) */ ROM_START( 18wheels ) NAOMI_BIOS @@ -6279,6 +6412,33 @@ ROM_START( virnbap ) ROM_PARAMETER( ":rom_board:segam2crypt:key", "28068b58" ) ROM_END +// 1999/07/01 07:48 +ROM_START( vs2_2ko ) + NAOMI_BIOS + NAOMI_DEFAULT_EEPROM + + ROM_REGION( 0x8000000, "rom_board", ROMREGION_ERASEFF) + ROM_LOAD("epr-21929.ic22", 0x0000000, 0x0400000, CRC(9e883138) SHA1(f941bd322b92e5a412a62e849082c8572287cd0d) ) // revision is not known, might be A or B instead of no Rev + ROM_LOAD("mpr-21924.ic1", 0x0800000, 0x0800000, CRC(f91ef69b) SHA1(4ed23091efad7ddf1878a0bfcdcbba3cf151af84) ) + ROM_LOAD("mpr-21925.ic2", 0x1000000, 0x0800000, CRC(40128a67) SHA1(9d191c4ec33465f29bbc09491dde62f354a9ab15) ) + ROM_LOAD("mpr-21911.ic3", 0x1800000, 0x0800000, CRC(19708b3c) SHA1(7d1ef995ce870ffcb68f420a571efb084f5bfcf2) ) + ROM_LOAD("mpr-21926.ic4", 0x2000000, 0x0800000, CRC(b082379b) SHA1(42f585279da1de7e613e42b76e1b81986c48e6ea) ) + ROM_LOAD("mpr-21913.ic5", 0x2800000, 0x0800000, CRC(a3bc1a47) SHA1(0e5043ab6e118feb59f68c84c095cf5b1dba7d09) ) + ROM_LOAD("mpr-21914.ic6", 0x3000000, 0x0800000, CRC(b1dfada7) SHA1(b4c906bc96b615975f6319a1fdbd5b990e7e4124) ) + ROM_LOAD("mpr-21915.ic7", 0x3800000, 0x0800000, CRC(1c189e28) SHA1(93400de2cb803357fa17ae7e1a5297177f9bcfa1) ) + ROM_LOAD("mpr-21916.ic8", 0x4000000, 0x0800000, CRC(55bcb652) SHA1(4de2e7e584dd4999dc8e405837a18a904dfee0bf) ) + ROM_LOAD("mpr-21917.ic9", 0x4800000, 0x0800000, CRC(81daa7bc) SHA1(2fc0ddd0cca3ddd120f634ddf08ffbf889ee7181) ) + ROM_LOAD("mpr-21918.ic10", 0x5000000, 0x0800000, CRC(a5cd42ad) SHA1(59f62e995d45311b1592434d1ffa42c261fa8ba1) ) + ROM_LOAD("mpr-21919.ic11", 0x5800000, 0x0800000, CRC(cc1a4ed9) SHA1(0e3aaeaa55f1d145fb4877b6d187a3ee78cf214e) ) + ROM_LOAD("mpr-21920.ic12s",0x6000000, 0x0800000, CRC(9452c5fb) SHA1(5a04f96d83cca6248f513de0c6240fc671bcadf9) ) + ROM_LOAD("mpr-21921.ic13s",0x6800000, 0x0800000, CRC(d6346491) SHA1(830971cbc14cab022a09ad4c6e11ee49c550e308) ) + ROM_LOAD("mpr-21922.ic14s",0x7000000, 0x0800000, CRC(a1901e1e) SHA1(2281f91ac696cc14886bcdf4b0685ce2f5bb8117) ) + ROM_LOAD("mpr-21923.ic15s",0x7800000, 0x0400000, CRC(d127d9a5) SHA1(78c95357344ea15469b84fa8b1332e76521892cd) ) + + // 840-0010 1999 317-0258-COM Naomi + ROM_PARAMETER( ":rom_board:segam2crypt:key", "28088b08" ) +ROM_END + /* SYSTEMID: NAOMI @@ -6306,6 +6466,7 @@ IC15 32M 0DF9 FC01 MPR21928 */ +// 1999/07/27 11:41 ROM_START( vs2_2k ) NAOMI_BIOS NAOMI_DEFAULT_EEPROM @@ -6752,6 +6913,37 @@ ROM_START( zombrvn ) ROM_PARAMETER( ":rom_board:segam2crypt:key", "28012b41" ) ROM_END +ROM_START( zombrvne ) + NAOMI_BIOS + NAOMI_DEFAULT_EEPROM + + ROM_REGION( 0xa000000, "rom_board", ROMREGION_ERASEFF) + ROM_LOAD("epr-21834.ic22", 0x0000000, 0x0200000, CRC(ecb299ea) SHA1(3caf02a40ffa3411460a9478e14067ed07da6e3b) ) + ROM_RELOAD( 0x0200000, 0x0200000) + ROM_LOAD("mpr-21708.ic1", 0x0800000, 0x0800000, CRC(b1ca1ca0) SHA1(7f6823c8f8b58d3102e73c153a3f4ce5ad70694d) ) + ROM_LOAD("mpr-21709.ic2", 0x1000000, 0x0800000, CRC(1ccc22bb) SHA1(0d0b4b13a997e33d89c0b67e579ff5cb63f49355) ) + ROM_LOAD("mpr-21710.ic3", 0x1800000, 0x0800000, CRC(954f49ba) SHA1(67d532048eeb0e7ddd77784138708b256a9386cd) ) + ROM_LOAD("mpr-21711.ic4", 0x2000000, 0x0800000, CRC(bda785e2) SHA1(85fe90fce718f278fc90d3b64411be2b420fef17) ) + ROM_LOAD("mpr-21712.ic5", 0x2800000, 0x0800000, CRC(38309255) SHA1(f693e76b520f25bc510ab1025303cd7e544d9386) ) + ROM_LOAD("mpr-21713.ic6", 0x3000000, 0x0800000, CRC(7c66c88e) SHA1(3bac6db0a5ea65b100911a9674312d4b94f6f57a) ) + ROM_LOAD("mpr-21714.ic7", 0x3800000, 0x0800000, CRC(dd8db07e) SHA1(087299d342e86f629e4878d592540faaba78d5c1) ) + ROM_LOAD("mpr-21715.ic8", 0x4000000, 0x0800000, CRC(7243da2e) SHA1(a797ff85527224d128268cf62e028ee8b308b406) ) + ROM_LOAD("mpr-21716.ic9", 0x4800000, 0x0800000, CRC(01dd88c2) SHA1(77b8bf78d760ad769964209e881e5eddc74d45d4) ) + ROM_LOAD("mpr-21717.ic10", 0x5000000, 0x0800000, CRC(95139ec0) SHA1(90db6f18e18e842f731ef34892ac520fd9f4a8d6) ) + ROM_LOAD("mpr-21718.ic11", 0x5800000, 0x0800000, CRC(4d36a24a) SHA1(0bc2d80e6149b2d97582a58fdf43d0bdbcfcedfc) ) + ROM_LOAD("mpr-21719.ic12s",0x6000000, 0x0800000, CRC(2b86df0a) SHA1(1d6bf4d2568df3ce3a2e60dc51167b5344b00ebd) ) + ROM_LOAD("mpr-21720.ic13s",0x6800000, 0x0800000, CRC(ff681ece) SHA1(896e2c484e640d8c426f0159a1be419e476ad14f) ) + ROM_LOAD("mpr-21721.ic14s",0x7000000, 0x0800000, CRC(216abba6) SHA1(0819d727a235fe6a3ccfe6474fce9b13718e235c) ) + ROM_LOAD("mpr-21722.ic15s",0x7800000, 0x0800000, CRC(b2de7e5f) SHA1(626bf13c40df936a34176821d38418214a5407cb) ) + ROM_LOAD("mpr-21723.ic16s",0x8000000, 0x0800000, CRC(515932ae) SHA1(978495c9f9f24d0cdae5a44c3376f7a43f0ce9f5) ) + ROM_LOAD("mpr-21724.ic17s",0x8800000, 0x0800000, CRC(f048aeb7) SHA1(39b7bf0ce65f6e13aa0ae5fd6a142959b9ce5acf) ) + ROM_LOAD("mpr-21725.ic18s",0x9000000, 0x0800000, CRC(2202077b) SHA1(0893a85379f994277083c0bc5b178dd34508f816) ) + ROM_LOAD("mpr-21726.ic19s",0x9800000, 0x0800000, CRC(429bf290) SHA1(6733e1bcf100e73ab43273f6feedc187fcaa55d4) ) + + // 840-0003 1999 317-0249-COM Naomi + ROM_PARAMETER( ":rom_board:segam2crypt:key", "28012b41" ) +ROM_END + ROM_START( gunsur2j ) NAOMI_BIOS NAOMI_DEFAULT_EEPROM @@ -7297,6 +7489,27 @@ ROM_START( inunoos ) ROM_PARAMETER( ":rom_board:segam2crypt:key", "294bc3e3" ) ROM_END +ROM_START( ringouto ) + NAOMI_BIOS + NAOMI_DEFAULT_EEPROM + + ROM_REGION( 0x5800000, "rom_board", ROMREGION_ERASEFF) + ROM_LOAD( "epr-21779.ic22", 0x0000000, 0x400000, CRC(4756bfc5) SHA1(3ce0b329bb05cff68c09355ad71f258b91d45a80) ) + ROM_LOAD( "mpr-21761.ic1", 0x0800000, 0x800000, CRC(493199fc) SHA1(189cd9a20c9207f0238e6d2e867f1479a476dfaa) ) + ROM_LOAD( "mpr-21762.ic2", 0x1000000, 0x800000, CRC(68173ace) SHA1(0869072915543dd5dfa6d3cdb95205521b4a3bf4) ) + ROM_LOAD( "mpr-21763.ic3", 0x1800000, 0x800000, CRC(41badfc3) SHA1(d4062bdbb994b8c18dac20948db9a9550f030865) ) + ROM_LOAD( "mpr-21764.ic4", 0x2000000, 0x800000, CRC(a8dfb537) SHA1(9f6c98ee23842b22fa3b701dad0a384a24a9bc6a) ) + ROM_LOAD( "mpr-21765.ic5", 0x2800000, 0x800000, CRC(3f1f5ed4) SHA1(a7d6e65fba9732efbd99e10a609f41dd03fd3bb8) ) + ROM_LOAD( "mpr-21766.ic6", 0x3000000, 0x800000, CRC(5a1114f0) SHA1(a45fc82bccb40e582f107b86403409651476180e) ) + ROM_LOAD( "mpr-21767.ic7", 0x3800000, 0x800000, CRC(5645a95c) SHA1(f0e97ff5b744972a1fa4e03e6d16a19ba20fb930) ) + ROM_LOAD( "mpr-21768.ic8", 0x4000000, 0x800000, CRC(22fc33dc) SHA1(922c41f7fb22b26037446bdfb4f9788a8e0c3e46) ) + ROM_LOAD( "mpr-21769.ic9", 0x4800000, 0x800000, CRC(6d22d29d) SHA1(382dcd62065437b34fe101144b1c047eb261f047) ) + ROM_LOAD( "mpr-21770.ic10", 0x5000000, 0x800000, CRC(c5308e61) SHA1(e51f8026351d5ffbda2a5bed39aeef543366febf) ) + + // 840-0004 1999 317-0250-COM Naomi + ROM_PARAMETER( ":rom_board:segam2crypt:key", "280b1e40" ) +ROM_END + ROM_START( ringout ) NAOMI_BIOS NAOMI_DEFAULT_EEPROM @@ -8811,6 +9024,7 @@ ROM_START( ngdup23e ) ROM_LOAD("317-0387-com.pic", 0x00, 0x4000, CRC(8728aeaa) SHA1(07983ab41d143f845c3150dfc9b7301968708e18) ) ROM_END +// 837-14389 SATL BD NAOMI DGT // requires 837-14381 "G2 EXPANSION BD" I/O board, NetDIMM, IC Card reader SAXA HW210 and coin mechanics ROM_START( dragntra ) NAOMIGD_BIOS @@ -8904,6 +9118,7 @@ ROM_END Dragon Treasure 2 binary also contain DIMM firmware updater ver 3.13 at 0x19000000 */ +// 837-14457 SATL BD NAOMI DGS // requires 837-14381 "G2 EXPANSION BD" I/O board, NetDIMM, IC Card reader SAXA HW210 and coin mechanics ROM_START( dragntr2 ) NAOMIGD_BIOS @@ -9175,12 +9390,34 @@ ROM_START( clubkrto ) ROM_PARAMETER( ":rom_board:segam2crypt:key", "2ce7d742" ) ROM_END +ROM_START( clubkrta ) + NAOMI2_BIOS + NAOMI_DEFAULT_EEPROM + + ROM_REGION( 0xb800000, "rom_board", ROMREGION_ERASEFF) + ROM_LOAD( "epr-23704a.ic22",0x0000000, 0x0400000, CRC(45ea13c3) SHA1(48cddba0506010dc705f04457f784a1d455ef3a6) ) + ROM_LOAD( "mpr-23693.ic1", 0x0800000, 0x1000000, CRC(28995764) SHA1(a1457f9935dde2e5aaa5ef245c736c0f2f8c74b7) ) + ROM_LOAD( "mpr-23694.ic2", 0x1800000, 0x1000000, CRC(37d30111) SHA1(4c07df8cd548cac79d48709e61f692d762471f8f) ) + ROM_LOAD( "mpr-23695.ic3", 0x2800000, 0x1000000, CRC(41ac1510) SHA1(01b889b627fdfc1f12a0c84fcc36debdfb1cf377) ) + ROM_LOAD( "mpr-23696.ic4", 0x3800000, 0x1000000, CRC(6f2da455) SHA1(b655757bc513398820bfeae07dca8a4f3ea9752c) ) + ROM_LOAD( "mpr-23697.ic5", 0x4800000, 0x1000000, CRC(1383c742) SHA1(6efd17632a277a4bb0e47cc912fbc9865a8b14c3) ) + ROM_LOAD( "mpr-23698.ic6", 0x5800000, 0x1000000, CRC(da79cd06) SHA1(fdfe068caca1eb764dec28ab327e56b39144f3ae) ) + ROM_LOAD( "mpr-23699.ic7", 0x6800000, 0x1000000, CRC(ea77f000) SHA1(35aa8ee804d9429e72f516137a3b06c585a57b6d) ) + ROM_LOAD( "mpr-23700.ic8", 0x7800000, 0x1000000, CRC(db9e5c1d) SHA1(db918c0fa1860f4345806e574d44354aba5fcd54) ) + ROM_LOAD( "mpr-23701.ic9", 0x8800000, 0x1000000, CRC(0fa92fd7) SHA1(67a1cf085101884a17a4783d0d509ab198aa6425) ) + ROM_LOAD( "mpr-23702.ic10", 0x9800000, 0x1000000, CRC(e302b582) SHA1(787192ed9f9a08541eecc3128855485cad802a42) ) + ROM_LOAD( "mpr-23703.ic11", 0xa800000, 0x1000000, CRC(702b8b4a) SHA1(3a8dfde458f341e7db20664382b9fce2b6e5d462) ) + + // 840-0062 2001 317-0313-COM Naomi 2 + ROM_PARAMETER( ":rom_board:segam2crypt:key", "2ce7d742" ) +ROM_END + ROM_START( clubkrtc ) NAOMI2_BIOS NAOMI_DEFAULT_EEPROM ROM_REGION( 0xb800000, "rom_board", ROMREGION_ERASEFF) - ROM_LOAD( "epr-23704c.ic22",0x0000000, 0x0400000, CRC(45ea13c3) SHA1(48cddba0506010dc705f04457f784a1d455ef3a6) ) + ROM_LOAD( "epr-23704c.ic22",0x0000000, 0x0400000, CRC(9aaba862) SHA1(e4dded0a5f36e18cd4bb59320506cea0f3af29d6) ) ROM_LOAD( "mpr-23693.ic1", 0x0800000, 0x1000000, CRC(28995764) SHA1(a1457f9935dde2e5aaa5ef245c736c0f2f8c74b7) ) ROM_LOAD( "mpr-23694.ic2", 0x1800000, 0x1000000, CRC(37d30111) SHA1(4c07df8cd548cac79d48709e61f692d762471f8f) ) ROM_LOAD( "mpr-23695.ic3", 0x2800000, 0x1000000, CRC(41ac1510) SHA1(01b889b627fdfc1f12a0c84fcc36debdfb1cf377) ) @@ -9596,6 +9833,22 @@ ROM_START( clubkcyc ) //PIC16C622A (317-0358-COM) //(sticker 253-5508-0358) ROM_LOAD( "317-0358-com.pic", 0x000000, 0x004000, CRC(dd33e50f) SHA1(c51712754022fc3adc350fa0714bf60fd0d163cf) ) + +/* + Cycraft Motion PC: + Mainboard Advantech PCM-5820 + CAN Module PCM-3680 + IO Module PCM-3724 + 128mb PC133 Ram + + SanDisk CF With Linux: + Simuline CYCRAFT + SMCP: V1.65 + GAME: Club-Kart + (c) 2003 Simuline Inc. +*/ + DISK_REGION( "cycraft" ) + DISK_IMAGE( "cycraft_clubkart_smcp_v1.65", 0, SHA1(c77df6eaf425e4e86f871914aa024debc1940713) ) ROM_END ROM_START( initdv3j ) @@ -9687,6 +9940,9 @@ ROM_START( inidv3cy ) //PIC16C621A (317-0406-COM) //(sticker 253-5508-0406) ROM_LOAD("317-0406-com.pic", 0x00, 0x4000, CRC(fe91a7af) SHA1(3562d8d454ac6e5b73a24d4dc8928ef24687cdf7) ) + + DISK_REGION( "cycraft" ) + DISK_IMAGE( "initiald3_smcp_v1.66", 0, SHA1(8ade7c0bb85ceebf9e45e4d8053ad76009258a38) ) ROM_END ROM_START( inidv3ca ) @@ -9700,6 +9956,9 @@ ROM_START( inidv3ca ) //PIC16C621A (317-0406-COM) //(sticker 253-5508-0406) ROM_LOAD("317-0406-com.pic", 0x00, 0x4000, CRC(fe91a7af) SHA1(3562d8d454ac6e5b73a24d4dc8928ef24687cdf7) ) + + DISK_REGION( "cycraft" ) + DISK_IMAGE( "initiald3_smcp_v1.66", 0, SHA1(8ade7c0bb85ceebf9e45e4d8053ad76009258a38) ) ROM_END /********************************************** @@ -10503,6 +10762,7 @@ ROM_END /* 834-xxxxx (Sega Naomi cart with game specific BIOS sets) */ /* 13636-01 */ GAME( 1998, hotd2, hod2bios, naomim2, hotd2, naomi_state, init_hotd2, ROT0, "Sega", "The House of the Dead 2 (USA)", GAME_FLAGS ) /* specific BIOS "hod2bios" needed */ /* 13636 */ GAME( 1998, hotd2o, hotd2, naomim2, hotd2, naomi_state, init_hotd2, ROT0, "Sega", "The House of the Dead 2", GAME_FLAGS ) /* specific BIOS "hod2bios" needed */ +/* ????? */ GAME( 1998, hotd2e, hotd2, naomim2, hotd2, naomi_state, init_hotd2, ROT0, "Sega", "The House of the Dead 2 (Export)", GAME_FLAGS ) /* specific BIOS "hod2bios" needed */ /* none */ GAME( 1998, hotd2p, hotd2, naomim2, hotd2, naomi_state, init_hotd2, ROT0, "Sega", "The House of the Dead 2 (prototype)", GAME_FLAGS ) /* specific BIOS "hod2bios" needed */ /* 13842 */ GAME( 1999, f355, f355dlx, naomim2, naomi, naomi_state, empty_init, ROT0, "Sega", "Ferrari F355 Challenge (deluxe, no link)", GAME_FLAGS ) /* specific BIOS "f355dlx" needed */ /* 13950 */ GAME( 1999, f355twin, f355bios, naomim2, naomi, naomi_state, empty_init, ROT0, "Sega", "Ferrari F355 Challenge (twin/deluxe)", GAME_FLAGS ) /* specific BIOS "f355bios" needed */ @@ -10515,10 +10775,13 @@ ROM_END /* 0002 */ GAME( 1999, crzytaxi, naomi, naomim2, crzytaxi,naomi_state, init_naomi, ROT0, "Sega", "Crazy Taxi", GAME_FLAGS ) /* 0003 */ GAME( 1999, zombrvno, zombrvn, naomim2, zombrvn, naomi_state, init_naomi, ROT0, "Sega", "Zombie Revenge", GAME_FLAGS ) /* 0003 */ GAME( 1999, zombrvn, naomi, naomim2, zombrvn, naomi_state, init_naomi, ROT0, "Sega", "Zombie Revenge (Rev A)", GAME_FLAGS ) -/* 0004 */ GAME( 1999, ringout, naomi, naomim2, naomi, naomi_state, init_naomi, ROT0, "Sega", "Ring Out 4x4", GAME_FLAGS ) +/* 0003 */ GAME( 1999, zombrvne, zombrvn, naomim2, zombrvn, naomi_state, init_naomi, ROT0, "Sega", "Zombie Revenge (Export)", GAME_FLAGS ) // not 100% sure if its really version for Export, also might have different 840-xxx ID +/* 0004 */ GAME( 1999, ringouto, ringout, naomim2, naomi, naomi_state, init_naomi, ROT0, "Sega", "Ring Out 4x4", GAME_FLAGS ) +/* 0004 */ GAME( 1999, ringout, naomi, naomim2, naomi, naomi_state, init_naomi, ROT0, "Sega", "Ring Out 4x4 (Rev A)", GAME_FLAGS ) /* 0005 */ GAME( 1999, alpilotj, naomi, naomim2, alpilota,naomi_state, init_naomi, ROT0, "Sega", "Airline Pilots (Japan, Rev A)", GAME_FLAGS ) // have "Japan Airlines" (JAL) logos and texts on airplanes, deluxe/multiboard setup uses specific BIOS "airlbios" /* 0007 */ GAME( 1999, ggram2, naomi, naomim2, naomi, naomi_state, init_naomi, ROT0, "Sega", "Giant Gram: All Japan Pro Wrestling 2 (Japan)", GAME_FLAGS ) /* 0008 */ GAME( 1999, tduno, naomi, naomim2, naomi, naomi_state, init_naomi, ROT0, "Sega", "Touch de Uno! / Unou Nouryoku Check Machine (Japan)", GAME_FLAGS ) +/* 0010 */ GAME( 1999, vs2_2ko, vs2_2k, naomim2, naomi, naomi_state, init_naomi, ROT0, "Sega", "Virtua Striker 2 Ver. 2000", GAME_FLAGS ) // revision is not known, might be Rev A or B instead of no Rev /* 0010 */ GAME( 1999, vs2_2k, naomi, naomim2, naomi, naomi_state, init_naomi, ROT0, "Sega", "Virtua Striker 2 Ver. 2000 (Rev C)", GAME_FLAGS ) /* 0011 */ GAME( 1999, toyfight, naomi, naomim2, naomi, naomi_state, init_naomi, ROT0, "Sega", "Toy Fighter", GAME_FLAGS ) /* 0012 -01*/ GAME( 1999, smlg99, naomi, naomim2, dybbnao, naomi_state, init_naomi, ROT0, "Sega", "World Series 99 / Super Major League 99", GAME_FLAGS ) @@ -10534,7 +10797,9 @@ ROM_END /* 0021 */ GAME( 2000, virnbao, virnba, naomim2, naomi, naomi_state, init_naomi, ROT0, "Sega", "Virtua NBA", GAME_FLAGS ) /* 0021-01 */ GAME( 2000, virnba, naomi, naomim2, naomi, naomi_state, init_naomi, ROT0, "Sega", "Virtua NBA (USA)", GAME_FLAGS ) /* 0022 */ GAME( 2000, tduno2, naomi, naomim1, naomi, naomi_state, init_naomi, ROT0, "Sega", "Touch de Uno! 2 (Japan)", GAME_FLAGS ) +/* 0023 */ GAME( 2000, 18wheelro, 18wheelr, naomim2, 18wheelr,naomi_state, init_naomi, ROT0, "Sega", "18 Wheeler (deluxe)", GAME_FLAGS ) /* 0023 */ GAME( 2000, 18wheelr, naomi, naomim2, 18wheelr,naomi_state, init_naomi, ROT0, "Sega", "18 Wheeler (deluxe) (Rev A)", GAME_FLAGS ) +/* 0023 */ GAME( 2000, 18wheelrt, 18wheelr, naomim2, 18wheelr,naomi_state, init_naomi, ROT0, "Sega", "18 Wheeler (deluxe) (Rev T)", GAME_FLAGS ) /* 0025 */ GAME( 1999, marstv, naomi, naomim2, marstv, naomi_state, init_naomi, ROT0, "Sega", "Mars TV (Japan)", GAME_FLAGS ) /* 0026 */ GAME( 2000, totdo, totd, naomim2_kb, naomi_kb, naomi_state, init_naomi, ROT0, "Sega", "The Typing of the Dead", GAME_FLAGS ) /* 0026 */ GAME( 2000, totd, naomi, naomim2_kb, naomi_kb, naomi_state, init_naomi, ROT0, "Sega", "The Typing of the Dead (Rev A)", GAME_FLAGS ) @@ -10613,6 +10878,7 @@ ROM_END /* 0061 */ GAME( 2001, vstrik3co,vstrik3c,naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Virtua Striker 3 (World)", GAME_FLAGS ) // not for Japan /* 0061 */ GAME( 2001, vstrik3c, naomi2, naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Virtua Striker 3 (World, Rev B)", GAME_FLAGS ) // not for Japan /* 0062 */ GAME( 2001, clubkrto, clubkrt, naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Club Kart: European Session", GAME_FLAGS ) +/* 0062 */ GAME( 2001, clubkrta, clubkrt, naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Club Kart: European Session (Rev A)", GAME_FLAGS ) /* 0062 */ GAME( 2001, clubkrtc, clubkrt, naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Club Kart: European Session (Rev C)", GAME_FLAGS ) /* 0062 */ GAME( 2001, clubkrt, naomi2, naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Club Kart: European Session (Rev D)", GAME_FLAGS ) /* 0080 */ GAME( 2002, vf4cart, naomi2, naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Virtua Fighter 4 (World)", GAME_FLAGS ) // not for Japan diff --git a/src/mame/drivers/nmk16.cpp b/src/mame/drivers/nmk16.cpp index 851cdcd05a4..5b98fd47c3d 100644 --- a/src/mame/drivers/nmk16.cpp +++ b/src/mame/drivers/nmk16.cpp @@ -6279,10 +6279,10 @@ ROM_START( strahla ) ROM_CONTINUE( 0x20000, 0x20000 ) /* banked */ ROM_END -ROM_START( hachamfb ) +ROM_START( hachamf ) ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 code */ - ROM_LOAD16_BYTE( "8.bin", 0x00000, 0x20000, CRC(14845b65) SHA1(5cafd07a8a6f5ccbb36de7a90571f8b33ecf273e) ) - ROM_LOAD16_BYTE( "7.bin", 0x00001, 0x20000, CRC(069ca579) SHA1(0db4c3c41e17fca613d11de89b388a4af206ec6b) ) + ROM_LOAD16_BYTE( "7.93", 0x00000, 0x20000, CRC(9d847c31) SHA1(1d370d8db9cadadb9c2cb213e32f681947d81b7f) ) /* internally reports as 19th Sep. 1991 */ + ROM_LOAD16_BYTE( "6.94", 0x00001, 0x20000, CRC(de6408a0) SHA1(2df77fecd44d2d8b0444abd4545923213ed76b2d) ) ROM_REGION( 0x10000, "audiocpu", 0 ) /* unknown - sound cpu ?????? */ ROM_LOAD( "1.70", 0x00000, 0x10000, CRC(9e6f48fc) SHA1(aeb5bfecc025b5478f6de874792fc0f7f54932be) ) @@ -6305,10 +6305,36 @@ ROM_START( hachamfb ) /* 0x20000 - 0x80000 banked */ ROM_END -ROM_START( hachamf ) +ROM_START( hachamfa) /* reportedly a Korean PCB / version */ ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 code */ - ROM_LOAD16_BYTE( "7.93", 0x00000, 0x20000, CRC(9d847c31) SHA1(1d370d8db9cadadb9c2cb213e32f681947d81b7f) ) - ROM_LOAD16_BYTE( "6.94", 0x00001, 0x20000, CRC(de6408a0) SHA1(2df77fecd44d2d8b0444abd4545923213ed76b2d) ) + ROM_LOAD16_BYTE( "7.ic93", 0x00000, 0x20000, CRC(f437e52b) SHA1(061a75a7a9734034d1c499fc0bc2d8a61bb26da4) ) /* internally reports as 19th Sep. 1991 */ + ROM_LOAD16_BYTE( "6.ic94", 0x00001, 0x20000, CRC(60d340d0) SHA1(3c6f862901b403d6ddf58823af7d6e3f67573788) ) + + ROM_REGION( 0x10000, "audiocpu", 0 ) /* unknown - sound cpu ?????? */ + ROM_LOAD( "1.70", 0x00000, 0x10000, CRC(9e6f48fc) SHA1(aeb5bfecc025b5478f6de874792fc0f7f54932be) ) + + ROM_REGION( 0x020000, "fgtile", 0 ) /* Smaller NMK logo plus alternate Distributed by UPL Company Limited starting at tile 0xF80 */ + ROM_LOAD( "5.ic95", 0x000000, 0x020000, CRC(a2c1e25d) SHA1(cf09cbfd9afc7e3907fef6b26fb269b743f2e036) ) /* 8x8 tiles */ + + ROM_REGION( 0x100000, "bgtile", 0 ) /* 16x16 tiles */ + ROM_LOAD( "91076-4.101", 0x000000, 0x100000, CRC(df9653a4) SHA1(4a3204a98d7738c7895169fcece922fdf355f4fa) ) + + ROM_REGION( 0x100000, "sprites", 0 ) + ROM_LOAD16_WORD_SWAP( "91076-8.57", 0x000000, 0x100000, CRC(7fd0f556) SHA1(d1b4bec0946869d3d7bcb870d9ae3bd17395a231) ) /* Sprites */ + + ROM_REGION( 0x080000, "oki1", 0 ) /* OKIM6295 samples */ + ROM_LOAD( "91076-2.46", 0x00000, 0x80000, CRC(3f1e67f2) SHA1(413e78587d8a043a0eb94447313ba1b3c5b35be5) ) /* 1st & 2nd half identical, needs verifying */ + /* 0x20000 - 0x80000 banked */ + + ROM_REGION( 0x080000, "oki2", 0 ) /* OKIM6295 samples */ + ROM_LOAD( "91076-3.45", 0x00000, 0x80000, CRC(b25ed93b) SHA1(d7bc686bbccf982f40420a11158aa8e5dd4207c5) ) /* 1st & 2nd half identical, needs verifying */ + /* 0x20000 - 0x80000 banked */ +ROM_END + +ROM_START( hachamfb ) /* Thunder Dragon conversion - unprotected prototype or bootleg? */ + ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 code */ + ROM_LOAD16_BYTE( "8.bin", 0x00000, 0x20000, CRC(14845b65) SHA1(5cafd07a8a6f5ccbb36de7a90571f8b33ecf273e) ) /* internally reports as 19th Sep. 1991 */ + ROM_LOAD16_BYTE( "7.bin", 0x00001, 0x20000, CRC(069ca579) SHA1(0db4c3c41e17fca613d11de89b388a4af206ec6b) ) ROM_REGION( 0x10000, "audiocpu", 0 ) /* unknown - sound cpu ?????? */ ROM_LOAD( "1.70", 0x00000, 0x10000, CRC(9e6f48fc) SHA1(aeb5bfecc025b5478f6de874792fc0f7f54932be) ) @@ -8162,7 +8188,8 @@ GAME( 1992, strahla, strahl, strahl, strahl, nmk16_state, empty GAME( 1991, tdragon, 0, tdragon, tdragon, nmk16_state, empty_init, ROT270, "NMK (Tecmo license)", "Thunder Dragon (8th Jan. 1992, unprotected)", 0 ) GAME( 1991, tdragon1, tdragon, tdragon_prot, tdragon_prot, nmk16_state, init_tdragon_prot, ROT270, "NMK (Tecmo license)", "Thunder Dragon (4th Jun. 1991, protected)", MACHINE_UNEMULATED_PROTECTION | MACHINE_NO_SOUND ) -GAME( 1991, hachamf, 0, hachamf_prot, hachamf_prot, nmk16_state, init_hachamf_prot, ROT0, "NMK", "Hacha Mecha Fighter (19th Sep. 1991, protected)", MACHINE_UNEMULATED_PROTECTION | MACHINE_NO_SOUND ) // lots of things wrong due to protection +GAME( 1991, hachamf, 0, hachamf_prot, hachamf_prot, nmk16_state, init_hachamf_prot, ROT0, "NMK", "Hacha Mecha Fighter (19th Sep. 1991, protected, set 1)", MACHINE_UNEMULATED_PROTECTION | MACHINE_NO_SOUND ) // lots of things wrong due to protection +GAME( 1991, hachamfa, hachamf, hachamf_prot, hachamf_prot, nmk16_state, init_hachamf_prot, ROT0, "NMK", "Hacha Mecha Fighter (19th Sep. 1991, protected, set 2)", MACHINE_UNEMULATED_PROTECTION | MACHINE_NO_SOUND ) // lots of things wrong due to protection GAME( 1991, hachamfb, hachamf, hachamf, hachamfb, nmk16_state, empty_init, ROT0, "bootleg", "Hacha Mecha Fighter (19th Sep. 1991, unprotected, bootleg Thunder Dragon conversion)", 0 ) // appears to be a Thunder Dragon conversion, could be bootleg? GAME( 1992, macross, 0, macross, macross, nmk16_state, init_nmk, ROT270, "Banpresto", "Super Spacefortress Macross / Chou-Jikuu Yousai Macross", 0 ) diff --git a/src/mame/drivers/notetaker.cpp b/src/mame/drivers/notetaker.cpp index fea32461bd9..34a0ba61357 100644 --- a/src/mame/drivers/notetaker.cpp +++ b/src/mame/drivers/notetaker.cpp @@ -846,13 +846,15 @@ MACHINE_CONFIG_START(notetaker_state::notetakr) MCFG_TMS9927_VSYN_CALLBACK(WRITELINE("iop_pic8259", pic8259_device, ir4_w)) // note this triggers interrupts on both the iop (ir7) and emulatorcpu (ir4) MCFG_VIDEO_SET_SCREEN("screen") - MCFG_DEVICE_ADD( "kbduart", AY31015, 0 ) // HD6402, == AY-3-1015D - MCFG_AY31015_RX_CLOCK(960_kHz_XTAL) // hard-wired to 960KHz xtal #f11 (60000 baud, 16 clocks per baud) - MCFG_AY31015_TX_CLOCK(960_kHz_XTAL) // hard-wired to 960KHz xtal #f11 (60000 baud, 16 clocks per baud) - - MCFG_DEVICE_ADD( "eiauart", AY31015, 0 ) // HD6402, == AY-3-1015D - MCFG_AY31015_RX_CLOCK(((960_kHz_XTAL/10)/4)/5) // hard-wired through an mc14568b divider set to divide by 4, the result set to divide by 5; this resulting 4800hz signal being 300 baud (16 clocks per baud) - MCFG_AY31015_TX_CLOCK(((960_kHz_XTAL/10)/4)/5) // hard-wired through an mc14568b divider set to divide by 4, the result set to divide by 5; this resulting 4800hz signal being 300 baud (16 clocks per baud) + AY31015(config, m_kbduart, 0); // HD6402, == AY-3-1015D + m_kbduart->set_rx_clock(960_kHz_XTAL); // hard-wired to 960KHz xtal #f11 (60000 baud, 16 clocks per baud) + m_kbduart->set_tx_clock(960_kHz_XTAL); // hard-wired to 960KHz xtal #f11 (60000 baud, 16 clocks per baud) + m_kbduart->write_dav_callback().set("iop_pic8259", FUNC(pic8259_device::ir6_w)); // DataRecvd = KbdInt + + AY31015(config, m_eiauart, 0); // HD6402, == AY-3-1015D + m_eiauart->set_rx_clock(((960_kHz_XTAL/10)/4)/5); // hard-wired through an mc14568b divider set to divide by 4, the result set to divide by 5; this resulting 4800hz signal being 300 baud (16 clocks per baud) + m_eiauart->set_tx_clock(((960_kHz_XTAL/10)/4)/5); // hard-wired through an mc14568b divider set to divide by 4, the result set to divide by 5; this resulting 4800hz signal being 300 baud (16 clocks per baud) + m_eiauart->write_dav_callback().set("iop_pic8259", FUNC(pic8259_device::ir3_w)); // EIADataReady = EIAInt /* Floppy */ MCFG_DEVICE_ADD("wd1791", FD1791, (((24_MHz_XTAL/3)/2)/2)) // 2mhz, from 24mhz ip clock divided by 6 via 8284, an additional 2 by LS161 at #e1 on display/floppy board diff --git a/src/mame/drivers/nsg6809.cpp b/src/mame/drivers/nsg6809.cpp index 1029a53f018..32904a6bef1 100644 --- a/src/mame/drivers/nsg6809.cpp +++ b/src/mame/drivers/nsg6809.cpp @@ -55,7 +55,7 @@ public: private: void main_map(address_map &map); - required_device<cpu_device> m_maincpu; + required_device<mc6809_device> m_maincpu; }; @@ -71,22 +71,23 @@ void nsg6809_state::main_map(address_map &map) static INPUT_PORTS_START( pitchhit ) INPUT_PORTS_END -MACHINE_CONFIG_START(nsg6809_state::pitchhit) - MCFG_DEVICE_ADD("maincpu", MC6809, XTAL(4'000'000)) // clock buffered through 74HC4060 - MCFG_DEVICE_PROGRAM_MAP(main_map) +void nsg6809_state::pitchhit(machine_config &config) +{ + MC6809(config, m_maincpu, XTAL(4'000'000)); // clock buffered through 74HC4060 + m_maincpu->set_addrmap(AS_PROGRAM, &nsg6809_state::main_map); - MCFG_DEVICE_ADD("via", VIA6522, XTAL(4'000'000) / 4) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE("mainirq", input_merger_device, in_w<0>)) + via6522_device &via(VIA6522(config, "via", XTAL(4'000'000) / 4)); + via.irq_handler().set("mainirq", FUNC(input_merger_device::in_w<0>)); - MCFG_DEVICE_ADD("acia", MOS6551, 0) - MCFG_MOS6551_XTAL(XTAL(1'843'200)) - MCFG_MOS6551_IRQ_HANDLER(WRITELINE("mainirq", input_merger_device, in_w<1>)) + mos6551_device &acia(MOS6551(config, "acia", 0)); + acia.set_xtal(XTAL(1'843'200)); + acia.irq_handler().set("mainirq", FUNC(input_merger_device::in_w<1>)); - MCFG_WATCHDOG_ADD("deadman") + WATCHDOG_TIMER(config, "deadman", 0); - MCFG_INPUT_MERGER_ANY_HIGH("mainirq") - MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("maincpu", M6809_IRQ_LINE)) -MACHINE_CONFIG_END + input_merger_device &merger(INPUT_MERGER_ANY_HIGH(config, "mainirq")); + merger.output_handler().set_inputline(m_maincpu, M6809_IRQ_LINE); +} /* diff --git a/src/mame/drivers/oric.cpp b/src/mame/drivers/oric.cpp index 8d4cdf22379..6c48048db54 100644 --- a/src/mame/drivers/oric.cpp +++ b/src/mame/drivers/oric.cpp @@ -72,6 +72,8 @@ public: , m_bank_e000_w(*this, "bank_e000_w") , m_bank_f800_w(*this, "bank_f800_w") , m_config(*this, "CONFIG") + , m_kbd_row(*this, "ROW%u", 0U) + , m_tape_timer(nullptr) { } DECLARE_INPUT_CHANGED_MEMBER(nmi_pressed); @@ -82,18 +84,18 @@ public: DECLARE_WRITE_LINE_MEMBER(via_irq_w); DECLARE_WRITE_LINE_MEMBER(ext_irq_w); DECLARE_WRITE8_MEMBER(psg_a_w); - TIMER_DEVICE_CALLBACK_MEMBER(update_tape); + TIMER_CALLBACK_MEMBER(update_tape); virtual void machine_start() override; virtual void video_start() override; uint32_t screen_update_oric(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); DECLARE_WRITE_LINE_MEMBER(vblank_w); - void oric(machine_config &config); + void oric(machine_config &config, bool add_ext = true); void prav8d(machine_config &config); void oric_mem(address_map &map); protected: - required_device<cpu_device> m_maincpu; + required_device<m6502_device> m_maincpu; required_device<palette_device> m_palette; required_device<ay8910_device> m_psg; required_device<centronics_device> m_centronics; @@ -109,7 +111,9 @@ protected: optional_memory_bank m_bank_e000_w; optional_memory_bank m_bank_f800_w; required_ioport m_config; - ioport_port *m_kbd_row[8]; + required_ioport_array<8> m_kbd_row; + + emu_timer *m_tape_timer; int m_blink_counter; uint8_t m_pattr; @@ -143,9 +147,6 @@ public: DECLARE_WRITE_LINE_MEMBER(via2_ca2_w); DECLARE_WRITE_LINE_MEMBER(via2_cb2_w); DECLARE_WRITE_LINE_MEMBER(via2_irq_w); - DECLARE_WRITE8_MEMBER(port_314_w); - DECLARE_READ8_MEMBER(port_314_r); - DECLARE_READ8_MEMBER(port_318_r); DECLARE_WRITE_LINE_MEMBER(acia_irq_w); @@ -189,6 +190,9 @@ protected: virtual void update_irq() override; void remap(); + void port_314_w(u8 data); + u8 port_314_r(); + u8 port_318_r(); }; /* Ram is 64K, with 16K hidden by the rom. The 300-3ff is also hidden by the i/o */ @@ -366,7 +370,7 @@ WRITE8_MEMBER(oric_state::psg_a_w) update_keyboard(); } -TIMER_DEVICE_CALLBACK_MEMBER(oric_state::update_tape) +TIMER_CALLBACK_MEMBER(oric_state::update_tape) { if(!m_config->read()) m_via->write_cb1(m_cassette->input() > 0.0038); @@ -394,11 +398,8 @@ void oric_state::machine_start_common() m_via_irq = false; m_ext_irq = false; - for(int i=0; i<8; i++) { - char name[10]; - sprintf(name, "ROW%d", i); - m_kbd_row[i] = machine().root_device().ioport(name); - } + if (!m_tape_timer) + m_tape_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(oric_state::update_tape), this)); } void oric_state::machine_start() @@ -476,7 +477,7 @@ WRITE_LINE_MEMBER(telestrat_state::via2_irq_w) update_irq(); } -WRITE8_MEMBER(telestrat_state::port_314_w) +void telestrat_state::port_314_w(u8 data) { m_port_314 = data; floppy_image_device *floppy = m_floppies[(m_port_314 >> 5) & 3]; @@ -489,12 +490,12 @@ WRITE8_MEMBER(telestrat_state::port_314_w) update_irq(); } -READ8_MEMBER(telestrat_state::port_314_r) +u8 telestrat_state::port_314_r() { return (m_fdc_irq && (m_port_314 & P_IRQEN)) ? 0x7f : 0xff; } -READ8_MEMBER(telestrat_state::port_318_r) +u8 telestrat_state::port_318_r() { return m_fdc_drq ? 0x7f : 0xff; } @@ -776,56 +777,61 @@ static INPUT_PORTS_START(telstrat) INPUT_PORTS_END -MACHINE_CONFIG_START(oric_state::oric) +void oric_state::oric(machine_config &config, bool add_ext) +{ /* basic machine hardware */ - MCFG_DEVICE_ADD("maincpu", M6502, 12_MHz_XTAL / 12) - MCFG_DEVICE_PROGRAM_MAP(oric_mem) - MCFG_QUANTUM_TIME(attotime::from_hz(60)) + M6502(config, m_maincpu, 12_MHz_XTAL / 12); + m_maincpu->set_addrmap(AS_PROGRAM, &oric_state::oric_mem); + + config.m_minimum_quantum = attotime::from_hz(60); /* video hardware */ - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_RAW_PARAMS(12_MHz_XTAL / 2, 64*6, 0, 40*6, 312, 0, 28*8) // 260 lines in 60 Hz mode - MCFG_SCREEN_UPDATE_DRIVER(oric_state, screen_update_oric) - MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, oric_state, vblank_w)) + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); + screen.set_raw(12_MHz_XTAL / 2, 64*6, 0, 40*6, 312, 0, 28*8); // 260 lines in 60 Hz mode + screen.set_screen_update(FUNC(oric_state::screen_update_oric)); + screen.screen_vblank().set(FUNC(oric_state::vblank_w)); - MCFG_PALETTE_ADD_3BIT_RGB("palette") + PALETTE(config, m_palette, 8); + m_palette->set_init("palette", FUNC(palette_device::palette_init_3bit_rgb)); /* sound hardware */ SPEAKER(config, "mono").front_center(); WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "mono", 0.25); - MCFG_DEVICE_ADD("ay8912", AY8912, 12_MHz_XTAL / 12) - MCFG_AY8910_OUTPUT_TYPE(AY8910_DISCRETE_OUTPUT) - MCFG_AY8910_RES_LOADS(4700, 4700, 4700) - MCFG_AY8910_PORT_A_WRITE_CB(WRITE8(*this, oric_state, psg_a_w)) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) + + AY8912(config, m_psg, 12_MHz_XTAL / 12); + m_psg->set_flags(AY8910_DISCRETE_OUTPUT); + m_psg->set_resistors_load(4700, 4700, 4700); + m_psg->port_a_write_callback().set(FUNC(oric_state::psg_a_w)); + m_psg->add_route(ALL_OUTPUTS, "mono", 0.25); /* printer */ - MCFG_DEVICE_ADD(m_centronics, CENTRONICS, centronics_devices, "printer") - MCFG_CENTRONICS_ACK_HANDLER(WRITELINE("via6522", via6522_device, write_ca1)) - MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics") + CENTRONICS(config, m_centronics, centronics_devices, "printer"); + m_centronics->ack_handler().set(m_via, FUNC(via6522_device::write_ca1)); - /* cassette */ - MCFG_CASSETTE_ADD( "cassette" ) - MCFG_CASSETTE_FORMATS(oric_cassette_formats) - MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED) + OUTPUT_LATCH(config, m_cent_data_out); + m_centronics->set_output_latch(*m_cent_data_out); - MCFG_TIMER_DRIVER_ADD_PERIODIC("tape_timer", oric_state, update_tape, attotime::from_hz(4800)) + /* cassette */ + CASSETTE(config, m_cassette, 0); + m_cassette->set_formats(oric_cassette_formats); + m_cassette->set_default_state((cassette_state)(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED)); /* via */ - MCFG_DEVICE_ADD("via6522", VIA6522, 12_MHz_XTAL / 12) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, oric_state, via_a_w)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, oric_state, via_b_w)) - MCFG_VIA6522_CA2_HANDLER(WRITELINE(*this, oric_state, via_ca2_w)) - MCFG_VIA6522_CB2_HANDLER(WRITELINE(*this, oric_state, via_cb2_w)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, oric_state, via_irq_w)) + VIA6522(config, m_via, 12_MHz_XTAL / 12); + m_via->writepa_handler().set(FUNC(oric_state::via_a_w)); + m_via->writepb_handler().set(FUNC(oric_state::via_b_w)); + m_via->ca2_handler().set(FUNC(oric_state::via_ca2_w)); + m_via->cb2_handler().set(FUNC(oric_state::via_cb2_w)); + m_via->irq_handler().set(FUNC(oric_state::via_irq_w)); /* extension port */ - MCFG_ORICEXT_ADD( "ext", oricext_intf, nullptr, "maincpu", WRITELINE(*this, oric_state, ext_irq_w)) -MACHINE_CONFIG_END + ORICEXT_CONNECTOR(config, "ext", oricext_intf, nullptr, "maincpu").irq_callback().set(FUNC(oric_state::ext_irq_w)); +} -MACHINE_CONFIG_START(oric_state::prav8d) - oric(config); -MACHINE_CONFIG_END +void oric_state::prav8d(machine_config &config) +{ + oric(config, true); +} FLOPPY_FORMATS_MEMBER( telestrat_state::floppy_formats ) FLOPPY_ORIC_DSK_FORMAT @@ -836,40 +842,36 @@ static void telestrat_floppies(device_slot_interface &device) device.option_add("3dsdd", FLOPPY_3_DSDD); } -MACHINE_CONFIG_START(telestrat_state::telstrat) - oric(config); - MCFG_DEVICE_MODIFY( "maincpu" ) - MCFG_DEVICE_PROGRAM_MAP(telestrat_mem) +void telestrat_state::telstrat(machine_config &config) +{ + oric(config, false); + m_maincpu->set_addrmap(AS_PROGRAM, &telestrat_state::telestrat_mem); /* acia */ - MCFG_DEVICE_ADD("acia", MOS6551, 0) - MCFG_MOS6551_XTAL(1.8432_MHz_XTAL) - MCFG_MOS6551_IRQ_HANDLER(WRITELINE(*this, telestrat_state, acia_irq_w)) + mos6551_device &acia(MOS6551(config, "acia", 0)); + acia.set_xtal(1.8432_MHz_XTAL); + acia.irq_handler().set(FUNC(telestrat_state::acia_irq_w)); /* via */ - MCFG_DEVICE_ADD("via6522_2", VIA6522, 12_MHz_XTAL / 12) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, telestrat_state, via2_a_w)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, telestrat_state, via2_b_w)) - MCFG_VIA6522_CA2_HANDLER(WRITELINE(*this, telestrat_state, via2_ca2_w)) - MCFG_VIA6522_CB2_HANDLER(WRITELINE(*this, telestrat_state, via2_cb2_w)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, telestrat_state, via2_irq_w)) + VIA6522(config, m_via2, 12_MHz_XTAL / 12); + m_via2->writepa_handler().set(FUNC(telestrat_state::via2_a_w)); + m_via2->writepb_handler().set(FUNC(telestrat_state::via2_b_w)); + m_via2->ca2_handler().set(FUNC(telestrat_state::via2_ca2_w)); + m_via2->cb2_handler().set(FUNC(telestrat_state::via2_cb2_w)); + m_via2->irq_handler().set(FUNC(telestrat_state::via2_irq_w)); /* microdisc */ - MCFG_DEVICE_ADD("fdc", FD1793, 8_MHz_XTAL / 8) - MCFG_WD_FDC_INTRQ_CALLBACK(WRITELINE(*this, telestrat_state, fdc_irq_w)) - MCFG_WD_FDC_DRQ_CALLBACK(WRITELINE(*this, telestrat_state, fdc_drq_w)) - MCFG_WD_FDC_HLD_CALLBACK(WRITELINE(*this, telestrat_state, fdc_hld_w)) - MCFG_WD_FDC_FORCE_READY - - MCFG_FLOPPY_DRIVE_ADD("fdc:0", telestrat_floppies, "3dsdd", telestrat_state::floppy_formats) - MCFG_FLOPPY_DRIVE_ADD("fdc:1", telestrat_floppies, nullptr, telestrat_state::floppy_formats) - MCFG_FLOPPY_DRIVE_ADD("fdc:2", telestrat_floppies, nullptr, telestrat_state::floppy_formats) - MCFG_FLOPPY_DRIVE_ADD("fdc:3", telestrat_floppies, nullptr, telestrat_state::floppy_formats) - - // [RH] 30 August 2016: Based on the French Wikipedia page for the Oric, it does not appear - // that the Telestrat supported the same expansions as the Oric-1 and Atmos. - MCFG_DEVICE_REMOVE("ext") -MACHINE_CONFIG_END + FD1793(config, m_fdc, 8_MHz_XTAL / 8); + m_fdc->intrq_wr_callback().set(FUNC(telestrat_state::fdc_irq_w)); + m_fdc->drq_wr_callback().set(FUNC(telestrat_state::fdc_drq_w)); + m_fdc->hld_wr_callback().set(FUNC(telestrat_state::fdc_hld_w)); + m_fdc->set_force_ready(true); + + FLOPPY_CONNECTOR(config, "fdc:0", telestrat_floppies, "3dsdd", telestrat_state::floppy_formats); + FLOPPY_CONNECTOR(config, "fdc:1", telestrat_floppies, nullptr, telestrat_state::floppy_formats); + FLOPPY_CONNECTOR(config, "fdc:2", telestrat_floppies, nullptr, telestrat_state::floppy_formats); + FLOPPY_CONNECTOR(config, "fdc:3", telestrat_floppies, nullptr, telestrat_state::floppy_formats); +} ROM_START(oric1) diff --git a/src/mame/drivers/osbexec.cpp b/src/mame/drivers/osbexec.cpp index 9b19456acf1..6acb93a6a06 100644 --- a/src/mame/drivers/osbexec.cpp +++ b/src/mame/drivers/osbexec.cpp @@ -15,6 +15,7 @@ #include "machine/input_merger.h" #include "machine/pit8253.h" #include "machine/ram.h" +#include "machine/ripple_counter.h" #include "machine/wd_fdc.h" #include "machine/z80sio.h" #include "sound/spkrdev.h" @@ -40,12 +41,12 @@ public: , m_screen(*this, "screen") , m_mb8877(*this, "mb8877") , m_messram( *this, RAM_TAG) - , m_pia_0(*this, "pia_0") - , m_pia_1(*this, "pia_1") + , m_pia(*this, "pia_%u", 0U) + , m_rtc(*this, "rtc") , m_sio(*this, "sio") , m_speaker(*this, "speaker") - , m_floppy0(*this, "mb8877:0:525ssdd") - , m_floppy1(*this, "mb8877:1:525ssdd") + , m_floppy(*this, "mb8877:%u:525ssdd", 0U) + , m_kbd_row(*this, "ROW%u", 0U) { } void osbexec(machine_config &config); @@ -57,12 +58,12 @@ private: required_device<screen_device> m_screen; required_device<mb8877_device> m_mb8877; required_device<ram_device> m_messram; - required_device<pia6821_device> m_pia_0; - required_device<pia6821_device> m_pia_1; + required_device_array<pia6821_device, 2> m_pia; + required_device<ripple_counter_device> m_rtc; required_device<z80sio_device> m_sio; required_device<speaker_sound_device> m_speaker; - required_device<floppy_image_device> m_floppy0; - required_device<floppy_image_device> m_floppy1; + required_device_array<floppy_image_device, 2> m_floppy; + required_ioport_array<8> m_kbd_row; virtual void video_start() override; @@ -70,10 +71,8 @@ private: bitmap_ind16 m_bitmap; - memory_region *m_fontram_region; - memory_region *m_vram_region; - uint8_t *m_fontram; - uint8_t *m_vram; + std::unique_ptr<uint8_t[]> m_fontram; + std::unique_ptr<uint8_t[]> m_vram; uint8_t *m_ram_0000; uint8_t *m_ram_c000; uint8_t m_temp_attr; @@ -86,9 +85,6 @@ private: /* PIA 1 (UD8) */ - /* Vblank counter ("RTC") */ - uint8_t m_rtc; - void set_banks() { uint8_t *ram_ptr = m_messram->pointer(); @@ -112,7 +108,7 @@ private: } if ( m_pia0_porta & 0x40 ) - m_ram_c000 = m_vram_region->base(); + m_ram_c000 = m_vram.get(); } DECLARE_WRITE8_MEMBER(osbexec_0000_w); @@ -181,29 +177,9 @@ READ8_MEMBER(osbexec_state::osbexec_kbd_r) { uint8_t data = 0xFF; - if ( offset & 0x0100 ) - data &= ioport( "ROW0" )->read(); - - if ( offset & 0x0200 ) - data &= ioport( "ROW1" )->read(); - - if ( offset & 0x0400 ) - data &= ioport( "ROW2" )->read(); - - if ( offset & 0x0800 ) - data &= ioport( "ROW3" )->read(); - - if ( offset & 0x1000 ) - data &= ioport( "ROW4" )->read(); - - if ( offset & 0x2000 ) - data &= ioport( "ROW5" )->read(); - - if ( offset & 0x4000 ) - data &= ioport( "ROW6" )->read(); - - if ( offset & 0x8000 ) - data &= ioport( "ROW7" )->read(); + for (int j = 0; j < 8; j++) + if (BIT(offset, j + 8)) + data &= m_kbd_row[j]->read(); return data; } @@ -211,7 +187,8 @@ READ8_MEMBER(osbexec_state::osbexec_kbd_r) READ8_MEMBER(osbexec_state::osbexec_rtc_r) { - return m_rtc; + // 74LS244 buffer @ UF13 + return m_rtc->count(); } @@ -229,11 +206,11 @@ void osbexec_state::osbexec_mem(address_map &map) void osbexec_state::osbexec_io(address_map &map) { map.unmap_value_high(); - map(0x00, 0x03).mirror(0xff00).rw(m_pia_0, FUNC(pia6821_device::read), FUNC(pia6821_device::write)); /* 6821 PIA @ UD12 */ + map(0x00, 0x03).mirror(0xff00).rw(m_pia[0], FUNC(pia6821_device::read), FUNC(pia6821_device::write)); /* 6821 PIA @ UD12 */ map(0x04, 0x07).mirror(0xff00).rw("ctc", FUNC(pit8253_device::read), FUNC(pit8253_device::write)); /* 8253 @UD1 */ map(0x08, 0x0B).mirror(0xff00).rw(m_mb8877, FUNC(wd_fdc_device_base::read), FUNC(wd_fdc_device_base::write)); /* MB8877 @ UB17 input clock = 1MHz */ map(0x0C, 0x0F).mirror(0xff00).rw(m_sio, FUNC(z80sio_device::ba_cd_r), FUNC(z80sio_device::ba_cd_w)); /* SIO @ UD4 */ - map(0x10, 0x13).mirror(0xff00).rw(m_pia_1, FUNC(pia6821_device::read), FUNC(pia6821_device::write)); /* 6821 PIA @ UD8 */ + map(0x10, 0x13).mirror(0xff00).rw(m_pia[1], FUNC(pia6821_device::read), FUNC(pia6821_device::write)); /* 6821 PIA @ UD8 */ map(0x14, 0x17).select(0xff00).r(FUNC(osbexec_state::osbexec_kbd_r)); /* KBD */ map(0x18, 0x1b).mirror(0xff00).r(FUNC(osbexec_state::osbexec_rtc_r)); /* "RTC" @ UE13/UF13 */ /* ?? - vid ? */ @@ -395,12 +372,12 @@ WRITE8_MEMBER(osbexec_state::osbexec_pia0_b_w) switch ( data & 0x06 ) { case 0x02: - m_mb8877->set_floppy(m_floppy1); - m_floppy1->mon_w(0); + m_mb8877->set_floppy(m_floppy[1].target()); + m_floppy[1]->mon_w(0); break; case 0x04: - m_mb8877->set_floppy(m_floppy0); - m_floppy0->mon_w(0); + m_mb8877->set_floppy(m_floppy[0].target()); + m_floppy[0]->mon_w(0); break; default: m_mb8877->set_floppy(nullptr); @@ -426,40 +403,41 @@ WRITE_LINE_MEMBER(osbexec_state::osbexec_pia0_cb2_w) WRITE_LINE_MEMBER(osbexec_state::modem_txclk_w) { if (BIT(m_pia0_portb, 5)) - m_sio->txca_w(!state); + m_sio->txca_w(state); } WRITE_LINE_MEMBER(osbexec_state::modem_rxclk_w) { if (BIT(m_pia0_portb, 4)) - m_sio->rxca_w(!state); + m_sio->rxca_w(state); } WRITE_LINE_MEMBER(osbexec_state::modem_dsr_w) { - m_pia0_portb &= 0xbf; - if (!state) + if (state) m_pia0_portb |= 0x40; + else + m_pia0_portb &= 0xbf; } WRITE_LINE_MEMBER(osbexec_state::modem_ri_w) { - m_pia0_portb &= 0x7f; - if (!state) + if (state) m_pia0_portb |= 0x80; + else + m_pia0_portb &= 0x7f; } WRITE_LINE_MEMBER(osbexec_state::comm_clk_a_w) { - //if (!BIT(m_pia0_portb, 5)) + if (!BIT(m_pia0_portb, 5)) m_sio->txca_w(state); - //if (!BIT(m_pia0_portb, 4)) + if (!BIT(m_pia0_portb, 4)) m_sio->rxca_w(state); - //m_modem->txclk_w(!state); } @@ -483,18 +461,6 @@ TIMER_CALLBACK_MEMBER(osbexec_state::osbexec_video_callback) { int y = m_screen->vpos(); - /* Start of frame */ - if ( y == 0 ) - { - /* Clear CB1 on PIA @ UD12 */ - m_pia_0->cb1_w(0); - } - else if ( y == 240 ) - { - /* Set CB1 on PIA @ UD12 */ - m_pia_0->cb1_w(1); - m_rtc++; - } if ( y < 240 ) { uint16_t row_addr = ( y / 10 ) * 128; @@ -509,15 +475,15 @@ TIMER_CALLBACK_MEMBER(osbexec_state::osbexec_video_callback) uint8_t font_bits = m_fontram[ ( ( attr & 0x10 ) ? 0x800 : 0 ) + ( ch & 0x7f ) * 16 + char_line ]; /* Check for underline */ - if ( ( attr & 0x40 ) && char_line == 9 ) + if (BIT(attr, 6) && char_line == 9) font_bits = 0xFF; /* Check for blink */ - if ( ( attr & 0x20 ) && ( m_rtc & 0x10 ) ) + if (BIT(attr, 5) && BIT(m_rtc->count(), 4)) font_bits = 0; /* Check for inverse video */ - if ( ( ch & 0x80 ) && ! ( attr & 0x10 ) ) + if (BIT(ch, 7) && !BIT(attr, 4)) font_bits ^= 0xFF; for ( int b = 0; b < 8; b++ ) @@ -534,14 +500,8 @@ TIMER_CALLBACK_MEMBER(osbexec_state::osbexec_video_callback) void osbexec_state::init_osbexec() { - m_fontram_region = machine().memory().region_alloc( "fontram", 0x1000, 1, ENDIANNESS_LITTLE); - m_vram_region = machine().memory().region_alloc( "vram", 0x2000, 1, ENDIANNESS_LITTLE ); - m_vram = m_vram_region->base(); - m_fontram = m_fontram_region->base(); - - - memset( m_fontram, 0x00, 0x1000 ); - memset( m_vram, 0x00, 0x2000 ); + m_vram = make_unique_clear<uint8_t[]>(0x2000); + m_fontram = make_unique_clear<uint8_t[]>(0x1000); m_video_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(osbexec_state::osbexec_video_callback),this)); } @@ -555,8 +515,6 @@ void osbexec_state::machine_reset() m_video_timer->adjust( m_screen->time_until_pos( 0, 0 ) ); - m_rtc = 0; - // D0 cleared on interrupt acknowledge cycle by TTL gates at UC21 and UA18 m_maincpu->set_input_line_vector(0, 0xfe); } @@ -575,17 +533,21 @@ MACHINE_CONFIG_START(osbexec_state::osbexec) MCFG_DEVICE_IO_MAP(osbexec_io) MCFG_Z80_DAISY_CHAIN(osbexec_daisy_config) - MCFG_SCREEN_ADD_MONOCHROME(m_screen, RASTER, rgb_t::green()) - MCFG_SCREEN_UPDATE_DRIVER(osbexec_state, screen_update) - MCFG_SCREEN_RAW_PARAMS(MAIN_CLOCK/2, 768, 0, 640, 260, 0, 240) /* May not be correct */ - MCFG_SCREEN_PALETTE("palette") + SCREEN(config, m_screen, SCREEN_TYPE_RASTER); + m_screen->set_color(rgb_t::green()); + m_screen->set_screen_update(FUNC(osbexec_state::screen_update)); + m_screen->set_raw(MAIN_CLOCK/2, 768, 0, 640, 260, 0, 240); /* May not be correct */ + m_screen->set_palette("palette"); + m_screen->screen_vblank().set(m_pia[0], FUNC(pia6821_device::cb1_w)); + m_screen->screen_vblank().append(m_rtc, FUNC(ripple_counter_device::clock_w)).invert(); + MCFG_PALETTE_ADD_MONOCHROME_HIGHLIGHT("palette") SPEAKER(config, "mono").front_center(); MCFG_DEVICE_ADD(m_speaker, SPEAKER_SOUND) MCFG_SOUND_ROUTE( ALL_OUTPUTS, "mono", 1.00 ) - MCFG_DEVICE_ADD(m_pia_0, PIA6821, 0) + MCFG_DEVICE_ADD(m_pia[0], PIA6821, 0) MCFG_PIA_READPA_HANDLER(READ8(*this, osbexec_state, osbexec_pia0_a_r)) MCFG_PIA_READPB_HANDLER(READ8(*this, osbexec_state, osbexec_pia0_b_r)) MCFG_PIA_WRITEPA_HANDLER(WRITE8(*this, osbexec_state, osbexec_pia0_a_w)) @@ -595,12 +557,15 @@ MACHINE_CONFIG_START(osbexec_state::osbexec) MCFG_PIA_IRQA_HANDLER(WRITELINE("mainirq", input_merger_device, in_w<0>)) MCFG_PIA_IRQB_HANDLER(WRITELINE("mainirq", input_merger_device, in_w<1>)) - MCFG_DEVICE_ADD(m_pia_1, PIA6821, 0) + MCFG_DEVICE_ADD(m_pia[1], PIA6821, 0) MCFG_PIA_IRQA_HANDLER(WRITELINE("mainirq", input_merger_device, in_w<2>)) MCFG_PIA_IRQB_HANDLER(WRITELINE("mainirq", input_merger_device, in_w<3>)) INPUT_MERGER_ANY_HIGH(config, "mainirq").output_handler().set_inputline(m_maincpu, 0); + RIPPLE_COUNTER(config, m_rtc); // 74LS393 @ UE13 + m_rtc->set_stages(8); // two halves cascaded + Z80SIO(config, m_sio, MAIN_CLOCK/6); m_sio->out_txda_callback().set(MODEM_PORT_TAG, FUNC(rs232_port_device::write_txd)); m_sio->out_dtra_callback().set(MODEM_PORT_TAG, FUNC(rs232_port_device::write_dtr)); @@ -610,13 +575,14 @@ MACHINE_CONFIG_START(osbexec_state::osbexec) m_sio->out_rtsb_callback().set(PRINTER_PORT_TAG, FUNC(rs232_port_device::write_rts)); m_sio->out_int_callback().set("mainirq", FUNC(input_merger_device::in_w<4>)); - MCFG_DEVICE_ADD("ctc", PIT8253, 0) - MCFG_PIT8253_CLK0(MAIN_CLOCK / 13) // divided by 74S161 @ UC25 - MCFG_PIT8253_CLK1(MAIN_CLOCK / 13) // divided by 74S161 @ UC25 - MCFG_PIT8253_CLK2(MAIN_CLOCK / 12) - MCFG_PIT8253_OUT0_HANDLER(WRITELINE(*this, osbexec_state, comm_clk_a_w)) - MCFG_PIT8253_OUT1_HANDLER(WRITELINE(m_sio, z80sio_device, rxtxcb_w)) - //MCFG_PIT8253_OUT2_HANDLER(WRITELINE(*this, osbexec_state, spindle_clk_w)) + pit8253_device &ctc(PIT8253(config, "ctc", 0)); + ctc.set_clk<0>(MAIN_CLOCK / 13); // divided by 74S161 @ UC25 + ctc.set_clk<1>(MAIN_CLOCK / 13); // divided by 74S161 @ UC25 + ctc.set_clk<2>(MAIN_CLOCK / 12); + ctc.out_handler<0>().set(FUNC(osbexec_state::comm_clk_a_w)); + ctc.out_handler<0>().append(MODEM_PORT_TAG, FUNC(rs232_port_device::write_etc)); + ctc.out_handler<1>().set(m_sio, FUNC(z80sio_device::rxtxcb_w)); + //ctc.out_handler<2>().set(FUNC(osbexec_state::spindle_clk_w)); rs232_port_device &modem_port(RS232_PORT(config, MODEM_PORT_TAG, default_rs232_devices, nullptr)); modem_port.rxd_handler().set(m_sio, FUNC(z80sio_device::rxa_w)); @@ -624,6 +590,8 @@ MACHINE_CONFIG_START(osbexec_state::osbexec) modem_port.dsr_handler().set(FUNC(osbexec_state::modem_dsr_w)); modem_port.ri_handler().set(FUNC(osbexec_state::modem_ri_w)); modem_port.cts_handler().set(m_sio, FUNC(z80sio_device::ctsa_w)); + modem_port.txc_handler().set(FUNC(osbexec_state::modem_txclk_w)); + modem_port.rxc_handler().set(FUNC(osbexec_state::modem_rxclk_w)); rs232_port_device &printer_port(RS232_PORT(config, PRINTER_PORT_TAG, default_rs232_devices, nullptr)); printer_port.rxd_handler().set(m_sio, FUNC(z80sio_device::rxb_w)); @@ -631,7 +599,7 @@ MACHINE_CONFIG_START(osbexec_state::osbexec) printer_port.cts_handler().set(m_sio, FUNC(z80sio_device::ctsb_w)); MCFG_DEVICE_ADD("mb8877", MB8877, MAIN_CLOCK/24) - MCFG_WD_FDC_INTRQ_CALLBACK(WRITELINE(m_pia_1, pia6821_device, cb1_w)) + MCFG_WD_FDC_INTRQ_CALLBACK(WRITELINE(m_pia[1], pia6821_device, cb1_w)) MCFG_FLOPPY_DRIVE_ADD("mb8877:0", osborne2_floppies, "525ssdd", floppy_image_device::default_floppy_formats) MCFG_FLOPPY_DRIVE_ADD("mb8877:1", osborne2_floppies, "525ssdd", floppy_image_device::default_floppy_formats) diff --git a/src/mame/drivers/pacman.cpp b/src/mame/drivers/pacman.cpp index cf7f985c557..c635143797d 100644 --- a/src/mame/drivers/pacman.cpp +++ b/src/mame/drivers/pacman.cpp @@ -5918,12 +5918,12 @@ ROM_START( eyesb ) ROM_REGION( 0x2000, "gfx1", 0 ) ROM_LOAD( "9.bin", 0x0000, 0x0800, CRC(342c0653) SHA1(d07e3d4528b72e54a1b5dbed009cce765a5a086f) ) - ROM_LOAD( "11.bin", 0x0800, 0x0800, CRC(aaa7a537) SHA1(571d981ed2aad62d7c7f2798e9084228d45523d4) ) + ROM_LOAD( "12.bin", 0x0800, 0x0800, CRC(99af4b30) SHA1(6a0939ff2fa7ae39a960dd4d9f9b7c01f57647c5) ) ROM_LOAD( "10.bin", 0x1000, 0x0800, CRC(b247b82c) SHA1(8c10a8ef5e79b0b5fefad6eb77bfa68a0ca18035) ) - ROM_LOAD( "12.bin", 0x1800, 0x0800, CRC(99af4b30) SHA1(6a0939ff2fa7ae39a960dd4d9f9b7c01f57647c5) ) + ROM_LOAD( "11.bin", 0x1800, 0x0800, CRC(aaa7a537) SHA1(571d981ed2aad62d7c7f2798e9084228d45523d4) ) ROM_REGION( 0x0120, "proms", 0 ) - ROM_LOAD( "7051.bin", 0x0000, 0x0020, CRC(0dad2ccb) SHA1(f42c5ee7084e5702b5b0c8c1d86b0a41a6e1821d) ) + ROM_LOAD( "7051.bin", 0x0000, 0x0020, CRC(2c3cc909) SHA1(32d68d4cfdf9f3e7351353428d268c763e809c63) ) // fixed 3x bytes with inverse second half ROM_LOAD( "7051-3.bin", 0x0020, 0x0100, CRC(d8d78829) SHA1(19820d1651423210083a087fb70ebea73ad34951) ) ROM_REGION( 0x0200, "namco", 0 ) /* sound PROMs */ diff --git a/src/mame/drivers/paranoia.cpp b/src/mame/drivers/paranoia.cpp index cf1bcd51027..fbe47b2aa19 100644 --- a/src/mame/drivers/paranoia.cpp +++ b/src/mame/drivers/paranoia.cpp @@ -44,7 +44,6 @@ HuC6280A (Hudson) #include "video/huc6260.h" #include "video/huc6270.h" #include "cpu/h6280/h6280.h" -#include "sound/c6280.h" #include "screen.h" #include "speaker.h" @@ -86,10 +85,6 @@ void paranoia_state::pce_mem(address_map &map) map(0x1F0000, 0x1F1FFF).ram().mirror(0x6000); map(0x1FE000, 0x1FE3FF).rw("huc6270", FUNC(huc6270_device::read), FUNC(huc6270_device::write)); map(0x1FE400, 0x1FE7FF).rw(m_huc6260, FUNC(huc6260_device::read), FUNC(huc6260_device::write)); - map(0x1FE800, 0x1FEBFF).rw("c6280", FUNC(c6280_device::c6280_r), FUNC(c6280_device::c6280_w)); - map(0x1FEC00, 0x1FEFFF).rw(m_maincpu, FUNC(h6280_device::timer_r), FUNC(h6280_device::timer_w)); - map(0x1FF000, 0x1FF3FF).rw(FUNC(paranoia_state::pce_joystick_r), FUNC(paranoia_state::pce_joystick_w)); - map(0x1FF400, 0x1FF7FF).rw(m_maincpu, FUNC(h6280_device::irq_status_r), FUNC(h6280_device::irq_status_w)); } void paranoia_state::pce_io(address_map &map) @@ -172,9 +167,14 @@ WRITE_LINE_MEMBER(paranoia_state::i8155_timer_out) MACHINE_CONFIG_START(paranoia_state::paranoia) /* basic machine hardware */ - MCFG_DEVICE_ADD("maincpu", H6280, PCE_MAIN_CLOCK/3) - MCFG_DEVICE_PROGRAM_MAP(pce_mem) - MCFG_DEVICE_IO_MAP(pce_io) + H6280(config, m_maincpu, PCE_MAIN_CLOCK/3); + m_maincpu->set_addrmap(AS_PROGRAM, ¶noia_state::pce_mem); + m_maincpu->set_addrmap(AS_IO, ¶noia_state::pce_io); + m_maincpu->port_in_cb().set(FUNC(paranoia_state::pce_joystick_r)); + m_maincpu->port_out_cb().set(FUNC(paranoia_state::pce_joystick_w)); + m_maincpu->add_route(0, "lspeaker", 1.00); + m_maincpu->add_route(1, "rspeaker", 1.00); + MCFG_QUANTUM_TIME(attotime::from_hz(60)) MCFG_DEVICE_ADD("sub", I8085A, 18000000/3) @@ -208,11 +208,6 @@ MACHINE_CONFIG_START(paranoia_state::paranoia) SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); - MCFG_DEVICE_ADD("c6280", C6280, PCE_MAIN_CLOCK/6) - MCFG_C6280_CPU("maincpu") - MCFG_SOUND_ROUTE(0, "lspeaker", 1.00) - MCFG_SOUND_ROUTE(1, "rspeaker", 1.00) - MACHINE_CONFIG_END ROM_START(paranoia) diff --git a/src/mame/drivers/pce.cpp b/src/mame/drivers/pce.cpp index 81fa170ec2c..82470364102 100644 --- a/src/mame/drivers/pce.cpp +++ b/src/mame/drivers/pce.cpp @@ -61,7 +61,6 @@ Super System Card: #include "bus/pce/pce_rom.h" #include "cpu/h6280/h6280.h" -#include "sound/c6280.h" #include "sound/cdda.h" #include "sound/msm5205.h" #include "video/huc6202.h" @@ -259,10 +258,6 @@ void pce_state::pce_mem(address_map &map) map(0x1F0000, 0x1F1FFF).ram().mirror(0x6000).share("user_ram"); map(0x1FE000, 0x1FE3FF).rw("huc6270", FUNC(huc6270_device::read), FUNC(huc6270_device::write)); map(0x1FE400, 0x1FE7FF).rw(m_huc6260, FUNC(huc6260_device::read), FUNC(huc6260_device::write)); - map(0x1FE800, 0x1FEBFF).rw(C6280_TAG, FUNC(c6280_device::c6280_r), FUNC(c6280_device::c6280_w)); - map(0x1FEC00, 0x1FEFFF).rw(m_maincpu, FUNC(h6280_device::timer_r), FUNC(h6280_device::timer_w)); - map(0x1FF000, 0x1FF3FF).rw(FUNC(pce_state::mess_pce_joystick_r), FUNC(pce_state::mess_pce_joystick_w)); - map(0x1FF400, 0x1FF7FF).rw(m_maincpu, FUNC(h6280_device::irq_status_r), FUNC(h6280_device::irq_status_w)); map(0x1FF800, 0x1FFBFF).rw(FUNC(pce_state::pce_cd_intf_r), FUNC(pce_state::pce_cd_intf_w)); } @@ -284,10 +279,6 @@ void pce_state::sgx_mem(address_map &map) map(0x1FE008, 0x1FE00F).rw("huc6202", FUNC(huc6202_device::read), FUNC(huc6202_device::write)).mirror(0x03E0); map(0x1FE010, 0x1FE017).rw("huc6270_1", FUNC(huc6270_device::read), FUNC(huc6270_device::write)).mirror(0x03E0); map(0x1FE400, 0x1FE7FF).rw(m_huc6260, FUNC(huc6260_device::read), FUNC(huc6260_device::write)); - map(0x1FE800, 0x1FEBFF).rw(C6280_TAG, FUNC(c6280_device::c6280_r), FUNC(c6280_device::c6280_w)); - map(0x1FEC00, 0x1FEFFF).rw(m_maincpu, FUNC(h6280_device::timer_r), FUNC(h6280_device::timer_w)); - map(0x1FF000, 0x1FF3FF).rw(FUNC(pce_state::mess_pce_joystick_r), FUNC(pce_state::mess_pce_joystick_w)); - map(0x1FF400, 0x1FF7FF).rw(m_maincpu, FUNC(h6280_device::irq_status_r), FUNC(h6280_device::irq_status_w)); map(0x1FF800, 0x1FFBFF).rw(FUNC(pce_state::pce_cd_intf_r), FUNC(pce_state::pce_cd_intf_w)); } @@ -316,9 +307,14 @@ static void pce_cart(device_slot_interface &device) MACHINE_CONFIG_START(pce_state::pce_common) /* basic machine hardware */ - MCFG_DEVICE_ADD("maincpu", H6280, MAIN_CLOCK/3) - MCFG_DEVICE_PROGRAM_MAP(pce_mem) - MCFG_DEVICE_IO_MAP(pce_io) + H6280(config, m_maincpu, MAIN_CLOCK/3); + m_maincpu->set_addrmap(AS_PROGRAM, &pce_state::pce_mem); + m_maincpu->set_addrmap(AS_IO, &pce_state::pce_io); + m_maincpu->port_in_cb().set(FUNC(pce_state::mess_pce_joystick_r)); + m_maincpu->port_out_cb().set(FUNC(pce_state::mess_pce_joystick_w)); + m_maincpu->add_route(0, "lspeaker", 1.00); + m_maincpu->add_route(1, "rspeaker", 1.00); + MCFG_QUANTUM_TIME(attotime::from_hz(60)) MCFG_MACHINE_START_OVERRIDE(pce_state, pce ) @@ -342,10 +338,6 @@ MACHINE_CONFIG_START(pce_state::pce_common) SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); - MCFG_DEVICE_ADD(C6280_TAG, C6280, MAIN_CLOCK/6) - MCFG_C6280_CPU("maincpu") - MCFG_SOUND_ROUTE( 0, "lspeaker", 1.00 ) - MCFG_SOUND_ROUTE( 1, "rspeaker", 1.00 ) MCFG_PCE_CD_ADD("pce_cd") @@ -369,9 +361,14 @@ MACHINE_CONFIG_END MACHINE_CONFIG_START(pce_state::sgx) /* basic machine hardware */ - MCFG_DEVICE_ADD("maincpu", H6280, MAIN_CLOCK/3) - MCFG_DEVICE_PROGRAM_MAP(sgx_mem) - MCFG_DEVICE_IO_MAP(sgx_io) + H6280(config, m_maincpu, MAIN_CLOCK/3); + m_maincpu->set_addrmap(AS_PROGRAM, &pce_state::sgx_mem); + m_maincpu->set_addrmap(AS_IO, &pce_state::sgx_io); + m_maincpu->port_in_cb().set(FUNC(pce_state::mess_pce_joystick_r)); + m_maincpu->port_out_cb().set(FUNC(pce_state::mess_pce_joystick_w)); + m_maincpu->add_route(0, "lspeaker", 1.00); + m_maincpu->add_route(1, "rspeaker", 1.00); + MCFG_QUANTUM_TIME(attotime::from_hz(60)) MCFG_MACHINE_START_OVERRIDE(pce_state, pce ) @@ -410,10 +407,6 @@ MACHINE_CONFIG_START(pce_state::sgx) SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); - MCFG_DEVICE_ADD(C6280_TAG, C6280, MAIN_CLOCK/6) - MCFG_C6280_CPU("maincpu") - MCFG_SOUND_ROUTE(0, "lspeaker", 1.00) - MCFG_SOUND_ROUTE(1, "rspeaker", 1.00) MCFG_PCE_CARTRIDGE_ADD("cartslot", pce_cart, nullptr) MCFG_SOFTWARE_LIST_ADD("cart_list","sgx") diff --git a/src/mame/drivers/pcipc.cpp b/src/mame/drivers/pcipc.cpp index 63c972612b9..165b589312f 100644 --- a/src/mame/drivers/pcipc.cpp +++ b/src/mame/drivers/pcipc.cpp @@ -481,6 +481,7 @@ void pcipc_state::superio_config(device_t *device) MCFG_FDC37C93X_GP20_RESET_CB(INPUTLINE(":maincpu", INPUT_LINE_RESET)) MCFG_FDC37C93X_GP25_GATEA20_CB(INPUTLINE(":maincpu", INPUT_LINE_A20)) MCFG_FDC37C93X_IRQ1_CB(WRITELINE(":pci:07.0:pic8259_master", pic8259_device, ir1_w)) + MCFG_FDC37C93X_IRQ8_CB(WRITELINE(":pci:07.0:pic8259_slave", pic8259_device, ir0_w)) } MACHINE_CONFIG_START(pcipc_state::pcipc) diff --git a/src/mame/drivers/pet.cpp b/src/mame/drivers/pet.cpp index e0af100d5d2..d18e656bf24 100644 --- a/src/mame/drivers/pet.cpp +++ b/src/mame/drivers/pet.cpp @@ -193,6 +193,7 @@ public: m_pia1(*this, M6520_1_TAG), m_pia2(*this, M6520_2_TAG), m_crtc(*this, MC6845_TAG), + m_screen(*this, SCREEN_TAG), m_ieee(*this, IEEE488_TAG), m_palette(*this, "palette"), m_cassette(*this, PET_DATASSETTE_PORT_TAG), @@ -209,6 +210,8 @@ public: m_video_ram(*this, "video_ram"), m_row(*this, "ROW%u", 0), m_lock(*this, "LOCK"), + m_sync_timer(nullptr), + m_sync_period(attotime::zero), m_key(0), m_sync(0), m_graphic(0), @@ -222,12 +225,13 @@ public: m_user_diag(1) { } + void base_pet_devices(machine_config &config, const char *default_drive); void _4k(machine_config &config); void _8k(machine_config &config); void _16k(machine_config &config); void _32k(machine_config &config); void pet(machine_config &config); - void pet2001n(machine_config &config); + void pet2001n(machine_config &config, bool with_b000 = true); void pet2001n8(machine_config &config); void cbm3032(machine_config &config); void pet20018(machine_config &config); @@ -267,7 +271,7 @@ public: MC6845_BEGIN_UPDATE( pet_begin_update ); MC6845_UPDATE_ROW( pet40_update_row ); - TIMER_DEVICE_CALLBACK_MEMBER( sync_tick ); + TIMER_CALLBACK_MEMBER( sync_tick ); DECLARE_QUICKLOAD_LOAD_MEMBER( cbm_pet ); @@ -276,12 +280,15 @@ public: DECLARE_MACHINE_START( pet40 ); DECLARE_MACHINE_RESET( pet40 ); + void pet2001_mem(address_map &map); + protected: required_device<m6502_device> m_maincpu; required_device<via6522_device> m_via; required_device<pia6821_device> m_pia1; required_device<pia6821_device> m_pia2; optional_device<mc6845_device> m_crtc; + required_device<screen_device> m_screen; required_device<ieee488_device> m_ieee; required_device<palette_device> m_palette; required_device<pet_datassette_port_device> m_cassette; @@ -299,6 +306,9 @@ protected: required_ioport_array<10> m_row; required_ioport m_lock; + emu_timer *m_sync_timer; + attotime m_sync_period; + DECLARE_MACHINE_START( pet ); DECLARE_MACHINE_START( pet2001 ); DECLARE_MACHINE_RESET( pet ); @@ -350,7 +360,6 @@ protected: int m_pia2b_irq; int m_exp_irq; int m_user_diag; - void pet2001_mem(address_map &map); }; @@ -361,7 +370,7 @@ public: pet_state(mconfig, type, tag) { } - void pet2001b(machine_config &config); + void pet2001b(machine_config &config, bool with_b000 = true); void pet2001b32(machine_config &config); void pet4000(machine_config &config); void pet4000b(machine_config &config); @@ -594,7 +603,7 @@ READ8_MEMBER( pet_state::read ) } if (BIT(offset, 6)) { - data &= m_via->read(space, offset & 0x0f); + data &= m_via->read(offset & 0x0f); } if (m_crtc && BIT(offset, 7) && BIT(offset, 0)) { @@ -651,7 +660,7 @@ WRITE8_MEMBER( pet_state::write ) } if (BIT(offset, 6)) { - m_via->write(space, offset & 0x0f, data); + m_via->write(offset & 0x0f, data); } if (m_crtc && BIT(offset, 7)) { @@ -812,7 +821,7 @@ READ8_MEMBER( cbm8296_state::read ) } if (BIT(offset, 6)) { - data &= m_via->read(space, offset & 0x0f); + data &= m_via->read(offset & 0x0f); } if (BIT(offset, 7) && BIT(offset, 0)) { @@ -867,7 +876,7 @@ WRITE8_MEMBER( cbm8296_state::write ) } if (BIT(offset, 6)) { - m_via->write(space, offset & 0x0f, data); + m_via->write(offset & 0x0f, data); } if (BIT(offset, 7)) { @@ -893,20 +902,12 @@ WRITE8_MEMBER( cbm8296_state::write ) // ADDRESS MAPS //************************************************************************** -//------------------------------------------------- -// ADDRESS_MAP( pet2001_mem ) -//------------------------------------------------- - void pet_state::pet2001_mem(address_map &map) { map(0x0000, 0xffff).rw(FUNC(pet_state::read), FUNC(pet_state::write)); } -//------------------------------------------------- -// ADDRESS_MAP( cbm8296_mem ) -//------------------------------------------------- - void cbm8296_state::cbm8296_mem(address_map &map) { map(0x0000, 0xffff).rw(FUNC(cbm8296_state::read), FUNC(cbm8296_state::write)); @@ -918,10 +919,6 @@ void cbm8296_state::cbm8296_mem(address_map &map) // INPUT PORTS //************************************************************************** -//------------------------------------------------- -// INPUT_PORTS( pet ) -//------------------------------------------------- - static INPUT_PORTS_START( pet ) PORT_START( "ROW0" ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Crsr Right Left") PORT_CODE(KEYCODE_PGDN) PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) PORT_CHAR(UCHAR_MAMEKEY(LEFT)) @@ -1029,10 +1026,6 @@ static INPUT_PORTS_START( pet ) INPUT_PORTS_END -//------------------------------------------------- -// INPUT_PORTS( petb ) -//------------------------------------------------- - INPUT_PORTS_START( petb ) PORT_START( "ROW0" ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) @@ -1141,28 +1134,16 @@ INPUT_PORTS_START( petb ) INPUT_PORTS_END -//------------------------------------------------- -// INPUT_PORTS( petb_de ) -//------------------------------------------------- - INPUT_PORTS_START( petb_de ) PORT_INCLUDE( petb ) INPUT_PORTS_END -//------------------------------------------------- -// INPUT_PORTS( petb_fr ) -//------------------------------------------------- - INPUT_PORTS_START( petb_fr ) PORT_INCLUDE( petb ) INPUT_PORTS_END -//------------------------------------------------- -// INPUT_PORTS( petb_se ) -//------------------------------------------------- - INPUT_PORTS_START( petb_se ) PORT_INCLUDE( petb ) INPUT_PORTS_END @@ -1414,11 +1395,7 @@ WRITE_LINE_MEMBER( pet_state::user_diag_w ) // VIDEO //************************************************************************** -//------------------------------------------------- -// TIMER_DEVICE_CALLBACK( sync_tick ) -//------------------------------------------------- - -TIMER_DEVICE_CALLBACK_MEMBER( pet_state::sync_tick ) +TIMER_CALLBACK_MEMBER( pet_state::sync_tick ) { m_sync = !m_sync; @@ -1448,8 +1425,8 @@ uint32_t pet_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, c for (int x = 0; x < 8; x++, data <<= 1) { - int color = (BIT(data, 7) ^ BIT(lsd, 7)) && m_blanktv; - bitmap.pix32(y, (sx * 8) + x) = pen[color]; + int color = (BIT(data, 7) ^ BIT(lsd, 7)) && m_blanktv; + bitmap.pix32(y, (sx * 8) + x) = pen[color]; } } } @@ -1593,10 +1570,6 @@ MC6845_UPDATE_ROW( pet80_state::cbm8296_update_row ) } -//------------------------------------------------- -// SLOT_INTERFACE( cbm8296d_ieee488_devices ) -//------------------------------------------------- - void cbm8296d_ieee488_devices(device_slot_interface &device) { device.option_add("c8250lp", C8250LP); @@ -1608,10 +1581,6 @@ void cbm8296d_ieee488_devices(device_slot_interface &device) // MACHINE INITIALIZATION //************************************************************************** -//------------------------------------------------- -// MACHINE_START( pet ) -//------------------------------------------------- - MACHINE_START_MEMBER( pet_state, pet ) { // allocate memory @@ -1634,6 +1603,9 @@ MACHINE_START_MEMBER( pet_state, pet ) if (!(offset % 64)) data ^= 0xff; } + if (!m_sync_timer) + m_sync_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(pet_state::sync_tick), this)); + // state saving save_item(NAME(m_key)); save_item(NAME(m_sync)); @@ -1649,10 +1621,6 @@ MACHINE_START_MEMBER( pet_state, pet ) } -//------------------------------------------------- -// MACHINE_START( pet2001 ) -//------------------------------------------------- - MACHINE_START_MEMBER( pet_state, pet2001 ) { m_video_ram_size = 0x400; @@ -1672,13 +1640,12 @@ MACHINE_RESET_MEMBER( pet_state, pet ) m_exp->reset(); m_ieee->host_ren_w(0); + + if (m_sync_period != attotime::zero) + m_sync_timer->adjust(machine().time() + m_sync_period, 0, m_sync_period); } -//------------------------------------------------- -// MACHINE_START( pet40 ) -//------------------------------------------------- - MACHINE_START_MEMBER( pet_state, pet40 ) { m_video_ram_size = 0x400; @@ -1695,10 +1662,6 @@ MACHINE_RESET_MEMBER( pet_state, pet40 ) } -//------------------------------------------------- -// MACHINE_START( pet80 ) -//------------------------------------------------- - MACHINE_START_MEMBER( pet80_state, pet80 ) { m_video_ram_size = 0x800; @@ -1715,10 +1678,6 @@ MACHINE_RESET_MEMBER( pet80_state, pet80 ) } -//------------------------------------------------- -// MACHINE_START( cbm8296 ) -//------------------------------------------------- - MACHINE_START_MEMBER( cbm8296_state, cbm8296 ) { MACHINE_START_CALL_MEMBER(pet80); @@ -1743,684 +1702,466 @@ MACHINE_RESET_MEMBER( cbm8296_state, cbm8296 ) // MACHINE DRIVERS //************************************************************************** -//------------------------------------------------- -// MACHINE_CONFIG( 4k ) -//------------------------------------------------- - -MACHINE_CONFIG_START(pet_state::_4k) - MCFG_RAM_ADD(RAM_TAG) - MCFG_RAM_DEFAULT_SIZE("4K") - MCFG_RAM_EXTRA_OPTIONS("8K,16K,32K") -MACHINE_CONFIG_END - - -//------------------------------------------------- -// MACHINE_CONFIG( 8k ) -//------------------------------------------------- - -MACHINE_CONFIG_START(pet_state::_8k) - MCFG_RAM_ADD(RAM_TAG) - MCFG_RAM_DEFAULT_SIZE("8K") - MCFG_RAM_EXTRA_OPTIONS("16K,32K") -MACHINE_CONFIG_END - - -//------------------------------------------------- -// MACHINE_CONFIG( 16k ) -//------------------------------------------------- - -MACHINE_CONFIG_START(pet_state::_16k) - MCFG_RAM_ADD(RAM_TAG) - MCFG_RAM_DEFAULT_SIZE("16K") - MCFG_RAM_EXTRA_OPTIONS("32K") -MACHINE_CONFIG_END +void pet_state::_4k(machine_config &config) +{ + RAM(config, m_ram); + m_ram->set_default_size("4K"); + m_ram->set_extra_options("8K,16K,32K"); +} +void pet_state::_8k(machine_config &config) +{ + RAM(config, m_ram); + m_ram->set_default_size("8K"); + m_ram->set_extra_options("16K,32K"); +} -//------------------------------------------------- -// MACHINE_CONFIG( 32k ) -//------------------------------------------------- +void pet_state::_16k(machine_config &config) +{ + RAM(config, m_ram); + m_ram->set_default_size("16K"); + m_ram->set_extra_options("32K"); +} -MACHINE_CONFIG_START(pet_state::_32k) - MCFG_RAM_ADD(RAM_TAG) - MCFG_RAM_DEFAULT_SIZE("32K") -MACHINE_CONFIG_END +void pet_state::_32k(machine_config &config) +{ + RAM(config, m_ram); + m_ram->set_default_size("32K"); +} +void pet_state::base_pet_devices(machine_config &config, const char *default_drive) +{ + PALETTE(config, m_palette, 2); + m_palette->set_init("palette", FUNC(palette_device::palette_init_monochrome)); + + VIA6522(config, m_via, XTAL(16'000'000)/16); + m_via->readpb_handler().set(FUNC(pet_state::via_pb_r)); + m_via->writepa_handler().set(FUNC(pet_state::via_pa_w)); + m_via->writepb_handler().set(FUNC(pet_state::via_pb_w)); + m_via->ca2_handler().set(FUNC(pet_state::via_ca2_w)); + m_via->cb2_handler().set(FUNC(pet_state::via_cb2_w)); + m_via->irq_handler().set(FUNC(pet_state::via_irq_w)); + + PIA6821(config, m_pia1, 0); + m_pia1->readpa_handler().set(FUNC(pet_state::pia1_pa_r)); + m_pia1->readpb_handler().set(FUNC(pet_state::pia1_pb_r)); + m_pia1->readca1_handler().set(PET_DATASSETTE_PORT_TAG, FUNC(pet_datassette_port_device::read)); + m_pia1->writepa_handler().set(FUNC(pet_state::pia1_pa_w)); + m_pia1->ca2_handler().set(FUNC(pet_state::pia1_ca2_w)); + m_pia1->cb2_handler().set(PET_DATASSETTE_PORT_TAG, FUNC(pet_datassette_port_device::motor_w)); + m_pia1->irqa_handler().set(FUNC(pet_state::pia1_irqa_w)); + m_pia1->irqb_handler().set(FUNC(pet_state::pia1_irqb_w)); + + PIA6821(config, m_pia2, 0); + m_pia2->readpa_handler().set(IEEE488_TAG, FUNC(ieee488_device::dio_r)); + m_pia2->writepb_handler().set(IEEE488_TAG, FUNC(ieee488_device::host_dio_w)); + m_pia2->ca2_handler().set(IEEE488_TAG, FUNC(ieee488_device::host_ndac_w)); + m_pia2->cb2_handler().set(IEEE488_TAG, FUNC(ieee488_device::host_dav_w)); + m_pia2->irqa_handler().set(FUNC(pet_state::pia2_irqa_w)); + m_pia2->irqb_handler().set(FUNC(pet_state::pia2_irqb_w)); + + ieee488_slot_device::add_cbm_defaults(config, default_drive); + IEEE488(config, m_ieee, 0); + m_ieee->srq_callback().set(m_pia2, FUNC(pia6821_device::cb1_w)); + m_ieee->atn_callback().set(m_pia2, FUNC(pia6821_device::ca1_w)); + + PET_DATASSETTE_PORT(config, PET_DATASSETTE_PORT_TAG, cbm_datassette_devices, "c2n").read_handler().set(M6520_1_TAG, FUNC(pia6821_device::ca1_w)); + PET_DATASSETTE_PORT(config, PET_DATASSETTE_PORT2_TAG, cbm_datassette_devices, nullptr).read_handler().set(M6522_TAG, FUNC(via6522_device::write_cb1)); + + PET_EXPANSION_SLOT(config, m_exp, XTAL(16'000'000)/16, pet_expansion_cards, nullptr); + m_exp->dma_read_callback().set(FUNC(pet_state::read)); + m_exp->dma_write_callback().set(FUNC(pet_state::write)); + + PET_USER_PORT(config, m_user, pet_user_port_cards, nullptr); + m_user->pb_handler().set(m_via, FUNC(via6522_device::write_ca1)); + m_user->pc_handler().set(m_via, FUNC(via6522_device::write_pa0)); + m_user->pd_handler().set(m_via, FUNC(via6522_device::write_pa1)); + m_user->pe_handler().set(m_via, FUNC(via6522_device::write_pa2)); + m_user->pf_handler().set(m_via, FUNC(via6522_device::write_pa3)); + m_user->ph_handler().set(m_via, FUNC(via6522_device::write_pa4)); + m_user->pj_handler().set(m_via, FUNC(via6522_device::write_pa5)); + m_user->pk_handler().set(m_via, FUNC(via6522_device::write_pa6)); + m_user->pl_handler().set(m_via, FUNC(via6522_device::write_pa7)); + m_user->pm_handler().set(m_via, FUNC(via6522_device::write_cb2)); + + quickload_image_device &quickload(QUICKLOAD(config, "quickload", 0)); + quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(pet_state, cbm_pet), this), "p00,prg", CBM_QUICKLOAD_DELAY_SECONDS); + quickload.set_interface("cbm_quik"); + + SOFTWARE_LIST(config, "cass_list").set_type("pet_cass", SOFTWARE_LIST_ORIGINAL_SYSTEM); + SOFTWARE_LIST(config, "flop_list").set_type("pet_flop", SOFTWARE_LIST_ORIGINAL_SYSTEM); + SOFTWARE_LIST(config, "hdd_list").set_type("pet_hdd", SOFTWARE_LIST_ORIGINAL_SYSTEM); + SOFTWARE_LIST(config, "quik_list").set_type("pet_quik", SOFTWARE_LIST_ORIGINAL_SYSTEM); +} -//------------------------------------------------- -// MACHINE_CONFIG( pet ) -//------------------------------------------------- +void pet_state::pet(machine_config &config) +{ + base_pet_devices(config, "c4040"); -MACHINE_CONFIG_START(pet_state::pet) MCFG_MACHINE_START_OVERRIDE(pet_state, pet2001) MCFG_MACHINE_RESET_OVERRIDE(pet_state, pet) // basic machine hardware - MCFG_DEVICE_ADD(M6502_TAG, M6502, XTAL(8'000'000)/8) - MCFG_DEVICE_PROGRAM_MAP(pet2001_mem) - MCFG_M6502_DISABLE_CACHE() // address decoding is 100% dynamic, no RAM/ROM banks + M6502(config, m_maincpu, XTAL(8'000'000)/8); + m_maincpu->set_addrmap(AS_PROGRAM, &pet_state::pet2001_mem); + m_maincpu->disable_cache(); // address decoding is 100% dynamic, no RAM/ROM banks // video hardware - MCFG_SCREEN_ADD_MONOCHROME(SCREEN_TAG, RASTER, rgb_t::green()) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) - MCFG_SCREEN_SIZE(320, 200) - MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 200-1) - MCFG_SCREEN_UPDATE_DRIVER(pet_state, screen_update) - MCFG_TIMER_DRIVER_ADD_PERIODIC("sync_timer", pet_state, sync_tick, attotime::from_hz(120)) - - MCFG_PALETTE_ADD_MONOCHROME("palette") - - // devices - MCFG_DEVICE_ADD(M6522_TAG, VIA6522, XTAL(8'000'000)/8) - MCFG_VIA6522_READPB_HANDLER(READ8(*this, pet_state, via_pb_r)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, pet_state, via_pa_w)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, pet_state, via_pb_w)) - MCFG_VIA6522_CA2_HANDLER(WRITELINE(*this, pet_state, via_ca2_w)) - MCFG_VIA6522_CB2_HANDLER(WRITELINE(*this, pet_state, via_cb2_w)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, pet_state, via_irq_w)) - - MCFG_DEVICE_ADD(M6520_1_TAG, PIA6821, 0) - MCFG_PIA_READPA_HANDLER(READ8(*this, pet_state, pia1_pa_r)) - MCFG_PIA_READPB_HANDLER(READ8(*this, pet_state, pia1_pb_r)) - MCFG_PIA_READCA1_HANDLER(READLINE(PET_DATASSETTE_PORT_TAG, pet_datassette_port_device, read)) - MCFG_PIA_WRITEPA_HANDLER(WRITE8(*this, pet_state, pia1_pa_w)) - MCFG_PIA_CA2_HANDLER(WRITELINE(*this, pet_state, pia1_ca2_w)) - MCFG_PIA_CB2_HANDLER(WRITELINE(PET_DATASSETTE_PORT_TAG, pet_datassette_port_device, motor_w)) - MCFG_PIA_IRQA_HANDLER(WRITELINE(*this, pet_state, pia1_irqa_w)) - MCFG_PIA_IRQB_HANDLER(WRITELINE(*this, pet_state, pia1_irqb_w)) - - MCFG_DEVICE_ADD(M6520_2_TAG, PIA6821, 0) - MCFG_PIA_READPA_HANDLER(READ8(IEEE488_TAG, ieee488_device, dio_r)) - MCFG_PIA_WRITEPB_HANDLER(WRITE8(IEEE488_TAG, ieee488_device, host_dio_w)) - MCFG_PIA_CA2_HANDLER(WRITELINE(IEEE488_TAG, ieee488_device, host_ndac_w)) - MCFG_PIA_CB2_HANDLER(WRITELINE(IEEE488_TAG, ieee488_device, host_dav_w)) - MCFG_PIA_IRQA_HANDLER(WRITELINE(*this, pet_state, pia2_irqa_w)) - MCFG_PIA_IRQB_HANDLER(WRITELINE(*this, pet_state, pia2_irqb_w)) - - MCFG_CBM_IEEE488_ADD("c4040") - MCFG_IEEE488_SRQ_CALLBACK(WRITELINE(M6520_2_TAG, pia6821_device, cb1_w)) - MCFG_IEEE488_ATN_CALLBACK(WRITELINE(M6520_2_TAG, pia6821_device, ca1_w)) - MCFG_PET_DATASSETTE_PORT_ADD(PET_DATASSETTE_PORT_TAG, cbm_datassette_devices, "c2n", WRITELINE(M6520_1_TAG, pia6821_device, ca1_w)) - MCFG_PET_DATASSETTE_PORT_ADD(PET_DATASSETTE_PORT2_TAG, cbm_datassette_devices, nullptr, WRITELINE(M6522_TAG, via6522_device, write_cb1)) - MCFG_PET_EXPANSION_SLOT_ADD(PET_EXPANSION_SLOT_TAG, XTAL(8'000'000)/8, pet_expansion_cards, nullptr) - MCFG_PET_EXPANSION_SLOT_DMA_CALLBACKS(READ8(*this, pet_state, read), WRITE8(*this, pet_state, write)) - - MCFG_DEVICE_ADD(PET_USER_PORT_TAG, PET_USER_PORT, pet_user_port_cards, nullptr) - MCFG_PET_USER_PORT_5_HANDLER(WRITELINE(*this, pet_state, user_diag_w)) - MCFG_PET_USER_PORT_B_HANDLER(WRITELINE(M6522_TAG, via6522_device, write_ca1)) - MCFG_PET_USER_PORT_C_HANDLER(WRITELINE(M6522_TAG, via6522_device, write_pa0)) - MCFG_PET_USER_PORT_D_HANDLER(WRITELINE(M6522_TAG, via6522_device, write_pa1)) - MCFG_PET_USER_PORT_E_HANDLER(WRITELINE(M6522_TAG, via6522_device, write_pa2)) - MCFG_PET_USER_PORT_F_HANDLER(WRITELINE(M6522_TAG, via6522_device, write_pa3)) - MCFG_PET_USER_PORT_H_HANDLER(WRITELINE(M6522_TAG, via6522_device, write_pa4)) - MCFG_PET_USER_PORT_J_HANDLER(WRITELINE(M6522_TAG, via6522_device, write_pa5)) - MCFG_PET_USER_PORT_K_HANDLER(WRITELINE(M6522_TAG, via6522_device, write_pa6)) - MCFG_PET_USER_PORT_L_HANDLER(WRITELINE(M6522_TAG, via6522_device, write_pa7)) - MCFG_PET_USER_PORT_M_HANDLER(WRITELINE(M6522_TAG, via6522_device, write_cb2)) - - MCFG_QUICKLOAD_ADD("quickload", pet_state, cbm_pet, "p00,prg", CBM_QUICKLOAD_DELAY_SECONDS) - MCFG_QUICKLOAD_INTERFACE("cbm_quik") - - // software lists - MCFG_SOFTWARE_LIST_ADD("cass_list", "pet_cass") - MCFG_SOFTWARE_LIST_ADD("flop_list", "pet_flop") - MCFG_SOFTWARE_LIST_ADD("hdd_list", "pet_hdd") - MCFG_SOFTWARE_LIST_ADD("quik_list", "pet_quik") -MACHINE_CONFIG_END - - -//------------------------------------------------- -// MACHINE_CONFIG( pet2001 ) -//------------------------------------------------- + SCREEN(config, m_screen, SCREEN_TYPE_RASTER); + m_screen->set_color(rgb_t::green()); + m_screen->set_refresh_hz(60); + m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); + m_screen->set_size(320, 200); + m_screen->set_visarea(0, 320-1, 0, 200-1); + m_screen->set_screen_update(FUNC(pet_state::screen_update)); + m_sync_period = attotime::from_hz(120); + + m_user->p5_handler().set(FUNC(pet_state::user_diag_w)); +} -MACHINE_CONFIG_START(pet_state::pet2001) +void pet_state::pet2001(machine_config &config) +{ pet(config); _4k(config); -MACHINE_CONFIG_END - - -//------------------------------------------------- -// MACHINE_CONFIG( pet20018 ) -//------------------------------------------------- +} -MACHINE_CONFIG_START(pet_state::pet20018) +void pet_state::pet20018(machine_config &config) +{ pet(config); _8k(config); -MACHINE_CONFIG_END - - -//------------------------------------------------- -// MACHINE_CONFIG( pet2001n ) -//------------------------------------------------- +} -MACHINE_CONFIG_START(pet_state::pet2001n) +void pet_state::pet2001n(machine_config &config, bool with_b000) +{ pet(config); - MCFG_GENERIC_CARTSLOT_ADD("cart_9000", generic_linear_slot, "pet_9000_rom") - MCFG_GENERIC_EXTENSIONS("bin,rom") - MCFG_GENERIC_CARTSLOT_ADD("cart_a000", generic_linear_slot, "pet_a000_rom") - MCFG_GENERIC_EXTENSIONS("bin,rom") - - MCFG_GENERIC_CARTSLOT_ADD("cart_b000", generic_linear_slot, "pet_b000_rom") - MCFG_GENERIC_EXTENSIONS("bin,rom") - - MCFG_SOFTWARE_LIST_ADD("rom_list", "pet_rom") -MACHINE_CONFIG_END + GENERIC_CARTSLOT(config, "cart_9000", generic_linear_slot, "pet_9000_rom", "bin,rom"); + GENERIC_CARTSLOT(config, "cart_a000", generic_linear_slot, "pet_a000_rom", "bin,rom"); + if (with_b000) + GENERIC_CARTSLOT(config, "cart_b000", generic_linear_slot, "pet_b000_rom", "bin,rom"); + SOFTWARE_LIST(config, "rom_list").set_type("pet_rom", SOFTWARE_LIST_ORIGINAL_SYSTEM); +} -//------------------------------------------------- -// MACHINE_CONFIG( pet2001n8 ) -//------------------------------------------------- -MACHINE_CONFIG_START(pet_state::pet2001n8) +void pet_state::pet2001n8(machine_config &config) +{ pet2001n(config); _8k(config); -MACHINE_CONFIG_END - - -//------------------------------------------------- -// MACHINE_CONFIG( pet2001n16 ) -//------------------------------------------------- +} -MACHINE_CONFIG_START(pet_state::pet2001n16) +void pet_state::pet2001n16(machine_config &config) +{ pet2001n(config); _16k(config); -MACHINE_CONFIG_END - - -//------------------------------------------------- -// MACHINE_CONFIG( pet2001n32 ) -//------------------------------------------------- +} -MACHINE_CONFIG_START(pet_state::pet2001n32) +void pet_state::pet2001n32(machine_config &config) +{ pet2001n(config); _32k(config); -MACHINE_CONFIG_END - - -//------------------------------------------------- -// MACHINE_CONFIG( cbm3000 ) -//------------------------------------------------- +} -MACHINE_CONFIG_START(pet_state::cbm3000) - pet2001n(config); +void pet_state::cbm3000(machine_config &config) +{ + pet2001n(config, false); // video hardware - MCFG_SCREEN_MODIFY(SCREEN_TAG) - MCFG_SCREEN_REFRESH_RATE(50) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) - MCFG_SCREEN_SIZE(320, 200) - MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 200-1) - MCFG_SCREEN_UPDATE_DRIVER(pet_state, screen_update) - MCFG_DEVICE_REMOVE("sync_timer") - MCFG_TIMER_DRIVER_ADD_PERIODIC("sync_timer", pet_state, sync_tick, attotime::from_hz(100)) -MACHINE_CONFIG_END - - -//------------------------------------------------- -// MACHINE_CONFIG( cbm3008 ) -//------------------------------------------------- + m_screen->set_refresh_hz(50); + m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); + m_screen->set_size(320, 200); + m_screen->set_visarea(0, 320-1, 0, 200-1); + m_screen->set_screen_update(FUNC(pet_state::screen_update)); + m_sync_period = attotime::from_hz(100); +} -MACHINE_CONFIG_START(pet_state::cbm3008) +void pet_state::cbm3008(machine_config &config) +{ cbm3000(config); _8k(config); -MACHINE_CONFIG_END - - -//------------------------------------------------- -// MACHINE_CONFIG( cbm3016 ) -//------------------------------------------------- +} -MACHINE_CONFIG_START(pet_state::cbm3016) +void pet_state::cbm3016(machine_config &config) +{ cbm3000(config); _16k(config); -MACHINE_CONFIG_END - - -//------------------------------------------------- -// MACHINE_CONFIG( cbm3032 ) -//------------------------------------------------- +} -MACHINE_CONFIG_START(pet_state::cbm3032) +void pet_state::cbm3032(machine_config &config) +{ cbm3000(config); _32k(config); -MACHINE_CONFIG_END - - -//------------------------------------------------- -// MACHINE_CONFIG( pet2001b ) -//------------------------------------------------- - -MACHINE_CONFIG_START(pet2001b_state::pet2001b) - pet2001n(config); - MCFG_DEVICE_MODIFY(M6520_1_TAG) - MCFG_PIA_READPB_HANDLER(READ8(*this, pet2001b_state, pia1_pb_r)) -MACHINE_CONFIG_END - +} -//------------------------------------------------- -// MACHINE_CONFIG( pet2001b8 ) -//------------------------------------------------- +void pet2001b_state::pet2001b(machine_config &config, bool with_b000) +{ + pet2001n(config, with_b000); + m_pia1->readpb_handler().set(FUNC(pet2001b_state::pia1_pb_r)); +} -MACHINE_CONFIG_START(pet2001b_state::pet2001b8) +void pet2001b_state::pet2001b8(machine_config &config) +{ pet2001b(config); _8k(config); -MACHINE_CONFIG_END - - -//------------------------------------------------- -// MACHINE_CONFIG( pet2001b16 ) -//------------------------------------------------- +} -MACHINE_CONFIG_START(pet2001b_state::pet2001b16) +void pet2001b_state::pet2001b16(machine_config &config) +{ pet2001b(config); _16k(config); -MACHINE_CONFIG_END - - -//------------------------------------------------- -// MACHINE_CONFIG( pet2001b32 ) -//------------------------------------------------- +} -MACHINE_CONFIG_START(pet2001b_state::pet2001b32) +void pet2001b_state::pet2001b32(machine_config &config) +{ pet2001b(config); _32k(config); -MACHINE_CONFIG_END - - -//------------------------------------------------- -// MACHINE_CONFIG( cbm3032b ) -//------------------------------------------------- +} -MACHINE_CONFIG_START(pet2001b_state::cbm3032b) +void pet2001b_state::cbm3032b(machine_config &config) +{ pet2001b(config); // video hardware - MCFG_SCREEN_MODIFY(SCREEN_TAG) - MCFG_SCREEN_REFRESH_RATE(50) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) - MCFG_SCREEN_SIZE(320, 200) - MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 200-1) - MCFG_SCREEN_UPDATE_DRIVER(pet_state, screen_update) - MCFG_DEVICE_REMOVE("sync_timer") - MCFG_TIMER_DRIVER_ADD_PERIODIC("sync_timer", pet_state, sync_tick, attotime::from_hz(100)) + m_screen->set_refresh_hz(50); + m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); + m_screen->set_size(320, 200); + m_screen->set_visarea(0, 320-1, 0, 200-1); + m_screen->set_screen_update(FUNC(pet_state::screen_update)); + m_sync_period = attotime::from_hz(100); _32k(config); -MACHINE_CONFIG_END - - -//------------------------------------------------- -// MACHINE_CONFIG( pet4000 ) -//------------------------------------------------- - -MACHINE_CONFIG_START(pet2001b_state::pet4000 ) - pet2001n(config); - MCFG_DEVICE_REMOVE("cart_b000") -MACHINE_CONFIG_END - +} -//------------------------------------------------- -// MACHINE_CONFIG( pet4016 ) -//------------------------------------------------- +void pet2001b_state::pet4000(machine_config &config) +{ + pet2001n(config, false); +} -MACHINE_CONFIG_START(pet2001b_state::pet4016) +void pet2001b_state::pet4016(machine_config &config) +{ pet4000(config); // RAM not upgradeable - MCFG_RAM_ADD(RAM_TAG) - MCFG_RAM_DEFAULT_SIZE("16K") -MACHINE_CONFIG_END - - -//------------------------------------------------- -// MACHINE_CONFIG( pet4032 ) -//------------------------------------------------- + RAM(config, m_ram); + m_ram->set_default_size("16K"); +} -MACHINE_CONFIG_START(pet2001b_state::pet4032) +void pet2001b_state::pet4032(machine_config &config) +{ pet4000(config); _32k(config); -MACHINE_CONFIG_END - - -//------------------------------------------------- -// MACHINE_CONFIG( pet4032f ) -//------------------------------------------------- +} -MACHINE_CONFIG_START(pet2001b_state::pet4032f) +void pet2001b_state::pet4032f(machine_config &config) +{ pet4000(config); MCFG_MACHINE_START_OVERRIDE(pet_state, pet40) MCFG_MACHINE_RESET_OVERRIDE(pet_state, pet40) // video hardware - MCFG_SCREEN_MODIFY(SCREEN_TAG) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) - MCFG_SCREEN_SIZE(320, 250) - MCFG_SCREEN_VISIBLE_AREA(0, 320 - 1, 0, 250 - 1) - MCFG_SCREEN_UPDATE_DEVICE(MC6845_TAG, mc6845_device, screen_update) - MCFG_DEVICE_REMOVE("sync_timer") - - MCFG_MC6845_ADD(MC6845_TAG, MC6845, SCREEN_TAG, XTAL(16'000'000)/16) - MCFG_MC6845_SHOW_BORDER_AREA(true) - MCFG_MC6845_CHAR_WIDTH(8) - MCFG_MC6845_BEGIN_UPDATE_CB(pet_state, pet_begin_update) - MCFG_MC6845_UPDATE_ROW_CB(pet_state, pet40_update_row) - MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(M6520_1_TAG, pia6821_device, cb1_w)) + m_screen->set_refresh_hz(60); + m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); + m_screen->set_size(320, 250); + m_screen->set_visarea(0, 320 - 1, 0, 250 - 1); + m_screen->set_screen_update(MC6845_TAG, FUNC(mc6845_device::screen_update)); + m_sync_period = attotime::never; + + MC6845(config, m_crtc, XTAL(16'000'000)/16); + m_crtc->set_screen(SCREEN_TAG); + m_crtc->set_show_border_area(true); + m_crtc->set_char_width(8); + m_crtc->set_begin_update_callback(FUNC(pet_state::pet_begin_update), this); + m_crtc->set_update_row_callback(FUNC(pet_state::pet40_update_row), this); + m_crtc->out_vsync_callback().set(M6520_1_TAG, FUNC(pia6821_device::cb1_w)); // sound hardware SPEAKER(config, "mono").front_center(); - MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); _32k(config); -MACHINE_CONFIG_END - - -//------------------------------------------------- -// MACHINE_CONFIG( cbm4000 ) -//------------------------------------------------- +} -MACHINE_CONFIG_START(pet_state::cbm4000) - pet2001n(config); +void pet_state::cbm4000(machine_config &config) +{ + pet2001n(config, false); // video hardware - MCFG_SCREEN_MODIFY(SCREEN_TAG) - MCFG_SCREEN_REFRESH_RATE(50) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) - MCFG_SCREEN_SIZE(320, 200) - MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 200-1) - MCFG_SCREEN_UPDATE_DRIVER(pet_state, screen_update) - MCFG_DEVICE_REMOVE("sync_timer") - MCFG_TIMER_DRIVER_ADD_PERIODIC("sync_timer", pet_state, sync_tick, attotime::from_hz(100)) - - MCFG_DEVICE_REMOVE("cart_b000") -MACHINE_CONFIG_END - - -//------------------------------------------------- -// MACHINE_CONFIG( cbm4016 ) -//------------------------------------------------- + m_screen->set_refresh_hz(50); + m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); + m_screen->set_size(320, 200); + m_screen->set_visarea(0, 320-1, 0, 200-1); + m_screen->set_screen_update(FUNC(pet_state::screen_update)); + m_sync_period = attotime::from_hz(100); +} -MACHINE_CONFIG_START(pet_state::cbm4016) +void pet_state::cbm4016(machine_config &config) +{ cbm4000(config); // RAM not upgradeable - MCFG_RAM_ADD(RAM_TAG) - MCFG_RAM_DEFAULT_SIZE("16K") -MACHINE_CONFIG_END - - -//------------------------------------------------- -// MACHINE_CONFIG( cbm4032 ) -//------------------------------------------------- + RAM(config, m_ram); + m_ram->set_default_size("16K"); +} -MACHINE_CONFIG_START(pet_state::cbm4032) +void pet_state::cbm4032(machine_config &config) +{ cbm4000(config); _32k(config); -MACHINE_CONFIG_END - - -//------------------------------------------------- -// MACHINE_CONFIG( cbm4032f ) -//------------------------------------------------- +} -MACHINE_CONFIG_START(pet_state::cbm4032f) +void pet_state::cbm4032f(machine_config &config) +{ cbm4000(config); MCFG_MACHINE_START_OVERRIDE(pet_state, pet40) MCFG_MACHINE_RESET_OVERRIDE(pet_state, pet40) // video hardware - MCFG_SCREEN_MODIFY(SCREEN_TAG) - MCFG_SCREEN_REFRESH_RATE(50) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) - MCFG_SCREEN_SIZE(320, 250) - MCFG_SCREEN_VISIBLE_AREA(0, 320 - 1, 0, 250 - 1) - MCFG_SCREEN_UPDATE_DEVICE(MC6845_TAG, mc6845_device, screen_update) - MCFG_DEVICE_REMOVE("sync_timer") - - MCFG_MC6845_ADD(MC6845_TAG, MC6845, SCREEN_TAG, XTAL(16'000'000)/16) - MCFG_MC6845_SHOW_BORDER_AREA(true) - MCFG_MC6845_CHAR_WIDTH(8) - MCFG_MC6845_BEGIN_UPDATE_CB(pet_state, pet_begin_update) - MCFG_MC6845_UPDATE_ROW_CB(pet_state, pet40_update_row) - MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(M6520_1_TAG, pia6821_device, cb1_w)) + m_screen->set_refresh_hz(50); + m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); + m_screen->set_size(320, 250); + m_screen->set_visarea(0, 320 - 1, 0, 250 - 1); + m_screen->set_screen_update(MC6845_TAG, FUNC(mc6845_device::screen_update)); + m_sync_period = attotime::never; + + MC6845(config, m_crtc, XTAL(16'000'000)/16); + m_crtc->set_screen(SCREEN_TAG); + m_crtc->set_show_border_area(true); + m_crtc->set_char_width(8); + m_crtc->set_begin_update_callback(FUNC(pet_state::pet_begin_update), this); + m_crtc->set_update_row_callback(FUNC(pet_state::pet40_update_row), this); + m_crtc->out_vsync_callback().set(M6520_1_TAG, FUNC(pia6821_device::cb1_w)); // sound hardware SPEAKER(config, "mono").front_center(); - MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); _32k(config); -MACHINE_CONFIG_END - - -//------------------------------------------------- -// MACHINE_CONFIG( pet4000b ) -//------------------------------------------------- - -MACHINE_CONFIG_START(pet2001b_state::pet4000b) - pet2001b(config); - MCFG_DEVICE_REMOVE("cart_b000") -MACHINE_CONFIG_END - +} -//------------------------------------------------- -// MACHINE_CONFIG( pet4032b ) -//------------------------------------------------- +void pet2001b_state::pet4000b(machine_config &config) +{ + pet2001b(config, false); +} -MACHINE_CONFIG_START(pet2001b_state::pet4032b) +void pet2001b_state::pet4032b(machine_config &config) +{ pet4000b(config); _32k(config); -MACHINE_CONFIG_END - - -//------------------------------------------------- -// MACHINE_CONFIG( cbm4000b ) -//------------------------------------------------- +} -MACHINE_CONFIG_START(pet2001b_state::cbm4000b) - pet2001b(config); +void pet2001b_state::cbm4000b(machine_config &config) +{ + pet2001b(config, false); // video hardware - MCFG_SCREEN_MODIFY(SCREEN_TAG) - MCFG_SCREEN_REFRESH_RATE(50) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) - MCFG_SCREEN_SIZE(320, 200) - MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 200-1) - MCFG_SCREEN_UPDATE_DRIVER(pet_state, screen_update) - MCFG_DEVICE_REMOVE("sync_timer") - MCFG_TIMER_DRIVER_ADD_PERIODIC("sync_timer", pet_state, sync_tick, attotime::from_hz(100)) - - MCFG_DEVICE_REMOVE("cart_b000") -MACHINE_CONFIG_END - - -//------------------------------------------------- -// MACHINE_CONFIG( cbm4032b ) -//------------------------------------------------- + m_screen->set_refresh_hz(50); + m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); + m_screen->set_size(320, 200); + m_screen->set_visarea(0, 320-1, 0, 200-1); + m_screen->set_screen_update(FUNC(pet_state::screen_update)); + m_sync_period = attotime::from_hz(100); +} -MACHINE_CONFIG_START(pet2001b_state::cbm4032b) +void pet2001b_state::cbm4032b(machine_config &config) +{ cbm4000b(config); _32k(config); -MACHINE_CONFIG_END - +} -//------------------------------------------------- -// MACHINE_CONFIG( pet80 ) -//------------------------------------------------- +void pet80_state::pet80(machine_config &config) +{ + base_pet_devices(config, "c8050"); -MACHINE_CONFIG_START(pet80_state::pet80) MCFG_MACHINE_START_OVERRIDE(pet80_state, pet80) MCFG_MACHINE_RESET_OVERRIDE(pet80_state, pet80) // basic machine hardware - MCFG_DEVICE_ADD(M6502_TAG, M6502, XTAL(16'000'000)/16) - MCFG_DEVICE_PROGRAM_MAP(pet2001_mem) - MCFG_M6502_DISABLE_CACHE() // address decoding is 100% dynamic, no RAM/ROM banks + M6502(config, m_maincpu, XTAL(16'000'000)/16); + m_maincpu->set_addrmap(AS_PROGRAM, &pet_state::pet2001_mem); + m_maincpu->disable_cache(); // address decoding is 100% dynamic, no RAM/ROM banks // video hardware - MCFG_SCREEN_ADD_MONOCHROME(SCREEN_TAG, RASTER, rgb_t::green()) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) - MCFG_SCREEN_SIZE(640, 250) - MCFG_SCREEN_VISIBLE_AREA(0, 640 - 1, 0, 250 - 1) - MCFG_SCREEN_UPDATE_DEVICE(MC6845_TAG, mc6845_device, screen_update) - - MCFG_MC6845_ADD(MC6845_TAG, MC6845, SCREEN_TAG, XTAL(16'000'000)/16) - MCFG_MC6845_SHOW_BORDER_AREA(true) - MCFG_MC6845_CHAR_WIDTH(2*8) - MCFG_MC6845_BEGIN_UPDATE_CB(pet_state, pet_begin_update) - MCFG_MC6845_UPDATE_ROW_CB(pet80_state, pet80_update_row) - MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(M6520_1_TAG, pia6821_device, cb1_w)) - - MCFG_PALETTE_ADD_MONOCHROME("palette") + screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER)); + screen.set_color(rgb_t::green()); + screen.set_refresh_hz(60); + screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); + screen.set_size(640, 250); + screen.set_visarea(0, 640 - 1, 0, 250 - 1); + screen.set_screen_update(MC6845_TAG, FUNC(mc6845_device::screen_update)); + + MC6845(config, m_crtc, XTAL(16'000'000)/16); + m_crtc->set_screen(SCREEN_TAG); + m_crtc->set_show_border_area(true); + m_crtc->set_char_width(2*8); + m_crtc->set_begin_update_callback(FUNC(pet_state::pet_begin_update), this); + m_crtc->set_update_row_callback(FUNC(pet80_state::pet80_update_row), this); + m_crtc->out_vsync_callback().set(M6520_1_TAG, FUNC(pia6821_device::cb1_w)); // sound hardware SPEAKER(config, "mono").front_center(); - MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); // devices - MCFG_DEVICE_ADD(M6522_TAG, VIA6522, XTAL(16'000'000)/16) - MCFG_VIA6522_READPB_HANDLER(READ8(*this, pet_state, via_pb_r)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, pet_state, via_pa_w)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, pet_state, via_pb_w)) - MCFG_VIA6522_CA2_HANDLER(WRITELINE(*this, pet_state, via_ca2_w)) - MCFG_VIA6522_CB2_HANDLER(WRITELINE(*this, pet_state, via_cb2_w)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, pet_state, via_irq_w)) - - MCFG_DEVICE_ADD(M6520_1_TAG, PIA6821, 0) - MCFG_PIA_READPA_HANDLER(READ8(*this, pet_state, pia1_pa_r)) - MCFG_PIA_READPB_HANDLER(READ8(*this, pet_state, pia1_pb_r)) - MCFG_PIA_READCA1_HANDLER(READLINE(PET_DATASSETTE_PORT_TAG, pet_datassette_port_device, read)) - MCFG_PIA_WRITEPA_HANDLER(WRITE8(*this, pet_state, pia1_pa_w)) - MCFG_PIA_CA2_HANDLER(WRITELINE(*this, pet_state, pia1_ca2_w)) - MCFG_PIA_CB2_HANDLER(WRITELINE(PET_DATASSETTE_PORT_TAG, pet_datassette_port_device, motor_w)) - MCFG_PIA_IRQA_HANDLER(WRITELINE(*this, pet_state, pia1_irqa_w)) - MCFG_PIA_IRQB_HANDLER(WRITELINE(*this, pet_state, pia1_irqb_w)) - - MCFG_DEVICE_ADD(M6520_2_TAG, PIA6821, 0) - MCFG_PIA_READPA_HANDLER(READ8(IEEE488_TAG, ieee488_device, dio_r)) - MCFG_PIA_WRITEPB_HANDLER(WRITE8(IEEE488_TAG, ieee488_device, host_dio_w)) - MCFG_PIA_CA2_HANDLER(WRITELINE(IEEE488_TAG, ieee488_device, host_ndac_w)) - MCFG_PIA_CB2_HANDLER(WRITELINE(IEEE488_TAG, ieee488_device, host_dav_w)) - MCFG_PIA_IRQA_HANDLER(WRITELINE(*this, pet_state, pia2_irqa_w)) - MCFG_PIA_IRQB_HANDLER(WRITELINE(*this, pet_state, pia2_irqb_w)) - - MCFG_CBM_IEEE488_ADD("c8050") - MCFG_IEEE488_SRQ_CALLBACK(WRITELINE(M6520_2_TAG, pia6821_device, cb1_w)) - MCFG_IEEE488_ATN_CALLBACK(WRITELINE(M6520_2_TAG, pia6821_device, ca1_w)) - MCFG_PET_DATASSETTE_PORT_ADD(PET_DATASSETTE_PORT_TAG, cbm_datassette_devices, "c2n", WRITELINE(M6520_1_TAG, pia6821_device, ca1_w)) - MCFG_PET_DATASSETTE_PORT_ADD(PET_DATASSETTE_PORT2_TAG, cbm_datassette_devices, nullptr, WRITELINE(M6522_TAG, via6522_device, write_cb1)) - MCFG_PET_EXPANSION_SLOT_ADD(PET_EXPANSION_SLOT_TAG, XTAL(16'000'000)/16, pet_expansion_cards, nullptr) - MCFG_PET_EXPANSION_SLOT_DMA_CALLBACKS(READ8(*this, pet_state, read), WRITE8(*this, pet_state, write)) - - MCFG_DEVICE_ADD(PET_USER_PORT_TAG, PET_USER_PORT, pet_user_port_cards, nullptr) - MCFG_PET_USER_PORT_B_HANDLER(WRITELINE(M6522_TAG, via6522_device, write_ca1)) - MCFG_PET_USER_PORT_C_HANDLER(WRITELINE(M6522_TAG, via6522_device, write_pa0)) - MCFG_PET_USER_PORT_D_HANDLER(WRITELINE(M6522_TAG, via6522_device, write_pa1)) - MCFG_PET_USER_PORT_E_HANDLER(WRITELINE(M6522_TAG, via6522_device, write_pa2)) - MCFG_PET_USER_PORT_F_HANDLER(WRITELINE(M6522_TAG, via6522_device, write_pa3)) - MCFG_PET_USER_PORT_H_HANDLER(WRITELINE(M6522_TAG, via6522_device, write_pa4)) - MCFG_PET_USER_PORT_J_HANDLER(WRITELINE(M6522_TAG, via6522_device, write_pa5)) - MCFG_PET_USER_PORT_K_HANDLER(WRITELINE(M6522_TAG, via6522_device, write_pa6)) - MCFG_PET_USER_PORT_L_HANDLER(WRITELINE(M6522_TAG, via6522_device, write_pa7)) - MCFG_PET_USER_PORT_M_HANDLER(WRITELINE(M6522_TAG, via6522_device, write_cb2)) - - MCFG_QUICKLOAD_ADD("quickload", pet_state, cbm_pet, "p00,prg", CBM_QUICKLOAD_DELAY_SECONDS) - MCFG_QUICKLOAD_INTERFACE("cbm_quik") - - MCFG_GENERIC_CARTSLOT_ADD("cart_9000", generic_linear_slot, "pet_9000_rom") - MCFG_GENERIC_EXTENSIONS("bin,rom") - - MCFG_GENERIC_CARTSLOT_ADD("cart_a000", generic_linear_slot, "pet_a000_rom") - MCFG_GENERIC_EXTENSIONS("bin,rom") + GENERIC_CARTSLOT(config, "cart_9000", generic_linear_slot, "pet_9000_rom", "bin,rom"); + GENERIC_CARTSLOT(config, "cart_a000", generic_linear_slot, "pet_a000_rom", "bin,rom"); // software lists - MCFG_SOFTWARE_LIST_ADD("cass_list", "pet_cass") - MCFG_SOFTWARE_LIST_ADD("flop_list", "pet_flop") - MCFG_SOFTWARE_LIST_ADD("hdd_list", "pet_hdd") - MCFG_SOFTWARE_LIST_ADD("rom_list", "pet_rom") - MCFG_SOFTWARE_LIST_ADD("quik_list", "pet_quik") -MACHINE_CONFIG_END - - -//------------------------------------------------- -// MACHINE_CONFIG( pet8032 ) -//------------------------------------------------- + SOFTWARE_LIST(config, "rom_list").set_type("pet_rom", SOFTWARE_LIST_ORIGINAL_SYSTEM); +} -MACHINE_CONFIG_START(pet80_state::pet8032) +void pet80_state::pet8032(machine_config &config) +{ pet80(config); _32k(config); -MACHINE_CONFIG_END - - -//------------------------------------------------- -// MACHINE_CONFIG( superpet ) -//------------------------------------------------- +} -MACHINE_CONFIG_START(superpet_state::superpet) +void superpet_state::superpet(machine_config &config) +{ pet8032(config); - MCFG_DEVICE_REMOVE(PET_EXPANSION_SLOT_TAG) - MCFG_PET_EXPANSION_SLOT_ADD(PET_EXPANSION_SLOT_TAG, XTAL(16'000'000)/16, pet_expansion_cards, "superpet") - MCFG_PET_EXPANSION_SLOT_DMA_CALLBACKS(READ8(*this, pet_state, read), WRITE8(*this, pet_state, write)) - - MCFG_SOFTWARE_LIST_ADD("flop_list2", "superpet_flop") -MACHINE_CONFIG_END - - -//------------------------------------------------- -// MACHINE_CONFIG( cbm8096 ) -//------------------------------------------------- + m_exp->set_default_option("superpet"); + SOFTWARE_LIST(config, "flop_list2").set_type("superpet_flop", SOFTWARE_LIST_ORIGINAL_SYSTEM); +} -MACHINE_CONFIG_START(cbm8096_state::cbm8096) +void cbm8096_state::cbm8096(machine_config &config) +{ pet80(config); - MCFG_DEVICE_REMOVE(PET_EXPANSION_SLOT_TAG) - MCFG_PET_EXPANSION_SLOT_ADD(PET_EXPANSION_SLOT_TAG, XTAL(16'000'000)/16, pet_expansion_cards, "64k") - MCFG_PET_EXPANSION_SLOT_DMA_CALLBACKS(READ8(*this, pet_state, read), WRITE8(*this, pet_state, write)) + m_exp->set_default_option("64k"); - MCFG_RAM_ADD(RAM_TAG) - MCFG_RAM_DEFAULT_SIZE("96K") + RAM(config, m_ram); + m_ram->set_default_size("96K"); - MCFG_SOFTWARE_LIST_ADD("flop_list2", "cbm8096_flop") -MACHINE_CONFIG_END - - -//------------------------------------------------- -// MACHINE_CONFIG( cbm8296 ) -//------------------------------------------------- + SOFTWARE_LIST(config, "flop_list2").set_type("cbm8096_flop", SOFTWARE_LIST_ORIGINAL_SYSTEM); +} -MACHINE_CONFIG_START(cbm8296_state::cbm8296) +void cbm8296_state::cbm8296(machine_config &config) +{ pet80(config); MCFG_MACHINE_START_OVERRIDE(cbm8296_state, cbm8296) MCFG_MACHINE_RESET_OVERRIDE(cbm8296_state, cbm8296) - MCFG_DEVICE_MODIFY(M6502_TAG) - MCFG_DEVICE_PROGRAM_MAP(cbm8296_mem) - - MCFG_PLS100_ADD(PLA1_TAG) - MCFG_PLS100_ADD(PLA2_TAG) + m_maincpu->set_addrmap(AS_PROGRAM, &cbm8296_state::cbm8296_mem); - MCFG_DEVICE_REMOVE(MC6845_TAG) - MCFG_MC6845_ADD(MC6845_TAG, MC6845, SCREEN_TAG, XTAL(16'000'000)/16) - MCFG_MC6845_SHOW_BORDER_AREA(true) - MCFG_MC6845_CHAR_WIDTH(2*8) - MCFG_MC6845_UPDATE_ROW_CB(pet80_state, cbm8296_update_row) - MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(M6520_1_TAG, pia6821_device, cb1_w)) + PLS100(config, PLA1_TAG); + PLS100(config, PLA2_TAG); - MCFG_DEVICE_MODIFY("ieee8") - MCFG_SLOT_DEFAULT_OPTION("c8250") + m_crtc->set_clock(XTAL(16'000'000)/16); + m_crtc->set_show_border_area(true); + m_crtc->set_char_width(2*8); + m_crtc->set_update_row_callback(FUNC(pet80_state::cbm8296_update_row), this); + m_crtc->out_vsync_callback().set(M6520_1_TAG, FUNC(pia6821_device::cb1_w)); - MCFG_RAM_ADD(RAM_TAG) - MCFG_RAM_DEFAULT_SIZE("128K") + subdevice<ieee488_slot_device>("ieee8")->set_default_option("c8250"); - MCFG_SOFTWARE_LIST_ADD("flop_list2", "cbm8296_flop") -MACHINE_CONFIG_END + RAM(config, m_ram); + m_ram->set_default_size("128K"); + SOFTWARE_LIST(config, "flop_list2").set_type("cbm8296_flop", SOFTWARE_LIST_ORIGINAL_SYSTEM); +} -//------------------------------------------------- -// MACHINE_CONFIG( cbm8296d ) -//------------------------------------------------- - -MACHINE_CONFIG_START(cbm8296_state::cbm8296d) +void cbm8296_state::cbm8296d(machine_config &config) +{ cbm8296(config); - MCFG_DEVICE_MODIFY("ieee8") - MCFG_DEVICE_SLOT_INTERFACE(cbm8296d_ieee488_devices, "c8250lp", false) -MACHINE_CONFIG_END + ieee488_slot_device &ieee8(*subdevice<ieee488_slot_device>("ieee8")); + cbm8296d_ieee488_devices(ieee8); + ieee8.set_default_option("c8250lp"); +} diff --git a/src/mame/drivers/play_2.cpp b/src/mame/drivers/play_2.cpp index cf9f1f8a228..7b12c7e254b 100644 --- a/src/mame/drivers/play_2.cpp +++ b/src/mame/drivers/play_2.cpp @@ -38,6 +38,7 @@ Notes: #include "cpu/cosmac/cosmac.h" #include "machine/7474.h" #include "machine/clock.h" +#include "machine/ripple_counter.h" #include "sound/ay8910.h" #include "sound/cdp1863.h" #include "speaker.h" @@ -53,6 +54,7 @@ public: , m_maincpu(*this, "maincpu") , m_4013a(*this, "4013a") , m_4013b(*this, "4013b") + , m_4020(*this, "4020") , m_1863(*this, "1863") , m_aysnd1(*this, "aysnd1") , m_keyboard(*this, "X.%u", 0) @@ -75,8 +77,7 @@ private: DECLARE_READ_LINE_MEMBER(clear_r); DECLARE_READ_LINE_MEMBER(ef1_r); DECLARE_READ_LINE_MEMBER(ef4_r); - DECLARE_WRITE_LINE_MEMBER(q4013a_w); - DECLARE_WRITE_LINE_MEMBER(clock_w); + DECLARE_WRITE16_MEMBER(clockcnt_w); DECLARE_WRITE_LINE_MEMBER(clock2_w); // Zira DECLARE_WRITE8_MEMBER(sound_d_w); @@ -89,7 +90,6 @@ private: void play_2_map(address_map &map); void zira_sound_map(address_map &map); - uint16_t m_clockcnt; uint16_t m_resetcnt; uint8_t m_kbdrow; uint8_t m_segment[5]; @@ -102,6 +102,7 @@ private: required_device<cosmac_device> m_maincpu; required_device<ttl7474_device> m_4013a; required_device<ttl7474_device> m_4013b; + required_device<ripple_counter_device> m_4020; optional_device<cdp1863_device> m_1863; optional_device<ay8910_device> m_aysnd1; required_ioport_array<8> m_keyboard; @@ -209,7 +210,6 @@ INPUT_PORTS_END void play_2_state::machine_reset() { - m_clockcnt = 0; m_resetcnt = 0; m_4013b->d_w(1); m_kbdrow = 0; @@ -292,7 +292,7 @@ READ_LINE_MEMBER( play_2_state::clear_r ) READ_LINE_MEMBER( play_2_state::ef1_r ) { - return (!BIT(m_clockcnt, 10)); // inverted + return (!BIT(m_4020->count(), 10)); // inverted } READ_LINE_MEMBER( play_2_state::ef4_r ) @@ -300,17 +300,10 @@ READ_LINE_MEMBER( play_2_state::ef4_r ) return BIT(m_keyboard[7]->read(), 0); // inverted test button - doesn't seem to do anything } -WRITE_LINE_MEMBER( play_2_state::clock_w ) +WRITE16_MEMBER( play_2_state::clockcnt_w ) { - m_4013a->clock_w(state); - - if (!state) - { - m_clockcnt++; - // simulate 4020 chip - if ((m_clockcnt & 0x3ff) == 0) - m_4013b->preset_w(BIT(m_clockcnt, 10)); // Q10 output - } + if ((data & 0x3ff) == 0) + m_4013b->preset_w(BIT(data, 10)); // Q10 output } WRITE_LINE_MEMBER( play_2_state::clock2_w ) @@ -319,11 +312,6 @@ WRITE_LINE_MEMBER( play_2_state::clock2_w ) m_maincpu->ef3_w(state); // inverted } -WRITE_LINE_MEMBER( play_2_state::q4013a_w ) -{ - m_clockcnt = 0; -} - // *********** Zira Sound handlers ***************** (same as cidelsa.cpp) WRITE8_MEMBER( play_2_state::sound_d_w ) { @@ -374,8 +362,9 @@ MACHINE_CONFIG_START(play_2_state::play_2) m_maincpu->clear_cb().set(FUNC(play_2_state::clear_r)); m_maincpu->ef1_cb().set(FUNC(play_2_state::ef1_r)); m_maincpu->ef4_cb().set(FUNC(play_2_state::ef4_r)); - m_maincpu->q_cb().set("4013a", FUNC(ttl7474_device::clear_w)); - m_maincpu->tpb_cb().set(FUNC(play_2_state::clock_w)); + m_maincpu->q_cb().set(m_4013a, FUNC(ttl7474_device::clear_w)); + m_maincpu->tpb_cb().set(m_4013a, FUNC(ttl7474_device::clock_w)); + m_maincpu->tpb_cb().append(m_4020, FUNC(ripple_counter_device::clock_w)); MCFG_NVRAM_ADD_0FILL("nvram") @@ -388,12 +377,16 @@ MACHINE_CONFIG_START(play_2_state::play_2) // This is actually a 4013 chip (has 2 RS flipflops) TTL7474(config, m_4013a, 0); m_4013a->comp_output_cb().set(m_4013a, FUNC(ttl7474_device::d_w)); - m_4013a->output_cb().set(FUNC(play_2_state::q4013a_w)); + m_4013a->output_cb().set(m_4020, FUNC(ripple_counter_device::reset_w)); // TODO: also CKD for display TTL7474(config, m_4013b, 0); m_4013b->output_cb().set(m_maincpu, FUNC(cosmac_device::ef2_w)); m_4013b->comp_output_cb().set(m_maincpu, FUNC(cosmac_device::int_w)).invert(); // int is reversed in mame + RIPPLE_COUNTER(config, m_4020); + m_4020->set_stages(14); // only Q10 is actually used + m_4020->count_out_cb().set(FUNC(play_2_state::clockcnt_w)); + /* Sound */ genpin_audio(config); diff --git a/src/mame/drivers/pntnpuzl.cpp b/src/mame/drivers/pntnpuzl.cpp index 104a265b2b1..6b349b46325 100644 --- a/src/mame/drivers/pntnpuzl.cpp +++ b/src/mame/drivers/pntnpuzl.cpp @@ -226,7 +226,7 @@ WRITE16_MEMBER(pntnpuzl_state::pntnpuzl_280018_w) if (data & 0x2000) m_serial |= 0x400; - m_via->write(space, 0x18/2, data >> 8); + m_via->write(0x18/2, data >> 8); } READ16_MEMBER(pntnpuzl_state::pntnpuzl_280014_r) @@ -234,7 +234,7 @@ READ16_MEMBER(pntnpuzl_state::pntnpuzl_280014_r) static const int startup[3] = { 0x80, 0x0c, 0x00 }; int res; - (void)m_via->read(space, 0x14/2); + (void)m_via->read(0x14/2); if (m_serial_out == 0x11) { diff --git a/src/mame/drivers/policetr.cpp b/src/mame/drivers/policetr.cpp index 5d97a50ed9e..fcb336a38a2 100644 --- a/src/mame/drivers/policetr.cpp +++ b/src/mame/drivers/policetr.cpp @@ -100,27 +100,11 @@ PC5380-9651 5380-JY3306A 5380-N1045503A * *************************************/ -void policetr_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) +WRITE_LINE_MEMBER(policetr_state::vblank) { - switch (id) - { - case TIMER_IRQ5_GEN: - m_maincpu->set_input_line(R3000_IRQ5, ASSERT_LINE); - break; - default: - assert_always(false, "Unknown id in policetr_state::device_timer"); - } + m_maincpu->set_input_line(state ? R3000_IRQ4 : R3000_IRQ5, ASSERT_LINE); } - -INTERRUPT_GEN_MEMBER(policetr_state::irq4_gen) -{ - device.execute().set_input_line(R3000_IRQ4, ASSERT_LINE); - m_irq5_gen_timer->adjust(m_screen->time_until_pos(0)); -} - - - /************************************* * * Output ports @@ -129,34 +113,50 @@ INTERRUPT_GEN_MEMBER(policetr_state::irq4_gen) WRITE32_MEMBER(policetr_state::control_w) { - uint32_t old = m_control_data; - // bit $80000000 = BSMT access/ROM read - // bit $20000000 = toggled every 64 IRQ4's - // bit $10000000 = ???? + // bit $40000000 = N.C. (per schematic) + // bit $20000000 = LED (PCB, red) + // bit $10000000 = LED (PCB, green) // bit $00800000 = EEPROM data // bit $00400000 = EEPROM clock // bit $00200000 = EEPROM enable (on 1) + // bit $00200000 = Ticket Output (marked "omit for production" on I/O board schematic in Police Trainer manual) + // bit $00080000 = LED (coin 2) + // bit $00040000 = LED (coin 1) + // bit $00020000 = Coin lockout 2 (as noted on the schematic; not used by the actual game) + // bit $00010000 = Coin lockout 1 (as noted on the schematic; not used by the actual game) + const uint32_t old = m_control_data; COMBINE_DATA(&m_control_data); /* handle EEPROM I/O */ if (ACCESSING_BITS_16_23) { - m_eeprom->di_write((data & 0x00800000) >> 23); - m_eeprom->cs_write((data & 0x00200000) ? ASSERT_LINE : CLEAR_LINE); - m_eeprom->clk_write((data & 0x00400000) ? ASSERT_LINE : CLEAR_LINE); + machine().bookkeeping().coin_lockout_w(0, BIT(m_control_data, 16)); + machine().bookkeeping().coin_lockout_w(1, BIT(m_control_data, 17)); + m_leds[LED_COIN1] = BIT(m_control_data, 18); + m_leds[LED_COIN2] = BIT(m_control_data, 19); + + m_eeprom->di_write(BIT(data, 23)); + m_eeprom->cs_write(BIT(data, 21)); + m_eeprom->clk_write(BIT(data, 22)); } - /* toggling BSMT off then on causes a reset */ - if (!(old & 0x80000000) && (m_control_data & 0x80000000)) + if (ACCESSING_BITS_24_31) { - m_bsmt->reset(); + m_leds[LED_PCB_RED] = !BIT(m_control_data, 28); + m_leds[LED_PCB_GREEN] = !BIT(m_control_data, 29); + + /* toggling BSMT off then on causes a reset */ + if (!BIT(old, 31) && BIT(m_control_data, 31)) + { + m_bsmt->reset(); + } } /* log any unknown bits */ - if (data & 0x4f1fffff) - logerror("%08X: control_w = %08X & %08X\n", m_maincpu->pcbase(), data, mem_mask); + if (data & 0x0f1fffff) + logerror("%s: control_w = %08X & %08X\n", machine().describe_context(), data, mem_mask); } @@ -167,16 +167,16 @@ WRITE32_MEMBER(policetr_state::control_w) * *************************************/ -WRITE32_MEMBER(policetr_state::policetr_bsmt2000_reg_w) +WRITE32_MEMBER(policetr_state::bsmt2000_reg_w) { - if (m_control_data & 0x80000000) + if (BIT(m_control_data, 31)) m_bsmt->write_data(data); else COMBINE_DATA(&m_bsmt_data_offset); } -WRITE32_MEMBER(policetr_state::policetr_bsmt2000_data_w) +WRITE32_MEMBER(policetr_state::bsmt2000_data_w) { m_bsmt->write_reg(data); COMBINE_DATA(&m_bsmt_data_bank); @@ -189,9 +189,9 @@ CUSTOM_INPUT_MEMBER(policetr_state::bsmt_status_r) } -READ32_MEMBER(policetr_state::bsmt2000_data_r) +READ8_MEMBER(policetr_state::bsmt2000_data_r) { - return m_bsmt_region->base()[m_bsmt_data_bank * 0x10000 + m_bsmt_data_offset] << 8; + return m_bsmt_region[(m_bsmt_data_bank << 16) + m_bsmt_data_offset]; } @@ -235,43 +235,43 @@ WRITE32_MEMBER(policetr_state::speedup_w) * *************************************/ -void policetr_state::policetr_map(address_map &map) +void policetr_state::mem(address_map &map) { map(0x00000000, 0x0001ffff).ram().share(m_rambase); - map(0x00200000, 0x0020000f).w(FUNC(policetr_state::policetr_video_w)); - map(0x00400000, 0x00400003).r(FUNC(policetr_state::policetr_video_r)); + map(0x00200000, 0x0020000f).w(FUNC(policetr_state::video_w)); + map(0x00400000, 0x00400003).r(FUNC(policetr_state::video_r)); map(0x00500000, 0x00500003).nopw(); // copies ROM here at startup, plus checksum - map(0x00600000, 0x00600003).r(FUNC(policetr_state::bsmt2000_data_r)); - map(0x00700000, 0x00700003).w(FUNC(policetr_state::policetr_bsmt2000_reg_w)); - map(0x00800000, 0x00800003).w(FUNC(policetr_state::policetr_bsmt2000_data_w)); - map(0x00900000, 0x00900003).w(FUNC(policetr_state::policetr_palette_offset_w)); - map(0x00920000, 0x00920003).w(FUNC(policetr_state::policetr_palette_data_w)); + map(0x00600002, 0x00600002).r(FUNC(policetr_state::bsmt2000_data_r)); + map(0x00700000, 0x00700003).w(FUNC(policetr_state::bsmt2000_reg_w)); + map(0x00800000, 0x00800003).w(FUNC(policetr_state::bsmt2000_data_w)); + map(0x00900001, 0x00900001).w(FUNC(policetr_state::palette_offset_w)); + map(0x00920001, 0x00920001).w(FUNC(policetr_state::palette_data_w)); map(0x00a00000, 0x00a00003).w(FUNC(policetr_state::control_w)); map(0x00a00000, 0x00a00003).portr("IN0"); map(0x00a20000, 0x00a20003).portr("IN1"); map(0x00a40000, 0x00a40003).portr("DSW"); map(0x00e00000, 0x00e00003).nopw(); // watchdog??? - map(0x1fc00000, 0x1fc7ffff).rom().region("user1", 0); + map(0x1fc00000, 0x1fc7ffff).rom().region("maincpu", 0); } -void policetr_state::sshooter_map(address_map &map) +void sshooter_state::mem(address_map &map) { map(0x00000000, 0x0001ffff).ram().share(m_rambase); - map(0x00200000, 0x00200003).w(FUNC(policetr_state::policetr_bsmt2000_data_w)); - map(0x00300000, 0x00300003).w(FUNC(policetr_state::policetr_palette_offset_w)); - map(0x00320000, 0x00320003).w(FUNC(policetr_state::policetr_palette_data_w)); - map(0x00400000, 0x00400003).r(FUNC(policetr_state::policetr_video_r)); + map(0x00200000, 0x00200003).w(FUNC(sshooter_state::bsmt2000_data_w)); + map(0x00300001, 0x00300001).w(FUNC(sshooter_state::palette_offset_w)); + map(0x00320001, 0x00320001).w(FUNC(sshooter_state::palette_data_w)); + map(0x00400000, 0x00400003).r(FUNC(sshooter_state::video_r)); map(0x00500000, 0x00500003).nopw(); // copies ROM here at startup, plus checksum - map(0x00600000, 0x00600003).r(FUNC(policetr_state::bsmt2000_data_r)); - map(0x00700000, 0x00700003).w(FUNC(policetr_state::policetr_bsmt2000_reg_w)); - map(0x00800000, 0x0080000f).w(FUNC(policetr_state::policetr_video_w)); - map(0x00a00000, 0x00a00003).w(FUNC(policetr_state::control_w)); + map(0x00600002, 0x00600002).r(FUNC(sshooter_state::bsmt2000_data_r)); + map(0x00700000, 0x00700003).w(FUNC(sshooter_state::bsmt2000_reg_w)); + map(0x00800000, 0x0080000f).w(FUNC(sshooter_state::video_w)); + map(0x00a00000, 0x00a00003).w(FUNC(sshooter_state::control_w)); map(0x00a00000, 0x00a00003).portr("IN0"); map(0x00a20000, 0x00a20003).portr("IN1"); map(0x00a40000, 0x00a40003).portr("DSW"); map(0x00e00000, 0x00e00003).nopw(); // watchdog??? - map(0x1fc00000, 0x1fcfffff).rom().region("user1", 0); + map(0x1fc00000, 0x1fcfffff).rom().region("maincpu", 0); } @@ -284,40 +284,44 @@ void policetr_state::sshooter_map(address_map &map) static INPUT_PORTS_START( policetr ) PORT_START("IN0") - PORT_BIT( 0x00010000, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x00020000, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x00040000, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x00080000, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x00100000, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x00200000, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x00400000, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x00800000, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x01000000, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x02000000, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x04000000, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x08000000, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x10000000, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x20000000, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x40000000, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x80000000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x00010000, IP_ACTIVE_LOW, IPT_UNUSED ) /* /P2SPR1 (note 1) */ + PORT_BIT( 0x00020000, IP_ACTIVE_LOW, IPT_UNUSED ) /* /P2PUSH3 (note 1) */ + PORT_BIT( 0x00040000, IP_ACTIVE_LOW, IPT_UNUSED ) /* /P2PUSH2 (note 1) */ + PORT_BIT( 0x00080000, IP_ACTIVE_LOW, IPT_UNUSED ) /* /P2USH1 (note 1) */ + PORT_BIT( 0x00100000, IP_ACTIVE_LOW, IPT_UNUSED ) /* /P2RIGHT (note 1) */ + PORT_BIT( 0x00200000, IP_ACTIVE_LOW, IPT_UNUSED ) /* /P2LEFT (note 1) */ + PORT_BIT( 0x00400000, IP_ACTIVE_LOW, IPT_UNUSED ) /* /P2DOWN (note 1) */ + PORT_BIT( 0x00800000, IP_ACTIVE_LOW, IPT_UNUSED ) /* /P2UP (note 1) */ + PORT_BIT( 0x01000000, IP_ACTIVE_LOW, IPT_UNUSED ) /* /P1SPR1 (note 1) */ + PORT_BIT( 0x02000000, IP_ACTIVE_LOW, IPT_UNUSED ) /* /P1PUSH3 (note 1) */ + PORT_BIT( 0x04000000, IP_ACTIVE_LOW, IPT_UNUSED ) /* /P1PUSH2 (note 1) */ + PORT_BIT( 0x08000000, IP_ACTIVE_LOW, IPT_UNUSED ) /* /P1PUSH1 (note 1) */ + PORT_BIT( 0x10000000, IP_ACTIVE_LOW, IPT_UNUSED ) /* /P1RIGHT (note 1) */ + PORT_BIT( 0x20000000, IP_ACTIVE_LOW, IPT_UNUSED ) /* /P1LEFT (note 1) */ + PORT_BIT( 0x40000000, IP_ACTIVE_LOW, IPT_UNUSED ) /* /P1DOWN (note 1) */ + PORT_BIT( 0x80000000, IP_ACTIVE_LOW, IPT_UNUSED ) /* /P1UP (note 1) */ PORT_START("IN1") PORT_BIT( 0x00010000, IP_ACTIVE_LOW, IPT_START2 ) PORT_BIT( 0x00020000, IP_ACTIVE_LOW, IPT_START1 ) PORT_BIT( 0x00040000, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_BIT( 0x00080000, IP_ACTIVE_LOW, IPT_COIN1 ) - PORT_BIT( 0x00100000, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_SERVICE( 0x00200000, IP_ACTIVE_LOW ) /* Not actually a dipswitch */ - PORT_BIT( 0x00400000, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x00800000, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, policetr_state, bsmt_status_r, nullptr) - PORT_BIT( 0x01000000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) - PORT_BIT( 0x02000000, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x04000000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) - PORT_BIT( 0x08000000, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x10000000, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x20000000, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("eeprom", eeprom_serial_93cxx_device, do_read) /* EEPROM read */ - PORT_BIT( 0x40000000, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x80000000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x00100000, IP_ACTIVE_LOW, IPT_UNUSED ) /* /TILT (note 1) */ + PORT_BIT( 0x00200000, IP_ACTIVE_LOW, IPT_SERVICE1 ) + PORT_BIT( 0x00400000, IP_ACTIVE_LOW, IPT_UNUSED ) /* /SERVICE (note 1) */ + PORT_BIT( 0x00800000, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, policetr_state, bsmt_status_r, nullptr) + PORT_BIT( 0x01000000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) + PORT_BIT( 0x02000000, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* /XSW2 (note 2) */ + PORT_BIT( 0x04000000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) + PORT_BIT( 0x08000000, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* /XSW2 (note 2) */ + PORT_BIT( 0x10000000, IP_ACTIVE_LOW, IPT_UNUSED ) /* TKTSNS (note 3) */ + PORT_BIT( 0x20000000, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("eeprom", eeprom_serial_93cxx_device, do_read) /* EEPROM read */ + PORT_BIT( 0x40000000, IP_ACTIVE_LOW, IPT_UNUSED ) /* /VOLMDN (note 1) */ + PORT_BIT( 0x80000000, IP_ACTIVE_LOW, IPT_UNUSED ) /* /VOLMUP (note 1) */ + + /* Note 1: Input is unused but is shown in the service menu and noted as written on the I/O schematic in the Police Trainer manual. */ + /* Note 2: It is unknown if this input is used, but it is noted as written on the I/O schematic in the Police Trainer manual. */ + /* Note 3: Per the I/O schematic in the Police Trainer manual, the ticket dispenser connector is omitted for production. */ PORT_START("DSW") PORT_DIPUNUSED_DIPLOC( 0x00010000, 0x00010000, "SW1:1" ) @@ -382,24 +386,29 @@ static INPUT_PORTS_START( sshoot11 ) INPUT_PORTS_END -void policetr_state::machine_start() -{ - m_irq5_gen_timer = timer_alloc(TIMER_IRQ5_GEN); -} - /************************************* * * Machine driver * *************************************/ -MACHINE_CONFIG_START(policetr_state::policetr) +void policetr_state::machine_start() +{ + m_leds.resolve(); + save_item(NAME(m_control_data)); + save_item(NAME(m_bsmt_data_bank)); + save_item(NAME(m_bsmt_data_offset)); + save_item(NAME(m_last_cycles)); + save_item(NAME(m_loop_count)); +} + +void policetr_state::policetr(machine_config &config) +{ /* basic machine hardware */ - device = &R3041(config, m_maincpu, MASTER_CLOCK/2); + R3041(config, m_maincpu, MASTER_CLOCK/2); m_maincpu->set_endianness(ENDIANNESS_BIG); - m_maincpu->set_addrmap(AS_PROGRAM, &policetr_state::policetr_map); - MCFG_DEVICE_VBLANK_INT_DRIVER("screen", policetr_state, irq4_gen); + m_maincpu->set_addrmap(AS_PROGRAM, &policetr_state::mem); EEPROM_SERIAL_93C66_16BIT(config, m_eeprom); @@ -409,8 +418,8 @@ MACHINE_CONFIG_START(policetr_state::policetr) m_screen->set_refresh_hz(60); m_screen->set_size(400, 262); /* needs to be verified */ m_screen->set_visarea(0, 393, 0, 239); - m_screen->set_palette(m_palette); - m_screen->set_screen_update(FUNC(policetr_state::screen_update_policetr)); + m_screen->set_screen_update(FUNC(policetr_state::screen_update)); + m_screen->screen_vblank().set(FUNC(policetr_state::vblank)); PALETTE(config, m_palette, 256); @@ -421,13 +430,12 @@ MACHINE_CONFIG_START(policetr_state::policetr) BSMT2000(config, m_bsmt, MASTER_CLOCK/2); m_bsmt->add_route(0, *m_lspeaker, 1.0); m_bsmt->add_route(1, *m_rspeaker, 1.0); -MACHINE_CONFIG_END - +} -void policetr_state::sshooter(machine_config &config) +void sshooter_state::sshooter(machine_config &config) { policetr(config); - m_maincpu->set_addrmap(AS_PROGRAM, &policetr_state::sshooter_map); + m_maincpu->set_addrmap(AS_PROGRAM, &sshooter_state::mem); } @@ -439,13 +447,13 @@ void policetr_state::sshooter(machine_config &config) *************************************/ ROM_START( policetr ) /* Rev 0.3 PCB , with all chips dated 04/01/97 */ - ROM_REGION( 0x400000, "gfx1", ROMREGION_ERASE00 ) + ROM_REGION( 0x400000, "gfx", ROMREGION_ERASE00 ) ROM_LOAD16_BYTE( "pt-u121.bin", 0x000000, 0x100000, CRC(56b0b00a) SHA1(4034fe373a61f756f4813f0c20b1cf05e4338059) ) ROM_LOAD16_BYTE( "pt-u120.bin", 0x000001, 0x100000, CRC(ca664142) SHA1(2727ecb9287b4ed30088e017bb6b8763dfb75b2f) ) ROM_LOAD16_BYTE( "pt-u125.bin", 0x200000, 0x100000, CRC(e9ccf3a0) SHA1(b3fd8c094f76ace4cf403c3d0f6bd6c5d8db7d6a) ) ROM_LOAD16_BYTE( "pt-u124.bin", 0x200001, 0x100000, CRC(f4acf921) SHA1(5b244e9a51304318fa0c03eb7365b3c12627d19b) ) - ROM_REGION32_BE( 0x80000, "user1", 0 ) + ROM_REGION32_BE( 0x80000, "maincpu", 0 ) ROM_LOAD32_BYTE( "pt-u113.bin", 0x00000, 0x20000, CRC(7b34d366) SHA1(b86cfe155e0685992aebbcc7db705fdbadc42bf9) ) ROM_LOAD32_BYTE( "pt-u112.bin", 0x00001, 0x20000, CRC(57d059c8) SHA1(ed0c624fc0afbeb6616bba8a67ce5b18d7c119fc) ) ROM_LOAD32_BYTE( "pt-u111.bin", 0x00002, 0x20000, CRC(fb5ce933) SHA1(4a07ac3e2d86262061092f112cab89f8660dce3d) ) @@ -460,13 +468,13 @@ ROM_END ROM_START( policetr11 ) /* Rev 0.3 PCB with all chips dated 01/06/97 */ - ROM_REGION( 0x400000, "gfx1", ROMREGION_ERASE00 ) + ROM_REGION( 0x400000, "gfx", ROMREGION_ERASE00 ) ROM_LOAD16_BYTE( "pt-u121.bin", 0x000000, 0x100000, CRC(56b0b00a) SHA1(4034fe373a61f756f4813f0c20b1cf05e4338059) ) ROM_LOAD16_BYTE( "pt-u120.bin", 0x000001, 0x100000, CRC(ca664142) SHA1(2727ecb9287b4ed30088e017bb6b8763dfb75b2f) ) ROM_LOAD16_BYTE( "pt-u125.bin", 0x200000, 0x100000, CRC(e9ccf3a0) SHA1(b3fd8c094f76ace4cf403c3d0f6bd6c5d8db7d6a) ) ROM_LOAD16_BYTE( "pt-u124.bin", 0x200001, 0x100000, CRC(f4acf921) SHA1(5b244e9a51304318fa0c03eb7365b3c12627d19b) ) - ROM_REGION32_BE( 0x80000, "user1", 0 ) /* 2MB for R3000 code */ + ROM_REGION32_BE( 0x80000, "maincpu", 0 ) /* 2MB for R3000 code */ ROM_LOAD32_BYTE( "pt-u113.v11", 0x00000, 0x20000, CRC(3d62f6d6) SHA1(342ffa38a6972bbb03c89b4dd603c2cc60609d3d) ) ROM_LOAD32_BYTE( "pt-u112.v11", 0x00001, 0x20000, CRC(942b280b) SHA1(c342ba3255203ce28ff59479da00f26f0bd026e0) ) ROM_LOAD32_BYTE( "pt-u111.v11", 0x00002, 0x20000, CRC(da6c45a7) SHA1(471bd372d2ad5bcb29af19dae09f3cfab4b010fd) ) @@ -481,7 +489,7 @@ ROM_END ROM_START( policetr10 ) /* Rev 0.2 PCB with all chips dated 10/07/96 */ - ROM_REGION( 0x400000, "gfx1", ROMREGION_ERASE00 ) + ROM_REGION( 0x400000, "gfx", ROMREGION_ERASE00 ) /* Same data as the other sets, but split in 4 meg roms */ ROM_LOAD16_BYTE( "pt-u121.v10", 0x000000, 0x080000, CRC(9d31e805) SHA1(482f38e07ddb758e1fb444af7b56a0ef6ea945c8) ) ROM_LOAD16_BYTE( "pt-u120.v10", 0x000001, 0x080000, CRC(b03b9d46) SHA1(2bb8fcb1df09aa762b98adf2e1edd186203746c0) ) @@ -492,7 +500,7 @@ ROM_START( policetr10 ) /* Rev 0.2 PCB with all chips dated 10/07/96 */ ROM_LOAD16_BYTE( "pt-u127.v10", 0x300000, 0x080000, CRC(5031ea1e) SHA1(c1f9272f9874150d510f22c44c186fad0ed3a7e4) ) ROM_LOAD16_BYTE( "pt-u126.v10", 0x300001, 0x080000, CRC(33bf2653) SHA1(357da2da7df417109adbf600f3455c224f6c076f) ) - ROM_REGION32_BE( 0x80000, "user1", 0 ) /* 2MB for R3000 code */ + ROM_REGION32_BE( 0x80000, "maincpu", 0 ) /* 2MB for R3000 code */ ROM_LOAD32_BYTE( "pt-u113.v10", 0x00000, 0x20000, CRC(3e27a0ce) SHA1(0d010da68f950a10a74eddc57941e4c0e2144071) ) ROM_LOAD32_BYTE( "pt-u112.v10", 0x00001, 0x20000, CRC(fcbcf4ca) SHA1(374291600043cfbbd87260b12961ac6d68caeda0) ) ROM_LOAD32_BYTE( "pt-u111.v10", 0x00002, 0x20000, CRC(61f79667) SHA1(25298cd8706b5c59f7c9e0f8d44db0df73c23403) ) @@ -512,13 +520,13 @@ ROM_END ROM_START( policetr13a ) /* Rev 0.5B PCB , unknown program rom date. Actual version is V1.3B */ - ROM_REGION( 0x400000, "gfx1", ROMREGION_ERASE00 ) + ROM_REGION( 0x400000, "gfx", ROMREGION_ERASE00 ) ROM_LOAD16_BYTE( "pt-u121.bin", 0x000000, 0x100000, CRC(56b0b00a) SHA1(4034fe373a61f756f4813f0c20b1cf05e4338059) ) ROM_LOAD16_BYTE( "pt-u120.bin", 0x000001, 0x100000, CRC(ca664142) SHA1(2727ecb9287b4ed30088e017bb6b8763dfb75b2f) ) ROM_LOAD16_BYTE( "pt-u125.bin", 0x200000, 0x100000, CRC(e9ccf3a0) SHA1(b3fd8c094f76ace4cf403c3d0f6bd6c5d8db7d6a) ) ROM_LOAD16_BYTE( "pt-u124.bin", 0x200001, 0x100000, CRC(f4acf921) SHA1(5b244e9a51304318fa0c03eb7365b3c12627d19b) ) - ROM_REGION32_BE( 0x100000, "user1", 0 ) /* Program roms are type 27C020 */ + ROM_REGION32_BE( 0x100000, "maincpu", 0 ) /* Program roms are type 27C020 */ /* Note: With this version, the program roms are twice the size of those found on all other Police Trainer sets. Like the set listed below, if you set the dipswitch to service mode and reset the game within Mame. All 4 program ROMs fail the checksum code and the listed @@ -543,13 +551,13 @@ ROM_END ROM_START( policetr13b ) /* Rev 0.5B PCB , unknown program rom date Actual version is V1.3B */ - ROM_REGION( 0x400000, "gfx1", ROMREGION_ERASE00 ) + ROM_REGION( 0x400000, "gfx", ROMREGION_ERASE00 ) ROM_LOAD16_BYTE( "pt-u121.bin", 0x000000, 0x100000, CRC(56b0b00a) SHA1(4034fe373a61f756f4813f0c20b1cf05e4338059) ) ROM_LOAD16_BYTE( "pt-u120.bin", 0x000001, 0x100000, CRC(ca664142) SHA1(2727ecb9287b4ed30088e017bb6b8763dfb75b2f) ) ROM_LOAD16_BYTE( "pt-u125.bin", 0x200000, 0x100000, CRC(e9ccf3a0) SHA1(b3fd8c094f76ace4cf403c3d0f6bd6c5d8db7d6a) ) ROM_LOAD16_BYTE( "pt-u124.bin", 0x200001, 0x100000, CRC(f4acf921) SHA1(5b244e9a51304318fa0c03eb7365b3c12627d19b) ) - ROM_REGION32_BE( 0x100000, "user1", 0 ) /* Program roms are type 27C010 */ + ROM_REGION32_BE( 0x100000, "maincpu", 0 ) /* Program roms are type 27C010 */ /* Note: If you set the dipswitch to service mode and reset the game within Mame. All 4 program ROMs fail the checksum code, IE: they show in red instead of green. But, the listed checksums on the screen match the checksums printed on the ROM labels. However, @@ -571,7 +579,7 @@ ROM_END ROM_START( sshooter ) /* Rev 0.5B PCB , Added a "Welcome" start-up screen which shows "This is Version C191012" */ - ROM_REGION( 0x800000, "gfx1", ROMREGION_ERASE00 ) /* Graphics v1.0 */ + ROM_REGION( 0x800000, "gfx", ROMREGION_ERASE00 ) /* Graphics v1.0 */ ROM_LOAD16_BYTE( "ss-u121.bin", 0x000000, 0x100000, CRC(22e27dd6) SHA1(cb9e8c450352bb116a9c0407cc8ce6d8ae9d9881) ) // 1:1 ROM_LOAD16_BYTE( "ss-u120.bin", 0x000001, 0x100000, CRC(30173b1b) SHA1(366464444ce208391ca350f1639403f0c2217330) ) // 1:2 ROM_LOAD16_BYTE( "ss-u125.bin", 0x200000, 0x100000, CRC(79e8520a) SHA1(682e5c7954f96db65a137f05cde67c310b85b526) ) // 2:1 @@ -581,7 +589,7 @@ ROM_START( sshooter ) /* Rev 0.5B PCB , Added a "Welcome" start-up screen which ROM_LOAD16_BYTE( "ss-u127.bin", 0x600000, 0x100000, CRC(76a7a591) SHA1(9fd7cce21b01f388966a3e8388ba95820ac10bfd) ) // 4:1 ROM_LOAD16_BYTE( "ss-u126.bin", 0x600001, 0x100000, CRC(ab1b9d60) SHA1(ff51a71443f7774d3abf96c2eb8ef6a54d73dd8e) ) // 4:2 - ROM_REGION32_BE( 0x100000, "user1", 0 ) + ROM_REGION32_BE( 0x100000, "maincpu", 0 ) ROM_LOAD32_BYTE( "ss-u113.v19", 0x00000, 0x40000, CRC(de536a90) SHA1(76f0e0e2457d91b3c1bd2b3501591646a18db348) ) // 1:1 ROM_LOAD32_BYTE( "ss-u112.v19", 0x00001, 0x40000, CRC(2e4e1837) SHA1(b4088269e1e7a3913d2841eb24f53b1c413cd0cc) ) // 1:2 ROM_LOAD32_BYTE( "ss-u111.v19", 0x00002, 0x40000, CRC(485d03e8) SHA1(ebdf166b2354b318e6bfb68e0fb5647381b9c405) ) // 1:3 @@ -596,7 +604,7 @@ ROM_END ROM_START( sshooter17 ) /* Rev 0.5B PCB , unknown program rom date */ - ROM_REGION( 0x800000, "gfx1", ROMREGION_ERASE00 ) /* Graphics v1.0 */ + ROM_REGION( 0x800000, "gfx", ROMREGION_ERASE00 ) /* Graphics v1.0 */ ROM_LOAD16_BYTE( "ss-u121.bin", 0x000000, 0x100000, CRC(22e27dd6) SHA1(cb9e8c450352bb116a9c0407cc8ce6d8ae9d9881) ) // 1:1 ROM_LOAD16_BYTE( "ss-u120.bin", 0x000001, 0x100000, CRC(30173b1b) SHA1(366464444ce208391ca350f1639403f0c2217330) ) // 1:2 ROM_LOAD16_BYTE( "ss-u125.bin", 0x200000, 0x100000, CRC(79e8520a) SHA1(682e5c7954f96db65a137f05cde67c310b85b526) ) // 2:1 @@ -606,7 +614,7 @@ ROM_START( sshooter17 ) /* Rev 0.5B PCB , unknown program rom date */ ROM_LOAD16_BYTE( "ss-u127.bin", 0x600000, 0x100000, CRC(76a7a591) SHA1(9fd7cce21b01f388966a3e8388ba95820ac10bfd) ) // 4:1 ROM_LOAD16_BYTE( "ss-u126.bin", 0x600001, 0x100000, CRC(ab1b9d60) SHA1(ff51a71443f7774d3abf96c2eb8ef6a54d73dd8e) ) // 4:2 - ROM_REGION32_BE( 0x100000, "user1", 0 ) + ROM_REGION32_BE( 0x100000, "maincpu", 0 ) ROM_LOAD32_BYTE( "ss-u113.v17", 0x00000, 0x40000, CRC(a8c96af5) SHA1(a62458156603b74e0d84ce6928f7bb868bf5a219) ) // 1:1 ROM_LOAD32_BYTE( "ss-u112.v17", 0x00001, 0x40000, CRC(c732d5fa) SHA1(2bcc26c8bbf55394173ca65b4b0df01bc6b719bb) ) // 1:2 ROM_LOAD32_BYTE( "ss-u111.v17", 0x00002, 0x40000, CRC(4240fa2f) SHA1(54223207c1e228d6b836918601c0f65c2692e5bc) ) // 1:3 @@ -621,7 +629,7 @@ ROM_END ROM_START( sshooter12 ) /* Rev 0.5B PCB , program roms dated 04/17/98 */ - ROM_REGION( 0x800000, "gfx1", ROMREGION_ERASE00 ) /* Graphics v1.0 */ + ROM_REGION( 0x800000, "gfx", ROMREGION_ERASE00 ) /* Graphics v1.0 */ ROM_LOAD16_BYTE( "ss-u121.bin", 0x000000, 0x100000, CRC(22e27dd6) SHA1(cb9e8c450352bb116a9c0407cc8ce6d8ae9d9881) ) // 1:1 ROM_LOAD16_BYTE( "ss-u120.bin", 0x000001, 0x100000, CRC(30173b1b) SHA1(366464444ce208391ca350f1639403f0c2217330) ) // 1:2 ROM_LOAD16_BYTE( "ss-u125.bin", 0x200000, 0x100000, CRC(79e8520a) SHA1(682e5c7954f96db65a137f05cde67c310b85b526) ) // 2:1 @@ -631,7 +639,7 @@ ROM_START( sshooter12 ) /* Rev 0.5B PCB , program roms dated 04/17/98 */ ROM_LOAD16_BYTE( "ss-u127.bin", 0x600000, 0x100000, CRC(76a7a591) SHA1(9fd7cce21b01f388966a3e8388ba95820ac10bfd) ) // 4:1 ROM_LOAD16_BYTE( "ss-u126.bin", 0x600001, 0x100000, CRC(ab1b9d60) SHA1(ff51a71443f7774d3abf96c2eb8ef6a54d73dd8e) ) // 4:2 - ROM_REGION32_BE( 0x100000, "user1", 0 ) + ROM_REGION32_BE( 0x100000, "maincpu", 0 ) ROM_LOAD32_BYTE( "ss-u113.v12", 0x00000, 0x40000, CRC(73dbaf4b) SHA1(a85fad95d63333f4fe5647f31258b3a22c5c2c0d) ) // 1:1 ROM_LOAD32_BYTE( "ss-u112.v12", 0x00001, 0x40000, CRC(06fbc2de) SHA1(8bdfcbc33b5fc010464dcd7691f9ecd6ba2168ba) ) // 1:2 ROM_LOAD32_BYTE( "ss-u111.v12", 0x00002, 0x40000, CRC(0b291731) SHA1(bd04f0b1b52198344df625fcddfc6c6ccb0bd923) ) // 1:3 @@ -646,7 +654,7 @@ ROM_END ROM_START( sshooter11 ) /* Rev 0.5B PCB , program roms dated 04/03/98 */ - ROM_REGION( 0x800000, "gfx1", ROMREGION_ERASE00 ) /* Graphics v1.0 */ + ROM_REGION( 0x800000, "gfx", ROMREGION_ERASE00 ) /* Graphics v1.0 */ ROM_LOAD16_BYTE( "ss-u121.bin", 0x000000, 0x100000, CRC(22e27dd6) SHA1(cb9e8c450352bb116a9c0407cc8ce6d8ae9d9881) ) // 1:1 ROM_LOAD16_BYTE( "ss-u120.bin", 0x000001, 0x100000, CRC(30173b1b) SHA1(366464444ce208391ca350f1639403f0c2217330) ) // 1:2 ROM_LOAD16_BYTE( "ss-u125.bin", 0x200000, 0x100000, CRC(79e8520a) SHA1(682e5c7954f96db65a137f05cde67c310b85b526) ) // 2:1 @@ -656,7 +664,7 @@ ROM_START( sshooter11 ) /* Rev 0.5B PCB , program roms dated 04/03/98 */ ROM_LOAD16_BYTE( "ss-u127.bin", 0x600000, 0x100000, CRC(76a7a591) SHA1(9fd7cce21b01f388966a3e8388ba95820ac10bfd) ) // 4:1 ROM_LOAD16_BYTE( "ss-u126.bin", 0x600001, 0x100000, CRC(ab1b9d60) SHA1(ff51a71443f7774d3abf96c2eb8ef6a54d73dd8e) ) // 4:2 - ROM_REGION32_BE( 0x100000, "user1", 0 ) + ROM_REGION32_BE( 0x100000, "maincpu", 0 ) ROM_LOAD32_BYTE( "ss-u113.v11", 0x00000, 0x40000, CRC(c19693f3) SHA1(2f1576261f741d5e69d30f645aea0ed359b8dc03) ) // 1:1 ROM_LOAD32_BYTE( "ss-u112.v11", 0x00001, 0x40000, CRC(a5ab6d82) SHA1(b2cc3fd875f0c6702cee973b77fd608f4cfe0555) ) // 1:2 ROM_LOAD32_BYTE( "ss-u111.v11", 0x00002, 0x40000, CRC(ec209b5f) SHA1(1408b509853b325e865d0b23d237bca321e73f60) ) // 1:3 @@ -677,33 +685,10 @@ ROM_END * *************************************/ -void policetr_state::init_policetr() -{ - m_maincpu->space(AS_PROGRAM).install_write_handler(0x00000fc8, 0x00000fcb, write32_delegate(FUNC(policetr_state::speedup_w),this)); - m_speedup_pc = 0x1fc028ac; - m_speedup_data = m_rambase + 0xfc8/4; -} - -void policetr_state::init_plctr13b() -{ - m_maincpu->space(AS_PROGRAM).install_write_handler(0x00000fc8, 0x00000fcb, write32_delegate(FUNC(policetr_state::speedup_w),this)); - m_speedup_pc = 0x1fc028bc; - m_speedup_data = m_rambase + 0xfc8/4; -} - - -void policetr_state::init_sshooter() -{ - m_maincpu->space(AS_PROGRAM).install_write_handler(0x00018fd8, 0x00018fdb, write32_delegate(FUNC(policetr_state::speedup_w),this)); - m_speedup_pc = 0x1fc03470; - m_speedup_data = m_rambase + 0x18fd8/4; -} - -void policetr_state::init_sshoot12() +void policetr_state::driver_init() { - m_maincpu->space(AS_PROGRAM).install_write_handler(0x00018fd8, 0x00018fdb, write32_delegate(FUNC(policetr_state::speedup_w),this)); - m_speedup_pc = 0x1fc033e0; - m_speedup_data = m_rambase + 0x18fd8/4; + m_maincpu->space(AS_PROGRAM).install_write_handler(m_speedup_addr, m_speedup_addr+3, write32_delegate(FUNC(policetr_state::speedup_w),this)); + m_speedup_data = m_rambase + m_speedup_addr/4; } @@ -714,14 +699,14 @@ void policetr_state::init_sshoot12() * *************************************/ -GAME( 1996, policetr, 0, policetr, policetr, policetr_state, init_policetr, ROT0, "P&P Marketing", "Police Trainer (Rev 1.3)", 0 ) -GAME( 1996, policetr11, policetr, policetr, polict10, policetr_state, init_policetr, ROT0, "P&P Marketing", "Police Trainer (Rev 1.1)", 0 ) -GAME( 1996, policetr10, policetr, policetr, polict10, policetr_state, init_policetr, ROT0, "P&P Marketing", "Police Trainer (Rev 1.0)", 0 ) +GAME( 1996, policetr, 0, policetr, policetr, policetr_state, empty_init, ROT0, "P&P Marketing", "Police Trainer (Rev 1.3)", 0 ) +GAME( 1996, policetr11, policetr, policetr, polict10, policetr_state, empty_init, ROT0, "P&P Marketing", "Police Trainer (Rev 1.1)", 0 ) +GAME( 1996, policetr10, policetr, policetr, polict10, policetr_state, empty_init, ROT0, "P&P Marketing", "Police Trainer (Rev 1.0)", 0 ) -GAME( 1996, policetr13a, policetr, sshooter, policetr, policetr_state, init_plctr13b, ROT0, "P&P Marketing", "Police Trainer (Rev 1.3B Newer)", 0 ) -GAME( 1996, policetr13b, policetr, sshooter, policetr, policetr_state, init_plctr13b, ROT0, "P&P Marketing", "Police Trainer (Rev 1.3B)", 0 ) +GAME( 1996, policetr13a, policetr, sshooter, policetr, plctr13b_state, empty_init, ROT0, "P&P Marketing", "Police Trainer (Rev 1.3B Newer)", 0 ) +GAME( 1996, policetr13b, policetr, sshooter, policetr, plctr13b_state, empty_init, ROT0, "P&P Marketing", "Police Trainer (Rev 1.3B)", 0 ) -GAME( 1998, sshooter, 0, sshooter, policetr, policetr_state, init_sshooter, ROT0, "P&P Marketing", "Sharpshooter (Rev 1.9)", 0 ) -GAME( 1998, sshooter17, sshooter, sshooter, policetr, policetr_state, init_sshooter, ROT0, "P&P Marketing", "Sharpshooter (Rev 1.7)", 0 ) -GAME( 1998, sshooter12, sshooter, sshooter, sshoot11, policetr_state, init_sshoot12, ROT0, "P&P Marketing", "Sharpshooter (Rev 1.2)", 0 ) -GAME( 1998, sshooter11, sshooter, sshooter, sshoot11, policetr_state, init_sshoot12, ROT0, "P&P Marketing", "Sharpshooter (Rev 1.1)", 0 ) +GAME( 1998, sshooter, 0, sshooter, policetr, sshooter_state, empty_init, ROT0, "P&P Marketing", "Sharpshooter (Rev 1.9)", 0 ) +GAME( 1998, sshooter17, sshooter, sshooter, policetr, sshooter_state, empty_init, ROT0, "P&P Marketing", "Sharpshooter (Rev 1.7)", 0 ) +GAME( 1998, sshooter12, sshooter, sshooter, sshoot11, sshoot12_state, empty_init, ROT0, "P&P Marketing", "Sharpshooter (Rev 1.2)", 0 ) +GAME( 1998, sshooter11, sshooter, sshooter, sshoot11, sshoot12_state, empty_init, ROT0, "P&P Marketing", "Sharpshooter (Rev 1.1)", 0 ) diff --git a/src/mame/drivers/poly.cpp b/src/mame/drivers/poly.cpp index 0ab407676f1..0a40a6a345c 100644 --- a/src/mame/drivers/poly.cpp +++ b/src/mame/drivers/poly.cpp @@ -290,9 +290,9 @@ MACHINE_CONFIG_START(poly_state::poly) MCFG_RAM_EXTRA_OPTIONS("64K") /* network */ - MCFG_DEVICE_ADD("mc6854", MC6854, 0) - //MCFG_MC6854_OUT_TXD_CB(WRITELINE(NETWORK_TAG, poly_network_device, data_w)) - //MCFG_MC6854_OUT_IRQ_CB(WRITELINE("irqs", input_merger_device, in_w<0>)) + MC6854(config, m_adlc); + //m_adlc->out_txd_cb().set(NETWORK_TAG, FUNC(poly_network_device::data_w)); + //m_adlc->out_irq_cb().set("irqs", FUNC(input_merger_device::in_w<0>)); //MCFG_POLY_NETWORK_ADD() //MCFG_POLY_NETWORK_CLK_CB(WRITELINE(*this, poly_state, network_clk_w)) diff --git a/src/mame/drivers/popobear.cpp b/src/mame/drivers/popobear.cpp index f973e7daa78..de8ae698ff4 100644 --- a/src/mame/drivers/popobear.cpp +++ b/src/mame/drivers/popobear.cpp @@ -414,7 +414,7 @@ uint32_t popobear_state::screen_update(screen_device &screen, bitmap_ind16 &bitm uint16_t val = m_vram[scrollbase/2 + line]; uint16_t upper = (m_vram[scrollbase2/2 + line]&0xff00)>>8; - clip.min_y = clip.max_y = line; + clip.sety(line, line); m_bg_tilemap[1]->set_scrollx(0,(val&0x00ff) | (upper << 8)); m_bg_tilemap[1]->set_scrolly(0,((val&0xff00)>>8)-line); @@ -439,7 +439,7 @@ uint32_t popobear_state::screen_update(screen_device &screen, bitmap_ind16 &bitm uint16_t val = m_vram[scrollbase/2 + line]; uint16_t upper = (m_vram[scrollbase2/2 + line]&0x00ff)>>0; - clip.min_y = clip.max_y = line; + clip.sety(line, line); m_bg_tilemap[0]->set_scrollx(0,(val&0x00ff) | (upper << 8)); m_bg_tilemap[0]->set_scrolly(0,((val&0xff00)>>8)-line); diff --git a/src/mame/drivers/prodigy.cpp b/src/mame/drivers/prodigy.cpp index e1c008166bb..74fee06c884 100644 --- a/src/mame/drivers/prodigy.cpp +++ b/src/mame/drivers/prodigy.cpp @@ -170,7 +170,7 @@ private: void maincpu_map(address_map &map); - required_device<cpu_device> m_maincpu; + required_device<m6502_device> m_maincpu; required_device<ttl74145_device> m_74145; uint8_t m_segments; uint8_t m_digit_cache[4]; @@ -641,37 +641,39 @@ static INPUT_PORTS_START( prodigy ) PORT_BIT(0xc00, 0x00, IPT_UNUSED ) INPUT_PORTS_END -MACHINE_CONFIG_START(prodigy_state::prodigy) +void prodigy_state::prodigy(machine_config &config) +{ /* basic machine hardware */ - MCFG_DEVICE_ADD("maincpu", M6502, XTAL(2'000'000)) - MCFG_DEVICE_PROGRAM_MAP(maincpu_map) + M6502(config, m_maincpu, XTAL(2'000'000)); + m_maincpu->set_addrmap(AS_PROGRAM, &prodigy_state::maincpu_map); config.set_default_layout(layout_prodigy); - MCFG_DEVICE_ADD("io_74145", TTL74145, 0) - - MCFG_DEVICE_ADD("via", VIA6522, XTAL(2'000'000)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, prodigy_state, irq_handler)); - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, prodigy_state, via_pa_w)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, prodigy_state, via_pb_w)) - MCFG_VIA6522_READPA_HANDLER(READ8(*this, prodigy_state, via_pa_r)) - MCFG_VIA6522_READPB_HANDLER(READ8(*this, prodigy_state, via_pb_r)) - MCFG_VIA6522_CB1_HANDLER(WRITELINE(*this, prodigy_state, via_cb1_w)) - MCFG_VIA6522_CB2_HANDLER(WRITELINE(*this, prodigy_state, via_cb2_w)) - - MCFG_DEVICE_ADD(NETLIST_TAG, NETLIST_CPU, XTAL(2'000'000) * 30) - MCFG_NETLIST_SETUP(prodigy) - - MCFG_NETLIST_LOGIC_INPUT(NETLIST_TAG, "cb1", "cb1.IN", 0) - MCFG_NETLIST_LOGIC_INPUT(NETLIST_TAG, "cb2", "cb2.IN", 0) - MCFG_NETLIST_LOGIC_OUTPUT(NETLIST_TAG, "bcd_bit0", "bcd_bit0", prodigy_state, bcd_bit0_cb, "") - MCFG_NETLIST_LOGIC_OUTPUT(NETLIST_TAG, "bcd_bit1", "bcd_bit1", prodigy_state, bcd_bit1_cb, "") - MCFG_NETLIST_LOGIC_OUTPUT(NETLIST_TAG, "bcd_bit2", "bcd_bit2", prodigy_state, bcd_bit2_cb, "") - MCFG_NETLIST_LOGIC_OUTPUT(NETLIST_TAG, "bcd_bit3", "bcd_bit3", prodigy_state, bcd_bit3_cb, "") - MCFG_NETLIST_LOGIC_OUTPUT(NETLIST_TAG, "bcd_bit4", "bcd_bit4", prodigy_state, bcd_bit4_cb, "") - MCFG_NETLIST_LOGIC_OUTPUT(NETLIST_TAG, "bcd_bit5", "bcd_bit5", prodigy_state, bcd_bit5_cb, "") - MCFG_NETLIST_LOGIC_OUTPUT(NETLIST_TAG, "bcd_bit6", "bcd_bit6", prodigy_state, bcd_bit6_cb, "") - MCFG_NETLIST_LOGIC_OUTPUT(NETLIST_TAG, "bcd_bit7", "bcd_bit7", prodigy_state, bcd_bit7_cb, "") -MACHINE_CONFIG_END + TTL74145(config, m_74145, 0); + + VIA6522(config, m_via, XTAL(2'000'000)); + m_via->irq_handler().set(FUNC(prodigy_state::irq_handler)); + m_via->writepa_handler().set(FUNC(prodigy_state::via_pa_w)); + m_via->writepb_handler().set(FUNC(prodigy_state::via_pb_w)); + m_via->readpa_handler().set(FUNC(prodigy_state::via_pa_r)); + m_via->readpb_handler().set(FUNC(prodigy_state::via_pb_r)); + m_via->cb1_handler().set(FUNC(prodigy_state::via_cb1_w)); + m_via->cb2_handler().set(FUNC(prodigy_state::via_cb2_w)); + + NETLIST_CPU(config, m_bcd, XTAL(2'000'000) * 30); + m_bcd->set_constructor(netlist_prodigy); + + NETLIST_LOGIC_INPUT(config, m_cb1); m_cb1->set_params("cb1.IN", 0); + NETLIST_LOGIC_INPUT(config, m_cb2); m_cb2->set_params("cb2.IN", 0); + + NETLIST_LOGIC_OUTPUT(config, "bcd:bcd_bit0").set_params("bcd_bit0", FUNC(prodigy_state::bcd_bit0_cb)); + NETLIST_LOGIC_OUTPUT(config, "bcd:bcd_bit1").set_params("bcd_bit1", FUNC(prodigy_state::bcd_bit1_cb)); + NETLIST_LOGIC_OUTPUT(config, "bcd:bcd_bit2").set_params("bcd_bit2", FUNC(prodigy_state::bcd_bit2_cb)); + NETLIST_LOGIC_OUTPUT(config, "bcd:bcd_bit3").set_params("bcd_bit3", FUNC(prodigy_state::bcd_bit3_cb)); + NETLIST_LOGIC_OUTPUT(config, "bcd:bcd_bit4").set_params("bcd_bit4", FUNC(prodigy_state::bcd_bit4_cb)); + NETLIST_LOGIC_OUTPUT(config, "bcd:bcd_bit5").set_params("bcd_bit5", FUNC(prodigy_state::bcd_bit5_cb)); + NETLIST_LOGIC_OUTPUT(config, "bcd:bcd_bit6").set_params("bcd_bit6", FUNC(prodigy_state::bcd_bit6_cb)); + NETLIST_LOGIC_OUTPUT(config, "bcd:bcd_bit7").set_params("bcd_bit7", FUNC(prodigy_state::bcd_bit7_cb)); +} /* * 6522 VIA init sequence diff --git a/src/mame/drivers/proteus.cpp b/src/mame/drivers/proteus.cpp index 766e41ff829..b972e619a85 100644 --- a/src/mame/drivers/proteus.cpp +++ b/src/mame/drivers/proteus.cpp @@ -348,8 +348,8 @@ MACHINE_CONFIG_START(proteus_state::proteus) MCFG_RAM_DEFAULT_SIZE("64K") /* network */ - MCFG_DEVICE_ADD("mc6854", MC6854, 0) - MCFG_MC6854_OUT_IRQ_CB(WRITELINE("irqs", input_merger_device, in_w<0>)) + MC6854(config, m_adlc); + m_adlc->out_irq_cb().set("irqs", FUNC(input_merger_device::in_w<0>)); MCFG_DEVICE_ADD("ptm", PTM6840, 4_MHz_XTAL / 2) MCFG_PTM6840_EXTERNAL_CLOCKS(0, 0, 0) diff --git a/src/mame/drivers/pulsar.cpp b/src/mame/drivers/pulsar.cpp index a6929df412e..65b3dcf6a41 100644 --- a/src/mame/drivers/pulsar.cpp +++ b/src/mame/drivers/pulsar.cpp @@ -17,7 +17,7 @@ The terminal must be set for 9600 baud, 7 bits, even parity, 1 stop bit. ToDo: - Fix floppy. It needs to WAIT the cpu whenever port 0xD3 is read, wait - for either DRQ ir INTRQ to assert, then release the cpu and then do the + for either DRQ or INTRQ to assert, then release the cpu and then do the actual port read. Our Z80 cannot do that. - Fix FDC so MAME doesn't crash when a certain disk is inserted. diff --git a/src/mame/drivers/pve500.cpp b/src/mame/drivers/pve500.cpp index 502444c5cb5..8ecb266c8b4 100644 --- a/src/mame/drivers/pve500.cpp +++ b/src/mame/drivers/pve500.cpp @@ -440,9 +440,9 @@ MACHINE_CONFIG_START(pve500_state::pve500) clk1.signal_handler().append(m_subcpu, FUNC(tmpz84c015_device::txcb_w)); /* ICF5: 2kbytes of RAM shared between the two CPUs (dual-port RAM)*/ - MCFG_DEVICE_ADD("mb8421", MB8421, 0) - MCFG_MB8421_INTL_HANDLER(WRITELINE(*this, pve500_state, mb8421_intl)) - MCFG_MB8421_INTR_HANDLER(WRITELINE(*this, pve500_state, mb8421_intr)) + mb8421_device &mb8421(MB8421(config, "mb8421")); + mb8421.intl_callback().set(FUNC(pve500_state::mb8421_intl)); + mb8421.intr_callback().set(FUNC(pve500_state::mb8421_intr)); /* video hardware */ config.set_default_layout(layout_pve500); diff --git a/src/mame/drivers/r2dx_v33.cpp b/src/mame/drivers/r2dx_v33.cpp index a40b1cb4d5a..08b149fed56 100644 --- a/src/mame/drivers/r2dx_v33.cpp +++ b/src/mame/drivers/r2dx_v33.cpp @@ -493,12 +493,8 @@ void r2dx_v33_state::nzeroteam_base_map(address_map &map) // map(0x00762, 0x00763).r(FUNC(r2dx_v33_state::nzerotea_unknown_r)); map(0x00780, 0x0079f).lrw8("seibu_sound_rw", - [this](address_space &space, offs_t offset, u8 mem_mask) { - return m_seibu_sound->main_r(space, offset >> 1, mem_mask); - }, - [this](address_space &space, offs_t offset, u8 data, u8 mem_mask) { - m_seibu_sound->main_w(space, offset >> 1, data, mem_mask); - }).umask16(0x00ff); + [this](offs_t offset) { return m_seibu_sound->main_r(offset >> 1); }, + [this](offs_t offset, u8 data) { m_seibu_sound->main_w(offset >> 1, data); }).umask16(0x00ff); map(0x00800, 0x00fff).ram(); map(0x01000, 0x0bfff).ram(); diff --git a/src/mame/drivers/raiden2.cpp b/src/mame/drivers/raiden2.cpp index 52af42b78c8..f17c8de47c1 100644 --- a/src/mame/drivers/raiden2.cpp +++ b/src/mame/drivers/raiden2.cpp @@ -973,12 +973,8 @@ void raiden2_state::raiden2_mem(address_map &map) map(0x0068e, 0x0068f).nopw(); //irq ack / sprite buffering? map(0x00700, 0x0071f).lrw8("seibu_sound_rw", - [this](address_space &space, offs_t offset, u8 mem_mask) { - return m_seibu_sound->main_r(space, offset >> 1, mem_mask); - }, - [this](address_space &space, offs_t offset, u8 data, u8 mem_mask) { - m_seibu_sound->main_w(space, offset >> 1, data, mem_mask); - }).umask16(0x00ff); + [this](offs_t offset) { return m_seibu_sound->main_r(offset >> 1); }, + [this](offs_t offset, u8 data) { m_seibu_sound->main_w(offset >> 1, data); }).umask16(0x00ff); map(0x00740, 0x00741).portr("DSW"); map(0x00744, 0x00745).portr("P1_P2"); @@ -1022,12 +1018,8 @@ void raiden2_state::zeroteam_mem(address_map &map) map(0x0068e, 0x0068f).nopw(); // irq ack / sprite buffering? map(0x00700, 0x0071f).lrw8("seibu_sound_rw", - [this](address_space &space, offs_t offset, u8 mem_mask) { - return m_seibu_sound->main_r(space, offset >> 1, mem_mask); - }, - [this](address_space &space, offs_t offset, u8 data, u8 mem_mask) { - m_seibu_sound->main_w(space, offset >> 1, data, mem_mask); - }).umask16(0x00ff); + [this](offs_t offset) { return m_seibu_sound->main_r(offset >> 1); }, + [this](offs_t offset, u8 data) { m_seibu_sound->main_w(offset >> 1, data); }).umask16(0x00ff); map(0x00740, 0x00741).portr("DSW"); map(0x00744, 0x00745).portr("P1_P2"); @@ -1060,12 +1052,8 @@ void raiden2_state::xsedae_mem(address_map &map) map(0x0068e, 0x0068f).nopw(); //irq ack / sprite buffering? map(0x00700, 0x0071f).lrw8("seibu_sound_rw", - [this](address_space &space, offs_t offset, u8 mem_mask) { - return m_seibu_sound->main_r(space, offset >> 1, mem_mask); - }, - [this](address_space &space, offs_t offset, u8 data, u8 mem_mask) { - m_seibu_sound->main_w(space, offset >> 1, data, mem_mask); - }).umask16(0x00ff); + [this](offs_t offset) { return m_seibu_sound->main_r(offset >> 1); }, + [this](offs_t offset, u8 data) { m_seibu_sound->main_w(offset >> 1, data); }).umask16(0x00ff); map(0x00740, 0x00741).portr("DSW"); map(0x00744, 0x00745).portr("P1_P2"); diff --git a/src/mame/drivers/rainbow.cpp b/src/mame/drivers/rainbow.cpp index 91ea68f198b..61a9ca1b30d 100644 --- a/src/mame/drivers/rainbow.cpp +++ b/src/mame/drivers/rainbow.cpp @@ -3342,10 +3342,10 @@ MACHINE_CONFIG_START(rainbow_state::rainbow) MCFG_DEVICE_ADD(LK201_TAG, LK201, 0) MCFG_LK201_TX_HANDLER(WRITELINE("kbdser", i8251_device, write_rxd)) - MCFG_DEVICE_ADD("prtbrg", RIPPLE_COUNTER, 24.0734_MHz_XTAL / 6 / 13) // 74LS393 at E17 (both halves) + ripple_counter_device &prtbrg(RIPPLE_COUNTER(config, "prtbrg", 24.0734_MHz_XTAL / 6 / 13)); // 74LS393 at E17 (both halves) // divided clock should ideally be 307.2 kHz, but is actually approximately 308.6333 kHz - MCFG_RIPPLE_COUNTER_STAGES(8) - MCFG_RIPPLE_COUNTER_COUNT_OUT_CB(WRITE8(*this, rainbow_state, bitrate_counter_w)) + prtbrg.set_stages(8); + prtbrg.count_out_cb().set(FUNC(rainbow_state::bitrate_counter_w)); MCFG_TIMER_DRIVER_ADD_PERIODIC("motor", rainbow_state, hd_motor_tick, attotime::from_hz(60)) diff --git a/src/mame/drivers/rastersp.cpp b/src/mame/drivers/rastersp.cpp index e331d7f4a30..718a9f48fd4 100644 --- a/src/mame/drivers/rastersp.cpp +++ b/src/mame/drivers/rastersp.cpp @@ -52,16 +52,16 @@ class rastersp_state : public driver_device { public: rastersp_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_dsp(*this, "dsp"), - m_dram(*this, "dram"), - m_ldac(*this, "ldac"), - m_rdac(*this, "rdac"), - m_tms_timer1(*this, "tms_timer1"), - m_tms_tx_timer(*this, "tms_tx_timer"), - m_palette(*this, "palette"), - m_nvram(*this, "nvram") + : driver_device(mconfig, type, tag) + , m_maincpu(*this, "maincpu") + , m_dsp(*this, "dsp") + , m_dram(*this, "dram") + , m_ldac(*this, "ldac") + , m_rdac(*this, "rdac") + , m_palette(*this, "palette") + , m_nvram(*this, "nvram") + , m_tms_timer1(nullptr) + , m_tms_tx_timer(nullptr) {} void rastersp(machine_config &config); @@ -103,15 +103,16 @@ private: IRQ_SCSI = 7 }; - required_device<cpu_device> m_maincpu; - required_device<cpu_device> m_dsp; - required_shared_ptr<uint32_t> m_dram; - required_device<dac_word_interface> m_ldac; - required_device<dac_word_interface> m_rdac; - required_device<timer_device> m_tms_timer1; - required_device<timer_device> m_tms_tx_timer; - required_device<palette_device> m_palette; - required_device<nvram_device> m_nvram; + required_device<i486_device> m_maincpu; + required_device<tms3203x_device> m_dsp; + required_shared_ptr<uint32_t> m_dram; + required_device<dac_16bit_r2r_twos_complement_device> m_ldac; + required_device<dac_16bit_r2r_twos_complement_device> m_rdac; + required_device<palette_device> m_palette; + required_device<nvram_device> m_nvram; + + emu_timer *m_tms_timer1; + emu_timer *m_tms_tx_timer; DECLARE_WRITE32_MEMBER(cyrix_cache_w); DECLARE_READ8_MEMBER(nvram_r); @@ -131,8 +132,8 @@ private: DECLARE_WRITE32_MEMBER(ncr53c700_write); DECLARE_WRITE_LINE_MEMBER(scsi_irq); - TIMER_DEVICE_CALLBACK_MEMBER(tms_timer1); - TIMER_DEVICE_CALLBACK_MEMBER(tms_tx_timer); + TIMER_CALLBACK_MEMBER(tms_timer1); + TIMER_CALLBACK_MEMBER(tms_tx_timer); DECLARE_WRITE_LINE_MEMBER(vblank_irq); std::unique_ptr<uint8_t[]> m_nvram8; @@ -143,11 +144,12 @@ private: uint32_t m_tms_io_regs[0x80]; bitmap_ind16 m_update_bitmap; - uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - void update_irq(uint32_t which, uint32_t state); - void upload_palette(uint32_t word1, uint32_t word2); + uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + void update_irq(uint32_t which, uint32_t state); + void upload_palette(uint32_t word1, uint32_t word2); IRQ_CALLBACK_MEMBER(irq_callback); - void ncr53c700(device_t *device); + nscsi_connector &add_rastersp_scsi_slot(machine_config &config, const char *tag, const char *default_slot); + static void ncr53c700_config(device_t *device); void cpu_map(address_map &map); void dsp_map(address_map &map); void io_map(address_map &map); @@ -176,6 +178,12 @@ void rastersp_state::machine_start() membank("bank2")->set_base(&m_dram[0x10000/4]); membank("bank3")->set_base(&m_dram[0x300000/4]); + if (!m_tms_timer1) + m_tms_timer1 = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(rastersp_state::tms_timer1), this)); + + if (!m_tms_tx_timer) + m_tms_tx_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(rastersp_state::tms_tx_timer), this)); + #if USE_SPEEDUP_HACK m_dsp->space(AS_PROGRAM).install_read_handler(0x809923, 0x809923, read32_delegate(FUNC(rastersp_state::dsp_speedup_r), this)); m_dsp->space(AS_PROGRAM).install_write_handler(0x809923, 0x809923, write32_delegate(FUNC(rastersp_state::dsp_speedup_w), this)); @@ -197,6 +205,9 @@ void rastersp_state::machine_reset() // Reset DSP internal registers m_tms_io_regs[SPORT_GLOBAL_CTL] = 0; + + m_tms_timer1->adjust(attotime::never); + m_tms_tx_timer->adjust(attotime::never); } @@ -514,7 +525,7 @@ WRITE32_MEMBER( rastersp_state::cyrix_cache_w ) * *************************************/ -TIMER_DEVICE_CALLBACK_MEMBER( rastersp_state::tms_tx_timer ) +TIMER_CALLBACK_MEMBER(rastersp_state::tms_tx_timer) { // Is the transmit shifter full? if (m_tms_io_regs[SPORT_GLOBAL_CTL] & (1 << 3)) @@ -540,7 +551,7 @@ TIMER_DEVICE_CALLBACK_MEMBER( rastersp_state::tms_tx_timer ) } -TIMER_DEVICE_CALLBACK_MEMBER( rastersp_state::tms_timer1 ) +TIMER_CALLBACK_MEMBER(rastersp_state::tms_timer1) { } @@ -553,7 +564,7 @@ READ32_MEMBER( rastersp_state::tms32031_control_r ) { case TIMER1_COUNTER: { - attotime elapsed = m_tms_timer1->time_elapsed(); + attotime elapsed = m_tms_timer1->elapsed(); val = m_tms_io_regs[TIMER1_PERIOD] - (elapsed.as_ticks(m_dsp->clock() / 2 / 2)); break; @@ -840,74 +851,81 @@ WRITE32_MEMBER(rastersp_state::ncr53c700_write) m_maincpu->space(AS_PROGRAM).write_dword(offset, data, mem_mask); } -void rastersp_state::ncr53c700(device_t *device) -{ - devcb_base *devcb; - (void)devcb; - MCFG_DEVICE_CLOCK(66000000) - MCFG_NCR53C7XX_IRQ_HANDLER(WRITELINE(*this, rastersp_state, scsi_irq)) - MCFG_NCR53C7XX_HOST_READ(READ32(*this, rastersp_state, ncr53c700_read)) - MCFG_NCR53C7XX_HOST_WRITE(WRITE32(*this, rastersp_state, ncr53c700_write)) -} - -static void rastersp_scsi_devices(device_slot_interface &device) +void rastersp_state::ncr53c700_config(device_t *device) { - device.option_add("harddisk", NSCSI_HARDDISK); - device.option_add_internal("ncr53c700", NCR53C7XX); + auto *state = device->subdevice<rastersp_state>(":"); + ncr53c7xx_device &scsictrl = downcast<ncr53c7xx_device &>(*device); + scsictrl.set_clock(66000000); + scsictrl.irq_handler().set(*state, FUNC(rastersp_state::scsi_irq)); + scsictrl.host_read().set(*state, FUNC(rastersp_state::ncr53c700_read)); + scsictrl.host_write().set(*state, FUNC(rastersp_state::ncr53c700_write)); } - /************************************* * * Machine driver * *************************************/ -MACHINE_CONFIG_START(rastersp_state::rastersp) - MCFG_DEVICE_ADD("maincpu", I486, 33330000) - MCFG_DEVICE_PROGRAM_MAP(cpu_map) - MCFG_DEVICE_IO_MAP(io_map) - MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(rastersp_state,irq_callback) +void rastersp_state::rastersp(machine_config &config) +{ + I486(config, m_maincpu, 33330000); + m_maincpu->set_addrmap(AS_PROGRAM, &rastersp_state::cpu_map); + m_maincpu->set_addrmap(AS_IO, &rastersp_state::io_map); + m_maincpu->set_irq_acknowledge_callback(FUNC(rastersp_state::irq_callback)); - MCFG_DEVICE_ADD("dsp", TMS32031, 33330000) - MCFG_DEVICE_PROGRAM_MAP(dsp_map) - MCFG_TMS3203X_MCBL(true) // Boot-loader mode + TMS32031(config, m_dsp, 33330000); + m_dsp->set_addrmap(AS_PROGRAM, &rastersp_state::dsp_map); + m_dsp->set_mcbl_mode(true); // Boot-loader mode - /* Devices */ - MCFG_TIMER_DRIVER_ADD("tms_timer1", rastersp_state, tms_timer1) - MCFG_TIMER_DRIVER_ADD("tms_tx_timer", rastersp_state, tms_tx_timer) + MC146818(config, "rtc", 32.768_kHz_XTAL); - MCFG_DEVICE_ADD("rtc", MC146818, 32.768_kHz_XTAL) + NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); - MCFG_NVRAM_ADD_0FILL("nvram") + NSCSI_BUS(config, "scsibus", 0); - MCFG_NSCSI_BUS_ADD("scsibus") - MCFG_NSCSI_ADD("scsibus:0", rastersp_scsi_devices, "harddisk", true) - MCFG_NSCSI_ADD("scsibus:7", rastersp_scsi_devices, "ncr53c700", true) - MCFG_SLOT_OPTION_MACHINE_CONFIG("ncr53c700", [this] (device_t *device) { ncr53c700(device); }) + nscsi_connector &connector0(NSCSI_CONNECTOR(config, "scsibus:0", 0)); + connector0.option_add("harddisk", NSCSI_HARDDISK); + connector0.option_add_internal("ncr53c700", NCR53C7XX); + connector0.set_default_option("harddisk"); + connector0.set_fixed(true); - /* Video */ - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_SIZE(320, 240) - MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 240-1) - MCFG_SCREEN_UPDATE_DRIVER(rastersp_state, screen_update) - MCFG_SCREEN_REFRESH_RATE(50) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */ - MCFG_SCREEN_PALETTE("palette") - MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, rastersp_state, vblank_irq)) + nscsi_connector &connector7(NSCSI_CONNECTOR(config, "scsibus:7", 0)); + connector7.option_add("harddisk", NSCSI_HARDDISK); + connector7.option_add_internal("ncr53c700", NCR53C7XX); + connector7.set_default_option("ncr53c700"); + connector7.set_fixed(true); + connector7.set_option_machine_config("ncr53c700", ncr53c700_config); - MCFG_PALETTE_ADD_RRRRRGGGGGGBBBBB("palette") + /* Video */ + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); + screen.set_size(320, 240); + screen.set_visarea(0, 320-1, 0, 240-1); + screen.set_screen_update(FUNC(rastersp_state::screen_update)); + screen.set_refresh_hz(50); + screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */ + screen.set_palette("palette"); + screen.screen_vblank().set(FUNC(rastersp_state::vblank_irq)); + + PALETTE(config, m_palette, 65536); + m_palette->set_init("palette", FUNC(palette_device::palette_init_RRRRRGGGGGGBBBBB)); /* Sound */ SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); - MCFG_DEVICE_ADD("ldac", DAC_16BIT_R2R_TWOS_COMPLEMENT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.5) // unknown DAC - MCFG_DEVICE_ADD("rdac", DAC_16BIT_R2R_TWOS_COMPLEMENT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.5) // unknown DAC - MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0) - MCFG_SOUND_ROUTE(0, "ldac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "ldac", -1.0, DAC_VREF_NEG_INPUT) - MCFG_SOUND_ROUTE(0, "rdac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "rdac", -1.0, DAC_VREF_NEG_INPUT) -MACHINE_CONFIG_END + DAC_16BIT_R2R_TWOS_COMPLEMENT(config, m_ldac, 0); + DAC_16BIT_R2R_TWOS_COMPLEMENT(config, m_rdac, 0); + m_ldac->add_route(ALL_OUTPUTS, "lspeaker", 0.5); // unknown DAC + m_rdac->add_route(ALL_OUTPUTS, "rspeaker", 0.5); // unknown DAC + + voltage_regulator_device &vreg(VOLTAGE_REGULATOR(config, "vref")); + vreg.set_output(5.0); + vreg.add_route(0, "ldac", 1.0, DAC_VREF_POS_INPUT); + vreg.add_route(0, "rdac", 1.0, DAC_VREF_POS_INPUT); + vreg.add_route(0, "ldac", -1.0, DAC_VREF_NEG_INPUT); + vreg.add_route(0, "rdac", -1.0, DAC_VREF_NEG_INPUT); +} diff --git a/src/mame/drivers/rc702.cpp b/src/mame/drivers/rc702.cpp index 181bc862191..bc85723694e 100644 --- a/src/mame/drivers/rc702.cpp +++ b/src/mame/drivers/rc702.cpp @@ -10,10 +10,12 @@ Undumped prom at IC55 type 74S287 Keyboard has 8048 and 2758, both undumped. ToDo: -- Everything +- Printer +- Hard drive, ports 0x60-0x67. Extra CTC on HD board, ports 0x44-0x47 +- Other things Issues: -- Floppy disc error. +- Floppy disc error. It reads 0x780 bytes from the wrong sector then gives diskette error (use bios 1) ****************************************************************************************************************/ @@ -55,8 +57,7 @@ public: , m_7474(*this, "7474") , m_fdc(*this, "fdc") , m_floppy0(*this, "fdc:0") - { - } + { } void rc702(machine_config &config); @@ -67,12 +68,11 @@ private: DECLARE_READ8_MEMBER(memory_read_byte); DECLARE_WRITE8_MEMBER(memory_write_byte); DECLARE_WRITE8_MEMBER(port14_w); - DECLARE_WRITE8_MEMBER(port18_w); DECLARE_WRITE8_MEMBER(port1c_w); DECLARE_WRITE_LINE_MEMBER(crtc_drq_w); - DECLARE_WRITE_LINE_MEMBER(busreq_w); + DECLARE_WRITE_LINE_MEMBER(hreq_w); DECLARE_WRITE_LINE_MEMBER(clock_w); - DECLARE_WRITE_LINE_MEMBER(tc_w); + DECLARE_WRITE_LINE_MEMBER(eop_w); DECLARE_WRITE_LINE_MEMBER(q_w); DECLARE_WRITE_LINE_MEMBER(qbar_w); DECLARE_WRITE_LINE_MEMBER(dack1_w); @@ -86,8 +86,8 @@ private: bool m_qbar_state; bool m_drq_state; uint16_t m_beepcnt; - uint8_t m_dack; - bool m_tc; + bool m_eop; + bool m_dack1; required_device<palette_device> m_palette; required_device<cpu_device> m_maincpu; required_region_ptr<u8> m_p_chargen; @@ -117,7 +117,7 @@ void rc702_state::rc702_io(address_map &map) map(0x0c, 0x0f).rw(m_ctc1, FUNC(z80ctc_device::read), FUNC(z80ctc_device::write)); map(0x10, 0x13).rw(m_pio, FUNC(z80pio_device::read), FUNC(z80pio_device::write)); map(0x14, 0x17).portr("DSW").w(FUNC(rc702_state::port14_w)); // motors - map(0x18, 0x1b).w(FUNC(rc702_state::port18_w)); // memory banking + map(0x18, 0x1b).lw8("banking",[this](u8 data){membank("bankr0")->set_entry(1);}); // replace roms with ram map(0x1c, 0x1f).w(FUNC(rc702_state::port1c_w)); // sound map(0xf0, 0xff).rw(m_dma, FUNC(am9517a_device::read), FUNC(am9517a_device::write)); } @@ -156,8 +156,8 @@ void rc702_state::machine_reset() membank("bankr0")->set_entry(0); // point at rom membank("bankw0")->set_entry(0); // always write to ram m_beepcnt = 0xffff; - m_dack = 0; - m_tc = 0; + m_dack1 = 0; + m_eop = 0; m_7474->preset_w(1); m_fdc->set_ready_line_connected(1); // always ready for minifloppy; controlled by fdc for 20cm m_fdc->set_unscaled_clock(4000000); // 4MHz for minifloppy; 8MHz for 20cm @@ -199,28 +199,32 @@ WRITE_LINE_MEMBER( rc702_state::crtc_drq_w ) m_dma->dreq2_w(0); } -WRITE_LINE_MEMBER( rc702_state::tc_w ) +WRITE_LINE_MEMBER( rc702_state::eop_w ) { - m_tc = state; - if ((m_dack == 1) && m_tc) - { - m_dack = 0; + if (state == m_eop) + return; + + m_eop = state; + + if (!m_eop && !m_dack1) m_fdc->tc_w(1); - } else m_fdc->tc_w(0); } WRITE_LINE_MEMBER( rc702_state::dack1_w ) { - m_dack = 1; - if ((m_dack == 1) && m_tc) - { - m_dack = 0; + if (state == m_dack1) + return; + + m_dack1 = state; + + if (!m_eop && !m_dack1) m_fdc->tc_w(1); - } else m_fdc->tc_w(0); + + //m_fdc->dack_w = state; // pin not emulated } WRITE8_MEMBER( rc702_state::port14_w ) @@ -230,15 +234,10 @@ WRITE8_MEMBER( rc702_state::port14_w ) floppy->mon_w(!BIT(data, 0)); } -WRITE8_MEMBER( rc702_state::port18_w ) -{ - membank("bankr0")->set_entry(1); // replace roms with ram -} - WRITE8_MEMBER( rc702_state::port1c_w ) { - m_beep->set_state(1); - m_beepcnt = 0x3000; + m_beep->set_state(1); + m_beepcnt = 0x3000; } // monitor is orange even when powered off @@ -292,23 +291,20 @@ WRITE_LINE_MEMBER( rc702_state::clock_w ) m_beepcnt--; } -WRITE_LINE_MEMBER( rc702_state::busreq_w ) +WRITE_LINE_MEMBER( rc702_state::hreq_w ) { -// since our Z80 has no support for BUSACK, we assume it is granted immediately - m_maincpu->set_input_line(Z80_INPUT_LINE_BUSRQ, state); + m_maincpu->set_input_line(INPUT_LINE_HALT, state ? ASSERT_LINE : CLEAR_LINE); m_dma->hack_w(state); // tell dma that bus has been granted } READ8_MEMBER( rc702_state::memory_read_byte ) { - address_space& prog_space = m_maincpu->space(AS_PROGRAM); - return prog_space.read_byte(offset); + return m_maincpu->space(AS_PROGRAM).read_byte(offset); } WRITE8_MEMBER( rc702_state::memory_write_byte ) { - address_space& prog_space = m_maincpu->space(AS_PROGRAM); - prog_space.write_byte(offset, data); + m_maincpu->space(AS_PROGRAM).write_byte(offset,data); } static const z80_daisy_config daisy_chain_intf[] = @@ -354,19 +350,19 @@ MACHINE_CONFIG_START(rc702_state::rc702) // m_pio->out_pb_callback().set(FUNC(rc702_state::portxx_w)); // parallel port AM9517A(config, m_dma, 8_MHz_XTAL / 2); - m_dma->out_hreq_callback().set(FUNC(rc702_state::busreq_w)); - m_dma->out_eop_callback().set(FUNC(rc702_state::tc_w)); // inverted + m_dma->out_hreq_callback().set(FUNC(rc702_state::hreq_w)); + m_dma->out_eop_callback().set(FUNC(rc702_state::eop_w)).invert(); // real line is active low, mame has it backwards m_dma->in_memr_callback().set(FUNC(rc702_state::memory_read_byte)); m_dma->out_memw_callback().set(FUNC(rc702_state::memory_write_byte)); m_dma->in_ior_callback<1>().set(m_fdc, FUNC(upd765a_device::mdma_r)); m_dma->out_iow_callback<1>().set(m_fdc, FUNC(upd765a_device::mdma_w)); m_dma->out_iow_callback<2>().set("crtc", FUNC(i8275_device::dack_w)); m_dma->out_iow_callback<3>().set("crtc", FUNC(i8275_device::dack_w)); - m_dma->out_dack_callback<1>().set(FUNC(rc702_state::dack1_w)); // inverted + m_dma->out_dack_callback<1>().set(FUNC(rc702_state::dack1_w)); - MCFG_UPD765A_ADD("fdc", false, true) - MCFG_UPD765_INTRQ_CALLBACK(WRITELINE("ctc1", z80ctc_device, trg3)) - MCFG_UPD765_DRQ_CALLBACK(WRITELINE("dma", am9517a_device, dreq1_w)) + UPD765A(config, m_fdc, true, true); + m_fdc->intrq_wr_callback().set(m_ctc1, FUNC(z80ctc_device::trg3)); + m_fdc->drq_wr_callback().set(m_dma, FUNC(am9517a_device::dreq1_w)); MCFG_FLOPPY_DRIVE_ADD("fdc:0", floppies, "525qd", floppy_image_device::default_floppy_formats) MCFG_FLOPPY_DRIVE_SOUND(true) diff --git a/src/mame/drivers/riscpc.cpp b/src/mame/drivers/riscpc.cpp index 0ccd9663b15..b08056fdbfa 100644 --- a/src/mame/drivers/riscpc.cpp +++ b/src/mame/drivers/riscpc.cpp @@ -196,10 +196,11 @@ void riscpc_state::vidc20_dynamic_screen_change() hblank_period = (m_vidc20_horz_reg[HCR] & 0x3ffc); vblank_period = (m_vidc20_vert_reg[VCR] & 0x3fff); /* note that we use the border registers as the visible area */ - visarea.min_x = (m_vidc20_horz_reg[HBSR] & 0x3ffe); - visarea.max_x = (m_vidc20_horz_reg[HBER] & 0x3ffe)-1; - visarea.min_y = (m_vidc20_vert_reg[VBSR] & 0x1fff); - visarea.max_y = (m_vidc20_vert_reg[VBER] & 0x1fff)-1; + visarea.set( + (m_vidc20_horz_reg[HBSR] & 0x3ffe), + (m_vidc20_horz_reg[HBER] & 0x3ffe) - 1, + (m_vidc20_vert_reg[VBSR] & 0x1fff), + (m_vidc20_vert_reg[VBER] & 0x1fff) - 1); m_screen->configure(hblank_period, vblank_period, visarea, m_screen->frame_period().attoseconds() ); logerror("VIDC20: successfully changed the screen to:\n Display Size = %d x %d\n Border Size %d x %d\n Cycle Period %d x %d\n", diff --git a/src/mame/drivers/rmnimbus.cpp b/src/mame/drivers/rmnimbus.cpp index 262f3799d3c..b28c37109a2 100644 --- a/src/mame/drivers/rmnimbus.cpp +++ b/src/mame/drivers/rmnimbus.cpp @@ -105,109 +105,112 @@ void rmnimbus_state::nimbus_iocpu_io(address_map &map) map(0x00000, 0x000FF).rw(FUNC(rmnimbus_state::nimbus_pc8031_iou_r), FUNC(rmnimbus_state::nimbus_pc8031_iou_w)); } -MACHINE_CONFIG_START(rmnimbus_state::nimbus) +void rmnimbus_state::nimbus(machine_config &config) +{ /* basic machine hardware */ - MCFG_DEVICE_ADD(m_maincpu, I80186, 16000000) // the cpu is a 10Mhz part but the serial clocks are wrong unless it runs at 8Mhz - MCFG_DEVICE_PROGRAM_MAP(nimbus_mem) - MCFG_DEVICE_IO_MAP(nimbus_io) - MCFG_80186_IRQ_SLAVE_ACK(READ8(*this, rmnimbus_state, cascade_callback)) - MCFG_80186_TMROUT0_HANDLER(WRITELINE(Z80SIO_TAG, z80dart_device, rxca_w)) - MCFG_80186_TMROUT1_HANDLER(WRITELINE(Z80SIO_TAG, z80dart_device, rxtxcb_w)) - - MCFG_DEVICE_ADD(IOCPU_TAG, I8031, 11059200) - MCFG_DEVICE_PROGRAM_MAP(nimbus_iocpu_mem) - MCFG_DEVICE_IO_MAP(nimbus_iocpu_io) - MCFG_MCS51_PORT_P1_IN_CB(READ8(*this, rmnimbus_state, nimbus_pc8031_port1_r)) - MCFG_MCS51_PORT_P1_OUT_CB(WRITE8(*this, rmnimbus_state, nimbus_pc8031_port1_w)) - MCFG_MCS51_PORT_P3_IN_CB(READ8(*this, rmnimbus_state, nimbus_pc8031_port3_r)) - MCFG_MCS51_PORT_P3_OUT_CB(WRITE8(*this, rmnimbus_state, nimbus_pc8031_port3_w)) + I80186(config, m_maincpu, 16000000); // the cpu is a 10Mhz part but the serial clocks are wrong unless it runs at 8Mhz + m_maincpu->set_addrmap(AS_PROGRAM, &rmnimbus_state::nimbus_mem); + m_maincpu->set_addrmap(AS_IO, &rmnimbus_state::nimbus_io); + m_maincpu->read_slave_ack_callback().set(FUNC(rmnimbus_state::cascade_callback)); + m_maincpu->tmrout0_handler().set(Z80SIO_TAG, FUNC(z80dart_device::rxca_w)); + m_maincpu->tmrout1_handler().set(Z80SIO_TAG, FUNC(z80dart_device::rxtxcb_w)); + + I8031(config, m_iocpu, 11059200); + m_iocpu->set_addrmap(AS_PROGRAM, &rmnimbus_state::nimbus_iocpu_mem); + m_iocpu->set_addrmap(AS_IO, &rmnimbus_state::nimbus_iocpu_io); + m_iocpu->port_in_cb<1>().set(FUNC(rmnimbus_state::nimbus_pc8031_port1_r)); + m_iocpu->port_out_cb<1>().set(FUNC(rmnimbus_state::nimbus_pc8031_port1_w)); + m_iocpu->port_in_cb<3>().set(FUNC(rmnimbus_state::nimbus_pc8031_port3_r)); + m_iocpu->port_out_cb<3>().set(FUNC(rmnimbus_state::nimbus_pc8031_port3_w)); /* video hardware */ - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_RAW_PARAMS(4.433619_MHz_XTAL * 2,650,0,640,260,0,250) - MCFG_SCREEN_UPDATE_DRIVER(rmnimbus_state, screen_update_nimbus) + SCREEN(config, m_screen, SCREEN_TYPE_RASTER); + m_screen->set_raw(4.433619_MHz_XTAL * 2, 650, 0, 640, 260, 0, 250); + m_screen->set_screen_update(FUNC(rmnimbus_state::screen_update_nimbus)); //MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_SCANLINE) - MCFG_SCREEN_PALETTE("palette") + m_screen->set_palette(m_palette); - MCFG_PALETTE_ADD("palette", 16) + PALETTE(config, m_palette, 16); /* Backing storage */ - MCFG_DEVICE_ADD(FDC_TAG, WD2793, 1000000) - MCFG_WD_FDC_FORCE_READY - MCFG_WD_FDC_INTRQ_CALLBACK(WRITELINE(*this, rmnimbus_state,nimbus_fdc_intrq_w)) - MCFG_WD_FDC_DRQ_CALLBACK(WRITELINE(*this, rmnimbus_state,nimbus_fdc_drq_w)) - MCFG_FLOPPY_DRIVE_ADD(FDC_TAG":0", rmnimbus_floppies, "35dd", isa8_fdc_device::floppy_formats) - MCFG_FLOPPY_DRIVE_ADD(FDC_TAG":1", rmnimbus_floppies, "35dd", isa8_fdc_device::floppy_formats) - - MCFG_DEVICE_ADD(SCSIBUS_TAG, SCSI_PORT, 0) - MCFG_SCSI_DATA_INPUT_BUFFER("scsi_data_in") - MCFG_SCSI_MSG_HANDLER(WRITELINE(*this, rmnimbus_state, write_scsi_msg)) - MCFG_SCSI_BSY_HANDLER(WRITELINE(*this, rmnimbus_state, write_scsi_bsy)) - MCFG_SCSI_IO_HANDLER(WRITELINE(*this, rmnimbus_state, write_scsi_io)) - MCFG_SCSI_CD_HANDLER(WRITELINE(*this, rmnimbus_state, write_scsi_cd)) - MCFG_SCSI_REQ_HANDLER(WRITELINE(*this, rmnimbus_state, write_scsi_req)) - - MCFG_SCSIDEV_ADD(SCSIBUS_TAG ":" SCSI_PORT_DEVICE1, "harddisk", SCSIHD, SCSI_ID_0) - MCFG_SCSIDEV_ADD(SCSIBUS_TAG ":" SCSI_PORT_DEVICE2, "harddisk", SCSIHD, SCSI_ID_1) - MCFG_SCSIDEV_ADD(SCSIBUS_TAG ":" SCSI_PORT_DEVICE3, "harddisk", ACB4070, SCSI_ID_2) - MCFG_SCSIDEV_ADD(SCSIBUS_TAG ":" SCSI_PORT_DEVICE4, "harddisk", S1410, SCSI_ID_3) - - MCFG_SCSI_OUTPUT_LATCH_ADD("scsi_data_out", SCSIBUS_TAG) - MCFG_DEVICE_ADD("scsi_data_in", INPUT_BUFFER, 0) - - MCFG_DEVICE_ADD("scsi_ctrl_out", OUTPUT_LATCH, 0) - MCFG_OUTPUT_LATCH_BIT0_HANDLER(WRITELINE(SCSIBUS_TAG, scsi_port_device, write_rst)) - MCFG_OUTPUT_LATCH_BIT1_HANDLER(WRITELINE(SCSIBUS_TAG, scsi_port_device, write_sel)) - MCFG_OUTPUT_LATCH_BIT2_HANDLER(WRITELINE(*this, rmnimbus_state, write_scsi_iena)) - - MCFG_RAM_ADD(RAM_TAG) - MCFG_RAM_DEFAULT_SIZE("1536K") - MCFG_RAM_EXTRA_OPTIONS("128K,256K,384K,512K,640K,1024K") + WD2793(config, m_fdc, 1000000); + m_fdc->set_force_ready(true); + m_fdc->intrq_wr_callback().set(FUNC(rmnimbus_state::nimbus_fdc_intrq_w)); + m_fdc->drq_wr_callback().set(FUNC(rmnimbus_state::nimbus_fdc_drq_w)); + FLOPPY_CONNECTOR(config, FDC_TAG":0", rmnimbus_floppies, "35dd", isa8_fdc_device::floppy_formats); + FLOPPY_CONNECTOR(config, FDC_TAG":1", rmnimbus_floppies, "35dd", isa8_fdc_device::floppy_formats); + + SCSI_PORT(config, m_scsibus); + m_scsibus->set_data_input_buffer("scsi_data_in"); + m_scsibus->msg_handler().set(FUNC(rmnimbus_state::write_scsi_msg)); + m_scsibus->bsy_handler().set(FUNC(rmnimbus_state::write_scsi_bsy)); + m_scsibus->io_handler().set(FUNC(rmnimbus_state::write_scsi_io)); + m_scsibus->cd_handler().set(FUNC(rmnimbus_state::write_scsi_cd)); + m_scsibus->req_handler().set(FUNC(rmnimbus_state::write_scsi_req)); + + m_scsibus->set_slot_device(1, "harddisk", SCSIHD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_0)); + m_scsibus->set_slot_device(2, "harddisk", SCSIHD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_1)); + m_scsibus->set_slot_device(3, "harddisk", ACB4070, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_2)); + m_scsibus->set_slot_device(4, "harddisk", S1410, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_3)); + + OUTPUT_LATCH(config, m_scsi_data_out); + m_scsibus->set_output_latch(*m_scsi_data_out); + + INPUT_BUFFER(config, m_scsi_data_in); + + OUTPUT_LATCH(config, m_scsi_ctrl_out); + m_scsi_ctrl_out->bit_handler<0>().set(m_scsibus, FUNC(scsi_port_device::write_rst)); + m_scsi_ctrl_out->bit_handler<1>().set(m_scsibus, FUNC(scsi_port_device::write_sel)); + m_scsi_ctrl_out->bit_handler<2>().set(FUNC(rmnimbus_state::write_scsi_iena)); + + RAM(config, m_ram); + m_ram->set_default_size("1536K"); + m_ram->set_extra_options("128K,256K,384K,512K,640K,1024K"); /* Peripheral chips */ - MCFG_DEVICE_ADD(Z80SIO_TAG, Z80SIO2, 4000000) - MCFG_Z80DART_OUT_TXDB_CB(WRITELINE("rs232b", rs232_port_device, write_txd)) - MCFG_Z80DART_OUT_DTRB_CB(WRITELINE("rs232b", rs232_port_device, write_dtr)) - MCFG_Z80DART_OUT_RTSB_CB(WRITELINE("rs232b", rs232_port_device, write_rts)) - MCFG_Z80DART_OUT_INT_CB(WRITELINE(*this, rmnimbus_state, sio_interrupt)) + Z80SIO2(config, m_z80sio, 4000000); + m_z80sio->out_txdb_callback().set("rs232b", FUNC(rs232_port_device::write_txd)); + m_z80sio->out_dtrb_callback().set("rs232b", FUNC(rs232_port_device::write_dtr)); + m_z80sio->out_rtsb_callback().set("rs232b", FUNC(rs232_port_device::write_rts)); + m_z80sio->out_int_callback().set(FUNC(rmnimbus_state::sio_interrupt)); - MCFG_DEVICE_ADD("rs232a", RS232_PORT, keyboard, "rmnkbd") - MCFG_RS232_RXD_HANDLER(WRITELINE(Z80SIO_TAG, z80dart_device, rxa_w)) + rs232_port_device &rs232a(RS232_PORT(config, "rs232a", keyboard, "rmnkbd")); + rs232a.rxd_handler().set(Z80SIO_TAG, FUNC(z80dart_device::rxa_w)); - MCFG_DEVICE_ADD("rs232b", RS232_PORT, default_rs232_devices, nullptr) - MCFG_RS232_RXD_HANDLER(WRITELINE(Z80SIO_TAG, z80dart_device, rxb_w)) - MCFG_RS232_DCD_HANDLER(WRITELINE(Z80SIO_TAG, z80dart_device, dcdb_w)) - MCFG_RS232_RI_HANDLER(WRITELINE(Z80SIO_TAG, z80dart_device, rib_w)) - MCFG_RS232_CTS_HANDLER(WRITELINE(Z80SIO_TAG, z80dart_device, ctsb_w)) + rs232_port_device &rs232b(RS232_PORT(config, "rs232b", default_rs232_devices, nullptr)); + rs232b.rxd_handler().set(Z80SIO_TAG, FUNC(z80dart_device::rxb_w)); + rs232b.dcd_handler().set(Z80SIO_TAG, FUNC(z80dart_device::dcdb_w)); + rs232b.ri_handler().set(Z80SIO_TAG, FUNC(z80dart_device::rib_w)); + rs232b.cts_handler().set(Z80SIO_TAG, FUNC(z80dart_device::ctsb_w)); - MCFG_DEVICE_ADD(ER59256_TAG, EEPROM_SERIAL_93C06_16BIT) + EEPROM_SERIAL_93C06_16BIT(config, m_eeprom); - MCFG_DEVICE_ADD(VIA_TAG, VIA6522, 1000000) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8("cent_data_out", output_latch_device, bus_w)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, rmnimbus_state,nimbus_via_write_portb)) - MCFG_VIA6522_CA2_HANDLER(WRITELINE(m_centronics, centronics_device, write_strobe)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(m_maincpu, i80186_cpu_device, int3_w)) + VIA6522(config, m_via, 1000000); + m_via->writepa_handler().set("cent_data_out", FUNC(output_latch_device::bus_w)); + m_via->writepb_handler().set(FUNC(rmnimbus_state::nimbus_via_write_portb)); + m_via->ca2_handler().set(m_centronics, FUNC(centronics_device::write_strobe)); + m_via->irq_handler().set(m_maincpu, FUNC(i80186_cpu_device::int3_w)); CENTRONICS(config, m_centronics, centronics_devices, "printer"); m_centronics->ack_handler().set(m_via, FUNC(via6522_device::write_ca1)).invert(); - MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics") + output_latch_device ¢_data(OUTPUT_LATCH(config, "cent_data_out")); + m_centronics->set_output_latch(cent_data); /* sound hardware */ SPEAKER(config, MONO_TAG).front_center(); - MCFG_DEVICE_ADD(AY8910_TAG, AY8910, 2000000) - MCFG_AY8910_PORT_A_WRITE_CB(WRITE8(*this, rmnimbus_state, nimbus_sound_ay8910_porta_w)) - MCFG_AY8910_PORT_B_WRITE_CB(WRITE8(*this, rmnimbus_state, nimbus_sound_ay8910_portb_w)) - MCFG_SOUND_ROUTE(ALL_OUTPUTS,MONO_TAG, 0.75) - - MCFG_DEVICE_ADD(MSM5205_TAG, MSM5205, 384000) - MCFG_MSM5205_VCLK_CB(WRITELINE(*this, rmnimbus_state, nimbus_msm5205_vck)) /* VCK function */ - MCFG_MSM5205_PRESCALER_SELECTOR(S48_4B) /* 8 kHz */ - MCFG_SOUND_ROUTE(ALL_OUTPUTS, MONO_TAG, 0.75) - - /* Software list */ - MCFG_SOFTWARE_LIST_ADD("disk_list","nimbus") -MACHINE_CONFIG_END + ay8910_device &ay8910(AY8910(config, AY8910_TAG, 2000000)); + ay8910.port_a_write_callback().set(FUNC(rmnimbus_state::nimbus_sound_ay8910_porta_w)); + ay8910.port_b_write_callback().set(FUNC(rmnimbus_state::nimbus_sound_ay8910_portb_w)); + ay8910.add_route(ALL_OUTPUTS, MONO_TAG, 0.75); + + msm5205_device &msm5205(MSM5205(config, MSM5205_TAG, 384000)); + msm5205.vck_callback().set(FUNC(rmnimbus_state::nimbus_msm5205_vck)); /* VCK function */ + msm5205.set_prescaler_selector(msm5205_device::S48_4B); /* 8 kHz */ + msm5205.add_route(ALL_OUTPUTS, MONO_TAG, 0.75); + + SOFTWARE_LIST(config, "disk_list").set_type("nimbus", SOFTWARE_LIST_ORIGINAL_SYSTEM); +} ROM_START( nimbus ) diff --git a/src/mame/drivers/rohga.cpp b/src/mame/drivers/rohga.cpp index 4a99049c2f1..8005b40fb35 100644 --- a/src/mame/drivers/rohga.cpp +++ b/src/mame/drivers/rohga.cpp @@ -314,8 +314,6 @@ void rohga_state::sound_map(address_map &map) map(0x130000, 0x130001).rw("oki2", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); map(0x140000, 0x140000).r(m_ioprot, FUNC(deco_146_base_device::soundlatch_r)); map(0x1f0000, 0x1f1fff).ram(); - map(0x1fec00, 0x1fec01).rw(m_audiocpu, FUNC(h6280_device::timer_r), FUNC(h6280_device::timer_w)).mirror(0x3fe); - map(0x1ff400, 0x1ff403).rw(m_audiocpu, FUNC(h6280_device::irq_status_r), FUNC(h6280_device::irq_status_w)).mirror(0x3fc); } @@ -880,8 +878,10 @@ MACHINE_CONFIG_START(rohga_state::rohga) MCFG_DEVICE_PROGRAM_MAP(rohga_map) MCFG_DEVICE_VBLANK_INT_DRIVER("screen", rohga_state, irq6_line_assert) - MCFG_DEVICE_ADD("audiocpu", H6280, 32220000/4/3) /* verified on pcb (8.050Mhz is XIN on pin 10 of H6280 */ - MCFG_DEVICE_PROGRAM_MAP(sound_map) + H6280(config, m_audiocpu, 32220000/4/3); /* verified on pcb (8.050Mhz is XIN on pin 10 of H6280 */ + m_audiocpu->set_addrmap(AS_PROGRAM, &rohga_state::sound_map); + m_audiocpu->add_route(ALL_OUTPUTS, "lspeaker", 0); // internal sound unused + m_audiocpu->add_route(ALL_OUTPUTS, "rspeaker", 0); /* video hardware */ MCFG_DEVICE_ADD("spriteram1", BUFFERED_SPRITERAM16) @@ -970,8 +970,10 @@ MACHINE_CONFIG_START(rohga_state::wizdfire) MCFG_DEVICE_PROGRAM_MAP(wizdfire_map) MCFG_DEVICE_VBLANK_INT_DRIVER("screen", rohga_state, irq6_line_assert) - MCFG_DEVICE_ADD("audiocpu", H6280,32220000/4/3) /* verified on pcb (8.050Mhz is XIN on pin 10 of H6280 */ - MCFG_DEVICE_PROGRAM_MAP(sound_map) + H6280(config, m_audiocpu, 32220000/4/3); /* verified on pcb (8.050Mhz is XIN on pin 10 of H6280 */ + m_audiocpu->set_addrmap(AS_PROGRAM, &rohga_state::sound_map); + m_audiocpu->add_route(ALL_OUTPUTS, "lspeaker", 0); // internal sound unused + m_audiocpu->add_route(ALL_OUTPUTS, "rspeaker", 0); /* video hardware */ MCFG_DEVICE_ADD("spriteram1", BUFFERED_SPRITERAM16) @@ -1065,8 +1067,10 @@ MACHINE_CONFIG_START(rohga_state::nitrobal) MCFG_DEVICE_PROGRAM_MAP(nitrobal_map) MCFG_DEVICE_VBLANK_INT_DRIVER("screen", rohga_state, irq6_line_assert) - MCFG_DEVICE_ADD("audiocpu", H6280,32220000/4/3) /* verified on pcb (8.050Mhz is XIN on pin 10 of H6280 */ - MCFG_DEVICE_PROGRAM_MAP(sound_map) + H6280(config, m_audiocpu, 32220000/4/3); /* verified on pcb (8.050Mhz is XIN on pin 10 of H6280 */ + m_audiocpu->set_addrmap(AS_PROGRAM, &rohga_state::sound_map); + m_audiocpu->add_route(ALL_OUTPUTS, "lspeaker", 0); // internal sound unused + m_audiocpu->add_route(ALL_OUTPUTS, "rspeaker", 0); /* video hardware */ MCFG_DEVICE_ADD("spriteram1", BUFFERED_SPRITERAM16) @@ -1161,8 +1165,10 @@ MACHINE_CONFIG_START(rohga_state::schmeisr) MCFG_DEVICE_PROGRAM_MAP(schmeisr_map) MCFG_DEVICE_VBLANK_INT_DRIVER("screen", rohga_state, irq6_line_assert) - MCFG_DEVICE_ADD("audiocpu", H6280,32220000/4/3) /* verified on pcb (8.050Mhz is XIN on pin 10 of H6280 */ - MCFG_DEVICE_PROGRAM_MAP(sound_map) + H6280(config, m_audiocpu, 32220000/4/3); /* verified on pcb (8.050Mhz is XIN on pin 10 of H6280 */ + m_audiocpu->set_addrmap(AS_PROGRAM, &rohga_state::sound_map); + m_audiocpu->add_route(ALL_OUTPUTS, "lspeaker", 0); // internal sound unused + m_audiocpu->add_route(ALL_OUTPUTS, "rspeaker", 0); /* video hardware */ MCFG_DEVICE_ADD("spriteram1", BUFFERED_SPRITERAM16) diff --git a/src/mame/drivers/sbrkout.cpp b/src/mame/drivers/sbrkout.cpp index a4f68428d88..3ad241a169a 100644 --- a/src/mame/drivers/sbrkout.cpp +++ b/src/mame/drivers/sbrkout.cpp @@ -182,7 +182,7 @@ TIMER_CALLBACK_MEMBER(sbrkout_state::scanline_callback) m_dac->write((videoram[0x380 + 0x11] & (scanline >> 2)) != 0); /* on the VBLANK, read the pot and schedule an interrupt time for it */ - if (scanline == m_screen->visible_area().max_y + 1) + if (scanline == m_screen->visible_area().bottom() + 1) { uint8_t potvalue = ioport("PADDLE")->read(); m_pot_timer->adjust(m_screen->time_until_pos(56 + (potvalue / 2), (potvalue % 2) * 128)); @@ -322,7 +322,7 @@ WRITE_LINE_MEMBER(sbrkout_state::coincount_w) READ8_MEMBER(sbrkout_state::sync_r) { int hpos = m_screen->hpos(); - m_sync2_value = (hpos >= 128 && hpos <= m_screen->visible_area().max_x); + m_sync2_value = (hpos >= 128 && hpos <= m_screen->visible_area().right()); return m_screen->vpos(); } diff --git a/src/mame/drivers/segam1.cpp b/src/mame/drivers/segam1.cpp index 0d8faf3d455..6894a9183ae 100644 --- a/src/mame/drivers/segam1.cpp +++ b/src/mame/drivers/segam1.cpp @@ -375,8 +375,8 @@ MACHINE_CONFIG_START(segam1_state::segam1) MCFG_DEVICE_ADD("uart", I8251, 4000000) // unknown clock - MCFG_DEVICE_ADD("dpram", MB8421, 0) - MCFG_MB8421_INTL_HANDLER(INPUTLINE("m1comm", 0)) + mb8421_device &dpram(MB8421(config, "dpram")); + dpram.intl_callback().set_inputline("m1comm", 0); MCFG_DEVICE_ADD("tile", S24TILE, 0, 0x3fff) MCFG_GFX_PALETTE("palette") diff --git a/src/mame/drivers/segas32.cpp b/src/mame/drivers/segas32.cpp index 816fe716bcc..8b537033656 100644 --- a/src/mame/drivers/segas32.cpp +++ b/src/mame/drivers/segas32.cpp @@ -2490,10 +2490,10 @@ MACHINE_CONFIG_START(segas32_cd_state::device_add_mconfig) MCFG_DEVICE_MODIFY("maincpu") MCFG_DEVICE_PROGRAM_MAP(system32_cd_map) - MCFG_DEVICE_ADD("mb89352", MB89352A, 8000000) - MCFG_LEGACY_SCSI_PORT("scsi") - MCFG_MB89352A_IRQ_CB(WRITELINE(*this, segas32_cd_state, scsi_irq_w)) - MCFG_MB89352A_DRQ_CB(WRITELINE(*this, segas32_cd_state, scsi_drq_w)) + mb89352_device &scsictrl(MB89352A(config, "mb89352", 8000000)); + scsictrl.set_scsi_port("scsi"); + scsictrl.irq_cb().set(FUNC(segas32_cd_state::scsi_irq_w)); + scsictrl.drq_cb().set(FUNC(segas32_cd_state::scsi_drq_w)); MCFG_DEVICE_ADD("scsi", SCSI_PORT, 0) MCFG_SCSIDEV_ADD("scsi:" SCSI_PORT_DEVICE1, "cdrom", SCSICD, SCSI_ID_0) diff --git a/src/mame/drivers/segasp.cpp b/src/mame/drivers/segasp.cpp index c3a7304ecce..51edcb4fe0d 100644 --- a/src/mame/drivers/segasp.cpp +++ b/src/mame/drivers/segasp.cpp @@ -38,7 +38,7 @@ todo: make this actually readable, we don't support unicode source files Title PCB ID REV CFID Dumped Region PIC MAIN BD Serial Battle Police ???-????? no ???-????-???? AAFE-xxxxxxxxxxx Beetle DASH!! ???-????? no ???-????-???? AAFE-xxxxxxxxxxx -Bingo Galaxy ???-????? no ???-????-???? AAFE-01E10924916, AAFE-01D67304905, Medal +Bingo Galaxy 834-14788 no ???-????-???? AAFE-01E10924916, AAFE-01D67304905, Medal Bingo Parade ???-????? no ???-????-???? AAFE-xxxxxxxxxxx, Medal Brick People / Block People 834-14881 ROM ANY 253-5508-0558 AAFE-01F67905202, AAFE-01F68275202 Dinosaur King 834-14493-01 D ROM US 253-5508-0408 AAFE-01D1132xxxx, AAFE-01D15924816 diff --git a/src/mame/drivers/segaybd.cpp b/src/mame/drivers/segaybd.cpp index c28e78354c4..e62a912694c 100644 --- a/src/mame/drivers/segaybd.cpp +++ b/src/mame/drivers/segaybd.cpp @@ -1363,9 +1363,9 @@ MACHINE_CONFIG_START(segaybd_state::yboard_link) MCFG_DEVICE_PROGRAM_MAP(link_map) MCFG_DEVICE_IO_MAP(link_portmap) - MCFG_DEVICE_ADD("mb8421", MB8421, 0) - MCFG_MB8421_INTL_HANDLER(WRITELINE(*this, segaybd_state, mb8421_intl)) - MCFG_MB8421_INTR_HANDLER(WRITELINE(*this, segaybd_state, mb8421_intr)) + mb8421_device &mb8421(MB8421(config, "mb8421")); + mb8421.intl_callback().set(FUNC(segaybd_state::mb8421_intl)); + mb8421.intr_callback().set(FUNC(segaybd_state::mb8421_intr)); MACHINE_CONFIG_END MACHINE_CONFIG_START(segaybd_state::yboard_deluxe) diff --git a/src/mame/drivers/seta.cpp b/src/mame/drivers/seta.cpp index afd51713a74..7b1e267a5b9 100644 --- a/src/mame/drivers/seta.cpp +++ b/src/mame/drivers/seta.cpp @@ -1763,7 +1763,7 @@ void seta_state::calibr50_map(address_map &map) { map(0x000000, 0x09ffff).rom(); // ROM map(0x100000, 0x100001).r(FUNC(seta_state::ipl2_ack_r)); - map(0x200000, 0x200fff).ram(); // NVRAM + map(0x200000, 0x200fff).ram().share("nvram"); // NVRAM (battery backed) map(0x300000, 0x300001).rw(FUNC(seta_state::ipl1_ack_r), FUNC(seta_state::ipl1_ack_w)); map(0x400000, 0x400001).r("watchdog", FUNC(watchdog_timer_device::reset16_r)); map(0x500000, 0x500001).nopw(); // ? @@ -1831,7 +1831,7 @@ WRITE8_MEMBER(seta_state::usclssic_lockout_w) machine().tilemap().mark_all_dirty(); m_tiles_offset = tiles_offset; - seta_coin_lockout_w(space, 0, data); + seta_coin_lockout_w(data); } @@ -3417,15 +3417,15 @@ void jockeyc_state::inttoote_map(address_map &map) ***************************************************************************/ -WRITE8_MEMBER(seta_state::sub_bankswitch_w) +void seta_state::sub_bankswitch_w(u8 data) { m_subbank->set_entry(data >> 4); } -WRITE8_MEMBER(seta_state::sub_bankswitch_lockout_w) +void seta_state::sub_bankswitch_lockout_w(u8 data) { - m_subbank->set_entry(data >> 4); - seta_coin_lockout_w(space, 0, data); + sub_bankswitch_w(data); + seta_coin_lockout_w(data); } @@ -3528,7 +3528,7 @@ MACHINE_RESET_MEMBER(seta_state,calibr50) WRITE8_MEMBER(seta_state::calibr50_sub_bankswitch_w) { // Bits 7-4: BK3-BK0 - sub_bankswitch_w(space, 0, data); + sub_bankswitch_w(data); // Bit 3: NMICLR if (!BIT(data, 3)) @@ -3539,6 +3539,7 @@ WRITE8_MEMBER(seta_state::calibr50_sub_bankswitch_w) m_subcpu->set_input_line(0, CLEAR_LINE); // Bit 1: PCMMUTE + m_x1->set_output_gain(ALL_OUTPUTS, BIT(data, 0) ? 0.0f : 1.0f); } WRITE8_MEMBER(seta_state::calibr50_soundlatch2_w) @@ -3549,7 +3550,9 @@ WRITE8_MEMBER(seta_state::calibr50_soundlatch2_w) void seta_state::calibr50_sub_map(address_map &map) { - map(0x0000, 0x1fff).rw(m_x1, FUNC(x1_010_device::read), FUNC(x1_010_device::write)); // Sound + map(0x0000, 0x1fff).lrw8("x1_soundram_rw", + [this](offs_t offset) { return m_x1->read(offset ^ 0x1000); }, + [this](offs_t offset, u8 data) { m_x1->write(offset ^ 0x1000, data); }); // Sound map(0x4000, 0x4000).r("soundlatch1", FUNC(generic_latch_8_device::read)); // From Main CPU map(0x4000, 0x4000).w(FUNC(seta_state::calibr50_sub_bankswitch_w)); // Bankswitching map(0x8000, 0xbfff).bankr("subbank"); // Banked ROM @@ -7927,7 +7930,7 @@ MACHINE_CONFIG_START(seta_state::twineagl) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(60) + MCFG_SCREEN_REFRESH_RATE(57.42) // Possibly lower than 60Hz, Correct? MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 1*8, 31*8-1) @@ -8030,6 +8033,7 @@ MACHINE_CONFIG_START(seta_state::usclssic) MCFG_DEVICE_ADD("maincpu", M68000, 16000000/2) /* 8 MHz */ MCFG_DEVICE_PROGRAM_MAP(usclssic_map) MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", seta_state, calibr50_interrupt, "screen", 0, 1) + MCFG_WATCHDOG_ADD("watchdog") MCFG_DEVICE_ADD("sub", M65C02, 16000000/8) /* 2 MHz */ @@ -8077,7 +8081,6 @@ MACHINE_CONFIG_START(seta_state::usclssic) MCFG_GENERIC_LATCH_SEPARATE_ACKNOWLEDGE(true) MCFG_DEVICE_ADD("x1snd", X1_010, 16000000) /* 16 MHz */ - MCFG_X1_010_ADDRESS_XOR(0x1000) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) MACHINE_CONFIG_END @@ -8097,8 +8100,11 @@ MACHINE_CONFIG_START(seta_state::calibr50) MCFG_DEVICE_ADD("maincpu", M68000, XTAL(16'000'000)/2) /* verified on pcb */ MCFG_DEVICE_PROGRAM_MAP(calibr50_map) MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", seta_state, calibr50_interrupt, "screen", 0, 1) + MCFG_WATCHDOG_ADD("watchdog") + MCFG_NVRAM_ADD_0FILL("nvram") + MCFG_DEVICE_ADD("sub", M65C02, XTAL(16'000'000)/8) /* verified on pcb */ MCFG_DEVICE_PROGRAM_MAP(calibr50_sub_map) MCFG_DEVICE_PERIODIC_INT_DRIVER(seta_state, irq0_line_assert, 4*60) // IRQ: 4/frame @@ -8137,7 +8143,6 @@ MACHINE_CONFIG_START(seta_state::calibr50) MCFG_GENERIC_LATCH_8_ADD("soundlatch2") MCFG_DEVICE_ADD("x1snd", X1_010, 16000000) /* 16 MHz */ - MCFG_X1_010_ADDRESS_XOR(0x1000) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) MACHINE_CONFIG_END @@ -12112,7 +12117,7 @@ GAME( 1989, downtownp, downtown, downtown, downtown, seta_state, init_down GAME( 1989, usclssic, 0, usclssic, usclssic, seta_state, init_bank6502, ROT270, "Seta", "U.S. Classic" , 0) // Country/License: DSW -GAME( 1989, calibr50, 0, calibr50, calibr50, seta_state, init_bank6502, ROT270, "Athena / Seta", "Caliber 50" , 0) // Country/License: DSW +GAME( 1989, calibr50, 0, calibr50, calibr50, seta_state, init_bank6502, ROT270, "Athena / Seta", "Caliber 50 (Ver. 1.01)" , 0) // Country/License: DSW GAME( 1989, arbalest, 0, metafox, arbalest, seta_state, init_arbalest, ROT270, "Seta", "Arbalester" , 0) // Country/License: DSW diff --git a/src/mame/drivers/sorcerer.cpp b/src/mame/drivers/sorcerer.cpp index ba9b36cc6a2..e1264b8adc8 100644 --- a/src/mame/drivers/sorcerer.cpp +++ b/src/mame/drivers/sorcerer.cpp @@ -538,6 +538,9 @@ ROM_START(sorcerer2) ROM_SYSTEM_BIOS(1, "tvc", "TVI-MON-C-V1.5") ROMX_LOAD("tvc-1.1e", 0xe000, 0x0800, CRC(efc15a18) SHA1(3dee821270a0d83453b18baed88a024dfd0d7a6c), ROM_BIOS(1) ) ROMX_LOAD("tvc-2.2e", 0xe800, 0x0800, CRC(bc194487) SHA1(dcfd916558e3e3be22091c5558ea633c332cf6c7), ROM_BIOS(1) ) + ROM_SYSTEM_BIOS(2, "dwmon", "DWMON 2.2C") + ROMX_LOAD("dwmon.1e", 0xe000, 0x0800, CRC(a22db498) SHA1(ebedbce7454007f5a02fafe449fd09169173d7b3), ROM_BIOS(2) ) + ROMX_LOAD("dwmon.2e", 0xe800, 0x0800, CRC(7b22b65a) SHA1(7f23dd308f34b6d795d6df06f2387dfd17f69edd), ROM_BIOS(2) ) ROM_END /* YEAR NAME PARENT COMPAT MACHINE INPUT STATE INIT COMPANY FULLNAME */ diff --git a/src/mame/drivers/spectra.cpp b/src/mame/drivers/spectra.cpp index f150554d0f6..ea512f79daf 100644 --- a/src/mame/drivers/spectra.cpp +++ b/src/mame/drivers/spectra.cpp @@ -234,12 +234,12 @@ MACHINE_CONFIG_START(spectra_state::spectra) MCFG_DEVICE_ADD("maincpu", M6502, XTAL(3'579'545)/4) // actually a M6503 MCFG_DEVICE_PROGRAM_MAP(spectra_map) - MCFG_DEVICE_ADD("riot", RIOT6532, XTAL(3'579'545)/4) - MCFG_RIOT6532_IN_PA_CB(READ8(*this, spectra_state, porta_r)) - MCFG_RIOT6532_OUT_PA_CB(WRITE8(*this, spectra_state, porta_w)) - MCFG_RIOT6532_IN_PB_CB(READ8(*this, spectra_state, portb_r)) - MCFG_RIOT6532_OUT_PB_CB(WRITE8(*this, spectra_state, portb_w)) - MCFG_RIOT6532_IRQ_CB(INPUTLINE("maincpu", M6502_IRQ_LINE)) + riot6532_device &riot(RIOT6532(config, "riot", XTAL(3'579'545)/4)); + riot.in_pa_callback().set(FUNC(spectra_state::porta_r)); + riot.out_pa_callback().set(FUNC(spectra_state::porta_w)); + riot.in_pb_callback().set(FUNC(spectra_state::portb_r)); + riot.out_pb_callback().set(FUNC(spectra_state::portb_w)); + riot.irq_callback().set_inputline("maincpu", M6502_IRQ_LINE); MCFG_NVRAM_ADD_1FILL("nvram") diff --git a/src/mame/drivers/spectrum.cpp b/src/mame/drivers/spectrum.cpp index 1f7ac2e42a0..1a9f966a8e5 100644 --- a/src/mame/drivers/spectrum.cpp +++ b/src/mame/drivers/spectrum.cpp @@ -905,6 +905,12 @@ ROM_END /* Russian clones */ +ROM_START( bk08 ) + ROM_REGION(0x10000,"maincpu",0) + ROM_LOAD( "right.bin", 0x0000, 0x2000, CRC(fb253544) SHA1(6b79487e3013d0acdea8d224b21c937e88105a2f) ) + ROM_LOAD( "left.bin", 0x2000, 0x2000, CRC(a092b5f3) SHA1(06b8d98a398f61daf6604c68bcee4596c283c2cd) ) +ROM_END + ROM_START(blitzs) ROM_REGION(0x10000,"maincpu",0) ROM_LOAD("blitz.rom",0x0000,0x4000, CRC(91e535a8) SHA1(14f09d45dc3803cbdb05c33adb28eb12dbad9dd0)) @@ -940,6 +946,11 @@ ROM_START(spektrbk) ROM_LOAD("spektr-bk001.rom", 0x0000, 0x4000, CRC(c011eecc) SHA1(35fdc8cd083e50452655997a997873627b131520)) ROM_END +ROM_START(sintez2) + ROM_REGION(0x10000,"maincpu",0) + ROM_LOAD( "sntez2.bin", 0x000000, 0x004000, CRC(490ded3a) SHA1(a1c6c18e1d93761c0891291ec75191f54929ed7b) ) +ROM_END + ROM_START(zvezda) ROM_REGION(0x10000,"maincpu",0) ROM_LOAD( "2764-near-cpu_red.bin", 0x0000, 0x2000, CRC(a4ae4938) SHA1(ea1763b9dee29381ddcf882fbc4e404ba5366942)) @@ -971,6 +982,7 @@ COMP( 1992, didakm92, spectrum, 0, spectrum, spec_plus, spectrum_state, ini COMP( 1992, didaktk, spectrum, 0, spectrum, spec_plus, spectrum_state, init_spectrum, "Didaktik Skalica", "Didaktik Kompakt", 0 ) COMP( 1993, didakm93, spectrum, 0, spectrum, spec_plus, spectrum_state, init_spectrum, "Didaktik Skalica", "Didaktik M 93", 0 ) COMP( 1988, mistrum, spectrum, 0, spectrum, spectrum, spectrum_state, init_spectrum, "Amaterske RADIO", "Mistrum", 0 ) // keyboard could be spectrum in some models (since it was a build-yourself design) +COMP( 198?, bk08, spectrum, 0, spectrum, spectrum, spectrum_state, init_spectrum, "Orel", "BK-08", 0 ) COMP( 1990, blitzs, spectrum, 0, spectrum, spectrum, spectrum_state, init_spectrum, "<unknown>", "Blic", 0 ) // no keyboard images found COMP( 1990, byte, spectrum, 0, spectrum, spectrum, spectrum_state, init_spectrum, "<unknown>", "Byte", 0 ) // no keyboard images found COMP( 199?, orizon, spectrum, 0, spectrum, spectrum, spectrum_state, init_spectrum, "<unknown>", "Orizon-Micro", 0 ) // no keyboard images found @@ -978,4 +990,5 @@ COMP( 1993, quorum48, spectrum, 0, spectrum, spectrum, spectrum_state, ini COMP( 1993, magic6, spectrum, 0, spectrum, spectrum, spectrum_state, init_spectrum, "<unknown>", "Magic 6", MACHINE_NOT_WORKING ) // keyboard should be spectrum, but image was not clear COMP( 1990, compani1, spectrum, 0, spectrum, spectrum, spectrum_state, init_spectrum, "<unknown>", "Kompanion 1", 0 ) // no keyboard images found COMP( 1990, spektrbk, spectrum, 0, spectrum, spectrum, spectrum_state, init_spectrum, "<unknown>", "Spektr BK-001", 0 ) +COMP( 1989, sintez2, spectrum, 0, spectrum, spectrum, spectrum_state, init_spectrum, "Signal", "Sintez 2", 0 ) COMP( 1990, zvezda, spectrum, 0, spectrum, spectrum, spectrum_state, init_spectrum, "<unknown>", "Zvezda", 0 ) diff --git a/src/mame/drivers/ssystem3.cpp b/src/mame/drivers/ssystem3.cpp index a37b8e0609d..b3beb6eef27 100644 --- a/src/mame/drivers/ssystem3.cpp +++ b/src/mame/drivers/ssystem3.cpp @@ -38,7 +38,6 @@ backup of playfield rom and picture/description of its board #include "emu.h" #include "includes/ssystem3.h" -#include "cpu/m6502/m6502.h" #include "screen.h" @@ -282,32 +281,33 @@ static INPUT_PORTS_START( ssystem3 ) INPUT_PORTS_END - -MACHINE_CONFIG_START(ssystem3_state::ssystem3) +void ssystem3_state::ssystem3(machine_config &config) +{ /* basic machine hardware */ - MCFG_DEVICE_ADD("maincpu", M6502, 1000000) - MCFG_DEVICE_PROGRAM_MAP(ssystem3_map) - MCFG_QUANTUM_TIME(attotime::from_hz(60)) + M6502(config, m_maincpu, 1000000); + m_maincpu->set_addrmap(AS_PROGRAM, &ssystem3_state::ssystem3_map); + + config.m_minimum_quantum = attotime::from_hz(60); /* video hardware */ - MCFG_SCREEN_ADD("screen", LCD) - MCFG_SCREEN_REFRESH_RATE(LCD_FRAMES_PER_SECOND) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */ - MCFG_SCREEN_SIZE(728, 437) - MCFG_SCREEN_VISIBLE_AREA(0, 728-1, 0, 437-1) - MCFG_SCREEN_UPDATE_DRIVER(ssystem3_state, screen_update_ssystem3) - MCFG_SCREEN_PALETTE("palette") + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD)); + screen.set_refresh_hz(LCD_FRAMES_PER_SECOND); + screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */ + screen.set_size(728, 437); + screen.set_visarea(0, 728-1, 0, 437-1); + screen.set_screen_update(FUNC(ssystem3_state::screen_update_ssystem3)); + screen.set_palette(m_palette); - MCFG_PALETTE_ADD("palette", 242 + 32768) - MCFG_PALETTE_INIT_OWNER(ssystem3_state, ssystem3) + PALETTE(config, m_palette, 242 + 32768); + m_palette->set_init(FUNC(ssystem3_state::palette_init)); /* via */ - MCFG_DEVICE_ADD("via6522_0", VIA6522, 1000000) - MCFG_VIA6522_READPA_HANDLER(READ8(*this, ssystem3_state,ssystem3_via_read_a)) - MCFG_VIA6522_READPB_HANDLER(READ8(*this, ssystem3_state,ssystem3_via_read_b)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, ssystem3_state,ssystem3_via_write_a)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, ssystem3_state,ssystem3_via_write_b)) -MACHINE_CONFIG_END + VIA6522(config, m_via6522_0, 1000000); + m_via6522_0->readpa_handler().set(FUNC(ssystem3_state::ssystem3_via_read_a)); + m_via6522_0->readpb_handler().set(FUNC(ssystem3_state::ssystem3_via_read_b)); + m_via6522_0->writepa_handler().set(FUNC(ssystem3_state::ssystem3_via_write_a)); + m_via6522_0->writepb_handler().set(FUNC(ssystem3_state::ssystem3_via_write_b)); +} ROM_START(ssystem3) diff --git a/src/mame/drivers/starwars.cpp b/src/mame/drivers/starwars.cpp index 9608e0bf09f..72aa87e5513 100644 --- a/src/mame/drivers/starwars.cpp +++ b/src/mame/drivers/starwars.cpp @@ -316,12 +316,12 @@ MACHINE_CONFIG_START(starwars_state::starwars) MCFG_ADC0808_IN1_CB(IOPORT("STICKX")) // yaw MCFG_ADC0808_IN2_CB(CONSTANT(0)) // thrust (unused) - MCFG_DEVICE_ADD("riot", RIOT6532, MASTER_CLOCK / 8) - MCFG_RIOT6532_IN_PA_CB(READ8(*this, starwars_state, r6532_porta_r)) - MCFG_RIOT6532_OUT_PA_CB(WRITE8(*this, starwars_state, r6532_porta_w)) - MCFG_RIOT6532_IN_PB_CB(READ8("tms", tms5220_device, status_r)) - MCFG_RIOT6532_OUT_PB_CB(WRITE8("tms", tms5220_device, data_w)) - MCFG_RIOT6532_IRQ_CB(INPUTLINE("audiocpu", M6809_IRQ_LINE)) + RIOT6532(config, m_riot, MASTER_CLOCK / 8); + m_riot->in_pa_callback().set(FUNC(starwars_state::r6532_porta_r)); + m_riot->out_pa_callback().set(FUNC(starwars_state::r6532_porta_w)); + m_riot->in_pb_callback().set("tms", FUNC(tms5220_device::status_r)); + m_riot->out_pb_callback().set("tms", FUNC(tms5220_device::data_w)); + m_riot->irq_callback().set_inputline("audiocpu", M6809_IRQ_LINE); X2212(config, "x2212").set_auto_save(true); /* nvram */ diff --git a/src/mame/drivers/stv.cpp b/src/mame/drivers/stv.cpp index 5821fbfddff..af9ac9660da 100644 --- a/src/mame/drivers/stv.cpp +++ b/src/mame/drivers/stv.cpp @@ -951,12 +951,67 @@ void stv_state::init_ffreveng() init_stv(); } + +READ32_MEMBER(stv_state::decathlt_prot_r) +{ + // needs to be a way to indicate if device is enabled and fall through to cartridge data if not? + if (m_newprotection_element) + { + m_newprotection_element = false; + m_5838crypt->debug_helper(m_protbankval); + } + + uint32 ret = 0; + if (mem_mask & 0xffff0000) ret |= (m_5838crypt->data_r(space, offset, mem_mask)<<16); + if (mem_mask & 0x0000ffff) ret |= m_5838crypt->data_r(space, offset, mem_mask); + return ret; +} + +WRITE32_MEMBER(stv_state::decathlt_prot_srcaddr_w) +{ + int offs = offset * 4; + + m_protbankval = (offs & 0x1800000)>>23; + m_protbank->set_entry(m_protbankval); // if the protection device is accessed at this address data is fetched from 0x02000000 + m_newprotection_element = true; + + if ((offs & 0x7fffff) == 0x7FFFF0) + { + m_5838crypt->srcaddr_w(space, offset, data, mem_mask); + } + else if ((offs & 0x7fffff) == 0x7FFFF4) + { + m_5838crypt->data_w(space, offset, data, mem_mask); + } +} + void stv_state::init_decathlt() { - m_5838crypt->install_decathlt_protection(); + m_maincpu->space(AS_PROGRAM).install_write_handler(0x2000000, 0x37fffff, write32_delegate(FUNC(stv_state::decathlt_prot_srcaddr_w), this)); // set compressed data source address, write data + + // really needs installing over the whole range, with fallbacks to read rom if device is disabled or isn't accessed on given address + m_maincpu->space(AS_PROGRAM).install_read_handler(0x27ffff8, 0x27ffffb, read32_delegate(FUNC(stv_state::decathlt_prot_r), this)); // read decompressed data + m_maincpu->space(AS_PROGRAM).install_read_handler(0x2fffff8, 0x2fffffb, read32_delegate(FUNC(stv_state::decathlt_prot_r), this)); // ^ + m_maincpu->space(AS_PROGRAM).install_read_handler(0x37ffff8, 0x37ffffb, read32_delegate(FUNC(stv_state::decathlt_prot_r), this)); // ^ + + m_protbank->configure_entry(0, memregion("cart")->base() + 0x0000000); + m_protbank->configure_entry(1, memregion("cart")->base() + 0x0800000); + m_protbank->configure_entry(2, memregion("cart")->base() + 0x1000000); + //m_protbank->configure_entry(3, memregion("cart")->base() + 0x1800000); + + m_protbank->set_entry(0); + + m_newprotection_element = false; + init_stv(); } +void stv_state::init_decathlt_nokey() +{ + init_decathlt(); + m_5838crypt->set_hack_mode(sega_315_5838_comp_device::HACK_MODE_NO_KEY); +} + void stv_state::init_nameclv3() { m_maincpu->sh2drc_add_pcflush(0x601eb4c); @@ -1146,21 +1201,17 @@ MACHINE_CONFIG_START(stv_state::stvcd) MACHINE_CONFIG_END -uint16_t stv_state::crypt_read_callback_ch1(uint32_t addr) -{ - return m_maincpu->space().read_word(0x02000000 + 0x1000000 + (addr * 2)); -} - -uint16_t stv_state::crypt_read_callback_ch2(uint32_t addr) +void stv_state::sega5838_map(address_map &map) { - return m_maincpu->space().read_word(0x02000000 + 0x0000000 + (addr * 2)); + map(0x000000, 0x7fffff).bankr("protbank"); } MACHINE_CONFIG_START(stv_state::stv_5838) stv(config); + MCFG_DEVICE_ADD("315_5838", SEGA315_5838_COMP, 0) - MCFG_SET_5838_READ_CALLBACK_CH1(stv_state, crypt_read_callback_ch1) - MCFG_SET_5838_READ_CALLBACK_CH2(stv_state, crypt_read_callback_ch2) + MCFG_DEVICE_ADDRESS_MAP(0, sega5838_map) + MACHINE_CONFIG_END @@ -3697,16 +3748,16 @@ GAME( 1997, pclub2kc, stvbios, stv, stv, stvpc_state, init_stv, GAME( 1997, pclubyo2, stvbios, stv, stv, stvpc_state, init_stv, ROT0, "Atlus", "Print Club Yoshimoto V2 (J 970422 V1.100)", MACHINE_NOT_WORKING ) -GAME( 1997, pclove, stvbios, stv_5838, stv, stvpc_state, init_decathlt, ROT0, "Atlus", "Print Club LoveLove (J 970421 V1.000)", MACHINE_NOT_WORKING ) // uses the same type of protection as decathlete!! -GAME( 1997, pclove2, stvbios, stv_5838, stv, stvpc_state, init_decathlt, ROT0, "Atlus", "Print Club LoveLove Ver 2 (J 970825 V1.000)", MACHINE_NOT_WORKING ) // ^ -GAME( 1997, pcpooh2, stvbios, stv_5838, stv, stvpc_state, init_decathlt, ROT0, "Atlus", "Print Club Winnie-the-Pooh Vol. 2 (J 971218 V1.000)", MACHINE_NOT_WORKING ) // ^ -GAME( 1998, pcpooh3, stvbios, stv_5838, stv, stvpc_state, init_decathlt, ROT0, "Atlus", "Print Club Winnie-the-Pooh Vol. 3 (J 980406 V1.000)", MACHINE_NOT_WORKING ) // ^ +GAME( 1997, pclove, stvbios, stv_5838, stv, stvpc_state, init_decathlt_nokey, ROT0, "Atlus", "Print Club LoveLove (J 970421 V1.000)", MACHINE_NOT_WORKING ) // uses the same type of protection as decathlete!! +GAME( 1997, pclove2, stvbios, stv_5838, stv, stvpc_state, init_decathlt_nokey, ROT0, "Atlus", "Print Club LoveLove Ver 2 (J 970825 V1.000)", MACHINE_NOT_WORKING ) // ^ +GAME( 1997, pcpooh2, stvbios, stv_5838, stv, stvpc_state, init_decathlt_nokey, ROT0, "Atlus", "Print Club Winnie-the-Pooh Vol. 2 (J 971218 V1.000)", MACHINE_NOT_WORKING ) // ^ +GAME( 1998, pcpooh3, stvbios, stv_5838, stv, stvpc_state, init_decathlt_nokey, ROT0, "Atlus", "Print Club Winnie-the-Pooh Vol. 3 (J 980406 V1.000)", MACHINE_NOT_WORKING ) // ^ GAME( 1998, stress, stvbios, stv, stv, stvpc_state, init_stv, ROT0, "Sega", "Stress Busters (J 981020 V1.000)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) -GAME( 1996, nameclub, stvbios, stv_5838, stv, stvpc_state, init_decathlt, ROT0, "Sega", "Name Club (J 960315 V1.000)", MACHINE_NOT_WORKING ) // uses the same type of protection as decathlete!! -GAME( 1996, nclubv2, stvbios, stv_5838, stv, stvpc_state, init_decathlt, ROT0, "Sega", "Name Club Ver.2 (J 960315 V1.000)", MACHINE_NOT_WORKING ) // ^ (has the same datecode as nameclub, probably incorrect unless both were released today) -GAME( 1997, nclubv3, stvbios, stv, stv, stvpc_state, init_nameclv3, ROT0, "Sega", "Name Club Ver.3 (J 970723 V1.000)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING ) // no protection +GAME( 1996, nameclub, stvbios, stv_5838, stv, stvpc_state, init_decathlt_nokey, ROT0, "Sega", "Name Club (J 960315 V1.000)", MACHINE_NOT_WORKING ) // uses the same type of protection as decathlete!! +GAME( 1996, nclubv2, stvbios, stv_5838, stv, stvpc_state, init_decathlt_nokey, ROT0, "Sega", "Name Club Ver.2 (J 960315 V1.000)", MACHINE_NOT_WORKING ) // ^ (has the same datecode as nameclub, probably incorrect unless both were released today) +GAME( 1997, nclubv3, stvbios, stv, stv, stvpc_state, init_nameclv3, ROT0, "Sega", "Name Club Ver.3 (J 970723 V1.000)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING ) // no protection diff --git a/src/mame/drivers/supbtime.cpp b/src/mame/drivers/supbtime.cpp index 8f8df46fd98..8ebc21e8bc1 100644 --- a/src/mame/drivers/supbtime.cpp +++ b/src/mame/drivers/supbtime.cpp @@ -143,8 +143,6 @@ void supbtime_state::sound_map(address_map &map) map(0x130000, 0x130001).noprw(); // This board only has 1 oki chip map(0x140000, 0x140001).r("soundlatch", FUNC(generic_latch_8_device::read)); map(0x1f0000, 0x1f1fff).ram(); - map(0x1fec00, 0x1fec01).rw(m_audiocpu, FUNC(h6280_device::timer_r), FUNC(h6280_device::timer_w)).mirror(0x3fe); - map(0x1ff400, 0x1ff403).rw(m_audiocpu, FUNC(h6280_device::irq_status_r), FUNC(h6280_device::irq_status_w)).mirror(0x3fc); } @@ -343,8 +341,9 @@ MACHINE_CONFIG_START(supbtime_state::supbtime) MCFG_DEVICE_ADD("maincpu", M68000, XTAL(28'000'000) / 2) MCFG_DEVICE_PROGRAM_MAP(supbtime_map) - MCFG_DEVICE_ADD("audiocpu", H6280, XTAL(32'220'000) / 8) - MCFG_DEVICE_PROGRAM_MAP(sound_map) + H6280(config, m_audiocpu, XTAL(32'220'000) / 8); + m_audiocpu->set_addrmap(AS_PROGRAM, &supbtime_state::sound_map); + m_audiocpu->add_route(ALL_OUTPUTS, "mono", 0); // internal sound unused // video hardware MCFG_SCREEN_ADD("screen", RASTER) diff --git a/src/mame/drivers/super6.cpp b/src/mame/drivers/super6.cpp index 69a284b8ce5..96baf94c3de 100644 --- a/src/mame/drivers/super6.cpp +++ b/src/mame/drivers/super6.cpp @@ -2,12 +2,20 @@ // copyright-holders:Curt Coder /* - TODO: - - floppy (cannot be implemented currently since this is another case of halting the cpu mid-instruction) - - interrupts - - DMA - - peripheral interfaces +ToDo: +- peripheral interfaces + +- Fix floppy. It needs to WAIT the cpu whenever port 0x14 is read, wait + for either DRQ or INTRQ to assert, then release the cpu and then do the + actual port read. Our Z80 cannot do that. + The schematic isn't clear, but it seems the 2 halves of U16 (as shown) have + a common element, so that activity on one side can affect what happens on + the other side. + If you uncomment the line in fdc_intrq_w, and change the BOGUSWAIT to WAIT + in fdc_r, then load up the cpm disk (from software list), it will read the + CP/M boot track into memory and attempt to run it. However, it has an issue + and returns to the monitor. The other disks are useless. */ @@ -193,11 +201,9 @@ READ8_MEMBER( super6_state::fdc_r ) */ - // don't crash please... but it's true, WAIT does nothing in our Z80 - //fatalerror("Z80 WAIT not supported by MAME core\n"); m_maincpu->set_input_line(Z80_INPUT_LINE_BOGUSWAIT, ASSERT_LINE); - return !m_fdc->intrq_r() << 7; + return m_fdc->intrq_r() ? 0x7f : 0xff; } @@ -224,21 +230,24 @@ WRITE8_MEMBER( super6_state::fdc_w ) */ // disk drive select - floppy_image_device *m_floppy = nullptr; + floppy_image_device *floppy = nullptr; if ((data & 3) == 0) - m_floppy = m_floppy0->get_device(); + floppy = m_floppy0->get_device(); if ((data & 3) == 1) - m_floppy = m_floppy1->get_device(); + floppy = m_floppy1->get_device(); - m_fdc->set_floppy(m_floppy); - if (m_floppy) m_floppy->mon_w(0); + m_fdc->set_floppy(floppy); + if (floppy) floppy->mon_w(0); // head select - if (m_floppy) m_floppy->ss_w(BIT(data, 2)); + if (floppy) floppy->ss_w(BIT(data, 2)); // disk density m_fdc->dden_w(!BIT(data, 3)); + + // disk size + m_fdc->set_unscaled_clock (BIT(data, 4) ? 1'000'000 : 2'000'000); // division occurs inside fdc depending on ENMF } @@ -263,6 +272,7 @@ void super6_state::super6_mem(address_map &map) void super6_state::super6_io(address_map &map) { map.global_mask(0xff); + map.unmap_value_high(); map(0x00, 0x03).rw(m_dart, FUNC(z80dart_device::ba_cd_r), FUNC(z80dart_device::ba_cd_w)); map(0x04, 0x07).rw(m_pio, FUNC(z80pio_device::read), FUNC(z80pio_device::write)); map(0x08, 0x0b).rw(m_ctc, FUNC(z80ctc_device::read), FUNC(z80ctc_device::write)); @@ -289,7 +299,7 @@ void super6_state::super6_io(address_map &map) static INPUT_PORTS_START( super6 ) PORT_START("J7") - PORT_DIPNAME( 0x0f, 0x0f, "SIO Channel A Baud Rate" ) PORT_DIPLOCATION("J7:1,2,3,4") + PORT_DIPNAME( 0x0f, 0x0e, "SIO Channel A Baud Rate" ) PORT_DIPLOCATION("J7:1,2,3,4") PORT_DIPSETTING( 0x00, "50" ) PORT_DIPSETTING( 0x01, "75" ) PORT_DIPSETTING( 0x02, "110" ) @@ -330,11 +340,6 @@ INPUT_PORTS_END // Z80CTC //------------------------------------------------- -TIMER_DEVICE_CALLBACK_MEMBER( super6_state::ctc_tick ) -{ - m_ctc->trg0(1); - m_ctc->trg0(0); -} //------------------------------------------------- // Z80DMA @@ -376,14 +381,15 @@ static void super6_floppies(device_slot_interface &device) WRITE_LINE_MEMBER( super6_state::fdc_intrq_w ) { - if (state) m_maincpu->set_input_line(Z80_INPUT_LINE_BOGUSWAIT, CLEAR_LINE); + if (state) m_maincpu->set_input_line(Z80_INPUT_LINE_WAIT, CLEAR_LINE); - m_ctc->trg3(!state); + m_ctc->trg3(state); // J6 pin 7-8 + // m_maincpu->set_state_int(Z80_AF, 0x7f00); // hack, see notes } WRITE_LINE_MEMBER( super6_state::fdc_drq_w ) { - if (state) m_maincpu->set_input_line(Z80_INPUT_LINE_BOGUSWAIT, CLEAR_LINE); + if (state) m_maincpu->set_input_line(Z80_INPUT_LINE_WAIT, CLEAR_LINE); m_dma->rdy_w(state); } @@ -393,24 +399,14 @@ WRITE_LINE_MEMBER( super6_state::fdc_drq_w ) // z80_daisy_config super6_daisy_chain //------------------------------------------------- -static const z80_daisy_config super6_daisy_chain[] = -{ - { Z80CTC_TAG }, - { Z80DART_TAG }, - { Z80PIO_TAG }, - { nullptr } -}; - - -static DEVICE_INPUT_DEFAULTS_START( terminal ) - DEVICE_INPUT_DEFAULTS( "RS232_TXBAUD", 0xff, RS232_BAUD_19200 ) - DEVICE_INPUT_DEFAULTS( "RS232_RXBAUD", 0xff, RS232_BAUD_19200 ) - DEVICE_INPUT_DEFAULTS( "RS232_STARTBITS", 0xff, RS232_STARTBITS_1 ) - DEVICE_INPUT_DEFAULTS( "RS232_DATABITS", 0xff, RS232_DATABITS_8 ) - DEVICE_INPUT_DEFAULTS( "RS232_PARITY", 0xff, RS232_PARITY_NONE ) - DEVICE_INPUT_DEFAULTS( "RS232_STOPBITS", 0xff, RS232_STOPBITS_1 ) -DEVICE_INPUT_DEFAULTS_END - +// no evidence of daisy chain in use - removed for now +//static const z80_daisy_config super6_daisy_chain[] = +//{ +// { Z80CTC_TAG }, +// { Z80DART_TAG }, +// { Z80PIO_TAG }, +// { nullptr } +//}; //************************************************************************** @@ -435,11 +431,6 @@ void super6_state::machine_reset() m_bank0 = m_bank1 = 0; bankswitch(); - - uint8_t baud = m_j7->read(); - - m_brg->write_str(baud & 0x0f); - m_brg->write_stt((baud >> 4) & 0x07); } @@ -457,17 +448,19 @@ MACHINE_CONFIG_START(super6_state::super6) MCFG_DEVICE_ADD(m_maincpu, Z80, 24_MHz_XTAL / 4) MCFG_DEVICE_PROGRAM_MAP(super6_mem) MCFG_DEVICE_IO_MAP(super6_io) - MCFG_Z80_DAISY_CHAIN(super6_daisy_chain) + //MCFG_Z80_DAISY_CHAIN(super6_daisy_chain) // devices MCFG_DEVICE_ADD(m_ctc, Z80CTC, 24_MHz_XTAL / 4) + MCFG_Z80CTC_ZC0_CB(WRITELINE(m_ctc, z80ctc_device, trg1)) // J6 pin 2-3 MCFG_Z80CTC_INTR_CB(INPUTLINE(Z80_TAG, INPUT_LINE_IRQ0)) - MCFG_TIMER_DRIVER_ADD_PERIODIC("ctc", super6_state, ctc_tick, attotime::from_hz(24_MHz_XTAL / 16)) + clock_device &ctc_tick(CLOCK(config, "ctc_tick", 24_MHz_XTAL / 16)); + ctc_tick.signal_handler().set(m_ctc, FUNC(z80ctc_device::trg0)); // J6 pin 1-14 (1.5MHz) MCFG_DEVICE_ADD(m_dma, Z80DMA, 24_MHz_XTAL / 6) - MCFG_Z80DMA_OUT_BUSREQ_CB(INPUTLINE(Z80_TAG, INPUT_LINE_HALT)) - MCFG_Z80DMA_OUT_INT_CB(WRITELINE(Z80CTC_TAG, z80ctc_device, trg2)) + MCFG_Z80DMA_OUT_BUSREQ_CB(WRITELINE(m_dma, z80dma_device, bai_w)) + MCFG_Z80DMA_OUT_INT_CB(WRITELINE(m_ctc, z80ctc_device, trg2)) MCFG_Z80DMA_IN_MREQ_CB(READ8(*this, super6_state, memory_read_byte)) MCFG_Z80DMA_OUT_MREQ_CB(WRITE8(*this, super6_state, memory_write_byte)) MCFG_Z80DMA_IN_IORQ_CB(READ8(*this, super6_state, io_read_byte)) @@ -476,12 +469,15 @@ MACHINE_CONFIG_START(super6_state::super6) MCFG_DEVICE_ADD(m_pio, Z80PIO, 24_MHz_XTAL / 4) MCFG_Z80PIO_OUT_INT_CB(INPUTLINE(Z80_TAG, INPUT_LINE_IRQ0)) - MCFG_DEVICE_ADD(WD2793_TAG, WD2793, 1000000) + MCFG_DEVICE_ADD(m_fdc, WD2793, 24_MHz_XTAL / 12) + MCFG_WD_FDC_FORCE_READY MCFG_WD_FDC_INTRQ_CALLBACK(WRITELINE(*this, super6_state, fdc_intrq_w)) MCFG_WD_FDC_DRQ_CALLBACK(WRITELINE(*this, super6_state, fdc_drq_w)) MCFG_FLOPPY_DRIVE_ADD(m_floppy0, super6_floppies, "525dd", floppy_image_device::default_floppy_formats) + MCFG_FLOPPY_DRIVE_SOUND(true) MCFG_FLOPPY_DRIVE_ADD(m_floppy1, super6_floppies, nullptr, floppy_image_device::default_floppy_formats) + MCFG_FLOPPY_DRIVE_SOUND(true) MCFG_DEVICE_ADD(m_dart, Z80DART, 24_MHz_XTAL / 4) MCFG_Z80DART_OUT_TXDA_CB(WRITELINE(RS232_A_TAG, rs232_port_device, write_txd)) @@ -494,7 +490,6 @@ MACHINE_CONFIG_START(super6_state::super6) MCFG_DEVICE_ADD(RS232_A_TAG, RS232_PORT, default_rs232_devices, "terminal") MCFG_RS232_RXD_HANDLER(WRITELINE(m_dart, z80dart_device, rxa_w)) - MCFG_SLOT_OPTION_DEVICE_INPUT_DEFAULTS("terminal", terminal) MCFG_DEVICE_ADD(RS232_B_TAG, RS232_PORT, default_rs232_devices, nullptr) MCFG_RS232_RXD_HANDLER(WRITELINE(m_dart, z80dart_device, rxb_w)) diff --git a/src/mame/drivers/swtpc09.cpp b/src/mame/drivers/swtpc09.cpp index 48248cd5f0e..1f9c77774ee 100644 --- a/src/mame/drivers/swtpc09.cpp +++ b/src/mame/drivers/swtpc09.cpp @@ -165,31 +165,32 @@ static void swtpc09_floppies(device_slot_interface &device) /* Machine driver */ /* MPU09, MPID, MPS2 DMF2 */ -MACHINE_CONFIG_START(swtpc09_state::swtpc09_base) +void swtpc09_state::swtpc09_base(machine_config &config) +{ /* basic machine hardware */ - MCFG_DEVICE_ADD("maincpu", MC6809, 4_MHz_XTAL) - MCFG_DEVICE_PROGRAM_MAP(mp09_mem) - - MCFG_DEVICE_ADD("bankdev", ADDRESS_MAP_BANK, 0) - MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_BIG) - MCFG_ADDRESS_MAP_BANK_DATA_WIDTH(8) - MCFG_ADDRESS_MAP_BANK_ADDR_WIDTH(20) - MCFG_DEVICE_PROGRAM_MAP(flex_dmf2_mem) - - MCFG_DEVICE_ADD("pia", PIA6821, 0) - MCFG_PIA_READPA_HANDLER(READ8(*this, swtpc09_state, pia0_a_r)) - MCFG_PIA_READPA_HANDLER(READ8(*this, swtpc09_state, pia0_ca1_r)) - MCFG_PIA_IRQA_HANDLER(WRITELINE(*this, swtpc09_state, pia0_irq_a)) - - MCFG_DEVICE_ADD("ptm", PTM6840, 2000000) - MCFG_PTM6840_EXTERNAL_CLOCKS(50, 0, 50) - MCFG_PTM6840_O1_CB(WRITELINE(*this, swtpc09_state, ptm_o1_callback)) - MCFG_PTM6840_O3_CB(WRITELINE(*this, swtpc09_state, ptm_o3_callback)) - MCFG_PTM6840_IRQ_CB(WRITELINE(*this, swtpc09_state, ptm_irq)) - - MCFG_DEVICE_ADD("rs232", RS232_PORT, default_rs232_devices, "terminal") - MCFG_RS232_RXD_HANDLER(WRITELINE("acia", acia6850_device, write_rxd)) - MCFG_RS232_CTS_HANDLER(WRITELINE("acia", acia6850_device, write_cts)) + MC6809(config, m_maincpu, 4_MHz_XTAL); + m_maincpu->set_addrmap(AS_PROGRAM, &swtpc09_state::mp09_mem); + + ADDRESS_MAP_BANK(config, m_bankdev, 0); + m_bankdev->set_endianness(ENDIANNESS_BIG); + m_bankdev->set_data_width(8); + m_bankdev->set_addr_width(20); + m_bankdev->set_addrmap(AS_PROGRAM, &swtpc09_state::flex_dmf2_mem); + + PIA6821(config, m_pia, 0); + m_pia->readpa_handler().set(FUNC(swtpc09_state::pia0_a_r)); + m_pia->readca1_handler().set(FUNC(swtpc09_state::pia0_ca1_r)); + m_pia->irqa_handler().set(FUNC(swtpc09_state::pia0_irq_a)); + + PTM6840(config, m_ptm, 2000000); + m_ptm->set_external_clocks(50, 0, 50); + m_ptm->o1_callback().set(FUNC(swtpc09_state::ptm_o1_callback)); + m_ptm->o3_callback().set(FUNC(swtpc09_state::ptm_o3_callback)); + m_ptm->irq_callback().set(FUNC(swtpc09_state::ptm_irq)); + + rs232_port_device &rs232(RS232_PORT(config, "rs232", default_rs232_devices, "terminal")); + rs232.rxd_handler().set(m_acia, FUNC(acia6850_device::write_rxd)); + rs232.cts_handler().set(m_acia, FUNC(acia6850_device::write_cts)); ACIA6850(config, m_acia, 0); m_acia->txd_handler().set("rs232", FUNC(rs232_port_device::write_txd)); @@ -200,27 +201,27 @@ MACHINE_CONFIG_START(swtpc09_state::swtpc09_base) m_brg->out_f1_cb().set(m_acia, FUNC(acia6850_device::write_txc)); m_brg->out_f1_cb().append(m_acia, FUNC(acia6850_device::write_rxc)); - MCFG_DEVICE_ADD("fdc", FD1793, 1_MHz_XTAL) - MCFG_FLOPPY_DRIVE_ADD("fdc:0", swtpc09_floppies, "dd", swtpc09_state::floppy_formats) - MCFG_FLOPPY_DRIVE_ADD("fdc:1", swtpc09_floppies, "dd", swtpc09_state::floppy_formats) - MCFG_FLOPPY_DRIVE_ADD("fdc:2", swtpc09_floppies, "dd", swtpc09_state::floppy_formats) - MCFG_FLOPPY_DRIVE_ADD("fdc:3", swtpc09_floppies, "dd", swtpc09_state::floppy_formats) -MACHINE_CONFIG_END + FD1793(config, m_fdc, 1_MHz_XTAL); + FLOPPY_CONNECTOR(config, "fdc:0", swtpc09_floppies, "dd", swtpc09_state::floppy_formats); + FLOPPY_CONNECTOR(config, "fdc:1", swtpc09_floppies, "dd", swtpc09_state::floppy_formats); + FLOPPY_CONNECTOR(config, "fdc:2", swtpc09_floppies, "dd", swtpc09_state::floppy_formats); + FLOPPY_CONNECTOR(config, "fdc:3", swtpc09_floppies, "dd", swtpc09_state::floppy_formats); +} -MACHINE_CONFIG_START(swtpc09_state::swtpc09) +void swtpc09_state::swtpc09(machine_config &config) +{ swtpc09_base(config); - MCFG_DEVICE_MODIFY("fdc") - MCFG_WD_FDC_INTRQ_CALLBACK(WRITELINE(*this, swtpc09_state, fdc_intrq_w)) - MCFG_WD_FDC_DRQ_CALLBACK(WRITELINE(*this, swtpc09_state, fdc_drq_w)) -MACHINE_CONFIG_END + m_fdc->intrq_wr_callback().set(FUNC(swtpc09_state::fdc_intrq_w)); + m_fdc->drq_wr_callback().set(FUNC(swtpc09_state::fdc_drq_w)); +} /* MPU09, MPID, MPS2 DC4 PIAIDE*/ -MACHINE_CONFIG_START(swtpc09_state::swtpc09i) +void swtpc09_state::swtpc09i(machine_config &config) +{ swtpc09_base(config); - MCFG_DEVICE_MODIFY("bankdev") - MCFG_DEVICE_PROGRAM_MAP(flex_dc4_piaide_mem) + m_bankdev->set_addrmap(AS_PROGRAM, &swtpc09_state::flex_dc4_piaide_mem); - MCFG_DEVICE_ADD("piaide", PIA6821, 0) + PIA6821(config, "piaide", 0); /* old start to adding ide support, needs major updating */ /* this is to support an add on card driving IDE from a PIA */ @@ -228,39 +229,34 @@ MACHINE_CONFIG_START(swtpc09_state::swtpc09i) // MCFG_IDE_CONTROLLER_ADD("ide", nullptr) // MCFG_IDE_CONTROLLER_REGIONS("harddisk", nullptr) // MCFG_IDE_CONTROLLER_ADD( "ide", ide_intf, "hdd", nullptr, false ) /* FIXME */ bebox -MACHINE_CONFIG_END +} -MACHINE_CONFIG_START(swtpc09_state::swtpc09u) +void swtpc09_state::swtpc09u(machine_config &config) +{ swtpc09(config); - MCFG_DEVICE_MODIFY("bankdev") - MCFG_DEVICE_PROGRAM_MAP(uniflex_dmf2_mem) -MACHINE_CONFIG_END + m_bankdev->set_addrmap(AS_PROGRAM, &swtpc09_state::uniflex_dmf2_mem); +} /* MPU09, MPID, MPS2 DMF3 */ -MACHINE_CONFIG_START(swtpc09_state::swtpc09d3) +void swtpc09_state::swtpc09d3(machine_config &config) +{ swtpc09_base(config); - MCFG_DEVICE_MODIFY("maincpu") - MCFG_DEVICE_CLOCK(8_MHz_XTAL) - - MCFG_DEVICE_MODIFY("pia") - MCFG_DEVICE_CLOCK(2000000) - - MCFG_DEVICE_MODIFY("bankdev") - MCFG_DEVICE_PROGRAM_MAP(uniflex_dmf3_mem) + m_maincpu->set_clock(8_MHz_XTAL); + m_pia->set_clock(2000000); + m_bankdev->set_addrmap(AS_PROGRAM, &swtpc09_state::uniflex_dmf3_mem); /* video hardware */ - MCFG_DEVICE_MODIFY("acia") - MCFG_ACIA6850_IRQ_HANDLER(INPUTLINE("maincpu", M6809_IRQ_LINE)) - - MCFG_DEVICE_ADD("via", VIA6522, 4_MHz_XTAL / 4) - MCFG_VIA6522_READPA_HANDLER(READ8(*this, swtpc09_state, dmf3_via_read_porta)) - MCFG_VIA6522_READPB_HANDLER(READ8(*this, swtpc09_state, dmf3_via_read_portb)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, swtpc09_state, dmf3_via_write_porta)) - //MCFG_VIA6522_CA1_HANDLER(WRITELINE(*this, swtpc09_state, dmf3_via_write_ca1)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, swtpc09_state, dmf3_via_irq)) -MACHINE_CONFIG_END + m_acia->irq_handler().set_inputline(m_maincpu, M6809_IRQ_LINE); + + via6522_device &via(VIA6522(config, "via", 4_MHz_XTAL / 4)); + via.readpa_handler().set(FUNC(swtpc09_state::dmf3_via_read_porta)); + via.readpb_handler().set(FUNC(swtpc09_state::dmf3_via_read_portb)); + via.writepa_handler().set(FUNC(swtpc09_state::dmf3_via_write_porta)); + //via.ca1_handler().set(FUNC(swtpc09_state::dmf3_via_write_ca1)); + via.irq_handler().set(FUNC(swtpc09_state::dmf3_via_irq)); +} /* ROM definition */ diff --git a/src/mame/drivers/swyft.cpp b/src/mame/drivers/swyft.cpp index cb0a0dc1fb5..0761e59ea93 100644 --- a/src/mame/drivers/swyft.cpp +++ b/src/mame/drivers/swyft.cpp @@ -327,7 +327,7 @@ public: void swyft(machine_config &config); private: - required_device<cpu_device> m_maincpu; + required_device<m68008_device> m_maincpu; optional_device<centronics_device> m_ctx; optional_device<output_latch_device> m_ctx_data_out; required_device<acia6850_device> m_acia6850; @@ -642,7 +642,7 @@ static const char *const swyft_via_regnames[] = { "0: ORB/IRB", "1: ORA/IRA", "2 READ8_MEMBER( swyft_state::swyft_via0_r ) { if (offset&0x000C3F) logerror("VIA0: read from invalid offset in 68k space: %06X!\n", offset); - uint8_t data = m_via[0]->read(space, (offset>>6)&0xF); + uint8_t data = m_via[0]->read((offset>>6)&0xF); LOGMASKED(LOG_VIA0, "VIA0 register %s read by cpu: returning %02x\n", swyft_via_regnames[(offset>>5)&0xF], data); return data; } @@ -651,13 +651,13 @@ WRITE8_MEMBER( swyft_state::swyft_via0_w ) { LOGMASKED(LOG_VIA0, "VIA0 register %s written by cpu with data %02x\n", swyft_via_regnames[(offset>>5)&0xF], data); if (offset&0x000C3F) logerror("VIA0: write to invalid offset in 68k space: %06X, data: %02X!\n", offset, data); - m_via[1]->write(space, (offset>>6)&0xF, data); + m_via[1]->write((offset>>6)&0xF, data); } READ8_MEMBER( swyft_state::swyft_via1_r ) { if (offset&0x000C3F) logerror("VIA1: read from invalid offset in 68k space: %06X!\n", offset); - uint8_t data = m_via[1]->read(space, (offset>>6)&0xF); + uint8_t data = m_via[1]->read((offset>>6)&0xF); LOGMASKED(LOG_VIA1, "VIA1 register %s read by cpu: returning %02x\n", swyft_via_regnames[(offset>>5)&0xF], data); return data; } @@ -666,7 +666,7 @@ WRITE8_MEMBER( swyft_state::swyft_via1_w ) { LOGMASKED(LOG_VIA1, "VIA1 register %s written by cpu with data %02x\n", swyft_via_regnames[(offset>>5)&0xF], data); if (offset&0x000C3F) logerror("VIA1: write to invalid offset in 68k space: %06X, data: %02X!\n", offset, data); - m_via[0]->write(space, (offset>>6)&0xF, data); + m_via[0]->write((offset>>6)&0xF, data); } // first via @@ -751,49 +751,48 @@ WRITE_LINE_MEMBER( swyft_state::write_acia_clock ) m_acia6850->write_rxc(state); } -MACHINE_CONFIG_START(swyft_state::swyft) - +void swyft_state::swyft(machine_config &config) +{ /* basic machine hardware */ - MCFG_DEVICE_ADD("maincpu",M68008, XTAL(15'897'600)/2) //MC68008P8, Y1=15.8976Mhz, clock GUESSED at Y1 / 2 - MCFG_DEVICE_PROGRAM_MAP(swyft_mem) + M68008(config, m_maincpu, XTAL(15'897'600)/2); //MC68008P8, Y1=15.8976Mhz, clock GUESSED at Y1 / 2 + m_maincpu->set_addrmap(AS_PROGRAM, &swyft_state::swyft_mem); MCFG_MACHINE_START_OVERRIDE(swyft_state,swyft) MCFG_MACHINE_RESET_OVERRIDE(swyft_state,swyft) + MCFG_VIDEO_START_OVERRIDE(swyft_state,swyft) /* video hardware */ - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_RAW_PARAMS(15.8976_MHz_XTAL / 2, 500, 0, 320, 265, 0, 242) // total guess - MCFG_SCREEN_UPDATE_DRIVER(swyft_state, screen_update_swyft) - MCFG_SCREEN_PALETTE("palette") + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); + screen.set_raw(15.8976_MHz_XTAL / 2, 500, 0, 320, 265, 0, 242); // total guess + screen.set_screen_update(FUNC(swyft_state::screen_update_swyft)); + screen.set_palette("palette"); - MCFG_PALETTE_ADD_MONOCHROME("palette") + PALETTE(config, "palette", 2).set_init("palette", FUNC(palette_device::palette_init_monochrome)); - MCFG_VIDEO_START_OVERRIDE(swyft_state,swyft) - - MCFG_DEVICE_ADD("acia6850", ACIA6850, 0) + ACIA6850(config, m_acia6850, 0); // acia rx and tx clocks come from one of the VIA pins and are tied together, fix this below? acia e clock comes from 68008 - MCFG_DEVICE_ADD("acia_clock", CLOCK, (XTAL(15'897'600)/2)/5) // out e clock from 68008, ~ 10in clocks per out clock - MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(*this, swyft_state, write_acia_clock)) - - MCFG_DEVICE_ADD("via6522_0", VIA6522, (XTAL(15'897'600)/2)/5) // out e clock from 68008 - MCFG_VIA6522_READPA_HANDLER(READ8(*this, swyft_state, via0_pa_r)) - MCFG_VIA6522_READPB_HANDLER(READ8(*this, swyft_state, via0_pb_r)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, swyft_state, via0_pa_w)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, swyft_state, via0_pb_w)) - MCFG_VIA6522_CB1_HANDLER(WRITELINE(*this, swyft_state, via0_cb1_w)) - MCFG_VIA6522_CA2_HANDLER(WRITELINE(*this, swyft_state, via0_ca2_w)) - MCFG_VIA6522_CB2_HANDLER(WRITELINE(*this, swyft_state, via0_cb2_w)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE("viairq", input_merger_device, in_w<0>)) - - MCFG_DEVICE_ADD("via6522_1", VIA6522, (XTAL(15'897'600)/2)/5) // out e clock from 68008 - MCFG_VIA6522_READPA_HANDLER(READ8(*this, swyft_state, via1_pa_r)) - MCFG_VIA6522_READPB_HANDLER(READ8(*this, swyft_state, via1_pb_r)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, swyft_state, via1_pa_w)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, swyft_state, via1_pb_w)) - MCFG_VIA6522_CB1_HANDLER(WRITELINE(*this, swyft_state, via1_cb1_w)) - MCFG_VIA6522_CA2_HANDLER(WRITELINE(*this, swyft_state, via1_ca2_w)) - MCFG_VIA6522_CB2_HANDLER(WRITELINE(*this, swyft_state, via1_cb2_w)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE("viairq", input_merger_device, in_w<1>)) + clock_device &acia_clock(CLOCK(config, "acia_clock", (XTAL(15'897'600)/2)/5)); // out e clock from 68008, ~ 10in clocks per out clock + acia_clock.signal_handler().set(FUNC(swyft_state::write_acia_clock)); + + via6522_device &via0(VIA6522(config, "via6522_0", (XTAL(15'897'600)/2)/5)); // out e clock from 68008 + via0.readpa_handler().set(FUNC(swyft_state::via0_pa_r)); + via0.readpb_handler().set(FUNC(swyft_state::via0_pb_r)); + via0.writepa_handler().set(FUNC(swyft_state::via0_pa_w)); + via0.writepb_handler().set(FUNC(swyft_state::via0_pb_w)); + via0.cb1_handler().set(FUNC(swyft_state::via0_cb1_w)); + via0.ca2_handler().set(FUNC(swyft_state::via0_ca2_w)); + via0.cb2_handler().set(FUNC(swyft_state::via0_cb2_w)); + via0.irq_handler().set("viairq", FUNC(input_merger_device::in_w<0>)); + + via6522_device &via1(VIA6522(config, "via6522_1", (XTAL(15'897'600)/2)/5)); // out e clock from 68008 + via1.readpa_handler().set(FUNC(swyft_state::via1_pa_r)); + via1.readpb_handler().set(FUNC(swyft_state::via1_pb_r)); + via1.writepa_handler().set(FUNC(swyft_state::via1_pa_w)); + via1.writepb_handler().set(FUNC(swyft_state::via1_pb_w)); + via1.cb1_handler().set(FUNC(swyft_state::via1_cb1_w)); + via1.ca2_handler().set(FUNC(swyft_state::via1_ca2_w)); + via1.cb2_handler().set(FUNC(swyft_state::via1_cb2_w)); + via1.irq_handler().set("viairq", FUNC(input_merger_device::in_w<1>)); input_merger_device &viairq(INPUT_MERGER_ANY_HIGH(config, "viairq")); viairq.output_handler().set_inputline("maincpu", M68K_IRQ_2); @@ -807,7 +806,7 @@ MACHINE_CONFIG_START(swyft_state::swyft) m_bitlatch->q_out_cb<5>().set(FUNC(swyft_state::bitlatch_q_w<5>)); m_bitlatch->q_out_cb<6>().set(FUNC(swyft_state::bitlatch_q_w<6>)); m_bitlatch->q_out_cb<7>().set(FUNC(swyft_state::bitlatch_q_w<7>)); -MACHINE_CONFIG_END +} /* ROM definition */ ROM_START( swyft ) diff --git a/src/mame/drivers/sym1.cpp b/src/mame/drivers/sym1.cpp index d41dc93c632..9b521617f56 100644 --- a/src/mame/drivers/sym1.cpp +++ b/src/mame/drivers/sym1.cpp @@ -86,7 +86,7 @@ private: void sym1_map(address_map &map); - required_device<cpu_device> m_maincpu; + required_device<m6502_device> m_maincpu; required_device<ram_device> m_ram; required_device<ttl74145_device> m_ttl74145; required_device<rs232_port_device> m_crt; @@ -327,56 +327,53 @@ void sym1_state::sym1_map(address_map &map) // MACHINE DRIVERS //************************************************************************** -MACHINE_CONFIG_START(sym1_state::sym1) +void sym1_state::sym1(machine_config &config) +{ // basic machine hardware - MCFG_DEVICE_ADD("maincpu", M6502, SYM1_CLOCK) - MCFG_DEVICE_PROGRAM_MAP(sym1_map) + M6502(config, m_maincpu, SYM1_CLOCK); + m_maincpu->set_addrmap(AS_PROGRAM, &sym1_state::sym1_map); config.set_default_layout(layout_sym1); // sound hardware SPEAKER(config, "mono").front_center(); - MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) + SPEAKER_SOUND(config, "speaker").add_route(ALL_OUTPUTS, "mono", 1.0); // devices - MCFG_DEVICE_ADD("riot", MOS6532_NEW, SYM1_CLOCK) - MCFG_MOS6530n_IN_PA_CB(READ8(*this, sym1_state, riot_a_r)) - MCFG_MOS6530n_OUT_PA_CB(WRITE8(*this, sym1_state, riot_a_w)) - MCFG_MOS6530n_IN_PB_CB(READ8(*this, sym1_state, riot_b_r)) - MCFG_MOS6530n_OUT_PB_CB(WRITE8(*this, sym1_state, riot_b_w)) - - MCFG_DEVICE_ADD("ttl74145", TTL74145, 0) - MCFG_TTL74145_OUTPUT_LINE_0_CB(WRITELINE(*this, sym1_state, sym1_74145_output_0_w)) - MCFG_TTL74145_OUTPUT_LINE_1_CB(WRITELINE(*this, sym1_state, sym1_74145_output_1_w)) - MCFG_TTL74145_OUTPUT_LINE_2_CB(WRITELINE(*this, sym1_state, sym1_74145_output_2_w)) - MCFG_TTL74145_OUTPUT_LINE_3_CB(WRITELINE(*this, sym1_state, sym1_74145_output_3_w)) - MCFG_TTL74145_OUTPUT_LINE_4_CB(WRITELINE(*this, sym1_state, sym1_74145_output_4_w)) - MCFG_TTL74145_OUTPUT_LINE_5_CB(WRITELINE(*this, sym1_state, sym1_74145_output_5_w)) - MCFG_TTL74145_OUTPUT_LINE_6_CB(WRITELINE("speaker", speaker_sound_device, level_w)) + mos6532_new_device &riot(MOS6532_NEW(config, "riot", SYM1_CLOCK)); + riot.pa_rd_callback().set(FUNC(sym1_state::riot_a_r)); + riot.pa_wr_callback().set(FUNC(sym1_state::riot_a_w)); + riot.pb_rd_callback().set(FUNC(sym1_state::riot_b_r)); + riot.pb_wr_callback().set(FUNC(sym1_state::riot_b_w)); + + TTL74145(config, m_ttl74145, 0); + m_ttl74145->output_line0_callback().set(FUNC(sym1_state::sym1_74145_output_0_w)); + m_ttl74145->output_line1_callback().set(FUNC(sym1_state::sym1_74145_output_1_w)); + m_ttl74145->output_line2_callback().set(FUNC(sym1_state::sym1_74145_output_2_w)); + m_ttl74145->output_line3_callback().set(FUNC(sym1_state::sym1_74145_output_3_w)); + m_ttl74145->output_line4_callback().set(FUNC(sym1_state::sym1_74145_output_4_w)); + m_ttl74145->output_line5_callback().set(FUNC(sym1_state::sym1_74145_output_5_w)); + m_ttl74145->output_line6_callback().set("speaker", FUNC(speaker_sound_device::level_w)); // lines 7-9 not connected - MCFG_DEVICE_ADD("via1", VIA6522, SYM1_CLOCK) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE("mainirq", input_merger_device, in_w<0>)) - - MCFG_DEVICE_ADD("via2", VIA6522, SYM1_CLOCK) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE("mainirq", input_merger_device, in_w<1>)) + VIA6522(config, "via1", SYM1_CLOCK).irq_handler().set("mainirq", FUNC(input_merger_device::in_w<0>)); + VIA6522(config, "via2", SYM1_CLOCK).irq_handler().set("mainirq", FUNC(input_merger_device::in_w<1>)); - MCFG_DEVICE_ADD("via3", VIA6522, SYM1_CLOCK) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, sym1_state, via3_a_w)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE("mainirq", input_merger_device, in_w<2>)) + via6522_device &via3(VIA6522(config, "via3", SYM1_CLOCK)); + via3.writepa_handler().set(FUNC(sym1_state::via3_a_w)); + via3.irq_handler().set("mainirq", FUNC(input_merger_device::in_w<2>)); - MCFG_INPUT_MERGER_ANY_HIGH("mainirq") // wire-or connection - MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("maincpu", M6502_IRQ_LINE)) + input_merger_device &merger(INPUT_MERGER_ANY_HIGH(config, "mainirq", 0)); // wire-or connection + merger.output_handler().set_inputline(m_maincpu, M6502_IRQ_LINE); - MCFG_DEVICE_ADD("crt", RS232_PORT, default_rs232_devices, nullptr) - MCFG_DEVICE_ADD("tty", RS232_PORT, default_rs232_devices, nullptr) // actually a 20 mA current loop; 110 bps assumed + RS232_PORT(config, "crt", default_rs232_devices, nullptr); + RS232_PORT(config, "tty", default_rs232_devices, nullptr); // actually a 20 mA current loop; 110 bps assumed // internal ram - MCFG_RAM_ADD(RAM_TAG) - MCFG_RAM_DEFAULT_SIZE("4K") - MCFG_RAM_EXTRA_OPTIONS("1K,2K,3K") -MACHINE_CONFIG_END + RAM(config, m_ram); + m_ram->set_default_size("4K"); + m_ram->set_extra_options("1K,2K,3K"); +} //************************************************************************** diff --git a/src/mame/drivers/taito_l.cpp b/src/mame/drivers/taito_l.cpp index d19be238324..23ba4ff3c05 100644 --- a/src/mame/drivers/taito_l.cpp +++ b/src/mame/drivers/taito_l.cpp @@ -1582,7 +1582,7 @@ MACHINE_CONFIG_START(taitol_2cpu_state::raimais) tc0040ioc.write_4_callback().set(FUNC(taitol_state::coin_control_w)); tc0040ioc.read_7_callback().set_ioport("IN2"); - MB8421(config, "dpram", 0); + MB8421(config, "dpram"); MCFG_MACHINE_START_OVERRIDE(taitol_state, taito_l) MCFG_MACHINE_RESET_OVERRIDE(taitol_state, taito_l) @@ -1626,7 +1626,7 @@ MACHINE_CONFIG_START(taitol_2cpu_state::kurikint) tc0040ioc.write_4_callback().set(FUNC(taitol_state::coin_control_w)); tc0040ioc.read_7_callback().set_ioport("IN2"); - MB8421(config, "dpram", 0); + MB8421(config, "dpram"); MCFG_MACHINE_START_OVERRIDE(taitol_state, taito_l) MCFG_MACHINE_RESET_OVERRIDE(taitol_state, taito_l) @@ -1773,8 +1773,8 @@ MACHINE_CONFIG_START(taitol_2cpu_state::evilston) tc0510nio.write_4_callback().set(FUNC(taitol_state::coin_control_w)); tc0510nio.read_7_callback().set_ioport("IN2"); - MCFG_DEVICE_ADD("dpram", MB8421, 0) - MCFG_MB8421_INTL_HANDLER(INPUTLINE("audiocpu", INPUT_LINE_NMI)) + mb8421_device &dpram(MB8421(config, "dpram")); + dpram.intl_callback().set_inputline("audiocpu", INPUT_LINE_NMI); MCFG_MACHINE_START_OVERRIDE(taitol_state, taito_l) MCFG_MACHINE_RESET_OVERRIDE(taitol_state, taito_l) diff --git a/src/mame/drivers/terco.cpp b/src/mame/drivers/terco.cpp index 7ce129f7df2..a169121c0f6 100644 --- a/src/mame/drivers/terco.cpp +++ b/src/mame/drivers/terco.cpp @@ -5,8 +5,8 @@ * * History of Terco *------------------ - * Terco, founded 1963, is a privatelly held company in Sweden that develops and distribute equipment for - * technical vocational educations worldwide. In the mid 80:ies they had a number of state of the art + * Terco, founded 1963, is a privately held company in Sweden that develops and distribute equipment for + * technical vocational educations worldwide. In the mid 80s they had a number of state of the art * products for educations on CNC machines, both mill and lathe, all based on Motorola 8-bit CPU:s. * * Known products @@ -25,11 +25,11 @@ * ------ * - Display * - Clickable Artwork - * - Serial communication for printer, plotter, paper tape and downlaod from the T4426 + * - Serial communication for printer, plotter, paper tape and download from the T4426 * - Identify expansion bus * - Keyboard Controller * - Dump keyboard ROM - * - Cassette i/f + * - Cassette i/o */ #include "emu.h" @@ -70,7 +70,7 @@ * 4527 - BCD Rate Multiplexer * 555 - analog timer circuit * 6800 - 8 bit CPU - * 6821 - PIA paralell interface + * 6821 - PIA parallel interface * 6850 - ACIA serial interface * 7400 - Quad 2 input NAND gates * 7402 - Quad 2 input NOR gates diff --git a/src/mame/drivers/terminal.cpp b/src/mame/drivers/terminal.cpp new file mode 100644 index 00000000000..e4bba3a234c --- /dev/null +++ b/src/mame/drivers/terminal.cpp @@ -0,0 +1,213 @@ +// license:BSD-3-Clause +// copyright-holders:Robbbert +/*************************************************************************** + +Skeleton driver for numerous random terminals + +2018-08-08 + +http://oldcomputer.info/terminal/ + + + +****************************************************************************/ + +#include "emu.h" +#include "cpu/z80/z80.h" + + +class terminal_state : public driver_device +{ +public: + terminal_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) + , m_maincpu(*this, "maincpu") + { } + + void terminal(machine_config &config); + +private: + + void mem_map(address_map &map); + required_device<cpu_device> m_maincpu; +}; + + +void terminal_state::mem_map(address_map &map) +{ + map.unmap_value_high(); + map(0x0000, 0xffff).rom(); +} + + + +/* Input ports */ +static INPUT_PORTS_START( terminal ) +INPUT_PORTS_END + + +MACHINE_CONFIG_START( terminal_state::terminal ) + MCFG_DEVICE_ADD("maincpu", Z80, 4'000'000) + MCFG_DEVICE_PROGRAM_MAP(mem_map) +MACHINE_CONFIG_END + + +/* ROM definition */ + +// for French Minitel network +ROM_START( alcat258 ) // MSM80C154 (+ TS9347// 8k ram // b&w + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "polish.bin", 0x0000, 0x8000, CRC(ce90f550) SHA1(fca5311704ca9e4d57414cfed96bb2a8ff73a145) ) + + ROM_REGION( 0x0100, "user1", 0 ) + ROM_LOAD( "serial.bin", 0x0000, 0x0100, CRC(f0b99b8f) SHA1(906c285fd327eba2ba9798695acc456535b84570) ) +ROM_END + + +ROM_START( alcat7100 ) // Z80 // 256k ram // b&w // looks like it needs a boot floppy to start + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "rom.u117", 0x0000, 0x0800, CRC(9c0debf7) SHA1(a042db34090656224ede41d8190f22f719d1a634) ) + ROM_LOAD( "906_513601_012gd2.u110", 0x0800, 0x0800, CRC(9346a41c) SHA1(6f7a2946494adac4d34874da9d5e475c99457000) ) // keyboard? + + ROM_REGION( 0x1000, "chargen", 0 ) // first half blank + ROM_LOAD( "906_513301_rev00_ba6d.u20", 0x0000, 0x1000, CRC(143cfdfc) SHA1(4d924d1f16c30d72e1fdbb786488156bb9961442) ) +ROM_END + + +ROM_START( ampex210 ) // Z80 (+6551,MC2672,3515260-01, 3 xtals, speaker) // 8k ram // amber + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "35-5960-03.u30", 0x0000, 0x8000, CRC(d3f86117) SHA1(f8a9b66899117b362b195bfc94c75bc902fb1376) ) + + ROM_REGION( 0x1000, "chargen", 0 ) + ROM_LOAD( "35-526-01.u3", 0x0000, 0x1000, CRC(4659bcd2) SHA1(554574f55ed875baba0a6133648c44df763cc5c4) ) +ROM_END + + +ROM_START( facit4440 ) // Z80 (+HD46505SP, 2x Z80ADART // 16k ram // b&w + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "rom7.bin", 0x0000, 0x4000, CRC(a8da2b11) SHA1(4436ef14c29ae299f7bc338748158771c02d02a9) ) + ROM_LOAD( "rom5.bin", 0xa000, 0x2000, CRC(715d02b6) SHA1(e304718dbdc8867ac01909fd2d027e5014a8c4f9) ) + + ROM_REGION( 0x8000, "chargen", 0 ) // order unknown + ROM_LOAD( "rom2.bin", 0x0000, 0x0800, CRC(9e1a190c) SHA1(fb08ee806f1056bcdfb5b08ea85995e1d3d01298) ) + ROM_LOAD( "rom1.bin", 0x0800, 0x1000, CRC(b503c173) SHA1(209bf59e2e9953179d04c4e768fc41574e039d36) ) + ROM_LOAD( "rom3.bin", 0x1800, 0x1000, CRC(a55a25d9) SHA1(c0d321e65f214adee01bf5f8c495b2518fa31b7b) ) + ROM_LOAD( "rom4.bin", 0x2800, 0x1000, CRC(52004ef8) SHA1(50d6e2eb48f60db3a3c9d206fc40d3294b6adc0e) ) + ROM_LOAD( "rom6.bin", 0x3800, 0x4000, CRC(790b7642) SHA1(688a80cbf011e5c14f501e11fe0e3bf64a85bbd7) ) +ROM_END + + +ROM_START( itt9216 ) // MC68008P8, (+beeper, 701188-001, xtal 38.080)// 64k ram // colour + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "174054-007.u52", 0x0000, 0x2000, CRC(be1f85c8) SHA1(8c44ff6166c43b524f41133053fa82f5c48047d8) ) + + ROM_REGION( 0x2000, "chargen", 0 ) + ROM_LOAD( "174055-004.u40", 0x0000, 0x2000, CRC(c8611425) SHA1(31fbdd6ff72a96c59277b6edac9a6360f6e1e49e) ) +ROM_END + + +ROM_START( loewed ) // order unknown // i8031, i8051(xtal 11.000 next to it), ITT LOTTI // 64k ram + battery-backed nvram // b&w + ROM_REGION( 0x28000, "maincpu", 0 ) + ROM_LOAD( "mainboard_18764_100.bin", 0x00000, 0x020000, CRC(f9ec7591) SHA1(1df7bdf33b8086166f1addb686a911a0c52dde32) ) + ROM_LOAD( "module_19315_056.bin", 0x20000, 0x008000, CRC(b333c5ed) SHA1(93cfa95e595bea83fe1b34a1426b80ceb1755c50) ) +ROM_END + + +ROM_START( loewe715 ) // i8051, ITT LOTTI // 64k ram // colour + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "eprom.bin", 0x00000, 0x10000, CRC(2668b944) SHA1(b7773c4d7a1e0dde2a2b414ae76e5faa1fa5e324) ) +ROM_END + + +ROM_START( t3210 ) // order unknown // i8031, 8742 // 4+2k ram onboard; 24kb in battery-backed expansion // b&w + ROM_REGION( 0x12000, "maincpu", 0 ) + ROM_LOAD( "s22723_r121-c2-2.d11", 0x00000, 0x0800, CRC(f0eda00e) SHA1(6b0d9f5e9d99644c3be16cbf0c0d3b1ea05aabee) ) + ROM_LOAD( "d8742_s22723_r118-c1.d16", 0x00800, 0x0800, CRC(f334a2a3) SHA1(c1cd4d775c2984252e6869a4c8f99d56646b89e9) ) + ROM_LOAD( "s22723_r115-c1-6_ct.d6", 0x01000, 0x8000, CRC(d09fea94) SHA1(52168060093dfe964c0316d9ff335cd59da01d48) ) + ROM_LOAD( "s22723_r115-c2-6_ct.d7", 0x09000, 0x8000, CRC(6e1eaacd) SHA1(cfda25dbbeddc7c75379c4b0dc97addb602d79ef) ) + ROM_LOAD( "prom_s22723_r120-c1.bin", 0x11000, 0x0100, CRC(4460cd50) SHA1(fe36d758d64493cb5f8217fe51bbbe8203424fbe) ) +ROM_END + + +ROM_START( feap90 ) // order unknown // i8031, i8742 (+SAA5351, 80C42C121) // 4+2k ram onboard; 24kb in battery-backed expansion // b&w + ROM_REGION( 0x18000, "maincpu", 0 ) + ROM_LOAD( "s22723-r116-c25-6 ex.d6", 0x00000, 0x10000, CRC(8362778d) SHA1(30fbe45eaedc1ed2e7b189f12e2ba7c23ab75de7) ) + ROM_LOAD( "s22723-r116-c26-6 ex.d2", 0x10000, 0x08000, CRC(121622ba) SHA1(c447da13f88772ec7d26e55ca8822e2c2dc3ecef) ) +ROM_END + + +ROM_START( ec7915 ) // Z80 // 6k ram // amber + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "50mp_0c10_30_lupper.bin", 0x0000, 0x0800, CRC(e019690f) SHA1(b0ce837a940ad82d2f39bd9d02e3c441cb9e83ed) ) + ROM_LOAD( "50mp_0810_40.bin", 0x0800, 0x0800, CRC(ed7f12d6) SHA1(b6f1da6a74f77cf1d392eee79f5ea168f3626ee5) ) + ROM_LOAD( "50mp_1010_49.bin", 0x1800, 0x0800, CRC(bfddf0e6) SHA1(dff4be8c0403519530e6c9106ab279a3037e074a) ) + ROM_LOAD( "50mp_1810_60.bin", 0x2000, 0x0800, CRC(759f2dc7) SHA1(515778ea213b9204f75f920ef1fbff6c14f9cf3c) ) + ROM_LOAD( "50mp_2c10_30_lower.bin", 0x5000, 0x0800, CRC(1ff59657) SHA1(777ef82e20a0100c0069ee5e7fbac5b3b86e3529) ) // keyboard rom? + + ROM_REGION( 0x0800, "chargen", 0 ) + ROM_LOAD( "char.bin", 0x0000, 0x0800, CRC(e75a6bc4) SHA1(04b56d1f5ab7f2145699555df5ac44d078804821) ) +ROM_END + + +ROM_START( 7951om ) // TTL (no cpu) // 1k x 6bits display ram 64-characters uppercase only, screen 40x12 // green + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "prom1_rear.bin", 0x0000, 0x0100, CRC(ab231a4c) SHA1(1412d0e9163125f28a777717c4dd9d5fd54b5196) ) + ROM_LOAD( "prom2.bin", 0x0100, 0x0100, CRC(5d65b9b6) SHA1(2ea22beb6edbedb1d215b4c55233af897cdeb535) ) + + ROM_REGION( 0x0800, "chargen", ROMREGION_INVERT ) + ROM_LOAD( "7951om.bin", 0x0000, 0x0800, CRC(36fc61c6) SHA1(6b5e8701b185b32a1a2630ddfc5402345628ecba) ) +ROM_END + + +ROM_START( vdm79322 ) // Z80 (there's a 8255, 8253, UA857D) // 8k ram // b&w // 8031 for kbd + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "27512_m322.bin", 0x00000, 0x10000, CRC(24573079) SHA1(b81c17e99493302054d78fbee2e416ab6493b5f3) ) + + ROM_REGION( 0x4000, "user1", 0 ) // keyboard? + ROM_LOAD( "27128_w322-3700.bin", 0x00000, 0x004000, CRC(e5e76ca2) SHA1(bb18c9fa29ef9fa0563aa07d2b856cf6594fc020) ) +ROM_END + + +ROM_START( ikt5a ) // order unknown // 80C51 (+xtal 15.000) // 8k ram // RGB external, uses XT keyboard + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "g26.bin", 0x0000, 0x2000, CRC(657668be) SHA1(212a9eb1fb9b9c16f3cc606c6befbd913ddfa395) ) + ROM_LOAD( "ver_ih.bin", 0x2000, 0x4000, CRC(5a15b4e8) SHA1(cc0336892279b730f1596f31e129c5a898ecdc8f) ) +ROM_END + + +ROM_START( teleguide ) // order unknown // i8051, i8031 (layout very similar to loewed) // 64k ram + battery-backed nvram // b&w + ROM_REGION( 0x38000, "maincpu", 0 ) + ROM_LOAD( "cardreader_17044-068_349-1163.bin", 0x00000, 0x10000, CRC(3c980c0d) SHA1(9904ffd283a11defbe3daf2cb9029bcead8b02d0) ) + ROM_LOAD( "mainboard_18764-063_349-1173.bin", 0x10000, 0x20000, CRC(eb5c2d05) SHA1(dba2f72f928487e83741ad24d70b568e4510988e) ) + ROM_LOAD( "module_19315-051_349-01173.bin", 0x20000, 0x08000, CRC(29c4b49d) SHA1(9bf37616eb130cb6bf86954b4a4952ea99d43ce8) ) +ROM_END + + +ROM_START( a1010 ) // 65SC02 (+ 4x 65SC22, 65SC51, SED1330F, xtal ??? + 6.400, 3.6v battery, RTC 58321A) // 32k + 8k + 8k ram // b&w LCD // This is a portable digital teletype machine + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "d15_31.bin", 0x0000, 0x8000, CRC(5ee1175d) SHA1(87ff6a3d5c64a53b0ab23d54aa343365c44d0407) ) + + ROM_REGION( 0x8000, "chargen", 0 ) + ROM_LOAD( "chargen.bin", 0x0000, 0x8000, CRC(07daa70e) SHA1(8066a0ac238b06fbeeb99c3a2a8a9e70a27db7a9) ) +ROM_END + + + +/* Driver */ + +/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */ +COMP( 1991, alcat258, 0, 0, terminal, terminal, terminal_state, empty_init, "Alcatel", "Terminatel 258", MACHINE_IS_SKELETON ) +COMP( 1984, alcat7100, 0, 0, terminal, terminal, terminal_state, empty_init, "Alcatel", "Terminal 7100", MACHINE_IS_SKELETON ) +COMP( 1989, ampex210, 0, 0, terminal, terminal, terminal_state, empty_init, "Ampex", "210+", MACHINE_IS_SKELETON ) +COMP( 1986, facit4440, 0, 0, terminal, terminal, terminal_state, empty_init, "Facit", "Terminal 4440 (30M-F1)", MACHINE_IS_SKELETON ) +COMP( 1986, itt9216, 0, 0, terminal, terminal, terminal_state, empty_init, "ITT", "Courier 9216-X", MACHINE_IS_SKELETON ) +COMP( 1992, loewed, 0, 0, terminal, terminal, terminal_state, empty_init, "Loewe", "Multitel D", MACHINE_IS_SKELETON ) +COMP( 1988, loewe715, 0, 0, terminal, terminal, terminal_state, empty_init, "Loewe", "Multicom 715L", MACHINE_IS_SKELETON ) +COMP( 1986, t3210, 0, 0, terminal, terminal, terminal_state, empty_init, "Siemens", "Bitel T3210", MACHINE_IS_SKELETON ) +COMP( 1986, feap90, 0, 0, terminal, terminal, terminal_state, empty_init, "Siemens", "Multitel Fe Ap 90-1.1", MACHINE_IS_SKELETON ) +COMP( 198?, ec7915, 0, 0, terminal, terminal, terminal_state, empty_init, "Mera-Elzab", "EC-7915 (EC-7950)", MACHINE_IS_SKELETON ) +COMP( 1987, 7951om, 0, 0, terminal, terminal, terminal_state, empty_init, "Mera-Elzab", "7951om", MACHINE_IS_SKELETON ) +COMP( 1992, vdm79322, 0, 0, terminal, terminal, terminal_state, empty_init, "Mera-Elzab", "VDM79322", MACHINE_IS_SKELETON ) +COMP( 1993, ikt5a, 0, 0, terminal, terminal, terminal_state, empty_init, "Creator / Fura Elektronik", "IKT-5A", MACHINE_IS_SKELETON ) +COMP( 1992, teleguide, 0, 0, terminal, terminal, terminal_state, empty_init, "Loewe / Televerket", "Teleguide", MACHINE_IS_SKELETON ) +COMP( 1993, a1010, 0, 0, terminal, terminal, terminal_state, empty_init, "Humantechnik", "Textel Compact A1010-0", MACHINE_IS_SKELETON ) diff --git a/src/mame/drivers/thomson.cpp b/src/mame/drivers/thomson.cpp index 7c0e877203f..3461f4540d6 100644 --- a/src/mame/drivers/thomson.cpp +++ b/src/mame/drivers/thomson.cpp @@ -625,7 +625,7 @@ MACHINE_CONFIG_START(thomson_state::to7) MCFG_MACHINE_RESET_OVERRIDE( thomson_state, to7 ) /* cpu */ - MCFG_DEVICE_ADD("maincpu", MC6809E, 1000000) + MCFG_DEVICE_ADD("maincpu", MC6809E, 16_MHz_XTAL / 16) MCFG_DEVICE_PROGRAM_MAP(to7) MCFG_INPUT_MERGER_ANY_HIGH("mainirq") @@ -651,7 +651,7 @@ MACHINE_CONFIG_START(thomson_state::to7) /* sound */ SPEAKER(config, "speaker").front_center(); MCFG_DEVICE_ADD("buzzer", DAC_1BIT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5) - MCFG_DEVICE_ADD("dac", DAC_6BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5) // unknown DAC (6-bit game extension DAC) + MCFG_DEVICE_ADD("dac", DAC_6BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5) // 6-bit game extension R-2R DAC (R=10K) MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0) MCFG_SOUND_ROUTE(0, "buzzer", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT) @@ -667,7 +667,7 @@ MACHINE_CONFIG_START(thomson_state::to7) MCFG_CASSETTE_INTERFACE("to_cass") /* timer */ - MCFG_DEVICE_ADD("mc6846", MC6846, 0) + MCFG_DEVICE_ADD("mc6846", MC6846, 16_MHz_XTAL / 16) MCFG_MC6846_OUT_PORT_CB(WRITE8(*this, thomson_state, to7_timer_port_out)) MCFG_MC6846_OUT_CP2_CB(WRITELINE("buzzer", dac_bit_interface, write)) MCFG_MC6846_IN_PORT_CB(READ8(*this, thomson_state, to7_timer_port_in)) @@ -675,7 +675,7 @@ MACHINE_CONFIG_START(thomson_state::to7) MCFG_MC6846_IRQ_CB(WRITELINE("mainirq", input_merger_device, in_w<0>)) /* floppy */ - MCFG_DEVICE_ADD("mc6843", MC6843, 0) + MCFG_DEVICE_ADD("mc6843", MC6843, 16_MHz_XTAL / 16 / 2) MCFG_DEVICE_ADD(m_floppy_image[0], LEGACY_FLOPPY, 0) MCFG_LEGACY_FLOPPY_CONFIG(thomson_floppy_interface) @@ -690,14 +690,14 @@ MACHINE_CONFIG_START(thomson_state::to7) MCFG_LEGACY_FLOPPY_CONFIG(thomson_floppy_interface) MCFG_LEGACY_FLOPPY_IDX_CB(WRITELINE(*this, thomson_state, fdc_index_3_w)) - MCFG_DEVICE_ADD("wd2793", WD2793, 1_MHz_XTAL) + MCFG_DEVICE_ADD("wd2793", WD2793, 16_MHz_XTAL / 16) MCFG_FLOPPY_DRIVE_ADD("wd2793:0", cd90_640_floppies, "dd", thomson_state::cd90_640_formats) MCFG_FLOPPY_DRIVE_ADD("wd2793:1", cd90_640_floppies, "dd", thomson_state::cd90_640_formats) /* network */ - MCFG_DEVICE_ADD("mc6854", MC6854, 0) - MCFG_MC6854_OUT_FRAME_CB(thomson_state, to7_network_got_frame) + MC6854(config, m_mc6854); + m_mc6854->set_out_frame_callback(FUNC(thomson_state::to7_network_got_frame)); /* pia */ @@ -1716,6 +1716,8 @@ MACHINE_CONFIG_START(thomson_state::to8) MCFG_DEVICE_MODIFY( "maincpu" ) MCFG_DEVICE_PROGRAM_MAP ( to8) + //MCFG_DEVICE_ADD("kbdmcu", MC6804, 11_MHz_XTAL) + MCFG_DEVICE_MODIFY(THOM_PIA_SYS) MCFG_PIA_READPA_HANDLER(READ8(*this, thomson_state, to8_sys_porta_in)) MCFG_PIA_READPB_HANDLER(CONSTANT(0)) diff --git a/src/mame/drivers/tourtabl.cpp b/src/mame/drivers/tourtabl.cpp index 93d55150bd5..340c8fbfc60 100644 --- a/src/mame/drivers/tourtabl.cpp +++ b/src/mame/drivers/tourtabl.cpp @@ -160,15 +160,15 @@ MACHINE_CONFIG_START(tourtabl_state::tourtabl) MCFG_DEVICE_ADD("maincpu", M6502, MASTER_CLOCK / 3) /* actually M6507 */ MCFG_DEVICE_PROGRAM_MAP(main_map) - MCFG_DEVICE_ADD("riot1", RIOT6532, MASTER_CLOCK / 3) - MCFG_RIOT6532_IN_PA_CB(IOPORT("RIOT0_SWA")) - MCFG_RIOT6532_IN_PB_CB(IOPORT("RIOT0_SWB")) - MCFG_RIOT6532_OUT_PB_CB(WRITE8("watchdog", watchdog_timer_device, reset_w)) - - MCFG_DEVICE_ADD("riot2", RIOT6532, MASTER_CLOCK / 3) - MCFG_RIOT6532_IN_PA_CB(IOPORT("RIOT1_SWA")) - MCFG_RIOT6532_IN_PB_CB(IOPORT("RIOT1_SWB")) - MCFG_RIOT6532_OUT_PB_CB(WRITE8(*this, tourtabl_state, tourtabl_led_w)) + riot6532_device &riot1(RIOT6532(config, "riot1", MASTER_CLOCK / 3)); + riot1.in_pa_callback().set_ioport("RIOT0_SWA"); + riot1.in_pb_callback().set_ioport("RIOT0_SWB"); + riot1.out_pb_callback().set("watchdog", FUNC(watchdog_timer_device::reset_w)); + + riot6532_device &riot2(RIOT6532(config, "riot2", MASTER_CLOCK / 3)); + riot2.in_pa_callback().set_ioport("RIOT1_SWA"); + riot2.in_pb_callback().set_ioport("RIOT1_SWB"); + riot2.out_pb_callback().set(FUNC(tourtabl_state::tourtabl_led_w)); MCFG_WATCHDOG_ADD("watchdog") diff --git a/src/mame/drivers/tourvis.cpp b/src/mame/drivers/tourvis.cpp index d34046908d2..6b04d125006 100644 --- a/src/mame/drivers/tourvis.cpp +++ b/src/mame/drivers/tourvis.cpp @@ -180,7 +180,6 @@ http://blog.system11.org/?p=1943 #include "cpu/i8085/i8085.h" #include "video/huc6260.h" #include "video/huc6270.h" -#include "sound/c6280.h" #include "machine/i8155.h" #include "bus/generic/slot.h" @@ -341,10 +340,6 @@ void tourvision_state::pce_mem(address_map &map) map(0x1F0000, 0x1F1FFF).ram().mirror(0x6000); map(0x1FE000, 0x1FE3FF).rw("huc6270", FUNC(huc6270_device::read), FUNC(huc6270_device::write)); map(0x1FE400, 0x1FE7FF).rw(m_huc6260, FUNC(huc6260_device::read), FUNC(huc6260_device::write)); - map(0x1FE800, 0x1FEBFF).rw("c6280", FUNC(c6280_device::c6280_r), FUNC(c6280_device::c6280_w)); - map(0x1FEC00, 0x1FEFFF).rw(m_maincpu, FUNC(h6280_device::timer_r), FUNC(h6280_device::timer_w)); - map(0x1FF000, 0x1FF3FF).rw(FUNC(tourvision_state::pce_joystick_r), FUNC(tourvision_state::pce_joystick_w)); - map(0x1FF400, 0x1FF7FF).rw(m_maincpu, FUNC(h6280_device::irq_status_r), FUNC(h6280_device::irq_status_w)); } void tourvision_state::pce_io(address_map &map) @@ -396,9 +391,14 @@ WRITE_LINE_MEMBER(tourvision_state::tourvision_timer_out) MACHINE_CONFIG_START(tourvision_state::tourvision) /* basic machine hardware */ - MCFG_DEVICE_ADD("maincpu", H6280, PCE_MAIN_CLOCK/3) - MCFG_DEVICE_PROGRAM_MAP(pce_mem) - MCFG_DEVICE_IO_MAP(pce_io) + H6280(config, m_maincpu, PCE_MAIN_CLOCK/3); + m_maincpu->set_addrmap(AS_PROGRAM, &tourvision_state::pce_mem); + m_maincpu->set_addrmap(AS_IO, &tourvision_state::pce_io); + m_maincpu->port_in_cb().set(FUNC(tourvision_state::pce_joystick_r)); + m_maincpu->port_out_cb().set(FUNC(tourvision_state::pce_joystick_w)); + m_maincpu->add_route(0, "lspeaker", 1.00); + m_maincpu->add_route(1, "rspeaker", 1.00); + MCFG_QUANTUM_TIME(attotime::from_hz(60)) MCFG_DEVICE_ADD("subcpu", I8085A, 18000000/3 /*?*/) @@ -427,10 +427,6 @@ MACHINE_CONFIG_START(tourvision_state::tourvision) SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); - MCFG_DEVICE_ADD("c6280", C6280, PCE_MAIN_CLOCK/6) - MCFG_C6280_CPU("maincpu") - MCFG_SOUND_ROUTE(0, "lspeaker", 1.00) - MCFG_SOUND_ROUTE(1, "rspeaker", 1.00) MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "tourvision_cart") MCFG_GENERIC_EXTENSIONS("bin") diff --git a/src/mame/drivers/triforce.cpp b/src/mame/drivers/triforce.cpp index 798f2f547ed..327e63f9505 100644 --- a/src/mame/drivers/triforce.cpp +++ b/src/mame/drivers/triforce.cpp @@ -74,7 +74,7 @@ Games on this system include.... | | 2004 | The Key Of Avalon 2: Eutaxy Commandment (client) | Sega / Hitmaker | GDROM | GDT-0017 | 317-0403-JPN | 253-5508-0403J| | | 2004 | The Key Of Avalon 2: Eutaxy Commandment (client) (Rev A) | Sega / Hitmaker | GDROM | GDT-0017A | 317-0403-JPN | 253-5508-0403J| |*| 2004 | The Key Of Avalon 2: Eutaxy Commandment (client) (Rev B) | Sega / Hitmaker | GDROM | GDT-0017B | 317-0403-JPN | 253-5508-0403J| -| | 2004 | F-Zero AX - Monster Ride Cycraft Edition | Sega / Amusement Vision / Nintendo | GDROM | | | | +|*| 2003 | F-Zero AX - Monster Ride Cycraft Edition | Sega / Amusement Vision / Nintendo | Cart | 837-14343-4S1 | 317-0373-COM | 253-5508-0373 | |*| 2005 | Mario Kart Arcade GP (Japan, MKA1 Ver.A1) | Namco / Nintendo | Cart | 837-14343-4T1 | 317-5109-COM | 253-5509-5109 | | | 2005 | The Key Of Avalon 2.5: War of the Key (server) | Sega / Hitmaker | GDROM | GDT-0018 | 317-0403-JPN | 253-5508-0403J| |*| 2005 | The Key Of Avalon 2.5: War of the Key (server) (Rev A) | Sega / Hitmaker | GDROM | GDT-0018A | 317-0403-JPN | 253-5508-0403J| @@ -1116,6 +1116,34 @@ ROM_START( mkartag2a ) ROM_LOAD("317-5128-com.pic", 0x00, 0x4000, CRC(0231b10c) SHA1(e060d74753a39081364e3175ac12e724ad585c33) ) ROM_END +/* + +F-ZERO AX MONSTER RIDE +Cart: 842-06CN4000 +ROM PCB: 837-14343-4S1 +Actel ProAsic: 315-6362 +Key Chip (PIC): 253-5508-0373 +IC1-IC4 Samsung K9K1G08UOA +IC9 MX 29LV400TTC + +*/ + +ROM_START( fzeroaxm ) + TRIFORCE_BIOS + + ROM_REGION(0x21200000, "rom_board", 0) + // DES encrypted + ROM_LOAD16_BYTE( "ic1.bin", 0x00000000, 0x8400000, CRC(50d1363d) SHA1(d673ef4e5f6c9dfb7a3b9c3bd453a9d7b86077a2) ) + ROM_LOAD16_BYTE( "ic2.bin", 0x00000001, 0x8400000, CRC(ce749357) SHA1(ecbd318fa6d183ba9428170b61699d8808356df8) ) + ROM_LOAD16_BYTE( "ic3s.bin", 0x10800000, 0x8400000, CRC(0f7bd95a) SHA1(33fa62685e2039266be3448bec386c774174952b) ) + ROM_LOAD16_BYTE( "ic4s.bin", 0x10800001, 0x8400000, CRC(9f10994f) SHA1(987b8b3051a17f3085fe7fbad595c56c1d05f605) ) + // below contain rom board NAND block list/map (16bit words), the "block" is 2 * 32 NAND pages (512 data bytes +16 ECC?) + ROM_LOAD16_BYTE( "ic9.bin", 0x21000000, 0x0080000, CRC(bf461723) SHA1(4c18a4c3fabde7e63e36a7fcda19cd6acfe45f84) ) + + ROM_REGION( 0x4000, "pic", ROMREGION_ERASEFF) + ROM_LOAD("317-0373-com.pic", 0x00, 0x4000, CRC(0e48f645) SHA1(ec057b0f536c3e9ce5353c02676cf17e96bb3239) ) +ROM_END + /* Main board */ /*Triforce*/GAME( 2002, triforce, 0, triforce_base, triforce, triforce_state, empty_init, ROT0, "Sega", "Triforce Bios", MACHINE_IS_SKELETON|MACHINE_IS_BIOS_ROOT ) @@ -1188,6 +1216,7 @@ ROM_END /* 0022A */ GAME( 2006, tcfboxa, triforce, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega", "Triforce Firmware Update For Compact Flash Box (4.01) (GDT-0022A)", MACHINE_IS_SKELETON ) // 837-xxxxx (Sega cart games) +/* 14343-4S1 */ GAME( 2003, fzeroaxm, triforce, triforce_base, triforce, triforce_state, empty_init, ROT0, "Sega / Amusement Vision / Nintendo", "F-Zero AX Monster Ride", MACHINE_IS_SKELETON ) // 2003/09/04 /* 14343-4T1 */ GAME( 2005, mkartagp, triforce, triforce_base, triforce, triforce_state, empty_init, ROT0, "Namco / Nintendo", "Mario Kart Arcade GP (Japan, MKA1 Ver.A1)", MACHINE_IS_SKELETON ) /* 14343-R4S0 */ GAME( 2007, mkartag2, triforce, triforce_base, triforce, triforce_state, empty_init, ROT0, "Namco / Nintendo", "Mario Kart Arcade GP 2 (Japan, MK21 Ver.A)", MACHINE_IS_SKELETON ) /* 14343-R4S0 */ GAME( 2007, mkartag2a,mkartag2, triforce_base, triforce, triforce_state, empty_init, ROT0, "Namco / Nintendo", "Mario Kart Arcade GP 2 (Japan, MK21 Ver.A, alt dump)", MACHINE_IS_SKELETON ) diff --git a/src/mame/drivers/trs80.cpp b/src/mame/drivers/trs80.cpp index 4da7e62fe45..a255f524503 100644 --- a/src/mame/drivers/trs80.cpp +++ b/src/mame/drivers/trs80.cpp @@ -145,8 +145,7 @@ radionic: works floppy not working (@6C0, DRQ never gets set) add colour expansion-box? - uart? - add i8255 + uart lnw80: works add 1.77 / 4 MHz switch @@ -261,6 +260,17 @@ void trs80_state::lnw80_io(address_map &map) map(0xfe, 0xfe).rw(FUNC(trs80_state::lnw80_fe_r), FUNC(trs80_state::lnw80_fe_w)); } +void trs80_state::radionic_mem(address_map &map) +{ + m1_mem(map); + // Optional external RS232 module with 8251 + //map(0x3400, 0x3400).mirror(0xfe).rw("uart2", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); + //map(0x3401, 0x3401).mirror(0xfe).rw("uart2", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + // Internal colour controls (need details) + //map(0x3500, 0x35ff).w(FUNC(trs80_state::colour_w)); + // Internal interface to external slots + map(0x3600, 0x3603).mirror(0xfc).rw("ppi", FUNC(i8255_device::read), FUNC(i8255_device::write)); +} /************************************************************************** w/o SHIFT with SHIFT @@ -618,11 +628,19 @@ MACHINE_CONFIG_START(trs80_state::radionic) // whose master clock was approximately 11.8005 MHz (6 times ~1.966 MHz and 750 times 15.734 kHz). Though the schematics // provide the main XTAL frequency as 12 MHz, that they also include a 3.579 MHz XTAL suggests this possibility. MCFG_DEVICE_PERIODIC_INT_DRIVER(trs80_state, nmi_line_pulse, 12_MHz_XTAL / 12 / 16384) + MCFG_DEVICE_PROGRAM_MAP(radionic_mem) MCFG_SCREEN_MODIFY("screen") MCFG_SCREEN_RAW_PARAMS(12_MHz_XTAL, 768, 0, 512, 312, 0, 256) MCFG_SCREEN_UPDATE_DRIVER(trs80_state, screen_update_radionic) MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_radionic) + + // Interface to external circuits + MCFG_DEVICE_ADD("ppi", I8255, 0) + //MCFG_I8255_OUT_PORTA_CB(WRITE8(*this, pulsar_state, ppi_pa_w)) // Data for external plugin printer module + //MCFG_I8255_OUT_PORTB_CB(WRITE8(*this, pulsar_state, ppi_pb_w)) // Control data to external + //MCFG_I8255_IN_PORTC_CB(READ8(*this, pulsar_state, ppi_pc_r)) // Sensing from external and printer status + //MCFG_I8255_OUT_PORTC_CB(WRITE8(*this, pulsar_state, ppi_pc_w)) // Printer strobe MACHINE_CONFIG_END @@ -658,7 +676,7 @@ ROM_END ROM_START(radionic) - ROM_REGION(0x4000, "maincpu",0) + ROM_REGION(0x3800, "maincpu",0) ROM_LOAD("ep1.bin", 0x0000, 0x1000, CRC(e8908f44) SHA1(7a5a60c3afbeb6b8434737dd302332179a7fca59)) ROM_LOAD("ep2.bin", 0x1000, 0x1000, CRC(46e88fbf) SHA1(a3ca32757f269e09316e1e91ba1502774e2f5155)) ROM_LOAD("ep3.bin", 0x2000, 0x1000, CRC(306e5d66) SHA1(1e1abcfb5b02d4567cf6a81ffc35318723442369)) diff --git a/src/mame/drivers/trs80m3.cpp b/src/mame/drivers/trs80m3.cpp index db8b3b44b6d..dd4f1c0d8e9 100644 --- a/src/mame/drivers/trs80m3.cpp +++ b/src/mame/drivers/trs80m3.cpp @@ -58,10 +58,9 @@ To Do / Status: -------------- trs80m3: works - floppy not working trs80m4: works - floppy not working + will boot model 3 floppies, but not model 4 ones trs80m4p: floppy not working, so machine is useless @@ -108,6 +107,11 @@ void trs80m3_state::m3_io(address_map &map) map(0xfc, 0xff).rw(FUNC(trs80m3_state::port_ff_r), FUNC(trs80m3_state::port_ff_w)); } +void trs80m3_state::m4_mem(address_map &map) +{ + map(0x0000, 0xffff).m(m_m4_bank, FUNC(address_map_bank_device::amap8)); +} + void trs80m3_state::m4_banked_mem(address_map &map) { // Memory Map I - Model III Mode @@ -146,6 +150,11 @@ void trs80m3_state::m4_io(address_map &map) map(0x90, 0x93).w(FUNC(trs80m3_state::port_90_w)); } +void trs80m3_state::m4p_mem(address_map &map) +{ + map(0x0000, 0xffff).m(m_m4p_bank, FUNC(address_map_bank_device::amap8)); +} + void trs80m3_state::m4p_banked_mem(address_map &map) { // Memory Map I - Model III Mode @@ -387,6 +396,7 @@ MACHINE_CONFIG_END MACHINE_CONFIG_START(trs80m3_state::model4) model3(config); MCFG_DEVICE_MODIFY("maincpu") + MCFG_DEVICE_PROGRAM_MAP(m4_mem) MCFG_DEVICE_IO_MAP(m4_io) RAM(config, m_mainram, 0); @@ -404,11 +414,12 @@ MACHINE_CONFIG_END MACHINE_CONFIG_START(trs80m3_state::model4p) model3(config); MCFG_DEVICE_MODIFY("maincpu") + MCFG_DEVICE_PROGRAM_MAP(m4p_mem) MCFG_DEVICE_IO_MAP(m4p_io) RAM(config, m_mainram, 0); m_mainram->set_default_size("64K"); - m_mainram->set_extra_options("16K,128K"); + m_mainram->set_extra_options("128K"); ADDRESS_MAP_BANK(config, m_m4p_bank, 0); m_m4p_bank->set_map(&trs80m3_state::m4p_banked_mem); diff --git a/src/mame/drivers/trvquest.cpp b/src/mame/drivers/trvquest.cpp index 6cad05b5f61..31f3c82c119 100644 --- a/src/mame/drivers/trvquest.cpp +++ b/src/mame/drivers/trvquest.cpp @@ -178,13 +178,14 @@ INTERRUPT_GEN_MEMBER(gameplan_state::trvquest_interrupt) m_via_2->write_ca1(0); } -MACHINE_CONFIG_START(gameplan_state::trvquest) +void gameplan_state::trvquest(machine_config &config) +{ + M6809(config, m_maincpu, XTAL(6'000'000)/4); + m_maincpu->set_addrmap(AS_PROGRAM, &gameplan_state::cpu_map); + m_maincpu->set_vblank_int("screen", FUNC(gameplan_state::trvquest_interrupt)); - MCFG_DEVICE_ADD("maincpu", M6809,XTAL(6'000'000)/4) - MCFG_DEVICE_PROGRAM_MAP(cpu_map) - MCFG_DEVICE_VBLANK_INT_DRIVER("screen", gameplan_state, trvquest_interrupt) + NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1); - MCFG_NVRAM_ADD_1FILL("nvram") MCFG_MACHINE_START_OVERRIDE(gameplan_state,trvquest) MCFG_MACHINE_RESET_OVERRIDE(gameplan_state,trvquest) @@ -194,29 +195,26 @@ MACHINE_CONFIG_START(gameplan_state::trvquest) /* sound hardware */ SPEAKER(config, "mono").front_center(); - MCFG_DEVICE_ADD("ay1", AY8910, XTAL(6'000'000)/2) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) - - MCFG_DEVICE_ADD("ay2", AY8910, XTAL(6'000'000)/2) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) + AY8910(config, "ay1", XTAL(6'000'000)/2).add_route(ALL_OUTPUTS, "mono", 0.25); + AY8910(config, "ay2", XTAL(6'000'000)/2).add_route(ALL_OUTPUTS, "mono", 0.25); /* via */ - MCFG_DEVICE_ADD("via6522_0", VIA6522, XTAL(6'000'000)/4) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, gameplan_state, video_data_w)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, gameplan_state, gameplan_video_command_w)) - MCFG_VIA6522_CA2_HANDLER(WRITELINE(*this, gameplan_state, video_command_trigger_w)) - - MCFG_DEVICE_ADD("via6522_1", VIA6522, XTAL(6'000'000)/4) - MCFG_VIA6522_READPA_HANDLER(IOPORT("IN0")) - MCFG_VIA6522_READPB_HANDLER(IOPORT("IN1")) - MCFG_VIA6522_CA2_HANDLER(WRITELINE(*this, gameplan_state, trvquest_coin_w)) - - MCFG_DEVICE_ADD("via6522_2", VIA6522, XTAL(6'000'000)/4) - MCFG_VIA6522_READPA_HANDLER(IOPORT("UNK")) - MCFG_VIA6522_READPB_HANDLER(IOPORT("DSW")) - MCFG_VIA6522_CA2_HANDLER(WRITELINE(*this, gameplan_state, trvquest_misc_w)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, gameplan_state, via_irq)) -MACHINE_CONFIG_END + VIA6522(config, m_via_0, XTAL(6'000'000)/4); + m_via_0->writepa_handler().set(FUNC(gameplan_state::video_data_w)); + m_via_0->writepb_handler().set(FUNC(gameplan_state::gameplan_video_command_w)); + m_via_0->ca2_handler().set(FUNC(gameplan_state::video_command_trigger_w)); + + VIA6522(config, m_via_1, XTAL(6'000'000)/4); + m_via_1->readpa_handler().set_ioport("IN0"); + m_via_1->readpb_handler().set_ioport("IN1"); + m_via_1->ca2_handler().set(FUNC(gameplan_state::trvquest_coin_w)); + + VIA6522(config, m_via_2, XTAL(6'000'000)/4); + m_via_2->readpa_handler().set_ioport("UNK"); + m_via_2->readpb_handler().set_ioport("DSW"); + m_via_2->ca2_handler().set(FUNC(gameplan_state::trvquest_misc_w)); + m_via_2->irq_handler().set(FUNC(gameplan_state::via_irq)); +} ROM_START( trvquest ) ROM_REGION( 0x10000, "maincpu", 0 ) diff --git a/src/mame/drivers/tsispch.cpp b/src/mame/drivers/tsispch.cpp index aa0da41fb73..22e88d94a70 100644 --- a/src/mame/drivers/tsispch.cpp +++ b/src/mame/drivers/tsispch.cpp @@ -113,7 +113,9 @@ #include "emu.h" #include "includes/tsispch.h" +#include "bus/rs232/rs232.h" #include "cpu/i86/i86.h" +#include "machine/clock.h" #include "machine/i8251.h" #include "sound/dac.h" #include "sound/volt_reg.h" @@ -391,19 +393,27 @@ MACHINE_CONFIG_START(tsispch_state::prose2k) /* uarts */ MCFG_DEVICE_ADD("i8251a_u15", I8251, 0) - // (todo: proper hookup, currently using hack w/i8251_receive_character()) + MCFG_I8251_TXD_HANDLER(WRITELINE("rs232", rs232_port_device, write_txd)) + MCFG_I8251_DTR_HANDLER(WRITELINE("rs232", rs232_port_device, write_dtr)) + MCFG_I8251_RTS_HANDLER(WRITELINE("rs232", rs232_port_device, write_rts)) MCFG_I8251_RXRDY_HANDLER(WRITELINE(*this, tsispch_state, i8251_rxrdy_int)) MCFG_I8251_TXRDY_HANDLER(WRITELINE(*this, tsispch_state, i8251_txrdy_int)) MCFG_I8251_TXEMPTY_HANDLER(WRITELINE(*this, tsispch_state, i8251_txempty_int)) + clock_device &clock(CLOCK(config, "baudclock", 153600)); + clock.signal_handler().set("i8251a_u15", FUNC(i8251_device::write_txc)); + clock.signal_handler().append("i8251a_u15", FUNC(i8251_device::write_rxc)); + /* sound hardware */ SPEAKER(config, "speaker").front_center(); MCFG_DEVICE_ADD("dac", DAC_12BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0) // unknown DAC (TODO: correctly figure out how the DAC works; apparently it is connected to the serial output of the upd7720, which will be "fun" to connect up) MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0) MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT) - MCFG_DEVICE_ADD(TERMINAL_TAG, GENERIC_TERMINAL, 0) - MCFG_GENERIC_TERMINAL_KEYBOARD_CB(DEVPUT("i8251a_u15", i8251_device, receive_character)) + rs232_port_device &rs232(RS232_PORT(config, "rs232", default_rs232_devices, "terminal")); + rs232.rxd_handler().set("i8251a_u15", FUNC(i8251_device::write_rxd)); + rs232.dsr_handler().set("i8251a_u15", FUNC(i8251_device::write_dsr)); + rs232.cts_handler().set("i8251a_u15", FUNC(i8251_device::write_cts)); MACHINE_CONFIG_END /****************************************************************************** diff --git a/src/mame/drivers/tti.cpp b/src/mame/drivers/tti.cpp index 8ff60924a84..1435dad107d 100644 --- a/src/mame/drivers/tti.cpp +++ b/src/mame/drivers/tti.cpp @@ -59,16 +59,16 @@ void tti_state::prg_map(address_map &map) } MACHINE_CONFIG_START(tti_state::tti) - MCFG_DEVICE_ADD("maincpu", M68008, XTAL(20'000'000) / 2) // guess + MCFG_DEVICE_ADD("maincpu", M68008, 20_MHz_XTAL / 2) // guess MCFG_DEVICE_PROGRAM_MAP(prg_map) MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(tti_state, intack) - MCFG_DEVICE_ADD("mfp", MC68901, 0) - MCFG_MC68901_TIMER_CLOCK(XTAL(20'000'000) / 2) // guess - MCFG_MC68901_RX_CLOCK(9600) // for testing (FIXME: actually 16x) - MCFG_MC68901_TX_CLOCK(9600) // for testing (FIXME: actually 16x) - MCFG_MC68901_OUT_SO_CB(WRITELINE("rs232", rs232_port_device, write_txd)) - MCFG_MC68901_OUT_IRQ_CB(INPUTLINE("maincpu", M68K_IRQ_5)) + MC68901(config, m_mfp, 20_MHz_XTAL / 2); // guess + m_mfp->set_timer_clock(20_MHz_XTAL / 2); // guess + m_mfp->set_rx_clock(9600); // for testing (FIXME: actually 16x) + m_mfp->set_tx_clock(9600); // for testing (FIXME: actually 16x) + m_mfp->out_so_cb().set("rs232", FUNC(rs232_port_device::write_txd)); + m_mfp->out_irq_cb().set_inputline("maincpu", M68K_IRQ_5); MCFG_DEVICE_ADD("rs232", RS232_PORT, default_rs232_devices, "terminal") MCFG_RS232_RXD_HANDLER(WRITELINE("mfp", mc68901_device, write_rx)) diff --git a/src/mame/drivers/tv950.cpp b/src/mame/drivers/tv950.cpp index b1ce6dce2a6..a7d8f3ea708 100644 --- a/src/mame/drivers/tv950.cpp +++ b/src/mame/drivers/tv950.cpp @@ -272,44 +272,41 @@ MC6845_UPDATE_ROW( tv950_state::crtc_update_row ) m_row = (m_row + 1) % 250; } -MACHINE_CONFIG_START(tv950_state::tv950) +void tv950_state::tv950(machine_config &config) +{ /* basic machine hardware */ - MCFG_DEVICE_ADD("maincpu", M6502, MASTER_CLOCK/14) - MCFG_DEVICE_PROGRAM_MAP(tv950_mem) + M6502(config, m_maincpu, MASTER_CLOCK/14); + m_maincpu->set_addrmap(AS_PROGRAM, &tv950_state::tv950_mem); - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK, 1200, 0, 1120, 370, 0, 250 ) // not real values - MCFG_SCREEN_UPDATE_DEVICE( CRTC_TAG, r6545_1_device, screen_update ) + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); + screen.set_raw(MASTER_CLOCK, 1200, 0, 1120, 370, 0, 250); // not real values + screen.set_screen_update(CRTC_TAG, FUNC(r6545_1_device::screen_update)); // there are many 6845 CRTC submodels, the Theory of Operation manual references the Rockwell R6545-1 specificially. - MCFG_MC6845_ADD(CRTC_TAG, R6545_1, "screen", MASTER_CLOCK/14) - MCFG_MC6845_SHOW_BORDER_AREA(false) - MCFG_MC6845_CHAR_WIDTH(14) - MCFG_MC6845_UPDATE_ROW_CB(tv950_state, crtc_update_row) - MCFG_MC6845_ADDR_CHANGED_CB(tv950_state, crtc_update_addr) - MCFG_MC6845_OUT_HSYNC_CB(WRITELINE(VIA_TAG, via6522_device, write_pb6)) - MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(*this, tv950_state, crtc_vs_w)) - MCFG_VIDEO_SET_SCREEN(nullptr) - - MCFG_DEVICE_ADD(VIA_TAG, VIA6522, MASTER_CLOCK/14) - MCFG_VIA6522_IRQ_HANDLER(INPUTLINE("maincpu", M6502_NMI_LINE)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, tv950_state, via_a_w)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, tv950_state, via_b_w)) - MCFG_VIA6522_READPB_HANDLER(READ8(*this, tv950_state, via_b_r)) - MCFG_VIA6522_CA2_HANDLER(WRITELINE(*this, tv950_state, via_crtc_reset_w)) - //MCFG_VIA6522_CB2_HANDLER(WRITELINE(*this, tv950_state, via_blink_rate_w)) - - MCFG_DEVICE_ADD(ACIA1_TAG, MOS6551, 0) - MCFG_MOS6551_XTAL(MASTER_CLOCK/13) - - MCFG_DEVICE_ADD(ACIA2_TAG, MOS6551, 0) - MCFG_MOS6551_XTAL(MASTER_CLOCK/13) - - MCFG_DEVICE_ADD(ACIA3_TAG, MOS6551, 0) - MCFG_MOS6551_XTAL(MASTER_CLOCK/13) - - MCFG_DEVICE_ADD("kbd", I8748, XTAL(5'714'300)) -MACHINE_CONFIG_END + R6545_1(config, m_crtc, MASTER_CLOCK/14); + m_crtc->set_screen("screen"); + m_crtc->set_show_border_area(false); + m_crtc->set_char_width(14); + m_crtc->set_update_row_callback(FUNC(tv950_state::crtc_update_row), this); + m_crtc->set_on_update_addr_change_callback(FUNC(tv950_state::crtc_update_addr), this); + m_crtc->out_hsync_callback().set(VIA_TAG, FUNC(via6522_device::write_pb6)); + m_crtc->out_vsync_callback().set(FUNC(tv950_state::crtc_vs_w)); + m_crtc->set_screen(nullptr); + + VIA6522(config, m_via, MASTER_CLOCK/14); + m_via->irq_handler().set_inputline(m_maincpu, M6502_NMI_LINE); + m_via->writepa_handler().set(FUNC(tv950_state::via_a_w)); + m_via->writepb_handler().set(FUNC(tv950_state::via_b_w)); + m_via->readpb_handler().set(FUNC(tv950_state::via_b_r)); + m_via->ca2_handler().set(FUNC(tv950_state::via_crtc_reset_w)); + //m_via->cb2_handler().set(FUNC(tv950_state::via_blink_rate_w)); + + MOS6551(config, ACIA1_TAG, 0).set_xtal(MASTER_CLOCK/13); + MOS6551(config, ACIA2_TAG, 0).set_xtal(MASTER_CLOCK/13); + MOS6551(config, ACIA3_TAG, 0).set_xtal(MASTER_CLOCK/13); + + I8748(config, "kbd", XTAL(5'714'300)); +} /* ROM definition */ ROM_START( tv950 ) diff --git a/src/mame/drivers/tv990.cpp b/src/mame/drivers/tv990.cpp index b15988ea45c..2a845f7546e 100644 --- a/src/mame/drivers/tv990.cpp +++ b/src/mame/drivers/tv990.cpp @@ -412,9 +412,9 @@ MACHINE_CONFIG_START(tv990_state::tv990) MCFG_RS232_DCD_HANDLER(WRITELINE(UART1_TAG, ns16450_device, dcd_w)) MCFG_RS232_CTS_HANDLER(WRITELINE(UART1_TAG, ns16450_device, cts_w)) - MCFG_DEVICE_ADD("pc_kbdc", KBDC8042, 0) - MCFG_KBDC8042_KEYBOARD_TYPE(KBDC8042_AT386) - MCFG_KBDC8042_INPUT_BUFFER_FULL_CB(INPUTLINE("maincpu", M68K_IRQ_2)) + KBDC8042(config, m_kbdc); + m_kbdc->set_keyboard_type(kbdc8042_device::KBDC8042_AT386); + m_kbdc->input_buffer_full_callback().set_inputline("maincpu", M68K_IRQ_2); MCFG_NVRAM_ADD_0FILL("nvram") diff --git a/src/mame/drivers/tvboy.cpp b/src/mame/drivers/tvboy.cpp index 5a9f0bae655..1a37960360e 100644 --- a/src/mame/drivers/tvboy.cpp +++ b/src/mame/drivers/tvboy.cpp @@ -107,12 +107,12 @@ MACHINE_CONFIG_START(tvboy_state::tvboyii) MCFG_MOS6530n_OUT_PB_CB(WRITE8(*this, tvboy_state, switch_B_w)) MCFG_MOS6530n_IRQ_CB(WRITELINE(*this, tvboy_state, irq_callback)) #else - MCFG_DEVICE_ADD("riot", RIOT6532, MASTER_CLOCK_PAL / 3) - MCFG_RIOT6532_IN_PA_CB(READ8(*this, tvboy_state, switch_A_r)) - MCFG_RIOT6532_OUT_PA_CB(WRITE8(*this, tvboy_state, switch_A_w)) - MCFG_RIOT6532_IN_PB_CB(READ8(*this, tvboy_state, riot_input_port_8_r)) - MCFG_RIOT6532_OUT_PB_CB(WRITE8(*this, tvboy_state, switch_B_w)) - MCFG_RIOT6532_IRQ_CB(WRITELINE(*this, tvboy_state, irq_callback)) + RIOT6532(config, m_riot, MASTER_CLOCK_PAL / 3); + m_riot->in_pa_callback().set(FUNC(tvboy_state::switch_A_r)); + m_riot->out_pa_callback().set(FUNC(tvboy_state::switch_A_w)); + m_riot->in_pb_callback().set(FUNC(tvboy_state::riot_input_port_8_r)); + m_riot->out_pb_callback().set(FUNC(tvboy_state::switch_B_w)); + m_riot->irq_callback().set(FUNC(tvboy_state::irq_callback)); #endif MCFG_VCS_CONTROL_PORT_ADD(CONTROL1_TAG, vcs_control_port_devices, "joy") diff --git a/src/mame/drivers/uapce.cpp b/src/mame/drivers/uapce.cpp index 44dc5315740..0af479652e2 100644 --- a/src/mame/drivers/uapce.cpp +++ b/src/mame/drivers/uapce.cpp @@ -99,7 +99,6 @@ Alien Crush & Pac_Land: dumps made from PC-Engine dumps of JP versions #include "cpu/z80/z80.h" #include "video/huc6260.h" #include "video/huc6270.h" -#include "sound/c6280.h" #include "sound/discrete.h" #include "screen.h" @@ -296,10 +295,6 @@ void uapce_state::pce_mem(address_map &map) map(0x1F0000, 0x1F1FFF).ram().mirror(0x6000); map(0x1FE000, 0x1FE3FF).rw("huc6270", FUNC(huc6270_device::read), FUNC(huc6270_device::write)); map(0x1FE400, 0x1FE7FF).rw(m_huc6260, FUNC(huc6260_device::read), FUNC(huc6260_device::write)); - map(0x1FE800, 0x1FEBFF).rw("c6280", FUNC(c6280_device::c6280_r), FUNC(c6280_device::c6280_w)); - map(0x1FEC00, 0x1FEFFF).rw(m_maincpu, FUNC(h6280_device::timer_r), FUNC(h6280_device::timer_w)); - map(0x1FF000, 0x1FF3FF).rw(FUNC(uapce_state::pce_joystick_r), FUNC(uapce_state::pce_joystick_w)); - map(0x1FF400, 0x1FF7FF).rw(m_maincpu, FUNC(h6280_device::irq_status_r), FUNC(h6280_device::irq_status_w)); } void uapce_state::pce_io(address_map &map) @@ -310,9 +305,13 @@ void uapce_state::pce_io(address_map &map) MACHINE_CONFIG_START(uapce_state::uapce) /* basic machine hardware */ - MCFG_DEVICE_ADD("maincpu", H6280, PCE_MAIN_CLOCK/3) - MCFG_DEVICE_PROGRAM_MAP(pce_mem) - MCFG_DEVICE_IO_MAP(pce_io) + H6280(config, m_maincpu, PCE_MAIN_CLOCK/3); + m_maincpu->set_addrmap(AS_PROGRAM, &uapce_state::pce_mem); + m_maincpu->set_addrmap(AS_IO, &uapce_state::pce_io); + m_maincpu->port_in_cb().set(FUNC(uapce_state::pce_joystick_r)); + m_maincpu->port_out_cb().set(FUNC(uapce_state::pce_joystick_w)); + m_maincpu->add_route(0, "lspeaker", 0.5); + m_maincpu->add_route(1, "rspeaker", 0.5); MCFG_DEVICE_ADD("sub", Z80, 1400000) MCFG_DEVICE_PROGRAM_MAP(z80_map) @@ -336,10 +335,6 @@ MACHINE_CONFIG_START(uapce_state::uapce) SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); - MCFG_DEVICE_ADD("c6280", C6280, PCE_MAIN_CLOCK/6) - MCFG_C6280_CPU("maincpu") - MCFG_SOUND_ROUTE(0, "lspeaker", 0.5) - MCFG_SOUND_ROUTE(1, "rspeaker", 0.5) MCFG_DEVICE_ADD("discrete", DISCRETE, uapce_discrete) MCFG_SOUND_ROUTE(0, "rspeaker", 1.00) diff --git a/src/mame/drivers/jade.cpp b/src/mame/drivers/unkz80.cpp index 41e619fb7a6..0b44b8f0f15 100644 --- a/src/mame/drivers/jade.cpp +++ b/src/mame/drivers/unkz80.cpp @@ -2,17 +2,19 @@ // copyright-holders:Robbbert /*************************************************************************** - Jade JGZ80 (with Serial Parallel Interrupt Controller) +Unknown Z80 (with Serial Parallel Interrupt Controller) - Single board Z80 computer on a S100 card. - The SPIO board adds four CTCs, two SIOs and one PIO. +Single board Z80 computer on a S100 card. +The SPIO board adds four CTCs, two SIOs and one PIO. - 2013-09-12 Skeleton driver. +2013-09-12 Skeleton driver. - No info found as yet. +No info found as yet. - It takes about 8 seconds to start up. - Type HE to get a list of commands. +It should display P-Mon 4b 08/29/83 SPIC, then pause a bit, +then show a # prompt. Type HE to get a list of commands. + +Currently does nothing due to a SIO regression. ****************************************************************************/ @@ -25,15 +27,15 @@ //#include "bus/s100/s100.h" -class jade_state : public driver_device +class unkz80_state : public driver_device { public: - jade_state(const machine_config &mconfig, device_type type, const char *tag) + unkz80_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) , m_maincpu(*this, "maincpu") { } - void jade(machine_config &config); + void unkz80(machine_config &config); private: void io_map(address_map &map); @@ -43,14 +45,14 @@ private: }; -void jade_state::mem_map(address_map &map) +void unkz80_state::mem_map(address_map &map) { map.unmap_value_high(); map(0x0000, 0x07ff).rom().region("roms", 0); map(0x0800, 0xffff).ram(); } -void jade_state::io_map(address_map &map) +void unkz80_state::io_map(address_map &map) { map.unmap_value_high(); map.global_mask(0xff); @@ -60,13 +62,13 @@ void jade_state::io_map(address_map &map) } /* Input ports */ -static INPUT_PORTS_START( jade ) +static INPUT_PORTS_START( unkz80 ) INPUT_PORTS_END -MACHINE_CONFIG_START(jade_state::jade) +MACHINE_CONFIG_START(unkz80_state::unkz80) /* basic machine hardware */ - MCFG_DEVICE_ADD("maincpu",Z80, XTAL(4'000'000)) + MCFG_DEVICE_ADD("maincpu",Z80, 4_MHz_XTAL) MCFG_DEVICE_PROGRAM_MAP(mem_map) MCFG_DEVICE_IO_MAP(io_map) @@ -79,8 +81,7 @@ MACHINE_CONFIG_START(jade_state::jade) CLOCK(config, "trg0", 4_MHz_XTAL / 2).signal_handler().set("ctc2", FUNC(z80ctc_device::trg0)); /* Devices */ - MCFG_DEVICE_ADD("sio", Z80SIO, XTAL(4'000'000)) - //MCFG_Z80SIO_OUT_INT_CB(INPUTLINE("maincpu", INPUT_LINE_IRQ0)) // no evidence of a daisy chain because IM2 is not set + MCFG_DEVICE_ADD("sio", Z80SIO, 4_MHz_XTAL) MCFG_Z80SIO_OUT_TXDA_CB(WRITELINE("rs232", rs232_port_device, write_txd)) MCFG_Z80SIO_OUT_DTRA_CB(WRITELINE("rs232", rs232_port_device, write_dtr)) MCFG_Z80SIO_OUT_RTSA_CB(WRITELINE("rs232", rs232_port_device, write_rts)) @@ -91,12 +92,12 @@ MACHINE_CONFIG_START(jade_state::jade) MACHINE_CONFIG_END /* ROM definition */ -ROM_START( jgz80 ) +ROM_START( unkz80 ) ROM_REGION( 0x800, "roms", 0 ) - ROM_LOAD( "jgz80.rom", 0x0000, 0x0800, CRC(90c4a1ef) SHA1(8a93a11051cc27f3edca24f0f4297ebe0099964e) ) + ROM_LOAD( "unkz80.rom", 0x0000, 0x0800, CRC(90c4a1ef) SHA1(8a93a11051cc27f3edca24f0f4297ebe0099964e) ) ROM_END /* Driver */ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -COMP( 1983, jgz80, 0, 0, jade, jade, jade_state, empty_init, "Jade Computer Products", "JGZ80", MACHINE_NOT_WORKING | MACHINE_NO_SOUND_HW ) +COMP( 1983, unkz80, 0, 0, unkz80, unkz80, unkz80_state, empty_init, "<unknown>", "Unknown Z80 computer", MACHINE_NOT_WORKING | MACHINE_NO_SOUND_HW ) diff --git a/src/mame/drivers/v550.cpp b/src/mame/drivers/v550.cpp index 91f890d91b7..4c5a1c0efc7 100644 --- a/src/mame/drivers/v550.cpp +++ b/src/mame/drivers/v550.cpp @@ -110,7 +110,7 @@ MACHINE_CONFIG_START(v550_state::v550) MCFG_DEVICE_PROGRAM_MAP(mem_map) MCFG_DEVICE_IO_MAP(io_map) - MCFG_NVRAM_ADD_0FILL("nvram") // NEC D446-2 + battery + MCFG_NVRAM_ADD_0FILL("nvram") // NEC D444C-2 + battery MCFG_DEVICE_ADD("gdc", UPD7220, 34.846_MHz_XTAL / 16) // NEC D7220D (2.177875 MHz verified) MCFG_VIDEO_SET_SCREEN("screen") diff --git a/src/mame/drivers/vaportra.cpp b/src/mame/drivers/vaportra.cpp index 6b6700ae286..217a7f58cbd 100644 --- a/src/mame/drivers/vaportra.cpp +++ b/src/mame/drivers/vaportra.cpp @@ -77,8 +77,6 @@ void vaportra_state::sound_map(address_map &map) map(0x130000, 0x130001).rw("oki2", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); map(0x140000, 0x140001).r(m_soundlatch, FUNC(generic_latch_8_device::read)); map(0x1f0000, 0x1f1fff).ram(); - map(0x1fec00, 0x1fec01).rw(m_audiocpu, FUNC(h6280_device::timer_r), FUNC(h6280_device::timer_w)).mirror(0x3fe); - map(0x1ff400, 0x1ff403).rw(m_audiocpu, FUNC(h6280_device::irq_status_r), FUNC(h6280_device::irq_status_w)).mirror(0x3fc); } /******************************************************************************/ @@ -216,9 +214,9 @@ MACHINE_CONFIG_START(vaportra_state::vaportra) MCFG_DEVICE_PROGRAM_MAP(main_map) MCFG_DEVICE_VBLANK_INT_DRIVER("screen", vaportra_state, irq6_line_assert) - MCFG_DEVICE_ADD(m_audiocpu, H6280, XTAL(24'000'000)/4) /* Custom chip 45; Audio section crystal is 32.220 MHz but CPU clock is confirmed as coming from the 24MHz crystal (6Mhz exactly on the CPU) */ - MCFG_DEVICE_PROGRAM_MAP(sound_map) - + H6280(config, m_audiocpu, XTAL(24'000'000)/4); /* Custom chip 45; Audio section crystal is 32.220 MHz but CPU clock is confirmed as coming from the 24MHz crystal (6Mhz exactly on the CPU) */ + m_audiocpu->set_addrmap(AS_PROGRAM, &vaportra_state::sound_map); + m_audiocpu->add_route(ALL_OUTPUTS, "mono", 0); // internal sound unused /* video hardware */ MCFG_DEVICE_ADD(m_spriteram, BUFFERED_SPRITERAM16) diff --git a/src/mame/drivers/vectrex.cpp b/src/mame/drivers/vectrex.cpp index e5944eea796..158ce9e9208 100644 --- a/src/mame/drivers/vectrex.cpp +++ b/src/mame/drivers/vectrex.cpp @@ -90,59 +90,61 @@ static INPUT_PORTS_START(vectrex) INPUT_PORTS_END -static void vectrex_cart(device_slot_interface &device) +void vectrex_base_state::vectrex_cart(device_slot_interface &device) { device.option_add_internal("vec_rom", VECTREX_ROM_STD); device.option_add_internal("vec_rom64k", VECTREX_ROM_64K); device.option_add_internal("vec_sram", VECTREX_ROM_SRAM); } -MACHINE_CONFIG_START(vectrex_base_state::vectrex_base) - /* basic machine hardware */ - MCFG_DEVICE_ADD("maincpu", MC6809, 6_MHz_XTAL) // 68A09 +void vectrex_base_state::vectrex_base(machine_config &config) +{ + MC6809(config, m_maincpu, 6_MHz_XTAL); // 68A09 /* video hardware */ - MCFG_VECTOR_ADD("vector") - MCFG_SCREEN_ADD("screen", VECTOR) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_SIZE(400, 300) - MCFG_SCREEN_VISIBLE_AREA(0, 399, 0, 299) - MCFG_SCREEN_UPDATE_DRIVER(vectrex_base_state, screen_update_vectrex) + VECTOR(config, m_vector, 0); + SCREEN(config, m_screen, SCREEN_TYPE_VECTOR); + m_screen->set_refresh_hz(60); + m_screen->set_size(400, 300); + m_screen->set_visarea(0, 399, 0, 299); + m_screen->set_screen_update(FUNC(vectrex_base_state::screen_update_vectrex)); /* sound hardware */ SPEAKER(config, "speaker").front_center(); - MCFG_DEVICE_ADD("dac", MC1408, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25) // mc1408.ic301 (also used for vector generation) - MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0) - MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT) + MC1408(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25); // mc1408.ic301 (also used for vector generation) + voltage_regulator_device &vreg(VOLTAGE_REGULATOR(config, "vref", 0)); + vreg.set_output(5.0); + vreg.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); + vreg.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT); - MCFG_DEVICE_ADD("ay8912", AY8912, 6_MHz_XTAL / 4) - MCFG_AY8910_PORT_A_READ_CB(IOPORT("BUTTONS")) - MCFG_AY8910_PORT_A_WRITE_CB(WRITE8(*this, vectrex_base_state, vectrex_psg_port_w)) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.2) + AY8912(config, m_ay8912, 6_MHz_XTAL / 4); + m_ay8912->port_a_read_callback().set_ioport("BUTTONS"); + m_ay8912->port_a_write_callback().set(FUNC(vectrex_base_state::vectrex_psg_port_w)); + m_ay8912->add_route(ALL_OUTPUTS, "speaker", 0.2); /* via */ - MCFG_DEVICE_ADD("via6522_0", VIA6522, 6_MHz_XTAL / 4) - MCFG_VIA6522_READPA_HANDLER(READ8(*this, vectrex_base_state, vectrex_via_pa_r)) - MCFG_VIA6522_READPB_HANDLER(READ8(*this, vectrex_base_state, vectrex_via_pb_r)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, vectrex_base_state, v_via_pa_w)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, vectrex_base_state, v_via_pb_w)) - MCFG_VIA6522_CA2_HANDLER(WRITELINE(*this, vectrex_base_state, v_via_ca2_w)) - MCFG_VIA6522_CB2_HANDLER(WRITELINE(*this, vectrex_base_state, v_via_cb2_w)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, vectrex_base_state, vectrex_via_irq)) -MACHINE_CONFIG_END - -MACHINE_CONFIG_START(vectrex_state::vectrex) + VIA6522(config, m_via6522_0, 6_MHz_XTAL / 4); + m_via6522_0->readpa_handler().set(FUNC(vectrex_base_state::vectrex_via_pa_r)); + m_via6522_0->readpb_handler().set(FUNC(vectrex_base_state::vectrex_via_pb_r)); + m_via6522_0->writepa_handler().set(FUNC(vectrex_base_state::v_via_pa_w)); + m_via6522_0->writepb_handler().set(FUNC(vectrex_base_state::v_via_pb_w)); + m_via6522_0->ca2_handler().set(FUNC(vectrex_base_state::v_via_ca2_w)); + m_via6522_0->cb2_handler().set(FUNC(vectrex_base_state::v_via_cb2_w)); + m_via6522_0->irq_handler().set(FUNC(vectrex_base_state::vectrex_via_irq)); +} + +void vectrex_state::vectrex(machine_config &config) +{ vectrex_base(config); - MCFG_DEVICE_MODIFY("maincpu") - MCFG_DEVICE_PROGRAM_MAP(vectrex_map) + m_maincpu->set_addrmap(AS_PROGRAM, &vectrex_state::vectrex_map); - /* cartridge */ - MCFG_VECTREX_CARTRIDGE_ADD("cartslot", vectrex_cart, nullptr) + vectrex_cart_slot_device &slot(VECTREX_CART_SLOT(config, "cartslot", 0)); + vectrex_cart(slot); /* software lists */ - MCFG_SOFTWARE_LIST_ADD("cart_list","vectrex") -MACHINE_CONFIG_END + SOFTWARE_LIST(config, "cart_list").set_type("vectrex", SOFTWARE_LIST_ORIGINAL_SYSTEM); +} ROM_START(vectrex) ROM_REGION(0x2000,"maincpu", 0) @@ -224,17 +226,16 @@ static INPUT_PORTS_START(raaspec) INPUT_PORTS_END -MACHINE_CONFIG_START(raaspec_state::raaspec) +void raaspec_state::raaspec(machine_config &config) +{ vectrex_base(config); - MCFG_DEVICE_MODIFY("maincpu") - MCFG_DEVICE_PROGRAM_MAP(raaspec_map) - MCFG_NVRAM_ADD_0FILL("nvram") + m_maincpu->set_addrmap(AS_PROGRAM, &raaspec_state::raaspec_map); - /* via */ - MCFG_DEVICE_MODIFY("via6522_0") - MCFG_VIA6522_READPB_HANDLER(READ8(*this, raaspec_state, vectrex_s1_via_pb_r)) -MACHINE_CONFIG_END + NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); + + m_via6522_0->readpb_handler().set(FUNC(raaspec_state::vectrex_s1_via_pb_r)); +} ROM_START(raaspec) ROM_REGION(0x10000,"maincpu", 0) diff --git a/src/mame/drivers/vegas.cpp b/src/mame/drivers/vegas.cpp index 50d6be6dc36..9536fd91425 100644 --- a/src/mame/drivers/vegas.cpp +++ b/src/mame/drivers/vegas.cpp @@ -1770,9 +1770,9 @@ MACHINE_CONFIG_START(vegas_state::vegascore) MCFG_DEVICE_MODIFY(PCI_ID_VIDEO":voodoo") MCFG_VOODOO_VBLANK_CB(WRITELINE(*this, vegas_state, vblank_assert)) - MCFG_DEVICE_ADD(m_timekeeper, M48T37, 0) - MCFG_M48T37_RESET_HANDLER(WRITELINE(*this, vegas_state, watchdog_reset)) - MCFG_M48T37_IRQ_HANDLER(WRITELINE(*this, vegas_state, watchdog_irq)) + M48T37(config, m_timekeeper); + m_timekeeper->reset_cb().set(FUNC(vegas_state::watchdog_reset)); + m_timekeeper->irq_cb().set(FUNC(vegas_state::watchdog_irq)); MCFG_SMC91C94_ADD(m_ethernet) MCFG_SMC91C94_IRQ_CALLBACK(WRITELINE(*this, vegas_state, ethernet_interrupt)) diff --git a/src/mame/drivers/vgmplay.cpp b/src/mame/drivers/vgmplay.cpp index 0ddedb3ffe7..936184a087f 100644 --- a/src/mame/drivers/vgmplay.cpp +++ b/src/mame/drivers/vgmplay.cpp @@ -12,31 +12,47 @@ #include "cpu/h6280/h6280.h" #include "cpu/m6502/n2a03.h" +#include "cpu/m68000/m68000.h" +#include "cpu/sh/sh2.h" #include "sound/2203intf.h" #include "sound/2608intf.h" +#include "sound/2610intf.h" #include "sound/2612intf.h" +#include "sound/262intf.h" #include "sound/3526intf.h" #include "sound/3812intf.h" #include "sound/ay8910.h" +#include "sound/8950intf.h" +#include "sound/c140.h" #include "sound/c352.h" #include "sound/c6280.h" +#include "sound/es5503.h" +#include "sound/es5506.h" #include "sound/gb.h" #include "sound/iremga20.h" #include "sound/k051649.h" #include "sound/k053260.h" #include "sound/k054539.h" #include "sound/multipcm.h" +#include "sound/okim6258.h" #include "sound/okim6295.h" #include "sound/pokey.h" #include "sound/qsound.h" #include "sound/rf5c68.h" +#include "sound/saa1099.h" +#include "sound/scsp.h" #include "sound/segapcm.h" #include "sound/sn76496.h" +#include "sound/upd7759.h" #include "sound/x1_010.h" #include "sound/ym2151.h" #include "sound/ym2413.h" #include "sound/ymf271.h" +#include "sound/ymf278b.h" #include "sound/ymz280b.h" +#include "audio/vboy.h" +#include "audio/wswan.h" +#include "machine/mega32x.h" #include "vgmplay.lh" #include "debugger.h" @@ -50,7 +66,6 @@ #include <vector> #define AS_IO16 1 -#define MCFG_CPU_IO16_MAP MCFG_DEVICE_DATA_MAP class vgmplay_disassembler : public util::disasm_interface { @@ -67,47 +82,93 @@ class vgmplay_device : public cpu_device public: enum io8_t { - REG_SIZE = 0x00000000, - A_YM2612 = 0x00000010, - A_YM2151 = 0x00000020, - A_YM2413 = 0x00000030, - A_YM2203A = 0x00000040, - A_YM2203B = 0x00000050, - A_YM3526 = 0x00000060, - A_YM3812 = 0x00000070, - A_AY8910A = 0x00000080, - A_AY8910B = 0x00000090, - A_SN76496 = 0x000000a0, - A_K053260 = 0x000000b0, - A_C6280 = 0x000000e0, - A_OKIM6295A = 0x000000f0, - A_OKIM6295B = 0x00000110, - A_SEGAPCM = 0x00001000, - A_GAMEBOY = 0x00002000, - A_NESAPU = 0x00002030, - A_NESRAM = 0x00003000, - A_MULTIPCMA = 0x00013000, - A_MULTIPCMB = 0x00013010, - A_POKEYA = 0x00013020, - A_POKEYB = 0x00013030, - A_YMF271 = 0x00013040, - A_YMZ280B = 0x00013050, - A_YM2608 = 0x00013060, - A_K054539A = 0x00013400, - A_K054539B = 0x00013800, - A_QSOUND = 0x00013c00, - A_K051649 = 0x00013c10, - A_GA20 = 0x00013c20, - A_RF5C68 = 0x00013c40, - A_RF5C164 = 0x00013c50, - A_RF5C68RAM = 0x00014000, - A_RF5C164RAM = 0x00024000, - A_X1_010 = 0x00034000 - }; - - enum io16_t - { - A_C352 = 0x00000000 + REG_SIZE = 0xff000000, + A_SN76496_0 = 0x00000000, + A_SN76496_1 = 0x80000000, + A_YM2413_0 = 0x01000000, + A_YM2413_1 = 0x81000000, + A_YM2612_0 = 0x02000000, + A_YM2612_1 = 0x82000000, + A_YM2151_0 = 0x03000000, + A_YM2151_1 = 0x83000000, + A_SEGAPCM_0 = 0x04000000, + A_SEGAPCM_1 = 0x84000000, + A_RF5C68 = 0x05000000, + A_RF5C68_RAM = 0x85000000, + A_YM2203_0 = 0x06000000, + A_YM2203_1 = 0x86000000, + A_YM2608_0 = 0x07000000, + A_YM2608_1 = 0x87000000, + A_YM2610_0 = 0x08000000, + A_YM2610_1 = 0x88000000, + A_YM3812_0 = 0x09000000, + A_YM3812_1 = 0x89000000, + A_YM3526_0 = 0x0a000000, + A_YM3526_1 = 0x8a000000, + A_Y8950_0 = 0x0b000000, + A_Y8950_1 = 0x8b000000, + A_YMF262_0 = 0x0c000000, + A_YMF262_1 = 0x8c000000, + A_YMF278B_0 = 0x0d000000, + A_YMF278B_1 = 0x8d000000, + A_YMF271_0 = 0x0e000000, + A_YMF271_1 = 0x8e000000, + A_YMZ280B_0 = 0x0f000000, + A_YMZ280B_1 = 0x8f000000, + A_RF5C164 = 0x10000000, + A_RF5C164_RAM = 0x90000000, + A_32X_PWM = 0x11000000, + A_AY8910_0 = 0x12000000, + A_AY8910_1 = 0x92000000, + A_GAMEBOY_0 = 0x13000000, + A_GAMEBOY_1 = 0x93000000, + A_NESAPU_0 = 0x14000000, + A_NES_RAM_0 = 0x14010000, + A_NESAPU_1 = 0x94000000, + A_NES_RAM_1 = 0x94010000, + A_MULTIPCM_0 = 0x15000000, + A_MULTIPCM_1 = 0x95000000, + A_UPD7759_0 = 0x16000000, + A_UPD7759_1 = 0x96000000, + A_OKIM6258_0 = 0x17000000, + A_OKIM6258_1 = 0x97000000, + A_OKIM6295_0 = 0x18000000, + A_OKIM6295_1 = 0x98000000, + A_K051649_0 = 0x19000000, + A_K051649_1 = 0x99000000, + A_K054539_0 = 0x1a000000, + A_K054539_1 = 0x9a000000, + A_C6280_0 = 0x1b000000, + A_C6280_1 = 0x9b000000, + A_C140_0 = 0x1c000000, + A_C140_1 = 0x9c000000, + A_K053260_0 = 0x1d000000, + A_K053260_1 = 0x9d000000, + A_POKEY_0 = 0x1e000000, + A_POKEY_1 = 0x9e000000, + A_QSOUND = 0x1f000000, + A_SCSP_0 = 0x20000000, + A_SCSP_1 = 0xa0000000, + A_WSWAN_0 = 0x21000000, + A_WSWAN_RAM_0 = 0x21000100, + A_WSWAN_1 = 0xa1000000, + A_WSWAN_RAM_1 = 0xa1000100, + A_VSU_VUE_0 = 0x22000000, + A_VSU_VUE_1 = 0xa2000000, + A_SAA1099_0 = 0x23000000, + A_SAA1099_1 = 0xa3000000, + A_ES5503_0 = 0x24000000, + A_ES5503_RAM_0 = 0x24000100, + A_ES5503_1 = 0xa4000000, + A_ES5503_RAM_1 = 0xa4000100, + A_ES5505_0 = 0x25000000, + A_ES5505_1 = 0xa5000000, + A_X1_010_0 = 0x26000000, + A_X1_010_1 = 0xa6000000, + A_C352_0 = 0x27000000, + A_C352_1 = 0xa7000000, + A_GA20_0 = 0x28000000, + A_GA20_1 = 0xa8000000, }; vgmplay_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); @@ -126,17 +187,20 @@ public: virtual std::unique_ptr<util::disasm_interface> create_disassembler() override; - DECLARE_READ8_MEMBER(segapcm_rom_r); - DECLARE_READ8_MEMBER(ymf271_rom_r); - DECLARE_READ8_MEMBER(ymz280b_rom_r); + template<int Chip> DECLARE_READ8_MEMBER(segapcm_rom_r); + template<int Chip> DECLARE_READ8_MEMBER(ymf278b_rom_r); + template<int Chip> DECLARE_READ8_MEMBER(ymf271_rom_r); + template<int Chip> DECLARE_READ8_MEMBER(ymz280b_rom_r); template<int Chip> DECLARE_READ8_MEMBER(multipcm_rom_r); - DECLARE_READ8_MEMBER(k053260_rom_r); + template<int Chip> DECLARE_READ8_MEMBER(c140_rom_r); + template<int Chip> DECLARE_READ8_MEMBER(k053260_rom_r); template<int Chip> DECLARE_READ8_MEMBER(okim6295_rom_r); template<int Chip> DECLARE_READ8_MEMBER(k054539_rom_r); - DECLARE_READ8_MEMBER(c352_rom_r); - DECLARE_READ8_MEMBER(qsound_rom_r); - DECLARE_READ8_MEMBER(ga20_rom_r); - DECLARE_READ8_MEMBER(x1_010_rom_r); + template<int Chip> DECLARE_READ8_MEMBER(c352_rom_r); + template<int Chip> DECLARE_READ8_MEMBER(qsound_rom_r); + template<int Chip> DECLARE_READ8_MEMBER(es5505_rom_r); + template<int Chip> DECLARE_READ8_MEMBER(ga20_rom_r); + template<int Chip> DECLARE_READ8_MEMBER(x1_010_rom_r); template<int Chip> DECLARE_WRITE8_MEMBER(multipcm_bank_hi_w); template<int Chip> DECLARE_WRITE8_MEMBER(multipcm_bank_lo_w); @@ -158,47 +222,49 @@ protected: private: enum { ACT_LED_PERSIST_MS = 100 }; - enum act_led { - LED_AY8910 = 0, - - LED_SN76496, - - LED_OKIM6295, - + enum act_led + { + LED_SN76496 = 0, + LED_YM2413, + LED_YM2612, LED_YM2151, + LED_SEGAPCM, + LED_RF5C68, LED_YM2203, - LED_YM2413, LED_YM2608, - LED_YM2612, - LED_YM3526, + LED_YM2610, LED_YM3812, + LED_YM3526, + LED_Y8950, + LED_YMF262, + LED_YMF278B, LED_YMF271, LED_YMZ280B, - - LED_MULTIPCM, - LED_SEGAPCM, - - LED_QSOUND, - - LED_POKEY, - - LED_NESAPU, + LED_RF5C164, + LED_32X_PWM, + LED_AY8910, LED_GAMEBOY, - - LED_C352, - - LED_C6280, - + LED_NESAPU, + LED_MULTIPCM, + LED_UPD7759, + LED_OKIM6258, + LED_OKIM6295, LED_K051649, - LED_K053260, LED_K054539, - - LED_GA20, - - LED_RF5C68, - LED_RF5C164, - + LED_C6280, + LED_C140, + LED_K053260, + LED_POKEY, + LED_QSOUND, + LED_SCSP, + LED_WSWAN, + LED_VSU_VUE, + LED_SAA1099, + LED_ES5503, + LED_ES5505, LED_X1_010, + LED_C352, + LED_GA20, LED_COUNT }; @@ -209,7 +275,8 @@ private: using led_expiry_list = std::list<led_expiry>; using led_expiry_iterator = led_expiry_list::iterator; - struct rom_block { + struct rom_block + { offs_t start_address; offs_t end_address; std::unique_ptr<uint8_t[]> data; @@ -218,6 +285,31 @@ private: rom_block(offs_t start, offs_t end, std::unique_ptr<uint8_t[]> &&d) : start_address(start), end_address(end), data(std::move(d)) {} }; + struct stream + { + // stream control + uint8_t type; + uint8_t port; + uint8_t reg; + // stream data + uint8_t bank; + uint8_t step_size; + uint8_t step_base; + // frequency + uint32_t frequency; + // start stream + uint32_t offset; + uint32_t length; + uint8_t length_mode; + bool loop; + bool reverse; + }; + + TIMER_CALLBACK_MEMBER(stream_timer_expired); + + stream m_streams[0xff]; + emu_timer *m_stream_timers[0xff]; + void pulse_act_led(act_led led); TIMER_CALLBACK_MEMBER(act_led_expired); @@ -228,7 +320,7 @@ private: output_finder<LED_COUNT> m_act_leds; led_expiry_list m_act_led_expiries; - std::unique_ptr<led_expiry_iterator []> m_act_led_index; + std::unique_ptr<led_expiry_iterator[]> m_act_led_index; led_expiry_iterator m_act_led_off; emu_timer *m_act_led_timer = nullptr; @@ -282,72 +374,82 @@ public: template<int Chip> DECLARE_WRITE8_MEMBER(okim6295_clock_w); template<int Chip> DECLARE_WRITE8_MEMBER(okim6295_pin7_w); - DECLARE_WRITE8_MEMBER(scc_w); + template<int Chip> DECLARE_WRITE8_MEMBER(scc_w); void vgmplay(machine_config &config); - void c352_map(address_map &map); void file_map(address_map &map); - void ga20_map(address_map &map); - void h6280_io_map(address_map &map); - void h6280_map(address_map &map); - void k053260_map(address_map &map); - void k054539a_map(address_map &map); - void k054539b_map(address_map &map); - void multipcma_map(address_map &map); - void multipcmb_map(address_map &map); - void nescpu_map(address_map &map); - void okim6295a_map(address_map &map); - void okim6295b_map(address_map &map); - void qsound_map(address_map &map); - void rf5c68_map(address_map &map); - void rf5c164_map(address_map &map); - void segapcm_map(address_map &map); - void soundchips16_map(address_map &map); void soundchips_map(address_map &map); - void x1_010_map(address_map &map); - void ymf271_map(address_map &map); - void ymz280b_map(address_map &map); + void soundchips16_map(address_map &map); + template<int Chip> void segapcm_map(address_map &map); + template<int Chip> void rf5c68_map(address_map &map); + template<int Chip> void ymf278b_map(address_map &map); + template<int Chip> void ymf271_map(address_map &map); + template<int Chip> void ymz280b_map(address_map &map); + template<int Chip> void rf5c164_map(address_map &map); + template<int Chip> void nescpu_map(address_map &map); + template<int Chip> void multipcm_map(address_map &map); + template<int Chip> void okim6295_map(address_map &map); + template<int Chip> void k054539_map(address_map &map); + template<int Chip> void c140_map(address_map &map); + template<int Chip> void k053260_map(address_map &map); + template<int Chip> void qsound_map(address_map &map); + template<int Chip> void wswan_map(address_map &map); + template<int Chip> void es5503_map(address_map &map); + template<int Chip> void es5505_map(address_map &map); + template<int Chip> void x1_010_map(address_map &map); + template<int Chip> void c352_map(address_map &map); + template<int Chip> void ga20_map(address_map &map); private: std::vector<uint8_t> m_file_data; required_device<vgmplay_device> m_vgmplay; required_device<speaker_device> m_lspeaker; required_device<speaker_device> m_rspeaker; - required_device<ym2612_device> m_ym2612; - required_device<ym2151_device> m_ym2151; - required_device<ym2413_device> m_ym2413; + required_device_array<sn76496_device, 2> m_sn76496; + required_device_array<ym2413_device, 2> m_ym2413; + required_device_array<ym2612_device, 2> m_ym2612; + required_device_array<ym2151_device, 2> m_ym2151; + required_device_array<segapcm_device, 2> m_segapcm; + required_device<rf5c68_device> m_rf5c68; required_device_array<ym2203_device, 2> m_ym2203; - required_device<ym3526_device> m_ym3526; - required_device<ym3812_device> m_ym3812; + required_device_array<ym2608_device, 2> m_ym2608; + required_device_array<ym2610_device, 2> m_ym2610; + required_device_array<ym3812_device, 2> m_ym3812; + required_device_array<ym3526_device, 2> m_ym3526; + required_device_array<y8950_device, 2> m_y8950; + required_device_array<ymf262_device, 2> m_ymf262; + required_device_array<ymf278b_device, 2> m_ymf278b; + required_device_array<ymf271_device, 2> m_ymf271; + required_device_array<ymz280b_device, 2> m_ymz280b; + required_device<rf5c164_device> m_rf5c164; + required_device<sega_32x_ntsc_device> m_sega32x; required_device_array<ay8910_device, 2> m_ay8910; - required_device<sn76496_device> m_sn76496; - required_device<segapcm_device> m_segapcm; + required_device_array<gameboy_sound_device, 2> m_dmg; + required_device_array<n2a03_device, 2> m_nescpu; required_device_array<multipcm_device, 2> m_multipcm; - required_device<gameboy_sound_device> m_dmg; - required_device<n2a03_device> m_nescpu; - required_shared_ptr<uint8_t> m_nesram; - required_device<k053260_device> m_k053260; + required_device_array<upd7759_device, 2> m_upd7759; + required_device_array<okim6258_device, 2> m_okim6258; + required_device_array<okim6295_device, 2> m_okim6295; + required_device_array<k051649_device, 2> m_k051649; required_device_array<k054539_device, 2> m_k054539; - required_device<c6280_device> m_c6280; - required_device<h6280_device> m_h6280; + required_device_array<h6280_device, 2> m_huc6280; + required_device_array<c140_device, 2> m_c140; + required_device_array<k053260_device, 2> m_k053260; required_device_array<pokey_device, 2> m_pokey; - required_device<c352_device> m_c352; - required_device_array<okim6295_device, 2> m_okim6295; - required_device<ymf271_device> m_ymf271; - required_device<ymz280b_device> m_ymz280b; - required_device<ym2608_device> m_ym2608; required_device<qsound_device> m_qsound; - required_device<k051649_device> m_k051649; - required_device<iremga20_device> m_ga20; - required_device<rf5c68_device> m_rf5c68; - required_device<rf5c68_device> m_rf5c164; // TODO : !!RF5C164!! - required_shared_ptr<uint8_t> m_rf5c68_ram; - required_shared_ptr<uint8_t> m_rf5c164_ram; - required_device<x1_010_device> m_x1_010; + required_device_array<scsp_device, 2> m_scsp; + required_device_array<wswan_sound_device, 2> m_wswan; + required_device_array<vboysnd_device, 2> m_vsu_vue; + required_device_array<saa1099_device, 2> m_saa1099; + required_device_array<es5503_device, 2> m_es5503; + required_device_array<es5505_device, 2> m_es5505; + required_device_array<x1_010_device, 2> m_x1_010; + required_device_array<c352_device, 2> m_c352; + required_device_array<iremga20_device, 2> m_ga20; uint32_t m_okim6295_clock[2]; uint32_t m_okim6295_pin7[2]; - uint8_t m_scc_reg; + uint8_t m_scc_reg[2]; uint32_t r32(int offset) const; uint8_t r8(int offset) const; @@ -366,30 +468,39 @@ void vgmplay_device::device_start() { set_icountptr(m_icount); m_file = &space(AS_PROGRAM); - m_io = &space(AS_IO); - m_io16 = &space(AS_IO16); + m_io = &space(AS_IO); + m_io16 = &space(AS_IO16); m_act_leds.resolve(); - m_act_led_index = std::make_unique<led_expiry_iterator []>(LED_COUNT); + m_act_led_index = std::make_unique<led_expiry_iterator[]>(LED_COUNT); for (act_led led = act_led(0); LED_COUNT != led; led = act_led(led + 1)) m_act_led_index[led] = m_act_led_expiries.emplace(m_act_led_expiries.end(), led, attotime::never); m_act_led_off = m_act_led_expiries.begin(); m_act_led_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(vgmplay_device::act_led_expired), this)); + for (int i = 0; i < 0xff; i++) + m_stream_timers[i] = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(vgmplay_device::stream_timer_expired), this)); + save_item(NAME(m_pc)); + //save_item(NAME(m_streams)); - state_add(STATE_GENPC, "GENPC", m_pc).noshow(); - state_add(STATE_GENPCBASE, "CURPC", m_pc).noshow(); + state_add(STATE_GENPC, "GENPC", m_pc).noshow(); + state_add(STATE_GENPCBASE, "CURPC", m_pc).noshow(); } void vgmplay_device::device_reset() { - m_pc = 0; m_state = RESET; m_paused = false; m_ym2612_stream_offset = 0; blocks_clear(); + + for (int i = 0; i < 0xff; i++) + { + m_streams[i].type = 0xff; + m_stream_timers[i]->adjust(attotime::never); + } } void vgmplay_device::pulse_act_led(act_led led) @@ -467,7 +578,8 @@ uint32_t vgmplay_device::execute_input_lines() const void vgmplay_device::blocks_clear() { - for(int i = 0; i < 0x40; i++) { + for (int i = 0; i < 0x40; i++) + { m_rom_blocks[0][i].clear(); m_rom_blocks[1][i].clear(); m_data_streams[i].clear(); @@ -477,79 +589,123 @@ void vgmplay_device::blocks_clear() uint32_t vgmplay_device::handle_data_block(uint32_t address) { - uint32_t size = m_file->read_dword(m_pc+3); + uint32_t size = m_file->read_dword(m_pc + 3); int second = (size & 0x80000000) ? 1 : 0; size &= 0x7fffffff; - uint8_t type = m_file->read_byte(m_pc+2); - if(type < 0x40) { + uint8_t type = m_file->read_byte(m_pc + 2); + if (type < 0x40) + { uint32_t start = m_data_streams[type].size(); m_data_stream_starts[type].push_back(start); m_data_streams[type].resize(start + size); - for(uint32_t i=0; i<size; i++) - m_data_streams[type][start+i] = m_file->read_byte(m_pc+7+i); - - } else if(type < 0x7f) + for (uint32_t i = 0; i<size; i++) + m_data_streams[type][start + i] = m_file->read_byte(m_pc + 7 + i); + } + else if (type < 0x7f) logerror("ignored compressed stream size %x type %02x\n", size, type); else if (type < 0x80) logerror("ignored compression table size %x\n", size); - else if (type < 0xc0) { + else if (type < 0xc0) + { //uint32_t rs = m_file->read_dword(m_pc+7); - uint32_t start = m_file->read_dword(m_pc+11); + uint32_t start = m_file->read_dword(m_pc + 11); std::unique_ptr<uint8_t[]> block = std::make_unique<uint8_t[]>(size - 8); - for(uint32_t i=0; i<size-8; i++) - block[i] = m_file->read_byte(m_pc+15+i); - m_rom_blocks[second][type - 0x80].emplace_front(start, start+size-9, std::move(block)); - } else if(type <= 0xc2) { - uint16_t start = m_file->read_word(m_pc+7); + for (uint32_t i = 0; i<size - 8; i++) + block[i] = m_file->read_byte(m_pc + 15 + i); + m_rom_blocks[second][type - 0x80].emplace_front(start, start + size - 9, std::move(block)); + } + else if (type <= 0xc2) + { + uint16_t start = m_file->read_word(m_pc + 7); uint32_t data_size = size - 2; - if (type == 0xc0) { + if (type == 0xc0) for (int i = 0; i < data_size; i++) - m_io->write_byte(A_RF5C68RAM + start + i, m_file->read_byte(m_pc + 9 + i)); - } else if (type == 0xc1) { + m_io->write_byte(A_RF5C68_RAM + start + i, m_file->read_byte(m_pc + 9 + i)); + else if (type == 0xc1) for (int i = 0; i < data_size; i++) - m_io->write_byte(A_RF5C164RAM + start + i, m_file->read_byte(m_pc + 9 + i)); - } else if (type == 0xc2) { + m_io->write_byte(A_RF5C164_RAM + start + i, m_file->read_byte(m_pc + 9 + i)); + else if (type == 0xc2) for (int i = 0; i < data_size; i++) - m_io->write_byte(A_NESRAM + start + i, m_file->read_byte(m_pc + 9 + i)); - } - } else { + m_io->write_byte((second ? A_NES_RAM_1 : A_NES_RAM_0) + start + i, m_file->read_byte(m_pc + 9 + i)); + } + else if (type >= 0xe0 && type <= 0xe1) + { + uint16_t start = m_file->read_dword(m_pc + 7); + uint32_t data_size = size - 4; + if (type == 0xe0) + ; // TODO: SCSP + else if (type == 0xe1) + for (int i = 0; i < data_size; i++) + m_io->write_byte((second ? A_ES5503_RAM_1 : A_ES5503_RAM_0) + start + i, m_file->read_byte(m_pc + 0xb + i)); + } + else + { logerror("ignored ram block size %x type %02x\n", size, type); } - return 7+size; + return 7 + size; } uint32_t vgmplay_device::handle_pcm_write(uint32_t address) { - uint8_t type = m_file->read_byte(m_pc+2); - uint32_t src = m_file->read_dword(m_pc+3) & 0xffffff; - uint32_t dst = m_file->read_dword(m_pc+6) & 0xffffff; - uint32_t size = m_file->read_dword(m_pc+9) & 0xffffff; + uint8_t type = m_file->read_byte(m_pc + 2); + uint32_t src = m_file->read_dword(m_pc + 3) & 0xffffff; + uint32_t dst = m_file->read_dword(m_pc + 6) & 0xffffff; + uint32_t size = m_file->read_dword(m_pc + 9) & 0xffffff; + + int second = (type & 0x80) ? 1 : 0; + type &= 0x7f; - if (type == 0x01) { + if (m_data_streams->size() <= type || m_data_streams[type].size() <= src + size) + logerror("ignored pcm ram writes src %x dst %x size %x type %02x\n", src, dst, size, type); + else if (type == 0x01 && !second) + { for (int i = 0; i < size; i++) - m_io->write_byte(A_RF5C68RAM + dst + i, m_data_streams[type][src + i]); - } else if (type == 0x02) { + m_io->write_byte(A_RF5C68_RAM + dst + i, m_data_streams[type][src + i]); + } + else if (type == 0x02 && !second) + { for (int i = 0; i < size; i++) - m_io->write_byte(A_RF5C164RAM + dst + i, m_data_streams[type][src + i]); - } else if (type == 0x07) { + m_io->write_byte(A_RF5C164_RAM + dst + i, m_data_streams[type][src + i]); + } + else if (type == 0x06) + { + // TODO: SCSP + //for (int i = 0; i < size; i++) + //m_io->write_byte((second ? A_SCSP_RAM_1 : A_SCSP_RAM_0) + dst + i, m_data_streams[type][src + i]); + } + else if (type == 0x07) + { for (int i = 0; i < size; i++) - m_io->write_byte(A_NESRAM + dst + i, m_data_streams[type][src + i]); - } else { + m_io->write_byte((second ? A_NES_RAM_1 : A_NES_RAM_0) + dst + i, m_data_streams[type][src + i]); + } + else + { logerror("ignored pcm ram writes src %x dst %x size %x type %02x\n", src, dst, size, type); } return 12; } +TIMER_CALLBACK_MEMBER(vgmplay_device::stream_timer_expired) +{ + // TODO: stream audio to chip +} + void vgmplay_device::execute_run() { - while(m_icount > 0) { - switch(m_state) { - case RESET: { + while (m_icount > 0) + { + switch (m_state) + { + case RESET: + { uint32_t size = m_io->read_dword(REG_SIZE); - if(!size) { + if (!size) + { + logerror("zero length file\n"); + m_pc = 0; m_state = DONE; break; @@ -559,7 +715,8 @@ void vgmplay_device::execute_run() m_state = RUN; break; } - case RUN: { + case RUN: + { if (m_paused) { machine().sound().system_mute(1); @@ -570,95 +727,121 @@ void vgmplay_device::execute_run() { machine().sound().system_mute(0); } - if(machine().debug_flags & DEBUG_FLAG_ENABLED) + + if (machine().debug_flags & DEBUG_FLAG_ENABLED) debugger_instruction_hook(m_pc); + uint8_t code = m_file->read_byte(m_pc); - switch(code) { + switch (code) + { + case 0x30: + pulse_act_led(LED_SN76496); + m_io->write_byte(A_SN76496_1 + 0, m_file->read_byte(m_pc + 1)); + m_pc += 2; + break; + + case 0x3f: + pulse_act_led(LED_SN76496); + m_io->write_byte(A_SN76496_1 + 1, m_file->read_byte(m_pc + 1)); + m_pc += 2; + break; + case 0x4f: pulse_act_led(LED_SN76496); - m_io->write_byte(A_SN76496+0, m_file->read_byte(m_pc+1)); + m_io->write_byte(A_SN76496_0 + 1, m_file->read_byte(m_pc + 1)); m_pc += 2; break; case 0x50: pulse_act_led(LED_SN76496); - m_io->write_byte(A_SN76496+1, m_file->read_byte(m_pc+1)); + m_io->write_byte(A_SN76496_0 + 0, m_file->read_byte(m_pc + 1)); m_pc += 2; break; case 0x51: pulse_act_led(LED_YM2413); - m_io->write_byte(A_YM2413+0, m_file->read_byte(m_pc+1)); - m_io->write_byte(A_YM2413+1, m_file->read_byte(m_pc+2)); + m_io->write_byte(A_YM2413_0 + 0, m_file->read_byte(m_pc + 1)); + m_io->write_byte(A_YM2413_0 + 1, m_file->read_byte(m_pc + 2)); m_pc += 3; break; case 0x52: - pulse_act_led(LED_YM2612); - m_io->write_byte(A_YM2612+0, m_file->read_byte(m_pc+1)); - m_io->write_byte(A_YM2612+1, m_file->read_byte(m_pc+2)); - m_pc += 3; - break; - case 0x53: pulse_act_led(LED_YM2612); - m_io->write_byte(A_YM2612+2, m_file->read_byte(m_pc+1)); - m_io->write_byte(A_YM2612+3, m_file->read_byte(m_pc+2)); + m_io->write_byte(A_YM2612_0 + 0 + ((code & 1) << 1), m_file->read_byte(m_pc + 1)); + m_io->write_byte(A_YM2612_0 + 1 + ((code & 1) << 1), m_file->read_byte(m_pc + 2)); m_pc += 3; break; case 0x54: pulse_act_led(LED_YM2151); - m_io->write_byte(A_YM2151+0, m_file->read_byte(m_pc+1)); - m_io->write_byte(A_YM2151+1, m_file->read_byte(m_pc+2)); + m_io->write_byte(A_YM2151_0 + 0, m_file->read_byte(m_pc + 1)); + m_io->write_byte(A_YM2151_0 + 1, m_file->read_byte(m_pc + 2)); m_pc += 3; break; case 0x55: pulse_act_led(LED_YM2203); - m_io->write_byte(A_YM2203A+0, m_file->read_byte(m_pc+1)); - m_io->write_byte(A_YM2203A+1, m_file->read_byte(m_pc+2)); + m_io->write_byte(A_YM2203_0 + 0, m_file->read_byte(m_pc + 1)); + m_io->write_byte(A_YM2203_0 + 1, m_file->read_byte(m_pc + 2)); m_pc += 3; break; case 0x56: case 0x57: pulse_act_led(LED_YM2608); - m_io->write_byte(A_YM2608+0+((code & 1) << 1), m_file->read_byte(m_pc+1)); - m_io->write_byte(A_YM2608+1+((code & 1) << 1), m_file->read_byte(m_pc+2)); + m_io->write_byte(A_YM2608_0 + 0 + ((code & 1) << 1), m_file->read_byte(m_pc + 1)); + m_io->write_byte(A_YM2608_0 + 1 + ((code & 1) << 1), m_file->read_byte(m_pc + 2)); m_pc += 3; break; - case 0xA5: - pulse_act_led(LED_YM2203); - m_io->write_byte(A_YM2203B+0, m_file->read_byte(m_pc+1)); - m_io->write_byte(A_YM2203B+1, m_file->read_byte(m_pc+2)); + case 0x58: + case 0x59: + pulse_act_led(LED_YM2610); + m_io->write_byte(A_YM2610_0 + 0 + ((code & 1) << 1), m_file->read_byte(m_pc + 1)); + m_io->write_byte(A_YM2610_0 + 1 + ((code & 1) << 1), m_file->read_byte(m_pc + 2)); m_pc += 3; break; case 0x5a: pulse_act_led(LED_YM3812); - m_io->write_byte(A_YM3812+0, m_file->read_byte(m_pc+1)); - m_io->write_byte(A_YM3812+1, m_file->read_byte(m_pc+2)); + m_io->write_byte(A_YM3812_0 + 0, m_file->read_byte(m_pc + 1)); + m_io->write_byte(A_YM3812_0 + 1, m_file->read_byte(m_pc + 2)); m_pc += 3; break; case 0x5b: pulse_act_led(LED_YM3526); - m_io->write_byte(A_YM3526+0, m_file->read_byte(m_pc+1)); - m_io->write_byte(A_YM3526+1, m_file->read_byte(m_pc+2)); + m_io->write_byte(A_YM3526_0 + 0, m_file->read_byte(m_pc + 1)); + m_io->write_byte(A_YM3526_0 + 1, m_file->read_byte(m_pc + 2)); + m_pc += 3; + break; + + case 0x5c: + pulse_act_led(LED_Y8950); + m_io->write_byte(A_Y8950_0 + 0, m_file->read_byte(m_pc + 1)); + m_io->write_byte(A_Y8950_0 + 1, m_file->read_byte(m_pc + 2)); m_pc += 3; break; case 0x5d: pulse_act_led(LED_YMZ280B); - m_io->write_byte(A_YMZ280B+0, m_file->read_byte(m_pc+1)); - m_io->write_byte(A_YMZ280B+1, m_file->read_byte(m_pc+2)); + m_io->write_byte(A_YMZ280B_0 + 0, m_file->read_byte(m_pc + 1)); + m_io->write_byte(A_YMZ280B_0 + 1, m_file->read_byte(m_pc + 2)); + m_pc += 3; + break; + + case 0x5e: + case 0x5f: + pulse_act_led(LED_YMF262); + m_io->write_byte(A_YMF262_0 + 0 + ((code & 1) << 1), m_file->read_byte(m_pc + 1)); + m_io->write_byte(A_YMF262_0 + 1 + ((code & 1) << 1), m_file->read_byte(m_pc + 2)); m_pc += 3; break; - case 0x61: { - uint32_t duration = m_file->read_word(m_pc+1); + case 0x61: + { + uint32_t duration = m_file->read_word(m_pc + 1); m_icount -= duration; m_pc += 3; break; @@ -679,7 +862,13 @@ void vgmplay_device::execute_run() uint32_t loop_offset = m_file->read_dword(0x1c); if (!loop_offset) { - m_state = DONE; + if (m_loop) + device_reset(); + else + { + logerror("done\n"); + m_state = DONE; + } break; } @@ -697,142 +886,419 @@ void vgmplay_device::execute_run() case 0x70: case 0x71: case 0x72: case 0x73: case 0x74: case 0x75: case 0x76: case 0x77: case 0x78: case 0x79: case 0x7a: case 0x7b: case 0x7c: case 0x7d: case 0x7e: case 0x7f: - m_icount -= 1+(code & 0xf); + m_icount -= 1 + (code & 0xf); m_pc += 1; break; case 0x80: case 0x81: case 0x82: case 0x83: case 0x84: case 0x85: case 0x86: case 0x87: case 0x88: case 0x89: case 0x8a: case 0x8b: case 0x8c: case 0x8d: case 0x8e: case 0x8f: pulse_act_led(LED_YM2612); - if(!m_data_streams[0].empty()) { - if(m_ym2612_stream_offset >= int(m_data_streams[0].size())) + if (!m_data_streams[0].empty()) + { + if (m_ym2612_stream_offset >= int(m_data_streams[0].size())) m_ym2612_stream_offset = 0; - m_io->write_byte(A_YM2612+0, 0x2a); - m_io->write_byte(A_YM2612+1, m_data_streams[0][m_ym2612_stream_offset]); + m_io->write_byte(A_YM2612_0 + 0, 0x2a); + m_io->write_byte(A_YM2612_0 + 1, m_data_streams[0][m_ym2612_stream_offset]); m_ym2612_stream_offset++; } m_pc += 1; m_icount -= code & 0xf; break; - case 0xa0: { + case 0x90: + { + uint8_t id = m_file->read_byte(m_pc + 1); + if (id < 0xff) + { + m_streams[id].type = m_file->read_byte(m_pc + 2); + m_streams[id].port = m_file->read_byte(m_pc + 3); + m_streams[id].reg = m_file->read_byte(m_pc + 4); + } + m_pc += 5; + break; + } + + case 0x91: + { + uint8_t id = m_file->read_byte(m_pc + 1); + if (id < 0xff) + { + m_streams[id].bank = m_file->read_byte(m_pc + 2); + m_streams[id].step_size = m_file->read_byte(m_pc + 3); + m_streams[id].step_base = m_file->read_byte(m_pc + 4); + } + m_pc += 5; + break; + } + + case 0x92: + { + uint8_t id = m_file->read_byte(m_pc + 1); + if (id < 0xff) + m_streams[id].frequency = m_file->read_dword(m_pc + 2); + m_pc += 6; + break; + } + + case 0x93: + { + uint8_t id = m_file->read_byte(m_pc + 1); + if (id < 0xff) + { + uint8_t flags = m_file->read_byte(m_pc + 3); + m_streams[id].length_mode = flags & 3; + m_streams[id].reverse = BIT(flags, 4); + m_streams[id].loop = BIT(flags, 7); + m_streams[id].offset = m_file->read_dword(m_pc + 2); + m_streams[id].length = m_file->read_dword(m_pc + 7); + m_stream_timers[id]->adjust(attotime::zero, id, m_streams[id].frequency ? attotime::from_double(m_streams[id].frequency) : attotime::never); + } + m_pc += 11; + break; + } + + case 0x94: + { + uint8_t id = m_file->read_byte(m_pc + 1); + if (id < 0xff) + m_stream_timers[id]->adjust(attotime::never, 0); + else + for (int i = 0; i < 0xff; i++) + m_stream_timers[i]->adjust(attotime::never, 0); + m_pc += 2; + break; + } + + case 0x95: + { + uint8_t id = m_file->read_byte(m_pc + 1); + if (id < 0xff && m_streams[id].type < 0xff && m_data_streams[m_streams[id].bank].size() != 0) + { + uint8_t flags = m_file->read_byte(m_pc + 3); + m_streams[id].loop = BIT(flags, 0); + m_streams[id].reverse = BIT(flags, 4); + /// TODO: get offset & length from???? + m_streams[id].offset = 0; + m_streams[id].length = 0; + m_streams[id].length_mode = 0; + m_stream_timers[id]->adjust(attotime::zero, id, m_streams[id].frequency ? attotime::from_double(m_streams[id].frequency) : attotime::never); + } + m_pc += 5; + break; + } + + case 0xa0: + { pulse_act_led(LED_AY8910); - uint8_t reg = m_file->read_byte(m_pc+1); - if(reg & 0x80) { - m_io->write_byte(A_AY8910A+1, reg & 0x7f); - m_io->write_byte(A_AY8910A+0, m_file->read_byte(m_pc+2)); - } else { - m_io->write_byte(A_AY8910B+1, reg & 0x7f); - m_io->write_byte(A_AY8910B+0, m_file->read_byte(m_pc+2)); + uint8_t reg = m_file->read_byte(m_pc + 1); + if (reg & 0x80) + { + m_io->write_byte(A_AY8910_1 + 1, reg & 0x7f); + m_io->write_byte(A_AY8910_1 + 0, m_file->read_byte(m_pc + 2)); + } + else + { + m_io->write_byte(A_AY8910_0 + 1, reg & 0x7f); + m_io->write_byte(A_AY8910_0 + 0, m_file->read_byte(m_pc + 2)); } m_pc += 3; break; } + case 0xa1: + pulse_act_led(LED_YM2413); + m_io->write_byte(A_YM2413_1 + 0, m_file->read_byte(m_pc + 1)); + m_io->write_byte(A_YM2413_1 + 1, m_file->read_byte(m_pc + 2)); + m_pc += 3; + break; + + case 0xa2: + case 0xa3: + pulse_act_led(LED_YM2612); + m_io->write_byte(A_YM2612_1 + 0 + ((code & 1) << 1), m_file->read_byte(m_pc + 1)); + m_io->write_byte(A_YM2612_1 + 1 + ((code & 1) << 1), m_file->read_byte(m_pc + 2)); + m_pc += 3; + break; + + case 0xa4: + pulse_act_led(LED_YM2151); + m_io->write_byte(A_YM2151_1 + 0, m_file->read_byte(m_pc + 1)); + m_io->write_byte(A_YM2151_1 + 1, m_file->read_byte(m_pc + 2)); + m_pc += 3; + break; + + case 0xa5: + pulse_act_led(LED_YM2203); + m_io->write_byte(A_YM2203_1 + 0, m_file->read_byte(m_pc + 1)); + m_io->write_byte(A_YM2203_1 + 1, m_file->read_byte(m_pc + 2)); + m_pc += 3; + break; + + case 0xa6: + case 0xa7: + pulse_act_led(LED_YM2608); + m_io->write_byte(A_YM2608_0 + 0 + ((code & 1) << 1), m_file->read_byte(m_pc + 1)); + m_io->write_byte(A_YM2608_0 + 1 + ((code & 1) << 1), m_file->read_byte(m_pc + 2)); + m_pc += 3; + break; + + case 0xa8: + case 0xa9: + pulse_act_led(LED_YM2610); + m_io->write_byte(A_YM2610_0 + 0 + ((code & 1) << 1), m_file->read_byte(m_pc + 1)); + m_io->write_byte(A_YM2610_0 + 1 + ((code & 1) << 1), m_file->read_byte(m_pc + 2)); + m_pc += 3; + break; + + case 0xaa: + pulse_act_led(LED_YM3812); + m_io->write_byte(A_YM3812_1 + 0, m_file->read_byte(m_pc + 1)); + m_io->write_byte(A_YM3812_1 + 1, m_file->read_byte(m_pc + 2)); + m_pc += 3; + break; + + case 0xab: + pulse_act_led(LED_YM3526); + m_io->write_byte(A_YM3526_1 + 0, m_file->read_byte(m_pc + 1)); + m_io->write_byte(A_YM3526_1 + 1, m_file->read_byte(m_pc + 2)); + m_pc += 3; + break; + + case 0xac: + pulse_act_led(LED_Y8950); + m_io->write_byte(A_Y8950_1 + 0, m_file->read_byte(m_pc + 1)); + m_io->write_byte(A_Y8950_1 + 1, m_file->read_byte(m_pc + 2)); + m_pc += 3; + break; + + case 0xad: + pulse_act_led(LED_YMZ280B); + m_io->write_byte(A_YMZ280B_1 + 0, m_file->read_byte(m_pc + 1)); + m_io->write_byte(A_YMZ280B_1 + 1, m_file->read_byte(m_pc + 2)); + m_pc += 3; + break; + + case 0xae: + case 0xaf: + pulse_act_led(LED_YMF262); + m_io->write_byte(A_YMF262_1 + 0 + ((code & 1) << 1), m_file->read_byte(m_pc + 1)); + m_io->write_byte(A_YMF262_1 + 1 + ((code & 1) << 1), m_file->read_byte(m_pc + 2)); + m_pc += 3; + break; + case 0xb0: pulse_act_led(LED_RF5C68); - m_io->write_byte(A_RF5C68 + m_file->read_byte(m_pc+1), m_file->read_byte(m_pc+2)); + m_io->write_byte(A_RF5C68 + m_file->read_byte(m_pc + 1), m_file->read_byte(m_pc + 2)); m_pc += 3; break; case 0xb1: pulse_act_led(LED_RF5C164); - m_io->write_byte(A_RF5C164 + m_file->read_byte(m_pc+1), m_file->read_byte(m_pc+2)); + m_io->write_byte(A_RF5C164 + m_file->read_byte(m_pc + 1), m_file->read_byte(m_pc + 2)); m_pc += 3; break; + case 0xb2: + { + pulse_act_led(LED_32X_PWM); + uint8_t offset = m_file->read_byte(m_pc + 1); + m_io16->write_word(A_32X_PWM + (offset >> 4), ((offset & 0xf) << 8) | m_file->read_byte(m_pc + 2)); + m_pc += 3; + break; + } + case 0xb3: + { pulse_act_led(LED_GAMEBOY); - m_io->write_byte(A_GAMEBOY + m_file->read_byte(m_pc+1), m_file->read_byte(m_pc+2)); + uint8_t reg = m_file->read_byte(m_pc + 1); + if (reg & 0x80) + m_io->write_byte(A_GAMEBOY_1 + (reg & 0x7f), m_file->read_byte(m_pc + 2)); + else + m_io->write_byte(A_GAMEBOY_0 + (reg & 0x7f), m_file->read_byte(m_pc + 2)); m_pc += 3; break; + } case 0xb4: + { pulse_act_led(LED_NESAPU); - m_io->write_byte(A_NESAPU + m_file->read_byte(m_pc+1), m_file->read_byte(m_pc+2)); + uint8_t offset = m_file->read_byte(m_pc + 1); + if (offset & 0x80) + m_io->write_byte(A_NESAPU_1 + (offset & 0x7f), m_file->read_byte(m_pc + 2)); + else + m_io->write_byte(A_NESAPU_0 + (offset & 0x7f), m_file->read_byte(m_pc + 2)); m_pc += 3; break; + } - case 0xb5: { + case 0xb5: + { pulse_act_led(LED_MULTIPCM); - uint8_t offset = m_file->read_byte(m_pc+1); - if(offset & 0x80) - m_io->write_byte(A_MULTIPCMB + (offset & 0x7f), m_file->read_byte(m_pc+2)); + uint8_t offset = m_file->read_byte(m_pc + 1); + if (offset & 0x80) + m_io->write_byte(A_MULTIPCM_1 + (offset & 0x7f), m_file->read_byte(m_pc + 2)); + else + m_io->write_byte(A_MULTIPCM_0 + (offset & 0x7f), m_file->read_byte(m_pc + 2)); + m_pc += 3; + break; + } + + case 0xb6: + { + pulse_act_led(LED_UPD7759); + // TODO: upd7759 + m_pc += 3; + break; + } + + case 0xb7: + { + pulse_act_led(LED_OKIM6258); + uint8_t offset = m_file->read_byte(m_pc + 1); + if (offset & 0x80) + m_io->write_byte(A_OKIM6258_1 + (offset & 0x7f), m_file->read_byte(m_pc + 2)); else - m_io->write_byte(A_MULTIPCMA + (offset & 0x7f), m_file->read_byte(m_pc+2)); + m_io->write_byte(A_OKIM6258_0 + (offset & 0x7f), m_file->read_byte(m_pc + 2)); m_pc += 3; break; } - case 0xb8: { + case 0xb8: + { pulse_act_led(LED_OKIM6295); - uint8_t offset = m_file->read_byte(m_pc+1); - if(offset & 0x80) - m_io->write_byte(A_OKIM6295B + (offset & 0x7f), m_file->read_byte(m_pc+2)); + uint8_t offset = m_file->read_byte(m_pc + 1); + if (offset & 0x80) + m_io->write_byte(A_OKIM6295_1 + (offset & 0x7f), m_file->read_byte(m_pc + 2)); else - m_io->write_byte(A_OKIM6295A + (offset & 0x7f), m_file->read_byte(m_pc+2)); + m_io->write_byte(A_OKIM6295_0 + (offset & 0x7f), m_file->read_byte(m_pc + 2)); m_pc += 3; break; } case 0xb9: + { pulse_act_led(LED_C6280); - m_io->write_byte(A_C6280 + m_file->read_byte(m_pc+1), m_file->read_byte(m_pc+2)); + uint8_t offset = m_file->read_byte(m_pc + 1); + if (offset & 0x80) + m_io->write_byte(A_C6280_1 + (offset & 0x7f), m_file->read_byte(m_pc + 2)); + else + m_io->write_byte(A_C6280_0 + (offset & 0x7f), m_file->read_byte(m_pc + 2)); m_pc += 3; break; + } case 0xba: + { pulse_act_led(LED_K053260); - m_io->write_byte(A_K053260 + m_file->read_byte(m_pc+1), m_file->read_byte(m_pc+2)); + uint8_t offset = m_file->read_byte(m_pc + 1); + if (offset & 0x80) + m_io->write_byte(A_K053260_1 + (offset & 0x7f), m_file->read_byte(m_pc + 2)); + else + m_io->write_byte(A_K053260_0 + (offset & 0x7f), m_file->read_byte(m_pc + 2)); m_pc += 3; break; + } - case 0xbb: { + case 0xbb: + { pulse_act_led(LED_POKEY); - uint8_t offset = m_file->read_byte(m_pc+1); + uint8_t offset = m_file->read_byte(m_pc + 1); + if (offset & 0x80) + m_io->write_byte(A_POKEY_1 + (offset & 0x7f), m_file->read_byte(m_pc + 2)); + else + m_io->write_byte(A_POKEY_0 + (offset & 0x7f), m_file->read_byte(m_pc + 2)); + m_pc += 3; + break; + } + + case 0xbc: + { + pulse_act_led(LED_WSWAN); + uint8_t offset = m_file->read_byte(m_pc + 1); if (offset & 0x80) - m_io->write_byte(A_POKEYA + (offset & 0x7f), m_file->read_byte(m_pc+2)); + m_io->write_byte(A_WSWAN_1 + (offset & 0x7f) + 0x80, m_file->read_byte(m_pc + 2)); else - m_io->write_byte(A_POKEYB + (offset & 0x7f), m_file->read_byte(m_pc+2)); + m_io->write_byte(A_WSWAN_0 + (offset & 0x7f) + 0x80, m_file->read_byte(m_pc + 2)); m_pc += 3; break; } - case 0xbf: { + case 0xbd: + { + pulse_act_led(LED_SAA1099); + uint8_t offset = m_file->read_byte(m_pc + 1); + if (offset & 0x80) + { + m_io->write_byte(A_SAA1099_1 + 1, offset & 0x7f); + m_io->write_byte(A_SAA1099_1 + 0, m_file->read_byte(m_pc + 2)); + } + else + { + m_io->write_byte(A_SAA1099_0 + 1, offset & 0x7f); + m_io->write_byte(A_SAA1099_0 + 0, m_file->read_byte(m_pc + 2)); + } + m_pc += 3; + break; + } + + case 0xbe: + { + pulse_act_led(LED_ES5505); + // TODO: es5505 + m_pc += 3; + break; + } + + case 0xbf: + { pulse_act_led(LED_GA20); - m_io->write_byte(A_GA20 + m_file->read_byte(m_pc+1), m_file->read_byte(m_pc+2)); + uint8_t offset = m_file->read_byte(m_pc + 1); + if (offset & 0x80) + m_io->write_byte(A_GA20_1 + (offset & 0x7f), m_file->read_byte(m_pc + 2)); + else + m_io->write_byte(A_GA20_0 + (offset & 0x7f), m_file->read_byte(m_pc + 2)); m_pc += 3; break; } case 0xc0: + { pulse_act_led(LED_SEGAPCM); - m_io->write_byte(A_SEGAPCM + (m_file->read_word(m_pc+1) & 0x7ff), m_file->read_byte(m_pc+3)); + uint16_t offset = m_file->read_word(m_pc + 1); + if (offset & 0x8000) + m_io->write_byte(A_SEGAPCM_1 + (offset & 0x7fff), m_file->read_byte(m_pc + 3)); + else + m_io->write_byte(A_SEGAPCM_0 + (offset & 0x7fff), m_file->read_byte(m_pc + 3)); m_pc += 4; break; + } case 0xc1: pulse_act_led(LED_RF5C68); - m_io->write_byte(A_RF5C68RAM + m_file->read_word(m_pc+1), m_file->read_byte(m_pc+3)); + m_io->write_byte(A_RF5C68_RAM + m_file->read_word(m_pc + 1), m_file->read_byte(m_pc + 3)); m_pc += 4; break; case 0xc2: pulse_act_led(LED_RF5C164); - m_io->write_byte(A_RF5C164RAM + m_file->read_word(m_pc+1), m_file->read_byte(m_pc+3)); + m_io->write_byte(A_RF5C164_RAM + m_file->read_word(m_pc + 1), m_file->read_byte(m_pc + 3)); m_pc += 4; break; - case 0xc3: { + case 0xc3: + { pulse_act_led(LED_MULTIPCM); - uint8_t offset = m_file->read_byte(m_pc+1); - if (offset & 0x80) { - m_io->write_byte(A_MULTIPCMB + 4 + (offset & 0x7f), m_file->read_byte(m_pc+3)); - m_io->write_byte(A_MULTIPCMB + 8 + (offset & 0x7f), m_file->read_byte(m_pc+2)); - } else { - m_io->write_byte(A_MULTIPCMA + 4 + (offset & 0x7f), m_file->read_byte(m_pc+3)); - m_io->write_byte(A_MULTIPCMA + 8 + (offset & 0x7f), m_file->read_byte(m_pc+2)); + uint8_t offset = m_file->read_byte(m_pc + 1); + if (offset & 0x80) + { + m_io->write_byte(A_MULTIPCM_1 + 4 + (offset & 0x7f), m_file->read_byte(m_pc + 3)); + m_io->write_byte(A_MULTIPCM_1 + 8 + (offset & 0x7f), m_file->read_byte(m_pc + 2)); + } + else + { + m_io->write_byte(A_MULTIPCM_0 + 4 + (offset & 0x7f), m_file->read_byte(m_pc + 3)); + m_io->write_byte(A_MULTIPCM_0 + 8 + (offset & 0x7f), m_file->read_byte(m_pc + 2)); } m_pc += 4; break; @@ -840,65 +1306,180 @@ void vgmplay_device::execute_run() case 0xc4: pulse_act_led(LED_QSOUND); - m_io->write_byte(A_QSOUND + 0, m_file->read_byte(m_pc+1)); - m_io->write_byte(A_QSOUND + 1, m_file->read_byte(m_pc+2)); - m_io->write_byte(A_QSOUND + 2, m_file->read_byte(m_pc+3)); + m_io->write_byte(A_QSOUND + 0, m_file->read_byte(m_pc + 1)); + m_io->write_byte(A_QSOUND + 1, m_file->read_byte(m_pc + 2)); + m_io->write_byte(A_QSOUND + 2, m_file->read_byte(m_pc + 3)); m_pc += 4; break; - case 0xc8: { + case 0xc5: + { + pulse_act_led(LED_SCSP); + // TODO: SCSP memory + m_pc += 4; + break; + } + + case 0xc6: + { + pulse_act_led(LED_WSWAN); + uint8_t offset = m_file->read_byte(m_pc + 1); + if (offset & 0x80) + m_io->write_byte(A_WSWAN_RAM_1 + ((offset & 0x7f) << 8) + m_file->read_byte(m_pc + 2), m_file->read_byte(m_pc + 3)); + else + m_io->write_byte(A_WSWAN_RAM_0 + ((offset & 0x7f) << 8) + m_file->read_byte(m_pc + 2), m_file->read_byte(m_pc + 3)); + m_pc += 4; + break; + } + + case 0xc7: + { + pulse_act_led(LED_VSU_VUE); + uint8_t offset = m_file->read_byte(m_pc + 1); + if (offset & 0x80) + m_io->write_byte(A_VSU_VUE_1 + ((offset & 0x7f) << 10) + (m_file->read_byte(m_pc + 2) << 2), m_file->read_byte(m_pc + 3)); + else + m_io->write_byte(A_VSU_VUE_0 + ((offset & 0x7f) << 10) + (m_file->read_byte(m_pc + 2) << 2), m_file->read_byte(m_pc + 3)); + m_pc += 4; + break; + } + + case 0xc8: + { pulse_act_led(LED_X1_010); - m_io->write_byte(A_X1_010 + ((m_file->read_byte(m_pc+1) << 8) | m_file->read_byte(m_pc+2)), m_file->read_byte(m_pc+3)); + uint8_t offset = m_file->read_byte(m_pc + 1); + if (offset & 0x80) + m_io->write_byte(A_X1_010_1 + ((offset & 0x7f) << 8) + m_file->read_byte(m_pc + 2), m_file->read_byte(m_pc + 3)); + else + m_io->write_byte(A_X1_010_0 + ((offset & 0x7f) << 8) + m_file->read_byte(m_pc + 2), m_file->read_byte(m_pc + 3)); m_pc += 4; break; } - case 0xd1: { + case 0xd0: + { + pulse_act_led(LED_YMF278B); + uint8_t offset = m_file->read_byte(m_pc + 1); + if (offset & 0x80) + { + m_io->write_byte(A_YMF278B_1 + ((offset & 0x7f) << 1) + 0, m_file->read_byte(m_pc + 2)); + m_io->write_byte(A_YMF278B_1 + ((offset & 0x7f) << 1) + 1, m_file->read_byte(m_pc + 3)); + } + else + { + m_io->write_byte(A_YMF278B_0 + ((offset & 0x7f) << 1) + 0, m_file->read_byte(m_pc + 2)); + m_io->write_byte(A_YMF278B_0 + ((offset & 0x7f) << 1) + 1, m_file->read_byte(m_pc + 3)); + } + m_pc += 4; + break; + } + + case 0xd1: + { pulse_act_led(LED_YMF271); - uint8_t offset = m_file->read_byte(m_pc+1); - m_io->write_byte(A_YMF271 + (offset & 7) * 2, m_file->read_byte(m_pc+2)); - m_io->write_byte(A_YMF271 + (offset & 7) * 2 + 1, m_file->read_byte(m_pc+3)); + uint8_t offset = m_file->read_byte(m_pc + 1); + if (offset & 0x80) + { + m_io->write_byte(A_YMF271_1 + ((offset & 0x7f) << 1) + 0, m_file->read_byte(m_pc + 2)); + m_io->write_byte(A_YMF271_1 + ((offset & 0x7f) << 1) + 1, m_file->read_byte(m_pc + 3)); + } + else + { + m_io->write_byte(A_YMF271_0 + ((offset & 0x7f) << 1) + 0, m_file->read_byte(m_pc + 2)); + m_io->write_byte(A_YMF271_0 + ((offset & 0x7f) << 1) + 1, m_file->read_byte(m_pc + 3)); + } m_pc += 4; break; } - case 0xd2: { + case 0xd2: + { pulse_act_led(LED_K051649); - uint32_t offset = m_file->read_byte(m_pc+1) << 1; - m_io->write_byte(A_K051649 + (offset | 0), m_file->read_byte(m_pc+2)); - m_io->write_byte(A_K051649 + (offset | 1), m_file->read_byte(m_pc+3)); + uint8_t offset = m_file->read_byte(m_pc + 1); + if (offset & 0x80) + { + m_io->write_byte(A_K051649_1 + ((offset & 0x7f) << 1) + 0, m_file->read_byte(m_pc + 2)); + m_io->write_byte(A_K051649_1 + ((offset & 0x7f) << 1) + 1, m_file->read_byte(m_pc + 3)); + } + else + { + m_io->write_byte(A_K051649_0 + ((offset & 0x7f) << 1) + 0, m_file->read_byte(m_pc + 2)); + m_io->write_byte(A_K051649_0 + ((offset & 0x7f) << 1) + 1, m_file->read_byte(m_pc + 3)); + } m_pc += 4; break; } - case 0xd3: { + case 0xd3: + { pulse_act_led(LED_K054539); - uint16_t offset = m_file->read_byte(m_pc+1) << 16 | m_file->read_byte(m_pc+2); - if (offset & 0x8000) - m_io->write_byte(A_K054539B + (offset & 0x3ff), m_file->read_byte(m_pc+3)); + uint8_t offset = m_file->read_byte(m_pc + 1); + if (offset & 0x80) + m_io->write_byte(A_K054539_1 + ((offset & 0x7f) << 8) + m_file->read_byte(m_pc + 2), m_file->read_byte(m_pc + 3)); else - m_io->write_byte(A_K054539A + (offset & 0x3ff), m_file->read_byte(m_pc+3)); + m_io->write_byte(A_K054539_0 + ((offset & 0x7f) << 8) + m_file->read_byte(m_pc + 2), m_file->read_byte(m_pc + 3)); + m_pc += 4; + break; + } + + case 0xd4: + { + pulse_act_led(LED_C140); + uint8_t offset = m_file->read_byte(m_pc + 1); + if (offset & 0x80) + m_io->write_byte(A_C140_1 + ((offset & 0x7f) << 8) + m_file->read_byte(m_pc + 2), m_file->read_byte(m_pc + 3)); + else + m_io->write_byte(A_C140_0 + ((offset & 0x7f) << 8) + m_file->read_byte(m_pc + 2), m_file->read_byte(m_pc + 3)); + m_pc += 4; + break; + } + + case 0xd5: + { + pulse_act_led(LED_ES5503); + uint8_t offset = m_file->read_byte(m_pc + 1); + if (offset & 0x80) + m_io->write_byte(A_ES5503_1 + ((offset & 0x7f) << 8) + m_file->read_byte(m_pc + 2), m_file->read_byte(m_pc + 3)); + else + m_io->write_byte(A_ES5503_0 + ((offset & 0x7f) << 8) + m_file->read_byte(m_pc + 2), m_file->read_byte(m_pc + 3)); + m_pc += 4; + break; + } + + case 0xd6: + { + pulse_act_led(LED_ES5505); + // TODO: es5505 m_pc += 4; break; } case 0xe0: pulse_act_led(LED_YM2612); - m_ym2612_stream_offset = m_file->read_dword(m_pc+1); + m_ym2612_stream_offset = m_file->read_dword(m_pc + 1); m_pc += 5; break; - case 0xe1: { + case 0xe1: + { pulse_act_led(LED_C352); - uint32_t addr = (m_file->read_byte(m_pc+1) << 8) | m_file->read_byte(m_pc+2); - uint16_t data = (m_file->read_byte(m_pc+3) << 8) | m_file->read_byte(m_pc+4); - m_io16->write_word(A_C352 + (addr << 1), data); + uint8_t offset = m_file->read_byte(m_pc + 1); + uint32_t addr = ((offset & 0x7f) << 8) + m_file->read_byte(m_pc + 2); + uint16_t data = (m_file->read_byte(m_pc + 3) << 8) + m_file->read_byte(m_pc + 4); + if (offset & 0x80) + m_io16->write_word(A_C352_1 + (addr << 1), data); + else + m_io16->write_word(A_C352_0 + (addr << 1), data); m_pc += 5; break; } default: - logerror("unhandled code %02x (%02x %02x %02x %02x)\n", code, m_file->read_byte(m_pc+1), m_file->read_byte(m_pc+2), m_file->read_byte(m_pc+3), m_file->read_byte(m_pc+4)); + logerror("unhandled code %02x (%02x %02x %02x %02x)\n", code, m_file->read_byte(m_pc + 1), m_file->read_byte(m_pc + 2), m_file->read_byte(m_pc + 3), m_file->read_byte(m_pc + 4)); + + if (machine().debug_flags & DEBUG_FLAG_ENABLED) + debugger_instruction_hook(m_pc); + m_state = DONE; m_icount = 0; break; @@ -907,21 +1488,7 @@ void vgmplay_device::execute_run() } case DONE: { - static bool done = false; - if(!done && !m_loop) - { - logerror("done\n"); - done = true; - } - else if (m_loop) - { - device_reset(); - } - else - { - if(machine().debug_flags & DEBUG_FLAG_ENABLED) - debugger_instruction_hook(m_pc); - } + machine().sound().system_mute(1); m_icount = 0; break; } @@ -935,10 +1502,11 @@ void vgmplay_device::execute_set_input(int inputnum, int state) device_memory_interface::space_config_vector vgmplay_device::memory_space_config() const { - return space_config_vector { + return space_config_vector + { std::make_pair(AS_PROGRAM, &m_file_config), std::make_pair(AS_IO, &m_io_config), - std::make_pair(AS_IO16, &m_io16_config) + std::make_pair(AS_IO16, &m_io16_config), }; } @@ -966,77 +1534,75 @@ uint32_t vgmplay_disassembler::opcode_alignment() const offs_t vgmplay_disassembler::disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer ¶ms) { - switch(opcodes.r8(pc)) { + switch (opcodes.r8(pc)) + { + case 0x30: + util::stream_format(stream, "psg.1 write %02x", opcodes.r8(pc + 1)); + return 2 | SUPPORTED; + + case 0x3f: + util::stream_format(stream, "psg.1 r06 = %02x", opcodes.r8(pc + 1)); + return 2 | SUPPORTED; + case 0x4f: - util::stream_format(stream, "psg r06 = %02x", opcodes.r8(pc+1)); + util::stream_format(stream, "psg.0 r06 = %02x", opcodes.r8(pc + 1)); return 2 | SUPPORTED; case 0x50: - util::stream_format(stream, "psg write %02x", opcodes.r8(pc+1)); + util::stream_format(stream, "psg.0 write %02x", opcodes.r8(pc + 1)); return 2 | SUPPORTED; case 0x51: - util::stream_format(stream, "ym2413 r%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2)); + util::stream_format(stream, "ym2413.0 r%02x = %02x", opcodes.r8(pc + 1), opcodes.r8(pc + 2)); return 3 | SUPPORTED; case 0x52: - util::stream_format(stream, "ym2612.0 r%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2)); - return 3 | SUPPORTED; - case 0x53: - util::stream_format(stream, "ym2612.1 r%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2)); + util::stream_format(stream, "ym2612.0 %d r%02x = %02x", opcodes.r8(pc) & 1, opcodes.r8(pc + 1), opcodes.r8(pc + 2)); return 3 | SUPPORTED; case 0x54: - util::stream_format(stream, "ym2151 r%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2)); + util::stream_format(stream, "ym2151.0 r%02x = %02x", opcodes.r8(pc + 1), opcodes.r8(pc + 2)); return 3 | SUPPORTED; case 0x55: - util::stream_format(stream, "ym2203a r%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2)); + util::stream_format(stream, "ym2203.0 r%02x = %02x", opcodes.r8(pc + 1), opcodes.r8(pc + 2)); return 3 | SUPPORTED; case 0x56: - util::stream_format(stream, "ym2608.0 r%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2)); - return 3 | SUPPORTED; - case 0x57: - util::stream_format(stream, "ym2608.1 r%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2)); + util::stream_format(stream, "ym2608.0 %d r%02x = %02x", opcodes.r8(pc) & 1, opcodes.r8(pc + 1), opcodes.r8(pc + 2)); return 3 | SUPPORTED; case 0x58: - util::stream_format(stream, "ym2610.0 r%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2)); - return 3 | SUPPORTED; - case 0x59: - util::stream_format(stream, "ym2610.1 r%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2)); + util::stream_format(stream, "ym2610.0 %d r%02x = %02x", opcodes.r8(pc) & 1, opcodes.r8(pc + 1), opcodes.r8(pc + 2)); return 3 | SUPPORTED; case 0x5a: - util::stream_format(stream, "ym3812 r%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2)); + util::stream_format(stream, "ym3812.0 r%02x = %02x", opcodes.r8(pc + 1), opcodes.r8(pc + 2)); return 3 | SUPPORTED; case 0x5b: - util::stream_format(stream, "ym3526 r%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2)); + util::stream_format(stream, "ym3526.0 r%02x = %02x", opcodes.r8(pc + 1), opcodes.r8(pc + 2)); return 3 | SUPPORTED; case 0x5c: - util::stream_format(stream, "y8950 r%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2)); + util::stream_format(stream, "y8950.0 r%02x = %02x", opcodes.r8(pc + 1), opcodes.r8(pc + 2)); return 3 | SUPPORTED; case 0x5d: - util::stream_format(stream, "ymz280b r%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2)); + util::stream_format(stream, "ymz280b.0 r%02x = %02x", opcodes.r8(pc + 1), opcodes.r8(pc + 2)); return 3 | SUPPORTED; case 0x5e: - util::stream_format(stream, "ymf262.0 r%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2)); - return 3 | SUPPORTED; - case 0x5f: - util::stream_format(stream, "ymf262.1 r%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2)); + util::stream_format(stream, "ymf262.0 %d r%02x = %02x", opcodes.r8(pc) & 1, opcodes.r8(pc + 1), opcodes.r8(pc + 2)); return 3 | SUPPORTED; - case 0x61: { - uint32_t duration = opcodes.r8(pc+1) | (opcodes.r8(pc+2) << 8); + case 0x61: + { + uint32_t duration = opcodes.r8(pc + 1) | (opcodes.r8(pc + 2) << 8); util::stream_format(stream, "wait %d", duration); return 3 | SUPPORTED; } @@ -1053,8 +1619,10 @@ offs_t vgmplay_disassembler::disassemble(std::ostream &stream, offs_t pc, const util::stream_format(stream, "end"); return 1 | SUPPORTED; - case 0x67: { - static const char *const basic_types[8] = { + case 0x67: + { + static const char *const basic_types[8] = + { "ym2612 pcm", "rf5c68 pcm", "rf5c164 pcm", @@ -1065,7 +1633,8 @@ offs_t vgmplay_disassembler::disassemble(std::ostream &stream, offs_t pc, const "nes apu dpcm" }; - static const char *const rom_types[20] = { + static const char *const rom_types[20] = + { "sega pcm rom", "ym2608 delta-t rom", "ym2610 adpcm rom", @@ -1088,47 +1657,49 @@ offs_t vgmplay_disassembler::disassemble(std::ostream &stream, offs_t pc, const "ga20 rom" }; - static const char *const ram_types[3] = { + static const char *const ram_types[3] = + { "rf5c68 ram", "rf5c164 ram", "nes apu ram" }; - static const char *const ram2_types[2] = { + static const char *const ram2_types[2] = + { "scsp ram", "es5503 ram" }; - uint8_t type = opcodes.r8(pc+2); - uint32_t size = opcodes.r8(pc+3) | (opcodes.r8(pc+4) << 8) | (opcodes.r8(pc+5) << 16) | (opcodes.r8(pc+6) << 24); - if(type < 0x8) + uint8_t type = opcodes.r8(pc + 2); + uint32_t size = opcodes.r8(pc + 3) | (opcodes.r8(pc + 4) << 8) | (opcodes.r8(pc + 5) << 16) | (opcodes.r8(pc + 6) << 24); + if (type < 0x8) util::stream_format(stream, "data-block %x, %s", size, basic_types[type]); - else if(type < 0x40) + else if (type < 0x40) util::stream_format(stream, "data-block %x, %02x", size, type); - else if(type < 0x48) + else if (type < 0x48) util::stream_format(stream, "data-block %x comp., %s", size, basic_types[type & 0x3f]); - else if(type < 0x7f) + else if (type < 0x7f) util::stream_format(stream, "data-block %x comp., %02x", size, type & 0x3f); - else if(type < 0x80) - util::stream_format(stream, "decomp-table %x, %02x/%02x", size, opcodes.r8(pc+7), opcodes.r8(pc+8)); - else if(type < 0x94) + else if (type < 0x80) + util::stream_format(stream, "decomp-table %x, %02x/%02x", size, opcodes.r8(pc + 7), opcodes.r8(pc + 8)); + else if (type < 0x94) util::stream_format(stream, "data-block %x, %s", size, rom_types[type & 0x7f]); - else if(type < 0xc0) + else if (type < 0xc0) util::stream_format(stream, "data-block %x, rom %02x", size, type); - else if(type < 0xc3) + else if (type < 0xc3) util::stream_format(stream, "data-block %x, %s", size, ram_types[type & 0x1f]); - else if(type < 0xe0) + else if (type < 0xe0) util::stream_format(stream, "data-block %x, ram %02x", size, type); - else if(type < 0xe2) + else if (type < 0xe2) util::stream_format(stream, "data-block %x, %s", size, ram2_types[type & 0x1f]); else util::stream_format(stream, "data-block %x, ram %02x", size, type); - return (7+size) | SUPPORTED; + return (7 + size) | SUPPORTED; } case 0x70: case 0x71: case 0x72: case 0x73: case 0x74: case 0x75: case 0x76: case 0x77: case 0x78: case 0x79: case 0x7a: case 0x7b: case 0x7c: case 0x7d: case 0x7e: case 0x7f: - util::stream_format(stream, "wait %d", 1+(opcodes.r8(pc) & 0x0f)); + util::stream_format(stream, "wait %d", 1 + (opcodes.r8(pc) & 0x0f)); return 1 | SUPPORTED; case 0x80: @@ -1140,115 +1711,221 @@ offs_t vgmplay_disassembler::disassemble(std::ostream &stream, offs_t pc, const util::stream_format(stream, "ym2612.0 r2a = rom++; wait %d", opcodes.r8(pc) & 0xf); return 1 | SUPPORTED; + case 0x90: + util::stream_format(stream, "stream control %02x %02x %02x %02x\n", opcodes.r8(pc + 1), opcodes.r8(pc + 2), opcodes.r8(pc + 3), opcodes.r8(pc + 4)); + return 5 | SUPPORTED; + + case 0x91: + util::stream_format(stream, "stream data %02x %02x %02x %02x\n", opcodes.r8(pc + 1), opcodes.r8(pc + 2), opcodes.r8(pc + 3), opcodes.r8(pc + 4)); + return 5 | SUPPORTED; + + case 0x92: + util::stream_format(stream, "stream frequency %02x %d\n", opcodes.r8(pc + 1), opcodes.r32(pc + 2)); + return 6 | SUPPORTED; + + case 0x93: + util::stream_format(stream, "stream start %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n", opcodes.r8(pc + 1), opcodes.r8(pc + 2), opcodes.r8(pc + 3), opcodes.r8(pc + 4), opcodes.r8(pc + 5), opcodes.r8(pc + 6), opcodes.r8(pc + 7), opcodes.r8(pc + 8), opcodes.r8(pc + 9), opcodes.r8(pc + 10)); + return 11 | SUPPORTED; + + case 0x94: + util::stream_format(stream, "stream stop %02x\n", opcodes.r8(pc + 1)); + return 2 | SUPPORTED; + + case 0x95: + util::stream_format(stream, "stream start (fast) %02x %02x %02x %02x\n", opcodes.r8(pc + 1), opcodes.r8(pc + 2), opcodes.r8(pc + 3), opcodes.r8(pc + 4)); + return 5 | SUPPORTED; + case 0xa0: - util::stream_format(stream, "ay8910 r%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2)); + util::stream_format(stream, "ay8910.%d r%02x = %02x", BIT(opcodes.r8(pc + 1), 7), opcodes.r8(pc + 1) & 0x7f, opcodes.r8(pc + 2)); + return 3 | SUPPORTED; + + case 0xa1: + util::stream_format(stream, "ym2413.1 r%02x = %02x", opcodes.r8(pc + 1), opcodes.r8(pc + 2)); + return 3 | SUPPORTED; + + case 0xa2: + case 0xa3: + util::stream_format(stream, "ym2612.1 %d r%02x = %02x", opcodes.r8(pc) & 1, opcodes.r8(pc + 1), opcodes.r8(pc + 2)); + return 3 | SUPPORTED; + + case 0xa4: + util::stream_format(stream, "ym2151.1 r%02x = %02x", opcodes.r8(pc + 1), opcodes.r8(pc + 2)); return 3 | SUPPORTED; case 0xa5: - util::stream_format(stream, "ym2203b r%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2)); + util::stream_format(stream, "ym2203.1 r%02x = %02x", opcodes.r8(pc + 1), opcodes.r8(pc + 2)); + return 3 | SUPPORTED; + + case 0xa6: + case 0xa7: + util::stream_format(stream, "ym2608.1 %d r%02x = %02x", opcodes.r8(pc) & 1, opcodes.r8(pc + 1), opcodes.r8(pc + 2)); + return 3 | SUPPORTED; + + case 0xa8: + case 0xa9: + util::stream_format(stream, "ym2610.1 %d r%02x = %02x", opcodes.r8(pc) & 1, opcodes.r8(pc + 1), opcodes.r8(pc + 2)); + return 3 | SUPPORTED; + + case 0xaa: + util::stream_format(stream, "ym3812.1 r%02x = %02x", opcodes.r8(pc + 1), opcodes.r8(pc + 2)); + return 3 | SUPPORTED; + + case 0xab: + util::stream_format(stream, "ym3526.1 r%02x = %02x", opcodes.r8(pc + 1), opcodes.r8(pc + 2)); + return 3 | SUPPORTED; + + case 0xac: + util::stream_format(stream, "y8950.1 r%02x = %02x", opcodes.r8(pc + 1), opcodes.r8(pc + 2)); + return 3 | SUPPORTED; + + case 0xad: + util::stream_format(stream, "ymz280b.1 r%02x = %02x", opcodes.r8(pc + 1), opcodes.r8(pc + 2)); + return 3 | SUPPORTED; + + case 0xae: + case 0xaf: + util::stream_format(stream, "ymf262.1 %d r%02x = %02x", opcodes.r8(pc) & 1, opcodes.r8(pc + 1), opcodes.r8(pc + 2)); return 3 | SUPPORTED; case 0xb0: - util::stream_format(stream, "rf5c68 r%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2)); + util::stream_format(stream, "rf5c68 r%02x = %02x", opcodes.r8(pc + 1), opcodes.r8(pc + 2)); return 3 | SUPPORTED; case 0xb1: - util::stream_format(stream, "rf5c164 r%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2)); + util::stream_format(stream, "rf5c164 r%02x = %02x", opcodes.r8(pc + 1), opcodes.r8(pc + 2)); return 3 | SUPPORTED; case 0xb2: - util::stream_format(stream, "pwm r%x = %03x", opcodes.r8(pc+1) >> 4, opcodes.r8(pc+2) | ((opcodes.r8(pc+1) & 0xf) << 8)); + util::stream_format(stream, "32x_pwm r%x = %03x", opcodes.r8(pc + 1) >> 4, opcodes.r8(pc + 2) | ((opcodes.r8(pc + 1) & 0xf) << 8)); return 3 | SUPPORTED; case 0xb3: - util::stream_format(stream, "dmg r%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2)); + util::stream_format(stream, "dmg.%d r%02x = %02x", BIT(opcodes.r8(pc + 1), 7), opcodes.r8(pc + 1) & 0x7f, opcodes.r8(pc + 2)); return 3 | SUPPORTED; case 0xb4: - util::stream_format(stream, "nesapu r%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2)); + util::stream_format(stream, "nesapu.%d r%02x = %02x", BIT(opcodes.r8(pc + 1), 7), opcodes.r8(pc + 1) & 0x7f, opcodes.r8(pc + 2)); return 3 | SUPPORTED; case 0xb5: - util::stream_format(stream, "multipcm r%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2)); + util::stream_format(stream, "multipcm.%d r%02x = %02x", BIT(opcodes.r8(pc + 1), 7), opcodes.r8(pc + 1) & 0x7f, opcodes.r8(pc + 2)); return 3 | SUPPORTED; case 0xb6: - util::stream_format(stream, "upd7759 r%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2)); + util::stream_format(stream, "upd7759.%d r%02x = %02x", BIT(opcodes.r8(pc + 1), 7), opcodes.r8(pc + 1) & 0x7f, opcodes.r8(pc + 2)); return 3 | SUPPORTED; case 0xb7: - util::stream_format(stream, "okim6258 r%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2)); + util::stream_format(stream, "okim6258.%d r%02x = %02x", BIT(opcodes.r8(pc + 1), 7), opcodes.r8(pc + 1) & 0x7f, opcodes.r8(pc + 2)); return 3 | SUPPORTED; case 0xb8: - util::stream_format(stream, "okim6295 r%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2)); + util::stream_format(stream, "okim6295.%d r%02x = %02x", BIT(opcodes.r8(pc + 1), 7), opcodes.r8(pc + 1) & 0x7f, opcodes.r8(pc + 2)); return 3 | SUPPORTED; case 0xb9: - util::stream_format(stream, "huc6280 r%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2)); + util::stream_format(stream, "huc6280.%d r%02x = %02x", BIT(opcodes.r8(pc + 1), 7), opcodes.r8(pc + 1) & 0x7f, opcodes.r8(pc + 2)); return 3 | SUPPORTED; case 0xba: - util::stream_format(stream, "k053260 r%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2)); + util::stream_format(stream, "k053260.%d r%02x = %02x", BIT(opcodes.r8(pc + 1), 7), opcodes.r8(pc + 1) & 0x7f, opcodes.r8(pc + 2)); return 3 | SUPPORTED; case 0xbb: - util::stream_format(stream, "pokey r%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2)); + util::stream_format(stream, "pokey.%d r%02x = %02x", BIT(opcodes.r8(pc + 1), 7), opcodes.r8(pc + 1) & 0x7f, opcodes.r8(pc + 2)); + return 3 | SUPPORTED; + + case 0xbc: + util::stream_format(stream, "wonderswan.%d r%02x = %02x", BIT(opcodes.r8(pc + 1), 7), opcodes.r8(pc + 1) & 0x7f, opcodes.r8(pc + 2)); + return 3 | SUPPORTED; + + case 0xbd: + util::stream_format(stream, "saa1099.%d r%02x = %02x", BIT(opcodes.r8(pc + 1), 7), opcodes.r8(pc + 1) & 0x7f, opcodes.r8(pc + 2)); + return 3 | SUPPORTED; + + case 0xbe: + util::stream_format(stream, "es5505.%d r%02x = %02x", BIT(opcodes.r8(pc + 1), 7), opcodes.r8(pc + 1) & 0x7f, opcodes.r8(pc + 2)); + return 3 | SUPPORTED; + + case 0xbf: + util::stream_format(stream, "ga20.%d r%02x = %02x", BIT(opcodes.r8(pc + 1), 7), opcodes.r8(pc + 1) & 0x7f, opcodes.r8(pc + 2)); return 3 | SUPPORTED; case 0xc0: - util::stream_format(stream, "segapcm %04x = %02x", opcodes.r8(pc+1) | (opcodes.r8(pc+2) << 8), opcodes.r8(pc+3)); + util::stream_format(stream, "segapcm.%d %04x = %02x", BIT(opcodes.r8(pc + 2), 7), opcodes.r8(pc + 1) | ((opcodes.r8(pc + 2) & 0x7f) << 8), opcodes.r8(pc + 3)); return 4 | SUPPORTED; case 0xc1: - util::stream_format(stream, "rf5c68 %04x = %02x", opcodes.r8(pc+1) | (opcodes.r8(pc+2) << 8), opcodes.r8(pc+3)); + util::stream_format(stream, "rf5c68 %04x = %02x", opcodes.r8(pc + 1) | (opcodes.r8(pc + 2) << 8), opcodes.r8(pc + 3)); return 4 | SUPPORTED; case 0xc2: - util::stream_format(stream, "rf5c164 %04x = %02x", opcodes.r8(pc+1) | (opcodes.r8(pc+2) << 8), opcodes.r8(pc+3)); + util::stream_format(stream, "rf5c164 %04x = %02x", opcodes.r8(pc + 1) | (opcodes.r8(pc + 2) << 8), opcodes.r8(pc + 3)); return 4 | SUPPORTED; case 0xc3: - util::stream_format(stream, "multipcm c%02x.off = %04x", opcodes.r8(pc+1), opcodes.r8(pc+2) | (opcodes.r8(pc+3) << 8)); + util::stream_format(stream, "multipcm.%d c%02x.off = %04x", BIT(opcodes.r8(pc + 1), 7), opcodes.r8(pc + 1) & 0x7f, opcodes.r8(pc + 2) | (opcodes.r8(pc + 3) << 8)); return 4 | SUPPORTED; case 0xc4: - util::stream_format(stream, "qsound %02x = %04x", opcodes.r8(pc+3), opcodes.r8(pc+2) | (opcodes.r8(pc+1) << 8)); + util::stream_format(stream, "qsound %02x = %04x", opcodes.r8(pc + 3), opcodes.r8(pc + 2) | (opcodes.r8(pc + 1) << 8)); + return 4 | SUPPORTED; + + case 0xc5: + util::stream_format(stream, "scsp.%d %04x = %02x", BIT(opcodes.r8(pc + 1), 7), ((opcodes.r8(pc + 1) & 0x7f) << 8) | opcodes.r8(pc + 2), opcodes.r8(pc + 3)); + return 4 | SUPPORTED; + + case 0xc6: + util::stream_format(stream, "wswan.%d %04x = %02x", BIT(opcodes.r8(pc + 1), 7), ((opcodes.r8(pc + 1) & 0x7f) << 8) | opcodes.r8(pc + 2), opcodes.r8(pc + 3)); + return 4 | SUPPORTED; + + case 0xc7: + util::stream_format(stream, "vsu-vue.%d %04x = %02x", BIT(opcodes.r8(pc + 1), 7), ((opcodes.r8(pc + 1) & 0x7f) << 8) | opcodes.r8(pc + 2), opcodes.r8(pc + 3)); return 4 | SUPPORTED; case 0xc8: - util::stream_format(stream, "x1-010 %04x = %02x", opcodes.r8(pc+2) | (opcodes.r8(pc+1) << 8), opcodes.r8(pc+3)); + util::stream_format(stream, "x1-010.%d %04x = %02x", BIT(opcodes.r8(pc + 1), 7), ((opcodes.r8(pc + 1) & 0x7f) << 8) | opcodes.r8(pc + 2), opcodes.r8(pc + 3)); return 4 | SUPPORTED; case 0xd0: - util::stream_format(stream, "ymf278b r%02x.%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2), opcodes.r8(pc+3)); + util::stream_format(stream, "ymf278b.%d r%02x.%02x = %02x", BIT(opcodes.r8(pc + 1), 7), opcodes.r8(pc + 1) & 0x7f, opcodes.r8(pc + 2), opcodes.r8(pc + 3)); return 4 | SUPPORTED; case 0xd1: - util::stream_format(stream, "ymf271 r%02x.%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2), opcodes.r8(pc+3)); + util::stream_format(stream, "ymf271.%d r%02x.%02x = %02x", BIT(opcodes.r8(pc + 1), 7), opcodes.r8(pc + 1), opcodes.r8(pc + 2), opcodes.r8(pc + 3)); return 4 | SUPPORTED; case 0xd2: - util::stream_format(stream, "scc1 r%02x.%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2), opcodes.r8(pc+3)); + util::stream_format(stream, "scc1.%d r%02x.%02x = %02x", BIT(opcodes.r8(pc + 1), 7), opcodes.r8(pc + 1) & 0x7f, opcodes.r8(pc + 2), opcodes.r8(pc + 3)); return 4 | SUPPORTED; case 0xd3: - util::stream_format(stream, "k054539 r%02x.%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2), opcodes.r8(pc+3)); + util::stream_format(stream, "k054539.%d r%02x.%02x = %02x", BIT(opcodes.r8(pc + 1), 7), opcodes.r8(pc + 1) & 0x7f, opcodes.r8(pc + 2), opcodes.r8(pc + 3)); return 4 | SUPPORTED; case 0xd4: - util::stream_format(stream, "c140 r%02x.%02x = %02x", opcodes.r8(pc+1), opcodes.r8(pc+2), opcodes.r8(pc+3)); + util::stream_format(stream, "c140.%d r%02x.%02x = %02x", BIT(opcodes.r8(pc + 1), 7), opcodes.r8(pc + 1) & 0x7f, opcodes.r8(pc + 2), opcodes.r8(pc + 3)); return 4 | SUPPORTED; - case 0xe0: { - uint32_t off = opcodes.r8(pc+1) | (opcodes.r8(pc+2) << 8) | (opcodes.r8(pc+3) << 16) | (opcodes.r8(pc+4) << 24); + case 0xd5: + util::stream_format(stream, "ess5503.%d r%02x.%02x = %02x", BIT(opcodes.r8(pc + 1), 7), opcodes.r8(pc + 1) & 0x7f, opcodes.r8(pc + 2), opcodes.r8(pc + 3)); + return 4 | SUPPORTED; + + case 0xd6: + util::stream_format(stream, "ess5505.%d r%02x.%02x = %02x", BIT(opcodes.r8(pc + 1), 7), opcodes.r8(pc + 1) & 0x7f, opcodes.r8(pc + 2), opcodes.r8(pc + 3)); + return 4 | SUPPORTED; + + case 0xe0: + { + uint32_t off = opcodes.r8(pc + 1) | (opcodes.r8(pc + 2) << 8) | (opcodes.r8(pc + 3) << 16) | (opcodes.r8(pc + 4) << 24); util::stream_format(stream, "ym2612 offset = %x", off); return 5 | SUPPORTED; } - case 0xe1: { - uint16_t addr = (opcodes.r8(pc+1) << 8) | opcodes.r8(pc+2); - uint16_t data = (opcodes.r8(pc+3) << 8) | opcodes.r8(pc+4); + case 0xe1: + { + uint16_t addr = (opcodes.r8(pc + 1) << 8) | opcodes.r8(pc + 2); + uint16_t data = (opcodes.r8(pc + 3) << 8) | opcodes.r8(pc + 4); util::stream_format(stream, "c352 r%04x = %04x", addr, data); return 5 | SUPPORTED; } @@ -1261,9 +1938,9 @@ offs_t vgmplay_disassembler::disassemble(std::ostream &stream, offs_t pc, const uint8_t vgmplay_device::rom_r(int chip, uint8_t type, offs_t offset) { - for(const auto &b : m_rom_blocks[chip][type - 0x80]) + for (const auto &b : m_rom_blocks[chip][type - 0x80]) { - if(offset >= b.start_address && offset <= b.end_address) + if (offset >= b.start_address && offset <= b.end_address) { return b.data[offset - b.start_address]; } @@ -1271,19 +1948,28 @@ uint8_t vgmplay_device::rom_r(int chip, uint8_t type, offs_t offset) return 0; } +template<int Chip> READ8_MEMBER(vgmplay_device::segapcm_rom_r) { - return rom_r(0, 0x80, offset); + return rom_r(Chip, 0x80, offset); } +template<int Chip> +READ8_MEMBER(vgmplay_device::ymf278b_rom_r) +{ + return rom_r(Chip, 0x84, offset); +} + +template<int Chip> READ8_MEMBER(vgmplay_device::ymf271_rom_r) { - return rom_r(0, 0x85, offset); + return rom_r(Chip, 0x85, offset); } +template<int Chip> READ8_MEMBER(vgmplay_device::ymz280b_rom_r) { - return rom_r(0, 0x86, offset); + return rom_r(Chip, 0x86, offset); } template<int Chip> @@ -1341,29 +2027,46 @@ READ8_MEMBER(vgmplay_device::k054539_rom_r) return rom_r(Chip, 0x8c, offset); } +template<int Chip> +READ8_MEMBER(vgmplay_device::c140_rom_r) +{ + return rom_r(Chip, 0x8d, offset); +} + +template<int Chip> READ8_MEMBER(vgmplay_device::k053260_rom_r) { - return rom_r(0, 0x8e, offset); + return rom_r(Chip, 0x8e, offset); } +template<int Chip> READ8_MEMBER(vgmplay_device::qsound_rom_r) { - return rom_r(0, 0x8f, offset); + return rom_r(Chip, 0x8f, offset); } +template<int Chip> +READ8_MEMBER(vgmplay_device::es5505_rom_r) +{ + return rom_r(Chip, 0x90, offset); +} + +template<int Chip> READ8_MEMBER(vgmplay_device::x1_010_rom_r) { - return rom_r(0, 0x91, offset); + return rom_r(Chip, 0x91, offset); } +template<int Chip> READ8_MEMBER(vgmplay_device::c352_rom_r) { - return rom_r(0, 0x92, offset); + return rom_r(Chip, 0x92, offset); } +template<int Chip> READ8_MEMBER(vgmplay_device::ga20_rom_r) { - return rom_r(0, 0x93, offset); + return rom_r(Chip, 0x93, offset); } vgmplay_state::vgmplay_state(const machine_config &mconfig, device_type type, const char *tag) @@ -1371,64 +2074,100 @@ vgmplay_state::vgmplay_state(const machine_config &mconfig, device_type type, co , m_vgmplay(*this, "vgmplay") , m_lspeaker(*this, "lspeaker") , m_rspeaker(*this, "rspeaker") - , m_ym2612(*this, "ym2612") - , m_ym2151(*this, "ym2151") - , m_ym2413(*this, "ym2413") - , m_ym2203(*this, "ym2203%c", 'a') - , m_ym3526(*this, "ym3526") - , m_ym3812(*this, "ym3812") - , m_ay8910(*this, "ay8910%c", 'a') - , m_sn76496(*this, "sn76496") - , m_segapcm(*this, "segapcm") - , m_multipcm(*this, "multipcm%c", 'a') - , m_dmg(*this, "dmg") - , m_nescpu(*this, "nescpu") - , m_nesram(*this, "nesapu_ram") - , m_k053260(*this, "k053260") - , m_k054539(*this, "k054539%c", 'a') - , m_c6280(*this, "c6280") - , m_h6280(*this, "h6280") - , m_pokey(*this, "pokey%c", 'a') - , m_c352(*this, "c352") - , m_okim6295(*this, "okim6295%c", 'a') - , m_ymf271(*this, "ymf271") - , m_ymz280b(*this, "ymz280b") - , m_ym2608(*this, "ym2608") - , m_qsound(*this, "qsound") - , m_k051649(*this, "k051649") - , m_ga20(*this, "ga20") + , m_sn76496(*this, "sn76496.%d", 0) + , m_ym2413(*this, "ym2413.%d", 0) + , m_ym2612(*this, "ym2612.%d", 0) + , m_ym2151(*this, "ym2151.%d", 0) + , m_segapcm(*this, "segapcm.%d", 0) , m_rf5c68(*this, "rf5c68") + , m_ym2203(*this, "ym2203.%d", 0) + , m_ym2608(*this, "ym2608.%d", 0) + , m_ym2610(*this, "ym2610.%d", 0) + , m_ym3812(*this, "ym3812.%d", 0) + , m_ym3526(*this, "ym3526.%d", 0) + , m_y8950(*this, "y8950.%d", 0) + , m_ymf262(*this, "ymf262.%d", 0) + , m_ymf278b(*this, "ymf278b.%d", 0) + , m_ymf271(*this, "ymf271.%d", 0) + , m_ymz280b(*this, "ymz280b.%d", 0) , m_rf5c164(*this, "rf5c164") - , m_rf5c68_ram(*this, "rf5c68_ram") - , m_rf5c164_ram(*this, "rf5c164_ram") - , m_x1_010(*this, "x1_010") + , m_sega32x(*this, "sega32x") + , m_ay8910(*this, "ay8910.%d", 0) + , m_dmg(*this, "dmg.%d", 0) + , m_nescpu(*this, "nescpu.%d", 0) + , m_multipcm(*this, "multipcm.%d", 0) + , m_upd7759(*this, "upd7759.%d", 0) + , m_okim6258(*this, "okim6258.%d", 0) + , m_okim6295(*this, "okim6295.%d", 0) + , m_k051649(*this, "k051649.%d", 0) + , m_k054539(*this, "k054539.%d", 0) + , m_huc6280(*this, "huc6280.%d", 0) + , m_c140(*this, "c140.%d", 0) + , m_k053260(*this, "k053260.%d", 0) + , m_pokey(*this, "pokey.%d", 0) + , m_qsound(*this, "qsound") + , m_scsp(*this, "scsp.%d", 0) + , m_wswan(*this, "wswan.%d", 0) + , m_vsu_vue(*this, "vsu_vue.%d", 0) + , m_saa1099(*this, "saa1099.%d", 0) + , m_es5503(*this, "es5503.%d", 0) + , m_es5505(*this, "es5505.%d", 0) + , m_x1_010(*this, "x1_010.%d", 0) + , m_c352(*this, "c352.%d", 0) + , m_ga20(*this, "ga20.%d", 0) { } uint32_t vgmplay_state::r32(int off) const { - if(off + 3 < int(m_file_data.size())) - return m_file_data[off] | (m_file_data[off+1] << 8) | (m_file_data[off+2] << 16) | (m_file_data[off+3] << 24); + if (off + 3 < int(m_file_data.size())) + return m_file_data[off] | (m_file_data[off + 1] << 8) | (m_file_data[off + 2] << 16) | (m_file_data[off + 3] << 24); return 0; } uint8_t vgmplay_state::r8(int off) const { - if(off < int(m_file_data.size())) + if (off < int(m_file_data.size())) return m_file_data[off]; return 0; } +static const ay8910_device::psg_type_t vgm_ay8910_type(uint8_t vgm_type) +{ + return (vgm_type & 0x10) ? ay8910_device::PSG_TYPE_YM : ay8910_device::PSG_TYPE_AY; +} + +static const uint8_t vgm_ay8910_flags(uint8_t vgm_flags) +{ + uint8_t flags = 0; + if (vgm_flags & 1) flags |= AY8910_LEGACY_OUTPUT; + if (vgm_flags & 2) flags |= AY8910_SINGLE_OUTPUT; + if (vgm_flags & 4) flags |= AY8910_DISCRETE_OUTPUT; + return flags; +} + +static const c140_device::C140_TYPE c140_bank_type(uint8_t vgm_type) +{ + switch (vgm_type) + { + case 0: + default: + return c140_device::C140_TYPE::SYSTEM2; + case 1: + return c140_device::C140_TYPE::SYSTEM21; + case 2: + return c140_device::C140_TYPE::ASIC219; + } +} + QUICKLOAD_LOAD_MEMBER(vgmplay_state, load_file) { - // Disable executing devices if not required - m_pokey[0]->set_unscaled_clock(0); - m_pokey[1]->set_unscaled_clock(0); - m_qsound->set_unscaled_clock(0); + m_vgmplay->stop(); m_file_data.resize(quickload_size); - if (image.fread(&m_file_data[0], quickload_size) != quickload_size) + if (!quickload_size || + image.fread(&m_file_data[0], quickload_size) != quickload_size) { m_file_data.clear(); return image_init_result::FAIL; @@ -1436,7 +2175,8 @@ QUICKLOAD_LOAD_MEMBER(vgmplay_state, load_file) else { // Decompress gzip-compressed files (aka vgz) - if(m_file_data[0] == 0x1f && m_file_data[1] == 0x8b) { + if(m_file_data[0] == 0x1f && m_file_data[1] == 0x8b) + { std::vector<uint8_t> decomp; int bs = m_file_data.size(); decomp.resize(2*bs); @@ -1450,19 +2190,23 @@ QUICKLOAD_LOAD_MEMBER(vgmplay_state, load_file) str.total_in = 0; str.total_out = 0; int err = inflateInit2(&str, 31); - if(err != Z_OK) { + if(err != Z_OK) + { logerror("gzip header but not a gzip file\n"); m_file_data.clear(); return image_init_result::FAIL; } - do { + do + { if(str.total_out >= decomp.size()) decomp.resize(decomp.size() + bs); str.next_out = &decomp[str.total_out]; str.avail_out = decomp.size() - str.total_out; err = inflate(&str, Z_SYNC_FLUSH); } while(err == Z_OK); - if(err != Z_STREAM_END) { + + if(err != Z_STREAM_END) + { logerror("broken gzip file\n"); m_file_data.clear(); return image_init_result::FAIL; @@ -1471,7 +2215,8 @@ QUICKLOAD_LOAD_MEMBER(vgmplay_state, load_file) memcpy(&m_file_data[0], &decomp[0], str.total_out); } - if(m_file_data.size() < 0x40 || r32(0) != 0x206d6756) { + if(m_file_data.size() < 0x40 || r32(0) != 0x206d6756) + { logerror("Not a vgm/vgz file\n"); m_file_data.clear(); return image_init_result::FAIL; @@ -1480,203 +2225,201 @@ QUICKLOAD_LOAD_MEMBER(vgmplay_state, load_file) uint32_t version = r32(8); logerror("File version %x.%02x\n", version >> 8, version & 0xff); - uint32_t header_size = 0; - if(version < 0x151) - header_size = 0x40; - else if(version < 0x161) - header_size = 0x80; - else if(version < 0x171) - header_size = 0xc0; - else - header_size = 0x100; - logerror("Header size according to version is %x, header size according to header is %x\n", header_size, r32(0x34) + 0x34); - - uint32_t data_start = header_size; - if (version >= 0x150 && r32(0x34)) - data_start = r32(0x34) + 0x34; + uint32_t data_start = version >= 0x150 ? r32(0x34) + 0x34 : 0x40; + uint32_t extra_header_start = version >= 0x170 && data_start >= 0xc0 && r32(0xbc) ? r32(0xbc) + 0xbc : 0; + uint32_t header_size = extra_header_start ? extra_header_start : data_start; // Parse clocks - if(r32(0x0c)) - m_sn76496->set_unscaled_clock(r32(0x0c)); - if(r32(0x10)) - m_ym2413->set_unscaled_clock(r32(0x10)); - if(version >= 0x110 && r32(0x2c)) - m_ym2612->set_unscaled_clock(r32(0x2c)); - if(version >= 0x110 && r32(0x30)) - m_ym2151->set_unscaled_clock(r32(0x30)); - - if(version >= 0x151 && r32(0x38)) - m_segapcm->set_unscaled_clock(r32(0x38)); - - if(version >= 0x151 && r32(0x3c)) - m_segapcm->set_bank(r32(0x3c)); - - if (data_start > 0x40) + m_sn76496[0]->set_unscaled_clock(r32(0x0c) & ~0xc0000000); + m_sn76496[1]->set_unscaled_clock((r32(0x0c) & 0x40000000) ? r32(0x0c) & ~0xc0000000 : 0); + + if (r32(0x0c) & 0x80000000) + logerror("Warning: file requests an unsupported T6W28"); + + m_ym2413[0]->set_unscaled_clock(r32(0x10) & ~0x40000000); + m_ym2413[1]->set_unscaled_clock((r32(0x10) & 0x40000000) ? r32(0x10) & ~0x40000000 : 0); + + m_ym2612[0]->set_unscaled_clock((version >= 0x110 ? r32(0x2c) : r32(0x10)) & ~0xc0000000); + m_ym2612[1]->set_unscaled_clock(((version >= 0x110 ? r32(0x2c) : r32(0x10)) & 0x40000000) ? (version >= 0x110 ? r32(0x2c) : r32(0x10)) & ~0xc0000000 : 0); + if (version >= 0x110 && (r32(0x2c) & 0x80000000)) + logerror("Warning: file requests an unsupported YM3438\n"); + + m_ym2151[0]->set_unscaled_clock((version >= 0x110 ? r32(0x30) : r32(0x10)) & ~0x40000000); + m_ym2151[1]->set_unscaled_clock(((version >= 0x110 ? r32(0x30) : r32(0x10)) & 0x40000000) ? (version >= 0x110 ? r32(0x30) : r32(0x10)) & ~0x40000000 : 0); + + m_segapcm[0]->set_unscaled_clock(version >= 0x151 && header_size >= 0x3c ? r32(0x38) & ~0x40000000 : 0); + m_segapcm[1]->set_unscaled_clock(version >= 0x151 && header_size >= 0x3c && (r32(0x38) & 0x40000000) ? r32(0x38) & ~0x40000000 : 0); + m_segapcm[0]->set_bank(version >= 0x151 && header_size >= 0x40 ? r32(0x3c) : 0); + m_segapcm[1]->set_bank(version >= 0x151 && header_size >= 0x40 ? r32(0x3c) : 0); + + m_rf5c68->set_unscaled_clock(version >= 0x151 && header_size >= 0x44 ? r32(0x40) : 0); + m_ym2203[0]->set_unscaled_clock(version >= 0x151 && header_size >= 0x48 ? r32(0x44) & ~0x40000000 : 0); + m_ym2203[1]->set_unscaled_clock(version >= 0x151 && header_size >= 0x48 && (r32(0x44) & 0x40000000) ? r32(0x44) & ~0x40000000 : 0); + m_ym2608[0]->set_unscaled_clock(version >= 0x151 && header_size >= 0x4c ? r32(0x48) & ~0x40000000 : 0); + m_ym2608[1]->set_unscaled_clock(version >= 0x151 && header_size >= 0x4c && (r32(0x48) & 0x40000000) ? r32(0x48) & ~0x40000000 : 0); + + m_ym2610[0]->set_unscaled_clock(version >= 0x151 && header_size >= 0x50 ? r32(0x4c) & ~0xc0000000 : 0); + m_ym2610[1]->set_unscaled_clock(version >= 0x151 && header_size >= 0x50 && (r32(0x4c) & 0x40000000) ? r32(0x4c) & ~0xc0000000 : 0); + if (version >= 0x151 && header_size >= 0x50 && (r32(0x4c) & 0x80000000)) + logerror("Warning: file requests an unsupported YM2610B\n"); + + m_ym3812[0]->set_unscaled_clock(version >= 0x151 && header_size >= 0x54 ? r32(0x50) & ~0xc0000000 : 0); + m_ym3812[1]->set_unscaled_clock(version >= 0x151 && header_size >= 0x54 && (r32(0x50) & 0x40000000) ? r32(0x50) & ~0xc0000000 : 0); + if (version >= 0x151 && header_size >= 0x54 && (r32(0x50) & 0x80000000)) + logerror("Warning: file requests an unsupported SoundBlaster Pro\n"); + + m_ym3526[0]->set_unscaled_clock(version >= 0x151 && header_size >= 0x58 ? r32(0x54) & ~0x40000000 : 0); + m_ym3526[1]->set_unscaled_clock(version >= 0x151 && header_size >= 0x58 && (r32(0x54) & 0x40000000) ? r32(0x54) & ~0x40000000 : 0); + m_y8950[0]->set_unscaled_clock(version >= 0x151 && header_size >= 0x5c ? r32(0x58) & ~0x40000000 : 0); + m_y8950[1]->set_unscaled_clock(version >= 0x151 && header_size >= 0x5c && (r32(0x58) & 0x40000000) ? r32(0x58) & ~0x40000000 : 0); + m_ymf262[0]->set_unscaled_clock(version >= 0x151 && header_size >= 0x60 ? r32(0x5c) & ~0x40000000 : 0); + m_ymf262[1]->set_unscaled_clock(version >= 0x151 && header_size >= 0x60 && (r32(0x5c) & 0x40000000) ? r32(0x5c) & ~0x40000000 : 0); + m_ymf278b[0]->set_unscaled_clock(version >= 0x151 && header_size >= 0x64 ? r32(0x60) & ~0x40000000 : 0); + m_ymf278b[1]->set_unscaled_clock(version >= 0x151 && header_size >= 0x64 && r32(0x60) & 0x40000000 ? r32(0x60) & ~0x40000000 : 0); + m_ymf271[0]->set_unscaled_clock(version >= 0x151 && header_size >= 0x68 ? r32(0x64) & ~0x40000000 : 0); + m_ymf271[1]->set_unscaled_clock(version >= 0x151 && header_size >= 0x68 && r32(0x64) & 0x40000000 ? r32(0x64) & ~0x40000000 : 0); + m_ymz280b[0]->set_unscaled_clock(version >= 0x151 && header_size >= 0x6c ? r32(0x68) & ~0x40000000 : 0); + m_ymz280b[1]->set_unscaled_clock(version >= 0x151 && header_size >= 0x6c && r32(0x68) & 0x40000000 ? r32(0x68) & ~0x40000000 : 0); + + m_rf5c164->set_unscaled_clock(version >= 0x151 && header_size >= 0x70 ? r32(0x6c) : 0); + + m_sega32x->set_unscaled_clock(version >= 0x151 && header_size >= 0x74 && r32(0x70) ? r32(0x70) : 0); + + m_ay8910[0]->set_unscaled_clock(version >= 0x151 && header_size >= 0x78 ? r32(0x74) & ~0x40000000 : 0); + m_ay8910[1]->set_unscaled_clock(version >= 0x151 && header_size >= 0x78 && (r32(0x74) & 0x40000000) ? r32(0x74) & ~0x40000000 : 0); + m_ay8910[0]->set_psg_type(vgm_ay8910_type(version >= 0x151 && header_size >= 0x7c ? r8(0x78) : 0)); + m_ay8910[1]->set_psg_type(vgm_ay8910_type(version >= 0x151 && header_size >= 0x7c ? r8(0x78) : 0)); + m_ay8910[0]->set_flags(vgm_ay8910_flags(version >= 0x151 && header_size >= 0x7a ? r8(0x79) : 0)); + m_ay8910[1]->set_flags(vgm_ay8910_flags(version >= 0x151 && header_size >= 0x7a ? r8(0x79) : 0)); + m_ym2203[0]->set_flags(vgm_ay8910_flags(version >= 0x151 && header_size >= 0x7b ? r8(0x7a) : 0)); + m_ym2203[1]->set_flags(vgm_ay8910_flags(version >= 0x151 && header_size >= 0x7b ? r8(0x7a) : 0)); + m_ym2608[0]->set_flags(vgm_ay8910_flags(version >= 0x151 && header_size >= 0x7c ? r8(0x7b) : 0)); + m_ym2608[1]->set_flags(vgm_ay8910_flags(version >= 0x151 && header_size >= 0x7c ? r8(0x7b) : 0)); + + m_dmg[0]->set_unscaled_clock(version >= 0x161 && header_size >= 0x84 ? r32(0x80) & ~0x40000000 : 0); + m_dmg[1]->set_unscaled_clock(version >= 0x161 && header_size >= 0x84 && (r32(0x80) & 0x40000000) ? r32(0x80) & ~0x40000000 : 0); + m_nescpu[0]->set_unscaled_clock(version >= 0x161 && header_size >= 0x88 ? r32(0x84) & ~0xc0000000 : 0); + m_nescpu[1]->set_unscaled_clock(version >= 0x161 && header_size >= 0x88 && (r32(0x84) & 0x40000000) ? r32(0x84) & ~0xc0000000 : 0); + if (version >= 0x161 && header_size >= 0x88 && (r32(0x84) & 0x80000000)) + logerror("Warning: file requests an unsupported FDS sound addon\n"); + + m_multipcm[0]->set_unscaled_clock(version >= 0x161 && header_size >= 0x8c ? r32(0x88) & ~0x40000000 : 0); + m_multipcm[1]->set_unscaled_clock(version >= 0x161 && header_size >= 0x8c && (r32(0x88) & 0x40000000) ? r32(0x88) & ~0x40000000 : 0); + m_upd7759[0]->set_unscaled_clock(version >= 0x161 && header_size >= 0x90 ? r32(0x8c) & ~0x40000000 : 0); + m_upd7759[1]->set_unscaled_clock(version >= 0x161 && header_size >= 0x90 && (r32(0x8c) & 0x40000000) ? r32(0x8c) & ~0x40000000 : 0); + m_okim6258[0]->set_unscaled_clock(version >= 0x161 && header_size >= 0x94 ? r32(0x90) & ~0x40000000 : 0); + m_okim6258[1]->set_unscaled_clock(version >= 0x161 && header_size >= 0x94 && (r32(0x90) & 0x40000000) ? r32(0x90) & ~0x40000000 : 0); + + uint8_t oki6258_flags = version >= 0x161 && header_size >= 0x95 ? r8(0x94) : 0; + m_okim6258[0]->set_divider(oki6258_flags & 3); + m_okim6258[0]->set_outbits(BIT(oki6258_flags, 3) ? 12 : 10); + m_okim6258[0]->set_type(BIT(oki6258_flags, 2)); + m_okim6258[1]->set_divider(oki6258_flags & 3); + m_okim6258[1]->set_outbits(BIT(oki6258_flags, 3) ? 12 : 10); + m_okim6258[1]->set_type(BIT(oki6258_flags, 2)); + + m_k054539[0]->init_flags(version >= 0x161 && header_size >= 0x96 ? r8(0x95) : 0); + m_k054539[1]->init_flags(version >= 0x161 && header_size >= 0x96 ? r8(0x95) : 0); + + m_c140[0]->set_bank_type(c140_bank_type(version >= 0x161 && header_size >= 0x96 ? r8(0x96) : 0)); + m_c140[1]->set_bank_type(c140_bank_type(version >= 0x161 && header_size >= 0x96 ? r8(0x96) : 0)); + + m_okim6295_clock[0] = version >= 0x161 && header_size >= 0x9c ? r32(0x98) & ~0xc0000000 : 0; + m_okim6295_clock[1] = version >= 0x161 && header_size >= 0x9c && (r32(0x98) & 0x40000000) ? r32(0x98) & ~0xc0000000 : 0; + m_okim6295[0]->set_unscaled_clock(m_okim6295_clock[0]); + m_okim6295[1]->set_unscaled_clock(m_okim6295_clock[1]); + + m_okim6295_pin7[0] = version >= 0x161 && header_size >= 0x9c && (r32(0x98) & 0x80000000) ? 1 : 0; + m_okim6295_pin7[1] = version >= 0x161 && header_size >= 0x9c && (r32(0x98) & 0x40000000) && (r32(0x98) & 0x80000000) ? 1 : 0; + m_okim6295[0]->set_pin7(m_okim6295_pin7[0] ? okim6295_device::PIN7_HIGH : okim6295_device::PIN7_LOW); + m_okim6295[1]->set_pin7(m_okim6295_pin7[1] ? okim6295_device::PIN7_HIGH : okim6295_device::PIN7_LOW); + + m_k051649[0]->set_unscaled_clock(version >= 0x161 && header_size >= 0xa0 ? r32(0x9c) & ~0xc0000000 : 0); + m_k051649[1]->set_unscaled_clock(version >= 0x161 && header_size >= 0xa0 && (r32(0x9c) & 0x40000000) ? r32(0x9c) & ~0xc0000000 : 0); + if (version >= 0x161 && header_size >= 0xa0 && (r32(0x9c) & 0x80000000)) + logerror("Warning: file requests an unsupported Konami SCC\n"); + + // HACK: Some VGMs contain 48,000 instead of 18,432,000 + if (version >= 0x161 && header_size >= 0xa4 && (r32(0xa0) & ~0x40000000) == 48000) { - if(version >= 0x151 && r32(0x40)) - m_rf5c68->set_unscaled_clock(r32(0x40)); - if(version >= 0x151 && r32(0x44)) { - uint32_t clock = r32(0x44); - m_ym2203[0]->set_unscaled_clock(clock & ~0x40000000); - if (clock & 0x40000000) - { - clock &= ~0x40000000; - m_ym2203[1]->set_unscaled_clock(clock); - } - } - if(version >= 0x151 && r32(0x48)) - m_ym2608->set_unscaled_clock(r32(0x48)); - if(version >= 0x151 && r32(0x4c)) - logerror("Warning: file requests an unsupported %s\n", r32(0x4c) & 0x80000000 ? "YM2610B" : "YM2610"); - if(version >= 0x151 && r32(0x50)) { - m_ym3812->set_unscaled_clock(r32(0x50)); - } - if(version >= 0x151 && r32(0x54)) { - m_ym3526->set_unscaled_clock(r32(0x54)); - } - if(version >= 0x151 && r32(0x58)) - logerror("Warning: file requests an unsupported Y8950\n"); - if(version >= 0x151 && r32(0x5c)) - logerror("Warning: file requests an unsupported YMF262\n"); - if(version >= 0x151 && r32(0x60)) - logerror("Warning: file requests an unsupported YMF278B\n"); - if(version >= 0x151 && r32(0x64)) { - m_ymf271->set_unscaled_clock(r32(0x64)); - } - if(version >= 0x151 && r32(0x68)) { - m_ymz280b->set_unscaled_clock(r32(0x68)); - } - if(version >= 0x151 && r32(0x6c)) - m_rf5c164->set_unscaled_clock(r32(0x6c)); - if(version >= 0x151 && r32(0x70)) - logerror("Warning: file requests an unsupported PWM\n"); - if(version >= 0x151 && r32(0x74)) { - uint32_t clock = r32(0x74); - m_ay8910[0]->set_unscaled_clock(clock & ~0x40000000); - if (clock & 0x40000000) { - clock &= ~0x40000000; - m_ay8910[1]->set_unscaled_clock(clock); - } - } - if(version >= 0x151 && r8(0x78)) { - uint8_t type = r8(0x78); - if (type & 0x10) - { - m_ay8910[0]->set_psg_type(ay8910_device::PSG_TYPE_YM); - m_ay8910[1]->set_psg_type(ay8910_device::PSG_TYPE_YM); - } - } - if(version >= 0x151 && r8(0x79)) { - uint8_t flags = r8(0x79); - uint8_t to_set = 0; - if (flags & 1) - to_set |= AY8910_LEGACY_OUTPUT; - if (flags & 2) - to_set |= AY8910_SINGLE_OUTPUT; - if (flags & 4) - to_set |= AY8910_DISCRETE_OUTPUT; - m_ay8910[0]->set_flags(to_set); - m_ay8910[1]->set_flags(to_set); - } - if(version >= 0x151 && r8(0x7a)) { - uint8_t flags = r8(0x7a); - uint8_t to_set = 0; - if (flags & 1) - to_set |= AY8910_LEGACY_OUTPUT; - if (flags & 2) - to_set |= AY8910_SINGLE_OUTPUT; - if (flags & 4) - to_set |= AY8910_DISCRETE_OUTPUT; - m_ym2203[0]->set_flags(to_set); - m_ym2203[1]->set_flags(to_set); - } + m_k054539[0]->set_clock_scale(384); + m_k054539[1]->set_clock_scale(384); } - if (data_start > 0x80) - { - if(version >= 0x161 && r32(0x80)) { - m_dmg->set_unscaled_clock(r32(0x80)); - } - if(version >= 0x161 && r32(0x84)) { - m_nescpu->set_unscaled_clock(r32(0x84)); - m_nescpu->m_apu->set_unscaled_clock(r32(0x84)); - } - if(version >= 0x161 && r32(0x88)) { - uint32_t clock = r32(0x88); - m_multipcm[0]->set_unscaled_clock(clock & ~0x40000000); - if (clock & 0x40000000) { - clock &= ~0x40000000; - m_multipcm[1]->set_unscaled_clock(clock); - } - } - if(version >= 0x161 && r8(0x95)) { - m_k054539[0]->init_flags(r8(0x95)); - m_k054539[1]->init_flags(r8(0x95)); - } - if(version >= 0x161 && r32(0x98)) { - m_okim6295_clock[0] = r32(0x98); - m_okim6295_pin7[0] = 0; - if (m_okim6295_clock[0] & 0x80000000) { - m_okim6295_clock[0] &= ~0x80000000; - m_okim6295_pin7[0] = 1; - } - m_okim6295[0]->config_pin7(m_okim6295_pin7[0] ? okim6295_device::PIN7_HIGH : okim6295_device::PIN7_LOW); // FIXME: no guarantee this device hasn't started yet - may be better to wait for it to start then use set_pin7 - m_okim6295[0]->set_unscaled_clock(m_okim6295_clock[0] & ~0xc0000000); - if (m_okim6295_clock[0] & 0x40000000) { - m_okim6295_clock[0] &= ~0x40000000; - m_okim6295_clock[1] = m_okim6295_clock[0]; - m_okim6295_pin7[1] = m_okim6295_pin7[0]; - m_okim6295[1]->config_pin7(m_okim6295_pin7[1] ? okim6295_device::PIN7_HIGH : okim6295_device::PIN7_LOW); // FIXME: no guarantee this device hasn't started yet - may be better to wait for it to start then use set_pin7 - m_okim6295[1]->set_unscaled_clock(m_okim6295_clock[1]); - } - } - if(version >= 0x161 && r32(0x9c)) { - m_k051649->set_unscaled_clock(r32(0x9c)); - } - if(version >= 0x161 && r32(0xa0)) { - uint32_t clock = r32(0xa0); - m_k054539[0]->set_unscaled_clock(clock & ~0x40000000); - if (clock & 0x40000000) { - clock &= ~0x40000000; - m_k054539[1]->set_unscaled_clock(clock); - } - } - if(version >= 0x161 && r32(0xac)) { - m_k053260->set_unscaled_clock(r32(0xac)); - } - if(version >= 0x161 && r32(0xa4)) { - m_c6280->set_unscaled_clock(r32(0xa4)); - } - if(version >= 0x161 && r32(0xb0)) { - uint32_t clock = r32(0xb0); - m_pokey[0]->set_unscaled_clock(clock & ~0x40000000); - if (clock & 0x40000000) { - clock &= ~0x40000000; - m_pokey[1]->set_unscaled_clock(clock); - } - } - if(version >= 0x161 && r32(0xb4)) { - m_qsound->set_unscaled_clock(r32(0xb4) * 15); // * 15 multipler for correct pitch - } - } + m_k054539[0]->set_unscaled_clock(version >= 0x161 && header_size >= 0xa4 ? r32(0xa0) & ~0x40000000 : 0); + m_k054539[1]->set_unscaled_clock(version >= 0x161 && header_size >= 0xa4 && (r32(0xa0) & 0x40000000) ? r32(0xa0) & ~0x40000000 : 0); - if (data_start > 0xc0) - { - if(version >= 0x171 && r8(0xd6)) { - m_c352->set_divider(r8(0xd6) * 4); - } - if(version >= 0x171 && r32(0xd8)) { - m_x1_010->set_unscaled_clock(r32(0xd8)); - } - if(version >= 0x171 && r32(0xdc)) { - m_c352->set_unscaled_clock(r32(0xdc)); - } - if(version >= 0x171 && r32(0xe0)) { - m_ga20->set_unscaled_clock(r32(0xe0)); - } - } + // HACK: VGM contain the halved clock speed of the sound core inside the HUC6280 + m_huc6280[0]->set_clock_scale(2); + m_huc6280[1]->set_clock_scale(2); - m_vgmplay->reset(); + m_huc6280[0]->set_unscaled_clock(version >= 0x161 && header_size >= 0xa8 ? r32(0xa4) & ~0x40000000 : 0); + m_huc6280[1]->set_unscaled_clock(version >= 0x161 && header_size >= 0xa8 && (r32(0xa4) & 0x40000000) ? r32(0xa4) & ~0x40000000 : 0); + + m_c140[0]->set_unscaled_clock(version >= 0x161 && header_size >= 0xac ? r32(0xa8) & ~0x40000000 : 0); + m_c140[1]->set_unscaled_clock(version >= 0x161 && header_size >= 0xac && (r32(0xa8) & 0x40000000) ? r32(0xa8) & ~0x40000000 : 0); + + m_k053260[0]->set_unscaled_clock(version >= 0x161 && header_size >= 0xb0 ? r32(0xac) & ~0x40000000 : 0); + m_k053260[1]->set_unscaled_clock(version >= 0x161 && header_size >= 0xb0 && (r32(0xac) & 0x40000000) ? r32(0xac) & ~0x40000000 : 0); + + m_pokey[0]->set_unscaled_clock(version >= 0x161 && header_size >= 0xb4 ? r32(0xb0) & ~0x40000000 : 0); + m_pokey[1]->set_unscaled_clock(version >= 0x161 && header_size >= 0xb4 && (r32(0xb0) & 0x40000000) ? r32(0xb0) & ~0x40000000 : 0); + + // HACK: VGMs contain 4,000,000 instead of 60,000,000 + if (version >= 0x161 && header_size >= 0xb8 && r32(0xb4) == 4000000) + m_qsound->set_clock_scale(15); + + m_qsound->set_unscaled_clock(version >= 0x161 && header_size >= 0xb8 ? r32(0xb4) : 0); + m_scsp[0]->set_unscaled_clock(version >= 0x161 && header_size >= 0xbc ? r32(0xb8) & ~0x40000000 : 0); + m_scsp[1]->set_unscaled_clock(version >= 0x161 && header_size >= 0xbc && (r32(0xb8) & 0x40000000) ? r32(0xb8) & ~0x40000000 : 0); + + if (version >= 0x170 && header_size >= 0xc0 && r32(0xbc)) + logerror("Warning: file requests an unsupported Extra Header\n"); + + m_wswan[0]->set_unscaled_clock(version >= 0x161 && header_size >= 0xc4 ? r32(0xc0) & ~0x40000000 : 0); + m_wswan[1]->set_unscaled_clock(version >= 0x161 && header_size >= 0xc4 && (r32(0xc0) & 0x40000000) ? r32(0xc0) & ~0x40000000 : 0); + + m_vsu_vue[0]->set_unscaled_clock(version >= 0x161 && header_size >= 0xc8 ? r32(0xc4) & ~0x40000000 : 0); + m_vsu_vue[1]->set_unscaled_clock(version >= 0x161 && header_size >= 0xc8 && (r32(0xc4) & 0x40000000) ? r32(0xc4) & ~0x40000000 : 0); + + m_saa1099[0]->set_unscaled_clock(version >= 0x161 && header_size >= 0xcc ? r32(0xc8) & ~0x40000000 : 0); + m_saa1099[1]->set_unscaled_clock(version >= 0x161 && header_size >= 0xcc && (r32(0xc8) & 0x40000000) ? r32(0xc8) & ~0x40000000 : 0); + + m_es5503[0]->set_unscaled_clock(version >= 0x161 && header_size >= 0xd0 ? r32(0xcc) & ~0x40000000 : 0); + m_es5503[1]->set_unscaled_clock(version >= 0x161 && header_size >= 0xd0 && (r32(0xcc) & 0x40000000) ? r32(0xcc) & ~0x40000000 : 0); + + m_es5505[0]->set_unscaled_clock(version >= 0x161 && header_size >= 0xd4 ? r32(0xd0) & ~0x40000000 : 0); + m_es5505[1]->set_unscaled_clock(version >= 0x161 && header_size >= 0xd4 && (r32(0xd0) & 0x40000000) ? r32(0xd0) & ~0x40000000 : 0); + if (version >= 0x171 && header_size >= 0xd4 && r32(0xd0) & 0x80000000) + logerror("Warning: file requests an unsupported ES5506\n"); + + // TODO: dynamically remap es5503/es5505 channels? + //m_es5503[0]->set_channels(version >= 0x171 && header_size >= 0xd5 ? r8(0xd4) : 0); + //m_es5503[1]->set_channels(version >= 0x171 && header_size >= 0xd5 ? r8(0xd4) : 0); + //m_es5505[0]->set_channels(version >= 0x171 && header_size >= 0xd6 ? r8(0xd5) : 0); + //m_es5505[1]->set_channels(version >= 0x171 && header_size >= 0xd6 ? r8(0xd5) : 0); + + m_c352[0]->set_divider(version >= 0x171 && header_size >= 0xd7 && r8(0xd6) ? r8(0xd6) * 4 : 1); + m_c352[1]->set_divider(version >= 0x171 && header_size >= 0xd7 && r8(0xd6) ? r8(0xd6) * 4 : 1); + + m_x1_010[0]->set_unscaled_clock(version >= 0x171 && header_size >= 0xdc ? r32(0xd8) & ~0x40000000 : 0); + m_x1_010[1]->set_unscaled_clock(version >= 0x171 && header_size >= 0xdc && (r32(0xd8) & 0x40000000) ? r32(0xd8) & ~0x40000000 : 0); + + m_c352[0]->set_unscaled_clock(version >= 0x171 && header_size >= 0xe0 ? r32(0xdc) & ~0x40000000 : 0); + m_c352[1]->set_unscaled_clock(version >= 0x171 && header_size >= 0xe0 && (r32(0xdc) & 0x40000000) ? r32(0xdc) & ~0x40000000 : 0); + + m_ga20[0]->set_unscaled_clock(version >= 0x171 && header_size >= 0xe4 ? r32(0xe0) & ~0x40000000 : 0); + m_ga20[1]->set_unscaled_clock(version >= 0x171 && header_size >= 0xe4 && (r32(0xe0) & 0x40000000) ? r32(0xe0) & ~0x40000000 : 0); + + for (device_t &child : subdevices()) + if (child.clock() != 0) + logerror("%s %d\n", child.tag(), child.clock()); + + //for (auto &stream : machine().sound().streams()) + // if (stream->sample_rate() != 0) + // logerror("%s %d\n", stream->device().tag(), stream->sample_rate()); + + machine().schedule_soft_reset(); return image_init_result::PASS; } @@ -1684,7 +2427,7 @@ QUICKLOAD_LOAD_MEMBER(vgmplay_state, load_file) READ8_MEMBER(vgmplay_state::file_r) { - if(offset < m_file_data.size()) + if (offset < m_file_data.size()) return m_file_data[offset]; return 0; } @@ -1692,7 +2435,7 @@ READ8_MEMBER(vgmplay_state::file_r) READ8_MEMBER(vgmplay_state::file_size_r) { uint32_t size = m_file_data.size(); - return size >> (8*offset); + return size >> (8 * offset); } template<int Chip> @@ -1761,33 +2504,34 @@ WRITE8_MEMBER(vgmplay_device::okim6295_nmk112_bank_w) } } +template<int Chip> WRITE8_MEMBER(vgmplay_state::scc_w) { - switch(offset & 1) + switch (offset & 1) { case 0x00: - m_scc_reg = data; + m_scc_reg[Chip] = data; break; case 0x01: - switch(offset >> 1) + switch (offset >> 1) { case 0x00: - m_k051649->k051649_waveform_w(space, m_scc_reg, data); + m_k051649[Chip]->k051649_waveform_w(space, m_scc_reg[Chip], data); break; case 0x01: - m_k051649->k051649_frequency_w(space, m_scc_reg, data); + m_k051649[Chip]->k051649_frequency_w(space, m_scc_reg[Chip], data); break; case 0x02: - m_k051649->k051649_volume_w(space, m_scc_reg, data); + m_k051649[Chip]->k051649_volume_w(space, m_scc_reg[Chip], data); break; case 0x03: - m_k051649->k051649_keyonoff_w(space, m_scc_reg, data); + m_k051649[Chip]->k051649_keyonoff_w(space, m_scc_reg[Chip], data); break; case 0x04: - m_k051649->k052539_waveform_w(space, m_scc_reg, data); + m_k051649[Chip]->k052539_waveform_w(space, m_scc_reg[Chip], data); break; case 0x05: - m_k051649->k051649_test_w(space, m_scc_reg, data); + m_k051649[Chip]->k051649_test_w(space, m_scc_reg[Chip], data); break; } break; @@ -1802,21 +2546,21 @@ INPUT_CHANGED_MEMBER(vgmplay_state::key_pressed) int val = (uint8_t)(uintptr_t)param; switch (val) { - case VGMPLAY_STOP: - m_vgmplay->stop(); - break; - case VGMPLAY_PAUSE: - m_vgmplay->pause(); - break; - case VGMPLAY_PLAY: - m_vgmplay->play(); - break; - case VGMPLAY_RESTART: - m_vgmplay->reset(); - break; - case VGMPLAY_LOOP: - m_vgmplay->toggle_loop(); - break; + case VGMPLAY_STOP: + m_vgmplay->stop(); + break; + case VGMPLAY_PAUSE: + m_vgmplay->pause(); + break; + case VGMPLAY_PLAY: + m_vgmplay->play(); + break; + case VGMPLAY_RESTART: + m_vgmplay->reset(); + break; + case VGMPLAY_LOOP: + m_vgmplay->toggle_loop(); + break; } } @@ -1834,169 +2578,239 @@ void vgmplay_state::file_map(address_map &map) map(0x00000000, 0xffffffff).r(FUNC(vgmplay_state::file_r)); } -void vgmplay_state::soundchips16_map(address_map &map) +void vgmplay_state::soundchips_map(address_map &map) { - map(vgmplay_device::A_C352, vgmplay_device::A_C352+0x7fff).w(m_c352, FUNC(c352_device::write)); + map(vgmplay_device::REG_SIZE, vgmplay_device::REG_SIZE + 3).r(FUNC(vgmplay_state::file_size_r)); + map(vgmplay_device::A_SN76496_0 + 0, vgmplay_device::A_SN76496_0 + 0).w(m_sn76496[0], FUNC(sn76496_device::command_w)); + //map(vgmplay_device::A_SN76496_0 + 1, vgmplay_device::A_SN76496_0 + 1).w(m_sn76496[0], FUNC(sn76496_device::stereo_w)); // TODO: GG stereo + map(vgmplay_device::A_SN76496_1 + 0, vgmplay_device::A_SN76496_1 + 0).w(m_sn76496[1], FUNC(sn76496_device::command_w)); + //map(vgmplay_device::A_SN76496_1 + 1, vgmplay_device::A_SN76496_1 + 1).w(m_sn76496[1], FUNC(sn76496_device::stereo_w)); // TODO: GG stereo + map(vgmplay_device::A_YM2413_0, vgmplay_device::A_YM2413_0 + 1).w(m_ym2413[0], FUNC(ym2413_device::write)); + map(vgmplay_device::A_YM2413_1, vgmplay_device::A_YM2413_1 + 1).w(m_ym2413[1], FUNC(ym2413_device::write)); + map(vgmplay_device::A_YM2612_0, vgmplay_device::A_YM2612_0 + 3).w(m_ym2612[0], FUNC(ym2612_device::write)); + map(vgmplay_device::A_YM2612_1, vgmplay_device::A_YM2612_1 + 3).w(m_ym2612[1], FUNC(ym2612_device::write)); + map(vgmplay_device::A_YM2151_0, vgmplay_device::A_YM2151_0 + 1).w(m_ym2151[0], FUNC(ym2151_device::write)); + map(vgmplay_device::A_YM2151_1, vgmplay_device::A_YM2151_1 + 1).w(m_ym2151[1], FUNC(ym2151_device::write)); + map(vgmplay_device::A_SEGAPCM_0, vgmplay_device::A_SEGAPCM_0 + 0x7ff).w(m_segapcm[0], FUNC(segapcm_device::sega_pcm_w)); + map(vgmplay_device::A_SEGAPCM_1, vgmplay_device::A_SEGAPCM_1 + 0x7ff).w(m_segapcm[1], FUNC(segapcm_device::sega_pcm_w)); + map(vgmplay_device::A_RF5C68, vgmplay_device::A_RF5C68 + 0xf).w(m_rf5c68, FUNC(rf5c68_device::rf5c68_w)); + map(vgmplay_device::A_RF5C68_RAM, vgmplay_device::A_RF5C68_RAM + 0xffff).w(m_rf5c68, FUNC(rf5c68_device::rf5c68_mem_w)); + map(vgmplay_device::A_YM2203_0, vgmplay_device::A_YM2203_0 + 1).w(m_ym2203[0], FUNC(ym2203_device::write)); + map(vgmplay_device::A_YM2203_1, vgmplay_device::A_YM2203_1 + 1).w(m_ym2203[1], FUNC(ym2203_device::write)); + map(vgmplay_device::A_YM2608_0, vgmplay_device::A_YM2608_0 + 0x3).w(m_ym2608[0], FUNC(ym2608_device::write)); + map(vgmplay_device::A_YM2608_1, vgmplay_device::A_YM2608_1 + 0x3).w(m_ym2608[1], FUNC(ym2608_device::write)); + map(vgmplay_device::A_YM2610_0, vgmplay_device::A_YM2610_0 + 0x3).w(m_ym2610[0], FUNC(ym2610_device::write)); + map(vgmplay_device::A_YM2610_1, vgmplay_device::A_YM2610_1 + 0x3).w(m_ym2610[1], FUNC(ym2610_device::write)); + map(vgmplay_device::A_YM3812_0, vgmplay_device::A_YM3812_0 + 1).w(m_ym3812[0], FUNC(ym3812_device::write)); + map(vgmplay_device::A_YM3812_1, vgmplay_device::A_YM3812_1 + 1).w(m_ym3812[1], FUNC(ym3812_device::write)); + map(vgmplay_device::A_YM3526_0, vgmplay_device::A_YM3526_0 + 1).w(m_ym3526[0], FUNC(ym3526_device::write)); + map(vgmplay_device::A_YM3526_1, vgmplay_device::A_YM3526_1 + 1).w(m_ym3526[1], FUNC(ym3526_device::write)); + map(vgmplay_device::A_Y8950_0, vgmplay_device::A_Y8950_0 + 1).w(m_y8950[0], FUNC(y8950_device::write)); + map(vgmplay_device::A_Y8950_1, vgmplay_device::A_Y8950_1 + 1).w(m_y8950[1], FUNC(y8950_device::write)); + map(vgmplay_device::A_YMF262_0, vgmplay_device::A_YMF262_0 + 1).w(m_ymf262[0], FUNC(ymf262_device::write)); + map(vgmplay_device::A_YMF262_1, vgmplay_device::A_YMF262_1 + 1).w(m_ymf262[1], FUNC(ymf262_device::write)); + map(vgmplay_device::A_YMF278B_0, vgmplay_device::A_YMF278B_0 + 0xf).w(m_ymf278b[0], FUNC(ymf278b_device::write)); + map(vgmplay_device::A_YMF278B_1, vgmplay_device::A_YMF278B_1 + 0xf).w(m_ymf278b[1], FUNC(ymf278b_device::write)); + map(vgmplay_device::A_YMF271_0, vgmplay_device::A_YMF271_0 + 0xf).w(m_ymf271[0], FUNC(ymf271_device::write)); + map(vgmplay_device::A_YMF271_1, vgmplay_device::A_YMF271_1 + 0xf).w(m_ymf271[1], FUNC(ymf271_device::write)); + map(vgmplay_device::A_YMZ280B_0, vgmplay_device::A_YMZ280B_0 + 0x1).w(m_ymz280b[0], FUNC(ymz280b_device::write)); + map(vgmplay_device::A_YMZ280B_1, vgmplay_device::A_YMZ280B_1 + 0x1).w(m_ymz280b[1], FUNC(ymz280b_device::write)); + map(vgmplay_device::A_RF5C164, vgmplay_device::A_RF5C164 + 0xf).w(m_rf5c164, FUNC(rf5c68_device::rf5c68_w)); + map(vgmplay_device::A_RF5C164_RAM, vgmplay_device::A_RF5C164_RAM + 0xffff).w(m_rf5c164, FUNC(rf5c68_device::rf5c68_mem_w)); + map(vgmplay_device::A_AY8910_0, vgmplay_device::A_AY8910_0).w(m_ay8910[0], FUNC(ay8910_device::data_w)); + map(vgmplay_device::A_AY8910_0 + 1, vgmplay_device::A_AY8910_0 + 1).w(m_ay8910[0], FUNC(ay8910_device::address_w)); + map(vgmplay_device::A_AY8910_1, vgmplay_device::A_AY8910_1).w(m_ay8910[1], FUNC(ay8910_device::data_w)); + map(vgmplay_device::A_AY8910_1 + 1, vgmplay_device::A_AY8910_1 + 1).w(m_ay8910[1], FUNC(ay8910_device::address_w)); + map(vgmplay_device::A_GAMEBOY_0, vgmplay_device::A_GAMEBOY_0 + 0x16).w(m_dmg[0], FUNC(gameboy_sound_device::sound_w)); + map(vgmplay_device::A_GAMEBOY_0 + 0x20, vgmplay_device::A_GAMEBOY_0 + 0x2f).w(m_dmg[0], FUNC(gameboy_sound_device::wave_w)); + map(vgmplay_device::A_GAMEBOY_1, vgmplay_device::A_GAMEBOY_1 + 0x16).w(m_dmg[1], FUNC(gameboy_sound_device::sound_w)); + map(vgmplay_device::A_GAMEBOY_1 + 0x20, vgmplay_device::A_GAMEBOY_1 + 0x2f).w(m_dmg[1], FUNC(gameboy_sound_device::wave_w)); + map(vgmplay_device::A_NESAPU_0, vgmplay_device::A_NESAPU_0 + 0x1f).w("nescpu.0:nesapu", FUNC(nesapu_device::write)); + map(vgmplay_device::A_NES_RAM_0, vgmplay_device::A_NES_RAM_0 + 0xffff).ram().share("nesapu_ram.0"); + map(vgmplay_device::A_NESAPU_1, vgmplay_device::A_NESAPU_1 + 0x1f).w("nescpu.1:nesapu", FUNC(nesapu_device::write)); + map(vgmplay_device::A_NES_RAM_1, vgmplay_device::A_NES_RAM_1 + 0xffff).ram().share("nesapu_ram.1"); + map(vgmplay_device::A_MULTIPCM_0, vgmplay_device::A_MULTIPCM_0 + 3).w(m_multipcm[0], FUNC(multipcm_device::write)); + map(vgmplay_device::A_MULTIPCM_0 + 4, vgmplay_device::A_MULTIPCM_0 + 7).w("vgmplay", FUNC(vgmplay_device::multipcm_bank_hi_w<0>)); + map(vgmplay_device::A_MULTIPCM_0 + 8, vgmplay_device::A_MULTIPCM_0 + 11).w("vgmplay", FUNC(vgmplay_device::multipcm_bank_lo_w<0>)); + map(vgmplay_device::A_MULTIPCM_1, vgmplay_device::A_MULTIPCM_1 + 3).w(m_multipcm[1], FUNC(multipcm_device::write)); + map(vgmplay_device::A_MULTIPCM_1 + 4, vgmplay_device::A_MULTIPCM_1 + 7).w("vgmplay", FUNC(vgmplay_device::multipcm_bank_hi_w<1>)); + map(vgmplay_device::A_MULTIPCM_1 + 8, vgmplay_device::A_MULTIPCM_1 + 11).w("vgmplay", FUNC(vgmplay_device::multipcm_bank_lo_w<1>)); + // TODO: upd7759 + map(vgmplay_device::A_OKIM6258_0 + 0, vgmplay_device::A_OKIM6295_0 + 0).w(m_okim6258[0], FUNC(okim6258_device::ctrl_w)); + map(vgmplay_device::A_OKIM6258_0 + 1, vgmplay_device::A_OKIM6295_0 + 1).w(m_okim6258[0], FUNC(okim6258_device::data_w)); + map(vgmplay_device::A_OKIM6258_1 + 0, vgmplay_device::A_OKIM6295_1 + 0).w(m_okim6258[1], FUNC(okim6258_device::ctrl_w)); + map(vgmplay_device::A_OKIM6258_1 + 1, vgmplay_device::A_OKIM6295_1 + 1).w(m_okim6258[1], FUNC(okim6258_device::data_w)); + map(vgmplay_device::A_OKIM6295_0, vgmplay_device::A_OKIM6295_0).w(m_okim6295[0], FUNC(okim6295_device::write)); + map(vgmplay_device::A_OKIM6295_0 + 0x8, vgmplay_device::A_OKIM6295_0 + 0xb).w(FUNC(vgmplay_state::okim6295_clock_w<0>)); + map(vgmplay_device::A_OKIM6295_0 + 0xc, vgmplay_device::A_OKIM6295_0 + 0xc).w(FUNC(vgmplay_state::okim6295_pin7_w<0>)); + map(vgmplay_device::A_OKIM6295_0 + 0xe, vgmplay_device::A_OKIM6295_0 + 0xe).w("vgmplay", FUNC(vgmplay_device::okim6295_nmk112_enable_w<0>)); + map(vgmplay_device::A_OKIM6295_0 + 0xf, vgmplay_device::A_OKIM6295_0 + 0xf).w("vgmplay", FUNC(vgmplay_device::okim6295_bank_w<0>)); + map(vgmplay_device::A_OKIM6295_0 + 0x10, vgmplay_device::A_OKIM6295_0 + 0x13).w("vgmplay", FUNC(vgmplay_device::okim6295_nmk112_bank_w<0>)); + map(vgmplay_device::A_OKIM6295_1, vgmplay_device::A_OKIM6295_1).w(m_okim6295[1], FUNC(okim6295_device::write)); + map(vgmplay_device::A_OKIM6295_1 + 0x8, vgmplay_device::A_OKIM6295_1 + 0xb).w(FUNC(vgmplay_state::okim6295_clock_w<1>)); + map(vgmplay_device::A_OKIM6295_1 + 0xc, vgmplay_device::A_OKIM6295_1 + 0xc).w(FUNC(vgmplay_state::okim6295_pin7_w<1>)); + map(vgmplay_device::A_OKIM6295_1 + 0xe, vgmplay_device::A_OKIM6295_1 + 0xe).w("vgmplay", FUNC(vgmplay_device::okim6295_nmk112_enable_w<1>)); + map(vgmplay_device::A_OKIM6295_1 + 0xf, vgmplay_device::A_OKIM6295_1 + 0xf).w("vgmplay", FUNC(vgmplay_device::okim6295_bank_w<1>)); + map(vgmplay_device::A_OKIM6295_1 + 0x10, vgmplay_device::A_OKIM6295_1 + 0x13).w("vgmplay", FUNC(vgmplay_device::okim6295_nmk112_bank_w<1>)); + map(vgmplay_device::A_K051649_0, vgmplay_device::A_K051649_0 + 0xf).w(FUNC(vgmplay_state::scc_w<0>)); + map(vgmplay_device::A_K051649_1, vgmplay_device::A_K051649_1 + 0xf).w(FUNC(vgmplay_state::scc_w<1>)); + map(vgmplay_device::A_K054539_0, vgmplay_device::A_K054539_0 + 0x22f).w(m_k054539[0], FUNC(k054539_device::write)); + map(vgmplay_device::A_K054539_1, vgmplay_device::A_K054539_1 + 0x22f).w(m_k054539[1], FUNC(k054539_device::write)); + map(vgmplay_device::A_C6280_0, vgmplay_device::A_C6280_0 + 0xf).w("huc6280.0:psg", FUNC(c6280_device::c6280_w)); + map(vgmplay_device::A_C6280_1, vgmplay_device::A_C6280_1 + 0xf).w("huc6280.1:psg", FUNC(c6280_device::c6280_w)); + map(vgmplay_device::A_C140_0, vgmplay_device::A_C140_0 + 0x1ff).w(m_c140[0], FUNC(c140_device::c140_w)); + map(vgmplay_device::A_C140_1, vgmplay_device::A_C140_1 + 0x1ff).w(m_c140[1], FUNC(c140_device::c140_w)); + map(vgmplay_device::A_K053260_0, vgmplay_device::A_K053260_0 + 0x2f).w(m_k053260[0], FUNC(k053260_device::write)); + map(vgmplay_device::A_K053260_1, vgmplay_device::A_K053260_1 + 0x2f).w(m_k053260[1], FUNC(k053260_device::write)); + map(vgmplay_device::A_POKEY_0, vgmplay_device::A_POKEY_0 + 0xf).w(m_pokey[0], FUNC(pokey_device::write)); + map(vgmplay_device::A_POKEY_1, vgmplay_device::A_POKEY_1 + 0xf).w(m_pokey[1], FUNC(pokey_device::write)); + map(vgmplay_device::A_QSOUND, vgmplay_device::A_QSOUND + 0x2).w(m_qsound, FUNC(qsound_device::qsound_w)); + // TODO: scsp + map(vgmplay_device::A_WSWAN_0, vgmplay_device::A_WSWAN_0 + 0xff).w(m_wswan[0], FUNC(wswan_sound_device::port_w)); + map(vgmplay_device::A_WSWAN_1, vgmplay_device::A_WSWAN_1 + 0xff).w(m_wswan[1], FUNC(wswan_sound_device::port_w)); + map(vgmplay_device::A_WSWAN_RAM_0, vgmplay_device::A_WSWAN_RAM_0 + 0x3fff).ram().share("wswan_ram.0"); + map(vgmplay_device::A_WSWAN_RAM_1, vgmplay_device::A_WSWAN_RAM_1 + 0x3fff).ram().share("wswan_ram.1"); + map(vgmplay_device::A_VSU_VUE_0, vgmplay_device::A_VSU_VUE_0 + 0x5ff).w(m_vsu_vue[0], FUNC(vboysnd_device::write)); + map(vgmplay_device::A_VSU_VUE_1, vgmplay_device::A_VSU_VUE_1 + 0x5ff).w(m_vsu_vue[1], FUNC(vboysnd_device::write)); + map(vgmplay_device::A_SAA1099_0, vgmplay_device::A_SAA1099_0 + 1).w(m_saa1099[0], FUNC(saa1099_device::write)); + map(vgmplay_device::A_SAA1099_1, vgmplay_device::A_SAA1099_1 + 1).w(m_saa1099[1], FUNC(saa1099_device::write)); + map(vgmplay_device::A_ES5503_0, vgmplay_device::A_ES5503_0 + 0xe2).w(m_es5503[0], FUNC(es5503_device::write)); + map(vgmplay_device::A_ES5503_RAM_0, vgmplay_device::A_ES5503_RAM_0 + 0x1ffff).ram().share("es5503_ram.0"); + map(vgmplay_device::A_ES5503_1, vgmplay_device::A_ES5503_1 + 0xe2).w(m_es5503[1], FUNC(es5503_device::write)); + map(vgmplay_device::A_ES5503_RAM_1, vgmplay_device::A_ES5503_RAM_1 + 0x1ffff).ram().share("es5503_ram.1"); + // TODO: es5505 + map(vgmplay_device::A_X1_010_0, vgmplay_device::A_X1_010_0 + 0x1fff).w(m_x1_010[0], FUNC(x1_010_device::write)); + map(vgmplay_device::A_X1_010_1, vgmplay_device::A_X1_010_1 + 0x1fff).w(m_x1_010[1], FUNC(x1_010_device::write)); + map(vgmplay_device::A_GA20_0, vgmplay_device::A_GA20_0 + 0x1f).w(m_ga20[0], FUNC(iremga20_device::irem_ga20_w)); + map(vgmplay_device::A_GA20_1, vgmplay_device::A_GA20_1 + 0x1f).w(m_ga20[1], FUNC(iremga20_device::irem_ga20_w)); } -void vgmplay_state::soundchips_map(address_map &map) +void vgmplay_state::soundchips16_map(address_map &map) { - map(vgmplay_device::REG_SIZE, vgmplay_device::REG_SIZE+3).r(FUNC(vgmplay_state::file_size_r)); - map(vgmplay_device::A_YM2612, vgmplay_device::A_YM2612+3).w(m_ym2612, FUNC(ym2612_device::write)); - map(vgmplay_device::A_YM2151, vgmplay_device::A_YM2151+1).w(m_ym2151, FUNC(ym2151_device::write)); - map(vgmplay_device::A_YM2413, vgmplay_device::A_YM2413+1).w(m_ym2413, FUNC(ym2413_device::write)); - map(vgmplay_device::A_YM2203A, vgmplay_device::A_YM2203A+1).w("ym2203a", FUNC(ym2203_device::write)); - map(vgmplay_device::A_YM2203B, vgmplay_device::A_YM2203B+1).w("ym2203b", FUNC(ym2203_device::write)); - map(vgmplay_device::A_YM3526, vgmplay_device::A_YM3526+1).w(m_ym3526, FUNC(ym3526_device::write)); - map(vgmplay_device::A_YM3812, vgmplay_device::A_YM3812+1).w(m_ym3812, FUNC(ym3812_device::write)); - map(vgmplay_device::A_AY8910A, vgmplay_device::A_AY8910A).w("ay8910a", FUNC(ay8910_device::data_w)); - map(vgmplay_device::A_AY8910A+1, vgmplay_device::A_AY8910A+1).w("ay8910a", FUNC(ay8910_device::address_w)); - map(vgmplay_device::A_AY8910B, vgmplay_device::A_AY8910B).w("ay8910b", FUNC(ay8910_device::data_w)); - map(vgmplay_device::A_AY8910B+1, vgmplay_device::A_AY8910B+1).w("ay8910b", FUNC(ay8910_device::address_w)); -// AM_RANGE(vgmplay_device::A_SN76496+0, vgmplay_device::A_SN76496+0) AM_DEVWRITE ("sn76496", sn76496_device, stereo_w) - map(vgmplay_device::A_SN76496+1, vgmplay_device::A_SN76496+1).w(m_sn76496, FUNC(sn76496_device::command_w)); - map(vgmplay_device::A_K053260, vgmplay_device::A_K053260+0x2f).w(m_k053260, FUNC(k053260_device::write)); - map(vgmplay_device::A_C6280, vgmplay_device::A_C6280+0xf).w(m_c6280, FUNC(c6280_device::c6280_w)); - map(vgmplay_device::A_OKIM6295A, vgmplay_device::A_OKIM6295A).w("okim6295a", FUNC(okim6295_device::write)); - map(vgmplay_device::A_OKIM6295A+0x8, vgmplay_device::A_OKIM6295A+0xb).w(FUNC(vgmplay_state::okim6295_clock_w<0>)); - map(vgmplay_device::A_OKIM6295A+0xc, vgmplay_device::A_OKIM6295A+0xc).w(FUNC(vgmplay_state::okim6295_pin7_w<0>)); - map(vgmplay_device::A_OKIM6295A+0xe, vgmplay_device::A_OKIM6295A+0xe).w("vgmplay", FUNC(vgmplay_device::okim6295_nmk112_enable_w<0>)); - map(vgmplay_device::A_OKIM6295A+0xf, vgmplay_device::A_OKIM6295A+0xf).w("vgmplay", FUNC(vgmplay_device::okim6295_bank_w<0>)); - map(vgmplay_device::A_OKIM6295A+0x10, vgmplay_device::A_OKIM6295A+0x13).w("vgmplay", FUNC(vgmplay_device::okim6295_nmk112_bank_w<0>)); - map(vgmplay_device::A_OKIM6295B, vgmplay_device::A_OKIM6295B).w("okim6295b", FUNC(okim6295_device::write)); - map(vgmplay_device::A_OKIM6295B+0x8, vgmplay_device::A_OKIM6295B+0xb).w(FUNC(vgmplay_state::okim6295_clock_w<1>)); - map(vgmplay_device::A_OKIM6295B+0xc, vgmplay_device::A_OKIM6295B+0xc).w(FUNC(vgmplay_state::okim6295_pin7_w<1>)); - map(vgmplay_device::A_OKIM6295B+0xe, vgmplay_device::A_OKIM6295B+0xe).w("vgmplay", FUNC(vgmplay_device::okim6295_nmk112_enable_w<1>)); - map(vgmplay_device::A_OKIM6295B+0xf, vgmplay_device::A_OKIM6295B+0xf).w("vgmplay", FUNC(vgmplay_device::okim6295_bank_w<1>)); - map(vgmplay_device::A_OKIM6295B+0x10, vgmplay_device::A_OKIM6295B+0x13).w("vgmplay", FUNC(vgmplay_device::okim6295_nmk112_bank_w<1>)); - map(vgmplay_device::A_SEGAPCM, vgmplay_device::A_SEGAPCM+0x7ff).w(m_segapcm, FUNC(segapcm_device::sega_pcm_w)); - map(vgmplay_device::A_GAMEBOY, vgmplay_device::A_GAMEBOY+0x16).w(m_dmg, FUNC(gameboy_sound_device::sound_w)); - map(vgmplay_device::A_GAMEBOY+0x20, vgmplay_device::A_GAMEBOY+0x2f).w(m_dmg, FUNC(gameboy_sound_device::wave_w)); - map(vgmplay_device::A_NESAPU, vgmplay_device::A_NESAPU+0x1f).w("nescpu:nesapu", FUNC(nesapu_device::write)); - map(vgmplay_device::A_NESRAM, vgmplay_device::A_NESRAM+0xffff).ram().share("nesapu_ram"); - map(vgmplay_device::A_MULTIPCMA, vgmplay_device::A_MULTIPCMA+3).w("multipcma", FUNC(multipcm_device::write)); - map(vgmplay_device::A_MULTIPCMA+4, vgmplay_device::A_MULTIPCMA+7).w("vgmplay", FUNC(vgmplay_device::multipcm_bank_hi_w<0>)); - map(vgmplay_device::A_MULTIPCMA+8, vgmplay_device::A_MULTIPCMA+11).w("vgmplay", FUNC(vgmplay_device::multipcm_bank_lo_w<0>)); - map(vgmplay_device::A_MULTIPCMB, vgmplay_device::A_MULTIPCMB+3).w("multipcmb", FUNC(multipcm_device::write)); - map(vgmplay_device::A_MULTIPCMB+4, vgmplay_device::A_MULTIPCMB+7).w("vgmplay", FUNC(vgmplay_device::multipcm_bank_hi_w<1>)); - map(vgmplay_device::A_MULTIPCMB+8, vgmplay_device::A_MULTIPCMB+11).w("vgmplay", FUNC(vgmplay_device::multipcm_bank_lo_w<1>)); - map(vgmplay_device::A_POKEYA, vgmplay_device::A_POKEYA+0xf).w("pokeya", FUNC(pokey_device::write)); - map(vgmplay_device::A_POKEYB, vgmplay_device::A_POKEYB+0xf).w("pokeyb", FUNC(pokey_device::write)); - map(vgmplay_device::A_YMF271, vgmplay_device::A_YMF271+0xf).w(m_ymf271, FUNC(ymf271_device::write)); - map(vgmplay_device::A_YMZ280B, vgmplay_device::A_YMZ280B+0x1).w(m_ymz280b, FUNC(ymz280b_device::write)); - map(vgmplay_device::A_YM2608, vgmplay_device::A_YM2608+0x3).w(m_ym2608, FUNC(ym2608_device::write)); - map(vgmplay_device::A_K054539A, vgmplay_device::A_K054539A+0x22f).w("k054539a", FUNC(k054539_device::write)); - map(vgmplay_device::A_K054539B, vgmplay_device::A_K054539B+0x22f).w("k054539b", FUNC(k054539_device::write)); - map(vgmplay_device::A_QSOUND, vgmplay_device::A_QSOUND+0x2).w(m_qsound, FUNC(qsound_device::qsound_w)); - map(vgmplay_device::A_K051649, vgmplay_device::A_K051649+0xf).w(FUNC(vgmplay_state::scc_w)); - map(vgmplay_device::A_GA20, vgmplay_device::A_GA20+0x1f).w(m_ga20, FUNC(iremga20_device::irem_ga20_w)); - map(vgmplay_device::A_RF5C68, vgmplay_device::A_RF5C68+0xf).w(m_rf5c68, FUNC(rf5c68_device::rf5c68_w)); - map(vgmplay_device::A_RF5C164, vgmplay_device::A_RF5C164+0xf).w(m_rf5c164, FUNC(rf5c68_device::rf5c68_w)); - map(vgmplay_device::A_RF5C68RAM, vgmplay_device::A_RF5C68RAM+0xffff).w(m_rf5c68, FUNC(rf5c68_device::rf5c68_mem_w)); - map(vgmplay_device::A_RF5C164RAM, vgmplay_device::A_RF5C164RAM+0xffff).w(m_rf5c164, FUNC(rf5c68_device::rf5c68_mem_w)); - map(vgmplay_device::A_X1_010, vgmplay_device::A_X1_010+0x1fff).w(m_x1_010, FUNC(x1_010_device::write)); + map(vgmplay_device::A_C352_0, vgmplay_device::A_C352_0 + 0x7fff).w(m_c352[0], FUNC(c352_device::write)); + map(vgmplay_device::A_C352_1, vgmplay_device::A_C352_1 + 0x7fff).w(m_c352[1], FUNC(c352_device::write)); + map(vgmplay_device::A_32X_PWM, vgmplay_device::A_32X_PWM + 0xf).w(m_sega32x, FUNC(sega_32x_device::_32x_pwm_w)); } +template<int Chip> void vgmplay_state::segapcm_map(address_map &map) { - map(0, 0x1fffff).r("vgmplay", FUNC(vgmplay_device::segapcm_rom_r)); + map(0, 0x1fffff).r("vgmplay", FUNC(vgmplay_device::segapcm_rom_r<Chip>)); } -void vgmplay_state::multipcma_map(address_map &map) +template<int Chip> +void vgmplay_state::rf5c68_map(address_map &map) { - map(0, 0x3fffff).r("vgmplay", FUNC(vgmplay_device::multipcm_rom_r<0>)); + map(0, 0xffff).ram().share(Chip ? "rf5c68_ram.1" : "rf5c68_ram.0"); } -void vgmplay_state::multipcmb_map(address_map &map) +template<int Chip> +void vgmplay_state::ymf278b_map(address_map &map) { - map(0, 0x3fffff).r("vgmplay", FUNC(vgmplay_device::multipcm_rom_r<1>)); + map(0, 0x3fffff).r("vgmplay", FUNC(vgmplay_device::ymf278b_rom_r<Chip>)); } -void vgmplay_state::k053260_map(address_map &map) +template<int Chip> +void vgmplay_state::ymf271_map(address_map &map) { - map(0, 0x1fffff).r("vgmplay", FUNC(vgmplay_device::k053260_rom_r)); + map(0, 0x7fffff).r("vgmplay", FUNC(vgmplay_device::ymf271_rom_r<Chip>)); } -void vgmplay_state::okim6295a_map(address_map &map) +template<int Chip> +void vgmplay_state::ymz280b_map(address_map &map) { - map(0, 0x3ffff).r("vgmplay", FUNC(vgmplay_device::okim6295_rom_r<0>)); + map(0, 0xffffff).r("vgmplay", FUNC(vgmplay_device::ymz280b_rom_r<Chip>)); } -void vgmplay_state::okim6295b_map(address_map &map) +template<int Chip> +void vgmplay_state::nescpu_map(address_map &map) { - map(0, 0x3ffff).r("vgmplay", FUNC(vgmplay_device::okim6295_rom_r<1>)); + map(0, 0xffff).ram().share(Chip ? "nesapu_ram.1" : "nesapu_ram.0"); } -void vgmplay_state::k054539a_map(address_map &map) +template<int Chip> +void vgmplay_state::multipcm_map(address_map &map) { - map(0, 0xffffff).r("vgmplay", FUNC(vgmplay_device::k054539_rom_r<0>)); + map(0, 0x3fffff).r("vgmplay", FUNC(vgmplay_device::multipcm_rom_r<Chip>)); } -void vgmplay_state::k054539b_map(address_map &map) +template<int Chip> +void vgmplay_state::okim6295_map(address_map &map) { - map(0, 0xffffff).r("vgmplay", FUNC(vgmplay_device::k054539_rom_r<1>)); + map(0, 0x3ffff).r("vgmplay", FUNC(vgmplay_device::okim6295_rom_r<Chip>)); } -void vgmplay_state::c352_map(address_map &map) +template<int Chip> +void vgmplay_state::k054539_map(address_map &map) { - map(0, 0xffffff).r("vgmplay", FUNC(vgmplay_device::c352_rom_r)); + map(0, 0xffffff).r("vgmplay", FUNC(vgmplay_device::k054539_rom_r<Chip>)); } -void vgmplay_state::qsound_map(address_map &map) +template<int Chip> +void vgmplay_state::c140_map(address_map &map) { - map(0, 0xffffff).r("vgmplay", FUNC(vgmplay_device::qsound_rom_r)); + map(0, 0x1fffff).r("vgmplay", FUNC(vgmplay_device::c140_rom_r<Chip>)); } -void vgmplay_state::ymf271_map(address_map &map) +template<int Chip> +void vgmplay_state::k053260_map(address_map &map) { - map(0, 0x7fffff).r("vgmplay", FUNC(vgmplay_device::ymf271_rom_r)); + map(0, 0x1fffff).r("vgmplay", FUNC(vgmplay_device::k053260_rom_r<Chip>)); } -void vgmplay_state::ymz280b_map(address_map &map) +template<int Chip> +void vgmplay_state::qsound_map(address_map &map) { - map(0, 0xffffff).r("vgmplay", FUNC(vgmplay_device::ymz280b_rom_r)); + map(0, 0xffffff).r("vgmplay", FUNC(vgmplay_device::qsound_rom_r<Chip>)); } -void vgmplay_state::ga20_map(address_map &map) +template<int Chip> +void vgmplay_state::wswan_map(address_map &map) { - map(0, 0xfffff).r("vgmplay", FUNC(vgmplay_device::ga20_rom_r)); + map(0, 0x3fff).ram().share(Chip ? "wswan_ram.1" : "wswan_ram.0"); } -void vgmplay_state::x1_010_map(address_map &map) +template<int Chip> +void vgmplay_state::es5503_map(address_map &map) { - map(0, 0xfffff).r("vgmplay", FUNC(vgmplay_device::x1_010_rom_r)); + map(0, 0x1ffff).ram().share(Chip ? "es5503_ram.1" : "es5503_ram.0"); } -void vgmplay_state::nescpu_map(address_map &map) +template<int Chip> +void vgmplay_state::es5505_map(address_map &map) { - map(0, 0xffff).ram().share("nesapu_ram"); + map(0, 0xffffff).r("vgmplay", FUNC(vgmplay_device::es5505_rom_r<Chip>)); } -void vgmplay_state::rf5c68_map(address_map &map) +template<int Chip> +void vgmplay_state::x1_010_map(address_map &map) { - map(0, 0xffff).ram().share("rf5c68_ram"); + map(0, 0xfffff).r("vgmplay", FUNC(vgmplay_device::x1_010_rom_r<Chip>)); } -void vgmplay_state::rf5c164_map(address_map &map) +template<int Chip> +void vgmplay_state::c352_map(address_map &map) { - map(0, 0xffff).ram().share("rf5c164_ram"); + map(0, 0xffffff).r("vgmplay", FUNC(vgmplay_device::c352_rom_r<Chip>)); } -void vgmplay_state::h6280_map(address_map &map) +template<int Chip> +void vgmplay_state::ga20_map(address_map &map) { - map(0, 0xffff).noprw(); + map(0, 0xfffff).r("vgmplay", FUNC(vgmplay_device::ga20_rom_r<Chip>)); } -void vgmplay_state::h6280_io_map(address_map &map) +template<int Chip> +void vgmplay_state::rf5c164_map(address_map &map) { - map(0, 3).noprw(); + map(0, 0xffff).ram().share("rf5c164_ram"); } MACHINE_CONFIG_START(vgmplay_state::vgmplay) - MCFG_DEVICE_ADD("vgmplay", VGMPLAY, 44100) - MCFG_DEVICE_PROGRAM_MAP( file_map ) - MCFG_DEVICE_IO_MAP( soundchips_map ) - MCFG_CPU_IO16_MAP( soundchips16_map ) + VGMPLAY(config, m_vgmplay, 44100); + m_vgmplay->set_addrmap(AS_PROGRAM, &vgmplay_state::file_map); + m_vgmplay->set_addrmap(AS_IO, &vgmplay_state::soundchips_map); + m_vgmplay->set_addrmap(AS_IO16, &vgmplay_state::soundchips16_map); MCFG_QUICKLOAD_ADD("quickload", vgmplay_state, load_file, "vgm,vgz", 0) MCFG_QUICKLOAD_INTERFACE("vgm_quik") @@ -2008,171 +2822,403 @@ MACHINE_CONFIG_START(vgmplay_state::vgmplay) SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); - MCFG_DEVICE_ADD("ym2612", YM2612, 7670454) - MCFG_SOUND_ROUTE(0, "lspeaker", 1) - MCFG_SOUND_ROUTE(1, "rspeaker", 1) - - MCFG_DEVICE_ADD("ym2151", YM2151, 3579545) - MCFG_SOUND_ROUTE(0, "lspeaker", 1) - MCFG_SOUND_ROUTE(1, "rspeaker", 1) - - MCFG_DEVICE_ADD("ym2413", YM2413, 3579545) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1) - - MCFG_DEVICE_ADD("sn76496", SN76496, 3579545) - MCFG_SOUND_ROUTE(0, "lspeaker", 0.5) - MCFG_SOUND_ROUTE(0, "rspeaker", 0.5) - - MCFG_DEVICE_ADD("segapcm", SEGAPCM, 4000000) - MCFG_SEGAPCM_BANK(BANK_512) // Should be configurable for yboard... - MCFG_DEVICE_ADDRESS_MAP(0, segapcm_map) - MCFG_SOUND_ROUTE(0, "lspeaker", 1) - MCFG_SOUND_ROUTE(1, "rspeaker", 1) - - MCFG_DEVICE_ADD("multipcma", MULTIPCM, 8000000) - MCFG_DEVICE_ADDRESS_MAP(0, multipcma_map) - MCFG_SOUND_ROUTE(0, "lspeaker", 1) - MCFG_SOUND_ROUTE(1, "rspeaker", 1) - - MCFG_DEVICE_ADD("multipcmb", MULTIPCM, 8000000) - MCFG_DEVICE_ADDRESS_MAP(0, multipcmb_map) - MCFG_SOUND_ROUTE(0, "lspeaker", 1) - MCFG_SOUND_ROUTE(1, "rspeaker", 1) - - MCFG_DEVICE_ADD("dmg", DMG_APU, XTAL(4'194'304)) - MCFG_SOUND_ROUTE(0, "lspeaker", 1) - MCFG_SOUND_ROUTE(1, "rspeaker", 1) - - MCFG_DEVICE_ADD("ay8910a", AY8910, 1500000) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.33) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.33) - - MCFG_DEVICE_ADD("ay8910b", AY8910, 1500000) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.33) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.33) - - MCFG_DEVICE_ADD("ym2203a", YM2203, 4000000) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.25) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.25) - - MCFG_DEVICE_ADD("ym2203b", YM2203, 4000000) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.25) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.25) - - MCFG_DEVICE_ADD("ym3526", YM3526, 4000000) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.5) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.5) - - MCFG_DEVICE_ADD("ym3812", YM3812, 4000000) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.50) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.50) - - MCFG_DEVICE_ADD("nescpu", N2A03, 1000000) - MCFG_DEVICE_PROGRAM_MAP(nescpu_map) - MCFG_DEVICE_DISABLE() - - MCFG_DEVICE_MODIFY("nescpu:nesapu") - MCFG_SOUND_ROUTES_RESET() - MCFG_SOUND_ROUTE(ALL_OUTPUTS, ":lspeaker", 0.50) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, ":rspeaker", 0.50) - - MCFG_DEVICE_ADD("h6280", H6280, 1000000) - MCFG_DEVICE_PROGRAM_MAP(h6280_map) - MCFG_DEVICE_IO_MAP(h6280_io_map) - MCFG_DEVICE_DISABLE() - - MCFG_DEVICE_ADD("c6280", C6280, 3579545) - MCFG_C6280_CPU("h6280") - MCFG_SOUND_ROUTE(0, "lspeaker", 1) - MCFG_SOUND_ROUTE(1, "rspeaker", 1) - - MCFG_K053260_ADD("k053260", 3579545) - MCFG_DEVICE_ADDRESS_MAP(0, k053260_map) - MCFG_SOUND_ROUTE(0, "lspeaker", 1) - MCFG_SOUND_ROUTE(1, "rspeaker", 1) - - MCFG_DEVICE_ADD("pokeya", POKEY, 1789772) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.5) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.5) - - MCFG_DEVICE_ADD("pokeyb", POKEY, 1789772) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.5) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.5) - - MCFG_DEVICE_ADD("c352", C352, 1000000, 288) - MCFG_DEVICE_ADDRESS_MAP(0, c352_map) - MCFG_SOUND_ROUTE(0, "lspeaker", 1) - MCFG_SOUND_ROUTE(1, "rspeaker", 1) - - MCFG_DEVICE_ADD("okim6295a", OKIM6295, 1000000, okim6295_device::PIN7_HIGH) - MCFG_DEVICE_ADDRESS_MAP(0, okim6295a_map) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.25) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.25) - - MCFG_DEVICE_ADD("okim6295b", OKIM6295, 1000000, okim6295_device::PIN7_HIGH) - MCFG_DEVICE_ADDRESS_MAP(0, okim6295b_map) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.25) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.25) - - MCFG_DEVICE_ADD("ymf271", YMF271, 16934400) - MCFG_DEVICE_ADDRESS_MAP(0, ymf271_map) - MCFG_SOUND_ROUTE(0, "lspeaker", 1) - MCFG_SOUND_ROUTE(1, "rspeaker", 1) - - MCFG_DEVICE_ADD("ymz280b", YMZ280B, 16934400) - MCFG_DEVICE_ADDRESS_MAP(0, ymz280b_map) - MCFG_SOUND_ROUTE(0, "lspeaker", 1) - MCFG_SOUND_ROUTE(1, "rspeaker", 1) - - MCFG_DEVICE_ADD("ym2608", YM2608, 8000000) - MCFG_SOUND_ROUTE(0, "lspeaker", 0.25) - MCFG_SOUND_ROUTE(0, "rspeaker", 0.25) - MCFG_SOUND_ROUTE(1, "lspeaker", 0.50) - MCFG_SOUND_ROUTE(2, "rspeaker", 0.50) - - MCFG_DEVICE_ADD("k054539a", K054539, XTAL(18'432'000)) - MCFG_DEVICE_ADDRESS_MAP(0, k054539a_map) - MCFG_SOUND_ROUTE(0, "lspeaker", 1) - MCFG_SOUND_ROUTE(1, "rspeaker", 1) - - MCFG_DEVICE_ADD("k054539b", K054539, XTAL(18'432'000)) - MCFG_DEVICE_ADDRESS_MAP(0, k054539b_map) - MCFG_SOUND_ROUTE(0, "lspeaker", 1) - MCFG_SOUND_ROUTE(1, "rspeaker", 1) - - MCFG_DEVICE_ADD("qsound", QSOUND) - MCFG_DEVICE_ADDRESS_MAP(0, qsound_map) - MCFG_SOUND_ROUTE(0, "lspeaker", 1) - MCFG_SOUND_ROUTE(1, "rspeaker", 1) - - MCFG_K051649_ADD("k051649", 3579545) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.33) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.33) - - IREMGA20(config, m_ga20, 3579545); - m_ga20->set_addrmap(0, &vgmplay_state::ga20_map); - m_ga20->add_route(0, "lspeaker", 1); - m_ga20->add_route(1, "rspeaker", 1); - - RF5C68(config, m_rf5c68, 12500000); - m_rf5c68->set_addrmap(0, &vgmplay_state::rf5c68_map); + SN76496(config, m_sn76496[0], 0); + m_sn76496[0]->add_route(0, "lspeaker", 0.5); + m_sn76496[0]->add_route(0, "rspeaker", 0.5); + + SN76496(config, m_sn76496[1], 0); + m_sn76496[1]->add_route(0, "lspeaker", 0.5); + m_sn76496[1]->add_route(0, "rspeaker", 0.5); + + YM2413(config, m_ym2413[0], 0); + m_ym2413[0]->add_route(ALL_OUTPUTS, "lspeaker", 1); + m_ym2413[0]->add_route(ALL_OUTPUTS, "rspeaker", 1); + + YM2413(config, m_ym2413[1], 0); + m_ym2413[1]->add_route(0, "lspeaker", 1); + m_ym2413[1]->add_route(1, "rspeaker", 1); + + YM2612(config, m_ym2612[0], 0); + m_ym2612[0]->add_route(0, "lspeaker", 1); + m_ym2612[0]->add_route(1, "rspeaker", 1); + + YM2612(config, m_ym2612[1], 0); + m_ym2612[1]->add_route(0, "lspeaker", 1); + m_ym2612[1]->add_route(1, "rspeaker", 1); + + YM2151(config, m_ym2151[0], 0); + m_ym2151[0]->add_route(0, "lspeaker", 1); + m_ym2151[0]->add_route(1, "rspeaker", 1); + + YM2151(config, m_ym2151[1], 0); + m_ym2151[1]->add_route(0, "lspeaker", 1); + m_ym2151[1]->add_route(1, "rspeaker", 1); + + SEGAPCM(config, m_segapcm[0], 0); + m_segapcm[0]->set_addrmap(0, &vgmplay_state::segapcm_map<0>); + m_segapcm[0]->add_route(0, "lspeaker", 1); + m_segapcm[0]->add_route(1, "rspeaker", 1); + + SEGAPCM(config, m_segapcm[1], 0); + m_segapcm[1]->set_addrmap(0, &vgmplay_state::segapcm_map<1>); + m_segapcm[1]->add_route(0, "lspeaker", 1); + m_segapcm[1]->add_route(1, "rspeaker", 1); + + RF5C68(config, m_rf5c68, 0); + m_rf5c68->set_addrmap(0, &vgmplay_state::rf5c68_map<0>); m_rf5c68->add_route(0, "lspeaker", 1); m_rf5c68->add_route(1, "rspeaker", 1); - RF5C68(config, m_rf5c164, 12500000); // TODO : !!RF5C164!! - m_rf5c164->set_addrmap(0, &vgmplay_state::rf5c164_map); + // TODO: prevent error.log spew + YM2203(config, m_ym2203[0], 0); + m_ym2203[0]->add_route(ALL_OUTPUTS, "lspeaker", 0.25); + m_ym2203[0]->add_route(ALL_OUTPUTS, "rspeaker", 0.25); + + YM2203(config, m_ym2203[1], 0); + m_ym2203[1]->add_route(ALL_OUTPUTS, "lspeaker", 0.25); + m_ym2203[1]->add_route(ALL_OUTPUTS, "rspeaker", 0.25); + + // TODO: prevent error.log spew + YM2608(config, m_ym2608[0], 0); + m_ym2608[0]->add_route(ALL_OUTPUTS, "lspeaker", 1); + m_ym2608[0]->add_route(ALL_OUTPUTS, "rspeaker", 1); + + YM2608(config, m_ym2608[1], 0); + m_ym2608[1]->add_route(ALL_OUTPUTS, "lspeaker", 1); + m_ym2608[1]->add_route(ALL_OUTPUTS, "rspeaker", 1); + + // TODO: prevent error.log spew + YM2610(config, m_ym2610[0], 0); + m_ym2610[0]->add_route(0, "lspeaker", 0.25); + m_ym2610[0]->add_route(0, "rspeaker", 0.25); + m_ym2610[0]->add_route(1, "lspeaker", 0.50); + m_ym2610[0]->add_route(2, "rspeaker", 0.50); + + YM2610(config, m_ym2610[1], 0); + m_ym2610[1]->add_route(0, "lspeaker", 0.25); + m_ym2610[1]->add_route(0, "rspeaker", 0.25); + m_ym2610[1]->add_route(1, "lspeaker", 0.50); + m_ym2610[1]->add_route(2, "rspeaker", 0.50); + + YM3812(config, m_ym3812[0], 0); + m_ym3812[0]->add_route(ALL_OUTPUTS, "lspeaker", 0.5); + m_ym3812[0]->add_route(ALL_OUTPUTS, "rspeaker", 0.5); + + YM3812(config, m_ym3812[1], 0); + m_ym3812[1]->add_route(ALL_OUTPUTS, "lspeaker", 0.5); + m_ym3812[1]->add_route(ALL_OUTPUTS, "rspeaker", 0.5); + + YM3526(config, m_ym3526[0], 0); + m_ym3526[0]->add_route(ALL_OUTPUTS, "lspeaker", 0.5); + m_ym3526[0]->add_route(ALL_OUTPUTS, "rspeaker", 0.5); + + YM3526(config, m_ym3526[1], 0); + m_ym3526[1]->add_route(ALL_OUTPUTS, "lspeaker", 0.5); + m_ym3526[1]->add_route(ALL_OUTPUTS, "rspeaker", 0.5); + + Y8950(config, m_y8950[0], 0); + m_y8950[0]->add_route(ALL_OUTPUTS, "lspeaker", 0.40); + m_y8950[0]->add_route(ALL_OUTPUTS, "rspeaker", 0.40); + + Y8950(config, m_y8950[1], 0); + m_y8950[1]->add_route(ALL_OUTPUTS, "lspeaker", 0.40); + m_y8950[1]->add_route(ALL_OUTPUTS, "rspeaker", 0.40); + + YMF262(config, m_ymf262[0], 0); + m_ymf262[0]->add_route(ALL_OUTPUTS, "lspeaker", 1.00); + m_ymf262[0]->add_route(ALL_OUTPUTS, "rspeaker", 1.00); + + YMF262(config, m_ymf262[1], 0); + m_ymf262[1]->add_route(ALL_OUTPUTS, "lspeaker", 1.00); + m_ymf262[1]->add_route(ALL_OUTPUTS, "rspeaker", 1.00); + + // TODO: prevent error.log spew + YMF278B(config, m_ymf278b[0], 0); + m_ymf278b[0]->set_addrmap(0, &vgmplay_state::ymf278b_map<0>); + m_ymf278b[0]->add_route(ALL_OUTPUTS, "lspeaker", 0.25); + m_ymf278b[0]->add_route(ALL_OUTPUTS, "rspeaker", 0.25); + + YMF278B(config, m_ymf278b[1], 0); + m_ymf278b[1]->set_addrmap(0, &vgmplay_state::ymf278b_map<1>); + m_ymf278b[1]->add_route(ALL_OUTPUTS, "lspeaker", 0.25); + m_ymf278b[1]->add_route(ALL_OUTPUTS, "rspeaker", 0.25); + + YMF271(config, m_ymf271[0], 0); + m_ymf271[0]->set_addrmap(0, &vgmplay_state::ymf271_map<0>); + m_ymf271[0]->add_route(ALL_OUTPUTS, "lspeaker", 0.25); + m_ymf271[0]->add_route(ALL_OUTPUTS, "rspeaker", 0.25); + + YMF271(config, m_ymf271[1], 0); + m_ymf271[1]->set_addrmap(0, &vgmplay_state::ymf271_map<0>); + m_ymf271[1]->add_route(ALL_OUTPUTS, "lspeaker", 0.25); + m_ymf271[1]->add_route(ALL_OUTPUTS, "rspeaker", 0.25); + + // TODO: prevent error.log spew + YMZ280B(config, m_ymz280b[0], 0); + m_ymz280b[0]->set_addrmap(0, &vgmplay_state::ymz280b_map<0>); + m_ymz280b[0]->add_route(ALL_OUTPUTS, "lspeaker", 0.25); + m_ymz280b[0]->add_route(ALL_OUTPUTS, "rspeaker", 0.25); + + YMZ280B(config, m_ymz280b[1], 0); + m_ymz280b[1]->set_addrmap(0, &vgmplay_state::ymz280b_map<1>); + m_ymz280b[1]->add_route(ALL_OUTPUTS, "lspeaker", 0.25); + m_ymz280b[1]->add_route(ALL_OUTPUTS, "rspeaker", 0.25); + + RF5C164(config, m_rf5c164, 0); + m_rf5c164->set_addrmap(0, &vgmplay_state::rf5c164_map<0>); m_rf5c164->add_route(0, "lspeaker", 1); m_rf5c164->add_route(1, "rspeaker", 1); - X1_010(config, m_x1_010, 16000000); - m_x1_010->set_addrmap(0, &vgmplay_state::x1_010_map); - m_x1_010->add_route(0, "lspeaker", 1); - m_x1_010->add_route(1, "rspeaker", 1); + /// TODO: rewrite to generate audio without using DAC devices + SEGA_32X_NTSC(config, m_sega32x, 0, "sega32x_maincpu", "sega32x_scanline_timer"); + m_sega32x->set_palette_tag("sega32x_palette"); + + auto& sega32x_maincpu(M68000(config, "sega32x_maincpu", 0)); + sega32x_maincpu.set_disable(); + + TIMER(config, "sega32x_scanline_timer", 0); + + PALETTE(config, "sega32x_palette", 0xc0 * 2); + + dynamic_cast<cpu_device *>(config.device_find(m_sega32x, "32x_master_sh2"))->set_disable(); + dynamic_cast<cpu_device *>(config.device_find(m_sega32x, "32x_slave_sh2"))->set_disable(); + + // TODO: prevent error.log spew + AY8910(config, m_ay8910[0], 0); + m_ay8910[0]->add_route(ALL_OUTPUTS, "lspeaker", 0.33); + m_ay8910[0]->add_route(ALL_OUTPUTS, "rspeaker", 0.33); + + AY8910(config, m_ay8910[1], 0); + m_ay8910[1]->add_route(ALL_OUTPUTS, "lspeaker", 0.33); + m_ay8910[1]->add_route(ALL_OUTPUTS, "rspeaker", 0.33); + + DMG_APU(config, m_dmg[0], 0); + m_dmg[0]->add_route(0, "lspeaker", 1); + m_dmg[0]->add_route(0, "rspeaker", 1); + + DMG_APU(config, m_dmg[1], 0); + m_dmg[1]->add_route(0, "lspeaker", 1); + m_dmg[1]->add_route(0, "rspeaker", 1); + + N2A03(config, m_nescpu[0], 0); + m_nescpu[0]->set_addrmap(AS_PROGRAM, &vgmplay_state::nescpu_map<0>); + m_nescpu[0]->set_disable(); + + auto *nesapu_0(dynamic_cast<device_sound_interface *>(config.device_find(m_nescpu[0], "nesapu"))); + nesapu_0->reset_routes(); + nesapu_0->add_route(ALL_OUTPUTS, ":lspeaker", 0.50); + nesapu_0->add_route(ALL_OUTPUTS, ":rspeaker", 0.50); + + N2A03(config, m_nescpu[1], 0); + m_nescpu[1]->set_addrmap(AS_PROGRAM, &vgmplay_state::nescpu_map<1>); + m_nescpu[1]->set_disable(); + + auto *nesapu_1(dynamic_cast<device_sound_interface *>(config.device_find(m_nescpu[1], "nesapu"))); + nesapu_1->reset_routes(); + nesapu_1->add_route(ALL_OUTPUTS, ":lspeaker", 0.50); + nesapu_1->add_route(ALL_OUTPUTS, ":rspeaker", 0.50); + + MULTIPCM(config, m_multipcm[0], 0); + m_multipcm[0]->set_addrmap(0, &vgmplay_state::multipcm_map<0>); + m_multipcm[0]->add_route(0, "lspeaker", 1); + m_multipcm[0]->add_route(1, "rspeaker", 1); + + MULTIPCM(config, m_multipcm[1], 0); + m_multipcm[1]->set_addrmap(0, &vgmplay_state::multipcm_map<1>); + m_multipcm[1]->add_route(0, "lspeaker", 1); + m_multipcm[1]->add_route(1, "rspeaker", 1); + + UPD7759(config, m_upd7759[0], 0); + m_upd7759[0]->add_route(ALL_OUTPUTS, "lspeaker", 1.0); + m_upd7759[0]->add_route(ALL_OUTPUTS, "rspeaker", 1.0); + + UPD7759(config, m_upd7759[1], 0); + m_upd7759[1]->add_route(ALL_OUTPUTS, "lspeaker", 1.0); + m_upd7759[1]->add_route(ALL_OUTPUTS, "rspeaker", 1.0); + + OKIM6258(config, m_okim6258[0], 0); + m_okim6258[0]->add_route(ALL_OUTPUTS, "lspeaker", 0.5); + m_okim6258[0]->add_route(ALL_OUTPUTS, "rspeaker", 0.5); + + OKIM6258(config, m_okim6258[1], 0); + m_okim6258[1]->add_route(ALL_OUTPUTS, "lspeaker", 0.5); + m_okim6258[1]->add_route(ALL_OUTPUTS, "rspeaker", 0.5); + + OKIM6295(config, m_okim6295[0], 0, okim6295_device::PIN7_HIGH); + m_okim6295[0]->set_addrmap(0, &vgmplay_state::okim6295_map<0>); + m_okim6295[0]->add_route(ALL_OUTPUTS, "lspeaker", 0.25); + m_okim6295[0]->add_route(ALL_OUTPUTS, "rspeaker", 0.25); + + OKIM6295(config, m_okim6295[1], 0, okim6295_device::PIN7_HIGH); + m_okim6295[1]->set_addrmap(0, &vgmplay_state::okim6295_map<1>); + m_okim6295[1]->add_route(ALL_OUTPUTS, "lspeaker", 0.25); + m_okim6295[1]->add_route(ALL_OUTPUTS, "rspeaker", 0.25); + + K051649(config, m_k051649[0], 0); + m_k051649[0]->add_route(ALL_OUTPUTS, "lspeaker", 0.33); + m_k051649[0]->add_route(ALL_OUTPUTS, "rspeaker", 0.33); + + K051649(config, m_k051649[1], 0); + m_k051649[1]->add_route(ALL_OUTPUTS, "lspeaker", 0.33); + m_k051649[1]->add_route(ALL_OUTPUTS, "rspeaker", 0.33); + + K054539(config, m_k054539[0], 0); + m_k054539[0]->set_addrmap(0, &vgmplay_state::k054539_map<0>); + m_k054539[0]->add_route(0, "lspeaker", 1); + m_k054539[0]->add_route(1, "rspeaker", 1); + + K054539(config, m_k054539[1], 0); + m_k054539[1]->set_addrmap(0, &vgmplay_state::k054539_map<1>); + m_k054539[1]->add_route(0, "lspeaker", 1); + m_k054539[1]->add_route(1, "rspeaker", 1); + + // TODO: prevent error.log spew + H6280(config, m_huc6280[0], 0); + m_huc6280[0]->set_disable(); + m_huc6280[0]->add_route(0, "lspeaker", 1); + m_huc6280[0]->add_route(1, "rspeaker", 1); + + H6280(config, m_huc6280[1], 0); + m_huc6280[1]->set_disable(); + m_huc6280[1]->add_route(0, "lspeaker", 1); + m_huc6280[1]->add_route(1, "rspeaker", 1); + + C140(config, m_c140[0], 0); + m_c140[0]->set_addrmap(0, &vgmplay_state::c140_map<0>); + m_c140[0]->add_route(0, "lspeaker", 0.50); + m_c140[0]->add_route(1, "rspeaker", 0.50); + + C140(config, m_c140[1], 0); + m_c140[1]->set_addrmap(0, &vgmplay_state::c140_map<1>); + m_c140[1]->add_route(0, "lspeaker", 0.50); + m_c140[1]->add_route(1, "rspeaker", 0.50); + + K053260(config, m_k053260[0], 0); + m_k053260[0]->set_addrmap(0, &vgmplay_state::k053260_map<0>); + m_k053260[0]->add_route(0, "lspeaker", 1); + m_k053260[0]->add_route(1, "rspeaker", 1); + + K053260(config, m_k053260[1], 0); + m_k053260[1]->set_addrmap(0, &vgmplay_state::k053260_map<1>); + m_k053260[1]->add_route(0, "lspeaker", 1); + m_k053260[1]->add_route(1, "rspeaker", 1); + + POKEY(config, m_pokey[0], 0); + m_pokey[0]->add_route(ALL_OUTPUTS, "lspeaker", 0.5); + m_pokey[0]->add_route(ALL_OUTPUTS, "rspeaker", 0.5); + + POKEY(config, m_pokey[1], 0); + m_pokey[1]->add_route(ALL_OUTPUTS, "lspeaker", 0.5); + m_pokey[1]->add_route(ALL_OUTPUTS, "rspeaker", 0.5); + + QSOUND(config, m_qsound, 0); + m_qsound->set_addrmap(0, &vgmplay_state::qsound_map<0>); + m_qsound->add_route(0, "lspeaker", 1); + m_qsound->add_route(1, "rspeaker", 1); + + SCSP(config, m_scsp[0], 0); + m_scsp[0]->add_route(0, "lspeaker", 1); + m_scsp[0]->add_route(1, "rspeaker", 1); + + SCSP(config, m_scsp[1], 0); + m_scsp[1]->add_route(0, "lspeaker", 1); + m_scsp[1]->add_route(1, "rspeaker", 1); + + WSWAN_SND(config, m_wswan[0], 0); + m_wswan[0]->set_addrmap(0, &vgmplay_state::wswan_map<0>); + m_wswan[0]->add_route(0, "lspeaker", 0.50); + m_wswan[0]->add_route(1, "rspeaker", 0.50); + + WSWAN_SND(config, m_wswan[1], 0); + m_wswan[1]->set_addrmap(0, &vgmplay_state::wswan_map<1>); + m_wswan[1]->add_route(0, "lspeaker", 0.50); + m_wswan[1]->add_route(1, "rspeaker", 0.50); + + VBOYSND(config, m_vsu_vue[0], 0); + m_vsu_vue[0]->add_route(0, "lspeaker", 1.0); + m_vsu_vue[0]->add_route(1, "rspeaker", 1.0); + + VBOYSND(config, m_vsu_vue[1], 0); + m_vsu_vue[1]->add_route(0, "lspeaker", 1.0); + m_vsu_vue[1]->add_route(1, "rspeaker", 1.0); + + SAA1099(config, m_saa1099[0], 0); + m_saa1099[0]->add_route(ALL_OUTPUTS, "lspeaker", 0.5); + m_saa1099[0]->add_route(ALL_OUTPUTS, "rspeaker", 0.5); + + SAA1099(config, m_saa1099[1], 0); + m_saa1099[1]->add_route(ALL_OUTPUTS, "lspeaker", 0.5); + m_saa1099[1]->add_route(ALL_OUTPUTS, "rspeaker", 0.5); + + ES5503(config, m_es5503[0], 0); + m_es5503[0]->set_channels(2); + m_es5503[0]->set_addrmap(0, &vgmplay_state::es5503_map<0>); + m_es5503[0]->add_route(ALL_OUTPUTS, "lspeaker", 0.5); + m_es5503[0]->add_route(ALL_OUTPUTS, "rspeaker", 0.5); + + ES5503(config, m_es5503[1], 0); + m_es5503[1]->set_channels(2); + m_es5503[1]->set_addrmap(0, &vgmplay_state::es5503_map<1>); + m_es5503[1]->add_route(ALL_OUTPUTS, "lspeaker", 0.5); + m_es5503[1]->add_route(ALL_OUTPUTS, "rspeaker", 0.5); + + ES5505(config, m_es5505[0], 0); + // TODO m_es5505[0]->set_addrmap(0, &vgmplay_state::es5505_map<0>); + m_es5505[0]->add_route(ALL_OUTPUTS, "lspeaker", 0.5); + m_es5505[0]->add_route(ALL_OUTPUTS, "rspeaker", 0.5); + + ES5505(config, m_es5505[1], 0); + // TODO m_es5505[1]->set_addrmap(0, &vgmplay_state::es5505_map<1>); + m_es5505[1]->add_route(ALL_OUTPUTS, "lspeaker", 0.5); + m_es5505[1]->add_route(ALL_OUTPUTS, "rspeaker", 0.5); + + X1_010(config, m_x1_010[0], 0); + m_x1_010[0]->set_addrmap(0, &vgmplay_state::x1_010_map<0>); + m_x1_010[0]->add_route(0, "lspeaker", 1); + m_x1_010[0]->add_route(1, "rspeaker", 1); + + X1_010(config, m_x1_010[1], 0); + m_x1_010[1]->set_addrmap(0, &vgmplay_state::x1_010_map<1>); + m_x1_010[1]->add_route(0, "lspeaker", 1); + m_x1_010[1]->add_route(1, "rspeaker", 1); + + C352(config, m_c352[0], 0, 1); + m_c352[0]->set_addrmap(0, &vgmplay_state::c352_map<0>); + m_c352[0]->add_route(0, "lspeaker", 1); + m_c352[0]->add_route(1, "rspeaker", 1); + + C352(config, m_c352[1], 0, 1); + m_c352[1]->set_addrmap(0, &vgmplay_state::c352_map<1>); + m_c352[1]->add_route(0, "lspeaker", 1); + m_c352[1]->add_route(1, "rspeaker", 1); + + IREMGA20(config, m_ga20[0], 0); + m_ga20[0]->set_addrmap(0, &vgmplay_state::ga20_map<0>); + m_ga20[0]->add_route(0, "lspeaker", 1); + m_ga20[0]->add_route(1, "rspeaker", 1); + + IREMGA20(config, m_ga20[1], 0); + m_ga20[1]->set_addrmap(0, &vgmplay_state::ga20_map<1>); + m_ga20[1]->add_route(0, "lspeaker", 1); + m_ga20[1]->add_route(1, "rspeaker", 1); MACHINE_CONFIG_END ROM_START( vgmplay ) - ROM_REGION( 0x80000, "ym2608", ROMREGION_ERASE00 ) + // TODO: change sound cores to device_rom_interface + ROM_REGION( 0x80000, "ym2608.0", ROMREGION_ERASE00 ) + ROM_REGION( 0x80000, "ym2608.1", ROMREGION_ERASE00 ) + ROM_REGION( 0x80000, "ym2610.0", ROMREGION_ERASE00 ) + ROM_REGION( 0x80000, "ym2610.1", ROMREGION_ERASE00 ) + ROM_REGION( 0x80000, "y8950.0", ROMREGION_ERASE00 ) + ROM_REGION( 0x80000, "y8950.1", ROMREGION_ERASE00 ) + ROM_REGION( 0x80000, "upd7759.0", ROMREGION_ERASE00 ) + ROM_REGION( 0x80000, "upd7759.1", ROMREGION_ERASE00 ) + ROM_REGION( 0x80000, "scsp", ROMREGION_ERASE00 ) + // TODO: split up 32x to remove dependencies + ROM_REGION( 0x4000, "master", ROMREGION_ERASE00 ) + ROM_REGION( 0x4000, "slave", ROMREGION_ERASE00 ) + ROM_REGION( 0x400000, "gamecart", ROMREGION_ERASE00 ) + ROM_REGION( 0x400000, "gamecart_sh2", ROMREGION_ERASE00 ) ROM_END CONS( 2016, vgmplay, 0, 0, vgmplay, vgmplay, vgmplay_state, empty_init, "MAME", "VGM player", MACHINE_CLICKABLE_ARTWORK ) diff --git a/src/mame/drivers/vic20.cpp b/src/mame/drivers/vic20.cpp index d8fca07908d..7565b03e80d 100644 --- a/src/mame/drivers/vic20.cpp +++ b/src/mame/drivers/vic20.cpp @@ -27,8 +27,7 @@ #define M6502_TAG "ue10" #define M6522_1_TAG "uab3" #define M6522_2_TAG "uab1" -#define M6560_TAG "ub7" -#define M6561_TAG "ub7" +#define VIC_TAG "ub7" #define IEC_TAG "iec" #define SCREEN_TAG "screen" #define CONTROL1_TAG "joy1" @@ -42,13 +41,14 @@ public: m_maincpu(*this, M6502_TAG), m_via1(*this, M6522_1_TAG), m_via2(*this, M6522_2_TAG), - m_vic(*this, M6560_TAG), + m_vic(*this, VIC_TAG), m_iec(*this, CBM_IEC_TAG), m_joy(*this, CONTROL1_TAG), m_exp(*this, VIC20_EXPANSION_SLOT_TAG), m_user(*this, PET_USER_PORT_TAG), m_cassette(*this, PET_DATASSETTE_PORT_TAG), m_ram(*this, RAM_TAG), + m_screen(*this, SCREEN_TAG), m_basic(*this, "basic"), m_kernal(*this, "kernal"), m_charom(*this, "charom"), @@ -60,7 +60,10 @@ public: void ntsc(machine_config &config); void pal(machine_config &config); - void vic20(machine_config &config); + +protected: + void vic20(machine_config &config, const char* softlist_filter); + void add_clocked_devices(machine_config &config, uint32_t clock); private: required_device<m6502_device> m_maincpu; @@ -73,6 +76,7 @@ private: required_device<pet_user_port_device> m_user; required_device<pet_datassette_port_device> m_cassette; required_device<ram_device> m_ram; + required_device<screen_device> m_screen; required_region_ptr<uint8_t> m_basic; required_region_ptr<uint8_t> m_kernal; required_region_ptr<uint8_t> m_charom; @@ -212,11 +216,11 @@ READ8_MEMBER( vic20_state::read ) case IO0: if (BIT(offset, 4)) { - data = m_via1->read(space, offset & 0x0f); + data = m_via1->read(offset & 0x0f); } else if (BIT(offset, 5)) { - data = m_via2->read(space, offset & 0x0f); + data = m_via2->read(offset & 0x0f); } else if (offset >= 0x9000 && offset < 0x9010) { @@ -287,11 +291,11 @@ WRITE8_MEMBER( vic20_state::write ) case IO0: if (BIT(offset, 4)) { - m_via1->write(space, offset & 0x0f, data); + m_via1->write(offset & 0x0f, data); } else if (BIT(offset, 5)) { - m_via2->write(space, offset & 0x0f, data); + m_via2->write(offset & 0x0f, data); } else if (offset >= 0x9000 && offset < 0x9010) { @@ -795,144 +799,120 @@ WRITE_LINE_MEMBER(vic20_state::write_user_cassette_switch) // MACHINE DRIVERS //************************************************************************** -//------------------------------------------------- -// MACHINE_CONFIG( vic20_common ) -//------------------------------------------------- - -MACHINE_CONFIG_START(vic20_state::vic20) - // devices - MCFG_PET_DATASSETTE_PORT_ADD(PET_DATASSETTE_PORT_TAG, cbm_datassette_devices, "c1530", WRITELINE(M6522_2_TAG, via6522_device, write_ca1)) - MCFG_CBM_IEC_ADD("c1541") - MCFG_CBM_IEC_BUS_SRQ_CALLBACK(WRITELINE(M6522_2_TAG, via6522_device, write_cb1)) - - MCFG_VCS_CONTROL_PORT_ADD(CONTROL1_TAG, vcs_control_port_devices, "joy") - MCFG_VCS_CONTROL_PORT_TRIGGER_CALLBACK(WRITELINE(*this, vic20_state, write_light_pen)) - - MCFG_DEVICE_ADD(PET_USER_PORT_TAG, PET_USER_PORT, vic20_user_port_cards, nullptr) - MCFG_PET_USER_PORT_3_HANDLER(WRITELINE(*this, vic20_state, exp_reset_w)) - MCFG_PET_USER_PORT_4_HANDLER(WRITELINE(*this, vic20_state, write_user_joy0)) - MCFG_PET_USER_PORT_5_HANDLER(WRITELINE(*this, vic20_state, write_user_joy1)) - MCFG_PET_USER_PORT_6_HANDLER(WRITELINE(*this, vic20_state, write_user_joy2)) - MCFG_PET_USER_PORT_7_HANDLER(WRITELINE(*this, vic20_state, write_user_light_pen)) - MCFG_PET_USER_PORT_8_HANDLER(WRITELINE(*this, vic20_state, write_user_cassette_switch)) - MCFG_PET_USER_PORT_B_HANDLER(WRITELINE(M6522_1_TAG, via6522_device, write_cb1)) - MCFG_PET_USER_PORT_C_HANDLER(WRITELINE(M6522_1_TAG, via6522_device, write_pb0)) - MCFG_PET_USER_PORT_D_HANDLER(WRITELINE(M6522_1_TAG, via6522_device, write_pb1)) - MCFG_PET_USER_PORT_E_HANDLER(WRITELINE(M6522_1_TAG, via6522_device, write_pb2)) - MCFG_PET_USER_PORT_F_HANDLER(WRITELINE(M6522_1_TAG, via6522_device, write_pb3)) - MCFG_PET_USER_PORT_H_HANDLER(WRITELINE(M6522_1_TAG, via6522_device, write_pb4)) - MCFG_PET_USER_PORT_J_HANDLER(WRITELINE(M6522_1_TAG, via6522_device, write_pb5)) - MCFG_PET_USER_PORT_K_HANDLER(WRITELINE(M6522_1_TAG, via6522_device, write_pb6)) - MCFG_PET_USER_PORT_L_HANDLER(WRITELINE(M6522_1_TAG, via6522_device, write_pb7)) - MCFG_PET_USER_PORT_M_HANDLER(WRITELINE(M6522_1_TAG, via6522_device, write_cb2)) - - MCFG_QUICKLOAD_ADD("quickload", vic20_state, cbm_vc20, "p00,prg", CBM_QUICKLOAD_DELAY_SECONDS) - - // software lists - MCFG_SOFTWARE_LIST_ADD("cart_list", "vic1001_cart") - MCFG_SOFTWARE_LIST_ADD("cass_list", "vic1001_cass") - MCFG_SOFTWARE_LIST_ADD("flop_list", "vic1001_flop") - - // internal ram - MCFG_RAM_ADD(RAM_TAG) - MCFG_RAM_DEFAULT_SIZE("5K") -MACHINE_CONFIG_END - +void vic20_state::vic20(machine_config &config, const char* softlist_filter) +{ + SCREEN(config, m_screen, SCREEN_TYPE_RASTER); + m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); + m_screen->set_screen_update(VIC_TAG, FUNC(mos6560_device::screen_update)); + + m_vic->set_screen(SCREEN_TAG); + m_vic->set_addrmap(0, &vic20_state::vic_videoram_map); + m_vic->set_addrmap(1, &vic20_state::vic_colorram_map); + + m_vic->potx_rd_callback().set(m_joy, FUNC(vcs_control_port_device::pot_x_r)); + m_vic->poty_rd_callback().set(m_joy, FUNC(vcs_control_port_device::pot_y_r)); + m_vic->add_route(ALL_OUTPUTS, "mono", 0.25); + + PET_DATASSETTE_PORT(config, m_cassette, 0); + cbm_datassette_devices(*m_cassette); + m_cassette->set_default_option("c1530"); + m_cassette->read_handler().set(m_via2, FUNC(via6522_device::write_ca1)); + + cbm_iec_slot_device::add(config, m_iec, "c1541"); + m_iec->srq_callback().set(m_via2, FUNC(via6522_device::write_cb1)); + + VCS_CONTROL_PORT(config, m_joy, 0); + vcs_control_port_devices(*m_joy); + m_joy->set_default_option("joy"); + m_joy->trigger_wr_callback().set(FUNC(vic20_state::write_light_pen)); + + PET_USER_PORT(config, m_user, vic20_user_port_cards, nullptr); + m_user->p3_handler().set(FUNC(vic20_state::exp_reset_w)); + m_user->p4_handler().set(FUNC(vic20_state::write_user_joy0)); + m_user->p5_handler().set(FUNC(vic20_state::write_user_joy1)); + m_user->p6_handler().set(FUNC(vic20_state::write_user_joy2)); + m_user->p7_handler().set(FUNC(vic20_state::write_user_light_pen)); + m_user->p8_handler().set(FUNC(vic20_state::write_user_cassette_switch)); + m_user->pb_handler().set(m_via1, FUNC(via6522_device::write_cb1)); + m_user->pc_handler().set(m_via1, FUNC(via6522_device::write_pb0)); + m_user->pd_handler().set(m_via1, FUNC(via6522_device::write_pb1)); + m_user->pe_handler().set(m_via1, FUNC(via6522_device::write_pb2)); + m_user->pf_handler().set(m_via1, FUNC(via6522_device::write_pb3)); + m_user->ph_handler().set(m_via1, FUNC(via6522_device::write_pb4)); + m_user->pj_handler().set(m_via1, FUNC(via6522_device::write_pb5)); + m_user->pk_handler().set(m_via1, FUNC(via6522_device::write_pb6)); + m_user->pl_handler().set(m_via1, FUNC(via6522_device::write_pb7)); + m_user->pm_handler().set(m_via1, FUNC(via6522_device::write_cb2)); + + quickload_image_device &quickload(QUICKLOAD(config, "quickload", 0)); + quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(vic20_state, cbm_vc20), this), "p00,prg", CBM_QUICKLOAD_DELAY_SECONDS); + + SOFTWARE_LIST(config, "cart_list").set_type("vic1001_cart", SOFTWARE_LIST_ORIGINAL_SYSTEM).set_filter(softlist_filter); + SOFTWARE_LIST(config, "cass_list").set_type("vic1001_cass", SOFTWARE_LIST_ORIGINAL_SYSTEM).set_filter(softlist_filter); + SOFTWARE_LIST(config, "flop_list").set_type("vic1001_flop", SOFTWARE_LIST_ORIGINAL_SYSTEM).set_filter(softlist_filter); + + RAM(config, m_ram); + m_ram->set_default_size("5K"); +} -//------------------------------------------------- -// MACHINE_CONFIG( ntsc ) -//------------------------------------------------- -MACHINE_CONFIG_START(vic20_state::ntsc) - vic20(config); +void vic20_state::add_clocked_devices(machine_config &config, uint32_t clock) +{ // basic machine hardware - MCFG_DEVICE_ADD(M6502_TAG, M6502, MOS6560_CLOCK) - MCFG_DEVICE_PROGRAM_MAP(vic20_mem) - MCFG_M6502_DISABLE_CACHE() // address decoding is 100% dynamic, no RAM/ROM banks - - MCFG_DEVICE_ADD(M6522_1_TAG, VIA6522, MOS6560_CLOCK) - MCFG_VIA6522_READPA_HANDLER(READ8(*this, vic20_state, via1_pa_r)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, vic20_state, via1_pa_w)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, vic20_state, via1_pb_w)) - MCFG_VIA6522_CB1_HANDLER(WRITELINE(PET_USER_PORT_TAG, pet_user_port_device, write_b)) - MCFG_VIA6522_CA2_HANDLER(WRITELINE(PET_DATASSETTE_PORT_TAG, pet_datassette_port_device, motor_w)) - MCFG_VIA6522_CB2_HANDLER(WRITELINE(PET_USER_PORT_TAG, pet_user_port_device, write_m)) - MCFG_VIA6522_IRQ_HANDLER(INPUTLINE(M6502_TAG, M6502_NMI_LINE)) - - MCFG_DEVICE_ADD(M6522_2_TAG, VIA6522, MOS6560_CLOCK) - MCFG_VIA6522_READPA_HANDLER(READ8(*this, vic20_state, via2_pa_r)) - MCFG_VIA6522_READPB_HANDLER(READ8(*this, vic20_state, via2_pb_r)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, vic20_state, via2_pb_w)) - MCFG_VIA6522_CA2_HANDLER(WRITELINE(*this, vic20_state, via2_ca2_w)) - MCFG_VIA6522_CB2_HANDLER(WRITELINE(*this, vic20_state, via2_cb2_w)) - MCFG_VIA6522_IRQ_HANDLER(INPUTLINE(M6502_TAG, M6502_IRQ_LINE)) + M6502(config, m_maincpu, clock); + m_maincpu->set_addrmap(AS_PROGRAM, &vic20_state::vic20_mem); + m_maincpu->disable_cache(); // address decoding is 100% dynamic, no RAM/ROM banks + + VIA6522(config, m_via1, clock); + m_via1->readpa_handler().set(FUNC(vic20_state::via1_pa_r)); + m_via1->writepa_handler().set(FUNC(vic20_state::via1_pa_w)); + m_via1->writepb_handler().set(FUNC(vic20_state::via1_pb_w)); + m_via1->cb1_handler().set(m_user, FUNC(pet_user_port_device::write_b)); + m_via1->ca2_handler().set(m_cassette, FUNC(pet_datassette_port_device::motor_w)); + m_via1->cb2_handler().set(m_user, FUNC(pet_user_port_device::write_m)); + m_via1->irq_handler().set_inputline(m_maincpu, M6502_NMI_LINE); + + VIA6522(config, m_via2, clock); + m_via2->readpa_handler().set(FUNC(vic20_state::via2_pa_r)); + m_via2->readpb_handler().set(FUNC(vic20_state::via2_pb_r)); + m_via2->writepb_handler().set(FUNC(vic20_state::via2_pb_w)); + m_via2->ca2_handler().set(FUNC(vic20_state::via2_ca2_w)); + m_via2->cb2_handler().set(FUNC(vic20_state::via2_cb2_w)); + m_via2->irq_handler().set_inputline(m_maincpu, M6502_IRQ_LINE); // video/sound hardware SPEAKER(config, "mono").front_center(); - MCFG_MOS6560_ADD(M6560_TAG, SCREEN_TAG, MOS6560_CLOCK, vic_videoram_map, vic_colorram_map) - MCFG_MOS6560_POTX_CALLBACK(READ8(CONTROL1_TAG, vcs_control_port_device, pot_x_r)) - MCFG_MOS6560_POTY_CALLBACK(READ8(CONTROL1_TAG, vcs_control_port_device, pot_y_r)) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) // devices - MCFG_DEVICE_ADD(VIC20_EXPANSION_SLOT_TAG, VIC20_EXPANSION_SLOT, MOS6560_CLOCK, vic20_expansion_cards, nullptr) - MCFG_VIC20_EXPANSION_SLOT_IRQ_CALLBACK(INPUTLINE(M6502_TAG, M6502_IRQ_LINE)) - MCFG_VIC20_EXPANSION_SLOT_NMI_CALLBACK(INPUTLINE(M6502_TAG, M6502_NMI_LINE)) - MCFG_VIC20_EXPANSION_SLOT_RES_CALLBACK(WRITELINE(*this, vic20_state, exp_reset_w)) + VIC20_EXPANSION_SLOT(config, m_exp, clock, vic20_expansion_cards, nullptr); + m_exp->irq_wr_callback().set_inputline(m_maincpu, M6502_IRQ_LINE); + m_exp->nmi_wr_callback().set_inputline(m_maincpu, M6502_NMI_LINE); + m_exp->res_wr_callback().set(FUNC(vic20_state::exp_reset_w)); +} - // software lists - MCFG_SOFTWARE_LIST_FILTER("cart_list", "NTSC") - MCFG_SOFTWARE_LIST_FILTER("cass_list", "NTSC") - MCFG_SOFTWARE_LIST_FILTER("flop_list", "NTSC") -MACHINE_CONFIG_END +void vic20_state::ntsc(machine_config &config) +{ + add_clocked_devices(config, MOS6560_CLOCK); + MOS6560(config, m_vic, MOS6560_CLOCK); + vic20(config, "NTSC"); -//------------------------------------------------- -// MACHINE_CONFIG( pal ) -//------------------------------------------------- + m_screen->set_refresh_hz(MOS6560_VRETRACERATE); + m_screen->set_size((MOS6560_XSIZE + 7) & ~7, MOS6560_YSIZE); + m_screen->set_visarea(MOS6560_MAME_XPOS, MOS6560_MAME_XPOS + MOS6560_MAME_XSIZE - 1, MOS6560_MAME_YPOS, MOS6560_MAME_YPOS + MOS6560_MAME_YSIZE - 1); +} -MACHINE_CONFIG_START(vic20_state::pal) - vic20(config); - // basic machine hardware - MCFG_DEVICE_ADD(M6502_TAG, M6502, MOS6561_CLOCK) - MCFG_DEVICE_PROGRAM_MAP(vic20_mem) - MCFG_M6502_DISABLE_CACHE() // address decoding is 100% dynamic, no RAM/ROM banks - - MCFG_DEVICE_ADD(M6522_1_TAG, VIA6522, MOS6561_CLOCK) - MCFG_VIA6522_READPA_HANDLER(READ8(*this, vic20_state, via1_pa_r)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, vic20_state, via1_pa_w)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, vic20_state, via1_pb_w)) - MCFG_VIA6522_CB1_HANDLER(WRITELINE(PET_USER_PORT_TAG, pet_user_port_device, write_b)) - MCFG_VIA6522_CA2_HANDLER(WRITELINE(PET_DATASSETTE_PORT_TAG, pet_datassette_port_device, motor_w)) - MCFG_VIA6522_CB2_HANDLER(WRITELINE(PET_USER_PORT_TAG, pet_user_port_device, write_m)) - MCFG_VIA6522_IRQ_HANDLER(INPUTLINE(M6502_TAG, M6502_NMI_LINE)) - - MCFG_DEVICE_ADD(M6522_2_TAG, VIA6522, MOS6561_CLOCK) - MCFG_VIA6522_READPA_HANDLER(READ8(*this, vic20_state, via2_pa_r)) - MCFG_VIA6522_READPB_HANDLER(READ8(*this, vic20_state, via2_pb_r)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, vic20_state, via2_pb_w)) - MCFG_VIA6522_CA2_HANDLER(WRITELINE(*this, vic20_state, via2_ca2_w)) - MCFG_VIA6522_CB2_HANDLER(WRITELINE(*this, vic20_state, via2_cb2_w)) - MCFG_VIA6522_IRQ_HANDLER(INPUTLINE(M6502_TAG, M6502_IRQ_LINE)) - // video/sound hardware - SPEAKER(config, "mono").front_center(); - MCFG_MOS6561_ADD(M6560_TAG, SCREEN_TAG, MOS6561_CLOCK, vic_videoram_map, vic_colorram_map) - MCFG_MOS6560_POTX_CALLBACK(READ8(CONTROL1_TAG, vcs_control_port_device, pot_x_r)) - MCFG_MOS6560_POTY_CALLBACK(READ8(CONTROL1_TAG, vcs_control_port_device, pot_y_r)) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) +void vic20_state::pal(machine_config &config) +{ + add_clocked_devices(config, MOS6561_CLOCK); + MOS6561(config, m_vic, MOS6561_CLOCK); + vic20(config, "PAL"); - // devices - MCFG_DEVICE_ADD(VIC20_EXPANSION_SLOT_TAG, VIC20_EXPANSION_SLOT, MOS6561_CLOCK, vic20_expansion_cards, nullptr) - MCFG_VIC20_EXPANSION_SLOT_IRQ_CALLBACK(INPUTLINE(M6502_TAG, M6502_IRQ_LINE)) - MCFG_VIC20_EXPANSION_SLOT_NMI_CALLBACK(INPUTLINE(M6502_TAG, M6502_NMI_LINE)) - MCFG_VIC20_EXPANSION_SLOT_RES_CALLBACK(WRITELINE(*this, vic20_state, exp_reset_w)) - - // software lists - MCFG_SOFTWARE_LIST_FILTER("cart_list", "PAL") - MCFG_SOFTWARE_LIST_FILTER("cass_list", "PAL") - MCFG_SOFTWARE_LIST_FILTER("flop_list", "PAL") -MACHINE_CONFIG_END + m_screen->set_refresh_hz(MOS6561_VRETRACERATE); + m_screen->set_size((MOS6561_XSIZE + 7) & ~7, MOS6561_YSIZE); + m_screen->set_visarea(MOS6561_MAME_XPOS, MOS6561_MAME_XPOS + MOS6561_MAME_XSIZE - 1, MOS6561_MAME_YPOS, MOS6561_MAME_YPOS + MOS6561_MAME_YSIZE - 1); +} diff --git a/src/mame/drivers/victor9k.cpp b/src/mame/drivers/victor9k.cpp index 9ad6d577c79..8b460e58e8f 100644 --- a/src/mame/drivers/victor9k.cpp +++ b/src/mame/drivers/victor9k.cpp @@ -152,7 +152,7 @@ private: DECLARE_WRITE_LINE_MEMBER( mux_serial_b_w ); DECLARE_WRITE_LINE_MEMBER( mux_serial_a_w ); - DECLARE_PALETTE_INIT( victor9k ); + void palette_init(palette_device &palette); // video state int m_brt; @@ -608,7 +608,7 @@ WRITE_LINE_MEMBER( victor9k_state::fdc_irq_w ) // MACHINE INITIALIZATION //************************************************************************** -PALETTE_INIT_MEMBER(victor9k_state, victor9k) +void victor9k_state::palette_init(palette_device &palette) { palette.set_pen_color(0, rgb_t(0x00, 0x00, 0x00)); @@ -679,121 +679,123 @@ void victor9k_state::machine_reset() // MACHINE_CONFIG( victor9k ) //------------------------------------------------- -MACHINE_CONFIG_START(victor9k_state::victor9k) +void victor9k_state::victor9k(machine_config &config) +{ // basic machine hardware - MCFG_DEVICE_ADD(I8088_TAG, I8088, XTAL(30'000'000)/6) - MCFG_DEVICE_PROGRAM_MAP(victor9k_mem) - MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE(I8259A_TAG, pic8259_device, inta_cb) + I8088(config, m_maincpu, XTAL(30'000'000)/6); + m_maincpu->set_addrmap(AS_PROGRAM, &victor9k_state::victor9k_mem); + m_maincpu->set_irq_acknowledge_callback(I8259A_TAG, FUNC(pic8259_device::inta_cb)); // video hardware - MCFG_SCREEN_ADD_MONOCHROME(SCREEN_TAG, RASTER, rgb_t::green()) - MCFG_SCREEN_REFRESH_RATE(50) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) // not accurate - MCFG_SCREEN_UPDATE_DEVICE(HD46505S_TAG, hd6845_device, screen_update) - MCFG_SCREEN_SIZE(640, 480) - MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1) - MCFG_PALETTE_ADD("palette", 16) - MCFG_PALETTE_INIT_OWNER(victor9k_state, victor9k) - - MCFG_MC6845_ADD(HD46505S_TAG, HD6845, SCREEN_TAG, XTAL(30'000'000)/10) // HD6845 == HD46505S - MCFG_MC6845_SHOW_BORDER_AREA(true) - MCFG_MC6845_CHAR_WIDTH(10) - MCFG_MC6845_UPDATE_ROW_CB(victor9k_state, crtc_update_row) - MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(*this, victor9k_state, vert_w)) + screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER)); + screen.set_color(rgb_t::green()); + screen.set_refresh_hz(50); + screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); // not accurate + screen.set_screen_update(HD46505S_TAG, FUNC(hd6845_device::screen_update)); + screen.set_size(640, 480); + screen.set_visarea(0, 640-1, 0, 480-1); + + PALETTE(config, m_palette, 16); + m_palette->set_init(FUNC(victor9k_state::palette_init)); + + HD6845(config, m_crtc, XTAL(30'000'000)/10); // HD6845 == HD46505S + m_crtc->set_screen(SCREEN_TAG); + m_crtc->set_show_border_area(true); + m_crtc->set_char_width(10); + m_crtc->set_update_row_callback(FUNC(victor9k_state::crtc_update_row), this); + m_crtc->out_vsync_callback().set(FUNC(victor9k_state::vert_w)); // sound hardware SPEAKER(config, "mono").front_center(); - MCFG_DEVICE_ADD(HC55516_TAG, HC55516, 0) + HC55516(config, m_cvsd, 0); //MCFG_HC55516_DIG_OUT_CB(WRITELINE(MC6852_TAG, mc6852_device, rx_w)) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) + m_cvsd->add_route(ALL_OUTPUTS, "mono", 0.25); // devices - MCFG_IEEE488_BUS_ADD() - MCFG_IEEE488_DAV_CALLBACK(WRITELINE(M6522_1_TAG, via6522_device, write_pb0)) - MCFG_IEEE488_EOI_CALLBACK(WRITELINE(M6522_1_TAG, via6522_device, write_pb1)) - MCFG_IEEE488_REN_CALLBACK(WRITELINE(M6522_1_TAG, via6522_device, write_pb2)) - MCFG_IEEE488_ATN_CALLBACK(WRITELINE(M6522_1_TAG, via6522_device, write_pb3)) - MCFG_IEEE488_IFC_CALLBACK(WRITELINE(M6522_1_TAG, via6522_device, write_pb4)) - MCFG_IEEE488_SRQ_CALLBACK(WRITELINE(M6522_1_TAG, via6522_device, write_pb5)) - MCFG_IEEE488_NRFD_CALLBACK(WRITELINE(*this, victor9k_state, write_nfrd)) - MCFG_IEEE488_NDAC_CALLBACK(WRITELINE(*this, victor9k_state, write_ndac)) - - MCFG_DEVICE_ADD(I8259A_TAG, PIC8259, 0) - MCFG_PIC8259_OUT_INT_CB(INPUTLINE(I8088_TAG, INPUT_LINE_IRQ0)) - - MCFG_DEVICE_ADD(I8253_TAG, PIT8253, 0) - MCFG_PIT8253_CLK0(2500000) - MCFG_PIT8253_OUT0_HANDLER(WRITELINE(*this, victor9k_state, mux_serial_b_w)) - MCFG_PIT8253_CLK1(2500000) - MCFG_PIT8253_OUT1_HANDLER(WRITELINE(*this, victor9k_state, mux_serial_a_w)) - MCFG_PIT8253_CLK2(100000) - MCFG_PIT8253_OUT2_HANDLER(WRITELINE(I8259A_TAG, pic8259_device, ir2_w)) - - MCFG_DEVICE_ADD(UPD7201_TAG, UPD7201, XTAL(30'000'000)/30) - MCFG_Z80DART_OUT_TXDA_CB(WRITELINE(RS232_A_TAG, rs232_port_device, write_txd)) - MCFG_Z80DART_OUT_DTRA_CB(WRITELINE(RS232_A_TAG, rs232_port_device, write_dtr)) - MCFG_Z80DART_OUT_RTSA_CB(WRITELINE(RS232_A_TAG, rs232_port_device, write_rts)) - MCFG_Z80DART_OUT_TXDB_CB(WRITELINE(RS232_B_TAG, rs232_port_device, write_txd)) - MCFG_Z80DART_OUT_DTRB_CB(WRITELINE(RS232_B_TAG, rs232_port_device, write_dtr)) - MCFG_Z80DART_OUT_RTSB_CB(WRITELINE(RS232_B_TAG, rs232_port_device, write_rts)) - MCFG_Z80DART_OUT_INT_CB(WRITELINE(I8259A_TAG, pic8259_device, ir1_w)) - - MCFG_DEVICE_ADD(MC6852_TAG, MC6852, XTAL(30'000'000)/30) - MCFG_MC6852_TX_DATA_CALLBACK(WRITELINE(HC55516_TAG, hc55516_device, digit_w)) - MCFG_MC6852_SM_DTR_CALLBACK(WRITELINE(*this, victor9k_state, ssda_sm_dtr_w)) - MCFG_MC6852_IRQ_CALLBACK(WRITELINE(*this, victor9k_state, ssda_irq_w)) - - MCFG_DEVICE_ADD(M6522_1_TAG, VIA6522, XTAL(30'000'000)/30) - MCFG_VIA6522_READPA_HANDLER(READ8(IEEE488_TAG, ieee488_device, dio_r)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, victor9k_state, via1_pa_w)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, victor9k_state, via1_pb_w)) - MCFG_VIA6522_CB2_HANDLER(WRITELINE(*this, victor9k_state, codec_vol_w)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, victor9k_state, via1_irq_w)) - - MCFG_DEVICE_ADD(M6522_2_TAG, VIA6522, XTAL(30'000'000)/30) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, victor9k_state, via2_pa_w)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, victor9k_state, via2_pb_w)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, victor9k_state, via2_irq_w)) - - MCFG_DEVICE_ADD(M6522_3_TAG, VIA6522, XTAL(30'000'000)/30) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, victor9k_state, via3_pb_w)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, victor9k_state, via3_irq_w)) - - MCFG_DEVICE_ADD(m_centronics, CENTRONICS, centronics_devices, "printer") - MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(M6522_1_TAG, via6522_device, write_pb5)) - MCFG_CENTRONICS_ACK_HANDLER(WRITELINE(M6522_1_TAG, via6522_device, write_pb6)) - MCFG_CENTRONICS_SELECT_HANDLER(WRITELINE(M6522_1_TAG, via6522_device, write_pb7)) - - MCFG_DEVICE_ADD(RS232_A_TAG, RS232_PORT, default_rs232_devices, nullptr) - MCFG_RS232_RXD_HANDLER(WRITELINE(UPD7201_TAG, z80dart_device, rxa_w)) - MCFG_RS232_DCD_HANDLER(WRITELINE(UPD7201_TAG, z80dart_device, dcda_w)) - MCFG_RS232_RI_HANDLER(WRITELINE(*this, victor9k_state, write_ria)) - MCFG_RS232_CTS_HANDLER(WRITELINE(UPD7201_TAG, z80dart_device, ctsa_w)) - MCFG_RS232_DSR_HANDLER(WRITELINE(M6522_2_TAG, via6522_device, write_pa3)) - - MCFG_DEVICE_ADD(RS232_B_TAG, RS232_PORT, default_rs232_devices, nullptr) - MCFG_RS232_RXD_HANDLER(WRITELINE(UPD7201_TAG, z80dart_device, rxb_w)) - MCFG_RS232_DCD_HANDLER(WRITELINE(UPD7201_TAG, z80dart_device, dcdb_w)) - MCFG_RS232_RI_HANDLER(WRITELINE(*this, victor9k_state, write_ria)) - MCFG_RS232_CTS_HANDLER(WRITELINE(UPD7201_TAG, z80dart_device, ctsb_w)) - MCFG_RS232_DSR_HANDLER(WRITELINE(M6522_2_TAG, via6522_device, write_pa5)) - - MCFG_DEVICE_ADD(KB_TAG, VICTOR9K_KEYBOARD, 0) - MCFG_VICTOR9K_KBRDY_HANDLER(WRITELINE(*this, victor9k_state, kbrdy_w)) - MCFG_VICTOR9K_KBDATA_HANDLER(WRITELINE(*this, victor9k_state, kbdata_w)) + IEEE488(config, m_ieee488, 0); + + m_ieee488->dav_callback().set(M6522_1_TAG, FUNC(via6522_device::write_pb0)); + m_ieee488->eoi_callback().set(M6522_1_TAG, FUNC(via6522_device::write_pb1)); + m_ieee488->ren_callback().set(M6522_1_TAG, FUNC(via6522_device::write_pb2)); + m_ieee488->atn_callback().set(M6522_1_TAG, FUNC(via6522_device::write_pb3)); + m_ieee488->ifc_callback().set(M6522_1_TAG, FUNC(via6522_device::write_pb4)); + m_ieee488->srq_callback().set(M6522_1_TAG, FUNC(via6522_device::write_pb5)); + m_ieee488->nrfd_callback().set(FUNC(victor9k_state::write_nfrd)); + m_ieee488->ndac_callback().set(FUNC(victor9k_state::write_ndac)); + + PIC8259(config, m_pic, 0); + m_pic->out_int_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0); + + pit8253_device &pit(PIT8253(config, I8253_TAG, 0)); + pit.set_clk<0>(2500000); + pit.out_handler<0>().set(FUNC(victor9k_state::mux_serial_b_w)); + pit.set_clk<1>(2500000); + pit.out_handler<1>().set(FUNC(victor9k_state::mux_serial_a_w)); + pit.set_clk<2>(100000); + pit.out_handler<2>().set(I8259A_TAG, FUNC(pic8259_device::ir2_w)); + + UPD7201(config, m_upd7201, XTAL(30'000'000)/30); + m_upd7201->out_txda_callback().set(RS232_A_TAG, FUNC(rs232_port_device::write_txd)); + m_upd7201->out_dtra_callback().set(RS232_A_TAG, FUNC(rs232_port_device::write_dtr)); + m_upd7201->out_rtsa_callback().set(RS232_A_TAG, FUNC(rs232_port_device::write_rts)); + m_upd7201->out_txdb_callback().set(RS232_B_TAG, FUNC(rs232_port_device::write_txd)); + m_upd7201->out_dtrb_callback().set(RS232_B_TAG, FUNC(rs232_port_device::write_dtr)); + m_upd7201->out_rtsb_callback().set(RS232_B_TAG, FUNC(rs232_port_device::write_rts)); + m_upd7201->out_int_callback().set(I8259A_TAG, FUNC(pic8259_device::ir1_w)); + + MC6852(config, m_ssda, XTAL(30'000'000)/30); + m_ssda->tx_data_callback().set(HC55516_TAG, FUNC(hc55516_device::digit_w)); + m_ssda->sm_dtr_callback().set(FUNC(victor9k_state::ssda_sm_dtr_w)); + m_ssda->irq_callback().set(FUNC(victor9k_state::ssda_irq_w)); + + VIA6522(config, m_via1, XTAL(30'000'000)/30); + m_via1->readpa_handler().set(IEEE488_TAG, FUNC(ieee488_device::dio_r)); + m_via1->writepa_handler().set(FUNC(victor9k_state::via1_pa_w)); + m_via1->writepb_handler().set(FUNC(victor9k_state::via1_pb_w)); + m_via1->cb2_handler().set(FUNC(victor9k_state::codec_vol_w)); + m_via1->irq_handler().set(FUNC(victor9k_state::via1_irq_w)); + + VIA6522(config, m_via2, XTAL(30'000'000)/30); + m_via2->writepa_handler().set(FUNC(victor9k_state::via2_pa_w)); + m_via2->writepb_handler().set(FUNC(victor9k_state::via2_pb_w)); + m_via2->irq_handler().set(FUNC(victor9k_state::via2_irq_w)); + + VIA6522(config, m_via3, XTAL(30'000'000)/30); + m_via3->writepb_handler().set(FUNC(victor9k_state::via3_pb_w)); + m_via3->irq_handler().set(FUNC(victor9k_state::via3_irq_w)); + + CENTRONICS(config, m_centronics, centronics_devices, "printer"); + m_centronics->busy_handler().set(M6522_1_TAG, FUNC(via6522_device::write_pb5)); + m_centronics->ack_handler().set(M6522_1_TAG, FUNC(via6522_device::write_pb6)); + m_centronics->select_handler().set(M6522_1_TAG, FUNC(via6522_device::write_pb7)); + + RS232_PORT(config, m_rs232a, default_rs232_devices, nullptr); + m_rs232a->rxd_handler().set(UPD7201_TAG, FUNC(z80dart_device::rxa_w)); + m_rs232a->dcd_handler().set(UPD7201_TAG, FUNC(z80dart_device::dcda_w)); + m_rs232a->ri_handler().set(FUNC(victor9k_state::write_ria)); + m_rs232a->cts_handler().set(UPD7201_TAG, FUNC(z80dart_device::ctsa_w)); + m_rs232a->dsr_handler().set(M6522_2_TAG, FUNC(via6522_device::write_pa3)); + + RS232_PORT(config, m_rs232b, default_rs232_devices, nullptr); + m_rs232b->rxd_handler().set(UPD7201_TAG, FUNC(z80dart_device::rxb_w)); + m_rs232b->dcd_handler().set(UPD7201_TAG, FUNC(z80dart_device::dcdb_w)); + m_rs232b->ri_handler().set(FUNC(victor9k_state::write_ria)); + m_rs232b->cts_handler().set(UPD7201_TAG, FUNC(z80dart_device::ctsb_w)); + m_rs232b->dsr_handler().set(M6522_2_TAG, FUNC(via6522_device::write_pa5)); + + VICTOR9K_KEYBOARD(config, m_kb, 0); + m_kb->kbrdy_handler().set(FUNC(victor9k_state::kbrdy_w)); + m_kb->kbdata_handler().set(FUNC(victor9k_state::kbdata_w)); VICTOR_9000_FDC(config, m_fdc, 0); m_fdc->irq_wr_callback().set(FUNC(victor9k_state::fdc_irq_w)); m_fdc->syn_wr_callback().set(I8259A_TAG, FUNC(pic8259_device::ir0_w)).invert(); m_fdc->lbrdy_wr_callback().set_inputline(I8088_TAG, INPUT_LINE_TEST).invert(); - // internal ram - MCFG_RAM_ADD(RAM_TAG) - MCFG_RAM_DEFAULT_SIZE("128K") + RAM(config, m_ram).set_default_size("128K"); - // software list - MCFG_SOFTWARE_LIST_ADD("flop_list", "victor9k_flop") -MACHINE_CONFIG_END + SOFTWARE_LIST(config, "flop_list").set_type("victor9k_flop", SOFTWARE_LIST_ORIGINAL_SYSTEM); +} diff --git a/src/mame/drivers/vis.cpp b/src/mame/drivers/vis.cpp index caa61fa09a7..0b1822f8303 100644 --- a/src/mame/drivers/vis.cpp +++ b/src/mame/drivers/vis.cpp @@ -28,8 +28,8 @@ protected: virtual void dack16_w(int line, uint16_t data) override; virtual void device_add_mconfig(machine_config &config) override; private: - required_device<dac_word_interface> m_rdac; - required_device<dac_word_interface> m_ldac; + required_device<dac_16bit_r2r_device> m_rdac; + required_device<dac_16bit_r2r_device> m_ldac; uint16_t m_count; uint16_t m_curcount; uint16_t m_sample[2]; @@ -126,20 +126,29 @@ void vis_audio_device::device_timer(emu_timer &timer, device_timer_id id, int pa } } -MACHINE_CONFIG_START(vis_audio_device::device_add_mconfig) +void vis_audio_device::device_add_mconfig(machine_config &config) +{ SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); - MCFG_DEVICE_ADD("ymf262", YMF262, XTAL(14'318'181)) - MCFG_SOUND_ROUTE(0, "lspeaker", 1.00) - MCFG_SOUND_ROUTE(1, "rspeaker", 1.00) - MCFG_SOUND_ROUTE(2, "lspeaker", 1.00) - MCFG_SOUND_ROUTE(3, "rspeaker", 1.00) - MCFG_DEVICE_ADD("ldac", DAC_16BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0) // sanyo lc7883k - MCFG_DEVICE_ADD("rdac", DAC_16BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0) // sanyo lc7883k - MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0) - MCFG_SOUND_ROUTE(0, "ldac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "ldac", -1.0, DAC_VREF_NEG_INPUT) - MCFG_SOUND_ROUTE(0, "rdac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "rdac", -1.0, DAC_VREF_NEG_INPUT) -MACHINE_CONFIG_END + + ymf262_device &ymf262(YMF262(config, "ymf262", XTAL(14'318'181))); + ymf262.add_route(0, "lspeaker", 1.00); + ymf262.add_route(1, "rspeaker", 1.00); + ymf262.add_route(2, "lspeaker", 1.00); + ymf262.add_route(3, "rspeaker", 1.00); + + DAC_16BIT_R2R(config, m_ldac, 0); + DAC_16BIT_R2R(config, m_rdac, 0); + m_ldac->add_route(ALL_OUTPUTS, "lspeaker", 1.0); // sanyo lc7883k + m_rdac->add_route(ALL_OUTPUTS, "rspeaker", 1.0); // sanyo lc7883k + + voltage_regulator_device &vreg(VOLTAGE_REGULATOR(config, "vref")); + vreg.set_output(5.0); + vreg.add_route(0, "ldac", 1.0, DAC_VREF_POS_INPUT); + vreg.add_route(0, "rdac", 1.0, DAC_VREF_POS_INPUT); + vreg.add_route(0, "ldac", -1.0, DAC_VREF_NEG_INPUT); + vreg.add_route(0, "rdac", -1.0, DAC_VREF_NEG_INPUT); +} READ8_MEMBER(vis_audio_device::pcm_r) { @@ -258,11 +267,12 @@ vis_vga_device::vis_vga_device(const machine_config &mconfig, const char *tag, d set_screen(*this, "screen"); } -MACHINE_CONFIG_START(vis_vga_device::device_add_mconfig) - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_RAW_PARAMS(XTAL(25'174'800),900,0,640,526,0,480) - MCFG_SCREEN_UPDATE_DEVICE(DEVICE_SELF, vis_vga_device, screen_update) -MACHINE_CONFIG_END +void vis_vga_device::device_add_mconfig(machine_config &config) +{ + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); + screen.set_raw(XTAL(25'174'800), 900, 0, 640, 526, 0, 480); + screen.set_screen_update(FUNC(vis_vga_device::screen_update)); +} void vis_vga_device::recompute_params() { @@ -381,6 +391,7 @@ void vis_vga_device::device_start() m_isa->install_memory(0x0a0000, 0x0bffff, read8_delegate(FUNC(vis_vga_device::visvgamem_r), this), write8_delegate(FUNC(vis_vga_device::visvgamem_w), this)); svga_device::device_start(); vga.svga_intf.seq_regcount = 0x2d; + save_pointer(m_crtc_regs,"VIS CRTC",0x32); } void vis_vga_device::device_reset() @@ -501,6 +512,7 @@ WRITE8_MEMBER(vis_vga_device::vga_w) { vga.gc.shift256 = 1; vga.crtc.dw = 1; + vga.crtc.no_wrap = 1; if(m_8bit_640) svga.rgb8_en = 1; else @@ -510,6 +522,7 @@ WRITE8_MEMBER(vis_vga_device::vga_w) { vga.gc.shift256 = m_shift256; vga.crtc.dw = m_dw; + vga.crtc.no_wrap = 0; svga.rgb8_en = 0; } break; @@ -720,8 +733,8 @@ private: DECLARE_WRITE16_MEMBER(pad_w); DECLARE_READ8_MEMBER(unk1_r); DECLARE_WRITE8_MEMBER(unk1_w); - void at16_io(address_map &map); - void at16_map(address_map &map); + void io_map(address_map &map); + void main_map(address_map &map); void machine_reset() override; @@ -834,7 +847,7 @@ WRITE8_MEMBER(vis_state::sysctl_w) m_sysctl = data; } -void vis_state::at16_map(address_map &map) +void vis_state::main_map(address_map &map) { map.unmap_value_high(); map(0x000000, 0x09ffff).ram(); @@ -844,7 +857,7 @@ void vis_state::at16_map(address_map &map) map(0xff0000, 0xffffff).rom().region("bios", 0xf0000); } -void vis_state::at16_io(address_map &map) +void vis_state::io_map(address_map &map) { map.unmap_value_high(); map(0x0000, 0x001f).rw("mb:dma8237_1", FUNC(am9517a_device::read), FUNC(am9517a_device::write)); @@ -873,9 +886,9 @@ static void vis_cards(device_slot_interface &device) static INPUT_PORTS_START(vis) PORT_START("PAD") PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, vis_state, update, 0) - PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, vis_state, update, 0) + PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("1") PORT_CHANGED_MEMBER(DEVICE_SELF, vis_state, update, 0) PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("A") PORT_CHANGED_MEMBER(DEVICE_SELF, vis_state, update, 0) - PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, vis_state, update, 0) + PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("2") PORT_CHANGED_MEMBER(DEVICE_SELF, vis_state, update, 0) PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, vis_state, update, 0) PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("B") PORT_CHANGED_MEMBER(DEVICE_SELF, vis_state, update, 0) PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, vis_state, update, 0) @@ -890,30 +903,31 @@ static INPUT_PORTS_START(vis) PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, vis_state, update, 0) INPUT_PORTS_END -MACHINE_CONFIG_START(vis_state::vis) +void vis_state::vis(machine_config &config) +{ /* basic machine hardware */ - MCFG_DEVICE_ADD("maincpu", I80286, XTAL(12'000'000) ) - MCFG_DEVICE_PROGRAM_MAP(at16_map) - MCFG_DEVICE_IO_MAP(at16_io) - MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("mb:pic8259_master", pic8259_device, inta_cb) - MCFG_80286_SHUTDOWN(WRITELINE("mb", at_mb_device, shutdown)) - - MCFG_DEVICE_ADD("mb", AT_MB, 0) - // this doesn't have a real keyboard controller - MCFG_DEVICE_REMOVE("mb:keybc") - MCFG_DEVICE_REMOVE("mb:pc_kbdc") - - MCFG_DEVICE_ADD("kbdc", KBDC8042, 0) - MCFG_KBDC8042_KEYBOARD_TYPE(KBDC8042_AT386) - MCFG_KBDC8042_SYSTEM_RESET_CB(INPUTLINE("maincpu", INPUT_LINE_RESET)) - MCFG_KBDC8042_GATE_A20_CB(INPUTLINE("maincpu", INPUT_LINE_A20)) - MCFG_KBDC8042_INPUT_BUFFER_FULL_CB(WRITELINE("mb:pic8259_master", pic8259_device, ir1_w)) + i80286_cpu_device &maincpu(I80286(config, "maincpu", XTAL(12'000'000))); + maincpu.set_addrmap(AS_PROGRAM, &vis_state::main_map); + maincpu.set_addrmap(AS_IO, &vis_state::io_map); + maincpu.shutdown_callback().set("mb", FUNC(at_mb_device::shutdown)); + maincpu.set_irq_acknowledge_callback("mb:pic8259_master", FUNC(pic8259_device::inta_cb)); + + AT_MB(config, "mb", 0); + // the vis doesn't have a real keyboard controller + config.device_remove("mb:keybc"); + config.device_remove("mb:pc_kbdc"); + + kbdc8042_device &kbdc(KBDC8042(config, "kbdc")); + kbdc.set_keyboard_type(kbdc8042_device::KBDC8042_AT386); + kbdc.system_reset_callback().set_inputline("maincpu", INPUT_LINE_RESET); + kbdc.gate_a20_callback().set_inputline("maincpu", INPUT_LINE_A20); + kbdc.input_buffer_full_callback().set("mb:pic8259_master", FUNC(pic8259_device::ir1_w)); // FIXME: determine ISA bus clock - MCFG_DEVICE_ADD("mcd", ISA16_SLOT, 0, "mb:isabus", pc_isa16_cards, "mcd", true) - MCFG_DEVICE_ADD("visaudio", ISA16_SLOT, 0, "mb:isabus", vis_cards, "visaudio", true) - MCFG_DEVICE_ADD("visvga", ISA16_SLOT, 0, "mb:isabus", vis_cards, "visvga", true) -MACHINE_CONFIG_END + ISA16_SLOT(config, "mcd", 0, "mb:isabus", pc_isa16_cards, "mcd", true); + ISA16_SLOT(config, "visaudio", 0, "mb:isabus", vis_cards, "visaudio", true); + ISA16_SLOT(config, "visvga", 0, "mb:isabus", vis_cards, "visvga", true); +} ROM_START(vis) ROM_REGION(0x100000,"bios", 0) diff --git a/src/mame/drivers/wicat.cpp b/src/mame/drivers/wicat.cpp index 643987dafd7..ca9c8f74e27 100644 --- a/src/mame/drivers/wicat.cpp +++ b/src/mame/drivers/wicat.cpp @@ -46,13 +46,7 @@ public: m_maincpu(*this, "maincpu"), m_rtc(*this, "rtc"), m_via(*this, "via"), - m_uart0(*this, "uart0"), - m_uart1(*this, "uart1"), - m_uart2(*this, "uart2"), - m_uart3(*this, "uart3"), - m_uart4(*this, "uart4"), - m_uart5(*this, "uart5"), - m_uart6(*this, "uart6"), + m_uart(*this, "uart%u", 0U), m_videocpu(*this, "videocpu"), m_videoctrl(*this, "videoctrl"), m_videoirq(*this, "videoirq"), @@ -111,13 +105,7 @@ private: required_device<m68000_device> m_maincpu; required_device<mm58274c_device> m_rtc; required_device<via6522_device> m_via; - required_device<mc2661_device> m_uart0; - required_device<mc2661_device> m_uart1; - required_device<mc2661_device> m_uart2; - required_device<mc2661_device> m_uart3; - required_device<mc2661_device> m_uart4; - required_device<mc2661_device> m_uart5; - required_device<mc2661_device> m_uart6; + required_device_array<mc2661_device, 7> m_uart; required_device<cpu_device> m_videocpu; required_device<ls259_device> m_videoctrl; required_device<input_merger_device> m_videoirq; @@ -134,11 +122,11 @@ private: uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { return 0; } virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; - void wicat_mem(address_map &map); - void wicat_video_io(address_map &map); - void wicat_video_mem(address_map &map); - void wicat_wd1000_io(address_map &map); - void wicat_wd1000_mem(address_map &map); + void main_mem(address_map &map); + void video_io(address_map &map); + void video_mem(address_map &map); + void wd1000_io(address_map &map); + void wd1000_mem(address_map &map); virtual void machine_start() override; virtual void machine_reset() override; @@ -161,7 +149,7 @@ private: }; -void wicat_state::wicat_mem(address_map &map) +void wicat_state::main_mem(address_map &map) { map.unmap_value_low(); map.global_mask(0xffffff); @@ -171,13 +159,13 @@ void wicat_state::wicat_mem(address_map &map) map(0x300000, 0xdfffff).rw(FUNC(wicat_state::invalid_r), FUNC(wicat_state::invalid_w)); map(0xeff800, 0xeffbff).ram(); // memory mapping SRAM, used during boot sequence for storing various data (TODO) map(0xeffc00, 0xeffc01).rw(FUNC(wicat_state::memmap_r), FUNC(wicat_state::memmap_w)); - map(0xf00000, 0xf00007).rw(m_uart0, FUNC(mc2661_device::read), FUNC(mc2661_device::write)).umask16(0xff00); // UARTs - map(0xf00008, 0xf0000f).rw(m_uart1, FUNC(mc2661_device::read), FUNC(mc2661_device::write)).umask16(0xff00); - map(0xf00010, 0xf00017).rw(m_uart2, FUNC(mc2661_device::read), FUNC(mc2661_device::write)).umask16(0xff00); - map(0xf00018, 0xf0001f).rw(m_uart3, FUNC(mc2661_device::read), FUNC(mc2661_device::write)).umask16(0xff00); - map(0xf00020, 0xf00027).rw(m_uart4, FUNC(mc2661_device::read), FUNC(mc2661_device::write)).umask16(0xff00); - map(0xf00028, 0xf0002f).rw(m_uart5, FUNC(mc2661_device::read), FUNC(mc2661_device::write)).umask16(0xff00); - map(0xf00030, 0xf00037).rw(m_uart6, FUNC(mc2661_device::read), FUNC(mc2661_device::write)).umask16(0xff00); + map(0xf00000, 0xf00007).rw(m_uart[0], FUNC(mc2661_device::read), FUNC(mc2661_device::write)).umask16(0xff00); // UARTs + map(0xf00008, 0xf0000f).rw(m_uart[1], FUNC(mc2661_device::read), FUNC(mc2661_device::write)).umask16(0xff00); + map(0xf00010, 0xf00017).rw(m_uart[2], FUNC(mc2661_device::read), FUNC(mc2661_device::write)).umask16(0xff00); + map(0xf00018, 0xf0001f).rw(m_uart[3], FUNC(mc2661_device::read), FUNC(mc2661_device::write)).umask16(0xff00); + map(0xf00020, 0xf00027).rw(m_uart[4], FUNC(mc2661_device::read), FUNC(mc2661_device::write)).umask16(0xff00); + map(0xf00028, 0xf0002f).rw(m_uart[5], FUNC(mc2661_device::read), FUNC(mc2661_device::write)).umask16(0xff00); + map(0xf00030, 0xf00037).rw(m_uart[6], FUNC(mc2661_device::read), FUNC(mc2661_device::write)).umask16(0xff00); map(0xf00040, 0xf0005f).rw(FUNC(wicat_state::via_r), FUNC(wicat_state::via_w)); map(0xf00060, 0xf0007f).rw(m_rtc, FUNC(mm58274c_device::read), FUNC(mm58274c_device::write)).umask16(0xff00); map(0xf000d0, 0xf000d0).w("ledlatch", FUNC(ls259_device::write_nibble_d3)); @@ -186,13 +174,13 @@ void wicat_state::wicat_mem(address_map &map) map(0xf00f00, 0xf00fff).rw(FUNC(wicat_state::invalid_r), FUNC(wicat_state::invalid_w)); } -void wicat_state::wicat_video_mem(address_map &map) +void wicat_state::video_mem(address_map &map) { map(0x0000, 0x7fff).rom().region("g1", 0x0000); map(0x8000, 0xffff).ram(); } -void wicat_state::wicat_video_io(address_map &map) +void wicat_state::video_io(address_map &map) { // these are largely wild guesses... map(0x0000, 0x0003).rw(FUNC(wicat_state::video_timer_r), FUNC(wicat_state::video_timer_w)); // some sort of timer? @@ -211,13 +199,13 @@ void wicat_state::wicat_video_io(address_map &map) map(0x9000, 0x9fff).rom().region("g2char", 0x0000); } -void wicat_state::wicat_wd1000_mem(address_map &map) +void wicat_state::wd1000_mem(address_map &map) { map(0x0000, 0x17ff).rom().region("wd3", 0x0000); map(0x1800, 0x1fff).noprw(); } -void wicat_state::wicat_wd1000_io(address_map &map) +void wicat_state::wd1000_io(address_map &map) { map(0x0000, 0x00ff).ram(); // left bank - RAM map(0x0100, 0x01ff).ram(); // right bank - I/O ports (TODO) @@ -309,12 +297,8 @@ void wicat_state::machine_reset() // on the terminal board /DCD on both INS2651s are tied to GND m_videouart0->dcd_w(0); m_videouart1->dcd_w(0); - m_uart0->dcd_w(0); - m_uart1->dcd_w(0); - m_uart2->dcd_w(0); - m_uart3->dcd_w(0); - m_uart4->dcd_w(0); - m_uart5->dcd_w(0); + for (int i = 0; i < 6; i++) + m_uart[i]->dcd_w(0); // initialise im6402 (terminal board) m_videouart->cls1_w(1); @@ -549,16 +533,16 @@ WRITE8_MEMBER(wicat_state::fdc_w) READ16_MEMBER(wicat_state::via_r) { if(ACCESSING_BITS_0_7) - return m_via->read(space,offset); + return m_via->read(offset); return 0x00; } WRITE16_MEMBER(wicat_state::via_w) { if(ACCESSING_BITS_0_7) - m_via->write(space,offset,data); + m_via->write(offset,data); else if(ACCESSING_BITS_8_15) - m_via->write(space,offset,data>>8); + m_via->write(offset,data>>8); } READ8_MEMBER(wicat_state::video_r) @@ -736,96 +720,53 @@ I8275_DRAW_CHARACTER_MEMBER(wicat_state::wicat_display_pixels) } } -MACHINE_CONFIG_START(wicat_state::wicat) - /* basic machine hardware */ - MCFG_DEVICE_ADD("maincpu", M68000, 8_MHz_XTAL) - MCFG_DEVICE_PROGRAM_MAP(wicat_mem) +void wicat_state::wicat(machine_config &config) +{ + M68000(config, m_maincpu, 8_MHz_XTAL); + m_maincpu->set_addrmap(AS_PROGRAM, &wicat_state::main_mem); - MCFG_DEVICE_ADD("via", VIA6522, 8_MHz_XTAL) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, wicat_state, via_a_w)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, wicat_state, via_b_w)) - MCFG_VIA6522_IRQ_HANDLER(INPUTLINE("maincpu", M68K_IRQ_1)) + VIA6522(config, m_via, 8_MHz_XTAL); + m_via->writepa_handler().set(FUNC(wicat_state::via_a_w)); + m_via->writepb_handler().set(FUNC(wicat_state::via_b_w)); + m_via->irq_handler().set_inputline(m_maincpu, M68K_IRQ_1); - MCFG_DEVICE_ADD("rtc", MM58274C, 0) // actually an MM58174AN, but should be compatible - MCFG_MM58274C_MODE24(0) // 12 hour - MCFG_MM58274C_DAY1(1) // monday + MM58274C(config, m_rtc, 0); // actually an MM58174AN, but should be compatible + m_rtc->set_mode24(0); // 12 hour + m_rtc->set_day1(1); // monday // internal terminal - MCFG_DEVICE_ADD("uart0", MC2661, 5.0688_MHz_XTAL) // connected to terminal board - MCFG_MC2661_TXD_HANDLER(WRITELINE("videouart0", mc2661_device, rx_w)) - MCFG_MC2661_RXRDY_HANDLER(INPUTLINE("maincpu", M68K_IRQ_2)) - MCFG_MC2661_RTS_HANDLER(WRITELINE("videouart0", mc2661_device, cts_w)) - MCFG_MC2661_DTR_HANDLER(WRITELINE("videouart0", mc2661_device, dsr_w)) + MC2661(config, m_uart[0], 5.0688_MHz_XTAL); // connected to terminal board + m_uart[0]->txd_handler().set(m_videouart0, FUNC(mc2661_device::rx_w)); + m_uart[0]->rxrdy_handler().set_inputline(m_maincpu, M68K_IRQ_2); + m_uart[0]->rts_handler().set(m_videouart0, FUNC(mc2661_device::cts_w)); + m_uart[0]->dtr_handler().set(m_videouart0, FUNC(mc2661_device::dsr_w)); // RS232C ports (x5) - MCFG_DEVICE_ADD("uart1", MC2661, 5.0688_MHz_XTAL) - MCFG_MC2661_TXD_HANDLER(WRITELINE("serial1", rs232_port_device, write_txd)) - MCFG_MC2661_RXRDY_HANDLER(INPUTLINE("maincpu", M68K_IRQ_2)) - MCFG_MC2661_RTS_HANDLER(WRITELINE("serial1", rs232_port_device, write_rts)) - MCFG_MC2661_DTR_HANDLER(WRITELINE("serial1", rs232_port_device, write_dtr)) - MCFG_MC2661_TXEMT_DSCHG_HANDLER(INPUTLINE("maincpu", M68K_IRQ_2)) - - MCFG_DEVICE_ADD("uart2", MC2661, 5.0688_MHz_XTAL) - MCFG_MC2661_TXD_HANDLER(WRITELINE("serial2", rs232_port_device, write_txd)) - MCFG_MC2661_RXRDY_HANDLER(INPUTLINE("maincpu", M68K_IRQ_2)) - MCFG_MC2661_RTS_HANDLER(WRITELINE("serial2", rs232_port_device, write_rts)) - MCFG_MC2661_DTR_HANDLER(WRITELINE("serial2", rs232_port_device, write_dtr)) - - MCFG_DEVICE_ADD("uart3", MC2661, 5.0688_MHz_XTAL) - MCFG_MC2661_TXD_HANDLER(WRITELINE("serial3", rs232_port_device, write_txd)) - MCFG_MC2661_RXRDY_HANDLER(INPUTLINE("maincpu", M68K_IRQ_2)) - MCFG_MC2661_RTS_HANDLER(WRITELINE("serial3", rs232_port_device, write_rts)) - MCFG_MC2661_DTR_HANDLER(WRITELINE("serial3", rs232_port_device, write_dtr)) - MCFG_MC2661_TXEMT_DSCHG_HANDLER(INPUTLINE("maincpu", M68K_IRQ_2)) - - MCFG_DEVICE_ADD("uart4", MC2661, 5.0688_MHz_XTAL) - MCFG_MC2661_TXD_HANDLER(WRITELINE("serial4", rs232_port_device, write_txd)) - MCFG_MC2661_RXRDY_HANDLER(INPUTLINE("maincpu", M68K_IRQ_2)) - MCFG_MC2661_RTS_HANDLER(WRITELINE("serial4", rs232_port_device, write_rts)) - MCFG_MC2661_DTR_HANDLER(WRITELINE("serial4", rs232_port_device, write_dtr)) - MCFG_MC2661_TXEMT_DSCHG_HANDLER(INPUTLINE("maincpu", M68K_IRQ_2)) - - MCFG_DEVICE_ADD("uart5", MC2661, 5.0688_MHz_XTAL) - MCFG_MC2661_TXD_HANDLER(WRITELINE("serial5", rs232_port_device, write_txd)) - MCFG_MC2661_RXRDY_HANDLER(INPUTLINE("maincpu", M68K_IRQ_2)) - MCFG_MC2661_RTS_HANDLER(WRITELINE("serial5", rs232_port_device, write_rts)) - MCFG_MC2661_DTR_HANDLER(WRITELINE("serial5", rs232_port_device, write_dtr)) - MCFG_MC2661_TXEMT_DSCHG_HANDLER(INPUTLINE("maincpu", M68K_IRQ_2)) + const char *serial_names[5] = { "serial1", "serial2", "serial3", "serial4", "serial5" }; + for (int i = 1; i <= 5; i++) + { + MC2661(config, m_uart[i], 5.0688_MHz_XTAL); + m_uart[i]->txd_handler().set(serial_names[i - 1], FUNC(rs232_port_device::write_txd)); + m_uart[i]->rts_handler().set(serial_names[i - 1], FUNC(rs232_port_device::write_rts)); + m_uart[i]->dtr_handler().set(serial_names[i - 1], FUNC(rs232_port_device::write_dtr)); + m_uart[i]->rxrdy_handler().set_inputline(m_maincpu, M68K_IRQ_2); + m_uart[i]->txemt_dschg_handler().set_inputline(m_maincpu, M68K_IRQ_2); + } // modem - MCFG_DEVICE_ADD("uart6", MC2661, 5.0688_MHz_XTAL) // connected to modem port - MCFG_MC2661_RXRDY_HANDLER(INPUTLINE("maincpu", M68K_IRQ_2)) - MCFG_MC2661_TXEMT_DSCHG_HANDLER(INPUTLINE("maincpu", M68K_IRQ_2)) - - MCFG_DEVICE_ADD("serial1",RS232_PORT, default_rs232_devices,nullptr) - MCFG_RS232_RXD_HANDLER(WRITELINE("uart1",mc2661_device,rx_w)) - MCFG_RS232_DCD_HANDLER(WRITELINE("uart1",mc2661_device,dcd_w)) - MCFG_RS232_DSR_HANDLER(WRITELINE("uart1",mc2661_device,dsr_w)) - MCFG_RS232_CTS_HANDLER(WRITELINE("uart1",mc2661_device,cts_w)) - - MCFG_DEVICE_ADD("serial2",RS232_PORT, default_rs232_devices,nullptr) - MCFG_RS232_RXD_HANDLER(WRITELINE("uart2",mc2661_device,rx_w)) - MCFG_RS232_DCD_HANDLER(WRITELINE("uart2",mc2661_device,dcd_w)) - MCFG_RS232_DSR_HANDLER(WRITELINE("uart2",mc2661_device,dsr_w)) - MCFG_RS232_CTS_HANDLER(WRITELINE("uart2",mc2661_device,cts_w)) - - MCFG_DEVICE_ADD("serial3",RS232_PORT, default_rs232_devices,nullptr) - MCFG_RS232_RXD_HANDLER(WRITELINE("uart3",mc2661_device,rx_w)) - MCFG_RS232_DCD_HANDLER(WRITELINE("uart3",mc2661_device,dcd_w)) - MCFG_RS232_DSR_HANDLER(WRITELINE("uart3",mc2661_device,dsr_w)) - MCFG_RS232_CTS_HANDLER(WRITELINE("uart3",mc2661_device,cts_w)) - - MCFG_DEVICE_ADD("serial4",RS232_PORT, default_rs232_devices,nullptr) - MCFG_RS232_RXD_HANDLER(WRITELINE("uart4",mc2661_device,rx_w)) - MCFG_RS232_DCD_HANDLER(WRITELINE("uart4",mc2661_device,dcd_w)) - MCFG_RS232_DSR_HANDLER(WRITELINE("uart4",mc2661_device,dsr_w)) - MCFG_RS232_CTS_HANDLER(WRITELINE("uart4",mc2661_device,cts_w)) - - MCFG_DEVICE_ADD("serial5",RS232_PORT, default_rs232_devices,nullptr) - MCFG_RS232_RXD_HANDLER(WRITELINE("uart5",mc2661_device,rx_w)) - MCFG_RS232_DCD_HANDLER(WRITELINE("uart5",mc2661_device,dcd_w)) - MCFG_RS232_DSR_HANDLER(WRITELINE("uart5",mc2661_device,dsr_w)) - MCFG_RS232_CTS_HANDLER(WRITELINE("uart5",mc2661_device,cts_w)) + MC2661(config, m_uart[6], 5.0688_MHz_XTAL); // connected to modem port + m_uart[6]->rxrdy_handler().set_inputline(m_maincpu, M68K_IRQ_2); + m_uart[6]->txemt_dschg_handler().set_inputline(m_maincpu, M68K_IRQ_2); + + const char *uart_names[5] = { "uart1", "uart2", "uart3", "uart4", "uart5" }; + for (int i = 1; i <= 5; i++) + { + rs232_port_device &port(RS232_PORT(config, serial_names[i - 1], default_rs232_devices, nullptr)); + port.rxd_handler().set(uart_names[i - 1], FUNC(mc2661_device::rx_w)); + port.dcd_handler().set(uart_names[i - 1], FUNC(mc2661_device::dcd_w)); + port.dsr_handler().set(uart_names[i - 1], FUNC(mc2661_device::dsr_w)); + port.cts_handler().set(uart_names[i - 1], FUNC(mc2661_device::cts_w)); + } ls259_device &ledlatch(LS259(config, "ledlatch")); // U19 on I/O board ledlatch.q_out_cb<0>().set(FUNC(wicat_state::adir_w)); @@ -838,9 +779,9 @@ MACHINE_CONFIG_START(wicat_state::wicat) ledlatch.q_out_cb<7>().set_output("led6").invert(); /* video hardware */ - MCFG_DEVICE_ADD("videocpu", Z8002, 8_MHz_XTAL/2) // AMD AMZ8002DC - MCFG_DEVICE_PROGRAM_MAP(wicat_video_mem) - MCFG_DEVICE_IO_MAP(wicat_video_io) + Z8002(config, m_videocpu, 8_MHz_XTAL/2); // AMD AMZ8002DC + m_videocpu->set_addrmap(AS_PROGRAM, &wicat_state::video_mem); + m_videocpu->set_addrmap(AS_IO, &wicat_state::video_io); INPUT_MERGER_ANY_HIGH(config, m_videoirq).output_handler().set_inputline(m_videocpu, INPUT_LINE_IRQ0); @@ -859,58 +800,58 @@ MACHINE_CONFIG_START(wicat_state::wicat) INPUT_MERGER_ALL_HIGH(config, "dmairq").output_handler().set_inputline(m_videocpu, INPUT_LINE_NMI); - MCFG_IM6402_ADD("videouart", 0, 1200) - MCFG_IM6402_DR_CALLBACK(WRITELINE("videoirq", input_merger_device, in_w<2>)) - MCFG_IM6402_TBRE_CALLBACK(WRITELINE("tbreirq", input_merger_device, in_w<0>)) + IM6402(config, m_videouart, 0); + m_videouart->set_rrc(0); + m_videouart->set_trc(1200); + m_videouart->dr_callback().set(m_videoirq, FUNC(input_merger_device::in_w<2>)); + m_videouart->tbre_callback().set("tbreirq", FUNC(input_merger_device::in_w<0>)); INPUT_MERGER_ALL_HIGH(config, "tbreirq").output_handler().set(m_videoirq, FUNC(input_merger_device::in_w<3>)); // terminal (2x INS2651, 1x IM6042 - one of these is for the keyboard, another communicates with the main board, the third is unknown) - MCFG_DEVICE_ADD("videouart0", MC2661, 5.0688_MHz_XTAL) // the INS2651 looks similar enough to the MC2661... - MCFG_MC2661_TXD_HANDLER(WRITELINE("uart0", mc2661_device, rx_w)) - MCFG_MC2661_RXRDY_HANDLER(WRITELINE("videoirq", input_merger_device, in_w<0>)) - MCFG_MC2661_RTS_HANDLER(WRITELINE("uart0", mc2661_device, cts_w)) - MCFG_MC2661_DTR_HANDLER(WRITELINE("uart0", mc2661_device, dsr_w)) + MC2661(config, m_videouart0, 5.0688_MHz_XTAL); // the INS2651 looks similar enough to the MC2661... + m_videouart0->txd_handler().set(m_uart[0], FUNC(mc2661_device::rx_w)); + m_videouart0->rxrdy_handler().set(m_videoirq, FUNC(input_merger_device::in_w<0>)); + m_videouart0->rts_handler().set(m_uart[0], FUNC(mc2661_device::cts_w)); + m_videouart0->dtr_handler().set(m_uart[0], FUNC(mc2661_device::dsr_w)); - MCFG_DEVICE_ADD("videouart1", MC2661, 5.0688_MHz_XTAL) - MCFG_MC2661_RXC(19200) - MCFG_MC2661_TXC(19200) - MCFG_MC2661_RXRDY_HANDLER(WRITELINE("videoirq", input_merger_device, in_w<4>)) + MC2661(config, m_videouart1, 5.0688_MHz_XTAL); + m_videouart1->set_rxc(19200); + m_videouart1->set_txc(19200); + m_videouart1->rxrdy_handler().set(m_videoirq, FUNC(input_merger_device::in_w<4>)); X2210(config, "vsram"); // XD2210 - MCFG_SCREEN_ADD_MONOCHROME("screen", RASTER, rgb_t::green()) - MCFG_SCREEN_RAW_PARAMS(19.6608_MHz_XTAL, 1020, 0, 800, 324, 0, 300) - MCFG_SCREEN_UPDATE_DEVICE("video",i8275_device,screen_update) + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); + screen.set_color(rgb_t::green()); + screen.set_raw(19.6608_MHz_XTAL, 1020, 0, 800, 324, 0, 300); + screen.set_screen_update("video", FUNC(i8275_device::screen_update)); - MCFG_PALETTE_ADD_MONOCHROME("palette") + PALETTE(config, m_palette, 2); + m_palette->set_init("palette", FUNC(palette_device::palette_init_monochrome)); - MCFG_DEVICE_ADD("video", I8275, 19.6608_MHz_XTAL/10) - MCFG_I8275_CHARACTER_WIDTH(10) - MCFG_I8275_DRAW_CHARACTER_CALLBACK_OWNER(wicat_state, wicat_display_pixels) - MCFG_I8275_DRQ_CALLBACK(WRITELINE("videodma", am9517a_device, dreq0_w)) - MCFG_I8275_VRTC_CALLBACK(WRITELINE(*this, wicat_state, crtc_irq_w)) - MCFG_VIDEO_SET_SCREEN("screen") + I8275(config, m_crtc, 19.6608_MHz_XTAL/10); + m_crtc->set_character_width(10); + m_crtc->set_display_callback(FUNC(wicat_state::wicat_display_pixels), this); + m_crtc->drq_wr_callback().set(m_videodma, FUNC(am9517a_device::dreq0_w)); + m_crtc->vrtc_wr_callback().set(FUNC(wicat_state::crtc_irq_w)); + m_crtc->set_screen("screen"); config.set_default_layout(layout_wicat); /* Winchester Disk Controller (WD1000 + FD1795) */ - MCFG_DEVICE_ADD("wd1kcpu", N8X300, 8_MHz_XTAL) - MCFG_DEVICE_PROGRAM_MAP(wicat_wd1000_mem) - MCFG_DEVICE_IO_MAP(wicat_wd1000_io) - - MCFG_DEVICE_ADD("fdc", FD1795, 8_MHz_XTAL) - MCFG_FLOPPY_DRIVE_ADD("fdc:0", wicat_floppies, "525qd", floppy_image_device::default_floppy_formats) - MCFG_FLOPPY_DRIVE_SOUND(true) - MCFG_FLOPPY_DRIVE_ADD("fdc:1", wicat_floppies, nullptr, floppy_image_device::default_floppy_formats) - MCFG_FLOPPY_DRIVE_SOUND(true) - MCFG_FLOPPY_DRIVE_ADD("fdc:2", wicat_floppies, nullptr, floppy_image_device::default_floppy_formats) - MCFG_FLOPPY_DRIVE_SOUND(true) - MCFG_FLOPPY_DRIVE_ADD("fdc:3", wicat_floppies, nullptr, floppy_image_device::default_floppy_formats) - MCFG_FLOPPY_DRIVE_SOUND(true) - - MCFG_SOFTWARE_LIST_ADD("flop_list", "wicat") -MACHINE_CONFIG_END + n8x300_cpu_device &wd1kcpu(N8X300(config, "wd1kcpu", 8_MHz_XTAL)); + wd1kcpu.set_addrmap(AS_PROGRAM, &wicat_state::wd1000_mem); + wd1kcpu.set_addrmap(AS_IO, &wicat_state::wd1000_io); + + FD1795(config, m_fdc, 8_MHz_XTAL); + FLOPPY_CONNECTOR(config, "fdc:0", wicat_floppies, "525qd", floppy_image_device::default_floppy_formats).enable_sound(true); + FLOPPY_CONNECTOR(config, "fdc:1", wicat_floppies, nullptr, floppy_image_device::default_floppy_formats).enable_sound(true); + FLOPPY_CONNECTOR(config, "fdc:2", wicat_floppies, nullptr, floppy_image_device::default_floppy_formats).enable_sound(true); + FLOPPY_CONNECTOR(config, "fdc:3", wicat_floppies, nullptr, floppy_image_device::default_floppy_formats).enable_sound(true); + + SOFTWARE_LIST(config, "flop_list").set_type("wicat", SOFTWARE_LIST_ORIGINAL_SYSTEM); +} /* ROM definition */ ROM_START( wicat ) diff --git a/src/mame/drivers/wswan.cpp b/src/mame/drivers/wswan.cpp index 0893850ae06..7e56a8f0f3f 100644 --- a/src/mame/drivers/wswan.cpp +++ b/src/mame/drivers/wswan.cpp @@ -62,6 +62,11 @@ void wswan_state::wswan_io(address_map &map) map(0x00, 0xff).rw(FUNC(wswan_state::port_r), FUNC(wswan_state::port_w)); // I/O ports } +void wswan_state::wswan_snd(address_map &map) +{ + map(0x00000, 0x03fff).r(m_vdp, FUNC(wswan_video_device::vram_r)); +} + static INPUT_PORTS_START( wswan ) PORT_START("CURSX") PORT_BIT( 0x1, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_NAME("X1 - Up") @@ -145,7 +150,8 @@ MACHINE_CONFIG_START(wswan_state::wswan) /* sound hardware */ SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); - MCFG_DEVICE_ADD(m_sound, WSWAN_SND, 0) + MCFG_DEVICE_ADD(m_sound, WSWAN_SND, 3.072_MHz_XTAL) + MCFG_DEVICE_ADDRESS_MAP(0, wswan_snd) MCFG_SOUND_ROUTE(0, "lspeaker", 0.50) MCFG_SOUND_ROUTE(1, "rspeaker", 0.50) diff --git a/src/mame/drivers/wyse.cpp b/src/mame/drivers/wyse.cpp index 71858de40fb..7811b4f8afa 100644 --- a/src/mame/drivers/wyse.cpp +++ b/src/mame/drivers/wyse.cpp @@ -23,7 +23,9 @@ WY-50 8031 2764 2672/80-435-00 2x2Kx8 1Kx8 WY-55 8032 (251352-12) 211019-05 8k (8kx2) battery 16C452 49.423 14.7456 WY-60 8051(202008-03) 27512(193003-01) 211003-02/205001-02 2064 ( 2064/2016/2016/2064) X24C04 2661 39.710/26.580 11.000 4.9152 WY-85 8032 27128(250151-04) 2672 4x6116 6116 9265 M5G1400 2681 48.5568 11.000 3.6864 +WY-120 8032 27256(250412-01) SLA7490(211009-01) 6264/5564 6264 battery - 48.000 11.000 4.9152 WY-150 8032 27512(251167-06) 211009-02 6264 (2x6264) battery - 48.000 11.000 +WY-120 8032 27C512(251169-03) 211009-02 6264 battery MC68661 ? 4.9152 ************************************************************************************************************************************/ @@ -98,6 +100,11 @@ ROM_START( wy85 ) ROM_LOAD( "am9265.1h", 0x0000, 0x2000, CRC(5ee65b55) SHA1(a0b38a38838f262aaea22d212351e7441e4b07e8) ) ROM_END +ROM_START( wy120 ) // b&w + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "wy120_ver1.4.bin", 0x000000, 0x010000, CRC(6de23624) SHA1(ad90087237347662b5ae4fcc8a05d66d76c46a26) ) +ROM_END + ROM_START( wy150 ) ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "251167-01.bin", 0x00000, 0x10000, CRC(4f425b11) SHA1(e44f54aa98d9f9c668a6ad674ec07e47879fc2a0) ) @@ -114,6 +121,7 @@ ROM_END COMP( 1984, wy50, 0, 0, wyse, wyse, wyse_state, empty_init, "Wyse Technology", "WY-50", MACHINE_IS_SKELETON ) COMP( 1986, wy60, wy50, 0, wyse, wyse, wyse_state, empty_init, "Wyse Technology", "WY-60", MACHINE_IS_SKELETON ) COMP( 1985, wy85, wy50, 0, wyse, wyse, wyse_state, empty_init, "Wyse Technology", "WY-85", MACHINE_IS_SKELETON ) +COMP( 1987, wy120, wy50, 0, wyse, wyse, wyse_state, empty_init, "Wyse Technology", "WY-120", MACHINE_IS_SKELETON ) COMP( 1988, wy150, wy50, 0, wyse, wyse, wyse_state, empty_init, "Wyse Technology", "WY-150", MACHINE_IS_SKELETON ) COMP( 1990, wy160, wy50, 0, wyse, wyse, wyse_state, empty_init, "Wyse Technology", "WY-160", MACHINE_IS_SKELETON ) COMP( 1991, wy30p, wy50, 0, wyse, wyse, wyse_state, empty_init, "Wyse Technology", "WY-30+", MACHINE_IS_SKELETON ) diff --git a/src/mame/drivers/x1twin.cpp b/src/mame/drivers/x1twin.cpp index 8c2eec0fd30..50ad22bb3b7 100644 --- a/src/mame/drivers/x1twin.cpp +++ b/src/mame/drivers/x1twin.cpp @@ -74,10 +74,6 @@ void x1twin_state::pce_mem(address_map &map) map(0x1F0000, 0x1F1FFF).ram().mirror(0x6000); map(0x1FE000, 0x1FE3FF).rw(FUNC(x1twin_state::vdc_r), FUNC(x1twin_state::vdc_w)); map(0x1FE400, 0x1FE7FF).rw(FUNC(x1twin_state::vce_r), FUNC(x1twin_state::vce_w)); - map(0x1FE800, 0x1FEBFF).rw("c6280", FUNC(c6280_device::c6280_r), FUNC(c6280_device::c6280_w)); - map(0x1FEC00, 0x1FEFFF).rw(FUNC(x1twin_state::h6280_timer_r), FUNC(x1twin_state::h6280_timer_w)); - map(0x1FF000, 0x1FF3FF).rw(FUNC(x1twin_state::pce_joystick_r), FUNC(x1twin_state::pce_joystick_w)); - map(0x1FF400, 0x1FF7FF).rw("maincpu", FUNC(h6280_device::irq_status_r), FUNC(h6280_device::irq_status_w)); } void x1twin_state::pce_io(address_map &map) @@ -448,9 +444,14 @@ MACHINE_CONFIG_START(x1twin_state::x1twin) MCFG_MACHINE_RESET_OVERRIDE(x1twin_state,x1) #if 0 - MCFG_DEVICE_ADD("pce_cpu", H6280, PCE_MAIN_CLOCK/3) - MCFG_DEVICE_PROGRAM_MAP(pce_mem) - MCFG_DEVICE_IO_MAP(pce_io) + H6280(config, m_maincpu, PCE_MAIN_CLOCK/3); + m_maincpu->set_addrmap(AS_PROGRAM, pce_mem); + m_maincpu->set_addrmap(AS_IO, pce_io); + m_maincpu->port_in_cb().set(FUNC(x1twin_state::pce_joystick_r)); + m_maincpu->port_out_cb().set(FUNC(x1twin_state::pce_joystick_w)); + m_maincpu->add_route(0, "pce_l", 0.5); + m_maincpu->add_route(1, "pce_r", 0.5); + MCFG_TIMER_ADD_SCANLINE("scantimer", pce_interrupt, "pce_screen", 0, 1) #endif @@ -519,13 +520,6 @@ MACHINE_CONFIG_START(x1twin_state::x1twin) MCFG_SOFTWARE_LIST_ADD("cass_list","x1_cass") -#if 0 - MCFG_DEVICE_ADD("c6280", C6280, PCE_MAIN_CLOCK/6) - MCFG_C6280_CPU("pce_cpu") - MCFG_SOUND_ROUTE(0, "pce_l", 0.5) - MCFG_SOUND_ROUTE(1, "pce_r", 0.5) -#endif - MCFG_TIMER_DRIVER_ADD_PERIODIC("keyboard_timer", x1twin_state, x1_keyboard_callback, attotime::from_hz(250)) MCFG_TIMER_DRIVER_ADD_PERIODIC("cmt_wind_timer", x1twin_state, x1_cmt_wind_timer, attotime::from_hz(16)) MACHINE_CONFIG_END diff --git a/src/mame/drivers/x68k.cpp b/src/mame/drivers/x68k.cpp index 41fcd74d293..21ec4e86444 100644 --- a/src/mame/drivers/x68k.cpp +++ b/src/mame/drivers/x68k.cpp @@ -1608,13 +1608,13 @@ MACHINE_CONFIG_START(x68k_state::x68000) MCFG_QUANTUM_TIME(attotime::from_hz(60)) /* device hardware */ - MCFG_DEVICE_ADD("mc68901", MC68901, 16_MHz_XTAL / 4) - MCFG_MC68901_TIMER_CLOCK(16_MHz_XTAL / 4) - MCFG_MC68901_RX_CLOCK(0) - MCFG_MC68901_TX_CLOCK(0) - MCFG_MC68901_OUT_IRQ_CB(WRITELINE(*this, x68k_state, mfp_irq_callback)) - MCFG_MC68901_OUT_TBO_CB(WRITELINE("mc68901", mc68901_device, clock_w)) - MCFG_MC68901_OUT_SO_CB(WRITELINE("keyboard", rs232_port_device, write_txd)) + MC68901(config, m_mfpdev, 16_MHz_XTAL / 4); + m_mfpdev->set_timer_clock(16_MHz_XTAL / 4); + m_mfpdev->set_rx_clock(0); + m_mfpdev->set_tx_clock(0); + m_mfpdev->out_irq_cb().set(FUNC(x68k_state::mfp_irq_callback)); + m_mfpdev->out_tbo_cb().set(m_mfpdev, FUNC(mc68901_device::clock_w)); + m_mfpdev->out_so_cb().set("keyboard", FUNC(rs232_port_device::write_txd)); MCFG_DEVICE_ADD("keyboard", RS232_PORT, keyboard, "x68k") MCFG_RS232_RXD_HANDLER(WRITELINE("mc68901", mc68901_device, write_rx)) @@ -1727,10 +1727,10 @@ MACHINE_CONFIG_START(x68k_state::x68ksupr) MCFG_SCSIDEV_ADD("scsi:" SCSI_PORT_DEVICE6, "harddisk", SCSIHD, SCSI_ID_5) MCFG_SCSIDEV_ADD("scsi:" SCSI_PORT_DEVICE7, "cdrom", SCSICD, SCSI_ID_6) - MCFG_DEVICE_ADD("mb89352", MB89352A, 40_MHz_XTAL / 8) - MCFG_LEGACY_SCSI_PORT("scsi") - MCFG_MB89352A_IRQ_CB(WRITELINE(*this, x68k_state, x68k_scsi_irq)) - MCFG_MB89352A_DRQ_CB(WRITELINE(*this, x68k_state, x68k_scsi_drq)) + mb89352_device &scsictrl(MB89352A(config, "mb89352", 40_MHz_XTAL / 8)); + scsictrl.set_scsi_port("scsi"); + scsictrl.irq_cb().set(FUNC(x68k_state::x68k_scsi_irq)); + scsictrl.drq_cb().set(FUNC(x68k_state::x68k_scsi_drq)); VICON(config.replace(), m_crtc, 38.86363_MHz_XTAL); m_crtc->set_screen("screen"); diff --git a/src/mame/drivers/xor100.cpp b/src/mame/drivers/xor100.cpp index 0a3ab3dea9a..66da909f1bd 100644 --- a/src/mame/drivers/xor100.cpp +++ b/src/mame/drivers/xor100.cpp @@ -2,43 +2,45 @@ // copyright-holders:Curt Coder /**************************************************************************************************** - XOR S-100-12 +XOR S-100-12 - XOR Data Science was apparently a 1982 reincorporation of a Huntington Beach-based - company previously known as Delta Products. At least some of the S-100 boards used - in XOR's systems were originally developed and documented under the former company - name. +XOR Data Science was apparently a 1982 reincorporation of a Huntington Beach-based +company previously known as Delta Products. At least some of the S-100 boards used +in XOR's systems were originally developed and documented under the former company +name. ***************************************************************************************************** - All input must be in upper case. - Summary of Monitor commands: - - D xxxx yyyy = dump memory to screen - F xxxx yyyy zz = fill memory from xxxx to yyyy-1 with zz - G xxxx = execute program at xxxx - H xxxx yyyy aa bb... = Search memory for a string of bytes - L xxxx = edit memory (. to exit) - M xxxx yyyy zzzz = Move (copy) memory - V xxxx = Ascii dump of memory to the screen (cr to continue, space to exit) - X n = Select a bank (0 works, others freeze) - - Note some of the commands are a bit buggy, eg F doesn't fill the last byte +All input must be in upper case. +Summary of Monitor commands: + +D xxxx yyyy = dump memory to screen +F xxxx yyyy zz = fill memory from xxxx to yyyy-1 with zz +G xxxx = execute program at xxxx +H xxxx yyyy aa bb... = Search memory for a string of bytes +L xxxx = edit memory (. to exit) +M xxxx yyyy zzzz = Move (copy) memory +R = Read cassette (not in all bios versions) +V xxxx = Ascii dump of memory to the screen (cr to continue, space to exit) +W = Write cassette (not in all bios versions) +X n = Select a bank (0 works, others freeze) +^C = Boot from floppy + +Note some of the commands are a bit buggy, eg F doesn't fill the last byte + + +TODO: +- Fix floppy. It needs to WAIT the cpu whenever port 0xFC is read, wait + for either DRQ or INTRQ to assert, then release the cpu and then do the + actual port read. Our Z80 cannot do that. +- The only available disks crash MAME when loaded. +- honor jumper settings +- CTC signal header +- serial printer +- cassette (no information, assumed to be on another card) *****************************************************************************************************/ -/* - - TODO: - - - cannot boot from floppy (at prompt press ^C, wait, it says 'Drive not ready') - - honor jumper settings - - CTC signal header - - serial printer - - cassette? (no mention of it in the manuals) - -*/ - #include "emu.h" #include "includes/xor100.h" @@ -157,16 +159,6 @@ READ8_MEMBER( xor100_state::prom_disable_r ) return 0xff; } -READ8_MEMBER( xor100_state::fdc_r ) -{ - return m_fdc->gen_r(offset) ^ 0xff; -} - -WRITE8_MEMBER( xor100_state::fdc_w ) -{ - m_fdc->gen_w(offset, data ^ 0xff); -} - READ8_MEMBER( xor100_state::fdc_wait_r ) { /* @@ -188,12 +180,11 @@ READ8_MEMBER( xor100_state::fdc_wait_r ) { if (!m_fdc_irq && !m_fdc_drq) { - fatalerror("Z80 WAIT not supported by MAME core\n"); m_maincpu->set_input_line(Z80_INPUT_LINE_BOGUSWAIT, ASSERT_LINE); } } - return !m_fdc_irq << 7; + return m_fdc_irq ? 0x7f : 0xff; } WRITE8_MEMBER( xor100_state::fdc_dcont_w ) @@ -276,7 +267,9 @@ void xor100_state::xor100_io(address_map &map) map(0x0a, 0x0a).r(FUNC(xor100_state::prom_disable_r)); map(0x0b, 0x0b).portr("DSW0").w(COM5016_TAG, FUNC(com8116_device::stt_str_w)); map(0x0c, 0x0f).rw(m_ctc, FUNC(z80ctc_device::read), FUNC(z80ctc_device::write)); - map(0xf8, 0xfb).rw(FUNC(xor100_state::fdc_r), FUNC(xor100_state::fdc_w)); + map(0xf8, 0xfb).lrw8("fdc", + [this](address_space &space, offs_t offset, u8 mem_mask) { return m_fdc->read(space, offset, mem_mask) ^ 0xff; }, + [this](address_space &space, offs_t offset, u8 data, u8 mem_mask) { m_fdc->write(space, offset, data ^ 0xff, mem_mask); }); map(0xfc, 0xfc).rw(FUNC(xor100_state::fdc_wait_r), FUNC(xor100_state::fdc_dcont_w)); map(0xfd, 0xfd).w(FUNC(xor100_state::fdc_dsel_w)); } @@ -429,10 +422,7 @@ void xor100_state::fdc_intrq_w(bool state) m_ctc->trg0(state); if (state) - { - fatalerror("Z80 WAIT not supported by MAME core\n"); - m_maincpu->set_input_line(Z80_INPUT_LINE_BOGUSWAIT, ASSERT_LINE); - } + m_maincpu->set_input_line(Z80_INPUT_LINE_WAIT, CLEAR_LINE); } void xor100_state::fdc_drq_w(bool state) @@ -440,22 +430,10 @@ void xor100_state::fdc_drq_w(bool state) m_fdc_drq = state; if (state) - { - fatalerror("Z80 WAIT not supported by MAME core\n"); - m_maincpu->set_input_line(Z80_INPUT_LINE_BOGUSWAIT, ASSERT_LINE); - } + m_maincpu->set_input_line(Z80_INPUT_LINE_WAIT, CLEAR_LINE); } -static DEVICE_INPUT_DEFAULTS_START( terminal ) - DEVICE_INPUT_DEFAULTS( "RS232_TXBAUD", 0xff, RS232_BAUD_9600 ) - DEVICE_INPUT_DEFAULTS( "RS232_RXBAUD", 0xff, RS232_BAUD_9600 ) - DEVICE_INPUT_DEFAULTS( "RS232_STARTBITS", 0xff, RS232_STARTBITS_1 ) - DEVICE_INPUT_DEFAULTS( "RS232_DATABITS", 0xff, RS232_DATABITS_8 ) - DEVICE_INPUT_DEFAULTS( "RS232_PARITY", 0xff, RS232_PARITY_NONE ) - DEVICE_INPUT_DEFAULTS( "RS232_STOPBITS", 0xff, RS232_STOPBITS_1 ) -DEVICE_INPUT_DEFAULTS_END - static void xor100_s100_cards(device_slot_interface &device) { } @@ -526,7 +504,6 @@ MACHINE_CONFIG_START(xor100_state::xor100) MCFG_RS232_RXD_HANDLER(WRITELINE(I8251_B_TAG, i8251_device, write_rxd)) MCFG_RS232_DSR_HANDLER(WRITELINE(I8251_B_TAG, i8251_device, write_dsr)) MCFG_RS232_CTS_HANDLER(WRITELINE(I8251_B_TAG, i8251_device, write_cts)) - MCFG_SLOT_OPTION_DEVICE_INPUT_DEFAULTS("terminal", terminal) com8116_device &brg(COM8116(config, COM5016_TAG, 5.0688_MHz_XTAL)); brg.fr_handler().set(m_uart_a, FUNC(i8251_device::write_txc)); @@ -589,4 +566,4 @@ ROM_END /* System Drivers */ // YEAR NAME PARENT COMPAT MACHINE INPUT STATE INIT COMPANY FULLNAME FLAGS -COMP( 1980, xor100, 0, 0, xor100, xor100, xor100_state, empty_init, "XOR Data Science", "XOR S-100-12", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +COMP( 1980, xor100, 0, 0, xor100, xor100, xor100_state, empty_init, "XOR Data Science", "XOR S-100-12", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) diff --git a/src/mame/drivers/y2.cpp b/src/mame/drivers/y2.cpp index f67b35e0957..a5eafc7a80f 100644 --- a/src/mame/drivers/y2.cpp +++ b/src/mame/drivers/y2.cpp @@ -81,8 +81,8 @@ MACHINE_CONFIG_START(system_board_y2_state::system_board_y2) SPEAKER(config, "mono").front_center(); MACHINE_CONFIG_END -ROM_START( kof2002um ) - ROM_REGION( 0x8000000, "boot", 0 ) // presumably the boot code (encrypted?) +ROM_START( kof2002um ) // The King of Fighters 复仇之路/Fùchóu zhī lù/Road to Revenge + ROM_REGION( 0x8000000, "boot", 0 ) // sound program only? or boot too? ROM_LOAD( "s29gl01gp11fcr2.u103", 0x0000000, 0x8000000, CRC(722cbad1) SHA1(0292be12255ee4bd586166a3f5cd108c5453295b) ) ROM_REGION( 0x42000000, "nand_u101", 0 ) // presumably accessed like a filesystem (encrypted) @@ -91,6 +91,18 @@ ROM_START( kof2002um ) ROM_LOAD( "nand08gw3b2cn6.u102", 0x00000000, 0x42000000, CRC(ac2dc586) SHA1(5168b4c0c6343b6c040a206da04fa7cdbc3b35b9) ) ROM_END +ROM_START( kof2002umj ) + ROM_REGION( 0x8000000, "boot", 0 ) // sound program only? or boot too? + ROM_LOAD( "s29gl01gp11fcr2.u103", 0x0000000, 0x8000000, CRC(916c9d68) SHA1(65c09f75b6a71b0d79a827c6829d1c05d8699a32) ) + + ROM_REGION( 0x42000000, "nand_u101", 0 ) // presumably accessed like a filesystem (encrypted) + ROM_LOAD( "nand08gw3b2cn6.u101", 0x00000000, 0x42000000, CRC(46e03f1d) SHA1(62d8eeb7513e851bf11a26a84b5d310270f3fcf6) ) + ROM_REGION( 0x42000000, "nand_u102", 0 ) + ROM_LOAD( "nand08gw3b2cn6.u102", 0x00000000, 0x42000000, CRC(db931dca) SHA1(1b1fc88732944e9ede09e584c7b07e28a59df3e2) ) +ROM_END + + /* The title screen shows "The King of Fighters - Road to Revenge" (Chinese / English) while the speech on the title screen announcer says "The King of Fighters 2002 Unlimited Match" There is a PS2 version with the Unlimited Match title screen, but unless it's used for a different region the arcade doesn't show that title, only announces it. */ -GAME( 2009, kof2002um, 0, system_board_y2, system_board_y2, system_board_y2_state, empty_init, ROT0, "SNK Playmore / New Channel", "The King of Fighters - Road to Revenge / The King of Fighters 2002 Unlimited Match", MACHINE_IS_SKELETON ) +GAME( 2009, kof2002um, 0, system_board_y2, system_board_y2, system_board_y2_state, empty_init, ROT0, "SNK Playmore / New Channel", "The King of Fighters - Fuchou Zhi Lu/Road to Revenge / The King of Fighters 2002 Unlimited Match (China)", MACHINE_IS_SKELETON ) // also Export? +GAME( 2009, kof2002umj, kof2002um, system_board_y2, system_board_y2, system_board_y2_state, empty_init, ROT0, "SNK Playmore", "The King of Fighters 2002 Unlimited Match (Japan)", MACHINE_IS_SKELETON ) diff --git a/src/mame/drivers/yunsung8.cpp b/src/mame/drivers/yunsung8.cpp index 89513172fe7..697f7664602 100644 --- a/src/mame/drivers/yunsung8.cpp +++ b/src/mame/drivers/yunsung8.cpp @@ -394,10 +394,10 @@ MACHINE_CONFIG_END /*************************************************************************** - Magix - +Magix Yun Sung, 1995 +YS-ROCK-970712 +-------------------------------------+ |VOL YM3014 6116 04| | M5205 400KHz 03| @@ -406,10 +406,10 @@ Yun Sung, 1995 | MCM2018AN45 | |J MCM2018AN45 | |A DSW1 +--------+ | -|M | | | -|M DSW2* | Quick | | -|A | Logic | | -| | | | +|M | Quick | | +|M DSW2* | Logic | | +|A |QL12x16B| | +| | OPL84C | | | U66 +--------+ 06| | HM6264 05| | 07 HM6264 | @@ -419,7 +419,7 @@ Yun Sung, 1995 Main CPU: Z80B Sound CPU: Z80A Sound: Yamaha YM3812 + Oki M5205 + YM3014 DAC - Video: QuickLogic FPGA - unknown type / model + Video: QuickLogic QL12x16B-OPL84C FPGA OSC: 16MHz + 400Khz resonator Memory: 2 x MCM2018AN45, 2 x HM6264, CXK5118PN-15L, GM76C28-10 & 6116 Misc: DSW1 is a 8 position dipswitch @@ -477,7 +477,7 @@ ROM_END /*************************************************************************** - Cannon Ball +Cannon Ball Yun Sung, 1995 Cannon Ball (vertical) @@ -557,28 +557,43 @@ ROM_END Rock Tris by Yunsung -Pcb marked Ys-rock 940712 - -pcb has no sound, the osc for the msm5205 has been cut so I don't know the frequency - -Pcb has no markings in the sockets and eproms have anonymous stickers +YS-ROCK-970712 ++-------------------------------------+ +|VOL YM3014 6116 04| +| M5205 400KHz 03| +| Z80A CXK5118PN-15L 02| +| 08 GM76C28-10 01| +| MCM2018AN45 | +|J MCM2018AN45 | +|A DSW1 +--------+ | +|M | Quick | | +|M DSW2* | Logic | | +|A |QL12x16B| | +| | OPL84C | | +| U66 +--------+ 06| +| HM6264 05| +| 07 HM6264 | +| Z80B YM3812 16MHz | ++-------------------------------------+ -2x z80 -1x 16mhz -1x UA010 -1x msm5205 -1x fpga -1x dipswitch (there is place for another one, but the space is empty and -they jumpered the first position) + Main CPU: Z80B +Sound CPU: Z80A + Sound: Yamaha YM3812 (marked as UA010) + Oki M5205 + YM3014 DAC + Video: QuickLogic QL12x16B-OPL84C FPGA + OSC: 16MHz + 400Khz resonator + Memory: 2 x MCM2018AN45, 2 x HM6264, CXK5118PN-15L, GM76C28-10 & 6116 + Misc: DSW1 is a 8 position dipswitch + DSW2 is not populated + VOL Volume pot ***************************************************************************/ ROM_START( rocktris ) ROM_REGION( 0x20000, "maincpu", 0 ) /* Main Z80 Code */ - ROM_LOAD( "cpu.bin", 0x00000, 0x20000, CRC(46e3b79c) SHA1(81a587b9f986c4e39b1888ec6ed6b86d1469b9a0) ) + ROM_LOAD( "cpu07.bin", 0x00000, 0x20000, CRC(46e3b79c) SHA1(81a587b9f986c4e39b1888ec6ed6b86d1469b9a0) ) ROM_REGION( 0x20000, "audiocpu", 0 ) /* Sound Z80 Code */ - ROM_LOAD( "cpu2.bin", 0x00000, 0x20000, CRC(3a78a4cf) SHA1(f643c7a217cbb71f3a03f1f4a16545c546332819) ) + ROM_LOAD( "cpu08.bin", 0x00000, 0x20000, CRC(3a78a4cf) SHA1(f643c7a217cbb71f3a03f1f4a16545c546332819) ) ROM_REGION( 0x200000, "bgfx", 0 ) /* Background */ ROM_LOAD( "gfx4.bin", 0x000000, 0x80000, CRC(abb49cac) SHA1(e2d766e950df398a8ec8b6888e128ffc3bdf1ce9) ) diff --git a/src/mame/includes/actfancr.h b/src/mame/includes/actfancr.h index 470306f3d4e..0907eb9e12b 100644 --- a/src/mame/includes/actfancr.h +++ b/src/mame/includes/actfancr.h @@ -15,19 +15,16 @@ class actfancr_state : public driver_device { public: - actfancr_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), - m_main_ram(*this, "main_ram"), + actfancr_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), m_audiocpu(*this, "audiocpu"), - m_tilegen1(*this, "tilegen1"), - m_tilegen2(*this, "tilegen2"), + m_tilegen(*this, "tilegen%u", 1U), m_spritegen(*this, "spritegen"), m_soundlatch(*this, "soundlatch") { } /* memory pointers */ - required_shared_ptr<uint8_t> m_main_ram; - uint16_t m_spriteram16[0x800/2]; // a 16-bit copy of spriteram for use with the MXC06 code + std::unique_ptr<uint16_t[]> m_spriteram16; // a 16-bit copy of spriteram for use with the MXC06 code /* misc */ int m_trio_control_select; @@ -35,17 +32,17 @@ public: /* devices */ required_device<h6280_device> m_maincpu; required_device<cpu_device> m_audiocpu; - required_device<deco_bac06_device> m_tilegen1; - required_device<deco_bac06_device> m_tilegen2; + required_device_array<deco_bac06_device, 2> m_tilegen; required_device<deco_mxc06_device> m_spritegen; required_device<generic_latch_8_device> m_soundlatch; DECLARE_WRITE8_MEMBER(triothep_control_select_w); DECLARE_READ8_MEMBER(triothep_control_r); - DECLARE_WRITE8_MEMBER(actfancr_buffer_spriteram_w); + DECLARE_WRITE8_MEMBER(buffer_spriteram_w); DECLARE_MACHINE_START(triothep); DECLARE_MACHINE_RESET(triothep); - uint32_t screen_update_actfancr(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + virtual void video_start() override; + uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); void triothep(machine_config &config); void actfancr(machine_config &config); void actfan_map(address_map &map); diff --git a/src/mame/includes/avigo.h b/src/mame/includes/avigo.h index f29810a6db5..e82c5425413 100644 --- a/src/mame/includes/avigo.h +++ b/src/mame/includes/avigo.h @@ -104,7 +104,7 @@ public: uint8_t m_bank1_h; uint8_t m_ad_control_status; uint16_t m_ad_value; - uint8_t * m_video_memory; + std::unique_ptr<uint8_t[]> m_video_memory; uint8_t m_screen_column; uint8_t m_warm_start; DECLARE_PALETTE_INIT(avigo); diff --git a/src/mame/includes/battlera.h b/src/mame/includes/battlera.h index e346c434618..f1bf7a6baa0 100644 --- a/src/mame/includes/battlera.h +++ b/src/mame/includes/battlera.h @@ -14,14 +14,14 @@ class battlera_state : public driver_device { public: battlera_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_audiocpu(*this, "audiocpu"), - m_msm(*this, "msm"), - m_screen(*this, "screen"), - m_huc6260(*this, "huc6260"), - m_soundlatch(*this, "soundlatch") - { } + : driver_device(mconfig, type, tag) + , m_maincpu(*this, "maincpu") + , m_audiocpu(*this, "audiocpu") + , m_msm(*this, "msm") + , m_screen(*this, "screen") + , m_huc6260(*this, "huc6260") + , m_soundlatch(*this, "soundlatch") + { } required_device<h6280_device> m_maincpu; required_device<h6280_device> m_audiocpu; @@ -34,7 +34,6 @@ public: int m_msm5205next; int m_toggle; - DECLARE_WRITE8_MEMBER(sound_w); DECLARE_WRITE8_MEMBER(control_data_w); DECLARE_READ8_MEMBER(control_data_r); DECLARE_WRITE8_MEMBER(adpcm_data_w); diff --git a/src/mame/includes/bebox.h b/src/mame/includes/bebox.h index 23f57d0f578..92cb69eafc3 100644 --- a/src/mame/includes/bebox.h +++ b/src/mame/includes/bebox.h @@ -11,6 +11,8 @@ #ifndef MAME_INCLUDES_BEBOX_H #define MAME_INCLUDES_BEBOX_H +#include "cpu/powerpc/ppc.h" + #include "machine/53c810.h" #include "machine/am9517a.h" #include "machine/idectrl.h" @@ -20,6 +22,7 @@ #include "machine/ram.h" #include "machine/upd765.h" #include "machine/intelfsh.h" + #include "bus/lpci/pci.h" @@ -33,13 +36,10 @@ public: bebox_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) - , m_ppc1(*this, "ppc1") - , m_ppc2(*this, "ppc2") + , m_ppc(*this, "ppc%u", 1U) , m_lsi53c810(*this, "lsi53c810") - , m_dma8237_1(*this, "dma8237_1") - , m_dma8237_2(*this, "dma8237_2") - , m_pic8259_1(*this, "pic8259_1") - , m_pic8259_2(*this, "pic8259_2") + , m_dma8237(*this, "dma8237_%u", 1U) + , m_pic8259(*this, "pic8259_%u", 1U) , m_pit8254(*this, "pit8254") , m_ram(*this, RAM_TAG) , m_smc37c78(*this, "smc37c78") @@ -48,13 +48,10 @@ public: { } - required_device<cpu_device> m_ppc1; - required_device<cpu_device> m_ppc2; + required_device_array<ppc_device, 2> m_ppc; required_device<lsi53c810_device> m_lsi53c810; - required_device<am9517a_device> m_dma8237_1; - required_device<am9517a_device> m_dma8237_2; - required_device<pic8259_device> m_pic8259_1; - required_device<pic8259_device> m_pic8259_2; + required_device_array<am9517a_device, 2> m_dma8237; + required_device_array<pic8259_device, 2> m_pic8259; required_device<pit8254_device> m_pit8254; required_device<ram_device> m_ram; required_device<smc37c78_device> m_smc37c78; @@ -113,18 +110,22 @@ public: DECLARE_WRITE_LINE_MEMBER( fdc_interrupt ); DECLARE_FLOPPY_FORMATS( floppy_formats ); - LSI53C810_FETCH_CB(scsi_fetch); - LSI53C810_IRQ_CB(scsi_irq_callback); - LSI53C810_DMA_CB(scsi_dma_callback); + uint32_t scsi_fetch(uint32_t dsp); + void scsi_irq_callback(int state); + void scsi_dma_callback(uint32_t src, uint32_t dst, int length, int byteswap); void bebox_set_irq_bit(unsigned int interrupt_bit, int val); void bebox_update_interrupts(); static void mpc105_config(device_t *device); + + pci_connector_device & add_pci_slot(machine_config &config, const char *tag, size_t index, const char *default_tag); + void bebox_peripherals(machine_config &config); void bebox(machine_config &config); void bebox2(machine_config &config); - void bebox_mem(address_map &map); - void bebox_slave_mem(address_map &map); + + void main_mem(address_map &map); + void slave_mem(address_map &map); protected: virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; diff --git a/src/mame/includes/bloodbro.h b/src/mame/includes/bloodbro.h index b7596f0d47a..a2df926c15d 100644 --- a/src/mame/includes/bloodbro.h +++ b/src/mame/includes/bloodbro.h @@ -48,7 +48,7 @@ public: DECLARE_WRITE16_MEMBER(layer_en_w); DECLARE_WRITE16_MEMBER(layer_scroll_w); DECLARE_WRITE16_MEMBER(weststry_layer_scroll_w); - DECLARE_WRITE8_MEMBER(weststry_soundlatch_w); + void weststry_soundlatch_w(offs_t offset, u8 data); DECLARE_WRITE_LINE_MEMBER(weststry_opl_irq_w); DECLARE_WRITE8_MEMBER(weststry_opl_w); DECLARE_WRITE8_MEMBER(weststry_soundnmi_ack_w); diff --git a/src/mame/includes/cabal.h b/src/mame/includes/cabal.h index 407ddfb11a0..b6f5a4dc960 100644 --- a/src/mame/includes/cabal.h +++ b/src/mame/includes/cabal.h @@ -47,7 +47,7 @@ public: DECLARE_WRITE16_MEMBER(text_videoram_w); // cabal specific - DECLARE_WRITE16_MEMBER(sound_irq_trigger_word_w); + void sound_irq_trigger_word_w(offs_t, u16 data, u16 mem_mask); // cabalbl specific DECLARE_WRITE16_MEMBER(cabalbl_sndcmd_w); diff --git a/src/mame/includes/concept.h b/src/mame/includes/concept.h index 9134df453e4..f9020299822 100644 --- a/src/mame/includes/concept.h +++ b/src/mame/includes/concept.h @@ -59,7 +59,7 @@ public: virtual void machine_start() override; virtual void machine_reset() override; virtual void video_start() override; - uint32_t screen_update_concept(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); DECLARE_READ8_MEMBER(via_in_a); DECLARE_WRITE8_MEMBER(via_out_a); diff --git a/src/mame/includes/dcon.h b/src/mame/includes/dcon.h index af6bcd1457b..d651a1262cf 100644 --- a/src/mame/includes/dcon.h +++ b/src/mame/includes/dcon.h @@ -44,7 +44,7 @@ private: uint16_t m_scroll_ram[6]; uint16_t m_layer_en; - DECLARE_READ8_MEMBER(sdgndmps_sound_comms_r); + u8 sdgndmps_sound_comms_r(offs_t offset); DECLARE_WRITE16_MEMBER(layer_en_w); DECLARE_WRITE16_MEMBER(layer_scroll_w); diff --git a/src/mame/includes/dec0.h b/src/mame/includes/dec0.h index 35fd39abe44..7992836f726 100644 --- a/src/mame/includes/dec0.h +++ b/src/mame/includes/dec0.h @@ -12,14 +12,12 @@ class dec0_state : public driver_device { public: - dec0_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), + dec0_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), m_audiocpu(*this, "audiocpu"), m_soundlatch(*this, "soundlatch"), - m_tilegen1(*this, "tilegen1"), - m_tilegen2(*this, "tilegen2"), - m_tilegen3(*this, "tilegen3"), + m_tilegen(*this, "tilegen%u", 1U), m_spritegen(*this, "spritegen"), m_palette(*this, "palette"), m_paletteram(*this, "palette"), @@ -30,7 +28,8 @@ public: m_ram(*this, "ram"), m_spriteram(*this, "spriteram"), m_robocop_shared_ram(*this, "robocop_shared"), - m_hippodrm_shared_ram(*this, "hippodrm_shared") { } + m_hippodrm_shared_ram(*this, "hippodrm_shared") + { } void dec0_base(machine_config &config); void dec0(machine_config &config); @@ -48,7 +47,6 @@ public: void robocopb(machine_config &config); void hippodrm(machine_config &config); - void init_robocop(); void init_hippodrm(); void init_hbarrel(); void init_slyspy(); @@ -63,9 +61,7 @@ protected: required_device<cpu_device> m_maincpu; required_device<cpu_device> m_audiocpu; required_device<generic_latch_8_device> m_soundlatch; - optional_device<deco_bac06_device> m_tilegen1; - optional_device<deco_bac06_device> m_tilegen2; - optional_device<deco_bac06_device> m_tilegen3; + optional_device_array<deco_bac06_device, 3> m_tilegen; optional_device<deco_mxc06_device> m_spritegen; required_device<palette_device> m_palette; required_shared_ptr<uint16_t> m_paletteram; @@ -145,10 +141,12 @@ private: void h6280_decrypt(const char *cputag); void dec0_map(address_map &map); void dec0_s_map(address_map &map); + void hippodrm_map(address_map &map); void hippodrm_sub_map(address_map &map); void midres_map(address_map &map); void midres_s_map(address_map &map); void midresb_map(address_map &map); + void robocop_map(address_map &map); void robocop_sub_map(address_map &map); void slyspy_map(address_map &map); void slyspy_protection_map(address_map &map); @@ -160,12 +158,10 @@ private: class dec0_automat_state : public dec0_state { public: - dec0_automat_state(const machine_config &mconfig, device_type type, const char *tag) - : dec0_state(mconfig, type, tag), - m_msm1(*this, "msm1"), - m_msm2(*this, "msm2"), - m_adpcm_select1(*this, "adpcm_select1"), - m_adpcm_select2(*this, "adpcm_select2"), + dec0_automat_state(const machine_config &mconfig, device_type type, const char *tag) : + dec0_state(mconfig, type, tag), + m_msm(*this, "msm%u", 1U), + m_adpcm_select(*this, "adpcm_select%u", 1U), m_soundbank(*this, "soundbank") { } @@ -174,14 +170,11 @@ public: void automat(machine_config &config); private: - required_device<msm5205_device> m_msm1; - required_device<msm5205_device> m_msm2; - required_device<ls157_device> m_adpcm_select1; - required_device<ls157_device> m_adpcm_select2; + required_device_array<msm5205_device, 2> m_msm; + required_device_array<ls157_device, 2> m_adpcm_select; required_memory_bank m_soundbank; - bool m_adpcm_toggle1; - bool m_adpcm_toggle2; + bool m_adpcm_toggle[2]; uint16_t m_automat_scroll_regs[4]; DECLARE_WRITE16_MEMBER(automat_control_w); diff --git a/src/mame/includes/deco32.h b/src/mame/includes/deco32.h index 745a0b478de..a97f1f1ae91 100644 --- a/src/mame/includes/deco32.h +++ b/src/mame/includes/deco32.h @@ -23,6 +23,7 @@ class deco32_state : public driver_device public: deco32_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) + , m_audiocpu(*this, "audiocpu") , m_sprgen(*this, "spritegen%u", 1) , m_deco_tilegen(*this, "tilegen%u", 1) , m_gfxdecode(*this, "gfxdecode") @@ -36,7 +37,6 @@ public: , m_oki(*this, "oki%u", 1) , m_soundlatch(*this, "soundlatch") , m_maincpu(*this, "maincpu") - , m_audiocpu(*this, "audiocpu") , m_pf_rowscroll32(*this, "pf%u_rowscroll32", 1) , m_generic_paletteram_32(*this, "paletteram") { } @@ -69,6 +69,7 @@ protected: DECLARE_WRITE32_MEMBER(buffered_palette_w); DECLARE_WRITE32_MEMBER(palette_dma_w); + optional_device<cpu_device> m_audiocpu; optional_device_array<decospr_device, 2> m_sprgen; required_device_array<deco16ic_device, 2> m_deco_tilegen; required_device<gfxdecode_device> m_gfxdecode; @@ -96,7 +97,6 @@ protected: private: required_device<cpu_device> m_maincpu; - optional_device<cpu_device> m_audiocpu; // we use the pointers below to store a 32-bit copy.. required_shared_ptr_array<uint32_t, 4> m_pf_rowscroll32; diff --git a/src/mame/includes/efdt.h b/src/mame/includes/efdt.h index b2e5df50d7e..e33b38f6b53 100644 --- a/src/mame/includes/efdt.h +++ b/src/mame/includes/efdt.h @@ -4,6 +4,7 @@ #ifndef MAME_INCLUDES_EFDT_H #define MAME_INCLUDES_EFDT_H +#include "machine/74259.h" #include "emupal.h" @@ -16,9 +17,8 @@ public: m_gfxdecode(*this, "gfxdecode"), m_palette(*this, "palette"), m_audiocpu(*this, "audiocpu"), - m_videoram(*this, "videoram", 8), - m_vregs1(*this, "vregs1"), - m_vregs2(*this, "vregs2") + m_vlatch(*this, "vlatch%u", 1U), + m_videoram(*this, "videoram", 8) { } void efdt(machine_config &config); @@ -28,11 +28,10 @@ private: required_device<gfxdecode_device> m_gfxdecode; required_device<palette_device> m_palette; optional_device<cpu_device> m_audiocpu; + required_device_array<ls259_device, 2> m_vlatch; /* memory pointers */ required_shared_ptr<uint8_t> m_videoram; - required_shared_ptr<uint8_t> m_vregs1; - required_shared_ptr<uint8_t> m_vregs2; uint8_t m_soundlatch[4]; uint8_t m_soundCommand; uint8_t m_soundControl; @@ -55,6 +54,9 @@ private: DECLARE_VIDEO_START(efdt); DECLARE_PALETTE_INIT(efdt); + DECLARE_WRITE_LINE_MEMBER(vblank_nmi_w); + DECLARE_WRITE_LINE_MEMBER(nmi_clear_w); + DECLARE_READ8_MEMBER(main_soundlatch_r); DECLARE_WRITE8_MEMBER(main_soundlatch_w); diff --git a/src/mame/includes/hng64.h b/src/mame/includes/hng64.h index 0e8ccfb1df7..777c273ff35 100644 --- a/src/mame/includes/hng64.h +++ b/src/mame/includes/hng64.h @@ -8,18 +8,10 @@ #include "sound/l7a1045_l6028_dsp_a.h" #include "video/poly.h" #include "cpu/tlcs870/tlcs870.h" +#include "machine/mb8421.h" #include "emupal.h" #include "screen.h" -enum -{ - FIGHT_MCU = 1, - SHOOT_MCU, - RACING_MCU, - SAMSHO_MCU, - BURIKI_MCU -}; - enum hng64trans_t { HNG64_TILEMAP_NORMAL = 1, @@ -144,13 +136,13 @@ public: m_maincpu(*this, "maincpu"), m_audiocpu(*this, "audiocpu"), m_iomcu(*this, "iomcu"), + m_dt7133_dpram(*this, "dt7133_dpram"), m_dsp(*this, "l7a1045"), m_comm(*this, "network"), m_rtc(*this, "rtc"), m_mainram(*this, "mainram"), m_cart(*this, "cart"), m_sysregs(*this, "sysregs"), - m_dualport(*this, "dualport"), m_rombase(*this, "rombase"), m_spriteram(*this, "spriteram"), m_spriteregs(*this, "spriteregs"), @@ -161,24 +153,19 @@ public: m_3d_1(*this, "3d_1"), m_3d_2(*this, "3d_2"), m_com_ram(*this, "com_ram"), - m_gfxdecode(*this, "gfxdecode") + m_gfxdecode(*this, "gfxdecode"), + m_intest(*this, "IN%u", 0U), + m_samsho64_3d_hack(0) {} void hng64(machine_config &config); void init_hng64_race(); - void init_fatfurwa(); - void init_buriki(); void init_hng64(); void init_hng64_shoot(); void init_ss64(); void init_hng64_fght(); - DECLARE_CUSTOM_INPUT_MEMBER(left_handle_r); - DECLARE_CUSTOM_INPUT_MEMBER(right_handle_r); - DECLARE_CUSTOM_INPUT_MEMBER(acc_down_r); - DECLARE_CUSTOM_INPUT_MEMBER(brake_down_r); - uint8_t *m_texturerom; required_device<screen_device> m_screen; required_device<palette_device> m_palette; @@ -187,6 +174,7 @@ private: required_device<mips3_device> m_maincpu; required_device<v53a_device> m_audiocpu; required_device<tmp87ph40an_device> m_iomcu; + required_device<mb8421_device> m_dt7133_dpram; required_device<l7a1045_sound_device> m_dsp; required_device<cpu_device> m_comm; required_device<msm6242_device> m_rtc; @@ -194,7 +182,6 @@ private: required_shared_ptr<uint32_t> m_mainram; required_shared_ptr<uint32_t> m_cart; required_shared_ptr<uint32_t> m_sysregs; - required_shared_ptr<uint32_t> m_dualport; required_shared_ptr<uint32_t> m_rombase; required_shared_ptr<uint32_t> m_spriteram; required_shared_ptr<uint32_t> m_spriteregs; @@ -212,7 +199,9 @@ private: required_device<gfxdecode_device> m_gfxdecode; - int m_mcu_type; + optional_ioport_array<8> m_intest; + + int m_samsho64_3d_hack; std::unique_ptr<uint16_t[]> m_soundram; std::unique_ptr<uint16_t[]> m_soundram2; @@ -226,7 +215,6 @@ private: int32_t m_dma_dst; int32_t m_dma_len; - uint32_t m_mcu_fake_time; uint16_t m_mcu_en; uint32_t m_activeDisplayList; @@ -270,12 +258,11 @@ private: DECLARE_READ8_MEMBER(hng64_com_share_mips_r); DECLARE_READ32_MEMBER(hng64_sysregs_r); DECLARE_WRITE32_MEMBER(hng64_sysregs_w); - DECLARE_READ32_MEMBER(fight_io_r); - DECLARE_READ32_MEMBER(samsho_io_r); - DECLARE_READ32_MEMBER(shoot_io_r); - DECLARE_READ32_MEMBER(racing_io_r); - DECLARE_READ32_MEMBER(hng64_dualport_r); - DECLARE_WRITE32_MEMBER(hng64_dualport_w); + + DECLARE_READ8_MEMBER(fake_io_r); + DECLARE_READ8_MEMBER(hng64_dualport_r); + DECLARE_WRITE8_MEMBER(hng64_dualport_w); + DECLARE_READ32_MEMBER(hng64_3d_1_r); DECLARE_READ32_MEMBER(hng64_3d_2_r); DECLARE_WRITE32_MEMBER(hng64_3d_1_w); @@ -305,23 +292,42 @@ private: DECLARE_READ8_MEMBER(hng64_comm_mmu_r); DECLARE_WRITE8_MEMBER(hng64_comm_mmu_w); + // shared ram access DECLARE_READ8_MEMBER(ioport0_r); - DECLARE_READ8_MEMBER(ioport1_r); - DECLARE_READ8_MEMBER(ioport2_r); - DECLARE_READ8_MEMBER(ioport3_r); - DECLARE_READ8_MEMBER(ioport4_r); - DECLARE_READ8_MEMBER(ioport5_r); - DECLARE_READ8_MEMBER(ioport6_r); - DECLARE_READ8_MEMBER(ioport7_r); - DECLARE_WRITE8_MEMBER(ioport0_w); - DECLARE_WRITE8_MEMBER(ioport1_w); - DECLARE_WRITE8_MEMBER(ioport2_w); + DECLARE_WRITE8_MEMBER(ioport7_w); + + // input port access + DECLARE_READ8_MEMBER(ioport3_r); DECLARE_WRITE8_MEMBER(ioport3_w); + DECLARE_WRITE8_MEMBER(ioport1_w); + + // unknown access DECLARE_WRITE8_MEMBER(ioport4_w); - DECLARE_WRITE8_MEMBER(ioport5_w); - DECLARE_WRITE8_MEMBER(ioport6_w); - DECLARE_WRITE8_MEMBER(ioport7_w); + + // analog input access + DECLARE_READ8_MEMBER(anport0_r); + DECLARE_READ8_MEMBER(anport1_r); + DECLARE_READ8_MEMBER(anport2_r); + DECLARE_READ8_MEMBER(anport3_r); + DECLARE_READ8_MEMBER(anport4_r); + DECLARE_READ8_MEMBER(anport5_r); + DECLARE_READ8_MEMBER(anport6_r); + DECLARE_READ8_MEMBER(anport7_r); + + DECLARE_WRITE_LINE_MEMBER( sio0_w ); + + uint8_t m_port7; + uint8_t m_port1; + + int m_ex_ramaddr; + int m_ex_ramaddr_upper; + + TIMER_CALLBACK_MEMBER(tempio_irqon_callback); + TIMER_CALLBACK_MEMBER(tempio_irqoff_callback); + emu_timer *m_tempio_irqon_timer; + emu_timer *m_tempio_irqoff_timer; + void init_io(); void init_hng64_reorder_gfx(); diff --git a/src/mame/includes/interpro.h b/src/mame/includes/interpro.h index 0dac4f4403b..0df07883eac 100644 --- a/src/mame/includes/interpro.h +++ b/src/mame/includes/interpro.h @@ -79,6 +79,7 @@ public: , m_scsibus(*this, INTERPRO_SCSI_TAG) , m_eth(*this, INTERPRO_ETH_TAG) , m_ioga(*this, INTERPRO_IOGA_TAG) + , m_keyboard(*this, INTERPRO_KEYBOARD_PORT_TAG) , m_diag_led(*this, "digit0") { } @@ -96,6 +97,8 @@ public: required_device<i82586_base_device> m_eth; required_device<interpro_ioga_device> m_ioga; + required_device<interpro_keyboard_port_device> m_keyboard; + void init_common(); virtual DECLARE_READ32_MEMBER(unmapped_r); diff --git a/src/mame/includes/itech32.h b/src/mame/includes/itech32.h index fc8a4835007..255e64480c0 100644 --- a/src/mame/includes/itech32.h +++ b/src/mame/includes/itech32.h @@ -7,9 +7,11 @@ **************************************************************************/ +#include "machine/6522via.h" #include "machine/nvram.h" #include "machine/ticket.h" #include "machine/timekpr.h" +#include "sound/es5506.h" #include "emupal.h" #include "screen.h" @@ -27,8 +29,8 @@ public: : driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), m_soundcpu(*this, "soundcpu"), - m_dsp1(*this, "dsp1"), - m_dsp2(*this, "dsp2"), + m_via(*this, "via6522_0"), + m_ensoniq(*this, "ensoniq"), m_screen(*this, "screen"), m_palette(*this, "palette"), m_ticket(*this, "ticket"), @@ -36,17 +38,13 @@ public: m_main_ram(*this, "main_ram", 0), m_nvram(*this, "nvram", 0), m_video(*this, "video", 0), - m_main_rom(*this, "main_rom", 0), - m_drivedge_zbuf_control(*this, "drivedge_zctl"), - m_tms1_boot(*this, "tms1_boot"), - m_tms1_ram(*this, "tms1_ram"), - m_tms2_ram(*this, "tms2_ram"), - m_leds(*this, "led%u", 0U) + m_main_rom(*this, "main_rom", 0) { } + void base_devices(machine_config &config); + void via(machine_config &config); void tourny(machine_config &config); void sftm(machine_config &config); - void drivedge(machine_config &config); void bloodstm(machine_config &config); void timekill(machine_config &config); @@ -59,7 +57,6 @@ public: void init_wcbowln(); void init_gt2kp(); void init_sftm(); - void init_drivedge(); void init_wcbowl(); void init_wcbowlj(); void init_aamat(); @@ -71,11 +68,11 @@ public: DECLARE_CUSTOM_INPUT_MEMBER(special_port_r); -private: +protected: required_device<cpu_device> m_maincpu; required_device<cpu_device> m_soundcpu; - optional_device<cpu_device> m_dsp1; - optional_device<cpu_device> m_dsp2; + required_device<via6522_device> m_via; + required_device<es5506_device> m_ensoniq; required_device<screen_device> m_screen; required_device<palette_device> m_palette; required_device<ticket_dispenser_device> m_ticket; @@ -85,23 +82,18 @@ private: optional_shared_ptr<uint16_t> m_nvram; optional_shared_ptr<uint16_t> m_video; optional_shared_ptr<uint16_t> m_main_rom; - optional_shared_ptr<uint32_t> m_drivedge_zbuf_control; - optional_shared_ptr<uint32_t> m_tms1_boot; - optional_shared_ptr<uint32_t> m_tms1_ram; - optional_shared_ptr<uint32_t> m_tms2_ram; - output_finder<4> m_leds; - void nvram_init(nvram_device &nvram, void *base, size_t length); + virtual void nvram_init(nvram_device &nvram, void *base, size_t length); std::unique_ptr<uint16_t[]> m_videoram; uint8_t m_vint_state; uint8_t m_xint_state; uint8_t m_qint_state; + uint8_t m_irq_base; uint8_t m_sound_data; uint8_t m_sound_return; uint8_t m_sound_int_state; offs_t m_itech020_prot_address; - uint8_t m_tms_spinning[2]; int m_special_result; int m_p1_effx; int m_p1_effy; @@ -126,7 +118,6 @@ private: uint16_t *m_videoplane[2]; // configuration at init time - int m_is_drivedge; uint8_t m_planes; uint16_t m_vram_height; uint32_t m_vram_mask; @@ -143,8 +134,6 @@ private: DECLARE_READ32_MEMBER(trackball32_4bit_p1_r); DECLARE_READ32_MEMBER(trackball32_4bit_p2_r); DECLARE_READ32_MEMBER(trackball32_4bit_combined_r); - DECLARE_READ32_MEMBER(drivedge_steering_r); - DECLARE_READ32_MEMBER(drivedge_gas_r); DECLARE_READ16_MEMBER(wcbowl_prot_result_r); DECLARE_READ32_MEMBER(itech020_prot_result_r); DECLARE_READ32_MEMBER(gt2kp_prot_result_r); @@ -157,14 +146,6 @@ private: DECLARE_WRITE8_MEMBER(sound_return_w); DECLARE_READ8_MEMBER(sound_data_buffer_r); DECLARE_WRITE8_MEMBER(firq_clear_w); - DECLARE_WRITE32_MEMBER(tms_reset_assert_w); - DECLARE_WRITE32_MEMBER(tms_reset_clear_w); - DECLARE_WRITE32_MEMBER(tms1_68k_ram_w); - DECLARE_WRITE32_MEMBER(tms2_68k_ram_w); - DECLARE_WRITE32_MEMBER(tms1_trigger_w); - DECLARE_WRITE32_MEMBER(tms2_trigger_w); - DECLARE_READ32_MEMBER(drivedge_tms1_speedup_r); - DECLARE_READ32_MEMBER(drivedge_tms2_speedup_r); DECLARE_WRITE32_MEMBER(int1_ack32_w); DECLARE_WRITE16_MEMBER(timekill_colora_w); DECLARE_WRITE16_MEMBER(timekill_colorbc_w); @@ -172,7 +153,6 @@ private: DECLARE_WRITE16_MEMBER(bloodstm_color1_w); DECLARE_WRITE16_MEMBER(bloodstm_color2_w); DECLARE_WRITE16_MEMBER(bloodstm_plane_w); - DECLARE_WRITE32_MEMBER(drivedge_color0_w); DECLARE_WRITE32_MEMBER(itech020_color1_w); DECLARE_WRITE32_MEMBER(itech020_color2_w); DECLARE_WRITE32_MEMBER(itech020_plane_w); @@ -182,16 +162,12 @@ private: DECLARE_WRITE16_MEMBER(bloodstm_video_w); DECLARE_READ16_MEMBER(bloodstm_video_r); DECLARE_WRITE32_MEMBER(itech020_video_w); - DECLARE_WRITE32_MEMBER(drivedge_zbuf_control_w); DECLARE_READ32_MEMBER(itech020_video_r); - DECLARE_WRITE8_MEMBER(drivedge_portb_out); - DECLARE_WRITE_LINE_MEMBER(drivedge_turbo_light); DECLARE_WRITE8_MEMBER(pia_portb_out); virtual void machine_start() override; virtual void machine_reset() override; virtual void video_start() override; - DECLARE_MACHINE_RESET(drivedge); void init_program_rom(); void init_sftm_common(int prot_addr); void init_shuffle_bowl_common(int prot_addr); @@ -205,24 +181,87 @@ private: inline offs_t compute_safe_address(int x, int y); inline void disable_clipping(); inline void enable_clipping(); - void logblit(const char *tag); + virtual void logblit(const char *tag); void update_interrupts(int fast); void draw_raw(uint16_t *base, uint16_t color); - void draw_raw_drivedge(uint16_t *base, uint16_t *zbase, uint16_t color); + virtual void command_blit_raw(); + virtual void command_shift_reg(); inline void draw_rle_fast(uint16_t *base, uint16_t color); inline void draw_rle_fast_xflip(uint16_t *base, uint16_t color); inline void draw_rle_slow(uint16_t *base, uint16_t color); void draw_rle(uint16_t *base, uint16_t color); - void shiftreg_clear(uint16_t *base, uint16_t *zbase); + virtual void shiftreg_clear(uint16_t *base, uint16_t *zbase); void handle_video_command(); - inline int determine_irq_state(int vint, int xint, int qint); - void itech32_update_interrupts(int vint, int xint, int qint); + void update_interrupts(int vint, int xint, int qint); void bloodstm_map(address_map &map); - void drivedge_map(address_map &map); - void drivedge_tms1_map(address_map &map); - void drivedge_tms2_map(address_map &map); void itech020_map(address_map &map); void sound_020_map(address_map &map); void sound_map(address_map &map); void timekill_map(address_map &map); }; + +class drivedge_state : public itech32_state +{ +public: + drivedge_state(const machine_config &mconfig, device_type type, const char *tag) + : itech32_state(mconfig, type, tag), + m_dsp1(*this, "dsp1"), + m_dsp2(*this, "dsp2"), + m_zbuf_control(*this, "zctl"), + m_tms1_boot(*this, "tms1_boot"), + m_tms1_ram(*this, "tms1_ram"), + m_tms2_ram(*this, "tms2_ram"), + m_leds(*this, "led%u", 0U), + m_steer(*this, "STEER"), + m_gas(*this, "GAS") + { } + + void drivedge(machine_config &config); + + virtual void driver_init() override; + +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + + DECLARE_READ32_MEMBER(steering_r); + DECLARE_READ32_MEMBER(gas_r); + + DECLARE_READ32_MEMBER(tms1_speedup_r); + DECLARE_READ32_MEMBER(tms2_speedup_r); + DECLARE_WRITE32_MEMBER(tms_reset_assert_w); + DECLARE_WRITE32_MEMBER(tms_reset_clear_w); + DECLARE_WRITE32_MEMBER(tms1_68k_ram_w); + DECLARE_WRITE32_MEMBER(tms2_68k_ram_w); + DECLARE_WRITE32_MEMBER(tms1_trigger_w); + DECLARE_WRITE32_MEMBER(tms2_trigger_w); + + DECLARE_WRITE32_MEMBER(color0_w); + DECLARE_WRITE32_MEMBER(zbuf_control_w); + + DECLARE_WRITE8_MEMBER(portb_out); + DECLARE_WRITE_LINE_MEMBER(turbo_light); + + void main_map(address_map &map); + void tms1_map(address_map &map); + void tms2_map(address_map &map); + virtual void nvram_init(nvram_device &nvram, void *base, size_t length) override; + + virtual void logblit(const char *tag) override; + virtual void shiftreg_clear(uint16_t *base, uint16_t *zbase) override; + virtual void command_blit_raw() override; + virtual void command_shift_reg() override; + void draw_raw(uint16_t *base, uint16_t *zbase, uint16_t color); + + required_device<cpu_device> m_dsp1; + required_device<cpu_device> m_dsp2; + required_shared_ptr<uint32_t> m_zbuf_control; + required_shared_ptr<uint32_t> m_tms1_boot; + required_shared_ptr<uint32_t> m_tms1_ram; + required_shared_ptr<uint32_t> m_tms2_ram; + output_finder<4> m_leds; + required_ioport m_steer; + required_ioport m_gas; + + uint8_t m_tms_spinning[2]; +}; diff --git a/src/mame/includes/itech8.h b/src/mame/includes/itech8.h index 7e98f201e3d..d031b64ecc2 100644 --- a/src/mame/includes/itech8.h +++ b/src/mame/includes/itech8.h @@ -31,7 +31,6 @@ public: m_fakey(*this, "FAKEY"), m_visarea(0, 0, 0, 0) { } - void grmatch(machine_config &config); void rimrockn(machine_config &config); void gtg2(machine_config &config); void slikshot_lo(machine_config &config); @@ -46,7 +45,6 @@ public: void hstennis_hi(machine_config &config); void init_rimrockn(); - void init_grmatch(); void init_peggle(); void init_slikshot(); void init_neckneck(); @@ -57,7 +55,7 @@ public: DECLARE_CUSTOM_INPUT_MEMBER(special_r); DECLARE_CUSTOM_INPUT_MEMBER(gtg_mux); -private: +protected: static constexpr uint32_t YBUFFER_COUNT = 15; static constexpr uint32_t VRAM_SIZE = 0x40000; static constexpr uint32_t VRAM_MASK = VRAM_SIZE - 1; @@ -68,7 +66,8 @@ private: TIMER_BEHIND_BEAM_UPDATE, TIMER_DELAYED_SOUND_DATA, TIMER_BLITTER_DONE, - TIMER_DELAYED_Z80_CONTROL + TIMER_DELAYED_Z80_CONTROL, + TIMER_BASE_LAST = TIMER_DELAYED_Z80_CONTROL }; required_device<cpu_device> m_maincpu; @@ -116,9 +115,6 @@ private: uint8_t m_fetch_rle_literal; uint8_t *m_grom_base; uint32_t m_grom_size; - uint8_t m_grmatch_palcontrol; - uint8_t m_grmatch_xscroll; - rgb_t m_grmatch_palette[2][16]; emu_timer *m_irq_off_timer; emu_timer *m_behind_beam_update_timer; emu_timer *m_delayed_sound_data_timer; @@ -141,8 +137,6 @@ private: DECLARE_WRITE8_MEMBER(blitter_w); DECLARE_WRITE8_MEMBER(tms34061_w); DECLARE_READ8_MEMBER(tms34061_r); - DECLARE_WRITE8_MEMBER(grmatch_palette_w); - DECLARE_WRITE8_MEMBER(grmatch_xscroll_w); DECLARE_WRITE8_MEMBER(pia_porta_out); DECLARE_WRITE8_MEMBER(ym2203_portb_out); @@ -153,7 +147,6 @@ private: DECLARE_MACHINE_START(sstrike); uint32_t screen_update_2layer(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); - uint32_t screen_update_grmatch(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); uint32_t screen_update_slikshot(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); uint32_t screen_update_2page(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); uint32_t screen_update_2page_large(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); @@ -164,7 +157,6 @@ private: TIMER_CALLBACK_MEMBER(behind_the_beam_update); TIMER_CALLBACK_MEMBER(delayed_sound_data_w); TIMER_CALLBACK_MEMBER(blitter_done); - TIMER_DEVICE_CALLBACK_MEMBER(grmatch_palette_update); inline uint8_t fetch_next_raw(); inline void consume_raw(int count); @@ -205,6 +197,7 @@ private: void itech8_sound_ym2608b(machine_config &config); void itech8_sound_ym3812(machine_config &config); void itech8_sound_ym3812_external(machine_config &config); + void itech8_core_devices(machine_config &config); void itech8_core_lo(machine_config &config); void itech8_core_hi(machine_config &config); void gtg2_map(address_map &map); @@ -220,3 +213,40 @@ private: virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; }; + +class grmatch_state : public itech8_state +{ +public: + grmatch_state(const machine_config &mconfig, device_type type, const char *tag) + : itech8_state(mconfig, type, tag), + m_palette_timer(nullptr) + { + } + + void grmatch(machine_config &config); + + void driver_init() override; + +protected: + void machine_start() override; + void machine_reset() override; + + enum + { + TIMER_PALETTE = TIMER_BASE_LAST+1, + }; + + virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; + + DECLARE_WRITE8_MEMBER(palette_w); + DECLARE_WRITE8_MEMBER(xscroll_w); + + uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + + void palette_update(); + + emu_timer *m_palette_timer; + uint8_t m_palcontrol; + uint8_t m_xscroll; + rgb_t m_palette[2][16]; +}; diff --git a/src/mame/includes/kc.h b/src/mame/includes/kc.h index 22725e31b26..c5df7463c58 100644 --- a/src/mame/includes/kc.h +++ b/src/mame/includes/kc.h @@ -134,7 +134,7 @@ public: // driver state uint8_t * m_ram_base; - uint8_t * m_video_ram; + std::unique_ptr<uint8_t[]> m_video_ram; int m_pio_data[2]; int m_high_resolution; uint8_t m_ardy; diff --git a/src/mame/includes/legionna.h b/src/mame/includes/legionna.h index fb3a2f86dca..a9924910073 100644 --- a/src/mame/includes/legionna.h +++ b/src/mame/includes/legionna.h @@ -80,7 +80,7 @@ private: DECLARE_WRITE16_MEMBER(legionna_midground_w); DECLARE_WRITE16_MEMBER(legionna_foreground_w); DECLARE_WRITE16_MEMBER(legionna_text_w); - DECLARE_READ8_MEMBER(denjinmk_sound_comms_r); + u8 denjinmk_sound_comms_r(offs_t offset); DECLARE_WRITE8_MEMBER(godzilla_oki_bank_w); DECLARE_WRITE16_MEMBER(denjinmk_setgfxbank); DECLARE_WRITE16_MEMBER(heatbrl_setgfxbank); diff --git a/src/mame/includes/lisa.h b/src/mame/includes/lisa.h index 6a0b736e537..330b764f6a1 100644 --- a/src/mame/includes/lisa.h +++ b/src/mame/includes/lisa.h @@ -11,6 +11,7 @@ #ifndef MAME_INCLUDES_LISA_H #define MAME_INCLUDES_LISA_H +#include "cpu/m6502/m6504.h" #include "cpu/m68000/m68000.h" #include "machine/74259.h" #include "machine/6522via.h" @@ -114,6 +115,7 @@ public: m_speaker(*this, "speaker"), m_nvram(*this, "nvram"), m_latch(*this, "latch"), + m_fdc_cpu(*this,"fdccpu"), m_fdc_rom(*this,"fdc_rom"), m_fdc_ram(*this,"fdc_ram"), m_io_line0(*this, "LINE0"), @@ -147,6 +149,7 @@ private: required_device<speaker_sound_device> m_speaker; required_device<nvram_device> m_nvram; required_device<ls259_device> m_latch; + required_device<m6504_device> m_fdc_cpu; required_shared_ptr<uint8_t> m_fdc_rom; required_shared_ptr<uint8_t> m_fdc_ram; diff --git a/src/mame/includes/m72.h b/src/mame/includes/m72.h index 14ea8f00f52..d8acdd078bb 100644 --- a/src/mame/includes/m72.h +++ b/src/mame/includes/m72.h @@ -12,6 +12,7 @@ #include "audio/m72.h" #include "sound/dac.h" +#include "machine/mb8421.h" #include "machine/pic8259.h" #include "machine/upd4701.h" #include "emupal.h" @@ -37,6 +38,7 @@ public: m_maincpu(*this, "maincpu"), m_soundcpu(*this, "soundcpu"), m_mcu(*this, "mcu"), + m_dpram(*this, "dpram"), m_dac(*this, "dac"), m_audio(*this, "m72"), m_gfxdecode(*this, "gfxdecode"), @@ -90,6 +92,7 @@ private: required_device<cpu_device> m_maincpu; required_device<cpu_device> m_soundcpu; optional_device<cpu_device> m_mcu; + optional_device<mb8421_mb8431_16_device> m_dpram; optional_device<dac_byte_interface> m_dac; optional_device<m72_audio_device> m_audio; required_device<gfxdecode_device> m_gfxdecode; @@ -131,7 +134,6 @@ private: uint16_t m_m82_tmcontrol; // m72_i8751 specific - uint8_t m_mcu_snd_cmd_latch; uint8_t m_mcu_sample_latch; uint32_t m_mcu_sample_addr; @@ -151,8 +153,6 @@ private: DECLARE_WRITE8_MEMBER(mcu_data_w); DECLARE_READ8_MEMBER(mcu_data_r); DECLARE_READ8_MEMBER(mcu_sample_r); - DECLARE_WRITE8_MEMBER(mcu_ack_w); - DECLARE_READ8_MEMBER(mcu_snd_r); DECLARE_WRITE8_MEMBER(mcu_port1_w); DECLARE_WRITE8_MEMBER(mcu_port3_w); DECLARE_WRITE8_MEMBER(mcu_low_w); @@ -208,7 +208,7 @@ private: TIMER_CALLBACK_MEMBER(scanline_interrupt); TIMER_CALLBACK_MEMBER(kengo_scanline_interrupt); TIMER_CALLBACK_MEMBER(delayed_ram16_w); - + TIMER_CALLBACK_MEMBER(delayed_ram8_w); uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); uint32_t screen_update_m81(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); @@ -229,7 +229,9 @@ private: void kengo_map(address_map &map); void m72_cpu1_common_map(address_map &map); void m72_map(address_map &map); + void m72_protected_map(address_map &map); void m72_portmap(address_map &map); + void m72_protected_portmap(address_map &map); void m81_cpu1_common_map(address_map &map); void m81_portmap(address_map &map); void m82_map(address_map &map); diff --git a/src/mame/includes/mac.h b/src/mame/includes/mac.h index 10764e03750..3bba73a8bb9 100644 --- a/src/mame/includes/mac.h +++ b/src/mame/includes/mac.h @@ -99,19 +99,34 @@ public: { } + void add_mackbd(machine_config &config); + void add_scsi(machine_config &config, bool cdrom = false); + void add_base_devices(machine_config &config, bool rtc = true, bool super_woz = false); + void add_asc(machine_config &config, asc_device::asc_type type = asc_device::asc_type::ASC); + void add_macplus_additions(machine_config &config); + void add_nubus(machine_config &config, bool bank1 = true, bool bank2 = true); + template <typename T> void add_nubus_pds(machine_config &config, const char *slot_tag, T &&opts); + void add_via1_adb(machine_config &config, bool macii); + void add_via2(machine_config &config); + void add_pb1xx_vias(machine_config &config); + void add_pb1xx_screen(machine_config &config); + void add_egret(machine_config &config, int type); + void add_cuda(machine_config &config, int type); + + void mac512ke_base(machine_config &config); void mac512ke(machine_config &config); void macplus(machine_config &config); - void maclc(machine_config &config); + void maclc(machine_config &config, bool cpu = true, bool egret = true, asc_device::asc_type asc_type = asc_device::asc_type::V8); void macpb170(machine_config &config); void macclasc(machine_config &config); void maciisi(machine_config &config); - void maclc2(machine_config &config); + void maclc2(machine_config &config, bool egret = true); void macse(machine_config &config); - void maclc3(machine_config &config); + void maclc3(machine_config &config, bool egret = true); void macpd210(machine_config &config); void maciici(machine_config &config); void macprtb(machine_config &config); - void maciix(machine_config &config); + void maciix(machine_config &config, bool nubus_bank1 = true, bool nubus_bank2 = true); void maclc520(machine_config &config); void pwrmac(machine_config &config); void maciivx(machine_config &config); @@ -127,7 +142,8 @@ public: void maciifx(machine_config &config); void macpb140(machine_config &config); void macclas2(machine_config &config); - void macii(machine_config &config); + void macii(machine_config &config, bool cpu = true, asc_device::asc_type asc_type = asc_device::asc_type::ASC, + bool nubus = true, bool nubus_bank1 = true, bool nubus_bank2 = true); void maciihmu(machine_config &config); void init_maclc2(); @@ -287,7 +303,6 @@ private: TIMER_CALLBACK_MEMBER(overlay_timeout_func); DECLARE_READ32_MEMBER(rom_switch_r); - TIMER_DEVICE_CALLBACK_MEMBER(mac_scanline); bool m_snd_enable; bool m_main_buffer; int m_snd_vol; @@ -514,10 +529,11 @@ private: emu_timer *m_scanline_timer; emu_timer *m_adb_timer; + void palette_init_mac(palette_device &palette); + void palette_init_macgsc(palette_device &palette); + DECLARE_VIDEO_START(mac); - DECLARE_PALETTE_INIT(mac); DECLARE_VIDEO_START(macprtb); - DECLARE_PALETTE_INIT(macgsc); DECLARE_VIDEO_START(macsonora); DECLARE_VIDEO_RESET(macrbv); DECLARE_VIDEO_START(macdafb); diff --git a/src/mame/includes/model2.h b/src/mame/includes/model2.h index 4fed6b0a84c..c69b2fe143d 100644 --- a/src/mame/includes/model2.h +++ b/src/mame/includes/model2.h @@ -185,6 +185,10 @@ protected: DECLARE_WRITE32_MEMBER(model2_serial_w); DECLARE_WRITE16_MEMBER(horizontal_sync_w); DECLARE_WRITE16_MEMBER(vertical_sync_w); + DECLARE_READ32_MEMBER(doa_prot_r); + DECLARE_READ32_MEMBER(doa_unk_r); + void sega_0229_map(address_map &map); + int m_prot_a; void raster_init(memory_region *texture_rom); void geo_init(memory_region *polygon_rom); @@ -230,6 +234,7 @@ protected: void geo_sharc_map(address_map &map); void model2_base_mem(address_map &map); void model2_5881_mem(address_map &map); + void model2_0229_mem(address_map &map); void model2_snd(address_map &map); void debug_init(); @@ -469,6 +474,7 @@ public: protected: void model2a_crx_mem(address_map &map); void model2a_5881_mem(address_map &map); + void model2a_0229_mem(address_map &map); }; /***************************** @@ -509,6 +515,7 @@ protected: void model2b_crx_mem(address_map &map); void model2b_5881_mem(address_map &map); + void model2b_0229_mem(address_map &map); // TODO: split into own class void rchase2_iocpu_map(address_map &map); void rchase2_ioport_map(address_map &map); diff --git a/src/mame/includes/model3.h b/src/mame/includes/model3.h index 711dcfb6c24..0f78150264a 100644 --- a/src/mame/includes/model3.h +++ b/src/mame/includes/model3.h @@ -85,6 +85,14 @@ public: m_step20_with_old_real3d = false; } + void add_cpu_66mhz(machine_config &config); + void add_cpu_100mhz(machine_config &config); + void add_cpu_166mhz(machine_config &config); + + void add_base_devices(machine_config &config); + void add_scsi_devices(machine_config &config); + void add_crypt_devices(machine_config &config); + void model3_21_5881(machine_config &config); void model3_20_5881(machine_config &config); void model3_15(machine_config &config); @@ -153,6 +161,7 @@ private: int m_sound_irq_enable; emu_timer *m_sound_timer; emu_timer *m_real3d_dma_timer; + emu_timer *m_scan_timer; uint8_t m_irq_enable; uint8_t m_irq_state; uint8_t m_scsi_irq_state; @@ -294,12 +303,13 @@ private: DECLARE_MACHINE_RESET(model3_21); TIMER_CALLBACK_MEMBER(model3_sound_timer_tick); TIMER_CALLBACK_MEMBER(real3d_dma_timer_callback); + TIMER_CALLBACK_MEMBER(model3_scan_timer_tick); TIMER_DEVICE_CALLBACK_MEMBER(model3_interrupt); void model3_exit(); DECLARE_WRITE8_MEMBER(scsp_irq); - LSI53C810_DMA_CB(real3d_dma_callback); - LSI53C810_FETCH_CB(scsi_fetch); - LSI53C810_IRQ_CB(scsi_irq_callback); + void real3d_dma_callback(uint32_t src, uint32_t dst, int length, int byteswap); + uint32_t scsi_fetch(uint32_t dsp); + void scsi_irq_callback(int state); void update_irq_state(); void set_irq_line(uint8_t bit, int line); void model3_init(int step); diff --git a/src/mame/includes/namcona1.h b/src/mame/includes/namcona1.h index 1d0327df13b..697fa5accbf 100644 --- a/src/mame/includes/namcona1.h +++ b/src/mame/includes/namcona1.h @@ -83,6 +83,7 @@ protected: void namcona1_main_map(address_map &map); void namcona1_mcu_io_map(address_map &map); void namcona1_mcu_map(address_map &map); + void namcona1_c140_map(address_map &map); virtual void machine_start() override; virtual void machine_reset() override; diff --git a/src/mame/includes/policetr.h b/src/mame/includes/policetr.h index 4df9314d31a..81c8496d547 100644 --- a/src/mame/includes/policetr.h +++ b/src/mame/includes/policetr.h @@ -17,7 +17,19 @@ class policetr_state : public driver_device { public: policetr_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), + : policetr_state(mconfig, type, tag, 0x1fc028ac, 0x00000fc8) + { } + + void policetr(machine_config &config); + + void driver_init() override; + + DECLARE_CUSTOM_INPUT_MEMBER(bsmt_status_r); + +protected: + policetr_state(const machine_config &mconfig, device_type type, const char *tag, uint32_t speedup_pc, uint32_t speedup_addr) : + driver_device(mconfig, type, tag), + m_srcbitmap(*this, "gfx"), m_rambase(*this, "rambase"), m_maincpu(*this, "maincpu"), m_bsmt(*this, "bsmt"), @@ -26,57 +38,57 @@ public: m_rspeaker(*this, "rspeaker"), m_eeprom(*this, "eeprom"), m_screen(*this, "screen"), - m_palette(*this, "palette") { } - - void sshooter(machine_config &config); - void policetr(machine_config &config); - - void init_sshoot12(); - void init_policetr(); - void init_sshooter(); - void init_plctr13b(); + m_palette(*this, "palette"), + m_leds(*this, "leds%u", 0U), + m_gun_x_io(*this, "GUNX%u", 1U), + m_gun_y_io(*this, "GUNY%u", 1U), + m_speedup_pc(speedup_pc), + m_speedup_addr(speedup_addr) { } - DECLARE_CUSTOM_INPUT_MEMBER(bsmt_status_r); - -private: - enum - { - TIMER_IRQ5_GEN - }; + void machine_start() override; + void video_start() override; - virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; - virtual void machine_start() override; - virtual void video_start() override; - - void policetr_map(address_map &map); - void sshooter_map(address_map &map); - - INTERRUPT_GEN_MEMBER(irq4_gen); + void mem(address_map &map); DECLARE_WRITE32_MEMBER(control_w); DECLARE_WRITE32_MEMBER(speedup_w); - DECLARE_WRITE32_MEMBER(policetr_bsmt2000_reg_w); - DECLARE_WRITE32_MEMBER(policetr_bsmt2000_data_w); - DECLARE_READ32_MEMBER(bsmt2000_data_r); + DECLARE_WRITE32_MEMBER(bsmt2000_reg_w); + DECLARE_WRITE32_MEMBER(bsmt2000_data_w); + DECLARE_READ8_MEMBER(bsmt2000_data_r); - DECLARE_WRITE32_MEMBER(policetr_video_w); - DECLARE_READ32_MEMBER(policetr_video_r); - DECLARE_WRITE32_MEMBER(policetr_palette_offset_w); - DECLARE_WRITE32_MEMBER(policetr_palette_data_w); + DECLARE_WRITE32_MEMBER(video_w); + DECLARE_READ32_MEMBER(video_r); + DECLARE_WRITE8_MEMBER(palette_offset_w); + DECLARE_WRITE8_MEMBER(palette_data_w); + DECLARE_WRITE_LINE_MEMBER(vblank); void render_display_list(offs_t offset); - uint32_t screen_update_policetr(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + required_region_ptr<uint8_t> m_srcbitmap; required_shared_ptr<uint32_t> m_rambase; required_device<r3041_device> m_maincpu; required_device<bsmt2000_device> m_bsmt; - required_memory_region m_bsmt_region; + required_region_ptr<uint8_t> m_bsmt_region; required_device<speaker_device> m_lspeaker; required_device<speaker_device> m_rspeaker; required_device<eeprom_serial_93cxx_device> m_eeprom; required_device<screen_device> m_screen; required_device<palette_device> m_palette; + enum + { + LED_PCB_RED, + LED_PCB_GREEN, + LED_COIN1, + LED_COIN2 + }; + + output_finder<4> m_leds; + + required_ioport_array<2> m_gun_x_io; + required_ioport_array<2> m_gun_y_io; + uint32_t m_control_data; uint32_t m_bsmt_data_bank; uint32_t m_bsmt_data_offset; @@ -84,17 +96,54 @@ private: uint64_t m_last_cycles; uint32_t m_loop_count; offs_t m_speedup_pc; + offs_t m_speedup_addr; uint32_t m_palette_offset; uint8_t m_palette_index; uint8_t m_palette_data[3]; rectangle m_render_clip; - uint8_t *m_srcbitmap; - std::unique_ptr<uint8_t[]> m_dstbitmap; + std::unique_ptr<bitmap_ind8> m_dstbitmap; uint16_t m_src_xoffs; uint16_t m_src_yoffs; uint16_t m_dst_xoffs; uint16_t m_dst_yoffs; uint8_t m_video_latch; uint32_t m_srcbitmap_height_mask; - emu_timer *m_irq5_gen_timer; + + static constexpr uint32_t SRCBITMAP_WIDTH = 4096; + static constexpr uint32_t SRCBITMAP_WIDTH_MASK = SRCBITMAP_WIDTH - 1; + static constexpr uint32_t DSTBITMAP_WIDTH = 512; + static constexpr uint32_t DSTBITMAP_HEIGHT = 256; +}; + +class sshooter_state : public policetr_state +{ +public: + sshooter_state(const machine_config &mconfig, device_type type, const char *tag) + : sshooter_state(mconfig, type, tag, 0x1fc03470, 0x00018fd8) + { } + + void sshooter(machine_config &config); + +protected: + sshooter_state(const machine_config &mconfig, device_type type, const char *tag, uint32_t speedup_pc, uint32_t speedup_addr) + : policetr_state(mconfig, type, tag, speedup_pc, speedup_addr) + { } + + void mem(address_map &map); +}; + +class sshoot12_state : public sshooter_state +{ +public: + sshoot12_state(const machine_config &mconfig, device_type type, const char *tag) + : sshooter_state(mconfig, type, tag, 0x1fc033e0, 0x00018fd8) + { } +}; + +class plctr13b_state : public sshooter_state +{ +public: + plctr13b_state(const machine_config &mconfig, device_type type, const char *tag) + : sshooter_state(mconfig, type, tag, 0x1fc028bc, 0x00000fc8) + { } }; diff --git a/src/mame/includes/realbrk.h b/src/mame/includes/realbrk.h index 6e40143e1e0..14a548366eb 100644 --- a/src/mame/includes/realbrk.h +++ b/src/mame/includes/realbrk.h @@ -1,5 +1,10 @@ // license:BSD-3-Clause // copyright-holders:Luca Elia +#ifndef MAME_INCLUDES_REALBRK_H +#define MAME_INCLUDES_REALBRK_H + +#pragma once + #include "machine/tmp68301.h" #include "emupal.h" #include "screen.h" @@ -79,8 +84,7 @@ private: uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); uint32_t screen_update_dai2kaku(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - void draw_sprites(bitmap_ind16 &bitmap,const rectangle &cliprect, int layer); - void dai2kaku_draw_sprites(bitmap_ind16 &bitmap,const rectangle &cliprect, int layer); + template <bool Rotatable> void draw_sprites(bitmap_ind16 &bitmap,const rectangle &cliprect, int layer); DECLARE_WRITE_LINE_MEMBER(vblank_irq); void base_mem(address_map &map); @@ -89,3 +93,5 @@ private: void pkgnshdx_mem(address_map &map); void realbrk_mem(address_map &map); }; + +#endif // MAME_INCLUDES_REALBRK_H diff --git a/src/mame/includes/seta.h b/src/mame/includes/seta.h index 0d42fb06b8a..0df98c01106 100644 --- a/src/mame/includes/seta.h +++ b/src/mame/includes/seta.h @@ -214,8 +214,8 @@ protected: uint16_t m_kiwame_row_select; DECLARE_READ16_MEMBER(metafox_protection_r); - DECLARE_WRITE8_MEMBER(seta_coin_counter_w); - DECLARE_WRITE8_MEMBER(seta_coin_lockout_w); + void seta_coin_counter_w(u8 data); + void seta_coin_lockout_w(u8 data); DECLARE_WRITE8_MEMBER(seta_vregs_w); template<int Layer> DECLARE_WRITE16_MEMBER(vram_w); DECLARE_WRITE16_MEMBER(twineagl_tilebank_w); @@ -242,8 +242,8 @@ protected: DECLARE_WRITE8_MEMBER(utoukond_sound_control_w); DECLARE_READ16_MEMBER(pairlove_prot_r); DECLARE_WRITE16_MEMBER(pairlove_prot_w); - DECLARE_WRITE8_MEMBER(sub_bankswitch_w); - DECLARE_WRITE8_MEMBER(sub_bankswitch_lockout_w); + void sub_bankswitch_w(u8 data); + void sub_bankswitch_lockout_w(u8 data); DECLARE_READ8_MEMBER(ff_r); DECLARE_READ8_MEMBER(downtown_ip_r); DECLARE_WRITE8_MEMBER(calibr50_sub_bankswitch_w); diff --git a/src/mame/includes/ssystem3.h b/src/mame/includes/ssystem3.h index 7a61d7986ac..ec019285145 100644 --- a/src/mame/includes/ssystem3.h +++ b/src/mame/includes/ssystem3.h @@ -9,6 +9,7 @@ #ifndef MAME_INCLUDES_SSYSTEM3_H #define MAME_INCLUDES_SSYSTEM3_H +#include "cpu/m6502/m6502.h" #include "machine/6522via.h" #include "emupal.h" @@ -57,7 +58,7 @@ public: private: virtual void video_start() override; - DECLARE_PALETTE_INIT(ssystem3); + void palette_init(palette_device &palette); uint32_t screen_update_ssystem3(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); DECLARE_WRITE8_MEMBER(ssystem3_via_write_a); DECLARE_READ8_MEMBER(ssystem3_via_read_a); @@ -79,7 +80,7 @@ private: playfield_t m_playfield; lcd_t m_lcd; - required_device<cpu_device> m_maincpu; + required_device<m6502_device> m_maincpu; required_device<palette_device> m_palette; required_device<via6522_device> m_via6522_0; required_ioport m_configuration; diff --git a/src/mame/includes/stv.h b/src/mame/includes/stv.h index dac9786053f..4fe65fc663b 100644 --- a/src/mame/includes/stv.h +++ b/src/mame/includes/stv.h @@ -20,6 +20,7 @@ public: m_cart3(*this, "stv_slot3"), m_cart4(*this, "stv_slot4"), m_rax(*this, "rax"), + m_protbank(*this, "protbank"), m_eeprom(*this, "eeprom"), m_cryptdevice(*this, "315_5881"), m_5838crypt(*this, "315_5838"), @@ -40,6 +41,7 @@ public: void init_batmanfr(); void init_finlarch(); void init_decathlt(); + void init_decathlt_nokey(); void init_sanjeon(); void init_puyosun(); void init_winterht(); @@ -132,6 +134,13 @@ private: uint32_t m_abus_protenable; uint32_t m_abus_protkey; + READ32_MEMBER(decathlt_prot_r); + void sega5838_map(address_map &map); + optional_memory_bank m_protbank; + bool m_newprotection_element; // debug helper only, doesn't need saving + int m_protbankval; // debug helper only, doesn't need saving + WRITE32_MEMBER(decathlt_prot_srcaddr_w); + uint32_t m_a_bus[4]; DECLARE_READ32_MEMBER( common_prot_r ); @@ -145,8 +154,6 @@ private: optional_device<sega_315_5838_comp_device> m_5838crypt; optional_device<ticket_dispenser_device> m_hopper; uint16_t crypt_read_callback(uint32_t addr); - uint16_t crypt_read_callback_ch1(uint32_t addr); - uint16_t crypt_read_callback_ch2(uint32_t addr); DECLARE_READ8_MEMBER(pdr1_input_r); DECLARE_READ8_MEMBER(pdr2_input_r); diff --git a/src/mame/includes/super6.h b/src/mame/includes/super6.h index d9641bda2a3..1ea9122c9fc 100644 --- a/src/mame/includes/super6.h +++ b/src/mame/includes/super6.h @@ -9,7 +9,7 @@ #include "machine/z80daisy.h" #include "machine/com8116.h" #include "machine/ram.h" -#include "machine/timer.h" +#include "machine/clock.h" #include "machine/wd_fdc.h" #include "machine/z80ctc.h" #include "machine/z80dart.h" @@ -59,8 +59,6 @@ private: DECLARE_WRITE8_MEMBER( bank1_w ); DECLARE_WRITE_LINE_MEMBER( fdc_intrq_w ); DECLARE_WRITE_LINE_MEMBER( fdc_drq_w ); - - TIMER_DEVICE_CALLBACK_MEMBER(ctc_tick); DECLARE_READ8_MEMBER(memory_read_byte); DECLARE_WRITE8_MEMBER(memory_write_byte); DECLARE_READ8_MEMBER(io_read_byte); diff --git a/src/mame/includes/swtpc09.h b/src/mame/includes/swtpc09.h index 1a059e59ea3..53cad20497b 100644 --- a/src/mame/includes/swtpc09.h +++ b/src/mame/includes/swtpc09.h @@ -48,6 +48,7 @@ public: , m_harddisk(*this, "harddisk") , m_ide(*this, "ide") , m_dat(*this, "dat") + , m_bankdev(*this, "bankdev") { } void swtpc09_base(machine_config &config); @@ -119,7 +120,7 @@ private: offs_t dat_translate(offs_t offset) const; - required_device<cpu_device> m_maincpu; + required_device<mc6809_device> m_maincpu; required_device<mc14411_device> m_brg; required_device<pia6821_device> m_pia; required_device<ptm6840_device> m_ptm; @@ -134,6 +135,7 @@ private: optional_device<device_t> m_harddisk; optional_device<ide_controller_device> m_ide; required_shared_ptr<uint8_t> m_dat; + required_device<address_map_bank_device> m_bankdev; uint8_t m_term_data; // terminal keyboard value uint8_t m_pia_counter; // this is the counter on pia porta diff --git a/src/mame/includes/thomson.h b/src/mame/includes/thomson.h index fc76d33c96e..1f84bb31d8c 100644 --- a/src/mame/includes/thomson.h +++ b/src/mame/includes/thomson.h @@ -374,7 +374,7 @@ private: int m_centronics_busy; int m_centronics_perror; - MC6854_OUT_FRAME_CB(to7_network_got_frame); + void to7_network_got_frame(uint8_t *data, int length); void mo5(address_map &map); void mo5nr(address_map &map); diff --git a/src/mame/includes/trs80.h b/src/mame/includes/trs80.h index cf2931a0b31..8b1c0fe8ac6 100644 --- a/src/mame/includes/trs80.h +++ b/src/mame/includes/trs80.h @@ -15,6 +15,7 @@ #include "imagedev/snapquik.h" #include "machine/ay31015.h" #include "machine/com8116.h" +#include "machine/i8255.h" #include "bus/rs232/rs232.h" #include "machine/buffer.h" #include "machine/wd_fdc.h" @@ -40,6 +41,7 @@ public: , m_cent_data_out(*this, "cent_data_out") , m_cent_status_in(*this, "cent_status_in") , m_uart(*this, "uart") + , m_ppi(*this, "ppi") // Radionic only , m_brg(*this, "brg") , m_fdc(*this, "fdc") , m_floppy0(*this, "fdc:0") @@ -105,6 +107,7 @@ private: void trs80_io(address_map &map); void trs80_mem(address_map &map); void ht1080z_io(address_map &map); + void radionic_mem(address_map &map); uint8_t m_mode; uint8_t m_irq; @@ -130,6 +133,7 @@ private: optional_device<output_latch_device> m_cent_data_out; optional_device<input_buffer_device> m_cent_status_in; optional_device<ay31015_device> m_uart; + optional_device<i8255_device> m_ppi; optional_device<com8116_device> m_brg; optional_device<fd1793_device> m_fdc; optional_device<floppy_connector> m_floppy0; diff --git a/src/mame/includes/trs80m3.h b/src/mame/includes/trs80m3.h index bbce370cea8..09b6d98db3e 100644 --- a/src/mame/includes/trs80m3.h +++ b/src/mame/includes/trs80m3.h @@ -101,6 +101,8 @@ private: void cp500_io(address_map &map); void m3_io(address_map &map); void m3_mem(address_map &map); + void m4_mem(address_map &map); + void m4p_mem(address_map &map); void m4_io(address_map &map); void m4p_io(address_map &map); void m4_banked_mem(address_map &map); @@ -123,6 +125,8 @@ private: bool m_a11_flipflop; uint16_t m_timeout; bool m_wait; + bool m_drq_off; + bool m_intrq_off; floppy_image_device *m_floppy; virtual void machine_start() override; virtual void machine_reset() override; diff --git a/src/mame/includes/tsispch.h b/src/mame/includes/tsispch.h index a5b14f86691..3128cb89c42 100644 --- a/src/mame/includes/tsispch.h +++ b/src/mame/includes/tsispch.h @@ -13,9 +13,6 @@ #include "cpu/upd7725/upd7725.h" #include "machine/pic8259.h" -#include "machine/terminal.h" - -#define TERMINAL_TAG "terminal" class tsispch_state : public driver_device { @@ -24,7 +21,6 @@ public: : driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), m_dsp(*this, "dsp"), - m_terminal(*this, TERMINAL_TAG), m_pic(*this, "pic8259") { } @@ -55,7 +51,6 @@ private: required_device<cpu_device> m_maincpu; required_device<upd7725_device> m_dsp; - required_device<generic_terminal_device> m_terminal; required_device<pic8259_device> m_pic; uint8_t m_paramReg; // status leds and resets and etc diff --git a/src/mame/includes/vectrex.h b/src/mame/includes/vectrex.h index 116b5d99e35..b49b366bda3 100644 --- a/src/mame/includes/vectrex.h +++ b/src/mame/includes/vectrex.h @@ -36,13 +36,15 @@ public: TIMER_UPDATE_SIGNAL }; + void vectrex_cart(device_slot_interface &device); + protected: vectrex_base_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), m_cart(*this, "cartslot"), - m_gce_vectorram(*this, "gce_vectorram"), m_via6522_0(*this, "via6522_0"), + m_gce_vectorram(*this, "gce_vectorram"), m_dac(*this, "dac"), m_ay8912(*this, "ay8912"), m_vector(*this, "vector"), @@ -96,7 +98,10 @@ protected: emu_timer *m_imager_timer; emu_timer *m_lp_t; + required_device<via6522_device> m_via6522_0; + private: + struct vectrex_point { int x; int y; @@ -137,8 +142,7 @@ private: uint8_t m_cb2; void (vectrex_base_state::*vector_add_point_function)(int, int, rgb_t, int); - required_device<via6522_device> m_via6522_0; - required_device<dac_byte_interface> m_dac; + required_device<mc1408_device> m_dac; required_device<ay8910_device> m_ay8912; required_device<vector_device> m_vector; optional_ioport_array<4> m_io_contr; diff --git a/src/mame/includes/wswan.h b/src/mame/includes/wswan.h index 01a9a20c38f..b0a2b820e78 100644 --- a/src/mame/includes/wswan.h +++ b/src/mame/includes/wswan.h @@ -98,6 +98,7 @@ protected: void wswan_io(address_map &map); void wswan_mem(address_map &map); + void wswan_snd(address_map &map); void register_save(); void handle_irqs(); diff --git a/src/mame/includes/xor100.h b/src/mame/includes/xor100.h index f3bb7b1ab13..c41718eae0d 100644 --- a/src/mame/includes/xor100.h +++ b/src/mame/includes/xor100.h @@ -54,8 +54,6 @@ private: DECLARE_WRITE8_MEMBER( mmu_w ); DECLARE_WRITE8_MEMBER( prom_toggle_w ); DECLARE_READ8_MEMBER( prom_disable_r ); - DECLARE_READ8_MEMBER( fdc_r ); - DECLARE_WRITE8_MEMBER( fdc_w ); DECLARE_READ8_MEMBER( fdc_wait_r ); DECLARE_WRITE8_MEMBER( fdc_dcont_w ); DECLARE_WRITE8_MEMBER( fdc_dsel_w ); diff --git a/src/mame/layout/aim65.lay b/src/mame/layout/aim65.lay index 9322a56e8aa..d3cbf032f19 100644 --- a/src/mame/layout/aim65.lay +++ b/src/mame/layout/aim65.lay @@ -33,11 +33,11 @@ <repeat count="4"> <param name="xl" start="63" increment="173" /> - <param name="xs" start="97.6" increment="173" /> + <param name="xsbase" start="97.6" increment="173" /> <bezel element="static_white"><bounds x="~xl~" y="129" width="2" height="10" /></bezel> <repeat count="4"> - <param name="xs" start="~xs~" increment="34.6" /> - <bezel element="static_white"><bounds x="~xs~" y="135" width="2" height="4" /></bezel> + <param name="xs" start="~xsbase~" increment="34.6" /> + <bezel element="static_white"><bounds x="~xs~" y="135" width="2" height="4" /></bezel> </repeat> </repeat> @@ -48,12 +48,12 @@ <!-- DL1416A DS1/DS2/DS3/DS4/DS5 --> <repeat count="5"> - <param name="x" start="65" increment="139" /> - <param name="digitno" start="0" increment="4" /> + <param name="modulex" start="65" increment="139" /> + <param name="moduleno" start="0" increment="4" /> <repeat count="4"> - <param name="digitno" start="~digitno~" increment="1" /> - <param name="x" start="~x~" increment="34" /> - <bezel name="digit~digitno~" element="digit"><bounds x="~x~" y="80" width="25" height="40" /></bezel> + <param name="digitno" start="~moduleno~" increment="1" /> + <param name="digitx" start="~modulex~" increment="34" /> + <bezel name="digit~digitno~" element="digit"><bounds x="~digitx~" y="80" width="25" height="40" /></bezel> </repeat> </repeat> </view> diff --git a/src/mame/layout/aim65_40.lay b/src/mame/layout/aim65_40.lay index c0b90ebdfb3..e44100700f0 100644 --- a/src/mame/layout/aim65_40.lay +++ b/src/mame/layout/aim65_40.lay @@ -10,138 +10,39 @@ <element name="background"> <rect> - <bounds left="0" top="0" right="1" bottom="1" /> <color red="0.0" green="0.0" blue="0.0" /> </rect> </element> - <view name="Default Layout"> - + <group name="displays"> <!-- Black background --> <bezel element="background"> <bounds left="0" top="0" right="1205" bottom="60" /> </bezel> - <bezel name="digit0" element="digit"> - <bounds left="5" top="5" right="30" bottom="55" /> - </bezel> - <bezel name="digit1" element="digit"> - <bounds left="35" top="5" right="60" bottom="55" /> - </bezel> - <bezel name="digit2" element="digit"> - <bounds left="65" top="5" right="90" bottom="55" /> - </bezel> - <bezel name="digit3" element="digit"> - <bounds left="95" top="5" right="120" bottom="55" /> - </bezel> - <bezel name="digit4" element="digit"> - <bounds left="125" top="5" right="150" bottom="55" /> - </bezel> - <bezel name="digit5" element="digit"> - <bounds left="155" top="5" right="180" bottom="55" /> - </bezel> - <bezel name="digit6" element="digit"> - <bounds left="185" top="5" right="210" bottom="55" /> - </bezel> - <bezel name="digit7" element="digit"> - <bounds left="215" top="5" right="240" bottom="55" /> - </bezel> - <bezel name="digit8" element="digit"> - <bounds left="245" top="5" right="270" bottom="55" /> - </bezel> - <bezel name="digit9" element="digit"> - <bounds left="275" top="5" right="300" bottom="55" /> - </bezel> - <bezel name="digit10" element="digit"> - <bounds left="305" top="5" right="330" bottom="55" /> - </bezel> - <bezel name="digit11" element="digit"> - <bounds left="335" top="5" right="360" bottom="55" /> - </bezel> - <bezel name="digit12" element="digit"> - <bounds left="365" top="5" right="390" bottom="55" /> - </bezel> - <bezel name="digit13" element="digit"> - <bounds left="395" top="5" right="420" bottom="55" /> - </bezel> - <bezel name="digit14" element="digit"> - <bounds left="425" top="5" right="450" bottom="55" /> - </bezel> - <bezel name="digit15" element="digit"> - <bounds left="455" top="5" right="480" bottom="55" /> - </bezel> - <bezel name="digit16" element="digit"> - <bounds left="485" top="5" right="510" bottom="55" /> - </bezel> - <bezel name="digit17" element="digit"> - <bounds left="515" top="5" right="540" bottom="55" /> - </bezel> - <bezel name="digit18" element="digit"> - <bounds left="545" top="5" right="570" bottom="55" /> - </bezel> - <bezel name="digit19" element="digit"> - <bounds left="575" top="5" right="600" bottom="55" /> - </bezel> - <bezel name="digit20" element="digit"> - <bounds left="605" top="5" right="630" bottom="55" /> - </bezel> - <bezel name="digit21" element="digit"> - <bounds left="635" top="5" right="660" bottom="55" /> - </bezel> - <bezel name="digit22" element="digit"> - <bounds left="665" top="5" right="690" bottom="55" /> - </bezel> - <bezel name="digit23" element="digit"> - <bounds left="695" top="5" right="720" bottom="55" /> - </bezel> - <bezel name="digit24" element="digit"> - <bounds left="725" top="5" right="750" bottom="55" /> - </bezel> - <bezel name="digit25" element="digit"> - <bounds left="755" top="5" right="780" bottom="55" /> - </bezel> - <bezel name="digit26" element="digit"> - <bounds left="785" top="5" right="810" bottom="55" /> - </bezel> - <bezel name="digit27" element="digit"> - <bounds left="815" top="5" right="840" bottom="55" /> - </bezel> - <bezel name="digit28" element="digit"> - <bounds left="845" top="5" right="870" bottom="55" /> - </bezel> - <bezel name="digit29" element="digit"> - <bounds left="875" top="5" right="900" bottom="55" /> - </bezel> - <bezel name="digit30" element="digit"> - <bounds left="905" top="5" right="930" bottom="55" /> - </bezel> - <bezel name="digit31" element="digit"> - <bounds left="935" top="5" right="960" bottom="55" /> - </bezel> - <bezel name="digit32" element="digit"> - <bounds left="965" top="5" right="990" bottom="55" /> - </bezel> - <bezel name="digit33" element="digit"> - <bounds left="995" top="5" right="1020" bottom="55" /> - </bezel> - <bezel name="digit34" element="digit"> - <bounds left="1025" top="5" right="1050" bottom="55" /> - </bezel> - <bezel name="digit35" element="digit"> - <bounds left="1055" top="5" right="1080" bottom="55" /> - </bezel> - <bezel name="digit36" element="digit"> - <bounds left="1085" top="5" right="1110" bottom="55" /> - </bezel> - <bezel name="digit37" element="digit"> - <bounds left="1115" top="5" right="1140" bottom="55" /> - </bezel> - <bezel name="digit38" element="digit"> - <bounds left="1145" top="5" right="1170" bottom="55" /> - </bezel> - <bezel name="digit39" element="digit"> - <bounds left="1175" top="5" right="1200" bottom="55" /> - </bezel> + <!-- Forty multi-segment displays --> + <repeat count="40"> + <param name="i" start="0" increment="1" /> + <param name="x" start="5" increment="30" /> + <bezel name="digit~i~" element="digit"> + <bounds x="~x~" y="5" width="25" height="50" /> + </bezel> + </repeat> + </group> + + <view name="LED Displays"> + <group ref="displays"> + <bounds x="0" y="0" width="241" height="12" /> + </group> + </view> + + <view name="Terminal Below"> + <group ref="displays"> + <bounds x="0" y="0" width="241" height="12" /> + </group> + <screen index="0"> + <bounds x="0" y="12" width="241" height="180.75" /> + </screen> </view> </mamelayout> diff --git a/src/mame/layout/buggybjr.lay b/src/mame/layout/buggybjr.lay index 3e8f8a3610e..2bb528e4261 100644 --- a/src/mame/layout/buggybjr.lay +++ b/src/mame/layout/buggybjr.lay @@ -52,7 +52,7 @@ <screen index="0"> <bounds x="0" y="0" width="640" height="480" /> </screen> - <bezel element="shifter" inputtag="YM2149_IC19_A" inputmask="0x40"> + <bezel element="shifter" inputtag="soundbrd:YM2149_IC19_A" inputmask="0x40"> <bounds x="606" y="414" width="32" height="64" /> <color alpha="0.6" /> @@ -63,7 +63,7 @@ <screen index="0"> <bounds x="0" y="0" width="640" height="480" /> </screen> - <bezel element="shifter" inputtag="YM2149_IC19_A" inputmask="0x40"> + <bezel element="shifter" inputtag="soundbrd:YM2149_IC19_A" inputmask="0x40"> <bounds x="2" y="414" width="32" height="64" /> <color alpha="0.6" /> diff --git a/src/mame/layout/buggyboy.lay b/src/mame/layout/buggyboy.lay index 2a19cad8797..c59643e47c1 100644 --- a/src/mame/layout/buggyboy.lay +++ b/src/mame/layout/buggyboy.lay @@ -59,7 +59,7 @@ <bounds x="1280" y="0" width="640" height="480" /> </screen> -<bezel element="shifter" inputtag="PPI_PORTA" inputmask="0x40"> +<bezel element="shifter" inputtag="soundbrd:PPI_PORTA" inputmask="0x40"> <bounds x="1886" y="414" width="32" height="64" /> <color alpha="0.6" /> @@ -76,7 +76,7 @@ <bounds x="1280" y="0" width="640" height="480" /> </screen> -<bezel element="shifter" inputtag="PPI_PORTA" inputmask="0x40"> +<bezel element="shifter" inputtag="soundbrd:PPI_PORTA" inputmask="0x40"> <bounds x="2" y="414" width="32" height="64" /> <color alpha="0.6" /> @@ -87,7 +87,7 @@ <bounds x="0" y="0" width="640" height="480" /> </screen> -<bezel element="shifter" inputtag="PPI_PORTA" inputmask="0x40"> +<bezel element="shifter" inputtag="soundbrd:PPI_PORTA" inputmask="0x40"> <bounds x="606" y="414" width="32" height="64" /> <color alpha="0.6" /> @@ -98,7 +98,7 @@ <bounds x="0" y="0" width="640" height="480" /> </screen> -<bezel element="shifter" inputtag="PPI_PORTA" inputmask="0x40"> +<bezel element="shifter" inputtag="soundbrd:PPI_PORTA" inputmask="0x40"> <bounds x="2" y="414" width="32" height="64" /> <color alpha="0.6" /> diff --git a/src/mame/layout/intlc44.lay b/src/mame/layout/intlc44.lay index a294da1dde9..1484429952e 100644 --- a/src/mame/layout/intlc44.lay +++ b/src/mame/layout/intlc44.lay @@ -225,20 +225,20 @@ Intel INTELLEC® 4/MOD 4 layout <cpanel element="label_reset_cpu"><bounds left="727" top="361" right="783" bottom="368" /></cpanel> <repeat count="3"> - <param name="labelnum" start="11" increment="-4" /> + <param name="groupnum" start="11" increment="-4" /> <param name="ledpos" start="81" increment="156" /> <param name="nybble" start="3" increment="-1" /> <param name="switchpos" start="74" increment="156" /> - <param name="mask" start="0x0800" rshift="4" /> + <param name="groupmask" start="0x0800" rshift="4" /> <cpanel element="label_a~nybble~"> <bounds x="~ledpos~" y="63" width="104" height="7" /> </cpanel> <repeat count="4"> - <param name="labelnum" start="~labelnum~" increment="-1" /> + <param name="labelnum" start="~groupnum~" increment="-1" /> <param name="ledpos" start="~ledpos~" increment="31" /> <param name="switchpos" start="~switchpos~" increment="31" /> <param name="bit" start="3" increment="-1" /> - <param name="mask" start="~mask~" rshift="1" /> + <param name="bitmask" start="~groupmask~" rshift="1" /> <cpanel element="label_~labelnum~"> <bounds x="~ledpos~" y="71" width="11" height="7" /> </cpanel> @@ -248,7 +248,7 @@ Intel INTELLEC® 4/MOD 4 layout <cpanel name="led_address_a~nybble~_~bit~" element="led"> <bounds x="~ledpos~" y="79" width="11" height="7" /> </cpanel> - <cpanel element="switch" inputtag="ADDRDAT" inputmask="~mask~"> + <cpanel element="switch" inputtag="ADDRDAT" inputmask="~bitmask~"> <bounds x="~switchpos~" y="240" width="25" height="46" /> </cpanel> </repeat> @@ -288,19 +288,19 @@ Intel INTELLEC® 4/MOD 4 layout </cpanel> <repeat count="2"> - <param name="xpos" start="81" increment="156" /> + <param name="groupx" start="81" increment="156" /> <param name="mnybble" start="1" increment="1" /> <param name="xnybble" start="2" increment="1" /> - <param name="mbit" start="7" increment="-4" /> + <param name="groupbit" start="7" increment="-4" /> <cpanel element="label_m~mnybble~"> - <bounds x="~xpos~" y="112" width="104" height="7" /> + <bounds x="~groupx~" y="112" width="104" height="7" /> </cpanel> <cpanel element="label_x~xnybble~"> - <bounds x="~xpos~" y="161" width="104" height="7" /> + <bounds x="~groupx~" y="161" width="104" height="7" /> </cpanel> <repeat count="4"> - <param name="xpos" start="~xpos~" increment="31" /> - <param name="mbit" start="~mbit~" increment="-1" /> + <param name="xpos" start="~groupx~" increment="31" /> + <param name="mbit" start="~groupbit~" increment="-1" /> <param name="bit" start="3" increment="-1" /> <cpanel element="label_~mbit~"> <bounds x="~xpos~" y="120" width="11" height="7" /> @@ -318,13 +318,13 @@ Intel INTELLEC® 4/MOD 4 layout </repeat> <repeat count="2"> - <param name="xpos" start="393" increment="156" /> + <param name="groupx" start="393" increment="156" /> <param name="nybble" start="2" increment="1" /> <cpanel element="label_x~nybble~"> - <bounds x="~xpos~" y="161" width="104" height="7" /> + <bounds x="~groupx~" y="161" width="104" height="7" /> </cpanel> <repeat count="4"> - <param name="xpos" start="~xpos~" increment="31" /> + <param name="xpos" start="~groupx~" increment="31" /> <param name="bit" start="3" increment="-1" /> <cpanel element="label_~bit~"> <bounds x="~xpos~" y="169" width="11" height="7" /> diff --git a/src/mame/layout/intlc440.lay b/src/mame/layout/intlc440.lay index d2732278cd8..8a826178238 100644 --- a/src/mame/layout/intlc440.lay +++ b/src/mame/layout/intlc440.lay @@ -220,20 +220,20 @@ Intel INTELLEC® 4/MOD 40 layout <cpanel element="label_reset_cpu"><bounds left="727" top="361" right="783" bottom="368" /></cpanel> <repeat count="3"> - <param name="labelnum" start="11" increment="-4" /> + <param name="groupnum" start="11" increment="-4" /> <param name="ledpos" start="81" increment="156" /> <param name="nybble" start="3" increment="-1" /> <param name="switchpos" start="74" increment="156" /> - <param name="mask" start="0x0800" rshift="4" /> + <param name="groupmask" start="0x0800" rshift="4" /> <cpanel element="label_a~nybble~"> <bounds x="~ledpos~" y="63" width="104" height="7" /> </cpanel> <repeat count="4"> - <param name="labelnum" start="~labelnum~" increment="-1" /> + <param name="labelnum" start="~groupnum~" increment="-1" /> <param name="ledpos" start="~ledpos~" increment="31" /> <param name="switchpos" start="~switchpos~" increment="31" /> <param name="bit" start="3" increment="-1" /> - <param name="mask" start="~mask~" rshift="1" /> + <param name="bitmask" start="~groupmask~" rshift="1" /> <cpanel element="label_~labelnum~"> <bounds x="~ledpos~" y="71" width="11" height="7" /> </cpanel> @@ -243,7 +243,7 @@ Intel INTELLEC® 4/MOD 40 layout <cpanel name="led_address_a~nybble~_~bit~" element="led"> <bounds x="~ledpos~" y="79" width="11" height="7" /> </cpanel> - <cpanel element="switch" inputtag="ADDRDAT" inputmask="~mask~"> + <cpanel element="switch" inputtag="ADDRDAT" inputmask="~bitmask~"> <bounds x="~switchpos~" y="240" width="25" height="46" /> </cpanel> </repeat> @@ -283,19 +283,19 @@ Intel INTELLEC® 4/MOD 40 layout </cpanel> <repeat count="2"> - <param name="xpos" start="81" increment="156" /> + <param name="groupx" start="81" increment="156" /> <param name="mnybble" start="1" increment="1" /> <param name="xnybble" start="2" increment="1" /> - <param name="mbit" start="7" increment="-4" /> + <param name="groupbit" start="7" increment="-4" /> <cpanel element="label_m~mnybble~"> - <bounds x="~xpos~" y="112" width="104" height="7" /> + <bounds x="~groupx~" y="112" width="104" height="7" /> </cpanel> <cpanel element="label_x~xnybble~"> - <bounds x="~xpos~" y="161" width="104" height="7" /> + <bounds x="~groupx~" y="161" width="104" height="7" /> </cpanel> <repeat count="4"> - <param name="xpos" start="~xpos~" increment="31" /> - <param name="mbit" start="~mbit~" increment="-1" /> + <param name="xpos" start="~groupx~" increment="31" /> + <param name="mbit" start="~groupbit~" increment="-1" /> <param name="bit" start="3" increment="-1" /> <cpanel element="label_~mbit~"> <bounds x="~xpos~" y="120" width="11" height="7" /> @@ -313,13 +313,13 @@ Intel INTELLEC® 4/MOD 40 layout </repeat> <repeat count="2"> - <param name="xpos" start="393" increment="156" /> + <param name="groupx" start="393" increment="156" /> <param name="nybble" start="2" increment="1" /> <cpanel element="label_x~nybble~"> - <bounds x="~xpos~" y="161" width="104" height="7" /> + <bounds x="~groupx~" y="161" width="104" height="7" /> </cpanel> <repeat count="4"> - <param name="xpos" start="~xpos~" increment="31" /> + <param name="xpos" start="~groupx~" increment="31" /> <param name="bit" start="3" increment="-1" /> <cpanel element="label_~bit~"> <bounds x="~xpos~" y="169" width="11" height="7" /> diff --git a/src/mame/layout/mephisto_academy.lay b/src/mame/layout/mephisto_academy.lay index fbea1e63ff8..917dcb459a0 100644 --- a/src/mame/layout/mephisto_academy.lay +++ b/src/mame/layout/mephisto_academy.lay @@ -186,10 +186,10 @@ <!-- chessboard LEDs --> <repeat count="8"> <param name="ledy" start="81.3" increment="-10" /> - <param name="ledno" start="0" increment="8" /> + <param name="rowno" start="0" increment="8" /> <repeat count="8"> <param name="ledx" start="11.2" increment="10" /> - <param name="ledno" start="~ledno~" increment="1" /> + <param name="ledno" start="~rowno~" increment="1" /> <bezel name="led~ledno~" element="led"> <bounds x="~ledx~" y="~ledy~" width="1.5" height="1.5" /> </bezel> @@ -198,11 +198,11 @@ <!-- chessboard sensors --> <repeat count="4"> - <param name="ipty" start="3" increment="20" /> - <param name="iptno" start="7" increment="-2" /> + <param name="pairy" start="3" increment="20" /> + <param name="pairno" start="7" increment="-2" /> <repeat count="2"> - <param name="ipty" start="~ipty~" increment="10" /> - <param name="iptno" start="~iptno~" increment="-1" /> + <param name="rowy" start="~pairy~" increment="10" /> + <param name="rowno" start="~pairno~" increment="-1" /> <param name="lalpha" start="0.4" increment="-0.2" /> <param name="ralpha" start="0.2" increment="0.2" /> <repeat count="4"> @@ -210,12 +210,12 @@ <param name="rx" start="13" increment="20" /> <param name="lmask" start="0x01" lshift="2" /> <param name="rmask" start="0x02" lshift="2" /> - <bezel element="hl" inputtag="board:IN.~iptno~" inputmask="~lmask~"> - <bounds x="~lx~" y="~ipty~" width="10" height="10" /> + <bezel element="hl" inputtag="board:IN.~rowno~" inputmask="~lmask~"> + <bounds x="~lx~" y="~rowy~" width="10" height="10" /> <color alpha="~lalpha~" /> </bezel> - <bezel element="hl" inputtag="board:IN.~iptno~" inputmask="~rmask~"> - <bounds x="~rx~" y="~ipty~" width="10" height="10" /> + <bezel element="hl" inputtag="board:IN.~rowno~" inputmask="~rmask~"> + <bounds x="~rx~" y="~rowy~" width="10" height="10" /> <color alpha="~ralpha~" /> </bezel> </repeat> diff --git a/src/mame/layout/mephisto_modena.lay b/src/mame/layout/mephisto_modena.lay index 6087b3ca05a..0b238c55ddd 100644 --- a/src/mame/layout/mephisto_modena.lay +++ b/src/mame/layout/mephisto_modena.lay @@ -21,7 +21,7 @@ </text> <disk state="1"> <bounds x="0.12" y="0.12" width="0.76" height="0.76" /> - <color red="1.0" green="1.0" blue="1.0" /> + <color red="0.5" green="0.5" blue="0.5" /> </disk> </element> <element name="hlb" defstate="0"> @@ -202,77 +202,30 @@ <!-- chessboard sensors --> - <bezel element="hl" inputtag="board:IN.7" inputmask="0x01"><bounds x="3" y="3" width="10" height="10" /><color alpha="0.4" /></bezel> - <bezel element="hl" inputtag="board:IN.7" inputmask="0x02"><bounds x="13" y="3" width="10" height="10" /><color alpha="0.2" /></bezel> - <bezel element="hl" inputtag="board:IN.7" inputmask="0x04"><bounds x="23" y="3" width="10" height="10" /><color alpha="0.4" /></bezel> - <bezel element="hl" inputtag="board:IN.7" inputmask="0x08"><bounds x="33" y="3" width="10" height="10" /><color alpha="0.2" /></bezel> - <bezel element="hl" inputtag="board:IN.7" inputmask="0x10"><bounds x="43" y="3" width="10" height="10" /><color alpha="0.4" /></bezel> - <bezel element="hl" inputtag="board:IN.7" inputmask="0x20"><bounds x="53" y="3" width="10" height="10" /><color alpha="0.2" /></bezel> - <bezel element="hl" inputtag="board:IN.7" inputmask="0x40"><bounds x="63" y="3" width="10" height="10" /><color alpha="0.4" /></bezel> - <bezel element="hl" inputtag="board:IN.7" inputmask="0x80"><bounds x="73" y="3" width="10" height="10" /><color alpha="0.2" /></bezel> - - <bezel element="hl" inputtag="board:IN.6" inputmask="0x01"><bounds x="3" y="13" width="10" height="10" /><color alpha="0.2" /></bezel> - <bezel element="hl" inputtag="board:IN.6" inputmask="0x02"><bounds x="13" y="13" width="10" height="10" /><color alpha="0.4" /></bezel> - <bezel element="hl" inputtag="board:IN.6" inputmask="0x04"><bounds x="23" y="13" width="10" height="10" /><color alpha="0.2" /></bezel> - <bezel element="hl" inputtag="board:IN.6" inputmask="0x08"><bounds x="33" y="13" width="10" height="10" /><color alpha="0.4" /></bezel> - <bezel element="hl" inputtag="board:IN.6" inputmask="0x10"><bounds x="43" y="13" width="10" height="10" /><color alpha="0.2" /></bezel> - <bezel element="hl" inputtag="board:IN.6" inputmask="0x20"><bounds x="53" y="13" width="10" height="10" /><color alpha="0.4" /></bezel> - <bezel element="hl" inputtag="board:IN.6" inputmask="0x40"><bounds x="63" y="13" width="10" height="10" /><color alpha="0.2" /></bezel> - <bezel element="hl" inputtag="board:IN.6" inputmask="0x80"><bounds x="73" y="13" width="10" height="10" /><color alpha="0.4" /></bezel> - - <bezel element="hl" inputtag="board:IN.5" inputmask="0x01"><bounds x="3" y="23" width="10" height="10" /><color alpha="0.4" /></bezel> - <bezel element="hl" inputtag="board:IN.5" inputmask="0x02"><bounds x="13" y="23" width="10" height="10" /><color alpha="0.2" /></bezel> - <bezel element="hl" inputtag="board:IN.5" inputmask="0x04"><bounds x="23" y="23" width="10" height="10" /><color alpha="0.4" /></bezel> - <bezel element="hl" inputtag="board:IN.5" inputmask="0x08"><bounds x="33" y="23" width="10" height="10" /><color alpha="0.2" /></bezel> - <bezel element="hl" inputtag="board:IN.5" inputmask="0x10"><bounds x="43" y="23" width="10" height="10" /><color alpha="0.4" /></bezel> - <bezel element="hl" inputtag="board:IN.5" inputmask="0x20"><bounds x="53" y="23" width="10" height="10" /><color alpha="0.2" /></bezel> - <bezel element="hl" inputtag="board:IN.5" inputmask="0x40"><bounds x="63" y="23" width="10" height="10" /><color alpha="0.4" /></bezel> - <bezel element="hl" inputtag="board:IN.5" inputmask="0x80"><bounds x="73" y="23" width="10" height="10" /><color alpha="0.2" /></bezel> - - <bezel element="hl" inputtag="board:IN.4" inputmask="0x01"><bounds x="3" y="33" width="10" height="10" /><color alpha="0.2" /></bezel> - <bezel element="hl" inputtag="board:IN.4" inputmask="0x02"><bounds x="13" y="33" width="10" height="10" /><color alpha="0.4" /></bezel> - <bezel element="hl" inputtag="board:IN.4" inputmask="0x04"><bounds x="23" y="33" width="10" height="10" /><color alpha="0.2" /></bezel> - <bezel element="hl" inputtag="board:IN.4" inputmask="0x08"><bounds x="33" y="33" width="10" height="10" /><color alpha="0.4" /></bezel> - <bezel element="hl" inputtag="board:IN.4" inputmask="0x10"><bounds x="43" y="33" width="10" height="10" /><color alpha="0.2" /></bezel> - <bezel element="hl" inputtag="board:IN.4" inputmask="0x20"><bounds x="53" y="33" width="10" height="10" /><color alpha="0.4" /></bezel> - <bezel element="hl" inputtag="board:IN.4" inputmask="0x40"><bounds x="63" y="33" width="10" height="10" /><color alpha="0.2" /></bezel> - <bezel element="hl" inputtag="board:IN.4" inputmask="0x80"><bounds x="73" y="33" width="10" height="10" /><color alpha="0.4" /></bezel> - - <bezel element="hl" inputtag="board:IN.3" inputmask="0x01"><bounds x="3" y="43" width="10" height="10" /><color alpha="0.4" /></bezel> - <bezel element="hl" inputtag="board:IN.3" inputmask="0x02"><bounds x="13" y="43" width="10" height="10" /><color alpha="0.2" /></bezel> - <bezel element="hl" inputtag="board:IN.3" inputmask="0x04"><bounds x="23" y="43" width="10" height="10" /><color alpha="0.4" /></bezel> - <bezel element="hl" inputtag="board:IN.3" inputmask="0x08"><bounds x="33" y="43" width="10" height="10" /><color alpha="0.2" /></bezel> - <bezel element="hl" inputtag="board:IN.3" inputmask="0x10"><bounds x="43" y="43" width="10" height="10" /><color alpha="0.4" /></bezel> - <bezel element="hl" inputtag="board:IN.3" inputmask="0x20"><bounds x="53" y="43" width="10" height="10" /><color alpha="0.2" /></bezel> - <bezel element="hl" inputtag="board:IN.3" inputmask="0x40"><bounds x="63" y="43" width="10" height="10" /><color alpha="0.4" /></bezel> - <bezel element="hl" inputtag="board:IN.3" inputmask="0x80"><bounds x="73" y="43" width="10" height="10" /><color alpha="0.2" /></bezel> - - <bezel element="hl" inputtag="board:IN.2" inputmask="0x01"><bounds x="3" y="53" width="10" height="10" /><color alpha="0.2" /></bezel> - <bezel element="hl" inputtag="board:IN.2" inputmask="0x02"><bounds x="13" y="53" width="10" height="10" /><color alpha="0.4" /></bezel> - <bezel element="hl" inputtag="board:IN.2" inputmask="0x04"><bounds x="23" y="53" width="10" height="10" /><color alpha="0.2" /></bezel> - <bezel element="hl" inputtag="board:IN.2" inputmask="0x08"><bounds x="33" y="53" width="10" height="10" /><color alpha="0.4" /></bezel> - <bezel element="hl" inputtag="board:IN.2" inputmask="0x10"><bounds x="43" y="53" width="10" height="10" /><color alpha="0.2" /></bezel> - <bezel element="hl" inputtag="board:IN.2" inputmask="0x20"><bounds x="53" y="53" width="10" height="10" /><color alpha="0.4" /></bezel> - <bezel element="hl" inputtag="board:IN.2" inputmask="0x40"><bounds x="63" y="53" width="10" height="10" /><color alpha="0.2" /></bezel> - <bezel element="hl" inputtag="board:IN.2" inputmask="0x80"><bounds x="73" y="53" width="10" height="10" /><color alpha="0.4" /></bezel> - - <bezel element="hl" inputtag="board:IN.1" inputmask="0x01"><bounds x="3" y="63" width="10" height="10" /><color alpha="0.4" /></bezel> - <bezel element="hl" inputtag="board:IN.1" inputmask="0x02"><bounds x="13" y="63" width="10" height="10" /><color alpha="0.2" /></bezel> - <bezel element="hl" inputtag="board:IN.1" inputmask="0x04"><bounds x="23" y="63" width="10" height="10" /><color alpha="0.4" /></bezel> - <bezel element="hl" inputtag="board:IN.1" inputmask="0x08"><bounds x="33" y="63" width="10" height="10" /><color alpha="0.2" /></bezel> - <bezel element="hl" inputtag="board:IN.1" inputmask="0x10"><bounds x="43" y="63" width="10" height="10" /><color alpha="0.4" /></bezel> - <bezel element="hl" inputtag="board:IN.1" inputmask="0x20"><bounds x="53" y="63" width="10" height="10" /><color alpha="0.2" /></bezel> - <bezel element="hl" inputtag="board:IN.1" inputmask="0x40"><bounds x="63" y="63" width="10" height="10" /><color alpha="0.4" /></bezel> - <bezel element="hl" inputtag="board:IN.1" inputmask="0x80"><bounds x="73" y="63" width="10" height="10" /><color alpha="0.2" /></bezel> - - <bezel element="hl" inputtag="board:IN.0" inputmask="0x01"><bounds x="3" y="73" width="10" height="10" /><color alpha="0.2" /></bezel> - <bezel element="hl" inputtag="board:IN.0" inputmask="0x02"><bounds x="13" y="73" width="10" height="10" /><color alpha="0.4" /></bezel> - <bezel element="hl" inputtag="board:IN.0" inputmask="0x04"><bounds x="23" y="73" width="10" height="10" /><color alpha="0.2" /></bezel> - <bezel element="hl" inputtag="board:IN.0" inputmask="0x08"><bounds x="33" y="73" width="10" height="10" /><color alpha="0.4" /></bezel> - <bezel element="hl" inputtag="board:IN.0" inputmask="0x10"><bounds x="43" y="73" width="10" height="10" /><color alpha="0.2" /></bezel> - <bezel element="hl" inputtag="board:IN.0" inputmask="0x20"><bounds x="53" y="73" width="10" height="10" /><color alpha="0.4" /></bezel> - <bezel element="hl" inputtag="board:IN.0" inputmask="0x40"><bounds x="63" y="73" width="10" height="10" /><color alpha="0.2" /></bezel> - <bezel element="hl" inputtag="board:IN.0" inputmask="0x80"><bounds x="73" y="73" width="10" height="10" /><color alpha="0.4" /></bezel> + <repeat count="4"> + <param name="pairy" start="3" increment="20" /> + <param name="pairno" start="7" increment="-2" /> + <repeat count="2"> + <param name="rowy" start="~pairy~" increment="10" /> + <param name="rowno" start="~pairno~" increment="-1" /> + <param name="lalpha" start="0.2" increment="0.3" /> + <param name="ralpha" start="0.5" increment="-0.3" /> + <repeat count="4"> + <param name="lx" start="3" increment="20" /> + <param name="rx" start="13" increment="20" /> + <param name="lmask" start="0x01" lshift="2" /> + <param name="rmask" start="0x02" lshift="2" /> + <bezel element="hl" inputtag="board:IN.~rowno~" inputmask="~lmask~"> + <bounds x="~lx~" y="~rowy~" width="10" height="10" /> + <color alpha="~lalpha~" /> + </bezel> + <bezel element="hl" inputtag="board:IN.~rowno~" inputmask="~rmask~"> + <bounds x="~rx~" y="~rowy~" width="10" height="10" /> + <color alpha="~ralpha~" /> + </bezel> + </repeat> + </repeat> + </repeat> <!-- LCD panel --> <group ref="panel"><bounds x="87" y="58" width="23" height="23.5" /></group> diff --git a/src/mame/layout/rocknms.lay b/src/mame/layout/rocknms.lay index a8d892f3cb4..b6b053eacae 100644 --- a/src/mame/layout/rocknms.lay +++ b/src/mame/layout/rocknms.lay @@ -2,10 +2,10 @@ <mamelayout version="2"> <view name="Rockn Megasession Custom"> - <screen index="0"> + <screen tag="lscreen"> <bounds x="0" y="0" width="12" height="9" /> </screen> - <screen index="1"> + <screen tag="rscreen"> <bounds x="0" y="9" width="12" height="16" /> </screen> </view> diff --git a/src/mame/layout/sda5708.lay b/src/mame/layout/sda5708.lay index cac55a6381a..fff57c58c82 100644 --- a/src/mame/layout/sda5708.lay +++ b/src/mame/layout/sda5708.lay @@ -66,7 +66,7 @@ <param name="colno" start="1" increment="1" /> <param name="colx" start="~digitx~" increment="111" /> <!-- horizontal distance between LEDs --> <bezel name="Dot_~digitno~~rowno~~colno~" element="Pixel" state="0"> - <bounds x="~colx~" y="~rowy~" width="100" height="100"/> <!-- size of each LED --> + <bounds x="~colx~" y="~rowy~" width="100" height="100" /> <!-- size of each LED --> </bezel> </repeat> </repeat> diff --git a/src/mame/layout/sitcom.lay b/src/mame/layout/sitcom.lay index e74282f46a8..736139945b0 100644 --- a/src/mame/layout/sitcom.lay +++ b/src/mame/layout/sitcom.lay @@ -45,11 +45,11 @@ <!-- DL1414 left/right --> <repeat count="2"> - <param name="digitno" start="3" increment="4" /> - <param name="digitx" start="65" increment="139" /> + <param name="moduleno" start="3" increment="4" /> + <param name="modulex" start="65" increment="139" /> <repeat count="4"> - <param name="digitno" start="~digitno~" increment="-1" /> - <param name="digitx" start="~digitx~" increment="34" /> + <param name="digitno" start="~moduleno~" increment="-1" /> + <param name="digitx" start="~modulex~" increment="34" /> <bezel name="digit~digitno~" element="a_digit"> <bounds x="~digitx~" y="70" width="25" height="50" /> </bezel> diff --git a/src/mame/layout/stepstag.lay b/src/mame/layout/stepstag.lay index f51becc014f..0525d15a310 100644 --- a/src/mame/layout/stepstag.lay +++ b/src/mame/layout/stepstag.lay @@ -2,13 +2,13 @@ <mamelayout version="2"> <view name="Stepping Stage Custom"> - <screen index="0"> + <screen tag="lscreen"> <bounds x="0" y="0" width="9" height="13.2" /> </screen> - <screen index="1"> + <screen tag="mscreen"> <bounds x="9.1" y="0" width="16" height="13.2" /> </screen> - <screen index="2"> + <screen tag="rscreen"> <bounds x="25.2" y="0" width="9" height="13.2" /> </screen> </view> diff --git a/src/mame/layout/svmu.lay b/src/mame/layout/svmu.lay index f4419de1b90..cb14d4318c0 100644 --- a/src/mame/layout/svmu.lay +++ b/src/mame/layout/svmu.lay @@ -47,9 +47,4 @@ <bounds left="0" top="0" right="~scr0width~" bottom="~scr0height~" /> </screen> </view> - <view name="LCD Only"> - <screen index="0"> - <bounds left="0" top="0" right="~scr0width~" bottom="~scr0height~" /> - </screen> - </view> </mamelayout> diff --git a/src/mame/layout/vgmplay.lay b/src/mame/layout/vgmplay.lay index 30efd5be8c9..065e96e8cf5 100644 --- a/src/mame/layout/vgmplay.lay +++ b/src/mame/layout/vgmplay.lay @@ -1,34 +1,48 @@ -<?xml version="1.0"?> +<?xml version="1.0"?> <mamelayout version="2"> <!-- Activity LEDs: - 0: AY-3-8910 - 1: SN76496 - 2: Oki M6295 + 0: SN76496 + 1: YM2413 + 2: YM2612 3: YM2151 - 4: YM2203 - 5: YM2413 - 6: YM2608 - 7: YM2612 - 8: YM3526 + 4: Sega PCM + 5: RF5C68 + 6: YM2203 + 7: YM2608 + 8: YM2610 9: YM3812 - 10: YMF271 - 11: YMZ280B - 12: YMW-258-F (MultiPCM) - 13: Sega PCM - 14: QSound - 15: POKEY - 16: NES APU - 17: Game Boy APU - 18: C352 - 19: HuC6280 - 20: K051649 - 21: K053260 - 22: K054539 - 23: GA20 - 24: RF5C68 - 25: RF5C164 - 26: X1-010 + 10: YM3526 + 11: Y8950 + 12: YMF262 + 13: YMF278B + 14: YMF271 + 15: YMZ280B + 16: RF5C164 + 17: Sega 32X PWM + 18: AY-3-8910 + 19: Game Boy APU + 20: NES APU + 21: YMW-258-F (MultiPCM) + 22: uPD7759 + 23: Oki M6258 + 24: Oki M6295 + 25: K051649 + 26: K054539 + 27: HuC6280 + 28: C-140 + 29: K053260 + 30: POKEY + 31: QSound + 32: SCSP + 33: WonderSwan + 34: VSU-VUE + 35: SAA1099 + 36: ES5503 + 37: ES5505 + 38: X1-010 + 39: C352 + 40: GA20 --> <element name="backdrop"><rect><color red="0.0" green="0.0" blue="0.0" /></rect></element> @@ -38,33 +52,47 @@ <disk state="0"><color red="0.15" green="0.0" blue="0.0" /></disk> </element> - <element name="act_label_ay8910"><text string="AY-3-8910" align="1"><color red="1.0" green="1.0" blue="1.0" /></text></element> <element name="act_label_sn76496"><text string="SN76496" align="1"><color red="1.0" green="1.0" blue="1.0" /></text></element> - <element name="act_label_okim6295"><text string="M6295" align="1"><color red="1.0" green="1.0" blue="1.0" /></text></element> + <element name="act_label_ym2413"><text string="YM2413" align="1"><color red="1.0" green="1.0" blue="1.0" /></text></element> + <element name="act_label_ym2612"><text string="YM2612" align="1"><color red="1.0" green="1.0" blue="1.0" /></text></element> <element name="act_label_ym2151"><text string="YM2151" align="1"><color red="1.0" green="1.0" blue="1.0" /></text></element> + <element name="act_label_segapcm"><text string="Sega PCM" align="1"><color red="1.0" green="1.0" blue="1.0" /></text></element> + <element name="act_label_rf5c68"><text string="RF5C68" align="1"><color red="1.0" green="1.0" blue="1.0" /></text></element> <element name="act_label_ym2203"><text string="YM2203" align="1"><color red="1.0" green="1.0" blue="1.0" /></text></element> - <element name="act_label_ym2413"><text string="YM2413" align="1"><color red="1.0" green="1.0" blue="1.0" /></text></element> <element name="act_label_ym2608"><text string="YM2608" align="1"><color red="1.0" green="1.0" blue="1.0" /></text></element> - <element name="act_label_ym2612"><text string="YM2612" align="1"><color red="1.0" green="1.0" blue="1.0" /></text></element> - <element name="act_label_ym3526"><text string="YM3526" align="1"><color red="1.0" green="1.0" blue="1.0" /></text></element> + <element name="act_label_ym2610"><text string="YM2610" align="1"><color red="1.0" green="1.0" blue="1.0" /></text></element> <element name="act_label_ym3812"><text string="YM3812" align="1"><color red="1.0" green="1.0" blue="1.0" /></text></element> + <element name="act_label_ym3526"><text string="YM3526" align="1"><color red="1.0" green="1.0" blue="1.0" /></text></element> + <element name="act_label_y8950"><text string="Y8950" align="1"><color red="1.0" green="1.0" blue="1.0" /></text></element> + <element name="act_label_ymf262"><text string="YMF262" align="1"><color red="1.0" green="1.0" blue="1.0" /></text></element> + <element name="act_label_ymf278b"><text string="YMF278B" align="1"><color red="1.0" green="1.0" blue="1.0" /></text></element> <element name="act_label_ymf271"><text string="YMF271" align="1"><color red="1.0" green="1.0" blue="1.0" /></text></element> <element name="act_label_ymz280b"><text string="YMZ280B" align="1"><color red="1.0" green="1.0" blue="1.0" /></text></element> - <element name="act_label_multipcm"><text string="YMW-258-F" align="1"><color red="1.0" green="1.0" blue="1.0" /></text></element> - <element name="act_label_segapcm"><text string="Sega PCM" align="1"><color red="1.0" green="1.0" blue="1.0" /></text></element> - <element name="act_label_qsound"><text string="QSound™" align="1"><color red="1.0" green="1.0" blue="1.0" /></text></element> - <element name="act_label_pokey"><text string="POKEY" align="1"><color red="1.0" green="1.0" blue="1.0" /></text></element> - <element name="act_label_nesapu"><text string="NES™ APU" align="1"><color red="1.0" green="1.0" blue="1.0" /></text></element> + <element name="act_label_rf5c164"><text string="RF5C164" align="1"><color red="1.0" green="1.0" blue="1.0" /></text></element> + <element name="act_label_pwm"><text string="32X PWM" align="1"><color red="0.5" green="0.5" blue="0.5" /></text></element> + <element name="act_label_ay8910"><text string="AY-3-8910" align="1"><color red="1.0" green="1.0" blue="1.0" /></text></element> <element name="act_label_gameboy"><text string="Game Boy™" align="1"><color red="1.0" green="1.0" blue="1.0" /></text></element> - <element name="act_label_c352"><text string="C352" align="1"><color red="1.0" green="1.0" blue="1.0" /></text></element> - <element name="act_label_c6280"><text string="HuC6280" align="1"><color red="1.0" green="1.0" blue="1.0" /></text></element> + <element name="act_label_nesapu"><text string="NES™ APU" align="1"><color red="1.0" green="1.0" blue="1.0" /></text></element> + <element name="act_label_multipcm"><text string="YMW-258-F" align="1"><color red="1.0" green="1.0" blue="1.0" /></text></element> + <element name="act_label_upd7759"><text string="uPD7759" align="1"><color red="0.5" green="0.5" blue="0.5" /></text></element> + <element name="act_label_okim6258"><text string="M6258" align="1"><color red="0.5" green="0.5" blue="0.5" /></text></element> + <element name="act_label_okim6295"><text string="M6295" align="1"><color red="1.0" green="1.0" blue="1.0" /></text></element> <element name="act_label_k051649"><text string="K051649" align="1"><color red="1.0" green="1.0" blue="1.0" /></text></element> - <element name="act_label_k053260"><text string="K053260" align="1"><color red="1.0" green="1.0" blue="1.0" /></text></element> <element name="act_label_k054539"><text string="K054539" align="1"><color red="1.0" green="1.0" blue="1.0" /></text></element> - <element name="act_label_ga20"><text string="GA20" align="1"><color red="1.0" green="1.0" blue="1.0" /></text></element> - <element name="act_label_rf5c68"><text string="RF5C68" align="1"><color red="1.0" green="1.0" blue="1.0" /></text></element> - <element name="act_label_rf5c164"><text string="RF5C164" align="1"><color red="1.0" green="1.0" blue="1.0" /></text></element> + <element name="act_label_c6280"><text string="HuC6280" align="1"><color red="1.0" green="1.0" blue="1.0" /></text></element> + <element name="act_label_c140"><text string="C140" align="1"><color red="1.0" green="1.0" blue="1.0" /></text></element> + <element name="act_label_k053260"><text string="K053260" align="1"><color red="1.0" green="1.0" blue="1.0" /></text></element> + <element name="act_label_pokey"><text string="POKEY" align="1"><color red="1.0" green="1.0" blue="1.0" /></text></element> + <element name="act_label_qsound"><text string="QSound™" align="1"><color red="1.0" green="1.0" blue="1.0" /></text></element> + <element name="act_label_scsp"><text string="SCSP" align="1"><color red="0.5" green="0.5" blue="0.5" /></text></element> + <element name="act_label_wswan"><text string="WonderSwan" align="1"><color red="1.0" green="1.0" blue="1.0" /></text></element> + <element name="act_label_vsu_vue"><text string="VSU-VUE" align="1"><color red="1.0" green="1.0" blue="1.0" /></text></element> + <element name="act_label_saa1099"><text string="SAA1099" align="1"><color red="1.0" green="1.0" blue="1.0" /></text></element> + <element name="act_label_es5503"><text string="ES5503" align="1"><color red="1.0" green="1.0" blue="1.0" /></text></element> + <element name="act_label_es5505"><text string="ES5505" align="1"><color red="0.5" green="0.5" blue="0.5" /></text></element> <element name="act_label_x1_010"><text string="X1-010" align="1"><color red="1.0" green="1.0" blue="1.0" /></text></element> + <element name="act_label_c352"><text string="C352" align="1"><color red="1.0" green="1.0" blue="1.0" /></text></element> + <element name="act_label_ga20"><text string="GA20" align="1"><color red="1.0" green="1.0" blue="1.0" /></text></element> <element name="static_black2"><rect><color red="0.2" green="0.21" blue="0.23" /></rect></element> @@ -94,7 +122,7 @@ </element> <group name="activity"> - <cpanel element="backdrop"><bounds x="0" y="0" width="60" height="25" /></cpanel> + <cpanel element="backdrop"><bounds x="0" y="0" width="60" height="34" /></cpanel> <cpanel name="led_act_0" element="act_led"><bounds x="1" y="1" width="2" height="2" /></cpanel> <cpanel name="led_act_1" element="act_led"><bounds x="1" y="4" width="2" height="2" /></cpanel> @@ -104,59 +132,87 @@ <cpanel name="led_act_5" element="act_led"><bounds x="1" y="16" width="2" height="2" /></cpanel> <cpanel name="led_act_6" element="act_led"><bounds x="1" y="19" width="2" height="2" /></cpanel> <cpanel name="led_act_7" element="act_led"><bounds x="1" y="22" width="2" height="2" /></cpanel> - - <cpanel name="led_act_8" element="act_led"><bounds x="16" y="1" width="2" height="2" /></cpanel> - <cpanel name="led_act_9" element="act_led"><bounds x="16" y="4" width="2" height="2" /></cpanel> - <cpanel name="led_act_10" element="act_led"><bounds x="16" y="7" width="2" height="2" /></cpanel> - <cpanel name="led_act_11" element="act_led"><bounds x="16" y="10" width="2" height="2" /></cpanel> - <cpanel name="led_act_12" element="act_led"><bounds x="16" y="13" width="2" height="2" /></cpanel> - <cpanel name="led_act_13" element="act_led"><bounds x="16" y="16" width="2" height="2" /></cpanel> - <cpanel name="led_act_14" element="act_led"><bounds x="16" y="19" width="2" height="2" /></cpanel> - <cpanel name="led_act_15" element="act_led"><bounds x="16" y="22" width="2" height="2" /></cpanel> - - <cpanel name="led_act_16" element="act_led"><bounds x="31" y="1" width="2" height="2" /></cpanel> - <cpanel name="led_act_17" element="act_led"><bounds x="31" y="4" width="2" height="2" /></cpanel> - <cpanel name="led_act_18" element="act_led"><bounds x="31" y="7" width="2" height="2" /></cpanel> - <cpanel name="led_act_19" element="act_led"><bounds x="31" y="10" width="2" height="2" /></cpanel> - <cpanel name="led_act_20" element="act_led"><bounds x="31" y="13" width="2" height="2" /></cpanel> - <cpanel name="led_act_21" element="act_led"><bounds x="31" y="16" width="2" height="2" /></cpanel> - <cpanel name="led_act_22" element="act_led"><bounds x="31" y="19" width="2" height="2" /></cpanel> - <cpanel name="led_act_23" element="act_led"><bounds x="31" y="22" width="2" height="2" /></cpanel> - - <cpanel name="led_act_24" element="act_led"><bounds x="46" y="1" width="2" height="2" /></cpanel> - <cpanel name="led_act_25" element="act_led"><bounds x="46" y="4" width="2" height="2" /></cpanel> - <cpanel name="led_act_26" element="act_led"><bounds x="46" y="7" width="2" height="2" /></cpanel> - - <cpanel element="act_label_ay8910"><bounds x="4" y="1.2" width="10" height="1.6" /></cpanel> - <cpanel element="act_label_sn76496"><bounds x="4" y="4.2" width="10" height="1.6" /></cpanel> - <cpanel element="act_label_okim6295"><bounds x="4" y="7.2" width="10" height="1.6" /></cpanel> + <cpanel name="led_act_8" element="act_led"><bounds x="1" y="25" width="2" height="2" /></cpanel> + <cpanel name="led_act_9" element="act_led"><bounds x="1" y="28" width="2" height="2" /></cpanel> + <cpanel name="led_act_10" element="act_led"><bounds x="1" y="31" width="2" height="2" /></cpanel> + + <cpanel name="led_act_11" element="act_led"><bounds x="16" y="1" width="2" height="2" /></cpanel> + <cpanel name="led_act_12" element="act_led"><bounds x="16" y="4" width="2" height="2" /></cpanel> + <cpanel name="led_act_13" element="act_led"><bounds x="16" y="7" width="2" height="2" /></cpanel> + <cpanel name="led_act_14" element="act_led"><bounds x="16" y="10" width="2" height="2" /></cpanel> + <cpanel name="led_act_15" element="act_led"><bounds x="16" y="13" width="2" height="2" /></cpanel> + <cpanel name="led_act_16" element="act_led"><bounds x="16" y="16" width="2" height="2" /></cpanel> + <cpanel name="led_act_17" element="act_led"><bounds x="16" y="19" width="2" height="2" /></cpanel> + <cpanel name="led_act_18" element="act_led"><bounds x="16" y="22" width="2" height="2" /></cpanel> + <cpanel name="led_act_19" element="act_led"><bounds x="16" y="25" width="2" height="2" /></cpanel> + <cpanel name="led_act_20" element="act_led"><bounds x="16" y="28" width="2" height="2" /></cpanel> + <cpanel name="led_act_21" element="act_led"><bounds x="16" y="31" width="2" height="2" /></cpanel> + + <cpanel name="led_act_22" element="act_led"><bounds x="31" y="1" width="2" height="2" /></cpanel> + <cpanel name="led_act_23" element="act_led"><bounds x="31" y="4" width="2" height="2" /></cpanel> + <cpanel name="led_act_24" element="act_led"><bounds x="31" y="7" width="2" height="2" /></cpanel> + <cpanel name="led_act_25" element="act_led"><bounds x="31" y="10" width="2" height="2" /></cpanel> + <cpanel name="led_act_26" element="act_led"><bounds x="31" y="13" width="2" height="2" /></cpanel> + <cpanel name="led_act_27" element="act_led"><bounds x="31" y="16" width="2" height="2" /></cpanel> + <cpanel name="led_act_28" element="act_led"><bounds x="31" y="19" width="2" height="2" /></cpanel> + <cpanel name="led_act_29" element="act_led"><bounds x="31" y="22" width="2" height="2" /></cpanel> + <cpanel name="led_act_30" element="act_led"><bounds x="31" y="25" width="2" height="2" /></cpanel> + <cpanel name="led_act_31" element="act_led"><bounds x="31" y="28" width="2" height="2" /></cpanel> + <cpanel name="led_act_32" element="act_led"><bounds x="31" y="31" width="2" height="2" /></cpanel> + + <cpanel name="led_act_33" element="act_led"><bounds x="46" y="1" width="2" height="2" /></cpanel> + <cpanel name="led_act_34" element="act_led"><bounds x="46" y="4" width="2" height="2" /></cpanel> + <cpanel name="led_act_35" element="act_led"><bounds x="46" y="7" width="2" height="2" /></cpanel> + <cpanel name="led_act_36" element="act_led"><bounds x="46" y="10" width="2" height="2" /></cpanel> + <cpanel name="led_act_37" element="act_led"><bounds x="46" y="13" width="2" height="2" /></cpanel> + <cpanel name="led_act_38" element="act_led"><bounds x="46" y="16" width="2" height="2" /></cpanel> + <cpanel name="led_act_39" element="act_led"><bounds x="46" y="19" width="2" height="2" /></cpanel> + <cpanel name="led_act_40" element="act_led"><bounds x="46" y="22" width="2" height="2" /></cpanel> + + <cpanel element="act_label_sn76496"><bounds x="4" y="1.2" width="10" height="1.6" /></cpanel> + <cpanel element="act_label_ym2413"><bounds x="4" y="4.2" width="10" height="1.6" /></cpanel> + <cpanel element="act_label_ym2612"><bounds x="4" y="7.2" width="10" height="1.6" /></cpanel> <cpanel element="act_label_ym2151"><bounds x="4" y="10.2" width="10" height="1.6" /></cpanel> - <cpanel element="act_label_ym2203"><bounds x="4" y="13.2" width="10" height="1.6" /></cpanel> - <cpanel element="act_label_ym2413"><bounds x="4" y="16.2" width="10" height="1.6" /></cpanel> - <cpanel element="act_label_ym2608"><bounds x="4" y="19.2" width="10" height="1.6" /></cpanel> - <cpanel element="act_label_ym2612"><bounds x="4" y="22.2" width="10" height="1.6" /></cpanel> - - <cpanel element="act_label_ym3526"><bounds x="19" y="1.2" width="10" height="1.6" /></cpanel> - <cpanel element="act_label_ym3812"><bounds x="19" y="4.2" width="10" height="1.6" /></cpanel> - <cpanel element="act_label_ymf271"><bounds x="19" y="7.2" width="10" height="1.6" /></cpanel> - <cpanel element="act_label_ymz280b"><bounds x="19" y="10.2" width="10" height="1.6" /></cpanel> - <cpanel element="act_label_multipcm"><bounds x="19" y="13.2" width="10" height="1.6" /></cpanel> - <cpanel element="act_label_segapcm"><bounds x="19" y="16.2" width="10" height="1.6" /></cpanel> - <cpanel element="act_label_qsound"><bounds x="19" y="19.2" width="10" height="1.6" /></cpanel> - <cpanel element="act_label_pokey"><bounds x="19" y="22.2" width="10" height="1.6" /></cpanel> - - <cpanel element="act_label_nesapu"><bounds x="34" y="1.2" width="10" height="1.6" /></cpanel> - <cpanel element="act_label_gameboy"><bounds x="34" y="4.2" width="10" height="1.6" /></cpanel> - <cpanel element="act_label_c352"><bounds x="34" y="7.2" width="10" height="1.6" /></cpanel> - <cpanel element="act_label_c6280"><bounds x="34" y="10.2" width="10" height="1.6" /></cpanel> - <cpanel element="act_label_k051649"><bounds x="34" y="13.2" width="10" height="1.6" /></cpanel> - <cpanel element="act_label_k053260"><bounds x="34" y="16.2" width="10" height="1.6" /></cpanel> - <cpanel element="act_label_k054539"><bounds x="34" y="19.2" width="10" height="1.6" /></cpanel> - <cpanel element="act_label_ga20"><bounds x="34" y="22.2" width="10" height="1.6" /></cpanel> - - <cpanel element="act_label_rf5c68"><bounds x="49" y="1.2" width="10" height="1.6" /></cpanel> - <cpanel element="act_label_rf5c164"><bounds x="49" y="4.2" width="10" height="1.6" /></cpanel> - <cpanel element="act_label_x1_010"><bounds x="49" y="7.2" width="10" height="1.6" /></cpanel> + <cpanel element="act_label_segapcm"><bounds x="4" y="13.2" width="10" height="1.6" /></cpanel> + <cpanel element="act_label_rf5c68"><bounds x="4" y="16.2" width="10" height="1.6" /></cpanel> + <cpanel element="act_label_ym2203"><bounds x="4" y="19.2" width="10" height="1.6" /></cpanel> + <cpanel element="act_label_ym2608"><bounds x="4" y="22.2" width="10" height="1.6" /></cpanel> + <cpanel element="act_label_ym2610"><bounds x="4" y="25.2" width="10" height="1.6" /></cpanel> + <cpanel element="act_label_ym3812"><bounds x="4" y="28.2" width="10" height="1.6" /></cpanel> + <cpanel element="act_label_ym3526"><bounds x="4" y="31.2" width="10" height="1.6" /></cpanel> + + <cpanel element="act_label_y8950"><bounds x="19" y="1.2" width="10" height="1.6" /></cpanel> + <cpanel element="act_label_ymf262"><bounds x="19" y="4.2" width="10" height="1.6" /></cpanel> + <cpanel element="act_label_ymf278b"><bounds x="19" y="7.2" width="10" height="1.6" /></cpanel> + <cpanel element="act_label_ymf271"><bounds x="19" y="10.2" width="10" height="1.6" /></cpanel> + <cpanel element="act_label_ymz280b"><bounds x="19" y="13.2" width="10" height="1.6" /></cpanel> + <cpanel element="act_label_rf5c164"><bounds x="19" y="16.2" width="10" height="1.6" /></cpanel> + <cpanel element="act_label_pwm"><bounds x="19" y="19.2" width="10" height="1.6" /></cpanel> + <cpanel element="act_label_ay8910"><bounds x="19" y="22.2" width="10" height="1.6" /></cpanel> + <cpanel element="act_label_gameboy"><bounds x="19" y="25.2" width="10" height="1.6" /></cpanel> + <cpanel element="act_label_nesapu"><bounds x="19" y="28.2" width="10" height="1.6" /></cpanel> + <cpanel element="act_label_multipcm"><bounds x="19" y="31.2" width="10" height="1.6" /></cpanel> + + <cpanel element="act_label_upd7759"><bounds x="34" y="1.2" width="10" height="1.6" /></cpanel> + <cpanel element="act_label_okim6258"><bounds x="34" y="4.2" width="10" height="1.6" /></cpanel> + <cpanel element="act_label_okim6295"><bounds x="34" y="7.2" width="10" height="1.6" /></cpanel> + <cpanel element="act_label_k051649"><bounds x="34" y="10.2" width="10" height="1.6" /></cpanel> + <cpanel element="act_label_k054539"><bounds x="34" y="13.2" width="10" height="1.6" /></cpanel> + <cpanel element="act_label_c6280"><bounds x="34" y="16.2" width="10" height="1.6" /></cpanel> + <cpanel element="act_label_c140"><bounds x="34" y="19.2" width="10" height="1.6" /></cpanel> + <cpanel element="act_label_k053260"><bounds x="34" y="22.2" width="10" height="1.6" /></cpanel> + <cpanel element="act_label_pokey"><bounds x="34" y="25.2" width="10" height="1.6" /></cpanel> + <cpanel element="act_label_qsound"><bounds x="34" y="28.2" width="10" height="1.6" /></cpanel> + <cpanel element="act_label_scsp"><bounds x="34" y="31.2" width="10" height="1.6" /></cpanel> + + <cpanel element="act_label_wswan"><bounds x="49" y="1.2" width="10" height="1.6" /></cpanel> + <cpanel element="act_label_vsu_vue"><bounds x="49" y="4.2" width="10" height="1.6" /></cpanel> + <cpanel element="act_label_saa1099"><bounds x="49" y="7.2" width="10" height="1.6" /></cpanel> + <cpanel element="act_label_es5503"><bounds x="49" y="10.2" width="10" height="1.6" /></cpanel> + <cpanel element="act_label_es5505"><bounds x="49" y="13.2" width="10" height="1.6" /></cpanel> + <cpanel element="act_label_x1_010"><bounds x="49" y="16.2" width="10" height="1.6" /></cpanel> + <cpanel element="act_label_c352"><bounds x="49" y="19.2" width="10" height="1.6" /></cpanel> + <cpanel element="act_label_ga20"><bounds x="49" y="22.2" width="10" height="1.6" /></cpanel> </group> <view name="Internal Layout"> @@ -180,6 +236,6 @@ <cpanel element="hl1" inputtag="CONTROLS" inputmask="0x0008"><bounds x="36" y="4" width="11" height="5" /><color alpha="0.15" /></cpanel> <cpanel element="hl1" inputtag="CONTROLS" inputmask="0x0010"><bounds x="48" y="4" width="11" height="5" /><color alpha="0.15" /></cpanel> - <group ref="activity"><bounds x="0" y="30" width="60" height="25" /></group> + <group ref="activity"><bounds x="0" y="21" width="60" height="34" /></group> </view> </mamelayout> diff --git a/src/mame/layout/whousetc.lay b/src/mame/layout/whousetc.lay index 8c621db3b54..b76e6901214 100644 --- a/src/mame/layout/whousetc.lay +++ b/src/mame/layout/whousetc.lay @@ -17,10 +17,14 @@ Westinghouse Test Console Serial #5 layout <bounds left="0" top="0" right="1" bottom="1" /> <color red="1.0" green="1.0" blue="1.0" /> </rect> - <rect> + <rect state="0"> <bounds left="0.05" top="0.05" right="0.95" bottom="0.95" /> <color red="0.9" green="0.9" blue="0.9" /> </rect> + <rect state="1"> + <bounds left="0.05" top="0.05" right="0.95" bottom="0.95" /> + <color red="0.6" green="0.6" blue="0.6" /> + </rect> <text string="MODE"> <bounds left="0.1" top="0.35" right="0.9" bottom="0.65" /> <color red="0.0" green="0.0" blue="0.0" /> @@ -32,14 +36,22 @@ Westinghouse Test Console Serial #5 layout <bounds left="0" top="0" right="1" bottom="1" /> <color red="1.0" green="1.0" blue="1.0" /> </rect> - <rect> + <rect state="0"> <bounds left="0.05" top="0.05" right="0.95" bottom="0.5" /> <color red="1.0" green="1.0" blue="0.3" /> </rect> - <rect> + <rect state="1"> + <bounds left="0.05" top="0.05" right="0.95" bottom="0.5" /> + <color red="0.67" green="0.67" blue="0.2" /> + </rect> + <rect state="0"> <bounds left="0.05" top="0.5" right="0.95" bottom="0.95" /> <color red="0.4" green="1.0" blue="1.0" /> </rect> + <rect state="1"> + <bounds left="0.05" top="0.5" right="0.95" bottom="0.95" /> + <color red="0.27" green="0.67" blue="0.67" /> + </rect> <text string="TRAP"> <bounds left="0.1" top="0.125" right="0.9" bottom="0.425" /> <color red="0.0" green="0.0" blue="0.0" /> @@ -55,14 +67,22 @@ Westinghouse Test Console Serial #5 layout <bounds left="0" top="0" right="1" bottom="1" /> <color red="1.0" green="1.0" blue="1.0" /> </rect> - <rect> + <rect state="0"> <bounds left="0.05" top="0.05" right="0.95" bottom="0.5" /> <color red="1.0" green="1.0" blue="0.3" /> </rect> - <rect> + <rect state="1"> + <bounds left="0.05" top="0.05" right="0.95" bottom="0.5" /> + <color red="0.67" green="0.67" blue="0.2" /> + </rect> + <rect state="0"> <bounds left="0.05" top="0.5" right="0.95" bottom="0.95" /> <color red="0.4" green="1.0" blue="1.0" /> </rect> + <rect state="1"> + <bounds left="0.05" top="0.5" right="0.95" bottom="0.95" /> + <color red="0.27" green="0.67" blue="0.67" /> + </rect> <text string="ARM"> <bounds left="0.1" top="0.125" right="0.9" bottom="0.425" /> <color red="0.0" green="0.0" blue="0.0" /> @@ -78,14 +98,22 @@ Westinghouse Test Console Serial #5 layout <bounds left="0" top="0" right="1" bottom="1" /> <color red="1.0" green="1.0" blue="1.0" /> </rect> - <rect> + <rect state="0"> <bounds left="0.05" top="0.05" right="0.95" bottom="0.5" /> <color red="1.0" green="1.0" blue="0.3" /> </rect> - <rect> + <rect state="1"> + <bounds left="0.05" top="0.05" right="0.95" bottom="0.5" /> + <color red="0.67" green="0.67" blue="0.2" /> + </rect> + <rect state="0"> <bounds left="0.05" top="0.5" right="0.95" bottom="0.95" /> <color red="0.4" green="1.0" blue="1.0" /> </rect> + <rect state="1"> + <bounds left="0.05" top="0.5" right="0.95" bottom="0.95" /> + <color red="0.27" green="0.67" blue="0.67" /> + </rect> <text string="RESET"> <bounds left="0.1" top="0.125" right="0.9" bottom="0.425" /> <color red="0.0" green="0.0" blue="0.0" /> @@ -101,14 +129,22 @@ Westinghouse Test Console Serial #5 layout <bounds left="0" top="0" right="1" bottom="1" /> <color red="1.0" green="1.0" blue="1.0" /> </rect> - <rect> + <rect state="0"> <bounds left="0.05" top="0.05" right="0.95" bottom="0.5" /> <color red="1.0" green="1.0" blue="0.3" /> </rect> - <rect> + <rect state="1"> + <bounds left="0.05" top="0.05" right="0.95" bottom="0.5" /> + <color red="0.67" green="0.67" blue="0.2" /> + </rect> + <rect state="0"> <bounds left="0.05" top="0.5" right="0.95" bottom="0.95" /> <color red="0.4" green="1.0" blue="1.0" /> </rect> + <rect state="1"> + <bounds left="0.05" top="0.5" right="0.95" bottom="0.95" /> + <color red="0.27" green="0.67" blue="0.67" /> + </rect> <text string="MNE"> <bounds left="0.1" top="0.125" right="0.9" bottom="0.425" /> <color red="0.0" green="0.0" blue="0.0" /> @@ -124,14 +160,22 @@ Westinghouse Test Console Serial #5 layout <bounds left="0" top="0" right="1" bottom="1" /> <color red="1.0" green="1.0" blue="1.0" /> </rect> - <rect> + <rect state="0"> <bounds left="0.05" top="0.05" right="0.95" bottom="0.5" /> <color red="1.0" green="1.0" blue="0.3" /> </rect> - <rect> + <rect state="1"> + <bounds left="0.05" top="0.05" right="0.95" bottom="0.5" /> + <color red="0.67" green="0.67" blue="0.2" /> + </rect> + <rect state="0"> <bounds left="0.05" top="0.5" right="0.95" bottom="0.95" /> <color red="0.4" green="1.0" blue="1.0" /> </rect> + <rect state="1"> + <bounds left="0.05" top="0.5" right="0.95" bottom="0.95" /> + <color red="0.27" green="0.67" blue="0.67" /> + </rect> <text string="HARD"> <bounds left="0.1" top="0.125" right="0.9" bottom="0.425" /> <color red="0.0" green="0.0" blue="0.0" /> @@ -147,14 +191,22 @@ Westinghouse Test Console Serial #5 layout <bounds left="0" top="0" right="1" bottom="1" /> <color red="1.0" green="1.0" blue="1.0" /> </rect> - <rect> + <rect state="0"> <bounds left="0.05" top="0.05" right="0.95" bottom="0.5" /> <color red="1.0" green="1.0" blue="0.3" /> </rect> - <rect> + <rect state="1"> + <bounds left="0.05" top="0.05" right="0.95" bottom="0.5" /> + <color red="0.67" green="0.67" blue="0.2" /> + </rect> + <rect state="0"> <bounds left="0.05" top="0.5" right="0.95" bottom="0.95" /> <color red="0.4" green="1.0" blue="1.0" /> </rect> + <rect state="1"> + <bounds left="0.05" top="0.5" right="0.95" bottom="0.95" /> + <color red="0.27" green="0.67" blue="0.67" /> + </rect> <text string="TRACE"> <bounds left="0.1" top="0.125" right="0.9" bottom="0.425" /> <color red="0.0" green="0.0" blue="0.0" /> @@ -170,14 +222,22 @@ Westinghouse Test Console Serial #5 layout <bounds left="0" top="0" right="1" bottom="1" /> <color red="1.0" green="1.0" blue="1.0" /> </rect> - <rect> + <rect state="0"> <bounds left="0.05" top="0.05" right="0.95" bottom="0.5" /> <color red="1.0" green="1.0" blue="0.3" /> </rect> - <rect> + <rect state="1"> + <bounds left="0.05" top="0.05" right="0.95" bottom="0.5" /> + <color red="0.67" green="0.67" blue="0.2" /> + </rect> + <rect state="0"> <bounds left="0.05" top="0.5" right="0.95" bottom="0.95" /> <color red="0.4" green="1.0" blue="1.0" /> </rect> + <rect state="1"> + <bounds left="0.05" top="0.5" right="0.95" bottom="0.95" /> + <color red="0.27" green="0.67" blue="0.67" /> + </rect> <text string="REL"> <bounds left="0.1" top="0.125" right="0.9" bottom="0.425" /> <color red="0.0" green="0.0" blue="0.0" /> @@ -193,14 +253,22 @@ Westinghouse Test Console Serial #5 layout <bounds left="0" top="0" right="1" bottom="1" /> <color red="1.0" green="1.0" blue="1.0" /> </rect> - <rect> + <rect state="0"> <bounds left="0.05" top="0.05" right="0.95" bottom="0.5" /> <color red="1.0" green="1.0" blue="0.3" /> </rect> - <rect> + <rect state="1"> + <bounds left="0.05" top="0.05" right="0.95" bottom="0.5" /> + <color red="0.67" green="0.67" blue="0.2" /> + </rect> + <rect state="0"> <bounds left="0.05" top="0.5" right="0.95" bottom="0.95" /> <color red="1.0" green="0.8" blue="0.7" /> </rect> + <rect state="1"> + <bounds left="0.05" top="0.5" right="0.95" bottom="0.95" /> + <color red="0.67" green="0.53" blue="0.47" /> + </rect> <text string="REC"> <bounds left="0.1" top="0.125" right="0.9" bottom="0.425" /> <color red="0.0" green="0.0" blue="0.0" /> @@ -216,14 +284,22 @@ Westinghouse Test Console Serial #5 layout <bounds left="0" top="0" right="1" bottom="1" /> <color red="1.0" green="1.0" blue="1.0" /> </rect> - <rect> + <rect state="0"> <bounds left="0.05" top="0.05" right="0.95" bottom="0.5" /> <color red="1.0" green="1.0" blue="0.3" /> </rect> - <rect> + <rect state="1"> + <bounds left="0.05" top="0.05" right="0.95" bottom="0.5" /> + <color red="0.67" green="0.67" blue="0.2" /> + </rect> + <rect state="0"> <bounds left="0.05" top="0.5" right="0.95" bottom="0.95" /> <color red="1.0" green="0.8" blue="0.7" /> </rect> + <rect state="1"> + <bounds left="0.05" top="0.5" right="0.95" bottom="0.95" /> + <color red="0.67" green="0.53" blue="0.47" /> + </rect> <text string="SOFT"> <bounds left="0.1" top="0.125" right="0.9" bottom="0.425" /> <color red="0.0" green="0.0" blue="0.0" /> @@ -239,14 +315,22 @@ Westinghouse Test Console Serial #5 layout <bounds left="0" top="0" right="1" bottom="1" /> <color red="1.0" green="1.0" blue="1.0" /> </rect> - <rect> + <rect state="0"> <bounds left="0.05" top="0.05" right="0.95" bottom="0.5" /> <color red="1.0" green="1.0" blue="0.3" /> </rect> - <rect> + <rect state="1"> + <bounds left="0.05" top="0.05" right="0.95" bottom="0.5" /> + <color red="0.67" green="0.67" blue="0.2" /> + </rect> + <rect state="0"> <bounds left="0.05" top="0.5" right="0.95" bottom="0.95" /> <color red="1.0" green="0.8" blue="0.7" /> </rect> + <rect state="1"> + <bounds left="0.05" top="0.5" right="0.95" bottom="0.95" /> + <color red="0.67" green="0.53" blue="0.47" /> + </rect> <text string="DISP"> <bounds left="0.1" top="0.125" right="0.9" bottom="0.425" /> <color red="0.0" green="0.0" blue="0.0" /> @@ -262,14 +346,22 @@ Westinghouse Test Console Serial #5 layout <bounds left="0" top="0" right="1" bottom="1" /> <color red="1.0" green="1.0" blue="1.0" /> </rect> - <rect> + <rect state="0"> <bounds left="0.05" top="0.05" right="0.95" bottom="0.5" /> <color red="1.0" green="1.0" blue="0.3" /> </rect> - <rect> + <rect state="1"> + <bounds left="0.05" top="0.05" right="0.95" bottom="0.5" /> + <color red="0.67" green="0.67" blue="0.2" /> + </rect> + <rect state="0"> <bounds left="0.05" top="0.5" right="0.95" bottom="0.95" /> <color red="1.0" green="0.8" blue="0.7" /> </rect> + <rect state="1"> + <bounds left="0.05" top="0.5" right="0.95" bottom="0.95" /> + <color red="0.67" green="0.53" blue="0.47" /> + </rect> <text string="STEP"> <bounds left="0.1" top="0.125" right="0.9" bottom="0.425" /> <color red="0.0" green="0.0" blue="0.0" /> @@ -285,10 +377,14 @@ Westinghouse Test Console Serial #5 layout <bounds left="0" top="0" right="1" bottom="1" /> <color red="1.0" green="1.0" blue="1.0" /> </rect> - <rect> + <rect state="0"> <bounds left="0.05" top="0.05" right="0.95" bottom="0.95" /> <color red="0.9" green="0.9" blue="0.9" /> </rect> + <rect state="1"> + <bounds left="0.05" top="0.05" right="0.95" bottom="0.95" /> + <color red="0.6" green="0.6" blue="0.6" /> + </rect> <text string="←"> <bounds left="0.1" top="0.125" right="0.9" bottom="0.425" /> <color red="0.0" green="0.0" blue="0.0" /> @@ -304,10 +400,14 @@ Westinghouse Test Console Serial #5 layout <bounds left="0" top="0" right="1" bottom="1" /> <color red="1.0" green="1.0" blue="1.0" /> </rect> - <rect> + <rect state="0"> <bounds left="0.05" top="0.05" right="0.95" bottom="0.95" /> <color red="0.9" green="0.9" blue="0.9" /> </rect> + <rect state="1"> + <bounds left="0.05" top="0.05" right="0.95" bottom="0.95" /> + <color red="0.6" green="0.6" blue="0.6" /> + </rect> <text string="→"> <bounds left="0.1" top="0.125" right="0.9" bottom="0.425" /> <color red="0.0" green="0.0" blue="0.0" /> @@ -323,14 +423,22 @@ Westinghouse Test Console Serial #5 layout <bounds left="0" top="0" right="1" bottom="1" /> <color red="1.0" green="1.0" blue="1.0" /> </rect> - <rect> + <rect state="0"> <bounds left="0.05" top="0.05" right="0.95" bottom="0.5" /> <color red="1.0" green="1.0" blue="0.3" /> </rect> - <rect> + <rect state="1"> + <bounds left="0.05" top="0.05" right="0.95" bottom="0.5" /> + <color red="0.67" green="0.67" blue="0.2" /> + </rect> + <rect state="0"> <bounds left="0.05" top="0.5" right="0.95" bottom="0.95" /> <color red="1.0" green="0.8" blue="0.7" /> </rect> + <rect state="1"> + <bounds left="0.05" top="0.5" right="0.95" bottom="0.95" /> + <color red="0.67" green="0.53" blue="0.47" /> + </rect> <text string="X"> <bounds left="0.1" top="0.125" right="0.9" bottom="0.425" /> <color red="0.0" green="0.0" blue="0.0" /> @@ -346,10 +454,14 @@ Westinghouse Test Console Serial #5 layout <bounds left="0" top="0" right="1" bottom="1" /> <color red="1.0" green="1.0" blue="1.0" /> </rect> - <rect> + <rect state="0"> <bounds left="0.05" top="0.05" right="0.95" bottom="0.95" /> <color red="0.9" green="0.9" blue="0.9" /> </rect> + <rect state="1"> + <bounds left="0.05" top="0.05" right="0.95" bottom="0.95" /> + <color red="0.6" green="0.6" blue="0.6" /> + </rect> <text string="ENTER"> <bounds left="0.1" top="0.35" right="0.9" bottom="0.65" /> <color red="0.0" green="0.0" blue="0.0" /> @@ -361,10 +473,14 @@ Westinghouse Test Console Serial #5 layout <bounds left="0" top="0" right="1" bottom="1" /> <color red="1.0" green="1.0" blue="1.0" /> </rect> - <rect> + <rect state="0"> <bounds left="0.05" top="0.05" right="0.95" bottom="0.95" /> <color red="0.9" green="0.9" blue="0.9" /> </rect> + <rect state="1"> + <bounds left="0.05" top="0.05" right="0.95" bottom="0.95" /> + <color red="0.6" green="0.6" blue="0.6" /> + </rect> <text string="C"> <bounds left="0.0" top="0.2" right="0.8" bottom="1.0" /> <color red="0.0" green="0.0" blue="0.0" /> @@ -380,10 +496,14 @@ Westinghouse Test Console Serial #5 layout <bounds left="0" top="0" right="1" bottom="1" /> <color red="1.0" green="1.0" blue="1.0" /> </rect> - <rect> + <rect state="0"> <bounds left="0.05" top="0.05" right="0.95" bottom="0.95" /> <color red="0.9" green="0.9" blue="0.9" /> </rect> + <rect state="1"> + <bounds left="0.05" top="0.05" right="0.95" bottom="0.95" /> + <color red="0.6" green="0.6" blue="0.6" /> + </rect> <text string="D"> <bounds left="0.0" top="0.2" right="0.8" bottom="1.0" /> <color red="0.0" green="0.0" blue="0.0" /> @@ -399,10 +519,14 @@ Westinghouse Test Console Serial #5 layout <bounds left="0" top="0" right="1" bottom="1" /> <color red="1.0" green="1.0" blue="1.0" /> </rect> - <rect> + <rect state="0"> <bounds left="0.05" top="0.05" right="0.95" bottom="0.95" /> <color red="0.9" green="0.9" blue="0.9" /> </rect> + <rect state="1"> + <bounds left="0.05" top="0.05" right="0.95" bottom="0.95" /> + <color red="0.6" green="0.6" blue="0.6" /> + </rect> <text string="E"> <bounds left="0.0" top="0.2" right="0.8" bottom="1.0" /> <color red="0.0" green="0.0" blue="0.0" /> @@ -418,10 +542,14 @@ Westinghouse Test Console Serial #5 layout <bounds left="0" top="0" right="1" bottom="1" /> <color red="1.0" green="1.0" blue="1.0" /> </rect> - <rect> + <rect state="0"> <bounds left="0.05" top="0.05" right="0.95" bottom="0.95" /> <color red="0.9" green="0.9" blue="0.9" /> </rect> + <rect state="1"> + <bounds left="0.05" top="0.05" right="0.95" bottom="0.95" /> + <color red="0.6" green="0.6" blue="0.6" /> + </rect> <text string="F"> <bounds left="0.0" top="0.2" right="0.8" bottom="1.0" /> <color red="0.0" green="0.0" blue="0.0" /> @@ -437,10 +565,14 @@ Westinghouse Test Console Serial #5 layout <bounds left="0" top="0" right="1" bottom="1" /> <color red="1.0" green="1.0" blue="1.0" /> </rect> - <rect> + <rect state="0"> <bounds left="0.05" top="0.05" right="0.95" bottom="0.95" /> <color red="0.9" green="0.9" blue="0.9" /> </rect> + <rect state="1"> + <bounds left="0.05" top="0.05" right="0.95" bottom="0.95" /> + <color red="0.6" green="0.6" blue="0.6" /> + </rect> <text string="8"> <bounds left="0.0" top="0.2" right="0.8" bottom="1.0" /> <color red="0.0" green="0.0" blue="0.0" /> @@ -456,10 +588,14 @@ Westinghouse Test Console Serial #5 layout <bounds left="0" top="0" right="1" bottom="1" /> <color red="1.0" green="1.0" blue="1.0" /> </rect> - <rect> + <rect state="0"> <bounds left="0.05" top="0.05" right="0.95" bottom="0.95" /> <color red="0.9" green="0.9" blue="0.9" /> </rect> + <rect state="1"> + <bounds left="0.05" top="0.05" right="0.95" bottom="0.95" /> + <color red="0.6" green="0.6" blue="0.6" /> + </rect> <text string="9"> <bounds left="0.0" top="0.2" right="0.8" bottom="1.0" /> <color red="0.0" green="0.0" blue="0.0" /> @@ -475,10 +611,14 @@ Westinghouse Test Console Serial #5 layout <bounds left="0" top="0" right="1" bottom="1" /> <color red="1.0" green="1.0" blue="1.0" /> </rect> - <rect> + <rect state="0"> <bounds left="0.05" top="0.05" right="0.95" bottom="0.95" /> <color red="0.9" green="0.9" blue="0.9" /> </rect> + <rect state="1"> + <bounds left="0.05" top="0.05" right="0.95" bottom="0.95" /> + <color red="0.6" green="0.6" blue="0.6" /> + </rect> <text string="A"> <bounds left="0.0" top="0.2" right="0.8" bottom="1.0" /> <color red="0.0" green="0.0" blue="0.0" /> @@ -494,10 +634,14 @@ Westinghouse Test Console Serial #5 layout <bounds left="0" top="0" right="1" bottom="1" /> <color red="1.0" green="1.0" blue="1.0" /> </rect> - <rect> + <rect state="0"> <bounds left="0.05" top="0.05" right="0.95" bottom="0.95" /> <color red="0.9" green="0.9" blue="0.9" /> </rect> + <rect state="1"> + <bounds left="0.05" top="0.05" right="0.95" bottom="0.95" /> + <color red="0.6" green="0.6" blue="0.6" /> + </rect> <text string="B"> <bounds left="0.0" top="0.2" right="0.8" bottom="1.0" /> <color red="0.0" green="0.0" blue="0.0" /> @@ -513,10 +657,14 @@ Westinghouse Test Console Serial #5 layout <bounds left="0" top="0" right="1" bottom="1" /> <color red="1.0" green="1.0" blue="1.0" /> </rect> - <rect> + <rect state="0"> <bounds left="0.05" top="0.05" right="0.95" bottom="0.95" /> <color red="0.9" green="0.9" blue="0.9" /> </rect> + <rect state="1"> + <bounds left="0.05" top="0.05" right="0.95" bottom="0.95" /> + <color red="0.6" green="0.6" blue="0.6" /> + </rect> <text string="4"> <bounds left="0.1" top="0.1" right="0.9" bottom="0.9" /> <color red="0.0" green="0.0" blue="0.0" /> @@ -528,10 +676,14 @@ Westinghouse Test Console Serial #5 layout <bounds left="0" top="0" right="1" bottom="1" /> <color red="1.0" green="1.0" blue="1.0" /> </rect> - <rect> + <rect state="0"> <bounds left="0.05" top="0.05" right="0.95" bottom="0.95" /> <color red="0.9" green="0.9" blue="0.9" /> </rect> + <rect state="1"> + <bounds left="0.05" top="0.05" right="0.95" bottom="0.95" /> + <color red="0.6" green="0.6" blue="0.6" /> + </rect> <text string="5"> <bounds left="0.1" top="0.1" right="0.9" bottom="0.9" /> <color red="0.0" green="0.0" blue="0.0" /> @@ -543,10 +695,14 @@ Westinghouse Test Console Serial #5 layout <bounds left="0" top="0" right="1" bottom="1" /> <color red="1.0" green="1.0" blue="1.0" /> </rect> - <rect> + <rect state="0"> <bounds left="0.05" top="0.05" right="0.95" bottom="0.95" /> <color red="0.9" green="0.9" blue="0.9" /> </rect> + <rect state="1"> + <bounds left="0.05" top="0.05" right="0.95" bottom="0.95" /> + <color red="0.6" green="0.6" blue="0.6" /> + </rect> <text string="6"> <bounds left="0.1" top="0.1" right="0.9" bottom="0.9" /> <color red="0.0" green="0.0" blue="0.0" /> @@ -558,10 +714,14 @@ Westinghouse Test Console Serial #5 layout <bounds left="0" top="0" right="1" bottom="1" /> <color red="1.0" green="1.0" blue="1.0" /> </rect> - <rect> + <rect state="0"> <bounds left="0.05" top="0.05" right="0.95" bottom="0.95" /> <color red="0.9" green="0.9" blue="0.9" /> </rect> + <rect state="1"> + <bounds left="0.05" top="0.05" right="0.95" bottom="0.95" /> + <color red="0.6" green="0.6" blue="0.6" /> + </rect> <text string="7"> <bounds left="0.1" top="0.1" right="0.9" bottom="0.9" /> <color red="0.0" green="0.0" blue="0.0" /> @@ -573,10 +733,14 @@ Westinghouse Test Console Serial #5 layout <bounds left="0" top="0" right="1" bottom="1" /> <color red="1.0" green="1.0" blue="1.0" /> </rect> - <rect> + <rect state="0"> <bounds left="0.05" top="0.05" right="0.95" bottom="0.95" /> <color red="0.9" green="0.9" blue="0.9" /> </rect> + <rect state="1"> + <bounds left="0.05" top="0.05" right="0.95" bottom="0.95" /> + <color red="0.6" green="0.6" blue="0.6" /> + </rect> <text string="0"> <bounds left="0.1" top="0.1" right="0.9" bottom="0.9" /> <color red="0.0" green="0.0" blue="0.0" /> @@ -588,10 +752,14 @@ Westinghouse Test Console Serial #5 layout <bounds left="0" top="0" right="1" bottom="1" /> <color red="1.0" green="1.0" blue="1.0" /> </rect> - <rect> + <rect state="0"> <bounds left="0.05" top="0.05" right="0.95" bottom="0.95" /> <color red="0.9" green="0.9" blue="0.9" /> </rect> + <rect state="1"> + <bounds left="0.05" top="0.05" right="0.95" bottom="0.95" /> + <color red="0.6" green="0.6" blue="0.6" /> + </rect> <text string="1"> <bounds left="0.1" top="0.1" right="0.9" bottom="0.9" /> <color red="0.0" green="0.0" blue="0.0" /> @@ -603,10 +771,14 @@ Westinghouse Test Console Serial #5 layout <bounds left="0" top="0" right="1" bottom="1" /> <color red="1.0" green="1.0" blue="1.0" /> </rect> - <rect> + <rect state="0"> <bounds left="0.05" top="0.05" right="0.95" bottom="0.95" /> <color red="0.9" green="0.9" blue="0.9" /> </rect> + <rect state="1"> + <bounds left="0.05" top="0.05" right="0.95" bottom="0.95" /> + <color red="0.6" green="0.6" blue="0.6" /> + </rect> <text string="2"> <bounds left="0.1" top="0.1" right="0.9" bottom="0.9" /> <color red="0.0" green="0.0" blue="0.0" /> @@ -618,10 +790,14 @@ Westinghouse Test Console Serial #5 layout <bounds left="0" top="0" right="1" bottom="1" /> <color red="1.0" green="1.0" blue="1.0" /> </rect> - <rect> + <rect state="0"> <bounds left="0.05" top="0.05" right="0.95" bottom="0.95" /> <color red="0.9" green="0.9" blue="0.9" /> </rect> + <rect state="1"> + <bounds left="0.05" top="0.05" right="0.95" bottom="0.95" /> + <color red="0.6" green="0.6" blue="0.6" /> + </rect> <text string="3"> <bounds left="0.1" top="0.1" right="0.9" bottom="0.9" /> <color red="0.0" green="0.0" blue="0.0" /> @@ -650,18 +826,18 @@ Westinghouse Test Console Serial #5 layout </repeat> <repeat count="2"> - <param name="col" start="0" increment="4" /> - <param name="x" start="10" increment="530" /> + <param name="group" start="0" increment="4" /> + <param name="padx" start="10" increment="530" /> <param name="mask" start="0x01" lshift="4" /> <repeat count="4"> <param name="row" start="0" increment="1" /> <param name="y" start="100" increment="110" /> <repeat count="4"> - <param name="col" start="~col~" increment="1" /> - <param name="x" start="~x~" increment="110" /> + <param name="col" start="~group~" increment="1" /> + <param name="btnx" start="~padx~" increment="110" /> <param name="mask" start="~mask~" lshift="1" /> - <bezel name="btn~row~~col~" element="btn~row~~col~" inputtag="row~row~" inputmask="~mask~"> - <bounds x="~x~" y="~y~" width="80" height="80" /> + <bezel element="btn~row~~col~" inputtag="row~row~" inputmask="~mask~"> + <bounds x="~btnx~" y="~y~" width="80" height="80" /> </bezel> </repeat> </repeat> diff --git a/src/mame/layout/wildfire.lay b/src/mame/layout/wildfire.lay index 7bec0a1d3d2..3c9a3fae054 100644 --- a/src/mame/layout/wildfire.lay +++ b/src/mame/layout/wildfire.lay @@ -30,10 +30,10 @@ <repeat count="13"> <param name="ypos" start="20" increment="2" /> - <param name="lampno" start="0" increment="10" /> + <param name="rowno" start="0" increment="10" /> <repeat count="8"> <param name="xpos" start="0" increment="2" /> - <param name="lampno" start="~lampno~" increment="1" /> + <param name="lampno" start="~rowno~" increment="1" /> <bezel name="lamp~lampno~" element="led"> <bounds x="~xpos~" y="~ypos~" width="1" height="1" /> </bezel> diff --git a/src/mame/machine/315-5838_317-0229_comp.cpp b/src/mame/machine/315-5838_317-0229_comp.cpp index f9f80522ada..5716f30ddb6 100644 --- a/src/mame/machine/315-5838_317-0229_comp.cpp +++ b/src/mame/machine/315-5838_317-0229_comp.cpp @@ -1,6 +1,7 @@ // license:BSD-3-Clause -// copyright-holders:David Haywood -/* Sega Compression (and possibly encryption) device +// copyright-holders:David Haywood, Samuel Neves, Peter Wilhelmsen, Morten Shearman Kirkegaard + +/* Sega Compression (and encryption) device 315-5838 - Decathlete (ST-V) 317-0229 - Dead or Alive (Model 2A) @@ -13,10 +14,7 @@ Package Type: TQFP100 - Decathlete accesses the chip at 2 different addresses, however, I don't think there - are 2 channels / sets of registers, instead the 2nd set of addresses are just a - mirror that allows access to a different set of source roms; the tables etc. are - re-uploaded before every transfer. + Decathlete accesses the chip at 2 different addresses. Dead of Alive has the source data in RAM, not ROM. This is similar to how some 5881 games were set up, with the ST-V versions decrypting @@ -31,56 +29,34 @@ Dead or Alive decrypts a string that is checked on startup, nothing else. - Looking at the values read I don't think there is any address based encryption, for - example many blocks where you'd expect a zero fill start with repeating patterns - of 8f708f70 (different lengths) channel would appear to relate to compressed 0x00 data - - read addr 0071253c, blah_r 8f708f70 - read count count 00000004 - read addr 00712540, blah_r 8f708f70 - read count count 00000008 - read addr 00712544, blah_r 8f708f70 - read count count 0000000c - read addr 00712548, blah_r 8f708f70 - read count count 00000010 - read addr 0071254c, blah_r 8f708f70 - read count count 00000014 - read addr 00712550, blah_r 8f708f70 - read count count 00000018 - read addr 00712554, blah_r 8f708f70 - read count count 0000001c - */ #include "emu.h" #include "machine/315-5838_317-0229_comp.h" -DEFINE_DEVICE_TYPE(SEGA315_5838_COMP, sega_315_5838_comp_device, "sega315_5838", "Sega 315-5838 / 317-0229 Compression (Encryption?)") - -//#define DEBUG_DATA_DUMP +DEFINE_DEVICE_TYPE(SEGA315_5838_COMP, sega_315_5838_comp_device, "sega315_5838", "Sega 315-5838 / 317-0229 Compression and Encryption") -sega_315_5838_comp_device::sega_315_5838_comp_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, SEGA315_5838_COMP, tag, owner, clock) +sega_315_5838_comp_device::sega_315_5838_comp_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + device_t(mconfig, SEGA315_5838_COMP, tag, owner, clock), + device_rom_interface(mconfig, *this, 23), + m_hackmode(0) { } - - void sega_315_5838_comp_device::device_start() { - m_decathlt_lastcount = 0; - m_decathlt_prot_uploadmode = 0; - m_decathlt_prot_uploadoffset = 0; - - for (auto & elem : m_channel) - { - elem.m_read_ch.bind_relative_to(*owner()); - - } } void sega_315_5838_comp_device::device_reset() { m_srcoffset = 0; - m_decathlt_lastcount = 0; - m_decathlt_prot_uploadmode = 0; - m_decathlt_prot_uploadoffset = 0; - m_protstate = 0; + m_srcstart = 0; + m_abort = false; } +void sega_315_5838_comp_device::rom_bank_updated() +{ +} /************************** * @@ -88,292 +64,297 @@ void sega_315_5838_comp_device::device_reset() * **************************/ -#ifdef DEBUG_DATA_DUMP -FILE* tempfile; -#endif - - -READ32_MEMBER(sega_315_5838_comp_device::decathlt_prot1_r) +// this part is likely specific to the decathlete type chip and will differ for the others +uint16_t sega_315_5838_comp_device::decipher(uint16_t c) { - return genericdecathlt_prot_r(mem_mask, 0); -} + // TODO: use BIT macros instead of working in bytes + uint16_t p = 0; + uint16_t x[16]; -READ32_MEMBER(sega_315_5838_comp_device::decathlt_prot2_r) -{ - return genericdecathlt_prot_r(mem_mask, 1); + for (int b = 0; b < 16; ++b) + { + x[b] = (c >> b) & 1; + } + + p |= (x[7] ^ x[9] ^ x[14] ? 0 : x[5] ^ x[12]) ^ x[14]; + p |= (((x[7] ^ x[9])&(x[12] ^ x[14] ^ x[5])) ^ x[14] ^ 1) << 1; + p |= ((x[6] & x[8]) ^ (x[6] & x[15]) ^ (x[8] & x[15]) ^ 1) << 2; + p |= (x[11] ^ x[14] ^ 1) << 3; + p |= ((x[7] & (x[1] ^ x[8] ^ x[12])) ^ x[12]) << 4; + p |= ((x[6] | x[8]) ^ (x[8] & x[15])) << 5; + p |= (x[4] ^ (x[3] | x[10])) << 6; + p |= ((x[14] & (x[5] ^ x[12])) ^ x[7] ^ x[9] ^ 1) << 7; + p |= (x[4] ^ x[13] ^ 1) << 8; + p |= (x[6] ^ (x[8] | (x[15] ^ 1))) << 9; + p |= (x[7] ^ (x[12] | (x[1] ^ x[8] ^ x[7] ^ 1))) << 10; + p |= (x[3] ^ x[10] ^ 1) << 11; + p |= (x[0] ^ x[2]) << 12; + p |= (x[8] ^ x[1] ? x[12] : x[7]) << 13; + p |= (x[0] ^ x[11] ^ x[14] ^ 1) << 14; + p |= (x[10] ^ 1) << 15; + + return p; } -uint32_t sega_315_5838_comp_device::genericdecathlt_prot_r(uint32_t mem_mask, int channel) +uint8_t sega_315_5838_comp_device::get_decompressed_byte(void) { -// uint32_t *fake0 = (uint32_t*)memregion( ":fake0" )->base(); -// uint32_t retvalue = 0xffff; - - switch (m_srcoffset) + if (m_hackmode == HACK_MODE_NONE) { - default: + // real algorithm, when we have a cipher function + for (;;) + { + if (m_abort) + { + return 0xff; + } + + if (m_num_bits_compressed == 0) + { + m_val_compressed = decipher(source_word_r()); + m_num_bits_compressed = 16; + } + + m_num_bits_compressed--; + m_val <<= 1; + m_val |= 1 & (m_val_compressed >> m_num_bits_compressed); + m_num_bits++; + + for (int i = 0; i < 12; i++) + { + if (m_num_bits != m_compstate.tree[i].len) continue; + if (m_val < (m_compstate.tree[i].pattern >> (12 - m_num_bits))) continue; + if ( + (m_num_bits < 12) && + (m_val >= (m_compstate.tree[i + 1].pattern >> (12 - m_num_bits))) + ) continue; + + int j = m_compstate.tree[i].idx + m_val - (m_compstate.tree[i].pattern >> (12 - m_num_bits)); + + m_val = 0; + m_num_bits = 0; + + return m_compstate.dictionary[j]; + } + } + } + else + { + // modes where we don't have the real cipher yet, to aid with data logging etc. + // this code will go away eventually + uint8_t ret = 0; - m_decathlt_lastcount++; + // scrreader is words, this is bytes, for unknown compression we want to log the same number of bytes as we read, so log every other access + if (!(m_srcoffset & 1)) + { + uint16_t temp = read_word((m_srcoffset*2)^2); + logerror("%s: read data %04x\n", machine().describe_context(), temp); +#ifdef SEGA315_DUMP_DEBUG + if (m_fp) + { + fwrite(&temp, 1, 2, m_fp); + } +#endif + } + + if (m_hackmode == HACK_MODE_DOA) + { + // this is the single decompressed string DOA needs, note, 2 spaces at start, might indicate a dummy read like with 5881 on Model 2 + // it reads 50 bytes from the device. PC = 2C20 is a pass, PC = 2C28 is a fail + const uint8_t prot[51] = " TECMO LTD. DEAD OR ALIVE 1996.10.22 VER. 1.00"; + if (m_srcoffset<50) ret = prot[m_srcoffset]; + else ret = 0x00; + logerror("%s: doa read %08x %c\n", machine().describe_context(), m_srcoffset, ret); + } + else if (m_hackmode == HACK_MODE_NO_KEY) + { + ret = machine().rand(); + } - uint32_t tempdata = 0; - tempdata |= m_channel[channel].m_read_ch(m_srcoffset) << 0; - m_srcoffset++; - tempdata |= m_channel[channel].m_read_ch(m_srcoffset) << 16; m_srcoffset++; + m_srcoffset &= 0x007fffff; + return ret; + } +} +READ16_MEMBER(sega_315_5838_comp_device::data_r) +{ + return (get_decompressed_byte() << 8) | (get_decompressed_byte() << 0); +} - #ifdef DEBUG_DATA_DUMP - //printf("read addr %08x, blah_r %08x - read count count %08x\n", m_srcoffset*2, tempdata, m_decathlt_lastcount*4); - fwrite(&tempdata, 1, 4, tempfile); - #else - logerror("read addr %08x, blah_r %08x - read count count %08x\n", m_srcoffset*2, tempdata, m_decathlt_lastcount*4); - #endif - - return tempdata; -#if 0 - case 0x03228e4: - if (fake0) retvalue = fake0[(((0x20080/4)+m_decathlt_lastcount))]; - m_decathlt_lastcount++; - return retvalue; - - case 0x00a9f3a: - if (fake0) retvalue = fake0[(((0x00000/4)+m_decathlt_lastcount))]; - m_decathlt_lastcount++; - return retvalue; - - case 0x0213ab4: - if (fake0) retvalue = fake0[(((0x40000/4)+m_decathlt_lastcount))]; - m_decathlt_lastcount++; - return retvalue; - - case 0x01efaf0: - if (fake0) retvalue = fake0[(((0x60000/4)+m_decathlt_lastcount))]; - m_decathlt_lastcount++; - return retvalue; - - case 0x033f16c: - case 0x038929c: - - - - case 0x00de05a: - case 0x0334258: - case 0x019fb82: - case 0x033dbf6: - case 0x0011ac6: - case 0x00060dc: - case 0x0000002: - case 0x0008c90: - case 0x035cdc8: - case 0x0327960: - case 0x0329b8c: - case 0x00d6e92: - case 0x000081e: - case 0x00035d6: - case 0x00089a6: - case 0x03315f4: - case 0x0023fe0: - case 0x001e290: - case 0x0026e86: - case 0x0012494: - case 0x001b35a: - case 0x0018424: - - return retvalue; -#endif +uint16_t sega_315_5838_comp_device::source_word_r() +{ + uint16_t tempdata = read_word((m_srcoffset*2)^2); + m_srcoffset++; + m_srcoffset &= 0x007fffff; + + if (m_srcoffset == m_srcstart) // if we've wrapped around to where we started something has gone wrong with the transfer, abandon + m_abort = true; + +#ifdef SEGA315_DUMP_DEBUG + if (m_fp) + { + fwrite(&tempdata, 1, 2, m_fp); } +#endif - return 0xffffffff; + return tempdata; } -void sega_315_5838_comp_device::set_prot_addr(uint32_t data, uint32_t mem_mask, int channel) +void sega_315_5838_comp_device::set_prot_addr(uint32_t data, uint32_t mem_mask) { -// printf("set_prot_addr\n"); COMBINE_DATA(&m_srcoffset); + m_srcoffset &= 0x007fffff; + m_srcstart = m_srcoffset; + m_abort = false; + + m_num_bits_compressed = 0; + m_val_compressed = 0; + m_num_bits = 0; + m_val = 0; +} - //if (m_decathlt_part==0) logerror("%d, last read count was %06x\n",channel, m_decathlt_lastcount*4); - m_decathlt_lastcount = 0; +void sega_315_5838_comp_device::debug_helper(int id) +{ +#ifdef SEGA315_DUMP_DEBUG - if (mem_mask == 0x0000ffff) + if (m_fp) { - printf("set source address to %08x (channel %d)\n", m_srcoffset, channel); + fclose(m_fp); } - -#ifdef DEBUG_DATA_DUMP - if (mem_mask == 0x0000ffff) + if (1) { - if (tempfile) - fclose(tempfile); - char filename[256]; - sprintf(filename, "%d_compressed_%08x", channel, m_srcoffset * 2); - tempfile = fopen(filename, "w+b"); - - // the table and dictionary are uploaded repeatedly, usually before groups of data transfers but - // it's always the same tables (one pair for each channel) + sprintf(filename, "%d_%08x_table_tree_len", id, m_srcoffset * 2); + m_fp = fopen(filename, "w+b"); + for (int i = 0; i < 12; i++) { - FILE* fp; - sprintf(filename, "%d_compressed_table1_%08x", channel, m_srcoffset * 2); - fp = fopen(filename, "w+b"); - fwrite(&m_decathlt_prottable1, 24, 2, fp); - fclose(fp); + fwrite(&m_compstate.tree[i].len, 1, 1, m_fp); } + fclose(m_fp); + } + if (1) + { + char filename[256]; + sprintf(filename, "%d_%08x_table_tree_idx", id, m_srcoffset * 2); + m_fp = fopen(filename, "w+b"); + for (int i = 0; i < 12; i++) { - FILE* fp; - sprintf(filename, "%d_compressed_dictionary_%08x", channel, m_srcoffset * 2); - fp = fopen(filename, "w+b"); - fwrite(&m_decathlt_dictionaryy, 128, 2, fp); - fclose(fp); + fwrite(&m_compstate.tree[i].idx, 1, 1, m_fp); } + fclose(m_fp); } -#endif -} - -void sega_315_5838_comp_device::set_upload_mode(uint16_t data, int channel) -{ - if ((data == 0x8000) || (data == 0x0000)) - { - // logerror("changed to upload mode 1\n"); - m_decathlt_prot_uploadmode = 1; - m_decathlt_prot_uploadoffset = 0; - } - else if ((data == 0x8080) || (data == 0x0080)) - { - m_decathlt_prot_uploadmode = 2; - m_decathlt_prot_uploadoffset = 0; - } - else + if (1) { - fatalerror("unknown upload mode\n"); + char filename[256]; + sprintf(filename, "%d_%08x_table_tree_pattern", id, m_srcoffset * 2); + m_fp = fopen(filename, "w+b"); + for (int i = 0; i < 12; i++) + { + fwrite(&m_compstate.tree[i].pattern, 1, 2, m_fp); + } + fclose(m_fp); } -} -void sega_315_5838_comp_device::upload_table_data(uint16_t data, int channel) -{ - if (m_decathlt_prot_uploadmode == 1) + if (1) { - if (m_decathlt_prot_uploadoffset >= 24) + char filename[256]; + sprintf(filename, "%d_%08x_table_dictionary", id, m_srcoffset * 2); + m_fp = fopen(filename, "w+b"); + for (int i = 0; i < 256; i++) { - fatalerror("upload mode 1 error, too big\n"); - return; + fwrite(&m_compstate.dictionary[i], 1, 1, m_fp); } - - //logerror("uploading table 1 %04x %04x\n",m_decathlt_prot_uploadoffset, data&0xffff); - m_decathlt_prottable1[m_decathlt_prot_uploadoffset] = data & 0xffff; - m_decathlt_prot_uploadoffset++; - printf("unk table 1 %04x (channel %d)\n", data & 0xffff, channel); + fclose(m_fp); } - else if (m_decathlt_prot_uploadmode == 2) + + if (1) { - if (m_decathlt_prot_uploadoffset >= 128) - { - fatalerror("upload mode 2 error, too big\n"); - return; - } + char filename[256]; + sprintf(filename, "%d_%08x_table_data", id, m_srcoffset * 2); + m_fp = fopen(filename, "w+b"); + // leave open for writing - //logerror("uploading table 2 %04x %04x\n",m_decathlt_prot_uploadoffset, data&0xffff); - m_decathlt_dictionaryy[m_decathlt_prot_uploadoffset] = data & 0xffff; - m_decathlt_prot_uploadoffset++; - printf("dictionary %04x (channel %d)\n", data & 0xffff, channel); } + +#endif } -void sega_315_5838_comp_device::write_prot_data(uint32_t data, uint32_t mem_mask, int channel, int rev_words) + +void sega_315_5838_comp_device::set_table_upload_mode_w(uint16_t val) { - if (mem_mask==0xffff0000) - { - if (rev_words==0) set_upload_mode(data >> 16, channel); - else upload_table_data(data >>16, channel); - } - else if (mem_mask == 0x0000ffff) + m_compstate.mode = val; + + if (!(m_compstate.mode & 0x80)) // 0x8000 and 0x0000 { - if (rev_words==0) upload_table_data(data & 0xffff, channel); - else set_upload_mode(data & 0xffff, channel); + m_compstate.it2 = 0; } - else + else // 0x8080 and 0x0080 { - fatalerror("write_prot_data invalid mem_mask\b"); + m_compstate.id = 0; } } - - -WRITE32_MEMBER( sega_315_5838_comp_device::decathlt_prot1_w_doa ) { write_prot_data(data, mem_mask, 0, 1); } -WRITE32_MEMBER( sega_315_5838_comp_device::decathlt_prot1_w) { write_prot_data(data, mem_mask, 0, 0); } -WRITE32_MEMBER( sega_315_5838_comp_device::decathlt_prot2_w) { write_prot_data(data, mem_mask, 1, 0); } - -WRITE32_MEMBER( sega_315_5838_comp_device::decathlt_prot1_srcaddr_w ) { set_prot_addr(data, mem_mask, 0); } -WRITE32_MEMBER( sega_315_5838_comp_device::decathlt_prot2_srcaddr_w) { set_prot_addr(data, mem_mask, 1); } - - -void sega_315_5838_comp_device::install_decathlt_protection() +void sega_315_5838_comp_device::upload_table_data_w(uint16_t val) { - //todo, install these in the driver, they differ between games - cpu_device* cpu = (cpu_device*)machine().device(":maincpu"); + if (!(m_compstate.mode & 0x80)) // 0x8000 and 0x0000 + { + assert(m_compstate.it2 / 2 < 12); - cpu->space(AS_PROGRAM).install_write_handler(0x37FFFF0, 0x37FFFF3, write32_delegate(FUNC(sega_315_5838_comp_device::decathlt_prot1_srcaddr_w), this)); // set compressed data source address - cpu->space(AS_PROGRAM).install_write_handler(0x37FFFF4, 0x37FFFF7, write32_delegate(FUNC(sega_315_5838_comp_device::decathlt_prot1_w), this)); // upload tables - cpu->space(AS_PROGRAM).install_read_handler(0x37FFFF8, 0x37FFFFb, read32_delegate(FUNC(sega_315_5838_comp_device::decathlt_prot1_r), this)); // read decompressed data + if ((m_compstate.it2 & 1) == 0) + { + m_compstate.tree[m_compstate.it2 / 2].len = (0xFF00 & val) >> 8; + m_compstate.tree[m_compstate.it2 / 2].idx = (0x00FF & val) >> 0; + } + else + { + m_compstate.tree[m_compstate.it2 / 2].pattern = val; + } + m_compstate.it2++; + } + else // 0x8080 and 0x0080 + { + assert(m_compstate.id < 255); - // the device is addressed here too, uploading a different set of tables and accessing a different part of ROM - cpu->space(AS_PROGRAM).install_write_handler(0x27FFFF0, 0x27FFFF3, write32_delegate(FUNC(sega_315_5838_comp_device::decathlt_prot2_srcaddr_w), this)); // set compressed data source address - cpu->space(AS_PROGRAM).install_write_handler(0x27FFFF4, 0x27FFFF7, write32_delegate(FUNC(sega_315_5838_comp_device::decathlt_prot2_w), this)); // upload tables - cpu->space(AS_PROGRAM).install_read_handler(0x27FFFF8, 0x27FFFFb, read32_delegate(FUNC(sega_315_5838_comp_device::decathlt_prot2_r), this)); // read decompressed data + m_compstate.dictionary[m_compstate.id++] = (0xFF00 & val) >> 8; + m_compstate.dictionary[m_compstate.id++] = (0x00FF & val) >> 0; + } } - -READ32_MEMBER(sega_315_5838_comp_device::doa_prot_r) +void sega_315_5838_comp_device::write_prot_data(uint32_t data, uint32_t mem_mask, int rev_words) { - uint32_t retval = 0; - - if (offset == 0x7ff8/4) + if (mem_mask==0xffff0000) { - // PC=2c20 - retval = m_protram[m_protstate+1] | m_protram[m_protstate]<<8; - m_protstate+=2; - printf("doa_prot_read %08x %08x %08x\n", offset*4, retval, mem_mask); + if (rev_words == 0) + { + set_table_upload_mode_w(data >> 16); + } + else + { + upload_table_data_w(data >> 16); + } } - else if (offset == 0x400c/4) // todo, is this actually part of the protection? it's in the address range, but decathlete doesn't have it afaik. + else if (mem_mask == 0x0000ffff) { - // this actually looks a busy status flag - m_prot_a = !m_prot_a; - if (m_prot_a) - retval = 0xffff; + if (rev_words == 0) + { + upload_table_data_w(data & 0xffff); + } else - retval = 0xfff0; + { + set_table_upload_mode_w(data & 0xffff); + } } else { - printf("doa_prot_read %08x %08x %08x\n", offset*4, retval, mem_mask); - logerror("Unhandled Protection READ @ %x mask %x %s\n", offset, mem_mask, machine().describe_context()); + fatalerror("write_prot_data invalid mem_mask\b"); } - - return retval; } +WRITE32_MEMBER( sega_315_5838_comp_device::data_w_doa ) { write_prot_data(data, mem_mask, 1); } +WRITE32_MEMBER( sega_315_5838_comp_device::data_w) { write_prot_data(data, mem_mask, 0); } +WRITE32_MEMBER( sega_315_5838_comp_device::srcaddr_w ) { set_prot_addr(data, mem_mask); } -WRITE32_MEMBER(sega_315_5838_comp_device::doa_prot_w) -{ - printf("doa_prot_w %08x %08x %08x\n", offset*4, data, mem_mask); - - m_protstate = 0; -} - - -void sega_315_5838_comp_device::install_doa_protection() -{ - //todo, install these in the driver, they differ between games - cpu_device* cpu = (cpu_device*)machine().device(":maincpu"); - - m_protstate = 0; - strcpy((char *)m_protram, " TECMO LTD. DEAD OR ALIVE 1996.10.22 VER. 1.00"); // this is the single decompressed string DOA needs, note, 2 spaces at start, might indicate a dummy read like with 5881 on Model 2 - - cpu->space(AS_PROGRAM).install_readwrite_handler(0x01d80000, 0x01dfffff, read32_delegate(FUNC(sega_315_5838_comp_device::doa_prot_r), this), write32_delegate(FUNC(sega_315_5838_comp_device::doa_prot_w), this)); - cpu->space(AS_PROGRAM).install_write_handler(0x01d87ff0, 0x01d87ff3, write32_delegate(FUNC(sega_315_5838_comp_device::decathlt_prot1_srcaddr_w), this)); // set compressed data source address (always set 0, data is in RAM) - cpu->space(AS_PROGRAM).install_write_handler(0x01d87ff4, 0x01d87ff7, write32_delegate(FUNC(sega_315_5838_comp_device::decathlt_prot1_w_doa), this)); // upload tab -// cpu->space(AS_PROGRAM).install_read_handler(0x01d87ff8, 0x01d87ffb, read32_delegate(FUNC(sega_315_5838_comp_device::decathlt_prot1_r), this)); // read decompressed data - -} diff --git a/src/mame/machine/315-5838_317-0229_comp.h b/src/mame/machine/315-5838_317-0229_comp.h index 07c7c044fdf..ebd26ae38b4 100644 --- a/src/mame/machine/315-5838_317-0229_comp.h +++ b/src/mame/machine/315-5838_317-0229_comp.h @@ -1,83 +1,81 @@ // license:BSD-3-Clause -// copyright-holders:David Haywood +// copyright-holders:David Haywood, Samuel Neves, Peter Wilhelmsen, Morten Shearman Kirkegaard #ifndef MAME_MACHINE_315_5838_371_0229_COMP_H #define MAME_MACHINE_315_5838_371_0229_COMP_H #pragma once -typedef device_delegate<uint16_t (uint32_t)> sega_dec_read_delegate; +// #define SEGA315_DUMP_DEBUG // dump stuff to files to help with decryption efforts DECLARE_DEVICE_TYPE(SEGA315_5838_COMP, sega_315_5838_comp_device) -#define MCFG_SET_5838_READ_CALLBACK_CH1( _class, _method) \ - downcast<sega_315_5838_comp_device &>(*device).set_read_cb_ch1(sega_m2_read_delegate(&_class::_method, #_class "::" #_method, nullptr, (_class *)nullptr)); - -#define MCFG_SET_5838_READ_CALLBACK_CH2( _class, _method) \ - downcast<sega_315_5838_comp_device &>(*device).set_read_cb_ch2(sega_m2_read_delegate(&_class::_method, #_class "::" #_method, nullptr, (_class *)nullptr)); - -class sega_315_5838_comp_device : public device_t +class sega_315_5838_comp_device : public device_t, + public device_rom_interface { public: // construction/destruction sega_315_5838_comp_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template <typename Object> void set_read_cb_ch1(Object &&readcb) { m_channel[0].m_read_ch = std::forward<Object>(readcb); } - template <typename Object> void set_read_cb_ch2(Object &&readcb) { m_channel[1].m_read_ch = std::forward<Object>(readcb); } - - DECLARE_READ32_MEMBER(decathlt_prot1_r); - DECLARE_READ32_MEMBER(decathlt_prot2_r); - uint32_t genericdecathlt_prot_r(uint32_t mem_mask, int channel); - - void write_prot_data(uint32_t data, uint32_t mem_mask, int channel, int rev_words); - - void upload_table_data(uint16_t data, int channel); - void set_upload_mode(uint16_t data, int channel); - void set_prot_addr(uint32_t data, uint32_t mem_mask, int channel); + DECLARE_READ16_MEMBER(data_r); - DECLARE_WRITE32_MEMBER(decathlt_prot1_w_doa); - DECLARE_WRITE32_MEMBER(decathlt_prot1_w); - DECLARE_WRITE32_MEMBER(decathlt_prot2_w); - DECLARE_WRITE32_MEMBER(decathlt_prot1_srcaddr_w); - DECLARE_WRITE32_MEMBER(decathlt_prot2_srcaddr_w); + DECLARE_WRITE32_MEMBER(data_w_doa); + DECLARE_WRITE32_MEMBER(data_w); + DECLARE_WRITE32_MEMBER(srcaddr_w); - void install_decathlt_protection(); - void install_doa_protection(); + void debug_helper(int id); - DECLARE_READ32_MEMBER(doa_prot_r); - DECLARE_WRITE32_MEMBER(doa_prot_w); + enum + { + HACK_MODE_NONE = 0, + HACK_MODE_NO_KEY, + HACK_MODE_DOA + }; + + void set_hack_mode(int mode) { m_hackmode = mode; } protected: virtual void device_start() override; virtual void device_reset() override; -private: - static constexpr unsigned CHANNELS = 2; + virtual void rom_bank_updated() override; - sega_dec_read_delegate m_read_ch2; +private: + uint16_t source_word_r(); - uint16_t m_decathlt_prottable1[24]; - uint16_t m_decathlt_dictionaryy[128]; + void write_prot_data(uint32_t data, uint32_t mem_mask, int rev_words); + void set_prot_addr(uint32_t data, uint32_t mem_mask); uint32_t m_srcoffset; - - uint32_t m_decathlt_lastcount; - uint32_t m_decathlt_prot_uploadmode; - uint32_t m_decathlt_prot_uploadoffset; - - - // Decathlete specific variables and functions (see machine/decathlt.c) - struct channel_type - { - sega_dec_read_delegate m_read_ch; - - }; - - channel_type m_channel[2]; - - // Doa - int m_protstate; - int m_prot_a; - uint8_t m_protram[256]; + uint32_t m_srcstart; // failsafe + bool m_abort; + + struct { + uint16_t mode; + struct { + uint8_t len; /* in bits */ + uint8_t idx; /* in the dictionary */ + uint16_t pattern; /* of the first node */ + } tree[12]; + int it2; + uint8_t dictionary[256]; + int id; + } m_compstate; + + void set_table_upload_mode_w(uint16_t val); + void upload_table_data_w(uint16_t val); + + uint8_t get_decompressed_byte(void); + uint16_t decipher(uint16_t c); + + int m_num_bits_compressed; + uint16_t m_val_compressed; + int m_num_bits; + uint16_t m_val; + + int m_hackmode; +#ifdef SEGA315_DUMP_DEBUG + FILE* m_fp; +#endif }; #endif // MAME_MACHINE_315_5838_371_0229_COMP_H diff --git a/src/mame/machine/315-5881_crypt.h b/src/mame/machine/315-5881_crypt.h index 2f595435a89..4e61c38066a 100644 --- a/src/mame/machine/315-5881_crypt.h +++ b/src/mame/machine/315-5881_crypt.h @@ -39,6 +39,11 @@ public: sega_m2_read_delegate m_read; template <typename Object> void set_read_cb(Object &&readcb) { m_read = std::forward<Object>(readcb); } + void set_read_cb(sega_m2_read_delegate callback) { m_read = callback; } + template <class FunctionClass> void set_read_cb(uint16_t (FunctionClass::*callback)(uint32_t), const char *name) + { + set_read_cb(sega_m2_read_delegate(callback, name, nullptr, static_cast<FunctionClass *>(nullptr))); + } protected: virtual void device_start() override; diff --git a/src/mame/machine/amiga.cpp b/src/mame/machine/amiga.cpp index 89c7f28ae8c..bcda93d108c 100644 --- a/src/mame/machine/amiga.cpp +++ b/src/mame/machine/amiga.cpp @@ -278,7 +278,7 @@ TIMER_CALLBACK_MEMBER( amiga_state::scanline_callback ) } // vblank end - if (scanline == m_screen->visible_area().min_y) + if (scanline == m_screen->visible_area().top()) { m_cia_0->tod_w(0); } diff --git a/src/mame/machine/apple3.cpp b/src/mame/machine/apple3.cpp index c898ae58770..a2ae146c41e 100644 --- a/src/mame/machine/apple3.cpp +++ b/src/mame/machine/apple3.cpp @@ -902,11 +902,11 @@ READ8_MEMBER(apple3_state::apple3_memory_r) } else if (offset >= 0xffd0 && offset <= 0xffdf) { - rv = m_via[0]->read(space, offset); + rv = m_via[0]->read(offset); } else if (offset >= 0xffe0 && offset <= 0xffef) { - rv = m_via[1]->read(space, offset); + rv = m_via[1]->read(offset); } else { @@ -1049,14 +1049,14 @@ WRITE8_MEMBER(apple3_state::apple3_memory_w) { if (!machine().side_effects_disabled()) { - m_via[0]->write(space, offset, data); + m_via[0]->write(offset, data); } } else if (offset >= 0xffe0 && offset <= 0xffef) { if (!machine().side_effects_disabled()) { - m_via[1]->write(space, offset, data); + m_via[1]->write(offset, data); } } else diff --git a/src/mame/machine/archimds.cpp b/src/mame/machine/archimds.cpp index 18168ddeb59..088c2bc21e1 100644 --- a/src/mame/machine/archimds.cpp +++ b/src/mame/machine/archimds.cpp @@ -884,22 +884,18 @@ void archimedes_state::vidc_dynamic_res_change() (m_vidc_regs[VIDC_HBER] >= m_vidc_regs[VIDC_HBSR]) && (m_vidc_regs[VIDC_VBER] >= m_vidc_regs[VIDC_VBSR])) { - rectangle visarea; - attoseconds_t refresh; - - visarea.min_x = 0; - visarea.min_y = 0; - visarea.max_x = m_vidc_regs[VIDC_HBER] - m_vidc_regs[VIDC_HBSR] - 1; - visarea.max_y = (m_vidc_regs[VIDC_VBER] - m_vidc_regs[VIDC_VBSR]) * (m_vidc_interlace+1); + rectangle const visarea( + 0, m_vidc_regs[VIDC_HBER] - m_vidc_regs[VIDC_HBSR] - 1, + 0, (m_vidc_regs[VIDC_VBER] - m_vidc_regs[VIDC_VBSR]) * (m_vidc_interlace + 1)); m_vidc_vblank_time = m_vidc_regs[VIDC_VBER] * (m_vidc_interlace+1); //logerror("Configuring: htotal %d vtotal %d border %d x %d display origin %d x %d vblank = %d\n", // m_vidc_regs[VIDC_HCR], m_vidc_regs[VIDC_VCR], - // visarea.max_x, visarea.max_y, + // visarea.right(), visarea.bottom(), // m_vidc_regs[VIDC_HDER]-m_vidc_regs[VIDC_HDSR],m_vidc_regs[VIDC_VDER]-m_vidc_regs[VIDC_VDSR]+1, // m_vidc_vblank_time); - refresh = HZ_TO_ATTOSECONDS(pixel_rate[m_vidc_pixel_clk]) * m_vidc_regs[VIDC_HCR] * m_vidc_regs[VIDC_VCR]; + attoseconds_t const refresh = HZ_TO_ATTOSECONDS(pixel_rate[m_vidc_pixel_clk]) * m_vidc_regs[VIDC_HCR] * m_vidc_regs[VIDC_VCR]; m_screen->configure(m_vidc_regs[VIDC_HCR], m_vidc_regs[VIDC_VCR] * (m_vidc_interlace+1), visarea, refresh); } diff --git a/src/mame/machine/bbc.cpp b/src/mame/machine/bbc.cpp index 0497c33e003..d1fa2965d96 100644 --- a/src/mame/machine/bbc.cpp +++ b/src/mame/machine/bbc.cpp @@ -431,8 +431,8 @@ READ8_MEMBER(bbc_state::bbcm_r) if ((myo>=0x30) && (myo<=0x33)) return 0xfe; if ((myo>=0x34) && (myo<=0x37)) return bbcm_acccon_r(space, myo-0x34); /* ACCCON */ if ((myo>=0x38) && (myo<=0x3f)) return 0xfe; /* NC ?? */ - if ((myo>=0x40) && (myo<=0x5f)) return m_via6522_0->read(space, myo-0x40); - if ((myo>=0x60) && (myo<=0x7f)) return m_via6522_1 ? m_via6522_1->read(space, myo-0x60) : 0xfe; + if ((myo>=0x40) && (myo<=0x5f)) return m_via6522_0->read(myo-0x40); + if ((myo>=0x60) && (myo<=0x7f)) return m_via6522_1 ? m_via6522_1->read(myo-0x60) : 0xfe; if ((myo>=0x80) && (myo<=0x9f)) return 0xfe; if ((myo>=0xa0) && (myo<=0xbf)) return m_adlc ? m_adlc->read(space, myo & 0x03) : 0xfe; if ((myo>=0xc0) && (myo<=0xdf)) return 0xff; @@ -465,8 +465,8 @@ WRITE8_MEMBER(bbc_state::bbcm_w) if ((myo>=0x30) && (myo<=0x33)) page_selectbm_w(space, myo-0x30, data); /* ROMSEL */ if ((myo>=0x34) && (myo<=0x37)) bbcm_acccon_w(space, myo-0x34, data); /* ACCCON */ //if ((myo>=0x38) && (myo<=0x3f)) /* NC ?? */ - if ((myo>=0x40) && (myo<=0x5f)) m_via6522_0->write(space, myo-0x40, data); - if ((myo>=0x60) && (myo<=0x7f) && (m_via6522_1)) m_via6522_1->write(space, myo-0x60, data); + if ((myo>=0x40) && (myo<=0x5f)) m_via6522_0->write(myo-0x40, data); + if ((myo>=0x60) && (myo<=0x7f) && (m_via6522_1)) m_via6522_1->write(myo-0x60, data); //if ((myo>=0x80) && (myo<=0x9f)) if ((myo>=0xa0) && (myo<=0xbf) && (m_adlc)) m_adlc->write(space, myo & 0x03, data); //if ((myo>=0xc0) && (myo<=0xdf)) diff --git a/src/mame/machine/bebox.cpp b/src/mame/machine/bebox.cpp index 1608cd17540..9108801c6a5 100644 --- a/src/mame/machine/bebox.cpp +++ b/src/mame/machine/bebox.cpp @@ -183,7 +183,7 @@ READ64_MEMBER(bebox_state::bebox_crossproc_interrupts_r ) result = m_crossproc_interrupts; /* return a different result depending on which CPU is accessing this handler */ - if (&space != &m_ppc1->space(AS_PROGRAM)) + if (&space != &m_ppc[0]->space(AS_PROGRAM)) result |= 0x02000000; else result &= ~0x02000000; @@ -208,7 +208,6 @@ WRITE64_MEMBER(bebox_state::bebox_crossproc_interrupts_w ) }; int i, line; uint32_t old_crossproc_interrupts = m_crossproc_interrupts; - cpu_device *cpus[] = { m_ppc1, m_ppc2 }; bebox_mbreg32_w(&m_crossproc_interrupts, data, mem_mask); @@ -230,7 +229,7 @@ WRITE64_MEMBER(bebox_state::bebox_crossproc_interrupts_w ) */ } - cpus[crossproc_map[i].cpunum]->set_input_line(crossproc_map[i].inputline, line); + m_ppc[crossproc_map[i].cpunum]->set_input_line(crossproc_map[i].inputline, line); } } } @@ -241,7 +240,7 @@ WRITE64_MEMBER(bebox_state::bebox_processor_resets_w ) if (b & 0x20) { - m_ppc2->set_input_line(INPUT_LINE_RESET, (b & 0x80) ? CLEAR_LINE : ASSERT_LINE); + m_ppc[1]->set_input_line(INPUT_LINE_RESET, (b & 0x80) ? CLEAR_LINE : ASSERT_LINE); } } @@ -249,7 +248,6 @@ WRITE64_MEMBER(bebox_state::bebox_processor_resets_w ) void bebox_state::bebox_update_interrupts() { uint32_t interrupt; - cpu_device *cpus[] = { m_ppc1, m_ppc2 }; for (int cpunum = 0; cpunum < 2; cpunum++) { @@ -261,7 +259,7 @@ void bebox_state::bebox_update_interrupts() m_interrupts, m_cpu_imask[cpunum], interrupt ? "on" : "off"); } - cpus[cpunum]->set_input_line(INPUT_LINE_IRQ0, interrupt ? ASSERT_LINE : CLEAR_LINE); + m_ppc[cpunum]->set_input_line(INPUT_LINE_IRQ0, interrupt ? ASSERT_LINE : CLEAR_LINE); } } @@ -311,8 +309,8 @@ void bebox_state::bebox_set_irq_bit(unsigned int interrupt_bit, int val) assert_always((interrupt_bit < ARRAY_LENGTH(interrupt_names)) && (interrupt_names[interrupt_bit] != nullptr), "Raising invalid interrupt"); logerror("bebox_set_irq_bit(): pc[0]=0x%08x pc[1]=0x%08x %s interrupt #%u (%s)\n", - (unsigned) m_ppc1->pc(), - (unsigned) m_ppc2->pc(), + (unsigned) m_ppc[0]->pc(), + (unsigned) m_ppc[1]->pc(), val ? "Asserting" : "Clearing", interrupt_bit, interrupt_names[interrupt_bit]); } @@ -337,7 +335,7 @@ void bebox_state::bebox_set_irq_bit(unsigned int interrupt_bit, int val) WRITE_LINE_MEMBER( bebox_state::fdc_interrupt ) { bebox_set_irq_bit(13, state); - m_pic8259_1->ir6_w(state); + m_pic8259[0]->ir6_w(state); } /************************************* @@ -349,7 +347,7 @@ WRITE_LINE_MEMBER( bebox_state::fdc_interrupt ) READ64_MEMBER(bebox_state::bebox_interrupt_ack_r ) { uint32_t result; - result = m_pic8259_1->acknowledge(); + result = m_pic8259[0]->acknowledge(); bebox_set_irq_bit(5, 0); /* HACK */ return ((uint64_t) result) << 56; } @@ -368,12 +366,12 @@ WRITE_LINE_MEMBER(bebox_state::bebox_pic8259_master_set_int_line) WRITE_LINE_MEMBER(bebox_state::bebox_pic8259_slave_set_int_line) { - m_pic8259_1->ir2_w(state); + m_pic8259[0]->ir2_w(state); } READ8_MEMBER(bebox_state::get_slave_ack) { - return m_pic8259_2->acknowledge(); + return m_pic8259[1]->acknowledge(); } @@ -386,7 +384,7 @@ READ8_MEMBER(bebox_state::get_slave_ack) WRITE_LINE_MEMBER(bebox_state::bebox_ide_interrupt) { bebox_set_irq_bit(7, state); - m_pic8259_1->ir6_w(state); + m_pic8259[0]->ir6_w(state); } @@ -530,16 +528,16 @@ READ8_MEMBER(bebox_state::bebox_80000480_r) WRITE_LINE_MEMBER(bebox_state::bebox_dma_hrq_changed) { - m_ppc1->set_input_line(INPUT_LINE_HALT, state ? ASSERT_LINE : CLEAR_LINE); + m_ppc[0]->set_input_line(INPUT_LINE_HALT, state ? ASSERT_LINE : CLEAR_LINE); /* Assert HLDA */ - m_dma8237_1->hack_w( state ); + m_dma8237[0]->hack_w( state ); } READ8_MEMBER(bebox_state::bebox_dma_read_byte ) { - address_space& prog_space = m_ppc1->space(AS_PROGRAM); // get the right address space + address_space& prog_space = m_ppc[0]->space(AS_PROGRAM); // get the right address space offs_t page_offset = (((offs_t) m_dma_offset[0][m_dma_channel]) << 16) & 0x7FFF0000; return prog_space.read_byte(page_offset + offset); @@ -548,7 +546,7 @@ READ8_MEMBER(bebox_state::bebox_dma_read_byte ) WRITE8_MEMBER(bebox_state::bebox_dma_write_byte ) { - address_space& prog_space = m_ppc1->space(AS_PROGRAM); // get the right address space + address_space& prog_space = m_ppc[0]->space(AS_PROGRAM); // get the right address space offs_t page_offset = (((offs_t) m_dma_offset[0][m_dma_channel]) << 16) & 0x7FFF0000; prog_space.write_byte(page_offset + offset, data); @@ -588,7 +586,7 @@ WRITE_LINE_MEMBER(bebox_state::pc_dack3_w){ set_dma_channel(machine(), 3, state) WRITE_LINE_MEMBER(bebox_state::bebox_timer0_w) { - m_pic8259_1->ir0_w(state); + m_pic8259[0]->ir0_w(state); } @@ -732,7 +730,7 @@ void bebox_state::scsi53c810_pci_write(int function, int offset, uint32_t data, /* brutal ugly hack; at some point the PCI code should be handling this stuff */ if (m_scsi53c810_data[5] != 0xFFFFFFF0) { - address_space &space = m_ppc1->space(AS_PROGRAM); + address_space &space = m_ppc[0]->space(AS_PROGRAM); addr = (m_scsi53c810_data[5] | 0xC0000000) & ~0xFF; space.install_readwrite_handler(addr, addr + 0xFF, read64_delegate(FUNC(bebox_state::scsi53c810_r),this), write64_delegate(FUNC(bebox_state::scsi53c810_w),this)); @@ -767,8 +765,8 @@ void bebox_state::machine_reset() { timer_set(attotime::zero, TIMER_GET_DEVICES); - m_ppc1->set_input_line(INPUT_LINE_RESET, CLEAR_LINE); - m_ppc2->set_input_line(INPUT_LINE_RESET, ASSERT_LINE); + m_ppc[0]->set_input_line(INPUT_LINE_RESET, CLEAR_LINE); + m_ppc[1]->set_input_line(INPUT_LINE_RESET, ASSERT_LINE); // Endianness? Bah! memcpy(m_flash->base(),memregion("user1")->base(),0x200000); @@ -780,8 +778,8 @@ void bebox_state::machine_start() void bebox_state::init_bebox() { - address_space &space_0 = m_ppc1->space(AS_PROGRAM); - address_space &space_1 = m_ppc2->space(AS_PROGRAM); + address_space &space_0 = m_ppc[0]->space(AS_PROGRAM); + address_space &space_1 = m_ppc[1]->space(AS_PROGRAM); /* set up boot and flash ROM */ membank("bank2")->set_base(memregion("user2")->base()); diff --git a/src/mame/machine/cammu.cpp b/src/mame/machine/cammu.cpp index 721f8ed5cc9..3db37813700 100644 --- a/src/mame/machine/cammu.cpp +++ b/src/mame/machine/cammu.cpp @@ -22,9 +22,8 @@ * Another reference: http://www.eecs.berkeley.edu/Pubs/TechRpts/1986/CSD-86-289.pdf * * TODO - * - rework cammu addressing (to allow unaligned tlb access) + * - c4 variants * - fault register values - * - hard-wired and dynamic tlb * - cache * - bus errors */ @@ -37,6 +36,7 @@ #define LOG_GENERAL (1U << 0) #define LOG_ACCESS (1U << 1) #define LOG_DTU (1U << 2) +#define LOG_TLB (1U << 3) //#define VERBOSE (LOG_GENERAL | LOG_ACCESS | LOG_DTU) #include "logmacro.h" @@ -92,26 +92,6 @@ void cammu_c4i_device::map(address_map &map) map(0x0c0, 0x0c3).rw(FUNC(cammu_c4i_device::test_address_r), FUNC(cammu_c4i_device::test_address_w)); } -void cammu_c3_device::map(address_map &map) -{ - map(0x000, 0x0ff).noprw(); // tlb - map(0x104, 0x107).rw(FUNC(cammu_c3_device::s_pdo_r), FUNC(cammu_c3_device::s_pdo_w)); - map(0x108, 0x10b).rw(FUNC(cammu_c3_device::u_pdo_r), FUNC(cammu_c3_device::u_pdo_w)); - map(0x110, 0x113).rw(FUNC(cammu_c3_device::fault_r), FUNC(cammu_c3_device::fault_w)); - map(0x140, 0x143).rw(FUNC(cammu_c3_device::control_r), FUNC(cammu_c3_device::control_w)); - map(0x180, 0x183).rw(FUNC(cammu_c3_device::reset_r), FUNC(cammu_c3_device::reset_w)); -} - -void cammu_c3_device::map_global(address_map &map) -{ - map(0x000, 0x0ff).noprw(); // global tlb - map(0x104, 0x107).w(FUNC(cammu_c3_device::g_s_pdo_w)); - map(0x108, 0x10b).w(FUNC(cammu_c3_device::g_u_pdo_w)); - map(0x110, 0x113).w(FUNC(cammu_c3_device::g_fault_w)); - map(0x140, 0x143).w(FUNC(cammu_c3_device::g_control_w)); - map(0x180, 0x183).w(FUNC(cammu_c3_device::g_reset_w)); -} - DEFINE_DEVICE_TYPE(CAMMU_C4T, cammu_c4t_device, "c4t", "C4E/C4T CAMMU") DEFINE_DEVICE_TYPE(CAMMU_C4I, cammu_c4i_device, "c4i", "C4I CAMMU") DEFINE_DEVICE_TYPE(CAMMU_C3, cammu_c3_device, "c3", "C1/C3 CAMMU") @@ -133,8 +113,8 @@ cammu_c4_device::cammu_c4_device(const machine_config &mconfig, device_type type cammu_c3_device::cammu_c3_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : cammu_device(mconfig, CAMMU_C3, tag, owner, clock) - , m_control(CID_C3) , m_linked{ this } + , m_control(CID_C3) { } @@ -210,7 +190,17 @@ void cammu_c3_device::device_start() save_item(NAME(m_u_pdo)); save_item(NAME(m_fault)); save_item(NAME(m_control)); - save_item(NAME(m_reset)); + + for (tlb_set_t &tlb_set : m_tlb) + { + tlb_set.u = false; + + tlb_set.w.ra = tlb_set.w.va = 0; + tlb_set.w.cache = m_memory[ST0].space->cache<2, 0, ENDIANNESS_LITTLE>(); + + tlb_set.x.ra = tlb_set.x.va = 0; + tlb_set.x.cache = m_memory[ST0].space->cache<2, 0, ENDIANNESS_LITTLE>(); + } } void cammu_c3_device::device_reset() @@ -218,14 +208,25 @@ void cammu_c3_device::device_reset() cammu_device::device_reset(); m_control = (m_control & CNTL_CID) | (CNTL_ATE | UST_3 | CNTL_EWIR | CNTL_EWIW | CNTL_EWCW | CNTL_EP); - m_reset = 0; } -void cammu_device::set_spaces(std::vector<address_space *> spaces) +void cammu_device::set_spaces(address_space &main_space, address_space &io_space, address_space &boot_space) { - assert_always(spaces.size() == 8, "exactly 8 address space pointers are required"); + m_memory[ST0].space = &main_space; + m_memory[ST1].space = &main_space; + m_memory[ST2].space = &main_space; + m_memory[ST3].space = &main_space; + + m_memory[ST4].space = &io_space; + m_memory[ST5].space = &boot_space; + m_memory[ST6].space = &main_space; - std::copy(spaces.begin(), spaces.end(), std::begin(m_space)); + // FIXME: this tag is probably not used, but if it is, need to figure + // out how to implement it properly. + m_memory[ST7].space = &main_space; + + for (memory_t &memory : m_memory) + memory.cache = memory.space->cache<2, 0, ENDIANNESS_LITTLE>(); } bool cammu_device::memory_translate(const u32 ssw, const int spacenum, const int intention, offs_t &address) @@ -237,7 +238,7 @@ bool cammu_device::memory_translate(const u32 ssw, const int spacenum, const int EXECUTE); // check that the requested space number matches the mapped space - if (translated.space != nullptr && translated.space->spacenum() == spacenum) + if (translated.cache && translated.cache->space().spacenum() == spacenum) { address = translated.address; @@ -257,14 +258,9 @@ cammu_device::translated_t cammu_device::translate_address(const u32 ssw, const { if ((mode == EXECUTE && (virtual_address & 0x1)) || (mode != EXECUTE && virtual_address & (size - 1))) { - // FIXME: tlb access is not aligned; this hack lets us ignore for now - if (mode == EXECUTE || user || (virtual_address & 0xfffff900) != 0x00004800) - { - set_fault_address(virtual_address); - m_exception_func(mode == EXECUTE ? EXCEPTION_I_ALIGNMENT_FAULT : EXCEPTION_D_ALIGNMENT_FAULT); + set_fault(virtual_address, mode == EXECUTE ? EXCEPTION_I_ALIGNMENT_FAULT : EXCEPTION_D_ALIGNMENT_FAULT); - return { nullptr, 0 }; - } + return { nullptr, 0 }; } } @@ -274,24 +270,24 @@ cammu_device::translated_t cammu_device::translate_address(const u32 ssw, const switch (virtual_address & 0x7000) { // pages 0-3: main space pages 0-3 - case 0x0000: return { m_space[ST1], virtual_address & 0x3fff }; - case 0x1000: return { m_space[ST2], virtual_address & 0x3fff }; - case 0x2000: return { m_space[ST3], virtual_address & 0x3fff }; - case 0x3000: return { m_space[ST3], virtual_address & 0x3fff }; + case 0x0000: return { m_memory[ST1].cache, virtual_address & 0x3fff }; + case 0x1000: return { m_memory[ST2].cache, virtual_address & 0x3fff }; + case 0x2000: return { m_memory[ST3].cache, virtual_address & 0x3fff }; + case 0x3000: return { m_memory[ST3].cache, virtual_address & 0x3fff }; // pages 4-5: i/o space pages 0-1 - case 0x4000: return { m_space[ST4], virtual_address & 0x1fff }; - case 0x5000: return { m_space[ST4], virtual_address & 0x1fff }; + case 0x4000: return { m_memory[ST4].cache, virtual_address & 0x1fff }; + case 0x5000: return { m_memory[ST4].cache, virtual_address & 0x1fff }; // pages 6-7: boot space pages 0-1 - case 0x6000: return { m_space[ST5], virtual_address & 0x1fff }; - case 0x7000: return { m_space[ST5], virtual_address & 0x1fff }; + case 0x6000: return { m_memory[ST5].cache, virtual_address & 0x1fff }; + case 0x7000: return { m_memory[ST5].cache, virtual_address & 0x1fff }; } } // if not in mapped mode, use unmapped system tag if ((ssw & SSW_M) == 0) - return { m_space[get_ust_space()], virtual_address }; + return { m_memory[get_ust_space()].cache, virtual_address }; // get the page table entry pte_t pte = get_pte(virtual_address, user); @@ -305,8 +301,7 @@ cammu_device::translated_t cammu_device::translate_address(const u32 ssw, const mode == EXECUTE ? "instruction" : "data", virtual_address, ssw, pte.entry, machine().describe_context()); - set_fault_address(virtual_address); - m_exception_func(mode == EXECUTE ? EXCEPTION_I_PAGE_FAULT : EXCEPTION_D_PAGE_FAULT); + set_fault(virtual_address, mode == EXECUTE ? EXCEPTION_I_PAGE_FAULT : EXCEPTION_D_PAGE_FAULT); } return { nullptr, 0 }; @@ -320,8 +315,7 @@ cammu_device::translated_t cammu_device::translate_address(const u32 ssw, const LOGMASKED(LOG_ACCESS, "execute protection fault address 0x%08x ssw 0x%08x pte 0x%08x (%s)\n", virtual_address, ssw, pte.entry, machine().describe_context()); - set_fault_address(virtual_address); - m_exception_func(EXCEPTION_I_EXECUTE_PROTECT_FAULT); + set_fault(virtual_address, EXCEPTION_I_EXECUTE_PROTECT_FAULT); return { nullptr, 0 }; } @@ -331,8 +325,7 @@ cammu_device::translated_t cammu_device::translate_address(const u32 ssw, const LOGMASKED(LOG_ACCESS, "read protection fault address 0x%08x ssw 0x%08x pte 0x%08x (%s)\n", virtual_address, ssw, pte.entry, machine().describe_context()); - set_fault_address(virtual_address); - m_exception_func(EXCEPTION_D_READ_PROTECT_FAULT); + set_fault(virtual_address, EXCEPTION_D_READ_PROTECT_FAULT); return { nullptr, 0 }; } @@ -342,8 +335,7 @@ cammu_device::translated_t cammu_device::translate_address(const u32 ssw, const LOGMASKED(LOG_ACCESS, "write protection fault address 0x%08x ssw 0x%08x pte 0x%08x (%s)\n", virtual_address, ssw, pte.entry, machine().describe_context()); - set_fault_address(virtual_address); - m_exception_func(EXCEPTION_D_WRITE_PROTECT_FAULT); + set_fault(virtual_address, EXCEPTION_D_WRITE_PROTECT_FAULT); return { nullptr, 0 }; } @@ -351,16 +343,213 @@ cammu_device::translated_t cammu_device::translate_address(const u32 ssw, const // set pte referenced and dirty flags if ((mode & WRITE) && !(pte.entry & PTE_D)) - m_space[ST0]->write_dword(pte.address, pte.entry | PTE_D | PTE_R); + m_memory[ST0].cache->write_dword(pte.address, pte.entry | PTE_D | PTE_R); else if (!(pte.entry & PTE_R)) - m_space[ST0]->write_dword(pte.address, pte.entry | PTE_R); + m_memory[ST0].cache->write_dword(pte.address, pte.entry | PTE_R); // translate the address LOGMASKED(LOG_DTU, "%s address translated 0x%08x\n", mode == EXECUTE ? "instruction" : "data", (pte.entry & ~CAMMU_PAGE_MASK) | (virtual_address & CAMMU_PAGE_MASK)); // return the system tag and translated address - return { m_space[system_tag_t((pte.entry & PTE_ST) >> PTE_ST_SHIFT)], (pte.entry & ~CAMMU_PAGE_MASK) | (virtual_address & CAMMU_PAGE_MASK) }; + return { m_memory[(pte.entry & PTE_ST) >> ST_SHIFT].cache, (pte.entry & ~CAMMU_PAGE_MASK) | (virtual_address & CAMMU_PAGE_MASK) }; +} + +cammu_c3_device::tlb_line_t &cammu_c3_device::tlb_lookup(const bool user, const u32 virtual_address, const access_type mode) +{ + const u8 set = (virtual_address >> 12) & 0x3f; + tlb_set_t &tlb_set = m_tlb[set]; + + // check w compartment + if ((tlb_set.w.va & TLB_VA_VA) == (virtual_address & TLB_VA_VA) && (((user && (tlb_set.w.va & TLB_VA_UV)) || (!user && (tlb_set.w.va & TLB_VA_SV))))) + { + LOGMASKED(LOG_TLB, "tlb_lookup 0x%08x set %2d line W hit 0x%08x\n", virtual_address, set, tlb_set.w.ra); + + // mark x line least recently used + tlb_set.u = true; + + return tlb_set.w; + } + + // check x compartment + if ((tlb_set.x.va & TLB_VA_VA) == (virtual_address & TLB_VA_VA) && (((user && (tlb_set.x.va & TLB_VA_UV))) || (!user && (tlb_set.x.va & TLB_VA_SV)))) + { + LOGMASKED(LOG_TLB, "tlb_lookup 0x%08x set %2d line X hit 0x%08x\n", virtual_address, set, tlb_set.x.ra); + + // mark w line least recently used + tlb_set.u = false; + + return tlb_set.x; + } + + // return the least recently used line + if (tlb_set.u) + { + LOGMASKED(LOG_TLB, "tlb_lookup 0x%08x set %2d line X miss\n", virtual_address, set); + + tlb_set.u = false; + tlb_set.x.ra &= ~TLB_RA_R; + + return tlb_set.x; + } + else + { + LOGMASKED(LOG_TLB, "tlb_lookup 0x%08x set %2d line W miss\n", virtual_address, set); + + tlb_set.u = true; + tlb_set.w.ra &= ~TLB_RA_R; + + return tlb_set.w; + } +} + +cammu_device::translated_t cammu_c3_device::translate_address(const u32 ssw, const u32 virtual_address, const access_size size, const access_type mode) +{ + // get effective user/supervisor mode + const bool user = (mode == EXECUTE) ? (ssw & SSW_U) : (ssw & (SSW_U | SSW_UU)); + + // check for alignment faults + if (!machine().side_effects_disabled() && get_alignment()) + { + if ((mode == EXECUTE && (virtual_address & 0x1)) || (mode != EXECUTE && virtual_address & (size - 1))) + { + set_fault(virtual_address, mode == EXECUTE ? EXCEPTION_I_ALIGNMENT_FAULT : EXCEPTION_D_ALIGNMENT_FAULT); + + return { nullptr, 0 }; + } + } + + // in supervisor mode, the first 8 pages are always mapped via the hard-wired tlb + if (!user && (virtual_address & ~0x7fff) == 0) + { + switch (virtual_address & 0x7000) + { + // pages 0-3: main space pages 0-3 + case 0x0000: return { m_memory[ST1].cache, virtual_address & 0x3fff }; + case 0x1000: return { m_memory[ST2].cache, virtual_address & 0x3fff }; + case 0x2000: return { m_memory[ST3].cache, virtual_address & 0x3fff }; + case 0x3000: return { m_memory[ST3].cache, virtual_address & 0x3fff }; + + // pages 4-5: i/o space pages 0-1 + case 0x4000: return { m_memory[ST4].cache, virtual_address & 0x1fff }; + case 0x5000: return { m_memory[ST4].cache, virtual_address & 0x1fff }; + + // pages 6-7: boot space pages 0-1 + case 0x6000: return { m_memory[ST5].cache, virtual_address & 0x1fff }; + case 0x7000: return { m_memory[ST5].cache, virtual_address & 0x1fff }; + } + } + + // if not in mapped mode, use unmapped system tag + if ((ssw & SSW_M) == 0) + return { m_memory[get_ust_space()].cache, virtual_address }; + + // check translation lookaside buffer + tlb_line_t &tlbl = tlb_lookup(user, virtual_address, mode); + + pte_t pte = { PTE_F, 0 }; + + // handle translation lookaside buffer miss + if (!(tlbl.ra & TLB_RA_R)) + { + // get the page table entry + pte = get_pte(virtual_address, user); + + // check for page faults + if (pte.entry & PTE_F) + { + if (!machine().side_effects_disabled()) + { + LOG("%s page fault address 0x%08x ssw 0x%08x pte 0x%08x (%s)\n", + mode == EXECUTE ? "instruction" : "data", + virtual_address, ssw, pte.entry, machine().describe_context()); + + set_fault(virtual_address, mode == EXECUTE ? EXCEPTION_I_PAGE_FAULT : EXCEPTION_D_PAGE_FAULT); + } + + return { nullptr, 0 }; + } + + // update tlb line from page table entry + // FIXME: not sure if user/supervisor valid follow actual or effective mode? + tlbl.va = (virtual_address & TLB_VA_VA) | (user ? TLB_VA_UV : TLB_VA_SV); + tlbl.ra = pte.entry; + } + + // check protection level + if (!machine().side_effects_disabled()) + { + if ((mode == EXECUTE) && !get_access(EXECUTE, tlbl.ra, ssw)) + { + LOGMASKED(LOG_ACCESS, "execute protection fault address 0x%08x ssw 0x%08x (%s)\n", + virtual_address, ssw, machine().describe_context()); + + set_fault(virtual_address, EXCEPTION_I_EXECUTE_PROTECT_FAULT); + + return { nullptr, 0 }; + } + if ((mode & READ) && !get_access(READ, tlbl.ra, ssw)) + { + LOGMASKED(LOG_ACCESS, "read protection fault address 0x%08x ssw 0x%08x (%s)\n", + virtual_address, ssw, machine().describe_context()); + + set_fault(virtual_address, EXCEPTION_D_READ_PROTECT_FAULT); + + return { nullptr, 0 }; + } + if ((mode & WRITE) && !get_access(WRITE, tlbl.ra, ssw)) + { + LOGMASKED(LOG_ACCESS, "write protection fault address 0x%08x ssw 0x%08x (%s)\n", + virtual_address, ssw, machine().describe_context()); + + set_fault(virtual_address, EXCEPTION_D_WRITE_PROTECT_FAULT); + + return { nullptr, 0 }; + } + } + + // update dirty flag + if ((mode & WRITE) && !(tlbl.ra & TLB_RA_D)) + { + // fetch the page table entry if needed + if (pte.entry & PTE_F) + pte = get_pte(virtual_address, user); + + // set page table entry dirty flag + if (!(pte.entry & PTE_D)) + { + pte.entry |= PTE_D | PTE_R; + m_memory[ST0].cache->write_dword(pte.address, pte.entry); + } + + tlbl.ra |= TLB_RA_D | TLB_RA_R; + } + + // update referenced flag + if (!(tlbl.ra & TLB_RA_R)) + { + // fetch the page table entry if needed + if (pte.entry & PTE_F) + pte = get_pte(virtual_address, user); + + // set page table entry referenced flag + if (!(pte.entry & PTE_R)) + { + pte.entry |= PTE_R; + m_memory[ST0].cache->write_dword(pte.address, pte.entry); + } + + tlbl.ra |= TLB_RA_R; + } + + // return the system tag and translated address + LOGMASKED(LOG_DTU, "%s address translated 0x%08x\n", mode == EXECUTE ? "instruction" : "data", + (tlbl.ra & TLB_RA_RA) | (virtual_address & CAMMU_PAGE_MASK)); + + if (tlbl.ra & 0x800) + return { m_memory[(tlbl.ra & TLB_RA_ST) >> ST_SHIFT].cache, (tlbl.ra & TLB_RA_RA) | (virtual_address & CAMMU_PAGE_MASK) }; + else + return { tlbl.cache, (tlbl.ra & TLB_RA_RA) | (virtual_address & CAMMU_PAGE_MASK) }; } // return the page table entry for a given virtual address @@ -373,7 +562,7 @@ cammu_device::pte_t cammu_device::get_pte(const u32 va, const bool user) const u32 ptdi = (va & VA_PTDI) >> 20; // fetch page table directory entry - const u32 ptde = m_space[ST0]->read_dword(pdo | ptdi); + const u32 ptde = m_memory[ST0].cache->read_dword(pdo | ptdi); LOGMASKED(LOG_DTU, "get_pte pdo 0x%08x ptdi 0x%08x ptde 0x%08x\n", pdo, ptdi, ptde); @@ -388,7 +577,7 @@ cammu_device::pte_t cammu_device::get_pte(const u32 va, const bool user) const u32 pti = (va & VA_PTI) >> 10; // fetch page table entry - pte_t pte = { m_space[ST0]->read_dword(pto | pti), pto | pti }; + pte_t pte = { m_memory[ST0].cache->read_dword(pto | pti), pto | pti }; LOGMASKED(LOG_DTU, "get_pte pto 0x%08x pti 0x%08x pte 0x%08x\n", pto, pti, pte.entry); @@ -430,3 +619,164 @@ const u8 cammu_c3_device::protection_matrix[4][16] = { N, N, RW, RW, RW, R, R, RWE, N, N, RE, RE, N, RE, N, N }, { N, N, N, RW, R, R, R, RWE, N, N, N, RE, RE, N, RE, N } }; + +void cammu_c3_device::reset_w(const u32 data) +{ + // translation lookaside buffer reset operations + if (data & (RESET_RSV | RESET_RUV | RESET_RD | RESET_RR)) + { + LOGMASKED(LOG_TLB, "reset_w%s%s%s%s (%s)\n", + (data & RESET_RSV) ? " RSV" : "", + (data & RESET_RUV) ? " RUV" : "", + (data & RESET_RD) ? " RD" : "", + (data & RESET_RR) ? " RR" : "", + machine().describe_context()); + + const u32 va_mask = ((data & RESET_RSV) ? TLB_VA_SV : 0) | ((data & RESET_RUV) ? TLB_VA_UV : 0); + const u32 ra_mask = ((data & RESET_RD) ? TLB_RA_D : 0) | ((data & RESET_RR) ? TLB_RA_R : 0); + + for (tlb_set_t &tlb_set : m_tlb) + { + tlb_set.w.va &= ~va_mask; + tlb_set.w.ra &= ~ra_mask; + tlb_set.x.va &= ~va_mask; + tlb_set.x.ra &= ~ra_mask; + } + } +} + +u32 cammu_c3_device::tlb_r(const u8 address) const +{ + const u8 set = address >> 2; + u32 result = 0; + + switch (address & 0x3) + { + case 0x0: result = m_tlb[set].w.ra | (m_tlb[set].u ? TLB_RA_U : 0); break; + case 0x1: result = m_tlb[set].w.va; break; + case 0x2: result = m_tlb[set].x.ra | (m_tlb[set].u ? TLB_RA_U : 0); break; + case 0x3: result = m_tlb[set].x.va; break; + } + + LOGMASKED(LOG_TLB, "tlb_r set %2d line %c %s 0x%08x (%s)\n", + set, (address & 0x2) ? 'X' : 'W', (address & 0x1) ? "va" : "ra", + result, machine().describe_context()); + + return result; +} + +void cammu_c3_device::tlb_w(const u8 address, const u32 data) +{ + const u32 mem_mask = ~TLB_RA_U; + const u8 set = address >> 2; + + LOGMASKED(LOG_TLB, "tlb_w set %2d line %c %s 0x%08x (%s)\n", + set, (address & 0x2) ? 'X' : 'W', (address & 0x1) ? "va" : "ra", + data, machine().describe_context()); + + switch (address & 0x3) + { + case 0x0: COMBINE_DATA(&m_tlb[set].w.ra); break; + case 0x1: COMBINE_DATA(&m_tlb[set].w.va); break; + case 0x2: COMBINE_DATA(&m_tlb[set].x.ra); break; + case 0x3: COMBINE_DATA(&m_tlb[set].x.va); break; + } +} + +u32 cammu_c3_device::cammu_r(const u32 address) +{ + switch (address & CAMMU_SELECT) + { + case CAMMU_D_TLB: + return tlb_r(address); + + case CAMMU_D_REG: + switch (address & 0xff) + { + case CAMMU_REG_SPDO: return s_pdo_r(); + case CAMMU_REG_UPDO: return u_pdo_r(); + case CAMMU_REG_FAULT: return fault_r(); + case CAMMU_REG_CONTROL: return control_r(); + } + break; + + case CAMMU_I_TLB: + return m_linked[1]->tlb_r(address); + + case CAMMU_I_REG: + switch (address & 0xff) + { + case CAMMU_REG_SPDO: return m_linked[1]->s_pdo_r(); + case CAMMU_REG_UPDO: return m_linked[1]->u_pdo_r(); + case CAMMU_REG_FAULT: return m_linked[1]->fault_r(); + case CAMMU_REG_CONTROL: return m_linked[1]->control_r(); + } + break; + } + + LOG("cammu_r unknown address 0x%08x\n", address); + return 0; +} + +void cammu_c3_device::cammu_w(const u32 address, const u32 data) +{ + switch (address & CAMMU_SELECT) + { + case CAMMU_D_TLB: + tlb_w(address, data); + break; + + case CAMMU_D_REG: + switch (address & 0xff) + { + case CAMMU_REG_SPDO: s_pdo_w(data); break; + case CAMMU_REG_UPDO: u_pdo_w(data); break; + case CAMMU_REG_FAULT: fault_w(data); break; + case CAMMU_REG_CONTROL: control_w(data); break; + case CAMMU_REG_RESET: reset_w(data); break; + default: + break; + } + break; + + case CAMMU_I_TLB: + m_linked[1]->tlb_w(address, data); + break; + + case CAMMU_I_REG: + switch (address & 0xff) + { + case CAMMU_REG_SPDO: m_linked[1]->s_pdo_w(data); break; + case CAMMU_REG_UPDO: m_linked[1]->u_pdo_w(data); break; + case CAMMU_REG_FAULT: m_linked[1]->fault_w(data); break; + case CAMMU_REG_CONTROL: m_linked[1]->control_w(data); break; + case CAMMU_REG_RESET: m_linked[1]->reset_w(data); break; + default: + break; + } + break; + + case CAMMU_G_TLB: + for (cammu_c3_device *cammu : m_linked) + cammu->tlb_w(address, data); + break; + + case CAMMU_G_REG: + for (cammu_c3_device *cammu : m_linked) + switch (address & 0xff) + { + case CAMMU_REG_SPDO: cammu->s_pdo_w(data); break; + case CAMMU_REG_UPDO: cammu->u_pdo_w(data); break; + case CAMMU_REG_FAULT: cammu->fault_w(data); break; + case CAMMU_REG_CONTROL: cammu->control_w(data); break; + case CAMMU_REG_RESET: cammu->reset_w(data); break; + default: + break; + } + break; + + default: + LOG("cammu_w unknown address 0x%08x data 0x%08x\n", address, data); + break; + } +} diff --git a/src/mame/machine/cammu.h b/src/mame/machine/cammu.h index e852beb4c37..1a600efa6cb 100644 --- a/src/mame/machine/cammu.h +++ b/src/mame/machine/cammu.h @@ -8,19 +8,10 @@ #include "cpu/clipper/common.h" -#define MCFG_CAMMU_ID(_id) \ - downcast<cammu_c4_device &>(*device).set_cammu_id(_id); - -#define MCFG_CAMMU_EXCEPTION_CB(_exceptioncb) \ - downcast<cammu_device &>(*device).set_exception_callback(DEVCB_##_exceptioncb); - -#define MCFG_CAMMU_LINK(_tag) \ - downcast<cammu_c3_device &>(*device).add_linked(_tag); - class cammu_device : public device_t { public: - template <class Object> devcb_base &set_exception_callback(Object &&cb) { return m_exception_func.set_callback(std::forward<Object>(cb)); } + auto exception_callback() { return m_exception_func.bind(); } static const u32 CAMMU_PAGE_SIZE = 0x1000; static const u32 CAMMU_PAGE_MASK = (CAMMU_PAGE_SIZE - 1); @@ -51,7 +42,8 @@ public: PTE_LOCK = 0x00000100 // page lock (software) }; - static const int PTE_ST_SHIFT = 9; + static constexpr int PL_SHIFT = 3; + static constexpr int ST_SHIFT = 9; enum va_mask : u32 { @@ -72,112 +64,132 @@ public: ST7 = 7 // slave i/o }; - virtual void map(address_map &map) = 0; + void set_spaces(address_space &main_space, address_space &io_space, address_space &boot_space); - void set_spaces(std::vector<address_space *> spaces); + // translation lookaside buffer and register access + virtual u32 cammu_r(const u32 address) = 0; + virtual void cammu_w(const u32 address, const u32 data) = 0; template <typename T, typename U> std::enable_if_t<std::is_convertible<U, std::function<void(T)>>::value, bool> load(const u32 ssw, const u32 address, U &&apply) { - translated_t t = translate_address(ssw, address, access_size(sizeof(T)), READ); - - if (t.space != nullptr) + // check for cammu access + if ((ssw & (SSW_UU | SSW_U)) || ((address & ~0x7ff) != 0x00004800)) { + translated_t t = translate_address(ssw, address, access_size(sizeof(T)), READ); + + if (!t.cache) + return false; + switch (sizeof(T)) { - case 1: apply(T(t.space->read_byte(t.address))); break; - case 2: apply(T(t.space->read_word(t.address))); break; - case 4: apply(T(t.space->read_dword(t.address))); break; - case 8: apply(T(t.space->read_qword(t.address))); break; - default: fatalerror("unhandled load size %d\n", access_size(sizeof(T))); + case 1: apply(T(t.cache->read_byte(t.address))); break; + case 2: apply(T(t.cache->read_word(t.address))); break; + case 4: apply(T(t.cache->read_dword(t.address))); break; + case 8: apply(T(t.cache->read_qword(t.address))); break; + default: + fatalerror("unhandled load 0x%08x size %d (%s)", + address, access_size(sizeof(T)), machine().describe_context().c_str()); } - - return true; } + else if (sizeof(T) == 4) + apply(cammu_r(address)); else - return false; + fatalerror("unhandled cammu load 0x%08x size %d (%s)", + address, access_size(sizeof(T)), machine().describe_context().c_str()); + + return true; } template <typename T, typename U> std::enable_if_t<std::is_convertible<U, T>::value, bool> store(const u32 ssw, const u32 address, U data) { - translated_t t = translate_address(ssw, address, access_size(sizeof(T)), WRITE); - - if (t.space != nullptr) + // check for cammu access + if ((ssw & (SSW_UU | SSW_U)) || ((address & ~0x7ff) != 0x00004800)) { + translated_t t = translate_address(ssw, address, access_size(sizeof(T)), WRITE); + + if (!t.cache) + return false; + switch (sizeof(T)) { - case 1: t.space->write_byte(t.address, T(data)); break; - case 2: t.space->write_word(t.address, T(data)); break; - case 4: t.space->write_dword(t.address, T(data)); break; - case 8: t.space->write_qword(t.address, T(data)); break; - default: fatalerror("unhandled store size %d\n", access_size(sizeof(T))); + case 1: t.cache->write_byte(t.address, T(data)); break; + case 2: t.cache->write_word(t.address, T(data)); break; + case 4: t.cache->write_dword(t.address, T(data)); break; + case 8: t.cache->write_qword(t.address, T(data)); break; + default: + fatalerror("unhandled store 0x%08x size %d (%s)", + address, access_size(sizeof(T)), machine().describe_context().c_str()); } - - return true; } + else if (sizeof(T) == 4) + cammu_w(address, data); else - return false; + fatalerror("unhandled cammu store 0x%08x size %d (%s)", + address, access_size(sizeof(T)), machine().describe_context().c_str()); + + return true; } template <typename T, typename U> std::enable_if_t<std::is_convertible<U, std::function<T(T)>>::value, bool> modify(const u32 ssw, const u32 address, U &&apply) { translated_t t = translate_address(ssw, address, access_size(sizeof(T)), access_type(READ | WRITE)); - if (t.space != nullptr) - { - switch (sizeof(T)) - { - case 4: t.space->write_dword(t.address, apply(T(t.space->read_dword(t.address)))); break; - default: fatalerror("unhandled modify size %d\n", access_size(sizeof(T))); - } + if (!t.cache) + return false; - return true; + switch (sizeof(T)) + { + case 4: t.cache->write_dword(t.address, apply(T(t.cache->read_dword(t.address)))); break; + default: + fatalerror("unhandled modify 0x%08x size %d (%s)", + address, access_size(sizeof(T)), machine().describe_context().c_str()); } - else - return false; + + return true; } template <typename T, typename U> std::enable_if_t<std::is_convertible<U, std::function<void(T)>>::value, bool> fetch(const u32 ssw, const u32 address, U &&apply) { translated_t t = translate_address(ssw, address, access_size(sizeof(T)), EXECUTE); - if (t.space != nullptr) + if (!t.cache) + return false; + + switch (sizeof(T)) { - switch (sizeof(T)) + case 2: apply(T(t.cache->read_word(t.address))); break; + case 4: { - case 2: apply(T(t.space->read_word(t.address))); break; - case 4: + // check for unaligned access + if (address & 0x2) { - // check for unaligned access - if (address & 0x2) + // check for page span + if ((address & CAMMU_PAGE_MASK) == (CAMMU_PAGE_SIZE - 2)) { - // check for page span - if ((address & CAMMU_PAGE_MASK) == (CAMMU_PAGE_SIZE - 2)) + translated_t u = translate_address(ssw, address + 2, access_size(sizeof(u16)), EXECUTE); + if (u.cache) { - translated_t u = translate_address(ssw, address + 2, access_size(sizeof(u16)), EXECUTE); - if (u.space != nullptr) - { - const u16 lsw = t.space->read_word(t.address); - const u16 msw = u.space->read_word(u.address); - - apply((T(msw) << 16) | lsw); - } - else - return false; + const u16 lsw = t.cache->read_word(t.address); + const u16 msw = t.cache->read_word(u.address); + + apply((T(msw) << 16) | lsw); } else - apply(T(t.space->read_dword_unaligned(t.address))); + return false; } else - apply(T(t.space->read_dword(t.address))); + apply(T(t.cache->read_dword_unaligned(t.address))); } - break; - default: fatalerror("unhandled fetch size %d\n", access_size(sizeof(T))); + else + apply(T(t.cache->read_dword(t.address))); } - - return true; + break; + default: + fatalerror("unhandled fetch 0x%08x size %d (%s)\n", + address, access_size(sizeof(T)), machine().describe_context().c_str()); } - else - return false; + + return true; } // address translation for debugger @@ -213,20 +225,26 @@ protected: RWE = READ | WRITE | EXECUTE, }; -private: - // address translation struct translated_t { - address_space *const space; + memory_access_cache<2, 0, ENDIANNESS_LITTLE> *const cache; const u32 address; }; - translated_t translate_address(const u32 ssw, const u32 virtual_address, const access_size size, const access_type mode); struct pte_t { - const u32 entry; - const u32 address; + u32 entry; + u32 address; }; + + struct memory_t + { + address_space *space; + memory_access_cache<2, 0, ENDIANNESS_LITTLE> *cache; + }; + + // address translation + virtual translated_t translate_address(const u32 ssw, const u32 virtual_address, const access_size size, const access_type mode); pte_t get_pte(const u32 va, const bool user); // helpers @@ -234,16 +252,21 @@ private: virtual bool get_alignment() const = 0; virtual u32 get_pdo(const bool user) const = 0; virtual system_tag_t get_ust_space() const = 0; + virtual void set_fault(const u32 address, const exception_vector type) = 0; - virtual void set_fault_address(const u32 va) = 0; - + // device state devcb_write16 m_exception_func; - address_space *m_space[8]; + memory_t m_memory[8]; }; class cammu_c4_device : public cammu_device { public: + // TODO: translation lookaside buffer and register access + virtual void map(address_map &map) = 0; + virtual u32 cammu_r(const u32 address) override { return 0; } + virtual void cammu_w(const u32 address, const u32 data) override {} + void set_cammu_id(const u32 cammu_id) { m_control = cammu_id; } DECLARE_READ32_MEMBER(s_pdo_r) { return m_s_pdo; } @@ -277,7 +300,7 @@ protected: virtual bool get_access(const access_type mode, const u32 pte, const u32 ssw) const override; virtual u32 get_pdo(const bool user) const override { return user ? m_u_pdo : m_s_pdo; } - virtual void set_fault_address(const u32 va) override { m_fault_address_1 = va; } + virtual void set_fault(const u32 address, const exception_vector type) override { m_fault_address_1 = address; m_exception_func(type); } u32 m_s_pdo; u32 m_u_pdo; @@ -484,10 +507,87 @@ class cammu_c3_device : public cammu_device public: cammu_c3_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - virtual void map(address_map &map) override; - virtual void map_global(address_map &map); + void add_linked(cammu_c3_device *child) { m_linked.push_back(child); } - void add_linked(const char *const tag) { m_linked.push_back(downcast<cammu_c3_device *>(siblingdevice(tag))); } +protected: + // device-level overrides + virtual void device_reset() override; + virtual void device_start() override; + + // translation lookaside buffer and register access + virtual u32 cammu_r(const u32 address) override; + virtual void cammu_w(const u32 address, const u32 data) override; + + // address translation + virtual translated_t translate_address(const u32 ssw, const u32 virtual_address, const access_size size, const access_type mode) override; + +private: + enum cammu_address_mask : u32 + { + CAMMU_TLB_VA = 0x00000001, // tlb va/ra select + CAMMU_TLB_X = 0x00000002, // tlb x/w line select + CAMMU_TLB_SET = 0x000000fc, // tlb set select + CAMMU_REG = 0x000000ff, // register select + CAMMU_SELECT = 0x00000700, // cammu select + }; + enum tlb_ra_mask : u32 + { + TLB_RA_U = 0x00000001, // used flag + TLB_RA_R = 0x00000002, // referenced flag + TLB_RA_D = 0x00000004, // dirty flag + TLB_RA_PL = 0x00000078, // protection level + TLB_RA_ST = 0x00000e00, // system tag + TLB_RA_RA = 0xfffff000, // real address + }; + enum tlb_va_mask : u32 + { + TLB_VA_UV = 0x00000002, // user valid flag + TLB_VA_SV = 0x00000004, // supervisor valid flag + TLB_VA_VA = 0xfffc0000, // virtual address tag + }; + + /* + * The C1/C3 CAMMU has 64-entry, two-way set associative TLB, with lines + * grouped into W and X compartments. The associated U flag is set to + * indicate that the W line of the set was most recently accessed, and + * cleared when the X line was most recently accessed. On TLB miss, the + * least recently used line as indicated by this flag is replaced. + * + * Each line consists of a real address field and a virtual address field. + * The real address field format is practically identical to the page table + * entry format. + */ + struct tlb_line_t + { + u32 ra; // real address field + u32 va; // virtual address field + + memory_access_cache<2, 0, ENDIANNESS_LITTLE> *cache; + }; + struct tlb_set_t + { + tlb_line_t w; + tlb_line_t x; + bool u; + }; + + enum cammu_select_mask : u32 + { + CAMMU_D_TLB = 0x000, // d-cammu tlb + CAMMU_D_REG = 0x100, // d-cammu register + CAMMU_I_TLB = 0x200, // i-cammu tlb + CAMMU_I_REG = 0x300, // i-cammu register + CAMMU_G_TLB = 0x400, // global tlb + CAMMU_G_REG = 0x500, // global register + }; + enum cammu_register_mask : u8 + { + CAMMU_REG_SPDO = 0x04, // supervisor pdo register + CAMMU_REG_UPDO = 0x08, // user pdo register + CAMMU_REG_FAULT = 0x10, // fault register + CAMMU_REG_CONTROL = 0x40, // control register + CAMMU_REG_RESET = 0x80, // reset register + }; enum control_mask : u32 { @@ -500,59 +600,61 @@ public: CNTL_ATE = 0x00000200, // alignment trap enable CNTL_CID = 0xff000000 // cammu id }; - - enum ust_mask : u32 + enum control_ust_mask : u32 { UST_0 = 0x00000000, // private, write-through, main memory space UST_1 = 0x00000010, // shared, write-through, main memory space UST_2 = 0x00000020, // private, copy-back, main memory space UST_3 = 0x00000030 // noncacheable, main memory space }; - enum control_cid_mask : u32 { CID_C3 = 0x00000000 // unknown }; - DECLARE_READ32_MEMBER(s_pdo_r) { return m_s_pdo; } - DECLARE_WRITE32_MEMBER(s_pdo_w) { m_s_pdo = ((m_s_pdo & ~mem_mask) | (data & mem_mask)) & PDO_MASK; } - DECLARE_READ32_MEMBER(u_pdo_r) { return m_u_pdo; } - DECLARE_WRITE32_MEMBER(u_pdo_w) { m_u_pdo = ((m_u_pdo & ~mem_mask) | (data & mem_mask)) & PDO_MASK; } - DECLARE_READ32_MEMBER(fault_r) { return m_fault; } - DECLARE_WRITE32_MEMBER(fault_w) { m_fault = data; } - DECLARE_READ32_MEMBER(control_r) { return m_control; } - DECLARE_WRITE32_MEMBER(control_w) { m_control = ((m_control & (~mem_mask | CNTL_CID)) | (data & (mem_mask & ~CNTL_CID))); } - DECLARE_READ32_MEMBER(reset_r) { return m_reset; } - DECLARE_WRITE32_MEMBER(reset_w) { m_reset = data; } + enum reset_mask : u32 + { + RESET_RLVW = 0x00000001, // reset all W line LV flags in cache + RESET_RLVX = 0x00000002, // reset all X line LV flags in cache + RESET_RSV = 0x00000004, // reset all SV flags in tlb + RESET_RUV = 0x00000008, // reset all UV flags in tlb + RESET_RD = 0x00000010, // reset all D flags in tlb + RESET_RR = 0x00000020, // reset all R flags in tlb + RESET_RU = 0x00000040, // reset all U flags in cache + }; - // global methods - relay to each linked device - DECLARE_WRITE32_MEMBER(g_s_pdo_w) { for (cammu_c3_device *dev : m_linked) dev->s_pdo_w(space, offset, data, mem_mask); } - DECLARE_WRITE32_MEMBER(g_u_pdo_w) { for (cammu_c3_device *dev : m_linked) dev->u_pdo_w(space, offset, data, mem_mask); } - DECLARE_WRITE32_MEMBER(g_fault_w) { for (cammu_c3_device *dev : m_linked) dev->fault_w(space, offset, data, mem_mask); } - DECLARE_WRITE32_MEMBER(g_control_w) { for (cammu_c3_device *dev : m_linked) dev->control_w(space, offset, data, mem_mask); } - DECLARE_WRITE32_MEMBER(g_reset_w) { for (cammu_c3_device *dev : m_linked) dev->reset_w(space, offset, data, mem_mask); } + u32 tlb_r(const u8 address) const; + void tlb_w(const u8 address, const u32 data); + tlb_line_t &tlb_lookup(const bool user, const u32 virtual_address, const access_type mode); -protected: - virtual void device_reset() override; - virtual void device_start() override; + u32 s_pdo_r() const { return m_s_pdo; } + void s_pdo_w(const u32 data) { m_s_pdo = data & PDO_MASK; } + u32 u_pdo_r() const { return m_u_pdo; } + void u_pdo_w(const u32 data) { m_u_pdo = data & PDO_MASK; } + u32 fault_r() const { return m_fault; } + void fault_w(const u32 data) { m_fault = data; } + u32 control_r() const { return m_control; } + void control_w(const u32 data) { m_control = (m_control & CNTL_CID) | (data & ~CNTL_CID); } + void reset_w(const u32 data); - virtual bool get_access(const access_type mode, const u32 pte, const u32 ssw) const override; virtual bool get_alignment() const override { return m_control & CNTL_ATE; } - virtual u32 get_pdo(const bool user) const override { return user ? m_u_pdo : m_s_pdo; } virtual system_tag_t get_ust_space() const override { return system_tag_t((m_control & CNTL_UST) >> 4); } + virtual bool get_access(const access_type mode, const u32 pte, const u32 ssw) const override; + virtual u32 get_pdo(const bool user) const override { return user ? m_u_pdo : m_s_pdo; } - virtual void set_fault_address(const u32 va) override { m_fault = va; } + virtual void set_fault(const u32 address, const exception_vector type) override { m_fault = address; m_exception_func(type); } -private: static const u8 protection_matrix[4][16]; + // device state + std::vector<cammu_c3_device *> m_linked; + u32 m_s_pdo; u32 m_u_pdo; u32 m_fault; u32 m_control; - u32 m_reset; - std::vector<cammu_c3_device *> m_linked; + tlb_set_t m_tlb[64]; }; // device type definitions diff --git a/src/mame/machine/concept.cpp b/src/mame/machine/concept.cpp index cfb456165ab..655d98dd03d 100644 --- a/src/mame/machine/concept.cpp +++ b/src/mame/machine/concept.cpp @@ -61,18 +61,14 @@ void concept_state::video_start() { } -uint32_t concept_state::screen_update_concept(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +uint32_t concept_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { /* resolution is 720*560 */ - uint16_t *videoram = m_videoram; - int x, y; - uint16_t *line; - - for (y = 0; y < 560; y++) + for (int y = 0; y < 560; y++) { - line = &bitmap.pix16(560-1-y); - for (x = 0; x < 720; x++) - line[720-1-x] = (videoram[(x+48+y*768)>>4] & (0x8000 >> ((x+48+y*768) & 0xf))) ? 1 : 0; + uint16_t *line = &bitmap.pix16(560-1-y); + for (int x = 0; x < 720; x++) + line[720-1-x] = (m_videoram[(x+48+y*768)>>4] & (0x8000 >> ((x+48+y*768) & 0xf))) ? 1 : 0; } return 0; } @@ -249,7 +245,7 @@ READ16_MEMBER(concept_state::concept_io_r) /* NVIA versatile system interface */ // LOG(("concept_io_r: VIA read at address 0x03%4.4x\n", offset << 1)); { - return m_via0->read(space, offset & 0xf); + return m_via0->read(offset & 0xf); } case 4: @@ -362,7 +358,7 @@ WRITE16_MEMBER(concept_state::concept_io_w) case 3: /* NVIA versatile system interface */ { - m_via0->write(space, offset & 0xf, data); + m_via0->write(offset & 0xf, data); } break; diff --git a/src/mame/machine/cuda.h b/src/mame/machine/cuda.h index 158784a1198..4c0e96f9f60 100644 --- a/src/mame/machine/cuda.h +++ b/src/mame/machine/cuda.h @@ -59,6 +59,12 @@ class cuda_device : public device_t, public device_nvram_interface { public: // construction/destruction + cuda_device(const machine_config &mconfig, const char *tag, device_t *owner, int type) + : cuda_device(mconfig, tag, owner, (uint32_t)0) + { + set_type(type); + } + cuda_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); // inline configuration helpers @@ -100,6 +106,10 @@ public: template <class Object> devcb_base &set_linechange_cb(Object &&wr) { return write_linechange.set_callback(std::forward<Object>(wr)); } template <class Object> devcb_base &set_via_clock_cb(Object &&wr) { return write_via_clock.set_callback(std::forward<Object>(wr)); } template <class Object> devcb_base &set_via_data_cb(Object &&wr) { return write_via_data.set_callback(std::forward<Object>(wr)); } + auto reset_callback() { return write_reset.bind(); } + auto linechange_callback() { return write_linechange.bind(); } + auto via_clock_callback() { return write_via_clock.bind(); } + auto via_data_callback() { return write_via_data.bind(); } devcb_write_line write_reset, write_linechange, write_via_clock, write_via_data; diff --git a/src/mame/machine/dec0.cpp b/src/mame/machine/dec0.cpp index f6abe83305b..38def5ae983 100644 --- a/src/mame/machine/dec0.cpp +++ b/src/mame/machine/dec0.cpp @@ -358,8 +358,6 @@ void dec0_state::h6280_decrypt(const char *cputag) void dec0_state::init_hippodrm() { uint8_t *RAM = memregion("sub")->base(); - m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x180000, 0x18003f, read16_delegate(FUNC(dec0_state::hippodrm_68000_share_r),this), write16_delegate(FUNC(dec0_state::hippodrm_68000_share_w),this)); - m_maincpu->space(AS_PROGRAM).install_write_handler(0xffc800, 0xffcfff, write16_delegate(FUNC(dec0_state::sprite_mirror_w),this)); h6280_decrypt("sub"); @@ -381,11 +379,6 @@ void dec0_state::init_slyspy() save_item(NAME(m_slyspy_sound_state)); } -void dec0_state::init_robocop() -{ - m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x180000, 0x180fff, read16_delegate(FUNC(dec0_state::robocop_68000_share_r),this), write16_delegate(FUNC(dec0_state::robocop_68000_share_w),this)); -} - void dec0_state::init_drgninja() { m_game = mcu_type::BADDUDES_SIM; diff --git a/src/mame/machine/deco_irq.cpp b/src/mame/machine/deco_irq.cpp index c22ca908adc..0654edc8755 100644 --- a/src/mame/machine/deco_irq.cpp +++ b/src/mame/machine/deco_irq.cpp @@ -108,14 +108,14 @@ TIMER_CALLBACK_MEMBER( deco_irq_device::scanline_callback ) } // lightgun? - if (m_lightgun_latch >= visible.min_y && m_lightgun_latch <= visible.max_y && y == m_lightgun_latch) + if (m_lightgun_latch >= visible.top() && m_lightgun_latch <= visible.bottom() && y == m_lightgun_latch) { m_lightgun_irq = true; m_lightgun_irq_cb(ASSERT_LINE); } // vblank-in? - if (y == (visible.max_y + 1)) + if (y == (visible.bottom() + 1)) { m_vblank_irq = true; m_vblank_irq_cb(ASSERT_LINE); diff --git a/src/mame/machine/egret.h b/src/mame/machine/egret.h index c94cf56be0f..df0ea8b03e8 100644 --- a/src/mame/machine/egret.h +++ b/src/mame/machine/egret.h @@ -57,6 +57,12 @@ class egret_device : public device_t, public device_nvram_interface { public: // construction/destruction + egret_device(const machine_config &mconfig, const char *tag, device_t *owner, int type) + : egret_device(mconfig, tag, owner, (uint32_t)0) + { + set_type(type); + } + egret_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); // inline configuration helpers @@ -98,6 +104,10 @@ public: template <class Object> devcb_base &set_linechange_cb(Object &&wr) { return write_linechange.set_callback(std::forward<Object>(wr)); } template <class Object> devcb_base &set_via_clock_cb(Object &&wr) { return write_via_clock.set_callback(std::forward<Object>(wr)); } template <class Object> devcb_base &set_via_data_cb(Object &&wr) { return write_via_data.set_callback(std::forward<Object>(wr)); } + auto reset_callback() { return write_reset.bind(); } + auto linechange_callback() { return write_linechange.bind(); } + auto via_clock_callback() { return write_via_clock.bind(); } + auto via_data_callback() { return write_via_data.bind(); } devcb_write_line write_reset, write_linechange, write_via_clock, write_via_data; diff --git a/src/mame/machine/electron.cpp b/src/mame/machine/electron.cpp index 725a57bb467..269ba54aa98 100644 --- a/src/mame/machine/electron.cpp +++ b/src/mame/machine/electron.cpp @@ -18,9 +18,9 @@ void electron_state::waitforramsync() { int cycles = 0; - if (!(m_ula.screen_mode & 4) && (m_screen->vpos() > m_screen->visible_area().min_y) && (m_screen->vpos() < m_screen->visible_area().max_y) && !m_screen->hblank()) + if (!(m_ula.screen_mode & 4) && (m_screen->vpos() > m_screen->visible_area().top()) && (m_screen->vpos() < m_screen->visible_area().bottom()) && !m_screen->hblank()) { - cycles += (m_screen->visible_area().max_x - m_screen->hpos()) / 16; + cycles += (m_screen->visible_area().right() - m_screen->hpos()) / 16; } if (cycles & 1) cycles++; diff --git a/src/mame/machine/hal2.h b/src/mame/machine/hal2.h index 79ca3097cbf..39929180aeb 100644 --- a/src/mame/machine/hal2.h +++ b/src/mame/machine/hal2.h @@ -14,10 +14,15 @@ class hal2_device : public device_t { public: + hal2_device(const machine_config &mconfig, const char *tag, device_t *owner) + : hal2_device(mconfig, tag, owner, (uint32_t)0) + { + } + hal2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - DECLARE_WRITE32_MEMBER( write ); - DECLARE_READ32_MEMBER( read ); + DECLARE_WRITE32_MEMBER(write); + DECLARE_READ32_MEMBER(read); protected: virtual void device_start() override; diff --git a/src/mame/machine/hpc3.h b/src/mame/machine/hpc3.h index ea4f6a98509..b9c47db8a9c 100644 --- a/src/mame/machine/hpc3.h +++ b/src/mame/machine/hpc3.h @@ -18,17 +18,13 @@ class hpc3_device : public device_t { public: - template <typename T> void set_cpu_tag(T &&tag) { m_maincpu.set_tag(std::forward<T>(tag)); } - template <typename T> void set_scsi_tag(T &&tag) { m_wd33c93.set_tag(std::forward<T>(tag)); } - template <typename T> void set_ioc2_tag(T &&tag) { m_ioc2.set_tag(std::forward<T>(tag)); } - template <typename T, typename U, typename V> - hpc3_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, T &&cpu_tag, U &&scsi_tag, V &&ioc2_tag) - : hpc3_device(mconfig, tag, owner, clock) + hpc3_device(const machine_config &mconfig, const char *tag, device_t *owner, T &&cpu_tag, U &&scsi_tag, V &&ioc2_tag) + : hpc3_device(mconfig, tag, owner, (uint32_t)0) { - set_cpu_tag(std::forward<T>(cpu_tag)); - set_scsi_tag(std::forward<U>(scsi_tag)); - set_ioc2_tag(std::forward<V>(ioc2_tag)); + m_maincpu.set_tag(std::forward<T>(cpu_tag)); + m_wd33c93.set_tag(std::forward<U>(scsi_tag)); + m_ioc2.set_tag(std::forward<V>(ioc2_tag)); } hpc3_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); diff --git a/src/mame/machine/interpro_ioga.cpp b/src/mame/machine/interpro_ioga.cpp index 95fff249df7..7f59e4dedd1 100644 --- a/src/mame/machine/interpro_ioga.cpp +++ b/src/mame/machine/interpro_ioga.cpp @@ -134,7 +134,7 @@ DEFINE_DEVICE_TYPE(SAPPHIRE_IOGA, sapphire_ioga_device, "ioga_s", "I/O Gate Arra interpro_ioga_device::interpro_ioga_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, type, tag, owner, clock) , m_memory_device(*this, finder_base::DUMMY_TAG) - , m_memory_space(nullptr) + , m_memory(nullptr) , m_out_nmi_func(*this) , m_out_irq_func(*this) , m_out_irq_vector_func(*this) @@ -170,8 +170,10 @@ void interpro_ioga_device::device_start() { // get the memory space if (!m_memory_device->has_space(m_memory_spacenum)) - throw emu_fatalerror("%s: Device %s (%s) doen't have memory space %d\n", tag(), m_memory_device->device().tag(), m_memory_device->device().name(), m_memory_spacenum); - m_memory_space = &m_memory_device->space(m_memory_spacenum); + fatalerror("%s: device %s (%s) doesn't have memory space %d\n", + tag(), m_memory_device->device().tag(), m_memory_device->device().name(), m_memory_spacenum); + + m_memory = m_memory_device->space(m_memory_spacenum).cache<2, 0, ENDIANNESS_LITTLE>(); // resolve callbacks m_out_nmi_func.resolve(); @@ -695,9 +697,9 @@ TIMER_CALLBACK_MEMBER(interpro_ioga_device::dma) { // transfer from the memory to device or device to memory if (dma_channel.control & DMA_CTRL_WRITE) - dma_channel.device_w(m_memory_space->read_byte(dma_channel.real_address)); + dma_channel.device_w(m_memory->read_byte(dma_channel.real_address)); else - m_memory_space->write_byte(dma_channel.real_address, dma_channel.device_r()); + m_memory->write_byte(dma_channel.real_address, dma_channel.device_r()); // increment address and decrement count dma_channel.real_address++; @@ -711,7 +713,7 @@ TIMER_CALLBACK_MEMBER(interpro_ioga_device::dma) // translate virtual address if (dma_channel.control & DMA_CTRL_VIRTUAL) { - const u32 ptde = m_memory_space->read_dword(dma_channel.virtual_address); + const u32 ptde = m_memory->read_dword(dma_channel.virtual_address); dma_channel.virtual_address += 4; // FIXME: ignore the page fault flag? @@ -888,7 +890,7 @@ void interpro_ioga_device::dma_w(address_space &space, offs_t offset, u32 data, // translate virtual address if (data & DMA_CTRL_VIRTUAL) { - const u32 ptde = m_memory_space->read_dword(dma_channel.virtual_address); + const u32 ptde = m_memory->read_dword(dma_channel.virtual_address); dma_channel.virtual_address += 4; // FIXME: ignore the page fault flag? @@ -930,7 +932,7 @@ TIMER_CALLBACK_MEMBER(interpro_ioga_device::serial_dma) // TODO: work out which control register bits indicate read from device if (dma_channel.control & SDMA_SEND) { - u8 data = m_memory_space->read_byte(dma_channel.address); + u8 data = m_memory->read_byte(dma_channel.address); LOGMASKED(LOG_SERIALDMA, "dma: transmitting byte 0x%02x to serial channel %d\n", data, dma_channel.channel); @@ -944,7 +946,7 @@ TIMER_CALLBACK_MEMBER(interpro_ioga_device::serial_dma) LOGMASKED(LOG_SERIALDMA, "dma: receiving byte 0x%02x from serial channel %d\n", data, dma_channel.channel); - m_memory_space->write_byte(dma_channel.address, data); + m_memory->write_byte(dma_channel.address, data); } // increment address and decrement count @@ -1301,14 +1303,14 @@ WRITE16_MEMBER(emerald_ioga_device::eth_w) LOGMASKED(LOG_NETWORK, "eth_w address 0x%08x mask 0x%04x data 0x%04x\n", address, mem_mask, data); - m_memory_space->write_word(address, data, mem_mask); + m_memory->write_word(address, data, mem_mask); } READ16_MEMBER(emerald_ioga_device::eth_r) { const u32 address = m_eth_base | ((offset << 1) & ~ETH_BASE_MASK); - const u16 data = m_memory_space->read_word(address, mem_mask); + const u16 data = m_memory->read_word(address, mem_mask); LOGMASKED(LOG_NETWORK, "eth_r 0x%08x mask 0x%04x data 0x%04x\n", address, mem_mask, data); @@ -1362,14 +1364,14 @@ WRITE16_MEMBER(turquoise_ioga_device::eth_w) LOGMASKED(LOG_NETWORK, "eth_w address 0x%08x mask 0x%04x data 0x%04x\n", address, mem_mask, data); - m_memory_space->write_word(address, data, mem_mask); + m_memory->write_word(address, data, mem_mask); } READ16_MEMBER(turquoise_ioga_device::eth_r) { const u32 address = m_eth_base | ((offset << 1) & ~ETH_BASE_MASK); - const u16 data = m_memory_space->read_word(address, mem_mask); + const u16 data = m_memory->read_word(address, mem_mask); LOGMASKED(LOG_NETWORK, "eth_r 0x%08x mask 0x%04x data 0x%04x\n", address, mem_mask, data); @@ -1450,7 +1452,7 @@ WRITE16_MEMBER(sapphire_ioga_device::eth_w) LOGMASKED(LOG_NETWORK, "eth_w channel %c address 0x%08x mask 0x%08x data 0x%04x\n", channel + 'A', address, mem_mask, data); - m_memory_space->write_word(address, data, mem_mask); + m_memory->write_word(address, data, mem_mask); } READ16_MEMBER(sapphire_ioga_device::eth_r) @@ -1469,7 +1471,7 @@ READ16_MEMBER(sapphire_ioga_device::eth_r) offset << 1, address); } - u16 data = m_memory_space->read_word(address, mem_mask); + u16 data = m_memory->read_word(address, mem_mask); LOGMASKED(LOG_NETWORK, "eth_r channel %c address 0x%08x mask 0x%08x data 0x%04x\n", channel + 'A', address, mem_mask, data); return data; diff --git a/src/mame/machine/interpro_ioga.h b/src/mame/machine/interpro_ioga.h index 8527e3aca18..3be090eb16b 100644 --- a/src/mame/machine/interpro_ioga.h +++ b/src/mame/machine/interpro_ioga.h @@ -248,7 +248,7 @@ protected: required_device<device_memory_interface> m_memory_device; int m_memory_spacenum; - address_space *m_memory_space; + memory_access_cache<2, 0, ENDIANNESS_LITTLE> *m_memory; // callbacks devcb_write_line m_out_nmi_func; diff --git a/src/mame/machine/interpro_sga.cpp b/src/mame/machine/interpro_sga.cpp index 7f48abb6631..511e5a5f098 100644 --- a/src/mame/machine/interpro_sga.cpp +++ b/src/mame/machine/interpro_sga.cpp @@ -70,14 +70,14 @@ void interpro_sga_device::map(address_map &map) DEFINE_DEVICE_TYPE(INTERPRO_SGA, interpro_sga_device, "sga", "SRX Gate Array") interpro_sga_device::interpro_sga_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, INTERPRO_SGA, tag, owner, clock), - out_berr_func(*this) + : device_t(mconfig, INTERPRO_SGA, tag, owner, clock) + , m_berr_func(*this) { } void interpro_sga_device::device_start() { - out_berr_func.resolve(); + m_berr_func.resolve(); save_item(NAME(m_gcsr)); save_item(NAME(m_ipoll)); @@ -152,9 +152,9 @@ WRITE32_MEMBER(interpro_sga_device::ddtc1_w) // error cycle - bit 0x10 indicates source address error (dspad1) // now expecting 0x5463? if ((m_dspad1 & 0xfffff000) == 0x40000000) - out_berr_func(space, 0x5433, m_dspad1); // BINFO_SNAPOK | BINFO_BERR | BINFO_BG_ICAMMU | 0x30 | CT(3) + m_berr_func(space, 0x5433, m_dspad1); // BINFO_SNAPOK | BINFO_BERR | BINFO_BG_ICAMMU | 0x30 | CT(3) else - out_berr_func(space, 0x5423, m_ddpad1); // BINFO_SNAPOK | BINFO_BERR | BINFO_BG_ICAMMU | 0x20 | CT(3) + m_berr_func(space, 0x5423, m_ddpad1); // BINFO_SNAPOK | BINFO_BERR | BINFO_BG_ICAMMU | 0x20 | CT(3) // 0x5423 = BERR|SNAPOK | BG(ICAMMU)? | CT(23) // 0x5433 = BERR|SNAPOK | BG(ICAMMU)? | CT(33) diff --git a/src/mame/machine/interpro_sga.h b/src/mame/machine/interpro_sga.h index c845722eb0e..7023a6b43de 100644 --- a/src/mame/machine/interpro_sga.h +++ b/src/mame/machine/interpro_sga.h @@ -6,15 +6,12 @@ #pragma once -#define MCFG_INTERPRO_SGA_BERR_CB(_out_berr) \ - downcast<interpro_sga_device &>(*device).set_out_berr_callback(DEVCB_##_out_berr); - class interpro_sga_device : public device_t { public: interpro_sga_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template <class Object> devcb_base &set_out_berr_callback(Object &&cb) { return out_berr_func.set_callback(std::forward<Object>(cb)); } + auto berr_callback() { return m_berr_func.bind(); } virtual void map(address_map &map); @@ -185,7 +182,7 @@ private: u32 m_dcksum0; // dma 1 device checksum register 0 u32 m_dcksum1; // dma 1 device checksum register 1 - devcb_write32 out_berr_func; + devcb_write32 m_berr_func; }; // device type definition diff --git a/src/mame/machine/ioc2.cpp b/src/mame/machine/ioc2.cpp index 999acc78d71..390a50dc443 100644 --- a/src/mame/machine/ioc2.cpp +++ b/src/mame/machine/ioc2.cpp @@ -68,17 +68,17 @@ MACHINE_CONFIG_START(ioc2_device::device_add_mconfig) MCFG_RS232_DCD_HANDLER(WRITELINE(SCC_TAG, scc85230_device, dcdb_w)) MCFG_RS232_RXD_HANDLER(WRITELINE(SCC_TAG, scc85230_device, rxb_w)) - MCFG_DEVICE_ADD(PI1_TAG, PC_LPT, 0) + PC_LPT(config, m_pi1, 0); - MCFG_DEVICE_ADD(KBDC_TAG, KBDC8042, 0) - MCFG_KBDC8042_KEYBOARD_TYPE(KBDC8042_PS2) - MCFG_KBDC8042_SYSTEM_RESET_CB(INPUTLINE("^maincpu", INPUT_LINE_RESET)) + KBDC8042(config, m_kbdc); + m_kbdc->set_keyboard_type(kbdc8042_device::KBDC8042_PS2); + m_kbdc->system_reset_callback().set_inputline(m_maincpu, INPUT_LINE_RESET); - MCFG_DEVICE_ADD(PIT_TAG, PIT8254, 0) - MCFG_PIT8253_CLK0(1000000) - MCFG_PIT8253_CLK1(1000000) - MCFG_PIT8253_CLK2(1000000) - MCFG_PIT8253_OUT2_HANDLER(WRITELINE(KBDC_TAG, kbdc8042_device, write_out2)) + PIT8254(config, m_pit, 0); + m_pit->set_clk<0>(1000000); + m_pit->set_clk<1>(1000000); + m_pit->set_clk<2>(1000000); + m_pit->out_handler<2>().set(m_kbdc, FUNC(kbdc8042_device::write_out2)); MACHINE_CONFIG_END diff --git a/src/mame/machine/ioc2.h b/src/mame/machine/ioc2.h index 8148253378a..f4f2531f010 100644 --- a/src/mame/machine/ioc2.h +++ b/src/mame/machine/ioc2.h @@ -185,8 +185,8 @@ class ioc2_guinness_device : public ioc2_device { public: template <typename T> - ioc2_guinness_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, T &&cpu_tag) - : ioc2_guinness_device(mconfig, tag, owner, clock) + ioc2_guinness_device(const machine_config &mconfig, const char *tag, device_t *owner, T &&cpu_tag) + : ioc2_guinness_device(mconfig, tag, owner, (uint32_t)0) { set_cpu_tag(std::forward<T>(cpu_tag)); } @@ -201,8 +201,8 @@ class ioc2_full_house_device : public ioc2_device { public: template <typename T> - ioc2_full_house_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, T &&cpu_tag) - : ioc2_full_house_device(mconfig, tag, owner, clock) + ioc2_full_house_device(const machine_config &mconfig, const char *tag, device_t *owner, T &&cpu_tag) + : ioc2_full_house_device(mconfig, tag, owner, (uint32_t)0) { set_cpu_tag(std::forward<T>(cpu_tag)); } diff --git a/src/mame/machine/kc.cpp b/src/mame/machine/kc.cpp index dd037fe75ec..60b119e9524 100644 --- a/src/mame/machine/kc.cpp +++ b/src/mame/machine/kc.cpp @@ -384,7 +384,7 @@ void kc_state::update_0x08000() /* IRM enabled */ LOG(("IRM enabled\n")); - membank("bank3")->set_base(m_video_ram); + membank("bank3")->set_base(&m_video_ram[0]); space.install_readwrite_bank(0x8000, 0xbfff, "bank3"); } else @@ -485,12 +485,12 @@ void kc85_4_state::update_0x08000() /* IRM enabled - has priority over RAM8 enabled */ LOG(("IRM enabled\n")); - uint8_t* ram_page = m_video_ram + ((BIT(m_port_84_data, 2)<<15) | (BIT(m_port_84_data, 1)<<14)); + uint8_t* ram_page = &m_video_ram[(BIT(m_port_84_data, 2)<<15) | (BIT(m_port_84_data, 1)<<14)]; membank("bank3")->set_base(ram_page); space.install_readwrite_bank(0x8000, 0xa7ff, "bank3"); - membank("bank6")->set_base(m_video_ram + 0x2800); + membank("bank6")->set_base(&m_video_ram[0x2800]); space.install_readwrite_bank(0xa800, 0xbfff, "bank6"); } else if (m_pio_data[1] & (1<<5)) diff --git a/src/mame/machine/lisa.cpp b/src/mame/machine/lisa.cpp index e71bfd91f7c..2ef7fe045fc 100644 --- a/src/mame/machine/lisa.cpp +++ b/src/mame/machine/lisa.cpp @@ -389,7 +389,6 @@ TIMER_CALLBACK_MEMBER(lisa_state::handle_mouse) TIMER_CALLBACK_MEMBER(lisa_state::read_COPS_command) { int command; - address_space &space = m_maincpu->space(AS_PROGRAM); m_COPS_Ready = 0; m_via0->write_pb6(m_COPS_Ready); @@ -398,7 +397,7 @@ TIMER_CALLBACK_MEMBER(lisa_state::read_COPS_command) COPS_send_data_if_possible(); /* some pull-ups allow the COPS to read 1s when the VIA port is not set as output */ - command = (m_COPS_command | (~ m_via0->read(space, via6522_device::VIA_DDRA))) & 0xff; + command = (m_COPS_command | (~ m_via0->read(via6522_device::VIA_DDRA))) & 0xff; // printf("Dropping Ready, command = %02x\n", command); @@ -675,7 +674,7 @@ WRITE_LINE_MEMBER(lisa_state::COPS_via_out_ca2) WRITE8_MEMBER(lisa_state::COPS_via_out_b) { /* pull-up */ - data |= (~ m_via0->read(space, via6522_device::VIA_DDRA)) & 0x01; + data |= (~ m_via0->read(via6522_device::VIA_DDRA)) & 0x01; if (data & 0x01) { @@ -1721,13 +1720,13 @@ READ16_MEMBER(lisa_state::lisa_IO_r) case 2: /* parallel port */ /* 1 VIA located at 0xD901 */ if (ACCESSING_BITS_0_7) - answer = m_via1->read(space, (offset >> 2) & 0xf); + answer = m_via1->read((offset >> 2) & 0xf); break; case 3: /* keyboard/mouse cops via */ /* 1 VIA located at 0xDD81 */ if (ACCESSING_BITS_0_7) - answer = m_via0->read(space, offset & 0xf); + answer = m_via0->read(offset & 0xf); break; } } @@ -1844,12 +1843,12 @@ WRITE16_MEMBER(lisa_state::lisa_IO_w) case 2: /* paralel port */ if (ACCESSING_BITS_0_7) - m_via1->write(space, (offset >> 2) & 0xf, data & 0xff); + m_via1->write((offset >> 2) & 0xf, data & 0xff); break; case 3: /* keyboard/mouse cops via */ if (ACCESSING_BITS_0_7) - m_via0->write(space, offset & 0xf, data & 0xff); + m_via0->write(offset & 0xf, data & 0xff); break; } } diff --git a/src/mame/machine/mac.cpp b/src/mame/machine/mac.cpp index b6b93a1cdc4..b32134fe22a 100644 --- a/src/mame/machine/mac.cpp +++ b/src/mame/machine/mac.cpp @@ -99,6 +99,9 @@ #define INTS_RBV ((m_model >= MODEL_MAC_IICI) && (m_model <= MODEL_MAC_IIVI)) || ((m_model >= MODEL_MAC_LC) && (m_model <= MODEL_MAC_LC_580)) +#define MAC_MAIN_SND_BUF_OFFSET 0x0300 +#define MAC_ALT_SND_BUF_OFFSET 0x5F00 + #ifdef MAME_DEBUG #define LOG_ADB 0 #define LOG_VIA 0 @@ -1652,7 +1655,7 @@ READ16_MEMBER ( mac_state::mac_via_r ) if (LOG_VIA) logerror("mac_via_r: offset=0x%02x\n", offset); - data = m_via1->read(space, offset); + data = m_via1->read(offset); m_maincpu->adjust_icount(m_via_cycles); @@ -1668,9 +1671,9 @@ WRITE16_MEMBER ( mac_state::mac_via_w ) logerror("mac_via_w: offset=0x%02x data=0x%08x\n", offset, data); if (ACCESSING_BITS_0_7) - m_via1->write(space, offset, data & 0xff); + m_via1->write(offset, data & 0xff); if (ACCESSING_BITS_8_15) - m_via1->write(space, offset, (data >> 8) & 0xff); + m_via1->write(offset, (data >> 8) & 0xff); m_maincpu->adjust_icount(m_via_cycles); } @@ -1691,7 +1694,7 @@ READ16_MEMBER ( mac_state::mac_via2_r ) offset >>= 8; offset &= 0x0f; - data = m_via2->read(space, offset); + data = m_via2->read(offset); if (LOG_VIA) logerror("mac_via2_r: offset=0x%02x = %02x (PC=%x)\n", offset*2, data, m_maincpu->pc()); @@ -1708,9 +1711,9 @@ WRITE16_MEMBER ( mac_state::mac_via2_w ) logerror("mac_via2_w: offset=%x data=0x%08x mask=%x (PC=%x)\n", offset, data, mem_mask, m_maincpu->pc()); if (ACCESSING_BITS_0_7) - m_via2->write(space, offset, data & 0xff); + m_via2->write(offset, data & 0xff); if (ACCESSING_BITS_8_15) - m_via2->write(space, offset, (data >> 8) & 0xff); + m_via2->write(offset, (data >> 8) & 0xff); } @@ -2354,7 +2357,23 @@ TIMER_CALLBACK_MEMBER(mac_state::mac_scanline_tick) mouse_callback(); } - m_scanline_timer->adjust(m_screen->time_until_pos((scanline+1) % MAC_V_TOTAL, 0)); + if (m_dac) + { + uint16_t *snd_buf_ptr; + if (m_main_buffer) + { + snd_buf_ptr = (uint16_t *)(m_ram->pointer() + m_ram->size() - MAC_MAIN_SND_BUF_OFFSET); + } + else + { + snd_buf_ptr = (uint16_t *)(m_ram->pointer() + m_ram->size() - MAC_ALT_SND_BUF_OFFSET); + } + + m_dac->write(snd_buf_ptr[scanline] >> 8); + } + + int next_scanline = (scanline+1) % MAC_V_TOTAL; + m_scanline_timer->adjust(m_screen->time_until_pos(next_scanline), next_scanline); } WRITE_LINE_MEMBER(mac_state::nubus_irq_9_w) diff --git a/src/mame/machine/mackbd.h b/src/mame/machine/mackbd.h index 4fba653cfc4..f91d6a14d00 100644 --- a/src/mame/machine/mackbd.h +++ b/src/mame/machine/mackbd.h @@ -38,6 +38,8 @@ public: // config helper template <class Object> devcb_base &set_clkout_handler(Object &&cb) { return m_clkout_handler.set_callback(std::forward<Object>(cb)); } template <class Object> devcb_base &set_dataout_handler(Object &&cb) { return m_dataout_handler.set_callback(std::forward<Object>(cb)); } + auto clkout_handler() { return m_clkout_handler.bind(); } + auto dataout_handler() { return m_dataout_handler.bind(); } // construction/destruction mackbd_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); diff --git a/src/mame/machine/macpci.cpp b/src/mame/machine/macpci.cpp index 6dee5451071..08655f03dc0 100644 --- a/src/mame/machine/macpci.cpp +++ b/src/mame/machine/macpci.cpp @@ -72,7 +72,7 @@ READ16_MEMBER ( macpci_state::mac_via_r ) if (LOG_VIA) printf("mac_via_r: offset=0x%02x (PC=%x)\n", offset, m_maincpu->pc()); - data = m_via1->read(space, offset); + data = m_via1->read(offset); m_maincpu->adjust_icount(m_via_cycles); @@ -88,9 +88,9 @@ WRITE16_MEMBER ( macpci_state::mac_via_w ) printf("mac_via_w: offset=0x%02x data=0x%08x (PC=%x)\n", offset, data, m_maincpu->pc()); if (ACCESSING_BITS_0_7) - m_via1->write(space, offset, data & 0xff); + m_via1->write(offset, data & 0xff); if (ACCESSING_BITS_8_15) - m_via1->write(space, offset, (data >> 8) & 0xff); + m_via1->write(offset, (data >> 8) & 0xff); m_maincpu->adjust_icount(m_via_cycles); } diff --git a/src/mame/machine/mega32x.cpp b/src/mame/machine/mega32x.cpp index 23d18de3ce4..5407ac939ba 100644 --- a/src/mame/machine/mega32x.cpp +++ b/src/mame/machine/mega32x.cpp @@ -211,7 +211,6 @@ GFX check (these don't explicitly fails): #define MAX_HPOSITION 480 /* need to make some pwm stuff part of device */ #define PWM_FIFO_SIZE m_pwm_tm_reg // guess, Marsch calls this register as FIFO width -#define PWM_CLOCK m_32x_pal ? ((MASTER_CLOCK_PAL*3) / 7) : ((MASTER_CLOCK_NTSC*3) / 7) @@ -221,9 +220,6 @@ GFX check (these don't explicitly fails): #define SH2_CINT_IRQ_LEVEL 8 #define SH2_PINT_IRQ_LEVEL 6 -#define MASTER_CLOCK_NTSC 53693175 -#define MASTER_CLOCK_PAL 53203424 - DEFINE_DEVICE_TYPE(SEGA_32X_NTSC, sega_32x_ntsc_device, "sega_32x_ntsc", "Sega 32X (NTSC)") DEFINE_DEVICE_TYPE(SEGA_32X_PAL, sega_32x_pal_device, "sega_32x_pal", "Sega 32X (PAL)") @@ -824,7 +820,7 @@ void sega_32x_device::calculate_pwm_timer() m_lch_fifo_state = m_rch_fifo_state = 0x4000; m_lch_index_r = m_rch_index_r = 0; m_lch_index_w = m_rch_index_w = 0; - m_32x_pwm_timer->adjust(attotime::from_hz((PWM_CLOCK) / (m_pwm_cycle - 1))); + m_32x_pwm_timer->adjust(attotime::from_hz(clock() / (m_pwm_cycle - 1))); } } @@ -870,7 +866,7 @@ TIMER_CALLBACK_MEMBER(sega_32x_device::handle_pwm_callback) if(sh2_slave_pwmint_enable) { m_slave_cpu->set_input_line(SH2_PINT_IRQ_LEVEL,ASSERT_LINE); } } - m_32x_pwm_timer->adjust(attotime::from_hz((PWM_CLOCK) / (m_pwm_cycle - 1))); + m_32x_pwm_timer->adjust(attotime::from_hz(clock() / (m_pwm_cycle - 1))); } READ16_MEMBER( sega_32x_device::_32x_pwm_r ) @@ -1768,19 +1764,19 @@ const rom_entry *sega_32x_device::device_rom_region() const MACHINE_CONFIG_START(sega_32x_ntsc_device::device_add_mconfig) #ifndef _32X_SWAP_MASTER_SLAVE_HACK - MCFG_DEVICE_ADD("32x_master_sh2", SH2, (MASTER_CLOCK_NTSC*3)/7 ) + MCFG_DEVICE_ADD("32x_master_sh2", SH2, DERIVED_CLOCK(1, 1) ) MCFG_DEVICE_PROGRAM_MAP(sh2_main_map) MCFG_SH2_IS_SLAVE(0) MCFG_SH2_FIFO_DATA_AVAIL_CB(sega_32x_device, _32x_fifo_available_callback) #endif - MCFG_DEVICE_ADD("32x_slave_sh2", SH2, (MASTER_CLOCK_NTSC*3)/7 ) + MCFG_DEVICE_ADD("32x_slave_sh2", SH2, DERIVED_CLOCK(1, 1) ) MCFG_DEVICE_PROGRAM_MAP(sh2_slave_map) MCFG_SH2_IS_SLAVE(1) MCFG_SH2_FIFO_DATA_AVAIL_CB(sega_32x_device, _32x_fifo_available_callback) #ifdef _32X_SWAP_MASTER_SLAVE_HACK - MCFG_DEVICE_ADD("32x_master_sh2", SH2, (MASTER_CLOCK_NTSC*3)/7 ) + MCFG_DEVICE_ADD("32x_master_sh2", SH2, DERIVED_CLOCK(1, 1) ) MCFG_DEVICE_PROGRAM_MAP(sh2_main_map) MCFG_SH2_IS_SLAVE(0) MCFG_SH2_FIFO_DATA_AVAIL_CB(sega_32x_device, _32x_fifo_available_callback) @@ -1798,19 +1794,19 @@ MACHINE_CONFIG_END MACHINE_CONFIG_START(sega_32x_pal_device::device_add_mconfig) #ifndef _32X_SWAP_MASTER_SLAVE_HACK - MCFG_DEVICE_ADD("32x_master_sh2", SH2, (MASTER_CLOCK_PAL*3)/7 ) + MCFG_DEVICE_ADD("32x_master_sh2", SH2, DERIVED_CLOCK(1, 1) ) MCFG_DEVICE_PROGRAM_MAP(sh2_main_map) MCFG_SH2_IS_SLAVE(0) MCFG_SH2_FIFO_DATA_AVAIL_CB(sega_32x_device, _32x_fifo_available_callback) #endif - MCFG_DEVICE_ADD("32x_slave_sh2", SH2, (MASTER_CLOCK_PAL*3)/7 ) + MCFG_DEVICE_ADD("32x_slave_sh2", SH2, DERIVED_CLOCK(1, 1) ) MCFG_DEVICE_PROGRAM_MAP(sh2_slave_map) MCFG_SH2_IS_SLAVE(1) MCFG_SH2_FIFO_DATA_AVAIL_CB(sega_32x_device, _32x_fifo_available_callback) #ifdef _32X_SWAP_MASTER_SLAVE_HACK - MCFG_DEVICE_ADD("32x_master_sh2", SH2, (MASTER_CLOCK_PAL*3)/7 ) + MCFG_DEVICE_ADD("32x_master_sh2", SH2, DERIVED_CLOCK(1, 1) ) MCFG_DEVICE_PROGRAM_MAP(sh2_main_map) MCFG_SH2_IS_SLAVE(0) MCFG_SH2_FIFO_DATA_AVAIL_CB(sega_32x_device, _32x_fifo_available_callback) @@ -1829,7 +1825,6 @@ MACHINE_CONFIG_END void sega_32x_device::device_start() { m_32x_pwm_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(sega_32x_device::handle_pwm_callback), this)); - m_32x_pwm_timer->adjust(attotime::never); m_32x_dram0 = std::make_unique<uint16_t[]>(0x40000/2); m_32x_dram1 = std::make_unique<uint16_t[]>(0x40000/2); @@ -1884,8 +1879,9 @@ void sega_32x_device::device_reset() m_32x_fb_swap = 0; m_pwm_tm_reg = 0; - m_pwm_cycle = 0; + m_pwm_cycle = m_pwm_cycle_reg = 0; m_pwm_ctrl = 0; + calculate_pwm_timer(); m_lch_index_w = 0; m_rch_index_w = 0; diff --git a/src/mame/machine/microtan.cpp b/src/mame/machine/microtan.cpp index 6459654ee80..6847d2dc347 100644 --- a/src/mame/machine/microtan.cpp +++ b/src/mame/machine/microtan.cpp @@ -751,11 +751,11 @@ void microtan_state::snapshot_copy(uint8_t *snapshot_buff, int snapshot_size) /* first set of VIA6522 registers */ for (int i = 0; i < 16; i++ ) - m_via6522[0]->write(space, i, snapshot_buff[base++]); + m_via6522[0]->write(i, snapshot_buff[base++]); /* second set of VIA6522 registers */ for (int i = 0; i < 16; i++ ) - m_via6522[1]->write(space, i, snapshot_buff[base++]); + m_via6522[1]->write(i, snapshot_buff[base++]); /* microtan IO bff0-bfff */ for (int i = 0; i < 16; i++ ) diff --git a/src/mame/machine/pce.cpp b/src/mame/machine/pce.cpp index f68d185e81f..5550ab5d2e7 100644 --- a/src/mame/machine/pce.cpp +++ b/src/mame/machine/pce.cpp @@ -136,8 +136,6 @@ WRITE8_MEMBER(pce_state::mess_pce_joystick_w) int joy_i; uint8_t joy_type = m_joy_type->read(); - m_maincpu->io_set_buffer(data); - /* bump counter on a low-to-high transition of bit 1 */ if ((!m_joystick_data_select) && (data & JOY_CLOCK)) { diff --git a/src/mame/machine/pcecommn.cpp b/src/mame/machine/pcecommn.cpp index d24ef961712..4ef9a1150c7 100644 --- a/src/mame/machine/pcecommn.cpp +++ b/src/mame/machine/pcecommn.cpp @@ -20,7 +20,6 @@ /* todo: how many input ports does the PCE have? */ WRITE8_MEMBER(pce_common_state::pce_joystick_w) { - m_maincpu->io_set_buffer(data); /* bump counter on a low-to-high transition of bit 1 */ if((!m_joystick_data_select) && (data & JOY_CLOCK)) { diff --git a/src/mame/machine/seibucop/seibucop.cpp b/src/mame/machine/seibucop/seibucop.cpp index 229eda863a8..d45698b4f97 100644 --- a/src/mame/machine/seibucop/seibucop.cpp +++ b/src/mame/machine/seibucop/seibucop.cpp @@ -1310,7 +1310,7 @@ WRITE16_MEMBER( raiden2cop_device::cop_unk_param_b_w) COMBINE_DATA(&m_cop_unk_param_b); } -// cupsoc always writes 0xF before commands 0x5105, 0x5905, 0xD104 and 0xF105 and 0xE before 0xD104, then resets this to zero +// cupsoc always writes 0xF before commands 0x5105, 0x5905, 0xD104 and 0xF105 and 0xE before 0xDDE5, then resets this to zero // zeroteam writes 0xE here before 0xEDE5, then resets it to zero WRITE16_MEMBER( raiden2cop_device::cop_precmd_w) { diff --git a/src/mame/machine/sgi.h b/src/mame/machine/sgi.h index 428d68ef499..c47fc0c6879 100644 --- a/src/mame/machine/sgi.h +++ b/src/mame/machine/sgi.h @@ -16,6 +16,11 @@ class sgi_mc_device : public device_t { public: + sgi_mc_device(const machine_config &mconfig, const char *tag, device_t *owner) + : sgi_mc_device(mconfig, tag, owner, (uint32_t)0) + { + } + sgi_mc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); DECLARE_READ32_MEMBER(read); diff --git a/src/mame/machine/swim.h b/src/mame/machine/swim.h index 93d326c32b4..ffef9637be8 100644 --- a/src/mame/machine/swim.h +++ b/src/mame/machine/swim.h @@ -24,6 +24,12 @@ DECLARE_DEVICE_TYPE(SWIM, swim_device) class swim_device : public applefdc_base_device { public: + swim_device(const machine_config &mconfig, const char *tag, device_t *owner, const applefdc_interface *intrf) + : swim_device(mconfig, tag, owner, (uint32_t)0) + { + set_config(intrf); + } + swim_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); // read/write diff --git a/src/mame/machine/thomflop.cpp b/src/mame/machine/thomflop.cpp index 75d3c6d7164..5777fa010c8 100644 --- a/src/mame/machine/thomflop.cpp +++ b/src/mame/machine/thomflop.cpp @@ -1628,7 +1628,7 @@ TIMER_CALLBACK_MEMBER( thomson_state::ans ) */ -MC6854_OUT_FRAME_CB(thomson_state::to7_network_got_frame) +void thomson_state::to7_network_got_frame(uint8_t *data, int length) { LOG(( "%f to7_network_got_frame:", machine().time().as_double() )); for ( int i = 0; i < length; i++ ) diff --git a/src/mame/machine/trs80m3.cpp b/src/mame/machine/trs80m3.cpp index 0fdd073f562..ed36714357b 100644 --- a/src/mame/machine/trs80m3.cpp +++ b/src/mame/machine/trs80m3.cpp @@ -163,11 +163,11 @@ READ8_MEMBER( trs80m3_state::cp500_port_f4_r ) WRITE8_MEMBER( trs80m3_state::port_84_w ) // Model 4 & 4P only { -/* Hi-res graphics control - d6..d4 not emulated - d7 Page Control - d6 Fix upper memory - d5 Memory bit 1 - d4 Memory bit 0 +/* Memory banking control, video mode control + d7 Video Page Control + d6 Despage (see p129 of service manual) + d5 Enable page mapping (1=enabled) + d4 Srcpage (see p129 of service manual) d3 Invert Video d2 80/64 width d1 Select bit 1 @@ -196,12 +196,9 @@ WRITE8_MEMBER( trs80m3_state::port_84_w ) // Model 4 & 4P only if (BIT(m_model4, 2)) // Model 4P { - if (m_mainram->size() >= (64 * 1024)) - { - m_32kbanks[0]->set_entry((data >> 4) & 0x07); - m_32kbanks[1]->set_entry((data >> 4) & 0x07); - m_16kbank->set_entry((data >> 4) & 0x07); - } + m_32kbanks[0]->set_entry((data >> 4) & 0x07); + m_32kbanks[1]->set_entry((data >> 4) & 0x07); + m_16kbank->set_entry((data >> 4) & 0x07); m_vidbank->set_entry(BIT(data, 7)); switch (data & 3) @@ -376,8 +373,20 @@ WRITE8_MEMBER( trs80m3_state::port_ec_w ) d0 1=select drive 0 */ WRITE8_MEMBER( trs80m3_state::port_f4_w ) { - m_maincpu->set_input_line(Z80_INPUT_LINE_WAIT, BIT(data, 6) ? ASSERT_LINE : CLEAR_LINE); - m_wait = BIT(data, 6); + if (BIT(data ,6)) + { + + if (m_drq_off && m_intrq_off) + { + m_maincpu->set_input_line(Z80_INPUT_LINE_WAIT, ASSERT_LINE); + m_wait = true; + } + } + else + { + m_maincpu->set_input_line(Z80_INPUT_LINE_WAIT, CLEAR_LINE); + m_wait = false; + } m_floppy = nullptr; @@ -433,21 +442,23 @@ INTERRUPT_GEN_MEMBER(trs80m3_state::rtc_interrupt) m_floppy->mon_w(1); // motor off } // Also, if cpu is in wait, unlock it and trigger NMI - if (m_wait) - { - m_wait = false; - m_maincpu->set_input_line(Z80_INPUT_LINE_WAIT, CLEAR_LINE); - if (BIT(m_nmi_mask, 6)) - { - m_nmi_data |= 0x40; - m_maincpu->set_input_line(INPUT_LINE_NMI, HOLD_LINE); - } - } + // Don't, it breaks disk loading +// if (m_wait) +// { +// m_wait = false; +// m_maincpu->set_input_line(Z80_INPUT_LINE_WAIT, CLEAR_LINE); +// if (BIT(m_nmi_mask, 6)) +// { +// m_nmi_data |= 0x40; +// m_maincpu->set_input_line(INPUT_LINE_NMI, HOLD_LINE); +// } +// } } // The floppy sector has been read. Enable CPU and NMI. WRITE_LINE_MEMBER(trs80m3_state::intrq_w) { + m_intrq_off = state ? false : true; if (state) { m_maincpu->set_input_line(Z80_INPUT_LINE_WAIT, CLEAR_LINE); @@ -464,6 +475,7 @@ WRITE_LINE_MEMBER(trs80m3_state::intrq_w) // The next byte from floppy is available. Enable CPU so it can get the byte. WRITE_LINE_MEMBER(trs80m3_state::drq_w) { + m_drq_off = state ? false : true; if (state) { m_maincpu->set_input_line(Z80_INPUT_LINE_WAIT, CLEAR_LINE); @@ -575,6 +587,8 @@ void trs80m3_state::machine_reset() m_a11_flipflop = 0; // for cp500 m_cassette_data = 0; m_size_store = 0xff; + m_drq_off = true; + m_intrq_off = true; address_space &mem = m_maincpu->space(AS_PROGRAM); if (m_model4 & 4) diff --git a/src/mame/machine/victor9k_fdc.cpp b/src/mame/machine/victor9k_fdc.cpp index 46b531f6f06..626b034928c 100644 --- a/src/mame/machine/victor9k_fdc.cpp +++ b/src/mame/machine/victor9k_fdc.cpp @@ -112,9 +112,14 @@ const tiny_rom_entry *victor_9000_fdc_device::device_rom_region() const } -//------------------------------------------------- -// SLOT_INTERFACE( victor9k_floppies ) -//------------------------------------------------- +void victor_9000_fdc_device::add_floppy_drive(machine_config &config, const char *_tag) +{ + floppy_connector &connector(FLOPPY_CONNECTOR(config, _tag, 0)); + connector.option_add("525ssqd", FLOPPY_525_SSQD); // Tandon TM100-3 with custom electronics + connector.option_add("525qd", FLOPPY_525_QD); // Tandon TM100-4 with custom electronics + connector.set_default_option("525qd"); + connector.set_formats(victor_9000_fdc_device::floppy_formats); +} image_init_result victor_9000_fdc_device::load0_cb(floppy_image_device *device) { @@ -144,12 +149,6 @@ void victor_9000_fdc_device::unload1_cb(floppy_image_device *device) m_via4->write_cb1(1); } -static void victor9k_floppies(device_slot_interface &device) -{ - device.option_add("525ssqd", FLOPPY_525_SSQD); // Tandon TM100-3 with custom electronics - device.option_add("525qd", FLOPPY_525_QD); // Tandon TM100-4 with custom electronics -} - FLOPPY_FORMATS_MEMBER( victor_9000_fdc_device::floppy_formats ) FLOPPY_VICTOR_9000_FORMAT FLOPPY_FORMATS_END @@ -159,41 +158,42 @@ FLOPPY_FORMATS_END // device_add_mconfig - add device configuration //------------------------------------------------- -MACHINE_CONFIG_START(victor_9000_fdc_device::device_add_mconfig) - MCFG_DEVICE_ADD(I8048_TAG, I8048, XTAL(30'000'000)/6) - MCFG_MCS48_PORT_P1_IN_CB(READ8(*this, victor_9000_fdc_device, floppy_p1_r)) - MCFG_MCS48_PORT_P1_OUT_CB(WRITE8(*this, victor_9000_fdc_device, floppy_p1_w)) - MCFG_MCS48_PORT_P2_IN_CB(READ8(*this, victor_9000_fdc_device, floppy_p2_r)) - MCFG_MCS48_PORT_P2_OUT_CB(WRITE8(*this, victor_9000_fdc_device, floppy_p2_w)) - MCFG_MCS48_PORT_T0_IN_CB(READLINE(*this, victor_9000_fdc_device, tach0_r)) - MCFG_MCS48_PORT_T1_IN_CB(READLINE(*this, victor_9000_fdc_device, tach1_r)) - MCFG_MCS48_PORT_BUS_OUT_CB(WRITE8(*this, victor_9000_fdc_device, da_w)) - - MCFG_DEVICE_ADD(M6522_4_TAG, VIA6522, XTAL(30'000'000)/30) - MCFG_VIA6522_READPA_HANDLER(READ8(*this, victor_9000_fdc_device, via4_pa_r)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, victor_9000_fdc_device, via4_pa_w)) - MCFG_VIA6522_READPB_HANDLER(READ8(*this, victor_9000_fdc_device, via4_pb_r)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, victor_9000_fdc_device, via4_pb_w)) - MCFG_VIA6522_CA2_HANDLER(WRITELINE(*this, victor_9000_fdc_device, wrsync_w)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, victor_9000_fdc_device, via4_irq_w)) - - MCFG_DEVICE_ADD(M6522_5_TAG, VIA6522, XTAL(30'000'000)/30) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, victor_9000_fdc_device, via5_irq_w)) - MCFG_VIA6522_READPA_HANDLER(READ8(*this, victor_9000_fdc_device, via5_pa_r)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, victor_9000_fdc_device, via5_pb_w)) - - MCFG_DEVICE_ADD(M6522_6_TAG, VIA6522, XTAL(30'000'000)/30) - MCFG_VIA6522_READPA_HANDLER(READ8(*this, victor_9000_fdc_device, via6_pa_r)) - MCFG_VIA6522_READPB_HANDLER(READ8(*this, victor_9000_fdc_device, via6_pb_r)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, victor_9000_fdc_device, via6_pa_w)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, victor_9000_fdc_device, via6_pb_w)) - MCFG_VIA6522_CA2_HANDLER(WRITELINE(*this, victor_9000_fdc_device, drw_w)) - MCFG_VIA6522_CB2_HANDLER(WRITELINE(*this, victor_9000_fdc_device, erase_w)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, victor_9000_fdc_device, via6_irq_w)) - - MCFG_FLOPPY_DRIVE_ADD(I8048_TAG":0", victor9k_floppies, "525qd", victor_9000_fdc_device::floppy_formats) - MCFG_FLOPPY_DRIVE_ADD(I8048_TAG":1", victor9k_floppies, "525qd", victor_9000_fdc_device::floppy_formats) -MACHINE_CONFIG_END +void victor_9000_fdc_device::device_add_mconfig(machine_config &config) +{ + I8048(config, m_maincpu, XTAL(30'000'000)/6); + m_maincpu->p1_in_cb().set(FUNC(victor_9000_fdc_device::floppy_p1_r)); + m_maincpu->p1_out_cb().set(FUNC(victor_9000_fdc_device::floppy_p1_w)); + m_maincpu->p2_in_cb().set(FUNC(victor_9000_fdc_device::floppy_p2_r)); + m_maincpu->p2_out_cb().set(FUNC(victor_9000_fdc_device::floppy_p2_w)); + m_maincpu->t0_in_cb().set(FUNC(victor_9000_fdc_device::tach0_r)); + m_maincpu->t1_in_cb().set(FUNC(victor_9000_fdc_device::tach1_r)); + m_maincpu->bus_out_cb().set(FUNC(victor_9000_fdc_device::da_w)); + + VIA6522(config, m_via4, XTAL(30'000'000)/30); + m_via4->readpa_handler().set(FUNC(victor_9000_fdc_device::via4_pa_r)); + m_via4->writepa_handler().set(FUNC(victor_9000_fdc_device::via4_pa_w)); + m_via4->readpb_handler().set(FUNC(victor_9000_fdc_device::via4_pb_r)); + m_via4->writepb_handler().set(FUNC(victor_9000_fdc_device::via4_pb_w)); + m_via4->ca2_handler().set(FUNC(victor_9000_fdc_device::wrsync_w)); + m_via4->irq_handler().set(FUNC(victor_9000_fdc_device::via4_irq_w)); + + VIA6522(config, m_via5, XTAL(30'000'000)/30); + m_via5->irq_handler().set(FUNC(victor_9000_fdc_device::via5_irq_w)); + m_via5->readpa_handler().set(FUNC(victor_9000_fdc_device::via5_pa_r)); + m_via5->writepb_handler().set(FUNC(victor_9000_fdc_device::via5_pb_w)); + + VIA6522(config, m_via6, XTAL(30'000'000)/30); + m_via6->readpa_handler().set(FUNC(victor_9000_fdc_device::via6_pa_r)); + m_via6->readpb_handler().set(FUNC(victor_9000_fdc_device::via6_pb_r)); + m_via6->writepa_handler().set(FUNC(victor_9000_fdc_device::via6_pa_w)); + m_via6->writepb_handler().set(FUNC(victor_9000_fdc_device::via6_pb_w)); + m_via6->ca2_handler().set(FUNC(victor_9000_fdc_device::drw_w)); + m_via6->cb2_handler().set(FUNC(victor_9000_fdc_device::erase_w)); + m_via6->irq_handler().set(FUNC(victor_9000_fdc_device::via6_irq_w)); + + add_floppy_drive(config, I8048_TAG":0"); + add_floppy_drive(config, I8048_TAG":1"); +} //************************************************************************** @@ -1059,9 +1059,9 @@ READ8_MEMBER( victor_9000_fdc_device::cs7_r ) { m_lbrdy_cb(1); - if (LOG_VIA) logerror("%s %s LBRDY 1 : %02x\n", machine().time().as_string(), machine().describe_context(), m_via5->read(space, offset)); + if (LOG_VIA) logerror("%s %s LBRDY 1 : %02x\n", machine().time().as_string(), machine().describe_context(), m_via5->read(offset)); - return m_via5->read(space, offset); + return m_via5->read(offset); } WRITE8_MEMBER( victor_9000_fdc_device::cs7_w ) @@ -1070,7 +1070,7 @@ WRITE8_MEMBER( victor_9000_fdc_device::cs7_w ) if (LOG_VIA) logerror("%s %s LBRDY 1\n", machine().time().as_string(), machine().describe_context()); - m_via5->write(space, offset, data); + m_via5->write(offset, data); } floppy_image_device* victor_9000_fdc_device::get_floppy() diff --git a/src/mame/machine/victor9k_fdc.h b/src/mame/machine/victor9k_fdc.h index a7c39c6e7b5..a82f119b368 100644 --- a/src/mame/machine/victor9k_fdc.h +++ b/src/mame/machine/victor9k_fdc.h @@ -35,10 +35,10 @@ public: auto syn_wr_callback() { return m_syn_cb.bind(); } auto lbrdy_wr_callback() { return m_lbrdy_cb.bind(); } - DECLARE_READ8_MEMBER( cs5_r ) { return m_via4->read(space, offset); } - DECLARE_WRITE8_MEMBER( cs5_w ) { m_via4->write(space, offset, data); } - DECLARE_READ8_MEMBER( cs6_r ) { return m_via6->read(space, offset); } - DECLARE_WRITE8_MEMBER( cs6_w ) { m_via6->write(space, offset, data); } + DECLARE_READ8_MEMBER( cs5_r ) { return m_via4->read(offset); } + DECLARE_WRITE8_MEMBER( cs5_w ) { m_via4->write(offset, data); } + DECLARE_READ8_MEMBER( cs6_r ) { return m_via6->read(offset); } + DECLARE_WRITE8_MEMBER( cs6_w ) { m_via6->write(offset, data); } DECLARE_READ8_MEMBER( cs7_r ); DECLARE_WRITE8_MEMBER( cs7_w ); @@ -55,6 +55,8 @@ protected: private: static const int rpm[0x100]; + void add_floppy_drive(machine_config &config, const char *_tag); + enum { TM_GEN, @@ -110,7 +112,7 @@ private: devcb_write_line m_syn_cb; devcb_write_line m_lbrdy_cb; - required_device<cpu_device> m_maincpu; + required_device<i8048_device> m_maincpu; required_device<via6522_device> m_via4; required_device<via6522_device> m_via5; required_device<via6522_device> m_via6; diff --git a/src/mame/machine/victor9k_kb.h b/src/mame/machine/victor9k_kb.h index 683100506c9..78e3a6b2095 100644 --- a/src/mame/machine/victor9k_kb.h +++ b/src/mame/machine/victor9k_kb.h @@ -17,17 +17,6 @@ //************************************************************************** -// INTERFACE CONFIGURATION MACROS -//************************************************************************** - -#define MCFG_VICTOR9K_KBRDY_HANDLER(_devcb) \ - downcast<victor_9000_keyboard_device &>(*device).set_kbrdy_cb(DEVCB_##_devcb); - -#define MCFG_VICTOR9K_KBDATA_HANDLER(_devcb) \ - downcast<victor_9000_keyboard_device &>(*device).set_kbdata_cb(DEVCB_##_devcb); - - -//************************************************************************** // TYPE DEFINITIONS //************************************************************************** @@ -39,8 +28,8 @@ public: // construction/destruction victor_9000_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - template <class Object> devcb_base &set_kbrdy_cb(Object &&cb) { return m_kbrdy_cb.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_kbdata_cb(Object &&cb) { return m_kbdata_cb.set_callback(std::forward<Object>(cb)); } + auto kbrdy_handler() { return m_kbrdy_cb.bind(); } + auto kbdata_handler() { return m_kbdata_cb.bind(); } DECLARE_WRITE_LINE_MEMBER( kback_w ); @@ -77,6 +66,4 @@ private: // device type definition DECLARE_DEVICE_TYPE(VICTOR9K_KEYBOARD, victor_9000_keyboard_device) - - #endif // MAME_MACHINE_VICTOR9K_KB_H diff --git a/src/mame/machine/vt100_kbd.cpp b/src/mame/machine/vt100_kbd.cpp index c7cdd6d5141..b1c22f2845a 100644 --- a/src/mame/machine/vt100_kbd.cpp +++ b/src/mame/machine/vt100_kbd.cpp @@ -199,9 +199,9 @@ MACHINE_CONFIG_START(vt100_keyboard_device::device_add_mconfig) MCFG_DEVICE_ADD("uart", AY31015, 0) MCFG_AY31015_WRITE_SO_CB(WRITELINE(*this, vt100_keyboard_device, signal_out_w)) - MCFG_DEVICE_ADD("counter", RIPPLE_COUNTER, 0) // 2x 74LS93 - MCFG_RIPPLE_COUNTER_STAGES(8) - MCFG_RIPPLE_COUNTER_COUNT_OUT_CB(WRITE8(*this, vt100_keyboard_device, key_scan_w)) + RIPPLE_COUNTER(config, m_scan_counter); // 2x 74LS93 + m_scan_counter->set_stages(8); + m_scan_counter->count_out_cb().set(FUNC(vt100_keyboard_device::key_scan_w)); MACHINE_CONFIG_END diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 23183dd9d2a..685b89a400a 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -1292,6 +1292,7 @@ am64 // 1985 ASEM AM 64 (motherboard is marked AM-100 apple2 // Apr 1977 Apple ][ apple2jp // ??? ???? Apple ][j+ apple2p // Jun 1979 Apple ][+ +basis108 // 1982 Germany Basis 108 elppa // 198? Victor do Brasil Elppa II+ ivelultr // Ivasim Ivel Ultra maxxi // 1982 Polymax Maxxi @@ -8890,6 +8891,9 @@ blueprntj // (c) 1982 Jaleco (Zilec in ROM 3U, and the pro grasspin // (c) 1983 Jaleco (Zilec / Ashby programmer names in sound rom) saturnzi // (c) 1983 Jaleco (Zilec in ROM R6, and the programmer names) +@source:blw700i.cpp +blw700i // (c) 1995 Brother + @source:bmcbowl.cpp bmcbowl // (c) 1994 BMC @@ -9576,6 +9580,9 @@ mag_time mag_exzi mag_xain mag_war +mag_wara +mag_burn +mag_day @source:centiped.cpp bullsdrt // (c) 1985 Shinkai @@ -9773,6 +9780,7 @@ wotwc // (c) 1981 @source:circus.cpp circus // no copyright notice [1977?] crash // Exidy [1979?] +crasha // no copyright notice [1979?] ripcord // Exidy [1977?] robotbwl // no copyright notice smash // bootleg @@ -11036,20 +11044,21 @@ tstrikea // Game Room @source:ddragon3.cpp ctribe // TA-0028 (c) 1990 (US) -ctribe1 // TA-0028 (c) 1990 (US) ctribeb // bootleg ctribeb2 // bootleg ctribej // TA-0028 (c) 1990 (Japan) -ctribeo // TA-0028 (c) 1990 (US) +ctribeu1 // TA-0028 (c) 1990 (US) +ctribeua // TA-0028 (c) 1990 (US) ddragon3 // TA-0030 (c) 1990 ddragon3b // bootleg ddragon3j // TA-0030 (c) 1990 (Japan) ddragon3p // TA-0030 (c) 1990 wwfwfest // TA-0031 (c) 1991 + Tecmo license (World) -wwfwfestb // bootleg wwfwfestj // TA-0031 (c) 1991 + Tecmo license (Japan) wwfwfestk // TA-0031 (c) 1991 + Tecmo license (Korea) wwfwfestu // TA-0031 (c) 1991 (US) +wwfwfestu1 // TA-0031 (c) 1991 (US) +wwfwfestub // bootleg @source:ddribble.cpp ddribble // GX690 (c) 1986 @@ -12290,6 +12299,9 @@ elf2 // @source:elwro800.cpp elwro800 // +@source:emate.cpp +emate // (c) 1997 Apple Computer + @source:embargo.cpp embargo // @@ -12902,6 +12914,7 @@ fmtownssj // FM-Towns II SJ fmtownsux // 1991.11 FM-Towns II UX @source:fontwriter.cpp +fw600 // (c) Sharp fw700ger // (c) Sharp @source:foodf.cpp @@ -13112,6 +13125,7 @@ bigkarnk // (c) 1991 - Ref 901112-1 biomtoy // (c) 1995 - Ref 922804/2 - (unprotected) biomtoya // (c) 1995 - Ref 922804/2 - (unprotected) biomtoyb // (c) 1995 - Ref 922804/2 - (unprotected) +biomtoyc // (c) 1994 - Ref 922804/2 - (unprotected) bioplayc // (prototype) maniacsp // (c) 1996 - Ref 922804/2 - (prototype) lastkm // (c) 1995 - Ref 922804/2 @@ -15825,9 +15839,6 @@ jackie // (c) 1993 IGS @source:jackpool.cpp jackpool // (c) 1997 Electronic Projects -@source:jade.cpp -jgz80 // Jade JGZ-80 - @source:jaguar.cpp a51mxr3k // ?? (c) 1998 a51mxr3ka // ?? (c) 1998 @@ -18540,8 +18551,9 @@ magtouch // (c) 1995 @source:mainevt.cpp devstors // GX890 (c) 1988 +devstorsx // GX890 (c) 1988 +devstorsv // GX890 (c) 1988 devstors2 // GX890 (c) 1988 -devstors3 // GX890 (c) 1988 garuka // GX890 (c) 1988 (Japan) mainevt // GX799 (c) 1988 mainevt2p // GX799 (c) 1988 @@ -21130,6 +21142,9 @@ microtan // 1979 Microtan 65 mt420 // mt5510 // +@source:microterm_f8.cpp +act5a // + @source:microvsn.cpp microvsn // Milton Bradley @@ -29210,7 +29225,9 @@ wndrmomo // (c) 1987 nanos // @source:naomi.cpp +18wheelro // 2000.01 18 Wheeler Deluxe 18wheelr // 2000.01 18 Wheeler Deluxe (Rev A) +18wheelrt // 2000.01 18 Wheeler Deluxe (Rev T) 18wheels // 2000.01 18 Wheeler (Standard) 18wheelu // 2000.01 18 Wheeler (Upright) airlbios // 1999.03 Airline Pilots (BIOS) @@ -29242,6 +29259,7 @@ clubkcyc // 2003.?? Club Kart Cycraft Edition (Rev A) clubkprz // 2003.?? Club Kart Prize clubkpzb // 2004.01.23 Club Kart Prize Ver. B (strings in the EPROM indicate a build date of Jan. 23, 2004 for the game's program) clubkrt // 2001.06 Club Kart: European Session (Rev D) +clubkrta // 2001.?? Club Kart: European Session (Rev A) clubkrtc // 2001.?? Club Kart: European Session (Rev C) clubkrto // 2001.06 Club Kart: European Session confmiss // 2000.10.11 Confidential Mission // First GD-ROM game? @@ -29303,6 +29321,7 @@ hmgeo // 2001.06 Heavy Metal Geomatrix (Rev B) hod2bios // 1998.11 The House of the Dead 2 (BIOS) hopper // 2002.?? SWP Hopper Board hotd2 // 1998.11 The House of the Dead 2 (USA) +hotd2e // 1998.11 The House of the Dead 2 (Export) hotd2o // 1998.11 The House of the Dead 2 hotd2p // 1998.11 The House of the Dead 2 (prototype) ikaruga // 2001.12 Ikaruga @@ -29389,7 +29408,8 @@ radirgyn // 2009.06 Radirgy Noa radirgyo // 2005.10 Radirgy rangrmsn // 2004.03 Ranger Mission rhytngk // 2007.09 Rhythm Tengoku -ringout // 1999.06 Ring Out 4x4 +ringouto // 1999.06 Ring Out 4x4 +ringout // 1999.06 Ring Out 4x4 (Rev A) rumblef // 2004.03 The Rumble Fish rumblef2 // 2005.03 The Rumble Fish 2 rumblefp // 2004.02 The Rumble Fish (prototype) @@ -29472,6 +29492,7 @@ virnba // 2000.02 Virtua NBA (USA) virnbao // 2000.02 Virtua NBA virnbap // 2000.02 Virtua NBA (prototype) vonot // 2000.06 Virtual-on Oratorio Tangram M.S.B.S. Ver.5.66 2000 Edition +vs2_2ko // 1999.08 Virtua Striker 2 version 2000 vs2_2k // 1999.08 Virtua Striker 2 version 2000 (Rev C) vstrik3 // 2001.04.06 Virtua Striker 3 Ver. 2002 vstrik3c // 2001.04 Virtua Striker 3 (Rev B) (cartridge) @@ -29504,6 +29525,7 @@ xtrmhnt2 // 2006.09 Extreme Hunting 2 Tournament Edition xtrmhunt // 2004.09 Extreme Hunting zerogu2 // 2001.05 Zero Gunner 2 zombrvn // 1999.03 Zombie Revenge (Rev A) +zombrvne // 1999.03 Zombie Revenge (Export) zombrvno // 1999.02 Zombie Revenge zunou // 2006.07 Touch de Zunou @@ -30186,6 +30208,7 @@ grdnstrmk // (c) 1998 (Korea) grdnstrmv // (c) 1998 Apples Industries license gunnail // (c) 1993 NMK / Tecmo hachamf // (c) 1991 NMK +hachamfa // (c) 1991 NMK hachamfb // bootleg hotbubl // (c) 1998 Pandora (Korea, Nudes) hotbubla // (c) 1998 Pandora (Korea) @@ -35356,6 +35379,7 @@ specpls3 // 1987 ZX Spectrum +3 spectra // @source:spectrum.cpp +bk08 // Orel BK-08 blitzs // 1990 Blic byte // 1990 Byte cip01 // 1987 CIP-01 @@ -35381,6 +35405,7 @@ magic6 // 1993 Magic 6 mistrum // 1988 Mistrum orizon // 199? Orizon-Micro quorum48 // 1993 Kvorum 48K +sintez2 // 1991 Signal Sintez 2 spec80k // 1987 ZX Spectrum 80k specide // 1995 ZX Spectrum IDE spectrum // 1982 ZX Spectrum @@ -36870,6 +36895,23 @@ terak // @source:terco.cpp t4490 // Terco 4490 Mill CNC Control (c) 1986 +@source:terminal.cpp +7951om // +a1010 // +alcat258 // +alcat7100 // +ampex210 // +ec7915 // +facit4440 // +feap90 // +ikt5a // +itt9216 // +loewe715 // +loewed // +t3210 // +teleguide // +vdm79322 // + @source:terracre.cpp amatelas // (c) 1986 amazon // (c) 1986 @@ -37533,6 +37575,7 @@ avalnc25 // 2005.08 The Key Of Avalon 2.5 - War of the Ke avalnc25a // 2005.05 The Key Of Avalon 2.5 - War of the Key (client) (Rev A) fzeroax // 2003.12 F-Zero AX (Rev E) fzeroaxc // 2003.06.11 F-Zero AX (Rev C) +fzeroaxm // 2003.09 F-Zero AX Monster Ride gekpurya // 2003.10 Gekitou Pro Yakyuu Mizushima Shinji All Stars vs. Pro Yakyuu (Rev C) gekpuryb // 2003.10 Gekitou Pro Yakyuu Mizushima Shinji All Stars vs. Pro Yakyuu (Rev B) mkartag2 // 2007.03 Mario Kart Arcade GP 2 (MK21 Ver.A) @@ -37852,6 +37895,9 @@ uts20 // @source:unkhorse.cpp unkhorse // +@source:unkz80.cpp +unkz80 // Unknown + @source:upscope.cpp upscope // (c) 1986 Grand products @@ -39233,6 +39279,7 @@ wy50 // WY-50 wy55 // WY-55 wy60 // WY-60 wy85 // WY-85 +wy120 // WY-120 wy150 // WY-150 wy160 // WY-160 wy30p // WY-30+ @@ -39353,6 +39400,7 @@ xyonix // [1989 Philko] @source:y2.cpp kof2002um // (c)2009 SNK Playmore / New Channel +kof2002umj // (c)2009 SNK Playmore / New Channel @source:yiear.cpp yiear // GX407 (c) 1985 diff --git a/src/mame/mess.flt b/src/mame/mess.flt index f022750873e..e0f90c93756 100644 --- a/src/mame/mess.flt +++ b/src/mame/mess.flt @@ -94,6 +94,7 @@ bigbord2.cpp binbug.cpp bitgraph.cpp bk.cpp +blw700i.cpp bmjr.cpp bml3.cpp bob85.cpp @@ -199,6 +200,7 @@ elekscmp.cpp elektronmono.cpp elf.cpp elwro800.cpp +emate.cpp enmirage.cpp ep64.cpp esprit.cpp @@ -327,7 +329,6 @@ isbc8010.cpp isbc8030.cpp iskr103x.cpp itt3030.cpp -jade.cpp jonos.cpp jr100.cpp jr200.cpp @@ -400,6 +401,7 @@ microkit.cpp micronic.cpp microtan.cpp microterm.cpp +microterm_f8.cpp microvsn.cpp mikro80.cpp mikromik.cpp @@ -693,6 +695,7 @@ tek440x.cpp tekxp33x.cpp terak.cpp terco.cpp +terminal.cpp test_t400.cpp testconsole.cpp tg100.cpp @@ -748,6 +751,7 @@ tvc.cpp tvgame.cpp tx0.cpp uknc.cpp +unkz80.cpp unichamp.cpp unior.cpp unistar.cpp diff --git a/src/mame/video/actfancr.cpp b/src/mame/video/actfancr.cpp index 22cd983b776..22f471ec454 100644 --- a/src/mame/video/actfancr.cpp +++ b/src/mame/video/actfancr.cpp @@ -11,17 +11,23 @@ /******************************************************************************/ -uint32_t actfancr_state::screen_update_actfancr(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +void actfancr_state::video_start() +{ + m_spriteram16 = make_unique_clear<uint16_t[]>(0x800/2); + save_pointer(NAME(m_spriteram16),0x800/2); +} + +uint32_t actfancr_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { /* Draw playfield */ - bool flip = m_tilegen2->get_flip_state(); - m_tilegen1->set_flip_screen(flip); - m_tilegen2->set_flip_screen(flip); + bool flip = m_tilegen[1]->get_flip_state(); + m_tilegen[0]->set_flip_screen(flip); + m_tilegen[1]->set_flip_screen(flip); m_spritegen->set_flip_screen(flip); - m_tilegen1->deco_bac06_pf_draw(bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); - m_spritegen->draw_sprites(bitmap, cliprect, m_spriteram16, 0x00, 0x00, 0x0f); - m_tilegen2->deco_bac06_pf_draw(bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); + m_tilegen[0]->deco_bac06_pf_draw(bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); + m_spritegen->draw_sprites(bitmap, cliprect, m_spriteram16.get(), 0x00, 0x00, 0x0f); + m_tilegen[1]->deco_bac06_pf_draw(bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); return 0; } diff --git a/src/mame/video/agat7.cpp b/src/mame/video/agat7.cpp index da54f00fdde..e165ae96c60 100644 --- a/src/mame/video/agat7.cpp +++ b/src/mame/video/agat7.cpp @@ -168,8 +168,8 @@ void agat7video_device::text_update_lores(screen_device &screen, bitmap_ind16 &b int fg = 0; int bg = 0; - beginrow = std::max(beginrow, cliprect.min_y - (cliprect.min_y % 8)); - endrow = std::min(endrow, cliprect.max_y - (cliprect.max_y % 8) + 7); + beginrow = std::max(beginrow, cliprect.top() - (cliprect.top() % 8)); + endrow = std::min(endrow, cliprect.bottom() - (cliprect.bottom() % 8) + 7); for (row = beginrow; row <= endrow; row += 8) { @@ -198,8 +198,8 @@ void agat7video_device::text_update_hires(screen_device &screen, bitmap_ind16 &b uint8_t ch; int fg, bg; - beginrow = std::max(beginrow, cliprect.min_y - (cliprect.min_y % 8)); - endrow = std::min(endrow, cliprect.max_y - (cliprect.max_y % 8) + 7); + beginrow = std::max(beginrow, cliprect.top() - (cliprect.top() % 8)); + endrow = std::min(endrow, cliprect.bottom() - (cliprect.bottom() % 8) + 7); if (m_start_address & 0x800) { fg = 7; bg = 0; @@ -227,8 +227,8 @@ void agat7video_device::graph_update_mono(screen_device &screen, bitmap_ind16 &b uint8_t gfx, v; int fg = 7, bg = 0; - beginrow = std::max(beginrow, cliprect.min_y - (cliprect.min_y % 8)); - endrow = std::min(endrow, cliprect.max_y - (cliprect.max_y % 8) + 7); + beginrow = std::max(beginrow, cliprect.top() - (cliprect.top() % 8)); + endrow = std::min(endrow, cliprect.bottom() - (cliprect.bottom() % 8) + 7); for (row = beginrow; row <= endrow; row++) { @@ -256,8 +256,8 @@ void agat7video_device::graph_update_hires(screen_device &screen, bitmap_ind16 & uint16_t *p; uint8_t gfx, v; - beginrow = std::max(beginrow, cliprect.min_y - (cliprect.min_y % 8)); - endrow = std::min(endrow, cliprect.max_y - (cliprect.max_y % 8) + 7); + beginrow = std::max(beginrow, cliprect.top() - (cliprect.top() % 8)); + endrow = std::min(endrow, cliprect.bottom() - (cliprect.bottom() % 8) + 7); for (row = beginrow; row <= endrow; row++) { @@ -287,8 +287,8 @@ void agat7video_device::graph_update_lores(screen_device &screen, bitmap_ind16 & uint16_t *p; uint8_t gfx, v; - beginrow = std::max(beginrow, cliprect.min_y - (cliprect.min_y % 8)); - endrow = std::min(endrow, cliprect.max_y - (cliprect.max_y % 8) + 7); + beginrow = std::max(beginrow, cliprect.top() - (cliprect.top() % 8)); + endrow = std::min(endrow, cliprect.bottom() - (cliprect.bottom() % 8) + 7); for (row = beginrow; row <= endrow; row++) { diff --git a/src/mame/video/amiga.cpp b/src/mame/video/amiga.cpp index 83bf7d1dc8f..7409e5d471e 100644 --- a/src/mame/video/amiga.cpp +++ b/src/mame/video/amiga.cpp @@ -817,7 +817,7 @@ void amiga_state::render_scanline(bitmap_ind16 &bitmap, int scanline) /* to render, we must have bitplane DMA enabled, at least 1 plane, and be within the */ /* vertical display window */ if ((CUSTOM_REG(REG_DMACON) & (DMACON_BPLEN | DMACON_DMAEN)) == (DMACON_BPLEN | DMACON_DMAEN) && - planes > 0 && scanline >= m_diw.min_y && scanline < m_diw.max_y) + planes > 0 && scanline >= m_diw.top() && scanline < m_diw.bottom()) { int pfpix0 = 0, pfpix1 = 0, collide; @@ -922,7 +922,7 @@ void amiga_state::render_scanline(bitmap_ind16 &bitmap, int scanline) CUSTOM_REG(REG_CLXDAT) |= 0x001; /* if we are within the display region, render */ - if (dst != nullptr && x >= m_diw.min_x && x < m_diw.max_x) + if (dst != nullptr && x >= m_diw.left() && x < m_diw.right()) { int pix, pri; @@ -1012,7 +1012,7 @@ void amiga_state::render_scanline(bitmap_ind16 &bitmap, int scanline) } // end of the line: time to add the modulos - if (scanline >= m_diw.min_y && scanline < m_diw.max_y) + if (scanline >= m_diw.top() && scanline < m_diw.bottom()) { // update odd planes for (pl = 0; pl < planes; pl += 2) @@ -1054,11 +1054,11 @@ uint32_t amiga_state::screen_update_amiga(screen_device &screen, bitmap_ind16 &b { // sometimes the core tells us to render a bunch of lines to keep up (resolution change, for example) // this causes trouble for us since it can happen at any time - if (cliprect.min_y != cliprect.max_y) + if (cliprect.top() != cliprect.bottom()) return 0; // render each scanline in the visible region - for (int y = cliprect.min_y; y <= cliprect.max_y; y++) + for (int y = cliprect.top(); y <= cliprect.bottom(); y++) render_scanline(bitmap, y); return 0; diff --git a/src/mame/video/amigaaga.cpp b/src/mame/video/amigaaga.cpp index 0cfc1f23c87..987cbdeb4ad 100644 --- a/src/mame/video/amigaaga.cpp +++ b/src/mame/video/amigaaga.cpp @@ -596,7 +596,7 @@ void amiga_state::aga_render_scanline(bitmap_rgb32 &bitmap, int scanline) /* to render, we must have bitplane DMA enabled, at least 1 plane, and be within the */ /* vertical display window */ if ((CUSTOM_REG(REG_DMACON) & (DMACON_BPLEN | DMACON_DMAEN)) == (DMACON_BPLEN | DMACON_DMAEN) && - planes > 0 && scanline >= m_diw.min_y && scanline < m_diw.max_y) + planes > 0 && scanline >= m_diw.top() && scanline < m_diw.bottom()) { int pfpix0 = 0, pfpix1 = 0, collide; @@ -701,7 +701,7 @@ void amiga_state::aga_render_scanline(bitmap_rgb32 &bitmap, int scanline) CUSTOM_REG(REG_CLXDAT) |= 0x001; /* if we are within the display region, render */ - if (dst != nullptr && x >= m_diw.min_x && x < m_diw.max_x) + if (dst != nullptr && x >= m_diw.left() && x < m_diw.right()) { int pix, pri; @@ -814,7 +814,7 @@ void amiga_state::aga_render_scanline(bitmap_rgb32 &bitmap, int scanline) #endif /* end of the line: time to add the modulos */ - if (scanline >= m_diw.min_y && scanline < m_diw.max_y) + if (scanline >= m_diw.top() && scanline < m_diw.bottom()) { /* update odd planes */ for (pl = 0; pl < planes; pl += 2) @@ -853,11 +853,11 @@ void amiga_state::aga_render_scanline(bitmap_rgb32 &bitmap, int scanline) uint32_t amiga_state::screen_update_amiga_aga(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { - if (cliprect.min_y != cliprect.max_y) + if (cliprect.top() != cliprect.bottom()) return 0; // render each scanline in the visible region - for (int y = cliprect.min_y; y <= cliprect.max_y; y++) + for (int y = cliprect.top(); y <= cliprect.bottom(); y++) aga_render_scanline(bitmap, y); return 0; diff --git a/src/mame/video/apple2.cpp b/src/mame/video/apple2.cpp index be61550aa25..31229729742 100644 --- a/src/mame/video/apple2.cpp +++ b/src/mame/video/apple2.cpp @@ -361,8 +361,8 @@ void a2_video_device::lores_update(screen_device &screen, bitmap_ind16 &bitmap, } /* perform adjustments */ - beginrow = std::max(beginrow, cliprect.min_y); - endrow = std::min(endrow, cliprect.max_y); + beginrow = (std::max)(beginrow, cliprect.top()); + endrow = (std::min)(endrow, cliprect.bottom()); if (!(m_sysconfig & 0x03)) { @@ -461,8 +461,8 @@ void a2_video_device::dlores_update(screen_device &screen, bitmap_ind16 &bitmap, } /* perform adjustments */ - beginrow = std::max(beginrow, cliprect.min_y - (cliprect.min_y % 8)); - endrow = std::min(endrow, cliprect.max_y - (cliprect.max_y % 8) + 7); + beginrow = (std::max)(beginrow, cliprect.top() - (cliprect.top() % 8)); + endrow = (std::min)(endrow, cliprect.bottom() - (cliprect.bottom() % 8) + 7); if (!(m_sysconfig & 0x03)) { @@ -607,8 +607,8 @@ void a2_video_device::text_update(screen_device &screen, bitmap_ind16 &bitmap, c start_address = m_page2 ? 0x800 : 0x400; } - beginrow = std::max(beginrow, cliprect.min_y - (cliprect.min_y % 8)); - endrow = std::min(endrow, cliprect.max_y - (cliprect.max_y % 8) + 7); + beginrow = (std::max)(beginrow, cliprect.top() - (cliprect.top() % 8)); + endrow = (std::min)(endrow, cliprect.bottom() - (cliprect.bottom() % 8) + 7); switch (m_sysconfig & 0x03) { @@ -654,8 +654,8 @@ void a2_video_device::text_update_orig(screen_device &screen, bitmap_ind16 &bitm int fg = 0; int bg = 0; - beginrow = std::max(beginrow, cliprect.min_y - (cliprect.min_y % 8)); - endrow = std::min(endrow, cliprect.max_y - (cliprect.max_y % 8) + 7); + beginrow = (std::max)(beginrow, cliprect.top() - (cliprect.top() % 8)); + endrow = (std::min)(endrow, cliprect.bottom() - (cliprect.bottom() % 8) + 7); switch (m_sysconfig & 0x03) { @@ -685,8 +685,8 @@ void a2_video_device::text_update_jplus(screen_device &screen, bitmap_ind16 &bit int fg = 0; int bg = 0; - beginrow = std::max(beginrow, cliprect.min_y - (cliprect.min_y % 8)); - endrow = std::min(endrow, cliprect.max_y - (cliprect.max_y % 8) + 7); + beginrow = (std::max)(beginrow, cliprect.top() - (cliprect.top() % 8)); + endrow = (std::min)(endrow, cliprect.bottom() - (cliprect.bottom() % 8) + 7); switch (m_sysconfig & 0x03) { @@ -716,8 +716,8 @@ void a2_video_device::text_update_ultr(screen_device &screen, bitmap_ind16 &bitm int fg = 0; int bg = 0; - beginrow = std::max(beginrow, cliprect.min_y - (cliprect.min_y % 8)); - endrow = std::min(endrow, cliprect.max_y - (cliprect.max_y % 8) + 7); + beginrow = (std::max)(beginrow, cliprect.top() - (cliprect.top() % 8)); + endrow = (std::min)(endrow, cliprect.bottom() - (cliprect.bottom() % 8) + 7); switch (m_sysconfig & 0x03) { @@ -753,19 +753,19 @@ void a2_video_device::hgr_update(screen_device &screen, bitmap_ind16 &bitmap, co int begincol = 0, endcol = 40; /* sanity checks */ - if (beginrow < cliprect.min_y) - beginrow = cliprect.min_y; - if (endrow > cliprect.max_y) - endrow = cliprect.max_y; + if (beginrow < cliprect.top()) + beginrow = cliprect.top(); + if (endrow > cliprect.bottom()) + endrow = cliprect.bottom(); if (endrow < beginrow) return; // we generate 2 pixels per "column" so adjust - if (begincol < (cliprect.min_x/14)) - begincol = (cliprect.min_x/14); - if (endcol > (cliprect.max_x/14)) - endcol = (cliprect.max_x/14); - if (cliprect.max_x > 39*14) + if (begincol < (cliprect.left()/14)) + begincol = (cliprect.left()/14); + if (endcol > (cliprect.right()/14)) + endcol = (cliprect.right()/14); + if (cliprect.right() > 39*14) endcol = 40; if (endcol < begincol) return; @@ -872,10 +872,10 @@ void a2_video_device::hgr_update_tk2000(screen_device &screen, bitmap_ind16 &bit int mon_type = m_sysconfig & 0x03; /* sanity checks */ - if (beginrow < cliprect.min_y) - beginrow = cliprect.min_y; - if (endrow > cliprect.max_y) - endrow = cliprect.max_y; + if (beginrow < cliprect.top()) + beginrow = cliprect.top(); + if (endrow > cliprect.bottom()) + endrow = cliprect.bottom(); if (endrow < beginrow) return; @@ -962,10 +962,10 @@ void a2_video_device::dhgr_update(screen_device &screen, bitmap_ind16 &bitmap, c int mon_type = m_sysconfig & 0x03; /* sanity checks */ - if (beginrow < cliprect.min_y) - beginrow = cliprect.min_y; - if (endrow > cliprect.max_y) - endrow = cliprect.max_y; + if (beginrow < cliprect.top()) + beginrow = cliprect.top(); + if (endrow > cliprect.bottom()) + endrow = cliprect.bottom(); if (endrow < beginrow) return; @@ -1084,7 +1084,7 @@ uint32_t a2_video_device::screen_update_GS(screen_device &screen, bitmap_rgb32 & int beamy; uint16_t *a2pixel; - beamy = cliprect.min_y; + beamy = cliprect.top(); if (m_newvideo & 0x80) { @@ -1302,8 +1302,8 @@ void a2_video_device::text_updateGS(screen_device &screen, bitmap_ind16 &bitmap, start_address = m_page2 ? 0x800 : 0x400; } - beginrow = std::max(beginrow, cliprect.min_y - (cliprect.min_y % 8)); - endrow = std::min(endrow, cliprect.max_y - (cliprect.max_y % 8) + 7); + beginrow = (std::max)(beginrow, cliprect.top() - (cliprect.top() % 8)); + endrow = (std::min)(endrow, cliprect.bottom() - (cliprect.bottom() % 8) + 7); for (row = beginrow; row <= endrow; row += 8) { diff --git a/src/mame/video/apple3.cpp b/src/mame/video/apple3.cpp index 724907d6c23..cfc4a675c5b 100644 --- a/src/mame/video/apple3.cpp +++ b/src/mame/video/apple3.cpp @@ -149,8 +149,8 @@ void apple3_state::text40(bitmap_ind16 &bitmap, const rectangle &cliprect) uint8_t *ram = m_ram->pointer(); uint32_t ram_size = m_ram->size(); int smooth = m_va | (m_vb << 1) | (m_vc << 2); - int beginrow = (cliprect.min_y - (cliprect.min_y % 8)) / 8; - int endrow = (cliprect.max_y - (cliprect.max_y % 8) + 7) / 8; + int beginrow = (cliprect.top() - (cliprect.top() % 8)) / 8; + int endrow = (cliprect.bottom() - (cliprect.bottom() % 8) + 7) / 8; for (y = beginrow; y <= endrow; y++) { @@ -220,8 +220,8 @@ void apple3_state::text80(bitmap_ind16 &bitmap, const rectangle &cliprect) uint8_t *ram = m_ram->pointer(); uint32_t ram_size = m_ram->size(); int smooth = m_va | (m_vb << 1) | (m_vc << 2); - int beginrow = (cliprect.min_y - (cliprect.min_y % 8)) / 8; - int endrow = (cliprect.max_y - (cliprect.max_y % 8) + 7) / 8; + int beginrow = (cliprect.top() - (cliprect.top() % 8)) / 8; + int endrow = (cliprect.bottom() - (cliprect.bottom() % 8) + 7) / 8; for (y = beginrow; y <= endrow; y++) { @@ -284,7 +284,7 @@ void apple3_state::graphics_hgr(bitmap_ind16 &bitmap, const rectangle &cliprect) uint8_t *ram = m_ram->pointer(); int smooth = m_va | (m_vb << 1) | (m_vc << 2); - for (y = cliprect.min_y; y <= cliprect.max_y; y++) + for (y = cliprect.top(); y <= cliprect.bottom(); y++) { ly = y; if (m_smoothscr) @@ -329,7 +329,7 @@ void apple3_state::graphics_chgr(bitmap_ind16 &bitmap, const rectangle &cliprect uint8_t *ram = m_ram->pointer(); int smooth = m_va | (m_vb << 1) | (m_vc << 2); - for (y = cliprect.min_y; y <= cliprect.max_y; y++) + for (y = cliprect.top(); y <= cliprect.bottom(); y++) { ly = y; if (m_smoothscr) @@ -386,7 +386,7 @@ void apple3_state::graphics_shgr(bitmap_ind16 &bitmap, const rectangle &cliprect uint8_t *ram = m_ram->pointer(); int smooth = m_va | (m_vb << 1) | (m_vc << 2); - for (y = cliprect.min_y; y <= cliprect.max_y; y++) + for (y = cliprect.top(); y <= cliprect.bottom(); y++) { ly = y; if (m_smoothscr) @@ -441,7 +441,7 @@ void apple3_state::graphics_chires(bitmap_ind16 &bitmap, const rectangle &clipre uint8_t *ram = m_ram->pointer(); int smooth = m_va | (m_vb << 1) | (m_vc << 2); - for (y = cliprect.min_y; y <= cliprect.max_y; y++) + for (y = cliprect.top(); y <= cliprect.bottom(); y++) { ly = y; if (m_smoothscr) diff --git a/src/mame/video/aquarium.cpp b/src/mame/video/aquarium.cpp index 75562c6386f..89a2929e6b5 100644 --- a/src/mame/video/aquarium.cpp +++ b/src/mame/video/aquarium.cpp @@ -80,12 +80,12 @@ void aquarium_state::video_start() void aquarium_state::mix_sprite_bitmap(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int priority_mask, int priority_value) { - for (int y = cliprect.min_y;y <= cliprect.max_y;y++) + for (int y = cliprect.top();y <= cliprect.bottom();y++) { uint16_t* srcline = &m_temp_sprite_bitmap.pix16(y); uint16_t* dstline = &bitmap.pix16(y); - for (int x = cliprect.min_x;x <= cliprect.max_x;x++) + for (int x = cliprect.left();x <= cliprect.right();x++) { uint16_t pixel = srcline[x]; diff --git a/src/mame/video/arcadecl.cpp b/src/mame/video/arcadecl.cpp index 57569f0040d..446ebb928a5 100644 --- a/src/mame/video/arcadecl.cpp +++ b/src/mame/video/arcadecl.cpp @@ -78,11 +78,11 @@ uint32_t arcadecl_state::screen_update(screen_device &screen, bitmap_ind16 &bitm // draw and merge the MO bitmap_ind16 &mobitmap = m_mob->bitmap(); for (const sparse_dirty_rect *rect = m_mob->first_dirty_rect(cliprect); rect != nullptr; rect = rect->next()) - for (int y = rect->min_y; y <= rect->max_y; y++) + for (int y = rect->top(); y <= rect->bottom(); y++) { uint16_t *mo = &mobitmap.pix16(y); uint16_t *pf = &bitmap.pix16(y); - for (int x = rect->min_x; x <= rect->max_x; x++) + for (int x = rect->left(); x <= rect->right(); x++) if (mo[x] != 0xffff) { // not yet verified @@ -104,13 +104,13 @@ uint32_t arcadecl_state::screen_update(screen_device &screen, bitmap_ind16 &bitm uint32_t sparkz_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { // update any dirty scanlines - for (int y = cliprect.min_y; y <= cliprect.max_y; y++) + for (int y = cliprect.top(); y <= cliprect.bottom(); y++) { const uint16_t *const src = &m_bitmap[256 * y]; uint16_t *const dst = &bitmap.pix16(y); /* regenerate the line */ - for (int x = cliprect.min_x & ~1; x <= cliprect.max_x; x += 2) + for (int x = cliprect.left() & ~1; x <= cliprect.right(); x += 2) { int bits = src[(x - 8) / 2]; dst[x + 0] = bits >> 8; diff --git a/src/mame/video/atarig42.cpp b/src/mame/video/atarig42.cpp index b553cc0f512..aa427b3d088 100644 --- a/src/mame/video/atarig42.cpp +++ b/src/mame/video/atarig42.cpp @@ -174,10 +174,10 @@ uint32_t atarig42_state::screen_update_atarig42(screen_device &screen, bitmap_in /* copy the motion objects on top */ { bitmap_ind16 &mo_bitmap = m_rle->vram(0); - int left = cliprect.min_x; - int top = cliprect.min_y; - int right = cliprect.max_x + 1; - int bottom = cliprect.max_y + 1; + int left = cliprect.left(); + int top = cliprect.top(); + int right = cliprect.right() + 1; + int bottom = cliprect.bottom() + 1; int x, y; /* now blend with the playfield */ diff --git a/src/mame/video/atarigt.cpp b/src/mame/video/atarigt.cpp index d9cab371fb3..67563b639c5 100644 --- a/src/mame/video/atarigt.cpp +++ b/src/mame/video/atarigt.cpp @@ -503,7 +503,7 @@ uint32_t atarigt_state::screen_update_atarigt(screen_device &screen, bitmap_rgb3 const pen_t *mram = &m_palette->pens()[(color_latch & 0xc0) << 7]; /* now do the nasty blend */ - for (y = cliprect.min_y; y <= cliprect.max_y; y++) + for (y = cliprect.top(); y <= cliprect.bottom(); y++) { uint16_t *an = &m_an_bitmap.pix16(y); uint16_t *pf = &m_pf_bitmap.pix16(y); @@ -514,7 +514,7 @@ uint32_t atarigt_state::screen_update_atarigt(screen_device &screen, bitmap_rgb3 /* Primal Rage: no TRAM, slightly different priorities */ if (m_is_primrage) { - for (x = cliprect.min_x; x <= cliprect.max_x; x++) + for (x = cliprect.left(); x <= cliprect.right(); x++) { uint8_t pfpri = (pf[x] >> 10) & 7; uint8_t mopri = mo[x] >> ATARIRLE_PRIORITY_SHIFT; @@ -548,7 +548,7 @@ uint32_t atarigt_state::screen_update_atarigt(screen_device &screen, bitmap_rgb3 /* T-Mek: full TRAM and all effects */ else { - for (x = cliprect.min_x; x <= cliprect.max_x; x++) + for (x = cliprect.left(); x <= cliprect.right(); x++) { uint8_t pfpri = (pf[x] >> 10) & 7; uint8_t mopri = mo[x] >> ATARIRLE_PRIORITY_SHIFT; diff --git a/src/mame/video/atarigx2.cpp b/src/mame/video/atarigx2.cpp index 3159d1980a5..8d0b98235b0 100644 --- a/src/mame/video/atarigx2.cpp +++ b/src/mame/video/atarigx2.cpp @@ -182,10 +182,10 @@ uint32_t atarigx2_state::screen_update_atarigx2(screen_device &screen, bitmap_in /* copy the motion objects on top */ { bitmap_ind16 &mo_bitmap = m_rle->vram(0); - int left = cliprect.min_x; - int top = cliprect.min_y; - int right = cliprect.max_x + 1; - int bottom = cliprect.max_y + 1; + int left = cliprect.left(); + int top = cliprect.top(); + int right = cliprect.right() + 1; + int bottom = cliprect.bottom() + 1; int x, y; /* now blend with the playfield */ diff --git a/src/mame/video/atarimo.cpp b/src/mame/video/atarimo.cpp index 35a63f30a38..3db58a6d8d2 100644 --- a/src/mame/video/atarimo.cpp +++ b/src/mame/video/atarimo.cpp @@ -161,8 +161,8 @@ atari_motion_objects_device::atari_motion_objects_device(const machine_config &m void atari_motion_objects_device::draw(bitmap_ind16 &bitmap, const rectangle &cliprect) { // compute start/stop bands - int startband = ((cliprect.min_y + m_yscroll - m_slipoffset) & m_bitmapymask) >> m_slipshift; - int stopband = ((cliprect.max_y + m_yscroll - m_slipoffset) & m_bitmapymask) >> m_slipshift; + int startband = ((cliprect.top() + m_yscroll - m_slipoffset) & m_bitmapymask) >> m_slipshift; + int stopband = ((cliprect.bottom() + m_yscroll - m_slipoffset) & m_bitmapymask) >> m_slipshift; if (startband > stopband) startband -= m_bitmapheight >> m_slipshift; if (m_slipshift == 0) @@ -185,7 +185,7 @@ void atari_motion_objects_device::draw(bitmap_ind16 &bitmap, const rectangle &cl bandclip.min_y -= m_bitmapheight; // maximum Y is based on the minimum - bandclip.max_y = bandclip.min_y + (1 << m_slipshift) - 1; + bandclip.set_height(1 << m_slipshift); // keep within the cliprect bandclip &= cliprect; @@ -358,7 +358,7 @@ void atari_motion_objects_device::device_timer(emu_timer &timer, device_timer_id if (param > 0) screen().update_partial(param - 1); param += 64; - if (param >= screen().visible_area().max_y) + if (param >= screen().visible_area().bottom()) param = 0; timer.adjust(screen().time_until_pos(param), param); break; @@ -504,19 +504,19 @@ void atari_motion_objects_device::render_object(bitmap_ind16 &bitmap, const rect for (int y = 0, sy = ypos; y < height; y++, sy += yadv) { // clip the Y coordinate - if (sy <= cliprect.min_y - m_tileheight) + if (sy <= cliprect.top() - m_tileheight) { code += width; continue; } - else if (sy > cliprect.max_y) + else if (sy > cliprect.bottom()) break; // loop over the width for (int x = 0, sx = xpos; x < width; x++, sx += xadv, code++) { // clip the X coordinate - if (sx <= -cliprect.min_x - m_tilewidth || sx > cliprect.max_x) + if (sx <= -cliprect.left() - m_tilewidth || sx > cliprect.right()) continue; // draw the sprite @@ -533,19 +533,19 @@ void atari_motion_objects_device::render_object(bitmap_ind16 &bitmap, const rect for (int x = 0, sx = xpos; x < width; x++, sx += xadv) { // clip the X coordinate - if (sx <= cliprect.min_x - m_tilewidth) + if (sx <= cliprect.left() - m_tilewidth) { code += height; continue; } - else if (sx > cliprect.max_x) + else if (sx > cliprect.right()) break; // loop over the height for (int y = 0, sy = ypos; y < height; y++, sy += yadv, code++) { // clip the X coordinate - if (sy <= -cliprect.min_y - m_tileheight || sy > cliprect.max_y) + if (sy <= -cliprect.top() - m_tileheight || sy > cliprect.bottom()) continue; // draw the sprite diff --git a/src/mame/video/atarirle.cpp b/src/mame/video/atarirle.cpp index 5c54a2a785d..7c0882619bf 100644 --- a/src/mame/video/atarirle.cpp +++ b/src/mame/video/atarirle.cpp @@ -97,13 +97,12 @@ WRITE8_MEMBER(atari_rle_objects_device::control_write) if ((oldbits & ATARIRLE_CONTROL_ERASE) != 0) { // compute the top and bottom of the rect - rectangle cliprect = m_cliprect; - if (m_partial_scanline + 1 > cliprect.min_y) - cliprect.min_y = m_partial_scanline + 1; - if (scanline < cliprect.max_y) - cliprect.max_y = scanline; + rectangle cliprect(m_cliprect); + cliprect.sety( + (std::max)(cliprect.top(), m_partial_scanline + 1), + (std::min)(cliprect.bottom(), scanline)); -//logerror(" partial erase %d-%d (frame %d)\n", cliprect.min_y, cliprect.max_y, (oldbits & ATARIRLE_CONTROL_FRAME) >> 2); + //logerror(" partial erase %d-%d (frame %d)\n", cliprect.top(), cliprect.bottom(), (oldbits & ATARIRLE_CONTROL_FRAME) >> 2); // erase the bitmap m_vram[0][(oldbits & ATARIRLE_CONTROL_FRAME) >> 2].fill(0, cliprect); @@ -152,10 +151,9 @@ void atari_rle_objects_device::vblank_callback(screen_device &screen, bool state { // compute top only; bottom is equal to visible_area rectangle cliprect = m_cliprect; - if (m_partial_scanline + 1 > cliprect.min_y) - cliprect.min_y = m_partial_scanline + 1; + cliprect.sety((std::max)(cliprect.top(), m_partial_scanline + 1), cliprect.bottom()); - //logerror(" partial erase %d-%d (frame %d)\n", cliprect.min_y, cliprect.max_y, (m_control_bits & ATARIRLE_CONTROL_FRAME) >> 2); + //logerror(" partial erase %d-%d (frame %d)\n", cliprect.top(), cliprect.bottom(), (m_control_bits & ATARIRLE_CONTROL_FRAME) >> 2); // erase the bitmap m_vram[0][(m_control_bits & ATARIRLE_CONTROL_FRAME) >> 2].fill(0, cliprect); @@ -213,10 +211,7 @@ void atari_rle_objects_device::device_start() // set up a cliprect m_cliprect = screen().visible_area(); if (m_rightclip != 0) - { - m_cliprect.min_x = m_leftclip; - m_cliprect.max_x = m_rightclip; - } + m_cliprect.setx(m_leftclip, m_rightclip); // compute the checksums memset(m_checksums, 0, sizeof(m_checksums)); @@ -500,7 +495,7 @@ if (count++ == atarirle_hilite_index) x = (int16_t)(x | ~m_xposmask.mask()); if (y & ((m_yposmask.mask() + 1) >> 1)) y = (int16_t)(y | ~m_yposmask.mask()); - x += m_cliprect.min_x; + x += m_cliprect.left(); // merge priority and color color = (color << 4) | (priority << ATARIRLE_PRIORITY_SHIFT); @@ -536,7 +531,7 @@ void atari_rle_objects_device::draw_rle(bitmap_ind16 &bitmap, const rectangle &c if (hflip) scaled_xoffs = ((xscale * info.width) >> 12) - scaled_xoffs; -//if (clip.min_y == screen().visible_area().min_y) +//if (clip.top() == screen().visible_area().top()) //logerror(" Sprite: c=%04X l=%04X h=%d X=%4d (o=%4d w=%3d) Y=%4d (o=%4d h=%d) s=%04X\n", // code, color, hflip, // x, -scaled_xoffs, (xscale * info.width) >> 12, @@ -579,30 +574,30 @@ void atari_rle_objects_device::draw_rle_zoom(bitmap_ind16 &bitmap, const rectang // left edge clip int pixels_to_skip = 0; bool xclipped = false; - if (sx < clip.min_x) - pixels_to_skip = clip.min_x - sx, xclipped = true; - if (sx > clip.max_x) + if (sx < clip.left()) + pixels_to_skip = clip.left() - sx, xclipped = true; + if (sx > clip.right()) return; // right edge clip - if (ex > clip.max_x) - ex = clip.max_x, xclipped = true; - else if (ex < clip.min_x) + if (ex > clip.right()) + ex = clip.right(), xclipped = true; + else if (ex < clip.left()) return; // top edge clip - if (sy < clip.min_y) + if (sy < clip.top()) { - sourcey += (clip.min_y - sy) * dy; - sy = clip.min_y; + sourcey += (clip.top() - sy) * dy; + sy = clip.top(); } - else if (sy > clip.max_y) + else if (sy > clip.bottom()) return; // bottom edge clip - if (ey > clip.max_y) - ey = clip.max_y; - else if (ey < clip.min_y) + if (ey > clip.bottom()) + ey = clip.bottom(); + else if (ey < clip.top()) return; // loop top to bottom @@ -758,30 +753,30 @@ void atari_rle_objects_device::draw_rle_zoom_hflip(bitmap_ind16 &bitmap, const r // left edge clip int pixels_to_skip = 0; bool xclipped = false; - if (sx < clip.min_x) - sx = clip.min_x, xclipped = true; - if (sx > clip.max_x) + if (sx < clip.left()) + sx = clip.left(), xclipped = true; + if (sx > clip.right()) return; // right edge clip - if (ex > clip.max_x) - pixels_to_skip = ex - clip.max_x, xclipped = true; - else if (ex < clip.min_x) + if (ex > clip.right()) + pixels_to_skip = ex - clip.right(), xclipped = true; + else if (ex < clip.left()) return; // top edge clip - if (sy < clip.min_y) + if (sy < clip.top()) { - sourcey += (clip.min_y - sy) * dy; - sy = clip.min_y; + sourcey += (clip.top() - sy) * dy; + sy = clip.top(); } - else if (sy > clip.max_y) + else if (sy > clip.bottom()) return; // bottom edge clip - if (ey > clip.max_y) - ey = clip.max_y; - else if (ey < clip.min_y) + if (ey > clip.bottom()) + ey = clip.bottom(); + else if (ey < clip.top()) return; // loop top to bottom @@ -933,10 +928,10 @@ void atari_rle_objects_device::hilite_object(bitmap_ind16 &bitmap, int hilite) int y = m_yposmask.extract(m_ram, hilite); if (x & ((m_xposmask.mask() + 1) >> 1)) - x = (int16_t)(x | ~m_xposmask.mask()); + x = int16_t(x | ~m_xposmask.mask()); if (y & ((m_yposmask.mask() + 1) >> 1)) - y = (int16_t)(y | ~m_yposmask.mask()); - x += m_cliprect.min_x; + y = int16_t(y | ~m_yposmask.mask()); + x += m_cliprect.left(); // merge priority and color color = (color << 4) | (priority << ATARIRLE_PRIORITY_SHIFT); @@ -969,27 +964,27 @@ void atari_rle_objects_device::hilite_object(bitmap_ind16 &bitmap, int hilite) // left edge clip const rectangle &visarea = screen().visible_area(); - if (sx < visarea.min_x) - sx = visarea.min_x; - if (sx > visarea.max_x) + if (sx < visarea.left()) + sx = visarea.left(); + if (sx > visarea.right()) break; // right edge clip - if (ex > visarea.max_x) - ex = visarea.max_x; - else if (ex < visarea.min_x) + if (ex > visarea.right()) + ex = visarea.right(); + else if (ex < visarea.left()) break; // top edge clip - if (sy < visarea.min_y) - sy = visarea.min_y; - else if (sy > visarea.max_y) + if (sy < visarea.top()) + sy = visarea.top(); + else if (sy > visarea.bottom()) break; // bottom edge clip - if (ey > visarea.max_y) - ey = visarea.max_y; - else if (ey < visarea.min_y) + if (ey > visarea.bottom()) + ey = visarea.bottom(); + else if (ey < visarea.left()) break; for (int ty = sy; ty <= ey; ty++) diff --git a/src/mame/video/atarisy1.cpp b/src/mame/video/atarisy1.cpp index be249e8e873..d5f550200b5 100644 --- a/src/mame/video/atarisy1.cpp +++ b/src/mame/video/atarisy1.cpp @@ -291,7 +291,7 @@ WRITE16_MEMBER( atarisy1_state::atarisy1_yscroll_w ) /* because this latches a new value into the scroll base, we need to adjust for the scanline */ adjusted_scroll = newscroll; - if (scanline <= m_screen->visible_area().max_y) + if (scanline <= m_screen->visible_area().bottom()) adjusted_scroll -= (scanline + 1); m_playfield_tilemap->set_scrolly(0, adjusted_scroll); @@ -472,11 +472,11 @@ uint32_t atarisy1_state::screen_update_atarisy1(screen_device &screen, bitmap_in // draw and merge the MO bitmap_ind16 &mobitmap = m_mob->bitmap(); for (const sparse_dirty_rect *rect = m_mob->first_dirty_rect(cliprect); rect != nullptr; rect = rect->next()) - for (int y = rect->min_y; y <= rect->max_y; y++) + for (int y = rect->top(); y <= rect->bottom(); y++) { uint16_t *mo = &mobitmap.pix16(y); uint16_t *pf = &bitmap.pix16(y); - for (int x = rect->min_x; x <= rect->max_x; x++) + for (int x = rect->left(); x <= rect->right(); x++) if (mo[x] != 0xffff) { /* high priority MO? */ diff --git a/src/mame/video/atarisy2.cpp b/src/mame/video/atarisy2.cpp index 0c735cccc4f..4dc92540ca8 100644 --- a/src/mame/video/atarisy2.cpp +++ b/src/mame/video/atarisy2.cpp @@ -248,12 +248,12 @@ uint32_t atarisy2_state::screen_update_atarisy2(screen_device &screen, bitmap_in /* draw and merge the MO */ bitmap_ind16 &mobitmap = m_mob->bitmap(); for (const sparse_dirty_rect *rect = m_mob->first_dirty_rect(cliprect); rect != nullptr; rect = rect->next()) - for (int y = rect->min_y; y <= rect->max_y; y++) + for (int y = rect->top(); y <= rect->bottom(); y++) { uint16_t *mo = &mobitmap.pix16(y); uint16_t *pf = &bitmap.pix16(y); uint8_t *pri = &priority_bitmap.pix8(y); - for (int x = rect->min_x; x <= rect->max_x; x++) + for (int x = rect->left(); x <= rect->right(); x++) if (mo[x] != 0xffff) { int mopriority = mo[x] >> atari_motion_objects_device::PRIORITY_SHIFT; diff --git a/src/mame/video/atarivad.cpp b/src/mame/video/atarivad.cpp index 85a80776954..0798a0d7b8a 100644 --- a/src/mame/video/atarivad.cpp +++ b/src/mame/video/atarivad.cpp @@ -26,24 +26,24 @@ DEFINE_DEVICE_TYPE(ATARI_VAD, atari_vad_device, "atarivad", "Atari VAD") //------------------------------------------------- atari_vad_device::atari_vad_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, ATARI_VAD, tag, owner, clock), - device_video_interface(mconfig, *this), - m_scanline_int_cb(*this), - m_alpha_tilemap(*this, "alpha"), - m_playfield_tilemap(*this, "playfield"), - m_playfield2_tilemap(*this, "playfield2"), - m_mob(*this, "mob"), - m_eof_data(*this, "eof"), - m_scanline_int_timer(nullptr), - m_tilerow_update_timer(nullptr), - m_eof_timer(nullptr), - m_palette_bank(0), - m_pf0_xscroll_raw(0), - m_pf0_yscroll(0), - m_pf1_xscroll_raw(0), - m_pf1_yscroll(0), - m_mo_xscroll(0), - m_mo_yscroll(0) + : device_t(mconfig, ATARI_VAD, tag, owner, clock) + , device_video_interface(mconfig, *this) + , m_scanline_int_cb(*this) + , m_alpha_tilemap(*this, "alpha") + , m_playfield_tilemap(*this, "playfield") + , m_playfield2_tilemap(*this, "playfield2") + , m_mob(*this, "mob") + , m_eof_data(*this, "eof") + , m_scanline_int_timer(nullptr) + , m_tilerow_update_timer(nullptr) + , m_eof_timer(nullptr) + , m_palette_bank(0) + , m_pf0_xscroll_raw(0) + , m_pf0_yscroll(0) + , m_pf1_xscroll_raw(0) + , m_pf1_yscroll(0) + , m_mo_xscroll(0) + , m_mo_yscroll(0) { } @@ -76,7 +76,7 @@ READ16_MEMBER(atari_vad_device::control_read) int result = screen().vpos(); if (result > 255) result = 255; - if (result > screen().visible_area().max_y) + if (result > screen().visible_area().bottom()) result |= 0x4000; return result; } @@ -423,7 +423,7 @@ void atari_vad_device::update_parameter(uint16_t newword) void atari_vad_device::update_tilerow(emu_timer &timer, int scanline) { // skip if out of bounds, or not enabled - if (scanline <= screen().visible_area().max_y && (m_control[0x0a] & 0x2000) != 0 && m_alpha_tilemap != nullptr) + if (scanline <= screen().visible_area().bottom() && (m_control[0x0a] & 0x2000) != 0 && m_alpha_tilemap != nullptr) { // iterate over non-visible alpha tiles in this row int offset = scanline / 8 * 64 + 48 + 2 * (scanline % 8); diff --git a/src/mame/video/avigo.cpp b/src/mame/video/avigo.cpp index 7e60cc0c418..9e4a4681879 100644 --- a/src/mame/video/avigo.cpp +++ b/src/mame/video/avigo.cpp @@ -71,8 +71,7 @@ void avigo_state::video_start() m_screen_column = 0; /* allocate video memory */ - m_video_memory = machine().memory().region_alloc( "videoram", (AVIGO_SCREEN_WIDTH>>3) * AVIGO_SCREEN_HEIGHT + 1, 1, ENDIANNESS_LITTLE )->base(); - memset(m_video_memory, 0, (AVIGO_SCREEN_WIDTH>>3) * AVIGO_SCREEN_HEIGHT + 1); + m_video_memory = make_unique_clear<uint8_t[]>((AVIGO_SCREEN_WIDTH>>3) * AVIGO_SCREEN_HEIGHT + 1); save_pointer(NAME(m_video_memory), (AVIGO_SCREEN_WIDTH>>3) * AVIGO_SCREEN_HEIGHT + 1); } @@ -94,7 +93,7 @@ uint32_t avigo_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, for (y=0; y<AVIGO_SCREEN_HEIGHT; y++) { int by; - uint8_t *line_ptr = m_video_memory + (y*(AVIGO_SCREEN_WIDTH>>3)); + uint8_t *line_ptr = &m_video_memory[y*(AVIGO_SCREEN_WIDTH>>3)]; x = 0; for (by=((AVIGO_SCREEN_WIDTH>>3)-1); by>=0; by--) diff --git a/src/mame/video/badlands.cpp b/src/mame/video/badlands.cpp index c8c0a955b99..beab5dd320f 100644 --- a/src/mame/video/badlands.cpp +++ b/src/mame/video/badlands.cpp @@ -112,11 +112,11 @@ uint32_t badlands_state::screen_update_badlands(screen_device &screen, bitmap_in // draw and merge the MO bitmap_ind16 &mobitmap = m_mob->bitmap(); for (const sparse_dirty_rect *rect = m_mob->first_dirty_rect(cliprect); rect != nullptr; rect = rect->next()) - for (int y = rect->min_y; y <= rect->max_y; y++) + for (int y = rect->top(); y <= rect->bottom(); y++) { uint16_t *mo = &mobitmap.pix16(y); uint16_t *pf = &bitmap.pix16(y); - for (int x = rect->min_x; x <= rect->max_x; x++) + for (int x = rect->left(); x <= rect->right(); x++) if (mo[x] != 0xffff) { /* not yet verified diff --git a/src/mame/video/batman.cpp b/src/mame/video/batman.cpp index e9ee2caa8e9..1b0d8632864 100644 --- a/src/mame/video/batman.cpp +++ b/src/mame/video/batman.cpp @@ -118,12 +118,12 @@ uint32_t batman_state::screen_update_batman(screen_device &screen, bitmap_ind16 // draw and merge the MO bitmap_ind16 &mobitmap = m_vad->mob().bitmap(); for (const sparse_dirty_rect *rect = m_vad->mob().first_dirty_rect(cliprect); rect != nullptr; rect = rect->next()) - for (int y = rect->min_y; y <= rect->max_y; y++) + for (int y = rect->top(); y <= rect->bottom(); y++) { uint16_t *mo = &mobitmap.pix16(y); uint16_t *pf = &bitmap.pix16(y); uint8_t *pri = &priority_bitmap.pix8(y); - for (int x = rect->min_x; x <= rect->max_x; x++) + for (int x = rect->left(); x <= rect->right(); x++) if (mo[x] != 0xffff) { /* verified on real hardware: @@ -190,11 +190,11 @@ uint32_t batman_state::screen_update_batman(screen_device &screen, bitmap_ind16 /* now go back and process the upper bit of MO priority */ for (const sparse_dirty_rect *rect = m_vad->mob().first_dirty_rect(cliprect); rect != nullptr; rect = rect->next()) - for (int y = rect->min_y; y <= rect->max_y; y++) + for (int y = rect->top(); y <= rect->bottom(); y++) { uint16_t *mo = &mobitmap.pix16(y); uint16_t *pf = &bitmap.pix16(y); - for (int x = rect->min_x; x <= rect->max_x; x++) + for (int x = rect->left(); x <= rect->right(); x++) if (mo[x] != 0xffff) { int mopriority = mo[x] >> atari_motion_objects_device::PRIORITY_SHIFT; diff --git a/src/mame/video/beathead.cpp b/src/mame/video/beathead.cpp index 5c6586b4fdc..daff388b72a 100644 --- a/src/mame/video/beathead.cpp +++ b/src/mame/video/beathead.cpp @@ -145,29 +145,29 @@ uint32_t beathead_state::screen_update(screen_device &screen, bitmap_ind16 &bitm int x, y; /* generate the final screen */ - for (y = cliprect.min_y; y <= cliprect.max_y; y++) + for (y = cliprect.top(); y <= cliprect.bottom(); y++) { pen_t pen_base = (*m_palette_select & 0x7f) * 256; uint16_t scanline[336]; /* blanking */ if (m_finescroll & 8) - for (x = cliprect.min_x; x <= cliprect.max_x; x++) + for (x = cliprect.left(); x <= cliprect.right(); x++) scanline[x] = pen_base; /* non-blanking */ else { offs_t scanline_offset = m_vram_latch_offset + (m_finescroll & 3); - offs_t src = scanline_offset + cliprect.min_x; + offs_t src = scanline_offset + cliprect.left(); /* unswizzle the scanline first */ - for (x = cliprect.min_x; x <= cliprect.max_x; x++) + for (x = cliprect.left(); x <= cliprect.right(); x++) scanline[x] = pen_base | videoram[BYTE4_XOR_LE(src++)]; } /* then draw it */ - draw_scanline16(bitmap, cliprect.min_x, y, cliprect.width(), &scanline[cliprect.min_x], nullptr); + draw_scanline16(bitmap, cliprect.left(), y, cliprect.width(), &scanline[cliprect.left()], nullptr); } return 0; } diff --git a/src/mame/video/blstroid.cpp b/src/mame/video/blstroid.cpp index af8c6b9a12e..19c8307f2b8 100644 --- a/src/mame/video/blstroid.cpp +++ b/src/mame/video/blstroid.cpp @@ -149,11 +149,11 @@ uint32_t blstroid_state::screen_update_blstroid(screen_device &screen, bitmap_in /* draw and merge the MO */ bitmap_ind16 &mobitmap = m_mob->bitmap(); for (const sparse_dirty_rect *rect = m_mob->first_dirty_rect(cliprect); rect != nullptr; rect = rect->next()) - for (int y = rect->min_y; y <= rect->max_y; y++) + for (int y = rect->top(); y <= rect->bottom(); y++) { uint16_t *mo = &mobitmap.pix16(y); uint16_t *pf = &bitmap.pix16(y); - for (int x = rect->min_x; x <= rect->max_x; x++) + for (int x = rect->left(); x <= rect->right(); x++) if (mo[x] != 0xffff) { /* verified via schematics diff --git a/src/mame/video/boogwing.cpp b/src/mame/video/boogwing.cpp index 407d47b6085..52564201416 100644 --- a/src/mame/video/boogwing.cpp +++ b/src/mame/video/boogwing.cpp @@ -40,7 +40,7 @@ void boogwing_state::mix_boogwing(screen_device &screen, bitmap_rgb32 &bitmap, c uint16_t *srcline1, *srcline2; uint8_t *srcpriline; - for (y=cliprect.min_y;y<=cliprect.max_y;y++) + for (y=cliprect.top();y<=cliprect.bottom();y++) { srcline1=&sprite_bitmap1->pix16(y,0); srcline2=&sprite_bitmap2->pix16(y,0); @@ -48,7 +48,7 @@ void boogwing_state::mix_boogwing(screen_device &screen, bitmap_rgb32 &bitmap, c dstline=&bitmap.pix32(y,0); - for (x=cliprect.min_x;x<=cliprect.max_x;x++) + for (x=cliprect.left();x<=cliprect.right();x++) { uint16_t pix1 = srcline1[x]; uint16_t pix2 = srcline2[x]; diff --git a/src/mame/video/ccastles.cpp b/src/mame/video/ccastles.cpp index 99bab35d18e..96981f086d2 100644 --- a/src/mame/video/ccastles.cpp +++ b/src/mame/video/ccastles.cpp @@ -272,14 +272,14 @@ uint32_t ccastles_state::screen_update_ccastles(screen_device &screen, bitmap_in } /* draw the bitmap to the screen, looping over Y */ - for (y = cliprect.min_y; y <= cliprect.max_y; y++) + for (y = cliprect.top(); y <= cliprect.bottom(); y++) { uint16_t *dst = &bitmap.pix16(y); /* if we're in the VBLANK region, just fill with black */ if (m_syncprom[y] & 1) { - for (x = cliprect.min_x; x <= cliprect.max_x; x++) + for (x = cliprect.left(); x <= cliprect.right(); x++) dst[x] = black; } @@ -296,7 +296,7 @@ uint32_t ccastles_state::screen_update_ccastles(screen_device &screen, bitmap_in src = &m_videoram[effy * 128]; /* loop over X */ - for (x = cliprect.min_x; x <= cliprect.max_x; x++) + for (x = cliprect.left(); x <= cliprect.right(); x++) { /* if we're in the HBLANK region, just store black */ if (x >= 256) diff --git a/src/mame/video/cinemat.cpp b/src/mame/video/cinemat.cpp index e1f9c120e3a..5d38416f280 100644 --- a/src/mame/video/cinemat.cpp +++ b/src/mame/video/cinemat.cpp @@ -22,10 +22,10 @@ void cinemat_state::cinemat_vector_callback(int16_t sx, int16_t sy, int16_t ex, int intensity = 0xff; /* adjust for slop */ - sx = sx - visarea.min_x; - ex = ex - visarea.min_x; - sy = sy - visarea.min_y; - ey = ey - visarea.min_y; + sx -= visarea.left(); + ex -= visarea.left(); + sy -= visarea.top(); + ey -= visarea.top(); /* point intensity is determined by the shift value */ if (sx == ex && sy == ey) diff --git a/src/mame/video/cloak.cpp b/src/mame/video/cloak.cpp index ae98e819927..d550499533f 100644 --- a/src/mame/video/cloak.cpp +++ b/src/mame/video/cloak.cpp @@ -182,8 +182,8 @@ void cloak_state::draw_bitmap(bitmap_ind16 &bitmap, const rectangle &cliprect) { int x, y; - for (y = cliprect.min_y; y <= cliprect.max_y; y++) - for (x = cliprect.min_x; x <= cliprect.max_x; x++) + for (y = cliprect.top(); y <= cliprect.bottom(); y++) + for (x = cliprect.left(); x <= cliprect.right(); x++) { pen_t pen = m_current_bitmap_videoram_displayed[(y << 8) | x] & 0x07; diff --git a/src/mame/video/cloud9.cpp b/src/mame/video/cloud9.cpp index 5a6eea3e0cb..af1d5d5c6d1 100644 --- a/src/mame/video/cloud9.cpp +++ b/src/mame/video/cloud9.cpp @@ -246,14 +246,14 @@ uint32_t cloud9_state::screen_update_cloud9(screen_device &screen, bitmap_ind16 } /* draw the bitmap to the screen, looping over Y */ - for (y = cliprect.min_y; y <= cliprect.max_y; y++) + for (y = cliprect.top(); y <= cliprect.bottom(); y++) { uint16_t *dst = &bitmap.pix16(y); /* if we're in the VBLANK region, just fill with black */ if (~m_syncprom[y] & 2) { - for (x = cliprect.min_x; x <= cliprect.max_x; x++) + for (x = cliprect.left(); x <= cliprect.right(); x++) dst[x] = black; } @@ -269,7 +269,7 @@ uint32_t cloud9_state::screen_update_cloud9(screen_device &screen, bitmap_ind16 src[1] = &m_videoram[0x0000 | (effy * 64)]; /* loop over X */ - for (x = cliprect.min_x; x <= cliprect.max_x; x++) + for (x = cliprect.left(); x <= cliprect.right(); x++) { /* if we're in the HBLANK region, just store black */ if (x >= 256) diff --git a/src/mame/video/copsnrob.cpp b/src/mame/video/copsnrob.cpp index 66bb9e0ebd5..109f13fcf9b 100644 --- a/src/mame/video/copsnrob.cpp +++ b/src/mame/video/copsnrob.cpp @@ -122,7 +122,7 @@ uint32_t copsnrob_state::screen_update_copsnrob(screen_device &screen, bitmap_in { if (val & mask1) { - for (y = cliprect.min_y; y <= cliprect.max_y; y++) + for (y = cliprect.top(); y <= cliprect.bottom(); y++) if (m_bulletsram[y] & mask2) bitmap.pix16(y, 256 - x) = 1; } diff --git a/src/mame/video/cvs.cpp b/src/mame/video/cvs.cpp index a88258bcd67..47645bb080a 100644 --- a/src/mame/video/cvs.cpp +++ b/src/mame/video/cvs.cpp @@ -224,11 +224,11 @@ uint32_t cvs_state::screen_update_cvs(screen_device &screen, bitmap_ind16 &bitma { int y; - for (y = cliprect.min_y; y <= cliprect.max_y; y++) + for (y = cliprect.top(); y <= cliprect.bottom(); y++) { int x; - for (x = cliprect.min_x; x <= cliprect.max_x; x++) + for (x = cliprect.left(); x <= cliprect.right(); x++) { int pixel0 = s2636_0_bitmap.pix16(y, x); int pixel1 = s2636_1_bitmap.pix16(y, x); @@ -328,7 +328,7 @@ void cvs_state::cvs_update_stars(bitmap_ind16 &bitmap, const rectangle &cliprect if (flip_screen_y()) y = ~y; - if ((y >= cliprect.min_y) && (y <= cliprect.max_y) && + if ((y >= cliprect.top()) && (y <= cliprect.bottom()) && (update_always || (m_palette->pen_indirect(bitmap.pix16(y, x)) == 0))) bitmap.pix16(y, x) = star_pen; } diff --git a/src/mame/video/cyberbal.cpp b/src/mame/video/cyberbal.cpp index bce32eb631a..0f470c6b7ff 100644 --- a/src/mame/video/cyberbal.cpp +++ b/src/mame/video/cyberbal.cpp @@ -233,11 +233,11 @@ uint32_t cyberbal_base_state::update_one_screen(screen_device &screen, bitmap_in /* draw and merge the MO */ bitmap_ind16 &mobitmap = curmob.bitmap(); for (const sparse_dirty_rect *rect = curmob.first_dirty_rect(cliprect); rect != nullptr; rect = rect->next()) - for (int y = rect->min_y; y <= rect->max_y; y++) + for (int y = rect->top(); y <= rect->bottom(); y++) { uint16_t *mo = &mobitmap.pix16(y); uint16_t *pf = &bitmap.pix16(y); - for (int x = rect->min_x; x <= rect->max_x; x++) + for (int x = rect->left(); x <= rect->right(); x++) if (mo[x] != 0xffff) { /* not verified: logic is all controlled in a PAL diff --git a/src/mame/video/cybstorm.cpp b/src/mame/video/cybstorm.cpp index 4cedc1d9482..ba8b8358965 100644 --- a/src/mame/video/cybstorm.cpp +++ b/src/mame/video/cybstorm.cpp @@ -129,12 +129,12 @@ uint32_t cybstorm_state::screen_update_cybstorm(screen_device &screen, bitmap_in /* draw and merge the MO */ bitmap_ind16 &mobitmap = m_vad->mob().bitmap(); for (const sparse_dirty_rect *rect = m_vad->mob().first_dirty_rect(cliprect); rect != nullptr; rect = rect->next()) - for (int y = rect->min_y; y <= rect->max_y; y++) + for (int y = rect->top(); y <= rect->bottom(); y++) { uint16_t *mo = &mobitmap.pix16(y); uint16_t *pf = &bitmap.pix16(y); uint8_t *pri = &priority_bitmap.pix8(y); - for (int x = rect->min_x; x <= rect->max_x; x++) + for (int x = rect->left(); x <= rect->right(); x++) if (mo[x]) { int mopriority = mo[x] >> atari_motion_objects_device::PRIORITY_SHIFT; @@ -175,12 +175,12 @@ uint32_t cybstorm_state::screen_update_cybstorm(screen_device &screen, bitmap_in /* now go back and process the upper bit of MO priority */ for (const sparse_dirty_rect *rect = m_vad->mob().first_dirty_rect(cliprect); rect != nullptr; rect = rect->next()) - for (int y = rect->min_y; y <= rect->max_y; y++) + for (int y = rect->top(); y <= rect->bottom(); y++) { uint16_t *mo = &mobitmap.pix16(y); uint16_t *pf = &bitmap.pix16(y); int count = 0; - for (int x = rect->min_x; x <= rect->max_x || (count && x < bitmap.width()); x++) + for (int x = rect->left(); x <= rect->right() || (count && x < bitmap.width()); x++) { const uint16_t START_MARKER = ((4 << atari_motion_objects_device::PRIORITY_SHIFT) | 3); const uint16_t END_MARKER = ((4 << atari_motion_objects_device::PRIORITY_SHIFT) | 7); diff --git a/src/mame/video/dassault.cpp b/src/mame/video/dassault.cpp index 94c989f66bc..7c7f8e7b550 100644 --- a/src/mame/video/dassault.cpp +++ b/src/mame/video/dassault.cpp @@ -37,12 +37,12 @@ void dassault_state::mixdassaultlayer(bitmap_rgb32 &bitmap, bitmap_ind16* sprite uint16_t* srcline; uint32_t* dstline; - for (y=cliprect.min_y;y<=cliprect.max_y;y++) + for (y=cliprect.top();y<=cliprect.bottom();y++) { srcline=&sprite_bitmap->pix16(y,0); dstline=&bitmap.pix32(y,0); - for (x=cliprect.min_x;x<=cliprect.max_x;x++) + for (x=cliprect.left();x<=cliprect.right();x++) { uint16_t pix = srcline[x]; diff --git a/src/mame/video/dec0.cpp b/src/mame/video/dec0.cpp index f89f85c3148..5f0d15740af 100644 --- a/src/mame/video/dec0.cpp +++ b/src/mame/video/dec0.cpp @@ -23,20 +23,20 @@ WRITE16_MEMBER(dec0_state::dec0_update_sprites_w) uint32_t dec0_state::screen_update_hbarrel(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { - bool flip = m_tilegen1->get_flip_state(); - m_tilegen1->set_flip_screen(flip); - m_tilegen2->set_flip_screen(flip); - m_tilegen3->set_flip_screen(flip); + bool flip = m_tilegen[0]->get_flip_state(); + m_tilegen[0]->set_flip_screen(flip); + m_tilegen[1]->set_flip_screen(flip); + m_tilegen[2]->set_flip_screen(flip); m_spritegen->set_flip_screen(flip); - m_tilegen3->deco_bac06_pf_draw(bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); + m_tilegen[2]->deco_bac06_pf_draw(bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); m_spritegen->draw_sprites(bitmap, cliprect, m_buffered_spriteram, 0x08, 0x08, 0x0f); - m_tilegen2->deco_bac06_pf_draw(bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); + m_tilegen[1]->deco_bac06_pf_draw(bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); /* HB always keeps pf2 on top of pf3, no need explicitly support priority register */ m_spritegen->draw_sprites(bitmap, cliprect, m_buffered_spriteram, 0x08, 0x00, 0x0f); - m_tilegen1->deco_bac06_pf_draw(bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); + m_tilegen[0]->deco_bac06_pf_draw(bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); return 0; } @@ -44,41 +44,41 @@ uint32_t dec0_state::screen_update_hbarrel(screen_device &screen, bitmap_ind16 & uint32_t dec0_state::screen_update_baddudes(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { - bool flip = m_tilegen1->get_flip_state(); - m_tilegen1->set_flip_screen(flip); - m_tilegen2->set_flip_screen(flip); - m_tilegen3->set_flip_screen(flip); + bool flip = m_tilegen[0]->get_flip_state(); + m_tilegen[0]->set_flip_screen(flip); + m_tilegen[1]->set_flip_screen(flip); + m_tilegen[2]->set_flip_screen(flip); m_spritegen->set_flip_screen(flip); /* WARNING: inverted wrt Midnight Resistance */ if ((m_pri & 0x01) == 0) { - m_tilegen2->deco_bac06_pf_draw(bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); - m_tilegen3->deco_bac06_pf_draw(bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); + m_tilegen[1]->deco_bac06_pf_draw(bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); + m_tilegen[2]->deco_bac06_pf_draw(bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); if (m_pri & 2) - m_tilegen2->deco_bac06_pf_draw(bitmap,cliprect,0,0x08,0x08,0x08,0x08); // upper 8 pens of upper 8 priority marked tiles /* Foreground pens only */ + m_tilegen[1]->deco_bac06_pf_draw(bitmap,cliprect,0,0x08,0x08,0x08,0x08); // upper 8 pens of upper 8 priority marked tiles /* Foreground pens only */ m_spritegen->draw_sprites(bitmap, cliprect, m_buffered_spriteram, 0x00, 0x00, 0x0f); if (m_pri & 4) - m_tilegen3->deco_bac06_pf_draw(bitmap,cliprect,0,0x08,0x08,0x08,0x08); // upper 8 pens of upper 8 priority marked tiles /* Foreground pens only */ + m_tilegen[2]->deco_bac06_pf_draw(bitmap,cliprect,0,0x08,0x08,0x08,0x08); // upper 8 pens of upper 8 priority marked tiles /* Foreground pens only */ } else { - m_tilegen3->deco_bac06_pf_draw(bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); - m_tilegen2->deco_bac06_pf_draw(bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); + m_tilegen[2]->deco_bac06_pf_draw(bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); + m_tilegen[1]->deco_bac06_pf_draw(bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); if (m_pri & 2) - m_tilegen3->deco_bac06_pf_draw(bitmap,cliprect,0,0x08,0x08,0x08,0x08); // upper 8 pens of upper 8 priority marked tiles /* Foreground pens only */ + m_tilegen[2]->deco_bac06_pf_draw(bitmap,cliprect,0,0x08,0x08,0x08,0x08); // upper 8 pens of upper 8 priority marked tiles /* Foreground pens only */ m_spritegen->draw_sprites(bitmap, cliprect, m_buffered_spriteram, 0x00, 0x00, 0x0f); if (m_pri & 4) - m_tilegen2->deco_bac06_pf_draw(bitmap,cliprect,0,0x08,0x08,0x08,0x08); // upper 8 pens of upper 8 priority marked tiles /* Foreground pens only */ + m_tilegen[1]->deco_bac06_pf_draw(bitmap,cliprect,0,0x08,0x08,0x08,0x08); // upper 8 pens of upper 8 priority marked tiles /* Foreground pens only */ } - m_tilegen1->deco_bac06_pf_draw(bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); + m_tilegen[0]->deco_bac06_pf_draw(bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); return 0; } @@ -88,10 +88,10 @@ uint32_t dec0_state::screen_update_robocop(screen_device &screen, bitmap_ind16 & { int trans; - bool flip = m_tilegen1->get_flip_state(); - m_tilegen1->set_flip_screen(flip); - m_tilegen2->set_flip_screen(flip); - m_tilegen3->set_flip_screen(flip); + bool flip = m_tilegen[0]->get_flip_state(); + m_tilegen[0]->set_flip_screen(flip); + m_tilegen[1]->set_flip_screen(flip); + m_tilegen[2]->set_flip_screen(flip); m_spritegen->set_flip_screen(flip); if (m_pri & 0x04) @@ -105,21 +105,21 @@ uint32_t dec0_state::screen_update_robocop(screen_device &screen, bitmap_ind16 & /* Robocop uses it only for the title screen, so this might be just */ /* completely wrong. The top 8 bits of the register might mean */ /* something (they are 0x80 in midres, 0x00 here) */ - m_tilegen2->deco_bac06_pf_draw(bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); + m_tilegen[1]->deco_bac06_pf_draw(bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); if (m_pri & 0x02) m_spritegen->draw_sprites(bitmap, cliprect, m_buffered_spriteram, 0x08, trans, 0x0f); - m_tilegen3->deco_bac06_pf_draw(bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); + m_tilegen[2]->deco_bac06_pf_draw(bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); } else { - m_tilegen3->deco_bac06_pf_draw(bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); + m_tilegen[2]->deco_bac06_pf_draw(bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); if (m_pri & 0x02) m_spritegen->draw_sprites(bitmap, cliprect, m_buffered_spriteram, 0x08, trans, 0x0f); - m_tilegen2->deco_bac06_pf_draw(bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); + m_tilegen[1]->deco_bac06_pf_draw(bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); } if (m_pri & 0x02) @@ -127,7 +127,7 @@ uint32_t dec0_state::screen_update_robocop(screen_device &screen, bitmap_ind16 & else m_spritegen->draw_sprites(bitmap, cliprect, m_buffered_spriteram, 0x00, 0x00, 0x0f); - m_tilegen1->deco_bac06_pf_draw(bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); + m_tilegen[0]->deco_bac06_pf_draw(bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); return 0; } @@ -140,36 +140,36 @@ uint32_t dec0_automat_state::screen_update_automat(screen_device &screen, bitmap // the bootleg doesn't write these registers, I think they're hardcoded?, so fake them for compatibility with our implementation.. address_space &space = machine().dummy_space(); - m_tilegen1->pf_control_0_w(space,0,0x0003, 0x00ff); // 8x8 - m_tilegen1->pf_control_0_w(space,1,0x0003, 0x00ff); - m_tilegen1->pf_control_0_w(space,2,0x0000, 0x00ff); - m_tilegen1->pf_control_0_w(space,3,0x0001, 0x00ff); // dimensions + m_tilegen[0]->pf_control_0_w(space,0,0x0003, 0x00ff); // 8x8 + m_tilegen[0]->pf_control_0_w(space,1,0x0003, 0x00ff); + m_tilegen[0]->pf_control_0_w(space,2,0x0000, 0x00ff); + m_tilegen[0]->pf_control_0_w(space,3,0x0001, 0x00ff); // dimensions - m_tilegen2->pf_control_0_w(space,0,0x0082, 0x00ff); // 16x16 - m_tilegen2->pf_control_0_w(space,1,0x0000, 0x00ff); - m_tilegen2->pf_control_0_w(space,2,0x0000, 0x00ff); - m_tilegen2->pf_control_0_w(space,3,0x0001, 0x00ff); // dimensions + m_tilegen[1]->pf_control_0_w(space,0,0x0082, 0x00ff); // 16x16 + m_tilegen[1]->pf_control_0_w(space,1,0x0000, 0x00ff); + m_tilegen[1]->pf_control_0_w(space,2,0x0000, 0x00ff); + m_tilegen[1]->pf_control_0_w(space,3,0x0001, 0x00ff); // dimensions - m_tilegen3->pf_control_0_w(space,0,0x0082, 0x00ff); // 16x16 - m_tilegen3->pf_control_0_w(space,1,0x0003, 0x00ff); - m_tilegen3->pf_control_0_w(space,2,0x0000, 0x00ff); - m_tilegen3->pf_control_0_w(space,3,0x0001, 0x00ff); // dimensions + m_tilegen[2]->pf_control_0_w(space,0,0x0082, 0x00ff); // 16x16 + m_tilegen[2]->pf_control_0_w(space,1,0x0003, 0x00ff); + m_tilegen[2]->pf_control_0_w(space,2,0x0000, 0x00ff); + m_tilegen[2]->pf_control_0_w(space,3,0x0001, 0x00ff); // dimensions // scroll registers got written elsewhere, copy them across - m_tilegen1->pf_control_1_w(space,0,0x0000, 0xffff); // no scroll? - m_tilegen1->pf_control_1_w(space,1,0x0000, 0xffff); // no scroll? + m_tilegen[0]->pf_control_1_w(space,0,0x0000, 0xffff); // no scroll? + m_tilegen[0]->pf_control_1_w(space,1,0x0000, 0xffff); // no scroll? - m_tilegen2->pf_control_1_w(space,0,m_automat_scroll_regs[3] - 0x010a, 0xffff); - m_tilegen2->pf_control_1_w(space,1,m_automat_scroll_regs[2], 0xffff); + m_tilegen[1]->pf_control_1_w(space,0,m_automat_scroll_regs[3] - 0x010a, 0xffff); + m_tilegen[1]->pf_control_1_w(space,1,m_automat_scroll_regs[2], 0xffff); - m_tilegen3->pf_control_1_w(space,0,m_automat_scroll_regs[1] - 0x0108, 0xffff); - m_tilegen3->pf_control_1_w(space,1,m_automat_scroll_regs[0], 0xffff); + m_tilegen[2]->pf_control_1_w(space,0,m_automat_scroll_regs[1] - 0x0108, 0xffff); + m_tilegen[2]->pf_control_1_w(space,1,m_automat_scroll_regs[0], 0xffff); - bool flip = m_tilegen1->get_flip_state(); - m_tilegen1->set_flip_screen(flip); - m_tilegen2->set_flip_screen(flip); - m_tilegen3->set_flip_screen(flip); + bool flip = m_tilegen[0]->get_flip_state(); + m_tilegen[0]->set_flip_screen(flip); + m_tilegen[1]->set_flip_screen(flip); + m_tilegen[2]->set_flip_screen(flip); m_spritegen->set_flip_screen(flip); if (m_pri & 0x04) @@ -179,21 +179,21 @@ uint32_t dec0_automat_state::screen_update_automat(screen_device &screen, bitmap if (m_pri & 0x01) { - m_tilegen2->deco_bac06_pf_draw(bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); + m_tilegen[1]->deco_bac06_pf_draw(bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); if (m_pri & 0x02) m_spritegen->draw_sprites(bitmap, cliprect, m_buffered_spriteram, 0x08, trans, 0x0f); - m_tilegen3->deco_bac06_pf_draw(bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); + m_tilegen[2]->deco_bac06_pf_draw(bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); } else { - m_tilegen3->deco_bac06_pf_draw(bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); + m_tilegen[2]->deco_bac06_pf_draw(bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); if (m_pri & 0x02) m_spritegen->draw_sprites(bitmap, cliprect, m_buffered_spriteram, 0x08, trans, 0x0f); - m_tilegen2->deco_bac06_pf_draw(bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); + m_tilegen[1]->deco_bac06_pf_draw(bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); } if (m_pri & 0x02) @@ -201,7 +201,7 @@ uint32_t dec0_automat_state::screen_update_automat(screen_device &screen, bitmap else m_spritegen->draw_sprites_bootleg(bitmap, cliprect, m_buffered_spriteram, 0x00, 0x00, 0x0f); - m_tilegen1->deco_bac06_pf_draw(bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); + m_tilegen[0]->deco_bac06_pf_draw(bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); return 0; } @@ -211,47 +211,47 @@ uint32_t dec0_automat_state::screen_update_secretab(screen_device &screen, bitma // the bootleg doesn't write these registers, I think they're hardcoded?, so fake them for compatibility with our implementation.. address_space &space = machine().dummy_space(); - m_tilegen1->pf_control_0_w(space,0,0x0003, 0x00ff); // 8x8 - m_tilegen1->pf_control_0_w(space,1,0x0003, 0x00ff); - m_tilegen1->pf_control_0_w(space,2,0x0000, 0x00ff); - m_tilegen1->pf_control_0_w(space,3,0x0001, 0x00ff); // dimensions + m_tilegen[0]->pf_control_0_w(space,0,0x0003, 0x00ff); // 8x8 + m_tilegen[0]->pf_control_0_w(space,1,0x0003, 0x00ff); + m_tilegen[0]->pf_control_0_w(space,2,0x0000, 0x00ff); + m_tilegen[0]->pf_control_0_w(space,3,0x0001, 0x00ff); // dimensions - m_tilegen2->pf_control_0_w(space,0,0x0082, 0x00ff); // 16x16 - m_tilegen2->pf_control_0_w(space,1,0x0000, 0x00ff); - m_tilegen2->pf_control_0_w(space,2,0x0000, 0x00ff); - m_tilegen2->pf_control_0_w(space,3,0x0001, 0x00ff); // dimensions + m_tilegen[1]->pf_control_0_w(space,0,0x0082, 0x00ff); // 16x16 + m_tilegen[1]->pf_control_0_w(space,1,0x0000, 0x00ff); + m_tilegen[1]->pf_control_0_w(space,2,0x0000, 0x00ff); + m_tilegen[1]->pf_control_0_w(space,3,0x0001, 0x00ff); // dimensions - m_tilegen3->pf_control_0_w(space,0,0x0082, 0x00ff); // 16x16 - m_tilegen3->pf_control_0_w(space,1,0x0003, 0x00ff); - m_tilegen3->pf_control_0_w(space,2,0x0000, 0x00ff); - m_tilegen3->pf_control_0_w(space,3,0x0001, 0x00ff); // dimensions + m_tilegen[2]->pf_control_0_w(space,0,0x0082, 0x00ff); // 16x16 + m_tilegen[2]->pf_control_0_w(space,1,0x0003, 0x00ff); + m_tilegen[2]->pf_control_0_w(space,2,0x0000, 0x00ff); + m_tilegen[2]->pf_control_0_w(space,3,0x0001, 0x00ff); // dimensions // scroll registers got written elsewhere, copy them across - m_tilegen1->pf_control_1_w(space,0,0x0000, 0xffff); // no scroll? - m_tilegen1->pf_control_1_w(space,1,0x0000, 0xffff); // no scroll? + m_tilegen[0]->pf_control_1_w(space,0,0x0000, 0xffff); // no scroll? + m_tilegen[0]->pf_control_1_w(space,1,0x0000, 0xffff); // no scroll? - m_tilegen2->pf_control_1_w(space,0,m_automat_scroll_regs[3] - 0x010a, 0xffff); - m_tilegen2->pf_control_1_w(space,1,m_automat_scroll_regs[2], 0xffff); + m_tilegen[1]->pf_control_1_w(space,0,m_automat_scroll_regs[3] - 0x010a, 0xffff); + m_tilegen[1]->pf_control_1_w(space,1,m_automat_scroll_regs[2], 0xffff); - m_tilegen3->pf_control_1_w(space,0,m_automat_scroll_regs[1] - 0x0108, 0xffff); - m_tilegen3->pf_control_1_w(space,1,m_automat_scroll_regs[0], 0xffff); + m_tilegen[2]->pf_control_1_w(space,0,m_automat_scroll_regs[1] - 0x0108, 0xffff); + m_tilegen[2]->pf_control_1_w(space,1,m_automat_scroll_regs[0], 0xffff); - bool flip = m_tilegen1->get_flip_state(); - m_tilegen1->set_flip_screen(flip); - m_tilegen2->set_flip_screen(flip); - m_tilegen3->set_flip_screen(flip); + bool flip = m_tilegen[0]->get_flip_state(); + m_tilegen[0]->set_flip_screen(flip); + m_tilegen[1]->set_flip_screen(flip); + m_tilegen[2]->set_flip_screen(flip); m_spritegen->set_flip_screen(flip); - m_tilegen3->deco_bac06_pf_draw(bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); - m_tilegen2->deco_bac06_pf_draw(bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); + m_tilegen[2]->deco_bac06_pf_draw(bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); + m_tilegen[1]->deco_bac06_pf_draw(bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); m_spritegen->draw_sprites_bootleg(bitmap, cliprect, m_buffered_spriteram, 0x00, 0x00, 0x0f); /* Redraw top 8 pens of top 8 palettes over sprites */ if (m_pri&0x80) - m_tilegen2->deco_bac06_pf_draw(bitmap,cliprect,0,0x08,0x08,0x08,0x08); // upper 8 pens of upper 8 priority marked tiles + m_tilegen[1]->deco_bac06_pf_draw(bitmap,cliprect,0,0x08,0x08,0x08,0x08); // upper 8 pens of upper 8 priority marked tiles - m_tilegen1->deco_bac06_pf_draw(bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); + m_tilegen[0]->deco_bac06_pf_draw(bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); return 0; } @@ -260,17 +260,17 @@ uint32_t dec0_automat_state::screen_update_secretab(screen_device &screen, bitma uint32_t dec0_state::screen_update_birdtry(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { - bool flip = m_tilegen1->get_flip_state(); - m_tilegen1->set_flip_screen(flip); - m_tilegen2->set_flip_screen(flip); + bool flip = m_tilegen[0]->get_flip_state(); + m_tilegen[0]->set_flip_screen(flip); + m_tilegen[1]->set_flip_screen(flip); m_spritegen->set_flip_screen(flip); /* This game doesn't have the extra playfield chip on the game board, but the palette does show through. */ bitmap.fill(m_palette->pen(768), cliprect); - m_tilegen2->deco_bac06_pf_draw(bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); + m_tilegen[1]->deco_bac06_pf_draw(bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); m_spritegen->draw_sprites(bitmap, cliprect, m_buffered_spriteram, 0x00, 0x00, 0x0f); - m_tilegen1->deco_bac06_pf_draw(bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); + m_tilegen[0]->deco_bac06_pf_draw(bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); return 0; } @@ -278,25 +278,25 @@ uint32_t dec0_state::screen_update_birdtry(screen_device &screen, bitmap_ind16 & uint32_t dec0_state::screen_update_hippodrm(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { - bool flip = m_tilegen1->get_flip_state(); - m_tilegen1->set_flip_screen(flip); - m_tilegen2->set_flip_screen(flip); - m_tilegen3->set_flip_screen(flip); + bool flip = m_tilegen[0]->get_flip_state(); + m_tilegen[0]->set_flip_screen(flip); + m_tilegen[1]->set_flip_screen(flip); + m_tilegen[2]->set_flip_screen(flip); m_spritegen->set_flip_screen(flip); if (m_pri & 0x01) { - m_tilegen2->deco_bac06_pf_draw(bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); - m_tilegen3->deco_bac06_pf_draw(bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); + m_tilegen[1]->deco_bac06_pf_draw(bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); + m_tilegen[2]->deco_bac06_pf_draw(bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); } else { - m_tilegen3->deco_bac06_pf_draw(bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); - m_tilegen2->deco_bac06_pf_draw(bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); + m_tilegen[2]->deco_bac06_pf_draw(bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); + m_tilegen[1]->deco_bac06_pf_draw(bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); } m_spritegen->draw_sprites(bitmap, cliprect, m_buffered_spriteram, 0x00, 0x00, 0x0f); - m_tilegen1->deco_bac06_pf_draw(bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); + m_tilegen[0]->deco_bac06_pf_draw(bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); return 0; } @@ -304,22 +304,22 @@ uint32_t dec0_state::screen_update_hippodrm(screen_device &screen, bitmap_ind16 uint32_t dec0_state::screen_update_slyspy(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { - bool flip = m_tilegen1->get_flip_state(); - m_tilegen1->set_flip_screen(flip); - m_tilegen2->set_flip_screen(flip); - m_tilegen3->set_flip_screen(flip); + bool flip = m_tilegen[0]->get_flip_state(); + m_tilegen[0]->set_flip_screen(flip); + m_tilegen[1]->set_flip_screen(flip); + m_tilegen[2]->set_flip_screen(flip); m_spritegen->set_flip_screen(flip); - m_tilegen3->deco_bac06_pf_draw(bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); - m_tilegen2->deco_bac06_pf_draw(bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); + m_tilegen[2]->deco_bac06_pf_draw(bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); + m_tilegen[1]->deco_bac06_pf_draw(bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); m_spritegen->draw_sprites(bitmap, cliprect, m_buffered_spriteram, 0x00, 0x00, 0x0f); /* Redraw top 8 pens of top 8 palettes over sprites */ if (m_pri&0x80) - m_tilegen2->deco_bac06_pf_draw(bitmap,cliprect,0,0x08,0x08,0x08,0x08); // upper 8 pens of upper 8 priority marked tiles + m_tilegen[1]->deco_bac06_pf_draw(bitmap,cliprect,0,0x08,0x08,0x08,0x08); // upper 8 pens of upper 8 priority marked tiles - m_tilegen1->deco_bac06_pf_draw(bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); + m_tilegen[0]->deco_bac06_pf_draw(bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); return 0; } @@ -329,10 +329,10 @@ uint32_t dec0_state::screen_update_midres(screen_device &screen, bitmap_ind16 &b { int trans; - bool flip = m_tilegen1->get_flip_state(); - m_tilegen1->set_flip_screen(flip); - m_tilegen2->set_flip_screen(flip); - m_tilegen3->set_flip_screen(flip); + bool flip = m_tilegen[0]->get_flip_state(); + m_tilegen[0]->set_flip_screen(flip); + m_tilegen[1]->set_flip_screen(flip); + m_tilegen[2]->set_flip_screen(flip); m_spritegen->set_flip_screen(flip); if (m_pri & 0x04) @@ -341,21 +341,21 @@ uint32_t dec0_state::screen_update_midres(screen_device &screen, bitmap_ind16 &b if (m_pri & 0x01) { - m_tilegen2->deco_bac06_pf_draw(bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); + m_tilegen[1]->deco_bac06_pf_draw(bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); if (m_pri & 0x02) m_spritegen->draw_sprites(bitmap, cliprect, m_buffered_spriteram, 0x08, trans, 0x0f); - m_tilegen3->deco_bac06_pf_draw(bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); + m_tilegen[2]->deco_bac06_pf_draw(bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); } else { - m_tilegen3->deco_bac06_pf_draw(bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); + m_tilegen[2]->deco_bac06_pf_draw(bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); if (m_pri & 0x02) m_spritegen->draw_sprites(bitmap, cliprect, m_buffered_spriteram, 0x08, trans, 0x0f); - m_tilegen2->deco_bac06_pf_draw(bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); + m_tilegen[1]->deco_bac06_pf_draw(bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); } if (m_pri & 0x02) @@ -363,7 +363,7 @@ uint32_t dec0_state::screen_update_midres(screen_device &screen, bitmap_ind16 &b else m_spritegen->draw_sprites(bitmap, cliprect, m_buffered_spriteram, 0x00, 0x00, 0x0f); - m_tilegen1->deco_bac06_pf_draw(bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); + m_tilegen[0]->deco_bac06_pf_draw(bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); return 0; } diff --git a/src/mame/video/decbac06.cpp b/src/mame/video/decbac06.cpp index 8f30ba0d737..590a569e245 100644 --- a/src/mame/video/decbac06.cpp +++ b/src/mame/video/decbac06.cpp @@ -68,23 +68,23 @@ Priority word (Midres): DEFINE_DEVICE_TYPE(DECO_BAC06, deco_bac06_device, "deco_back06", "DECO BAC06 Tilemap") deco_bac06_device::deco_bac06_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, DECO_BAC06, tag, owner, clock), - m_pf_data(nullptr), - m_pf_rowscroll(nullptr), - m_pf_colscroll(nullptr), - m_tile_region_8(0), - m_tile_region_16(0), - m_supports_8x8(true), - m_supports_16x16(true), - m_supports_rc_scroll(true), - m_gfxcolmask(0), - m_rambank(0), - m_gfxregion8x8(0), - m_gfxregion16x16(0), - m_wide(0), - m_bppmult(0), - m_bppmask(0), - m_gfxdecode(*this, finder_base::DUMMY_TAG) + : device_t(mconfig, DECO_BAC06, tag, owner, clock) + , m_pf_data(nullptr) + , m_pf_rowscroll(nullptr) + , m_pf_colscroll(nullptr) + , m_tile_region_8(0) + , m_tile_region_16(0) + , m_supports_8x8(true) + , m_supports_16x16(true) + , m_supports_rc_scroll(true) + , m_gfxcolmask(0) + , m_rambank(0) + , m_gfxregion8x8(0) + , m_gfxregion16x16(0) + , m_wide(0) + , m_bppmult(0) + , m_bppmask(0) + , m_gfxdecode(*this, finder_base::DUMMY_TAG) { for (int i = 0; i < 8; i++) { @@ -282,7 +282,7 @@ void deco_bac06_device::custom_tilemap_draw(bitmap_ind16 &bitmap, else src_y = scrolly; - for (y=0; y<=cliprect.max_y; y++) { + for (y=0; y<=cliprect.bottom(); y++) { if (row_scroll_enabled) src_x=scrollx + rowscroll_ptr[(src_y >> (control1[3]&0xf))&(0x1ff>>(control1[3]&0xf))]; else @@ -291,7 +291,7 @@ void deco_bac06_device::custom_tilemap_draw(bitmap_ind16 &bitmap, if (m_flip_screen) src_x=(src_bitmap.width() - 256) - src_x; - for (x=0; x<=cliprect.max_x; x++) { + for (x=0; x<=cliprect.right(); x++) { if (col_scroll_enabled) column_offset=colscroll_ptr[((src_x >> 3) >> (control1[2]&0xf))&(0x3f>>(control1[2]&0xf))]; diff --git a/src/mame/video/deco16ic.cpp b/src/mame/video/deco16ic.cpp index 7ff4d8dc5e6..b7e2dca7739 100644 --- a/src/mame/video/deco16ic.cpp +++ b/src/mame/video/deco16ic.cpp @@ -460,8 +460,8 @@ void deco16ic_device::custom_tilemap_draw( if (!BIT(control0, 7)) return; - int starty = cliprect.min_y; - int endy = cliprect.max_y+1; + int starty = cliprect.top(); + int endy = cliprect.bottom() + 1; width_mask = src_bitmap0->width() - 1; height_mask = src_bitmap0->height() - 1; diff --git a/src/mame/video/deco32.cpp b/src/mame/video/deco32.cpp index 75fdba3b035..6db1f9a645d 100644 --- a/src/mame/video/deco32.cpp +++ b/src/mame/video/deco32.cpp @@ -184,9 +184,9 @@ uint32_t dragngun_state::screen_update_dragngun(screen_device &screen, bitmap_rg // // really, it needs optimizing .. // so for now we only draw these 2 layers on the last update call - if (cliprect.max_y == 247) + if (cliprect.bottom() == 247) { - rectangle clip(cliprect.min_x, cliprect.max_x, 8, 247); + rectangle clip(cliprect.left(), cliprect.right(), 8, 247); m_sprgenzoom->dragngun_draw_sprites(bitmap,clip,m_spriteram->buffer(), m_sprite_layout_ram[0], m_sprite_layout_ram[1], m_sprite_lookup_ram[0], m_sprite_lookup_ram[1], m_sprite_ctrl, screen.priority(), m_temp_render_bitmap ); diff --git a/src/mame/video/deco_mlc.cpp b/src/mame/video/deco_mlc.cpp index 273fc492444..6c60a5f6e7b 100644 --- a/src/mame/video/deco_mlc.cpp +++ b/src/mame/video/deco_mlc.cpp @@ -74,16 +74,16 @@ void deco_mlc_state::drawgfxzoomline(uint32_t* dest,const rectangle &clip,gfx_el x_index_base = 0; } - if( sx < clip.min_x) + if( sx < clip.left()) { /* clip left */ - int pixels = clip.min_x-sx; + int pixels = clip.left()-sx; sx += pixels; x_index_base += pixels*dx; } /* NS 980211 - fixed incorrect clipping */ - if( ex > clip.max_x+1 ) + if( ex > clip.right()+1 ) { /* clip right */ - int pixels = ex-clip.max_x-1; + int pixels = ex-clip.right()-1; ex -= pixels; } @@ -245,16 +245,11 @@ void deco_mlc_state::draw_sprites( const rectangle &cliprect, int scanline, uint int min_y = m_clip_ram[(clipper*4)+0]; int max_y = m_clip_ram[(clipper*4)+1]; - if (scanline<min_y) + if ((scanline<min_y) || (scanline>max_y)) continue; - if (scanline>max_y) - continue; - - - user_clip.min_x=m_clip_ram[(clipper*4)+2]; - user_clip.max_x=m_clip_ram[(clipper*4)+3]; + user_clip.setx(m_clip_ram[(clipper*4)+2], m_clip_ram[(clipper*4)+3]); user_clip &= cliprect; /* Any colours out of range (for the bpp value) trigger 'shadow' mode */ @@ -548,7 +543,7 @@ uint32_t deco_mlc_state::screen_update(screen_device &screen, bitmap_rgb32 &bitm // temp_bitmap->fill(0, cliprect); bitmap.fill(m_palette->pen(0), cliprect); /* Pen 0 fill colour confirmed from Skull Fang level 2 */ - for (int i=cliprect.min_y;i<=cliprect.max_y;i++) + for (int i=cliprect.top();i<=cliprect.bottom();i++) { uint32_t *dest = &bitmap.pix32(i); diff --git a/src/mame/video/deco_zoomspr.cpp b/src/mame/video/deco_zoomspr.cpp index d63941c62a4..e930e82d458 100644 --- a/src/mame/video/deco_zoomspr.cpp +++ b/src/mame/video/deco_zoomspr.cpp @@ -93,27 +93,27 @@ inline void deco_zoomspr_device::dragngun_drawgfxzoom( y_index = 0; } - if( sx < clip.min_x) + if( sx < clip.left()) { /* clip left */ - int pixels = clip.min_x-sx; + int pixels = clip.left()-sx; sx += pixels; x_index_base += pixels*dx; } - if( sy < clip.min_y ) + if( sy < clip.top() ) { /* clip top */ - int pixels = clip.min_y-sy; + int pixels = clip.top()-sy; sy += pixels; y_index += pixels*dy; } /* NS 980211 - fixed incorrect clipping */ - if( ex > clip.max_x+1 ) + if( ex > clip.right()+1 ) { /* clip right */ - int pixels = ex-clip.max_x-1; + int pixels = ex-clip.right()-1; ex -= pixels; } - if( ey > clip.max_y+1 ) + if( ey > clip.bottom()+1 ) { /* clip bottom */ - int pixels = ey-clip.max_y-1; + int pixels = ey-clip.bottom()-1; ey -= pixels; } @@ -396,12 +396,12 @@ void deco_zoomspr_device::dragngun_draw_sprites( bitmap_rgb32 &bitmap, const rec } } - for (int y = cliprect.min_y; y <= cliprect.max_y; y++) + for (int y = cliprect.top(); y <= cliprect.bottom(); y++) { uint32_t *src = &temp_bitmap.pix32(y); uint32_t *dst = &bitmap.pix32(y); - for (int x = cliprect.min_x; x <= cliprect.max_x; x++) + for (int x = cliprect.left(); x <= cliprect.right(); x++) { uint32_t srcpix = src[x]; diff --git a/src/mame/video/decocass.cpp b/src/mame/video/decocass.cpp index a93edf2fbfc..bf06d8cd5a9 100644 --- a/src/mame/video/decocass.cpp +++ b/src/mame/video/decocass.cpp @@ -252,10 +252,10 @@ void decocass_state::draw_special_priority(bitmap_ind16 &bitmap, bitmap_ind8 &pr const uint8_t *objdata1 = m_gfxdecode->gfx(3)->get_data(1); assert(m_gfxdecode->gfx(3)->rowbytes() == 64); - for (int y = cliprect.min_y; y <= cliprect.max_y; y++) + for (int y = cliprect.top(); y <= cliprect.bottom(); y++) { const int dy = y - sy; - for (int x = cliprect.min_x; x <= cliprect.max_x; x++) + for (int x = cliprect.left(); x <= cliprect.right(); x++) { const int dx = x - sx; @@ -308,7 +308,7 @@ void decocass_state::draw_center(bitmap_ind16 &bitmap, const rectangle &cliprect sx = (m_center_h_shift_space >> 2) & 0x3c; for (y = 0; y < 4; y++) - if ((sy + y) >= cliprect.min_y && (sy + y) <= cliprect.max_y) + if ((sy + y) >= cliprect.top() && (sy + y) <= cliprect.bottom()) { if (((sy + y) & m_color_center_bot & 3) == (sy & m_color_center_bot & 3)) for (x = 0; x < 256; x++) @@ -588,10 +588,10 @@ void decocass_state::draw_missiles(bitmap_ind16 &bitmap, bitmap_ind8 &priority, sy = 240 - sy + missile_y_adjust_flip_screen; } sy -= missile_y_adjust; - if (sy >= cliprect.min_y && sy <= cliprect.max_y) + if (sy >= cliprect.top() && sy <= cliprect.bottom()) for (x = 0; x < 4; x++) { - if (sx >= cliprect.min_x && sx <= cliprect.max_x) + if (sx >= cliprect.left() && sx <= cliprect.right()) { bitmap.pix16(sy, sx) = (m_color_missiles & 7) | 8; priority.pix8(sy, sx) |= 1 << 2; @@ -607,10 +607,10 @@ void decocass_state::draw_missiles(bitmap_ind16 &bitmap, bitmap_ind8 &priority, sy = 240 - sy + missile_y_adjust_flip_screen; } sy -= missile_y_adjust; - if (sy >= cliprect.min_y && sy <= cliprect.max_y) + if (sy >= cliprect.top() && sy <= cliprect.bottom()) for (x = 0; x < 4; x++) { - if (sx >= cliprect.min_x && sx <= cliprect.max_x) + if (sx >= cliprect.left() && sx <= cliprect.right()) { bitmap.pix16(sy, sx) = ((m_color_missiles >> 4) & 7) | 8; priority.pix8(sy, sx) |= 1 << 3; @@ -663,13 +663,13 @@ void decocass_state::draw_edge(bitmap_ind16 &bitmap, const rectangle &cliprect, // technically our y drawing probably shouldn't wrap / mask, but simply draw the 128pixel high 'edge' at the requested position // see note above this funciton - for (y=clip.min_y; y<=clip.max_y;y++) + for (y=clip.top(); y<=clip.bottom(); y++) { int srcline = (y + scrolly) & 0x1ff; uint16_t* src = &srcbitmap->pix16(srcline); uint16_t* dst = &bitmap.pix16(y); - for (x=clip.min_x; x<=clip.max_x;x++) + for (x=clip.left(); x<=clip.right(); x++) { int srccol = 0; diff --git a/src/mame/video/decospr.cpp b/src/mame/video/decospr.cpp index ba893bf3726..bdd2d1a02f9 100644 --- a/src/mame/video/decospr.cpp +++ b/src/mame/video/decospr.cpp @@ -183,7 +183,7 @@ void decospr_device::alloc_sprite_bitmap() template<class _BitmapClass> void decospr_device::draw_sprites_common(_BitmapClass &bitmap, const rectangle &cliprect, uint16_t* spriteram, int sizewords) { - //printf("cliprect %04x, %04x\n", cliprect.min_y, cliprect.max_y); + //printf("cliprect %04x, %04x\n", cliprect.top(), cliprect.bottom()); if (m_sprite_bitmap.valid() && !m_pri_cb.isnull()) fatalerror("m_sprite_bitmap && m_pri_cb is invalid\n"); @@ -274,7 +274,7 @@ void decospr_device::draw_sprites_common(_BitmapClass &bitmap, const rectangle & y = ((y&0x1ff) + m_y_offset)&0x1ff; - if (cliprect.max_x>256) + if (cliprect.right()>256) { x = x & 0x01ff; y = y & 0x01ff; @@ -318,7 +318,7 @@ void decospr_device::draw_sprites_common(_BitmapClass &bitmap, const rectangle & if (flipscreen ^ m_flipallx) { - if (cliprect.max_x>256) + if (cliprect.right()>256) x = 304 - x; else x = 240 - x; @@ -334,11 +334,11 @@ void decospr_device::draw_sprites_common(_BitmapClass &bitmap, const rectangle & { int ypos; ypos = y + mult * multi; - if ((ypos<=cliprect.max_y) && (ypos>=(cliprect.min_y)-16)) + if ((ypos<=cliprect.bottom()) && (ypos>=(cliprect.top())-16)) { if(!m_sprite_bitmap.valid()) { - if ((ypos<=cliprect.max_y) && (ypos>=(cliprect.min_y)-16)) + if ((ypos<=cliprect.bottom()) && (ypos>=(cliprect.top())-16)) { if (!m_pri_cb.isnull()) m_gfxdecode->gfx(m_gfxregion)->prio_transpen(bitmap,cliprect, @@ -463,7 +463,7 @@ void decospr_device::draw_sprites_common(_BitmapClass &bitmap, const rectangle & { ypos = y + mult2 * (h-yy); - if ((ypos<=cliprect.max_y) && (ypos>=(cliprect.min_y)-16)) + if ((ypos<=cliprect.bottom()) && (ypos>=(cliprect.top())-16)) { m_gfxdecode->gfx(m_gfxregion)->prio_transpen(bitmap,cliprect, sprite + yy + h * xx, @@ -475,7 +475,7 @@ void decospr_device::draw_sprites_common(_BitmapClass &bitmap, const rectangle & ypos -= 512; // wrap-around y - if ((ypos<=cliprect.max_y) && (ypos>=(cliprect.min_y-16))) + if ((ypos<=cliprect.bottom()) && (ypos>=(cliprect.top()-16))) { m_gfxdecode->gfx(m_gfxregion)->prio_transpen(bitmap,cliprect, sprite + yy + h * xx, @@ -490,7 +490,7 @@ void decospr_device::draw_sprites_common(_BitmapClass &bitmap, const rectangle & { ypos = y + mult2 * (h-yy); - if ((ypos<=cliprect.max_y) && (ypos>=(cliprect.min_y)-16)) + if ((ypos<=cliprect.bottom()) && (ypos>=(cliprect.top())-16)) { m_gfxdecode->gfx(m_gfxregion)->transpen(bitmap,cliprect, sprite + yy + h * xx, @@ -502,7 +502,7 @@ void decospr_device::draw_sprites_common(_BitmapClass &bitmap, const rectangle & ypos -= 512; // wrap-around y - if ((ypos<=cliprect.max_y) && (ypos>=(cliprect.min_y-16))) + if ((ypos<=cliprect.bottom()) && (ypos>=(cliprect.top()-16))) { m_gfxdecode->gfx(m_gfxregion)->transpen(bitmap,cliprect, sprite + yy + h * xx, @@ -517,7 +517,7 @@ void decospr_device::draw_sprites_common(_BitmapClass &bitmap, const rectangle & { ypos = y + mult2 * (h-yy); - if ((ypos<=cliprect.max_y) && (ypos>=(cliprect.min_y)-16)) + if ((ypos<=cliprect.bottom()) && (ypos>=(cliprect.top())-16)) { m_gfxdecode->gfx(m_gfxregion)->transpen_raw(m_sprite_bitmap,cliprect, sprite + yy + h * xx, @@ -529,7 +529,7 @@ void decospr_device::draw_sprites_common(_BitmapClass &bitmap, const rectangle & ypos -= 512; // wrap-around y - if ((ypos<=cliprect.max_y) && (ypos>=(cliprect.min_y-16))) + if ((ypos<=cliprect.bottom()) && (ypos>=(cliprect.top()-16))) { m_gfxdecode->gfx(m_gfxregion)->transpen_raw(m_sprite_bitmap,cliprect, sprite + yy + h * xx, @@ -567,14 +567,14 @@ void decospr_device::inefficient_copy_sprite_bitmap(bitmap_rgb32 &bitmap, const uint16_t* srcline; uint32_t* dstline; - for (y=cliprect.min_y;y<=cliprect.max_y;y++) + for (y=cliprect.top();y<=cliprect.bottom();y++) { srcline= &m_sprite_bitmap.pix16(y); dstline= &bitmap.pix32(y); if (alpha==0xff) { - for (x=cliprect.min_x;x<=cliprect.max_x;x++) + for (x=cliprect.left();x<=cliprect.right();x++) { uint16_t pix = srcline[x]; @@ -589,7 +589,7 @@ void decospr_device::inefficient_copy_sprite_bitmap(bitmap_rgb32 &bitmap, const } else { - for (x=cliprect.min_x;x<=cliprect.max_x;x++) + for (x=cliprect.left();x<=cliprect.right();x++) { uint16_t pix = srcline[x]; diff --git a/src/mame/video/dragrace.cpp b/src/mame/video/dragrace.cpp index e28c710c854..d13441aed68 100644 --- a/src/mame/video/dragrace.cpp +++ b/src/mame/video/dragrace.cpp @@ -63,8 +63,7 @@ uint32_t dragrace_state::screen_update_dragrace(screen_device &screen, bitmap_in m_bg_tilemap->set_scrollx(0, 16 * xh + xl - 8); m_bg_tilemap->set_scrolly(0, 16 * yh + yl); - if (rect.min_y < y + 0) rect.min_y = y + 0; - if (rect.max_y > y + 3) rect.max_y = y + 3; + rect.sety((std::max)(rect.top(), y + 0), (std::min)(rect.bottom(), y + 3)); m_bg_tilemap->draw(screen, bitmap, rect, 0, 0); } diff --git a/src/mame/video/dynax.cpp b/src/mame/video/dynax.cpp index 347a69f4150..94933026f61 100644 --- a/src/mame/video/dynax.cpp +++ b/src/mame/video/dynax.cpp @@ -748,7 +748,7 @@ void dynax_state::jantouki_copylayer( bitmap_ind16 &bitmap, const rectangle &cli uint16_t *dst; uint16_t *dstbase = &bitmap.pix16(sy); - if ((sy < cliprect.min_y) || (sy > cliprect.max_y)) + if ((sy < cliprect.top()) || (sy > cliprect.bottom())) { src1 += 256; src2 += 256; @@ -912,7 +912,7 @@ int dynax_state::debug_viewer(bitmap_ind16 &bitmap, const rectangle &cliprect ) if (m_layer_layout != LAYOUT_MJDIALQ2) memset(m_pixmap[0][1].get(), 0, sizeof(uint8_t) * 0x100 * 0x100); for (m_hanamai_layer_half = 0; m_hanamai_layer_half < 2; m_hanamai_layer_half++) - blitter_drawgfx(0, 1, m_blitter_gfx, i, 0, cliprect.min_x, cliprect.min_y, 3, 0); + blitter_drawgfx(0, 1, m_blitter_gfx, i, 0, cliprect.left(), cliprect.top(), 3, 0); if (m_layer_layout != LAYOUT_MJDIALQ2) hanamai_copylayer(bitmap, cliprect, 0); diff --git a/src/mame/video/electron.cpp b/src/mame/video/electron.cpp index 64f6b1b11ec..a5050c3bcf4 100644 --- a/src/mame/video/electron.cpp +++ b/src/mame/video/electron.cpp @@ -85,13 +85,13 @@ inline void electron_state::electron_plot_pixel(bitmap_ind16 &bitmap, int x, int uint32_t electron_state::screen_update_electron(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { - int min_x = screen.visible_area().min_x; - int min_y = screen.visible_area().min_y; + int min_x = screen.visible_area().left(); + int min_y = screen.visible_area().top(); int x = min_x; int pal[16]; int scanline = screen.vpos(); rectangle r = cliprect; - r.min_y = r.max_y = scanline; + r.sety(scanline, scanline); /* set up palette */ switch( m_ula.screen_mode ) diff --git a/src/mame/video/eprom.cpp b/src/mame/video/eprom.cpp index 6fbb6e34657..93becde10bc 100644 --- a/src/mame/video/eprom.cpp +++ b/src/mame/video/eprom.cpp @@ -219,11 +219,11 @@ uint32_t eprom_state::screen_update_eprom(screen_device &screen, bitmap_ind16 &b // draw and merge the MO bitmap_ind16 &mobitmap = m_mob->bitmap(); for (const sparse_dirty_rect *rect = m_mob->first_dirty_rect(cliprect); rect != nullptr; rect = rect->next()) - for (int y = rect->min_y; y <= rect->max_y; y++) + for (int y = rect->top(); y <= rect->bottom(); y++) { uint16_t *mo = &mobitmap.pix16(y); uint16_t *pf = &bitmap.pix16(y); - for (int x = rect->min_x; x <= rect->max_x; x++) + for (int x = rect->left(); x <= rect->right(); x++) if (mo[x] != 0xffff) { /* verified from the GALs on the real PCB; equations follow @@ -325,11 +325,11 @@ uint32_t eprom_state::screen_update_eprom(screen_device &screen, bitmap_ind16 &b /* now go back and process the upper bit of MO priority */ for (const sparse_dirty_rect *rect = m_mob->first_dirty_rect(cliprect); rect != nullptr; rect = rect->next()) - for (int y = rect->min_y; y <= rect->max_y; y++) + for (int y = rect->top(); y <= rect->bottom(); y++) { uint16_t *mo = &mobitmap.pix16(y); uint16_t *pf = &bitmap.pix16(y); - for (int x = rect->min_x; x <= rect->max_x; x++) + for (int x = rect->left(); x <= rect->right(); x++) if (mo[x] != 0xffff) { int mopriority = mo[x] >> atari_motion_objects_device::PRIORITY_SHIFT; @@ -366,11 +366,11 @@ uint32_t eprom_state::screen_update_guts(screen_device &screen, bitmap_ind16 &bi // draw and merge the MO bitmap_ind16 &mobitmap = m_mob->bitmap(); for (const sparse_dirty_rect *rect = m_mob->first_dirty_rect(cliprect); rect != nullptr; rect = rect->next()) - for (int y = rect->min_y; y <= rect->max_y; y++) + for (int y = rect->top(); y <= rect->bottom(); y++) { uint16_t *mo = &mobitmap.pix16(y); uint16_t *pf = &bitmap.pix16(y); - for (int x = rect->min_x; x <= rect->max_x; x++) + for (int x = rect->left(); x <= rect->right(); x++) if (mo[x] != 0xffff) { int mopriority = (mo[x] >> atari_motion_objects_device::PRIORITY_SHIFT) & 7; @@ -391,11 +391,11 @@ uint32_t eprom_state::screen_update_guts(screen_device &screen, bitmap_ind16 &bi /* now go back and process the upper bit of MO priority */ for (const sparse_dirty_rect *rect = m_mob->first_dirty_rect(cliprect); rect != nullptr; rect = rect->next()) - for (int y = rect->min_y; y <= rect->max_y; y++) + for (int y = rect->top(); y <= rect->bottom(); y++) { uint16_t *mo = &mobitmap.pix16(y); uint16_t *pf = &bitmap.pix16(y); - for (int x = rect->min_x; x <= rect->max_x; x++) + for (int x = rect->left(); x <= rect->right(); x++) if (mo[x] != 0xffff) { int mopriority = mo[x] >> atari_motion_objects_device::PRIORITY_SHIFT; diff --git a/src/mame/video/equites.cpp b/src/mame/video/equites.cpp index 6df9a32706a..82dec063f58 100644 --- a/src/mame/video/equites.cpp +++ b/src/mame/video/equites.cpp @@ -338,13 +338,13 @@ void splndrbt_state::splndrbt_draw_sprites(bitmap_ind16 &bitmap, const rectangle { int const y = yhalf ? sy + 1 + yy : sy - yy; - if (y >= cliprect.min_y && y <= cliprect.max_y) + if (y >= cliprect.top() && y <= cliprect.bottom()) { for (x = 0; x <= (scalex << 1); ++x) { int bx = (sx + x) & 0xff; - if (bx >= cliprect.min_x && bx <= cliprect.max_x) + if (bx >= cliprect.left() && bx <= cliprect.right()) { int xx = scalex ? (x * 29 + scalex) / (scalex << 1) + 1 : 16; // FIXME This is wrong. Should use the PROM. int const offset = (fx ? (31 - xx) : xx) + ((fy ^ yhalf) ? (16 + line) : (15 - line)) * gfx->rowbytes(); @@ -382,7 +382,7 @@ void splndrbt_state::splndrbt_copy_bg(bitmap_ind16 &dst_bitmap, const rectangle for (dst_y = 32; dst_y < 256-32; ++dst_y) { - if (dst_y >= cliprect.min_y && dst_y <= cliprect.max_y) + if (dst_y >= cliprect.top() && dst_y <= cliprect.bottom()) { const uint8_t * const romline = &xrom[(dst_y ^ dinvert) << 5]; const uint16_t * const src_line = &src_bitmap.pix16((src_y + scroll_y) & 0x1ff); diff --git a/src/mame/video/exidy440.cpp b/src/mame/video/exidy440.cpp index 3aba8684ea7..12de6ba3be0 100644 --- a/src/mame/video/exidy440.cpp +++ b/src/mame/video/exidy440.cpp @@ -307,7 +307,7 @@ void exidy440_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, c uint8_t *src; /* skip if out of range */ - if (yoffs < cliprect.min_y || yoffs >= cliprect.max_y + 16) + if (yoffs < cliprect.top() || yoffs >= cliprect.bottom() + 16) continue; /* get a pointer to the source image */ @@ -328,11 +328,11 @@ void exidy440_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, c sy += (VBSTART - VBEND); /* stop if we get before the current scanline */ - if (yoffs < cliprect.min_y) + if (yoffs < cliprect.top()) break; /* only draw scanlines that are in this cliprect */ - if (yoffs <= cliprect.max_y) + if (yoffs <= cliprect.bottom()) { uint8_t *old = &m_local_videoram[sy * 512 + xoffs]; int currx = xoffs; @@ -389,8 +389,8 @@ void exidy440_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, c void exidy440_state::update_screen(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int scroll_offset, int check_collision) { /* draw any dirty scanlines from the VRAM directly */ - int sy = scroll_offset + cliprect.min_y; - for (int y = cliprect.min_y; y <= cliprect.max_y; y++, sy++) + int sy = scroll_offset + cliprect.top(); + for (int y = cliprect.top(); y <= cliprect.bottom(); y++, sy++) { /* wrap at the bottom of the screen */ if (sy >= VBSTART) @@ -418,7 +418,7 @@ uint32_t exidy440_state::screen_update_exidy440(screen_device &screen, bitmap_in update_screen(screen, bitmap, cliprect, 0, true); /* generate an interrupt once/frame for the beam */ - if (cliprect.max_y == screen.visible_area().max_y) + if (cliprect.bottom() == screen.visible_area().bottom()) { int i; diff --git a/src/mame/video/fantland.cpp b/src/mame/video/fantland.cpp index a1a64f97014..44a9a742e46 100644 --- a/src/mame/video/fantland.cpp +++ b/src/mame/video/fantland.cpp @@ -73,7 +73,7 @@ void fantland_state::draw_sprites(bitmap_ind16 &bitmap,const rectangle &cliprect // wheelrun is the only game with a smaller visible area const rectangle &visarea = m_screen->visible_area(); - int special = (visarea.max_y - visarea.min_y + 1) < 0x100; + int special = visarea.height() < 0x100; for ( ; ram < indx_ram; ram += 8,ram2++) { diff --git a/src/mame/video/firetrk.cpp b/src/mame/video/firetrk.cpp index c19477615ee..d59c205aab7 100644 --- a/src/mame/video/firetrk.cpp +++ b/src/mame/video/firetrk.cpp @@ -323,8 +323,8 @@ void firetrk_state::check_collision(int which) { int y, x; - for (y = playfield_window.min_y; y <= playfield_window.max_y; y++) - for (x = playfield_window.min_x; x <= playfield_window.max_x; x++) + for (y = playfield_window.top(); y <= playfield_window.bottom(); y++) + for (x = playfield_window.left(); x <= playfield_window.right(); x++) { pen_t a = m_helper1.pix16(y, x); pen_t b = m_helper2.pix16(y, x); @@ -353,7 +353,7 @@ uint32_t firetrk_state::screen_update_firetrk(screen_device &screen, bitmap_ind1 draw_text(bitmap, cliprect, m_alpha_num_ram + 0x00, 296, 0x10, 0x10); draw_text(bitmap, cliprect, m_alpha_num_ram + 0x10, 8, 0x10, 0x10); - if (cliprect.max_y == screen.visible_area().max_y) + if (cliprect.bottom() == screen.visible_area().bottom()) { m_tilemap2->draw(screen, m_helper1, playfield_window, 0, 0); @@ -386,7 +386,7 @@ uint32_t firetrk_state::screen_update_superbug(screen_device &screen, bitmap_ind draw_text(bitmap, cliprect, m_alpha_num_ram + 0x00, 296, 0x10, 0x10); draw_text(bitmap, cliprect, m_alpha_num_ram + 0x10, 8, 0x10, 0x10); - if (cliprect.max_y == screen.visible_area().max_y) + if (cliprect.bottom() == screen.visible_area().bottom()) { m_tilemap2->draw(screen, m_helper1, playfield_window, 0, 0); @@ -416,7 +416,7 @@ uint32_t firetrk_state::screen_update_montecar(screen_device &screen, bitmap_ind draw_text(bitmap, cliprect, m_alpha_num_ram + 0x00, 24, 0x20, 0x08); draw_text(bitmap, cliprect, m_alpha_num_ram + 0x20, 16, 0x20, 0x08); - if (cliprect.max_y == screen.visible_area().max_y) + if (cliprect.bottom() == screen.visible_area().bottom()) { m_tilemap2->draw(screen, m_helper1, playfield_window, 0, 0); diff --git a/src/mame/video/galaxia.cpp b/src/mame/video/galaxia.cpp index 94b6c423c61..6cfbcdb5e80 100644 --- a/src/mame/video/galaxia.cpp +++ b/src/mame/video/galaxia.cpp @@ -120,9 +120,9 @@ uint32_t galaxia_state::screen_update_galaxia(screen_device &screen, bitmap_ind1 cvs_update_stars(bitmap, cliprect, STAR_PEN, 1); m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0); - for (y = cliprect.min_y; y <= cliprect.max_y; y++) + for (y = cliprect.top(); y <= cliprect.bottom(); y++) { - for (x = cliprect.min_x; x <= cliprect.max_x; x++) + for (x = cliprect.left(); x <= cliprect.right(); x++) { bool bullet = m_bullet_ram[y] && x == (m_bullet_ram[y] ^ 0xff); bool background = (bitmap.pix16(y, x) & 3) != 0; @@ -185,7 +185,7 @@ uint32_t galaxia_state::screen_update_astrowar(screen_device &screen, bitmap_ind m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0); copybitmap(m_temp_bitmap, bitmap, 0, 0, 0, 0, cliprect); - for (y = cliprect.min_y; y <= cliprect.max_y; y++) + for (y = cliprect.top(); y <= cliprect.bottom(); y++) { // draw bullets (guesswork) if (m_bullet_ram[y]) @@ -201,14 +201,14 @@ uint32_t galaxia_state::screen_update_astrowar(screen_device &screen, bitmap_ind if (pos) bitmap.pix16(y, pos-1) = BULLET_PEN; } - for (x = cliprect.min_x; x <= cliprect.max_x; x++) + for (x = cliprect.left(); x <= cliprect.right(); x++) { // NOTE: similar to zac2650.c, the sprite chip runs at a different frequency than the background generator // the exact timing ratio is unknown, so we'll have to do with guesswork float s_ratio = 256.0f / 196.0f; float sx = x * s_ratio; - if ((int)(sx + 0.5f) > cliprect.max_x) + if (int(sx + 0.5f) > cliprect.right()) break; // copy the S2636 bitmap into the main bitmap and check collision @@ -217,11 +217,11 @@ uint32_t galaxia_state::screen_update_astrowar(screen_device &screen, bitmap_ind if (S2636_IS_PIXEL_DRAWN(pixel)) { // S2636 vs. background collision detection - if ((m_temp_bitmap.pix16(y, (int)(sx)) | m_temp_bitmap.pix16(y, (int)(sx + 0.5f))) & 1) + if ((m_temp_bitmap.pix16(y, int(sx)) | m_temp_bitmap.pix16(y, int(sx + 0.5f))) & 1) m_collision_register |= 0x01; - bitmap.pix16(y, (int)(sx)) = S2636_PIXEL_COLOR(pixel) | SPRITE_PEN_BASE; - bitmap.pix16(y, (int)(sx + 0.5f)) = S2636_PIXEL_COLOR(pixel) | SPRITE_PEN_BASE; + bitmap.pix16(y, int(sx)) = S2636_PIXEL_COLOR(pixel) | SPRITE_PEN_BASE; + bitmap.pix16(y, int(sx + 0.5f)) = S2636_PIXEL_COLOR(pixel) | SPRITE_PEN_BASE; } } } diff --git a/src/mame/video/galspnbl.cpp b/src/mame/video/galspnbl.cpp index 9b442a3b0bf..1c7308ff402 100644 --- a/src/mame/video/galspnbl.cpp +++ b/src/mame/video/galspnbl.cpp @@ -38,12 +38,12 @@ VIDEO_START_MEMBER(galspnbl_state,galspnbl) void galspnbl_state::mix_sprite_layer(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri) { - for (int y = cliprect.min_y; y <= cliprect.max_y; y++) + for (int y = cliprect.top(); y <= cliprect.bottom(); y++) { uint16_t *dd = &bitmap.pix16(y); uint16_t *sd2 = &m_sprite_bitmap.pix16(y); - for (int x = cliprect.min_x; x <= cliprect.max_x; x++) + for (int x = cliprect.left(); x <= cliprect.right(); x++) { uint16_t sprpixel = (sd2[x]); //uint16_t sprpri = (sprpixel >> 8) & 3; diff --git a/src/mame/video/gamate.cpp b/src/mame/video/gamate.cpp index 6d678a625e0..5bb9a1e771d 100644 --- a/src/mame/video/gamate.cpp +++ b/src/mame/video/gamate.cpp @@ -261,13 +261,13 @@ int gamate_video_device::get_pixel_from_vram(int x, int y) uint32_t gamate_video_device::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { - for (int y = cliprect.min_y; y <= cliprect.max_y; y++) + for (int y = cliprect.top(); y <= cliprect.bottom(); y++) { //printf("updating scanline %d\n", y); int real_x, real_y; get_real_x_and_y(real_x, real_y, y); - for (int x = cliprect.min_x; x <= cliprect.max_x; x++) + for (int x = cliprect.left(); x <= cliprect.right(); x++) { int pix = get_pixel_from_vram(x + real_x, real_y); diff --git a/src/mame/video/gameplan.cpp b/src/mame/video/gameplan.cpp index d1d4496d06f..4a32b30d685 100644 --- a/src/mame/video/gameplan.cpp +++ b/src/mame/video/gameplan.cpp @@ -315,26 +315,25 @@ VIDEO_RESET_MEMBER(gameplan_state,gameplan) * *************************************/ -MACHINE_CONFIG_START(gameplan_state::gameplan_video) +void gameplan_state::gameplan_video(machine_config &config) +{ MCFG_VIDEO_START_OVERRIDE(gameplan_state,gameplan) MCFG_VIDEO_RESET_OVERRIDE(gameplan_state,gameplan) - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_RAW_PARAMS(GAMEPLAN_PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART) - MCFG_SCREEN_UPDATE_DRIVER(gameplan_state, screen_update_gameplan) -MACHINE_CONFIG_END - + SCREEN(config, m_screen, SCREEN_TYPE_RASTER); + m_screen->set_raw(GAMEPLAN_PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART); + m_screen->set_screen_update(FUNC(gameplan_state::screen_update_gameplan)); +} -MACHINE_CONFIG_START(gameplan_state::leprechn_video) +void gameplan_state::leprechn_video(machine_config &config) +{ MCFG_VIDEO_START_OVERRIDE(gameplan_state,leprechn) - MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE_DRIVER(gameplan_state, screen_update_leprechn) -MACHINE_CONFIG_END - + m_screen->set_screen_update(FUNC(gameplan_state::screen_update_leprechn)); +} -MACHINE_CONFIG_START(gameplan_state::trvquest_video) +void gameplan_state::trvquest_video(machine_config &config) +{ gameplan_video(config); MCFG_VIDEO_START_OVERRIDE(gameplan_state,trvquest) - MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE_DRIVER(gameplan_state, screen_update_gameplan) -MACHINE_CONFIG_END + m_screen->set_screen_update(FUNC(gameplan_state::screen_update_gameplan)); +} diff --git a/src/mame/video/gauntlet.cpp b/src/mame/video/gauntlet.cpp index b003e45522b..e43f30c4d0a 100644 --- a/src/mame/video/gauntlet.cpp +++ b/src/mame/video/gauntlet.cpp @@ -168,11 +168,11 @@ uint32_t gauntlet_state::screen_update_gauntlet(screen_device &screen, bitmap_in /* draw and merge the MO */ bitmap_ind16 &mobitmap = m_mob->bitmap(); for (const sparse_dirty_rect *rect = m_mob->first_dirty_rect(cliprect); rect != nullptr; rect = rect->next()) - for (int y = rect->min_y; y <= rect->max_y; y++) + for (int y = rect->top(); y <= rect->bottom(); y++) { uint16_t *mo = &mobitmap.pix16(y); uint16_t *pf = &bitmap.pix16(y); - for (int x = rect->min_x; x <= rect->max_x; x++) + for (int x = rect->left(); x <= rect->right(); x++) if (mo[x] != 0xffff) { /* verified via schematics: diff --git a/src/mame/video/goldstar.cpp b/src/mame/video/goldstar.cpp index 369c6f89de1..6ea3770abf8 100644 --- a/src/mame/video/goldstar.cpp +++ b/src/mame/video/goldstar.cpp @@ -483,9 +483,9 @@ uint32_t wingco_state::screen_update_mbstar(screen_device &screen, bitmap_ind16 } // are these hardcoded, or registers? - const rectangle visible1(0*8, (14+48)*8-1, 4*8, (4+7)*8-1); + //const rectangle visible1(0*8, (14+48)*8-1, 4*8, (4+7)*8-1); const rectangle visible2(0*8, (14+48)*8-1, 14*8, (36+7)*8-1); // seems to be the one used... - const rectangle visible3(0*8, (14+48)*8-1, 4*8, (4+7)*8-1); + //const rectangle visible3(0*8, (14+48)*8-1, 4*8, (4+7)*8-1); // m_reel1_tilemap->draw(screen, bitmap, visible1, 0, 0); m_reel2_tilemap->draw(screen, bitmap, visible2, 0, 0); diff --git a/src/mame/video/harddriv.cpp b/src/mame/video/harddriv.cpp index 931ff46e207..e2da5ba8d83 100644 --- a/src/mame/video/harddriv.cpp +++ b/src/mame/video/harddriv.cpp @@ -420,7 +420,7 @@ TMS340X0_SCANLINE_IND16_CB_MEMBER(harddriv_state::scanline_driver) for (x = params->heblnk; x < params->hsblnk; x++) dest[x] = m_gfx_palettebank * 256 + vram_base[BYTE_XOR_LE(coladdr++ & 0xfff)]; - if (scanline == screen.visible_area().max_y) + if (scanline == screen.visible_area().bottom()) display_speedups(); } @@ -438,6 +438,6 @@ TMS340X0_SCANLINE_IND16_CB_MEMBER(harddriv_state::scanline_multisync) for (x = params->heblnk; x < params->hsblnk; x++) dest[x] = m_gfx_palettebank * 256 + vram_base[BYTE_XOR_LE(coladdr++ & 0x7ff)]; - if (scanline == screen.visible_area().max_y) + if (scanline == screen.visible_area().bottom()) display_speedups(); } diff --git a/src/mame/video/hng64_3d.hxx b/src/mame/video/hng64_3d.hxx index b0d711a3216..45ed1c0f685 100644 --- a/src/mame/video/hng64_3d.hxx +++ b/src/mame/video/hng64_3d.hxx @@ -742,7 +742,7 @@ void hng64_state::recoverPolygonBlock(const uint16_t* packet, int& numPolys) // TODO: We can eliminate this step with a matrix stack (maybe necessary?) // Note: fatfurwa's helicopter tracking in scene 3 of its intro shows one of these matrices isn't quite correct setIdentity(m_modelViewMatrix); - if (m_mcu_type != SAMSHO_MCU) + if (!m_samsho64_3d_hack) { // The sams64 games transform the geometry in front of a stationary camera. // This is fine in sams64_2, since it never calls the 'camera transformation' function diff --git a/src/mame/video/irobot.cpp b/src/mame/video/irobot.cpp index cdeef307727..1ff2031e48e 100644 --- a/src/mame/video/irobot.cpp +++ b/src/mame/video/irobot.cpp @@ -352,7 +352,7 @@ uint32_t irobot_state::screen_update_irobot(screen_device &screen, bitmap_ind16 int x, y, offs; /* copy the polygon bitmap */ - for (y = cliprect.min_y; y <= cliprect.max_y; y++) + for (y = cliprect.top(); y <= cliprect.bottom(); y++) draw_scanline8(bitmap, 0, y, BITMAP_WIDTH, &bitmap_base[y * BITMAP_WIDTH], nullptr); /* redraw the non-zero characters in the alpha layer */ diff --git a/src/mame/video/itech32.cpp b/src/mame/video/itech32.cpp index 2f75302d132..8a43b4baf28 100644 --- a/src/mame/video/itech32.cpp +++ b/src/mame/video/itech32.cpp @@ -271,7 +271,7 @@ WRITE16_MEMBER(itech32_state::bloodstm_plane_w) } -WRITE32_MEMBER(itech32_state::drivedge_color0_w) +WRITE32_MEMBER(drivedge_state::color0_w) { if (ACCESSING_BITS_16_23) m_color_latch[0] = ((data >> 16) & 0x7f) << 8; @@ -330,11 +330,12 @@ WRITE16_MEMBER(itech32_state::bloodstm_paletteram_w) * *************************************/ -void itech32_state::logblit(const char *tag) +void drivedge_state::logblit(const char *tag) { if (!machine().input().code_pressed(KEYCODE_L)) return; - if (m_is_drivedge && VIDEO_TRANSFER_FLAGS == 0x5490) + + if (VIDEO_TRANSFER_FLAGS == 0x5490) { /* polygon drawing */ logerror("%s: e=%d%d f=%04x s=(%03x-%03x,%03x) w=%03x h=%03x b=%02x%04x c=%02x%02x ss=%04x,%04x ds=%04x,%04x ls=%04x%04x rs=%04x%04x u80=%04x", tag, @@ -347,9 +348,20 @@ void itech32_state::logblit(const char *tag) VIDEO_DST_XSTEP, VIDEO_DST_YSTEP, VIDEO_LEFTSTEPHI, VIDEO_LEFTSTEPLO, VIDEO_RIGHTSTEPHI, VIDEO_RIGHTSTEPLO, VIDEO_STARTSTEP); + logerror(" v0=%08x v1=%08x v2=%08x v3=%08x\n", m_zbuf_control[0], m_zbuf_control[1], m_zbuf_control[2], m_zbuf_control[3]); + } + else + { + itech32_state::logblit(tag); } +} - else if (m_video[0x16/2] == 0x100 && m_video[0x18/2] == 0x100 && +void itech32_state::logblit(const char *tag) +{ + if (!machine().input().code_pressed(KEYCODE_L)) + return; + + if (m_video[0x16/2] == 0x100 && m_video[0x18/2] == 0x100 && m_video[0x1a/2] == 0x000 && m_video[0x1c/2] == 0x100 && m_video[0x1e/2] == 0x000 && m_video[0x20/2] == 0x000) { @@ -375,7 +387,6 @@ void itech32_state::logblit(const char *tag) m_video[0x16/2], m_video[0x18/2], m_video[0x1a/2], m_video[0x1c/2], m_video[0x1e/2], m_video[0x20/2]); } - if (m_is_drivedge) logerror(" v0=%08x v1=%08x v2=%08x v3=%08x", m_drivedge_zbuf_control[0], m_drivedge_zbuf_control[1], m_drivedge_zbuf_control[2], m_drivedge_zbuf_control[3]); logerror("\n"); } @@ -396,7 +407,7 @@ void itech32_state::update_interrupts(int fast) if (VIDEO_INTSTATE & VIDEO_INTENABLE & VIDEOINT_BLITTER) blitter_state = 1; - itech32_update_interrupts(-1, blitter_state, scanline_state); + update_interrupts(-1, blitter_state, scanline_state); } @@ -529,7 +540,7 @@ void itech32_state::draw_raw(uint16_t *base, uint16_t color) } -void itech32_state::draw_raw_drivedge(uint16_t *base, uint16_t *zbase, uint16_t color) +void drivedge_state::draw_raw(uint16_t *base, uint16_t *zbase, uint16_t color) { uint8_t *src = &m_grom_base[(m_grom_bank | ((VIDEO_TRANSFER_ADDRHI & 0xff) << 16) | VIDEO_TRANSFER_ADDRLO) % m_grom_size]; int transparent_pen = (VIDEO_TRANSFER_FLAGS & XFERFLAG_TRANSPARENT) ? 0xff : -1; @@ -541,8 +552,8 @@ void itech32_state::draw_raw_drivedge(uint16_t *base, uint16_t *zbase, uint16_t int startx = ((VIDEO_TRANSFER_X & 0xfff) << 8) + 0x80; int xdststep = 0x100; int ydststep = VIDEO_DST_YSTEP; - int32_t z0 = m_drivedge_zbuf_control[2] & 0x7ff00; - int32_t zmatch = (m_drivedge_zbuf_control[2] & 0x1f) << 11; + int32_t z0 = m_zbuf_control[2] & 0x7ff00; + int32_t zmatch = (m_zbuf_control[2] & 0x1f) << 11; int32_t srcdelta = 0; int x, y; @@ -586,14 +597,14 @@ void itech32_state::draw_raw_drivedge(uint16_t *base, uint16_t *zbase, uint16_t { /* skip left pixels */ for (x = 0; x < width && sx < m_scaled_clip_rect.min_x; x += xsrcstep, sx += xdststep) - z += (int32_t)m_drivedge_zbuf_control[0]; + z += (int32_t)m_zbuf_control[0]; /* compute the address */ dstoffs = compute_safe_address(sx >> 8, sy >> 8) - (sx >> 8); zbufoffs = compute_safe_address(sx >> 8, sy >> 8) - (sx >> 8); /* render middle pixels */ - if (m_drivedge_zbuf_control[3] & 0x8000) + if (m_zbuf_control[3] & 0x8000) { for ( ; x < width && sx < m_scaled_clip_rect.max_x; x += xsrcstep, sx += xdststep) { @@ -603,17 +614,17 @@ void itech32_state::draw_raw_drivedge(uint16_t *base, uint16_t *zbase, uint16_t base[(dstoffs + (sx >> 8)) & m_vram_mask] = pixel | color; zbase[(zbufoffs + (sx >> 8)) & m_vram_mask] = (z >> 8) | zmatch; } - z += (int32_t)m_drivedge_zbuf_control[0]; + z += (int32_t)m_zbuf_control[0]; } } - else if (m_drivedge_zbuf_control[3] & 0x4000) + else if (m_zbuf_control[3] & 0x4000) { for ( ; x < width && sx < m_scaled_clip_rect.max_x; x += xsrcstep, sx += xdststep) { int pixel = rowsrc[x >> 8]; if (pixel != transparent_pen && zmatch == (zbase[(zbufoffs + (sx >> 8)) & m_vram_mask] & (0x1f << 11))) base[(dstoffs + (sx >> 8)) & m_vram_mask] = pixel | color; - z += (int32_t)m_drivedge_zbuf_control[0]; + z += (int32_t)m_zbuf_control[0]; } } else @@ -626,7 +637,7 @@ void itech32_state::draw_raw_drivedge(uint16_t *base, uint16_t *zbase, uint16_t base[(dstoffs + (sx >> 8)) & m_vram_mask] = pixel | color; zbase[(zbufoffs + (sx >> 8)) & m_vram_mask] = (z >> 8) | zmatch; } - z += (int32_t)m_drivedge_zbuf_control[0]; + z += (int32_t)m_zbuf_control[0]; } } } @@ -634,14 +645,14 @@ void itech32_state::draw_raw_drivedge(uint16_t *base, uint16_t *zbase, uint16_t { /* skip right pixels */ for (x = 0; x < width && sx >= m_scaled_clip_rect.max_x; x += xsrcstep, sx += xdststep) - z += (int32_t)m_drivedge_zbuf_control[0]; + z += (int32_t)m_zbuf_control[0]; /* compute the address */ dstoffs = compute_safe_address(sx >> 8, sy >> 8) - (sx >> 8); zbufoffs = compute_safe_address(sx >> 8, sy >> 8) - (sx >> 8); /* render middle pixels */ - if (m_drivedge_zbuf_control[3] & 0x8000) + if (m_zbuf_control[3] & 0x8000) { for ( ; x < width && sx >= m_scaled_clip_rect.min_x; x += xsrcstep, sx += xdststep) { @@ -651,17 +662,17 @@ void itech32_state::draw_raw_drivedge(uint16_t *base, uint16_t *zbase, uint16_t base[(dstoffs + (sx >> 8)) & m_vram_mask] = pixel | color; zbase[(zbufoffs + (sx >> 8)) & m_vram_mask] = (z >> 8) | zmatch; } - z += (int32_t)m_drivedge_zbuf_control[0]; + z += (int32_t)m_zbuf_control[0]; } } - else if (m_drivedge_zbuf_control[3] & 0x4000) + else if (m_zbuf_control[3] & 0x4000) { for ( ; x < width && sx >= m_scaled_clip_rect.min_x; x += xsrcstep, sx += xdststep) { int pixel = rowsrc[x >> 8]; if (pixel != transparent_pen && zmatch == (zbase[(zbufoffs + (sx >> 8)) & m_vram_mask] & (0x1f << 11))) base[(dstoffs + (sx >> 8)) & m_vram_mask] = pixel | color; - z += (int32_t)m_drivedge_zbuf_control[0]; + z += (int32_t)m_zbuf_control[0]; } } else @@ -674,7 +685,7 @@ void itech32_state::draw_raw_drivedge(uint16_t *base, uint16_t *zbase, uint16_t base[(dstoffs + (sx >> 8)) & m_vram_mask] = pixel | color; zbase[(zbufoffs + (sx >> 8)) & m_vram_mask] = (z >> 8) | zmatch; } - z += (int32_t)m_drivedge_zbuf_control[0]; + z += (int32_t)m_zbuf_control[0]; } } } @@ -690,7 +701,7 @@ void itech32_state::draw_raw_drivedge(uint16_t *base, uint16_t *zbase, uint16_t /* render all pixels */ sx = startx; - if (m_drivedge_zbuf_control[3] & 0x8000) + if (m_zbuf_control[3] & 0x8000) { for (x = 0; x < width && sx < m_scaled_clip_rect.max_x; x += xsrcstep, sx += xdststep, ty += ystep) if (m_scaled_clip_rect.contains(sx, ty)) @@ -701,10 +712,10 @@ void itech32_state::draw_raw_drivedge(uint16_t *base, uint16_t *zbase, uint16_t base[compute_safe_address(sx >> 8, ty >> 8)] = pixel | color; zbase[compute_safe_address(sx >> 8, ty >> 8)] = (z >> 8) | zmatch; } - z += (int32_t)m_drivedge_zbuf_control[0]; + z += (int32_t)m_zbuf_control[0]; } } - else if (m_drivedge_zbuf_control[3] & 0x4000) + else if (m_zbuf_control[3] & 0x4000) { for (x = 0; x < width && sx < m_scaled_clip_rect.max_x; x += xsrcstep, sx += xdststep, ty += ystep) if (m_scaled_clip_rect.contains(sx, ty)) @@ -716,7 +727,7 @@ void itech32_state::draw_raw_drivedge(uint16_t *base, uint16_t *zbase, uint16_t base[compute_safe_address(sx >> 8, ty >> 8)] = pixel | color; *zbuf = (z >> 8) | zmatch; } - z += (int32_t)m_drivedge_zbuf_control[0]; + z += (int32_t)m_zbuf_control[0]; } } else @@ -731,7 +742,7 @@ void itech32_state::draw_raw_drivedge(uint16_t *base, uint16_t *zbase, uint16_t base[compute_safe_address(sx >> 8, ty >> 8)] = pixel | color; *zbuf = (z >> 8) | zmatch; } - z += (int32_t)m_drivedge_zbuf_control[0]; + z += (int32_t)m_zbuf_control[0]; } } } @@ -749,7 +760,7 @@ void itech32_state::draw_raw_drivedge(uint16_t *base, uint16_t *zbase, uint16_t m_scaled_clip_rect.max_x += (int32_t)((VIDEO_RIGHTSTEPHI << 16) | VIDEO_RIGHTSTEPLO); srcdelta += (int16_t)VIDEO_STARTSTEP; } - z0 += (int32_t)m_drivedge_zbuf_control[1]; + z0 += (int32_t)m_zbuf_control[1]; } /* restore cliprects */ @@ -762,7 +773,7 @@ void itech32_state::draw_raw_drivedge(uint16_t *base, uint16_t *zbase, uint16_t VIDEO_TRANSFER_Y = (VIDEO_TRANSFER_Y & ~0xfff) | ((VIDEO_TRANSFER_Y + (y >> 8)) & 0xfff); VIDEO_TRANSFER_ADDRLO += srcdelta >> 8; - m_drivedge_zbuf_control[2] = (m_drivedge_zbuf_control[2] & ~0x7ff00) | (z0 & 0x7ff00); + m_zbuf_control[2] = (m_zbuf_control[2] & ~0x7ff00) | (z0 & 0x7ff00); } @@ -1081,24 +1092,41 @@ void itech32_state::draw_rle(uint16_t *base, uint16_t color) void itech32_state::shiftreg_clear(uint16_t *base, uint16_t *zbase) { + const int ydir = (VIDEO_TRANSFER_FLAGS & XFERFLAG_YFLIP) ? -1 : 1; + const int height = ADJUSTED_HEIGHT(VIDEO_TRANSFER_HEIGHT); + const int sx = VIDEO_TRANSFER_X & 0xfff; + int sy = VIDEO_TRANSFER_Y & 0xfff; + + /* first line is the source */ + uint16_t *src = &base[compute_safe_address(sx, sy)]; + sy += ydir; + + /* loop over height */ + for (int y = 1; y < height; y++) + { + memcpy(&base[compute_safe_address(sx, sy)], src, 512*2); + sy += ydir; + } +} + +void drivedge_state::shiftreg_clear(uint16_t *base, uint16_t *zbase) +{ int ydir = (VIDEO_TRANSFER_FLAGS & XFERFLAG_YFLIP) ? -1 : 1; int height = ADJUSTED_HEIGHT(VIDEO_TRANSFER_HEIGHT); int sx = VIDEO_TRANSFER_X & 0xfff; int sy = VIDEO_TRANSFER_Y & 0xfff; - uint16_t *src; - int y; /* first line is the source */ - src = &base[compute_safe_address(sx, sy)]; + uint16_t *src = &base[compute_safe_address(sx, sy)]; sy += ydir; /* loop over height */ - for (y = 1; y < height; y++) + for (int y = 1; y < height; y++) { memcpy(&base[compute_safe_address(sx, sy)], src, 512*2); if (zbase) { - uint16_t zval = ((m_drivedge_zbuf_control[2] >> 8) & 0x7ff) | ((m_drivedge_zbuf_control[2] & 0x1f) << 11); + uint16_t zval = ((m_zbuf_control[2] >> 8) & 0x7ff) | ((m_zbuf_control[2] & 0x1f) << 11); uint16_t *dst = &zbase[compute_safe_address(sx, sy)]; int x; for (x = 0; x < 512; x++) @@ -1123,20 +1151,7 @@ void itech32_state::handle_video_command() { /* command 1: blit raw data */ case 1: - g_profiler.start(PROFILER_USER1); - if (BLIT_LOGGING) logblit("Blit Raw"); - - if (m_is_drivedge) - { - if (m_enable_latch[0]) draw_raw_drivedge(m_videoplane[0], m_videoplane[1], m_color_latch[0]); - } - else - { - if (m_enable_latch[0]) draw_raw(m_videoplane[0], m_color_latch[0]); - if (m_enable_latch[1]) draw_raw(m_videoplane[1], m_color_latch[1]); - } - - g_profiler.stop(); + command_blit_raw(); break; /* command 2: blit RLE-compressed data */ @@ -1169,20 +1184,7 @@ void itech32_state::handle_video_command() /* command 6: perform shift register copy */ case 6: - g_profiler.start(PROFILER_USER3); - if (BLIT_LOGGING) logblit("ShiftReg"); - - if (m_is_drivedge) - { - if (m_enable_latch[0]) shiftreg_clear(m_videoplane[0], m_videoplane[1]); - } - else - { - if (m_enable_latch[0]) shiftreg_clear(m_videoplane[0], nullptr); - if (m_enable_latch[1]) shiftreg_clear(m_videoplane[1], nullptr); - } - - g_profiler.stop(); + command_shift_reg(); break; default: @@ -1195,6 +1197,47 @@ void itech32_state::handle_video_command() update_interrupts(1); } +void itech32_state::command_blit_raw() +{ + g_profiler.start(PROFILER_USER1); + if (BLIT_LOGGING) logblit("Blit Raw"); + + if (m_enable_latch[0]) draw_raw(m_videoplane[0], m_color_latch[0]); + if (m_enable_latch[1]) draw_raw(m_videoplane[1], m_color_latch[1]); + + g_profiler.stop(); +} + +void drivedge_state::command_blit_raw() +{ + g_profiler.start(PROFILER_USER1); + if (BLIT_LOGGING) logblit("Blit Raw"); + + if (m_enable_latch[0]) draw_raw(m_videoplane[0], m_videoplane[1], m_color_latch[0]); + + g_profiler.stop(); +} + +void itech32_state::command_shift_reg() +{ + g_profiler.start(PROFILER_USER3); + if (BLIT_LOGGING) logblit("ShiftReg"); + + if (m_enable_latch[0]) shiftreg_clear(m_videoplane[0], nullptr); + if (m_enable_latch[1]) shiftreg_clear(m_videoplane[1], nullptr); + + g_profiler.stop(); +} + +void drivedge_state::command_shift_reg() +{ + g_profiler.start(PROFILER_USER3); + if (BLIT_LOGGING) logblit("ShiftReg"); + + if (m_enable_latch[0]) shiftreg_clear(m_videoplane[0], m_videoplane[1]); + + g_profiler.stop(); +} /************************************* @@ -1349,9 +1392,9 @@ WRITE32_MEMBER(itech32_state::itech020_video_w) } -WRITE32_MEMBER(itech32_state::drivedge_zbuf_control_w) +WRITE32_MEMBER(drivedge_state::zbuf_control_w) { - COMBINE_DATA(&m_drivedge_zbuf_control[offset]); + COMBINE_DATA(&m_zbuf_control[offset]); } diff --git a/src/mame/video/itech8.cpp b/src/mame/video/itech8.cpp index 35b7e347ae1..90d27ccbc54 100644 --- a/src/mame/video/itech8.cpp +++ b/src/mame/video/itech8.cpp @@ -528,43 +528,57 @@ READ8_MEMBER(itech8_state::tms34061_r) * *************************************/ -WRITE8_MEMBER(itech8_state::grmatch_palette_w) +WRITE8_MEMBER(grmatch_state::palette_w) { /* set the palette control; examined in the scanline callback */ - m_grmatch_palcontrol = data; + m_palcontrol = data; } -WRITE8_MEMBER(itech8_state::grmatch_xscroll_w) +WRITE8_MEMBER(grmatch_state::xscroll_w) { /* update the X scroll value */ //m_screen->update_now(); m_screen->update_partial(m_screen->vpos()); - m_grmatch_xscroll = data; + m_xscroll = data; } -TIMER_DEVICE_CALLBACK_MEMBER(itech8_state::grmatch_palette_update) +void grmatch_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) +{ + switch (id) + { + case TIMER_PALETTE: + palette_update(); + break; + default: + itech8_state::device_timer(timer, id, param, ptr); + break; + } +} + +void grmatch_state::palette_update() { /* if the high bit is set, we are supposed to latch the palette values */ - if (m_grmatch_palcontrol & 0x80) + if (m_palcontrol & 0x80) { /* the TMS34070s latch at the start of the frame, based on the first few bytes */ - uint32_t page_offset = (m_tms34061->m_display.dispstart & 0x0ffff) | m_grmatch_xscroll; - int page, x; + uint32_t page_offset = (m_tms34061->m_display.dispstart & 0x0ffff) | m_xscroll; /* iterate over both pages */ - for (page = 0; page < 2; page++) + for (int page = 0; page < 2; page++) { const uint8_t *base = &m_tms34061->m_display.vram[(page * 0x20000 + page_offset) & VRAM_MASK]; - for (x = 0; x < 16; x++) + for (int x = 0; x < 16; x++) { uint8_t data0 = base[x * 2 + 0]; uint8_t data1 = base[x * 2 + 1]; - m_grmatch_palette[page][x] = rgb_t(pal4bit(data0 >> 0), pal4bit(data1 >> 4), pal4bit(data1 >> 0)); + m_palette[page][x] = rgb_t(pal4bit(data0 >> 0), pal4bit(data1 >> 4), pal4bit(data1 >> 0)); } } } + + m_palette_timer->adjust(m_screen->time_until_pos(m_screen->vpos()+1)); } @@ -611,11 +625,8 @@ uint32_t itech8_state::screen_update_2layer(screen_device &screen, bitmap_rgb32 } -uint32_t itech8_state::screen_update_grmatch(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +uint32_t grmatch_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { - uint32_t page_offset; - int x, y; - /* first get the current display state */ m_tms34061->get_display_state(); @@ -631,27 +642,27 @@ uint32_t itech8_state::screen_update_grmatch(screen_device &screen, bitmap_rgb32 /* bottom layer @ 0x20000 is 4bpp, colors come from TMS34070, enabled via palette control */ /* 4bpp pixels are packed 2 to a byte */ /* xscroll is set via a separate register */ - page_offset = (m_tms34061->m_display.dispstart & 0x0ffff) | m_grmatch_xscroll; - for (y = cliprect.min_y; y <= cliprect.max_y; y++) + uint32_t page_offset = (m_tms34061->m_display.dispstart & 0x0ffff) | m_xscroll; + for (int y = cliprect.min_y; y <= cliprect.max_y; y++) { uint8_t *base0 = &m_tms34061->m_display.vram[0x00000 + ((page_offset + y * 256) & 0xffff)]; uint8_t *base2 = &m_tms34061->m_display.vram[0x20000 + ((page_offset + y * 256) & 0xffff)]; uint32_t *dest = &bitmap.pix32(y); - for (x = cliprect.min_x & ~1; x <= cliprect.max_x; x += 2) + for (int x = cliprect.min_x & ~1; x <= cliprect.max_x; x += 2) { uint8_t pix0 = base0[x / 2]; uint8_t pix2 = base2[x / 2]; if ((pix0 & 0xf0) != 0) - dest[x] = m_grmatch_palette[0][pix0 >> 4]; + dest[x] = m_palette[0][pix0 >> 4]; else - dest[x] = m_grmatch_palette[1][pix2 >> 4]; + dest[x] = m_palette[1][pix2 >> 4]; if ((pix0 & 0x0f) != 0) - dest[x + 1] = m_grmatch_palette[0][pix0 & 0x0f]; + dest[x + 1] = m_palette[0][pix0 & 0x0f]; else - dest[x + 1] = m_grmatch_palette[1][pix2 & 0x0f]; + dest[x + 1] = m_palette[1][pix2 & 0x0f]; } } return 0; diff --git a/src/mame/video/jaguar.cpp b/src/mame/video/jaguar.cpp index 803d5e14061..fde197a7ca1 100644 --- a/src/mame/video/jaguar.cpp +++ b/src/mame/video/jaguar.cpp @@ -204,8 +204,8 @@ inline void jaguar_state::get_crosshair_xy(int player, int &x, int &y) const rectangle &visarea = m_screen->visible_area(); /* only 2 lightguns are connected */ - x = visarea.min_x + (((ioport(player ? "FAKE2_X" : "FAKE1_X")->read() & 0xff) * visarea.width()) >> 8); - y = visarea.min_y + (((ioport(player ? "FAKE2_Y" : "FAKE1_Y")->read() & 0xff) * visarea.height()) >> 8); + x = visarea.left() + (((ioport(player ? "FAKE2_X" : "FAKE1_X")->read() & 0xff) * visarea.width()) >> 8); + y = visarea.top() + (((ioport(player ? "FAKE2_Y" : "FAKE1_Y")->read() & 0xff) * visarea.height()) >> 8); } @@ -752,7 +752,7 @@ void jaguar_state::scanline_update(int param) if ((m_gpu_regs[VMODE] & 1) && vc >= (m_gpu_regs[VDB] & 0x7ff)) { uint32_t *dest = &m_screen_bitmap.pix32(vc >> 1); - int maxx = visarea.max_x; + int maxx = visarea.right(); int hde = effective_hvalue(m_gpu_regs[HDE]) >> 1; uint16_t x,scanline[760]; uint8_t y,pixel_width = ((m_gpu_regs[VMODE]>>10)&3)+1; @@ -761,7 +761,7 @@ void jaguar_state::scanline_update(int param) if (ENABLE_BORDERS && vc % 2 == 0) { rgb_t border = rgb_t(m_gpu_regs[BORD1] & 0xff, m_gpu_regs[BORD1] >> 8, m_gpu_regs[BORD2] & 0xff); - for (x = visarea.min_x; x <= visarea.max_x; x++) + for (x = visarea.left(); x <= visarea.right(); x++) dest[x] = border; } diff --git a/src/mame/video/jedi.cpp b/src/mame/video/jedi.cpp index d3ce309fa28..d99be2e9568 100644 --- a/src/mame/video/jedi.cpp +++ b/src/mame/video/jedi.cpp @@ -108,8 +108,8 @@ void jedi_state::do_pen_lookup(bitmap_rgb32 &bitmap, const rectangle &cliprect) get_pens(pens); - for (y = cliprect.min_y; y <= cliprect.max_y; y++) - for(x = cliprect.min_x; x <= cliprect.max_x; x++) + for (y = cliprect.top(); y <= cliprect.bottom(); y++) + for(x = cliprect.left(); x <= cliprect.right(); x++) bitmap.pix32(y, x) = pens[bitmap.pix32(y, x)]; } @@ -158,12 +158,12 @@ void jedi_state::draw_background_and_text(bitmap_rgb32 &bitmap, const rectangle memset(background_line_buffer, 0, 0x200 * sizeof(int)); - for (y = cliprect.min_y; y <= cliprect.max_y; y++) + for (y = cliprect.top(); y <= cliprect.bottom(); y++) { int x; int bg_last_col = 0; - for (x = cliprect.min_x; x <= cliprect.max_x; x += 2) + for (x = cliprect.left(); x <= cliprect.right(); x += 2) { int tx_col1, tx_col2, bg_col; int bg_tempcol; @@ -285,7 +285,7 @@ void jedi_state::draw_sprites(bitmap_rgb32 &bitmap, const rectangle &cliprect) int i; uint16_t x = spriteram[offs + 0x100] + ((spriteram[offs + 0x40] & 0x01) << 8) - 2; - if ((y < cliprect.min_y) || (y > cliprect.max_y)) + if ((y < cliprect.top()) || (y > cliprect.bottom())) continue; if (flip_x) diff --git a/src/mame/video/kc.cpp b/src/mame/video/kc.cpp index a9a346c1844..7371c8513af 100644 --- a/src/mame/video/kc.cpp +++ b/src/mame/video/kc.cpp @@ -148,9 +148,8 @@ void kc_state::video_draw_8_pixels(bitmap_ind16 &bitmap, int x, int y, uint8_t c void kc85_4_state::video_start() { - m_video_ram = machine().memory().region_alloc("videoram", (KC85_4_SCREEN_COLOUR_RAM_SIZE*2) + (KC85_4_SCREEN_PIXEL_RAM_SIZE*2), 1, ENDIANNESS_LITTLE)->base(); - memset(m_video_ram, 0, (KC85_4_SCREEN_COLOUR_RAM_SIZE*2) + (KC85_4_SCREEN_PIXEL_RAM_SIZE*2)); - m_display_video_ram = m_video_ram; + m_video_ram = make_unique_clear<uint8_t[]>((KC85_4_SCREEN_COLOUR_RAM_SIZE*2) + (KC85_4_SCREEN_PIXEL_RAM_SIZE*2)); + m_display_video_ram = &m_video_ram[0]; m_kc85_blink_state = 0; } @@ -159,9 +158,9 @@ void kc85_4_state::video_control_w(int data) { /* calculate address of video ram to display */ if (data & 1) - m_display_video_ram = m_video_ram + (KC85_4_SCREEN_PIXEL_RAM_SIZE + KC85_4_SCREEN_COLOUR_RAM_SIZE); + m_display_video_ram = &m_video_ram[KC85_4_SCREEN_PIXEL_RAM_SIZE + KC85_4_SCREEN_COLOUR_RAM_SIZE]; else - m_display_video_ram = m_video_ram; + m_display_video_ram = &m_video_ram[0]; m_high_resolution = (data & 0x08) ? 0 : 1; } @@ -194,8 +193,7 @@ uint32_t kc85_4_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap void kc_state::video_start() { - m_video_ram = machine().memory().region_alloc("videoram", 0x4000, 1, ENDIANNESS_LITTLE)->base(); - memset(m_video_ram, 0, 0x4000); + m_video_ram = make_unique_clear<uint8_t[]>(0x4000); m_kc85_blink_state = 0; } @@ -203,8 +201,8 @@ void kc_state::video_start() uint32_t kc_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { /* colour ram takes up 0x02800 bytes */ - uint8_t *pixel_ram = m_video_ram; - uint8_t *colour_ram = m_video_ram + 0x02800; + uint8_t *pixel_ram = &m_video_ram[0]; + uint8_t *colour_ram = &m_video_ram[0x2800]; for (int y=cliprect.min_y; y<=cliprect.max_y; y++) { diff --git a/src/mame/video/klax.cpp b/src/mame/video/klax.cpp index b8a3129a35c..d32022c5d2b 100644 --- a/src/mame/video/klax.cpp +++ b/src/mame/video/klax.cpp @@ -100,11 +100,11 @@ uint32_t klax_state::screen_update_klax(screen_device &screen, bitmap_ind16 &bit // draw and merge the MO bitmap_ind16 &mobitmap = m_mob->bitmap(); for (const sparse_dirty_rect *rect = m_mob->first_dirty_rect(cliprect); rect != nullptr; rect = rect->next()) - for (int y = rect->min_y; y <= rect->max_y; y++) + for (int y = rect->top(); y <= rect->bottom(); y++) { uint16_t *mo = &mobitmap.pix16(y); uint16_t *pf = &bitmap.pix16(y); - for (int x = rect->min_x; x <= rect->max_x; x++) + for (int x = rect->left(); x <= rect->right(); x++) if (mo[x] != 0xffff) { /* verified from schematics: diff --git a/src/mame/video/leland.cpp b/src/mame/video/leland.cpp index d0dedd09e74..6408f1d1d9d 100644 --- a/src/mame/video/leland.cpp +++ b/src/mame/video/leland.cpp @@ -450,13 +450,13 @@ uint32_t leland_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap m_tilemap->draw(screen, bitmap, cliprect, 0); /* for each scanline in the visible region */ - for (int y = cliprect.min_y; y <= cliprect.max_y; y++) + for (int y = cliprect.top(); y <= cliprect.bottom(); y++) { uint16_t *const dst = &bitmap.pix16(y); uint8_t const *const fg_src = &m_video_ram[y << 8]; /* for each pixel on the scanline */ - for (int x = cliprect.min_x; x <= cliprect.max_x; x++) + for (int x = cliprect.left(); x <= cliprect.right(); x++) { /* build the pen, background is d0-d5 */ pen_t pen = dst[x] & 0x3f; diff --git a/src/mame/video/lemmings.cpp b/src/mame/video/lemmings.cpp index 70d13de215a..c7c3f80a4f4 100644 --- a/src/mame/video/lemmings.cpp +++ b/src/mame/video/lemmings.cpp @@ -118,11 +118,11 @@ void lemmings_state::lemmings_copy_bitmap(bitmap_rgb32& bitmap, int* xscroll, in int y,x; const pen_t *paldata = m_palette->pens(); - for (y=cliprect.min_y; y<cliprect.max_y;y++) + for (y=cliprect.top(); y<cliprect.bottom();y++) { uint32_t* dst = &bitmap.pix32(y,0); - for (x=cliprect.min_x; x<cliprect.max_x;x++) + for (x=cliprect.left(); x<cliprect.right();x++) { uint16_t src = m_bitmap0.pix16((y-*yscroll)&0xff,(x-*xscroll)&0x7ff); @@ -137,9 +137,7 @@ uint32_t lemmings_state::screen_update_lemmings(screen_device &screen, bitmap_rg int x1 = -m_control_data[0]; int x0 = -m_control_data[2]; int y = 0; - rectangle rect; - rect.max_y = cliprect.max_y; - rect.min_y = cliprect.min_y; + rectangle rect(0, 0, cliprect.top(), cliprect.bottom()); // sprites are flipped relative to tilemaps m_sprgen[0]->set_flip_screen(true); @@ -157,12 +155,10 @@ uint32_t lemmings_state::screen_update_lemmings(screen_device &screen, bitmap_rg } else { - rect.max_x = 159; - rect.min_x = 0; + rect.setx(0, 159); lemmings_copy_bitmap(bitmap, &x0, &y, rect); - rect.max_x = 319; - rect.min_x = 160; + rect.setx(160, 319); lemmings_copy_bitmap(bitmap, &x1, &y, rect); } diff --git a/src/mame/video/mac.cpp b/src/mame/video/mac.cpp index 5883d7f102d..0b354c7dfba 100644 --- a/src/mame/video/mac.cpp +++ b/src/mame/video/mac.cpp @@ -59,14 +59,14 @@ Apple color FPD 01 11 10 (FPD = Full Page Display) #include "machine/ram.h" #include "render.h" -PALETTE_INIT_MEMBER(mac_state,mac) +void mac_state::palette_init_mac(palette_device &palette) { palette.set_pen_color(0, 0xff, 0xff, 0xff); palette.set_pen_color(1, 0x00, 0x00, 0x00); } // 4-level grayscale -PALETTE_INIT_MEMBER(mac_state,macgsc) +void mac_state::palette_init_macgsc(palette_device &palette) { palette.set_pen_color(0, 0xff, 0xff, 0xff); palette.set_pen_color(1, 0x7f, 0x7f, 0x7f); @@ -226,7 +226,6 @@ VIDEO_RESET_MEMBER(mac_state,maceagle) VIDEO_RESET_MEMBER(mac_state,macrbv) { - rectangle visarea; int htotal, vtotal; double framerate; int view; @@ -242,16 +241,14 @@ VIDEO_RESET_MEMBER(mac_state,macrbv) m_rbv_type = RBV_TYPE_RBV; - visarea.min_x = 0; - visarea.min_y = 0; view = 0; m_rbv_montype = m_montype.read_safe(2); + rectangle visarea; switch (m_rbv_montype) { case 1: // 15" portrait display - visarea.max_x = 640-1; - visarea.max_y = 870-1; + visarea.set(0, 640-1, 0, 870-1); htotal = 832; vtotal = 918; framerate = 75.0; @@ -259,8 +256,7 @@ VIDEO_RESET_MEMBER(mac_state,macrbv) break; case 2: // 12" RGB - visarea.max_x = 512-1; - visarea.max_y = 384-1; + visarea.set(0, 512-1, 0, 384-1); htotal = 640; vtotal = 407; framerate = 60.15; @@ -268,15 +264,14 @@ VIDEO_RESET_MEMBER(mac_state,macrbv) case 6: // 13" RGB default: - visarea.max_x = 640-1; - visarea.max_y = 480-1; + visarea.set(0, 640-1, 0, 480-1); htotal = 800; vtotal = 525; framerate = 59.94; break; } -// printf("RBV reset: monitor is %dx%d @ %f Hz\n", visarea.max_x+1, visarea.max_y+1, framerate); +// logerror("RBV reset: monitor is %dx%d @ %f Hz\n", visarea.width(), visarea.height(), framerate); m_screen->configure(htotal, vtotal, visarea, HZ_TO_ATTOSECONDS(framerate)); render_target *target = machine().render().first_target(); target->set_view(view); @@ -284,7 +279,6 @@ VIDEO_RESET_MEMBER(mac_state,macrbv) VIDEO_RESET_MEMBER(mac_state,macsonora) { - rectangle visarea; int htotal, vtotal; double framerate; int view = 0; @@ -300,15 +294,12 @@ VIDEO_RESET_MEMBER(mac_state,macsonora) m_rbv_type = RBV_TYPE_SONORA; - visarea.min_x = 0; - visarea.min_y = 0; - m_rbv_montype = m_montype.read_safe(2); + rectangle visarea; switch (m_rbv_montype) { case 1: // 15" portrait display - visarea.max_x = 640-1; - visarea.max_y = 870-1; + visarea.set(0, 640-1, 0, 870-1); htotal = 832; vtotal = 918; framerate = 75.0; @@ -316,8 +307,7 @@ VIDEO_RESET_MEMBER(mac_state,macsonora) break; case 2: // 12" RGB - visarea.max_x = 512-1; - visarea.max_y = 384-1; + visarea.set(0, 512-1, 0, 384-1); htotal = 640; vtotal = 407; framerate = 60.15; @@ -325,15 +315,14 @@ VIDEO_RESET_MEMBER(mac_state,macsonora) case 6: // 13" RGB default: - visarea.max_x = 640-1; - visarea.max_y = 480-1; + visarea.set(0, 640-1, 0, 480-1); htotal = 800; vtotal = 525; framerate = 59.94; break; } -// printf("Sonora reset: monitor is %dx%d @ %f Hz\n", visarea.max_x+1, visarea.max_y+1, framerate); +// logerror("Sonora reset: monitor is %dx%d @ %f Hz\n", visarea.width(), visarea.height(), framerate); m_screen->configure(htotal, vtotal, visarea, HZ_TO_ATTOSECONDS(framerate)); render_target *target = machine().render().first_target(); target->set_view(view); diff --git a/src/mame/video/madalien.cpp b/src/mame/video/madalien.cpp index f07b9badfcf..41e49f8aa1c 100644 --- a/src/mame/video/madalien.cpp +++ b/src/mame/video/madalien.cpp @@ -155,11 +155,8 @@ VIDEO_START_MEMBER(madalien_state,madalien) void madalien_state::draw_edges(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int flip, int scroll_mode) { - rectangle clip_edge1; - rectangle clip_edge2; - - clip_edge1 = cliprect; - clip_edge2 = cliprect; + rectangle clip_edge1(cliprect); + rectangle clip_edge2(cliprect); if (flip) { @@ -205,7 +202,7 @@ void madalien_state::draw_headlight(bitmap_ind16 &bitmap, const rectangle &clipr if (flip) hy = ~hy; - if ((hy < cliprect.min_y) || (hy > cliprect.max_y)) + if ((hy < cliprect.top()) || (hy > cliprect.bottom())) continue; for (x = 0; x < 0x80; x++) @@ -215,7 +212,7 @@ void madalien_state::draw_headlight(bitmap_ind16 &bitmap, const rectangle &clipr if (flip) hx = ~hx; - if ((hx < cliprect.min_x) || (hx > cliprect.max_x)) + if ((hx < cliprect.left()) || (hx > cliprect.right())) continue; if (m_headlight_bitmap->pix16(y, x) != 0) @@ -283,9 +280,9 @@ uint32_t madalien_state::screen_update_madalien(screen_device &screen, bitmap_in min_x = 0xff - max_x_save; } - for (y = cliprect.min_y; y <= cliprect.max_y ; y++) + for (y = cliprect.top(); y <= cliprect.bottom(); y++) for (x = min_x; x <= max_x; x++) - if ((x >= cliprect.min_x) && (x <= cliprect.max_x)) + if ((x >= cliprect.left()) && (x <= cliprect.right())) bitmap.pix16(y, x) |= 8; } diff --git a/src/mame/video/mermaid.cpp b/src/mame/video/mermaid.cpp index 035ec20ca30..00a57d3c3f0 100644 --- a/src/mame/video/mermaid.cpp +++ b/src/mame/video/mermaid.cpp @@ -230,8 +230,8 @@ uint8_t mermaid_state::collision_check( rectangle& rect ) int x; int y; - for (y = rect.min_y; y <= rect.max_y; y++) - for (x = rect.min_x; x <= rect.max_x; x++) + for (y = rect.top(); y <= rect.bottom(); y++) + for (x = rect.left(); x <= rect.right(); x++) { uint16_t a = m_palette->pen_indirect(m_helper.pix16(y, x)) & 0x3f; uint16_t b = m_palette->pen_indirect(m_helper2.pix16(y, x)) & 0x3f; @@ -289,11 +289,9 @@ void mermaid_state::collision_update() sy = 240 - sy; } - rect.min_x = sx; - rect.min_y = sy; - rect.max_x = sx + m_gfxdecode->gfx(1)->width() - 1; - rect.max_y = sy + m_gfxdecode->gfx(1)->height() - 1; - + rect.set( + sx, sx + m_gfxdecode->gfx(1)->width() - 1, + sy, sy + m_gfxdecode->gfx(1)->height() - 1); rect &= visarea; // check collision sprite - background @@ -392,11 +390,9 @@ void mermaid_state::collision_update() sy = 240 - sy; } - rect.min_x = sx; - rect.min_y = sy; - rect.max_x = sx + m_gfxdecode->gfx(1)->width() - 1; - rect.max_y = sy + m_gfxdecode->gfx(1)->height() - 1; - + rect.set( + sx, sx + m_gfxdecode->gfx(1)->width() - 1, + sy, sy + m_gfxdecode->gfx(1)->height() - 1); rect &= visarea; // check collision sprite - sprite @@ -473,11 +469,9 @@ void mermaid_state::collision_update() sy = 240 - sy; } - rect.min_x = sx; - rect.min_y = sy; - rect.max_x = sx + m_gfxdecode->gfx(1)->width() - 1; - rect.max_y = sy + m_gfxdecode->gfx(1)->height() - 1; - + rect.set( + sx, sx + m_gfxdecode->gfx(1)->width() - 1, + sy, sy + m_gfxdecode->gfx(1)->height() - 1); rect &= visarea; // check collision sprite - sprite diff --git a/src/mame/video/namcos21.cpp b/src/mame/video/namcos21.cpp index 5fdb1deda54..db10b9fe6ca 100644 --- a/src/mame/video/namcos21.cpp +++ b/src/mame/video/namcos21.cpp @@ -103,13 +103,13 @@ void namcos21_state::copy_visible_poly_framebuffer(bitmap_ind16 &bitmap, const r { /* blit the visible framebuffer */ int sy; - for( sy=clip.min_y; sy<=clip.max_y; sy++ ) + for( sy=clip.top(); sy<=clip.bottom(); sy++ ) { uint16_t *dest = &bitmap.pix16(sy); const uint16_t *pPen = m_mpPolyFrameBufferPens2.get()+NAMCOS21_POLY_FRAME_WIDTH*sy; const uint16_t *pZ = m_mpPolyFrameBufferZ2.get()+NAMCOS21_POLY_FRAME_WIDTH*sy; int sx; - for( sx=clip.min_x; sx<=clip.max_x; sx++ ) + for( sx=clip.left(); sx<=clip.right(); sx++ ) { int z = pZ[sx]; //if( pZ[sx]!=0x7fff ) @@ -429,17 +429,17 @@ uint32_t namcos21_state::screen_update_driveyes(screen_device &screen, bitmap_in void namcos21_state::winrun_bitmap_draw(bitmap_ind16 &bitmap, const rectangle &cliprect) { uint8_t *videoram = m_videoram.get(); - //printf("%d %d (%d %d) - %04x %04x %04x|%04x %04x\n",cliprect.min_y,cliprect.max_y,m_screen->vpos(),m_gpu_intc->get_posirq_line(),m_winrun_gpu_register[0],m_winrun_gpu_register[2/2],m_winrun_gpu_register[4/2],m_winrun_gpu_register[0xa/2],m_winrun_gpu_register[0xc/2]); + //printf("%d %d (%d %d) - %04x %04x %04x|%04x %04x\n",cliprect.top(),cliprect.bottom(),m_screen->vpos(),m_gpu_intc->get_posirq_line(),m_winrun_gpu_register[0],m_winrun_gpu_register[2/2],m_winrun_gpu_register[4/2],m_winrun_gpu_register[0xa/2],m_winrun_gpu_register[0xc/2]); - int yscroll = -cliprect.min_y+(int16_t)m_winrun_gpu_register[0x2/2]; + int yscroll = -cliprect.top()+(int16_t)m_winrun_gpu_register[0x2/2]; int xscroll = 0;//m_winrun_gpu_register[0xc/2] >> 7; int base = 0x1000+0x100*(m_winrun_color&0xf); int sx,sy; - for( sy=cliprect.min_y; sy<=cliprect.max_y; sy++ ) + for( sy=cliprect.top(); sy<=cliprect.bottom(); sy++ ) { const uint8_t *pSource = &videoram[((yscroll+sy)&0x3ff)*0x200]; uint16_t *pDest = &bitmap.pix16(sy); - for( sx=cliprect.min_x; sx<=cliprect.max_x; sx++ ) + for( sx=cliprect.left(); sx<=cliprect.right(); sx++ ) { int pen = pSource[(sx+xscroll) & 0x1ff]; switch( pen ) diff --git a/src/mame/video/namcos22.cpp b/src/mame/video/namcos22.cpp index 19cabcc08bd..f5765af21d6 100644 --- a/src/mame/video/namcos22.cpp +++ b/src/mame/video/namcos22.cpp @@ -307,11 +307,11 @@ void namcos22_renderer::poly3d_drawquad(screen_device &screen, bitmap_rgb32 &bit int cy = 240 + node->data.quad.vy; m_clipx = cx; m_clipy = cy; - m_cliprect.set(cx + node->data.quad.vw, cx - node->data.quad.vw, cy + node->data.quad.vh, cy - node->data.quad.vh); - if (m_cliprect.min_x < 0) m_cliprect.min_x = 0; - if (m_cliprect.max_x > 639) m_cliprect.max_x = 639; - if (m_cliprect.min_y < 0) m_cliprect.min_y = 0; - if (m_cliprect.max_y > 479) m_cliprect.max_y = 479; + m_cliprect.set( + std::max<s32>(cx + node->data.quad.vw, 0), + std::min<s32>(cx - node->data.quad.vw, 639), + std::max<s32>(cy + node->data.quad.vh, 0), + std::min<s32>(cy - node->data.quad.vh, 479)); // non-direct case: project and z-clip if (!direct) @@ -583,11 +583,11 @@ void namcos22_renderer::poly3d_drawsprite( void namcos22_renderer::render_sprite(screen_device &screen, bitmap_rgb32 &bitmap, struct namcos22_scenenode *node) { // scene clip - m_cliprect.set(node->data.sprite.cx_min, node->data.sprite.cx_max, node->data.sprite.cy_min, node->data.sprite.cy_max); - if (m_cliprect.min_x < 0) m_cliprect.min_x = 0; - if (m_cliprect.max_x > 639) m_cliprect.max_x = 639; - if (m_cliprect.min_y < 0) m_cliprect.min_y = 0; - if (m_cliprect.max_y > 479) m_cliprect.max_y = 479; + m_cliprect.set( + std::max<s32>(node->data.sprite.cx_min, 0), + std::min<s32>(node->data.sprite.cx_max, 639), + std::max<s32>(node->data.sprite.cy_min, 0), + std::min<s32>(node->data.sprite.cy_max, 479)); int offset = 0; @@ -602,20 +602,19 @@ void namcos22_renderer::render_sprite(screen_device &screen, bitmap_rgb32 &bitma code += nthword(&m_state.m_spriteram[0x800/4], offset + node->data.sprite.linktype*4); poly3d_drawsprite( - screen, - bitmap, - code, - node->data.sprite.color, - node->data.sprite.flipx, - node->data.sprite.flipy, - node->data.sprite.xpos + col * node->data.sprite.sizex, - node->data.sprite.ypos + row * node->data.sprite.sizey, - (node->data.sprite.sizex << 16) / 32, - (node->data.sprite.sizey << 16) / 32, - node->data.sprite.cz, - node->data.sprite.pri, - 0xff - node->data.sprite.translucency - ); + screen, + bitmap, + code, + node->data.sprite.color, + node->data.sprite.flipx, + node->data.sprite.flipy, + node->data.sprite.xpos + col * node->data.sprite.sizex, + node->data.sprite.ypos + row * node->data.sprite.sizey, + (node->data.sprite.sizex << 16) / 32, + (node->data.sprite.sizey << 16) / 32, + node->data.sprite.cz, + node->data.sprite.pri, + 0xff - node->data.sprite.translucency); offset++; } } @@ -1895,12 +1894,12 @@ void namcos22_state::namcos22s_mix_text_layer(screen_device &screen, bitmap_rgb3 rgbaint_t fade_color(0, m_screen_fade_r, m_screen_fade_g, m_screen_fade_b); // mix textlayer with poly/sprites - for (int y = cliprect.min_y; y <= cliprect.max_y; y++) + for (int y = cliprect.top(); y <= cliprect.bottom(); y++) { src = &m_mix_bitmap->pix16(y); dest = &bitmap.pix32(y); pri = &screen.priority().pix8(y); - for (int x = cliprect.min_x; x <= cliprect.max_x; x++) + for (int x = cliprect.left(); x <= cliprect.right(); x++) { // skip if transparent or under poly/sprite if (pri[x] == prival) @@ -1970,12 +1969,12 @@ void namcos22_state::namcos22_mix_text_layer(screen_device &screen, bitmap_rgb32 }; // mix textlayer with poly/sprites - for (int y = cliprect.min_y; y <= cliprect.max_y; y++) + for (int y = cliprect.top(); y <= cliprect.bottom(); y++) { src = &m_mix_bitmap->pix16(y); dest = &bitmap.pix32(y); pri = &screen.priority().pix8(y); - for (int x = cliprect.min_x; x <= cliprect.max_x; x++) + for (int x = cliprect.left(); x <= cliprect.right(); x++) { uint32_t pixel = dest[x]; @@ -2314,10 +2313,10 @@ uint32_t namcos22_state::screen_update_namcos22s(screen_device &screen, bitmap_r const uint8_t *rlut = (const uint8_t *)&m_mixer[0x100/4]; const uint8_t *glut = (const uint8_t *)&m_mixer[0x200/4]; const uint8_t *blut = (const uint8_t *)&m_mixer[0x300/4]; - for (int y = cliprect.min_y; y <= cliprect.max_y; y++) + for (int y = cliprect.top(); y <= cliprect.bottom(); y++) { uint32_t *dest = &bitmap.pix32(y); - for (int x = cliprect.min_x; x <= cliprect.max_x; x++) + for (int x = cliprect.left(); x <= cliprect.right(); x++) { int rgb = dest[x]; int r = rlut[NATIVE_ENDIAN_VALUE_LE_BE(3, 0) ^ ((rgb >> 16) & 0xff)]; diff --git a/src/mame/video/newport.h b/src/mame/video/newport.h index 0b64803b623..b1ff724d607 100644 --- a/src/mame/video/newport.h +++ b/src/mame/video/newport.h @@ -2,7 +2,6 @@ // copyright-holders:Ryan Holtz /* SGI "Newport" graphics board used in the Indy and some Indigo2s - */ #ifndef MAME_VIDEO_NEWPORT_H @@ -13,8 +12,12 @@ class newport_video_device : public device_t { public: - newport_video_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + newport_video_device(const machine_config &mconfig, const char *tag, device_t *owner) + : newport_video_device(mconfig, tag, owner, (uint32_t)0) // TODO: Use actual pixel clock + { + } + newport_video_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); DECLARE_READ32_MEMBER( rex3_r ); DECLARE_WRITE32_MEMBER( rex3_w ); diff --git a/src/mame/video/offtwall.cpp b/src/mame/video/offtwall.cpp index 1bdd845059f..d7217b32847 100644 --- a/src/mame/video/offtwall.cpp +++ b/src/mame/video/offtwall.cpp @@ -87,11 +87,11 @@ uint32_t offtwall_state::screen_update_offtwall(screen_device &screen, bitmap_in // draw and merge the MO bitmap_ind16 &mobitmap = m_vad->mob().bitmap(); for (const sparse_dirty_rect *rect = m_vad->mob().first_dirty_rect(cliprect); rect != nullptr; rect = rect->next()) - for (int y = rect->min_y; y <= rect->max_y; y++) + for (int y = rect->top(); y <= rect->bottom(); y++) { uint16_t *mo = &mobitmap.pix16(y); uint16_t *pf = &bitmap.pix16(y); - for (int x = rect->min_x; x <= rect->max_x; x++) + for (int x = rect->left(); x <= rect->right(); x++) if (mo[x] != 0xffff) { /* not yet verified diff --git a/src/mame/video/pc9801.cpp b/src/mame/video/pc9801.cpp index 79aadcb79c1..34d8d3e04c7 100644 --- a/src/mame/video/pc9801.cpp +++ b/src/mame/video/pc9801.cpp @@ -214,7 +214,7 @@ UPD7220_DRAW_TEXT_LINE_MEMBER( pc9801_state::hgdc_draw_text ) tile_data^=0xff; if(blink && m_screen->frame_number() & 0x10) - tile_data^=0xff; + tile_data = 0; if(yi >= char_size) pen = -1; diff --git a/src/mame/video/policetr.cpp b/src/mame/video/policetr.cpp index 286c509c0ae..c337ec7f22c 100644 --- a/src/mame/video/policetr.cpp +++ b/src/mame/video/policetr.cpp @@ -11,13 +11,6 @@ #include "includes/policetr.h" -/* constants */ -#define SRCBITMAP_WIDTH 4096 - -#define DSTBITMAP_WIDTH 512 -#define DSTBITMAP_HEIGHT 256 - - /************************************* * * Video system start @@ -26,14 +19,20 @@ void policetr_state::video_start() { - /* the source bitmap is in ROM */ - m_srcbitmap = memregion("gfx1")->base(); - /* compute the height */ - m_srcbitmap_height_mask = (memregion("gfx1")->bytes() / SRCBITMAP_WIDTH) - 1; + m_srcbitmap_height_mask = (m_srcbitmap.bytes() / SRCBITMAP_WIDTH) - 1; /* the destination bitmap is not directly accessible to the CPU */ - m_dstbitmap = std::make_unique<uint8_t[]>(DSTBITMAP_WIDTH * DSTBITMAP_HEIGHT); + m_dstbitmap = std::make_unique<bitmap_ind8>(+DSTBITMAP_WIDTH, +DSTBITMAP_HEIGHT); + + save_item(NAME(m_palette_offset)); + save_item(NAME(m_palette_index)); + save_item(NAME(m_palette_data)); + save_item(NAME(m_src_xoffs)); + save_item(NAME(m_src_yoffs)); + save_item(NAME(m_dst_xoffs)); + save_item(NAME(m_dst_yoffs)); + save_item(NAME(m_video_latch)); } @@ -52,19 +51,17 @@ void policetr_state::render_display_list(offs_t offset) /* loop over all items */ while (offset != 0x1fffffff) { - uint32_t *entry = &m_rambase[offset / 4]; + const uint32_t *entry = &m_rambase[offset / 4]; uint32_t srcx = entry[0] & 0xfffffff; uint32_t srcy = entry[1] & ((m_srcbitmap_height_mask << 16) | 0xffff); - uint32_t srcxstep = entry[2]; - uint32_t srcystep = entry[3]; + const uint32_t srcxstep = entry[2]; + const uint32_t srcystep = entry[3]; int dstw = (entry[4] & 0x1ff) + 1; int dsth = ((entry[4] >> 12) & 0x1ff) + 1; int dstx = entry[5] & 0x1ff; int dsty = (entry[5] >> 12) & 0x1ff; - uint8_t mask = ~entry[6] >> 16; - uint8_t color = (entry[6] >> 24) & ~mask; - uint32_t curx, cury; - int x, y; + const uint8_t mask = ~entry[6] >> 16; + const uint8_t color = (entry[6] >> 24) & ~mask; if (dstx > m_render_clip.max_x) { @@ -95,31 +92,34 @@ void policetr_state::render_display_list(offs_t offset) if (srcxstep == 0 && srcystep == 0) { /* prefetch the pixel */ - uint8_t pixel = m_srcbitmap[((srcy >> 16) * m_srcbitmap_height_mask) * SRCBITMAP_WIDTH + (srcx >> 16) % SRCBITMAP_WIDTH]; + uint8_t pixel = m_srcbitmap[(((srcy >> 16) & m_srcbitmap_height_mask) * SRCBITMAP_WIDTH) | ((srcx >> 16) & SRCBITMAP_WIDTH_MASK)]; pixel = color | (pixel & mask); /* loop over rows and columns */ if (dstw > 0) - for (y = 0; y < dsth; y++) + { + for (int y = 0; y < dsth; y++) { - uint8_t *dst = &m_dstbitmap[(dsty + y) * DSTBITMAP_WIDTH + dstx]; + uint8_t *dst = &m_dstbitmap->pix8(dsty + y,dstx); memset(dst, pixel, dstw); } + } } /* otherwise, standard render */ else { /* loop over rows */ - for (y = 0, cury = srcy; y < dsth; y++, cury += srcystep) + uint32_t cury = srcy; + for (int y = 0; y < dsth; y++, cury += srcystep) { - uint8_t *src = &m_srcbitmap[((cury >> 16) & m_srcbitmap_height_mask) * SRCBITMAP_WIDTH]; - uint8_t *dst = &m_dstbitmap[(dsty + y) * DSTBITMAP_WIDTH + dstx]; + const uint8_t *src = &m_srcbitmap[((cury >> 16) & m_srcbitmap_height_mask) * SRCBITMAP_WIDTH]; + uint8_t *dst = &m_dstbitmap->pix8((dsty + y), dstx); /* loop over columns */ - for (x = 0, curx = srcx; x < dstw; x++, curx += srcxstep) + for (int x = 0, curx = srcx; x < dstw; x++, curx += srcxstep) { - uint8_t pixel = src[(curx >> 16) % SRCBITMAP_WIDTH]; + const uint8_t pixel = src[(curx >> 16) & SRCBITMAP_WIDTH_MASK]; if (pixel) dst[x] = color | (pixel & mask); } @@ -139,12 +139,8 @@ void policetr_state::render_display_list(offs_t offset) * *************************************/ -WRITE32_MEMBER(policetr_state::policetr_video_w) +WRITE32_MEMBER(policetr_state::video_w) { - /* we assume 4-byte accesses */ - if (mem_mask) - logerror("%08X: policetr_video_w access with mask %08X\n", m_maincpu->pcbase(), mem_mask); - /* 4 offsets */ switch (offset) { @@ -188,12 +184,12 @@ WRITE32_MEMBER(policetr_state::policetr_video_w) /* latch 0x50 allows a direct write to the destination bitmap */ case 0x50: if (ACCESSING_BITS_24_31 && m_dst_xoffs < DSTBITMAP_WIDTH && m_dst_yoffs < DSTBITMAP_HEIGHT) - m_dstbitmap[m_dst_yoffs * DSTBITMAP_WIDTH + m_dst_xoffs] = data >> 24; + m_dstbitmap->pix8(m_dst_yoffs,m_dst_xoffs) = data >> 24; break; /* log anything else */ default: - logerror("%08X: policetr_video_w(2) = %08X & %08X with latch %02X\n", m_maincpu->pcbase(), data, mem_mask, m_video_latch); + logerror("%s: video_w(2) = %08X & %08X with latch %02X\n", machine().describe_context(), data, mem_mask, m_video_latch); break; } break; @@ -206,8 +202,8 @@ WRITE32_MEMBER(policetr_state::policetr_video_w) { /* latch 0x00 is unknown; 0, 1, and 2 get written into the upper 12 bits before rendering */ case 0x00: - if (data != (0 << 20) && data != (1 << 20) && data != (2 << 20)) - logerror("%08X: policetr_video_w(3) = %08X & %08X with latch %02X\n", m_maincpu->pcbase(), data, mem_mask, m_video_latch); + if (data != 0 && data != (1 << 20) && data != (2 << 20)) + logerror("%s: video_w(3) = %08X & %08X with latch %02X\n", machine().describe_context(), data, mem_mask, m_video_latch); break; /* latch 0x10 specifies destination bitmap X and Y offsets */ @@ -219,13 +215,13 @@ WRITE32_MEMBER(policetr_state::policetr_video_w) /* latch 0x20 is unknown; either 0xef or 0x100 is written every IRQ4 */ case 0x20: if (data != (0x100 << 12) && data != (0xef << 12)) - logerror("%08X: policetr_video_w(3) = %08X & %08X with latch %02X\n", m_maincpu->pcbase(), data, mem_mask, m_video_latch); + logerror("%s: video_w(3) = %08X & %08X with latch %02X\n", machine().describe_context(), data, mem_mask, m_video_latch); break; /* latch 0x40 is unknown; a 0 is written every IRQ4 */ case 0x40: if (data != 0) - logerror("%08X: policetr_video_w(3) = %08X & %08X with latch %02X\n", m_maincpu->pcbase(), data, mem_mask, m_video_latch); + logerror("%s: video_w(3) = %08X & %08X with latch %02X\n", machine().describe_context(), data, mem_mask, m_video_latch); break; /* latch 0x50 clears IRQ4 */ @@ -240,7 +236,7 @@ WRITE32_MEMBER(policetr_state::policetr_video_w) /* log anything else */ default: - logerror("%08X: policetr_video_w(3) = %08X & %08X with latch %02X\n", m_maincpu->pcbase(), data, mem_mask, m_video_latch); + logerror("%s: video_w(3) = %08X & %08X with latch %02X\n", machine().describe_context(), data, mem_mask, m_video_latch); break; } break; @@ -256,7 +252,7 @@ WRITE32_MEMBER(policetr_state::policetr_video_w) * *************************************/ -READ32_MEMBER(policetr_state::policetr_video_r) +READ32_MEMBER(policetr_state::video_r) { int inputval; int width = m_screen->width(); @@ -267,31 +263,31 @@ READ32_MEMBER(policetr_state::policetr_video_r) { /* latch 0x00 is player 1's gun X coordinate */ case 0x00: - inputval = ((ioport("GUNX1")->read() & 0xff) * width) >> 8; + inputval = ((m_gun_x_io[0]->read() & 0xff) * width) >> 8; inputval += 0x50; return (inputval << 20) | 0x20000000; /* latch 0x01 is player 1's gun Y coordinate */ case 0x01: - inputval = ((ioport("GUNY1")->read() & 0xff) * height) >> 8; + inputval = ((m_gun_y_io[0]->read() & 0xff) * height) >> 8; inputval += 0x17; return (inputval << 20); /* latch 0x02 is player 2's gun X coordinate */ case 0x02: - inputval = ((ioport("GUNX2")->read() & 0xff) * width) >> 8; + inputval = ((m_gun_x_io[1]->read() & 0xff) * width) >> 8; inputval += 0x50; return (inputval << 20) | 0x20000000; /* latch 0x03 is player 2's gun Y coordinate */ case 0x03: - inputval = ((ioport("GUNY2")->read() & 0xff) * height) >> 8; + inputval = ((m_gun_y_io[1]->read() & 0xff) * height) >> 8; inputval += 0x17; return (inputval << 20); /* latch 0x04 is the pixel value in the ROM at the specified address */ case 0x04: - return m_srcbitmap[(m_src_yoffs & m_srcbitmap_height_mask) * SRCBITMAP_WIDTH + m_src_xoffs % SRCBITMAP_WIDTH] << 24; + return m_srcbitmap[((m_src_yoffs & m_srcbitmap_height_mask) << 12) | (m_src_xoffs & 0xfff)] << 24; /* latch 0x50 is read at IRQ 4; the top 2 bits are checked. If they're not 0, they skip the rest of the interrupt processing */ @@ -300,7 +296,7 @@ READ32_MEMBER(policetr_state::policetr_video_r) } /* log anything else */ - logerror("%08X: policetr_video_r with latch %02X\n", m_maincpu->pcbase(), m_video_latch); + logerror("%s: video_r with latch %02X\n", machine().describe_context(), m_video_latch); return 0; } @@ -313,26 +309,20 @@ READ32_MEMBER(policetr_state::policetr_video_r) * *************************************/ -WRITE32_MEMBER(policetr_state::policetr_palette_offset_w) +WRITE8_MEMBER(policetr_state::palette_offset_w) { - if (ACCESSING_BITS_16_23) - { - m_palette_offset = (data >> 16) & 0xff; - m_palette_index = 0; - } + m_palette_offset = data; + m_palette_index = 0; } -WRITE32_MEMBER(policetr_state::policetr_palette_data_w) +WRITE8_MEMBER(policetr_state::palette_data_w) { - if (ACCESSING_BITS_16_23) + m_palette_data[m_palette_index] = data; + if (++m_palette_index == 3) { - m_palette_data[m_palette_index] = (data >> 16) & 0xff; - if (++m_palette_index == 3) - { - m_palette->set_pen_color(m_palette_offset, rgb_t(m_palette_data[0], m_palette_data[1], m_palette_data[2])); - m_palette_index = 0; - } + m_palette->set_pen_color(m_palette_offset, rgb_t(m_palette_data[0], m_palette_data[1], m_palette_data[2])); + m_palette_index = 0; } } @@ -344,14 +334,20 @@ WRITE32_MEMBER(policetr_state::policetr_palette_data_w) * *************************************/ -uint32_t policetr_state::screen_update_policetr(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +uint32_t policetr_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { - int width = cliprect.width(); - int y; + const int width = cliprect.width(); + const rgb_t *palette = m_palette->palette()->entry_list_raw(); /* render all the scanlines from the dstbitmap to MAME's bitmap */ - for (y = cliprect.min_y; y <= cliprect.max_y; y++) - draw_scanline8(bitmap, cliprect.min_x, y, width, &m_dstbitmap[DSTBITMAP_WIDTH * y + cliprect.min_x], nullptr); + for (int y = cliprect.min_y; y <= cliprect.max_y; y++) + { + const uint8_t *src = &m_dstbitmap->pix8(y,cliprect.min_x); + uint32_t *dst = &bitmap.pix32(y,cliprect.min_x); + //draw_scanline8(bitmap, cliprect.min_x, y, width, src, nullptr); + for (int x = 0; x < width; x++, dst++, src++) + *dst = palette[*src]; + } return 0; } diff --git a/src/mame/video/powervr2.cpp b/src/mame/video/powervr2.cpp index 0ec94693195..942a02a820d 100644 --- a/src/mame/video/powervr2.cpp +++ b/src/mame/video/powervr2.cpp @@ -2301,7 +2301,54 @@ void powervr2_device::computedilated() dilatechose[(b << 3) + a]=3+(a < b ? a : b); } -void powervr2_device::render_hline(bitmap_rgb32 &bitmap, texinfo *ti, int y, float xl, float xr, float ul, float ur, float vl, float vr, float wl, float wr, float const bl_in[4], float const br_in[4], float const offl_in[4], float const offr_in[4]) +inline uint32_t powervr2_device::sample_nontextured(texinfo *ti, float u, float v, uint32_t offset_color, uint32_t base_color) +{ + return bls24(base_color, offset_color) | (base_color & 0xff000000); +} + +template <int tsinst, bool bilinear> +inline uint32_t powervr2_device::sample_textured(texinfo *ti, float u, float v, uint32_t offset_color, uint32_t base_color) +{ + uint32_t tmp; + uint32_t c = (this->*(ti->r))(ti, u, v); + if (bilinear) + { + uint32_t c1 = (this->*(ti->r))(ti, u+1.0f, v); + uint32_t c2 = (this->*(ti->r))(ti, u+1.0f, v+1.0f); + uint32_t c3 = (this->*(ti->r))(ti, u, v+1.0f); + c = bilinear_filter(c, c1, c2, c3, u, v); + } + + switch (tsinst) { + case 0: + // decal + c = bls24(c, offset_color) | (c & 0xff000000); + break; + case 1: + // modulate + tmp = blc(c, base_color); + tmp = bls24(tmp, offset_color); + tmp |= c & 0xff000000; + c = tmp; + break; + case 2: + // decal with alpha + tmp = bls24(bla(c, c), blia(base_color, c)); + c = bls24(tmp, offset_color) | (base_color & 0xff000000); + break; + case 3: + // modulate with alpha + tmp = blc(c, base_color); + tmp = bls24(tmp, offset_color); + tmp |= (((c >> 24) * (base_color >> 24)) >> 8) << 24; + c = tmp; + break; + } + return c; +} + +template <powervr2_device::pix_sample_fn sample_fn> +inline void powervr2_device::render_hline(bitmap_rgb32 &bitmap, texinfo *ti, int y, float xl, float xr, float ul, float ur, float vl, float vr, float wl, float wr, float const bl_in[4], float const br_in[4], float const offl_in[4], float const offr_in[4]) { int idx; int xxl, xxr; @@ -2309,12 +2356,7 @@ void powervr2_device::render_hline(bitmap_rgb32 &bitmap, texinfo *ti, int y, flo uint32_t *tdata; float *wbufline; - // untextured cases aren't handled -// if (!ti->textured) return; - float bl[4], offl[4]; - memcpy(bl, bl_in, sizeof(bl)); - memcpy(offl, offl_in, sizeof(offl)); if(xr < 0 || xl >= 640) return; @@ -2325,23 +2367,28 @@ void powervr2_device::render_hline(bitmap_rgb32 &bitmap, texinfo *ti, int y, flo if(xxl == xxr) return; + memcpy(bl, bl_in, sizeof(bl)); + memcpy(offl, offl_in, sizeof(offl)); + dx = xr-xl; - dudx = (ur-ul)/dx; - dvdx = (vr-vl)/dx; - dwdx = (wr-wl)/dx; + float dx_recip = 1.0f / dx; + + dudx = (ur-ul) * dx_recip; + dvdx = (vr-vl) * dx_recip; + dwdx = (wr-wl) * dx_recip; float dbdx[4] = { - (br_in[0] - bl[0]) / dx, - (br_in[1] - bl[1]) / dx, - (br_in[2] - bl[2]) / dx, - (br_in[3] - bl[3]) / dx + (br_in[0] - bl[0]) * dx_recip, + (br_in[1] - bl[1]) * dx_recip, + (br_in[2] - bl[2]) * dx_recip, + (br_in[3] - bl[3]) * dx_recip }; float dodx[4] = { - (offr_in[0] - offl[0]) / dx, - (offr_in[1] - offl[1]) / dx, - (offr_in[2] - offl[2]) / dx, - (offr_in[3] - offl[3]) / dx + (offr_in[0] - offl[0]) * dx_recip, + (offr_in[1] - offl[1]) * dx_recip, + (offr_in[2] - offl[2]) * dx_recip, + (offr_in[3] - offl[3]) * dx_recip }; if(xxl < 0) @@ -2364,64 +2411,15 @@ void powervr2_device::render_hline(bitmap_rgb32 &bitmap, texinfo *ti, int y, flo while(xxl < xxr) { if((wl >= *wbufline)) { + uint32_t c; float u = ul/wl; float v = vl/wl; - - /* - * TODO: Not sure if blending should be done in - * floating point or fixed point, or if it even matters. - */ - uint32_t c; uint32_t offset_color = float_argb_to_packed_argb(offl); uint32_t base_color = float_argb_to_packed_argb(bl); - - if (ti->textured) { - c = (this->*(ti->r))(ti, u, v); - // debug dip to turn on/off bilinear filtering, it's slooooow - if (debug_dip_status&0x1) - { - if(ti->filter_mode >= TEX_FILTER_BILINEAR) - { - uint32_t c1 = (this->*(ti->r))(ti, u+1.0f, v); - uint32_t c2 = (this->*(ti->r))(ti, u+1.0f, v+1.0f); - uint32_t c3 = (this->*(ti->r))(ti, u, v+1.0f); - c = bilinear_filter(c, c1, c2, c3, u, v); - } - } - - uint32_t tmp; - switch (ti->tsinstruction) { - case 0: - // decal - c = bls24(c, offset_color) | (c & 0xff000000); - break; - case 1: - // modulate - tmp = blc(c, base_color); - tmp = bls24(tmp, offset_color); - tmp |= c & 0xff000000; - c = tmp; - break; - case 2: - // decal with alpha - tmp = bls24(bla(c, c), blia(base_color, c)); - c = bls24(tmp, offset_color) | (base_color & 0xff000000); - break; - case 3: - // modulate with alpha - tmp = blc(c, base_color); - tmp = bls24(tmp, offset_color); - tmp |= (((c >> 24) * (base_color >> 24)) >> 8) << 24; - c = tmp; - break; - } - } else { - c = bls24(base_color, offset_color) | (base_color & 0xff000000); - } - + c = (this->*sample_fn)(ti, u, v, offset_color, base_color); if(c & 0xff000000) { - *tdata = ti->blend(c, *tdata); *wbufline = wl; + *tdata = ti->blend(c, *tdata); } } wbufline++; @@ -2438,7 +2436,8 @@ void powervr2_device::render_hline(bitmap_rgb32 &bitmap, texinfo *ti, int y, flo } } -void powervr2_device::render_span(bitmap_rgb32 &bitmap, texinfo *ti, +template <powervr2_device::pix_sample_fn sample_fn> +inline void powervr2_device::render_span(bitmap_rgb32 &bitmap, texinfo *ti, float y0, float y1, float xl, float xr, float ul, float ur, @@ -2516,7 +2515,7 @@ void powervr2_device::render_span(bitmap_rgb32 &bitmap, texinfo *ti, } while(yy0 < yy1) { - render_hline(bitmap, ti, yy0, xl, xr, ul, ur, vl, vr, wl, wr, bl, br, offl, offr); + render_hline<sample_fn>(bitmap, ti, yy0, xl, xr, ul, ur, vl, vr, wl, wr, bl, br, offl, offr); xl += dxldy; xr += dxrdy; @@ -2568,7 +2567,8 @@ void powervr2_device::sort_vertices(const vert *v, int *i0, int *i1, int *i2) } -void powervr2_device::render_tri_sorted(bitmap_rgb32 &bitmap, texinfo *ti, const vert *v0, const vert *v1, const vert *v2) +template <powervr2_device::pix_sample_fn sample_fn> +inline void powervr2_device::render_tri_sorted(bitmap_rgb32 &bitmap, texinfo *ti, const vert *v0, const vert *v1, const vert *v2) { float dy01, dy02, dy12; @@ -2686,15 +2686,15 @@ void powervr2_device::render_tri_sorted(bitmap_rgb32 &bitmap, texinfo *ti, const return; if(v1->x > v0->x) - render_span(bitmap, ti, v1->y, v2->y, v0->x, v1->x, v0->u, v1->u, v0->v, v1->v, v0->w, v1->w, v0->b, v1->b, v0->o, v1->o, dx02dy, dx12dy, du02dy, du12dy, dv02dy, dv12dy, dw02dy, dw12dy, db02dy, db12dy, do02dy, do12dy); + render_span<sample_fn>(bitmap, ti, v1->y, v2->y, v0->x, v1->x, v0->u, v1->u, v0->v, v1->v, v0->w, v1->w, v0->b, v1->b, v0->o, v1->o, dx02dy, dx12dy, du02dy, du12dy, dv02dy, dv12dy, dw02dy, dw12dy, db02dy, db12dy, do02dy, do12dy); else - render_span(bitmap, ti, v1->y, v2->y, v1->x, v0->x, v1->u, v0->u, v1->v, v0->v, v1->w, v0->w, v1->b, v0->b, v1->o, v0->o, dx12dy, dx02dy, du12dy, du02dy, dv12dy, dv02dy, dw12dy, dw02dy, db12dy, db02dy, do12dy, do02dy); + render_span<sample_fn>(bitmap, ti, v1->y, v2->y, v1->x, v0->x, v1->u, v0->u, v1->v, v0->v, v1->w, v0->w, v1->b, v0->b, v1->o, v0->o, dx12dy, dx02dy, du12dy, du02dy, dv12dy, dv02dy, dw12dy, dw02dy, db12dy, db02dy, do12dy, do02dy); } else if(!dy12) { if(v2->x > v1->x) - render_span(bitmap, ti, v0->y, v1->y, v0->x, v0->x, v0->u, v0->u, v0->v, v0->v, v0->w, v0->w, v0->b, v0->b, v0->o, v0->o, dx01dy, dx02dy, du01dy, du02dy, dv01dy, dv02dy, dw01dy, dw02dy, db01dy, db02dy, do01dy, do02dy); + render_span<sample_fn>(bitmap, ti, v0->y, v1->y, v0->x, v0->x, v0->u, v0->u, v0->v, v0->v, v0->w, v0->w, v0->b, v0->b, v0->o, v0->o, dx01dy, dx02dy, du01dy, du02dy, dv01dy, dv02dy, dw01dy, dw02dy, db01dy, db02dy, do01dy, do02dy); else - render_span(bitmap, ti, v0->y, v1->y, v0->x, v0->x, v0->u, v0->u, v0->v, v0->v, v0->w, v0->w, v0->b, v0->b, v0->o, v0->o, dx02dy, dx01dy, du02dy, du01dy, dv02dy, dv01dy, dw02dy, dw01dy, db02dy, db01dy, do02dy, do01dy); + render_span<sample_fn>(bitmap, ti, v0->y, v1->y, v0->x, v0->x, v0->u, v0->u, v0->v, v0->v, v0->w, v0->w, v0->b, v0->b, v0->o, v0->o, dx02dy, dx01dy, du02dy, du01dy, dv02dy, dv01dy, dw02dy, dw01dy, db02dy, db01dy, do02dy, do01dy); } else { float idk_b[4] = { @@ -2710,17 +2710,17 @@ void powervr2_device::render_tri_sorted(bitmap_rgb32 &bitmap, texinfo *ti, const v0->o[3] + do02dy[3] * dy01 }; if(dx01dy < dx02dy) { - render_span(bitmap, ti, v0->y, v1->y, + render_span<sample_fn>(bitmap, ti, v0->y, v1->y, v0->x, v0->x, v0->u, v0->u, v0->v, v0->v, v0->w, v0->w, v0->b, v0->b, v0->o, v0->o, dx01dy, dx02dy, du01dy, du02dy, dv01dy, dv02dy, dw01dy, dw02dy, db01dy, db02dy, do01dy, do02dy); - render_span(bitmap, ti, v1->y, v2->y, + render_span<sample_fn>(bitmap, ti, v1->y, v2->y, v1->x, v0->x + dx02dy*dy01, v1->u, v0->u + du02dy*dy01, v1->v, v0->v + dv02dy*dy01, v1->w, v0->w + dw02dy*dy01, v1->b, idk_b, v1->o, idk_o, dx12dy, dx02dy, du12dy, du02dy, dv12dy, dv02dy, dw12dy, dw02dy, db12dy, db02dy, do12dy, do02dy); } else { - render_span(bitmap, ti, v0->y, v1->y, + render_span<sample_fn>(bitmap, ti, v0->y, v1->y, v0->x, v0->x, v0->u, v0->u, v0->v, v0->v, v0->w, v0->w, v0->b, v0->b, v0->o, v0->o, dx02dy, dx01dy, du02dy, du01dy, dv02dy, dv01dy, dw02dy, dw01dy, db02dy, db01dy, do02dy, do01dy); - render_span(bitmap, ti, v1->y, v2->y, + render_span<sample_fn>(bitmap, ti, v1->y, v2->y, v0->x + dx02dy*dy01, v1->x, v0->u + du02dy*dy01, v1->u, v0->v + dv02dy*dy01, v1->v, v0->w + dw02dy*dy01, v1->w, idk_b, v1->b, idk_o, v1->o, dx02dy, dx12dy, du02dy, du12dy, dv02dy, dv12dy, dw02dy, dw12dy, db02dy, db12dy, do02dy, do12dy); } @@ -2732,7 +2732,59 @@ void powervr2_device::render_tri(bitmap_rgb32 &bitmap, texinfo *ti, const vert * int i0, i1, i2; sort_vertices(v, &i0, &i1, &i2); - render_tri_sorted(bitmap, ti, v+i0, v+i1, v+i2); + + bool textured = ti->textured; + if (textured) { + bool bilinear = (debug_dip_status & 1) && + (ti->filter_mode >= TEX_FILTER_BILINEAR); + if (bilinear) { + switch (ti->tsinstruction) { + case 0: + render_tri_sorted<&powervr2_device::sample_textured<0,true>>(bitmap, ti, v+i0, v+i1, v+i2); + break; + case 1: + render_tri_sorted<&powervr2_device::sample_textured<1,true>>(bitmap, ti, v+i0, v+i1, v+i2); + break; + case 2: + render_tri_sorted<&powervr2_device::sample_textured<2,true>>(bitmap, ti, v+i0, v+i1, v+i2); + break; + case 3: + render_tri_sorted<&powervr2_device::sample_textured<3,true>>(bitmap, ti, v+i0, v+i1, v+i2); + break; + default: + /* + * This should be impossible because tsinstruction was previously + * AND'd with 3 + */ + logerror("%s - tsinstruction is 0x%08x\n", (unsigned)ti->tsinstruction); + render_tri_sorted<&powervr2_device::sample_nontextured>(bitmap, ti, v+i0, v+i1, v+i2); + } + } else { + switch (ti->tsinstruction) { + case 0: + render_tri_sorted<&powervr2_device::sample_textured<0,false>>(bitmap, ti, v+i0, v+i1, v+i2); + break; + case 1: + render_tri_sorted<&powervr2_device::sample_textured<1,false>>(bitmap, ti, v+i0, v+i1, v+i2); + break; + case 2: + render_tri_sorted<&powervr2_device::sample_textured<2,false>>(bitmap, ti, v+i0, v+i1, v+i2); + break; + case 3: + render_tri_sorted<&powervr2_device::sample_textured<3,false>>(bitmap, ti, v+i0, v+i1, v+i2); + break; + default: + /* + * This should be impossible because tsinstruction was previously + * AND'd with 3 + */ + logerror("%s - tsinstruction is 0x%08x\n", (unsigned)ti->tsinstruction); + render_tri_sorted<&powervr2_device::sample_nontextured>(bitmap, ti, v+i0, v+i1, v+i2); + } + } + } else { + render_tri_sorted<&powervr2_device::sample_nontextured>(bitmap, ti, v+i0, v+i1, v+i2); + } } void powervr2_device::render_to_accumulation_buffer(bitmap_rgb32 &bitmap,const rectangle &cliprect) diff --git a/src/mame/video/powervr2.h b/src/mame/video/powervr2.h index 19908a736c6..0fe9c2beb67 100644 --- a/src/mame/video/powervr2.h +++ b/src/mame/video/powervr2.h @@ -305,6 +305,13 @@ public: void pvr_scanline_timer(int vpos); uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + typedef uint32_t(powervr2_device::*pix_sample_fn)(texinfo*,float,float,uint32_t,uint32_t); + + inline uint32_t sample_nontextured(texinfo *ti, float u, float v, uint32_t offset_color, uint32_t base_color); + + template <int tsinst, bool bilinear> + inline uint32_t sample_textured(texinfo *ti, float u, float v, uint32_t offset_color, uint32_t base_color); + protected: virtual void device_start() override; virtual void device_reset() override; @@ -462,23 +469,36 @@ private: uint32_t tex_r_default(texinfo *t, float x, float y); void tex_get_info(texinfo *t); - void render_hline(bitmap_rgb32 &bitmap, texinfo *ti, int y, float xl, float xr, float ul, float ur, float vl, float vr, float wl, float wr, float const bl[4], float const br[4], float const offl[4], float const offr[4]); - void render_span(bitmap_rgb32 &bitmap, texinfo *ti, - float y0, float y1, - float xl, float xr, - float ul, float ur, - float vl, float vr, - float wl, float wr, - float const bl[4], float const br[4], - float const offl[4], float const offr[4], - float dxldy, float dxrdy, - float duldy, float durdy, - float dvldy, float dvrdy, - float dwldy, float dwrdy, - float const dbldy[4], float const dbrdy[4], - float const doldy[4], float const dordy[4]); + template <pix_sample_fn sample_fn> + inline void render_hline(bitmap_rgb32 &bitmap, texinfo *ti, + int y, float xl, float xr, + float ul, float ur, float vl, float vr, + float wl, float wr, + float const bl[4], float const br[4], + float const offl[4], float const offr[4]); + + template <pix_sample_fn sample_fn> + inline void render_span(bitmap_rgb32 &bitmap, texinfo *ti, + float y0, float y1, + float xl, float xr, + float ul, float ur, + float vl, float vr, + float wl, float wr, + float const bl[4], float const br[4], + float const offl[4], float const offr[4], + float dxldy, float dxrdy, + float duldy, float durdy, + float dvldy, float dvrdy, + float dwldy, float dwrdy, + float const dbldy[4], float const dbrdy[4], + float const doldy[4], float const dordy[4]); + + template <pix_sample_fn sample_fn> + inline void render_tri_sorted(bitmap_rgb32 &bitmap, texinfo *ti, + const vert *v0, + const vert *v1, const vert *v2); + void sort_vertices(const vert *v, int *i0, int *i1, int *i2); - void render_tri_sorted(bitmap_rgb32 &bitmap, texinfo *ti, const vert *v0, const vert *v1, const vert *v2); void render_tri(bitmap_rgb32 &bitmap, texinfo *ti, const vert *v); void render_to_accumulation_buffer(bitmap_rgb32 &bitmap, const rectangle &cliprect); void pvr_accumulationbuffer_to_framebuffer(address_space &space, int x, int y); diff --git a/src/mame/video/quasar.cpp b/src/mame/video/quasar.cpp index 8f94b3b89e0..8450ffe354f 100644 --- a/src/mame/video/quasar.cpp +++ b/src/mame/video/quasar.cpp @@ -170,11 +170,11 @@ uint32_t quasar_state::screen_update_quasar(screen_device &screen, bitmap_ind16 { int y; - for (y = cliprect.min_y; y <= cliprect.max_y; y++) + for (y = cliprect.top(); y <= cliprect.bottom(); y++) { int x; - for (x = cliprect.min_x; x <= cliprect.max_x; x++) + for (x = cliprect.left(); x <= cliprect.right(); x++) { int pixel0 = s2636_0_bitmap.pix16(y, x); int pixel1 = s2636_1_bitmap.pix16(y, x); diff --git a/src/mame/video/rampart.cpp b/src/mame/video/rampart.cpp index d4ea5e1a2d0..4798bb4d8c8 100644 --- a/src/mame/video/rampart.cpp +++ b/src/mame/video/rampart.cpp @@ -76,11 +76,11 @@ uint32_t rampart_state::screen_update_rampart(screen_device &screen, bitmap_ind1 // draw and merge the MO bitmap_ind16 &mobitmap = m_mob->bitmap(); for (const sparse_dirty_rect *rect = m_mob->first_dirty_rect(cliprect); rect != nullptr; rect = rect->next()) - for (int y = rect->min_y; y <= rect->max_y; y++) + for (int y = rect->top(); y <= rect->bottom(); y++) { uint16_t *mo = &mobitmap.pix16(y); uint16_t *pf = &bitmap.pix16(y); - for (int x = rect->min_x; x <= rect->max_x; x++) + for (int x = rect->left(); x <= rect->right(); x++) if (mo[x] != 0xffff) { /* the PCB supports more complex priorities, but the PAL is not stuffed, so we get the default */ @@ -101,13 +101,13 @@ uint32_t rampart_state::screen_update_rampart(screen_device &screen, bitmap_ind1 void rampart_state::rampart_bitmap_render(bitmap_ind16 &bitmap, const rectangle &cliprect) { /* update any dirty scanlines */ - for (int y = cliprect.min_y; y <= cliprect.max_y; y++) + for (int y = cliprect.top(); y <= cliprect.bottom(); y++) { const uint16_t *src = &m_bitmap[256 * y]; uint16_t *dst = &bitmap.pix16(y); /* regenerate the line */ - for (int x = cliprect.min_x & ~1; x <= cliprect.max_x; x += 2) + for (int x = cliprect.left() & ~1; x <= cliprect.right(); x += 2) { int bits = src[(x - 8) / 2]; dst[x + 0] = bits >> 8; diff --git a/src/mame/video/realbrk.cpp b/src/mame/video/realbrk.cpp index 0b419694fd6..02b1118f122 100644 --- a/src/mame/video/realbrk.cpp +++ b/src/mame/video/realbrk.cpp @@ -184,81 +184,74 @@ void realbrk_state::video_start() ***************************************************************************/ -void realbrk_state::draw_sprites(bitmap_ind16 &bitmap,const rectangle &cliprect, int layer) +// DaiDaiKakumei +// layer : 0== bghigh<spr 1== bglow<spr<bghigh 2==spr<bglow 3==boarder +template <bool Rotatable> +void realbrk_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, int layer) { - int offs; + int const max_x(m_screen->width()); + int const max_y(m_screen->height()); - int max_x = m_screen->width(); - int max_y = m_screen->height(); - - rectangle spritetile_clip(0, 31, 0, 31); - - for ( offs = 0x3000/2; offs < 0x3600/2; offs += 2/2 ) + for (int offs = 0x3000 / 2; offs < 0x3600 / 2; offs += 2 / 2) { - int sx, sy, dim, zoom, flip, color, attr, code, flipx, flipy, gfx, rot, pri; + if (BIT(m_spriteram[offs], 15)) + continue; - int x, xdim, xnum, xstart, xend, xinc; - int y, ydim, ynum, ystart, yend, yinc; + uint16_t const *const s(&m_spriteram[(m_spriteram[offs] & 0x3ff) * 16 / 2]); - if (m_spriteram[offs] & 0x8000) - continue; + int sy = s[0]; - uint16_t const *const s = &m_spriteram[(m_spriteram[offs] & 0x3ff) * 16/2]; + int sx = s[1]; - sy = s[ 0 ]; - sx = s[ 1 ]; - dim = s[ 2 ]; - zoom = s[ 3 ]; - flip = s[ 4 ]; - color = s[ 5 ]; - attr = s[ 6 ]; - code = s[ 7 ]; + int xnum = ((s[2] >> 0) & 0x001f) + 1; + int ynum = ((s[2] >> 8) & 0x001f) + 1; - pri = flip & 0x03; + int xdim = ((s[3] >> 0) & 0x00ff) << (16 - 6 + 4); + int ydim = ((s[3] >> 8) & 0x00ff) << (16 - 6 + 4); - if(pri != layer) - continue; + int flipx = BIT(s[4], 8); + int flipy = BIT(s[4], 9); + int rot = (s[4] >> 4) & 0x0003; + int pri = (s[4] >> 0) & 0x0003; + + int color = s[5]; - xnum = ((dim >> 0) & 0x1f) + 1; - ynum = ((dim >> 8) & 0x1f) + 1; + int gfx = (s[6] & 0x0001) + 2; - flipx = flip & 0x0100; - flipy = flip & 0x0200; - rot = (flip & 0x0030) >> 4; + int code = s[7]; - gfx = (attr & 0x0001) + 2; + if (pri != layer) + continue; sx = ((sx & 0x1ff) - (sx & 0x200)) << 16; sy = ((sy & 0x0ff) - (sy & 0x100)) << 16; - xdim = ((zoom & 0x00ff) >> 0) << (16-6+4); - ydim = ((zoom & 0xff00) >> 8) << (16-6+4); - - if (flip_screen_x()) { flipx = !flipx; sx = (max_x << 16) - sx - xnum * xdim; } - if (flip_screen_y()) { flipy = !flipy; sy = (max_y << 16) - sy - ynum * ydim; } + if (flip_screen_x()) { flipx = !flipx; sx = (max_x << 16) - sx - xnum * xdim; } + if (flip_screen_y()) { flipy = !flipy; sy = (max_y << 16) - sy - ynum * ydim; } + int xstart, xend, xinc; if (flipx) { xstart = xnum-1; xend = -1; xinc = -1; } else { xstart = 0; xend = xnum; xinc = +1; } + int ystart, yend, yinc; if (flipy) { ystart = ynum-1; yend = -1; yinc = -1; } else { ystart = 0; yend = ynum; yinc = +1; } - - // The positioning of the rotated sprites makes it look as if - // the sprite source is scanned in a constant pattern left to right, - // top to bottom, and the destination plotting pattern is varied. - // copyrozbitmap works the other way. - - // Rotating a sprite when drawgfxzoom draws a tile at a time means - // - rotating each sprite tile - // - transforming each tile position - // - compensating for the offset introduced by the difference in - // scanning patterns between the original mechanism and copyrozbitmap - - - for (y = ystart; y != yend; y += yinc) + /* + The positioning of the rotated sprites makes it look as if + the sprite source is scanned in a constant pattern left to right, + top to bottom, and the destination plotting pattern is varied. + copyrozbitmap works the other way. + + Rotating a sprite when drawgfxzoom draws a tile at a time means + - rotating each sprite tile + - transforming each tile position + - compensating for the offset introduced by the difference in + scanning patterns between the original mechanism and copyrozbitmap + */ + for (int y = ystart; y != yend; y += yinc) { - for (x = xstart; x != xend; x += xinc) + for (int x = xstart; x != xend; x += xinc) { int currx = (sx + x * xdim) / 0x10000; int curry = (sy + y * ydim) / 0x10000; @@ -266,159 +259,79 @@ void realbrk_state::draw_sprites(bitmap_ind16 &bitmap,const rectangle &cliprect, int scalex = (sx + (x + 1) * xdim) / 0x10000 - currx; int scaley = (sy + (y + 1) * ydim) / 0x10000 - curry; - // buffer the tile and rotate it into bitmap - if( rot ) + if (Rotatable && rot) { - m_tmpbitmap0->fill(0, spritetile_clip ); - m_tmpbitmap1->fill(0, spritetile_clip ); - m_gfxdecode->gfx(gfx)->zoom_transpen(*m_tmpbitmap0,spritetile_clip, - code++, - color, - flipx, flipy, - 0,0, - (rot & 1 ? scaley : scalex) << 12, (rot & 1 ? scalex : scaley) << 12,0); + // buffer the tile and rotate it into bitmap + constexpr rectangle spritetile_clip(0, 31, 0, 31); + m_tmpbitmap0->fill(0, spritetile_clip); + m_tmpbitmap1->fill(0, spritetile_clip); + m_gfxdecode->gfx(gfx)->zoom_transpen(*m_tmpbitmap0, spritetile_clip, + code++, + color, + flipx, flipy, + 0, 0, + ((rot & 1) ? scaley : scalex) << 12, ((rot & 1) ? scalex : scaley) << 12, + 0); // peek at the unrotated sprite - // copybitmap_trans( bitmap,*m_tmpbitmap0, 0,0, 50+(x * xdim/0x10000),50+(y * ydim/0x10000), cliprect, 0 ); - } - - switch( rot ) - { + // copybitmap_trans(bitmap, *m_tmpbitmap0, 0,0, 50 + (x * xdim / 0x10000), 50 + (y * ydim/0x10000), cliprect, 0); + switch (rot) + { case 0x1: // rot 90 - copyrozbitmap_trans( *m_tmpbitmap1, m_tmpbitmap1->cliprect(), *m_tmpbitmap0, - (uint32_t)0<<16, - (uint32_t)16<<16, - 0 << 16, - 0xffff << 16, - 1 << 16, - 0 << 16, - 0, 0 ); - - currx = (sx - (y+1) * ydim) / 0x10000; - curry = (sy + x * xdim) / 0x10000; - - copybitmap_trans( bitmap,*m_tmpbitmap1, 0,0, currx,curry, cliprect, 0 ); + copyrozbitmap_trans(*m_tmpbitmap1, m_tmpbitmap1->cliprect(), *m_tmpbitmap0, + uint32_t(0) << 16, + uint32_t(16) << 16, + 0 << 16, + 0xffff << 16, + 1 << 16, + 0 << 16, + 0, 0); + + currx = (sx - (y + 1) * ydim) / 0x10000; + curry = (sy + x * xdim) / 0x10000; break; case 0x2: // rot 180 - copyrozbitmap_trans( *m_tmpbitmap1, m_tmpbitmap1->cliprect(), *m_tmpbitmap0, - (uint32_t)16<<16, - (uint32_t)16<<16, - 0xffff << 16, - 0 << 16, - 0 << 16, - 0xffff << 16, - 0, 0 ); - - currx = (sx - (x+1) * xdim) / 0x10000; - curry = (sy - (y+1) * ydim) / 0x10000; - - copybitmap_trans( bitmap,*m_tmpbitmap1, 0,0, currx,curry, cliprect, 0 ); + copyrozbitmap_trans(*m_tmpbitmap1, m_tmpbitmap1->cliprect(), *m_tmpbitmap0, + uint32_t(16) << 16, + uint32_t(16) << 16, + 0xffff << 16, + 0 << 16, + 0 << 16, + 0xffff << 16, + 0, 0); + + currx = (sx - (x + 1) * xdim) / 0x10000; + curry = (sy - (y + 1) * ydim) / 0x10000; break; case 0x3: // rot 270 - copyrozbitmap_trans( *m_tmpbitmap1, m_tmpbitmap1->cliprect(), *m_tmpbitmap0, - (uint32_t)16<<16, - (uint32_t)0<<16, - 0 << 16, - 1 << 16, - 0xffff << 16, - 0 << 16, - 0, 0 ); - - currx = (sx + y * ydim) / 0x10000; - curry = (sy - (x+1) * xdim) / 0x10000; - - copybitmap_trans( bitmap,*m_tmpbitmap1, 0,0, currx,curry, cliprect, 0 ); + copyrozbitmap_trans(*m_tmpbitmap1, m_tmpbitmap1->cliprect(), *m_tmpbitmap0, + uint32_t(16) << 16, + uint32_t(0) << 16, + 0 << 16, + 1 << 16, + 0xffff << 16, + 0 << 16, + 0, 0); + + currx = (sx + y * ydim) / 0x10000; + curry = (sy - (x + 1) * xdim) / 0x10000; break; + } - default: - m_gfxdecode->gfx(gfx)->zoom_transpen(bitmap,cliprect, - code++, - color, - flipx, flipy, - currx, curry, - scalex << 12, scaley << 12,0); - break; + copybitmap_trans(bitmap, *m_tmpbitmap1, 0, 0, currx, curry, cliprect, 0); + } + else + { + m_gfxdecode->gfx(gfx)->zoom_transpen(bitmap, cliprect, + code++, + color, + flipx, flipy, + currx, curry, + scalex << 12, scaley << 12, + 0); } - - } - } - } -} - -/* DaiDaiKakumei */ -/* layer : 0== bghigh<spr 1== bglow<spr<bghigh 2==spr<bglow 3==boarder */ -void realbrk_state::dai2kaku_draw_sprites(bitmap_ind16 &bitmap,const rectangle &cliprect, int layer) -{ - int offs; - - int max_x = m_screen->width(); - int max_y = m_screen->height(); - - for ( offs = 0x3000/2; offs < 0x3600/2; offs += 2/2 ) - { - int sx, sy, dim, zoom, flip, color, attr, code, flipx, flipy, gfx; - - int x, xdim, xnum, xstart, xend, xinc; - int y, ydim, ynum, ystart, yend, yinc; - - uint16_t *s; - - if (m_spriteram[offs] & 0x8000) continue; - - s = &m_spriteram[(m_spriteram[offs] & 0x3ff) * 16/2]; - - sy = s[ 0 ]; - sx = s[ 1 ]; - dim = s[ 2 ]; - zoom = s[ 3 ]; - flip = s[ 4 ]; - color = s[ 5 ]; - attr = s[ 6 ]; - code = s[ 7 ]; - - if(( flip & 0x03 ) != layer ) continue; - - xnum = ((dim >> 0) & 0x1f) + 1; - ynum = ((dim >> 8) & 0x1f) + 1; - - flipx = flip & 0x0100; - flipy = flip & 0x0200; - - gfx = (attr & 0x0001) + 2; - - sx = ((sx & 0x1ff) - (sx & 0x200)) << 16; - sy = ((sy & 0x0ff) - (sy & 0x100)) << 16; - - xdim = ((zoom & 0x00ff) >> 0) << (16-6+4); - ydim = ((zoom & 0xff00) >> 8) << (16-6+4); - - if (flip_screen_x()) { flipx = !flipx; sx = (max_x << 16) - sx - xnum * xdim; } - if (flip_screen_y()) { flipy = !flipy; sy = (max_y << 16) - sy - ynum * ydim; } - - if (flipx) { xstart = xnum-1; xend = -1; xinc = -1; } - else { xstart = 0; xend = xnum; xinc = +1; } - - if (flipy) { ystart = ynum-1; yend = -1; yinc = -1; } - else { ystart = 0; yend = ynum; yinc = +1; } - - for (y = ystart; y != yend; y += yinc) - { - for (x = xstart; x != xend; x += xinc) - { - int currx = (sx + x * xdim) / 0x10000; - int curry = (sy + y * ydim) / 0x10000; - - int scalex = (sx + (x + 1) * xdim) / 0x10000 - currx; - int scaley = (sy + (y + 1) * ydim) / 0x10000 - curry; - - m_gfxdecode->gfx(gfx)->zoom_transpen(bitmap,cliprect, - code++, - color, - flipx, flipy, - currx, curry, - scalex << 12, scaley << 12,0); } } } @@ -465,46 +378,46 @@ WRITE16_MEMBER(realbrk_state::vregs_w) uint32_t realbrk_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { - int layers_ctrl = -1; - m_tilemap[0]->set_scrolly(0, m_vregs[0x0/2]); m_tilemap[0]->set_scrollx(0, m_vregs[0x2/2]); m_tilemap[1]->set_scrolly(0, m_vregs[0x4/2]); m_tilemap[1]->set_scrollx(0, m_vregs[0x6/2]); -#ifdef MAME_DEBUG -if ( machine().input().code_pressed(KEYCODE_Z) ) -{ - int msk = 0; - if (machine().input().code_pressed(KEYCODE_Q)) msk |= 1; - if (machine().input().code_pressed(KEYCODE_W)) msk |= 2; - if (machine().input().code_pressed(KEYCODE_E)) msk |= 4; - if (machine().input().code_pressed(KEYCODE_A)) msk |= 8; - if (msk != 0) layers_ctrl &= msk; -} -#endif - if (m_disable_video) { bitmap.fill(m_palette->black_pen(), cliprect); return 0; } - else - bitmap.fill(m_vregs[0xc/2] & 0x7fff, cliprect); - if (layers_ctrl & 8) draw_sprites(bitmap,cliprect,3); // Unknown - if (layers_ctrl & 8) draw_sprites(bitmap,cliprect,2); // Under m_tilemap[1], Under m_tilemap[0] + bitmap.fill(m_vregs[0xc / 2] & 0x7fff, cliprect); + screen.priority().fill(0, cliprect); + + int layers_ctrl(-1); +#ifdef MAME_DEBUG + if (machine().input().code_pressed(KEYCODE_Z)) + { + int msk(0); + if (machine().input().code_pressed(KEYCODE_Q)) msk |= 1; + if (machine().input().code_pressed(KEYCODE_W)) msk |= 2; + if (machine().input().code_pressed(KEYCODE_E)) msk |= 4; + if (machine().input().code_pressed(KEYCODE_A)) msk |= 8; + if (msk) layers_ctrl &= msk; + } +#endif + + if (layers_ctrl & 8) draw_sprites<true>(bitmap, cliprect, 3); // Unknown + if (layers_ctrl & 8) draw_sprites<true>(bitmap, cliprect, 2); // Under m_tilemap[1], Under m_tilemap[0] - if (layers_ctrl & 2) m_tilemap[1]->draw(screen, bitmap, cliprect, 0,0); + if (layers_ctrl & 2) m_tilemap[1]->draw(screen, bitmap, cliprect, 0, 1); - if (layers_ctrl & 8) draw_sprites(bitmap,cliprect,1); // Over m_tilemap[1], Under m_tilemap[0] + if (layers_ctrl & 8) draw_sprites<true>(bitmap,cliprect, 1); // Over m_tilemap[1], Under m_tilemap[0] - if (layers_ctrl & 1) m_tilemap[0]->draw(screen, bitmap, cliprect, 0,0); + if (layers_ctrl & 1) m_tilemap[0]->draw(screen, bitmap, cliprect, 0, 2); - if (layers_ctrl & 8) draw_sprites(bitmap,cliprect,0); // Over m_tilemap[1], Over m_tilemap[0] + if (layers_ctrl & 8) draw_sprites<true>(bitmap,cliprect, 0); // Over m_tilemap[1], Over m_tilemap[0] - if (layers_ctrl & 4) m_tilemap[2]->draw(screen, bitmap, cliprect, 0,0); + if (layers_ctrl & 4) m_tilemap[2]->draw(screen, bitmap, cliprect, 0, 4); // popmessage("%04x",m_vregs[0x8/2]); return 0; @@ -513,85 +426,79 @@ if ( machine().input().code_pressed(KEYCODE_Z) ) /* DaiDaiKakumei */ uint32_t realbrk_state::screen_update_dai2kaku(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { - int layers_ctrl = -1; - int offs; - - int const bgy0 = m_vregs[0x0/2]; - int const bgx0 = m_vregs[0x2/2]; - int const bgy1 = m_vregs[0x4/2]; - int const bgx1 = m_vregs[0x6/2]; - // bg0 - if( m_vregs[8/2] & (0x0100)){ + int const bgy0(m_vregs[0x0 / 2]); + int const bgx0(m_vregs[0x2 / 2]); + if (BIT(m_vregs[8 / 2], 8)) + { m_tilemap[0]->set_scroll_rows(512); - for(offs=0; offs<(512); offs++) { - m_tilemap[0]->set_scrollx(offs, bgx0 - (m_vram_ras[1][offs]&0x3ff) ); - } - } else { + for (int offs = 0; offs < 512; offs++) + m_tilemap[0]->set_scrollx(offs, bgx0 - (m_vram_ras[1][offs] & 0x3ff)); + } + else + { m_tilemap[0]->set_scroll_rows(1); - m_tilemap[0]->set_scrollx(0, bgx0 ); + m_tilemap[0]->set_scrollx(0, bgx0); } - m_tilemap[0]->set_scrolly(0, bgy0 ); + m_tilemap[0]->set_scrolly(0, bgy0); // bg1 - if( m_vregs[8/2] & (0x0001)){ + int const bgy1(m_vregs[0x4 / 2]); + int const bgx1(m_vregs[0x6 / 2]); + if (BIT(m_vregs[8 / 2], 0)) + { m_tilemap[1]->set_scroll_rows(512); - for(offs=0; offs<(512); offs++) { - m_tilemap[1]->set_scrollx(offs, bgx1 - (m_vram_ras[1][offs]&0x3ff) ); - } - } else { + for (int offs = 0; offs < 512; offs++) + m_tilemap[1]->set_scrollx(offs, bgx1 - (m_vram_ras[1][offs] & 0x3ff)); + } + else + { m_tilemap[1]->set_scroll_rows(1); - m_tilemap[1]->set_scrollx(0, bgx1 ); + m_tilemap[1]->set_scrollx(0, bgx1); } - m_tilemap[1]->set_scrolly(0, bgy1 ); - -#ifdef MAME_DEBUG -if ( machine().input().code_pressed(KEYCODE_Z) ) -{ - int msk = 0; - if (machine().input().code_pressed(KEYCODE_Q)) msk |= 1; - if (machine().input().code_pressed(KEYCODE_W)) msk |= 2; - if (machine().input().code_pressed(KEYCODE_E)) msk |= 4; - if (machine().input().code_pressed(KEYCODE_A)) msk |= 8; - if (msk != 0) layers_ctrl &= msk; -} -#endif + m_tilemap[1]->set_scrolly(0, bgy1); if (m_disable_video) { bitmap.fill(m_palette->black_pen(), cliprect); return 0; } - else - bitmap.fill(m_vregs[0xc/2] & 0x7fff, cliprect); + bitmap.fill(m_vregs[0xc/2] & 0x7fff, cliprect); + screen.priority().fill(0, cliprect); + + int layers_ctrl(-1); +#ifdef MAME_DEBUG + if (machine().input().code_pressed(KEYCODE_Z)) + { + int msk(0); + if (machine().input().code_pressed(KEYCODE_Q)) msk |= 1; + if (machine().input().code_pressed(KEYCODE_W)) msk |= 2; + if (machine().input().code_pressed(KEYCODE_E)) msk |= 4; + if (machine().input().code_pressed(KEYCODE_A)) msk |= 8; + if (msk) layers_ctrl &= msk; + } +#endif + bool const bgpri(BIT(m_vregs[8 / 2], 15)); // spr 0 - if (layers_ctrl & 8) dai2kaku_draw_sprites(bitmap,cliprect,2); + if (layers_ctrl & 8) draw_sprites<false>(bitmap, cliprect, 2); // bglow - if( m_vregs[8/2] & (0x8000)){ - if (layers_ctrl & 1) m_tilemap[0]->draw(screen, bitmap, cliprect, 0,0); - } else { - if (layers_ctrl & 2) m_tilemap[1]->draw(screen, bitmap, cliprect, 0,0); - } + if (layers_ctrl & (bgpri ? 1 : 2)) m_tilemap[bgpri ? 0 : 1]->draw(screen, bitmap, cliprect, 0, 1); // spr 1 - if (layers_ctrl & 8) dai2kaku_draw_sprites(bitmap,cliprect,1); + if (layers_ctrl & 8) draw_sprites<false>(bitmap, cliprect, 1); // bghigh - if( m_vregs[8/2] & (0x8000)){ - if (layers_ctrl & 2) m_tilemap[1]->draw(screen, bitmap, cliprect, 0,0); - } else { - if (layers_ctrl & 1) m_tilemap[0]->draw(screen, bitmap, cliprect, 0,0); - } + if (layers_ctrl & (bgpri ? 2 : 1)) m_tilemap[bgpri ? 1 : 0]->draw(screen, bitmap, cliprect, 0, 2); // spr 2 - if (layers_ctrl & 8) dai2kaku_draw_sprites(bitmap,cliprect,0); + if (layers_ctrl & 8) draw_sprites<false>(bitmap, cliprect, 0); // fix - if (layers_ctrl & 4) m_tilemap[2]->draw(screen, bitmap, cliprect, 0,0); + if (layers_ctrl & 4) m_tilemap[2]->draw(screen, bitmap, cliprect, 0, 4); // usrintf_showmessage("%04x",m_vregs[0x8/2]); return 0; diff --git a/src/mame/video/relief.cpp b/src/mame/video/relief.cpp index e5d64c94d22..26b344682ef 100644 --- a/src/mame/video/relief.cpp +++ b/src/mame/video/relief.cpp @@ -107,12 +107,12 @@ uint32_t relief_state::screen_update_relief(screen_device &screen, bitmap_ind16 // draw and merge the MO bitmap_ind16 &mobitmap = m_vad->mob().bitmap(); for (const sparse_dirty_rect *rect = m_vad->mob().first_dirty_rect(cliprect); rect != nullptr; rect = rect->next()) - for (int y = rect->min_y; y <= rect->max_y; y++) + for (int y = rect->top(); y <= rect->bottom(); y++) { uint16_t *mo = &mobitmap.pix16(y); uint16_t *pf = &bitmap.pix16(y); uint8_t *pri = &priority_bitmap.pix8(y); - for (int x = rect->min_x; x <= rect->max_x; x++) + for (int x = rect->left(); x <= rect->right(); x++) if (mo[x] != 0xffff) { /* verified from the GALs on the real PCB; equations follow diff --git a/src/mame/video/rohga.cpp b/src/mame/video/rohga.cpp index e1e6da0e055..73833d5dc9a 100644 --- a/src/mame/video/rohga.cpp +++ b/src/mame/video/rohga.cpp @@ -95,12 +95,12 @@ void rohga_state::mixwizdfirelayer(bitmap_rgb32 &bitmap, const rectangle &clipre uint32_t* dstline; - for (y=cliprect.min_y;y<=cliprect.max_y;y++) + for (y=cliprect.top();y<=cliprect.bottom();y++) { srcline=&sprite_bitmap->pix16(y,0); dstline=&bitmap.pix32(y,0); - for (x=cliprect.min_x;x<=cliprect.max_x;x++) + for (x=cliprect.left();x<=cliprect.right();x++) { uint16_t pix = srcline[x]; @@ -183,7 +183,7 @@ void rohga_state::mixnitroballlayer(screen_device &screen, bitmap_rgb32 &bitmap, uint16_t *srcline1, *srcline2; uint8_t *srcpriline; - for (y=cliprect.min_y;y<=cliprect.max_y;y++) + for (y=cliprect.top();y<=cliprect.bottom();y++) { srcline1=&sprite_bitmap1->pix16(y,0); srcline2=&sprite_bitmap2->pix16(y,0); @@ -191,7 +191,7 @@ void rohga_state::mixnitroballlayer(screen_device &screen, bitmap_rgb32 &bitmap, dstline=&bitmap.pix32(y,0); - for (x=cliprect.min_x;x<=cliprect.max_x;x++) + for (x=cliprect.left();x<=cliprect.right();x++) { uint16_t pix1 = srcline1[x]; uint16_t pix2 = srcline2[x]; diff --git a/src/mame/video/seta.cpp b/src/mame/video/seta.cpp index dc66f28e994..3c13018f99f 100644 --- a/src/mame/video/seta.cpp +++ b/src/mame/video/seta.cpp @@ -227,7 +227,7 @@ static const game_offset game_offsets[] = ---- ---0 Coin #0 Counter */ // some games haven't the coin lockout device (blandia, eightfrc, extdwnhl, gundhara, kamenrid, magspeed, sokonuke, zingzip, zombraid) -WRITE8_MEMBER(seta_state::seta_coin_counter_w) +void seta_state::seta_coin_counter_w(u8 data) { machine().bookkeeping().coin_counter_w(0, BIT(data, 0)); machine().bookkeeping().coin_counter_w(1, BIT(data, 1)); @@ -236,9 +236,9 @@ WRITE8_MEMBER(seta_state::seta_coin_counter_w) m_x1->enable_w(BIT(data, 6)); } -WRITE8_MEMBER(seta_state::seta_coin_lockout_w) +void seta_state::seta_coin_lockout_w(u8 data) { - seta_coin_counter_w(space, 0, data); + seta_coin_counter_w(data); machine().bookkeeping().coin_lockout_w(0, !BIT(data, 2)); machine().bookkeeping().coin_lockout_w(1, !BIT(data, 3)); diff --git a/src/mame/video/shuuz.cpp b/src/mame/video/shuuz.cpp index eb0aa7089cf..af83bede0e0 100644 --- a/src/mame/video/shuuz.cpp +++ b/src/mame/video/shuuz.cpp @@ -86,11 +86,11 @@ uint32_t shuuz_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, // draw and merge the MO bitmap_ind16 &mobitmap = m_vad->mob().bitmap(); for (const sparse_dirty_rect *rect = m_vad->mob().first_dirty_rect(cliprect); rect != nullptr; rect = rect->next()) - for (int y = rect->min_y; y <= rect->max_y; y++) + for (int y = rect->top(); y <= rect->bottom(); y++) { uint16_t *mo = &mobitmap.pix16(y); uint16_t *pf = &bitmap.pix16(y); - for (int x = rect->min_x; x <= rect->max_x; x++) + for (int x = rect->left(); x <= rect->right(); x++) if (mo[x] != 0xffff) { /* verified from the GALs on the real PCB; equations follow diff --git a/src/mame/video/skullxbo.cpp b/src/mame/video/skullxbo.cpp index 8ebc443e31a..dd0507fa1a1 100644 --- a/src/mame/video/skullxbo.cpp +++ b/src/mame/video/skullxbo.cpp @@ -120,7 +120,7 @@ WRITE16_MEMBER( skullxbo_state::skullxbo_yscroll_w ) m_screen->update_partial(scanline); /* adjust the effective scroll for the current scanline */ - if (scanline > m_screen->visible_area().max_y) + if (scanline > m_screen->visible_area().bottom()) scanline = 0; effscroll = (newscroll >> 7) - scanline; @@ -241,11 +241,11 @@ uint32_t skullxbo_state::screen_update_skullxbo(screen_device &screen, bitmap_in // draw and merge the MO bitmap_ind16 &mobitmap = m_mob->bitmap(); for (const sparse_dirty_rect *rect = m_mob->first_dirty_rect(cliprect); rect != nullptr; rect = rect->next()) - for (int y = rect->min_y; y <= rect->max_y; y++) + for (int y = rect->top(); y <= rect->bottom(); y++) { uint16_t *mo = &mobitmap.pix16(y); uint16_t *pf = &bitmap.pix16(y); - for (int x = rect->min_x; x <= rect->max_x; x++) + for (int x = rect->left(); x <= rect->right(); x++) if (mo[x] != 0xffff) { /* verified from the GALs on the real PCB; equations follow diff --git a/src/mame/video/sprint2.cpp b/src/mame/video/sprint2.cpp index 537f8d9dea3..ac826694ae7 100644 --- a/src/mame/video/sprint2.cpp +++ b/src/mame/video/sprint2.cpp @@ -83,8 +83,8 @@ uint8_t sprint2_state::collision_check(rectangle& rect) int x; int y; - for (y = rect.min_y; y <= rect.max_y; y++) - for (x = rect.min_x; x <= rect.max_x; x++) + for (y = rect.top(); y <= rect.bottom(); y++) + for (x = rect.left(); x <= rect.right(); x++) { uint16_t a = m_palette->pen_indirect(m_helper.pix16(y, x)); @@ -155,13 +155,11 @@ WRITE_LINE_MEMBER(sprint2_state::screen_vblank_sprint2) for (i = 0; i < 2; i++) { - rectangle rect; - - rect.min_x = get_sprite_x(video_ram, i); - rect.min_y = get_sprite_y(video_ram, i); - rect.max_x = get_sprite_x(video_ram, i) + m_gfxdecode->gfx(1)->width() - 1; - rect.max_y = get_sprite_y(video_ram, i) + m_gfxdecode->gfx(1)->height() - 1; - + rectangle rect( + get_sprite_x(video_ram, i), + get_sprite_x(video_ram, i) + m_gfxdecode->gfx(1)->width() - 1, + get_sprite_y(video_ram, i), + get_sprite_y(video_ram, i) + m_gfxdecode->gfx(1)->height() - 1); rect &= visarea; /* check for sprite-tilemap collisions */ diff --git a/src/mame/video/sprint4.cpp b/src/mame/video/sprint4.cpp index 9df60a4710f..0c7429ef3c8 100644 --- a/src/mame/video/sprint4.cpp +++ b/src/mame/video/sprint4.cpp @@ -90,19 +90,17 @@ WRITE_LINE_MEMBER(sprint4_state::screen_vblank) for (int i = 0; i < 4; i++) { - rectangle rect; - int bank = 0; uint8_t horz = m_videoram[0x390 + 2 * i + 0]; uint8_t vert = m_videoram[0x398 + 2 * i + 0]; uint8_t code = m_videoram[0x398 + 2 * i + 1]; - rect.min_x = horz - 15; - rect.min_y = vert - 15; - rect.max_x = horz - 15 + m_gfxdecode->gfx(1)->width() - 1; - rect.max_y = vert - 15 + m_gfxdecode->gfx(1)->height() - 1; - + rectangle rect( + horz - 15, + horz - 15 + m_gfxdecode->gfx(1)->width() - 1, + vert - 15, + vert - 15 + m_gfxdecode->gfx(1)->height() - 1); rect &= m_screen->visible_area(); m_playfield->draw(*m_screen, m_helper, rect, 0, 0); @@ -117,8 +115,8 @@ WRITE_LINE_MEMBER(sprint4_state::screen_vblank) horz - 15, vert - 15, 1); - for (int y = rect.min_y; y <= rect.max_y; y++) - for (int x = rect.min_x; x <= rect.max_x; x++) + for (int y = rect.top(); y <= rect.bottom(); y++) + for (int x = rect.left(); x <= rect.right(); x++) if (m_palette->pen_indirect(m_helper.pix16(y, x)) != 0) m_collision[i] = 1; } diff --git a/src/mame/video/sprint8.cpp b/src/mame/video/sprint8.cpp index 9971b6d627e..a3ce7092c30 100644 --- a/src/mame/video/sprint8.cpp +++ b/src/mame/video/sprint8.cpp @@ -170,12 +170,12 @@ WRITE_LINE_MEMBER(sprint8_state::screen_vblank) draw_sprites(m_helper1, visarea); - for (int y = visarea.min_y; y <= visarea.max_y; y++) + for (int y = visarea.top(); y <= visarea.bottom(); y++) { const uint16_t* p1 = &m_helper1.pix16(y); const uint16_t* p2 = &m_helper2.pix16(y); - for (int x = visarea.min_x; x <= visarea.max_x; x++) + for (int x = visarea.left(); x <= visarea.right(); x++) if (p1[x] != 0x20 && p2[x] == 0x23) m_collision_timer->adjust(m_screen->time_until_pos(y + 24, x), m_palette->pen_indirect(p1[x])); } diff --git a/src/mame/video/ssystem3.cpp b/src/mame/video/ssystem3.cpp index 9041b1f23e7..6c6093d58d2 100644 --- a/src/mame/video/ssystem3.cpp +++ b/src/mame/video/ssystem3.cpp @@ -36,13 +36,10 @@ static const unsigned char ssystem3_palette[] = }; -PALETTE_INIT_MEMBER(ssystem3_state, ssystem3) +void ssystem3_state::palette_init(palette_device &palette) { - int i; - - for ( i = 0; i < sizeof(ssystem3_palette) / 3; i++ ) { + for (int i = 0; i < sizeof(ssystem3_palette) / 3; i++) m_palette->set_pen_color(i, ssystem3_palette[i*3], ssystem3_palette[i*3+1], ssystem3_palette[i*3+2]); - } } diff --git a/src/mame/video/starshp1.cpp b/src/mame/video/starshp1.cpp index 947d6eb9438..0e63333814b 100644 --- a/src/mame/video/starshp1.cpp +++ b/src/mame/video/starshp1.cpp @@ -305,14 +305,11 @@ void starshp1_state::draw_circle(bitmap_ind16 &bitmap) int starshp1_state::spaceship_collision(bitmap_ind16 &bitmap, const rectangle &rect) { - int x; - int y; - - for (y = rect.min_y; y <= rect.max_y; y++) + for (int y = rect.top(); y <= rect.bottom(); y++) { const uint16_t* pLine = &m_helper.pix16(y); - for (x = rect.min_x; x <= rect.max_x; x++) + for (int x = rect.left(); x <= rect.right(); x++) if (pLine[x] != 0) return 1; } @@ -337,10 +334,10 @@ int starshp1_state::circle_collision(const rectangle &rect) int r = get_radius(); - return point_in_circle(rect.min_x, rect.min_y, center_x, center_y, r) || - point_in_circle(rect.min_x, rect.max_y, center_x, center_y, r) || - point_in_circle(rect.max_x, rect.min_y, center_x, center_y, r) || - point_in_circle(rect.max_x, rect.max_y, center_x, center_y, r); + return point_in_circle(rect.left(), rect.top(), center_x, center_y, r) || + point_in_circle(rect.left(), rect.bottom(), center_x, center_y, r) || + point_in_circle(rect.right(), rect.top(), center_x, center_y, r) || + point_in_circle(rect.right(), rect.bottom(), center_x, center_y, r); } @@ -378,13 +375,10 @@ WRITE_LINE_MEMBER(starshp1_state::screen_vblank_starshp1) // rising edge if (state) { - rectangle rect; const rectangle &visarea = m_screen->visible_area(); - rect.min_x = get_sprite_hpos(13); - rect.min_y = get_sprite_vpos(13); - rect.max_x = rect.min_x + m_gfxdecode->gfx(1)->width() - 1; - rect.max_y = rect.min_y + m_gfxdecode->gfx(1)->height() - 1; + rectangle rect(get_sprite_hpos(13), 0, get_sprite_vpos(13), 0); + rect.set_size(m_gfxdecode->gfx(1)->width(), m_gfxdecode->gfx(1)->height()); rect &= m_helper.cliprect(); diff --git a/src/mame/video/tank8.cpp b/src/mame/video/tank8.cpp index d38ca8dbbf4..a1c515cfba2 100644 --- a/src/mame/video/tank8.cpp +++ b/src/mame/video/tank8.cpp @@ -210,7 +210,7 @@ WRITE_LINE_MEMBER(tank8_state::screen_vblank) draw_sprites(m_helper2, visarea); draw_bullets(m_helper3, visarea); - for (y = visarea.min_y; y <= visarea.max_y; y++) + for (y = visarea.top(); y <= visarea.bottom(); y++) { int _state = 0; @@ -221,7 +221,7 @@ WRITE_LINE_MEMBER(tank8_state::screen_vblank) if ((m_screen->frame_number() ^ y) & 1) continue; /* video display is interlaced */ - for (x = visarea.min_x; x <= visarea.max_x; x++) + for (x = visarea.left(); x <= visarea.right(); x++) { uint8_t index; diff --git a/src/mame/video/thunderj.cpp b/src/mame/video/thunderj.cpp index b2a5e3506fc..e51c58d899f 100644 --- a/src/mame/video/thunderj.cpp +++ b/src/mame/video/thunderj.cpp @@ -119,12 +119,12 @@ uint32_t thunderj_state::screen_update_thunderj(screen_device &screen, bitmap_in // draw and merge the MO bitmap_ind16 &mobitmap = m_vad->mob().bitmap(); for (const sparse_dirty_rect *rect = m_vad->mob().first_dirty_rect(cliprect); rect != nullptr; rect = rect->next()) - for (int y = rect->min_y; y <= rect->max_y; y++) + for (int y = rect->top(); y <= rect->bottom(); y++) { uint16_t *mo = &mobitmap.pix16(y); uint16_t *pf = &bitmap.pix16(y); uint8_t *pri = &priority_bitmap.pix8(y); - for (int x = rect->min_x; x <= rect->max_x; x++) + for (int x = rect->left(); x <= rect->right(); x++) if (mo[x] != 0xffff) { /* verified from the GALs on the real PCB; equations follow @@ -217,11 +217,11 @@ uint32_t thunderj_state::screen_update_thunderj(screen_device &screen, bitmap_in /* now go back and process the upper bit of MO priority */ for (const sparse_dirty_rect *rect = m_vad->mob().first_dirty_rect(cliprect); rect != nullptr; rect = rect->next()) - for (int y = rect->min_y; y <= rect->max_y; y++) + for (int y = rect->top(); y <= rect->bottom(); y++) { uint16_t *mo = &mobitmap.pix16(y); uint16_t *pf = &bitmap.pix16(y); - for (int x = rect->min_x; x <= rect->max_x; x++) + for (int x = rect->left(); x <= rect->right(); x++) if (mo[x] != 0xffff) { int mopriority = mo[x] >> atari_motion_objects_device::PRIORITY_SHIFT; diff --git a/src/mame/video/toobin.cpp b/src/mame/video/toobin.cpp index d16fce21cd1..643b6d7f26d 100644 --- a/src/mame/video/toobin.cpp +++ b/src/mame/video/toobin.cpp @@ -224,13 +224,13 @@ uint32_t toobin_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap /* draw and merge the MO */ bitmap_ind16 &mobitmap = m_mob->bitmap(); const pen_t *palette = m_palette->pens(); - for (int y = cliprect.min_y; y <= cliprect.max_y; y++) + for (int y = cliprect.top(); y <= cliprect.bottom(); y++) { uint32_t *dest = &bitmap.pix32(y); uint16_t *mo = &mobitmap.pix16(y); uint16_t *pf = &m_pfbitmap.pix16(y); uint8_t *pri = &priority_bitmap.pix8(y); - for (int x = cliprect.min_x; x <= cliprect.max_x; x++) + for (int x = cliprect.left(); x <= cliprect.right(); x++) { uint16_t pix = pf[x]; if (mo[x] != 0xffff) diff --git a/src/mame/video/triplhnt.cpp b/src/mame/video/triplhnt.cpp index e1b95963282..0984d3f99de 100644 --- a/src/mame/video/triplhnt.cpp +++ b/src/mame/video/triplhnt.cpp @@ -83,7 +83,7 @@ void triplhnt_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprec m_gfxdecode->gfx(m_sprite_zoom)->opaque(m_helper,cliprect, 2 * code + m_sprite_bank, 0, code & 8, 0, - rect.min_x, rect.min_y); + rect.left(), rect.top()); rect &= cliprect; @@ -93,9 +93,9 @@ void triplhnt_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprec int x; int y; - for (x = rect.min_x; x <= rect.max_x; x++) + for (x = rect.left(); x <= rect.right(); x++) { - for (y = rect.min_y; y <= rect.max_y; y++) + for (y = rect.top(); y <= rect.bottom(); y++) { pen_t a = m_helper.pix16(y, x); pen_t b = bitmap.pix16(y, x); diff --git a/src/mame/video/tunhunt.cpp b/src/mame/video/tunhunt.cpp index 5fe83d29341..3f9100cad93 100644 --- a/src/mame/video/tunhunt.cpp +++ b/src/mame/video/tunhunt.cpp @@ -291,7 +291,7 @@ void tunhunt_state::draw_box(bitmap_ind16 &bitmap, const rectangle &cliprect) for( y=0; y<256; y++ ) { - if (0xff-y >= cliprect.min_y && 0xff-y <= cliprect.max_y) + if (0xff-y >= cliprect.top() && 0xff-y <= cliprect.bottom()) for( x=0; x<256; x++ ) { color = 0; @@ -308,7 +308,7 @@ void tunhunt_state::draw_box(bitmap_ind16 &bitmap, const rectangle &cliprect) z = x0; /* give priority to rightmost spans */ } } - if (x >= cliprect.min_x && x <= cliprect.max_x) + if (x >= cliprect.left() && x <= cliprect.right()) bitmap.pix16(0xff-y, x) = color; } } diff --git a/src/mame/video/ultratnk.cpp b/src/mame/video/ultratnk.cpp index 797089cd82f..68113aec3c6 100644 --- a/src/mame/video/ultratnk.cpp +++ b/src/mame/video/ultratnk.cpp @@ -95,19 +95,17 @@ WRITE_LINE_MEMBER(ultratnk_state::screen_vblank) for (int i = 0; i < 4; i++) { - rectangle rect; - int bank = 0; uint8_t horz = m_videoram[0x390 + 2 * i + 0]; uint8_t vert = m_videoram[0x398 + 2 * i + 0]; uint8_t code = m_videoram[0x398 + 2 * i + 1]; - rect.min_x = horz - 15; - rect.min_y = vert - 15; - rect.max_x = horz - 15 + m_gfxdecode->gfx(1)->width() - 1; - rect.max_y = vert - 15 + m_gfxdecode->gfx(1)->height() - 1; - + rectangle rect( + horz - 15, + horz - 15 + m_gfxdecode->gfx(1)->width() - 1, + vert - 15, + vert - 15 + m_gfxdecode->gfx(1)->height() - 1); rect &= m_screen->visible_area(); m_playfield->draw(*m_screen, m_helper, rect, 0, 0); @@ -122,8 +120,8 @@ WRITE_LINE_MEMBER(ultratnk_state::screen_vblank) horz - 15, vert - 15, 1); - for (int y = rect.min_y; y <= rect.max_y; y++) - for (int x = rect.min_x; x <= rect.max_x; x++) + for (int y = rect.top(); y <= rect.bottom(); y++) + for (int x = rect.left(); x <= rect.right(); x++) if (m_palette->pen_indirect(m_helper.pix16(y, x)) != BG) m_collision[i] = 1; } diff --git a/src/mame/video/vectrex.cpp b/src/mame/video/vectrex.cpp index 32943a2061c..48705b1f9fd 100644 --- a/src/mame/video/vectrex.cpp +++ b/src/mame/video/vectrex.cpp @@ -75,7 +75,7 @@ TIMER_CALLBACK_MEMBER(vectrex_base_state::lightpen_trigger) READ8_MEMBER(vectrex_base_state::vectrex_via_r) { - return m_via6522_0->read(space, offset); + return m_via6522_0->read(offset); } WRITE8_MEMBER(vectrex_base_state::vectrex_via_w) @@ -102,7 +102,7 @@ WRITE8_MEMBER(vectrex_base_state::vectrex_via_w) period); break; } - m_via6522_0->write(space, offset, data); + m_via6522_0->write(offset, data); } diff --git a/src/mame/video/vindictr.cpp b/src/mame/video/vindictr.cpp index 810700c2e83..0b243780a87 100644 --- a/src/mame/video/vindictr.cpp +++ b/src/mame/video/vindictr.cpp @@ -179,8 +179,8 @@ void vindictr_state::scanline_update(screen_device &screen, int scanline) /* a new vscroll latches the offset into a counter; we must adjust for this */ int offset = scanline; const rectangle &visible_area = screen.visible_area(); - if (offset > visible_area.max_y) - offset -= visible_area.max_y + 1; + if (offset > visible_area.bottom()) + offset -= visible_area.bottom() + 1; if (m_playfield_yscroll != ((data - offset) & 0x1ff)) { @@ -213,11 +213,11 @@ uint32_t vindictr_state::screen_update_vindictr(screen_device &screen, bitmap_in // draw and merge the MO bitmap_ind16 &mobitmap = m_mob->bitmap(); for (const sparse_dirty_rect *rect = m_mob->first_dirty_rect(cliprect); rect != nullptr; rect = rect->next()) - for (int y = rect->min_y; y <= rect->max_y; y++) + for (int y = rect->top(); y <= rect->bottom(); y++) { uint16_t *mo = &mobitmap.pix16(y); uint16_t *pf = &bitmap.pix16(y); - for (int x = rect->min_x; x <= rect->max_x; x++) + for (int x = rect->left(); x <= rect->right(); x++) if (mo[x] != 0xffff) { /* partially verified via schematics (there are a lot of PALs involved!): @@ -253,11 +253,11 @@ uint32_t vindictr_state::screen_update_vindictr(screen_device &screen, bitmap_in /* now go back and process the upper bit of MO priority */ for (const sparse_dirty_rect *rect = m_mob->first_dirty_rect(cliprect); rect != nullptr; rect = rect->next()) - for (int y = rect->min_y; y <= rect->max_y; y++) + for (int y = rect->top(); y <= rect->bottom(); y++) { uint16_t *mo = &mobitmap.pix16(y); uint16_t *pf = &bitmap.pix16(y); - for (int x = rect->min_x; x <= rect->max_x; x++) + for (int x = rect->left(); x <= rect->right(); x++) if (mo[x] != 0xffff) { int mopriority = mo[x] >> atari_motion_objects_device::PRIORITY_SHIFT; diff --git a/src/mame/video/wolfpack.cpp b/src/mame/video/wolfpack.cpp index 0d35050a597..b00c6d983f6 100644 --- a/src/mame/video/wolfpack.cpp +++ b/src/mame/video/wolfpack.cpp @@ -195,14 +195,10 @@ void wolfpack_state::draw_torpedo(bitmap_ind16 &bitmap, const rectangle &cliprec void wolfpack_state::draw_pt(bitmap_ind16 &bitmap, const rectangle &cliprect) { - rectangle rect = cliprect; - - if (!(m_pt_pic & 0x20)) - rect.min_x = 256; - - if (!(m_pt_pic & 0x10)) - rect.max_x = 255; - + rectangle rect(cliprect); + rect.setx( + (m_pt_pic & 0x20) ? rect.left() : 256, + (m_pt_pic & 0x10) ? rect.right() : 255); m_gfxdecode->gfx(2)->transpen(bitmap,rect, m_pt_pic, @@ -223,19 +219,11 @@ void wolfpack_state::draw_pt(bitmap_ind16 &bitmap, const rectangle &cliprect) void wolfpack_state::draw_water(palette_device &palette, bitmap_ind16 &bitmap, const rectangle &cliprect) { - rectangle rect = cliprect; - - int x; - int y; - - if (rect.max_y > 127) - rect.max_y = 127; - - for (y = rect.min_y; y <= rect.max_y; y++) + for (int y = cliprect.top(); y <= (std::min)(cliprect.bottom(), 127); y++) { uint16_t* p = &bitmap.pix16(y); - for (x = rect.min_x; x <= rect.max_x; x++) + for (int x = cliprect.left(); x <= cliprect.right(); x++) p[x] = palette.pen_indirect(p[x]) | 0x08; } } @@ -243,9 +231,6 @@ void wolfpack_state::draw_water(palette_device &palette, bitmap_ind16 &bitmap, c uint32_t wolfpack_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { - int i; - int j; - uint8_t color = 0x48; if (m_ship_size & 0x10) color += 0x13; if (m_ship_size & 0x20) color += 0x22; @@ -259,8 +244,8 @@ uint32_t wolfpack_state::screen_update(screen_device &screen, bitmap_ind16 &bitm bitmap.fill(m_video_invert, cliprect); - for (i = 0; i < 8; i++) - for (j = 0; j < 32; j++) + for (int i = 0; i < 8; i++) + for (int j = 0; j < 32; j++) { int code = m_alpha_num_ram[32 * i + j]; @@ -286,19 +271,16 @@ WRITE_LINE_MEMBER(wolfpack_state::screen_vblank) // rising edge if (state) { - int x; - int y; - m_helper.fill(0); draw_ship(m_helper, m_helper.cliprect()); - for (y = 128; y < 224 - m_torpedo_v; y++) + for (int y = 128; y < 224 - m_torpedo_v; y++) { int x1 = 248 - m_torpedo_h - 1; int x2 = 248 - m_torpedo_h + 1; - for (x = 2 * x1; x < 2 * x2; x++) + for (int x = 2 * x1; x < 2 * x2; x++) { if (x < 0 || x >= m_helper.width()) continue; diff --git a/src/mame/video/xybots.cpp b/src/mame/video/xybots.cpp index 6502f0f6256..5bcd5d17181 100644 --- a/src/mame/video/xybots.cpp +++ b/src/mame/video/xybots.cpp @@ -98,11 +98,11 @@ uint32_t xybots_state::screen_update_xybots(screen_device &screen, bitmap_ind16 // draw and merge the MO bitmap_ind16 &mobitmap = m_mob->bitmap(); for (const sparse_dirty_rect *rect = m_mob->first_dirty_rect(cliprect); rect != nullptr; rect = rect->next()) - for (int y = rect->min_y; y <= rect->max_y; y++) + for (int y = rect->top(); y <= rect->bottom(); y++) { uint16_t *mo = &mobitmap.pix16(y); uint16_t *pf = &bitmap.pix16(y); - for (int x = rect->min_x; x <= rect->max_x; x++) + for (int x = rect->left(); x <= rect->right(); x++) if (mo[x] != 0xffff) { /* verified via schematics: diff --git a/src/osd/modules/input/input_sdlcommon.cpp b/src/osd/modules/input/input_sdlcommon.cpp index e016b40ee49..a5982ea891d 100644 --- a/src/osd/modules/input/input_sdlcommon.cpp +++ b/src/osd/modules/input/input_sdlcommon.cpp @@ -79,7 +79,8 @@ void sdl_event_manager::process_window_event(running_machine &machine, SDL_Event if (window == nullptr) { - osd_printf_warning("Skipped window event due to missing window param from SDL\n"); + // This condition may occur when the fullscreen toggle is used + osd_printf_verbose("Skipped window event due to missing window param from SDL\n"); return; } diff --git a/src/osd/modules/netdev/taptun.cpp b/src/osd/modules/netdev/taptun.cpp index 32e86a64f90..b4d8b963c02 100644 --- a/src/osd/modules/netdev/taptun.cpp +++ b/src/osd/modules/netdev/taptun.cpp @@ -2,11 +2,16 @@ // copyright-holders:Carl #if defined(OSD_NET_USE_TAPTUN) +#if defined(WIN32) +#include <windows.h> +#include <winioctl.h> +#else #include <unistd.h> #include <fcntl.h> #include <sys/ioctl.h> #include <net/if.h> #include <errno.h> +#endif #include "emu.h" #include "osdnet.h" @@ -17,14 +22,19 @@ #define IFF_TAP 0x0002 #define IFF_NO_PI 0x1000 #define TUNSETIFF _IOW('T', 202, int) +#elif defined(WIN32) +#include "tap-windows6/tap-windows.h" + +// for some reason this isn't defined in the header, and presumably it changes +// with major? versions of the driver - perhaps it should be configurable? +#define PRODUCT_TAP_WIN_COMPONENT_ID "tap0901" #endif class taptun_module : public osd_module, public netdev_module { public: - taptun_module() - : osd_module(OSD_NETDEV_PROVIDER, "taptun"), netdev_module() + taptun_module() : osd_module(OSD_NETDEV_PROVIDER, "taptun"), netdev_module() { } virtual ~taptun_module() { } @@ -48,8 +58,14 @@ public: protected: int recv_dev(uint8_t **buf); private: - int m_fd; +#if defined(WIN32) + HANDLE m_handle = INVALID_HANDLE_VALUE; + OVERLAPPED m_overlapped; + bool m_receive_pending; +#else + int m_fd = -1; char m_ifname[10]; +#endif char m_mac[6]; uint8_t m_buf[2048]; }; @@ -78,7 +94,22 @@ netdev_tap::netdev_tap(const char *name, class device_network_interface *ifdev, osd_printf_verbose("netdev_tap: network up!\n"); strncpy(m_ifname, ifr.ifr_name, 10); fcntl(m_fd, F_SETFL, O_NONBLOCK); +#elif defined(WIN32) + std::wstring device_path(L"" USERMODEDEVICEDIR); + device_path.append(wstring_from_utf8(name)); + device_path.append(L"" TAP_WIN_SUFFIX); + + m_handle = CreateFileW(device_path.c_str(), GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_SYSTEM | FILE_FLAG_OVERLAPPED, 0); + if (m_handle != INVALID_HANDLE_VALUE) + { + ULONG status = TRUE; + DWORD len; + + // set media status to connected + DeviceIoControl(m_handle, TAP_WIN_IOCTL_SET_MEDIA_STATUS, &status, sizeof(status), &status, sizeof(status), &len, NULL); + } + m_receive_pending = false; #else m_fd = -1; #endif @@ -86,7 +117,17 @@ netdev_tap::netdev_tap(const char *name, class device_network_interface *ifdev, netdev_tap::~netdev_tap() { +#if defined(WIN32) + if (m_handle != INVALID_HANDLE_VALUE) + { + if (m_receive_pending) + CancelIo(m_handle); + + CloseHandle(m_handle); + } +#else close(m_fd); +#endif } void netdev_tap::set_mac(const char *mac) @@ -94,6 +135,148 @@ void netdev_tap::set_mac(const char *mac) memcpy(m_mac, mac, 6); } +#if defined(WIN32) +int netdev_tap::send(uint8_t *buf, int len) +{ + OVERLAPPED overlapped = {}; + + if (m_handle == INVALID_HANDLE_VALUE) + return 0; + + if (WriteFile(m_handle, buf, len, NULL, &overlapped) || GetLastError() == ERROR_IO_PENDING) + { + DWORD bytes_transferred; + + // block until transfer complete + if (GetOverlappedResult(m_handle, &overlapped, &bytes_transferred, TRUE)) + return bytes_transferred; + } + + return 0; +} + +int netdev_tap::recv_dev(uint8_t **buf) +{ + DWORD bytes_transferred; + + if (m_handle == INVALID_HANDLE_VALUE) + return 0; + + if (!m_receive_pending) + { + // start a new asynchronous read + m_overlapped = {}; + if (ReadFile(m_handle, m_buf, sizeof(m_buf), &bytes_transferred, &m_overlapped)) + { + // handle unexpected synchronous completion + *buf = m_buf; + + return bytes_transferred; + } + else if (GetLastError() == ERROR_IO_PENDING) + m_receive_pending = true; + } + else + { + if (GetOverlappedResult(m_handle, &m_overlapped, &bytes_transferred, FALSE)) + { + // handle asynchronous completion + m_receive_pending = false; + *buf = m_buf; + + return bytes_transferred; + } + } + + return 0; +} + +static std::wstring safe_string(WCHAR value[], int length) +{ + if (value[length] != L'\0') + value[length + 1] = L'\0'; + + return std::wstring(value); +} + +// find the friendly name for an adapter in the registry +static std::wstring get_connection_name(std::wstring &id) +{ + std::wstring result; + + std::wstring connection(L"" NETWORK_CONNECTIONS_KEY PATH_SEPARATOR); + connection.append(id); + connection.append(PATH_SEPARATOR L"Connection"); + + HKEY connection_key; + + if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, connection.c_str(), 0, KEY_READ, &connection_key) == ERROR_SUCCESS) + { + WCHAR connection_name[MAX_PATH]; + DWORD connection_name_len = sizeof(connection_name); + DWORD data_type; + + if (RegQueryValueExW(connection_key, L"Name", NULL, &data_type, LPBYTE(connection_name), &connection_name_len) == ERROR_SUCCESS && data_type == REG_SZ) + { + result.assign(safe_string(connection_name, connection_name_len)); + } + } + + return result; +} + +// find TAP-Windows adapters by scanning the registry +static std::vector<std::wstring> get_tap_adapters() +{ + std::vector<std::wstring> result; + HKEY adapter_key; + + if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"" ADAPTER_KEY, 0, KEY_READ, &adapter_key) == ERROR_SUCCESS) + { + int i = 0; + WCHAR enum_name[MAX_PATH]; + DWORD enum_name_len = sizeof(enum_name); + + // iterate through all the adapters + while (RegEnumKeyExW(adapter_key, i, enum_name, &enum_name_len, NULL, NULL, NULL, NULL) == ERROR_SUCCESS) + { + std::wstring unit_string(L"" ADAPTER_KEY PATH_SEPARATOR); + unit_string.append(enum_name); + HKEY unit_key; + + if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, unit_string.c_str(), 0, KEY_READ, &unit_key) == ERROR_SUCCESS) + { + WCHAR component_id[MAX_PATH]; + DWORD component_id_len = sizeof(component_id); + DWORD data_type; + + // check if the ComponentId value indicates a TAP-Windows adapter + if (RegQueryValueExW(unit_key, L"ComponentId", NULL, &data_type, LPBYTE(component_id), &component_id_len) == ERROR_SUCCESS + && data_type == REG_SZ + && safe_string(component_id, component_id_len) == L"" PRODUCT_TAP_WIN_COMPONENT_ID) + { + WCHAR net_cfg_instance_id[MAX_PATH]; + DWORD net_cfg_instance_id_len = sizeof(net_cfg_instance_id); + + // add the adapter to the result + if (RegQueryValueExW(unit_key, L"NetCfgInstanceId", NULL, &data_type, LPBYTE(net_cfg_instance_id), &net_cfg_instance_id_len) == ERROR_SUCCESS + && data_type == REG_SZ) + result.push_back(safe_string(net_cfg_instance_id, net_cfg_instance_id_len)); + } + + RegCloseKey(unit_key); + } + + enum_name_len = sizeof(enum_name); + i++; + } + + RegCloseKey(adapter_key); + } + + return result; +} +#else int netdev_tap::send(uint8_t *buf, int len) { if(m_fd == -1) return 0; @@ -113,6 +296,7 @@ int netdev_tap::recv_dev(uint8_t **buf) *buf = m_buf; return (len == -1)?0:len; } +#endif static CREATE_NETDEV(create_tap) { @@ -122,7 +306,12 @@ static CREATE_NETDEV(create_tap) int taptun_module::init(const osd_options &options) { +#if defined(WIN32) + for (std::wstring &id : get_tap_adapters()) + add_netdev(utf8_from_wstring(id).c_str(), utf8_from_wstring(get_connection_name(id)).c_str(), create_tap); +#else add_netdev("tap", "TAP/TUN Device", create_tap); +#endif return 0; } diff --git a/src/osd/sdl/window.cpp b/src/osd/sdl/window.cpp index ba805e517ec..e7ef73f4edc 100644 --- a/src/osd/sdl/window.cpp +++ b/src/osd/sdl/window.cpp @@ -297,7 +297,6 @@ void sdl_window_info::toggle_full_screen() machine().ui().menu_reset(); // kill off the drawers renderer_reset(); -// set_platform_window(nullptr); bool is_osx = false; #ifdef SDLMAME_MACOSX // FIXME: This is weird behaviour and certainly a bug in SDL @@ -310,6 +309,7 @@ void sdl_window_info::toggle_full_screen() SDL_SetWindowFullscreen(platform_window(), SDL_WINDOW_FULLSCREEN); // Try to set mode } SDL_DestroyWindow(platform_window()); + set_platform_window(nullptr); downcast<sdl_osd_interface &>(machine().osd()).release_keys(); |