einstein: Major cleanup, add a ADC0844 device

The analogue joystick is now emulated. Also fixed a few minor issues
with the memory map.

This also adds a generic Z80 dasisy chain device, for use in drivers
with non-Z80 peripherals.
This commit is contained in:
Dirk Best 2017-11-06 20:45:24 +01:00
parent 9b446161b8
commit faeedc757c
11 changed files with 683 additions and 609 deletions

View File

@ -2178,6 +2178,8 @@ if (CPUS["Z80"]~=null) then
MAME_DIR .. "src/devices/cpu/z80/z80.h",
MAME_DIR .. "src/devices/cpu/z80/z80daisy.cpp",
MAME_DIR .. "src/devices/cpu/z80/z80daisy.h",
MAME_DIR .. "src/devices/cpu/z80/z80daisy_generic.cpp",
MAME_DIR .. "src/devices/cpu/z80/z80daisy_generic.h",
MAME_DIR .. "src/devices/cpu/z80/tmpz84c011.cpp",
MAME_DIR .. "src/devices/cpu/z80/tmpz84c011.h",
MAME_DIR .. "src/devices/cpu/z80/tmpz84c015.cpp",

View File

@ -3287,3 +3287,15 @@ if (MACHINES["I82586"]~=null) then
MAME_DIR .. "src/devices/machine/i82586.h",
}
end
---------------------------------------------------
--
--@src/devices/machine/adc0844.h,MACHINES["ADC0844"] = true
---------------------------------------------------
if (MACHINES["ADC0844"]~=null) then
files {
MAME_DIR .. "src/devices/machine/adc0844.cpp",
MAME_DIR .. "src/devices/machine/adc0844.h",
}
end

View File

@ -608,6 +608,7 @@ MACHINES["GEN_LATCH"] = true
MACHINES["WATCHDOG"] = true
MACHINES["INPUT_MERGER"] = true
MACHINES["K054321"] = true
MACHINES["ADC0844"] = true
--------------------------------------------------
-- specify available bus cores

View File

