Previous 15994 Revisions Next

r9115 Monday 13th September, 2010 at 11:55:39 UTC by Angelo Salese
[PCE]: Arcade Card address bits 4-5 is a selector for different index registers, hooked that. Greatly improves compatibility / gfx issues in A-Card games
[src/mess/machine]pce.c

src/mess/machine/pce.c
r9114r9115
129129   /* Arcade Card specific */
130130   UINT8   *acard_ram;
131131   UINT8   acard_latch;
132   UINT8   acard_ctrl;
133   UINT32   acard_base_addr;
134   UINT16   acard_addr_offset;
135   UINT16   acard_addr_inc;
132   UINT8   acard_ctrl[4];
133   UINT32   acard_base_addr[4];
134   UINT16   acard_addr_offset[4];
135   UINT16   acard_addr_inc[4];
136136   UINT32   acard_shift;
137137   UINT8   acard_shift_reg;
138138
r9114r9115
14881488
14891489READ8_HANDLER( pce_cd_acard_r )
14901490{
1491   static UINT8 r_num;
1492
14911493   if((offset & 0x2e0) == 0x2e0)
14921494   {
14931495      switch(offset & 0x2ef)
r9114r9115
15051507      return 0;
15061508   }
15071509
1510   r_num = (offset & 0x30) >> 4;
1511
15081512   switch(offset & 0x0f)
15091513   {
15101514      case 0x00:
15111515      case 0x01:
15121516      {
15131517         UINT8 res;
1514         if(pce_cd.acard_ctrl & 2)
1515            res = pce_cd.acard_ram[(pce_cd.acard_base_addr + pce_cd.acard_addr_offset) & 0x1fffff];
1518         if(pce_cd.acard_ctrl[r_num] & 2)
1519            res = pce_cd.acard_ram[(pce_cd.acard_base_addr[r_num] + pce_cd.acard_addr_offset[r_num]) & 0x1fffff];
15161520         else
1517            res = pce_cd.acard_ram[pce_cd.acard_base_addr & 0x1fffff];
1521            res = pce_cd.acard_ram[pce_cd.acard_base_addr[r_num] & 0x1fffff];
15181522
1519         if(pce_cd.acard_ctrl & 0x1)
1523         if(pce_cd.acard_ctrl[r_num] & 0x1)
15201524         {
1521            if(pce_cd.acard_ctrl & 0x10)
1525            if(pce_cd.acard_ctrl[r_num] & 0x10)
15221526            {
1523               pce_cd.acard_base_addr += pce_cd.acard_addr_inc;
1524               pce_cd.acard_base_addr &= 0xffffff;
1527               pce_cd.acard_base_addr[r_num] += pce_cd.acard_addr_inc[r_num];
1528               pce_cd.acard_base_addr[r_num] &= 0xffffff;
15251529            }
15261530            else
15271531            {
1528               pce_cd.acard_addr_offset += pce_cd.acard_addr_inc;
1532               pce_cd.acard_addr_offset[r_num] += pce_cd.acard_addr_inc[r_num];
15291533            }
15301534         }
15311535
15321536         return res;
15331537      }
1534      case 0x02: return (pce_cd.acard_base_addr >> 0) & 0xff;
1535      case 0x03: return (pce_cd.acard_base_addr >> 8) & 0xff;
1536      case 0x04: return (pce_cd.acard_base_addr >> 16) & 0xff;
1537      case 0x05: return (pce_cd.acard_addr_offset >> 0) & 0xff;
1538      case 0x06: return (pce_cd.acard_addr_offset >> 8) & 0xff;
1539      case 0x07: return (pce_cd.acard_addr_inc >> 0) & 0xff;
1540      case 0x08: return (pce_cd.acard_addr_inc >> 8) & 0xff;
1541      case 0x09: return pce_cd.acard_ctrl;
1538      case 0x02: return (pce_cd.acard_base_addr[r_num] >> 0) & 0xff;
1539      case 0x03: return (pce_cd.acard_base_addr[r_num] >> 8) & 0xff;
1540      case 0x04: return (pce_cd.acard_base_addr[r_num] >> 16) & 0xff;
1541      case 0x05: return (pce_cd.acard_addr_offset[r_num] >> 0) & 0xff;
1542      case 0x06: return (pce_cd.acard_addr_offset[r_num] >> 8) & 0xff;
1543      case 0x07: return (pce_cd.acard_addr_inc[r_num] >> 0) & 0xff;
1544      case 0x08: return (pce_cd.acard_addr_inc[r_num] >> 8) & 0xff;
1545      case 0x09: return pce_cd.acard_ctrl[r_num];
15421546      default:   return 0;
15431547   }
15441548
r9114r9115
15471551
15481552WRITE8_HANDLER( pce_cd_acard_w )
15491553{
1550//   printf("ACARD access W %04x %02x\n",offset,data);
1554   static UINT8 w_num;
15511555
15521556   if((offset & 0x2e0) == 0x2e0)
15531557   {
r9114r9115
15741578   }
15751579   else
15761580   {
1581      w_num = (offset & 0x30) >> 4;
1582
15771583      switch(offset & 0x0f)
15781584      {
15791585         case 0x00:
15801586         case 0x01:
1581            if(pce_cd.acard_ctrl & 2)
1582               pce_cd.acard_ram[(pce_cd.acard_base_addr + pce_cd.acard_addr_offset) & 0x1fffff] = data;
1587            if(pce_cd.acard_ctrl[w_num] & 2)
1588               pce_cd.acard_ram[(pce_cd.acard_base_addr[w_num] + pce_cd.acard_addr_offset[w_num]) & 0x1fffff] = data;
15831589            else
1584               pce_cd.acard_ram[pce_cd.acard_base_addr & 0x1FFFFF] = data;
1590               pce_cd.acard_ram[pce_cd.acard_base_addr[w_num] & 0x1FFFFF] = data;
15851591
1586            if(pce_cd.acard_ctrl & 0x1)
1592            if(pce_cd.acard_ctrl[w_num] & 0x1)
15871593            {
1588               if(pce_cd.acard_ctrl & 0x10)
1594               if(pce_cd.acard_ctrl[w_num] & 0x10)
15891595               {
1590                  pce_cd.acard_base_addr += pce_cd.acard_addr_inc;
1591                  pce_cd.acard_base_addr &= 0xffffff;
1596                  pce_cd.acard_base_addr[w_num] += pce_cd.acard_addr_inc[w_num];
1597                  pce_cd.acard_base_addr[w_num] &= 0xffffff;
15921598               }
15931599               else
15941600               {
1595                  pce_cd.acard_addr_offset += pce_cd.acard_addr_inc;
1601                  pce_cd.acard_addr_offset[w_num] += pce_cd.acard_addr_inc[w_num];
15961602               }
15971603            }
15981604
15991605            break;
16001606
1601         case 0x02: pce_cd.acard_base_addr = (data & 0xff) | (pce_cd.acard_base_addr & 0xffff00);    break;
1602         case 0x03: pce_cd.acard_base_addr = (data << 8) | (pce_cd.acard_base_addr & 0xff00ff);       break;
1603         case 0x04: pce_cd.acard_base_addr = (data << 16) | (pce_cd.acard_base_addr & 0x00ffff);    break;
1604         case 0x05: pce_cd.acard_addr_offset = (data & 0xff) | (pce_cd.acard_addr_offset & 0xff00);    break;
1607         case 0x02: pce_cd.acard_base_addr[w_num] = (data & 0xff) | (pce_cd.acard_base_addr[w_num] & 0xffff00);    break;
1608         case 0x03: pce_cd.acard_base_addr[w_num] = (data << 8) | (pce_cd.acard_base_addr[w_num] & 0xff00ff);       break;
1609         case 0x04: pce_cd.acard_base_addr[w_num] = (data << 16) | (pce_cd.acard_base_addr[w_num] & 0x00ffff);    break;
1610         case 0x05: pce_cd.acard_addr_offset[w_num] = (data & 0xff) | (pce_cd.acard_addr_offset[w_num] & 0xff00);    break;
16051611         case 0x06:
1606            pce_cd.acard_addr_offset = (data << 8) | (pce_cd.acard_addr_offset & 0x00ff);
1612            pce_cd.acard_addr_offset[w_num] = (data << 8) | (pce_cd.acard_addr_offset[w_num] & 0x00ff);
16071613
1608            if((pce_cd.acard_ctrl & 0x60) == 0x40)
1614            if((pce_cd.acard_ctrl[w_num] & 0x60) == 0x40)
16091615            {
1610               pce_cd.acard_base_addr += pce_cd.acard_addr_offset + ((pce_cd.acard_ctrl & 0x08) ? 0xff0000 : 0);
1611               pce_cd.acard_base_addr &= 0xffffff;
1616               pce_cd.acard_base_addr[w_num] += pce_cd.acard_addr_offset[w_num] + ((pce_cd.acard_ctrl[w_num] & 0x08) ? 0xff0000 : 0);
1617               pce_cd.acard_base_addr[w_num] &= 0xffffff;
16121618            }
16131619            break;
1614         case 0x07: pce_cd.acard_addr_inc = (data & 0xff) | (pce_cd.acard_addr_inc & 0xff00);       break;
1615         case 0x08: pce_cd.acard_addr_inc = (data << 8) | (pce_cd.acard_addr_inc & 0x00ff);          break;
1616         case 0x09: pce_cd.acard_ctrl = data & 0x7f;                                     break;
1620         case 0x07: pce_cd.acard_addr_inc[w_num] = (data & 0xff) | (pce_cd.acard_addr_inc[w_num] & 0xff00);       break;
1621         case 0x08: pce_cd.acard_addr_inc[w_num] = (data << 8) | (pce_cd.acard_addr_inc[w_num] & 0x00ff);          break;
1622         case 0x09: pce_cd.acard_ctrl[w_num] = data & 0x7f;                                     break;
16171623         case 0x0a:
1618            if((pce_cd.acard_ctrl & 0x60) == 0x60)
1624            if((pce_cd.acard_ctrl[w_num] & 0x60) == 0x60)
16191625            {
1620               pce_cd.acard_base_addr += pce_cd.acard_addr_offset;
1621               pce_cd.acard_base_addr &= 0xffffff;
1626               pce_cd.acard_base_addr[w_num] += pce_cd.acard_addr_offset[w_num];
1627               pce_cd.acard_base_addr[w_num] &= 0xffffff;
16221628            }
16231629            break;
16241630      }
r9114r9115
16271633
16281634READ8_HANDLER( pce_cd_acard_wram_r )
16291635{
1630   return    pce_cd_acard_r(space,0);
1636   return pce_cd_intf_r(space,0x200 | (offset & 0x6000) >> 9);
16311637}
16321638
16331639WRITE8_HANDLER( pce_cd_acard_wram_w )
16341640{
1635   pce_cd_acard_w(space,0,data);
1641   pce_cd_intf_w(space,0x200 | (offset & 0x6000) >> 9,data);
16361642}
16371643

Previous 15994 Revisions Next


© 1998-2018 The MESS Team