o add bsnes
This commit is contained in:
99
bsnes/ppu/bppu/bppu_render_windows.cpp
Executable file
99
bsnes/ppu/bppu/bppu_render_windows.cpp
Executable file
@@ -0,0 +1,99 @@
|
||||
#ifdef BPPU_CPP
|
||||
|
||||
void bPPU::build_window_table(uint8 bg, bool mainscreen) {
|
||||
uint8 set = 1, clr = 0;
|
||||
uint8 *wtbl = (mainscreen == true) ? window[bg].main : window[bg].sub;
|
||||
|
||||
if(bg != COL) {
|
||||
if(mainscreen == true && regs.window_enabled[bg] == false) {
|
||||
memset(wtbl, 0, 256);
|
||||
return;
|
||||
}
|
||||
if(mainscreen == false && regs.sub_window_enabled[bg] == false) {
|
||||
memset(wtbl, 0, 256);
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
switch((mainscreen == true) ? regs.color_mask : regs.colorsub_mask) {
|
||||
case 0: { //always
|
||||
memset(wtbl, 1, 256);
|
||||
} return;
|
||||
|
||||
case 3: { //never
|
||||
memset(wtbl, 0, 256);
|
||||
} return;
|
||||
|
||||
case 1: { //inside window only
|
||||
set = 1;
|
||||
clr = 0;
|
||||
} break;
|
||||
|
||||
case 2: { //outside window only
|
||||
set = 0;
|
||||
clr = 1;
|
||||
} break;
|
||||
}
|
||||
}
|
||||
|
||||
uint16 window1_left = regs.window1_left;
|
||||
uint16 window1_right = regs.window1_right;
|
||||
uint16 window2_left = regs.window2_left;
|
||||
uint16 window2_right = regs.window2_right;
|
||||
|
||||
if(regs.window1_enabled[bg] == false && regs.window2_enabled[bg] == false) {
|
||||
memset(wtbl, clr, 256);
|
||||
return;
|
||||
}
|
||||
|
||||
if(regs.window1_enabled[bg] == true && regs.window2_enabled[bg] == false) {
|
||||
if(regs.window1_invert[bg] == true)swap(set, clr);
|
||||
for(int x = 0; x < 256; x++) {
|
||||
wtbl[x] = (x >= window1_left && x <= window1_right) ? set : clr;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if(regs.window1_enabled[bg] == false && regs.window2_enabled[bg] == true) {
|
||||
if(regs.window2_invert[bg] == true)swap(set, clr);
|
||||
for(int x = 0; x < 256; x++) {
|
||||
wtbl[x] = (x >= window2_left && x <= window2_right) ? set : clr;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
//(regs.window1_enabled[bg] == true && regs.window2_enabled[bg] == true)
|
||||
int w1_mask, w2_mask; //1 = masked, 0 = not masked
|
||||
|
||||
for(int x = 0; x < 256; x++) {
|
||||
w1_mask = (x >= window1_left && x <= window1_right);
|
||||
if(regs.window1_invert[bg] == true)w1_mask = !w1_mask;
|
||||
|
||||
w2_mask = (x >= window2_left && x <= window2_right);
|
||||
if(regs.window2_invert[bg] == true)w2_mask = !w2_mask;
|
||||
|
||||
switch(regs.window_mask[bg]) {
|
||||
case 0: { //WINDOWMASK_OR:
|
||||
wtbl[x] = ((w1_mask | w2_mask) == 1) ? set : clr;
|
||||
} break;
|
||||
|
||||
case 1: { //WINDOWMASK_AND:
|
||||
wtbl[x] = ((w1_mask & w2_mask) == 1) ? set : clr;
|
||||
} break;
|
||||
|
||||
case 2: { //WINDOWMASK_XOR:
|
||||
wtbl[x] = ((w1_mask ^ w2_mask) == 1) ? set : clr;
|
||||
} break;
|
||||
|
||||
case 3: { //WINDOWMASK_XNOR:
|
||||
wtbl[x] = ((w1_mask ^ w2_mask) == 0) ? set : clr;
|
||||
} break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void bPPU::build_window_tables(uint8 bg) {
|
||||
build_window_table(bg, true);
|
||||
build_window_table(bg, false);
|
||||
}
|
||||
|
||||
#endif //ifdef BPPU_CPP
|
||||
Reference in New Issue
Block a user