Previous 15994 Revisions Next

r9075 Thursday 9th September, 2010 at 12:21:23 UTC by Angelo Salese
[PCECD]: Some extra Arcade Card work RAM hooks
[src/mess/machine]pce.c

src/mess/machine/pce.c
r9074r9075
5959
6060#define PCE_BRAM_SIZE            0x800
6161#define PCE_ADPCM_RAM_SIZE         0x10000
62#define PCE_ACARD_RAM_SIZE         0x200000
6263#define PCE_CD_COMMAND_BUFFER_SIZE   0x100
6364
6465#define PCE_CD_IRQ_TRANSFER_READY   0x40
r9074r9075
110111   int      data_buffer_size;
111112   int      data_buffer_index;
112113   int      data_transferred;
114   UINT8   *acard_ram;
115   UINT8   acard_latch;
116   UINT8   acard_ctrl;
117   UINT32   acard_base_addr;
118   UINT16   acard_addr_offset;
119   UINT16   acard_addr_inc;
120
113121   UINT32   current_frame;
114122   UINT32   end_frame;
115123   UINT32   last_frame;
r9074r9075
10281036   memset( pce_cd.command_buffer, 0, PCE_CD_COMMAND_BUFFER_SIZE );
10291037   pce_cd.command_buffer_index = 0;
10301038
1039   /* Set up Arcade Card RAM buffer */
1040   pce_cd.acard_ram = auto_alloc_array(machine, UINT8, PCE_ACARD_RAM_SIZE );
1041   memset( pce_cd.acard_ram, 0, PCE_ACARD_RAM_SIZE );
1042
10311043   pce_cd.data_buffer = auto_alloc_array(machine, UINT8, 8192 );
10321044   memset( pce_cd.data_buffer, 0, 8192 );
10331045   pce_cd.data_buffer_size = 0;
r9074r9075
10651077
10661078WRITE8_HANDLER( pce_cd_intf_w )
10671079{
1068   logerror("%04X: write to CD interface offset %02X, data %02X\n", cpu_get_pc(space->cpu), offset, data );
10691080   pce_cd_update(space->machine);
10701081
10711082   if(offset & 0x200 && pce_sys3_card) // emulate Arcade Card
10721083      return pce_cd_acard_w(space,offset,data);
10731084
1085   logerror("%04X: write to CD interface offset %02X, data %02X\n", cpu_get_pc(space->cpu), offset, data );
1086
10741087   switch( offset )
10751088   {
10761089   case 0x00:   /* CDC status */
r9074r9075
12021215{
12031216   UINT8 data = pce_cd.regs[offset & 0x0F];
12041217
1205   logerror("%04X: read from CD interface offset %02X\n", cpu_get_pc(space->cpu), offset );
12061218   pce_cd_update(space->machine);
12071219
12081220   if(offset & 0x200 && pce_sys3_card) // emulate Arcade Card
12091221      return pce_cd_acard_r(space,offset);
12101222
1223   logerror("%04X: read from CD interface offset %02X\n", cpu_get_pc(space->cpu), offset );
1224
12111225   switch( offset )
12121226   {
12131227   case 0x00:   /* CDC status */
r9074r9075
12871301   {
12881302      switch(offset & 0x2ef)
12891303      {
1304         case 0x2e5: return pce_cd.acard_latch;
1305         case 0x2ee: return 0x10;
12901306         case 0x2ef: return 0x51;
12911307      }
1308
1309      return 0;
12921310   }
12931311
1312   switch(offset & 0x0f)
1313   {
1314      case 0x00:
1315      case 0x01:
1316      {
1317         UINT8 res;
1318         if(pce_cd.acard_ctrl & 2)
1319            res = pce_cd.acard_ram[(pce_cd.acard_base_addr + pce_cd.acard_addr_offset) & 0x1FFFFF];
1320         else
1321            res = pce_cd.acard_ram[pce_cd.acard_base_addr & 0x1FFFFF];
1322
1323         if(pce_cd.acard_ctrl & 0x1)
1324         {
1325            if(pce_cd.acard_ctrl & 0x10)
1326            {
1327               pce_cd.acard_base_addr += pce_cd.acard_addr_inc;
1328               pce_cd.acard_base_addr &= 0xffffff;
1329            }
1330            else
1331            {
1332               pce_cd.acard_addr_offset += pce_cd.acard_addr_inc;
1333
1334            }
1335         }
1336
1337         return res;
1338      }
1339      case 0x02: return (pce_cd.acard_base_addr >> 0) & 0xff;
1340      case 0x03: return (pce_cd.acard_base_addr >> 8) & 0xff;
1341      case 0x04: return (pce_cd.acard_base_addr >> 16) & 0xff;
1342      case 0x05: return (pce_cd.acard_addr_offset >> 0) & 0xff;
1343      case 0x06: return (pce_cd.acard_addr_offset >> 8) & 0xff;
1344      case 0x07: return (pce_cd.acard_addr_inc >> 0) & 0xff;
1345      case 0x08: return (pce_cd.acard_addr_inc >> 8) & 0xff;
1346      case 0x09: return pce_cd.acard_ctrl;
1347   }
1348
12941349   return 0;
12951350}
12961351
12971352WRITE8_HANDLER( pce_cd_acard_w )
12981353{
12991354//   printf("ACARD access W %04x %02x\n",offset,data);
1355
1356   if((offset & 0x2e0) == 0x2e0)
1357   {
1358      switch(offset & 0x0f)
1359      {
1360         case 5: pce_cd.acard_latch = data; break;
1361      }
1362   }
1363   else
1364   {
1365      switch(offset & 0x0f)
1366      {
1367         case 0x00:
1368         case 0x01:
1369            if(pce_cd.acard_ctrl & 2)
1370               pce_cd.acard_ram[(pce_cd.acard_base_addr + pce_cd.acard_addr_offset) & 0x1FFFFF] = data;
1371            else
1372               pce_cd.acard_ram[pce_cd.acard_base_addr & 0x1FFFFF] = data;
1373
1374            if(pce_cd.acard_ctrl & 0x1)
1375            {
1376               if(pce_cd.acard_ctrl & 0x10)
1377               {
1378                  pce_cd.acard_base_addr += pce_cd.acard_addr_inc;
1379                  pce_cd.acard_base_addr &= 0xffffff;
1380               }
1381               else
1382               {
1383                  pce_cd.acard_addr_offset += pce_cd.acard_addr_inc;
1384
1385               }
1386            }
1387
1388            break;
1389
1390         case 0x02: pce_cd.acard_base_addr = (data & 0xff) | (pce_cd.acard_base_addr & 0xffff00);    break;
1391         case 0x03: pce_cd.acard_base_addr = (data << 8) | (pce_cd.acard_base_addr & 0xff00ff);       break;
1392         case 0x04: pce_cd.acard_base_addr = (data << 16) | (pce_cd.acard_base_addr & 0x00ffff);    break;
1393         case 0x05: pce_cd.acard_addr_offset = (data & 0xff) | (pce_cd.acard_addr_offset & 0xff00);    break;
1394         case 0x06:
1395            pce_cd.acard_addr_offset = (data << 8) | (pce_cd.acard_addr_offset & 0x00ff);
1396
1397            break;
1398         case 0x07: pce_cd.acard_addr_inc = (data & 0xff) | (pce_cd.acard_addr_inc & 0xff00);       break;
1399         case 0x08: pce_cd.acard_addr_inc = (data << 8) | (pce_cd.acard_addr_inc & 0x00ff);          break;
1400         case 0x09: pce_cd.acard_ctrl = data & 0x7f;                                     break;
1401      }
1402   }
13001403}

Previous 15994 Revisions Next


© 1998-2018 The MESS Team