diff options
author | David Haywood <28625134+DavidHaywood@users.noreply.github.com> | 2020-09-24 02:19:27 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-09-23 21:19:27 -0400 |
commit | df19e87ffc98b1db3fe936cf83b022c9ad9a931f (patch) | |
tree | fdb6f3e24b167b86b17882af115dbf0053e57e48 /src/devices/video | |
parent | a15e7a29c43096d902bcbc5234e9356a8c43c097 (diff) |
machines promoted to WORKING (Plug and Play) (#7282)
machines promoted to WORKING
-----
Golden Nugget Casino [David Haywood, Sean Riddle]
Sudoku Plug & Play TV Game '6 Intelligent Games' [David Haywood, Sean Riddle]
Frogger (MSI Plug & Play, white joystick) [David Haywood, Sean Riddle]
35 in 1 Super Twins [David Haywood, Sean Riddle]
Vs. Maxx 17-in-1 [David Haywood, Sean Riddle]
made use of the code that was already partially present in the NES PPU code to handle emphasis modes, used to highlight tally bars etc. in 'nes rampart', apply a red tint to 'fds bublbobl' and dim the screen in a number of other games.
fixed a number of issues with VT palette modes that was causing black screens in many games, allowing them to be promoted
added a timing kludge for interrupts in the NES Frogger titles, until timings are better overall,makes playfield stable here and in a number of other places so that other things can be improved
note "Vs. Maxx 17-in-1" was added as NOT WORKING in this same cycle so if this gets merged before freeze they'll need to be moved to the 'new working' section.
This is a checkpoint, further code improvements and refactors will come later.
Diffstat (limited to 'src/devices/video')
-rw-r--r-- | src/devices/video/ppu2c0x.cpp | 293 | ||||
-rw-r--r-- | src/devices/video/ppu2c0x.h | 25 | ||||
-rw-r--r-- | src/devices/video/ppu2c0x_sh6578.cpp | 25 | ||||
-rw-r--r-- | src/devices/video/ppu2c0x_sh6578.h | 2 | ||||
-rw-r--r-- | src/devices/video/ppu2c0x_vt.cpp | 355 | ||||
-rw-r--r-- | src/devices/video/ppu2c0x_vt.h | 19 |
6 files changed, 375 insertions, 344 deletions
diff --git a/src/devices/video/ppu2c0x.cpp b/src/devices/video/ppu2c0x.cpp index bad650cf0a6..c92af287081 100644 --- a/src/devices/video/ppu2c0x.cpp +++ b/src/devices/video/ppu2c0x.cpp @@ -30,37 +30,6 @@ #include "screen.h" - -/*************************************************************************** - CONSTANTS -***************************************************************************/ - -/* default monochromatic colortable */ -static const pen_t default_colortable_mono[] = -{ - 0,1,2,3, - 0,1,2,3, - 0,1,2,3, - 0,1,2,3, - 0,1,2,3, - 0,1,2,3, - 0,1,2,3, - 0,1,2,3, -}; - -/* default colortable */ -static const pen_t default_colortable[] = -{ - 0,1,2,3, - 0,5,6,7, - 0,9,10,11, - 0,13,14,15, - 0,17,18,19, - 0,21,22,23, - 0,25,26,27, - 0,29,30,31, -}; - //************************************************************************** // GLOBAL VARIABLES //************************************************************************** @@ -119,7 +88,6 @@ ppu2c0x_device::ppu2c0x_device(const machine_config& mconfig, device_type type, device_t(mconfig, type, tag, owner, clock), device_memory_interface(mconfig, *this), device_video_interface(mconfig, *this), - device_palette_interface(mconfig, *this), m_space_config("videoram", ENDIANNESS_LITTLE, 8, 17, 0, internal_map), m_cpu(*this, finder_base::DUMMY_TAG), m_scanline(0), // reset the scanline count @@ -234,7 +202,7 @@ ppu2c05_04_device::ppu2c05_04_device(const machine_config& mconfig, const char* // device_start - device-specific startup //------------------------------------------------- -void ppu2c0x_device::device_start() +void ppu2c0x_device::start_nopalram() { // bind our handler m_int_callback.resolve_safe(); @@ -252,25 +220,8 @@ void ppu2c0x_device::device_start() /* allocate a screen bitmap, videomem and spriteram, a dirtychar array and the monochromatic colortable */ m_bitmap = std::make_unique<bitmap_rgb32>(VISIBLE_SCREEN_WIDTH, VISIBLE_SCREEN_HEIGHT); m_spriteram = make_unique_clear<uint8_t[]>(SPRITERAM_SIZE); - m_colortable = std::make_unique<pen_t[]>(ARRAY_LENGTH(default_colortable)); - m_colortable_mono = std::make_unique<pen_t[]>(ARRAY_LENGTH(default_colortable_mono)); - - m_palette_ram.resize(0x20); - for (int i = 0; i < 0x20; i++) - m_palette_ram[i] = 0x00; - - /* initialize the color tables */ - for (int i = 0; i < ARRAY_LENGTH(default_colortable_mono); i++) - { - /* monochromatic table */ - m_colortable_mono[i] = default_colortable_mono[i]; - - /* color table */ - m_colortable[i] = default_colortable[i]; - } - - init_palette(); + init_palette_tables(); // register for state saving save_item(NAME(m_scanline)); @@ -289,15 +240,25 @@ void ppu2c0x_device::device_start() save_item(NAME(m_scanlines_per_frame)); save_item(NAME(m_vblank_first_scanline)); save_item(NAME(m_regs)); - save_item(NAME(m_palette_ram)); save_item(NAME(m_draw_phase)); save_item(NAME(m_tilecount)); save_pointer(NAME(m_spriteram), SPRITERAM_SIZE); - save_pointer(NAME(m_colortable), ARRAY_LENGTH(default_colortable)); - save_pointer(NAME(m_colortable_mono), ARRAY_LENGTH(default_colortable_mono)); + save_item(NAME(*m_bitmap)); } +void ppu2c0x_device::device_start() +{ + start_nopalram(); + + m_palette_ram.resize(0x20); + + for (int i = 0; i < 0x20; i++) + m_palette_ram[i] = 0x00; + + save_item(NAME(m_palette_ram)); +} + //************************************************************************** // INLINE HELPERS //************************************************************************** @@ -332,12 +293,49 @@ inline void ppu2c0x_device::writebyte(offs_t address, uint8_t data) * *************************************/ -void ppu2c0x_device::init_palette() +void ppu2c0x_device::apply_color_emphasis_and_clamp(bool is_pal_or_dendy, int color_emphasis, double& R, double& G, double& B) { - init_palette(false); + if (is_pal_or_dendy) // PAL machines swap the colour emphasis bits, this means the red/blue highlighting on rampart tally bar doesn't look as good + { + color_emphasis = bitswap<3>(color_emphasis, 2, 0, 1); + } + + double r_mod = 0.0; + double g_mod = 0.0; + double b_mod = 0.0; + + switch (color_emphasis) + { + case 0: r_mod = 1.0; g_mod = 1.0; b_mod = 1.0; break; + case 1: r_mod = 1.24; g_mod = .915; b_mod = .743; break; + case 2: r_mod = .794; g_mod = 1.09; b_mod = .882; break; + case 3: r_mod = .905; g_mod = 1.03; b_mod = 1.28; break; + case 4: r_mod = .741; g_mod = .987; b_mod = 1.0; break; + case 5: r_mod = 1.02; g_mod = .908; b_mod = .979; break; + case 6: r_mod = 1.02; g_mod = .98; b_mod = .653; break; + case 7: r_mod = .75; g_mod = .75; b_mod = .75; break; + } + + R = R * r_mod; + G = G * g_mod; + B = B * b_mod; + + /* Clipping, in case of saturation */ + if (R < 0) + R = 0; + if (R > 255) + R = 255; + if (G < 0) + G = 0; + if (G > 255) + G = 255; + if (B < 0) + B = 0; + if (B > 255) + B = 255; } -rgb_t ppu2c0x_device::nespal_to_RGB(int color_intensity, int color_num) +rgb_t ppu2c0x_device::nespal_to_RGB(int color_intensity, int color_num, int color_emphasis, bool is_pal_or_dendy) { const double tint = 0.22; /* adjust to taste */ const double hue = 287.0; @@ -390,25 +388,15 @@ rgb_t ppu2c0x_device::nespal_to_RGB(int color_intensity, int color_num) double G = (y - (Kb * Ku * u + Kr * Kv * v) / (1 - Kb - Kr)) * 255.0; double B = (y + Ku * u) * 255.0; - /* Clipping, in case of saturation */ - if (R < 0) - R = 0; - if (R > 255) - R = 255; - if (G < 0) - G = 0; - if (G > 255) - G = 255; - if (B < 0) - B = 0; - if (B > 255) - B = 255; + apply_color_emphasis_and_clamp(is_pal_or_dendy, color_emphasis, R, G, B); return rgb_t(floor(R + .5), floor(G + .5), floor(B + .5)); } -void ppu2c0x_device::init_palette(bool indirect) +void ppu2c0x_device::init_palette_tables() { + bool is_pal = m_scanlines_per_frame != NTSC_SCANLINES_PER_FRAME; + /* This routine builds a palette using a transformation from */ /* the YUV (Y, B-Y, R-Y) to the RGB color space */ @@ -421,45 +409,23 @@ void ppu2c0x_device::init_palette(bool indirect) /* Loop through the emphasis modes (8 total) */ for (int color_emphasis = 0; color_emphasis < 8; color_emphasis++) { - /* - double r_mod = 0.0; - double g_mod = 0.0; - double b_mod = 0.0; - - switch (color_emphasis) - { - case 0: r_mod = 1.0; g_mod = 1.0; b_mod = 1.0; break; - case 1: r_mod = 1.24; g_mod = .915; b_mod = .743; break; - case 2: r_mod = .794; g_mod = 1.09; b_mod = .882; break; - case 3: r_mod = .905; g_mod = 1.03; b_mod = 1.28; break; - case 4: r_mod = .741; g_mod = .987; b_mod = 1.0; break; - case 5: r_mod = 1.02; g_mod = .908; b_mod = .979; break; - case 6: r_mod = 1.02; g_mod = .98; b_mod = .653; break; - case 7: r_mod = .75; g_mod = .75; b_mod = .75; break; - } - */ - /* loop through the 4 intensities */ for (int color_intensity = 0; color_intensity < 4; color_intensity++) { /* loop through the 16 colors */ for (int color_num = 0; color_num < 16; color_num++) { - rgb_t col = nespal_to_RGB(color_intensity, color_num); + rgb_t col = nespal_to_RGB(color_intensity, color_num, color_emphasis, is_pal); - /* Round, and set the value */ - if (indirect) - set_indirect_color(entry++, col); - else - set_pen_color(entry++, col); + m_nespens[entry] = (uint32_t)col; + entry++; + } } } - - /* color tables are modified at run-time, and are initialized on 'ppu2c0x_reset' */ } -void ppu2c0x_rgb_device::init_palette() +void ppu2c0x_rgb_device::init_palette_tables() { /* Loop through the emphasis modes (8 total) */ int entry = 0; @@ -471,27 +437,14 @@ void ppu2c0x_rgb_device::init_palette() int G = ((color_emphasis & 2) ? 7 : m_palette_data[color_num * 3 + 1]); int B = ((color_emphasis & 4) ? 7 : m_palette_data[color_num * 3 + 2]); - set_pen_color(entry++, pal3bit(R), pal3bit(G), pal3bit(B)); + m_nespens[entry] = (pal3bit(R)<<16) | (pal3bit(G)<<8) | pal3bit(B); + + //set_pen_color(entry++, pal3bit(R), pal3bit(G), pal3bit(B)); + entry++; } } - - /* color tables are modified at run-time, and are initialized on 'ppu2c0x_reset' */ } -#if 0 -/* the charlayout we use for the chargen */ -static const gfx_layout ppu_charlayout = -{ - 8, 8, /* 8*8 characters */ - 0, - 2, /* 2 bits per pixel */ - { 8*8, 0 }, /* the two bitplanes are separated */ - { 0, 1, 2, 3, 4, 5, 6, 7 }, - { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 }, - 16*8 /* every char takes 16 consecutive bytes */ -}; -#endif - /************************************* * * PPU Initialization and Disposal @@ -609,24 +562,34 @@ void ppu2c0x_device::shift_tile_plane_data(uint8_t& pix) m_planebuf[1] = m_planebuf[1] << 1; } -void ppu2c0x_device::draw_tile_pixel(uint8_t pix, int color, pen_t back_pen, uint32_t*& dest, const pen_t* color_table) +void ppu2c0x_device::draw_tile_pixel(uint8_t pix, int color, uint32_t back_pen, uint32_t*& dest) { - pen_t pen; + uint32_t usepen; if (pix) { - const pen_t* paldata = &color_table[4 * color]; - pen = this->pen(paldata[pix]); + uint8_t pen = ((4 * color) + pix) & 0x1f; + uint16_t palval = m_palette_ram[pen]; + + if (m_regs[PPU_CONTROL1] & PPU_CONTROL1_DISPLAY_MONO) + palval &= 0x30; + + // apply colour emphasis + palval |= ((m_regs[PPU_CONTROL1] & PPU_CONTROL1_COLOR_EMPHASIS) << 1); + + usepen = m_nespens[palval]; } else { - pen = back_pen; + usepen = m_nespens[back_pen]; } - *dest = pen; + + + *dest = usepen; } -void ppu2c0x_device::draw_tile(uint8_t* line_priority, int color_byte, int color_bits, int address, int start_x, pen_t back_pen, uint32_t*& dest, const pen_t* color_table) +void ppu2c0x_device::draw_tile(uint8_t* line_priority, int color_byte, int color_bits, int address, int start_x, uint32_t back_pen, uint32_t*& dest) { int color = (((color_byte >> color_bits) & 0x03)); @@ -640,7 +603,7 @@ void ppu2c0x_device::draw_tile(uint8_t* line_priority, int color_byte, int color if ((start_x + i) >= 0 && (start_x + i) < VISIBLE_SCREEN_WIDTH) { - draw_tile_pixel(pix, color, back_pen, dest, color_table); + draw_tile_pixel(pix, color, back_pen, dest); // priority marking if (pix) @@ -659,23 +622,10 @@ void ppu2c0x_device::draw_background(uint8_t* line_priority) { bitmap_rgb32& bitmap = *m_bitmap; - uint8_t color_mask; - const pen_t* color_table; - - /* setup the color mask and colortable to use */ - if (m_regs[PPU_CONTROL1] & PPU_CONTROL1_DISPLAY_MONO) - { - color_mask = 0xf0; - color_table = m_colortable_mono.get(); - } - else - { - color_mask = 0xff; - color_table = m_colortable.get(); - } + uint16_t palval = m_back_color; /* cache the background pen */ - pen_t back_pen = pen(m_back_color & color_mask); + uint32_t back_pen = palval; /* determine where in the nametable to start drawing from */ /* based on the current scanline and scroll regs */ @@ -730,7 +680,7 @@ void ppu2c0x_device::draw_background(uint8_t* line_priority) // plus something that accounts for y address += scroll_y_fine; - draw_tile(line_priority, color_byte, color_bits, address, start_x, back_pen, dest, color_table); + draw_tile(line_priority, color_byte, color_bits, address, start_x, back_pen, dest); start_x += 8; @@ -751,25 +701,33 @@ void ppu2c0x_device::draw_background(uint8_t* line_priority) dest = &bitmap.pix32(m_scanline); for (int i = 0; i < 8; i++) { - *(dest++) = back_pen; + draw_back_pen(dest, back_pen); + dest++; + line_priority[i] ^= 0x02; } } } +void ppu2c0x_device::draw_back_pen(uint32_t* dst, int back_pen) +{ + *dst = m_nespens[back_pen]; +} + void ppu2c0x_device::draw_background_pen() { bitmap_rgb32& bitmap = *m_bitmap; /* setup the color mask and colortable to use */ - uint8_t color_mask = (m_regs[PPU_CONTROL1] & PPU_CONTROL1_DISPLAY_MONO) ? 0xf0 : 0xff; + uint8_t color_mask = (m_regs[PPU_CONTROL1] & PPU_CONTROL1_DISPLAY_MONO) ? 0x30 : 0x3f; + uint16_t palval = m_back_color & color_mask; /* cache the background pen */ - pen_t back_pen = pen(m_back_color & color_mask); + uint32_t back_pen = palval; // Fill this scanline with the background pen. for (int i = 0; i < bitmap.width(); i++) - bitmap.pix32(m_scanline, i) = back_pen; + draw_back_pen(&bitmap.pix32(m_scanline, i), back_pen); } void ppu2c0x_device::read_sprite_plane_data(int address) @@ -796,8 +754,16 @@ void ppu2c0x_device::make_sprite_pixel_data(uint8_t& pixel_data, int flipx) void ppu2c0x_device::draw_sprite_pixel(int sprite_xpos, int color, int pixel, uint8_t pixel_data, bitmap_rgb32& bitmap) { - const pen_t* paldata = &m_colortable[4 * color]; - bitmap.pix32(m_scanline, sprite_xpos + pixel) = pen(paldata[pixel_data]); + uint16_t palval = m_palette_ram[((4 * color) | pixel_data) & 0x1f]; + + if (m_regs[PPU_CONTROL1] & PPU_CONTROL1_DISPLAY_MONO) + palval &= 0x30; + + // apply colour emphasis + palval |= ((m_regs[PPU_CONTROL1] & PPU_CONTROL1_COLOR_EMPHASIS) << 1); + + uint32_t pix = m_nespens[palval]; + bitmap.pix32(m_scanline, sprite_xpos + pixel) = pix; } void ppu2c0x_device::read_extra_sprite_bits(int sprite_index) @@ -1074,12 +1040,14 @@ void ppu2c0x_device::update_visible_enabled_scanline() void ppu2c0x_device::update_visible_disabled_scanline() { bitmap_rgb32& bitmap = *m_bitmap; - pen_t back_pen; + uint32_t back_pen; /* setup the color mask and colortable to use */ - uint8_t color_mask = (m_regs[PPU_CONTROL1] & PPU_CONTROL1_DISPLAY_MONO) ? 0xf0 : 0xff; + uint8_t color_mask = (m_regs[PPU_CONTROL1] & PPU_CONTROL1_DISPLAY_MONO) ? 0x30 : 0x3f; + + uint16_t palval = m_back_color & color_mask; - back_pen = pen(m_back_color & color_mask); + back_pen = palval; if (m_paletteram_in_ppuspace) { @@ -1092,13 +1060,13 @@ void ppu2c0x_device::update_visible_disabled_scanline() // pen. Micro Machines makes use of this feature. int pen_num = m_palette_ram[(m_videomem_addr & 0x03) ? (m_videomem_addr & 0x1f) : 0]; - back_pen = pen(pen_num); + back_pen = pen_num; } } // Fill this scanline with the background pen. for (int i = 0; i < bitmap.width(); i++) - bitmap.pix32(m_scanline, i) = back_pen; + draw_back_pen(&bitmap.pix32(m_scanline, i), back_pen); } void ppu2c0x_device::update_visible_scanline() @@ -1135,29 +1103,20 @@ void ppu2c0x_device::update_scanline() void ppu2c0x_device::palette_write(offs_t offset, uint8_t data) { - int color_emphasis = (m_regs[PPU_CONTROL1] & PPU_CONTROL1_COLOR_EMPHASIS) * 2; - // palette RAM is only 6 bits wide data &= 0x3f; - // transparent pens are mirrored! if (offset & 0x3) { + // regular pens, no mirroring m_palette_ram[offset & 0x1f] = data; - m_colortable[offset & 0x1f] = data + color_emphasis; - m_colortable_mono[offset & 0x1f] = (data & 0xf0) + color_emphasis; } else { - int i; + // transparent pens are mirrored! if (0 == (offset & 0xf)) { m_back_color = data; - for (i = 0; i < 32; i += 4) - { - m_colortable[i] = data + color_emphasis; - m_colortable_mono[i] = (data & 0xf0) + color_emphasis; - } } m_palette_ram[offset & 0xf] = m_palette_ram[(offset & 0xf) + 0x10] = data; } @@ -1279,18 +1238,6 @@ void ppu2c0x_device::write(offs_t offset, uint8_t data) break; case PPU_CONTROL1: /* 1 */ - /* if color intensity has changed, change all the color tables to reflect them */ - if ((data & PPU_CONTROL1_COLOR_EMPHASIS) != (m_regs[PPU_CONTROL1] & PPU_CONTROL1_COLOR_EMPHASIS)) - { - int i; - for (i = 0; i <= 0x1f; i++) - { - uint8_t oldColor = m_palette_ram[i]; - - m_colortable[i] = oldColor + (data & PPU_CONTROL1_COLOR_EMPHASIS) * 2; - } - } - //logerror("control1 write: %02x (scanline: %d)\n", data, m_scanline); m_regs[PPU_CONTROL1] = data; break; diff --git a/src/devices/video/ppu2c0x.h b/src/devices/video/ppu2c0x.h index fcd53435809..9d8fa0f5351 100644 --- a/src/devices/video/ppu2c0x.h +++ b/src/devices/video/ppu2c0x.h @@ -42,8 +42,7 @@ class ppu2c0x_device : public device_t, public device_memory_interface, - public device_video_interface, - public device_palette_interface + public device_video_interface { public: typedef device_delegate<void (int scanline, int vblank, int blanked)> scanline_delegate; @@ -76,16 +75,16 @@ public: auto int_callback() { return m_int_callback.bind(); } /* routines */ - rgb_t nespal_to_RGB(int color_intensity, int color_num); - virtual void init_palette(); - void init_palette(bool indirect); - virtual uint32_t palette_entries() const override { return 4*16*8; } + void apply_color_emphasis_and_clamp(bool is_pal_or_dendy, int color_emphasis, double& R, double& G, double& B); + rgb_t nespal_to_RGB(int color_intensity, int color_num, int color_emphasis, bool is_pal_or_dendy); + virtual void init_palette_tables(); virtual void read_tile_plane_data(int address, int color); virtual void shift_tile_plane_data(uint8_t &pix); - virtual void draw_tile_pixel(uint8_t pix, int color, pen_t back_pen, uint32_t *&dest, const pen_t *color_table); - virtual void draw_tile(uint8_t *line_priority, int color_byte, int color_bits, int address, int start_x, pen_t back_pen, uint32_t *&dest, const pen_t *color_table); + virtual void draw_tile_pixel(uint8_t pix, int color, uint32_t back_pen, uint32_t *&dest); + virtual void draw_tile(uint8_t *line_priority, int color_byte, int color_bits, int address, int start_x, uint32_t back_pen, uint32_t *&dest); virtual void draw_background( uint8_t *line_priority ); + virtual void draw_back_pen(uint32_t* dst, int back_pen); void draw_background_pen(); virtual void read_sprite_plane_data(int address); @@ -131,6 +130,8 @@ public: void set_vram_dest(uint16_t dest); void ppu2c0x(address_map &map); + + bool in_vblanking() { return (m_scanline >= m_vblank_first_scanline - 1); } protected: ppu2c0x_device(const machine_config& mconfig, device_type type, const char* tag, device_t* owner, uint32_t clock, address_map_constructor internal_map); @@ -184,6 +185,8 @@ protected: required_device<cpu_device> m_cpu; + void start_nopalram(); + int m_scanlines_per_frame; /* number of scanlines per frame */ int m_security_value; /* 2C05 protection */ int m_vblank_first_scanline; /* the very first scanline where VBLANK occurs */ @@ -205,12 +208,12 @@ protected: int m_refresh_data; /* refresh-related */ int m_x_fine; /* refresh-related */ int m_tilecount; /* MMC5 can change attributes to subsets of the 34 visible tiles */ - std::unique_ptr<pen_t[]> m_colortable; /* color table modified at run time */ - std::unique_ptr<pen_t[]> m_colortable_mono; /* monochromatic color table modified at run time */ latch_delegate m_latch; uint8_t readbyte(offs_t address); + + uint32_t m_nespens[0x40*8]; private: static constexpr device_timer_id TIMER_HBLANK = 0; static constexpr device_timer_id TIMER_NMI = 1; @@ -246,7 +249,7 @@ class ppu2c0x_rgb_device : public ppu2c0x_device { protected: ppu2c0x_rgb_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock = 0); - virtual void init_palette() override; + virtual void init_palette_tables() override; private: required_region_ptr<uint8_t> m_palette_data; diff --git a/src/devices/video/ppu2c0x_sh6578.cpp b/src/devices/video/ppu2c0x_sh6578.cpp index c74fa5e54fb..8187856bc34 100644 --- a/src/devices/video/ppu2c0x_sh6578.cpp +++ b/src/devices/video/ppu2c0x_sh6578.cpp @@ -51,12 +51,14 @@ void ppu_sh6578_device::ppu_internal_map(address_map& map) void ppu_sh6578_device::device_start() { - ppu2c0x_device::device_start(); + start_nopalram(); m_palette_ram.resize(0x40); for (int i = 0; i < 0x40; i++) m_palette_ram[i] = 0x00; + + save_item(NAME(m_palette_ram)); } void ppu_sh6578_device::device_reset() @@ -89,7 +91,7 @@ void ppu_sh6578_device::scanline_increment_fine_ycounter() void ppu_sh6578_device::draw_sprite_pixel(int sprite_xpos, int color, int pixel, uint8_t pixel_data, bitmap_rgb32& bitmap) { uint8_t palval = m_palette_ram[(pixel_data | color << 2)] & 0x3f; - bitmap.pix32(m_scanline, sprite_xpos + pixel) = this->pen(palval); + bitmap.pix32(m_scanline, sprite_xpos + pixel) = m_nespens[palval]; } void ppu_sh6578_device::read_tile_plane_data(int address, int color) @@ -101,7 +103,7 @@ void ppu_sh6578_device::read_tile_plane_data(int address, int color) m_extplanebuf[1] = readbyte(address + 24); } -void ppu_sh6578_device::draw_tile(uint8_t* line_priority, int color_byte, int color_bits, int address, int start_x, pen_t back_pen, uint32_t*& dest, const pen_t* color_table) +void ppu_sh6578_device::draw_tile(uint8_t* line_priority, int color_byte, int color_bits, int address, int start_x, uint32_t back_pen, uint32_t*& dest) { int color = color_byte; @@ -136,12 +138,12 @@ void ppu_sh6578_device::draw_tile(uint8_t* line_priority, int color_byte, int co if (!trans) { - pen = this->pen(palval); + pen = m_nespens[palval]; } else { uint8_t palval = m_palette_ram[0x0] & 0x3f; - pen = this->pen(palval); + pen = m_nespens[palval]; } *dest = pen; @@ -158,23 +160,24 @@ void ppu_sh6578_device::draw_background(uint8_t* line_priority) { bitmap_rgb32& bitmap = *m_bitmap; - uint8_t color_mask; - const pen_t* color_table; + uint8_t color_mask = 0xff; + //const pen_t* color_table; /* setup the color mask and colortable to use */ + + //TODO FIX if (m_regs[PPU_CONTROL1] & PPU_CONTROL1_DISPLAY_MONO) { color_mask = 0xf0; - color_table = m_colortable_mono.get(); } else { color_mask = 0xff; - color_table = m_colortable.get(); } + /* cache the background pen */ - pen_t back_pen = pen(m_back_color & color_mask); + pen_t back_pen = m_nespens[m_back_color & color_mask]; /* determine where in the nametable to start drawing from */ /* based on the current scanline and scroll regs */ @@ -225,7 +228,7 @@ void ppu_sh6578_device::draw_background(uint8_t* line_priority) // plus something that accounts for y address += scroll_y_fine; - draw_tile(line_priority, (color_byte >> 4) & 0xf, 0, address, start_x, back_pen, dest, color_table); + draw_tile(line_priority, (color_byte >> 4) & 0xf, 0, address, start_x, back_pen, dest); start_x += 8; diff --git a/src/devices/video/ppu2c0x_sh6578.h b/src/devices/video/ppu2c0x_sh6578.h index 9671bf00dfb..34448ac9dfa 100644 --- a/src/devices/video/ppu2c0x_sh6578.h +++ b/src/devices/video/ppu2c0x_sh6578.h @@ -33,7 +33,7 @@ private: void scanline_increment_fine_ycounter() override; void read_tile_plane_data(int address, int color) override; - void draw_tile(uint8_t* line_priority, int color_byte, int color_bits, int address, int start_x, pen_t back_pen, uint32_t*& dest, const pen_t* color_table) override; + void draw_tile(uint8_t* line_priority, int color_byte, int color_bits, int address, int start_x, uint32_t back_pen, uint32_t*& dest) override; virtual void draw_sprite_pixel(int sprite_xpos, int color, int pixel, uint8_t pixel_data, bitmap_rgb32& bitmap) override; //virtual void draw_sprites(uint8_t* line_priority) override; diff --git a/src/devices/video/ppu2c0x_vt.cpp b/src/devices/video/ppu2c0x_vt.cpp index 04da1b8740b..5f160a98ff1 100644 --- a/src/devices/video/ppu2c0x_vt.cpp +++ b/src/devices/video/ppu2c0x_vt.cpp @@ -47,14 +47,10 @@ ppu_vt03pal_device::ppu_vt03pal_device(const machine_config& mconfig, const char uint8_t ppu_vt03_device::palette_read(offs_t offset) { - if (m_201x_regs[0] & 0x80) - { - return m_newpal[offset]; - } - else - { + if (offset < 0x20) return ppu2c0x_device::palette_read(offset); - } + else + return m_palette_ram[offset]; } void ppu_vt03_device::set_201x_descramble(uint8_t reg0, uint8_t reg1, uint8_t reg2, uint8_t reg3, uint8_t reg4, uint8_t reg5) @@ -67,110 +63,17 @@ void ppu_vt03_device::set_201x_descramble(uint8_t reg0, uint8_t reg1, uint8_t re m_2012_2017_descramble[5] = reg5; } -void ppu_vt03_device::set_new_pen(int i) -{ - if ((i < 0x20) && ((i & 0x3) == 0)) - { - set_pen_color(i & 0x7f, rgb_t(0, 0, 0)); - } - else - { - if (m_pal_mode == PAL_MODE_NEW_RGB) - { - uint16_t rgbval = (m_newpal[i & 0x7f] & 0xff) | ((m_newpal[(i & 0x7f) + 0x80] & 0xff) << 8); - uint8_t blue = (rgbval & 0x001f) << 3; - uint8_t green = (rgbval & 0x3e0) >> 2; - uint8_t red = (rgbval & 0x7C00) >> 7; - set_pen_color(i & 0x7f, rgb_t(red, green, blue)); - } - else if (m_pal_mode == PAL_MODE_NEW_RGB12) - { - uint16_t rgbval = (m_newpal[i & 0x7f] & 0x3f) | ((m_newpal[(i & 0x7f) + 0x80] & 0x3f) << 6); - uint8_t red = (rgbval & 0x000f) << 4; - uint8_t green = (rgbval & 0x0f0); - uint8_t blue = (rgbval & 0xf00) >> 4; - set_pen_color(i & 0x7f, rgb_t(red, green, blue)); - } - else - { - // Credit to NewRisingSun - uint16_t palval = (m_newpal[i & 0x7f] & 0x3f) | ((m_newpal[(i & 0x7f) + 0x80] & 0x3f) << 6); - int nPhase = (palval >> 0) & 0xF; - int nLuma = (palval >> 4) & 0xF; - int nChroma = (palval >> 8) & 0xF; - float phaseOffset = -11.0; - //bool inverted = false; - if ((nLuma < (nChroma + 1) >> 1 || nLuma > 15 - (nChroma >> 1)) && (m_pal_mode != PAL_MODE_NEW_VG)) - { - //inverted = true; - // Strange color number wrap-around. Is this for protection reasons, or a bug of the original hardware? - // The VT03 data sheet advises programmers that 4 <= nLuma*2 +nChroma <= 0x1F, which does not correspond exactly to this condition. - static const unsigned char altPhases[16] = { 13, 7, 8, 9, 10, 11, 12, 1, 2, 3, 4, 5, 6, 0, 14, 15 }; - static const float altPhaseOffset[16] = { -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, 0, -5, -5, -5 }; // Slight tweak in phase 6 for Z-Dog - phaseOffset += altPhaseOffset[nPhase]; // These "alternative" colors seem to be slightly shifted in addition to being wrapped-around, at least in EmuVT. - nPhase = altPhases[nPhase]; - nChroma = 16 - nChroma; - nLuma = (nLuma - 8) & 0xF; - } - - float fLuma = (nLuma - 4) / 9.625; // Value determined from matching saturation =0 phases 1-12 - float fChroma = nChroma / 18.975; // Value determined from matching phases 0 and 13 across all luminance and saturation levels - float fPhase = ((nPhase - 2) * 30.0 + phaseOffset) * M_PI / 180.0; - if (m_pal_mode == PAL_MODE_NEW_VG) - { - if (fPhase > 0 && fPhase < 13) - { - fLuma /= 1.5; - fChroma /= 2; - } - } - - float Y = fLuma; - float C = fChroma; - if (nPhase == 0 || nPhase > 12) C = 0.0;// Phases 0 and 13-15 are grays - if (nPhase == 0) Y += fChroma; // Phase 0 is the upper bound of the waveform - if (nPhase == 13) Y -= fChroma; // Phase 13 is the lower bound of the waveform - if (nPhase >= 14) Y = 0.0; // Phases 14 and 15 always black - - float V = sin(fPhase) * C * 1.05; // 1.05 needed to get closer to EmuVT palette's color levels in phases 1-12 - float U = cos(fPhase) * C * 1.05; - float R = Y + 1.1400 * V + 0.0000 * U; - float G = Y - 0.5807 * V - 0.3940 * U; - float B = Y - 0.0000 * V + 2.0290 * U; - if (R < 0.0) R = 0.0; - if (R > 1.0) R = 1.0; - if (G < 0.0) G = 0.0; - if (G > 1.0) G = 1.0; - if (B < 0.0) B = 0.0; - if (B > 1.0) B = 1.0; - int RV = R * 255.0; - int GV = G * 255.0; - int BV = B * 255.0; - - set_pen_color(i & 0x7f, rgb_t(RV, GV, BV)); - } - } - - -} void ppu_vt03_device::palette_write(offs_t offset, uint8_t data) { - //logerror("pal write %d %02x\n", offset, data); - // why is the check pal_mask = (m_pal_mode == PAL_MODE_NEW_VG) ? 0x08 : 0x80 in set_2010_reg and 0x04 : 0x80 here? - uint8_t pal_mask = (m_pal_mode == PAL_MODE_NEW_VG) ? 0x04 : 0x80; - - if (m_201x_regs[0] & pal_mask) + if (offset < 0x20) { - m_newpal[offset & 0xff] = data; - set_new_pen(offset); + ppu2c0x_device::palette_write(offset, data); } else { - //if(m_pal_mode == PAL_MODE_NEW_VG) // ddrdismx writes the palette before setting the register but doesn't use 'PAL_MODE_NEW_VG', Konami logo is missing if you don't allow writes to be stored for when we switch - m_newpal[offset & 0xff] = data; - ppu2c0x_device::palette_write(offset, data); + m_palette_ram[offset] = data; } } @@ -235,20 +138,131 @@ uint8_t ppu_vt03_device::read_extended(offs_t offset) } -void ppu_vt03_device::init_palette() + +void ppu_vt03_device::init_vtxx_rgb555_palette_tables() { - // todo, work out the format of the 12 palette bits instead of just calling the main init - ppu2c0x_device::init_palette(true); + int entry = 0; + for (int emp = 0; emp < 8; emp++) + { + for (int palval = 0; palval < 0x8000; palval++) + { + // uint16_t rgbval = (m_palette_ram[i & 0x7f] & 0xff) | ((m_palette_ram[(i & 0x7f) + 0x80] & 0xff) << 8); + uint8_t blue = (palval & 0x001f) << 3; + uint8_t green = (palval & 0x3e0) >> 2; + uint8_t red = (palval & 0x7C00) >> 7; + + // TODO: apply emphasis values if they work in this mode + m_vtpens_rgb555[entry] = rgb_t(red, green, blue); + entry++; + } + } +} + +void ppu_vt03_device::init_vtxx_rgb444_palette_tables() +{ + int entry = 0; + for (int emp = 0; emp < 8; emp++) + { + for (int palval = 0; palval < 0x1000; palval++) + { + //uint16_t rgbval = (m_palette_ram[i & 0x7f] & 0x3f) | ((m_palette_ram[(i & 0x7f) + 0x80] & 0x3f) << 6); + uint8_t red = (palval & 0x000f) << 4; + uint8_t green = (palval & 0x0f0); + uint8_t blue = (palval & 0xf00) >> 4; + + // TODO: apply emphasis values if they work in this mode + m_vtpens_rgb444[entry] = rgb_t(red, green, blue); + entry++; + } + } +} +// what cases are palmode 1 anyway? +void ppu_vt03_device::init_vt03_palette_tables(int palmode) +{ + // the 12-bit VT HSV format, Credit to NewRisingSun + int entry = 0; + for (int color_emphasis = 0; color_emphasis < 8; color_emphasis++) + { + for (int palval = 0; palval < 0x1000; palval++) + { + int nPhase = (palval >> 0) & 0xF; + int nLuma = (palval >> 4) & 0xF; + int nChroma = (palval >> 8) & 0xF; + float phaseOffset = -11.0; + //bool inverted = false; + if ((nLuma < (nChroma + 1) >> 1 || nLuma > 15 - (nChroma >> 1)) && (palmode != 1)) + { + //inverted = true; + // Strange color number wrap-around. Is this for protection reasons, or a bug of the original hardware? + // The VT03 data sheet advises programmers that 4 <= nLuma*2 +nChroma <= 0x1F, which does not correspond exactly to this condition. + static const unsigned char altPhases[16] = { 13, 7, 8, 9, 10, 11, 12, 1, 2, 3, 4, 5, 6, 0, 14, 15 }; + static const float altPhaseOffset[16] = { -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, 0, -5, -5, -5 }; // Slight tweak in phase 6 for Z-Dog + phaseOffset += altPhaseOffset[nPhase]; // These "alternative" colors seem to be slightly shifted in addition to being wrapped-around, at least in EmuVT. + nPhase = altPhases[nPhase]; + nChroma = 16 - nChroma; + nLuma = (nLuma - 8) & 0xF; + } + + float fLuma = (nLuma - 4) / 9.625; // Value determined from matching saturation =0 phases 1-12 + float fChroma = nChroma / 18.975; // Value determined from matching phases 0 and 13 across all luminance and saturation levels + float fPhase = ((nPhase - 2) * 30.0 + phaseOffset) * M_PI / 180.0; + + if (palmode == 1) + { + if (fPhase > 0 && fPhase < 13) + { + fLuma /= 1.5; + fChroma /= 2; + } + } + + float Y = fLuma; + float C = fChroma; + if (nPhase == 0 || nPhase > 12) C = 0.0;// Phases 0 and 13-15 are grays + if (nPhase == 0) Y += fChroma; // Phase 0 is the upper bound of the waveform + if (nPhase == 13) Y -= fChroma; // Phase 13 is the lower bound of the waveform + if (nPhase >= 14) Y = 0.0; // Phases 14 and 15 always black + + float V = sin(fPhase) * C * 1.05; // 1.05 needed to get closer to EmuVT palette's color levels in phases 1-12 + float U = cos(fPhase) * C * 1.05; + float R = Y + 1.1400 * V + 0.0000 * U; + float G = Y - 0.5807 * V - 0.3940 * U; + float B = Y - 0.0000 * V + 2.0290 * U; + if (R < 0.0) R = 0.0; + if (R > 1.0) R = 1.0; + if (G < 0.0) G = 0.0; + if (G > 1.0) G = 1.0; + if (B < 0.0) B = 0.0; + if (B > 1.0) B = 1.0; + int RV = R * 255.0; + int GV = G * 255.0; + int BV = B * 255.0; + + // does this really apply to the VT palette? + //bool is_pal = m_scanlines_per_frame != NTSC_SCANLINES_PER_FRAME; + //apply_color_emphasis_and_clamp(is_pal, color_emphasis, R, G, B); + + m_vtpens[entry] = rgb_t(RV, GV, BV); + entry++; + } + } } void ppu_vt03_device::device_start() { - ppu2c0x_device::device_start(); + start_nopalram(); + + m_palette_ram.resize(0x100); - m_newpal = std::make_unique<uint8_t[]>(0x100); - save_pointer(NAME(m_newpal), 0x100); + for (int i = 0; i < 0x100; i++) + m_palette_ram[i] = 0x00; + save_item(NAME(m_palette_ram)); save_item(NAME(m_201x_regs)); + + init_vt03_palette_tables(0); + init_vtxx_rgb555_palette_tables(); + init_vtxx_rgb444_palette_tables(); } uint8_t ppu_vt03_device::get_201x_reg(int reg) @@ -270,16 +284,12 @@ void ppu_vt03_device::device_reset() m_read_bg.resolve_safe(0); m_read_sp.resolve_safe(0); for (int i = 0; i < 0xff; i++) - m_newpal[i] = 0x0; + m_palette_ram[i] = 0x0; // todo: what are the actual defaults for these? for (int i = 0; i < 0x20; i++) set_201x_reg(i, 0x00); - //m_201x_regs[0] = 0x86; // alt fix for ddrdismx would be to set the default palette mode here - - init_palette(); - m_read_bg4_bg3 = 0; m_va34 = 0; } @@ -353,7 +363,8 @@ void ppu_vt03_device::draw_sprite_pixel(int sprite_xpos, int color, int pixel, u { if (!is16pix) { - bitmap.pix32(m_scanline, sprite_xpos + pixel) = pen(pixel_data + (4 * color)); + uint8_t pen = pixel_data + (4 * color); + draw_tile_pixel_inner(pen, &bitmap.pix32(m_scanline, sprite_xpos + pixel)); } else { @@ -361,9 +372,16 @@ void ppu_vt03_device::draw_sprite_pixel(int sprite_xpos, int color, int pixel, u we probably need to split them out again and draw them at xpos+8 with a cliprect - not seen used yet */ if ((pixel_data & 0x03) != 0) - bitmap.pix32(m_scanline, sprite_xpos + pixel) = pen((pixel_data & 0x03) + (4 * color)); + { + uint8_t pen = (pixel_data & 0x03) + (4 * color); + draw_tile_pixel_inner(pen, &bitmap.pix32(m_scanline, sprite_xpos + pixel)); + } + if (((pixel_data >> 5) & 0x03) != 0) - bitmap.pix32(m_scanline, sprite_xpos + pixel + 8) = pen(((pixel_data >> 5) & 0x03) + (4 * color)); + { + uint8_t pen = ((pixel_data >> 5) & 0x03) + (4 * color); + draw_tile_pixel_inner(pen, &bitmap.pix32(m_scanline, sprite_xpos + pixel + 8)); + } //ppu2c0x_device::draw_sprite_pixel(sprite_xpos, color, pixel, pixel_data & 0x03, bitmap); //ppu2c0x_device::draw_sprite_pixel(sprite_xpos, color, pixel + 8, (pixel_data >> 5) & 0x03, bitmap); } @@ -414,13 +432,89 @@ void ppu_vt03_device::shift_tile_plane_data(uint8_t& pix) } } -void ppu_vt03_device::draw_tile_pixel(uint8_t pix, int color, pen_t back_pen, uint32_t*& dest, const pen_t* color_table) + +void ppu_vt03_device::draw_back_pen(uint32_t* dst, int back_pen) +{ + draw_tile_pixel_inner(back_pen, dst); +} + + +void ppu_vt03_device::draw_tile_pixel_inner(uint8_t pen, uint32_t *dest) +{ + if (m_201x_regs[0] & 0x80) + { + if (m_pal_mode == PAL_MODE_NEW_RGB) // unknown newer VT mode + { + uint32_t palval; + palval = (m_palette_ram[pen & 0x7f] & 0xff) | ((m_palette_ram[(pen & 0x7f) + 0x80] & 0x7f) << 8); + + // does grayscale mode exist here? (we haven't calculated any colours for it) + //if (m_regs[PPU_CONTROL1] & PPU_CONTROL1_DISPLAY_MONO) + // palval &= 0x30; + + // apply colour emphasis (does it really exist here?) (we haven't calculated any colours for it, so ths has no effect) + palval |= ((m_regs[PPU_CONTROL1] & PPU_CONTROL1_COLOR_EMPHASIS) << 10); + + uint32_t pix; + pix = m_vtpens_rgb555[palval & 0x3ffff]; + *dest = pix; + } + else if (m_pal_mode == PAL_MODE_NEW_RGB12) // unknown newer VT mode + { + uint32_t palval; + palval = (m_palette_ram[pen & 0x7f] & 0x3f) | ((m_palette_ram[(pen & 0x7f) + 0x80] & 0x3f) << 6); + + // does grayscale mode exist here? (we haven't calculated any colours for it) + //if (m_regs[PPU_CONTROL1] & PPU_CONTROL1_DISPLAY_MONO) + // palval &= 0x30; + + // apply colour emphasis (does it really exist here?) (we haven't calculated any colours for it, so ths has no effect) + palval |= ((m_regs[PPU_CONTROL1] & PPU_CONTROL1_COLOR_EMPHASIS) << 7); + + uint32_t pix; + pix = m_vtpens_rgb444[palval & 0x7fff]; + *dest = pix; + } + else // VT03 mode + { + uint32_t palval; + palval = (m_palette_ram[pen & 0x7f] & 0x3f) | ((m_palette_ram[(pen & 0x7f) + 0x80] & 0x3f) << 6); + + // does grayscale mode exist here? (we haven't calculated any colours for it) + //if (m_regs[PPU_CONTROL1] & PPU_CONTROL1_DISPLAY_MONO) + // palval &= 0x30; + + // apply colour emphasis (does it really exist here?) (we calculate values for it when building the palette lookup) + palval |= ((m_regs[PPU_CONTROL1] & PPU_CONTROL1_COLOR_EMPHASIS) << 7); + + uint32_t pix; + pix = m_vtpens[palval & 0x7fff]; + *dest = pix; + } + } + else // old colour compatible mode + { + uint16_t palval; + palval = (m_palette_ram[pen & 0x7f] & 0x3f); + + if (m_regs[PPU_CONTROL1] & PPU_CONTROL1_DISPLAY_MONO) + palval &= 0x30; + + // apply colour emphasis + palval |= ((m_regs[PPU_CONTROL1] & PPU_CONTROL1_COLOR_EMPHASIS) << 1); + + uint32_t pix; + pix = m_nespens[palval & 0x1ff]; + *dest = pix; + } +} +void ppu_vt03_device::draw_tile_pixel(uint8_t pix, int color, uint32_t back_pen, uint32_t*& dest) { int is4bpp = get_201x_reg(0x0) & 0x02; if (!is4bpp) { - ppu2c0x_device::draw_tile_pixel(pix, color, back_pen, dest, color_table); + ppu2c0x_device::draw_tile_pixel(pix, color, back_pen, dest); } else { @@ -442,9 +536,10 @@ void ppu_vt03_device::draw_tile_pixel(uint8_t pix, int color, pen_t back_pen, ui } else { - pen = 0; // fixme backpen logic probably differs on vt03 due to extra colours + pen = 0; // back_pen; // fixme backpen logic probably differs on vt03 due to extra colours } - *dest = this->pen(pen); + + draw_tile_pixel_inner(pen, dest); } } @@ -468,24 +563,6 @@ void ppu_vt03_device::set_2010_reg(uint8_t data) 2 : SP16EN 1 : BK16EN 0 : PIX16EN */ - uint8_t pal_mask = (m_pal_mode == PAL_MODE_NEW_VG) ? 0x08 : 0x80; - if ((m_201x_regs[0x0] & pal_mask) != (data & pal_mask)) - { - if (data & pal_mask) - { - for (int i = 0; i < 256; i++) - { - set_new_pen(i); - } - } - else - { - for (int i = 0; i < 256; i++) - { - set_pen_indirect(i, i); - } - } - } m_201x_regs[0x0] = data; } diff --git a/src/devices/video/ppu2c0x_vt.h b/src/devices/video/ppu2c0x_vt.h index c238f91b031..f63da1ebdf1 100644 --- a/src/devices/video/ppu2c0x_vt.h +++ b/src/devices/video/ppu2c0x_vt.h @@ -19,7 +19,6 @@ enum vtxx_pal_mode { PAL_MODE_VT0x, PAL_MODE_NEW_RGB, - PAL_MODE_NEW_VG, PAL_MODE_NEW_RGB12, }; @@ -40,13 +39,15 @@ public: virtual uint8_t palette_read(offs_t offset) override; virtual void palette_write(offs_t offset, uint8_t data) override; - virtual uint32_t palette_entries() const override { return 256; } - virtual uint32_t palette_indirect_entries() const override { return 4*16*8; } - virtual void init_palette() override; + void init_vt03_palette_tables(int palmode); + void init_vtxx_rgb555_palette_tables(); + void init_vtxx_rgb444_palette_tables(); virtual void read_tile_plane_data(int address, int color) override; virtual void shift_tile_plane_data(uint8_t &pix) override; - virtual void draw_tile_pixel(uint8_t pix, int color, pen_t back_pen, uint32_t *&dest, const pen_t *color_table) override; + virtual void draw_tile_pixel(uint8_t pix, int color, uint32_t back_pen, uint32_t *&dest) override; + inline void draw_tile_pixel_inner(uint8_t pen, uint32_t *dest); + virtual void draw_back_pen(uint32_t* dst, int back_pen) override; virtual void read_sprite_plane_data(int address) override; virtual void make_sprite_pixel_data(uint8_t &pixel_data, int flipx) override; @@ -70,12 +71,14 @@ protected: bool m_is_pal; bool m_is_50hz; + uint32_t m_vtpens[0x1000*8]; + uint32_t m_vtpens_rgb555[0x8000*8]; + uint32_t m_vtpens_rgb444[0x1000*8]; + private: devcb_read8 m_read_bg; devcb_read8 m_read_sp; - std::unique_ptr<uint8_t[]> m_newpal; - int m_read_bg4_bg3; int m_va34; @@ -89,8 +92,6 @@ private: vtxx_pal_mode m_pal_mode = PAL_MODE_VT0x; void set_2010_reg(uint8_t data); - - void set_new_pen(int i); }; class ppu_vt03pal_device : public ppu_vt03_device { |