summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/gsword.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/gsword.cpp')
-rw-r--r--src/mame/drivers/gsword.cpp1193
1 files changed, 0 insertions, 1193 deletions
diff --git a/src/mame/drivers/gsword.cpp b/src/mame/drivers/gsword.cpp
deleted file mode 100644
index 8ec1b6c680c..00000000000
--- a/src/mame/drivers/gsword.cpp
+++ /dev/null
@@ -1,1193 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Steve Ellenoff,Jarek Parchanski,Vas Crabb
-/*
- Great Swordsman (Taito) 1984
- Joshi Volleyball (Taito) 1983
-
-TODO:
-
--joshi volleyball
- -The incomplete graphic
- -The implementation of DAC sound ?
- -MCU hookup is incomplete
- -The true interrupt circuit of SUB CPU
- -unknown ROM (BANK ROM of sub-cpu ?)
-
-Credits:
-- Steve Ellenoff: Original emulation and Mame driver
-- Jarek Parchanski: Dip Switch Fixes, Color improvements, ADPCM Interface code
-- Tatsuyuki Satoh: sound improvements, NEC 8741 emulation, adpcm improvements,
- josvollyvall 8741 emulation
-- Charlie Miltenberger: sprite colors improvements & precious hardware
- information and screenshots
-
-Trick:
-If you want fight with ODILION swordsman patch program for 1st CPU
-at these addresses, otherwise you won't never fight with him.
-
- ROM[0x2256] = 0
- ROM[0x2257] = 0
- ROM[0x2258] = 0
- ROM[0x2259] = 0
- ROM[0x225A] = 0
-
-
-There are 3 Z80s and two AY-3-8910s..
-
-Prelim memory map (last updated 6/15/98)
-*****************************************
-GS1 z80 Main Code (8K) 0000-1FFF
-Gs2 z80 Game Data (8K) 2000-3FFF
-Gs3 z80 Game Data (8K) 4000-5FFF
-Gs4 z80 Game Data (8K) 6000-7FFF
-Gs5 z80 Game Data (4K) 8000-8FFF
-Gs6 Sprites (8K)
-Gs7 Sprites (8K)
-Gs8 Sprites (8K)
-Gs10 Tiles (8K)
-Gs11 Tiles (8K)
-Gs12 3rd z80 CPU & (8K)
- ADPCM Samples?
-Gs13 ADPCM Samples? (8K)
-Gs14 ADPCM Samples? (8K)
-Gs15 2nd z80 CPU (8K) 0000-1FFF
-Gs16 2nd z80 Data (8K) 2000-3FFF
-*****************************************
-
-**********
-*Main Z80*
-**********
-
- 9000 - 9fff Work Ram
- 982e - 982e Free play
- 98e0 - 98e0 Coin Input
- 98e1 - 98e1 Player 1 Controls
- 98e2 - 98e2 Player 2 Controls
- 9c00 - 9c30 (Hi score - Scores)
- 9c78 - 9cd8 (Hi score - Names)
- 9e00 - 9e7f Sprites in working ram!
- 9e80 - 9eff Sprite X & Y in working ram!
-
- a000 - afff Sprite RAM & Video Attributes
- a000 - a37F ???
- a380 - a77F Sprite Tile #s
- a780 - a7FF Sprite Y & X positions
- a980 - a980 Background Tile Bank Select
- ab00 - ab00 Background Tile Y-Scroll register
- ab80 - abff Sprite Attributes(X & Y Flip)
-
- b000 - b7ff Screen RAM
- b800 - ffff not used?!
-
-PORTS:
-7e 8741-#0 data port
-7f 8741-#0 command / status port
-
-*************
-*2nd Z80 CPU*
-*************
-0000 - 3FFF ROM CODE
-4000 - 43FF WORK RAM
-
-write
-6000 adpcm sound command for 3rd CPU
-
-PORTS:
-00 8741-#2 data port
-01 8741-#2 command / status port
-40 8741-#1 data port
-41 8741-#1 command / status port
-
-read:
-60 fake port #0 ?
-61 ay8910-#0 read port
-data / ay8910-#0 read
-80 fake port #1 ?
-81 ay8910-#1 read port
-
-write:
-60 ay8910-#0 control port
-61 ay8910-#0 data port
-80 ay8910-#1 control port
-81 ay8910-#1 data port
- ay8910-A : NMI control ?
-a0 unknown
-e0 unknown (watch dog?)
-
-*************
-*3rd Z80 CPU*
-*************
-0000-5fff ROM
-
-read:
-a000 adpcm sound command
-
-write:
-6000 MSM5205 reset and data
-
-*************
-I8741 communication data
-
-reg: 0->1 (main->2nd) / : (1->0) 2nd->main :
- 0 : DSW.2 (port) : DSW.1(port)
- 1 : DSW.1 : DSW.2
- 2 : IN0 / sound error code :
- 3 : IN1 / ? :
- 4 : IN2 :
- 4 : IN3 :
- 5 : :
- 6 : : DSW0?
- 7 : : ?
-
-gsword notes:
-
-There are two 8041 MCUs and one 8741 MCU:
-* 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.
-* TODO: confirm which MCU is connected to which CPU.
-
-So far, only the AA-016 MCU has been dumped successfully. There's no
-reason to believe that the AA-017 MCU runs a different program. 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 AA-016 MCU program is divided into several parts, each entirely
-contained in a single program page. The initialisation/self test, mode
-selection, and the main loop of the communication mode are in page 0;
-the subroutines implementing communication mode are in page 1; the
-input/coin handling main loop and host communiction code is in page 2;
-finally, the subroutines that implement coin handling are in page 3.
-This suggests componentes were assigned to different developers who were
-each given exclusive use of a page to simplify integration. There was
-insufficient space in page 3 for the program checksum fragment, so the
-coin handling subroutines are not checksummed, despite plenty of zero-
-filled space elsewhere in the ROM.
-
-At least two Great Swordsman boards have been seen with a UVEPROM-based
-D8741A-8 MCU for AA-103 at 5A. This suggests the developers made some
-last-minute change to the code that only affected one of the three use
-cases. The AA-016 program contains complete code for communication and
-input/coin handling, so it would have to be some change in behaviour.
-One possibility is that they decided they needed to ensure the coin
-handling code is checksummed, and rearranged or refactored the code to
-allow this.
-
-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"
-#include "includes/gsword.h"
-
-#include "cpu/mcs48/mcs48.h"
-#include "cpu/z80/z80.h"
-#include "machine/clock.h"
-#include "machine/i8255.h"
-#include "screen.h"
-#include "speaker.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(data);
- m_fake8910_0 = data;
-}
-WRITE8_MEMBER(gsword_state_base::ay8910_control_port_1_w)
-{
- m_ay1->address_w(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 */
-/* (402E) timeout upcount must be under 0AH */
-/* (4004,4005) clear down counter , if (4004,4005)==0 then (402E)=0 */
-READ8_MEMBER(gsword_state::hack_r)
-{
- 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]); */
-
- /* speedup timeout count down */
- if (m_protect_hack)
- {
- switch(offset)
- {
- case 0: return data & 0x7f;
- case 1: return 0x00;
- }
- }
- return data;
-}
-
-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(data);
- m_audiocpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero);
-}
-
-WRITE8_MEMBER(gsword_state::adpcm_data_w)
-{
- m_msm->write_data(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::mcu2_p1_r)
-{
- // 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);
-}
-
-WRITE8_MEMBER(gsword_state::mcu3_p2_w)
-{
- 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)
-{
- if (m_nmi_enable)
- device.execute().pulse_input_line(INPUT_LINE_NMI, attotime::zero);
-}
-
-void gsword_state::init_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 */
- 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(*this, FUNC(gsword_state::hack_r)));
-#endif
-}
-
-void gsword_state::init_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(*this, FUNC(gsword_state::hack_r)));
-#endif
-}
-
-void gsword_state::machine_start()
-{
- gsword_state_base::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()
-{
- gsword_state_base::machine_reset();
-
- m_protect_hack = false;
- m_nmi_enable = false;
-}
-
-
-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();
-}
-
-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_audiocpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero);
- 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;
-}
-
-
-void gsword_state_base::cpu1_map(address_map &map)
-{
- map(0x0000, 0x8fff).rom();
- map(0x9000, 0x9fff).ram();
- map(0xa000, 0xa37f).ram();
- map(0xa380, 0xa3ff).ram().share("spritetile_ram");
- map(0xa400, 0xa77f).ram();
- map(0xa780, 0xa7ff).ram().share("spritexy_ram");
- map(0xa980, 0xa980).w(FUNC(gsword_state_base::charbank_w));
- map(0xaa80, 0xaa80).w(FUNC(gsword_state_base::videoctrl_w)); /* flip screen, char palette bank */
- map(0xab00, 0xab00).w(FUNC(gsword_state_base::scroll_w));
- map(0xab80, 0xabff).writeonly().share("spriteattram");
- map(0xb000, 0xb7ff).readonly().w(FUNC(gsword_state_base::videoram_w)).share("videoram");
-}
-
-
-void gsword_state::cpu1_io_map(address_map &map)
-{
- map.global_mask(0xff);
- 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)
-{
- map(0x0000, 0x3fff).rom();
- map(0x4000, 0x43ff).ram().share("cpu2_ram");
- map(0x6000, 0x6000).w(FUNC(gsword_state::sound_command_w));
-}
-
-void gsword_state::cpu2_io_map(address_map &map)
-{
- map.global_mask(0xff);
- 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));
- map(0x81, 0x81).rw(m_ay1, FUNC(ay8910_device::data_r), FUNC(ay8910_device::data_w));
-
- map(0xe0, 0xe0).nopr(); /* ?? */
- map(0xa0, 0xa0).nopw(); /* ?? */
- map(0xe0, 0xe0).nopw(); /* watchdog? */
-}
-
-void gsword_state::cpu3_map(address_map &map)
-{
- map(0x0000, 0x7fff).rom();
- map(0x8000, 0x8000).w(FUNC(gsword_state::adpcm_data_w));
- map(0xa000, 0xa000).r(m_soundlatch, FUNC(generic_latch_8_device::read));
-}
-
-
-void josvolly_state::josvolly_cpu1_io_map(address_map &map)
-{
- map.global_mask(0xff);
- map(0x7e, 0x7f).rw("mcu1", FUNC(upi41_cpu_device::upi41_master_r), FUNC(upi41_cpu_device::upi41_master_w));
-}
-
-void josvolly_state::josvolly_cpu2_map(address_map &map)
-{
- map(0x0000, 0x3fff).rom();
- map(0x4000, 0x43ff).ram().share("cpu2_ram");
-
- /* NEC D8255A with silkscreen removed and replaced with "AA 007" */
- map(0x8000, 0x8003).rw("aa_007", FUNC(i8255_device::read), FUNC(i8255_device::write));
-
-// map(0x6000, 0x6000).w(FUNC(josvolly_state::adpcm_soundcommand_w));
- map(0xA000, 0xA001).rw("mcu2", FUNC(upi41_cpu_device::upi41_master_r), FUNC(upi41_cpu_device::upi41_master_w));
-}
-
-void josvolly_state::josvolly_cpu2_io_map(address_map &map)
-{
- map.global_mask(0xff);
- map(0x00, 0x00).rw(FUNC(josvolly_state::fake_0_r), FUNC(josvolly_state::ay8910_control_port_0_w));
- map(0x01, 0x01).rw(m_ay0, FUNC(ay8910_device::data_r), FUNC(ay8910_device::data_w));
- map(0x40, 0x40).rw(FUNC(josvolly_state::fake_1_r), FUNC(josvolly_state::ay8910_control_port_1_w));
- map(0x41, 0x41).rw(m_ay1, FUNC(ay8910_device::data_r), FUNC(ay8910_device::data_w));
-
- map(0x81, 0x81).w(FUNC(josvolly_state::cpu2_nmi_enable_w));
- map(0xC1, 0xC1).w(FUNC(josvolly_state::cpu2_irq_clear_w));
-}
-
-
-static INPUT_PORTS_START( gsword )
- 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")
- 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")
- 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 )
- PORT_START("IN0") /* IN0 */
- PORT_BIT( 0x01, IP_ACTIVE_LOW , IPT_START2 )
- PORT_BIT( 0x02, IP_ACTIVE_LOW , IPT_START1 )
- PORT_BIT( 0x04, IP_ACTIVE_LOW , IPT_COIN2 ) PORT_IMPULSE(1)
- PORT_BIT( 0x08, IP_ACTIVE_LOW , IPT_COIN1 ) PORT_IMPULSE(1)
- 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_UNKNOWN )
-
- PORT_START("IN1") /* IN1 */
- PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY
- PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY
- PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY
- PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY
- PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 )
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 )
- PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN )
- PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN )
-
- PORT_START("IN2") /* IN2 */
- PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_COCKTAIL
- PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_COCKTAIL
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_COCKTAIL
- PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_COCKTAIL
- PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL
- PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_COCKTAIL
- PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN )
- PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN )
-
- PORT_START("DSW1") /* DSW1 */
- 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( 0x08, "1" )
- PORT_DIPSETTING( 0x04, "2" )
- PORT_DIPSETTING( 0x00, "3" )
- PORT_DIPNAME( 0x30, 0x30, "982A" ) PORT_DIPLOCATION("DIPSW1:5,6")
- PORT_DIPSETTING( 0x00, "60" )
- PORT_DIPSETTING( 0x10, "90" )
- PORT_DIPSETTING( 0x20, "120" )
- PORT_DIPSETTING( 0x30, "150" )
- PORT_DIPNAME( 0x40, 0x40, "TEST_MODE" ) PORT_DIPLOCATION("DIPSW1:7")
- PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unused ) ) PORT_DIPLOCATION("DIPSW1:8")
- PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
-
- PORT_START("DSW2") /* DSW2 */
- PORT_DIPNAME( 0x01, 0x01, "982C" ) PORT_DIPLOCATION("DIPSW2:8")
- PORT_DIPSETTING( 0x01, "0" )
- PORT_DIPSETTING( 0x00, "1" )
- PORT_DIPNAME( 0x02, 0x02, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("DIPSW2:7")
- PORT_DIPSETTING( 0x02, DEF_STR( Upright ) )
- PORT_DIPSETTING( 0x00, DEF_STR( Cocktail ) )
- PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("DIPSW2:6,5")
- PORT_DIPSETTING( 0x00, DEF_STR( 5C_1C ) )
- PORT_DIPSETTING( 0x08, DEF_STR( 4C_1C ) )
- PORT_DIPSETTING( 0x04, DEF_STR( 2C_1C ) )
- PORT_DIPSETTING( 0x0c, DEF_STR( 1C_1C ) )
- PORT_DIPNAME( 0x30, 0x30, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("DIPSW2:4,3")
- PORT_DIPSETTING( 0x30, DEF_STR( 1C_1C ) )
- PORT_DIPSETTING( 0x10, DEF_STR( 1C_2C ) )
- PORT_DIPSETTING( 0x20, DEF_STR( 1C_4C ) )
- PORT_DIPSETTING( 0x00, DEF_STR( 1C_5C ) )
- PORT_DIPNAME( 0x40, 0x40, "9827" ) PORT_DIPLOCATION("DIPSW2:2")
- 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
-
-
-static const gfx_layout gsword_text =
-{
- 8,8, /* 8x8 characters */
- 1024, /* 1024 characters */
- 2, /* 2 bits per pixel */
- { 0, 4 }, /* the two bitplanes for 4 pixels are packed into one byte */
- { 0, 1, 2, 3, 8*8+0, 8*8+1, 8*8+2, 8*8+3 },
- { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
- 16*8 /* every char takes 16 bytes */
-};
-
-static const gfx_layout gsword_sprites1 =
-{
- 16,16, /* 16x16 sprites */
- 64*2, /* 128 sprites */
- 2, /* 2 bits per pixel */
- { 0, 4 }, /* the two bitplanes for 4 pixels are packed into one byte */
- { 0, 1, 2, 3, 8*8+0, 8*8+1, 8*8+2, 8*8+3,
- 16*8+0, 16*8+1, 16*8+2, 16*8+3, 24*8+0, 24*8+1, 24*8+2, 24*8+3},
- { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8,
- 32*8, 33*8, 34*8, 35*8, 36*8, 37*8, 38*8, 39*8 },
- 64*8 /* every sprite takes 64 bytes */
-};
-
-static const gfx_layout gsword_sprites2 =
-{
- 32,32, /* 32x32 sprites */
- 64, /* 64 sprites */
- 2, /* 2 bits per pixel */
- { 0, 4 }, /* the two bitplanes for 4 pixels are packed into one byte */
- { 0, 1, 2, 3, 8*8+0, 8*8+1, 8*8+2, 8*8+3,
- 16*8+0, 16*8+1, 16*8+2, 16*8+3, 24*8+0, 24*8+1, 24*8+2, 24*8+3,
- 64*8+0, 64*8+1, 64*8+2, 64*8+3, 72*8+0, 72*8+1, 72*8+2, 72*8+3,
- 80*8+0, 80*8+1, 80*8+2, 80*8+3, 88*8+0, 88*8+1, 88*8+2, 88*8+3},
- { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8,
- 32*8, 33*8, 34*8, 35*8, 36*8, 37*8, 38*8, 39*8,
- 128*8, 129*8, 130*8, 131*8, 132*8, 133*8, 134*8, 135*8,
- 160*8, 161*8, 162*8, 163*8, 164*8, 165*8, 166*8, 167*8 },
- 64*8*4 /* every sprite takes (64*8=16x6)*4) bytes */
-};
-
-static GFXDECODE_START( gfx_gsword )
- GFXDECODE_ENTRY( "gfx1", 0, gsword_text, 0, 64 )
- GFXDECODE_ENTRY( "gfx2", 0, gsword_sprites1, 64*4, 64 )
- GFXDECODE_ENTRY( "gfx3", 0, gsword_sprites2, 64*4, 64 )
-GFXDECODE_END
-
-
-void gsword_state::gsword(machine_config &config)
-{
- /* basic machine hardware */
- Z80(config, m_maincpu, XTAL(18'000'000)/6); // verified on PCB
- m_maincpu->set_addrmap(AS_PROGRAM, &gsword_state::cpu1_map);
- m_maincpu->set_addrmap(AS_IO, &gsword_state::cpu1_io_map);
- m_maincpu->set_vblank_int("screen", FUNC(gsword_state::irq0_line_hold));
-
- Z80(config, m_subcpu, XTAL(18'000'000)/6); // verified on PCB
- m_subcpu->set_addrmap(AS_PROGRAM, &gsword_state::cpu2_map);
- m_subcpu->set_addrmap(AS_IO, &gsword_state::cpu2_io_map);
- m_subcpu->set_periodic_int(FUNC(gsword_state::sound_interrupt), attotime::from_hz(4*60));
-
- Z80(config, m_audiocpu, XTAL(18'000'000)/6); // verified on PCB
- m_audiocpu->set_addrmap(AS_PROGRAM, &gsword_state::cpu3_map);
-
- upi41_cpu_device &mcu1(I8041A(config, "mcu1", XTAL(12'000'000)/2)); // verified on PCB
- 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(I8041A(config, "mcu2", XTAL(12'000'000)/2)); // verified on PCB
- 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(I8041A(config, "mcu3", XTAL(12'000'000)/2)); // verified on PCB
- 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
- config.set_perfect_quantum("mcu1");
-
- /* video hardware */
- screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
- screen.set_refresh_hz(60);
- screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
- screen.set_size(32*8, 32*8);
- screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
- screen.set_screen_update(FUNC(gsword_state::screen_update_gsword));
- screen.set_palette(m_palette);
-
- GFXDECODE(config, m_gfxdecode, m_palette, gfx_gsword);
- PALETTE(config, m_palette, FUNC(gsword_state::gsword_palette), 64*4 + 64*4, 256);
-
- /* sound hardware */
- SPEAKER(config, "mono").front_center();
-
- GENERIC_LATCH_8(config, m_soundlatch);
-
- AY8910(config, m_ay0, XTAL(18'000'000)/12).add_route(ALL_OUTPUTS, "mono", 0.30); // Clock verified on PCB
-
- AY8910(config, m_ay1, 1500000);
- m_ay1->port_a_write_callback().set(FUNC(gsword_state::nmi_set_w));
- m_ay1->add_route(ALL_OUTPUTS, "mono", 0.30);
-
- msm5205_device &msm(MSM5205(config, "msm", XTAL(400'000))); // verified on PCB
- msm.set_prescaler_selector(msm5205_device::SEX_4B); /* vclk input mode */
- msm.add_route(ALL_OUTPUTS, "mono", 0.60);
-}
-
-void josvolly_state::josvolly(machine_config &config)
-{
- /* basic machine hardware */
- Z80(config, m_maincpu, 18000000/4); /* ? */
- m_maincpu->set_addrmap(AS_PROGRAM, &josvolly_state::cpu1_map);
- m_maincpu->set_addrmap(AS_IO, &josvolly_state::josvolly_cpu1_io_map);
- m_maincpu->set_periodic_int(FUNC(josvolly_state::irq0_line_hold), attotime::from_hz(2*60));
-
- Z80(config, m_audiocpu, 12000000/4); /* ? */
- m_audiocpu->set_addrmap(AS_PROGRAM, &josvolly_state::josvolly_cpu2_map);
- m_audiocpu->set_addrmap(AS_IO, &josvolly_state::josvolly_cpu2_io_map);
- m_audiocpu->set_vblank_int("screen", FUNC(josvolly_state::irq0_line_assert));
-
- upi41_cpu_device &mcu1(I8741A(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));
-
- upi41_cpu_device &mcu2(I8741A(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(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
- ppi.in_pb_callback().set_ioport("IN2"); // 2PL / ACK
- ppi.in_pc_callback().set_ioport("IN0"); // START
-
- // the second MCU polls the first MCU's outputs, so it needs tight sync
- config.set_perfect_quantum("mcu2");
-
- /* video hardware */
- screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
- screen.set_refresh_hz(60);
- screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
- screen.set_size(32*8, 32*8);
- screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
- screen.set_screen_update(FUNC(josvolly_state::screen_update_gsword));
- screen.set_palette(m_palette);
-
- GFXDECODE(config, m_gfxdecode, m_palette, gfx_gsword);
- PALETTE(config, m_palette, FUNC(josvolly_state::josvolly_palette), 64*4 + 64*4, 256);
-
- /* sound hardware */
- SPEAKER(config, "mono").front_center();
-
- AY8910(config, m_ay0, 1500000).add_route(ALL_OUTPUTS, "mono", 0.30);
- AY8910(config, m_ay1, 1500000).add_route(ALL_OUTPUTS, "mono", 0.30);
-
-#if 0
- MSM5205(config, "msm", 384000).add_route(ALL_OUTPUTS, "mono", 0.60);
-#endif
-}
-
-/***************************************************************************
-
- Game driver(s)
-
-***************************************************************************/
-
-// ac10-* ROM labels were written using a typewriter. The board is a Taito original however.
-ROM_START( gsword )
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD( "ac10-01.2c", 0x0000, 0x2000, CRC(511b9389) SHA1(d24a083e812663522a06138dcc3aa60e48d27434) )
- ROM_LOAD( "ac1-2.2d", 0x2000, 0x2000, CRC(d772accf) SHA1(08028c6f026c118cc375ecff5c24dcb549475633) )
- ROM_LOAD( "ac10-03.2e", 0x4000, 0x2000, CRC(413a0ce6) SHA1(3dde7889db9f449aec5a05a4a3d27e12786df869) )
- ROM_LOAD( "ac1-4.2f", 0x6000, 0x2000, CRC(ca9d206d) SHA1(887eedc4e10218bf149c84399edd5d1e32c85051) )
- ROM_LOAD( "ac1-5.2h", 0x8000, 0x1000, CRC(2a892326) SHA1(a2cd91263714480c2569d3bbc73d62d222175e89) )
-
- ROM_REGION( 0x10000, "sub", 0 )
- 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_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( 0x0400, "mcu1", 0 ) // D8741A-8
- ROM_LOAD( "aa-013.5a", 0x0000, 0x0400, CRC(e546aa52) SHA1(b8197c836713b1ace8ecd8238e645405c929364f) )
-
- ROM_REGION( 0x0400, "mcu2", 0 ) // 8041AH
- ROM_LOAD( "aa-016.9c", 0x0000, 0x0400, CRC(e546aa52) SHA1(b8197c836713b1ace8ecd8238e645405c929364f) )
-
- 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-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_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_END
-
-ROM_START( gsword2 )
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD( "ac1-1.2c", 0x0000, 0x2000, CRC(565c4d9e) SHA1(17b86e86ab95aeb458b8368c8c04666a1ccd9eee) )
- ROM_LOAD( "ac1-2.2d", 0x2000, 0x2000, CRC(d772accf) SHA1(08028c6f026c118cc375ecff5c24dcb549475633) )
- ROM_LOAD( "ac1-3.2e", 0x4000, 0x2000, CRC(2cee1871) SHA1(df099209c56f2807e4fdb83c625368f5e7e583e5) )
- ROM_LOAD( "ac1-4.2f", 0x6000, 0x2000, CRC(ca9d206d) SHA1(887eedc4e10218bf149c84399edd5d1e32c85051) )
- ROM_LOAD( "ac1-5.2h", 0x8000, 0x1000, CRC(2a892326) SHA1(a2cd91263714480c2569d3bbc73d62d222175e89) )
-
- ROM_REGION( 0x10000, "sub", 0 )
- 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_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
-
- ROM_REGION( 0x0400, "mcu1", 0 ) // D8741A-8
- ROM_LOAD( "aa-013.5a", 0x0000, 0x0400, CRC(e546aa52) SHA1(b8197c836713b1ace8ecd8238e645405c929364f) )
-
- ROM_REGION( 0x0400, "mcu2", 0 ) // 8041AH
- ROM_LOAD( "aa-016.9c", 0x0000, 0x0400, CRC(e546aa52) SHA1(b8197c836713b1ace8ecd8238e645405c929364f) )
-
- 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-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_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_END
-
-ROM_START( josvolly )
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD( "aa2-1.2c", 0x0000, 0x2000, CRC(27f740a5) SHA1(3e038386e743fdf718e795a944ff4b631a492958) )
- ROM_LOAD( "aa1-2.2d", 0x2000, 0x2000, CRC(3e02e3e1) SHA1(cc0aee321cf5232438cd6e38635c9060056ad361) )
- ROM_LOAD( "aa0-3.2e", 0x4000, 0x2000, CRC(72843ffe) SHA1(fe70727bbcb0622df81eca2969c1a85398767479) )
- ROM_LOAD( "aa1-4.2f", 0x6000, 0x2000, CRC(22c1466e) SHA1(d86093903e473252c35170e35d7f9ee34194086d) )
-
- ROM_REGION( 0x10000, "audiocpu", 0 )
- 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_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) )
-
- ROM_REGION( 0x4000, "gfx1", 0 )
- 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_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_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_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 )