#include "driver.h" #include "cpu/z80/z80.h" static int flipscreen; static tilemap *bg_tilemap, *tx_tilemap; static UINT8 fg_color, old_fg_color; extern UINT8 *jcr_textram; int jcross_vregs[5]; WRITE8_HANDLER( jcross_palettebank_w ) { fg_color = data&0xf; } static void stuff_palette( running_machine *machine, int source_index, int dest_index, int num_colors ) { UINT8 *color_prom = memory_region(REGION_PROMS) + source_index; int i; for( i=0; i> 2) & 0x01; // ? bit1 = (color_prom[0x000] >> 1) & 0x01; bit2 = (color_prom[0x000] >> 2) & 0x01; bit3 = (color_prom[0x000] >> 3) & 0x01; red = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; bit0 = (color_prom[0x800] >> 1) & 0x01; // ? bit1 = (color_prom[0x400] >> 2) & 0x01; bit2 = (color_prom[0x400] >> 3) & 0x01; bit3 = (color_prom[0x000] >> 0) & 0x01; green = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; bit0 = (color_prom[0x800] >> 0) & 0x01; // ? bit1 = (color_prom[0x800] >> 3) & 0x01; // ? bit2 = (color_prom[0x400] >> 0) & 0x01; bit3 = (color_prom[0x400] >> 1) & 0x01; blue = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; palette_set_color( machine, dest_index++, MAKE_RGB(red, green, blue) ); color_prom++; } } static void update_palette(running_machine *machine, int type ) { if( fg_color!=old_fg_color ) { stuff_palette(machine, 128+16*(fg_color&0x7), (0x10+type)*16, 16 ); old_fg_color = fg_color; } } WRITE8_HANDLER( jcross_background_ram_w ) { videoram[offset]=data; tilemap_mark_tile_dirty(bg_tilemap,offset); } WRITE8_HANDLER( jcross_text_ram_w ) { jcr_textram[offset]=data; tilemap_mark_tile_dirty(tx_tilemap,offset); } static TILE_GET_INFO( get_bg_tilemap_info ) { SET_TILE_INFO( 1, videoram[tile_index], 0, 0); } static TILE_GET_INFO( get_tx_tilemap_info ) { int tile_number = jcr_textram[tile_index]; SET_TILE_INFO( 0, tile_number, 0, 0); } VIDEO_START( jcross ) { flipscreen = -1; old_fg_color = -1; stuff_palette( machine, 0, 0, 16*8 ); stuff_palette( machine, 16*8*3, 16*8, 16*8 ); bg_tilemap = tilemap_create(get_bg_tilemap_info,tilemap_scan_cols,TILEMAP_TYPE_PEN,8,8,64,64); tx_tilemap = tilemap_create(get_tx_tilemap_info,tilemap_scan_cols,TILEMAP_TYPE_PEN,8,8,32,32); tilemap_set_transparent_pen(tx_tilemap,0xf); tilemap_set_scrolldx( bg_tilemap, 16, 22 ); } /*************************************************************************** ** ** Screen Refresh ** ***************************************************************************/ static void draw_status(running_machine *machine, mame_bitmap *bitmap, const rectangle *cliprect ) { const UINT8 *base = jcr_textram + 0x400; const gfx_element *gfx = machine->gfx[0]; int row; for( row=0; row<4; row++ ) { int sy,sx = (row&1)*8; const UINT8 *source = base + (row&1)*32; if( row>1 ) sx+=256+16; else source+=30*32; for( sy=0; sy<256; sy+=8 ) { int tile_number = *source++; drawgfx( bitmap, gfx, tile_number, tile_number>>5, 0,0, sx,sy, cliprect, TRANSPARENCY_NONE, 0xf ); } } } static void draw_sprites(running_machine *machine, mame_bitmap *bitmap, const rectangle *cliprect, int scrollx, int scrolly ) { const gfx_element *gfx = machine->gfx[3]; const UINT8 *source, *finish; source = spriteram; finish = spriteram + 0x64; while( source