Path: blob/master/libsnes/bsnes/snes/alt/ppu-compatibility/mmio/mmio.cpp
2 views
#ifdef PPU_CPP12//INIDISP3void PPU::mmio_w2100(uint8 value) {4if(regs.display_disabled == true && cpu.vcounter() == (!overscan() ? 225 : 240)) {5regs.oam_addr = regs.oam_baseaddr << 1;6regs.oam_firstsprite = (regs.oam_priority == false) ? 0 : (regs.oam_addr >> 2) & 127;7}89regs.display_disabled = !!(value & 0x80);10regs.display_brightness = value & 15;11}1213//OBSEL14void PPU::mmio_w2101(uint8 value) {15regs.oam_basesize = (value >> 5) & 7;16regs.oam_nameselect = (value >> 3) & 3;17regs.oam_tdaddr = (value & 3) << 14;18}1920//OAMADDL21void PPU::mmio_w2102(uint8 data) {22regs.oam_baseaddr = (regs.oam_baseaddr & ~0xff) | (data << 0);23regs.oam_baseaddr &= 0x01ff;24regs.oam_addr = regs.oam_baseaddr << 1;25regs.oam_firstsprite = (regs.oam_priority == false) ? 0 : (regs.oam_addr >> 2) & 127;26}2728//OAMADDH29void PPU::mmio_w2103(uint8 data) {30regs.oam_priority = !!(data & 0x80);31regs.oam_baseaddr = (regs.oam_baseaddr & 0xff) | (data << 8);32regs.oam_baseaddr &= 0x01ff;33regs.oam_addr = regs.oam_baseaddr << 1;34regs.oam_firstsprite = (regs.oam_priority == false) ? 0 : (regs.oam_addr >> 2) & 127;35}3637//OAMDATA38void PPU::mmio_w2104(uint8 data) {39if((regs.oam_addr & 1) == 0) regs.oam_latchdata = data;4041if(regs.oam_addr & 0x0200) {42oam_mmio_write(regs.oam_addr, data);43} else if((regs.oam_addr & 1) == 1) {44oam_mmio_write((regs.oam_addr & ~1) + 0, regs.oam_latchdata);45oam_mmio_write((regs.oam_addr & ~1) + 1, data);46}4748regs.oam_addr++;49regs.oam_addr &= 0x03ff;50regs.oam_firstsprite = (regs.oam_priority == false) ? 0 : (regs.oam_addr >> 2) & 127;51}5253//BGMODE54void PPU::mmio_w2105(uint8 value) {55regs.bg_tilesize[BG4] = !!(value & 0x80);56regs.bg_tilesize[BG3] = !!(value & 0x40);57regs.bg_tilesize[BG2] = !!(value & 0x20);58regs.bg_tilesize[BG1] = !!(value & 0x10);59regs.bg3_priority = !!(value & 0x08);60regs.bg_mode = (value & 7);61}6263//MOSAIC64void PPU::mmio_w2106(uint8 value) {65regs.mosaic_size = (value >> 4) & 15;66regs.mosaic_enabled[BG4] = !!(value & 0x08);67regs.mosaic_enabled[BG3] = !!(value & 0x04);68regs.mosaic_enabled[BG2] = !!(value & 0x02);69regs.mosaic_enabled[BG1] = !!(value & 0x01);70}7172//BG1SC73void PPU::mmio_w2107(uint8 value) {74regs.bg_scaddr[BG1] = (value & 0x7c) << 9;75regs.bg_scsize[BG1] = value & 3;76}7778//BG2SC79void PPU::mmio_w2108(uint8 value) {80regs.bg_scaddr[BG2] = (value & 0x7c) << 9;81regs.bg_scsize[BG2] = value & 3;82}8384//BG3SC85void PPU::mmio_w2109(uint8 value) {86regs.bg_scaddr[BG3] = (value & 0x7c) << 9;87regs.bg_scsize[BG3] = value & 3;88}8990//BG4SC91void PPU::mmio_w210a(uint8 value) {92regs.bg_scaddr[BG4] = (value & 0x7c) << 9;93regs.bg_scsize[BG4] = value & 3;94}9596//BG12NBA97void PPU::mmio_w210b(uint8 value) {98regs.bg_tdaddr[BG1] = (value & 0x07) << 13;99regs.bg_tdaddr[BG2] = (value & 0x70) << 9;100}101102//BG34NBA103void PPU::mmio_w210c(uint8 value) {104regs.bg_tdaddr[BG3] = (value & 0x07) << 13;105regs.bg_tdaddr[BG4] = (value & 0x70) << 9;106}107108//BG1HOFS109void PPU::mmio_w210d(uint8 value) {110regs.m7_hofs = (value << 8) | regs.m7_latch;111regs.m7_latch = value;112113regs.bg_hofs[BG1] = (value << 8) | (regs.bg_ofslatch & ~7) | ((regs.bg_hofs[BG1] >> 8) & 7);114regs.bg_ofslatch = value;115}116117//BG1VOFS118void PPU::mmio_w210e(uint8 value) {119regs.m7_vofs = (value << 8) | regs.m7_latch;120regs.m7_latch = value;121122regs.bg_vofs[BG1] = (value << 8) | (regs.bg_ofslatch);123regs.bg_ofslatch = value;124}125126//BG2HOFS127void PPU::mmio_w210f(uint8 value) {128regs.bg_hofs[BG2] = (value << 8) | (regs.bg_ofslatch & ~7) | ((regs.bg_hofs[BG2] >> 8) & 7);129regs.bg_ofslatch = value;130}131132//BG2VOFS133void PPU::mmio_w2110(uint8 value) {134regs.bg_vofs[BG2] = (value << 8) | (regs.bg_ofslatch);135regs.bg_ofslatch = value;136}137138//BG3HOFS139void PPU::mmio_w2111(uint8 value) {140regs.bg_hofs[BG3] = (value << 8) | (regs.bg_ofslatch & ~7) | ((regs.bg_hofs[BG3] >> 8) & 7);141regs.bg_ofslatch = value;142}143144//BG3VOFS145void PPU::mmio_w2112(uint8 value) {146regs.bg_vofs[BG3] = (value << 8) | (regs.bg_ofslatch);147regs.bg_ofslatch = value;148}149150//BG4HOFS151void PPU::mmio_w2113(uint8 value) {152regs.bg_hofs[BG4] = (value << 8) | (regs.bg_ofslatch & ~7) | ((regs.bg_hofs[BG4] >> 8) & 7);153regs.bg_ofslatch = value;154}155156//BG4VOFS157void PPU::mmio_w2114(uint8 value) {158regs.bg_vofs[BG4] = (value << 8) | (regs.bg_ofslatch);159regs.bg_ofslatch = value;160}161162//VMAIN163void PPU::mmio_w2115(uint8 value) {164regs.vram_incmode = !!(value & 0x80);165regs.vram_mapping = (value >> 2) & 3;166switch(value & 3) {167case 0: regs.vram_incsize = 1; break;168case 1: regs.vram_incsize = 32; break;169case 2: regs.vram_incsize = 128; break;170case 3: regs.vram_incsize = 128; break;171}172}173174//VMADDL175void PPU::mmio_w2116(uint8 value) {176regs.vram_addr = (regs.vram_addr & 0xff00) | value;177uint16 addr = get_vram_address();178regs.vram_readbuffer = vram_mmio_read(addr + 0);179regs.vram_readbuffer |= vram_mmio_read(addr + 1) << 8;180}181182//VMADDH183void PPU::mmio_w2117(uint8 value) {184regs.vram_addr = (value << 8) | (regs.vram_addr & 0x00ff);185uint16 addr = get_vram_address();186regs.vram_readbuffer = vram_mmio_read(addr + 0);187regs.vram_readbuffer |= vram_mmio_read(addr + 1) << 8;188}189190//VMDATAL191void PPU::mmio_w2118(uint8 value) {192uint16 addr = get_vram_address();193vram_mmio_write(addr, value);194bg_tiledata_state[TILE_2BIT][(addr >> 4)] = 1;195bg_tiledata_state[TILE_4BIT][(addr >> 5)] = 1;196bg_tiledata_state[TILE_8BIT][(addr >> 6)] = 1;197198if(regs.vram_incmode == 0) {199regs.vram_addr += regs.vram_incsize;200}201}202203//VMDATAH204void PPU::mmio_w2119(uint8 value) {205uint16 addr = get_vram_address() + 1;206vram_mmio_write(addr, value);207bg_tiledata_state[TILE_2BIT][(addr >> 4)] = 1;208bg_tiledata_state[TILE_4BIT][(addr >> 5)] = 1;209bg_tiledata_state[TILE_8BIT][(addr >> 6)] = 1;210211if(regs.vram_incmode == 1) {212regs.vram_addr += regs.vram_incsize;213}214}215216//M7SEL217void PPU::mmio_w211a(uint8 value) {218regs.mode7_repeat = (value >> 6) & 3;219regs.mode7_vflip = !!(value & 0x02);220regs.mode7_hflip = !!(value & 0x01);221}222223//M7A224void PPU::mmio_w211b(uint8 value) {225regs.m7a = (value << 8) | regs.m7_latch;226regs.m7_latch = value;227}228229//M7B230void PPU::mmio_w211c(uint8 value) {231regs.m7b = (value << 8) | regs.m7_latch;232regs.m7_latch = value;233}234235//M7C236void PPU::mmio_w211d(uint8 value) {237regs.m7c = (value << 8) | regs.m7_latch;238regs.m7_latch = value;239}240241//M7D242void PPU::mmio_w211e(uint8 value) {243regs.m7d = (value << 8) | regs.m7_latch;244regs.m7_latch = value;245}246247//M7X248void PPU::mmio_w211f(uint8 value) {249regs.m7x = (value << 8) | regs.m7_latch;250regs.m7_latch = value;251}252253//M7Y254void PPU::mmio_w2120(uint8 value) {255regs.m7y = (value << 8) | regs.m7_latch;256regs.m7_latch = value;257}258259//CGADD260void PPU::mmio_w2121(uint8 value) {261regs.cgram_addr = value << 1;262}263264//CGDATA265//note: CGRAM palette data format is 15-bits266//(0,bbbbb,ggggg,rrrrr). Highest bit is ignored,267//as evidenced by $213b CGRAM data reads.268//269//anomie indicates writes to CGDATA work the same270//as writes to OAMDATA's low table. need to verify271//this on hardware.272void PPU::mmio_w2122(uint8 value) {273if(!(regs.cgram_addr & 1)) {274regs.cgram_latchdata = value;275} else {276cgram_mmio_write((regs.cgram_addr & 0x01fe), regs.cgram_latchdata);277cgram_mmio_write((regs.cgram_addr & 0x01fe) + 1, value & 0x7f);278}279regs.cgram_addr++;280regs.cgram_addr &= 0x01ff;281}282283//W12SEL284void PPU::mmio_w2123(uint8 value) {285regs.window2_enabled[BG2] = !!(value & 0x80);286regs.window2_invert [BG2] = !!(value & 0x40);287regs.window1_enabled[BG2] = !!(value & 0x20);288regs.window1_invert [BG2] = !!(value & 0x10);289regs.window2_enabled[BG1] = !!(value & 0x08);290regs.window2_invert [BG1] = !!(value & 0x04);291regs.window1_enabled[BG1] = !!(value & 0x02);292regs.window1_invert [BG1] = !!(value & 0x01);293}294295//W34SEL296void PPU::mmio_w2124(uint8 value) {297regs.window2_enabled[BG4] = !!(value & 0x80);298regs.window2_invert [BG4] = !!(value & 0x40);299regs.window1_enabled[BG4] = !!(value & 0x20);300regs.window1_invert [BG4] = !!(value & 0x10);301regs.window2_enabled[BG3] = !!(value & 0x08);302regs.window2_invert [BG3] = !!(value & 0x04);303regs.window1_enabled[BG3] = !!(value & 0x02);304regs.window1_invert [BG3] = !!(value & 0x01);305}306307//WOBJSEL308void PPU::mmio_w2125(uint8 value) {309regs.window2_enabled[COL] = !!(value & 0x80);310regs.window2_invert [COL] = !!(value & 0x40);311regs.window1_enabled[COL] = !!(value & 0x20);312regs.window1_invert [COL] = !!(value & 0x10);313regs.window2_enabled[OAM] = !!(value & 0x08);314regs.window2_invert [OAM] = !!(value & 0x04);315regs.window1_enabled[OAM] = !!(value & 0x02);316regs.window1_invert [OAM] = !!(value & 0x01);317}318319//WH0320void PPU::mmio_w2126(uint8 value) {321regs.window1_left = value;322}323324//WH1325void PPU::mmio_w2127(uint8 value) {326regs.window1_right = value;327}328329//WH2330void PPU::mmio_w2128(uint8 value) {331regs.window2_left = value;332}333334//WH3335void PPU::mmio_w2129(uint8 value) {336regs.window2_right = value;337}338339//WBGLOG340void PPU::mmio_w212a(uint8 value) {341regs.window_mask[BG4] = (value >> 6) & 3;342regs.window_mask[BG3] = (value >> 4) & 3;343regs.window_mask[BG2] = (value >> 2) & 3;344regs.window_mask[BG1] = (value ) & 3;345}346347//WOBJLOG348void PPU::mmio_w212b(uint8 value) {349regs.window_mask[COL] = (value >> 2) & 3;350regs.window_mask[OAM] = (value ) & 3;351}352353//TM354void PPU::mmio_w212c(uint8 value) {355regs.bg_enabled[OAM] = !!(value & 0x10);356regs.bg_enabled[BG4] = !!(value & 0x08);357regs.bg_enabled[BG3] = !!(value & 0x04);358regs.bg_enabled[BG2] = !!(value & 0x02);359regs.bg_enabled[BG1] = !!(value & 0x01);360}361362//TS363void PPU::mmio_w212d(uint8 value) {364regs.bgsub_enabled[OAM] = !!(value & 0x10);365regs.bgsub_enabled[BG4] = !!(value & 0x08);366regs.bgsub_enabled[BG3] = !!(value & 0x04);367regs.bgsub_enabled[BG2] = !!(value & 0x02);368regs.bgsub_enabled[BG1] = !!(value & 0x01);369}370371//TMW372void PPU::mmio_w212e(uint8 value) {373regs.window_enabled[OAM] = !!(value & 0x10);374regs.window_enabled[BG4] = !!(value & 0x08);375regs.window_enabled[BG3] = !!(value & 0x04);376regs.window_enabled[BG2] = !!(value & 0x02);377regs.window_enabled[BG1] = !!(value & 0x01);378}379380//TSW381void PPU::mmio_w212f(uint8 value) {382regs.sub_window_enabled[OAM] = !!(value & 0x10);383regs.sub_window_enabled[BG4] = !!(value & 0x08);384regs.sub_window_enabled[BG3] = !!(value & 0x04);385regs.sub_window_enabled[BG2] = !!(value & 0x02);386regs.sub_window_enabled[BG1] = !!(value & 0x01);387}388389//CGWSEL390void PPU::mmio_w2130(uint8 value) {391regs.color_mask = (value >> 6) & 3;392regs.colorsub_mask = (value >> 4) & 3;393regs.addsub_mode = !!(value & 0x02);394regs.direct_color = !!(value & 0x01);395}396397//CGADDSUB398void PPU::mmio_w2131(uint8 value) {399regs.color_mode = !!(value & 0x80);400regs.color_halve = !!(value & 0x40);401regs.color_enabled[BACK] = !!(value & 0x20);402regs.color_enabled[OAM] = !!(value & 0x10);403regs.color_enabled[BG4] = !!(value & 0x08);404regs.color_enabled[BG3] = !!(value & 0x04);405regs.color_enabled[BG2] = !!(value & 0x02);406regs.color_enabled[BG1] = !!(value & 0x01);407}408409//COLDATA410void PPU::mmio_w2132(uint8 value) {411if(value & 0x80) regs.color_b = value & 0x1f;412if(value & 0x40) regs.color_g = value & 0x1f;413if(value & 0x20) regs.color_r = value & 0x1f;414415regs.color_rgb = (regs.color_r)416| (regs.color_g << 5)417| (regs.color_b << 10);418}419420//SETINI421void PPU::mmio_w2133(uint8 value) {422regs.mode7_extbg = !!(value & 0x40);423regs.pseudo_hires = !!(value & 0x08);424regs.overscan = !!(value & 0x04);425regs.oam_interlace = !!(value & 0x02);426regs.interlace = !!(value & 0x01);427428display.overscan = regs.overscan;429sprite_list_valid = false;430}431432//MPYL433uint8 PPU::mmio_r2134() {434uint32 r;435r = ((int16)regs.m7a * (int8)(regs.m7b >> 8));436regs.ppu1_mdr = r;437return regs.ppu1_mdr;438}439440//MPYM441uint8 PPU::mmio_r2135() {442uint32 r;443r = ((int16)regs.m7a * (int8)(regs.m7b >> 8));444regs.ppu1_mdr = r >> 8;445return regs.ppu1_mdr;446}447448//MPYH449uint8 PPU::mmio_r2136() {450uint32 r;451r = ((int16)regs.m7a * (int8)(regs.m7b >> 8));452regs.ppu1_mdr = r >> 16;453return regs.ppu1_mdr;454}455456//SLHV457uint8 PPU::mmio_r2137() {458if(cpu.pio() & 0x80) {459latch_counters();460}461return cpu.regs.mdr;462}463464//OAMDATAREAD465uint8 PPU::mmio_r2138() {466regs.ppu1_mdr = oam_mmio_read(regs.oam_addr);467468regs.oam_addr++;469regs.oam_addr &= 0x03ff;470regs.oam_firstsprite = (regs.oam_priority == false) ? 0 : (regs.oam_addr >> 2) & 127;471472return regs.ppu1_mdr;473}474475//VMDATALREAD476uint8 PPU::mmio_r2139() {477uint16 addr = get_vram_address();478regs.ppu1_mdr = regs.vram_readbuffer;479if(regs.vram_incmode == 0) {480addr &= 0xfffe;481regs.vram_readbuffer = vram_mmio_read(addr + 0);482regs.vram_readbuffer |= vram_mmio_read(addr + 1) << 8;483regs.vram_addr += regs.vram_incsize;484}485return regs.ppu1_mdr;486}487488//VMDATAHREAD489uint8 PPU::mmio_r213a() {490uint16 addr = get_vram_address() + 1;491regs.ppu1_mdr = regs.vram_readbuffer >> 8;492if(regs.vram_incmode == 1) {493addr &= 0xfffe;494regs.vram_readbuffer = vram_mmio_read(addr + 0);495regs.vram_readbuffer |= vram_mmio_read(addr + 1) << 8;496regs.vram_addr += regs.vram_incsize;497}498return regs.ppu1_mdr;499}500501//CGDATAREAD502//note: CGRAM palette data is 15-bits (0,bbbbb,ggggg,rrrrr)503//therefore, the high byte read from each color does not504//update bit 7 of the PPU2 MDR.505uint8 PPU::mmio_r213b() {506if(!(regs.cgram_addr & 1)) {507regs.ppu2_mdr = cgram_mmio_read(regs.cgram_addr) & 0xff;508} else {509regs.ppu2_mdr &= 0x80;510regs.ppu2_mdr |= cgram_mmio_read(regs.cgram_addr) & 0x7f;511}512regs.cgram_addr++;513regs.cgram_addr &= 0x01ff;514return regs.ppu2_mdr;515}516517//OPHCT518uint8 PPU::mmio_r213c() {519if(!regs.latch_hcounter) {520regs.ppu2_mdr = regs.hcounter & 0xff;521} else {522regs.ppu2_mdr &= 0xfe;523regs.ppu2_mdr |= (regs.hcounter >> 8) & 1;524}525regs.latch_hcounter ^= 1;526return regs.ppu2_mdr;527}528529//OPVCT530uint8 PPU::mmio_r213d() {531if(!regs.latch_vcounter) {532regs.ppu2_mdr = regs.vcounter & 0xff;533} else {534regs.ppu2_mdr &= 0xfe;535regs.ppu2_mdr |= (regs.vcounter >> 8) & 1;536}537regs.latch_vcounter ^= 1;538return regs.ppu2_mdr;539}540541//STAT77542uint8 PPU::mmio_r213e() {543uint8 r = 0x00;544r |= (regs.time_over) ? 0x80 : 0x00;545r |= (regs.range_over) ? 0x40 : 0x00;546r |= (regs.ppu1_mdr & 0x10);547r |= (ppu1_version & 0x0f);548regs.ppu1_mdr = r;549return regs.ppu1_mdr;550}551552//STAT78553uint8 PPU::mmio_r213f() {554uint8 r = 0x00;555regs.latch_hcounter = 0;556regs.latch_vcounter = 0;557558r |= cpu.field() << 7;559if(!(cpu.pio() & 0x80)) {560r |= 0x40;561} else if(regs.counters_latched == true) {562r |= 0x40;563regs.counters_latched = false;564}565r |= (regs.ppu2_mdr & 0x20);566r |= (region << 4); //0 = NTSC, 1 = PAL567r |= (ppu2_version & 0x0f);568regs.ppu2_mdr = r;569return regs.ppu2_mdr;570}571572uint8 PPU::mmio_read(unsigned addr) {573cpu.synchronize_ppu();574575switch(addr & 0xffff) {576case 0x2104:577case 0x2105:578case 0x2106:579case 0x2108:580case 0x2109:581case 0x210a:582case 0x2114:583case 0x2115:584case 0x2116:585case 0x2118:586case 0x2119:587case 0x211a:588case 0x2124:589case 0x2125:590case 0x2126:591case 0x2128:592case 0x2129:593case 0x212a: return regs.ppu1_mdr;594case 0x2134: return mmio_r2134(); //MPYL595case 0x2135: return mmio_r2135(); //MPYM596case 0x2136: return mmio_r2136(); //MPYH597case 0x2137: return mmio_r2137(); //SLHV598case 0x2138: return mmio_r2138(); //OAMDATAREAD599case 0x2139: return mmio_r2139(); //VMDATALREAD600case 0x213a: return mmio_r213a(); //VMDATAHREAD601case 0x213b: return mmio_r213b(); //CGDATAREAD602case 0x213c: return mmio_r213c(); //OPHCT603case 0x213d: return mmio_r213d(); //OPVCT604case 0x213e: return mmio_r213e(); //STAT77605case 0x213f: return mmio_r213f(); //STAT78606}607608return cpu.regs.mdr;609}610611void PPU::mmio_write(unsigned addr, uint8 data) {612cpu.synchronize_ppu();613614switch(addr & 0xffff) {615case 0x2100: return mmio_w2100(data); //INIDISP616case 0x2101: return mmio_w2101(data); //OBSEL617case 0x2102: return mmio_w2102(data); //OAMADDL618case 0x2103: return mmio_w2103(data); //OAMADDH619case 0x2104: return mmio_w2104(data); //OAMDATA620case 0x2105: return mmio_w2105(data); //BGMODE621case 0x2106: return mmio_w2106(data); //MOSAIC622case 0x2107: return mmio_w2107(data); //BG1SC623case 0x2108: return mmio_w2108(data); //BG2SC624case 0x2109: return mmio_w2109(data); //BG3SC625case 0x210a: return mmio_w210a(data); //BG4SC626case 0x210b: return mmio_w210b(data); //BG12NBA627case 0x210c: return mmio_w210c(data); //BG34NBA628case 0x210d: return mmio_w210d(data); //BG1HOFS629case 0x210e: return mmio_w210e(data); //BG1VOFS630case 0x210f: return mmio_w210f(data); //BG2HOFS631case 0x2110: return mmio_w2110(data); //BG2VOFS632case 0x2111: return mmio_w2111(data); //BG3HOFS633case 0x2112: return mmio_w2112(data); //BG3VOFS634case 0x2113: return mmio_w2113(data); //BG4HOFS635case 0x2114: return mmio_w2114(data); //BG4VOFS636case 0x2115: return mmio_w2115(data); //VMAIN637case 0x2116: return mmio_w2116(data); //VMADDL638case 0x2117: return mmio_w2117(data); //VMADDH639case 0x2118: return mmio_w2118(data); //VMDATAL640case 0x2119: return mmio_w2119(data); //VMDATAH641case 0x211a: return mmio_w211a(data); //M7SEL642case 0x211b: return mmio_w211b(data); //M7A643case 0x211c: return mmio_w211c(data); //M7B644case 0x211d: return mmio_w211d(data); //M7C645case 0x211e: return mmio_w211e(data); //M7D646case 0x211f: return mmio_w211f(data); //M7X647case 0x2120: return mmio_w2120(data); //M7Y648case 0x2121: return mmio_w2121(data); //CGADD649case 0x2122: return mmio_w2122(data); //CGDATA650case 0x2123: return mmio_w2123(data); //W12SEL651case 0x2124: return mmio_w2124(data); //W34SEL652case 0x2125: return mmio_w2125(data); //WOBJSEL653case 0x2126: return mmio_w2126(data); //WH0654case 0x2127: return mmio_w2127(data); //WH1655case 0x2128: return mmio_w2128(data); //WH2656case 0x2129: return mmio_w2129(data); //WH3657case 0x212a: return mmio_w212a(data); //WBGLOG658case 0x212b: return mmio_w212b(data); //WOBJLOG659case 0x212c: return mmio_w212c(data); //TM660case 0x212d: return mmio_w212d(data); //TS661case 0x212e: return mmio_w212e(data); //TMW662case 0x212f: return mmio_w212f(data); //TSW663case 0x2130: return mmio_w2130(data); //CGWSEL664case 0x2131: return mmio_w2131(data); //CGADDSUB665case 0x2132: return mmio_w2132(data); //COLDATA666case 0x2133: return mmio_w2133(data); //SETINI667}668}669670#endif671672673