diff options
Diffstat (limited to 'src/mame/drivers/combatsc.c')
-rw-r--r-- | src/mame/drivers/combatsc.c | 934 |
1 files changed, 934 insertions, 0 deletions
diff --git a/src/mame/drivers/combatsc.c b/src/mame/drivers/combatsc.c new file mode 100644 index 00000000000..18ae381b6eb --- /dev/null +++ b/src/mame/drivers/combatsc.c @@ -0,0 +1,934 @@ +/*************************************************************************** + +"Combat School" (also known as "Boot Camp") - (Konami GX611) + +TODO: +- in combasc (and more generally the 007121) the number of sprites can be + increased from 0x40 to 0x80. There is a hack in konamiic.c to handle that, + but it is wrong. If you don't pass the Iron Man stage, a few sprites are + left dangling on the screen.(*not a bug, 64 sprites are the maximum) +- 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 combascb, 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 Konmai 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 + cpu_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_r +e000-e001 YM2203 + +***************************************************************************/ + +#include "driver.h" +#include "cpu/z80/z80.h" +#include "sound/2203intf.h" +#include "sound/upd7759.h" + +/* from video/combasc.c */ +PALETTE_INIT( combasc ); +PALETTE_INIT( combascb ); +READ8_HANDLER( combasc_video_r ); +WRITE8_HANDLER( combasc_video_w ); +VIDEO_START( combasc ); +VIDEO_START( combascb ); + +WRITE8_HANDLER( combascb_bankselect_w ); +WRITE8_HANDLER( combasc_bankselect_w ); +MACHINE_RESET( combasc ); +MACHINE_RESET( combascb ); +WRITE8_HANDLER( combasc_pf_control_w ); +READ8_HANDLER( combasc_scrollram_r ); +WRITE8_HANDLER( combasc_scrollram_w ); + +VIDEO_UPDATE( combascb ); +VIDEO_UPDATE( combasc ); +WRITE8_HANDLER( combasc_io_w ); +WRITE8_HANDLER( combasc_vreg_w ); + + + + +static WRITE8_HANDLER( combasc_coin_counter_w ) +{ + /* b7-b3: unused? */ + /* b1: coin counter 2 */ + /* b0: coin counter 1 */ + + coin_counter_w(0,data & 0x01); + coin_counter_w(1,data & 0x02); +} + +static READ8_HANDLER( trackball_r ) +{ + static UINT8 pos[4],sign[4]; + + if (offset == 0) + { + int i,dir[4]; + + for (i = 0;i < 4;i++) + { + UINT8 curr; + + curr = readinputport(4 + i); + + dir[i] = curr - pos[i]; + sign[i] = dir[i] & 0x80; + pos[i] = curr; + } + + /* fix sign for orthogonal movements */ + if (dir[0] || dir[1]) + { + if (!dir[0]) sign[0] = sign[1] ^ 0x80; + if (!dir[1]) sign[1] = sign[0]; + } + if (dir[2] || dir[3]) + { + if (!dir[2]) sign[2] = sign[3] ^ 0x80; + if (!dir[3]) sign[3] = sign[2]; + } + } + + return sign[offset] | (pos[offset] & 0x7f); +} + + +/* the protection is a simple multiply */ +static int prot[2]; + +static WRITE8_HANDLER( protection_w ) +{ + prot[offset] = data; +} +static READ8_HANDLER( protection_r ) +{ + return ((prot[0] * prot[1]) >> (offset * 8)) & 0xff; +} +static WRITE8_HANDLER( protection_clock_w ) +{ + /* 0x3f is written here every time before accessing the other registers */ +} + + +/****************************************************************************/ + +static WRITE8_HANDLER( combasc_sh_irqtrigger_w ) +{ + cpunum_set_input_line_and_vector(1,0,HOLD_LINE,0xff); +} + +static WRITE8_HANDLER( combasc_play_w ) +{ + upd7759_start_w(0, data & 2); +} + +static WRITE8_HANDLER( combasc_voice_reset_w ) +{ + upd7759_reset_w(0,data & 1); +} + +static WRITE8_HANDLER( combasc_portA_w ) +{ + /* unknown. always write 0 */ +} + +static emu_timer *combasc_interleave_timer; + +static READ8_HANDLER ( combasc_YM2203_status_port_0_r ) +{ + static int boost = 1; + int status = YM2203_status_port_0_r(0); + + if (activecpu_get_pc() == 0x334) + { + if (boost) + { + boost = 0; + timer_adjust(combasc_interleave_timer, attotime_zero, 0, ATTOTIME_IN_CYCLES(80,1)); + } + else if (status & 2) + { + boost = 1; + timer_adjust(combasc_interleave_timer, attotime_zero, 0, attotime_never); + } + } + + return(status); +} + +/****************************************************************************/ + +static ADDRESS_MAP_START( combasc_readmem, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0020, 0x005f) AM_READ(combasc_scrollram_r) + AM_RANGE(0x0200, 0x0201) AM_READ(protection_r) + AM_RANGE(0x0400, 0x0400) AM_READ(input_port_0_r) + AM_RANGE(0x0401, 0x0401) AM_READ(input_port_1_r) /* DSW #3 */ + AM_RANGE(0x0402, 0x0402) AM_READ(input_port_2_r) /* DSW #1 */ + AM_RANGE(0x0403, 0x0403) AM_READ(input_port_3_r) /* DSW #2 */ + AM_RANGE(0x0404, 0x0407) AM_READ(trackball_r) /* 1P & 2P controls / trackball */ + AM_RANGE(0x0600, 0x06ff) AM_READ(MRA8_RAM) /* palette */ + AM_RANGE(0x0800, 0x1fff) AM_READ(MRA8_RAM) + AM_RANGE(0x2000, 0x3fff) AM_READ(combasc_video_r) + AM_RANGE(0x4000, 0x7fff) AM_READ(MRA8_BANK1) /* banked ROM area */ + AM_RANGE(0x8000, 0xffff) AM_READ(MRA8_ROM) /* ROM */ +ADDRESS_MAP_END + +static ADDRESS_MAP_START( combasc_writemem, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x0007) AM_WRITE(combasc_pf_control_w) + AM_RANGE(0x0020, 0x005f) AM_WRITE(combasc_scrollram_w) +// AM_RANGE(0x0060, 0x00ff) AM_WRITE(MWA8_RAM) /* RAM */ + AM_RANGE(0x0200, 0x0201) AM_WRITE(protection_w) + AM_RANGE(0x0206, 0x0206) AM_WRITE(protection_clock_w) + AM_RANGE(0x0408, 0x0408) AM_WRITE(combasc_coin_counter_w) /* coin counters */ + AM_RANGE(0x040c, 0x040c) AM_WRITE(combasc_vreg_w) + AM_RANGE(0x0410, 0x0410) AM_WRITE(combasc_bankselect_w) + AM_RANGE(0x0414, 0x0414) AM_WRITE(soundlatch_w) + AM_RANGE(0x0418, 0x0418) AM_WRITE(combasc_sh_irqtrigger_w) + AM_RANGE(0x041c, 0x041c) AM_WRITE(watchdog_reset_w) /* watchdog reset? */ + AM_RANGE(0x0600, 0x06ff) AM_WRITE(paletteram_xBBBBBGGGGGRRRRR_le_w) AM_BASE(&paletteram) + AM_RANGE(0x0800, 0x1fff) AM_WRITE(MWA8_RAM) /* RAM */ + AM_RANGE(0x2000, 0x3fff) AM_WRITE(combasc_video_w) + AM_RANGE(0x4000, 0x7fff) AM_WRITE(MWA8_ROM) /* banked ROM area */ + AM_RANGE(0x8000, 0xffff) AM_WRITE(MWA8_ROM) /* ROM */ +ADDRESS_MAP_END + +static ADDRESS_MAP_START( combascb_readmem, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x04ff) AM_READ(MRA8_RAM) + AM_RANGE(0x0600, 0x06ff) AM_READ(MRA8_RAM) /* palette */ + AM_RANGE(0x0800, 0x1fff) AM_READ(MRA8_RAM) + AM_RANGE(0x2000, 0x3fff) AM_READ(combasc_video_r) + AM_RANGE(0x4000, 0x7fff) AM_READ(MRA8_BANK1) /* banked ROM/RAM area */ + AM_RANGE(0x8000, 0xffff) AM_READ(MRA8_ROM) /* ROM */ +ADDRESS_MAP_END + +static ADDRESS_MAP_START( combascb_writemem, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x04ff) AM_WRITE(MWA8_RAM) + AM_RANGE(0x0500, 0x0500) AM_WRITE(combascb_bankselect_w) + AM_RANGE(0x0600, 0x06ff) AM_WRITE(paletteram_xBBBBBGGGGGRRRRR_le_w) AM_BASE(&paletteram) + AM_RANGE(0x0800, 0x1fff) AM_WRITE(MWA8_RAM) + AM_RANGE(0x2000, 0x3fff) AM_WRITE(combasc_video_w) + AM_RANGE(0x4000, 0x7fff) AM_WRITE(MWA8_BANK1) /* banked ROM/RAM area */ + AM_RANGE(0x8000, 0xffff) AM_WRITE(MWA8_ROM) /* ROM */ +ADDRESS_MAP_END + +#if 0 +static ADDRESS_MAP_START( readmem_sound, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x7fff) AM_READ(MRA8_ROM) /* ROM */ + AM_RANGE(0x8000, 0x87ef) AM_READ(MRA8_RAM) /* RAM */ + AM_RANGE(0x87f0, 0x87ff) AM_READ(MRA8_RAM) /* ??? */ + AM_RANGE(0x9000, 0x9000) AM_READ(YM2203_status_port_0_r) /* YM 2203 */ + AM_RANGE(0x9008, 0x9008) AM_READ(YM2203_status_port_0_r) /* ??? */ + AM_RANGE(0xa000, 0xa000) AM_READ(soundlatch_r) /* soundlatch_r? */ + AM_RANGE(0x8800, 0xfffb) AM_READ(MRA8_ROM) /* ROM? */ + AM_RANGE(0xfffc, 0xffff) AM_READ(MRA8_RAM) /* ??? */ +ADDRESS_MAP_END + +static ADDRESS_MAP_START( writemem_sound, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x7fff) AM_WRITE(MWA8_ROM) /* ROM */ + AM_RANGE(0x8000, 0x87ef) AM_WRITE(MWA8_RAM) /* RAM */ + AM_RANGE(0x87f0, 0x87ff) AM_WRITE(MWA8_RAM) /* ??? */ + AM_RANGE(0x9000, 0x9000) AM_WRITE(YM2203_control_port_0_w)/* YM 2203 */ + AM_RANGE(0x9001, 0x9001) AM_WRITE(YM2203_write_port_0_w) /* YM 2203 */ + //AM_RANGE(0x9800, 0x9800) AM_WRITE(combasc_unknown_w_1) /* OKIM5205? */ + //AM_RANGE(0xa800, 0xa800) AM_WRITE(combasc_unknown_w_2) /* OKIM5205? */ + AM_RANGE(0x8800, 0xfffb) AM_WRITE(MWA8_ROM) /* ROM */ + AM_RANGE(0xfffc, 0xffff) AM_WRITE(MWA8_RAM) /* ??? */ +ADDRESS_MAP_END +#endif + +static ADDRESS_MAP_START( combasc_readmem_sound, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x7fff) AM_READ(MRA8_ROM) /* ROM */ + AM_RANGE(0x8000, 0x87ff) AM_READ(MRA8_RAM) /* RAM */ + AM_RANGE(0xb000, 0xb000) AM_READ(upd7759_0_busy_r) /* upd7759 busy? */ + AM_RANGE(0xd000, 0xd000) AM_READ(soundlatch_r) /* soundlatch_r? */ + AM_RANGE(0xe000, 0xe000) AM_READ(combasc_YM2203_status_port_0_r) /* YM 2203 intercepted */ +ADDRESS_MAP_END + +static ADDRESS_MAP_START( combasc_writemem_sound, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x7fff) AM_WRITE(MWA8_ROM) /* ROM */ + AM_RANGE(0x8000, 0x87ff) AM_WRITE(MWA8_RAM) /* RAM */ + AM_RANGE(0x9000, 0x9000) AM_WRITE(combasc_play_w) /* upd7759 play voice */ + AM_RANGE(0xa000, 0xa000) AM_WRITE(upd7759_0_port_w) /* upd7759 voice select */ + AM_RANGE(0xc000, 0xc000) AM_WRITE(combasc_voice_reset_w) /* upd7759 reset? */ + AM_RANGE(0xe000, 0xe000) AM_WRITE(YM2203_control_port_0_w)/* YM 2203 */ + AM_RANGE(0xe001, 0xe001) AM_WRITE(YM2203_write_port_0_w) /* YM 2203 */ +ADDRESS_MAP_END + + +#define COINAGE \ + PORT_DIPNAME( 0x0f, 0x0f, DEF_STR( Coin_A ) ) \ + 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_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, "coin 2 invalidity" ) + +static INPUT_PORTS_START( combasc ) + PORT_START + 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 /* DSW #3 */ + 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_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x00, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_SERVICE( 0x40, IP_ACTIVE_LOW ) + PORT_DIPNAME( 0x80, 0x00, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + + PORT_START /* DSW # 1 */ + COINAGE + + PORT_START /* DSW #2 */ + PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x00, DEF_STR( Cabinet ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Cocktail ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x60, 0x60, DEF_STR( Difficulty ) ) + PORT_DIPSETTING( 0x60, DEF_STR( Easy ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Normal ) ) + PORT_DIPSETTING( 0x20, "Difficult" ) + PORT_DIPSETTING( 0x00, "Very Difficult" ) + PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + + PORT_START + 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) + + PORT_START /* only used in trackball version */ + PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START /* only used in trackball version */ + PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START /* only used in trackball version */ + PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) +INPUT_PORTS_END + +static INPUT_PORTS_START( combasct ) + PORT_START + 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 /* DSW #3 */ + 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_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x00, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_SERVICE( 0x40, IP_ACTIVE_LOW ) + PORT_DIPNAME( 0x80, 0x00, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + + PORT_START /* DSW # 1 */ + COINAGE + + PORT_START /* DSW #2 */ + PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x00, DEF_STR( Cabinet ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Cocktail ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x60, 0x60, DEF_STR( Difficulty ) ) + PORT_DIPSETTING( 0x60, DEF_STR( Easy ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Normal ) ) + PORT_DIPSETTING( 0x20, "Difficult" ) + PORT_DIPSETTING( 0x00, "Very Difficult" ) + PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + + /* trackball 1P */ + PORT_START + PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_Y ) PORT_SENSITIVITY(10) PORT_KEYDELTA(10) PORT_REVERSE PORT_PLAYER(1) + + PORT_START + PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_X ) PORT_SENSITIVITY(10) PORT_KEYDELTA(10) PORT_PLAYER(1) + + /* trackball 2P (not implemented yet) */ + PORT_START + PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_Y ) PORT_SENSITIVITY(10) PORT_KEYDELTA(10) PORT_REVERSE PORT_PLAYER(2) + + PORT_START + PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_X ) PORT_SENSITIVITY(10) PORT_KEYDELTA(10) PORT_PLAYER(2) +INPUT_PORTS_END + +static INPUT_PORTS_START( combascb ) + PORT_START + 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 + 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) + + PORT_START + COINAGE + + PORT_START + PORT_DIPNAME( 0x01, 0x00, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x00, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x00, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x00, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + + PORT_DIPNAME( 0x10, 0x00, DEF_STR( Allow_Continue ) ) + PORT_DIPSETTING( 0x10, DEF_STR( No ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Yes ) ) + PORT_DIPNAME( 0x60, 0x60, DEF_STR( Difficulty ) ) + PORT_DIPSETTING( 0x60, DEF_STR( Easy ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Normal ) ) + PORT_DIPSETTING( 0x20, "Difficult" ) + PORT_DIPSETTING( 0x00, "Very Difficult" ) + PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + + + +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( combasc ) + GFXDECODE_ENTRY( REGION_GFX1, 0x00000, gfxlayout, 0, 8*16 ) + GFXDECODE_ENTRY( REGION_GFX2, 0x00000, gfxlayout, 0, 8*16 ) +GFXDECODE_END + +static GFXDECODE_START( combascb ) + GFXDECODE_ENTRY( REGION_GFX1, 0x00000, tile_layout, 0, 8*16 ) + GFXDECODE_ENTRY( REGION_GFX1, 0x40000, tile_layout, 0, 8*16 ) + GFXDECODE_ENTRY( REGION_GFX2, 0x00000, sprite_layout, 0, 8*16 ) + GFXDECODE_ENTRY( REGION_GFX2, 0x40000, sprite_layout, 0, 8*16 ) +GFXDECODE_END + +static struct YM2203interface ym2203_interface = +{ + 0, + 0, + combasc_portA_w, + 0 +}; + +static struct upd7759_interface upd7759_interface = +{ + REGION_SOUND1, /* memory region */ + 0 +}; + + + +/* combat school (original) */ +static MACHINE_DRIVER_START( combasc ) + + /* basic machine hardware */ + MDRV_CPU_ADD(HD6309, 3000000) /* 3 MHz? */ + MDRV_CPU_PROGRAM_MAP(combasc_readmem,combasc_writemem) + MDRV_CPU_VBLANK_INT(irq0_line_hold,1) + + MDRV_CPU_ADD(Z80,3579545) /* 3.579545 MHz */ + /* audio CPU */ + MDRV_CPU_PROGRAM_MAP(combasc_readmem_sound,combasc_writemem_sound) + + MDRV_SCREEN_REFRESH_RATE(60) + MDRV_SCREEN_VBLANK_TIME(DEFAULT_REAL_60HZ_VBLANK_DURATION) + MDRV_INTERLEAVE(20) + + MDRV_MACHINE_RESET(combasc) + + /* video hardware */ + MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER) + MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) + MDRV_SCREEN_SIZE(32*8, 32*8) + MDRV_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) + MDRV_GFXDECODE(combasc) + MDRV_PALETTE_LENGTH(128) + MDRV_COLORTABLE_LENGTH(8*16*16) + + MDRV_PALETTE_INIT(combasc) + MDRV_VIDEO_START(combasc) + MDRV_VIDEO_UPDATE(combasc) + + /* sound hardware */ + MDRV_SPEAKER_STANDARD_MONO("mono") + + MDRV_SOUND_ADD(YM2203, 3000000) + MDRV_SOUND_CONFIG(ym2203_interface) + MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.20) + + MDRV_SOUND_ADD(UPD7759, UPD7759_STANDARD_CLOCK) + MDRV_SOUND_CONFIG(upd7759_interface) + MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.70) +MACHINE_DRIVER_END + +/* combat school (bootleg on different hardware) */ +static MACHINE_DRIVER_START( combascb ) + + /* basic machine hardware */ + MDRV_CPU_ADD(HD6309, 3000000) /* 3 MHz? */ + MDRV_CPU_PROGRAM_MAP(combascb_readmem,combascb_writemem) + MDRV_CPU_VBLANK_INT(irq0_line_hold,1) + + MDRV_CPU_ADD(Z80,3579545) /* 3.579545 MHz */ + /* audio CPU */ + MDRV_CPU_PROGRAM_MAP(combasc_readmem_sound,combasc_writemem_sound) /* FAKE */ + + MDRV_SCREEN_REFRESH_RATE(60) + MDRV_SCREEN_VBLANK_TIME(DEFAULT_REAL_60HZ_VBLANK_DURATION) + MDRV_INTERLEAVE(20) + + MDRV_MACHINE_RESET(combasc) + + /* video hardware */ + MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER) + MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) + MDRV_SCREEN_SIZE(32*8, 32*8) + MDRV_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) + MDRV_GFXDECODE(combascb) + MDRV_PALETTE_LENGTH(128) + MDRV_COLORTABLE_LENGTH(8*16*16) + + MDRV_PALETTE_INIT(combascb) + MDRV_VIDEO_START(combascb) + MDRV_VIDEO_UPDATE(combascb) + + /* We are using the original sound subsystem */ + MDRV_SPEAKER_STANDARD_MONO("mono") + + MDRV_SOUND_ADD(YM2203, 3000000) + MDRV_SOUND_CONFIG(ym2203_interface) + MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.20) + + MDRV_SOUND_ADD(UPD7759, UPD7759_STANDARD_CLOCK) + MDRV_SOUND_CONFIG(upd7759_interface) + MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.70) +MACHINE_DRIVER_END + + + +ROM_START( combasc ) + ROM_REGION( 0x40000, REGION_CPU1, 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 , REGION_CPU2, 0 ) /* sound CPU */ + ROM_LOAD( "611g03.rom", 0x00000, 0x08000, CRC(2a544db5) SHA1(94a97c3c54bf13ccc665aa5057ac6b1d700fae2d) ) + + ROM_REGION( 0x80000, REGION_GFX1, ROMREGION_DISPOSE ) + 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, REGION_GFX2, ROMREGION_DISPOSE ) + 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, REGION_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, REGION_SOUND1, 0 ) /* uPD7759 data */ + ROM_LOAD( "611g04.rom", 0x00000, 0x20000, CRC(2987e158) SHA1(87c5129161d3be29a339083349807e60b625c3f7) ) + + ROM_REGION( 0x0600, REGION_PLDS, ROMREGION_DISPOSE ) + 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( combasct ) + ROM_REGION( 0x40000, REGION_CPU1, 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 , REGION_CPU2, 0 ) /* sound CPU */ + ROM_LOAD( "611g03.rom", 0x00000, 0x08000, CRC(2a544db5) SHA1(94a97c3c54bf13ccc665aa5057ac6b1d700fae2d) ) + + ROM_REGION( 0x80000, REGION_GFX1, ROMREGION_DISPOSE ) + 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, REGION_GFX2, ROMREGION_DISPOSE ) + 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, REGION_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, REGION_SOUND1, 0 ) /* uPD7759 data */ + ROM_LOAD( "611g04.rom", 0x00000, 0x20000, CRC(2987e158) SHA1(87c5129161d3be29a339083349807e60b625c3f7) ) +ROM_END + +ROM_START( combascj ) + ROM_REGION( 0x40000, REGION_CPU1, 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 , REGION_CPU2, 0 ) /* sound CPU */ + ROM_LOAD( "611g03.rom", 0x00000, 0x08000, CRC(2a544db5) SHA1(94a97c3c54bf13ccc665aa5057ac6b1d700fae2d) ) + + ROM_REGION( 0x80000, REGION_GFX1, ROMREGION_DISPOSE ) + 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, REGION_GFX2, ROMREGION_DISPOSE ) + 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, REGION_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, REGION_SOUND1, 0 ) /* uPD7759 data */ + ROM_LOAD( "611g04.rom", 0x00000, 0x20000, CRC(2987e158) SHA1(87c5129161d3be29a339083349807e60b625c3f7) ) +ROM_END + +ROM_START( bootcamp ) + ROM_REGION( 0x40000, REGION_CPU1, 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 , REGION_CPU2, 0 ) /* sound CPU */ + ROM_LOAD( "611g03.rom", 0x00000, 0x08000, CRC(2a544db5) SHA1(94a97c3c54bf13ccc665aa5057ac6b1d700fae2d) ) + + ROM_REGION( 0x80000, REGION_GFX1, ROMREGION_DISPOSE ) + 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, REGION_GFX2, ROMREGION_DISPOSE ) + 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, REGION_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, REGION_SOUND1, 0 ) /* uPD7759 data */ + ROM_LOAD( "611g04.rom", 0x00000, 0x20000, CRC(2987e158) SHA1(87c5129161d3be29a339083349807e60b625c3f7) ) +ROM_END + +ROM_START( combascb ) + ROM_REGION( 0x40000, REGION_CPU1, 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 , REGION_CPU2, 0 ) /* sound CPU */ + ROM_LOAD( "combat.001", 0x00000, 0x10000, CRC(61456b3b) SHA1(320db628283dd1bec465e95020d1a1158e6d6ae4) ) + ROM_LOAD( "611g03.rom", 0x00000, 0x08000, CRC(2a544db5) SHA1(94a97c3c54bf13ccc665aa5057ac6b1d700fae2d) ) /* FAKE - from Konami set! */ + + ROM_REGION( 0x80000, REGION_GFX1, ROMREGION_DISPOSE | 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, REGION_GFX2, ROMREGION_DISPOSE | 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, REGION_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_REGION( 0x20000, REGION_SOUND1, 0 ) /* uPD7759 data */ + ROM_LOAD( "611g04.rom", 0x00000, 0x20000, CRC(2987e158) SHA1(87c5129161d3be29a339083349807e60b625c3f7) ) /* FAKE - from Konami set! */ +ROM_END + + + +static void combasc_init_common(void) +{ + combasc_interleave_timer = timer_alloc(NULL); +} + +static DRIVER_INIT( combasct ) +{ + combasc_init_common(); +} + +static DRIVER_INIT( combasc ) +{ + /* joystick instead of trackball */ + memory_install_read8_handler(0, ADDRESS_SPACE_PROGRAM, 0x0404, 0x0404, 0, 0, input_port_4_r); + + combasc_init_common(); +} + +static DRIVER_INIT( combascb ) +{ + combasc_init_common(); +} + + + +GAME( 1988, combasc, 0, combasc, combasc, combasc, ROT0, "Konami", "Combat School (joystick)", 0 ) +GAME( 1987, combasct, combasc, combasc, combasct, combasct, ROT0, "Konami", "Combat School (trackball)", 0 ) +GAME( 1987, combascj, combasc, combasc, combasct, combasct, ROT0, "Konami", "Combat School (Japan trackball)", 0 ) +GAME( 1987, bootcamp, combasc, combasc, combasct, combasct, ROT0, "Konami", "Boot Camp", 0 ) +GAME( 1988, combascb, combasc, combascb, combascb, combascb, ROT0, "bootleg", "Combat School (bootleg)", GAME_IMPERFECT_COLORS ) |