Previous 199869 Revisions Next

r21236 Wednesday 20th February, 2013 at 22:32:31 UTC by Angelo Salese
Added preliminary CD Seek mechanism, fixes Zero Divide booting
[src/emu/machine]stvcd.c
[src/mame/includes]stv.h

trunk/src/mame/includes/stv.h
r21235r21236
627627   void stvcd_set_tray_open(void);
628628   void stvcd_set_tray_close(void);
629629
630   int get_track_index(void);
630   int get_track_index(UINT32 fad);
631631   void cr_standard_return(UINT16 cur_status);
632632   void cd_free_block(blockT *blktofree);
633633   void cd_defragblocks(partitionT *part);
r21235r21236
684684   UINT16 hirqmask, hirqreg;
685685   UINT16 cd_stat;
686686   UINT32 cd_curfad;// = 0;
687   UINT32 cd_fad_seek;
687688   UINT32 fadstoplay;// = 0;
688689   UINT32 in_buffer;// = 0;    // amount of data in the buffer
689690   int oddframe;// = 0;
trunk/src/emu/machine/stvcd.c
r21235r21236
7777}
7878
7979/* FIXME: assume Saturn CD-ROMs to have a 2 secs pre-gap for now. */
80int saturn_state::get_track_index(void)
80int saturn_state::get_track_index(UINT32 fad)
8181{
8282   UINT32 rel_fad;
8383   UINT8 track;
8484
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)
8686      return 1;
8787
88   track = cdrom_get_track( cdrom, cd_curfad );
88   track = cdrom_get_track( cdrom, fad );
8989
90   rel_fad = cd_curfad - cdrom_get_track_start( cdrom, track );
90   rel_fad = fad - cdrom_get_track_start( cdrom, track );
9191
9292   if(rel_fad < 150)
9393      return 0;
r21235r21236
9797
9898void saturn_state::cr_standard_return(UINT16 cur_status)
9999{
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   }
104117   cd_stat |= CD_STAT_PERI;
105118}
106119
r21235r21236
332345               if(((start_pos)>>8) != 0)
333346               {
334347                  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 );
336351               }
337352               else
338353               {
r21235r21236
510525               xfercount = 0;
511526               subqbuf[0] = 0x01 | ((cdrom_get_track_type(cdrom, cdrom_get_track(cdrom, track+1)) == CD_TRACK_AUDIO) ? 0x00 : 0x40);
512527               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));
514529               subqbuf[3] = dec_2_bcd((msf_rel >> 16) & 0xff);
515530               subqbuf[4] = dec_2_bcd((msf_rel >> 8) & 0xff);
516531               subqbuf[5] = dec_2_bcd((msf_rel >> 0) & 0xff);
r21235r21236
24272442// loads in data set up by a CD-block PLAY command
24282443void saturn_state::cd_playdata( void )
24292444{
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
24302469   if ((cd_stat & 0x0f00) == CD_STAT_PLAY)
24312470   {
24322471      if (fadstoplay)
r21235r21236
24902529{
24912530   if (cdrom)
24922531   {
2493      cdrom_read_data(cdrom, fad-150, dat, CD_TRACK_MODE1);
2532      cdrom_read_data(cdrom, fad-150, dat, CD_TRACK_MODE1, true);
24942533   }
24952534}
24962535

Previous 199869 Revisions Next


© 1997-2024 The MAME Team