Merge pull request #52 from hoglet67/Z80

Work so far on Visual Z80
This commit is contained in:
BigEd 2018-09-29 18:49:09 +01:00 committed by GitHub
commit 886efe1d5a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 25616 additions and 8 deletions

View File

@ -4,7 +4,9 @@
chipname='6800';
grChipSize=7000;
grChipSize=6600;
grChipOffsetX=25
grChipOffsetY=-200;
ngnd = nodenames['gnd'];
npwr = nodenames['vcc'];

284
chip-z80/nodenames.js Normal file
View File

@ -0,0 +1,284 @@
var nodenames ={
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,
_int: 23,
_nmi: 24,
_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,
t1: 115,
t2: 137,
t3: 144,
t4: 166,
t5: 134,
t6: 168,
m1: 155,
m2: 173,
m3: 163,
m4: 159,
m5: 209,
m6: 210,
m6: 210,
ex_af: 631,
ex_bcdehl: 1770,
ex_dehl0: 625,
ex_dehl1: 629,
ex_dehl_combined: 626,
reg_a0: 2271,
reg_f0: 1854,
reg_b0: 2268,
reg_c0: 1851,
reg_d0: 2264,
reg_e0: 1847,
reg_h0: 2266,
reg_l0: 1849,
reg_w0: 2260,
reg_z0: 1843,
reg_pch0: 2258,
reg_pcl0: 1841,
reg_sph0: 2261,
reg_spl0: 1844,
reg_ixh0: 2263,
reg_ixl0: 1846,
reg_iyh0: 2262,
reg_iyl0: 1845,
reg_i0: 2259,
reg_r0: 1842,
reg_aa0: 2270,
reg_ff0: 1853,
reg_bb0: 2269,
reg_cc0: 1852,
reg_dd0: 2265,
reg_ee0: 1848,
reg_hh0: 2267,
reg_ll0: 1850,
reg_a1: 2296,
reg_f1: 1881,
reg_b1: 2293,
reg_c1: 1878,
reg_d1: 2289,
reg_e1: 1874,
reg_h1: 2291,
reg_l1: 1876,
reg_w1: 2285,
reg_z1: 1870,
reg_pch1: 2283,
reg_pcl1: 1868,
reg_sph1: 2286,
reg_spl1: 1871,
reg_ixh1: 2288,
reg_ixl1: 1873,
reg_iyh1: 2287,
reg_iyl1: 1872,
reg_i1: 2284,
reg_r1: 1869,
reg_aa1: 2295,
reg_ff1: 1880,
reg_bb1: 2294,
reg_cc1: 1879,
reg_dd1: 2290,
reg_ee1: 1875,
reg_hh1: 2292,
reg_ll1: 1877,
reg_a2: 2384,
reg_f2: 1958,
reg_b2: 2381,
reg_c2: 1955,
reg_d2: 2377,
reg_e2: 1951,
reg_h2: 2379,
reg_l2: 1953,
reg_w2: 2373,
reg_z2: 1947,
reg_pch2: 2371,
reg_pcl2: 1945,
reg_sph2: 2374,
reg_spl2: 1948,
reg_ixh2: 2376,
reg_ixl2: 1950,
reg_iyh2: 2375,
reg_iyl2: 1949,
reg_i2: 2372,
reg_r2: 1946,
reg_aa2: 2383,
reg_ff2: 1957,
reg_bb2: 2382,
reg_cc2: 1956,
reg_dd2: 2378,
reg_ee2: 1952,
reg_hh2: 2380,
reg_ll2: 1954,
reg_a3: 2416,
reg_f3: 1986,
reg_b3: 2413,
reg_c3: 1983,
reg_d3: 2409,
reg_e3: 1979,
reg_h3: 2411,
reg_l3: 1981,
reg_w3: 2405,
reg_z3: 1975,
reg_pch3: 2403,
reg_pcl3: 1973,
reg_sph3: 2406,
reg_spl3: 1976,
reg_ixh3: 2408,
reg_ixl3: 1978,
reg_iyh3: 2407,
reg_iyl3: 1977,
reg_i3: 2404,
reg_r3: 1974,
reg_aa3: 2415,
reg_ff3: 1985,
reg_bb3: 2414,
reg_cc3: 1984,
reg_dd3: 2410,
reg_ee3: 1980,
reg_hh3: 2412,
reg_ll3: 1982,
reg_a4: 2489,
reg_f4: 2058,
reg_b4: 2486,
reg_c4: 2055,
reg_d4: 2482,
reg_e4: 2051,
reg_h4: 2484,
reg_l4: 2053,
reg_w4: 2478,
reg_z4: 2047,
reg_pch4: 2476,
reg_pcl4: 2045,
reg_sph4: 2479,
reg_spl4: 2048,
reg_ixh4: 2481,
reg_ixl4: 2050,
reg_iyh4: 2480,
reg_iyl4: 2049,
reg_i4: 2477,
reg_r4: 2046,
reg_aa4: 2488,
reg_ff4: 2057,
reg_bb4: 2487,
reg_cc4: 2056,
reg_dd4: 2483,
reg_ee4: 2052,
reg_hh4: 2485,
reg_ll4: 2054,
reg_a5: 2527,
reg_f5: 2082,
reg_b5: 2524,
reg_c5: 2079,
reg_d5: 2520,
reg_e5: 2075,
reg_h5: 2522,
reg_l5: 2077,
reg_w5: 2516,
reg_z5: 2071,
reg_pch5: 2514,
reg_pcl5: 2069,
reg_sph5: 2517,
reg_spl5: 2072,
reg_ixh5: 2519,
reg_ixl5: 2074,
reg_iyh5: 2518,
reg_iyl5: 2073,
reg_i5: 2515,
reg_r5: 2070,
reg_aa5: 2526,
reg_ff5: 2081,
reg_bb5: 2525,
reg_cc5: 2080,
reg_dd5: 2521,
reg_ee5: 2076,
reg_hh5: 2523,
reg_ll5: 2078,
reg_a6: 2610,
reg_f6: 2155,
reg_b6: 2607,
reg_c6: 2152,
reg_d6: 2603,
reg_e6: 2148,
reg_h6: 2605,
reg_l6: 2150,
reg_w6: 2599,
reg_z6: 2144,
reg_pch6: 2597,
reg_pcl6: 2142,
reg_sph6: 2600,
reg_spl6: 2145,
reg_ixh6: 2602,
reg_ixl6: 2147,
reg_iyh6: 2601,
reg_iyl6: 2146,
reg_i6: 2598,
reg_r6: 2143,
reg_aa6: 2609,
reg_ff6: 2154,
reg_bb6: 2608,
reg_cc6: 2153,
reg_dd6: 2604,
reg_ee6: 2149,
reg_hh6: 2606,
reg_ll6: 2151,
reg_a7: 2633,
reg_f7: 2179,
reg_b7: 2630,
reg_c7: 2176,
reg_d7: 2626,
reg_e7: 2172,
reg_h7: 2628,
reg_l7: 2174,
reg_w7: 2622,
reg_z7: 2168,
reg_pch7: 2620,
reg_pcl7: 2166,
reg_sph7: 2623,
reg_spl7: 2169,
reg_ixh7: 2625,
reg_ixl7: 2171,
reg_iyh7: 2624,
reg_iyl7: 2170,
reg_i7: 2621,
reg_r7: 2167,
reg_aa7: 2632,
reg_ff7: 2178,
reg_bb7: 2631,
reg_cc7: 2177,
reg_dd7: 2627,
reg_ee7: 2173,
reg_hh7: 2629,
reg_ll7: 2175,
}

