Class R2C02
Defined in File 2C02.h
Nested Relationships
Nested Types
Inheritance Relationships
Base Type
public Component
(Class Component)
Class Documentation
-
class R2C02 : public Component
NES PPU emulation. Both foreground and background cycle-accurate rendering implemented, sprite 0 bug and other quirks are also emulated.
Ports: data “ppuBus” to control a communication on the PPU’s own bus; signal “INT” to send interrupts to the CPU (normally connected to the NMI). Connectors: data “cpuBus” to connect to the CPU, signal “CLK” to clock the PPU (standard rate is 21.477272 MHz ÷ 4).
Public Functions
-
R2C02()
Default constructor. Reset PPU status and rendering.
-
~R2C02() = default
Default destructor.
-
virtual void init()
Reset the PPU.
-
void clock()
Proceed one clock further in emulation. Works as a physical CLK input. 1 PPU cycle = 186 ns
-
void OAMDMA(uint8_t addr, uint8_t data)
PPU OAM DMA. Used to write to the OAM during DMA proccess.
- Parameters
addr – OAM address.
data – Data to write.
-
uint8_t *getPaletteRAM()
-
std::vector<std::vector<RGBPixel>> getPatternTable(uint8_t colorType, uint8_t paletteId, uint8_t index, bool applyEffects = false)
Get a pattern table.
-
bool scanlineFinished() const
Is a scanline finished?
- Returns
true if clock index >= 341
-
bool frameFinished() const
Is a frame finished?
- Returns
true if scanline index >= 261
-
virtual std::vector<EmulatorWindow> getGUIs() override
Get GUI windows: metadata and rendering functions.
Note
For Component developer: If the component have a debugger or other GUI, return an arbitrary count of windows, they will be rendered on a load of a system which contains the component.
- Returns
A vector of windows to be rendered.
Public Members
-
uint8_t primaryOAM[256]
-
uint8_t secondaryOAM[32]
-
uint8_t attrLatch[8]
-
uint8_t x[8]
-
uint8_t shiftLo[8]
8 pairs of 8 bit shifters Pattern table data for up to 8 sprites to be rendered on the current scanline.
-
uint8_t shiftHi[8]
-
uint8_t allowShift[8]
-
uint8_t secondarySpriteId
-
uint8_t feedY
-
uint16_t feedTileAddress
-
uint8_t feedIndex
-
uint8_t ntByte
-
uint8_t atByte
-
uint16_t tileData
-
uint16_t shiftTileLo
-
uint16_t shiftTileHi
-
uint16_t shiftAttrLo
-
uint16_t shiftAttrHi
Protected Functions
-
void verticalIncrement()
-
void horizontalIncrement()
-
void verticalTransfer()
-
void horizontalTransfer()
-
void fetchNT()
-
void fetchAT()
-
void fetchTileLo()
-
void fetchTileHi()
-
void feedShifters()
-
void shiftShifters()
-
void evaluateSprites()
-
void fetchSprite(uint8_t offset)
-
uint8_t ppuBusRead(uint16_t addr)
Read from the internal bus.
- Parameters
addr – Address to read from.
- Returns
Data.
-
void ppuBusWrite(uint16_t addr, uint8_t data)
Write to the internal bus.
- Parameters
addr – Address to write to.
data – Data to write.
Protected Attributes
-
uint8_t m_dataBuffer = 0x00
Data lines sometimes act as a buffer because of their capacitance.
-
struct R2C02::internalRegisters_t m_internalRegisters
-
struct R2C02::registers_t m_registers
-
bool m_scanlineReady = false
-
bool m_frameReady = false
-
bool m_oddScan = false
True if the odd field of the frame is being rendered (see interlaced video).
-
bool m_settingsEnableForeground = true
Foreground pixel placement enabled.
-
bool m_settingsEnableBackground = true
Background pixel placement enabled.
-
bool m_blockNMI = false
Suppress NMI generation and NMI flag setting. Used by a special case during reading NMI flag near the clock 1 of the scanline 241, which is when the NMI is supposed to generate. See read method for more information.
-
const RGBPixel *m_colors = m_colors2C02
-
uint8_t m_palettes[32]
2C02 bus components: 0x0000 - 0x1FFF Pattern memory (CHR ROM) - on cartridge (sprites) 0x2000 - 0x3EFF Nametable memory (VRAM) - on cartridge or built-in (sprite locations) 0x3F00 - 0x3FFF Palette memory - built-in (colors)
-
int m_clock
-
int m_scanline
-
std::vector<std::vector<RGBPixel>> m_screen = {OUTPUT_BITMAP_HEIGHT, {OUTPUT_BITMAP_WIDTH, {0, 0, 0}}}
-
SignalPort m_INT
Protected Static Functions
-
static uint8_t saturate(uint8_t x, uint8_t y)
-
static uint8_t desaturate(uint8_t x, uint8_t y)
Protected Static Attributes
-
static constexpr AddressRange ADDR_PATTERN_TABLES = {0x0000, 0x1FFF}
Frame rendering: 256 341 xxxxxxxxxxxxxxx <- scanline -1 @@@@@@@— @@@@@@@— @@@@@@@—
-
static constexpr AddressRange ADDR_NAMETABLES = {0x2000, 0x2FFF}
-
static constexpr AddressRange ADDR_PALETTE_RAM = {0x3F00, 0x3FFF}
-
static const uint16_t OUTPUT_BITMAP_WIDTH = 256
-
static const uint16_t OUTPUT_BITMAP_HEIGHT = 240
-
static const uint16_t PATTERN_TABLE_TILE_ROW_COUNT = 16
-
static const uint16_t PATTERN_TABLE_TILE_COLUMN_COUNT = 16
-
static const uint16_t PATTERN_TABLE_PLANE_SIZE = 8
-
struct internalRegisters_t
Internal registers of the PPU for the rendering purposes. These are not exposed.
Public Members
-
uint16_t coarseX
-
uint16_t coarseY
-
uint16_t nameX
-
uint16_t nameY
-
uint16_t fineY
-
uint16_t padding
-
struct R2C02::internalRegisters_t::[anonymous]::STR bits
-
uint16_t data
-
union R2C02::internalRegisters_t::[anonymous] v
v = current VRAM address t = temporary VRAM address
-
union R2C02::internalRegisters_t::[anonymous] t
-
uint8_t x
Fine X scroll. 3 bits.
-
bool w
First or second write toggle. Shared by 0x2005 and 0x2006 register. 1 bit.
-
uint16_t coarseX
-
struct registers_t
“Public” registers accessible by the CPU.
Public Members
-
uint8_t nameX
Base nametable address, scroll X coordinate MSB. (1 = add 256)
-
uint8_t nameY
Base nametable address, scroll Y coordinate MSB. (1 = add 240)
-
uint8_t incMode
VRAM address increment per CPU R/W of PPUDATA. (0 = add 1, 1 = add 32).
-
uint8_t spriteAddress
Sprite pattern table address for 8x8 sprites.
-
uint8_t backgroundAddress
Background pattern table address.
-
uint8_t spriteSize
Sprite size (8x8, 8x16).
-
uint8_t masterSlave
PPU master/slave.
-
uint8_t nmi
Generate NMI on vblank.
-
struct R2C02::registers_t::[anonymous]::[anonymous] bits
-
uint8_t data
-
union R2C02::registers_t::[anonymous] ppuctrl
Controller (0x2000) - PPUCTRL Access: write Controls PPU operation.
-
uint8_t grayscale
Enable grayscale.
-
uint8_t showBackgroundLeft
Show background in leftmost 8 pixels.
-
uint8_t showSpritesLeft
Show sprites in leftmost 8 pixels.
-
uint8_t showBackground
Show bg.
-
uint8_t showSprites
Show sprites.
-
uint8_t eRed
Enhance red. (Green on PAL/Dendy.)
-
uint8_t eGreen
Enhance green. (Red on PAL/Dendy.)
-
uint8_t eBlue
Enhance blue.
-
struct R2C02::registers_t::[anonymous]::[anonymous] bits
-
union R2C02::registers_t::[anonymous] ppumask
Mask register (0x2001) - PPUMASK Access: write Controls the rendering of sprites and backgrounds and color effects.
-
uint8_t padding
Least sig. bits of previous value written to PPU register. Some Vs. systems return a constant that game checks.
-
uint8_t spriteOverflow
Buggy detection of the existence of more than 8 sprites on a scanline.
-
uint8_t spriteZeroHit
Nonzero pixel of sprite 0 overlaps nonzero background.
-
uint8_t vBlank
True if vblank started, cleared after reading this register.
-
struct R2C02::registers_t::[anonymous]::[anonymous] bits
-
union R2C02::registers_t::[anonymous] ppustatus
Status register (0x2002) - PPUSTATUS Access: read Reflects the state of the PPU.
-
uint8_t byte
-
uint8_t index
-
struct R2C02::registers_t::[anonymous]::[anonymous] bits
-
union R2C02::registers_t::[anonymous] oamAddress
-
uint8_t nameX
-
R2C02()