Previous 199869 Revisions Next

r19306 Tuesday 4th December, 2012 at 07:38:53 UTC by David Haywood
more neocd / segacd reduction (nw)
[src/mame/machine]megacdcd.c megacdcd.h

trunk/src/mame/machine/megacdcd.c
r19305r19306
322322   SCD_CURLBA = msf_to_lba(msf)-150;
323323   UINT32 end_msf = segacd.toc->tracks[ cdrom_get_track(segacd.cd, SCD_CURLBA) + 1 ].physframeofs;
324324   SCD_CURTRK = cdrom_get_track(segacd.cd, SCD_CURLBA)+1;
325   CDC_UpdateHEAD();
325   LC8951UpdateHeader();
326326   SCD_STATUS = CDD_PLAYINGCDDA;
327327   CDD_STATUS = 0x0102;
328328   set_data_audio_mode();
r19305r19306
340340   UINT32 msf = getmsf_from_regs();
341341   SCD_CURLBA = msf_to_lba(msf)-150;
342342   SCD_CURTRK = cdrom_get_track(segacd.cd, SCD_CURLBA)+1;
343   CDC_UpdateHEAD();
343   LC8951UpdateHeader();
344344   STOP_CDC_READ
345345   SCD_STATUS = CDD_READY;
346346   CDD_STATUS = 0x0200;
r19305r19306
437437void lc89510_temp_device::CDC_Reset(void)
438438{
439439   memset(CDC_BUFFER, 0x00, ((16 * 1024 * 2) + SECTOR_SIZE));
440   CDC_UpdateHEAD();
440   LC8951UpdateHeader();
441441
442   CDC_DMA_ADDRC = CDC_DMACNT = CDC_PT = CDC_SBOUT = CDC_IFCTRL = CDC_CTRLB0 = CDC_CTRLB1 =
443      CDC_CTRLB2 = CDC_HEADB1 = CDC_HEADB2 = CDC_HEADB3 = CDC_STATB0 = CDC_STATB1 = CDC_STATB2 = CDC_DECODE = 0;
442   CDC_DMA_ADDRC = CDC_DMACNT = CDC_PT = LC8951RegistersW[REG_W_SBOUT] = LC8951RegistersW[REG_W_IFCTRL] = LC8951RegistersW[REG_W_CTRL0] = LC8951RegistersW[REG_W_CTRL1] =
443      LC8951RegistersW[REG_W_CTRL2] = LC8951RegistersR[REG_R_HEAD1] = LC8951RegistersR[REG_R_HEAD2] = LC8951RegistersR[REG_R_HEAD3] = LC8951RegistersR[REG_R_STAT0] = LC8951RegistersR[REG_R_STAT1] = LC8951RegistersR[REG_R_STAT2] = CDC_DECODE = 0;
444444
445   CDC_IFSTAT = 0xFF;
445   LC8951RegistersR[REG_R_IFSTAT] = 0xFF;
446446   CDC_WA = SECTOR_SIZE * 2;
447   CDC_HEADB0 = 0x01;
448   CDC_STATB3 = 0x80;
447   LC8951RegistersR[REG_R_HEAD0] = 0x01;
448   LC8951RegistersR[REG_R_STAT3] = 0x80;
449449}
450450
451451
r19305r19306
462462   STOP_CDC_DMA
463463   CDC_REG0 |= 0x8000;
464464   CDC_REG0 &= ~0x4000;
465   CDC_IFSTAT |= 0x08;
465   LC8951RegistersR[REG_R_IFSTAT] |= 0x08;
466466
467   if (CDC_IFCTRL & 0x40)
467   if (LC8951RegistersW[REG_W_IFCTRL] & 0x40)
468468   {
469      CDC_IFSTAT &= ~0x40;
469      LC8951RegistersR[REG_R_IFSTAT] &= ~0x40;
470470      CHECK_SCD_LV5_INTERRUPT
471471   }
472472}
r19305r19306
557557   switch (reg)
558558   {
559559      case REG_R_COMIN:  ret = 0/*COMIN*/;            break;
560      case REG_R_IFSTAT: ret = CDC_IFSTAT;           break;
560      case REG_R_IFSTAT: ret = LC8951RegistersR[REG_R_IFSTAT];           break;
561561      case REG_R_DBCL:   ret = CDC_DMACNT & 0xff;       break;
562562      case REG_R_DBCH:   ret = (CDC_DMACNT >>8) & 0xff; break;
563      case REG_R_HEAD0:  ret = CDC_HEADB0;           break;
564      case REG_R_HEAD1:  ret = CDC_HEADB1;           break;
565      case REG_R_HEAD2:  ret = CDC_HEADB2;           break;
566      case REG_R_HEAD3:  ret = CDC_HEADB3;           break;
563      case REG_R_HEAD0:  ret = LC8951RegistersR[REG_R_HEAD0];           break;
564      case REG_R_HEAD1:  ret = LC8951RegistersR[REG_R_HEAD1];           break;
565      case REG_R_HEAD2:  ret = LC8951RegistersR[REG_R_HEAD2];           break;
566      case REG_R_HEAD3:  ret = LC8951RegistersR[REG_R_HEAD3];           break;
567567      case REG_R_PTL:      ret = CDC_PT & 0xff;        break;
568568      case REG_R_PTH:      ret = (CDC_PT >>8) & 0xff;  break;
569569      case REG_R_WAL:    ret = CDC_WA & 0xff;        break;
570570      case REG_R_WAH:    ret = (CDC_WA >>8) & 0xff;  break;
571      case REG_R_STAT0:  ret = CDC_STATB0;           break;
572      case REG_R_STAT1:  ret = CDC_STATB1;           break;
573      case REG_R_STAT2:  ret = CDC_STATB2;           break;
574      case REG_R_STAT3:  ret = CDC_STATB3;
571      case REG_R_STAT0:  ret = LC8951RegistersR[REG_R_STAT0];           break;
572      case REG_R_STAT1:  ret = LC8951RegistersR[REG_R_STAT1];           break;
573      case REG_R_STAT2:  ret = LC8951RegistersR[REG_R_STAT2];           break;
574      case REG_R_STAT3:  ret = LC8951RegistersR[REG_R_STAT3];
575575
576         CDC_IFSTAT |= 0x20;
576         LC8951RegistersR[REG_R_IFSTAT] |= 0x20;
577577
578578         // ??
579         if ((CDC_CTRLB0 & 0x80) && (CDC_IFCTRL & 0x20))
579         if ((LC8951RegistersW[REG_W_CTRL0] & 0x80) && (LC8951RegistersW[REG_W_IFCTRL] & 0x20))
580580         {
581581            if ((CDC_DECODE & decoderegs) == decoderegs)
582            CDC_STATB3 = 0x80;
582            LC8951RegistersR[REG_R_STAT3] = 0x80;
583583         }
584584         break;
585585   }
r19305r19306
599599   switch (reg)
600600   {
601601   case REG_W_SBOUT:
602         CDC_SBOUT = data;
602         LC8951RegistersW[REG_W_SBOUT] = data;
603603         break;
604604
605605   case REG_W_IFCTRL:
606         CDC_IFCTRL = data;
606         LC8951RegistersW[REG_W_IFCTRL] = data;
607607
608         if (!(CDC_IFCTRL & 0x02))
608         if (!(LC8951RegistersW[REG_W_IFCTRL] & 0x02))
609609         {
610610            CDC_DMACNT = 0;
611611            STOP_CDC_DMA;
612            CDC_IFSTAT |= 0x08;
612            LC8951RegistersR[REG_R_IFSTAT] |= 0x08;
613613         }
614614         break;
615615
r19305r19306
619619   case REG_W_DACH: CDC_DMA_ADDRC = (CDC_DMA_ADDRC &~ 0xff00) | (data & 0x00ff) << 8; break;
620620
621621   case REG_W_DTTRG:
622         if (CDC_IFCTRL & 0x02)
622         if (LC8951RegistersW[REG_W_IFCTRL] & 0x02)
623623         {
624            CDC_IFSTAT &= ~0x08;
624            LC8951RegistersR[REG_R_IFSTAT] &= ~0x08;
625625            SET_CDC_DMA;
626626            CDC_REG0 &= ~0x8000;
627627         }
628628         break;
629629
630   case REG_W_DTACK: CDC_IFSTAT |= 0x40; break;
630   case REG_W_DTACK: LC8951RegistersR[REG_R_IFSTAT] |= 0x40; break;
631631   case REG_W_WAL: CDC_WA = (CDC_WA &~ 0x00ff) | (data & 0x00ff) << 0; break;
632632   case REG_W_WAH:   CDC_WA = (CDC_WA &~ 0xff00) | (data & 0x00ff) << 8;   break;
633   case REG_W_CTRL0: CDC_CTRLB0 = data; break;
634   case REG_W_CTRL1: CDC_CTRLB1 = data; break;
633   case REG_W_CTRL0: LC8951RegistersW[REG_W_CTRL0] = data; break;
634   case REG_W_CTRL1: LC8951RegistersW[REG_W_CTRL1] = data; break;
635635   case REG_W_PTL: CDC_PT = (CDC_PT &~ 0x00ff) | (data & 0x00ff) << 0; break;
636636   case REG_W_PTH: CDC_PT = (CDC_PT &~ 0xff00) | (data & 0x00ff) << 8;   break;
637   case REG_W_CTRL2: CDC_CTRLB2 = data; break;
637   case REG_W_CTRL2: LC8951RegistersW[REG_W_CTRL2] = data; break;
638638   case REG_W_RESET: CDC_Reset();       break;
639639   }
640640}
r19305r19306
14651465}
14661466
14671467
1468void lc89510_temp_device::CDC_UpdateHEAD(void) // segacd
1469{
1470   if (CDC_CTRLB1 & 0x01)
1471   {
1472      CDC_HEADB0 = CDC_HEADB1 = CDC_HEADB2 = CDC_HEADB3 = 0x00;
1473   }
1474   else
1475   {
1476      UINT32 msf = lba_to_msf_alt(SCD_CURLBA+150);
1477      CDC_HEADB0 = to_bcd (((msf & 0x00ff0000)>>16), true);
1478      CDC_HEADB1 = to_bcd (((msf & 0x0000ff00)>>8), true);
1479      CDC_HEADB2 = to_bcd (((msf & 0x000000ff)>>0), true);
1480      CDC_HEADB3 = 0x01;
1481   }
1482}
1483
14841468void lc89510_temp_device::LC8951UpdateHeader() // neocd
14851469{
14861470
r19305r19306
17061690
17071691void lc89510_temp_device::scd_ctrl_checks(running_machine& machine)
17081692{
1709   CDC_STATB0 = 0x80;
1693   LC8951RegistersR[REG_R_STAT0] = 0x80;
17101694
1711   (CDC_CTRLB0 & 0x10) ? (CDC_STATB2 = CDC_CTRLB1 & 0x08) : (CDC_STATB2 = CDC_CTRLB1 & 0x0C);
1712   (CDC_CTRLB0 & 0x02) ? (CDC_STATB3 = 0x20) : (CDC_STATB3 = 0x00);
1695   (LC8951RegistersW[REG_W_CTRL0] & 0x10) ? (LC8951RegistersR[REG_R_STAT2] = LC8951RegistersW[REG_W_CTRL1] & 0x08) : (LC8951RegistersR[REG_R_STAT2] = LC8951RegistersW[REG_W_CTRL1] & 0x0C);
1696   (LC8951RegistersW[REG_W_CTRL0] & 0x02) ? (LC8951RegistersR[REG_R_STAT3] = 0x20) : (LC8951RegistersR[REG_R_STAT3] = 0x00);
17131697
1714   if (CDC_IFCTRL & 0x20)
1698   if (LC8951RegistersW[REG_W_IFCTRL] & 0x20)
17151699   {
17161700      CHECK_SCD_LV5_INTERRUPT
1717      CDC_IFSTAT &= ~0x20;
1701      LC8951RegistersR[REG_R_IFSTAT] &= ~0x20;
17181702      CDC_DECODE = 0;
17191703   }
17201704}
r19305r19306
17381722   if (data_track)
17391723      cdrom_read_data(segacd.cd, SCD_CURLBA, SCD_BUFFER, CD_TRACK_MODE1);
17401724
1741   CDC_UpdateHEAD();
1725   LC8951UpdateHeader();
17421726
17431727   if (!data_track)
17441728   {
17451729      scd_advance_current_readpos();
17461730   }
17471731
1748   if (CDC_CTRLB0 & 0x80)
1732   if (LC8951RegistersW[REG_W_CTRL0] & 0x80)
17491733   {
1750      if (CDC_CTRLB0 & 0x04)
1734      if (LC8951RegistersW[REG_W_CTRL0] & 0x04)
17511735      {
17521736         if (data_track)
17531737         {
17541738            scd_advance_current_readpos();
17551739
17561740            memcpy(&CDC_BUFFER[CDC_PT + 4], SCD_BUFFER, 2048);
1757            CDC_BUFFER[CDC_PT+0] = CDC_HEADB0;
1758            CDC_BUFFER[CDC_PT+1] = CDC_HEADB1;
1759            CDC_BUFFER[CDC_PT+2] = CDC_HEADB2;
1760            CDC_BUFFER[CDC_PT+3] = CDC_HEADB3;
1741            CDC_BUFFER[CDC_PT+0] = LC8951RegistersR[REG_R_HEAD0];
1742            CDC_BUFFER[CDC_PT+1] = LC8951RegistersR[REG_R_HEAD1];
1743            CDC_BUFFER[CDC_PT+2] = LC8951RegistersR[REG_R_HEAD2];
1744            CDC_BUFFER[CDC_PT+3] = LC8951RegistersR[REG_R_HEAD3];
17611745         }
17621746         else
17631747         {
trunk/src/mame/machine/megacdcd.h
r19305r19306
187187   UINT16 CDC_REG0;
188188   UINT16 CDC_REG1;
189189   UINT16 CDC_DMA_ADDR;
190   UINT16 CDC_IFSTAT;
191   UINT8 CDC_HEADB0;
192   UINT8 CDC_HEADB1;
193   UINT8 CDC_HEADB2;
194   UINT8 CDC_HEADB3;
195   UINT8 CDC_STATB0;
196   UINT8 CDC_STATB1;
197   UINT8 CDC_STATB2;
198   UINT8 CDC_STATB3;
199   UINT16 CDC_SBOUT;
200   UINT16 CDC_IFCTRL;
201   UINT8 CDC_CTRLB0;
202   UINT8 CDC_CTRLB1;
203   UINT8 CDC_CTRLB2;
190
204191   UINT8 CDC_BUFFER[(32 * 1024 * 2) + SECTOR_SIZE];
205192
206   UINT32 CDD_STATUS;
207   UINT32 CDD_MIN;
208   UINT32 CDD_SEC;
209193
210194   UINT8 CDD_RX[10];
211195   UINT8 CDD_TX[10];
196
197   UINT32 CDD_STATUS;
198   UINT32 CDD_MIN;
199   UINT32 CDD_SEC;
212200   UINT32 CDD_FRAME;
213201   UINT32 CDD_EXT;
202
214203   UINT16 CDD_CONTROL;
204
215205   INT16  CDD_DONE;
216206
217207   inline int to_bcd(int val, bool byte);
218208   void set_data_audio_mode(void);
219209   void CDD_DoChecksum(void);
220210   void CDD_Export(void);
221   void CDC_UpdateHEAD(void);
222211   void scd_ctrl_checks(running_machine& machine);
223212   void scd_advance_current_readpos(void);
224213   int Read_LBA_To_Buffer(running_machine& machine);

Previous 199869 Revisions Next


© 1997-2024 The MAME Team