summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/popobear.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/popobear.cpp')
-rw-r--r--src/mame/drivers/popobear.cpp688
1 files changed, 0 insertions, 688 deletions
diff --git a/src/mame/drivers/popobear.cpp b/src/mame/drivers/popobear.cpp
deleted file mode 100644
index 7113cf2a8ab..00000000000
--- a/src/mame/drivers/popobear.cpp
+++ /dev/null
@@ -1,688 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Angelo Salese, David Haywood
-/*******************************************************************************************
-
- Popo Bear (c) 2000 BMC
-
- driver by Angelo Salese, David Haywood
-
- TODO:
- - auto-animation speed is erratic (way too fast);
- - BGM seems quite off, YM2413 core bug?
- - IRQ generation;
- - all possible related to some timers?
-
-
- - I/Os;
- - Port 0x620000 is quite a mystery, some silly protection?
-
-============================================================================================
-Popo Bear - BMC-A00211
-(c) 2000 - Bao Ma Technology Co., LTD
-
-|-----------------------------------------|
-| DIP2 DIP4 UM3567(YM2413) |J
-| DIP1 DIP3 |A
-| TA-A-901 |M
-| EN-A-701 EN-A-801 U6295(OKI) |M
-| EN-A-501 EN-A-601 |A
-| EN-A-301 EN-A-401 |
-| |C
-| AIA90610 |O
-| BMC-68pin AIA90423 |N
-| plcc (68k) BMC-160pin |N
-| |E
-| OSC |C
-| 42.000 |T
-|-----------------------------------------|
-
-1 - BMC AIA90423 - 160-Pin ASIC, FGPA, Video?
-1 - BMC AIA90610 - 68 Pin CPU (Likely 16 MHz, 68-lead plastic LCC 68000)
-1 - UM3567 (YM2413) Sound
-1 - U6295 (OKI6295) Sound
-1 - 42.000MHz XTAL
-4 - 8 Position DIP switches
-
-JAMMA CONNECTOR
-Component Side A B Solder Side
- GND 1 1 GND
- GND 2 2 GND
- +5v 3 3 +5v
- +5v 4 4 +5v
- 5 5
- +12v 6 6 +12v
- 7 7
- Coin Meter 8 8
- 9 9
- Speaker 10 10 GND
- 11 11
- Red 12 12 Green
- Blue 13 13 Syn
- GND 14 14
- Test 15 15
- Coin1 16 16 Coin2
- 1P Start 17 17 2P Start
- 1P Up 18 18 2P Up
- 1P Down 19 19 2P Down
- 1P Left 20 20 2P Left
- 1P Right 21 21 2P Right
- 1P A 22 22 2P A
- 1P B 23 23 2P B
- 1P C 24 24 2P C
- 25 25
- 26 26
- GND 27 27 GND
- GND 28 28 GND
-*******************************************************************************************/
-
-
-
-#include "emu.h"
-#include "cpu/m68000/m68000.h"
-#include "machine/timer.h"
-#include "sound/okim6295.h"
-#include "sound/ym2413.h"
-#include "emupal.h"
-#include "screen.h"
-#include "speaker.h"
-#include "tilemap.h"
-
-class popobear_state : public driver_device
-{
-public:
- popobear_state(const machine_config &mconfig, device_type type, const char *tag) :
- driver_device(mconfig, type, tag),
- m_maincpu(*this,"maincpu"),
- m_gfxdecode(*this, "gfxdecode"),
- m_palette(*this, "palette"),
- m_spr(*this, "spr"),
- m_vram(*this, "vram"),
- m_vregs(*this, "vregs")
- {
- m_tilemap_base[0] = 0xf0000;
- m_tilemap_base[1] = 0xf4000;
- m_tilemap_base[2] = 0xf8000;
- m_tilemap_base[3] = 0xfc000;
- }
-
- void popobear(machine_config &config);
-
-private:
- required_device<cpu_device> m_maincpu;
- required_device<gfxdecode_device> m_gfxdecode;
- required_device<palette_device> m_palette;
-
- required_shared_ptr<uint16_t> m_spr;
- required_shared_ptr<uint16_t> m_vram;
- required_shared_ptr<uint16_t> m_vregs;
-
- std::vector<uint16_t> m_vram_rearranged;
- int m_tilemap_base[4];
- tilemap_t *m_bg_tilemap[4];
-
- TILE_GET_INFO_MEMBER(get_bg0_tile_info);
- TILE_GET_INFO_MEMBER(get_bg1_tile_info);
- TILE_GET_INFO_MEMBER(get_bg2_tile_info);
- TILE_GET_INFO_MEMBER(get_bg3_tile_info);
-
- DECLARE_READ8_MEMBER(_620000_r);
- DECLARE_WRITE8_MEMBER(irq_ack_w);
- DECLARE_WRITE16_MEMBER(vram_w);
-
- virtual void video_start() override;
- uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
- void draw_sprites(bitmap_ind16 &bitmap,const rectangle &cliprect);
-
- TIMER_DEVICE_CALLBACK_MEMBER(irq);
-
- void postload();
- void popobear_mem(address_map &map);
-};
-
-
-WRITE16_MEMBER(popobear_state::vram_w)
-{
- COMBINE_DATA(&m_vram[offset]);
-
- // the graphic data for the tiles is in a strange order, rearrange it so that we can use it as tiles..
- int swapped_offset = bitswap<32>(offset, /* unused bits */ 31,30,29,28,27,26,25,24,23,22,21,20,19, /* end unused bits */
-
- 18,17,16,15,14,13,12,
-
- 8,7,6,5,4,3,2,
-
- 11,10,9, /* y tile address bits */
-
- 1,0 /* x tile address bits */);
-
-
-
- COMBINE_DATA(&m_vram_rearranged[swapped_offset]);
- m_gfxdecode->gfx(0)->mark_dirty((swapped_offset)/32);
-
- // unfortunately tilemaps and tilegfx share the same ram so we're always dirty if we write to RAM
- m_bg_tilemap[0]->mark_all_dirty();
- m_bg_tilemap[1]->mark_all_dirty();
- m_bg_tilemap[2]->mark_all_dirty();
- m_bg_tilemap[3]->mark_all_dirty();
-}
-
-static const gfx_layout char_layout =
-{
- 8,8,
- RGN_FRAC(1,1),
- 8,
- { 0,1,2,3,4,5,6,7 },
- { STEP8(0, 8) },
- { STEP8(0, 64) },
- 8*64
-};
-
-GFXDECODE_START(gfx_popobear)
- GFXDECODE_RAM( "vram", 0, char_layout, 0, 1 )
-GFXDECODE_END
-
-TILE_GET_INFO_MEMBER(popobear_state::get_bg0_tile_info)
-{
- int base = m_tilemap_base[0];
- int tileno = m_vram[base/2 + tile_index];
- int flipyx = (tileno>>14);
- SET_TILE_INFO_MEMBER(0, tileno&0x3fff, 0, TILE_FLIPYX(flipyx));
-}
-
-TILE_GET_INFO_MEMBER(popobear_state::get_bg1_tile_info)
-{
- int base = m_tilemap_base[1];
- int tileno = m_vram[base/2 + tile_index];
- int flipyx = (tileno>>14);
- SET_TILE_INFO_MEMBER(0, tileno&0x3fff, 0, TILE_FLIPYX(flipyx));
-}
-
-TILE_GET_INFO_MEMBER(popobear_state::get_bg2_tile_info)
-{
- int base = m_tilemap_base[2];
- int tileno = m_vram[base/2 + tile_index];
- int flipyx = (tileno>>14);
- SET_TILE_INFO_MEMBER(0, tileno&0x3fff, 0, TILE_FLIPYX(flipyx));
-}
-
-TILE_GET_INFO_MEMBER(popobear_state::get_bg3_tile_info)
-{
- int base = m_tilemap_base[3];
- int tileno = m_vram[base/2 + tile_index];
- int flipyx = (tileno>>14);
- SET_TILE_INFO_MEMBER(0, tileno&0x3fff, 0, TILE_FLIPYX(flipyx));
-}
-
-
-void popobear_state::postload()
-{
- m_gfxdecode->gfx(0)->mark_all_dirty();
-}
-
-void popobear_state::video_start()
-{
- m_vram_rearranged.resize(0x100000 / 2);
-
- m_gfxdecode->gfx(0)->set_source(reinterpret_cast<uint8_t *>(&m_vram_rearranged[0]));
-
- m_bg_tilemap[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(popobear_state::get_bg0_tile_info),this), TILEMAP_SCAN_ROWS, 8, 8, 128, 64);
- m_bg_tilemap[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(popobear_state::get_bg1_tile_info),this), TILEMAP_SCAN_ROWS, 8, 8, 128, 64);
- m_bg_tilemap[2] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(popobear_state::get_bg2_tile_info),this), TILEMAP_SCAN_ROWS, 8, 8, 128, 64);
- m_bg_tilemap[3] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(popobear_state::get_bg3_tile_info),this), TILEMAP_SCAN_ROWS, 8, 8, 128, 64);
-
- m_bg_tilemap[0]->set_transparent_pen(0);
- m_bg_tilemap[1]->set_transparent_pen(0);
- m_bg_tilemap[2]->set_transparent_pen(0);
- m_bg_tilemap[3]->set_transparent_pen(0);
-
- save_item(NAME(m_vram_rearranged));
- machine().save().register_postload(save_prepost_delegate(FUNC(popobear_state::postload), this));
-}
-
-
-
-
-void popobear_state::draw_sprites(bitmap_ind16 &bitmap,const rectangle &cliprect)
-{
- uint8_t* vram = reinterpret_cast<uint8_t *>(m_spr.target());
- int i;
-
- /*
- ???? ---- ---- ---- unused?
- ---- xxxx ---- ---- priority (against other sprites! used to keep the line of characters following you in order)
- ---- ---- x--- ---- Y direction
- ---- ---- -x-- ---- X direction
- ---- ---- --xx ---- size (height & width)
- ---- ---- ---- xx-- color bank
- ---- ---- ---- --x- NOT set on the enemy character / characters in your line
- ---- ---- ---- ---x set on opposite to above?
- */
-
- for (int drawpri = 0xf;drawpri>=0x0;drawpri--)
- {
- /* 0x106 = 8 x 8 */
- /* 0x*29 = 32 x 32 */
- for(i = 0x800-8;i >= 0; i-=8)
- {
- uint16_t *sprdata = &m_spr[(0x7f800 + i) / 2];
-
- int param = sprdata[0];
- int pri = (param & 0x0f00)>>8;
-
- // we do this because it's sprite<->sprite priority,
- if (pri!=drawpri)
- continue;
-
- int y = sprdata[1];
- int x = sprdata[2];
- int spr_num = sprdata[3];
-
- int width = 8 << ((param & 0x30)>>4);
- int height = width; // sprites are always square?
-
- int color_bank = ((param & 0xc)>>2);
- int x_dir = param & 0x40;
- int y_dir = param & 0x80;
-
- if (x&0x8000) x-= 0x10000;
- if (y&0x8000) y-= 0x10000;
-
- if (param&0xf000) color_bank = (machine().rand() & 0x3);
-
-
-
- int add_it = 0;
-
- // this isn't understood, not enough evidence.
- switch (param & 3)
- {
- case 0x0: // not used?
- color_bank = (machine().rand() & 0x3);
- add_it = color_bank*0x40;
- break;
-
- case 0x1: // butterflies in intro, enemy characters, line of characters, stage start text
- //color_bank = (machine().rand() & 0x3);
- add_it = color_bank*0x40;
- break;
-
- case 0x2: // characters in intro, main player, powerups, timer, large dancing chars between levels (0x3f?)
- //color_bank = (machine().rand() & 0x3);
- add_it = color_bank*0x40;
- break;
-
- case 0x3: // letters on GAME OVER need this..
- add_it = color_bank*0x40;
- add_it += 0x20;
- break;
- }
-
- if(param == 0)
- continue;
-
-
- spr_num <<= 3;
-
- for(int yi=0;yi<height;yi++)
- {
- int y_draw = (y_dir) ? y+((height-1) - yi) : y+yi;
-
- for(int xi=0;xi<width;xi++)
- {
- uint8_t pix = vram[BYTE_XOR_BE(spr_num)];
- int x_draw = (x_dir) ? x+((width-1) - xi) : x+xi;
-
- if(cliprect.contains(x_draw, y_draw))
- {
- // this is a bit strange, pix data is basically 8-bit
- // but we have to treat 0x00, 0x40, 0x80, 0xc0 */
- // see scores when you colect an item, must be at least steps of 0x40 or one of the female panda gfx between levels breaks.. might depend on lower bits?
- // granularity also means colour bank is applied *0x40
- // and we have 2 more possible colour bank bits
- // colours on game over screen are still wrong without the weird param kludge above
- if (pix&0x3f)
- {
- bitmap.pix16(y_draw, x_draw) = m_palette->pen(((pix+(add_it))&0xff)+0x100);
- }
- }
-
- spr_num++;
- }
- }
- }
- }
-}
-
-uint32_t popobear_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
-{
- bitmap.fill(0, cliprect);
- int line;
- rectangle clip;
- int scrollbase;
- int scrollbase2;
-
- const rectangle &visarea = screen.visible_area();
- clip = visarea;
-
- //popmessage("%04x",m_vregs[0/2]);
- uint16_t* vreg = m_vregs;
-
-// popmessage("%04x %04x %04x %04x %04x %04x %04x - %04x - %04x %04x",vreg[0x00],vreg[0x01],vreg[0x02],vreg[0x03],vreg[0x04],vreg[0x05],vreg[0x06], vreg[0x0b],vreg[0x0e],vreg[0x0f]);
-
- // vreg[0x00] also looks like it could be some enable registers
- // 0x82ff - BMC logo
- // 0x8aff - some attract scenes (no sprites)
- // 0x8bff - game attract scense etc. (sprites)
-
- // vreg[0x01] is always
- // 0xfefb
-
-
-
- // these are more than just enable, they get written with 0x0d and 0x1f (and 0x00 when a layer is off)
- // seems to be related to the linescroll mode at least? maybe sizes?
- int enable0 = (m_vregs[0x0c] & 0xff00)>>8;
- int enable1 = (m_vregs[0x0c] & 0x00ff)>>0;
- int enable2 = (m_vregs[0x0d] & 0xff00)>>8;
- int enable3 = (m_vregs[0x0d] & 0x00ff)>>0;
-
- if ((enable0 != 0x00) && (enable0 != 0x0d) && (enable0 != 0x1f)) printf("unknown enable0 value %02x\n", enable0);
- if ((enable1 != 0x00) && (enable1 != 0x0d) && (enable1 != 0x1f)) printf("unknown enable1 value %02x\n", enable1);
- if ((enable2 != 0x00) && (enable2 != 0x0d)) printf("unknown enable2 value %02x\n", enable2);
- if ((enable3 != 0x00) && (enable3 != 0x0d)) printf("unknown enable3 value %02x\n", enable3);
-
-
- // the lower 2 tilemaps use regular scrolling
- m_bg_tilemap[2]->set_scrollx(0, vreg[0x07]);
- m_bg_tilemap[2]->set_scrolly(0, vreg[0x08]);
-
- m_bg_tilemap[3]->set_scrollx(0, vreg[0x09]);
- m_bg_tilemap[3]->set_scrolly(0, vreg[0x0a]);
-
- if (enable3) m_bg_tilemap[3]->draw(screen, bitmap, cliprect, 0, 0);
- if (enable2) m_bg_tilemap[2]->draw(screen, bitmap, cliprect, 0, 0);
-
- // the upper 2 tilemaps have a lineselect / linescroll logic
-
- if (enable1 == 0x1f)
- {
- scrollbase = 0xdf600;
- scrollbase2 = 0xdf800;
-
- for (line = 0; line < 240;line++)
- {
- uint16_t val = m_vram[scrollbase/2 + line];
- uint16_t upper = (m_vram[scrollbase2/2 + line]&0xff00)>>8;
-
- clip.sety(line, line);
-
- m_bg_tilemap[1]->set_scrollx(0,(val&0x00ff) | (upper << 8));
- m_bg_tilemap[1]->set_scrolly(0,((val&0xff00)>>8)-line);
-
- m_bg_tilemap[1]->draw(screen, bitmap, clip, 0, 0);
- }
- }
- else if (enable1 != 0x00)
- {
- m_bg_tilemap[1]->set_scrollx(0, 0);
- m_bg_tilemap[1]->set_scrolly(0, 0);
- m_bg_tilemap[1]->draw(screen, bitmap, cliprect, 0, 0);
- }
-
- if (enable0 == 0x1f)
- {
- scrollbase = 0xdf400;
- scrollbase2 = 0xdf800;
-
- for (line = 0; line < 240;line++)
- {
- uint16_t val = m_vram[scrollbase/2 + line];
- uint16_t upper = (m_vram[scrollbase2/2 + line]&0x00ff)>>0;
-
- clip.sety(line, line);
-
- m_bg_tilemap[0]->set_scrollx(0,(val&0x00ff) | (upper << 8));
- m_bg_tilemap[0]->set_scrolly(0,((val&0xff00)>>8)-line);
-
- m_bg_tilemap[0]->draw(screen, bitmap, clip, 0, 0);
- }
- }
- else if (enable0 != 0x00)
- {
- m_bg_tilemap[0]->set_scrollx(0, 0);
- m_bg_tilemap[0]->set_scrolly(0, 0);
- m_bg_tilemap[0]->draw(screen, bitmap, cliprect, 0, 0);
- }
-
- draw_sprites(bitmap,cliprect);
-
- return 0;
-}
-
-/* ??? */
-READ8_MEMBER(popobear_state::_620000_r)
-{
- return 9;
-}
-
-WRITE8_MEMBER(popobear_state::irq_ack_w)
-{
- int i;
-
- for(i=0;i<8;i++)
- {
- if(data & 1 << i)
- m_maincpu->set_input_line(i, CLEAR_LINE);
- }
-}
-
-void popobear_state::popobear_mem(address_map &map)
-{
- map.unmap_value_high();
- map(0x000000, 0x03ffff).rom();
- map(0x210000, 0x21ffff).ram();
- map(0x280000, 0x2fffff).ram().share("spr"); // unknown boundaries, 0x2ff800 contains a sprite list, lower area = sprite gfx
- map(0x300000, 0x3fffff).ram().w(FUNC(popobear_state::vram_w)).share("vram"); // tile definitions + tilemaps
-
-
- /* Most if not all of these are vregs */
- map(0x480000, 0x48001f).ram().share("vregs");
- map(0x480020, 0x480023).ram();
- map(0x480028, 0x48002d).ram();
-// AM_RANGE(0x480020, 0x480021) AM_NOP //AM_READ(480020_r) AM_WRITE(480020_w)
-// AM_RANGE(0x480028, 0x480029) AM_NOP //AM_WRITE(480028_w)
-// AM_RANGE(0x48002c, 0x48002d) AM_NOP //AM_WRITE(48002c_w)
- map(0x480031, 0x480031).w(FUNC(popobear_state::irq_ack_w));
- map(0x480034, 0x480035).ram(); // coin counter or coin lockout
- map(0x48003a, 0x48003b).ram(); //AM_READ(48003a_r) AM_WRITE(48003a_w)
-
- map(0x480400, 0x4807ff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette");
-
- map(0x500000, 0x500001).portr("IN0");
- map(0x520000, 0x520001).portr("IN1");
- map(0x540001, 0x540001).rw("oki", FUNC(okim6295_device::read), FUNC(okim6295_device::write));
- map(0x550000, 0x550003).w("ymsnd", FUNC(ym2413_device::write)).umask16(0x00ff);
-
- map(0x600000, 0x600001).nopw();
- map(0x620000, 0x620000).r(FUNC(popobear_state::_620000_r));
- map(0x620000, 0x620001).nopw();
- map(0x800000, 0xbfffff).rom();
-}
-
-static INPUT_PORTS_START( popobear )
-
- PORT_START("DSW1")
- PORT_DIPNAME( 0x01, 0x01, DEF_STR( Demo_Sounds ) )
- PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x01, DEF_STR( On ) )
- PORT_DIPNAME( 0x0e, 0x00, "Coin_A" )
- PORT_DIPSETTING( 0x0c, DEF_STR( 3C_1C ) )
- PORT_DIPSETTING( 0x0a, DEF_STR( 2C_1C ) )
- PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) )
- PORT_DIPSETTING( 0x02, DEF_STR( 1C_2C ) )
- PORT_DIPSETTING( 0x04, DEF_STR( 1C_3C ) )
- PORT_DIPSETTING( 0x06, DEF_STR( 1C_4C ) )
- PORT_DIPSETTING( 0x08, DEF_STR( 1C_5C ) )
- PORT_DIPSETTING( 0x0e, "Freeplay" )
- PORT_DIPNAME( 0x30, 0x00, DEF_STR( Lives ) )
- PORT_DIPSETTING( 0x10, "2" )
- PORT_DIPSETTING( 0x00, "3" )
- PORT_DIPSETTING( 0x20, "4" )
- PORT_DIPSETTING( 0x30, "5" )
- PORT_DIPNAME( 0xc0, 0x00, DEF_STR( Difficulty ) )
- PORT_DIPSETTING( 0x80, DEF_STR( Very_Easy ) )
- PORT_DIPSETTING( 0x40, DEF_STR( Easy ) )
- PORT_DIPSETTING( 0x00, DEF_STR( Normal ) )
- PORT_DIPSETTING( 0xc0, DEF_STR( Hard ) )
-
- PORT_START("DSW2")
- PORT_DIPNAME( 0x01, 0x00, "Arrow" )
- PORT_DIPSETTING( 0x01, DEF_STR( No ) )
- PORT_DIPSETTING( 0x00, DEF_STR( Yes ) )
- PORT_DIPNAME( 0x02, 0x00, "DSW2:2" )
- PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x02, DEF_STR( On ) )
- PORT_DIPNAME( 0x04, 0x00, "DSW2:3" )
- PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x04, DEF_STR( On ) )
- PORT_DIPNAME( 0x08, 0x00, "DSW2:4" )
- PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x08, DEF_STR( On ) )
- PORT_DIPNAME( 0x10, 0x00, "DSW2:5" )
- PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x10, DEF_STR( On ) )
- PORT_DIPNAME( 0x20, 0x00, "DSW2:6" )
- PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x20, DEF_STR( On ) )
- PORT_DIPNAME( 0x40, 0x00, "DSW2:7" )
- PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x40, DEF_STR( On ) )
- PORT_DIPNAME( 0x80, 0x00, "DSW2:8" )
- PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x80, DEF_STR( On ) )
-
- PORT_START("IN0")
- PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(2)
- PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(2)
- PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(2)
- PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(2)
- PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
- PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
- PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2)
- PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_UNUSED )
- PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1)
- PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(1)
- PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(1)
- PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(1)
- PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1)
- PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1)
- PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1)
- PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNUSED )
-
- PORT_START("IN1")
- PORT_DIPNAME( 0x01, 0x01, "DSWA" )
- PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(2)
- PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_START2 )
- PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_START1 )
-INPUT_PORTS_END
-
-
-TIMER_DEVICE_CALLBACK_MEMBER(popobear_state::irq)
-{
- int scanline = param;
-
- /* Order is trusted (5 as vblank-out makes the title screen logo spinning to behave wrongly) */
- if(scanline == 240)
- m_maincpu->set_input_line(3, ASSERT_LINE);
-
- if(scanline == 0)
- m_maincpu->set_input_line(5, ASSERT_LINE);
-
- /* TODO: actually a timer irq, tied with YM2413 sound chip (controls BGM tempo) */
- /* the YM2413 doesn't have interrupts? */
- if(scanline == 64 || scanline == 192)
- m_maincpu->set_input_line(2, ASSERT_LINE);
-}
-
-void popobear_state::popobear(machine_config &config)
-{
- M68000(config, m_maincpu, XTAL(42'000'000)/4); // XTAL CORRECT, DIVISOR GUESSED
- m_maincpu->set_addrmap(AS_PROGRAM, &popobear_state::popobear_mem);
- // levels 2,3,5 look interesting
- //->set_vblank_int("screen", popobear_state, irq5_line_assert)
- //->set_periodic_int(FUNC(popobear_state, irq2_line_assert, 120)
- TIMER(config, "scantimer").configure_scanline(FUNC(popobear_state::irq), "screen", 0, 1);
-
- screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
- screen.set_refresh_hz(60);
- screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
- screen.set_screen_update(FUNC(popobear_state::screen_update));
- screen.set_palette(m_palette);
- screen.set_size(128*8, 32*8);
- screen.set_visarea(0, 479, 0, 239);
-
- PALETTE(config, m_palette).set_format(palette_device::xBGR_555, 256*2);
-
- SPEAKER(config, "mono").front_center();
-
- GFXDECODE(config, m_gfxdecode, m_palette, gfx_popobear);
-
- YM2413(config, "ymsnd", XTAL(42'000'000)/16).add_route(ALL_OUTPUTS, "mono", 1.0); // XTAL CORRECT, DIVISOR GUESSED
-
- OKIM6295(config, "oki", XTAL(42'000'000)/32, okim6295_device::PIN7_LOW).add_route(ALL_OUTPUTS, "mono", 1.0); // XTAL CORRECT, DIVISOR GUESSED
-}
-
-
-ROM_START( popobear )
- ROM_REGION( 0x1000000, "maincpu", 0 ) /* 68000 Code + gfx data */
- ROM_LOAD16_BYTE( "popobear_en-a-301_1.6.u3", 0x000001, 0x020000, CRC(b934adf6) SHA1(93431c7a19af812b549aad35cc1176a81805ffab) )
- ROM_LOAD16_BYTE( "popobear_en-a-401_1.6.u4", 0x000000, 0x020000, CRC(0568af9c) SHA1(920531dbc4bbde2d1db062bd5c48b97dd50b7185) )
- ROM_LOAD16_BYTE( "popobear_en-a-501.u5", 0x800001, 0x100000, CRC(185901a9) SHA1(7ff82b5751645df53435eaa66edce589684cc5c7) )
- ROM_LOAD16_BYTE( "popobear_en-a-601.u6", 0x800000, 0x100000, CRC(84fa9f3f) SHA1(34dd7873f88b0dae5fb81fe84e82d2b6b49f7332) )
- ROM_LOAD16_BYTE( "popobear_en-a-701.u7", 0xa00001, 0x100000, CRC(45eba6d0) SHA1(0278602ed57ac45040619d590e6cc85e2cfeed31) )
- ROM_LOAD16_BYTE( "popobear_en-a-801.u8", 0xa00000, 0x100000, CRC(2760f2e6) SHA1(58af59f486c9df930f7c124f89154f8f389a5bd7) )
-
- ROM_REGION( 0x040000, "oki", 0 ) /* Samples */
- ROM_LOAD( "popobear_ta-a-901.u9", 0x00000, 0x40000, CRC(f1e94926) SHA1(f4d6f5b5811d90d0069f6efbb44d725ff0d07e1c) )
-ROM_END
-
-GAME( 2000, popobear, 0, popobear, popobear, popobear_state, empty_init, ROT0, "BMC", "PoPo Bear", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )