Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void PPU::raster_scanline() {
- if((status.ly >= 240 && status.ly <= 260)) {
- for(unsigned x = 0; x < 341; x++) tick();
- return scanline();
- }
- raster.oam_iterator = 0;
- raster.oam_counter = 0;
- for(unsigned n = 0; n < 8; n++) {
- raster.soam[n].id = 64;
- raster.soam[n].y = 0xff;
- raster.soam[n].tile = 0xff;
- raster.soam[n].attr = 0xff;
- raster.soam[n].x = 0xff;
- raster.soam[n].tiledatalo = 0;
- raster.soam[n].tiledatahi = 0;
- }
- for(unsigned tile = 0; tile < 32; tile++) { // 0-255
- unsigned nametable = chr_load(0x2000 | (status.vaddr & 0x0fff));
- unsigned tileaddr = status.bg_addr + (nametable << 4) + (scrolly() & 7);
- raster_pixel();
- tick();
- raster_pixel();
- tick();
- unsigned attribute = chr_load(0x23c0 | (status.vaddr & 0x0fc0) | ((scrolly() >> 5) << 3) | (scrollx() >> 5));
- if(scrolly() & 16) attribute >>= 4;
- if(scrollx() & 16) attribute >>= 2;
- raster_pixel();
- tick();
- scrollx_increment();
- if(tile == 31) scrolly_increment();
- raster_pixel();
- raster_sprite();
- tick();
- unsigned tiledatalo = chr_load(tileaddr + 0);
- raster_pixel();
- tick();
- raster_pixel();
- tick();
- unsigned tiledatahi = chr_load(tileaddr + 8);
- raster_pixel();
- tick();
- raster_pixel();
- raster_sprite();
- tick();
- raster.nametable = (raster.nametable << 8) | nametable;
- raster.attribute = (raster.attribute << 2) | (attribute & 3);
- raster.tiledatalo = (raster.tiledatalo << 8) | tiledatalo;
- raster.tiledatahi = (raster.tiledatahi << 8) | tiledatahi;
- }
- for(unsigned n = 0; n < 8; n++) raster.oam[n] = raster.soam[n];
- for(unsigned sprite = 0; sprite < 8; sprite++) { //256-319
- unsigned nametable = chr_load(0x2000 | (status.vaddr & 0x0fff));
- tick();
- if(raster_enable() && sprite == 0) status.vaddr = (status.vaddr & 0x7be0) | (status.taddr & 0x041f); //257
- tick();
- unsigned attribute = chr_load(0x23c0 | (status.vaddr & 0x0fc0) | ((scrolly() >> 5) << 3) | (scrollx() >> 5));
- unsigned tileaddr = (sprite_height() == 8)
- ? status.sprite_addr + raster.oam[sprite].tile * 16
- : ((raster.oam[sprite].tile & ~1) * 16) + ((raster.oam[sprite].tile & 1) * 0x1000);
- tick();
- tick();
- unsigned spritey = (status.ly - raster.oam[sprite].y) & (sprite_height() - 1);
- if(raster.oam[sprite].attr & 0x80) spritey ^= (sprite_height() - 1);
- tileaddr += spritey + (spritey & 8);
- raster.oam[sprite].tiledatalo = chr_load(tileaddr + 0);
- tick();
- tick();
- raster.oam[sprite].tiledatahi = chr_load(tileaddr + 8);
- tick();
- tick();
- if(raster_enable() && sprite == 6 && status.ly == 261) status.vaddr = status.taddr; //304
- }
- for(unsigned tile = 0; tile < 2; tile++) { //320-335
- unsigned nametable = chr_load(0x2000 | (status.vaddr & 0x0fff));
- unsigned tileaddr = status.bg_addr + (nametable << 4) + (scrolly() & 7);
- tick();
- tick();
- unsigned attribute = chr_load(0x23c0 | (status.vaddr & 0x0fc0) | ((scrolly() >> 5) << 3) | (scrollx() >> 5));
- if(scrolly() & 16) attribute >>= 4;
- if(scrollx() & 16) attribute >>= 2;
- tick();
- scrollx_increment();
- tick();
- unsigned tiledatalo = chr_load(tileaddr + 0);
- tick();
- tick();
- unsigned tiledatahi = chr_load(tileaddr + 8);
- tick();
- tick();
- raster.nametable = (raster.nametable << 8) | nametable;
- raster.attribute = (raster.attribute << 2) | (attribute & 3);
- raster.tiledatalo = (raster.tiledatalo << 8) | tiledatalo;
- raster.tiledatahi = (raster.tiledatahi << 8) | tiledatahi;
- }
- //336-339
- chr_load(0x2000 | (status.vaddr & 0x0fff));
- tick();
- bool skip = (raster_enable() && status.field == 1 && status.ly == 261);
- tick();
- chr_load(0x2000 | (status.vaddr & 0x0fff));
- tick();
- tick();
- //340
- if(skip == false) tick();
- return scanline();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement