From 45354976d3bb97f4e1fa490de4ed46fe7a84efe1 Mon Sep 17 00:00:00 2001 From: hap Date: Fri, 6 Dec 2024 06:07:51 +0100 Subject: Systems promoted to working --------------------------- The Yakyuken [hap] --- src/mame/omori/battlex.cpp | 12 ++- src/mame/omori/carjmbre.cpp | 17 ++-- src/mame/omori/popper.cpp | 2 + src/mame/omori/spaceg.cpp | 41 +++++---- src/mame/omori/yakyuken.cpp | 218 +++++++++++++++++++++++++++++--------------- 5 files changed, 184 insertions(+), 106 deletions(-) diff --git a/src/mame/omori/battlex.cpp b/src/mame/omori/battlex.cpp index 45a40af8c05..89ff70feeb3 100644 --- a/src/mame/omori/battlex.cpp +++ b/src/mame/omori/battlex.cpp @@ -51,9 +51,6 @@ 00011000 0x74 88844777 - - - TO DO : - missing starfield @@ -169,6 +166,13 @@ private: void io_map(address_map &map) ATTR_COLD; }; + +/************************************* + * + * Video hardware + * + *************************************/ + void battlex_state::palette_w(offs_t offset, uint8_t data) { int const palette_num = offset / 8; @@ -479,7 +483,6 @@ void battlex_state::battlex(machine_config &config) m_maincpu->set_addrmap(AS_IO, &battlex_state::io_map); m_maincpu->set_periodic_int(FUNC(battlex_state::interrupt), attotime::from_hz(400)); // controls game speed? - // video hardware screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); screen.set_refresh_hz(60); @@ -503,7 +506,6 @@ void dodgeman_state::dodgeman(machine_config &config) m_maincpu->set_addrmap(AS_IO, &dodgeman_state::io_map); - AY8910(config, "ay2", XTAL(10'000'000) / 8).add_route(ALL_OUTPUTS, "mono", 0.40); // divider not verified } diff --git a/src/mame/omori/carjmbre.cpp b/src/mame/omori/carjmbre.cpp index 90f6953f821..8782792fe9c 100644 --- a/src/mame/omori/carjmbre.cpp +++ b/src/mame/omori/carjmbre.cpp @@ -42,10 +42,12 @@ ***************************************************************************/ #include "emu.h" + #include "cpu/z80/z80.h" #include "machine/gen_latch.h" #include "sound/ay8910.h" #include "video/resnet.h" + #include "emupal.h" #include "screen.h" #include "speaker.h" @@ -67,6 +69,13 @@ public: m_palette(*this, "palette") { } + void carjmbre(machine_config &config); + +protected: + virtual void machine_start() override ATTR_COLD; + virtual void video_start() override ATTR_COLD; + +private: // devices/pointers required_device m_maincpu; required_device m_audiocpu; @@ -90,21 +99,13 @@ public: void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect); TILE_GET_INFO_MEMBER(get_tile_info); - void carjmbre(machine_config &config); void main_map(address_map &map) ATTR_COLD; void sound_io_map(address_map &map) ATTR_COLD; void sound_map(address_map &map) ATTR_COLD; -protected: - virtual void machine_start() override ATTR_COLD; - virtual void video_start() override ATTR_COLD; }; void carjmbre_state::machine_start() { - // zerofill - m_nmi_enabled = false; - m_bgcolor = 0; - // register for savestates save_item(NAME(m_nmi_enabled)); save_item(NAME(m_bgcolor)); diff --git a/src/mame/omori/popper.cpp b/src/mame/omori/popper.cpp index 9e48793ee63..740c2075bac 100644 --- a/src/mame/omori/popper.cpp +++ b/src/mame/omori/popper.cpp @@ -39,10 +39,12 @@ ***************************************************************************/ #include "emu.h" + #include "cpu/z80/z80.h" #include "machine/74259.h" #include "sound/ay8910.h" #include "video/resnet.h" + #include "emupal.h" #include "screen.h" #include "speaker.h" diff --git a/src/mame/omori/spaceg.cpp b/src/mame/omori/spaceg.cpp index 3f9ecf37a00..19583c219ba 100644 --- a/src/mame/omori/spaceg.cpp +++ b/src/mame/omori/spaceg.cpp @@ -168,6 +168,7 @@ Notes: #include "cpu/z80/z80.h" #include "sound/samples.h" #include "sound/sn76477.h" + #include "emupal.h" #include "screen.h" #include "speaker.h" @@ -184,8 +185,8 @@ namespace { class spaceg_state : public driver_device { public: - spaceg_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), + spaceg_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), m_colorram(*this, "colorram"), m_videoram(*this, "videoram"), m_io9400(*this, "io9400"), @@ -238,6 +239,7 @@ void spaceg_state::driver_start() save_item(NAME(m_sound3)); } + /************************************* * * Video emulation @@ -251,7 +253,7 @@ void spaceg_state::spaceg_palette(palette_device &palette) const // proms are currently undumped... palette.set_pen_color( 0, rgb_t(0x00, 0x00, 0x00)); //ok czarny - palette.set_pen_color( 1, rgb_t(0x7f, 0x00, 0x00));//??? + palette.set_pen_color( 1, rgb_t(0x7f, 0x00, 0x00)); //??? palette.set_pen_color( 2, rgb_t(0xff, 0xff, 0xff)); //ok+ bialy palette.set_pen_color( 3, rgb_t(0xff, 0x00, 0x00)); //ok j.czerw. palette.set_pen_color( 4, rgb_t(0x3f, 0x3f, 0xff)); //ok j.niebieski @@ -261,12 +263,12 @@ void spaceg_state::spaceg_palette(palette_device &palette) const palette.set_pen_color( 8, rgb_t(0xff, 0x7f, 0x00)); //ok+ pomaranczowy palette.set_pen_color( 9, rgb_t(0x3f, 0xbf, 0xff)); //ok j.niebieski (ciemniejszy od 13) - palette.set_pen_color(10, rgb_t(0x3f, 0xbf, 0x3f)); //ok+ c.zielony - palette.set_pen_color(11, rgb_t(0x00, 0xff, 0x00)); //ok j.zielony - palette.set_pen_color(12, rgb_t(0x7f, 0x00, 0x00)); //ok brazowy (c.czerw) - palette.set_pen_color(13, rgb_t(0x7f, 0xbf, 0xff)); //ok j.niebieski (jasniejszy od 9) - palette.set_pen_color(14, rgb_t(0x00, 0xff, 0xff));//??? - palette.set_pen_color(15, rgb_t(0x7f, 0x7f, 0x7f));//??? + palette.set_pen_color(10, rgb_t(0x3f, 0xbf, 0x3f)); //ok+ c.zielony + palette.set_pen_color(11, rgb_t(0x00, 0xff, 0x00)); //ok j.zielony + palette.set_pen_color(12, rgb_t(0x7f, 0x00, 0x00)); //ok brazowy (c.czerw) + palette.set_pen_color(13, rgb_t(0x7f, 0xbf, 0xff)); //ok j.niebieski (jasniejszy od 9) + palette.set_pen_color(14, rgb_t(0x00, 0xff, 0xff)); //??? + palette.set_pen_color(15, rgb_t(0x7f, 0x7f, 0x7f)); //??? } void spaceg_state::zvideoram_w(offs_t offset, uint8_t data) @@ -290,8 +292,8 @@ void spaceg_state::zvideoram_w(offs_t offset, uint8_t data) vram_data |= sdata; // update colorram - if (sdata&0xff00) m_colorram[offset] = col; - if (sdata&0x00ff) m_colorram[offset2] = col; + if (sdata & 0xff00) m_colorram[offset] = col; + if (sdata & 0x00ff) m_colorram[offset2] = col; break; // erase @@ -305,18 +307,16 @@ void spaceg_state::zvideoram_w(offs_t offset, uint8_t data) return; } - m_videoram[offset]=vram_data>>8; - m_videoram[offset2]=vram_data&0xff; + m_videoram[offset] = vram_data >> 8; + m_videoram[offset2] = vram_data & 0xff; } uint8_t spaceg_state::colorram_r(offs_t offset) { - int rgbcolor; - if (offset < 0x400) { - rgbcolor = (m_colorram[offset] << 1) | ((offset &0x100) >> 8); + int rgbcolor = (m_colorram[offset] << 1) | ((offset & 0x100) >> 8); if ((offset >= 0x200) && (offset < 0x220)) /* 0xa200- 0xa21f */ { @@ -361,6 +361,13 @@ uint32_t spaceg_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap return 0; } + +/************************************* + * + * Sound emulation + * + *************************************/ + static const char *const invaders_sample_names[] = { "*invaders", @@ -418,6 +425,7 @@ void spaceg_state::sound3_w(uint8_t data) if (data & ~0x0f) logerror("spaceg sound3 unmapped %02x\n", data & ~0x0f); } + /************************************* * * Memory maps @@ -454,7 +462,6 @@ void spaceg_state::spaceg_map(address_map &map) } - /************************************* * * Input ports diff --git a/src/mame/omori/yakyuken.cpp b/src/mame/omori/yakyuken.cpp index beb93847b8e..5e647009235 100644 --- a/src/mame/omori/yakyuken.cpp +++ b/src/mame/omori/yakyuken.cpp @@ -1,9 +1,13 @@ // license:BSD-3-Clause -// copyright-holders: +// copyright-holders: Ivan Vangelista, hap /* + Bootleg of Omori's 野球拳 - The Yakyuken +It's a cocktail cabinet, each side has 7 buttons. One of the buttons is +apparently for relinquishing controls to the other side. + PCB is marked 20282 and LC (stands for "lato componenti", so components side) with a small riser board marked W 15482 plugged into one of the main CPU ROMs' sockets @@ -13,20 +17,22 @@ SGS Z80CPUB1 main CPU (clock measured 3.07 MHz) 18.432 MHz XTAL SGS Z80CPUB1 audio CPU (clock measured 1.53 MHz) AY-3-8910 sound chip -MK4802 RAM (near audio CPU) and snd chip Ay-3-8910 +MK4802 RAM (near audio CPU) 6x 2114 RAM (near GFX ROMs) Bank of 8 switches The riser board has a pair of HM4334 1K*4 static RAMs and a quad 2-input NAND gate. TODO: -- sound -- is visible area correct? - remaining DIPs +- doesn't it have a hopper? +- game sometimes leaves gaps when the lady is undressing - colors aren't 100% correct (see i.e. the stripes in the curtains) reference video: https://www.youtube.com/watch?v=zTOFIhuwR2w -*/ +- verify sound pitch (unfortunately, no pcb sound in above video) +- verify irq frequency, though it looks similar to the pcb video +*/ #include "emu.h" @@ -50,30 +56,34 @@ public: m_maincpu(*this, "maincpu"), m_audiocpu(*this, "audiocpu"), m_gfxdecode(*this, "gfxdecode"), - m_bgram(*this, "bgram"), - m_fgram(*this, "fgram") + m_screen(*this, "screen"), + m_ay(*this, "ay"), + m_vram(*this, "vram", 0x400*2, ENDIANNESS_LITTLE) { } void yakyuken(machine_config &config); protected: + virtual void machine_start() override ATTR_COLD; virtual void video_start() override ATTR_COLD; private: required_device m_maincpu; required_device m_audiocpu; required_device m_gfxdecode; + required_device m_screen; + required_device m_ay; + + memory_share_creator m_vram; - required_shared_ptr m_bgram; - required_shared_ptr m_fgram; + uint8_t m_ay_data = 0; + tilemap_t *m_tilemap = nullptr; - tilemap_t *m_bg_tilemap = nullptr; - tilemap_t *m_fg_tilemap = nullptr; + TILEMAP_MAPPER_MEMBER(tilemap_scan_rows); + TILE_GET_INFO_MEMBER(get_tile_info); - TILE_GET_INFO_MEMBER(get_bg_tile_info); - TILE_GET_INFO_MEMBER(get_fg_tile_info); - void bgram_w(offs_t offset, uint8_t data); - void fgram_w(offs_t offset, uint8_t data); + void vram_w(offs_t offset, uint8_t data); + void palette(palette_device &palette) const ATTR_COLD; uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); void main_io_map(address_map &map) ATTR_COLD; @@ -82,60 +92,81 @@ private: void sound_io_map(address_map &map) ATTR_COLD; }; - -TILE_GET_INFO_MEMBER(yakyuken_state::get_bg_tile_info) +void yakyuken_state::machine_start() { - int const code = m_bgram[tile_index]; - - tileinfo.set(0, code, 0, 0); + save_item(NAME(m_ay_data)); } -TILE_GET_INFO_MEMBER(yakyuken_state::get_fg_tile_info) -{ - int code = m_fgram[tile_index]; - if (code == 0x00) code = 0x2ff; // why? is this another 'big sprite' thing? +/************************************* + * + * Video hardware + * + *************************************/ - tileinfo.set(1, code, 0, 0); -} +void yakyuken_state::palette(palette_device &palette) const +{ + for (int i = 0; i < 8; i++) + { + palette.set_pen_color(i, pal1bit(BIT(i, 0)), pal1bit(BIT(i, 1)), pal1bit(BIT(i, 2))); + // second half is brighter + palette.set_pen_color(i | 8, pal1bit(BIT(i, 0)) | 0x80, pal1bit(BIT(i, 1)) | 0x80, pal1bit(BIT(i, 2)) | 0x80); + } +} -void yakyuken_state::video_start() +TILEMAP_MAPPER_MEMBER(yakyuken_state::tilemap_scan_rows) { - m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(yakyuken_state::get_bg_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32); - m_fg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(yakyuken_state::get_fg_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32); + row += 2; + col -= 1; + + // upper 2 rows are left and right columns + if (col & 0x20) + return (col & 1) << 5 | row; + else + return row << 5 | col; +} - m_fg_tilemap->set_transparent_pen(0); +TILE_GET_INFO_MEMBER(yakyuken_state::get_tile_info) +{ + int const code = m_vram[tile_index]; + tileinfo.set(0, code, 0, 0); } -void yakyuken_state::fgram_w(offs_t offset, uint8_t data) +static GFXDECODE_START( gfx_yakyuken ) + GFXDECODE_ENTRY( "tiles", 0, gfx_8x8x4_planar, 0, 1 ) +GFXDECODE_END + + +void yakyuken_state::video_start() { - m_fgram[offset] = data; - m_fg_tilemap->mark_tile_dirty(offset); + m_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(yakyuken_state::get_tile_info)), tilemap_mapper_delegate(*this, FUNC(yakyuken_state::tilemap_scan_rows)), 8, 8, 34, 28); } -void yakyuken_state::bgram_w(offs_t offset, uint8_t data) +void yakyuken_state::vram_w(offs_t offset, uint8_t data) { - m_bgram[offset] = data; - m_bg_tilemap->mark_tile_dirty(offset); + m_vram[offset & 0x3ff] = (offset >> 2 & 0x300) | data; + m_tilemap->mark_tile_dirty(offset & 0x3ff); } uint32_t yakyuken_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { - m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0); - m_fg_tilemap->draw(screen, bitmap, cliprect, 0, 0); - + m_tilemap->draw(screen, bitmap, cliprect, 0, 0); return 0; } +/************************************* + * + * Memory maps + * + *************************************/ + void yakyuken_state::main_program_map(address_map &map) { - map(0x0000, 0x3fff).rom(); + map(0x0000, 0x37ff).rom(); map(0x6400, 0x67ff).ram(); - map(0x7000, 0x73ff).ram().w(FUNC(yakyuken_state::bgram_w)).share(m_bgram); - map(0x7400, 0x77ff).ram().w(FUNC(yakyuken_state::fgram_w)).share(m_fgram); - map(0x7c00, 0x7fff).ram(); // only seems to be initialized with 0xff at start up + map(0x7000, 0x73ff).select(0xc00).w(FUNC(yakyuken_state::vram_w)); } void yakyuken_state::main_io_map(address_map &map) @@ -144,9 +175,9 @@ void yakyuken_state::main_io_map(address_map &map) map(0x00, 0x00).portr("SW"); map(0x01, 0x01).portr("IN0"); map(0x02, 0x02).portr("IN1"); - map(0x17, 0x17).lw8(NAME([this] (uint8_t data) { if (data & 0xfe) logerror("flip w: %02x\n", data); flip_screen_set(BIT(data, 0)); })); - // map(0x30, 0x30).w() // lamps? - // .w("soundlatch", FUNC(generic_latch_8_device::write)); + map(0x03, 0x03).portr("IN2"); + map(0x17, 0x17).lw8(NAME([this] (uint8_t data) { flip_screen_set(BIT(data, 0)); })); + map(0x30, 0x30).w("soundlatch", FUNC(generic_latch_8_device::write)); } void yakyuken_state::sound_program_map(address_map &map) @@ -158,96 +189,125 @@ void yakyuken_state::sound_program_map(address_map &map) void yakyuken_state::sound_io_map(address_map &map) { map.global_mask(0xff); - // .r("soundlatch", FUNC(generic_latch_8_device::read)); - // .w("ay", FUNC(ay8910_device::address_data_w)); - // .r("ay", FUNC(ay8910_device::data_r)); + map(0x00, 0x00).r("soundlatch", FUNC(generic_latch_8_device::read)); + map(0x01, 0x01).w("soundlatch", FUNC(generic_latch_8_device::clear_w)); + map(0x02, 0x02).lw8(NAME([this] (uint8_t data) { m_ay_data = data; })); + map(0x03, 0x03).lw8(NAME([this] (uint8_t data) { m_ay->write_bc1_bc2(data & 3, m_ay_data); })); } +/************************************* + * + * Input ports + * + *************************************/ + static INPUT_PORTS_START( yakyuken ) PORT_START("IN0") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) // 100 in book-keeping PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) // 500 in book-keeping PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN3 ) // 1000 in book-keeping PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_GAMBLE_PAYOUT ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START3 ) PORT_NAME("P1 Control") + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_START4 ) PORT_NAME("P2 Control") PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_GAMBLE_BOOK ) // only works without credits inserted PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_START("IN1") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_GAMBLE_BET ) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_NAME("P1 Bet") PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START1 ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) // Gu (rock) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON2 ) // Choki (scissors) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON3 ) // Pa (paper) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_GAMBLE_TAKE ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("P1 Take Score") + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START("IN2") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_COCKTAIL PORT_NAME("P2 Bet") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START2 ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_COCKTAIL + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_COCKTAIL + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_COCKTAIL PORT_NAME("P2 Take Score") PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_START("SW") - PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coinage ) ) PORT_DIPLOCATION("SW:1,2") + PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coinage ) ) PORT_DIPLOCATION("SW:1,2") PORT_DIPSETTING( 0x03, "A 1C / B 5C / C 10C" ) PORT_DIPSETTING( 0x02, "A 2C / B 10C / C 20C" ) PORT_DIPSETTING( 0x01, "A 4C / B 20C / C 40C" ) PORT_DIPSETTING( 0x00, "A 5C / B 25C / C 50C" ) - PORT_DIPNAME( 0x04, 0x04, "Max Bet" ) PORT_DIPLOCATION("SW:3") + PORT_DIPNAME( 0x04, 0x04, "Max Bet" ) PORT_DIPLOCATION("SW:3") PORT_DIPSETTING( 0x04, "10" ) PORT_DIPSETTING( 0x00, "30" ) - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW:4") // some combination of the following 3 seems to affect win probability + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW:4") // some combination of the following 3 seems to affect win probability PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW:5") + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW:5") PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW:6") + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW:6") PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPNAME( 0x40, 0x40, DEF_STR( Service_Mode ) ) PORT_DIPLOCATION("SW:7") PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x80, 0x80, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW:8") + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW:8") PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) INPUT_PORTS_END -static GFXDECODE_START( gfx_yakyuken ) - GFXDECODE_ENTRY( "tiles", 0, gfx_8x8x4_planar, 0, 1 ) - GFXDECODE_ENTRY( "tiles", 0x800, gfx_8x8x4_planar, 0, 1 ) -GFXDECODE_END - +/************************************* + * + * Machine config + * + *************************************/ void yakyuken_state::yakyuken(machine_config &config) { - Z80(config, m_maincpu, 18.432_MHz_XTAL / 6); // 3.07 MHz + // basic machine hardware + Z80(config, m_maincpu, 18.432_MHz_XTAL / 3 / 2); // 3.072 MHz m_maincpu->set_addrmap(AS_PROGRAM, &yakyuken_state::main_program_map); m_maincpu->set_addrmap(AS_IO, &yakyuken_state::main_io_map); - m_maincpu->set_vblank_int("screen", FUNC(yakyuken_state::irq0_line_hold)); - Z80(config, m_audiocpu, 18.432_MHz_XTAL / 12); // 1.53 MHz + attotime irq_period = attotime::from_ticks(0x2000, 18.432_MHz_XTAL / 3); + m_maincpu->set_periodic_int(FUNC(yakyuken_state::irq0_line_hold), irq_period); + + Z80(config, m_audiocpu, 18.432_MHz_XTAL / 3 / 4); // 1.536 MHz m_audiocpu->set_addrmap(AS_PROGRAM, &yakyuken_state::sound_program_map); m_audiocpu->set_addrmap(AS_IO, &yakyuken_state::sound_io_map); + config.set_maximum_quantum(attotime::from_hz(600)); + // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); - screen.set_refresh_hz(60); - screen.set_size(256, 256); - screen.set_visarea(0, 256-1, 0, 256-1); - screen.set_screen_update(FUNC(yakyuken_state::screen_update)); - screen.set_palette("palette"); + SCREEN(config, m_screen, SCREEN_TYPE_RASTER); + m_screen->set_refresh_hz(60); + m_screen->set_size(34*8, 28*8); + m_screen->set_visarea(0*8, 34*8-1, 0*8, 28*8-1); + m_screen->set_screen_update(FUNC(yakyuken_state::screen_update)); + m_screen->set_palette("palette"); GFXDECODE(config, m_gfxdecode, "palette", gfx_yakyuken); - PALETTE(config, "palette").set_entries(0x10); // TODO + PALETTE(config, "palette", FUNC(yakyuken_state::palette), 0x10); + // sound hardware SPEAKER(config, "mono").front_center(); GENERIC_LATCH_8(config, "soundlatch"); - AY8910(config, "ay", 18.432_MHz_XTAL / 12).add_route(ALL_OUTPUTS, "mono", 0.35); + AY8910(config, m_ay, 18.432_MHz_XTAL / 3 / 16).add_route(ALL_OUTPUTS, "mono", 0.35); } +/************************************* + * + * ROM definitions + * + *************************************/ + ROM_START( yakyuken ) ROM_REGION( 0x4000, "maincpu", 0 ) ROM_LOAD( "4210.bt1", 0x0000, 0x1000, CRC(6cf83735) SHA1(3d0a978adb1c1b4526fa00dedd08e2879f4af283) ) @@ -272,4 +332,10 @@ ROM_END } // anonymous namespace -GAME( 198?, yakyuken, 0, yakyuken, yakyuken, yakyuken_state, empty_init, ROT0, "bootleg", "The Yakyuken", MACHINE_IS_SKELETON ) +/************************************* + * + * Game drivers + * + *************************************/ + +GAME( 1982, yakyuken, 0, yakyuken, yakyuken, yakyuken_state, empty_init, ROT0, "bootleg", "The Yakyuken", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_COLORS | MACHINE_SUPPORTS_SAVE ) -- cgit v1.2.3