trying to clean up gh-pages

This commit is contained in:
BigEd 2011-04-01 11:59:22 +00:00
parent baac06bdc3
commit b0710a4cda
11 changed files with 4111 additions and 3859 deletions

View File

@ -2,7 +2,7 @@
<head> <head>
<title>Visual 6502 in JavaScript</title> <title>Visual 6502 in JavaScript</title>
<style type="text/css">@import "wires.css";</style> <style type="text/css">@import "kiosk.css";</style>
</head> </head>
<body> <body>

View File

@ -153,10 +153,31 @@ div#logstreamscroller{
table.logstream { table.logstream {
font-family: monospace; font-family: monospace;
font-size: 12px; font-size: 12px;
border-spacing: 2px; border-collapse: collapse;
text-align:center; text-align:center;
} }
td {
padding-left: 3px;
padding-right: 3px;
}
td.header {
background-color: rgb(187, 204, 255); /* medium-dark blue */
}
td.oddcol {
background-color: rgb(227, 233, 255); /* light blue */
}
td.oddrow {
background-color: rgb(207, 218, 255); /* medium blue */
}
td.oddrowcol {
background-color: rgb(227, 233, 255); /* light blue */
}
/* Splitter */ /* Splitter */
#frame { #frame {
height: 750px; height: 750px;
@ -205,5 +226,3 @@ span#plain {
display: block; display: block;
margin-bottom: 4px; margin-bottom: 4px;
} }

View File

