src/mess/machine/pce.c
| r9114 | r9115 | |
| 129 | 129 | /* Arcade Card specific */ |
| 130 | 130 | UINT8 *acard_ram; |
| 131 | 131 | 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]; |
| 136 | 136 | UINT32 acard_shift; |
| 137 | 137 | UINT8 acard_shift_reg; |
| 138 | 138 | |
| r9114 | r9115 | |
| 1488 | 1488 | |
| 1489 | 1489 | READ8_HANDLER( pce_cd_acard_r ) |
| 1490 | 1490 | { |
| 1491 | static UINT8 r_num; |
| 1492 | |
| 1491 | 1493 | if((offset & 0x2e0) == 0x2e0) |
| 1492 | 1494 | { |
| 1493 | 1495 | switch(offset & 0x2ef) |
| r9114 | r9115 | |
| 1505 | 1507 | return 0; |
| 1506 | 1508 | } |
| 1507 | 1509 | |
| 1510 | r_num = (offset & 0x30) >> 4; |
| 1511 | |
| 1508 | 1512 | switch(offset & 0x0f) |
| 1509 | 1513 | { |
| 1510 | 1514 | case 0x00: |
| 1511 | 1515 | case 0x01: |
| 1512 | 1516 | { |
| 1513 | 1517 | 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]; |
| 1516 | 1520 | 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]; |
| 1518 | 1522 | |
| 1519 | | if(pce_cd.acard_ctrl & 0x1) |
| 1523 | if(pce_cd.acard_ctrl[r_num] & 0x1) |
| 1520 | 1524 | { |
| 1521 | | if(pce_cd.acard_ctrl & 0x10) |
| 1525 | if(pce_cd.acard_ctrl[r_num] & 0x10) |
| 1522 | 1526 | { |
| 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; |
| 1525 | 1529 | } |
| 1526 | 1530 | else |
| 1527 | 1531 | { |
| 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]; |
| 1529 | 1533 | } |
| 1530 | 1534 | } |
| 1531 | 1535 | |
| 1532 | 1536 | return res; |
| 1533 | 1537 | } |
| 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]; |
| 1542 | 1546 | default: return 0; |
| 1543 | 1547 | } |
| 1544 | 1548 | |
| r9114 | r9115 | |
| 1547 | 1551 | |
| 1548 | 1552 | WRITE8_HANDLER( pce_cd_acard_w ) |
| 1549 | 1553 | { |
| 1550 | | // printf("ACARD access W %04x %02x\n",offset,data); |
| 1554 | static UINT8 w_num; |
| 1551 | 1555 | |
| 1552 | 1556 | if((offset & 0x2e0) == 0x2e0) |
| 1553 | 1557 | { |
| r9114 | r9115 | |
| 1574 | 1578 | } |
| 1575 | 1579 | else |
| 1576 | 1580 | { |
| 1581 | w_num = (offset & 0x30) >> 4; |
| 1582 | |
| 1577 | 1583 | switch(offset & 0x0f) |
| 1578 | 1584 | { |
| 1579 | 1585 | case 0x00: |
| 1580 | 1586 | 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; |
| 1583 | 1589 | 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; |
| 1585 | 1591 | |
| 1586 | | if(pce_cd.acard_ctrl & 0x1) |
| 1592 | if(pce_cd.acard_ctrl[w_num] & 0x1) |
| 1587 | 1593 | { |
| 1588 | | if(pce_cd.acard_ctrl & 0x10) |
| 1594 | if(pce_cd.acard_ctrl[w_num] & 0x10) |
| 1589 | 1595 | { |
| 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; |
| 1592 | 1598 | } |
| 1593 | 1599 | else |
| 1594 | 1600 | { |
| 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]; |
| 1596 | 1602 | } |
| 1597 | 1603 | } |
| 1598 | 1604 | |
| 1599 | 1605 | break; |
| 1600 | 1606 | |
| 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; |
| 1605 | 1611 | 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); |
| 1607 | 1613 | |
| 1608 | | if((pce_cd.acard_ctrl & 0x60) == 0x40) |
| 1614 | if((pce_cd.acard_ctrl[w_num] & 0x60) == 0x40) |
| 1609 | 1615 | { |
| 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; |
| 1612 | 1618 | } |
| 1613 | 1619 | 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; |
| 1617 | 1623 | case 0x0a: |
| 1618 | | if((pce_cd.acard_ctrl & 0x60) == 0x60) |
| 1624 | if((pce_cd.acard_ctrl[w_num] & 0x60) == 0x60) |
| 1619 | 1625 | { |
| 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; |
| 1622 | 1628 | } |
| 1623 | 1629 | break; |
| 1624 | 1630 | } |
| r9114 | r9115 | |
| 1627 | 1633 | |
| 1628 | 1634 | READ8_HANDLER( pce_cd_acard_wram_r ) |
| 1629 | 1635 | { |
| 1630 | | return pce_cd_acard_r(space,0); |
| 1636 | return pce_cd_intf_r(space,0x200 | (offset & 0x6000) >> 9); |
| 1631 | 1637 | } |
| 1632 | 1638 | |
| 1633 | 1639 | WRITE8_HANDLER( pce_cd_acard_wram_w ) |
| 1634 | 1640 | { |
| 1635 | | pce_cd_acard_w(space,0,data); |
| 1641 | pce_cd_intf_w(space,0x200 | (offset & 0x6000) >> 9,data); |
| 1636 | 1642 | } |
| 1637 | 1643 | |