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; - } -}