1
0
mirror of https://github.com/sehugg/8bitworkshop.git synced 2024-12-26 07:29:22 +00:00

show >8 bit arrays in debug, check for non-typed arrays in state, fix embed iframe

This commit is contained in:
Steven Hugg 2020-07-09 07:03:09 -05:00
parent 6acaa3f81d
commit 2e27b0d2bb
8 changed files with 30 additions and 11 deletions

View File

@ -192,6 +192,7 @@ TODO:
- copy to gen/ directory (allowJs is weird) - copy to gen/ directory (allowJs is weird)
- can we debug first frame via replay? - can we debug first frame via replay?
- ca65 line numbers are not aligned with source code - ca65 line numbers are not aligned with source code
- segments not read properly
- Debug Browser - Debug Browser
- hex viewer - hex viewer
- show 16/32 typed arrays - show 16/32 typed arrays

View File

@ -17,7 +17,7 @@
flex-grow: 1; flex-grow: 1;
} }
.emuvideo { .emuvideo {
width:90%; width: calc(100% - 70px);
border-radius:20px; border-radius:20px;
border: 4px solid #222; border: 4px solid #222;
outline-color: #666; outline-color: #666;

2
jsnes

@ -1 +1 @@
Subproject commit 03614b82158dabc4fc78c728be0b6a847538b957 Subproject commit a6a026b698f9a68372cc94b46182e3abedc26672

View File

@ -305,15 +305,17 @@ export class AnimationTimer {
// TODO: move to util? // TODO: move to util?
export function dumpRAM(ram:Uint8Array|number[], ramofs:number, ramlen:number) : string { export function dumpRAM(ram:ArrayLike<number>, ramofs:number, ramlen:number) : string {
var s = ""; var s = "";
var bpel = ram['BYTES_PER_ELEMENT'] || 1;
var perline = Math.ceil(16 / bpel);
// TODO: show scrollable RAM for other platforms // TODO: show scrollable RAM for other platforms
for (var ofs=0; ofs<ramlen; ofs+=0x10) { for (var ofs=0; ofs<ramlen; ofs+=perline) {
s += '$' + hex(ofs+ramofs) + ':'; s += '$' + hex(ofs+ramofs) + ':';
for (var i=0; i<0x10; i++) { for (var i=0; i<perline; i++) {
if (ofs+i < ram.length) { if (ofs+i < ram.length) {
if (i == 8) s += " "; if (i == perline/2) s += " ";
s += " " + hex(ram[ofs+i]); s += " " + hex(ram[ofs+i], bpel*2);
} }
} }
s += "\n"; s += "\n";

View File

@ -224,6 +224,7 @@ export class ProbeRecorder implements ProbeAll {
if (this.singleFrame) this.reset(); if (this.singleFrame) this.reset();
} }
logExecute(address:number, SP:number) { logExecute(address:number, SP:number) {
// TODO? record stack pushes (not all platforms use logExecute)
if (this.cur_sp !== SP) { if (this.cur_sp !== SP) {
if (SP < this.cur_sp) { if (SP < this.cur_sp) {
this.log(ProbeFlags.SP_PUSH | (this.cur_sp - SP)); this.log(ProbeFlags.SP_PUSH | (this.cur_sp - SP));

View File

@ -1161,6 +1161,7 @@ export class RasterPCHeatMapView extends ProbeBitmapViewBase implements ProjectV
} }
} }
// TODO?
export class RasterStackMapView extends ProbeBitmapViewBase implements ProjectView { export class RasterStackMapView extends ProbeBitmapViewBase implements ProjectView {
pcstack = []; pcstack = [];
pushed = false; pushed = false;
@ -1401,8 +1402,8 @@ class TreeNode {
text = obj; text = obj;
else else
text = obj.substring(0, MAX_STRING_LEN) + "..."; text = obj.substring(0, MAX_STRING_LEN) + "...";
// byte array (TODO: other kinds) // typed byte array (TODO: other kinds)
} else if (obj instanceof Uint8Array && obj.length <= MAX_CHILDREN) { } else if (obj.buffer && obj.length <= MAX_CHILDREN) {
text = dumpRAM(obj, 0, obj.length); text = dumpRAM(obj, 0, obj.length);
// recurse into object? (or function) // recurse into object? (or function)
} else if (typeof obj == 'object' || typeof obj == 'function') { } else if (typeof obj == 'object' || typeof obj == 'function') {

View File

@ -8,9 +8,10 @@ const cpuFrequency = 1023000;
const cpuCyclesPerLine = 65; // approx: http://www.cs.columbia.edu/~sedwards/apple2fpga/ const cpuCyclesPerLine = 65; // approx: http://www.cs.columbia.edu/~sedwards/apple2fpga/
const cpuCyclesPerFrame = 65*262; const cpuCyclesPerFrame = 65*262;
// TODO: read prodos/ca65 header?
const VM_BASE = 0x803; // where to JMP after pr#6 const VM_BASE = 0x803; // where to JMP after pr#6
const LOAD_BASE = VM_BASE; //0x7c9; // where to load ROM const LOAD_BASE = VM_BASE;
const PGM_BASE = VM_BASE; //0x800; // where to load ROM const PGM_BASE = VM_BASE;
const HDR_SIZE = PGM_BASE - LOAD_BASE; const HDR_SIZE = PGM_BASE - LOAD_BASE;
interface AppleIIStateBase { interface AppleIIStateBase {

View File

@ -117,6 +117,17 @@ global.Mousetrap = function() {
// //
function checkForBigNonTypedArrays(obj, path='') {
if (typeof obj != 'object' || obj == null) return;
Object.entries(obj).forEach((entry) => {
if (entry[1] instanceof Array && entry[1].length > 200) {
if (typeof entry[1][0] == 'number' && entry[1].buffer == null)
throw new Error("array in save state not typed: " + path + '/' + entry[0]);
}
checkForBigNonTypedArrays(entry[1], path + '/' + entry[0]);
});
}
async function testPlatform(platid, romname, maxframes, callback) { async function testPlatform(platid, romname, maxframes, callback) {
var platform = new emu.PLATFORMS[platid](emudiv); var platform = new emu.PLATFORMS[platid](emudiv);
await platform.start(); await platform.start();
@ -127,6 +138,7 @@ async function testPlatform(platid, romname, maxframes, callback) {
rom = new Uint8Array(rom); rom = new Uint8Array(rom);
platform.loadROM("ROM", rom); platform.loadROM("ROM", rom);
var state0a = platform.saveState(); var state0a = platform.saveState();
checkForBigNonTypedArrays(state0a);
platform.reset(); // reset again platform.reset(); // reset again
var state0b = platform.saveState(); var state0b = platform.saveState();
//TODO: vcs fails assert.deepEqual(state0a, state0b); //TODO: vcs fails assert.deepEqual(state0a, state0b);
@ -152,6 +164,7 @@ async function testPlatform(platid, romname, maxframes, callback) {
assert.equal(maxframes, rec.loadFrame(maxframes)); assert.equal(maxframes, rec.loadFrame(maxframes));
var state2 = platform.saveState(); var state2 = platform.saveState();
assert.deepEqual(state1, state2); assert.deepEqual(state1, state2);
checkForBigNonTypedArrays(state2);
// test memory reads not clearing stuff // test memory reads not clearing stuff
for (var i=0; i<=0xffff; i++) for (var i=0; i<=0xffff; i++)
if (platform.readAddress) platform.readAddress(i); if (platform.readAddress) platform.readAddress(i);