diff --git a/src/mame/drivers/ikki.c b/src/mame/drivers/ikki.c index 20a53859883..2e88f0ea458 100644 --- a/src/mame/drivers/ikki.c +++ b/src/mame/drivers/ikki.c @@ -12,12 +12,16 @@ Ikki (c) 1985 Sun Electronics #include "deprecat.h" #include "sound/sn76496.h" + +extern UINT8 *ikki_scroll; + PALETTE_INIT( ikki ); +VIDEO_START( ikki ); VIDEO_UPDATE( ikki ); + /****************************************************************************/ -WRITE8_HANDLER( ikki_scroll_w ); WRITE8_HANDLER( ikki_scrn_ctrl_w ); static READ8_HANDLER( ikki_e000_r ) @@ -50,7 +54,7 @@ static ADDRESS_MAP_START( ikki_cpu1, ADDRESS_SPACE_PROGRAM, 8 ) AM_RANGE(0xe005, 0xe005) AM_READ(input_port_3_r) /* player2 */ AM_RANGE(0xe008, 0xe008) AM_WRITE(ikki_scrn_ctrl_w) AM_RANGE(0xe009, 0xe009) AM_WRITE(ikki_coin_counters) - AM_RANGE(0xe00a, 0xe00b) AM_WRITE(ikki_scroll_w) + AM_RANGE(0xe00a, 0xe00b) AM_WRITE(MWA8_RAM) AM_BASE(&ikki_scroll) ADDRESS_MAP_END static ADDRESS_MAP_START( ikki_cpu2, ADDRESS_SPACE_PROGRAM, 8 ) @@ -208,11 +212,10 @@ static MACHINE_DRIVER_START( ikki ) MDRV_SCREEN_SIZE(32*8, 32*8) MDRV_SCREEN_VISIBLE_AREA(1*8, 31*8-1, 2*8, 30*8-1) MDRV_GFXDECODE(ikki) - MDRV_PALETTE_LENGTH(256+1) - MDRV_COLORTABLE_LENGTH(1024) + MDRV_PALETTE_LENGTH(1024) MDRV_PALETTE_INIT(ikki) - MDRV_VIDEO_START(generic) + MDRV_VIDEO_START(ikki) MDRV_VIDEO_UPDATE(ikki) /* sound hardware */ diff --git a/src/mame/video/ikki.c b/src/mame/video/ikki.c index a77df575110..889f9586c74 100644 --- a/src/mame/video/ikki.c +++ b/src/mame/video/ikki.c @@ -10,41 +10,53 @@ Video hardware driver by Uki #include "driver.h" -static UINT8 ikki_flipscreen, ikki_scroll[2]; +UINT8 *ikki_scroll; + +static mame_bitmap *sprite_bitmap; +static UINT8 ikki_flipscreen; +static int punch_through_pen; PALETTE_INIT( ikki ) { int i; - for (i = 0; i<256; i++) - { - palette_set_color_rgb(machine,i,pal4bit(color_prom[0]),pal4bit(color_prom[256]),pal4bit(color_prom[2*256])); + /* allocate the colortable - extra pen for the punch through pen */ + machine->colortable = colortable_alloc(machine, 0x101); - color_prom++; + /* create a lookup table for the palette */ + for (i = 0; i < 0x100; i++) + { + int r = pal4bit(color_prom[i + 0x000]); + int g = pal4bit(color_prom[i + 0x100]); + int b = pal4bit(color_prom[i + 0x200]); + + colortable_palette_set_color(machine->colortable, i, MAKE_RGB(r, g, b)); } - /* 256th color is not drawn on screen */ - /* this is used for special transparent function */ - palette_set_color(machine,256,MAKE_RGB(0,0,1)); - - color_prom += 2*256; - /* color_prom now points to the beginning of the lookup table */ + color_prom += 0x300; /* sprites lookup table */ - for (i=0; i<512; i++) + for (i = 0; i < 0x200; i++) { - int d = 255-*(color_prom++); - if ( ((i % 8) == 7) && (d == 0) ) - *(colortable++) = 256; /* special transparent */ - else - *(colortable++) = d; /* normal color */ + UINT16 ctabentry = color_prom[i] ^ 0xff; + + if (((i & 0x07) == 0x07) && (ctabentry == 0)) + { + /* punch through */ + punch_through_pen = i; + ctabentry = 0x100; + } + + colortable_entry_set_value(machine->colortable, i, ctabentry); } /* bg lookup table */ - for (i=0; i<512; i++) - *(colortable++) = *(color_prom++); - + for (i = 0x200; i < 0x400; i++) + { + UINT8 ctabentry = color_prom[i]; + colortable_entry_set_value(machine->colortable, i, ctabentry); + } } WRITE8_HANDLER( ikki_scroll_w ) @@ -57,35 +69,91 @@ WRITE8_HANDLER( ikki_scrn_ctrl_w ) ikki_flipscreen = (data >> 2) & 1; } + +static void draw_sprites(running_machine *machine, mame_bitmap *bitmap, const rectangle *cliprect) +{ + int y; + offs_t offs; + + fillbitmap(sprite_bitmap, punch_through_pen, cliprect); + + for (offs = 0; offs < 0x800; offs += 4) + { + int code = (spriteram[offs + 2] & 0x80) | (spriteram[offs + 1] >> 1); + int color = spriteram[offs + 2] & 0x3f; + + int x = spriteram[offs + 3]; + y = spriteram[offs + 0]; + + if (ikki_flipscreen) + x = 240 - x; + else + y = 224 - y; + + x = x & 0xff; + y = y & 0xff; + + if (x > 248) + x = x - 256; + + if (y > 240) + y = y - 256; + + drawgfx(sprite_bitmap,machine->gfx[1], + code, color, + ikki_flipscreen,ikki_flipscreen, + x,y, + cliprect, TRANSPARENCY_PENS, + colortable_get_transpen_mask(machine->colortable, machine->gfx[1], color, 0)); + } + + /* copy the sprite bitmap into the main bitmap, skipping the transparent pixels */ + for (y = cliprect->min_y; y <= cliprect->max_y; y++) + { + int x; + + for (x = cliprect->min_x; x <= cliprect->max_x; x++) + { + UINT16 pen = *BITMAP_ADDR16(sprite_bitmap, y, x); + + if (colortable_entry_get_value(machine->colortable, pen) != 0x100) + *BITMAP_ADDR16(bitmap, y, x) = pen; + } + } +} + + +VIDEO_START( ikki ) +{ + sprite_bitmap = auto_bitmap_alloc(machine->screen[0].width, machine->screen[0].height, machine->screen[0].format); +} + + VIDEO_UPDATE( ikki ) { - - int offs,chr,col,px,py,f,bank,d; + offs_t offs; UINT8 *VIDEOATTR = memory_region( REGION_USER1 ); - f = ikki_flipscreen; - /* draw bg layer */ for (offs=0; offs<(videoram_size/2); offs++) { - int sx,sy; + int color, bank; - sx = offs / 32; - sy = offs % 32; + int sx = offs / 32; + int sy = offs % 32; + int y = sy*8; + int x = sx*8; - py = sy*8; - px = sx*8; - - d = VIDEOATTR[ sx ]; + int d = VIDEOATTR[ sx ]; switch (d) { case 0x02: /* scroll area */ - px = sx*8 - ikki_scroll[1]; - if (px<0) - px=px+8*22; - py = (sy*8 + ~ikki_scroll[0]) & 0xff; + x = sx*8 - ikki_scroll[1]; + if (x<0) + x=x+8*22; + y = (sy*8 + ~ikki_scroll[0]) & 0xff; break; case 0x03: /* non-scroll area */ @@ -104,95 +172,57 @@ VIDEO_UPDATE( ikki ) break; } - if (f != 0) + if (ikki_flipscreen) { - px = 248-px; - py = 248-py; + x = 248-x; + y = 248-y; } - col = videoram[offs*2]; - bank = (col & 0xe0) << 3; - col = ((col & 0x1f)<<0) | ((col & 0x80) >> 2); + color = videoram[offs*2]; + bank = (color & 0xe0) << 3; + color = ((color & 0x1f)<<0) | ((color & 0x80) >> 2); drawgfx(bitmap,machine->gfx[0], videoram[offs*2+1] + bank, - col, - f,f, - px,py, + color, + ikki_flipscreen,ikki_flipscreen, + x,y, cliprect,TRANSPARENCY_NONE,0); } -/* draw sprites */ - - fillbitmap(tmpbitmap, machine->pens[256], 0); - - /* c060 - c0ff */ - for (offs=0x00; offs<0x800; offs +=4) - { - chr = spriteram[offs+1] >> 1 ; - col = spriteram[offs+2]; - - px = spriteram[offs+3]; - py = spriteram[offs+0]; - - chr += (col & 0x80); - col = (col & 0x3f) >> 0 ; - - if (f==0) - py = 224-py; - else - px = 240-px; - - px = px & 0xff; - py = py & 0xff; - - if (px>248) - px = px-256; - if (py>240) - py = py-256; - - drawgfx(tmpbitmap,machine->gfx[1], - chr, - col, - f,f, - px,py, - cliprect,TRANSPARENCY_COLOR,0); - } - - copybitmap_trans(bitmap,tmpbitmap,0,0,0,0,cliprect,machine->pens[256]); - + draw_sprites(machine, bitmap, cliprect); /* mask sprites */ for (offs=0; offs<(videoram_size/2); offs++) { - int sx,sy; + int sx = offs / 32; + int sy = offs % 32; - sx = offs / 32; - sy = offs % 32; - - d = VIDEOATTR[ sx ]; + int d = VIDEOATTR[ sx ]; if ( (d == 0) || (d == 0x0d) ) { - py = sy*8; - px = sx*8; + int color, bank; - if (f != 0) + int y = sy*8; + int x = sx*8; + + if (ikki_flipscreen) { - px = 248-px; - py = 248-py; + x = 248-x; + y = 248-y; } - col = videoram[offs*2]; - bank = (col & 0xe0) << 3; - col = ((col & 0x1f)<<0) | ((col & 0x80) >> 2); + color = videoram[offs*2]; + bank = (color & 0xe0) << 3; + color = ((color & 0x1f)<<0) | ((color & 0x80) >> 2); drawgfx(bitmap,machine->gfx[0], videoram[offs*2+1] + bank, - col, - f,f, - px,py, + color, + ikki_flipscreen,ikki_flipscreen, + x,y, cliprect,TRANSPARENCY_NONE,0); } }