152 lines
4.1 KiB
JavaScript
152 lines
4.1 KiB
JavaScript
///////////////////////////////////////////////////////////////////////////////
|
|
// Sim //
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
// One simulated Virtual Boy
|
|
class Sim {
|
|
|
|
///////////////////////// Initialization Methods //////////////////////////
|
|
|
|
constructor(core, sim, index) {
|
|
this.core = core;
|
|
this.index = index;
|
|
this.sim = sim;
|
|
}
|
|
|
|
|
|
|
|
///////////////////////////// Public Methods //////////////////////////////
|
|
|
|
// Locate CPU instructions
|
|
disassemble(target, row, rows, scroll, options = {}) {
|
|
return this.core.send({
|
|
command : "disassemble",
|
|
row : row,
|
|
rows : rows,
|
|
scroll : scroll,
|
|
sim : this.sim,
|
|
subscribe: options.subscribe,
|
|
target : target
|
|
});
|
|
}
|
|
|
|
// Retrieve all CPU program registers
|
|
getProgramRegisters(options = {}) {
|
|
return this.core.send({
|
|
command : "getProgramRegisters",
|
|
sim : this.sim,
|
|
subscribe: options.subscribe
|
|
});
|
|
}
|
|
|
|
// Retrieve the value of a system register
|
|
getSystemRegister(id, options = {}) {
|
|
return this.core.send({
|
|
command : "getSystemRegister",
|
|
id : id,
|
|
sim : this.sim,
|
|
subscribe: options.subscribe
|
|
});
|
|
}
|
|
|
|
// Retrieve all CPU system registers (including PC)
|
|
getSystemRegisters(options = {}) {
|
|
return this.core.send({
|
|
command : "getSystemRegisters",
|
|
sim : this.sim,
|
|
subscribe: options.subscribe
|
|
});
|
|
}
|
|
|
|
// Read multiple bytes from the bus
|
|
read(address, length, options = {}) {
|
|
return this.core.send({
|
|
address : address,
|
|
command : "read",
|
|
debug : !("debug" in options) || !!options.debug,
|
|
length : length,
|
|
sim : this.sim,
|
|
subscribe: options.subscribe
|
|
});
|
|
}
|
|
|
|
// Specify a new value for PC
|
|
setProgramCounter(value, options = {}) {
|
|
return this.core.send({
|
|
command: "setProgramCounter",
|
|
refresh: !!options.refresh,
|
|
sim : this.sim,
|
|
value : value
|
|
});
|
|
}
|
|
|
|
// Specify a new value for a program register
|
|
setProgramRegister(id, value, options = {}) {
|
|
return this.core.send({
|
|
command: "setProgramRegister",
|
|
id : id,
|
|
refresh: !!options.refresh,
|
|
sim : this.sim,
|
|
value : value
|
|
});
|
|
}
|
|
|
|
// Specify the current ROM buffer
|
|
setROM(rom, options = {}) {
|
|
return this.core.send({
|
|
command: "setROM",
|
|
rom : rom,
|
|
refresh: !!options.refresh,
|
|
sim : this.sim
|
|
}, [ rom.buffer ]);
|
|
}
|
|
|
|
// Specify a new value for a system register
|
|
setSystemRegister(id, value, options = {}) {
|
|
return this.core.send({
|
|
command: "setSystemRegister",
|
|
id : id,
|
|
refresh: !!options.refresh,
|
|
sim : this.sim,
|
|
value : value
|
|
});
|
|
}
|
|
|
|
// Ubsubscribe from frame data
|
|
unsubscribe(key) {
|
|
return this.core.unsubscribe(key, this.sim);
|
|
}
|
|
|
|
// Write multiple bytes to the bus
|
|
write(address, bytes, options = {}) {
|
|
return this.core.send({
|
|
address : address,
|
|
command : "write",
|
|
bytes : bytes,
|
|
debug : !("debug" in options) || !!options.debug,
|
|
refresh : !!options.refresh,
|
|
sim : this.sim,
|
|
subscribe: options.subscribe
|
|
},
|
|
bytes instanceof ArrayBuffer ? [ bytes ] :
|
|
bytes.buffer instanceof ArrayBuffer ? [ bytes.buffer ] :
|
|
undefined
|
|
);
|
|
}
|
|
|
|
|
|
|
|
///////////////////////////// Package Methods /////////////////////////////
|
|
|
|
// The simulation has been destroyed
|
|
destroy() {
|
|
let sim = this.sim;
|
|
this.core = null;
|
|
this.sim = 0;
|
|
return sim;
|
|
}
|
|
|
|
}
|
|
|
|
export { Sim };
|