Skip to content

Commit

Permalink
bublbobl,kikikai: remove embedded mcu io ports emulation and use m680…
Browse files Browse the repository at this point in the history
…1 io map 0-7 instead
  • Loading branch information
happppp committed May 14, 2021
1 parent d175e44 commit 57feb3f
Show file tree
Hide file tree
Showing 7 changed files with 32 additions and 211 deletions.
2 changes: 2 additions & 0 deletions src/devices/cpu/m6800/m6800.cpp
Expand Up @@ -29,6 +29,8 @@ System dependencies: uint16_t must be 16 bit unsigned int
* IS3 interrupt for 6801 port 3 handshake (already implemented for 6301Y)
* finish 6301Y port 6 handshake, share implementation with p3csr?
* 6301Y sci_trcsr2_r/w
* add 6801U4 extra timer registers (bublbobl, kikikai, though they seem
to work fine without)
*****************************************************************************/

Expand Down
36 changes: 10 additions & 26 deletions src/mame/drivers/bublbobl.cpp
Expand Up @@ -270,7 +270,6 @@ K1100172A (sticker)
#include "emu.h"
#include "includes/bublbobl.h"

#include "cpu/m6800/m6801.h"
#include "cpu/z80/z80.h"
#include "machine/watchdog.h"
#include "sound/ym2203.h"
Expand Down Expand Up @@ -355,15 +354,8 @@ void bublbobl_state::sound_map(address_map &map)

void bublbobl_state::mcu_map(address_map &map)
{
map(0x0000, 0x0000).rw(FUNC(bublbobl_state::bublbobl_mcu_ddr1_r), FUNC(bublbobl_state::bublbobl_mcu_ddr1_w));
map(0x0001, 0x0001).rw(FUNC(bublbobl_state::bublbobl_mcu_ddr2_r), FUNC(bublbobl_state::bublbobl_mcu_ddr2_w));
map(0x0002, 0x0002).rw(FUNC(bublbobl_state::bublbobl_mcu_port1_r), FUNC(bublbobl_state::bublbobl_mcu_port1_w));
map(0x0003, 0x0003).rw(FUNC(bublbobl_state::bublbobl_mcu_port2_r), FUNC(bublbobl_state::bublbobl_mcu_port2_w));
map(0x0004, 0x0004).rw(FUNC(bublbobl_state::bublbobl_mcu_ddr3_r), FUNC(bublbobl_state::bublbobl_mcu_ddr3_w));
map(0x0005, 0x0005).rw(FUNC(bublbobl_state::bublbobl_mcu_ddr4_r), FUNC(bublbobl_state::bublbobl_mcu_ddr4_w));
map(0x0006, 0x0006).rw(FUNC(bublbobl_state::bublbobl_mcu_port3_r), FUNC(bublbobl_state::bublbobl_mcu_port3_w));
map(0x0007, 0x0007).rw(FUNC(bublbobl_state::bublbobl_mcu_port4_r), FUNC(bublbobl_state::bublbobl_mcu_port4_w));
map(0x0040, 0x00ff).ram();
map(0x0000, 0x0007).m(m_mcu, FUNC(m6801_cpu_device::m6801_io));
map(0x0040, 0x00ff).ram(); // internal
map(0xf000, 0xffff).rom();
}

