src/mess/machine/pce.c
| r9074 | r9075 | |
| 59 | 59 | |
| 60 | 60 | #define PCE_BRAM_SIZE 0x800 |
| 61 | 61 | #define PCE_ADPCM_RAM_SIZE 0x10000 |
| 62 | #define PCE_ACARD_RAM_SIZE 0x200000 |
| 62 | 63 | #define PCE_CD_COMMAND_BUFFER_SIZE 0x100 |
| 63 | 64 | |
| 64 | 65 | #define PCE_CD_IRQ_TRANSFER_READY 0x40 |
| r9074 | r9075 | |
| 110 | 111 | int data_buffer_size; |
| 111 | 112 | int data_buffer_index; |
| 112 | 113 | 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 | |
| 113 | 121 | UINT32 current_frame; |
| 114 | 122 | UINT32 end_frame; |
| 115 | 123 | UINT32 last_frame; |
| r9074 | r9075 | |
| 1028 | 1036 | memset( pce_cd.command_buffer, 0, PCE_CD_COMMAND_BUFFER_SIZE ); |
| 1029 | 1037 | pce_cd.command_buffer_index = 0; |
| 1030 | 1038 | |
| 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 | |
| 1031 | 1043 | pce_cd.data_buffer = auto_alloc_array(machine, UINT8, 8192 ); |
| 1032 | 1044 | memset( pce_cd.data_buffer, 0, 8192 ); |
| 1033 | 1045 | pce_cd.data_buffer_size = 0; |
| r9074 | r9075 | |
| 1065 | 1077 | |
| 1066 | 1078 | WRITE8_HANDLER( pce_cd_intf_w ) |
| 1067 | 1079 | { |
| 1068 | | logerror("%04X: write to CD interface offset %02X, data %02X\n", cpu_get_pc(space->cpu), offset, data ); |
| 1069 | 1080 | pce_cd_update(space->machine); |
| 1070 | 1081 | |
| 1071 | 1082 | if(offset & 0x200 && pce_sys3_card) // emulate Arcade Card |
| 1072 | 1083 | return pce_cd_acard_w(space,offset,data); |
| 1073 | 1084 | |
| 1085 | logerror("%04X: write to CD interface offset %02X, data %02X\n", cpu_get_pc(space->cpu), offset, data ); |
| 1086 | |
| 1074 | 1087 | switch( offset ) |
| 1075 | 1088 | { |
| 1076 | 1089 | case 0x00: /* CDC status */ |
| r9074 | r9075 | |
| 1202 | 1215 | { |
| 1203 | 1216 | UINT8 data = pce_cd.regs[offset & 0x0F]; |
| 1204 | 1217 | |
| 1205 | | logerror("%04X: read from CD interface offset %02X\n", cpu_get_pc(space->cpu), offset ); |
| 1206 | 1218 | pce_cd_update(space->machine); |
| 1207 | 1219 | |
| 1208 | 1220 | if(offset & 0x200 && pce_sys3_card) // emulate Arcade Card |
| 1209 | 1221 | return pce_cd_acard_r(space,offset); |
| 1210 | 1222 | |
| 1223 | logerror("%04X: read from CD interface offset %02X\n", cpu_get_pc(space->cpu), offset ); |
| 1224 | |
| 1211 | 1225 | switch( offset ) |
| 1212 | 1226 | { |
| 1213 | 1227 | case 0x00: /* CDC status */ |
| r9074 | r9075 | |
| 1287 | 1301 | { |
| 1288 | 1302 | switch(offset & 0x2ef) |
| 1289 | 1303 | { |
| 1304 | case 0x2e5: return pce_cd.acard_latch; |
| 1305 | case 0x2ee: return 0x10; |
| 1290 | 1306 | case 0x2ef: return 0x51; |
| 1291 | 1307 | } |
| 1308 | |
| 1309 | return 0; |
| 1292 | 1310 | } |
| 1293 | 1311 | |
| 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 | |
| 1294 | 1349 | return 0; |
| 1295 | 1350 | } |
| 1296 | 1351 | |
| 1297 | 1352 | WRITE8_HANDLER( pce_cd_acard_w ) |
| 1298 | 1353 | { |
| 1299 | 1354 | // 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 | } |
| 1300 | 1403 | } |