diff options
| author | lironh | 2020-03-21 09:52:53 +0200 |
|---|---|---|
| committer | lironh | 2020-03-22 21:08:30 +0200 |
| commit | 8934a7566a038a74464d3d8df9d04fd875e5b1d7 (patch) | |
| tree | e131c263938081e6c89f39f141f3f20f6da8f851 /src/cpu/cpu.ts | |
| parent | Merge pull request #19 from gfeun/main-execute-loop-optimization (diff) | |
| download | avr8js-8934a7566a038a74464d3d8df9d04fd875e5b1d7.tar.gz avr8js-8934a7566a038a74464d3d8df9d04fd875e5b1d7.tar.bz2 avr8js-8934a7566a038a74464d3d8df9d04fd875e5b1d7.zip | |
refactor: added peripherals and cpu feature folders
Diffstat (limited to 'src/cpu/cpu.ts')
| -rw-r--r-- | src/cpu/cpu.ts | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/src/cpu/cpu.ts b/src/cpu/cpu.ts new file mode 100644 index 0000000..93f79d0 --- /dev/null +++ b/src/cpu/cpu.ts @@ -0,0 +1,78 @@ +/** + * AVR 8 CPU data structures + * Part of AVR8js + * + * Copyright (C) 2019, Uri Shaked + */ + +import { u16, u8 } from '../types'; + +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; + pc: u16; + cycles: number; + + readData(addr: u16): u8; + writeData(addr: u16, value: u8): void; +} + +export type CPUMemoryHook = (value: u8, oldValue: u8, addr: u16) => boolean | void; +export interface CPUMemoryHooks { + [key: number]: CPUMemoryHook; +} + +export class CPU implements ICPU { + readonly data: Uint8Array = new Uint8Array(this.sramBytes + registerSpace); + readonly data16 = new Uint16Array(this.data.buffer); + readonly dataView = new DataView(this.data.buffer); + readonly progBytes = new Uint8Array(this.progMem.buffer); + readonly writeHooks: CPUMemoryHooks = []; + + pc = 0; + cycles = 0; + + constructor(public progMem: Uint16Array, private sramBytes = 8192) { + this.reset(); + } + + reset() { + this.data.fill(0); + this.SP = this.data.length - 1; + } + + readData(addr: number) { + return this.data[addr]; + } + + writeData(addr: number, value: number) { + const hook = this.writeHooks[addr]; + if (hook) { + if (hook(value, this.data[addr], addr)) { + return; + } + } + this.data[addr] = value; + } + + get SP() { + return this.dataView.getUint16(93, true); + } + + set SP(value: number) { + this.dataView.setUint16(93, value, true); + } + + get SREG() { + return this.data[95]; + } + + get interruptsEnabled() { + return this.SREG & 0x80 ? true : false; + } +} |
