Skip to content

Commit 169e98b

Browse files
committed
Improved PCE Sector Image (.psi) support
1 parent 3f758c9 commit 169e98b

File tree

9 files changed

+143
-30
lines changed

9 files changed

+143
-30
lines changed

DiskImageTool/Bitstream/Functions.vb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ Namespace Bitstream
1515
If BitstreamTrack IsNot Nothing AndAlso BitstreamTrack.MFMData IsNot Nothing Then
1616
For Each MFMSector In BitstreamTrack.MFMData.Sectors
1717
If MFMSector.DAMFound Then
18-
If MFMSector.InitialChecksumValid Then
18+
If MFMSector.InitialDataChecksumValid Then
1919
OutputBuffer = New Byte(MFMSector.Data.Length - 1) {}
2020
HashAlgorithm.TransformBlock(MFMSector.Data, 0, MFMSector.Data.Length, OutputBuffer, 0)
2121
End If

DiskImageTool/Bitstream/IBM_MFM/IBM_MFM_Sector.vb

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
Private ReadOnly _Bitstream As BitArray
55
Private ReadOnly _IDArea() As Byte
66
Private ReadOnly _IDChecksum As UShort
7-
Private ReadOnly _InitialChecksumValid As Boolean
7+
Private ReadOnly _IDChecksumValid As Boolean
8+
Private ReadOnly _InitialDataChecksumValid As Boolean
89
Private ReadOnly _Offset As UInteger
910
Private _DAMFound As Boolean = False
1011
Private _Data As Byte()
@@ -27,7 +28,8 @@
2728

2829
ProcessGap3(Bitstream, DataOffset)
2930

30-
_InitialChecksumValid = (_DataChecksum = CalculateDataChecksum())
31+
_InitialDataChecksumValid = (_DataChecksum = CalculateDataChecksum())
32+
_IDChecksumValid = (_IDChecksum = CalculateIDChecksum())
3133
End Sub
3234

3335
Public ReadOnly Property DAM As MFMAddressMark
@@ -81,9 +83,15 @@
8183
End Get
8284
End Property
8385

84-
Public ReadOnly Property InitialChecksumValid As Boolean
86+
Public ReadOnly Property IDChecksumValid As Boolean
8587
Get
86-
Return _InitialChecksumValid
88+
Return _IDChecksumValid
89+
End Get
90+
End Property
91+
92+
Public ReadOnly Property InitialDataChecksumValid As Boolean
93+
Get
94+
Return _InitialDataChecksumValid
8795
End Get
8896
End Property
8997

DiskImageTool/Bitstream/IBM_MFM/IBM_MFM_Tools.vb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -604,7 +604,7 @@
604604
End Function
605605

606606
Public Function IsStandardSector(Sector As IBM_MFM_Sector, Track As Byte, Side As Byte) As Boolean
607-
If Not Sector.InitialChecksumValid Then
607+
If Not Sector.InitialDataChecksumValid Or Not Sector.IDChecksumValid Then
608608
Return False
609609
End If
610610

@@ -620,7 +620,7 @@
620620
Return False
621621
End If
622622

623-
If Sector.DAM <> MFMAddressMark.Data Then
623+
If Not Sector.DAMFound Or Sector.DAM <> MFMAddressMark.Data Then
624624
Return False
625625
End If
626626

DiskImageTool/DiskImageTool.vbproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
<TargetCulture>en-US</TargetCulture>
3131
<ProductName>DiskImageTool</ProductName>
3232
<PublisherName>Digitoxin</PublisherName>
33-
<ApplicationRevision>0</ApplicationRevision>
33+
<ApplicationRevision>1</ApplicationRevision>
3434
<ApplicationVersion>2.6.0.%2a</ApplicationVersion>
3535
<UseApplicationTrust>false</UseApplicationTrust>
3636
<PublishWizardCompleted>true</PublishWizardCompleted>

DiskImageTool/ImageFormats/ImageConversion.vb

Lines changed: 45 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -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

DiskImageTool/ImageFormats/PSI/IBMSectorHeader.vb

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,24 @@
2626
End Set
2727
End Property
2828

29+
Public Property DataFieldCRCError() As Boolean
30+
Get
31+
Return (Flags And MFMSectorFlags.DataFieldCRCError) > 0
32+
End Get
33+
Set(value As Boolean)
34+
Flags = MyBitConverter.ToggleBit(Flags, MFMSectorFlags.DataFieldCRCError, value)
35+
End Set
36+
End Property
37+
38+
Public Property DeletedDAM() As Boolean
39+
Get
40+
Return (Flags And MFMSectorFlags.DeletedDAM) > 0
41+
End Get
42+
Set(value As Boolean)
43+
Flags = MyBitConverter.ToggleBit(Flags, MFMSectorFlags.DeletedDAM, value)
44+
End Set
45+
End Property
46+
2947
Public Property EncodingSubType As MFMEncodingSubtype
3048
Get
3149
Return _ChunkData(5)
@@ -53,6 +71,24 @@
5371
End Set
5472
End Property
5573

