~ubuntu-branches/ubuntu/precise/vice/precise

« back to all changes in this revision

Viewing changes to src/arch/unix/macosx/cocoa/dialog/sidsettingswindowcontroller.m

  • Committer: Bazaar Package Importer
  • Author(s): Laszlo Boszormenyi (GCS)
  • Date: 2010-02-11 18:30:16 UTC
  • mfrom: (1.1.8 upstream) (9.2.2 sid)
  • Revision ID: james.westby@ubuntu.com-20100211183016-f6n8usn3tzp0u6dp
Tags: 2.2.dfsg-1
* New upstream release, C64 DTV is included so update package description
  and add it to the menu.
* Drop patch fixing build failure with gcc-4.4 , applied upstream.
* Fix some lintian problems and clean up debian/rules .

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * sidsettingswindowcontroller.m - SIDSettings dialog controller
 
3
 *
 
4
 * Written by
 
5
 *  Christian Vogelgsang <chris@vogelgsang.org>
 
6
 *
 
7
 * This file is part of VICE, the Versatile Commodore Emulator.
 
8
 * See README for copyright notice.
 
9
 *
 
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.
 
14
 *
 
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.
 
19
 *
 
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
 
23
 *  02111-1307  USA.
 
24
 *
 
25
 */
 
26
 
 
27
#include "vice.h"
 
28
#include "machine.h"
 
29
#include "sid.h"
 
30
 
 
31
#import "sidsettingswindowcontroller.h"
 
32
#import "viceapplication.h"
 
33
#import "vicenotifications.h"
 
34
 
 
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 };
 
38
 
 
39
static char *engine_model_names[] = {
 
40
#ifdef HAVE_RESID
 
41
    "DTVSID (reSID-DTV)",
 
42
#endif
 
43
    "6581 (Fast SID)",
 
44
    "8580 (Fast SID)",
 
45
#ifdef HAVE_RESID
 
46
    "6581 (ReSID)",
 
47
    "8580 (ReSID)",
 
48
    "8580 + digiboost (ReSID)",
 
49
#endif
 
50
#ifdef HAVE_RESID_FP
 
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)",
 
61
#endif
 
62
    NULL
 
63
};
 
64
 
 
65
static const int engine_model_values[] = {
 
66
#ifdef HAVE_RESID
 
67
    SID_RESID_DTVSID,
 
68
#endif
 
69
    SID_FASTSID_6581,
 
70
    SID_FASTSID_8580,
 
71
#ifdef HAVE_RESID
 
72
    SID_RESID_6581,
 
73
    SID_RESID_8580,
 
74
    SID_RESID_8580D,
 
75
#endif
 
76
#ifdef HAVE_RESID_FP
 
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,
 
87
#endif
 
88
    -1
 
89
};
 
90
 
 
91
@implementation SIDSettingsWindowController
 
92
 
 
93
-(id)init
 
94
{
 
95
    self = [super initWithWindowNibName:@"SIDSettings"];
 
96
    if (!self) {
 
97
        return self;
 
98
    }
 
99
 
 
100
    // machine config
 
101
    stereoAddrs = NULL;
 
102
    if(machine_class == VICE_MACHINE_C64DTV) {
 
103
        hasFilters = NO;
 
104
        hasStereo  = NO;
 
105
    } else {
 
106
        hasFilters = YES;
 
107
        hasStereo  = YES;
 
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;
 
115
        }
 
116
    }
 
117
 
 
118
    [self registerForResourceUpdate:@selector(updateResources:)];
 
119
 
 
120
    return self;
 
121
}
 
122
 
 
123
-(void)enableReSIDControls:(BOOL)on
 
124
{
 
125
    [residSampleMethodButton setEnabled:on];
 
126
    [residPassbandSlider setEnabled:on];
 
127
    [residPassbandText setEnabled:on];    
 
128
}
 
129
 
 
130
-(void)windowDidLoad
 
