trunk/src/mess/drivers/svision.c
| r32373 | r32374 | |
| 5 | 5 | ******************************************************************************/ |
| 6 | 6 | |
| 7 | 7 | #include "emu.h" |
| 8 | | #include "cpu/m6502/m65c02.h" |
| 9 | 8 | |
| 10 | 9 | #include "includes/svision.h" |
| 11 | | #include "imagedev/cartslot.h" |
| 10 | |
| 12 | 11 | #include "svision.lh" |
| 13 | 12 | |
| 14 | 13 | #define MAKE8_RGB32(red3, green3, blue2) ( ( (red3)<<(16+5)) | ( (green3)<<(8+5)) | ( (blue2)<<(0+6)) ) |
| r32373 | r32374 | |
| 129 | 128 | |
| 130 | 129 | WRITE8_MEMBER(svision_state::svision_w) |
| 131 | 130 | { |
| 132 | | int value; |
| 133 | | int delay; |
| 131 | int value, delay, bank; |
| 134 | 132 | |
| 135 | 133 | m_reg[offset] = data; |
| 136 | 134 | |
| r32373 | r32374 | |
| 141 | 139 | break; |
| 142 | 140 | |
| 143 | 141 | case 0x26: /* bits 5,6 memory management for a000? */ |
| 144 | | logerror("%.6f svision write %04x %02x\n", machine().time().as_double(),offset,data); |
| 145 | | m_bank1->set_base(m_user1->base() + ((m_reg[0x26] & 0xe0) << 9)); |
| 142 | logerror("%.6f svision write %04x %02x\n", machine().time().as_double(), offset, data); |
| 143 | bank = ((m_reg[0x26] & 0xe0) >> 5) % (m_cart_rom->bytes() / 0x4000); |
| 144 | m_bank1->set_base(m_cart_rom->base() + (bank * 0x4000)); |
| 146 | 145 | svision_irq(); |
| 147 | 146 | break; |
| 148 | 147 | |
| r32373 | r32374 | |
| 451 | 450 | m_sound = machine().device<svision_sound_device>("custom"); |
| 452 | 451 | m_dma_finished = m_sound->dma_finished(); |
| 453 | 452 | m_pet.on = FALSE; |
| 454 | | m_user1 = memregion("user1"); |
| 455 | | m_bank1 = membank("bank1"); |
| 456 | | m_bank2 = membank("bank2"); |
| 457 | | m_bank2->set_base(m_user1->base() + 0x1c000); |
| 458 | 453 | } |
| 459 | 454 | |
| 460 | 455 | DRIVER_INIT_MEMBER(svision_state,svisions) |
| r32373 | r32374 | |
| 462 | 457 | m_svision.timer1 = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(svision_state::svision_timer),this)); |
| 463 | 458 | m_sound = machine().device<svision_sound_device>("custom"); |
| 464 | 459 | m_dma_finished = m_sound->dma_finished(); |
| 465 | | m_user1 = memregion("user1"); |
| 466 | | m_bank1 = membank("bank1"); |
| 467 | | m_bank2 = membank("bank2"); |
| 468 | | m_bank2->set_base(m_user1->base() + 0x1c000); |
| 469 | 460 | m_pet.on = TRUE; |
| 470 | 461 | m_pet.timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(svision_state::svision_pet_timer),this)); |
| 471 | 462 | } |
| 472 | 463 | |
| 473 | 464 | DEVICE_IMAGE_LOAD_MEMBER( svision_state, svision_cart ) |
| 474 | 465 | { |
| 475 | | UINT32 size; |
| 476 | | dynamic_buffer temp_copy; |
| 477 | | int mirror, i; |
| 478 | | |
| 479 | | if (image.software_entry() == NULL) |
| 466 | UINT32 size = m_cart->common_get_size("rom"); |
| 467 | |
| 468 | if (size > 0x20000) |
| 480 | 469 | { |
| 481 | | size = image.length(); |
| 482 | | |
| 483 | | if (size > memregion("user1")->bytes()) |
| 484 | | { |
| 485 | | image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported cartridge size"); |
| 486 | | return IMAGE_INIT_FAIL; |
| 487 | | } |
| 488 | | |
| 489 | | temp_copy.resize(size); |
| 490 | | if (image.fread( temp_copy, size) != size) |
| 491 | | { |
| 492 | | image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unable to fully read from file"); |
| 493 | | return IMAGE_INIT_FAIL; |
| 494 | | } |
| 470 | image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported cartridge size"); |
| 471 | return IMAGE_INIT_FAIL; |
| 495 | 472 | } |
| 496 | | else |
| 497 | | { |
| 498 | | size = image.get_software_region_length("rom"); |
| 499 | | temp_copy.resize(size); |
| 500 | | memcpy(temp_copy, image.get_software_region("rom"), size); |
| 501 | | } |
| 473 | |
| 474 | m_cart->rom_alloc(size, GENERIC_ROM8_WIDTH, ENDIANNESS_LITTLE); |
| 475 | m_cart->common_load_rom(m_cart->get_rom_base(), size, "rom"); |
| 476 | |
| 477 | return IMAGE_INIT_PASS; |
| 478 | } |
| 502 | 479 | |
| 503 | | mirror = memregion("user1")->bytes() / size; |
| 480 | void svision_state::machine_start() |
| 481 | { |
| 482 | int num_banks; |
| 483 | astring region_tag; |
| 484 | m_cart_rom = memregion(region_tag.cpy(m_cart->tag()).cat(GENERIC_ROM_REGION_TAG)); |
| 485 | num_banks = m_cart_rom->bytes() / 0x4000; |
| 504 | 486 | |
| 505 | | /* With the following, we mirror the cart in the whole "user1" memory region */ |
| 506 | | for (i = 0; i < mirror; i++) |
| 507 | | { |
| 508 | | memcpy(memregion("user1")->base() + i * size, temp_copy, size); |
| 509 | | } |
| 510 | | |
| 511 | | return IMAGE_INIT_PASS; |
| 487 | m_bank1 = membank("bank1"); |
| 488 | m_bank2 = membank("bank2"); |
| 489 | // bank1 is set to the first bank |
| 490 | m_bank1->set_base(m_cart_rom->base()); |
| 491 | // bank2 is set to the last bank |
| 492 | m_bank2->set_base(m_cart_rom->base() + (num_banks - 1) * 0x4000); |
| 512 | 493 | } |
| 513 | 494 | |
| 514 | 495 | void svision_state::machine_reset() |
| 515 | 496 | { |
| 516 | 497 | m_svision.timer_shot = FALSE; |
| 517 | 498 | *m_dma_finished = FALSE; |
| 518 | | m_bank1->set_base(m_user1->base()); |
| 519 | 499 | } |
| 520 | 500 | |
| 521 | 501 | |
| 522 | 502 | MACHINE_RESET_MEMBER(svision_state,tvlink) |
| 523 | 503 | { |
| 524 | | m_svision.timer_shot = FALSE; |
| 525 | | *m_dma_finished = FALSE; |
| 526 | | m_bank1->set_base(m_user1->base()); |
| 504 | svision_state::machine_reset(); |
| 527 | 505 | m_tvlink.palette_on = FALSE; |
| 528 | 506 | |
| 529 | 507 | memset(m_reg + 0x800, 0xff, 0x40); // normally done from m_tvlink microcontroller |
| r32373 | r32374 | |
| 541 | 519 | MCFG_CPU_PROGRAM_MAP(svision_mem) |
| 542 | 520 | MCFG_CPU_VBLANK_INT_DRIVER("screen", svision_state, svision_frame_int) |
| 543 | 521 | |
| 544 | | |
| 545 | 522 | /* video hardware */ |
| 546 | 523 | MCFG_SCREEN_ADD("screen", LCD) |
| 547 | 524 | MCFG_SCREEN_REFRESH_RATE(61) |
| r32373 | r32374 | |
| 562 | 539 | MCFG_SOUND_ROUTE(1, "rspeaker", 0.50) |
| 563 | 540 | |
| 564 | 541 | /* cartridge */ |
| 565 | | MCFG_CARTSLOT_ADD("cart") |
| 566 | | MCFG_CARTSLOT_EXTENSION_LIST("bin,ws,sv") |
| 567 | | MCFG_CARTSLOT_MANDATORY |
| 568 | | MCFG_CARTSLOT_INTERFACE("svision_cart") |
| 569 | | MCFG_CARTSLOT_LOAD(svision_state, svision_cart) |
| 542 | MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "svision_cart") |
| 543 | MCFG_GENERIC_EXTENSIONS("bin,ws,sv") |
| 544 | MCFG_GENERIC_MANDATORY |
| 545 | MCFG_GENERIC_LOAD(svision_state, svision_cart) |
| 570 | 546 | |
| 571 | 547 | /* Software lists */ |
| 572 | 548 | MCFG_SOFTWARE_LIST_ADD("cart_list","svision") |
| r32373 | r32374 | |
| 607 | 583 | MACHINE_CONFIG_END |
| 608 | 584 | |
| 609 | 585 | ROM_START(svision) |
| 610 | | ROM_REGION(0x20000, "user1", ROMREGION_ERASE00) |
| 586 | ROM_REGION(0x20000, "maincpu", ROMREGION_ERASE00) |
| 611 | 587 | ROM_END |
| 612 | 588 | |
| 613 | 589 | |
trunk/src/mess/drivers/px4.c
| r32373 | r32374 | |
| 15 | 15 | #include "machine/ram.h" |
| 16 | 16 | #include "bus/epson_sio/epson_sio.h" |
| 17 | 17 | #include "bus/centronics/ctronics.h" |
| 18 | | #include "imagedev/cartslot.h" |
| 19 | 18 | #include "imagedev/cassette.h" |
| 20 | 19 | #include "machine/ram.h" |
| 21 | 20 | #include "machine/nvram.h" |
| 22 | 21 | #include "sound/speaker.h" |
| 22 | |
| 23 | #include "bus/generic/slot.h" |
| 24 | #include "bus/generic/carts.h" |
| 23 | 25 | #include "px4.lh" |
| 24 | 26 | |
| 25 | 27 | |
| r32373 | r32374 | |
| 80 | 82 | m_speaker(*this, "speaker"), |
| 81 | 83 | m_sio(*this, "sio"), |
| 82 | 84 | m_rs232(*this, "rs232"), |
| 85 | m_caps1(*this, "capsule1"), |
| 86 | m_caps2(*this, "capsule2"), |
| 87 | m_rdsocket(*this, "ramdisk_socket"), |
| 83 | 88 | m_isr(0), m_ier(0), m_str(0), m_sior(0xbf), |
| 84 | 89 | m_artdir(0xff), m_artdor(0xff), m_artsr(0), m_artcr(0), |
| 85 | 90 | m_swr(0), |
| r32373 | r32374 | |
| 97 | 102 | required_device<speaker_sound_device> m_speaker; |
| 98 | 103 | required_device<epson_sio_device> m_sio; |
| 99 | 104 | required_device<rs232_port_device> m_rs232; |
| 105 | required_device<generic_slot_device> m_caps1; |
| 106 | required_device<generic_slot_device> m_caps2; |
| 107 | optional_device<generic_slot_device> m_rdsocket; |
| 100 | 108 | |
| 109 | memory_region *m_caps1_rom; |
| 110 | memory_region *m_caps2_rom; |
| 111 | |
| 101 | 112 | // gapnit register |
| 102 | 113 | UINT8 m_ctrl1; |
| 103 | 114 | UINT16 m_icrb; |
| r32373 | r32374 | |
| 143 | 154 | // external cassette/barcode reader |
| 144 | 155 | int m_ear_last_state; |
| 145 | 156 | |
| 146 | | void install_rom_capsule(address_space &space, int size, const char *region); |
| 157 | void install_rom_capsule(address_space &space, int size, memory_region *mem); |
| 147 | 158 | |
| 148 | 159 | // device_serial_interface overrides |
| 149 | 160 | virtual void tra_callback(); |
| r32373 | r32374 | |
| 200 | 211 | DECLARE_READ8_MEMBER(px4_ramdisk_control_r); |
| 201 | 212 | DECLARE_DRIVER_INIT(px4); |
| 202 | 213 | DECLARE_DRIVER_INIT(px4p); |
| 214 | virtual void machine_start(); |
| 203 | 215 | virtual void machine_reset(); |
| 204 | 216 | DECLARE_PALETTE_INIT(px4); |
| 205 | 217 | DECLARE_MACHINE_START(px4_ramdisk); |
| r32373 | r32374 | |
| 437 | 449 | } |
| 438 | 450 | |
| 439 | 451 | // helper function to map rom capsules |
| 440 | | void px4_state::install_rom_capsule(address_space &space, int size, const char *region) |
| 452 | void px4_state::install_rom_capsule(address_space &space, int size, memory_region *mem) |
| 441 | 453 | { |
| 442 | 454 | // ram, part 1 |
| 443 | 455 | space.install_ram(0x0000, 0xdfff - size, 0, 0, m_ram->pointer()); |
| 444 | 456 | |
| 445 | 457 | // actual rom data, part 1 |
| 446 | | space.install_rom(0xe000 - size, 0xffff, 0, 0, memregion(region)->base() + (size - 0x2000)); |
| 458 | if (mem) |
| 459 | space.install_rom(0xe000 - size, 0xffff, 0, 0, mem->base() + (size - 0x2000)); |
| 447 | 460 | |
| 448 | 461 | // rom data, part 2 |
| 449 | | if (size != 0x2000) |
| 450 | | { |
| 451 | | space.install_rom(0x10000 - size, 0xdfff, 0, 0, memregion(region)->base()); |
| 452 | | } |
| 462 | if (mem && size != 0x2000) |
| 463 | space.install_rom(0x10000 - size, 0xdfff, 0, 0, mem->base()); |
| 453 | 464 | |
| 454 | 465 | // ram, continued |
| 455 | 466 | space.install_ram(0xe000, 0xffff, 0, 0, m_ram->pointer() + 0xe000); |
| r32373 | r32374 | |
| 479 | 490 | space_program.install_ram(0x0000, 0xffff, 0, 0, m_ram->pointer()); |
| 480 | 491 | break; |
| 481 | 492 | |
| 482 | | case 0x08: install_rom_capsule(space_program, 0x2000, "capsule1"); break; |
| 483 | | case 0x09: install_rom_capsule(space_program, 0x4000, "capsule1"); break; |
| 484 | | case 0x0a: install_rom_capsule(space_program, 0x8000, "capsule1"); break; |
| 485 | | case 0x0c: install_rom_capsule(space_program, 0x2000, "capsule2"); break; |
| 486 | | case 0x0d: install_rom_capsule(space_program, 0x4000, "capsule2"); break; |
| 487 | | case 0x0e: install_rom_capsule(space_program, 0x8000, "capsule2"); break; |
| 493 | case 0x08: install_rom_capsule(space_program, 0x2000, m_caps1_rom); break; |
| 494 | case 0x09: install_rom_capsule(space_program, 0x4000, m_caps1_rom); break; |
| 495 | case 0x0a: install_rom_capsule(space_program, 0x8000, m_caps1_rom); break; |
| 496 | case 0x0c: install_rom_capsule(space_program, 0x2000, m_caps2_rom); break; |
| 497 | case 0x0d: install_rom_capsule(space_program, 0x4000, m_caps2_rom); break; |
| 498 | case 0x0e: install_rom_capsule(space_program, 0x8000, m_caps2_rom); break; |
| 488 | 499 | |
| 489 | 500 | default: |
| 490 | 501 | if (VERBOSE) |
| r32373 | r32374 | |
| 1036 | 1047 | else if (m_ramdisk_address < 0x40000) |
| 1037 | 1048 | { |
| 1038 | 1049 | // read from rom |
| 1039 | | ret = memregion("ramdisk")->base()[m_ramdisk_address]; |
| 1050 | ret = m_rdsocket->read_rom(space, m_ramdisk_address); |
| 1040 | 1051 | } |
| 1041 | 1052 | |
| 1042 | 1053 | m_ramdisk_address = (m_ramdisk_address & 0xffff00) | ((m_ramdisk_address & 0xff) + 1); |
| r32373 | r32374 | |
| 1124 | 1135 | m_ramdisk = auto_alloc_array(machine(), UINT8, 0x20000); |
| 1125 | 1136 | } |
| 1126 | 1137 | |
| 1138 | void px4_state::machine_start() |
| 1139 | { |
| 1140 | astring region_tag; |
| 1141 | m_caps1_rom = memregion(region_tag.cpy(m_caps1->tag()).cat(GENERIC_ROM_REGION_TAG)); |
| 1142 | m_caps2_rom = memregion(region_tag.cpy(m_caps2->tag()).cat(GENERIC_ROM_REGION_TAG)); |
| 1143 | } |
| 1144 | |
| 1127 | 1145 | void px4_state::machine_reset() |
| 1128 | 1146 | { |
| 1129 | 1147 | m_artsr = ART_TXRDY | ART_TXEMPTY; |
| r32373 | r32374 | |
| 1133 | 1151 | |
| 1134 | 1152 | MACHINE_START_MEMBER( px4_state, px4_ramdisk ) |
| 1135 | 1153 | { |
| 1154 | px4_state::machine_start(); |
| 1136 | 1155 | machine().device<nvram_device>("nvram")->set_base(m_ramdisk, 0x20000); |
| 1137 | 1156 | } |
| 1138 | 1157 | |
| r32373 | r32374 | |
| 1416 | 1435 | MCFG_RS232_CTS_HANDLER(WRITELINE(px4_state, rs232_cts_w)) |
| 1417 | 1436 | |
| 1418 | 1437 | // rom capsules |
| 1419 | | MCFG_CARTSLOT_ADD("capsule1") |
| 1420 | | MCFG_CARTSLOT_EXTENSION_LIST("bin") |
| 1421 | | MCFG_CARTSLOT_INTERFACE("px4_cart") |
| 1422 | | MCFG_CARTSLOT_NOT_MANDATORY |
| 1438 | MCFG_GENERIC_CARTSLOT_ADD("capsule1", generic_plain_slot, "px4_cart") |
| 1439 | MCFG_GENERIC_CARTSLOT_ADD("capsule2", generic_plain_slot, "px4_cart") |
| 1423 | 1440 | |
| 1424 | | MCFG_CARTSLOT_ADD("capsule2") |
| 1425 | | MCFG_CARTSLOT_EXTENSION_LIST("bin") |
| 1426 | | MCFG_CARTSLOT_INTERFACE("px4_cart") |
| 1427 | | MCFG_CARTSLOT_NOT_MANDATORY |
| 1428 | | |
| 1429 | 1441 | // software list |
| 1430 | 1442 | MCFG_SOFTWARE_LIST_ADD("cart_list", "px4_cart") |
| 1431 | 1443 | MACHINE_CONFIG_END |
| r32373 | r32374 | |
| 1440 | 1452 | MCFG_PALETTE_MODIFY("palette") |
| 1441 | 1453 | MCFG_PALETTE_INIT_OWNER(px4_state, px4p) |
| 1442 | 1454 | |
| 1443 | | MCFG_CARTSLOT_ADD("ramdisk") |
| 1444 | | MCFG_CARTSLOT_NOT_MANDATORY |
| 1455 | MCFG_GENERIC_CARTSLOT_ADD("ramdisk_socket", generic_plain_slot, "px4_cart") |
| 1445 | 1456 | MACHINE_CONFIG_END |
| 1446 | 1457 | |
| 1447 | 1458 | |
| r32373 | r32374 | |
| 1457 | 1468 | |
| 1458 | 1469 | ROM_REGION(0x1000, "slave", 0) |
| 1459 | 1470 | ROM_LOAD("upd7508.bin", 0x0000, 0x1000, NO_DUMP) |
| 1460 | | |
| 1461 | | ROM_REGION(0x8000, "capsule1", 0) |
| 1462 | | ROM_CART_LOAD("capsule1", 0x0000, 0x8000, ROM_OPTIONAL) |
| 1463 | | |
| 1464 | | ROM_REGION(0x8000, "capsule2", 0) |
| 1465 | | ROM_CART_LOAD("capsule2", 0x0000, 0x8000, ROM_OPTIONAL) |
| 1466 | 1471 | ROM_END |
| 1467 | 1472 | |
| 1468 | 1473 | ROM_START( px4p ) |
| r32373 | r32374 | |
| 1471 | 1476 | |
| 1472 | 1477 | ROM_REGION(0x1000, "slave", 0) |
| 1473 | 1478 | ROM_LOAD("upd7508.bin", 0x0000, 0x1000, NO_DUMP) |
| 1474 | | |
| 1475 | | ROM_REGION(0x8000, "capsule1", 0) |
| 1476 | | ROM_CART_LOAD("capsule1", 0x0000, 0x8000, ROM_OPTIONAL) |
| 1477 | | |
| 1478 | | ROM_REGION(0x8000, "capsule2", 0) |
| 1479 | | ROM_CART_LOAD("capsule2", 0x0000, 0x8000, ROM_OPTIONAL) |
| 1480 | | |
| 1481 | | ROM_REGION(0x20000, "ramdisk", 0) |
| 1482 | | ROM_CART_LOAD("ramdisk", 0x0000, 0x20000, ROM_OPTIONAL | ROM_MIRROR) |
| 1483 | 1479 | ROM_END |
| 1484 | 1480 | |
| 1485 | 1481 | |