trunk/src/emu/machine/stvcd.c
| r21235 | r21236 | |
| 77 | 77 | } |
| 78 | 78 | |
| 79 | 79 | /* FIXME: assume Saturn CD-ROMs to have a 2 secs pre-gap for now. */ |
| 80 | | int saturn_state::get_track_index(void) |
| 80 | int saturn_state::get_track_index(UINT32 fad) |
| 81 | 81 | { |
| 82 | 82 | UINT32 rel_fad; |
| 83 | 83 | UINT8 track; |
| 84 | 84 | |
| 85 | | if(cdrom_get_track_type(cdrom, cdrom_get_track(cdrom, cd_curfad)) != CD_TRACK_AUDIO) |
| 85 | if(cdrom_get_track_type(cdrom, cdrom_get_track(cdrom, fad)) != CD_TRACK_AUDIO) |
| 86 | 86 | return 1; |
| 87 | 87 | |
| 88 | | track = cdrom_get_track( cdrom, cd_curfad ); |
| 88 | track = cdrom_get_track( cdrom, fad ); |
| 89 | 89 | |
| 90 | | rel_fad = cd_curfad - cdrom_get_track_start( cdrom, track ); |
| 90 | rel_fad = fad - cdrom_get_track_start( cdrom, track ); |
| 91 | 91 | |
| 92 | 92 | if(rel_fad < 150) |
| 93 | 93 | return 0; |
| r21235 | r21236 | |
| 97 | 97 | |
| 98 | 98 | void saturn_state::cr_standard_return(UINT16 cur_status) |
| 99 | 99 | { |
| 100 | | cr1 = cur_status | (playtype << 7) | 0x00 | (cdda_repeat_count & 0xf); //options << 4 | repeat & 0xf |
| 101 | | cr2 = (cur_track == 0xff) ? 0xffff : (cdrom_get_adr_control(cdrom, cur_track)<<8 | cur_track); // TODO: fix current track |
| 102 | | cr3 = (get_track_index()<<8) | (cd_curfad>>16); //index & 0xff00 |
| 103 | | cr4 = cd_curfad; |
| 100 | if ((cd_stat & 0x0f00) == CD_STAT_SEEK) |
| 101 | { |
| 102 | /* During seek state, values returned are from the target position */ |
| 103 | UINT8 seek_track = cdrom_get_track(cdrom, cd_fad_seek-150); |
| 104 | |
| 105 | cr1 = cur_status | (playtype << 7) | 0x00 | (cdda_repeat_count & 0xf); |
| 106 | cr2 = (seek_track == 0xff) ? 0xffff : ((cdrom_get_adr_control(cdrom, seek_track)<<8) | seek_track); |
| 107 | cr3 = (get_track_index(cd_fad_seek)<<8) | (cd_fad_seek>>16); //index & 0xff00 |
| 108 | cr4 = cd_fad_seek; |
| 109 | } |
| 110 | else |
| 111 | { |
| 112 | cr1 = cur_status | (playtype << 7) | 0x00 | (cdda_repeat_count & 0xf); //options << 4 | repeat & 0xf |
| 113 | cr2 = (cur_track == 0xff) ? 0xffff : (cdrom_get_adr_control(cdrom, cur_track)<<8 | cur_track); // TODO: fix current track |
| 114 | cr3 = (get_track_index(cd_curfad)<<8) | (cd_curfad>>16); //index & 0xff00 |
| 115 | cr4 = cd_curfad; |
| 116 | } |
| 104 | 117 | cd_stat |= CD_STAT_PERI; |
| 105 | 118 | } |
| 106 | 119 | |
| r21235 | r21236 | |
| 332 | 345 | if(((start_pos)>>8) != 0) |
| 333 | 346 | { |
| 334 | 347 | cur_track = (start_pos)>>8; |
| 335 | | cd_curfad = cdrom_get_track_start(cdrom, cur_track-1); |
| 348 | cd_fad_seek = cdrom_get_track_start(cdrom, cur_track-1); |
| 349 | cd_stat = CD_STAT_SEEK; |
| 350 | cdda_pause_audio( machine().device( "cdda" ), 0 ); |
| 336 | 351 | } |
| 337 | 352 | else |
| 338 | 353 | { |
| r21235 | r21236 | |
| 510 | 525 | xfercount = 0; |
| 511 | 526 | subqbuf[0] = 0x01 | ((cdrom_get_track_type(cdrom, cdrom_get_track(cdrom, track+1)) == CD_TRACK_AUDIO) ? 0x00 : 0x40); |
| 512 | 527 | subqbuf[1] = dec_2_bcd(track+1); |
| 513 | | subqbuf[2] = dec_2_bcd(get_track_index()); |
| 528 | subqbuf[2] = dec_2_bcd(get_track_index(cd_curfad)); |
| 514 | 529 | subqbuf[3] = dec_2_bcd((msf_rel >> 16) & 0xff); |
| 515 | 530 | subqbuf[4] = dec_2_bcd((msf_rel >> 8) & 0xff); |
| 516 | 531 | subqbuf[5] = dec_2_bcd((msf_rel >> 0) & 0xff); |
| r21235 | r21236 | |
| 2427 | 2442 | // loads in data set up by a CD-block PLAY command |
| 2428 | 2443 | void saturn_state::cd_playdata( void ) |
| 2429 | 2444 | { |
| 2445 | if ((cd_stat & 0x0f00) == CD_STAT_SEEK) |
| 2446 | { |
| 2447 | //UINT8 seek_track = cdrom_get_track(cdrom, cd_fad_seek-150); |
| 2448 | |
| 2449 | /* Zero Divide wants this TODO: timings. */ |
| 2450 | if((cd_fad_seek - cd_curfad) > (750*cd_speed)) |
| 2451 | cd_curfad += (750*cd_speed); |
| 2452 | else if((cd_fad_seek < cd_curfad) < (-750*cd_speed)) |
| 2453 | cd_curfad -= (750*cd_speed); |
| 2454 | else |
| 2455 | { |
| 2456 | cd_curfad = cd_fad_seek; |
| 2457 | cd_stat = CD_STAT_PLAY; |
| 2458 | } |
| 2459 | |
| 2460 | #if 0 |
| 2461 | cr1 = cd_stat | 0x00; //options << 4 | repeat & 0xf |
| 2462 | cr2 = (cdrom_get_adr_control(cdrom, seek_track)<<8 | seek_track); |
| 2463 | cr3 = (get_track_index(cd_fad_seek)<<8) | (cd_fad_seek>>16); //index & 0xff00 |
| 2464 | cr4 = cd_fad_seek; |
| 2465 | #endif |
| 2466 | return; |
| 2467 | } |
| 2468 | |
| 2430 | 2469 | if ((cd_stat & 0x0f00) == CD_STAT_PLAY) |
| 2431 | 2470 | { |
| 2432 | 2471 | if (fadstoplay) |
| r21235 | r21236 | |
| 2490 | 2529 | { |
| 2491 | 2530 | if (cdrom) |
| 2492 | 2531 | { |
| 2493 | | cdrom_read_data(cdrom, fad-150, dat, CD_TRACK_MODE1); |
| 2532 | cdrom_read_data(cdrom, fad-150, dat, CD_TRACK_MODE1, true); |
| 2494 | 2533 | } |
| 2495 | 2534 | } |
| 2496 | 2535 | |