1 // license:BSD-3-Clause
2 // copyright-holders:Quench, Stephane Humbert
3 /*******************************************************************************
4 
5     Input port macros used by many games in multiple Toaplan drivers
6     (similar to Taito but bits are ACTIVE_HIGH instead of ACTIVE_LOW)
7 
8 *******************************************************************************/
9 
10 
11 /**************************** Machine Dip Switches ****************************/
12 
13 /* with location */
14 #define TOAPLAN_DSWA_BITS_1_TO_3_LOC(DIPBANK) \
15 	PORT_DIPNAME( 0x02, 0x00, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION(#DIPBANK":!2") \
16 	PORT_DIPSETTING(    0x00, DEF_STR( Off ) ) \
17 	PORT_DIPSETTING(    0x02, DEF_STR( On ) ) \
18 	PORT_SERVICE_DIPLOC( 0x04, IP_ACTIVE_HIGH, #DIPBANK":!3" ) \
19 	PORT_DIPNAME( 0x08, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION(#DIPBANK":!4") \
20 	PORT_DIPSETTING(    0x08, DEF_STR( Off ) ) \
21 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
22 
23 #define TOAPLAN_MACHINE_COCKTAIL_LOC(DIPBANK) \
24 	PORT_DIPNAME( 0x01, 0x01, DEF_STR( Cabinet ) ) PORT_DIPLOCATION(#DIPBANK":!1") \
25 	PORT_DIPSETTING(    0x01, DEF_STR( Upright ) ) \
26 	PORT_DIPSETTING(    0x00, DEF_STR( Cocktail ) ) \
27 	TOAPLAN_DSWA_BITS_1_TO_3_LOC(DIPBANK)
28 
29 #define TOAPLAN_MACHINE_NO_COCKTAIL_LOC(DIPBANK) \
30 	PORT_DIPUNUSED_DIPLOC( 0x01, IP_ACTIVE_HIGH, #DIPBANK":!1" ) \
31 	TOAPLAN_DSWA_BITS_1_TO_3_LOC(DIPBANK)
32 
33 
34 /**************************** Coinage Dip Switches ****************************/
35 
36 /* with location */
37 #define TOAPLAN_COINAGE_JAPAN_COIN_A_LOC(DIPBANK) \
38 	PORT_DIPNAME( 0x30, 0x00, DEF_STR( Coin_A ) ) PORT_DIPLOCATION(#DIPBANK":!5,!6") \
39 	PORT_DIPSETTING(    0x20, DEF_STR( 2C_1C ) ) \
40 	PORT_DIPSETTING(    0x00, DEF_STR( 1C_1C ) ) \
41 	PORT_DIPSETTING(    0x30, DEF_STR( 2C_3C ) ) \
42 	PORT_DIPSETTING(    0x10, DEF_STR( 1C_2C ) )
43 
44 #define TOAPLAN_COINAGE_JAPAN_COIN_B_LOC(DIPBANK) \
45 	PORT_DIPNAME( 0xc0, 0x00, DEF_STR( Coin_B ) ) PORT_DIPLOCATION(#DIPBANK":!7,!8") \
46 	PORT_DIPSETTING(    0x80, DEF_STR( 2C_1C ) ) \
47 	PORT_DIPSETTING(    0x00, DEF_STR( 1C_1C ) ) \
48 	PORT_DIPSETTING(    0xc0, DEF_STR( 2C_3C ) ) \
49 	PORT_DIPSETTING(    0x40, DEF_STR( 1C_2C ) )
50 
51 #define TOAPLAN_COINAGE_WORLD_COIN_A_LOC(DIPBANK) \
52 	PORT_DIPNAME( 0x30, 0x00, DEF_STR( Coin_A ) ) PORT_DIPLOCATION(#DIPBANK":!5,!6") \
53 	PORT_DIPSETTING(    0x30, DEF_STR( 4C_1C ) ) \
54 	PORT_DIPSETTING(    0x20, DEF_STR( 3C_1C ) ) \
55 	PORT_DIPSETTING(    0x10, DEF_STR( 2C_1C ) ) \
56 	PORT_DIPSETTING(    0x00, DEF_STR( 1C_1C ) )
57 
58 #define TOAPLAN_COINAGE_WORLD_COIN_B_LOC(DIPBANK) \
59 	PORT_DIPNAME( 0xc0, 0x00, DEF_STR( Coin_B ) ) PORT_DIPLOCATION(#DIPBANK":!7,!8") \
60 	PORT_DIPSETTING(    0x00, DEF_STR( 1C_2C ) ) \
61 	PORT_DIPSETTING(    0x40, DEF_STR( 1C_3C ) ) \
62 	PORT_DIPSETTING(    0x80, DEF_STR( 1C_4C ) ) \
63 	PORT_DIPSETTING(    0xc0, DEF_STR( 1C_6C ) )
64 
65 #define TOAPLAN_COINAGE_JAPAN_LOC(DIPBANK) \
66 	TOAPLAN_COINAGE_JAPAN_COIN_A_LOC(DIPBANK) \
67 	TOAPLAN_COINAGE_JAPAN_COIN_B_LOC(DIPBANK)
68 
69 #define TOAPLAN_COINAGE_WORLD_LOC(DIPBANK) \
70 	TOAPLAN_COINAGE_WORLD_COIN_A_LOC(DIPBANK) \
71 	TOAPLAN_COINAGE_WORLD_COIN_B_LOC(DIPBANK)
72 
73 #define TOAPLAN_COINAGE_DUAL_LOC(DIP, MASK, WORLD, DIPBANK) \
74 	PORT_DIPNAME( 0x30, 0x00, DEF_STR( Coin_A ) ) PORT_DIPLOCATION(#DIPBANK":!5,!6") \
75 	PORT_DIPSETTING(    0x30, DEF_STR( 4C_1C ) ) PORT_CONDITION(#DIP,MASK,EQUALS,WORLD) \
76 	PORT_DIPSETTING(    0x20, DEF_STR( 3C_1C ) ) PORT_CONDITION(#DIP,MASK,EQUALS,WORLD) \
77 	PORT_DIPSETTING(    0x20, DEF_STR( 2C_1C ) ) PORT_CONDITION(#DIP,MASK,NOTEQUALS,WORLD) \
78 	PORT_DIPSETTING(    0x10, DEF_STR( 2C_1C ) ) PORT_CONDITION(#DIP,MASK,EQUALS,WORLD) \
79 	PORT_DIPSETTING(    0x00, DEF_STR( 1C_1C ) ) \
80 	PORT_DIPSETTING(    0x30, DEF_STR( 2C_3C ) ) PORT_CONDITION(#DIP,MASK,NOTEQUALS,WORLD) \
81 	PORT_DIPSETTING(    0x10, DEF_STR( 1C_2C ) ) PORT_CONDITION(#DIP,MASK,NOTEQUALS,WORLD) \
82 	PORT_DIPNAME( 0xc0, 0x00, DEF_STR( Coin_B ) ) PORT_DIPLOCATION(#DIPBANK":!7,!8") \
83 	PORT_DIPSETTING(    0x80, DEF_STR( 2C_1C ) ) PORT_CONDITION(#DIP,MASK,NOTEQUALS,WORLD) \
84 	PORT_DIPSETTING(    0x00, DEF_STR( 1C_1C ) ) PORT_CONDITION(#DIP,MASK,NOTEQUALS,WORLD) \
85 	PORT_DIPSETTING(    0xc0, DEF_STR( 2C_3C ) ) PORT_CONDITION(#DIP,MASK,NOTEQUALS,WORLD) \
86 	PORT_DIPSETTING(    0x40, DEF_STR( 1C_2C ) ) PORT_CONDITION(#DIP,MASK,NOTEQUALS,WORLD) \
87 	PORT_DIPSETTING(    0x00, DEF_STR( 1C_2C ) ) PORT_CONDITION(#DIP,MASK,EQUALS,WORLD) \
88 	PORT_DIPSETTING(    0x40, DEF_STR( 1C_3C ) ) PORT_CONDITION(#DIP,MASK,EQUALS,WORLD) \
89 	PORT_DIPSETTING(    0x80, DEF_STR( 1C_4C ) ) PORT_CONDITION(#DIP,MASK,EQUALS,WORLD) \
90 	PORT_DIPSETTING(    0xc0, DEF_STR( 1C_6C ) ) PORT_CONDITION(#DIP,MASK,EQUALS,WORLD)
91 
92 
93 /************************** Difficulty Dip Switches ***************************/
94 
95 /* with location */
96 #define TOAPLAN_DIFFICULTY_LOC(DIPBANK) \
97 	PORT_DIPNAME( 0x03, 0x00, DEF_STR( Difficulty ) ) PORT_DIPLOCATION(#DIPBANK":!1,!2") \
98 	PORT_DIPSETTING(    0x01, DEF_STR( Easy ) ) \
99 	PORT_DIPSETTING(    0x00, DEF_STR( Normal ) ) \
100 	PORT_DIPSETTING(    0x02, DEF_STR( Hard ) ) \
101 	PORT_DIPSETTING(    0x03, DEF_STR( Very_Hard ) )
102 
103 /************************** Joysticks and buttons *****************************/
104 
105 /* generic (might be moved elsewhere) */
106 #define INPUT_GENERIC_JOY_LOW_NIBBLE(PL, STATE, WAY, B01, B02, B04, B08) \
107 	PORT_BIT( 0x01, STATE, IPT_JOYSTICK_##B01 ) WAY PORT_PLAYER(PL) \
108 	PORT_BIT( 0x02, STATE, IPT_JOYSTICK_##B02 ) WAY PORT_PLAYER(PL) \
109 	PORT_BIT( 0x04, STATE, IPT_JOYSTICK_##B04 ) WAY PORT_PLAYER(PL) \
110 	PORT_BIT( 0x08, STATE, IPT_JOYSTICK_##B08 ) WAY PORT_PLAYER(PL)
111 
112 
113 /* Toaplan generic (more might be needed) */
114 #define TOAPLAN_GENERIC_JOY_MONO_UDLR(PL) \
115 	INPUT_GENERIC_JOY_LOW_NIBBLE(PL, IP_ACTIVE_HIGH, PORT_8WAY, UP, DOWN, LEFT, RIGHT)
116 
117 
118 #define TOAPLAN_GENERIC_BUTTONS_HIGH_NIBBLE(PL, STATE, BUTTON_A, BUTTON_B) \
119 	PORT_BIT( 0x10, STATE, IPT_##BUTTON_A ) PORT_PLAYER(PL) \
120 	PORT_BIT( 0x20, STATE, IPT_##BUTTON_B ) PORT_PLAYER(PL) \
121 	/* DO NOT fill bit 6 as it may be defined as START button ! */
122 
123 #define TOAPLAN_GENERIC_1_BUTTON(PL) \
124 	TOAPLAN_GENERIC_BUTTONS_HIGH_NIBBLE(PL, IP_ACTIVE_HIGH, BUTTON1, UNKNOWN) \
125 	PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN )
126 
127 #define TOAPLAN_GENERIC_2_BUTTONS(PL) \
128 	TOAPLAN_GENERIC_BUTTONS_HIGH_NIBBLE(PL, IP_ACTIVE_HIGH, BUTTON1, BUTTON2) \
129 	PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN )
130 
131 #define TOAPLAN_GENERIC_3_BUTTONS(PL) \
132 	TOAPLAN_GENERIC_BUTTONS_HIGH_NIBBLE(PL, IP_ACTIVE_HIGH, BUTTON1, BUTTON2) \
133 	PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(PL) \
134 	PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN )
135 
136 #define TOAPLAN_GENERIC_1_BUTTON_START(PL) \
137 	TOAPLAN_GENERIC_BUTTONS_HIGH_NIBBLE(PL, IP_ACTIVE_HIGH, BUTTON1, UNKNOWN) \
138 	PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_START##PL ) \
139 	PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN )
140 
141 #define TOAPLAN_GENERIC_2_BUTTONS_START(PL) \
142 	TOAPLAN_GENERIC_BUTTONS_HIGH_NIBBLE(PL, IP_ACTIVE_HIGH, BUTTON1, BUTTON2) \
143 	PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_START##PL ) \
144 	PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN )
145 
146 
147 /* Toaplan games (more might be needed) */
148 #define TOAPLAN_JOY_UDLR_1_BUTTON(PL) \
149 	TOAPLAN_GENERIC_JOY_MONO_UDLR(PL) \
150 	TOAPLAN_GENERIC_1_BUTTON(PL)
151 
152 #define TOAPLAN_JOY_UDLR_2_BUTTONS(PL) \
153 	TOAPLAN_GENERIC_JOY_MONO_UDLR(PL) \
154 	TOAPLAN_GENERIC_2_BUTTONS(PL)
155 
156 #define TOAPLAN_JOY_UDLR_3_BUTTONS(PL) \
157 	TOAPLAN_GENERIC_JOY_MONO_UDLR(PL) \
158 	TOAPLAN_GENERIC_3_BUTTONS(PL)
159 
160 
161 #define TOAPLAN_JOY_UDLR_1_BUTTON_START(PL) \
162 	TOAPLAN_GENERIC_JOY_MONO_UDLR(PL) \
163 	TOAPLAN_GENERIC_1_BUTTON_START(PL)
164 
165 #define TOAPLAN_JOY_UDLR_2_BUTTONS_START(PL) \
166 	TOAPLAN_GENERIC_JOY_MONO_UDLR(PL) \
167 	TOAPLAN_GENERIC_2_BUTTONS_START(PL)
168 
169 
170 /******************************* Test switch **********************************/
171 
172 /* Some Toaplan games enable built-in "cheats" like invulnerability,
173    pause, slow motion, etc. when the Test switch (JAMMA pin 15)
174    is pressed during play.
175    Set to 0 if you want to see the Test switch as a standard input.
176    Set to 1 if you want to see the Test switch as a fake Dip Switch */
177 
178 #define SHOW_TEST_AS_DIP    1
179 
180 #if SHOW_TEST_AS_DIP
181 #define TOAPLAN_TEST_SWITCH(MASK, STATE) \
182 	PORT_DIPNAME( MASK, MASK & STATE, "Test Switch" ) PORT_CODE(KEYCODE_F1) PORT_TOGGLE \
183 	PORT_DIPSETTING(    MASK & STATE, DEF_STR( Off ) ) \
184 	PORT_DIPSETTING(    MASK & ~STATE, DEF_STR( On ) )
185 #else
186 #define TOAPLAN_TEST_SWITCH(MASK, STATE) \
187 	PORT_BIT( MASK, MASK & STATE, IPT_OTHER ) PORT_NAME("Test Switch") PORT_CODE(KEYCODE_F1)
188 #endif
189