(MESS) votrpss : connected devices (nw)

This commit is contained in:
Robbbert 2013-09-24 12:42:08 +00:00
parent 726aa02074
commit cec876161a

View File

@ -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