@@ -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
133142TILE_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
140152TILE_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
147162uint32_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
170193void 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)
207231template <uint8_t Which>
208232void 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