summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--src/mess/drivers/sbrain.c155
1 files changed, 100 insertions, 55 deletions
diff --git a/src/mess/drivers/sbrain.c b/src/mess/drivers/sbrain.c
index 6ee1ab4b9a9..1117e4f2843 100644
--- a/src/mess/drivers/sbrain.c
+++ b/src/mess/drivers/sbrain.c
@@ -17,16 +17,29 @@ The main cpu does a busreq to gain access to the sub cpu's 1k static ram. When t
necessary to stop the sub cpu because of other handshaking. Our Z80 emulation doesn't
support the busack signal anyway, so we just assume it is granted immediately.
+The schematic in parts is difficult to read. Some assumptions have been made.
+
+To Do:
+- Without a disk in, it should display a message to insert a disk. Doesn't happen.
+ It thinks a disk is in and tries to execute garbage in the disk buffer instead.
+- Port 08 is largely a guess.
+- No work done on the keyboard. Should be able to hook up the generic ascii keyboard.
+- No software available to try.
+- Bug in floppy code means the motor will turn off after a few seconds. It should stay on.
+- Video chips need to be emulated (CRT8002 and DP8350), attributes etc.
+- After each line of characters, an interrupt should be generated. 25 IRQs per screen.
+- Hook the outputs of the baud rate generator to the uarts.
+- Probably lots of other stuff.
*************************************************************************************************************/
#include "emu.h"
#include "cpu/z80/z80.h"
-//#include "machine/serial.h"
#include "machine/wd_fdc.h"
-//#include "machine/i8251.h"
+#include "machine/i8251.h"
#include "machine/i8255.h"
+#include "machine/com8116.h"
#include "sound/beep.h"
class sbrain_state : public driver_device
@@ -38,9 +51,9 @@ public:
, m_maincpu(*this, "maincpu")
, m_subcpu(*this, "subcpu")
, m_beep(*this, "beeper")
- //, m_brg(*this, "brg")
- //, m_u0(*this, "uart0")
- //, m_u1(*this, "uart1")
+ , m_brg(*this, "brg")
+ , m_u0(*this, "uart0")
+ , m_u1(*this, "uart1")
, m_ppi(*this, "ppi")
, m_fdc (*this, "fdc")
, m_floppy0(*this, "fdc:0")
@@ -59,19 +72,22 @@ public:
DECLARE_WRITE8_MEMBER(ppi_pb_w);
DECLARE_READ8_MEMBER(ppi_pc_r);
DECLARE_WRITE8_MEMBER(ppi_pc_w);
+ DECLARE_READ8_MEMBER(port08_r);
+ DECLARE_WRITE8_MEMBER(port08_w);
+ DECLARE_WRITE8_MEMBER(baud_w);
+ DECLARE_WRITE_LINE_MEMBER(fr_w);
+ DECLARE_WRITE_LINE_MEMBER(ft_w);
private:
- //floppy_image_device *m_floppy;
- //void fdc_intrq_w(bool state);
- //void fdc_drq_w(bool state);
UINT8 m_porta;
UINT8 m_portb;
UINT8 m_portc;
+ UINT8 m_port08;
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_subcpu;
required_device<beep_device> m_beep;
- //required_device<com8116_device> m_brg;
- //required_device<i8251_device> m_uart0;
- //required_device<i8251_device> m_uart1;
+ required_device<com8116_device> m_brg;
+ required_device<i8251_device> m_u0;
+ required_device<i8251_device> m_u1;
required_device<i8255_device> m_ppi;
required_device<fd1791_t> m_fdc;
required_device<floppy_connector> m_floppy0;
@@ -88,13 +104,13 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( sbrain_io, AS_IO, 8, sbrain_state )
ADDRESS_MAP_GLOBAL_MASK(0xff)
- //AM_RANGE(0x40, 0x40) AM_MIRROR(6) AM_DEVREADWRITE("uart0", i8251_device, data_r, data_w)
- //AM_RANGE(0x41, 0x41) AM_MIRROR(6) AM_DEVREADWRITE("uart0", i8251_device, status_r, control_w)
+ AM_RANGE(0x40, 0x40) AM_MIRROR(6) AM_DEVREADWRITE("uart0", i8251_device, data_r, data_w)
+ AM_RANGE(0x41, 0x41) AM_MIRROR(6) AM_DEVREADWRITE("uart0", i8251_device, status_r, control_w)
//AM_RANGE(0x48, 0x4f) chr_int_latch
//AM_RANGE(0x50, 0x57) key_in
- //AM_RANGE(0x58, 0x58) AM_MIRROR(6) AM_DEVREADWRITE("uart1", i8251_device, data_r, data_w)
- //AM_RANGE(0x59, 0x59) AM_MIRROR(6) AM_DEVREADWRITE("uart1", i8251_device, status_r, control_w)
- //AM_RANGE(0x60, 0x67) AM_WRITE(baud_w)
+ AM_RANGE(0x58, 0x58) AM_MIRROR(6) AM_DEVREADWRITE("uart1", i8251_device, data_r, data_w)
+ AM_RANGE(0x59, 0x59) AM_MIRROR(6) AM_DEVREADWRITE("uart1", i8251_device, status_r, control_w)
+ AM_RANGE(0x60, 0x67) AM_WRITE(baud_w)
AM_RANGE(0x68, 0x6b) AM_MIRROR(4) AM_DEVREADWRITE("ppi", i8255_device, read, write)
ADDRESS_MAP_END
@@ -105,15 +121,58 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( sbrain_subio, AS_IO, 8, sbrain_state )
ADDRESS_MAP_GLOBAL_MASK(0xff)
- //AM_RANGE(0x08, 0x08)
+ AM_RANGE(0x08, 0x08) AM_READWRITE(port08_r,port08_w)
AM_RANGE(0x10, 0x13) AM_DEVREADWRITE("fdc", fd1791_t, read, write)
ADDRESS_MAP_END
-//WRITE8_MEMBER( sbrain_state::baud_w )
-//{
-// m_brg->str_w(data & 0x0f);
-// m_brg->stt_w(data >> 4);
-//}
+// bit 0 is wrong, maybe the whole byte is wrong
+READ8_MEMBER( sbrain_state::port08_r )
+{
+ return m_port08;
+}
+
+/* Misc disk functions
+d0 : disk busy?
+d1 : SEL A (drive 0?)
+d2 : SEL B (drive 1?)
+d3 : SEL C
+d4 : SEL D
+d5 : side select
+d6,7 : not used
+*/
+WRITE8_MEMBER( sbrain_state::port08_w )
+{
+ m_port08 = data | 0xc0;
+
+ floppy_image_device *floppy = NULL;
+ if (BIT(m_port08, 1)) floppy = m_floppy0->get_device();
+ if (BIT(m_port08, 2)) floppy = m_floppy1->get_device();
+
+ m_fdc->set_floppy(floppy);
+
+ if (floppy)
+ {
+ floppy->ss_w(BIT(m_port08, 5)); // might need inverting
+ }
+
+ // refresh motor on, hopefully this will keep them turning
+ m_floppy0->get_device()->mon_w(0); // motors run all the time
+ m_floppy1->get_device()->mon_w(0);
+}
+
+WRITE_LINE_MEMBER( sbrain_state::fr_w )
+{
+}
+
+WRITE_LINE_MEMBER( sbrain_state::ft_w )
+{
+}
+
+WRITE8_MEMBER( sbrain_state::baud_w )
+{
+ m_brg->str_w(data & 0x0f);
+ m_brg->stt_w(data >> 4);
+}
READ8_MEMBER( sbrain_state::ppi_pa_r )
{
@@ -145,7 +204,7 @@ d7 : cpu2 /busak line
*/
READ8_MEMBER( sbrain_state::ppi_pb_r )
{
- return m_portb | 0x50 | ioport("VS")->read() | ((UINT8)BIT(m_portc, 5) << 7);
+ return m_portb | 0x50 | ioport("VS")->read() | (BIT(m_port08, 0) << 5) | ((UINT8)BIT(m_portc, 5) << 7);
}
WRITE8_MEMBER( sbrain_state::ppi_pb_w )
@@ -169,7 +228,7 @@ d6 : beeper
d7 : keyboard, 1=enable comms, 0=reset
*/
WRITE8_MEMBER( sbrain_state::ppi_pc_w )
-{//printf("%X ",data);
+{
m_portc = data;
m_beep->set_state(BIT(data, 6));
membank("bankr0")->set_entry(BIT(data, 2));
@@ -181,14 +240,11 @@ WRITE8_MEMBER( sbrain_state::ppi_pc_w )
static INPUT_PORTS_START( sbrain )
/* vblank */
PORT_START("VS")
- PORT_BIT(0x24, IP_ACTIVE_HIGH, IPT_CUSTOM) PORT_VBLANK("screen")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_CUSTOM) PORT_VBLANK("screen")
INPUT_PORTS_END
DRIVER_INIT_MEMBER( sbrain_state, sbrain )
{
- //m_fdc->setup_intrq_cb(fd1791_t::line_cb(FUNC(sbrain_state::fdc_intrq_w), this));
- //m_fdc->setup_drq_cb(fd1791_t::line_cb(FUNC(sbrain_state::fdc_drq_w), this));
-
UINT8 *main = memregion("maincpu")->base();
UINT8 *sub = memregion("subcpu")->base();
@@ -213,42 +269,32 @@ static I8255_INTERFACE( ppi_intf )
DEVCB_DRIVER_MEMBER(sbrain_state, ppi_pc_w), // Port C write
};
-#if 0
-static const rs232_port_interface rs232_intf =
+static const i8251_interface u0_intf =
{
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
- DEVCB_NULL
-};
-
-static const i8251_interface u0_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_DRIVER_LINE_MEMBER(sbrain_state, sio_rxrdy_w),
- DEVCB_DRIVER_LINE_MEMBER(sbrain_state, sio_txrdy_w),
+ DEVCB_NULL,
+ DEVCB_NULL,
+ DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL
};
static const i8251_interface u1_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_DRIVER_LINE_MEMBER(sbrain_state, sio_rxrdy_w),
- DEVCB_DRIVER_LINE_MEMBER(sbrain_state, sio_txrdy_w),
+ DEVCB_NULL,
+ DEVCB_NULL,
+ DEVCB_NULL,
+ DEVCB_NULL,
+ DEVCB_NULL,
+ DEVCB_NULL,
+ DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL
};
-#endif
+
MACHINE_RESET_MEMBER( sbrain_state, sbrain )
{
m_beep->set_frequency(800);
@@ -290,7 +336,7 @@ UINT32 sbrain_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap,
*p++ = BIT(gfx, 0);
}
}
- ma+=160;
+ ma+=80;
}
return 0;
}
@@ -322,10 +368,9 @@ static MACHINE_CONFIG_START( sbrain, sbrain_state )
/* Devices */
MCFG_I8255_ADD("ppi", ppi_intf)
- //MCFG_I8251_ADD("uart0", u0_intf)
- //MCFG_I8251_ADD("uart1", u1_intf)
- //MCFG_COM8116_ADD("brg", XTAL_5_0688MHz, NULL, WRITELINE(sbrain_state, fr_w), WRITELINE(sbrain_state, ft_w))
- //MCFG_RS232_PORT_ADD("rs232", rs232_intf, default_rs232_devices, "serial_terminal")
+ MCFG_I8251_ADD("uart0", u0_intf)
+ MCFG_I8251_ADD("uart1", u1_intf)
+ MCFG_COM8116_ADD("brg", XTAL_5_0688MHz, NULL, WRITELINE(sbrain_state, fr_w), WRITELINE(sbrain_state, ft_w))
MCFG_FD1791x_ADD("fdc", XTAL_16MHz / 16)
MCFG_FLOPPY_DRIVE_ADD("fdc:0", sbrain_floppies, "525dd", floppy_image_device::default_floppy_formats)
MCFG_FLOPPY_DRIVE_ADD("fdc:1", sbrain_floppies, "525dd", floppy_image_device::default_floppy_formats)