//------------------------------------------------ //--- 010 Editor v7.0 Binary Template // // File: SCP.bt // Authors: Vasyl Tsvirkunov // Natalia Portillo // Version: 0.3 // Purpose: SuperCard Pro dump file format // based on official format document. // Category: Misc // File Mask: *.scp // ID Bytes: 53 43 50 //SCP // History: // 0.3 2017-12-05 Natalia Portillo: Updated for v1.6 file format // 0.2 2016-03-29 Vasyl Tsvirkunov: Updated for v7 compliancy // 0.1 2014-11-08 Vasyl Tsvirkunov: Initial release //------------------------------------------------ LittleEndian(); char signature[3]; byte version ; string ReadVersion(byte& v) { string s; SPrintf(s, "%d.%d", v>>4, v&0x0f); return s; } enum DiskType { disk_C64 = 0x00, disk_Amiga = 0x04, disk_AtariFMSS = 0x10, disk_AtariFMDS = 0x11, disk_AtariFMEx = 0x12, disk_AtariSTSS = 0x14, disk_AtariSTDS = 0x15, disk_AppleII = 0x20, disk_AppleIIPro = 0x21, disk_Apple400K = 0x24, disk_Apple800K = 0x25, disk_Apple144 = 0x26, disk_PC360K = 0x30, disk_PC720K = 0x31, disk_PC12M = 0x32, disk_PC144M = 0x33, disk_TRS80SSSD = 0x40, disk_TRS80SSDD = 0x41, disk_TRS80DSSD = 0x42, disk_TRS80DSDD = 0x43, disk_TI994A = 0x50, disk_D20 = 0x60 }; DiskType disk_type; byte revolutions; unsigned byte start_track; unsigned byte end_track; unsigned byte flags ; string ReadFlags(unsigned byte f) { string s; SPrintf(s, "%s, %s, %s, %s, %s, %s", f & 0x01 ? "flux data starts at index" : "no index reference", f & 0x02 ? "96TPI" : "48TPI", f & 0x04 ? "360 RPM" : "300 RPM", f & 0x08 ? "normalized flux" : "original flux data", f & 0x10 ? "read/write" : "read only", f & 0x20 ? "has footer" : "has no footer"); return s; } byte cell_width; byte number_of_heads; byte reserved; long checksum; long track_offset[end_track-start_track+1]; typedef struct { long duration; long cell_count; long offset; } RevInfo; typedef struct { char signature[3]; unsigned byte track_num; RevInfo rev_info[revolutions]; } TrackHeader; typedef struct { BigEndian(); // sic! if(cell_width == 0 || cell_width == 16) short flux[track_header.rev_info[rev].cell_count]; else byte flux[track_header.rev_info[rev].cell_count]; LittleEndian(); } FluxData; local int track, rev; for(track=0; track; uint model ; uint serial ; uint creator ; uint application ; uint comments ; time_t creationTime; uint ctime_2038; time_t modificationTime; uint mtime_2038; byte applicationVersion ; byte hardwareVersion ; byte firmwareVersion ; byte imageVersion ; char footerMagic[4]; } Footer; local uint footerSignature = 0x53435046; if(flags & 0x20) { FSeek(FileSize() - 4); local int foo; for(foo = 0;FTell() > timestampPosition; FSkip(-4)) { local uint sig = ReadUInt(); if(sig == footerSignature) { FSkip(-44); footerPosition = FTell(); Footer footer; break; } } } else { string timestamp; }