diff --git a/BurnOutSharp.Builder/Extensions.cs b/BurnOutSharp.Builder/Extensions.cs
index b11aee74..d976a85f 100644
--- a/BurnOutSharp.Builder/Extensions.cs
+++ b/BurnOutSharp.Builder/Extensions.cs
@@ -305,6 +305,29 @@ namespace BurnOutSharp.Builder
return (entry.ResourceID & 0x8000) != 0;
}
+ ///
+ /// Get the segment entry type for an entry table bundle
+ ///
+ /// Entry table bundle to check
+ /// SegmentEntryType corresponding to the type
+ public static Models.NewExecutable.SegmentEntryType GetEntryType(this Models.NewExecutable.EntryTableBundle entry)
+ {
+ // We can't do anything with an invalid entry
+ if (entry == null)
+ return Models.NewExecutable.SegmentEntryType.Unused;
+
+ // Determine the entry type based on segment indicator
+ if (entry.SegmentIndicator == 0x00)
+ return Models.NewExecutable.SegmentEntryType.Unused;
+ else if (entry.SegmentIndicator >= 0x01 && entry.SegmentIndicator <= 0xFE)
+ return Models.NewExecutable.SegmentEntryType.FixedSegment;
+ else if (entry.SegmentIndicator == 0xFF)
+ return Models.NewExecutable.SegmentEntryType.MoveableSegment;
+
+ // We should never get here
+ return Models.NewExecutable.SegmentEntryType.Unused;
+ }
+
#endregion
}
}
\ No newline at end of file
diff --git a/BurnOutSharp.Models/NewExecutable/EntryTableBundle.cs b/BurnOutSharp.Models/NewExecutable/EntryTableBundle.cs
index 85422c37..9e04f56a 100644
--- a/BurnOutSharp.Models/NewExecutable/EntryTableBundle.cs
+++ b/BurnOutSharp.Models/NewExecutable/EntryTableBundle.cs
@@ -43,16 +43,42 @@
///
public byte SegmentIndicator;
- ///
- /// Fixed segment entry
- ///
- /// Must be NULL if is used.
- public FixedSegmentEntry FixedSegmentEntry;
+ #region Fixed Segment Entry
///
- /// Moveable segment entry
+ /// Flag word.
///
- /// Must be NULL if is used.
- public MoveableSegmentEntry MoveableSegmentEntry;
+ public FixedSegmentEntryFlag FixedFlagWord;
+
+ ///
+ /// Offset within segment to entry point.
+ ///
+ public ushort FixedOffset;
+
+ #endregion
+
+ #region Moveable Segment Entry
+
+ ///
+ /// Flag word.
+ ///
+ public MoveableSegmentEntryFlag MoveableFlagWord;
+
+ ///
+ /// INT 3FH.
+ ///
+ public ushort MoveableReserved;
+
+ ///
+ /// Segment number.
+ ///
+ public byte MoveableSegmentNumber;
+
+ ///
+ /// Offset within segment to entry point.
+ ///
+ public ushort MoveableOffset;
+
+ #endregion
}
}
diff --git a/BurnOutSharp.Models/NewExecutable/Enums.cs b/BurnOutSharp.Models/NewExecutable/Enums.cs
index 8ff4ea93..2b5a1f5e 100644
--- a/BurnOutSharp.Models/NewExecutable/Enums.cs
+++ b/BurnOutSharp.Models/NewExecutable/Enums.cs
@@ -262,6 +262,27 @@ namespace BurnOutSharp.Models.NewExecutable
PRELOAD = 0x0040,
}
+ public enum SegmentEntryType
+ {
+ ///
+ /// 000h - There is no entry data in an unused bundle. The next bundle
+ /// follows this field. This is used by the linker to skip ordinal numbers.
+ ///
+ Unused,
+
+ ///
+ /// 001h-0FEh - Segment number for fixed segment entries. A fixed segment
+ /// entry is 3 bytes long.
+ ///
+ FixedSegment,
+
+ ///
+ /// 0FFH - Moveable segment entries. The entry data contains the segment
+ /// number for the entry points. A moveable segment entry is 6 bytes long.
+ ///
+ MoveableSegment,
+ }
+
[Flags]
public enum SegmentTableEntryFlag : ushort
{
diff --git a/BurnOutSharp.Models/NewExecutable/FixedSegmentEntry.cs b/BurnOutSharp.Models/NewExecutable/FixedSegmentEntry.cs
deleted file mode 100644
index 3190e91a..00000000
--- a/BurnOutSharp.Models/NewExecutable/FixedSegmentEntry.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-using System.Runtime.InteropServices;
-
-namespace BurnOutSharp.Models.NewExecutable
-{
- ///
- /// Segment number for fixed segment entries. A fixed
- /// segment entry is 3 bytes long and has the following
- /// format.
- ///
- /// 001h-0FEh
- ///
- [StructLayout(LayoutKind.Sequential)]
- public class FixedSegmentEntry
- {
- ///
- /// Flag word.
- ///
- public FixedSegmentEntryFlag FlagWord;
-
- ///
- /// Offset within segment to entry point.
- ///
- public ushort Offset;
- }
-}
diff --git a/BurnOutSharp.Models/NewExecutable/MoveableSegmentEntry.cs b/BurnOutSharp.Models/NewExecutable/MoveableSegmentEntry.cs
deleted file mode 100644
index eba61614..00000000
--- a/BurnOutSharp.Models/NewExecutable/MoveableSegmentEntry.cs
+++ /dev/null
@@ -1,35 +0,0 @@
-using System.Runtime.InteropServices;
-
-namespace BurnOutSharp.Models.NewExecutable
-{
- ///
- /// Moveable segment entries. The entry data contains the
- /// segment number for the entry points. A moveable segment
- /// entry is 6 bytes long and has the following format.
- ///
- /// 0FFH
- ///
- [StructLayout(LayoutKind.Sequential)]
- public class MoveableSegmentEntry
- {
- ///
- /// Flag word.
- ///
- public MoveableSegmentEntryFlag FlagWord;
-
- ///
- /// INT 3FH.
- ///
- public ushort Reserved;
-
- ///
- /// Segment number.
- ///
- public byte SegmentNumber;
-
- ///
- /// Offset within segment to entry point.
- ///
- public ushort Offset;
- }
-}