diff options
Diffstat (limited to 'src/mame/drivers/gsword.cpp')
-rw-r--r-- | src/mame/drivers/gsword.cpp | 572 |
1 files changed, 349 insertions, 223 deletions
diff --git a/src/mame/drivers/gsword.cpp b/src/mame/drivers/gsword.cpp index 99326bdaa72..e47324fab48 100644 --- a/src/mame/drivers/gsword.cpp +++ b/src/mame/drivers/gsword.cpp @@ -81,7 +81,7 @@ Gs16 2nd z80 Data (8K) 2000-3FFF PORTS: 7e 8741-#0 data port -7f 8741-#1 command / status port +7f 8741-#0 command / status port ************* *2nd Z80 CPU* @@ -95,8 +95,6 @@ write PORTS: 00 8741-#2 data port 01 8741-#2 command / status port -20 8741-#3 data port -21 8741-#3 command / status port 40 8741-#1 data port 41 8741-#1 command / status port @@ -141,6 +139,137 @@ reg: 0->1 (main->2nd) / : (1->0) 2nd->main : 6 : : DSW0? 7 : : ? +gsword notes: + +There are three 8041 MCUs: +* One connected to the main CPU for communicating with the sub CPU and + reading DIP switch C. +* One connected to the sub CPU for communicating with the main CPU and + reading DIP switches A and B. +* One connected to the sub CPU for reading player, start and coin + inputs, and driving the coin counter outputs. + +So far, only the AA-016 MCU has been dumped successfully. There's no +reason to believe that the three MCUs run different programs. Other +Allumer-developed games are known to have different silkscreen on +identical parts. It's not clear which of the MCUs (AA-013 at 5A, AA-016 +at 9C and AA-017 at 9G) plays which role, + +The clock inputs for the MCUs are unknown - the values used are taken +from gladiatr, where a superficially similar arrangement is used. It +would be good if we could get frequency measurements for all the clock +inputs: +* Master clock input to each MCU on XTAL 1 (DIP pin 2, PLCC pin 3) +* Serial clock input to communication MCUs on T0 (DIP pin 1, PLCC pin 2) + +Communication between MCUs is working - the handlers for parity error +($187), premature end of data ($194) and excess data bits are not being +hit. This confirms that the MCUs are synchronising correctly and the +serial clock is not excessively fast in relation to the MCU core clock. + +The I/O MCU is correctly reading inputs, counting coins, driving coin +counters, and driving coin counters. However, a problem elsewhere is +causing the main program to not reliably register credits. It registers +credits occasionally, and once you start a game, it's playable - player +inputs work fine. + +There are problems with sound. Many effects aren't playing or are cut +off almost immediately. It's not clear why - possibly due to some of +the I/O that isn't understood. + ++-----+----------------+----------------+----------------+ +| Pin | MCU 1 | MCU 2 | MCU 3 | ++-----+----------------+----------------+----------------+ +| P10 | to MCU 2 P10 | to MCU 1 P10 | P1 right | +| P11 | to MCU 2 T1 | to MCU 1 T1 | P1 left | +| P12 | unknown | DSW A 3 | unknown | +| P13 | unknown | DSW A 4 | P1 lower | +| P14 | unknown | DSW A 5 | P1 raise | +| P15 | unknown | unknown | P1 middle | +| P16 | unknown | unknown | 1P start | +| P17 | unknown | unknown | 2P start | ++-----+----------------+----------------+----------------+ +| P20 | DSW C 1? | DSW B 1? | P2 right | +| P21 | DSW C 2? | DSW B 2? | P2 left | +| P22 | DSW C 3 | DSW B 3 | unknown | +| P23 | DSW C 4 | DSW B 4 | P2 lower | +| P24 | DSW C 5 | DSW B 5 | P2 raise | +| P25 | DSW C 6 | DSW B 6 | P2 middle | +| P26 | DSW C 7 | DSW B 7 | coin counter 1 | +| P27 | DSW C 8? | DSW B 8 | coin counter 2 | ++-----+----------------+----------------+----------------+ +| T0 | serial clock | serial clock | coin chute 1 | +| T1 | from MCU 2 P11 | from MCU 1 P11 | coin chute 2 | ++-----+----------------+----------------+----------------+ + +The communication MCUs transfer data bidirectionally on their P10 pins +which are tied together. An MCU indicates that it is sending data by +pulling P11 low. This is connected to T1 on the other MCU. The data +clock is supplied to both communication MCUs on T0. Outputs are set +after detecting a rising edge on T0, and inputs are read after detecting +a falling edge on T0. + +A frame consists to five bytes send LSB first. Each byte is followed by +an odd parity bit. Useful addresses for debugging communication: +* $12A: Function for sending a frame from $21..$25 +* $159: Function for receiving a frame to $29..$2D +* $187: Receive parity error +* $194: Premature end-of-data +* $199: Excess data + +The I/O MCU handles rejecting coin pulses that are too long or too short +and converting coins to credits. The duration is measured in terms of +rate that the sub CPU polls the MCU at. The minimum coin pulse duration +is always two polling periods, while the maximum is programmable. The +coins/credit settings for each coin input are programmable, but only the +first one can be set with DIP switches (the second one is always set for +1 coin/1 credit). + +During the setup phase, the sub CPU writes setup instructions to the I/O +MCU's control port. Each byte has an instruction in the high three bits +and a value in the low five bits. Instructions recognised are: +* 0x00: Set coin 1 maximum pulse duration ($2E, default 6) +* 0x20: Set coin 2 maximum pulse duration ($2F, default 6) +* 0x40: Set coin 1 coins per credit ($35, default 1) +* 0x60: Set coin 2 coins per credit ($3D, default 1) +* 0x80: Set coin 1 credits per coin ($33, default 1) +* 0xa0: Set coin 2 credits per coin ($3B, default 1) +* 0xc0: Set value at $2A (never read, default $08) +* 0xe0: Swap nybbles and set value at $29 (never read, default $80) + +The setup phase is terminated by writing a command to the I/O MCU's data +port. The MCU return a data byte depending on the low three bits of the +command: +* xxxxxxx1 or xxxxx000: Credit flag and start buttons +* xxxxxx10: Credit flag and P1 controls +* xxxxx100: Credit flag and P2 controls + +The MCU keeps an internal credit counter ($2D). Each time the MCU +receives a polling command, if the credit counter is non-zero it will be +decremented and bit 7 of the response will be set; if the credit counter +is zero, but 7 of the response will be clear. + +After terminating the setup phase, any byte written to the data port +will cause the MCU to check the coin inputs, update the credit counter +if necessary, and return the desired data. A byte written to the +control port after the setup phase terminates causes the MCU to read a +byte of program memory from page 2 using the received byte as the +offset, twos-complement it, return it, and then immediately re-execute +the previous command received on the data port. + +The I/O MCU indicates status via the user-defined status flags. It sets +them to 0000 while waiting for a command, or 1111 while processing a +command. + +MCU 2 P15, P16 and P17 seem to have some effect, although it's not clear +what they're supposed to do. Tying them low during startup prevents the +sub CPU from correctly programming the I/O MCU. It's not clear whether +pins corresponding to unused DIP switches have some other purpose. Fake +DIP switches have been included to make it easier to mess with some of +the unknown I/O. + +The audio CPU seems to have some unmapped peripheral(s) around $FEB0. + ******************************************/ #include "emu.h" @@ -148,27 +277,13 @@ reg: 0->1 (main->2nd) / : (1->0) 2nd->main : #include "cpu/mcs48/mcs48.h" #include "cpu/z80/z80.h" +#include "machine/clock.h" #include "machine/i8255.h" -#include "machine/tait8741.h" #include "screen.h" #include "speaker.h" -#if 0 -int gsword_state::coins_in(void) -{ - /* emulate 8741 coin slot */ - if (ioport("IN4")->read() & 0xc0) - { - logerror("Coin In\n"); - return 0x80; - } - logerror("NO Coin\n"); - return 0x00; -} -#endif - void gsword_state_base::machine_start() { save_item(NAME(m_fake8910_0)); @@ -269,37 +384,17 @@ WRITE8_MEMBER(gsword_state::adpcm_data_w) m_msm->vclk_w(BIT(data, 4)); // bit 4 } -READ8_MEMBER(gsword_state::i8741_2_r ) +READ8_MEMBER(gsword_state::mcu2_p1_r) { - switch (offset) - { - case 0x01: /* start button , coins */ - return ioport("IN0")->read(); - case 0x02: /* Player 1 Controller */ - return ioport("IN1")->read(); - case 0x04: /* Player 2 Controller */ - return ioport("IN3")->read(); -// default: -// logerror("8741-2 unknown read %d %s\n",offset,machine().describe_context()); - } - /* unknown */ - return 0; + // P10 is tied to P10 on MCU1, P11 is used to drive T1 on MCU1 + // assume the low bits of DIP switch A aren't connected at all + return (m_dsw0->read() & 0xfc) | 0x02 | BIT(m_mcu1_p1, 0); } -READ8_MEMBER(gsword_state::i8741_3_r ) +WRITE8_MEMBER(gsword_state::mcu3_p2_w) { - switch (offset) - { - case 0x01: /* start button */ - return ioport("IN2")->read(); - case 0x02: /* Player 1 Controller? */ - return ioport("IN1")->read(); - case 0x04: /* Player 2 Controller? */ - return ioport("IN3")->read(); - } - /* unknown */ -// logerror("8741-3 unknown read %d %s\n",offset,machine().describe_context()); - return 0; + machine().bookkeeping().coin_counter_w(0, BIT(~data, 6)); + machine().bookkeeping().coin_counter_w(1, BIT(~data, 7)); } INTERRUPT_GEN_MEMBER(gsword_state::sound_interrupt) @@ -344,6 +439,9 @@ void gsword_state::machine_start() save_item(NAME(m_protect_hack)); save_item(NAME(m_nmi_enable)); + save_item(NAME(m_tclk_val)); + save_item(NAME(m_mcu1_p1)); + save_item(NAME(m_mcu2_p1)); } void gsword_state::machine_reset() @@ -474,7 +572,7 @@ void gsword_state_base::cpu1_map(address_map &map) void gsword_state::cpu1_io_map(address_map &map) { map.global_mask(0xff); - map(0x7e, 0x7f).rw("taito8741", FUNC(taito8741_4pack_device::read_0), FUNC(taito8741_4pack_device::write_0)); + map(0x7e, 0x7f).rw("mcu1", FUNC(upi41_cpu_device::upi41_master_r), FUNC(upi41_cpu_device::upi41_master_w)); } void gsword_state::cpu2_map(address_map &map) @@ -487,9 +585,8 @@ void gsword_state::cpu2_map(address_map &map) void gsword_state::cpu2_io_map(address_map &map) { map.global_mask(0xff); - map(0x00, 0x01).rw("taito8741", FUNC(taito8741_4pack_device::read_2), FUNC(taito8741_4pack_device::write_2)); - map(0x20, 0x21).rw("taito8741", FUNC(taito8741_4pack_device::read_3), FUNC(taito8741_4pack_device::write_3)); - map(0x40, 0x41).rw("taito8741", FUNC(taito8741_4pack_device::read_1), FUNC(taito8741_4pack_device::write_1)); + map(0x00, 0x01).rw("mcu3", FUNC(upi41_cpu_device::upi41_master_r), FUNC(upi41_cpu_device::upi41_master_w)); + map(0x40, 0x41).rw("mcu2", FUNC(upi41_cpu_device::upi41_master_r), FUNC(upi41_cpu_device::upi41_master_w)); map(0x60, 0x60).rw(FUNC(gsword_state::fake_0_r), FUNC(gsword_state::ay8910_control_port_0_w)); map(0x61, 0x61).rw(m_ay0, FUNC(ay8910_device::data_r), FUNC(ay8910_device::data_w)); map(0x80, 0x80).rw(FUNC(gsword_state::fake_1_r), FUNC(gsword_state::ay8910_control_port_1_w)); @@ -540,117 +637,130 @@ void josvolly_state::josvolly_cpu2_io_map(address_map &map) static INPUT_PORTS_START( gsword ) - PORT_START("IN0") /* IN0 (8741-2 port1?) */ - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START1 ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_COIN1 ) PORT_IMPULSE(1) - - PORT_START("IN1") /* IN1 (8741-2 port2?) */ - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_2WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_2WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON3 ) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON2 ) - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_COIN1 ) PORT_IMPULSE(1) - - PORT_START("IN2") /* IN2 (8741-3 port1?) */ - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START1 ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_COIN1 ) PORT_IMPULSE(1) - - PORT_START("IN3") /* IN3 (8741-3 port2?) */ - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_2WAY PORT_COCKTAIL - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_2WAY PORT_COCKTAIL - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_COCKTAIL - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_COIN1 ) PORT_IMPULSE(1) - - PORT_START("IN4") /* IN4 (coins) */ - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_COIN1 ) PORT_IMPULSE(1) - - PORT_START("DSW0") /* DSW0 */ - /* NOTE: Switches 0 & 1, 6,7,8 not used */ - /* Coins configurations were handled */ - /* via external hardware & not via program */ - PORT_DIPNAME( 0x1c, 0x00, DEF_STR( Coin_A ) ) - PORT_DIPSETTING( 0x1c, DEF_STR( 5C_1C ) ) - PORT_DIPSETTING( 0x18, DEF_STR( 4C_1C ) ) - PORT_DIPSETTING( 0x14, DEF_STR( 2C_1C ) ) - PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) ) - PORT_DIPSETTING( 0x04, DEF_STR( 1C_2C ) ) - PORT_DIPSETTING( 0x08, DEF_STR( 1C_4C ) ) - PORT_DIPSETTING( 0x0c, DEF_STR( 1C_5C ) ) + PORT_START("MCU1.P1") // TODO: fake port for debugging - should be removed + PORT_BIT( 0x03, 0x02, IPT_UNUSED ) // these bits are used for communication + PORT_DIPNAME( 0x04, 0x04, "MCU1.P12" ) + PORT_DIPSETTING( 0x04, DEF_STR(Off) ) + PORT_DIPSETTING( 0x00, DEF_STR(On) ) + PORT_DIPNAME( 0x08, 0x08, "MCU1.P13" ) + PORT_DIPSETTING( 0x08, DEF_STR(Off) ) + PORT_DIPSETTING( 0x00, DEF_STR(On) ) + PORT_DIPNAME( 0x10, 0x10, "MCU1.P14" ) + PORT_DIPSETTING( 0x10, DEF_STR(Off) ) + PORT_DIPSETTING( 0x00, DEF_STR(On) ) + PORT_DIPNAME( 0x20, 0x20, "MCU1.P15" ) + PORT_DIPSETTING( 0x20, DEF_STR(Off) ) + PORT_DIPSETTING( 0x00, DEF_STR(On) ) + PORT_DIPNAME( 0x40, 0x40, "MCU1.P16" ) + PORT_DIPSETTING( 0x40, DEF_STR(Off) ) + PORT_DIPSETTING( 0x00, DEF_STR(On) ) + PORT_DIPNAME( 0x80, 0x80, "MCU1.P17" ) + PORT_DIPSETTING( 0x80, DEF_STR(Off) ) + PORT_DIPSETTING( 0x00, DEF_STR(On) ) + + PORT_START("IN0") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_2WAY + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_2WAY + PORT_DIPNAME( 0x04, 0x04, "MCU3.P12" ) // TODO: fake DIP switch for debugging - should be removed + PORT_DIPSETTING( 0x04, DEF_STR(Off) ) + PORT_DIPSETTING( 0x00, DEF_STR(On) ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON3 ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START1 ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START2 ) + + PORT_START("IN1") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_2WAY PORT_COCKTAIL + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_2WAY PORT_COCKTAIL + PORT_DIPNAME( 0x04, 0x04, "MCU3.P22" ) // TODO: fake DIP switch for debugging - should be removed + PORT_DIPSETTING( 0x04, DEF_STR(Off) ) + PORT_DIPSETTING( 0x00, DEF_STR(On) ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_COCKTAIL + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_COCKTAIL + PORT_BIT( 0xc0, IP_ACTIVE_LOW, IPT_UNUSED ) // P26 and P27 are outputs for coin counters + + PORT_START("COINS") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) + + PORT_START("DSW0") + PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unused ) ) PORT_DIPLOCATION("A:1") + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unused ) ) PORT_DIPLOCATION("A:2") + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x1c, 0x1c, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("A:3,4,5") + PORT_DIPSETTING( 0x00, DEF_STR( 5C_1C ) ) + PORT_DIPSETTING( 0x04, DEF_STR( 4C_1C ) ) + PORT_DIPSETTING( 0x08, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0x1c, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x18, DEF_STR( 1C_2C ) ) + PORT_DIPSETTING( 0x14, DEF_STR( 1C_4C ) ) + PORT_DIPSETTING( 0x10, DEF_STR( 1C_5C ) ) + PORT_DIPSETTING( 0x0c, "1 Coin/10 Credits" ) + // FIXME: these three DIP switches are physically present, but may not be connected to anything - turning them on seems to cause problems + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) PORT_DIPLOCATION("A:6") + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) PORT_DIPLOCATION("A:7") + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) PORT_DIPLOCATION("A:8") + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_START("DSW1") /* DSW1 */ - PORT_DIPNAME( 0x01, 0x00, DEF_STR( Unused ) ) - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x01, DEF_STR( On ) ) - PORT_DIPNAME( 0x02, 0x00, DEF_STR( Unused ) ) - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x02, DEF_STR( On ) ) - PORT_DIPNAME( 0x0c, 0x00, "Fencing Difficulty" ) - PORT_DIPSETTING( 0x00, DEF_STR( Easy ) ) - PORT_DIPSETTING( 0x04, DEF_STR( Normal ) ) - PORT_DIPSETTING( 0x08, DEF_STR( Hard ) ) - PORT_DIPSETTING( 0x0c, DEF_STR( Hardest ) ) - PORT_DIPNAME( 0x10, 0x00, "Kendo Difficulty" ) - PORT_DIPSETTING( 0x00, DEF_STR( Easy ) ) - PORT_DIPSETTING( 0x10, DEF_STR( Hard ) ) - PORT_DIPNAME( 0x20, 0x00, "Roman Difficulty" ) - PORT_DIPSETTING( 0x00, DEF_STR( Easy ) ) - PORT_DIPSETTING( 0x20, DEF_STR( Hard ) ) - PORT_DIPNAME( 0x40, 0x40, DEF_STR( Demo_Sounds ) ) - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x40, DEF_STR( On ) ) - PORT_DIPNAME( 0x80, 0x00, DEF_STR( Lives ) ) - PORT_DIPSETTING( 0x00, "1" ) - PORT_DIPSETTING( 0x80, "255 (Cheat)" ) + PORT_START("DSW1") + PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unused ) ) PORT_DIPLOCATION("B:1") + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unused ) ) PORT_DIPLOCATION("B:2") + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x0c, 0x0c, "Fencing Difficulty" ) PORT_DIPLOCATION("B:3,4") + PORT_DIPSETTING( 0x0c, DEF_STR( Easy ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Normal ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Hard ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) ) + PORT_DIPNAME( 0x10, 0x10, "Kendo Difficulty" ) PORT_DIPLOCATION("B:5") + PORT_DIPSETTING( 0x10, DEF_STR( Easy ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Hard ) ) + PORT_DIPNAME( 0x20, 0x20, "Roman Difficulty" ) PORT_DIPLOCATION("B:6") + PORT_DIPSETTING( 0x20, DEF_STR( Easy ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Hard ) ) + PORT_DIPNAME( 0x40, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("B:7") + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Lives ) ) PORT_DIPLOCATION("B:8") + PORT_DIPSETTING( 0x80, "1" ) + PORT_DIPSETTING( 0x00, "255 (Cheat)" ) - PORT_START("DSW2") /* DSW2 */ - PORT_DIPNAME( 0x01, 0x00, DEF_STR( Unused ) ) - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x01, DEF_STR( On ) ) - PORT_DIPNAME( 0x02, 0x00, DEF_STR( Unused ) ) - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x02, DEF_STR( On ) ) - PORT_DIPNAME( 0x04, 0x00, DEF_STR( Free_Play ) ) - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x04, DEF_STR( On ) ) - PORT_DIPNAME( 0x08, 0x00, DEF_STR( Cabinet ) ) - PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) - PORT_DIPSETTING( 0x08, DEF_STR( Cocktail ) ) - PORT_DIPNAME( 0x30, 0x00, "First Stage" ) - PORT_DIPSETTING( 0x00, "Fencing" ) - PORT_DIPSETTING( 0x10, "Kendo" ) - PORT_DIPSETTING( 0x20, "Roman" ) -// PORT_DIPSETTING( 0x30, "Kendo" ) - PORT_DIPNAME( 0x40, 0x00, DEF_STR( Flip_Screen ) ) - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x40, DEF_STR( On ) ) - PORT_DIPNAME( 0x80, 0x00, DEF_STR( Unused ) ) - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x80, DEF_STR( On ) ) + PORT_START("DSW2") + PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unused ) ) PORT_DIPLOCATION("C:1") + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unused ) ) PORT_DIPLOCATION("C:2") + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Free_Play ) ) PORT_DIPLOCATION("C:3") + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("C:4") + PORT_DIPSETTING( 0x08, DEF_STR( Upright ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Cocktail ) ) + PORT_DIPNAME( 0x30, 0x30, "First Stage" ) PORT_DIPLOCATION("C:5,6") + PORT_DIPSETTING( 0x30, "Fencing" ) + PORT_DIPSETTING( 0x20, "Kendo" ) + PORT_DIPSETTING( 0x10, "Roman" ) + PORT_DIPSETTING( 0x00, "Kendo" ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("C:7") + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unused ) ) PORT_DIPLOCATION("C:8") + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) INPUT_PORTS_END static INPUT_PORTS_START( josvolly ) @@ -785,29 +895,45 @@ GFXDECODE_END MACHINE_CONFIG_START(gsword_state::gsword) /* basic machine hardware */ - MCFG_DEVICE_ADD("maincpu", Z80, XTAL(18'000'000)/6) /* verified on pcb */ + MCFG_DEVICE_ADD(m_maincpu, Z80, XTAL(18'000'000)/6) /* verified on pcb */ MCFG_DEVICE_PROGRAM_MAP(cpu1_map) MCFG_DEVICE_IO_MAP(cpu1_io_map) MCFG_DEVICE_VBLANK_INT_DRIVER("screen", gsword_state, irq0_line_hold) - MCFG_DEVICE_ADD("sub", Z80, XTAL(18'000'000)/6) /* verified on pcb */ + MCFG_DEVICE_ADD(m_subcpu, Z80, XTAL(18'000'000)/6) /* verified on pcb */ MCFG_DEVICE_PROGRAM_MAP(cpu2_map) MCFG_DEVICE_IO_MAP(cpu2_io_map) MCFG_DEVICE_PERIODIC_INT_DRIVER(gsword_state, sound_interrupt, 4*60) - MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(18'000'000)/6) /* verified on pcb */ + MCFG_DEVICE_ADD(m_audiocpu, Z80, XTAL(18'000'000)/6) /* verified on pcb */ MCFG_DEVICE_PROGRAM_MAP(cpu3_map) - MCFG_QUANTUM_TIME(attotime::from_hz(12000)) /* Allow time for 2nd cpu to interleave*/ - - MCFG_TAITO8741_ADD("taito8741") - MCFG_TAITO8741_MODES(TAITO8741_MASTER,TAITO8741_SLAVE,TAITO8741_PORT,TAITO8741_PORT) - MCFG_TAITO8741_CONNECT(1,0,0,0) - MCFG_TAITO8741_PORT_HANDLERS(IOPORT("DSW2"),IOPORT("DSW1"),READ8(*this, gsword_state,i8741_2_r),READ8(*this, gsword_state,i8741_3_r)) -#if 1 - /* to MCU timeout champbbj */ - MCFG_QUANTUM_TIME(attotime::from_hz(6000)) -#endif + upi41_cpu_device &mcu1(I8041(config, "mcu1", 12'000'000/2)); // clock unknown, using value from gladiatr + mcu1.p1_in_cb().set([this] () { return ioport("MCU1.P1")->read() | BIT(m_mcu2_p1, 0); }); + mcu1.p1_out_cb().set([this] (uint8_t data) { m_mcu1_p1 = data; }); + mcu1.p2_in_cb().set_ioport("DSW2"); + mcu1.t0_in_cb().set([this] () { return m_tclk_val ? 1 : 0; }); // serial clock + mcu1.t1_in_cb().set([this] () { return BIT(m_mcu2_p1, 1); }); // from P11 on other MCU + + upi41_cpu_device &mcu2(I8041(config, "mcu2", 12'000'000/2)); // clock unknown, using value from gladiatr + mcu2.p1_in_cb().set(FUNC(gsword_state::mcu2_p1_r)); + mcu2.p1_out_cb().set([this] (uint8_t data) { m_mcu2_p1 = data; }); + mcu2.p2_in_cb().set_ioport("DSW1"); + mcu2.t0_in_cb().set([this] () { return m_tclk_val ? 1 : 0; }); // serial clock + mcu2.t1_in_cb().set([this] () { return BIT(m_mcu1_p1, 1); }); // from P11 on other MCU + + upi41_cpu_device &mcu3(I8041(config, "mcu3", 12'000'000/2)); // clock unknown, using value from gladiatr + mcu3.p1_in_cb().set_ioport("IN0"); + mcu3.p2_in_cb().set_ioport("IN1"); + mcu3.p2_out_cb().set(FUNC(gsword_state::mcu3_p2_w)); + mcu3.t0_in_cb().set_ioport("COINS").bit(0); + mcu3.t1_in_cb().set_ioport("COINS").bit(1); + + // clock unknown, using value from gladiatr + CLOCK(config, "tclk", 12'000'000/8/128/2).signal_handler().set([this] (int state) { m_tclk_val = state != 0; }); + + // lazy way to ensure communication works + MCFG_QUANTUM_PERFECT_CPU("mcu1") /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) @@ -852,20 +978,20 @@ MACHINE_CONFIG_START(josvolly_state::josvolly) MCFG_DEVICE_IO_MAP(josvolly_cpu2_io_map) MCFG_DEVICE_VBLANK_INT_DRIVER("screen", josvolly_state, irq0_line_assert) - MCFG_DEVICE_ADD("mcu1", I8741, 18000000/2) /* ? */ - MCFG_MCS48_PORT_P1_IN_CB(READ8(*this, josvolly_state, mcu1_p1_r)) - MCFG_MCS48_PORT_P1_OUT_CB(WRITE8(*this, josvolly_state, mcu1_p1_w)) - MCFG_MCS48_PORT_P2_IN_CB(READ8(*this, josvolly_state, mcu1_p2_r)) - MCFG_MCS48_PORT_P2_OUT_CB(WRITE8(*this, josvolly_state, mcu1_p2_w)) + upi41_cpu_device &mcu1(I8741(config, "mcu1", 18000000/2)); /* ? */ + mcu1.p1_in_cb().set(FUNC(josvolly_state::mcu1_p1_r)); + mcu1.p1_out_cb().set(FUNC(josvolly_state::mcu1_p1_w)); + mcu1.p2_in_cb().set(FUNC(josvolly_state::mcu1_p2_r)); + mcu1.p2_out_cb().set(FUNC(josvolly_state::mcu1_p2_w)); - i8741_device &mcu2(I8741(config, "mcu2", 12000000/2)); /* ? */ + upi41_cpu_device &mcu2(I8741(config, "mcu2", 12000000/2)); /* ? */ mcu2.p1_in_cb().set(FUNC(josvolly_state::mcu2_p1_r)); mcu2.p1_out_cb().set(FUNC(josvolly_state::mcu2_p1_w)); mcu2.p2_in_cb().set(FUNC(josvolly_state::mcu2_p2_r)); mcu2.p2_out_cb().set(FUNC(josvolly_state::mcu2_p2_w)); // TEST0 and TEST1 are driven by P20 and P21 on the other MCU - mcu2.t0_in_cb().set("mcu1", FUNC(i8741_device::p2_r)).bit(0); - mcu2.t1_in_cb().set("mcu1", FUNC(i8741_device::p2_r)).bit(1); + mcu2.t0_in_cb().set("mcu1", FUNC(upi41_cpu_device::p2_r)).bit(0); + mcu2.t1_in_cb().set("mcu1", FUNC(upi41_cpu_device::p2_r)).bit(1); i8255_device &ppi(I8255(config, "aa_007")); ppi.in_pa_callback().set_ioport("IN1"); // 1PL @@ -922,39 +1048,39 @@ ROM_START( gsword ) ROM_LOAD( "ac10-15.5h", 0x0000, 0x2000, CRC(b74e9d43) SHA1(d6e9e05e2e652c9d467dba1f1501d2a7ec8f851c) ) ROM_LOAD( "ac0-16.7h", 0x2000, 0x2000, CRC(10accc10) SHA1(311961bfe852582a9c66aaecf9bc4c8f0ac7fccf) ) - ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64K for 3nd z80 */ + ROM_REGION( 0x10000, "audiocpu", 0 ) // 64K for 3nd z80 ROM_LOAD( "ac10-12.3a", 0x0000, 0x2000, CRC(56eac59f) SHA1(22bde858ddcafad3f731030c39fd525458ecdbdd) ) ROM_LOAD( "ac10-13.4a", 0x2000, 0x2000, CRC(3a920eaa) SHA1(256fafda0d522dee993b6840e60532f11a705345) ) ROM_LOAD( "ac10-14.3d", 0x4000, 0x2000, CRC(819db933) SHA1(5e8b10d94ca6ba608a074bd5f30f14b95122fe85) ) ROM_LOAD( "ac10-17.4d", 0x6000, 0x2000, CRC(87817985) SHA1(370399a4622958829ca6d1545e614b121f09c2c0) ) - ROM_REGION( 0x10000, "cpu3", 0 ) /* 8741 */ - ROM_LOAD( "aa-013.5a", 0x0000, 0x0800, NO_DUMP ) + ROM_REGION( 0x0400, "mcu1", 0 ) // 8041AH + ROM_LOAD( "aa-013.5a", 0x0000, 0x0400, CRC(e546aa52) SHA1(b8197c836713b1ace8ecd8238e645405c929364f) ) - ROM_REGION( 0x10000, "cpu4", 0 ) /* 8741 */ - ROM_LOAD( "aa-016.9c", 0x0000, 0x0800, NO_DUMP ) + ROM_REGION( 0x0400, "mcu2", 0 ) // 8041AH + ROM_LOAD( "aa-016.9c", 0x0000, 0x0400, CRC(e546aa52) SHA1(b8197c836713b1ace8ecd8238e645405c929364f) ) - ROM_REGION( 0x10000, "cpu5", 0 ) /* 8741 */ - ROM_LOAD( "aa-017.9g", 0x0000, 0x0800, NO_DUMP ) + ROM_REGION( 0x0400, "mcu3", 0 ) // 8041AH + ROM_LOAD( "aa-017.9g", 0x0000, 0x0400, CRC(e546aa52) SHA1(b8197c836713b1ace8ecd8238e645405c929364f) ) ROM_REGION( 0x4000, "gfx1", 0 ) - ROM_LOAD( "ac1-10.9n", 0x0000, 0x2000, CRC(517c571b) SHA1(05572a8ea416922da50143936fda9ba038f0b91e) ) /* tiles */ + ROM_LOAD( "ac1-10.9n", 0x0000, 0x2000, CRC(517c571b) SHA1(05572a8ea416922da50143936fda9ba038f0b91e) ) // tiles ROM_LOAD( "ac1-11.9p", 0x2000, 0x2000, CRC(7a1d8a3a) SHA1(3f90be9ddba3cf7a879fd69ac67c2b67fd63b9ee) ) ROM_REGION( 0x2000, "gfx2", 0 ) - ROM_LOAD( "ac1-6.9e", 0x0000, 0x2000, CRC(1b0a3cb7) SHA1(0b0f17b9844d7310b46110559e09cfc3b50bb38b) ) /* sprites */ + ROM_LOAD( "ac1-6.9e", 0x0000, 0x2000, CRC(1b0a3cb7) SHA1(0b0f17b9844d7310b46110559e09cfc3b50bb38b) ) // sprites ROM_REGION( 0x4000, "gfx3", 0 ) ROM_LOAD( "ac0-7.9f", 0x0000, 0x2000, CRC(ef5f28c6) SHA1(85d943e5c5136d9458118f676b0c79fcf3aaf0c4) ) ROM_LOAD( "ac0-8.9h", 0x2000, 0x2000, CRC(46824b30) SHA1(f6880b1c31ae795e3781d16ee96145df1db60328) ) ROM_REGION( 0x0360, "proms", 0 ) - ROM_LOAD( "ac0-1.11c", 0x0000, 0x0100, CRC(5c4b2adc) SHA1(0a6fdd60bdbd56bb7573147e4a976e5d0ddf43b5) ) /* palette low bits */ - ROM_LOAD( "ac0-2.11cd", 0x0100, 0x0100, CRC(966bda66) SHA1(05439508113b3e51a16ee87d3f4691aa8901ebcb) ) /* palette high bits */ - ROM_LOAD( "ac0-3.8c", 0x0200, 0x0100, CRC(dae13f77) SHA1(d4d105542955e806311987dd3c4ffce1e13caf91) ) /* sprite lookup table */ - ROM_LOAD( "003.4e", 0x0300, 0x0020, CRC(43a548b8) SHA1(d01529d7f8f5101232cdf3490fdb2c61bf179181) ) /* address decoder? not used */ - ROM_LOAD( "004.4d", 0x0320, 0x0020, CRC(43a548b8) SHA1(d01529d7f8f5101232cdf3490fdb2c61bf179181) ) /* address decoder? not used */ - ROM_LOAD( "005.3h", 0x0340, 0x0020, CRC(e8d6dec0) SHA1(d15cba9a4b24255d41046b15c2409391ab13ce95) ) /* address decoder? not used */ + ROM_LOAD( "ac0-1.11c", 0x0000, 0x0100, CRC(5c4b2adc) SHA1(0a6fdd60bdbd56bb7573147e4a976e5d0ddf43b5) ) // palette low bits + ROM_LOAD( "ac0-2.11cd", 0x0100, 0x0100, CRC(966bda66) SHA1(05439508113b3e51a16ee87d3f4691aa8901ebcb) ) // palette high bits + ROM_LOAD( "ac0-3.8c", 0x0200, 0x0100, CRC(dae13f77) SHA1(d4d105542955e806311987dd3c4ffce1e13caf91) ) // sprite lookup table + ROM_LOAD( "003.4e", 0x0300, 0x0020, CRC(43a548b8) SHA1(d01529d7f8f5101232cdf3490fdb2c61bf179181) ) // address decoder? not used + ROM_LOAD( "004.4d", 0x0320, 0x0020, CRC(43a548b8) SHA1(d01529d7f8f5101232cdf3490fdb2c61bf179181) ) // address decoder? not used + ROM_LOAD( "005.3h", 0x0340, 0x0020, CRC(e8d6dec0) SHA1(d15cba9a4b24255d41046b15c2409391ab13ce95) ) // address decoder? not used ROM_END ROM_START( gsword2 ) @@ -969,39 +1095,39 @@ ROM_START( gsword2 ) ROM_LOAD( "ac0-15.5h", 0x0000, 0x2000, CRC(1aa4690e) SHA1(7b0dbc38f3e6af2c9efa44b6759a3cdd9adc992d) ) ROM_LOAD( "ac0-16.7h", 0x2000, 0x2000, CRC(10accc10) SHA1(311961bfe852582a9c66aaecf9bc4c8f0ac7fccf) ) - ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64K for 3nd z80 */ + ROM_REGION( 0x10000, "audiocpu", 0 ) // 64K for 3nd z80 ROM_LOAD( "ac0-12.3a", 0x0000, 0x2000, CRC(a6589068) SHA1(9385abe2449c5c5bac8f49d2afd140acea1791c3) ) ROM_LOAD( "ac0-13.4a", 0x2000, 0x2000, CRC(4ee79796) SHA1(3353625903f63910a18fae0a9568a96d75592328) ) ROM_LOAD( "ac0-14.3d", 0x4000, 0x2000, CRC(455364b6) SHA1(ebabf077d1ba113c13e7620d61720ed141acb5ad) ) - /* 6000-7fff empty */ + // 6000-7fff empty - ROM_REGION( 0x10000, "cpu3", 0 ) /* 8741 */ - ROM_LOAD( "aa-013.5a", 0x0000, 0x0800, NO_DUMP ) + ROM_REGION( 0x0400, "mcu1", 0 ) // 8041AH + ROM_LOAD( "aa-013.5a", 0x0000, 0x0400, CRC(e546aa52) SHA1(b8197c836713b1ace8ecd8238e645405c929364f) ) - ROM_REGION( 0x10000, "cpu4", 0 ) /* 8741 */ - ROM_LOAD( "aa-016.9c", 0x0000, 0x0800, NO_DUMP ) + ROM_REGION( 0x0400, "mcu2", 0 ) // 8041AH + ROM_LOAD( "aa-016.9c", 0x0000, 0x0400, CRC(e546aa52) SHA1(b8197c836713b1ace8ecd8238e645405c929364f) ) - ROM_REGION( 0x10000, "cpu5", 0 ) /* 8741 */ - ROM_LOAD( "aa-017.9g", 0x0000, 0x0800, NO_DUMP ) + ROM_REGION( 0x0400, "mcu3", 0 ) // 8041AH + ROM_LOAD( "aa-017.9g", 0x0000, 0x0400, CRC(e546aa52) SHA1(b8197c836713b1ace8ecd8238e645405c929364f) ) ROM_REGION( 0x4000, "gfx1", 0 ) - ROM_LOAD( "ac1-10.9n", 0x0000, 0x2000, CRC(517c571b) SHA1(05572a8ea416922da50143936fda9ba038f0b91e) ) /* tiles */ + ROM_LOAD( "ac1-10.9n", 0x0000, 0x2000, CRC(517c571b) SHA1(05572a8ea416922da50143936fda9ba038f0b91e) ) // tiles ROM_LOAD( "ac1-11.9p", 0x2000, 0x2000, CRC(7a1d8a3a) SHA1(3f90be9ddba3cf7a879fd69ac67c2b67fd63b9ee) ) ROM_REGION( 0x2000, "gfx2", 0 ) - ROM_LOAD( "ac1-6.9e", 0x0000, 0x2000, CRC(1b0a3cb7) SHA1(0b0f17b9844d7310b46110559e09cfc3b50bb38b) ) /* sprites */ + ROM_LOAD( "ac1-6.9e", 0x0000, 0x2000, CRC(1b0a3cb7) SHA1(0b0f17b9844d7310b46110559e09cfc3b50bb38b) ) // sprites ROM_REGION( 0x4000, "gfx3", 0 ) ROM_LOAD( "ac0-7.9f", 0x0000, 0x2000, CRC(ef5f28c6) SHA1(85d943e5c5136d9458118f676b0c79fcf3aaf0c4) ) ROM_LOAD( "ac0-8.9h", 0x2000, 0x2000, CRC(46824b30) SHA1(f6880b1c31ae795e3781d16ee96145df1db60328) ) ROM_REGION( 0x0360, "proms", 0 ) - ROM_LOAD( "ac0-1.11c", 0x0000, 0x0100, CRC(5c4b2adc) SHA1(0a6fdd60bdbd56bb7573147e4a976e5d0ddf43b5) ) /* palette low bits */ - ROM_LOAD( "ac0-2.11cd", 0x0100, 0x0100, CRC(966bda66) SHA1(05439508113b3e51a16ee87d3f4691aa8901ebcb) ) /* palette high bits */ - ROM_LOAD( "ac0-3.8c", 0x0200, 0x0100, CRC(dae13f77) SHA1(d4d105542955e806311987dd3c4ffce1e13caf91) ) /* sprite lookup table */ - ROM_LOAD( "003.4e", 0x0300, 0x0020, CRC(43a548b8) SHA1(d01529d7f8f5101232cdf3490fdb2c61bf179181) ) /* address decoder? not used */ - ROM_LOAD( "004.4d", 0x0320, 0x0020, CRC(43a548b8) SHA1(d01529d7f8f5101232cdf3490fdb2c61bf179181) ) /* address decoder? not used */ - ROM_LOAD( "005.3h", 0x0340, 0x0020, CRC(e8d6dec0) SHA1(d15cba9a4b24255d41046b15c2409391ab13ce95) ) /* address decoder? not used */ + ROM_LOAD( "ac0-1.11c", 0x0000, 0x0100, CRC(5c4b2adc) SHA1(0a6fdd60bdbd56bb7573147e4a976e5d0ddf43b5) ) // palette low bits + ROM_LOAD( "ac0-2.11cd", 0x0100, 0x0100, CRC(966bda66) SHA1(05439508113b3e51a16ee87d3f4691aa8901ebcb) ) // palette high bits + ROM_LOAD( "ac0-3.8c", 0x0200, 0x0100, CRC(dae13f77) SHA1(d4d105542955e806311987dd3c4ffce1e13caf91) ) // sprite lookup table + ROM_LOAD( "003.4e", 0x0300, 0x0020, CRC(43a548b8) SHA1(d01529d7f8f5101232cdf3490fdb2c61bf179181) ) // address decoder? not used + ROM_LOAD( "004.4d", 0x0320, 0x0020, CRC(43a548b8) SHA1(d01529d7f8f5101232cdf3490fdb2c61bf179181) ) // address decoder? not used + ROM_LOAD( "005.3h", 0x0340, 0x0020, CRC(e8d6dec0) SHA1(d15cba9a4b24255d41046b15c2409391ab13ce95) ) // address decoder? not used ROM_END ROM_START( josvolly ) @@ -1015,38 +1141,38 @@ ROM_START( josvolly ) ROM_LOAD( "aa3-12.2h", 0x0000, 0x1000, CRC(3796bbf6) SHA1(8741f556ddb06e7779d1e8abc3d06688881f8269) ) ROM_LOAD( "aa0-13.2j", 0x2000, 0x2000, CRC(58cc89ac) SHA1(9785ec27e593b3e249da7a1b6b025c6d573e28f9) ) - 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_REGION( 0x400, "mcu1", 0 ) 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_LOAD( "aa008.bin", 0x0000, 0x400, CRC(68b399d9) SHA1(053482d12c2b714c23fc80ad0589a2afd258a5a6) ) 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_RELOAD( 0x3000, 0x1000 ) // title screen data is actually read from here ROM_REGION( 0x2000, "gfx2", 0 ) - ROM_LOAD( "aa0-6.9e", 0x0000, 0x2000, CRC(c2c2401a) SHA1(ef987d53d9e502277086f39b455174d3539572e6) ) /* sprites */ + ROM_LOAD( "aa0-6.9e", 0x0000, 0x2000, CRC(c2c2401a) SHA1(ef987d53d9e502277086f39b455174d3539572e6) ) // sprites */ ROM_REGION( 0x4000, "gfx3", 0 ) ROM_LOAD( "aa0-7.9f", 0x0000, 0x2000, CRC(da836231) SHA1(209723778b705dba8206b56c3b8f0996f02ba8d5) ) ROM_LOAD( "aa0-8.9h", 0x2000, 0x2000, CRC(a0426d57) SHA1(d029408e005ea57f4902c081203f3d3980a5f927) ) ROM_REGION( 0x0460, "proms", 0 ) - ROM_LOAD( "a1.10k", 0x0000, 0x0100, CRC(09f7b56a) SHA1(9b82d1d4ebab14b366dc0ca95c933e37811ac155) ) /* palette red? */ - ROM_LOAD( "a2.9k", 0x0100, 0x0100, CRC(852eceac) SHA1(6ed7011b45cf767d6503b92d29a14a7b8e099a76) ) /* palette green? */ - ROM_LOAD( "a3.9j", 0x0200, 0x0100, CRC(1312718b) SHA1(4a7d7eae4d8ea085eead46758832fddac7aff0b0) ) /* palette blue? */ - ROM_LOAD( "a4.8c", 0x0300, 0x0100, CRC(1dcec967) SHA1(4d36842c2fd929a6508a58bc8ea7e0372296e575) ) /* sprite lookup table */ - ROM_LOAD( "003.4e", 0x0400, 0x0020, CRC(43a548b8) SHA1(d01529d7f8f5101232cdf3490fdb2c61bf179181) ) /* address decoder? not used */ - ROM_LOAD( "004.4d", 0x0420, 0x0020, CRC(43a548b8) SHA1(d01529d7f8f5101232cdf3490fdb2c61bf179181) ) /* address decoder? not used */ - ROM_LOAD( "005.3h", 0x0440, 0x0020, CRC(e8d6dec0) SHA1(d15cba9a4b24255d41046b15c2409391ab13ce95) ) /* address decoder? not used */ + ROM_LOAD( "a1.10k", 0x0000, 0x0100, CRC(09f7b56a) SHA1(9b82d1d4ebab14b366dc0ca95c933e37811ac155) ) // palette red? + ROM_LOAD( "a2.9k", 0x0100, 0x0100, CRC(852eceac) SHA1(6ed7011b45cf767d6503b92d29a14a7b8e099a76) ) // palette green? + ROM_LOAD( "a3.9j", 0x0200, 0x0100, CRC(1312718b) SHA1(4a7d7eae4d8ea085eead46758832fddac7aff0b0) ) // palette blue? + ROM_LOAD( "a4.8c", 0x0300, 0x0100, CRC(1dcec967) SHA1(4d36842c2fd929a6508a58bc8ea7e0372296e575) ) // sprite lookup table + ROM_LOAD( "003.4e", 0x0400, 0x0020, CRC(43a548b8) SHA1(d01529d7f8f5101232cdf3490fdb2c61bf179181) ) // address decoder? not used + ROM_LOAD( "004.4d", 0x0420, 0x0020, CRC(43a548b8) SHA1(d01529d7f8f5101232cdf3490fdb2c61bf179181) ) // address decoder? not used + ROM_LOAD( "005.3h", 0x0440, 0x0020, CRC(e8d6dec0) SHA1(d15cba9a4b24255d41046b15c2409391ab13ce95) ) // address decoder? not used ROM_END GAME( 1983, josvolly, 0, josvolly, josvolly, josvolly_state, empty_init, ROT90, "Allumer / Taito Corporation", "Joshi Volleyball", MACHINE_NOT_WORKING | MACHINE_UNEMULATED_PROTECTION | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) -GAME( 1984, gsword, 0, gsword, gsword, gsword_state, init_gsword, ROT0, "Allumer / Taito Corporation", "Great Swordsman (World?)", MACHINE_SUPPORTS_SAVE ) -GAME( 1984, gsword2, gsword, gsword, gsword, gsword_state, init_gsword2, ROT0, "Allumer / Taito Corporation", "Great Swordsman (Japan?)", MACHINE_SUPPORTS_SAVE ) +GAME( 1984, gsword, 0, gsword, gsword, gsword_state, init_gsword, ROT0, "Allumer / Taito Corporation", "Great Swordsman (World?)", MACHINE_UNEMULATED_PROTECTION | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) +GAME( 1984, gsword2, gsword, gsword, gsword, gsword_state, init_gsword2, ROT0, "Allumer / Taito Corporation", "Great Swordsman (Japan?)", MACHINE_UNEMULATED_PROTECTION | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) |