clean up TOCRaw including redundant LeadoutTimestamp data (actually contained in entry 100) and import its Control field correctly from Mednadisc
This commit is contained in:
parent
80164c1fba
commit
87ff7f9a71
|
@ -213,8 +213,6 @@ namespace BizHawk.Emulation.DiscSystem
|
||||||
TOCRaw.TOCItems[i + 1].LBATimestamp = new Timestamp(track.Indexes[1].LBA); //WHAT?? WE NEED THIS AFTER ALL! ZOUNDS MEANS, THERE WAS JUST SOME OTHER BUG
|
TOCRaw.TOCItems[i + 1].LBATimestamp = new Timestamp(track.Indexes[1].LBA); //WHAT?? WE NEED THIS AFTER ALL! ZOUNDS MEANS, THERE WAS JUST SOME OTHER BUG
|
||||||
lastEnd = track.LengthInSectors + track.Indexes[1].LBA;
|
lastEnd = track.LengthInSectors + track.Indexes[1].LBA;
|
||||||
}
|
}
|
||||||
|
|
||||||
TOCRaw.LeadoutTimestamp = new Timestamp(lastEnd);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
|
@ -64,6 +64,10 @@ namespace BizHawk.Emulation.DiscSystem
|
||||||
|
|
||||||
BufferedSubcodeSector bss = new BufferedSubcodeSector(); //TODO - its hacky that we need this..
|
BufferedSubcodeSector bss = new BufferedSubcodeSector(); //TODO - its hacky that we need this..
|
||||||
|
|
||||||
|
//ADR (q-Mode) is necessarily 0x01 for a RawTOCEntry
|
||||||
|
const int kADR = 1;
|
||||||
|
const int kUnknownControl = 0;
|
||||||
|
|
||||||
//mednafen delivers us what is essentially but not exactly (or completely) a TOCRaw.
|
//mednafen delivers us what is essentially but not exactly (or completely) a TOCRaw.
|
||||||
//we need to synth RawTOCEntries from this and then turn it into a proper TOCRaw
|
//we need to synth RawTOCEntries from this and then turn it into a proper TOCRaw
|
||||||
//when coming from mednafen, there are 101 entries.
|
//when coming from mednafen, there are 101 entries.
|
||||||
|
@ -82,7 +86,7 @@ namespace BizHawk.Emulation.DiscSystem
|
||||||
|
|
||||||
var q = new SubchannelQ
|
var q = new SubchannelQ
|
||||||
{
|
{
|
||||||
q_status = 0, //unknown with mednadisc
|
q_status = SubchannelQ.ComputeStatus(kADR, (EControlQ)m_te.control),
|
||||||
q_tno = BCD2.FromDecimal(0), //unknown with mednadisc
|
q_tno = BCD2.FromDecimal(0), //unknown with mednadisc
|
||||||
q_index = BCD2.FromDecimal(i),
|
q_index = BCD2.FromDecimal(i),
|
||||||
min = BCD2.FromDecimal(0), //unknown with mednadisc
|
min = BCD2.FromDecimal(0), //unknown with mednadisc
|
||||||
|
@ -107,7 +111,7 @@ namespace BizHawk.Emulation.DiscSystem
|
||||||
//synth A1 and A2 entries instead of setting FirstRecordedTrackNumber and LastRecordedTrackNumber below
|
//synth A1 and A2 entries instead of setting FirstRecordedTrackNumber and LastRecordedTrackNumber below
|
||||||
var qA1 = new SubchannelQ
|
var qA1 = new SubchannelQ
|
||||||
{
|
{
|
||||||
q_status = 0, //unknown with mednadisc
|
q_status = SubchannelQ.ComputeStatus(kADR, kUnknownControl),
|
||||||
q_tno = BCD2.FromDecimal(0), //unknown with mednadisc
|
q_tno = BCD2.FromDecimal(0), //unknown with mednadisc
|
||||||
q_index = BCD2.FromBCD(0xA0),
|
q_index = BCD2.FromBCD(0xA0),
|
||||||
min = BCD2.FromDecimal(0), //unknown with mednadisc
|
min = BCD2.FromDecimal(0), //unknown with mednadisc
|
||||||
|
@ -122,7 +126,7 @@ namespace BizHawk.Emulation.DiscSystem
|
||||||
disc.RawTOCEntries.Add(new RawTOCEntry { QData = qA1 });
|
disc.RawTOCEntries.Add(new RawTOCEntry { QData = qA1 });
|
||||||
var qA2 = new SubchannelQ
|
var qA2 = new SubchannelQ
|
||||||
{
|
{
|
||||||
q_status = 0, //unknown with mednadisc
|
q_status = SubchannelQ.ComputeStatus(kADR, kUnknownControl),
|
||||||
q_tno = BCD2.FromDecimal(0), //unknown with mednadisc
|
q_tno = BCD2.FromDecimal(0), //unknown with mednadisc
|
||||||
q_index = BCD2.FromBCD(0xA1),
|
q_index = BCD2.FromBCD(0xA1),
|
||||||
min = BCD2.FromDecimal(0), //unknown with mednadisc
|
min = BCD2.FromDecimal(0), //unknown with mednadisc
|
||||||
|
|
|
@ -12,9 +12,7 @@ namespace BizHawk.Emulation.DiscSystem
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Synthesizes the TOC from a set of raw entries.
|
/// Synthesizes the TOC from a set of raw entries.
|
||||||
/// When a disc drive firmware reads the lead-in area, it builds this TOC from finding q-mode 1 sectors in the Q subchannel of the lead-in area.
|
/// When a disc drive firmware reads the lead-in area, it builds this TOC from finding q-mode 1 sectors in the Q subchannel of the lead-in area.
|
||||||
/// Question: does it ignore q-mode != 1?
|
/// Question: I guess it must ignore q-mode != 1? what else would it do with it?
|
||||||
/// Once upon a time, I said: "The disc drive firmware will discover other mode sectors in the lead-in area, and it will register those in separate data structures."
|
|
||||||
/// What do I mean by this?
|
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class SynthesizeFromRawTOCEntriesJob
|
public class SynthesizeFromRawTOCEntriesJob
|
||||||
{
|
{
|
||||||
|
@ -27,8 +25,8 @@ namespace BizHawk.Emulation.DiscSystem
|
||||||
SynthesizeFromRawTOCEntriesJob job = this;
|
SynthesizeFromRawTOCEntriesJob job = this;
|
||||||
DiscTOCRaw ret = new DiscTOCRaw();
|
DiscTOCRaw ret = new DiscTOCRaw();
|
||||||
|
|
||||||
//this is a dummy, for convenience
|
//this is a dummy, for convenience in array indexing, so that track 1 is at array index 1
|
||||||
ret.TOCItems[0].LBATimestamp = new Timestamp(0);
|
ret.TOCItems[0].LBATimestamp = new Timestamp(0); //arguably could be -150, but let's not just yet
|
||||||
ret.TOCItems[0].Control = 0;
|
ret.TOCItems[0].Control = 0;
|
||||||
ret.TOCItems[0].Exists = false;
|
ret.TOCItems[0].Exists = false;
|
||||||
|
|
||||||
|
@ -73,7 +71,9 @@ namespace BizHawk.Emulation.DiscSystem
|
||||||
}
|
}
|
||||||
else if (point == 102) //0xA2 bcd
|
else if (point == 102) //0xA2 bcd
|
||||||
{
|
{
|
||||||
ret.LeadoutTimestamp = q.AP_Timestamp;
|
ret.TOCItems[100].LBATimestamp = new Timestamp(q.AP_Timestamp.Sector - 150); //RawTOCEntries contained an absolute time
|
||||||
|
ret.TOCItems[100].Control = 0; //not clear what this should be
|
||||||
|
ret.TOCItems[100].Exists = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -82,9 +82,10 @@ namespace BizHawk.Emulation.DiscSystem
|
||||||
if (ret.FirstRecordedTrackNumber == -1) { }
|
if (ret.FirstRecordedTrackNumber == -1) { }
|
||||||
if (ret.LastRecordedTrackNumber == -1) { ret.LastRecordedTrackNumber = maxFoundTrack; }
|
if (ret.LastRecordedTrackNumber == -1) { ret.LastRecordedTrackNumber = maxFoundTrack; }
|
||||||
if (ret.Session1Format == SessionFormat.None) ret.Session1Format = SessionFormat.Type00_CDROM_CDDA;
|
if (ret.Session1Format == SessionFormat.None) ret.Session1Format = SessionFormat.Type00_CDROM_CDDA;
|
||||||
if (!ret.LeadoutTimestamp.Valid) {
|
|
||||||
//we're DOOMED. we cant know the length of the last track without this....
|
//if (!ret.LeadoutTimestamp.Valid) {
|
||||||
}
|
// //we're DOOMED. we cant know the length of the last track without this....
|
||||||
|
//}
|
||||||
job.Result = ret;
|
job.Result = ret;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -112,13 +113,25 @@ namespace BizHawk.Emulation.DiscSystem
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public SessionFormat Session1Format = SessionFormat.None;
|
public SessionFormat Session1Format = SessionFormat.None;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Information about a single track in the TOC
|
||||||
|
/// </summary>
|
||||||
public struct TOCItem
|
public struct TOCItem
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// [IEC10149] "the control field used in the information track"
|
||||||
|
/// the raw TOC entries do have a control field which is supposed to match what's found in the track.
|
||||||
|
/// A CD Reader could conceivably retrieve this.
|
||||||
|
/// </summary>
|
||||||
public EControlQ Control;
|
public EControlQ Control;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The location of the track (Index 1)
|
||||||
|
/// </summary>
|
||||||
public Timestamp LBATimestamp;
|
public Timestamp LBATimestamp;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// TODO - this is used for setting ADR to 1 or 0 for mednafen. maybe we need to track ADR separately? (CCD specifies it)
|
/// Whether this entry exists (since the table is 101 entries long always)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool Exists;
|
public bool Exists;
|
||||||
}
|
}
|
||||||
|
@ -131,8 +144,8 @@ namespace BizHawk.Emulation.DiscSystem
|
||||||
public TOCItem[] TOCItems = new TOCItem[101];
|
public TOCItem[] TOCItems = new TOCItem[101];
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// POINT=0xA2 specifies this
|
/// The timestamp of the leadout track. In other words, the end of the user area.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public Timestamp LeadoutTimestamp = new Timestamp();
|
public Timestamp LeadoutTimestamp { get { return TOCItems[100].LBATimestamp; } }
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue