Path: blob/master/libsnes/bsnes/snes/ppu/window/window.cpp
2 views
#ifdef PPU_CPP12void PPU::Window::scanline() {3x = 0;4}56void PPU::Window::run() {7bool main, sub;8one = (x >= regs.one_left && x <= regs.one_right);9two = (x >= regs.two_left && x <= regs.two_right);10x++;1112test(13main, sub,14regs.bg1_one_enable, regs.bg1_one_invert,15regs.bg1_two_enable, regs.bg1_two_invert,16regs.bg1_mask, regs.bg1_main_enable, regs.bg1_sub_enable17);18if(main) self.bg1.output.main.priority = 0;19if(sub) self.bg1.output.sub.priority = 0;2021test(22main, sub,23regs.bg2_one_enable, regs.bg2_one_invert,24regs.bg2_two_enable, regs.bg2_two_invert,25regs.bg2_mask, regs.bg2_main_enable, regs.bg2_sub_enable26);27if(main) self.bg2.output.main.priority = 0;28if(sub) self.bg2.output.sub.priority = 0;2930test(31main, sub,32regs.bg3_one_enable, regs.bg3_one_invert,33regs.bg3_two_enable, regs.bg3_two_invert,34regs.bg3_mask, regs.bg3_main_enable, regs.bg3_sub_enable35);36if(main) self.bg3.output.main.priority = 0;37if(sub) self.bg3.output.sub.priority = 0;3839test(40main, sub,41regs.bg4_one_enable, regs.bg4_one_invert,42regs.bg4_two_enable, regs.bg4_two_invert,43regs.bg4_mask, regs.bg4_main_enable, regs.bg4_sub_enable44);45if(main) self.bg4.output.main.priority = 0;46if(sub) self.bg4.output.sub.priority = 0;4748test(49main, sub,50regs.oam_one_enable, regs.oam_one_invert,51regs.oam_two_enable, regs.oam_two_invert,52regs.oam_mask, regs.oam_main_enable, regs.oam_sub_enable53);54if(main) self.sprite.output.main.priority = 0;55if(sub) self.sprite.output.sub.priority = 0;5657test(58main, sub,59regs.col_one_enable, regs.col_one_invert,60regs.col_two_enable, regs.col_two_invert,61regs.col_mask, true, true62);6364switch(regs.col_main_mask) {65case 0: main = true; break;66case 1: break;67case 2: main = !main; break;68case 3: main = false; break;69}7071switch(regs.col_sub_mask) {72case 0: sub = true; break;73case 1: break;74case 2: sub = !sub; break;75case 3: sub = false; break;76}7778output.main.color_enable = main;79output.sub.color_enable = sub;80}8182void PPU::Window::test(83bool &main, bool &sub,84bool one_enable, bool one_invert,85bool two_enable, bool two_invert,86uint8 mask, bool main_enable, bool sub_enable87) {88bool one = Window::one ^ one_invert;89bool two = Window::two ^ two_invert;90bool output;9192if(one_enable == false && two_enable == false) {93output = false;94} else if(one_enable == true && two_enable == false) {95output = one;96} else if(one_enable == false && two_enable == true) {97output = two;98} else switch(mask) {99case 0: output = (one | two) == 1; break;100case 1: output = (one & two) == 1; break;101case 2: output = (one ^ two) == 1; break;102case 3: output = (one ^ two) == 0; break;103}104105main = main_enable ? output : false;106sub = sub_enable ? output : false;107}108109void PPU::Window::reset() {110regs.bg1_one_enable = random(false);111regs.bg1_one_invert = random(false);112regs.bg1_two_enable = random(false);113regs.bg1_two_invert = random(false);114regs.bg2_one_enable = random(false);115regs.bg2_one_invert = random(false);116regs.bg2_two_enable = random(false);117regs.bg2_two_invert = random(false);118regs.bg3_one_enable = random(false);119regs.bg3_one_invert = random(false);120regs.bg3_two_enable = random(false);121regs.bg3_two_invert = random(false);122regs.bg4_one_enable = random(false);123regs.bg4_one_invert = random(false);124regs.bg4_two_enable = random(false);125regs.bg4_two_invert = random(false);126regs.oam_one_enable = random(false);127regs.oam_one_invert = random(false);128regs.oam_two_enable = random(false);129regs.oam_two_invert = random(false);130regs.col_one_enable = random(false);131regs.col_one_invert = random(false);132regs.col_two_enable = random(false);133regs.col_two_invert = random(false);134regs.one_left = random(0x00);135regs.one_right = random(0x00);136regs.two_left = random(0x00);137regs.two_right = random(0x00);138regs.bg1_mask = random(0);139regs.bg2_mask = random(0);140regs.bg3_mask = random(0);141regs.bg4_mask = random(0);142regs.oam_mask = random(0);143regs.col_mask = random(0);144regs.bg1_main_enable = random(false);145regs.bg1_sub_enable = random(false);146regs.bg2_main_enable = random(false);147regs.bg2_sub_enable = random(false);148regs.bg3_main_enable = random(false);149regs.bg3_sub_enable = random(false);150regs.bg4_main_enable = random(false);151regs.bg4_sub_enable = random(false);152regs.oam_main_enable = random(false);153regs.oam_sub_enable = random(false);154regs.col_main_mask = random(0);155regs.col_sub_mask = random(0);156157output.main.color_enable = 0;158output.sub.color_enable = 0;159160x = 0;161one = 0;162two = 0;163}164165PPU::Window::Window(PPU &self) : self(self) {166}167168#endif169170171