src/mess/machine/vic20exp.c
| r14574 | r14575 | |
| 228 | 228 | { |
| 229 | 229 | size = length(); |
| 230 | 230 | |
| 231 | | if (!mame_stricmp(filetype(), "20")) fread(m_cart->vic20_blk1_pointer(machine(), size), size); |
| 232 | | else if (!mame_stricmp(filetype(), "40")) fread(m_cart->vic20_blk2_pointer(machine(), size), size); |
| 233 | | else if (!mame_stricmp(filetype(), "60")) fread(m_cart->vic20_blk3_pointer(machine(), size), size); |
| 234 | | else if (!mame_stricmp(filetype(), "70")) fread(m_cart->vic20_blk3_pointer(machine(), size + 0x1000) + 0x1000, size); |
| 235 | | else if (!mame_stricmp(filetype(), "a0")) fread(m_cart->vic20_blk5_pointer(machine(), size), size); |
| 236 | | else if (!mame_stricmp(filetype(), "b0")) fread(m_cart->vic20_blk5_pointer(machine(), size + 0x1000) + 0x1000, size); |
| 231 | if (!mame_stricmp(filetype(), "20")) fread(m_cart->vic20_blk1_pointer(machine(), 0x2000), 0x2000); |
| 232 | else if (!mame_stricmp(filetype(), "40")) fread(m_cart->vic20_blk2_pointer(machine(), 0x2000), 0x2000); |
| 233 | else if (!mame_stricmp(filetype(), "60")) fread(m_cart->vic20_blk3_pointer(machine(), 0x2000), 0x2000); |
| 234 | else if (!mame_stricmp(filetype(), "70")) fread(m_cart->vic20_blk3_pointer(machine(), 0x2000) + 0x1000, 0x1000); |
| 235 | else if (!mame_stricmp(filetype(), "a0")) fread(m_cart->vic20_blk5_pointer(machine(), 0x2000), 0x2000); |
| 236 | else if (!mame_stricmp(filetype(), "b0")) fread(m_cart->vic20_blk5_pointer(machine(), 0x2000) + 0x1000, 0x1000); |
| 237 | 237 | else if (!mame_stricmp(filetype(), "crt")) |
| 238 | 238 | { |
| 239 | 239 | // read the header |
| 240 | | cbm_crt_header header; |
| 241 | | fread(&header, CRT_HEADER_LENGTH); |
| 242 | | |
| 243 | | if (memcmp(header.signature, CRT_SIGNATURE, 16) != 0) |
| 244 | | return IMAGE_INIT_FAIL; |
| 245 | | |
| 246 | | UINT16 hardware = pick_integer_be(header.hardware, 0, 2); |
| 247 | | |
| 248 | | // TODO support other cartridge hardware |
| 249 | | if (hardware != CRT_VIC20_STANDARD) |
| 250 | | return IMAGE_INIT_FAIL; |
| 251 | | |
| 252 | | if (LOG) |
| 240 | UINT8 header[2]; |
| 241 | fread(&header, 2); |
| 242 | UINT16 address = pick_integer_le(header, 0, 2); |
| 243 | |
| 244 | if (LOG) logerror("Address %04x\n", address); |
| 245 | |
| 246 | switch (address) |
| 253 | 247 | { |
| 254 | | logerror("Name: %s\n", header.name); |
| 255 | | logerror("Hardware: %04x\n", hardware); |
| 256 | | logerror("Slot device: %s\n", CRT_VIC20_SLOT_NAMES[hardware]); |
| 248 | case 0x2000: fread(m_cart->vic20_blk1_pointer(machine(), 0x2000), 0x2000); break; |
| 249 | case 0x4000: fread(m_cart->vic20_blk2_pointer(machine(), 0x2000), 0x2000); break; |
| 250 | case 0x6000: fread(m_cart->vic20_blk3_pointer(machine(), 0x2000), 0x2000); break; |
| 251 | case 0x7000: fread(m_cart->vic20_blk3_pointer(machine(), 0x2000) + 0x1000, 0x1000); break; |
| 252 | case 0xa000: fread(m_cart->vic20_blk5_pointer(machine(), 0x2000), 0x2000); break; |
| 253 | case 0xb000: fread(m_cart->vic20_blk5_pointer(machine(), 0x2000) + 0x1000, 0x1000); break; |
| 254 | default: return IMAGE_INIT_FAIL; |
| 257 | 255 | } |
| 258 | | |
| 259 | | // determine ROM region lengths |
| 260 | | size_t blk1_size = 0; |
| 261 | | size_t blk2_size = 0; |
| 262 | | size_t blk3_size = 0; |
| 263 | | size_t blk5_size = 0; |
| 264 | | |
| 265 | | while (!image_feof()) |
| 266 | | { |
| 267 | | cbm_crt_chip chip; |
| 268 | | fread(&chip, CRT_CHIP_LENGTH); |
| 269 | | |
| 270 | | UINT16 address = pick_integer_be(chip.start_address, 0, 2); |
| 271 | | UINT16 size = pick_integer_be(chip.image_size, 0, 2); |
| 272 | | UINT16 type = pick_integer_be(chip.chip_type, 0, 2); |
| 273 | | |
| 274 | | if (LOG) |
| 275 | | { |
| 276 | | logerror("CHIP Address: %04x\n", address); |
| 277 | | logerror("CHIP Size: %04x\n", size); |
| 278 | | logerror("CHIP Type: %04x\n", type); |
| 279 | | } |
| 280 | | |
| 281 | | switch (address) |
| 282 | | { |
| 283 | | case 0x2000: blk1_size += size; break; |
| 284 | | case 0x4000: blk2_size += size; break; |
| 285 | | case 0x6000: blk3_size += size; break; |
| 286 | | case 0x7000: blk3_size += 0x2000; break; |
| 287 | | case 0xa000: blk5_size += size; break; |
| 288 | | case 0xb000: blk5_size += 0x2000; break; |
| 289 | | default: logerror("Invalid CHIP loading address!\n"); break; |
| 290 | | } |
| 291 | | |
| 292 | | fseek(size, SEEK_CUR); |
| 293 | | } |
| 294 | | |
| 295 | | // allocate cartridge memory |
| 296 | | UINT8 *blk1 = NULL; |
| 297 | | UINT8 *blk2 = NULL; |
| 298 | | UINT8 *blk3 = NULL; |
| 299 | | UINT8 *blk5 = NULL; |
| 300 | | |
| 301 | | if (blk1_size) blk1 = m_cart->vic20_blk1_pointer(machine(), blk1_size); |
| 302 | | if (blk2_size) blk2 = m_cart->vic20_blk2_pointer(machine(), blk2_size); |
| 303 | | if (blk3_size) blk3 = m_cart->vic20_blk3_pointer(machine(), blk3_size); |
| 304 | | if (blk5_size) blk5 = m_cart->vic20_blk5_pointer(machine(), blk5_size); |
| 305 | | |
| 306 | | // read the data |
| 307 | | offs_t blk1_offset = 0; |
| 308 | | offs_t blk2_offset = 0; |
| 309 | | offs_t blk3_offset = 0; |
| 310 | | offs_t blk5_offset = 0; |
| 311 | | |
| 312 | | fseek(CRT_HEADER_LENGTH, SEEK_SET); |
| 313 | | |
| 314 | | while (!image_feof()) |
| 315 | | { |
| 316 | | cbm_crt_chip chip; |
| 317 | | fread(&chip, CRT_CHIP_LENGTH); |
| 318 | | |
| 319 | | UINT16 address = pick_integer_be(chip.start_address, 0, 2); |
| 320 | | UINT16 size = pick_integer_be(chip.image_size, 0, 2); |
| 321 | | |
| 322 | | switch (address) |
| 323 | | { |
| 324 | | case 0x2000: fread(blk1 + blk1_offset, size); blk1_offset += size; break; |
| 325 | | case 0x4000: fread(blk2 + blk2_offset, size); blk2_offset += size; break; |
| 326 | | case 0x6000: fread(blk3 + blk3_offset, size); blk3_offset += size; break; |
| 327 | | case 0x7000: fread(blk3 + blk3_offset + 0x1000, size); blk3_offset += 0x2000; break; |
| 328 | | case 0xa000: fread(blk5 + blk5_offset, size); blk5_offset += size; break; |
| 329 | | case 0xb000: fread(blk5 + blk5_offset + 0x1000, size); blk5_offset += 0x2000; break; |
| 330 | | } |
| 331 | | } |
| 332 | 256 | } |
| 333 | 257 | } |
| 334 | 258 | else |