blob: 6188c02c308892a1c7d11d27a15d24d0af8ed78a [file] [log] [blame] [raw]
import * as utils from '../utils';
import {AsmParser} from './asm-parser';
export class AsmParserBeebAsm extends AsmParser {
constructor(compilerProps) {
super(compilerProps);
this.labelDef = /^(\.\w+)/i;
this.asmOpcodeRe = /^\s*(?<address>[\dA-F]+)\s*(?<opcodes>([\dA-F]{2} ?)+)\s*(?<disasm>.*)/;
}
processAsm(asm, filters) {
const startTime = process.hrtime.bigint();
const asmLines = [];
const labelDefinitions = {};
let startingLineCount = 0;
utils.eachLine(asm, line => {
startingLineCount++;
const labelMatch = line.match(this.labelDef);
if (labelMatch) {
asmLines.push({
text: line,
});
labelDefinitions[labelMatch[1]] = asmLines.length;
return;
}
const addressAndInstructionMatch = line.match(this.asmOpcodeRe);
if (addressAndInstructionMatch) {
const opcodes = (addressAndInstructionMatch.groups.opcodes || '').split(' ').filter(x => !!x);
const address = parseInt(addressAndInstructionMatch.groups.address, 16);
asmLines.push({
address: address,
opcodes: opcodes,
text: ' ' + addressAndInstructionMatch.groups.disasm,
});
}
});
const endTime = process.hrtime.bigint();
return {
asm: asmLines,
labelDefinitions: labelDefinitions,
parsingTime: ((endTime - startTime) / BigInt(1000000)).toString(),
filteredCount: startingLineCount - asm.length,
};
}
}