aboutsummaryrefslogtreecommitdiff
path: root/benchmark/convert-instructions.ts
blob: 7e8e3fdcc6a6dd0846adac01762224ad17e899d5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import * as fs from 'fs';
import * as prettier from 'prettier';

const input = fs.readFileSync('src/instruction.ts', { encoding: 'utf-8' });
let fnBody = '';
let openingBrace = false;
let currentInstruction = '';
let pattern = '';
let output = `
import { ICPU } from '../src/cpu';
import { u16 } from '../src/types';

function isTwoWordInstruction(opcode: u16) {
  return (
    /* LDS */
    (opcode & 0xfe0f) === 0x9000 ||
    /* STS */
    (opcode & 0xfe0f) === 0x9200 ||
    /* CALL */
    (opcode & 0xfe0e) === 0x940e ||
    /* JMP */
    (opcode & 0xfe0e) === 0x940c
  );
}
`;
for (const line of input.split('\n')) {
  if (line.startsWith('  /* ')) {
    currentInstruction = line
      .trim()
      .split(',')[0]
      .split(' ')[1];
    fnBody = '';
    openingBrace = false;
    pattern = line.split(',')[1].split('*')[0];
    console.log(currentInstruction);
    currentInstruction = currentInstruction.replace(/[\(\)]/g, '');
  }
  if (line.startsWith('  }')) {
    output += `
      export function inst${currentInstruction}(cpu: ICPU, opcode: number) {
        /*${pattern}*/
        ${fnBody}
        cpu.cycles++;
        if (++cpu.pc >= cpu.progMem.length) {
          cpu.pc = 0;
        }
      }
    `;
    currentInstruction = '';
  } else if (currentInstruction && openingBrace) {
    fnBody += line;
  } else if (currentInstruction && !openingBrace) {
    openingBrace = line.includes('{');
  }
}

const formattedOutput = prettier.format(output, { singleQuote: true, parser: 'babel' });

fs.writeFileSync('benchmark/instruction-fn.ts', formattedOutput, {
  encoding: 'utf-8'
});