(nw) Onyx c8002 : added devices

This commit is contained in:
Robbbert 2017-11-01 02:18:27 +11:00
parent e7d2693098
commit ac6c08eb74

View File

@ -6,8 +6,6 @@ Onyx C8002
2013-08-18 Skeleton Driver 2013-08-18 Skeleton Driver
Copied from p8k.c
The C8002 is one of the earliest minicomputers to use Unix as an operating system. The C8002 is one of the earliest minicomputers to use Unix as an operating system.
The system consists of a main CPU (Z8002), and a slave CPU for Mass Storage control (Z80) The system consists of a main CPU (Z8002), and a slave CPU for Mass Storage control (Z80)
@ -21,15 +19,29 @@ The Z8002 board contains a 16 MHz crystal; 3x Z80CTC; 5x Z80SIO/0; 3x Z80PIO; 2
The system can handle 8 RS232 terminals, 7 hard drives, a tape cartridge drive, parallel i/o, The system can handle 8 RS232 terminals, 7 hard drives, a tape cartridge drive, parallel i/o,
and be connected to a RS422 network. and be connected to a RS422 network.
Status:
- Main screen prints an error with CTC (because there's no clock into it atm)
- Subcpu screen (after a while) prints various statuses then waits for the fdc to respond
To Do:
- Hook up daisy chains (see p8k.cpp for how to hook up a 16-bit chain)
(keyboard input depends on interrupts)
- Remaining devices
- Whatever hooks up to the devices
- Eventually we'll need software
- Manuals / schematics would be nice
*************************************************************************************************/ *************************************************************************************************/
#include "emu.h" #include "emu.h"
#include "cpu/z80/z80.h" #include "cpu/z80/z80.h"
#include "cpu/z8000/z8000.h" #include "cpu/z8000/z8000.h"
#include "machine/clock.h"
#include "bus/rs232/rs232.h"
//#include "cpu/z80/z80daisy.h" //#include "cpu/z80/z80daisy.h"
//#include "machine/z80ctc.h" #include "machine/z80ctc.h"
//#include "machine/z80pio.h" #include "machine/z80pio.h"
//#include "machine/z80sio.h" #include "machine/z80sio.h"
//#include "machine/z80dma.h" //#include "machine/z80dma.h"
#include "machine/terminal.h" #include "machine/terminal.h"
@ -39,30 +51,106 @@ public:
onyx_state(const machine_config &mconfig, device_type type, const char *tag) onyx_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag) : driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu") , m_maincpu(*this, "maincpu")
, m_terminal(*this, "terminal") , m_ctc1(*this, "ctc1")
, m_ctc2(*this, "ctc2")
, m_ctc3(*this, "ctc3")
, m_pio1(*this, "pio1")
, m_pio2(*this, "pio2")
, m_sio1(*this, "sio1")
, m_sio2(*this, "sio2")
, m_sio3(*this, "sio3")
, m_sio4(*this, "sio4")
, m_sio5(*this, "sio5")
{ } { }
DECLARE_MACHINE_RESET(c8002); DECLARE_MACHINE_RESET(c8002);
void kbd_put(u8 data); DECLARE_READ8_MEMBER(io_r);
DECLARE_READ8_MEMBER(portff05_r); DECLARE_WRITE8_MEMBER(io_w);
private: private:
uint8_t m_term_data; uint8_t m_term_data;
required_device<cpu_device> m_maincpu; required_device<cpu_device> m_maincpu;
required_device<generic_terminal_device> m_terminal; required_device<z80ctc_device> m_ctc1;
required_device<z80ctc_device> m_ctc2;
required_device<z80ctc_device> m_ctc3;
required_device<z80pio_device> m_pio1;
required_device<z80pio_device> m_pio2;
required_device<z80sio_device> m_sio1;
required_device<z80sio_device> m_sio2;
required_device<z80sio_device> m_sio3;
required_device<z80sio_device> m_sio4;
required_device<z80sio_device> m_sio5;
}; };
READ8_MEMBER( onyx_state::portff05_r ) READ8_MEMBER( onyx_state::io_r )
{ {
//return m_term_data; offset >>= 1;
switch (offset >> 2)
return 4; {
case 0x00:
return m_sio1->cd_ba_r(space, offset & 3);
case 0x01:
return m_sio2->cd_ba_r(space, offset & 3);
case 0x02:
return m_sio3->cd_ba_r(space, offset & 3);
case 0x03:
return m_sio4->cd_ba_r(space, offset & 3);
case 0x04:
return m_sio5->cd_ba_r(space, offset & 3);
case 0x06:
return m_ctc1->read(space, offset & 3);
case 0x07:
return m_ctc2->read(space, offset & 3);
case 0x08:
return m_ctc3->read(space, offset & 3);
case 0x0a:
return m_pio1->read(space, offset & 3);
case 0x0b:
return m_pio2->read(space, offset & 3);
default:
return 0;
}
} }
void onyx_state::kbd_put(u8 data) WRITE8_MEMBER( onyx_state::io_w )
{ {
m_term_data = data; offset >>= 1;
switch (offset >> 2)
{
case 0x00: // ff00-ff07
m_sio1->cd_ba_w(space, offset & 3, data);
break;
case 0x01: // ff08-ff0f
m_sio2->cd_ba_w(space, offset & 3, data);
break;
case 0x02: // ff10-ff17
m_sio3->cd_ba_w(space, offset & 3, data);
break;
case 0x03: // ff18-ff1f
m_sio4->cd_ba_w(space, offset & 3, data);
break;
case 0x04: // ff20-ff27
m_sio5->cd_ba_w(space, offset & 3, data);
break;
case 0x06: // ff30-ff37
m_ctc1->write(space, offset & 3, data);
break;
case 0x07: // ff38-ff3f
m_ctc2->write(space, offset & 3, data);
break;
case 0x08: // ff40-ff47
m_ctc3->write(space, offset & 3, data);
break;
case 0x0a: // ff50-ff57
m_pio1->write(space, offset & 3, data);
break;
case 0x0b: // ff58-ff5f
m_pio2->write(space, offset & 3, data);
break;
default:
break;
}
} }
@ -88,8 +176,7 @@ ADDRESS_MAP_END
//ADDRESS_MAP_END //ADDRESS_MAP_END
static ADDRESS_MAP_START(c8002_io, AS_IO, 8, onyx_state) static ADDRESS_MAP_START(c8002_io, AS_IO, 8, onyx_state)
AM_RANGE(0xff00, 0xff01) AM_DEVWRITE("terminal", generic_terminal_device, write) AM_RANGE(0xff00, 0xff5f) AM_READWRITE(io_r, io_w)
AM_RANGE(0xff04, 0xff05) AM_READ(portff05_r)
ADDRESS_MAP_END ADDRESS_MAP_END
static ADDRESS_MAP_START(submem, AS_PROGRAM, 8, onyx_state) static ADDRESS_MAP_START(submem, AS_PROGRAM, 8, onyx_state)
@ -99,6 +186,9 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START(subio, AS_IO, 8, onyx_state) static ADDRESS_MAP_START(subio, AS_IO, 8, onyx_state)
ADDRESS_MAP_GLOBAL_MASK(0xff) ADDRESS_MAP_GLOBAL_MASK(0xff)
AM_RANGE(0x00, 0x03) AM_DEVREADWRITE("pio1s", z80pio_device, read, write)
AM_RANGE(0x04, 0x04) AM_READNOP // disk status?
AM_RANGE(0x0c, 0x0f) AM_DEVREADWRITE("sio1s", z80sio_device, cd_ba_r, cd_ba_w )
ADDRESS_MAP_END ADDRESS_MAP_END
@ -122,18 +212,48 @@ static MACHINE_CONFIG_START( c8002 )
MCFG_CPU_IO_MAP(subio) MCFG_CPU_IO_MAP(subio)
MCFG_MACHINE_RESET_OVERRIDE(onyx_state, c8002) MCFG_MACHINE_RESET_OVERRIDE(onyx_state, c8002)
/* peripheral hardware */ MCFG_DEVICE_ADD("sio1_clock", CLOCK, 307200)
//MCFG_DEVICE_ADD("z80ctc_0", Z80CTC, XTAL_4MHz) MCFG_CLOCK_SIGNAL_HANDLER(DEVWRITELINE("sio1", z80sio_device, rxca_w))
//MCFG_DEVICE_ADD("z80ctc_1", Z80CTC, XTAL_4MHz) MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("sio1" ,z80sio_device, txca_w))
//MCFG_DEVICE_ADD("z80sio_0", Z80SIO, 9600)
//MCFG_DEVICE_ADD("z80sio_1", Z80SIO, 9600)
//MCFG_DEVICE_ADD("z80pio_0", Z80CTC, XTAL_4MHz)
//MCFG_DEVICE_ADD("z80pio_1", Z80CTC, XTAL_4MHz)
//MCFG_DEVICE_ADD("z80pio_2", Z80CTC, XTAL_4MHz)
/* video hardware */ /* peripheral hardware */
MCFG_DEVICE_ADD("terminal", GENERIC_TERMINAL, 0) MCFG_DEVICE_ADD("pio1", Z80PIO, XTAL_16MHz/4)
MCFG_GENERIC_TERMINAL_KEYBOARD_CB(PUT(onyx_state, kbd_put)) //MCFG_Z80PIO_OUT_INT_CB(INPUTLINE("maincpu", INPUT_LINE_IRQ0))
MCFG_DEVICE_ADD("pio2", Z80PIO, XTAL_16MHz/4)
//MCFG_Z80PIO_OUT_INT_CB(INPUTLINE("maincpu", INPUT_LINE_IRQ0))
MCFG_DEVICE_ADD("ctc1", Z80CTC, XTAL_16MHz /4)
MCFG_DEVICE_ADD("ctc2", Z80CTC, XTAL_16MHz /4)
MCFG_DEVICE_ADD("ctc3", Z80CTC, XTAL_16MHz /4)
MCFG_DEVICE_ADD("sio1", Z80SIO, XTAL_16MHz /4)
MCFG_Z80SIO_OUT_TXDA_CB(DEVWRITELINE("rs232", rs232_port_device, write_txd))
MCFG_Z80SIO_OUT_DTRA_CB(DEVWRITELINE("rs232", rs232_port_device, write_dtr))
MCFG_Z80SIO_OUT_RTSA_CB(DEVWRITELINE("rs232", rs232_port_device, write_rts))
MCFG_DEVICE_ADD("sio2", Z80SIO, XTAL_16MHz /4)
MCFG_DEVICE_ADD("sio3", Z80SIO, XTAL_16MHz /4)
MCFG_DEVICE_ADD("sio4", Z80SIO, XTAL_16MHz /4)
MCFG_DEVICE_ADD("sio5", Z80SIO, XTAL_16MHz /4)
MCFG_RS232_PORT_ADD("rs232", default_rs232_devices, "terminal")
MCFG_RS232_RXD_HANDLER(DEVWRITELINE("sio1", z80sio_device, rxa_w))
MCFG_RS232_DCD_HANDLER(DEVWRITELINE("sio1", z80sio_device, dcda_w))
MCFG_RS232_CTS_HANDLER(DEVWRITELINE("sio1", z80sio_device, ctsa_w))
MCFG_DEVICE_ADD("pio1s", Z80PIO, XTAL_16MHz/4)
//MCFG_Z80PIO_OUT_INT_CB(INPUTLINE("subcpu", INPUT_LINE_IRQ0))
MCFG_DEVICE_ADD("sio1s_clock", CLOCK, 614400)
MCFG_CLOCK_SIGNAL_HANDLER(DEVWRITELINE("sio1s", z80sio_device, rxtxcb_w))
//MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("sio1s" ,z80sio_device, txca_w))
MCFG_DEVICE_ADD("sio1s", Z80SIO, XTAL_16MHz /4)
MCFG_Z80SIO_OUT_TXDB_CB(DEVWRITELINE("rs232s", rs232_port_device, write_txd))
MCFG_Z80SIO_OUT_DTRB_CB(DEVWRITELINE("rs232s", rs232_port_device, write_dtr))
MCFG_Z80SIO_OUT_RTSB_CB(DEVWRITELINE("rs232s", rs232_port_device, write_rts))
MCFG_RS232_PORT_ADD("rs232s", default_rs232_devices, "terminal")
MCFG_RS232_RXD_HANDLER(DEVWRITELINE("sio1s", z80sio_device, rxb_w))
MCFG_RS232_DCD_HANDLER(DEVWRITELINE("sio1s", z80sio_device, dcdb_w))
MCFG_RS232_CTS_HANDLER(DEVWRITELINE("sio1s", z80sio_device, ctsb_w))
MACHINE_CONFIG_END MACHINE_CONFIG_END
/* ROM definition */ /* ROM definition */