- [NEW] Window implementada
This commit is contained in:
44
gbscreen.cpp
44
gbscreen.cpp
@@ -135,6 +135,10 @@ namespace gbscreen
|
|||||||
void fill_line_buffer_bkg(uint8_t LY)
|
void fill_line_buffer_bkg(uint8_t LY)
|
||||||
{
|
{
|
||||||
const uint8_t LCDC = mem::readMem(0xff40);
|
const uint8_t LCDC = mem::readMem(0xff40);
|
||||||
|
if ((LCDC & 0x1) == 0) {
|
||||||
|
for (int i=0; i<160; ++i) line_buffer[i]=0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
const uint8_t SCY = mem::readMem(0xff42);
|
const uint8_t SCY = mem::readMem(0xff42);
|
||||||
const uint8_t SCX = mem::readMem(0xff43);
|
const uint8_t SCX = mem::readMem(0xff43);
|
||||||
const uint8_t BGP = mem::readMem(0xff47);
|
const uint8_t BGP = mem::readMem(0xff47);
|
||||||
@@ -169,6 +173,45 @@ namespace gbscreen
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void fill_line_buffer_win(uint8_t LY)
|
||||||
|
{
|
||||||
|
const uint8_t LCDC = mem::readMem(0xff40);
|
||||||
|
if ((LCDC & 0x21) == 0) return;
|
||||||
|
const uint8_t WY = mem::readMem(0xff4a);
|
||||||
|
if (LY<WY) return;
|
||||||
|
const uint8_t WX = mem::readMem(0xff4b);
|
||||||
|
const uint8_t BGP = mem::readMem(0xff47);
|
||||||
|
const uint16_t ty = uint8_t(LY-WY) >> 3;
|
||||||
|
const uint8_t ly = uint8_t(LY-WY) & 0x7;
|
||||||
|
uint8_t ox = WX<7 ? 7-WX : 0;
|
||||||
|
uint16_t tx = 0;
|
||||||
|
|
||||||
|
uint16_t base_tilemap_address = LCDC&0x40 ? 0x9c00 : 0x9800;
|
||||||
|
|
||||||
|
int pi = WX<7 ? 0 : WX-7;
|
||||||
|
while(true) {
|
||||||
|
uint16_t tilemap_address = base_tilemap_address + tx + (ty<<5);
|
||||||
|
uint16_t tile = mem::readMem(tilemap_address);
|
||||||
|
uint16_t base_tile_address = 0x8000;
|
||||||
|
if ( ((LCDC&0x10)==0) && (tile<128) ) base_tile_address = 0x9000;
|
||||||
|
uint16_t tile_address = base_tile_address + (tile<<4) + (ly*2);
|
||||||
|
|
||||||
|
uint8_t a = mem::readMem(tile_address);
|
||||||
|
uint8_t b = mem::readMem(tile_address+1);
|
||||||
|
for (int i=0; i<8; ++i) {
|
||||||
|
if (ox==0) {
|
||||||
|
uint8_t index = (a&0x80 ? 1 : 0) + (b&0x80 ? 2 : 0 );
|
||||||
|
line_buffer[pi++] = (BGP >> (index*2)) & 0x3;
|
||||||
|
} else {
|
||||||
|
ox--;
|
||||||
|
}
|
||||||
|
a=a<<1; b=b<<1;
|
||||||
|
if (pi==160) return;
|
||||||
|
}
|
||||||
|
tx = (tx+1)&0x1f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
struct oam_entry_t
|
struct oam_entry_t
|
||||||
{
|
{
|
||||||
uint8_t y, x, tile, attr;
|
uint8_t y, x, tile, attr;
|
||||||
@@ -288,6 +331,7 @@ namespace gbscreen
|
|||||||
STAT = (STAT & 0xFC) | 0x02; // Set mode 2
|
STAT = (STAT & 0xFC) | 0x02; // Set mode 2
|
||||||
if (STAT&0x20) stat_interrupt = true;
|
if (STAT&0x20) stat_interrupt = true;
|
||||||
fill_line_buffer_bkg(LY);
|
fill_line_buffer_bkg(LY);
|
||||||
|
fill_line_buffer_win(LY);
|
||||||
fill_line_buffer_obj(LY);
|
fill_line_buffer_obj(LY);
|
||||||
}
|
}
|
||||||
else if (LY==154)
|
else if (LY==154)
|
||||||
|
|||||||
Reference in New Issue
Block a user