2
* sidsettingswindowcontroller.m - SIDSettings dialog controller
5
* Christian Vogelgsang <chris@vogelgsang.org>
7
* This file is part of VICE, the Versatile Commodore Emulator.
8
* See README for copyright notice.
10
* This program is free software; you can redistribute it and/or modify
11
* it under the terms of the GNU General Public License as published by
12
* the Free Software Foundation; either version 2 of the License, or
13
* (at your option) any later version.
15
* This program is distributed in the hope that it will be useful,
16
* but WITHOUT ANY WARRANTY; without even the implied warranty of
17
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18
* GNU General Public License for more details.
20
* You should have received a copy of the GNU General Public License
21
* along with this program; if not, write to the Free Software
22
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
31
#import "sidsettingswindowcontroller.h"
32
#import "viceapplication.h"
33
#import "vicenotifications.h"
35
static const int c64baseaddress[] = { 0xd4, 0xd5, 0xd6, 0xd7, 0xde, 0xdf, -1 };
36
static const int c128baseaddress[] = { 0xd4, 0xd7, 0xde, 0xdf, -1 };
37
static const int cbm2baseaddress[] = { 0xda, -1 };
39
static char *engine_model_names[] = {
48
"8580 + digiboost (ReSID)",
51
"6581R3 4885 (ReSID-fp)",
52
"6581R3 0486S (ReSID-fp)",
53
"6581R3 3984 (ReSID-fp)",
54
"6581R4AR 3789 (ReSID-fp)",
55
"6581R3 4485 (ReSID-fp)",
56
"6581R4 1986S (ReSID-fp)",
57
"8580R5 3691 (ReSID-fp)",
58
"8580R5 3691 + digiboost (ReSID-fp)",
59
"8580R5 1489 (ReSID-fp)",
60
"8580R5 1489 + digiboost (ReSID-fp)",
65
static const int engine_model_values[] = {
77
SID_RESIDFP_6581R3_4885,
78
SID_RESIDFP_6581R3_0486S,
79
SID_RESIDFP_6581R3_3984,
80
SID_RESIDFP_6581R4AR_3789,
81
SID_RESIDFP_6581R3_4485,
82
SID_RESIDFP_6581R4_1986S,
83
SID_RESIDFP_8580R5_3691,
84
SID_RESIDFP_8580R5_3691D,
85
SID_RESIDFP_8580R5_1489,
86
SID_RESIDFP_8580R5_1489D,
91
@implementation SIDSettingsWindowController
95
self = [super initWithWindowNibName:@"SIDSettings"];
102
if(machine_class == VICE_MACHINE_C64DTV) {
108
if(machine_class == VICE_MACHINE_C64) {
109
stereoAddrs = c64baseaddress;
110
} else if(machine_class == VICE_MACHINE_C128) {
111
stereoAddrs = c128baseaddress;
112
} else if((machine_class == VICE_MACHINE_CBM6x0)||
113
(machine_class == VICE_MACHINE_CBM5x0)) {
114
stereoAddrs = cbm2baseaddress;
118
[self registerForResourceUpdate:@selector(updateResources:)];
123
-(void)enableReSIDControls:(BOOL)on
125
[residSampleMethodButton setEnabled:on];
126
[residPassbandSlider setEnabled:on];
127
[residPassbandText setEnabled:on];
134
[self enabledReSIDControls:NO];
137
// toggle stereo/filters
138
[stereoSidEnableButton setEnabled:hasStereo];
139
[stereoSidAddressButton setEnabled:hasStereo];
140
[filterEnableButton setEnabled:hasFilters];
143
if(stereoAddrs != NULL) {
145
while(stereoAddrs[i]!=-1) {
146
int hi = stereoAddrs[i];
148
for (lo = (hi > 0 ? 0x0 : 0x20); lo < 0x100; lo += 0x20) {
149
int addr = hi * 0x100 + lo;
150
NSString *title = [NSString stringWithFormat:@"$%04X",addr];
151
[stereoSidAddressButton addItemWithTitle:title];
160
if(machine_class == VICE_MACHINE_C64DTV) {
164
int offset = modelOffset;
165
while(engine_model_names[offset] != NULL) {
166
const char *name = engine_model_names[offset];
167
[engineModelButton addItemWithTitle:[NSString stringWithCString:name
168
encoding:NSUTF8StringEncoding]];
172
[self updateResources:nil];
173
[super windowDidLoad];
176
-(void)updateResidPassbandResources
178
int residPassband = [self getIntResource:@"SidResidPassband"];
179
[residPassbandSlider setIntValue:residPassband];
180
[residPassbandText setIntValue:residPassband];
183
-(void)updateResources:(NSNotification *)notification
187
int engine = [self getIntResource:@"SidEngine"];
188
int model = [self getIntResource:@"SidModel"];
189
int pair = engine << 8 | model;
190
while(engine_model_values[i] != -1) {
191
if(engine_model_values[i] == pair) {
197
[engineModelButton selectItemAtIndex:i];
200
BOOL reSIDenabled = (engine == SID_ENGINE_RESID) || (engine == SID_ENGINE_RESID_FP);
201
[self enableReSIDControls:reSIDenabled];
204
int sidStereo = [self getIntResource:@"SidStereo"];
205
[stereoSidEnableButton setState:(sidStereo ? NSOnState:NSOffState)];
206
int sidStereoBase = [self getIntResource:@"SidStereoAddressStart"];
207
NSString *title = [NSString stringWithFormat:@"$%04X",sidStereoBase];
208
[stereoSidAddressButton selectItemWithTitle:title];
209
[stereoSidAddressButton setEnabled:sidStereo ? NSOnState:NSOffState];
212
int sidFilter = [self getIntResource:@"SidFilters"];
213
[filterEnableButton setState:(sidFilter ? NSOnState : NSOffState)];
218
int residSampleMethod = [self getIntResource:@"SidResidSampling"];
219
[residSampleMethodButton selectItemWithTag:residSampleMethod];
220
[self updateResidPassbandResources];
224
// ----- Actions -----
226
-(IBAction)popupEngineModel:(id)sender
228
int modelIndex = modelOffset + [engineModelButton indexOfSelectedItem];
229
int pair = engine_model_values[modelIndex];
230
int engine = pair >> 8;
231
int model = pair & 0xff;
232
[self setIntResource:@"SidModel" toValue:model];
233
[self setIntResource:@"SidEngine" toValue:engine];
234
[self updateResources:nil];
237
-(IBAction)toggleStereoSid:(id)sender
239
int stereoSid = [sender state] == NSOnState;
240
[self setIntResource:@"SidStereo" toValue:stereoSid];
241
[self updateResources:nil];
244
-(IBAction)popupStereoSidAddress:(id)sender
246
NSString *title = [sender title];
248
sscanf([title cStringUsingEncoding:NSUTF8StringEncoding],"$%x",&addr);
249
[self setIntResource:@"SidStereoAddressStart" toValue:addr];
252
-(IBAction)toggleSidFilter:(id)sender
254
int sidFilter = ([sender state] == NSOnState);
255
[self setIntResource:@"SidFilters" toValue:sidFilter];
258
-(IBAction)popupResidSampleMethod:(id)sender
260
[self setIntResource:@"SidResidSampling" toValue:[sender tag]];
263
-(IBAction)slideResidPasspand:(id)sender
265
[self setIntResource:@"SidResidPassband" toValue:[sender intValue]];
266
[self updateResidPassbandResources];
269
-(IBAction)enterResidPassband:(id)sender
271
[self setIntResource:@"SidResidPassband" toValue:[sender intValue]];
272
[self updateResidPassbandResources];