trunk/src/mame/drivers/vicdual.c
r18181 | r18182 | |
39 | 39 | * A few of the games have an extra 18K pull-up resistor on the |
40 | 40 | blue color gun, Carnival, for example. |
41 | 41 | Colors inaccurate? Blue background? |
| 42 | * Do other games have coinage hardware like nsub? |
42 | 43 | * DIP switches need verifying in most of the games |
43 | 44 | * DIP switch locations need to be added to some |
44 | 45 | |
r18181 | r18182 | |
75 | 76 | * |
76 | 77 | *************************************/ |
77 | 78 | |
78 | | TIMER_CALLBACK_MEMBER(vicdual_state::clear_coin_status) |
| 79 | TIMER_DEVICE_CALLBACK_MEMBER(vicdual_state::clear_coin_status) |
79 | 80 | { |
80 | 81 | m_coin_status = 0; |
81 | 82 | } |
r18181 | r18182 | |
97 | 98 | m_maincpu->set_input_line(INPUT_LINE_RESET, PULSE_LINE); |
98 | 99 | |
99 | 100 | /* simulate the coin switch being closed for a while */ |
100 | | machine().scheduler().timer_set(4 * machine().primary_screen->frame_period(), timer_expired_delegate(FUNC(vicdual_state::clear_coin_status),this)); |
| 101 | m_coinstate_timer->adjust(attotime::from_msec(50)); |
101 | 102 | } |
102 | 103 | |
103 | 104 | INPUT_CHANGED_MEMBER(vicdual_state::coin_changed) |
r18181 | r18182 | |
218 | 219 | * |
219 | 220 | *************************************/ |
220 | 221 | |
| 222 | void vicdual_state::machine_start() |
| 223 | { |
| 224 | m_coin_status = 0; |
| 225 | m_palette_bank = 0; |
| 226 | |
| 227 | save_item(NAME(m_coin_status)); |
| 228 | save_item(NAME(m_palette_bank)); |
| 229 | } |
| 230 | |
| 231 | void vicdual_state::machine_reset() |
| 232 | { |
| 233 | } |
| 234 | |
| 235 | |
221 | 236 | static MACHINE_CONFIG_START( vicdual_root, vicdual_state ) |
222 | 237 | |
223 | 238 | /* basic machine hardware */ |
224 | 239 | MCFG_CPU_ADD("maincpu", Z80, VICDUAL_MAIN_CPU_CLOCK) |
225 | 240 | |
| 241 | MCFG_TIMER_DRIVER_ADD("coinstate", vicdual_state, clear_coin_status) |
| 242 | |
226 | 243 | /* video hardware */ |
227 | 244 | MCFG_SCREEN_ADD("screen", RASTER) |
228 | 245 | MCFG_SCREEN_RAW_PARAMS(VICDUAL_PIXEL_CLOCK, VICDUAL_HTOTAL, VICDUAL_HBEND, VICDUAL_HBSTART, VICDUAL_VTOTAL, VICDUAL_VBEND, VICDUAL_VBSTART) |
r18181 | r18182 | |
490 | 507 | MCFG_CPU_MODIFY("maincpu") |
491 | 508 | MCFG_CPU_PROGRAM_MAP(frogs_map) |
492 | 509 | MCFG_CPU_IO_MAP(frogs_io_map) |
| 510 | |
493 | 511 | MCFG_MACHINE_START_OVERRIDE(vicdual_state,frogs_audio) |
494 | 512 | |
495 | 513 | /* video hardware */ |
r18181 | r18182 | |
2080 | 2098 | INPUT_PORTS_END |
2081 | 2099 | |
2082 | 2100 | |
| 2101 | MACHINE_START_MEMBER(vicdual_state,samurai) |
| 2102 | { |
| 2103 | m_samurai_protection_data = 0; |
| 2104 | save_item(NAME(m_samurai_protection_data)); |
| 2105 | |
| 2106 | machine_start(); |
| 2107 | } |
| 2108 | |
2083 | 2109 | static MACHINE_CONFIG_DERIVED( samurai, vicdual_root ) |
2084 | 2110 | |
2085 | 2111 | /* basic machine hardware */ |
r18181 | r18182 | |
2087 | 2113 | MCFG_CPU_PROGRAM_MAP(samurai_map) |
2088 | 2114 | MCFG_CPU_IO_MAP(samurai_io_map) |
2089 | 2115 | |
| 2116 | MCFG_MACHINE_START_OVERRIDE(vicdual_state,samurai) |
| 2117 | |
2090 | 2118 | /* video hardware */ |
2091 | 2119 | MCFG_SCREEN_MODIFY("screen") |
2092 | 2120 | MCFG_SCREEN_UPDATE_DRIVER(vicdual_state, screen_update_vicdual_color) |
r18181 | r18182 | |
2137 | 2165 | ADDRESS_MAP_END |
2138 | 2166 | |
2139 | 2167 | |
| 2168 | // coinage is handled by extra hardware on a daughterboard, put before the coin-in pin on the main logic board |
| 2169 | // IC board "COIN CALCULATOR" (97201-P): two 74191 counters, a 555 timer, coin meters, and lots of other TTL |
| 2170 | TIMER_DEVICE_CALLBACK_MEMBER(vicdual_state::nsub_coin_pulse) |
| 2171 | { |
| 2172 | if (m_nsub_play_counter > 0) |
| 2173 | { |
| 2174 | m_nsub_play_counter--; |
| 2175 | coin_in(); |
| 2176 | } |
| 2177 | } |
| 2178 | |
| 2179 | INPUT_CHANGED_MEMBER(vicdual_state::nsub_coin_in) |
| 2180 | { |
| 2181 | if (newval) |
| 2182 | { |
| 2183 | int which = (int)(FPTR)param; |
| 2184 | int coinage = ioport("COINAGE")->read(); |
| 2185 | |
| 2186 | switch (which) |
| 2187 | { |
| 2188 | // normal coin |
| 2189 | case 0: case 1: |
| 2190 | if (which && ~coinage & 0x40) |
| 2191 | { |
| 2192 | // x credits per coin |
| 2193 | m_nsub_play_counter += (coinage >> 3 & 7); |
| 2194 | } |
| 2195 | else |
| 2196 | { |
| 2197 | // x coins per credit |
| 2198 | if (--m_nsub_coin_counter == 0) |
| 2199 | { |
| 2200 | m_nsub_coin_counter = coinage & 7; |
| 2201 | m_nsub_play_counter++; |
| 2202 | } |
| 2203 | } |
| 2204 | |
| 2205 | // increment coin counter |
| 2206 | coin_counter_w(machine(), which, 1); |
| 2207 | coin_counter_w(machine(), which, 0); |
| 2208 | break; |
| 2209 | |
| 2210 | // service coin |
| 2211 | case 2: |
| 2212 | m_nsub_play_counter++; |
| 2213 | break; |
| 2214 | |
| 2215 | default: |
| 2216 | break; |
| 2217 | } |
| 2218 | } |
| 2219 | } |
| 2220 | |
| 2221 | |
2140 | 2222 | static INPUT_PORTS_START( nsub ) |
2141 | 2223 | PORT_START("IN0") |
2142 | 2224 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START1 ) |
r18181 | r18182 | |
2150 | 2232 | |
2151 | 2233 | PORT_START("IN1") |
2152 | 2234 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, vicdual_state,vicdual_get_composite_blank_comp, NULL) |
2153 | | PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) |
2154 | | PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) |
2155 | | PORT_DIPSETTING( 0x00, DEF_STR( On ) ) |
2156 | | PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) |
2157 | | PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) |
2158 | | PORT_DIPSETTING( 0x00, DEF_STR( On ) ) |
2159 | | PORT_DIPNAME(0x08, 0x08, DEF_STR( Unknown ) ) |
2160 | | PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) |
2161 | | PORT_DIPSETTING( 0x00, DEF_STR( On ) ) |
2162 | | PORT_DIPNAME(0x10, 0x10, DEF_STR( Unknown ) ) |
2163 | | PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) |
2164 | | PORT_DIPSETTING( 0x00, DEF_STR( On ) ) |
2165 | | PORT_DIPNAME(0x20, 0x20, DEF_STR( Unknown ) ) |
2166 | | PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) |
2167 | | PORT_DIPSETTING( 0x00, DEF_STR( On ) ) |
2168 | | PORT_DIPNAME(0x40, 0x40, DEF_STR( Unknown ) ) |
2169 | | PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) |
2170 | | PORT_DIPSETTING( 0x00, DEF_STR( On ) ) |
| 2235 | PORT_BIT( 0x7e, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* probably unused */ |
2171 | 2236 | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, vicdual_state,vicdual_read_coin_status, NULL) |
2172 | 2237 | |
2173 | | PORT_COIN_DEFAULT |
| 2238 | PORT_START("COIN") |
| 2239 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, vicdual_state,nsub_coin_in, (void*)0) |
| 2240 | PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, vicdual_state,nsub_coin_in, (void*)1) |
| 2241 | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SERVICE ) PORT_CHANGED_MEMBER(DEVICE_SELF, vicdual_state,nsub_coin_in, (void*)2) |
| 2242 | |
| 2243 | PORT_START("COINAGE") // "OPTION SW." on daughterboard |
| 2244 | PORT_DIPNAME( 0x07, 0x01, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SW:1,2,3") |
| 2245 | PORT_DIPSETTING( 0x07, DEF_STR( 7C_1C ) ) |
| 2246 | PORT_DIPSETTING( 0x06, DEF_STR( 6C_1C ) ) |
| 2247 | PORT_DIPSETTING( 0x05, DEF_STR( 5C_1C ) ) |
| 2248 | PORT_DIPSETTING( 0x04, DEF_STR( 4C_1C ) ) |
| 2249 | PORT_DIPSETTING( 0x03, DEF_STR( 3C_1C ) ) |
| 2250 | PORT_DIPSETTING( 0x02, DEF_STR( 2C_1C ) ) |
| 2251 | PORT_DIPSETTING( 0x01, DEF_STR( 1C_1C ) ) |
| 2252 | // PORT_DIPSETTING( 0x00, DEF_STR( 0C_1C ) ) // invalid |
| 2253 | PORT_DIPNAME( 0x78, 0x08, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("SW:4,5,6,7") |
| 2254 | PORT_DIPSETTING( 0x40, "Shared With Coin A" ) |
| 2255 | // PORT_DIPSETTING( 0x00, DEF_STR( 1C_0C ) ) // invalid |
| 2256 | PORT_DIPSETTING( 0x08, DEF_STR( 1C_1C ) ) |
| 2257 | PORT_DIPSETTING( 0x10, DEF_STR( 1C_2C ) ) |
| 2258 | PORT_DIPSETTING( 0x18, DEF_STR( 1C_3C ) ) |
| 2259 | PORT_DIPSETTING( 0x20, DEF_STR( 1C_4C ) ) |
| 2260 | PORT_DIPSETTING( 0x28, DEF_STR( 1C_5C ) ) |
| 2261 | PORT_DIPSETTING( 0x30, DEF_STR( 1C_6C ) ) |
| 2262 | PORT_DIPSETTING( 0x38, DEF_STR( 1C_7C ) ) |
| 2263 | PORT_DIPUNUSED_DIPLOC( 0x80, 0x80, "SW:8" ) |
2174 | 2264 | INPUT_PORTS_END |
2175 | 2265 | |
2176 | 2266 | |
| 2267 | MACHINE_START_MEMBER(vicdual_state,nsub) |
| 2268 | { |
| 2269 | m_nsub_play_counter = 0; |
| 2270 | save_item(NAME(m_nsub_coin_counter)); |
| 2271 | save_item(NAME(m_nsub_play_counter)); |
| 2272 | |
| 2273 | machine_start(); |
| 2274 | |
| 2275 | // playcounter 555 timer frequency is unknown |
| 2276 | // keep in mind that intervals need to be longer than the main coin_in timeout |
| 2277 | m_nsub_coinage_timer->adjust(attotime::zero, 0, attotime::from_msec(150)); |
| 2278 | } |
| 2279 | |
| 2280 | MACHINE_RESET_MEMBER(vicdual_state,nsub) |
| 2281 | { |
| 2282 | m_nsub_coin_counter = ioport("COINAGE")->read() & 7; |
| 2283 | |
| 2284 | machine_reset(); |
| 2285 | } |
| 2286 | |
2177 | 2287 | static MACHINE_CONFIG_DERIVED( nsub, vicdual_root ) |
2178 | 2288 | |
2179 | 2289 | /* basic machine hardware */ |
r18181 | r18182 | |
2181 | 2291 | MCFG_CPU_PROGRAM_MAP(nsub_map) |
2182 | 2292 | MCFG_CPU_IO_MAP(nsub_io_map) |
2183 | 2293 | |
| 2294 | MCFG_TIMER_DRIVER_ADD("nsub_coin", vicdual_state, nsub_coin_pulse) |
| 2295 | |
| 2296 | MCFG_MACHINE_START_OVERRIDE(vicdual_state,nsub) |
| 2297 | MCFG_MACHINE_RESET_OVERRIDE(vicdual_state,nsub) |
| 2298 | |
2184 | 2299 | /* video hardware */ |
2185 | 2300 | MCFG_SCREEN_MODIFY("screen") |
2186 | 2301 | MCFG_SCREEN_UPDATE_DRIVER(vicdual_state, screen_update_vicdual_color) |
trunk/src/mame/includes/vicdual.h
r18181 | r18182 | |
13 | 13 | vicdual_state(const machine_config &mconfig, device_type type, const char *tag) |
14 | 14 | : driver_device(mconfig, type, tag), |
15 | 15 | m_maincpu(*this,"maincpu"), |
| 16 | m_coinstate_timer(*this, "coinstate"), |
| 17 | m_nsub_coinage_timer(*this, "nsub_coin"), |
16 | 18 | m_videoram(*this, "videoram"), |
17 | 19 | m_characterram(*this, "characterram") |
18 | 20 | { } |
19 | 21 | |
20 | 22 | required_device<cpu_device> m_maincpu; |
| 23 | required_device<timer_device> m_coinstate_timer; |
| 24 | optional_device<timer_device> m_nsub_coinage_timer; |
21 | 25 | required_shared_ptr<UINT8> m_videoram; |
22 | 26 | required_shared_ptr<UINT8> m_characterram; |
23 | 27 | |
24 | 28 | UINT8 m_coin_status; |
25 | 29 | UINT8 m_palette_bank; |
26 | 30 | UINT8 m_samurai_protection_data; |
| 31 | int m_nsub_coin_counter; |
| 32 | int m_nsub_play_counter; |
27 | 33 | |
28 | 34 | void coin_in(); |
29 | 35 | void assert_coin_status(); |
r18181 | r18182 | |
68 | 74 | DECLARE_CUSTOM_INPUT_MEMBER(vicdual_fake_lives_r); |
69 | 75 | DECLARE_CUSTOM_INPUT_MEMBER(samurai_protection_r); |
70 | 76 | DECLARE_INPUT_CHANGED_MEMBER(coin_changed); |
| 77 | DECLARE_INPUT_CHANGED_MEMBER(nsub_coin_in); |
| 78 | |
| 79 | TIMER_DEVICE_CALLBACK_MEMBER(clear_coin_status); |
| 80 | TIMER_DEVICE_CALLBACK_MEMBER(nsub_coin_pulse); |
| 81 | |
| 82 | DECLARE_MACHINE_START(samurai); |
| 83 | DECLARE_MACHINE_START(nsub); |
| 84 | DECLARE_MACHINE_RESET(nsub); |
71 | 85 | DECLARE_MACHINE_START(frogs_audio); |
| 86 | |
| 87 | virtual void machine_start(); |
| 88 | virtual void machine_reset(); |
| 89 | |
72 | 90 | UINT32 screen_update_vicdual_bw(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); |
73 | 91 | UINT32 screen_update_vicdual_bw_or_color(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); |
74 | 92 | UINT32 screen_update_vicdual_color(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); |
75 | | TIMER_CALLBACK_MEMBER(clear_coin_status); |
76 | 93 | }; |
77 | 94 | |
78 | 95 | /*----------- defined in drivers/vicdual.c -----------*/ |