1
1
use super :: { dac:: Dac , envelope:: Envelope , frame_sequencer:: Frame , length_counter:: LengthCounter } ;
2
- use crate :: clock:: { ClockDivider , Timer } ;
2
+ use crate :: {
3
+ clock:: { ClockDivider , Timer } ,
4
+ cpu:: CPU_FREQ_HZ ,
5
+ } ;
3
6
4
7
use bitfield_struct:: bitfield;
5
8
6
- const NOISE_FREQ_HZ : usize = 262_144 ;
9
+ // LFSR runs at CPU rate.
10
+ const NOISE_FREQ_HZ : usize = CPU_FREQ_HZ ;
7
11
8
12
#[ derive( Debug , Clone ) ]
9
13
pub struct Noise {
@@ -122,6 +126,7 @@ impl Noise {
122
126
}
123
127
124
128
self . nr43 = Nr43 :: from_bits ( value) ;
129
+ self . lfsr . set_mode ( self . nr43 . step ( ) ) ;
125
130
}
126
131
127
132
/// Read NR44 register (0xff23)
@@ -141,7 +146,7 @@ impl Noise {
141
146
. update ( self . nr44 . trigger ( ) , self . nr44 . enable_length ( ) ) ;
142
147
143
148
if self . nr44 . trigger ( ) {
144
- self . reload_timer ( ) ;
149
+ self . reload_initial_timer ( self . nr43 . step ( ) ) ;
145
150
self . lfsr . trigger ( self . nr43 . step ( ) ) ;
146
151
self . envelope
147
152
. update ( self . nr42 . init ( ) , self . nr42 . count ( ) , self . nr42 . increase ( ) ) ;
@@ -159,27 +164,37 @@ impl Noise {
159
164
for _ in 0 ..times {
160
165
self . update ( ) ;
161
166
}
167
+
168
+ self . write_amp ( ) ;
162
169
}
163
170
164
171
fn update ( & mut self ) {
165
- if !self . is_active ( ) {
166
- return ;
167
- }
168
172
if !self . timer . tick ( ) {
169
173
return ;
170
174
}
171
175
172
176
self . reload_timer ( ) ;
173
177
174
178
self . lfsr . update ( ) ;
179
+ }
175
180
176
- self . dac . write ( if self . lfsr . high ( ) {
181
+ fn write_amp ( & mut self ) {
182
+ self . dac . write ( if self . is_active ( ) && self . lfsr . high ( ) {
177
183
self . envelope . amp ( )
178
184
} else {
179
185
0
180
186
} ) ;
181
187
}
182
188
189
+ fn reload_initial_timer ( & mut self , short : bool ) {
190
+ self . timer . reset ( ) ;
191
+
192
+ // TODO: Understand the initial delay more.
193
+ self . timer . set_interval (
194
+ self . timer_interval ( ) + if short { 0 } else { 7 * self . timer_interval ( ) } + 3 ,
195
+ ) ;
196
+ }
197
+
183
198
fn reload_timer ( & mut self ) {
184
199
self . timer . reset ( ) ;
185
200
self . timer . set_interval ( self . timer_interval ( ) ) ;
@@ -189,11 +204,19 @@ impl Noise {
189
204
let divider = self . nr43 . div_freq ( ) ;
190
205
let shift = self . nr43 . shift_freq ( ) ;
191
206
192
- if divider == 0 {
193
- ( 5 << shift) / 10
194
- } else {
195
- divider << shift
196
- }
207
+ // Divisor code Divisor
208
+ // -----------------------
209
+ // 0 8
210
+ // 1 16
211
+ // 2 32
212
+ // 3 48
213
+ // 4 64
214
+ // 5 80
215
+ // 6 96
216
+ // 7 112
217
+ let base = if divider == 0 { 8 } else { divider * 16 } ;
218
+
219
+ base << shift
197
220
}
198
221
199
222
pub fn is_active ( & self ) -> bool {
@@ -204,6 +227,9 @@ impl Noise {
204
227
self . power = true ;
205
228
206
229
self . length_counter . power_on ( ) ;
230
+
231
+ self . reload_timer ( ) ;
232
+ self . divider . reset ( ) ;
207
233
}
208
234
209
235
pub fn power_off ( & mut self ) {
@@ -216,8 +242,6 @@ impl Noise {
216
242
217
243
self . length_counter . power_off ( ) ;
218
244
219
- self . lfsr . reset ( ) ;
220
-
221
245
self . dac . power_off ( ) ;
222
246
}
223
247
@@ -239,35 +263,38 @@ struct Lfsr {
239
263
impl Lfsr {
240
264
fn new ( ) -> Self {
241
265
Self {
242
- value : 0 ,
266
+ value : 0xff ,
243
267
short : false ,
244
268
}
245
269
}
246
270
247
- fn reset ( & mut self ) {
248
- self . value = 0 ;
249
- self . short = false ;
250
- }
251
-
252
271
fn high ( & self ) -> bool {
253
272
// Inverted bit 1
254
273
self . value & 1 == 0
255
274
}
256
275
257
276
fn trigger ( & mut self , short : bool ) {
258
- self . value = 0 ;
277
+ self . short = short;
278
+ self . value = 0xff ;
279
+ }
280
+
281
+ fn set_mode ( & mut self , short : bool ) {
259
282
self . short = short;
260
283
}
261
284
262
285
fn update ( & mut self ) {
263
- // NXOR bit 0 and 1.
264
- let bit = !( ( self . value & 0x01 ) ^ ( ( self . value & 0x02 ) >> 1 ) ) & 1 ;
286
+ // Xor bit 0 and 1.
287
+ let bit = ( self . value & 1 ) ^ ( ( self . value & 2 ) >> 1 ) & 1 ;
288
+
289
+ // Shift right.
290
+ self . value >>= 1 ;
291
+
292
+ // Put the bit at bit 14 (i.e. 15 bits shift register)
293
+ self . value = ( self . value & !0x4000 ) | ( bit << 14 ) ;
265
294
266
- // Put XOR-ed result in bit 15 (and bit 7 in short mode)
267
295
if self . short {
268
- self . value = ( ( self . value >> 1 ) & 0x7f7f ) | ( bit << 7 ) | ( bit << 15 ) ;
269
- } else {
270
- self . value = ( ( self . value >> 1 ) & 0x7fff ) | ( bit << 15 ) ;
296
+ // Put the bit at bit 6 (i.e. 7 bits shift register)
297
+ self . value = ( self . value & !0x0040 ) | ( bit << 6 ) ;
271
298
}
272
299
}
273
300
}
0 commit comments