107 lines
2.9 KiB
JavaScript
107 lines
2.9 KiB
JavaScript
import { Disassembler } from /**/"./Disassembler.js";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// CPU //
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
// CPU register editor and disassembler
|
|
class CPU extends Toolkit.SplitPane {
|
|
|
|
///////////////////////// Initialization Methods //////////////////////////
|
|
|
|
constructor(app, sim) {
|
|
super(app, {
|
|
className: "tk tk-splitpane tk-cpu",
|
|
edge : Toolkit.SplitPane.RIGHT,
|
|
style : {
|
|
position: "relative"
|
|
}
|
|
});
|
|
|
|
this.app = app;
|
|
this.sim = sim;
|
|
this.initDasm();
|
|
|
|
this.metrics = new Toolkit.Component(this.app, {
|
|
className: "tk tk-mono",
|
|
tagName : "div",
|
|
style : {
|
|
position : "absolute",
|
|
visibility: "hidden"
|
|
}
|
|
});
|
|
let text = "";
|
|
for (let x = 0; x < 16; x++) {
|
|
if (x) text += "\n";
|
|
let digit = x.toString(16);
|
|
text += digit + "\n" + digit.toUpperCase();
|
|
}
|
|
this.metrics.element.innerText = text;
|
|
this.splitter.append(this.metrics.element);
|
|
|
|
this.setView(1, this.regs = new Toolkit.SplitPane(app, {
|
|
className: "tk tk-splitpane",
|
|
edge : Toolkit.SplitPane.TOP
|
|
}));
|
|
|
|
this.regs.setView(0, this.sysregs = new RegisterList(this, true ));
|
|
this.regs.setView(1, this.proregs = new RegisterList(this, false));
|
|
|
|
// Adjust split panes to the initial size of the System Registers pane
|
|
let resize;
|
|
let preshow = e=>this.onPreshow(resize);
|
|
resize = new ResizeObserver(preshow);
|
|
resize.observe(this.sysregs.viewport);
|
|
resize.observe(this.metrics.element);
|
|
|
|
this.metrics.addEventListener("resize", e=>this.metricsResize());
|
|
}
|
|
|
|
initDasm() {
|
|
this.dasm = new Disassembler(this.app, this.sim);
|
|
}
|
|
|
|
|
|
|
|
///////////////////////////// Event Handlers //////////////////////////////
|
|
|
|
|
|
|
|
// Resize handler prior to first visibility
|
|
onPreshow(resize) {
|
|
this.metricsResize();
|
|
|
|
// Once the list of registers is visible, stop listening
|
|
if (this.isVisible()) {
|
|
resize.disconnect();
|
|
this.sysregs.view.element.style.display = "grid";
|
|
return;
|
|
}
|
|
|
|
// Update the split panes
|
|
let sys = this.sysregs.view.element;
|
|
let pro = this.proregs.view.element;
|
|
this.setValue(
|
|
Math.max(sys.scrollWidth, pro.scrollWidth) +
|
|
this.sysregs.vertical.getBounds().width
|
|
);
|
|
this.regs.setValue(
|
|
this.sysregs[PSW].expansion.getBounds().bottom -
|
|
sys.getBoundingClientRect().top
|
|
);
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
export { CPU };
|