Path: blob/master/libsnes/bsnes/gameboy/lcd/mmio/mmio.cpp
2 views
#ifdef LCD_CPP12unsigned LCD::vram_addr(uint16 addr) const {3return (status.vram_bank * 0x2000) + (addr & 0x1fff);4}56uint8 LCD::mmio_read(uint16 addr) {7if(addr >= 0x8000 && addr <= 0x9fff) return vram[vram_addr(addr)];8if(addr >= 0xfe00 && addr <= 0xfe9f) return oam[addr & 0xff];910if(addr == 0xff40) { //LCDC11return (status.display_enable << 7)12| (status.window_tilemap_select << 6)13| (status.window_display_enable << 5)14| (status.bg_tiledata_select << 4)15| (status.bg_tilemap_select << 3)16| (status.ob_size << 2)17| (status.ob_enable << 1)18| (status.bg_enable << 0);19}2021if(addr == 0xff41) { //STAT22unsigned mode;23if(status.ly >= 144) mode = 1; //Vblank24else if(status.lx < 80) mode = 2; //OAM25else if(status.lx < 252) mode = 3; //LCD26else mode = 0; //Hblank2728return (status.interrupt_lyc << 6)29| (status.interrupt_oam << 5)30| (status.interrupt_vblank << 4)31| (status.interrupt_hblank << 3)32| ((status.ly == status.lyc) << 2)33| (mode << 0);34}3536if(addr == 0xff42) { //SCY37return status.scy;38}3940if(addr == 0xff43) { //SCX41return status.scx;42}4344if(addr == 0xff44) { //LY45return status.ly;46}4748if(addr == 0xff45) { //LYC49return status.lyc;50}5152if(addr == 0xff47) { //BGP53return (bgp[3] << 6)54| (bgp[2] << 4)55| (bgp[1] << 2)56| (bgp[0] << 0);57}5859if(addr == 0xff48) { //OBP060return (obp[0][3] << 6)61| (obp[0][2] << 4)62| (obp[0][1] << 2)63| (obp[0][0] << 0);64}6566if(addr == 0xff49) { //OBP167return (obp[1][3] << 6)68| (obp[1][2] << 4)69| (obp[1][1] << 2)70| (obp[1][0] << 0);71}7273if(addr == 0xff4a) { //WY74return status.wy;75}7677if(addr == 0xff4b) { //WX78return status.wx;79}8081if(addr == 0xff69) { //BGPD82return bgpd[status.bgpi];83}8485if(addr == 0xff6b) { //OBPD86return obpd[status.obpi];87}8889return 0x00;90}9192void LCD::mmio_write(uint16 addr, uint8 data) {93if(addr >= 0x8000 && addr <= 0x9fff) { vram[vram_addr(addr)] = data; return; }94if(addr >= 0xfe00 && addr <= 0xfe9f) { oam[addr & 0xff] = data; return; }9596if(addr == 0xff40) { //LCDC97if(status.display_enable == false && (data & 0x80)) {98status.lx = 0; //unverified behavior; fixes Super Mario Land 2 - Tree Zone99}100101status.display_enable = data & 0x80;102status.window_tilemap_select = data & 0x40;103status.window_display_enable = data & 0x20;104status.bg_tiledata_select = data & 0x10;105status.bg_tilemap_select = data & 0x08;106status.ob_size = data & 0x04;107status.ob_enable = data & 0x02;108status.bg_enable = data & 0x01;109return;110}111112if(addr == 0xff41) { //STAT113status.interrupt_lyc = data & 0x40;114status.interrupt_oam = data & 0x20;115status.interrupt_vblank = data & 0x10;116status.interrupt_hblank = data & 0x08;117return;118}119120if(addr == 0xff42) { //SCY121status.scy = data;122return;123}124125if(addr == 0xff43) { //SCX126status.scx = data;127return;128}129130if(addr == 0xff44) { //LY131status.ly = 0;132return;133}134135if(addr == 0xff45) { //LYC136status.lyc = data;137return;138}139140if(addr == 0xff47) { //BGP141bgp[3] = (data >> 6) & 3;142bgp[2] = (data >> 4) & 3;143bgp[1] = (data >> 2) & 3;144bgp[0] = (data >> 0) & 3;145return;146}147148if(addr == 0xff48) { //OBP0149obp[0][3] = (data >> 6) & 3;150obp[0][2] = (data >> 4) & 3;151obp[0][1] = (data >> 2) & 3;152obp[0][0] = (data >> 0) & 3;153return;154}155156if(addr == 0xff49) { //OBP1157obp[1][3] = (data >> 6) & 3;158obp[1][2] = (data >> 4) & 3;159obp[1][1] = (data >> 2) & 3;160obp[1][0] = (data >> 0) & 3;161return;162}163164if(addr == 0xff4a) { //WY165status.wy = data;166return;167}168169if(addr == 0xff4b) { //WX170status.wx = data;171return;172}173174if(addr == 0xff4f) { //VBK175status.vram_bank = data & 1;176return;177}178179if(addr == 0xff68) { //BGPI180status.bgpi_increment = data & 0x80;181status.bgpi = data & 0x3f;182return;183}184185if(addr == 0xff69) { //BGPD186bgpd[status.bgpi] = data;187if(status.bgpi_increment) status.bgpi++;188return;189}190191if(addr == 0xff6a) { //OBPI192status.obpi_increment = data & 0x80;193status.obpi = data & 0x3f;194}195196if(addr == 0xff6b) { //OBPD197obpd[status.obpi] = data;198if(status.obpi_increment) status.obpi++;199}200}201202#endif203204205