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