74+
Public Property IDFieldCRCError() As Boolean
75+
Get
76+
Return (Flags And MFMSectorFlags.IDFieldCRCError) > 0
77+
End Get
78+
Set(value As Boolean)
79+
Flags = MyBitConverter.ToggleBit(Flags, MFMSectorFlags.IDFieldCRCError, value)
80+
End Set
81+
End Property
82+
83+
Public Property MissingDAM() As Boolean
84+
Get
85+
Return (Flags And MFMSectorFlags.MissingDAM) > 0
86+
End Get
87+
Set(value As Boolean)
88+
Flags = MyBitConverter.ToggleBit(Flags, MFMSectorFlags.MissingDAM, value)
89+
End Set
90+
End Property
91+
5692
Public Property Sector As Byte
5793
Get
5894
Return _ChunkData(2)

DiskImageTool/ImageFormats/PSI/PSIFloppyImage.vb

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ Namespace ImageFormats
9898
End If
9999

100100
If PSISector.Sector >= 1 And PSISector.Sector <= SECTOR_COUNT Then
101-
Dim IsStandard = (PSISector.Size = 512 And Not PSISector.HasDataCRCError And PSISector.Sector <= MaxSectors)
101+
Dim IsStandard = IsStandardSector(PSISector, MaxSectors)
102102
If IsStandard Then
103103
Dim BitstreamSector As New BitstreamSector(PSISector.Data, PSISector.Size) With {
104104
.IsStandard = IsStandard
@@ -115,6 +115,36 @@ Namespace ImageFormats
115115
Next
116116
End Sub
117117

118+
Private Function IsStandardSector(PSISector As PSISector, MaxSectors As UShort) As Boolean
119+
If PSISector.Sector > MaxSectors Then
120+
Return False
121+
End If
122+
123+
If PSISector.Size <> 512 Then
124+
Return False
125+
End If
126+
127+
If PSISector.HasDataCRCError Then
128+
Return False
129+
End If
130+
131+
If PSISector.MFMHeader IsNot Nothing Then
132+
If PSISector.MFMHeader.Cylinder <> PSISector.Track Then
133+
Return False
134+
End If
135+
136+
If PSISector.MFMHeader.Head <> PSISector.Side Then
137+
Return False
138+
End If
139+
140+
If PSISector.MFMHeader.DeletedDAM Or PSISector.MFMHeader.MissingDAM Or PSISector.MFMHeader.IDFieldCRCError Or PSISector.MFMHeader.DataFieldCRCError Then
141+
Return False
142+
End If
143+
End If
144+
145+
Return True
146+
End Function
147+
118148
Private Function CalculateHash(HashAlgorithm As HashAlgorithm) As String
119149
Dim OutputBuffer() As Byte
120150

DiskImageTool/MainForm.vb

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3160,18 +3160,23 @@ Public Class MainForm
31603160
i += 1
31613161
Next
31623162

3163-
Array.Sort(TrackList)
3163+
If TrackList.Length <= 30 Then
3164+
Array.Sort(TrackList)
31643165

3165-
MenuRawTrackDataSubMenuItemAdd(-1, "All Tracks")
3166+
MenuRawTrackDataSubMenuItemAdd(-1, "All Tracks")
31663167

3167-
For i = 0 To TrackList.Length - 1
3168-
Dim Track = TrackList(i)
3169-
Dim TrackString = "Track " & (Track \ Disk.Image.SideCount) & "." & (Track Mod Disk.Image.SideCount)
3170-
MenuRawTrackDataSubMenuItemAdd(Track, TrackString)
3171-
Next
3168+
For i = 0 To TrackList.Length - 1
3169+
Dim Track = TrackList(i)
3170+
Dim TrackString = "Track " & (Track \ Disk.Image.SideCount) & "." & (Track Mod Disk.Image.SideCount)
3171+
MenuRawTrackDataSubMenuItemAdd(Track, TrackString)
3172+
Next
31723173

3173-
MenuHexRawTrackData.Enabled = True
3174-
MenuHexRawTrackData.Tag = Nothing
3174+
MenuHexRawTrackData.Enabled = True
3175+
MenuHexRawTrackData.Tag = Nothing
3176+
Else
3177+
MenuHexRawTrackData.Enabled = True
3178+
MenuHexRawTrackData.Tag = -1
3179+
End If
31753180
Else
31763181
MenuHexRawTrackData.Enabled = True
31773182
MenuHexRawTrackData.Tag = -1

DiskImageTool/My Project/AssemblyInfo.vb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,4 @@ Imports System.Runtime.InteropServices
3131
' <Assembly: AssemblyVersion("1.0.*")>
3232

3333
<Assembly: AssemblyVersion("1.0.0.0")>
34-
<Assembly: AssemblyFileVersion("2.6.0.0")>
34+
<Assembly: AssemblyFileVersion("2.6.0.1")>

0 commit comments

Comments
 (0)