summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Sergey Svishchev <shattered@users.sourceforge.net>2014-10-26 22:06:33 +0300
committer Sergey Svishchev <shattered@users.sourceforge.net>2014-10-26 22:09:04 +0300
commitf6e07e235a5d9e64f41afe2d2a49c2c769338430 (patch)
tree3d89a17c933a33f618d90a007142607404f05a5d
parente8df241b7b5f8beb70d3fbe9afe4230bd7027598 (diff)
isa_hdc: implement WRITESBUFF command
-rw-r--r--src/emu/bus/isa/hdc.c57
-rw-r--r--src/emu/bus/isa/hdc.h2
2 files changed, 57 insertions, 2 deletions
diff --git a/src/emu/bus/isa/hdc.c b/src/emu/bus/isa/hdc.c
index 68fee6cce57..479c0fc3eec 100644
--- a/src/emu/bus/isa/hdc.c
+++ b/src/emu/bus/isa/hdc.c
@@ -426,6 +426,26 @@ void isa8_hdc_device::pc_hdc_dack_w(int data)
+void isa8_hdc_device::pc_hdc_dack_ws(int data)
+{
+ *(hdcdma_dst++) = data;
+
+ if( --hdcdma_write == 0 )
+ {
+ hdcdma_write = 512;
+ hdcdma_size -= 512;
+ hdcdma_dst = hdcdma_data;
+ }
+
+ if (!no_dma())
+ {
+ m_isa->drq3_w(hdcdma_size ? 1 : 0);
+ if(!hdcdma_size) pc_hdc_result(1);
+ }
+}
+
+
+
void isa8_hdc_device::execute_read()
{
hard_disk_file *disk = NULL;
@@ -485,6 +505,28 @@ void isa8_hdc_device::execute_write()
+void isa8_hdc_device::execute_writesbuff()
+{
+ hdcdma_dst = hdcdma_data;
+ hdcdma_write = 512;
+ hdcdma_size = 512;
+
+ if (no_dma())
+ {
+ do
+ {
+ pc_hdc_dack_ws(buffer[data_cnt++]);
+ }
+ while (hdcdma_write || hdcdma_size);
+ }
+ else
+ {
+ m_isa->drq3_w(1);
+ }
+}
+
+
+
void isa8_hdc_device::get_drive()
{
drv = (buffer[1] >> 5) & 1;
@@ -595,6 +637,15 @@ void isa8_hdc_device::hdc_command()
execute_write();
break;
+ case CMD_WRITESBUFF:
+ if (LOG_HDC_STATUS)
+ {
+ logerror("%s hdc write sector buffer\n", machine().describe_context());
+ }
+
+ execute_writesbuff();
+ break;
+
case CMD_SETPARAM:
get_chsn();
cylinders[drv] = ((buffer[6]&3)<<8) | buffer[7];
@@ -609,7 +660,6 @@ void isa8_hdc_device::hdc_command()
break;
case CMD_READSBUFF:
- case CMD_WRITESBUFF:
case CMD_RAMDIAG:
case CMD_INTERNDIAG:
break;
@@ -852,5 +902,8 @@ UINT8 isa8_hdc_device::dack_r(int line)
void isa8_hdc_device::dack_w(int line,UINT8 data)
{
- pc_hdc_dack_w(data);
+ if (buffer[0] == CMD_WRITESBUFF)
+ pc_hdc_dack_ws(data);
+ else
+ pc_hdc_dack_w(data);
}
diff --git a/src/emu/bus/isa/hdc.h b/src/emu/bus/isa/hdc.h
index 71ba0710c3b..7aadb51ea32 100644
--- a/src/emu/bus/isa/hdc.h
+++ b/src/emu/bus/isa/hdc.h
@@ -82,8 +82,10 @@ protected:
int get_lbasector();
int pc_hdc_dack_r();
void pc_hdc_dack_w(int data);
+ void pc_hdc_dack_ws(int data);
void execute_read();
void execute_write();
+ void execute_writesbuff();
void get_drive();
void get_chsn();
int test_ready();