mirror of
https://github.com/sehugg/8bitworkshop.git
synced 2024-06-15 21:29:28 +00:00
inspect variables by selecting
This commit is contained in:
parent
49593cc38d
commit
8581fcabd6
|
@ -44,6 +44,10 @@
|
||||||
color:#ffcccc;
|
color:#ffcccc;
|
||||||
background-color:#660000;
|
background-color:#660000;
|
||||||
}
|
}
|
||||||
|
.tooltipinfoline {
|
||||||
|
color:#ccccff;
|
||||||
|
background-color:#000066;
|
||||||
|
}
|
||||||
#controls_top {
|
#controls_top {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
padding: 0.5em;
|
padding: 0.5em;
|
||||||
|
|
|
@ -52,6 +52,8 @@ TODO:
|
||||||
- navigator.getGamepads
|
- navigator.getGamepads
|
||||||
- VCS library
|
- VCS library
|
||||||
- better VCS single stepping, maybe also listings
|
- better VCS single stepping, maybe also listings
|
||||||
|
- New File (include file)
|
||||||
|
- VCS skips step on lsr/lsr after run to line
|
||||||
|
|
||||||
FYI: Image links for the books on http://8bitworkshop.com/ are broken
|
FYI: Image links for the books on http://8bitworkshop.com/ are broken
|
||||||
On the website the additional grey spacing next to the program line numbers is not dynamically resized when the web browser window size is changed. Intentional?
|
On the website the additional grey spacing next to the program line numbers is not dynamically resized when the web browser window size is changed. Intentional?
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
. ./scripts/env.sh
|
|
||||||
rsync --stats -rilv -e "ssh -p 2222" ./blog/ $RSYNC_PATH/blog/
|
|
||||||
#rsync --stats -rilv -e "ssh -p 2222" ./scripts/ pzp@104.131.86.119:./backups
|
|
|
@ -46,7 +46,7 @@ export interface Platform {
|
||||||
loadControlsState?(state : EmuControlsState) : void;
|
loadControlsState?(state : EmuControlsState) : void;
|
||||||
saveControlsState?() : EmuControlsState;
|
saveControlsState?() : EmuControlsState;
|
||||||
|
|
||||||
inspect?(ident:string) : void;
|
inspect?(ident:string) : string;
|
||||||
disassemble?(addr:number, readfn:(addr:number)=>number) : DisasmLine;
|
disassemble?(addr:number, readfn:(addr:number)=>number) : DisasmLine;
|
||||||
readAddress?(addr:number) : number;
|
readAddress?(addr:number) : number;
|
||||||
setFrameRate?(fps:number) : void;
|
setFrameRate?(fps:number) : void;
|
||||||
|
@ -97,22 +97,36 @@ export interface EmuRecorder {
|
||||||
|
|
||||||
/////
|
/////
|
||||||
|
|
||||||
abstract class BaseDebugPlatform {
|
export abstract class BasePlatform {
|
||||||
|
recorder : EmuRecorder = null;
|
||||||
|
|
||||||
|
abstract loadState(state : EmuState) : void;
|
||||||
|
abstract saveState() : EmuState;
|
||||||
|
abstract pause() : void;
|
||||||
|
abstract resume() : void;
|
||||||
|
|
||||||
|
setRecorder(recorder : EmuRecorder) : void {
|
||||||
|
this.recorder = recorder;
|
||||||
|
}
|
||||||
|
updateRecorder() {
|
||||||
|
// are we recording and do we need to save a frame?
|
||||||
|
if (this.recorder && (<Platform><any>this).isRunning() && this.recorder.frameRequested()) {
|
||||||
|
this.recorder.recordFrame(this.saveState());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export abstract class BaseDebugPlatform extends BasePlatform {
|
||||||
onBreakpointHit : BreakpointCallback;
|
onBreakpointHit : BreakpointCallback;
|
||||||
debugCondition : DebugCondition;
|
debugCondition : DebugCondition;
|
||||||
debugSavedState : EmuState = null;
|
debugSavedState : EmuState = null;
|
||||||
debugBreakState : EmuState = null;
|
debugBreakState : EmuState = null;
|
||||||
debugTargetClock : number = 0;
|
debugTargetClock : number = 0;
|
||||||
debugClock : number = 0;
|
debugClock : number = 0;
|
||||||
recorder : EmuRecorder = null;
|
|
||||||
|
|
||||||
abstract getCPUState() : CpuState;
|
abstract getCPUState() : CpuState;
|
||||||
abstract saveState() : EmuState;
|
abstract readAddress(addr:number) : number;
|
||||||
abstract loadState?(state : EmuState) : void;
|
abstract advance(novideo? : boolean) : void;
|
||||||
abstract pause() : void;
|
|
||||||
abstract resume() : void;
|
|
||||||
abstract readAddress?(addr:number) : number;
|
|
||||||
abstract advance?(novideo? : boolean) : void;
|
|
||||||
|
|
||||||
getDebugCallback() : DebugCondition {
|
getDebugCallback() : DebugCondition {
|
||||||
return this.debugCondition;
|
return this.debugCondition;
|
||||||
|
@ -139,15 +153,6 @@ abstract class BaseDebugPlatform {
|
||||||
this.debugBreakState = null;
|
this.debugBreakState = null;
|
||||||
this.resume();
|
this.resume();
|
||||||
}
|
}
|
||||||
setRecorder?(recorder : EmuRecorder) : void {
|
|
||||||
this.recorder = recorder;
|
|
||||||
}
|
|
||||||
updateRecorder() {
|
|
||||||
// are we recording and do we need to save a frame?
|
|
||||||
if (this.recorder && (<Platform><any>this).isRunning() && this.recorder.frameRequested()) {
|
|
||||||
this.recorder.recordFrame(this.saveState());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
preFrame() {
|
preFrame() {
|
||||||
this.updateRecorder();
|
this.updateRecorder();
|
||||||
}
|
}
|
||||||
|
@ -160,7 +165,7 @@ abstract class BaseDebugPlatform {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract class BaseFrameBasedPlatform extends BaseDebugPlatform {
|
export abstract class BaseFrameBasedPlatform extends BaseDebugPlatform {
|
||||||
debugPCDelta = -1;
|
debugPCDelta = -1;
|
||||||
|
|
||||||
evalDebugCondition() {
|
evalDebugCondition() {
|
||||||
|
|
|
@ -230,7 +230,7 @@ export var AnimationTimer = function(frequencyHz:number, callback:() => void) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
// TODO: move to util?
|
||||||
|
|
||||||
export function dumpRAM(ram:number[], ramofs:number, ramlen:number) : string {
|
export function dumpRAM(ram:number[], ramofs:number, ramlen:number) : string {
|
||||||
var s = "";
|
var s = "";
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
import { Platform, cpuStateToLongString_6502, BaseMAMEPlatform, EmuRecorder, dumpStackToString, DisasmLine } from "../baseplatform";
|
import { Platform, BasePlatform, cpuStateToLongString_6502, BaseMAMEPlatform, EmuRecorder, dumpStackToString, DisasmLine } from "../baseplatform";
|
||||||
import { PLATFORMS, RAM, newAddressDecoder, dumpRAM } from "../emu";
|
import { PLATFORMS, RAM, newAddressDecoder, dumpRAM } from "../emu";
|
||||||
import { hex, lpad, tobin, byte2signed } from "../util";
|
import { hex, lpad, tobin, byte2signed } from "../util";
|
||||||
import { CodeAnalyzer_vcs } from "../analysis";
|
import { CodeAnalyzer_vcs } from "../analysis";
|
||||||
|
@ -48,9 +48,9 @@ Javatari.CARTRIDGE_CHANGE_DISABLED = true;
|
||||||
Javatari.DEBUG_SCANLINE_OVERFLOW = false; // TODO: make a switch
|
Javatari.DEBUG_SCANLINE_OVERFLOW = false; // TODO: make a switch
|
||||||
Javatari.AUDIO_BUFFER_SIZE = 256;
|
Javatari.AUDIO_BUFFER_SIZE = 256;
|
||||||
|
|
||||||
class VCSPlatform {
|
class VCSPlatform extends BasePlatform {
|
||||||
|
|
||||||
recorder : EmuRecorder;
|
lastDebugState;
|
||||||
|
|
||||||
getPresets() { return VCS_PRESETS; }
|
getPresets() { return VCS_PRESETS; }
|
||||||
|
|
||||||
|
@ -119,11 +119,13 @@ class VCSPlatform {
|
||||||
state.c.PC = (state.c.PC - 1) & 0xffff;
|
state.c.PC = (state.c.PC - 1) & 0xffff;
|
||||||
Javatari.room.console.pause();
|
Javatari.room.console.pause();
|
||||||
Javatari.room.speaker.mute();
|
Javatari.room.speaker.mute();
|
||||||
|
this.lastDebugState = state;
|
||||||
callback(state);
|
callback(state);
|
||||||
}
|
}
|
||||||
Javatari.room.speaker.mute();
|
Javatari.room.speaker.mute();
|
||||||
}
|
}
|
||||||
clearDebug() {
|
clearDebug() {
|
||||||
|
this.lastDebugState = null;
|
||||||
Javatari.room.console.disableDebug();
|
Javatari.room.console.disableDebug();
|
||||||
Javatari.room.console.onBreakpointHit = null;
|
Javatari.room.console.onBreakpointHit = null;
|
||||||
if (this.isRunning()) Javatari.room.speaker.play();
|
if (this.isRunning()) Javatari.room.speaker.play();
|
||||||
|
@ -147,6 +149,9 @@ class VCSPlatform {
|
||||||
loadState(state) {
|
loadState(state) {
|
||||||
return Javatari.room.console.loadState(state);
|
return Javatari.room.console.loadState(state);
|
||||||
}
|
}
|
||||||
|
getCPUState() {
|
||||||
|
return Javatari.room.console.saveState().c;
|
||||||
|
}
|
||||||
saveControlsState() {
|
saveControlsState() {
|
||||||
return Javatari.room.console.saveControlsState();
|
return Javatari.room.console.saveControlsState();
|
||||||
}
|
}
|
||||||
|
@ -154,7 +159,11 @@ class VCSPlatform {
|
||||||
Javatari.room.console.loadControlsState(state);
|
Javatari.room.console.loadControlsState(state);
|
||||||
}
|
}
|
||||||
readAddress(addr) {
|
readAddress(addr) {
|
||||||
return Javatari.room.console.readAddress(addr);
|
// TODO: shouldn't have to do this when debugging
|
||||||
|
if (this.lastDebugState && addr >= 0x80 && addr < 0x100)
|
||||||
|
return this.getRAMForState(this.lastDebugState)[addr & 0x7f];
|
||||||
|
else
|
||||||
|
return Javatari.room.console.readAddress(addr);
|
||||||
}
|
}
|
||||||
writeAddress(addr,value) {
|
writeAddress(addr,value) {
|
||||||
Javatari.room.console.writeAddress(addr,value);
|
Javatari.room.console.writeAddress(addr,value);
|
||||||
|
@ -233,15 +242,6 @@ class VCSPlatform {
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
setRecorder(recorder : EmuRecorder) : void {
|
|
||||||
this.recorder = recorder;
|
|
||||||
}
|
|
||||||
updateRecorder() {
|
|
||||||
// are we recording and do we need to save a frame?
|
|
||||||
if (this.recorder && this.isRunning() && this.recorder.frameRequested()) {
|
|
||||||
this.recorder.recordFrame(this.saveState());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
disassemble(pc:number, read:(addr:number)=>number) : DisasmLine {
|
disassemble(pc:number, read:(addr:number)=>number) : DisasmLine {
|
||||||
return disassemble6502(pc, read(pc), read(pc+1), read(pc+2));
|
return disassemble6502(pc, read(pc), read(pc+1), read(pc+2));
|
||||||
}
|
}
|
||||||
|
|
|
@ -65,13 +65,6 @@ var lastDebugInfo; // last debug info (CPU text)
|
||||||
var lastDebugState; // last debug state (object)
|
var lastDebugState; // last debug state (object)
|
||||||
var debugCategory; // current debug category
|
var debugCategory; // current debug category
|
||||||
|
|
||||||
function inspectVariable(ed, name) { // TODO: ed?
|
|
||||||
var val;
|
|
||||||
if (platform.inspect) {
|
|
||||||
platform.inspect(name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function getCurrentPresetTitle() : string {
|
function getCurrentPresetTitle() : string {
|
||||||
if (!current_preset_entry)
|
if (!current_preset_entry)
|
||||||
return main_file_id || "ROM";
|
return main_file_id || "ROM";
|
||||||
|
|
43
src/views.ts
43
src/views.ts
|
@ -1,6 +1,7 @@
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
import $ = require("jquery");
|
import $ = require("jquery");
|
||||||
|
//import CodeMirror = require("codemirror");
|
||||||
import { CodeProject } from "./project";
|
import { CodeProject } from "./project";
|
||||||
import { SourceFile, WorkerError } from "./workertypes";
|
import { SourceFile, WorkerError } from "./workertypes";
|
||||||
import { Platform } from "./baseplatform";
|
import { Platform } from "./baseplatform";
|
||||||
|
@ -27,14 +28,12 @@ declare var CodeMirror;
|
||||||
declare var platform : Platform;
|
declare var platform : Platform;
|
||||||
declare var platform_id : string;
|
declare var platform_id : string;
|
||||||
declare var compparams;
|
declare var compparams;
|
||||||
|
declare var symbolmap : {[ident:string]:number};
|
||||||
declare var addr2symbol : {[addr:number]:string};
|
declare var addr2symbol : {[addr:number]:string};
|
||||||
declare var current_project : CodeProject;
|
declare var current_project : CodeProject;
|
||||||
declare var VirtualList;
|
declare var VirtualList;
|
||||||
declare var lastDebugState;
|
declare var lastDebugState;
|
||||||
|
|
||||||
// TODO: functions
|
|
||||||
declare function inspectVariable(ed, name?:string);
|
|
||||||
|
|
||||||
// helper function for editor
|
// helper function for editor
|
||||||
function jumpToLine(ed, i:number) {
|
function jumpToLine(ed, i:number) {
|
||||||
var t = ed.charCoords({line: i, ch: 0}, "local").top;
|
var t = ed.charCoords({line: i, ch: 0}, "local").top;
|
||||||
|
@ -61,6 +60,7 @@ export class SourceEditor implements ProjectView {
|
||||||
currentDebugLine : number;
|
currentDebugLine : number;
|
||||||
errormsgs = [];
|
errormsgs = [];
|
||||||
errorwidgets = [];
|
errorwidgets = [];
|
||||||
|
inspectWidget;
|
||||||
|
|
||||||
createDiv(parent:HTMLElement, text:string) {
|
createDiv(parent:HTMLElement, text:string) {
|
||||||
var div = document.createElement('div');
|
var div = document.createElement('div');
|
||||||
|
@ -97,16 +97,47 @@ export class SourceEditor implements ProjectView {
|
||||||
this.editor.on('cursorActivity', (ed) => {
|
this.editor.on('cursorActivity', (ed) => {
|
||||||
var start = this.editor.getCursor(true);
|
var start = this.editor.getCursor(true);
|
||||||
var end = this.editor.getCursor(false);
|
var end = this.editor.getCursor(false);
|
||||||
if (start.line == end.line && start.ch < end.ch) {
|
if (start.line == end.line && start.ch < end.ch && end.ch-start.ch < 80) {
|
||||||
var name = this.editor.getSelection();
|
var name = this.editor.getSelection();
|
||||||
inspectVariable(this.editor, name);
|
this.inspect(name);
|
||||||
} else {
|
} else {
|
||||||
inspectVariable(this.editor);
|
this.inspect(null);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
//scrollProfileView(editor);
|
//scrollProfileView(editor);
|
||||||
this.editor.setOption("mode", this.mode);
|
this.editor.setOption("mode", this.mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inspect(ident : string) : void {
|
||||||
|
var result;
|
||||||
|
if (platform.inspect) {
|
||||||
|
result = platform.inspect(ident);
|
||||||
|
} else if (!platform.isRunning() && platform.readAddress) { // only inspect when stopped
|
||||||
|
// TODO: platform should know its symbols
|
||||||
|
var addr = symbolmap[ident];
|
||||||
|
if (addr) {
|
||||||
|
var size=4;
|
||||||
|
result = "$" + hex(addr,4) + ":";
|
||||||
|
for (var i=0; i<size; i++) {
|
||||||
|
var byte = platform.readAddress(addr+i);
|
||||||
|
result += " $" + hex(byte,2) + " (" + byte + ")";
|
||||||
|
if (addr2symbol[addr+1]) break; // stop if we hit another symbol
|
||||||
|
else if (i==size-1) result += " ...";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (this.inspectWidget) {
|
||||||
|
this.inspectWidget.clear();
|
||||||
|
this.inspectWidget = null;
|
||||||
|
}
|
||||||
|
if (result) {
|
||||||
|
var infospan = document.createElement("span");
|
||||||
|
infospan.setAttribute("class", "tooltipinfoline");
|
||||||
|
infospan.appendChild(document.createTextNode(result));
|
||||||
|
var line = this.editor.getCursor().line;
|
||||||
|
this.inspectWidget = this.editor.addLineWidget(line, infospan, {above:false});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
setText(text:string) {
|
setText(text:string) {
|
||||||
this.editor.setValue(text); // calls setCode()
|
this.editor.setValue(text); // calls setCode()
|
||||||
|
|
Loading…
Reference in New Issue
Block a user