Expand Down Expand Up @@ -921,14 +913,7 @@ MACHINE_START_MEMBER(bublbobl_state,bublbobl)
{
MACHINE_START_CALL_MEMBER(common);

save_item(NAME(m_ddr1));
save_item(NAME(m_ddr2));
save_item(NAME(m_ddr3));
save_item(NAME(m_ddr4));
save_item(NAME(m_port1_in));
save_item(NAME(m_port2_in));
save_item(NAME(m_port3_in));
save_item(NAME(m_port4_in));
save_item(NAME(m_port1_out));
save_item(NAME(m_port2_out));
save_item(NAME(m_port3_out));
Expand All @@ -940,14 +925,7 @@ MACHINE_RESET_MEMBER(bublbobl_state,bublbobl)
MACHINE_RESET_CALL_MEMBER(common);
bublbobl_bankswitch_w(0x00); // force a bankswitch write of all zeroes, as /RESET clears the latch

m_ddr1 = 0;
m_ddr2 = 0;
m_ddr3 = 0;
m_ddr4 = 0;
m_port1_in = 0;
m_port2_in = 0;
m_port3_in = 0;
m_port4_in = 0;
m_port1_out = 0;
m_port2_out = 0;
m_port3_out = 0;
Expand Down Expand Up @@ -1006,8 +984,14 @@ void bublbobl_state::bublbobl(machine_config &config)
bublbobl_nomcu(config);
m_maincpu->set_irq_acknowledge_callback(FUNC(bublbobl_state::mcram_vect_r));

M6801(config, m_mcu, XTAL(4'000'000)); // actually 6801U4 - xtal is 4MHz, divided by 4 internally
m_mcu->set_addrmap(AS_PROGRAM, &bublbobl_state::mcu_map);
auto &mcu(M6801(config, "mcu", XTAL(4'000'000))); // actually 6801U4 - xtal is 4MHz, divided by 4 internally
mcu.set_addrmap(AS_PROGRAM, &bublbobl_state::mcu_map);
mcu.in_p1_cb().set_ioport("IN0");
mcu.out_p1_cb().set(FUNC(bublbobl_state::bublbobl_mcu_port1_w));
mcu.out_p2_cb().set(FUNC(bublbobl_state::bublbobl_mcu_port2_w));
mcu.out_p3_cb().set(FUNC(bublbobl_state::bublbobl_mcu_port3_w));
mcu.in_p3_cb().set(FUNC(bublbobl_state::bublbobl_mcu_port3_r));
mcu.out_p4_cb().set(FUNC(bublbobl_state::bublbobl_mcu_port4_w));

m_screen->screen_vblank().set_inputline(m_mcu, M6801_IRQ_LINE); // same clock latches the INT pin on the second Z80
}
Expand Down
38 changes: 16 additions & 22 deletions src/mame/drivers/kikikai.cpp
Expand Up @@ -8,8 +8,6 @@ KiKi KaiKai - (c) 1987 Taito
Kick & Run - (c) 1987 Taito
+ Mexico 86 (bootleg with 68705)
Ernesto Corvi
ernesto@imagina.com
Expand Down Expand Up @@ -128,6 +126,13 @@ void kikikai_state::kicknrun_sub_cpu_map(address_map &map)
map(0xc004, 0xc004).w(FUNC(kikikai_state::kicknrun_sub_output_w));
}

void kikikai_state::mcu_map(address_map &map)
{
map(0x0000, 0x0007).m(m_mcu, FUNC(m6801_cpu_device::m6801_io));
map(0x0040, 0x00ff).ram(); // internal
map(0xf000, 0xffff).rom();
}

/*************************************
*
* Input ports
Expand Down Expand Up @@ -586,7 +591,6 @@ void kikikai_state::base(machine_config &config)
m_audiocpu->set_addrmap(AS_PROGRAM, &kikikai_state::sound_map);
m_audiocpu->set_vblank_int("screen", FUNC(kikikai_state::irq0_line_hold));


Z80(config, m_subcpu, 8000000/2); /* 4 MHz, Uses 8Mhz OSC */
m_subcpu->set_addrmap(AS_PROGRAM, &kikikai_state::kicknrun_sub_cpu_map);
m_subcpu->set_vblank_int("screen", FUNC(kikikai_state::irq0_line_hold));
Expand Down Expand Up @@ -615,22 +619,6 @@ void kikikai_state::base(machine_config &config)
m_ymsnd->add_route(3, "mono", 1.00);
}



