Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alexbevi
GitHub Repository: alexbevi/BizHawk
Path: blob/master/libsnes/bsnes/snes/ppu/window/window.cpp
2 views
1
#ifdef PPU_CPP
2
3
void PPU::Window::scanline() {
4
x = 0;
5
}
6
7
void PPU::Window::run() {
8
bool main, sub;
9
one = (x >= regs.one_left && x <= regs.one_right);
10
two = (x >= regs.two_left && x <= regs.two_right);
11
x++;
12
13
test(
14
main, sub,
15
regs.bg1_one_enable, regs.bg1_one_invert,
16
regs.bg1_two_enable, regs.bg1_two_invert,
17
regs.bg1_mask, regs.bg1_main_enable, regs.bg1_sub_enable
18
);
19
if(main) self.bg1.output.main.priority = 0;
20
if(sub) self.bg1.output.sub.priority = 0;
21
22
test(
23
main, sub,
24
regs.bg2_one_enable, regs.bg2_one_invert,
25
regs.bg2_two_enable, regs.bg2_two_invert,
26
regs.bg2_mask, regs.bg2_main_enable, regs.bg2_sub_enable
27
);
28
if(main) self.bg2.output.main.priority = 0;
29
if(sub) self.bg2.output.sub.priority = 0;
30
31
test(
32
main, sub,
33
regs.bg3_one_enable, regs.bg3_one_invert,
34
regs.bg3_two_enable, regs.bg3_two_invert,
35
regs.bg3_mask, regs.bg3_main_enable, regs.bg3_sub_enable
36
);
37
if(main) self.bg3.output.main.priority = 0;
38
if(sub) self.bg3.output.sub.priority = 0;
39
40
test(
41
main, sub,
42
regs.bg4_one_enable, regs.bg4_one_invert,
43
regs.bg4_two_enable, regs.bg4_two_invert,
44
regs.bg4_mask, regs.bg4_main_enable, regs.bg4_sub_enable
45
);
46
if(main) self.bg4.output.main.priority = 0;
47
if(sub) self.bg4.output.sub.priority = 0;
48
49
test(
50
main, sub,
51
regs.oam_one_enable, regs.oam_one_invert,
52
regs.oam_two_enable, regs.oam_two_invert,
53
regs.oam_mask, regs.oam_main_enable, regs.oam_sub_enable
54
);
55
if(main) self.sprite.output.main.priority = 0;
56
if(sub) self.sprite.output.sub.priority = 0;
57
58
test(
59
main, sub,
60
regs.col_one_enable, regs.col_one_invert,
61
regs.col_two_enable, regs.col_two_invert,
62
regs.col_mask, true, true
63
);
64
65
switch(regs.col_main_mask) {
66
case 0: main = true; break;
67
case 1: break;
68
case 2: main = !main; break;
69
case 3: main = false; break;
70
}
71
72
switch(regs.col_sub_mask) {
73
case 0: sub = true; break;
74
case 1: break;
75
case 2: sub = !sub; break;
76
case 3: sub = false; break;
77
}
78
79
output.main.color_enable = main;
80
output.sub.color_enable = sub;
81
}
82
83
void PPU::Window::test(
84
bool &main, bool &sub,
85
bool one_enable, bool one_invert,
86
bool two_enable, bool two_invert,
87
uint8 mask, bool main_enable, bool sub_enable
88
) {
89
bool one = Window::one ^ one_invert;
90
bool two = Window::two ^ two_invert;
91
bool output;
92
93
if(one_enable == false && two_enable == false) {
94
output = false;
95
} else if(one_enable == true && two_enable == false) {
96
output = one;
97
} else if(one_enable == false && two_enable == true) {
98
output = two;
99
} else switch(mask) {
100
case 0: output = (one | two) == 1; break;
101
case 1: output = (one & two) == 1; break;
102
case 2: output = (one ^ two) == 1; break;
103
case 3: output = (one ^ two) == 0; break;
104
}
105
106
main = main_enable ? output : false;
107
sub = sub_enable ? output : false;
108
}
109
110
void PPU::Window::reset() {
111
regs.bg1_one_enable = random(false);
112
regs.bg1_one_invert = random(false);
113
regs.bg1_two_enable = random(false);
114
regs.bg1_two_invert = random(false);
115
regs.bg2_one_enable = random(false);
116
regs.bg2_one_invert = random(false);
117
regs.bg2_two_enable = random(false);
118
regs.bg2_two_invert = random(false);
119
regs.bg3_one_enable = random(false);
120
regs.bg3_one_invert = random(false);
121
regs.bg3_two_enable = random(false);
122
regs.bg3_two_invert = random(false);
123
regs.bg4_one_enable = random(false);
124
regs.bg4_one_invert = random(false);
125
regs.bg4_two_enable = random(false);
126
regs.bg4_two_invert = random(false);
127
regs.oam_one_enable = random(false);
128
regs.oam_one_invert = random(false);
129
regs.oam_two_enable = random(false);
130
regs.oam_two_invert = random(false);
131
regs.col_one_enable = random(false);
132
regs.col_one_invert = random(false);
133
regs.col_two_enable = random(false);
134
regs.col_two_invert = random(false);
135
regs.one_left = random(0x00);
136
regs.one_right = random(0x00);
137
regs.two_left = random(0x00);
138
regs.two_right = random(0x00);
139
regs.bg1_mask = random(0);
140
regs.bg2_mask = random(0);
141
regs.bg3_mask = random(0);
142
regs.bg4_mask = random(0);
143
regs.oam_mask = random(0);
144
regs.col_mask = random(0);
145
regs.bg1_main_enable = random(false);
146
regs.bg1_sub_enable = random(false);
147
regs.bg2_main_enable = random(false);
148
regs.bg2_sub_enable = random(false);
149
regs.bg3_main_enable = random(false);
150
regs.bg3_sub_enable = random(false);
151
regs.bg4_main_enable = random(false);
152
regs.bg4_sub_enable = random(false);
153
regs.oam_main_enable = random(false);
154
regs.oam_sub_enable = random(false);
155
regs.col_main_mask = random(0);
156
regs.col_sub_mask = random(0);
157
158
output.main.color_enable = 0;
159
output.sub.color_enable = 0;
160
161
x = 0;
162
one = 0;
163
two = 0;
164
}
165
166
PPU::Window::Window(PPU &self) : self(self) {
167
}
168
169
#endif
170
171