summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/video/brkthru.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/video/brkthru.c')
-rw-r--r--src/mame/video/brkthru.c283
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;
+}