1 // license:GPL-2.0+
2 // copyright-holders:Juergen Buchmueller
3 /***************************************************************************
4 
5     Meadows S2650 driver
6 
7 ****************************************************************************/
8 
9 #include "emu.h"
10 #include "includes/meadows.h"
11 
12 /* some constants to make life easier */
13 #define SPR_ADJUST_X    -18
14 #define SPR_ADJUST_Y    -14
15 
16 
17 /*************************************
18  *
19  *  Tilemap callbacks
20  *
21  *************************************/
22 
TILE_GET_INFO_MEMBER(meadows_state::get_tile_info)23 TILE_GET_INFO_MEMBER(meadows_state::get_tile_info)
24 {
25 	uint8_t *videoram = m_videoram;
26 	tileinfo.set(0, videoram[tile_index] & 0x7f, 0, 0);
27 }
28 
29 
30 
31 /*************************************
32  *
33  *  Video startup
34  *
35  *************************************/
36 
video_start()37 void meadows_state::video_start()
38 {
39 	m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(meadows_state::get_tile_info)), TILEMAP_SCAN_ROWS, 8,8, 32,30);
40 }
41 
42 
43 
44 /*************************************
45  *
46  *  Video RAM write
47  *
48  *************************************/
49 
meadows_videoram_w(offs_t offset,uint8_t data)50 void meadows_state::meadows_videoram_w(offs_t offset, uint8_t data)
51 {
52 	m_videoram[offset] = data;
53 	m_bg_tilemap->mark_tile_dirty(offset);
54 }
55 
56 
57 
58 /*************************************
59  *
60  *  Sprite RAM write
61  *
62  *************************************/
63 
meadows_spriteram_w(offs_t offset,uint8_t data)64 void meadows_state::meadows_spriteram_w(offs_t offset, uint8_t data)
65 {
66 //  m_screen->update_now();
67 	m_screen->update_partial(m_screen->vpos());
68 	m_spriteram[offset] = data;
69 }
70 
71 
72 
73 /*************************************
74  *
75  *  Sprite rendering
76  *
77  *************************************/
78 
draw_sprites(bitmap_ind16 & bitmap,const rectangle & clip)79 void meadows_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &clip)
80 {
81 	uint8_t *spriteram = m_spriteram;
82 	int i;
83 
84 	for (i = 0; i < 4; i++)
85 	{
86 		int x = spriteram[i+0] + SPR_ADJUST_X;
87 		int y = spriteram[i+4] + SPR_ADJUST_Y;
88 		int code = spriteram[i+8] & 0x0f;       /* bit #0 .. #3 select sprite */
89 /*      int bank = (spriteram[i+8] >> 4) & 1;      bit #4 selects prom ???    */
90 		int bank = i;                           /* that fixes it for now :-/ */
91 		int flip = spriteram[i+8] >> 5;         /* bit #5 flip vertical flag */
92 
93 		m_gfxdecode->gfx(bank + 1)->transpen(bitmap,clip, code, 0, flip, 0, x, y, 0);
94 	}
95 }
96 
97 
98 
99 /*************************************
100  *
101  *  Primary video update
102  *
103  *************************************/
104 
screen_update_meadows(screen_device & screen,bitmap_ind16 & bitmap,const rectangle & cliprect)105 uint32_t meadows_state::screen_update_meadows(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
106 {
107 	/* draw the background */
108 	m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
109 
110 	/* draw the sprites */
111 	if (m_gfxdecode->gfx(1))
112 		draw_sprites(bitmap, cliprect);
113 	return 0;
114 }
115