isa_hdc: implement READSBUFF command (used by ec1841 diags)

This commit is contained in:
Sergey Svishchev 2016-08-14 01:33:23 +03:00
parent 75cbb7673e
commit 96d62922c8
2 changed files with 65 additions and 6 deletions

View File

@ -366,6 +366,32 @@ int xt_hdc_device::dack_r()
return result;
}
int xt_hdc_device::dack_rs()
{
UINT8 result;
logerror("%s dack_rs(%d %d)\n", machine().describe_context(), hdcdma_read, hdcdma_size);
if (hdcdma_read == 0)
{
hdcdma_read = 512;
hdcdma_size -= 512;
hdcdma_src = hdcdma_data;
}
result = *(hdcdma_src++);
hdcdma_read--;
if (!no_dma())
{
m_drq_handler((hdcdma_read) ? 1 : 0);
if(!(hdcdma_read)) pc_hdc_result(0);
}
return result;
}
void xt_hdc_device::dack_w(int data)
@ -441,7 +467,7 @@ void xt_hdc_device::execute_read()
if (!disk)
return;
status |= STA_READY; // ready to recieve data
status |= STA_READY; // ready to receive data
status &= ~STA_INPUT;
status &= ~STA_COMMAND;
@ -456,6 +482,23 @@ void xt_hdc_device::execute_read()
}
}
void xt_hdc_device::execute_readsbuff()
{
status |= STA_READY; // ready to receive data
status &= ~STA_INPUT;
status &= ~STA_COMMAND;
hdcdma_src = hdcdma_data;
hdcdma_read = 512;
hdcdma_size = 512;
if(!no_dma())
{
m_drq_handler(1);
if(!hdcdma_size) pc_hdc_result(0);
}
}
void xt_hdc_device::execute_write()
@ -471,7 +514,7 @@ void xt_hdc_device::execute_write()
if (!disk)
return;
status |= STA_READY; // ready to recieve data
status |= STA_READY; // ready to receive data
status |= STA_INPUT;
status &= ~STA_COMMAND;
@ -493,7 +536,7 @@ void xt_hdc_device::execute_writesbuff()
hdcdma_write = 512;
hdcdma_size = 512;
status |= STA_READY; // ready to recieve data
status |= STA_READY; // ready to receive data
status |= STA_INPUT;
status &= ~STA_COMMAND;
@ -606,6 +649,15 @@ void xt_hdc_device::command()
set_error_info = 0;
break;
case CMD_READSBUFF:
if (LOG_HDC_STATUS)
{
logerror("%s hdc read sector buffer\n", machine().describe_context());
}
execute_readsbuff();
break;
case CMD_WRITE:
case CMD_WRITELONG:
get_chsn();
@ -644,7 +696,6 @@ void xt_hdc_device::command()
if(no_dma()) pc_hdc_result(set_error_info);
break;
case CMD_READSBUFF:
case CMD_RAMDIAG:
case CMD_INTERNDIAG:
if(no_dma()) pc_hdc_result(set_error_info);
@ -826,7 +877,10 @@ UINT8 xt_hdc_device::data_r()
{
do
{
buffer[data_cnt++] = dack_r();
if (m_current_cmd == CMD_READSBUFF)
buffer[data_cnt++] = dack_rs();
else
buffer[data_cnt++] = dack_r();
} while (hdcdma_read);
data_cnt = 0;
}
@ -1002,7 +1056,10 @@ WRITE8_MEMBER( isa8_hdc_device::pc_hdc_w )
UINT8 isa8_hdc_device::dack_r(int line)
{
return m_hdc->dack_r();
if (m_hdc->get_command() == CMD_READSBUFF)
return m_hdc->dack_rs();
else
return m_hdc->dack_r();
}
void isa8_hdc_device::dack_w(int line,UINT8 data)

View File

@ -38,6 +38,7 @@ public:
template<class _Object> static devcb_base &set_drq_handler(device_t &device, _Object object) { return downcast<xt_hdc_device &>(device).m_drq_handler.set_callback(object); }
int dack_r();
int dack_rs();
void dack_w(int data);
void dack_ws(int data);
@ -62,6 +63,7 @@ protected:
int no_dma(void);
int get_lbasector();
void execute_read();
void execute_readsbuff();
void execute_write();
void execute_writesbuff();
void get_drive();