@ -618,6 +618,7 @@ MACHINES["FGA002"] = true
MACHINES["I82586"] = true
MACHINES["INPUT_MERGER"] = true
-- MACHINES["K054321"] = true
MACHINES["ADC0844"] = true
--------------------------------------------------
-- specify available bus cores
@ -3019,8 +3020,6 @@ files {
createMESSProjects(_target, _subtarget, "tatung")
files {
MAME_DIR .. "src/mame/drivers/einstein.cpp",
MAME_DIR .. "src/mame/includes/einstein.h",
MAME_DIR .. "src/mame/machine/einstein.cpp",
}
createMESSProjects(_target, _subtarget, "teamconc")

View File

@ -0,0 +1,102 @@
// license: BSD-3-Clause
// copyright-holders: Dirk Best
/***************************************************************************
Generic Z80 daisy chain device
***************************************************************************/
#include "emu.h"
#include "z80daisy_generic.h"
//**************************************************************************
// DEVICE DEFINITIONS
//**************************************************************************
DEFINE_DEVICE_TYPE(Z80DAISY_GENERIC, z80daisy_generic_device, "z80daisy_generic", "Generic Z80 daisy chain device")
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
//-------------------------------------------------
// z80daisy_generic_device - constructor
//-------------------------------------------------
z80daisy_generic_device::z80daisy_generic_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
device_t(mconfig, Z80DAISY_GENERIC, tag, owner, clock),
device_z80daisy_interface(mconfig, *this),
m_int(0), m_mask(0), m_vector(0xff)
{
}
//-------------------------------------------------
// static_set_vector - static configuration
//-------------------------------------------------
void z80daisy_generic_device::static_set_vector(device_t &device, uint8_t vector)
{
z80daisy_generic_device &dev = downcast<z80daisy_generic_device &>(device);
dev.m_vector = vector;
}
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
void z80daisy_generic_device::device_start()
{
// register for save states
save_item(NAME(m_int));
save_item(NAME(m_mask));
save_item(NAME(m_vector));
}
//-------------------------------------------------
// z80daisy_irq_state - return the overall IRQ
// state for this device
//-------------------------------------------------
int z80daisy_generic_device::z80daisy_irq_state()
{
if (m_int & ~m_mask)
return Z80_DAISY_INT;
return 0;
}
//-------------------------------------------------
// z80daisy_irq_ack - acknowledge an IRQ and
// return the appropriate vector
//-------------------------------------------------
int z80daisy_generic_device::z80daisy_irq_ack()
{
return m_vector;
}
//-------------------------------------------------
// z80daisy_irq_reti - clear the interrupt
// pending state to allow other interrupts through
//-------------------------------------------------
void z80daisy_generic_device::z80daisy_irq_reti()
{
}
//**************************************************************************
// INTERFACE
//**************************************************************************
WRITE_LINE_MEMBER( z80daisy_generic_device::int_w )
{
m_int = state;
}
WRITE_LINE_MEMBER( z80daisy_generic_device::mask_w )
{
m_mask = state;
}

View File

@ -0,0 +1,60 @@
// license: BSD-3-Clause
// copyright-holders: Dirk Best
/***************************************************************************
Generic Z80 daisy chain device
***************************************************************************/
#ifndef MAME_DEVICES_CPU_Z80_Z80DAISY_GENERIC_H
#define MAME_DEVICES_CPU_Z80_Z80DAISY_GENERIC_H
#pragma once
#include "z80daisy.h"
//**************************************************************************
// INTERFACE CONFIGURATION MACROS
//**************************************************************************
#define MCFG_Z80DAISY_GENERIC_ADD(_tag, _vector) \
MCFG_DEVICE_ADD(_tag, Z80DAISY_GENERIC, 0) \
z80daisy_generic_device::static_set_vector(*device, _vector); \
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
class z80daisy_generic_device : public device_t, public device_z80daisy_interface
{
public:
// construction/destruction
z80daisy_generic_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// configuration
static void static_set_vector(device_t &device, uint8_t vector);
DECLARE_WRITE_LINE_MEMBER(int_w);
DECLARE_WRITE_LINE_MEMBER(mask_w);
protected:
// device-level overrides
virtual void device_start() override;
// z80daisy_interface overrides
virtual int z80daisy_irq_state() override;
virtual int z80daisy_irq_ack() override;
virtual void z80daisy_irq_reti() override;
private:
int m_int;
int m_mask;
int m_vector;
};
// device type definition
DECLARE_DEVICE_TYPE(Z80DAISY_GENERIC, z80daisy_generic_device)
#endif // MAME_DEVICES_CPU_Z80_Z80DAISY_GENERIC_H

View File

@ -0,0 +1,155 @@
// license: BSD-3-Clause
// copyright-holders: Dirk Best
/***************************************************************************
ADC0844
A/D Converter With Multiplexer Options
***************************************************************************/
#include "emu.h"
#include "adc0844.h"
//**************************************************************************
// DEVICE DEFINITIONS
//**************************************************************************
DEFINE_DEVICE_TYPE(ADC0844, adc0844_device, "adc0844", "ADC0844 A/D Converter")
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
//-------------------------------------------------
// adc0844_device - constructor
//-------------------------------------------------
adc0844_device::adc0844_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
device_t(mconfig, ADC0844, tag, owner, clock),
m_intr_cb(*this),
m_channel_cb{ { *this }, { *this }, { *this }, { *this } },
m_conversion_timer(nullptr),
m_channel(0x0f),
m_result(0xff)
{
}
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
void adc0844_device::device_start()
{
// resolve callbacks
m_intr_cb.resolve_safe();
m_channel_cb[0].resolve_safe(0xff);
m_channel_cb[1].resolve_safe(0xff);
m_channel_cb[2].resolve_safe(0xff);
m_channel_cb[3].resolve_safe(0xff);
// allocate timers
m_conversion_timer = timer_alloc();
// register for save states
save_item(NAME(m_channel));
save_item(NAME(m_result));
}
//-------------------------------------------------
// device_reset - device-specific reset
//-------------------------------------------------
void adc0844_device::device_reset()
{
}
//-------------------------------------------------
// device_timer - handler timer events
//-------------------------------------------------
uint8_t adc0844_device::clamp(int value)
{
if (value > 0)
return 0xff;
else if (value < 0)
return 0x00;
else
return value;
}
void adc0844_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
{
switch (m_channel)
{
// differential
case 0x00:
case 0x08:
m_result = clamp(m_channel_cb[0](0) + m_channel_cb[0](0));
break;
case 0x01:
case 0x09:
m_result = clamp(m_channel_cb[1](0) + m_channel_cb[1](0));
break;
case 0x02:
case 0x0a:
m_result = clamp(m_channel_cb[2](0) + m_channel_cb[3](0));
break;
case 0x03:
case 0x0b:
m_result = clamp(m_channel_cb[3](0) + m_channel_cb[2](0));
break;
// single-ended
case 0x04:
m_result = m_channel_cb[0](0);
break;
case 0x05:
m_result = m_channel_cb[1](0);
break;
case 0x06:
m_result = m_channel_cb[2](0);
break;
case 0x07:
m_result = m_channel_cb[3](0);
break;
// pseudo-differential
case 0x0c:
m_result = clamp(m_channel_cb[0](0) + m_channel_cb[3](0));
break;
case 0x0d:
m_result = clamp(m_channel_cb[1](0) + m_channel_cb[3](0));
break;
case 0x0e:
m_result = clamp(m_channel_cb[2](0) + m_channel_cb[3](0));
break;
// undefined
case 0x0f:
m_result = 0x00;
break;
}
m_intr_cb(ASSERT_LINE);
}
//**************************************************************************
// INTERFACE
//**************************************************************************
READ8_MEMBER( adc0844_device::read )
{
m_intr_cb(CLEAR_LINE);
return m_result;
}
WRITE8_MEMBER( adc0844_device::write )
{
m_intr_cb(CLEAR_LINE);
// set channel and start conversion
m_channel = data & 0x0f;
m_conversion_timer->adjust(attotime::from_usec(40));
}

View File

@ -0,0 +1,104 @@
// license: BSD-3-Clause
// copyright-holders: Dirk Best
/***************************************************************************
ADC0844
A/D Converter With Multiplexer Options
___ ___
/RD 1 |* u | 20 VCC
/CS 2 | | 19 /WR
CH1 3 | | 18 /INTR
CH2 4 | | 17 DB0/MA0
CH3 5 | | 16 DB1/MA1
CH4 6 | | 15 DB2/MA2
AGND 7 | | 14 DB3/MA3
VREF 8 | | 13 DB4
DB7 9 | | 12 DB5
DGND 10 |_______| 11 DB6
***************************************************************************/
#ifndef MAME_DEVICES_MACHINE_ADC0844_H
#define MAME_DEVICES_MACHINE_ADC0844_H
#pragma once
//**************************************************************************
// INTERFACE CONFIGURATION MACROS
//**************************************************************************
#define MCFG_ADC0844_ADD(_tag) \
MCFG_DEVICE_ADD(_tag, ADC0844, 0)
#define MCFG_ADC0844_INTR_CB(_devcb) \
devcb = &adc0844_device::set_intr_callback(*device, DEVCB_##_devcb);
#define MCFG_ADC0844_CH1_CB(_devcb) \
devcb = &adc0844_device::set_ch1_callback(*device, DEVCB_##_devcb);
#define MCFG_ADC0844_CH2_CB(_devcb) \
devcb = &adc0844_device::set_ch2_callback(*device, DEVCB_##_devcb);
#define MCFG_ADC0844_CH3_CB(_devcb) \
devcb = &adc0844_device::set_ch3_callback(*device, DEVCB_##_devcb);
#define MCFG_ADC0844_CH4_CB(_devcb) \
devcb = &adc0844_device::set_ch4_callback(*device, DEVCB_##_devcb);
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
class adc0844_device : public device_t
{
public:
// construction/destruction
adc0844_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// configuration
template <class Object> static devcb_base &set_intr_callback(device_t &device, Object &&cb)
{ return downcast<adc0844_device &>(device).m_intr_cb.set_callback(std::forward<Object>(cb)); }
template <class Object> static devcb_base &set_ch1_callback(device_t &device, Object &&cb)
{ return downcast<adc0844_device &>(device).m_channel_cb[0].set_callback(std::forward<Object>(cb)); }
template <class Object> static devcb_base &set_ch2_callback(device_t &device, Object &&cb)
{ return downcast<adc0844_device &>(device).m_channel_cb[1].set_callback(std::forward<Object>(cb)); }
template <class Object> static devcb_base &set_ch3_callback(device_t &device, Object &&cb)
{ return downcast<adc0844_device &>(device).m_channel_cb[2].set_callback(std::forward<Object>(cb)); }
template <class Object> static devcb_base &set_ch4_callback(device_t &device, Object &&cb)
{ return downcast<adc0844_device &>(device).m_channel_cb[3].set_callback(std::forward<Object>(cb)); }
DECLARE_READ8_MEMBER(read);
DECLARE_WRITE8_MEMBER(write);
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;
private:
uint8_t clamp(int value);
// callbacks
devcb_write_line m_intr_cb;
devcb_read8 m_channel_cb[4];
emu_timer *m_conversion_timer;
// state
int m_channel;
uint8_t m_result;
};
// device type definition
DECLARE_DEVICE_TYPE(ADC0844, adc0844_device)
#endif // MAME_DEVICES_MACHINE_ADC0844_H

View File

@ -1,80 +1,153 @@
// license:GPL-2.0+
// copyright-holders:Kevin Thacker, Dirk Best, Phill Harvey-Smith
// license: GPL-2.0+
// copyright-holders: Kevin Thacker, Dirk Best, Phill Harvey-Smith
// thanks-to: Chris Coxall, Andrew Dunipace
/******************************************************************************
Tatung Einstein
TMS9129 VDP Graphics
16k ram
Z80 CPU (4 MHz)
Z80 CTC (4 MHz)
channel 0 is serial transmit clock
channel 1 is serial receive clock
trigger for channel 0,1 and 2 is a 2 MHz clock
trigger for channel 3 is the terminal count of channel 2
Intel 8251 Serial (2 MHz clock?)
WD1770 Floppy Disc controller
density is fixed, 4 drives and double sided supported
AY-3-8910 PSG (2 MHz)
port A and port B are connected to the keyboard. Port A is keyboard
line select, Port B is data.
printer connected to port A of PIO. /ACK from printer is connected to /ASTB.
D7-D0 of PIO port A is printer data lines.
ARDY of PIO is connected to /STROBE on printer.
user port is port B of PIO
keyboard connected to port A and port B of PSG
TODO:
- The ADC is not emulated!
- printer emulation needs checking!
Many thanks to Chris Coxall for the schematics of the TC-01, the dump of the
system rom and a dump of a Xtal boot disc.
Many thanks to Andrew Dunipace for his help with the 80-column card
and Speculator hardware (Spectrum emulator).
Kevin Thacker [MESS driver]
2011-Mar-14, Phill Harvey-Smith.
Having traced out the circuit of the TK02 80 coumn card, I have changed the
emulation to match what the hardware does, the emulation was mostly correct,
just some minor issues with the addressing of the VRAM, and bit 0 of the
status register is the latched output of the 6845 DE, and not vblank.
Also added defines to stop the log being flooded with keyboard messages :)
- Verify centronics printer
- Hook up RS232 port
- Einstein 256 support
******************************************************************************/
#include "emu.h"
#include "includes/einstein.h"
#include "cpu/z80/z80.h"
#include "cpu/z80/z80daisy.h"
#include "cpu/z80/z80daisy_generic.h"
#include "bus/centronics/ctronics.h"
#include "bus/einstein/pipe/pipe.h"
#include "bus/einstein/userport/userport.h"
#include "machine/adc0844.h"
#include "machine/clock.h"
#include "machine/i8251.h"
#include "machine/ram.h"
#include "machine/timer.h"
#include "machine/wd_fdc.h"
#include "machine/z80ctc.h"
#include "machine/z80pio.h"
#include "video/tms9928a.h"
#include "sound/ay8910.h"
#include "screen.h"
#include "softlist.h"
#include "speaker.h"
/***************************************************************************
CONSTANTS
***************************************************************************/
#define VERBOSE_KEYBOARD 0
#define VERBOSE_DISK 0
#define XTAL_X001 XTAL_10_738635MHz
#define XTAL_X002 XTAL_8MHz
#define IC_I001 "i001" /* Z8400A */
#define IC_I030 "i030" /* AY-3-8910 */
#define IC_I038 "i038" /* TMM9129 */
#define IC_I042 "i042" /* WD1770-PH */
#define IC_I050 "i050" /* ADC0844CCN */
#define IC_I058 "i058" /* Z8430A */
#define IC_I060 "i060" /* uPD8251A */
#define IC_I063 "i063" /* Z8420A */
/***************************************************************************
TYPE DEFINITIONS
***************************************************************************/
class einstein_state : public driver_device
{
public:
einstein_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_maincpu(*this, IC_I001),
m_keyboard_daisy(*this, "keyboard_daisy"),
m_adc_daisy(*this, "adc_daisy"),
m_fire_daisy(*this, "fire_daisy"),
m_pipe(*this, "pipe"),
m_fdc(*this, IC_I042),
m_ram(*this, RAM_TAG),
m_psg(*this, IC_I030),
m_centronics(*this, "centronics"),
m_bios(*this, "bios"),
m_bank1(*this, "bank1"),
m_bank2(*this, "bank2"),
m_bank3(*this, "bank3"),
m_floppy{ { *this, IC_I042 ":0" }, { *this, IC_I042 ":1" }, { *this, IC_I042 ":2" }, { *this, IC_I042 ":3" } },
m_line(*this, "LINE%u", 0),
m_extra(*this, "EXTRA"),
m_buttons(*this, "BUTTONS"),
m_rom_enabled(0),
m_keyboard_line(0), m_keyboard_data(0xff),
m_centronics_busy(0), m_centronics_perror(0), m_centronics_fault(0)
{}
DECLARE_INPUT_CHANGED_MEMBER(joystick_button);
TIMER_DEVICE_CALLBACK_MEMBER(keyboard_timer_callback);
DECLARE_WRITE8_MEMBER(keyboard_line_write);
DECLARE_READ8_MEMBER(keyboard_data_read);
DECLARE_READ8_MEMBER(reset_r);
DECLARE_WRITE8_MEMBER(reset_w);
DECLARE_READ8_MEMBER(rom_r);
DECLARE_WRITE8_MEMBER(rom_w);
DECLARE_READ8_MEMBER(kybint_msk_r);
DECLARE_WRITE8_MEMBER(kybint_msk_w);
DECLARE_WRITE8_MEMBER(adcint_msk_w);
DECLARE_WRITE8_MEMBER(fireint_msk_w);
DECLARE_WRITE8_MEMBER(drsel_w);
DECLARE_WRITE_LINE_MEMBER(write_centronics_busy);
DECLARE_WRITE_LINE_MEMBER(write_centronics_perror);
DECLARE_WRITE_LINE_MEMBER(write_centronics_fault);
protected:
virtual void machine_start() override;
virtual void machine_reset() override;
private:
void einstein_scan_keyboard();
required_device<cpu_device> m_maincpu;
required_device<z80daisy_generic_device> m_keyboard_daisy;
required_device<z80daisy_generic_device> m_adc_daisy;
required_device<z80daisy_generic_device> m_fire_daisy;
required_device<tatung_pipe_device> m_pipe;
required_device<wd1770_device> m_fdc;
required_device<ram_device> m_ram;
required_device<ay8910_device> m_psg;
required_device<centronics_device> m_centronics;
required_memory_region m_bios;
required_memory_bank m_bank1;
required_memory_bank m_bank2;
required_memory_bank m_bank3;
required_device<floppy_connector> m_floppy[4];
required_ioport_array<8> m_line;
required_ioport m_extra;
required_ioport m_buttons;
int m_rom_enabled;
uint8_t m_keyboard_line;
uint8_t m_keyboard_data;
int m_centronics_busy;
int m_centronics_perror;
int m_centronics_fault;
};
/***************************************************************************
KEYBOARD
***************************************************************************/
INPUT_CHANGED_MEMBER( einstein_state::joystick_button )
{
int button_down = (m_buttons->read() & 0x03) != 0x03;
m_fire_daisy->int_w(button_down ? ASSERT_LINE : CLEAR_LINE);
}
/* refresh keyboard data. It is refreshed when the keyboard line is written */
void einstein_state::einstein_scan_keyboard()
{
@ -92,26 +165,16 @@ void einstein_state::einstein_scan_keyboard()
m_keyboard_data = data;
}
TIMER_DEVICE_CALLBACK_MEMBER(einstein_state::einstein_keyboard_timer_callback)
TIMER_DEVICE_CALLBACK_MEMBER( einstein_state::keyboard_timer_callback )
{
/* re-scan keyboard */
einstein_scan_keyboard();
/* if /fire1 or /fire2 is 0, signal a fire interrupt */
if ((m_buttons->read() & 0x03) != 0)
{
m_interrupt |= EINSTEIN_FIRE_INT;
}
/* keyboard data changed? */
if (m_keyboard_data != 0xff)
{
/* generate interrupt */
m_interrupt |= EINSTEIN_KEY_INT;
}
m_keyboard_daisy->int_w(ASSERT_LINE);
}
WRITE8_MEMBER(einstein_state::einstein_keyboard_line_write)
WRITE8_MEMBER( einstein_state::keyboard_line_write )
{
if (VERBOSE_KEYBOARD)
logerror("einstein_keyboard_line_write: %02x\n", data);
@ -122,7 +185,7 @@ WRITE8_MEMBER(einstein_state::einstein_keyboard_line_write)
einstein_scan_keyboard();
}
READ8_MEMBER(einstein_state::einstein_keyboard_data_read)
READ8_MEMBER( einstein_state::keyboard_data_read )
{
/* re-scan the keyboard */
einstein_scan_keyboard();
@ -138,10 +201,10 @@ READ8_MEMBER(einstein_state::einstein_keyboard_data_read)
FLOPPY DRIVES
***************************************************************************/
WRITE8_MEMBER(einstein_state::einstein_drsel_w)
WRITE8_MEMBER(einstein_state::drsel_w)
{
if (VERBOSE_DISK)
logerror("%s: einstein_drsel_w %02x\n", machine().describe_context(), data);
logerror("%s: drsel_w %02x\n", machine().describe_context(), data);
floppy_image_device *floppy = nullptr;
@ -158,53 +221,9 @@ WRITE8_MEMBER(einstein_state::einstein_drsel_w)
/***************************************************************************
UART
CENTRONICS
***************************************************************************/
WRITE_LINE_MEMBER(einstein_state::einstein_serial_transmit_clock)
{
m_uart->write_txc(state);
}
WRITE_LINE_MEMBER(einstein_state::einstein_serial_receive_clock)
{
m_uart->write_rxc(state);
}
/***************************************************************************
MEMORY BANKING
***************************************************************************/
void einstein_state::einstein_page_rom()
{
m_bank1->set_base(m_rom_enabled ? m_region_bios->base() : m_ram->pointer());
}
/* writing to this port is a simple trigger, and switches between RAM and ROM */
WRITE8_MEMBER(einstein_state::einstein_rom_w)
{
m_rom_enabled ^= 1;
einstein_page_rom();
}
/***************************************************************************
INTERRUPTS
***************************************************************************/
/* int priority */
/* keyboard int->ctc/adc->pio */
static const z80_daisy_config einstein_daisy_chain[] =
{
{ "keyboard_daisy" },
{ IC_I058 },
{ "adc_daisy" },
{ IC_I063 },
{ "fire_daisy" },
{ nullptr }
};
WRITE_LINE_MEMBER(einstein_state::write_centronics_busy)
{
m_centronics_busy = state;
@ -220,15 +239,30 @@ WRITE_LINE_MEMBER(einstein_state::write_centronics_fault)
m_centronics_fault = state;
}
READ8_MEMBER(einstein_state::einstein_kybintmsk_r)
/***************************************************************************
INTERRUPTS
***************************************************************************/
static const z80_daisy_config einstein_daisy_chain[] =
{
{ "keyboard_daisy" },
{ IC_I058 },
{ "adc_daisy" },
{ IC_I063 },
{ "fire_daisy" },
{ nullptr }
};
READ8_MEMBER( einstein_state::kybint_msk_r )
{
uint8_t data = 0;
/* clear key int. a read of this I/O port will do this or a reset */
m_interrupt &= ~EINSTEIN_KEY_INT;
// reading this port clears the keyboard interrupt
m_keyboard_daisy->int_w(CLEAR_LINE);
/* bit 0 and 1: fire buttons on the joysticks */
data |= m_buttons->read();
data |= m_buttons->read() & 0x03;
/* bit 2 to 4: printer status */
data |= m_centronics_busy << 2;
@ -239,62 +273,27 @@ READ8_MEMBER(einstein_state::einstein_kybintmsk_r)
data |= m_extra->read();
if(VERBOSE_KEYBOARD)
logerror("%s: einstein_kybintmsk_r %02x\n", machine().describe_context(), data);
logerror("%s: kybint_msk_r %02x\n", machine().describe_context(), data);
return data;
}
WRITE8_MEMBER(einstein_state::einstein_kybintmsk_w)
WRITE8_MEMBER( einstein_state::kybint_msk_w )
{
logerror("%s: einstein_kybintmsk_w %02x\n", machine().describe_context(), data);
/* set mask from bit 0 */
if (data & 0x01)
{
logerror("key int is disabled\n");
m_interrupt_mask &= ~EINSTEIN_KEY_INT;
}
else
{
logerror("key int is enabled\n");
m_interrupt_mask |= EINSTEIN_KEY_INT;
}
logerror("KEY interrupt %s\n", BIT(data, 0) ? "disabled" : "enabled");
m_keyboard_daisy->mask_w(BIT(data, 0));
}
/* writing to this I/O port sets the state of the mask; D0 is used */
/* writing 0 enables the /ADC interrupt */
WRITE8_MEMBER(einstein_state::einstein_adcintmsk_w)
WRITE8_MEMBER( einstein_state::adcint_msk_w )
{
logerror("%s: einstein_adcintmsk_w %02x\n", machine().describe_context(), data);
if (data & 0x01)
{
logerror("adc int is disabled\n");
m_interrupt_mask &= ~EINSTEIN_ADC_INT;
}
else
{
logerror("adc int is enabled\n");
m_interrupt_mask |= EINSTEIN_ADC_INT;
}
logerror("ADC interrupt %s\n", BIT(data, 0) ? "disabled" : "enabled");
m_adc_daisy->mask_w(BIT(data, 0));
}
/* writing to this I/O port sets the state of the mask; D0 is used */
/* writing 0 enables the /FIRE interrupt */
WRITE8_MEMBER(einstein_state::einstein_fire_int_w)
WRITE8_MEMBER( einstein_state::fireint_msk_w )
{
logerror("%s: einstein_fire_int_w %02x\n", machine().describe_context(), data);
if (data & 0x01)
{
logerror("fire int is disabled\n");
m_interrupt_mask &= ~EINSTEIN_FIRE_INT;
}
else
{
logerror("fire int is enabled\n");
m_interrupt_mask |= EINSTEIN_FIRE_INT;
}
logerror("FIRE interrupt %s\n", BIT(data, 0) ? "disabled" : "enabled");
m_fire_daisy->mask_w(BIT(data, 0));
}
@ -302,8 +301,42 @@ WRITE8_MEMBER(einstein_state::einstein_fire_int_w)
MACHINE EMULATION
***************************************************************************/
READ8_MEMBER( einstein_state::rom_r )
{
m_rom_enabled ^= 1;
m_bank1->set_entry(m_rom_enabled);
return 0xff;
}
WRITE8_MEMBER( einstein_state::rom_w )
{
m_rom_enabled ^= 1;
m_bank1->set_entry(m_rom_enabled);
}
READ8_MEMBER( einstein_state::reset_r )
{
m_psg->reset();
m_fdc->reset();
return 0xff;
}
WRITE8_MEMBER( einstein_state::reset_w )
{
m_psg->reset();
m_fdc->reset();
}
void einstein_state::machine_start()
{
// initialize memory mapping
m_bank1->configure_entry(0, m_ram->pointer());
m_bank1->configure_entry(1, m_bios->base());
m_bank2->set_base(m_ram->pointer());
m_bank3->set_base(m_ram->pointer() + 0x8000);
// setup expansion slot
m_pipe->set_program_space(&m_maincpu->space(AS_PROGRAM));
m_pipe->set_io_space(&m_maincpu->space(AS_IO));
@ -311,16 +344,14 @@ void einstein_state::machine_start()
void einstein_state::machine_reset()
{
/* initialize memory mapping */
m_bank2->set_base(m_ram->pointer());
m_bank3->set_base(m_ram->pointer() + 0x8000);
// rom enabled on reset
m_rom_enabled = 1;
einstein_page_rom();
m_bank1->set_entry(m_rom_enabled);
/* a reset causes the fire int, adc int, keyboard int mask
to be set to 1, which causes all these to be DISABLED */
m_interrupt = 0;
m_interrupt_mask = 0;
// interrupt mask enabled
m_keyboard_daisy->mask_w(1);
m_adc_daisy->mask_w(1);
m_fire_daisy->mask_w(1);
}
@ -333,34 +364,25 @@ static ADDRESS_MAP_START( einstein_mem, AS_PROGRAM, 8, einstein_state )
AM_RANGE(0x8000, 0x0ffff) AM_RAMBANK("bank3")
ADDRESS_MAP_END
/* The I/O ports are decoded into 8 blocks using address lines A3 to A7 */
// I/O ports are decoded into 8 blocks using address lines A3 to A7
static ADDRESS_MAP_START( einstein_io, AS_IO, 8, einstein_state )
ADDRESS_MAP_UNMAP_HIGH
/* block 0, ay8910 psg */
AM_RANGE(0x00, 0x00) AM_MIRROR(0xff04) AM_READWRITE(reset_r, reset_w)
AM_RANGE(0x02, 0x02) AM_MIRROR(0xff04) AM_DEVREADWRITE(IC_I030, ay8910_device, data_r, address_w)
AM_RANGE(0x03, 0x03) AM_MIRROR(0xff04) AM_DEVWRITE(IC_I030, ay8910_device, data_w)
/* block 1, tms9928a vdp */
AM_RANGE(0x08, 0x08) AM_MIRROR(0xff06) AM_DEVREADWRITE("tms9929a", tms9929a_device, vram_read, vram_write)
AM_RANGE(0x09, 0x09) AM_MIRROR(0xff06) AM_DEVREADWRITE("tms9929a", tms9929a_device, register_read, register_write)
/* block 2, i8251 uart */
AM_RANGE(0x08, 0x08) AM_MIRROR(0xff06) AM_DEVREADWRITE("vdp", tms9129_device, vram_read, vram_write)
AM_RANGE(0x09, 0x09) AM_MIRROR(0xff06) AM_DEVREADWRITE("vdp", tms9129_device, register_read, register_write)
AM_RANGE(0x10, 0x10) AM_MIRROR(0xff06) AM_DEVREADWRITE(IC_I060, i8251_device, data_r, data_w)
AM_RANGE(0x11, 0x11) AM_MIRROR(0xff06) AM_DEVREADWRITE(IC_I060, i8251_device, status_r, control_w)
/* block 3, wd1770 floppy controller */
AM_RANGE(0x18, 0x1b) AM_MIRROR(0xff04) AM_DEVREADWRITE(IC_I042, wd1770_device, read, write)
/* block 4, internal controls */
AM_RANGE(0x20, 0x20) AM_MIRROR(0xff00) AM_READWRITE(einstein_kybintmsk_r, einstein_kybintmsk_w)
AM_RANGE(0x21, 0x21) AM_MIRROR(0xff00) AM_WRITE(einstein_adcintmsk_w)
AM_RANGE(0x23, 0x23) AM_MIRROR(0xff00) AM_WRITE(einstein_drsel_w)
AM_RANGE(0x24, 0x24) AM_MIRROR(0xff00) AM_WRITE(einstein_rom_w)
AM_RANGE(0x25, 0x25) AM_MIRROR(0xff00) AM_WRITE(einstein_fire_int_w)
/* block 5, z80ctc */
AM_RANGE(0x20, 0x20) AM_MIRROR(0xff00) AM_READWRITE(kybint_msk_r, kybint_msk_w)
AM_RANGE(0x21, 0x21) AM_MIRROR(0xff00) AM_WRITE(adcint_msk_w)
AM_RANGE(0x23, 0x23) AM_MIRROR(0xff00) AM_WRITE(drsel_w)
AM_RANGE(0x24, 0x24) AM_MIRROR(0xff00) AM_READWRITE(rom_r, rom_w)
AM_RANGE(0x25, 0x25) AM_MIRROR(0xff00) AM_WRITE(fireint_msk_w)
AM_RANGE(0x28, 0x2b) AM_MIRROR(0xff04) AM_DEVREADWRITE(IC_I058, z80ctc_device, read, write)
/* block 6, z80pio */
AM_RANGE(0x30, 0x33) AM_MIRROR(0xff04) AM_DEVREADWRITE(IC_I063, z80pio_device, read_alt, write_alt)
#if 0
/* block 7, adc */
AM_RANGE(0x38, 0x38) AM_MIRROR(0xff07) AM_DEVREADWRITE_LEGACY(IC_I050, adc0844_r, adc0844_w)
#endif
AM_RANGE(0x38, 0x38) AM_MIRROR(0xff07) AM_DEVREADWRITE("adc", adc0844_device, read, write)
ADDRESS_MAP_END
@ -455,27 +477,31 @@ static INPUT_PORTS_START( einstein )
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("CONTROL") PORT_CODE(KEYCODE_LCONTROL) PORT_CODE(KEYCODE_RCONTROL)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("SHIFT") PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_1)
/* fire buttons for analogue joysticks */
// fire buttons for analogue joysticks
PORT_START("BUTTONS")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_NAME("Joystick 1 Button 1") PORT_PLAYER(1)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_NAME("Joystick 2 Button 1") PORT_PLAYER(2)
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_NAME("Joystick 1 Button 1") PORT_PLAYER(1) PORT_CHANGED_MEMBER(DEVICE_SELF, einstein_state, joystick_button, nullptr)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_NAME("Joystick 2 Button 1") PORT_PLAYER(2) PORT_CHANGED_MEMBER(DEVICE_SELF, einstein_state, joystick_button, nullptr)
PORT_BIT(0xfc, IP_ACTIVE_HIGH, IPT_UNUSED)
/* analog joystick 1 x axis */
PORT_START("JOY1_X")
PORT_BIT(0xff, 0x80, IPT_AD_STICK_X) PORT_SENSITIVITY(100) PORT_KEYDELTA(1) PORT_MINMAX(1,0xff) PORT_CODE_DEC(JOYCODE_X_LEFT_SWITCH) PORT_CODE_INC(JOYCODE_X_RIGHT_SWITCH) PORT_PLAYER(1) PORT_REVERSE
PORT_START("analogue_1_x")
PORT_BIT(0xff, 0x80, IPT_AD_STICK_X) PORT_SENSITIVITY(100) PORT_KEYDELTA(100) PORT_CENTERDELTA(100) PORT_MINMAX(0,0xff) PORT_PLAYER(1)
PORT_CODE_DEC(KEYCODE_4_PAD) PORT_CODE_INC(KEYCODE_6_PAD)
PORT_CODE_DEC(JOYCODE_X_LEFT_SWITCH) PORT_CODE_INC(JOYCODE_X_RIGHT_SWITCH)
/* analog joystick 1 y axis */
PORT_START("JOY1_Y")
PORT_BIT(0xff, 0x80, IPT_AD_STICK_Y) PORT_SENSITIVITY(100) PORT_KEYDELTA(1) PORT_MINMAX(1,0xff) PORT_CODE_DEC(JOYCODE_Y_UP_SWITCH) PORT_CODE_INC(JOYCODE_Y_DOWN_SWITCH) PORT_PLAYER(1) PORT_REVERSE
PORT_START("analogue_1_y")
PORT_BIT(0xff, 0x80, IPT_AD_STICK_Y) PORT_SENSITIVITY(100) PORT_KEYDELTA(100) PORT_CENTERDELTA(100) PORT_MINMAX(0,0xff) PORT_PLAYER(1)
PORT_CODE_DEC(KEYCODE_8_PAD) PORT_CODE_INC(KEYCODE_2_PAD)
PORT_CODE_DEC(JOYCODE_Y_UP_SWITCH) PORT_CODE_INC(JOYCODE_Y_DOWN_SWITCH)
PORT_REVERSE
/* analog joystick 2 x axis */
PORT_START("JOY2_X")
PORT_BIT(0xff, 0x80, IPT_AD_STICK_X) PORT_SENSITIVITY(100) PORT_KEYDELTA(1) PORT_MINMAX(1,0xff) PORT_CODE_DEC(JOYCODE_X_LEFT_SWITCH) PORT_CODE_INC(JOYCODE_X_RIGHT_SWITCH) PORT_PLAYER(2) PORT_REVERSE
PORT_START("analogue_2_x")
PORT_BIT(0xff, 0x80, IPT_AD_STICK_X) PORT_SENSITIVITY(100) PORT_KEYDELTA(100) PORT_CENTERDELTA(100) PORT_MINMAX(0,0xff) PORT_PLAYER(2)
PORT_CODE_DEC(JOYCODE_X_LEFT_SWITCH) PORT_CODE_INC(JOYCODE_X_RIGHT_SWITCH)
/* analog joystick 2 Y axis */
PORT_START("JOY2_Y")
PORT_BIT(0xff, 0x80, IPT_AD_STICK_Y) PORT_SENSITIVITY(100) PORT_KEYDELTA(1) PORT_MINMAX(1,0xff) PORT_CODE_DEC(JOYCODE_Y_UP_SWITCH) PORT_CODE_INC(JOYCODE_Y_DOWN_SWITCH) PORT_PLAYER(2) PORT_REVERSE
PORT_START("analogue_2_y")
PORT_BIT(0xff, 0x80, IPT_AD_STICK_Y) PORT_SENSITIVITY(100) PORT_KEYDELTA(100) PORT_CENTERDELTA(100) PORT_MINMAX(0,0xff) PORT_PLAYER(2)
PORT_CODE_DEC(JOYCODE_Y_UP_SWITCH) PORT_CODE_INC(JOYCODE_Y_DOWN_SWITCH)
PORT_REVERSE
INPUT_PORTS_END
@ -501,7 +527,7 @@ static MACHINE_CONFIG_START( einstein )
/* this is actually clocked at the system clock 4 MHz, but this would be too fast for our
driver. So we update at 50Hz and hope this is good enough. */
MCFG_TIMER_DRIVER_ADD_PERIODIC("keyboard", einstein_state, einstein_keyboard_timer_callback, attotime::from_hz(50))
MCFG_TIMER_DRIVER_ADD_PERIODIC("keyboard", einstein_state, keyboard_timer_callback, attotime::from_hz(50))
MCFG_DEVICE_ADD(IC_I063, Z80PIO, XTAL_X002 / 2)
MCFG_Z80PIO_OUT_INT_CB(INPUTLINE(IC_I001, INPUT_LINE_IRQ0))
@ -513,8 +539,8 @@ static MACHINE_CONFIG_START( einstein )
MCFG_DEVICE_ADD(IC_I058, Z80CTC, XTAL_X002 / 2)
MCFG_Z80CTC_INTR_CB(INPUTLINE(IC_I001, INPUT_LINE_IRQ0))
MCFG_Z80CTC_ZC0_CB(WRITELINE(einstein_state, einstein_serial_transmit_clock))
MCFG_Z80CTC_ZC1_CB(WRITELINE(einstein_state, einstein_serial_receive_clock))
MCFG_Z80CTC_ZC0_CB(DEVWRITELINE(IC_I060, i8251_device, write_txc))
MCFG_Z80CTC_ZC1_CB(DEVWRITELINE(IC_I060, i8251_device, write_rxc))
MCFG_Z80CTC_ZC2_CB(DEVWRITELINE(IC_I058, z80ctc_device, trg3))
MCFG_CLOCK_ADD("ctc_trigger", XTAL_X002 / 4)
@ -523,24 +549,31 @@ static MACHINE_CONFIG_START( einstein )
MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE(IC_I058, z80ctc_device, trg2))
/* Einstein daisy chain support for non-Z80 devices */
MCFG_DEVICE_ADD("keyboard_daisy", EINSTEIN_KEYBOARD_DAISY, 0)
MCFG_DEVICE_ADD("adc_daisy", EINSTEIN_ADC_DAISY, 0)
MCFG_DEVICE_ADD("fire_daisy", EINSTEIN_FIRE_DAISY, 0)
MCFG_Z80DAISY_GENERIC_ADD("keyboard_daisy", 0xf7)
MCFG_Z80DAISY_GENERIC_ADD("adc_daisy", 0xfb)
MCFG_Z80DAISY_GENERIC_ADD("fire_daisy", 0xfd)
/* video hardware */
MCFG_DEVICE_ADD( "tms9929a", TMS9929A, XTAL_10_738635MHz / 2 )
MCFG_TMS9928A_VRAM_SIZE(0x4000) /* 16k RAM, provided by IC i040 and i041 */
MCFG_DEVICE_ADD("vdp", TMS9129, XTAL_10_738635MHz / 2)
MCFG_TMS9928A_VRAM_SIZE(0x4000) // 16k RAM, provided by IC i040 and i041
MCFG_TMS9928A_SET_SCREEN("screen")
MCFG_TMS9928A_SCREEN_ADD_PAL("screen")
MCFG_SCREEN_UPDATE_DEVICE("tms9929a", tms9929a_device, screen_update)
MCFG_SCREEN_UPDATE_DEVICE("vdp", tms9129_device, screen_update)
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SOUND_ADD(IC_I030, AY8910, XTAL_X002 / 4)
MCFG_AY8910_PORT_B_READ_CB(READ8(einstein_state, einstein_keyboard_data_read))
MCFG_AY8910_PORT_A_WRITE_CB(WRITE8(einstein_state, einstein_keyboard_line_write))
MCFG_AY8910_PORT_B_READ_CB(READ8(einstein_state, keyboard_data_read))
MCFG_AY8910_PORT_A_WRITE_CB(WRITE8(einstein_state, keyboard_line_write))
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.20)
MCFG_ADC0844_ADD("adc")
MCFG_ADC0844_INTR_CB(DEVWRITELINE("adc_daisy", z80daisy_generic_device, int_w))
MCFG_ADC0844_CH1_CB(IOPORT("analogue_1_x"))
MCFG_ADC0844_CH2_CB(IOPORT("analogue_1_y"))
MCFG_ADC0844_CH3_CB(IOPORT("analogue_2_x"))
MCFG_ADC0844_CH4_CB(IOPORT("analogue_2_y"))
/* printer */
MCFG_CENTRONICS_ADD("centronics", centronics_devices, "printer")
MCFG_CENTRONICS_ACK_HANDLER(DEVWRITELINE(IC_I063, z80pio_device, strobe_a))

View File

@ -1,186 +0,0 @@
// license:GPL-2.0+
// copyright-holders:Kevin Thacker, Dirk Best, Phill Harvey-Smith
/***************************************************************************
Tatung Einstein
***************************************************************************/
#ifndef MAME_INCLUDES_EINSTEIN_H
#define MAME_INCLUDES_EINSTEIN_H
#pragma once
#include "cpu/z80/z80daisy.h"
#include "bus/einstein/pipe/pipe.h"
#include "machine/timer.h"
#include "machine/wd_fdc.h"
#include "machine/z80ctc.h"
#include "video/tms9928a.h"
#include "machine/ram.h"
#include "machine/i8251.h"
#include "bus/centronics/ctronics.h"
#include "screen.h"
/***************************************************************************
CONSTANTS
***************************************************************************/
/* xtals */
#define XTAL_X001 XTAL_10_738635MHz
#define XTAL_X002 XTAL_8MHz
/* integrated circuits */
#define IC_I001 "i001" /* Z8400A */
#define IC_I030 "i030" /* AY-3-8910 */
#define IC_I038 "i038" /* TMM9129 */
#define IC_I042 "i042" /* WD1770-PH */
#define IC_I050 "i050" /* ADC0844CCN */
#define IC_I058 "i058" /* Z8430A */
#define IC_I060 "i060" /* uPD8251A */
#define IC_I063 "i063" /* Z8420A */
/* interrupt sources */
#define EINSTEIN_KEY_INT (1<<0)
#define EINSTEIN_ADC_INT (1<<1)
#define EINSTEIN_FIRE_INT (1<<2)
/***************************************************************************
TYPE DEFINITIONS
***************************************************************************/
class einstein_state : public driver_device
{
public:
einstein_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_maincpu(*this, IC_I001),
m_pipe(*this, "pipe"),
m_fdc(*this, IC_I042),
m_uart(*this, IC_I060),
m_ram(*this, RAM_TAG),
m_centronics(*this, "centronics"),
m_region_bios(*this, "bios"),
m_bank1(*this, "bank1"),
m_bank2(*this, "bank2"),
m_bank3(*this, "bank3"),
m_floppy{ { *this, IC_I042 ":0" }, { *this, IC_I042 ":1" }, { *this, IC_I042 ":2" }, { *this, IC_I042 ":3" } },
m_line(*this, "LINE%u", 0),
m_extra(*this, "EXTRA"),
m_buttons(*this, "BUTTONS")
{
}
DECLARE_FLOPPY_FORMATS( floppy_formats );
DECLARE_WRITE8_MEMBER(einstein_keyboard_line_write);
DECLARE_READ8_MEMBER(einstein_keyboard_data_read);
DECLARE_WRITE8_MEMBER(einstein_rom_w);
DECLARE_READ8_MEMBER(einstein_kybintmsk_r);
DECLARE_WRITE8_MEMBER(einstein_kybintmsk_w);
DECLARE_WRITE8_MEMBER(einstein_adcintmsk_w);
DECLARE_WRITE8_MEMBER(einstein_fire_int_w);
DECLARE_WRITE_LINE_MEMBER(write_centronics_busy);
DECLARE_WRITE_LINE_MEMBER(write_centronics_perror);
DECLARE_WRITE_LINE_MEMBER(write_centronics_fault);
TIMER_DEVICE_CALLBACK_MEMBER(einstein_keyboard_timer_callback);
DECLARE_WRITE8_MEMBER(einstein_drsel_w);
DECLARE_WRITE_LINE_MEMBER(einstein_serial_transmit_clock);
DECLARE_WRITE_LINE_MEMBER(einstein_serial_receive_clock);
int m_interrupt;
int m_interrupt_mask;
protected:
virtual void machine_start() override;
virtual void machine_reset() override;
private:
required_device<cpu_device> m_maincpu;
required_device<tatung_pipe_device> m_pipe;
required_device<wd1770_device> m_fdc;
int m_rom_enabled;
/* keyboard */
uint8_t m_keyboard_line;
uint8_t m_keyboard_data;
int m_centronics_busy;
int m_centronics_perror;
int m_centronics_fault;
required_device<i8251_device> m_uart;
required_device<ram_device> m_ram;
required_device<centronics_device> m_centronics;
required_memory_region m_region_bios;
required_memory_bank m_bank1;
required_memory_bank m_bank2;
required_memory_bank m_bank3;
required_device<floppy_connector> m_floppy[4];
required_ioport_array<8> m_line;
required_ioport m_extra;
required_ioport m_buttons;
void einstein_scan_keyboard();
void einstein_page_rom();
};
// ======================> einstein_keyboard_daisy_device
class einstein_keyboard_daisy_device : public device_t, public device_z80daisy_interface
{
public:
// construction/destruction
einstein_keyboard_daisy_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
private:
virtual void device_start() override;
// z80daisy_interface overrides
virtual int z80daisy_irq_state() override;
virtual int z80daisy_irq_ack() override;
virtual void z80daisy_irq_reti() override;
};
DECLARE_DEVICE_TYPE(EINSTEIN_KEYBOARD_DAISY, einstein_keyboard_daisy_device)
// ======================> einstein_adc_daisy_device
class einstein_adc_daisy_device : public device_t, public device_z80daisy_interface
{
public:
// construction/destruction
einstein_adc_daisy_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
private:
virtual void device_start() override;
// z80daisy_interface overrides
virtual int z80daisy_irq_state() override;
virtual int z80daisy_irq_ack() override;
virtual void z80daisy_irq_reti() override;
};
DECLARE_DEVICE_TYPE(EINSTEIN_ADC_DAISY, einstein_adc_daisy_device)
// ======================> einstein_fire_daisy_device
class einstein_fire_daisy_device : public device_t, public device_z80daisy_interface
{
public:
// construction/destruction
einstein_fire_daisy_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
private:
virtual void device_start() override;
// z80daisy_interface overrides
virtual int z80daisy_irq_state() override;
virtual int z80daisy_irq_ack() override;
virtual void z80daisy_irq_reti() override;
};
DECLARE_DEVICE_TYPE(EINSTEIN_FIRE_DAISY, einstein_fire_daisy_device)
#endif // MAME_INCLUDES_EINSTEIN_H

View File

@ -1,208 +0,0 @@
// license:GPL-2.0+
// copyright-holders:Kevin Thacker, Dirk Best, Phill Harvey-Smith
/***************************************************************************
Tatung Einstein
***************************************************************************/
#include "emu.h"
#include "includes/einstein.h"
/****************************************************************
EINSTEIN NON-Z80 DEVICES DAISY CHAIN SUPPORT
****************************************************************/
DEFINE_DEVICE_TYPE(EINSTEIN_KEYBOARD_DAISY, einstein_keyboard_daisy_device, "einstein_keyboard", "Einstein keyboard daisy chain")
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
//-------------------------------------------------
// z80ctc_device - constructor
//-------------------------------------------------
einstein_keyboard_daisy_device::einstein_keyboard_daisy_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, EINSTEIN_KEYBOARD_DAISY, tag, owner, clock)
, device_z80daisy_interface(mconfig, *this)
{
}
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
void einstein_keyboard_daisy_device::device_start()
{
}
//**************************************************************************
// DAISY CHAIN INTERFACE
//**************************************************************************
//-------------------------------------------------
// z80daisy_irq_state - return the overall IRQ
// state for this device
//-------------------------------------------------
int einstein_keyboard_daisy_device::z80daisy_irq_state()
{
einstein_state *einstein = device().machine().driver_data<einstein_state>();
if (einstein->m_interrupt & einstein->m_interrupt_mask & EINSTEIN_KEY_INT)
return Z80_DAISY_INT;
return 0;
}
//-------------------------------------------------
// z80daisy_irq_ack - acknowledge an IRQ and
// return the appropriate vector
//-------------------------------------------------
int einstein_keyboard_daisy_device::z80daisy_irq_ack()
{
return 0xf7;
}
//-------------------------------------------------
// z80daisy_irq_reti - clear the interrupt
// pending state to allow other interrupts through
//-------------------------------------------------
void einstein_keyboard_daisy_device::z80daisy_irq_reti()
{
}
DEFINE_DEVICE_TYPE(EINSTEIN_ADC_DAISY, einstein_adc_daisy_device, "einstein_adc", "Einstein ADC daisy chain")
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
//-------------------------------------------------
// z80ctc_device - constructor
//-------------------------------------------------
einstein_adc_daisy_device::einstein_adc_daisy_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, EINSTEIN_ADC_DAISY, tag, owner, clock)
, device_z80daisy_interface(mconfig, *this)
{
}
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
void einstein_adc_daisy_device::device_start()
{
}
//**************************************************************************
// DAISY CHAIN INTERFACE
//**************************************************************************
//-------------------------------------------------
// z80daisy_irq_state - return the overall IRQ
// state for this device
//-------------------------------------------------
int einstein_adc_daisy_device::z80daisy_irq_state()
{
einstein_state *einstein = device().machine().driver_data<einstein_state>();
if (einstein->m_interrupt & einstein->m_interrupt_mask & EINSTEIN_ADC_INT)
return Z80_DAISY_INT;
return 0;
}
//-------------------------------------------------
// z80daisy_irq_ack - acknowledge an IRQ and
// return the appropriate vector
//-------------------------------------------------
int einstein_adc_daisy_device::z80daisy_irq_ack()
{
return 0xfb;
}
//-------------------------------------------------
// z80daisy_irq_reti - clear the interrupt
// pending state to allow other interrupts through
//-------------------------------------------------
void einstein_adc_daisy_device::z80daisy_irq_reti()
{
}
DEFINE_DEVICE_TYPE(EINSTEIN_FIRE_DAISY, einstein_fire_daisy_device, "einstein_fire", "Einstein fire button daisy chain")
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
//-------------------------------------------------
// z80ctc_device - constructor
//-------------------------------------------------
einstein_fire_daisy_device::einstein_fire_daisy_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, EINSTEIN_FIRE_DAISY, tag, owner, clock)
, device_z80daisy_interface(mconfig, *this)
{
}
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
void einstein_fire_daisy_device::device_start()
{
}
//**************************************************************************
// DAISY CHAIN INTERFACE
//**************************************************************************
//-------------------------------------------------
// z80daisy_irq_state - return the overall IRQ
// state for this device
//-------------------------------------------------
int einstein_fire_daisy_device::z80daisy_irq_state()
{
einstein_state *einstein = device().machine().driver_data<einstein_state>();
if (einstein->m_interrupt & einstein->m_interrupt_mask & EINSTEIN_FIRE_INT)
return Z80_DAISY_INT;
return 0;
}
//-------------------------------------------------
// z80daisy_irq_ack - acknowledge an IRQ and
// return the appropriate vector
//-------------------------------------------------
int einstein_fire_daisy_device::z80daisy_irq_ack()
{
return 0xfd;
}
//-------------------------------------------------
// z80daisy_irq_reti - clear the interrupt
// pending state to allow other interrupts through
//-------------------------------------------------
void einstein_fire_daisy_device::z80daisy_irq_reti()
{
}