Annotation of hatari/src/createBlankImage.c, revision 1.1.1.6

1.1       root        1: /*
1.1.1.4   root        2:   Hatari - createBlankImage.c
1.1.1.5   root        3:  
1.1.1.4   root        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.
1.1.1.5   root        6:  
1.1       root        7:   Create Blank .ST/.MSA Disc Images
                      8: */
1.1.1.6 ! root        9: char CreateBlankImage_rcsid[] = "Hatari $Id: createBlankImage.c,v 1.12 2005/06/05 14:19:39 thothy Exp $";
1.1       root       10: 
                     11: #include "main.h"
1.1.1.4   root       12: #include "configuration.h"
1.1.1.5   root       13: #include "dim.h"
1.1       root       14: #include "file.h"
                     15: #include "floppy.h"
1.1.1.6 ! root       16: #include "log.h"
1.1       root       17: #include "msa.h"
                     18: #include "st.h"
1.1.1.5   root       19: #include "createBlankImage.h"
1.1.1.3   root       20: 
1.1       root       21: /*-----------------------------------------------------------------------*/
                     22: /*
                     23:            40 track SS   40 track DS   80 track SS   80 track DS
                     24:  0- 1   Branch instruction to boot program if executable
                     25:  2- 7   'Loader'
                     26:  8-10   24-bit serial number
                     27: 11-12   BPS    512           512           512           512
                     28: 13      SPC     1             2             2             2
                     29: 14-15   RES     1             1             1             1
                     30: 16      FAT     2             2             2             2
                     31: 17-18   DIR     64           112           112           112
                     32: 19-20   SEC    360           720           720          1440
1.1.1.5   root       33: 21      MEDIA  $FC           $FD           $F8           $F9  (isn't used by ST-BIOS)
1.1       root       34: 22-23   SPF     2             2             5             5
                     35: 24-25   SPT     9             9             9             9
                     36: 26-27   SIDE    1             2             1             2
                     37: 28-29   HID     0             0             0             0
                     38: 510-511 CHECKSUM
                     39: */
                     40: 
1.1.1.2   root       41: 
                     42: /*-----------------------------------------------------------------------*/
1.1       root       43: /*
1.1.1.5   root       44:   Calculate the size of a disc in dialog
1.1       root       45: */
1.1.1.5   root       46: static int CreateBlankImage_GetDiscImageCapacity(int nTracks, int nSectors, int nSides)
1.1       root       47: {
1.1.1.5   root       48:        /* Find size of disc image */
                     49:        return nTracks*nSectors*nSides*NUMBYTESPERSECTOR;
1.1       root       50: }
                     51: 
1.1.1.2   root       52: 
                     53: /*-----------------------------------------------------------------------*/
1.1       root       54: /*
1.1.1.5   root       55:   Write a short integer to addr using little endian byte order
                     56:   (needed for 16 bit values in the bootsector of the disc image).
1.1       root       57: */
1.1.1.5   root       58: static inline void WriteShortLE(void *addr, Uint16 val)
1.1       root       59: {
1.1.1.5   root       60:        Uint8 *p = (Uint8 *)addr;
1.1       root       61: 
1.1.1.5   root       62:        p[0] = (Uint8)val;
                     63:        p[1] = (Uint8)(val >> 8);
1.1       root       64: }
                     65: 
1.1.1.2   root       66: 
                     67: /*-----------------------------------------------------------------------*/
