From a47e21cf3f5c2968eb2afd0ae9cd1453d0011ed8 Mon Sep 17 00:00:00 2001 From: Uri Shaked Date: Tue, 19 Nov 2019 14:35:39 +0200 Subject: feat: implement some AVR instructions + tests --- src/cpu.ts | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 src/cpu.ts (limited to 'src/cpu.ts') diff --git a/src/cpu.ts b/src/cpu.ts new file mode 100644 index 0000000..a6e0ab6 --- /dev/null +++ b/src/cpu.ts @@ -0,0 +1,43 @@ +import { u16, u8 } from './types'; + +export interface ICPU { + readonly data: Uint8Array; + readonly dataView: DataView; + readonly progMem: Uint16Array; + readonly progBytes: Uint8Array; + pc: u16; + cycles: number; + + readData(addr: u16): u8; + writeData(addr: u16, value: u8): void; +} + +export type ICPUMemoryHook = (value: u8, oldValue: u8, addr: u16) => void; +export interface ICPUMemoryHooks { + [key: number]: ICPUMemoryHook; +} + +export class CPU implements ICPU { + readonly data = new Uint8Array(16384); + readonly data16 = new Uint16Array(this.data.buffer); + readonly dataView = new DataView(this.data.buffer); + readonly progBytes = new Uint8Array(this.progMem.buffer); + readonly writeHooks: ICPUMemoryHooks = []; + + pc = 0; + cycles = 0; + + constructor(public progMem: Uint16Array) {} + + readData(addr: number) { + return this.data[addr]; + } + + writeData(addr: number, value: number) { + const hook = this.writeHooks[addr]; + if (hook) { + hook(value, this.data[addr], addr); + } + this.data[addr] = value; + } +} -- cgit v1.2.3