1 /* Super Slams - vidhrdw, see notes in driver file */
2 
3 #include "driver.h"
4 #include "vidhrdw/konamiic.h"
5 
6 
7 data16_t *suprslam_screen_videoram, *suprslam_bg_videoram,*suprslam_sp_videoram, *suprslam_spriteram;
8 UINT16 screen_bank, bg_bank;
9 static struct tilemap *suprslam_screen_tilemap, *suprslam_bg_tilemap;
10 
11 /* todo, fix zooming correctly, its _not_ like aerofgt */
suprslam_drawsprites(struct mame_bitmap * bitmap,const struct rectangle * cliprect)12 static void suprslam_drawsprites( struct mame_bitmap *bitmap, const struct rectangle *cliprect )
13 {
14 	/* SPRITE INFO
15 
16 	Video System hardware, like aerofgt etc.
17 
18 	the sprites use 2 areas of ram, one containing a spritelist + sprite attributes, the other
19 	contains the sprite tile #'s to use
20 
21 	sprite attribute info (4 words per sprite)
22 
23 	|  ZZZZ hhhy yyyy yyyy  |  zzzz wwwx xxxx xxxx  |  -fpp pppp ---- ----  |  -ooo oooo oooo oooo  |
24 
25 	x  = x position
26 	y  = y position
27 	w  = width
28 	h  = height
29 	zZ = y zoom / x zoom
30 	f  = xflip
31 	p  = palette / colour
32 	o  = offset to tile data in other ram area
33 
34 	*/
35 
36 
37 	const struct GfxElement *gfx = Machine->gfx[1];
38 	data16_t *source = suprslam_spriteram;
39 	data16_t *source2 = suprslam_spriteram;
40 	data16_t *finish = source + 0x2000/2;
41 
42 	while( source<finish )
43 	{
44 		UINT32 sprnum = source[0] & 0x03ff;
45 		if (source[0] == 0x4000) break;
46 
47 		sprnum *= 4;
48 
49 		source++;
50 		/* DRAW START */
51 		{
52 			int ypos = source2[sprnum+0] & 0x1ff;
53 			int high = (source2[sprnum+0] & 0x0e00) >> 9;
54 			int yzoom = (source2[sprnum+0] & 0xf000) >> 12;
55 
56 			int xpos = source2[sprnum+1] & 0x1ff;
57 			int wide = (source2[sprnum+1] & 0x0e00) >> 9;
58 			int xzoom = (source2[sprnum+1] & 0xf000) >> 12;
59 
60 			int col = (source2[sprnum+2] & 0x3f00) >> 8;
61 			int flipx = (source2[sprnum+2] & 0x4000) >> 14;
62 /*			int flipy = (source2[sprnum+2] & 0x8000) >> 15;*/
63 
64 			int word_offset = source2[sprnum+3] & 0x7fff;
65 			int xcnt, ycnt;
66 
67 			int loopno = 0;
68 
69 			xzoom = 32 - xzoom;
70 			yzoom = 32 - yzoom;
71 
72 			if (ypos > 0xff) ypos -=0x200;
73 
74 			for (ycnt = 0; ycnt < high+1; ycnt ++) {
75 				if (!flipx) {
76 					for (xcnt = 0; xcnt < wide+1; xcnt ++)	{
77 						int tileno = suprslam_sp_videoram[word_offset+loopno];
78 						drawgfxzoom(bitmap, gfx, tileno, col, 0, 0,xpos + xcnt * xzoom/2, ypos + ycnt * yzoom/2, cliprect, TRANSPARENCY_PEN, 15,xzoom << 11, yzoom << 11);
79 						drawgfxzoom(bitmap, gfx, tileno, col, 0, 0,-0x200+xpos + xcnt * xzoom/2, ypos + ycnt * yzoom/2, cliprect, TRANSPARENCY_PEN, 15,xzoom << 11, yzoom << 11);
80 						loopno ++;
81 					}
82 				} else {
83 					for (xcnt = wide; xcnt >= 0; xcnt --)	{
84 						int tileno = suprslam_sp_videoram[word_offset+loopno];
85 						drawgfxzoom(bitmap, gfx, tileno, col, 1, 0,xpos + xcnt * xzoom/2, ypos + ycnt * yzoom/2, cliprect, TRANSPARENCY_PEN, 15,xzoom << 11, yzoom << 11);
86 						drawgfxzoom(bitmap, gfx, tileno, col, 1, 0,-0x200+xpos + xcnt * xzoom/2, ypos + ycnt * yzoom/2, cliprect, TRANSPARENCY_PEN, 15,xzoom << 11, yzoom << 11);
87 						loopno ++;
88 					}
89 				}
90 			}
91 		}
92 	}
93 }
94 
95 /* FG 'SCREEN' LAYER */
96 
WRITE16_HANDLER(suprslam_screen_videoram_w)97 WRITE16_HANDLER( suprslam_screen_videoram_w )
98 {
99 	if (suprslam_screen_videoram[offset] != data) {
100 		suprslam_screen_videoram[offset] = data;
101 		tilemap_mark_tile_dirty(suprslam_screen_tilemap,offset);
102 	}
103 }
104 
105 
get_suprslam_tile_info(int tile_index)106 static void get_suprslam_tile_info(int tile_index)
107 {
108 	int tileno, colour;
109 
110 	tileno = suprslam_screen_videoram[tile_index] & 0x0fff;
111 	colour = suprslam_screen_videoram[tile_index] & 0xf000;
112 
113 	tileno += screen_bank;
114 	colour = colour >> 12;
115 
116 	SET_TILE_INFO(0,tileno,colour,0)
117 }
118 
119 
120 /* BG LAYER */
WRITE16_HANDLER(suprslam_bg_videoram_w)121 WRITE16_HANDLER( suprslam_bg_videoram_w )
122 {
123 	if (suprslam_bg_videoram[offset] != data) {
124 		suprslam_bg_videoram[offset] = data;
125 		tilemap_mark_tile_dirty(suprslam_bg_tilemap,offset);
126 	}
127 }
128 
129 
get_suprslam_bg_tile_info(int tile_index)130 static void get_suprslam_bg_tile_info(int tile_index)
131 {
132 	int tileno, colour;
133 
134 	tileno = suprslam_bg_videoram[tile_index] & 0x0fff;
135 	colour = suprslam_bg_videoram[tile_index] & 0xf000;
136 
137 	tileno += bg_bank;
138 	colour = colour >> 12;
139 
140 	SET_TILE_INFO(2,tileno,colour,0)
141 }
142 
143 
VIDEO_START(suprslam)144 VIDEO_START( suprslam )
145 {
146 	suprslam_bg_tilemap = tilemap_create(get_suprslam_bg_tile_info,tilemap_scan_rows,TILEMAP_OPAQUE, 16, 16,64,64);
147 	suprslam_screen_tilemap = tilemap_create(get_suprslam_tile_info,tilemap_scan_rows,TILEMAP_TRANSPARENT, 8, 8,64,32);
148 
149 	if (!suprslam_bg_tilemap || !suprslam_screen_tilemap)
150 		return 1;
151 
152 	K053936_wraparound_enable(0, 1);
153 	K053936_set_offset(0, -45, -21);
154 
155 	tilemap_set_transparent_pen(suprslam_screen_tilemap,15);
156 
157 	return 0;
158 }
159 
VIDEO_UPDATE(suprslam)160 VIDEO_UPDATE( suprslam )
161 {
162 	fillbitmap(bitmap,get_black_pen(),cliprect);
163 
164 	K053936_0_zoom_draw(bitmap,cliprect,suprslam_bg_tilemap,0,0);
165 
166 	suprslam_drawsprites(bitmap, cliprect);
167 
168 	tilemap_draw(bitmap,cliprect,suprslam_screen_tilemap,0,0);
169 }
170 
WRITE16_HANDLER(suprslam_bank_w)171 WRITE16_HANDLER (suprslam_bank_w)
172 {
173 	UINT16 old_screen_bank, old_bg_bank;
174 	old_screen_bank = screen_bank;
175 	old_bg_bank = bg_bank;
176 
177 	screen_bank = data & 0xf000;
178 	bg_bank = (data & 0x0f00) << 4;
179 
180 	if (screen_bank != old_screen_bank) tilemap_mark_all_tiles_dirty (suprslam_screen_tilemap);
181 	if (bg_bank != old_bg_bank) tilemap_mark_all_tiles_dirty (suprslam_bg_tilemap);
182 }
183