@@ -72,8 +72,10 @@ class whtm68k_state : public driver_device
72
72
m_gfxdecode (*this , " gfxdecode" ),
73
73
m_crtc (*this , " crtc" ),
74
74
m_ramdac (*this , " ramdac%u" , 0U ),
75
+ m_palette (*this , " palette" ),
75
76
m_bgram (*this , " bgram" ),
76
- m_fgram (*this , " fgram" )
77
+ m_fgram (*this , " fgram" ),
78
+ m_bg_attr (*this , " bg_attr" )
77
79
{ }
78
80
79
81
void yizhix (machine_config &config) ATTR_COLD;
@@ -87,9 +89,12 @@ class whtm68k_state : public driver_device
87
89
required_device<gfxdecode_device> m_gfxdecode;
88
90
required_device<hd6845s_device> m_crtc;
89
91
required_device_array<ramdac_device, 2 > m_ramdac;
92
+ required_device<palette_device> m_palette;
90
93
91
94
required_shared_ptr<uint16_t > m_bgram;
92
95
required_shared_ptr<uint16_t > m_fgram;
96
+ // TODO: uint8?
97
+ required_shared_ptr<uint16_t > m_bg_attr;
93
98
94
99
tilemap_t *m_bg_tilemap = nullptr ;
95
100
tilemap_t *m_fg_tilemap = nullptr ;
@@ -98,8 +103,11 @@ class whtm68k_state : public driver_device
98
103
99
104
TILE_GET_INFO_MEMBER (get_bg_tile_info);
100
105
TILE_GET_INFO_MEMBER (get_fg_tile_info);
106
+
101
107
void bgram_w (offs_t offset, uint16_t data, uint16_t mem_mask = ~0 );
102
108
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
+
103
111
uint32_t screen_update (screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
104
112
105
113
void main_program_map (address_map &map) ATTR_COLD;
@@ -126,30 +134,40 @@ void whtm68k_state::video_start()
126
134
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 );
127
135
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 );
128
136
137
+ m_bg_tilemap->set_transparent_pen (0 );
129
138
m_fg_tilemap->set_transparent_pen (0 );
130
139
}
131
140
132
- // TODO: wrong, just to show something
141
+ // TODO: color is unconfirmed, other attr bits
133
142
TILE_GET_INFO_MEMBER (whtm68k_state::get_bg_tile_info)
134
143
{
135
144
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 );
138
150
}
139
151
140
152
TILE_GET_INFO_MEMBER (whtm68k_state::get_fg_tile_info)
141
153
{
142
154
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 );
145
160
}
146
161
147
162
uint32_t whtm68k_state::screen_update (screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
148
163
{
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);
150
167
151
- m_bg_tilemap->draw (screen, bitmap, cliprect, 0 , 0 );
168
+ m_bg_tilemap->draw (screen, bitmap, cliprect, TILEMAP_DRAW_CATEGORY ( 0 ) , 0 );
152
169
m_fg_tilemap->draw (screen, bitmap, cliprect, 0 , 0 );
170
+ m_bg_tilemap->draw (screen, bitmap, cliprect, TILEMAP_DRAW_CATEGORY (1 ), 0 );
153
171
154
172
return 0 ;
155
173
}
@@ -166,6 +184,11 @@ void whtm68k_state::fgram_w(offs_t offset, uint16_t data, uint16_t mem_mask)
166
184
m_fg_tilemap->mark_tile_dirty (offset);
167
185
}
168
186
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
+ }
169
192
170
193
void whtm68k_state::main_program_map (address_map &map)
171
194
{
@@ -184,7 +207,8 @@ void whtm68k_state::main_program_map(address_map &map)
184
207
map (0x810401 , 0x810401 ).w (" soundlatch" , FUNC (generic_latch_8_device::write));
185
208
map (0xd00000 , 0xd03fff ).ram ().w (FUNC (whtm68k_state::bgram_w)).share (m_bgram);
186
209
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
188
212
map (0xe00000 , 0xe03fff ).ram (); // work RAM?
189
213
map (0xe10000 , 0xe10fff ).ram ().share (" nvram" );
190
214
map (0xe30000 , 0xe30001 ).nopr (); // TODO: read continuously during gameplay
@@ -207,9 +231,15 @@ void whtm68k_state::audio_io_map(address_map &map)
207
231
template <uint8_t Which>
208
232
void whtm68k_state::ramdac_map (address_map &map)
209
233
{
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
+ );
213
243
}
214
244
215
245
@@ -325,7 +355,7 @@ void whtm68k_state::yizhix(machine_config &config)
325
355
m_ramdac[1 ]->set_color_base (0x100 );
326
356
327
357
GFXDECODE (config, " gfxdecode" , " palette" , gfx_wht);
328
- PALETTE (config, " palette " ).set_entries (0x200 );
358
+ PALETTE (config, m_palette ).set_entries (0x200 );
329
359
330
360
GENERIC_LATCH_8 (config, " soundlatch" );
331
361
0 commit comments