summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author hap <happppp@users.noreply.github.com>2020-07-03 22:59:10 +0200
committer hap <happppp@users.noreply.github.com>2020-07-03 22:59:24 +0200
commit3582726d0016271116589ff01429b42d416110a3 (patch)
treeeec47f7f90a231daf8ec8895b02f026cf97c36b0 /src
parentca5b662bd96d7eec74c1930dfea9eef6ac8dbf62 (diff)
sothello: simplify maincpu-subcpu comms, game works again
Diffstat (limited to 'src')
-rw-r--r--src/devices/cpu/m6809/base6x09.ops4
-rw-r--r--src/mame/drivers/gticlub.cpp2
-rw-r--r--src/mame/drivers/nwk-tr.cpp2
-rw-r--r--src/mame/drivers/sothello.cpp157
-rw-r--r--src/mame/drivers/zr107.cpp2
5 files changed, 77 insertions, 90 deletions
diff --git a/src/devices/cpu/m6809/base6x09.ops b/src/devices/cpu/m6809/base6x09.ops
index 2bad6eec6f8..d41df55ecef 100644
--- a/src/devices/cpu/m6809/base6x09.ops
+++ b/src/devices/cpu/m6809/base6x09.ops
@@ -82,7 +82,7 @@ ROR8:
ASR8:
@m_temp.b.l = read_operand();
- m_cc &= ~CC_NZC;
+ m_cc &= ~CC_C;
m_cc |= (m_temp.b.l & 1) ? CC_C : 0;
m_temp.b.l = set_flags<uint8_t>(CC_NZ, ((int8_t) m_temp.b.l) >> 1);
@eat(hd6309_native_mode() ? 0 : 1);
@@ -168,7 +168,7 @@ ROR16:
ASR16:
@m_temp.b.h = read_operand(0);
@m_temp.b.l = read_operand(1);
- m_cc &= ~CC_NZC;
+ m_cc &= ~CC_C;
m_cc |= (m_temp.w & 1) ? CC_C : 0;
m_temp.w = set_flags<uint16_t>(CC_NZ, ((int16_t) m_temp.w) >> 1);
@eat(hd6309_native_mode() ? 0 : 1);
diff --git a/src/mame/drivers/gticlub.cpp b/src/mame/drivers/gticlub.cpp
index 90514217c1e..d55a26e8a6d 100644
--- a/src/mame/drivers/gticlub.cpp
+++ b/src/mame/drivers/gticlub.cpp
@@ -461,7 +461,7 @@ void gticlub_state::sysreg_w(offs_t offset, uint8_t data)
{
case 0:
case 1:
- m_pcb_digit[offset] = bitswap<8>(~data,7,0,1,2,3,4,5,6) & 0x7f;
+ m_pcb_digit[offset] = bitswap<7>(~data,0,1,2,3,4,5,6);
break;
case 3:
diff --git a/src/mame/drivers/nwk-tr.cpp b/src/mame/drivers/nwk-tr.cpp
index 9270faf21a9..a0bcb11d334 100644
--- a/src/mame/drivers/nwk-tr.cpp
+++ b/src/mame/drivers/nwk-tr.cpp
@@ -458,7 +458,7 @@ void nwktr_state::sysreg_w(offs_t offset, uint8_t data)
{
case 0:
case 1:
- m_pcb_digit[offset] = bitswap<8>(~data,7,0,1,2,3,4,5,6) & 0x7f;
+ m_pcb_digit[offset] = bitswap<7>(~data,0,1,2,3,4,5,6);
break;
case 4:
diff --git a/src/mame/drivers/sothello.cpp b/src/mame/drivers/sothello.cpp
index 49b1837ad3d..20a4980831f 100644
--- a/src/mame/drivers/sothello.cpp
+++ b/src/mame/drivers/sothello.cpp
@@ -46,11 +46,13 @@ OSC : 8.0000MHz(X1) 21.477 MHz(X2) 384kHz(X3)
#include "speaker.h"
+namespace {
+
class sothello_state : public driver_device
{
public:
- sothello_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag),
+ sothello_state(const machine_config &mconfig, device_type type, const char *tag) :
+ driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_soundcpu(*this, "soundcpu"),
m_subcpu(*this, "subcpu"),
@@ -66,18 +68,17 @@ protected:
private:
void bank_w(uint8_t data);
- uint8_t subcpu_halt_set();
- uint8_t subcpu_halt_clear();
- uint8_t subcpu_comm_status();
+ uint8_t subcpu_comm_clear_r();
+ uint8_t subcpu_comm_nmi_r();
+ uint8_t subcpu_comm_status_r();
uint8_t soundcpu_status_r();
void msm_data_w(uint8_t data);
void soundcpu_busyflag_set_w(uint8_t data);
void soundcpu_busyflag_reset_w(uint8_t data);
void soundcpu_int_clear_w(uint8_t data);
void subcpu_status_w(uint8_t data);
- uint8_t subcpu_status_r();
void msm_cfg_w(uint8_t data);
- DECLARE_WRITE_LINE_MEMBER(adpcm_int);
+ DECLARE_WRITE_LINE_MEMBER(adpcm_int_w);
void maincpu_io_map(address_map &map);
void maincpu_mem_map(address_map &map);
@@ -89,10 +90,6 @@ private:
int m_soundcpu_busy;
int m_msm_data;
- TIMER_CALLBACK_MEMBER(subcpu_suspend);
- TIMER_CALLBACK_MEMBER(subcpu_resume);
- void unlock_shared_ram();
-
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_soundcpu;
required_device<cpu_device> m_subcpu;
@@ -100,14 +97,6 @@ private:
required_memory_bank m_mainbank;
};
-
-#define VDP_MEM 0x40000
-
-
-
-
-/* main Z80 */
-
void sothello_state::machine_start()
{
m_mainbank->configure_entries(0, 4, memregion("maincpu")->base() + 0x8000, 0x4000);
@@ -117,6 +106,21 @@ void sothello_state::machine_start()
save_item(NAME(m_msm_data));
}
+void sothello_state::machine_reset()
+{
+ m_subcpu_status = 0;
+ m_soundcpu_busy = 0;
+ m_msm_data = 0;
+}
+
+
+
+/******************************************************************************
+ I/O & Address Maps
+******************************************************************************/
+
+// main Z80
+
void sothello_state::bank_w(uint8_t data)
{
int bank=0;
@@ -130,33 +134,21 @@ void sothello_state::bank_w(uint8_t data)
m_mainbank->set_entry(bank);
}
-TIMER_CALLBACK_MEMBER(sothello_state::subcpu_suspend)
-{
- m_subcpu->suspend(SUSPEND_REASON_HALT, 1);
-}
-
-TIMER_CALLBACK_MEMBER(sothello_state::subcpu_resume)
+uint8_t sothello_state::subcpu_comm_clear_r()
{
- m_subcpu->resume(SUSPEND_REASON_HALT);
- m_subcpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero);
-}
-
-uint8_t sothello_state::subcpu_halt_set()
-{
- machine().scheduler().synchronize(timer_expired_delegate(FUNC(sothello_state::subcpu_suspend), this));
- m_subcpu_status|=2;
+ if(!machine().side_effects_disabled())
+ m_subcpu_status = 0;
return 0;
}
-uint8_t sothello_state::subcpu_halt_clear()
+uint8_t sothello_state::subcpu_comm_nmi_r()
{
- machine().scheduler().synchronize(timer_expired_delegate(FUNC(sothello_state::subcpu_resume), this));
- m_subcpu_status&=~1;
- m_subcpu_status&=~2;
+ if(!machine().side_effects_disabled())
+ m_subcpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero);
return 0;
}
-uint8_t sothello_state::subcpu_comm_status()
+uint8_t sothello_state::subcpu_comm_status_r()
{
return m_subcpu_status;
}
@@ -180,19 +172,26 @@ void sothello_state::maincpu_io_map(address_map &map)
map(0x00, 0x0f).portr("INPUT1");
map(0x10, 0x1f).portr("INPUT2");
map(0x20, 0x2f).portr("SYSTEM");
- map(0x30, 0x30).r(FUNC(sothello_state::subcpu_halt_set));
- map(0x31, 0x31).r(FUNC(sothello_state::subcpu_halt_clear));
- map(0x32, 0x32).r(FUNC(sothello_state::subcpu_comm_status));
+ map(0x30, 0x30).r(FUNC(sothello_state::subcpu_comm_clear_r));
+ map(0x31, 0x31).r(FUNC(sothello_state::subcpu_comm_nmi_r));
+ map(0x32, 0x32).r(FUNC(sothello_state::subcpu_comm_status_r));
map(0x33, 0x33).r(FUNC(sothello_state::soundcpu_status_r));
map(0x40, 0x4f).w("soundlatch", FUNC(generic_latch_8_device::write));
map(0x50, 0x50).w(FUNC(sothello_state::bank_w));
- map(0x60, 0x61).mirror(0x02).rw("ymsnd", FUNC(ym2203_device::read), FUNC(ym2203_device::write));
- // not sure, but the A1 line is ignored, code @ $8b8
+ map(0x60, 0x61).mirror(0x02).rw("ymsnd", FUNC(ym2203_device::read), FUNC(ym2203_device::write)); // not sure, but the A1 line is ignored, code @ $8b8
map(0x70, 0x73).rw("v9938", FUNC(v9938_device::read), FUNC(v9938_device::write));
}
+
// sound Z80
+WRITE_LINE_MEMBER(sothello_state::adpcm_int_w)
+{
+ // only 4 bits are used
+ m_msm->data_w(m_msm_data & 0x0f);
+ m_soundcpu->set_input_line(0, ASSERT_LINE);
+}
+
void sothello_state::msm_cfg_w(uint8_t data)
{
/*
@@ -201,7 +200,7 @@ void sothello_state::msm_cfg_w(uint8_t data)
bit 2 = S2 1
bit 3 = S1 2
*/
- m_msm->playmode_w(bitswap<8>((data>>1), 7,6,5,4,3,0,1,2));
+ m_msm->playmode_w(bitswap<3>(data,1,2,3));
m_msm->reset_w(data & 1);
}
@@ -242,39 +241,28 @@ void sothello_state::soundcpu_io_map(address_map &map)
map(0x05, 0x05).w(FUNC(sothello_state::soundcpu_int_clear_w));
}
-// sub 6809
-void sothello_state::unlock_shared_ram()
-{
- if(!m_subcpu->suspended(SUSPEND_REASON_HALT))
- {
- m_subcpu_status|=1;
- }
- else
- {
- //logerror("%s Sub cpu active!\n",machine().describe_context());
- }
-}
+// sub 6809
void sothello_state::subcpu_status_w(uint8_t data)
{
- unlock_shared_ram();
-}
-
-uint8_t sothello_state::subcpu_status_r()
-{
- unlock_shared_ram();
- return 0;
+ m_subcpu_status = 3;
}
void sothello_state::subcpu_mem_map(address_map &map)
{
- map(0x0000, 0x1fff).rw(FUNC(sothello_state::subcpu_status_r), FUNC(sothello_state::subcpu_status_w));
+ map(0x0000, 0x0000).w(FUNC(sothello_state::subcpu_status_w)).nopr();
map(0x2000, 0x77ff).ram();
- map(0x7800, 0x7fff).ram().share("mainsub"); // upper 0x800 of 6264 is shared with main cpu
+ map(0x7800, 0x7fff).ram().share("mainsub"); // upper 0x800 of 6264 is shared with main cpu
map(0x8000, 0xffff).rom().region("subcpu", 0);
}
+
+
+/******************************************************************************
+ Input Ports
+******************************************************************************/
+
static INPUT_PORTS_START( sothello )
PORT_START("INPUT1")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1)
@@ -341,19 +329,10 @@ static INPUT_PORTS_START( sothello )
INPUT_PORTS_END
-WRITE_LINE_MEMBER(sothello_state::adpcm_int)
-{
- // only 4 bits are used
- m_msm->data_w(m_msm_data & 0x0f);
- m_soundcpu->set_input_line(0, ASSERT_LINE);
-}
-void sothello_state::machine_reset()
-{
- m_subcpu_status = 0;
- m_soundcpu_busy = 0;
- m_msm_data = 0;
-}
+/******************************************************************************
+ Machine Configs
+******************************************************************************/
void sothello_state::sothello(machine_config &config)
{
@@ -369,12 +348,12 @@ void sothello_state::sothello(machine_config &config)
MC6809(config, m_subcpu, XTAL(8'000'000)); // divided by 4 internally
m_subcpu->set_addrmap(AS_PROGRAM, &sothello_state::subcpu_mem_map);
- config.set_maximum_quantum(attotime::from_hz(600));
+ config.set_perfect_quantum(m_maincpu);
// video hardware
v9938_device &v9938(V9938(config, "v9938", XTAL(21'477'272)));
v9938.set_screen_ntsc("screen");
- v9938.set_vram_size(VDP_MEM);
+ v9938.set_vram_size(0x40000);
v9938.int_cb().set_inputline("maincpu", 0);
SCREEN(config, "screen", SCREEN_TYPE_RASTER);
@@ -393,16 +372,16 @@ void sothello_state::sothello(machine_config &config)
ymsnd.add_route(3, "mono", 0.50);
MSM5205(config, m_msm, XTAL(384'000));
- m_msm->vck_legacy_callback().set(FUNC(sothello_state::adpcm_int)); // interrupt function
- m_msm->set_prescaler_selector(msm5205_device::S48_4B); // changed on the fly
+ m_msm->vck_legacy_callback().set(FUNC(sothello_state::adpcm_int_w)); // interrupt function
+ m_msm->set_prescaler_selector(msm5205_device::S48_4B); // changed on the fly
m_msm->add_route(ALL_OUTPUTS, "mono", 1.0);
}
-/***************************************************************************
- Game driver(s)
-***************************************************************************/
+/******************************************************************************
+ ROM Definitions
+******************************************************************************/
ROM_START( sothello )
ROM_REGION( 0x18000, "maincpu", 0 )
@@ -418,4 +397,12 @@ ROM_START( sothello )
ROM_LOAD( "6.7f", 0x0000, 0x8000, CRC(ee80fc78) SHA1(9a9d7925847d7a36930f0761c70f67a9affc5e7c) )
ROM_END
-GAME( 1986, sothello, 0, sothello, sothello, sothello_state, empty_init, ROT0, "Success / Fujiwara", "Super Othello", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // long time regression, see MT06033
+} // anonymous namespace
+
+
+
+/******************************************************************************
+ Drivers
+******************************************************************************/
+
+GAME( 1986, sothello, 0, sothello, sothello, sothello_state, empty_init, ROT0, "Success / Fujiwara", "Super Othello", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/zr107.cpp b/src/mame/drivers/zr107.cpp
index df3a81a72b4..aeeaacf4d81 100644
--- a/src/mame/drivers/zr107.cpp
+++ b/src/mame/drivers/zr107.cpp
@@ -392,7 +392,7 @@ void zr107_state::sysreg_w(offs_t offset, uint8_t data)
{
case 0: /* 7seg LEDs on PCB */
case 1:
- m_pcb_digit[offset] = bitswap<8>(~data,7,0,1,2,3,4,5,6) & 0x7f;
+ m_pcb_digit[offset] = bitswap<7>(~data,0,1,2,3,4,5,6);
break;
case 2: /* Parallel data register */