diff options
Diffstat (limited to 'src/mame/video/blmbycar.c')
-rw-r--r-- | src/mame/video/blmbycar.c | 259 |
1 files changed, 259 insertions, 0 deletions
diff --git a/src/mame/video/blmbycar.c b/src/mame/video/blmbycar.c new file mode 100644 index 00000000000..061bfc842c7 --- /dev/null +++ b/src/mame/video/blmbycar.c @@ -0,0 +1,259 @@ +/*************************************************************************** + + -= Blomby Car =- + + driver by Luca Elia (l.elia@tin.it) + + +Note: if MAME_DEBUG is defined, pressing Z with: + + Q shows the background + W shows the foreground + A shows the sprites + + Keys can be used together! + + + [ 2 Scrolling Layers ] + + The Tilemaps are 64 x 32 tiles in size (1024 x 512). + Tiles are 16 x 16 x 4, with 32 color codes and 2 priority + leves (wrt sprites). Each tile needs 4 bytes. + + [ 1024? Sprites ] + + They use the same graphics the tilemaps use (16 x 16 x 4 tiles) + with 16 color codes and 2 levels of priority + + +***************************************************************************/ + +#include "driver.h" + +/* Variables needed by driver: */ + +UINT16 *blmbycar_vram_0, *blmbycar_scroll_0; +UINT16 *blmbycar_vram_1, *blmbycar_scroll_1; + + +/*************************************************************************** + + + Palette + + +***************************************************************************/ + +/* xxxxBBBBGGGGRRRR */ + +WRITE16_HANDLER( blmbycar_palette_w ) +{ + data = COMBINE_DATA(&paletteram16[offset]); + palette_set_color_rgb( Machine, offset, pal4bit(data >> 4), pal4bit(data >> 0), pal4bit(data >> 8)); +} + + + +/*************************************************************************** + + + Tilemaps + + Offset: Bits: Value: + + 0.w Code + 2.w fedc ba98 ---- ---- + ---- ---- 7--- ---- Flip Y + ---- ---- -6-- ---- Flip X + ---- ---- --5- ---- Priority (0 = Low) + ---- ---- ---4 3210 Color + +***************************************************************************/ + +static tilemap *tilemap_0, *tilemap_1; + +#define DIM_NX (0x40) +#define DIM_NY (0x20) + +static TILE_GET_INFO( get_tile_info_0 ) +{ + UINT16 code = blmbycar_vram_0[ tile_index * 2 + 0 ]; + UINT16 attr = blmbycar_vram_0[ tile_index * 2 + 1 ]; + SET_TILE_INFO( + 0, + code, + attr & 0x1f, + TILE_FLIPYX((attr >> 6) & 3)); + + tileinfo->category = (attr >> 5) & 1; +} + +static TILE_GET_INFO( get_tile_info_1 ) +{ + UINT16 code = blmbycar_vram_1[ tile_index * 2 + 0 ]; + UINT16 attr = blmbycar_vram_1[ tile_index * 2 + 1 ]; + SET_TILE_INFO( + 0, + code, + attr & 0x1f, + TILE_FLIPYX((attr >> 6) & 3)); + + tileinfo->category = (attr >> 5) & 1; +} + + +WRITE16_HANDLER( blmbycar_vram_0_w ) +{ + COMBINE_DATA(&blmbycar_vram_0[offset]); + tilemap_mark_tile_dirty(tilemap_0, offset/2); +} + +WRITE16_HANDLER( blmbycar_vram_1_w ) +{ + COMBINE_DATA(&blmbycar_vram_1[offset]); + tilemap_mark_tile_dirty(tilemap_1, offset/2); +} + + +/*************************************************************************** + + + Video Init + + +***************************************************************************/ + +VIDEO_START( blmbycar ) +{ + tilemap_0 = tilemap_create( get_tile_info_0, tilemap_scan_rows, + TILEMAP_TYPE_PEN, 16,16, DIM_NX, DIM_NY ); + + tilemap_1 = tilemap_create( get_tile_info_1, tilemap_scan_rows, + TILEMAP_TYPE_PEN, 16,16, DIM_NX, DIM_NY ); + + tilemap_set_scroll_rows(tilemap_0,1); + tilemap_set_scroll_cols(tilemap_0,1); + + tilemap_set_scroll_rows(tilemap_1,1); + tilemap_set_scroll_cols(tilemap_1,1); + tilemap_set_transparent_pen(tilemap_1,0); +} + + +/*************************************************************************** + + + Sprites Drawing + + Offset: Bits: Value: + + 0.w f--- ---- ---- ---- End Of Sprites + -edc ba9- ---- ---- + ---- ---8 7654 3210 Y (Signed) + + 2.w Code + + 4.w f--- ---- ---- ---- Flip Y + -e-- ---- ---- ---- Flip X + --dc ba98 7654 ---- + ---- ---- ---- 3210 Color (Bit 3 = Priority) + + 6.w f--- ---- ---- ---- ? Is this ever used ? + -e-- ---- ---- ---- ? 1 = Don't Draw ? + --dc ba9- ---- ---- + ---- ---8 7654 3210 X (Signed) + + +***************************************************************************/ + +static void draw_sprites(running_machine *machine, mame_bitmap *bitmap, const rectangle *cliprect) +{ + UINT16 *source, *finish; + + source = spriteram16 + 0x6/2; // ! + finish = spriteram16 + spriteram_size/2 - 8/2; + + /* Find "the end of sprites" marker */ + + for ( ; source < finish; source += 8/2 ) + if (source[0] & 0x8000) break; + + /* Draw sprites in reverse order for pdrawfgfx */ + + source -= 8/2; + finish = spriteram16; + + for ( ; source >= finish; source -= 8/2 ) + { + int y = source[0]; + int code = source[1]; + int attr = source[2]; + int x = source[3]; + + int flipx = attr & 0x4000; + int flipy = attr & 0x8000; + int pri = (~attr >> 3) & 0x1; // Priority (1 = Low) + int pri_mask = ~((1 << (pri+1)) - 1); // Above the first "pri" levels + + if (x & 0x4000) continue; // ? To get rid of the "shadow" blocks + + x = (x & 0x1ff) - 0x10; + y = 0xf0 - ((y & 0xff) - (y & 0x100)); + + pdrawgfx( bitmap, machine->gfx[0], + code, + 0x20 + (attr & 0xf), + flipx, flipy, + x, y, + cliprect, TRANSPARENCY_PEN,0, + pri_mask ); + } +} + + +/*************************************************************************** + + + Screen Drawing + + +***************************************************************************/ + +VIDEO_UPDATE( blmbycar ) +{ + int i,layers_ctrl = -1; + + tilemap_set_scrolly( tilemap_0, 0, blmbycar_scroll_0[ 0 ]); + tilemap_set_scrollx( tilemap_0, 0, blmbycar_scroll_0[ 1 ]); + + tilemap_set_scrolly( tilemap_1, 0, blmbycar_scroll_1[ 0 ]+1); + tilemap_set_scrollx( tilemap_1, 0, blmbycar_scroll_1[ 1 ]+5); + +#ifdef MAME_DEBUG +if (input_code_pressed(KEYCODE_Z)) +{ + int msk = 0; + + if (input_code_pressed(KEYCODE_Q)) msk |= 1; + if (input_code_pressed(KEYCODE_W)) msk |= 2; +// if (input_code_pressed(KEYCODE_E)) msk |= 4; + if (input_code_pressed(KEYCODE_A)) msk |= 8; + if (msk != 0) layers_ctrl &= msk; +} +#endif + + fillbitmap(priority_bitmap,0,cliprect); + + if (layers_ctrl&1) + for (i = 0; i <= 1; i++) + tilemap_draw(bitmap, cliprect, tilemap_0, i, i); + else fillbitmap(bitmap,machine->pens[0],cliprect); + + if (layers_ctrl&2) + for (i = 0; i <= 1; i++) + tilemap_draw(bitmap, cliprect, tilemap_1, i, i); + + if (layers_ctrl&8) + draw_sprites(machine, bitmap, cliprect); + return 0; +} |