trunk/src/emu/bus/plus4/exp.c
| r26672 | r26673 | |
| 39 | 39 | |
| 40 | 40 | device_plus4_expansion_card_interface::device_plus4_expansion_card_interface(const machine_config &mconfig, device_t &device) |
| 41 | 41 | : device_slot_card_interface(mconfig, device), |
| 42 | | m_c1l(NULL), |
| 43 | | m_c1h(NULL), |
| 44 | | m_c2l(NULL), |
| 45 | | m_c2h(NULL), |
| 46 | | m_ram(NULL), |
| 47 | | m_nvram(NULL), |
| 48 | | m_nvram_size(0), |
| 42 | m_c1l(*this, "c1l"), |
| 43 | m_c1h(*this, "c1h"), |
| 44 | m_c2l(*this, "c2l"), |
| 45 | m_c2h(*this, "c2h"), |
| 49 | 46 | m_c1l_mask(0), |
| 50 | 47 | m_c1h_mask(0), |
| 51 | 48 | m_c2l_mask(0), |
| 52 | | m_c2h_mask(0), |
| 53 | | m_ram_mask(0) |
| 49 | m_c2h_mask(0) |
| 54 | 50 | { |
| 55 | 51 | m_slot = dynamic_cast<plus4_expansion_slot_device *>(device.owner()); |
| 56 | 52 | } |
| r26672 | r26673 | |
| 65 | 61 | } |
| 66 | 62 | |
| 67 | 63 | |
| 68 | | //------------------------------------------------- |
| 69 | | // plus4_c1l_pointer - get low ROM 1 pointer |
| 70 | | //------------------------------------------------- |
| 71 | 64 | |
| 72 | | UINT8* device_plus4_expansion_card_interface::plus4_c1l_pointer(running_machine &machine, size_t size) |
| 73 | | { |
| 74 | | if (m_c1l == NULL) |
| 75 | | { |
| 76 | | m_c1l = auto_alloc_array(machine, UINT8, size); |
| 77 | | |
| 78 | | m_c1l_mask = size - 1; |
| 79 | | } |
| 80 | | |
| 81 | | return m_c1l; |
| 82 | | } |
| 83 | | |
| 84 | | |
| 85 | | //------------------------------------------------- |
| 86 | | // plus4_c1h_pointer - get low ROM 1 pointer |
| 87 | | //------------------------------------------------- |
| 88 | | |
| 89 | | UINT8* device_plus4_expansion_card_interface::plus4_c1h_pointer(running_machine &machine, size_t size) |
| 90 | | { |
| 91 | | if (m_c1h == NULL) |
| 92 | | { |
| 93 | | m_c1h = auto_alloc_array(machine, UINT8, size); |
| 94 | | |
| 95 | | m_c1h_mask = size - 1; |
| 96 | | } |
| 97 | | |
| 98 | | return m_c1h; |
| 99 | | } |
| 100 | | |
| 101 | | |
| 102 | | //------------------------------------------------- |
| 103 | | // plus4_c2l_pointer - get low ROM 1 pointer |
| 104 | | //------------------------------------------------- |
| 105 | | |
| 106 | | UINT8* device_plus4_expansion_card_interface::plus4_c2l_pointer(running_machine &machine, size_t size) |
| 107 | | { |
| 108 | | if (m_c2l == NULL) |
| 109 | | { |
| 110 | | m_c2l = auto_alloc_array(machine, UINT8, size); |
| 111 | | |
| 112 | | m_c2l_mask = size - 1; |
| 113 | | } |
| 114 | | |
| 115 | | return m_c2l; |
| 116 | | } |
| 117 | | |
| 118 | | |
| 119 | | //------------------------------------------------- |
| 120 | | // plus4_c2h_pointer - get low ROM 1 pointer |
| 121 | | //------------------------------------------------- |
| 122 | | |
| 123 | | UINT8* device_plus4_expansion_card_interface::plus4_c2h_pointer(running_machine &machine, size_t size) |
| 124 | | { |
| 125 | | if (m_c2h == NULL) |
| 126 | | { |
| 127 | | m_c2h = auto_alloc_array(machine, UINT8, size); |
| 128 | | |
| 129 | | m_c2h_mask = size - 1; |
| 130 | | } |
| 131 | | |
| 132 | | return m_c2h; |
| 133 | | } |
| 134 | | |
| 135 | | |
| 136 | | //------------------------------------------------- |
| 137 | | // plus4_ram_pointer - get RAM pointer |
| 138 | | //------------------------------------------------- |
| 139 | | |
| 140 | | UINT8* device_plus4_expansion_card_interface::plus4_ram_pointer(running_machine &machine, size_t size) |
| 141 | | { |
| 142 | | if (m_ram == NULL) |
| 143 | | { |
| 144 | | m_ram = auto_alloc_array(machine, UINT8, size); |
| 145 | | |
| 146 | | m_ram_mask = size - 1; |
| 147 | | } |
| 148 | | |
| 149 | | return m_ram; |
| 150 | | } |
| 151 | | |
| 152 | | |
| 153 | | //------------------------------------------------- |
| 154 | | // plus4_ram_pointer - get NVRAM pointer |
| 155 | | //------------------------------------------------- |
| 156 | | |
| 157 | | UINT8* device_plus4_expansion_card_interface::plus4_nvram_pointer(running_machine &machine, size_t size) |
| 158 | | { |
| 159 | | if (m_nvram == NULL) |
| 160 | | { |
| 161 | | m_nvram = auto_alloc_array(machine, UINT8, size); |
| 162 | | |
| 163 | | m_nvram_mask = size - 1; |
| 164 | | m_nvram_size = size; |
| 165 | | } |
| 166 | | |
| 167 | | return m_nvram; |
| 168 | | } |
| 169 | | |
| 170 | | |
| 171 | | |
| 172 | 65 | //************************************************************************** |
| 173 | 66 | // LIVE DEVICE |
| 174 | 67 | //************************************************************************** |
| r26672 | r26673 | |
| 234 | 127 | { |
| 235 | 128 | if (m_card) |
| 236 | 129 | { |
| 237 | | size_t size = 0; |
| 238 | | |
| 239 | 130 | if (software_entry() == NULL) |
| 240 | 131 | { |
| 241 | 132 | // TODO |
| 242 | 133 | } |
| 243 | 134 | else |
| 244 | 135 | { |
| 245 | | size = get_software_region_length("c1l"); |
| 246 | | if (size) memcpy(m_card->plus4_c1l_pointer(machine(), size), get_software_region("c1l"), size); |
| 247 | | |
| 248 | | size = get_software_region_length("c1h"); |
| 249 | | if (size) memcpy(m_card->plus4_c1h_pointer(machine(), size), get_software_region("c1h"), size); |
| 250 | | |
| 251 | | size = get_software_region_length("c2l"); |
| 252 | | if (size) memcpy(m_card->plus4_c2l_pointer(machine(), size), get_software_region("c2l"), size); |
| 253 | | |
| 254 | | size = get_software_region_length("c2h"); |
| 255 | | if (size) memcpy(m_card->plus4_c2h_pointer(machine(), size), get_software_region("c2h"), size); |
| 256 | | |
| 257 | | size = get_software_region_length("ram"); |
| 258 | | if (size) memset(m_card->plus4_ram_pointer(machine(), size), 0, size); |
| 259 | | |
| 260 | | size = get_software_region_length("nvram"); |
| 261 | | if (size) memset(m_card->plus4_nvram_pointer(machine(), size), 0, size); |
| 136 | load_software_region("c1l", m_card->m_c1l); |
| 137 | load_software_region("c1h", m_card->m_c1h); |
| 138 | load_software_region("c2l", m_card->m_c2l); |
| 139 | load_software_region("c2h", m_card->m_c2h); |
| 262 | 140 | } |
| 263 | 141 | } |
| 264 | 142 | |
trunk/src/emu/bus/plus4/exp.h
| r26672 | r26673 | |
| 152 | 152 | device_plus4_expansion_card_interface(const machine_config &mconfig, device_t &device); |
| 153 | 153 | virtual ~device_plus4_expansion_card_interface(); |
| 154 | 154 | |
| 155 | | // initialization |
| 156 | | virtual UINT8* plus4_c1l_pointer(running_machine &machine, size_t size); |
| 157 | | virtual UINT8* plus4_c1h_pointer(running_machine &machine, size_t size); |
| 158 | | virtual UINT8* plus4_c2l_pointer(running_machine &machine, size_t size); |
| 159 | | virtual UINT8* plus4_c2h_pointer(running_machine &machine, size_t size); |
| 160 | | virtual UINT8* plus4_ram_pointer(running_machine &machine, size_t size); |
| 161 | | virtual UINT8* plus4_nvram_pointer(running_machine &machine, size_t size); |
| 162 | | |
| 163 | 155 | // runtime |
| 164 | 156 | virtual UINT8 plus4_cd_r(address_space &space, offs_t offset, UINT8 data, int ba, int cs0, int c1l, int c2l, int cs1, int c1h, int c2h) { return data; }; |
| 165 | 157 | virtual void plus4_cd_w(address_space &space, offs_t offset, UINT8 data, int ba, int cs0, int c1l, int c2l, int cs1, int c1h, int c2h) { }; |
| 166 | 158 | |
| 167 | 159 | protected: |
| 168 | | plus4_expansion_slot_device *m_slot; |
| 160 | optional_shared_ptr<UINT8> m_c1l; |
| 161 | optional_shared_ptr<UINT8> m_c1h; |
| 162 | optional_shared_ptr<UINT8> m_c2l; |
| 163 | optional_shared_ptr<UINT8> m_c2h; |
| 169 | 164 | |
| 170 | | UINT8 *m_c1l; |
| 171 | | UINT8 *m_c1h; |
| 172 | | UINT8 *m_c2l; |
| 173 | | UINT8 *m_c2h; |
| 174 | | UINT8 *m_ram; |
| 175 | | UINT8 *m_nvram; |
| 176 | | |
| 177 | | size_t m_nvram_size; |
| 178 | | |
| 179 | 165 | size_t m_c1l_mask; |
| 180 | 166 | size_t m_c1h_mask; |
| 181 | 167 | size_t m_c2l_mask; |
| 182 | 168 | size_t m_c2h_mask; |
| 183 | | size_t m_ram_mask; |
| 184 | | size_t m_nvram_mask; |
| 169 | |
| 170 | plus4_expansion_slot_device *m_slot; |
| 185 | 171 | }; |
| 186 | 172 | |
| 187 | 173 | |
trunk/src/emu/bus/vic10/exp.c
| r26672 | r26673 | |
| 33 | 33 | |
| 34 | 34 | device_vic10_expansion_card_interface::device_vic10_expansion_card_interface(const machine_config &mconfig, device_t &device) |
| 35 | 35 | : device_slot_card_interface(mconfig,device), |
| 36 | | m_exram(NULL), |
| 37 | | m_lorom(NULL), |
| 38 | | m_uprom(NULL) |
| 36 | m_lorom(*this, "lorom"), |
| 37 | m_exram(*this, "exram"), |
| 38 | m_uprom(*this, "uprom") |
| 39 | 39 | { |
| 40 | 40 | m_slot = dynamic_cast<vic10_expansion_slot_device *>(device.owner()); |
| 41 | 41 | } |
| r26672 | r26673 | |
| 51 | 51 | |
| 52 | 52 | |
| 53 | 53 | |
| 54 | | //------------------------------------------------- |
| 55 | | // vic10_lorom_pointer - get lower ROM pointer |
| 56 | | //------------------------------------------------- |
| 57 | | |
| 58 | | UINT8* device_vic10_expansion_card_interface::vic10_lorom_pointer(running_machine &machine, size_t size) |
| 59 | | { |
| 60 | | if (m_lorom == NULL) |
| 61 | | { |
| 62 | | m_lorom = auto_alloc_array(machine, UINT8, size); |
| 63 | | } |
| 64 | | |
| 65 | | return m_lorom; |
| 66 | | } |
| 67 | | |
| 68 | | |
| 69 | | //------------------------------------------------- |
| 70 | | // vic10_uprom_pointer - get upper ROM pointer |
| 71 | | //------------------------------------------------- |
| 72 | | |
| 73 | | UINT8* device_vic10_expansion_card_interface::vic10_uprom_pointer(running_machine &machine, size_t size) |
| 74 | | { |
| 75 | | if (m_uprom == NULL) |
| 76 | | { |
| 77 | | m_uprom = auto_alloc_array(machine, UINT8, size); |
| 78 | | } |
| 79 | | |
| 80 | | return m_uprom; |
| 81 | | } |
| 82 | | |
| 83 | | |
| 84 | | //------------------------------------------------- |
| 85 | | // vic10_exram_pointer - get expanded RAM pointer |
| 86 | | //------------------------------------------------- |
| 87 | | |
| 88 | | UINT8* device_vic10_expansion_card_interface::vic10_exram_pointer(running_machine &machine, size_t size) |
| 89 | | { |
| 90 | | if (m_exram == NULL) |
| 91 | | { |
| 92 | | m_exram = auto_alloc_array(machine, UINT8, size); |
| 93 | | } |
| 94 | | |
| 95 | | return m_exram; |
| 96 | | } |
| 97 | | |
| 98 | | |
| 99 | | |
| 100 | 54 | //************************************************************************** |
| 101 | 55 | // LIVE DEVICE |
| 102 | 56 | //************************************************************************** |
| r26672 | r26673 | |
| 170 | 124 | |
| 171 | 125 | if (!mame_stricmp(filetype(), "80")) |
| 172 | 126 | { |
| 173 | | fread(m_card->vic10_lorom_pointer(machine(), 0x2000), 0x2000); |
| 127 | fread(m_card->m_lorom, 0x2000); |
| 174 | 128 | |
| 175 | 129 | if (size == 0x4000) |
| 176 | 130 | { |
| 177 | | fread(m_card->vic10_uprom_pointer(machine(), 0x2000), 0x2000); |
| 131 | fread(m_card->m_uprom, 0x2000); |
| 178 | 132 | } |
| 179 | 133 | } |
| 180 | | else if (!mame_stricmp(filetype(), "e0")) fread(m_card->vic10_uprom_pointer(machine(), size), size); |
| 134 | else if (!mame_stricmp(filetype(), "e0")) |
| 135 | { |
| 136 | fread(m_card->m_uprom, size); |
| 137 | } |
| 181 | 138 | else if (!mame_stricmp(filetype(), "crt")) |
| 182 | 139 | { |
| 183 | 140 | size_t roml_size = 0; |
| r26672 | r26673 | |
| 190 | 147 | UINT8 *roml = NULL; |
| 191 | 148 | UINT8 *romh = NULL; |
| 192 | 149 | |
| 193 | | if (roml_size) roml = m_card->vic10_lorom_pointer(machine(), roml_size); |
| 194 | | if (romh_size) romh = m_card->vic10_uprom_pointer(machine(), romh_size); |
| 150 | m_card->m_lorom.allocate(roml_size); |
| 151 | m_card->m_uprom.allocate(romh_size); |
| 195 | 152 | |
| 153 | if (roml_size) roml = m_card->m_lorom; |
| 154 | if (romh_size) romh = m_card->m_lorom; |
| 155 | |
| 196 | 156 | cbm_crt_read_data(m_file, roml, romh); |
| 197 | 157 | } |
| 198 | 158 | } |
| 199 | 159 | } |
| 200 | 160 | else |
| 201 | 161 | { |
| 202 | | size = get_software_region_length("lorom"); |
| 203 | | if (size) memcpy(m_card->vic10_lorom_pointer(machine(), size), get_software_region("lorom"), size); |
| 204 | | |
| 205 | | size = get_software_region_length("uprom"); |
| 206 | | if (size) memcpy(m_card->vic10_uprom_pointer(machine(), size), get_software_region("uprom"), size); |
| 207 | | |
| 208 | | size = get_software_region_length("exram"); |
| 209 | | if (size) m_card->vic10_exram_pointer(machine(), size); |
| 162 | load_software_region("lorom", m_card->m_lorom); |
| 163 | load_software_region("exram", m_card->m_exram); |
| 164 | load_software_region("uprom", m_card->m_uprom); |
| 210 | 165 | } |
| 211 | 166 | } |
| 212 | 167 | |
trunk/src/emu/bus/vic20/exp.c
| r26672 | r26673 | |
| 33 | 33 | |
| 34 | 34 | device_vic20_expansion_card_interface::device_vic20_expansion_card_interface(const machine_config &mconfig, device_t &device) |
| 35 | 35 | : device_slot_card_interface(mconfig, device), |
| 36 | | m_blk1(NULL), |
| 37 | | m_blk2(NULL), |
| 38 | | m_blk3(NULL), |
| 39 | | m_blk5(NULL), |
| 40 | | m_ram(NULL), |
| 41 | | m_nvram(NULL), |
| 42 | | m_nvram_size(0) |
| 36 | m_blk1(*this, "blk1"), |
| 37 | m_blk2(*this, "blk2"), |
| 38 | m_blk3(*this, "blk3"), |
| 39 | m_blk5(*this, "blk5"), |
| 40 | m_nvram(*this, "nvram") |
| 43 | 41 | { |
| 44 | 42 | m_slot = dynamic_cast<vic20_expansion_slot_device *>(device.owner()); |
| 45 | 43 | } |
| 46 | 44 | |
| 47 | 45 | |
| 48 | 46 | //------------------------------------------------- |
| 49 | | // vic20_blk1_pointer - get block 1 pointer |
| 50 | | //------------------------------------------------- |
| 51 | | |
| 52 | | UINT8* device_vic20_expansion_card_interface::vic20_blk1_pointer(running_machine &machine, size_t size) |
| 53 | | { |
| 54 | | if (m_blk1 == NULL) |
| 55 | | { |
| 56 | | m_blk1 = auto_alloc_array(machine, UINT8, size); |
| 57 | | } |
| 58 | | |
| 59 | | return m_blk1; |
| 60 | | } |
| 61 | | |
| 62 | | |
| 63 | | //------------------------------------------------- |
| 64 | | // vic20_blk2_pointer - get block 2 pointer |
| 65 | | //------------------------------------------------- |
| 66 | | |
| 67 | | UINT8* device_vic20_expansion_card_interface::vic20_blk2_pointer(running_machine &machine, size_t size) |
| 68 | | { |
| 69 | | if (m_blk2 == NULL) |
| 70 | | { |
| 71 | | m_blk2 = auto_alloc_array(machine, UINT8, size); |
| 72 | | } |
| 73 | | |
| 74 | | return m_blk2; |
| 75 | | } |
| 76 | | |
| 77 | | |
| 78 | | //------------------------------------------------- |
| 79 | | // vic20_blk3_pointer - get block 3 pointer |
| 80 | | //------------------------------------------------- |
| 81 | | |
| 82 | | UINT8* device_vic20_expansion_card_interface::vic20_blk3_pointer(running_machine &machine, size_t size) |
| 83 | | { |
| 84 | | if (m_blk3 == NULL) |
| 85 | | { |
| 86 | | m_blk3 = auto_alloc_array(machine, UINT8, size); |
| 87 | | } |
| 88 | | |
| 89 | | return m_blk3; |
| 90 | | } |
| 91 | | |
| 92 | | |
| 93 | | //------------------------------------------------- |
| 94 | | // vic20_blk5_pointer - get block 5 pointer |
| 95 | | //------------------------------------------------- |
| 96 | | |
| 97 | | UINT8* device_vic20_expansion_card_interface::vic20_blk5_pointer(running_machine &machine, size_t size) |
| 98 | | { |
| 99 | | if (m_blk5 == NULL) |
| 100 | | { |
| 101 | | m_blk5 = auto_alloc_array(machine, UINT8, size); |
| 102 | | } |
| 103 | | |
| 104 | | return m_blk5; |
| 105 | | } |
| 106 | | |
| 107 | | |
| 108 | | //------------------------------------------------- |
| 109 | | // vic20_ram_pointer - get RAM pointer |
| 110 | | //------------------------------------------------- |
| 111 | | |
| 112 | | UINT8* device_vic20_expansion_card_interface::vic20_ram_pointer(running_machine &machine, size_t size) |
| 113 | | { |
| 114 | | if (m_ram == NULL) |
| 115 | | { |
| 116 | | m_ram = auto_alloc_array(machine, UINT8, size); |
| 117 | | } |
| 118 | | |
| 119 | | return m_ram; |
| 120 | | } |
| 121 | | |
| 122 | | |
| 123 | | //------------------------------------------------- |
| 124 | | // vic20_nvram_pointer - get NVRAM pointer |
| 125 | | //------------------------------------------------- |
| 126 | | |
| 127 | | UINT8* device_vic20_expansion_card_interface::vic20_nvram_pointer(running_machine &machine, size_t size) |
| 128 | | { |
| 129 | | if (m_nvram == NULL) |
| 130 | | { |
| 131 | | m_nvram = auto_alloc_array(machine, UINT8, size); |
| 132 | | |
| 133 | | m_nvram_mask = size - 1; |
| 134 | | m_nvram_size = size; |
| 135 | | } |
| 136 | | |
| 137 | | return m_nvram; |
| 138 | | } |
| 139 | | |
| 140 | | |
| 141 | | //------------------------------------------------- |
| 142 | 47 | // ~device_vic20_expansion_card_interface - destructor |
| 143 | 48 | //------------------------------------------------- |
| 144 | 49 | |
| r26672 | r26673 | |
| 211 | 116 | { |
| 212 | 117 | if (m_card) |
| 213 | 118 | { |
| 214 | | size_t size = 0; |
| 215 | | |
| 216 | 119 | if (software_entry() == NULL) |
| 217 | 120 | { |
| 218 | | if (!mame_stricmp(filetype(), "20")) fread(m_card->vic20_blk1_pointer(machine(), 0x2000), 0x2000); |
| 219 | | else if (!mame_stricmp(filetype(), "40")) fread(m_card->vic20_blk2_pointer(machine(), 0x2000), 0x2000); |
| 220 | | else if (!mame_stricmp(filetype(), "60")) fread(m_card->vic20_blk3_pointer(machine(), 0x2000), 0x2000); |
| 221 | | else if (!mame_stricmp(filetype(), "70")) fread(m_card->vic20_blk3_pointer(machine(), 0x2000) + 0x1000, 0x1000); |
| 222 | | else if (!mame_stricmp(filetype(), "a0")) fread(m_card->vic20_blk5_pointer(machine(), 0x2000), 0x2000); |
| 223 | | else if (!mame_stricmp(filetype(), "b0")) fread(m_card->vic20_blk5_pointer(machine(), 0x2000) + 0x1000, 0x1000); |
| 121 | if (!mame_stricmp(filetype(), "20")) fread(m_card->m_blk1, 0x2000); |
| 122 | else if (!mame_stricmp(filetype(), "40")) fread(m_card->m_blk2, 0x2000); |
| 123 | else if (!mame_stricmp(filetype(), "60")) fread(m_card->m_blk3, 0x2000); |
| 124 | else if (!mame_stricmp(filetype(), "70")) fread(m_card->m_blk3, 0x2000, 0x1000); |
| 125 | else if (!mame_stricmp(filetype(), "a0")) fread(m_card->m_blk5, 0x2000); |
| 126 | else if (!mame_stricmp(filetype(), "b0")) fread(m_card->m_blk5, 0x2000, 0x1000); |
| 224 | 127 | else if (!mame_stricmp(filetype(), "crt")) |
| 225 | 128 | { |
| 226 | 129 | // read the header |
| r26672 | r26673 | |
| 230 | 133 | |
| 231 | 134 | switch (address) |
| 232 | 135 | { |
| 233 | | case 0x2000: fread(m_card->vic20_blk1_pointer(machine(), 0x2000), 0x2000); break; |
| 234 | | case 0x4000: fread(m_card->vic20_blk2_pointer(machine(), 0x2000), 0x2000); break; |
| 235 | | case 0x6000: fread(m_card->vic20_blk3_pointer(machine(), 0x2000), 0x2000); break; |
| 236 | | case 0x7000: fread(m_card->vic20_blk3_pointer(machine(), 0x2000) + 0x1000, 0x1000); break; |
| 237 | | case 0xa000: fread(m_card->vic20_blk5_pointer(machine(), 0x2000), 0x2000); break; |
| 238 | | case 0xb000: fread(m_card->vic20_blk5_pointer(machine(), 0x2000) + 0x1000, 0x1000); break; |
| 136 | case 0x2000: fread(m_card->m_blk1, 0x2000); break; |
| 137 | case 0x4000: fread(m_card->m_blk2, 0x2000); break; |
| 138 | case 0x6000: fread(m_card->m_blk3, 0x2000); break; |
| 139 | case 0x7000: fread(m_card->m_blk3, 0x2000, 0x1000); break; |
| 140 | case 0xa000: fread(m_card->m_blk5, 0x2000); break; |
| 141 | case 0xb000: fread(m_card->m_blk5, 0x2000, 0x1000); break; |
| 239 | 142 | default: return IMAGE_INIT_FAIL; |
| 240 | 143 | } |
| 241 | 144 | } |
| 242 | 145 | } |
| 243 | 146 | else |
| 244 | 147 | { |
| 245 | | size = get_software_region_length("blk1"); |
| 246 | | if (size) memcpy(m_card->vic20_blk1_pointer(machine(), size), get_software_region("blk1"), size); |
| 247 | | |
| 248 | | size = get_software_region_length("blk2"); |
| 249 | | if (size) memcpy(m_card->vic20_blk2_pointer(machine(), size), get_software_region("blk2"), size); |
| 250 | | |
| 251 | | size = get_software_region_length("blk3"); |
| 252 | | if (size) memcpy(m_card->vic20_blk3_pointer(machine(), size), get_software_region("blk3"), size); |
| 253 | | |
| 254 | | size = get_software_region_length("blk5"); |
| 255 | | if (size) memcpy(m_card->vic20_blk5_pointer(machine(), size), get_software_region("blk5"), size); |
| 256 | | |
| 257 | | size = get_software_region_length("ram"); |
| 258 | | if (size) memcpy(m_card->vic20_ram_pointer(machine(), size), get_software_region("ram"), size); |
| 259 | | |
| 260 | | size = get_software_region_length("nvram"); |
| 261 | | if (size) memcpy(m_card->vic20_nvram_pointer(machine(), size), get_software_region("nvram"), size); |
| 262 | | |
| 148 | load_software_region("blk1", m_card->m_blk1); |
| 149 | load_software_region("blk2", m_card->m_blk2); |
| 150 | load_software_region("blk3", m_card->m_blk3); |
| 151 | load_software_region("blk5", m_card->m_blk5); |
| 263 | 152 | } |
| 264 | 153 | } |
| 265 | 154 | |
trunk/src/emu/bus/vic20/exp.h
| r26672 | r26673 | |
| 144 | 144 | device_vic20_expansion_card_interface(const machine_config &mconfig, device_t &device); |
| 145 | 145 | virtual ~device_vic20_expansion_card_interface(); |
| 146 | 146 | |
| 147 | | protected: |
| 148 | | // initialization |
| 149 | | virtual UINT8* vic20_blk1_pointer(running_machine &machine, size_t size); |
| 150 | | virtual UINT8* vic20_blk2_pointer(running_machine &machine, size_t size); |
| 151 | | virtual UINT8* vic20_blk3_pointer(running_machine &machine, size_t size); |
| 152 | | virtual UINT8* vic20_blk5_pointer(running_machine &machine, size_t size); |
| 153 | | virtual UINT8* vic20_ram_pointer(running_machine &machine, size_t size); |
| 154 | | virtual UINT8* vic20_nvram_pointer(running_machine &machine, size_t size); |
| 155 | | |
| 156 | | // runtime |
| 157 | 147 | virtual UINT8 vic20_cd_r(address_space &space, offs_t offset, UINT8 data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3) { return data; }; |
| 158 | 148 | virtual void vic20_cd_w(address_space &space, offs_t offset, UINT8 data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3) { }; |
| 159 | 149 | |
| 160 | | vic20_expansion_slot_device *m_slot; |
| 150 | protected: |
| 151 | optional_shared_ptr<UINT8> m_blk1; |
| 152 | optional_shared_ptr<UINT8> m_blk2; |
| 153 | optional_shared_ptr<UINT8> m_blk3; |
| 154 | optional_shared_ptr<UINT8> m_blk5; |
| 155 | optional_shared_ptr<UINT8> m_nvram; |
| 161 | 156 | |
| 162 | | UINT8 *m_blk1; |
| 163 | | UINT8 *m_blk2; |
| 164 | | UINT8 *m_blk3; |
| 165 | | UINT8 *m_blk5; |
| 166 | | UINT8 *m_ram; |
| 167 | | UINT8 *m_nvram; |
| 168 | | |
| 169 | | size_t m_nvram_size; |
| 170 | | |
| 171 | | size_t m_nvram_mask; |
| 157 | vic20_expansion_slot_device *m_slot; |
| 172 | 158 | }; |
| 173 | 159 | |
| 174 | 160 | |
trunk/src/emu/bus/cbm2/exp.c
| r26672 | r26673 | |
| 39 | 39 | |
| 40 | 40 | device_cbm2_expansion_card_interface::device_cbm2_expansion_card_interface(const machine_config &mconfig, device_t &device) |
| 41 | 41 | : device_slot_card_interface(mconfig, device), |
| 42 | | m_bank1(NULL), |
| 43 | | m_bank2(NULL), |
| 44 | | m_bank3(NULL), |
| 45 | | m_ram(NULL), |
| 46 | | m_nvram(NULL), |
| 47 | | m_nvram_size(0), |
| 48 | | m_bank1_mask(0), |
| 49 | | m_bank2_mask(0), |
| 50 | | m_bank3_mask(0), |
| 51 | | m_ram_mask(0) |
| 42 | m_bank1(*this, "bank1"), |
| 43 | m_bank2(*this, "bank2"), |
| 44 | m_bank3(*this, "bank3") |
| 52 | 45 | { |
| 53 | 46 | m_slot = dynamic_cast<cbm2_expansion_slot_device *>(device.owner()); |
| 54 | 47 | } |
| r26672 | r26673 | |
| 63 | 56 | } |
| 64 | 57 | |
| 65 | 58 | |
| 66 | | //------------------------------------------------- |
| 67 | | // cbm2_bank1_pointer - get bank 1 pointer |
| 68 | | //------------------------------------------------- |
| 69 | 59 | |
| 70 | | UINT8* device_cbm2_expansion_card_interface::cbm2_bank1_pointer(running_machine &machine, size_t size) |
| 71 | | { |
| 72 | | if (m_bank1 == NULL) |
| 73 | | { |
| 74 | | m_bank1 = auto_alloc_array(machine, UINT8, size); |
| 75 | | |
| 76 | | m_bank1_mask = size - 1; |
| 77 | | } |
| 78 | | |
| 79 | | return m_bank1; |
| 80 | | } |
| 81 | | |
| 82 | | |
| 83 | | //------------------------------------------------- |
| 84 | | // cbm2_bank2_pointer - get bank 2 pointer |
| 85 | | //------------------------------------------------- |
| 86 | | |
| 87 | | UINT8* device_cbm2_expansion_card_interface::cbm2_bank2_pointer(running_machine &machine, size_t size) |
| 88 | | { |
| 89 | | if (m_bank2 == NULL) |
| 90 | | { |
| 91 | | m_bank2 = auto_alloc_array(machine, UINT8, size); |
| 92 | | |
| 93 | | m_bank2_mask = size - 1; |
| 94 | | } |
| 95 | | |
| 96 | | return m_bank2; |
| 97 | | } |
| 98 | | |
| 99 | | |
| 100 | | //------------------------------------------------- |
| 101 | | // cbm2_bank3_pointer - get bank 3 pointer |
| 102 | | //------------------------------------------------- |
| 103 | | |
| 104 | | UINT8* device_cbm2_expansion_card_interface::cbm2_bank3_pointer(running_machine &machine, size_t size) |
| 105 | | { |
| 106 | | if (m_bank3 == NULL) |
| 107 | | { |
| 108 | | m_bank3 = auto_alloc_array(machine, UINT8, size); |
| 109 | | |
| 110 | | m_bank3_mask = size - 1; |
| 111 | | } |
| 112 | | |
| 113 | | return m_bank3; |
| 114 | | } |
| 115 | | |
| 116 | | |
| 117 | | //------------------------------------------------- |
| 118 | | // cbm2_ram_pointer - get RAM pointer |
| 119 | | //------------------------------------------------- |
| 120 | | |
| 121 | | UINT8* device_cbm2_expansion_card_interface::cbm2_ram_pointer(running_machine &machine, size_t size) |
| 122 | | { |
| 123 | | if (m_ram == NULL) |
| 124 | | { |
| 125 | | m_ram = auto_alloc_array(machine, UINT8, size); |
| 126 | | |
| 127 | | m_ram_mask = size - 1; |
| 128 | | } |
| 129 | | |
| 130 | | return m_ram; |
| 131 | | } |
| 132 | | |
| 133 | | |
| 134 | | //------------------------------------------------- |
| 135 | | // cbm2_ram_pointer - get NVRAM pointer |
| 136 | | //------------------------------------------------- |
| 137 | | |
| 138 | | UINT8* device_cbm2_expansion_card_interface::cbm2_nvram_pointer(running_machine &machine, size_t size) |
| 139 | | { |
| 140 | | if (m_nvram == NULL) |
| 141 | | { |
| 142 | | m_nvram = auto_alloc_array(machine, UINT8, size); |
| 143 | | |
| 144 | | m_nvram_mask = size - 1; |
| 145 | | m_nvram_size = size; |
| 146 | | } |
| 147 | | |
| 148 | | return m_nvram; |
| 149 | | } |
| 150 | | |
| 151 | | |
| 152 | | |
| 153 | 60 | //************************************************************************** |
| 154 | 61 | // LIVE DEVICE |
| 155 | 62 | //************************************************************************** |
| r26672 | r26673 | |
| 209 | 116 | |
| 210 | 117 | if (!mame_stricmp(filetype(), "20")) |
| 211 | 118 | { |
| 212 | | fread(m_card->cbm2_bank1_pointer(machine(), size), size); |
| 119 | m_card->m_bank1.allocate(size); |
| 120 | fread(m_card->m_bank1, size); |
| 213 | 121 | } |
| 214 | 122 | else if (!mame_stricmp(filetype(), "40")) |
| 215 | 123 | { |
| 216 | | fread(m_card->cbm2_bank2_pointer(machine(), size), size); |
| 124 | m_card->m_bank2.allocate(size); |
| 125 | fread(m_card->m_bank2, size); |
| 217 | 126 | } |
| 218 | 127 | else if (!mame_stricmp(filetype(), "60")) |
| 219 | 128 | { |
| 220 | | fread(m_card->cbm2_bank3_pointer(machine(), size), size); |
| 129 | m_card->m_bank3.allocate(size); |
| 130 | fread(m_card->m_bank3, size); |
| 221 | 131 | } |
| 222 | 132 | } |
| 223 | 133 | else |
| 224 | 134 | { |
| 225 | | size = get_software_region_length("bank1"); |
| 226 | | if (size) memcpy(m_card->cbm2_bank1_pointer(machine(), size), get_software_region("bank1"), size); |
| 227 | | |
| 228 | | size = get_software_region_length("bank2"); |
| 229 | | if (size) memcpy(m_card->cbm2_bank2_pointer(machine(), size), get_software_region("bank2"), size); |
| 230 | | |
| 231 | | size = get_software_region_length("bank3"); |
| 232 | | if (size) memcpy(m_card->cbm2_bank3_pointer(machine(), size), get_software_region("bank3"), size); |
| 233 | | |
| 234 | | size = get_software_region_length("ram"); |
| 235 | | if (size) memset(m_card->cbm2_ram_pointer(machine(), size), 0, size); |
| 236 | | |
| 237 | | size = get_software_region_length("nvram"); |
| 238 | | if (size) memset(m_card->cbm2_nvram_pointer(machine(), size), 0, size); |
| 135 | load_software_region("bank1", m_card->m_bank1); |
| 136 | load_software_region("bank2", m_card->m_bank2); |
| 137 | load_software_region("bank3", m_card->m_bank3); |
| 239 | 138 | } |
| 240 | 139 | } |
| 241 | 140 | |
trunk/src/emu/bus/c64/exp.c
| r26672 | r26673 | |
| 31 | 31 | |
| 32 | 32 | device_c64_expansion_card_interface::device_c64_expansion_card_interface(const machine_config &mconfig, device_t &device) |
| 33 | 33 | : device_slot_card_interface(mconfig, device), |
| 34 | | m_roml(NULL), |
| 35 | | m_romh(NULL), |
| 36 | | m_ram(NULL), |
| 37 | | m_nvram(NULL), |
| 38 | | m_nvram_size(0), |
| 39 | | m_roml_mask(0), |
| 40 | | m_romh_mask(0), |
| 41 | | m_ram_mask(0), |
| 34 | m_roml(*this, "roml"), |
| 35 | m_romh(*this, "romh"), |
| 36 | m_nvram(*this, "nvram"), |
| 42 | 37 | m_game(1), |
| 43 | 38 | m_exrom(1) |
| 44 | 39 | { |
| r26672 | r26673 | |
| 55 | 50 | } |
| 56 | 51 | |
| 57 | 52 | |
| 58 | | //------------------------------------------------- |
| 59 | | // c64_roml_pointer - get low ROM pointer |
| 60 | | //------------------------------------------------- |
| 61 | 53 | |
| 62 | | UINT8* device_c64_expansion_card_interface::c64_roml_pointer(running_machine &machine, size_t size) |
| 63 | | { |
| 64 | | if (m_roml == NULL) |
| 65 | | { |
| 66 | | m_roml = auto_alloc_array(machine, UINT8, size); |
| 67 | | |
| 68 | | m_roml_mask = size - 1; |
| 69 | | } |
| 70 | | |
| 71 | | return m_roml; |
| 72 | | } |
| 73 | | |
| 74 | | |
| 75 | | //------------------------------------------------- |
| 76 | | // c64_romh_pointer - get high ROM pointer |
| 77 | | //------------------------------------------------- |
| 78 | | |
| 79 | | UINT8* device_c64_expansion_card_interface::c64_romh_pointer(running_machine &machine, size_t size) |
| 80 | | { |
| 81 | | if (m_romh == NULL) |
| 82 | | { |
| 83 | | m_romh = auto_alloc_array(machine, UINT8, size); |
| 84 | | |
| 85 | | m_romh_mask = size - 1; |
| 86 | | } |
| 87 | | |
| 88 | | return m_romh; |
| 89 | | } |
| 90 | | |
| 91 | | |
| 92 | | //------------------------------------------------- |
| 93 | | // c64_ram_pointer - get RAM pointer |
| 94 | | //------------------------------------------------- |
| 95 | | |
| 96 | | UINT8* device_c64_expansion_card_interface::c64_ram_pointer(running_machine &machine, size_t size) |
| 97 | | { |
| 98 | | if (m_ram == NULL) |
| 99 | | { |
| 100 | | m_ram = auto_alloc_array(machine, UINT8, size); |
| 101 | | |
| 102 | | m_ram_mask = size - 1; |
| 103 | | } |
| 104 | | |
| 105 | | return m_ram; |
| 106 | | } |
| 107 | | |
| 108 | | |
| 109 | | //------------------------------------------------- |
| 110 | | // c64_ram_pointer - get NVRAM pointer |
| 111 | | //------------------------------------------------- |
| 112 | | |
| 113 | | UINT8* device_c64_expansion_card_interface::c64_nvram_pointer(running_machine &machine, size_t size) |
| 114 | | { |
| 115 | | if (m_nvram == NULL) |
| 116 | | { |
| 117 | | m_nvram = auto_alloc_array(machine, UINT8, size); |
| 118 | | |
| 119 | | m_nvram_mask = size - 1; |
| 120 | | m_nvram_size = size; |
| 121 | | } |
| 122 | | |
| 123 | | return m_nvram; |
| 124 | | } |
| 125 | | |
| 126 | | |
| 127 | | |
| 128 | 54 | //************************************************************************** |
| 129 | 55 | // LIVE DEVICE |
| 130 | 56 | //************************************************************************** |
| r26672 | r26673 | |
| 202 | 128 | |
| 203 | 129 | if (!mame_stricmp(filetype(), "80")) |
| 204 | 130 | { |
| 205 | | fread(m_card->c64_roml_pointer(machine(), size), size); |
| 131 | fread(m_card->m_roml, size); |
| 206 | 132 | m_card->m_exrom = (0); |
| 207 | 133 | |
| 208 | 134 | if (size == 0x4000) |
| r26672 | r26673 | |
| 212 | 138 | } |
| 213 | 139 | else if (!mame_stricmp(filetype(), "a0")) |
| 214 | 140 | { |
| 215 | | fread(m_card->c64_romh_pointer(machine(), 0x2000), 0x2000); |
| 141 | fread(m_card->m_romh, 0x2000); |
| 216 | 142 | |
| 217 | 143 | m_card->m_exrom = 0; |
| 218 | 144 | m_card->m_game = 0; |
| 219 | 145 | } |
| 220 | 146 | else if (!mame_stricmp(filetype(), "e0")) |
| 221 | 147 | { |
| 222 | | fread(m_card->c64_romh_pointer(machine(), 0x2000), 0x2000); |
| 148 | fread(m_card->m_romh, 0x2000); |
| 223 | 149 | |
| 224 | 150 | m_card->m_game = 0; |
| 225 | 151 | } |
| r26672 | r26673 | |
| 235 | 161 | UINT8 *roml = NULL; |
| 236 | 162 | UINT8 *romh = NULL; |
| 237 | 163 | |
| 238 | | if (roml_size) roml = m_card->c64_roml_pointer(machine(), roml_size); |
| 239 | | if (romh_size) romh = m_card->c64_romh_pointer(machine(), romh_size); |
| 164 | m_card->m_roml.allocate(roml_size); |
| 165 | m_card->m_romh.allocate(romh_size); |
| 240 | 166 | |
| 167 | if (roml_size) roml = m_card->m_roml; |
| 168 | if (romh_size) romh = m_card->m_roml; |
| 169 | |
| 241 | 170 | cbm_crt_read_data(m_file, roml, romh); |
| 242 | 171 | } |
| 243 | 172 | |
| r26672 | r26673 | |
| 252 | 181 | if (size) |
| 253 | 182 | { |
| 254 | 183 | // Ultimax (VIC-10) cartridge |
| 255 | | memcpy(m_card->c64_romh_pointer(machine(), size), get_software_region("uprom"), size); |
| 184 | load_software_region("lorom", m_card->m_roml); |
| 185 | load_software_region("uprom", m_card->m_romh); |
| 256 | 186 | |
| 257 | | size = get_software_region_length("lorom"); |
| 258 | | if (size) memcpy(m_card->c64_roml_pointer(machine(), size), get_software_region("lorom"), size); |
| 259 | | |
| 260 | 187 | m_card->m_exrom = 1; |
| 261 | 188 | m_card->m_game = 0; |
| 262 | 189 | } |
| 263 | 190 | else |
| 264 | 191 | { |
| 265 | 192 | // Commodore 64/128 cartridge |
| 266 | | size = get_software_region_length("roml"); |
| 267 | | if (size) memcpy(m_card->c64_roml_pointer(machine(), size), get_software_region("roml"), size); |
| 193 | load_software_region("roml", m_card->m_roml); |
| 194 | load_software_region("romh", m_card->m_romh); |
| 195 | load_software_region("nvram", m_card->m_nvram); |
| 268 | 196 | |
| 269 | | size = get_software_region_length("romh"); |
| 270 | | if (size) memcpy(m_card->c64_romh_pointer(machine(), size), get_software_region("romh"), size); |
| 271 | | |
| 272 | | size = get_software_region_length("ram"); |
| 273 | | if (size) memset(m_card->c64_ram_pointer(machine(), size), 0, size); |
| 274 | | |
| 275 | | size = get_software_region_length("nvram"); |
| 276 | | if (size) memset(m_card->c64_nvram_pointer(machine(), size), 0, size); |
| 277 | | |
| 278 | 197 | if (get_feature("exrom") != NULL) m_card->m_exrom = atol(get_feature("exrom")); |
| 279 | 198 | if (get_feature("game") != NULL) m_card->m_game = atol(get_feature("game")); |
| 280 | 199 | } |
trunk/src/emu/bus/c64/exp.h
| r26672 | r26673 | |
| 167 | 167 | device_c64_expansion_card_interface(const machine_config &mconfig, device_t &device); |
| 168 | 168 | virtual ~device_c64_expansion_card_interface(); |
| 169 | 169 | |
| 170 | | protected: |
| 171 | | // initialization |
| 172 | | virtual UINT8* c64_roml_pointer(running_machine &machine, size_t size); |
| 173 | | virtual UINT8* c64_romh_pointer(running_machine &machine, size_t size); |
| 174 | | virtual UINT8* c64_ram_pointer(running_machine &machine, size_t size); |
| 175 | | virtual UINT8* c64_nvram_pointer(running_machine &machine, size_t size); |
| 176 | | |
| 177 | | // runtime |
| 178 | 170 | virtual UINT8 c64_cd_r(address_space &space, offs_t offset, UINT8 data, int sphi2, int ba, int roml, int romh, int io1, int io2) { return data; }; |
| 179 | 171 | virtual void c64_cd_w(address_space &space, offs_t offset, UINT8 data, int sphi2, int ba, int roml, int romh, int io1, int io2) { }; |
| 180 | 172 | virtual int c64_game_r(offs_t offset, int sphi2, int ba, int rw) { return m_game; } |
| 181 | 173 | virtual int c64_exrom_r(offs_t offset, int sphi2, int ba, int rw) { return m_exrom; } |
| 182 | 174 | |
| 183 | | c64_expansion_slot_device *m_slot; |
| 175 | protected: |
| 176 | optional_shared_ptr<UINT8> m_roml; |
| 177 | optional_shared_ptr<UINT8> m_romh; |
| 178 | optional_shared_ptr<UINT8> m_nvram; |
| 184 | 179 | |
| 185 | | UINT8 *m_roml; |
| 186 | | UINT8 *m_romh; |
| 187 | | UINT8 *m_ram; |
| 188 | | UINT8 *m_nvram; |
| 189 | | |
| 190 | | size_t m_nvram_size; |
| 191 | | |
| 192 | | size_t m_roml_mask; |
| 193 | | size_t m_romh_mask; |
| 194 | | size_t m_ram_mask; |
| 195 | | size_t m_nvram_mask; |
| 196 | | |
| 197 | 180 | int m_game; |
| 198 | 181 | int m_exrom; |
| 182 | |
| 183 | c64_expansion_slot_device *m_slot; |
| 199 | 184 | }; |
| 200 | 185 | |
| 201 | 186 | |