1.1       root       68: /*
1.1.1.5   root       69:   Create .ST/.MSA disc image according to 'Tracks,Sector,Sides' and save as filename
1.1       root       70: */
1.1.1.5   root       71: void CreateBlankImage_CreateFile(char *pszFileName, int nTracks, int nSectors, int nSides)
1.1       root       72: {
1.1.1.5   root       73:        Uint8 *pDiscFile;
                     74:        unsigned long DiscSize;
1.1.1.6 ! root       75:        unsigned short int SPC, nDir, MediaByte, SPF;
1.1.1.5   root       76:        BOOL bRet=FALSE;
                     77: 
                     78:        /* Calculate size of disc image */
                     79:        DiscSize = CreateBlankImage_GetDiscImageCapacity(nTracks, nSectors, nSides);
                     80: 
                     81:        /* Allocate space for our 'file', and blank */
                     82:        pDiscFile = malloc(DiscSize);
                     83:        if (pDiscFile == NULL)
                     84:        {
                     85:                perror("Error while creating blank disc image");
                     86:                return;
                     87:        }
                     88:        memset(pDiscFile, 0, DiscSize);                       /* Clear buffer */
                     89: 
                     90:        /* Fill in boot-sector */
                     91:        pDiscFile[0] = 0xE9;                                  /* Needed for MS-DOS compatibility */
                     92:        memset(pDiscFile+2, 0x4e, 6);                         /* 2-7 'Loader' */
                     93: 
                     94:        WriteShortLE(pDiscFile+8, rand());                    /* 8-10 24-bit serial number */
                     95:        pDiscFile[10] = rand();
                     96: 
                     97:        WriteShortLE(pDiscFile+11, NUMBYTESPERSECTOR);        /* 11-12 BPS */
                     98: 
                     99:        if ((nTracks == 40) && (nSides == 1))
                    100:                SPC = 1;
                    101:        else
                    102:                SPC = 2;
                    103:        pDiscFile[13] = SPC;                                  /* 13 SPC */
                    104: 
                    105:        WriteShortLE(pDiscFile+14, 1);                        /* 14-15 RES */
                    106:        pDiscFile[16] = 2;                                    /* 16 FAT */
                    107: 
                    108:        if (SPC==1)
1.1.1.6 ! root      109:                nDir = 64;
1.1.1.5   root      110:        else
1.1.1.6 ! root      111:                nDir = 112;
        !           112:        WriteShortLE(pDiscFile+17, nDir);                     /* 17-18 DIR */
1.1.1.5   root      113: 
                    114:        WriteShortLE(pDiscFile+19, nTracks*nSectors*nSides);  /* 19-20 SEC */
                    115: 
                    116:        if (nTracks <= 42)
                    117:                MediaByte = 0xFC;
                    118:        else
                    119:                MediaByte = 0xF8;
                    120:        if (nSides == 2)
                    121:                MediaByte |= 0x01;
                    122:        pDiscFile[21] = MediaByte;                            /* 21 MEDIA */
                    123: 
                    124:        if (nTracks >= 80)
                    125:                SPF = 5;
                    126:        else
                    127:                SPF = 2;
                    128:        WriteShortLE(pDiscFile+22, SPF);                      /* 22-23 SPF */
                    129: 
                    130:        WriteShortLE(pDiscFile+24, nSectors);                 /* 24-25 SPT */
                    131:        WriteShortLE(pDiscFile+26, nSides);                   /* 26-27 SIDE */
                    132:        WriteShortLE(pDiscFile+28, 0);                        /* 28-29 HID */
                    133: 
                    134:        /* Set correct media bytes in the 1st FAT: */
                    135:        pDiscFile[512] = MediaByte;
                    136:        pDiscFile[513] = pDiscFile[514] = 0xFF;
                    137:        /* Set correct media bytes in the 2nd FAT: */
                    138:        pDiscFile[512 + SPF * 512] = MediaByte;
                    139:        pDiscFile[513 + SPF * 512] = pDiscFile[514 + SPF * 512] = 0xFF;
                    140: 
                    141:        /* Ask if OK to overwrite, if exists? */
                    142:        if (File_QueryOverwrite(pszFileName))
                    143:        {
                    144:                /* Save image to file */
                    145:                if (MSA_FileNameIsMSA(pszFileName, TRUE))
                    146:                        bRet = MSA_WriteDisc(pszFileName, pDiscFile, DiscSize);
                    147:                else if (ST_FileNameIsST(pszFileName, TRUE))
                    148:                        bRet = ST_WriteDisc(pszFileName, pDiscFile, DiscSize);
                    149:                else if (DIM_FileNameIsDIM(pszFileName, TRUE))
                    150:                        bRet = DIM_WriteDisc(pszFileName, pDiscFile, DiscSize);
                    151: 
                    152:                /* Did create successfully? */
                    153:                if (bRet)
                    154:                {
                    155:                        /* Say OK, */
1.1.1.6 ! root      156:                        Log_AlertDlg(LOG_INFO, "Disk image has been created successfully.");
1.1.1.5   root      157:                }
                    158:                else
                    159:                {
                    160:                        /* Warn user we were unable to create image */
1.1.1.6 ! root      161:                        Log_AlertDlg(LOG_ERROR, "Unable to create disk image!");
1.1.1.5   root      162:                }
                    163:        }
1.1       root      164: 
1.1.1.5   root      165:        /* Free image */
                    166:        free(pDiscFile);
1.1       root      167: }

unix.superglobalmegacorp.com

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