mirror of
https://github.com/holub/mame
synced 2025-04-30 11:50:30 +03:00
Added preliminary CD Seek mechanism, fixes Zero Divide booting
This commit is contained in:
parent
e6ce889436
commit
dba816bc3c
@ -77,17 +77,17 @@ int saturn_state::get_timing_command(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* FIXME: assume Saturn CD-ROMs to have a 2 secs pre-gap for now. */
|
/* FIXME: assume Saturn CD-ROMs to have a 2 secs pre-gap for now. */
|
||||||
int saturn_state::get_track_index(void)
|
int saturn_state::get_track_index(UINT32 fad)
|
||||||
{
|
{
|
||||||
UINT32 rel_fad;
|
UINT32 rel_fad;
|
||||||
UINT8 track;
|
UINT8 track;
|
||||||
|
|
||||||
if(cdrom_get_track_type(cdrom, cdrom_get_track(cdrom, cd_curfad)) != CD_TRACK_AUDIO)
|
if(cdrom_get_track_type(cdrom, cdrom_get_track(cdrom, fad)) != CD_TRACK_AUDIO)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
track = cdrom_get_track( cdrom, cd_curfad );
|
track = cdrom_get_track( cdrom, fad );
|
||||||
|
|
||||||
rel_fad = cd_curfad - cdrom_get_track_start( cdrom, track );
|
rel_fad = fad - cdrom_get_track_start( cdrom, track );
|
||||||
|
|
||||||
if(rel_fad < 150)
|
if(rel_fad < 150)
|
||||||
return 0;
|
return 0;
|
||||||
@ -97,10 +97,23 @@ int saturn_state::get_track_index(void)
|
|||||||
|
|
||||||
void saturn_state::cr_standard_return(UINT16 cur_status)
|
void saturn_state::cr_standard_return(UINT16 cur_status)
|
||||||
{
|
{
|
||||||
cr1 = cur_status | (playtype << 7) | 0x00 | (cdda_repeat_count & 0xf); //options << 4 | repeat & 0xf
|
if ((cd_stat & 0x0f00) == CD_STAT_SEEK)
|
||||||
cr2 = (cur_track == 0xff) ? 0xffff : (cdrom_get_adr_control(cdrom, cur_track)<<8 | cur_track); // TODO: fix current track
|
{
|
||||||
cr3 = (get_track_index()<<8) | (cd_curfad>>16); //index & 0xff00
|
/* During seek state, values returned are from the target position */
|
||||||
cr4 = cd_curfad;
|
UINT8 seek_track = cdrom_get_track(cdrom, cd_fad_seek-150);
|
||||||
|
|
||||||
|
cr1 = cur_status | (playtype << 7) | 0x00 | (cdda_repeat_count & 0xf);
|
||||||
|
cr2 = (seek_track == 0xff) ? 0xffff : ((cdrom_get_adr_control(cdrom, seek_track)<<8) | seek_track);
|
||||||
|
cr3 = (get_track_index(cd_fad_seek)<<8) | (cd_fad_seek>>16); //index & 0xff00
|
||||||
|
cr4 = cd_fad_seek;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cr1 = cur_status | (playtype << 7) | 0x00 | (cdda_repeat_count & 0xf); //options << 4 | repeat & 0xf
|
||||||
|
cr2 = (cur_track == 0xff) ? 0xffff : (cdrom_get_adr_control(cdrom, cur_track)<<8 | cur_track); // TODO: fix current track
|
||||||
|
cr3 = (get_track_index(cd_curfad)<<8) | (cd_curfad>>16); //index & 0xff00
|
||||||
|
cr4 = cd_curfad;
|
||||||
|
}
|
||||||
cd_stat |= CD_STAT_PERI;
|
cd_stat |= CD_STAT_PERI;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -332,7 +345,9 @@ void saturn_state::cd_exec_command( void )
|
|||||||
if(((start_pos)>>8) != 0)
|
if(((start_pos)>>8) != 0)
|
||||||
{
|
{
|
||||||
cur_track = (start_pos)>>8;
|
cur_track = (start_pos)>>8;
|
||||||
cd_curfad = cdrom_get_track_start(cdrom, cur_track-1);
|
cd_fad_seek = cdrom_get_track_start(cdrom, cur_track-1);
|
||||||
|
cd_stat = CD_STAT_SEEK;
|
||||||
|
cdda_pause_audio( machine().device( "cdda" ), 0 );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -510,7 +525,7 @@ void saturn_state::cd_exec_command( void )
|
|||||||
xfercount = 0;
|
xfercount = 0;
|
||||||
subqbuf[0] = 0x01 | ((cdrom_get_track_type(cdrom, cdrom_get_track(cdrom, track+1)) == CD_TRACK_AUDIO) ? 0x00 : 0x40);
|
subqbuf[0] = 0x01 | ((cdrom_get_track_type(cdrom, cdrom_get_track(cdrom, track+1)) == CD_TRACK_AUDIO) ? 0x00 : 0x40);
|
||||||
subqbuf[1] = dec_2_bcd(track+1);
|
subqbuf[1] = dec_2_bcd(track+1);
|
||||||
subqbuf[2] = dec_2_bcd(get_track_index());
|
subqbuf[2] = dec_2_bcd(get_track_index(cd_curfad));
|
||||||
subqbuf[3] = dec_2_bcd((msf_rel >> 16) & 0xff);
|
subqbuf[3] = dec_2_bcd((msf_rel >> 16) & 0xff);
|
||||||
subqbuf[4] = dec_2_bcd((msf_rel >> 8) & 0xff);
|
subqbuf[4] = dec_2_bcd((msf_rel >> 8) & 0xff);
|
||||||
subqbuf[5] = dec_2_bcd((msf_rel >> 0) & 0xff);
|
subqbuf[5] = dec_2_bcd((msf_rel >> 0) & 0xff);
|
||||||
@ -2427,6 +2442,30 @@ saturn_state::partitionT *saturn_state::cd_read_filtered_sector(INT32 fad, UINT8
|
|||||||
// loads in data set up by a CD-block PLAY command
|
// loads in data set up by a CD-block PLAY command
|
||||||
void saturn_state::cd_playdata( void )
|
void saturn_state::cd_playdata( void )
|
||||||
{
|
{
|
||||||
|
if ((cd_stat & 0x0f00) == CD_STAT_SEEK)
|
||||||
|
{
|
||||||
|
//UINT8 seek_track = cdrom_get_track(cdrom, cd_fad_seek-150);
|
||||||
|
|
||||||
|
/* Zero Divide wants this TODO: timings. */
|
||||||
|
if((cd_fad_seek - cd_curfad) > (750*cd_speed))
|
||||||
|
cd_curfad += (750*cd_speed);
|
||||||
|
else if((cd_fad_seek < cd_curfad) < (-750*cd_speed))
|
||||||
|
cd_curfad -= (750*cd_speed);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cd_curfad = cd_fad_seek;
|
||||||
|
cd_stat = CD_STAT_PLAY;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
cr1 = cd_stat | 0x00; //options << 4 | repeat & 0xf
|
||||||
|
cr2 = (cdrom_get_adr_control(cdrom, seek_track)<<8 | seek_track);
|
||||||
|
cr3 = (get_track_index(cd_fad_seek)<<8) | (cd_fad_seek>>16); //index & 0xff00
|
||||||
|
cr4 = cd_fad_seek;
|
||||||
|
#endif
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if ((cd_stat & 0x0f00) == CD_STAT_PLAY)
|
if ((cd_stat & 0x0f00) == CD_STAT_PLAY)
|
||||||
{
|
{
|
||||||
if (fadstoplay)
|
if (fadstoplay)
|
||||||
@ -2490,7 +2529,7 @@ void saturn_state::cd_readblock(UINT32 fad, UINT8 *dat)
|
|||||||
{
|
{
|
||||||
if (cdrom)
|
if (cdrom)
|
||||||
{
|
{
|
||||||
cdrom_read_data(cdrom, fad-150, dat, CD_TRACK_MODE1);
|
cdrom_read_data(cdrom, fad-150, dat, CD_TRACK_MODE1, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -627,7 +627,7 @@ public:
|
|||||||
void stvcd_set_tray_open(void);
|
void stvcd_set_tray_open(void);
|
||||||
void stvcd_set_tray_close(void);
|
void stvcd_set_tray_close(void);
|
||||||
|
|
||||||
int get_track_index(void);
|
int get_track_index(UINT32 fad);
|
||||||
void cr_standard_return(UINT16 cur_status);
|
void cr_standard_return(UINT16 cur_status);
|
||||||
void cd_free_block(blockT *blktofree);
|
void cd_free_block(blockT *blktofree);
|
||||||
void cd_defragblocks(partitionT *part);
|
void cd_defragblocks(partitionT *part);
|
||||||
@ -684,6 +684,7 @@ public:
|
|||||||
UINT16 hirqmask, hirqreg;
|
UINT16 hirqmask, hirqreg;
|
||||||
UINT16 cd_stat;
|
UINT16 cd_stat;
|
||||||
UINT32 cd_curfad;// = 0;
|
UINT32 cd_curfad;// = 0;
|
||||||
|
UINT32 cd_fad_seek;
|
||||||
UINT32 fadstoplay;// = 0;
|
UINT32 fadstoplay;// = 0;
|
||||||
UINT32 in_buffer;// = 0; // amount of data in the buffer
|
UINT32 in_buffer;// = 0; // amount of data in the buffer
|
||||||
int oddframe;// = 0;
|
int oddframe;// = 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user