/****************************************************************************** Strength & Skill (c) 1984 Sun Electronics Video hardware driver by Uki 19/Jun/2001 - ******************************************************************************/ #include "emu.h" #include "includes/strnskil.h" PALETTE_INIT( strnskil ) { int i; /* allocate the colortable */ machine.colortable = colortable_alloc(machine, 0x100); /* create a lookup table for the palette */ for (i = 0; i < 0x100; i++) { int r = pal4bit(color_prom[i + 0x000]); int g = pal4bit(color_prom[i + 0x100]); int b = pal4bit(color_prom[i + 0x200]); colortable_palette_set_color(machine.colortable, i, MAKE_RGB(r, g, b)); } /* color_prom now points to the beginning of the lookup table */ color_prom += 0x300; /* sprites lookup table */ for (i = 0; i < 0x400; i++) { UINT8 ctabentry = color_prom[i]; colortable_entry_set_value(machine.colortable, i, ctabentry); } } WRITE8_HANDLER( strnskil_videoram_w ) { strnskil_state *state = space->machine().driver_data(); UINT8 *videoram = state->m_videoram; videoram[offset] = data; tilemap_mark_tile_dirty(state->m_bg_tilemap, offset / 2); } WRITE8_HANDLER( strnskil_scrl_ctrl_w ) { strnskil_state *state = space->machine().driver_data(); state->m_scrl_ctrl = data >> 5; if (flip_screen_get(space->machine()) != (data & 0x08)) { flip_screen_set(space->machine(), data & 0x08); tilemap_mark_all_tiles_dirty_all(space->machine()); } } static TILE_GET_INFO( get_bg_tile_info ) { strnskil_state *state = machine.driver_data(); UINT8 *videoram = state->m_videoram; int attr = videoram[tile_index * 2]; int code = videoram[(tile_index * 2) + 1] + ((attr & 0x60) << 3); int color = (attr & 0x1f) | ((attr & 0x80) >> 2); SET_TILE_INFO(0, code, color, 0); } VIDEO_START( strnskil ) { strnskil_state *state = machine.driver_data(); state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_cols, 8, 8, 32, 32); tilemap_set_scroll_rows(state->m_bg_tilemap, 32); } static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) { strnskil_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; int offs; for (offs = 0x60; offs < 0x100; offs += 4) { int code = spriteram[offs + 1]; int color = spriteram[offs + 2] & 0x3f; int flipx = flip_screen_x_get(machine); int flipy = flip_screen_y_get(machine); int sx = spriteram[offs + 3]; int sy = spriteram[offs]; int px, py; if (flip_screen_get(machine)) { px = 240 - sx + 0; /* +2 or +0 ? */ py = sy; } else { px = sx - 2; py = 240 - sy; } sx = sx & 0xff; if (sx > 248) sx = sx - 256; drawgfx_transmask(bitmap, cliprect, machine.gfx[1], code, color, flipx, flipy, px, py, colortable_get_transpen_mask(machine.colortable, machine.gfx[1], color, 0)); } } SCREEN_UPDATE( strnskil ) { strnskil_state *state = screen->machine().driver_data(); int row; const UINT8 *usr1 = screen->machine().region("user1")->base(); for (row = 0; row < 32; row++) { if (state->m_scrl_ctrl != 0x07) { switch (usr1[state->m_scrl_ctrl * 32 + row]) { case 2: tilemap_set_scrollx(state->m_bg_tilemap, row, -~state->m_xscroll[1]); break; case 4: tilemap_set_scrollx(state->m_bg_tilemap, row, -~state->m_xscroll[0]); break; } } } tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); draw_sprites(screen->machine(), bitmap, cliprect); return 0; }