public:
uint8 mmio_read(unsigned addr);
void mmio_write(unsigned addr, uint8 data);
privileged:
struct {
uint8 ppu1_mdr;
uint8 ppu2_mdr;
uint16 vram_readbuffer;
uint8 oam_latchdata;
uint8 cgram_latchdata;
uint8 bgofs_latchdata;
uint8 mode7_latchdata;
bool counters_latched;
bool latch_hcounter;
bool latch_vcounter;
uint10 oam_iaddr;
uint9 cgram_iaddr;
bool display_disable;
uint4 display_brightness;
uint10 oam_baseaddr;
uint10 oam_addr;
bool oam_priority;
bool bg3_priority;
uint8 bgmode;
uint16 mode7_hoffset;
uint16 mode7_voffset;
bool vram_incmode;
uint2 vram_mapping;
uint8 vram_incsize;
uint16 vram_addr;
uint2 mode7_repeat;
bool mode7_vflip;
bool mode7_hflip;
uint16 m7a;
uint16 m7b;
uint16 m7c;
uint16 m7d;
uint16 m7x;
uint16 m7y;
uint9 cgram_addr;
bool mode7_extbg;
bool pseudo_hires;
bool overscan;
bool interlace;
uint16 hcounter;
uint16 vcounter;
} regs;
uint16 get_vram_address();
uint8 vram_read(unsigned addr);
void vram_write(unsigned addr, uint8 data);
uint8 oam_read(unsigned addr);
void oam_write(unsigned addr, uint8 data);
uint8 cgram_read(unsigned addr);
void cgram_write(unsigned addr, uint8 data);
void mmio_update_video_mode();
void mmio_w2100(uint8);
void mmio_w2101(uint8);
void mmio_w2102(uint8);
void mmio_w2103(uint8);
void mmio_w2104(uint8);
void mmio_w2105(uint8);
void mmio_w2106(uint8);
void mmio_w2107(uint8);
void mmio_w2108(uint8);
void mmio_w2109(uint8);
void mmio_w210a(uint8);
void mmio_w210b(uint8);
void mmio_w210c(uint8);
void mmio_w210d(uint8);
void mmio_w210e(uint8);
void mmio_w210f(uint8);
void mmio_w2110(uint8);
void mmio_w2111(uint8);
void mmio_w2112(uint8);
void mmio_w2113(uint8);
void mmio_w2114(uint8);
void mmio_w2115(uint8);
void mmio_w2116(uint8);
void mmio_w2117(uint8);
void mmio_w2118(uint8);
void mmio_w2119(uint8);
void mmio_w211a(uint8);
void mmio_w211b(uint8);
void mmio_w211c(uint8);
void mmio_w211d(uint8);
void mmio_w211e(uint8);
void mmio_w211f(uint8);
void mmio_w2120(uint8);
void mmio_w2121(uint8);
void mmio_w2122(uint8);
void mmio_w2123(uint8);
void mmio_w2124(uint8);
void mmio_w2125(uint8);
void mmio_w2126(uint8);
void mmio_w2127(uint8);
void mmio_w2128(uint8);
void mmio_w2129(uint8);
void mmio_w212a(uint8);
void mmio_w212b(uint8);
void mmio_w212c(uint8);
void mmio_w212d(uint8);
void mmio_w212e(uint8);
void mmio_w212f(uint8);
void mmio_w2130(uint8);
void mmio_w2131(uint8);
void mmio_w2132(uint8);
void mmio_w2133(uint8);
uint8 mmio_r2134();
uint8 mmio_r2135();
uint8 mmio_r2136();
uint8 mmio_r2137();
uint8 mmio_r2138();
uint8 mmio_r2139();
uint8 mmio_r213a();
uint8 mmio_r213b();
uint8 mmio_r213c();
uint8 mmio_r213d();
uint8 mmio_r213e();
uint8 mmio_r213f();
void mmio_reset();