74 Commits

Author SHA1 Message Date
d8ecc129b3 fixup link to visual6502 wiki 2022-03-06 15:59:24 +00:00
d14ade8be8 fixup link to visual6502 wiki 2022-03-06 15:59:20 +00:00
bc5da26ea2 fixup easy6502 link 2022-03-06 15:56:20 +00:00
15911b02b4 fixup easy6502 link 2022-03-06 15:54:31 +00:00
badcf8e40b Merge pull request #60 from gdevic/dev
Added zoom using the mouse wheel
2020-03-31 13:08:33 +01:00
8097137323 Added zoom using the mouse wheel 2020-03-12 15:09:55 -05:00
5b86a57c2c fixup sticky mouse
closes #57 thanks
2019-03-07 12:00:52 +00:00
0d4cb75658 Merge pull request #58 from hoglet67/Z80
Z80: Visualization improvements: panelization, holes, diagonals
2019-03-07 11:48:34 +00:00
cb7815e1ad Z80: Visualization improvements concerning: panelization, holes, diagnonals
(3 commits squashed together to reduce the size, as they each affect seggefs.js)

- updated segdefs.js to fix some panelization artefacts

- override drawSeg() to deal with holes in shapes; updated segdefs.js

- updated segdefs.js with adjacent diagonals just touching
2019-03-04 08:50:39 +00:00
7ee143a906 Merge pull request #56 from lagomorph/typo
typo in README
2019-01-03 14:14:58 +00:00
52540e3c12 typo 2018-12-28 14:51:27 -05:00
f33937cc92 Merge pull request #55 from hoglet67/Z80
Further work on Z80
2018-10-26 18:12:30 +01:00
deb6833f8a Z80: updated segdefs.js based on new boundary tracing algorithm 2018-10-26 16:40:14 +01:00
296cd01f84 All: fix zoomToBox to scale selection to fill 80% of the window 2018-10-14 13:34:52 +01:00
8e799d6922 All: fix zoomToBox to make use of grChipOffsetX/Y (tested on all chips) 2018-10-14 13:07:25 +01:00
a4ed7a9178 Z80: updated transdefs to have accurate bounding box for transistors 2018-10-14 12:28:25 +01:00
9795b463ac Z80: Updated nodenames.js to include warning about manual editing 2018-10-12 13:51:06 +01:00
b384fb552f Z80: Update netlist to fix the IM2 vector issue (missing pass transistor) 2018-10-12 13:08:57 +01:00
bf63c33552 All: subtract grChipOffsetX/Y from coordiates given to user so the match the PNGs 2018-10-12 13:08:29 +01:00
9760663cc1 Z80: avoid the need to invert the register values in Javascript 2018-10-12 12:40:59 +01:00
3ae93282ba Z80: switch to machine generates nodenames.js (please don't edit\!) 2018-10-12 12:30:03 +01:00
ab53a12b2e Z80: added pla signals to nodenames.js 2018-10-11 12:52:57 +01:00
a92f443ac1 Z80: fix stepBack(), drive IntAck value of 0xe9, add lots more internal busses (with Ed) 2018-10-09 22:01:28 +01:00
86e6e116d7 All: Fix a hard-coded nodes array length in stateString() 2018-10-09 21:59:27 +01:00
f360557572 Z80: override chipsim getNodeValue() to better model charge sharing 2018-10-08 10:33:44 +01:00
5005774b1b Z80: updated handleBusRead() to leave the databus at 0xFF between reads 2018-10-08 10:27:36 +01:00
924074e305 Z80: Updated netlist using data that include burried contact at 488,2761 (Ken, 2014) 2018-10-07 13:30:52 +01:00
b0c40b9e7b add URL control of some Z80 inputs 2018-10-06 13:58:37 +01:00
74762264c1 Merge pull request #54 from hoglet67/Z80
Visual Z80: work towards interrupt support
2018-09-30 16:44:22 +01:00
6fcb3077eb Z80: In INTACK cycle, force 0xFF onto the databus 2018-09-30 15:14:40 +01:00
cbebb0e11d Z80: Added additional nodenames for int/nmi 2018-09-30 15:14:40 +01:00
2612132999 Merge pull request #53 from TReed0803/master
[6502] Adding expert wire toggles for SO pin
2018-09-30 14:43:33 +01:00
8327a36826 Adding expert wire toggles for SO pin 2018-09-29 19:58:25 -07:00
886efe1d5a Merge pull request #52 from hoglet67/Z80
Work so far on Visual Z80
2018-09-29 18:49:09 +01:00
d9c92ebdc3 Z80: corrected typo in flag name 2018-09-22 16:29:19 +01:00
651a1753b7 Z80: update test program 2018-09-22 15:27:27 +01:00
f5cada53f7 Z80: Updated transdefs.js with a version that replaces trap transistor with a hard short it's drain to ground (just connecting trap gate to VCC was not sufficient) 2018-09-22 14:34:53 +01:00
7d579fa4aa Z80: whitespace only 2018-09-22 11:02:18 +01:00
e33f40e60c Z80: Corrected fetch state machine to cover all cases correctly 2018-09-22 10:58:48 +01:00
379d2d1ea1 Z80: Seperate A/F and format flags individually 2018-09-22 09:45:51 +01:00
59792d75fc All: added variables for grChipOffsetX/gfChipOffsetY (previously hardcoded to 400/0) 2018-09-22 09:30:47 +01:00
225b49a6d8 Z80: Correct bounding box for transistor in transdefs.js 2018-09-21 22:00:51 +01:00
3de51801ea Z80: Updated test program to include call 2018-09-21 18:04:18 +01:00
2f882d7d34 Z80: Start with clock high 2018-09-21 18:03:50 +01:00
b9e235fac2 Z80: display remapped registers (so INC D always increments D) 2018-09-21 17:48:51 +01:00
0e4c3e0ab0 Z80: Added disassembly 2018-09-21 16:51:58 +01:00
767e2492be Z80: Set grCanvasSize to 5000, so mistakes are clearer 2018-09-21 10:32:20 +01:00
95f9d52306 Z80: Adjusted chip/canvas size and max zoom 2018-09-21 10:32:20 +01:00
646f22b79e Z80: segdefs.js now contains polygon information 2018-09-21 10:32:20 +01:00
2ff43fafb3 Z80: Expose alterate register state and register set selection flipflops 2018-09-19 18:52:43 +01:00
8a9fe6f57e Extended test program to test simple memory writes 2018-09-19 15:07:27 +01:00
3315f309a7 Added EXX to test program, as we seem to start off with alternative BC/DE/HL active 2018-09-19 14:45:41 +01:00
85058171b2 Z80: Added ir and wr registers 2018-09-19 13:50:31 +01:00
7a0cb72539 Initial checking of chip-z80 2018-09-19 13:27:39 +01:00
0a6866f10c Add two signals to DPControl fixing #50 2018-05-29 10:51:02 +01:00
5b15e2d6c9 Merge pull request #48 from mmfoerster/master
Corrected and expanded the time state readout (the "TState" pseudobus).
2018-05-06 11:24:14 +01:00
e6e446a256 Merge pull request #49 from trebonian/BigEd-patch-1
Updating links, e-tradition is now masswerk
2018-05-06 10:20:26 +01:00
bd0356f2a0 Update index.html 2018-05-06 10:20:00 +01:00
096f6bbcf8 Updating links, e-tradition is now masswerk 2018-05-06 10:18:22 +01:00
698312b98e Corrected and expanded the time state readout (the "TState" pseudobus).
The occurrences of T6 and T1 have been corrected. T6 now only occurs when a BRK
instruction is executing, it is a synonym for when the VEC1 node is logic high.
T1 now occurs when node 862 is logic high, which drives the SYNC pin, among
other control effects.

Formerly, T1 and T6 were displayed only when all the nodes that affect the PLA
were inactive. Node 1357's state was used in that case to choose between
displaying T1 (1357 high) or T6 (1357 low). That turned out to be incorrect
pair of inferences. The result was that T1 was absent when it should have been
present (when T+ was present without T0), and T6 was present when it should
have been absent (for instructions other than BRK). Among the corrective
changes, node 1357 is no longer consulted.

Expansion of state display adds V0, SD1, and SD2 indications. The last two are
in their own field (an eighth field). V0 is in the seventh field (square
bracketed, the same field occupied by T1 and T6). It is a two-character
representation of node VEC0 being at logic high. VEC0 high causes VEC1 to be
high one cycle later, which is T6. V0 is, like T6, activated only by execution
of a BRK instruction.

SD1 and SD2 are nodes 440 and 1258 respectively, which lie in the RCL block
outside of the timing generation (clock) block. They serve the needs of the
RMW (Read-Modify-Write) instructions for their addressing modes that use
external memory instead of the accumulator.

All of the corrected and new features has increased the total number of
displayed states to 24 from 10. Hopefully, this is the ultimate, final,
most fully comprehensive clock display possible, but we'll see.
2017-12-15 13:47:24 -05:00
bd45334147 Merge pull request #47 from mmfoerster/master
Added 6502 time code display as "TState" pseudo-bus - see wiki
2017-10-30 18:35:22 +00:00
7efe4fb8c7 Added comments to allTCStates() referring to the 6502_Timing_States wiki page.
The state labeling is not completely correct or complete regarding T5 and T6
(especially the latter). More investment will be forthcoming.
2017-10-30 14:08:57 -04:00
ef0a714a29 busToString() and allTCStates() changes agreed to online: TState and Phi.
The parameter to allTCStates() has had a name change from useNBSP to useHTML.

busToString() has had the TStateF pseudobus removed, and a pseudobus called
Phi added.

Phi pretty-prints the state of the cp1 node (the internal phase 1 node) as
Φ1 when high and as Φ2 when low. This is nicer than plain 0 or 1.

Logging the TState pseudobus followed by the Phi pseudobus creates the effect
intended by the removed TStateF pseudobus, keeping our collection of
operations orthogonal (no proliferation of trivially different operations
that duplicate each other diagonally).
2017-10-30 00:49:17 -04:00
e0547e6c35 merge clock phase display into TState pseudobus 2017-10-28 13:49:46 +01:00
76edc1186a Deleted 6502timecodes.txt: content moved to the visual6502 wiki.
Documentation is more appropriately stored there instead of the repository.
It is also further developed there:
http://visual6502.org/wiki/index.php?title=6502_Timing_States
2017-10-25 11:39:23 -04:00
c1409b78cb busToString( 'TState' ) and busToString( 'TStateF' ) now call allTCStates().
'TState' returns the string returned by allTCStates().

'TStateF' returns the string returned by allTCStates() with phase indication
appended: "F1" or "F2" for phase1 or phase2 respectively. 'F' is chosen since
that's all that Phi really is: an "eff".

Perhaps another enhancement could call out an actual phi glyph for the HTML
(browser) context.

allTCStates() is also enhanced by an optional boolean parameter to control the
spacing of non-blank text within the string it returns.
    * A true parameter puts HTML non-breaking spaces between non-blank text,
      suitable for display on a browser page.
      This is always used by busToString().
    * A false or absent parameter puts ASCII spaces between non-blank text,
      suitable for text logging.
2017-10-09 17:49:53 -04:00
d39bab7302 Clarified causation statement about T0 T+ time code in 6502 time codes documentation 2017-09-19 23:56:43 -04:00
587fa47d8a Tamed a long line in the new 6502 time codes documentation 2017-09-19 21:50:42 -04:00
27d0eb8fb2 Created plain-text documentation for the 6502 clock time codes. Added function
that creates the text expression of the time codes seen in the documentation
to macros.js and expert-allinone.js.

Added documentation file: 6502timecodes.txt
Added function: allTCStates()
2017-09-19 21:22:34 -04:00
90f57631c0 Merge pull request #46 from mmfoerster/master
Added missing '#' and '~' to both copies of the BRtaken node name.
2017-05-08 18:25:56 +01:00
cba0c7a6b5 Added ~BRtaken definition to the expert version to parallel nodenames.js. 2017-05-08 10:33:40 -04:00
c2348c5f63 Added missing '#' and '~' to both copies of the BRtaken node name.
The comments with them indicate that the semantics of the node (high when branch
not taken) was already recognized.

pipeBRtaken in the expert version is left untouched, as it is opposite-valued
from #BRtaken, although its meaning is multiplexed by additional influences
(nodenames.js has it named pipeIPCrelated).
2017-05-06 16:39:58 -04:00
4bb43bfd0e Merge pull request #45 from mmfoerster/master
Corrected node numbers for p6 (V bit) and p7 (N bit) of the status re…
2017-04-27 18:14:40 +01:00
8d50388828 Corrected node numbers for p6 (V bit) and p7 (N bit) of the status register.
p6 and p7 were duplicates of their respective Pout-named nodes instead of
the phase 1 updated nodes of their storage complexes, as all the other
processor status register bits are (except for the B bit, of course).

    Comment typo correction for cclk.
2017-04-13 04:34:02 -04:00
17 changed files with 24984 additions and 38 deletions

2
README
View File

@ -1,4 +1,4 @@
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,

View File

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

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

@ -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,
}

