ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/cebix/BasiliskII/src/sony.cpp
(Generate patch)

Comparing BasiliskII/src/sony.cpp (file contents):
Revision 1.10 by cebix, 2001-02-10T20:03:55Z vs.
Revision 1.15 by cebix, 2004-01-12T15:29:22Z

# Line 1 | Line 1
1   /*
2   *  sony.cpp - Replacement .Sony driver (floppy drives)
3   *
4 < *  Basilisk II (C) 1997-2001 Christian Bauer
4 > *  Basilisk II (C) 1997-2004 Christian Bauer
5   *
6   *  This program is free software; you can redistribute it and/or modify
7   *  it under the terms of the GNU General Public License as published by
# Line 28 | Line 28
28   *    Technote FL 24: "Don't Look at ioPosOffset for Devices"
29   */
30  
31 + #include "sysdeps.h"
32 +
33   #include <string.h>
34 + #include <vector>
35 +
36 + #ifndef NO_STD_NAMESPACE
37 + using std::vector;
38 + #endif
39  
33 #include "sysdeps.h"
40   #include "cpu_emulation.h"
41   #include "main.h"
42   #include "macos_util.h"
# Line 99 | Line 105 | const uint8 SonyDriveIcon[258] = {
105  
106  
107   // Struct for each drive
108 < struct DriveInfo {
109 <        DriveInfo()
110 <        {
111 <                next = NULL;
112 <                num = 0;
107 <                fh = NULL;
108 <                read_only = false;
109 <                status = 0;
110 <        }
108 > struct sony_drive_info {
109 >        sony_drive_info() : num(0), fh(NULL), read_only(false), status(0) {}
110 >        sony_drive_info(void *fh_, bool ro) : num(0), fh(fh_), read_only(ro), status(0) {}
111 >
112 >        void close_fh(void) { Sys_close(fh); }
113  
112        DriveInfo *next;        // Pointer to next DriveInfo (must be first in struct!)
114          int num;                        // Drive number
115          void *fh;                       // Floppy driver file handle
116          bool to_be_mounted;     // Flag: drive must be mounted in accRun
# Line 118 | Line 119 | struct DriveInfo {
119          uint32 status;          // Mac address of drive status record
120   };
121  
122 < // Linked list of DriveInfos
123 < static DriveInfo *first_drive_info;
122 > // List of drives handled by this driver
123 > typedef vector<sony_drive_info> drive_vec;
124 > static drive_vec drives;
125  
126   // Icon addresses (Mac address space, set by PatchROM())
127   uint32 SonyDiskIconAddr;
# Line 130 | Line 132 | static bool acc_run_called = false;
132  
133  
134   /*
135 < *  Get pointer to drive info, NULL = invalid drive number
135 > *  Get reference to drive info or drives.end() if not found
136   */
137  
138 < static DriveInfo *get_drive_info(int num)
138 > static drive_vec::iterator get_drive_info(int num)
139   {
140 <        DriveInfo *info = first_drive_info;
141 <        while (info != NULL) {
140 >        drive_vec::iterator info, end = drives.end();
141 >        for (info = drives.begin(); info != end; ++info) {
142                  if (info->num == num)
143                          return info;
142                info = info->next;
144          }
145 <        return NULL;
145 >        return info;
146   }
147  
148  
# Line 151 | Line 152 | static DriveInfo *get_drive_info(int num
152  
153   void SonyInit(void)
154   {
154        first_drive_info = NULL;
155
155          // No drives specified in prefs? Then add defaults
156          if (PrefsFindString("floppy", 0) == NULL)
157                  SysAddFloppyPrefs();
158  
159          // Add drives specified in preferences
160 <        int32 index = 0;
160 >        int index = 0;
161          const char *str;
162          while ((str = PrefsFindString("floppy", index++)) != NULL) {
163                  bool read_only = false;
# Line 167 | Line 166 | void SonyInit(void)
166                          str++;
167                  }
168                  void *fh = Sys_open(str, read_only);
169 <                if (fh) {
170 <                        DriveInfo *info = new DriveInfo;
172 <                        info->fh = fh;
173 <                        info->read_only = SysIsReadOnly(fh);
174 <                        DriveInfo *p = (DriveInfo *)&first_drive_info;
175 <                        while (p->next != NULL)
176 <                                p = p->next;
177 <                        p->next = info;
178 <                }
169 >                if (fh)
170 >                        drives.push_back(sony_drive_info(fh, SysIsReadOnly(fh)));
171          }
172   }
173  
# Line 186 | Line 178 | void SonyInit(void)
178  
179   void SonyExit(void)
180   {
181 <        DriveInfo *info = first_drive_info, *next;
182 <        while (info != NULL) {
183 <                Sys_close(info->fh);
184 <                next = info->next;
193 <                delete info;
194 <                info = next;
195 <        }
181 >        drive_vec::iterator info, end = drives.end();
182 >        for (info = drives.begin(); info != end; ++info)
183 >                info->close_fh();
184 >        drives.clear();
185   }
186  
187  
# Line 202 | Line 191 | void SonyExit(void)
191  
192   bool SonyMountVolume(void *fh)
193   {
194 <        DriveInfo *info;
195 <        for (info = first_drive_info; info != NULL && info->fh != fh; info = info->next) ;
196 <        if (info) {
194 >        drive_vec::iterator info = drives.begin(), end = drives.end();
195 >        while (info != end && info->fh != fh)
196 >                ++info;
197 >        if (info != end) {
198 >                D(bug("Looking for disk in drive %d\n", info->num));
199                  if (SysIsDiskInserted(info->fh)) {
200                          info->read_only = SysIsReadOnly(info->fh);
201                          WriteMacInt8(info->status + dsDiskInPlace, 1);  // Inserted removable disk
202                          WriteMacInt8(info->status + dsWriteProt, info->read_only ? 0xff : 0);
203 +                        D(bug(" disk inserted, mounting\n"));
204                          info->to_be_mounted = true;
205                  }
206                  return true;
# Line 224 | Line 216 | bool SonyMountVolume(void *fh)
216  
217   static void mount_mountable_volumes(void)
218   {
219 <        DriveInfo *info = first_drive_info;
220 <        while (info != NULL) {
219 >        drive_vec::iterator info, end = drives.end();
220 >        for (info = drives.begin(); info != end; ++info) {
221  
222   #if DISK_INSERT_CHECK
223                  // Disk in drive?
224 <                if (!ReadMacInt8(info->status + dsDiskInPlace)) {
224 >                if (ReadMacInt8(info->status + dsDiskInPlace) == 0) {
225  
226                          // No, check if disk was inserted
227                          if (SysIsDiskInserted(info->fh))
# Line 246 | Line 238 | static void mount_mountable_volumes(void
238                          Execute68kTrap(0xa02f, &r);             // PostEvent()
239                          info->to_be_mounted = false;
240                  }
249
250                info = info->next;
241          }
242   }
243  
# Line 258 | Line 248 | static void mount_mountable_volumes(void
248  
249   static int16 set_dsk_err(int16 err)
250   {
251 +        D(bug("set_dsk_err(%d)\n", err));
252          WriteMacInt16(0x142, err);
253          return err;
254   }
# Line 287 | Line 278 | int16 SonyOpen(uint32 pb, uint32 dce)
278          set_dsk_err(0);
279  
280          // Install drives
281 <        for (DriveInfo *info = first_drive_info; info; info = info->next) {
281 >        drive_vec::iterator info, end = drives.end();
282 >        for (info = drives.begin(); info != end; ++info) {
283  
284                  info->num = FindFreeDriveNumber(1);
285                  info->to_be_mounted = false;
# Line 318 | Line 310 | int16 SonyOpen(uint32 pb, uint32 dce)
310                          if (SysIsDiskInserted(info->fh)) {
311                                  WriteMacInt8(info->status + dsDiskInPlace, 1);  // Inserted removable disk
312                                  WriteMacInt8(info->status + dsWriteProt, info->read_only ? 0xff : 0);
313 +                                D(bug(" disk inserted, flagging for mount\n"));
314                                  info->to_be_mounted = true;
315                          }
316  
# Line 341 | Line 334 | int16 SonyPrime(uint32 pb, uint32 dce)
334          WriteMacInt32(pb + ioActCount, 0);
335  
336          // Drive valid and disk inserted?
337 <        DriveInfo *info;
338 <        if ((info = get_drive_info(ReadMacInt16(pb + ioVRefNum))) == NULL)
337 >        drive_vec::iterator info = get_drive_info(ReadMacInt16(pb + ioVRefNum));
338 >        if (info == drives.end())
339                  return set_dsk_err(nsDrvErr);
340          if (!ReadMacInt8(info->status + dsDiskInPlace))
341                  return set_dsk_err(offLinErr);
# Line 411 | Line 404 | int16 SonyControl(uint32 pb, uint32 dce)
404          }
405  
406          // Drive valid?
407 <        DriveInfo *info;
408 <        if ((info = get_drive_info(ReadMacInt16(pb + ioVRefNum))) == NULL)
407 >        drive_vec::iterator info = get_drive_info(ReadMacInt16(pb + ioVRefNum));
408 >        if (info == drives.end())
409                  return set_dsk_err(nsDrvErr);
410  
411          // Drive-specific codes
# Line 492 | Line 485 | int16 SonyStatus(uint32 pb, uint32 dce)
485          D(bug("SonyStatus %d\n", code));
486  
487          // Drive valid?
488 <        DriveInfo *info;
489 <        if ((info = get_drive_info(ReadMacInt16(pb + ioVRefNum))) == NULL)
488 >        drive_vec::iterator info = get_drive_info(ReadMacInt16(pb + ioVRefNum));
489 >        if (info == drives.end())
490                  return set_dsk_err(nsDrvErr);
491  
492          int16 err = noErr;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines