Skip to content

Commit 842a13b

Browse files
committed
adf_dev refactor: move geometry setting to opening device, #4
This code does exacly the same (using geometry from Rigid Block if present), but it does additional validity checks and gives a warning in case the geometry read from the device (or set / calculated) differs from the one in Rigid Block.
1 parent f1ee7d9 commit 842a13b

File tree

3 files changed

+128
-24
lines changed

3 files changed

+128
-24
lines changed

src/adf_dev.c

+127-8
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@
3636
#include <string.h>
3737

3838

39+
static RETCODE adfDevSetCalculatedGeometry_ ( struct AdfDevice * const dev );
40+
static BOOL adfDevIsGeometryValid_ ( const struct AdfDevice * const dev );
41+
42+
3943
struct AdfDevice * adfDevCreate ( const char * const driverName,
4044
const char * const name,
4145
const uint32_t cylinders,
@@ -49,27 +53,91 @@ struct AdfDevice * adfDevCreate ( const char * const driverName,
4953
}
5054

5155

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 )
5460
{
55-
const struct AdfDeviceDriver * const driver = adfGetDeviceDriverByDevName ( name );
5661
if ( driver == NULL || driver->openDev == NULL )
5762
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 );
59129
}
60130

61131

62132
struct AdfDevice * adfDevOpenWithDriver ( const char * const driverName,
63133
const char * const name,
64134
const AdfAccessMode mode )
65135
{
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 );
70137
}
71138

72139

140+
73141
/*
74142
* adfDevClose
75143
*
@@ -272,3 +340,54 @@ RETCODE adfDevWriteBlock ( struct AdfDevice * const dev,
272340
/*printf("nativ=%d\n",dev->isNativeDev);*/
273341
return dev->drv->writeSector ( dev, pSect, size, buf );
274342
}
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+
}

src/adf_dev_flop.c

+1-8
Original file line numberDiff line numberDiff line change
@@ -41,20 +41,13 @@
4141
* normaly not used directly, called directly by adfDevMount()
4242
*
4343
* use dev->devType to choose between DD and HD
44-
* fills geometry and the volume list with one volume
44+
* fills the volume list with one volume
4545
*/
4646
RETCODE adfMountFlop ( struct AdfDevice * const dev )
4747
{
4848
struct AdfVolume *vol;
4949
struct bRootBlock root;
5050
char diskName[35];
51-
52-
dev->cylinders = 80;
53-
dev->heads = 2;
54-
if (dev->devType==DEVTYPE_FLOPDD)
55-
dev->sectors = 11;
56-
else
57-
dev->sectors = 22;
5851

5952
vol = (struct AdfVolume *) malloc (sizeof(struct AdfVolume));
6053
if (!vol) {

src/adf_dev_hd.c

-8
Original file line numberDiff line numberDiff line change
@@ -90,10 +90,6 @@ RETCODE adfMountHdFile ( struct AdfDevice * const dev )
9090

9191
vol->volName=NULL;
9292

93-
dev->cylinders = dev->size/512;
94-
dev->heads = 1;
95-
dev->sectors = 1;
96-
9793
vol->firstBlock = 0;
9894

9995
unsigned size = dev->size + 512 - ( dev->size % 512 );
@@ -142,10 +138,6 @@ RETCODE adfMountHd ( struct AdfDevice * const dev )
142138
if ( rc != RC_OK )
143139
return rc;
144140

145-
dev->cylinders = rdsk.cylinders;
146-
dev->heads = rdsk.heads;
147-
dev->sectors = rdsk.sectors;
148-
149141
/* PART blocks */
150142
listRoot = NULL;
151143
next = rdsk.partitionList;

0 commit comments

Comments
 (0)