diff options
Diffstat (limited to 'src/mame/video/brkthru.c')
-rw-r--r-- | src/mame/video/brkthru.c | 283 |
1 files changed, 283 insertions, 0 deletions
diff --git a/src/mame/video/brkthru.c b/src/mame/video/brkthru.c new file mode 100644 index 00000000000..71334d23ad5 --- /dev/null +++ b/src/mame/video/brkthru.c @@ -0,0 +1,283 @@ +/*************************************************************************** + + breakthru:video.c + +***************************************************************************/ + +#include "driver.h" + + +//UINT8 *brkthru_scroll; +UINT8 *brkthru_videoram; +size_t brkthru_videoram_size; +static int bgscroll; +static int bgbasecolor; +static int flipscreen; + +static tilemap *fg_tilemap; +static tilemap *bg_tilemap; + + +/*************************************************************************** + + Convert the color PROMs into a more useable format. + + Break Thru has one 256x8 and one 256x4 palette PROMs. + I don't know for sure how the palette PROMs are connected to the RGB + output, but it's probably the usual: + + bit 7 -- 220 ohm resistor -- GREEN + -- 470 ohm resistor -- GREEN + -- 1 kohm resistor -- GREEN + -- 2.2kohm resistor -- GREEN + -- 220 ohm resistor -- RED + -- 470 ohm resistor -- RED + -- 1 kohm resistor -- RED + bit 0 -- 2.2kohm resistor -- RED + + bit 3 -- 220 ohm resistor -- BLUE + -- 470 ohm resistor -- BLUE + -- 1 kohm resistor -- BLUE + bit 0 -- 2.2kohm resistor -- BLUE + +***************************************************************************/ +PALETTE_INIT( brkthru ) +{ + int i; + + + for (i = 0;i < machine->drv->total_colors;i++) + { + int bit0,bit1,bit2,bit3,r,g,b; + + + bit0 = (color_prom[0] >> 0) & 0x01; + bit1 = (color_prom[0] >> 1) & 0x01; + bit2 = (color_prom[0] >> 2) & 0x01; + bit3 = (color_prom[0] >> 3) & 0x01; + r = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; + bit0 = (color_prom[0] >> 4) & 0x01; + bit1 = (color_prom[0] >> 5) & 0x01; + bit2 = (color_prom[0] >> 6) & 0x01; + bit3 = (color_prom[0] >> 7) & 0x01; + g = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; + bit0 = (color_prom[machine->drv->total_colors] >> 0) & 0x01; + bit1 = (color_prom[machine->drv->total_colors] >> 1) & 0x01; + bit2 = (color_prom[machine->drv->total_colors] >> 2) & 0x01; + bit3 = (color_prom[machine->drv->total_colors] >> 3) & 0x01; + b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; + + palette_set_color(machine,i,MAKE_RGB(r,g,b)); + + color_prom++; + } +} + + + +/*************************************************************************** + + Start the video hardware emulation. + +***************************************************************************/ + +static TILE_GET_INFO( get_bg_tile_info ) +{ + /* BG RAM format + 0 1 + ---- -c-- ---- ---- = Color + ---- --xx xxxx xxxx = Code + */ + + int code = (videoram[tile_index*2] | ((videoram[tile_index*2+1]) << 8)) & 0x3ff; + int region = 1 + (code >> 7); + int colour = bgbasecolor + ((videoram[tile_index*2+1] & 0x04) >> 2); + + SET_TILE_INFO(region, code & 0x7f,colour,0); +} + +WRITE8_HANDLER( brkthru_bgram_w ) +{ + videoram[offset] = data; + tilemap_mark_tile_dirty(bg_tilemap,offset/2); +} + + +static TILE_GET_INFO( get_fg_tile_info ) +{ + UINT8 code = brkthru_videoram[tile_index]; + SET_TILE_INFO(0, code, 0, 0); +} + +WRITE8_HANDLER( brkthru_fgram_w ) +{ + brkthru_videoram[offset] = data; + tilemap_mark_tile_dirty(fg_tilemap,offset); +} + +VIDEO_START( brkthru ) +{ + fg_tilemap = tilemap_create(get_fg_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN,8,8,32,32); + bg_tilemap = tilemap_create(get_bg_tile_info,tilemap_scan_cols,TILEMAP_TYPE_PEN,16,16,32,16); + + tilemap_set_transparent_pen( fg_tilemap, 0 ); + tilemap_set_transparent_pen( bg_tilemap, 0 ); +} + + + +WRITE8_HANDLER( brkthru_1800_w ) +{ + if (offset == 0) /* low 8 bits of scroll */ + bgscroll = (bgscroll & 0x100) | data; + else if (offset == 1) + { + int bankaddress; + UINT8 *RAM = memory_region(REGION_CPU1); + + + /* bit 0-2 = ROM bank select */ + bankaddress = 0x10000 + (data & 0x07) * 0x2000; + memory_set_bankptr(1,&RAM[bankaddress]); + + /* bit 3-5 = background tiles color code */ + if (((data & 0x38) >> 2) != bgbasecolor) + { + bgbasecolor = (data & 0x38) >> 2; + tilemap_mark_all_tiles_dirty (bg_tilemap); + } + + /* bit 6 = screen flip */ + if (flipscreen != (data & 0x40)) + { + flipscreen = data & 0x40; + tilemap_set_flip(bg_tilemap,flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); + tilemap_set_flip(fg_tilemap,flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); + + } + + /* bit 7 = high bit of scroll */ + bgscroll = (bgscroll & 0xff) | ((data & 0x80) << 1); + } +} + + +#if 0 +static void show_register( mame_bitmap *bitmap, int x, int y, UINT32 data ) +{ + char buf[5]; + + sprintf(buf, "%04X", data); + ui_draw_text(y, x, buf); +} +#endif + + +static void draw_sprites(running_machine *machine, mame_bitmap *bitmap, const rectangle *cliprect, int prio ) +{ + int offs; + /* Draw the sprites. Note that it is important to draw them exactly in this */ + /* order, to have the correct priorities. */ + + /* Sprite RAM format + 0 1 2 3 + ccc- ---- ---- ---- ---- ---- ---- ---- = Color + ---d ---- ---- ---- ---- ---- ---- ---- = Double Size + ---- p--- ---- ---- ---- ---- ---- ---- = Priority + ---- -bb- ---- ---- ---- ---- ---- ---- = Bank + ---- ---e ---- ---- ---- ---- ---- ---- = Enable/Disable + ---- ---- ssss ssss ---- ---- ---- ---- = Sprite code + ---- ---- ---- ---- yyyy yyyy ---- ---- = Y position + ---- ---- ---- ---- ---- ---- xxxx xxxx = X position + */ + + for (offs = 0;offs < spriteram_size; offs += 4) + { + if ((spriteram[offs] & 0x09) == prio) /* Enable && Low Priority */ + { + int sx,sy,code,color; + + sx = 240 - spriteram[offs+3]; + if (sx < -7) sx += 256; + sy = 240 - spriteram[offs+2]; + code = spriteram[offs+1] + 128 * (spriteram[offs] & 0x06); + color = (spriteram[offs] & 0xe0) >> 5; + if (flipscreen) + { + sx = 240 - sx; + sy = 240 - sy; + } + + if (spriteram[offs] & 0x10) /* double height */ + { + drawgfx(bitmap,machine->gfx[9], + code & ~1, + color, + flipscreen,flipscreen, + sx,flipscreen? sy + 16 : sy - 16, + cliprect,TRANSPARENCY_PEN,0); + drawgfx(bitmap,machine->gfx[9], + code | 1, + color, + flipscreen,flipscreen, + sx,sy, + cliprect,TRANSPARENCY_PEN,0); + + /* redraw with wraparound */ + drawgfx(bitmap,machine->gfx[9], + code & ~1, + color, + flipscreen,flipscreen, + sx,(flipscreen? sy + 16 : sy - 16) + 256, + cliprect,TRANSPARENCY_PEN,0); + drawgfx(bitmap,machine->gfx[9], + code | 1, + color, + flipscreen,flipscreen, + sx,sy + 256, + cliprect,TRANSPARENCY_PEN,0); + + } + else + { + drawgfx(bitmap,machine->gfx[9], + code, + color, + flipscreen,flipscreen, + sx,sy, + cliprect,TRANSPARENCY_PEN,0); + + /* redraw with wraparound */ + drawgfx(bitmap,machine->gfx[9], + code, + color, + flipscreen,flipscreen, + sx,sy + 256, + cliprect,TRANSPARENCY_PEN,0); + + } + } + } + } + +VIDEO_UPDATE( brkthru ) + { + tilemap_set_scrollx(bg_tilemap,0, bgscroll); + tilemap_draw(bitmap,cliprect,bg_tilemap,TILEMAP_DRAW_OPAQUE,0); + + /* low priority sprites */ + draw_sprites(machine, bitmap, cliprect, 0x01 ); + + /* draw background over low priority sprites */ + tilemap_draw(bitmap,cliprect,bg_tilemap,0,0); + + /* high priority sprites */ + draw_sprites(machine, bitmap, cliprect, 0x09 ); + + /* fg layer */ + tilemap_draw(bitmap,cliprect,fg_tilemap,0,0); + +/* show_register(bitmap,8,8,(UINT32)flipscreen); */ + + return 0; +} |