15784
chip-z80/segdefs.js Normal file

File diff suppressed because one or more lines are too long

2497
chip-z80/support.js Normal file

File diff suppressed because it is too large Load Diff

73
chip-z80/testprogram.js Normal file
View File

@ -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
]

6812
chip-z80/transdefs.js Executable file

File diff suppressed because it is too large Load Diff

151
expert-z80.html Normal file
View File

@ -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>&nbsp;
<a href="http://blog.visual6502.org">Blog</a>&nbsp;
<a href="http://www.visual6502.org/links.html">Links</a>&nbsp;
<a href="http://github.com/trebonian/visual6502">Source</a>&nbsp;
</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>
&nbsp;
</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>

View File

@ -43,6 +43,8 @@ var labelThese=[];
// 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;
@ -457,7 +459,7 @@ function hiliteNodeList(){
// the localx and localy functions return canvas coordinate offsets from the canvas window top left corner
// we divide the results by 'zoom' to get drawn coordinates useful in findNodeNumber
// to convert to reported user chip coordinates we multiply by grChipSize/600
// to compare to segdefs and transdefs coordinates we subtract 400 from x and subtract y from grChipSize
// 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;
@ -476,8 +478,8 @@ function handleClick(e){
// we have a node, but maybe we clicked over a transistor
var nodelist=[w];
// match the coordinate against transistor gate bounding boxes
x=cx-400;
y=grChipSize-cy;
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];

View File

@ -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;

View File

@ -211,11 +211,12 @@ function zoomToBox(xmin,xmax,ymin,ymax){
}
function drawSeg(ctx, seg){
var dx = 400;
var dx = grChipOffsetX;
var dy = grChipOffsetY;
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(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){