trunk/src/mame/drivers/flyball.c
r244655 | r244656 | |
28 | 28 | public: |
29 | 29 | enum |
30 | 30 | { |
31 | | TIMER_FLYBALL_POT_ASSERT, |
32 | | TIMER_FLYBALL_POT_CLEAR, |
33 | | TIMER_FLYBALL_QUARTER |
| 31 | TIMER_POT_ASSERT, |
| 32 | TIMER_POT_CLEAR, |
| 33 | TIMER_QUARTER |
34 | 34 | }; |
35 | 35 | |
36 | 36 | flyball_state(const machine_config &mconfig, device_type type, const char *tag) |
37 | 37 | : driver_device(mconfig, type, tag), |
38 | | m_playfield_ram(*this, "playfield_ram"), |
39 | 38 | m_maincpu(*this, "maincpu"), |
40 | 39 | m_gfxdecode(*this, "gfxdecode"), |
41 | 40 | m_screen(*this, "screen"), |
42 | | m_palette(*this, "palette") { } |
| 41 | m_palette(*this, "palette"), |
| 42 | m_playfield_ram(*this, "playfield_ram") { } |
43 | 43 | |
| 44 | /* devices */ |
| 45 | required_device<cpu_device> m_maincpu; |
| 46 | required_device<gfxdecode_device> m_gfxdecode; |
| 47 | required_device<screen_device> m_screen; |
| 48 | required_device<palette_device> m_palette; |
| 49 | |
44 | 50 | /* memory pointers */ |
45 | 51 | required_shared_ptr<UINT8> m_playfield_ram; |
46 | 52 | |
r244655 | r244656 | |
55 | 61 | /* misc */ |
56 | 62 | UINT8 m_potmask; |
57 | 63 | UINT8 m_potsense; |
58 | | |
59 | | /* devices */ |
60 | | required_device<cpu_device> m_maincpu; |
61 | | required_device<gfxdecode_device> m_gfxdecode; |
62 | | required_device<screen_device> m_screen; |
63 | | required_device<palette_device> m_palette; |
64 | | |
65 | | DECLARE_READ8_MEMBER(flyball_input_r); |
66 | | DECLARE_READ8_MEMBER(flyball_scanline_r); |
67 | | DECLARE_READ8_MEMBER(flyball_potsense_r); |
68 | | DECLARE_WRITE8_MEMBER(flyball_potmask_w); |
69 | | DECLARE_WRITE8_MEMBER(flyball_pitcher_pic_w); |
70 | | DECLARE_WRITE8_MEMBER(flyball_ball_vert_w); |
71 | | DECLARE_WRITE8_MEMBER(flyball_ball_horz_w); |
72 | | DECLARE_WRITE8_MEMBER(flyball_pitcher_vert_w); |
73 | | DECLARE_WRITE8_MEMBER(flyball_pitcher_horz_w); |
74 | | DECLARE_WRITE8_MEMBER(flyball_misc_w); |
75 | | TILEMAP_MAPPER_MEMBER(flyball_get_memory_offset); |
76 | | TILE_GET_INFO_MEMBER(flyball_get_tile_info); |
| 64 | |
| 65 | emu_timer *m_pot_clear_timer; |
| 66 | emu_timer *m_quarter_timer; |
| 67 | |
| 68 | DECLARE_READ8_MEMBER(input_r); |
| 69 | DECLARE_READ8_MEMBER(scanline_r); |
| 70 | DECLARE_READ8_MEMBER(potsense_r); |
| 71 | DECLARE_WRITE8_MEMBER(potmask_w); |
| 72 | DECLARE_WRITE8_MEMBER(pitcher_pic_w); |
| 73 | DECLARE_WRITE8_MEMBER(ball_vert_w); |
| 74 | DECLARE_WRITE8_MEMBER(ball_horz_w); |
| 75 | DECLARE_WRITE8_MEMBER(pitcher_vert_w); |
| 76 | DECLARE_WRITE8_MEMBER(pitcher_horz_w); |
| 77 | DECLARE_WRITE8_MEMBER(misc_w); |
| 78 | |
| 79 | TILEMAP_MAPPER_MEMBER(get_memory_offset); |
| 80 | TILE_GET_INFO_MEMBER(get_tile_info); |
| 81 | |
77 | 82 | virtual void machine_start(); |
78 | 83 | virtual void machine_reset(); |
79 | 84 | virtual void video_start(); |
80 | 85 | DECLARE_PALETTE_INIT(flyball); |
81 | | UINT32 screen_update_flyball(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); |
82 | | TIMER_CALLBACK_MEMBER(flyball_joystick_callback); |
83 | | TIMER_CALLBACK_MEMBER(flyball_quarter_callback); |
| 86 | |
| 87 | UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); |
| 88 | |
| 89 | TIMER_CALLBACK_MEMBER(joystick_callback); |
| 90 | TIMER_CALLBACK_MEMBER(quarter_callback); |
84 | 91 | |
85 | 92 | protected: |
86 | 93 | virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); |
r244655 | r244656 | |
93 | 100 | * |
94 | 101 | *************************************/ |
95 | 102 | |
96 | | TILEMAP_MAPPER_MEMBER(flyball_state::flyball_get_memory_offset) |
| 103 | TILEMAP_MAPPER_MEMBER(flyball_state::get_memory_offset) |
97 | 104 | { |
98 | 105 | if (col == 0) |
99 | 106 | col = num_cols; |
r244655 | r244656 | |
102 | 109 | } |
103 | 110 | |
104 | 111 | |
105 | | TILE_GET_INFO_MEMBER(flyball_state::flyball_get_tile_info) |
| 112 | TILE_GET_INFO_MEMBER(flyball_state::get_tile_info) |
106 | 113 | { |
107 | 114 | UINT8 data = m_playfield_ram[tile_index]; |
108 | 115 | int flags = ((data & 0x40) ? TILE_FLIPX : 0) | ((data & 0x80) ? TILE_FLIPY : 0); |
r244655 | r244656 | |
117 | 124 | |
118 | 125 | void flyball_state::video_start() |
119 | 126 | { |
120 | | m_tmap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(flyball_state::flyball_get_tile_info),this), tilemap_mapper_delegate(FUNC(flyball_state::flyball_get_memory_offset),this), 8, 16, 32, 16); |
| 127 | m_tmap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(flyball_state::get_tile_info),this), tilemap_mapper_delegate(FUNC(flyball_state::get_memory_offset),this), 8, 16, 32, 16); |
121 | 128 | } |
122 | 129 | |
123 | 130 | |
124 | | UINT32 flyball_state::screen_update_flyball(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) |
| 131 | UINT32 flyball_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) |
125 | 132 | { |
126 | 133 | int pitcherx = m_pitcher_horz; |
127 | 134 | int pitchery = m_pitcher_vert - 31; |
r244655 | r244656 | |
151 | 158 | { |
152 | 159 | switch (id) |
153 | 160 | { |
154 | | case TIMER_FLYBALL_POT_ASSERT: |
155 | | flyball_joystick_callback(ptr, param); |
| 161 | case TIMER_POT_ASSERT: |
| 162 | joystick_callback(ptr, param); |
156 | 163 | break; |
157 | | case TIMER_FLYBALL_POT_CLEAR: |
| 164 | case TIMER_POT_CLEAR: |
158 | 165 | m_maincpu->set_input_line(0, CLEAR_LINE); |
159 | 166 | break; |
160 | | case TIMER_FLYBALL_QUARTER: |
161 | | flyball_quarter_callback(ptr, param); |
| 167 | case TIMER_QUARTER: |
| 168 | quarter_callback(ptr, param); |
162 | 169 | break; |
163 | 170 | |
164 | 171 | default: |
r244655 | r244656 | |
167 | 174 | } |
168 | 175 | |
169 | 176 | |
170 | | TIMER_CALLBACK_MEMBER(flyball_state::flyball_joystick_callback) |
| 177 | TIMER_CALLBACK_MEMBER(flyball_state::joystick_callback) |
171 | 178 | { |
172 | 179 | int potsense = param; |
173 | 180 | |
r244655 | r244656 | |
175 | 182 | { |
176 | 183 | // pot irq is active at hsync |
177 | 184 | m_maincpu->set_input_line(0, ASSERT_LINE); |
178 | | timer_set(attotime::from_ticks(32, PIXEL_CLOCK), TIMER_FLYBALL_POT_CLEAR, 0); |
| 185 | m_pot_clear_timer->adjust(attotime::from_ticks(32, PIXEL_CLOCK), 0); |
179 | 186 | } |
180 | 187 | |
181 | 188 | m_potsense |= potsense; |
182 | 189 | } |
183 | 190 | |
184 | 191 | |
185 | | TIMER_CALLBACK_MEMBER(flyball_state::flyball_quarter_callback) |
| 192 | TIMER_CALLBACK_MEMBER(flyball_state::quarter_callback) |
186 | 193 | { |
187 | 194 | int scanline = param; |
188 | 195 | int potsense[64], i; |
r244655 | r244656 | |
196 | 203 | |
197 | 204 | for (i = 0; i < 64; i++) |
198 | 205 | if (potsense[i] != 0) |
199 | | timer_set(m_screen->time_until_pos(scanline + i), TIMER_FLYBALL_POT_ASSERT, potsense[i]); |
| 206 | timer_set(m_screen->time_until_pos(scanline + i), TIMER_POT_ASSERT, potsense[i]); |
200 | 207 | |
201 | 208 | scanline += 0x40; |
202 | 209 | scanline &= 0xff; |
203 | 210 | |
204 | | timer_set(m_screen->time_until_pos(scanline), TIMER_FLYBALL_QUARTER, scanline); |
| 211 | m_quarter_timer->adjust(m_screen->time_until_pos(scanline), scanline); |
205 | 212 | |
206 | 213 | m_potsense = 0; |
207 | 214 | m_potmask = 0; |
r244655 | r244656 | |
215 | 222 | *************************************/ |
216 | 223 | |
217 | 224 | /* two physical buttons (start game and stop runner) share the same port bit */ |
218 | | READ8_MEMBER(flyball_state::flyball_input_r) |
| 225 | READ8_MEMBER(flyball_state::input_r) |
219 | 226 | { |
220 | 227 | return ioport("IN0")->read() & ioport("IN1")->read(); |
221 | 228 | } |
222 | 229 | |
223 | | READ8_MEMBER(flyball_state::flyball_scanline_r) |
| 230 | READ8_MEMBER(flyball_state::scanline_r) |
224 | 231 | { |
225 | 232 | return m_screen->vpos() & 0x3f; |
226 | 233 | } |
227 | 234 | |
228 | | READ8_MEMBER(flyball_state::flyball_potsense_r) |
| 235 | READ8_MEMBER(flyball_state::potsense_r) |
229 | 236 | { |
230 | 237 | return m_potsense & ~m_potmask; |
231 | 238 | } |
232 | 239 | |
233 | | WRITE8_MEMBER(flyball_state::flyball_potmask_w) |
| 240 | WRITE8_MEMBER(flyball_state::potmask_w) |
234 | 241 | { |
235 | 242 | m_potmask |= data & 0xf; |
236 | 243 | } |
237 | 244 | |
238 | | WRITE8_MEMBER(flyball_state::flyball_pitcher_pic_w) |
| 245 | WRITE8_MEMBER(flyball_state::pitcher_pic_w) |
239 | 246 | { |
240 | 247 | m_pitcher_pic = data & 0xf; |
241 | 248 | } |
242 | 249 | |
243 | | WRITE8_MEMBER(flyball_state::flyball_ball_vert_w) |
| 250 | WRITE8_MEMBER(flyball_state::ball_vert_w) |
244 | 251 | { |
245 | 252 | m_ball_vert = data; |
246 | 253 | } |
247 | 254 | |
248 | | WRITE8_MEMBER(flyball_state::flyball_ball_horz_w) |
| 255 | WRITE8_MEMBER(flyball_state::ball_horz_w) |
249 | 256 | { |
250 | 257 | m_ball_horz = data; |
251 | 258 | } |
252 | 259 | |
253 | | WRITE8_MEMBER(flyball_state::flyball_pitcher_vert_w) |
| 260 | WRITE8_MEMBER(flyball_state::pitcher_vert_w) |
254 | 261 | { |
255 | 262 | m_pitcher_vert = data; |
256 | 263 | } |
257 | 264 | |
258 | | WRITE8_MEMBER(flyball_state::flyball_pitcher_horz_w) |
| 265 | WRITE8_MEMBER(flyball_state::pitcher_horz_w) |
259 | 266 | { |
260 | 267 | m_pitcher_horz = data; |
261 | 268 | } |
262 | 269 | |
263 | | WRITE8_MEMBER(flyball_state::flyball_misc_w) |
| 270 | WRITE8_MEMBER(flyball_state::misc_w) |
264 | 271 | { |
265 | 272 | int bit = ~data & 1; |
266 | 273 | |
r244655 | r244656 | |
298 | 305 | ADDRESS_MAP_GLOBAL_MASK(0x1fff) |
299 | 306 | AM_RANGE(0x0000, 0x00ff) AM_MIRROR(0x100) AM_RAM |
300 | 307 | AM_RANGE(0x0800, 0x0800) AM_NOP |
301 | | AM_RANGE(0x0801, 0x0801) AM_WRITE(flyball_pitcher_pic_w) |
302 | | AM_RANGE(0x0802, 0x0802) AM_READ(flyball_scanline_r) |
303 | | AM_RANGE(0x0803, 0x0803) AM_READ(flyball_potsense_r) |
304 | | AM_RANGE(0x0804, 0x0804) AM_WRITE(flyball_ball_vert_w) |
305 | | AM_RANGE(0x0805, 0x0805) AM_WRITE(flyball_ball_horz_w) |
306 | | AM_RANGE(0x0806, 0x0806) AM_WRITE(flyball_pitcher_vert_w) |
307 | | AM_RANGE(0x0807, 0x0807) AM_WRITE(flyball_pitcher_horz_w) |
308 | | AM_RANGE(0x0900, 0x0900) AM_WRITE(flyball_potmask_w) |
309 | | AM_RANGE(0x0a00, 0x0a07) AM_WRITE(flyball_misc_w) |
310 | | AM_RANGE(0x0b00, 0x0b00) AM_READ(flyball_input_r) |
| 308 | AM_RANGE(0x0801, 0x0801) AM_WRITE(pitcher_pic_w) |
| 309 | AM_RANGE(0x0802, 0x0802) AM_READ(scanline_r) |
| 310 | AM_RANGE(0x0803, 0x0803) AM_READ(potsense_r) |
| 311 | AM_RANGE(0x0804, 0x0804) AM_WRITE(ball_vert_w) |
| 312 | AM_RANGE(0x0805, 0x0805) AM_WRITE(ball_horz_w) |
| 313 | AM_RANGE(0x0806, 0x0806) AM_WRITE(pitcher_vert_w) |
| 314 | AM_RANGE(0x0807, 0x0807) AM_WRITE(pitcher_horz_w) |
| 315 | AM_RANGE(0x0900, 0x0900) AM_WRITE(potmask_w) |
| 316 | AM_RANGE(0x0a00, 0x0a07) AM_WRITE(misc_w) |
| 317 | AM_RANGE(0x0b00, 0x0b00) AM_READ(input_r) |
311 | 318 | AM_RANGE(0x0d00, 0x0eff) AM_WRITEONLY AM_SHARE("playfield_ram") |
312 | 319 | AM_RANGE(0x1000, 0x1fff) AM_ROM AM_REGION("maincpu", 0) |
313 | 320 | ADDRESS_MAP_END |
r244655 | r244656 | |
421 | 428 | for (int i = 0; i < len; i++) |
422 | 429 | buf[i ^ 0x1ff] = ROM[i]; |
423 | 430 | memcpy(ROM, buf, len); |
| 431 | |
| 432 | m_pot_clear_timer = timer_alloc(TIMER_POT_CLEAR); |
| 433 | m_quarter_timer = timer_alloc(TIMER_QUARTER); |
424 | 434 | |
425 | 435 | save_item(NAME(m_pitcher_vert)); |
426 | 436 | save_item(NAME(m_pitcher_horz)); |
r244655 | r244656 | |
433 | 443 | |
434 | 444 | void flyball_state::machine_reset() |
435 | 445 | { |
436 | | timer_set(m_screen->time_until_pos(0), TIMER_FLYBALL_QUARTER); |
| 446 | m_quarter_timer->adjust(m_screen->time_until_pos(0)); |
437 | 447 | |
438 | 448 | m_pitcher_vert = 0; |
439 | 449 | m_pitcher_horz = 0; |
r244655 | r244656 | |
457 | 467 | MCFG_SCREEN_REFRESH_RATE(60) |
458 | 468 | MCFG_SCREEN_SIZE(256, 262) |
459 | 469 | MCFG_SCREEN_VISIBLE_AREA(0, 255, 0, 239) |
460 | | MCFG_SCREEN_UPDATE_DRIVER(flyball_state, screen_update_flyball) |
| 470 | MCFG_SCREEN_UPDATE_DRIVER(flyball_state, screen_update) |
461 | 471 | MCFG_SCREEN_PALETTE("palette") |
462 | 472 | |
463 | 473 | MCFG_GFXDECODE_ADD("gfxdecode", "palette", flyball) |
r244655 | r244656 | |
525 | 535 | * |
526 | 536 | *************************************/ |
527 | 537 | |
528 | | GAME( 1976, flyball, 0, flyball, flyball, driver_device, 0, 0, "Atari", "Flyball (rev 2)", GAME_NO_SOUND ) |
529 | | GAME( 1976, flyball1, flyball, flyball, flyball, driver_device, 0, 0, "Atari", "Flyball (rev 1)", GAME_NO_SOUND ) |
| 538 | GAME( 1976, flyball, 0, flyball, flyball, driver_device, 0, 0, "Atari", "Flyball (rev 2)", GAME_NO_SOUND | GAME_SUPPORTS_SAVE ) |
| 539 | GAME( 1976, flyball1, flyball, flyball, flyball, driver_device, 0, 0, "Atari", "Flyball (rev 1)", GAME_NO_SOUND | GAME_SUPPORTS_SAVE ) |