src/mess/machine/nes_pcb.c
| r8330 | r8331 | |
| 494 | 494 | { "WHIRLWIND-2706", UNSUPPORTED_BOARD }, |
| 495 | 495 | { "UNL-H2288", UNSUPPORTED_BOARD }, // mapper 123 |
| 496 | 496 | { "UNL-DANCE", UNSUPPORTED_BOARD }, |
| 497 | | { "UNL-EDU2000", UNSUPPORTED_BOARD /*UNL_EDU2K*/ }, |
| 497 | { "UNL-EDU2000", UNL_EDU2K }, |
| 498 | 498 | { "UNL-SHERO", UNSUPPORTED_BOARD /*SACHEN_SHERO*/ }, |
| 499 | 499 | { "UNL-TF1201", UNSUPPORTED_BOARD /*UNL_TF1201*/ }, |
| 500 | 500 | { "RUMBLESTATION", RUMBLESTATION_BOARD }, // mapper 46 |
| r8330 | r8331 | |
| 574 | 574 | { "BMC-411120-C", UNSUPPORTED_BOARD }, |
| 575 | 575 | { "BMC-830118C", UNSUPPORTED_BOARD }, |
| 576 | 576 | { "BMC-12-IN-1", UNSUPPORTED_BOARD }, |
| 577 | | { "BMC-NTD-03", UNSUPPORTED_BOARD }, |
| 577 | { "BMC-NTD-03", BMC_NTD_03 }, |
| 578 | 578 | { "BMC-8157", UNSUPPORTED_BOARD /*BMC_8157*/ }, |
| 579 | 579 | { "BMC-BS-5", BMC_BENSHENG_BS5 }, |
| 580 | 580 | { "BMC-FK23C", UNSUPPORTED_BOARD /*BMC_FK23C*/ }, |
| 581 | 581 | { "BMC-FK23CA", UNSUPPORTED_BOARD /*BMC_FK23C*/ }, // diff reg init |
| 582 | | { "BMC-GHOSTBUSTERS63IN1", UNSUPPORTED_BOARD /*BMC_G63IN1*/ }, |
| 582 | { "BMC-GHOSTBUSTERS63IN1", BMC_G63IN1 }, |
| 583 | 583 | { "BMC-SUPERVISION16IN1", UNSUPPORTED_BOARD }, // mapper 53 |
| 584 | 584 | { "BMC-RESETBASED-4IN1", UNSUPPORTED_BOARD },// mapper 60 with 64k prg and 32k chr |
| 585 | 585 | { "BMC-VT5201", BMC_VT5201 },// mapper 60 otherwise |
| r8330 | r8331 | |
| 638 | 638 | |
| 639 | 639 | ************************************************/ |
| 640 | 640 | |
| 641 | // helper function for the few mappers reading from 0x8000-0xffff for protection |
| 642 | INLINE UINT8 mmc_hi_access_rom( running_machine *machine, UINT32 offset ) |
| 643 | { |
| 644 | nes_state *state = (nes_state *)machine->driver_data; |
| 641 | 645 | |
| 646 | // usual ROM access |
| 647 | switch (offset & 0x6000) |
| 648 | { |
| 649 | case 0x0000: |
| 650 | return state->rom[0x10000 + state->prg_bank[0] * 0x2000 + (offset & 0x1fff)]; |
| 651 | case 0x2000: |
| 652 | return state->rom[0x10000 + state->prg_bank[1] * 0x2000 + (offset & 0x1fff)]; |
| 653 | case 0x4000: |
| 654 | return state->rom[0x10000 + state->prg_bank[2] * 0x2000 + (offset & 0x1fff)]; |
| 655 | case 0x6000: |
| 656 | return state->rom[0x10000 + state->prg_bank[3] * 0x2000 + (offset & 0x1fff)]; |
| 657 | } |
| 658 | return 0; |
| 659 | } |
| 660 | |
| 642 | 661 | /************************************************************* |
| 643 | 662 | |
| 644 | 663 | UxROM board emulation |
| r8330 | r8331 | |
| 1575 | 1594 | |
| 1576 | 1595 | *************************************************************/ |
| 1577 | 1596 | |
| 1597 | #if 0 |
| 1598 | static void mmc5_update_chr_a( running_machine *machine ) |
| 1599 | { |
| 1600 | nes_state *state = (nes_state *)machine->driver_data; |
| 1601 | switch (state->mmc5_chr_mode) |
| 1602 | { |
| 1603 | case 0: // 8k banks |
| 1604 | chr8(machine, state->mmc5_vrom_regA[7] & 0xff, CHRROM); |
| 1605 | break; |
| 1606 | |
| 1607 | case 1: // 4k banks |
| 1608 | chr4_0(machine, state->mmc5_vrom_regA[3] & 0xff, CHRROM); |
| 1609 | chr4_4(machine, state->mmc5_vrom_regA[7] & 0xff, CHRROM); |
| 1610 | break; |
| 1611 | |
| 1612 | case 2: // 2k banks |
| 1613 | chr2_0(machine, state->mmc5_vrom_regA[1], CHRROM); |
| 1614 | chr2_2(machine, state->mmc5_vrom_regA[3], CHRROM); |
| 1615 | chr2_4(machine, state->mmc5_vrom_regA[5], CHRROM); |
| 1616 | chr2_6(machine, state->mmc5_vrom_regA[7], CHRROM); |
| 1617 | break; |
| 1618 | |
| 1619 | case 3: // 1k banks |
| 1620 | chr1_0(machine, state->mmc5_vrom_regA[0], CHRROM); |
| 1621 | chr1_1(machine, state->mmc5_vrom_regA[1], CHRROM); |
| 1622 | chr1_2(machine, state->mmc5_vrom_regA[2], CHRROM); |
| 1623 | chr1_3(machine, state->mmc5_vrom_regA[3], CHRROM); |
| 1624 | chr1_4(machine, state->mmc5_vrom_regA[4], CHRROM); |
| 1625 | chr1_5(machine, state->mmc5_vrom_regA[5], CHRROM); |
| 1626 | chr1_6(machine, state->mmc5_vrom_regA[6], CHRROM); |
| 1627 | chr1_7(machine, state->mmc5_vrom_regA[7], CHRROM); |
| 1628 | break; |
| 1629 | } |
| 1630 | } |
| 1631 | |
| 1632 | static void mmc5_update_chr_b( running_machine *machine ) |
| 1633 | { |
| 1634 | nes_state *state = (nes_state *)machine->driver_data; |
| 1635 | switch (state->mmc5_chr_mode) |
| 1636 | { |
| 1637 | case 0: // 8k banks |
| 1638 | chr8(machine, state->mmc5_vrom_regB[3] & 0xff, CHRROM); |
| 1639 | break; |
| 1640 | |
| 1641 | case 1: // 4k banks |
| 1642 | chr4_0(machine, state->mmc5_vrom_regB[3] & 0xff, CHRROM); |
| 1643 | chr4_4(machine, state->mmc5_vrom_regB[3] & 0xff, CHRROM); |
| 1644 | break; |
| 1645 | |
| 1646 | case 2: // 2k banks |
| 1647 | chr2_0(machine, state->mmc5_vrom_regB[1], CHRROM); |
| 1648 | chr2_2(machine, state->mmc5_vrom_regB[3], CHRROM); |
| 1649 | chr2_4(machine, state->mmc5_vrom_regB[1], CHRROM); |
| 1650 | chr2_6(machine, state->mmc5_vrom_regB[3], CHRROM); |
| 1651 | break; |
| 1652 | |
| 1653 | case 3: // 1k banks |
| 1654 | chr1_0(machine, state->mmc5_vrom_regB[0], CHRROM); |
| 1655 | chr1_1(machine, state->mmc5_vrom_regB[1], CHRROM); |
| 1656 | chr1_2(machine, state->mmc5_vrom_regB[2], CHRROM); |
| 1657 | chr1_3(machine, state->mmc5_vrom_regB[3], CHRROM); |
| 1658 | chr1_4(machine, state->mmc5_vrom_regB[0], CHRROM); |
| 1659 | chr1_5(machine, state->mmc5_vrom_regB[1], CHRROM); |
| 1660 | chr1_6(machine, state->mmc5_vrom_regB[2], CHRROM); |
| 1661 | chr1_7(machine, state->mmc5_vrom_regB[3], CHRROM); |
| 1662 | break; |
| 1663 | } |
| 1664 | } |
| 1665 | #endif |
| 1666 | |
| 1667 | static void mmc5_update_prg( running_machine *machine ) |
| 1668 | { |
| 1669 | nes_state *state = (nes_state *)machine->driver_data; |
| 1670 | int bank1, bank2, bank3; |
| 1671 | |
| 1672 | switch (state->mmc5_prg_mode) |
| 1673 | { |
| 1674 | case 0: // 32k banks |
| 1675 | prg32(machine, state->mmc5_prg_regs[3] >> 2); |
| 1676 | break; |
| 1677 | |
| 1678 | case 1: // 16k banks |
| 1679 | // printf("problema 1: %x\n", state->mmc5_prg_regs[1]); |
| 1680 | bank1 = state->mmc5_prg_regs[1]; |
| 1681 | |
| 1682 | if (!BIT(bank1, 7)) |
| 1683 | { |
| 1684 | state->prg_bank[0] = state->prg_chunks + (bank1 & 0x06); |
| 1685 | state->prg_bank[1] = state->prg_chunks + (bank1 & 0x06) + 1; |
| 1686 | memory_set_bank(machine, "bank1", state->prg_bank[0]); |
| 1687 | memory_set_bank(machine, "bank2", state->prg_bank[1]); |
| 1688 | } |
| 1689 | else |
| 1690 | prg16_89ab(machine, bank1 >> 1); |
| 1691 | |
| 1692 | prg16_cdef(machine, state->mmc5_prg_regs[3] >> 1); |
| 1693 | break; |
| 1694 | |
| 1695 | case 2: // 16k-8k banks |
| 1696 | // printf("problema 2: %x %x\n", state->mmc5_prg_regs[1], state->mmc5_prg_regs[2]); |
| 1697 | bank1 = state->mmc5_prg_regs[1]; |
| 1698 | bank3 = state->mmc5_prg_regs[2]; |
| 1699 | |
| 1700 | if (!BIT(bank1, 7)) |
| 1701 | { |
| 1702 | state->prg_bank[0] = state->prg_chunks + (bank1 & 0x06); |
| 1703 | state->prg_bank[1] = state->prg_chunks + (bank1 & 0x06) + 1; |
| 1704 | memory_set_bank(machine, "bank1", state->prg_bank[0]); |
| 1705 | memory_set_bank(machine, "bank2", state->prg_bank[1]); |
| 1706 | } |
| 1707 | else |
| 1708 | prg16_89ab(machine, (bank1 & 0x7f) >> 1); |
| 1709 | |
| 1710 | if (!BIT(bank3, 7)) |
| 1711 | { |
| 1712 | state->prg_bank[2] = state->prg_chunks + (bank3 & 0x07); |
| 1713 | memory_set_bank(machine, "bank3", state->prg_bank[2]); |
| 1714 | } |
| 1715 | else |
| 1716 | prg8_cd(machine, bank3 & 0x7f); |
| 1717 | |
| 1718 | prg8_ef(machine, state->mmc5_prg_regs[3]); |
| 1719 | break; |
| 1720 | |
| 1721 | case 3: // 8k banks |
| 1722 | // printf("problema 3: %x %x %x\n", state->mmc5_prg_regs[0], state->mmc5_prg_regs[1], state->mmc5_prg_regs[2]); |
| 1723 | bank1 = state->mmc5_prg_regs[0]; |
| 1724 | bank2 = state->mmc5_prg_regs[1]; |
| 1725 | bank3 = state->mmc5_prg_regs[2]; |
| 1726 | |
| 1727 | if (!BIT(bank1, 7)) |
| 1728 | { |
| 1729 | state->prg_bank[0] = state->prg_chunks + (bank1 & 0x07); |
| 1730 | memory_set_bank(machine, "bank1", state->prg_bank[0]); |
| 1731 | } |
| 1732 | else |
| 1733 | prg8_89(machine, bank1 & 0x7f); |
| 1734 | |
| 1735 | if (!BIT(bank2, 7)) |
| 1736 | { |
| 1737 | state->prg_bank[1] = state->prg_chunks + (bank2 & 0x07); |
| 1738 | memory_set_bank(machine, "bank2", state->prg_bank[1]); |
| 1739 | } |
| 1740 | else |
| 1741 | prg8_ab(machine, bank2 & 0x7f); |
| 1742 | |
| 1743 | if (!BIT(bank3, 7)) |
| 1744 | { |
| 1745 | state->prg_bank[2] = state->prg_chunks + (bank3 & 0x07); |
| 1746 | memory_set_bank(machine, "bank3", state->prg_bank[2]); |
| 1747 | } |
| 1748 | else |
| 1749 | prg8_cd(machine, bank3 & 0x7f); |
| 1750 | |
| 1751 | prg8_ef(machine, state->mmc5_prg_regs[3]); |
| 1752 | break; |
| 1753 | } |
| 1754 | } |
| 1755 | |
| 1756 | static void mmc5_update_render_mode( running_machine *machine ) |
| 1757 | { |
| 1758 | } |
| 1759 | |
| 1578 | 1760 | static void mmc5_irq( running_device *device, int scanline, int vblank, int blanked ) |
| 1579 | 1761 | { |
| 1580 | 1762 | nes_state *state = (nes_state *)device->machine->driver_data; |
| 1581 | | |
| 1763 | |
| 1582 | 1764 | #if 1 |
| 1583 | 1765 | if (scanline == 0) |
| 1584 | 1766 | state->IRQ_status |= 0x40; |
| 1585 | 1767 | else if (scanline > PPU_BOTTOM_VISIBLE_SCANLINE) |
| 1586 | 1768 | state->IRQ_status &= ~0x40; |
| 1587 | 1769 | #endif |
| 1588 | | |
| 1770 | |
| 1589 | 1771 | if (scanline == state->IRQ_count) |
| 1590 | 1772 | { |
| 1591 | 1773 | if (state->IRQ_enable) |
| 1592 | 1774 | cpu_set_input_line(state->maincpu, M6502_IRQ_LINE, HOLD_LINE); |
| 1593 | | |
| 1775 | |
| 1594 | 1776 | state->IRQ_status = 0xff; |
| 1595 | 1777 | } |
| 1778 | |
| 1779 | /* FIXME: this is ok, but then we would need to update them again when we have the BG Hblank |
| 1780 | I leave it commented out until the PPU is updated for this */ |
| 1781 | // if (ppu2c0x_is_sprite_8x16(state->ppu) || state->mmc5_last_chr_a) |
| 1782 | // mmc5_update_chr_a(device->machine); |
| 1783 | // else |
| 1784 | // mmc5_update_chr_b(device->machine); |
| 1596 | 1785 | } |
| 1597 | 1786 | |
| 1598 | 1787 | static void mmc5_ppu_mirror( running_machine *machine, int page, int src ) |
| r8330 | r8331 | |
| 1621 | 1810 | { |
| 1622 | 1811 | nes_state *state = (nes_state *)space->machine->driver_data; |
| 1623 | 1812 | int retVal; |
| 1624 | | |
| 1813 | |
| 1625 | 1814 | /* $5c00 - $5fff: extended videoram attributes */ |
| 1626 | 1815 | if ((offset >= 0x1b00) && (offset <= 0x1eff)) |
| 1627 | 1816 | { |
| 1628 | 1817 | return state->mmc5_vram[offset - 0x1b00]; |
| 1629 | 1818 | } |
| 1630 | | |
| 1819 | |
| 1631 | 1820 | switch (offset) |
| 1632 | 1821 | { |
| 1633 | 1822 | case 0x1104: /* $5204 */ |
| r8330 | r8331 | |
| 1641 | 1830 | state->IRQ_status &= ~0x80; |
| 1642 | 1831 | return retVal; |
| 1643 | 1832 | #endif |
| 1644 | | |
| 1833 | |
| 1645 | 1834 | case 0x1105: /* $5205 */ |
| 1646 | 1835 | return (state->mult1 * state->mult2) & 0xff; |
| 1647 | 1836 | case 0x1106: /* $5206 */ |
| 1648 | 1837 | return ((state->mult1 * state->mult2) & 0xff00) >> 8; |
| 1649 | | |
| 1838 | |
| 1650 | 1839 | default: |
| 1651 | 1840 | logerror("** MMC5 uncaught read, offset: %04x\n", offset + 0x4100); |
| 1652 | 1841 | return 0x00; |
| r8330 | r8331 | |
| 1657 | 1846 | static WRITE8_HANDLER( exrom_l_w ) |
| 1658 | 1847 | { |
| 1659 | 1848 | nes_state *state = (nes_state *)space->machine->driver_data; |
| 1660 | | |
| 1849 | |
| 1661 | 1850 | // LOG_MMC(("Mapper 5 write, offset: %04x, data: %02x\n", offset + 0x4100, data)); |
| 1662 | 1851 | /* Send $5000-$5015 to the sound chip */ |
| 1663 | 1852 | if ((offset >= 0xf00) && (offset <= 0xf15)) |
| r8330 | r8331 | |
| 1665 | 1854 | nes_psg_w(state->sound, offset & 0x1f, data); |
| 1666 | 1855 | return; |
| 1667 | 1856 | } |
| 1668 | | |
| 1857 | |
| 1669 | 1858 | /* $5c00 - $5fff: extended videoram attributes */ |
| 1670 | 1859 | if ((offset >= 0x1b00) && (offset <= 0x1eff)) |
| 1671 | 1860 | { |
| r8330 | r8331 | |
| 1673 | 1862 | state->mmc5_vram[offset - 0x1b00] = data; |
| 1674 | 1863 | return; |
| 1675 | 1864 | } |
| 1676 | | |
| 1865 | |
| 1677 | 1866 | switch (offset) |
| 1678 | 1867 | { |
| 1679 | 1868 | case 0x1000: /* $5100 */ |
| 1680 | | state->MMC5_rom_bank_mode = data & 0x03; |
| 1869 | state->mmc5_prg_mode = data & 0x03; |
| 1870 | // mmc5_update_prg(space->machine); |
| 1681 | 1871 | LOG_MMC(("MMC5 rom bank mode: %02x\n", data)); |
| 1682 | 1872 | break; |
| 1683 | | |
| 1873 | |
| 1684 | 1874 | case 0x1001: /* $5101 */ |
| 1685 | | state->MMC5_vrom_bank_mode = data & 0x03; |
| 1875 | state->mmc5_chr_mode = data & 0x03; |
| 1876 | // update chr |
| 1686 | 1877 | LOG_MMC(("MMC5 vrom bank mode: %02x\n", data)); |
| 1687 | 1878 | break; |
| 1688 | | |
| 1879 | |
| 1689 | 1880 | case 0x1002: /* $5102 */ |
| 1690 | 1881 | if (data == 0x02) |
| 1691 | 1882 | state->MMC5_vram_protect |= 1; |
| r8330 | r8331 | |
| 1700 | 1891 | state->MMC5_vram_protect = 0; |
| 1701 | 1892 | LOG_MMC(("MMC5 vram protect 2: %02x\n", data)); |
| 1702 | 1893 | break; |
| 1703 | | |
| 1894 | |
| 1704 | 1895 | case 0x1004: /* $5104 - Extra VRAM (EXRAM) control */ |
| 1705 | 1896 | state->mmc5_vram_control = data & 0x03; |
| 1897 | // update render |
| 1898 | mmc5_update_render_mode(space->machine); |
| 1706 | 1899 | LOG_MMC(("MMC5 exram control: %02x\n", data)); |
| 1707 | 1900 | break; |
| 1708 | | |
| 1901 | |
| 1709 | 1902 | case 0x1005: /* $5105 */ |
| 1710 | 1903 | mmc5_ppu_mirror(space->machine, 0, data & 0x03); |
| 1711 | 1904 | mmc5_ppu_mirror(space->machine, 1, (data & 0x0c) >> 2); |
| 1712 | 1905 | mmc5_ppu_mirror(space->machine, 2, (data & 0x30) >> 4); |
| 1713 | 1906 | mmc5_ppu_mirror(space->machine, 3, (data & 0xc0) >> 6); |
| 1907 | // update render |
| 1908 | mmc5_update_render_mode(space->machine); |
| 1714 | 1909 | break; |
| 1715 | | |
| 1910 | |
| 1716 | 1911 | /* tile data for MMC5 flood-fill NT mode */ |
| 1717 | 1912 | case 0x1006: |
| 1718 | 1913 | state->MMC5_floodtile = data; |
| 1719 | 1914 | break; |
| 1720 | | |
| 1915 | |
| 1721 | 1916 | /* attr data for MMC5 flood-fill NT mode */ |
| 1722 | 1917 | case 0x1007: |
| 1723 | 1918 | switch (data & 3) |
| 1724 | | { |
| 1919 | { |
| 1725 | 1920 | default: |
| 1726 | 1921 | case 0: state->MMC5_floodattr = 0x00; break; |
| 1727 | 1922 | case 1: state->MMC5_floodattr = 0x55; break; |
| 1728 | 1923 | case 2: state->MMC5_floodattr = 0xaa; break; |
| 1729 | 1924 | case 3: state->MMC5_floodattr = 0xff; break; |
| 1730 | | } |
| 1925 | } |
| 1731 | 1926 | break; |
| 1732 | | |
| 1927 | |
| 1733 | 1928 | case 0x1013: /* $5113 */ |
| 1734 | 1929 | LOG_MMC(("MMC5 mid RAM bank select: %02x\n", data & 0x07)); |
| 1735 | 1930 | // FIXME: a few Koei games have both WRAM & BWRAM but here we don't support this (yet) |
| r8330 | r8331 | |
| 1738 | 1933 | else |
| 1739 | 1934 | wram_bank(space->machine, data, NES_WRAM); |
| 1740 | 1935 | break; |
| 1741 | | |
| 1936 | |
| 1937 | |
| 1742 | 1938 | case 0x1014: /* $5114 */ |
| 1743 | | LOG_MMC(("MMC5 $5114 bank select: %02x (mode: %d)\n", data, state->MMC5_rom_bank_mode)); |
| 1744 | | switch (state->MMC5_rom_bank_mode) |
| 1745 | | { |
| 1746 | | case 0x03: |
| 1747 | | /* 8k switch */ |
| 1748 | | if (data & 0x80) |
| 1749 | | { |
| 1750 | | /* ROM */ |
| 1751 | | LOG_MMC(("\tROM bank select (8k, $8000): %02x\n", data & 0x7f)); |
| 1752 | | prg8_89(space->machine, data & 0x7f); |
| 1753 | | } |
| 1754 | | else |
| 1755 | | { |
| 1756 | | /* RAM */ |
| 1757 | | LOG_MMC(("\tRAM bank select (8k, $8000): %02x\n", data & 0x07)); |
| 1758 | | state->prg_bank[0] = state->prg_chunks + (data & 0x07); |
| 1759 | | memory_set_bank(space->machine, "bank1", state->prg_bank[0]); |
| 1760 | | } |
| 1761 | | break; |
| 1762 | | } |
| 1763 | | break; |
| 1764 | 1939 | case 0x1015: /* $5115 */ |
| 1765 | | LOG_MMC(("MMC5 $5115 bank select: %02x (mode: %d)\n", data, state->MMC5_rom_bank_mode)); |
| 1766 | | switch (state->MMC5_rom_bank_mode) |
| 1767 | | { |
| 1768 | | case 0x01: |
| 1769 | | case 0x02: |
| 1770 | | if (data & 0x80) |
| 1771 | | { |
| 1772 | | /* 16k switch - ROM only */ |
| 1773 | | LOG_MMC(("\tROM bank select (16k, $8000): %02x\n", (data & 0x7f) >> 1)); |
| 1774 | | prg16_89ab(space->machine, (data & 0x7f) >> 1); |
| 1775 | | } |
| 1776 | | else |
| 1777 | | { |
| 1778 | | /* RAM */ |
| 1779 | | LOG_MMC(("\tRAM bank select (16k, $8000): %02x\n", (data & 0x07) >> 1)); |
| 1780 | | state->prg_bank[0] = state->prg_chunks + (data & 0x06); |
| 1781 | | state->prg_bank[1] = state->prg_chunks + (data & 0x06) + 1; |
| 1782 | | memory_set_bank(space->machine, "bank1", state->prg_bank[0]); |
| 1783 | | memory_set_bank(space->machine, "bank2", state->prg_bank[1]); |
| 1784 | | } |
| 1785 | | break; |
| 1786 | | case 0x03: |
| 1787 | | /* 8k switch */ |
| 1788 | | if (data & 0x80) |
| 1789 | | { |
| 1790 | | /* ROM */ |
| 1791 | | LOG_MMC(("\tROM bank select (8k, $a000): %02x\n", data & 0x7f)); |
| 1792 | | prg8_ab(space->machine, data & 0x7f); |
| 1793 | | } |
| 1794 | | else |
| 1795 | | { |
| 1796 | | /* RAM */ |
| 1797 | | LOG_MMC(("\tRAM bank select (8k, $a000): %02x\n", data & 0x07)); |
| 1798 | | state->prg_bank[1] = state->prg_chunks + (data & 0x07); |
| 1799 | | memory_set_bank(space->machine, "bank2", state->prg_bank[1]); |
| 1800 | | } |
| 1801 | | break; |
| 1802 | | } |
| 1940 | case 0x1016: /* $5116 */ |
| 1941 | case 0x1017: /* $5117 */ |
| 1942 | state->mmc5_prg_regs[offset & 3] = data; |
| 1943 | mmc5_update_prg(space->machine); |
| 1803 | 1944 | break; |
| 1804 | | case 0x1016: /* $5116 */ |
| 1805 | | LOG_MMC(("MMC5 $5116 bank select: %02x (mode: %d)\n", data, state->MMC5_rom_bank_mode)); |
| 1806 | | switch (state->MMC5_rom_bank_mode) |
| 1945 | |
| 1946 | #if 0 |
| 1947 | // these do not work as expected... I guess we definitely need the bank update at proper times (with BG vs. sprite timing) |
| 1948 | case 0x1020: /* $5120 */ |
| 1949 | case 0x1021: /* $5121 */ |
| 1950 | case 0x1022: /* $5122 */ |
| 1951 | case 0x1023: /* $5123 */ |
| 1952 | case 0x1024: /* $5124 */ |
| 1953 | case 0x1025: /* $5125 */ |
| 1954 | case 0x1026: /* $5126 */ |
| 1955 | case 0x1027: /* $5127 */ |
| 1956 | data |= (state->mmc5_chr_high << 8); |
| 1957 | if (!state->mmc5_last_chr_a) |
| 1807 | 1958 | { |
| 1808 | | case 0x02: |
| 1809 | | case 0x03: |
| 1810 | | /* 8k switch */ |
| 1811 | | if (data & 0x80) |
| 1812 | | { |
| 1813 | | /* ROM */ |
| 1814 | | LOG_MMC(("\tROM bank select (8k, $c000): %02x\n", data & 0x7f)); |
| 1815 | | prg8_cd(space->machine, data & 0x7f); |
| 1816 | | } |
| 1817 | | else |
| 1818 | | { |
| 1819 | | /* RAM */ |
| 1820 | | LOG_MMC(("\tRAM bank select (8k, $c000): %02x\n", data & 0x07)); |
| 1821 | | state->prg_bank[2] = state->prg_chunks + (data & 0x07); |
| 1822 | | memory_set_bank(space->machine, "bank3", state->prg_bank[2]); |
| 1823 | | } |
| 1824 | | break; |
| 1959 | state->mmc5_vrom_regA[offset & 0x07] = data; |
| 1960 | state->mmc5_last_chr_a = 1; |
| 1961 | if (ppu2c0x_get_current_scanline(state->ppu) == 240 || !ppu2c0x_is_sprite_8x16(state->ppu)) |
| 1962 | mmc5_update_chr_a(space->machine); |
| 1825 | 1963 | } |
| 1826 | 1964 | break; |
| 1827 | | case 0x1017: /* $5117 */ |
| 1828 | | LOG_MMC(("MMC5 $5117 bank select: %02x (mode: %d)\n", data, state->MMC5_rom_bank_mode)); |
| 1829 | | switch (state->MMC5_rom_bank_mode) |
| 1965 | |
| 1966 | |
| 1967 | case 0x1028: /* $5128 */ |
| 1968 | case 0x1029: /* $5129 */ |
| 1969 | case 0x102a: /* $512a */ |
| 1970 | case 0x102b: /* $512b */ |
| 1971 | data |= (state->mmc5_chr_high << 8); |
| 1972 | state->mmc5_vrom_regB[offset & 0x03] = data; |
| 1973 | state->mmc5_last_chr_a = 0; |
| 1974 | if (ppu2c0x_get_current_scanline(state->ppu) == 240 || !ppu2c0x_is_sprite_8x16(state->ppu)) |
| 1975 | mmc5_update_chr_b(space->machine); |
| 1976 | break; |
| 1977 | |
| 1978 | case 0x1030: /* $5130 */ |
| 1979 | state->mmc5_chr_high = data & 0x03; |
| 1980 | if (state->mmc5_vram_control == 1) |
| 1830 | 1981 | { |
| 1831 | | case 0x00: |
| 1832 | | /* 32k switch - ROM only */ |
| 1833 | | LOG_MMC(("\tROM bank select (32k, $8000): %02x\n", (data & 0x7f) >> 2)); |
| 1834 | | prg32(space->machine, data >> 2); |
| 1835 | | break; |
| 1836 | | case 0x01: |
| 1837 | | /* 16k switch - ROM only */ |
| 1838 | | LOG_MMC(("\tROM bank select (16k, $c000): %02x\n", (data & 0x7f) >> 1)); |
| 1839 | | prg16_cdef(space->machine, data >> 1); |
| 1840 | | break; |
| 1841 | | case 0x02: |
| 1842 | | case 0x03: |
| 1843 | | /* 8k switch */ |
| 1844 | | LOG_MMC(("\tROM bank select (8k, $e000): %02x\n", data & 0x7f)); |
| 1845 | | prg8_ef(space->machine, data & 0x7f); |
| 1846 | | break; |
| 1982 | // in this case state->mmc5_chr_high selects which 256KB of CHR ROM |
| 1983 | // is to be used for all background tiles on the screen. |
| 1847 | 1984 | } |
| 1848 | 1985 | break; |
| 1986 | |
| 1987 | #endif |
| 1988 | |
| 1849 | 1989 | case 0x1020: /* $5120 */ |
| 1850 | | LOG_MMC(("MMC5 $5120 vrom select: %02x (mode: %d)\n", data, state->MMC5_vrom_bank_mode)); |
| 1851 | | switch (state->MMC5_vrom_bank_mode) |
| 1852 | | { |
| 1990 | LOG_MMC(("MMC5 $5120 vrom select: %02x (mode: %d)\n", data, state->mmc5_chr_mode)); |
| 1991 | switch (state->mmc5_chr_mode) |
| 1992 | { |
| 1853 | 1993 | case 0x03: |
| 1854 | 1994 | /* 1k switch */ |
| 1855 | 1995 | state->MMC5_vrom_bank[0] = data | (state->mmc5_high_chr << 8); |
| r8330 | r8331 | |
| 1860 | 2000 | // vrom_page_a = 1; |
| 1861 | 2001 | // vrom_page_b = 0; |
| 1862 | 2002 | break; |
| 1863 | | } |
| 2003 | } |
| 1864 | 2004 | break; |
| 1865 | 2005 | case 0x1021: /* $5121 */ |
| 1866 | | LOG_MMC(("MMC5 $5121 vrom select: %02x (mode: %d)\n", data, state->MMC5_vrom_bank_mode)); |
| 1867 | | switch (state->MMC5_vrom_bank_mode) |
| 1868 | | { |
| 2006 | LOG_MMC(("MMC5 $5121 vrom select: %02x (mode: %d)\n", data, state->mmc5_chr_mode)); |
| 2007 | switch (state->mmc5_chr_mode) |
| 2008 | { |
| 1869 | 2009 | case 0x02: |
| 1870 | 2010 | /* 2k switch */ |
| 1871 | 2011 | chr2_0(space->machine, data | (state->mmc5_high_chr << 8), CHRROM); |
| r8330 | r8331 | |
| 1880 | 2020 | // vrom_page_a = 1; |
| 1881 | 2021 | // vrom_page_b = 0; |
| 1882 | 2022 | break; |
| 1883 | | } |
| 2023 | } |
| 1884 | 2024 | break; |
| 1885 | 2025 | case 0x1022: /* $5122 */ |
| 1886 | | LOG_MMC(("MMC5 $5122 vrom select: %02x (mode: %d)\n", data, state->MMC5_vrom_bank_mode)); |
| 1887 | | switch (state->MMC5_vrom_bank_mode) |
| 1888 | | { |
| 2026 | LOG_MMC(("MMC5 $5122 vrom select: %02x (mode: %d)\n", data, state->mmc5_chr_mode)); |
| 2027 | switch (state->mmc5_chr_mode) |
| 2028 | { |
| 1889 | 2029 | case 0x03: |
| 1890 | 2030 | /* 1k switch */ |
| 1891 | 2031 | state->MMC5_vrom_bank[2] = data | (state->mmc5_high_chr << 8); |
| r8330 | r8331 | |
| 1896 | 2036 | // vrom_page_a = 1; |
| 1897 | 2037 | // vrom_page_b = 0; |
| 1898 | 2038 | break; |
| 1899 | | } |
| 2039 | } |
| 1900 | 2040 | break; |
| 1901 | 2041 | case 0x1023: /* $5123 */ |
| 1902 | | LOG_MMC(("MMC5 $5123 vrom select: %02x (mode: %d)\n", data, state->MMC5_vrom_bank_mode)); |
| 1903 | | switch (state->MMC5_vrom_bank_mode) |
| 1904 | | { |
| 2042 | LOG_MMC(("MMC5 $5123 vrom select: %02x (mode: %d)\n", data, state->mmc5_chr_mode)); |
| 2043 | switch (state->mmc5_chr_mode) |
| 2044 | { |
| 1905 | 2045 | case 0x01: |
| 1906 | 2046 | chr4_0(space->machine, data, CHRROM); |
| 1907 | 2047 | break; |
| r8330 | r8331 | |
| 1919 | 2059 | // vrom_page_a = 1; |
| 1920 | 2060 | // vrom_page_b = 0; |
| 1921 | 2061 | break; |
| 1922 | | } |
| 2062 | } |
| 1923 | 2063 | break; |
| 1924 | 2064 | case 0x1024: /* $5124 */ |
| 1925 | | LOG_MMC(("MMC5 $5124 vrom select: %02x (mode: %d)\n", data, state->MMC5_vrom_bank_mode)); |
| 1926 | | switch (state->MMC5_vrom_bank_mode) |
| 1927 | | { |
| 2065 | LOG_MMC(("MMC5 $5124 vrom select: %02x (mode: %d)\n", data, state->mmc5_chr_mode)); |
| 2066 | switch (state->mmc5_chr_mode) |
| 2067 | { |
| 1928 | 2068 | case 0x03: |
| 1929 | 2069 | /* 1k switch */ |
| 1930 | 2070 | state->MMC5_vrom_bank[4] = data | (state->mmc5_high_chr << 8); |
| r8330 | r8331 | |
| 1935 | 2075 | // vrom_page_a = 0; |
| 1936 | 2076 | // vrom_page_b = 0; |
| 1937 | 2077 | break; |
| 1938 | | } |
| 2078 | } |
| 1939 | 2079 | break; |
| 1940 | 2080 | case 0x1025: /* $5125 */ |
| 1941 | | LOG_MMC(("MMC5 $5125 vrom select: %02x (mode: %d)\n", data, state->MMC5_vrom_bank_mode)); |
| 1942 | | switch (state->MMC5_vrom_bank_mode) |
| 1943 | | { |
| 2081 | LOG_MMC(("MMC5 $5125 vrom select: %02x (mode: %d)\n", data, state->mmc5_chr_mode)); |
| 2082 | switch (state->mmc5_chr_mode) |
| 2083 | { |
| 1944 | 2084 | case 0x02: |
| 1945 | 2085 | /* 2k switch */ |
| 1946 | 2086 | chr2_4(space->machine, data | (state->mmc5_high_chr << 8), CHRROM); |
| r8330 | r8331 | |
| 1955 | 2095 | // vrom_page_a = 0; |
| 1956 | 2096 | // vrom_page_b = 0; |
| 1957 | 2097 | break; |
| 1958 | | } |
| 2098 | } |
| 1959 | 2099 | break; |
| 1960 | 2100 | case 0x1026: /* $5126 */ |
| 1961 | | LOG_MMC(("MMC5 $5126 vrom select: %02x (mode: %d)\n", data, state->MMC5_vrom_bank_mode)); |
| 1962 | | switch (state->MMC5_vrom_bank_mode) |
| 1963 | | { |
| 2101 | LOG_MMC(("MMC5 $5126 vrom select: %02x (mode: %d)\n", data, state->mmc5_chr_mode)); |
| 2102 | switch (state->mmc5_chr_mode) |
| 2103 | { |
| 1964 | 2104 | case 0x03: |
| 1965 | 2105 | /* 1k switch */ |
| 1966 | 2106 | state->MMC5_vrom_bank[6] = data | (state->mmc5_high_chr << 8); |
| r8330 | r8331 | |
| 1971 | 2111 | // vrom_page_a = 0; |
| 1972 | 2112 | // vrom_page_b = 0; |
| 1973 | 2113 | break; |
| 1974 | | } |
| 2114 | } |
| 1975 | 2115 | break; |
| 1976 | 2116 | case 0x1027: /* $5127 */ |
| 1977 | | LOG_MMC(("MMC5 $5127 vrom select: %02x (mode: %d)\n", data, state->MMC5_vrom_bank_mode)); |
| 1978 | | switch (state->MMC5_vrom_bank_mode) |
| 1979 | | { |
| 2117 | LOG_MMC(("MMC5 $5127 vrom select: %02x (mode: %d)\n", data, state->mmc5_chr_mode)); |
| 2118 | switch (state->mmc5_chr_mode) |
| 2119 | { |
| 1980 | 2120 | case 0x00: |
| 1981 | 2121 | /* 8k switch */ |
| 1982 | 2122 | chr8(space->machine, data, CHRROM); |
| r8330 | r8331 | |
| 1999 | 2139 | // vrom_page_a = 0; |
| 2000 | 2140 | // vrom_page_b = 0; |
| 2001 | 2141 | break; |
| 2002 | | } |
| 2142 | } |
| 2003 | 2143 | break; |
| 2004 | 2144 | case 0x1028: /* $5128 */ |
| 2005 | | LOG_MMC(("MMC5 $5128 vrom select: %02x (mode: %d)\n", data, state->MMC5_vrom_bank_mode)); |
| 2006 | | switch (state->MMC5_vrom_bank_mode) |
| 2007 | | { |
| 2145 | LOG_MMC(("MMC5 $5128 vrom select: %02x (mode: %d)\n", data, state->mmc5_chr_mode)); |
| 2146 | switch (state->mmc5_chr_mode) |
| 2147 | { |
| 2008 | 2148 | case 0x03: |
| 2009 | 2149 | /* 1k switch */ |
| 2010 | 2150 | state->MMC5_vrom_bank[8] = data | (state->mmc5_high_chr << 8); |
| r8330 | r8331 | |
| 2019 | 2159 | state->vrom_page_b = 1; |
| 2020 | 2160 | } |
| 2021 | 2161 | break; |
| 2022 | | } |
| 2162 | } |
| 2023 | 2163 | break; |
| 2024 | 2164 | case 0x1029: /* $5129 */ |
| 2025 | | LOG_MMC(("MMC5 $5129 vrom select: %02x (mode: %d)\n", data, state->MMC5_vrom_bank_mode)); |
| 2026 | | switch (state->MMC5_vrom_bank_mode) |
| 2027 | | { |
| 2165 | LOG_MMC(("MMC5 $5129 vrom select: %02x (mode: %d)\n", data, state->mmc5_chr_mode)); |
| 2166 | switch (state->mmc5_chr_mode) |
| 2167 | { |
| 2028 | 2168 | case 0x02: |
| 2029 | 2169 | /* 2k switch */ |
| 2030 | 2170 | chr2_0(space->machine, data | (state->mmc5_high_chr << 8), CHRROM); |
| r8330 | r8331 | |
| 2044 | 2184 | state->vrom_page_b = 1; |
| 2045 | 2185 | } |
| 2046 | 2186 | break; |
| 2047 | | } |
| 2187 | } |
| 2048 | 2188 | break; |
| 2049 | 2189 | case 0x102a: /* $512a */ |
| 2050 | | LOG_MMC(("MMC5 $512a vrom select: %02x (mode: %d)\n", data, state->MMC5_vrom_bank_mode)); |
| 2051 | | switch (state->MMC5_vrom_bank_mode) |
| 2052 | | { |
| 2190 | LOG_MMC(("MMC5 $512a vrom select: %02x (mode: %d)\n", data, state->mmc5_chr_mode)); |
| 2191 | switch (state->mmc5_chr_mode) |
| 2192 | { |
| 2053 | 2193 | case 0x03: |
| 2054 | 2194 | /* 1k switch */ |
| 2055 | 2195 | state->MMC5_vrom_bank[10] = data | (state->mmc5_high_chr << 8); |
| r8330 | r8331 | |
| 2064 | 2204 | state->vrom_page_b = 1; |
| 2065 | 2205 | } |
| 2066 | 2206 | break; |
| 2067 | | } |
| 2207 | } |
| 2068 | 2208 | break; |
| 2069 | 2209 | case 0x102b: /* $512b */ |
| 2070 | | LOG_MMC(("MMC5 $512b vrom select: %02x (mode: %d)\n", data, state->MMC5_vrom_bank_mode)); |
| 2071 | | switch (state->MMC5_vrom_bank_mode) |
| 2072 | | { |
| 2210 | LOG_MMC(("MMC5 $512b vrom select: %02x (mode: %d)\n", data, state->mmc5_chr_mode)); |
| 2211 | switch (state->mmc5_chr_mode) |
| 2212 | { |
| 2073 | 2213 | case 0x00: |
| 2074 | 2214 | /* 8k switch */ |
| 2075 | 2215 | /* switches in first half of an 8K bank!) */ |
| r8330 | r8331 | |
| 2100 | 2240 | state->vrom_page_b = 1; |
| 2101 | 2241 | } |
| 2102 | 2242 | break; |
| 2103 | | } |
| 2243 | } |
| 2104 | 2244 | break; |
| 2105 | | |
| 2245 | |
| 2106 | 2246 | case 0x1030: /* $5130 */ |
| 2107 | 2247 | state->mmc5_high_chr = data & 0x03; |
| 2108 | 2248 | if (state->mmc5_vram_control == 1) |
| r8330 | r8331 | |
| 2111 | 2251 | // is to be used for all background tiles on the screen. |
| 2112 | 2252 | } |
| 2113 | 2253 | break; |
| 2114 | | |
| 2115 | | |
| 2254 | |
| 2255 | |
| 2116 | 2256 | case 0x1100: /* $5200 */ |
| 2117 | 2257 | state->mmc5_split_scr = data; |
| 2118 | 2258 | // in EX2 and EX3 modes, no split screen |
| 2119 | 2259 | if (state->mmc5_vram_control & 0x02) |
| 2120 | 2260 | state->mmc5_split_scr &= 0x7f; |
| 2261 | state->mmc5_split_ctrl = data; |
| 2121 | 2262 | break; |
| 2122 | | |
| 2263 | |
| 2264 | case 0x1101: /* $5201 */ |
| 2265 | state->mmc5_split_yst = (data >= 240) ? data - 16 : data; |
| 2266 | break; |
| 2267 | |
| 2268 | case 0x1102: /* $5202 */ |
| 2269 | state->mmc5_split_bank = data; |
| 2270 | break; |
| 2271 | |
| 2123 | 2272 | case 0x1103: /* $5203 */ |
| 2124 | 2273 | state->IRQ_count = data; |
| 2125 | 2274 | state->MMC5_scanline = data; |
| r8330 | r8331 | |
| 2135 | 2284 | case 0x1106: /* $5206 */ |
| 2136 | 2285 | state->mult2 = data; |
| 2137 | 2286 | break; |
| 2138 | | |
| 2287 | |
| 2139 | 2288 | default: |
| 2140 | 2289 | logerror("** MMC5 uncaught write, offset: %04x, data: %02x\n", offset + 0x4100, data); |
| 2141 | 2290 | break; |
| r8330 | r8331 | |
| 9356 | 9505 | LOG_MMC(("bmc_190in1_w offset: %04x, data: %02x\n", offset, data)); |
| 9357 | 9506 | |
| 9358 | 9507 | set_nt_mirroring(space->machine, BIT(data, 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); |
| 9359 | | data >>= 2; |
| 9360 | | prg16_89ab(space->machine, data); |
| 9361 | | prg16_cdef(space->machine, data); |
| 9362 | | chr8(space->machine, data, CHRROM); |
| 9508 | offset >>= 2; |
| 9509 | prg16_89ab(space->machine, offset); |
| 9510 | prg16_cdef(space->machine, offset); |
| 9511 | chr8(space->machine, offset, CHRROM); |
| 9363 | 9512 | } |
| 9364 | 9513 | |
| 9365 | 9514 | /************************************************************* |
| r8330 | r8331 | |
| 10663 | 10812 | if (state->mmc_latch1) |
| 10664 | 10813 | return state->mmc_dipsetting; // cart mode, depending on the Dip Switches (always zero atm, given we have no way to add cart-based DIPs) |
| 10665 | 10814 | else |
| 10666 | | { // usual ROM access |
| 10667 | | switch (offset & 0x6000) |
| 10668 | | { |
| 10669 | | case 0x0000: |
| 10670 | | return state->rom[0x10000 + state->prg_bank[0] * 0x2000 + (offset & 0x1fff)]; |
| 10671 | | case 0x2000: |
| 10672 | | return state->rom[0x10000 + state->prg_bank[1] * 0x2000 + (offset & 0x1fff)]; |
| 10673 | | case 0x4000: |
| 10674 | | return state->rom[0x10000 + state->prg_bank[2] * 0x2000 + (offset & 0x1fff)]; |
| 10675 | | case 0x6000: |
| 10676 | | return state->rom[0x10000 + state->prg_bank[3] * 0x2000 + (offset & 0x1fff)]; |
| 10677 | | } |
| 10678 | | return 0; |
| 10679 | | } |
| 10815 | return mmc_hi_access_rom(space->machine, offset); |
| 10680 | 10816 | } |
| 10681 | 10817 | |
| 10682 | 10818 | /************************************************************* |
| r8330 | r8331 | |
| 10747 | 10883 | chr8(space->machine, offset & 0x0f, CHRROM); |
| 10748 | 10884 | } |
| 10749 | 10885 | |
| 10886 | /************************************************************* |
| 10750 | 10887 | |
| 10888 | BMC-NTD-03 |
| 10751 | 10889 | |
| 10890 | *************************************************************/ |
| 10891 | |
| 10892 | static WRITE8_HANDLER( bmc_ntd03_w ) |
| 10893 | { |
| 10894 | UINT8 pbank, cbank; |
| 10895 | LOG_MMC(("bmc_ntd03_w, offset: %04x, data: %02x\n", offset, data)); |
| 10896 | |
| 10897 | pbank = (offset >> 10) & 0x1e; |
| 10898 | cbank = ((offset & 0x300) >> 5) | (offset & 0x07); |
| 10899 | |
| 10900 | if (BIT(offset, 7)) |
| 10901 | { |
| 10902 | prg16_89ab(space->machine, pbank | BIT(offset, 6)); |
| 10903 | prg16_cdef(space->machine, pbank | BIT(offset, 6)); |
| 10904 | } |
| 10905 | else |
| 10906 | prg32(space->machine, pbank >> 1); |
| 10907 | |
| 10908 | set_nt_mirroring(space->machine, BIT(data, 10) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); |
| 10909 | |
| 10910 | chr8(space->machine, cbank, CHRROM); |
| 10911 | } |
| 10912 | |
| 10913 | /************************************************************* |
| 10914 | |
| 10915 | BMC-GHOSTBUSTERS63IN1 |
| 10916 | |
| 10917 | in MESS: only preliminar support |
| 10918 | |
| 10919 | *************************************************************/ |
| 10920 | |
| 10921 | static void bmc_gb63_update( running_machine *machine ) |
| 10922 | { |
| 10923 | nes_state *state = (nes_state *)machine->driver_data; |
| 10924 | |
| 10925 | set_nt_mirroring(machine, BIT(state->mmc_reg[0], 6) ? PPU_MIRROR_VERT : PPU_MIRROR_HORZ); |
| 10926 | |
| 10927 | if (BIT(state->mmc_reg[0], 5)) |
| 10928 | { |
| 10929 | prg16_89ab(machine, state->mmc_reg[0] & 0x1f); // FIXME: here probably we could also have PRGRAM, depending on mmc_latch1! |
| 10930 | prg16_cdef(machine, state->mmc_reg[0] & 0x1f); // FIXME: here probably we could also have PRGRAM, depending on mmc_latch1! |
| 10931 | } |
| 10932 | else |
| 10933 | prg32(machine, (state->mmc_reg[0] & 0x1f) >> 1); // FIXME: here probably we could also have PRGRAM, depending on mmc_latch1! |
| 10934 | |
| 10935 | if (BIT(state->mmc_reg[1], 2)) |
| 10936 | chr8(machine, 0, CHRRAM); |
| 10937 | // else |
| 10938 | // chr8(machine, 0, CHRROM); |
| 10939 | } |
| 10940 | |
| 10941 | static WRITE8_HANDLER( bmc_gb63_w ) |
| 10942 | { |
| 10943 | nes_state *state = (nes_state *)space->machine->driver_data; |
| 10944 | LOG_MMC(("bmc_gb63_w, offset: %04x, data: %02x\n", offset, data)); |
| 10945 | |
| 10946 | state->mmc_reg[offset & 1] = data; |
| 10947 | state->mmc_latch1 = BIT(state->mmc_reg[0], 7) | (BIT(state->mmc_reg[1], 0) << 1); |
| 10948 | |
| 10949 | } |
| 10950 | |
| 10951 | static READ8_HANDLER( bmc_gb63_r ) |
| 10952 | { |
| 10953 | nes_state *state = (nes_state *)space->machine->driver_data; |
| 10954 | LOG_MMC(("bmc_gb63_r, offset: %04x\n", offset)); |
| 10955 | // state->mmc_dipsetting = input_port_read(space->machine, "CARTDIPS"); |
| 10956 | |
| 10957 | if (state->mmc_latch1 == 1) |
| 10958 | return 0xff; // open bus |
| 10959 | else |
| 10960 | return mmc_hi_access_rom(space->machine, offset); |
| 10961 | } |
| 10962 | |
| 10963 | /************************************************************* |
| 10964 | |
| 10965 | UNL-EDU2000 |
| 10966 | |
| 10967 | *************************************************************/ |
| 10968 | |
| 10969 | static WRITE8_HANDLER( edu2k_w ) |
| 10970 | { |
| 10971 | LOG_MMC(("edu2k_w, offset: %04x, data: %02x\n", offset, data)); |
| 10972 | |
| 10973 | prg32(space->machine, data & 0x1f); |
| 10974 | wram_bank(space->machine, (data & 0xc0) >> 6, NES_WRAM); |
| 10975 | } |
| 10976 | |
| 10977 | |
| 10978 | |
| 10752 | 10979 | typedef void (*nes_ppu_latch)(running_device *device, offs_t offset); |
| 10753 | 10980 | |
| 10754 | 10981 | struct nes_memory_accessor |
| r8330 | r8331 | |
| 11006 | 11233 | { BMC_VT5201, NES_NOACCESS, NES_NOACCESS, {bmc_vt5201_w, bmc_vt5201_r}, NULL, NULL, NULL }, |
| 11007 | 11234 | { BMC_BENSHENG_BS5, NES_NOACCESS, NES_NOACCESS, NES_WRITEONLY(bmc_bs5_w), NULL, NULL, NULL }, |
| 11008 | 11235 | { BMC_810544, NES_NOACCESS, NES_NOACCESS, NES_WRITEONLY(bmc_810544_w), NULL, NULL, NULL }, |
| 11236 | { BMC_NTD_03, NES_NOACCESS, NES_NOACCESS, NES_WRITEONLY(bmc_ntd03_w), NULL, NULL, NULL }, |
| 11237 | { BMC_G63IN1, NES_NOACCESS, NES_NOACCESS, {bmc_gb63_w, bmc_gb63_r}, NULL, NULL, NULL }, |
| 11238 | { UNL_EDU2K, NES_NOACCESS, NES_NOACCESS, NES_WRITEONLY(edu2k_w), NULL, NULL, NULL }, |
| 11009 | 11239 | { UNSUPPORTED_BOARD, NES_NOACCESS, NES_NOACCESS, NES_NOACCESS, NULL, NULL, NULL }, |
| 11010 | 11240 | // |
| 11011 | 11241 | }; |