mirror of
https://github.com/trebonian/visual6502.git
synced 2025-07-17 11:24:05 +00:00
Compare commits
6 Commits
production
...
svg
Author | SHA1 | Date | |
---|---|---|---|
|
020f4f2cb0 | ||
|
f0add78ee5 | ||
|
471fcd6ddc | ||
|
7ac0424f6c | ||
|
050906f305 | ||
|
ae185ff06b |
2
6502N.svg
Normal file
2
6502N.svg
Normal file
File diff suppressed because one or more lines are too long
After Width: | Height: | Size: 2.6 MiB |
2
README
2
README
@@ -4,7 +4,7 @@ www.visual6502.org/JSSim
|
|||||||
It includes a general purpose transistor-level simulator, layout browser,
|
It includes a general purpose transistor-level simulator, layout browser,
|
||||||
and the data from a 6502 revD chip.
|
and the data from a 6502 revD chip.
|
||||||
|
|
||||||
It also includes a similar simulator for the 6800 chip.
|
Recently added: polygon data for the 6800 chip. The simulation is not yet working,
|
||||||
|
|
||||||
Note the various licenses and Copyright associated with each file.
|
Note the various licenses and Copyright associated with each file.
|
||||||
|
|
||||||
|
@@ -4,26 +4,20 @@ testprogramAddress=0x0000;
|
|||||||
// we want to auto-clear the console if any output is sent by the program
|
// we want to auto-clear the console if any output is sent by the program
|
||||||
var consoleboxStream="";
|
var consoleboxStream="";
|
||||||
|
|
||||||
// demonstrate write hook
|
// for opcodes, see ftp://ftp.comlab.ox.ac.uk/pub/Cards/txt/6800.txt
|
||||||
writeTriggers[0x8000]="consoleboxStream += String.fromCharCode(d);"+
|
|
||||||
"consolebox.innerHTML = consoleboxStream;";
|
|
||||||
|
|
||||||
// demonstrate read hook (not used by this test program)
|
|
||||||
readTriggers[0x8004]="((consolegetc==undefined)?0:0xff)"; // return zero until we have a char
|
|
||||||
readTriggers[0x8000]="var c=consolegetc; consolegetc=undefined; (c)";
|
|
||||||
|
|
||||||
// for opcodes, see http://www.textfiles.com/programming/CARDS/6800
|
|
||||||
|
|
||||||
testprogram = [
|
testprogram = [
|
||||||
0xce, 0x43, 0x21, // LDX #4321
|
0xce, 0x43, 0x21, // LDX #4321
|
||||||
0x35, // TXS
|
0x35, // TXS
|
||||||
0xce, 0x80, 0x00, // LDX #8000
|
0xc6, 0xfb, // LDAB #$FB
|
||||||
0xc6, 0x40, // LDAB #$40
|
|
||||||
0xbd, 0x00, 0x10, // JSR $0010
|
0xbd, 0x00, 0x10, // JSR $0010
|
||||||
0x7e, 0x00, 0x09, // JMP $0009
|
0x7e, 0x00, 0x04, // JMP $0004
|
||||||
0x01, // NOP
|
0x01, // NOP
|
||||||
|
0x01, // NOP
|
||||||
|
0x01, // NOP
|
||||||
|
0x01, // NOP
|
||||||
|
0x08, // INX
|
||||||
0x4a, // DECA
|
0x4a, // DECA
|
||||||
0xe7, 0x00, // STAB 0, X
|
|
||||||
0x7c, 0x00, 0x0f, // INC $0F
|
0x7c, 0x00, 0x0f, // INC $0F
|
||||||
0x0d, // SEC
|
0x0d, // SEC
|
||||||
0xc9, 0x02, // ADCB #$02
|
0xc9, 0x02, // ADCB #$02
|
||||||
|
10
chipsim.js
10
chipsim.js
@@ -143,15 +143,7 @@ function saveString(name, str){
|
|||||||
|
|
||||||
function allNodes(){
|
function allNodes(){
|
||||||
var res = new Array();
|
var res = new Array();
|
||||||
var ii = 0;
|
for(var i in nodes) if((i!=npwr)&&(i!=ngnd)) res.push(i);
|
||||||
for(var i in nodes) {
|
|
||||||
// Don't feed numeric strings to recalcNodeList(). Numeric
|
|
||||||
// strings can cause a (data dependent) duplicate node number
|
|
||||||
// hiccup when accumulating a node group's list, ie:
|
|
||||||
// group => [ "49", 483, 49 ]
|
|
||||||
ii = Number( i );
|
|
||||||
if((ii!=npwr)&&(ii!=ngnd)) res.push(ii);
|
|
||||||
}
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -57,7 +57,7 @@ $().ready(function(){
|
|||||||
<a href="http://blog.visual6502.org">Blog</a>
|
<a href="http://blog.visual6502.org">Blog</a>
|
||||||
<a href="http://www.visual6502.org/links.html">Links</a>
|
<a href="http://www.visual6502.org/links.html">Links</a>
|
||||||
<a href="http://github.com/trebonian/visual6502">Source</a>
|
<a href="http://github.com/trebonian/visual6502">Source</a>
|
||||||
<a href="http://www.textfiles.com/programming/CARDS/6800">6800 instruction card</a>
|
<a href="ftp://ftp.comlab.ox.ac.uk/pub/Cards/txt/6800.txt">6800 instruction card</a>
|
||||||
<a href="http://www.sbprojects.com/sbasm/6800.htm#model">programming model</a>
|
<a href="http://www.sbprojects.com/sbasm/6800.htm#model">programming model</a>
|
||||||
</span>
|
</span>
|
||||||
<div class="frame" id="frame">
|
<div class="frame" id="frame">
|
||||||
|
@@ -13569,15 +13569,7 @@ function saveString(name, str){
|
|||||||
|
|
||||||
function allNodes(){
|
function allNodes(){
|
||||||
var res = new Array();
|
var res = new Array();
|
||||||
var ii = 0;
|
for(var i in nodes) if((i!=npwr)&&(i!=ngnd)) res.push(i);
|
||||||
for(var i in nodes) {
|
|
||||||
// Don't feed numeric strings to recalcNodeList(). Numeric
|
|
||||||
// strings can cause a (data dependent) duplicate node number
|
|
||||||
// hiccup when accumulating a node group's list, ie:
|
|
||||||
// group => [ "49", 483, 49 ]
|
|
||||||
ii = Number( i );
|
|
||||||
if((ii!=npwr)&&(ii!=ngnd)) res.push(ii);
|
|
||||||
}
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -14415,7 +14407,7 @@ var dis6502={
|
|||||||
0x68:"PLA",
|
0x68:"PLA",
|
||||||
0x69:"ADC #",
|
0x69:"ADC #",
|
||||||
0x6A:"ROR ",
|
0x6A:"ROR ",
|
||||||
0x6C:"JMP (Abs)",
|
0x6C:"JMP zp",
|
||||||
0x6D:"ADC Abs",
|
0x6D:"ADC Abs",
|
||||||
0x6E:"ROR Abs",
|
0x6E:"ROR Abs",
|
||||||
0x70:"BVS ",
|
0x70:"BVS ",
|
||||||
|
14
expert.html
14
expert.html
@@ -78,19 +78,19 @@ $().ready(function(){
|
|||||||
<div id="layoutControlPanel">
|
<div id="layoutControlPanel">
|
||||||
Use 'z' or '>' to zoom in, 'x' or '<' to zoom out, click to probe signals and drag to pan.
|
Use 'z' or '>' to zoom in, 'x' or '<' to zoom out, click to probe signals and drag to pan.
|
||||||
<form id="updateShow"> Show:
|
<form id="updateShow"> Show:
|
||||||
<input type="checkbox" name="1" id="updateShow1" onchange="updateShow(this.name,this.checked)" /><label for="updateShow1">(diffusion)</label>
|
<input type="checkbox" name="1" id="updateShow1" onchange="updateShow(this.name,this.checked)" />(diffusion)
|
||||||
<input type="checkbox" name="3" id="updateShow3" onchange="updateShow(this.name,this.checked)" /><label for="updateShow3">(grounded diffusion)</label>
|
<input type="checkbox" name="3" id="updateShow3" onchange="updateShow(this.name,this.checked)" />(grounded diffusion)
|
||||||
<input type="checkbox" name="4" id="updateShow4" onchange="updateShow(this.name,this.checked)" /><label for="updateShow4">(powered diffusion)</label>
|
<input type="checkbox" name="4" id="updateShow4" onchange="updateShow(this.name,this.checked)" />(powered diffusion)
|
||||||
<input type="checkbox" name="5" id="updateShow5" onchange="updateShow(this.name,this.checked)" /><label for="updateShow5">(polysilicon)</label>
|
<input type="checkbox" name="5" id="updateShow5" onchange="updateShow(this.name,this.checked)" />(polysilicon)
|
||||||
<input type="checkbox" name="0" id="updateShow0" onchange="updateShow(this.name,this.checked)" /><label for="updateShow0">(metal)</label>
|
<input type="checkbox" name="0" id="updateShow0" onchange="updateShow(this.name,this.checked)" />(metal)
|
||||||
<input type="checkbox" name="2" id="updateShow2" onchange="updateShow(this.name,this.checked)" /><label for="updateShow2">(protection)</label>
|
<input type="checkbox" name="2" id="updateShow2" onchange="updateShow(this.name,this.checked)" />(protection)
|
||||||
</form>
|
</form>
|
||||||
<form action="javascript:hiliteNodeList();">
|
<form action="javascript:hiliteNodeList();">
|
||||||
<input type="button" value="Find:" onclick="hiliteNodeList();" />
|
<input type="button" value="Find:" onclick="hiliteNodeList();" />
|
||||||
<input type="text" id="HighlightThese" name="HighlightThese" value="" />
|
<input type="text" id="HighlightThese" name="HighlightThese" value="" />
|
||||||
<input type="button" value="Clear Highlighting" onclick="clearHighlight();" />
|
<input type="button" value="Clear Highlighting" onclick="clearHighlight();" />
|
||||||
<span class="animatebox">
|
<span class="animatebox">
|
||||||
<label for="animateModeCheckbox">Animate during simulation:</label>
|
Animate during simulation:
|
||||||
<input type="checkbox" id="animateModeCheckbox" onchange="updateChipLayoutAnimation(this.checked)"
|
<input type="checkbox" id="animateModeCheckbox" onchange="updateChipLayoutAnimation(this.checked)"
|
||||||
/></span>
|
/></span>
|
||||||
</form>
|
</form>
|
||||||
|
@@ -72,7 +72,7 @@ More information in the <a href="http://visual6502.org/wiki/index.php?title=Jssi
|
|||||||
</span>
|
</span>
|
||||||
<div class="frame" id="frame">
|
<div class="frame" id="frame">
|
||||||
<div class="chip" id="chip">
|
<div class="chip" id="chip">
|
||||||
<canvas class="chip" id="chipbg"></canvas>
|
<object data="6502N.svg" type="image/svg+xml" id="chipbg" style="position: absolute; width: 600px; height:600px;"></object>
|
||||||
<canvas class="chip" id="overlay"></canvas>
|
<canvas class="chip" id="overlay"></canvas>
|
||||||
<canvas class="chip" id="hilite"></canvas>
|
<canvas class="chip" id="hilite"></canvas>
|
||||||
<canvas class="chip" id="hitbuffer"></canvas>
|
<canvas class="chip" id="hitbuffer"></canvas>
|
||||||
|
@@ -50,6 +50,13 @@ canvas.chip {
|
|||||||
height: 600px;
|
height: 600px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
object.chipbg {
|
||||||
|
position: absolute;
|
||||||
|
width: 600px;
|
||||||
|
height: 600px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
div.buttons{
|
div.buttons{
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: -5px;
|
top: -5px;
|
||||||
|
@@ -144,12 +144,19 @@ function mouseUp(e){
|
|||||||
}
|
}
|
||||||
|
|
||||||
function setZoom(n){
|
function setZoom(n){
|
||||||
|
var svg = chipbg.getSVGDocument();
|
||||||
|
svg = svg.childNodes[0];
|
||||||
|
|
||||||
zoom = n;
|
zoom = n;
|
||||||
setChipStyle({
|
setChipStyle({
|
||||||
width: 600*n+'px',
|
width: 600*n+'px',
|
||||||
height: 600*n+'px'
|
height: 600*n+'px'
|
||||||
});
|
});
|
||||||
|
|
||||||
|
svg.style.width = 600*n+'px';
|
||||||
|
svg.style.height = 600*n+'px';
|
||||||
recenter();
|
recenter();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function recenter(){
|
function recenter(){
|
||||||
@@ -193,7 +200,7 @@ function handleClick(e){
|
|||||||
function setChipStyle(props){
|
function setChipStyle(props){
|
||||||
for(var i in props){
|
for(var i in props){
|
||||||
chipbg.style[i] = props[i];
|
chipbg.style[i] = props[i];
|
||||||
overlay.style[i] = props[i];
|
// overlay.style[i] = props[i];
|
||||||
hilite.style[i] = props[i];
|
hilite.style[i] = props[i];
|
||||||
hitbuffer.style[i] = props[i];
|
hitbuffer.style[i] = props[i];
|
||||||
}
|
}
|
||||||
|
@@ -699,7 +699,7 @@ var disassembly={
|
|||||||
0x68:"PLA",
|
0x68:"PLA",
|
||||||
0x69:"ADC #",
|
0x69:"ADC #",
|
||||||
0x6A:"ROR ",
|
0x6A:"ROR ",
|
||||||
0x6C:"JMP (Abs)",
|
0x6C:"JMP zp",
|
||||||
0x6D:"ADC Abs",
|
0x6D:"ADC Abs",
|
||||||
0x6E:"ROR Abs",
|
0x6E:"ROR Abs",
|
||||||
0x70:"BVS ",
|
0x70:"BVS ",
|
||||||
|
@@ -923,7 +923,7 @@ 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_PCHC: 1334, // pch 0x?F detect - half-carry
|
dpc35_PCHC: 1334, // pcl 0x?F detect - half-carry
|
||||||
"dpc36_#IPC": 379, // pcl carry in (inverted)
|
"dpc36_#IPC": 379, // pcl carry in (inverted)
|
||||||
"dpc36_~IPC": 379, // automatic alias replacing hash with tilde
|
"dpc36_~IPC": 379, // automatic alias replacing hash with tilde
|
||||||
dpc37_PCLDB: 283, // drive idb from pcl incremented
|
dpc37_PCLDB: 283, // drive idb from pcl incremented
|
||||||
|
72
wires.js
72
wires.js
@@ -22,6 +22,11 @@
|
|||||||
|
|
||||||
var frame, chipbg, overlay, hilite, hitbuffer, ctx;
|
var frame, chipbg, overlay, hilite, hitbuffer, ctx;
|
||||||
var nodes = new Array();
|
var nodes = new Array();
|
||||||
|
var lastState = new Array();
|
||||||
|
var polyAttr = new Array();
|
||||||
|
var metalAttr = new Array();
|
||||||
|
var polyOffFill;
|
||||||
|
var metalOffFill;
|
||||||
var transistors = {};
|
var transistors = {};
|
||||||
var nodenamelist=[];
|
var nodenamelist=[];
|
||||||
|
|
||||||
@@ -40,6 +45,7 @@ function setupNodes(){
|
|||||||
state: false, gates: new Array(), c1c2s: new Array()};
|
state: false, gates: new Array(), c1c2s: new Array()};
|
||||||
if(w==ngnd) continue;
|
if(w==ngnd) continue;
|
||||||
if(w==npwr) continue;
|
if(w==npwr) continue;
|
||||||
|
lastState[i] = 0;
|
||||||
nodes[w].segs.push(seg.slice(3));
|
nodes[w].segs.push(seg.slice(3));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -73,8 +79,20 @@ function setupLayerVisibility(){
|
|||||||
|
|
||||||
function setupBackground(){
|
function setupBackground(){
|
||||||
chipbg = document.getElementById('chipbg');
|
chipbg = document.getElementById('chipbg');
|
||||||
chipbg.width = grCanvasSize;
|
chipbg.width = 4000;
|
||||||
chipbg.height = grCanvasSize;
|
chipbg.height = 4000;
|
||||||
|
var svg = chipbg.getSVGDocument();
|
||||||
|
svg = svg.childNodes[0];
|
||||||
|
var poly = svg.getElementById('poly');
|
||||||
|
var metal = svg.getElementById('metal');
|
||||||
|
polyOffFill = poly.getAttribute('fill');
|
||||||
|
metalOffFill = metal.getAttribute('fill');
|
||||||
|
for(var i in nodes){
|
||||||
|
polyAttr[i] = poly.getElementsByClassName(i+'')[0];
|
||||||
|
metalAttr[i] = metal.getElementsByClassName(i+'')[0];
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
|
||||||
var ctx = chipbg.getContext('2d');
|
var ctx = chipbg.getContext('2d');
|
||||||
ctx.fillStyle = '#000000';
|
ctx.fillStyle = '#000000';
|
||||||
ctx.strokeStyle = 'rgba(255,255,255,0.5)';
|
ctx.strokeStyle = 'rgba(255,255,255,0.5)';
|
||||||
@@ -93,10 +111,10 @@ function setupBackground(){
|
|||||||
}
|
}
|
||||||
|
|
||||||
function setupOverlay(){
|
function setupOverlay(){
|
||||||
overlay = document.getElementById('overlay');
|
// overlay = document.getElementById('overlay');
|
||||||
overlay.width = grCanvasSize;
|
// overlay.width = grCanvasSize;
|
||||||
overlay.height = grCanvasSize;
|
// overlay.height = grCanvasSize;
|
||||||
ctx = overlay.getContext('2d');
|
// ctx = overlay.getContext('2d');
|
||||||
}
|
}
|
||||||
|
|
||||||
function setupHilite(){
|
function setupHilite(){
|
||||||
@@ -137,20 +155,44 @@ function hexdigit(n){return '0123456789ABCDEF'.charAt(n);}
|
|||||||
|
|
||||||
function refresh(){
|
function refresh(){
|
||||||
if(!chipLayoutIsVisible) return;
|
if(!chipLayoutIsVisible) return;
|
||||||
ctx.clearRect(0,0,grCanvasSize,grCanvasSize);
|
// ctx.clearRect(0,0,grCanvasSize,grCanvasSize);
|
||||||
|
// for(i in nodes){
|
||||||
|
// if(isNodeHigh(i)) overlayNode(nodes[i].segs);
|
||||||
|
// }
|
||||||
for(i in nodes){
|
for(i in nodes){
|
||||||
if(isNodeHigh(i)) overlayNode(nodes[i].segs);
|
if(isNodeHigh(i)){
|
||||||
|
if(lastState[i]==1)continue;
|
||||||
|
|
||||||
|
var n = polyAttr[i];
|
||||||
|
var n2 = metalAttr[i];
|
||||||
|
if(n!=undefined)
|
||||||
|
n.setAttribute('fill', 'rgb(0,255,255)');
|
||||||
|
if(n2!=undefined)
|
||||||
|
n2.setAttribute('fill', 'rgb(0,255,255)');
|
||||||
|
lastState[i] = 1;
|
||||||
|
} else {
|
||||||
|
if(lastState[i]==0)continue;
|
||||||
|
|
||||||
|
var n = polyAttr[i];
|
||||||
|
var n2 = metalAttr[i];
|
||||||
|
|
||||||
|
if(n!=undefined)
|
||||||
|
n.setAttribute('fill', polyOffFill);
|
||||||
|
if(n2!=undefined)
|
||||||
|
n2.setAttribute('fill', metalOffFill);
|
||||||
|
lastState[i] = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
hiliteNode(hilited);
|
hiliteNode(hilited);
|
||||||
}
|
}
|
||||||
|
|
||||||
function overlayNode(w){
|
//function overlayNode(w){
|
||||||
ctx.fillStyle = 'rgba(255,0,64,0.4)';
|
// ctx.fillStyle = 'rgba(255,0,64,0.4)';
|
||||||
for(i in w) {
|
// for(i in w) {
|
||||||
drawSeg(ctx, w[i]);
|
// drawSeg(ctx, w[i]);
|
||||||
ctx.fill();
|
// ctx.fill();
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
|
|
||||||
// originally to highlight using a list of node numbers
|
// originally to highlight using a list of node numbers
|
||||||
// but can now include transistor names
|
// but can now include transistor names
|
||||||
|
Reference in New Issue
Block a user