Path: blob/master/libsnes/bsnes/snes/alt/ppu-performance/mmio/mmio.cpp
2 views
#ifdef PPU_CPP12void PPU::latch_counters() {3regs.hcounter = cpu.hdot();4regs.vcounter = cpu.vcounter();5regs.counters_latched = true;6}78bool PPU::interlace() const { return display.interlace; }9bool PPU::overscan() const { return display.overscan; }10bool PPU::hires() const { return regs.pseudo_hires || regs.bgmode == 5 || regs.bgmode == 6; }1112uint16 PPU::get_vram_addr() {13uint16 addr = regs.vram_addr;14switch(regs.vram_mapping) {15case 0: break;16case 1: addr = (addr & 0xff00) | ((addr & 0x001f) << 3) | ((addr >> 5) & 7); break;17case 2: addr = (addr & 0xfe00) | ((addr & 0x003f) << 3) | ((addr >> 6) & 7); break;18case 3: addr = (addr & 0xfc00) | ((addr & 0x007f) << 3) | ((addr >> 7) & 7); break;19}20return (addr << 1);21}2223uint8 PPU::vram_read(unsigned addr) {24if(regs.display_disable) return vram[addr];25if(cpu.vcounter() >= display.height) return vram[addr];26return 0x00;27}2829void PPU::vram_write(unsigned addr, uint8 data) {30if(regs.display_disable || cpu.vcounter() >= display.height) {31vram[addr] = data;32cache.tilevalid[0][addr >> 4] = false;33cache.tilevalid[1][addr >> 5] = false;34cache.tilevalid[2][addr >> 6] = false;35return;36}37}3839uint8 PPU::oam_read(unsigned addr) {40if(addr & 0x0200) addr &= 0x021f;41if(regs.display_disable) return oam[addr];42if(cpu.vcounter() >= display.height) return oam[addr];43return oam[0x0218];44}4546void PPU::oam_write(unsigned addr, uint8 data) {47if(addr & 0x0200) addr &= 0x021f;48if(!regs.display_disable && cpu.vcounter() < display.height) addr = 0x0218;49oam[addr] = data;50sprite.update_list(addr, data);51}5253uint8 PPU::cgram_read(unsigned addr) {54return cgram[addr];55}5657void PPU::cgram_write(unsigned addr, uint8 data) {58cgram[addr] = data;59}6061void PPU::mmio_update_video_mode() {62switch(regs.bgmode) {63case 0: {64bg1.regs.mode = Background::Mode::BPP2; bg1.regs.priority0 = 8; bg1.regs.priority1 = 11;65bg2.regs.mode = Background::Mode::BPP2; bg2.regs.priority0 = 7; bg2.regs.priority1 = 10;66bg3.regs.mode = Background::Mode::BPP2; bg3.regs.priority0 = 2; bg3.regs.priority1 = 5;67bg4.regs.mode = Background::Mode::BPP2; bg4.regs.priority0 = 1; bg4.regs.priority1 = 4;68sprite.regs.priority0 = 3; sprite.regs.priority1 = 6; sprite.regs.priority2 = 9; sprite.regs.priority3 = 12;69} break;7071case 1: {72bg1.regs.mode = Background::Mode::BPP4;73bg2.regs.mode = Background::Mode::BPP4;74bg3.regs.mode = Background::Mode::BPP2;75bg4.regs.mode = Background::Mode::Inactive;76if(regs.bg3_priority) {77bg1.regs.priority0 = 5; bg1.regs.priority1 = 8;78bg2.regs.priority0 = 4; bg2.regs.priority1 = 7;79bg3.regs.priority0 = 1; bg3.regs.priority1 = 10;80sprite.regs.priority0 = 2; sprite.regs.priority1 = 3; sprite.regs.priority2 = 6; sprite.regs.priority3 = 9;81} else {82bg1.regs.priority0 = 6; bg1.regs.priority1 = 9;83bg2.regs.priority0 = 5; bg2.regs.priority1 = 8;84bg3.regs.priority0 = 1; bg3.regs.priority1 = 3;85sprite.regs.priority0 = 2; sprite.regs.priority1 = 4; sprite.regs.priority2 = 7; sprite.regs.priority3 = 10;86}87} break;8889case 2: {90bg1.regs.mode = Background::Mode::BPP4;91bg2.regs.mode = Background::Mode::BPP4;92bg3.regs.mode = Background::Mode::Inactive;93bg4.regs.mode = Background::Mode::Inactive;94bg1.regs.priority0 = 3; bg1.regs.priority1 = 7;95bg2.regs.priority0 = 1; bg2.regs.priority1 = 5;96sprite.regs.priority0 = 2; sprite.regs.priority1 = 4; sprite.regs.priority2 = 6; sprite.regs.priority3 = 8;97} break;9899case 3: {100bg1.regs.mode = Background::Mode::BPP8;101bg2.regs.mode = Background::Mode::BPP4;102bg3.regs.mode = Background::Mode::Inactive;103bg4.regs.mode = Background::Mode::Inactive;104bg1.regs.priority0 = 3; bg1.regs.priority1 = 7;105bg2.regs.priority0 = 1; bg2.regs.priority1 = 5;106sprite.regs.priority0 = 2; sprite.regs.priority1 = 4; sprite.regs.priority2 = 6; sprite.regs.priority3 = 8;107} break;108109case 4: {110bg1.regs.mode = Background::Mode::BPP8;111bg2.regs.mode = Background::Mode::BPP2;112bg3.regs.mode = Background::Mode::Inactive;113bg4.regs.mode = Background::Mode::Inactive;114bg1.regs.priority0 = 3; bg1.regs.priority1 = 7;115bg2.regs.priority0 = 1; bg2.regs.priority1 = 5;116sprite.regs.priority0 = 2; sprite.regs.priority1 = 4; sprite.regs.priority2 = 6; sprite.regs.priority3 = 8;117} break;118119case 5: {120bg1.regs.mode = Background::Mode::BPP4;121bg2.regs.mode = Background::Mode::BPP2;122bg3.regs.mode = Background::Mode::Inactive;123bg4.regs.mode = Background::Mode::Inactive;124bg1.regs.priority0 = 3; bg1.regs.priority1 = 7;125bg2.regs.priority0 = 1; bg2.regs.priority1 = 5;126sprite.regs.priority0 = 2; sprite.regs.priority1 = 4; sprite.regs.priority2 = 6; sprite.regs.priority3 = 8;127} break;128129case 6: {130bg1.regs.mode = Background::Mode::BPP4;131bg2.regs.mode = Background::Mode::Inactive;132bg3.regs.mode = Background::Mode::Inactive;133bg4.regs.mode = Background::Mode::Inactive;134bg1.regs.priority0 = 2; bg1.regs.priority1 = 5;135sprite.regs.priority0 = 1; sprite.regs.priority1 = 3; sprite.regs.priority2 = 4; sprite.regs.priority3 = 6;136} break;137138case 7: {139if(regs.mode7_extbg == false) {140bg1.regs.mode = Background::Mode::Mode7;141bg2.regs.mode = Background::Mode::Inactive;142bg3.regs.mode = Background::Mode::Inactive;143bg4.regs.mode = Background::Mode::Inactive;144bg1.regs.priority0 = 2; bg1.regs.priority1 = 2;145sprite.regs.priority0 = 1; sprite.regs.priority1 = 3; sprite.regs.priority2 = 4; sprite.regs.priority3 = 5;146} else {147bg1.regs.mode = Background::Mode::Mode7;148bg2.regs.mode = Background::Mode::Mode7;149bg3.regs.mode = Background::Mode::Inactive;150bg4.regs.mode = Background::Mode::Inactive;151bg1.regs.priority0 = 3; bg1.regs.priority1 = 3;152bg2.regs.priority0 = 1; bg2.regs.priority1 = 5;153sprite.regs.priority0 = 2; sprite.regs.priority1 = 4; sprite.regs.priority2 = 6; sprite.regs.priority3 = 7;154}155} break;156}157}158159uint8 PPU::mmio_read(unsigned addr) {160cpu.synchronize_ppu();161162switch(addr & 0xffff) {163case 0x2104: case 0x2105: case 0x2106: case 0x2108: case 0x2109: case 0x210a:164case 0x2114: case 0x2115: case 0x2116: case 0x2118: case 0x2119: case 0x211a:165case 0x2124: case 0x2125: case 0x2126: case 0x2128: case 0x2129: case 0x212a: {166return regs.ppu1_mdr;167}168169case 0x2134: { //MPYL170unsigned result = ((int16)regs.m7a * (int8)(regs.m7b >> 8));171regs.ppu1_mdr = result >> 0;172return regs.ppu1_mdr;173}174175case 0x2135: { //MPYM176unsigned result = ((int16)regs.m7a * (int8)(regs.m7b >> 8));177regs.ppu1_mdr = result >> 8;178return regs.ppu1_mdr;179}180181case 0x2136: { //MPYH182unsigned result = ((int16)regs.m7a * (int8)(regs.m7b >> 8));183regs.ppu1_mdr = result >> 16;184return regs.ppu1_mdr;185}186187case 0x2137: { //SLHV188if(cpu.pio() & 0x80) latch_counters();189return cpu.regs.mdr;190}191192case 0x2138: { //OAMDATAREAD193regs.ppu1_mdr = oam_read(regs.oam_addr);194regs.oam_addr = (regs.oam_addr + 1) & 0x03ff;195sprite.set_first();196return regs.ppu1_mdr;197}198199case 0x2139: { //VMDATALREAD200regs.ppu1_mdr = regs.vram_readbuffer >> 0;201if(regs.vram_incmode == 0) {202uint16 addr = get_vram_addr();203regs.vram_readbuffer = vram_read(addr + 0) << 0;204regs.vram_readbuffer |= vram_read(addr + 1) << 8;205regs.vram_addr += regs.vram_incsize;206}207return regs.ppu1_mdr;208}209210case 0x213a: { //VMDATAHREAD211regs.ppu1_mdr = regs.vram_readbuffer >> 8;212if(regs.vram_incmode == 1) {213uint16 addr = get_vram_addr();214regs.vram_readbuffer = vram_read(addr + 0) << 0;215regs.vram_readbuffer |= vram_read(addr + 1) << 8;216regs.vram_addr += regs.vram_incsize;217}218return regs.ppu1_mdr;219}220221case 0x213b: { //CGDATAREAD222if((regs.cgram_addr & 1) == 0) {223regs.ppu2_mdr = cgram_read(regs.cgram_addr);224} else {225regs.ppu2_mdr = (regs.ppu2_mdr & 0x80) | (cgram_read(regs.cgram_addr) & 0x7f);226}227regs.cgram_addr = (regs.cgram_addr + 1) & 0x01ff;228return regs.ppu2_mdr;229}230231case 0x213c: { //OPHCT232if(regs.latch_hcounter == 0) {233regs.ppu2_mdr = regs.hcounter & 0xff;234} else {235regs.ppu2_mdr = (regs.ppu2_mdr & 0xfe) | (regs.hcounter >> 8);236}237regs.latch_hcounter ^= 1;238return regs.ppu2_mdr;239}240241case 0x213d: { //OPVCT242if(regs.latch_vcounter == 0) {243regs.ppu2_mdr = regs.vcounter & 0xff;244} else {245regs.ppu2_mdr = (regs.ppu2_mdr & 0xfe) | (regs.vcounter >> 8);246}247regs.latch_vcounter ^= 1;248return regs.ppu2_mdr;249}250251case 0x213e: { //STAT77252regs.ppu1_mdr &= 0x10;253regs.ppu1_mdr |= sprite.regs.time_over << 7;254regs.ppu1_mdr |= sprite.regs.range_over << 6;255regs.ppu1_mdr |= 0x01; //version256return regs.ppu1_mdr;257}258259case 0x213f: { //STAT78260regs.latch_hcounter = 0;261regs.latch_vcounter = 0;262263regs.ppu2_mdr &= 0x20;264regs.ppu2_mdr |= cpu.field() << 7;265if((cpu.pio() & 0x80) == 0) {266regs.ppu2_mdr |= 0x40;267} else if(regs.counters_latched) {268regs.ppu2_mdr |= 0x40;269regs.counters_latched = false;270}271regs.ppu2_mdr |= (system.region() == System::Region::NTSC ? 0 : 1) << 4;272regs.ppu2_mdr |= 0x03; //version273return regs.ppu2_mdr;274}275}276277return cpu.regs.mdr;278}279280void PPU::mmio_write(unsigned addr, uint8 data) {281cpu.synchronize_ppu();282283switch(addr & 0xffff) {284case 0x2100: { //INIDISP285if(regs.display_disable && cpu.vcounter() == display.height) sprite.address_reset();286regs.display_disable = data & 0x80;287regs.display_brightness = data & 0x0f;288return;289}290291case 0x2101: { //OBSEL292sprite.regs.base_size = (data >> 5) & 7;293sprite.regs.nameselect = (data >> 3) & 3;294sprite.regs.tiledata_addr = (data & 3) << 14;295sprite.list_valid = false;296return;297}298299case 0x2102: { //OAMADDL300regs.oam_baseaddr = (regs.oam_baseaddr & 0x0100) | (data << 0);301sprite.address_reset();302return;303}304305case 0x2103: { //OAMADDH306regs.oam_priority = data & 0x80;307regs.oam_baseaddr = ((data & 1) << 8) | (regs.oam_baseaddr & 0x00ff);308sprite.address_reset();309return;310}311312case 0x2104: { //OAMDATA313if((regs.oam_addr & 1) == 0) regs.oam_latchdata = data;314if(regs.oam_addr & 0x0200) {315oam_write(regs.oam_addr, data);316} else if((regs.oam_addr & 1) == 1) {317oam_write((regs.oam_addr & ~1) + 0, regs.oam_latchdata);318oam_write((regs.oam_addr & ~1) + 1, data);319}320regs.oam_addr = (regs.oam_addr + 1) & 0x03ff;321sprite.set_first();322return;323}324325case 0x2105: { //BGMODE326bg4.regs.tile_size = data & 0x80;327bg3.regs.tile_size = data & 0x40;328bg2.regs.tile_size = data & 0x20;329bg1.regs.tile_size = data & 0x10;330regs.bg3_priority = data & 0x08;331regs.bgmode = data & 0x07;332mmio_update_video_mode();333return;334}335336case 0x2106: { //MOSAIC337unsigned mosaic_size = (data >> 4) & 15;338bg4.regs.mosaic = (data & 0x08 ? mosaic_size : 0);339bg3.regs.mosaic = (data & 0x04 ? mosaic_size : 0);340bg2.regs.mosaic = (data & 0x02 ? mosaic_size : 0);341bg1.regs.mosaic = (data & 0x01 ? mosaic_size : 0);342return;343}344345case 0x2107: { //BG1SC346bg1.regs.screen_addr = (data & 0x7c) << 9;347bg1.regs.screen_size = data & 3;348return;349}350351case 0x2108: { //BG2SC352bg2.regs.screen_addr = (data & 0x7c) << 9;353bg2.regs.screen_size = data & 3;354return;355}356357case 0x2109: { //BG3SC358bg3.regs.screen_addr = (data & 0x7c) << 9;359bg3.regs.screen_size = data & 3;360return;361}362363case 0x210a: { //BG4SC364bg4.regs.screen_addr = (data & 0x7c) << 9;365bg4.regs.screen_size = data & 3;366return;367}368369case 0x210b: { //BG12NBA370bg1.regs.tiledata_addr = (data & 0x07) << 13;371bg2.regs.tiledata_addr = (data & 0x70) << 9;372return;373}374375case 0x210c: { //BG34NBA376bg3.regs.tiledata_addr = (data & 0x07) << 13;377bg4.regs.tiledata_addr = (data & 0x70) << 9;378return;379}380381case 0x210d: { //BG1HOFS382regs.mode7_hoffset = (data << 8) | regs.mode7_latchdata;383regs.mode7_latchdata = data;384385bg1.regs.hoffset = (data << 8) | (regs.bgofs_latchdata & ~7) | ((bg1.regs.hoffset >> 8) & 7);386regs.bgofs_latchdata = data;387return;388}389390case 0x210e: { //BG1VOFS391regs.mode7_voffset = (data << 8) | regs.mode7_latchdata;392regs.mode7_latchdata = data;393394bg1.regs.voffset = (data << 8) | regs.bgofs_latchdata;395regs.bgofs_latchdata = data;396return;397}398399case 0x210f: { //BG2HOFS400bg2.regs.hoffset = (data << 8) | (regs.bgofs_latchdata & ~7) | ((bg2.regs.hoffset >> 8) & 7);401regs.bgofs_latchdata = data;402return;403}404405case 0x2110: { //BG2VOFS406bg2.regs.voffset = (data << 8) | regs.bgofs_latchdata;407regs.bgofs_latchdata = data;408return;409}410411case 0x2111: { //BG3HOFS412bg3.regs.hoffset = (data << 8) | (regs.bgofs_latchdata & ~7) | ((bg3.regs.hoffset >> 8) & 7);413regs.bgofs_latchdata = data;414return;415}416417case 0x2112: { //BG3VOFS418bg3.regs.voffset = (data << 8) | regs.bgofs_latchdata;419regs.bgofs_latchdata = data;420return;421}422423case 0x2113: { //BG4HOFS424bg4.regs.hoffset = (data << 8) | (regs.bgofs_latchdata & ~7) | ((bg4.regs.hoffset >> 8) & 7);425regs.bgofs_latchdata = data;426return;427}428429case 0x2114: { //BG4VOFS430bg4.regs.voffset = (data << 8) | regs.bgofs_latchdata;431regs.bgofs_latchdata = data;432return;433}434435case 0x2115: { //VMAIN436regs.vram_incmode = data & 0x80;437regs.vram_mapping = (data >> 2) & 3;438switch(data & 3) {439case 0: regs.vram_incsize = 1; break;440case 1: regs.vram_incsize = 32; break;441case 2: regs.vram_incsize = 128; break;442case 3: regs.vram_incsize = 128; break;443}444return;445}446447case 0x2116: { //VMADDL448regs.vram_addr = (regs.vram_addr & 0xff00) | (data << 0);449uint16 addr = get_vram_addr();450regs.vram_readbuffer = vram_read(addr + 0) << 0;451regs.vram_readbuffer |= vram_read(addr + 1) << 8;452return;453}454455case 0x2117: { //VMADDH456regs.vram_addr = (data << 8) | (regs.vram_addr & 0x00ff);457uint16 addr = get_vram_addr();458regs.vram_readbuffer = vram_read(addr + 0) << 0;459regs.vram_readbuffer |= vram_read(addr + 1) << 8;460return;461}462463case 0x2118: { //VMDATAL464vram_write(get_vram_addr() + 0, data);465if(regs.vram_incmode == 0) regs.vram_addr += regs.vram_incsize;466return;467}468469case 0x2119: { //VMDATAH470vram_write(get_vram_addr() + 1, data);471if(regs.vram_incmode == 1) regs.vram_addr += regs.vram_incsize;472return;473}474475case 0x211a: { //M7SEL476regs.mode7_repeat = (data >> 6) & 3;477regs.mode7_vflip = data & 0x02;478regs.mode7_hflip = data & 0x01;479return;480}481482case 0x211b: { //M7A483regs.m7a = (data << 8) | regs.mode7_latchdata;484regs.mode7_latchdata = data;485return;486}487488case 0x211c: { //M7B489regs.m7b = (data << 8) | regs.mode7_latchdata;490regs.mode7_latchdata = data;491return;492}493494case 0x211d: { //M7C495regs.m7c = (data << 8) | regs.mode7_latchdata;496regs.mode7_latchdata = data;497return;498}499500case 0x211e: { //M7D501regs.m7d = (data << 8) | regs.mode7_latchdata;502regs.mode7_latchdata = data;503return;504}505506case 0x211f: { //M7X507regs.m7x = (data << 8) | regs.mode7_latchdata;508regs.mode7_latchdata = data;509return;510}511512case 0x2120: { //M7Y513regs.m7y = (data << 8) | regs.mode7_latchdata;514regs.mode7_latchdata = data;515return;516}517518case 0x2121: { //CGADD519regs.cgram_addr = data << 1;520return;521}522523case 0x2122: { //CGDATA524if((regs.cgram_addr & 1) == 0) {525regs.cgram_latchdata = data;526} else {527cgram_write((regs.cgram_addr & ~1) + 0, regs.cgram_latchdata);528cgram_write((regs.cgram_addr & ~1) + 1, data & 0x7f);529}530regs.cgram_addr = (regs.cgram_addr + 1) & 0x01ff;531return;532}533534case 0x2123: { //W12SEL535bg2.window.two_enable = data & 0x80;536bg2.window.two_invert = data & 0x40;537bg2.window.one_enable = data & 0x20;538bg2.window.one_invert = data & 0x10;539bg1.window.two_enable = data & 0x08;540bg1.window.two_invert = data & 0x04;541bg1.window.one_enable = data & 0x02;542bg1.window.one_invert = data & 0x01;543return;544}545546case 0x2124: { //W34SEL547bg4.window.two_enable = data & 0x80;548bg4.window.two_invert = data & 0x40;549bg4.window.one_enable = data & 0x20;550bg4.window.one_invert = data & 0x10;551bg3.window.two_enable = data & 0x08;552bg3.window.two_invert = data & 0x04;553bg3.window.one_enable = data & 0x02;554bg3.window.one_invert = data & 0x01;555return;556}557558case 0x2125: { //WOBJSEL559screen.window.two_enable = data & 0x80;560screen.window.two_invert = data & 0x40;561screen.window.one_enable = data & 0x20;562screen.window.one_invert = data & 0x10;563sprite.window.two_enable = data & 0x08;564sprite.window.two_invert = data & 0x04;565sprite.window.one_enable = data & 0x02;566sprite.window.one_invert = data & 0x01;567return;568}569570case 0x2126: { //WH0571regs.window_one_left = data;572return;573}574575case 0x2127: { //WH1576regs.window_one_right = data;577return;578}579580case 0x2128: { //WH2581regs.window_two_left = data;582return;583}584585case 0x2129: { //WH3586regs.window_two_right = data;587return;588}589590case 0x212a: { //WBGLOG591bg4.window.mask = (data >> 6) & 3;592bg3.window.mask = (data >> 4) & 3;593bg2.window.mask = (data >> 2) & 3;594bg1.window.mask = (data >> 0) & 3;595return;596}597598case 0x212b: { //WOBJLOG599screen.window.mask = (data >> 2) & 3;600sprite.window.mask = (data >> 0) & 3;601return;602}603604case 0x212c: { //TM605sprite.regs.main_enable = data & 0x10;606bg4.regs.main_enable = data & 0x08;607bg3.regs.main_enable = data & 0x04;608bg2.regs.main_enable = data & 0x02;609bg1.regs.main_enable = data & 0x01;610return;611}612613case 0x212d: { //TS614sprite.regs.sub_enable = data & 0x10;615bg4.regs.sub_enable = data & 0x08;616bg3.regs.sub_enable = data & 0x04;617bg2.regs.sub_enable = data & 0x02;618bg1.regs.sub_enable = data & 0x01;619return;620}621622case 0x212e: { //TMW623sprite.window.main_enable = data & 0x10;624bg4.window.main_enable = data & 0x08;625bg3.window.main_enable = data & 0x04;626bg2.window.main_enable = data & 0x02;627bg1.window.main_enable = data & 0x01;628return;629}630631case 0x212f: { //TSW632sprite.window.sub_enable = data & 0x10;633bg4.window.sub_enable = data & 0x08;634bg3.window.sub_enable = data & 0x04;635bg2.window.sub_enable = data & 0x02;636bg1.window.sub_enable = data & 0x01;637return;638}639640case 0x2130: { //CGWSEL641screen.window.main_mask = (data >> 6) & 3;642screen.window.sub_mask = (data >> 4) & 3;643screen.regs.addsub_mode = data & 0x02;644screen.regs.direct_color = data & 0x01;645return;646}647648case 0x2131: { //CGADDSUB649screen.regs.color_mode = data & 0x80;650screen.regs.color_halve = data & 0x40;651screen.regs.color_enable[6] = data & 0x20;652screen.regs.color_enable[5] = data & 0x10;653screen.regs.color_enable[4] = data & 0x10;654screen.regs.color_enable[3] = data & 0x08;655screen.regs.color_enable[2] = data & 0x04;656screen.regs.color_enable[1] = data & 0x02;657screen.regs.color_enable[0] = data & 0x01;658return;659}660661case 0x2132: { //COLDATA662if(data & 0x80) screen.regs.color_b = data & 0x1f;663if(data & 0x40) screen.regs.color_g = data & 0x1f;664if(data & 0x20) screen.regs.color_r = data & 0x1f;665screen.regs.color = (screen.regs.color_b << 10) | (screen.regs.color_g << 5) | (screen.regs.color_r << 0);666return;667}668669case 0x2133: { //SETINI670regs.mode7_extbg = data & 0x40;671regs.pseudo_hires = data & 0x08;672regs.overscan = data & 0x04;673sprite.regs.interlace = data & 0x02;674regs.interlace = data & 0x01;675mmio_update_video_mode();676sprite.list_valid = false;677return;678}679}680}681682void PPU::mmio_reset() {683//internal684regs.ppu1_mdr = 0;685regs.ppu2_mdr = 0;686687regs.vram_readbuffer = 0;688regs.oam_latchdata = 0;689regs.cgram_latchdata = 0;690regs.bgofs_latchdata = 0;691regs.mode7_latchdata = 0;692693regs.counters_latched = 0;694regs.latch_hcounter = 0;695regs.latch_vcounter = 0;696697sprite.regs.first_sprite = 0;698sprite.list_valid = false;699700//$2100701regs.display_disable = true;702regs.display_brightness = 0;703704//$2101705sprite.regs.base_size = 0;706sprite.regs.nameselect = 0;707sprite.regs.tiledata_addr = 0;708709//$2102-$2103710regs.oam_baseaddr = 0;711regs.oam_addr = 0;712regs.oam_priority = 0;713714//$2105715bg4.regs.tile_size = 0;716bg3.regs.tile_size = 0;717bg2.regs.tile_size = 0;718bg1.regs.tile_size = 0;719regs.bg3_priority = 0;720regs.bgmode = 0;721722//$2106723bg4.regs.mosaic = 0;724bg3.regs.mosaic = 0;725bg2.regs.mosaic = 0;726bg1.regs.mosaic = 0;727728//$2107-$210a729bg1.regs.screen_addr = 0;730bg1.regs.screen_size = 0;731bg2.regs.screen_addr = 0;732bg2.regs.screen_size = 0;733bg3.regs.screen_addr = 0;734bg3.regs.screen_size = 0;735bg4.regs.screen_addr = 0;736bg4.regs.screen_size = 0;737738//$210b-$210c739bg1.regs.tiledata_addr = 0;740bg2.regs.tiledata_addr = 0;741bg3.regs.tiledata_addr = 0;742bg4.regs.tiledata_addr = 0;743744//$210d-$2114745regs.mode7_hoffset = 0;746regs.mode7_voffset = 0;747bg1.regs.hoffset = 0;748bg1.regs.voffset = 0;749bg2.regs.hoffset = 0;750bg2.regs.voffset = 0;751bg3.regs.hoffset = 0;752bg3.regs.voffset = 0;753bg4.regs.hoffset = 0;754bg4.regs.voffset = 0;755756//$2115757regs.vram_incmode = 0;758regs.vram_mapping = 0;759regs.vram_incsize = 1;760761//$2116-$2117762regs.vram_addr = 0;763764//$211a765regs.mode7_repeat = 0;766regs.mode7_vflip = 0;767regs.mode7_hflip = 0;768769//$211b-$2120770regs.m7a = 0;771regs.m7b = 0;772regs.m7c = 0;773regs.m7d = 0;774regs.m7x = 0;775regs.m7y = 0;776777//$2121778regs.cgram_addr = 0;779780//$2123-$2125781bg1.window.one_enable = 0;782bg1.window.one_invert = 0;783bg1.window.two_enable = 0;784bg1.window.two_invert = 0;785786bg2.window.one_enable = 0;787bg2.window.one_invert = 0;788bg2.window.two_enable = 0;789bg2.window.two_invert = 0;790791bg3.window.one_enable = 0;792bg3.window.one_invert = 0;793bg3.window.two_enable = 0;794bg3.window.two_invert = 0;795796bg4.window.one_enable = 0;797bg4.window.one_invert = 0;798bg4.window.two_enable = 0;799bg4.window.two_invert = 0;800801sprite.window.one_enable = 0;802sprite.window.one_invert = 0;803sprite.window.two_enable = 0;804sprite.window.two_invert = 0;805806screen.window.one_enable = 0;807screen.window.one_invert = 0;808screen.window.two_enable = 0;809screen.window.two_invert = 0;810811//$2126-$2129812regs.window_one_left = 0;813regs.window_one_right = 0;814regs.window_two_left = 0;815regs.window_two_right = 0;816817//$212a-$212b818bg1.window.mask = 0;819bg2.window.mask = 0;820bg3.window.mask = 0;821bg4.window.mask = 0;822sprite.window.mask = 0;823screen.window.mask = 0;824825//$212c826bg1.regs.main_enable = 0;827bg2.regs.main_enable = 0;828bg3.regs.main_enable = 0;829bg4.regs.main_enable = 0;830sprite.regs.main_enable = 0;831832//$212d833bg1.regs.sub_enable = 0;834bg2.regs.sub_enable = 0;835bg3.regs.sub_enable = 0;836bg4.regs.sub_enable = 0;837sprite.regs.sub_enable = 0;838839//$212e840bg1.window.main_enable = 0;841bg2.window.main_enable = 0;842bg3.window.main_enable = 0;843bg4.window.main_enable = 0;844sprite.window.main_enable = 0;845846//$212f847bg1.window.sub_enable = 0;848bg2.window.sub_enable = 0;849bg3.window.sub_enable = 0;850bg4.window.sub_enable = 0;851sprite.window.sub_enable = 0;852853//$2130854screen.window.main_mask = 0;855screen.window.sub_mask = 0;856screen.regs.addsub_mode = 0;857screen.regs.direct_color = 0;858859//$2131860screen.regs.color_mode = 0;861screen.regs.color_halve = 0;862screen.regs.color_enable[6] = 0;863screen.regs.color_enable[5] = 0;864screen.regs.color_enable[4] = 0;865screen.regs.color_enable[3] = 0;866screen.regs.color_enable[2] = 0;867screen.regs.color_enable[1] = 0;868screen.regs.color_enable[0] = 0;869870//$2132871screen.regs.color_b = 0;872screen.regs.color_g = 0;873screen.regs.color_r = 0;874screen.regs.color = 0;875876//$2133877regs.mode7_extbg = 0;878regs.pseudo_hires = 0;879regs.overscan = 0;880sprite.regs.interlace = 0;881regs.interlace = 0;882883//$213e884sprite.regs.time_over = 0;885sprite.regs.range_over = 0;886887mmio_update_video_mode();888}889890#endif891892893