// license:BSD-3-Clause // copyright-holders:Luca Elia /*************************************************************************** -= 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_MEMBER(amspdwy_state::amspdwy_flipscreen_w) { m_flipscreen ^= 1; flip_screen_set(m_flipscreen); } /*************************************************************************** Callbacks for the TileMap code [ Tiles Format ] Videoram: 76543210 Code Low Bits Colorram: 765----- ---43--- Code High Bits -----210 Color ***************************************************************************/ TILE_GET_INFO_MEMBER(amspdwy_state::get_tile_info) { uint8_t code = m_videoram[tile_index]; uint8_t color = m_colorram[tile_index]; SET_TILE_INFO_MEMBER(0, code + ((color & 0x18)<<5), color & 0x07, 0); } WRITE8_MEMBER(amspdwy_state::amspdwy_videoram_w) { m_videoram[offset] = data; m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_MEMBER(amspdwy_state::amspdwy_colorram_w) { m_colorram[offset] = data; m_bg_tilemap->mark_tile_dirty(offset); } /* logical (col,row) -> memory offset */ TILEMAP_MAPPER_MEMBER(amspdwy_state::tilemap_scan_cols_back) { return col * num_rows + (num_rows - row - 1); } void amspdwy_state::video_start() { m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(amspdwy_state::get_tile_info)), tilemap_mapper_delegate(*this, FUNC(amspdwy_state::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 ***************************************************************************/ void amspdwy_state::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect ) { uint8_t *spriteram = m_spriteram; int i; int max_x = m_screen->width() - 1; int max_y = m_screen->height() - 1; for (i = 0; i < m_spriteram.bytes() ; 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()) { x = max_x - x - 8; y = max_y - y - 8; flipx = !flipx; flipy = !flipy; } m_gfxdecode->gfx(0)->transpen(bitmap,cliprect, // code + ((attr & 0x18)<<5), code + ((attr & 0x08)<<5), attr, flipx, flipy, x,y,0 ); } } /*************************************************************************** Screen Drawing ***************************************************************************/ uint32_t amspdwy_state::screen_update_amspdwy(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0); draw_sprites(bitmap, cliprect); return 0; }