mirror of
https://github.com/holub/mame
synced 2025-06-15 08:57:05 +03:00
wd1010: expand head selection
This commit is contained in:
parent
1c5d6a87e6
commit
3d79c5d831
@ -170,6 +170,7 @@ WRITE_LINE_MEMBER( apricot_winchester_device::head_w )
|
|||||||
{
|
{
|
||||||
m_head = (m_head & ~(1 << N)) | (state << N);
|
m_head = (m_head & ~(1 << N)) | (state << N);
|
||||||
LOGREGS("Select head: %d\n", m_head);
|
LOGREGS("Select head: %d\n", m_head);
|
||||||
|
m_hdc->head_w(m_head);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<int N>
|
template<int N>
|
||||||
|
@ -112,6 +112,7 @@ void wd1010_device::device_start()
|
|||||||
save_item(NAME(m_cylinder));
|
save_item(NAME(m_cylinder));
|
||||||
save_item(NAME(m_sdh));
|
save_item(NAME(m_sdh));
|
||||||
save_item(NAME(m_status));
|
save_item(NAME(m_status));
|
||||||
|
save_item(NAME(m_head));
|
||||||
}
|
}
|
||||||
|
|
||||||
//-------------------------------------------------
|
//-------------------------------------------------
|
||||||
@ -332,6 +333,14 @@ void wd1010_device::brdy_w(int state)
|
|||||||
m_brdy = state;
|
m_brdy = state;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void wd1010_device::sc_w(int state)
|
||||||
|
{
|
||||||
|
if (state)
|
||||||
|
m_status |= STATUS_SC;
|
||||||
|
else
|
||||||
|
m_status &= ~STATUS_SC;
|
||||||
|
}
|
||||||
|
|
||||||
int wd1010_device::sc_r()
|
int wd1010_device::sc_r()
|
||||||
{
|
{
|
||||||
return m_status & STATUS_SC ? 1 : 0;
|
return m_status & STATUS_SC ? 1 : 0;
|
||||||
|
@ -40,11 +40,16 @@ public:
|
|||||||
|
|
||||||
void drdy_w(int state);
|
void drdy_w(int state);
|
||||||
void brdy_w(int state);
|
void brdy_w(int state);
|
||||||
|
void sc_w(int state);
|
||||||
|
|
||||||
// actually inputs to the controller from the drive
|
// actually inputs to the controller from the drive
|
||||||
int sc_r();
|
int sc_r();
|
||||||
int tk000_r();
|
int tk000_r();
|
||||||
|
|
||||||
|
// HACK: head selection is not actually controlled by the wd1010, but this emulation currently
|
||||||
|
// works as if it does; this function allows heads beyond the 3-bit range of the sdh register.
|
||||||
|
void head_w(uint8_t head) { m_head = head; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// device-level overrides
|
// device-level overrides
|
||||||
virtual void device_start() override;
|
virtual void device_start() override;
|
||||||
@ -102,7 +107,7 @@ private:
|
|||||||
int get_lbasector();
|
int get_lbasector();
|
||||||
|
|
||||||
// extract values from sdh
|
// extract values from sdh
|
||||||
int head() { return (m_sdh >> 0) & 0x07; }
|
int head() { return m_head; }
|
||||||
int drive() { return (m_sdh >> 3) & 0x03; }
|
int drive() { return (m_sdh >> 3) & 0x03; }
|
||||||
int sector_size()
|
int sector_size()
|
||||||
{
|
{
|
||||||
@ -151,6 +156,7 @@ private:
|
|||||||
uint16_t m_cylinder;
|
uint16_t m_cylinder;
|
||||||
uint8_t m_sdh;
|
uint8_t m_sdh;
|
||||||
uint8_t m_status;
|
uint8_t m_status;
|
||||||
|
uint8_t m_head;
|
||||||
};
|
};
|
||||||
|
|
||||||
// device type definition
|
// device type definition
|
||||||
|
@ -260,7 +260,8 @@ void unixpc_state::disk_control_w(uint8_t data)
|
|||||||
{
|
{
|
||||||
logerror("disk_control_w: %02x\n", data);
|
logerror("disk_control_w: %02x\n", data);
|
||||||
|
|
||||||
// TODO: bits 0-2 = head select
|
// bits 0-2 = head select
|
||||||
|
m_hdc->head_w(BIT(data, 0, 2));
|
||||||
|
|
||||||
m_hdc->drdy_w(BIT(data, 3) && m_hdr0->exists());
|
m_hdc->drdy_w(BIT(data, 3) && m_hdr0->exists());
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user