summaryrefslogtreecommitdiffstatshomepage
path: root/trunk/src/mame/drivers/combatsc.c
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/src/mame/drivers/combatsc.c')
-rw-r--r--trunk/src/mame/drivers/combatsc.c1021
1 files changed, 1021 insertions, 0 deletions
diff --git a/trunk/src/mame/drivers/combatsc.c b/trunk/src/mame/drivers/combatsc.c
new file mode 100644
index 00000000000..ff4199ae0a0
--- /dev/null
+++ b/trunk/src/mame/drivers/combatsc.c
@@ -0,0 +1,1021 @@
+/***************************************************************************
+
+"Combat School" (also known as "Boot Camp") - (Konami GX611)
+
+TODO:
+- Ugly text flickering in various places, namely the text when you finish level 1.
+ This is due of completely busted sprite limit hook-up. (check konicdev.c and MT #00185)
+- it seems that to get correct target colors in firing range III we have to
+ use the WRONG lookup table (the one for tiles instead of the one for
+ sprites).
+- in combatscb, wrong sprite/char priority (see cpu head at beginning of arm
+ wrestling, and heads in intermission after firing range III)
+- hook up sound in bootleg (the current sound is a hack, making use of the
+ Konami ROMset)
+- understand how the trackball really works
+- YM2203 pitch is wrong. Fixing it screws up the tempo.
+
+ Update: 3MHz(24MHz/8) is the more appropriate clock speed for the 2203.
+ It gives the correct pitch(ear subjective) compared to the official
+ soundtrack albeit the music plays slow by about 10%.
+
+ Execution timing of the Z80 is important because it maintains music tempo
+ by polling the 2203's second timer. Even when working alone with no
+ context-switch the chip shouldn't be running at 1.5MHz otherwise it won't
+ keep the right pace. Similar Konami games from the same period(mainevt,
+ battlnts, flkatck...etc.) all have a 3.579545MHz Z80 for sound.
+
+ In spite of adjusting clock speed polling is deemed inaccurate when
+ interleaving is taken into account. A high resolution timer around the
+ poll loop is probably the best bet. The driver sets its timer manually
+ because strange enough, interleaving doesn't occur immediately when
+ cpuexec_boost_interleave() is called. Speculations are TIME_NOWs could have
+ been used as the timer durations to force instant triggering.
+
+
+Credits:
+
+ Hardware Info:
+ Jose Tejada Gomez
+ Manuel Abadia
+ Cesareo Gutierrez
+
+ MAME Driver:
+ Phil Stroffolino
+ Manuel Abadia
+
+Memory Maps (preliminary):
+
+***************************
+* Combat School (bootleg) *
+***************************
+
+MAIN CPU:
+---------
+00c0-00c3 Objects control
+0500 bankswitch control
+0600-06ff palette
+0800-1fff RAM
+2000-2fff Video RAM (banked)
+3000-3fff Object RAM (banked)
+4000-7fff Banked Area + IO + Video Registers
+8000-ffff ROM
+
+SOUND CPU:
+----------
+0000-8000 ROM
+8000-87ef RAM
+87f0-87ff ???
+9000-9001 YM2203
+9008 ???
+9800 OKIM5205?
+a000 soundlatch?
+a800 OKIM5205?
+fffc-ffff ???
+
+
+ Notes about the sound systsem of the bootleg:
+ ---------------------------------------------
+ The positions 0x87f0-0x87ff are very important, it
+ does work similar to a semaphore (same as a lot of
+ vblank bits). For example in the init code, it writes
+ zero to 0x87fa, then it waits to it 'll be different
+ to zero, but it isn't written by this cpu. (shareram?)
+ I have tried put here a K007232 chip, but it didn't
+ work.
+
+ Sound chips: OKI M5205 & YM2203
+
+ We are using the other sound hardware for now.
+
+****************************
+* Combat School (Original) *
+****************************
+
+0000-005f Video Registers (banked)
+0400-0407 input ports
+0408 coin counters
+0410 bankswitch control
+0600-06ff palette
+0800-1fff RAM
+2000-2fff Video RAM (banked)
+3000-3fff Object RAM (banked)
+4000-7fff Banked Area + IO + Video Registers
+8000-ffff ROM
+
+SOUND CPU:
+----------
+0000-8000 ROM
+8000-87ff RAM
+9000 uPD7759
+b000 uPD7759
+c000 uPD7759
+d000 soundlatch_byte_r
+e000-e001 YM2203
+
+
+2008-08:
+Dip location and recommended settings verified with the US manual
+
+***************************************************************************/
+
+#include "emu.h"
+#include "cpu/hd6309/hd6309.h"
+#include "cpu/z80/z80.h"
+#include "sound/2203intf.h"
+#include "sound/upd7759.h"
+#include "sound/msm5205.h"
+#include "video/konicdev.h"
+#include "includes/combatsc.h"
+
+
+/*************************************
+ *
+ * Memory handlers
+ *
+ *************************************/
+
+WRITE8_MEMBER(combatsc_state::combatsc_vreg_w)
+{
+ if (data != m_vreg)
+ {
+ m_textlayer->mark_all_dirty();
+ if ((data & 0x0f) != (m_vreg & 0x0f))
+ m_bg_tilemap[0]->mark_all_dirty();
+ if ((data >> 4) != (m_vreg >> 4))
+ m_bg_tilemap[1]->mark_all_dirty();
+ m_vreg = data;
+ }
+}
+
+WRITE8_MEMBER(combatsc_state::combatscb_sh_irqtrigger_w)
+{
+ soundlatch_byte_w(space, offset, data);
+ device_set_input_line(m_audiocpu, INPUT_LINE_NMI, PULSE_LINE);
+}
+
+READ8_MEMBER(combatsc_state::combatscb_io_r)
+{
+ static const char *const portnames[] = { "IN0", "IN1", "DSW1", "DSW2" };
+
+ return ioport(portnames[offset])->read();
+}
+
+WRITE8_MEMBER(combatsc_state::combatscb_priority_w)
+{
+
+ if (data & 0x40)
+ {
+ m_video_circuit = 1;
+ m_videoram = m_page[1];
+ m_scrollram = m_scrollram1;
+ }
+ else
+ {
+ m_video_circuit = 0;
+ m_videoram = m_page[0];
+ m_scrollram = m_scrollram0;
+ }
+
+ m_priority = data & 0x20;
+}
+
+WRITE8_MEMBER(combatsc_state::combatsc_bankselect_w)
+{
+
+ m_priority = data & 0x20;
+
+ if (data & 0x40)
+ {
+ m_video_circuit = 1;
+ m_videoram = m_page[1];
+ m_scrollram = m_scrollram1;
+ }
+ else
+ {
+ m_video_circuit = 0;
+ m_videoram = m_page[0];
+ m_scrollram = m_scrollram0;
+ }
+
+ if (data & 0x10)
+ membank("bank1")->set_entry((data & 0x0e) >> 1);
+ else
+ membank("bank1")->set_entry(8 + (data & 1));
+}
+
+WRITE8_MEMBER(combatsc_state::combatscb_io_w)
+{
+
+ switch (offset)
+ {
+ case 0x400: combatscb_priority_w(space, 0, data); break;
+ case 0x800: combatscb_sh_irqtrigger_w(space, 0, data); break;
+ case 0xc00: combatsc_vreg_w(space, 0, data); break;
+ default: m_io_ram[offset] = data; break;
+ }
+}
+
+WRITE8_MEMBER(combatsc_state::combatscb_bankselect_w)
+{
+
+ if (data & 0x40)
+ {
+ m_video_circuit = 1;
+ m_videoram = m_page[1];
+ }
+ else
+ {
+ m_video_circuit = 0;
+ m_videoram = m_page[0];
+ }
+
+ data = data & 0x1f;
+
+ if (data != m_bank_select)
+ {
+ m_bank_select = data;
+
+ if (data & 0x10)
+ membank("bank1")->set_entry((data & 0x0e) >> 1);
+ else
+ membank("bank1")->set_entry(8 + (data & 1));
+
+ if (data == 0x1f)
+ {
+ membank("bank1")->set_entry(8 + (data & 1));
+ space.install_write_handler(0x4000, 0x7fff, write8_delegate(FUNC(combatsc_state::combatscb_io_w),this));
+ space.install_read_handler(0x4400, 0x4403, read8_delegate(FUNC(combatsc_state::combatscb_io_r),this));/* IO RAM & Video Registers */
+ }
+ else
+ {
+ space.install_read_bank(0x4000, 0x7fff, "bank1"); /* banked ROM */
+ space.unmap_write(0x4000, 0x7fff); /* banked ROM */
+ }
+ }
+}
+
+/****************************************************************************/
+
+WRITE8_MEMBER(combatsc_state::combatsc_coin_counter_w)
+{
+ /* b7-b3: unused? */
+ /* b1: coin counter 2 */
+ /* b0: coin counter 1 */
+
+ coin_counter_w(machine(), 0, data & 0x01);
+ coin_counter_w(machine(), 1, data & 0x02);
+}
+
+READ8_MEMBER(combatsc_state::trackball_r)
+{
+
+ if (offset == 0)
+ {
+ int i, dir[4];
+ static const char *const tracknames[] = { "TRACK0_Y", "TRACK0_X", "TRACK1_Y", "TRACK1_X" };
+
+ for (i = 0; i < 4; i++)
+ {
+ UINT8 curr;
+
+ curr = ioport(tracknames[i])->read_safe(0xff);
+
+ dir[i] = curr - m_pos[i];
+ m_sign[i] = dir[i] & 0x80;
+ m_pos[i] = curr;
+ }
+
+ /* fix sign for orthogonal movements */
+ if (dir[0] || dir[1])
+ {
+ if (!dir[0]) m_sign[0] = m_sign[1] ^ 0x80;
+ if (!dir[1]) m_sign[1] = m_sign[0];
+ }
+ if (dir[2] || dir[3])
+ {
+ if (!dir[2]) m_sign[2] = m_sign[3] ^ 0x80;
+ if (!dir[3]) m_sign[3] = m_sign[2];
+ }
+ }
+
+ return m_sign[offset] | (m_pos[offset] & 0x7f);
+}
+
+
+/* the protection is a simple multiply */
+WRITE8_MEMBER(combatsc_state::protection_w)
+{
+ m_prot[offset] = data;
+}
+READ8_MEMBER(combatsc_state::protection_r)
+{
+ return ((m_prot[0] * m_prot[1]) >> (offset * 8)) & 0xff;
+}
+WRITE8_MEMBER(combatsc_state::protection_clock_w)
+{
+ /* 0x3f is written here every time before accessing the other registers */
+}
+
+
+/****************************************************************************/
+
+WRITE8_MEMBER(combatsc_state::combatsc_sh_irqtrigger_w)
+{
+ device_set_input_line_and_vector(m_audiocpu, 0, HOLD_LINE, 0xff);
+}
+
+static READ8_DEVICE_HANDLER( combatsc_busy_r )
+{
+ return upd7759_busy_r(device) ? 1 : 0;
+}
+
+static WRITE8_DEVICE_HANDLER( combatsc_play_w )
+{
+ upd7759_start_w(device, data & 2);
+}
+
+static WRITE8_DEVICE_HANDLER( combatsc_voice_reset_w )
+{
+ upd7759_reset_w(device,data & 1);
+}
+
+static WRITE8_DEVICE_HANDLER( combatsc_portA_w )
+{
+ /* unknown. always write 0 */
+}
+
+static READ8_DEVICE_HANDLER ( combatsc_ym2203_r )
+{
+ combatsc_state *state = device->machine().driver_data<combatsc_state>();
+ int status = ym2203_r(device,offset);
+
+ if (cpu_get_pc(state->m_audiocpu) == 0x334)
+ {
+ if (state->m_boost)
+ {
+ state->m_boost = 0;
+ state->m_interleave_timer->adjust(attotime::zero, 0, state->m_audiocpu->cycles_to_attotime(80));
+ }
+ else if (status & 2)
+ {
+ state->m_boost = 1;
+ state->m_interleave_timer->adjust(attotime::zero);
+ }
+ }
+
+ return status;
+}
+
+/*************************************
+ *
+ * Address maps
+ *
+ *************************************/
+
+static ADDRESS_MAP_START( combatsc_map, AS_PROGRAM, 8, combatsc_state )
+ AM_RANGE(0x0000, 0x0007) AM_WRITE(combatsc_pf_control_w)
+ AM_RANGE(0x0020, 0x005f) AM_READWRITE(combatsc_scrollram_r, combatsc_scrollram_w)
+// AM_RANGE(0x0060, 0x00ff) AM_WRITEONLY /* RAM */
+
+ AM_RANGE(0x0200, 0x0201) AM_READWRITE(protection_r, protection_w)
+ AM_RANGE(0x0206, 0x0206) AM_WRITE(protection_clock_w)
+
+ AM_RANGE(0x0400, 0x0400) AM_READ_PORT("IN0")
+ AM_RANGE(0x0401, 0x0401) AM_READ_PORT("DSW3") /* DSW #3 */
+ AM_RANGE(0x0402, 0x0402) AM_READ_PORT("DSW1") /* DSW #1 */
+ AM_RANGE(0x0403, 0x0403) AM_READ_PORT("DSW2") /* DSW #2 */
+ AM_RANGE(0x0404, 0x0407) AM_READ(trackball_r) /* 1P & 2P controls / trackball */
+ AM_RANGE(0x0408, 0x0408) AM_WRITE(combatsc_coin_counter_w) /* coin counters */
+ AM_RANGE(0x040c, 0x040c) AM_WRITE(combatsc_vreg_w)
+ AM_RANGE(0x0410, 0x0410) AM_WRITE(combatsc_bankselect_w)
+ AM_RANGE(0x0414, 0x0414) AM_WRITE(soundlatch_byte_w)
+ AM_RANGE(0x0418, 0x0418) AM_WRITE(combatsc_sh_irqtrigger_w)
+ AM_RANGE(0x041c, 0x041c) AM_WRITE(watchdog_reset_w) /* watchdog reset? */
+
+ AM_RANGE(0x0600, 0x06ff) AM_RAM AM_SHARE("paletteram") /* palette */
+ AM_RANGE(0x0800, 0x1fff) AM_RAM /* RAM */
+ AM_RANGE(0x2000, 0x3fff) AM_READWRITE(combatsc_video_r, combatsc_video_w)
+ AM_RANGE(0x4000, 0x7fff) AM_ROMBANK("bank1") /* banked ROM area */
+ AM_RANGE(0x8000, 0xffff) AM_ROM /* ROM */
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( combatscb_map, AS_PROGRAM, 8, combatsc_state )
+ AM_RANGE(0x0000, 0x04ff) AM_RAM
+ AM_RANGE(0x0500, 0x0500) AM_WRITE(combatscb_bankselect_w)
+ AM_RANGE(0x0600, 0x06ff) AM_RAM AM_SHARE("paletteram") /* palette */
+ AM_RANGE(0x0800, 0x1fff) AM_RAM
+ AM_RANGE(0x2000, 0x3fff) AM_READWRITE(combatsc_video_r, combatsc_video_w)
+ AM_RANGE(0x4000, 0x7fff) AM_ROMBANK("bank1") /* banked ROM/RAM area */
+ AM_RANGE(0x8000, 0xffff) AM_ROM /* ROM */
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( combatsc_sound_map, AS_PROGRAM, 8, combatsc_state )
+ AM_RANGE(0x0000, 0x7fff) AM_ROM /* ROM */
+ AM_RANGE(0x8000, 0x87ff) AM_RAM /* RAM */
+
+ AM_RANGE(0x9000, 0x9000) AM_DEVWRITE_LEGACY("upd", combatsc_play_w) /* upd7759 play voice */
+ AM_RANGE(0xa000, 0xa000) AM_DEVWRITE_LEGACY("upd", upd7759_port_w) /* upd7759 voice select */
+ AM_RANGE(0xb000, 0xb000) AM_DEVREAD_LEGACY("upd", combatsc_busy_r) /* upd7759 busy? */
+ AM_RANGE(0xc000, 0xc000) AM_DEVWRITE_LEGACY("upd", combatsc_voice_reset_w) /* upd7759 reset? */
+
+ AM_RANGE(0xd000, 0xd000) AM_READ(soundlatch_byte_r) /* soundlatch_byte_r? */
+ AM_RANGE(0xe000, 0xe001) AM_DEVREADWRITE_LEGACY("ymsnd", combatsc_ym2203_r, ym2203_w) /* YM 2203 intercepted */
+ADDRESS_MAP_END
+
+static WRITE8_DEVICE_HANDLER( combatscb_dac_w )
+{
+ if(data & 0xe0)
+ printf("%02x\n",data);
+
+ //msm5205_reset_w(device, (data >> 4) & 1);
+ msm5205_data_w(device, (data & 0x0f));
+ msm5205_vclk_w(device, 1);
+ msm5205_vclk_w(device, 0);
+}
+
+static ADDRESS_MAP_START( combatscb_sound_map, AS_PROGRAM, 8, combatsc_state )
+ AM_RANGE(0x0000, 0x7fff) AM_ROM /* ROM */
+ AM_RANGE(0x8000, 0x87ff) AM_RAM /* RAM */
+ AM_RANGE(0x9000, 0x9001) AM_DEVREADWRITE_LEGACY("ymsnd", ym2203_r, ym2203_w) /* YM 2203 */
+ AM_RANGE(0x9008, 0x9009) AM_DEVREAD_LEGACY("ymsnd", ym2203_r) /* ??? */
+ AM_RANGE(0x9800, 0x9800) AM_DEVWRITE_LEGACY("msm5205",combatscb_dac_w)
+ AM_RANGE(0xa000, 0xa000) AM_READ(soundlatch_byte_r) /* soundlatch_byte_r? */
+ADDRESS_MAP_END
+
+/*************************************
+ *
+ * Input ports
+ *
+ *************************************/
+
+static INPUT_PORTS_START( common_inputs )
+ PORT_START("IN0")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1)
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1)
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START1 )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_COIN2 )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN3 )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START("DSW3")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START2 )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_DIPNAME( 0x10, 0x10, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW3:1")
+ PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPUNKNOWN_DIPLOC( 0x20, 0x00, "SW3:2" ) /* Not Used according to the manual */
+ PORT_SERVICE_DIPLOC( 0x40, IP_ACTIVE_LOW, "SW3:3" )
+ PORT_DIPUNKNOWN_DIPLOC( 0x80, 0x00, "SW3:4" ) /* Not Used according to the manual */
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( dips )
+ PORT_START("DSW1")
+ PORT_DIPNAME( 0x0f, 0x0f, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SW1:1,2,3,4")
+ PORT_DIPSETTING( 0x02, DEF_STR( 4C_1C ) )
+ PORT_DIPSETTING( 0x05, DEF_STR( 3C_1C ) )
+ PORT_DIPSETTING( 0x08, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( 3C_2C ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( 4C_3C ) )
+ PORT_DIPSETTING( 0x0f, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x03, DEF_STR( 3C_4C ) )
+ PORT_DIPSETTING( 0x07, DEF_STR( 2C_3C ) )
+ PORT_DIPSETTING( 0x0e, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING( 0x06, DEF_STR( 2C_5C ) )
+ PORT_DIPSETTING( 0x0d, DEF_STR( 1C_3C ) )
+ PORT_DIPSETTING( 0x0c, DEF_STR( 1C_4C ) )
+ PORT_DIPSETTING( 0x0b, DEF_STR( 1C_5C ) )
+ PORT_DIPSETTING( 0x0a, DEF_STR( 1C_6C ) )
+ PORT_DIPSETTING( 0x09, DEF_STR( 1C_7C ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Free_Play ) )
+ PORT_DIPNAME( 0xf0, 0xf0, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("SW1:5,6,7,8")
+ PORT_DIPSETTING( 0x20, DEF_STR( 4C_1C ) )
+ PORT_DIPSETTING( 0x50, DEF_STR( 3C_1C ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( 3C_2C ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( 4C_3C ) )
+ PORT_DIPSETTING( 0xf0, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x30, DEF_STR( 3C_4C ) )
+ PORT_DIPSETTING( 0x70, DEF_STR( 2C_3C ) )
+ PORT_DIPSETTING( 0xe0, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING( 0x60, DEF_STR( 2C_5C ) )
+ PORT_DIPSETTING( 0xd0, DEF_STR( 1C_3C ) )
+ PORT_DIPSETTING( 0xc0, DEF_STR( 1C_4C ) )
+ PORT_DIPSETTING( 0xb0, DEF_STR( 1C_5C ) )
+ PORT_DIPSETTING( 0xa0, DEF_STR( 1C_6C ) )
+ PORT_DIPSETTING( 0x90, DEF_STR( 1C_7C ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( None ) )
+ /* None = coin slot B disabled */
+
+ PORT_START("DSW2")
+ PORT_DIPUNKNOWN_DIPLOC( 0x01, 0x01, "SW2:1" ) /* Not Used according to the manual */
+ PORT_DIPUNKNOWN_DIPLOC( 0x02, 0x02, "SW2:2" ) /* Not Used according to the manual */
+ PORT_DIPNAME( 0x04, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW2:3")
+ PORT_DIPSETTING( 0x00, DEF_STR( Upright ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( Cocktail ) )
+ PORT_DIPUNKNOWN_DIPLOC( 0x08, 0x08, "SW2:4" ) /* Not Used according to the manual */
+ PORT_DIPUNKNOWN_DIPLOC( 0x10, 0x10, "SW2:5" ) /* Not Used according to the manual */
+ PORT_DIPNAME( 0x60, 0x60, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:6,7")
+ PORT_DIPSETTING( 0x60, DEF_STR( Easy ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( Normal ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( Difficult ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Very_Difficult ) )
+ PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8")
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( combatsc )
+ PORT_INCLUDE( dips )
+
+ PORT_INCLUDE( common_inputs )
+
+ PORT_START("IN1")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1)
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( combatsct )
+ PORT_INCLUDE( dips )
+
+ PORT_INCLUDE( common_inputs )
+
+ /* trackball 1P */
+ PORT_START("TRACK0_Y")
+ PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_Y ) PORT_SENSITIVITY(10) PORT_KEYDELTA(10) PORT_REVERSE PORT_PLAYER(1)
+
+ PORT_START("TRACK0_X")
+ PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_X ) PORT_SENSITIVITY(10) PORT_KEYDELTA(10) PORT_PLAYER(1)
+
+ /* trackball 2P (not implemented yet) */
+ PORT_START("TRACK1_Y")
+ PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_Y ) PORT_SENSITIVITY(10) PORT_KEYDELTA(10) PORT_REVERSE PORT_PLAYER(2)
+
+ PORT_START("TRACK1_X")
+ PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_X ) PORT_SENSITIVITY(10) PORT_KEYDELTA(10) PORT_PLAYER(2)
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( combatscb )
+ PORT_INCLUDE( dips )
+
+ PORT_MODIFY("DSW2")
+ PORT_DIPUNKNOWN_DIPLOC( 0x04, 0x00, "SW2:3" )
+ PORT_DIPNAME( 0x10, 0x00, DEF_STR( Allow_Continue ) ) PORT_DIPLOCATION("SW2:5")
+ PORT_DIPSETTING( 0x10, DEF_STR( No ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Yes ) )
+
+ PORT_START("IN0")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1)
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1)
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START1 )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_COIN2 )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START2 )
+
+ PORT_START("IN1")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1)
+INPUT_PORTS_END
+
+
+
+/*************************************
+ *
+ * Graphics definitions
+ *
+ *************************************/
+
+static const gfx_layout gfxlayout =
+{
+ 8,8,
+ 0x4000,
+ 4,
+ { 0,1,2,3 },
+ { 0, 4, 8, 12, 16, 20, 24, 28},
+ { 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32 },
+ 32*8
+};
+
+static const gfx_layout tile_layout =
+{
+ 8,8,
+ 0x2000, /* number of tiles */
+ 4, /* bitplanes */
+ { 0*0x10000*8, 1*0x10000*8, 2*0x10000*8, 3*0x10000*8 }, /* plane offsets */
+ { 0,1,2,3,4,5,6,7 },
+ { 0*8,1*8,2*8,3*8,4*8,5*8,6*8,7*8 },
+ 8*8
+};
+
+static const gfx_layout sprite_layout =
+{
+ 16,16,
+ 0x800, /* number of sprites */
+ 4, /* bitplanes */
+ { 3*0x10000*8, 2*0x10000*8, 1*0x10000*8, 0*0x10000*8 }, /* plane offsets */
+ {
+ 0,1,2,3,4,5,6,7,
+ 16*8+0,16*8+1,16*8+2,16*8+3,16*8+4,16*8+5,16*8+6,16*8+7
+ },
+ {
+ 0*8,1*8,2*8,3*8,4*8,5*8,6*8,7*8,
+ 8*8,9*8,10*8,11*8,12*8,13*8,14*8,15*8
+ },
+ 8*8*4
+};
+
+static GFXDECODE_START( combatsc )
+ GFXDECODE_ENTRY( "gfx1", 0x00000, gfxlayout, 0, 8*16 )
+ GFXDECODE_ENTRY( "gfx2", 0x00000, gfxlayout, 0, 8*16 )
+GFXDECODE_END
+
+static GFXDECODE_START( combatscb )
+ GFXDECODE_ENTRY( "gfx1", 0x00000, tile_layout, 0, 8*16 )
+ GFXDECODE_ENTRY( "gfx1", 0x40000, tile_layout, 0, 8*16 )
+ GFXDECODE_ENTRY( "gfx2", 0x00000, sprite_layout, 0, 8*16 )
+ GFXDECODE_ENTRY( "gfx2", 0x40000, sprite_layout, 0, 8*16 )
+GFXDECODE_END
+
+
+/*************************************
+ *
+ * Machine driver
+ *
+ *************************************/
+
+static const ym2203_interface ym2203_config =
+{
+ {
+ AY8910_LEGACY_OUTPUT,
+ AY8910_DEFAULT_LOADS,
+ DEVCB_NULL,
+ DEVCB_NULL,
+ DEVCB_HANDLER(combatsc_portA_w),
+ DEVCB_NULL
+ },
+ NULL
+};
+
+static const ym2203_interface ym2203_bootleg_config =
+{
+ {
+ AY8910_LEGACY_OUTPUT,
+ AY8910_DEFAULT_LOADS,
+ DEVCB_NULL,
+ DEVCB_NULL,
+ DEVCB_NULL,
+ DEVCB_NULL
+ },
+ NULL
+};
+
+static MACHINE_START( combatsc )
+{
+ combatsc_state *state = machine.driver_data<combatsc_state>();
+ UINT8 *MEM = state->memregion("maincpu")->base() + 0x38000;
+
+ state->m_io_ram = MEM + 0x0000;
+ state->m_page[0] = MEM + 0x4000;
+ state->m_page[1] = MEM + 0x6000;
+
+ state->m_interleave_timer = machine.scheduler().timer_alloc(FUNC_NULL);
+
+ state->m_audiocpu = machine.device<cpu_device>("audiocpu");
+ state->m_k007121_1 = machine.device("k007121_1");
+ state->m_k007121_2 = machine.device("k007121_2");
+
+ state->membank("bank1")->configure_entries(0, 10, state->memregion("maincpu")->base() + 0x10000, 0x4000);
+
+ state->save_item(NAME(state->m_priority));
+ state->save_item(NAME(state->m_vreg));
+ state->save_item(NAME(state->m_bank_select));
+ state->save_item(NAME(state->m_video_circuit));
+ state->save_item(NAME(state->m_boost));
+ state->save_item(NAME(state->m_prot));
+ state->save_item(NAME(state->m_pos));
+ state->save_item(NAME(state->m_sign));
+}
+
+
+static MACHINE_RESET( combatsc )
+{
+ combatsc_state *state = machine.driver_data<combatsc_state>();
+ address_space *space = machine.device("maincpu")->memory().space(AS_PROGRAM);
+ int i;
+
+ memset(state->m_io_ram, 0x00, 0x4000);
+ memset(state->m_page[0], 0x00, 0x2000);
+ memset(state->m_page[1], 0x00, 0x2000);
+
+ state->m_vreg = -1;
+ state->m_boost = 1;
+ state->m_bank_select = -1;
+ state->m_prot[0] = 0;
+ state->m_prot[1] = 0;
+
+ for (i = 0; i < 4; i++)
+ {
+ state->m_pos[i] = 0;
+ state->m_sign[i] = 0;
+ }
+
+ state->combatsc_bankselect_w(*space, 0, 0);
+}
+
+/* combat school (original) */
+static MACHINE_CONFIG_START( combatsc, combatsc_state )
+
+ /* basic machine hardware */
+ MCFG_CPU_ADD("maincpu", HD6309, 3000000*4) /* 3 MHz? */
+ MCFG_CPU_PROGRAM_MAP(combatsc_map)
+ MCFG_CPU_VBLANK_INT("screen", irq0_line_hold)
+
+ MCFG_CPU_ADD("audiocpu", Z80,3579545) /* 3.579545 MHz */
+ MCFG_CPU_PROGRAM_MAP(combatsc_sound_map)
+
+ MCFG_QUANTUM_TIME(attotime::from_hz(1200))
+
+ MCFG_MACHINE_START(combatsc)
+ MCFG_MACHINE_RESET(combatsc)
+
+ /* video hardware */
+ MCFG_SCREEN_ADD("screen", RASTER)
+ MCFG_SCREEN_REFRESH_RATE(60)
+ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
+ MCFG_SCREEN_SIZE(32*8, 32*8)
+ MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
+ MCFG_SCREEN_UPDATE_STATIC(combatsc)
+
+ MCFG_GFXDECODE(combatsc)
+ MCFG_PALETTE_LENGTH(8*16*16)
+
+ MCFG_PALETTE_INIT(combatsc)
+ MCFG_VIDEO_START(combatsc)
+
+ MCFG_K007121_ADD("k007121_1")
+ MCFG_K007121_ADD("k007121_2")
+
+ /* sound hardware */
+ MCFG_SPEAKER_STANDARD_MONO("mono")
+
+ MCFG_SOUND_ADD("ymsnd", YM2203, 3000000)
+ MCFG_SOUND_CONFIG(ym2203_config)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.20)
+
+ MCFG_SOUND_ADD("upd", UPD7759, UPD7759_STANDARD_CLOCK)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.70)
+MACHINE_CONFIG_END
+
+
+static const msm5205_interface msm5205_config =
+{
+ 0, /* interrupt function */
+ MSM5205_SEX_4B /* 8KHz playback ? */
+};
+
+/* combat school (bootleg on different hardware) */
+static MACHINE_CONFIG_START( combatscb, combatsc_state )
+
+ /* basic machine hardware */
+ MCFG_CPU_ADD("maincpu", HD6309, 3000000*4) /* 3 MHz? */
+ MCFG_CPU_PROGRAM_MAP(combatscb_map)
+ MCFG_CPU_VBLANK_INT("screen", irq0_line_hold)
+
+ MCFG_CPU_ADD("audiocpu", Z80,3579545) /* 3.579545 MHz */
+ MCFG_CPU_PROGRAM_MAP(combatscb_sound_map)
+ MCFG_CPU_PERIODIC_INT(irq0_line_hold,4800) // controls BGM tempo
+
+ MCFG_QUANTUM_TIME(attotime::from_hz(1200))
+
+ MCFG_MACHINE_START(combatsc)
+ MCFG_MACHINE_RESET(combatsc)
+
+ /* video hardware */
+ MCFG_SCREEN_ADD("screen", RASTER)
+ MCFG_SCREEN_REFRESH_RATE(60)
+ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
+ MCFG_SCREEN_SIZE(32*8, 32*8)
+ MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
+ MCFG_SCREEN_UPDATE_STATIC(combatscb)
+
+ MCFG_GFXDECODE(combatscb)
+ MCFG_PALETTE_LENGTH(8*16*16)
+
+ MCFG_PALETTE_INIT(combatscb)
+ MCFG_VIDEO_START(combatscb)
+
+ MCFG_SPEAKER_STANDARD_MONO("mono")
+
+ MCFG_SOUND_ADD("ymsnd", YM2203, 3000000)
+ MCFG_SOUND_CONFIG(ym2203_bootleg_config)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.20)
+
+ MCFG_SOUND_ADD("msm5205", MSM5205, 384000)
+ MCFG_SOUND_CONFIG(msm5205_config)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30)
+MACHINE_CONFIG_END
+
+
+
+/*************************************
+ *
+ * ROM definition(s)
+ *
+ *************************************/
+
+ROM_START( combatsc )
+ ROM_REGION( 0x40000, "maincpu", 0 ) /* 6309 code */
+ ROM_LOAD( "611g01.rom", 0x30000, 0x08000, CRC(857ffffe) SHA1(de7566d58314df4b7fdc07eb31a3f9bdd12d1a73) )
+ ROM_CONTINUE( 0x08000, 0x08000 )
+ ROM_LOAD( "611g02.rom", 0x10000, 0x20000, CRC(9ba05327) SHA1(ea03845fb49d18ac4fca97cfffce81db66b9967b) )
+ /* extra 0x8000 for banked RAM */
+
+ ROM_REGION( 0x10000 , "audiocpu", 0 ) /* sound CPU */
+ ROM_LOAD( "611g03.rom", 0x00000, 0x08000, CRC(2a544db5) SHA1(94a97c3c54bf13ccc665aa5057ac6b1d700fae2d) )
+
+ ROM_REGION( 0x80000, "gfx1", 0 )
+ ROM_LOAD16_BYTE( "611g07.rom", 0x00000, 0x40000, CRC(73b38720) SHA1(e109eb78aea464127d813284ca040e8d719599e3) )
+ ROM_LOAD16_BYTE( "611g08.rom", 0x00001, 0x40000, CRC(46e7d28c) SHA1(1ece7fac954204ac35d00f3d573964fcf82dcf77) )
+
+ ROM_REGION( 0x80000, "gfx2", 0 )
+ ROM_LOAD16_BYTE( "611g11.rom", 0x00000, 0x40000, CRC(69687538) SHA1(4349a1c052a759acdf7259f8bf8c5c9489b788f2) )
+ ROM_LOAD16_BYTE( "611g12.rom", 0x00001, 0x40000, CRC(9c6bf898) SHA1(eafc227b4e7df0c652ec7d78784c039c35965fdc) )
+
+ ROM_REGION( 0x0400, "proms", 0 )
+ ROM_LOAD( "611g06.h14", 0x0000, 0x0100, CRC(f916129a) SHA1(d5e4a8a3baab8fcdac86ef5182858cede1abf040) ) /* sprites lookup table */
+ ROM_LOAD( "611g05.h15", 0x0100, 0x0100, CRC(207a7b07) SHA1(f4e638e7f182e5228a062b243406d0ceaaa5bfdc) ) /* chars lookup table */
+ ROM_LOAD( "611g10.h6", 0x0200, 0x0100, CRC(f916129a) SHA1(d5e4a8a3baab8fcdac86ef5182858cede1abf040) ) /* sprites lookup table */
+ ROM_LOAD( "611g09.h7", 0x0300, 0x0100, CRC(207a7b07) SHA1(f4e638e7f182e5228a062b243406d0ceaaa5bfdc) ) /* chars lookup table */
+
+ ROM_REGION( 0x20000, "upd", 0 ) /* uPD7759 data */
+ ROM_LOAD( "611g04.rom", 0x00000, 0x20000, CRC(2987e158) SHA1(87c5129161d3be29a339083349807e60b625c3f7) )
+
+ ROM_REGION( 0x0600, "plds", 0 )
+ ROM_LOAD( "ampal16l8.e7", 0x0000, 0x0104, CRC(300a9936) SHA1(a4a87e93f41392fc7d7d8601d7187d87b9f9ab01) )
+ ROM_LOAD( "pal16r6.16d", 0x0200, 0x0104, NO_DUMP ) /* PAL is read protected */
+ ROM_LOAD( "pal20l8.8h", 0x0400, 0x0144, NO_DUMP ) /* PAL is read protected */
+ROM_END
+
+ROM_START( combatsct )
+ ROM_REGION( 0x40000, "maincpu", 0 ) /* 6309 code */
+ ROM_LOAD( "g01.rom", 0x30000, 0x08000, CRC(489c132f) SHA1(c717195f89add4be4a21ecc1ddd58361b0ab4a74) )
+ ROM_CONTINUE( 0x08000, 0x08000 )
+ ROM_LOAD( "611g02.rom", 0x10000, 0x20000, CRC(9ba05327) SHA1(ea03845fb49d18ac4fca97cfffce81db66b9967b) )
+ /* extra 0x8000 for banked RAM */
+
+ ROM_REGION( 0x10000 , "audiocpu", 0 ) /* sound CPU */
+ ROM_LOAD( "611g03.rom", 0x00000, 0x08000, CRC(2a544db5) SHA1(94a97c3c54bf13ccc665aa5057ac6b1d700fae2d) )
+
+ ROM_REGION( 0x80000, "gfx1", 0 )
+ ROM_LOAD16_BYTE( "611g07.rom", 0x00000, 0x40000, CRC(73b38720) SHA1(e109eb78aea464127d813284ca040e8d719599e3) )
+ ROM_LOAD16_BYTE( "611g08.rom", 0x00001, 0x40000, CRC(46e7d28c) SHA1(1ece7fac954204ac35d00f3d573964fcf82dcf77) )
+
+ ROM_REGION( 0x80000, "gfx2", 0 )
+ ROM_LOAD16_BYTE( "611g11.rom", 0x00000, 0x40000, CRC(69687538) SHA1(4349a1c052a759acdf7259f8bf8c5c9489b788f2) )
+ ROM_LOAD16_BYTE( "611g12.rom", 0x00001, 0x40000, CRC(9c6bf898) SHA1(eafc227b4e7df0c652ec7d78784c039c35965fdc) )
+
+ ROM_REGION( 0x0400, "proms", 0 )
+ ROM_LOAD( "611g06.h14", 0x0000, 0x0100, CRC(f916129a) SHA1(d5e4a8a3baab8fcdac86ef5182858cede1abf040) ) /* sprites lookup table */
+ ROM_LOAD( "611g05.h15", 0x0100, 0x0100, CRC(207a7b07) SHA1(f4e638e7f182e5228a062b243406d0ceaaa5bfdc) ) /* chars lookup table */
+ ROM_LOAD( "611g10.h6", 0x0200, 0x0100, CRC(f916129a) SHA1(d5e4a8a3baab8fcdac86ef5182858cede1abf040) ) /* sprites lookup table */
+ ROM_LOAD( "611g09.h7", 0x0300, 0x0100, CRC(207a7b07) SHA1(f4e638e7f182e5228a062b243406d0ceaaa5bfdc) ) /* chars lookup table */
+
+ ROM_REGION( 0x20000, "upd", 0 ) /* uPD7759 data */
+ ROM_LOAD( "611g04.rom", 0x00000, 0x20000, CRC(2987e158) SHA1(87c5129161d3be29a339083349807e60b625c3f7) )
+ROM_END
+
+ROM_START( combatscj )
+ ROM_REGION( 0x40000, "maincpu", 0 ) /* 6309 code */
+ ROM_LOAD( "611p01.a14", 0x30000, 0x08000, CRC(d748268e) SHA1(91588b6a0d3af47065204b980a56544a9f29b6d9) )
+ ROM_CONTINUE( 0x08000, 0x08000 )
+ ROM_LOAD( "611g02.rom", 0x10000, 0x20000, CRC(9ba05327) SHA1(ea03845fb49d18ac4fca97cfffce81db66b9967b) )
+ /* extra 0x8000 for banked RAM */
+
+ ROM_REGION( 0x10000 , "audiocpu", 0 ) /* sound CPU */
+ ROM_LOAD( "611g03.rom", 0x00000, 0x08000, CRC(2a544db5) SHA1(94a97c3c54bf13ccc665aa5057ac6b1d700fae2d) )
+
+ ROM_REGION( 0x80000, "gfx1", 0 )
+ ROM_LOAD16_BYTE( "611g07.rom", 0x00000, 0x40000, CRC(73b38720) SHA1(e109eb78aea464127d813284ca040e8d719599e3) )
+ ROM_LOAD16_BYTE( "611g08.rom", 0x00001, 0x40000, CRC(46e7d28c) SHA1(1ece7fac954204ac35d00f3d573964fcf82dcf77) )
+
+ ROM_REGION( 0x80000, "gfx2", 0 )
+ ROM_LOAD16_BYTE( "611g11.rom", 0x00000, 0x40000, CRC(69687538) SHA1(4349a1c052a759acdf7259f8bf8c5c9489b788f2) )
+ ROM_LOAD16_BYTE( "611g12.rom", 0x00001, 0x40000, CRC(9c6bf898) SHA1(eafc227b4e7df0c652ec7d78784c039c35965fdc) )
+
+ ROM_REGION( 0x0400, "proms", 0 )
+ ROM_LOAD( "611g06.h14", 0x0000, 0x0100, CRC(f916129a) SHA1(d5e4a8a3baab8fcdac86ef5182858cede1abf040) ) /* sprites lookup table */
+ ROM_LOAD( "611g05.h15", 0x0100, 0x0100, CRC(207a7b07) SHA1(f4e638e7f182e5228a062b243406d0ceaaa5bfdc) ) /* chars lookup table */
+ ROM_LOAD( "611g10.h6", 0x0200, 0x0100, CRC(f916129a) SHA1(d5e4a8a3baab8fcdac86ef5182858cede1abf040) ) /* sprites lookup table */
+ ROM_LOAD( "611g09.h7", 0x0300, 0x0100, CRC(207a7b07) SHA1(f4e638e7f182e5228a062b243406d0ceaaa5bfdc) ) /* chars lookup table */
+
+ ROM_REGION( 0x20000, "upd", 0 ) /* uPD7759 data */
+ ROM_LOAD( "611g04.rom", 0x00000, 0x20000, CRC(2987e158) SHA1(87c5129161d3be29a339083349807e60b625c3f7) )
+ROM_END
+
+ROM_START( bootcamp )
+ ROM_REGION( 0x40000, "maincpu", 0 ) /* 6309 code */
+ ROM_LOAD( "xxx-v01.12a", 0x30000, 0x08000, CRC(c10dca64) SHA1(f34de26e998b1501e430d46e96cdc58ebc68481e) )
+ ROM_CONTINUE( 0x08000, 0x08000 )
+ ROM_LOAD( "611g02.rom", 0x10000, 0x20000, CRC(9ba05327) SHA1(ea03845fb49d18ac4fca97cfffce81db66b9967b) )
+ /* extra 0x8000 for banked RAM */
+
+ ROM_REGION( 0x10000 , "audiocpu", 0 ) /* sound CPU */
+ ROM_LOAD( "611g03.rom", 0x00000, 0x08000, CRC(2a544db5) SHA1(94a97c3c54bf13ccc665aa5057ac6b1d700fae2d) )
+
+ ROM_REGION( 0x80000, "gfx1", 0 )
+ ROM_LOAD16_BYTE( "611g07.rom", 0x00000, 0x40000, CRC(73b38720) SHA1(e109eb78aea464127d813284ca040e8d719599e3) )
+ ROM_LOAD16_BYTE( "611g08.rom", 0x00001, 0x40000, CRC(46e7d28c) SHA1(1ece7fac954204ac35d00f3d573964fcf82dcf77) )
+
+ ROM_REGION( 0x80000, "gfx2", 0 )
+ ROM_LOAD16_BYTE( "611g11.rom", 0x00000, 0x40000, CRC(69687538) SHA1(4349a1c052a759acdf7259f8bf8c5c9489b788f2) )
+ ROM_LOAD16_BYTE( "611g12.rom", 0x00001, 0x40000, CRC(9c6bf898) SHA1(eafc227b4e7df0c652ec7d78784c039c35965fdc) )
+
+ ROM_REGION( 0x0400, "proms", 0 )
+ ROM_LOAD( "611g06.h14", 0x0000, 0x0100, CRC(f916129a) SHA1(d5e4a8a3baab8fcdac86ef5182858cede1abf040) ) /* sprites lookup table */
+ ROM_LOAD( "611g05.h15", 0x0100, 0x0100, CRC(207a7b07) SHA1(f4e638e7f182e5228a062b243406d0ceaaa5bfdc) ) /* chars lookup table */
+ ROM_LOAD( "611g10.h6", 0x0200, 0x0100, CRC(f916129a) SHA1(d5e4a8a3baab8fcdac86ef5182858cede1abf040) ) /* sprites lookup table */
+ ROM_LOAD( "611g09.h7", 0x0300, 0x0100, CRC(207a7b07) SHA1(f4e638e7f182e5228a062b243406d0ceaaa5bfdc) ) /* chars lookup table */
+
+ ROM_REGION( 0x20000, "upd", 0 ) /* uPD7759 data */
+ ROM_LOAD( "611g04.rom", 0x00000, 0x20000, CRC(2987e158) SHA1(87c5129161d3be29a339083349807e60b625c3f7) )
+ROM_END
+
+ROM_START( combatscb )
+ ROM_REGION( 0x40000, "maincpu", 0 ) /* 6809 code */
+ ROM_LOAD( "combat.002", 0x30000, 0x08000, CRC(0996755d) SHA1(bb6bbbf7ab3b5fab5e1c6cebc7b3f0d720493c3b) )
+ ROM_CONTINUE( 0x08000, 0x08000 )
+ ROM_LOAD( "combat.003", 0x10000, 0x10000, CRC(229c93b2) SHA1(ac3fd3df1bb5f6a461d0d1423c50568348ef69df) )
+ ROM_LOAD( "combat.004", 0x20000, 0x10000, CRC(a069cb84) SHA1(f49f70afb17df46b16f5801ef42edb0706730723) )
+ /* extra 0x8000 for banked RAM */
+
+ ROM_REGION( 0x10000 , "audiocpu", 0 ) /* sound CPU */
+ ROM_LOAD( "combat.001", 0x00000, 0x10000, CRC(61456b3b) SHA1(320db628283dd1bec465e95020d1a1158e6d6ae4) )
+
+ ROM_REGION( 0x80000, "gfx1", ROMREGION_INVERT )
+ ROM_LOAD( "combat.006", 0x00000, 0x10000, CRC(8dc29a1f) SHA1(564dd7c6acff34db93b8e300dda563f5f38ba159) ) /* tiles, bank 0 */
+ ROM_LOAD( "combat.008", 0x10000, 0x10000, CRC(61599f46) SHA1(cfd79a88bb496773daf207552c67f595ee696bc4) )
+ ROM_LOAD( "combat.010", 0x20000, 0x10000, CRC(d5cda7cd) SHA1(140db6270c3f358aa27013db3bb819a48ceb5142) )
+ ROM_LOAD( "combat.012", 0x30000, 0x10000, CRC(ca0a9f57) SHA1(d6b3daf7c34345bb2f64068d480bd51d7bb36e4d) )
+ ROM_LOAD( "combat.005", 0x40000, 0x10000, CRC(0803a223) SHA1(67d4162385dd56d5396e181070bfa6760521eb45) ) /* tiles, bank 1 */
+ ROM_LOAD( "combat.007", 0x50000, 0x10000, CRC(23caad0c) SHA1(0544cde479c6d4192da5bb4b6f0e2e75d09663c3) )
+ ROM_LOAD( "combat.009", 0x60000, 0x10000, CRC(5ac80383) SHA1(1e89c371a92afc000d593daebda4156952a15244) )
+ ROM_LOAD( "combat.011", 0x70000, 0x10000, CRC(cda83114) SHA1(12d2a9f694287edb3bb0ee7a8ba0e0724dad8e1f) )
+
+ ROM_REGION( 0x80000, "gfx2", ROMREGION_INVERT )
+ ROM_LOAD( "combat.013", 0x00000, 0x10000, CRC(4bed2293) SHA1(3369de47d4ba041d9f17a18dcca2af7ac9f8bc0c) ) /* sprites, bank 0 */
+ ROM_LOAD( "combat.015", 0x10000, 0x10000, CRC(26c41f31) SHA1(f8eb7d0729a21a0dd92ce99c9cda0cde9526b861) )
+ ROM_LOAD( "combat.017", 0x20000, 0x10000, CRC(6071e6da) SHA1(ba5f8e83b07faaffc564d3568630e17efdb5a09f) )
+ ROM_LOAD( "combat.019", 0x30000, 0x10000, CRC(3b1cf1b8) SHA1(ff4de37c051bcb374c44d1b99006ff6ff5e1f927) )
+ ROM_LOAD( "combat.014", 0x40000, 0x10000, CRC(82ea9555) SHA1(59bf7836938ce9e3242d1cca754de8dbe85bbfb7) ) /* sprites, bank 1 */
+ ROM_LOAD( "combat.016", 0x50000, 0x10000, CRC(2e39bb70) SHA1(a6c4acd93cc803e987de6e18fbdc5ce4634b14a8) )
+ ROM_LOAD( "combat.018", 0x60000, 0x10000, CRC(575db729) SHA1(6b1676da4f24fc90c77262789b6cc116184ab912) )
+ ROM_LOAD( "combat.020", 0x70000, 0x10000, CRC(8d748a1a) SHA1(4386e14e19b91e053033dde2a13019bc6d8e1d5a) )
+
+ ROM_REGION( 0x0200, "proms", 0 )
+ ROM_LOAD( "prom.d10", 0x0000, 0x0100, CRC(265f4c97) SHA1(76f1b75a593d3d77ef6173a1948f842d5b27d418) ) /* sprites lookup table */
+ ROM_LOAD( "prom.c11", 0x0100, 0x0100, CRC(a7a5c0b4) SHA1(48bfc3af40b869599a988ebb3ed758141bcfd4fc) ) /* priority? */
+ROM_END
+
+
+/*************************************
+ *
+ * Driver initialization
+ *
+ *************************************/
+
+static DRIVER_INIT( combatsc )
+{
+ /* joystick instead of trackball */
+ machine.device("maincpu")->memory().space(AS_PROGRAM)->install_read_port(0x0404, 0x0404, "IN1");
+}
+
+
+/*************************************
+ *
+ * Game driver(s)
+ *
+ *************************************/
+
+GAME( 1988, combatsc, 0, combatsc, combatsc, combatsc, ROT0, "Konami", "Combat School (joystick)", 0 )
+GAME( 1987, combatsct, combatsc, combatsc, combatsct, 0, ROT0, "Konami", "Combat School (trackball)", 0 )
+GAME( 1987, combatscj, combatsc, combatsc, combatsct, 0, ROT0, "Konami", "Combat School (Japan trackball)", 0 )
+GAME( 1987, bootcamp, combatsc, combatsc, combatsct, 0, ROT0, "Konami", "Boot Camp", 0 )
+GAME( 1988, combatscb, combatsc, combatscb, combatscb, 0, ROT0, "bootleg", "Combat School (bootleg)", GAME_IMPERFECT_COLORS | GAME_IMPERFECT_SOUND )