private bool CheckMap(int t, byte[] allBytes, SymbolCollection newSymbols, List<CodeBlock> newCodeBlocks)
{
bool retval = false;
bool _dontGenMaps = false;
List<MapSelector> mapSelectors = new List<MapSelector>();
if (t < allBytes.Length - 0x100)
{
if (CheckAxisCount(t, allBytes, out mapSelectors) > 3)
{
// check for selectors as well, and count them in the process
Console.WriteLine("Offset " + t.ToString("X8") + " has more than 3 consecutive axis");
/*foreach (MapSelector ms in mapSelectors)
{
Console.WriteLine("selector: " + ms.StartAddress.ToString("X8") + " " + ms.MapLength.ToString() + " " + ms.NumRepeats.ToString());
}*/
_dontGenMaps = true;
}
int xaxisid = (Convert.ToInt32(allBytes[t + 1]) * 256) + Convert.ToInt32(allBytes[t]);
if (isAxisID(xaxisid))
{
int xaxislen = (Convert.ToInt32(allBytes[t + 3]) * 256) + Convert.ToInt32(allBytes[t + 2]);
// Console.WriteLine("Valid XID: " + xaxisid.ToString("X4") + " @" + t.ToString("X8") + " len: " + xaxislen.ToString("X2"));
if (isValidLength(xaxislen, xaxisid))
{
//Console.WriteLine("Valid XID: " + xaxisid.ToString("X4") + " @" + t.ToString("X8") + " len: " + xaxislen.ToString("X2"));
// misschien is er nog een as
int yaxisid = (Convert.ToInt32(allBytes[t + 5 + (xaxislen * 2)]) * 256) + Convert.ToInt32(allBytes[t + 4 + (xaxislen * 2)]);
int yaxislen = (Convert.ToInt32(allBytes[t + 7 + (xaxislen * 2)]) * 256) + Convert.ToInt32(allBytes[t + 6 + (xaxislen * 2)]);
if (isAxisID(yaxisid) && isValidLength(yaxislen, yaxisid))
{
// 3d map
int zaxisid = (Convert.ToInt32(allBytes[t + 9 + (xaxislen * 2) + (yaxislen * 2)]) * 256) + Convert.ToInt32(allBytes[t + 8 + (xaxislen * 2) + (yaxislen * 2)]);
//Console.WriteLine("Valid YID: " + yaxisid.ToString("X4") + " @" + t.ToString("X8") + " len: " + yaxislen.ToString("X2"));
//Console.WriteLine(t.ToString("X8") + " XID: " + xaxisid.ToString("X4") + " XLEN: " + xaxislen.ToString("X2") + " YID: " + yaxisid.ToString("X4") + " YLEN: " + yaxislen.ToString("X2"));
SymbolHelper newSymbol = new SymbolHelper();
newSymbol.X_axis_length = xaxislen;
newSymbol.Y_axis_length = yaxislen;
newSymbol.X_axis_ID = xaxisid;
newSymbol.Y_axis_ID = yaxisid;
newSymbol.X_axis_address = t + 4;
newSymbol.Y_axis_address = t + 8 + (xaxislen * 2);
newSymbol.Length = xaxislen * yaxislen * 2;
newSymbol.Flash_start_address = t + 8 + (xaxislen * 2) + (yaxislen * 2);
if (isAxisID(zaxisid))
{
int zaxislen = (Convert.ToInt32(allBytes[t + 11 + (xaxislen * 2) + (yaxislen * 2)]) * 256) + Convert.ToInt32(allBytes[t + 10 + (xaxislen * 2) + (yaxislen * 2)]);
int zaxisaddress = t + 12 + (xaxislen * 2) + (yaxislen * 2);
if (isValidLength(zaxislen, zaxisid))
{
// newSymbol.Flash_start_address += 0x10; // dan altijd 16 erbij
int len2skip = (4 + zaxislen * 2);
if (len2skip < 16) len2skip = 16; // at least 16 bytes
newSymbol.Flash_start_address += len2skip;
if (!_dontGenMaps)
{
// this has something to do with repeating several times with the same axis set
Console.WriteLine("Added " + len2skip.ToString() + " because of z axis " + newSymbol.Flash_start_address.ToString("X8"));
/*if (zaxislen <= 10)
{
for (int genMap = 0; genMap < zaxislen; genMap++)
{
SymbolHelper shGen = new SymbolHelper();
shGen.X_axis_length = newSymbol.X_axis_length;
shGen.Y_axis_length = newSymbol.Y_axis_length;
shGen.X_axis_ID = newSymbol.X_axis_ID;
shGen.Y_axis_ID = newSymbol.Y_axis_ID;
shGen.X_axis_address = newSymbol.X_axis_address;
shGen.Y_axis_address = newSymbol.Y_axis_address;
shGen.Length = newSymbol.Length;
shGen.Category = "Generated";
long address = newSymbol.Flash_start_address + newSymbol.Length * (genMap + 1);
shGen.Flash_start_address = address;
shGen.Varname = "Generated " + shGen.Flash_start_address.ToString("X8");
AddToSymbolCollection(newSymbols, shGen, newCodeBlocks);
}
}*/
}
else
{
int maxisid = (Convert.ToInt32(allBytes[t + 13 + (xaxislen * 2) + (yaxislen * 2) + (zaxislen * 2)]) * 256) + Convert.ToInt32(allBytes[t + 12 + (xaxislen * 2) + (yaxislen * 2) + zaxislen * 2]);
int maxislen = (Convert.ToInt32(allBytes[t + 15 + (xaxislen * 2) + (yaxislen * 2) + (zaxislen * 2)]) * 256) + Convert.ToInt32(allBytes[t + 14 + (xaxislen * 2) + (yaxislen * 2) + zaxislen * 2]);
//maxislen *= 2;
int maxisaddress = t + 16 + (xaxislen * 2) + (yaxislen * 2);
if (isAxisID(maxisid))
{
newSymbol.Flash_start_address += (maxislen * 2) + 4;
}
// special situation, handle selectors
Console.WriteLine("Map start address = " + newSymbol.Flash_start_address.ToString("X8"));
long lastFlashAddress = newSymbol.Flash_start_address;
foreach (MapSelector ms in mapSelectors)
{
// check the memory size between the start of the map and the
// start of the map selector
long memsize = ms.StartAddress - lastFlashAddress;
memsize /= 2; // in words
if (ms.NumRepeats > 0)
{
int mapsize = Convert.ToInt32(memsize) / ms.NumRepeats;
//Console.WriteLine("selector: " + ms.StartAddress.ToString("X8") + " " + ms.MapLength.ToString() + " " + ms.NumRepeats.ToString());
//Console.WriteLine("memsize = " + memsize.ToString() + " mapsize " + mapsize.ToString());
//Console.WriteLine("starting at address: " + lastFlashAddress.ToString("X8"));
if ((xaxislen * yaxislen) == mapsize)
{
// first axis set
for (int i = 0; i < ms.NumRepeats; i++)
{
SymbolHelper shGen2 = new SymbolHelper();
shGen2.MapSelector = ms;
shGen2.X_axis_length = newSymbol.X_axis_length;
shGen2.Y_axis_length = newSymbol.Y_axis_length;
shGen2.X_axis_ID = newSymbol.X_axis_ID;
shGen2.Y_axis_ID = newSymbol.Y_axis_ID;
shGen2.X_axis_address = newSymbol.X_axis_address;
shGen2.Y_axis_address = newSymbol.Y_axis_address;
shGen2.Length = mapsize * 2;
//shGen2.Category = "Generated";
long address = lastFlashAddress;
shGen2.Flash_start_address = address;
//shGen2.Correction = 0.023437; // TEST
//shGen2.Varname = "Generated* " + shGen2.Flash_start_address.ToString("X8") + " " + ms.StartAddress.ToString("X8") + " " + ms.NumRepeats.ToString() + " " + i.ToString();
shGen2.Varname = "3D " + shGen2.Flash_start_address.ToString("X8") + " " + shGen2.X_axis_ID.ToString("X4") + " " + shGen2.Y_axis_ID.ToString("X4");
//if (i < ms.NumRepeats - 1)
{
AddToSymbolCollection(newSymbols, shGen2, newCodeBlocks);
}
lastFlashAddress = address + mapsize * 2;
// Console.WriteLine("Set last address to " + lastFlashAddress.ToString("X8"));
}
lastFlashAddress += ms.NumRepeats * 4 + 4;
}
else if ((zaxislen * maxislen) == mapsize)
{
// second axis set
for (int i = 0; i < ms.NumRepeats; i++)
{
SymbolHelper shGen2 = new SymbolHelper();
shGen2.MapSelector = ms;
shGen2.X_axis_length = maxislen;
shGen2.Y_axis_length = zaxislen;
shGen2.X_axis_ID = maxisid;
shGen2.Y_axis_ID = zaxisid;
shGen2.X_axis_address = maxisaddress;
shGen2.Y_axis_address = zaxisaddress;
shGen2.Length = mapsize * 2;
//shGen2.Category = "Generated";
long address = lastFlashAddress;
shGen2.Flash_start_address = address;
//shGen2.Varname = "Generated** " + shGen2.Flash_start_address.ToString("X8");
shGen2.Varname = "3D " + shGen2.Flash_start_address.ToString("X8") + " " + shGen2.X_axis_ID.ToString("X4") + " " + shGen2.Y_axis_ID.ToString("X4");
//if (i < ms.NumRepeats - 1)
{
AddToSymbolCollection(newSymbols, shGen2, newCodeBlocks);
}
lastFlashAddress = address + mapsize * 2;
//Console.WriteLine("Set last address 2 to " + lastFlashAddress.ToString("X8"));
}
lastFlashAddress += ms.NumRepeats * 4 + 4;
}
}
//if(ms.NumRepeats
}
}
}
}
newSymbol.Varname = "3D " + newSymbol.Flash_start_address.ToString("X8") + " " + xaxisid.ToString("X4") + " " + yaxisid.ToString("X4");
retval = AddToSymbolCollection(newSymbols, newSymbol, newCodeBlocks);
t += (xaxislen * 2) + (yaxislen * 2) + newSymbol.Length;
}
else
{
/*bool skipped = false;
if (xaxislen == 0x19)
{
//Console.WriteLine("Address " + t.ToString("X8"));
if (allBytes[t - 31] == 0xC2 && allBytes[t - 30] == 0x02 && allBytes[t - 29] == 0x00 && allBytes[t - 23] == 0xEC && allBytes[t - 22] == 0x02 && allBytes[t - 21] == 0x00)
{
// probably launch control map
SymbolHelper newSymbol = new SymbolHelper();
newSymbol.X_axis_length = 14;
newSymbol.Y_axis_length = 25;
newSymbol.X_axis_address = t - 28;
newSymbol.X_axis_ID = 0xFFFF;
newSymbol.Y_axis_ID = xaxisid;
//newSymbol.X_axis_address = t - 28;// t + 4;
newSymbol.Y_axis_address = t + 4;// t + 8 + (xaxislen * 2);
newSymbol.Length = newSymbol.X_axis_length * newSymbol.Y_axis_length * 2;
newSymbol.Flash_start_address = t + 4 + (newSymbol.Y_axis_length * 2);
newSymbol.Varname = "3D " + newSymbol.Flash_start_address.ToString("X8") + " " + newSymbol.X_axis_ID.ToString("X4") + " " + newSymbol.Y_axis_ID.ToString("X4");
retval = AddToSymbolCollection(newSymbols, newSymbol, newCodeBlocks);
t += (newSymbol.X_axis_length * 2) + (newSymbol.Y_axis_length * 2) + newSymbol.Length;
skipped = true;
}
}
if (!skipped)*/
{
//if (yaxisid != 0) <GS-20120820> switched off
{
if (yaxisid > 0x9000 && yaxisid < 0xF000 && yaxislen <= 32) Console.WriteLine("Unknown map id: " + yaxisid.ToString("X4") + " len " + yaxislen.ToString("X4") + " at address " + t.ToString("X8"));
SymbolHelper newSymbol = new SymbolHelper();
newSymbol.X_axis_length = xaxislen;
newSymbol.X_axis_ID = xaxisid;
newSymbol.X_axis_address = t + 4;
newSymbol.Length = xaxislen * 2;
newSymbol.Flash_start_address = t + 4 + (xaxislen * 2);
newSymbol.Varname = "2D " + newSymbol.Flash_start_address.ToString("X8") + " " + xaxisid.ToString("X4");
//newSymbols.Add(newSymbol);
newSymbol.CodeBlock = DetermineCodeBlockByByAddress(newSymbol.Flash_start_address, newCodeBlocks);
retval = AddToSymbolCollection(newSymbols, newSymbol, newCodeBlocks);
t += (xaxislen * 2);
// Console.WriteLine("t set to " + t.ToString("X8"));
}
}
// 2d map
}
// Console.WriteLine("t set to " + t.ToString("X8"));
}
}
}
return retval;
}