public AAssembler(ASymbolHandler symbolHandler) { SymbolHandler = symbolHandler; Is64Bit = ANative.IsProcessId64Bit(System.Diagnostics.Process.GetCurrentProcess().Id) == 1; OpCodes = AOpCodes.GetOpCodes(); Parameter1 = 0; Parameter2 = 0; Parameter3 = 0; OpCodeNr = 0; AssemblerIndex = new AIndexArray(LETTER_COUNT); var lastEntry = 0; AIndex lastIndex = null; for (var i = 0; i < AssemblerIndex.Length; i++) { AssemblerIndex[i].StartEntry = -1; AssemblerIndex[i].NextEntry = -1; AssemblerIndex[i].SubIndex = null; for (var j = lastEntry; j < OpCodeCount; j++) { if (OpCodes[j].Mnemonic[0] == 'A' + i) { // found the first entry with this as first character if (lastIndex != null) { lastIndex.NextEntry = j; } lastIndex = AssemblerIndex[i]; AssemblerIndex[i].StartEntry = j; AssemblerIndex[i].SubIndex = null; // default initialization lastEntry = j; break; } if (OpCodes[j].Mnemonic[0] > 'A' + i) { break; // passed it } } } if (AssemblerIndex.Last.StartEntry != -1) { AssemblerIndex.Last.NextEntry = OpCodeCount; } // fill in the subIndexes for (var i = 0; i < AssemblerIndex.Length; i++) { if (AssemblerIndex[i].StartEntry == -1) { continue; } // initialize subIndex AssemblerIndex[i].SubIndex = new AIndexArray(LETTER_COUNT); for (var j = 0; j < AssemblerIndex.Length; j++) { AssemblerIndex[i].SubIndex[j].StartEntry = -1; AssemblerIndex[i].SubIndex[j].NextEntry = -1; AssemblerIndex[i].SubIndex[j].SubIndex = null; } lastIndex = null; if (AssemblerIndex[i].NextEntry == -1) // last one in the list didn't get a assignment { AssemblerIndex[i].NextEntry = OpCodeCount + 1; } for (var j = 0; j < AssemblerIndex.Length; j++) { for (var k = AssemblerIndex[i].StartEntry; k < AssemblerIndex[i].NextEntry - 1; k++) { if (OpCodes[k].Mnemonic[1] == 'A' + j) { if (lastIndex != null) { lastIndex.NextEntry = k; } lastIndex = AssemblerIndex[i].SubIndex[j]; AssemblerIndex[i].SubIndex[j].StartEntry = k; break; } } } } Assembler = new ASingleLineAssembler(this); }
public AIndex() { StartEntry = 0; SubIndex = null; NextEntry = 0; }