Previous 199869 Revisions Next

r19315 Wednesday 5th December, 2012 at 00:54:43 UTC by David Haywood
scd / ncd stuff (nw)
[src/mame/machine]megacd.c megacd.h megacdcd.c megacdcd.h

trunk/src/mame/machine/megacd.c
r19314r19315
17531753}
17541754
17551755// todo: tidy up, too many CDC internals here
1756void sega_segacd_device::SegaCD_CDC_Do_DMA(int &dmacount, UINT8 *CDC_BUFFER, UINT16 &CDC_DMA_ADDR, UINT16 &CDC_DMA_ADDRC, UINT16 &destination )
1756void sega_segacd_device::SegaCD_CDC_Do_DMA(int &dmacount, UINT8 *CDC_BUFFER, UINT16 &SEGACD_DMA_ADDRESS, UINT16 &dma_addrc, UINT16 &destination )
17571757{
17581758   int length = dmacount;
17591759   UINT8 *dest;
r19314r19315
17651765
17661766   if (destination==DMA_PCM)
17671767   {
1768      dstoffset = (CDC_DMA_ADDR & 0x03FF) << 2;
1768      dstoffset = (SEGACD_DMA_ADDRESS & 0x03FF) << 2;
17691769      PCM_DMA = true;
17701770   }
17711771   else
17721772   {
1773      dstoffset = (CDC_DMA_ADDR & 0xFFFF) << 3;
1773      dstoffset = (SEGACD_DMA_ADDRESS & 0xFFFF) << 3;
17741774   }
17751775
17761776
17771777   while (dmacount--)
17781778   {
1779      UINT16 data = (CDC_BUFFER[CDC_DMA_ADDRC+srcoffset]<<8) | CDC_BUFFER[CDC_DMA_ADDRC+srcoffset+1];
1779      UINT16 data = (CDC_BUFFER[dma_addrc+srcoffset]<<8) | CDC_BUFFER[dma_addrc+srcoffset+1];
17801780
17811781      if (destination==DMA_PRG)
17821782      {
r19314r19315
18491849
18501850   if (PCM_DMA)
18511851   {
1852      CDC_DMA_ADDR += length >> 1;
1852      SEGACD_DMA_ADDRESS += length >> 1;
18531853   }
18541854   else
18551855   {
1856      CDC_DMA_ADDR += length >> 2;
1856      SEGACD_DMA_ADDRESS += length >> 2;
18571857   }
18581858}
18591859
trunk/src/mame/machine/megacd.h
r19314r19315
365365   READ16_MEMBER( segacd_font_converted_r );
366366   TIMER_DEVICE_CALLBACK_MEMBER( scd_dma_timer_callback );
367367
368   void SegaCD_CDC_Do_DMA( int &dmacount, UINT8 *CDC_BUFFER, UINT16 &CDC_DMA_ADDR, UINT16 &CDC_DMA_ADDRC, UINT16 &destination );
368   void SegaCD_CDC_Do_DMA( int &dmacount, UINT8 *CDC_BUFFER, UINT16 &SEGACD_DMA_ADDRESS, UINT16 &dma_addrc, UINT16 &destination );
369369   timer_device* scd_dma_timer;
370370
371371protected:
trunk/src/mame/machine/megacdcd.c
r19314r19315
5353}
5454
5555// HACK for DMA handling, this gets replaced
56void lc89510_temp_device::Fake_CDC_Do_DMA(int &dmacount, UINT8 *CDC_BUFFER, UINT16 &CDC_DMA_ADDR, UINT16 &CDC_DMA_ADDRC, UINT16 &destination )
56void lc89510_temp_device::Fake_CDC_Do_DMA(int &dmacount, UINT8 *CDC_BUFFER, UINT16 &SEGACD_DMA_ADDRESS, UINT16 &dma_addrc, UINT16 &destination )
5757{
5858   fatalerror("Fake_CDC_Do_DMA\n");
5959}
r19314r19315
439439   memset(CDC_BUFFER, 0x00, ((16 * 1024 * 2) + SECTOR_SIZE));
440440   LC8951UpdateHeader();
441441
442   CDC_DMA_ADDRC = CDC_DMACNT = CDC_PT = LC8951RegistersW[REG_W_SBOUT] = LC8951RegistersW[REG_W_IFCTRL] = LC8951RegistersW[REG_W_CTRL0] = LC8951RegistersW[REG_W_CTRL1] =
442   LC8951RegistersW[REG_W_DACL] = LC8951RegistersW[REG_W_DACH] = LC8951RegistersW[REG_W_DBCL] = LC8951RegistersW[REG_W_DBCH] = LC8951RegistersW[REG_W_PTH] = LC8951RegistersW[REG_W_PTL] = LC8951RegistersW[REG_W_SBOUT] = LC8951RegistersW[REG_W_IFCTRL] = LC8951RegistersW[REG_W_CTRL0] = LC8951RegistersW[REG_W_CTRL1] =
443443      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
445445   LC8951RegistersR[REG_R_IFSTAT] = 0xFF;
446   CDC_WA = SECTOR_SIZE * 2;
446   int wa = SECTOR_SIZE * 2;
447   LC8951RegistersW[REG_W_WAL] = wa & 0xff; LC8951RegistersW[REG_W_WAH] = (wa >> 8) &0xff;
447448   LC8951RegistersR[REG_R_HEAD0] = 0x01;
448449   LC8951RegistersR[REG_R_STAT3] = 0x80;
449450}
r19314r19315
454455   CDD_Reset();
455456   CDC_Reset();
456457
457   CDC_REG0 = CDC_REG1 = CDC_DMA_ADDR = SCD_STATUS_CDC = CDD_DONE = 0;
458   CDC_REG0 = CDC_REG1 = SEGACD_DMA_ADDRESS = SCD_STATUS_CDC = CDD_DONE = 0;
458459}
459460
460461void lc89510_temp_device::CDC_End_Transfer(running_machine& machine)
r19314r19315
487488      return;
488489   }
489490
490   if (CDC_DMACNT <= (rate * 2))
491   int dma_count_register = LC8951RegistersW[REG_W_DBCL] | (LC8951RegistersW[REG_W_DBCH]<<8);
492
493   if (dma_count_register <= (rate * 2))
491494   {
492      length = (CDC_DMACNT + 1) >> 1;
495      length = (dma_count_register + 1) >> 1;
493496      CDC_End_Transfer(machine);
494497   }
495498   else
r19314r19315
498501
499502   int dmacount = length;
500503
504   UINT16 dma_addrc = LC8951RegistersW[REG_W_DACL] | (LC8951RegistersW[REG_W_DACH]<<8);
505
501506   // HACK
502   segacd_dma_callback(dmacount, CDC_BUFFER, CDC_DMA_ADDR, CDC_DMA_ADDRC, destination );
507   segacd_dma_callback(dmacount, CDC_BUFFER, SEGACD_DMA_ADDRESS, dma_addrc, destination );
503508   
504509
505   CDC_DMA_ADDRC += length*2;
510   dma_addrc += length*2;
511   LC8951RegistersW[REG_W_DACL] = dma_addrc & 0xff; LC8951RegistersW[REG_W_DACH] = (dma_addrc >> 8) & 0xff;
506512
507513   if (SCD_DMA_ENABLED)
508      CDC_DMACNT -= length*2;
514      dma_count_register -= length*2;
509515   else
510      CDC_DMACNT = 0;
516      dma_count_register = 0;
517
518   LC8951RegistersW[REG_W_DBCL] = dma_count_register & 0xff; LC8951RegistersW[REG_W_DBCH] = (dma_count_register>>8) & 0xff;
519
511520}
512521
513522
r19314r19315
521530   {
522531      if (destination == type)
523532      {
524         CDC_DMACNT -= 2;
533         int dma_count_register = LC8951RegistersW[REG_W_DBCL] | (LC8951RegistersW[REG_W_DBCH]<<8);
525534
526         if (CDC_DMACNT <= 0)
535         dma_count_register -= 2;
536
537         if (dma_count_register <= 0)
527538         {
528            if (type==READ_SUB) CDC_DMACNT = 0;
539            if (type==READ_SUB) dma_count_register = 0;
529540
530541            CDC_End_Transfer(machine);
531542         }
532543
533         UINT16 data = (CDC_BUFFER[CDC_DMA_ADDRC]<<8) | CDC_BUFFER[CDC_DMA_ADDRC+1];
534         CDC_DMA_ADDRC += 2;
544         LC8951RegistersW[REG_W_DBCL] = dma_count_register & 0xff; LC8951RegistersW[REG_W_DBCH] = (dma_count_register>>8) & 0xff;
535545
546         UINT16 dma_addrc = LC8951RegistersW[REG_W_DACL] | (LC8951RegistersW[REG_W_DACH]<<8);
547
548         UINT16 data = (CDC_BUFFER[dma_addrc]<<8) | CDC_BUFFER[dma_addrc+1];
549         dma_addrc += 2;
550
551         LC8951RegistersW[REG_W_DACL] = dma_addrc & 0xff; LC8951RegistersW[REG_W_DACH] = (dma_addrc >> 8) & 0xff;
552
553
536554         return data;
537555      }
538556   }
r19314r19315
556574
557575   switch (reg)
558576   {
559      case REG_R_COMIN:  ret = 0/*COMIN*/;            break;
560      case REG_R_IFSTAT: ret = LC8951RegistersR[REG_R_IFSTAT];           break;
561      case REG_R_DBCL:   ret = CDC_DMACNT & 0xff;       break;
562      case REG_R_DBCH:   ret = (CDC_DMACNT >>8) & 0xff; 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;
567      case REG_R_PTL:      ret = CDC_PT & 0xff;        break;
568      case REG_R_PTH:      ret = (CDC_PT >>8) & 0xff;  break;
569      case REG_R_WAL:    ret = CDC_WA & 0xff;        break;
570      case REG_R_WAH:    ret = (CDC_WA >>8) & 0xff;  break;
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;
577      case REG_R_COMIN:  ret = 0/*COMIN*/;                  break;
578      case REG_R_IFSTAT: ret = LC8951RegistersR[REG_R_IFSTAT];   break;
579      case REG_R_DBCL:   ret = LC8951RegistersW[REG_W_DBCL];      break;
580      case REG_R_DBCH:   ret = LC8951RegistersW[REG_W_DBCH];      break;
581      case REG_R_HEAD0:  ret = LC8951RegistersR[REG_R_HEAD0];      break;
582      case REG_R_HEAD1:  ret = LC8951RegistersR[REG_R_HEAD1];      break;
583      case REG_R_HEAD2:  ret = LC8951RegistersR[REG_R_HEAD2];      break;
584      case REG_R_HEAD3:  ret = LC8951RegistersR[REG_R_HEAD3];      break;
585      case REG_R_PTL:      ret = LC8951RegistersW[REG_W_PTL];      break;
586      case REG_R_PTH:      ret = LC8951RegistersW[REG_W_PTH];      break;
587      case REG_R_WAL:    ret = LC8951RegistersW[REG_W_WAL];      break;
588      case REG_R_WAH:    ret = LC8951RegistersW[REG_W_WAH];      break;
589      case REG_R_STAT0:  ret = LC8951RegistersR[REG_R_STAT0];      break;
590      case REG_R_STAT1:  ret = LC8951RegistersR[REG_R_STAT1];      break;
591      case REG_R_STAT2:  ret = LC8951RegistersR[REG_R_STAT2];      break;
574592      case REG_R_STAT3:  ret = LC8951RegistersR[REG_R_STAT3];
575593
576594         LC8951RegistersR[REG_R_IFSTAT] |= 0x20;
577595
578         // ??
579596         if ((LC8951RegistersW[REG_W_CTRL0] & 0x80) && (LC8951RegistersW[REG_W_IFCTRL] & 0x20))
580597         {
581598            if ((CDC_DECODE & decoderegs) == decoderegs)
r19314r19315
607624
608625         if (!(LC8951RegistersW[REG_W_IFCTRL] & 0x02))
609626         {
610            CDC_DMACNT = 0;
627            LC8951RegistersW[REG_W_DBCL] = 0;  LC8951RegistersW[REG_W_DBCH] = 0;
611628            STOP_CDC_DMA;
612629            LC8951RegistersR[REG_R_IFSTAT] |= 0x08;
613630         }
614631         break;
615632
616   case REG_W_DBCL: CDC_DMACNT = (CDC_DMACNT &~ 0x00ff) | (data & 0x00ff) << 0; break;
617   case REG_W_DBCH: CDC_DMACNT = (CDC_DMACNT &~ 0xff00) | (data & 0x00ff) << 8; break;
618   case REG_W_DACL: CDC_DMA_ADDRC = (CDC_DMA_ADDRC &~ 0x00ff) | (data & 0x00ff) << 0; break;
619   case REG_W_DACH: CDC_DMA_ADDRC = (CDC_DMA_ADDRC &~ 0xff00) | (data & 0x00ff) << 8; break;
633   case REG_W_DBCL: LC8951RegistersW[REG_W_DBCL] = data; break;
634   case REG_W_DBCH: LC8951RegistersW[REG_W_DBCH] = data; break;
635   case REG_W_DACL: LC8951RegistersW[REG_W_DACL] = data; break;
636   case REG_W_DACH: LC8951RegistersW[REG_W_DACH] = data; break;
620637
621638   case REG_W_DTTRG:
622639         if (LC8951RegistersW[REG_W_IFCTRL] & 0x02)
r19314r19315
628645         break;
629646
630647   case REG_W_DTACK: LC8951RegistersR[REG_R_IFSTAT] |= 0x40; break;
631   case REG_W_WAL: CDC_WA = (CDC_WA &~ 0x00ff) | (data & 0x00ff) << 0; break;
632   case REG_W_WAH:   CDC_WA = (CDC_WA &~ 0xff00) | (data & 0x00ff) << 8;   break;
648   case REG_W_WAL: LC8951RegistersW[REG_W_WAL] = data; break;
649   case REG_W_WAH:   LC8951RegistersW[REG_W_WAH] = data; break;
633650   case REG_W_CTRL0: LC8951RegistersW[REG_W_CTRL0] = data; break;
634651   case REG_W_CTRL1: LC8951RegistersW[REG_W_CTRL1] = data; break;
635   case REG_W_PTL: CDC_PT = (CDC_PT &~ 0x00ff) | (data & 0x00ff) << 0; break;
636   case REG_W_PTH: CDC_PT = (CDC_PT &~ 0xff00) | (data & 0x00ff) << 8;   break;
652   case REG_W_PTL: LC8951RegistersW[REG_W_PTL] = data; break;
653   case REG_W_PTH: LC8951RegistersW[REG_W_PTH] = data; break;
637654   case REG_W_CTRL2: LC8951RegistersW[REG_W_CTRL2] = data; break;
638655   case REG_W_RESET: CDC_Reset();       break;
639656   }
r19314r19315
879896
880897READ16_MEMBER( lc89510_temp_device::cdc_dmaaddr_r )
881898{
882   return CDC_DMA_ADDR;
899   return SEGACD_DMA_ADDRESS;
883900}
884901
885902WRITE16_MEMBER( lc89510_temp_device::cdc_dmaaddr_w )
886903{
887   COMBINE_DATA(&CDC_DMA_ADDR);
904   COMBINE_DATA(&SEGACD_DMA_ADDRESS);
888905}
889906
890907READ16_MEMBER( lc89510_temp_device::segacd_cdfader_r )
r19314r19315
17071724{
17081725   SCD_CURLBA++;
17091726
1710   CDC_WA += SECTOR_SIZE;
1711   CDC_PT += SECTOR_SIZE;
1727   int pt = LC8951RegistersW[REG_W_PTL] | (LC8951RegistersW[REG_W_PTH] << 8);
1728   int wa = LC8951RegistersW[REG_W_WAL] | (LC8951RegistersW[REG_W_WAH] << 8);
17121729
1713   CDC_WA &= 0x7fff;
1714   CDC_PT &= 0x7fff;
1730   wa += SECTOR_SIZE;
1731   pt += SECTOR_SIZE;
1732
1733   wa &= 0x7fff;
1734   pt &= 0x7fff;
1735
1736   LC8951RegistersW[REG_W_PTL] = pt & 0xff; LC8951RegistersW[REG_W_PTH] = (pt >> 8) &0xff;
1737   LC8951RegistersW[REG_W_WAL] = wa & 0xff; LC8951RegistersW[REG_W_WAH] = (wa >> 8) &0xff;
1738
17151739}
17161740
17171741int lc89510_temp_device::Read_LBA_To_Buffer(running_machine& machine)
r19314r19315
17371761         {
17381762            scd_advance_current_readpos();
17391763
1740            memcpy(&CDC_BUFFER[CDC_PT + 4], SCD_BUFFER, 2048);
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];
1764            int pt = LC8951RegistersW[REG_W_PTL] | (LC8951RegistersW[REG_W_PTH] << 8);
1765
1766            memcpy(&CDC_BUFFER[pt + 4], SCD_BUFFER, 2048);
1767            CDC_BUFFER[pt+0] = LC8951RegistersR[REG_R_HEAD0];
1768            CDC_BUFFER[pt+1] = LC8951RegistersR[REG_R_HEAD1];
1769            CDC_BUFFER[pt+2] = LC8951RegistersR[REG_R_HEAD2];
1770            CDC_BUFFER[pt+3] = LC8951RegistersR[REG_R_HEAD3];
17451771         }
17461772         else
17471773         {
1748            memcpy(&CDC_BUFFER[CDC_PT], SCD_BUFFER, SECTOR_SIZE);
1774            int pt = LC8951RegistersW[REG_W_PTL] | (LC8951RegistersW[REG_W_PTH] << 8);
1775
1776            memcpy(&CDC_BUFFER[pt], SCD_BUFFER, SECTOR_SIZE);
17491777         }
17501778      }
17511779
trunk/src/mame/machine/megacdcd.h
r19314r19315
150150
151151   // HACK for DMA handling
152152   segacd_dma_delegate segacd_dma_callback;
153   void Fake_CDC_Do_DMA(int &dmacount, UINT8 *CDC_BUFFER, UINT16 &CDC_DMA_ADDR, UINT16 &CDC_DMA_ADDRC, UINT16 &destination );
153   void Fake_CDC_Do_DMA(int &dmacount, UINT8 *CDC_BUFFER, UINT16 &SEGACD_DMA_ADDRESS, UINT16 &dma_addrc, UINT16 &destination );
154154   static void set_CDC_Do_DMA(device_t &device,segacd_dma_delegate new_segacd_dma_callback);
155155
156156   static void set_is_neoCD(device_t &device, bool is_neoCD);
r19314r19315
180180
181181
182182   UINT16 CDC_DECODE;
183   INT16 CDC_DMACNT; // can go negative
184   UINT16 CDC_DMA_ADDRC;
185   UINT16 CDC_PT;
186   UINT16 CDC_WA;
187183   UINT16 CDC_REG0;
188184   UINT16 CDC_REG1;
189   UINT16 CDC_DMA_ADDR;
185   UINT16 SEGACD_DMA_ADDRESS;
190186
191187   UINT8 CDC_BUFFER[(32 * 1024 * 2) + SECTOR_SIZE];
192188

Previous 199869 Revisions Next


© 1997-2024 The MAME Team