gsword WIP:

* Split out gsword and josvolly functionalit from base driver class
* Hooked up josvolly MCUs for communication between CPUs
* Added DIP locations to josvolly based on test mode
* Named unknown DIP settings after the location they control in main RAM
* Hooked up josvolly MCUs for communication, still preliminary
* Marked josvolly NOT_WORKING, simulation still present for reference

(nw) The MCU code only makes sense if there are a pair of them hooked up
together.  There are effectively two programs, selected by whether P27
is tied high (master) or low (slave) at reset.  Master and slave have
all corresponding P1 lines connected, master P20 connects to slave
TEST0, and master P21 connects to slave TEST1.  You can see commands
and responses pass between the master and slave, it's very chatty.  Test
mode seems to work, but game mode fails a check after a couple of
seconds and dumps status codes on the screen.  There's still something
missing in the MCU hookup, and I'd guess there's something attached to
the AY output ports, too.
This commit is contained in:
Vas Crabb 2017-01-01 18:25:35 +11:00
parent 9d329bfc0c
commit 1b544b42a2
3 changed files with 474 additions and 278 deletions

View File

@ -1,5 +1,5 @@
// license:BSD-3-Clause // license:BSD-3-Clause
// copyright-holders:Steve Ellenoff,Jarek Parchanski // copyright-holders:Steve Ellenoff,Jarek Parchanski,Vas Crabb
/* /*
Great Swordsman (Taito) 1984 Great Swordsman (Taito) 1984
Joshi Volleyball (Taito) 1983 Joshi Volleyball (Taito) 1983
@ -9,7 +9,7 @@ TODO:
-joshi volleyball -joshi volleyball
-The incomplete graphic -The incomplete graphic
-The implementation of DAC sound ? -The implementation of DAC sound ?
-MCU code DUMP and emulation -MCU hookup is incomplete
-The true interrupt circuit of SUB CPU -The true interrupt circuit of SUB CPU
-unknown ROM (BANK ROM of sub-cpu ?) -unknown ROM (BANK ROM of sub-cpu ?)
@ -146,6 +146,7 @@ reg: 0->1 (main->2nd) / : (1->0) 2nd->main :
#include "emu.h" #include "emu.h"
#include "includes/gsword.h" #include "includes/gsword.h"
#include "cpu/mcs48/mcs48.h"
#include "cpu/z80/z80.h" #include "cpu/z80/z80.h"
#include "machine/i8255.h" #include "machine/i8255.h"
#include "machine/tait8741.h" #include "machine/tait8741.h"
@ -166,15 +167,43 @@ int gsword_state::coins_in(void)
} }
#endif #endif
#include "cpu/z80/z80.h" void gsword_state_base::machine_start()
{
save_item(NAME(m_fake8910_0));
save_item(NAME(m_fake8910_1));
}
void gsword_state_base::machine_reset()
{
}
WRITE8_MEMBER(gsword_state_base::ay8910_control_port_0_w)
{
m_ay0->address_w(space,offset,data);
m_fake8910_0 = data;
}
WRITE8_MEMBER(gsword_state_base::ay8910_control_port_1_w)
{
m_ay1->address_w(space,offset,data);
m_fake8910_1 = data;
}
READ8_MEMBER(gsword_state_base::fake_0_r)
{
return m_fake8910_0+1;
}
READ8_MEMBER(gsword_state_base::fake_1_r)
{
return m_fake8910_1+1;
}
/* CPU 2 memory hack */ /* CPU 2 memory hack */
/* (402E) timeout upcount must be under 0AH */ /* (402E) timeout upcount must be under 0AH */
/* (4004,4005) clear down counter , if (4004,4005)==0 then (402E)=0 */ /* (4004,4005) clear down counter , if (4004,4005)==0 then (402E)=0 */
READ8_MEMBER(gsword_state::gsword_hack_r) READ8_MEMBER(gsword_state::hack_r)
{ {
uint8_t data = m_cpu2_ram[offset + 4]; u8 const data = m_cpu2_ram[offset + 4];
/*if(offset==1)osd_printf_debug("CNT %02X%02X\n",m_cpu2_ram[5],m_cpu2_ram[4]); */ /*if(offset==1)osd_printf_debug("CNT %02X%02X\n",m_cpu2_ram[5],m_cpu2_ram[4]); */
@ -190,7 +219,55 @@ READ8_MEMBER(gsword_state::gsword_hack_r)
return data; return data;
} }
READ8_MEMBER(gsword_state::gsword_8741_2_r ) WRITE8_MEMBER(gsword_state::nmi_set_w)
{
/* osd_printf_debug("AY write %02X\n",data);*/
m_protect_hack = (data & 0x80) ? false : true;
#if 0
/* An actual circuit isn't known. */
/* write ff,02,ff,fe, 17 x 0d,0f */
m_nmi_enable = ((data>>7) & (data&1) &1) == 0;
#else
switch(data)
{
case 0xff:
m_nmi_enable = false; /* NMI must be disabled */
break;
case 0x02:
m_nmi_enable = false; /* ANY */
break;
case 0x0d:
m_nmi_enable = true;
break;
case 0x0f:
m_nmi_enable = true; /* NMI must be enabled */
break;
case 0xfe:
m_nmi_enable = true; /* NMI must be enabled */
break;
}
/* bit1= nmi disable , for ram check */
logerror("NMI control %02x\n",data);
#endif
}
WRITE8_MEMBER(gsword_state::sound_command_w)
{
m_soundlatch->write(space, 0, data);
m_audiocpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE);
}
WRITE8_MEMBER(gsword_state::adpcm_data_w)
{
m_msm->data_w(data & 0x0f); // bit 0..3
m_msm->reset_w(BIT(data, 5)); // bit 5
m_msm->vclk_w(BIT(data, 4)); // bit 4
}
READ8_MEMBER(gsword_state::i8741_2_r )
{ {
switch (offset) switch (offset)
{ {
@ -207,7 +284,7 @@ READ8_MEMBER(gsword_state::gsword_8741_2_r )
return 0; return 0;
} }
READ8_MEMBER(gsword_state::gsword_8741_3_r ) READ8_MEMBER(gsword_state::i8741_3_r )
{ {
switch (offset) switch (offset)
{ {
@ -223,99 +300,166 @@ READ8_MEMBER(gsword_state::gsword_8741_3_r )
return 0; return 0;
} }
void gsword_state::machine_start() INTERRUPT_GEN_MEMBER(gsword_state::sound_interrupt)
{
save_item(NAME(m_fake8910_0));
save_item(NAME(m_fake8910_1));
save_item(NAME(m_nmi_enable));
save_item(NAME(m_protect_hack));
}
void gsword_state::machine_reset()
{
m_coins = 0;
/* snd CPU mask NMI during reset phase */
m_nmi_enable = 0;
m_protect_hack = 0;
}
INTERRUPT_GEN_MEMBER(gsword_state::gsword_snd_interrupt)
{ {
if (m_nmi_enable) if (m_nmi_enable)
device.execute().set_input_line(INPUT_LINE_NMI, PULSE_LINE); device.execute().set_input_line(INPUT_LINE_NMI, PULSE_LINE);
} }
WRITE8_MEMBER(gsword_state::nmi_set_w) DRIVER_INIT_MEMBER(gsword_state, gsword)
{ {
/* osd_printf_debug("AY write %02X\n",data);*/
m_protect_hack = (data&0x80) ? 0 : 1;
#if 0 #if 0
/* An actual circuit isn't known. */ uint8_t *ROM2 = memregion("sub")->base();
/* write ff,02,ff,fe, 17 x 0d,0f */ ROM2[0x1da] = 0xc3; /* patch for rom self check */
m_nmi_enable = ((data>>7) & (data&1) &1) == 0;
ROM2[0x71e] = 0; /* patch for sound protection or time out function */
#else ROM2[0x71f] = 0;
switch(data) #endif
{ #if 1
case 0xff: /* hack for sound protection or time out function */
m_nmi_enable = 0; /* NMI must be disabled */ m_subcpu->space(AS_PROGRAM).install_read_handler(0x4004, 0x4005, read8_delegate(FUNC(gsword_state::hack_r),this));
break;
case 0x02:
m_nmi_enable = 0; /* ANY */
break;
case 0x0d:
m_nmi_enable = 1;
break;
case 0x0f:
m_nmi_enable = 1; /* NMI must be enabled */
break;
case 0xfe:
m_nmi_enable = 1; /* NMI must be enabled */
break;
}
/* bit1= nmi disable , for ram check */
logerror("NMI control %02x\n",data);
#endif #endif
} }
WRITE8_MEMBER(gsword_state::ay8910_control_port_0_w) DRIVER_INIT_MEMBER(gsword_state, gsword2)
{ {
m_ay0->address_w(space,offset,data); #if 0
m_fake8910_0 = data; uint8_t *ROM2 = memregion("sub")->base();
}
WRITE8_MEMBER(gsword_state::ay8910_control_port_1_w) ROM2[0x1da] = 0xc3; /* patch for rom self check */
{ ROM2[0x726] = 0; /* patch for sound protection or time out function */
m_ay1->address_w(space,offset,data); ROM2[0x727] = 0;
m_fake8910_1 = data; #endif
#if 1
/* hack for sound protection or time out function */
m_subcpu->space(AS_PROGRAM).install_read_handler(0x4004, 0x4005, read8_delegate(FUNC(gsword_state::hack_r),this));
#endif
} }
READ8_MEMBER(gsword_state::fake_0_r) void gsword_state::machine_start()
{ {
return m_fake8910_0+1; gsword_state_base::machine_start();
}
READ8_MEMBER(gsword_state::fake_1_r) save_item(NAME(m_protect_hack));
{ save_item(NAME(m_nmi_enable));
return m_fake8910_1+1;
} }
WRITE8_MEMBER(gsword_state::gsword_adpcm_data_w) void gsword_state::machine_reset()
{ {
m_msm->data_w (data & 0x0f); /* bit 0..3 */ gsword_state_base::machine_reset();
m_msm->reset_w(BIT(data, 5)); /* bit 5 */
m_msm->vclk_w(BIT(data, 4)); /* bit 4 */ m_protect_hack = false;
m_nmi_enable = false;
} }
WRITE8_MEMBER(gsword_state::adpcm_soundcommand_w)
READ8_MEMBER(josvolly_state::mcu1_p1_r)
{
// the two MCUs appear to have port 1 tied together
return m_mcu1_p1 & m_mcu2_p1;
}
READ8_MEMBER(josvolly_state::mcu1_p2_r)
{
// p27 needs to float high for the MCU to start in the right mode
// p20 and p21 drive the test inputs of the other MCU
// if DIPSW1:8 is allowed to pull p27 low, the game won't even boot to test mode
// DIPSW1:1 and DIPSW1:2 are shown in test mode, but switching them on will break comms
return 0x80U | ioport("DSW1")->read();
}
READ8_MEMBER(josvolly_state::mcu2_p1_r)
{
// the two MCUs appear to have port 1 tied together
return m_mcu1_p1 & m_mcu2_p1;
}
READ8_MEMBER(josvolly_state::mcu2_p2_r)
{
// p27 needs to be tied low for the MCU to start in the right mode
return 0x7fU & ioport("DSW2")->read();
}
READ8_MEMBER(josvolly_state::mcu2_test_r)
{
// TEST0 and TEST1 are driven by P20 and P21 on the other MCU
return BIT(m_mcu1_p2, offset);
}
WRITE8_MEMBER(josvolly_state::cpu2_nmi_enable_w)
{
m_cpu2_nmi_enable = true;
}
WRITE8_MEMBER(josvolly_state::cpu2_irq_clear_w)
{
m_audiocpu->set_input_line(INPUT_LINE_IRQ0, CLEAR_LINE);
}
WRITE8_MEMBER(josvolly_state::mcu1_p1_w)
{
if (data != m_mcu1_p1)
{
logerror("mcu1 p1 = 0x%02x\n", data);
m_mcu1_p1 = data;
}
}
WRITE8_MEMBER(josvolly_state::mcu1_p2_w)
{
if (data != m_mcu1_p2)
{
logerror("mcu1 p2 = 0x%02x\n", data);
// the second CPU somehow gets an NMI when data is available
// it's probably implemented by the logic arrays somehow
// this is just a hacky guess at how it works
if (m_cpu2_nmi_enable && (data & (data ^ m_mcu1_p2) & 0x01))
{ {
m_soundlatch->write(space, 0, data);
m_audiocpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE); m_audiocpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE);
m_cpu2_nmi_enable = false;
}
m_mcu1_p2 = data;
}
}
WRITE8_MEMBER(josvolly_state::mcu2_p1_w)
{
if (data != m_mcu2_p1)
{
logerror("mcu2 p1 = 0x%02x\n", data);
m_mcu2_p1 = data;
}
}
WRITE8_MEMBER(josvolly_state::mcu2_p2_w)
{
logerror("mcu2 p2 = 0x%02x\n", data);
}
void josvolly_state::machine_start()
{
gsword_state_base::machine_start();
save_item(NAME(m_cpu2_nmi_enable));
save_item(NAME(m_mcu1_p1));
save_item(NAME(m_mcu1_p2));
save_item(NAME(m_mcu2_p1));
}
void josvolly_state::machine_reset()
{
gsword_state_base::machine_reset();
m_cpu2_nmi_enable = false;
m_mcu1_p1 = 0xffU;
m_mcu1_p2 = 0xffU;
m_mcu2_p1 = 0xffU;
} }
static ADDRESS_MAP_START( cpu1_map, AS_PROGRAM , 8, gsword_state ) static ADDRESS_MAP_START( cpu1_map, AS_PROGRAM , 8, gsword_state_base )
AM_RANGE(0x0000, 0x8fff) AM_ROM AM_RANGE(0x0000, 0x8fff) AM_ROM
AM_RANGE(0x9000, 0x9fff) AM_RAM AM_RANGE(0x9000, 0x9fff) AM_RAM
AM_RANGE(0xa000, 0xa37f) AM_RAM AM_RANGE(0xa000, 0xa37f) AM_RAM
@ -329,21 +473,16 @@ static ADDRESS_MAP_START( cpu1_map, AS_PROGRAM , 8, gsword_state )
AM_RANGE(0xb000, 0xb7ff) AM_RAM_WRITE(videoram_w) AM_SHARE("videoram") AM_RANGE(0xb000, 0xb7ff) AM_RAM_WRITE(videoram_w) AM_SHARE("videoram")
ADDRESS_MAP_END ADDRESS_MAP_END
static ADDRESS_MAP_START( cpu1_io_map, AS_IO, 8, gsword_state ) static ADDRESS_MAP_START( cpu1_io_map, AS_IO, 8, gsword_state )
ADDRESS_MAP_GLOBAL_MASK(0xff) ADDRESS_MAP_GLOBAL_MASK(0xff)
AM_RANGE(0x7e, 0x7f) AM_DEVREADWRITE("taito8741", taito8741_4pack_device, read_0, write_0) AM_RANGE(0x7e, 0x7f) AM_DEVREADWRITE("taito8741", taito8741_4pack_device, read_0, write_0)
ADDRESS_MAP_END ADDRESS_MAP_END
static ADDRESS_MAP_START( josvolly_cpu1_io_map, AS_IO, 8, gsword_state )
ADDRESS_MAP_GLOBAL_MASK(0xff)
AM_RANGE(0x7e, 0x7f) AM_DEVREADWRITE("josvolly_8741", josvolly8741_4pack_device, read_0, write_0)
ADDRESS_MAP_END
//
static ADDRESS_MAP_START( cpu2_map, AS_PROGRAM, 8, gsword_state ) static ADDRESS_MAP_START( cpu2_map, AS_PROGRAM, 8, gsword_state )
AM_RANGE(0x0000, 0x3fff) AM_ROM AM_RANGE(0x0000, 0x3fff) AM_ROM
AM_RANGE(0x4000, 0x43ff) AM_RAM AM_SHARE("cpu2_ram") AM_RANGE(0x4000, 0x43ff) AM_RAM AM_SHARE("cpu2_ram")
AM_RANGE(0x6000, 0x6000) AM_WRITE(adpcm_soundcommand_w) AM_RANGE(0x6000, 0x6000) AM_WRITE(sound_command_w)
ADDRESS_MAP_END ADDRESS_MAP_END
static ADDRESS_MAP_START( cpu2_io_map, AS_IO, 8, gsword_state ) static ADDRESS_MAP_START( cpu2_io_map, AS_IO, 8, gsword_state )
@ -355,44 +494,58 @@ static ADDRESS_MAP_START( cpu2_io_map, AS_IO, 8, gsword_state )
AM_RANGE(0x61, 0x61) AM_DEVREADWRITE("ay1", ay8910_device, data_r, data_w) AM_RANGE(0x61, 0x61) AM_DEVREADWRITE("ay1", ay8910_device, data_r, data_w)
AM_RANGE(0x80, 0x80) AM_READWRITE(fake_1_r, ay8910_control_port_1_w) AM_RANGE(0x80, 0x80) AM_READWRITE(fake_1_r, ay8910_control_port_1_w)
AM_RANGE(0x81, 0x81) AM_DEVREADWRITE("ay2", ay8910_device, data_r, data_w) AM_RANGE(0x81, 0x81) AM_DEVREADWRITE("ay2", ay8910_device, data_r, data_w)
//
AM_RANGE(0xe0, 0xe0) AM_READNOP /* ?? */ AM_RANGE(0xe0, 0xe0) AM_READNOP /* ?? */
AM_RANGE(0xa0, 0xa0) AM_WRITENOP /* ?? */ AM_RANGE(0xa0, 0xa0) AM_WRITENOP /* ?? */
AM_RANGE(0xe0, 0xe0) AM_WRITENOP /* watchdog? */ AM_RANGE(0xe0, 0xe0) AM_WRITENOP /* watchdog? */
ADDRESS_MAP_END ADDRESS_MAP_END
//
static ADDRESS_MAP_START( cpu3_map, AS_PROGRAM, 8, gsword_state ) static ADDRESS_MAP_START( cpu3_map, AS_PROGRAM, 8, gsword_state )
AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0x0000, 0x7fff) AM_ROM
AM_RANGE(0x8000, 0x8000) AM_WRITE(gsword_adpcm_data_w) AM_RANGE(0x8000, 0x8000) AM_WRITE(adpcm_data_w)
AM_RANGE(0xa000, 0xa000) AM_DEVREAD("soundlatch", generic_latch_8_device, read) AM_RANGE(0xa000, 0xa000) AM_DEVREAD("soundlatch", generic_latch_8_device, read)
ADDRESS_MAP_END ADDRESS_MAP_END
static ADDRESS_MAP_START( josvolly_cpu2_map, AS_PROGRAM, 8, gsword_state ) static ADDRESS_MAP_START( josvolly_cpu1_io_map, AS_IO, 8, josvolly_state )
ADDRESS_MAP_GLOBAL_MASK(0xff)
AM_RANGE(0x7e, 0x7f) AM_DEVREADWRITE("mcu1", upi41_cpu_device, upi41_master_r, upi41_master_w)
ADDRESS_MAP_END
static ADDRESS_MAP_START( josvolly_cpu2_map, AS_PROGRAM, 8, josvolly_state )
AM_RANGE(0x0000, 0x3fff) AM_ROM AM_RANGE(0x0000, 0x3fff) AM_ROM
AM_RANGE(0x4000, 0x43ff) AM_RAM AM_SHARE("cpu2_ram") AM_RANGE(0x4000, 0x43ff) AM_RAM AM_SHARE("cpu2_ram")
/* NEC D8255A with silkscreen removed and replaced with "AA 007" */ /* NEC D8255A with silkscreen removed and replaced with "AA 007" */
AM_RANGE(0x8000, 0x8003) AM_DEVREADWRITE("josvolly_aa_007", i8255_device, read, write) AM_RANGE(0x8000, 0x8003) AM_DEVREADWRITE("aa_007", i8255_device, read, write)
// AM_RANGE(0x6000, 0x6000) AM_WRITE(adpcm_soundcommand_w) // AM_RANGE(0x6000, 0x6000) AM_WRITE(adpcm_soundcommand_w)
AM_RANGE(0xA000, 0xA001) AM_DEVREADWRITE("josvolly_8741", josvolly8741_4pack_device, read_1, write_1) AM_RANGE(0xA000, 0xA001) AM_DEVREADWRITE("mcu2", upi41_cpu_device, upi41_master_r, upi41_master_w)
ADDRESS_MAP_END ADDRESS_MAP_END
static ADDRESS_MAP_START( josvolly_cpu2_io_map, AS_IO, 8, gsword_state ) static ADDRESS_MAP_START( josvolly_cpu2_io_map, AS_IO, 8, josvolly_state )
ADDRESS_MAP_GLOBAL_MASK(0xff) ADDRESS_MAP_GLOBAL_MASK(0xff)
AM_RANGE(0x00, 0x00) AM_READWRITE(fake_0_r, ay8910_control_port_0_w) AM_RANGE(0x00, 0x00) AM_READWRITE(fake_0_r, ay8910_control_port_0_w)
AM_RANGE(0x01, 0x01) AM_DEVREADWRITE("ay1", ay8910_device, data_r, data_w) AM_RANGE(0x01, 0x01) AM_DEVREADWRITE("ay1", ay8910_device, data_r, data_w)
AM_RANGE(0x40, 0x40) AM_READWRITE(fake_1_r, ay8910_control_port_1_w) AM_RANGE(0x40, 0x40) AM_READWRITE(fake_1_r, ay8910_control_port_1_w)
AM_RANGE(0x41, 0x41) AM_DEVREADWRITE("ay2", ay8910_device, data_r, data_w) AM_RANGE(0x41, 0x41) AM_DEVREADWRITE("ay2", ay8910_device, data_r, data_w)
AM_RANGE(0x81, 0x81) AM_DEVWRITE("josvolly_8741", josvolly8741_4pack_device, nmi_enable_w) AM_RANGE(0x81, 0x81) AM_WRITE(cpu2_nmi_enable_w);
AM_RANGE(0xC1, 0xC1) AM_NOP // irq clear AM_RANGE(0xC1, 0xC1) AM_WRITE(cpu2_irq_clear_w);
ADDRESS_MAP_END ADDRESS_MAP_END
static ADDRESS_MAP_START( josvolly_mcu1_io_map, AS_IO, 8, josvolly_state )
AM_RANGE(MCS48_PORT_P1, MCS48_PORT_P1) AM_READWRITE(mcu1_p1_r, mcu1_p1_w)
AM_RANGE(MCS48_PORT_P2, MCS48_PORT_P2) AM_READWRITE(mcu1_p2_r, mcu1_p2_w)
ADDRESS_MAP_END
static ADDRESS_MAP_START( josvolly_mcu2_io_map, AS_IO, 8, josvolly_state )
AM_RANGE(MCS48_PORT_P1, MCS48_PORT_P1) AM_READWRITE(mcu2_p1_r, mcu2_p1_w)
AM_RANGE(MCS48_PORT_P2, MCS48_PORT_P2) AM_READWRITE(mcu2_p2_r, mcu2_p2_w)
AM_RANGE(MCS48_PORT_T0, MCS48_PORT_T1) AM_READ(mcu2_test_r)
ADDRESS_MAP_END
static INPUT_PORTS_START( gsword ) static INPUT_PORTS_START( gsword )
PORT_START("IN0") /* IN0 (8741-2 port1?) */ PORT_START("IN0") /* IN0 (8741-2 port1?) */
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START1 ) PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START1 )
@ -539,44 +692,55 @@ static INPUT_PORTS_START( josvolly )
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_START("DSW1") /* DSW1 */ PORT_START("DSW1") /* DSW1 */
PORT_DIPNAME( 0x0c, 0x00, "DIP1-0c(982E)" ) PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unused ) ) PORT_DIPLOCATION("DIPSW1:1")
PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unused ) ) PORT_DIPLOCATION("DIPSW1:2")
PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x0c, 0x0c, "982E" ) PORT_DIPLOCATION("DIPSW1:3,4")
PORT_DIPSETTING( 0x0c, "0" ) PORT_DIPSETTING( 0x0c, "0" )
PORT_DIPSETTING( 0x08, "1" ) PORT_DIPSETTING( 0x08, "1" )
PORT_DIPSETTING( 0x00, "2" ) PORT_DIPSETTING( 0x04, "2" )
PORT_DIPSETTING( 0x0c, "3" ) PORT_DIPSETTING( 0x00, "3" )
PORT_DIPNAME( 0x30, 0x00, "DIP1-30(982A)" ) PORT_DIPNAME( 0x30, 0x30, "982A" ) PORT_DIPLOCATION("DIPSW1:5,6")
PORT_DIPSETTING( 0x30, "96H" ) PORT_DIPSETTING( 0x00, "60" )
PORT_DIPSETTING( 0x20, "78H" ) PORT_DIPSETTING( 0x10, "90" )
PORT_DIPSETTING( 0x10, "5AH" ) PORT_DIPSETTING( 0x20, "120" )
PORT_DIPSETTING( 0x00, "3CH" ) PORT_DIPSETTING( 0x30, "150" )
PORT_DIPNAME( 0x40, 0x40, "TEST_MODE" ) PORT_DIPNAME( 0x40, 0x40, "TEST_MODE" ) PORT_DIPLOCATION("DIPSW1:7")
PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x80, 0x80, "DIP1-80(982C)" ) PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unused ) ) PORT_DIPLOCATION("DIPSW1:8")
PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
PORT_DIPSETTING( 0x80, DEF_STR( On ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_START("DSW2") /* DSW2 */ PORT_START("DSW2") /* DSW2 */
// PORT_DIPNAME( 0x01, 0x00, "DSW2-0" ) PORT_DIPNAME( 0x01, 0x01, "982C" ) PORT_DIPLOCATION("DIPSW2:8")
// PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x01, "0" )
// PORT_DIPSETTING( 0x01, DEF_STR( On ) ) PORT_DIPSETTING( 0x00, "1" )
// PORT_DIPNAME( 0x02, 0x00, "DSW2-1($9831)" ) PORT_DIPNAME( 0x02, 0x02, "9831" ) PORT_DIPLOCATION("DIPSW2:7")
// PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x02, "0" )
// PORT_DIPSETTING( 0x02, DEF_STR( On ) ) PORT_DIPSETTING( 0x00, "1" )
PORT_DIPNAME( 0x0C, 0x0C, DEF_STR( Coin_A ) ) PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("DIPSW2:6,5")
PORT_DIPSETTING( 0x00, DEF_STR( 5C_1C ) ) PORT_DIPSETTING( 0x00, DEF_STR( 5C_1C ) )
PORT_DIPSETTING( 0x08, DEF_STR( 4C_1C ) ) PORT_DIPSETTING( 0x08, DEF_STR( 4C_1C ) )
PORT_DIPSETTING( 0x04, DEF_STR( 2C_1C ) ) PORT_DIPSETTING( 0x04, DEF_STR( 2C_1C ) )
PORT_DIPSETTING( 0x0C, DEF_STR( 1C_1C ) ) PORT_DIPSETTING( 0x0c, DEF_STR( 1C_1C ) )
PORT_DIPNAME( 0x30, 0x30, DEF_STR( Coin_B ) ) PORT_DIPNAME( 0x30, 0x30, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("DIPSW2:4,3")
PORT_DIPSETTING( 0x30, DEF_STR( 1C_1C ) ) PORT_DIPSETTING( 0x30, DEF_STR( 1C_1C ) )
PORT_DIPSETTING( 0x10, DEF_STR( 1C_2C ) ) PORT_DIPSETTING( 0x10, DEF_STR( 1C_2C ) )
PORT_DIPSETTING( 0x20, DEF_STR( 1C_4C ) ) PORT_DIPSETTING( 0x20, DEF_STR( 1C_4C ) )
PORT_DIPSETTING( 0x00, DEF_STR( 1C_5C ) ) PORT_DIPSETTING( 0x00, DEF_STR( 1C_5C ) )
// PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_DIPNAME( 0x40, 0x40, "9827" ) PORT_DIPLOCATION("DIPSW2:2")
// PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_DIPSETTING( 0x40, "1" )
PORT_DIPSETTING( 0x00, "3" )
PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unused ) ) PORT_DIPLOCATION("DIPSW2:1")
PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
INPUT_PORTS_END INPUT_PORTS_END
static const gfx_layout gsword_text = static const gfx_layout gsword_text =
{ {
8,8, /* 8x8 characters */ 8,8, /* 8x8 characters */
@ -636,7 +800,7 @@ static MACHINE_CONFIG_START( gsword, gsword_state )
MCFG_CPU_ADD("sub", Z80, XTAL_18MHz/6) /* verified on pcb */ MCFG_CPU_ADD("sub", Z80, XTAL_18MHz/6) /* verified on pcb */
MCFG_CPU_PROGRAM_MAP(cpu2_map) MCFG_CPU_PROGRAM_MAP(cpu2_map)
MCFG_CPU_IO_MAP(cpu2_io_map) MCFG_CPU_IO_MAP(cpu2_io_map)
MCFG_CPU_PERIODIC_INT_DRIVER(gsword_state, gsword_snd_interrupt, 4*60) MCFG_CPU_PERIODIC_INT_DRIVER(gsword_state, sound_interrupt, 4*60)
MCFG_CPU_ADD("audiocpu", Z80, XTAL_18MHz/6) /* verified on pcb */ MCFG_CPU_ADD("audiocpu", Z80, XTAL_18MHz/6) /* verified on pcb */
MCFG_CPU_PROGRAM_MAP(cpu3_map) MCFG_CPU_PROGRAM_MAP(cpu3_map)
@ -646,7 +810,7 @@ static MACHINE_CONFIG_START( gsword, gsword_state )
MCFG_TAITO8741_ADD("taito8741") MCFG_TAITO8741_ADD("taito8741")
MCFG_TAITO8741_MODES(TAITO8741_MASTER,TAITO8741_SLAVE,TAITO8741_PORT,TAITO8741_PORT) MCFG_TAITO8741_MODES(TAITO8741_MASTER,TAITO8741_SLAVE,TAITO8741_PORT,TAITO8741_PORT)
MCFG_TAITO8741_CONNECT(1,0,0,0) MCFG_TAITO8741_CONNECT(1,0,0,0)
MCFG_TAITO8741_PORT_HANDLERS(IOPORT("DSW2"),IOPORT("DSW1"),READ8(gsword_state,gsword_8741_2_r),READ8(gsword_state,gsword_8741_3_r)) MCFG_TAITO8741_PORT_HANDLERS(IOPORT("DSW2"),IOPORT("DSW1"),READ8(gsword_state,i8741_2_r),READ8(gsword_state,i8741_3_r))
#if 1 #if 1
/* to MCU timeout champbbj */ /* to MCU timeout champbbj */
MCFG_QUANTUM_TIME(attotime::from_hz(6000)) MCFG_QUANTUM_TIME(attotime::from_hz(6000))
@ -683,27 +847,32 @@ static MACHINE_CONFIG_START( gsword, gsword_state )
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.60) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.60)
MACHINE_CONFIG_END MACHINE_CONFIG_END
static MACHINE_CONFIG_START( josvolly, gsword_state ) static MACHINE_CONFIG_START( josvolly, josvolly_state )
/* basic machine hardware */ /* basic machine hardware */
MCFG_CPU_ADD("maincpu", Z80, 18000000/6) /* ? */ MCFG_CPU_ADD("maincpu", Z80, 18000000/6) /* ? */
MCFG_CPU_PROGRAM_MAP(cpu1_map) MCFG_CPU_PROGRAM_MAP(cpu1_map)
MCFG_CPU_IO_MAP(josvolly_cpu1_io_map) MCFG_CPU_IO_MAP(josvolly_cpu1_io_map)
MCFG_CPU_PERIODIC_INT_DRIVER(gsword_state, irq0_line_hold, 2*60) MCFG_CPU_PERIODIC_INT_DRIVER(josvolly_state, irq0_line_hold, 2*60)
MCFG_CPU_ADD("audiocpu", Z80, 12000000/4) /* ? */ MCFG_CPU_ADD("audiocpu", Z80, 12000000/4) /* ? */
MCFG_CPU_PROGRAM_MAP(josvolly_cpu2_map) MCFG_CPU_PROGRAM_MAP(josvolly_cpu2_map)
MCFG_CPU_IO_MAP(josvolly_cpu2_io_map) MCFG_CPU_IO_MAP(josvolly_cpu2_io_map)
MCFG_CPU_VBLANK_INT_DRIVER("screen", gsword_state, irq0_line_hold) MCFG_CPU_VBLANK_INT_DRIVER("screen", josvolly_state, irq0_line_assert)
MCFG_DEVICE_ADD("josvolly_aa_007", I8255, 0) MCFG_DEVICE_ADD("mcu1", I8741, 18000000/6) /* ? */
MCFG_CPU_IO_MAP(josvolly_mcu1_io_map)
MCFG_DEVICE_ADD("mcu2", I8741, 12000000/4) /* ? */
MCFG_CPU_IO_MAP(josvolly_mcu2_io_map)
MCFG_DEVICE_ADD("aa_007", I8255, 0)
MCFG_I8255_IN_PORTA_CB(IOPORT("IN1")) // 1PL MCFG_I8255_IN_PORTA_CB(IOPORT("IN1")) // 1PL
MCFG_I8255_IN_PORTB_CB(IOPORT("IN2")) // 2PL / ACK MCFG_I8255_IN_PORTB_CB(IOPORT("IN2")) // 2PL / ACK
MCFG_I8255_IN_PORTC_CB(IOPORT("IN0")) // START MCFG_I8255_IN_PORTC_CB(IOPORT("IN0")) // START
MCFG_JOSVOLLY8741_ADD("josvolly_8741") // the second MCU polls the first MCU's outputs, so it needs tight sync
MCFG_JOSVOLLY8741_CONNECT(1,0,0,0) MCFG_QUANTUM_PERFECT_CPU("mcu2")
MCFG_JOSVOLLY8741_PORT_HANDLERS(IOPORT("DSW1"),IOPORT("DSW2"),IOPORT("DSW1"),IOPORT("DSW2"))
/* video hardware */ /* video hardware */
@ -712,13 +881,13 @@ static MACHINE_CONFIG_START( josvolly, gsword_state )
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_SIZE(32*8, 32*8)
MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
MCFG_SCREEN_UPDATE_DRIVER(gsword_state, screen_update_gsword) MCFG_SCREEN_UPDATE_DRIVER(josvolly_state, screen_update_gsword)
MCFG_SCREEN_PALETTE("palette") MCFG_SCREEN_PALETTE("palette")
MCFG_GFXDECODE_ADD("gfxdecode", "palette", gsword) MCFG_GFXDECODE_ADD("gfxdecode", "palette", gsword)
MCFG_PALETTE_ADD("palette", 64*4+64*4) MCFG_PALETTE_ADD("palette", 64*4+64*4)
MCFG_PALETTE_INDIRECT_ENTRIES(256) MCFG_PALETTE_INDIRECT_ENTRIES(256)
MCFG_PALETTE_INIT_OWNER(gsword_state,josvolly) MCFG_PALETTE_INIT_OWNER(josvolly_state, josvolly)
/* sound hardware */ /* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono") MCFG_SPEAKER_STANDARD_MONO("mono")
@ -727,7 +896,6 @@ static MACHINE_CONFIG_START( josvolly, gsword_state )
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30)
MCFG_SOUND_ADD("ay2", AY8910, 1500000) MCFG_SOUND_ADD("ay2", AY8910, 1500000)
MCFG_AY8910_PORT_A_WRITE_CB(WRITE8(gsword_state, nmi_set_w)) /* portA write */
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30)
#if 0 #if 0
@ -851,11 +1019,12 @@ ROM_START( josvolly )
ROM_REGION( 0x04000, "user1", 0 ) /* music data and samples - not sure where it's mapped */ ROM_REGION( 0x04000, "user1", 0 ) /* music data and samples - not sure where it's mapped */
ROM_LOAD( "aa0-14.4j", 0x0000, 0x2000, CRC(436fe91f) SHA1(feb29501090c6db911e13ce6e9935ba004b0ce7e) ) ROM_LOAD( "aa0-14.4j", 0x0000, 0x2000, CRC(436fe91f) SHA1(feb29501090c6db911e13ce6e9935ba004b0ce7e) )
// there are other undumped chips on this, not sure how many ROM_REGION( 0x400, "mcu1", 0 )
// not hooked up yet
ROM_REGION( 0x400, "mcu", 0 )
ROM_LOAD( "aa003.bin", 0x0000, 0x400, CRC(68b399d9) SHA1(053482d12c2b714c23fc80ad0589a2afd258a5a6) ) ROM_LOAD( "aa003.bin", 0x0000, 0x400, CRC(68b399d9) SHA1(053482d12c2b714c23fc80ad0589a2afd258a5a6) )
ROM_REGION( 0x400, "mcu2", 0 )
ROM_LOAD( "aa008.bin", 0x0000, 0x400, CRC(68b399d9) SHA1(053482d12c2b714c23fc80ad0589a2afd258a5a6) BAD_DUMP )
ROM_REGION( 0x4000, "gfx1", 0 ) ROM_REGION( 0x4000, "gfx1", 0 )
ROM_LOAD( "aa0-10.9n", 0x0000, 0x2000, CRC(207c4f42) SHA1(4cf2922d55cfc9e68cc07c3252ea3b5619b8aca5) ) /* tiles */ ROM_LOAD( "aa0-10.9n", 0x0000, 0x2000, CRC(207c4f42) SHA1(4cf2922d55cfc9e68cc07c3252ea3b5619b8aca5) ) /* tiles */
ROM_LOAD( "aa1-11.9p", 0x2000, 0x1000, CRC(c130464a) SHA1(9d23577b8aaaffeefff3d8f93668d1b2bd0ba3d9) ) ROM_LOAD( "aa1-11.9p", 0x2000, 0x1000, CRC(c130464a) SHA1(9d23577b8aaaffeefff3d8f93668d1b2bd0ba3d9) )
@ -878,37 +1047,7 @@ ROM_START( josvolly )
ROM_LOAD( "005.3h", 0x0440, 0x0020, CRC(e8d6dec0) SHA1(d15cba9a4b24255d41046b15c2409391ab13ce95) ) /* address decoder? not used */ ROM_LOAD( "005.3h", 0x0440, 0x0020, CRC(e8d6dec0) SHA1(d15cba9a4b24255d41046b15c2409391ab13ce95) ) /* address decoder? not used */
ROM_END ROM_END
DRIVER_INIT_MEMBER(gsword_state,gsword)
{
#if 0
uint8_t *ROM2 = memregion("sub")->base();
ROM2[0x1da] = 0xc3; /* patch for rom self check */
ROM2[0x71e] = 0; /* patch for sound protection or time out function */ GAME( 1983, josvolly, 0, josvolly, josvolly, driver_device, 0, ROT90, "Allumer / Taito Corporation", "Joshi Volleyball", MACHINE_NOT_WORKING | MACHINE_UNEMULATED_PROTECTION | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
ROM2[0x71f] = 0;
#endif
#if 1
/* hack for sound protection or time out function */
m_subcpu->space(AS_PROGRAM).install_read_handler(0x4004, 0x4005, read8_delegate(FUNC(gsword_state::gsword_hack_r),this));
#endif
}
DRIVER_INIT_MEMBER(gsword_state,gsword2)
{
#if 0
uint8_t *ROM2 = memregion("sub")->base();
ROM2[0x1da] = 0xc3; /* patch for rom self check */
ROM2[0x726] = 0; /* patch for sound protection or time out function */
ROM2[0x727] = 0;
#endif
#if 1
/* hack for sound protection or time out function */
m_subcpu->space(AS_PROGRAM).install_read_handler(0x4004, 0x4005, read8_delegate(FUNC(gsword_state::gsword_hack_r),this));
#endif
}
GAME( 1983, josvolly, 0, josvolly, josvolly, driver_device, 0, ROT90, "Allumer / Taito Corporation", "Joshi Volleyball", MACHINE_UNEMULATED_PROTECTION | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1984, gsword, 0, gsword, gsword, gsword_state, gsword, ROT0, "Allumer / Taito Corporation", "Great Swordsman (World?)", MACHINE_SUPPORTS_SAVE ) GAME( 1984, gsword, 0, gsword, gsword, gsword_state, gsword, ROT0, "Allumer / Taito Corporation", "Great Swordsman (World?)", MACHINE_SUPPORTS_SAVE )
GAME( 1984, gsword2, gsword, gsword, gsword, gsword_state, gsword2, ROT0, "Allumer / Taito Corporation", "Great Swordsman (Japan?)", MACHINE_SUPPORTS_SAVE ) GAME( 1984, gsword2, gsword, gsword, gsword, gsword_state, gsword2, ROT0, "Allumer / Taito Corporation", "Great Swordsman (Japan?)", MACHINE_SUPPORTS_SAVE )

View File

@ -5,35 +5,33 @@
#include "sound/ay8910.h" #include "sound/ay8910.h"
#include "sound/msm5205.h" #include "sound/msm5205.h"
class gsword_state : public driver_device class gsword_state_base : public driver_device
{ {
public: public:
gsword_state(const machine_config &mconfig, device_type type, const char *tag) gsword_state_base(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag), : driver_device(mconfig, type, tag)
m_maincpu(*this, "maincpu"), , m_maincpu(*this, "maincpu")
m_audiocpu(*this, "audiocpu"), , m_audiocpu(*this, "audiocpu")
m_subcpu(*this, "sub"), , m_subcpu(*this, "sub")
m_ay0(*this, "ay1"), , m_ay0(*this, "ay1")
m_ay1(*this, "ay2"), , m_ay1(*this, "ay2")
m_msm(*this, "msm"), , m_gfxdecode(*this, "gfxdecode")
m_gfxdecode(*this, "gfxdecode"), , m_palette(*this, "palette")
m_palette(*this, "palette"), , m_spritetile_ram(*this, "spritetile_ram")
m_soundlatch(*this, "soundlatch"), , m_spritexy_ram(*this, "spritexy_ram")
m_spritetile_ram(*this, "spritetile_ram"), , m_spriteattrib_ram(*this, "spriteattram")
m_spritexy_ram(*this, "spritexy_ram"), , m_videoram(*this, "videoram")
m_spriteattrib_ram(*this, "spriteattram"), , m_cpu2_ram(*this, "cpu2_ram")
m_videoram(*this, "videoram"), {
m_cpu2_ram(*this, "cpu2_ram") { } }
required_device<cpu_device> m_maincpu; required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu; required_device<cpu_device> m_audiocpu;
optional_device<cpu_device> m_subcpu; optional_device<cpu_device> m_subcpu;
required_device<ay8910_device> m_ay0; required_device<ay8910_device> m_ay0;
required_device<ay8910_device> m_ay1; required_device<ay8910_device> m_ay1;
optional_device<msm5205_device> m_msm;
required_device<gfxdecode_device> m_gfxdecode; required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette; required_device<palette_device> m_palette;
optional_device<generic_latch_8_device> m_soundlatch; // not josvolly
required_shared_ptr<uint8_t> m_spritetile_ram; required_shared_ptr<uint8_t> m_spritetile_ram;
required_shared_ptr<uint8_t> m_spritexy_ram; required_shared_ptr<uint8_t> m_spritexy_ram;
@ -41,11 +39,8 @@ public:
required_shared_ptr<uint8_t> m_videoram; required_shared_ptr<uint8_t> m_videoram;
required_shared_ptr<uint8_t> m_cpu2_ram; required_shared_ptr<uint8_t> m_cpu2_ram;
int m_coins; //currently initialized but not used
int m_fake8910_0; int m_fake8910_0;
int m_fake8910_1; int m_fake8910_1;
int m_nmi_enable;
int m_protect_hack;
int m_charbank; int m_charbank;
int m_charpalbank; int m_charpalbank;
int m_flipscreen; int m_flipscreen;
@ -56,30 +51,93 @@ public:
DECLARE_WRITE8_MEMBER(charbank_w); DECLARE_WRITE8_MEMBER(charbank_w);
DECLARE_WRITE8_MEMBER(videoctrl_w); DECLARE_WRITE8_MEMBER(videoctrl_w);
DECLARE_WRITE8_MEMBER(scroll_w); DECLARE_WRITE8_MEMBER(scroll_w);
DECLARE_WRITE8_MEMBER(adpcm_soundcommand_w);
DECLARE_WRITE8_MEMBER(nmi_set_w);
DECLARE_WRITE8_MEMBER(ay8910_control_port_0_w); DECLARE_WRITE8_MEMBER(ay8910_control_port_0_w);
DECLARE_WRITE8_MEMBER(ay8910_control_port_1_w); DECLARE_WRITE8_MEMBER(ay8910_control_port_1_w);
DECLARE_READ8_MEMBER(fake_0_r); DECLARE_READ8_MEMBER(fake_0_r);
DECLARE_READ8_MEMBER(fake_1_r); DECLARE_READ8_MEMBER(fake_1_r);
// gsword specific
DECLARE_READ8_MEMBER(gsword_hack_r);
DECLARE_WRITE8_MEMBER(gsword_adpcm_data_w);
DECLARE_READ8_MEMBER(gsword_8741_2_r);
DECLARE_READ8_MEMBER(gsword_8741_3_r);
TILE_GET_INFO_MEMBER(get_bg_tile_info); TILE_GET_INFO_MEMBER(get_bg_tile_info);
DECLARE_DRIVER_INIT(gsword);
DECLARE_DRIVER_INIT(gsword2);
virtual void machine_start() override; virtual void machine_start() override;
virtual void machine_reset() override; virtual void machine_reset() override;
virtual void video_start() override; virtual void video_start() override;
DECLARE_PALETTE_INIT(gsword);
DECLARE_PALETTE_INIT(josvolly);
uint32_t screen_update_gsword(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); uint32_t screen_update_gsword(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
INTERRUPT_GEN_MEMBER(gsword_snd_interrupt);
void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect); void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
}; };
class gsword_state : public gsword_state_base
{
public:
gsword_state(const machine_config &mconfig, device_type type, const char *tag)
: gsword_state_base(mconfig, type, tag)
, m_soundlatch(*this, "soundlatch")
, m_msm(*this, "msm")
, m_protect_hack(false)
, m_nmi_enable(false)
{
}
DECLARE_READ8_MEMBER(hack_r);
DECLARE_WRITE8_MEMBER(nmi_set_w);
DECLARE_WRITE8_MEMBER(sound_command_w);
DECLARE_WRITE8_MEMBER(adpcm_data_w);
DECLARE_READ8_MEMBER(i8741_2_r);
DECLARE_READ8_MEMBER(i8741_3_r);
INTERRUPT_GEN_MEMBER(sound_interrupt);
DECLARE_DRIVER_INIT(gsword);
DECLARE_DRIVER_INIT(gsword2);
DECLARE_PALETTE_INIT(gsword);
virtual void machine_start() override;
virtual void machine_reset() override;
private:
required_device<generic_latch_8_device> m_soundlatch;
required_device<msm5205_device> m_msm;
bool m_protect_hack;
bool m_nmi_enable;
};
class josvolly_state : public gsword_state_base
{
public:
josvolly_state(const machine_config &mconfig, device_type type, const char *tag)
: gsword_state_base(mconfig, type, tag)
, m_cpu2_nmi_enable(false)
, m_mcu1_p1(0xffU)
, m_mcu1_p2(0xffU)
, m_mcu2_p1(0xffU)
{
}
DECLARE_READ8_MEMBER(mcu1_p1_r);
DECLARE_READ8_MEMBER(mcu1_p2_r);
DECLARE_READ8_MEMBER(mcu2_p1_r);
DECLARE_READ8_MEMBER(mcu2_p2_r);
DECLARE_READ8_MEMBER(mcu2_test_r);
DECLARE_WRITE8_MEMBER(cpu2_nmi_enable_w);
DECLARE_WRITE8_MEMBER(cpu2_irq_clear_w);
DECLARE_WRITE8_MEMBER(mcu1_p1_w);
DECLARE_WRITE8_MEMBER(mcu1_p2_w);
DECLARE_WRITE8_MEMBER(mcu2_p1_w);
DECLARE_WRITE8_MEMBER(mcu2_p2_w);
DECLARE_PALETTE_INIT(josvolly);
virtual void machine_start() override;
virtual void machine_reset() override;
private:
bool m_cpu2_nmi_enable;
u8 m_mcu1_p1;
u8 m_mcu1_p2;
u8 m_mcu2_p1;
};

View File

@ -11,91 +11,13 @@
#include "includes/gsword.h" #include "includes/gsword.h"
PALETTE_INIT_MEMBER(gsword_state,josvolly) WRITE8_MEMBER(gsword_state_base::videoram_w)
{
const uint8_t *color_prom = memregion("proms")->base();
int i;
/* create a lookup table for the palette */
for (i = 0; i < 0x100; i++)
{
int r = pal4bit(color_prom[i + 0x000]);
int g = pal4bit(color_prom[i + 0x100]);
int b = pal4bit(color_prom[i + 0x200]);
palette.set_indirect_color(i, rgb_t(r, g, b));
}
/* color_prom now points to the beginning of the lookup table */
color_prom += 0x300;
/* characters */
for (i = 0; i < 0x100; i++)
palette.set_pen_indirect(i, i);
/* sprites */
for (i = 0x100; i < 0x200; i++)
{
uint8_t ctabentry = (BITSWAP8(color_prom[i - 0x100],7,6,5,4,0,1,2,3) & 0x0f) | 0x80;
palette.set_pen_indirect(i, ctabentry);
}
}
PALETTE_INIT_MEMBER(gsword_state,gsword)
{
const uint8_t *color_prom = memregion("proms")->base();
int i;
/* create a lookup table for the palette */
for (i = 0; i < 0x100; i++)
{
int bit0, bit1, bit2;
int r, g, b;
/* red component */
bit0 = (color_prom[i + 0x100] >> 0) & 1;
bit1 = (color_prom[i + 0x100] >> 1) & 1;
bit2 = (color_prom[i + 0x100] >> 2) & 1;
r = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
/* green component */
bit0 = (color_prom[i + 0x100] >> 3) & 1;
bit1 = (color_prom[i + 0x000] >> 0) & 1;
bit2 = (color_prom[i + 0x000] >> 1) & 1;
g = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
/* blue component */
bit0 = 0;
bit1 = (color_prom[i + 0x000] >> 2) & 1;
bit2 = (color_prom[i + 0x000] >> 3) & 1;
b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
palette.set_indirect_color(i, rgb_t(r, g, b));
}
/* color_prom now points to the beginning of the lookup table */
color_prom += 0x200;
/* characters */
for (i = 0; i < 0x100; i++)
palette.set_pen_indirect(i, i);
/* sprites */
for (i = 0x100; i < 0x200; i++)
{
uint8_t ctabentry = (BITSWAP8(color_prom[i - 0x100],7,6,5,4,0,1,2,3) & 0x0f) | 0x80;
palette.set_pen_indirect(i, ctabentry);
}
}
WRITE8_MEMBER(gsword_state::videoram_w)
{ {
m_videoram[offset] = data; m_videoram[offset] = data;
m_bg_tilemap->mark_tile_dirty(offset); m_bg_tilemap->mark_tile_dirty(offset);
} }
WRITE8_MEMBER(gsword_state::charbank_w) WRITE8_MEMBER(gsword_state_base::charbank_w)
{ {
if (m_charbank != data) if (m_charbank != data)
{ {
@ -104,7 +26,7 @@ WRITE8_MEMBER(gsword_state::charbank_w)
} }
} }
WRITE8_MEMBER(gsword_state::videoctrl_w) WRITE8_MEMBER(gsword_state_base::videoctrl_w)
{ {
if (data & 0x8f) if (data & 0x8f)
{ {
@ -132,12 +54,12 @@ WRITE8_MEMBER(gsword_state::videoctrl_w)
/* other bits unused */ /* other bits unused */
} }
WRITE8_MEMBER(gsword_state::scroll_w) WRITE8_MEMBER(gsword_state_base::scroll_w)
{ {
m_bg_tilemap->set_scrolly(0, data); m_bg_tilemap->set_scrolly(0, data);
} }
TILE_GET_INFO_MEMBER(gsword_state::get_bg_tile_info) TILE_GET_INFO_MEMBER(gsword_state_base::get_bg_tile_info)
{ {
int code = m_videoram[tile_index] + ((m_charbank & 0x03) << 8); int code = m_videoram[tile_index] + ((m_charbank & 0x03) << 8);
int color = ((code & 0x3c0) >> 6) + 16 * m_charpalbank; int color = ((code & 0x3c0) >> 6) + 16 * m_charpalbank;
@ -146,9 +68,9 @@ TILE_GET_INFO_MEMBER(gsword_state::get_bg_tile_info)
SET_TILE_INFO_MEMBER(0, code, color, flags); SET_TILE_INFO_MEMBER(0, code, color, flags);
} }
void gsword_state::video_start() void gsword_state_base::video_start()
{ {
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(gsword_state::get_bg_tile_info),this), TILEMAP_SCAN_ROWS, m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(gsword_state_base::get_bg_tile_info),this), TILEMAP_SCAN_ROWS,
8, 8, 32, 64); 8, 8, 32, 64);
save_item(NAME(m_charbank)); save_item(NAME(m_charbank));
@ -156,7 +78,7 @@ void gsword_state::video_start()
save_item(NAME(m_flipscreen)); save_item(NAME(m_flipscreen));
} }
void gsword_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect) void gsword_state_base::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
{ {
for (int offs = 0; offs < m_spritexy_ram.bytes() - 1; offs+=2) for (int offs = 0; offs < m_spritexy_ram.bytes() - 1; offs+=2)
{ {
@ -197,9 +119,86 @@ void gsword_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
} }
} }
uint32_t gsword_state::screen_update_gsword(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) uint32_t gsword_state_base::screen_update_gsword(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{ {
m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0); m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
draw_sprites(bitmap, cliprect); draw_sprites(bitmap, cliprect);
return 0; return 0;
} }
PALETTE_INIT_MEMBER(gsword_state, gsword)
{
const uint8_t *color_prom = memregion("proms")->base();
/* create a lookup table for the palette */
for (unsigned i = 0; i < 0x100; i++)
{
int bit0, bit1, bit2;
int r, g, b;
/* red component */
bit0 = BIT(color_prom[i + 0x100], 0);
bit1 = BIT(color_prom[i + 0x100], 1);
bit2 = BIT(color_prom[i + 0x100], 2);
r = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
/* green component */
bit0 = BIT(color_prom[i + 0x100], 3);
bit1 = BIT(color_prom[i + 0x000], 0);
bit2 = BIT(color_prom[i + 0x000], 1);
g = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
/* blue component */
bit0 = 0;
bit1 = BIT(color_prom[i + 0x000], 2);
bit2 = BIT(color_prom[i + 0x000], 3);
b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
palette.set_indirect_color(i, rgb_t(r, g, b));
}
/* color_prom now points to the beginning of the lookup table */
color_prom += 0x200;
/* characters */
for (unsigned i = 0; i < 0x100; i++)
palette.set_pen_indirect(i, i);
/* sprites */
for (unsigned i = 0x100; i < 0x200; i++)
{
uint8_t ctabentry = (BITSWAP8(color_prom[i - 0x100],7,6,5,4,0,1,2,3) & 0x0f) | 0x80;
palette.set_pen_indirect(i, ctabentry);
}
}
PALETTE_INIT_MEMBER(josvolly_state, josvolly)
{
u8 const *color_prom = memregion("proms")->base();
// create a lookup table for the palette
for (unsigned i = 0; i < 0x100; i++)
{
u8 const r = pal4bit(color_prom[i + 0x000]);
u8 const g = pal4bit(color_prom[i + 0x100]);
u8 const b = pal4bit(color_prom[i + 0x200]);
palette.set_indirect_color(i, rgb_t(r, g, b));
// characters */
palette.set_pen_indirect(i, i);
}
/* color_prom now points to the beginning of the lookup table */
color_prom += 0x300;
/* sprites */
for (unsigned i = 0; i < 0x100; i++)
{
uint8_t ctabentry = (BITSWAP8(color_prom[i],7,6,5,4,0,1,2,3) & 0x0f) | 0x80;
palette.set_pen_indirect(i + 0x100, ctabentry);
}
}