static void parentj_draw_sprites( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect, int priority ) { /* Y chain size is 16/32?/64/64? pixels. X chain size is always 64 pixels. */ taitoo_state *state = machine->driver_data<taitoo_state>(); static const int size[] = { 1, 2, 4, 4 }; int x0, y0, x, y, dx, dy, ex, ey, zx, zy; int ysize; int j, k; int offs; /* sprite RAM offset */ int tile_offs; /* sprite chain offset */ int zoomx, zoomy; /* zoom value */ for (offs = 0x03f8 / 2; offs >= 0; offs -= 0x008 / 2) { if (offs < 0x01b0 && priority == 0) continue; if (offs >= 0x01b0 && priority == 1) continue; x0 = tc0080vco_sprram_r(state->tc0080vco, offs + 1, 0xffff) & 0x3ff; y0 = tc0080vco_sprram_r(state->tc0080vco, offs + 0, 0xffff) & 0x3ff; zoomx = (tc0080vco_sprram_r(state->tc0080vco, offs + 2, 0xffff) & 0x7f00) >> 8; zoomy = (tc0080vco_sprram_r(state->tc0080vco, offs + 2, 0xffff) & 0x007f); tile_offs = (tc0080vco_sprram_r(state->tc0080vco, offs + 3, 0xffff) & 0x1fff) << 2; ysize = size[(tc0080vco_sprram_r(state->tc0080vco, offs, 0xffff) & 0x0c00) >> 10]; if (tile_offs) { /* Convert zoomy value to real value as zoomx */ zoomy = zoomy_conv_table[zoomy]; if (zoomx < 63) { dx = 8 + (zoomx + 2) / 8; ex = (zoomx + 2) % 8; zx = ((dx << 1) + ex) << 11; } else { dx = 16 + (zoomx - 63) / 4; ex = (zoomx - 63) % 4; zx = (dx + ex) << 12; } if (zoomy < 63) { dy = 8 + (zoomy + 2) / 8; ey = (zoomy + 2) % 8; zy = ((dy << 1) + ey) << 11; } else { dy = 16 + (zoomy - 63) / 4; ey = (zoomy - 63) % 4; zy = (dy + ey) << 12; } if (x0 >= 0x200) x0 -= 0x400; if (y0 >= 0x200) y0 -= 0x400; if (tc0080vco_flipscreen_r(state->tc0080vco)) { x0 = 497 - x0; y0 = 498 - y0; dx = -dx; dy = -dy; } else { x0 += 1; y0 += 2; } y = y0; for (j = 0; j < ysize; j ++) { x = x0; for (k = 0; k < 4; k ++) { if (tile_offs >= 0x1000) { int tile, color, flipx, flipy; tile = tc0080vco_cram_0_r(state->tc0080vco, tile_offs, 0xffff) & 0x7fff; color = tc0080vco_cram_1_r(state->tc0080vco, tile_offs, 0xffff) & 0x001f; flipx = tc0080vco_cram_1_r(state->tc0080vco, tile_offs, 0xffff) & 0x0040; flipy = tc0080vco_cram_1_r(state->tc0080vco, tile_offs, 0xffff) & 0x0080; if (tc0080vco_flipscreen_r(state->tc0080vco)) { flipx ^= 0x0040; flipy ^= 0x0080; } drawgfxzoom_transpen( bitmap, cliprect, machine -> gfx[0], tile, color, flipx, flipy, x, y, zx, zy, 0 ); } tile_offs ++; x += dx; } y += dy; } } } }
static void syvalion_draw_sprites( running_machine *machine,bitmap_t *bitmap, const rectangle *cliprect ) { /* Y chain size is 16/32?/64/64? pixels. X chain size is always 64 pixels. */ taitoh_state *state = (taitoh_state *)machine->driver_data; static const int size[] = { 1, 2, 4, 4 }; int x0, y0, x, y, dx, ex, zx; int ysize; int j, k; int offs; /* sprite RAM offset */ int tile_offs; /* sprite chain offset */ int zoomx; /* zoomx value */ for (offs = 0x03f8 / 2; offs >= 0; offs -= 0x008 / 2) { x0 = tc0080vco_sprram_r(state->tc0080vco, offs + 1, 0xffff) & 0x3ff; y0 = tc0080vco_sprram_r(state->tc0080vco, offs + 0, 0xffff) & 0x3ff; zoomx = (tc0080vco_sprram_r(state->tc0080vco, offs + 2, 0xffff) & 0x7f00) >> 8; tile_offs = (tc0080vco_sprram_r(state->tc0080vco, offs + 3, 0xffff) & 0x1fff) << 2; ysize = size[(tc0080vco_sprram_r(state->tc0080vco, offs, 0xffff) & 0x0c00) >> 10]; if (tile_offs) { /* The increasing ratio of expansion is different whether zoom value */ /* is less or more than 63. */ if (zoomx < 63) { dx = 8 + (zoomx + 2) / 8; ex = (zoomx + 2) % 8; zx = ((dx << 1) + ex) << 11; } else { dx = 16 + (zoomx - 63) / 4; ex = (zoomx - 63) % 4; zx = (dx + ex) << 12; } if (x0 >= 0x200) x0 -= 0x400; if (y0 >= 0x200) y0 -= 0x400; if (tc0080vco_flipscreen_r(state->tc0080vco)) { x0 = 497 - x0; y0 = 498 - y0; dx = -dx; } else { x0 += 1; y0 += 2; } y = y0; for (j = 0; j < ysize; j++) { x = x0; for (k = 0; k < 4; k++) { if (tile_offs >= 0x1000) { int tile, color, flipx, flipy; tile = tc0080vco_cram_0_r(state->tc0080vco, tile_offs, 0xffff) & 0x7fff; color = tc0080vco_cram_1_r(state->tc0080vco, tile_offs, 0xffff) & 0x001f; flipx = tc0080vco_cram_1_r(state->tc0080vco, tile_offs, 0xffff) & 0x0040; flipy = tc0080vco_cram_1_r(state->tc0080vco, tile_offs, 0xffff) & 0x0080; if (tc0080vco_flipscreen_r(state->tc0080vco)) { flipx ^= 0x0040; flipy ^= 0x0080; } drawgfxzoom_transpen( bitmap, cliprect, machine -> gfx[0], tile, color, flipx, flipy, x, y, zx, zx, 0 ); } tile_offs ++; x += dx; } y += dx; } } } }