Skip to content

Commit 86b39f6

Browse files
authored
Merge pull request #10 from lukaslihotzki/synth-rw
Implement register accesses in Synth
2 parents 43b3c01 + a7ad179 commit 86b39f6

File tree

2 files changed

+44
-97
lines changed

2 files changed

+44
-97
lines changed

src/sid.rs

Lines changed: 2 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -163,108 +163,13 @@ impl Sid {
163163
// -- Device I/O
164164

165165
pub fn read(&self, reg: u8) -> u8 {
166-
match reg {
167-
reg::POTX => 0xff,
168-
reg::POTY => 0xff,
169-
reg::OSC3 => self.sampler.synth.syncable_voice(2).wave().read_osc(),
170-
reg::ENV3 => self.sampler.synth.voices[2].envelope.read_env(),
171-
_ => self.bus_value,
172-
}
166+
self.sampler.synth.read(reg, self.bus_value)
173167
}
174168

175169
pub fn write(&mut self, reg: u8, value: u8) {
176170
self.bus_value = value;
177171
self.bus_value_ttl = 0x2000;
178-
match reg {
179-
reg::FREQLO1 => {
180-
self.sampler.synth.voices[0].wave.set_frequency_lo(value);
181-
}
182-
reg::FREQHI1 => {
183-
self.sampler.synth.voices[0].wave.set_frequency_hi(value);
184-
}
185-
reg::PWLO1 => {
186-
self.sampler.synth.voices[0].wave.set_pulse_width_lo(value);
187-
}
188-
reg::PWHI1 => {
189-
self.sampler.synth.voices[0].wave.set_pulse_width_hi(value);
190-
}
191-
reg::CR1 => {
192-
self.sampler.synth.voices[0].set_control(value);
193-
}
194-
reg::AD1 => {
195-
self.sampler.synth.voices[0]
196-
.envelope
197-
.set_attack_decay(value);
198-
}
199-
reg::SR1 => {
200-
self.sampler.synth.voices[0]
201-
.envelope
202-
.set_sustain_release(value);
203-
}
204-
reg::FREQLO2 => {
205-
self.sampler.synth.voices[1].wave.set_frequency_lo(value);
206-
}
207-
reg::FREQHI2 => {
208-
self.sampler.synth.voices[1].wave.set_frequency_hi(value);
209-
}
210-
reg::PWLO2 => {
211-
self.sampler.synth.voices[1].wave.set_pulse_width_lo(value);
212-
}
213-
reg::PWHI2 => {
214-
self.sampler.synth.voices[1].wave.set_pulse_width_hi(value);
215-
}
216-
reg::CR2 => {
217-
self.sampler.synth.voices[1].set_control(value);
218-
}
219-
reg::AD2 => {
220-
self.sampler.synth.voices[1]
221-
.envelope
222-
.set_attack_decay(value);
223-
}
224-
reg::SR2 => {
225-
self.sampler.synth.voices[1]
226-
.envelope
227-
.set_sustain_release(value);
228-
}
229-
reg::FREQLO3 => {
230-
self.sampler.synth.voices[2].wave.set_frequency_lo(value);
231-
}
232-
reg::FREQHI3 => {
233-
self.sampler.synth.voices[2].wave.set_frequency_hi(value);
234-
}
235-
reg::PWLO3 => {
236-
self.sampler.synth.voices[2].wave.set_pulse_width_lo(value);
237-
}
238-
reg::PWHI3 => {
239-
self.sampler.synth.voices[2].wave.set_pulse_width_hi(value);
240-
}
241-
reg::CR3 => {
242-
self.sampler.synth.voices[2].set_control(value);
243-
}
244-
reg::AD3 => {
245-
self.sampler.synth.voices[2]
246-
.envelope
247-
.set_attack_decay(value);
248-
}
249-
reg::SR3 => {
250-
self.sampler.synth.voices[2]
251-
.envelope
252-
.set_sustain_release(value);
253-
}
254-
reg::FCLO => {
255-
self.sampler.synth.filter.set_fc_lo(value);
256-
}
257-
reg::FCHI => {
258-
self.sampler.synth.filter.set_fc_hi(value);
259-
}
260-
reg::RESFILT => {
261-
self.sampler.synth.filter.set_res_filt(value);
262-
}
263-
reg::MODVOL => {
264-
self.sampler.synth.filter.set_mode_vol(value);
265-
}
266-
_ => {}
267-
}
172+
self.sampler.synth.write(reg, value);
268173
}
269174

270175
// -- State

src/synth.rs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
use super::external_filter::ExternalFilter;
99
use super::filter::Filter;
10+
use super::sid::reg;
1011
use super::voice::Voice;
1112
use super::wave::Syncable;
1213
use super::ChipModel;
@@ -157,4 +158,45 @@ impl Synth {
157158
}
158159
self.ext_in = 0;
159160
}
161+
162+
pub fn read(&self, reg: u8, bus_value: u8) -> u8 {
163+
match reg {
164+
reg::POTX => 0xff,
165+
reg::POTY => 0xff,
166+
reg::OSC3 => self.syncable_voice(2).wave().read_osc(),
167+
reg::ENV3 => self.voices[2].envelope.read_env(),
168+
_ => bus_value,
169+
}
170+
}
171+
172+
pub fn write(&mut self, reg: u8, value: u8) {
173+
match reg {
174+
reg::FREQLO1 => self.voices[0].wave.set_frequency_lo(value),
175+
reg::FREQHI1 => self.voices[0].wave.set_frequency_hi(value),
176+
reg::PWLO1 => self.voices[0].wave.set_pulse_width_lo(value),
177+
reg::PWHI1 => self.voices[0].wave.set_pulse_width_hi(value),
178+
reg::CR1 => self.voices[0].set_control(value),
179+
reg::AD1 => self.voices[0].envelope.set_attack_decay(value),
180+
reg::SR1 => self.voices[0].envelope.set_sustain_release(value),
181+
reg::FREQLO2 => self.voices[1].wave.set_frequency_lo(value),
182+
reg::FREQHI2 => self.voices[1].wave.set_frequency_hi(value),
183+
reg::PWLO2 => self.voices[1].wave.set_pulse_width_lo(value),
184+
reg::PWHI2 => self.voices[1].wave.set_pulse_width_hi(value),
185+
reg::CR2 => self.voices[1].set_control(value),
186+
reg::AD2 => self.voices[1].envelope.set_attack_decay(value),
187+
reg::SR2 => self.voices[1].envelope.set_sustain_release(value),
188+
reg::FREQLO3 => self.voices[2].wave.set_frequency_lo(value),
189+
reg::FREQHI3 => self.voices[2].wave.set_frequency_hi(value),
190+
reg::PWLO3 => self.voices[2].wave.set_pulse_width_lo(value),
191+
reg::PWHI3 => self.voices[2].wave.set_pulse_width_hi(value),
192+
reg::CR3 => self.voices[2].set_control(value),
193+
reg::AD3 => self.voices[2].envelope.set_attack_decay(value),
194+
reg::SR3 => self.voices[2].envelope.set_sustain_release(value),
195+
reg::FCLO => self.filter.set_fc_lo(value),
196+
reg::FCHI => self.filter.set_fc_hi(value),
197+
reg::RESFILT => self.filter.set_res_filt(value),
198+
reg::MODVOL => self.filter.set_mode_vol(value),
199+
_ => {}
200+
}
201+
}
160202
}

0 commit comments

Comments
 (0)