mirror of
https://github.com/Wiimpathy/HatariWii.git
synced 2024-11-22 17:59:14 +01:00
84 lines
2.9 KiB
C
84 lines
2.9 KiB
C
/*
|
|
Hatari tool: Magic Shadow Archiver - floppy.c
|
|
|
|
This file is distributed under the GNU General Public License, version 2
|
|
or at your option any later version. Read the file gpl.txt for details.
|
|
|
|
Check for valid floppy disk geometry.
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <SDL_endian.h>
|
|
|
|
#include "hmsa.h"
|
|
#include "floppy.h"
|
|
|
|
|
|
/**
|
|
* Double-check information read from boot-sector as this is sometimes found to
|
|
* be incorrect. The .ST image file should be divisible by the sector size and
|
|
* sectors per track.
|
|
* NOTE - Pass information from boot-sector to this function (if we can't
|
|
* decide we leave it alone).
|
|
*/
|
|
static void Floppy_DoubleCheckFormat(long nDiskSize, Uint16 *pnSides, Uint16 *pnSectorsPerTrack)
|
|
{
|
|
int nSectorsPerTrack;
|
|
long TotalSectors;
|
|
|
|
/* Now guess at number of sides */
|
|
if (nDiskSize < (500*1024)) /* Is size is >500k assume 2 sides to disk! */
|
|
*pnSides = 1;
|
|
else
|
|
*pnSides = 2;
|
|
|
|
/* And Sectors Per Track(always 512 bytes per sector) */
|
|
TotalSectors = nDiskSize/512; /* # Sectors on disk image */
|
|
/* Does this match up with what we've read from boot-sector? */
|
|
nSectorsPerTrack = *pnSectorsPerTrack;
|
|
if (nSectorsPerTrack==0) /* Check valid, default to 9 */
|
|
nSectorsPerTrack = 9;
|
|
if ((TotalSectors%nSectorsPerTrack)!=0)
|
|
{
|
|
/* No, we have an invalid boot-sector - re-calculate from disk size */
|
|
if ((TotalSectors%9)==0) /* Work in this order.... */
|
|
*pnSectorsPerTrack = 9;
|
|
else if ((TotalSectors%10)==0)
|
|
*pnSectorsPerTrack = 10;
|
|
else if ((TotalSectors%11)==0)
|
|
*pnSectorsPerTrack = 11;
|
|
else if ((TotalSectors%12)==0)
|
|
*pnSectorsPerTrack = 12;
|
|
}
|
|
/* else unknown, assume boot-sector is correct!!! */
|
|
}
|
|
|
|
|
|
/**
|
|
* Find details of disk image. We need to do this via a function as sometimes the boot-block
|
|
* is not actually correct with the image - some demos/game disks have incorrect bytes in the
|
|
* boot sector and this attempts to find the correct values.
|
|
*/
|
|
void Floppy_FindDiskDetails(const Uint8 *pBuffer, int nImageBytes,
|
|
unsigned short *pnSectorsPerTrack, unsigned short *pnSides)
|
|
{
|
|
Uint16 nSectorsPerTrack, nSides, nSectors;
|
|
|
|
/* First do check to find number of sectors and bytes per sector */
|
|
nSectorsPerTrack = SDL_SwapLE16(*(const Uint16 *)(pBuffer+24)); /* SPT */
|
|
nSides = SDL_SwapLE16(*(const Uint16 *)(pBuffer+26)); /* SIDE */
|
|
nSectors = pBuffer[19] | (pBuffer[20] << 8); /* total sectors */
|
|
|
|
/* If the number of sectors announced is incorrect, the boot-sector may
|
|
* contain incorrect information, eg the 'Eat.st' demo, or wrongly imaged
|
|
* single/double sided floppies... */
|
|
if (nSectors != nImageBytes/512)
|
|
Floppy_DoubleCheckFormat(nImageBytes, &nSides, &nSectorsPerTrack);
|
|
|
|
/* And set values */
|
|
if (pnSectorsPerTrack)
|
|
*pnSectorsPerTrack = nSectorsPerTrack;
|
|
if (pnSides)
|
|
*pnSides = nSides;
|
|
}
|