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