diff --git a/apps/pdp11/tapes/diags/README.md b/apps/pdp11/tapes/diags/README.md
index 7d2f6be13..4dfe82df3 100644
--- a/apps/pdp11/tapes/diags/README.md
+++ b/apps/pdp11/tapes/diags/README.md
@@ -44,7 +44,7 @@ Running Paper Tape Diagnostics
Instructions for running "TEST 1 - BRANCH" through "TEST 12 - JUMP" come from the
[MAINDEC-11-DZQAB MAINDEC USER REFERENCE MANUAL (Oct 1973)](http://archive.pcjs.org/pubs/dec/pdp11/diags/MAINDEC-11-DZQAB-B-D_User_Reference_Manual_Oct73.pdf),
-p. 19:
+page 19:
MAINDEC-11-D0AA to D0LA (NEW NUMBER - DZKAA to DZKAL)
@@ -250,7 +250,7 @@ so for now, I'm just going to pick out selected tapes and archive them here.
From [bitsavers.org](http://bitsavers.trailing-edge.com/bits/DEC/pdp11/papertapeimages/20040101/), Tray 02:
-* Tape 04: [MAINDEC-11-DEQKC-B1-PB 06/12/78; 11/70 cpu instruction exerciser; (c)1975,76](#md-11-1170-cpu-exerciser)
+* Tape 04: [MAINDEC-11-DEQKC-B1-PB 06/12/78; 11/70 cpu instruction exerciser; (c)1975,76](#md-11-1170-cpu-exerciser) [[1980 Listing](http://bitsavers.org/pdf/dec/pdp11/microfiche/ftp.j-hoppe.de/bw/gh/AH-7996E-MC__PDP11-70-74__11-70_INST_EXR__CEQKCE0__%28C%2975,80.pdf)]
MD-11 11/70 CPU EXERCISER
-------------------------
@@ -336,7 +336,7 @@ I disassembled the code responsible for that failure:
I wasn't able to locate a source code listing for this particular (1978) version of the 11/70 CPU Instruction Exerciser,
but I did find another useful document,
[MAINDEC-11-DCQKC 11/40 and 11/45 INSTRUCTION EXERCISER (Sep 1974)](http://archive.pcjs.org/pubs/dec/pdp11/diags/MAINDEC-11-DCQKC-D-D_1140_1145_INSTRUCTION_EXERCISER_Sep74.pdf),
-where I discovered a matching test sequence on p. 86.
+where I discovered a matching test sequence on page 86.
Here's an excerpt:
@@ -373,6 +373,13 @@ to trap when SP is 150. That contradicts this newer test (ie, that TST should n
trap "BECAUSE TST IS A NON MODIFYING INST"). For this and other reasons, PDPjs now installs different
checkStackLimit() handlers based on the CPU model.
+UPDATE: Another (1980) version of the source code for this diagnostic has been located and archived
+with the rest of our [DEC PDP-11 Diagnostic Publications](/pubs/dec/pdp11/diags/):
+
+- [CEQKCE0 11/70 INSTRUCTION EXERCISER (May 1980)](http://archive.pcjs.org/pubs/dec/pdp11/diags/AC-7994E-MC_CEQKCE0_1170_INSTRUCTION_EXERCISER_May80.pdf) [[Original PDF](http://bitsavers.org/pdf/dec/pdp11/microfiche/ftp.j-hoppe.de/bw/gh/AH-7996E-MC__PDP11-70-74__11-70_INST_EXR__CEQKCE0__%28C%2975,80.pdf)]
+
+You'll find the above excerpt on page 114, at address 024624.
+
---
Here's the next test that PDPjs failed. Again, I found the same sequence of instructions in the 11/40 and 11/45
diff --git a/devices/pdp11/machine/1170/panel/debugger/cpuexer/machine.xml b/devices/pdp11/machine/1170/panel/debugger/cpuexer/machine.xml
index 80259b38b..826881287 100644
--- a/devices/pdp11/machine/1170/panel/debugger/cpuexer/machine.xml
+++ b/devices/pdp11/machine/1170/panel/debugger/cpuexer/machine.xml
@@ -8,7 +8,7 @@
-
+
diff --git a/modules/markout/lib/markout.js b/modules/markout/lib/markout.js
index 3293dfd64..5fd25b0ef 100644
--- a/modules/markout/lib/markout.js
+++ b/modules/markout/lib/markout.js
@@ -975,6 +975,7 @@ MarkOut.prototype.convertMDLinks = function(sBlock)
} else {
sURL = net.encodeURL(sURL, this.req, this.fDebug);
}
+ sURL = sURL.replace(/_/g, "%5F"); // this helps prevent emphasis detection in URLs
sBlock = str.replaceAll(aMatch[0], '<' + sTag + ' ' + sType + '="' + sURL + '"' + sTitle + '>' + sText + '' + sTag + '>', sBlock);
}
return sBlock;
diff --git a/modules/pcx86/lib/keyboard.js b/modules/pcx86/lib/keyboard.js
index 2e228bb44..ee312e2b9 100644
--- a/modules/pcx86/lib/keyboard.js
+++ b/modules/pcx86/lib/keyboard.js
@@ -1043,7 +1043,7 @@ Keyboard.prototype.setBinding = function(sHTMLType, sBinding, control, sValue)
kbd.addActiveKey(simCode);
};
}(this, sBinding, Keyboard.SOFTCODES[sBinding]);
- var fnUp = function (kbd, sKey, simCode) {
+ var fnUp = function(kbd, sKey, simCode) {
return function onKeyboardBindingUp(event) {
kbd.removeActiveKey(simCode);
};
@@ -1655,7 +1655,7 @@ Keyboard.prototype.injectKeysFromBuffer = function(msDelay)
this.addActiveKey(ch, true);
}
if (this.sInjectBuffer.length > 0) {
- setTimeout(function (kbd) {
+ setTimeout(function(kbd) {
return function onInjectKeyTimeout() {
kbd.injectKeysFromBuffer(msDelay);
};
diff --git a/modules/pdp11/README.md b/modules/pdp11/README.md
index 8a2703415..4f8808db7 100644
--- a/modules/pdp11/README.md
+++ b/modules/pdp11/README.md
@@ -9,29 +9,94 @@ PDP-11 Machine Emulation Module (PDPjs)
Overview
---
-PDPjs, our [PDP-11 Machine](/devices/pdp11/machine/) emulation module, is adapted from
-the [PDP-11/70 Emulator (v1.4)](http://skn.noip.me/pdp11/pdp11.html) written by
-Paul Nankervis.
+PDPjs, our [PDP-11 Machine](/devices/pdp11/machine/) emulation module, was written in 2016. It was adapted from
+the [PDP-11/70 Emulator (v1.4)](http://skn.noip.me/pdp11/pdp11.html) written by Paul Nankervis.
-PDPjs is currently comprised of the following non-shared components, as listed in
-[package.json](../../package.json) (see the *pdp11Files* property):
+PDPjs is currently comprised of the following PDP-11 components, as listed in [package.json](../../package.json)
+(see the *pdp11Files* property):
+* [bus.js](/modules/pdp11/lib/bus.js)
+* [computer.js](/modules/pdp11/lib/computer.js)
+* [cpu.js](/modules/pdp11/lib/cpu.js)
+* [cpuops.js](/modules/pdp11/lib/cpuops.js)
+* [cpustate.js](/modules/pdp11/lib/cpustate.js)
+* [debugger.js](/modules/pdp11/lib/debugger.js)
* [defines.js](/modules/pdp11/lib/defines.js)
+* [device.js](/modules/pdp11/lib/device.js)
+* [disk.js](/modules/pdp11/lib/disk.js)
+* [keyboard.js](/modules/pdp11/lib/keyboard.js)
+* [memory.js](/modules/pdp11/lib/memory.js)
* [messages.js](/modules/pdp11/lib/messages.js)
* [panel.js](/modules/pdp11/lib/panel.js)
-* [bus.js](/modules/pdp11/lib/bus.js)
-* [device.js](/modules/pdp11/lib/device.js)
-* [memory.js](/modules/pdp11/lib/memory.js)
-* [cpu.js](/modules/pdp11/lib/cpu.js)
-* [cpustate.js](/modules/pdp11/lib/cpustate.js)
-* [cpuops.js](/modules/pdp11/lib/cpuops.js)
-* [rom.js](/modules/pdp11/lib/rom.js)
-* [ram.js](/modules/pdp11/lib/ram.js)
-* [keyboard.js](/modules/pdp11/lib/keyboard.js)
-* [serialport.js](/modules/pdp11/lib/serialport.js)
* [pc11.js](/modules/pdp11/lib/pc11.js)
-* [disk.js](/modules/pdp11/lib/disk.js)
+* [ram.js](/modules/pdp11/lib/ram.js)
* [rk11.js](/modules/pdp11/lib/rk11.js)
* [rl11.js](/modules/pdp11/lib/rl11.js)
-* [debugger.js](/modules/pdp11/lib/debugger.js)
-* [computer.js](/modules/pdp11/lib/computer.js)
+* [rom.js](/modules/pdp11/lib/rom.js)
+* [serialport.js](/modules/pdp11/lib/serialport.js)
+
+Since this module was written in 2016, it seemed appropriate to start adopting some of the more useful features of
+[ECMAScript](http://www.ecma-international.org/ecma-262/6.0/index.html) 2015 (aka ES6), including:
+
+* Classes
+* *const* and *let*
+* Computed Properties
+* Default Parameters
+* Octal and Binary Constants
+* Template Literals
+ - String Interpolation (i.e., ${*expr*})
+* New Built-in Methods
+ - String.repeat()
+* *import* and *export*
+
+However, I've still configured the Closure Compiler to "transpile" to ECMAScript 5 (aka ES5), because some people
+may still be using older browsers that don't support ES6 -- or at least the subset of ES6 features I'm currently
+using.
+
+Eventually, I need to do some performance testing and determine whether the ES6 version performs any faster and/or
+consumes fewer resources than the ES5 version. If it does, then I should either bite the bullet and generate ES6 code,
+or generate both versions and use a loader that detects the browser's capabilities and loads the appropriate version.
+
+Caveats
+-------
+
+### Shared modules
+
+All PCjs machines rely on shared modules that are normally stored in [/shared/lib](/shared/lib/). However, until
+ALL the machines have been converted to use ES6 classes, shared code must now exist in two flavors:
+[/shared/lib](/shared/lib/) and [/shared/es6](/shared/es6/).
+
+Once all the other machines have been converted to use ES6 classes, the shared ES6 code will be folded back into
+[/shared/lib](/shared/lib/), and the temporary ES6 folder will go away. Obviously, there is incentive for me to do
+this sooner rather than later, since in the interim, I must make any changes to shared code in both places.
+
+There's also a less obvious problem: if you load a web page that attempts to load two or more PCjs machines, one of
+which uses [/shared/lib](/shared/lib/) and another of which uses [/shared/es6](/shared/es6/), at least one of them will
+fail to start, because the two sets of shared code cannot coexist. Well, they *could* have coexisted if I had been
+willing to change the names of all the shared global objects (like **Component**), but I wasn't.
+
+### *import* and *export*
+
+With regard to *import* and *export* statements, the main reason I use them is to inform my development environment
+(WebStorm) about each file's dependencies, thereby preventing inspection warnings. And ultimately, I plan to make PDPjs
+run as a Node application, so explicitly declaring all imports and exports will be required, but for now, it's just
+a web application, so strictly speaking, they're not required.
+
+When loading uncompiled PDPjs files into a web browser, the Node-based web server bundled with PCjs still relies on
+the `