Adjusting presentation of Memory and CPU windows
This commit is contained in:
parent
265aeed8cd
commit
b77f2a5ab1
2
makefile
2
makefile
|
@ -1,7 +1,7 @@
|
||||||
.PHONY: help
|
.PHONY: help
|
||||||
help:
|
help:
|
||||||
@echo
|
@echo
|
||||||
@echo "Virtual Boy Emulator - March 10, 2023"
|
@echo "Virtual Boy Emulator - March 11, 2023"
|
||||||
@echo
|
@echo
|
||||||
@echo "Target build environment is any Debian with the following packages:"
|
@echo "Target build environment is any Debian with the following packages:"
|
||||||
@echo " emscripten"
|
@echo " emscripten"
|
||||||
|
|
|
@ -640,6 +640,8 @@ class App extends Toolkit.App {
|
||||||
// The window is not visible
|
// The window is not visible
|
||||||
else {
|
else {
|
||||||
adjust = !wnd.shown;
|
adjust = !wnd.shown;
|
||||||
|
if (adjust && wnd.firstShow)
|
||||||
|
wnd.firstShow();
|
||||||
wnd.visible = true;
|
wnd.visible = true;
|
||||||
this.desktop.bringToFront(wnd);
|
this.desktop.bringToFront(wnd);
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,16 +9,16 @@
|
||||||
|
|
||||||
// Create and initialize a new simulation
|
// Create and initialize a new simulation
|
||||||
EMSCRIPTEN_KEEPALIVE VB* Create() {
|
EMSCRIPTEN_KEEPALIVE VB* Create() {
|
||||||
VB *vb = malloc(sizeof (VB));
|
VB *sim = malloc(sizeof (VB));
|
||||||
vbInit(vb);
|
vbInit(sim);
|
||||||
return vb;
|
return sim;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Delete all memory used by a simulation
|
// Delete all memory used by a simulation
|
||||||
EMSCRIPTEN_KEEPALIVE void Delete(VB *vb) {
|
EMSCRIPTEN_KEEPALIVE void Delete(VB *sim) {
|
||||||
free(vb->cart.ram);
|
free(sim->cart.ram);
|
||||||
free(vb->cart.rom);
|
free(sim->cart.rom);
|
||||||
free(vb);
|
free(sim);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Proxy for free()
|
// Proxy for free()
|
||||||
|
@ -42,26 +42,26 @@ EMSCRIPTEN_KEEPALIVE int PointerSize() {
|
||||||
|
|
||||||
// Execute until the following instruction
|
// Execute until the following instruction
|
||||||
static uint32_t RunNextAddress;
|
static uint32_t RunNextAddress;
|
||||||
static int RunNextFetch(VB *vb, int fetch, VBAccess *access) {
|
static int RunNextFetch(VB *sim, int fetch, VBAccess *access) {
|
||||||
return access->address == RunNextAddress;
|
return access->address == RunNextAddress;
|
||||||
}
|
}
|
||||||
static int RunNextExecute(VB *vb, VBInstruction *inst) {
|
static int RunNextExecute(VB *sim, VBInstruction *inst) {
|
||||||
RunNextAddress = inst->address + inst->size;
|
RunNextAddress = inst->address + inst->size;
|
||||||
vbSetCallback(vb, VB_ONEXECUTE, NULL);
|
vbSetCallback(sim, VB_ONEXECUTE, NULL);
|
||||||
vbSetCallback(vb, VB_ONFETCH, &RunNextFetch);
|
vbSetCallback(sim, VB_ONFETCH, &RunNextFetch);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
EMSCRIPTEN_KEEPALIVE void RunNext(VB **vbs, int count) {
|
EMSCRIPTEN_KEEPALIVE void RunNext(VB **sims, int count) {
|
||||||
uint32_t clocks = 20000000; // 1s
|
uint32_t clocks = 20000000; // 1s
|
||||||
vbSetCallback(vbs[0], VB_ONEXECUTE, &RunNextExecute);
|
vbSetCallback(sims[0], VB_ONEXECUTE, &RunNextExecute);
|
||||||
vbEmulateEx (vbs, count, &clocks);
|
vbEmulateEx (sims, count, &clocks);
|
||||||
vbSetCallback(vbs[0], VB_ONEXECUTE, NULL);
|
vbSetCallback(sims[0], VB_ONEXECUTE, NULL);
|
||||||
vbSetCallback(vbs[0], VB_ONFETCH , NULL);
|
vbSetCallback(sims[0], VB_ONFETCH , NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Execute the current instruction
|
// Execute the current instruction
|
||||||
static int SingleStepBreak;
|
static int SingleStepBreak;
|
||||||
static int SingleStepFetch(VB *vb, int fetch, VBAccess *access) {
|
static int SingleStepFetch(VB *sim, int fetch, VBAccess *access) {
|
||||||
if (fetch != 0)
|
if (fetch != 0)
|
||||||
return 0;
|
return 0;
|
||||||
if (SingleStepBreak == 1)
|
if (SingleStepBreak == 1)
|
||||||
|
@ -69,11 +69,11 @@ static int SingleStepFetch(VB *vb, int fetch, VBAccess *access) {
|
||||||
SingleStepBreak = 1;
|
SingleStepBreak = 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
EMSCRIPTEN_KEEPALIVE void SingleStep(VB **vbs, int count) {
|
EMSCRIPTEN_KEEPALIVE void SingleStep(VB **sims, int count) {
|
||||||
uint32_t clocks = 20000000; // 1s
|
uint32_t clocks = 20000000; // 1s
|
||||||
SingleStepBreak = vbs[0]->cpu.stage == 0 ? 0 : 1;
|
SingleStepBreak = sims[0]->cpu.stage == 0 ? 0 : 1;
|
||||||
vbSetCallback(vbs[0], VB_ONFETCH, &SingleStepFetch);
|
vbSetCallback(sims[0], VB_ONFETCH, &SingleStepFetch);
|
||||||
vbEmulateEx (vbs, count, &clocks);
|
vbEmulateEx (sims, count, &clocks);
|
||||||
vbSetCallback(vbs[0], VB_ONEXECUTE, NULL);
|
vbSetCallback(sims[0], VB_ONEXECUTE, NULL);
|
||||||
vbSetCallback(vbs[0], VB_ONFETCH , NULL);
|
vbSetCallback(sims[0], VB_ONFETCH , NULL);
|
||||||
}
|
}
|
||||||
|
|
|
@ -90,17 +90,10 @@ class CPU extends Toolkit.Window {
|
||||||
|
|
||||||
// Window visibility
|
// Window visibility
|
||||||
onVisibility(e) {
|
onVisibility(e) {
|
||||||
let firstShow = !this.shown && e.visible;
|
|
||||||
|
|
||||||
// Configure instance fields
|
// Configure instance fields
|
||||||
this.shown = this.shown || e.visible;
|
this.shown = this.shown || e.visible;
|
||||||
|
|
||||||
// Window visible for the first time
|
|
||||||
if (firstShow) {
|
|
||||||
this.disassembler.firstShow();
|
|
||||||
this.registers .firstShow();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Configure subscriptions
|
// Configure subscriptions
|
||||||
if (!e.visible) {
|
if (!e.visible) {
|
||||||
if (this.registers)
|
if (this.registers)
|
||||||
|
@ -114,6 +107,16 @@ class CPU extends Toolkit.Window {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////// Package Methods /////////////////////////////
|
||||||
|
|
||||||
|
// Window is being shown for the first time
|
||||||
|
firstShow() {
|
||||||
|
this.disassembler.firstShow();
|
||||||
|
this.registers .firstShow();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -166,16 +169,16 @@ class DisassemblerPane extends Toolkit.ScrollPane {
|
||||||
view.addEventListener("wheel" , e=>this.viewWheel (e));
|
view.addEventListener("wheel" , e=>this.viewWheel (e));
|
||||||
|
|
||||||
// Label for measuring text dimensions in the disassembler
|
// Label for measuring text dimensions in the disassembler
|
||||||
this.sizer = new Toolkit.Label(cpu.debug.app, {
|
this.pc = new Toolkit.Label(cpu.debug.app, {
|
||||||
class : "tk label mono",
|
class : "tk label mono pc",
|
||||||
visible : false,
|
visible : false,
|
||||||
visibility: true,
|
visibility: true,
|
||||||
style: {
|
style : {
|
||||||
position: "absolute"
|
position: "absolute"
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
this.sizer.setText("\u00a0", false); //
|
this.pc.setText("\u00a0", false); //
|
||||||
view.append(this.sizer);
|
view.append(this.pc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -233,16 +236,15 @@ class DisassemblerPane extends Toolkit.ScrollPane {
|
||||||
viewResize() {
|
viewResize() {
|
||||||
|
|
||||||
// Error checking
|
// Error checking
|
||||||
if (!this.sizer)
|
if (!this.pc)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Working variables
|
// Working variables
|
||||||
let tall = this.tall(false) + 1;
|
let tall = this.tall(false);
|
||||||
let grew = this.lines.length < tall;
|
let grew = this.lines.length < tall;
|
||||||
|
|
||||||
// Process all new lines
|
// Process all new lines
|
||||||
for (let y = this.lines.length; y < tall; y++) {
|
for (let y = this.lines.length; y < tall; y++) {
|
||||||
let first = y == 0 ? " first" : "";
|
|
||||||
let resizer = y != 0 ? null :
|
let resizer = y != 0 ? null :
|
||||||
new ResizeObserver(()=>this.colResize());
|
new ResizeObserver(()=>this.colResize());
|
||||||
|
|
||||||
|
@ -250,12 +252,11 @@ class DisassemblerPane extends Toolkit.ScrollPane {
|
||||||
lblAddress : document.createElement("div"),
|
lblAddress : document.createElement("div"),
|
||||||
lblBytes : [],
|
lblBytes : [],
|
||||||
lblMnemonic: document.createElement("div"),
|
lblMnemonic: document.createElement("div"),
|
||||||
lblOperands: document.createElement("div"),
|
lblOperands: document.createElement("div")
|
||||||
spacer : document.createElement("div")
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// Address label
|
// Address label
|
||||||
line.lblAddress.className = "addr" + first;
|
line.lblAddress.className = "addr";
|
||||||
if (y == 0)
|
if (y == 0)
|
||||||
resizer.observe(line.lblAddress);
|
resizer.observe(line.lblAddress);
|
||||||
this.view.append(line.lblAddress);
|
this.view.append(line.lblAddress);
|
||||||
|
@ -263,7 +264,7 @@ class DisassemblerPane extends Toolkit.ScrollPane {
|
||||||
// Byte labels
|
// Byte labels
|
||||||
for (let x = 0; x < 4; x++) {
|
for (let x = 0; x < 4; x++) {
|
||||||
let lbl = line.lblBytes[x] = document.createElement("div");
|
let lbl = line.lblBytes[x] = document.createElement("div");
|
||||||
lbl.className = "byte" + first + (x == 0 ? " b0" : "");
|
lbl.className = "byte" + (x == 0 ? " b0" : "");
|
||||||
if (y == 0) {
|
if (y == 0) {
|
||||||
lbl.style.minWidth = "0px";
|
lbl.style.minWidth = "0px";
|
||||||
resizer.observe(lbl);
|
resizer.observe(lbl);
|
||||||
|
@ -272,25 +273,20 @@ class DisassemblerPane extends Toolkit.ScrollPane {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Mnemonic label
|
// Mnemonic label
|
||||||
line.lblMnemonic.className = "inst" + first;
|
line.lblMnemonic.className = "inst";
|
||||||
if (y == 0)
|
if (y == 0)
|
||||||
resizer.observe(line.lblMnemonic);
|
resizer.observe(line.lblMnemonic);
|
||||||
this.view.append(line.lblMnemonic);
|
this.view.append(line.lblMnemonic);
|
||||||
|
|
||||||
// Operand label
|
// Operand label
|
||||||
line.lblOperands.className = "ops" + first;
|
line.lblOperands.className = "ops";
|
||||||
this.view.append(line.lblOperands);
|
this.view.append(line.lblOperands);
|
||||||
|
|
||||||
// Growing spacer
|
|
||||||
line.spacer.className = "spacer" + first;
|
|
||||||
this.view.append(line.spacer);
|
|
||||||
|
|
||||||
// All elements
|
// All elements
|
||||||
line.all = line.lblBytes.concat([
|
line.all = line.lblBytes.concat([
|
||||||
line.lblAddress,
|
line.lblAddress,
|
||||||
line.lblMnemonic,
|
line.lblMnemonic,
|
||||||
line.lblOperands,
|
line.lblOperands
|
||||||
line.spacer
|
|
||||||
]);
|
]);
|
||||||
|
|
||||||
this.lines.push(line);
|
this.lines.push(line);
|
||||||
|
@ -302,15 +298,15 @@ class DisassemblerPane extends Toolkit.ScrollPane {
|
||||||
line.lblAddress .remove();
|
line.lblAddress .remove();
|
||||||
line.lblMnemonic.remove();
|
line.lblMnemonic.remove();
|
||||||
line.lblOperands.remove();
|
line.lblOperands.remove();
|
||||||
line.spacer .remove();
|
|
||||||
for (let lbl of line.lblBytes)
|
for (let lbl of line.lblBytes)
|
||||||
lbl.remove();
|
lbl.remove();
|
||||||
this.lines.splice(tall, 1);
|
this.lines.splice(tall, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Configure scroll bar
|
// Configure elements
|
||||||
this.hscroll.unitIncrement =
|
let lineHeight = this.pc.element.getBoundingClientRect().height;
|
||||||
this.sizer.element.getBoundingClientRect().height;
|
this.hscroll.unitIncrement = lineHeight;
|
||||||
|
this.view.element.style.gridAutoRows = lineHeight + "px";
|
||||||
|
|
||||||
// Update components
|
// Update components
|
||||||
if (grew)
|
if (grew)
|
||||||
|
@ -330,7 +326,7 @@ class DisassemblerPane extends Toolkit.ScrollPane {
|
||||||
|
|
||||||
// Determine how many full lines were scrolled
|
// Determine how many full lines were scrolled
|
||||||
let scr = Debugger.linesScrolled(e,
|
let scr = Debugger.linesScrolled(e,
|
||||||
this.sizer.element.getBoundingClientRect().height,
|
this.pc.element.getBoundingClientRect().height,
|
||||||
this.tall(true),
|
this.tall(true),
|
||||||
this.delta
|
this.delta
|
||||||
);
|
);
|
||||||
|
@ -419,6 +415,7 @@ class DisassemblerPane extends Toolkit.ScrollPane {
|
||||||
// Component is being displayed for the first time
|
// Component is being displayed for the first time
|
||||||
firstShow() {
|
firstShow() {
|
||||||
this.viewLine = Math.floor(this.tall(true) / 3) + 10;
|
this.viewLine = Math.floor(this.tall(true) / 3) + 10;
|
||||||
|
this.viewResize();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Shrink all columns to fit the current view
|
// Shrink all columns to fit the current view
|
||||||
|
@ -503,11 +500,15 @@ class DisassemblerPane extends Toolkit.ScrollPane {
|
||||||
if (this.bytesColumn)
|
if (this.bytesColumn)
|
||||||
for (let x = 0; x<4 && this.columnWidths[x]!=0; x++, showBytes++);
|
for (let x = 0; x<4 && this.columnWidths[x]!=0; x++, showBytes++);
|
||||||
|
|
||||||
|
// Working variables
|
||||||
|
let foundPC = false;
|
||||||
|
let lineHeight = this.pc.element.getBoundingClientRect().height;
|
||||||
|
|
||||||
// Process all lines
|
// Process all lines
|
||||||
let index = 20 - this.viewLine;
|
let index = 20 - this.viewLine;
|
||||||
for (let y = 0; y < this.lines.length; y++, index++) {
|
for (let y = 0; y < this.lines.length; y++, index++) {
|
||||||
let line = this.lines[y];
|
let line = this.lines[y];
|
||||||
let method = "remove";
|
let isPC = false;
|
||||||
|
|
||||||
// There is no data for this line
|
// There is no data for this line
|
||||||
if (index < 0 || this.dasm == null || index >= this.dasm.length) {
|
if (index < 0 || this.dasm == null || index >= this.dasm.length) {
|
||||||
|
@ -529,17 +530,27 @@ class DisassemblerPane extends Toolkit.ScrollPane {
|
||||||
line.lblOperands.innerText = dasm.operands.join(", ");
|
line.lblOperands.innerText = dasm.operands.join(", ");
|
||||||
for (let x = 0; x < 4; x++)
|
for (let x = 0; x < 4; x++)
|
||||||
line.lblBytes[x].innerText = dasm.bytes[x] || "";
|
line.lblBytes[x].innerText = dasm.bytes[x] || "";
|
||||||
if (this.cpu.registers.pc == dasm.rawAddress)
|
isPC = this.cpu.registers.pc == dasm.rawAddress;
|
||||||
method = "add";
|
|
||||||
if (this.bytesColumn)
|
if (this.bytesColumn)
|
||||||
showBytes = Math.max(showBytes, dasm.bytes.length);
|
showBytes = Math.max(showBytes, dasm.bytes.length);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Configure whether PC is on this line
|
// Configure whether PC is on this line
|
||||||
|
if (isPC) {
|
||||||
|
foundPC = true;
|
||||||
|
this.pc.element.style.top = lineHeight * y + "px";
|
||||||
for (let elm of line.all)
|
for (let elm of line.all)
|
||||||
elm.classList[method]("pc");
|
elm.classList.add("is-pc");
|
||||||
|
} else {
|
||||||
|
for (let elm of line.all)
|
||||||
|
elm.classList.remove("is-pc");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Show or hide the PC background
|
||||||
|
this.pc.visible = foundPC;
|
||||||
|
|
||||||
// Configure which byte columns are visible
|
// Configure which byte columns are visible
|
||||||
for (let line of this.lines) {
|
for (let line of this.lines) {
|
||||||
for (let x = 0; x < 4; x++) {
|
for (let x = 0; x < 4; x++) {
|
||||||
|
@ -552,7 +563,7 @@ class DisassemblerPane extends Toolkit.ScrollPane {
|
||||||
|
|
||||||
// Configure layout
|
// Configure layout
|
||||||
this.view.element.style.gridTemplateColumns =
|
this.view.element.style.gridTemplateColumns =
|
||||||
"repeat(" + (showBytes + 3) + ", max-content) auto";
|
"repeat(" + (showBytes + 3) + ", max-content)";// auto";
|
||||||
}
|
}
|
||||||
|
|
||||||
// Stop receiving updates from the simulation
|
// Stop receiving updates from the simulation
|
||||||
|
@ -565,10 +576,11 @@ class DisassemblerPane extends Toolkit.ScrollPane {
|
||||||
///////////////////////////// Private Methods /////////////////////////////
|
///////////////////////////// Private Methods /////////////////////////////
|
||||||
|
|
||||||
// Measure the number of lines visible in the view
|
// Measure the number of lines visible in the view
|
||||||
tall(fully = null) {
|
tall(fully) {
|
||||||
return Math.max(1, Math[fully===null ? "abs" : fully?"floor":"ceil"](
|
return Math.max(1, Math[fully ? "floor" : "ceil"](
|
||||||
this.view .element.getBoundingClientRect().height /
|
(fully ? this.view : this).element
|
||||||
this.sizer.element.getBoundingClientRect().height
|
.getBoundingClientRect().height /
|
||||||
|
this.pc.element.getBoundingClientRect().height
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1412,6 +1424,7 @@ class RegisterPane extends Toolkit.SplitPane {
|
||||||
// Prepare the initial dimensions of the register lists
|
// Prepare the initial dimensions of the register lists
|
||||||
this .element.style.width = Math.ceil(bounds.width ) + "px";
|
this .element.style.width = Math.ceil(bounds.width ) + "px";
|
||||||
this.scrSystem.element.style.height = Math.ceil(bounds.height) + "px";
|
this.scrSystem.element.style.height = Math.ceil(bounds.height) + "px";
|
||||||
|
this.fetch();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update register lists
|
// Update register lists
|
||||||
|
|
|
@ -321,9 +321,10 @@ class Memory extends Toolkit.Window {
|
||||||
this.lines.splice(tall, 1);
|
this.lines.splice(tall, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Configure scroll bar
|
// Configure components
|
||||||
this.scrHex.hscroll.unitIncrement =
|
let lineHeight = this.sizer.element.getBoundingClientRect().height;
|
||||||
this.sizer.element.getBoundingClientRect().height;
|
this.scrHex.hscroll.unitIncrement = lineHeight;
|
||||||
|
this.hexEditor.element.style.gridAutoRows = lineHeight + "px";
|
||||||
|
|
||||||
// Update components
|
// Update components
|
||||||
if (grew)
|
if (grew)
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
.tk.window.cpu .disassembler div {
|
.tk.window.cpu .disassembler div {
|
||||||
cursor : default;
|
cursor : default;
|
||||||
line-height: calc(1em + 2px);
|
line-height: calc(1em + 2px);
|
||||||
|
isolation : isolate;
|
||||||
user-select: none;
|
user-select: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -34,67 +35,35 @@
|
||||||
margin-left: 2px;
|
margin-left: 2px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tk.window.cpu .disassembler .spacer {
|
|
||||||
margin-right: 2px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.tk.window.cpu .disassembler .byte {
|
.tk.window.cpu .disassembler .byte {
|
||||||
margin-left: 0.5em;
|
margin-left: 0.5em;
|
||||||
text-align : center;
|
text-align : center;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.tk.window.cpu .disassembler .ops {
|
||||||
|
margin-right: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
.tk.window.cpu .disassembler .byte.b0,
|
.tk.window.cpu .disassembler .byte.b0,
|
||||||
.tk.window.cpu .disassembler .inst,
|
.tk.window.cpu .disassembler .inst,
|
||||||
.tk.window.cpu .disassembler .ops {
|
.tk.window.cpu .disassembler .ops {
|
||||||
margin-left: 1em;
|
margin-left: 1em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
.tk.window.cpu .disassembler .pc {
|
.tk.window.cpu .disassembler .pc {
|
||||||
background: var(--tk-selected-blur);
|
background: var(--tk-selected-blur);
|
||||||
box-shadow: 0 1px 0 var(--tk-selected-blur),
|
left : 1px;
|
||||||
0 -1px 0 var(--tk-selected-blur);
|
right : 1px;
|
||||||
color : var(--tk-selected-blur-text);
|
|
||||||
}
|
}
|
||||||
.tk.window.cpu .disassembler:focus-within .pc {
|
.tk.window.cpu .disassembler:focus-within .pc {
|
||||||
background: var(--tk-selected);
|
background: var(--tk-selected);
|
||||||
box-shadow: 0 1px 0 var(--tk-selected),
|
|
||||||
0 -1px 0 var(--tk-selected);
|
|
||||||
color : var(--tk-selected-text);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.tk.window.cpu .disassembler .pc.addr {
|
.tk.window.cpu .disassembler .is-pc {
|
||||||
box-shadow: 0 0 0 1px var(--tk-selected-blur);
|
color: var(--tk-selected-blur-text);
|
||||||
}
|
}
|
||||||
.tk.window.cpu .disassembler:focus-within .pc.addr {
|
.tk.window.cpu .disassembler:focus-within .is-pc {
|
||||||
box-shadow: 0 0 0 1px var(--tk-selected);
|
color: var(--tk-selected-text);
|
||||||
}
|
|
||||||
|
|
||||||
.tk.window.cpu .disassembler .pc:is(.byte) {
|
|
||||||
box-shadow: 0 0 0 1px var(--tk-selected-blur),
|
|
||||||
calc(-0.5em + 1px) 0 0 1px var(--tk-selected-blur);
|
|
||||||
}
|
|
||||||
.tk.window.cpu .disassembler:focus-within .pc:is(.byte) {
|
|
||||||
box-shadow: 0 0 0 1px var(--tk-selected),
|
|
||||||
calc(-0.5em + 1px) 0 0 1px var(--tk-selected);
|
|
||||||
}
|
|
||||||
|
|
||||||
.tk.window.cpu .disassembler .pc:is(.byte.b0, .inst, .ops) {
|
|
||||||
box-shadow: 0 0 0 1px var(--tk-selected-blur),
|
|
||||||
calc(-1em + 1px) 0 0 1px var(--tk-selected-blur);
|
|
||||||
}
|
|
||||||
.tk.window.cpu .disassembler:focus-within .pc:is(.byte.b0, .inst, .ops) {
|
|
||||||
box-shadow: 0 0 0 1px var(--tk-selected),
|
|
||||||
calc(-1em + 1px) 0 0 1px var(--tk-selected);
|
|
||||||
}
|
|
||||||
|
|
||||||
.tk.window.cpu .disassembler .spacer.pc {
|
|
||||||
box-shadow: 1px 1px 0 var(--tk-selected-blur),
|
|
||||||
1px -1px 0 var(--tk-selected-blur);
|
|
||||||
}
|
|
||||||
.tk.window.cpu .disassembler:focus-within .spacer.pc {
|
|
||||||
box-shadow: 1px 1px 0 var(--tk-selected),
|
|
||||||
1px -1px 0 var(--tk-selected);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.tk.window.cpu .registers {
|
.tk.window.cpu .registers {
|
||||||
|
|
Loading…
Reference in New Issue