trunk/src/emu/bus/snes/snes_slot.c
| r29477 | r29478 | |
| 67 | 67 | //------------------------------------------------- |
| 68 | 68 | |
| 69 | 69 | device_sns_cart_interface::device_sns_cart_interface(const machine_config &mconfig, device_t &device) |
| 70 | | : device_slot_card_interface(mconfig, device), |
| 71 | | m_rom(NULL), |
| 72 | | m_nvram(NULL), |
| 73 | | m_bios(NULL), |
| 74 | | m_rtc_ram(NULL), |
| 75 | | m_rom_size(0), |
| 76 | | m_nvram_size(0), |
| 77 | | m_bios_size(0), |
| 78 | | m_rtc_ram_size(0) |
| 70 | : device_slot_card_interface(mconfig, device) |
| 79 | 71 | { |
| 80 | 72 | } |
| 81 | 73 | |
| r29477 | r29478 | |
| 92 | 84 | // rom_alloc - alloc the space for the cart |
| 93 | 85 | //------------------------------------------------- |
| 94 | 86 | |
| 95 | | void device_sns_cart_interface::rom_alloc(running_machine &machine, UINT32 size) |
| 87 | void device_sns_cart_interface::rom_alloc(UINT32 size) |
| 96 | 88 | { |
| 97 | | if (m_rom == NULL) |
| 98 | | { |
| 99 | | m_rom = auto_alloc_array_clear(machine, UINT8, size); |
| 100 | | m_rom_size = size; |
| 101 | | } |
| 89 | m_rom.resize(size); |
| 102 | 90 | } |
| 103 | 91 | |
| 104 | 92 | |
| r29477 | r29478 | |
| 106 | 94 | // nvram_alloc - alloc the space for the nvram |
| 107 | 95 | //------------------------------------------------- |
| 108 | 96 | |
| 109 | | void device_sns_cart_interface::nvram_alloc(running_machine &machine, UINT32 size) |
| 97 | void device_sns_cart_interface::nvram_alloc(UINT32 size) |
| 110 | 98 | { |
| 111 | 99 | if (m_nvram == NULL) |
| 112 | 100 | { |
| 113 | | m_nvram = auto_alloc_array_clear(machine, UINT8, size); |
| 114 | | m_nvram_size = size; |
| 115 | | state_save_register_item_pointer(machine, "SNES_CART", this->device().tag(), 0, m_nvram, m_nvram_size); |
| 101 | m_nvram.resize(size); |
| 102 | device().save_item(NAME(m_nvram)); |
| 116 | 103 | } |
| 117 | 104 | } |
| 118 | 105 | |
| r29477 | r29478 | |
| 124 | 111 | // saved by the device itself) |
| 125 | 112 | //------------------------------------------------- |
| 126 | 113 | |
| 127 | | void device_sns_cart_interface::rtc_ram_alloc(running_machine &machine, UINT32 size) |
| 114 | void device_sns_cart_interface::rtc_ram_alloc(UINT32 size) |
| 128 | 115 | { |
| 129 | 116 | if (m_rtc_ram == NULL) |
| 130 | 117 | { |
| 131 | | m_rtc_ram = auto_alloc_array_clear(machine, UINT8, size); |
| 132 | | m_rtc_ram_size = size; |
| 133 | | state_save_register_item_pointer(machine, "SNES_CART", this->device().tag(), 0, m_rtc_ram, m_rtc_ram_size); |
| 118 | m_rtc_ram.resize(size); |
| 119 | device().save_item(NAME(m_rtc_ram)); |
| 134 | 120 | } |
| 135 | 121 | } |
| 136 | 122 | |
| r29477 | r29478 | |
| 140 | 126 | // (optional) add-on CPU bios |
| 141 | 127 | //------------------------------------------------- |
| 142 | 128 | |
| 143 | | void device_sns_cart_interface::addon_bios_alloc(running_machine &machine, UINT32 size) |
| 129 | void device_sns_cart_interface::addon_bios_alloc(UINT32 size) |
| 144 | 130 | { |
| 145 | | if (m_bios == NULL) |
| 146 | | { |
| 147 | | m_bios = auto_alloc_array_clear(machine, UINT8, size); |
| 148 | | m_bios_size = size; |
| 149 | | } |
| 131 | m_bios.resize(size); |
| 150 | 132 | } |
| 151 | 133 | |
| 152 | 134 | |
| r29477 | r29478 | |
| 638 | 620 | |
| 639 | 621 | len = (software_entry() == NULL) ? (length() - offset) : get_software_region_length("rom"); |
| 640 | 622 | |
| 641 | | m_cart->rom_alloc(machine(), len); |
| 623 | m_cart->rom_alloc(len); |
| 642 | 624 | ROM = m_cart->get_rom_base(); |
| 643 | 625 | if (software_entry() == NULL) |
| 644 | 626 | fread(ROM, len); |
| r29477 | r29478 | |
| 652 | 634 | { |
| 653 | 635 | if (get_software_region("addon")) |
| 654 | 636 | { |
| 655 | | m_cart->addon_bios_alloc(machine(), get_software_region_length("addon")); |
| 637 | m_cart->addon_bios_alloc(get_software_region_length("addon")); |
| 656 | 638 | memcpy(m_cart->get_addon_bios_base(), get_software_region("addon"), get_software_region_length("addon")); |
| 657 | 639 | } |
| 658 | 640 | } |
| r29477 | r29478 | |
| 746 | 728 | if ((m_cart->get_rom_size() & 0x7fff) == 0x2800) |
| 747 | 729 | { |
| 748 | 730 | logerror("Found NEC DSP dump at the bottom of the ROM.\n"); |
| 749 | | m_cart->addon_bios_alloc(machine(), 0x2800); |
| 731 | m_cart->addon_bios_alloc(0x2800); |
| 750 | 732 | memcpy(m_cart->get_addon_bios_base(), m_cart->get_rom_base() + (m_cart->get_rom_size() - 0x2800), 0x2800); |
| 751 | 733 | m_cart->rom_map_setup(m_cart->get_rom_size() - 0x2800); |
| 752 | 734 | } |
| r29477 | r29478 | |
| 754 | 736 | if ((m_cart->get_rom_size() & 0x7fff) == 0x2000) |
| 755 | 737 | { |
| 756 | 738 | logerror("Found NEC DSP dump (byuu's version) at the bottom of the ROM.\n"); |
| 757 | | m_cart->addon_bios_alloc(machine(), 0x2800); |
| 739 | m_cart->addon_bios_alloc(0x2800); |
| 758 | 740 | for (int i = 0; i < 0x800; i++) |
| 759 | 741 | { |
| 760 | 742 | memcpy(m_cart->get_addon_bios_base() + i * 4 + 2, m_cart->get_rom_base() + (m_cart->get_rom_size() - 0x2000) + i * 3 + 0, 1); |
| r29477 | r29478 | |
| 772 | 754 | if ((m_cart->get_rom_size() & 0x3ffff) == 0x11000) |
| 773 | 755 | { |
| 774 | 756 | logerror("Found Seta DSP dump at the bottom of the ROM.\n"); |
| 775 | | m_cart->addon_bios_alloc(machine(), 0x11000); |
| 757 | m_cart->addon_bios_alloc(0x11000); |
| 776 | 758 | memcpy(m_cart->get_addon_bios_base(), m_cart->get_rom_base() + (m_cart->get_rom_size() - 0x11000), 0x11000); |
| 777 | 759 | m_cart->rom_map_setup(m_cart->get_rom_size() - 0x11000); |
| 778 | 760 | } |
| r29477 | r29478 | |
| 780 | 762 | if ((m_cart->get_rom_size() & 0xffff) == 0xd000) |
| 781 | 763 | { |
| 782 | 764 | logerror("Found Seta DSP dump (byuu's version) at the bottom of the ROM.\n"); |
| 783 | | m_cart->addon_bios_alloc(machine(), 0x11000); |
| 765 | m_cart->addon_bios_alloc(0x11000); |
| 784 | 766 | for (int i = 0; i < 0x4000; i++) |
| 785 | 767 | { |
| 786 | 768 | memcpy(m_cart->get_addon_bios_base() + i * 4 + 2, m_cart->get_rom_base() + (m_cart->get_rom_size() - 0xd000) + i * 3 + 0, 1); |
| r29477 | r29478 | |
| 796 | 778 | if ((m_cart->get_rom_size() & 0x7fff) == 0x0c00) |
| 797 | 779 | { |
| 798 | 780 | logerror("Found CX4 dump at the bottom of the ROM.\n"); |
| 799 | | m_cart->addon_bios_alloc(machine(), 0x0c00); |
| 781 | m_cart->addon_bios_alloc(0x0c00); |
| 800 | 782 | memcpy(m_cart->get_addon_bios_base(), m_cart->get_rom_base() + (m_cart->get_rom_size() - 0x0c00), 0x0c00); |
| 801 | 783 | m_cart->rom_map_setup(m_cart->get_rom_size() - 0x0c00); |
| 802 | 784 | } |
| r29477 | r29478 | |
| 805 | 787 | if ((m_cart->get_rom_size() & 0x3ffff) == 0x28000) |
| 806 | 788 | { |
| 807 | 789 | logerror("Found ST018 dump at the bottom of the ROM.\n"); |
| 808 | | m_cart->addon_bios_alloc(machine(), 0x28000); |
| 790 | m_cart->addon_bios_alloc(0x28000); |
| 809 | 791 | memcpy(m_cart->get_addon_bios_base(), m_cart->get_rom_base() + (m_cart->get_rom_size() - 0x28000), 0x28000); |
| 810 | 792 | m_cart->rom_map_setup(m_cart->get_rom_size() - 0x28000); |
| 811 | 793 | } |
| r29477 | r29478 | |
| 822 | 804 | { |
| 823 | 805 | case ADDON_DSP1: |
| 824 | 806 | ROM = machine().root_device().memregion(region)->base(); |
| 825 | | m_cart->addon_bios_alloc(machine(), 0x2800); |
| 807 | m_cart->addon_bios_alloc(0x2800); |
| 826 | 808 | memcpy(m_cart->get_addon_bios_base(), ROM, 0x2800); |
| 827 | 809 | break; |
| 828 | 810 | case ADDON_DSP1B: |
| 829 | 811 | ROM = machine().root_device().memregion(region)->base(); |
| 830 | | m_cart->addon_bios_alloc(machine(), 0x2800); |
| 812 | m_cart->addon_bios_alloc(0x2800); |
| 831 | 813 | memcpy(m_cart->get_addon_bios_base(), ROM, 0x2800); |
| 832 | 814 | break; |
| 833 | 815 | case ADDON_DSP2: |
| 834 | 816 | ROM = machine().root_device().memregion(region)->base(); |
| 835 | | m_cart->addon_bios_alloc(machine(), 0x2800); |
| 817 | m_cart->addon_bios_alloc(0x2800); |
| 836 | 818 | memcpy(m_cart->get_addon_bios_base(), ROM, 0x2800); |
| 837 | 819 | break; |
| 838 | 820 | case ADDON_DSP3: |
| 839 | 821 | ROM = machine().root_device().memregion(region)->base(); |
| 840 | | m_cart->addon_bios_alloc(machine(), 0x2800); |
| 822 | m_cart->addon_bios_alloc(0x2800); |
| 841 | 823 | memcpy(m_cart->get_addon_bios_base(), ROM, 0x2800); |
| 842 | 824 | break; |
| 843 | 825 | case ADDON_DSP4: |
| 844 | 826 | ROM = machine().root_device().memregion(region)->base(); |
| 845 | | m_cart->addon_bios_alloc(machine(), 0x2800); |
| 827 | m_cart->addon_bios_alloc(0x2800); |
| 846 | 828 | memcpy(m_cart->get_addon_bios_base(), ROM, 0x2800); |
| 847 | 829 | break; |
| 848 | 830 | case ADDON_ST010: |
| 849 | 831 | ROM = machine().root_device().memregion(region)->base(); |
| 850 | | m_cart->addon_bios_alloc(machine(), 0x11000); |
| 832 | m_cart->addon_bios_alloc(0x11000); |
| 851 | 833 | memcpy(m_cart->get_addon_bios_base(), ROM, 0x11000); |
| 852 | 834 | break; |
| 853 | 835 | case ADDON_ST011: |
| 854 | 836 | ROM = machine().root_device().memregion(region)->base(); |
| 855 | | m_cart->addon_bios_alloc(machine(), 0x11000); |
| 837 | m_cart->addon_bios_alloc(0x11000); |
| 856 | 838 | memcpy(m_cart->get_addon_bios_base(), ROM, 0x11000); |
| 857 | 839 | break; |
| 858 | 840 | } |
| r29477 | r29478 | |
| 883 | 865 | } |
| 884 | 866 | |
| 885 | 867 | if (size) |
| 886 | | m_cart->nvram_alloc(machine(), size); |
| 868 | m_cart->nvram_alloc(size); |
| 887 | 869 | |
| 888 | 870 | if (m_type == SNES_STROM) |
| 889 | | m_cart->nvram_alloc(machine(), 0x20000); |
| 871 | m_cart->nvram_alloc(0x20000); |
| 890 | 872 | if (m_type == SNES_BSX) |
| 891 | | m_cart->nvram_alloc(machine(), 0x8000); |
| 873 | m_cart->nvram_alloc(0x8000); |
| 892 | 874 | |
| 893 | 875 | // setup also RTC SRAM, when needed (to be removed when RTCs are converted to devices) |
| 894 | 876 | if (m_type == SNES_SRTC) |
| 895 | | m_cart->rtc_ram_alloc(machine(), 13); |
| 877 | m_cart->rtc_ram_alloc(13); |
| 896 | 878 | if (m_type == SNES_SPC7110_RTC) |
| 897 | | m_cart->rtc_ram_alloc(machine(), 16); |
| 879 | m_cart->rtc_ram_alloc(16); |
| 898 | 880 | } |
| 899 | 881 | |
| 900 | 882 | |
trunk/src/emu/bus/snes/snes_slot.h
| r29477 | r29478 | |
| 91 | 91 | ADDON_Z80GB |
| 92 | 92 | }; |
| 93 | 93 | |
| 94 | | // ======================> sns_cart_interface |
| 95 | | |
| 96 | | struct sns_cart_interface |
| 97 | | { |
| 98 | | }; |
| 99 | | |
| 100 | | |
| 101 | 94 | // ======================> device_sns_cart_interface |
| 102 | 95 | |
| 103 | 96 | class device_sns_cart_interface : public device_slot_card_interface |
| r29477 | r29478 | |
| 110 | 103 | // reading and writing |
| 111 | 104 | virtual DECLARE_READ8_MEMBER(read_l) { return 0xff; } // ROM access in range [00-7f] |
| 112 | 105 | virtual DECLARE_READ8_MEMBER(read_h) { return 0xff; } // ROM access in range [80-ff] |
| 113 | | virtual DECLARE_READ8_MEMBER(read_ram) { if (m_nvram) { UINT32 mask = m_nvram_size - 1; return m_nvram[offset & mask]; } else return 0xff; } // NVRAM access |
| 106 | virtual DECLARE_READ8_MEMBER(read_ram) { if (m_nvram) { UINT32 mask = m_nvram.count() - 1; return m_nvram[offset & mask]; } else return 0xff; } // NVRAM access |
| 114 | 107 | virtual DECLARE_WRITE8_MEMBER(write_l) {} // used by carts with subslots |
| 115 | 108 | virtual DECLARE_WRITE8_MEMBER(write_h) {} // used by carts with subslots |
| 116 | | virtual DECLARE_WRITE8_MEMBER(write_ram) { if (m_nvram) { UINT32 mask = m_nvram_size - 1; m_nvram[offset & mask] = data; return; } } // NVRAM access |
| 109 | virtual DECLARE_WRITE8_MEMBER(write_ram) { if (m_nvram) { UINT32 mask = m_nvram.count() - 1; m_nvram[offset & mask] = data; return; } } // NVRAM access |
| 117 | 110 | virtual DECLARE_READ8_MEMBER(chip_read) { return 0xff; } |
| 118 | 111 | virtual DECLARE_WRITE8_MEMBER(chip_write) {} |
| 119 | 112 | virtual void speedup_addon_bios_access() {}; |
| 120 | 113 | |
| 121 | | void rom_alloc(running_machine &machine, UINT32 size); |
| 122 | | void nvram_alloc(running_machine &machine, UINT32 size); |
| 123 | | void rtc_ram_alloc(running_machine &machine, UINT32 size); |
| 124 | | void addon_bios_alloc(running_machine &machine, UINT32 size); |
| 114 | void rom_alloc(UINT32 size); |
| 115 | void nvram_alloc(UINT32 size); |
| 116 | void rtc_ram_alloc(UINT32 size); |
| 117 | void addon_bios_alloc(UINT32 size); |
| 125 | 118 | UINT8* get_rom_base() { return m_rom; }; |
| 126 | 119 | UINT8* get_nvram_base() { return m_nvram; }; |
| 127 | 120 | UINT8* get_addon_bios_base() { return m_bios; }; |
| 128 | 121 | UINT8* get_rtc_ram_base() { return m_rtc_ram; }; |
| 129 | | UINT32 get_rom_size() { return m_rom_size; }; |
| 130 | | UINT32 get_nvram_size() { return m_nvram_size; }; |
| 131 | | UINT32 get_addon_bios_size() { return m_bios_size; }; |
| 132 | | UINT32 get_rtc_ram_size() { return m_rtc_ram_size; }; |
| 122 | UINT32 get_rom_size() { return m_rom.count(); }; |
| 123 | UINT32 get_nvram_size() { return m_nvram.count(); }; |
| 124 | UINT32 get_addon_bios_size() { return m_bios.count(); }; |
| 125 | UINT32 get_rtc_ram_size() { return m_rtc_ram.count(); }; |
| 133 | 126 | |
| 134 | 127 | void rom_map_setup(UINT32 size); |
| 135 | 128 | |
| 136 | 129 | // internal state |
| 137 | | UINT8 *m_rom; |
| 138 | | UINT8 *m_nvram; |
| 139 | | UINT8 *m_bios; |
| 140 | | UINT8 *m_rtc_ram; // temp pointer to save RTC ram to nvram (will disappear when RTCs become devices) |
| 141 | | UINT32 m_rom_size; |
| 142 | | UINT32 m_nvram_size; |
| 143 | | UINT32 m_bios_size; |
| 144 | | UINT32 m_rtc_ram_size; // temp |
| 130 | dynamic_buffer m_rom; |
| 131 | dynamic_buffer m_nvram; |
| 132 | dynamic_buffer m_bios; |
| 133 | dynamic_buffer m_rtc_ram; // temp pointer to save RTC ram to nvram (will disappear when RTCs become devices) |
| 145 | 134 | |
| 146 | 135 | UINT8 rom_bank_map[256]; // 32K chunks of rom |
| 147 | 136 | }; |
| r29477 | r29478 | |
| 150 | 139 | // ======================> base_sns_cart_slot_device |
| 151 | 140 | |
| 152 | 141 | class base_sns_cart_slot_device : public device_t, |
| 153 | | public sns_cart_interface, |
| 154 | 142 | public device_image_interface, |
| 155 | 143 | public device_slot_interface |
| 156 | 144 | { |