Previous 15994 Revisions Next

r9435 Friday 22nd October, 2010 at 16:13:12 UTC by Angelo Salese
[Mega CD]: Added Seek command
[src/mame/drivers]megadriv.c

src/mame/drivers/megadriv.c
r9434r9435
405405   UINT32   current_frame;
406406   UINT32   end_frame;
407407   UINT32   last_frame;
408   UINT8   first_track;
409   UINT8   last_track;
408410
409411   cdrom_file   *cd;
410412   const cdrom_toc*   toc;
r9434r9435
53295331   "Status",
53305332   "Stop All",
53315333   "Get TOC Info",
5332   "Read",
5334   "Play",
53335335   "Seek",
53345336   "Pause/Stop",
53355337   "Resume",
r9434r9435
54015403
54025404   if ( ! segacd.cd ) // no cd is present
54035405   {
5404      segacd_cdd.buffer[0] = (0) | (segacd_cdd.buffer[0] & 0xf0);
5406      segacd_cdd.scd_status = 0x00;
5407      segacd_cdd.buffer[0] = (0) | (segacd_cdd.scd_status & 0xf0);
54055408      segacd_cdd.buffer[1] = 0;
54065409      segacd_cdd.buffer[2] = 0;
54075410      segacd_cdd.buffer[3] = 0;
r9434r9435
54475450            return;
54485451
54495452         }
5450      case 0x4: //Get First and Last Track Number
5453         case 0x4: //Get First and Last Track Number
54515454         {
54525455            segacd_cdd.scd_status = 0x40;
54535456            segacd_cdd.buffer[0] = (0x4 & 0xf) | (segacd_cdd.scd_status & 0xf0);
5454            segacd_cdd.buffer[1] = dec_2_bcd(1);
5455            segacd_cdd.buffer[2] = dec_2_bcd(segacd.toc->numtrks - 1); // TODO: check me
5457            segacd.first_track = dec_2_bcd(1);
5458            segacd.last_track = dec_2_bcd(segacd.toc->numtrks - 1);
5459            segacd_cdd.buffer[1] = segacd.first_track;
5460            segacd_cdd.buffer[2] = segacd.last_track;
54565461            segacd_cdd.buffer[3] = 0;
54575462            segacd_cdd.buffer[4] = 0;
54585463
r9434r9435
54615466            cdd_hock_irq(machine,1);
54625467         }
54635468         return;
5469         case 0x5: //Get Track Addresses
5470         {
5471            UINT8 track_num;
5472            UINT32 start_frame,end_frame,frame,msf;
5473
5474            track_num = ((segacd_cdd_tx[4] & 0xf) * 10) | (segacd_cdd_tx[5] & 0x0f);
5475
5476            if(track_num > segacd.last_track)
5477               track_num = segacd.last_track;
5478            if(track_num < segacd.first_track)
5479               track_num = segacd.first_track;
5480            start_frame = segacd.toc->tracks[ bcd_2_dec( track_num - 1 ) ].physframeofs;
5481            end_frame = segacd.toc->tracks[ bcd_2_dec( track_num ) ].physframeofs;
5482            frame = end_frame - start_frame;
5483            msf = lba_to_msf( frame );
5484
5485            segacd_cdd.buffer[0] = (0x5 & 0xf) | (segacd_cdd.scd_status & 0xf0);
5486            segacd_cdd.buffer[1] = ((msf >> 16) & 0xff);
5487            segacd_cdd.buffer[2] = ((msf >> 8) & 0xff);
5488            segacd_cdd.buffer[3] = ((msf >> 0) & 0xff);
5489            segacd_cdd.buffer[4] = (track_num % 10) | (( segacd.toc->tracks[track_num-1].trktype == CD_TRACK_AUDIO ) ? 0x80 : 0x00);
5490
5491            printf("%02x %02x %02x %02x %02x\n",segacd_cdd.buffer[0],segacd_cdd.buffer[1],segacd_cdd.buffer[2],segacd_cdd.buffer[3],segacd_cdd.buffer[4]);
5492
5493            cdd_hock_irq(machine,1);
5494         }
54645495         //default: logerror("CDD: unhandled TOC command %s issued\n",segacd_cdd_get_toc_cmd[segacd_cdd_tx[3] & 0xf]);
54655496      }
54665497   }
r9434r9435
54705501
54715502#endif
54725503
5504static void segacd_cdd_seek(running_machine *machine)
5505{
5506   UINT8 m,s,f;
5507   UINT8 track_num;
5508   UINT32 frame;
5509
5510   // TODO: check if tray is open or CD isn't there
5511
5512   segacd_cdd.scd_status = 0x20; //READY flag
5513
5514   m = ((segacd_cdd_tx[2] & 0xf) * 10) | (segacd_cdd_tx[3] & 0x0f);
5515   s = ((segacd_cdd_tx[4] & 0xf) * 10) | (segacd_cdd_tx[5] & 0x0f);
5516   f = ((segacd_cdd_tx[6] & 0xf) * 10) | (segacd_cdd_tx[7] & 0x0f);
5517
5518   frame = (m << 16) | (s << 8) | (f);
5519
5520   track_num = cdrom_get_track(segacd.cd, frame);
5521//   printf("%02x %02x %02x %02x\n",m,s,f,track_num);
5522
5523   segacd_cdd.ctrl &= 0xfeff;
5524   segacd_cdd.ctrl |= (( segacd.toc->tracks[track_num-1].trktype == CD_TRACK_AUDIO ) ? 0x000 : 0x100);
5525
5526   segacd_cdd.buffer[0] = segacd_cdd.scd_status & 0x20; // set READY
5527   segacd_cdd.buffer[1] = 0;
5528   segacd_cdd.buffer[2] = 0;
5529   segacd_cdd.buffer[3] = 0;
5530   segacd_cdd.buffer[4] = 0;
5531
5532   cdd_hock_irq(machine,1);
5533}
5534
54735535static WRITE8_HANDLER( segacd_cdd_tx_w )
54745536{
54755537   //printf("CDD Communication write %02x -> [%02x]\n",data,offset);
r9434r9435
54885550         case 0x0: segacd_cdd_get_status(space->machine); break;
54895551         case 0x1: segacd_cdd_stop_all(space->machine); break;
54905552         case 0x2: segacd_cdd_get_toc_info(space->machine); break;
5553         //case 0x3: segacd_cdd_play(space->machine); break;
5554         case 0x4: segacd_cdd_seek(space->machine); break;
54915555         //default: logerror("CDD: unhandled command %s issued\n",segacd_cdd_cmd[segacd_cdd_tx[0] & 0xf]);
54925556      }
54935557   }

Previous 15994 Revisions Next


© 1998-2018 The MESS Team