diff options
Diffstat (limited to '')
| -rw-r--r-- | benchmark/convert-instructions.ts | 6 | ||||
| -rw-r--r-- | benchmark/index.ts | 4 | ||||
| -rw-r--r-- | demo/src/cpu-performance.ts | 4 | ||||
| -rw-r--r-- | src/cpu/cpu.ts | 43 | ||||
| -rw-r--r-- | src/cpu/instruction.ts | 4 | ||||
| -rw-r--r-- | src/cpu/interrupt.ts | 4 | ||||
| -rw-r--r-- | src/index.ts | 2 |
7 files changed, 26 insertions, 41 deletions
diff --git a/benchmark/convert-instructions.ts b/benchmark/convert-instructions.ts index edde3cc..6ae0c24 100644 --- a/benchmark/convert-instructions.ts +++ b/benchmark/convert-instructions.ts @@ -8,7 +8,7 @@ let fnBody = ''; let currentInstruction = ''; let pattern = ''; let output = ` -import { ICPU } from '../src/cpu/cpu'; +import { CPU } from '../src/cpu/cpu'; function isTwoWordInstruction(opcode: number) { return ( @@ -36,7 +36,7 @@ for (const line of input.split('\n')) { patternToFn.push([pattern.trim(), fnName]); } else if (line.startsWith(' }')) { output += ` - export function ${fnName}(cpu: ICPU, opcode: number) { + export function ${fnName}(cpu: CPU, opcode: number) { /*${pattern}*/ ${fnBody} cpu.cycles++; @@ -62,7 +62,7 @@ for (const [fnPattern, fn] of patternToFn) { output += ']'; output += `\n -export function executeInstruction(idx: number, cpu: ICPU, opcode: number) { +export function executeInstruction(idx: number, cpu: CPU, opcode: number) { switch (idx) { ${executeInstructionCases} default: instNOP(cpu, opcode); diff --git a/benchmark/index.ts b/benchmark/index.ts index e290352..a1ee7e7 100644 --- a/benchmark/index.ts +++ b/benchmark/index.ts @@ -1,4 +1,4 @@ -import { CPU, ICPU } from '../src/cpu/cpu'; +import { CPU } from '../src/cpu/cpu'; import { avrInstruction } from '../src/cpu/instruction'; import { createBenchmark } from './benchmark'; import { permutations } from './permutations'; @@ -21,7 +21,7 @@ function avrInstructionUintArray(cpu: CPU) { } /* Approach 2: use instMap */ -const instructionMap: { [key: number]: (cpu: ICPU, opcode: number) => void } = {}; +const instructionMap: { [key: number]: (cpu: CPU, opcode: number) => void } = {}; for (const { pattern, fn } of instructions) { for (const opcode of permutations(pattern.replace(/ /g, '').substr(0, 16))) { if (!instructionMap[opcode]) { diff --git a/demo/src/cpu-performance.ts b/demo/src/cpu-performance.ts index f61d038..a4afc73 100644 --- a/demo/src/cpu-performance.ts +++ b/demo/src/cpu-performance.ts @@ -1,4 +1,4 @@ -import { ICPU } from 'avr8js'; +import { CPU } from 'avr8js'; export class CPUPerformance { private prevTime = 0; @@ -6,7 +6,7 @@ export class CPUPerformance { private samples = new Float32Array(64); private sampleIndex = 0; - constructor(private cpu: ICPU, private MHZ: number) {} + constructor(private cpu: CPU, private MHZ: number) {} reset() { this.prevTime = 0; diff --git a/src/cpu/cpu.ts b/src/cpu/cpu.ts index 7a518b8..2675d1d 100644 --- a/src/cpu/cpu.ts +++ b/src/cpu/cpu.ts @@ -11,33 +11,6 @@ import { avrInterrupt } from './interrupt'; const registerSpace = 0x100; -// eslint-disable-next-line @typescript-eslint/interface-name-prefix -export interface ICPU { - readonly data: Uint8Array; - readonly dataView: DataView; - readonly progMem: Uint16Array; - readonly progBytes: Uint8Array; - - /** - * Whether the program counter (PC) can address 22 bits (the default is 16) - */ - readonly pc22Bits: boolean; - - /** - * Program counter - */ - pc: u32; - - /** - * Clock cycle counter - */ - cycles: number; - - readData(addr: u16): u8; - writeData(addr: u16, value: u8, mask?: u8): void; - onWatchdogReset(): void; -} - export type CPUMemoryHook = (value: u8, oldValue: u8, addr: u16, mask: u8) => boolean | void; export interface CPUMemoryHooks { [key: number]: CPUMemoryHook; @@ -66,7 +39,7 @@ interface AVRClockEventEntry { next: AVRClockEventEntry | null; } -export class CPU implements ICPU { +export class CPU { readonly data: Uint8Array = new Uint8Array(this.sramBytes + registerSpace); readonly data16 = new Uint16Array(this.data.buffer); readonly dataView = new DataView(this.data.buffer); @@ -76,6 +49,10 @@ export class CPU implements ICPU { private readonly pendingInterrupts: AVRInterruptConfig[] = []; private nextClockEvent: AVRClockEventEntry | null = null; private readonly clockEventPool: AVRClockEventEntry[] = []; // helps avoid garbage collection + + /** + * Whether the program counter (PC) can address 22 bits (the default is 16) + */ readonly pc22Bits = this.progBytes.length > 0x20000; readonly gpioPorts = new Set<AVRIOPort>(); @@ -89,8 +66,16 @@ export class CPU implements ICPU { /* empty by default */ }; + /** + * Program counter + */ pc: u32 = 0; - cycles: u32 = 0; + + /** + * Clock cycle counter + */ + cycles = 0; + nextInterrupt: i16 = -1; constructor(public progMem: Uint16Array, private sramBytes = 8192) { diff --git a/src/cpu/instruction.ts b/src/cpu/instruction.ts index 9937ec9..e2bed5d 100644 --- a/src/cpu/instruction.ts +++ b/src/cpu/instruction.ts @@ -10,7 +10,7 @@ * Copyright (C) 2019, 2020 Uri Shaked */ -import { ICPU } from './cpu'; +import { CPU } from './cpu'; import { u16 } from '../types'; function isTwoWordInstruction(opcode: u16) { @@ -26,7 +26,7 @@ function isTwoWordInstruction(opcode: u16) { ); } -export function avrInstruction(cpu: ICPU) { +export function avrInstruction(cpu: CPU) { const opcode = cpu.progMem[cpu.pc]; if ((opcode & 0xfc00) === 0x1c00) { diff --git a/src/cpu/interrupt.ts b/src/cpu/interrupt.ts index 1bfa035..2e4ceb9 100644 --- a/src/cpu/interrupt.ts +++ b/src/cpu/interrupt.ts @@ -6,9 +6,9 @@ * Copyright (C) 2019, Uri Shaked */ -import { ICPU } from './cpu'; +import { CPU } from './cpu'; -export function avrInterrupt(cpu: ICPU, addr: number) { +export function avrInterrupt(cpu: CPU, addr: number) { const sp = cpu.dataView.getUint16(93, true); cpu.data[sp] = cpu.pc & 0xff; cpu.data[sp - 1] = (cpu.pc >> 8) & 0xff; diff --git a/src/index.ts b/src/index.ts index 15cc3fa..c1089aa 100644 --- a/src/index.ts +++ b/src/index.ts @@ -4,7 +4,7 @@ * Copyright (C) 2019, 2020, Uri Shaked */ -export { CPU, ICPU, CPUMemoryHook, CPUMemoryHooks } from './cpu/cpu'; +export { CPU, CPUMemoryHook, CPUMemoryHooks } from './cpu/cpu'; export { avrInstruction } from './cpu/instruction'; export { avrInterrupt } from './cpu/interrupt'; export { |
