summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/pengadvb.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/pengadvb.cpp')
-rw-r--r--src/mame/drivers/pengadvb.cpp319
1 files changed, 0 insertions, 319 deletions
diff --git a/src/mame/drivers/pengadvb.cpp b/src/mame/drivers/pengadvb.cpp
deleted file mode 100644
index efc6dd434c5..00000000000
--- a/src/mame/drivers/pengadvb.cpp
+++ /dev/null
@@ -1,319 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Mariusz Wojcieszek, hap
-/***************************************************************************
-
-Penguin Adventure bootleg (tagged 'Screen', 1988)
-Original release was on MSX, by Konami in 1986. There is no official arcade release of this game.
-
-Driver by Mariusz Wojcieszek
-
-This seems to be the MSX version hacked to run on cheap Korean(?) bootleg hardware.
-Bosses are at wrong stages when compared to the original, probably to make the game more
-difficult early on. This is also the cause of some gfx glitches when reaching a boss.
-
-Basic components include.....
-Z80 @ 3.579533MHz [10.7386/3]
-TMS9128 @ 10.7386MHz
-AY-3-8910 @ 1.789766MHz [10.7386/6]
-8255
-4416 RAM x2
-4164 RAM x8
-10.7386 XTAL
-10 position DIPSW
-NOTE! switches 1, 3 & 5 must be ON or the game will not boot.
-
-TODO:
-- A timer apparently expires when beating stage 4 (signalled by a long beeping sound).
- Player needs to insert another credit and press start button (?) in order to continue.
- Is this timer supposed to be shown on screen or there are additional 7-LEDs not handled?
-
-***************************************************************************/
-
-#include "emu.h"
-#include "cpu/z80/z80.h"
-#include "video/tms9928a.h"
-#include "sound/ay8910.h"
-#include "machine/i8255.h"
-#include "machine/bankdev.h"
-#include "screen.h"
-#include "speaker.h"
-
-
-class pengadvb_state : public driver_device
-{
-public:
- pengadvb_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag)
- , m_maincpu(*this, "maincpu")
- , m_page(*this, "page%u", 0U)
- , m_bank(*this, "bank%u", 0U)
- { }
-
- void pengadvb(machine_config &config);
-
- void init_pengadvb();
-
-private:
- uint8_t mem_r(offs_t offset);
- void mem_w(offs_t offset, uint8_t data);
- void megarom_bank_w(offs_t offset, uint8_t data);
-
- void psg_port_b_w(uint8_t data);
- uint8_t ppi_port_a_r();
- void ppi_port_a_w(uint8_t data);
- uint8_t ppi_port_b_r();
- void ppi_port_c_w(uint8_t data);
-
- virtual void machine_start() override;
- virtual void machine_reset() override;
- void pengadvb_decrypt(const char* region);
- void bank_mem(address_map &map);
- void io_mem(address_map &map);
- void program_mem(address_map &map);
-
- required_device<cpu_device> m_maincpu;
- required_device_array<address_map_bank_device, 4> m_page;
- required_memory_bank_array<4> m_bank;
-
- uint8_t m_primary_slot_reg;
- uint8_t m_kb_matrix_row;
-};
-
-
-/***************************************************************************
-
- Z80 Memory map
-
-***************************************************************************/
-
-uint8_t pengadvb_state::mem_r(offs_t offset)
-{
- return m_page[offset >> 14 & 3]->read8(offset);
-}
-
-void pengadvb_state::mem_w(offs_t offset, uint8_t data)
-{
- m_page[offset >> 14 & 3]->write8(offset, data);
-}
-
-void pengadvb_state::megarom_bank_w(offs_t offset, uint8_t data)
-{
- m_bank[offset >> 13 & 3]->set_entry(data & 0xf);
-}
-
-void pengadvb_state::program_mem(address_map &map)
-{
- map(0x0000, 0xffff).rw(FUNC(pengadvb_state::mem_r), FUNC(pengadvb_state::mem_w)); // 4 pages of 16KB
-}
-
-void pengadvb_state::bank_mem(address_map &map)
-{
- // slot 0, MSX BIOS
- map(0x00000, 0x07fff).rom().region("maincpu", 0);
-
- // slot 1, MegaROM
- map(0x14000, 0x15fff).bankr("bank0");
- map(0x16000, 0x17fff).bankr("bank1");
- map(0x18000, 0x19fff).bankr("bank2");
- map(0x1a000, 0x1bfff).bankr("bank3");
- map(0x14000, 0x1bfff).w(FUNC(pengadvb_state::megarom_bank_w));
-
- // slot 3, 16KB RAM
- map(0x3c000, 0x3ffff).ram();
-}
-
-void pengadvb_state::io_mem(address_map &map)
-{
- map.unmap_value_high();
- map.global_mask(0xff);
- map(0x98, 0x99).rw("tms9128", FUNC(tms9128_device::read), FUNC(tms9128_device::write));
- map(0xa0, 0xa1).w("aysnd", FUNC(ay8910_device::address_data_w));
- map(0xa2, 0xa2).r("aysnd", FUNC(ay8910_device::data_r));
- map(0xa8, 0xab).rw("ppi8255", FUNC(i8255_device::read), FUNC(i8255_device::write));
-}
-
-
-/***************************************************************************
-
- Inputs
-
-***************************************************************************/
-
-static INPUT_PORTS_START( pengadvb )
- PORT_START("IN0")
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP )
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN )
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT )
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT )
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_BUTTON1 )
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_BUTTON2 )
- PORT_BIT(0xc0, IP_ACTIVE_LOW, IPT_UNUSED )
-
- PORT_START("IN1")
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(1)
- // bit 1 is also tested, unknown purpose.
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_START1 )
- PORT_BIT(0xee, IP_ACTIVE_LOW, IPT_UNUSED )
-INPUT_PORTS_END
-
-
-/***************************************************************************
-
- IC Interfaces
-
-***************************************************************************/
-
-// AY8910
-void pengadvb_state::psg_port_b_w(uint8_t data)
-{
- // leftover from msx ver?
-}
-
-/**************************************************************************/
-
-// I8255
-uint8_t pengadvb_state::ppi_port_a_r()
-{
- return m_primary_slot_reg;
-}
-
-void pengadvb_state::ppi_port_a_w(uint8_t data)
-{
- if (data != m_primary_slot_reg)
- {
- for (int i = 0; i < 4; i++)
- m_page[i]->set_bank(data >> (i * 2) & 3);
-
- m_primary_slot_reg = data;
- }
-}
-
-uint8_t pengadvb_state::ppi_port_b_r()
-{
- // TODO: dipswitch
- switch (m_kb_matrix_row)
- {
- case 0x0:
- return ioport("IN1")->read();
-
- default:
- break;
- }
-
- return 0xff;
-}
-
-void pengadvb_state::ppi_port_c_w(uint8_t data)
-{
- m_kb_matrix_row = data & 0x0f;
-}
-
-/***************************************************************************
-
- Machine config(s)
-
-***************************************************************************/
-
-void pengadvb_state::pengadvb(machine_config &config)
-{ /* basic machine hardware */
- Z80(config, m_maincpu, XTAL(10'738'635)/3);
- m_maincpu->set_addrmap(AS_PROGRAM, &pengadvb_state::program_mem);
- m_maincpu->set_addrmap(AS_IO, &pengadvb_state::io_mem);
-
- ADDRESS_MAP_BANK(config, "page0").set_map(&pengadvb_state::bank_mem).set_options(ENDIANNESS_LITTLE, 8, 18, 0x10000);
- ADDRESS_MAP_BANK(config, "page1").set_map(&pengadvb_state::bank_mem).set_options(ENDIANNESS_LITTLE, 8, 18, 0x10000);
- ADDRESS_MAP_BANK(config, "page2").set_map(&pengadvb_state::bank_mem).set_options(ENDIANNESS_LITTLE, 8, 18, 0x10000);
- ADDRESS_MAP_BANK(config, "page3").set_map(&pengadvb_state::bank_mem).set_options(ENDIANNESS_LITTLE, 8, 18, 0x10000);
-
- i8255_device &ppi(I8255(config, "ppi8255"));
- ppi.in_pa_callback().set(FUNC(pengadvb_state::ppi_port_a_r));
- ppi.out_pa_callback().set(FUNC(pengadvb_state::ppi_port_a_w));
- ppi.in_pb_callback().set(FUNC(pengadvb_state::ppi_port_b_r));
- ppi.out_pc_callback().set(FUNC(pengadvb_state::ppi_port_c_w));
-
- /* video hardware */
- tms9128_device &vdp(TMS9128(config, "tms9128", XTAL(10'738'635)));
- vdp.set_screen("screen");
- vdp.set_vram_size(0x4000);
- vdp.int_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
- SCREEN(config, "screen", SCREEN_TYPE_RASTER);
-
- /* sound hardware */
- SPEAKER(config, "mono").front_center();
- ay8910_device &aysnd(AY8910(config, "aysnd", XTAL(10'738'635)/6));
- aysnd.port_a_read_callback().set_ioport("IN0");
- aysnd.port_b_write_callback().set(FUNC(pengadvb_state::psg_port_b_w));
- aysnd.add_route(ALL_OUTPUTS, "mono", 0.50);
-}
-
-
-/***************************************************************************
-
- Machine start/init
-
-***************************************************************************/
-
-void pengadvb_state::machine_start()
-{
- save_item(NAME(m_primary_slot_reg));
- save_item(NAME(m_kb_matrix_row));
-}
-
-void pengadvb_state::machine_reset()
-{
- m_primary_slot_reg = 0;
- m_kb_matrix_row = 0;
-
- for (int i = 0; i < 4; i++)
- {
- m_page[i]->set_bank(0);
- m_bank[i]->set_entry(i);
- }
-}
-
-void pengadvb_state::pengadvb_decrypt(const char* region)
-{
- uint8_t *mem = memregion(region)->base();
- uint32_t memsize = memregion(region)->bytes();
-
- // data lines swap
- for (int i = 0; i < memsize; i++)
- mem[i] = bitswap<8>(mem[i],7,6,5,3,4,2,1,0);
-
- // address line swap
- std::vector<uint8_t> buf(memsize);
- memcpy(&buf[0], mem, memsize);
- for (int i = 0; i < memsize; i++)
- mem[i] = buf[bitswap<24>(i,23,22,21,20,19,18,17,16,15,14,13,5,11,10,9,8,7,6,12,4,3,2,1,0)];
-}
-
-void pengadvb_state::init_pengadvb()
-{
- pengadvb_decrypt("maincpu");
- pengadvb_decrypt("game");
-
- // init banks
- for (int i = 0; i < 4; i++)
- m_bank[i]->configure_entries(0, 0x10, memregion("game")->base(), 0x2000);
-}
-
-
-/***************************************************************************
-
- Game driver(s)
-
-***************************************************************************/
-
-ROM_START( pengadvb )
- ROM_REGION( 0x8000, "maincpu", 0 )
- ROM_LOAD( "rom.u5", 0x00000, 0x8000, CRC(d21950d2) SHA1(0b1815677f17a680ba63c3839bea2d451813eec8) )
-
- ROM_REGION( 0x20000, "game", 0 )
- ROM_LOAD( "rom.u7", 0x00000, 0x8000, CRC(d4b4a4a4) SHA1(59f9299182fd8aedc7a4e9b0ddd685f2a71c033f) )
- ROM_LOAD( "rom.u8", 0x08000, 0x8000, CRC(eada2232) SHA1(f4182f0921b621acd8be6077eb9639b31a97e907) )
- ROM_LOAD( "rom.u9", 0x10000, 0x8000, CRC(6478c561) SHA1(6f9a794a5bb51e96552f6d1e9fa6515659d25933) )
- ROM_LOAD( "rom.u10", 0x18000, 0x8000, CRC(5c48360f) SHA1(0866e20969f57b7b7c59df8f7ca203f18c7c9870) )
-ROM_END
-
-
-GAME( 1988, pengadvb, 0, pengadvb, pengadvb, pengadvb_state, init_pengadvb, ROT0, "bootleg (Screen) / Konami", "Penguin Adventure (bootleg of MSX version)", MACHINE_SUPPORTS_SAVE )