summaryrefslogtreecommitdiffstatshomepage
path: root/src/mess/machine/kaypro.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mess/machine/kaypro.c')
-rw-r--r--src/mess/machine/kaypro.c43
1 files changed, 27 insertions, 16 deletions
diff --git a/src/mess/machine/kaypro.c b/src/mess/machine/kaypro.c
index b427d37ff6a..a0d708fd3b7 100644
--- a/src/mess/machine/kaypro.c
+++ b/src/mess/machine/kaypro.c
@@ -13,11 +13,6 @@
************************************************************/
-WRITE_LINE_MEMBER(kaypro_state::kaypro_interrupt)
-{
- m_maincpu->set_input_line(0, state);
-}
-
WRITE_LINE_MEMBER( kaypro_state::write_centronics_busy )
{
m_centronics_busy = state;
@@ -48,6 +43,7 @@ WRITE8_MEMBER( kaypro_state::kayproii_pio_system_w )
membank("bankr0")->set_entry(BIT(data, 7));
membank("bank3")->set_entry(BIT(data, 7));
+ m_is_motor_off = BIT(data, 6);
m_floppy = NULL;
if (BIT(data, 0))
@@ -62,6 +58,7 @@ WRITE8_MEMBER( kaypro_state::kayproii_pio_system_w )
if (m_floppy)
{
m_floppy->mon_w(BIT(data, 6)); // motor on
+ m_floppy->ss_w(!BIT(data, 2)); // signal exists even though drives are single sided
}
output_set_value("ledA", BIT(data, 0)); /* LEDs in artwork */
@@ -107,6 +104,7 @@ WRITE8_MEMBER( kaypro_state::kaypro2x_system_port_w )
membank("bankr0")->set_entry(BIT(data, 7));
membank("bank3")->set_entry(BIT(data, 7));
+ m_is_motor_off = !BIT(data, 4);
m_floppy = NULL;
if (!BIT(data, 0))
@@ -116,7 +114,7 @@ WRITE8_MEMBER( kaypro_state::kaypro2x_system_port_w )
m_floppy = m_floppy1->get_device();
m_fdc->set_floppy(m_floppy);
- //m_fdc->dden_w(BIT(data, 5)); // not connected
+ m_fdc->dden_w(BIT(data, 5)); // not connected
if (m_floppy)
{
@@ -195,11 +193,29 @@ WRITE8_MEMBER(kaypro_state::kaypro_sio_w)
void kaypro_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
{
+ bool halt;
switch (id)
{
case TIMER_FLOPPY:
- if (m_maincpu->state_int(Z80_HALT))
+ halt = (bool)m_maincpu->state_int(Z80_HALT);
+ if (m_is_motor_off)
+ {
+ timer_set(attotime::from_hz(10), TIMER_FLOPPY);
+ break;
+ }
+ if ((halt) && (m_fdc_rq & 3) && (m_fdc_rq < 0x80))
+ {
m_maincpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE);
+ m_fdc_rq |= 0x80;
+ }
+ else
+ if ((m_fdc_rq == 0x80) || ((!halt) && BIT(m_fdc_rq, 7)))
+ {
+ m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE);
+ m_fdc_rq &= 0x7f;
+ }
+ timer_set(attotime::from_hz(1e5), TIMER_FLOPPY);
+
break;
default:
assert_always(FALSE, "Unknown id in kaypro_state::device_timer");
@@ -208,19 +224,12 @@ void kaypro_state::device_timer(emu_timer &timer, device_timer_id id, int param,
WRITE_LINE_MEMBER( kaypro_state::fdc_intrq_w )
{
- if (state)
- timer_set(attotime::zero, TIMER_FLOPPY);
- else
- m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE);
+ m_fdc_rq = (m_fdc_rq & 0x82) | state;
}
WRITE_LINE_MEMBER( kaypro_state::fdc_drq_w )
{
- if (state)
- timer_set(attotime::zero, TIMER_FLOPPY);
- else
- m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE);
-
+ m_fdc_rq = (m_fdc_rq & 0x81) | (state << 1);
}
@@ -241,7 +250,9 @@ MACHINE_RESET_MEMBER( kaypro_state,kaypro )
membank("bankw0")->set_entry(0); // always write to ram
membank("bank3")->set_entry(1); // point at video ram
m_system_port = 0x80;
+ m_fdc_rq = 0;
m_maincpu->reset();
+ timer_set(attotime::from_hz(1), TIMER_FLOPPY); /* timer for rtc */
}