diff options
| author | 2015-07-13 20:39:55 +0200 | |
|---|---|---|
| committer | 2015-07-13 20:39:55 +0200 | |
| commit | f5ef11f31a1d4c9803f50ec7d8e8c2753118be37 (patch) | |
| tree | ca964caf0ff75e0dc5ef503db0525624d5335bd0 | |
| parent | 8a7559a8068a5ba2a835343adab8ade91cd48180 (diff) | |
Let's rework CD DMA-ing a little
| -rw-r--r-- | src/emu/machine/segacdblock.c | 117 | ||||
| -rw-r--r-- | src/emu/machine/segacdblock.h | 21 |
2 files changed, 63 insertions, 75 deletions
diff --git a/src/emu/machine/segacdblock.c b/src/emu/machine/segacdblock.c index 4f25dde036c..c56076aabe3 100644 --- a/src/emu/machine/segacdblock.c +++ b/src/emu/machine/segacdblock.c @@ -10,6 +10,7 @@ Template for skeleton device 33cc open, nodisc, fatal -> r0 ***************************************************************************/ + #include "emu.h" #include "machine/segacdblock.h" #include "debugger.h" @@ -135,24 +136,18 @@ READ16_MEMBER(segacdblock_device::datatrns_r) res = 0xffff; - switch(xfertype) + if(xfertype == CDDMA_INPROGRESS) { - case XFERTYPE_TOC: - res = tocbuf[m_dma_src]<<8 | tocbuf[m_dma_src+1]; - m_dma_src += 2; - - //printf("%04x\n",res); - - if (m_dma_src > m_dma_size) - { - m_dma_src = 0; - xfertype = XFERTYPE_INVALID; - } - break; - default: - debugger_break(machine()); - break; + res = m_DMABuffer[m_dma_src]<<8 | m_DMABuffer[m_dma_src+1]; // @todo Make this 16-bits + m_dma_src += 2; + if(m_dma_src > m_dma_size) + { + m_dma_src = 0; + xfertype = CDDMA_STOPPED; + } } + else + debugger_break(machine()); return res; } @@ -225,6 +220,10 @@ void segacdblock_device::device_validity_check(validity_checker &valid) const void segacdblock_device::SH1CommandExecute() { + if(m_cr[0] != 0) + printf("CD CMD: %04x %04x %04x %04x\n",m_cr[0],m_cr[1],m_cr[2],m_cr[3]); + + switch(m_cr[0] >> 8) { case 0x00: cd_cmd_status(); break; @@ -284,7 +283,9 @@ void segacdblock_device::cd_cmd_get_toc() m_dr[1] = 102*2; m_dr[2] = 0; m_dr[3] = 0; - m_TOCPhase = true; + m_dma_src = 0; + m_dma_size = 0; + sourcetype = SOURCE_TOC; //set_flag(DRDY); // ... set_flag(CMOK); } @@ -390,7 +391,8 @@ void segacdblock_device::cd_cmd_abort() set_flag(EFLS); // ... - xfertype = XFERTYPE_INVALID; + xfertype = CDDMA_STOPPED; + sourcetype = SOURCE_NONE; m_dma_size = 0; set_flag(CMOK); } @@ -433,13 +435,13 @@ void segacdblock_device::cd_cmd_device_auth_status(UINT16 AuthType) set_flag(CMOK); } -void segacdblock_device::sh1_TOCRetrieve() +void segacdblock_device::TOCRetrieve() { int i, ntrks, tocptr, fad; //xfertype = XFERTYPE_TOC; - m_dma_src = 0; - m_dma_size = 102*4; + //m_dma_src = 0; + //m_dma_size = 102*4; if (cdrom) ntrks = cdrom_get_last_track(cdrom); @@ -515,9 +517,9 @@ void segacdblock_device::sh1_TOCRetrieve() tocbuf[tocptr+10] = (fad>>8)&0xff; tocbuf[tocptr+11] = fad&0xff; - xfertype = XFERTYPE_TOC; - m_TOCPhase = false; - set_flag(DRDY); +// xfertype = XFERTYPE_TOC; +// m_TOCPhase = false; +// set_flag(DRDY); } void segacdblock_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) @@ -528,8 +530,18 @@ void segacdblock_device::device_timer(emu_timer &timer, device_timer_id id, int SH1CommandExecute(); else if(id == PERI_TIMER) { - if(m_TOCPhase == true) - sh1_TOCRetrieve(); + if(sourcetype == SOURCE_TOC) + { + /*! + @todo DMA timing into account ... + */ + memcpy(m_DMABuffer,tocbuf,102*4); + m_dma_size = 102*4; + m_dma_src = 0; + xfertype = CDDMA_INPROGRESS; + set_flag(DRDY); + sourcetype = SOURCE_NONE; + } if(m_isDiscInTray == true) m_cd_state = CD_STAT_PAUSE; @@ -543,50 +555,6 @@ void segacdblock_device::device_timer(emu_timer &timer, device_timer_id id, int set_flag(SCDQ); } - #if 0 - m_sh1_ticks ++; - //m_sh1_ticks &= 0xff; - //if(m_sh1_ticks == 0) - - if(m_sh1_inited == false) - { - if(m_sh1_ticks >= 0x4000) - { - m_sh1_inited = true; - - } - } - else - { - if((m_sh1_ticks & 0xff) != 0) - { - if(m_TOCPhase == true) - sh1_TOCRetrieve(); - - if(m_isDiscInTray == true) - m_cd_state = CD_STAT_PAUSE; - else - m_cd_state = CD_STAT_NODISC; - - if(m_TransferActive == true) - m_cd_state|= CD_STAT_TRANS; - - cd_standard_return(true); - set_flag(SCDQ); - } - else - { - if(m_cmd_issued == 0xf) - { - if(m_cr[0] != 0) - printf("CD CMD: %04x %04x %04x %04x\n",m_cr[0],m_cr[1],m_cr[2],m_cr[3]); - - - m_cmd_issued = 0; - } - } - } - #endif } //------------------------------------------------- @@ -600,6 +568,7 @@ void segacdblock_device::device_start() m_peri_timer = timer_alloc(PERI_TIMER); m_cmd_timer = timer_alloc(CMD_TIMER); m_cd_timer = timer_alloc(CD_TIMER); + m_DMABuffer = auto_alloc_array_clear(machine(), UINT8, 2352); } @@ -618,12 +587,20 @@ void segacdblock_device::device_reset() m_peri_timer->reset(); m_cmd_timer->reset(); m_cd_timer->reset(); + + xfertype = CDDMA_STOPPED; + sourcetype = SOURCE_NONE; + m_dma_size = 0; + m_dma_src = 0; //m_sh1_timer->adjust(attotime::from_hz(clock()*256), 0, attotime::from_hz(clock()*256)); m_sh1_inited = false; m_cmd_issued = 0; m_hirq = 0xffff; cdrom = subdevice<cdrom_image_device>("cdrom")->get_cdrom_file(); + if(cdrom != NULL) + TOCRetrieve(); + m_isDiscInTray = cdrom != NULL; } diff --git a/src/emu/machine/segacdblock.h b/src/emu/machine/segacdblock.h index 779bc51c87f..a1c61dd4481 100644 --- a/src/emu/machine/segacdblock.h +++ b/src/emu/machine/segacdblock.h @@ -90,20 +90,31 @@ private: enum transT { - XFERTYPE_INVALID, - XFERTYPE_TOC, + CDDMA_STOPPED, + CDDMA_INPROGRESS + /*XFERTYPE_TOC, XFERTYPE_FILEINFO_1, XFERTYPE_FILEINFO_254, XFERTYPE_SUBQ, - XFERTYPE_SUBRW + XFERTYPE_SUBRW*/ + }; + + enum sourceT + { + SOURCE_NONE, + SOURCE_TOC, + SOURCE_DATA, + SOURCE_AUDIO }; transT xfertype; + sourceT sourcetype; UINT32 m_dma_src,m_dma_size; - UINT8 tocbuf[102*4]; /**< @todo make common buffer instead */ - void sh1_TOCRetrieve(); + UINT8 tocbuf[102*4]; /**< @todo Subchannel Q of lead-in */ + UINT8 *m_DMABuffer; + void TOCRetrieve(); void sh1_writes_registers(UINT16 r1, UINT16 r2, UINT16 r3, UINT16 r4); void cd_standard_return(bool isPeri); |
