hash/crvision.xml
| r7946 | r7947 | |
| 1 | 1 | <?xml version="1.0"?> |
| 2 | 2 | <!DOCTYPE softwarelist SYSTEM "softwarelist.dtd"> |
| 3 | |
| 4 | <!-- Many thanks to Luca Antignano for the help with this software list --> |
| 3 | 5 | <softwarelist name="crvision" description="V-Tech Creativision cartridges"> |
| 4 | 6 | <!-- Id: 8008 --> |
| 5 | 7 | <software name="airsea"> |
| r7946 | r7947 | |
| 84 | 86 | </part> |
| 85 | 87 | </software> |
| 86 | 88 | |
| 87 | | <!-- Id: RAM V1 - Y-2605 --> |
| 89 | <!-- Id: 8011 --> |
| 88 | 90 | <software name="basic"> |
| 89 | | <description>Basic v.1 (1983, Release 2)</description> |
| 91 | <description>Basic V.1 (1983, Release 2)</description> |
| 90 | 92 | <year>1983</year> |
| 91 | 93 | <publisher>Video Technology Ltd.</publisher> |
| 92 | 94 | <part name="cart" interface="crvision_cart"> |
| r7946 | r7947 | |
| 133 | 135 | </software> |
| 134 | 136 | |
| 135 | 137 | <!-- Id: 8013 --> |
| 136 | | <software name="deepsea1" cloneof="deepsea"> |
| 138 | <software name="deepsea"> |
| 137 | 139 | <description>Deep Sea Adventure (6k Cart)</description> |
| 138 | 140 | <year>1982</year> |
| 139 | 141 | <publisher>Video Technology Ltd.</publisher> |
| r7946 | r7947 | |
| 145 | 147 | </software> |
| 146 | 148 | |
| 147 | 149 | <!-- Id: 8013 --> |
| 148 | | <software name="deepsea"> |
| 150 | <software name="deepsea1" cloneof="deepsea"> |
| 149 | 151 | <description>Deep Sea Adventure (8k Cart)</description> |
| 150 | 152 | <year>1982</year> |
| 151 | 153 | <publisher>Video Technology Ltd.</publisher> |
| r7946 | r7947 | |
| 157 | 159 | </software> |
| 158 | 160 | |
| 159 | 161 | <!-- Id: 8020 --> |
| 160 | | <software name="locomot1" cloneof="locomot"> |
| 162 | <software name="locomot"> |
| 161 | 163 | <description>Locomotive (10k cart)</description> |
| 162 | 164 | <year>1983</year> |
| 163 | 165 | <publisher>Video Technology Ltd.</publisher> |
| r7946 | r7947 | |
| 169 | 171 | </software> |
| 170 | 172 | |
| 171 | 173 | <!-- Id: 8020 --> |
| 172 | | <software name="locomot"> |
| 174 | <software name="locomot1" cloneof="locomot"> |
| 173 | 175 | <description>Locomotive (12k cart)</description> |
| 174 | 176 | <year>1983</year> |
| 175 | 177 | <publisher>Video Technology Ltd.</publisher> |
| r7946 | r7947 | |
| 288 | 290 | </software> |
| 289 | 291 | |
| 290 | 292 | <!-- Id: 8002 --> |
| 291 | | <software name="tankatk1" cloneof="tankatk"> |
| 293 | <software name="tankatk"> |
| 292 | 294 | <description>Tank Attack (6k Cart)</description> |
| 293 | 295 | <year>1981</year> |
| 294 | 296 | <publisher>Video Technology Ltd.</publisher> |
| r7946 | r7947 | |
| 300 | 302 | </software> |
| 301 | 303 | |
| 302 | 304 | <!-- Id: 8002 --> |
| 303 | | <software name="tankatk"> |
| 305 | <software name="tankatk1" cloneof="tankatk"> |
| 304 | 306 | <description>Tank Attack (8k Cart)</description> |
| 305 | 307 | <year>1981</year> |
| 306 | 308 | <publisher>Video Technology Ltd.</publisher> |
| r7946 | r7947 | |
| 312 | 314 | </software> |
| 313 | 315 | |
| 314 | 316 | <!-- Id: 8004 --> |
| 315 | | <software name="tennis1" cloneof="tennis"> |
| 317 | <software name="tennis"> |
| 316 | 318 | <description>Tennis (Wimbledon, 6k Cart)</description> |
| 317 | 319 | <year>1981</year> |
| 318 | 320 | <publisher>Video Technology Ltd.</publisher> |
| r7946 | r7947 | |
| 324 | 326 | </software> |
| 325 | 327 | |
| 326 | 328 | <!-- Id: 8004 --> |
| 327 | | <software name="tennis"> |
| 329 | <software name="tennis1" cloneof="tennis"> |
| 328 | 330 | <description>Tennis (Wimbledon, 8k Cart)</description> |
| 329 | 331 | <year>1981</year> |
| 330 | 332 | <publisher>Video Technology Ltd.</publisher> |
| r7946 | r7947 | |
| 348 | 350 | </software> |
| 349 | 351 | |
| 350 | 352 | <!-- Id: Y-1620 --> |
| 351 | | <software name="tennisd1" cloneof="tennis"> |
| 353 | <software name="tennisd" cloneof="tennis"> |
| 352 | 354 | <description>Tennis (Dick Smith, 6k Cart)</description> |
| 353 | 355 | <year>1981</year> |
| 354 | 356 | <publisher>Video Technology Ltd.</publisher> |
| r7946 | r7947 | |
| 360 | 362 | </software> |
| 361 | 363 | |
| 362 | 364 | <!-- Id: Y-1620 --> |
| 363 | | <software name="tennisd" cloneof="tennis"> |
| 365 | <software name="tennisd1" cloneof="tennis"> |
| 364 | 366 | <description>Tennis (Dick Smith, 8k Cart)</description> |
| 365 | 367 | <year>1981</year> |
| 366 | 368 | <publisher>Video Technology Ltd.</publisher> |
| r7946 | r7947 | |
| 371 | 373 | </part> |
| 372 | 374 | </software> |
| 373 | 375 | |
| 376 | <!-- This was an hombrew cart sold back in the 80s --> |
| 374 | 377 | <software name="hapmon"> |
| 375 | 378 | <description>Hapmon</description> |
| 376 | 379 | <year>19??</year> |
| 377 | | <publisher><unknown></publisher> |
| 380 | <publisher>Richard Hayter</publisher> |
| 378 | 381 | <part name="cart" interface="crvision_cart"> |
| 379 | 382 | <dataarea name="rom" size="4096"> |
| 380 | 383 | <rom name="hapmon.bin" size="4096" crc="15d07b96" sha1="89359dca952bc90644dfd7f546c184a8165faa14" offset="000000" /> |
| r7946 | r7947 | |
| 385 | 388 | <!-- These contain the same data as chopper, but in a different order (which is not handled properly by emulators). I'm listing these here to document checksums. |
| 386 | 389 | <software name="chopper2" cloneof="chopper"> |
| 387 | 390 | <description>Chopper Rescue (Alt 2)</description> |
| 388 | | <year>19??</year> |
| 391 | <year>1983</year> |
| 389 | 392 | <publisher>Video Technology Ltd.</publisher> |
| 390 | 393 | <part name="cart" interface="crvision_cart"> |
| 391 | 394 | <dataarea name="rom" size="18432"> |
| r7946 | r7947 | |
| 396 | 399 | |
| 397 | 400 | <software name="chopper1" cloneof="chopper"> |
| 398 | 401 | <description>Chopper Rescue (Alt)</description> |
| 399 | | <year>19??</year> |
| 402 | <year>1983</year> |
| 400 | 403 | <publisher>Video Technology Ltd.</publisher> |
| 401 | 404 | <part name="cart" interface="crvision_cart"> |
| 402 | 405 | <dataarea name="rom" size="18432"> |
src/mess/drivers/crvision.c
| r7946 | r7947 | |
| 446 | 446 | |
| 447 | 447 | static DEVICE_IMAGE_LOAD( crvision_cart ) |
| 448 | 448 | { |
| 449 | | int size = image_length(image); |
| 449 | UINT32 size; |
| 450 | UINT8 *temp_copy; |
| 450 | 451 | running_machine *machine = image->machine; |
| 451 | 452 | UINT8 *mem = memory_region(machine, M6502_TAG); |
| 452 | 453 | const address_space *program = cputag_get_address_space(machine, M6502_TAG, ADDRESS_SPACE_PROGRAM); |
| 453 | 454 | |
| 455 | if (image_software_entry(image) == NULL) |
| 456 | { |
| 457 | size = image_length(image); |
| 458 | temp_copy = auto_alloc_array(machine, UINT8, size); |
| 459 | image_fread(image, temp_copy, size); |
| 460 | } |
| 461 | else |
| 462 | { |
| 463 | size= image_get_software_region_length(image, "rom"); |
| 464 | temp_copy = auto_alloc_array(machine, UINT8, size); |
| 465 | memcpy(temp_copy, image_get_software_region(image, "rom"), size); |
| 466 | } |
| 467 | |
| 454 | 468 | switch (size) |
| 455 | 469 | { |
| 456 | 470 | case 0x1000: // 4K |
| 457 | | image_fread(image, mem + 0x9000, 0x1000); // load 4KB at 0x9000 |
| 471 | memcpy(mem + 0x9000, temp_copy, 0x1000); // load 4KB at 0x9000 |
| 458 | 472 | memcpy(mem + 0xb000, mem + 0x9000, 0x1000); // mirror 4KB at 0xb000 |
| 459 | 473 | memory_install_read_bank(program, 0x8000, 0xbfff, 0, 0x2000, BANK_ROM1); |
| 460 | 474 | break; |
| 461 | 475 | |
| 462 | 476 | case 0x1800: // 6K |
| 463 | | image_fread(image, mem + 0x9000, 0x1000); // load lower 4KB at 0x9000 |
| 477 | memcpy(mem + 0x9000, temp_copy, 0x1000); // load lower 4KB at 0x9000 |
| 464 | 478 | memcpy(mem + 0xb000, mem + 0x9000, 0x1000); // mirror lower 4KB at 0xb000 |
| 465 | | image_fread(image, mem + 0x8000, 0x0800); // load higher 2KB at 0x8000 |
| 479 | memcpy(mem + 0x8000, temp_copy + 0x1000, 0x0800); // load higher 2KB at 0x8000 |
| 466 | 480 | memcpy(mem + 0x8800, mem + 0x8000, 0x0800); // mirror higher 2KB at 0x8800 |
| 467 | 481 | memcpy(mem + 0xa000, mem + 0x8000, 0x0800); // mirror higher 2KB at 0xa000 |
| 468 | 482 | memcpy(mem + 0xa800, mem + 0x8000, 0x0800); // mirror higher 2KB at 0xa800 |
| r7946 | r7947 | |
| 470 | 484 | break; |
| 471 | 485 | |
| 472 | 486 | case 0x2000: // 8K |
| 473 | | image_fread(image, mem + 0x8000, 0x2000); // load 8KB at 0x8000 |
| 487 | memcpy(mem + 0x8000, temp_copy, 0x2000); // load 8KB at 0x8000 |
| 474 | 488 | memcpy(mem + 0xa000, mem + 0x8000, 0x2000); // mirror 8KB at 0xa000 |
| 475 | 489 | memory_install_read_bank(program, 0x8000, 0xbfff, 0, 0x2000, BANK_ROM1); |
| 476 | 490 | break; |
| 477 | 491 | |
| 478 | 492 | case 0x2800: // 10K |
| 479 | | image_fread(image, mem + 0x8000, 0x2000); // load lower 8KB at 0x8000 |
| 493 | memcpy(mem + 0x8000, temp_copy, 0x2000); // load lower 8KB at 0x8000 |
| 480 | 494 | memcpy(mem + 0xa000, mem + 0x8000, 0x2000); // mirror lower 8KB at 0xa000 |
| 481 | | image_fread(image, mem + 0x4000, 0x0800); // load higher 2KB at 0x4000 |
| 495 | memcpy(mem + 0x4000, temp_copy + 0x2000, 0x0800); // load higher 2KB at 0x4000 |
| 482 | 496 | memcpy(mem + 0x4800, mem + 0x4000, 0x0800); // mirror higher 2KB at 0x4800 |
| 483 | 497 | memcpy(mem + 0x5000, mem + 0x4000, 0x0800); // mirror higher 2KB at 0x5000 |
| 484 | 498 | memcpy(mem + 0x5800, mem + 0x4000, 0x0800); // mirror higher 2KB at 0x5800 |
| r7946 | r7947 | |
| 491 | 505 | break; |
| 492 | 506 | |
| 493 | 507 | case 0x3000: // 12K |
| 494 | | image_fread(image, mem + 0x8000, 0x2000); // load lower 8KB at 0x8000 |
| 508 | memcpy(mem + 0x8000, temp_copy, 0x2000); // load lower 8KB at 0x8000 |
| 495 | 509 | memcpy(mem + 0xa000, mem + 0x8000, 0x2000); // mirror lower 8KB at 0xa000 |
| 496 | | image_fread(image, mem + 0x4000, 0x1000); // load higher 4KB at 0x4000 |
| 510 | memcpy(mem + 0x4000, temp_copy + 0x2000, 0x1000); // load higher 4KB at 0x4000 |
| 497 | 511 | memcpy(mem + 0x5000, mem + 0x4000, 0x1000); // mirror higher 4KB at 0x5000 |
| 498 | 512 | memcpy(mem + 0x6000, mem + 0x4000, 0x1000); // mirror higher 4KB at 0x6000 |
| 499 | 513 | memcpy(mem + 0x7000, mem + 0x4000, 0x1000); // mirror higher 4KB at 0x7000 |
| r7946 | r7947 | |
| 502 | 516 | break; |
| 503 | 517 | |
| 504 | 518 | case 0x4000: // 16K |
| 505 | | image_fread(image, mem + 0xa000, 0x2000); // load lower 8KB at 0xa000 |
| 506 | | image_fread(image, mem + 0x8000, 0x2000); // load higher 8KB at 0x8000 |
| 519 | memcpy(mem + 0xa000, temp_copy, 0x2000); // load lower 8KB at 0xa000 |
| 520 | memcpy(mem + 0x8000, temp_copy + 0x2000, 0x2000); // load higher 8KB at 0x8000 |
| 507 | 521 | memory_install_read_bank(program, 0x8000, 0xbfff, 0, 0, BANK_ROM1); |
| 508 | 522 | memory_install_read_bank(program, 0x4000, 0x7fff, 0, 0, BANK_ROM2); |
| 509 | 523 | break; |
| 510 | 524 | |
| 511 | 525 | case 0x4800: // 18K |
| 512 | | image_fread(image, mem + 0xa000, 0x2000); // load lower 8KB at 0xa000 |
| 513 | | image_fread(image, mem + 0x8000, 0x2000); // load higher 8KB at 0x8000 |
| 514 | | image_fread(image, mem + 0x4000, 0x0800); // load higher 2KB at 0x4000 |
| 526 | memcpy(mem + 0xa000, temp_copy, 0x2000); // load lower 8KB at 0xa000 |
| 527 | memcpy(mem + 0x8000, temp_copy + 0x2000, 0x2000); // load higher 8KB at 0x8000 |
| 528 | memcpy(mem + 0x4000, temp_copy + 0x4000, 0x0800); // load higher 2KB at 0x4000 |
| 515 | 529 | memcpy(mem + 0x4800, mem + 0x4000, 0x0800); // mirror higher 2KB at 0x4800 |
| 516 | 530 | memcpy(mem + 0x5000, mem + 0x4000, 0x0800); // mirror higher 2KB at 0x5000 |
| 517 | 531 | memcpy(mem + 0x5800, mem + 0x4000, 0x0800); // mirror higher 2KB at 0x5800 |
| r7946 | r7947 | |
| 524 | 538 | break; |
| 525 | 539 | |
| 526 | 540 | default: |
| 541 | auto_free(machine, temp_copy); |
| 527 | 542 | return INIT_FAIL; |
| 528 | 543 | } |
| 529 | 544 | |
| r7946 | r7947 | |
| 533 | 548 | memory_configure_bank(machine, "bank2", 0, 1, mem + 0x4000, 0); |
| 534 | 549 | memory_set_bank(machine, "bank2", 0); |
| 535 | 550 | |
| 551 | auto_free(machine, temp_copy); |
| 552 | |
| 536 | 553 | return INIT_PASS; |
| 537 | 554 | } |
| 538 | 555 | |
| r7946 | r7947 | |
| 568 | 585 | MDRV_CARTSLOT_ADD("cart") |
| 569 | 586 | MDRV_CARTSLOT_EXTENSION_LIST("bin,rom") |
| 570 | 587 | MDRV_CARTSLOT_MANDATORY |
| 588 | MDRV_CARTSLOT_INTERFACE("crvision_cart") |
| 571 | 589 | MDRV_CARTSLOT_LOAD(crvision_cart) |
| 572 | 590 | |
| 591 | /* software lists */ |
| 592 | MDRV_SOFTWARE_LIST_ADD("crvision") |
| 593 | |
| 573 | 594 | /* cassette */ |
| 574 | 595 | MDRV_CASSETTE_ADD(CASSETTE_TAG, crvision_cassette_config) |
| 575 | 596 | |
src/mess/drivers/svision.c
| r7946 | r7947 | |
| 456 | 456 | timer_pulse(machine, attotime_mul(ATTOTIME_IN_SEC(8), 256/cputag_get_clock(machine, "maincpu")), NULL, 0, svision_pet_timer); |
| 457 | 457 | } |
| 458 | 458 | |
| 459 | static DEVICE_IMAGE_LOAD( svision_cart ) |
| 460 | { |
| 461 | UINT32 size; |
| 462 | UINT8 *temp_copy; |
| 463 | int mirror, i; |
| 464 | |
| 465 | if (image_software_entry(image) == NULL) |
| 466 | { |
| 467 | size = image_length(image); |
| 468 | temp_copy = auto_alloc_array(image->machine, UINT8, size); |
| 469 | |
| 470 | if (size > memory_region_length(image->machine, "user1")) |
| 471 | { |
| 472 | image_seterror(image, IMAGE_ERROR_UNSPECIFIED, "Unsupported cartridge size"); |
| 473 | return INIT_FAIL; |
| 474 | } |
| 475 | |
| 476 | if (image_fread(image, temp_copy, size) != size) |
| 477 | { |
| 478 | image_seterror(image, IMAGE_ERROR_UNSPECIFIED, "Unable to fully read from file"); |
| 479 | return INIT_FAIL; |
| 480 | } |
| 481 | } |
| 482 | else |
| 483 | { |
| 484 | size = image_get_software_region_length(image, "rom"); |
| 485 | temp_copy = auto_alloc_array(image->machine, UINT8, size); |
| 486 | memcpy(temp_copy, image_get_software_region(image, "rom"), size); |
| 487 | } |
| 488 | |
| 489 | mirror = memory_region_length(image->machine, "user1") / size; |
| 490 | |
| 491 | /* With the following, we mirror the cart in the whole "user1" memory region */ |
| 492 | for (i = 0; i < mirror; i++) |
| 493 | memcpy(memory_region(image->machine, "user1") + i * size, temp_copy, size); |
| 494 | |
| 495 | auto_free(image->machine, temp_copy); |
| 496 | |
| 497 | return INIT_PASS; |
| 498 | } |
| 499 | |
| 459 | 500 | static MACHINE_RESET( svision ) |
| 460 | 501 | { |
| 461 | 502 | svision.timer_shot = FALSE; |
| r7946 | r7947 | |
| 510 | 551 | MDRV_CARTSLOT_ADD("cart") |
| 511 | 552 | MDRV_CARTSLOT_EXTENSION_LIST("bin,ws,sv") |
| 512 | 553 | MDRV_CARTSLOT_MANDATORY |
| 554 | MDRV_CARTSLOT_INTERFACE("svision_cart") |
| 555 | MDRV_CARTSLOT_LOAD(svision_cart) |
| 556 | |
| 557 | /* Software lists */ |
| 558 | MDRV_SOFTWARE_LIST_ADD("svision") |
| 513 | 559 | MACHINE_DRIVER_END |
| 514 | 560 | |
| 515 | 561 | static MACHINE_DRIVER_START( svisionp ) |
| r7946 | r7947 | |
| 542 | 588 | MACHINE_DRIVER_END |
| 543 | 589 | |
| 544 | 590 | ROM_START(svision) |
| 545 | | ROM_REGION(0x20000, "user1", 0) |
| 546 | | ROM_CART_LOAD("cart", 0x0000, 0x20000, ROM_MIRROR) |
| 591 | ROM_REGION(0x20000, "user1", ROMREGION_ERASE00) |
| 547 | 592 | ROM_END |
| 548 | 593 | |
| 549 | 594 | |