mirror of
https://github.com/holub/mame
synced 2025-07-05 18:08:04 +03:00
alphatpc16: ugly floppy hacks (nw)
This commit is contained in:
parent
953ce07fda
commit
bd0deb08f8
@ -74,6 +74,7 @@ public:
|
|||||||
m_wdfdc(*this, "wdfdc"),
|
m_wdfdc(*this, "wdfdc"),
|
||||||
m_ram(*this, RAM_TAG),
|
m_ram(*this, RAM_TAG),
|
||||||
m_z80(*this, "z80"),
|
m_z80(*this, "z80"),
|
||||||
|
m_flop0(*this, "wdfdc:0"),
|
||||||
m_keys(*this, "KEYS.%u", 0)
|
m_keys(*this, "KEYS.%u", 0)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
@ -97,6 +98,8 @@ private:
|
|||||||
DECLARE_WRITE8_MEMBER(host_scsi_w);
|
DECLARE_WRITE8_MEMBER(host_scsi_w);
|
||||||
DECLARE_READ8_MEMBER(flop_scsi_r);
|
DECLARE_READ8_MEMBER(flop_scsi_r);
|
||||||
DECLARE_WRITE8_MEMBER(flop_scsi_w);
|
DECLARE_WRITE8_MEMBER(flop_scsi_w);
|
||||||
|
DECLARE_READ8_MEMBER(p00_r);
|
||||||
|
DECLARE_WRITE8_MEMBER(p40_w);
|
||||||
|
|
||||||
required_device<cpu_device> m_maincpu;
|
required_device<cpu_device> m_maincpu;
|
||||||
required_device<pic8259_device> m_pic8259;
|
required_device<pic8259_device> m_pic8259;
|
||||||
@ -105,15 +108,17 @@ private:
|
|||||||
required_device<wd1770_device> m_wdfdc;
|
required_device<wd1770_device> m_wdfdc;
|
||||||
required_device<ram_device> m_ram;
|
required_device<ram_device> m_ram;
|
||||||
required_device<cpu_device> m_z80;
|
required_device<cpu_device> m_z80;
|
||||||
|
required_device<floppy_connector> m_flop0;
|
||||||
required_ioport_array<7> m_keys;
|
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;
|
bool m_bsy, m_req, m_ack, m_cd, m_io, m_sel;
|
||||||
};
|
};
|
||||||
|
|
||||||
void alphatpc16_state::machine_start()
|
void alphatpc16_state::machine_start()
|
||||||
{
|
{
|
||||||
m_maincpu->space(AS_PROGRAM).install_ram(0, m_ram->size() - 1, m_ram->pointer());
|
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)
|
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);
|
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)
|
WRITE8_MEMBER(alphatpc16_state::host_scsi_w)
|
||||||
{
|
{
|
||||||
switch(offset)
|
switch(offset)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
m_ack = true;
|
m_ack = true;
|
||||||
|
m_req = false;
|
||||||
m_sel = false;
|
m_sel = false;
|
||||||
m_data = data;
|
m_data = data;
|
||||||
m_z80->set_input_line(INPUT_LINE_NMI, CLEAR_LINE);
|
m_z80->set_input_line(INPUT_LINE_NMI, CLEAR_LINE);
|
||||||
|
m_z80->set_input_line(Z80_INPUT_LINE_WAIT, CLEAR_LINE);
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
m_ack = false;
|
m_ack = false;
|
||||||
m_sel = true;
|
m_sel = true;
|
||||||
m_data = data;
|
m_data = data;
|
||||||
m_z80->set_input_line(INPUT_LINE_NMI, ASSERT_LINE);
|
m_z80->set_input_line(INPUT_LINE_NMI, ASSERT_LINE);
|
||||||
|
m_z80->set_input_line(Z80_INPUT_LINE_WAIT, CLEAR_LINE);
|
||||||
break;
|
break;
|
||||||
case 3: //rst ?
|
case 3: //rst ?
|
||||||
if(data)
|
if(data)
|
||||||
@ -169,6 +189,7 @@ WRITE8_MEMBER(alphatpc16_state::host_scsi_w)
|
|||||||
m_cd = false;
|
m_cd = false;
|
||||||
m_io = false;
|
m_io = false;
|
||||||
}
|
}
|
||||||
|
m_z80->set_input_line(Z80_INPUT_LINE_WAIT, CLEAR_LINE);
|
||||||
break;
|
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);
|
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)
|
switch(offset)
|
||||||
{
|
{
|
||||||
case 0:
|
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_ack = true;
|
||||||
m_req = false;
|
m_req = false;
|
||||||
ret = m_data;
|
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);
|
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;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
@ -197,6 +224,8 @@ WRITE8_MEMBER(alphatpc16_state::flop_scsi_w)
|
|||||||
switch(offset)
|
switch(offset)
|
||||||
{
|
{
|
||||||
case 0:
|
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_req = true;
|
||||||
m_ack = false;
|
m_ack = false;
|
||||||
m_data = data;
|
m_data = data;
|
||||||
@ -216,6 +245,8 @@ READ8_MEMBER(alphatpc16_state::flop_scsi_r)
|
|||||||
switch(offset)
|
switch(offset)
|
||||||
{
|
{
|
||||||
case 0:
|
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_ack = false;
|
||||||
m_req = false;
|
m_req = false;
|
||||||
ret = m_data;
|
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)
|
void alphatpc16_state::apc16_z80_io(address_map &map)
|
||||||
{
|
{
|
||||||
map.global_mask(0xff);
|
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(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
|
// 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_PROGRAM, &alphatpc16_state::apc16_z80_map);
|
||||||
m_z80->set_addrmap(AS_IO, &alphatpc16_state::apc16_z80_io);
|
m_z80->set_addrmap(AS_IO, &alphatpc16_state::apc16_z80_io);
|
||||||
WD1770(config, m_wdfdc, 8_MHz_XTAL);
|
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));
|
i8741a_device& i8741(I8741A(config, "i8741", 4.608_MHz_XTAL));
|
||||||
i8741.p1_in_cb().set(FUNC(alphatpc16_state::p1_r));
|
i8741.p1_in_cb().set(FUNC(alphatpc16_state::p1_r));
|
||||||
|
Loading…
Reference in New Issue
Block a user