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

1.1     ! root        1: /*
        !             2:   Hatari
        !             3: 
        !             4:   Create Blank .ST/.MSA Disc Images
        !             5: */
        !             6: 
        !             7: #include "main.h"
        !             8: #include "dialog.h"
        !             9: #include "file.h"
        !            10: #include "floppy.h"
        !            11: #include "memAlloc.h"
        !            12: #include "misc.h"
        !            13: #include "msa.h"
        !            14: #include "st.h"
        !            15: 
        !            16: 
        !            17: /*-----------------------------------------------------------------------*/
        !            18: /*
        !            19:            40 track SS   40 track DS   80 track SS   80 track DS
        !            20:  0- 1   Branch instruction to boot program if executable
        !            21:  2- 7   'Loader'
        !            22:  8-10   24-bit serial number
        !            23: 11-12   BPS    512           512           512           512
        !            24: 13      SPC     1             2             2             2
        !            25: 14-15   RES     1             1             1             1
        !            26: 16      FAT     2             2             2             2
        !            27: 17-18   DIR     64           112           112           112
        !            28: 19-20   SEC    360           720           720          1440
        !            29: 21      MEDIA  252           253           248           249 (isn't used by ST-BIOS)
        !            30: 22-23   SPF     2             2             5             5
        !            31: 24-25   SPT     9             9             9             9
        !            32: 26-27   SIDE    1             2             1             2
        !            33: 28-29   HID     0             0             0             0
        !            34: 510-511 CHECKSUM
        !            35: */
        !            36: 
        !            37: typedef struct {
        !            38:   int nTracks,nSectors,nSides;
        !            39: } STANDARDDISCSIZES;
        !            40: 
        !            41: #define DEFAULT_STANDARDDISC  1
        !            42: #define MAX_STANDARDDISCSIZES  2
        !            43: static STANDARDDISCSIZES StandardDiscSizes[MAX_STANDARDDISCSIZES] = {
        !            44:   80,9,1,  /* 80 tracks, single sided (360k) */
        !            45:   80,9,2   /* 80 tracks, double sided (720k) */
        !            46: };
        !            47: static char *pszStandardDiscNames[] = {
        !            48:   "80 tracks, single sided (360k)",
        !            49:   "80 tracks, double sided (720k)",
        !            50:   NULL  //term
        !            51: };
        !            52: 
        !            53: #define NUM_TRACKSTEXTS    3
        !            54: #define NUM_SECTORSTEXTS  3
        !            55: #define NUM_SIDESTEXTS    2
        !            56: static char *pszTracksText[] = {
        !            57:   "80","81","82",NULL
        !            58: };
        !            59: static char *pszSectorsText[] = {
        !            60:   "9","10","11",NULL
        !            61: };
        !            62: static char *pszSidesText[] = {
        !            63:   "1","2",NULL
        !            64: };
        !            65: 
        !            66: /* FIXME
        !            67: static int Custom_DialogItems[] = {
        !            68:   IDC_STATICTRACKS,
        !            69:   IDC_STATICSECTORS,
        !            70:   IDC_STATICSIDES,
        !            71:   IDC_EDITTRACKS,
        !            72:   IDC_EDITSECTORS,
        !            73:   IDC_EDITSIDES,
        !            74:   IDC_SPINTRACKS,
        !            75:   IDC_SPINSECTORS,
        !            76:   IDC_SPINSIDES,
        !            77:   IDC_STATICSIZE,
        !            78:   0,  //term
        !            79: };
        !            80: */
        !            81: 
        !            82: static int CustomTracks=0,CustomSectors=0,CustomSides=1;    /* Default settings, 80 tracks, 9 sectors, 2 sides */
        !            83: static BOOL bInsertIntoDrive=FALSE;                         /* Insert disc image into drive when complete? */
        !            84: static BOOL bCustomDiscImage=FALSE;                         /* Is custom or standard disc size? */
        !            85: static int ChosenDiscType;                                  /* Index into StandardDiscSizes[] of chosen image type */
        !            86: static int ChosenDiscDrive;                                 /* Drive we are making disc image in, eg 0=A:, 1=B: */
        !            87: static char CreateBlankImageFileName[MAX_FILENAME_LENGTH];
        !            88: 
        !            89: 
        !            90: /*-----------------------------------------------------------------------*/
        !            91: /*
        !            92:   Create .ST/.MSA disc image according to 'Tracks,Sector,Sides' and save as filename
        !            93: */
        !            94: void CreateBlankImage_CreateFile(/*HWND hDlg,*/char *pszFileName,int nTracks, int nSectors, int nSides, BOOL bInsertIntoDrive)
        !            95: {
        !            96:   unsigned char *pDiscFile;
        !            97:   unsigned long DiscSize;
        !            98:   unsigned short int SPC,DIR,MEDIA,SPF;
        !            99:   char szString[MAX_FILENAME_LENGTH];
        !           100:   BOOL bRet=FALSE;
        !           101: 
        !           102:   /* Calculate size of disc image */
        !           103:   DiscSize = nTracks * (nSectors*NUMBYTESPERSECTOR) * nSides;
        !           104:   /* Allocate space for our 'file', and blank */
        !           105:   pDiscFile = (unsigned char *)Memory_Alloc(DiscSize);
        !           106:   Memory_Clear(pDiscFile,DiscSize);
        !           107: 
        !           108:   /* Fill in boot-sector, this would better as a structure but 'C' pads the variables out */
        !           109:   Memory_Set(pDiscFile+2,0x4e,6);                           /* 2-7 'Loader' */
        !           110:   *(unsigned char *)(pDiscFile+8) = rand();                 /* 8-10 24-bit serial number */
        !           111:   *(unsigned char *)(pDiscFile+9) = rand();
        !           112:   *(unsigned char *)(pDiscFile+10) = rand();
        !           113:   *(unsigned short int *)(pDiscFile+11) = NUMBYTESPERSECTOR;  /* 11-12 BPS */
        !           114:   if ( (nTracks==40) && (nSides==1) ) SPC = 1;
        !           115:   else SPC = 2;
        !           116:   *(unsigned char *)(pDiscFile+13) = SPC;                   /* 13 SPC */
        !           117:   *(unsigned short int *)(pDiscFile+14) = 1;                /* 14-15 RES */
        !           118:   *(unsigned char *)(pDiscFile+16) = 2;                     /* 16 FAT */
        !           119:   if (SPC==1) DIR = 64;
        !           120:   else DIR = 112;
        !           121:   *(unsigned short int *)(pDiscFile+17) = DIR;              /* 17-18 DIR */
        !           122:   *(unsigned short int *)(pDiscFile+19) = nTracks*nSectors*nSides;  /* 19-20 SEC */
        !           123:   if (nTracks==40) MEDIA = 252;
        !           124:   else MEDIA = 248;
        !           125:   if (nSides==2) MEDIA++;
        !           126:   *(unsigned char *)(pDiscFile+21) = MEDIA;                 /* 21 MEDIA */
        !           127:   if (nTracks>=80) SPF = 5;
        !           128:   else SPF = 2;
        !           129:   *(unsigned short int *)(pDiscFile+22) = SPF;              /* 22-23 SPF */
        !           130:   *(unsigned short int *)(pDiscFile+24) = nSectors;         /* 24-25 SPT */
        !           131:   *(unsigned short int *)(pDiscFile+26) = nSides;           /* 26-27 SIDE */
        !           132:   *(unsigned short int *)(pDiscFile+28) = 0;                /* 28-29 HID */
        !           133: 
        !           134:   /* Ask if OK to overwrite, if exists? */
        !           135:   if (File_QueryOverwrite(/*hDlg,*/pszFileName)) {
        !           136:     /* Save image to file, as .ST or compressed .MSA */
        !           137:     if (File_FileNameIsMSA(pszFileName))
        !           138:       bRet = MSA_WriteDisc(pszFileName,pDiscFile,DiscSize);
        !           139:     else if (File_FileNameIsST(pszFileName))
        !           140:       bRet = ST_WriteDisc(pszFileName,pDiscFile,DiscSize);
        !           141: 
        !           142:     /* Did create successfully? */
        !           143:     if (bRet) {
        !           144:       /* Say OK, */
        !           145: //      MessageBox(hDlg,"Disc image created successfully.",PROG_NAME,MB_OK | MB_ICONINFORMATION);
        !           146:       /* Insert into drive A: or B: ? */
        !           147:       if (bInsertIntoDrive)
        !           148:         Floppy_InsertDiscIntoDrive(ChosenDiscDrive,pszFileName);
        !           149:     }
        !           150:     else {
        !           151:       /* Warn user we were unable to create image */
        !           152:       sprintf(szString,"Unable to create disc image '%s'.",pszFileName);
        !           153: //      MessageBox(hDlg,szString,PROG_NAME,MB_OK | MB_ICONSTOP);
        !           154:     }
        !           155:   }
        !           156: 
        !           157:   /* Free image */
        !           158:   Memory_Free(pDiscFile);
        !           159: }
        !           160: 
        !           161: //-----------------------------------------------------------------------
        !           162: /*
        !           163:   Enable dialog items according to choice of standard or custom size
        !           164: */
        !           165: void CreateBlankImage_EnableDialog(/*HWND hDlg,*/BOOL bState)
        !           166: {
        !           167:   // Standard disc size
        !           168: //  Dialog_EnableItem(hDlg,IDC_IMAGECOMBO,bState);
        !           169: 
        !           170:   // Custom disc size
        !           171: //  Dialog_EnableItems(hDlg,Custom_DialogItems,!bState);
        !           172: }
        !           173: 
        !           174: //-----------------------------------------------------------------------
        !           175: /*
        !           176:   Find number of Tracks,Sectors and Sides from chosen dialog settings
        !           177: */
        !           178: void CreateBlankImage_FindTracksSectorsSides(int *nTracks, int *nSectors, int *nSides, BOOL bCustom, int ChosenDiscType)
        !           179: {
        !           180:   if (bCustom) {
        !           181:     *nTracks = atoi(pszTracksText[CustomTracks]);
        !           182:     *nSectors = atoi(pszSectorsText[CustomSectors]);
        !           183:     *nSides = atoi(pszSidesText[CustomSides]);
        !           184:   }
        !           185:   else {
        !           186:     *nTracks = StandardDiscSizes[ChosenDiscType].nTracks;
        !           187:     *nSectors = StandardDiscSizes[ChosenDiscType].nSectors;
        !           188:     *nSides = StandardDiscSizes[ChosenDiscType].nSides;
        !           189:   }
        !           190: }
        !           191: 
        !           192: //-----------------------------------------------------------------------
        !           193: /*
        !           194:   Show size of custom disc in dialog
        !           195: */
        !           196: void CreateBlankImage_ShowDiscImageCapacity(/*HWND hDlg*/)
        !           197: {
        !           198:   char szString[256];
        !           199:   int DiscSize,nTracks,nSectors,nSides;
        !           200: 
        !           201:   // Find size of disc image
        !           202:   CreateBlankImage_FindTracksSectorsSides(&nTracks,&nSectors,&nSides,TRUE,ChosenDiscType);
        !           203:   DiscSize = nTracks*nSectors*nSides*NUMBYTESPERSECTOR;
        !           204: 
        !           205:   sprintf(szString,"Capactity: %dk (%d bytes)", DiscSize/1024,DiscSize);
        !           206: //  Dialog_SetText(hDlg,IDC_STATICSIZE,szString);
        !           207: }
        !           208: 
        !           209: //-----------------------------------------------------------------------
        !           210: /*
        !           211:   Set dialog edit box details for Tracks,Sectors and Sides
        !           212: */
        !           213: 
        !           214: void CreateBlankImage_SetDiscImageTracksDetail(/*HWND hDlg,*/int NewCustomTracks)
        !           215: {
        !           216: //  Dialog_SetText(hDlg,IDC_EDITTRACKS,pszTracksText[CustomTracks=NewCustomTracks]);
        !           217: //  CreateBlankImage_ShowDiscImageCapacity(hDlg);
        !           218: }
        !           219: 
        !           220: void CreateBlankImage_SetDiscImageSectorsDetail(/*HWND hDlg,*/int NewCustomSectors)
        !           221: {
        !           222: //  Dialog_SetText(hDlg,IDC_EDITSECTORS,pszSectorsText[CustomSectors=NewCustomSectors]);
        !           223: //  CreateBlankImage_ShowDiscImageCapacity(hDlg);
        !           224: }
        !           225: 
        !           226: void CreateBlankImage_SetDiscImageSidesDetail(/*HWND hDlg,*/int NewCustomSides)
        !           227: {
        !           228: //  Dialog_SetText(hDlg,IDC_EDITSIDES,pszSidesText[CustomSides=NewCustomSides]);
        !           229: //  CreateBlankImage_ShowDiscImageCapacity(hDlg);
        !           230: }
        !           231: 
        !           232: //-----------------------------------------------------------------------
        !           233: /*
        !           234:   Handle create disc dialog messages
        !           235: */
        !           236: BOOL CreateBlankImage_DiscImageDialog(/*HWND hDlg, UINT Message, WPARAM wParam, LPARAM lParam*/)
        !           237: {
        !           238: #if 0
        !           239:   NMUPDOWN *pUpDown;
        !           240:   char szString[MAX_FILENAME_LENGTH];
        !           241:   int nTracks,nSectors,nSides;
        !           242:   int Offset;
        !           243: 
        !           244:   switch(Message) {
        !           245:     case WM_INITDIALOG:
        !           246:       // Set Insert into drive checkbox
        !           247:       Dialog_SetButton(hDlg,IDC_CHECK_INSERTINTODRIVE,bInsertIntoDrive);
        !           248:       // Fill in combobox
        !           249:       Dialog_SetComboBoxItems(hDlg,IDC_IMAGECOMBO,pszStandardDiscNames,DEFAULT_STANDARDDISC);
        !           250:       // And select, defaults to 720k disc image size
        !           251:       ChosenDiscType = DEFAULT_STANDARDDISC;  // 80 tracks, 9 sectors, 2 sides 720k
        !           252:       // Set default choice
        !           253:       Dialog_SetButton(hDlg,IDC_STDDISCSIZERADIO,!bCustomDiscImage);
        !           254:       Dialog_SetButton(hDlg,IDC_CUSTOMDISCSIZERADIO,bCustomDiscImage);
        !           255:       // Set custom spin items
        !           256:       Dialog_SetSpinList(hDlg,IDC_EDITTRACKS,IDC_SPINTRACKS,pszTracksText,NUM_TRACKSTEXTS,CustomTracks);
        !           257:       Dialog_SetSpinList(hDlg,IDC_EDITSECTORS,IDC_SPINSECTORS,pszSectorsText,NUM_SECTORSTEXTS,CustomSectors);
        !           258:       Dialog_SetSpinList(hDlg,IDC_EDITSIDES,IDC_SPINSIDES,pszSidesText,NUM_SIDESTEXTS,CustomSides);
        !           259: 
        !           260:       CreateBlankImage_ShowDiscImageCapacity(hDlg);
        !           261:       CreateBlankImage_EnableDialog(hDlg,!bCustomDiscImage);
        !           262:       return(TRUE);
        !           263:     
        !           264:     case WM_NOTIFY:
        !           265:       switch(wParam) {
        !           266:         // Handle spin controls
        !           267:         case IDC_SPINTRACKS:
        !           268:           pUpDown = (NMUPDOWN *)lParam;
        !           269:           Offset = Misc_LimitInt(pUpDown->iPos + pUpDown->iDelta, 0,NUM_TRACKSTEXTS-1);
        !           270:           Dialog_UpdateSpinList(hDlg,IDC_EDITTRACKS,pszTracksText,NUM_TRACKSTEXTS,Offset);
        !           271:           CreateBlankImage_SetDiscImageTracksDetail(hDlg,Offset);
        !           272:           return(TRUE);
        !           273:         case IDC_SPINSECTORS:
        !           274:           pUpDown = (NMUPDOWN *)lParam;
        !           275:           Offset = Misc_LimitInt(pUpDown->iPos + pUpDown->iDelta, 0,NUM_SECTORSTEXTS-1);
        !           276:           Dialog_UpdateSpinList(hDlg,IDC_EDITSECTORS,pszSectorsText,NUM_SECTORSTEXTS,Offset);
        !           277:           CreateBlankImage_SetDiscImageSectorsDetail(hDlg,Offset);
        !           278:           return(TRUE);
        !           279:         case IDC_SPINSIDES:
        !           280:           pUpDown = (NMUPDOWN *)lParam;
        !           281:           Offset = Misc_LimitInt(pUpDown->iPos + pUpDown->iDelta, 0,NUM_SIDESTEXTS-1);
        !           282:           Dialog_UpdateSpinList(hDlg,IDC_EDITSIDES,pszSidesText,NUM_SIDESTEXTS,Offset);
        !           283:           CreateBlankImage_SetDiscImageSidesDetail(hDlg,Offset);
        !           284:           return(TRUE);
        !           285:       }
        !           286: 
        !           287:       break;
        !           288: 
        !           289:     case WM_COMMAND:
        !           290:       switch(wParam) {
        !           291:         case IDC_STDDISCSIZERADIO:
        !           292:         case IDC_CUSTOMDISCSIZERADIO:
        !           293:           bCustomDiscImage ^= TRUE;
        !           294:           CreateBlankImage_EnableDialog(/*hDlg,*/!bCustomDiscImage);
        !           295:           return(TRUE);
        !           296:         case IDC_IMAGECOMBO:
        !           297:           return(TRUE);
        !           298: 
        !           299:         case IDOK:
        !           300:           // Read back dialog choices
        !           301:           bInsertIntoDrive = Dialog_ReadButton(hDlg,IDC_CHECK_INSERTINTODRIVE);
        !           302:           bCustomDiscImage = Dialog_ReadButton(hDlg,IDC_CUSTOMDISCSIZERADIO);
        !           303:           // Get type of disc(for standard size)
        !           304:           ChosenDiscType = Dialog_GetSelectedComboBoxItem(hDlg,IDC_IMAGECOMBO);
        !           305:           // Find disc details,(if chosen or custom type)
        !           306:           CreateBlankImage_FindTracksSectorsSides(&nTracks,&nSectors,&nSides,bCustomDiscImage,ChosenDiscType);
        !           307:           // Confirm with user and create image
        !           308:           sprintf(szString,"Create disc image '%s'\n(%d Track, %d Sectors, %d Sides) ?",CreateBlankImageFileName,nTracks,nSectors,nSides);
        !           309:           if (MessageBox(hDlg,szString,PROG_NAME,MB_YESNO | MB_ICONQUESTION)==IDYES)
        !           310:             CreateBlankImage_CreateFile(hDlg,CreateBlankImageFileName,nTracks,nSectors,nSides,bInsertIntoDrive);
        !           311:         case IDCANCEL:
        !           312:           EndDialog(hDlg,0);
        !           313:           return(TRUE);
        !           314:         }
        !           315:       break;
        !           316:   }
        !           317: 
        !           318:   return(FALSE);
        !           319: #endif
        !           320: }
        !           321: 
        !           322: //-----------------------------------------------------------------------
        !           323: /*
        !           324:   Create output disassembly dialog
        !           325: */
        !           326: BOOL CreateBlankImage_DoDialog(/*HWND hDlg,*/int Drive,char *pszFileName)
        !           327: {
        !           328: //  PROC lpfnDlgProc;
        !           329:  
        !           330:   /* Is filename valid, ie .ST or .MSA? */
        !           331:   if (File_FileNameIsST(pszFileName) || File_FileNameIsMSA(pszFileName)) {
        !           332:     /* Store drive for later(when create image) */
        !           333:     ChosenDiscDrive = Drive;
        !           334:     /* Store filename for later */
        !           335:     strcpy(CreateBlankImageFileName,pszFileName);
        !           336:     /* Open dialog */
        !           337: //    lpfnDlgProc = MakeProcInstance((PROC)CreateBlankImage_DiscImageDialog,hInst);
        !           338: //    DialogBoxParam(hInst,MAKEINTRESOURCE(IDD_DIALOG_BLANKIMAGE),hDlg,(DLGPROC)lpfnDlgProc,NULL);
        !           339:     return(TRUE);
        !           340:   }
        !           341:   else
        !           342: //    MessageBox(hWnd,"Invalid disc filename. Please re-enter.",PROG_NAME,MB_OK | MB_ICONSTOP);
        !           343: 
        !           344:   return(FALSE);
        !           345: }

unix.superglobalmegacorp.com

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