36
36
#include <string.h>
37
37
38
38
39
+ static RETCODE adfDevSetCalculatedGeometry_ ( struct AdfDevice * const dev );
40
+ static BOOL adfDevIsGeometryValid_ ( const struct AdfDevice * const dev );
41
+
42
+
39
43
struct AdfDevice * adfDevCreate ( const char * const driverName ,
40
44
const char * const name ,
41
45
const uint32_t cylinders ,
@@ -49,27 +53,91 @@ struct AdfDevice * adfDevCreate ( const char * const driverName,
49
53
}
50
54
51
55
52
- struct AdfDevice * adfDevOpen ( const char * const name ,
53
- const AdfAccessMode mode )
56
+ static struct AdfDevice *
57
+ adfDevOpenWithDrv_ ( const struct AdfDeviceDriver * const driver ,
58
+ const char * const name ,
59
+ const AdfAccessMode mode )
54
60
{
55
- const struct AdfDeviceDriver * const driver = adfGetDeviceDriverByDevName ( name );
56
61
if ( driver == NULL || driver -> openDev == NULL )
57
62
return NULL ;
58
- return driver -> openDev ( name , mode );
63
+
64
+ struct AdfDevice * const dev = driver -> openDev ( name , mode );
65
+ if ( dev == NULL )
66
+ return NULL ;
67
+
68
+ dev -> devType = adfDevType ( dev );
69
+
70
+ if ( ! dev -> drv -> isNative () ) {
71
+ if ( adfDevSetCalculatedGeometry_ ( dev ) != RC_OK ) {
72
+ dev -> drv -> closeDev ( dev );
73
+ return NULL ;
74
+ }
75
+ }
76
+
77
+ if ( ! adfDevIsGeometryValid_ ( dev ) ) {
78
+ adfEnv .eFct ( "adfDevOpen : invalid geometry: cyliders %u,"
79
+ "heads: %u, sectors: %u, size: %u, device: %s" ,
80
+ dev -> cylinders , dev -> heads , dev -> sectors , dev -> size , dev -> name );
81
+ dev -> drv -> closeDev ( dev );
82
+ return NULL ;
83
+ }
84
+
85
+ if ( dev -> devType != DEVTYPE_HARDDISK )
86
+ return dev ;
87
+
88
+ struct bRDSKblock rdsk ;
89
+ RETCODE rc = adfReadRDSKblock ( dev , & rdsk );
90
+ if ( rc == RC_OK ) {
91
+ /* rigid block exists -> check geometry */
92
+ //if ( ! adfDevIsRDSKGeometryValid_ ( dev, &rdsk ) ) {
93
+ if ( dev -> cylinders != rdsk .cylinders ||
94
+ dev -> heads != rdsk .heads ||
95
+ dev -> sectors != rdsk .sectors )
96
+ {
97
+ adfEnv .wFct ( "adfDevOpen : using geometry from Rigid Block, different than detected/calculated(!):\n"
98
+ " detected rdsk block\n"
99
+ " cyliders: %3u %3u\n"
100
+ " heads: %3u %3u\n"
101
+ " sectors: %3u %3u" ,
102
+ " size: %ull %ull" ,
103
+ dev -> cylinders , rdsk .cylinders ,
104
+ dev -> heads , rdsk .heads ,
105
+ dev -> sectors , rdsk .sectors ,
106
+ dev -> size ,
107
+ rdsk .cylinders * rdsk .heads * rdsk .sectors * 512 );
108
+ dev -> cylinders = rdsk .cylinders ;
109
+ dev -> heads = rdsk .heads ;
110
+ dev -> sectors = rdsk .sectors ;
111
+ if ( ! adfDevIsGeometryValid_ ( dev ) ) {
112
+ adfEnv .eFct ( "adfDevOpen : invalid geometry: cyliders %u, "
113
+ "heads: %u, sectors: %u, size: %u, device: %s" ,
114
+ dev -> cylinders , dev -> heads , dev -> sectors , dev -> size , dev -> name );
115
+ dev -> drv -> closeDev ( dev );
116
+ return NULL ;
117
+ }
118
+ }
119
+ }
120
+
121
+ return dev ;
122
+ }
123
+
124
+
125
+ struct AdfDevice * adfDevOpen ( const char * const name ,
126
+ const AdfAccessMode mode )
127
+ {
128
+ return adfDevOpenWithDrv_ ( adfGetDeviceDriverByDevName ( name ), name , mode );
59
129
}
60
130
61
131
62
132
struct AdfDevice * adfDevOpenWithDriver ( const char * const driverName ,
63
133
const char * const name ,
64
134
const AdfAccessMode mode )
65
135
{
66
- const struct AdfDeviceDriver * const driver = adfGetDeviceDriverByName ( driverName );
67
- if ( driver == NULL || driver -> openDev == NULL )
68
- return NULL ;
69
- return driver -> openDev ( name , mode );
136
+ return adfDevOpenWithDrv_ ( adfGetDeviceDriverByName ( driverName ), name , mode );
70
137
}
71
138
72
139
140
+
73
141
/*
74
142
* adfDevClose
75
143
*
@@ -272,3 +340,54 @@ RETCODE adfDevWriteBlock ( struct AdfDevice * const dev,
272
340
/*printf("nativ=%d\n",dev->isNativeDev);*/
273
341
return dev -> drv -> writeSector ( dev , pSect , size , buf );
274
342
}
343
+
344
+
345
+ static RETCODE adfDevSetCalculatedGeometry_ ( struct AdfDevice * const dev )
346
+ {
347
+ /* set geometry (based on already set size) */
348
+ switch ( dev -> devType ) {
349
+ case DEVTYPE_FLOPDD :
350
+ dev -> heads = 2 ;
351
+ dev -> sectors = 11 ;
352
+ dev -> cylinders = dev -> size / ( dev -> heads * dev -> sectors * 512 );
353
+ if ( dev -> cylinders < 80 || dev -> cylinders > 83 ) {
354
+ adfEnv .eFct ( "adfDevSetCalculatedGeometry_: invalid size %u" , dev -> size );
355
+ return RC_ERROR ;
356
+ }
357
+ break ;
358
+
359
+ case DEVTYPE_FLOPHD :
360
+ dev -> heads = 2 ;
361
+ dev -> sectors = 22 ;
362
+ dev -> cylinders = dev -> size / ( dev -> heads * dev -> sectors * 512 );
363
+ if ( dev -> cylinders != 80 ) {
364
+ adfEnv .eFct ( "adfDevSetCalculatedGeometry_: invalid size %u" , dev -> size );
365
+ return RC_ERROR ;
366
+ }
367
+ break ;
368
+
369
+ case DEVTYPE_HARDDISK :
370
+ case DEVTYPE_HARDFILE :
371
+ //dev->heads = 2;
372
+ //dev->sectors = dev->size / 4;
373
+ //dev->cylinders = dev->size / ( dev->sectors * dev->heads * 512 );
374
+ dev -> heads = 1 ;
375
+ dev -> sectors = 1 ;
376
+ dev -> cylinders = dev -> size / 512 ;
377
+ break ;
378
+
379
+ default :
380
+ adfEnv .eFct ( "adfDevSetCalculatedGeometry_: invalid dev type %d" , dev -> devType );
381
+ return RC_ERROR ;
382
+ }
383
+ return RC_OK ;
384
+ }
385
+
386
+
387
+ static BOOL adfDevIsGeometryValid_ ( const struct AdfDevice * const dev )
388
+ {
389
+ return ( dev -> cylinders > 0 &&
390
+ dev -> heads > 0 &&
391
+ dev -> sectors > 0 &&
392
+ dev -> cylinders * dev -> heads * dev -> sectors * 512 == dev -> size );
393
+ }
0 commit comments