Driver updated from MESS

This commit is contained in:
Angelo Salese 2011-02-15 03:04:19 +00:00
parent c91ef42f7f
commit fa21a464ff

View File

@ -4178,11 +4178,13 @@ void CDD_GetTrackPos(void)
int elapsedlba;
UINT32 msf;
CDD_STATUS &= 0xFF;
// UINT32 end_msf = ;
if(segacd.cd == NULL) // no cd is there, bail out
return;
CDD_STATUS |= SCD_STATUS;
elapsedlba = SCD_CURLBA - cdrom_get_track_start(segacd.cd, SCD_CURTRK);
msf = lba_to_msf_alt (elapsedlba+150);
elapsedlba = SCD_CURLBA - segacd.toc->tracks[ cdrom_get_track(segacd.cd, SCD_CURLBA) ].physframeofs;
msf = lba_to_msf_alt (elapsedlba);
//popmessage("%08x %08x",SCD_CURLBA,segacd.toc->tracks[ cdrom_get_track(segacd.cd, SCD_CURLBA) + 1 ].physframeofs);
CDD_MIN = to_bcd(((msf & 0x00ff0000)>>16),false);
CDD_SEC = to_bcd(((msf & 0x0000ff00)>>8),false);
CDD_FRAME = to_bcd(((msf & 0x000000ff)>>0),false);
@ -4206,9 +4208,13 @@ void CDD_Length(void)
if(segacd.cd == NULL) // no cd is there, bail out
return;
CDD_STATUS |= SCD_STATUS;
CDD_MIN = 259; // HACK!!!!
CDD_SEC = 258; // HACK!!!!
CDD_FRAME = 257; // HACK!!!!
UINT32 startlba = (segacd.toc->tracks[cdrom_get_last_track(segacd.cd)].physframeofs);
UINT32 startmsf = lba_to_msf_alt( startlba );
CDD_MIN = to_bcd((startmsf&0x00ff0000)>>16,false);
CDD_SEC = to_bcd((startmsf&0x0000ff00)>>8,false);
CDD_FRAME = to_bcd((startmsf&0x000000ff)>>0,false);
}
@ -4220,7 +4226,7 @@ void CDD_FirstLast(void)
return;
CDD_STATUS |= SCD_STATUS;
CDD_MIN = 1; // first
CDD_SEC = to_bcd(cdrom_get_last_track(segacd.cd)+1,false); // last
CDD_SEC = to_bcd(cdrom_get_last_track(segacd.cd),false); // last
}
void CDD_GetTrackAdr(void)
@ -4228,7 +4234,7 @@ void CDD_GetTrackAdr(void)
CLEAR_CDD_RESULT
int track = (CDD_TX[4] & 0xF) + (CDD_TX[5] & 0xF) * 10;
int last_track = cdrom_get_last_track(segacd.cd)+1;
int last_track = cdrom_get_last_track(segacd.cd);
CDD_STATUS &= 0xFF;
if(segacd.cd == NULL) // no cd is there, bail out
@ -4306,7 +4312,7 @@ void CDD_Pause(running_machine *machine)
SET_CDD_DATA_MODE
//segacd.current_frame = cdda_get_audio_lba( machine->device( "cdda" ) );
if(!(CURRENT_TRACK_IS_DATA))
//if(!(CURRENT_TRACK_IS_DATA))
cdda_pause_audio( machine->device( "cdda" ), 1 );
}
@ -4320,7 +4326,7 @@ void CDD_Resume(running_machine *machine)
set_data_audio_mode();
CDD_MIN = to_bcd (SCD_CURTRK, false);
SET_CDC_READ
if(!(CURRENT_TRACK_IS_DATA))
//if(!(CURRENT_TRACK_IS_DATA))
cdda_pause_audio( machine->device( "cdda" ), 0 );
}
@ -4639,7 +4645,7 @@ void CDD_Handle_TOC_Commands(void)
{
case TOCCMD_CURPOS: CDD_GetPos(); break;
case TOCCMD_TRKPOS: CDD_GetTrackPos(); break;
case TOCCMD_CURTRK: CDD_GetTrack (); break;
case TOCCMD_CURTRK: CDD_GetTrack(); break;
case TOCCMD_LENGTH: CDD_Length(); break;
case TOCCMD_FIRSTLAST: CDD_FirstLast(); break;
case TOCCMD_TRACKADDR: CDD_GetTrackAdr(); break;
@ -5826,7 +5832,8 @@ void segacd_init_main_cpu( running_machine* machine )
segacd_gfx_conversion_timer->adjust(attotime::never);
segacd_hock_timer = machine->scheduler().timer_alloc(FUNC(segacd_access_timer_callback));
segacd_hock_timer->adjust( attotime::from_nsec(5000000), 0, attotime::from_nsec(5000000));
// segacd_hock_timer->adjust( attotime::from_nsec(20000000), 0, attotime::from_nsec(20000000));
segacd_hock_timer->adjust( attotime::from_hz(75),0, attotime::from_hz(75));
segacd_irq3_timer = machine->scheduler().timer_alloc(FUNC(segacd_irq3_timer_callback));
segacd_irq3_timer->adjust(attotime::never);
@ -5882,6 +5889,7 @@ static MACHINE_RESET( segacd )
{
segacd.toc = cdrom_get_toc( segacd.cd );
cdda_set_cdrom( machine->device("cdda"), segacd.cd );
cdda_stop_audio( machine->device( "cdda" ) ); //stop any pending CD-DA
}
}
}
@ -6431,11 +6439,13 @@ static TIMER_CALLBACK( segacd_irq3_timer_callback )
WRITE16_HANDLER( segacd_stopwatch_timer_w )
{
printf("Stopwatch timer %04x\n",data);
}
READ16_HANDLER( segacd_stopwatch_timer_r )
{
printf("Stopwatch timer read\n");
return space->machine->rand();
}
@ -6449,6 +6459,29 @@ WRITE16_HANDLER( cdc_dmaaddr_w )
COMBINE_DATA(&CDC_DMA_ADDR);
}
READ16_HANDLER( segacd_cdfader_r )
{
return 0;
}
WRITE16_HANDLER( segacd_cdfader_w )
{
static double cdfader_vol;
if(data & 0x800f)
printf("CD Fader register write %04x\n",data);
cdfader_vol = (double)((data & 0x3ff0) >> 4);
if(data & 0x4000)
cdfader_vol = 100.0;
else
cdfader_vol = (cdfader_vol / 1024.0) * 100.0;
printf("%f\n",cdfader_vol);
cdda_set_volume(space->machine->device("cdda"), cdfader_vol);
}
static ADDRESS_MAP_START( segacd_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x000000, 0x07ffff) AM_RAM AM_BASE(&segacd_4meg_prgram)
@ -6475,7 +6508,7 @@ static ADDRESS_MAP_START( segacd_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0xff8020 ,0xff802f) AM_READWRITE(segacd_comms_sub_part2_r, segacd_comms_sub_part2_w)
AM_RANGE(0xff8030, 0xff8031) AM_READWRITE(segacd_irq3timer_r, segacd_irq3timer_w) // Timer W/INT3
AM_RANGE(0xff8032, 0xff8033) AM_READWRITE(segacd_irq_mask_r,segacd_irq_mask_w)
AM_RANGE(0xff8034, 0xff8035) AM_NOP // CD Fader
AM_RANGE(0xff8034, 0xff8035) AM_READWRITE(segacd_cdfader_r,segacd_cdfader_w) // CD Fader
AM_RANGE(0xff8036, 0xff8037) AM_READWRITE(segacd_cdd_ctrl_r,segacd_cdd_ctrl_w)
AM_RANGE(0xff8038, 0xff8041) AM_READ8(segacd_cdd_rx_r,0xffff)
AM_RANGE(0xff8042, 0xff804b) AM_WRITE8(segacd_cdd_tx_w,0xffff)
@ -9451,16 +9484,14 @@ MACHINE_CONFIG_DERIVED( genesis_scd, megadriv )
MCFG_CPU_PROGRAM_MAP(segacd_map)
MCFG_SOUND_ADD( "cdda", CDDA, 0 )
MCFG_SOUND_ROUTE( 0, "lspeaker", 1.00 )
MCFG_SOUND_ROUTE( 1, "rspeaker", 1.00 )
MCFG_SOUND_ROUTE( 0, "lspeaker", 0.50 ) // TODO: accurate volume balance
MCFG_SOUND_ROUTE( 1, "rspeaker", 0.50 )
MCFG_SOUND_ADD("rfsnd", RF5C68, SEGACD_CLOCK) // RF5C164!
MCFG_SOUND_ROUTE( 0, "lspeaker", 0.25 )
MCFG_SOUND_ROUTE( 1, "rspeaker", 0.25 )
MCFG_SOUND_ROUTE( 0, "lspeaker", 0.50 )
MCFG_SOUND_ROUTE( 1, "rspeaker", 0.50 )
MCFG_QUANTUM_PERFECT_CPU("maincpu")
MACHINE_CONFIG_END
/* Different Softlists for different regions (for now at least) */
@ -9488,8 +9519,8 @@ MACHINE_CONFIG_DERIVED( genesis_32x_scd, genesis_32x )
MCFG_CPU_PROGRAM_MAP(segacd_map)
MCFG_SOUND_ADD( "cdda", CDDA, 0 )
MCFG_SOUND_ROUTE( 0, "lspeaker", 1.00 )
MCFG_SOUND_ROUTE( 1, "rspeaker", 1.00 )
MCFG_SOUND_ROUTE( 0, "lspeaker", 0.50 )
MCFG_SOUND_ROUTE( 1, "rspeaker", 0.50 )
MCFG_SOUND_ADD("rfsnd", RF5C68, SEGACD_CLOCK) // RF5C164
MCFG_SOUND_ROUTE( 0, "lspeaker", 0.25 )