131
{
 
132
#ifndef HAVE_RESID
 
133
    // disable RESID
 
134
    [self enabledReSIDControls:NO];
 
135
#endif    
 
136
    
 
137
    // toggle stereo/filters
 
138
    [stereoSidEnableButton setEnabled:hasStereo];
 
139
    [stereoSidAddressButton setEnabled:hasStereo];
 
140
    [filterEnableButton setEnabled:hasFilters];
 
141
    
 
142
    // setup stereo addr
 
143
    if(stereoAddrs != NULL) {
 
144
        int i=0;
 
145
        while(stereoAddrs[i]!=-1) {
 
146
            int hi = stereoAddrs[i];
 
147
            int lo;
 
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];
 
152
            }
 
153
            i++;
 
154
        }
 
155
    }
 
156
    
 
157
    // setup sid model
 
158
    modelOffset = 1;
 
159
#ifdef HAVE_RESID
 
160
    if(machine_class == VICE_MACHINE_C64DTV) {
 
161
        modelOffset = 0;
 
162
    }
 
163
#endif
 
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]];
 
169
        offset++;
 
170
    }
 
171
    
 
172
    [self updateResources:nil];
 
173
    [super windowDidLoad];
 
174
}
 
175
 
 
176
-(void)updateResidPassbandResources
 
177
{
 
178
    int residPassband     = [self getIntResource:@"SidResidPassband"];
 
179
    [residPassbandSlider setIntValue:residPassband];
 
180
    [residPassbandText setIntValue:residPassband];    
 
181
}
 
182
 
 
183
-(void)updateResources:(NSNotification *)notification
 
184
{
 
185
    // set model
 
186
    int i = modelOffset;
 
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) {
 
192
            break;
 
193
        }
 
194
        i++;
 
195
    }
 
196
    i -= modelOffset;
 
197
    [engineModelButton selectItemAtIndex:i];
 
198
    
 
199
    // is reSID enabled?
 
200
    BOOL reSIDenabled = (engine == SID_ENGINE_RESID) || (engine == SID_ENGINE_RESID_FP);
 
201
    [self enableReSIDControls:reSIDenabled];
 
202
    
 
203
    if(hasStereo) {
 
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];
 
210
    }
 
211
    if(hasFilters) {
 
212
        int sidFilter = [self getIntResource:@"SidFilters"];
 
213
        [filterEnableButton setState:(sidFilter ? NSOnState : NSOffState)];
 
214
    }
 
215
    
 
216
    // reSID
 
217
#ifdef HAVE_RESID
 
218
    int residSampleMethod = [self getIntResource:@"SidResidSampling"];
 
219
    [residSampleMethodButton selectItemWithTag:residSampleMethod];
 
220
    [self updateResidPassbandResources];
 
221
#endif
 
222
}
 
223
 
 
224
// ----- Actions -----
 
225
 
 
226
-(IBAction)popupEngineModel:(id)sender
 
227
{
 
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];
 
235
}
 
236
 
 
237
-(IBAction)toggleStereoSid:(id)sender
 
238
{
 
239
    int stereoSid = [sender state] == NSOnState;
 
240
    [self setIntResource:@"SidStereo" toValue:stereoSid];
 
241
    [self updateResources:nil];
 
242
}
 
243
 
 
244
-(IBAction)popupStereoSidAddress:(id)sender
 
245
{
 
246
    NSString *title = [sender title];
 
247
    int addr;
 
248
    sscanf([title cStringUsingEncoding:NSUTF8StringEncoding],"$%x",&addr);
 
249
    [self setIntResource:@"SidStereoAddressStart" toValue:addr];
 
250
}
 
251
 
 
252
-(IBAction)toggleSidFilter:(id)sender
 
253
{
 
254
    int sidFilter = ([sender state] == NSOnState);
 
255
    [self setIntResource:@"SidFilters" toValue:sidFilter];
 
256
}
 
257
 
 
258
-(IBAction)popupResidSampleMethod:(id)sender
 
259
{
 
260
    [self setIntResource:@"SidResidSampling" toValue:[sender tag]];
 
261
}
 
262
 
 
263
-(IBAction)slideResidPasspand:(id)sender
 
264
{
 
265
    [self setIntResource:@"SidResidPassband" toValue:[sender intValue]];
 
266
    [self updateResidPassbandResources];
 
267
}
 
268
 
 
269
-(IBAction)enterResidPassband:(id)sender
 
270
{
 
271
    [self setIntResource:@"SidResidPassband" toValue:[sender intValue]];
 
272
    [self updateResidPassbandResources];
 
273
}
 
274
 
 
275
@end