mirror of https://github.com/FDOS/kernel.git
fake floppy ddt so hd access works correctly on floppyless systems, based on suggested fix from Eric
git-svn-id: https://svn.code.sf.net/p/freedos/svn/kernel/branches/UNSTABLE@1179 6ac86273-5f31-0410-b378-82cca8765d1b
This commit is contained in:
parent
392fb4148a
commit
596a8dd0d6
|
@ -583,7 +583,7 @@ void DosDefinePartition(struct DriveParamS *driveParam,
|
||||||
pddt->ddt_driveno = driveParam->driveno;
|
pddt->ddt_driveno = driveParam->driveno;
|
||||||
pddt->ddt_logdriveno = nUnits;
|
pddt->ddt_logdriveno = nUnits;
|
||||||
pddt->ddt_descflags = driveParam->descflags;
|
pddt->ddt_descflags = driveParam->descflags;
|
||||||
/* Turn of LBA if not forced and the partition is within 1023 cyls and of the right type */
|
/* Turn off LBA if not forced and the partition is within 1023 cyls and of the right type */
|
||||||
/* the FileSystem type was internally converted to LBA_xxxx if a non-LBA partition
|
/* the FileSystem type was internally converted to LBA_xxxx if a non-LBA partition
|
||||||
above cylinder 1023 was found */
|
above cylinder 1023 was found */
|
||||||
if (!InitKernelConfig.ForceLBA && !ExtLBAForce && !IsLBAPartition(pEntry->FileSystem))
|
if (!InitKernelConfig.ForceLBA && !ExtLBAForce && !IsLBAPartition(pEntry->FileSystem))
|
||||||
|
@ -1101,6 +1101,9 @@ strange_restart:
|
||||||
return PartitionsToIgnore;
|
return PartitionsToIgnore;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* query BIOS for number of hard disks
|
||||||
|
*/
|
||||||
int BIOS_nrdrives(void)
|
int BIOS_nrdrives(void)
|
||||||
{
|
{
|
||||||
iregs regs;
|
iregs regs;
|
||||||
|
@ -1210,20 +1213,42 @@ I don't know, if I did it right, but I tried to do it that way. TE
|
||||||
|
|
||||||
***********************************************************************/
|
***********************************************************************/
|
||||||
|
|
||||||
STATIC void make_ddt (ddt *pddt, int Unit, int driveno, int flags)
|
/* initializes a ddt and stores for later retrieval */
|
||||||
|
STATIC void create_ddt(ddt *pddt, int Unit, int driveno, int type, int ncyl, int flags, void *defbpb, int bpbsize)
|
||||||
{
|
{
|
||||||
pddt->ddt_next = MK_FP(0, 0xffff);
|
pddt->ddt_next = MK_FP(0, 0xffff);
|
||||||
pddt->ddt_logdriveno = Unit;
|
pddt->ddt_logdriveno = Unit;
|
||||||
pddt->ddt_driveno = driveno;
|
pddt->ddt_driveno = driveno;
|
||||||
pddt->ddt_type = init_getdriveparm(driveno, &pddt->ddt_defbpb);
|
pddt->ddt_type = type;
|
||||||
pddt->ddt_ncyl = (pddt->ddt_type & 7) ? 80 : 40;
|
pddt->ddt_ncyl = ncyl;
|
||||||
pddt->ddt_descflags = init_readdasd(driveno) | flags;
|
pddt->ddt_descflags = flags;
|
||||||
|
|
||||||
pddt->ddt_offset = 0;
|
pddt->ddt_offset = 0;
|
||||||
memcpy(&pddt->ddt_bpb, &pddt->ddt_defbpb, sizeof(bpb));
|
memcpy(&pddt->ddt_bpb, defbpb, bpbsize);
|
||||||
push_ddt(pddt);
|
push_ddt(pddt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* initializes a ddt for a drive that is assumed to not exist,
|
||||||
|
e.g. the fake ddt for floppies (A: & B:) on floppyless systems
|
||||||
|
*/
|
||||||
|
#define fake_ddt(pddt, Unit) create_ddt(pddt, Unit, \
|
||||||
|
0xFF, /* usually invalid BIOS drive # */ \
|
||||||
|
0x04, /* 2.88MB floppy, since usually for non-existant floppy */ \
|
||||||
|
80, \
|
||||||
|
DF_NOACCESS, \
|
||||||
|
&floppy_bpbs[4], sizeof(floppy_bpb) \
|
||||||
|
)
|
||||||
|
|
||||||
|
/* initializes ddt for a drive (logical or physical) assumed to exist */
|
||||||
|
#define make_ddt(pddt, Unit, driveno, flags) create_ddt(pddt, Unit, \
|
||||||
|
driveno, \
|
||||||
|
init_getdriveparm(driveno, &(pddt)->ddt_defbpb), \
|
||||||
|
( ((pddt)->ddt_type & 7) ? 80 : 40 ), \
|
||||||
|
( init_readdasd(driveno) | flags ), \
|
||||||
|
&(pddt)->ddt_defbpb, sizeof(bpb) \
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
/* disk initialization: returns number of units */
|
/* disk initialization: returns number of units */
|
||||||
COUNT dsk_init()
|
COUNT dsk_init()
|
||||||
{
|
{
|
||||||
|
@ -1235,7 +1260,7 @@ COUNT dsk_init()
|
||||||
|
|
||||||
printf(" - InitDisk\r");
|
printf(" - InitDisk\r");
|
||||||
|
|
||||||
#ifdef DEBUG
|
#if defined DEBUG && !defined DEBUG_PRINT_COMPORT
|
||||||
{
|
{
|
||||||
regs.a.x = 0x1112; /* select 43 line mode - more space for partinfo */
|
regs.a.x = 0x1112; /* select 43 line mode - more space for partinfo */
|
||||||
regs.b.x = 0;
|
regs.b.x = 0;
|
||||||
|
@ -1262,6 +1287,11 @@ COUNT dsk_init()
|
||||||
else
|
else
|
||||||
make_ddt(&nddt, 1, 0, DF_MULTLOG); /* phantom B: drive */
|
make_ddt(&nddt, 1, 0, DF_MULTLOG); /* phantom B: drive */
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fake_ddt(&nddt, 0);
|
||||||
|
fake_ddt(&nddt, 1);
|
||||||
|
}
|
||||||
|
|
||||||
/* Initial number of disk units */
|
/* Initial number of disk units */
|
||||||
nUnits = 2;
|
nUnits = 2;
|
||||||
|
@ -1341,5 +1371,6 @@ COUNT dsk_init()
|
||||||
ProcessDisk(SCAN_PRIMARY2, HardDrive, foundPartitions[HardDrive]);
|
ProcessDisk(SCAN_PRIMARY2, HardDrive, foundPartitions[HardDrive]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return nUnits;
|
return nUnits;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue