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 ) |