Previous 199869 Revisions Next

r36144 Saturday 28th February, 2015 at 15:10:11 UTC by Osso
flyball.c: enabled save state support (nw)
[src/mame/drivers]flyball.c

trunk/src/mame/drivers/flyball.c
r244655r244656
2828public:
2929   enum
3030   {
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
3434   };
3535
3636   flyball_state(const machine_config &mconfig, device_type type, const char *tag)
3737      : driver_device(mconfig, type, tag),
38      m_playfield_ram(*this, "playfield_ram"),
3938      m_maincpu(*this, "maincpu"),
4039      m_gfxdecode(*this, "gfxdecode"),
4140      m_screen(*this, "screen"),
42      m_palette(*this, "palette") { }
41      m_palette(*this, "palette"),
42      m_playfield_ram(*this, "playfield_ram") { }
4343
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
4450   /* memory pointers */
4551   required_shared_ptr<UINT8> m_playfield_ram;
4652
r244655r244656
5561   /* misc */
5662   UINT8    m_potmask;
5763   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   
7782   virtual void machine_start();
7883   virtual void machine_reset();
7984   virtual void video_start();
8085   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);
8491
8592protected:
8693   virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
r244655r244656
93100 *
94101 *************************************/
95102
96TILEMAP_MAPPER_MEMBER(flyball_state::flyball_get_memory_offset)
103TILEMAP_MAPPER_MEMBER(flyball_state::get_memory_offset)
97104{
98105   if (col == 0)
99106      col = num_cols;
r244655r244656
102109}
103110
104111
105TILE_GET_INFO_MEMBER(flyball_state::flyball_get_tile_info)
112TILE_GET_INFO_MEMBER(flyball_state::get_tile_info)
106113{
107114   UINT8 data = m_playfield_ram[tile_index];
108115   int flags = ((data & 0x40) ? TILE_FLIPX : 0) | ((data & 0x80) ? TILE_FLIPY : 0);
r244655r244656
117124
118125void flyball_state::video_start()
119126{
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);
121128}
122129
123130
124UINT32 flyball_state::screen_update_flyball(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
131UINT32 flyball_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
125132{
126133   int pitcherx = m_pitcher_horz;
127134   int pitchery = m_pitcher_vert - 31;
r244655r244656
151158{
152159   switch (id)
153160   {
154   case TIMER_FLYBALL_POT_ASSERT:
155      flyball_joystick_callback(ptr, param);
161   case TIMER_POT_ASSERT:
162      joystick_callback(ptr, param);
156163      break;
157   case TIMER_FLYBALL_POT_CLEAR:
164   case TIMER_POT_CLEAR:
158165      m_maincpu->set_input_line(0, CLEAR_LINE);
159166      break;
160   case TIMER_FLYBALL_QUARTER:
161      flyball_quarter_callback(ptr, param);
167   case TIMER_QUARTER:
168      quarter_callback(ptr, param);
162169      break;
163170
164171   default:
r244655r244656
167174}
168175
169176
170TIMER_CALLBACK_MEMBER(flyball_state::flyball_joystick_callback)
177TIMER_CALLBACK_MEMBER(flyball_state::joystick_callback)
171178{
172179   int potsense = param;
173180
r244655r244656
175182   {
176183      // pot irq is active at hsync
177184      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);
179186   }
180187
181188   m_potsense |= potsense;
182189}
183190
184191
185TIMER_CALLBACK_MEMBER(flyball_state::flyball_quarter_callback)
192TIMER_CALLBACK_MEMBER(flyball_state::quarter_callback)
186193{
187194   int scanline = param;
188195   int potsense[64], i;
r244655r244656
196203
197204   for (i = 0; i < 64; i++)
198205      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]);
200207
201208   scanline += 0x40;
202209   scanline &= 0xff;
203210
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);
205212
206213   m_potsense = 0;
207214   m_potmask = 0;
r244655r244656
215222 *************************************/
216223
217224/* two physical buttons (start game and stop runner) share the same port bit */
218READ8_MEMBER(flyball_state::flyball_input_r)
225READ8_MEMBER(flyball_state::input_r)
219226{
220227   return ioport("IN0")->read() & ioport("IN1")->read();
221228}
222229
223READ8_MEMBER(flyball_state::flyball_scanline_r)
230READ8_MEMBER(flyball_state::scanline_r)
224231{
225232   return m_screen->vpos() & 0x3f;
226233}
227234
228READ8_MEMBER(flyball_state::flyball_potsense_r)
235READ8_MEMBER(flyball_state::potsense_r)
229236{
230237   return m_potsense & ~m_potmask;
231238}
232239
233WRITE8_MEMBER(flyball_state::flyball_potmask_w)
240WRITE8_MEMBER(flyball_state::potmask_w)
234241{
235242   m_potmask |= data & 0xf;
236243}
237244
238WRITE8_MEMBER(flyball_state::flyball_pitcher_pic_w)
245WRITE8_MEMBER(flyball_state::pitcher_pic_w)
239246{
240247   m_pitcher_pic = data & 0xf;
241248}
242249
243WRITE8_MEMBER(flyball_state::flyball_ball_vert_w)
250WRITE8_MEMBER(flyball_state::ball_vert_w)
244251{
245252   m_ball_vert = data;
246253}
247254
248WRITE8_MEMBER(flyball_state::flyball_ball_horz_w)
255WRITE8_MEMBER(flyball_state::ball_horz_w)
249256{
250257   m_ball_horz = data;
251258}
252259
253WRITE8_MEMBER(flyball_state::flyball_pitcher_vert_w)
260WRITE8_MEMBER(flyball_state::pitcher_vert_w)
254261{
255262   m_pitcher_vert = data;
256263}
257264
258WRITE8_MEMBER(flyball_state::flyball_pitcher_horz_w)
265WRITE8_MEMBER(flyball_state::pitcher_horz_w)
259266{
260267   m_pitcher_horz = data;
261268}
262269
263WRITE8_MEMBER(flyball_state::flyball_misc_w)
270WRITE8_MEMBER(flyball_state::misc_w)
264271{
265272   int bit = ~data & 1;
266273
r244655r244656
298305   ADDRESS_MAP_GLOBAL_MASK(0x1fff)
299306   AM_RANGE(0x0000, 0x00ff) AM_MIRROR(0x100) AM_RAM
300307   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)
311318   AM_RANGE(0x0d00, 0x0eff) AM_WRITEONLY AM_SHARE("playfield_ram")
312319   AM_RANGE(0x1000, 0x1fff) AM_ROM AM_REGION("maincpu", 0)
313320ADDRESS_MAP_END
r244655r244656
421428   for (int i = 0; i < len; i++)
422429      buf[i ^ 0x1ff] = ROM[i];
423430   memcpy(ROM, buf, len);
431   
432   m_pot_clear_timer = timer_alloc(TIMER_POT_CLEAR);
433   m_quarter_timer = timer_alloc(TIMER_QUARTER);
424434
425435   save_item(NAME(m_pitcher_vert));
426436   save_item(NAME(m_pitcher_horz));
r244655r244656
433443
434444void flyball_state::machine_reset()
435445{
436   timer_set(m_screen->time_until_pos(0), TIMER_FLYBALL_QUARTER);
446   m_quarter_timer->adjust(m_screen->time_until_pos(0));
437447
438448   m_pitcher_vert = 0;
439449   m_pitcher_horz = 0;
r244655r244656
457467   MCFG_SCREEN_REFRESH_RATE(60)
458468   MCFG_SCREEN_SIZE(256, 262)
459469   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)
461471   MCFG_SCREEN_PALETTE("palette")
462472
463473   MCFG_GFXDECODE_ADD("gfxdecode", "palette", flyball)
r244655r244656
525535 *
526536 *************************************/
527537
528GAME( 1976, flyball,  0,       flyball, flyball, driver_device, 0, 0, "Atari", "Flyball (rev 2)", GAME_NO_SOUND )
529GAME( 1976, flyball1, flyball, flyball, flyball, driver_device, 0, 0, "Atari", "Flyball (rev 1)", GAME_NO_SOUND )
538GAME( 1976, flyball,  0,       flyball, flyball, driver_device, 0, 0, "Atari", "Flyball (rev 2)", GAME_NO_SOUND | GAME_SUPPORTS_SAVE )
539GAME( 1976, flyball1, flyball, flyball, flyball, driver_device, 0, 0, "Atari", "Flyball (rev 1)", GAME_NO_SOUND | GAME_SUPPORTS_SAVE )


Previous 199869 Revisions Next


© 1997-2024 The MAME Team