Annotation of hatari/tools/hmsa/floppy.c, revision 1.1

1.1     ! root        1: /*
        !             2:   Hatari tool: Magic Shadow Archiver - floppy.c
        !             3: 
        !             4:   This file is distributed under the GNU Public License, version 2 or at
        !             5:   your option any later version. Read the file gpl.txt for details.
        !             6: 
        !             7:   Check for valid floppy disk geometry.
        !             8: */
        !             9: 
        !            10: #include <stdio.h>
        !            11: #include <SDL_endian.h>
        !            12: 
        !            13: #include "hmsa.h"
        !            14: #include "floppy.h"
        !            15: 
        !            16: 
        !            17: /**
        !            18:  * Double-check information read from boot-sector as this is sometimes found to
        !            19:  * be incorrect. The .ST image file should be divisible by the sector size and
        !            20:  * sectors per track.
        !            21:  * NOTE - Pass information from boot-sector to this function (if we can't
        !            22:  * decide we leave it alone).
        !            23:  */
        !            24: static void Floppy_DoubleCheckFormat(long nDiskSize, Uint16 *pnSides, Uint16 *pnSectorsPerTrack)
        !            25: {
        !            26:        int nSectorsPerTrack;
        !            27:        long TotalSectors;
        !            28: 
        !            29:        /* Now guess at number of sides */
        !            30:        if (nDiskSize < (500*1024))                    /* Is size is >500k assume 2 sides to disk! */
        !            31:                *pnSides = 1;
        !            32:        else
        !            33:                *pnSides = 2;
        !            34: 
        !            35:        /* And Sectors Per Track(always 512 bytes per sector) */
        !            36:        TotalSectors = nDiskSize/512;                 /* # Sectors on disk image */
        !            37:        /* Does this match up with what we've read from boot-sector? */
        !            38:        nSectorsPerTrack = *pnSectorsPerTrack;
        !            39:        if (nSectorsPerTrack==0)                      /* Check valid, default to 9 */
        !            40:                nSectorsPerTrack = 9;
        !            41:        if ((TotalSectors%nSectorsPerTrack)!=0)
        !            42:        {
        !            43:                /* No, we have an invalid boot-sector - re-calculate from disk size */
        !            44:                if ((TotalSectors%9)==0)                    /* Work in this order.... */
        !            45:                        *pnSectorsPerTrack = 9;
        !            46:                else if ((TotalSectors%10)==0)
        !            47:                        *pnSectorsPerTrack = 10;
        !            48:                else if ((TotalSectors%11)==0)
        !            49:                        *pnSectorsPerTrack = 11;
        !            50:                else if ((TotalSectors%12)==0)
        !            51:                        *pnSectorsPerTrack = 12;
        !            52:        }
        !            53:        /* else unknown, assume boot-sector is correct!!! */
        !            54: }
        !            55: 
        !            56: 
        !            57: /**
        !            58:  * Find details of disk image. We need to do this via a function as sometimes the boot-block
        !            59:  * is not actually correct with the image - some demos/game disks have incorrect bytes in the
        !            60:  * boot sector and this attempts to find the correct values.
        !            61:  */
        !            62: void Floppy_FindDiskDetails(const Uint8 *pBuffer, int nImageBytes,
        !            63:                             unsigned short *pnSectorsPerTrack, unsigned short *pnSides)
        !            64: {
        !            65:        Uint16 nSectorsPerTrack, nSides, nSectors;
        !            66: 
        !            67:        /* First do check to find number of sectors and bytes per sector */
        !            68:        nSectorsPerTrack = SDL_SwapLE16(*(const Uint16 *)(pBuffer+24));   /* SPT */
        !            69:        nSides = SDL_SwapLE16(*(const Uint16 *)(pBuffer+26));             /* SIDE */
        !            70:        nSectors = pBuffer[19] | (pBuffer[20] << 8);                      /* total sectors */
        !            71: 
        !            72:        /* If the number of sectors announced is incorrect, the boot-sector may
        !            73:         * contain incorrect information, eg the 'Eat.st' demo, or wrongly imaged
        !            74:         * single/double sided floppies... */
        !            75:        if (nSectors != nImageBytes/512)
        !            76:                Floppy_DoubleCheckFormat(nImageBytes, &nSides, &nSectorsPerTrack);
        !            77: 
        !            78:        /* And set values */
        !            79:        if (pnSectorsPerTrack)
        !            80:                *pnSectorsPerTrack = nSectorsPerTrack;
        !            81:        if (pnSides)
        !            82:                *pnSides = nSides;
        !            83: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.