summaryrefslogtreecommitdiffstats
path: root/src/mame/machine/rx01.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/machine/rx01.cpp')
-rw-r--r--src/mame/machine/rx01.cpp143
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;
}
}