diff options
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 |
commit | 21efb0e47cebcf7d175a79bcf6eb700d484e0d32 (patch) | |
tree | d520ea57dd062608964aa6e028c227bdfd88c2e0 /src/devices/machine | |
parent | f37e69828cdd65f21429ceebbd67c372e22589a9 (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.cpp | 218 | ||||
-rw-r--r-- | src/devices/machine/bacta_datalogger.h | 39 | ||||
-rw-r--r-- | src/devices/machine/nmk112.cpp | 103 | ||||
-rw-r--r-- | src/devices/machine/nmk112.h | 53 |
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 |