mirror of
https://github.com/holub/mame
synced 2025-04-26 02:07:14 +03:00
(MESS) votrpss : connected devices (nw)
This commit is contained in:
parent
726aa02074
commit
cec876161a
@ -53,20 +53,30 @@
|
||||
<kevtris> but that's everything you need
|
||||
<LordNLptp> yeah
|
||||
|
||||
* (driver structure copied from vtech1.c)
|
||||
|
||||
Things to be looked at:
|
||||
- Serial doesn't work, so has been disabled.
|
||||
- Bottom 3 dips must be off/serial/off, or else nothing works.
|
||||
- No sound at all.
|
||||
- volume and pitch should be controlled by ppi outputs
|
||||
- pit to be hooked up
|
||||
- bit 0 of portc is not connected according to text above, but it
|
||||
completely changes the irq operation.
|
||||
|
||||
******************************************************************************/
|
||||
|
||||
/* Core includes */
|
||||
#include "emu.h"
|
||||
#include "cpu/z80/z80.h"
|
||||
#include "votrpss.lh"
|
||||
//#include "votrpss.lh"
|
||||
|
||||
/* Components */
|
||||
//#include "sound/ay8910.h"
|
||||
//#include "sound/votrax.h"
|
||||
//#include "machine/i8255.h"
|
||||
//#include "machine/pit8253.h"
|
||||
//#include "machine/i8251.h"
|
||||
#include "sound/ay8910.h"
|
||||
#include "sound/votrax.h"
|
||||
#include "machine/i8255.h"
|
||||
#include "machine/pit8253.h"
|
||||
#include "machine/i8251.h"
|
||||
#include "machine/serial.h"
|
||||
|
||||
/* For testing */
|
||||
#include "machine/terminal.h"
|
||||
@ -76,37 +86,35 @@ class votrpss_state : public driver_device
|
||||
{
|
||||
public:
|
||||
votrpss_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
: driver_device(mconfig, type, tag),
|
||||
m_maincpu(*this, "maincpu"),
|
||||
m_terminal(*this, TERMINAL_TAG)
|
||||
: driver_device(mconfig, type, tag)
|
||||
, m_maincpu(*this, "maincpu")
|
||||
, m_terminal(*this, TERMINAL_TAG)
|
||||
, m_ppi(*this, "ppi")
|
||||
, m_uart(*this, "uart")
|
||||
{ }
|
||||
|
||||
DECLARE_WRITE8_MEMBER(kbd_put);
|
||||
DECLARE_READ8_MEMBER(ppi_pa_r);
|
||||
DECLARE_READ8_MEMBER(ppi_pb_r);
|
||||
DECLARE_READ8_MEMBER(ppi_pc_r);
|
||||
DECLARE_WRITE8_MEMBER(ppi_pa_w);
|
||||
DECLARE_WRITE8_MEMBER(ppi_pb_w);
|
||||
DECLARE_WRITE8_MEMBER(ppi_pc_w);
|
||||
TIMER_DEVICE_CALLBACK_MEMBER(irq_timer);
|
||||
TIMER_DEVICE_CALLBACK_MEMBER(serial_tick);
|
||||
IRQ_CALLBACK_MEMBER(irq_ack);
|
||||
private:
|
||||
UINT8 m_term_data;
|
||||
UINT8 m_porta;
|
||||
UINT8 m_portb;
|
||||
UINT8 m_portc;
|
||||
virtual void machine_start();
|
||||
required_device<cpu_device> m_maincpu;
|
||||
required_device<generic_terminal_device> m_terminal;
|
||||
DECLARE_READ8_MEMBER(votrpss_00_r);
|
||||
DECLARE_READ8_MEMBER(votrpss_02_r);
|
||||
DECLARE_READ8_MEMBER(votrpss_41_r);
|
||||
DECLARE_WRITE8_MEMBER( votrpss_kbd_put );
|
||||
UINT8 m_term_data;
|
||||
UINT8 m_term_status;
|
||||
required_device<i8255_device> m_ppi;
|
||||
required_device<i8251_device> m_uart;
|
||||
};
|
||||
|
||||
READ8_MEMBER( votrpss_state::votrpss_02_r )
|
||||
{
|
||||
return m_term_status;
|
||||
}
|
||||
|
||||
READ8_MEMBER( votrpss_state::votrpss_00_r )
|
||||
{
|
||||
m_term_status = 0;
|
||||
return m_term_data;
|
||||
}
|
||||
|
||||
READ8_MEMBER( votrpss_state::votrpss_41_r )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
Address Maps
|
||||
@ -124,15 +132,12 @@ ADDRESS_MAP_END
|
||||
|
||||
static ADDRESS_MAP_START(votrpss_io, AS_IO, 8, votrpss_state)
|
||||
ADDRESS_MAP_GLOBAL_MASK(0xff)
|
||||
AM_RANGE(0x00, 0x00) AM_READ(votrpss_00_r)
|
||||
AM_RANGE(0x01, 0x01) AM_DEVWRITE(TERMINAL_TAG, generic_terminal_device, write)
|
||||
AM_RANGE(0x02, 0x02) AM_READ(votrpss_02_r)
|
||||
AM_RANGE(0x41, 0x41) AM_READ(votrpss_41_r)
|
||||
//AM_RANGE(0x00, 0xff) AM_NOP /* temporary */
|
||||
//AM_RANGE(0x00, 0x03) AM_READWRITE(8255ppi_r, 8255ppi_w) AM_MIRROR (0x3c)
|
||||
//AM_RANGE(0x40, 0x41) AM_READWRITE(i8251_r, i8251_w) AM_MIRROR (0x3e)
|
||||
//AM_RANGE(0x80, 0x83) AM_READWRITE(pit8253_r, pit8253_w) AM_MIRROR (0x3c)
|
||||
//AM_RANGE(0xc0, 0xc3) AM_DEVREADWRITE("ay1", ay8910_device, data_r, data_w) AM_MIRROR (0x3c)
|
||||
AM_RANGE(0x00, 0x03) AM_MIRROR(0x3c) AM_DEVREADWRITE("ppi", i8255_device, read, write)
|
||||
AM_RANGE(0x40, 0x40) AM_MIRROR(0x3e) AM_DEVREADWRITE("uart", i8251_device, data_r, data_w)
|
||||
AM_RANGE(0x41, 0x41) AM_MIRROR(0x3e) AM_DEVREADWRITE("uart", i8251_device, status_r, control_w)
|
||||
AM_RANGE(0x80, 0x83) AM_MIRROR(0x3c) AM_DEVREADWRITE("pit", pit8253_device, read, write)
|
||||
AM_RANGE(0xc0, 0xc0) AM_MIRROR(0x3e) AM_DEVREADWRITE("ay", ay8910_device, data_r, address_w)
|
||||
AM_RANGE(0xc1, 0xc1) AM_MIRROR(0x3e) AM_DEVREADWRITE("ay", ay8910_device, data_r, data_w)
|
||||
ADDRESS_MAP_END
|
||||
|
||||
|
||||
@ -168,17 +173,151 @@ static INPUT_PORTS_START(votrpss)
|
||||
PORT_DIPSETTING( 0x80, DEF_STR ( On ) )
|
||||
INPUT_PORTS_END
|
||||
|
||||
WRITE8_MEMBER( votrpss_state::votrpss_kbd_put )
|
||||
void votrpss_state::machine_start()
|
||||
{
|
||||
m_term_data = data;
|
||||
m_term_status = 0x20;
|
||||
m_maincpu->set_irq_acknowledge_callback(device_irq_acknowledge_delegate(FUNC(votrpss_state::irq_ack),this));
|
||||
}
|
||||
|
||||
static GENERIC_TERMINAL_INTERFACE( votrpss_terminal_intf )
|
||||
TIMER_DEVICE_CALLBACK_MEMBER( votrpss_state::irq_timer )
|
||||
{
|
||||
DEVCB_DRIVER_MEMBER(votrpss_state, votrpss_kbd_put)
|
||||
m_maincpu->set_input_line(0, ASSERT_LINE);
|
||||
}
|
||||
|
||||
IRQ_CALLBACK_MEMBER( votrpss_state::irq_ack )
|
||||
{
|
||||
m_maincpu->set_input_line(0, CLEAR_LINE);
|
||||
return 0x38;
|
||||
}
|
||||
|
||||
static const i8251_interface uart_intf =
|
||||
{
|
||||
//DEVCB_DEVICE_LINE_MEMBER("rs232", serial_port_device, rx),
|
||||
//DEVCB_DEVICE_LINE_MEMBER("rs232", serial_port_device, tx),
|
||||
//DEVCB_DEVICE_LINE_MEMBER("rs232", rs232_port_device, dsr_r),
|
||||
//DEVCB_DEVICE_LINE_MEMBER("rs232", rs232_port_device, dtr_w),
|
||||
//DEVCB_DEVICE_LINE_MEMBER("rs232", rs232_port_device, rts_w),
|
||||
DEVCB_NULL,
|
||||
DEVCB_NULL,
|
||||
DEVCB_NULL,
|
||||
DEVCB_NULL,
|
||||
DEVCB_NULL,
|
||||
DEVCB_NULL,
|
||||
DEVCB_NULL,
|
||||
DEVCB_NULL,
|
||||
DEVCB_NULL
|
||||
};
|
||||
|
||||
static const rs232_port_interface rs232_intf =
|
||||
{
|
||||
DEVCB_NULL,
|
||||
DEVCB_NULL,
|
||||
DEVCB_NULL,
|
||||
DEVCB_NULL,
|
||||
DEVCB_NULL
|
||||
};
|
||||
|
||||
static const struct pit8253_interface pit_intf =
|
||||
{
|
||||
{
|
||||
{
|
||||
XTAL_8MHz, /* Timer 0: baud rate gen for 8251 */
|
||||
DEVCB_NULL,
|
||||
DEVCB_NULL
|
||||
}, {
|
||||
XTAL_8MHz / 256, /* Timer 1: Pitch */
|
||||
DEVCB_NULL,
|
||||
DEVCB_NULL
|
||||
}, {
|
||||
XTAL_8MHz / 4096, /* Timer 2: Volume */
|
||||
DEVCB_NULL,
|
||||
DEVCB_NULL
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
READ8_MEMBER( votrpss_state::ppi_pa_r )
|
||||
{
|
||||
UINT8 ret = m_term_data;
|
||||
m_term_data = 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
READ8_MEMBER( votrpss_state::ppi_pb_r )
|
||||
{
|
||||
return m_portb;
|
||||
}
|
||||
|
||||
// Bit 0 controls what happens at interrupt time. See code around 518.
|
||||
READ8_MEMBER( votrpss_state::ppi_pc_r )
|
||||
{
|
||||
UINT8 data = 0;
|
||||
|
||||
if (m_term_data)
|
||||
{
|
||||
m_ppi->pc4_w(0); // send a strobe pulse
|
||||
data |= 0x20;
|
||||
}
|
||||
|
||||
return (m_portc & 0xdb) | data;
|
||||
//return data;
|
||||
}
|
||||
|
||||
WRITE8_MEMBER( votrpss_state::ppi_pa_w )
|
||||
{
|
||||
m_porta = data;
|
||||
}
|
||||
|
||||
WRITE8_MEMBER( votrpss_state::ppi_pb_w )
|
||||
{
|
||||
m_portb = data;
|
||||
m_terminal->write(space, offset, data&0x7f);
|
||||
}
|
||||
|
||||
WRITE8_MEMBER( votrpss_state::ppi_pc_w )
|
||||
{
|
||||
m_portc = data;
|
||||
}
|
||||
|
||||
static I8255_INTERFACE( ppi_intf )
|
||||
{
|
||||
DEVCB_DRIVER_MEMBER(votrpss_state, ppi_pa_r), // Port A read
|
||||
DEVCB_DRIVER_MEMBER(votrpss_state, ppi_pa_w), // Port A write
|
||||
DEVCB_DRIVER_MEMBER(votrpss_state, ppi_pb_r), // Port B read
|
||||
DEVCB_DRIVER_MEMBER(votrpss_state, ppi_pb_w), // Port B write
|
||||
DEVCB_DRIVER_MEMBER(votrpss_state, ppi_pc_r), // Port C read
|
||||
DEVCB_DRIVER_MEMBER(votrpss_state, ppi_pc_w), // Port C write
|
||||
};
|
||||
|
||||
static const ay8910_interface ay8910_intf =
|
||||
{
|
||||
AY8910_LEGACY_OUTPUT, // flags
|
||||
AY8910_DEFAULT_LOADS, // channel load in ohms
|
||||
DEVCB_NULL, // port A read
|
||||
DEVCB_INPUT_PORT("DSW1"), // port B read
|
||||
DEVCB_DEVICE_MEMBER("votrax", votrax_sc01_device, write), // port A write
|
||||
DEVCB_NULL // port B write
|
||||
};
|
||||
|
||||
static struct votrax_sc01_interface votrax_interface =
|
||||
{
|
||||
};
|
||||
|
||||
WRITE8_MEMBER( votrpss_state::kbd_put )
|
||||
{
|
||||
m_term_data = data;
|
||||
}
|
||||
|
||||
static GENERIC_TERMINAL_INTERFACE( terminal_intf )
|
||||
{
|
||||
DEVCB_DRIVER_MEMBER(votrpss_state, kbd_put)
|
||||
};
|
||||
|
||||
TIMER_DEVICE_CALLBACK_MEMBER( votrpss_state::serial_tick )
|
||||
{
|
||||
m_uart->receive_clock();
|
||||
m_uart->transmit_clock();
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
Machine Drivers
|
||||
******************************************************************************/
|
||||
@ -188,22 +327,28 @@ static MACHINE_CONFIG_START( votrpss, votrpss_state )
|
||||
MCFG_CPU_ADD("maincpu", Z80, XTAL_8MHz/2) /* 4.000 MHz, verified */
|
||||
MCFG_CPU_PROGRAM_MAP(votrpss_mem)
|
||||
MCFG_CPU_IO_MAP(votrpss_io)
|
||||
//MCFG_QUANTUM_TIME(attotime::from_hz(60))
|
||||
|
||||
/* video hardware */
|
||||
//MCFG_DEFAULT_LAYOUT(layout_votrpss)
|
||||
|
||||
/* sound hardware */
|
||||
//MCFG_SPEAKER_STANDARD_MONO("mono")
|
||||
//MCFG_SOUND_ADD("ay1", AY8910, XTAL_8MHz/4) /* 2.000 MHz, verified */
|
||||
//MCFG_SOUND_CONFIG(ay8910_config)
|
||||
//MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
|
||||
//votrax goes here too
|
||||
MCFG_SPEAKER_STANDARD_MONO("mono")
|
||||
MCFG_SOUND_ADD("ay", AY8910, XTAL_8MHz/4) /* 2.000 MHz, verified */
|
||||
MCFG_SOUND_CONFIG(ay8910_intf)
|
||||
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
|
||||
MCFG_VOTRAX_SC01_ADD("votrax", 1700000, votrax_interface ) /* 1.70 MHz? needs verify */
|
||||
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
|
||||
|
||||
/* printer */
|
||||
//MCFG_PRINTER_ADD("printer")
|
||||
/* Devices */
|
||||
MCFG_GENERIC_TERMINAL_ADD(TERMINAL_TAG, terminal_intf)
|
||||
MCFG_I8251_ADD("uart", uart_intf)
|
||||
MCFG_PIT8253_ADD( "pit", pit_intf)
|
||||
MCFG_I8255_ADD("ppi", ppi_intf)
|
||||
MCFG_TIMER_DRIVER_ADD_PERIODIC("irq_timer", votrpss_state, irq_timer, attotime::from_msec(10))
|
||||
|
||||
MCFG_GENERIC_TERMINAL_ADD(TERMINAL_TAG, votrpss_terminal_intf)
|
||||
/* Serial components - comment out if not needed */
|
||||
//MCFG_TIMER_DRIVER_ADD_PERIODIC("serial", votrpss_state, serial_tick, attotime::from_hz(153600))
|
||||
//MCFG_RS232_PORT_ADD("rs232", rs232_intf, default_rs232_devices, "serial_terminal")
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user