diff options
Diffstat (limited to 'src/mame/machine/rx01.cpp')
-rw-r--r-- | src/mame/machine/rx01.cpp | 143 |
1 files changed, 78 insertions, 65 deletions
diff --git a/src/mame/machine/rx01.cpp b/src/mame/machine/rx01.cpp index 48497995804..d791bd0fb80 100644 --- a/src/mame/machine/rx01.cpp +++ b/src/mame/machine/rx01.cpp @@ -81,6 +81,7 @@ void rx01_device::device_add_mconfig(machine_config &config) void rx01_device::device_start() { + m_command_timer = timer_alloc(FUNC(rx01_device::service_command), this); } @@ -90,7 +91,9 @@ void rx01_device::device_start() void rx01_device::device_reset() { - for(auto & elem : m_image) + m_command_timer->adjust(attotime::never); + + for (auto & elem : m_image) { elem->floppy_mon_w(0); // turn it on elem->floppy_drive_set_controller(this); @@ -107,7 +110,8 @@ void rx01_device::device_reset() uint16_t rx01_device::read(offs_t offset) { - switch(offset & 1) { + switch (offset & 1) + { case 0: return status_read(); default: return data_read(); } @@ -121,7 +125,8 @@ uint16_t rx01_device::read(offs_t offset) void rx01_device::write(offs_t offset, uint16_t data) { - switch(offset & 1) { + switch (offset & 1) + { case 0: command_write(data); break; case 1: data_write(data); break; } @@ -130,50 +135,51 @@ void rx01_device::write(offs_t offset, uint16_t data) void rx01_device::command_write(uint16_t data) { printf("command_write %04x\n",data); - m_unit = BIT(data,4); - m_interrupt = BIT(data,6); + m_unit = BIT(data, 4); + m_interrupt = BIT(data, 6); - m_image[m_unit]->floppy_drive_set_ready_state(1,0); + m_image[m_unit]->floppy_drive_set_ready_state(1, 0); - if (BIT(data,14)) // Initialize + if (BIT(data, 14)) // Initialize { printf("initialize\n"); m_state = RX01_INIT; } else if (BIT(data,1)) // If GO bit is selected { - m_rxcs &= ~(1<<5); // Clear done bit + m_rxcs &= ~(1 << 5); // Clear done bit m_buf_pos = 0; // Point to start of buffer - switch((data >> 1) & 7) { + switch ((data >> 1) & 7) + { case 0: // Fill Buffer - m_rxcs |= (1<<7); // Set TR Bit - m_state = RX01_FILL; - break; + m_rxcs |= (1 << 7); // Set TR Bit + m_state = RX01_FILL; + break; case 1: // Empty Buffer - m_state = RX01_EMPTY; - break; + m_state = RX01_EMPTY; + break; case 2: // Write Sector case 3: // Read Sector case 6: // Write Deleted Data Sector - m_rxes &= ~(1<<6 | 1<<1 | 1<<0);// Reset bits 0, 1 and 6 - m_state = RX01_SET_SECTOR; - break; + m_rxes &= ~(1 << 6 | 1 << 1 | 1 << 0);// Reset bits 0, 1 and 6 + m_state = RX01_SET_SECTOR; + break; case 4: // Not Used - m_state = RX01_COMPLETE; - break; + m_state = RX01_COMPLETE; + break; case 5: // Read Status - m_state = RX01_COMPLETE; - m_rxdb = m_rxes; - break; + m_state = RX01_COMPLETE; + m_rxdb = m_rxes; + break; case 7: // Read Error Register - m_state = RX01_COMPLETE; - // set ready signal according to current drive status - m_rxes |= m_image[m_unit]->floppy_drive_get_flag_state(FLOPPY_DRIVE_READY) << 7; - break; + m_state = RX01_COMPLETE; + // set ready signal according to current drive status + m_rxes |= m_image[m_unit]->floppy_drive_get_flag_state(FLOPPY_DRIVE_READY) << 7; + break; } } - machine().scheduler().timer_set(attotime::from_msec(100), timer_expired_delegate(FUNC(rx01_device::service_command),this)); + m_command_timer->adjust(attotime::from_msec(100)); } uint16_t rx01_device::status_read() @@ -186,13 +192,15 @@ void rx01_device::data_write(uint16_t data) { // printf("data_write %04x\n",data); // data can be written only if TR is set - if (BIT(m_rxcs,7)) m_rxdb = data; - machine().scheduler().timer_set(attotime::from_msec(100), timer_expired_delegate(FUNC(rx01_device::service_command),this)); + if (BIT(m_rxcs,7)) + m_rxdb = data; + machine().scheduler().timer_set(attotime::from_msec(100), timer_expired_delegate(FUNC(rx01_device::service_command), this)); } uint16_t rx01_device::data_read() { - if (m_state==RX01_EMPTY && BIT(m_rxcs,7)) m_rxcs &= (1<<7); // clear TR bit; + if (m_state == RX01_EMPTY && BIT(m_rxcs, 7)) + m_rxcs &= (1 << 7); // clear TR bit; // printf("data_read %04x\n",m_rxdb); return m_rxdb; } @@ -201,46 +209,51 @@ TIMER_CALLBACK_MEMBER(rx01_device::service_command) { printf("service_command %d\n",m_state); m_rxes |= m_image[m_unit]->floppy_drive_get_flag_state(FLOPPY_DRIVE_READY) << 7; - switch(m_state) { - case RX01_FILL : - m_buffer[m_buf_pos] = m_rxdb & 0xff; - m_buf_pos++; - if (m_buf_pos<128) - { - m_rxcs |= (1<<7); // Set TR Bit - } else { - //finished - } - break; - case RX01_EMPTY : - if (m_buf_pos>=128) - { - //finished - } else { - m_buffer[m_buf_pos] = m_rxdb & 0xff; - m_buf_pos++; - m_rxcs |= (1<<7); // Set TR Bit - } - break; + switch (m_state) + { + case RX01_FILL: + m_buffer[m_buf_pos] = m_rxdb & 0xff; + m_buf_pos++; + if (m_buf_pos < 128) + { + m_rxcs |= (1 << 7); // Set TR Bit + } + else + { + //finished + } + break; + case RX01_EMPTY: + if (m_buf_pos >= 128) + { + //finished + } + else + { + m_buffer[m_buf_pos] = m_rxdb & 0xff; + m_buf_pos++; + m_rxcs |= (1 << 7); // Set TR Bit + } + break; case RX01_SET_SECTOR: - m_rxsa = m_rxdb & 0x1f; - m_rxcs |= (1<<7); // Set TR Bit - m_state = RX01_SET_TRACK; - break; + m_rxsa = m_rxdb & 0x1f; + m_rxcs |= (1 << 7); // Set TR Bit + m_state = RX01_SET_TRACK; + break; case RX01_SET_TRACK: - m_rxta = m_rxdb & 0x7f; - m_rxcs |= (1<<7); // Set TR Bit - m_state = RX01_TRANSFER; - position_head(); - break; + m_rxta = m_rxdb & 0x7f; + m_rxcs |= (1 << 7); // Set TR Bit + m_state = RX01_TRANSFER; + position_head(); + break; case RX01_TRANSFER: - break; + break; case RX01_COMPLETE: - break; + break; case RX01_INIT: - m_rxes |= (1<<2); // Set init done flag - m_rxcs |= (1<<5); // Set operation done - break; + m_rxes |= (1 << 2); // Set init done flag + m_rxcs |= (1 << 5); // Set operation done + break; } } |