summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/machine
diff options
context:
space:
mode:
author AJR <ajrhacker@users.noreply.github.com>2022-06-28 14:41:16 -0400
committer AJR <ajrhacker@users.noreply.github.com>2022-06-28 14:41:16 -0400
commit21efb0e47cebcf7d175a79bcf6eb700d484e0d32 (patch)
treed520ea57dd062608964aa6e028c227bdfd88c2e0 /src/devices/machine
parentf37e69828cdd65f21429ceebbd67c372e22589a9 (diff)
Start moving devices out of src/mame/shared to more appropriate places
Diffstat (limited to 'src/devices/machine')
-rw-r--r--src/devices/machine/bacta_datalogger.cpp218
-rw-r--r--src/devices/machine/bacta_datalogger.h39
-rw-r--r--src/devices/machine/nmk112.cpp103
-rw-r--r--src/devices/machine/nmk112.h53
4 files changed, 413 insertions, 0 deletions
diff --git a/src/devices/machine/bacta_datalogger.cpp b/src/devices/machine/bacta_datalogger.cpp
new file mode 100644
index 00000000000..43f9855bfd9
--- /dev/null
+++ b/src/devices/machine/bacta_datalogger.cpp
@@ -0,0 +1,218 @@
+// license:BSD-3-Clause
+// copyright-holders:James Wallace
+#include "emu.h"
+#include "bacta_datalogger.h"
+
+#define LOG_DATA (1U << 1)
+
+//#define VERBOSE (LOG_DATA)
+//#define LOG_OUTPUT_STREAM std::cout
+
+#include "logmacro.h"
+
+#define LOGDATA(...) LOGMASKED(LOG_DATA, __VA_ARGS__)
+
+/***********************************************************************************************************
+ BACTA Datalogger emulation
+ The British Amusement and Catering Trade Association created a standard for the tracking of statistics
+ and other features on British AWPs across hardware manufacturers.
+ The specification is very simple, a 1200 Baud null modem connection via RS232, with the logger sending an
+ ACK command (0x06) on receipt of a valid character, and NAK (0x15) on error.
+ In this emulation, the simplest possible device is simulated here, derived from the RS232 null_modem.
+ We only handle the feedback for acknowledgment, and limited logging.
+************************************************************************************************************/
+
+// device type definition
+DEFINE_DEVICE_TYPE(BACTA_DATALOGGER, bacta_datalogger_device, "bacta_datalogger", "BACTA Datalogger")
+
+//-------------------------------------------------
+// bacta_datalogger_device - constructor
+//-------------------------------------------------
+
+bacta_datalogger_device::bacta_datalogger_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ bacta_datalogger_device(mconfig, BACTA_DATALOGGER, tag, owner, clock)
+{
+}
+
+bacta_datalogger_device::bacta_datalogger_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) :
+ device_t(mconfig, BACTA_DATALOGGER, tag, owner, clock),
+ device_serial_interface(mconfig, *this),
+ m_rxd_handler(*this),
+ m_last_input(-1),
+ m_output_char(0)
+{
+}
+
+void bacta_datalogger_device::device_start()
+{
+ m_rxd_handler.resolve_safe();
+}
+
+void bacta_datalogger_device::device_reset()
+{
+ int startbits = 1;
+ int databits = 8;
+ parity_t parity = device_serial_interface::PARITY_ODD;
+ stop_bits_t stopbits = device_serial_interface::STOP_BITS_1;
+
+ set_data_frame(startbits, databits, parity, stopbits);
+
+ set_tra_rate(1200);
+
+ set_rcv_rate(1200);
+
+ output_rxd(1);
+}
+
+void bacta_datalogger_device::tx_queue()
+{
+ if (is_transmit_register_empty())
+ {
+ if (m_output_char != 255)
+ {
+ set_tra_rate(1200);
+ transmit_register_setup(m_output_char);
+ m_output_char = 255;
+ }
+ }
+}
+
+void bacta_datalogger_device::tra_callback()
+{
+ output_rxd(transmit_register_get_data_bit());
+}
+
+void bacta_datalogger_device::tra_complete()
+{
+ // Shut down transmitter until there's a character
+ set_tra_rate(attotime::never);
+ tx_queue();
+}
+
+void bacta_datalogger_device::rcv_complete()
+{
+ u8 data;
+
+ receive_register_extract();
+
+ data = get_received_char();
+ if (data != 0x00)
+ {
+ if (data > 0x80)
+ {
+ data &= ~0x80;
+ if ( data == m_last_input)
+ {
+ LOGDATA("Retransmission of %x\n",data);
+ }
+ m_last_input = data;
+ }
+ switch (data)
+ {
+ case 0x01:
+ LOGDATA("(%c) Prize 1 vend or 0x01\n",data);
+ break;
+ case 0x02:
+ LOGDATA("(%c) Prize 2 vend or 0x02\n",data);
+ break;
+ case 0x03:
+ LOGDATA("(%c) Prize 3 vend or 0x03\n",data);
+ break;
+ case 0x04:
+ LOGDATA("(%c) Prize 4 vend or 0x04\n",data);
+ break;
+ case 0x05:
+ LOGDATA("(%c) Remote Credit or 0x05\n",data);
+ break;
+ case 0x07:
+ LOGDATA("(%c) Idle or 0x07\n",data);
+ break;
+ case 0x08:
+ LOGDATA("(%c) Change or 0x08\n",data);
+ break;
+ case 0x09:
+ case 0x0a:
+ case 0x0b:
+ case 0x0c:
+ case 0x0d:
+ case 0x0e:
+ case 0x0f:
+ LOGDATA("(%c) User defined message or 0x0%x\n",data,data);
+ break;
+ case 0x2b:
+ LOGDATA("(%c) Cashbox door open 0x2b\n",data);
+ break;
+ case 0x2c:
+ LOGDATA("(%c) Cashbox door closed 0x2c\n",data);
+ break;
+ case 0x2d:
+ LOGDATA("(%c) Service door open 0x2d\n",data);
+ break;
+ case 0x2e:
+ LOGDATA("(%c) Service door closed 0x2e\n",data);
+ break;
+ case 0x60:
+ LOGDATA("(%c) Primary message (0x%x), next byte is message length\n",data,data);
+ break;
+ case 0x61:
+ LOGDATA("(%c) Coin Tube / Hopper Levels 0x61 \n",data);
+ break;
+ case 0x62:
+ LOGDATA("(%c) Secondary message (0x%x), next byte is message length\n",data,data);
+ break;
+ case 0x63:
+ LOGDATA("(%c) Critical Fault 0x63\n",data);
+ break;
+ case 0x64:
+ LOGDATA("(%c) Non Critical Fault 0x64\n",data);
+ break;
+ case 0x65:
+ LOGDATA("(%c) Manufacturer Message Header 0x65, next byte is message length\n",data);
+ break;
+ case 0x66:
+ LOGDATA("(%c) Potential Parameter Data request 0x66, not currently supported\n",data);
+ break;
+ case 0x67:
+ LOGDATA("(%c) Potential Parameter Report request 0x67, not currently supported\n",data);
+ break;
+ case 0x68:
+ LOGDATA("(%c) Multi-Stake Multi-Game message 0x68\n",data);
+ break;
+ case 0x69:
+ LOGDATA("(%c) Cashless source 0x69\n",data);
+ break;
+ 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:
+ LOGDATA("(%c) User defined message (0x%x), next byte is message length\n",data,data);
+ break;
+
+ default:
+ LOGDATA("(%c) Received: %02x\n",data, data);
+ break;
+ }
+ m_output_char = 0x06;//ACK
+ tx_queue();
+ }
+ else
+ {
+ if (data != 0x00)
+ {
+ m_output_char = 0x15;//NAK
+ tx_queue();
+ }
+ }
+}
diff --git a/src/devices/machine/bacta_datalogger.h b/src/devices/machine/bacta_datalogger.h
new file mode 100644
index 00000000000..61555d85acd
--- /dev/null
+++ b/src/devices/machine/bacta_datalogger.h
@@ -0,0 +1,39 @@
+// license:BSD-3-Clause
+// copyright-holders:James Wallace
+#ifndef MAME_MACHINE_BACTA_DATALOGGER_H
+#define MAME_MACHINE_BACTA_DATALOGGER_H
+
+#include "diserial.h"
+
+class bacta_datalogger_device : public device_t,
+ public device_serial_interface
+{
+public:
+ bacta_datalogger_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
+
+ virtual WRITE_LINE_MEMBER( write_txd ) {device_serial_interface::rx_w(state); }
+ auto rxd_handler() { return m_rxd_handler.bind(); }
+
+ DECLARE_WRITE_LINE_MEMBER( output_rxd ) { m_rxd_handler(state); }
+
+protected:
+ bacta_datalogger_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
+
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ virtual void tra_callback() override;
+ virtual void tra_complete() override;
+ virtual void rcv_complete() override;
+
+private:
+ void tx_queue();
+
+ devcb_write_line m_rxd_handler;
+ uint8_t m_last_input;
+ uint8_t m_output_char;
+};
+
+DECLARE_DEVICE_TYPE(BACTA_DATALOGGER, bacta_datalogger_device)
+
+#endif // MAME_MACHINE_BACTA_DATALOGGER_H
diff --git a/src/devices/machine/nmk112.cpp b/src/devices/machine/nmk112.cpp
new file mode 100644
index 00000000000..4de5062ac14
--- /dev/null
+++ b/src/devices/machine/nmk112.cpp
@@ -0,0 +1,103 @@
+// license:BSD-3-Clause
+// copyright-holders:Alex W. Jackson
+/* NMK112 - NMK custom IC for bankswitching the sample ROMs of a pair of
+ OKI6295 ADPCM chips
+
+ The address space of each OKI6295 is divided into four banks, each one
+ independently controlled. The sample table at the beginning of the
+ address space may be divided in four pages as well, banked together
+ with the sample data. This allows each of the four voices on the chip
+ to play a sample from a different bank at the same time. */
+
+#include "emu.h"
+#include "nmk112.h"
+
+#define TABLESIZE 0x100
+#define BANKSIZE 0x10000
+
+
+
+DEFINE_DEVICE_TYPE(NMK112, nmk112_device, "nmk112", "NMK112")
+
+nmk112_device::nmk112_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, NMK112, tag, owner, clock)
+ , m_page_mask(0xff)
+ , m_rom0(*this, finder_base::DUMMY_TAG)
+ , m_rom1(*this, finder_base::DUMMY_TAG)
+ , m_size0(0)
+ , m_size1(0)
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void nmk112_device::device_start()
+{
+ save_item(NAME(m_current_bank));
+
+ if (m_rom0)
+ m_size0 = m_rom0.bytes() - 0x40000;
+
+ if (m_rom1)
+ m_size1 = m_rom1.bytes() - 0x40000;
+}
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void nmk112_device::device_reset()
+{
+ for (int i = 0; i < 8; i++)
+ {
+ m_current_bank[i] = 0;
+ do_bankswitch(i, m_current_bank[i]);
+ }
+}
+
+void nmk112_device::do_bankswitch( int offset, int data )
+{
+ int chip = (offset & 4) >> 2;
+ int banknum = offset & 3;
+ int paged = (m_page_mask & (1 << chip));
+
+ uint8_t *rom = chip ? m_rom1 : m_rom0;
+ int size = chip ? m_size1 : m_size0;
+
+ m_current_bank[offset] = data;
+
+ if (size == 0) return;
+
+ int bankaddr = (data * BANKSIZE) % size;
+
+ /* copy the samples */
+ if ((paged) && (banknum == 0))
+ memcpy(rom + 0x400, rom + 0x40000 + bankaddr + 0x400, BANKSIZE - 0x400);
+ else
+ memcpy(rom + banknum * BANKSIZE, rom + 0x40000 + bankaddr, BANKSIZE);
+
+ /* also copy the sample address table, if it is paged on this chip */
+ if (paged)
+ {
+ rom += banknum * TABLESIZE;
+ memcpy(rom, rom + 0x40000 + bankaddr, TABLESIZE);
+ }
+}
+
+/*****************************************************************************
+ DEVICE HANDLERS
+*****************************************************************************/
+
+void nmk112_device::okibank_w(offs_t offset, u8 data)
+{
+ if (m_current_bank[offset] != data)
+ do_bankswitch(offset, data);
+}
+
+void nmk112_device::device_post_load()
+{
+ for (int i = 0; i < 8; i++)
+ do_bankswitch(i, m_current_bank[i]);
+}
diff --git a/src/devices/machine/nmk112.h b/src/devices/machine/nmk112.h
new file mode 100644
index 00000000000..5535d94899b
--- /dev/null
+++ b/src/devices/machine/nmk112.h
@@ -0,0 +1,53 @@
+// license:BSD-3-Clause
+// copyright-holders:Alex W. Jackson
+/*************************************************************************
+
+ nmk112.h
+
+**************************************************************************/
+
+#ifndef MAME_MACHINE_NMK112_H
+#define MAME_MACHINE_NMK112_H
+
+#pragma once
+
+/***************************************************************************
+ TYPE DEFINITIONS
+***************************************************************************/
+
+class nmk112_device : public device_t
+{
+public:
+ nmk112_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ // configuration
+ template <typename T> nmk112_device &set_rom0_tag(T &&tag) { m_rom0.set_tag(std::forward<T>(tag)); return *this; }
+ template <typename T> nmk112_device &set_rom1_tag(T &&tag) { m_rom1.set_tag(std::forward<T>(tag)); return *this; }
+ nmk112_device &set_page_mask(uint8_t mask) { m_page_mask = ~mask; return *this; }
+
+ void okibank_w(offs_t offset, u8 data);
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+ virtual void device_post_load() override;
+
+private:
+ void do_bankswitch( int offset, int data );
+
+ // internal state
+
+ /* which chips have their sample address table divided into pages */
+ uint8_t m_page_mask;
+
+ uint8_t m_current_bank[8];
+
+ optional_region_ptr<uint8_t> m_rom0, m_rom1;
+ int m_size0, m_size1;
+};
+
+DECLARE_DEVICE_TYPE(NMK112, nmk112_device)
+
+
+#endif // MAME_MACHINE_NMK112_H