int FEI_libLoad_DiskFile(HXCFE_IMGLDR * imgldr_ctx,HXCFE_FLOPPY * floppydisk,char * imgfile,void * parameters)
{
	FILE * f;
	int i,j,k,filesize;
	int rpm;
	HXCFE_CYLINDER* currentcylinder;
	HXCFE_SIDE* currentside;
	int tracksize;


	imgldr_ctx->hxcfe->hxc_printf(MSG_DEBUG,"FEI_libLoad_DiskFile %s",imgfile);

	f=hxc_fopen(imgfile,"rb");
	if(f==NULL)
	{
		imgldr_ctx->hxcfe->hxc_printf(MSG_ERROR,"Cannot open %s !",imgfile);
		return HXCFE_ACCESSERROR;
	}

	fseek (f , 0 , SEEK_END);
	filesize=ftell(f);
	fseek (f , 0 , SEEK_SET);

	if(!(filesize%25000))
	{
		floppydisk->floppyNumberOfTrack=(filesize/2) / 25000;
		floppydisk->floppyNumberOfSide=2;
		floppydisk->floppyBitRate=500000;
		floppydisk->floppySectorPerTrack=-1;
		floppydisk->floppyiftype=ATARIST_DD_FLOPPYMODE;
		tracksize=25000;
		rpm=300;
	}
	else
	{

		if(!(filesize%12500))
		{
			floppydisk->floppyNumberOfTrack=(filesize/2) / 12500;
			floppydisk->floppyNumberOfSide=2;
			floppydisk->floppyBitRate=250000;
			floppydisk->floppySectorPerTrack=-1;
			floppydisk->floppyiftype=ATARIST_DD_FLOPPYMODE;
			tracksize=12500;
			rpm=300;
		}
	}

	imgldr_ctx->hxcfe->hxc_printf(MSG_DEBUG,"FEI File : %d track, %d side, %d bit/s, %d sectors, mode %d",
		floppydisk->floppyNumberOfTrack,
		floppydisk->floppyNumberOfSide,
		floppydisk->floppyBitRate,
		floppydisk->floppySectorPerTrack,
		floppydisk->floppyiftype);


	floppydisk->tracks=(HXCFE_CYLINDER**)malloc(sizeof(HXCFE_CYLINDER*)*floppydisk->floppyNumberOfTrack);
	memset(floppydisk->tracks,0,sizeof(HXCFE_CYLINDER*)*floppydisk->floppyNumberOfTrack);

	for(i=0;i<floppydisk->floppyNumberOfTrack;i++)
	{

		for(j=0;j<floppydisk->floppyNumberOfSide;j++)
		{

			hxcfe_imgCallProgressCallback(imgldr_ctx, (i<<1) + (j&1),floppydisk->floppyNumberOfTrack*2);

			if(!floppydisk->tracks[i])
			{
				floppydisk->tracks[i]=allocCylinderEntry(rpm,floppydisk->floppyNumberOfSide);
				currentcylinder=floppydisk->tracks[i];
			}

			currentcylinder->sides[j]=tg_alloctrack(floppydisk->floppyBitRate,UNKNOWN_ENCODING,currentcylinder->floppyRPM,tracksize*8,2500,-2500,0x00);
			currentside=currentcylinder->sides[j];
			currentside->number_of_sector=floppydisk->floppySectorPerTrack;

			fseek(f,(tracksize*i)+(tracksize*floppydisk->floppyNumberOfTrack*j),SEEK_SET);

			imgldr_ctx->hxcfe->hxc_printf(MSG_DEBUG,"read track %d side %d at offset 0x%x (0x%x bytes)",
												i,
												j,
												ftell(f),
												tracksize);

			fread(currentside->databuffer,tracksize,1,f);

			for(k=0;k<tracksize;k++)
			{
				currentside->databuffer[k]=bit_inverter[currentside->databuffer[k]];
			}
		}
	}

	hxc_fclose(f);
	return HXCFE_NOERROR;
}
int EMUI_RAW_libLoad_DiskFile(HXCFLOPPYEMULATOR* floppycontext,FLOPPY * floppydisk,char * imgfile,void * parameters)
{
	FILE * f;
	unsigned int i;
	CYLINDER* currentcylinder;
	SIDE* currentside;
	unsigned char sector_data[0xE00];
	int tracknumber,sidenumber;
	
	
	floppycontext->hxc_printf(MSG_DEBUG,"EMUI_RAW_libLoad_DiskFile %s",imgfile);
	
	f=fopen(imgfile,"rb");
	if(f==NULL) 
	{
		floppycontext->hxc_printf(MSG_ERROR,"Cannot open %s !",imgfile);
		return LOADER_ACCESSERROR;
	}
	
	floppydisk->floppyNumberOfTrack=35;
	floppydisk->floppyNumberOfSide=1;
	floppydisk->floppyBitRate=DEFAULT_EMUII_BITRATE;
	floppydisk->floppySectorPerTrack=1;
	floppydisk->floppyiftype=EMU_SHUGART_FLOPPYMODE;

	floppycontext->hxc_printf(MSG_DEBUG,"EmuI File : %d track, %d side, %d bit/s, %d sectors, mode %d",
		floppydisk->floppyNumberOfTrack,
		floppydisk->floppyNumberOfSide,
		floppydisk->floppyBitRate,
		floppydisk->floppySectorPerTrack,
		floppydisk->floppyiftype);


	floppydisk->tracks=(CYLINDER**)malloc(sizeof(CYLINDER*)*floppydisk->floppyNumberOfTrack);
	memset(floppydisk->tracks,0,sizeof(CYLINDER*)*floppydisk->floppyNumberOfTrack);

	for(i=0;i<floppydisk->floppyNumberOfTrack;i++)
	{			

		tracknumber=i;
		sidenumber=0;
	
		fseek(f,i*0xE00,SEEK_SET);
		fread(&sector_data,0xE00,1,f);

		if(!floppydisk->tracks[tracknumber])
		{
			floppydisk->tracks[tracknumber]=allocCylinderEntry(300,floppydisk->floppyNumberOfSide);
			currentcylinder=floppydisk->tracks[tracknumber];
		}
			

		floppycontext->hxc_printf(MSG_DEBUG,"read track %d side %d at offset 0x%x (0x%x bytes)",
			tracknumber,
			sidenumber,
			(0xE00*tracknumber*2)+(sidenumber*0xE00),
			0xE00);


			currentcylinder->sides[sidenumber]=tg_alloctrack(floppydisk->floppyBitRate,EMU_FM_ENCODING,currentcylinder->floppyRPM,((floppydisk->floppyBitRate/5)*2),2000,-2000,0x00);
			currentside=currentcylinder->sides[sidenumber];					
			currentside->number_of_sector=floppydisk->floppySectorPerTrack;
			
			BuildEmuIITrack(floppycontext,tracknumber,sidenumber,sector_data,currentside->databuffer,&currentside->tracklen,1);
	}			
	
	fclose(f);
	return LOADER_NOERROR;
}
示例#3
0
int EXTADF_libLoad_DiskFile(HXCFLOPPYEMULATOR* floppycontext,FLOPPY * floppydisk,char * imgfile,void * parameters)
{
	FILE * f;
	unsigned int filesize;
	unsigned int i,j;
	char* trackdata;
	int	tracklen;
	CYLINDER* currentcylinder;
	unsigned int numberoftrack;
	
	unsigned char header[12];
	unsigned char * tracktable;
	unsigned int trackindex,tracksize;

	unsigned char gap3len,skew,trackformat,interleave;
	unsigned short sectorsize;
	
	floppycontext->hxc_printf(MSG_DEBUG,"EXTADF_libLoad_DiskFile %s",imgfile);
	
	f=fopen(imgfile,"rb");
	if(f==NULL) 
	{
		floppycontext->hxc_printf(MSG_ERROR,"Cannot open %s !",imgfile);
		return LOADER_ACCESSERROR;
	}
	
	fseek (f , 0 , SEEK_END); 
	filesize=ftell(f);
	fseek (f , 0 , SEEK_SET); 

	if(!filesize)
	{
		floppycontext->hxc_printf(MSG_ERROR,"Bad file size : %d !",filesize);
		fclose(f);
		return LOADER_BADFILE;
	}
	

	fread(header,12,1,f);
	
	numberoftrack=0;
	header[8]=0;
	if(!strcmp(header,"UAE-1ADF"))
	{
		numberoftrack=header[0xB]+(header[0xA]*256);
		tracktable=malloc(12*numberoftrack);
		memset(tracktable,0,12*numberoftrack);

		fread(tracktable,12*numberoftrack,1,f);
	}
	trackindex=0;

	floppydisk->floppyNumberOfTrack=numberoftrack>>1;
	if(numberoftrack&1) floppydisk->floppyNumberOfTrack++;

	sectorsize=512;
	interleave=1;
	gap3len=0;
	skew=0;
	trackformat=AMIGAFORMAT_DD;

	floppydisk->floppySectorPerTrack=-1;
	floppydisk->floppyNumberOfSide=2;
	floppydisk->floppyBitRate=DEFAULT_AMIGA_BITRATE;
	floppydisk->floppyiftype=AMIGA_DD_FLOPPYMODE;
	floppydisk->tracks=(CYLINDER**)malloc(sizeof(CYLINDER*)*floppydisk->floppyNumberOfTrack);
		
	tracklen=(DEFAULT_AMIGA_BITRATE/(DEFAULT_AMIGA_RPM/60))/4;
		
	floppycontext->hxc_printf(MSG_DEBUG,"Extended ADF : %x tracks",numberoftrack);
		
	for(j=0;j<floppydisk->floppyNumberOfTrack;j++)
	{
			
		floppydisk->tracks[j]=allocCylinderEntry(DEFAULT_AMIGA_RPM,floppydisk->floppyNumberOfSide);
		currentcylinder=floppydisk->tracks[j];
		
		for(i=0;i<floppydisk->floppyNumberOfSide;i++)
		{	

			if(trackindex<numberoftrack)
			{

				tracksize=tracktable[(12*trackindex)+4] * 0x1000000 + \
					      tracktable[(12*trackindex)+5] * 0x10000   + \
						  tracktable[(12*trackindex)+6] * 0x100     + \
						  tracktable[(12*trackindex)+7];
				
				if(tracksize)
				{

					if(tracktable[(12*trackindex)+3]==1)
					{
						floppycontext->hxc_printf(MSG_DEBUG,"[%.3d:%.1X] Reading Non-DOS track at 0x%.8x, Size : 0x%.8x",j,i,ftell(f),tracksize);

						currentcylinder->sides[i]=tg_alloctrack(DEFAULT_AMIGA_BITRATE,AMIGA_MFM_ENCODING,DEFAULT_AMIGA_RPM,(tracksize)*8,2500,-100,0x00);
						fread(currentcylinder->sides[i]->databuffer,tracksize,1,f);
						currentcylinder->sides[i]->number_of_sector=floppydisk->floppySectorPerTrack;

					}
					else
					{
						tracksize=tracktable[(12*trackindex)+4] * 0x1000000 + \
								  tracktable[(12*trackindex)+5] * 0x10000   + \
								  tracktable[(12*trackindex)+6] * 0x100     + \
								  tracktable[(12*trackindex)+7];
						
						trackdata=(unsigned char*)malloc(tracksize);

						floppycontext->hxc_printf(MSG_DEBUG,"[%.3d:%.1X] Reading DOS track at 0x%.8x, Size : 0x%.8x",j,i,ftell(f),tracksize);

						fread(trackdata,tracksize,1,f);

						currentcylinder->sides[i]=tg_generatetrack(trackdata,sectorsize,(unsigned short)(tracksize/sectorsize),(unsigned char)j,(unsigned char)i,0,interleave,(unsigned char)(((j<<1)|(i&1))*skew),floppydisk->floppyBitRate,currentcylinder->floppyRPM,trackformat,gap3len,2500,-11150);

						free(trackdata);

					}
				}
				else
				{
					floppycontext->hxc_printf(MSG_DEBUG,"[%.3d:%.1X] Null Size track!",j,i);
					currentcylinder->sides[i]=tg_alloctrack(DEFAULT_AMIGA_BITRATE,AMIGA_MFM_ENCODING,DEFAULT_AMIGA_RPM,(tracklen)*8,2500,-11360,0x00);
				}

			}
			else
			{
				floppycontext->hxc_printf(MSG_DEBUG,"[%.3d:%.1X] No track!",j,i);
				currentcylinder->sides[i]=tg_alloctrack(DEFAULT_AMIGA_BITRATE,AMIGA_MFM_ENCODING,DEFAULT_AMIGA_RPM,(tracklen)*8,2500,-11360,0x00);			
			}
									
			trackindex++;
		}
	}

	if(tracktable)	free(tracktable);
	floppycontext->hxc_printf(MSG_INFO_1,"track file successfully loaded and encoded!");
	fclose(f);

	return LOADER_NOERROR;	
}
int EMUII_RAW_libLoad_DiskFile(HXCFE_IMGLDR * imgldr_ctx,HXCFE_FLOPPY * floppydisk,char * imgfile,void * parameters)
{
	FILE * f;
	int i;
	HXCFE_CYLINDER*      currentcylinder;
	HXCFE_SIDE*          currentside;
	unsigned char  sector_data[0xE00];
	int tracknumber,sidenumber;

	imgldr_ctx->hxcfe->hxc_printf(MSG_DEBUG,"EMUII_RAW_libLoad_DiskFile %s",imgfile);

	f=hxc_fopen(imgfile,"rb");
	if(f==NULL)
	{
		imgldr_ctx->hxcfe->hxc_printf(MSG_ERROR,"Cannot open %s !",imgfile);
		return HXCFE_ACCESSERROR;
	}

	floppydisk->floppyNumberOfTrack=80;
	floppydisk->floppyNumberOfSide=2;
	floppydisk->floppyBitRate=DEFAULT_EMUII_BITRATE;
	floppydisk->floppySectorPerTrack=1;
	floppydisk->floppyiftype=EMU_SHUGART_FLOPPYMODE;

	imgldr_ctx->hxcfe->hxc_printf(MSG_DEBUG,"EmuII File : %d track, %d side, %d bit/s, %d sectors, mode %d",
		floppydisk->floppyNumberOfTrack,
		floppydisk->floppyNumberOfSide,
		floppydisk->floppyBitRate,
		floppydisk->floppySectorPerTrack,
		floppydisk->floppyiftype);


	floppydisk->tracks=(HXCFE_CYLINDER**)malloc(sizeof(HXCFE_CYLINDER*)*floppydisk->floppyNumberOfTrack);
	memset(floppydisk->tracks,0,sizeof(HXCFE_CYLINDER*)*floppydisk->floppyNumberOfTrack);

	for(i=0;i<floppydisk->floppyNumberOfTrack*floppydisk->floppyNumberOfSide;i++)
	{

		hxcfe_imgCallProgressCallback(imgldr_ctx,i,floppydisk->floppyNumberOfTrack*floppydisk->floppyNumberOfSide);

		tracknumber=i>>1;
		sidenumber=i&1;

		fseek(f,i*0xE00,SEEK_SET);
		fread(&sector_data,0xE00,1,f);

		if(!floppydisk->tracks[tracknumber])
		{
			floppydisk->tracks[tracknumber] = allocCylinderEntry(300,floppydisk->floppyNumberOfSide);
		}
		currentcylinder=floppydisk->tracks[tracknumber];


		imgldr_ctx->hxcfe->hxc_printf(MSG_DEBUG,"read track %d side %d at offset 0x%x (0x%x bytes)",
			tracknumber,
			sidenumber,
			(0xE00*tracknumber*2)+(sidenumber*0xE00),
			0xE00);

		currentcylinder->sides[sidenumber] = tg_alloctrack(floppydisk->floppyBitRate,EMU_FM_ENCODING,currentcylinder->floppyRPM,((floppydisk->floppyBitRate/5)*2),2000,-2000,0x00);
		currentside = currentcylinder->sides[sidenumber];
		currentside->number_of_sector = floppydisk->floppySectorPerTrack;


		BuildEmuIITrack(imgldr_ctx->hxcfe,tracknumber,sidenumber,sector_data,currentside->databuffer,&currentside->tracklen,2);

	}

	hxc_fclose(f);
	return HXCFE_NOERROR;
}
示例#5
0
int EXTADF_libLoad_DiskFile(HXCFE_IMGLDR * imgldr_ctx,HXCFE_FLOPPY * floppydisk,char * imgfile,void * parameters)
{
    FILE * f;
    unsigned int filesize;
    int i,j;
    unsigned char* trackdata;
    int	tracklen;
    HXCFE_CYLINDER* currentcylinder;
    unsigned int numberoftrack;

    unsigned char header[12];
    unsigned char * tracktable;
    unsigned int trackindex,tracksize,tracksize_bit;

    int gap3len,skew,trackformat,interleave;
    int sectorsize;

    imgldr_ctx->hxcfe->hxc_printf(MSG_DEBUG,"EXTADF_libLoad_DiskFile %s",imgfile);

    f=hxc_fopen(imgfile,"rb");
    if(f==NULL)
    {
        imgldr_ctx->hxcfe->hxc_printf(MSG_ERROR,"Cannot open %s !",imgfile);
        return HXCFE_ACCESSERROR;
    }

    fseek (f , 0 , SEEK_END);
    filesize=ftell(f);
    fseek (f , 0 , SEEK_SET);

    if(!filesize)
    {
        imgldr_ctx->hxcfe->hxc_printf(MSG_ERROR,"Bad file size : %d !",filesize);
        hxc_fclose(f);
        return HXCFE_BADFILE;
    }

    memset(header,0,sizeof(header));
    fread(header,12,1,f);

    numberoftrack=0;
    if(!strncmp((char*)header,"UAE-1ADF",8))
    {
        numberoftrack=header[0xB]+(header[0xA]*256);
        tracktable=malloc(12*numberoftrack);
        memset(tracktable,0,12*numberoftrack);

        fread(tracktable,12*numberoftrack,1,f);
    }
    trackindex=0;

    floppydisk->floppyNumberOfTrack=numberoftrack>>1;
    if(numberoftrack&1) floppydisk->floppyNumberOfTrack++;

    sectorsize=512;
    interleave=1;
    gap3len=0;
    skew=0;
    trackformat=AMIGAFORMAT_DD;

    floppydisk->floppySectorPerTrack=-1;
    floppydisk->floppyNumberOfSide=2;
    floppydisk->floppyBitRate=DEFAULT_AMIGA_BITRATE;
    floppydisk->floppyiftype=AMIGA_DD_FLOPPYMODE;
    floppydisk->tracks=(HXCFE_CYLINDER**)malloc(sizeof(HXCFE_CYLINDER*)*floppydisk->floppyNumberOfTrack);

    tracklen=(DEFAULT_AMIGA_BITRATE/(DEFAULT_AMIGA_RPM/60))/4;

    imgldr_ctx->hxcfe->hxc_printf(MSG_DEBUG,"Extended ADF : %x tracks",numberoftrack);

    for(j=0; j<floppydisk->floppyNumberOfTrack; j++)
    {

        floppydisk->tracks[j]=allocCylinderEntry(DEFAULT_AMIGA_RPM,floppydisk->floppyNumberOfSide);
        currentcylinder=floppydisk->tracks[j];

        for(i=0; i<floppydisk->floppyNumberOfSide; i++)
        {
            hxcfe_imgCallProgressCallback(imgldr_ctx, (j<<1) + (i&1),floppydisk->floppyNumberOfTrack*2);

            if(trackindex<numberoftrack)
            {

                tracksize=( (unsigned int)tracktable[(12*trackindex)+5] << 16 ) | \
                          ( (unsigned int)tracktable[(12*trackindex)+6] << 8 )  | \
                          ( (unsigned int)tracktable[(12*trackindex)+7] );

                if(tracksize)
                {

                    if(tracktable[(12*trackindex)+3]==1)
                    {
                        imgldr_ctx->hxcfe->hxc_printf(MSG_DEBUG,"[%.3d:%.1X] Reading Non-DOS track at 0x%.8x, Size : 0x%.8x",j,i,ftell(f),tracksize);

                        currentcylinder->sides[i]=tg_alloctrack(DEFAULT_AMIGA_BITRATE,AMIGA_MFM_ENCODING,DEFAULT_AMIGA_RPM,(tracksize)*8,2500,-100,0x00);
                        fread(currentcylinder->sides[i]->databuffer,tracksize,1,f);
                        currentcylinder->sides[i]->number_of_sector=floppydisk->floppySectorPerTrack;

                    }
                    else
                    {
                        tracksize_bit=( (unsigned int)tracktable[(12*trackindex)+9]  << 16 )  | \
                                      ( (unsigned int)tracktable[(12*trackindex)+10] << 8 )   | \
                                      ( (unsigned int)tracktable[(12*trackindex)+11] );

                        tracksize_bit /= 8;

                        if(tracksize)
                        {
                            trackdata=(unsigned char*)malloc(tracksize);
                            if(trackdata)
                            {
                                imgldr_ctx->hxcfe->hxc_printf(MSG_DEBUG,"[%.3d:%.1X] Reading DOS track at 0x%.8x, Size : 0x%.8x",j,i,ftell(f),tracksize);

                                fread(trackdata,tracksize,1,f);

                                currentcylinder->sides[i]=tg_generateTrack(trackdata,sectorsize,(unsigned short)(tracksize_bit/sectorsize),(unsigned char)j,(unsigned char)i,0,interleave,(unsigned char)(((j<<1)|(i&1))*skew),floppydisk->floppyBitRate,currentcylinder->floppyRPM,trackformat,gap3len,0,2500,-11150);

                                free(trackdata);
                            }
                        }
                    }
                }
                else
                {
                    imgldr_ctx->hxcfe->hxc_printf(MSG_DEBUG,"[%.3d:%.1X] Null Size track!",j,i);
                    currentcylinder->sides[i]=tg_alloctrack(DEFAULT_AMIGA_BITRATE,AMIGA_MFM_ENCODING,DEFAULT_AMIGA_RPM,(tracklen)*8,2500,-11360,0x00);
                }

            }
            else
            {
                imgldr_ctx->hxcfe->hxc_printf(MSG_DEBUG,"[%.3d:%.1X] No track!",j,i);
                currentcylinder->sides[i]=tg_alloctrack(DEFAULT_AMIGA_BITRATE,AMIGA_MFM_ENCODING,DEFAULT_AMIGA_RPM,(tracklen)*8,2500,-11360,0x00);
            }

            trackindex++;
        }
    }

    if(tracktable)	free(tracktable);
    imgldr_ctx->hxcfe->hxc_printf(MSG_INFO_1,"track file successfully loaded and encoded!");
    hxc_fclose(f);

    hxcfe_sanityCheck(imgldr_ctx->hxcfe,floppydisk);

    return HXCFE_NOERROR;
}
int TI99PC99_libLoad_DiskFile(HXCFLOPPYEMULATOR* floppycontext,FLOPPY * floppydisk,char * imgfile,void * parameters)
{
	
	FILE * f;
	unsigned int filesize;
	unsigned int i,j;
	unsigned int file_offset;
	unsigned char* trackdata;
	unsigned char* trackclk;
	unsigned short rpm;
	int fmmode,tracklen,numberoftrack,numberofside;
	CYLINDER* currentcylinder;
	SIDE* currentside;
	
	
	floppycontext->hxc_printf(MSG_DEBUG,"TI99PC99_libLoad_DiskFile %s",imgfile);
	
	f=fopen(imgfile,"rb");
	if(f==NULL) 
	{
		floppycontext->hxc_printf(MSG_ERROR,"Cannot open %s !",imgfile);
		return LOADER_ACCESSERROR;
	}

	
	fseek (f , 0 , SEEK_END); 
	filesize=ftell(f);
	fseek (f , 0 , SEEK_SET); 


	if(filesize!=0)
	{		
			
		fmmode=0;

		if(filesize%3253 && filesize%6872)
		{
			floppycontext->hxc_printf(MSG_DEBUG,"non TI99 PC99 file !");
			return LOADER_BADFILE;
		}
		
		if(!(filesize%3253))
		{
			tracklen=3253;
			fmmode=1;
			floppycontext->hxc_printf(MSG_DEBUG,"FM TI99 PC99 file !");
			floppydisk->floppyBitRate=250000;
		}
		else
		{
			tracklen=6872;
			fmmode=0;
			floppycontext->hxc_printf(MSG_DEBUG,"MFM TI99 PC99 file !");
			floppydisk->floppyBitRate=250000;
		}

		switch(filesize/tracklen)
		{
		case 40:
			numberofside=1;
			numberoftrack=40;
			break;
		case 80:
			numberofside=2;
			numberoftrack=40;
			break;
		default:
			floppycontext->hxc_printf(MSG_ERROR,"Unsupported geometry!");
			fclose(f);
			return LOADER_BADFILE;
			break;
		}
			
		floppydisk->floppyNumberOfTrack=numberoftrack;
		floppydisk->floppyNumberOfSide=numberofside;
		floppydisk->floppySectorPerTrack=-1;
		floppydisk->floppyiftype=GENERIC_SHUGART_DD_FLOPPYMODE;
		floppydisk->tracks=(CYLINDER**)malloc(sizeof(CYLINDER*)*floppydisk->floppyNumberOfTrack);
			
		rpm=300; // normal rpm
			
		floppycontext->hxc_printf(MSG_INFO_1,"filesize:%dkB, %d tracks, %d side(s), %d sectors/track, rpm:%d",filesize/1024,floppydisk->floppyNumberOfTrack,floppydisk->floppyNumberOfSide,floppydisk->floppySectorPerTrack,rpm);
				
		trackdata=(unsigned char*)malloc(tracklen);
		trackclk=(unsigned char*)malloc(tracklen);
			
		for(j=0;j<floppydisk->floppyNumberOfTrack;j++)
		{
				
			floppydisk->tracks[j]=allocCylinderEntry(rpm,floppydisk->floppyNumberOfSide);
			currentcylinder=floppydisk->tracks[j];
				
			for(i=0;i<floppydisk->floppyNumberOfSide;i++)
			{
					
				if(fmmode)
				{	
					floppydisk->tracks[j]->sides[i]=tg_alloctrack(floppydisk->floppyBitRate,ISOIBM_FM_ENCODING ,currentcylinder->floppyRPM,tracklen*4*8,2500,-2500,0x00);

				}
				else
				{
					floppydisk->tracks[j]->sides[i]=tg_alloctrack(floppydisk->floppyBitRate,ISOIBM_MFM_ENCODING,currentcylinder->floppyRPM,tracklen*2*8,2500,-2500,0x00);
				}
				currentside=currentcylinder->sides[i];
				
				currentside->number_of_sector=floppydisk->floppySectorPerTrack;
					
				file_offset=(tracklen*j)+(tracklen*numberoftrack*(i&1));					
				fseek (f , file_offset , SEEK_SET);
					
				fread(trackdata,tracklen,1,f);
				memset(trackclk,0xFF,tracklen);


				if(fmmode)
				{
					patchtrackFM(trackdata,trackclk,tracklen);
					BuildFMCylinder(currentside->databuffer,currentside->tracklen/8,trackclk,trackdata,tracklen);

				}
				else
				{
					patchtrackMFM(trackdata,trackclk,tracklen);
					BuildCylinder(currentside->databuffer,currentside->tracklen/8,trackclk,trackdata,tracklen);
				}

			}

		}
		
		free(trackdata);
		
		floppycontext->hxc_printf(MSG_INFO_1,"track file successfully loaded and encoded!");
		
		fclose(f);
		return LOADER_NOERROR;
	}

	floppycontext->hxc_printf(MSG_ERROR,"file size=%d !?",filesize);
	fclose(f);
	return LOADER_BADFILE;
}