Previous 199869 Revisions Next

r21104 Friday 15th February, 2013 at 20:46:14 UTC by Angelo Salese
(MESS) Added hook-up for CD Block command 0x64 (Put Sector Data) [Angelo Salese]
[src/emu/machine]stvcd.c
[src/mame/includes]stv.h

trunk/src/mame/includes/stv.h
r21103r21104
631631   UINT16 cd_readWord(UINT32 addr);
632632   void cd_writeWord(UINT32 addr, UINT16 data);
633633   UINT32 cd_readLong(UINT32 addr);
634   void cd_writeLong(UINT32 addr, UINT32 data);
634635
635636   void cd_readTOC(void);
636637   void cd_readblock(UINT32 fad, UINT8 *dat);
trunk/src/emu/machine/stvcd.c
r21103r21104
10391039      case 0x64:    // put sector data
10401040         /* TODO: After Burner 2, Out Run, Fantasy Zone and Dungeon Master Nexus trips this */
10411041         {
1042            UINT8 sectnum = cr4 & 0xff;
1043            UINT8 bufnum = cr3>>8;
1042            UINT32 sectnum = cr4 & 0xff;
1043            UINT32 sectofs = cr2;
1044            UINT32 bufnum = cr3>>8;
10441045
10451046            xfertype32 = XFERTYPE32_PUTSECTOR;
10461047
1048            /*TODO: eventual errors? */
1049
1050            cd_getsectoroffsetnum(bufnum, &sectofs, &sectnum);
1051
1052
10471053            cd_stat |= CD_STAT_TRANS;
10481054
10491055            xferoffs = 0;
10501056            xfersect = 0;
10511057            xferdnum = 0;
1052            xfersectpos = 0;
1058            xfersectpos = sectofs;
10531059            xfersectnum = sectnum;
10541060            transpart = &partitions[bufnum];
1061
1062            // allocate the blocks
1063            for (int i = xfersectpos; i < xfersectpos+xfersectnum; i++)
1064            {
1065               transpart->blocks[i] = cd_alloc_block(&transpart->bnum[i]);
1066               transpart->size += transpart->blocks[i]->size;
1067               transpart->numblks++;
1068            }
10551069         }
10561070
1057         hirqreg |= (CMOK|ECPY|DRDY);
1071         hirqreg |= (CMOK|ECPY|DRDY); // TODO: is ECPY ok?
10581072         cr_standard_return(cd_stat);
10591073         break;
10601074
r21103r21104
17001714   }
17011715}
17021716
1717void saturn_state::cd_writeLong(UINT32 addr, UINT32 data)
1718{
1719   switch (addr & 0xffff)
1720   {
1721      case 0x8000:
1722         switch (xfertype32)
1723         {
1724            case XFERTYPE32_PUTSECTOR:
1725               // make sure we have sectors left
1726               if (xfersect < xfersectnum)
1727               {
1728                  // get next longword
1729                  transpart->blocks[xfersectpos+xfersect]->data[xferoffs + 0] = (data >> 24) & 0xff;
1730                  transpart->blocks[xfersectpos+xfersect]->data[xferoffs + 1] = (data >> 16) & 0xff;
1731                  transpart->blocks[xfersectpos+xfersect]->data[xferoffs + 2] = (data >> 8) & 0xff;
1732                  transpart->blocks[xfersectpos+xfersect]->data[xferoffs + 3] = (data >> 0) & 0xff;
1733
1734                  xferdnum += 4;
1735                  xferoffs += 4;
1736
1737                  // did we run out of sector?
1738                  if (xferoffs >= transpart->blocks[xfersectpos+xfersect]->size)
1739                  {
1740                     CDROM_LOG(("CD: finished xfer of block %d of %d\n", xfersect+1, xfersectnum))
1741
1742                     xferoffs = 0;
1743                     xfersect++;
1744                  }
1745               }
1746               else    // sectors are done
1747               {
1748                  xfertype32 = XFERTYPE32_INVALID;
1749               }
1750               break;
1751
1752            default:
1753               printf("CD: unhandled 32-bit transfer type write\n");
1754               break;
1755         }
1756         break;
1757
1758      default:
1759         break;
1760   }
1761}
1762
17031763void saturn_state::cd_writeWord(UINT32 addr, UINT16 data)
17041764{
17051765   switch(addr & 0xffff)
r21103r21104
18091869
18101870   switch (offset)
18111871   {
1872      case 0x18000:
1873         if (mem_mask == 0xffffffff)
1874            cd_writeLong(offset, data);
1875         else
1876            printf("CD: Unknown data buffer write @ mask = %08x\n", mem_mask);
1877         break;
1878
18121879      case 0x90008:
18131880      case 0x9000a:
18141881      case 0x9000c:

Previous 199869 Revisions Next


© 1997-2024 The MAME Team