14606
chip-z80/segdefs.js Normal file

File diff suppressed because one or more lines are too long

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

6815
chip-z80/transdefs.js Executable file

File diff suppressed because it is too large Load Diff

View File

@ -158,7 +158,7 @@ function allNodes(){
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';

View File

@ -11879,8 +11879,8 @@ p2: 1553, // I bit of status register (storage node)
p3: 348, // D bit of status register (storage node)
p4: 1119, // there is no bit4 in the status register! (not a storage node)
p5: -1, // there is no bit5 in the status register! (not a storage node)
p6: 77, // V bit of status register (storage node)
p7: 1370, // N bit of status register (storage node)
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,
@ -12102,7 +12102,7 @@ notRnWprepad: 187, // internal signal: to pad, yet to be inverted and retimed
RnWstretched: 353, // internal signal: control datapad output drivers, aka TRISTATE
"#DBE": 1035, // internal signal: formerly from DBE pad (6501)
cp1: 710, // internal signal: clock phase 1
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
@ -12281,7 +12281,8 @@ INTG: 1350, // internal signal: interrupt handler related
// internal signals: control signals
nnT2BR: 967, // doubly inverted
BRtaken: 1544, // aka #TAKEN
"#BRtaken": 1544, // aka #TAKEN
"~BRtaken": 1544, // automatic alias replacing hash with tilde
// interrupt and vector related
NMIP: 1032,
@ -12469,7 +12470,10 @@ AxB7: 1241,
// 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
@ -14022,6 +14026,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 ? '&nbsp;' : ' ';
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;
}
@ -14048,6 +14117,13 @@ 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 '&Phi;' +
(isNodeHigh( nodenames[ 'cp1' ] ) ? '1' : '2');
if(busname=='Execute')
return dis6502toHTML(readBits('ir',8));
if(busname=='Fetch')
@ -14057,7 +14133,7 @@ function busToString(busname){
// - 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))

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

@ -56,8 +56,8 @@ $().ready(function(){
<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;
<a href="http://skilldrick.github.com/easy6502/#first-program">easy6502 assembler</a>&nbsp;
<a href="http://www.e-tradition.net/bytes/6502/disassembler.html">e-tradition disassembler</a>&nbsp;
<a href="http://skilldrick.github.io/easy6502/#first-program">easy6502 assembler</a>&nbsp;
<a href="http://www.masswerk.at/6502/disassembler.html">mass:werk disassembler</a>&nbsp;
</span>
<div class="frame" id="frame">
<div class="leftcolumn" id="leftcolumn">
@ -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>
&nbsp;
</div>
</div> <!-- buttons -->

View File

@ -37,12 +37,14 @@ var labelThese=[];
// 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;
@ -51,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;
@ -210,6 +212,24 @@ function setupParams(){
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){
@ -257,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)};
@ -286,7 +315,7 @@ function mouseMove(e){
}
function mouseUp(e){
if(!moved) handleClick(e);
if(!moved) handleClick(e);
chipsurround.onmousemove = undefined;
chipsurround.onmouseup = undefined;
}
@ -330,8 +359,8 @@ function updateLinkHere(){
// 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(['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])
@ -457,7 +486,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;
@ -467,7 +496,7 @@ function handleClick(e){
var cx = Math.round(x*grChipSize/600);
var cy = Math.round(y*grChipSize/600);
// prepare two lines of status report
var s1='x: ' + cx + ' y: ' + cy;
var s1='x: ' + (cx - grChipOffsetX) + ' y: ' + (cy - grChipOffsetY);
var s2='node:&nbsp;' + w + '&nbsp;' + nodeName(w);
if(w==-1) {
setStatus(s1); // no node found, so report only coordinates
@ -476,8 +505,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];
@ -579,8 +608,10 @@ function setupChipLayoutGraphics(){
}
// 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

View File

@ -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>
@ -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://skilldrick.github.com/easy6502/#first-program">emulator and assembler</a> from the easy6502 tutorial
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 />

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

@ -304,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 ? '&nbsp;' : ' ';
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;
}
@ -330,6 +395,13 @@ 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 '&Phi;' +
(isNodeHigh( nodenames[ 'cp1' ] ) ? '1' : '2');
if(busname=='Execute')
return disassemblytoHTML(readBits('ir',8));
if(busname=='Fetch')
@ -339,7 +411,7 @@ function busToString(busname){
// - 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))

View File

@ -153,8 +153,8 @@ p2: 1553, // I bit of status register (storage node)
p3: 348, // D bit of status register (storage node)
p4: 1119, // there is no bit4 in the status register! (not a storage node)
p5: -1, // there is no bit5 in the status register! (not a storage node)
p6: 77, // V bit of status register (storage node)
p7: 1370, // N bit of status register (storage node)
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,
@ -405,7 +405,7 @@ RnWstretched: 353, // internal signal: control datapad output drivers, aka TRIST
"#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
H1x1: 1042, // internal signal: drive status byte onto databus
@ -590,8 +590,8 @@ H1x1: 1042, // internal signal: drive status byte onto databus
// internal signals: control signals
nnT2BR: 967, // doubly inverted
BRtaken: 1544, // aka #TAKEN
BRtaken: 1544, // automatic alias replacing hash with tilde
"#BRtaken": 1544, // aka #TAKEN
"~BRtaken": 1544, // automatic alias replacing hash with tilde
// internal signals and state: interrupt and vector related
// segher says:
@ -863,7 +863,10 @@ AxB7: 1241,
// 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

View File

@ -204,18 +204,33 @@ function ctxDrawBox(ctx, xMin, yMin, xMax, yMax){
function zoomToBox(xmin,xmax,ymin,ymax){
var xmid=(xmin+xmax)/2;
var ymid=(ymin+ymax)/2;
var x=(xmid+400)/grChipSize*600;
var y=600-ymid/grChipSize*600;
var zoom=5; // pending a more careful calculation
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 = 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){