summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/video/suprslam.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/video/suprslam.c')
-rw-r--r--src/mame/video/suprslam.c174
1 files changed, 174 insertions, 0 deletions
diff --git a/src/mame/video/suprslam.c b/src/mame/video/suprslam.c
new file mode 100644
index 00000000000..453e082ae5b
--- /dev/null
+++ b/src/mame/video/suprslam.c
@@ -0,0 +1,174 @@
+/* Super Slams - video, see notes in driver file */
+
+#include "driver.h"
+#include "video/konamiic.h"
+
+
+UINT16 *suprslam_screen_videoram, *suprslam_bg_videoram,*suprslam_sp_videoram, *suprslam_spriteram;
+static UINT16 screen_bank, bg_bank;
+static tilemap *suprslam_screen_tilemap, *suprslam_bg_tilemap;
+
+/* todo, fix zooming correctly, its _not_ like aerofgt */
+static void draw_sprites(running_machine *machine, mame_bitmap *bitmap, const rectangle *cliprect )
+{
+ /* SPRITE INFO
+
+ Video System hardware, like aerofgt etc.
+
+ the sprites use 2 areas of ram, one containing a spritelist + sprite attributes, the other
+ contains the sprite tile #'s to use
+
+ sprite attribute info (4 words per sprite)
+
+ | ZZZZ hhhy yyyy yyyy | zzzz wwwx xxxx xxxx | -fpp pppp ---- ---- | -ooo oooo oooo oooo |
+
+ x = x position
+ y = y position
+ w = width
+ h = height
+ zZ = y zoom / x zoom
+ f = xflip
+ p = palette / colour
+ o = offset to tile data in other ram area
+
+ */
+
+
+ const gfx_element *gfx = machine->gfx[1];
+ UINT16 *source = suprslam_spriteram;
+ UINT16 *source2 = suprslam_spriteram;
+ UINT16 *finish = source + 0x2000/2;
+
+ while( source<finish )
+ {
+ UINT32 sprnum = source[0] & 0x03ff;
+ if (source[0] == 0x4000) break;
+
+ sprnum *= 4;
+
+ source++;
+ /* DRAW START */
+ {
+ int ypos = source2[sprnum+0] & 0x1ff;
+ int high = (source2[sprnum+0] & 0x0e00) >> 9;
+ int yzoom = (source2[sprnum+0] & 0xf000) >> 12;
+
+ int xpos = source2[sprnum+1] & 0x1ff;
+ int wide = (source2[sprnum+1] & 0x0e00) >> 9;
+ int xzoom = (source2[sprnum+1] & 0xf000) >> 12;
+
+ int col = (source2[sprnum+2] & 0x3f00) >> 8;
+ int flipx = (source2[sprnum+2] & 0x4000) >> 14;
+// int flipy = (source2[sprnum+2] & 0x8000) >> 15;
+
+ int word_offset = source2[sprnum+3] & 0x7fff;
+ int xcnt, ycnt;
+
+ int loopno = 0;
+
+ xzoom = 32 - xzoom;
+ yzoom = 32 - yzoom;
+
+ if (ypos > 0xff) ypos -=0x200;
+
+ for (ycnt = 0; ycnt < high+1; ycnt ++) {
+ if (!flipx) {
+ for (xcnt = 0; xcnt < wide+1; xcnt ++) {
+ int tileno = suprslam_sp_videoram[word_offset+loopno];
+ drawgfxzoom(bitmap, gfx, tileno, col, 0, 0,xpos + xcnt * xzoom/2, ypos + ycnt * yzoom/2, cliprect, TRANSPARENCY_PEN, 15,xzoom << 11, yzoom << 11);
+ drawgfxzoom(bitmap, gfx, tileno, col, 0, 0,-0x200+xpos + xcnt * xzoom/2, ypos + ycnt * yzoom/2, cliprect, TRANSPARENCY_PEN, 15,xzoom << 11, yzoom << 11);
+ loopno ++;
+ }
+ } else {
+ for (xcnt = wide; xcnt >= 0; xcnt --) {
+ int tileno = suprslam_sp_videoram[word_offset+loopno];
+ drawgfxzoom(bitmap, gfx, tileno, col, 1, 0,xpos + xcnt * xzoom/2, ypos + ycnt * yzoom/2, cliprect, TRANSPARENCY_PEN, 15,xzoom << 11, yzoom << 11);
+ drawgfxzoom(bitmap, gfx, tileno, col, 1, 0,-0x200+xpos + xcnt * xzoom/2, ypos + ycnt * yzoom/2, cliprect, TRANSPARENCY_PEN, 15,xzoom << 11, yzoom << 11);
+ loopno ++;
+ }
+ }
+ }
+ }
+ }
+}
+
+/* FG 'SCREEN' LAYER */
+
+WRITE16_HANDLER( suprslam_screen_videoram_w )
+{
+ suprslam_screen_videoram[offset] = data;
+ tilemap_mark_tile_dirty(suprslam_screen_tilemap,offset);
+}
+
+
+static TILE_GET_INFO( get_suprslam_tile_info )
+{
+ int tileno, colour;
+
+ tileno = suprslam_screen_videoram[tile_index] & 0x0fff;
+ colour = suprslam_screen_videoram[tile_index] & 0xf000;
+
+ tileno += screen_bank;
+ colour = colour >> 12;
+
+ SET_TILE_INFO(0,tileno,colour,0);
+}
+
+
+/* BG LAYER */
+WRITE16_HANDLER( suprslam_bg_videoram_w )
+{
+ suprslam_bg_videoram[offset] = data;
+ tilemap_mark_tile_dirty(suprslam_bg_tilemap,offset);
+}
+
+
+static TILE_GET_INFO( get_suprslam_bg_tile_info )
+{
+ int tileno, colour;
+
+ tileno = suprslam_bg_videoram[tile_index] & 0x0fff;
+ colour = suprslam_bg_videoram[tile_index] & 0xf000;
+
+ tileno += bg_bank;
+ colour = colour >> 12;
+
+ SET_TILE_INFO(2,tileno,colour,0);
+}
+
+
+VIDEO_START( suprslam )
+{
+ suprslam_bg_tilemap = tilemap_create(get_suprslam_bg_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN, 16, 16,64,64);
+ suprslam_screen_tilemap = tilemap_create(get_suprslam_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN, 8, 8,64,32);
+
+ K053936_wraparound_enable(0, 1);
+ K053936_set_offset(0, -45, -21);
+
+ tilemap_set_transparent_pen(suprslam_screen_tilemap,15);
+}
+
+VIDEO_UPDATE( suprslam )
+{
+ fillbitmap(bitmap,get_black_pen(machine),cliprect);
+
+ K053936_0_zoom_draw(bitmap,cliprect,suprslam_bg_tilemap,0,0);
+
+ draw_sprites(machine, bitmap, cliprect);
+
+ tilemap_draw(bitmap,cliprect,suprslam_screen_tilemap,0,0);
+ return 0;
+}
+
+WRITE16_HANDLER (suprslam_bank_w)
+{
+ UINT16 old_screen_bank, old_bg_bank;
+ old_screen_bank = screen_bank;
+ old_bg_bank = bg_bank;
+
+ screen_bank = data & 0xf000;
+ bg_bank = (data & 0x0f00) << 4;
+
+ if (screen_bank != old_screen_bank) tilemap_mark_all_tiles_dirty (suprslam_screen_tilemap);
+ if (bg_bank != old_bg_bank) tilemap_mark_all_tiles_dirty (suprslam_bg_tilemap);
+}