summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author angelosa <salese_corp_ltd@email.it>2015-07-13 19:58:15 +0200
committer angelosa <salese_corp_ltd@email.it>2015-07-13 19:58:15 +0200
commit8a7559a8068a5ba2a835343adab8ade91cd48180 (patch)
tree9b536a1819e8332c42cd0718e90fc3a79d8331b9
parentdb5114d9a143f45fb83a3036788ec0f36e738362 (diff)
Added proper timers, gains some performance back.
-rw-r--r--src/emu/machine/segacdblock.c177
-rw-r--r--src/emu/machine/segacdblock.h22
2 files changed, 107 insertions, 92 deletions
diff --git a/src/emu/machine/segacdblock.c b/src/emu/machine/segacdblock.c
index 6248bb8df4a..4f25dde036c 100644
--- a/src/emu/machine/segacdblock.c
+++ b/src/emu/machine/segacdblock.c
@@ -107,6 +107,15 @@ WRITE16_MEMBER(segacdblock_device::hirq_w)
READ16_MEMBER(segacdblock_device::hirq_mask_r){ return m_hirq_mask; }
WRITE16_MEMBER(segacdblock_device::hirq_mask_w) { COMBINE_DATA(&m_hirq_mask); }
+void segacdblock_device::SH2SendsCommand()
+{
+ if(m_cmd_issued != 0xf)
+ fatalerror("SH-2 attempted to write a command in-the-middle %04x\n",m_cmd_issued);
+
+ m_cmd_timer->adjust(attotime::from_hz(16667));
+ m_peri_timer->adjust(attotime::never);
+}
+
// 0x6001fd8 cd-block string check
READ16_MEMBER(segacdblock_device::cr0_r){ return m_dr[0]; }
WRITE16_MEMBER(segacdblock_device::cr0_w){ m_cmd_issued |= 1; COMBINE_DATA(&m_cr[0]);}
@@ -118,7 +127,7 @@ READ16_MEMBER(segacdblock_device::cr2_r){ return m_dr[2]; }
WRITE16_MEMBER(segacdblock_device::cr2_w){ m_cmd_issued |= 4; COMBINE_DATA(&m_cr[2]);}
READ16_MEMBER(segacdblock_device::cr3_r){ return m_dr[3]; }
-WRITE16_MEMBER(segacdblock_device::cr3_w){ m_cmd_issued |= 8; COMBINE_DATA(&m_cr[3]);}
+WRITE16_MEMBER(segacdblock_device::cr3_w){ m_cmd_issued |= 8; COMBINE_DATA(&m_cr[3]); SH2SendsCommand(); }
READ16_MEMBER(segacdblock_device::datatrns_r)
{
@@ -214,7 +223,35 @@ void segacdblock_device::device_validity_check(validity_checker &valid) const
{
}
+void segacdblock_device::SH1CommandExecute()
+{
+ switch(m_cr[0] >> 8)
+ {
+ case 0x00: cd_cmd_status(); break;
+ case 0x01: cd_cmd_get_hw_info(); break;
+ case 0x02: 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;
+ case 0x06: cd_cmd_end_transfer(); break;
+ case 0x48: cd_cmd_reset_selector(); break;
+
+ case 0x60: cd_cmd_set_sector_length(); break;
+ case 0x67: cd_cmd_get_copy_error(); break;
+
+ case 0x70: cd_cmd_change_dir(); break;
+ case 0x75: cd_cmd_abort(); break;
+
+ case 0xe0: cd_cmd_auth_device(m_cr[1]); break;
+ case 0xe1: cd_cmd_device_auth_status(m_cr[1]); break;
+ default:
+ printf("Unhandled %04x %04x %04x %04x\n",m_cr[0],m_cr[1],m_cr[2],m_cr[3]);
+ //set_flag(CMOK);
+ }
+ m_cmd_issued = 0;
+ // @todo: timer changes with cd timer, maybe we could disable this during data/audio playback and enable that instead?
+ m_peri_timer->adjust(attotime::from_usec(16667), 0, attotime::from_usec(16667));
+}
void segacdblock_device::cd_standard_return(bool isPeri)
{
@@ -358,36 +395,41 @@ void segacdblock_device::cd_cmd_abort()
set_flag(CMOK);
}
-void segacdblock_device::cd_cmd_auth_device(bool isMPEGauth)
+void segacdblock_device::cd_cmd_auth_device(UINT16 AuthType)
{
- if(isMPEGauth == true)
+ switch(AuthType)
{
- //set_flag(MPED);
+ case 0: // CD-Rom
+ set_flag(EFLS|CSCT);
+ break;
+ case 1: // MPEG
+ //set_flag(MPED);
+ break;
}
- else
- set_flag(EFLS|CSCT);
cd_standard_return(false);
set_flag(CMOK);
}
-void segacdblock_device::cd_cmd_device_auth_status(bool isMPEGauth)
+void segacdblock_device::cd_cmd_device_auth_status(UINT16 AuthType)
{
- if(isMPEGauth == true)
- {
- m_dr[0] = m_cd_state | 0;
- m_dr[1] = 0; /**< @todo: 2 if card present */
- m_dr[2] = 0;
- m_dr[3] = 0;
- }
- else
+ switch(AuthType)
{
- m_dr[0] = m_cd_state | 0;
- m_dr[1] = 4; /**< @todo: various auth states */
- m_dr[2] = 0;
- m_dr[3] = 0;
+ case 0: // CD-Rom
+ m_dr[0] = m_cd_state | 0;
+ m_dr[1] = 4; /**< @todo: various auth states */
+ m_dr[2] = 0;
+ m_dr[3] = 0;
+ break;
+ case 1:
+ m_dr[0] = m_cd_state | 0;
+ m_dr[1] = 0; /**< @todo: 2 if card present */
+ m_dr[2] = 0;
+ m_dr[3] = 0;
+ break;
}
+
set_flag(CMOK);
}
@@ -480,8 +522,28 @@ void segacdblock_device::sh1_TOCRetrieve()
void segacdblock_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
{
- assert(id == SH1_TIMER);
+ assert(id < CD_TIMER+1);
+ if(id == CMD_TIMER)
+ SH1CommandExecute();
+ else if(id == PERI_TIMER)
+ {
+ 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);
+ }
+
+ #if 0
m_sh1_ticks ++;
//m_sh1_ticks &= 0xff;
//if(m_sh1_ticks == 0)
@@ -519,70 +581,12 @@ void segacdblock_device::device_timer(emu_timer &timer, device_timer_id id, int
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;
-
- case 0x01:
- cd_cmd_get_hw_info();
- break;
-
- case 0x02:
- 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;
-
- case 0x06:
- cd_cmd_end_transfer();
- break;
-
- case 0x48:
- cd_cmd_reset_selector();
- break;
-
- case 0x60:
- cd_cmd_set_sector_length();
- break;
-
- case 0x67:
- cd_cmd_get_copy_error();
- break;
-
- case 0x70:
- cd_cmd_change_dir();
- break;
-
- case 0x75:
- cd_cmd_abort();
- break;
-
- case 0xe0:
- if(m_cr[1] > 1)
- printf("%04x auth command\n",m_cr[1]);
- cd_cmd_auth_device(m_cr[1] == 1);
- break;
- case 0xe1:
- if(m_cr[1] > 1)
- printf("%04x auth command\n",m_cr[1]);
- cd_cmd_device_auth_status(m_cr[1] == 1);
- break;
- default:
- printf("Unhandled %04x %04x %04x %04x\n",m_cr[0],m_cr[1],m_cr[2],m_cr[3]);
- //set_flag(CMOK);
- }
+
m_cmd_issued = 0;
}
}
}
+ #endif
}
//-------------------------------------------------
@@ -592,8 +596,10 @@ void segacdblock_device::device_timer(emu_timer &timer, device_timer_id id, int
void segacdblock_device::device_start()
{
m_space = &space(AS_0);
- m_sh1_timer = timer_alloc(SH1_TIMER);
-
+ //m_sh1_timer = timer_alloc(SH1_TIMER);
+ m_peri_timer = timer_alloc(PERI_TIMER);
+ m_cmd_timer = timer_alloc(CMD_TIMER);
+ m_cd_timer = timer_alloc(CD_TIMER);
}
@@ -609,9 +615,10 @@ void segacdblock_device::device_reset()
m_dr[2] = 'L' << 8 | 'O';
m_dr[3] = 'C' << 8 | 'K';
m_fad = 150;
- m_sh1_timer->reset();
- m_sh1_timer->adjust(attotime::from_hz(clock()*256), 0, attotime::from_hz(clock()*256));
- m_sh1_ticks = 0;
+ m_peri_timer->reset();
+ m_cmd_timer->reset();
+ m_cd_timer->reset();
+ //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;
diff --git a/src/emu/machine/segacdblock.h b/src/emu/machine/segacdblock.h
index 04746d2e2c8..779bc51c87f 100644
--- a/src/emu/machine/segacdblock.h
+++ b/src/emu/machine/segacdblock.h
@@ -69,13 +69,15 @@ protected:
address_space *m_space;
private:
- static const device_timer_id SH1_TIMER = 0;
+ static const device_timer_id PERI_TIMER = 0;
+ static const device_timer_id CMD_TIMER = 1;
+ static const device_timer_id CD_TIMER = 2;
+
UINT16 m_cr[4];
UINT16 m_dr[4];
UINT16 m_hirq_mask;
UINT16 m_hirq;
UINT32 m_fad;
- UINT32 m_sh1_ticks;
UINT16 m_cd_state;
UINT8 m_cmd_issued;
bool m_sh1_inited;
@@ -114,9 +116,11 @@ private:
void cd_cmd_init(UINT8 init_flags);
void cd_cmd_end_transfer();
+ // 0x40
+ void cd_cmd_reset_selector();
+
// 0x60
void cd_cmd_set_sector_length();
- void cd_cmd_reset_selector();
void cd_cmd_get_copy_error();
// 0x70
@@ -124,13 +128,17 @@ private:
void cd_cmd_abort();
// 0xe0
- void cd_cmd_auth_device(bool isMPEGauth);
- void cd_cmd_device_auth_status(bool isMPEGauth);
-
+ void cd_cmd_auth_device(UINT16 AuthType);
+ void cd_cmd_device_auth_status(UINT16 AuthType);
+ void SH2SendsCommand();
+ void SH1CommandExecute();
void set_flag(UINT16 which);
void clear_flag(UINT16 which);
- emu_timer *m_sh1_timer;
+ //emu_timer *m_sh1_timer;
+ emu_timer *m_peri_timer;
+ emu_timer *m_cmd_timer;
+ emu_timer *m_cd_timer;
UINT16 read_cd_state();
void write_cd_state(UINT16 which);
void write_fad();