It's working now -- tested on a real C64 and 1451 drive, using "index" writing mode.
SCP software expects C64 images to be 96tpi, so I'm doubling every track (this is interpreted as image with half tracks, which probably helps -- my drive is 96tpi). Setting number of heads is apparently not critical -- SCP software expects C64 images to be single sided anyway -- but length of second gap is critical.
Code: Select all
--- HxCFloppyEmulator/libhxcfe/trunk/sources/loaders/scp_loader/scp_format.h (revision 1670)
+++ HxCFloppyEmulator/libhxcfe/trunk/sources/loaders/scp_loader/scp_format.h (working copy)
@@ -375,8 +375,8 @@
uint8_t start_track;
uint8_t end_track;
uint8_t flags;
- uint8_t RFU_0;
- uint8_t RFU_1;
+ uint8_t bit_cell_width;
+ uint8_t number_of_heads;
uint8_t RFU_2;
uint32_t file_data_checksum;
}scp_header;
===================================================================
--- HxCFloppyEmulator/libhxcfe/trunk/sources/loaders/scp_loader/scp_writer.c (revision 1670)
+++ HxCFloppyEmulator/libhxcfe/trunk/sources/loaders/scp_loader/scp_writer.c (working copy)
@@ -287,6 +288,8 @@
case C64_DD_FLOPPYMODE:
scph.disk_type = 0x00;
+ tracknumber *= 2;
+ scph.end_track = tracknumber - 1;
break;
case S950_HD_FLOPPYMODE:
@@ -308,12 +311,26 @@
if(floppy->tracks[0])
{
- if( floppy->tracks[0]->floppyRPM > 350 && floppy->tracks[0]->floppyRPM < 340)
+ if( floppy->tracks[0]->floppyRPM > 350 /* && floppy->tracks[0]->floppyRPM < 340 */)
{
scph.flags |= 0x04;
}
}
+ switch (floppy->floppyNumberOfSide)
+ {
+ case 1:
+ scph.number_of_heads = 1;
+ break;
+
+ case 2:
+ scph.number_of_heads = 0;
+ break;
+
+ default:
+ scph.number_of_heads = 0;
+ break;
+ }
scph.version = 0x09;
imgldr_ctx->hxcfe->hxc_printf(MSG_DEBUG,"SCP_libWrite_DiskFile : Flags=0x%.2X Disktype=0x%.2X NumberOfRevolution=%d Version=%d NbTrack=%d NbSide:%d",scph.flags,scph.disk_type,scph.number_of_revolution,scph.version,floppy->floppyNumberOfTrack,floppy->floppyNumberOfSide);
@@ -344,7 +361,10 @@
}
else
{
- write_scp_track(f,floppy->tracks[i]->sides[0],&track_checksum,i,scph.number_of_revolution);
+ if (floppy->floppyiftype == C64_DD_FLOPPYMODE)
+ write_scp_track(f,floppy->tracks[i>>1]->sides[0],&track_checksum,i,scph.number_of_revolution);
+ else
+ write_scp_track(f,floppy->tracks[i]->sides[0],&track_checksum,i,scph.number_of_revolution);
}
file_checksum = file_checksum + track_checksum;
Index: HxCFloppyEmulator/libhxcfe/trunk/sources/tracks/gcr_track.c
===================================================================
--- HxCFloppyEmulator/libhxcfe/trunk/sources/tracks/gcr_track.c (revision 1670)
+++ HxCFloppyEmulator/libhxcfe/trunk/sources/tracks/gcr_track.c (working copy)
@@ -284,7 +284,7 @@
tempdata[j++] = 0x00; // $00 ("off" bytes)
tempdata[j++] = 0x00; // $00 ("off" bytes)
- for(k=0;k<9;k++) // sector gap
+ for(k=0;k<8;k++) // sector gap
{
tempdata[j]=0x55;
tempnongcr[j]=0xFF;