1
1
using System ;
2
2
using System . Collections . Generic ;
3
+ using System . Diagnostics ;
3
4
using System . Linq ;
4
5
using BizHawk . Common ;
5
6
@@ -12,6 +13,7 @@ public sealed class Disk
12
13
public const int FluxEntriesPerTrack = FluxBitsPerTrack / FluxBitsPerEntry ;
13
14
private readonly int [ ] [ ] _tracks ;
14
15
private readonly int [ ] [ ] _originalMedia ;
16
+ private bool [ ] _usedTracks ;
15
17
public bool Valid ;
16
18
public bool WriteProtected ;
17
19
@@ -24,6 +26,7 @@ public Disk(int trackCapacity)
24
26
_tracks = new int [ trackCapacity ] [ ] ;
25
27
FillMissingTracks ( ) ;
26
28
_originalMedia = _tracks . Select ( t => ( int [ ] ) t . Clone ( ) ) . ToArray ( ) ;
29
+ _usedTracks = new bool [ trackCapacity ] ;
27
30
Valid = true ;
28
31
}
29
32
@@ -46,6 +49,7 @@ public Disk(IList<byte[]> trackData, IList<int> trackNumbers, IList<int> trackDe
46
49
FillMissingTracks ( ) ;
47
50
Valid = true ;
48
51
_originalMedia = _tracks . Select ( t => ( int [ ] ) t . Clone ( ) ) . ToArray ( ) ;
52
+ _usedTracks = new bool [ trackCapacity ] ;
49
53
}
50
54
51
55
private int [ ] ConvertToFluxTransitions ( int density , byte [ ] bytes , int fluxBitOffset )
@@ -133,16 +137,26 @@ private void FillMissingTracks()
133
137
134
138
public int [ ] GetDataForTrack ( int halftrack )
135
139
{
140
+ _usedTracks [ halftrack ] = true ; // TODO: probably can be smarter about this with the WriteProtected flag
136
141
return _tracks [ halftrack ] ;
137
142
}
138
143
139
144
public void SyncState ( Serializer ser )
140
145
{
141
146
ser . Sync ( nameof ( WriteProtected ) , ref WriteProtected ) ;
147
+ var oldUsedTracks = _usedTracks ; // Sync changes reference if loading state (we don't care in the saving state case)
148
+ ser . Sync ( nameof ( _usedTracks ) , ref _usedTracks , useNull : false ) ;
142
149
143
150
for ( var i = 0 ; i < _tracks . Length ; i ++ )
144
151
{
145
- ser . SyncDelta ( $ "MediaState{ i } ", _originalMedia [ i ] , _tracks [ i ] ) ;
152
+ if ( _usedTracks [ i ] )
153
+ {
154
+ ser . SyncDelta ( $ "MediaState{ i } ", _originalMedia [ i ] , _tracks [ i ] ) ;
155
+ }
156
+ else if ( ser . IsReader && oldUsedTracks [ i ] ) // _tracks[i] might be different, but in the state it wasn't, so just copy _originalMedia[i]
157
+ {
158
+ _originalMedia [ i ] . AsSpan ( ) . CopyTo ( _tracks [ i ] ) ;
159
+ }
146
160
}
147
161
}
148
162
}
0 commit comments