From af6e4ade250cf982328049ce23c424f1f8b0898a Mon Sep 17 00:00:00 2001 From: davidhay Date: Fri, 6 Jun 2008 20:50:48 +0000 Subject: [PATCH] suprnova update. now uses our own draw roz function, which supports linescroll or columnscroll, and will give me the ability to 'render' priority data (with roz applied) from the flagsmap to a temp bitmap to work with. no visual improvements yet, although hopefully there are no regressions either. --- src/mame/video/suprnova.c | 204 +++++++++++++++++++++++--------------- 1 file changed, 126 insertions(+), 78 deletions(-) diff --git a/src/mame/video/suprnova.c b/src/mame/video/suprnova.c index 13d6d29d53b..c18246dd736 100644 --- a/src/mame/video/suprnova.c +++ b/src/mame/video/suprnova.c @@ -15,9 +15,88 @@ Tilemap flip flags were reversed */ #include "driver.h" +#include "deprecat.h" static bitmap_t *sprite_bitmap; +static bitmap_t *tilemap_bitmap; + +/* draws ROZ with linescroll OR columnscroll to 16-bit indexed bitmap */ +static void suprnova_draw_roz(bitmap_t* bitmap, const rectangle *cliprect, tilemap *tmap, UINT32 startx, UINT32 starty, int incxx, int incxy, int incyx, int incyy, int wraparound, int columnscroll, UINT32* scrollram) +{ +// const pen_t *clut = &Machine->pens[0]; + //bitmap_t *destbitmap = bitmap; + bitmap_t *srcbitmap = tilemap_get_pixmap(tmap); + //bitmap_t *flagsmap = tilemap_get_flagsmap(tmap); + const int xmask = srcbitmap->width-1; + const int ymask = srcbitmap->height-1; + //const int widthshifted = srcbitmap->width << 16; + //const int heightshifted = srcbitmap->height << 16; + UINT32 cx; + UINT32 cy; + int x; + int sx; + int sy; + int ex; + int ey; + UINT16 *dest; + UINT8 *pri; + //const UINT16 *src; + //const UINT8 *maskptr; + //int destadvance = destbitmap->bpp / 8; + + /* pre-advance based on the cliprect */ + startx += cliprect->min_x * incxx + cliprect->min_y * incyx; + starty += cliprect->min_x * incxy + cliprect->min_y * incyy; + + /* extract start/end points */ + sx = cliprect->min_x; + sy = cliprect->min_y; + ex = cliprect->max_x; + ey = cliprect->max_y; + + /* wraparound case */ + { + /* loop over rows */ + while (sy <= ey) + { + + /* initialize X counters */ + x = sx; + cx = startx; + cy = starty; + + /* get dest and priority pointers */ + dest = BITMAP_ADDR16( bitmap, sy, sx); + + /* loop over columns */ + while (x <= ex) + { + if (columnscroll) + { + dest[0] = BITMAP_ADDR16(srcbitmap, ((cy >> 16) - scrollram[(cx>>16)&0x3ff]) & ymask, (cx >> 16) & xmask)[0]; + } + else + { + dest[0] = BITMAP_ADDR16(srcbitmap, (cy >> 16) & ymask, ((cx >> 16) - scrollram[(cy>>16)&0x3ff]) & xmask)[0]; + } + + /* advance in X */ + cx += incxx; + cy += incxy; + x++; + dest++; + pri++; + } + + /* advance in Y */ + startx += incyx; + starty += incyy; + sy++; + } + } +} + #define SUPRNOVA_DECODE_BUFFER_SIZE 0x2000 @@ -778,113 +857,80 @@ VIDEO_START(skns) tilemap_set_transparent_pen(skns_tilemap_B,0); sprite_bitmap = auto_bitmap_alloc(1024,1024,BITMAP_FORMAT_INDEXED16); - +tilemap_bitmap = auto_bitmap_alloc(1024,1024,BITMAP_FORMAT_INDEXED16); machine->gfx[2]->color_granularity=256; machine->gfx[3]->color_granularity=256; } +void tilemap_copy_bitmap(bitmap_t *bitmap) +{ + int x,y; + UINT16* src; + UINT32* dst; + const pen_t *clut = &Machine->pens[0]; + + + for (y=0;y<240;y++) + { + src = BITMAP_ADDR16(tilemap_bitmap, y, 0); + dst = BITMAP_ADDR32(bitmap, y, 0); + + for (x=0;x<320;x++) + { + UINT16 pendata = src[x]&0x7fff; + if (pendata & 0xff) + { + UINT32 coldat = clut[pendata]; + dst[x] = coldat; + } + } + } + +} + static void supernova_draw_a( bitmap_t *bitmap, const rectangle *cliprect, int tran ) { - int enable_a = (skns_v3_regs[0x10/4] >> 0) & 0x0001; + int enable_a = (skns_v3_regs[0x10/4] >> 0) & 0x0001; UINT32 startx,starty; int incxx,incxy,incyx,incyy; + int columnscroll; if (enable_a) { startx = skns_v3_regs[0x1c/4]; - incyy = skns_v3_regs[0x30/4]; // was xx, changed for sarukani + incyy = skns_v3_regs[0x30/4]; // was xx, changed for sarukani incyx = skns_v3_regs[0x2c/4]; starty = skns_v3_regs[0x20/4]; incxy = skns_v3_regs[0x28/4]; - incxx = skns_v3_regs[0x24/4]; // was yy, changed for sarukani + incxx = skns_v3_regs[0x24/4]; // was yy, changed for sarukani - if( (incxx == 1<<8) && !incxy & !incyx && (incyy == 1<<8) ) // No Roz, only scroll. - { - int columnscroll_a = (skns_v3_regs[0x0c/4] >> 1) & 0x0001; - int offs; - - startx >>= 8; // Lose Floating point - starty >>= 8; - - if(columnscroll_a) { - tilemap_set_scroll_rows(skns_tilemap_A,1); - tilemap_set_scroll_cols(skns_tilemap_A,0x400); - - tilemap_set_scrollx( skns_tilemap_A, 0, startx ); - for(offs=0; offs<(0x1000/4); offs++) - tilemap_set_scrolly( skns_tilemap_A, offs, starty - (skns_v3slc_ram[offs]&0x3ff) ); - } - else - { - tilemap_set_scroll_rows(skns_tilemap_A,0x400); - tilemap_set_scroll_cols(skns_tilemap_A,1); - - tilemap_set_scrolly( skns_tilemap_A, 0, starty ); - for(offs=0; offs<(0x1000/4); offs++) - tilemap_set_scrollx( skns_tilemap_A, offs, startx - (skns_v3slc_ram[offs]&0x3ff) ); - } - tilemap_draw(bitmap,cliprect,skns_tilemap_A,tran ? 0 : TILEMAP_DRAW_OPAQUE,0); - } - else - { - tilemap_draw_roz(bitmap,cliprect,skns_tilemap_A,startx << 8,starty << 8, - incxx << 8,incxy << 8,incyx << 8,incyy << 8, - 1, /* wraparound */ - tran ? 0 : TILEMAP_DRAW_OPAQUE,0); - } + columnscroll = (skns_v3_regs[0x0c/4] >> 1) & 0x0001; + fillbitmap(tilemap_bitmap, 0, NULL); + suprnova_draw_roz(tilemap_bitmap,cliprect, skns_tilemap_A, startx << 8,starty << 8, incxx << 8,incxy << 8,incyx << 8,incyy << 8, 1, columnscroll, &skns_v3slc_ram[0]); + tilemap_copy_bitmap(bitmap); } } static void supernova_draw_b( bitmap_t *bitmap, const rectangle *cliprect, int tran ) { - int enable_b = (skns_v3_regs[0x34/4] >> 0) & 0x0001; + int enable_b = (skns_v3_regs[0x34/4] >> 0) & 0x0001; UINT32 startx,starty; int incxx,incxy,incyx,incyy; + int columnscroll; if (enable_b) { startx = skns_v3_regs[0x40/4]; - incyy = skns_v3_regs[0x54/4]; + incyy = skns_v3_regs[0x54/4]; incyx = skns_v3_regs[0x50/4]; starty = skns_v3_regs[0x44/4]; incxy = skns_v3_regs[0x4c/4]; - incxx = skns_v3_regs[0x48/4]; - - if( (incxx == 1<<8) && !incxy & !incyx && (incyy == 1<<8) ) // No Roz, only scroll. - { - int columnscroll_b = (skns_v3_regs[0x0c/4] >> 9) & 0x0001; - int offs; - - startx >>= 8; - starty >>= 8; - - if(columnscroll_b) { - tilemap_set_scroll_rows(skns_tilemap_B,1); - tilemap_set_scroll_cols(skns_tilemap_B,0x400); - - tilemap_set_scrollx( skns_tilemap_B, 0, startx ); - for(offs=0; offs<(0x1000/4); offs++) - tilemap_set_scrolly( skns_tilemap_B, offs, starty - (skns_v3slc_ram[offs+(0x1000/4)]&0x3ff) ); - } - else - { - tilemap_set_scroll_rows(skns_tilemap_B,0x400); - tilemap_set_scroll_cols(skns_tilemap_B,1); - - tilemap_set_scrolly( skns_tilemap_B, 0, starty ); - for(offs=0; offs<(0x1000/4); offs++) - tilemap_set_scrollx( skns_tilemap_B, offs, startx - (skns_v3slc_ram[offs+(0x1000/4)]&0x3ff) ); - } - tilemap_draw(bitmap,cliprect,skns_tilemap_B,tran ? 0 : TILEMAP_DRAW_OPAQUE,0); - } - else - { - tilemap_draw_roz(bitmap,cliprect,skns_tilemap_B,startx << 8,starty << 8, - incxx << 8,incxy << 8,incyx << 8,incyy << 8, - 1, /* wraparound */ - tran ? 0 : TILEMAP_DRAW_OPAQUE,0); - } + incxx = skns_v3_regs[0x48/4]; + columnscroll = (skns_v3_regs[0x0c/4] >> 9) & 0x0001; // selects column scroll or rowscroll + fillbitmap(tilemap_bitmap, 0, NULL); + suprnova_draw_roz(tilemap_bitmap,cliprect, skns_tilemap_B, startx << 8,starty << 8, incxx << 8,incxy << 8,incyx << 8,incyy << 8, 1, columnscroll, &skns_v3slc_ram[0x1000/4]); + tilemap_copy_bitmap(bitmap); } } @@ -981,13 +1027,15 @@ VIDEO_UPDATE(skns) } - fillbitmap(sprite_bitmap, 0x0000, cliprect); - skns_draw_sprites(screen->machine, sprite_bitmap, cliprect); { int x,y; const pen_t *paldata = screen->machine->pens; + fillbitmap(sprite_bitmap, 0x0000, cliprect); + skns_draw_sprites(screen->machine, sprite_bitmap, cliprect); + + for (y=0;y<240;y++) { UINT16* src;