Skip to content

Commit 7089e23

Browse files
committed
skeleton/whtm68k: fix RAMDAC colors, hookup category for bg layer
1 parent 8dd49d1 commit 7089e23

File tree

1 file changed

+43
-13
lines changed

1 file changed

+43
-13
lines changed

src/mame/skeleton/whtm68k.cpp

Lines changed: 43 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,10 @@ class whtm68k_state : public driver_device
7272
m_gfxdecode(*this, "gfxdecode"),
7373
m_crtc(*this, "crtc"),
7474
m_ramdac(*this, "ramdac%u", 0U),
75+
m_palette(*this, "palette"),
7576
m_bgram(*this, "bgram"),
76-
m_fgram(*this, "fgram")
77+
m_fgram(*this, "fgram"),
78+
m_bg_attr(*this, "bg_attr")
7779
{ }
7880

7981
void yizhix(machine_config &config) ATTR_COLD;
@@ -87,9 +89,12 @@ class whtm68k_state : public driver_device
8789
required_device<gfxdecode_device> m_gfxdecode;
8890
required_device<hd6845s_device> m_crtc;
8991
required_device_array<ramdac_device, 2> m_ramdac;
92+
required_device<palette_device> m_palette;
9093

9194
required_shared_ptr<uint16_t> m_bgram;
9295
required_shared_ptr<uint16_t> m_fgram;
96+
// TODO: uint8?
97+
required_shared_ptr<uint16_t> m_bg_attr;
9398

9499
tilemap_t *m_bg_tilemap = nullptr;
95100
tilemap_t *m_fg_tilemap = nullptr;
@@ -98,8 +103,11 @@ class whtm68k_state : public driver_device
98103

99104
TILE_GET_INFO_MEMBER(get_bg_tile_info);
100105
TILE_GET_INFO_MEMBER(get_fg_tile_info);
106+
101107
void bgram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
102108
void fgram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
109+
void bg_attr_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
110+
103111
uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
104112

105113
void main_program_map(address_map &map) ATTR_COLD;
@@ -126,30 +134,40 @@ void whtm68k_state::video_start()
126134
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(whtm68k_state::get_bg_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 128, 32);
127135
m_fg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(whtm68k_state::get_fg_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 128, 32);
128136

137+
m_bg_tilemap->set_transparent_pen(0);
129138
m_fg_tilemap->set_transparent_pen(0);
130139
}
131140

132-
// TODO: wrong, just to show something
141+
// TODO: color is unconfirmed, other attr bits
133142
TILE_GET_INFO_MEMBER(whtm68k_state::get_bg_tile_info)
134143
{
135144
uint16_t const tile = m_bgram[tile_index] & 0xfff;
136-
uint16_t const attr = (m_bgram[tile_index] & 0xf000) >> 12;
137-
tileinfo.set(0, tile, attr, 0);
145+
uint16_t const color = (m_bgram[tile_index] & 0xf000) >> 12;
146+
uint16_t const attr = m_bg_attr[tile_index];
147+
148+
tileinfo.category = BIT(attr, 4);
149+
tileinfo.set(0, tile, color, 0);
138150
}
139151

140152
TILE_GET_INFO_MEMBER(whtm68k_state::get_fg_tile_info)
141153
{
142154
uint16_t const tile = ((m_fgram[tile_index] & 0xfff) | 0x1000); // TODO: actually find tile bank
143-
uint16_t const attr = (m_fgram[tile_index] & 0xf000) >> 12;
144-
tileinfo.set(0, tile, attr | 0x10, 0);
155+
uint16_t const color = (m_fgram[tile_index] & 0xf000) >> 12;
156+
// uint16_t const attr = m_fg_attr[tile_index];
157+
158+
// tileinfo.category = BIT(attr, 4);
159+
tileinfo.set(0, tile, color | 0x10, 0);
145160
}
146161

147162
uint32_t whtm68k_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
148163
{
149-
bitmap.fill(rgb_t::black(), cliprect);
164+
// TODO: mixing between the two layers
165+
// register in RAMDACs selecting this?
166+
bitmap.fill(m_palette->pen(0), cliprect);
150167

151-
m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
168+
m_bg_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_CATEGORY(0), 0);
152169
m_fg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
170+
m_bg_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_CATEGORY(1), 0);
153171

154172
return 0;
155173
}
@@ -166,6 +184,11 @@ void whtm68k_state::fgram_w(offs_t offset, uint16_t data, uint16_t mem_mask)
166184
m_fg_tilemap->mark_tile_dirty(offset);
167185
}
168186

187+
void whtm68k_state::bg_attr_w(offs_t offset, uint16_t data, uint16_t mem_mask)
188+
{
189+
COMBINE_DATA(&m_bg_attr[offset]);
190+
m_bg_tilemap->mark_tile_dirty(offset);
191+
}
169192

170193
void whtm68k_state::main_program_map(address_map &map)
171194
{
@@ -184,7 +207,8 @@ void whtm68k_state::main_program_map(address_map &map)
184207
map(0x810401, 0x810401).w("soundlatch", FUNC(generic_latch_8_device::write));
185208
map(0xd00000, 0xd03fff).ram().w(FUNC(whtm68k_state::bgram_w)).share(m_bgram);
186209
map(0xd10000, 0xd13fff).ram().w(FUNC(whtm68k_state::fgram_w)).share(m_fgram);
187-
map(0xd20000, 0xd27fff).ram(); // attribute RAM, for tile banks?
210+
map(0xd20000, 0xd23fff).ram().w(FUNC(whtm68k_state::bg_attr_w)).share(m_bg_attr);
211+
map(0xd24000, 0xd24001).ram(); // unknown, set once during POST with 0x42
188212
map(0xe00000, 0xe03fff).ram(); // work RAM?
189213
map(0xe10000, 0xe10fff).ram().share("nvram");
190214
map(0xe30000, 0xe30001).nopr(); // TODO: read continuously during gameplay
@@ -207,9 +231,15 @@ void whtm68k_state::audio_io_map(address_map &map)
207231
template <uint8_t Which>
208232
void whtm68k_state::ramdac_map(address_map &map)
209233
{
210-
// TODO: format isn't right (fade in/out effects)
211-
// swapping data writes gives better results, still not enough.
212-
map(0x000, 0x2ff).rw(m_ramdac[Which], FUNC(ramdac_device::ramdac_pal_r), FUNC(ramdac_device::ramdac_rgb888_w));
234+
// TODO: unchecked bits 0-1, check writes to RAMDAC[1] at 0xfe-0xff
235+
map(0x000, 0x2ff).lrw8(
236+
NAME([this] (offs_t offset) {
237+
return bitswap<6>(m_ramdac[Which]->ramdac_pal_r(offset), 2, 3, 4, 5, 6, 7);
238+
}),
239+
NAME([this] (offs_t offset, u8 data) {
240+
m_ramdac[Which]->ramdac_rgb666_w(offset, bitswap<6>(data, 2, 3, 4, 5, 6, 7));
241+
})
242+
);
213243
}
214244

215245

@@ -325,7 +355,7 @@ void whtm68k_state::yizhix(machine_config &config)
325355
m_ramdac[1]->set_color_base(0x100);
326356

327357
GFXDECODE(config, "gfxdecode", "palette", gfx_wht);
328-
PALETTE(config, "palette").set_entries(0x200);
358+
PALETTE(config, m_palette).set_entries(0x200);
329359

330360
GENERIC_LATCH_8(config, "soundlatch");
331361

0 commit comments

Comments
 (0)