@@ -366,7 +366,7 @@ Namespace ImageFormats
366366 If Sector.DAMFound Then
367367 IMDSector.Unavailable = False
368368 IMDSector.Data = Sector.Data
369- IMDSector.ChecksumError = Not Sector.InitialChecksumValid
369+ IMDSector.ChecksumError = Not Sector.InitialDataChecksumValid
370370 IMDSector.Deleted = (Sector.DAM = MFMAddressMark.DeletedData)
371371 Else
372372 IMDSector.Unavailable = True
@@ -461,6 +461,7 @@ Namespace ImageFormats
461461 PSI.Header.FormatVersion = 0
462462
463463 For Track = 0 To TrackCount - 1 Step Image.TrackStep
464+ Dim NewTrack = Track \ Image.TrackStep
464465 For Side = 0 To Image.SideCount - 1
465466 BitstreamTrack = Image.GetTrack(Track, Side)
466467
@@ -472,7 +473,7 @@ Namespace ImageFormats
472473 End If
473474
474475 For Each Sector In BitstreamTrack.MFMData.Sectors
475- Dim PSISector = PSISectorFromMFMSector(Sector)
476+ Dim PSISector = PSISectorFromMFMSector(NewTrack, Side, Sector, TrackFormat )
476477
477478 If BitstreamTrack.SurfaceData IsNot Nothing Then
478479 Dim Buffer = MFMGetBytes(BitstreamTrack.SurfaceData, Sector.DataOffset, Sector.Data.Length)
@@ -716,6 +717,22 @@ Namespace ImageFormats
716717 Return (Track * Params.NumberOfHeads * Params.SectorsPerTrack + Params.SectorsPerTrack * Side + (SectorId - 1 )) * Params.BytesPerSector
717718 End Function
718719
720+ Private Function GETPSIEncodingSubType(TrackFormat As MFMTrackFormat) As PSI.MFMEncodingSubtype
721+ Select Case TrackFormat
722+ Case MFMTrackFormat.TrackFormatDD
723+ Return PSI.MFMEncodingSubtype.DoubleDensity
724+ Case MFMTrackFormat.TrackFormatHD
725+ Return PSI.MFMEncodingSubtype.HighDensity
726+ Case MFMTrackFormat.TrackFormatHD1200
727+ Return PSI.MFMEncodingSubtype.HighDensity
728+ Case MFMTrackFormat.TrackFormatED
729+ Return PSI.MFMEncodingSubtype.ExtraDensity
730+ Case Else
731+ Return PSI.MFMEncodingSubtype.DoubleDensity
732+ End Select
733+
734+ End Function
735+
719736 Private Function GetPSISectorFormat(TrackFormat As MFMTrackFormat) As PSI.DefaultSectorFormat
720737 Select Case TrackFormat
721738 Case MFMTrackFormat.TrackFormatDD
@@ -817,19 +834,36 @@ Namespace ImageFormats
817834 Return MFMBitstream
818835 End Function
819836
820- Private Function PSISectorFromMFMSector(Sector As IBM_MFM_Sector) As PSI.PSISector
821- Dim DataChecksumValid = Sector.DataChecksum = Sector.CalculateDataChecksum
837+ Private Function PSISectorFromMFMSector(Track As UShort, Side As Byte , Sector As IBM_MFM_Sector, TrackFormat As MFMTrackFormat) As PSI.PSISector
838+ Dim DataFieldCRCError = Sector.DataChecksum <> Sector.CalculateDataChecksum
839+ Dim IDFieldCRCError = Sector.IDChecksum <> Sector.CalculateIDChecksum
840+ Dim DeletedDAM = Sector.DAM = MFMAddressMark.DeletedData
841+ Dim MissingDAM = Not Sector.DAMFound
822842
823843 Dim PSISector = New PSI.PSISector With {
824- .HasDataCRCError = Not DataChecksumValid,
825- .IsAlternateSector = False ,
826- .Track = Sector.Track,
827- .Side = Sector.Side,
828- .Sector = Sector.SectorId,
829- .Data = Sector.Data,
830- .Offset = (Sector.Offset + 64 ) / 2
844+ .HasDataCRCError = DataFieldCRCError,
845+ .IsAlternateSector = False ,
846+ .Track = Track,
847+ .Side = Side,
848+ .Sector = Sector.SectorId,
849+ .Data = Sector.Data,
850+ .Offset = (Sector.Offset + 64 ) / 2
851+ }
852+ If Sector.Track <> Track Or Sector.Side <> Side Or DeletedDAM Or MissingDAM Or IDFieldCRCError Then
853+ PSISector.MFMHeader = New PSI.IBMSectorHeader With {
854+ .Cylinder = Sector.Track,
855+ .Head = Sector.Side,
856+ .Sector = Sector.SectorId,
857+ .Size = Sector.Size,
858+ .EncodingSubType = GETPSIEncodingSubType(TrackFormat),
859+ .IDFieldCRCError = IDFieldCRCError,
860+ .DataFieldCRCError = DataFieldCRCError,
861+ .DeletedDAM = DeletedDAM,
862+ .MissingDAM = MissingDAM
831863 }
832864
865+ End If
866+
833867 Return PSISector
834868 End Function
835869
0 commit comments