diff options
author | angelosa <salese_corp_ltd@email.it> | 2015-07-12 21:21:29 +0200 |
---|---|---|
committer | angelosa <salese_corp_ltd@email.it> | 2015-07-12 21:21:29 +0200 |
commit | f8bd6db351c00a9e4a6d30954ac4ff26207ca942 (patch) | |
tree | 749075a3472fa8d42b5d9ed5933bf749a3624cf8 | |
parent | 701e022ce4260dddffea89108de61562e2df57d9 (diff) |
Added Get Session Info, system never sends CD auth phase, tbd
-rw-r--r-- | src/emu/machine/segacdblock.c | 47 | ||||
-rw-r--r-- | src/emu/machine/segacdblock.h | 5 |
2 files changed, 43 insertions, 9 deletions
diff --git a/src/emu/machine/segacdblock.c b/src/emu/machine/segacdblock.c index e2d5304e0b8..6597251f0dd 100644 --- a/src/emu/machine/segacdblock.c +++ b/src/emu/machine/segacdblock.c @@ -132,6 +132,8 @@ READ16_MEMBER(segacdblock_device::datatrns_r) 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; @@ -218,7 +220,7 @@ void segacdblock_device::cd_standard_return(bool isPeri) m_dr[0] = (isPeri == true ? CD_STAT_PERI : 0) | m_cd_state; m_dr[1] = 0x0000; m_dr[2] = 0x0000; - m_dr[3] = 0x0000; + m_dr[3] = 150; } @@ -249,6 +251,33 @@ void segacdblock_device::cd_cmd_get_toc() set_flag(CMOK); } +void segacdblock_device::cd_cmd_get_session_info(UINT8 param) +{ + m_dr[0] = m_cd_state; + m_dr[1] = 0; + switch(param) + { + case 0: // lead out + m_dr[2] = 0x0100 | ((m_DiscLeadOut >> 16) & 0xff); + m_dr[3] = m_DiscLeadOut & 0xffff; + break; + + case 1: // lead in + m_dr[2] = 0x0100 | 0; + m_dr[3] = 0; + break; + + default: // unknown + popmessage("Get Session Info used with param %02x, contact MAMEdev",param); + m_dr[2] = 0; + m_dr[3] = 0; + break; + } + + printf("Returns: %04x %04x %04x %04x\n",m_dr[0],m_dr[1],m_dr[2],m_dr[3]); + set_flag(CMOK); +} + void segacdblock_device::cd_cmd_init(UINT8 init_flags) { cd_standard_return(false); @@ -387,22 +416,15 @@ void segacdblock_device::sh1_TOCRetrieve() //tocbuf[tocptr] = sega_cdrom_get_adr_control(cdrom, i); //HACK: ddsom does not enter ingame with the line above! tocbuf[tocptr] = cdrom_get_adr_control(cdrom, i)<<4 | 0x01; - } - else - { - tocbuf[tocptr] = 0xff; - } - if (cdrom) - { fad = cdrom_get_track_start(cdrom, i) + 150; - tocbuf[tocptr+1] = (fad>>16)&0xff; tocbuf[tocptr+2] = (fad>>8)&0xff; tocbuf[tocptr+3] = fad&0xff; } else { + tocbuf[tocptr] = 0xff; tocbuf[tocptr+1] = 0xff; tocbuf[tocptr+2] = 0xff; tocbuf[tocptr+3] = 0xff; @@ -438,6 +460,7 @@ void segacdblock_device::sh1_TOCRetrieve() // get total disc length (start of lead-out) fad = cdrom_get_track_start(cdrom, 0xaa) + 150; + m_DiscLeadOut = fad; tocbuf[tocptr+8] = tocbuf[0]; tocbuf[tocptr+9] = (fad>>16)&0xff; tocbuf[tocptr+10] = (fad>>8)&0xff; @@ -503,6 +526,10 @@ void segacdblock_device::device_timer(emu_timer &timer, device_timer_id id, int cd_cmd_get_toc(); break; + case 0x03: + cd_cmd_get_session_info(m_cr[0] & 0xff); + break; + case 0x04: cd_cmd_init(m_cr[0] & 0xff); break; @@ -522,9 +549,11 @@ void segacdblock_device::device_timer(emu_timer &timer, device_timer_id id, int case 0x67: cd_cmd_get_copy_error(); break; + case 0x75: cd_cmd_abort(); break; + case 0xe0: if(m_cr[1] > 1) printf("%04x auth command\n",m_cr[1]); diff --git a/src/emu/machine/segacdblock.h b/src/emu/machine/segacdblock.h index 62f4be95d33..1cc3ba10854 100644 --- a/src/emu/machine/segacdblock.h +++ b/src/emu/machine/segacdblock.h @@ -82,6 +82,7 @@ private: bool m_isDiscInTray; bool m_TOCPhase; bool m_TransferActive; + UINT32 m_DiscLeadOut; cdrom_file *cdrom; @@ -97,6 +98,8 @@ private: transT xfertype; UINT32 m_dma_src,m_dma_size; + + UINT8 tocbuf[102*4]; /**< @todo make common buffer instead */ void sh1_TOCRetrieve(); @@ -106,6 +109,8 @@ private: void cd_cmd_status(); void cd_cmd_get_hw_info(); void cd_cmd_get_toc(); + void cd_cmd_get_session_info(UINT8 param); + // ... void cd_cmd_init(UINT8 init_flags); // ... |