void kikikai_state::mcu_map(address_map &map)
{
map(0x0000, 0x0000).rw(FUNC(kikikai_state::kikikai_mcu_ddr1_r), FUNC(kikikai_state::kikikai_mcu_ddr1_w));
map(0x0001, 0x0001).rw(FUNC(kikikai_state::kikikai_mcu_ddr2_r), FUNC(kikikai_state::kikikai_mcu_ddr2_w));
map(0x0002, 0x0002).rw(FUNC(kikikai_state::kikikai_mcu_port1_r), FUNC(kikikai_state::kikikai_mcu_port1_w));
map(0x0003, 0x0003).rw(FUNC(kikikai_state::kikikai_mcu_port2_r), FUNC(kikikai_state::kikikai_mcu_port2_w));
map(0x0004, 0x0004).rw(FUNC(kikikai_state::kikikai_mcu_ddr3_r), FUNC(kikikai_state::kikikai_mcu_ddr3_w));
map(0x0005, 0x0005).rw(FUNC(kikikai_state::kikikai_mcu_ddr4_r), FUNC(kikikai_state::kikikai_mcu_ddr4_w));
map(0x0006, 0x0006).rw(FUNC(kikikai_state::kikikai_mcu_port3_r), FUNC(kikikai_state::kikikai_mcu_port3_w));
map(0x0007, 0x0007).rw(FUNC(kikikai_state::kikikai_mcu_port4_r), FUNC(kikikai_state::kikikai_mcu_port4_w));
map(0x0040, 0x00ff).ram();
map(0xf000, 0xffff).rom();
}

