(MESS) Altos5: added terminal back (z80dart isn't quite ready yet)

This commit is contained in:
Robbbert 2013-06-06 11:13:25 +00:00
parent ca191571d0
commit 428f19b5c6

View File

@ -11,6 +11,8 @@
#include "machine/z80pio.h"
#include "machine/z80dart.h"
#include "machine/z80dma.h"
#include "machine/serial.h"
#include "machine/terminal.h"
class altos5_state : public driver_device
@ -21,23 +23,35 @@ public:
m_maincpu(*this, "maincpu"),
m_pio0(*this, "z80pio_0"),
m_pio1(*this, "z80pio_1"),
m_sio1(*this, "z80sio_1"),
m_sio2(*this, "z80sio_2"),
m_ctc(*this, "z80ctc")
m_dart(*this, "z80dart"),
m_sio (*this, "z80sio"),
m_ctc (*this, "z80ctc"),
m_terminal(*this, TERMINAL_TAG)
{ }
DECLARE_READ8_MEMBER(memory_read_byte);
DECLARE_WRITE8_MEMBER(memory_write_byte);
DECLARE_READ8_MEMBER(io_read_byte);
DECLARE_WRITE8_MEMBER(io_write_byte);
DECLARE_READ8_MEMBER(port08_r);
DECLARE_READ8_MEMBER(port09_r);
DECLARE_WRITE8_MEMBER(port08_w);
DECLARE_WRITE8_MEMBER(port09_w);
DECLARE_DRIVER_INIT(altos5);
DECLARE_WRITE8_MEMBER(kbd_put);
DECLARE_READ8_MEMBER(port2e_r);
DECLARE_READ8_MEMBER(port2f_r);
UINT8 m_term_data;
UINT8 m_port08;
UINT8 m_port09;
virtual void machine_reset();
required_device<cpu_device> m_maincpu;
required_device<z80pio_device> m_pio0;
required_device<z80pio_device> m_pio1;
required_device<z80sio0_device> m_sio1;
required_device<z80sio0_device> m_sio2;
required_device<z80dart_device> m_dart;
optional_device<z80dart_device> m_sio;
required_device<z80ctc_device> m_ctc;
required_device<generic_terminal_device> m_terminal;
};
static ADDRESS_MAP_START(altos5_mem, AS_PROGRAM, 8, altos5_state)
@ -54,8 +68,11 @@ static ADDRESS_MAP_START(altos5_io, AS_IO, 8, altos5_state)
AM_RANGE(0x0c, 0x0f) AM_DEVREADWRITE("z80ctc", z80ctc_device, read, write)
AM_RANGE(0x10, 0x13) AM_DEVREADWRITE("z80pio_1", z80pio_device, read, write)
//AM_RANGE(0x14, 0x17) AM_WRITE(romoff_w)
AM_RANGE(0x1c, 0x1f) AM_DEVREADWRITE("z80sio_1", z80sio0_device, cd_ba_r, cd_ba_w)
AM_RANGE(0x2c, 0x2f) AM_DEVREADWRITE("z80sio_2", z80sio0_device, cd_ba_r, cd_ba_w)
AM_RANGE(0x1c, 0x1f) AM_DEVREADWRITE("z80dart", z80dart_device, ba_cd_r, ba_cd_w)
//AM_RANGE(0x20, 0x23) // Hard drive
AM_RANGE(0x2c, 0x2d) AM_NOP
AM_RANGE(0x2e, 0x2e) AM_READ(port2e_r) AM_DEVWRITE(TERMINAL_TAG, generic_terminal_device, write)
AM_RANGE(0x2f, 0x2f) AM_READ(port2f_r) AM_WRITENOP
ADDRESS_MAP_END
/* Input ports */
@ -73,11 +90,52 @@ static const z80_daisy_config daisy_chain_intf[] =
{ "z80pio_0" },
{ "z80pio_1" },
{ "z80ctc" },
{ "z80sio_1" },
{ "z80sio_2" },
{ "z80dart" },
// { "z80sio" },
{ NULL }
};
/*
d0: L = a HD is present
d1: L = a 2nd hard drive is present
d2: unused configuration input (must be H to skip HD boot)
d3: selected floppy is single(L) or double sided(H)
d7: IRQ from FDC
*/
READ8_MEMBER( altos5_state::port08_r )
{
return m_port08 | 0x87;
}
/*
d0: HD IRQ
*/
READ8_MEMBER( altos5_state::port09_r )
{
return m_port09 | 0x01;
}
/*
d4: DDEN (H = double density
d5: DS (H = drive 2)
d6: SS (H = side 2)
*/
WRITE8_MEMBER( altos5_state::port08_w )
{
m_port08 = data;
}
/*
d1, 2: Memory Map template selection (0 = diag; 1 = oasis; 2 = mp/m)
d3, 4: CPU bank select
d5: H = Write protect of common area
d6, 7: DMA bank select
*/
WRITE8_MEMBER( altos5_state::port09_w )
{
m_port09 = data;
}
READ8_MEMBER(altos5_state::memory_read_byte)
{
address_space& prog_space = m_maincpu->space(AS_PROGRAM);
@ -113,15 +171,29 @@ static Z80DMA_INTERFACE( dma_intf )
DEVCB_DRIVER_MEMBER(altos5_state, io_write_byte)
};
// baud rate generator and RTC. All inputs are 2MHz.
static Z80CTC_INTERFACE( ctc_intf )
{
DEVCB_CPU_INPUT_LINE("maincpu", INPUT_LINE_IRQ0), // interrupt callback
DEVCB_NULL, /* ZC/TO0 callback - SIO channel A clock */
DEVCB_NULL, /* ZC/TO1 callback - SIO channel B clock */
DEVCB_NULL,//DRIVER_LINE_MEMBER(altos5_state, pcm_82_w) /* ZC/TO2 callback - speaker */
DEVCB_NULL, /* ZC/TO0 callback - SIO Ch B */
DEVCB_NULL, /* ZC/TO1 callback - Z80DART Ch A, SIO Ch A */
DEVCB_NULL, /* ZC/TO2 callback - Z80DART Ch B */
};
static Z80PIO_INTERFACE( pio0_intf ) // all pins go to expansion socket
// system functions
static Z80PIO_INTERFACE( pio0_intf )
{
DEVCB_CPU_INPUT_LINE("maincpu", INPUT_LINE_IRQ0), // interrupt callback
DEVCB_DRIVER_MEMBER(altos5_state, port08_r), /* read port A */
DEVCB_DRIVER_MEMBER(altos5_state, port08_w), /* write port A */
DEVCB_NULL, /* portA ready active callback */
DEVCB_DRIVER_MEMBER(altos5_state, port09_r), /* read port B */
DEVCB_DRIVER_MEMBER(altos5_state, port09_w), /* write port B */
DEVCB_NULL /* portB ready active callback */
};
// parallel port
static Z80PIO_INTERFACE( pio1_intf )
{
DEVCB_CPU_INPUT_LINE("maincpu", INPUT_LINE_IRQ0), // interrupt callback
DEVCB_NULL, /* read port A */
@ -132,21 +204,12 @@ static Z80PIO_INTERFACE( pio0_intf ) // all pins go to expansion socket
DEVCB_NULL /* portB ready active callback */
};
static Z80PIO_INTERFACE( pio1_intf )
{
DEVCB_CPU_INPUT_LINE("maincpu", INPUT_LINE_IRQ0), // interrupt callback
DEVCB_NULL,//DEVICE_MEMBER(K7659_KEYBOARD_TAG, k7659_keyboard_device, read), /* read port A */
DEVCB_NULL, /* write port A */
DEVCB_NULL, /* portA ready active callback */
DEVCB_NULL,//DRIVER_MEMBER(altos5_state, pcm_85_r), /* read port B */
DEVCB_NULL,//DRIVER_MEMBER(altos5_state, pcm_85_w), /* write port B */
DEVCB_NULL /* portB ready active callback */
};
static Z80SIO_INTERFACE( sio1_intf )
// serial printer and console#3
static Z80DART_INTERFACE( dart_intf )
{
0, 0, 0, 0,
// console#3
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
@ -154,6 +217,7 @@ static Z80SIO_INTERFACE( sio1_intf )
DEVCB_NULL,
DEVCB_NULL,
// printer
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
@ -161,29 +225,13 @@ static Z80SIO_INTERFACE( sio1_intf )
DEVCB_NULL,
DEVCB_NULL,
DEVCB_CPU_INPUT_LINE("maincpu", INPUT_LINE_IRQ0),
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL
};
static Z80SIO_INTERFACE( sio2_intf )
{
0, 0, 0, 0,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL
};
DRIVER_INIT_MEMBER( altos5_state, altos5 )
{
@ -191,6 +239,28 @@ DRIVER_INIT_MEMBER( altos5_state, altos5 )
membank("bank1")->configure_entries(0, 2, &RAM[0], 0x10000);
}
READ8_MEMBER( altos5_state::port2e_r )
{
UINT8 ret = m_term_data;
m_term_data = 0;
return ret;
}
READ8_MEMBER( altos5_state::port2f_r )
{
return (m_term_data) ? 13 : 12;
}
WRITE8_MEMBER( altos5_state::kbd_put )
{
m_term_data = data;
}
static GENERIC_TERMINAL_INTERFACE( terminal_intf )
{
DEVCB_DRIVER_MEMBER(altos5_state, kbd_put)
};
static MACHINE_CONFIG_START( altos5, altos5_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", Z80, XTAL_8MHz / 2)
@ -199,14 +269,14 @@ static MACHINE_CONFIG_START( altos5, altos5_state )
MCFG_CPU_CONFIG(daisy_chain_intf)
/* video hardware */
MCFG_GENERIC_TERMINAL_ADD(TERMINAL_TAG, terminal_intf)
/* Devices */
MCFG_Z80DMA_ADD( "z80dma", XTAL_8MHz / 2, dma_intf)
MCFG_Z80DMA_ADD( "z80dma", XTAL_8MHz / 2, dma_intf)
MCFG_Z80PIO_ADD( "z80pio_0", XTAL_8MHz / 2, pio0_intf )
MCFG_Z80PIO_ADD( "z80pio_1", XTAL_8MHz / 2, pio1_intf )
MCFG_Z80SIO0_ADD("z80sio_1", XTAL_8MHz / 2, sio1_intf )
MCFG_Z80SIO0_ADD("z80sio_2", XTAL_8MHz / 2, sio2_intf )
MCFG_Z80CTC_ADD( "z80ctc", XTAL_8MHz / 2, ctc_intf )
MCFG_Z80CTC_ADD( "z80ctc", XTAL_8MHz / 2, ctc_intf )
MCFG_Z80DART_ADD("z80dart", XTAL_8MHz / 2, dart_intf )
MACHINE_CONFIG_END
@ -217,11 +287,64 @@ ROM_START( altos5 )
ROM_FILL(0x10054, 2, 0) // temp until banking sorted out
ROM_FILL(0x10344, 3, 0) // kill self test
ROM_REGION( 0x200, "user1", 0 )
ROM_LOAD("82s141.bin", 0x0000, 0x0200, CRC(35c8078c) SHA1(dce24374bfcc5d23959e2c03485d82a119c0c3c9)) // looks like a keyboard matrix
ROM_REGION( 0x200, "proms", 0 )
ROM_LOAD("82s141.bin", 0x0000, 0x0200, CRC(35c8078c) SHA1(dce24374bfcc5d23959e2c03485d82a119c0c3c9)) // banking control
ROM_END
/* Driver */
/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
COMP(1982, altos5, 0, 0, altos5, altos5, altos5_state, altos5, "Altos", "Altos 5-15", GAME_NOT_WORKING | GAME_NO_SOUND)
#if 0
/****************** UNUSED SERIAL CODE ************************/
//AM_RANGE(0x2c, 0x2f) AM_DEVREADWRITE("z80sio", z80dart_device, ba_cd_r, ba_cd_w)
static Z80SIO_INTERFACE( sio_intf )
{
9600, 9600, 153600, 153600, // rxa, txa, rxb, txb clocks (from CTC)
// console#2
DEVCB_NULL, // ChA in data
DEVCB_NULL, // out data
DEVCB_NULL, // DTR
DEVCB_NULL, // RTS
DEVCB_NULL, // WRDY
DEVCB_NULL, // SYNC
// console#1
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, dtr_w),
DEVCB_DEVICE_LINE_MEMBER("rs232", rs232_port_device, rts_w),
DEVCB_NULL,
DEVCB_NULL,
DEVCB_CPU_INPUT_LINE("maincpu", INPUT_LINE_IRQ0),
DEVCB_NULL, // unused DRQ pins
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL
};
static const rs232_port_interface rs232_intf =
{
// all outputs
DEVCB_NULL,//DEVCB_DEVICE_LINE_MEMBER("z80sio", z80dart_device, rxcb_w), // data
DEVCB_NULL, // DCD
DEVCB_NULL, // DSR
DEVCB_NULL, // RI
DEVCB_NULL //DEVCB_DEVICE_LINE_MEMBER("z80sio", z80dart_device, ctsb_w) // CTS
};
//MCFG_Z80SIO0_ADD("z80sio", XTAL_8MHz / 2, sio_intf )
//MCFG_RS232_PORT_ADD("rs232", rs232_intf, default_rs232_devices, "serial_terminal")
#endif