/*************************************************************************** -= American Speedway =- driver by Luca Elia (l.elia@tin.it) - 8x8 4 Color Tiles (with 8 palettes) used for both: - 1 256x256 non scrolling layer - 64 (32?) Sprites ***************************************************************************/ #include "emu.h" #include "includes/amspdwy.h" WRITE8_HANDLER( amspdwy_paletteram_w ) { data ^= 0xff; paletteram_BBGGGRRR_w(space, offset, data); // paletteram_RRRGGGBB_w(offset, data); } WRITE8_HANDLER( amspdwy_flipscreen_w ) { amspdwy_state *state = space->machine().driver_data(); state->m_flipscreen ^= 1; flip_screen_set(space->machine(), state->m_flipscreen); } /*************************************************************************** Callbacks for the TileMap code [ Tiles Format ] Videoram: 76543210 Code Low Bits Colorram: 765----- ---43--- Code High Bits -----210 Color ***************************************************************************/ static TILE_GET_INFO( get_tile_info ) { amspdwy_state *state = machine.driver_data(); UINT8 code = state->m_videoram[tile_index]; UINT8 color = state->m_colorram[tile_index]; SET_TILE_INFO( 0, code + ((color & 0x18)<<5), color & 0x07, 0); } WRITE8_HANDLER( amspdwy_videoram_w ) { amspdwy_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); } WRITE8_HANDLER( amspdwy_colorram_w ) { amspdwy_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); } /* logical (col,row) -> memory offset */ static TILEMAP_MAPPER( tilemap_scan_cols_back ) { return col * num_rows + (num_rows - row - 1); } VIDEO_START( amspdwy ) { amspdwy_state *state = machine.driver_data(); state->m_bg_tilemap = tilemap_create(machine, get_tile_info, tilemap_scan_cols_back, 8, 8, 0x20, 0x20); } /*************************************************************************** Sprites Drawing Offset: Format: Value: 0 Y 1 X 2 Code Low Bits 3 7------- Flip X -6------ Flip Y --5----- ---4---- ? ----3--- Code High Bit? -----210 Color ***************************************************************************/ static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) { amspdwy_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; int i; int max_x = machine.primary_screen->width() - 1; int max_y = machine.primary_screen->height() - 1; for (i = 0; i < state->m_spriteram_size ; i += 4) { int y = spriteram[i + 0]; int x = spriteram[i + 1]; int code = spriteram[i + 2]; int attr = spriteram[i + 3]; int flipx = attr & 0x80; int flipy = attr & 0x40; if (flip_screen_get(machine)) { x = max_x - x - 8; y = max_y - y - 8; flipx = !flipx; flipy = !flipy; } drawgfx_transpen(bitmap,cliprect,machine.gfx[0], // code + ((attr & 0x18)<<5), code + ((attr & 0x08)<<5), attr, flipx, flipy, x,y,0 ); } } /*************************************************************************** Screen Drawing ***************************************************************************/ SCREEN_UPDATE( amspdwy ) { amspdwy_state *state = screen->machine().driver_data(); tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); draw_sprites(screen->machine(), bitmap, cliprect); return 0; }