summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author ajrhacker <ajrhacker@users.noreply.github.com>2017-06-06 19:45:09 -0400
committer GitHub <noreply@github.com>2017-06-06 19:45:09 -0400
commit7af77a077b9d4016bf1453265fea643c2670615b (patch)
tree774184898fa6dedf82edd01adef8cb357e96da6e
parent450a241329dad775ada27052401605f80967c505 (diff)
parentd8526dbfde772cde943ebd666034afbf70c733ca (diff)
Merge pull request #2369 from bmunger/r9751
r9751: Add more SMIOC registers
-rw-r--r--src/mame/drivers/r9751.cpp38
1 files changed, 27 insertions, 11 deletions
diff --git a/src/mame/drivers/r9751.cpp b/src/mame/drivers/r9751.cpp
index 45e4d2a03df..bb98ef3e6b4 100644
--- a/src/mame/drivers/r9751.cpp
+++ b/src/mame/drivers/r9751.cpp
@@ -114,8 +114,10 @@ private:
uint32_t fdd_dest_address; // 5FF080B0
uint32_t fdd_cmd_complete;
uint32_t smioc_out_addr;
+ uint32_t smioc_in_addr;
uint32_t smioc_dma_bank;
- uint32_t smioc_dma_length;
+ uint32_t smioc_dma_w_length;
+ uint32_t smioc_dma_r_length;
uint32_t fdd_dma_bank;
attotime timer_32khz_last;
uint8_t m_term_data;
@@ -184,7 +186,7 @@ DRIVER_INIT_MEMBER(r9751_state,r9751)
fdd_dma_bank = 0;
smioc_out_addr = 0;
smioc_dma_bank = 0;
- smioc_dma_length = 0;
+ smioc_dma_w_length = 0;
m_mem = &m_maincpu->space(AS_PROGRAM);
@@ -250,7 +252,7 @@ READ32_MEMBER( r9751_state::r9751_mmio_5ff_r )
if(TRACE_FDC && data != 0) logerror("--- SCSI FDD command completion status - Read: %08X, From: %08X, Register: %08X\n", data, space.machine().firstcpu->pc(), offset << 2 | 0x5FF00000);
return data;
default:
- if(TRACE_FDC || TRACE_HDC || TRACE_SMIOC) logerror("Instruction: %08x READ MMIO(%08x): %08x & %08x\n", space.machine().firstcpu->pc(), offset << 2 | 0x5FF00000, 0, mem_mask);
+ if(TRACE_FDC || TRACE_HDC || TRACE_SMIOC) logerror("Unknown read address: %08X PC: %08X\n", offset << 2 | 0x5FF00000, space.machine().firstcpu->pc());
return 0;
}
}
@@ -281,21 +283,26 @@ WRITE32_MEMBER( r9751_state::r9751_mmio_5ff_w )
case 0xC024: /* HDD SCSI read command */
if(TRACE_HDC) logerror("@@@ HDD Command: %08X, From: %08X, Register: %08X\n", data, space.machine().firstcpu->pc(), offset << 2 | 0x5FF00000);
break;
- /* SMIOC region (0x98, device 26) */
+ /* SMIOC region (0x98, device 26) - Output */
case 0x0298:
m_serial_status = data;
+ if(TRACE_SMIOC) logerror("Serial status: %08X PC: %08X\n", data, space.machine().firstcpu->pc());
break;
case 0x4098: /* Serial DMA Command */
m_serial_status = 0x40;
switch(data)
{
case 0x4100: /* Send byte to serial */
- for(int i = 0; i < smioc_dma_length; i++)
+ for(int i = 0; i < smioc_dma_w_length; i++)
{
if(TRACE_SMIOC) logerror("Serial byte: %02X PC: %08X\n", m_mem->read_dword(smioc_out_addr+i*2), space.machine().firstcpu->pc());
m_terminal->write(space,0,m_mem->read_dword(smioc_out_addr+i*2));
}
break;
+ case 0x4200: /* Write XON into serial DMA input register (0x5FF0809C) memory location */
+ m_maincpu->space(AS_PROGRAM).write_byte(smioc_in_addr,0x11);
+ if(TRACE_SMIOC) logerror("Serial DMA command 0x4200 (XON) PC: %08X\n", space.machine().firstcpu->pc());
+ break;
default:
if(TRACE_SMIOC) logerror("Unknown serial DMA command: %X\n", data);
}
@@ -305,11 +312,20 @@ WRITE32_MEMBER( r9751_state::r9751_mmio_5ff_w )
smioc_out_addr = (smioc_dma_bank & 0x7FFFF800) | ((data&0x3FF)<<1);
if(TRACE_SMIOC) logerror("Serial output address: %08X PC: %08X\n", smioc_out_addr, space.machine().firstcpu->pc());
break;
- /* SMIOC region (0x9C, device 27) */
- case 0x409C: /* Serial DMA length */
- smioc_dma_length = (~data+1) & 0xFFFF;
- if(TRACE_SMIOC) logerror("Serial DMA length: %08X PC: %08X\n", smioc_dma_length, space.machine().firstcpu->pc());
- if(smioc_dma_length > 0x400) smioc_dma_length = 0x400;
+ /* SMIOC region (0x9C, device 27) - Input */
+ case 0x409C: /* Serial DMA write length */
+ smioc_dma_w_length = (~data+1) & 0xFFFF;
+ if(TRACE_SMIOC) logerror("Serial DMA write length: %08X PC: %08X\n", smioc_dma_w_length, space.machine().firstcpu->pc());
+ if(smioc_dma_w_length > 0x400) smioc_dma_w_length = 0x400;
+ break;
+ case 0x809C: /* Serial DMA input address */
+ smioc_in_addr = (smioc_dma_bank & 0x7FFFF800) | ((data&0x3FF)<<1);
+ if(TRACE_SMIOC) logerror("Serial input address: %08X PC: %08X\n", smioc_out_addr, space.machine().firstcpu->pc());
+ break;
+ case 0xC09C: /* Serial DMA read length */
+ smioc_dma_r_length = (~data+1) & 0xFFFF;
+ if(TRACE_SMIOC) logerror("Serial DMA read length: %08X PC: %08X\n", smioc_dma_r_length, space.machine().firstcpu->pc());
+ if(smioc_dma_r_length > 0x400) smioc_dma_r_length = 0x400;
break;
/* PDC FDD region (0xB0, device 44 */
case 0x01B0: /* FDD SCSI read command */
@@ -387,7 +403,7 @@ WRITE32_MEMBER( r9751_state::r9751_mmio_5ff_w )
break;
default:
- if(TRACE_FDC || TRACE_HDC || TRACE_SMIOC) logerror("Instruction: %08x WRITE MMIO(%08x): %08x & %08x (A6+4): %08X\n", space.machine().firstcpu->pc(), offset << 2 | 0x5FF00000, data, mem_mask, debug_a6());
+ if(TRACE_FDC || TRACE_HDC || TRACE_SMIOC) logerror("Unknown write address: %08X Data: %08X PC: %08X\n", offset << 2 | 0x5FF00000, data, space.machine().firstcpu->pc());
}
}