trunk/src/mame/drivers/ghosteo.c
| r26673 | r26674 | |
| 60 | 60 | #include "machine/s3c2410.h" |
| 61 | 61 | //#include "machine/smartmed.h" |
| 62 | 62 | #include "machine/i2cmem.h" |
| 63 | #include "sound/qs1000.h" |
| 63 | 64 | |
| 64 | 65 | #define NAND_LOG 0 |
| 65 | 66 | |
| r26673 | r26674 | |
| 83 | 84 | public: |
| 84 | 85 | ghosteo_state(const machine_config &mconfig, device_type type, const char *tag) |
| 85 | 86 | : driver_device(mconfig, type, tag), |
| 86 | | m_system_memory(*this, "systememory"), |
| 87 | m_maincpu(*this, "maincpu") , |
| 87 | 88 | m_i2cmem(*this, "i2cmem"), |
| 88 | 89 | m_s3c2410(*this, "s3c2410"), |
| 89 | | m_maincpu(*this, "maincpu") { } |
| 90 | m_system_memory(*this, "systememory") { } |
| 90 | 91 | |
| 92 | required_device<cpu_device> m_maincpu; |
| 93 | required_device<i2cmem_device> m_i2cmem; |
| 94 | required_device<s3c2410_device> m_s3c2410; |
| 91 | 95 | required_shared_ptr<UINT32> m_system_memory; |
| 92 | | required_device<i2cmem_device> m_i2cmem; |
| 93 | | |
| 96 | |
| 94 | 97 | int m_security_count; |
| 95 | 98 | UINT32 m_bballoon_port[20]; |
| 96 | 99 | struct nand_t m_nand; |
| 97 | | DECLARE_WRITE32_MEMBER(sound_w); |
| 98 | 100 | DECLARE_READ32_MEMBER(bballoon_speedup_r); |
| 99 | 101 | DECLARE_READ32_MEMBER(touryuu_port_10000000_r); |
| 102 | DECLARE_WRITE32_MEMBER(soundlatch_w); |
| 100 | 103 | |
| 104 | DECLARE_READ8_MEMBER(qs1000_p1_r); |
| 105 | |
| 106 | DECLARE_WRITE8_MEMBER(qs1000_p1_w); |
| 107 | DECLARE_WRITE8_MEMBER(qs1000_p2_w); |
| 108 | DECLARE_WRITE8_MEMBER(qs1000_p3_w); |
| 109 | |
| 101 | 110 | int m_rom_pagesize; |
| 102 | 111 | UINT8* m_flash; |
| 103 | | required_device<s3c2410_device> m_s3c2410; |
| 104 | 112 | DECLARE_DRIVER_INIT(touryuu); |
| 105 | 113 | DECLARE_DRIVER_INIT(bballoon); |
| 106 | 114 | virtual void machine_start(); |
| 107 | 115 | virtual void machine_reset(); |
| 108 | | required_device<cpu_device> m_maincpu; |
| 109 | 116 | DECLARE_READ32_MEMBER(s3c2410_gpio_port_r); |
| 110 | 117 | DECLARE_WRITE32_MEMBER(s3c2410_gpio_port_w); |
| 111 | 118 | DECLARE_READ32_MEMBER(s3c2410_core_pin_r); |
| r26673 | r26674 | |
| 143 | 150 | 24-ch external interrupts Controller (Wake-up source 16-ch) |
| 144 | 151 | */ |
| 145 | 152 | |
| 153 | READ8_MEMBER( ghosteo_state::qs1000_p1_r ) |
| 154 | { |
| 155 | return soundlatch_byte_r(space, 0); |
| 156 | } |
| 157 | |
| 158 | WRITE8_MEMBER( ghosteo_state::qs1000_p1_w ) |
| 159 | { |
| 160 | } |
| 161 | |
| 162 | WRITE8_MEMBER( ghosteo_state::qs1000_p2_w ) |
| 163 | { |
| 164 | } |
| 165 | |
| 166 | WRITE8_MEMBER( ghosteo_state::qs1000_p3_w ) |
| 167 | { |
| 168 | // .... .xxx - Data ROM bank (64kB) |
| 169 | // ...x .... - ? |
| 170 | // ..x. .... - /IRQ clear |
| 171 | |
| 172 | qs1000_device *qs1000 = machine().device<qs1000_device>("qs1000"); |
| 173 | |
| 174 | membank("qs1000:bank")->set_entry(data & 0x07); |
| 175 | |
| 176 | if (!BIT(data, 5)) |
| 177 | qs1000->set_irq(CLEAR_LINE); |
| 178 | } |
| 179 | |
| 180 | |
| 146 | 181 | // GPIO |
| 147 | 182 | |
| 148 | 183 | static const UINT8 security_data[] = { 0x01, 0xC4, 0xFF, 0x22, 0xFF, 0xFF, 0xFF, 0xFF }; |
| r26673 | r26674 | |
| 363 | 398 | m_i2cmem->write_sda(state); |
| 364 | 399 | } |
| 365 | 400 | |
| 366 | | WRITE32_MEMBER(ghosteo_state::sound_w) |
| 367 | | { |
| 368 | | if ((data >= 0x20) && (data <= 0x7F)) |
| 369 | | { |
| 370 | | logerror( "sound_w: music %d\n", data - 0x20); |
| 371 | | } |
| 372 | | else if ((data >= 0x80) && (data <= 0xFF)) |
| 373 | | { |
| 374 | | logerror( "sound_w: effect %d\n", data - 0x80); |
| 375 | | } |
| 376 | | else |
| 377 | | { |
| 378 | | logerror( "sound_w: unknown (%d)\n", data); |
| 379 | | } |
| 380 | | } |
| 381 | | |
| 382 | 401 | READ32_MEMBER( ghosteo_state::touryuu_port_10000000_r ) |
| 383 | 402 | { |
| 384 | 403 | UINT32 port_g = m_bballoon_port[S3C2410_GPIO_PORT_G]; |
| r26673 | r26674 | |
| 400 | 419 | AM_RANGE(0x10000000, 0x10000003) AM_READ_PORT("10000000") |
| 401 | 420 | AM_RANGE(0x10100000, 0x10100003) AM_READ_PORT("10100000") |
| 402 | 421 | AM_RANGE(0x10200000, 0x10200003) AM_READ_PORT("10200000") |
| 403 | | AM_RANGE(0x10300000, 0x10300003) AM_WRITE(sound_w) |
| 422 | AM_RANGE(0x10300000, 0x10300003) AM_WRITE(soundlatch_w) |
| 404 | 423 | AM_RANGE(0x30000000, 0x31ffffff) AM_RAM AM_SHARE("systememory") AM_MIRROR(0x02000000) |
| 405 | 424 | ADDRESS_MAP_END |
| 406 | 425 | |
| r26673 | r26674 | |
| 408 | 427 | AM_RANGE(0x10000000, 0x10000003) AM_READ(touryuu_port_10000000_r) |
| 409 | 428 | AM_RANGE(0x10100000, 0x10100003) AM_READ_PORT("10100000") |
| 410 | 429 | AM_RANGE(0x10200000, 0x10200003) AM_READ_PORT("10200000") |
| 411 | | AM_RANGE(0x10300000, 0x10300003) AM_WRITE(sound_w) |
| 430 | AM_RANGE(0x10300000, 0x10300003) AM_WRITE(soundlatch_w) |
| 412 | 431 | AM_RANGE(0x30000000, 0x31ffffff) AM_RAM AM_SHARE("systememory") AM_MIRROR(0x02000000) |
| 413 | 432 | ADDRESS_MAP_END |
| 414 | 433 | |
| r26673 | r26674 | |
| 582 | 601 | return ret; |
| 583 | 602 | } |
| 584 | 603 | |
| 604 | WRITE32_MEMBER(ghosteo_state::soundlatch_w) |
| 605 | { |
| 606 | qs1000_device *qs1000 = space.machine().device<qs1000_device>("qs1000"); |
| 607 | |
| 608 | soundlatch_byte_w(space, 0, data); |
| 609 | qs1000->set_irq(ASSERT_LINE); |
| 610 | |
| 611 | machine().scheduler().boost_interleave(attotime::zero, attotime::from_usec(100)); |
| 612 | } |
| 613 | |
| 585 | 614 | void ghosteo_state::machine_start() |
| 586 | 615 | { |
| 587 | 616 | m_flash = (UINT8 *)memregion( "user1")->base(); |
| 617 | |
| 618 | // Set up the QS1000 program ROM banking, taking care not to overlap the internal RAM |
| 619 | machine().device("qs1000:cpu")->memory().space(AS_IO).install_read_bank(0x0100, 0xffff, "bank"); |
| 620 | membank("qs1000:bank")->configure_entries(0, 8, memregion("qs1000:cpu")->base()+0x100, 0x10000); |
| 588 | 621 | } |
| 589 | 622 | |
| 590 | 623 | void ghosteo_state::machine_reset() |
| r26673 | r26674 | |
| 592 | 625 | m_maincpu->space(AS_PROGRAM).install_read_handler(0x4d000010, 0x4d000013,read32_delegate(FUNC(ghosteo_state::bballoon_speedup_r), this)); |
| 593 | 626 | } |
| 594 | 627 | |
| 628 | static QS1000_INTERFACE( qs1000_intf ) |
| 629 | { |
| 630 | /* External ROM */ |
| 631 | true, |
| 632 | |
| 633 | /* P1-P3 read handlers */ |
| 634 | DEVCB_DRIVER_MEMBER(ghosteo_state, qs1000_p1_r), |
| 635 | DEVCB_NULL, |
| 636 | DEVCB_NULL, |
| 637 | |
| 638 | /* P1-P3 write handlers */ |
| 639 | DEVCB_DRIVER_MEMBER(ghosteo_state, qs1000_p1_w), |
| 640 | DEVCB_DRIVER_MEMBER(ghosteo_state, qs1000_p2_w), |
| 641 | DEVCB_DRIVER_MEMBER(ghosteo_state, qs1000_p3_w) |
| 642 | }; |
| 643 | |
| 595 | 644 | static MACHINE_CONFIG_START( ghosteo, ghosteo_state ) |
| 596 | 645 | |
| 597 | 646 | /* basic machine hardware */ |
| r26673 | r26674 | |
| 615 | 664 | // MCFG_I2CMEM_ADD("i2cmem", 0xA0, 0, 0x100, NULL) |
| 616 | 665 | |
| 617 | 666 | /* sound hardware */ |
| 667 | MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") |
| 668 | |
| 669 | MCFG_QS1000_ADD("qs1000", XTAL_24MHz, qs1000_intf) |
| 670 | MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) |
| 671 | MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) |
| 618 | 672 | MACHINE_CONFIG_END |
| 619 | 673 | |
| 620 | 674 | static MACHINE_CONFIG_DERIVED( bballoon, ghosteo ) |
| r26673 | r26674 | |
| 682 | 736 | ROM_LOAD( "flash.u1", 0x000000, 0x2000000, BAD_DUMP CRC(73285634) SHA1(4d0210c1bebdf3113a99978ffbcd77d6ee854168) ) // missing ECC data |
| 683 | 737 | |
| 684 | 738 | // banked every 0x10000 bytes ? |
| 685 | | ROM_REGION( 0x080000, "user2", 0 ) |
| 739 | ROM_REGION( 0x080000, "qs1000:cpu", 0 ) |
| 686 | 740 | ROM_LOAD( "b2.u20", 0x000000, 0x080000, CRC(0a12334c) SHA1(535b5b34f28435517218100d70147d87809f485a) ) |
| 687 | 741 | |
| 688 | | ROM_REGION( 0x100000, "sfx", 0 ) /* QDSP samples (SFX) */ |
| 689 | | ROM_LOAD( "b1.u16", 0x000000, 0x100000, CRC(c42c1c85) SHA1(e1f49d556ffd6bc27142a7784c3bb8e37999857d) ) |
| 690 | | |
| 691 | | ROM_REGION( 0x080000, "wavetable", 0 ) /* QDSP wavetable rom */ |
| 692 | | ROM_LOAD( "qs1001a.u17", 0x000000, 0x80000, CRC(d13c6407) SHA1(57b14f97c7d4f9b5d9745d3571a0b7115fbe3176) ) |
| 742 | ROM_REGION( 0x1000000, "qs1000", 0 ) |
| 743 | ROM_LOAD( "b1.u16", 0x000000, 0x100000, CRC(c42c1c85) SHA1(e1f49d556ffd6bc27142a7784c3bb8e37999857d) ) /* QDSP samples (SFX) */ |
| 744 | ROM_LOAD( "qs1001a.u17", 0x200000, 0x080000, CRC(d13c6407) SHA1(57b14f97c7d4f9b5d9745d3571a0b7115fbe3176) ) /* QDSP wavetable rom */ |
| 693 | 745 | ROM_END |
| 694 | 746 | |
| 695 | 747 | ROM_START( hapytour ) /* Same hardware: GHOST Ver1.1 2003.03.28 */ |
| r26673 | r26674 | |
| 697 | 749 | ROM_LOAD( "flash.u1", 0x000000, 0x2000000, BAD_DUMP CRC(49deb7f9) SHA1(708a27d7177cf6261a49ded975c2bbb6c2427742) ) // missing ECC data |
| 698 | 750 | |
| 699 | 751 | // banked every 0x10000 bytes ? |
| 700 | | ROM_REGION( 0x080000, "user2", 0 ) |
| 752 | ROM_REGION( 0x080000, "qs1000:cpu", 0 ) |
| 701 | 753 | ROM_LOAD( "ht.u20", 0x000000, 0x080000, CRC(c0581fce) SHA1(dafce679002534ffabed249a92e6b83301b8312b) ) |
| 702 | 754 | |
| 703 | | ROM_REGION( 0x100000, "sfx", 0 ) /* QDSP samples (SFX) */ |
| 704 | | ROM_LOAD( "ht.u16", 0x000000, 0x100000, CRC(6a590a3a) SHA1(c1140f70c919661162334db66c6aa0ad656bfc47) ) |
| 705 | | |
| 706 | | ROM_REGION( 0x080000, "wavetable", 0 ) /* QDSP wavetable rom */ |
| 707 | | ROM_LOAD( "qs1001a.u17", 0x000000, 0x80000, CRC(d13c6407) SHA1(57b14f97c7d4f9b5d9745d3571a0b7115fbe3176) ) |
| 755 | ROM_REGION( 0x1000000, "qs1000", 0 ) |
| 756 | ROM_LOAD( "ht.u16", 0x000000, 0x100000, CRC(6a590a3a) SHA1(c1140f70c919661162334db66c6aa0ad656bfc47) ) /* QDSP samples (SFX) */ |
| 757 | ROM_LOAD( "qs1001a.u17", 0x200000, 0x080000, CRC(d13c6407) SHA1(57b14f97c7d4f9b5d9745d3571a0b7115fbe3176) ) /* QDSP wavetable rom */ |
| 708 | 758 | ROM_END |
| 709 | 759 | |
| 710 | 760 | |
| r26673 | r26674 | |
| 713 | 763 | ROM_LOAD( "u1.bin", 0x000000, 0x4200000, CRC(49b6856e) SHA1(639123d2fabac4e79c9315fb87f72b13f9ae8761) ) |
| 714 | 764 | |
| 715 | 765 | // banked every 0x10000 bytes ? |
| 716 | | ROM_REGION( 0x080000, "user2", 0 ) |
| 766 | ROM_REGION( 0x080000, "qs1000:cpu", 0 ) |
| 717 | 767 | ROM_LOAD( "4m.eeprom_c.s(bad1h).u20", 0x000000, 0x080000, CRC(f81a6530) SHA1(c7fa412102328d06823e73d7d07cadfc25db6d28) ) |
| 718 | 768 | |
| 719 | | ROM_REGION( 0x100000, "sfx", 0 ) /* QDSP samples (SFX) */ |
| 720 | | ROM_LOAD( "8m.eprom_c.s(f8b1h).u16", 0x000000, 0x100000, CRC(238a85ab) SHA1(ddd79429c0c1e67fcbca1e4ebded97ea46229f0b) ) |
| 721 | | |
| 722 | | ROM_REGION( 0x080000, "wavetable", 0 ) /* QDSP wavetable rom */ |
| 723 | | ROM_LOAD( "qs1001a.u17", 0x000000, 0x80000, CRC(d13c6407) SHA1(57b14f97c7d4f9b5d9745d3571a0b7115fbe3176) ) |
| 769 | ROM_REGION( 0x1000000, "qs1000", 0 ) |
| 770 | ROM_LOAD( "8m.eprom_c.s(f8b1h).u16", 0x000000, 0x100000, CRC(238a85ab) SHA1(ddd79429c0c1e67fcbca1e4ebded97ea46229f0b) ) /* QDSP samples (SFX) */ |
| 771 | ROM_LOAD( "qs1001a.u17", 0x200000, 0x080000, CRC(d13c6407) SHA1(57b14f97c7d4f9b5d9745d3571a0b7115fbe3176) ) /* QDSP wavetable rom */ |
| 724 | 772 | ROM_END |
| 725 | 773 | |
| 726 | 774 | DRIVER_INIT_MEMBER(ghosteo_state,bballoon) |
| r26673 | r26674 | |
| 733 | 781 | m_rom_pagesize = 0x210; |
| 734 | 782 | } |
| 735 | 783 | |
| 736 | | GAME( 2003, bballoon, 0, bballoon, bballoon, ghosteo_state, bballoon, ROT0, "Eolith", "BnB Arcade", GAME_NO_SOUND ) |
| 737 | | GAME( 2005, hapytour, 0, bballoon, bballoon, ghosteo_state, bballoon, ROT0, "GAV Company", "Happy Tour", GAME_NO_SOUND ) |
| 738 | | GAME( 2005, touryuu, 0, touryuu, touryuu, ghosteo_state, touryuu, ROT0, "Yuki Enterprise", "Touryuumon (V1.1)?", GAME_NO_SOUND ) // On first boot inputs won't work, TODO: hook-up default eeprom |
| 784 | GAME( 2003, bballoon, 0, bballoon, bballoon, ghosteo_state, bballoon, ROT0, "Eolith", "BnB Arcade", GAME_IMPERFECT_SOUND ) |
| 785 | GAME( 2005, hapytour, 0, bballoon, bballoon, ghosteo_state, bballoon, ROT0, "GAV Company", "Happy Tour", GAME_IMPERFECT_SOUND ) |
| 786 | GAME( 2005, touryuu, 0, touryuu, touryuu, ghosteo_state, touryuu, ROT0, "Yuki Enterprise", "Touryuumon (V1.1)?", GAME_IMPERFECT_SOUND ) // On first boot inputs won't work, TODO: hook-up default eeprom |