diff --git a/src/devices/cpu/m6800/m6800.cpp b/src/devices/cpu/m6800/m6800.cpp index aefd8b38cbb..17e9cfbd5d4 100644 --- a/src/devices/cpu/m6800/m6800.cpp +++ b/src/devices/cpu/m6800/m6800.cpp @@ -29,6 +29,8 @@ TODO: * 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) *****************************************************************************/ diff --git a/src/mame/drivers/bublbobl.cpp b/src/mame/drivers/bublbobl.cpp index d6107629daa..2b3e3d270b0 100644 --- a/src/mame/drivers/bublbobl.cpp +++ b/src/mame/drivers/bublbobl.cpp @@ -270,7 +270,6 @@ TODO: #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" @@ -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(); } @@ -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)); @@ -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; @@ -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 } diff --git a/src/mame/drivers/kikikai.cpp b/src/mame/drivers/kikikai.cpp index e945c4665e7..a3913fe8686 100644 --- a/src/mame/drivers/kikikai.cpp +++ b/src/mame/drivers/kikikai.cpp @@ -8,8 +8,6 @@ KiKi KaiKai - (c) 1987 Taito Kick & Run - (c) 1987 Taito + Mexico 86 (bootleg with 68705) - - Ernesto Corvi ernesto@imagina.com @@ -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 @@ -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)); @@ -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); @@ -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); @@ -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 ) @@ -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 */ @@ -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 */ diff --git a/src/mame/includes/bublbobl.h b/src/mame/includes/bublbobl.h index ad9662cbc43..7b79eca4185 100644 --- a/src/mame/includes/bublbobl.h +++ b/src/mame/includes/bublbobl.h @@ -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" @@ -59,14 +60,7 @@ public: /* 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; @@ -90,7 +84,6 @@ public: required_device m_main_to_sound; required_device m_sound_to_main; - void common_sreset(int state); void bublbobl_bankswitch_w(uint8_t data); void tokio_bankswitch_w(uint8_t data); @@ -100,21 +93,10 @@ public: 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); diff --git a/src/mame/includes/kikikai.h b/src/mame/includes/kikikai.h index 3658a86de16..b0a6b0e9545 100644 --- a/src/mame/includes/kikikai.h +++ b/src/mame/includes/kikikai.h @@ -52,7 +52,7 @@ private: /* devices */ optional_device m_subcpu; // kicknrun / mexico86 only - optional_device m_mcu; + optional_device m_mcu; required_device m_ymsnd; required_device m_gfxdecode; required_device m_palette; @@ -75,34 +75,16 @@ private: 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); }; diff --git a/src/mame/machine/bublbobl.cpp b/src/mame/machine/bublbobl.cpp index 20afd11c217..4cab1e64a47 100644 --- a/src/mame/machine/bublbobl.cpp +++ b/src/mame/machine/bublbobl.cpp @@ -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); @@ -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); @@ -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) @@ -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; } diff --git a/src/mame/machine/kikikai.cpp b/src/mame/machine/kikikai.cpp index 028af58b4e9..7c79653ff46 100644 --- a/src/mame/machine/kikikai.cpp +++ b/src/mame/machine/kikikai.cpp @@ -348,53 +348,6 @@ Kiki KaiKai / Kick 'n Run MCU ***************************************************************************/ -uint8_t kikikai_state::kikikai_mcu_ddr1_r() -{ - return m_ddr1; -} - -void kikikai_state::kikikai_mcu_ddr1_w(uint8_t data) -{ - m_ddr1 = data; -} - -uint8_t kikikai_state::kikikai_mcu_ddr2_r() -{ - return m_ddr2; -} - -void kikikai_state::kikikai_mcu_ddr2_w(uint8_t data) -{ - m_ddr2 = data; -} - -uint8_t kikikai_state::kikikai_mcu_ddr3_r() -{ - return m_ddr3; -} - -void kikikai_state::kikikai_mcu_ddr3_w(uint8_t data) -{ - m_ddr3 = data; -} - -uint8_t kikikai_state::kikikai_mcu_ddr4_r() -{ - return m_ddr4; -} - -void kikikai_state::kikikai_mcu_ddr4_w(uint8_t data) -{ - m_ddr4 = data; -} - -uint8_t kikikai_state::kikikai_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 kikikai_state::kikikai_mcu_port1_w(uint8_t data) { //logerror("%04x: 6801U4 port 1 write %02x\n", m_mcu->pc(), data); @@ -413,16 +366,9 @@ void kikikai_state::kikikai_mcu_port1_w(uint8_t data) machine().bookkeeping().coin_lockout_w(0, ~data & 0x20); // bit 7: ? (set briefly while MCU boots) - m_port1_out = data; } -uint8_t kikikai_state::kikikai_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 kikikai_state::kikikai_mcu_port2_w(uint8_t data) { //logerror("%04x: 6801U4 port 2 write %02x\n", m_mcu->pc(), data); @@ -459,7 +405,7 @@ void kikikai_state::kikikai_mcu_port2_w(uint8_t data) uint8_t kikikai_state::kikikai_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 kikikai_state::kikikai_mcu_port3_w(uint8_t data) @@ -468,17 +414,9 @@ void kikikai_state::kikikai_mcu_port3_w(uint8_t data) m_port3_out = data; } -uint8_t kikikai_state::kikikai_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 kikikai_state::kikikai_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; }