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(§or_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,¤tside->tracklen,1); } fclose(f); return LOADER_NOERROR; }
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(§or_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,¤tside->tracklen,2); } hxc_fclose(f); return HXCFE_NOERROR; }
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; }