@ -2,237 +2,19 @@
<head> <head>
<title>Visual 6502 in JavaScript</title> <title>Visual 6502 in JavaScript</title>
<style type="text/css"> <style type="text/css">@import "expert.css";</style>
/* <script src="segdefs.js"></script>
Copyright (c) 2010 Brian Silverman, Barry Silverman, Ed Spittles <script src="transdefs.js"></script>
<script src="nodenames.js"></script>
Permission is hereby granted, free of charge, to any person obtaining a copy <script src="wires.js"></script>
of this software and associated documentation files (the "Software"), to deal <script src="expertWires.js"></script>
in the Software without restriction, including without limitation the rights <script src="chipsim.js"></script>
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell <script src="memtable.js"></script>
copies of the Software, and to permit persons to whom the Software is <script src="macros.js"></script>
furnished to do so, subject to the following conditions: <script src="testprogram.js"></script>
<script src="3rdparty/jquery-1.3.2.min.js"></script>
The above copyright notice and this permission notice shall be included in <script src="3rdparty/jquery.cookie.js"></script>
all copies or substantial portions of the Software. <script src="3rdparty/splitter.js"></script>
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
body {
background: white;
color: black;
font-family :Verdana, Arial, Helvetica, Sans-Serif;
font-size: 12px;
}
#title {
font-size: 30px;
font-weight: bold;
}
div.frame {
margin-left: 10px;
min-width: 1120px; /* ugh - prevent memtable flowing underneath chip */
}
div.leftcolumn {
width: 804px; /* ugh - matches the div.chip width + border */
}
div.rightcolumn {
padding-left: 8px;
}
div.footer {
clear: both;
padding-top: 10px;
}
div.nochip {
display:none;
}
div#chipsurround {
height: 600px; /* matches the div.chip height */
}
div.chip {
background: lightgray;
border: 2px solid gray;
position: absolute; /* must be absolute to contain the canvas */
width: 800px;
height: 600px;
overflow: hidden;
}
canvas.chip {
position: absolute;
width: 600px; /* square chip image same height as div.chip */
height: 600px; /* square */
}
div.twobuttons{
float:left;
}
div.morebuttons{
float:left;
}
div.buttons{
/* top: -5px; */
}
div.status {
clear: left;
padding-top: 10px;
padding-bottom: 10px;
font-family: monospace;
font-size: 12px;
}
img.navbutton {
border: 0px;
}
img.navplay {
margin-right: 5px;
border: 0px;
}
img.navstop {
position: absolute;
border: 0px;
}
span.expertcheckbox {
margin-left: 20px;
}
table.memtable {
font-family: monospace;
font-size: 12px;
border-spacing: 0px;
overflow: auto;
}
div#layoutControlPanel{
display:none;
margin-top: 2px;
margin-bottom: 2px;
}
div#expertControlPanel{
display:none;
}
span.animatebox{
border:thin solid;
padding:2px;
border-color:gray;
}
a#linkHere{
padding:2px;
}
textarea#consolebox{
font-family:courier,monospace;
border: 1px solid gray;
margin: 2px;
padding: 2px;
width: 80em;
}
div#logstreamscroller{
overflow:auto;
}
table.logstream {
font-family: monospace;
font-size: 12px;
border-collapse: collapse;
text-align:center;
}
td {
padding-left: 3px;
padding-right: 3px;
}
td.header {
background-color: rgb(187, 204, 255); /* medium-dark blue */
}
td.oddcol {
background-color: rgb(227, 233, 255); /* light blue */
}
td.oddrow {
background-color: rgb(207, 218, 255); /* medium blue */
}
td.oddrowcol {
background-color: rgb(227, 233, 255); /* light blue */
}
/* Splitter */
#frame {
height: 750px;
}
div.leftcolumn, div.rightcolumn, {
overflow: auto;
}
div#righttopdiv, div#tracingdiv {
overflow: auto;
background-color: white;
}
div.rightcolumn {
background-color: white;
}
.vsplitbar {
width: 5px;
background: #aaa;
}
.vsplitbar {
width: 6px;
background: #669 url(data:image/gif;base64,R0lGODlhAgAgAOcAAHNxbb+8tuzr6QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAEALAAAAAACACAAAAgbAAMIHEiwYAABABIKRKjwYEIACx9GbGiwYsGAADs=) no-repeat center;
}
.vsplitbar:hover, .vsplitbar.active {
background: #c66 url(data:image/gif;base64,R0lGODlhAgAgAOcAAHNxbb+8tuzr6QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAEALAAAAAACACAAAAgbAAMIHEiwYAABABIKRKjwYEIACx9GbGiwYsGAADs=) no-repeat center;
opacity: 0.7;
filter: alpha(opacity=70); /* IE */
background: #c99;
}
.hsplitbar {
height: 6px;
background: #669 url(data:image/gif;base64,R0lGODlhIAACAOcAAHNxbb+8tuzr6QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAEALAAAAAAgAAIAAAgfAAMIHChQAIAABhEeTJiQoMOHAgEclBiAosWDEAUGBAA7) no-repeat center;
}
.hsplitbar.active, .hsplitbar:hover {
background: #c66 url(data:image/gif;base64,R0lGODlhIAACAOcAAHNxbb+8tuzr6QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAEALAAAAAAgAAIAAAgfAAMIHChQAIAABhEeTJiQoMOHAgEclBiAosWDEAUGBAA7) no-repeat center;
}
span#plain {
display: block;
margin-bottom: 4px;
}
</style>
<script src="expert-allinone.js"></script>
<script type="text/javascript"> <script type="text/javascript">
function handleOnload() { function handleOnload() {
@ -322,15 +104,15 @@ $().ready(function(){
<div id="righttopdiv"> <div id="righttopdiv">
<div class = "buttons"> <div class = "buttons">
<div class="twobuttons"> <div class="twobuttons">
<a href ="javascript:stopChip()" id="stop"><img class="navstop" src="data:image/png;base64,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" title="stop"></a> <a href ="javascript:stopChip()" id="stop"><img class="navstop" src="images/stop.png" title="stop"></a>
<a href ="javascript:runChip()" id="start"><img class="navplay" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAIAAABvFaqvAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAFMSURBVDhPxZXblURAEIY7AzIgBBnYDKQgBBmQARmQASHIgAzIgAx2P6f70PRlzNPW00x31Xfq1j/xa7N937uuy/P8R7OiKIZhsPpzKB4XIKqqCsNQOIwrHHB7BN5A8zzHcexC6OdJkuCssy4QF55ETDrOOkuBvqVILqx1XWVeCkSqbyoyfRjGBWJAVkoURW/ohKuMXA0uy7Lv+yAI/DiqOUB0x+UHCI9t27Is87PolGiaxg+SLWjb1pMaiyrYrjcgWMuypGlqdT4g70EytbquTdY/gTxdPxp99MlhcmrSpmnyrNU4joJ3/BEE0TN+HopaSHTH6kc85bgmdYagUwp0rJPNQHxca9KR2qQerWcJ/DtNm2+vnz+uAj0gQs5p3BTyK5ZOuUo7wWzDR51ELcyvwFP8IdI8KrdKHYeoj6n8lozO1CSRTTtNvzJ//wGssktlBFiR0wAAAABJRU5ErkJggg==" title="run"></a> <a href ="javascript:runChip()" id="start"><img class="navplay" src="images/play.png" title="run"></a>
</div> </div>
<div class="morebuttons"> <div class="morebuttons">
<a href ="javascript:resetChip()"><img class="navbutton" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAADUSURBVHjaxNSxSkJRGMDx31UjKBDcmloKpKkafQTBqU3HnsShoSVw8QV8gyBoc7GXaEnBoZbmyLDbcg9IpF3vPeAH//UHB77zJWma2sW0cBkLq2KEYSzwGt/4wlVZ7BzvSLPmOC2KNfC0goUecVAEHP6BhW62xXpYbgA/0cmLXeB1Axaa4eQ/7BCTHFjoAXvrsASDLbBQfx3YxaIA+IH2b+wMbwWw0AuOA1bHuAQWusd+FbfZc8tOM/ueuVYkb8813OEoW+QyU8M0iX1gK7EvcXTwZwCOzI551u9wnQAAAABJRU5ErkJggg==" title="reset"></a> <a href ="javascript:resetChip()"><img class="navbutton" src="images/up.png" title="reset"></a>
<a href ="javascript:stepBack()"><img class="navbutton" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAADpSURBVHjarNQ/K4VRHMDxT1Kmm9dgv6UYlMkLoCuzlMHrsCgZlMHg2ikGq1KYvASDkomXQAb8LM9TpwePe55zv3WW0+nb+Xb+iAgRoQPreMF+7YgIOgh7OMAXAmepcDJzV30MsZjMfaQLJjJkG7huyH4yQnIPh1Xeb+MkJ3m2SlwYNaMteRM3ObK/kqdx1JKYlTyHY8zrSJq8hbsSWVP4ijeFpMLT6o7djksID1jGXvMFlJxyzRqec0+57R5eYAlXJclNHrGKHXyWJjcZ4Om/5Nz/cAaX4xTCFLbxXgnPS4U1K7jHbir8HgAtx8meSMRH3QAAAABJRU5ErkJggg==" title="back"></a> <a href ="javascript:stepBack()"><img class="navbutton" src="images/prev.png" title="back"></a>
<a href ="javascript:stepForward()"><img class="navbutton" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAADsSURBVHjarNU9SgNRFMXxH0FIJdmIIGghuIYEswARLFJowC3YCGIRSJHCDVjEwloCSSrBwtZCCLHKEhQLddLMhPAwycw8L5ziffDnnMflPkmSyIQOZjhWsBaMANhHgl90sR0LvEuBmZ6wUwRY2XDvEEOcFM6+wuGyeuueIG/kUM/YjYkc1gFGOP2PyKFuUYuNHOoFezGRw9pPW6uVbcQC4RMf2WIrEjbGGd5iHX7jBvVlWFmHM1zg4a/DosAB2pisupA38g+u0FwHy9vYUxzlnQmbIj/iHO9lp8196uoLl6jGDthrvKJR9guYDwCRfOTGEZMQ+QAAAABJRU5ErkJggg==" title="forward"></a> <a href ="javascript:stepForward()"><img class="navbutton" src="images/next.png" title="forward"></a>
<a href ="javascript:goUntilSyncOrWrite()"><img class="navbutton" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAAAAACo4kLRAAABBklEQVQYlW2QvUoDYRBFz11Xg0XwDfwNpoqmsFmIICjYKDa+gNailYUgKAGLBBsL6+BbCP4XUZRgYbALdiGdhQGFbPYbC9c1YKYZOFwuc0bG//GaJw0M2qdPGFxv3wHUppZfQ2fNmVyt4+xguGJmHtHV7osgqu9UndlXG/BQdLnXcqDH/Tr66cSse7Hx7DB3v3kbxlA4booNcNQP3wDwAQjPPwC61VScBLDw4R0g+vyDBp0WJB5evAfSvUaAEMEoQowl0DS4cgQmbz7o6VwtZwALjqd/oSiUsyDypbnEyF8/mxDYUiWQxccPLRbHBf5sKafY3U8vbGUFqcJaXjCZGQHU9/N9GN97qluZ9jH/GAAAAABJRU5ErkJggg==" title="step"></a> <a href ="javascript:goUntilSyncOrWrite()"><img class="navbutton" src="images/singlestep.png" title="step"></a>
<a href ="javascript:goFor()"><img class="navbutton" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAAAAACo4kLRAAABCElEQVQYlXXQP0tCcRjF8e/z80JoDibZPzIj5xobegWBu4OSTQYhNERgLQqGQwQREZVTQWtBr6D34uxgISoW3dNw722RzvjhOXB4TEzHwcvrBOD9cUh0IZWz9xNfamba/R9JkpBKZJ5HvhrMtQe+JMmB0Wu9fcvo3zyNFNZLmFu4HTcwl6oPJckDQ+pdpr+QPh9ylQSGVAaI5QuA2cr1QIoQcoBhiasPub/FXUAwvusSoZECMEsd5wM0M9Z2MIP02X4iQInsxRaSJc9rcQvrttoqzoBl6tU44AGw2Cg6YPakGiNAsdwpGGK+eRgUPXDrp7sObOmo4izCze09D9g4qCUt3PfP56fzCzEeY2myljT2AAAAAElFTkSuQmCC" title="fastforward"></a> <a href ="javascript:goFor()"><img class="navbutton" src="images/fastforward.png" title="fastforward"></a>
</div> </div>
<div style="float:right;"> <div style="float:right;">
<a href="http://visual6502.org/wiki/index.php?title=JssimUserHelp" target="_blank">User Guide</a> <a href="http://visual6502.org/wiki/index.php?title=JssimUserHelp" target="_blank">User Guide</a>

View File

@ -24,6 +24,8 @@ var centerx=300, centery=300;
var zoom=1; var zoom=1;
var dragMouseX, dragMouseY, moved; var dragMouseX, dragMouseY, moved;
var statbox; var statbox;
var findThese;
var labelThese=[];
// Some constants for the graphics presentation // Some constants for the graphics presentation
// the canvas is embedded in an 800x600 clipping div // the canvas is embedded in an 800x600 clipping div
@ -173,6 +175,14 @@ function setupParams(){
} else if(name=="zoom" && parseInt(value)!=NaN){ } else if(name=="zoom" && parseInt(value)!=NaN){
zoom=parseInt(value); zoom=parseInt(value);
} else } else
// perform a search, highlight and zoom to object(s)
if(name=="find" && value.length>0){
findThese=value;
} else
// affix label with optional box to highlight an area of interest
if(name=="label" && value.length>0){
labelThese.push(value.split(","));
} else
// load a test program: Address, Data and Reset // load a test program: Address, Data and Reset
if(name=="a" && parseInt(value,16)!=NaN){ if(name=="a" && parseInt(value,16)!=NaN){
userAddress=parseInt(value,16); userAddress=parseInt(value,16);
@ -236,7 +246,7 @@ function updateChipLayoutAnimation(isOn){
// these keyboard actions are primarily for the chip display // these keyboard actions are primarily for the chip display
function handleKey(e){ function handleKey(e){
var c = e.charCode; var c = e.charCode || e.keyCode;
c = String.fromCharCode(c); c = String.fromCharCode(c);
if('<>?npZzx'.indexOf(c)==-1) return; if('<>?npZzx'.indexOf(c)==-1) return;
if((c=='Z'||c=='x'||c=='<') && zoom>1) setZoom(zoom/1.2); if((c=='Z'||c=='x'||c=='<') && zoom>1) setZoom(zoom/1.2);
@ -301,35 +311,141 @@ function recenter(){
top: top+'px', top: top+'px',
left: left+'px', left: left+'px',
}); });
document.getElementById('linkHere').href=location.pathname+"?"+whereAmIAsQuery(); updateLinkHere();
}
function updateLinkHere(){
var target = location.pathname + "?nosim=t&";
var findlist = document.getElementById('HighlightThese').value.split(/[\s,]+/).join(",");
if (findlist != "")
target = target + "find=" + findlist + "&";
target = target + whereAmIAsQuery();
document.getElementById('linkHere').href=target;
}
// place a text label on the highlight layer
// with an optional box around an area of interest
// coordinates used are those reported by a click
// for example:
// boxLabel(['PD', 50, 8424, 3536, 9256, 2464])
// boxLabel(['IR', 50, 8432, 2332, 9124, 984])
// boxLabel(['PLA', 100, 1169, 2328, 8393, 934])
// boxLabel(['Y', 50, 2143, 8820, 2317, 5689])
// boxLabel(['X', 50, 2317, 8820, 2490, 5689])
// boxLabel(['S', 50, 2490, 8820, 2814, 5689])
// boxLabel(['ALU', 50, 2814, 8820, 4525, 5689])
// boxLabel(['DAdj', 40, 4525, 8820, 5040, 5689])
// boxLabel(['A', 50, 5040, 8820, 5328, 5689])
// boxLabel(['PC', 50, 5559, 8820, 6819, 5689])
// boxLabel(['ID', 50, 7365, 8820, 7676, 5689])
// boxLabel(['TimC', 40, 600, 1926, 1174, 604])
function flashBoxLabel(args) {
clearHighlight();
var callBack = function(){boxLabel(args);};
setTimeout(callBack, 400);
setTimeout(clearHighlight, 800);
setTimeout(callBack, 1200);
}
function boxLabel(args) {
var text = args[0];
var textsize = args[1];
var thickness = 1+ textsize / 20;
var boxXmin = args[2] * grCanvasSize / grChipSize;
var boxYmin = args[3] * grCanvasSize / grChipSize;
var boxXmax = args[4] * grCanvasSize / grChipSize;
var boxYmax = args[5] * grCanvasSize / grChipSize;
ctx.lineWidth = thickness;
ctx.font = textsize + 'px sans-serif';
ctx.fillStyle = '#ff0'; // yellow
ctx.fillStyle = '#f8f'; // magenta
ctx.fillStyle = '#fff'; // white
ctx.strokeStyle = '#fff'; // white
if(args.length>4){
ctxDrawBox(ctx, boxXmin, boxYmin, boxXmax, boxYmax);
// offset the text label to the interior of the box
boxYmin -= thickness * 2;
}
ctx.strokeStyle = '#fff'; // white
ctx.strokeStyle = '#000'; // black
ctx.lineWidth = thickness*2;
ctx.strokeText(text, boxXmin, boxYmin);
ctx.fillText(text, boxXmin, boxYmin);
} }
var highlightThese; var highlightThese;
// flash some set of nodes according to user input // flash some set of nodes according to user input
// also zoom to fit those nodes (not presently optional)
function hiliteNodeList(){ function hiliteNodeList(){
var tmplist = document.getElementById('HighlightThese').value.split(/[\s,]+/); var tmplist = document.getElementById('HighlightThese').value.split(/[\s,]+/);
if(tmplist.length==0){ if(tmplist.join("").length==0){
// request to highlight nothing, so switch off any signal highlighting // request to highlight nothing, so switch off any signal highlighting
hiliteNode(-1); hiliteNode(-1);
return; return;
} }
highlightThese = []; highlightThese = [];
var seglist=[];
var report="";
for(var i=0;i<tmplist.length;i++){ for(var i=0;i<tmplist.length;i++){
// get a node number from a signal name or a node number // get a node number from a signal name or a node number
var name = tmplist[i]; var name = tmplist[i];
var value = parseInt(tmplist[i]); var value = parseInt(tmplist[i]);
if((value!=NaN) && (typeof nodes[name] != "undefined")) { if((value!=NaN) && (typeof nodes[value] != "undefined")) {
highlightThese.push(value); highlightThese.push(value);
report="node: " + value + ' ' + nodeName(value);
for(var s in nodes[value].segs)
seglist.push(nodes[value].segs[s]);
} else if(typeof nodenames[name] != "undefined") { } else if(typeof nodenames[name] != "undefined") {
highlightThese.push(nodenames[name]); highlightThese.push(nodenames[name]);
report="node: " + nodenames[name] + ' ' + name;
for(var s in nodes[nodenames[name]].segs)
seglist.push(nodes[nodenames[name]].segs[s]);
} else if(typeof transistors[name] != "undefined") {
// normally we push numbers: a non-number is a transistor name
highlightThese.push(name);
report="transistor: " + name;
seglist.push([
transistors[name].bb[0],transistors[name].bb[2],
transistors[name].bb[1],transistors[name].bb[3]
]);
} else {
// allow match of underscore-delimited components, so
// SUMS and dpc17 both match the node dpc17_SUMS
for(var i in nodenames){
re=new RegExp("(^" + name + "_|_" + name + "$)");
if (re.test(i)){
value = nodenames[i];
highlightThese.push(value);
report="node: " + value + ' ' + nodeName(value);
for(var s in nodes[value].segs)
seglist.push(nodes[value].segs[s]);
break;
}
}
} }
// invalid input: how to tell the user?
} }
if(highlightThese.length==0){ if(highlightThese.length==0){
// all input rejected: how to tell the user? setStatus('Find: nothing found!','(Enter a list of nodenumbers, names or transistor names)');
return; return;
} else if (highlightThese.length==1){
setStatus('Find results:',report);
} else {
setStatus('Find: multiple objects found','(' + highlightThese.length + ' objects)');
} }
var xmin=seglist[0][0], xmax=seglist[0][0];
var ymin=seglist[0][1], ymax=seglist[0][1];
for(var s in seglist){
for(var i=0;i<seglist[s].length;i+=2){
if(seglist[s][i]<xmin) xmin=seglist[s][i];
if(seglist[s][i]>xmax) xmax=seglist[s][i];
if(seglist[s][i+1]<ymin) ymin=seglist[s][i+1];
if(seglist[s][i+1]>ymax) ymax=seglist[s][i+1];
}
}
zoomToBox(xmin,xmax,ymin,ymax);
updateLinkHere();
clearHighlight(); // nullify the simulation overlay (orange/purple) clearHighlight(); // nullify the simulation overlay (orange/purple)
hiliteNode(-1); // unhighlight all nodes hiliteNode(-1); // unhighlight all nodes
setTimeout("hiliteNode(highlightThese);", 400); setTimeout("hiliteNode(highlightThese);", 400);
@ -337,22 +453,53 @@ function hiliteNodeList(){
setTimeout("hiliteNode(highlightThese);", 1200); setTimeout("hiliteNode(highlightThese);", 1200);
} }
// some notes on coordinates:
// the localx and localy functions return canvas coordinate offsets from the canvas window top left corner
// we divide the results by 'zoom' to get drawn coordinates useful in findNodeNumber
// to convert to reported user chip coordinates we multiply by grChipSize/600
// to compare to segdefs and transdefs coordinates we subtract 400 from x and subtract y from grChipSize
function handleClick(e){ function handleClick(e){
var x = localx(hilite, e.clientX)/zoom; var x = localx(hilite, e.clientX)/zoom;
var y = localy(hilite, e.clientY)/zoom; var y = localy(hilite, e.clientY)/zoom;
var w = findNodeNumber(x,y); var w = findNodeNumber(x,y);
if(e.shiftKey) hiliteNode(getNodeGroup(w)); // convert to chip coordinates
else {var a=new Array(); a.push(w); hiliteNode(a);}
var cx = Math.round(x*grChipSize/600); var cx = Math.round(x*grChipSize/600);
var cy = Math.round(y*grChipSize/600); var cy = Math.round(y*grChipSize/600);
// prepare two lines of status report
var s1='x: ' + cx + ' y: ' + cy;
var s2='node:&nbsp;' + w + '&nbsp;' + nodeName(w);
if(w==-1) { if(w==-1) {
setStatus('x: '+cx, 'y: '+cy); setStatus(s1); // no node found, so report only coordinates
} else { return;
var s1='x: ' + cx + ' y: ' + cy;
var s2='node: ' + w + ' ' + nodeName(w);
setStatus(s1, s2);
if(ctrace) console.log(s1, s2);
} }
// we have a node, but maybe we clicked over a transistor
var nodelist=[w];
// match the coordinate against transistor gate bounding boxes
x=cx-400;
y=grChipSize-cy;
for(var i=0;i<nodes[w].gates.length;i++){
var xmin=nodes[w].gates[i].bb[0], xmax=nodes[w].gates[i].bb[1];
var ymin=nodes[w].gates[i].bb[2], ymax=nodes[w].gates[i].bb[3];
if((x >= xmin) && (x <= xmax) && (y >= ymin) && (y <= ymax)){
// only one match at most, so we replace rather than push
nodelist=[nodes[w].gates[i].name];
s2='transistor: ' + nodes[w].gates[i].name + ' on ' + s2;
}
}
// if this is a shift-click, just find and highlight the pass-connected group
// and list the nodes (or nodenames, preferably)
if(e.shiftKey) {
getNodeGroup(w);
nodelist = group;
s2 = "nodegroup from&nbsp;" + s2 +
" (nodes:&nbsp;" +
group.map(function(x){return nodeName(x)?nodeName(x):x;}).join(",") +
")";
}
hiliteNode(nodelist);
setStatus(s1, s2);
if(ctrace) console.log(s1, s2);
} }
function updateLoglevel(value){ function updateLoglevel(value){
@ -374,7 +521,7 @@ var consolebox;
function setupConsole(){ function setupConsole(){
consolebox=document.getElementById('consolebox'); consolebox=document.getElementById('consolebox');
consolebox.onkeypress=function(e){consolegetc=e.charCode;}; consolebox.onkeypress=function(e){consolegetc=e.charCode || e.keyCode;};
} }
var chipsurround; var chipsurround;
@ -417,8 +564,19 @@ function setupChipLayoutGraphics(){
refresh(); refresh();
document.getElementById('waiting').style.display = 'none'; document.getElementById('waiting').style.display = 'none';
setStatus('Ready!'); // would prefer chipStatus but it's not idempotent setStatus('Ready!'); // would prefer chipStatus but it's not idempotent
// pre-fill the Find box if parameters supplied
if(typeof findThese != "undefined") {
document.getElementById('HighlightThese').value = findThese;
hiliteNodeList(); // will pan and zoom to fit
}
// pre-pan and zoom if requested (will override any zoom-to-fit by hiliteNodeList)
if(moveHereFirst!=null) if(moveHereFirst!=null)
moveHere(moveHereFirst); moveHere(moveHereFirst);
// draw any URL-requested labels and boxes
if(labelThese.length>0) {
for(var i=0;i<labelThese.length;i+=1)
flashBoxLabel(labelThese[i]);
}
// grant focus to the chip display to enable zoom keys // grant focus to the chip display to enable zoom keys
chipsurround.focus(); chipsurround.focus();
chipsurround.onmousedown = function(e){mouseDown(e);}; chipsurround.onmousedown = function(e){mouseDown(e);};

View File

@ -62,11 +62,11 @@ lots of RAM. If you have trouble, please <a href="browsertrouble.html">check com
<br /> <br />
<span id="browsertrouble"></span> <span id="browsertrouble"></span>
<br /> <br />
Hit '>' to zoom in, '<' to zoom out Keyboard controls: 'z' to zoom in, 'x' to zoom out, 'n' to step the simulation.
<br /> <br />
Left-click and drag to scroll around Mouse controls: Left-click and drag to scroll around (when you're zoomed in.)
<br /> <br />
Enter your own program into the array of RAM More information in the <a href="http://visual6502.org/wiki/index.php?title=JssimUserHelp">User Guide<a>.
<br /> <br />
<br /> <br />
</span> </span>

View File

@ -88,6 +88,7 @@ function setup_part2(){
function setup_part3(){ function setup_part3(){
loadProgram(); loadProgram();
writeTriggers={}; // kiosk mode does not handle I/O
initChip(); initChip();
document.getElementById('stop').style.visibility = 'hidden'; document.getElementById('stop').style.visibility = 'hidden';
go(); go();
@ -101,11 +102,11 @@ function setup_part3(){
///////////////////////// /////////////////////////
function handleKey(e){ function handleKey(e){
var c = e.charCode; var c = e.charCode || e.keyCode;
c = String.fromCharCode(c); c = String.fromCharCode(c);
if('<>?np'.indexOf(c)==-1) return; if('zx<>?np'.indexOf(c)==-1) return;
if(c=='<' && zoom>1) setZoom(zoom/1.2); if((c=='x' || c=='<') && zoom>1) setZoom(zoom/1.2);
else if(c=='>' && zoom<grMaxZoom) setZoom(zoom*1.2); else if((c=='z' || c=='>') && zoom<grMaxZoom) setZoom(zoom*1.2);
else if(c=='?') setZoom(1); else if(c=='?') setZoom(1);
else if(c=='n') stepForward(); else if(c=='n') stepForward();
else if(c=='p') stepBack(); else if(c=='p') stepBack();
@ -168,7 +169,10 @@ function handleClick(e){
var x = localx(hilite, e.clientX)/zoom; var x = localx(hilite, e.clientX)/zoom;
var y = localy(hilite, e.clientY)/zoom; var y = localy(hilite, e.clientY)/zoom;
var w = findNodeNumber(x,y); var w = findNodeNumber(x,y);
if(e.shiftKey) hiliteNode(getNodeGroup(w)); if(e.shiftKey) {
getNodeGroup(w);
hiliteNode(group);
}
else {var a=new Array(); a.push(w); hiliteNode(a);} else {var a=new Array(); a.push(w); hiliteNode(a);}
var cx = Math.round(x*grChipSize/600); var cx = Math.round(x*grChipSize/600);
var cy = Math.round(y*grChipSize/600); var cy = Math.round(y*grChipSize/600);

View File

@ -264,7 +264,7 @@ function readPstring(){
result = (isNodeHigh(nodenames['p7'])?'N':'n') + result = (isNodeHigh(nodenames['p7'])?'N':'n') +
(isNodeHigh(nodenames['p6'])?'V':'v') + (isNodeHigh(nodenames['p6'])?'V':'v') +
'&#8209' + // non-breaking hyphen '&#8209' + // non-breaking hyphen
(isNodeHigh(nodenames['p3'])?'B':'b') + (isNodeHigh(nodenames['p4'])?'B':'b') +
(isNodeHigh(nodenames['p3'])?'D':'d') + (isNodeHigh(nodenames['p3'])?'D':'d') +
(isNodeHigh(nodenames['p2'])?'I':'i') + (isNodeHigh(nodenames['p2'])?'I':'i') +
(isNodeHigh(nodenames['p1'])?'Z':'z') + (isNodeHigh(nodenames['p1'])?'Z':'z') +
@ -330,9 +330,9 @@ function busToString(busname){
if(busname=='State') if(busname=='State')
return listActiveTCStates(); return listActiveTCStates();
if(busname=='Execute') if(busname=='Execute')
return dis6502[readBits('ir',8)]; return dis6502toHTML(readBits('ir',8));
if(busname=='Fetch') if(busname=='Fetch')
return isNodeHigh(nodenames['sync'])?dis6502[readDataBus()]:''; return isNodeHigh(nodenames['sync'])?dis6502toHTML(readDataBus()):"";
if(busname=='plaOutputs') if(busname=='plaOutputs')
// PLA outputs are mostly ^op- but some have a prefix too // PLA outputs are mostly ^op- but some have a prefix too
// - we'll allow the x and xx prefix but ignore the # // - we'll allow the x and xx prefix but ignore the #
@ -462,12 +462,14 @@ function chipStatus(){
' SP:' + hexByte(readSP()) + ' SP:' + hexByte(readSP()) +
' ' + readPstring(); ' ' + readPstring();
var machine3 = var machine3 =
'Hz: ' + estimatedHz().toFixed(1) + 'Hz: ' + estimatedHz().toFixed(1);
' Exec: ' + busToString('Execute') + '(' + busToString('State') + ')'; if(typeof expertMode != "undefined") {
if(isNodeHigh(nodenames['sync'])) machine3 += ' Exec: ' + busToString('Execute') + '(' + busToString('State') + ')';
machine3 += ' (Fetch: ' + busToString('Fetch') + ')'; if(isNodeHigh(nodenames['sync']))
if(goldenChecksum != undefined) machine3 += ' (Fetch: ' + busToString('Fetch') + ')';
machine3 += " Chk:" + traceChecksum + ((traceChecksum==goldenChecksum)?" OK":" no match"); if(goldenChecksum != undefined)
machine3 += " Chk:" + traceChecksum + ((traceChecksum==goldenChecksum)?" OK":" no match");
}
setStatus(machine1, machine2, machine3); setStatus(machine1, machine2, machine3);
if (loglevel>0) { if (loglevel>0) {
updateLogbox(logThese); updateLogbox(logThese);
@ -554,7 +556,7 @@ function initLogbox(names){
names=names.map(function(x){return x.replace(/^-/,'')}); names=names.map(function(x){return x.replace(/^-/,'')});
logStream = []; logStream = [];
logStream.push("<td>" + names.join("</td><td>") + "</td>"); logStream.push("<td class=header>" + names.join("</td><td class=header>") + "</td>");
logbox.innerHTML = "<tr>"+logStream.join("</tr><tr>")+"</tr>"; logbox.innerHTML = "<tr>"+logStream.join("</tr><tr>")+"</tr>";
} }
@ -577,16 +579,26 @@ function updateLogDirection(){
// update the table of signal values, by prepending or appending // update the table of signal values, by prepending or appending
function updateLogbox(names){ function updateLogbox(names){
var signals=[]; var signals=[];
var odd=true;
var bg;
var row;
for(i in names){ for(var i in names){
signals.push(busToString(names[i])); if(cycle % 4 < 2){
bg = odd ? " class=oddcol":"";
} else {
bg = odd ? " class=oddrow":" class=oddrowcol";
}
signals.push("<td" + bg + ">" + busToString(names[i]) + "</td>");
odd =! odd;
} }
row = "<tr>" + signals.join("") + "</tr>";
if(logboxAppend) if(logboxAppend)
logStream.push("<td>" + signals.join("</td><td>") + "</td>"); logStream.push(row);
else else
logStream.splice(1,0,"<td>" + signals.join("</td><td>") + "</td>"); logStream.splice(1,0,row);
logbox.innerHTML = "<tr>"+logStream.join("</tr><tr>")+"</tr>"; logbox.innerHTML = logStream.join("");
} }
function getMem(){ function getMem(){
@ -612,6 +624,14 @@ function adler32(x){
return (0x100000000+(b<<16)+a).toString(16).slice(-8); return (0x100000000+(b<<16)+a).toString(16).slice(-8);
} }
// sanitised opcode for HTML output
function dis6502toHTML(byte){
var opcode=dis6502[byte];
if(typeof opcode == "undefined")
return "unknown"
return opcode.replace(/ /,'&nbsp;');
}
// opcode lookup for 6502 - not quite a disassembly // opcode lookup for 6502 - not quite a disassembly
// javascript derived from Debugger.java by Achim Breidenbach // javascript derived from Debugger.java by Achim Breidenbach
var dis6502={ var dis6502={

View File

@ -114,22 +114,42 @@ pch4: 948,
pch5: 49, pch5: 49,
pch6: 1551, pch6: 1551,
pch7: 205, pch7: 205,
pchp0: 780, // machine state: program counter high (pre-incremented?, second storage node) pchp0: 1722, // machine state: program counter high (pre-incremented?, second storage node output)
pchp1: 113, pchp1: 209,
pchp2: 114, pchp2: 1496,
pchp3: 124, pchp3: 141,
pchp4: 820, pchp4: 27,
pchp5: 33, pchp5: 1301,
pchp6: 751, pchp6: 652,
pchp7: 535, pchp7: 1206,
p0: 687, // machine state: status register "#pchp0": 780, // machine state: program counter high (pre-incremented?, inverse second storage node)
p1: 1444, "#pchp1": 113,
p2: 1421, "#pchp2": 114,
p3: 439, "#pchp3": 124,
p4: 1119, // there is no bit4 in the status register! "#pchp4": 820,
p5: -1, // there is no bit5 in the status register! "#pchp5": 33,
p6: 77, "#pchp6": 751,
p7: 1370, "#pchp7": 535,
// machine state: status register (not the storage nodes)
p0: 32, // C bit of status register (storage node)
p1: 627, // Z bit of status register (storage node)
p2: 1553, // I bit of status register (storage node)
p3: 348, // D bit of status register (storage node)
p4: 1119, // there is no bit4 in the status register! (not a storage node)
p5: -1, // there is no bit5 in the status register! (not a storage node)
p6: 77, // V bit of status register (storage node)
p7: 1370, // N bit of status register (storage node)
// internal bus: status register outputs for push P
Pout0: 687,
Pout1: 1444,
Pout2: 1421,
Pout3: 439,
Pout4: 1119, // there is no bit4 in the status register!
Pout5: -1, // there is no bit5 in the status register!
Pout6: 77,
Pout7: 1370,
s0: 1403, // machine state: stack pointer s0: 1403, // machine state: stack pointer
s1: 183, s1: 183,
s2: 81, s2: 81,
@ -155,12 +175,28 @@ notir5: 1394,
notir6: 895, notir6: 895,
notir7: 1320, notir7: 1320,
irline3: 996, // internal signal: PLA input - ir0 AND ir1 irline3: 996, // internal signal: PLA input - ir0 AND ir1
clock1: 1536, // internal state: timing control clock1: 1536, // internal state: timing control aka #T0
clock2: 156, // internal state: timing control clock2: 156, // internal state: timing control aka #T+
t2: 971, // internal state: timing control t2: 971, // internal state: timing control
t3: 1567, t3: 1567,
t4: 690, t4: 690,
t5: 909, t5: 909,
noty0: 1025, // datapath state: not Y register
noty1: 1138,
noty2: 1484,
noty3: 184,
noty4: 565,
noty5: 981,
noty6: 1439,
noty7: 1640,
notx0: 987, // datapath state: not X register
notx1: 1434,
notx2: 890,
notx3: 1521,
notx4: 485,
notx5: 1017,
notx6: 730,
notx7: 1561,
nots0: 418, // datapath state: not stack pointer nots0: 418, // datapath state: not stack pointer
nots1: 1064, nots1: 1064,
nots2: 752, nots2: 752,
@ -193,7 +229,7 @@ sb4: 1405,
sb5: 166, sb5: 166,
sb6: 1336, sb6: 1336,
sb7: 1001, sb7: 1001,
notalu0: 394, // datapath state: alu output storage node (inverse) notalu0: 394, // datapath state: alu output storage node (inverse) aka #ADD0
notalu1: 697, notalu1: 697,
notalu2: 276, notalu2: 276,
notalu3: 495, notalu3: 495,
@ -201,7 +237,7 @@ notalu4: 1490,
notalu5: 893, notalu5: 893,
notalu6: 68, notalu6: 68,
notalu7: 1123, notalu7: 1123,
alu0: 401, // datapath signal: ALU output alu0: 401, // datapath signal: ALU output aka ADD0out
alu1: 872, alu1: 872,
alu2: 1637, alu2: 1637,
alu3: 1414, alu3: 1414,
@ -218,7 +254,7 @@ dasb4: 1405, // same node as sb4
dasb5: 263, dasb5: 263,
dasb6: 679, dasb6: 679,
dasb7: 1494, dasb7: 1494,
adl0: 413, // internal state: address latch low adl0: 413, // internal bus: address low
adl1: 1282, adl1: 1282,
adl2: 1242, adl2: 1242,
adl3: 684, adl3: 684,
@ -226,7 +262,7 @@ adl4: 1437,
adl5: 1630, adl5: 1630,
adl6: 121, adl6: 121,
adl7: 1299, adl7: 1299,
adh0: 407, // internal state: address latch high adh0: 407, // internal bus: address high
adh1: 52, adh1: 52,
adh2: 1651, adh2: 1651,
adh3: 315, adh3: 315,
@ -234,7 +270,7 @@ adh4: 1160,
adh5: 483, adh5: 483,
adh6: 13, adh6: 13,
adh7: 1539, adh7: 1539,
idb0: 1108, // internal state: data buffer idb0: 1108, // internal bus: data bus
idb1: 991, idb1: 991,
idb2: 1473, idb2: 1473,
idb3: 1302, idb3: 1302,
@ -274,11 +310,61 @@ pd4: 369,
pd5: 829, pd5: 829,
pd6: 1669, pd6: 1669,
pd7: 1690, pd7: 1690,
notRdy0: 248, // internal signal: global pipeline control // internal signals: predecode latch partial decodes
"PD-xxxx10x0": 1019,
"PD-1xx000x0": 1294,
"PD-0xx0xx0x": 365,
"PD-xxx010x1": 302,
"PD-n-0xx0xx0x": 125,
"#TWOCYCLE": 851,
"#TWOCYCLE.phi1": 792,
"ONEBYTE": 778,
abl0: 1096, // internal bus: address bus low latched data out (inverse of inverted storage node)
abl1: 376,
abl2: 1502,
abl3: 1250,
abl4: 1232,
abl5: 234,
abl6: 178,
abl7: 567,
"#ABL0": 153, // internal state: address bus low latched data out (storage node, inverted)
"#ABL1": 107,
"#ABL2": 707,
"#ABL3": 825,
"#ABL4": 364,
"#ABL5": 1513,
"#ABL6": 1307,
"#ABL7": 28,
abh0: 1429, // internal bus: address bus high latched data out (inverse of inverted storage node)
abh1: 713,
abh2: 287,
abh3: 422,
abh4: 1143,
abh5: 775,
abh6: 997,
abh7: 489,
"#ABH0": 1062, // internal state: address bus high latched data out (storage node, inverted)
"#ABH1": 907,
"#ABH2": 768,
"#ABH3": 92,
"#ABH4": 668,
"#ABH5": 1128,
"#ABH6": 289,
"#ABH7": 429,
"branch-back": 626, // distinguish forward from backward branches
"branch-forward.phi1": 1110, // distinguish forward from backward branches
"branch-back.phi1": 771, // distinguish forward from backward branches in IPC logic
notRdy0: 248, // internal signal: global pipeline control
"notRdy0.phi1": 1272, // delayed pipeline control
"notRdy0.delay": 770, // global pipeline control latched by phi1 and then phi2
"#notRdy0.delay": 559, // global pipeline control latched by phi1 and then phi2 (storage node)
Reset0: 67, // internal signal: retimed reset from pin Reset0: 67, // internal signal: retimed reset from pin
C1x5Reset: 926, // retimed and pipelined reset in progress C1x5Reset: 926, // retimed and pipelined reset in progress
notRnWprepad: 187, // internal signal: to pad, yet to be inverted and retimed notRnWprepad: 187, // internal signal: to pad, yet to be inverted and retimed
RnWstretched: 353, // internal signal: control datapad output drivers RnWstretched: 353, // internal signal: control datapad output drivers, aka TRISTATE
"#DBE": 1035, // internal signal: formerly from DBE pad (6501)
cp1: 710, // internal signal: clock phase 1 cp1: 710, // internal signal: clock phase 1
cclk: 943, // unbonded pad: internal non-overlappying phi2 cclk: 943, // unbonded pad: internal non-overlappying phi2
fetch: 879, // internal signal fetch: 879, // internal signal
@ -441,12 +527,54 @@ H1x1: 1042, // internal signal: drive status byte onto databus
"op-clv":1164, // pla129 "op-clv":1164, // pla129
"op-implied":1006, // pla130 // has extra pulldowns: pla121 and ir0 "op-implied":1006, // pla130 // has extra pulldowns: pla121 and ir0
// internal signals: derived from pla outputs
"#op-branch-done": 1048,
"#op-T3-branch": 1708,
"op-ANDS": 1228,
"op-EORS": 1689,
"op-ORS": 522,
"op-SUMS": 1196,
"op-SRS": 934,
"#op-store": 925,
"#WR": 1352,
"op-rmw": 434,
"short-circuit-idx-add": 1185,
"short-circuit-branch-add": 430,
"#op-set-C": 252,
// internal signals: control signals // internal signals: control signals
nnT2BR: 967, // doubly inverted nnT2BR: 967, // doubly inverted
BRtaken: 1544, BRtaken: 1544, // aka #TAKEN
// internal signals and state: interrupt and vector related
// segher says:
// "P" are the latched external signals.
// "G" are the signals that actually trigger the interrupt.
// "NMIL" is to do the edge detection -- it's pretty much just a delayed NMIG.
// INTG is IRQ and NMI taken together.
IRQP: 675,
"#IRQP": 888,
NMIP: 1032,
"#NMIP": 297,
"#NMIG": 264,
NMIL: 1374,
RESP: 67,
RESG: 926,
VEC0: 1465,
VEC1: 1481,
"#VEC": 1134,
D1x1: 827, // internal signal: interrupt handler related
"brk-done": 1382, // internal signal: interrupt handler related
INTG: 1350, // internal signal: interrupt handler related
// internal state: misc pipeline state clocked by cclk (phi2) // internal state: misc pipeline state clocked by cclk (phi2)
pipeBRtaken: 832, "pipe#VEC": 1431, // latched #VEC
"pipeT-SYNC": 537,
pipeT2out: 40,
pipeT3out: 706,
pipeT4out: 1373,
pipeT5out: 940,
pipeIPCrelated: 832,
pipeUNK01: 1530, pipeUNK01: 1530,
pipeUNK02: 974, pipeUNK02: 974,
pipeUNK03: 1436, pipeUNK03: 1436,
@ -484,20 +612,23 @@ pipeUNK34: 56,
pipeUNK35: 1713, pipeUNK35: 1713,
pipeUNK36: 729, pipeUNK36: 729,
pipeUNK37: 197, pipeUNK37: 197,
pipeUNK38: 1131, "pipe#WR.phi2": 1131,
pipeUNK39: 151, pipeUNK39: 151,
pipeUNK40: 456, pipeUNK40: 456,
pipeUNK41: 1438, pipeUNK41: 1438,
pipeUNK42: 1104, pipeUNK42: 1104,
pipeUNK43: 554, "pipe#T0": 554, // aka #T0.phi2
// internal state: vector address pulldown control // internal state: vector address pulldown control
pipeVectorA0: 357, pipeVectorA0: 357,
pipeVectorA1: 170, pipeVectorA1: 170,
pipeVectorA2: 45, pipeVectorA2: 45,
// internal signals: vector address pulldown control
"0/ADL0": 217,
"0/ADL1": 686,
"0/ADL2": 1193,
// internal state: datapath control drivers // internal state: datapath control drivers
pipedpc28: 683, pipedpc28: 683,
@ -519,17 +650,105 @@ alub5: 1678,
alub6: 235, alub6: 235,
alub7: 1535, alub7: 1535,
aluanorb0: 143, // alu carry chain and decimal mode
aluanandb0: 1628, C01: 1285,
aluaorb0: 693, C12: 505,
notaluoutmux0: 957, // alu result latch input C23: 1023,
C34: 78,
C45: 142,
C56: 500,
C67: 1314,
C78: 808,
"C78.phi2": 560,
DC34: 1372, // lower nibble decimal carry
DC78: 333, // carry for decimal mode
"DC78.phi2": 164,
"#C01": 1506,
"#C12": 1122,
"#C23": 1003,
"#C34": 1425,
"#C45": 1571,
"#C56": 427,
"#C67": 592,
"#C78": 1327,
"DA-C01": 623,
"DA-AB2": 216,
"DA-AxB2": 516,
"DA-C45": 1144,
"#DA-ADD1": 901,
"#DA-ADD2": 699,
aluanorb1: 155, // misc alu internals
aluanandb1: 841, "#(AxBxC)0": 371,
aluaorb1: 1021, "#(AxBxC)1": 965,
notaluoutmux1: 250, // alu result latch input "#(AxBxC)2": 22,
"#(AxBxC)3": 274,
"#(AxBxC)4": 651,
"#(AxBxC)5": 486,
"#(AxBxC)6": 1197,
"#(AxBxC)7": 532,
AxB1: 425,
AxB3: 640,
AxB5: 1220,
AxB7: 1241,
"#(AxB)0": 1525,
"#(AxB)2": 701,
"#(AxB)4": 308,
"#(AxB)6": 1459,
"(AxB)0.#C0in": 555,
"(AxB)2.#C12": 193,
"(AxB)4.#C34": 65,
"(AxB)6.#C56": 174,
"#(AxB1).C01": 295,
"#(AxB3).C23": 860,
"#(AxB5).C45": 817,
"#(AxB7).C67": 1217,
"#A.B0": 1628,
"#A.B1": 841,
"#A.B2": 681,
"#A.B3": 350,
"#A.B4": 1063,
"#A.B5": 477,
"#A.B6": 336,
"#A.B7": 1318,
"A+B0": 693,
"A+B1": 1021,
"A+B2": 110,
"A+B3": 1313,
"A+B4": 918,
"A+B5": 1236,
"A+B6": 803,
"A+B7": 117,
"#(A+B)0": 143,
"#(A+B)1": 155,
"#(A+B)2": 1691,
"#(A+B)3": 649,
"#(A+B)4": 404,
"#(A+B)5": 1632,
"#(A+B)6": 1084,
"#(A+B)7": 1398,
"#(AxB)0": 1525,
"#(AxB)2": 701,
"#(AxB)4": 308,
"#(AxB)6": 1459,
"#(AxB)1": 953,
"#(AxB)3": 884,
"#(AxB)5": 1469,
"#(AxB)7": 177,
"#aluresult0": 957, // alu result latch input
"#aluresult1": 250,
"#aluresult2": 740,
"#aluresult3": 1071,
"#aluresult4": 296,
"#aluresult5": 277,
"#aluresult6": 722,
"#aluresult7": 304,
// internal signals: datapath control signals // internal signals: datapath control signals
"ADL/ABL": 639, // load ABL latches from ADL bus
"ADH/ABH": 821, // load ABH latches from ADH bus
dpc0_YSB: 801, // drive sb from y dpc0_YSB: 801, // drive sb from y
dpc1_SBY: 325, // load y from sb dpc1_SBY: 325, // load y from sb
dpc2_XSB: 1263, // drive sb from x dpc2_XSB: 1263, // drive sb from x
@ -551,23 +770,29 @@ dpc16_EORS: 1666, // alu op: a xor b (?)
dpc17_SUMS: 921, // alu op: a plus b (?) dpc17_SUMS: 921, // alu op: a plus b (?)
alucin: 910, // alu carry in alucin: 910, // alu carry in
notalucin: 1165, notalucin: 1165,
dpc18_DAA: 1201, // decimal related "dpc18_#DAA": 1201, // decimal related (inverted)
dpc19_ADDSB7: 214, // alu to sb bit 7 only dpc19_ADDSB7: 214, // alu to sb bit 7 only
dpc20_ADDSB06: 129, // alu to sb bits 6-0 only dpc20_ADDSB06: 129, // alu to sb bits 6-0 only
dpc21_ADDADL: 1015, // alu to adl dpc21_ADDADL: 1015, // alu to adl
alurawcout: 808, // alu raw carry out (no decimal adjust) alurawcout: 808, // alu raw carry out (no decimal adjust)
notalucout: 412, // alu carry out (inverted)
alucout: 1146, // alu carry out (latched by phi2) alucout: 1146, // alu carry out (latched by phi2)
"#alucout": 206, "#alucout": 206,
"##alucout": 465, "##alucout": 465,
notaluvout: 1308, // alu overflow out notaluvout: 1308, // alu overflow out
aluvout: 938, // alu overflow out (latched by phi2) aluvout: 938, // alu overflow out (latched by phi2)
dpc22_DSA: 725, // decimal related/SBC only
"#DBZ": 1268, // internal signal: not (databus is zero)
DBZ: 744, // internal signal: databus is zero
DBNeg: 1200, // internal signal: databus is negative (top bit of db) aka P-#DB7in
"dpc22_#DSA": 725, // decimal related/SBC only (inverted)
dpc23_SBAC: 534, // (optionalls decimal-adjusted) sb to acc dpc23_SBAC: 534, // (optionalls decimal-adjusted) sb to acc
dpc24_ACSB: 1698, // acc to sb dpc24_ACSB: 1698, // acc to sb
dpc25_SBDB: 1060, // sb pass-connects to idb dpc25_SBDB: 1060, // sb pass-connects to idb (bi-directionally)
dpc26_ACDB: 1331, // acc to idb dpc26_ACDB: 1331, // acc to idb
dpc27_SBADH: 140, // sb pass-connects to adh dpc27_SBADH: 140, // sb pass-connects to adh (bi-directionally)
dpc28_0ADH0: 229, // zero to adh0 bit0 only dpc28_0ADH0: 229, // zero to adh0 bit0 only
dpc29_0ADH17: 203, // zero to adh bits 7-1 only dpc29_0ADH17: 203, // zero to adh bits 7-1 only
@ -576,14 +801,23 @@ dpc31_PCHPCH: 741, // load pch from pch incremented
dpc32_PCHADH: 1235, // drive adh from pch incremented dpc32_PCHADH: 1235, // drive adh from pch incremented
dpc33_PCHDB: 247, // drive idb from pch incremented dpc33_PCHDB: 247, // drive idb from pch incremented
dpc34_PCLC: 1704, // pch carry in and pcl FF detect? dpc34_PCLC: 1704, // pch carry in and pcl FF detect?
dpc35: 1334, // pcl 0x?F detect - half-carry dpc35_PCHC: 1334, // pcl 0x?F detect - half-carry
dpc36_IPC: 379, // pcl carry in "dpc36_#IPC": 379, // pcl carry in (inverted)
dpc37_PCLDB: 283, // drive idb from pcl incremented dpc37_PCLDB: 283, // drive idb from pcl incremented
dpc38_PCLADL: 438, // drive adl from pcl incremented dpc38_PCLADL: 438, // drive adl from pcl incremented
dpc39_PCLPCL: 898, // load pcl from pcl incremented dpc39_PCLPCL: 898, // load pcl from pcl incremented
dpc40_ADLPCL: 414, // load pcl from adl dpc40_ADLPCL: 414, // load pcl from adl
dpc41: 1564, // pass-connect adl to mux node driven by idl "dpc41_DL/ADL": 1564,// pass-connect adl to mux node driven by idl
dpc42: 41, // pass-connect adh to mux node driven by idl "dpc42_DL/ADH": 41, // pass-connect adh to mux node driven by idl
dpc43: 863, // pass-connect idb to mux node driven by idl "dpc43_DL/DB": 863, // pass-connect idb to mux node driven by idl
} }
/* many bus names taken from Donald F. Hanson's block diagram, found
* http://www.weihenstephan.org/~michaste/pagetable/6502/6502.jpg
* from his paper "A VHDL conversion tool for logic equations with embedded D latches"
* http://portal.acm.org/citation.cfm?id=1275143.1275151
* also available at
* http://www.ncsu.edu/wcae/WCAE1/hanson.pdf
*/

View File

@ -12,7 +12,7 @@ testprogramAddress=0x0000;
var consoleboxStream=""; var consoleboxStream="";
// demonstrate write hook // demonstrate write hook
writeTriggers[0x000c]="consoleboxStream += String.fromCharCode(d);"+ writeTriggers[0x000F]="consoleboxStream += String.fromCharCode(d);"+
"consolebox.innerHTML = consoleboxStream;"; "consolebox.innerHTML = consoleboxStream;";
// demonstrate read hook (not used by this test program) // demonstrate read hook (not used by this test program)
@ -25,11 +25,11 @@ testprogram = [
0x4c, 0x02, 0x00, // JMP $0002 0x4c, 0x02, 0x00, // JMP $0002
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40,
0xe8, // INX 0xe8, // INX
0x88, // DEY 0x88, // DEY
0xe6, 0x0c, // INC $0C 0xe6, 0x0F, // INC $0F
0x38, // SEC 0x38, // SEC
0x69, 0x02, // ADC #$02 0x69, 0x02, // ADC #$02
0x60 // RTS 0x60 // RTS

File diff suppressed because it is too large Load Diff

View File

@ -51,9 +51,10 @@ function setupTransistors(){
var gate = tdef[1]; var gate = tdef[1];
var c1 = tdef[2]; var c1 = tdef[2];
var c2 = tdef[3]; var c2 = tdef[3];
var bb = tdef[4];
if(c1==ngnd) {c1=c2;c2=ngnd;} if(c1==ngnd) {c1=c2;c2=ngnd;}
if(c1==npwr) {c1=c2;c2=npwr;} if(c1==npwr) {c1=c2;c2=npwr;}
var trans = {name: name, on: false, gate: gate, c1: c1, c2: c2}; var trans = {name: name, on: false, gate: gate, c1: c1, c2: c2, bb: bb};
nodes[gate].gates.push(trans); nodes[gate].gates.push(trans);
nodes[c1].c1c2s.push(trans); nodes[c1].c1c2s.push(trans);
nodes[c2].c1c2s.push(trans); nodes[c2].c1c2s.push(trans);
@ -151,19 +152,64 @@ function overlayNode(w){
} }
} }
// originally to highlight using a list of node numbers
// but can now include transistor names
function hiliteNode(n){ function hiliteNode(n){
var ctx = hilite.getContext('2d'); var ctx = hilite.getContext('2d');
ctx.clearRect(0,0,grCanvasSize,grCanvasSize); ctx.clearRect(0,0,grCanvasSize,grCanvasSize);
ctx.fillStyle = 'rgba(255,255,255,0.7)';
if(n==-1) return; if(n==-1) return;
if(isNodeHigh(n[0])) hilited = n;
ctx.fillStyle = 'rgba(255,0,0,0.7)';
for(var i in n){ for(var i in n){
if(typeof n[i] != "number") {
hiliteTrans([n[i]]);
continue;
}
if(isNodeHigh(n[i])) {
ctx.fillStyle = 'rgba(255,0,0,0.7)';
} else {
ctx.fillStyle = 'rgba(255,255,255,0.7)';
}
var segs = nodes[n[i]].segs; var segs = nodes[n[i]].segs;
for(var s in segs){drawSeg(ctx, segs[s]); ctx.fill();} for(var s in segs){drawSeg(ctx, segs[s]); ctx.fill();}
} }
} }
// highlight a single transistor (additively - does not clear highlighting)
function hiliteTrans(n){
var ctx = hilite.getContext('2d');
ctx.strokeStyle = 'rgba(255,255,255,0.7)';
ctx.lineWidth = 4
for(var t in n){
var bb = transistors[n[t]].bb
var segs = [[bb[0], bb[2], bb[1], bb[2], bb[1], bb[3], bb[0], bb[3]]]
for(var s in segs){drawSeg(ctx, segs[s]); ctx.stroke();}
}
}
function ctxDrawBox(ctx, xMin, yMin, xMax, yMax){
var cap=ctx.lineCap;
ctx.lineCap="square";
ctx.beginPath();
ctx.moveTo(xMin, yMin);
ctx.lineTo(xMin, yMax);
ctx.lineTo(xMax, yMax);
ctx.lineTo(xMax, yMin);
ctx.lineTo(xMin, yMin);
ctx.stroke();
ctx.lineCap=cap;
}
// takes a bounding box in chip coords and centres the display over it
function zoomToBox(xmin,xmax,ymin,ymax){
var xmid=(xmin+xmax)/2;
var ymid=(ymin+ymax)/2;
var x=(xmid+400)/grChipSize*600;
var y=600-ymid/grChipSize*600;
var zoom=5; // pending a more careful calculation
moveHere([x,y,zoom]);
}
function drawSeg(ctx, seg){ function drawSeg(ctx, seg){
var dx = 400; var dx = 400;
ctx.beginPath(); ctx.beginPath();