trunk/src/mess/drivers/snes.c
| r29188 | r29189 | |
| 1815 | 1815 | case SNES_Z80GB: // skeleton support |
| 1816 | 1816 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x000000, 0x7dffff, read8_delegate(FUNC(snes_console_state::snessgb_lo_r),this), write8_delegate(FUNC(snes_console_state::snessgb_lo_w),this)); |
| 1817 | 1817 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x800000, 0xffffff, read8_delegate(FUNC(snes_console_state::snessgb_hi_r),this), write8_delegate(FUNC(snes_console_state::snessgb_hi_w),this)); |
| 1818 | | set_5a22_map(m_maincpu); |
| 1818 | m_maincpu->set_5a22_map(); |
| 1819 | 1819 | break; |
| 1820 | 1820 | case SNES_SA1: // skeleton support |
| 1821 | 1821 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x000000, 0x7dffff, read8_delegate(FUNC(snes_console_state::snessa1_lo_r),this), write8_delegate(FUNC(snes_console_state::snessa1_lo_w),this)); |
| 1822 | 1822 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x800000, 0xffffff, read8_delegate(FUNC(snes_console_state::snessa1_hi_r),this), write8_delegate(FUNC(snes_console_state::snessa1_hi_w),this)); |
| 1823 | | set_5a22_map(m_maincpu); |
| 1823 | m_maincpu->set_5a22_map(); |
| 1824 | 1824 | break; |
| 1825 | 1825 | case SNES_DSP: |
| 1826 | 1826 | m_maincpu->space(AS_PROGRAM).install_read_handler(0x208000, 0x20ffff, 0, 0x9f0000, read8_delegate(FUNC(base_sns_cart_slot_device::chip_read),(base_sns_cart_slot_device*)m_cartslot)); |
| r29188 | r29189 | |
| 1841 | 1841 | case SNES_SFX: |
| 1842 | 1842 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x000000, 0x7dffff, read8_delegate(FUNC(snes_console_state::snessfx_lo_r),this), write8_delegate(FUNC(snes_console_state::snessfx_lo_w),this)); |
| 1843 | 1843 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x800000, 0xffffff, read8_delegate(FUNC(snes_console_state::snessfx_hi_r),this), write8_delegate(FUNC(snes_console_state::snessfx_hi_w),this)); |
| 1844 | | set_5a22_map(m_maincpu); |
| 1844 | m_maincpu->set_5a22_map(); |
| 1845 | 1845 | break; |
| 1846 | 1846 | case SNES_SDD1: |
| 1847 | 1847 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x000000, 0x7dffff, read8_delegate(FUNC(snes_console_state::snessdd1_lo_r),this), write8_delegate(FUNC(snes_console_state::snessdd1_lo_w),this)); |
| 1848 | 1848 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x800000, 0xffffff, read8_delegate(FUNC(snes_console_state::snessdd1_hi_r),this), write8_delegate(FUNC(snes_console_state::snessdd1_hi_w),this)); |
| 1849 | | set_5a22_map(m_maincpu); |
| 1849 | m_maincpu->set_5a22_map(); |
| 1850 | 1850 | break; |
| 1851 | 1851 | case SNES_BSX: |
| 1852 | 1852 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x000000, 0x7dffff, read8_delegate(FUNC(snes_console_state::snesbsx_lo_r),this), write8_delegate(FUNC(snes_console_state::snesbsx_lo_w),this)); |
| 1853 | 1853 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x800000, 0xffffff, read8_delegate(FUNC(snes_console_state::snesbsx_hi_r),this), write8_delegate(FUNC(snes_console_state::snesbsx_hi_w),this)); |
| 1854 | | set_5a22_map(m_maincpu); |
| 1854 | m_maincpu->set_5a22_map(); |
| 1855 | 1855 | break; |
| 1856 | 1856 | // HiROM & HiROM + addons |
| 1857 | 1857 | case SNES_MODE21: |
| 1858 | 1858 | case SNES_BSXHI: |
| 1859 | 1859 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x000000, 0x7dffff, read8_delegate(FUNC(snes_console_state::snes21_lo_r),this), write8_delegate(FUNC(snes_console_state::snes21_lo_w),this)); |
| 1860 | 1860 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x800000, 0xffffff, read8_delegate(FUNC(snes_console_state::snes21_hi_r),this), write8_delegate(FUNC(snes_console_state::snes21_hi_w),this)); |
| 1861 | | set_5a22_map(m_maincpu); |
| 1861 | m_maincpu->set_5a22_map(); |
| 1862 | 1862 | break; |
| 1863 | 1863 | case SNES_DSP_MODE21: |
| 1864 | 1864 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x000000, 0x7dffff, read8_delegate(FUNC(snes_console_state::snes21_lo_r),this), write8_delegate(FUNC(snes_console_state::snes21_lo_w),this)); |
| 1865 | 1865 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x800000, 0xffffff, read8_delegate(FUNC(snes_console_state::snes21_hi_r),this), write8_delegate(FUNC(snes_console_state::snes21_hi_w),this)); |
| 1866 | 1866 | m_maincpu->space(AS_PROGRAM).install_read_handler(0x006000, 0x007fff, 0, 0x9f0000, read8_delegate(FUNC(base_sns_cart_slot_device::chip_read),(base_sns_cart_slot_device*)m_cartslot)); |
| 1867 | 1867 | m_maincpu->space(AS_PROGRAM).install_write_handler(0x006000, 0x007fff, 0, 0x9f0000, write8_delegate(FUNC(base_sns_cart_slot_device::chip_write),(base_sns_cart_slot_device*)m_cartslot)); |
| 1868 | | set_5a22_map(m_maincpu); |
| 1868 | m_maincpu->set_5a22_map(); |
| 1869 | 1869 | break; |
| 1870 | 1870 | case SNES_SRTC: |
| 1871 | 1871 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x000000, 0x7dffff, read8_delegate(FUNC(snes_console_state::snes21_lo_r),this), write8_delegate(FUNC(snes_console_state::snes21_lo_w),this)); |
| 1872 | 1872 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x800000, 0xffffff, read8_delegate(FUNC(snes_console_state::snes21_hi_r),this), write8_delegate(FUNC(snes_console_state::snes21_hi_w),this)); |
| 1873 | 1873 | m_maincpu->space(AS_PROGRAM).install_read_handler(0x002800, 0x002800, 0, 0xbf0000, read8_delegate(FUNC(base_sns_cart_slot_device::chip_read),(base_sns_cart_slot_device*)m_cartslot)); |
| 1874 | 1874 | m_maincpu->space(AS_PROGRAM).install_write_handler(0x002801, 0x002801, 0, 0xbf0000, write8_delegate(FUNC(base_sns_cart_slot_device::chip_write),(base_sns_cart_slot_device*)m_cartslot)); |
| 1875 | | set_5a22_map(m_maincpu); |
| 1875 | m_maincpu->set_5a22_map(); |
| 1876 | 1876 | break; |
| 1877 | 1877 | case SNES_SPC7110: |
| 1878 | 1878 | case SNES_SPC7110_RTC: |
| 1879 | 1879 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x000000, 0x7dffff, read8_delegate(FUNC(snes_console_state::snes7110_lo_r),this), write8_delegate(FUNC(snes_console_state::snes7110_lo_w),this)); |
| 1880 | 1880 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x800000, 0xffffff, read8_delegate(FUNC(snes_console_state::snes7110_hi_r),this), write8_delegate(FUNC(snes_console_state::snes7110_hi_w),this)); |
| 1881 | | set_5a22_map(m_maincpu); |
| 1881 | m_maincpu->set_5a22_map(); |
| 1882 | 1882 | break; |
| 1883 | 1883 | case SNES_PFEST94: |
| 1884 | 1884 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x000000, 0x7dffff, read8_delegate(FUNC(snes_console_state::pfest94_lo_r),this), write8_delegate(FUNC(snes_console_state::pfest94_lo_w),this)); |
| 1885 | 1885 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x800000, 0xffffff, read8_delegate(FUNC(snes_console_state::pfest94_hi_r),this), write8_delegate(FUNC(snes_console_state::pfest94_hi_w),this)); |
| 1886 | | set_5a22_map(m_maincpu); |
| 1886 | m_maincpu->set_5a22_map(); |
| 1887 | 1887 | break; |
| 1888 | 1888 | // pirate 'mappers' |
| 1889 | 1889 | case SNES_POKEMON: |
| r29188 | r29189 | |
| 1910 | 1910 | case SNES_BANANA: |
| 1911 | 1911 | // m_maincpu->space(AS_PROGRAM).install_read_handler(0x808000, 0x80ffff, 0, 0x780000, read8_delegate(FUNC(base_sns_cart_slot_device::chip_read),(base_sns_cart_slot_device*)m_cartslot)); |
| 1912 | 1912 | // m_maincpu->space(AS_PROGRAM).install_write_handler(0x808000, 0x80ffff, 0, 0x780000, write8_delegate(FUNC(base_sns_cart_slot_device::chip_write),(base_sns_cart_slot_device*)m_cartslot)); |
| 1913 | | // set_5a22_map(m_maincpu); |
| 1913 | // m_maincpu->set_5a22_map(); |
| 1914 | 1914 | break; |
| 1915 | 1915 | } |
| 1916 | 1916 | |
trunk/src/emu/cpu/g65816/g65816.c
| r29188 | r29189 | |
| 584 | 584 | 8 CPU cycles for division at first, since using 16 produces bugs (see e.g. |
| 585 | 585 | Triforce pieces in Zelda 3 intro) */ |
| 586 | 586 | |
| 587 | | static WRITE8_HANDLER( wrmpya_w ) |
| 587 | WRITE8_MEMBER( _5a22_device::wrmpya_w ) |
| 588 | 588 | { |
| 589 | | g65816i_cpu_struct *cpustate = get_safe_token(&space.device()); |
| 589 | g65816i_cpu_struct *cpustate = get_safe_token(this); |
| 590 | 590 | |
| 591 | 591 | cpustate->wrmpya = data; |
| 592 | 592 | } |
| 593 | 593 | |
| 594 | | static WRITE8_HANDLER( wrmpyb_w ) |
| 594 | WRITE8_MEMBER( _5a22_device::wrmpyb_w ) |
| 595 | 595 | { |
| 596 | | g65816i_cpu_struct *cpustate = get_safe_token(&space.device()); |
| 596 | g65816i_cpu_struct *cpustate = get_safe_token(this); |
| 597 | 597 | |
| 598 | 598 | cpustate->wrmpyb = data; |
| 599 | 599 | cpustate->rdmpy = cpustate->wrmpya * cpustate->wrmpyb; |
| 600 | 600 | /* TODO: cpustate->rddiv == 0? */ |
| 601 | 601 | } |
| 602 | 602 | |
| 603 | | static WRITE8_HANDLER( wrdivl_w ) |
| 603 | WRITE8_MEMBER( _5a22_device::wrdivl_w ) |
| 604 | 604 | { |
| 605 | | g65816i_cpu_struct *cpustate = get_safe_token(&space.device()); |
| 605 | g65816i_cpu_struct *cpustate = get_safe_token(this); |
| 606 | 606 | |
| 607 | 607 | cpustate->wrdiv = (data) | (cpustate->wrdiv & 0xff00); |
| 608 | 608 | } |
| 609 | 609 | |
| 610 | | static WRITE8_HANDLER( wrdivh_w ) |
| 610 | WRITE8_MEMBER( _5a22_device::wrdivh_w ) |
| 611 | 611 | { |
| 612 | | g65816i_cpu_struct *cpustate = get_safe_token(&space.device()); |
| 612 | g65816i_cpu_struct *cpustate = get_safe_token(this); |
| 613 | 613 | |
| 614 | 614 | cpustate->wrdiv = (data << 8) | (cpustate->wrdiv & 0xff); |
| 615 | 615 | } |
| 616 | 616 | |
| 617 | | static WRITE8_HANDLER( wrdvdd_w ) |
| 617 | WRITE8_MEMBER( _5a22_device::wrdvdd_w ) |
| 618 | 618 | { |
| 619 | | g65816i_cpu_struct *cpustate = get_safe_token(&space.device()); |
| 619 | g65816i_cpu_struct *cpustate = get_safe_token(this); |
| 620 | 620 | UINT16 quotient, remainder; |
| 621 | 621 | |
| 622 | 622 | cpustate->dvdd = data; |
| r29188 | r29189 | |
| 628 | 628 | cpustate->rdmpy = remainder; |
| 629 | 629 | } |
| 630 | 630 | |
| 631 | | static WRITE8_HANDLER( memsel_w ) |
| 631 | WRITE8_MEMBER( _5a22_device::memsel_w ) |
| 632 | 632 | { |
| 633 | | g65816i_cpu_struct *cpustate = get_safe_token(&space.device()); |
| 633 | g65816i_cpu_struct *cpustate = get_safe_token(this); |
| 634 | 634 | cpustate->fastROM = data & 1; |
| 635 | 635 | } |
| 636 | 636 | |
| 637 | | static READ8_HANDLER( rddivl_r ) |
| 637 | READ8_MEMBER( _5a22_device::rddivl_r ) |
| 638 | 638 | { |
| 639 | | g65816i_cpu_struct *cpustate = get_safe_token(&space.device()); |
| 639 | g65816i_cpu_struct *cpustate = get_safe_token(this); |
| 640 | 640 | return cpustate->rddiv & 0xff; |
| 641 | 641 | } |
| 642 | 642 | |
| 643 | | static READ8_HANDLER( rddivh_r ) |
| 643 | READ8_MEMBER( _5a22_device::rddivh_r ) |
| 644 | 644 | { |
| 645 | | g65816i_cpu_struct *cpustate = get_safe_token(&space.device()); |
| 645 | g65816i_cpu_struct *cpustate = get_safe_token(this); |
| 646 | 646 | return cpustate->rddiv >> 8; |
| 647 | 647 | } |
| 648 | 648 | |
| 649 | | static READ8_HANDLER( rdmpyl_r ) |
| 649 | READ8_MEMBER( _5a22_device::rdmpyl_r ) |
| 650 | 650 | { |
| 651 | | g65816i_cpu_struct *cpustate = get_safe_token(&space.device()); |
| 651 | g65816i_cpu_struct *cpustate = get_safe_token(this); |
| 652 | 652 | return cpustate->rdmpy & 0xff; |
| 653 | 653 | } |
| 654 | 654 | |
| 655 | | static READ8_HANDLER( rdmpyh_r ) |
| 655 | READ8_MEMBER( _5a22_device::rdmpyh_r ) |
| 656 | 656 | { |
| 657 | | g65816i_cpu_struct *cpustate = get_safe_token(&space.device()); |
| 657 | g65816i_cpu_struct *cpustate = get_safe_token(this); |
| 658 | 658 | return cpustate->rdmpy >> 8; |
| 659 | 659 | } |
| 660 | 660 | |
| 661 | 661 | |
| 662 | | static ADDRESS_MAP_START(_5a22_map, AS_PROGRAM, 8, legacy_cpu_device) |
| 663 | | AM_RANGE(0x4202, 0x4202) AM_MIRROR(0xbf0000) AM_WRITE_LEGACY(wrmpya_w) |
| 664 | | AM_RANGE(0x4203, 0x4203) AM_MIRROR(0xbf0000) AM_WRITE_LEGACY(wrmpyb_w) |
| 665 | | AM_RANGE(0x4204, 0x4204) AM_MIRROR(0xbf0000) AM_WRITE_LEGACY(wrdivl_w) |
| 666 | | AM_RANGE(0x4205, 0x4205) AM_MIRROR(0xbf0000) AM_WRITE_LEGACY(wrdivh_w) |
| 667 | | AM_RANGE(0x4206, 0x4206) AM_MIRROR(0xbf0000) AM_WRITE_LEGACY(wrdvdd_w) |
| 662 | static ADDRESS_MAP_START(_5a22_map, AS_PROGRAM, 8, _5a22_device) |
| 663 | AM_RANGE(0x4202, 0x4202) AM_MIRROR(0xbf0000) AM_WRITE(wrmpya_w) |
| 664 | AM_RANGE(0x4203, 0x4203) AM_MIRROR(0xbf0000) AM_WRITE(wrmpyb_w) |
| 665 | AM_RANGE(0x4204, 0x4204) AM_MIRROR(0xbf0000) AM_WRITE(wrdivl_w) |
| 666 | AM_RANGE(0x4205, 0x4205) AM_MIRROR(0xbf0000) AM_WRITE(wrdivh_w) |
| 667 | AM_RANGE(0x4206, 0x4206) AM_MIRROR(0xbf0000) AM_WRITE(wrdvdd_w) |
| 668 | 668 | |
| 669 | | AM_RANGE(0x420d, 0x420d) AM_MIRROR(0xbf0000) AM_WRITE_LEGACY(memsel_w) |
| 669 | AM_RANGE(0x420d, 0x420d) AM_MIRROR(0xbf0000) AM_WRITE(memsel_w) |
| 670 | 670 | |
| 671 | | AM_RANGE(0x4214, 0x4214) AM_MIRROR(0xbf0000) AM_READ_LEGACY(rddivl_r) |
| 672 | | AM_RANGE(0x4215, 0x4215) AM_MIRROR(0xbf0000) AM_READ_LEGACY(rddivh_r) |
| 673 | | AM_RANGE(0x4216, 0x4216) AM_MIRROR(0xbf0000) AM_READ_LEGACY(rdmpyl_r) |
| 674 | | AM_RANGE(0x4217, 0x4217) AM_MIRROR(0xbf0000) AM_READ_LEGACY(rdmpyh_r) |
| 671 | AM_RANGE(0x4214, 0x4214) AM_MIRROR(0xbf0000) AM_READ(rddivl_r) |
| 672 | AM_RANGE(0x4215, 0x4215) AM_MIRROR(0xbf0000) AM_READ(rddivh_r) |
| 673 | AM_RANGE(0x4216, 0x4216) AM_MIRROR(0xbf0000) AM_READ(rdmpyl_r) |
| 674 | AM_RANGE(0x4217, 0x4217) AM_MIRROR(0xbf0000) AM_READ(rdmpyh_r) |
| 675 | 675 | |
| 676 | 676 | ADDRESS_MAP_END |
| 677 | 677 | |
| 678 | | void set_5a22_map(legacy_cpu_device &cpu) |
| 678 | void _5a22_device::set_5a22_map() |
| 679 | 679 | { |
| 680 | | cpu.space(AS_PROGRAM).install_legacy_write_handler(0x4202, 0x4202, 0, 0xbf0000, FUNC(wrmpya_w)); |
| 681 | | cpu.space(AS_PROGRAM).install_legacy_write_handler(0x4203, 0x4203, 0, 0xbf0000, FUNC(wrmpyb_w)); |
| 682 | | cpu.space(AS_PROGRAM).install_legacy_write_handler(0x4204, 0x4204, 0, 0xbf0000, FUNC(wrdivl_w)); |
| 683 | | cpu.space(AS_PROGRAM).install_legacy_write_handler(0x4205, 0x4205, 0, 0xbf0000, FUNC(wrdivh_w)); |
| 684 | | cpu.space(AS_PROGRAM).install_legacy_write_handler(0x4206, 0x4206, 0, 0xbf0000, FUNC(wrdvdd_w)); |
| 680 | space(AS_PROGRAM).install_write_handler(0x4202, 0x4202, 0, 0xbf0000, write8_delegate(FUNC(_5a22_device::wrmpya_w),this)); |
| 681 | space(AS_PROGRAM).install_write_handler(0x4203, 0x4203, 0, 0xbf0000, write8_delegate(FUNC(_5a22_device::wrmpyb_w),this)); |
| 682 | space(AS_PROGRAM).install_write_handler(0x4204, 0x4204, 0, 0xbf0000, write8_delegate(FUNC(_5a22_device::wrdivl_w),this)); |
| 683 | space(AS_PROGRAM).install_write_handler(0x4205, 0x4205, 0, 0xbf0000, write8_delegate(FUNC(_5a22_device::wrdivh_w),this)); |
| 684 | space(AS_PROGRAM).install_write_handler(0x4206, 0x4206, 0, 0xbf0000, write8_delegate(FUNC(_5a22_device::wrdvdd_w),this)); |
| 685 | 685 | |
| 686 | | cpu.space(AS_PROGRAM).install_legacy_write_handler(0x420d, 0x420d, 0, 0xbf0000, FUNC(memsel_w)); |
| 686 | space(AS_PROGRAM).install_write_handler(0x420d, 0x420d, 0, 0xbf0000, write8_delegate(FUNC(_5a22_device::memsel_w),this)); |
| 687 | 687 | |
| 688 | | cpu.space(AS_PROGRAM).install_legacy_read_handler(0x4214, 0x4214, 0, 0xbf0000, FUNC(rddivl_r)); |
| 689 | | cpu.space(AS_PROGRAM).install_legacy_read_handler(0x4215, 0x4215, 0, 0xbf0000, FUNC(rddivh_r)); |
| 690 | | cpu.space(AS_PROGRAM).install_legacy_read_handler(0x4216, 0x4216, 0, 0xbf0000, FUNC(rdmpyl_r)); |
| 691 | | cpu.space(AS_PROGRAM).install_legacy_read_handler(0x4217, 0x4217, 0, 0xbf0000, FUNC(rdmpyh_r)); |
| 688 | space(AS_PROGRAM).install_read_handler(0x4214, 0x4214, 0, 0xbf0000, read8_delegate(FUNC(_5a22_device::rddivl_r),this)); |
| 689 | space(AS_PROGRAM).install_read_handler(0x4215, 0x4215, 0, 0xbf0000, read8_delegate(FUNC(_5a22_device::rddivh_r),this)); |
| 690 | space(AS_PROGRAM).install_read_handler(0x4216, 0x4216, 0, 0xbf0000, read8_delegate(FUNC(_5a22_device::rdmpyl_r),this)); |
| 691 | space(AS_PROGRAM).install_read_handler(0x4217, 0x4217, 0, 0xbf0000, read8_delegate(FUNC(_5a22_device::rdmpyh_r),this)); |
| 692 | 692 | } |
| 693 | 693 | |
| 694 | 694 | CPU_SET_INFO( _5a22 ) |