Compare commits
189 Commits
Author | SHA1 | Date |
---|---|---|
BigEd | d8ecc129b3 | |
BigEd | d14ade8be8 | |
BigEd | bc5da26ea2 | |
BigEd | 15911b02b4 | |
BigEd | badcf8e40b | |
Goran Devic | 8097137323 | |
BigEd | 5b86a57c2c | |
BigEd | 0d4cb75658 | |
David Banks | cb7815e1ad | |
BigEd | 7ee143a906 | |
John Scarfone | 52540e3c12 | |
BigEd | f33937cc92 | |
David Banks | deb6833f8a | |
David Banks | 296cd01f84 | |
David Banks | 8e799d6922 | |
David Banks | a4ed7a9178 | |
David Banks | 9795b463ac | |
David Banks | b384fb552f | |
David Banks | bf63c33552 | |
David Banks | 9760663cc1 | |
David Banks | 3ae93282ba | |
David Banks | ab53a12b2e | |
David Banks | a92f443ac1 | |
David Banks | 86e6e116d7 | |
David Banks | f360557572 | |
David Banks | 5005774b1b | |
David Banks | 924074e305 | |
Ed Spittles | b0c40b9e7b | |
BigEd | 74762264c1 | |
David Banks | 6fcb3077eb | |
David Banks | cbebb0e11d | |
BigEd | 2612132999 | |
Trent Reed | 8327a36826 | |
BigEd | 886efe1d5a | |
David Banks | d9c92ebdc3 | |
David Banks | 651a1753b7 | |
David Banks | f5cada53f7 | |
David Banks | 7d579fa4aa | |
David Banks | e33f40e60c | |
David Banks | 379d2d1ea1 | |
David Banks | 59792d75fc | |
David Banks | 225b49a6d8 | |
David Banks | 3de51801ea | |
David Banks | 2f882d7d34 | |
David Banks | b9e235fac2 | |
David Banks | 0e4c3e0ab0 | |
David Banks | 767e2492be | |
David Banks | 95f9d52306 | |
David Banks | 646f22b79e | |
David Banks | 2ff43fafb3 | |
David Banks | 8a9fe6f57e | |
David Banks | 3315f309a7 | |
David Banks | 85058171b2 | |
David Banks | 7a0cb72539 | |
Ed Spittles | 0a6866f10c | |
BigEd | 5b15e2d6c9 | |
BigEd | e6e446a256 | |
BigEd | bd0356f2a0 | |
BigEd | 096f6bbcf8 | |
mmfoerster | 698312b98e | |
BigEd | bd45334147 | |
mmfoerster | 7efe4fb8c7 | |
mmfoerster | ef0a714a29 | |
BigEd | e0547e6c35 | |
mmfoerster | 76edc1186a | |
mmfoerster | c1409b78cb | |
mmfoerster | d39bab7302 | |
mmfoerster | 587fa47d8a | |
mmfoerster | 27d0eb8fb2 | |
BigEd | 90f57631c0 | |
mmfoerster | cba0c7a6b5 | |
mmfoerster | c2348c5f63 | |
BigEd | 4bb43bfd0e | |
mmfoerster | 8d50388828 | |
Ed S | 1f78e25b3a | |
Ed S | 4364604b96 | |
BigEd | 2147762ee4 | |
BigEd | 651d8a44c5 | |
mmfoerster | 51d6bb216b | |
BigEd | 3b7fbe4385 | |
trebonian | f3cffeeed6 | |
BigEd | a2a4bc65c5 | |
trebonian | 815e972d14 | |
trebonian | 9f4f922e16 | |
trebonian | 27bec1bfe5 | |
BigEd | 976fe7e430 | |
shersom | 72ac2caf74 | |
trebonian | 741e035eb4 | |
BigEd | dd2241d3de | |
BigEd | c0809ba34e | |
Peter Mortensen | df33b88c56 | |
trebonian | 7d90b33187 | |
BigEd | 34244661cb | |
BigEd | ce74c3f5d3 | |
BigEd | cb03b9741a | |
BigEd | 7b95b5e345 | |
BigEd | de265ecdb8 | |
BigEd | e81c9fbe0f | |
BigEd | c300e6ad01 | |
BigEd | 79d0c4c445 | |
BigEd | a2d35d54ca | |
BigEd | e20eb08b91 | |
BigEd | 8487a7a9e1 | |
BigEd | 6c138a4f6b | |
BigEd | 658d40646c | |
BigEd | 67e15e68c1 | |
BigEd | a316831100 | |
ijor | acd7b0310e | |
BigEd | 9331be20fe | |
BigEd | e6d42eb1aa | |
BigEd | 8ae5c087f6 | |
BigEd | c6dd03ba17 | |
BigEd | fca2eb5cb6 | |
BigEd | b5c1759f32 | |
BigEd | 6ceae74e4a | |
BigEd | 94b306bace | |
BigEd | 9308b26c42 | |
BigEd | 335cb06832 | |
BigEd | d9440fa160 | |
BigEd | 10ba01cf12 | |
BigEd | e8b964a24f | |
BigEd | bbfcf77134 | |
BigEd | 73f21ffc47 | |
BigEd | 4e2c84dabc | |
BigEd | ca7124b176 | |
BigEd | b0710a4cda | |
BigEd | baac06bdc3 | |
BigEd | 9bb8caa025 | |
BigEd | b98010206e | |
BigEd | 7049cef9b7 | |
BigEd | 9d23382644 | |
BigEd | 8f5f50d197 | |
BigEd | 1d21f5ae8b | |
BigEd | 15b25491b9 | |
BigEd | 6033109dc6 | |
BigEd | 0e41f0a9a9 | |
BigEd | cb29fb4fad | |
BigEd | c02d181d5c | |
BigEd | 51d0e99389 | |
BigEd | d11cf44ae9 | |
BigEd | 2e69d3a7c3 | |
Barry Silverman | f098566335 | |
BigEd | e25ac6243c | |
BigEd | 94e22becb4 | |
BigEd | a56ee40bd8 | |
BigEd | 2ace0e8bad | |
BigEd | 84b005673b | |
BigEd | 09c578e361 | |
BigEd | 167f93f836 | |
BigEd | c88e0749cf | |
BigEd | 6db8836c5c | |
BigEd | 27fb1d539e | |
BigEd | 21c7a8ca90 | |
BigEd | cfb726d0e7 | |
BigEd | d352501c7c | |
Barry Silverman | 4eb1e4c848 | |
Barry Silverman | c3f0d10199 | |
Barry Silverman | 4398fdaddf | |
Barry Silverman | 4f7930eef3 | |
BigEd | c04f37a3df | |
BigEd | fc664c7243 | |
Barry Silverman | 8bdb9a0682 | |
BigEd | ae30a57822 | |
Sigbjorn Finne | 8a89310e96 | |
Sigbjorn Finne | 1c66a8af28 | |
BigEd | 78deb4aaa4 | |
Sigbjorn Finne | 85c8447064 | |
Sigbjorn Finne | 6cdbfc0c15 | |
BigEd | 8ef98d131f | |
BigEd | e660736204 | |
BigEd | fc46e50289 | |
BigEd | 4967b58e7f | |
BigEd | 6f7dab7990 | |
BigEd | 04196aa36a | |
BigEd | 94a2b38d27 | |
BigEd | e052255c55 | |
Barry Silverman | 15453f4435 | |
Barry Silverman | 7572b25453 | |
BigEd | 8f2e296ef6 | |
BigEd | ee2fa1befd | |
BigEd | 7c50999c9e | |
BigEd | abf6daef7d | |
BigEd | 3bf9ae1fac | |
BigEd | c4af64f5e8 | |
BigEd | 82daddcfe4 | |
BigEd | 50ecadaa00 | |
BigEd | 8a2342d83c | |
BigEd | 60b4ecab22 | |
BigEd | 9ff6ae027e |
|
@ -1,92 +1,92 @@
|
|||
/**
|
||||
* Cookie plugin
|
||||
*
|
||||
* Copyright (c) 2006 Klaus Hartl (stilbuero.de)
|
||||
* Dual licensed under the MIT and GPL licenses:
|
||||
* http://www.opensource.org/licenses/mit-license.php
|
||||
* http://www.gnu.org/licenses/gpl.html
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* Create a cookie with the given name and value and other optional parameters.
|
||||
*
|
||||
* @example $.cookie('the_cookie', 'the_value');
|
||||
* @desc Set the value of a cookie.
|
||||
* @example $.cookie('the_cookie', 'the_value', {expires: 7, path: '/', domain: 'jquery.com', secure: true});
|
||||
* @desc Create a cookie with all available options.
|
||||
* @example $.cookie('the_cookie', 'the_value');
|
||||
* @desc Create a session cookie.
|
||||
* @example $.cookie('the_cookie', null);
|
||||
* @desc Delete a cookie by passing null as value.
|
||||
*
|
||||
* @param String name The name of the cookie.
|
||||
* @param String value The value of the cookie.
|
||||
* @param Object options An object literal containing key/value pairs to provide optional cookie attributes.
|
||||
* @option Number|Date expires Either an integer specifying the expiration date from now on in days or a Date object.
|
||||
* If a negative value is specified (e.g. a date in the past), the cookie will be deleted.
|
||||
* If set to null or omitted, the cookie will be a session cookie and will not be retained
|
||||
* when the the browser exits.
|
||||
* @option String path The value of the path atribute of the cookie (default: path of page that created the cookie).
|
||||
* @option String domain The value of the domain attribute of the cookie (default: domain of page that created the cookie).
|
||||
* @option Boolean secure If true, the secure attribute of the cookie will be set and the cookie transmission will
|
||||
* require a secure protocol (like HTTPS).
|
||||
* @type undefined
|
||||
*
|
||||
* @name $.cookie
|
||||
* @cat Plugins/Cookie
|
||||
* @author Klaus Hartl/klaus.hartl@stilbuero.de
|
||||
*/
|
||||
|
||||
/**
|
||||
* Get the value of a cookie with the given name.
|
||||
*
|
||||
* @example $.cookie('the_cookie');
|
||||
* @desc Get the value of a cookie.
|
||||
*
|
||||
* @param String name The name of the cookie.
|
||||
* @return The value of the cookie.
|
||||
* @type String
|
||||
*
|
||||
* @name $.cookie
|
||||
* @cat Plugins/Cookie
|
||||
* @author Klaus Hartl/klaus.hartl@stilbuero.de
|
||||
*/
|
||||
jQuery.cookie = function(name, value, options) {
|
||||
if (typeof value != 'undefined') { // name and value given, set cookie
|
||||
options = options || {};
|
||||
if (value === null) {
|
||||
value = '';
|
||||
options.expires = -1;
|
||||
}
|
||||
var expires = '';
|
||||
if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {
|
||||
var date;
|
||||
if (typeof options.expires == 'number') {
|
||||
date = new Date();
|
||||
date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
|
||||
} else {
|
||||
date = options.expires;
|
||||
}
|
||||
expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE
|
||||
}
|
||||
var path = options.path ? '; path=' + options.path : '';
|
||||
var domain = options.domain ? '; domain=' + options.domain : '';
|
||||
var secure = options.secure ? '; secure' : '';
|
||||
document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
|
||||
} else { // only name given, get cookie
|
||||
var cookieValue = null;
|
||||
if (document.cookie && document.cookie != '') {
|
||||
var cookies = document.cookie.split(';');
|
||||
for (var i = 0; i < cookies.length; i++) {
|
||||
var cookie = jQuery.trim(cookies[i]);
|
||||
// Does this cookie string begin with the name we want?
|
||||
if (cookie.substring(0, name.length + 1) == (name + '=')) {
|
||||
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return cookieValue;
|
||||
}
|
||||
/**
|
||||
* Cookie plugin
|
||||
*
|
||||
* Copyright (c) 2006 Klaus Hartl (stilbuero.de)
|
||||
* Dual licensed under the MIT and GPL licenses:
|
||||
* http://www.opensource.org/licenses/mit-license.php
|
||||
* http://www.gnu.org/licenses/gpl.html
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* Create a cookie with the given name and value and other optional parameters.
|
||||
*
|
||||
* @example $.cookie('the_cookie', 'the_value');
|
||||
* @desc Set the value of a cookie.
|
||||
* @example $.cookie('the_cookie', 'the_value', {expires: 7, path: '/', domain: 'jquery.com', secure: true});
|
||||
* @desc Create a cookie with all available options.
|
||||
* @example $.cookie('the_cookie', 'the_value');
|
||||
* @desc Create a session cookie.
|
||||
* @example $.cookie('the_cookie', null);
|
||||
* @desc Delete a cookie by passing null as value.
|
||||
*
|
||||
* @param String name The name of the cookie.
|
||||
* @param String value The value of the cookie.
|
||||
* @param Object options An object literal containing key/value pairs to provide optional cookie attributes.
|
||||
* @option Number|Date expires Either an integer specifying the expiration date from now on in days or a Date object.
|
||||
* If a negative value is specified (e.g. a date in the past), the cookie will be deleted.
|
||||
* If set to null or omitted, the cookie will be a session cookie and will not be retained
|
||||
* when the the browser exits.
|
||||
* @option String path The value of the path atribute of the cookie (default: path of page that created the cookie).
|
||||
* @option String domain The value of the domain attribute of the cookie (default: domain of page that created the cookie).
|
||||
* @option Boolean secure If true, the secure attribute of the cookie will be set and the cookie transmission will
|
||||
* require a secure protocol (like HTTPS).
|
||||
* @type undefined
|
||||
*
|
||||
* @name $.cookie
|
||||
* @cat Plugins/Cookie
|
||||
* @author Klaus Hartl/klaus.hartl@stilbuero.de
|
||||
*/
|
||||
|
||||
/**
|
||||
* Get the value of a cookie with the given name.
|
||||
*
|
||||
* @example $.cookie('the_cookie');
|
||||
* @desc Get the value of a cookie.
|
||||
*
|
||||
* @param String name The name of the cookie.
|
||||
* @return The value of the cookie.
|
||||
* @type String
|
||||
*
|
||||
* @name $.cookie
|
||||
* @cat Plugins/Cookie
|
||||
* @author Klaus Hartl/klaus.hartl@stilbuero.de
|
||||
*/
|
||||
jQuery.cookie = function(name, value, options) {
|
||||
if (typeof value != 'undefined') { // name and value given, set cookie
|
||||
options = options || {};
|
||||
if (value === null) {
|
||||
value = '';
|
||||
options.expires = -1;
|
||||
}
|
||||
var expires = '';
|
||||
if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {
|
||||
var date;
|
||||
if (typeof options.expires == 'number') {
|
||||
date = new Date();
|
||||
date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
|
||||
} else {
|
||||
date = options.expires;
|
||||
}
|
||||
expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE
|
||||
}
|
||||
var path = options.path ? '; path=' + options.path : '';
|
||||
var domain = options.domain ? '; domain=' + options.domain : '';
|
||||
var secure = options.secure ? '; secure' : '';
|
||||
document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
|
||||
} else { // only name given, get cookie
|
||||
var cookieValue = null;
|
||||
if (document.cookie && document.cookie != '') {
|
||||
var cookies = document.cookie.split(';');
|
||||
for (var i = 0; i < cookies.length; i++) {
|
||||
var cookie = jQuery.trim(cookies[i]);
|
||||
// Does this cookie string begin with the name we want?
|
||||
if (cookie.substring(0, name.length + 1) == (name + '=')) {
|
||||
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return cookieValue;
|
||||
}
|
||||
};
|
4
README
4
README
|
@ -1,9 +1,11 @@
|
|||
This is the javascript simulator from the visual5602.org project:
|
||||
This is the JavaScript simulator from the visual6502.org project:
|
||||
www.visual6502.org/JSSim
|
||||
|
||||
It includes a general purpose transistor-level simulator, layout browser,
|
||||
and the data from a 6502 revD chip.
|
||||
|
||||
It also includes a similar simulator for the 6800 chip.
|
||||
|
||||
Note the various licenses and Copyright associated with each file.
|
||||
|
||||
Enjoy!
|
||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,488 @@
|
|||
// chip-specific support functions
|
||||
//
|
||||
// may override function definitions made previously
|
||||
|
||||
chipname='6800';
|
||||
|
||||
grChipSize=6600;
|
||||
grChipOffsetX=25
|
||||
grChipOffsetY=-200;
|
||||
|
||||
ngnd = nodenames['gnd'];
|
||||
npwr = nodenames['vcc'];
|
||||
|
||||
nodenamereset = 'reset';
|
||||
|
||||
presetLogLists=[
|
||||
['cycle',],
|
||||
['ab','db','rw','vma','Fetch','pc','acca','accb','ix','sp','p'],
|
||||
['ir','sync','Execute','State'], // instruction fetch and execution control
|
||||
['dbi','dbo','tmp','sum','inc'], // internal register-sized state
|
||||
['idb','abh','abl','ablx'], // internal datapath busses
|
||||
['irq','nmi',nodenamereset,'tsc','dbe','halt','ba'], // other pins
|
||||
];
|
||||
|
||||
function setupTransistors(){
|
||||
for(i in transdefs){
|
||||
var tdef = transdefs[i];
|
||||
var name = tdef[0];
|
||||
var gate = tdef[1];
|
||||
var c1 = tdef[2];
|
||||
var c2 = tdef[3];
|
||||
var bb = tdef[4];
|
||||
if(tdef[6])
|
||||
// just ignore all the 'weak' transistors for now
|
||||
continue;
|
||||
if(c1==ngnd) {c1=c2;c2=ngnd;}
|
||||
if(c1==npwr) {c1=c2;c2=npwr;}
|
||||
var trans = {name: name, on: false, gate: gate, c1: c1, c2: c2, bb: bb};
|
||||
nodes[gate].gates.push(trans);
|
||||
nodes[c1].c1c2s.push(trans);
|
||||
nodes[c2].c1c2s.push(trans);
|
||||
transistors[name] = trans;
|
||||
}
|
||||
}
|
||||
|
||||
// simulate a single clock phase with no update to graphics or trace
|
||||
function halfStep(){
|
||||
var clk = isNodeHigh(nodenames['phi2']);
|
||||
eval(clockTriggers[cycle]);
|
||||
if (clk) {setLow('phi2'); setLow('dbe'); setHigh('phi1'); handleBusRead(); }
|
||||
else {setHigh('phi1'); setLow('phi1'); setHigh('phi2'); setHigh('dbe'); handleBusWrite();}
|
||||
}
|
||||
|
||||
function goUntilSyncOrWrite(){
|
||||
halfStep();
|
||||
cycle++;
|
||||
while(
|
||||
!isNodeHigh(nodenames['phi2']) ||
|
||||
( !isNodeHigh(nodenames['sync']) && isNodeHigh(nodenames['rw']) )
|
||||
) {
|
||||
halfStep();
|
||||
cycle++;
|
||||
}
|
||||
chipStatus();
|
||||
}
|
||||
|
||||
function initChip(){
|
||||
var start = now();
|
||||
for(var nn in nodes) {
|
||||
nodes[nn].state = false;
|
||||
nodes[nn].float = true;
|
||||
}
|
||||
|
||||
nodes[ngnd].state = false;
|
||||
nodes[ngnd].float = false;
|
||||
nodes[npwr].state = true;
|
||||
nodes[npwr].float = false;
|
||||
for(var tn in transistors) transistors[tn].on = false;
|
||||
setLow(nodenamereset);
|
||||
setHigh('phi1'); setLow('phi2'); setLow('dbe');
|
||||
setHigh('dbe'); setLow('tsc'); setHigh('halt');
|
||||
setHigh('irq'); setHigh('nmi');
|
||||
recalcNodeList(allNodes());
|
||||
for(var i=0;i<8;i++){
|
||||
setLow('phi1');
|
||||
setHigh('phi2'); setHigh('dbe');
|
||||
setLow('phi2'); setLow('dbe');
|
||||
setHigh('phi1');
|
||||
}
|
||||
setHigh(nodenamereset);
|
||||
for(var i=0;i<6;i++){halfStep();} // avoid updating graphics and trace buffer before user code
|
||||
refresh();
|
||||
cycle = 0;
|
||||
trace = Array();
|
||||
if(typeof expertMode != "undefined")
|
||||
updateLogList();
|
||||
chipStatus();
|
||||
if(ctrace)console.log('initChip done after', now()-start);
|
||||
}
|
||||
|
||||
function handleBusRead(){
|
||||
if(isNodeHigh(nodenames['rw'])){
|
||||
var a = readAddressBus();
|
||||
var d = eval(readTriggers[a]);
|
||||
if(d == undefined)
|
||||
d = mRead(readAddressBus());
|
||||
if(isNodeHigh(nodenames['sync']))
|
||||
eval(fetchTriggers[d]);
|
||||
writeDataBus(d);
|
||||
}
|
||||
}
|
||||
|
||||
function readAccA(){return readBits('acca', 8);}
|
||||
function readAccB(){return readBits('accb', 8);}
|
||||
function readIX(){return (readBits('ixh', 8)<<8) + readBits('ixl', 8);}
|
||||
function readSP(){return (readBits('sph', 8)<<8) + readBits('spl', 8);}
|
||||
function readPstring(){
|
||||
var result;
|
||||
result = '‑' + // non-breaking hyphen
|
||||
'‑' + // non-breaking hyphen
|
||||
(isNodeHigh(nodenames['flagh'])?'H':'h') +
|
||||
(isNodeHigh(nodenames['flagi'])?'I':'i') +
|
||||
(isNodeHigh(nodenames['flagn'])?'N':'n') +
|
||||
(isNodeHigh(nodenames['flagz'])?'Z':'z') +
|
||||
(isNodeHigh(nodenames['flagv'])?'V':'v') +
|
||||
(isNodeHigh(nodenames['flagc'])?'C':'c');
|
||||
return result;
|
||||
}
|
||||
|
||||
// The 6800 state control is something like a branching shift register
|
||||
// ... but not quite like that
|
||||
TCStates=[
|
||||
"Ts", "Tf",
|
||||
"Tx0", "Tx1", "Tx2",
|
||||
"Ta0", "Ta1", "Ta2",
|
||||
"Td0_0",
|
||||
"#Te0", "Te1_0",
|
||||
"Tg0", "Tg1", "Tg2", "Tg3", "Tg4", "Tg5", "Tg6", "Tg7", "Tg8",
|
||||
"Tr3", "Tr4", "Tr5", "Tr6", "Tr7", "Tr8",
|
||||
];
|
||||
|
||||
function listActiveTCStates() {
|
||||
var s=[];
|
||||
for(var i=0;i<TCStates.length;i++){
|
||||
var t=TCStates[i];
|
||||
// remove a leading hash, but invert the signal
|
||||
// in any case, remove any trailing suffix
|
||||
if(t[0]=="#"){
|
||||
if(!isNodeHigh(nodenames[t])) s.push(t.slice(1,4));
|
||||
} else {
|
||||
if(isNodeHigh(nodenames[t])) s.push(t.slice(0,3));
|
||||
}
|
||||
}
|
||||
return s.join("+");
|
||||
}
|
||||
|
||||
function busToString(busname){
|
||||
// takes a signal name or prefix
|
||||
// returns an appropriate string representation
|
||||
// some 'signal names' are CPU-specific aliases to user-friendly string output
|
||||
if(busname=='cycle')
|
||||
return cycle>>1;
|
||||
if(busname=='pc')
|
||||
return busToHex('pch') + busToHex('pcl');
|
||||
if(busname=='sp')
|
||||
return busToHex('sph') + busToHex('spl');
|
||||
if(busname=='ix')
|
||||
return busToHex('ixh') + busToHex('ixl');
|
||||
if(busname=='inc')
|
||||
return busToHex('inch') + busToHex('incl');
|
||||
if(busname=='p')
|
||||
return readPstring();
|
||||
if(busname=='State')
|
||||
return listActiveTCStates();
|
||||
if(busname=='Execute')
|
||||
return disassemblytoHTML(readBits('ir',8));
|
||||
if(busname=='Fetch')
|
||||
return isNodeHigh(nodenames['sync'])?disassemblytoHTML(readDataBus()):"";
|
||||
if(busname=='plaOutputs')
|
||||
// PLA outputs are mostly ^op- but some have a prefix too
|
||||
// - we'll allow the x and xx prefix but ignore the #
|
||||
return listActiveSignals('^([x]?x-)?op-');
|
||||
if(busname=='DPControl')
|
||||
return listActiveSignals('^dpc[0-9]+_');
|
||||
if(busname[0]=="-"){
|
||||
// invert the value of the bus for display
|
||||
var value=busToHex(busname.slice(1))
|
||||
if(typeof value != "undefined")
|
||||
return value.replace(/./g,function(x){return (15-parseInt(x,16)).toString(16)});
|
||||
else
|
||||
return undefined;;
|
||||
} else {
|
||||
return busToHex(busname);
|
||||
}
|
||||
}
|
||||
|
||||
function chipStatus(){
|
||||
var ab = readAddressBus();
|
||||
var machine1 =
|
||||
' halfcyc:' + cycle +
|
||||
' phi0:' + readBit('phi2') +
|
||||
' AB:' + hexWord(ab) +
|
||||
' D:' + hexByte(readDataBus()) +
|
||||
' RnW:' + readBit('rw') +
|
||||
' VMA:' + readBit('vma');
|
||||
var machine2 =
|
||||
' PC:' + hexWord(readPC()) +
|
||||
' A:' + hexByte(readAccA()) +
|
||||
' B:' + hexByte(readAccB()) +
|
||||
' IX:' + hexWord(readIX()) +
|
||||
' SP:' + hexWord(readSP()) +
|
||||
' ' + readPstring();
|
||||
var machine3 =
|
||||
'Hz: ' + estimatedHz().toFixed(1);
|
||||
if(typeof expertMode != "undefined") {
|
||||
machine3 += ' Exec: ' + busToString('Execute'); // no T-state info for 6800 yet
|
||||
if(isNodeHigh(nodenames['sync']))
|
||||
machine3 += ' (Fetch: ' + busToString('Fetch') + ')';
|
||||
if(goldenChecksum != undefined)
|
||||
machine3 += " Chk:" + traceChecksum + ((traceChecksum==goldenChecksum)?" OK":" no match");
|
||||
}
|
||||
|
||||
setStatus(machine1, machine2, machine3);
|
||||
if (logThese.length>1) {
|
||||
updateLogbox(logThese);
|
||||
}
|
||||
selectCell(ab);
|
||||
}
|
||||
|
||||
// javascript derived from http://segher.ircgeeks.net/6800/OPS
|
||||
var disassembly={
|
||||
0x00: "!",
|
||||
0x01: "nop",
|
||||
0x02: "!",
|
||||
0x03: "!",
|
||||
0x04: "!",
|
||||
0x05: "!",
|
||||
0x06: "tap",
|
||||
0x07: "tpa",
|
||||
0x10: "sba",
|
||||
0x11: "cba",
|
||||
0x12: "!",
|
||||
0x13: "!",
|
||||
0x14: "!nba",
|
||||
0x15: "!",
|
||||
0x16: "tab",
|
||||
0x17: "tba",
|
||||
0x20: "bra N",
|
||||
0x21: "!",
|
||||
0x22: "bhi N",
|
||||
0x23: "bls N",
|
||||
0x24: "bcc N",
|
||||
0x25: "bcs N",
|
||||
0x26: "bne N",
|
||||
0x27: "beq N",
|
||||
0x30: "tsx",
|
||||
0x31: "ins",
|
||||
0x32: "pul a",
|
||||
0x33: "pul b",
|
||||
0x34: "des",
|
||||
0x35: "txs",
|
||||
0x36: "psh a",
|
||||
0x37: "psh b",
|
||||
0x40: "neg a",
|
||||
0x41: "!",
|
||||
0x42: "!",
|
||||
0x43: "com a",
|
||||
0x44: "lsr a",
|
||||
0x45: "!",
|
||||
0x46: "ror a",
|
||||
0x47: "asr a",
|
||||
0x50: "neg b",
|
||||
0x51: "!",
|
||||
0x52: "!",
|
||||
0x53: "com b",
|
||||
0x54: "lsr b",
|
||||
0x55: "!",
|
||||
0x56: "ror b",
|
||||
0x57: "asr b",
|
||||
0x60: "neg Nx",
|
||||
0x61: "!",
|
||||
0x62: "!",
|
||||
0x63: "com Nx",
|
||||
0x64: "lsr Nx",
|
||||
0x65: "!",
|
||||
0x66: "ror Nx",
|
||||
0x67: "asr Nx",
|
||||
0x70: "neg NN",
|
||||
0x71: "!",
|
||||
0x72: "!",
|
||||
0x73: "com NN",
|
||||
0x74: "lsr NN",
|
||||
0x75: "!",
|
||||
0x76: "ror NN",
|
||||
0x77: "asr NN",
|
||||
0x80: "sub a #",
|
||||
0x81: "cmp a #",
|
||||
0x82: "sbc a #",
|
||||
0x83: "!",
|
||||
0x84: "and a #",
|
||||
0x85: "bit a #",
|
||||
0x86: "lda a #",
|
||||
0x87: "!",
|
||||
0x90: "sub a N",
|
||||
0x91: "cmp a N",
|
||||
0x92: "sbc a N",
|
||||
0x93: "!",
|
||||
0x94: "and a N",
|
||||
0x95: "bit a N",
|
||||
0x96: "lda a N",
|
||||
0x97: "sta a N",
|
||||
0xa0: "sub a Nx",
|
||||
0xa1: "cmp a Nx",
|
||||
0xa2: "sbc a Nx",
|
||||
0xa3: "!",
|
||||
0xa4: "and a Nx",
|
||||
0xa5: "bit a Nx",
|
||||
0xa6: "lda a Nx",
|
||||
0xa7: "sta a Nx",
|
||||
0xb0: "sub a NN",
|
||||
0xb1: "cmp a NN",
|
||||
0xb2: "sbc a NN",
|
||||
0xb3: "!",
|
||||
0xb4: "and a NN",
|
||||
0xb5: "bit a NN",
|
||||
0xb6: "lda a NN",
|
||||
0xb7: "sta a NN",
|
||||
0xc0: "sub b #",
|
||||
0xc1: "cmp b #",
|
||||
0xc2: "sbc b #",
|
||||
0xc3: "!",
|
||||
0xc4: "and b #",
|
||||
0xc5: "bit b #",
|
||||
0xc6: "lda b #",
|
||||
0xc7: "!",
|
||||
0xd0: "sub b N",
|
||||
0xd1: "cmp b N",
|
||||
0xd2: "sbc b N",
|
||||
0xd3: "!",
|
||||
0xd4: "and b N",
|
||||
0xd5: "bit b N",
|
||||
0xd6: "lda b N",
|
||||
0xd7: "sta b N",
|
||||
0xe0: "sub b Nx",
|
||||
0xe1: "cmp b Nx",
|
||||
0xe2: "sbc b Nx",
|
||||
0xe3: "!",
|
||||
0xe4: "and b Nx",
|
||||
0xe5: "bit b Nx",
|
||||
0xe6: "lda b Nx",
|
||||
0xe7: "sta b Nx",
|
||||
0xf0: "sub b NN",
|
||||
0xf1: "cmp b NN",
|
||||
0xf2: "sbc b NN",
|
||||
0xf3: "!",
|
||||
0xf4: "and b NN",
|
||||
0xf5: "bit b NN",
|
||||
0xf6: "lda b NN",
|
||||
0xf7: "sta b NN",
|
||||
0x08: "inx",
|
||||
0x09: "dex",
|
||||
0x0a: "clv",
|
||||
0x0b: "sev",
|
||||
0x0c: "clc",
|
||||
0x0d: "sec",
|
||||
0x0e: "cli",
|
||||
0x0f: "sei",
|
||||
0x18: "!",
|
||||
0x19: "daa",
|
||||
0x1a: "!",
|
||||
0x1b: "aba",
|
||||
0x1c: "!",
|
||||
0x1d: "!",
|
||||
0x1e: "!",
|
||||
0x1f: "!",
|
||||
0x28: "bvc N",
|
||||
0x29: "bvs N",
|
||||
0x2a: "bpl N",
|
||||
0x2b: "bmi N",
|
||||
0x2c: "bge N",
|
||||
0x2d: "blt N",
|
||||
0x2e: "bgt N",
|
||||
0x2f: "ble N",
|
||||
0x38: "!",
|
||||
0x39: "rts",
|
||||
0x3a: "!",
|
||||
0x3b: "rti",
|
||||
0x3c: "!",
|
||||
0x3d: "!",
|
||||
0x3e: "wai",
|
||||
0x3f: "swi",
|
||||
0x48: "asl a",
|
||||
0x49: "rol a",
|
||||
0x4a: "dec a",
|
||||
0x4b: "!",
|
||||
0x4c: "inc a",
|
||||
0x4d: "tst a",
|
||||
0x4e: "!",
|
||||
0x4f: "clr a",
|
||||
0x58: "asl b",
|
||||
0x59: "rol b",
|
||||
0x5a: "dec b",
|
||||
0x5b: "!",
|
||||
0x5c: "inc b",
|
||||
0x5d: "tst b",
|
||||
0x5e: "!",
|
||||
0x5f: "clr b",
|
||||
0x68: "asl Nx",
|
||||
0x69: "rol Nx",
|
||||
0x6a: "dec Nx",
|
||||
0x6b: "!",
|
||||
0x6c: "inc Nx",
|
||||
0x6d: "tst Nx",
|
||||
0x6e: "jmp Nx",
|
||||
0x6f: "clr Nx",
|
||||
0x78: "asl NN",
|
||||
0x79: "rol NN",
|
||||
0x7a: "dec NN",
|
||||
0x7b: "!",
|
||||
0x7c: "inc NN",
|
||||
0x7d: "tst NN",
|
||||
0x7e: "jmp NN",
|
||||
0x7f: "clr NN",
|
||||
0x88: "eor a #",
|
||||
0x89: "adc a #",
|
||||
0x8a: "ora a #",
|
||||
0x8b: "add a #",
|
||||
0x8c: "cpx ##",
|
||||
0x8d: "bsr N",
|
||||
0x8e: "lds ##",
|
||||
0x8f: "!",
|
||||
0x98: "eor a N",
|
||||
0x99: "adc a N",
|
||||
0x9a: "ora a N",
|
||||
0x9b: "add a N",
|
||||
0x9c: "cpx N",
|
||||
0x9d: "!hcf",
|
||||
0x9e: "lds N",
|
||||
0x9f: "sts N",
|
||||
0xa8: "eor a Nx",
|
||||
0xa9: "adc a Nx",
|
||||
0xaa: "ora a Nx",
|
||||
0xab: "add a Nx",
|
||||
0xac: "cpx Nx",
|
||||
0xad: "jsr Nx",
|
||||
0xae: "lds Nx",
|
||||
0xaf: "sts Nx",
|
||||
0xb8: "eor a NN",
|
||||
0xb9: "adc a NN",
|
||||
0xba: "ora a NN",
|
||||
0xbb: "add a NN",
|
||||
0xbc: "cpx NN",
|
||||
0xbd: "jsr NN",
|
||||
0xbe: "lds NN",
|
||||
0xbf: "sts NN",
|
||||
0xc8: "eor b #",
|
||||
0xc9: "adc b #",
|
||||
0xca: "ora b #",
|
||||
0xcb: "add b #",
|
||||
0xcc: "!",
|
||||
0xcd: "!",
|
||||
0xce: "ldx ##",
|
||||
0xcf: "!",
|
||||
0xd8: "eor b N",
|
||||
0xd9: "adc b N",
|
||||
0xda: "ora b N",
|
||||
0xdb: "add b N",
|
||||
0xdc: "!",
|
||||
0xdd: "!hcf",
|
||||
0xde: "ldx N",
|
||||
0xdf: "stx N",
|
||||
0xe8: "eor b Nx",
|
||||
0xe9: "adc b Nx",
|
||||
0xea: "ora b Nx",
|
||||
0xeb: "add b Nx",
|
||||
0xec: "!",
|
||||
0xed: "!",
|
||||
0xee: "ldx Nx",
|
||||
0xef: "stx Nx",
|
||||
0xf8: "eor b NN",
|
||||
0xf9: "adc b NN",
|
||||
0xfa: "ora b NN",
|
||||
0xfb: "add b NN",
|
||||
0xfc: "!",
|
||||
0xfd: "!",
|
||||
0xfe: "ldx NN",
|
||||
0xff: "stx NN",
|
||||
};
|
|
@ -0,0 +1,31 @@
|
|||
// This file testprogram.js can be substituted by one of several tests
|
||||
testprogramAddress=0x0000;
|
||||
|
||||
// we want to auto-clear the console if any output is sent by the program
|
||||
var consoleboxStream="";
|
||||
|
||||
// demonstrate write hook
|
||||
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 = [
|
||||
0xce, 0x43, 0x21, // LDX #4321
|
||||
0x35, // TXS
|
||||
0xce, 0x80, 0x00, // LDX #8000
|
||||
0xc6, 0x40, // LDAB #$40
|
||||
0xbd, 0x00, 0x10, // JSR $0010
|
||||
0x7e, 0x00, 0x09, // JMP $0009
|
||||
0x01, // NOP
|
||||
0x4a, // DECA
|
||||
0xe7, 0x00, // STAB 0, X
|
||||
0x7c, 0x00, 0x0f, // INC $0F
|
||||
0x0d, // SEC
|
||||
0xc9, 0x02, // ADCB #$02
|
||||
0x39, // RTS
|
||||
]
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,530 @@
|
|||
// ***********************************************************
|
||||
// * This file is automatically generated by Z80Simulator. *
|
||||
// * Please do not manually edit! Instead, find a transistor *
|
||||
// * that uses the new signal and use FindTransistor(x,y) in *
|
||||
// * Z80Simulator to cause that signal to be added. *
|
||||
// * This seems a pain, but it has two advantages: *
|
||||
// * - all signals are then available in Z80Simulator *
|
||||
// * - it avoids renumbering issues if/when the PNGs change *
|
||||
// ***********************************************************
|
||||
var nodenames ={
|
||||
// Pads
|
||||
vss: 1,
|
||||
vcc: 2,
|
||||
clk: 3,
|
||||
ab0: 5,
|
||||
ab1: 6,
|
||||
ab2: 7,
|
||||
ab3: 8,
|
||||
ab4: 9,
|
||||
ab5: 10,
|
||||
ab6: 11,
|
||||
ab7: 12,
|
||||
ab8: 13,
|
||||
ab9: 14,
|
||||
ab10: 15,
|
||||
ab11: 16,
|
||||
ab12: 17,
|
||||
ab13: 18,
|
||||
ab14: 19,
|
||||
ab15: 20,
|
||||
_reset: 21,
|
||||
_wait: 22,
|
||||
wait: 22,
|
||||
_int: 23,
|
||||
int: 23,
|
||||
_irq: 23,
|
||||
irq: 23,
|
||||
_nmi: 24,
|
||||
nmi: 24,
|
||||
_busrq: 25,
|
||||
busrq: 25,
|
||||
_m1: 26,
|
||||
_rd: 27,
|
||||
_wr: 28,
|
||||
_mreq: 29,
|
||||
_iorq: 30,
|
||||
_rfsh: 31,
|
||||
db0: 32,
|
||||
db1: 33,
|
||||
db2: 34,
|
||||
db3: 35,
|
||||
db4: 36,
|
||||
db5: 37,
|
||||
db6: 38,
|
||||
db7: 39,
|
||||
_halt: 40,
|
||||
_busak: 41,
|
||||
// T-States
|
||||
t1: 115,
|
||||
t2: 137,
|
||||
t3: 144,
|
||||
t4: 166,
|
||||
t5: 134,
|
||||
t6: 168,
|
||||
// Machine cycles
|
||||
m1: 155,
|
||||
m2: 173,
|
||||
m3: 163,
|
||||
m4: 159,
|
||||
m5: 209,
|
||||
m6: 210,
|
||||
// EXX latches
|
||||
ex_af: 631,
|
||||
ex_bcdehl: 1770,
|
||||
ex_dehl0: 625,
|
||||
ex_dehl1: 629,
|
||||
ex_dehl_combined: 626,
|
||||
// Registers
|
||||
reg_a0: 2245,
|
||||
reg_a1: 2319,
|
||||
reg_a2: 2357,
|
||||
reg_a3: 2442,
|
||||
reg_a4: 2463,
|
||||
reg_a5: 2552,
|
||||
reg_a6: 2586,
|
||||
reg_a7: 2656,
|
||||
reg_f0: 1827,
|
||||
reg_f1: 1903,
|
||||
reg_f2: 1928,
|
||||
reg_f3: 2009,
|
||||
reg_f4: 2032,
|
||||
reg_f5: 2107,
|
||||
reg_f6: 2132,
|
||||
reg_f7: 2209,
|
||||
reg_b0: 2242,
|
||||
reg_b1: 2316,
|
||||
reg_b2: 2354,
|
||||
reg_b3: 2439,
|
||||
reg_b4: 2460,
|
||||
reg_b5: 2549,
|
||||
reg_b6: 2583,
|
||||
reg_b7: 2653,
|
||||
reg_c0: 1824,
|
||||
reg_c1: 1900,
|
||||
reg_c2: 1925,
|
||||
reg_c3: 2006,
|
||||
reg_c4: 2029,
|
||||
reg_c5: 2104,
|
||||
reg_c6: 2129,
|
||||
reg_c7: 2206,
|
||||
reg_d0: 2238,
|
||||
reg_d1: 2312,
|
||||
reg_d2: 2350,
|
||||
reg_d3: 2435,
|
||||
reg_d4: 2456,
|
||||
reg_d5: 2545,
|
||||
reg_d6: 2579,
|
||||
reg_d7: 2649,
|
||||
reg_e0: 1820,
|
||||
reg_e1: 1896,
|
||||
reg_e2: 1921,
|
||||
reg_e3: 2002,
|
||||
reg_e4: 2025,
|
||||
reg_e5: 2100,
|
||||
reg_e6: 2125,
|
||||
reg_e7: 2202,
|
||||
reg_h0: 2240,
|
||||
reg_h1: 2314,
|
||||
reg_h2: 2352,
|
||||
reg_h3: 2437,
|
||||
reg_h4: 2458,
|
||||
reg_h5: 2547,
|
||||
reg_h6: 2581,
|
||||
reg_h7: 2651,
|
||||
reg_l0: 1822,
|
||||
reg_l1: 1898,
|
||||
reg_l2: 1923,
|
||||
reg_l3: 2004,
|
||||
reg_l4: 2027,
|
||||
reg_l5: 2102,
|
||||
reg_l6: 2127,
|
||||
reg_l7: 2204,
|
||||
reg_w0: 2234,
|
||||
reg_w1: 2308,
|
||||
reg_w2: 2346,
|
||||
reg_w3: 2431,
|
||||
reg_w4: 2452,
|
||||
reg_w5: 2541,
|
||||
reg_w6: 2575,
|
||||
reg_w7: 2645,
|
||||
reg_z0: 1816,
|
||||
reg_z1: 1892,
|
||||
reg_z2: 1917,
|
||||
reg_z3: 1998,
|
||||
reg_z4: 2021,
|
||||
reg_z5: 2096,
|
||||
reg_z6: 2121,
|
||||
reg_z7: 2198,
|
||||
reg_pch0: 2232,
|
||||
reg_pch1: 2306,
|
||||
reg_pch2: 2344,
|
||||
reg_pch3: 2429,
|
||||
reg_pch4: 2450,
|
||||
reg_pch5: 2539,
|
||||
reg_pch6: 2573,
|
||||
reg_pch7: 2643,
|
||||
reg_pcl0: 1814,
|
||||
reg_pcl1: 1890,
|
||||
reg_pcl2: 1915,
|
||||
reg_pcl3: 1996,
|
||||
reg_pcl4: 2019,
|
||||
reg_pcl5: 2094,
|
||||
reg_pcl6: 2119,
|
||||
reg_pcl7: 2196,
|
||||
reg_sph0: 2235,
|
||||
reg_sph1: 2309,
|
||||
reg_sph2: 2347,
|
||||
reg_sph3: 2432,
|
||||
reg_sph4: 2453,
|
||||
reg_sph5: 2542,
|
||||
reg_sph6: 2576,
|
||||
reg_sph7: 2646,
|
||||
reg_spl0: 1817,
|
||||
reg_spl1: 1893,
|
||||
reg_spl2: 1918,
|
||||
reg_spl3: 1999,
|
||||
reg_spl4: 2022,
|
||||
reg_spl5: 2097,
|
||||
reg_spl6: 2122,
|
||||
reg_spl7: 2199,
|
||||
reg_ixh0: 2237,
|
||||
reg_ixh1: 2311,
|
||||
reg_ixh2: 2349,
|
||||
reg_ixh3: 2434,
|
||||
reg_ixh4: 2455,
|
||||
reg_ixh5: 2544,
|
||||
reg_ixh6: 2578,
|
||||
reg_ixh7: 2648,
|
||||
reg_ixl0: 1819,
|
||||
reg_ixl1: 1895,
|
||||
reg_ixl2: 1920,
|
||||
reg_ixl3: 2001,
|
||||
reg_ixl4: 2024,
|
||||
reg_ixl5: 2099,
|
||||
reg_ixl6: 2124,
|
||||
reg_ixl7: 2201,
|
||||
reg_iyh0: 2236,
|
||||
reg_iyh1: 2310,
|
||||
reg_iyh2: 2348,
|
||||
reg_iyh3: 2433,
|
||||
reg_iyh4: 2454,
|
||||
reg_iyh5: 2543,
|
||||
reg_iyh6: 2577,
|
||||
reg_iyh7: 2647,
|
||||
reg_iyl0: 1818,
|
||||
reg_iyl1: 1894,
|
||||
reg_iyl2: 1919,
|
||||
reg_iyl3: 2000,
|
||||
reg_iyl4: 2023,
|
||||
reg_iyl5: 2098,
|
||||
reg_iyl6: 2123,
|
||||
reg_iyl7: 2200,
|
||||
reg_i0: 2233,
|
||||
reg_i1: 2307,
|
||||
reg_i2: 2345,
|
||||
reg_i3: 2430,
|
||||
reg_i4: 2451,
|
||||
reg_i5: 2540,
|
||||
reg_i6: 2574,
|
||||
reg_i7: 2644,
|
||||
reg_r0: 1815,
|
||||
reg_r1: 1891,
|
||||
reg_r2: 1916,
|
||||
reg_r3: 1997,
|
||||
reg_r4: 2020,
|
||||
reg_r5: 2095,
|
||||
reg_r6: 2120,
|
||||
reg_r7: 2197,
|
||||
reg_aa0: 2244,
|
||||
reg_aa1: 2318,
|
||||
reg_aa2: 2356,
|
||||
reg_aa3: 2441,
|
||||
reg_aa4: 2462,
|
||||
reg_aa5: 2551,
|
||||
reg_aa6: 2585,
|
||||
reg_aa7: 2655,
|
||||
reg_ff0: 1826,
|
||||
reg_ff1: 1902,
|
||||
reg_ff2: 1927,
|
||||
reg_ff3: 2008,
|
||||
reg_ff4: 2031,
|
||||
reg_ff5: 2106,
|
||||
reg_ff6: 2131,
|
||||
reg_ff7: 2208,
|
||||
reg_bb0: 2243,
|
||||
reg_bb1: 2317,
|
||||
reg_bb2: 2355,
|
||||
reg_bb3: 2440,
|
||||
reg_bb4: 2461,
|
||||
reg_bb5: 2550,
|
||||
reg_bb6: 2584,
|
||||
reg_bb7: 2654,
|
||||
reg_cc0: 1825,
|
||||
reg_cc1: 1901,
|
||||
reg_cc2: 1926,
|
||||
reg_cc3: 2007,
|
||||
reg_cc4: 2030,
|
||||
reg_cc5: 2105,
|
||||
reg_cc6: 2130,
|
||||
reg_cc7: 2207,
|
||||
reg_dd0: 2239,
|
||||
reg_dd1: 2313,
|
||||
reg_dd2: 2351,
|
||||
reg_dd3: 2436,
|
||||
reg_dd4: 2457,
|
||||
reg_dd5: 2546,
|
||||
reg_dd6: 2580,
|
||||
reg_dd7: 2650,
|
||||
reg_ee0: 1821,
|
||||
reg_ee1: 1897,
|
||||
reg_ee2: 1922,
|
||||
reg_ee3: 2003,
|
||||
reg_ee4: 2026,
|
||||
reg_ee5: 2101,
|
||||
reg_ee6: 2126,
|
||||
reg_ee7: 2203,
|
||||
reg_hh0: 2241,
|
||||
reg_hh1: 2315,
|
||||
reg_hh2: 2353,
|
||||
reg_hh3: 2438,
|
||||
reg_hh4: 2459,
|
||||
reg_hh5: 2548,
|
||||
reg_hh6: 2582,
|
||||
reg_hh7: 2652,
|
||||
reg_ll0: 1823,
|
||||
reg_ll1: 1899,
|
||||
reg_ll2: 1924,
|
||||
reg_ll3: 2005,
|
||||
reg_ll4: 2028,
|
||||
reg_ll5: 2103,
|
||||
reg_ll6: 2128,
|
||||
reg_ll7: 2205,
|
||||
// Data buses and control
|
||||
dp_dl: 82,
|
||||
dl_dp: 165,
|
||||
load_ir: 1354,
|
||||
dlatch0: 123,
|
||||
dlatch1: 195,
|
||||
dlatch2: 414,
|
||||
dlatch3: 930,
|
||||
dlatch4: 1000,
|
||||
dlatch5: 872,
|
||||
dlatch6: 751,
|
||||
dlatch7: 358,
|
||||
dl_d: 87,
|
||||
d_dl: 133,
|
||||
dbus0: 138,
|
||||
dbus1: 196,
|
||||
dbus2: 412,
|
||||
dbus3: 480,
|
||||
dbus4: 485,
|
||||
dbus5: 486,
|
||||
dbus6: 380,
|
||||
dbus7: 370,
|
||||
_instr0: 1350,
|
||||
_instr1: 1360,
|
||||
_instr2: 1366,
|
||||
_instr3: 1380,
|
||||
_instr4: 1388,
|
||||
_instr5: 1395,
|
||||
_instr6: 1370,
|
||||
_instr7: 1375,
|
||||
instr0: 1348,
|
||||
instr1: 1359,
|
||||
instr2: 1365,
|
||||
instr3: 1379,
|
||||
instr4: 1387,
|
||||
instr5: 1394,
|
||||
instr6: 1369,
|
||||
instr7: 1374,
|
||||
d_u: 546,
|
||||
ubus0: 545,
|
||||
ubus1: 528,
|
||||
ubus2: 526,
|
||||
ubus3: 770,
|
||||
ubus4: 779,
|
||||
ubus5: 790,
|
||||
ubus6: 716,
|
||||
ubus7: 525,
|
||||
u_v: 750,
|
||||
vbus0: 755,
|
||||
vbus1: 772,
|
||||
vbus2: 783,
|
||||
vbus3: 796,
|
||||
vbus4: 803,
|
||||
vbus5: 808,
|
||||
vbus6: 836,
|
||||
vbus7: 839,
|
||||
rl_wr: 678,
|
||||
rh_wr: 652,
|
||||
r_u: 692,
|
||||
r_v: 693,
|
||||
regbit0: 702,
|
||||
regbit1: 732,
|
||||
regbit2: 738,
|
||||
regbit3: 775,
|
||||
regbit4: 776,
|
||||
regbit5: 807,
|
||||
regbit6: 809,
|
||||
regbit7: 864,
|
||||
regbit8: 870,
|
||||
regbit9: 902,
|
||||
regbit10: 906,
|
||||
regbit11: 934,
|
||||
regbit12: 935,
|
||||
regbit13: 970,
|
||||
regbit14: 973,
|
||||
regbit15: 999,
|
||||
r_p: 1785,
|
||||
r_x1: 608,
|
||||
pcbit0: 703,
|
||||
pcbit1: 731,
|
||||
pcbit2: 739,
|
||||
pcbit3: 774,
|
||||
pcbit4: 777,
|
||||
pcbit5: 806,
|
||||
pcbit6: 810,
|
||||
pcbit7: 863,
|
||||
pcbit8: 871,
|
||||
pcbit9: 901,
|
||||
pcbit10: 907,
|
||||
pcbit11: 933,
|
||||
pcbit12: 936,
|
||||
pcbit13: 969,
|
||||
pcbit14: 974,
|
||||
pcbit15: 998,
|
||||
// ALU
|
||||
alubus0: 837,
|
||||
alubus1: 889,
|
||||
alubus2: 937,
|
||||
alubus3: 983,
|
||||
alubus4: 852,
|
||||
alubus5: 903,
|
||||
alubus6: 951,
|
||||
alubus7: 995,
|
||||
alua0: 850,
|
||||
alua1: 899,
|
||||
alua2: 947,
|
||||
alua3: 993,
|
||||
alua4: 868,
|
||||
alua5: 920,
|
||||
alua6: 968,
|
||||
alua7: 1007,
|
||||
alub0: 845,
|
||||
alub1: 897,
|
||||
alub2: 944,
|
||||
alub3: 988,
|
||||
alub4: 867,
|
||||
alub5: 918,
|
||||
alub6: 966,
|
||||
alub7: 1005,
|
||||
aluout0: 2211,
|
||||
aluout1: 2338,
|
||||
aluout2: 2504,
|
||||
aluout3: 816,
|
||||
alulat0: 865,
|
||||
alulat1: 912,
|
||||
alulat2: 960,
|
||||
alulat3: 1002,
|
||||
// PLA
|
||||
pla0: 287,
|
||||
pla1: 332,
|
||||
pla2: 314,
|
||||
pla3: 333,
|
||||
pla4: 315,
|
||||
pla5: 334,
|
||||
pla6: 316,
|
||||
pla7: 335,
|
||||
pla8: 317,
|
||||
pla9: 336,
|
||||
pla10: 318,
|
||||
pla11: 361,
|
||||
pla12: 261,
|
||||
pla13: 337,
|
||||
pla14: 319,
|
||||
pla15: 464,
|
||||
pla16: 288,
|
||||
pla17: 338,
|
||||
pla18: 320,
|
||||
pla19: 364,
|
||||
pla20: 325,
|
||||
pla21: 324,
|
||||
pla22: 308,
|
||||
pla23: 289,
|
||||
pla24: 339,
|
||||
pla25: 313,
|
||||
pla26: 340,
|
||||
pla27: 290,
|
||||
pla28: 341,
|
||||
pla29: 291,
|
||||
pla30: 342,
|
||||
pla31: 292,
|
||||
pla32: 365,
|
||||
pla33: 293,
|
||||
pla34: 362,
|
||||
pla35: 294,
|
||||
pla36: 331,
|
||||
pla37: 293,
|
||||
pla38: 343,
|
||||
pla39: 296,
|
||||
pla40: 297,
|
||||
pla41: 298,
|
||||
pla42: 344,
|
||||
pla43: 299,
|
||||
pla44: 269,
|
||||
pla45: 300,
|
||||
pla46: 237,
|
||||
pla47: 301,
|
||||
pla48: 345,
|
||||
pla49: 302,
|
||||
pla50: 346,
|
||||
pla51: 264,
|
||||
pla52: 266,
|
||||
pla53: 347,
|
||||
pla54: 303,
|
||||
pla55: 356,
|
||||
pla56: 227,
|
||||
pla57: 366,
|
||||
pla58: 304,
|
||||
pla59: 305,
|
||||
pla60: 271,
|
||||
pla61: 348,
|
||||
pla62: 306,
|
||||
pla63: 309,
|
||||
pla64: 311,
|
||||
pla65: 312,
|
||||
pla66: 307,
|
||||
pla67: 367,
|
||||
pla68: 272,
|
||||
pla69: 349,
|
||||
pla70: 273,
|
||||
pla71: 350,
|
||||
pla72: 274,
|
||||
pla73: 351,
|
||||
pla74: 275,
|
||||
pla75: 276,
|
||||
pla76: 268,
|
||||
pla77: 352,
|
||||
pla78: 277,
|
||||
pla79: 278,
|
||||
pla80: 279,
|
||||
pla81: 280,
|
||||
pla82: 368,
|
||||
pla83: 281,
|
||||
pla84: 282,
|
||||
pla85: 283,
|
||||
pla86: 284,
|
||||
pla87: 285,
|
||||
pla88: 286,
|
||||
pla89: 321,
|
||||
pla90: 353,
|
||||
pla91: 322,
|
||||
pla92: 354,
|
||||
pla93: 323,
|
||||
pla94: 369,
|
||||
pla95: 258,
|
||||
pla96: 249,
|
||||
pla97: 245,
|
||||
pla98: 355,
|
||||
}
|
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,73 @@
|
|||
// This file testprogram.js can be substituted by one of several tests
|
||||
testprogramAddress=0x0000;
|
||||
|
||||
// we want to auto-clear the console if any output is sent by the program
|
||||
var consoleboxStream="";
|
||||
|
||||
// demonstrate write hook
|
||||
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 = [
|
||||
0x00, // NOP
|
||||
0x31, 0x00, 0x01, // LD SP,0x0100
|
||||
0xCD, 0x0B, 0x00, // CALL $000B
|
||||
0x00, // NOP
|
||||
0x21, 0x78, 0x56, // LD HL,$5678
|
||||
0x21, 0x34, 0x12, // LD HL,$1234
|
||||
0xe5, // PUSH HL
|
||||
0x00, // NOP
|
||||
0x00, // NOP
|
||||
0x3C, // INC A
|
||||
0x04, // INC B
|
||||
0x15, // DEC D
|
||||
0x24, // INC H
|
||||
0xEB, // EXX DE,HL
|
||||
0x00, // NOP
|
||||
0x3C, // INC A
|
||||
0x04, // INC B
|
||||
0x15, // DEC D
|
||||
0x24, // INC H
|
||||
0xD9, // EXX
|
||||
0x00, // NOP
|
||||
0x3C, // INC A
|
||||
0x04, // INC B
|
||||
0x15, // DEC D
|
||||
0x24, // INC H
|
||||
0xEB, // EXX DE,HL
|
||||
0x00, // NOP
|
||||
0x3C, // INC A
|
||||
0x04, // INC B
|
||||
0x15, // DEC D
|
||||
0x24, // INC H
|
||||
0x08, // EXX AF,AF'
|
||||
0x00, // NOP
|
||||
0x3C, // INC A
|
||||
0x04, // INC B
|
||||
0x15, // DEC D
|
||||
0x24, // INC H
|
||||
0x00, // NOP
|
||||
0x00, // NOP
|
||||
0x00, // NOP
|
||||
0x21, 0x00, 0x01, // LD HL,$0100
|
||||
0x36, 0xCC, // LD (HL),$CC
|
||||
0x00, // NOP
|
||||
0x7E, // LD A, (HL)
|
||||
0x00, // NOP
|
||||
// Pavel's original test program
|
||||
0x21, 0x34, 0x12, // LD HL,$1234
|
||||
0x31, 0xfe, 0xdc, // LD SP,0xDCFE
|
||||
0xe5, // PUSH HL
|
||||
0x21, 0x78, 0x56, // LD HL,$5678
|
||||
0xe3, // EX (SP),HL
|
||||
0xdd, 0x21, 0xbc,0x9a, // LD IX, 0x9ABC
|
||||
0xdd, 0xe3, // EX (SP),IX
|
||||
0x76, // HALT
|
||||
0x00 // NOP
|
||||
]
|
File diff suppressed because it is too large
Load Diff
12
chipsim.js
12
chipsim.js
|
@ -143,14 +143,22 @@ function saveString(name, str){
|
|||
|
||||
function allNodes(){
|
||||
var res = new Array();
|
||||
for(var i in nodes) if((i!=npwr)&&(i!=ngnd)) res.push(i);
|
||||
var ii = 0;
|
||||
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;
|
||||
}
|
||||
|
||||
function stateString(){
|
||||
var codes = ['l','h'];
|
||||
var res = '';
|
||||
for(var i=0;i<1725;i++){
|
||||
for(var i=0;i<nodes.length;i++){
|
||||
var n = nodes[i];
|
||||
if(n==undefined) res+='x';
|
||||
else if(i==ngnd) res+='g';
|
||||
|
|
|
@ -0,0 +1,153 @@
|
|||
<!DOCTYPE html>
|
||||
|
||||
<head>
|
||||
<title>Visual 6800 in JavaScript</title>
|
||||
<style type="text/css">@import "expert.css";</style>
|
||||
<script src="chip-6800/segdefs.js"></script>
|
||||
<script src="chip-6800/transdefs.js"></script>
|
||||
<script src="chip-6800/nodenames.js"></script>
|
||||
<script src="wires.js"></script>
|
||||
<script src="expertWires.js"></script>
|
||||
<script src="chipsim.js"></script>
|
||||
<script src="memtable.js"></script>
|
||||
<script src="macros.js"></script>
|
||||
<script src="chip-6800/support.js"></script>
|
||||
<script src="chip-6800/testprogram.js"></script>
|
||||
<script src="3rdparty/jquery-1.3.2.min.js"></script>
|
||||
<script src="3rdparty/jquery.cookie.js"></script>
|
||||
<script src="3rdparty/splitter.js"></script>
|
||||
|
||||
<script type="text/javascript">
|
||||
function handleOnload() {
|
||||
/MSIE (\d+\.\d+);/.test(navigator.appVersion);
|
||||
IEVersion=Number(RegExp.$1);
|
||||
if((navigator.appName == 'Microsoft Internet Explorer') && (IEVersion<9)){
|
||||
document.getElementById('browsertrouble').innerHTML=
|
||||
'<p>Sorry, '+navigator.appName+' not supported - showing you a picture instead!</p>';
|
||||
document.getElementById('frame').innerHTML='<a href="browsertrouble.html"><img src="images/jssim2.png" style="border:10px"></a>';
|
||||
}else{
|
||||
setTimeout(setup,200);
|
||||
}
|
||||
};
|
||||
|
||||
// initialise splitter (built on jquery)
|
||||
$().ready(function(){
|
||||
$("#frame").splitter({
|
||||
type: "v",
|
||||
outline: true,
|
||||
minLeft: 20,
|
||||
sizeLeft: 810,
|
||||
resizeToWidth: true,
|
||||
anchorToWindow: true,
|
||||
});
|
||||
$("#rightcolumn").splitter({
|
||||
type: "h",
|
||||
outline: true,
|
||||
sizeBottom: 180,
|
||||
minTop: 100,
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
</head>
|
||||
|
||||
<body onload="handleOnload();">
|
||||
<span id="plain">
|
||||
<a href="http://www.visual6502.org/faq.html">FAQ</a>
|
||||
<a href="http://blog.visual6502.org">Blog</a>
|
||||
<a href="http://www.visual6502.org/links.html">Links</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="http://www.sbprojects.com/sbasm/6800.htm#model">programming model</a>
|
||||
</span>
|
||||
<div class="frame" id="frame">
|
||||
<div class="leftcolumn" id="leftcolumn">
|
||||
<div id="chipsurround" tabindex="1">
|
||||
<div class="chip" id="chip">
|
||||
<span id="waiting">Please wait, graphics initialising...</span>
|
||||
<canvas class="chip" id="chipbg"></canvas>
|
||||
<canvas class="chip" id="overlay"></canvas>
|
||||
<canvas class="chip" id="hilite"></canvas>
|
||||
<canvas class="chip" id="hitbuffer"></canvas>
|
||||
</div>
|
||||
</div> <!-- chipsurround -->
|
||||
<div class="nochip" id="nochip">
|
||||
<form>
|
||||
<input type="button" value="Show chip layout" onclick="updateChipLayoutVisibility(true)" />
|
||||
</form>
|
||||
</div>
|
||||
<div id="layoutControlPanel">
|
||||
Use 'z' or '>' to zoom in, 'x' or '<' to zoom out, click to probe signals and drag to pan.
|
||||
<form id="updateShow"> Show:
|
||||
<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)" />(grounded diffusion)
|
||||
<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)" />(polysilicon)
|
||||
<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)" />(protection)
|
||||
</form>
|
||||
<form action="javascript:hiliteNodeList();">
|
||||
<input type="button" value="Find:" onclick="hiliteNodeList();" />
|
||||
<input type="text" id="HighlightThese" name="HighlightThese" value="" />
|
||||
<input type="button" value="Clear Highlighting" onclick="clearHighlight();" />
|
||||
<span class="animatebox">
|
||||
Animate during simulation:
|
||||
<input type="checkbox" id="animateModeCheckbox" onchange="updateChipLayoutAnimation(this.checked)"
|
||||
/></span>
|
||||
</form>
|
||||
<form>
|
||||
<input type="button" value="Hide Chip Layout" onclick="updateChipLayoutVisibility(false)" />
|
||||
<a href="" id="linkHere" >Link to this location</a>
|
||||
</form>
|
||||
</div>
|
||||
</div> <!-- closing leftcolumn -->
|
||||
<div class="rightcolumn" id="rightcolumn">
|
||||
<div id="righttopdiv">
|
||||
<div class = "buttons">
|
||||
<div class="twobuttons">
|
||||
<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="images/play.png" title="run"></a>
|
||||
</div>
|
||||
<div class="morebuttons">
|
||||
<a href ="javascript:resetChip()"><img class="navbutton" src="images/up.png" title="reset"></a>
|
||||
<a href ="javascript:stepBack()"><img class="navbutton" src="images/prev.png" title="back"></a>
|
||||
<a href ="javascript:stepForward()"><img class="navbutton" src="images/next.png" title="forward"></a>
|
||||
<a href ="javascript:goUntilSyncOrWrite()"><img class="navbutton" src="images/singlestep.png" title="step"></a>
|
||||
<a href ="javascript:goFor()"><img class="navbutton" src="images/fastforward.png" title="fastforward"></a>
|
||||
</div>
|
||||
<div style="float:right;">
|
||||
<a href="http://visual6502.org/wiki/index.php?title=JssimUserHelp" target="_blank">User Guide</a>
|
||||
|
||||
</div>
|
||||
</div> <!-- buttons -->
|
||||
<div class="status" id="status"><p>x: 0<br>y: 0</p>
|
||||
</div> <!-- status -->
|
||||
|
||||
<div id="memtablediv">
|
||||
<table class="memtable" id="memtable" tabindex="2"></table>
|
||||
</div>
|
||||
</div> <!-- righttopdiv -->
|
||||
|
||||
<div id="tracingdiv">
|
||||
<textarea id="consolebox">
|
||||
click here and type if your program handles input
|
||||
</textarea>
|
||||
<div id="expertControlPanel" tabindex="3">
|
||||
<form action="javascript:updateLogList()">
|
||||
<input type="button" value="Trace more" onclick="updateLoglevel(++loglevel)" />
|
||||
<input type="button" value="Trace less" onclick="updateLoglevel(--loglevel)" />
|
||||
<input type="button" value="Trace these too:" onclick="updateLogList()" />
|
||||
<input type="text" id="LogThese" name="LogThese" value="" />
|
||||
<input type="button" value="Log Up/Down" onclick="updateLogDirection();" />
|
||||
<input type="button" value="Clear Log" onclick="updateLoglevel(loglevel)" />
|
||||
</form>
|
||||
<br />
|
||||
</div>
|
||||
<div id="logstreamscroller">
|
||||
<table class="logstream" id="logstream"></table>
|
||||
</div>
|
||||
</div>
|
||||
</div> <!-- closing rightcolumn -->
|
||||
</div> <!-- closing 'frame' div -->
|
||||
</body>
|
||||
</html>
|
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,151 @@
|
|||
<!DOCTYPE html>
|
||||
|
||||
<head>
|
||||
<title>Visual Z80 in JavaScript</title>
|
||||
<style type="text/css">@import "expert.css";</style>
|
||||
<script src="chip-z80/segdefs.js"></script>
|
||||
<script src="chip-z80/transdefs.js"></script>
|
||||
<script src="chip-z80/nodenames.js"></script>
|
||||
<script src="wires.js"></script>
|
||||
<script src="expertWires.js"></script>
|
||||
<script src="chipsim.js"></script>
|
||||
<script src="memtable.js"></script>
|
||||
<script src="macros.js"></script>
|
||||
<script src="chip-z80/support.js"></script>
|
||||
<script src="chip-z80/testprogram.js"></script>
|
||||
<script src="3rdparty/jquery-1.3.2.min.js"></script>
|
||||
<script src="3rdparty/jquery.cookie.js"></script>
|
||||
<script src="3rdparty/splitter.js"></script>
|
||||
|
||||
<script type="text/javascript">
|
||||
function handleOnload() {
|
||||
/MSIE (\d+\.\d+);/.test(navigator.appVersion);
|
||||
IEVersion=Number(RegExp.$1);
|
||||
if((navigator.appName == 'Microsoft Internet Explorer') && (IEVersion<9)){
|
||||
document.getElementById('browsertrouble').innerHTML=
|
||||
'<p>Sorry, '+navigator.appName+' not supported - showing you a picture instead!</p>';
|
||||
document.getElementById('frame').innerHTML='<a href="browsertrouble.html"><img src="images/jssim2.png" style="border:10px"></a>';
|
||||
}else{
|
||||
setTimeout(setup,200);
|
||||
}
|
||||
};
|
||||
|
||||
// initialise splitter (built on jquery)
|
||||
$().ready(function(){
|
||||
$("#frame").splitter({
|
||||
type: "v",
|
||||
outline: true,
|
||||
minLeft: 20,
|
||||
sizeLeft: 810,
|
||||
resizeToWidth: true,
|
||||
anchorToWindow: true,
|
||||
});
|
||||
$("#rightcolumn").splitter({
|
||||
type: "h",
|
||||
outline: true,
|
||||
sizeBottom: 180,
|
||||
minTop: 100,
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
</head>
|
||||
|
||||
<body onload="handleOnload();">
|
||||
<span id="plain">
|
||||
<a href="http://www.visual6502.org/faq.html">FAQ</a>
|
||||
<a href="http://blog.visual6502.org">Blog</a>
|
||||
<a href="http://www.visual6502.org/links.html">Links</a>
|
||||
<a href="http://github.com/trebonian/visual6502">Source</a>
|
||||
</span>
|
||||
<div class="frame" id="frame">
|
||||
<div class="leftcolumn" id="leftcolumn">
|
||||
<div id="chipsurround" tabindex="1">
|
||||
<div class="chip" id="chip">
|
||||
<span id="waiting">Please wait, graphics initialising...</span>
|
||||
<canvas class="chip" id="chipbg"></canvas>
|
||||
<canvas class="chip" id="overlay"></canvas>
|
||||
<canvas class="chip" id="hilite"></canvas>
|
||||
<canvas class="chip" id="hitbuffer"></canvas>
|
||||
</div>
|
||||
</div> <!-- chipsurround -->
|
||||
<div class="nochip" id="nochip">
|
||||
<form>
|
||||
<input type="button" value="Show chip layout" onclick="updateChipLayoutVisibility(true)" />
|
||||
</form>
|
||||
</div>
|
||||
<div id="layoutControlPanel">
|
||||
Use 'z' or '>' to zoom in, 'x' or '<' to zoom out, click to probe signals and drag to pan.
|
||||
<form id="updateShow"> Show:
|
||||
<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)" />(grounded diffusion)
|
||||
<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)" />(polysilicon)
|
||||
<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)" />(protection)
|
||||
</form>
|
||||
<form action="javascript:hiliteNodeList();">
|
||||
<input type="button" value="Find:" onclick="hiliteNodeList();" />
|
||||
<input type="text" id="HighlightThese" name="HighlightThese" value="" />
|
||||
<input type="button" value="Clear Highlighting" onclick="clearHighlight();" />
|
||||
<span class="animatebox">
|
||||
Animate during simulation:
|
||||
<input type="checkbox" id="animateModeCheckbox" onchange="updateChipLayoutAnimation(this.checked)"
|
||||
/></span>
|
||||
</form>
|
||||
<form>
|
||||
<input type="button" value="Hide Chip Layout" onclick="updateChipLayoutVisibility(false)" />
|
||||
<a href="" id="linkHere" >Link to this location</a>
|
||||
</form>
|
||||
</div>
|
||||
</div> <!-- closing leftcolumn -->
|
||||
<div class="rightcolumn" id="rightcolumn">
|
||||
<div id="righttopdiv">
|
||||
<div class = "buttons">
|
||||
<div class="twobuttons">
|
||||
<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="images/play.png" title="run"></a>
|
||||
</div>
|
||||
<div class="morebuttons">
|
||||
<a href ="javascript:resetChip()"><img class="navbutton" src="images/up.png" title="reset"></a>
|
||||
<a href ="javascript:stepBack()"><img class="navbutton" src="images/prev.png" title="back"></a>
|
||||
<a href ="javascript:stepForward()"><img class="navbutton" src="images/next.png" title="forward"></a>
|
||||
<a href ="javascript:goUntilSyncOrWrite()"><img class="navbutton" src="images/singlestep.png" title="step"></a>
|
||||
<a href ="javascript:goFor()"><img class="navbutton" src="images/fastforward.png" title="fastforward"></a>
|
||||
</div>
|
||||
<div style="float:right;">
|
||||
<a href="http://visual6502.org/wiki/index.php?title=JssimUserHelp" target="_blank">User Guide</a>
|
||||
|
||||
</div>
|
||||
</div> <!-- buttons -->
|
||||
<div class="status" id="status"><p>x: 0<br>y: 0</p>
|
||||
</div> <!-- status -->
|
||||
|
||||
<div id="memtablediv">
|
||||
<table class="memtable" id="memtable" tabindex="2"></table>
|
||||
</div>
|
||||
</div> <!-- righttopdiv -->
|
||||
|
||||
<div id="tracingdiv">
|
||||
<textarea id="consolebox">
|
||||
click here and type if your program handles input
|
||||
</textarea>
|
||||
<div id="expertControlPanel" tabindex="3">
|
||||
<form action="javascript:updateLogList()">
|
||||
<input type="button" value="Trace more" onclick="updateLoglevel(++loglevel)" />
|
||||
<input type="button" value="Trace less" onclick="updateLoglevel(--loglevel)" />
|
||||
<input type="button" value="Trace these too:" onclick="updateLogList()" />
|
||||
<input type="text" id="LogThese" name="LogThese" value="" />
|
||||
<input type="button" value="Log Up/Down" onclick="updateLogDirection();" />
|
||||
<input type="button" value="Clear Log" onclick="updateLoglevel(loglevel)" />
|
||||
</form>
|
||||
<br />
|
||||
</div>
|
||||
<div id="logstreamscroller">
|
||||
<table class="logstream" id="logstream"></table>
|
||||
</div>
|
||||
</div>
|
||||
</div> <!-- closing rightcolumn -->
|
||||
</div> <!-- closing 'frame' div -->
|
||||
</body>
|
||||
</html>
|
24
expert.html
24
expert.html
|
@ -56,8 +56,8 @@ $().ready(function(){
|
|||
<a href="http://blog.visual6502.org">Blog</a>
|
||||
<a href="http://www.visual6502.org/links.html">Links</a>
|
||||
<a href="http://github.com/trebonian/visual6502">Source</a>
|
||||
<a href="http://www.6502asm.com/">6502asm assembler</a>
|
||||
<a href="http://www.e-tradition.net/bytes/6502/disassembler.html">e-tradition disassembler</a>
|
||||
<a href="http://skilldrick.github.io/easy6502/#first-program">easy6502 assembler</a>
|
||||
<a href="http://www.masswerk.at/6502/disassembler.html">mass:werk disassembler</a>
|
||||
</span>
|
||||
<div class="frame" id="frame">
|
||||
<div class="leftcolumn" id="leftcolumn">
|
||||
|
@ -76,21 +76,21 @@ $().ready(function(){
|
|||
</form>
|
||||
</div>
|
||||
<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:
|
||||
<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)" />(grounded diffusion)
|
||||
<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)" />(polysilicon)
|
||||
<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)" />(protection)
|
||||
<input type="checkbox" name="1" id="updateShow1" onchange="updateShow(this.name,this.checked)" /><label for="updateShow1">(diffusion)</label>
|
||||
<input type="checkbox" name="3" id="updateShow3" onchange="updateShow(this.name,this.checked)" /><label for="updateShow3">(grounded diffusion)</label>
|
||||
<input type="checkbox" name="4" id="updateShow4" onchange="updateShow(this.name,this.checked)" /><label for="updateShow4">(powered diffusion)</label>
|
||||
<input type="checkbox" name="5" id="updateShow5" onchange="updateShow(this.name,this.checked)" /><label for="updateShow5">(polysilicon)</label>
|
||||
<input type="checkbox" name="0" id="updateShow0" onchange="updateShow(this.name,this.checked)" /><label for="updateShow0">(metal)</label>
|
||||
<input type="checkbox" name="2" id="updateShow2" onchange="updateShow(this.name,this.checked)" /><label for="updateShow2">(protection)</label>
|
||||
</form>
|
||||
<form action="javascript:hiliteNodeList();">
|
||||
<input type="button" value="Highlight:" onclick="hiliteNodeList();" />
|
||||
<input type="button" value="Find:" onclick="hiliteNodeList();" />
|
||||
<input type="text" id="HighlightThese" name="HighlightThese" value="" />
|
||||
<input type="button" value="Clear Highlighting" onclick="clearHighlight();" />
|
||||
<span class="animatebox">
|
||||
Animate during simulation:
|
||||
<label for="animateModeCheckbox">Animate during simulation:</label>
|
||||
<input type="checkbox" id="animateModeCheckbox" onchange="updateChipLayoutAnimation(this.checked)"
|
||||
/></span>
|
||||
</form>
|
||||
|
@ -115,7 +115,7 @@ $().ready(function(){
|
|||
<a href ="javascript:goFor()"><img class="navbutton" src="images/fastforward.png" title="fastforward"></a>
|
||||
</div>
|
||||
<div style="float:right;">
|
||||
<a href="http://visual6502.org/wiki/index.php?title=JssimUserHelp" target="_blank">User Guide</a>
|
||||
<a href="https://web.archive.org/web/20210608195625/http://visual6502.org/wiki/index.php?title=JssimUserHelp" target="_blank">User Guide</a>
|
||||
|
||||
</div>
|
||||
</div> <!-- buttons -->
|
||||
|
|
253
expertWires.js
253
expertWires.js
|
@ -24,6 +24,8 @@ var centerx=300, centery=300;
|
|||
var zoom=1;
|
||||
var dragMouseX, dragMouseY, moved;
|
||||
var statbox;
|
||||
var findThese;
|
||||
var labelThese=[];
|
||||
|
||||
// Some constants for the graphics presentation
|
||||
// the canvas is embedded in an 800x600 clipping div
|
||||
|
@ -35,12 +37,14 @@ var statbox;
|
|||
// overlay - a red/white transparency to show logic high or low
|
||||
// hilite - to show the selected polygon
|
||||
// hitbuffer - abusing color values to return which polygon is under a point
|
||||
// we no longer use a scaling transform - we now scale the chip data at
|
||||
// we no longer use a scaling transform - we now scale the chip data at
|
||||
// the point of drawing line segments
|
||||
// if the canvas is any smaller than chip coordinates there will be
|
||||
// rounding artifacts, and at high zoom there will be anti-aliasing on edges.
|
||||
var grMaxZoom=12;
|
||||
var grChipSize=10000;
|
||||
var grChipOffsetX=400;
|
||||
var grChipOffsetY=0;
|
||||
var grCanvasSize=2000;
|
||||
var grLineWidth=1;
|
||||
|
||||
|
@ -49,7 +53,7 @@ var layernames = ['metal', 'switched diffusion', 'inputdiode', 'grounded diffusi
|
|||
var colors = ['rgba(128,128,192,0.4)','#FFFF00','#FF00FF','#4DFF4D',
|
||||
'#FF4D4D','#801AC0','rgba(128,0,255,0.75)'];
|
||||
var drawlayers = [true, true, true, true, true, true];
|
||||
|
||||
|
||||
// some modes and parameters which can be passed in from the URL query
|
||||
var moveHereFirst;
|
||||
var expertMode=true;
|
||||
|
@ -94,7 +98,7 @@ function setup_part3(){
|
|||
// which saves a lot of memory and allows us to run on small systems
|
||||
updateChipLayoutVisibility(true);
|
||||
}
|
||||
setStatus('resetting 6502...');
|
||||
setStatus('resetting ' + chipname + '...');
|
||||
setTimeout(setup_part4, 0);
|
||||
}
|
||||
|
||||
|
@ -173,6 +177,14 @@ function setupParams(){
|
|||
} else if(name=="zoom" && parseInt(value)!=NaN){
|
||||
zoom=parseInt(value);
|
||||
} 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
|
||||
if(name=="a" && parseInt(value,16)!=NaN){
|
||||
userAddress=parseInt(value,16);
|
||||
|
@ -185,17 +197,43 @@ function setupParams(){
|
|||
} else
|
||||
// setup input pin events, breakpoints, watchpoints
|
||||
if(name=="reset0" && parseInt(value)!=NaN){
|
||||
clockTriggers[value]="setLow('res');";
|
||||
clockTriggers[value]=[clockTriggers[value],"setLow(nodenamereset);"].join("");
|
||||
} else if(name=="reset1" && parseInt(value)!=NaN){
|
||||
clockTriggers[value]="setHigh('res');";
|
||||
clockTriggers[value]=[clockTriggers[value],"setHigh(nodenamereset);"].join("");
|
||||
} else if(name=="irq0" && parseInt(value)!=NaN){
|
||||
clockTriggers[value]="setLow('irq');";
|
||||
clockTriggers[value]=[clockTriggers[value],"setLow('irq');"].join("");
|
||||
} else if(name=="irq1" && parseInt(value)!=NaN){
|
||||
clockTriggers[value]="setHigh('irq');";
|
||||
clockTriggers[value]=[clockTriggers[value],"setHigh('irq');"].join("");
|
||||
} else if(name=="nmi0" && parseInt(value)!=NaN){
|
||||
clockTriggers[value]="setLow('nmi');";
|
||||
clockTriggers[value]=[clockTriggers[value],"setLow('nmi');"].join("");
|
||||
} else if(name=="nmi1" && parseInt(value)!=NaN){
|
||||
clockTriggers[value]="setHigh('nmi');";
|
||||
clockTriggers[value]=[clockTriggers[value],"setHigh('nmi');"].join("");
|
||||
} else if(name=="rdy0" && parseInt(value)!=NaN){
|
||||
clockTriggers[value]=[clockTriggers[value],"setLow('rdy');"].join("");
|
||||
} else if(name=="rdy1" && parseInt(value)!=NaN){
|
||||
clockTriggers[value]=[clockTriggers[value],"setHigh('rdy');"].join("");
|
||||
} else if(name=="so0" && parseInt(value)!=NaN){
|
||||
clockTriggers[value]=[clockTriggers[value],"setLow('so');"].join("");
|
||||
} else if(name=="so1" && parseInt(value)!=NaN){
|
||||
clockTriggers[value]=[clockTriggers[value],"setHigh('so');"].join("");
|
||||
// Some Z80 inputs - we can refactor if this becomes unwieldy
|
||||
} else if(name=="int0" && parseInt(value)!=NaN){
|
||||
clockTriggers[value]=[clockTriggers[value],"setLow('int');"].join("");
|
||||
} else if(name=="int1" && parseInt(value)!=NaN){
|
||||
clockTriggers[value]=[clockTriggers[value],"setHigh('int');"].join("");
|
||||
} else if(name=="wait0" && parseInt(value)!=NaN){
|
||||
clockTriggers[value]=[clockTriggers[value],"setLow('wait');"].join("");
|
||||
} else if(name=="wait1" && parseInt(value)!=NaN){
|
||||
clockTriggers[value]=[clockTriggers[value],"setHigh('wait');"].join("");
|
||||
} else if(name=="busrq0" && parseInt(value)!=NaN){
|
||||
clockTriggers[value]=[clockTriggers[value],"setLow('busrq');"].join("");
|
||||
} else if(name=="busrq1" && parseInt(value)!=NaN){
|
||||
clockTriggers[value]=[clockTriggers[value],"setHigh('busrq');"].join("");
|
||||
//
|
||||
} else if(name=="time" && parseInt(value)!=NaN){
|
||||
eventTime=value;
|
||||
} else if(name=="databus" && parseInt(value)!=NaN){
|
||||
clockTriggers[eventTime]=[clockTriggers[eventTime],"writeDataBus(0x"+value+");"].join("");
|
||||
} else
|
||||
// run a test program, and optionally check against a golden checksum
|
||||
if(name=="steps" && parseInt(value)!=NaN){
|
||||
|
@ -228,7 +266,7 @@ function updateChipLayoutAnimation(isOn){
|
|||
|
||||
// these keyboard actions are primarily for the chip display
|
||||
function handleKey(e){
|
||||
var c = e.charCode;
|
||||
var c = e.charCode || e.keyCode;
|
||||
c = String.fromCharCode(c);
|
||||
if('<>?npZzx'.indexOf(c)==-1) return;
|
||||
if((c=='Z'||c=='x'||c=='<') && zoom>1) setZoom(zoom/1.2);
|
||||
|
@ -239,13 +277,22 @@ function handleKey(e){
|
|||
else if(c=='p') stepBack();
|
||||
}
|
||||
|
||||
// handler for zoom in/out using the mouse wheel
|
||||
function handleWheelZoom(e){
|
||||
chipsurround.focus();
|
||||
e.preventDefault();
|
||||
var n = e.deltaY / 100;
|
||||
if(n>0 && zoom>1) setZoom(zoom/1.2);
|
||||
if(n<0 && zoom<grMaxZoom) setZoom(zoom*1.2);
|
||||
}
|
||||
|
||||
// handler for mousedown events over chip display
|
||||
// must handle click-to-select (and focus), and drag to pan
|
||||
function mouseDown(e){
|
||||
chipsurround.focus();
|
||||
e.preventDefault();
|
||||
moved=false;
|
||||
dragMouseX = e.clientX;
|
||||
moved=false;
|
||||
dragMouseX = e.clientX;
|
||||
dragMouseY = e.clientY;
|
||||
chipsurround.onmousemove = function(e){mouseMove(e)};
|
||||
chipsurround.onmouseup = function(e){mouseUp(e)};
|
||||
|
@ -268,7 +315,7 @@ function mouseMove(e){
|
|||
}
|
||||
|
||||
function mouseUp(e){
|
||||
if(!moved) handleClick(e);
|
||||
if(!moved) handleClick(e);
|
||||
chipsurround.onmousemove = undefined;
|
||||
chipsurround.onmouseup = undefined;
|
||||
}
|
||||
|
@ -293,35 +340,141 @@ function recenter(){
|
|||
top: top+'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;
|
||||
|
||||
// flash some set of nodes according to user input
|
||||
// also zoom to fit those nodes (not presently optional)
|
||||
function hiliteNodeList(){
|
||||
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
|
||||
hiliteNode(-1);
|
||||
return;
|
||||
}
|
||||
highlightThese = [];
|
||||
var seglist=[];
|
||||
var report="";
|
||||
for(var i=0;i<tmplist.length;i++){
|
||||
// get a node number from a signal name or a node number
|
||||
var name = tmplist[i];
|
||||
var value = parseInt(tmplist[i]);
|
||||
if((value!=NaN) && (typeof nodes[name] != "undefined")) {
|
||||
if((value!=NaN) && (typeof nodes[value] != "undefined")) {
|
||||
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") {
|
||||
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){
|
||||
// all input rejected: how to tell the user?
|
||||
setStatus('Find: nothing found!','(Enter a list of nodenumbers, names or transistor names)');
|
||||
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)
|
||||
hiliteNode(-1); // unhighlight all nodes
|
||||
setTimeout("hiliteNode(highlightThese);", 400);
|
||||
|
@ -329,22 +482,53 @@ function hiliteNodeList(){
|
|||
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 grChipOffsetX from x and subtract y from grChipSize plus grChipOffsetY
|
||||
|
||||
function handleClick(e){
|
||||
var x = localx(hilite, e.clientX)/zoom;
|
||||
var y = localy(hilite, e.clientY)/zoom;
|
||||
var w = findNodeNumber(x,y);
|
||||
if(e.shiftKey) hiliteNode(getNodeGroup(w));
|
||||
else {var a=new Array(); a.push(w); hiliteNode(a);}
|
||||
// convert to chip coordinates
|
||||
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 - grChipOffsetX) + ' y: ' + (cy - grChipOffsetY);
|
||||
var s2='node: ' + w + ' ' + nodeName(w);
|
||||
if(w==-1) {
|
||||
setStatus('x: '+cx, 'y: '+cy);
|
||||
} else {
|
||||
var s1='x: ' + cx + ' y: ' + cy;
|
||||
var s2='node: ' + w + ' ' + nodeName(w);
|
||||
setStatus(s1, s2);
|
||||
if(ctrace) console.log(s1, s2);
|
||||
setStatus(s1); // no node found, so report only coordinates
|
||||
return;
|
||||
}
|
||||
// we have a node, but maybe we clicked over a transistor
|
||||
var nodelist=[w];
|
||||
// match the coordinate against transistor gate bounding boxes
|
||||
x=cx-grChipOffsetX;
|
||||
y=grChipSize+grChipOffsetY-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 " + s2 +
|
||||
" (nodes: " +
|
||||
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){
|
||||
|
@ -366,7 +550,7 @@ var consolebox;
|
|||
|
||||
function setupConsole(){
|
||||
consolebox=document.getElementById('consolebox');
|
||||
consolebox.onkeypress=function(e){consolegetc=e.charCode;};
|
||||
consolebox.onkeypress=function(e){consolegetc=e.charCode || e.keyCode;};
|
||||
}
|
||||
|
||||
var chipsurround;
|
||||
|
@ -409,12 +593,25 @@ function setupChipLayoutGraphics(){
|
|||
refresh();
|
||||
document.getElementById('waiting').style.display = 'none';
|
||||
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)
|
||||
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
|
||||
chipsurround.focus();
|
||||
chipsurround.onwheel = function(e){handleWheelZoom(e);};
|
||||
chipsurround.onmousedown = function(e){mouseDown(e);};
|
||||
chipsurround.onkeypress = function(e){handleKey(e);};
|
||||
chipsurround.onmouseout = function(e){mouseLeave(e);};
|
||||
}
|
||||
|
||||
// utility function to save graphics pan and zoom
|
||||
|
|
16
index.html
16
index.html
|
@ -66,7 +66,7 @@ Keyboard controls: 'z' to zoom in, 'x' to zoom out, 'n' to step the simulation.
|
|||
<br />
|
||||
Mouse controls: Left-click and drag to scroll around (when you're zoomed in.)
|
||||
<br />
|
||||
More information in the <a href="http://visual6502.org/wiki/index.php?title=JssimUserHelp">User Guide<a>.
|
||||
More information in the <a href="https://web.archive.org/web/20210608195625/http://visual6502.org/wiki/index.php?title=JssimUserHelp">User Guide</a>.
|
||||
<br />
|
||||
<br />
|
||||
</span>
|
||||
|
@ -79,13 +79,13 @@ More information in the <a href="http://visual6502.org/wiki/index.php?title=Jssi
|
|||
</div>
|
||||
<div class = "buttons">
|
||||
<div style="position:relative; float:left;">
|
||||
<a href ="javascript:stopChip()"id="stop"><img class="navstop" src="images/stop.png"></a>
|
||||
<a href ="javascript:runChip()" id="start"><img class="navplay" src="images/play.png"></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="images/play.png" title="start"></a>
|
||||
</div>
|
||||
<div style="float:left;">
|
||||
<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:stepForward()"><img class="navbutton" src="images/next.png"></a>
|
||||
<a href ="javascript:resetChip()"><img class="navbutton" src="images/up.png" title="reset"></a>
|
||||
<a href ="javascript:stepBack()"><img class="navbutton" src="images/prev.png" title="back"></a>
|
||||
<a href ="javascript:stepForward()"><img class="navbutton" src="images/next.png" title="step"></a>
|
||||
</div>
|
||||
<div style="float:right; margin-left:20px;">... or try <a href="expert.html">Advanced</a></div>
|
||||
</div>
|
||||
|
@ -97,8 +97,8 @@ More information in the <a href="http://visual6502.org/wiki/index.php?title=Jssi
|
|||
<br />
|
||||
<br />
|
||||
Source code is available on <a href="http://github.com/trebonian/visual6502">github visual6502</a>.
|
||||
Use the online <a href="http://www.6502asm.com/">emulator and assembler</a> from 6502asm.com
|
||||
and <a href="http://www.e-tradition.net/bytes/6502/disassembler.html">disassembler</a> from e-tradition.net
|
||||
Use the online <a href="https://skilldrick.github.io/easy6502/#first-program">emulator and assembler</a> from the easy6502 tutorial
|
||||
and <a href="http://www.masswerk.at/6502/disassembler.html">disassembler</a> from mass:werk
|
||||
<br />
|
||||
For in-depth 6502 investigation and some more advanced features, try our <a href="expert.html">Advanced</a> page.
|
||||
<br />
|
||||
|
|
|
@ -89,6 +89,6 @@ table.memtable {
|
|||
}
|
||||
|
||||
#title {
|
||||
font-size:30px;
|
||||
font-size:30px;
|
||||
font-weight:bold;
|
||||
}
|
|
@ -45,6 +45,8 @@ var userResetHigh;
|
|||
// rounding artifacts, and at high zoom there will be anti-aliasing on edges.
|
||||
var grMaxZoom=12;
|
||||
var grChipSize=10000;
|
||||
var grChipOffsetX=400;
|
||||
var grChipOffsetY=0;
|
||||
var grCanvasSize=2000;
|
||||
var grLineWidth=1;
|
||||
|
||||
|
@ -102,7 +104,7 @@ function setup_part3(){
|
|||
/////////////////////////
|
||||
|
||||
function handleKey(e){
|
||||
var c = e.charCode;
|
||||
var c = e.charCode || e.keyCode;
|
||||
c = String.fromCharCode(c);
|
||||
if('zx<>?np'.indexOf(c)==-1) return;
|
||||
if((c=='x' || c=='<') && zoom>1) setZoom(zoom/1.2);
|
||||
|
@ -169,7 +171,10 @@ function handleClick(e){
|
|||
var x = localx(hilite, e.clientX)/zoom;
|
||||
var y = localy(hilite, e.clientY)/zoom;
|
||||
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);}
|
||||
var cx = Math.round(x*grChipSize/600);
|
||||
var cy = Math.round(y*grChipSize/600);
|
||||
|
|
103
macros.js
103
macros.js
|
@ -26,6 +26,8 @@ var trace = Array();
|
|||
var logstream = Array();
|
||||
var running = false;
|
||||
var logThese=[];
|
||||
var chipname='6502';
|
||||
var nodenamereset='res';
|
||||
var presetLogLists=[
|
||||
['cycle'],
|
||||
['ab','db','rw','Fetch','pc','a','x','y','s','p'],
|
||||
|
@ -35,7 +37,7 @@ var presetLogLists=[
|
|||
['alucin','alua','alub','alucout','aluvout','dasb'],
|
||||
['plaOutputs','DPControl'],
|
||||
['idb','dor'],
|
||||
['irq','nmi','res'],
|
||||
['irq','nmi',nodenamereset],
|
||||
];
|
||||
|
||||
function loadProgram(){
|
||||
|
@ -147,13 +149,13 @@ function initChip(){
|
|||
nodes[npwr].state = true;
|
||||
nodes[npwr].float = false;
|
||||
for(var tn in transistors) transistors[tn].on = false;
|
||||
setLow('res');
|
||||
setLow(nodenamereset);
|
||||
setLow('clk0');
|
||||
setHigh('rdy'); setLow('so');
|
||||
setHigh('irq'); setHigh('nmi');
|
||||
recalcNodeList(allNodes());
|
||||
for(var i=0;i<8;i++){setHigh('clk0'), setLow('clk0');}
|
||||
setHigh('res');
|
||||
setHigh(nodenamereset);
|
||||
for(var i=0;i<18;i++){halfStep();} // avoid updating graphics and trace buffer before user code
|
||||
refresh();
|
||||
cycle = 0;
|
||||
|
@ -224,9 +226,10 @@ fetchTriggers={};
|
|||
// simulate a single clock phase with no update to graphics or trace
|
||||
function halfStep(){
|
||||
var clk = isNodeHigh(nodenames['clk0']);
|
||||
eval(clockTriggers[cycle]);
|
||||
if (clk) {setLow('clk0'); handleBusRead(); }
|
||||
else {setHigh('clk0'); handleBusWrite();}
|
||||
eval(clockTriggers[cycle+1]); // pre-apply next tick's inputs now, so the updates are displayed
|
||||
|
||||
}
|
||||
|
||||
function handleBusRead(){
|
||||
|
@ -301,6 +304,71 @@ function listActiveTCStates() {
|
|||
return s.join("+");
|
||||
}
|
||||
|
||||
// Show all time code node states (active and inactive) in fixed format,
|
||||
// with non-PLA-controlling internal state indication in square
|
||||
// brackets, followed by RCL-resident timing state indication.
|
||||
// ".." for a PLA-controlling node indicates inactive state, "T"* for a
|
||||
// PLA-controlling node indicates active state.
|
||||
// Bracketed codes are one of T1/V0/T6/..
|
||||
// V0 indicates the VEC0 node, T6 is a synonym for the VEC1 node.
|
||||
// The RCL codes are one of SD1/SD2/...
|
||||
// For discussion of this reconstruction, see:
|
||||
// http://visual6502.org/wiki/index.php?title=6502_Timing_States
|
||||
function allTCStates( useHTML )
|
||||
{
|
||||
var s = "";
|
||||
var _spc;
|
||||
useHTML = (typeof useHTML === 'undefined') ? false : useHTML;
|
||||
// Use Non-Breaking Space for presentation in an HTML (browser)
|
||||
// context, else use ASCII space for logging context
|
||||
_spc = useHTML ? ' ' : ' ';
|
||||
if ( !isNodeHigh( nodenames[ 'clock1' ] ) ) s += "T0"; else s += "..";
|
||||
s += _spc;
|
||||
// T+ in visual6502 is called T1x in
|
||||
// http://www.weihenstephan.org/~michaste/pagetable/6502/6502.jpg
|
||||
// Notated as T+ for compatibility with PLA node names
|
||||
if ( !isNodeHigh( nodenames[ 'clock2' ] ) ) s += "T+"; else s += "..";
|
||||
s += _spc;
|
||||
if ( !isNodeHigh( nodenames[ 't2' ] ) ) s += "T2"; else s += "..";
|
||||
s += _spc;
|
||||
if ( !isNodeHigh( nodenames[ 't3' ] ) ) s += "T3"; else s += "..";
|
||||
s += _spc;
|
||||
if ( !isNodeHigh( nodenames[ 't4' ] ) ) s += "T4"; else s += "..";
|
||||
s += _spc;
|
||||
if ( !isNodeHigh( nodenames[ 't5' ] ) ) s += "T5"; else s += "..";
|
||||
s += _spc + "[";
|
||||
// Check three confirmed exclusive states (three nodes)
|
||||
if ( isNodeHigh( 862 ) ) {
|
||||
s += "T1";
|
||||
// ...else if VEC0 is on...
|
||||
} else if ( isNodeHigh( nodenames[ 'VEC0' ] ) ) {
|
||||
// ...then tell the outside world
|
||||
s += "V0";
|
||||
// ...else if VEC1 is on...
|
||||
} else if ( isNodeHigh( nodenames[ 'VEC1' ] ) ) {
|
||||
// ...then this is the canonical T6. It is a synonym for VEC1
|
||||
s += "T6";
|
||||
} else {
|
||||
// ...else none of the "hidden" bits in the clock state is active
|
||||
s += "..";
|
||||
}
|
||||
s += "]" + _spc;
|
||||
// Check the RCL's two confirmed exclusive states (two nodes)
|
||||
// If this node is grounding ~WR...
|
||||
if ( isNodeHigh( 440 ) ) {
|
||||
// ...then we can regard this state as Store Data 1
|
||||
s += "SD1";
|
||||
// ...else if this node is grounding ~WR...
|
||||
} else if ( isNodeHigh( 1258 ) ) {
|
||||
// ...then we can regard this state as Store Data 2
|
||||
s += "SD2";
|
||||
} else {
|
||||
// ...else none of the RCL-resident timing bits is active
|
||||
s += "...";
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
function readBit(name){
|
||||
return isNodeHigh(nodenames[name])?1:0;
|
||||
}
|
||||
|
@ -327,16 +395,23 @@ function busToString(busname){
|
|||
return ['clock1','clock2','t2','t3','t4','t5'].map(busToHex).join("");
|
||||
if(busname=='State')
|
||||
return listActiveTCStates();
|
||||
if(busname=='TState')
|
||||
return allTCStates( true );
|
||||
if(busname=='Phi')
|
||||
// Pretty-printed phase indication based on the state of cp1,
|
||||
// the internal Phase 1 node
|
||||
return 'Φ' +
|
||||
(isNodeHigh( nodenames[ 'cp1' ] ) ? '1' : '2');
|
||||
if(busname=='Execute')
|
||||
return dis6502toHTML(readBits('ir',8));
|
||||
return disassemblytoHTML(readBits('ir',8));
|
||||
if(busname=='Fetch')
|
||||
return isNodeHigh(nodenames['sync'])?dis6502toHTML(readDataBus()):"";
|
||||
return isNodeHigh(nodenames['sync'])?disassemblytoHTML(readDataBus()):"";
|
||||
if(busname=='plaOutputs')
|
||||
// PLA outputs are mostly ^op- but some have a prefix too
|
||||
// - we'll allow the x and xx prefix but ignore the #
|
||||
return listActiveSignals('^([x]?x-)?op-');
|
||||
if(busname=='DPControl')
|
||||
return listActiveSignals('^dpc[0-9]+_');
|
||||
return listActiveSignals('^dpc[-]?[0-9]+_');
|
||||
if(busname[0]=="-"){
|
||||
// invert the value of the bus for display
|
||||
var value=busToHex(busname.slice(1))
|
||||
|
@ -424,7 +499,7 @@ function stopChip(){
|
|||
|
||||
function resetChip(){
|
||||
stopChip();
|
||||
setStatus('resetting 6502...');
|
||||
setStatus('resetting ' + chipname + '...');
|
||||
setTimeout(initChip,0);
|
||||
}
|
||||
|
||||
|
@ -469,7 +544,7 @@ function chipStatus(){
|
|||
machine3 += " Chk:" + traceChecksum + ((traceChecksum==goldenChecksum)?" OK":" no match");
|
||||
}
|
||||
setStatus(machine1, machine2, machine3);
|
||||
if (loglevel>0) {
|
||||
if (logThese.length>1) {
|
||||
updateLogbox(logThese);
|
||||
}
|
||||
selectCell(ab);
|
||||
|
@ -507,6 +582,8 @@ function goForN(n){
|
|||
return;
|
||||
}
|
||||
running = false;
|
||||
var start = document.getElementById('start');
|
||||
var stop = document.getElementById('stop');
|
||||
start.style.visibility = 'visible';
|
||||
stop.style.visibility = 'hidden';
|
||||
}
|
||||
|
@ -623,8 +700,8 @@ function adler32(x){
|
|||
}
|
||||
|
||||
// sanitised opcode for HTML output
|
||||
function dis6502toHTML(byte){
|
||||
var opcode=dis6502[byte];
|
||||
function disassemblytoHTML(byte){
|
||||
var opcode=disassembly[byte];
|
||||
if(typeof opcode == "undefined")
|
||||
return "unknown"
|
||||
return opcode.replace(/ /,' ');
|
||||
|
@ -632,7 +709,7 @@ function dis6502toHTML(byte){
|
|||
|
||||
// opcode lookup for 6502 - not quite a disassembly
|
||||
// javascript derived from Debugger.java by Achim Breidenbach
|
||||
var dis6502={
|
||||
var disassembly={
|
||||
0x00:"BRK",
|
||||
0x01:"ORA (zp,X)",
|
||||
0x05:"ORA zp",
|
||||
|
@ -694,7 +771,7 @@ var dis6502={
|
|||
0x68:"PLA",
|
||||
0x69:"ADC #",
|
||||
0x6A:"ROR ",
|
||||
0x6C:"JMP zp",
|
||||
0x6C:"JMP (Abs)",
|
||||
0x6D:"ADC Abs",
|
||||
0x6E:"ROR Abs",
|
||||
0x70:"BVS ",
|
||||
|
|
489
nodenames.js
489
nodenames.js
|
@ -82,7 +82,7 @@ x4: 85,
|
|||
x5: 589,
|
||||
x6: 448,
|
||||
x7: 777,
|
||||
pcl0: 1139, // machine state: program counter low (first storage node)
|
||||
pcl0: 1139, // machine state: program counter low (first storage node output)
|
||||
pcl1: 1022,
|
||||
pcl2: 655,
|
||||
pcl3: 1359,
|
||||
|
@ -90,14 +90,30 @@ pcl4: 900,
|
|||
pcl5: 622,
|
||||
pcl6: 377,
|
||||
pcl7: 1611,
|
||||
pclp0: 1227, // machine state: program counter low (pre-incremented?, second storage node)
|
||||
pclp1: 1102,
|
||||
pclp2: 1079,
|
||||
pclp3: 868,
|
||||
pclp4: 39,
|
||||
pclp5: 1326,
|
||||
pclp6: 731,
|
||||
pclp7: 536,
|
||||
pclp0: 488, // machine state: program counter low (pre-incremented?, second storage node)
|
||||
pclp1: 976,
|
||||
pclp2: 481,
|
||||
pclp3: 723,
|
||||
pclp4: 208,
|
||||
pclp5: 72,
|
||||
pclp6: 1458,
|
||||
pclp7: 1647,
|
||||
"#pclp0": 1227, // machine state: program counter low (pre-incremented?, inverse second storage node)
|
||||
"~pclp0": 1227, // automatic alias replacing hash with tilde
|
||||
"#pclp1": 1102,
|
||||
"~pclp1": 1102, // automatic alias replacing hash with tilde
|
||||
"#pclp2": 1079,
|
||||
"~pclp2": 1079, // automatic alias replacing hash with tilde
|
||||
"#pclp3": 868,
|
||||
"~pclp3": 868, // automatic alias replacing hash with tilde
|
||||
"#pclp4": 39,
|
||||
"~pclp4": 39, // automatic alias replacing hash with tilde
|
||||
"#pclp5": 1326,
|
||||
"~pclp5": 1326, // automatic alias replacing hash with tilde
|
||||
"#pclp6": 731,
|
||||
"~pclp6": 731, // automatic alias replacing hash with tilde
|
||||
"#pclp7": 536,
|
||||
"~pclp7": 536, // automatic alias replacing hash with tilde
|
||||
pch0: 1670, // machine state: program counter high (first storage node)
|
||||
pch1: 292,
|
||||
pch2: 502,
|
||||
|
@ -106,22 +122,50 @@ pch4: 948,
|
|||
pch5: 49,
|
||||
pch6: 1551,
|
||||
pch7: 205,
|
||||
pchp0: 780, // machine state: program counter high (pre-incremented?, second storage node)
|
||||
pchp1: 113,
|
||||
pchp2: 114,
|
||||
pchp3: 124,
|
||||
pchp4: 820,
|
||||
pchp5: 33,
|
||||
pchp6: 751,
|
||||
pchp7: 535,
|
||||
p0: 687, // machine state: status register
|
||||
p1: 1444,
|
||||
p2: 1421,
|
||||
p3: 439,
|
||||
p4: 1119, // there is no bit4 in the status register!
|
||||
p5: -1, // there is no bit5 in the status register!
|
||||
p6: 77,
|
||||
p7: 1370,
|
||||
pchp0: 1722, // machine state: program counter high (pre-incremented?, second storage node output)
|
||||
pchp1: 209,
|
||||
pchp2: 1496,
|
||||
pchp3: 141,
|
||||
pchp4: 27,
|
||||
pchp5: 1301,
|
||||
pchp6: 652,
|
||||
pchp7: 1206,
|
||||
"#pchp0": 780, // machine state: program counter high (pre-incremented?, inverse second storage node)
|
||||
"~pchp0": 780, // automatic alias replacing hash with tilde
|
||||
"#pchp1": 113,
|
||||
"~pchp1": 113, // automatic alias replacing hash with tilde
|
||||
"#pchp2": 114,
|
||||
"~pchp2": 114, // automatic alias replacing hash with tilde
|
||||
"#pchp3": 124,
|
||||
"~pchp3": 124, // automatic alias replacing hash with tilde
|
||||
"#pchp4": 820,
|
||||
"~pchp4": 820, // automatic alias replacing hash with tilde
|
||||
"#pchp5": 33,
|
||||
"~pchp5": 33, // automatic alias replacing hash with tilde
|
||||
"#pchp6": 751,
|
||||
"~pchp6": 751, // automatic alias replacing hash with tilde
|
||||
"#pchp7": 535,
|
||||
"~pchp7": 535, // automatic alias replacing hash with tilde
|
||||
// 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: 1625, // V bit of status register (storage node)
|
||||
p7: 69, // 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
|
||||
s1: 183,
|
||||
s2: 81,
|
||||
|
@ -146,13 +190,31 @@ notir4: 26,
|
|||
notir5: 1394,
|
||||
notir6: 895,
|
||||
notir7: 1320,
|
||||
irline3: 996, // internal signal: PLA input - ir0 AND ir1
|
||||
clock1: 1536, // internal state: timing control
|
||||
clock2: 156, // internal state: timing control
|
||||
irline3: 996, // internal signal: PLA input - ir0 OR ir1
|
||||
clock1: 1536, // internal state: timing control aka #T0
|
||||
clock1: 1536, // automatic alias replacing hash with tilde
|
||||
clock2: 156, // internal state: timing control aka #T+
|
||||
clock2: 156, // automatic alias replacing hash with tilde
|
||||
t2: 971, // internal state: timing control
|
||||
t3: 1567,
|
||||
t4: 690,
|
||||
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
|
||||
nots1: 1064,
|
||||
nots2: 752,
|
||||
|
@ -185,7 +247,8 @@ sb4: 1405,
|
|||
sb5: 166,
|
||||
sb6: 1336,
|
||||
sb7: 1001,
|
||||
notalu0: 394, // datapath state: alu output storage node (inverse)
|
||||
notalu0: 394, // datapath state: alu output storage node (inverse) aka #ADD0
|
||||
notalu0: 394, // automatic alias replacing hash with tilde
|
||||
notalu1: 697,
|
||||
notalu2: 276,
|
||||
notalu3: 495,
|
||||
|
@ -193,7 +256,7 @@ notalu4: 1490,
|
|||
notalu5: 893,
|
||||
notalu6: 68,
|
||||
notalu7: 1123,
|
||||
alu0: 401, // datapath signal: ALU output
|
||||
alu0: 401, // datapath signal: ALU output aka ADD0out
|
||||
alu1: 872,
|
||||
alu2: 1637,
|
||||
alu3: 1414,
|
||||
|
@ -210,7 +273,7 @@ dasb4: 1405, // same node as sb4
|
|||
dasb5: 263,
|
||||
dasb6: 679,
|
||||
dasb7: 1494,
|
||||
adl0: 413, // internal state: address latch low
|
||||
adl0: 413, // internal bus: address low
|
||||
adl1: 1282,
|
||||
adl2: 1242,
|
||||
adl3: 684,
|
||||
|
@ -218,7 +281,7 @@ adl4: 1437,
|
|||
adl5: 1630,
|
||||
adl6: 121,
|
||||
adl7: 1299,
|
||||
adh0: 407, // internal state: address latch high
|
||||
adh0: 407, // internal bus: address high
|
||||
adh1: 52,
|
||||
adh2: 1651,
|
||||
adh3: 315,
|
||||
|
@ -226,7 +289,7 @@ adh4: 1160,
|
|||
adh5: 483,
|
||||
adh6: 13,
|
||||
adh7: 1539,
|
||||
idb0: 1108, // internal state: data buffer
|
||||
idb0: 1108, // internal bus: data bus
|
||||
idb1: 991,
|
||||
idb2: 1473,
|
||||
idb3: 1302,
|
||||
|
@ -266,16 +329,85 @@ pd4: 369,
|
|||
pd5: 829,
|
||||
pd6: 1669,
|
||||
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": 851, // automatic alias replacing hash with tilde
|
||||
"#TWOCYCLE.phi1": 792,
|
||||
"~TWOCYCLE.phi1": 792, // automatic alias replacing hash with tilde
|
||||
"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)
|
||||
"~ABL0": 153, // automatic alias replacing hash with tilde
|
||||
"#ABL1": 107,
|
||||
"~ABL1": 107, // automatic alias replacing hash with tilde
|
||||
"#ABL2": 707,
|
||||
"~ABL2": 707, // automatic alias replacing hash with tilde
|
||||
"#ABL3": 825,
|
||||
"~ABL3": 825, // automatic alias replacing hash with tilde
|
||||
"#ABL4": 364,
|
||||
"~ABL4": 364, // automatic alias replacing hash with tilde
|
||||
"#ABL5": 1513,
|
||||
"~ABL5": 1513, // automatic alias replacing hash with tilde
|
||||
"#ABL6": 1307,
|
||||
"~ABL6": 1307, // automatic alias replacing hash with tilde
|
||||
"#ABL7": 28,
|
||||
"~ABL7": 28, // automatic alias replacing hash with tilde
|
||||
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)
|
||||
"~ABH0": 1062, // automatic alias replacing hash with tilde
|
||||
"#ABH1": 907,
|
||||
"~ABH1": 907, // automatic alias replacing hash with tilde
|
||||
"#ABH2": 768,
|
||||
"~ABH2": 768, // automatic alias replacing hash with tilde
|
||||
"#ABH3": 92,
|
||||
"~ABH3": 92, // automatic alias replacing hash with tilde
|
||||
"#ABH4": 668,
|
||||
"~ABH4": 668, // automatic alias replacing hash with tilde
|
||||
"#ABH5": 1128,
|
||||
"~ABH5": 1128, // automatic alias replacing hash with tilde
|
||||
"#ABH6": 289,
|
||||
"~ABH6": 289, // automatic alias replacing hash with tilde
|
||||
"#ABH7": 429,
|
||||
"~ABH7": 429, // automatic alias replacing hash with tilde
|
||||
|
||||
"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)
|
||||
"~notRdy0.delay": 559, // automatic alias replacing hash with tilde
|
||||
Reset0: 67, // internal signal: retimed reset from pin
|
||||
C1x5Reset: 926, // retimed and pipelined reset in progress
|
||||
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)
|
||||
"~DBE": 1035, // automatic alias replacing hash with tilde
|
||||
cp1: 710, // internal signal: clock phase 1
|
||||
cclk: 943, // unbonded pad: internal non-overlappying phi2
|
||||
cclk: 943, // unbonded pad: internal non-overlapping phi2
|
||||
fetch: 879, // internal signal
|
||||
clearIR: 1077, // internal signal
|
||||
D1x1: 827, // internal signal: interrupt handler related
|
||||
H1x1: 1042, // internal signal: drive status byte onto databus
|
||||
|
||||
// internal signal: pla outputs block 1 (west/left edge of die)
|
||||
|
@ -426,20 +558,75 @@ H1x1: 1042, // internal signal: drive status byte onto databus
|
|||
"x-op-push/pull":1050, // pla121 // feeds into pla130 (no normal pla output)
|
||||
"op-T0-cld/sed":1419, // pla122
|
||||
"#op-branch-bit6":840, // pla123 // IR bit6 used only to detect branch type
|
||||
"~op-branch-bit6":840, // automatic alias replacing hash with tilde
|
||||
"op-T3-mem-abs":607, // pla124
|
||||
"op-T2-mem-zp":219, // pla125
|
||||
"op-T5-mem-ind-idx":1385, // pla126
|
||||
"op-T4-mem-abs-idx":281, // pla127
|
||||
"#op-branch-bit7":1174, // pla128 // IR bit7 used only to detect branch type
|
||||
"~op-branch-bit7":1174, // automatic alias replacing hash with tilde
|
||||
"op-clv":1164, // pla129
|
||||
"op-implied":1006, // pla130 // has extra pulldowns: pla121 and ir0
|
||||
|
||||
// internal signals: derived from pla outputs
|
||||
"#op-branch-done": 1048,
|
||||
"~op-branch-done": 1048, // automatic alias replacing hash with tilde
|
||||
"#op-T3-branch": 1708,
|
||||
"~op-T3-branch": 1708, // automatic alias replacing hash with tilde
|
||||
"op-ANDS": 1228,
|
||||
"op-EORS": 1689,
|
||||
"op-ORS": 522,
|
||||
"op-SUMS": 1196,
|
||||
"op-SRS": 934,
|
||||
"#op-store": 925,
|
||||
"~op-store": 925, // automatic alias replacing hash with tilde
|
||||
"#WR": 1352,
|
||||
"~WR": 1352, // automatic alias replacing hash with tilde
|
||||
"op-rmw": 434,
|
||||
"short-circuit-idx-add": 1185,
|
||||
"short-circuit-branch-add": 430,
|
||||
"#op-set-C": 252,
|
||||
"~op-set-C": 252, // automatic alias replacing hash with tilde
|
||||
|
||||
// internal signals: control signals
|
||||
nnT2BR: 967, // doubly inverted
|
||||
BRtaken: 1544,
|
||||
"#BRtaken": 1544, // aka #TAKEN
|
||||
"~BRtaken": 1544, // automatic alias replacing hash with tilde
|
||||
|
||||
// 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,
|
||||
"~IRQP": 888, // automatic alias replacing hash with tilde
|
||||
NMIP: 1032,
|
||||
"#NMIP": 297,
|
||||
"~NMIP": 297, // automatic alias replacing hash with tilde
|
||||
"#NMIG": 264,
|
||||
"~NMIG": 264, // automatic alias replacing hash with tilde
|
||||
NMIL: 1374,
|
||||
RESP: 67,
|
||||
RESG: 926,
|
||||
VEC0: 1465,
|
||||
VEC1: 1481,
|
||||
"#VEC": 1134,
|
||||
"~VEC": 1134, // automatic alias replacing hash with tilde
|
||||
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)
|
||||
pipeBRtaken: 832,
|
||||
"pipe#VEC": 1431, // latched #VEC
|
||||
"pipe~VEC": 1431, // automatic alias replacing hash with tilde
|
||||
"pipeT-SYNC": 537,
|
||||
pipeT2out: 40,
|
||||
pipeT3out: 706,
|
||||
pipeT4out: 1373,
|
||||
pipeT5out: 940,
|
||||
pipeIPCrelated: 832,
|
||||
pipeUNK01: 1530,
|
||||
pipeUNK02: 974,
|
||||
pipeUNK03: 1436,
|
||||
|
@ -477,20 +664,25 @@ pipeUNK34: 56,
|
|||
pipeUNK35: 1713,
|
||||
pipeUNK36: 729,
|
||||
pipeUNK37: 197,
|
||||
pipeUNK38: 1131,
|
||||
"pipe#WR.phi2": 1131,
|
||||
"pipe~WR.phi2": 1131, // automatic alias replacing hash with tilde
|
||||
pipeUNK39: 151,
|
||||
pipeUNK40: 456,
|
||||
pipeUNK41: 1438,
|
||||
pipeUNK42: 1104,
|
||||
pipeUNK43: 554,
|
||||
|
||||
|
||||
"pipe#T0": 554, // aka #T0.phi2
|
||||
"pipe~T0": 554, // automatic alias replacing hash with tilde
|
||||
|
||||
// internal state: vector address pulldown control
|
||||
pipeVectorA0: 357,
|
||||
pipeVectorA1: 170,
|
||||
pipeVectorA2: 45,
|
||||
|
||||
// internal signals: vector address pulldown control
|
||||
"0/ADL0": 217,
|
||||
"0/ADL1": 686,
|
||||
"0/ADL2": 1193,
|
||||
|
||||
// internal state: datapath control drivers
|
||||
pipedpc28: 683,
|
||||
|
||||
|
@ -512,17 +704,170 @@ alub5: 1678,
|
|||
alub6: 235,
|
||||
alub7: 1535,
|
||||
|
||||
aluanorb0: 143,
|
||||
aluanandb0: 1628,
|
||||
aluaorb0: 693,
|
||||
notaluoutmux0: 957, // alu result latch input
|
||||
// alu carry chain and decimal mode
|
||||
C01: 1285,
|
||||
C12: 505,
|
||||
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,
|
||||
"~C01": 1506, // automatic alias replacing hash with tilde
|
||||
"#C12": 1122,
|
||||
"~C12": 1122, // automatic alias replacing hash with tilde
|
||||
"#C23": 1003,
|
||||
"~C23": 1003, // automatic alias replacing hash with tilde
|
||||
"#C34": 1425,
|
||||
"~C34": 1425, // automatic alias replacing hash with tilde
|
||||
"#C45": 1571,
|
||||
"~C45": 1571, // automatic alias replacing hash with tilde
|
||||
"#C56": 427,
|
||||
"~C56": 427, // automatic alias replacing hash with tilde
|
||||
"#C67": 592,
|
||||
"~C67": 592, // automatic alias replacing hash with tilde
|
||||
"#C78": 1327,
|
||||
"~C78": 1327, // automatic alias replacing hash with tilde
|
||||
"DA-C01": 623,
|
||||
"DA-AB2": 216,
|
||||
"DA-AxB2": 516,
|
||||
"DA-C45": 1144,
|
||||
"#DA-ADD1": 901,
|
||||
"~DA-ADD1": 901, // automatic alias replacing hash with tilde
|
||||
"#DA-ADD2": 699,
|
||||
"~DA-ADD2": 699, // automatic alias replacing hash with tilde
|
||||
|
||||
aluanorb1: 155,
|
||||
aluanandb1: 841,
|
||||
aluaorb1: 1021,
|
||||
notaluoutmux1: 250, // alu result latch input
|
||||
// misc alu internals
|
||||
"#(AxBxC)0": 371,
|
||||
"~(AxBxC)0": 371, // automatic alias replacing hash with tilde
|
||||
"#(AxBxC)1": 965,
|
||||
"~(AxBxC)1": 965, // automatic alias replacing hash with tilde
|
||||
"#(AxBxC)2": 22,
|
||||
"~(AxBxC)2": 22, // automatic alias replacing hash with tilde
|
||||
"#(AxBxC)3": 274,
|
||||
"~(AxBxC)3": 274, // automatic alias replacing hash with tilde
|
||||
"#(AxBxC)4": 651,
|
||||
"~(AxBxC)4": 651, // automatic alias replacing hash with tilde
|
||||
"#(AxBxC)5": 486,
|
||||
"~(AxBxC)5": 486, // automatic alias replacing hash with tilde
|
||||
"#(AxBxC)6": 1197,
|
||||
"~(AxBxC)6": 1197, // automatic alias replacing hash with tilde
|
||||
"#(AxBxC)7": 532,
|
||||
"~(AxBxC)7": 532, // automatic alias replacing hash with tilde
|
||||
AxB1: 425,
|
||||
AxB3: 640,
|
||||
AxB5: 1220,
|
||||
AxB7: 1241,
|
||||
"#(AxB)0": 1525,
|
||||
"~(AxB)0": 1525, // automatic alias replacing hash with tilde
|
||||
"#(AxB)2": 701,
|
||||
"~(AxB)2": 701, // automatic alias replacing hash with tilde
|
||||
"#(AxB)4": 308,
|
||||
"~(AxB)4": 308, // automatic alias replacing hash with tilde
|
||||
"#(AxB)6": 1459,
|
||||
"~(AxB)6": 1459, // automatic alias replacing hash with tilde
|
||||
"(AxB)0.#C0in": 555,
|
||||
"(AxB)0.~C0in": 555, // automatic alias replacing hash with tilde
|
||||
"(AxB)2.#C12": 193,
|
||||
"(AxB)2.~C12": 193, // automatic alias replacing hash with tilde
|
||||
"(AxB)4.#C34": 65,
|
||||
"(AxB)4.~C34": 65, // automatic alias replacing hash with tilde
|
||||
"(AxB)6.#C56": 174,
|
||||
"(AxB)6.~C56": 174, // automatic alias replacing hash with tilde
|
||||
"#(AxB1).C01": 295,
|
||||
"~(AxB1).C01": 295, // automatic alias replacing hash with tilde
|
||||
"#(AxB3).C23": 860,
|
||||
"~(AxB3).C23": 860, // automatic alias replacing hash with tilde
|
||||
"#(AxB5).C45": 817,
|
||||
"~(AxB5).C45": 817, // automatic alias replacing hash with tilde
|
||||
"#(AxB7).C67": 1217,
|
||||
"~(AxB7).C67": 1217, // automatic alias replacing hash with tilde
|
||||
"#A.B0": 1628,
|
||||
"~A.B0": 1628, // automatic alias replacing hash with tilde
|
||||
"#A.B1": 841,
|
||||
"~A.B1": 841, // automatic alias replacing hash with tilde
|
||||
"#A.B2": 681,
|
||||
"~A.B2": 681, // automatic alias replacing hash with tilde
|
||||
"#A.B3": 350,
|
||||
"~A.B3": 350, // automatic alias replacing hash with tilde
|
||||
"#A.B4": 1063,
|
||||
"~A.B4": 1063, // automatic alias replacing hash with tilde
|
||||
"#A.B5": 477,
|
||||
"~A.B5": 477, // automatic alias replacing hash with tilde
|
||||
"#A.B6": 336,
|
||||
"~A.B6": 336, // automatic alias replacing hash with tilde
|
||||
"#A.B7": 1318,
|
||||
"~A.B7": 1318, // automatic alias replacing hash with tilde
|
||||
"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)0": 143, // automatic alias replacing hash with tilde
|
||||
"#(A+B)1": 155,
|
||||
"~(A+B)1": 155, // automatic alias replacing hash with tilde
|
||||
"#(A+B)2": 1691,
|
||||
"~(A+B)2": 1691, // automatic alias replacing hash with tilde
|
||||
"#(A+B)3": 649,
|
||||
"~(A+B)3": 649, // automatic alias replacing hash with tilde
|
||||
"#(A+B)4": 404,
|
||||
"~(A+B)4": 404, // automatic alias replacing hash with tilde
|
||||
"#(A+B)5": 1632,
|
||||
"~(A+B)5": 1632, // automatic alias replacing hash with tilde
|
||||
"#(A+B)6": 1084,
|
||||
"~(A+B)6": 1084, // automatic alias replacing hash with tilde
|
||||
"#(A+B)7": 1398,
|
||||
"~(A+B)7": 1398, // automatic alias replacing hash with tilde
|
||||
"#(AxB)0": 1525,
|
||||
"~(AxB)0": 1525, // automatic alias replacing hash with tilde
|
||||
"#(AxB)2": 701,
|
||||
"~(AxB)2": 701, // automatic alias replacing hash with tilde
|
||||
"#(AxB)4": 308,
|
||||
"~(AxB)4": 308, // automatic alias replacing hash with tilde
|
||||
"#(AxB)6": 1459,
|
||||
"~(AxB)6": 1459, // automatic alias replacing hash with tilde
|
||||
"#(AxB)1": 953,
|
||||
"~(AxB)1": 953, // automatic alias replacing hash with tilde
|
||||
"#(AxB)3": 884,
|
||||
"~(AxB)3": 884, // automatic alias replacing hash with tilde
|
||||
"#(AxB)5": 1469,
|
||||
"~(AxB)5": 1469, // automatic alias replacing hash with tilde
|
||||
"#(AxB)7": 177,
|
||||
"~(AxB)7": 177, // automatic alias replacing hash with tilde
|
||||
"#aluresult0": 957, // alu result latch input
|
||||
"~aluresult0": 957, // automatic alias replacing hash with tilde
|
||||
"#aluresult1": 250,
|
||||
"~aluresult1": 250, // automatic alias replacing hash with tilde
|
||||
"#aluresult2": 740,
|
||||
"~aluresult2": 740, // automatic alias replacing hash with tilde
|
||||
"#aluresult3": 1071,
|
||||
"~aluresult3": 1071, // automatic alias replacing hash with tilde
|
||||
"#aluresult4": 296,
|
||||
"~aluresult4": 296, // automatic alias replacing hash with tilde
|
||||
"#aluresult5": 277,
|
||||
"~aluresult5": 277, // automatic alias replacing hash with tilde
|
||||
"#aluresult6": 722,
|
||||
"~aluresult6": 722, // automatic alias replacing hash with tilde
|
||||
"#aluresult7": 304,
|
||||
"~aluresult7": 304, // automatic alias replacing hash with tilde
|
||||
|
||||
// internal signals: datapath control signals
|
||||
|
||||
"ADL/ABL": 639, // load ABL latches from ADL bus
|
||||
"dpc-1_ADL/ABL": 639,// alias for DPControl pseudo-bus
|
||||
|
||||
"ADH/ABH": 821, // load ABH latches from ADH bus
|
||||
"dpc-2_ADH/ABH": 821,// alias for DPControl pseudo-bus
|
||||
|
||||
dpc0_YSB: 801, // drive sb from y
|
||||
dpc1_SBY: 325, // load y from sb
|
||||
dpc2_XSB: 1263, // drive sb from x
|
||||
|
@ -544,21 +889,35 @@ dpc16_EORS: 1666, // alu op: a xor b (?)
|
|||
dpc17_SUMS: 921, // alu op: a plus b (?)
|
||||
alucin: 910, // alu carry in
|
||||
notalucin: 1165,
|
||||
dpc18_DAA: 1201, // decimal related
|
||||
"dpc18_#DAA": 1201, // decimal related (inverted)
|
||||
"dpc18_~DAA": 1201, // automatic alias replacing hash with tilde
|
||||
dpc19_ADDSB7: 214, // alu to sb bit 7 only
|
||||
|
||||
dpc20_ADDSB06: 129, // alu to sb bits 6-0 only
|
||||
dpc21_ADDADL: 1015, // alu to adl
|
||||
alurawcout: 808, // alu raw carry out (no decimal adjust)
|
||||
notalucout: 412, // alu carry out (inverted)
|
||||
alucout: 1146, // alu carry out (latched by phi2)
|
||||
"#alucout": 206,
|
||||
"~alucout": 206, // automatic alias replacing hash with tilde
|
||||
"##alucout": 465,
|
||||
"~~alucout": 465, // automatic alias replacing hash with tilde
|
||||
notaluvout: 1308, // alu overflow out
|
||||
aluvout: 938, // alu overflow out (latched by phi2)
|
||||
dpc22_DSA: 725, // decimal related/SBC only
|
||||
|
||||
"#DBZ": 1268, // internal signal: not (databus is zero)
|
||||
"~DBZ": 1268, // automatic alias replacing hash with tilde
|
||||
DBZ: 744, // internal signal: databus is zero
|
||||
DBNeg: 1200, // internal signal: databus is negative (top bit of db) aka P-#DB7in
|
||||
DBNeg: 1200, // automatic alias replacing hash with tilde
|
||||
|
||||
"dpc22_#DSA": 725, // decimal related/SBC only (inverted)
|
||||
"dpc22_~DSA": 725, // automatic alias replacing hash with tilde
|
||||
dpc23_SBAC: 534, // (optionalls decimal-adjusted) sb to acc
|
||||
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
|
||||
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
|
||||
dpc29_0ADH17: 203, // zero to adh bits 7-1 only
|
||||
|
||||
|
@ -567,14 +926,24 @@ dpc31_PCHPCH: 741, // load pch from pch incremented
|
|||
dpc32_PCHADH: 1235, // drive adh from pch incremented
|
||||
dpc33_PCHDB: 247, // drive idb from pch incremented
|
||||
dpc34_PCLC: 1704, // pch carry in and pcl FF detect?
|
||||
dpc35: 1334, // pcl 0x?F detect - half-carry
|
||||
dpc36_IPC: 379, // pcl carry in
|
||||
dpc35_PCHC: 1334, // pch 0x?F detect - half-carry
|
||||
"dpc36_#IPC": 379, // pcl carry in (inverted)
|
||||
"dpc36_~IPC": 379, // automatic alias replacing hash with tilde
|
||||
dpc37_PCLDB: 283, // drive idb from pcl incremented
|
||||
dpc38_PCLADL: 438, // drive adl from pcl incremented
|
||||
dpc39_PCLPCL: 898, // load pcl from pcl incremented
|
||||
|
||||
dpc40_ADLPCL: 414, // load pcl from adl
|
||||
dpc41: 1564, // pass-connect adl to mux node driven by idl
|
||||
dpc42: 41, // pass-connect adh to mux node driven by idl
|
||||
dpc43: 863, // pass-connect idb to mux node driven by idl
|
||||
"dpc41_DL/ADL": 1564,// pass-connect adl to mux node driven by idl
|
||||
"dpc42_DL/ADH": 41, // pass-connect adh 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
|
||||
*/
|
||||
|
|
7031
transdefs.js
7031
transdefs.js
File diff suppressed because it is too large
Load Diff
80
wires.js
80
wires.js
|
@ -29,6 +29,7 @@ var ngnd = nodenames['vss'];
|
|||
var npwr = nodenames['vcc'];
|
||||
|
||||
var chipLayoutIsVisible = true; // only modified in expert mode
|
||||
var hilited = [];
|
||||
|
||||
function setupNodes(){
|
||||
for(var i in segdefs){
|
||||
|
@ -50,9 +51,10 @@ function setupTransistors(){
|
|||
var gate = tdef[1];
|
||||
var c1 = tdef[2];
|
||||
var c2 = tdef[3];
|
||||
var bb = tdef[4];
|
||||
if(c1==ngnd) {c1=c2;c2=ngnd;}
|
||||
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[c1].c1c2s.push(trans);
|
||||
nodes[c2].c1c2s.push(trans);
|
||||
|
@ -139,6 +141,7 @@ function refresh(){
|
|||
for(i in nodes){
|
||||
if(isNodeHigh(i)) overlayNode(nodes[i].segs);
|
||||
}
|
||||
hiliteNode(hilited);
|
||||
}
|
||||
|
||||
function overlayNode(w){
|
||||
|
@ -149,26 +152,85 @@ function overlayNode(w){
|
|||
}
|
||||
}
|
||||
|
||||
// originally to highlight using a list of node numbers
|
||||
// but can now include transistor names
|
||||
function hiliteNode(n){
|
||||
var ctx = hilite.getContext('2d');
|
||||
ctx.clearRect(0,0,grCanvasSize,grCanvasSize);
|
||||
ctx.fillStyle = 'rgba(255,255,255,0.7)';
|
||||
if(n==-1) return;
|
||||
if(isNodeHigh(n[0]))
|
||||
ctx.fillStyle = 'rgba(255,0,0,0.7)';
|
||||
hilited = 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;
|
||||
for(var s in segs){drawSeg(ctx, segs[s]); ctx.fill();}
|
||||
}
|
||||
}
|
||||
|
||||
function drawSeg(ctx, seg){
|
||||
var dx = 400;
|
||||
// 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(grScale(seg[0]+dx), grScale(grChipSize-seg[1]));
|
||||
for(var i=2;i<seg.length;i+=2) ctx.lineTo(grScale(seg[i]+dx), grScale(grChipSize-seg[i+1]));
|
||||
ctx.lineTo(grScale(seg[0]+dx), grScale(grChipSize-seg[1]));
|
||||
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+grChipOffsetX)/grChipSize*600;
|
||||
var y=600-(ymid-grChipOffsetY)/grChipSize*600;
|
||||
// Zoom to fill 80% of the window with the selection
|
||||
var fillfactor=0.80;
|
||||
var dx=xmax-xmin;
|
||||
var dy=ymax-ymin;
|
||||
if (dx < 1) dx=1;
|
||||
if (dy < 1) dy=1;
|
||||
var zx=(800/600)*fillfactor*grChipSize/dx;
|
||||
var zy=fillfactor*grChipSize/dy;
|
||||
var zoom=Math.min(zx,zy);
|
||||
if (zoom < 1) {
|
||||
zoom = 1;
|
||||
}
|
||||
if (zoom > grMaxZoom) {
|
||||
zoom = grMaxZoom;
|
||||
}
|
||||
moveHere([x,y,zoom]);
|
||||
}
|
||||
|
||||
function drawSeg(ctx, seg){
|
||||
var dx = grChipOffsetX;
|
||||
var dy = grChipOffsetY;
|
||||
ctx.beginPath();
|
||||
ctx.moveTo(grScale(seg[0]+dx), grScale(grChipSize-seg[1]+dy));
|
||||
for(var i=2;i<seg.length;i+=2) ctx.lineTo(grScale(seg[i]+dx), grScale(grChipSize-seg[i+1]+dy));
|
||||
ctx.lineTo(grScale(seg[0]+dx), grScale(grChipSize-seg[1]+dy));
|
||||
}
|
||||
|
||||
function findNodeNumber(x,y){
|
||||
|
|
Loading…
Reference in New Issue