[dev]first (untidy) implementation of expert mode with tabular logging

This commit is contained in:
BigEd 2010-09-25 21:32:29 +00:00
parent 653379e5d7
commit f6f467787a
4 changed files with 72 additions and 9 deletions

View File

@ -65,11 +65,15 @@ Enter your own program into the array of RAM
<a href ="javascript:resetChip()"><img class="navbutton" src="images/up.png"></a> <a href ="javascript:resetChip()"><img class="navbutton" src="images/up.png"></a>
<a href ="javascript:stepBack()"><img class="navbutton" src="images/prev.png"></a> <a href ="javascript:stepBack()"><img class="navbutton" src="images/prev.png"></a>
<a href ="javascript:stepForward()"><img class="navbutton" src="images/next.png"></a> <a href ="javascript:stepForward()"><img class="navbutton" src="images/next.png"></a>
<div id="expertMode" style="float:left;">Expert:
<input type="checkbox" name="0" onchange="updateExpertMode(this.checked)" />
</div>
</div> </div>
</div> </div>
<p class="status" id="status">x: 0<br>y: 0</p> <p class="status" id="status">x: 0<br>y: 0</p>
<table class="memtable" id="memtable"></table> <table class="memtable" id="memtable"></table>
</div> </div>
<div id="controlPanel" style="visibility:hidden">
<div id="updateShow"> Show: <div id="updateShow"> Show:
<input type="checkbox" name="0" id="updateShow0" onchange="updateShow(this.name,this.checked)" />(metal) <input type="checkbox" name="0" id="updateShow0" onchange="updateShow(this.name,this.checked)" />(metal)
<input type="checkbox" name="1" id="updateShow1" onchange="updateShow(this.name,this.checked)" />(switched diffusion) <input type="checkbox" name="1" id="updateShow1" onchange="updateShow(this.name,this.checked)" />(switched diffusion)
@ -79,6 +83,8 @@ Enter your own program into the array of RAM
<input type="checkbox" name="2" id="updateShow2" onchange="updateShow(this.name,this.checked)" />(diode) <input type="checkbox" name="2" id="updateShow2" onchange="updateShow(this.name,this.checked)" />(diode)
</div> </div>
<br /> <br />
<table class="logstream" id="logstream"></table>
</div>
<br /> <br />
Source code is available on GitHub: <a href="http://github.com/trebonian/visual6502">http://github.com/trebonian/visual6502</a> Source code is available on GitHub: <a href="http://github.com/trebonian/visual6502">http://github.com/trebonian/visual6502</a>
<br /> <br />

View File

