2
* drivesettingswindowcontroller.m - DriveSettings 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
27
#import "drivesettingswindowcontroller.h"
28
#import "viceapplication.h"
29
#import "vicenotifications.h"
33
@implementation DriveSettingsWindowController
37
self = [super initWithWindowNibName:@"DriveSettings"];
38
[self registerForResourceUpdate:@selector(updateResources:)];
41
DRIVE_TYPE_1541, DRIVE_TYPE_1541II, DRIVE_TYPE_1551,
42
DRIVE_TYPE_1570, DRIVE_TYPE_1571, DRIVE_TYPE_1571CR,
43
DRIVE_TYPE_1581, DRIVE_TYPE_2031, DRIVE_TYPE_2040,
44
DRIVE_TYPE_3040, DRIVE_TYPE_4040, DRIVE_TYPE_1001,
45
DRIVE_TYPE_8050, DRIVE_TYPE_8250
49
for(i=0;i<numDriveTypes;i++)
50
driveTypeMap[i] = map[i];
52
// TODO: set emulator dependent
61
// setup tab view labels
63
for(i=0;i<driveCount;i++) {
64
NSTabViewItem *item = [tabView tabViewItemAtIndex:i];
65
NSString *driveName = [NSString stringWithFormat:@"Drive %d",i+driveOffset];
66
[item setLabel:driveName];
69
// remove unused views
71
NSTabViewItem *item = [tabView tabViewItemAtIndex:driveCount];
72
[tabView removeTabViewItem:item];
77
[tabView selectFirstTabViewItem:self];
79
[self updateResources:nil];
80
[super windowDidLoad];
83
-(void)updateResources:(NSNotification *)notification
85
NSMatrix *driveType[4] = { driveType0,driveType1,
86
driveType2,driveType3 };
87
NSMatrix *trackHandling[4] = { trackHandling0,trackHandling1,
88
trackHandling2,trackHandling3 };
89
NSMatrix *idleMethod[4] = { idleMethod0, idleMethod1,
90
idleMethod2, idleMethod3 };
91
NSButton *parallelCable[4] = { parallelCable0,parallelCable1,
92
parallelCable1,parallelCable3 };
93
NSButton *driveExpansion2000[4] = { driveExpansion0_2000,driveExpansion1_2000,
94
driveExpansion2_2000,driveExpansion3_2000 };
95
NSButton *driveExpansion4000[4] = { driveExpansion0_4000,driveExpansion1_4000,
96
driveExpansion2_4000,driveExpansion3_4000 };
97
NSButton *driveExpansion6000[4] = { driveExpansion0_6000,driveExpansion1_6000,
98
driveExpansion2_6000,driveExpansion3_6000 };
99
NSButton *driveExpansion8000[4] = { driveExpansion0_8000,driveExpansion1_8000,
100
driveExpansion2_8000,driveExpansion3_8000 };
101
NSButton *driveExpansionA000[4] = { driveExpansion0_A000,driveExpansion1_A000,
102
driveExpansion2_A000,driveExpansion3_A000 };
104
int trueEmu = [self getIntResource:@"DriveTrueEmulation"];
106
for(i=0;i<driveCount;i++) {
107
int driveNum = driveOffset + i;
108
int isIecDrive = [self getIntResource:@"IECDevice%d" withNumber:driveNum];
109
int driveEnabled = trueEmu && !isIecDrive;
113
// type selector is enabled
114
[driveType[i] setEnabled:true];
116
// enable valid drive types
118
for(j=0;j<numDriveTypes;j++) {
119
int isDriveValid = drive_check_type([self mapToDriveType:j],i);
120
id cell = [driveType[i] cellAtRow:j column:0];
121
[cell setEnabled:isDriveValid];
124
// set current drive type
125
int driveTypeVal = [self getIntResource:@"Drive%dType" withNumber:driveNum];
126
int driveId = [self mapFromDriveType:driveTypeVal];
127
[driveType[i] selectCellAtRow:driveId column:0];
129
// extend track policy
130
int canExtendPolicy = drive_check_extend_policy(driveTypeVal);
131
[trackHandling[i] setEnabled:canExtendPolicy];
132
int extendPolicyVal = [self getIntResource:@"Drive%dExtendImagePolicy" withNumber:driveNum];
133
[trackHandling[i] selectCellAtRow:extendPolicyVal column:0];
136
int canIdleMethod = drive_check_idle_method(driveTypeVal);
137
[idleMethod[i] setEnabled:canIdleMethod];
138
int idleMethodVal = [self getIntResource:@"Drive%dIdleMethod" withNumber:driveNum];
139
[idleMethod[i] selectCellAtRow:idleMethodVal column:0];
143
canRam = drive_check_expansion2000(driveTypeVal);
144
[driveExpansion2000[i] setEnabled:canRam];
145
hasRam = [self getIntResource:@"Drive%dRAM2000" withNumber:driveNum];
146
[driveExpansion2000[i] setState:hasRam];
148
canRam = drive_check_expansion4000(driveTypeVal);
149
[driveExpansion4000[i] setEnabled:canRam];
150
hasRam = [self getIntResource:@"Drive%dRAM4000" withNumber:driveNum];
151
[driveExpansion4000[i] setState:hasRam];
153
canRam = drive_check_expansion6000(driveTypeVal);
154
[driveExpansion6000[i] setEnabled:canRam];
155
hasRam = [self getIntResource:@"Drive%dRAM6000" withNumber:driveNum];
156
[driveExpansion6000[i] setState:hasRam];
158
canRam = drive_check_expansion8000(driveTypeVal);
159
[driveExpansion8000[i] setEnabled:canRam];
160
hasRam = [self getIntResource:@"Drive%dRAM8000" withNumber:driveNum];
161
[driveExpansion8000[i] setState:hasRam];
163
canRam = drive_check_expansionA000(driveTypeVal);
164
[driveExpansionA000[i] setEnabled:canRam];
165
hasRam = [self getIntResource:@"Drive%dRAMA000" withNumber:driveNum];
166
[driveExpansionA000[i] setState:hasRam];
168
// select current driv
169
int canParallel = drive_check_parallel_cable(driveTypeVal);
170
[parallelCable[i] setEnabled:canParallel];
171
int parallelCableVal = [self getIntResource:@"Drive%dParallelCable" withNumber:driveNum];
172
[parallelCable[i] setState:parallelCableVal];
175
// disable all controls
176
[driveType[i] setEnabled:false];
177
[trackHandling[i] setEnabled:false];
178
[driveExpansion2000[i] setEnabled:false];
179
[driveExpansion4000[i] setEnabled:false];
180
[driveExpansion6000[i] setEnabled:false];
181
[driveExpansion8000[i] setEnabled:false];
182
[driveExpansionA000[i] setEnabled:false];
183
[idleMethod[i] setEnabled:false];
184
[parallelCable[i] setEnabled:false];
189
-(int)mapToDriveType:(int)driveId
191
if((driveId>=0)&&(driveId<numDriveTypes))
192
return driveTypeMap[driveId];
193
return DRIVE_TYPE_NONE;
196
-(int)mapFromDriveType:(int)driveType
199
for(i=0;i<numDriveTypes;i++) {
200
if(driveType == driveTypeMap[i])
203
return numDriveTypes;
206
// ----- Actions -----
208
-(void)changedDriveType:(id)sender
210
int driveNum = [sender tag] + driveOffset;
211
id cell = [sender selectedCell];
212
int driveId = [cell tag];
213
int driveType = [self mapToDriveType:driveId];
215
[self setIntResource:@"Drive%dType"
218
[self updateResources:nil];
221
-(void)changedTrackHandling:(id)sender
223
int driveNum = [sender tag] + driveOffset;
224
id cell = [sender selectedCell];
225
int type = [cell tag];
227
[self setIntResource:@"Drive%dExtendImagePolicy"
232
-(void)changedDriveExpansion2000:(id)sender
234
int driveNum = [sender tag] + driveOffset;
235
id cell = [sender selectedCell];
236
int on = [cell state];
238
[self setIntResource:@"Drive%dRAM2000"
243
-(void)changedDriveExpansion4000:(id)sender
245
int driveNum = [sender tag] + driveOffset;
246
id cell = [sender selectedCell];
247
int on = [cell state];
249
[self setIntResource:@"Drive%dRAM4000"
254
-(void)changedDriveExpansion6000:(id)sender
256
int driveNum = [sender tag] + driveOffset;
257
id cell = [sender selectedCell];
258
int on = [cell state];
260
[self setIntResource:@"Drive%dRAM6000"
265
-(void)changedDriveExpansion8000:(id)sender
267
int driveNum = [sender tag] + driveOffset;
268
id cell = [sender selectedCell];
269
int on = [cell state];
271
[self setIntResource:@"Drive%dRAM8000"
276
-(void)changedDriveExpansionA000:(id)sender
278
int driveNum = [sender tag] + driveOffset;
279
id cell = [sender selectedCell];
280
int on = [cell state];
282
[self setIntResource:@"Drive%dRAMA000"
287
-(void)changedIdleMethod:(id)sender
289
int driveNum = [sender tag] + driveOffset;
290
id cell = [sender selectedCell];
291
int type = [cell tag];
293
[self setIntResource:@"Drive%dIdleMethod"
298
-(void)toggledParallelCable:(id)sender
300
int driveNum = [sender tag] + driveOffset;
301
int on = [sender state];
303
[self setIntResource:@"Drive%dParallelCable"