Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alexbevi
GitHub Repository: alexbevi/BizHawk
Path: blob/master/libsnes/bsnes/gameboy/apu/wave/wave.cpp
2 views
1
#ifdef APU_CPP
2
3
void APU::Wave::run() {
4
if(period && --period == 0) {
5
period = 2 * (2048 - frequency);
6
pattern_sample = pattern[++pattern_offset];
7
}
8
9
uint4 sample = pattern_sample >> volume_shift;
10
if(enable == false) sample = 0;
11
12
output = sample;
13
}
14
15
void APU::Wave::clock_length() {
16
if(counter && length) {
17
if(--length == 0) enable = false;
18
}
19
}
20
21
void APU::Wave::write(unsigned r, uint8 data) {
22
if(r == 0) { //$ff1a NR30
23
dac_enable = data & 0x80;
24
if(dac_enable == false) enable = false;
25
}
26
27
if(r == 1) { //$ff1b NR31
28
length = 256 - data;
29
}
30
31
if(r == 2) { //$ff1c NR32
32
switch((data >> 5) & 3) {
33
case 0: volume_shift = 4; break; // 0%
34
case 1: volume_shift = 0; break; //100%
35
case 2: volume_shift = 1; break; // 50%
36
case 3: volume_shift = 2; break; // 25%
37
}
38
}
39
40
if(r == 3) { //$ff1d NR33
41
frequency = (frequency & 0x0700) | data;
42
}
43
44
if(r == 4) { //$ff1e NR34
45
bool initialize = data & 0x80;
46
counter = data & 0x40;
47
frequency = ((data & 7) << 8) | (frequency & 0x00ff);
48
49
if(initialize) {
50
enable = dac_enable;
51
pattern_offset = 0;
52
if(length == 0) length = 256;
53
}
54
}
55
56
period = 2 * (2048 - frequency);
57
}
58
59
void APU::Wave::write_pattern(unsigned p, uint8 data) {
60
p <<= 1;
61
pattern[p + 0] = (data >> 4) & 15;
62
pattern[p + 1] = (data >> 0) & 15;
63
}
64
65
void APU::Wave::power() {
66
enable = 0;
67
68
dac_enable = 0;
69
volume_shift = 0;
70
frequency = 0;
71
counter = 0;
72
73
random_lfsr r;
74
for(auto &n : pattern) n = r() & 15;
75
76
output = 0;
77
length = 0;
78
period = 0;
79
pattern_offset = 0;
80
pattern_sample = 0;
81
}
82
83
void APU::Wave::serialize(serializer &s) {
84
s.integer(enable);
85
86
s.integer(dac_enable);
87
s.integer(volume_shift);
88
s.integer(frequency);
89
s.integer(counter);
90
s.array(pattern);
91
92
s.integer(output);
93
s.integer(length);
94
s.integer(period);
95
s.integer(pattern_offset);
96
s.integer(pattern_sample);
97
}
98
99
#endif
100
101