@ -26,6 +26,7 @@ var code = [0xa9, 0x00, 0x20, 0x10, 0x00, 0x4c, 0x02, 0x00,
0xe8, 0x88, 0xe6, 0x40, 0x38, 0x69, 0x02, 0x60]; 0xe8, 0x88, 0xe6, 0x40, 0x38, 0x69, 0x02, 0x60];
var cycle = 0; var cycle = 0;
var trace = Array(); var trace = Array();
var logstream = Array();
var running = false; var running = false;
function go(n){ function go(n){
@ -103,10 +104,13 @@ function initChip(){
refresh(); refresh();
cycle = 0; cycle = 0;
trace = Array(); trace = Array();
initLogbox(logThese);
chipStatus(); chipStatus();
if(ctrace)console.log('initChip done after', now()-start); if(ctrace)console.log('initChip done after', now()-start);
} }
var logThese=['sync','irq','nmi','ab','db','rw','pc','a','x','y','s'];
function step(){ function step(){
trace[cycle]= {chip: stateString(), mem: getMem()}; trace[cycle]= {chip: stateString(), mem: getMem()};
halfStep(); halfStep();
@ -175,6 +179,24 @@ function readBits(name, n){
return res; return res;
} }
function hexBus(busname){
var nodenamelist=[];
// console.log('hexBus called: ' + busname);
for(i in nodenames){nodenamelist.push(i)};
if(busname=='pc')
return hexBus('pch') + hexBus('pcl');
var width=0;
for(var i in nodenamelist){
if(nodenamelist[i].search("^"+busname+"[0-9]")==0)
width++;
}
if(width==0)
return isNodeHigh(nodenames[busname])?1:0;
if(width>16)
return -1;
return (0x10000+readBits(busname,width)).toString(16).slice(-width/4);
}
function writeDataBus(x){ function writeDataBus(x){
var recalcs = Array(); var recalcs = Array();
for(var i=0;i<8;i++){ for(var i=0;i<8;i++){
@ -259,29 +281,48 @@ function chipStatus(){
' Y:' + hexByte(readY()) + ' Y:' + hexByte(readY()) +
' SP:' + hexByte(readSP()) + ' SP:' + hexByte(readSP()) +
' ' + readPstring(); ' ' + readPstring();
setStatus(machine1 + "<br>" + machine2);
if (loglevel>1) {
updateLogbox(logThese);
}
selectCell(ab);
}
function initLogbox(names){
logStream = [];
logStream.push("<td>" + names.join("</td><td>") + "</td>");
}
function updateLogbox(names){
var logbox=document.getElementById('logstream');
var signals=[];
for(i in names){
signals.push(hexBus(names[i]));
}
logStream.push("<td>" + signals.join("</td><td>") + "</td>");
logbox.innerHTML = "<tr>"+logStream.join("</tr><tr>")+"</tr>";
var machine3 = var machine3 =
' Sync:' + readBit('sync') ' Sync:' + readBit('sync') +
' IRQ:' + readBit('irq') + ' IRQ:' + readBit('irq') +
' NMI:' + readBit('nmi'); ' NMI:' + readBit('nmi');
var machine4 = var machine4 =
' IR:' + hexByte(255 - readBits('notir', 8)) + ' IR:' + hexByte(readBits('ir', 8)) +
' TCstate:' + readBit('clock1') + readBit('clock2') + ' TCstate:' + readBit('clock1') + readBit('clock2') +
readBit('t2') + readBit('t3') + readBit('t4') + readBit('t5'); readBit('t2') + readBit('t3') + readBit('t4') + readBit('t5');
var machine5 = var machine5 =
' idl:' + hexByte(readBits('idl', 8)) + ' idl:' + hexByte(readBits('idl', 8)) +
' alu:' + hexByte(readBits('alu', 8)) + ' alu:' + hexByte(readBits('alu', 8)) +
' idb:' +hexByte(readBits('idb',8)) + ' idb:' + hexByte(readBits('idb',8)) +
' dor:' + hexByte(readBits('dor',8)); ' dor:' + hexByte(readBits('dor',8));
var machine6 = var machine6 =
' notRdy0:' + readBit('notRdy0') + ' notRdy0:' + readBit('notRdy0') +
' fetch:' + readBit('fetch') + ' fetch:' + readBit('fetch') +
' clearIR:' + readBit('clearIR') + ' clearIR:' + readBit('clearIR') +
' D1x1:' + readBit('D1x1'); ' D1x1:' + readBit('D1x1');
setStatus(machine1 + "<br>" + machine2);
if (loglevel>2) {
console.log(machine1 + " " + machine2 + " " + machine3 + " " + machine4 + " " + machine5);
}
selectCell(ab);
} }
function getMem(){ function getMem(){

View File

@ -79,6 +79,12 @@ img.navstop{
border: 0px; border: 0px;
} }
table.logstream {
font-family: monospace;
font-size: 12px;
border-spacing: 1px;
}
table.memtable { table.memtable {
position: absolute; position: absolute;
top: 78px; top: 78px;

View File

@ -319,6 +319,16 @@ function findNodeNumber(x,y){
return (high<<8)+(mid<<4)+low; return (high<<8)+(mid<<4)+low;
} }
function updateExpertMode(on){
if(on){
document.getElementById('controlPanel').style.visibility = 'visible';
loglevel=4;
} else {
document.getElementById('controlPanel').style.visibility = 'hidden';
loglevel=0;
}
}
function updateShow(layer, on){ function updateShow(layer, on){
drawlayers[layer]=on; drawlayers[layer]=on;
setupBackground(); setupBackground();