void kikikai_state::kicknrun(machine_config& config)
{
base(config);
Expand All @@ -641,6 +629,12 @@ void kikikai_state::kicknrun(machine_config& config)

M6801(config, m_mcu, XTAL(4'000'000)); // actually 6801U4 - xtal is 4MHz, divided by 4 internally
m_mcu->set_addrmap(AS_PROGRAM, &kikikai_state::mcu_map);
m_mcu->in_p1_cb().set_ioport("IN0");
m_mcu->out_p1_cb().set(FUNC(kikikai_state::kikikai_mcu_port1_w));
m_mcu->out_p2_cb().set(FUNC(kikikai_state::kikikai_mcu_port2_w));
m_mcu->out_p3_cb().set(FUNC(kikikai_state::kikikai_mcu_port3_w));
m_mcu->in_p3_cb().set(FUNC(kikikai_state::kikikai_mcu_port3_r));
m_mcu->out_p4_cb().set(FUNC(kikikai_state::kikikai_mcu_port4_w));

config.set_perfect_quantum(m_maincpu);

Expand Down Expand Up @@ -696,7 +690,7 @@ ROM_START( kikikai )
ROM_REGION( 0x10000, "audiocpu", 0 )
ROM_LOAD( "a85-11.f6", 0x0000, 0x8000, CRC(cc3539db) SHA1(4239a40fdee65cba613e4b4ec54cf7899480e366) )

ROM_REGION( 0x0800, "mcu", 0 ) /* 2k for the microcontroller (MC6801U4 type MCU) */
ROM_REGION( 0x0800, "mcu", 0 ) /* 4k for the microcontroller (MC6801U4 type MCU) */
/* MCU labeled TAITO A85 01, JPH1020P, 185, PS4 */
ROM_LOAD( "a85-01.g8", 0x0000, 0x0800, NO_DUMP )

Expand Down Expand Up @@ -745,7 +739,7 @@ ROM_START( kicknrun )
ROM_REGION( 0x10000, "audiocpu", 0 )
ROM_LOAD( "a87-06.f6", 0x0000, 0x8000, CRC(1625b587) SHA1(7336384e13c114915de5e439df5731ce3fc2054a) )

ROM_REGION( 0x10000, "mcu", 0 ) /* 2k for the microcontroller (MC6801U4 type MCU) */
ROM_REGION( 0x10000, "mcu", 0 ) /* 4k for the microcontroller (MC6801U4 type MCU) */
ROM_LOAD( "a87-01_jph1021p.h8", 0xf000, 0x1000, CRC(9451e880) SHA1(e9a505296108645f99449d391d0ebe9ac1b9984e) ) /* MCU labeled TAITO A87-01, JPH1021P, 185, PS4 */

ROM_REGION( 0x10000, "sub", 0 ) /* 64k for the cpu on the sub board */
Expand Down Expand Up @@ -776,7 +770,7 @@ ROM_START( kicknrunu )
ROM_REGION( 0x10000, "audiocpu", 0 )
ROM_LOAD( "a87-06.f6", 0x0000, 0x8000, CRC(1625b587) SHA1(7336384e13c114915de5e439df5731ce3fc2054a) )

ROM_REGION( 0x10000, "mcu", 0 ) /* 2k for the microcontroller (MC6801U4 type MCU) */
ROM_REGION( 0x10000, "mcu", 0 ) /* 4k for the microcontroller (MC6801U4 type MCU) */
ROM_LOAD( "a87-01_jph1021p.h8", 0xf000, 0x1000, CRC(9451e880) SHA1(e9a505296108645f99449d391d0ebe9ac1b9984e) ) /* MCU labeled TAITO A87-01, JPH1021P, 185, PS4 */

ROM_REGION( 0x10000, "sub", 0 ) /* 64k for the cpu on the sub board */
Expand Down
20 changes: 1 addition & 19 deletions src/mame/includes/bublbobl.h
Expand Up @@ -5,6 +5,7 @@

#pragma once

#include "cpu/m6800/m6801.h"
#include "cpu/m6805/m68705.h"
#include "cpu/mcs48/mcs48.h"
#include "machine/input_merger.h"
Expand Down Expand Up @@ -59,14 +60,7 @@ class bublbobl_state : public driver_device
/* mcu-related */

/* Bubble Bobble MCU */
uint8_t m_ddr1;
uint8_t m_ddr2;
uint8_t m_ddr3;
uint8_t m_ddr4;
uint8_t m_port1_in;
uint8_t m_port2_in;
uint8_t m_port3_in;
uint8_t m_port4_in;
uint8_t m_port1_out;
uint8_t m_port2_out;
uint8_t m_port3_out;
Expand All @@ -90,7 +84,6 @@ class bublbobl_state : public driver_device
required_device<generic_latch_8_device> m_main_to_sound;
required_device<generic_latch_8_device> m_sound_to_main;


void common_sreset(int state);
void bublbobl_bankswitch_w(uint8_t data);
void tokio_bankswitch_w(uint8_t data);
Expand All @@ -100,21 +93,10 @@ class bublbobl_state : public driver_device
void bublbobl_soundcpu_reset_w(uint8_t data);
uint8_t common_sound_semaphores_r();
IRQ_CALLBACK_MEMBER(mcram_vect_r);
uint8_t bublbobl_mcu_ddr1_r();
void bublbobl_mcu_ddr1_w(uint8_t data);
uint8_t bublbobl_mcu_ddr2_r();
void bublbobl_mcu_ddr2_w(uint8_t data);
uint8_t bublbobl_mcu_ddr3_r();
void bublbobl_mcu_ddr3_w(uint8_t data);
uint8_t bublbobl_mcu_ddr4_r();
void bublbobl_mcu_ddr4_w(uint8_t data);
uint8_t bublbobl_mcu_port1_r();
void bublbobl_mcu_port1_w(uint8_t data);
uint8_t bublbobl_mcu_port2_r();
void bublbobl_mcu_port2_w(uint8_t data);
uint8_t bublbobl_mcu_port3_r();
void bublbobl_mcu_port3_w(uint8_t data);
uint8_t bublbobl_mcu_port4_r();
void bublbobl_mcu_port4_w(uint8_t data);
uint8_t boblbobl_ic43_a_r(offs_t offset);
void boblbobl_ic43_a_w(offs_t offset, uint8_t data);
Expand Down
20 changes: 1 addition & 19 deletions src/mame/includes/kikikai.h
Expand Up @@ -52,7 +52,7 @@ class kikikai_state : public driver_device

/* devices */
optional_device<cpu_device> m_subcpu; // kicknrun / mexico86 only
optional_device<cpu_device> m_mcu;
optional_device<m6801_cpu_device> m_mcu;
required_device<ym2203_device> m_ymsnd;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
Expand All @@ -75,34 +75,16 @@ class kikikai_state : public driver_device
void mcu_map(address_map& map);

/* Kiki KaiKai / Kick 'n Run MCU */
uint8_t m_ddr1;
uint8_t m_ddr2;
uint8_t m_ddr3;
uint8_t m_ddr4;
uint8_t m_port1_in;
uint8_t m_port2_in;
uint8_t m_port3_in;
uint8_t m_port4_in;
uint8_t m_port1_out;
uint8_t m_port2_out;
uint8_t m_port3_out;
uint8_t m_port4_out;

uint8_t kikikai_mcu_ddr1_r();
void kikikai_mcu_ddr1_w(uint8_t data);
uint8_t kikikai_mcu_ddr2_r();
void kikikai_mcu_ddr2_w(uint8_t data);
uint8_t kikikai_mcu_ddr3_r();
void kikikai_mcu_ddr3_w(uint8_t data);
uint8_t kikikai_mcu_ddr4_r();
void kikikai_mcu_ddr4_w(uint8_t data);
uint8_t kikikai_mcu_port1_r();
void kikikai_mcu_port1_w(uint8_t data);
uint8_t kikikai_mcu_port2_r();
void kikikai_mcu_port2_w(uint8_t data);
uint8_t kikikai_mcu_port3_r();
void kikikai_mcu_port3_w(uint8_t data);
uint8_t kikikai_mcu_port4_r();
void kikikai_mcu_port4_w(uint8_t data);
};

