/*************************************************************************************** -= Electronic Devices / International Games =- driver by Luca Elia (l.elia@tin.it) This game has sprites only: tiles are 16 x 16 x 6. There are 0x400 sprites, each one is allotted 8 bytes of memory (but only 5 are used) in spriteram (0x54000): Offset: Bits: Value: 0 X (low bits) 1 7--- ---- X (high bit) -6-- ---- Y (high bit) --5- ---- Flip X ---4 ---- Flip Y ---- 32-- ---- --10 Color 2 Code (high bits) 3 Code (low bits) 4 Y (low bits) Then 2 tables follow, 0x400 bytes each: - the first table (0x56000) contains 1 byte per sprite: an index in the second table - the second table (0x56400) is either an x,y offset or an index in spriteram_2 (0x60000): 0 X offset (low bits) 1 Y offset (low bits) 2 7--- ---- If 1, the following bits are an index in spriteram_2 for the real X&Y & Code offsets -654 321- ---- ---0 X offset (high bit) 3 7654 321- ---- ---0 Y offset (high bit) Spriteram_2 contains 0x4000 X&Y & Code offsets: 0 Y offset (low bits) 1 7--- ---- Flip X (xor with that in spriteram) -6-- ---- Flip Y "" --54 321- Code offset ---- ---0 Y offset (high bit) 2 X offset (low bits) 3 X offset (high bit) ***************************************************************************************/ #include "emu.h" #include "includes/fantland.h" static void draw_sprites(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect) { fantland_state *state = machine.driver_data(); UINT8 *spriteram_2 = state->m_spriteram2; UINT8 *indx_ram = state->m_spriteram + 0x2000, // this ram contains indexes into offs_ram *offs_ram = state->m_spriteram + 0x2400, // this ram contains x,y offsets or indexes into spriteram_2 *ram = state->m_spriteram, // current sprite pointer in spriteram *ram2 = indx_ram; // current sprite pointer in indx_ram // wheelrun is the only game with a smaller visible area const rectangle &visarea = machine.primary_screen->visible_area(); int special = (visarea.max_y - visarea.min_y + 1) < 0x100; for ( ; ram < indx_ram; ram += 8,ram2++) { int attr,code,color, x,y,xoffs,yoffs,flipx,flipy, idx; attr = ram[1]; x = ram[0]; code = ram[3] + (ram[2] << 8); y = ram[4]; color = (attr & 0x03); flipy = (attr & 0x10) ? 1 : 0; flipx = (attr & 0x20) ? 1 : 0; y += (attr & 0x40) << 2; x += (attr & 0x80) << 1; // Index in the table of offsets idx = ram2[0] * 4; // Fetch the offsets if (offs_ram[idx + 2] & 0x80) { // x,y & code offset is in spriteram_2, this is its index idx = (((offs_ram[idx + 2] << 8) + offs_ram[idx + 3]) & 0x3fff) * 4; yoffs = spriteram_2[idx + 0] + (spriteram_2[idx + 1] << 8); xoffs = spriteram_2[idx + 2] + (spriteram_2[idx + 3] << 8); code += (yoffs & 0x3e00) >> 9; flipy ^= (yoffs & 0x4000) ? 1 : 0; flipx ^= (yoffs & 0x8000) ? 1 : 0; } else { // this is an x,y offset yoffs = ((offs_ram[idx + 3] & 0x01) << 8) + offs_ram[idx + 1]; xoffs = ((offs_ram[idx + 2] & 0x01) << 8) + offs_ram[idx + 0]; } yoffs = (yoffs & 0xff) - (yoffs & 0x100); xoffs = (xoffs & 0x1ff); if (xoffs >= 0x180) xoffs -= 0x200; y += yoffs; x += xoffs; // wheelrun needs y=0xf0 & yoffs=0x50 to be rendered at screen y 0x40 if (special && y > 0) y &= 0xff; y = (y & 0xff) - (y & 0x100); x = (x & 0x1ff); if (x >= 0x180) x -= 0x200; drawgfx_transpen(bitmap,cliprect,machine.gfx[0], code,color, flipx,flipy, x,y,0); } } SCREEN_UPDATE( fantland ) { bitmap_fill(bitmap,cliprect,0); draw_sprites(screen->machine(),bitmap,cliprect); return 0; }