diff --git a/src/devices/video/ppu2c0x.h b/src/devices/video/ppu2c0x.h index b14e3578125..f5de409a343 100644 --- a/src/devices/video/ppu2c0x.h +++ b/src/devices/video/ppu2c0x.h @@ -125,6 +125,7 @@ public: virtual void read_sprite_plane_data(int address); virtual void make_sprite_pixel_data(uint8_t &pixel_data, int flipx); virtual void draw_sprite_pixel(int sprite_xpos, int color, int pixel, uint8_t pixel_data, bitmap_ind16& bitmap); + virtual void read_extra_sprite_bits(int sprite_index); void draw_sprites( uint8_t *line_priority ); void render_scanline(); @@ -216,6 +217,7 @@ protected: // used in rendering uint8_t m_planebuf[2]; int m_scanline; /* scanline count */ + std::unique_ptr m_spriteram; /* sprite ram */ private: static constexpr device_timer_id TIMER_HBLANK = 0; @@ -226,7 +228,6 @@ private: inline void writebyte(offs_t address, uint8_t data); std::unique_ptr m_bitmap; /* target bitmap */ - std::unique_ptr m_spriteram; /* sprite ram */ std::unique_ptr m_colortable; /* color table modified at run time */ std::unique_ptr m_colortable_mono; /* monochromatic color table modified at run time */ diff --git a/src/devices/video/ppu2c0x_vt.cpp b/src/devices/video/ppu2c0x_vt.cpp index 92b3eccaa17..cfadea2a8c3 100644 --- a/src/devices/video/ppu2c0x_vt.cpp +++ b/src/devices/video/ppu2c0x_vt.cpp @@ -230,10 +230,21 @@ void ppu_vt03_device::draw_tile_pixel(uint8_t pix, int color, uint16_t back_pen, } } +void ppu_vt03_device::read_extra_sprite_bits(int sprite_index) +{ + m_extra_sprite_bits = (m_spriteram[sprite_index + 2] & 0x1c) >>2; +} + +uint8_t ppu_vt03_device::get_speva2_speva0() +{ + return m_extra_sprite_bits; +} + void ppu_vt03_device::set_2010_reg(uint8_t data) { - /* 7 : COLCOMP - 6,5 : UNUSED + /* 7 : COLCOMP + 6 : UNUSED (8bpp enable on VT09?) + 5 : UNUSED 4 : BKEXTEN 3 : SPEXTEN 2 : SP16EN diff --git a/src/devices/video/ppu2c0x_vt.h b/src/devices/video/ppu2c0x_vt.h index 1deac5ef07c..b365aa8ed20 100644 --- a/src/devices/video/ppu2c0x_vt.h +++ b/src/devices/video/ppu2c0x_vt.h @@ -42,6 +42,7 @@ public: virtual void read_sprite_plane_data(int address) override; virtual void make_sprite_pixel_data(uint8_t &pixel_data, int flipx) override; virtual void draw_sprite_pixel(int sprite_xpos, int color, int pixel, uint8_t pixel_data, bitmap_ind16& bitmap) override; + virtual void read_extra_sprite_bits(int sprite_index) override; virtual void device_start() override; virtual void device_reset() override; @@ -51,6 +52,7 @@ public: uint8_t get_va34(); uint8_t get_m_read_bg4_bg3(); + uint8_t get_speva2_speva0(); private: devcb_read8 m_read_bg; @@ -62,6 +64,7 @@ private: int m_va34; uint8_t m_extplanebuf[2]; + uint8_t m_extra_sprite_bits; palette_device *m_palette; diff --git a/src/mame/drivers/nes_vt.cpp b/src/mame/drivers/nes_vt.cpp index d2dcaf14ad5..0a82b35f943 100644 --- a/src/mame/drivers/nes_vt.cpp +++ b/src/mame/drivers/nes_vt.cpp @@ -14,7 +14,9 @@ VT02 - banking scheme to access 32MB, Dual APU with PCM support VT03 - above + 4bpp sprite / bg modes, enhanced palette - VT08 - 8bpp or direct colour modes? + VT08 - ? + + VT09 - 8bpp or direct colour modes? VT16 - ? VT18 - ? @@ -374,6 +376,17 @@ int nes_vt_state::calculate_real_video_address(int addr, int extended, int readt extended = 0; } } + else if (readtype == 1) + { + if (m_ppu->get_201x_reg(0x0) & 0x08) + { + extended = 1; + } + else + { + extended = 0; + } + } /* Calculating TVA17 - TVA10 @@ -517,8 +530,10 @@ int nes_vt_state::calculate_real_video_address(int addr, int extended, int readt break; case 1: // sprite display - is4bpp = m_ppu->get_201x_reg(0x0) & 0x04; - // todo (need something using it to test) + is4bpp = m_ppu->get_201x_reg(0x0) & 0x04; // 16 colors or 16-pixel wide (both adjust the read) + + eva2_eva0 |= m_ppu->get_speva2_speva0(); + break; case 2: // CPU R/W access @@ -526,7 +541,7 @@ int nes_vt_state::calculate_real_video_address(int addr, int extended, int readt break; } - finaladdr = ((m_410x[0x0] & 0x0F) << 21) | (va17_va10 << 13) | (eva2_eva0 << 10) | (addr & 0x03ff); + finaladdr = ((m_410x[0x0] & 0x0f) << 21) | (va17_va10 << 13) | (eva2_eva0 << 10) | (addr & 0x03ff); if (is4bpp) finaladdr = ((finaladdr &~0xf) << 1) | (va34 << 4) | (finaladdr & 0xf);