From fa3b85ff8eb2bfdf84fe64a8ab3121ddece4ba5e Mon Sep 17 00:00:00 2001 From: arbee Date: Wed, 20 Nov 2024 22:49:23 -0500 Subject: New machines added as WORKING ----------------------------- Chusenoh [Hammy, R. Belmont] --- src/mame/konami/k054156_k054157_k056832.cpp | 9 +- src/mame/konami/k054156_k054157_k056832.h | 1 + src/mame/konami/konmedal.cpp | 157 +++++++++++++++++++++++++++- src/mame/mame.lst | 2 + 4 files changed, 165 insertions(+), 4 deletions(-) diff --git a/src/mame/konami/k054156_k054157_k056832.cpp b/src/mame/konami/k054156_k054157_k056832.cpp index 7824e3a26a6..0b70695b9de 100644 --- a/src/mame/konami/k054156_k054157_k056832.cpp +++ b/src/mame/konami/k054156_k054157_k056832.cpp @@ -678,11 +678,16 @@ u32 k056832_device::k_6bpp_rom_long_r(offs_t offset, u32 mem_mask) u8 k056832_device::konmedal_rom_r(offs_t offset) { - uint32_t addr = (((m_regs[0x1a] << 9) & 0x60000) | ((m_regs[0x1b] << 15) & 0x18000) | ((m_regs[0x1a] << 3) & 0x06000)) + offset; - + const uint32_t addr = (((m_regs[0x1a] << 9) & 0x60000) | ((m_regs[0x1b] << 15) & 0x18000) | ((m_regs[0x1a] << 3) & 0x06000)) + offset; return m_rombase[addr]; } +u8 k056832_device::chusenoh_rom_r(offs_t offset) +{ + const uint32_t bank = (m_regs[0x1b] << 17) | (m_regs[0x1a] << 5); + const uint32_t addr = bank + offset; + return m_rombase[addr]; +} u16 k056832_device::piratesh_rom_r(offs_t offset) { diff --git a/src/mame/konami/k054156_k054157_k056832.h b/src/mame/konami/k054156_k054157_k056832.h index 42333d4e793..538df05efc2 100644 --- a/src/mame/konami/k054156_k054157_k056832.h +++ b/src/mame/konami/k054156_k054157_k056832.h @@ -63,6 +63,7 @@ public: u32 k_6bpp_rom_long_r(offs_t offset, u32 mem_mask = ~0); u16 rom_word_r(offs_t offset); u8 konmedal_rom_r(offs_t offset); + u8 chusenoh_rom_r(offs_t offset); u16 piratesh_rom_r(offs_t offset); u16 mw_rom_word_r(offs_t offset); u16 bishi_rom_word_r(offs_t offset); diff --git a/src/mame/konami/konmedal.cpp b/src/mame/konami/konmedal.cpp index eef96908df4..f69c04f59ca 100644 --- a/src/mame/konami/konmedal.cpp +++ b/src/mame/konami/konmedal.cpp @@ -55,11 +55,14 @@ Konami PWB 402218 boards - Priorities not understood and wrong in places of GX-based games, apparently controlled by PROM - X/Y scroll effects not 100% handled by current K052109(TMNT tilemaps) emulation. Mario Roulette issues currently "resolved" using hack. + - Chusenoh keypad hardware is completely unknown. It's presumed to hook up via the i8251. ***************************************************************************/ #include "emu.h" #include "cpu/z80/z80.h" +#include "machine/clock.h" +#include "machine/i8251.h" #include "machine/nvram.h" #include "machine/ticket.h" #include "machine/timer.h" @@ -84,6 +87,7 @@ public: konmedal_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), + m_usart(*this, "upd71051"), m_k056832(*this, "k056832"), m_k053252(*this, "k053252"), m_k052109(*this, "k052109"), @@ -99,6 +103,7 @@ public: void shuriboy(machine_config &config); void ddboy(machine_config &config); + void chusenoh(machine_config &config); void tsukande(machine_config &config); void fuusenpn(machine_config &config); void mariorou(machine_config &config); @@ -106,6 +111,7 @@ public: void tsururin(machine_config &config); void ddboy_init(); + void chusenoh_init(); void tsuka_init(); void buttobi_init(); void shuri_init(); @@ -127,8 +133,10 @@ private: DECLARE_MACHINE_START(shuriboy); uint8_t vram_r(offs_t offset); + uint8_t chusenoh_vram_r(offs_t offset); void vram_w(offs_t offset, uint8_t data); void bankswitch_w(uint8_t data); + void chusenoh_bankswitch_w(uint8_t data); void scc_enable_w(uint8_t data); void control2_w(uint8_t data); void medalcnt_w(uint8_t data); @@ -138,6 +146,7 @@ private: uint32_t screen_update_shuriboy(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); K056832_CB_MEMBER(tile_callback); + K056832_CB_MEMBER(chusenoh_tile_callback); TIMER_DEVICE_CALLBACK_MEMBER(konmedal_scanline); void vbl_ack_w(int state) { m_maincpu->set_input_line(0, CLEAR_LINE); } void nmi_ack_w(int state) { m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE); } @@ -153,12 +162,14 @@ private: void mario_scrollhack_w(uint8_t data); void ddboy_main(address_map &map) ATTR_COLD; + void chusenoh_main(address_map &map) ATTR_COLD; void medal_main(address_map &map) ATTR_COLD; void shuriboy_main(address_map &map) ATTR_COLD; void machine_start_common(); required_device m_maincpu; + optional_device m_usart; optional_device m_k056832; optional_device m_k053252; optional_device m_k052109; @@ -216,9 +227,11 @@ void konmedal_state::medalcnt_w(uint8_t data) void konmedal_state::lamps_w(uint8_t data) { -// CN6 + // CN6 for (int i = 0; i < 8; i++) + { m_lamps[i] = BIT(data, i); + } } uint8_t konmedal_state::vram_r(offs_t offset) @@ -242,6 +255,27 @@ uint8_t konmedal_state::vram_r(offs_t offset) return 0; } +uint8_t konmedal_state::chusenoh_vram_r(offs_t offset) +{ + if (!(m_control & 0x80)) + { + if (offset & 1) + { + return m_k056832->ram_code_hi_r(offset >> 1); + } + else + { + return m_k056832->ram_code_lo_r(offset >> 1); + } + } + else // ROM readback + { + return m_k056832->chusenoh_rom_r(offset); + } + + return 0; +} + void konmedal_state::vram_w(offs_t offset, uint8_t data) { // there are (very few) writes above F000 in some screens. @@ -269,6 +303,20 @@ void konmedal_state::ddboy_init() m_layer_order[2] = 1; m_layer_order[3] = 0; } + +void konmedal_state::chusenoh_init() +{ + m_layer_colorbase[0] = 8; + m_layer_colorbase[1] = 8; + m_layer_colorbase[2] = 0; + m_layer_colorbase[3] = 0; + + m_layer_order[0] = 3; + m_layer_order[1] = 2; + m_layer_order[2] = 1; + m_layer_order[3] = 0; +} + void konmedal_state::buttobi_init() { m_layer_colorbase[0] = 0; @@ -311,6 +359,28 @@ K056832_CB_MEMBER(konmedal_state::tile_callback) *priority = BIT(codebits, 12); } +K056832_CB_MEMBER(konmedal_state::chusenoh_tile_callback) +{ + u32 codebits = *code; + + int mode, avac; + m_k056832->read_avac(&mode, &avac); + if (mode) + *code = (((avac >> ((codebits >> 8) & 0xc)) & 0xf) << 10) | (codebits & 0x3ff); + else + *code = codebits & 0x1fff; + + *color = m_layer_colorbase[layer] + ((codebits >> 13) & 7); + *priority = BIT(codebits, 12); + + if (layer == 3) + { + *code = 0; + *color = 0; + *priority = 0; + } +} + void konmedal_state::video_start() { } @@ -382,11 +452,16 @@ TIMER_DEVICE_CALLBACK_MEMBER(konmedal_state::konmedal_scanline) void konmedal_state::bankswitch_w(uint8_t data) { - //printf("ROM bank %x (full %02x)\n", data>>4, data); membank("bank1")->set_entry(data>>4); m_control = data & 0xf; } +void konmedal_state::chusenoh_bankswitch_w(uint8_t data) +{ + membank("bank1")->set_entry(data & 0xf); + m_control = data; +} + void konmedal_state::scc_enable_w(uint8_t data) { // SCC memory bank register 3, 0x3f to enable access to sound registers @@ -442,6 +517,26 @@ void konmedal_state::ddboy_main(address_map &map) map(0xe000, 0xffff).rw(FUNC(konmedal_state::vram_r), FUNC(konmedal_state::vram_w)); } +void konmedal_state::chusenoh_main(address_map &map) +{ + map(0x0000, 0x7fff).rom().region("maincpu", 0); + map(0x8000, 0x9fff).bankr("bank1"); + map(0xa000, 0xbfff).ram().share("nvram"); // work RAM + map(0xc000, 0xc03f).w(FUNC(konmedal_state::k056832_w)); + map(0xc100, 0xc100).w(FUNC(konmedal_state::control2_w)); + map(0xc200, 0xc201).rw(m_usart, FUNC(i8251_device::read), FUNC(i8251_device::write)); + map(0xc300, 0xc300).w(FUNC(konmedal_state::chusenoh_bankswitch_w)); + map(0xc500, 0xc500).portr("IN1"); + map(0xc600, 0xc60f).w(FUNC(konmedal_state::k056832_b_w)); + map(0xc600, 0xc600).nopr(); // watchdog reset + map(0xc800, 0xc80f).rw(m_k053252, FUNC(k053252_device::read), FUNC(k053252_device::write)); + map(0xcc00, 0xcc00).rw(m_oki, FUNC(okim6295_device::read), FUNC(okim6295_device::write)); + map(0xd000, 0xd000).mirror(0x07ff).w(FUNC(konmedal_state::scc_enable_w)); + map(0xd800, 0xdfff).view(m_scc_map); + m_scc_map[0](0xd800, 0xd8ff).mirror(0x0700).m("k051649", FUNC(k051649_device::scc_map)); + map(0xe000, 0xffff).rw(FUNC(konmedal_state::chusenoh_vram_r), FUNC(konmedal_state::vram_w)); +} + void konmedal_state::shuriboy_main(address_map &map) { map(0x0000, 0x7fff).rom().region("maincpu", 0); @@ -545,6 +640,20 @@ static INPUT_PORTS_START( konmedal ) PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("hopper", FUNC(hopper_device::motor_w)) INPUT_PORTS_END +static INPUT_PORTS_START( chusenoh ) + PORT_START("IN1") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Red") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Blue") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Yellow") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("White") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("Setup Mode") PORT_TOGGLE + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Test Switch") PORT_CODE(KEYCODE_F2) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON7 ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON8 ) + + PORT_START("OUT") +INPUT_PORTS_END + static INPUT_PORTS_START( ddboy ) PORT_INCLUDE( konmedal ) @@ -908,6 +1017,28 @@ void konmedal_state::ddboy(machine_config &config) K051649(config, "k051649", XTAL(14'318'181)/4).add_route(ALL_OUTPUTS, "mono", 0.45); } +void konmedal_state::chusenoh(machine_config &config) +{ + ddboy(config); + m_maincpu->set_addrmap(AS_PROGRAM, &konmedal_state::chusenoh_main); + m_k056832->set_tile_callback(FUNC(konmedal_state::chusenoh_tile_callback)); + + screen_device &screen(SCREEN(config.replace(), "screen", SCREEN_TYPE_RASTER)); + screen.set_refresh_hz(59.62); + screen.set_vblank_time(ATTOSECONDS_IN_USEC(0)); + screen.set_size(64 * 8, 32 * 8); + screen.set_visarea(120, 360 - 1, 16, 240 - 1); + screen.set_screen_update(FUNC(konmedal_state::screen_update_konmedal)); + screen.set_palette(m_palette); + + I8251(config, m_usart, XTAL(18'432'000)/8); + + // I have no idea how this division happens. There is a 74F161 4-bit counter nearby which likely is involved. + clock_device &clk(CLOCK(config, "clock", 18.432_MHz_XTAL / 1920)); // this gives 9600 baud, which may or may not be right + clk.signal_handler().set(m_usart, FUNC(i8251_device::write_txc)); + clk.signal_handler().append(m_usart, FUNC(i8251_device::write_rxc)); +} + /* Shuriken Boy While being a Z80 medal game, it runs on fairly different hardware. It might merit a new driver when emulation will be fleshed out. @@ -1224,6 +1355,25 @@ ROM_START( buttobi ) ROM_LOAD( "440-a01-8b.bin", 0x000000, 0x040000, CRC(955b1bd5) SHA1(1e8130a3634972d742ba4ad103e1738e44a4e28c) ) ROM_END +ROM_START(chusenoh) + ROM_REGION( 0x20000, "maincpu", 0 ) /* main program */ + ROM_LOAD("yb200_a01.18s.bin", 0x000000, 0x020000, CRC(067dba9a) SHA1(09bf6f0fcee8b8df20d290ae8b4d91b2a28d6eb3)) + + ROM_REGION(0x40000, "k056832", 0) /* tilemaps */ + ROM_LOAD32_BYTE("yb200_a03.5s.bin", 0x000002, 0x010000, CRC(870b43fd) SHA1(19816bd707314ab09c56b8a762588e307206dc30)) + ROM_LOAD32_BYTE("yb200_a04.8s.bin", 0x000003, 0x010000, CRC(ca9ada12) SHA1(c4c41c961da8e2e6222e06b893404432e22c1afa)) + ROM_LOAD32_BYTE("yb200_a05.10s.bin", 0x000000, 0x010000, CRC(042d02fe) SHA1(4d6d5c00b64dfc349ac69771f9411d1fcf55b48f)) + ROM_LOAD32_BYTE("yb200_a06.12s.bin", 0x000001, 0x010000, CRC(2637ca0f) SHA1(9d63b4f56b2f54b9e426288ac08ee0ae2693cedd)) + + ROM_REGION(0x40000, "oki", 0) + ROM_LOAD("yb200_a02.5e.bin", 0x000000, 0x040000, CRC(330e4753) SHA1(3ebfe40153881d09ce9f71e2676d0e48b380da24)) + + ROM_REGION(0x1000, "proms", 0) + ROM_LOAD("r_yb200a07.16m.bin", 0x000000, 0x000800, CRC(3502ad50) SHA1(4888434c24fca982db366ceddb4d65aea1b8cb3b)) + ROM_LOAD("g_yb200a08.14m.bin", 0x000100, 0x000800, CRC(67eb4d04) SHA1(c82cd0b597635cd6c71bf36a362735474f89665f)) + ROM_LOAD("b_yb200a09.13m.bin", 0x000200, 0x000800, CRC(02c3b55f) SHA1(75a38c877fcfb03c0272c0af3c19900d6c15764a)) + ROM_LOAD("pri_yb200a10.11m.bin", 0x000300, 0x000800, CRC(2bf4ae05) SHA1(dd8113f93fe17900255ff516d1dffbb08c85ee8a)) +ROM_END ROM_START( shuriboy ) ROM_REGION( 0x10000, "maincpu", 0 ) /* main program */ @@ -1360,6 +1510,9 @@ GAME( 1993, fuusenpn, 0, fuusenpn, fuusenpn, konmedal_state, fuusen_init, R GAME( 1994, buttobi, 0, ddboy, ddboy, konmedal_state, buttobi_init, ROT0, "Konami", "Buttobi Striker", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE) GAME( 1994, ddboy, 0, ddboy, ddboy, konmedal_state, ddboy_init, ROT0, "Konami", "Dam Dam Boy (on dedicated PCB)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE) +// Konami PWB 452944A boards (GX tilemaps, TV Plug-and-Play form factor) +GAME( 1992, chusenoh, 0, chusenoh, chusenoh, konmedal_state, chusenoh_init, ROT0, "Konami", "Chusenoh", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE) + // Konami PWB 402218 boards (GX tilemaps) GAME( 1994, ddboya, ddboy, tsukande, ddboy, konmedal_state, ddboy_init, ROT0, "Konami", "Dam Dam Boy (on Tsukande Toru Chicchi PCB)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE) GAME( 1995, tsukande, 0, tsukande, konmedal, konmedal_state, tsuka_init, ROT0, "Konami", "Tsukande Toru Chicchi", MACHINE_SUPPORTS_SAVE) diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 3aeb17528a4..50bc52f0e36 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -17734,6 +17734,7 @@ draco // (c) 1981 Cidelsa @source:efo/nightmare.cpp nightmare // (c) 1982 E.F.O. +nightmarea // (c) 1982 E.F.O. @source:elektor/avrmax.cpp atm18mcc @@ -24319,6 +24320,7 @@ tdbingo // @source:konami/konmedal.cpp buttobi +chusenoh // 1992 Konami ddboy ddboya fuusenpn -- cgit v1.2.3