diff options
author | Angelo Salese <angelosa@users.noreply.github.com> | 2013-03-25 17:59:18 +0000 |
---|---|---|
committer | Angelo Salese <angelosa@users.noreply.github.com> | 2013-03-25 17:59:18 +0000 |
commit | 8f0e14573839ff1868dc6e9387fbd6b889acd380 (patch) | |
tree | 7ceba8086c1250c45052ed9c3f2d22728f5517ae /src | |
parent | 6138e0e70eb9340833193dc0d8ba0d5b9091eb68 (diff) |
Improved various things, shows 'no system media' now
Diffstat (limited to 'src')
-rw-r--r-- | src/mess/drivers/mz3500.c | 161 |
1 files changed, 138 insertions, 23 deletions
diff --git a/src/mess/drivers/mz3500.c b/src/mess/drivers/mz3500.c index 24b3959c3ce..9fa4c3afc36 100644 --- a/src/mess/drivers/mz3500.c +++ b/src/mess/drivers/mz3500.c @@ -4,6 +4,10 @@ preliminary driver by Angelo Salese + TODO: + - BUSREQ / BUSACK signals. + - master/slave comms aren't perfect (especially noticeable if you change the video DIP) + Notes: Sub-CPU test meanings: * RA (tests RAM, first is work RAM, other two are shared RAM banks) @@ -24,9 +28,10 @@ #include "emu.h" #include "cpu/z80/z80.h" -//#include "sound/ay8910.h" -#include "video/upd7220.h" #include "machine/upd765.h" +#include "machine/i8255.h" +#include "sound/beep.h" +#include "video/upd7220.h" #define MAIN_CLOCK XTAL_8MHz @@ -59,6 +64,8 @@ public: UINT8 m_ma,m_mo,m_ms,m_me2,m_me1; UINT8 m_crtc[0x10]; + UINT8 m_srdy; + UINT8 m_fdd_sel; DECLARE_READ8_MEMBER(mz3500_master_mem_r); @@ -74,6 +81,12 @@ public: DECLARE_WRITE8_MEMBER(mz3500_crtc_w); DECLARE_READ8_MEMBER(mz3500_fdc_r); DECLARE_WRITE8_MEMBER(mz3500_fdc_w); + DECLARE_WRITE8_MEMBER(mz3500_pa_w); + DECLARE_WRITE8_MEMBER(mz3500_pb_w); + DECLARE_WRITE8_MEMBER(mz3500_pc_w); + + void fdc_irq(bool state); + void fdc_drq(bool state); // screen updates UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); @@ -400,6 +413,14 @@ READ8_MEMBER(mz3500_state::mz3500_io_r) ---- -xxx interrupt status */ + switch(offset) + { + case 2: + return ((machine().root_device().ioport("SYSTEM_DSW")->read() & 0x0f) << 1) | ((machine().root_device().ioport("FD_DSW")->read() & 0x8) >> 3); + case 3: + return ((machine().root_device().ioport("FD_DSW")->read() & 0x7)<<5) | (m_srdy << 4); + } + return 0; } @@ -422,6 +443,11 @@ WRITE8_MEMBER(mz3500_state::mz3500_io_w) switch(offset) { + case 0: + /* HACK: actually busreq */ + m_slave->set_input_line(INPUT_LINE_HALT, data & 2 ? ASSERT_LINE : CLEAR_LINE); + + break; case 1: m_ms = data & 3; break; @@ -475,16 +501,19 @@ WRITE8_MEMBER(mz3500_state::mz3500_fdc_w) */ static const char *const m_fddnames[4] = { "upd765a:0", "upd765a:1", "upd765a:2", "upd765a:3"}; - for(int i=0;i<4;i++) + if(data & 0x40) { - if(data & 1 << i) + for(int i=0;i<4;i++) { - m_fdd_sel = i; - break; + if(data & 1 << i) + { + m_fdd_sel = i; + break; + } } } - machine().device<floppy_connector>(m_fddnames[m_fdd_sel])->get_device()->mon_w(data & 0x10 ? ASSERT_LINE : CLEAR_LINE); + machine().device<floppy_connector>(m_fddnames[m_fdd_sel])->get_device()->mon_w(data & 0x10 ? CLEAR_LINE : ASSERT_LINE); } @@ -516,13 +545,57 @@ static ADDRESS_MAP_START( mz3500_slave_io, AS_IO, 8, mz3500_state ) // AM_RANGE(0x00, 0x0f) f/f and irq to master CPU // AM_RANGE(0x10, 0x1f) i8251 // AM_RANGE(0x20, 0x2f) pit8253 -// AM_RANGE(0x30, 0x3f) i8255 + AM_RANGE(0x30, 0x33) AM_DEVREADWRITE("i8255", i8255_device, read, write) AM_RANGE(0x40, 0x40) AM_READ_PORT("DSW") AM_RANGE(0x50, 0x5f) AM_RAM_WRITE(mz3500_crtc_w) AM_RANGE(0x60, 0x61) AM_DEVREADWRITE("upd7220_gfx", upd7220_device, read, write) AM_RANGE(0x70, 0x71) AM_DEVREADWRITE("upd7220_chr", upd7220_device, read, write) ADDRESS_MAP_END +WRITE8_MEMBER(mz3500_state::mz3500_pa_w) +{ + // printer data +} + +WRITE8_MEMBER(mz3500_state::mz3500_pb_w) +{ + /* + x--- ---- CG select (ROM and/or upd7220 clock?) + -x-- ---- SRDY signal (to master) + --xx xxxx upd1990 RTC (CLK, Din, C2, C1, C0, STRB) + + */ + //printf("%02x PB\n",data); + + m_srdy = (data & 0x40) >> 6; +} + +WRITE8_MEMBER(mz3500_state::mz3500_pc_w) +{ + /* + x--- ---- printer OBF output + -x-- ---- printer ACK input + --x- ---- printer STROBE + ---x ---- buzzer + ---- -xxx Keyboard (ACKC, STC, DC) + */ + //printf("%02x PC\n",data); + + machine().device<beep_device>(BEEPER_TAG)->set_state(data & 0x10); + +} + +static I8255A_INTERFACE( i8255_intf ) +{ + DEVCB_NULL, /* Port A read */ + DEVCB_DRIVER_MEMBER(mz3500_state,mz3500_pa_w), /* Port A write */ + DEVCB_NULL, /* Port B read */ + DEVCB_DRIVER_MEMBER(mz3500_state,mz3500_pb_w), /* Port B write */ + DEVCB_NULL, /* Port C read */ + DEVCB_DRIVER_MEMBER(mz3500_state,mz3500_pc_w), /* Port C write */ +}; + + static INPUT_PORTS_START( mz3500 ) PORT_START("DSW") PORT_DIPNAME( 0x01, 0x00, "SYSA" ) @@ -546,12 +619,11 @@ static INPUT_PORTS_START( mz3500 ) PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unknown ) ) PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x40, DEF_STR( On ) ) - PORT_DIPNAME( 0x80, 0x80, "Sub-CPU Test" ) + PORT_DIPNAME( 0x80, 0x80, "Sub-CPU Test" ) /* hack */ PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - /* dummy active low structure */ - PORT_START("DSWA") + PORT_START("FD_DSW") PORT_DIPNAME( 0x01, 0x01, "DSWA" ) PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) @@ -561,20 +633,22 @@ static INPUT_PORTS_START( mz3500 ) PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x08, 0x00, DEF_STR( Unknown ) ) PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + + PORT_START("SYSTEM_DSW") + PORT_DIPNAME( 0x01, 0x01, "DSWA" ) + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPNAME( 0x04, 0x00, "CRT Select" ) + PORT_DIPSETTING( 0x04, "Normal Display (MZ1D01, MZ1D06)" ) + PORT_DIPSETTING( 0x00, "Hi-Res Display (MZ1D02, MZ1D03)" ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) INPUT_PORTS_END @@ -607,6 +681,17 @@ static GFXDECODE_START( mz3500 ) GFXDECODE_ENTRY( "gfx1", 0x1000, charlayout_8x16, 0, 1 ) GFXDECODE_END +void mz3500_state::fdc_irq(bool state) +{ +// printf("%d IRQ\n",state); + m_master->set_input_line(INPUT_LINE_IRQ0, state ? ASSERT_LINE : CLEAR_LINE); + +} + +void mz3500_state::fdc_drq(bool state) +{ + printf("%02x DRQ\n",state); +} void mz3500_state::machine_start() { @@ -626,9 +711,36 @@ void mz3500_state::machine_reset() m_me1 = 0; m_me2 = 0; //m_slave->set_input_line(INPUT_LINE_RESET, ASSERT_LINE); + m_srdy = 0; + + upd765a_device *fdc; + fdc = machine().device<upd765a_device>(":upd765a"); + + if (fdc) + { + fdc->setup_intrq_cb(upd765a_device::line_cb(FUNC(mz3500_state::fdc_irq), this)); + fdc->setup_drq_cb(upd765a_device::line_cb(FUNC(mz3500_state::fdc_drq), this)); + + m_fdd_sel = 0; + { + static const char *const m_fddnames[4] = { "upd765a:0", "upd765a:1", "upd765a:2", "upd765a:3"}; + + for(int i=0;i<4;i++) + { + machine().device<floppy_connector>(m_fddnames[i])->get_device()->mon_w(ASSERT_LINE); + machine().device<floppy_connector>(m_fddnames[i])->get_device()->set_rpm(360); + } + + machine().device<upd765a_device>("upd765a")->set_rate(500000); + } + } + + machine().device<beep_device>(BEEPER_TAG)->set_frequency(2400); + machine().device<beep_device>(BEEPER_TAG)->set_state(0); } + void mz3500_state::palette_init() { int i; @@ -665,6 +777,8 @@ static MACHINE_CONFIG_START( mz3500, mz3500_state ) MCFG_QUANTUM_PERFECT_CPU("master") + MCFG_I8255A_ADD( "i8255", i8255_intf ) + MCFG_UPD765A_ADD("upd765a", true, true) MCFG_FLOPPY_DRIVE_ADD("upd765a:0", mz3500_floppies, "525hd", 0, floppy_image_device::default_floppy_formats) MCFG_FLOPPY_DRIVE_ADD("upd765a:1", mz3500_floppies, "525hd", 0, floppy_image_device::default_floppy_formats) @@ -688,8 +802,9 @@ static MACHINE_CONFIG_START( mz3500, mz3500_state ) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") -// MCFG_SOUND_ADD("aysnd", AY8910, MAIN_CLOCK/4) -// MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30) + + MCFG_SOUND_ADD(BEEPER_TAG, BEEP, 0) + MCFG_SOUND_ROUTE(ALL_OUTPUTS,"mono",0.15) MACHINE_CONFIG_END |