function processRecords(records) {
const segments = [];
let extendedLinearAddress = 0;
let executionStartAddress = null;
for (const record of records) {
switch (record.type) {
case "extended_linear_address":
extendedLinearAddress = record.data;
break;
case "start_linear_address":
executionStartAddress = record.data;
break;
case "data":
const fullAddress = (extendedLinearAddress << 16) + record.addr;
segments.push({
startAddress: fullAddress,
data: record.data
});
break;
case "eof":
break;
default:
throw new Error(`Unknown record type: ${record.type}`);
}
}
segments.sort((a, b) => a.startAddress - b.startAddress);
const mergedSegments = [];
let currentSegment = null;
for (const segment of segments) {
if (
currentSegment &&
currentSegment.startAddress + currentSegment.data.length ===
segment.startAddress
) {
const newData = new Uint8Array(
currentSegment.data.length + segment.data.length
);
newData.set(currentSegment.data);
newData.set(segment.data, currentSegment.data.length);
currentSegment.data = newData;
} else {
currentSegment = {
startAddress: segment.startAddress,
data: segment.data
};
mergedSegments.push(currentSegment);
}
}
return {
segments: mergedSegments,
executionStartAddress
};
}