mirror of
https://github.com/trebonian/visual6502.git
synced 2024-06-12 21:29:31 +00:00
[dev]add trace checksum for self-checking tests
This commit is contained in:
parent
f439d8fc8d
commit
ee196947e3
24
macros.js
24
macros.js
|
@ -139,9 +139,16 @@ function signalSet(n){
|
||||||
return signals;
|
return signals;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var traceChecksum='';
|
||||||
|
var goldenChecksum;
|
||||||
|
|
||||||
// simulate a single clock phase, updating trace and highlighting layout
|
// simulate a single clock phase, updating trace and highlighting layout
|
||||||
function step(){
|
function step(){
|
||||||
trace[cycle]= {chip: stateString(), mem: getMem()};
|
var s=stateString();
|
||||||
|
var m=getMem();
|
||||||
|
trace[cycle]= {chip: s, mem: m};
|
||||||
|
if(goldenChecksum != undefined)
|
||||||
|
traceChecksum=adler32(traceChecksum+s+m.slice(0,511).toString(16));
|
||||||
halfStep();
|
halfStep();
|
||||||
if(animateChipLayout)
|
if(animateChipLayout)
|
||||||
refresh();
|
refresh();
|
||||||
|
@ -340,7 +347,10 @@ function chipStatus(){
|
||||||
' Y:' + hexByte(readY()) +
|
' Y:' + hexByte(readY()) +
|
||||||
' SP:' + hexByte(readSP()) +
|
' SP:' + hexByte(readSP()) +
|
||||||
' ' + readPstring();
|
' ' + readPstring();
|
||||||
setStatus(machine1, machine2, "Hz: " + estimatedHz().toFixed(1));
|
var chk='';
|
||||||
|
if(goldenChecksum != undefined)
|
||||||
|
chk=" Chk:" + traceChecksum + ((traceChecksum==goldenChecksum)?" OK":" no match");
|
||||||
|
setStatus(machine1, machine2, "Hz: " + estimatedHz().toFixed(1) + chk);
|
||||||
if (loglevel>0) {
|
if (loglevel>0) {
|
||||||
updateLogbox(signalSet(loglevel));
|
updateLogbox(signalSet(loglevel));
|
||||||
}
|
}
|
||||||
|
@ -400,3 +410,13 @@ function setMem(arr){
|
||||||
|
|
||||||
function hexWord(n){return (0x10000+n).toString(16).substring(1)}
|
function hexWord(n){return (0x10000+n).toString(16).substring(1)}
|
||||||
function hexByte(n){return (0x100+n).toString(16).substring(1)}
|
function hexByte(n){return (0x100+n).toString(16).substring(1)}
|
||||||
|
|
||||||
|
function adler32(x){
|
||||||
|
var a=1;
|
||||||
|
var b=0;
|
||||||
|
for(var i=0;i<x.length;i++){
|
||||||
|
a=(a+x.charCodeAt(i))%65521;
|
||||||
|
b=(b+a)%65521;
|
||||||
|
}
|
||||||
|
return (0x100000000+(b<<16)+a).toString(16).slice(-8);
|
||||||
|
}
|
||||||
|
|
20
wires.js
20
wires.js
|
@ -125,22 +125,25 @@ function setupParams(){
|
||||||
var name=params[0];
|
var name=params[0];
|
||||||
var value=params[1].replace(/\/$/,""); // chrome sometimes adds trailing slash
|
var value=params[1].replace(/\/$/,""); // chrome sometimes adds trailing slash
|
||||||
// be (relatively) forgiving in what we accept
|
// be (relatively) forgiving in what we accept
|
||||||
|
//
|
||||||
|
// user interface mode control
|
||||||
if(name=="loglevel" && parseInt(value)>0){
|
if(name=="loglevel" && parseInt(value)>0){
|
||||||
updateLoglevel(value);
|
updateLoglevel(value);
|
||||||
} else if(name=="expert" && value.indexOf("t")==0){
|
} else if(name=="expert" && value.indexOf("t")==0){
|
||||||
updateExpertMode(true);
|
updateExpertMode(true);
|
||||||
} else if(name=="graphics" && value.indexOf("f")==0){
|
} else if(name=="graphics" && value.indexOf("f")==0){
|
||||||
updateChipLayoutVisibility(false);
|
updateChipLayoutVisibility(false);
|
||||||
} else if(name=="panx" && parseInt(value)!=NaN){
|
} else
|
||||||
|
// place the graphics window at a point of interest
|
||||||
|
if(name=="panx" && parseInt(value)!=NaN){
|
||||||
panx=parseInt(value);
|
panx=parseInt(value);
|
||||||
} else if(name=="pany" && parseInt(value)!=NaN){
|
} else if(name=="pany" && parseInt(value)!=NaN){
|
||||||
pany=parseInt(value);
|
pany=parseInt(value);
|
||||||
} else if(name=="zoom" && parseInt(value)!=NaN){
|
} else if(name=="zoom" && parseInt(value)!=NaN){
|
||||||
zoom=parseInt(value);
|
zoom=parseInt(value);
|
||||||
} else if(name=="steps" && parseInt(value)!=NaN){
|
} else
|
||||||
userSteps=parseInt(value);
|
// load a test program: Address, Data and Reset
|
||||||
running=true;
|
if(name=="a" && parseInt(value,16)!=NaN){
|
||||||
} else if(name=="a" && parseInt(value,16)!=NaN){
|
|
||||||
userAddress=parseInt(value,16);
|
userAddress=parseInt(value,16);
|
||||||
} else if(name=="d" && value.match(/[0-9a-fA-F]*/)[0].length==value.length){
|
} else if(name=="d" && value.match(/[0-9a-fA-F]*/)[0].length==value.length){
|
||||||
for(var j=0;j<value.length;j+=2)
|
for(var j=0;j<value.length;j+=2)
|
||||||
|
@ -148,6 +151,13 @@ function setupParams(){
|
||||||
} else if(name=="r" && parseInt(value,16)!=NaN){
|
} else if(name=="r" && parseInt(value,16)!=NaN){
|
||||||
userResetLow=parseInt(value,16)%256;
|
userResetLow=parseInt(value,16)%256;
|
||||||
userResetHigh=(parseInt(value,16)>>8)%256;
|
userResetHigh=(parseInt(value,16)>>8)%256;
|
||||||
|
} else
|
||||||
|
// run a test program, and optionally check against a golden checksum
|
||||||
|
if(name=="steps" && parseInt(value)!=NaN){
|
||||||
|
userSteps=parseInt(value);
|
||||||
|
running=true;
|
||||||
|
} else if(name=="checksum" && parseInt(value,16)!=NaN){
|
||||||
|
goldenChecksum=(0x100000000+parseInt(value,16)).toString(16).slice(-8);
|
||||||
} else {
|
} else {
|
||||||
if(loglevel>0)
|
if(loglevel>0)
|
||||||
console.log('unrecognised parameters:',params);
|
console.log('unrecognised parameters:',params);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user