1 /***************************************************************************
2 
3 Atari Flyball video emulation
4 
5 ***************************************************************************/
6 
7 #include "driver.h"
8 
9 static struct tilemap* flyball_tilemap;
10 
11 UINT8 flyball_pitcher_vert;
12 UINT8 flyball_pitcher_horz;
13 UINT8 flyball_pitcher_pic;
14 UINT8 flyball_ball_vert;
15 UINT8 flyball_ball_horz;
16 
17 UINT8* flyball_playfield_ram;
18 
19 
flyball_get_memory_offset(UINT32 col,UINT32 row,UINT32 num_cols,UINT32 num_rows)20 static UINT32 flyball_get_memory_offset(UINT32 col, UINT32 row, UINT32 num_cols, UINT32 num_rows)
21 {
22 	if (col == 0)
23 	{
24 		col = num_cols;
25 	}
26 
27 	return num_cols * (num_rows - row) - col;
28 }
29 
30 
flyball_get_tile_info(int tile_index)31 static void flyball_get_tile_info(int tile_index)
32 {
33 	UINT8 data = flyball_playfield_ram[tile_index];
34 
35 	int flags =
36 		((data & 0x40) ? TILE_FLIPX : 0) |
37 		((data & 0x80) ? TILE_FLIPY : 0);
38 
39 	int code = data & 63;
40 
41 	if ((flags & TILE_FLIPX) && (flags & TILE_FLIPY))
42 	{
43 		code += 64;
44 	}
45 
46 	SET_TILE_INFO(0, code, 0, flags)
47 }
48 
49 
VIDEO_START(flyball)50 VIDEO_START( flyball )
51 {
52 	flyball_tilemap = tilemap_create(flyball_get_tile_info,
53 		flyball_get_memory_offset, TILEMAP_OPAQUE, 8, 16, 32, 16);
54 
55 	return 0;
56 }
57 
58 
VIDEO_UPDATE(flyball)59 VIDEO_UPDATE( flyball )
60 {
61 	int pitcherx = flyball_pitcher_horz;
62 	int pitchery = flyball_pitcher_vert - 31;
63 
64 	int ballx = flyball_ball_horz - 1;
65 	int bally = flyball_ball_vert - 17;
66 
67 	int x;
68 	int y;
69 
70 	tilemap_mark_all_tiles_dirty(flyball_tilemap);
71 
72 	/* draw playfield */
73 
74 	tilemap_draw(bitmap, cliprect, flyball_tilemap, 0, 0);
75 
76 	/* draw pitcher */
77 
78 	drawgfx(bitmap, Machine->gfx[1], flyball_pitcher_pic ^ 0xf,
79 		0, 1, 0, pitcherx, pitchery, &Machine->visible_area, TRANSPARENCY_PEN, 1);
80 
81 	/* draw ball */
82 
83 	for (y = bally; y < bally + 2; y++)
84 	{
85 		for (x = ballx; x < ballx + 2; x++)
86 		{
87 			if (x >= Machine->visible_area.min_x &&
88 			    x <= Machine->visible_area.max_x &&
89 			    y >= Machine->visible_area.min_y &&
90 			    y <= Machine->visible_area.max_y)
91 			{
92 				plot_pixel(bitmap, x, y, Machine->pens[1]);
93 			}
94 		}
95 	}
96 }
97