nycaptor, colt, cyclshtg, bronx (nycaptor.c) [stephh] :

- Fixed Dip Switches and Inputs (after verification of the Z80 code)
This commit is contained in:
stephh 2010-08-14 00:39:50 +00:00
parent 91da81b539
commit b2caa2a945

View File

@ -24,6 +24,8 @@ To do :
- unknown R/W - unknown R/W
- 13th bit in color defs (priority? bit is set for all colors in spot1, - 13th bit in color defs (priority? bit is set for all colors in spot1,
for 3/4 screen cols in spot2 etc) for 3/4 screen cols in spot2 etc)
- handle coin counters and coin lockout
Notes : Notes :
$d000 - MCU data read/write $d000 - MCU data read/write
@ -129,17 +131,60 @@ RAM :
Stephh's additional notes (based on the game Z80 code and some tests) : Stephh's additional notes (based on the game Z80 code and some tests) :
1) 'nycaptor' and clones
1a) 'nycaptor'
- You need to press SERVICE1 while resetting the game to enter the "test mode". - You need to press SERVICE1 while resetting the game to enter the "test mode".
Note that the grid is always displayed, so it's IMPOSSIBLE to see what's in it 8( Note that the grid is always displayed, so it's IMPOSSIBLE to see what's in it 8(
- When "Infinite Bullets" is set to ON, there is no timer to reload the bullets. - When "Infinite Bullets" is set to ON, there is no timer to reload the bullets.
- When "No Hit" Dip Switch is ON, damage is still incremented, but there are - When "No Hit" Dip Switch is ON, damage is still incremented, but there are
no test made if it reaches the limit (0x0a). no test made if it reaches the limit (0x0a).
- DSWC bit 2 also determines the precision of a shot
- Bit 2 of 0xd802 also determines the precision of a shot
(= range around a bullet where the enemies can be killed) : (= range around a bullet where the enemies can be killed) :
* 0 : small range (0x0a) * 0 : small range (0x0a or 0x10)
* 1 : high range (0x0c) * 1 : high range (0x0c or 0x12)
- Even when "Coin Slots" is set to "1", pressing COIN2 will be based on "Coin B" settings.
1b) 'colt'
- Due to patched code at 0x9fd, lives (BCD coded) settings are different than in 'nycaptor'.
Display at start will be lives-1, but it will also display "0" when you select 100 lives.
- The game is much harder than 'nycaptor' :
* Due to the 4 'nop' instructions at 0x0b03, you can't get any extra life.
* Due to patched code from 0x0bea to 0x0bf4, you lose a life as soon as you get hit
by en enemy or when you shoot at an innocent.
Furthermore, shooting birds kills you instead of recovering 3 "steps" of damage !
- I can't tell if it's an ingame bug of this bootleg, but the game hangs after bonus stage
(level 4) instead of looping back to level 1 with higher difficulty.
The game also frezees sometimes for some unknown reasons.
2) 'cyclshtg' and clones
2a) 'cyclshtg'
- Lives (BCD coded) settings are not read from MCU, but from table at 0x0fee.
- Even if it isn't mentionned in the manual, DSWB bit 7 allows you to reset damage to 0
at the end of a level (check code at 0x328d).
- When "Infinite Bullets" is set to ON, there is no timer to reload the bullets.
However, it's hard to notice as you don't see an indicator as in 'nycaptor'.
- There is a leftover from 'nycaptor' in CPU1 which reads DSWA bits 0 and 1 to determine
"Bonus Lives" settings (code at 0x009b). These values are overwritten via code in CPU 0.
2b) 'bronx'
- Lives (BCD coded) settings are different than in 'cyclshtg' (table at 0x0fea).
- The game is much harder than 'cyclshtg' :
* You start with less lives with default settings (2 instead of 3).
* Due to the 'add a,$00' instruction at 0x1131, you can't get any extra life
(when you get enough points, or even when you hit the "1UP" bonus).
* Due to extra code at 0x3062, you start the game as if you had already sustained
8 "steps" of damage. However, when you end a level, if "Damage Reset" Dip Switch
is ON, your damage will be reset to 0.
Furthermore, the game starts as if you had completed the 6 stages 8 times.
* Due to the 'ld (ix+$0e),$08' instruction at 0x32b1, you also start the
other lives as if you had already sustained 8 "steps" of damage. However, again,
when you end a level, if "Damage Reset" Dip Switch is ON, your damage will be reset to 0.
***************************************************************************/ ***************************************************************************/
@ -149,6 +194,7 @@ Stephh's additional notes (based on the game Z80 code and some tests) :
#include "emu.h" #include "emu.h"
#include "cpu/z80/z80.h" #include "cpu/z80/z80.h"
#include "cpu/m6805/m6805.h" #include "cpu/m6805/m6805.h"
#include "includes/taitoipt.h"
#include "sound/ay8910.h" #include "sound/ay8910.h"
#include "sound/msm5232.h" #include "sound/msm5232.h"
#include "includes/nycaptor.h" #include "includes/nycaptor.h"
@ -309,9 +355,9 @@ static ADDRESS_MAP_START( nycaptor_master_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0xd400, 0xd400) AM_READWRITE(from_snd_r, sound_command_w) AM_RANGE(0xd400, 0xd400) AM_READWRITE(from_snd_r, sound_command_w)
AM_RANGE(0xd401, 0xd401) AM_READNOP AM_RANGE(0xd401, 0xd401) AM_READNOP
AM_RANGE(0xd403, 0xd403) AM_WRITE(sound_cpu_reset_w) AM_RANGE(0xd403, 0xd403) AM_WRITE(sound_cpu_reset_w)
AM_RANGE(0xd800, 0xd800) AM_READ_PORT("DSW0") AM_RANGE(0xd800, 0xd800) AM_READ_PORT("DSWA")
AM_RANGE(0xd801, 0xd801) AM_READ_PORT("DSW1") AM_RANGE(0xd801, 0xd801) AM_READ_PORT("DSWB")
AM_RANGE(0xd802, 0xd802) AM_READ_PORT("DSW2") AM_RANGE(0xd802, 0xd802) AM_READ_PORT("DSWC")
AM_RANGE(0xd803, 0xd803) AM_READ_PORT("IN0") AM_RANGE(0xd803, 0xd803) AM_READ_PORT("IN0")
AM_RANGE(0xd804, 0xd804) AM_READ_PORT("IN1") AM_RANGE(0xd804, 0xd804) AM_READ_PORT("IN1")
AM_RANGE(0xd805, 0xd805) AM_READ(nycaptor_mcu_status_r1) AM_RANGE(0xd805, 0xd805) AM_READ(nycaptor_mcu_status_r1)
@ -328,9 +374,9 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( nycaptor_slave_map, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( nycaptor_slave_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0x0000, 0x7fff) AM_ROM
AM_RANGE(0xc000, 0xc7ff) AM_READWRITE(nycaptor_videoram_r, nycaptor_videoram_w) AM_BASE_SIZE_MEMBER(nycaptor_state, videoram, videoram_size) AM_RANGE(0xc000, 0xc7ff) AM_READWRITE(nycaptor_videoram_r, nycaptor_videoram_w) AM_BASE_SIZE_MEMBER(nycaptor_state, videoram, videoram_size)
AM_RANGE(0xd800, 0xd800) AM_READ_PORT("DSW0") AM_RANGE(0xd800, 0xd800) AM_READ_PORT("DSWA")
AM_RANGE(0xd801, 0xd801) AM_READ_PORT("DSW1") AM_RANGE(0xd801, 0xd801) AM_READ_PORT("DSWB")
AM_RANGE(0xd802, 0xd802) AM_READ_PORT("DSW2") AM_RANGE(0xd802, 0xd802) AM_READ_PORT("DSWC")
AM_RANGE(0xd803, 0xd803) AM_READ_PORT("IN0") AM_RANGE(0xd803, 0xd803) AM_READ_PORT("IN0")
AM_RANGE(0xd804, 0xd804) AM_READ_PORT("IN1") AM_RANGE(0xd804, 0xd804) AM_READ_PORT("IN1")
AM_RANGE(0xdc00, 0xdc9f) AM_READWRITE(nycaptor_spriteram_r, nycaptor_spriteram_w) AM_RANGE(0xdc00, 0xdc9f) AM_READWRITE(nycaptor_spriteram_r, nycaptor_spriteram_w)
@ -415,9 +461,9 @@ static ADDRESS_MAP_START( cyclshtg_master_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0xd002, 0xd002) AM_READWRITE(nycaptor_generic_control_r, cyclshtg_generic_control_w) AM_RANGE(0xd002, 0xd002) AM_READWRITE(nycaptor_generic_control_r, cyclshtg_generic_control_w)
AM_RANGE(0xd400, 0xd400) AM_READWRITE(from_snd_r, sound_command_w) AM_RANGE(0xd400, 0xd400) AM_READWRITE(from_snd_r, sound_command_w)
AM_RANGE(0xd403, 0xd403) AM_WRITE(sound_cpu_reset_w) AM_RANGE(0xd403, 0xd403) AM_WRITE(sound_cpu_reset_w)
AM_RANGE(0xd800, 0xd800) AM_READ_PORT("DSW0") AM_RANGE(0xd800, 0xd800) AM_READ_PORT("DSWA")
AM_RANGE(0xd801, 0xd801) AM_READ_PORT("DSW1") AM_RANGE(0xd801, 0xd801) AM_READ_PORT("DSWB")
AM_RANGE(0xd802, 0xd802) AM_READ_PORT("DSW2") AM_RANGE(0xd802, 0xd802) AM_READ_PORT("DSWC")
AM_RANGE(0xd803, 0xd803) AM_READ_PORT("IN0") AM_RANGE(0xd803, 0xd803) AM_READ_PORT("IN0")
AM_RANGE(0xd804, 0xd804) AM_READ_PORT("IN1") AM_RANGE(0xd804, 0xd804) AM_READ_PORT("IN1")
AM_RANGE(0xd805, 0xd805) AM_READ(cyclshtg_mcu_status_r) AM_RANGE(0xd805, 0xd805) AM_READ(cyclshtg_mcu_status_r)
@ -434,9 +480,9 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( cyclshtg_slave_map, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( cyclshtg_slave_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0xbfff) AM_ROM AM_RANGE(0x0000, 0xbfff) AM_ROM
AM_RANGE(0xc000, 0xcfff) AM_READWRITE(nycaptor_videoram_r, nycaptor_videoram_w) AM_BASE_SIZE_MEMBER(nycaptor_state, videoram, videoram_size) AM_RANGE(0xc000, 0xcfff) AM_READWRITE(nycaptor_videoram_r, nycaptor_videoram_w) AM_BASE_SIZE_MEMBER(nycaptor_state, videoram, videoram_size)
AM_RANGE(0xd800, 0xd800) AM_READ_PORT("DSW0") AM_RANGE(0xd800, 0xd800) AM_READ_PORT("DSWA")
AM_RANGE(0xd801, 0xd801) AM_READ_PORT("DSW1") AM_RANGE(0xd801, 0xd801) AM_READ_PORT("DSWB")
AM_RANGE(0xd802, 0xd802) AM_READ_PORT("DSW2") AM_RANGE(0xd802, 0xd802) AM_READ_PORT("DSWC")
AM_RANGE(0xd803, 0xd803) AM_READ_PORT("IN0") AM_RANGE(0xd803, 0xd803) AM_READ_PORT("IN0")
AM_RANGE(0xd804, 0xd804) AM_READ_PORT("IN1") AM_RANGE(0xd804, 0xd804) AM_READ_PORT("IN1")
AM_RANGE(0xdc00, 0xdc9f) AM_READWRITE(nycaptor_spriteram_r, nycaptor_spriteram_w) AM_RANGE(0xdc00, 0xdc9f) AM_READWRITE(nycaptor_spriteram_r, nycaptor_spriteram_w)
@ -465,9 +511,9 @@ static ADDRESS_MAP_START( bronx_master_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0xd400, 0xd400) AM_READWRITE(from_snd_r, sound_command_w) AM_RANGE(0xd400, 0xd400) AM_READWRITE(from_snd_r, sound_command_w)
AM_RANGE(0xd401, 0xd401) AM_READ(unk_r) AM_RANGE(0xd401, 0xd401) AM_READ(unk_r)
AM_RANGE(0xd403, 0xd403) AM_WRITE(sound_cpu_reset_w) AM_RANGE(0xd403, 0xd403) AM_WRITE(sound_cpu_reset_w)
AM_RANGE(0xd800, 0xd800) AM_READ_PORT("DSW0") AM_RANGE(0xd800, 0xd800) AM_READ_PORT("DSWA")
AM_RANGE(0xd801, 0xd801) AM_READ_PORT("DSW1") AM_RANGE(0xd801, 0xd801) AM_READ_PORT("DSWB")
AM_RANGE(0xd802, 0xd802) AM_READ_PORT("DSW2") AM_RANGE(0xd802, 0xd802) AM_READ_PORT("DSWC")
AM_RANGE(0xd803, 0xd803) AM_READ_PORT("IN0") AM_RANGE(0xd803, 0xd803) AM_READ_PORT("IN0")
AM_RANGE(0xd804, 0xd804) AM_READ_PORT("IN1") AM_RANGE(0xd804, 0xd804) AM_READ_PORT("IN1")
AM_RANGE(0xd805, 0xd805) AM_READ(cyclshtg_mcu_status_r) AM_RANGE(0xd805, 0xd805) AM_READ(cyclshtg_mcu_status_r)
@ -483,9 +529,9 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( bronx_slave_map, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( bronx_slave_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0x0000, 0x7fff) AM_ROM
AM_RANGE(0xc000, 0xcfff) AM_READWRITE(nycaptor_videoram_r, nycaptor_videoram_w) AM_BASE_SIZE_MEMBER(nycaptor_state, videoram, videoram_size) AM_RANGE(0xc000, 0xcfff) AM_READWRITE(nycaptor_videoram_r, nycaptor_videoram_w) AM_BASE_SIZE_MEMBER(nycaptor_state, videoram, videoram_size)
AM_RANGE(0xd800, 0xd800) AM_READ_PORT("DSW0") AM_RANGE(0xd800, 0xd800) AM_READ_PORT("DSWA")
AM_RANGE(0xd801, 0xd801) AM_READ_PORT("DSW1") AM_RANGE(0xd801, 0xd801) AM_READ_PORT("DSWB")
AM_RANGE(0xd802, 0xd802) AM_READ_PORT("DSW2") AM_RANGE(0xd802, 0xd802) AM_READ_PORT("DSWC")
AM_RANGE(0xd803, 0xd803) AM_READ_PORT("IN0") AM_RANGE(0xd803, 0xd803) AM_READ_PORT("IN0")
AM_RANGE(0xd804, 0xd804) AM_READ_PORT("IN1") AM_RANGE(0xd804, 0xd804) AM_READ_PORT("IN1")
AM_RANGE(0xd805, 0xd805) AM_READ(cyclshtg_mcu_status_r1) AM_RANGE(0xd805, 0xd805) AM_READ(cyclshtg_mcu_status_r1)
@ -505,68 +551,18 @@ static ADDRESS_MAP_START( bronx_slave_io_map, ADDRESS_SPACE_IO, 8 )
ADDRESS_MAP_END ADDRESS_MAP_END
/* Cycle Shooting */ /* verified from Z80 code */
static INPUT_PORTS_START( cyclshtg )
PORT_START("DSW0")
PORT_DIPNAME( 0x04, 0x04, "Test Mode" )
PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x30, 0x30, DEF_STR( Coin_A ) )
PORT_DIPSETTING( 0x10, DEF_STR( 2C_1C ) )
PORT_DIPSETTING( 0x30, DEF_STR( 1C_1C ) )
PORT_DIPSETTING( 0x00, DEF_STR( 2C_3C ) )
PORT_DIPSETTING( 0x20, DEF_STR( 1C_2C ) )
PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Coin_B ) )
PORT_DIPSETTING( 0x40, DEF_STR( 2C_1C ) )
PORT_DIPSETTING( 0xc0, DEF_STR( 1C_1C ) )
PORT_DIPSETTING( 0x00, DEF_STR( 2C_3C ) )
PORT_DIPSETTING( 0x80, DEF_STR( 1C_2C ) )
PORT_DIPNAME( 0x08, 0x08, DEF_STR( Demo_Sounds ) )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x08, DEF_STR( On ) )
PORT_START("DSW1")
PORT_START("DSW2")
PORT_START("IN0")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START1 )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START2 )//?
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE1 )
PORT_DIPNAME( 0x08, 0x08, DEF_STR( Tilt ) )
PORT_DIPSETTING( 0x08, DEF_STR( No ) )
PORT_DIPSETTING( 0x00, DEF_STR( Yes ) )
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_COIN1 )
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_COIN2 )
PORT_BIT( 0xc0, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_START("IN1")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 )
PORT_START("LIGHTX")
PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_Y ) PORT_CROSSHAIR(X, 1.0, 0.0, 0) PORT_SENSITIVITY(25) PORT_KEYDELTA(15) PORT_PLAYER(1)
PORT_START("LIGHTY")
PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_X ) PORT_CROSSHAIR(Y, -1.0, 0.0, 0) PORT_SENSITIVITY(25) PORT_KEYDELTA(15) PORT_PLAYER(1)
INPUT_PORTS_END
static INPUT_PORTS_START( nycaptor ) static INPUT_PORTS_START( nycaptor )
PORT_START("DSW0") PORT_START("DSWA")
PORT_DIPNAME( 0x03, 0x03, DEF_STR( Bonus_Life ) ) PORT_DIPNAME( 0x03, 0x03, DEF_STR( Bonus_Life ) ) /* table at 0x00e5 in CPU1 - see notes for 'colt' */
PORT_DIPSETTING( 0x02, "20k, 80k then every 80k" ) PORT_DIPSETTING( 0x02, "20k 80k 80k+" )
PORT_DIPSETTING( 0x03, "50k, 150k then every 200k" ) PORT_DIPSETTING( 0x03, "50k 150k 200k+" )
PORT_DIPSETTING( 0x01, "100k, 300k then every 300k" ) PORT_DIPSETTING( 0x01, "100k 300k 300k+" )
PORT_DIPSETTING( 0x00, "150k, 300k then every 300k" ) PORT_DIPSETTING( 0x00, "150k 300k 300k+" )
PORT_DIPNAME( 0x04, 0x04, "Infinite Bullets (Cheat)") PORT_DIPNAME( 0x04, 0x04, "Infinite Bullets") /* see notes */
PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x18, 0x18, DEF_STR( Lives ) ) PORT_DIPNAME( 0x18, 0x18, DEF_STR( Lives ) ) /* values are read from the MCU */
PORT_DIPSETTING( 0x08, "1" ) PORT_DIPSETTING( 0x08, "1" )
PORT_DIPSETTING( 0x00, "2" ) PORT_DIPSETTING( 0x00, "2" )
PORT_DIPSETTING( 0x18, "3" ) PORT_DIPSETTING( 0x18, "3" )
@ -581,7 +577,7 @@ static INPUT_PORTS_START( nycaptor )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x80, DEF_STR( On ) ) PORT_DIPSETTING( 0x80, DEF_STR( On ) )
PORT_START("DSW1") PORT_START("DSWB")
PORT_DIPNAME( 0x0f, 0x00, DEF_STR( Coin_A ) ) PORT_DIPNAME( 0x0f, 0x00, DEF_STR( Coin_A ) )
PORT_DIPSETTING( 0x0f, DEF_STR( 9C_1C ) ) PORT_DIPSETTING( 0x0f, DEF_STR( 9C_1C ) )
PORT_DIPSETTING( 0x0e, DEF_STR( 8C_1C ) ) PORT_DIPSETTING( 0x0e, DEF_STR( 8C_1C ) )
@ -617,7 +613,7 @@ static INPUT_PORTS_START( nycaptor )
PORT_DIPSETTING( 0x60, DEF_STR( 1C_7C ) ) PORT_DIPSETTING( 0x60, DEF_STR( 1C_7C ) )
PORT_DIPSETTING( 0x70, DEF_STR( 1C_8C ) ) PORT_DIPSETTING( 0x70, DEF_STR( 1C_8C ) )
PORT_START("DSW2") PORT_START("DSWC")
PORT_DIPNAME( 0x01, 0x01, "Freeze" ) PORT_DIPNAME( 0x01, 0x01, "Freeze" )
PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) )
@ -644,17 +640,17 @@ static INPUT_PORTS_START( nycaptor )
PORT_START("IN0") PORT_START("IN0")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START1 ) PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START1 )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* IPT_START2 is some similar Taito games (eg: 'flstory') */ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* IPT_START2 is some similar Taito games (eg: 'flstory') */
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE1 )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_TILT ) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_TILT )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_COIN1 )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN2 )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* "I/O ERROR" if active */ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* "I/O ERROR" if active - code at 0x083d */
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* "I/O ERROR" if active */ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* "I/O ERROR" if active - code at 0x083d */
PORT_START("IN1") PORT_START("IN1")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 )
PORT_BIT( 0xfe, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0xfe, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("LIGHTX") PORT_START("LIGHTX")
PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_X ) PORT_CROSSHAIR(X, 1.0, 0.0, 0) PORT_SENSITIVITY(25) PORT_KEYDELTA(15) PORT_PLAYER(1) PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_X ) PORT_CROSSHAIR(X, 1.0, 0.0, 0) PORT_SENSITIVITY(25) PORT_KEYDELTA(15) PORT_PLAYER(1)
@ -663,6 +659,90 @@ static INPUT_PORTS_START( nycaptor )
PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_Y ) PORT_CROSSHAIR(Y, 1.0, 0.0, 0) PORT_SENSITIVITY(25) PORT_KEYDELTA(15) PORT_PLAYER(1) PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_Y ) PORT_CROSSHAIR(Y, 1.0, 0.0, 0) PORT_SENSITIVITY(25) PORT_KEYDELTA(15) PORT_PLAYER(1)
INPUT_PORTS_END INPUT_PORTS_END
/* verified from Z80 code */
static INPUT_PORTS_START( colt )
PORT_INCLUDE( nycaptor )
PORT_MODIFY("DSWA")
PORT_DIPNAME( 0x18, 0x18, DEF_STR( Lives ) ) /* see notes */
PORT_DIPSETTING( 0x08, "1" )
PORT_DIPSETTING( 0x10, "2" )
PORT_DIPSETTING( 0x18, "3" )
PORT_DIPSETTING( 0x00, "100" )
INPUT_PORTS_END
/* verified from Z80 code */
static INPUT_PORTS_START( cyclshtg )
PORT_START("DSWA")
PORT_DIPUNUSED( 0x01, IP_ACTIVE_LOW )
PORT_DIPUNUSED( 0x02, IP_ACTIVE_LOW )
TAITO_DSWA_BITS_2_TO_3
TAITO_COINAGE_JAPAN_OLD /* coinage B isn't mentionned in the manual */
PORT_START("DSWB")
TAITO_DIFFICULTY
PORT_DIPNAME( 0x0c, 0x08, DEF_STR( Bonus_Life ) ) /* table at 0x100f - see notes for 'bronx' */
PORT_DIPSETTING( 0x0c, "150k 350k 200k+" )
PORT_DIPSETTING( 0x08, "200k 500k 300k+" )
PORT_DIPSETTING( 0x04, "300k 700k 400k+" )
PORT_DIPSETTING( 0x00, "400k 900k 500k+" )
PORT_DIPNAME( 0x30, 0x30, DEF_STR( Lives ) ) /* see notes */
PORT_DIPSETTING( 0x00, "1" )
PORT_DIPSETTING( 0x30, "3" )
PORT_DIPSETTING( 0x10, "4" )
PORT_DIPSETTING( 0x20, "5" )
PORT_DIPUNUSED( 0x40, IP_ACTIVE_LOW )
PORT_DIPNAME( 0x80, 0x80, "Reset Damage (Cheat)" ) /* see notes */
PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_START("DSWC")
PORT_DIPUNUSED( 0x01, IP_ACTIVE_LOW )
PORT_DIPUNUSED( 0x02, IP_ACTIVE_LOW )
PORT_DIPUNUSED( 0x04, IP_ACTIVE_LOW )
PORT_DIPUNUSED( 0x08, IP_ACTIVE_LOW )
PORT_DIPNAME( 0x10, 0x10, "Infinite Bullets" ) /* see notes */
PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPUNUSED( 0x20, IP_ACTIVE_LOW )
PORT_DIPUNUSED( 0x40, IP_ACTIVE_LOW )
PORT_DIPUNUSED( 0x80, IP_ACTIVE_LOW )
PORT_START("IN0")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START1 )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* IPT_START2 is some similar Taito games (eg: 'flstory') */
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE1 )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_TILT )
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_COIN1 )
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_COIN2 )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_START("IN1")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 )
PORT_BIT( 0xfe, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("LIGHTX")
PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_Y ) PORT_CROSSHAIR(X, 1.0, 0.0, 0) PORT_SENSITIVITY(25) PORT_KEYDELTA(15) PORT_PLAYER(1)
PORT_START("LIGHTY")
PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_X ) PORT_CROSSHAIR(Y, -1.0, 0.0, 0) PORT_SENSITIVITY(25) PORT_KEYDELTA(15) PORT_PLAYER(1)
INPUT_PORTS_END
/* verified from Z80 code */
static INPUT_PORTS_START( bronx )
PORT_INCLUDE( cyclshtg )
PORT_MODIFY("DSWB")
PORT_DIPNAME( 0x30, 0x30, DEF_STR( Lives ) ) /* see notes */
PORT_DIPSETTING( 0x00, "1" )
PORT_DIPSETTING( 0x30, "2" )
PORT_DIPSETTING( 0x10, "4" )
PORT_DIPSETTING( 0x20, "5" )
INPUT_PORTS_END
static const gfx_layout charlayout = static const gfx_layout charlayout =
{ {
8,8, 8,8,
@ -1282,6 +1362,18 @@ ROM_START( colt )
ROM_LOAD( "a50_14", 0x1c000, 0x4000, CRC(24b2f1bf) SHA1(4757aec2e4b99ce33d993ce1e19ee46a4eb76e86) ) ROM_LOAD( "a50_14", 0x1c000, 0x4000, CRC(24b2f1bf) SHA1(4757aec2e4b99ce33d993ce1e19ee46a4eb76e86) )
ROM_END ROM_END
static DRIVER_INIT( nycaptor )
{
nycaptor_state *state = machine->driver_data<nycaptor_state>();
state->gametype = 0;
}
static DRIVER_INIT( cyclshtg )
{
nycaptor_state *state = machine->driver_data<nycaptor_state>();
state->gametype = 1;
}
static DRIVER_INIT( bronx ) static DRIVER_INIT( bronx )
{ {
nycaptor_state *state = machine->driver_data<nycaptor_state>(); nycaptor_state *state = machine->driver_data<nycaptor_state>();
@ -1306,20 +1398,8 @@ static DRIVER_INIT( colt )
state->gametype = 2; state->gametype = 2;
} }
static DRIVER_INIT( nycaptor )
{
nycaptor_state *state = machine->driver_data<nycaptor_state>();
state->gametype = 0;
}
static DRIVER_INIT( cyclshtg )
{
nycaptor_state *state = machine->driver_data<nycaptor_state>();
state->gametype = 1;
}
GAME( 1985, nycaptor, 0, nycaptor, nycaptor, nycaptor, ROT0, "Taito", "N.Y. Captor", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) GAME( 1985, nycaptor, 0, nycaptor, nycaptor, nycaptor, ROT0, "Taito", "N.Y. Captor", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE )
GAME( 1986, cyclshtg, 0, cyclshtg, cyclshtg, cyclshtg, ROT90, "Taito", "Cycle Shooting", GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) GAME( 1986, cyclshtg, 0, cyclshtg, cyclshtg, cyclshtg, ROT90, "Taito", "Cycle Shooting", GAME_NOT_WORKING | GAME_SUPPORTS_SAVE )
/* bootlegs */ /* bootlegs */
GAME( 1986, bronx, cyclshtg, bronx, cyclshtg, bronx, ROT90, "bootleg", "Bronx", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) GAME( 1986, bronx, cyclshtg, bronx, bronx, bronx, ROT90, "bootleg", "Bronx", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE )
GAME( 1986, colt , nycaptor, bronx, nycaptor, colt, ROT0, "bootleg", "Colt", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND | GAME_WRONG_COLORS | GAME_SUPPORTS_SAVE ) GAME( 1986, colt, nycaptor, bronx, colt, colt, ROT0, "bootleg", "Colt", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND | GAME_WRONG_COLORS | GAME_SUPPORTS_SAVE )