1
0
mirror of https://github.com/sehugg/8bitworkshop.git synced 2024-06-08 08:33:32 +00:00

debugviews: new CRT Probe

This commit is contained in:
Steven Hugg 2022-08-24 13:28:00 -05:00
parent f8985e3858
commit ba2644e7d0
3 changed files with 55 additions and 21 deletions

View File

@ -365,9 +365,7 @@ function refreshWindowList() {
}); });
// TODO: only if raster // TODO: only if raster
addWindowItem("#crtheatmap", "CRT Probe", () => { addWindowItem("#crtheatmap", "CRT Probe", () => {
return new RasterPCHeatMapView(); //return new RasterPCHeatMapView();
});
addWindowItem("#stackheatmap", "Stack Activity", () => {
return new RasterStackMapView(); return new RasterStackMapView();
}); });
addWindowItem("#probelog", "Probe Log", () => { addWindowItem("#probelog", "Probe Log", () => {

View File

@ -304,6 +304,8 @@ export class MemoryMapView implements ProjectView {
// TODO: clear buffer when scrubbing // TODO: clear buffer when scrubbing
const OPAQUE_BLACK = 0xff000000;
export abstract class ProbeViewBaseBase { export abstract class ProbeViewBaseBase {
probe : ProbeRecorder; probe : ProbeRecorder;
tooldiv : HTMLElement; tooldiv : HTMLElement;
@ -375,7 +377,7 @@ export abstract class ProbeViewBaseBase {
var word = p.buf[i]; var word = p.buf[i];
var addr = word & 0xffff; var addr = word & 0xffff;
var value = (word >> 16) & 0xff; var value = (word >> 16) & 0xff;
var op = word & 0xff000000; var op = word & OPAQUE_BLACK;
switch (op) { switch (op) {
case ProbeFlags.SCANLINE: row++; col=0; break; case ProbeFlags.SCANLINE: row++; col=0; break;
case ProbeFlags.FRAME: row=0; col=0; break; case ProbeFlags.FRAME: row=0; col=0; break;
@ -524,14 +526,17 @@ abstract class ProbeBitmapViewBase extends ProbeViewBase {
refresh() { refresh() {
this.tick(); this.tick();
this.datau32.fill(0xff000000); this.datau32.fill(OPAQUE_BLACK);
} }
tick() { tick() {
super.tick(); super.tick();
this.drawImage();
}
drawImage() {
this.ctx.putImageData(this.imageData, 0, 0); this.ctx.putImageData(this.imageData, 0, 0);
} }
clear() { clear() {
this.datau32.fill(0xff000000); this.datau32.fill(OPAQUE_BLACK);
} }
} }
@ -546,7 +551,7 @@ export class AddressHeatMapView extends ProbeBitmapViewBase implements ProjectVi
var v = platform.readAddress(i); var v = platform.readAddress(i);
var rgb = (v >> 2) | (v & 0x1f); var rgb = (v >> 2) | (v & 0x1f);
rgb |= (rgb<<8) | (rgb<<16); rgb |= (rgb<<8) | (rgb<<16);
this.datau32[i] = rgb | 0xff000000; this.datau32[i] = rgb | OPAQUE_BLACK;
} }
} }
@ -556,7 +561,7 @@ export class AddressHeatMapView extends ProbeBitmapViewBase implements ProjectVi
var x = addr & 0xff; var x = addr & 0xff;
var y = (addr >> 8) & 0xff; var y = (addr >> 8) & 0xff;
var data = this.datau32[addr & 0xffff]; var data = this.datau32[addr & 0xffff];
data = data | rgb | 0xff000000; data = data | rgb | OPAQUE_BLACK;
this.datau32[addr & 0xffff] = data; this.datau32[addr & 0xffff] = data;
} }
@ -597,27 +602,57 @@ export class RasterPCHeatMapView extends ProbeBitmapViewBase implements ProjectV
var rgb = this.getOpRGB(op, addr); var rgb = this.getOpRGB(op, addr);
if (!rgb) return; if (!rgb) return;
var iofs = col + row * this.canvas.width; var iofs = col + row * this.canvas.width;
var data = rgb | 0xff000000; var data = rgb | OPAQUE_BLACK;
this.datau32[iofs] |= data; this.datau32[iofs] |= data;
} }
drawImage() {
// fill in the gaps
let last = OPAQUE_BLACK;
for (let i=0; i<this.datau32.length; i++) {
if (this.datau32[i] == OPAQUE_BLACK) {
this.datau32[i] = last;
} else {
last = this.datau32[i];
}
}
super.drawImage();
}
} }
export class RasterStackMapView extends ProbeBitmapViewBase implements ProjectView { export class RasterStackMapView extends RasterPCHeatMapView implements ProjectView {
interrupt: number; interrupt: number = 0;
rgb: number = 0;
lastpc: number = 0;
drawEvent(op, addr, col, row) { drawEvent(op, addr, col, row) {
var rgb; var iofs = col + row * this.canvas.width;
rgb = (0x030609 * (this.sp & 7)) | 0x404040; // track interrupts
if (op == ProbeFlags.INTERRUPT) this.interrupt = 1; if (op == ProbeFlags.INTERRUPT) this.interrupt = 1;
if (this.interrupt == 1 && op == ProbeFlags.SP_PUSH) this.interrupt = addr; if (this.interrupt == 1 && op == ProbeFlags.SP_PUSH) this.interrupt = addr;
if (this.interrupt > 1 && this.sp > this.interrupt) this.interrupt = 0; if (this.interrupt > 1 && this.sp > this.interrupt) this.interrupt = 0;
if (this.interrupt) rgb |= 0x800000; // track writes
if (op == ProbeFlags.EXECUTE) { if (op == ProbeFlags.MEM_WRITE) { this.rgb |= 0x00002f; }
var iofs = col + row * this.canvas.width; if (op == ProbeFlags.VRAM_WRITE) { this.rgb |= 0x003f80; }
var data = rgb | 0xff000000; if (op == ProbeFlags.IO_WRITE) { this.rgb |= 0x1f3f80; }
while (iofs >= 0 && !(this.datau32[iofs] & 0xffffff)) { if (op == ProbeFlags.IO_READ) { this.rgb |= 0x001f00; }
this.datau32[iofs--] = data; // draw pixels?
if (op == ProbeFlags.ILLEGAL) {
this.datau32[iofs] = 0xff0f0f0f;
} else {
let data = this.rgb;
if (op == ProbeFlags.EXECUTE) {
let sp = this.sp & 15;
if (sp >= 8) sp = 16-sp;
if (Math.abs(this.lastpc) - addr > 16) { sp += 1; }
if (Math.abs(this.lastpc) - addr > 256) { sp += 1; }
data = this.rgb = (0x080808 * sp) + 0x202020;
this.lastpc = addr;
}
if (this.interrupt) { data |= 0x800040; }
if (this.datau32[iofs] == OPAQUE_BLACK) {
this.datau32[iofs] = data | OPAQUE_BLACK;
} }
} }
} }
@ -697,7 +732,7 @@ export class ScanlineIOView extends ProbeViewBaseBase {
var opaddr = line[i]; var opaddr = line[i];
if (opaddr !== undefined) { if (opaddr !== undefined) {
var addr = opaddr & 0xffff; var addr = opaddr & 0xffff;
var op = op & 0xff000000; var op = op & OPAQUE_BLACK;
if (op == ProbeFlags.EXECUTE) { if (op == ProbeFlags.EXECUTE) {
s += ','; s += ',';
} else { } else {

View File

@ -394,7 +394,8 @@ class VCSPlatform extends BasePlatform {
bus.oldWrite = bus.write; bus.oldWrite = bus.write;
bus.write = function(a,v) { bus.write = function(a,v) {
this.oldWrite(a,v); this.oldWrite(a,v);
if (a < 0x80) probe.logIOWrite(a,v); if (a == 0x02) probe.logIllegal(a); // WSYNC
else if (a < 0x80) probe.logIOWrite(a,v);
else if (a > 0x280 && a < 0x300) probe.logIOWrite(a,v); else if (a > 0x280 && a < 0x300) probe.logIOWrite(a,v);
else probe.logWrite(a,v); else probe.logWrite(a,v);
} }