diff options
Diffstat (limited to 'src/mame/drivers/alphatpc16.cpp')
-rw-r--r-- | src/mame/drivers/alphatpc16.cpp | 40 |
1 files changed, 37 insertions, 3 deletions
diff --git a/src/mame/drivers/alphatpc16.cpp b/src/mame/drivers/alphatpc16.cpp index 9818b224a81..d7dc9d1b14b 100644 --- a/src/mame/drivers/alphatpc16.cpp +++ b/src/mame/drivers/alphatpc16.cpp @@ -74,6 +74,7 @@ public: m_wdfdc(*this, "wdfdc"), m_ram(*this, RAM_TAG), m_z80(*this, "z80"), + m_flop0(*this, "wdfdc:0"), m_keys(*this, "KEYS.%u", 0) { } @@ -97,6 +98,8 @@ private: DECLARE_WRITE8_MEMBER(host_scsi_w); DECLARE_READ8_MEMBER(flop_scsi_r); DECLARE_WRITE8_MEMBER(flop_scsi_w); + DECLARE_READ8_MEMBER(p00_r); + DECLARE_WRITE8_MEMBER(p40_w); required_device<cpu_device> m_maincpu; required_device<pic8259_device> m_pic8259; @@ -105,15 +108,17 @@ private: required_device<wd1770_device> m_wdfdc; required_device<ram_device> m_ram; required_device<cpu_device> m_z80; + required_device<floppy_connector> m_flop0; required_ioport_array<7> m_keys; - u8 m_p1, m_p2, m_data; + u8 m_p1, m_p2, m_data, m_p40; bool m_bsy, m_req, m_ack, m_cd, m_io, m_sel; }; void alphatpc16_state::machine_start() { m_maincpu->space(AS_PROGRAM).install_ram(0, m_ram->size() - 1, m_ram->pointer()); + m_wdfdc->set_floppy(m_flop0->get_device()); } WRITE8_MEMBER(alphatpc16_state::p1_w) @@ -143,21 +148,36 @@ READ8_MEMBER(alphatpc16_state::p2_r) return (m_p2 | 0x40) & ~(key ? (m_p1 < 0x40 ? 2 : 1) : 0); } +READ8_MEMBER(alphatpc16_state::p00_r) +{ + return (m_flop0->get_device()->exists() << 3); +} + +WRITE8_MEMBER(alphatpc16_state::p40_w) +{ + m_flop0->get_device()->ss_w(BIT(data, 2)); + m_p40 = data; +} + +// this scsi emulation is an unrealistic mess WRITE8_MEMBER(alphatpc16_state::host_scsi_w) { switch(offset) { case 0: m_ack = true; + m_req = false; m_sel = false; m_data = data; m_z80->set_input_line(INPUT_LINE_NMI, CLEAR_LINE); + m_z80->set_input_line(Z80_INPUT_LINE_WAIT, CLEAR_LINE); break; case 2: m_ack = false; m_sel = true; m_data = data; m_z80->set_input_line(INPUT_LINE_NMI, ASSERT_LINE); + m_z80->set_input_line(Z80_INPUT_LINE_WAIT, CLEAR_LINE); break; case 3: //rst ? if(data) @@ -169,6 +189,7 @@ WRITE8_MEMBER(alphatpc16_state::host_scsi_w) m_cd = false; m_io = false; } + m_z80->set_input_line(Z80_INPUT_LINE_WAIT, CLEAR_LINE); break; } logerror("%s, data %x bsy %d sel %d req %d ack %d cd %d io %d\n", machine().describe_context(), m_data, m_bsy, m_sel, m_req, m_ack, m_cd, m_io); @@ -180,9 +201,15 @@ READ8_MEMBER(alphatpc16_state::host_scsi_r) switch(offset) { case 0: + if(!m_req && (m_maincpu->state_int(I8086_IP) == 0x2f46)) + { + m_maincpu->set_state_int(I8086_IP, m_maincpu->state_int(I8086_IP) - 2); + break; + } m_ack = true; m_req = false; ret = m_data; + m_z80->set_input_line(Z80_INPUT_LINE_WAIT, CLEAR_LINE); logerror("%s, data %x bsy %d sel %d req %d ack %d cd %d io %d\n", machine().describe_context(), m_data, m_bsy, m_sel, m_req, m_ack, m_cd, m_io); break; case 1: @@ -197,6 +224,8 @@ WRITE8_MEMBER(alphatpc16_state::flop_scsi_w) switch(offset) { case 0: + if(m_z80->state_int(STATE_GENPC) == 0xcd) + m_z80->set_input_line(Z80_INPUT_LINE_WAIT, ASSERT_LINE); m_req = true; m_ack = false; m_data = data; @@ -216,6 +245,8 @@ READ8_MEMBER(alphatpc16_state::flop_scsi_r) switch(offset) { case 0: + if(m_z80->state_int(STATE_GENPC) == 0xbc) + m_z80->set_input_line(Z80_INPUT_LINE_WAIT, ASSERT_LINE); m_ack = false; m_req = false; ret = m_data; @@ -252,8 +283,10 @@ void alphatpc16_state::apc16_z80_map(address_map &map) void alphatpc16_state::apc16_z80_io(address_map &map) { map.global_mask(0xff); + map(0x00, 0x00).r(FUNC(alphatpc16_state::p00_r)); map(0x20, 0x23).rw(m_wdfdc, FUNC(wd1770_device::read), FUNC(wd1770_device::write)); - map(0x62, 0x63) .rw(FUNC(alphatpc16_state::flop_scsi_r), FUNC(alphatpc16_state::flop_scsi_w)); + map(0x40, 0x40).w(FUNC(alphatpc16_state::p40_w)); + map(0x62, 0x63).rw(FUNC(alphatpc16_state::flop_scsi_r), FUNC(alphatpc16_state::flop_scsi_w)); } // not sure the actual layout of the rows @@ -387,7 +420,8 @@ void alphatpc16_state::alphatpc16(machine_config &config) m_z80->set_addrmap(AS_PROGRAM, &alphatpc16_state::apc16_z80_map); m_z80->set_addrmap(AS_IO, &alphatpc16_state::apc16_z80_io); WD1770(config, m_wdfdc, 8_MHz_XTAL); - FLOPPY_CONNECTOR(config, "wdfdc:0", atpc16_floppies, "525dd", floppy_image_device::default_floppy_formats); + FLOPPY_CONNECTOR(config, m_flop0, atpc16_floppies, "525dd", floppy_image_device::default_floppy_formats); + dynamic_cast<device_slot_interface *>(m_flop0.target())->set_fixed(true); i8741a_device& i8741(I8741A(config, "i8741", 4.608_MHz_XTAL)); i8741.p1_in_cb().set(FUNC(alphatpc16_state::p1_r)); |