Expand Down
63 changes: 1 addition & 62 deletions src/mame/machine/bublbobl.cpp
Expand Up @@ -166,53 +166,6 @@ Bubble Bobble MCU
***************************************************************************/

uint8_t bublbobl_state::bublbobl_mcu_ddr1_r()
{
return m_ddr1;
}

void bublbobl_state::bublbobl_mcu_ddr1_w(uint8_t data)
{
m_ddr1 = data;
}

uint8_t bublbobl_state::bublbobl_mcu_ddr2_r()
{
return m_ddr2;
}

void bublbobl_state::bublbobl_mcu_ddr2_w(uint8_t data)
{
m_ddr2 = data;
}

uint8_t bublbobl_state::bublbobl_mcu_ddr3_r()
{
return m_ddr3;
}

void bublbobl_state::bublbobl_mcu_ddr3_w(uint8_t data)
{
m_ddr3 = data;
}

uint8_t bublbobl_state::bublbobl_mcu_ddr4_r()
{
return m_ddr4;
}

void bublbobl_state::bublbobl_mcu_ddr4_w(uint8_t data)
{
m_ddr4 = data;
}

uint8_t bublbobl_state::bublbobl_mcu_port1_r()
{
//logerror("%04x: 6801U4 port 1 read\n", m_mcu->pc());
m_port1_in = ioport("IN0")->read();
return (m_port1_out & m_ddr1) | (m_port1_in & ~m_ddr1);
}

void bublbobl_state::bublbobl_mcu_port1_w(uint8_t data)
{
//logerror("%04x: 6801U4 port 1 write %02x\n", m_mcu->pc(), data);
Expand All @@ -231,16 +184,9 @@ void bublbobl_state::bublbobl_mcu_port1_w(uint8_t data)
}

// bit 7: select read or write shared RAM

m_port1_out = data;
}

uint8_t bublbobl_state::bublbobl_mcu_port2_r()
{
//logerror("%04x: 6801U4 port 2 read\n", m_mcu->pc());
return (m_port2_out & m_ddr2) | (m_port2_in & ~m_ddr2);
}

void bublbobl_state::bublbobl_mcu_port2_w(uint8_t data)
{
//logerror("%04x: 6801U4 port 2 write %02x\n", m_mcu->pc(), data);
Expand Down Expand Up @@ -278,7 +224,7 @@ void bublbobl_state::bublbobl_mcu_port2_w(uint8_t data)
uint8_t bublbobl_state::bublbobl_mcu_port3_r()
{
//logerror("%04x: 6801U4 port 3 read\n", m_mcu->pc());
return (m_port3_out & m_ddr3) | (m_port3_in & ~m_ddr3);
return m_port3_in;
}

void bublbobl_state::bublbobl_mcu_port3_w(uint8_t data)
Expand All @@ -287,18 +233,11 @@ void bublbobl_state::bublbobl_mcu_port3_w(uint8_t data)
m_port3_out = data;
}

uint8_t bublbobl_state::bublbobl_mcu_port4_r()
{
//logerror("%04x: 6801U4 port 4 read\n", m_mcu->pc());
return (m_port4_out & m_ddr4) | (m_port4_in & ~m_ddr4);
}

void bublbobl_state::bublbobl_mcu_port4_w(uint8_t data)
{
//logerror("%04x: 6801U4 port 4 write %02x\n", m_mcu->pc(), data);

// bits 0-7 of shared RAM address

m_port4_out = data;
}

Expand Down

0 comments on commit 57feb3f

Please sign in to comment.