diff options
| author | sanine-a <sanine.not@pm.me> | 2023-05-22 17:24:43 -0500 | 
|---|---|---|
| committer | sanine-a <sanine.not@pm.me> | 2023-05-22 17:24:43 -0500 | 
| commit | d6e89d16d332954dde3fc4c5ee7549af7c8bb556 (patch) | |
| tree | 46ae395bda119c5e59ae40140226c55205bca772 /src/vm/core.js | |
| parent | 9fa301a7cf8e8b5883521d1a966ee7b65ecf925e (diff) | |
begin writing vm
Diffstat (limited to 'src/vm/core.js')
| -rw-r--r-- | src/vm/core.js | 51 | 
1 files changed, 51 insertions, 0 deletions
diff --git a/src/vm/core.js b/src/vm/core.js new file mode 100644 index 0000000..292ceb0 --- /dev/null +++ b/src/vm/core.js @@ -0,0 +1,51 @@ +'use strict'; + +const { Op, AddrMode} = require('./enum.js'); + + +class Core { +	constructor(size) { +		this.data = new Array(size); + +		// initialize core to all DAT 0, 0 +		for (let i=0; i<size; i++) { +			this.data[i] = { +				opcode: Op.DAT, +				a: { value: 0, mode: AddrMode.Direct }, +				b: { value: 0, mode: AddrMode.Direct }, +			}; +		} +	} + + +	normalize(pc, value) { +		return (pc + value) % this.data.length; +	} + + +	getLocation(pc, address) { +		switch(address.mode) { +			case AddrMode.Immediate: +				throw "Cannot get location from immediate-mode address"; +			case AddrMode.Direct: +				return this.normalize(pc, address.value); +			case AddrMode.Indirect: { +				let loc = this.normalize(pc, address.value); +				let b = this.data[loc]; +				return this.normalize(loc, b); +			} +			case AddrMode.Predecrement: { +				let loc = this.normalize(pc, address.value); +				this.data[loc].b -= 1; +				let b = this.data[loc].b; +				return this.normalize(loc, b); +			} +			default: +				throw `Invalid addressing mode "${address.mode}"`; +		} +	} + +	getValue(pc, address) { +		return this.data[this.getLocation(pc, address)]; +	} +}  | 
