From d2133c60cd0ae95b91ad8dff570f53db738656ef Mon Sep 17 00:00:00 2001 From: BlubbFish Date: Wed, 2 Jun 2021 00:48:44 +0200 Subject: [PATCH] 1.0.0 Init... --- .gitignore | 3 + CHANGELOG.md | 7 + CONTRIBUTING.md | 92 +++ DuinoDCX.sln | 55 ++ DuinoDCX/DuinoDCX.csproj | 38 ++ DuinoDCX/Ultradrive.cs | 1169 ++++++++++++++++++++++++++++++++++++++ 6 files changed, 1364 insertions(+) create mode 100644 .gitignore create mode 100644 CHANGELOG.md create mode 100644 CONTRIBUTING.md create mode 100644 DuinoDCX.sln create mode 100644 DuinoDCX/DuinoDCX.csproj create mode 100644 DuinoDCX/Ultradrive.cs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..91f6ef8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +/.vs +/DuinoDCX/obj +/DuinoDCX/bin diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..308858f --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,7 @@ +# Changelogs + +## 1.0.0 - Init... +### New Features +* Create the Library +### Bugfixes +### Changes \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..806457b --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,92 @@ +# Contributing + +When contributing to this repository, please first discuss the change you wish to make via issue, +email, or any other method with the owners of this repository before making a change. + +Please note we have a code of conduct, please follow it in all your interactions with the project. + +## Pull Request Process + +1. Ensure any install or build dependencies are removed before the end of the layer when doing a + build. +2. Update the README.md with details of changes to the interface, this includes new environment + variables, exposed ports, useful file locations and container parameters. +3. Increase the version numbers in any examples files and the README.md to the new version that this + Pull Request would represent. The versioning scheme we use is [SemVer](http://semver.org/). +4. You may merge the Pull Request in once you have the sign-off of two other developers, or if you + do not have permission to do that, you may request the second reviewer to merge it for you. + +## Code of Conduct + +### Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, gender identity and expression, level of experience, +nationality, personal appearance, race, religion, or sexual identity and +orientation. + +### Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or +advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +### Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +### Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +### Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at philip.schell ATTTT fit.fraunhofer.net. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +### Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at [http://contributor-covenant.org/version/1/4][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ \ No newline at end of file diff --git a/DuinoDCX.sln b/DuinoDCX.sln new file mode 100644 index 0000000..52e71e5 --- /dev/null +++ b/DuinoDCX.sln @@ -0,0 +1,55 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.31112.23 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DuinoDCX", "DuinoDCX\DuinoDCX.csproj", "{455C59F4-F7BB-4D86-AA69-5704118A805D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bot-Utils", "..\Utils\Bot-Utils\Bot-Utils\Bot-Utils.csproj", "{55EF436B-D16C-49A4-B0E9-BD247E1C6710}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Utils", "..\Utils\Utils\Utils\Utils.csproj", "{56778709-9E18-4C8B-A44B-AB442AFC31B7}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Utils-IoT", "..\Utils\Utils-IoT\Utils-IoT\Utils-IoT.csproj", "{728F2CFC-B0B4-42AB-AD4E-F40905B2D461}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "litjson", "..\Librarys\litjson\litjson\litjson.csproj", "{C67DC10E-9879-44A6-AD1D-AA29EB13E7F0}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DuinoDCXBot", "..\DuinoDCXBot\DuinoDCXBot.csproj", "{5E8700CE-FC44-4574-ACD4-5958AD35ECD3}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {455C59F4-F7BB-4D86-AA69-5704118A805D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {455C59F4-F7BB-4D86-AA69-5704118A805D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {455C59F4-F7BB-4D86-AA69-5704118A805D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {455C59F4-F7BB-4D86-AA69-5704118A805D}.Release|Any CPU.Build.0 = Release|Any CPU + {55EF436B-D16C-49A4-B0E9-BD247E1C6710}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {55EF436B-D16C-49A4-B0E9-BD247E1C6710}.Debug|Any CPU.Build.0 = Debug|Any CPU + {55EF436B-D16C-49A4-B0E9-BD247E1C6710}.Release|Any CPU.ActiveCfg = Release|Any CPU + {55EF436B-D16C-49A4-B0E9-BD247E1C6710}.Release|Any CPU.Build.0 = Release|Any CPU + {56778709-9E18-4C8B-A44B-AB442AFC31B7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {56778709-9E18-4C8B-A44B-AB442AFC31B7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {56778709-9E18-4C8B-A44B-AB442AFC31B7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {56778709-9E18-4C8B-A44B-AB442AFC31B7}.Release|Any CPU.Build.0 = Release|Any CPU + {728F2CFC-B0B4-42AB-AD4E-F40905B2D461}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {728F2CFC-B0B4-42AB-AD4E-F40905B2D461}.Debug|Any CPU.Build.0 = Debug|Any CPU + {728F2CFC-B0B4-42AB-AD4E-F40905B2D461}.Release|Any CPU.ActiveCfg = Release|Any CPU + {728F2CFC-B0B4-42AB-AD4E-F40905B2D461}.Release|Any CPU.Build.0 = Release|Any CPU + {C67DC10E-9879-44A6-AD1D-AA29EB13E7F0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C67DC10E-9879-44A6-AD1D-AA29EB13E7F0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C67DC10E-9879-44A6-AD1D-AA29EB13E7F0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C67DC10E-9879-44A6-AD1D-AA29EB13E7F0}.Release|Any CPU.Build.0 = Release|Any CPU + {5E8700CE-FC44-4574-ACD4-5958AD35ECD3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5E8700CE-FC44-4574-ACD4-5958AD35ECD3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5E8700CE-FC44-4574-ACD4-5958AD35ECD3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5E8700CE-FC44-4574-ACD4-5958AD35ECD3}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {9B9D918F-9E81-490B-A3D1-BA9F10677A7A} + EndGlobalSection +EndGlobal diff --git a/DuinoDCX/DuinoDCX.csproj b/DuinoDCX/DuinoDCX.csproj new file mode 100644 index 0000000..d2f1917 --- /dev/null +++ b/DuinoDCX/DuinoDCX.csproj @@ -0,0 +1,38 @@ + + + + Library + netcoreapp3.1 + BlubbFish.IoT.DuinoDCX + Library for Communicaion with a DCX2496 Ultradrive Pro + BlubbFish + BlubbFish + DuinoDCX.IoT.BlubbFish + de-DE + Copyright © 2021 - 02.06.2021 + + git + 1.0.0 Init + https://git.blubbfish.net/vs_projects/DuinoDCX + https://git.blubbfish.net/vs_projects/DuinoDCX.git + LICENSE + + + + + + + + + True + + + + + + + + + + + diff --git a/DuinoDCX/Ultradrive.cs b/DuinoDCX/Ultradrive.cs new file mode 100644 index 0000000..314b1f6 --- /dev/null +++ b/DuinoDCX/Ultradrive.cs @@ -0,0 +1,1169 @@ +using System; +using System.IO.Ports; +using System.Threading; + +namespace BlubbFish.IoT.DuinoDCX { + public class Ultradrive { + private const Int32 MAX_DEVICES = 16; + private const Int32 PING_INTEVAL = 1000; + private const Int32 TIMEOUT_TIME = 20000; + private const Int32 SEARCH_INTEVAL = 5000; + private const Int32 RESYNC_INTEVAL = 5000; + + private const Int32 SEARCH_RESPONSE_LENGTH = 26; + private const Int32 PING_RESPONSE_LENGTH = 25; + private const Int32 PART_0_LENGTH = 1015; + private const Int32 PART_1_LENGTH = 911; + + private const Byte SEARCH_RESPONSE = 0; + private const Byte PING_RESPONSE = 4; + private const Byte DUMP_RESPONSE = 16; + private const Byte DIRECT_COMMAND = 32; + + private const Byte ID_BYTE = 4; + private const Byte COMMAND_BYTE = 6; + private const Byte PARAM_COUNT_BYTE = 7; + private const Byte CHANNEL_BYTE = 8; + private const Byte PARAM_BYTE = 9; + private const Byte VALUE_HI_BYTE = 10; + private const Byte VALUE_LOW_BYTE = 11; + private const Byte PART_BYTE = 12; + + private const Byte COMMAND_START = 240; + private const Byte TERMINATOR = 247; + + private readonly Thread readerThread; + private Boolean runningReaderThread; + private readonly SerialPort serial; + + private Byte selectedDevice; + private Boolean isFirstRun; + + private DateTime lastSearch; + private DateTime lastPing = DateTime.Now; + private DateTime lastResync = DateTime.Now; + + private Boolean invalidateSync; + private Boolean readingCommand; + private Int32 serialRead; + + private readonly Byte[] serverBuffer = new Byte[PART_0_LENGTH]; + + private readonly Device[] devices = new Device[MAX_DEVICES]; + + private readonly Byte[] dump0 = new Byte[PART_0_LENGTH]; + private readonly Byte[] dump1 = new Byte[PART_1_LENGTH]; + private readonly Byte[] pingResponse = new Byte[PING_RESPONSE_LENGTH]; + private readonly Byte[] serialBuffer = new Byte[PART_0_LENGTH]; + + public Ultradrive(String serial) { + this.selectedDevice = 0; + this.runningReaderThread = true; + this.isFirstRun = true; + + this.serial = new SerialPort(serial, 38400); + this.serial.Open(); + + this.readerThread = new Thread(this.Loop); + this.readerThread.Start(); + + for(Int32 i = 0; i < this.devices.Length; i++) { + this.devices[i] = new Device(); + } + } + + private void Loop() { + while(this.runningReaderThread) { + this.ProcessIncoming(DateTime.Now); + Thread.Sleep(1); + } + } + + public void ProcessIncoming(DateTime now) { + while(this.serial.BytesToRead > 0) { + this.ReadCommands(now); + } + + if(this.isFirstRun) { + this.isFirstRun = false; + this.lastSearch = now; + this.Search(); + return; + } + + if((now - this.lastSearch).TotalMilliseconds >= SEARCH_INTEVAL) { + //Console.Write(now); + //Console.WriteLine(": Searching for devices."); + this.lastSearch = now; + this.Search(); + return; + } + + if((now - this.lastPing).TotalMilliseconds >= PING_INTEVAL) { + this.lastPing = now; + //Console.Write(now); + //Console.WriteLine(": Pinging selected device."); + this.Ping(this.selectedDevice); + return; + } + + if((now - this.lastResync).TotalMilliseconds >= RESYNC_INTEVAL) { + if((now - this.devices[this.selectedDevice].lastResponse).TotalMilliseconds < TIMEOUT_TIME) { + this.lastResync = now; + //Console.Write(now); + //Console.WriteLine(": Syncing selected device."); + this.SetTransmitMode(this.selectedDevice); + this.Dump(this.selectedDevice, 0); + this.Dump(this.selectedDevice, 1); + } + } + } + + public void ProcessOutgoing(Byte[] req) { + Int32 bytesRead = Array.IndexOf(req, TERMINATOR); + if(bytesRead == -1) { //Terminator not there + bytesRead = Math.Min(PART_0_LENGTH, req.Length); + } + Buffer.BlockCopy(req, 0, this.serverBuffer, 0, bytesRead); + if(bytesRead > 0) { + this.serverBuffer[bytesRead++] = TERMINATOR; + Array.Copy(this.vendorHeader, this.serverBuffer, 5); + + Byte command = this.serverBuffer[COMMAND_BYTE]; + + if(command == DIRECT_COMMAND) { + this.invalidateSync = true; + Byte count = this.serverBuffer[PARAM_COUNT_BYTE]; + + for(Byte i = 0; i < count; i++) { + Int32 offset = 4 * i; + Byte channel = this.serverBuffer[CHANNEL_BYTE + offset]; + Byte param = this.serverBuffer[PARAM_BYTE + offset]; + Byte valueHigh = this.serverBuffer[VALUE_HI_BYTE + offset]; + Byte valueLow = this.serverBuffer[VALUE_LOW_BYTE + offset]; + + if(channel == 0) { + this.PatchBuffer(valueLow, valueHigh, this.setupLocations[param - (param <= 11 ? 2 : 10)]); + } else if(channel <= 4) { + this.PatchBuffer(valueLow, valueHigh, this.inputLocations[channel - 1][param - 2]); + } else if(channel <= 10) { + this.PatchBuffer(valueLow, valueHigh, this.outputLocations[channel - 5][param - 2]); + } + } + + this.WriteSerial(this.serverBuffer, bytesRead); + } + + } + } + + public Byte[] WriteDevice() { + if((DateTime.Now - this.lastResync).TotalMilliseconds < TIMEOUT_TIME) { + Byte[] ret = new Byte[PART_0_LENGTH + PART_1_LENGTH]; + Array.Copy(this.dump0, ret, PART_0_LENGTH); + Array.Copy(this.dump1, 0, ret, PART_0_LENGTH, PART_1_LENGTH); + return ret; + } + return new Byte[0]; + } + + public Byte[] WriteDeviceStatus() => (DateTime.Now - this.lastPing).TotalMilliseconds < TIMEOUT_TIME ? this.pingResponse : (new Byte[0]); + + public Byte[] WriteDevices() { + DateTime now = DateTime.Now; + + Int32 total = 0; + for(Int32 i = 0; i < MAX_DEVICES; i++) { + if((now - this.devices[i].lastResponse).TotalMilliseconds < TIMEOUT_TIME) { + total += this.devices[i].response.Length; + } + } + + Byte[] ret = new Byte[total]; + Int32 offset = 0; + for(Int32 i = 0; i < MAX_DEVICES; i++) { + if((now - this.devices[i].lastResponse).TotalMilliseconds < TIMEOUT_TIME) { + Array.Copy(this.devices[i].response, 0, ret, offset, this.devices[i].response.Length); + offset += this.devices[i].response.Length; + } + } + return total > 0 ? ret : (new Byte[0]); + } + + public void SetSelected(Byte deviceId) => this.selectedDevice = deviceId; + + public Byte GetSelected() => this.selectedDevice; + + public void Dispose() { + this.runningReaderThread = false; + while(this.readerThread.IsAlive) { + Thread.Sleep(1); + } + this.serial.Close(); + this.serial.Dispose(); + } + + private void WriteSerial(Byte[] buffer, Int32 size) => this.serial.Write(buffer, 0, size); + + private void Search() { + Byte[] searchCommand = { 0xF0, 0x00, 0x20, 0x32, 0x20, 0x0E, 0x40, TERMINATOR }; + this.WriteSerial(searchCommand, searchCommand.Length); + } + + private void SetTransmitMode(Byte deviceId) { + Byte[] transmitModeCommand = { 0xF0, 0x00, 0x20, 0x32, deviceId, 0x0E, 0x3F, 0x0C, 0x00, TERMINATOR }; + this.WriteSerial(transmitModeCommand, transmitModeCommand.Length); + } + + private void Ping(Byte deviceId) { + Byte[] pingCommand = { 0xF0, 0x00, 0x20, 0x32, deviceId, 0x0E, 0x44, 0x00, 0x00, TERMINATOR }; + this.WriteSerial(pingCommand, pingCommand.Length); + } + + private void Dump(Byte deviceId, Byte part) { + Byte[] dumpCommand = { 0xF0, 0x00, 0x20, 0x32, deviceId, 0x0E, 0x50, 0x01, 0x00, part, TERMINATOR }; + this.WriteSerial(dumpCommand, dumpCommand.Length); + } + + private void ReadCommands(DateTime now) { + Int32 serialdata = this.serial.ReadByte(); + if(serialdata == -1) { + return; + } + Byte b = (Byte)serialdata; + + if(b == COMMAND_START) { + //Console.Write(now); + //Console.WriteLine(": Started receiving data from device"); + this.readingCommand = true; + this.serialRead = 0; + } + + if(this.readingCommand && this.serialRead < PART_0_LENGTH) { + this.serialBuffer[this.serialRead++] = b; + } else { + this.readingCommand = false; + this.serialRead = 0; + return; + } + + if(b == TERMINATOR) { + //Console.Write(now); + //Console.WriteLine(": Received end of data from device"); + this.readingCommand = false; + Byte[] vendorHeader = { 0xF0, 0x00, 0x20, 0x32, 0x00 }; + + Array.Copy(vendorHeader, this.serialBuffer, 5); + + Byte command = this.serialBuffer[COMMAND_BYTE]; + switch(command) { + case SEARCH_RESPONSE: { + if(this.serialRead == SEARCH_RESPONSE_LENGTH) { + //Console.Write(now); + //Console.WriteLine(": Received search response"); + Byte deviceId = this.serialBuffer[ID_BYTE]; + this.devices[deviceId].lastResponse = DateTime.Now; + Array.Copy(this.serialBuffer, this.devices[deviceId].response, SEARCH_RESPONSE_LENGTH); + } + + break; + } + case DUMP_RESPONSE: { + Byte part = this.serialBuffer[PART_BYTE]; + + if(part == 0) { + if(this.invalidateSync == true) { + break; + } + if(this.serialRead == PART_0_LENGTH) { + //Console.Write(now); + //Console.WriteLine(": Received state part 0"); + Array.Copy(this.serialBuffer, this.dump0, PART_0_LENGTH); + } + } else if(part == 1) { + if(this.invalidateSync == true) { + this.invalidateSync = false; + break; + } + if(this.serialRead == PART_1_LENGTH) { + //Console.Write(now); + //Console.WriteLine(": Received state part 1"); + Array.Copy(this.serialBuffer, this.dump1, PART_1_LENGTH); + } + } + + break; + } + case PING_RESPONSE: { + if(this.serialRead == PING_RESPONSE_LENGTH) { + //Console.Write(now); + //Console.WriteLine(": Received ping response"); + Array.Copy(this.serialBuffer, this.pingResponse, PING_RESPONSE_LENGTH); + } + + break; + } + case DIRECT_COMMAND: { + Byte count = this.serialBuffer[PARAM_COUNT_BYTE]; + //Console.Write(now); + //Console.WriteLine(": Received commands"); + for(Int32 i = 0; i < count; i++) { + Int32 offset = 4 * i; + Byte channel = this.serialBuffer[CHANNEL_BYTE + offset]; + Byte param = this.serialBuffer[PARAM_BYTE + offset]; + Byte valueHigh = this.serialBuffer[VALUE_HI_BYTE + offset]; + Byte valueLow = this.serialBuffer[VALUE_LOW_BYTE + offset]; + + if(channel == 0) { + this.PatchBuffer(valueLow, valueHigh, this.setupLocations[param - (param <= 11 ? 2 : 10)]); + } else if(channel <= 4) { + this.PatchBuffer(valueLow, valueHigh, this.inputLocations[channel - 1][param - 2]); + } else if(channel <= 10) { + this.PatchBuffer(valueLow, valueHigh, this.outputLocations[channel - 5][param - 2]); + } + } + + break; + } + } + } + } + + private void PatchBuffer(Byte low, Byte high, DataLocation l) { + if(l.Low.Part == 0) { + this.dump0[l.Low.Data] = low; + } else if(l.Low.Part == 1) { + this.dump1[l.Low.Data] = low; + } + + if(l.Middle.Data > 0) { + if(l.Middle.Part == 0) { + if((high & 1) == 0) { + this.dump0[l.Middle.Data] |= (Byte)(1u << l.Middle.Index); + } else { + this.dump0[l.Middle.Data] &= (Byte)~(1u << l.Middle.Index); + } + } else if(l.Middle.Part == 1) { + if((high & 1) == 0) { + this.dump1[l.Middle.Data] |= (Byte)(1u << l.Middle.Index); + } else { + this.dump1[l.Middle.Data] &= (Byte)~(1u << l.Middle.Index); + } + } + } + + if(l.High.Data > 0) { + Byte highByte = (Byte)(high >> 1); + if(l.High.Part == 0) { + this.dump0[l.High.Data] = highByte; + } else if(l.High.Part == 1) { + this.dump1[l.High.Data] = highByte; + } + } + } + + private readonly Byte[] vendorHeader = new Byte[5] { 0xF0, 0x00, 0x20, 0x32, 0x00 }; + + class Device { + public DateTime lastResponse = DateTime.Now; //DateTime? + public Byte[] response = new Byte[SEARCH_RESPONSE_LENGTH]; //SEARCH_RESPONSE_LENGTH + } + + class DataLocation { + public DataLocation(LowByte lowByte, MiddleBit middleBit, HighByte highByte) { + this.Low = lowByte; + this.Middle = middleBit; + this.High = highByte; + } + public LowByte Low { + get; private set; + } + public MiddleBit Middle { + get; private set; + } + public HighByte High { + get; private set; + } + }; + + class LowByte { + public LowByte(Int32 p, UInt16 b) { + this.Part = p; + this.Data = b; + } + public Int32 Part { + get; private set; + } + public UInt16 Data { + get; private set; + } + }; + + class MiddleBit { + public MiddleBit(Int32 p, UInt16 b, Int32 i) { + this.Part = p; + this.Data = b; + this.Index = i; + } + public Int32 Part { + get; private set; + } + public UInt16 Data { + get; private set; + } + public Int32 Index { + get; private set; + } + }; + + class HighByte { + public HighByte(Int32 p, UInt16 b) { + this.Part = p; + this.Data = b; + } + public Int32 Part { + get; private set; + } + public UInt16 Data { + get; private set; + } + }; + + private readonly DataLocation[] setupLocations = { + new DataLocation(new LowByte(0, 117), new MiddleBit(-1, 0, -1), new HighByte(-1, 0)), + new DataLocation(new LowByte(0, 117), new MiddleBit(-1, 0, -1), new HighByte(-1, 0)), + new DataLocation(new LowByte(0, 119), new MiddleBit(-1, 0, -1), new HighByte(-1, 0)), + new DataLocation(new LowByte(0, 121), new MiddleBit(-1, 0, -1), new HighByte(-1, 0)), + new DataLocation(new LowByte(0, 123), new MiddleBit(-1, 0, -1), new HighByte(-1, 0)), + new DataLocation(new LowByte(0, 126), new MiddleBit(-1, 0, -1), new HighByte(-1, 0)), + new DataLocation(new LowByte(0, 128), new MiddleBit(-1, 0, -1), new HighByte(-1, 0)), + new DataLocation(new LowByte(0, 130), new MiddleBit(-1, 0, -1), new HighByte(-1, 0)), + new DataLocation(new LowByte(0, 133), new MiddleBit(-1, 0, -1), new HighByte(-1, 0)), + new DataLocation(new LowByte(0, 135), new MiddleBit(-1, 0, -1), new HighByte(-1, 0)), + new DataLocation(new LowByte(0, 137), new MiddleBit(-1, 0, -1), new HighByte(-1, 0)), + new DataLocation(new LowByte(0, 55), new MiddleBit(-1, 0, -1), new HighByte(-1, 0)), + new DataLocation(new LowByte(0, 57), new MiddleBit(-1, 0, -1), new HighByte(-1, 0)), + new DataLocation(new LowByte(0, 139), new MiddleBit(0, 140, 6), new HighByte(0, 141)), + new DataLocation(new LowByte(0, 142), new MiddleBit(0, 148, 1), new HighByte(0, 143)), + new DataLocation(new LowByte(0, 144), new MiddleBit(0, 148, 3), new HighByte(0, 145)) + }; + + private readonly DataLocation[][] inputLocations = { + new DataLocation[] { + new DataLocation(new LowByte(0, 146), new MiddleBit(0, 148, 5), new HighByte(0, 147)), + new DataLocation(new LowByte(0, 149), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 151), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 153), new MiddleBit(0, 156, 4), new HighByte(0, 154)), + new DataLocation(new LowByte(0, 155), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 158), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 160), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 162), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 165), new MiddleBit(0, 172, 0), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 167), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 169), new MiddleBit(0, 172, 4), new HighByte(0, 170)), + new DataLocation(new LowByte(0, 171), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 174), new MiddleBit(0, 180, 1), new HighByte(0, 175)), + new DataLocation(new LowByte(0, 176), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 178), new MiddleBit(0, 180, 5), new HighByte(0, 179)), + new DataLocation(new LowByte(0, 181), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 183), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 185), new MiddleBit(0, 188, 4), new HighByte(0, 186)), + new DataLocation(new LowByte(0, 187), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 190), new MiddleBit(0, 196, 1), new HighByte(0, 191)), + new DataLocation(new LowByte(0, 192), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 194), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 197), new MiddleBit(0, 204, 0), new HighByte(0, 198)), + new DataLocation(new LowByte(0, 199), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 201), new MiddleBit(0, 204, 4), new HighByte(0, 202)), + new DataLocation(new LowByte(0, 203), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 206), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 208), new MiddleBit(0, 212, 3), new HighByte(0, 209)), + new DataLocation(new LowByte(0, 210), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 213), new MiddleBit(0, 220, 0), new HighByte(0, 214)), + new DataLocation(new LowByte(0, 215), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 217), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 219), new MiddleBit(0, 220, 6), new HighByte(0, 221)), + new DataLocation(new LowByte(0, 222), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 224), new MiddleBit(0, 228, 3), new HighByte(0, 225)), + new DataLocation(new LowByte(0, 226), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 229), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 231), new MiddleBit(0, 236, 2), new HighByte(0, 232)), + new DataLocation(new LowByte(0, 233), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 235), new MiddleBit(0, 236, 6), new HighByte(0, 237)), + new DataLocation(new LowByte(0, 238), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 240), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 242), new MiddleBit(0, 244, 5), new HighByte(0, 243)), + new DataLocation(new LowByte(0, 245), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 247), new MiddleBit(0, 252, 2), new HighByte(0, 248)), + new DataLocation(new LowByte(0, 249), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 251), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 254), new MiddleBit(0, 260, 1), new HighByte(0, 255)), + new DataLocation(new LowByte(0, 256), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 258), new MiddleBit(0, 260, 5), new HighByte(0, 259)), + new DataLocation(new LowByte(0, 261), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 263), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 265), new MiddleBit(0, 268, 4), new HighByte(0, 266)), + new DataLocation(new LowByte(0, 267), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 270), new MiddleBit(0, 276, 1), new HighByte(0, 271)), + new DataLocation(new LowByte(0, 272), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 274), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 277), new MiddleBit(0, 284, 0), new HighByte(0, 278)), + new DataLocation(new LowByte(0, 279), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 281), new MiddleBit(0, 284, 4), new HighByte(0, 282)), + new DataLocation(new LowByte(0, 283), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 286), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)) + }, + new DataLocation[] { + new DataLocation(new LowByte(0, 288), new MiddleBit(0, 292, 3), new HighByte(0, 289)), + new DataLocation(new LowByte(0, 290), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 293), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 295), new MiddleBit(0, 300, 2), new HighByte(0, 296)), + new DataLocation(new LowByte(0, 297), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 299), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 302), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 304), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 306), new MiddleBit(0, 308, 5), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 309), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 311), new MiddleBit(0, 316, 2), new HighByte(0, 312)), + new DataLocation(new LowByte(0, 313), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 315), new MiddleBit(0, 316, 6), new HighByte(0, 317)), + new DataLocation(new LowByte(0, 318), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 320), new MiddleBit(0, 324, 3), new HighByte(0, 321)), + new DataLocation(new LowByte(0, 322), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 325), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 327), new MiddleBit(0, 332, 2), new HighByte(0, 328)), + new DataLocation(new LowByte(0, 329), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 331), new MiddleBit(0, 332, 6), new HighByte(0, 333)), + new DataLocation(new LowByte(0, 334), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 336), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 338), new MiddleBit(0, 340, 5), new HighByte(0, 339)), + new DataLocation(new LowByte(0, 341), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 343), new MiddleBit(0, 348, 2), new HighByte(0, 344)), + new DataLocation(new LowByte(0, 345), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 347), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 350), new MiddleBit(0, 356, 1), new HighByte(0, 351)), + new DataLocation(new LowByte(0, 352), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 354), new MiddleBit(0, 356, 5), new HighByte(0, 355)), + new DataLocation(new LowByte(0, 357), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 359), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 361), new MiddleBit(0, 364, 4), new HighByte(0, 362)), + new DataLocation(new LowByte(0, 363), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 366), new MiddleBit(0, 372, 1), new HighByte(0, 367)), + new DataLocation(new LowByte(0, 368), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 370), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 373), new MiddleBit(0, 380, 0), new HighByte(0, 374)), + new DataLocation(new LowByte(0, 375), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 377), new MiddleBit(0, 380, 4), new HighByte(0, 378)), + new DataLocation(new LowByte(0, 379), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 382), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 384), new MiddleBit(0, 388, 3), new HighByte(0, 385)), + new DataLocation(new LowByte(0, 386), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 389), new MiddleBit(0, 396, 0), new HighByte(0, 390)), + new DataLocation(new LowByte(0, 391), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 393), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 395), new MiddleBit(0, 396, 6), new HighByte(0, 397)), + new DataLocation(new LowByte(0, 398), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 400), new MiddleBit(0, 404, 3), new HighByte(0, 401)), + new DataLocation(new LowByte(0, 402), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 405), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 407), new MiddleBit(0, 412, 2), new HighByte(0, 408)), + new DataLocation(new LowByte(0, 409), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 411), new MiddleBit(0, 412, 6), new HighByte(0, 413)), + new DataLocation(new LowByte(0, 414), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 416), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 418), new MiddleBit(0, 420, 5), new HighByte(0, 419)), + new DataLocation(new LowByte(0, 421), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 423), new MiddleBit(0, 428, 2), new HighByte(0, 424)), + new DataLocation(new LowByte(0, 425), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 427), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)) + }, + new DataLocation[] { + new DataLocation(new LowByte(0, 430), new MiddleBit(0, 436, 1), new HighByte(0, 431)), + new DataLocation(new LowByte(0, 432), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 434), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 437), new MiddleBit(0, 444, 0), new HighByte(0, 438)), + new DataLocation(new LowByte(0, 439), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 441), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 443), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 446), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 448), new MiddleBit(0, 452, 3), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 450), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 453), new MiddleBit(0, 460, 0), new HighByte(0, 454)), + new DataLocation(new LowByte(0, 455), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 457), new MiddleBit(0, 460, 4), new HighByte(0, 458)), + new DataLocation(new LowByte(0, 459), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 462), new MiddleBit(0, 468, 1), new HighByte(0, 463)), + new DataLocation(new LowByte(0, 464), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 466), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 469), new MiddleBit(0, 476, 0), new HighByte(0, 470)), + new DataLocation(new LowByte(0, 471), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 473), new MiddleBit(0, 476, 4), new HighByte(0, 474)), + new DataLocation(new LowByte(0, 475), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 478), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 480), new MiddleBit(0, 484, 3), new HighByte(0, 481)), + new DataLocation(new LowByte(0, 482), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 485), new MiddleBit(0, 492, 0), new HighByte(0, 486)), + new DataLocation(new LowByte(0, 487), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 489), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 491), new MiddleBit(0, 492, 6), new HighByte(0, 493)), + new DataLocation(new LowByte(0, 494), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 496), new MiddleBit(0, 500, 3), new HighByte(0, 497)), + new DataLocation(new LowByte(0, 498), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 501), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 503), new MiddleBit(0, 508, 2), new HighByte(0, 504)), + new DataLocation(new LowByte(0, 505), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 507), new MiddleBit(0, 508, 6), new HighByte(0, 509)), + new DataLocation(new LowByte(0, 510), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 512), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 514), new MiddleBit(0, 516, 5), new HighByte(0, 515)), + new DataLocation(new LowByte(0, 517), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 519), new MiddleBit(0, 524, 2), new HighByte(0, 520)), + new DataLocation(new LowByte(0, 521), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 523), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 526), new MiddleBit(0, 532, 1), new HighByte(0, 527)), + new DataLocation(new LowByte(0, 528), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 530), new MiddleBit(0, 532, 5), new HighByte(0, 531)), + new DataLocation(new LowByte(0, 533), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 535), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 537), new MiddleBit(0, 540, 4), new HighByte(0, 538)), + new DataLocation(new LowByte(0, 539), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 542), new MiddleBit(0, 548, 1), new HighByte(0, 543)), + new DataLocation(new LowByte(0, 544), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 546), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 549), new MiddleBit(0, 556, 0), new HighByte(0, 550)), + new DataLocation(new LowByte(0, 551), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 553), new MiddleBit(0, 556, 4), new HighByte(0, 554)), + new DataLocation(new LowByte(0, 555), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 558), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 560), new MiddleBit(0, 564, 3), new HighByte(0, 561)), + new DataLocation(new LowByte(0, 562), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 565), new MiddleBit(0, 572, 0), new HighByte(0, 566)), + new DataLocation(new LowByte(0, 567), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 569), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)) + }, + new DataLocation[] { + new DataLocation(new LowByte(0, 571), new MiddleBit(0, 572, 6), new HighByte(0, 573)), + new DataLocation(new LowByte(0, 574), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 576), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 578), new MiddleBit(0, 580, 5), new HighByte(0, 579)), + new DataLocation(new LowByte(0, 581), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 583), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 585), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 587), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 590), new MiddleBit(0, 596, 1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 592), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 594), new MiddleBit(0, 596, 5), new HighByte(0, 595)), + new DataLocation(new LowByte(0, 597), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 599), new MiddleBit(0, 604, 2), new HighByte(0, 600)), + new DataLocation(new LowByte(0, 601), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 603), new MiddleBit(0, 604, 6), new HighByte(0, 605)), + new DataLocation(new LowByte(0, 606), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 608), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 610), new MiddleBit(0, 612, 5), new HighByte(0, 611)), + new DataLocation(new LowByte(0, 613), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 615), new MiddleBit(0, 620, 2), new HighByte(0, 616)), + new DataLocation(new LowByte(0, 617), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 619), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 622), new MiddleBit(0, 628, 1), new HighByte(0, 623)), + new DataLocation(new LowByte(0, 624), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 626), new MiddleBit(0, 628, 5), new HighByte(0, 627)), + new DataLocation(new LowByte(0, 629), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 631), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 633), new MiddleBit(0, 636, 4), new HighByte(0, 634)), + new DataLocation(new LowByte(0, 635), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 638), new MiddleBit(0, 644, 1), new HighByte(0, 639)), + new DataLocation(new LowByte(0, 640), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 642), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 645), new MiddleBit(0, 652, 0), new HighByte(0, 646)), + new DataLocation(new LowByte(0, 647), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 649), new MiddleBit(0, 652, 4), new HighByte(0, 650)), + new DataLocation(new LowByte(0, 651), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 654), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 656), new MiddleBit(0, 660, 3), new HighByte(0, 657)), + new DataLocation(new LowByte(0, 658), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 661), new MiddleBit(0, 668, 0), new HighByte(0, 662)), + new DataLocation(new LowByte(0, 663), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 665), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 667), new MiddleBit(0, 668, 6), new HighByte(0, 669)), + new DataLocation(new LowByte(0, 670), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 672), new MiddleBit(0, 676, 3), new HighByte(0, 673)), + new DataLocation(new LowByte(0, 674), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 677), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 679), new MiddleBit(0, 684, 2), new HighByte(0, 680)), + new DataLocation(new LowByte(0, 681), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 683), new MiddleBit(0, 684, 6), new HighByte(0, 685)), + new DataLocation(new LowByte(0, 686), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 688), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 690), new MiddleBit(0, 692, 5), new HighByte(0, 691)), + new DataLocation(new LowByte(0, 693), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 695), new MiddleBit(0, 700, 2), new HighByte(0, 696)), + new DataLocation(new LowByte(0, 697), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 699), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 702), new MiddleBit(0, 708, 1), new HighByte(0, 703)), + new DataLocation(new LowByte(0, 704), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 706), new MiddleBit(0, 708, 5), new HighByte(0, 707)), + new DataLocation(new LowByte(0, 709), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 711), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)) + } + }; + + private readonly DataLocation[][] outputLocations = { + new DataLocation[] { + new DataLocation(new LowByte(0, 713), new MiddleBit(0, 716, 4), new HighByte(0, 714)), + new DataLocation(new LowByte(0, 715), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 718), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 720), new MiddleBit(0, 724, 3), new HighByte(0, 721)), + new DataLocation(new LowByte(0, 722), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 725), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 727), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 729), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 731), new MiddleBit(0, 732, 6), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 734), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 736), new MiddleBit(0, 740, 3), new HighByte(0, 737)), + new DataLocation(new LowByte(0, 738), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 741), new MiddleBit(0, 748, 0), new HighByte(0, 742)), + new DataLocation(new LowByte(0, 743), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 745), new MiddleBit(0, 748, 4), new HighByte(0, 746)), + new DataLocation(new LowByte(0, 747), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 750), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 752), new MiddleBit(0, 756, 3), new HighByte(0, 753)), + new DataLocation(new LowByte(0, 754), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 757), new MiddleBit(0, 764, 0), new HighByte(0, 758)), + new DataLocation(new LowByte(0, 759), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 761), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 763), new MiddleBit(0, 764, 6), new HighByte(0, 765)), + new DataLocation(new LowByte(0, 766), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 768), new MiddleBit(0, 772, 3), new HighByte(0, 769)), + new DataLocation(new LowByte(0, 770), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 773), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 775), new MiddleBit(0, 780, 2), new HighByte(0, 776)), + new DataLocation(new LowByte(0, 777), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 779), new MiddleBit(0, 780, 6), new HighByte(0, 781)), + new DataLocation(new LowByte(0, 782), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 784), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 786), new MiddleBit(0, 788, 5), new HighByte(0, 787)), + new DataLocation(new LowByte(0, 789), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 791), new MiddleBit(0, 796, 2), new HighByte(0, 792)), + new DataLocation(new LowByte(0, 793), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 795), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 798), new MiddleBit(0, 804, 1), new HighByte(0, 799)), + new DataLocation(new LowByte(0, 800), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 802), new MiddleBit(0, 804, 5), new HighByte(0, 803)), + new DataLocation(new LowByte(0, 805), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 807), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 809), new MiddleBit(0, 812, 4), new HighByte(0, 810)), + new DataLocation(new LowByte(0, 811), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 814), new MiddleBit(0, 820, 1), new HighByte(0, 815)), + new DataLocation(new LowByte(0, 816), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 818), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 821), new MiddleBit(0, 828, 0), new HighByte(0, 822)), + new DataLocation(new LowByte(0, 823), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 825), new MiddleBit(0, 828, 4), new HighByte(0, 826)), + new DataLocation(new LowByte(0, 827), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 830), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 832), new MiddleBit(0, 836, 3), new HighByte(0, 833)), + new DataLocation(new LowByte(0, 834), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 837), new MiddleBit(0, 844, 0), new HighByte(0, 838)), + new DataLocation(new LowByte(0, 839), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 841), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 843), new MiddleBit(0, 844, 6), new HighByte(0, 845)), + new DataLocation(new LowByte(0, 846), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 848), new MiddleBit(0, 852, 3), new HighByte(0, 849)), + new DataLocation(new LowByte(0, 850), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 853), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 855), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 857), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 859), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 862), new MiddleBit(0, 868, 1), new HighByte(0, 863)), + new DataLocation(new LowByte(0, 864), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 866), new MiddleBit(0, 868, 5), new HighByte(0, 867)), + new DataLocation(new LowByte(0, 869), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 871), new MiddleBit(0, 876, 2), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 873), new MiddleBit(0, 876, 4), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 875), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 878), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 880), new MiddleBit(0, 884, 3), new HighByte(0, 881)) + }, + new DataLocation[] { + new DataLocation(new LowByte(0, 882), new MiddleBit(0, 884, 5), new HighByte(0, 883)), + new DataLocation(new LowByte(0, 885), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 887), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 889), new MiddleBit(0, 892, 4), new HighByte(0, 890)), + new DataLocation(new LowByte(0, 891), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 894), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 896), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 898), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 901), new MiddleBit(0, 908, 0), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 903), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 905), new MiddleBit(0, 908, 4), new HighByte(0, 906)), + new DataLocation(new LowByte(0, 907), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 910), new MiddleBit(0, 916, 1), new HighByte(0, 911)), + new DataLocation(new LowByte(0, 912), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 914), new MiddleBit(0, 916, 5), new HighByte(0, 915)), + new DataLocation(new LowByte(0, 917), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 919), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 921), new MiddleBit(0, 924, 4), new HighByte(0, 922)), + new DataLocation(new LowByte(0, 923), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 926), new MiddleBit(0, 932, 1), new HighByte(0, 927)), + new DataLocation(new LowByte(0, 928), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 930), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 933), new MiddleBit(0, 940, 0), new HighByte(0, 934)), + new DataLocation(new LowByte(0, 935), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 937), new MiddleBit(0, 940, 4), new HighByte(0, 938)), + new DataLocation(new LowByte(0, 939), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 942), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 944), new MiddleBit(0, 948, 3), new HighByte(0, 945)), + new DataLocation(new LowByte(0, 946), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 949), new MiddleBit(0, 956, 0), new HighByte(0, 950)), + new DataLocation(new LowByte(0, 951), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 953), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 955), new MiddleBit(0, 956, 6), new HighByte(0, 957)), + new DataLocation(new LowByte(0, 958), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 960), new MiddleBit(0, 964, 3), new HighByte(0, 961)), + new DataLocation(new LowByte(0, 962), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 965), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 967), new MiddleBit(0, 972, 2), new HighByte(0, 968)), + new DataLocation(new LowByte(0, 969), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 971), new MiddleBit(0, 972, 6), new HighByte(0, 973)), + new DataLocation(new LowByte(0, 974), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 976), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 978), new MiddleBit(0, 980, 5), new HighByte(0, 979)), + new DataLocation(new LowByte(0, 981), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 983), new MiddleBit(0, 988, 2), new HighByte(0, 984)), + new DataLocation(new LowByte(0, 985), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 987), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 990), new MiddleBit(0, 996, 1), new HighByte(0, 991)), + new DataLocation(new LowByte(0, 992), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 994), new MiddleBit(0, 996, 5), new HighByte(0, 995)), + new DataLocation(new LowByte(0, 997), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 999), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 1001), new MiddleBit(0, 1004, 4), new HighByte(0, 1002)), + new DataLocation(new LowByte(0, 1003), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 1006), new MiddleBit(0, 1012, 1), new HighByte(0, 1007)), + new DataLocation(new LowByte(0, 1008), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(0, 1010), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 13), new MiddleBit(1, 20, 0), new HighByte(1, 14)), + new DataLocation(new LowByte(1, 15), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 17), new MiddleBit(1, 20, 4), new HighByte(1, 18)), + new DataLocation(new LowByte(1, 19), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 22), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 24), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 26), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 29), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 31), new MiddleBit(1, 36, 2), new HighByte(1, 32)), + new DataLocation(new LowByte(1, 33), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 35), new MiddleBit(1, 36, 6), new HighByte(1, 37)), + new DataLocation(new LowByte(1, 38), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 40), new MiddleBit(1, 44, 3), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 42), new MiddleBit(1, 44, 5), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 45), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 47), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 49), new MiddleBit(1, 52, 4), new HighByte(1, 50)) + }, + new DataLocation[] { + new DataLocation(new LowByte(1, 51), new MiddleBit(1, 52, 6), new HighByte(1, 53)), + new DataLocation(new LowByte(1, 54), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 56), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 58), new MiddleBit(1, 60, 5), new HighByte(1, 59)), + new DataLocation(new LowByte(1, 61), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 63), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 65), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 67), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 70), new MiddleBit(1, 76, 1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 72), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 74), new MiddleBit(1, 76, 5), new HighByte(1, 75)), + new DataLocation(new LowByte(1, 77), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 79), new MiddleBit(1, 84, 2), new HighByte(1, 80)), + new DataLocation(new LowByte(1, 81), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 83), new MiddleBit(1, 84, 6), new HighByte(1, 85)), + new DataLocation(new LowByte(1, 86), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 88), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 90), new MiddleBit(1, 92, 5), new HighByte(1, 91)), + new DataLocation(new LowByte(1, 93), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 95), new MiddleBit(1, 100, 2), new HighByte(1, 96)), + new DataLocation(new LowByte(1, 97), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 99), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 102), new MiddleBit(1, 108, 1), new HighByte(1, 103)), + new DataLocation(new LowByte(1, 104), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 106), new MiddleBit(1, 108, 5), new HighByte(1, 107)), + new DataLocation(new LowByte(1, 109), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 111), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 113), new MiddleBit(1, 116, 4), new HighByte(1, 114)), + new DataLocation(new LowByte(1, 115), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 118), new MiddleBit(1, 124, 1), new HighByte(1, 119)), + new DataLocation(new LowByte(1, 120), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 122), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 125), new MiddleBit(1, 132, 0), new HighByte(1, 126)), + new DataLocation(new LowByte(1, 127), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 129), new MiddleBit(1, 132, 4), new HighByte(1, 130)), + new DataLocation(new LowByte(1, 131), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 134), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 136), new MiddleBit(1, 140, 3), new HighByte(1, 137)), + new DataLocation(new LowByte(1, 138), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 141), new MiddleBit(1, 148, 0), new HighByte(1, 142)), + new DataLocation(new LowByte(1, 143), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 145), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 147), new MiddleBit(1, 148, 6), new HighByte(1, 149)), + new DataLocation(new LowByte(1, 150), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 152), new MiddleBit(1, 156, 3), new HighByte(1, 153)), + new DataLocation(new LowByte(1, 154), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 157), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 159), new MiddleBit(1, 164, 2), new HighByte(1, 160)), + new DataLocation(new LowByte(1, 161), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 163), new MiddleBit(1, 164, 6), new HighByte(1, 165)), + new DataLocation(new LowByte(1, 166), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 168), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 170), new MiddleBit(1, 172, 5), new HighByte(1, 171)), + new DataLocation(new LowByte(1, 173), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 175), new MiddleBit(1, 180, 2), new HighByte(1, 176)), + new DataLocation(new LowByte(1, 177), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 179), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 182), new MiddleBit(1, 188, 1), new HighByte(1, 183)), + new DataLocation(new LowByte(1, 184), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 186), new MiddleBit(1, 188, 5), new HighByte(1, 187)), + new DataLocation(new LowByte(1, 189), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 191), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 193), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 195), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 198), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 200), new MiddleBit(1, 204, 3), new HighByte(1, 201)), + new DataLocation(new LowByte(1, 202), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 205), new MiddleBit(1, 212, 0), new HighByte(1, 206)), + new DataLocation(new LowByte(1, 207), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 209), new MiddleBit(1, 212, 4), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 211), new MiddleBit(1, 212, 6), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 214), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 216), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 218), new MiddleBit(1, 220, 5), new HighByte(1, 219)) + }, + new DataLocation[] { + new DataLocation(new LowByte(1, 221), new MiddleBit(1, 228, 0), new HighByte(1, 222)), + new DataLocation(new LowByte(1, 223), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 225), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 227), new MiddleBit(1, 228, 6), new HighByte(1, 229)), + new DataLocation(new LowByte(1, 230), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 232), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 234), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 237), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 239), new MiddleBit(1, 244, 2), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 241), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 243), new MiddleBit(1, 244, 6), new HighByte(1, 245)), + new DataLocation(new LowByte(1, 246), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 248), new MiddleBit(1, 252, 3), new HighByte(1, 249)), + new DataLocation(new LowByte(1, 250), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 253), new MiddleBit(1, 260, 0), new HighByte(1, 254)), + new DataLocation(new LowByte(1, 255), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 257), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 259), new MiddleBit(1, 260, 6), new HighByte(1, 261)), + new DataLocation(new LowByte(1, 262), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 264), new MiddleBit(1, 268, 3), new HighByte(1, 265)), + new DataLocation(new LowByte(1, 266), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 269), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 271), new MiddleBit(1, 276, 2), new HighByte(1, 272)), + new DataLocation(new LowByte(1, 273), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 275), new MiddleBit(1, 276, 6), new HighByte(1, 277)), + new DataLocation(new LowByte(1, 278), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 280), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 282), new MiddleBit(1, 284, 5), new HighByte(1, 283)), + new DataLocation(new LowByte(1, 285), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 287), new MiddleBit(1, 292, 2), new HighByte(1, 288)), + new DataLocation(new LowByte(1, 289), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 291), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 294), new MiddleBit(1, 300, 1), new HighByte(1, 295)), + new DataLocation(new LowByte(1, 296), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 298), new MiddleBit(1, 300, 5), new HighByte(1, 299)), + new DataLocation(new LowByte(1, 301), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 303), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 305), new MiddleBit(1, 308, 4), new HighByte(1, 306)), + new DataLocation(new LowByte(1, 307), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 310), new MiddleBit(1, 316, 1), new HighByte(1, 311)), + new DataLocation(new LowByte(1, 312), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 314), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 317), new MiddleBit(1, 324, 0), new HighByte(1, 318)), + new DataLocation(new LowByte(1, 319), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 321), new MiddleBit(1, 324, 4), new HighByte(1, 322)), + new DataLocation(new LowByte(1, 323), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 326), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 328), new MiddleBit(1, 332, 3), new HighByte(1, 329)), + new DataLocation(new LowByte(1, 330), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 333), new MiddleBit(1, 340, 0), new HighByte(1, 334)), + new DataLocation(new LowByte(1, 335), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 337), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 339), new MiddleBit(1, 340, 6), new HighByte(1, 341)), + new DataLocation(new LowByte(1, 342), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 344), new MiddleBit(1, 348, 3), new HighByte(1, 345)), + new DataLocation(new LowByte(1, 346), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 349), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 351), new MiddleBit(1, 356, 2), new HighByte(1, 352)), + new DataLocation(new LowByte(1, 353), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 355), new MiddleBit(1, 356, 6), new HighByte(1, 357)), + new DataLocation(new LowByte(1, 358), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 360), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 362), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 365), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 367), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 369), new MiddleBit(1, 372, 4), new HighByte(1, 370)), + new DataLocation(new LowByte(1, 371), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 374), new MiddleBit(1, 380, 1), new HighByte(1, 375)), + new DataLocation(new LowByte(1, 376), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 378), new MiddleBit(1, 380, 5), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 381), new MiddleBit(1, 388, 0), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 383), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 385), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 387), new MiddleBit(1, 388, 6), new HighByte(1, 389)) + }, + new DataLocation[] { + new DataLocation(new LowByte(1, 390), new MiddleBit(1, 396, 1), new HighByte(1, 391)), + new DataLocation(new LowByte(1, 392), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 394), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 397), new MiddleBit(1, 404, 0), new HighByte(1, 398)), + new DataLocation(new LowByte(1, 399), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 401), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 403), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 406), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 408), new MiddleBit(1, 412, 3), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 410), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 413), new MiddleBit(1, 420, 0), new HighByte(1, 414)), + new DataLocation(new LowByte(1, 415), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 417), new MiddleBit(1, 420, 4), new HighByte(1, 418)), + new DataLocation(new LowByte(1, 419), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 422), new MiddleBit(1, 428, 1), new HighByte(1, 423)), + new DataLocation(new LowByte(1, 424), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 426), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 429), new MiddleBit(1, 436, 0), new HighByte(1, 430)), + new DataLocation(new LowByte(1, 431), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 433), new MiddleBit(1, 436, 4), new HighByte(1, 434)), + new DataLocation(new LowByte(1, 435), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 438), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 440), new MiddleBit(1, 444, 3), new HighByte(1, 441)), + new DataLocation(new LowByte(1, 442), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 445), new MiddleBit(1, 452, 0), new HighByte(1, 446)), + new DataLocation(new LowByte(1, 447), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 449), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 451), new MiddleBit(1, 452, 6), new HighByte(1, 453)), + new DataLocation(new LowByte(1, 454), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 456), new MiddleBit(1, 460, 3), new HighByte(1, 457)), + new DataLocation(new LowByte(1, 458), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 461), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 463), new MiddleBit(1, 468, 2), new HighByte(1, 464)), + new DataLocation(new LowByte(1, 465), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 467), new MiddleBit(1, 468, 6), new HighByte(1, 469)), + new DataLocation(new LowByte(1, 470), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 472), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 474), new MiddleBit(1, 476, 5), new HighByte(1, 475)), + new DataLocation(new LowByte(1, 477), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 479), new MiddleBit(1, 484, 2), new HighByte(1, 480)), + new DataLocation(new LowByte(1, 481), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 483), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 486), new MiddleBit(1, 492, 1), new HighByte(1, 487)), + new DataLocation(new LowByte(1, 488), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 490), new MiddleBit(1, 492, 5), new HighByte(1, 491)), + new DataLocation(new LowByte(1, 493), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 495), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 497), new MiddleBit(1, 500, 4), new HighByte(1, 498)), + new DataLocation(new LowByte(1, 499), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 502), new MiddleBit(1, 508, 1), new HighByte(1, 503)), + new DataLocation(new LowByte(1, 504), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 506), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 509), new MiddleBit(1, 516, 0), new HighByte(1, 510)), + new DataLocation(new LowByte(1, 511), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 513), new MiddleBit(1, 516, 4), new HighByte(1, 514)), + new DataLocation(new LowByte(1, 515), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 518), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 520), new MiddleBit(1, 524, 3), new HighByte(1, 521)), + new DataLocation(new LowByte(1, 522), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 525), new MiddleBit(1, 532, 0), new HighByte(1, 526)), + new DataLocation(new LowByte(1, 527), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 529), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 531), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 534), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 536), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 538), new MiddleBit(1, 540, 5), new HighByte(1, 539)), + new DataLocation(new LowByte(1, 541), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 543), new MiddleBit(1, 548, 2), new HighByte(1, 544)), + new DataLocation(new LowByte(1, 545), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 547), new MiddleBit(1, 548, 6), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 550), new MiddleBit(1, 556, 1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 552), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 554), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 557), new MiddleBit(1, 564, 0), new HighByte(1, 558)) + }, + new DataLocation[] { + new DataLocation(new LowByte(1, 559), new MiddleBit(1, 564, 2), new HighByte(1, 560)), + new DataLocation(new LowByte(1, 561), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 563), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 566), new MiddleBit(1, 572, 1), new HighByte(1, 567)), + new DataLocation(new LowByte(1, 568), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 570), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 573), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 575), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 577), new MiddleBit(1, 580, 4), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 579), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 582), new MiddleBit(1, 588, 1), new HighByte(1, 583)), + new DataLocation(new LowByte(1, 584), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 586), new MiddleBit(1, 588, 5), new HighByte(1, 587)), + new DataLocation(new LowByte(1, 589), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 591), new MiddleBit(1, 596, 2), new HighByte(1, 592)), + new DataLocation(new LowByte(1, 593), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 595), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 598), new MiddleBit(1, 604, 1), new HighByte(1, 599)), + new DataLocation(new LowByte(1, 600), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 602), new MiddleBit(1, 604, 5), new HighByte(1, 603)), + new DataLocation(new LowByte(1, 605), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 607), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 609), new MiddleBit(1, 612, 4), new HighByte(1, 610)), + new DataLocation(new LowByte(1, 611), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 614), new MiddleBit(1, 620, 1), new HighByte(1, 615)), + new DataLocation(new LowByte(1, 616), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 618), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 621), new MiddleBit(1, 628, 0), new HighByte(1, 622)), + new DataLocation(new LowByte(1, 623), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 625), new MiddleBit(1, 628, 4), new HighByte(1, 626)), + new DataLocation(new LowByte(1, 627), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 630), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 632), new MiddleBit(1, 636, 3), new HighByte(1, 633)), + new DataLocation(new LowByte(1, 634), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 637), new MiddleBit(1, 644, 0), new HighByte(1, 638)), + new DataLocation(new LowByte(1, 639), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 641), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 643), new MiddleBit(1, 644, 6), new HighByte(1, 645)), + new DataLocation(new LowByte(1, 646), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 648), new MiddleBit(1, 652, 3), new HighByte(1, 649)), + new DataLocation(new LowByte(1, 650), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 653), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 655), new MiddleBit(1, 660, 2), new HighByte(1, 656)), + new DataLocation(new LowByte(1, 657), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 659), new MiddleBit(1, 660, 6), new HighByte(1, 661)), + new DataLocation(new LowByte(1, 662), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 664), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 666), new MiddleBit(1, 668, 5), new HighByte(1, 667)), + new DataLocation(new LowByte(1, 669), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 671), new MiddleBit(1, 676, 2), new HighByte(1, 672)), + new DataLocation(new LowByte(1, 673), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 675), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 678), new MiddleBit(1, 684, 1), new HighByte(1, 679)), + new DataLocation(new LowByte(1, 680), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 682), new MiddleBit(1, 684, 5), new HighByte(1, 683)), + new DataLocation(new LowByte(1, 685), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 687), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 689), new MiddleBit(1, 692, 4), new HighByte(1, 690)), + new DataLocation(new LowByte(1, 691), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 694), new MiddleBit(1, 700, 1), new HighByte(1, 695)), + new DataLocation(new LowByte(1, 696), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 698), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 701), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 703), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 705), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 707), new MiddleBit(1, 708, 6), new HighByte(1, 709)), + new DataLocation(new LowByte(1, 710), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 712), new MiddleBit(1, 716, 3), new HighByte(1, 713)), + new DataLocation(new LowByte(1, 714), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 717), new MiddleBit(1, 724, 0), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 719), new MiddleBit(1, 724, 2), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 721), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 723), new MiddleBit( -1, 0, -1), new HighByte( -1, 0)), + new DataLocation(new LowByte(1, 726), new MiddleBit(1, 732, 1), new HighByte(1, 727)) + } + }; + } +}