#include "emu.h" #include "includes/mainsnk.h" PALETTE_INIT( mainsnk ) { int i; int num_colors = 0x400; for( i=0; i> 3) & 0x01; bit1 = (color_prom[i] >> 1) & 0x01; bit2 = (color_prom[i] >> 2) & 0x01; bit3 = (color_prom[i] >> 3) & 0x01; r = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; bit0 = (color_prom[i + 2*num_colors] >> 2) & 0x01; bit1 = (color_prom[i + num_colors] >> 2) & 0x01; bit2 = (color_prom[i + num_colors] >> 3) & 0x01; bit3 = (color_prom[i] >> 0) & 0x01; g = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; bit0 = (color_prom[i + 2*num_colors] >> 0) & 0x01; bit1 = (color_prom[i + 2*num_colors] >> 1) & 0x01; bit2 = (color_prom[i + num_colors] >> 0) & 0x01; bit3 = (color_prom[i + num_colors] >> 1) & 0x01; b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; palette_set_color(machine,i,MAKE_RGB(r,g,b)); } } static TILEMAP_MAPPER( marvins_tx_scan_cols ) { // tilemap is 36x28, the central part is from the first RAM page and the // extra 4 columns are from the second page col -= 2; if (col & 0x20) return 0x400 + row + ((col & 0x1f) << 5); else return row + (col << 5); } static TILE_GET_INFO( get_tx_tile_info ) { mainsnk_state *state = machine.driver_data(); int code = state->m_fgram[tile_index]; SET_TILE_INFO(0, code, 0, tile_index & 0x400 ? TILE_FORCE_LAYER0 : 0); } static TILE_GET_INFO( get_bg_tile_info ) { mainsnk_state *state = machine.driver_data(); int code = (state->m_bgram[tile_index]); SET_TILE_INFO( 0, state->m_bg_tile_offset + code, 0, 0); } VIDEO_START(mainsnk) { mainsnk_state *state = machine.driver_data(); state->m_tx_tilemap = tilemap_create(machine, get_tx_tile_info, marvins_tx_scan_cols, 8, 8, 36, 28); state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_cols, 8, 8, 32, 32); tilemap_set_transparent_pen(state->m_tx_tilemap, 15); tilemap_set_scrolldy(state->m_tx_tilemap, 8, 8); tilemap_set_scrolldx(state->m_bg_tilemap, 16, 16); tilemap_set_scrolldy(state->m_bg_tilemap, 8, 8); } WRITE8_HANDLER(mainsnk_c600_w) { mainsnk_state *state = space->machine().driver_data(); int bank; int total_elements = space->machine().gfx[0]->total_elements; flip_screen_set(space->machine(), ~data & 0x80); tilemap_set_palette_offset(state->m_bg_tilemap, (data & 0x07) << 4); tilemap_set_palette_offset(state->m_tx_tilemap, (data & 0x07) << 4); bank = 0; if (total_elements == 0x400) // mainsnk bank = ((data & 0x30) >> 4); else if (total_elements == 0x800) // canvas bank = ((data & 0x40) >> 6) | ((data & 0x30) >> 3); if (state->m_bg_tile_offset != (bank << 8)) { state->m_bg_tile_offset = bank << 8; tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); } } WRITE8_HANDLER( mainsnk_fgram_w ) { mainsnk_state *state = space->machine().driver_data(); state->m_fgram[offset] = data; tilemap_mark_tile_dirty(state->m_tx_tilemap, offset); } WRITE8_HANDLER( mainsnk_bgram_w ) { mainsnk_state *state = space->machine().driver_data(); state->m_bgram[offset] = data; tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); } static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int scrollx, int scrolly ) { mainsnk_state *state = machine.driver_data(); const gfx_element *gfx = machine.gfx[1]; const UINT8 *source, *finish; source = state->m_spriteram; finish = source + 25*4; while( source240 ) sy -= 256; tile_number |= attributes<<4 & 0x300; sx = 288-16 - sx; sy += 8; if (flip_screen_get(machine)) { sx = 288-16 - sx; sy = 224-16 - sy; flipx = !flipx; flipy = !flipy; } drawgfx_transpen( bitmap,cliprect,gfx, tile_number, color, flipx,flipy, sx,sy,7); source+=4; } } SCREEN_UPDATE(mainsnk) { mainsnk_state *state = screen->machine().driver_data(); tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); draw_sprites(screen->machine(), bitmap, cliprect, 0, 0); tilemap_draw(bitmap, cliprect, state->m_tx_tilemap, 0, 0); return 0; }