1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
|
// license:BSD-3-Clause
// copyright-holders:Olivier Galibert
#include "emu.h"
#include "includes/asterix.h"
#include "screen.h"
void asterix_state::reset_spritebank()
{
m_k053244->bankselect(m_spritebank & 7);
m_spritebanks[0] = (m_spritebank << 12) & 0x7000;
m_spritebanks[1] = (m_spritebank << 9) & 0x7000;
m_spritebanks[2] = (m_spritebank << 6) & 0x7000;
m_spritebanks[3] = (m_spritebank << 3) & 0x7000;
}
void asterix_state::asterix_spritebank_w(offs_t offset, uint16_t data, uint16_t mem_mask)
{
COMBINE_DATA(&m_spritebank);
reset_spritebank();
}
K05324X_CB_MEMBER(asterix_state::sprite_callback)
{
int pri = (*color & 0x00e0) >> 2;
if (pri <= m_layerpri[2])
*priority = 0;
else if (pri > m_layerpri[2] && pri <= m_layerpri[1])
*priority = 0xf0;
else if (pri > m_layerpri[1] && pri <= m_layerpri[0])
*priority = 0xf0 | 0xcc;
else
*priority = 0xf0 | 0xcc | 0xaa;
*color = m_sprite_colorbase | (*color & 0x001f);
*code = (*code & 0xfff) | m_spritebanks[(*code >> 12) & 3];
}
K056832_CB_MEMBER(asterix_state::tile_callback)
{
*flags = *code & 0x1000 ? TILE_FLIPX : 0;
*color = (m_layer_colorbase[layer] + ((*code & 0xe000) >> 13)) & 0x7f;
*code = (*code & 0x03ff) | m_tilebanks[(*code >> 10) & 3];
}
uint32_t asterix_state::screen_update_asterix(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
static const int K053251_CI[4] = { k053251_device::CI0, k053251_device::CI2, k053251_device::CI3, k053251_device::CI4 };
int layer[3], plane, new_colorbase;
/* Layer offsets are different if horizontally flipped */
if (m_k056832->read_register(0x0) & 0x10)
{
m_k056832->set_layer_offs(0, 89 - 176, 0);
m_k056832->set_layer_offs(1, 91 - 176, 0);
m_k056832->set_layer_offs(2, 89 - 176, 0);
m_k056832->set_layer_offs(3, 95 - 176, 0);
}
else
{
m_k056832->set_layer_offs(0, 89, 0);
m_k056832->set_layer_offs(1, 91, 0);
m_k056832->set_layer_offs(2, 89, 0);
m_k056832->set_layer_offs(3, 95, 0);
}
m_tilebanks[0] = (m_k056832->get_lookup(0) << 10);
m_tilebanks[1] = (m_k056832->get_lookup(1) << 10);
m_tilebanks[2] = (m_k056832->get_lookup(2) << 10);
m_tilebanks[3] = (m_k056832->get_lookup(3) << 10);
// update color info and refresh tilemaps
m_sprite_colorbase = m_k053251->get_palette_index(k053251_device::CI1);
for (plane = 0; plane < 4; plane++)
{
new_colorbase = m_k053251->get_palette_index(K053251_CI[plane]);
if (m_layer_colorbase[plane] != new_colorbase)
{
m_layer_colorbase[plane] = new_colorbase;
m_k056832->mark_plane_dirty(plane);
}
}
layer[0] = 0;
m_layerpri[0] = m_k053251->get_priority(k053251_device::CI0);
layer[1] = 1;
m_layerpri[1] = m_k053251->get_priority(k053251_device::CI2);
layer[2] = 3;
m_layerpri[2] = m_k053251->get_priority(k053251_device::CI4);
konami_sortlayers3(layer, m_layerpri);
screen.priority().fill(0, cliprect);
bitmap.fill(0, cliprect);
m_k056832->tilemap_draw(screen, bitmap, cliprect, layer[0], K056832_DRAW_FLAG_MIRROR, 1);
m_k056832->tilemap_draw(screen, bitmap, cliprect, layer[1], K056832_DRAW_FLAG_MIRROR, 2);
m_k056832->tilemap_draw(screen, bitmap, cliprect, layer[2], K056832_DRAW_FLAG_MIRROR, 4);
/* this isn't supported anymore and it is unsure if still needed; keeping here for reference
pdrawgfx_shadow_lowpri = 1; fix shadows in front of feet */
m_k053244->sprites_draw(bitmap, cliprect, screen.priority());
m_k056832->tilemap_draw(screen, bitmap, cliprect, 2, K056832_DRAW_FLAG_MIRROR, 0);
return 0;
}
|