diff --git a/404.md b/404.md
new file mode 100644
index 000000000..5e3d75792
--- /dev/null
+++ b/404.md
@@ -0,0 +1,7 @@
+---
+layout: page
+title: Page Not Found
+permalink: /404.html
+---
+
+{% include random-publication.html text="This is not the page you are looking for. You found a piece of paper instead." %}
diff --git a/Gemfile b/Gemfile
new file mode 100644
index 000000000..b002ff5fd
--- /dev/null
+++ b/Gemfile
@@ -0,0 +1,4 @@
+source 'https://rubygems.org'
+gem 'github-pages'
+gem 'jekyll-sitemap'
+gem 'jekyll-redirect-from'
diff --git a/Gemfile.lock b/Gemfile.lock
new file mode 100644
index 000000000..7ed8e9121
--- /dev/null
+++ b/Gemfile.lock
@@ -0,0 +1,203 @@
+GEM
+ remote: https://rubygems.org/
+ specs:
+ activesupport (4.2.7)
+ i18n (~> 0.7)
+ json (~> 1.7, >= 1.7.7)
+ minitest (~> 5.1)
+ thread_safe (~> 0.3, >= 0.3.4)
+ tzinfo (~> 1.1)
+ addressable (2.5.0)
+ public_suffix (~> 2.0, >= 2.0.2)
+ coffee-script (2.4.1)
+ coffee-script-source
+ execjs
+ coffee-script-source (1.12.2)
+ colorator (1.1.0)
+ ethon (0.10.1)
+ ffi (>= 1.3.0)
+ execjs (2.7.0)
+ faraday (0.11.0)
+ multipart-post (>= 1.2, < 3)
+ ffi (1.9.17)
+ forwardable-extended (2.6.0)
+ gemoji (3.0.0)
+ github-pages (119)
+ activesupport (= 4.2.7)
+ github-pages-health-check (= 1.3.0)
+ jekyll (= 3.3.1)
+ jekyll-avatar (= 0.4.2)
+ jekyll-coffeescript (= 1.0.1)
+ jekyll-default-layout (= 0.1.4)
+ jekyll-feed (= 0.8.0)
+ jekyll-gist (= 1.4.0)
+ jekyll-github-metadata (= 2.3.1)
+ jekyll-mentions (= 1.2.0)
+ jekyll-optional-front-matter (= 0.1.2)
+ jekyll-paginate (= 1.1.0)
+ jekyll-readme-index (= 0.0.4)
+ jekyll-redirect-from (= 0.12.1)
+ jekyll-relative-links (= 0.2.1)
+ jekyll-sass-converter (= 1.5.0)
+ jekyll-seo-tag (= 2.1.0)
+ jekyll-sitemap (= 0.12.0)
+ jekyll-swiss (= 0.4.0)
+ jekyll-theme-architect (= 0.0.3)
+ jekyll-theme-cayman (= 0.0.3)
+ jekyll-theme-dinky (= 0.0.3)
+ jekyll-theme-hacker (= 0.0.3)
+ jekyll-theme-leap-day (= 0.0.3)
+ jekyll-theme-merlot (= 0.0.3)
+ jekyll-theme-midnight (= 0.0.3)
+ jekyll-theme-minimal (= 0.0.3)
+ jekyll-theme-modernist (= 0.0.3)
+ jekyll-theme-primer (= 0.1.7)
+ jekyll-theme-slate (= 0.0.3)
+ jekyll-theme-tactile (= 0.0.3)
+ jekyll-theme-time-machine (= 0.0.3)
+ jekyll-titles-from-headings (= 0.1.4)
+ jemoji (= 0.8.0)
+ kramdown (= 1.11.1)
+ liquid (= 3.0.6)
+ listen (= 3.0.6)
+ mercenary (~> 0.3)
+ minima (= 2.0.0)
+ nokogiri (= 1.6.8.1)
+ rouge (= 1.11.1)
+ terminal-table (~> 1.4)
+ github-pages-health-check (1.3.0)
+ addressable (~> 2.3)
+ net-dns (~> 0.8)
+ octokit (~> 4.0)
+ public_suffix (~> 2.0)
+ typhoeus (~> 0.7)
+ html-pipeline (2.5.0)
+ activesupport (>= 2)
+ nokogiri (>= 1.4)
+ i18n (0.8.0)
+ jekyll (3.3.1)
+ addressable (~> 2.4)
+ colorator (~> 1.0)
+ jekyll-sass-converter (~> 1.0)
+ jekyll-watch (~> 1.1)
+ kramdown (~> 1.3)
+ liquid (~> 3.0)
+ mercenary (~> 0.3.3)
+ pathutil (~> 0.9)
+ rouge (~> 1.7)
+ safe_yaml (~> 1.0)
+ jekyll-avatar (0.4.2)
+ jekyll (~> 3.0)
+ jekyll-coffeescript (1.0.1)
+ coffee-script (~> 2.2)
+ jekyll-default-layout (0.1.4)
+ jekyll (~> 3.0)
+ jekyll-feed (0.8.0)
+ jekyll (~> 3.3)
+ jekyll-gist (1.4.0)
+ octokit (~> 4.2)
+ jekyll-github-metadata (2.3.1)
+ jekyll (~> 3.1)
+ octokit (~> 4.0, != 4.4.0)
+ jekyll-mentions (1.2.0)
+ activesupport (~> 4.0)
+ html-pipeline (~> 2.3)
+ jekyll (~> 3.0)
+ jekyll-optional-front-matter (0.1.2)
+ jekyll (~> 3.0)
+ jekyll-paginate (1.1.0)
+ jekyll-readme-index (0.0.4)
+ jekyll (~> 3.0)
+ jekyll-redirect-from (0.12.1)
+ jekyll (~> 3.3)
+ jekyll-relative-links (0.2.1)
+ jekyll (~> 3.3)
+ jekyll-sass-converter (1.5.0)
+ sass (~> 3.4)
+ jekyll-seo-tag (2.1.0)
+ jekyll (~> 3.3)
+ jekyll-sitemap (0.12.0)
+ jekyll (~> 3.3)
+ jekyll-swiss (0.4.0)
+ jekyll-theme-architect (0.0.3)
+ jekyll (~> 3.3)
+ jekyll-theme-cayman (0.0.3)
+ jekyll (~> 3.3)
+ jekyll-theme-dinky (0.0.3)
+ jekyll (~> 3.3)
+ jekyll-theme-hacker (0.0.3)
+ jekyll (~> 3.3)
+ jekyll-theme-leap-day (0.0.3)
+ jekyll (~> 3.3)
+ jekyll-theme-merlot (0.0.3)
+ jekyll (~> 3.3)
+ jekyll-theme-midnight (0.0.3)
+ jekyll (~> 3.3)
+ jekyll-theme-minimal (0.0.3)
+ jekyll (~> 3.3)
+ jekyll-theme-modernist (0.0.3)
+ jekyll (~> 3.3)
+ jekyll-theme-primer (0.1.7)
+ jekyll (~> 3.3)
+ jekyll-theme-slate (0.0.3)
+ jekyll (~> 3.3)
+ jekyll-theme-tactile (0.0.3)
+ jekyll (~> 3.3)
+ jekyll-theme-time-machine (0.0.3)
+ jekyll (~> 3.3)
+ jekyll-titles-from-headings (0.1.4)
+ jekyll (~> 3.3)
+ jekyll-watch (1.5.0)
+ listen (~> 3.0, < 3.1)
+ jemoji (0.8.0)
+ activesupport (~> 4.0)
+ gemoji (~> 3.0)
+ html-pipeline (~> 2.2)
+ jekyll (>= 3.0)
+ json (1.8.6)
+ kramdown (1.11.1)
+ liquid (3.0.6)
+ listen (3.0.6)
+ rb-fsevent (>= 0.9.3)
+ rb-inotify (>= 0.9.7)
+ mercenary (0.3.6)
+ mini_portile2 (2.1.0)
+ minima (2.0.0)
+ minitest (5.10.1)
+ multipart-post (2.0.0)
+ net-dns (0.8.0)
+ nokogiri (1.6.8.1)
+ mini_portile2 (~> 2.1.0)
+ octokit (4.6.2)
+ sawyer (~> 0.8.0, >= 0.5.3)
+ pathutil (0.14.0)
+ forwardable-extended (~> 2.6)
+ public_suffix (2.0.5)
+ rb-fsevent (0.9.8)
+ rb-inotify (0.9.8)
+ ffi (>= 0.5.0)
+ rouge (1.11.1)
+ safe_yaml (1.0.4)
+ sass (3.4.23)
+ sawyer (0.8.1)
+ addressable (>= 2.3.5, < 2.6)
+ faraday (~> 0.8, < 1.0)
+ terminal-table (1.7.3)
+ unicode-display_width (~> 1.1.1)
+ thread_safe (0.3.5)
+ typhoeus (0.8.0)
+ ethon (>= 0.8.0)
+ tzinfo (1.2.2)
+ thread_safe (~> 0.1)
+ unicode-display_width (1.1.3)
+
+PLATFORMS
+ ruby
+
+DEPENDENCIES
+ github-pages
+ jekyll-redirect-from
+ jekyll-sitemap
+
+BUNDLED WITH
+ 1.11.2
diff --git a/_config.yml b/_config.yml
new file mode 100644
index 000000000..c3c38c53a
--- /dev/null
+++ b/_config.yml
@@ -0,0 +1,200 @@
+# Site settings
+
+source: .
+destination: ./docs
+title: "PCjs Machines"
+email: Jeff@pcjs.org
+description: >
+ Welcome to PCjs, home of the original IBM PC in a web browser.
+ PCjs provides a variety of computer emulators written in JavaScript, including PCx86 for x86-based machines
+ (up through the 80386), C1Pjs for the 6502-based Ohio Scientific Challenger 1P, PC8080 for 8080-based machines
+ such as Space Invaders and the DEC VT100 Terminal, and PDPjs with support for PDP-10 and PDP-11 machines.
+ PCjs also provides an archive of selected historical PC software, publications, and reference materials.
+baseurl: ""
+url: "http://www.pcjs.org"
+twitter_username: jeffpar
+github_username: jeffpar
+
+left_brace: "{"
+right_brace: "}"
+encoding: UTF-8
+
+# Build settings
+
+exclude: ["index.html", "**/index.html", "bin", "logs", "node_modules", "projects", "src", "tmp", "videos", "web", "**/archive", "**/ecp", "**/c64", "**/private", "**/restricted", "**/src", "**/tmp", "**/unlisted", ".git", ".idea", "/Gemfile", "/Gemfile.lock", "/Gruntfile.js", "/gulpfile.js", "/notes.md", "/server.js", "/*.sh"]
+markdown: kramdown
+kramdown:
+ input: GFM
+ hard_wrap: false
+
+gems:
+ - jekyll-sitemap
+ - jekyll-redirect-from
+
+# Custom site settings
+
+pcjs:
+ domain: pcjs.org # whereas site.url is used for linking purposes, site.pcjs.domain is used for display purposes
+ version: 1.37.1 # IMPORTANT: keep pcjs.version in sync with package.json:version
+ compiled: true # by default, the compiled pcjs.version scripts will be used (eg, pcx86.js or pcx86-dbg.js)
+ c1p_scripts: # if pcjs.compiled is false, the following scripts will be included instead, in the order listed
+ - /modules/shared/lib/defines.js
+ - /modules/shared/lib/nodebug.js
+ - /modules/shared/lib/dumpapi.js
+ - /modules/shared/lib/reportapi.js
+ - /modules/shared/lib/strlib.js
+ - /modules/shared/lib/usrlib.js
+ - /modules/shared/lib/weblib.js
+ - /modules/shared/lib/component.js
+ - /modules/c1pjs/lib/defines.js
+ - /modules/c1pjs/lib/panel.js
+ - /modules/c1pjs/lib/cpu.js
+ - /modules/c1pjs/lib/rom.js
+ - /modules/c1pjs/lib/ram.js
+ - /modules/c1pjs/lib/keyboard.js
+ - /modules/c1pjs/lib/video.js
+ - /modules/c1pjs/lib/serial.js
+ - /modules/c1pjs/lib/disk.js
+ - /modules/c1pjs/lib/debugger.js
+ - /modules/c1pjs/lib/computer.js
+ - /modules/shared/lib/embed.js
+ pcx86_scripts:
+ - /modules/shared/lib/defines.js
+ - /modules/shared/lib/nodebug.js
+ - /modules/shared/lib/diskapi.js
+ - /modules/shared/lib/dumpapi.js
+ - /modules/shared/lib/reportapi.js
+ - /modules/shared/lib/userapi.js
+ - /modules/shared/lib/keys.js
+ - /modules/shared/lib/strlib.js
+ - /modules/shared/lib/usrlib.js
+ - /modules/shared/lib/weblib.js
+ - /modules/shared/lib/component.js
+ - /modules/pcx86/lib/defines.js
+ - /modules/pcx86/lib/x86.js
+ - /modules/pcx86/lib/interrupts.js
+ - /modules/pcx86/lib/messages.js
+ - /modules/pcx86/lib/panel.js
+ - /modules/pcx86/lib/bus.js
+ - /modules/pcx86/lib/memory.js
+ - /modules/pcx86/lib/cpu.js
+ - /modules/pcx86/lib/x86seg.js
+ - /modules/pcx86/lib/x86cpu.js
+ - /modules/pcx86/lib/x86fpu.js
+ - /modules/pcx86/lib/x86func.js
+ - /modules/pcx86/lib/x86help.js
+ - /modules/pcx86/lib/x86mods.js
+ - /modules/pcx86/lib/x86ops.js
+ - /modules/pcx86/lib/x86op0f.js
+ - /modules/pcx86/lib/chipset.js
+ - /modules/pcx86/lib/rom.js
+ - /modules/pcx86/lib/ram.js
+ - /modules/pcx86/lib/keyboard.js
+ - /modules/pcx86/lib/video.js
+ - /modules/pcx86/lib/parallel.js
+ - /modules/pcx86/lib/serial.js
+ - /modules/pcx86/lib/mouse.js
+ - /modules/pcx86/lib/disk.js
+ - /modules/pcx86/lib/fdc.js
+ - /modules/pcx86/lib/hdc.js
+ - /modules/shared/lib/debugger.js
+ - /modules/pcx86/lib/debugger.js
+ - /modules/pcx86/lib/computer.js
+ - /modules/shared/lib/state.js
+ - /modules/shared/lib/embed.js
+ - /modules/shared/lib/save.js
+ pc8080_scripts:
+ - /modules/shared/lib/defines.js
+ - /modules/shared/lib/nodebug.js
+ - /modules/shared/lib/dumpapi.js
+ - /modules/shared/lib/reportapi.js
+ - /modules/shared/lib/userapi.js
+ - /modules/shared/lib/keys.js
+ - /modules/shared/lib/strlib.js
+ - /modules/shared/lib/usrlib.js
+ - /modules/shared/lib/weblib.js
+ - /modules/shared/lib/component.js
+ - /modules/pc8080/lib/defines.js
+ - /modules/pc8080/lib/cpudef.js
+ - /modules/pc8080/lib/messages.js
+ - /modules/pc8080/lib/panel.js
+ - /modules/pc8080/lib/bus.js
+ - /modules/pc8080/lib/memory.js
+ - /modules/pc8080/lib/cpu.js
+ - /modules/pc8080/lib/cpustate.js
+ - /modules/pc8080/lib/cpuops.js
+ - /modules/pc8080/lib/chipset.js
+ - /modules/pc8080/lib/rom.js
+ - /modules/pc8080/lib/ram.js
+ - /modules/pc8080/lib/keyboard.js
+ - /modules/pc8080/lib/video.js
+ - /modules/pc8080/lib/serial.js
+ - /modules/shared/lib/debugger.js
+ - /modules/pc8080/lib/debugger.js
+ - /modules/pc8080/lib/computer.js
+ - /modules/shared/lib/state.js
+ - /modules/shared/lib/embed.js
+ pdp10_scripts:
+ - /modules/shared/lib/defines.js
+ - /modules/shared/lib/nodebug.js
+ - /modules/shared/lib/dumpapi.js
+ - /modules/shared/lib/reportapi.js
+ - /modules/shared/lib/userapi.js
+ - /modules/shared/lib/keys.js
+ - /modules/shared/lib/strlib.js
+ - /modules/shared/lib/usrlib.js
+ - /modules/shared/lib/weblib.js
+ - /modules/shared/lib/component.js
+ - /modules/pdp10/lib/defines.js
+ - /modules/pdp10/lib/messages.js
+ - /modules/pdp10/lib/panel.js
+ - /modules/pdp10/lib/bus.js
+ - /modules/pdp10/lib/device.js
+ - /modules/pdp10/lib/memory.js
+ - /modules/pdp10/lib/cpu.js
+ - /modules/pdp10/lib/cpustate.js
+ - /modules/pdp10/lib/cpuops.js
+ - /modules/pdp10/lib/rom.js
+ - /modules/pdp10/lib/ram.js
+ - /modules/pdp10/lib/serial.js
+ - /modules/shared/lib/debugger.js
+ - /modules/pdp10/lib/debugger.js
+ - /modules/pdp10/lib/macro10.js
+ - /modules/pdp10/lib/computer.js
+ - /modules/shared/lib/state.js
+ - /modules/shared/lib/embed.js
+ pdp11_scripts:
+ - /modules/shared/lib/defines.js
+ - /modules/shared/lib/nodebug.js
+ - /modules/shared/lib/dumpapi.js
+ - /modules/shared/lib/reportapi.js
+ - /modules/shared/lib/userapi.js
+ - /modules/shared/lib/keys.js
+ - /modules/shared/lib/strlib.js
+ - /modules/shared/lib/usrlib.js
+ - /modules/shared/lib/weblib.js
+ - /modules/shared/lib/component.js
+ - /modules/pdp11/lib/defines.js
+ - /modules/pdp11/lib/messages.js
+ - /modules/pdp11/lib/panel.js
+ - /modules/pdp11/lib/bus.js
+ - /modules/pdp11/lib/device.js
+ - /modules/pdp11/lib/memory.js
+ - /modules/pdp11/lib/cpu.js
+ - /modules/pdp11/lib/cpustate.js
+ - /modules/pdp11/lib/cpuops.js
+ - /modules/pdp11/lib/rom.js
+ - /modules/pdp11/lib/ram.js
+ - /modules/pdp11/lib/keyboard.js
+ - /modules/pdp11/lib/serial.js
+ - /modules/pdp11/lib/pc11.js
+ - /modules/pdp11/lib/disk.js
+ - /modules/pdp11/lib/drive.js
+ - /modules/pdp11/lib/rk11.js
+ - /modules/pdp11/lib/rl11.js
+ - /modules/pdp11/lib/rx11.js
+ - /modules/shared/lib/debugger.js
+ - /modules/pdp11/lib/debugger.js
+ - /modules/pdp11/lib/computer.js
+ - /modules/shared/lib/state.js
+ - /modules/shared/lib/embed.js
diff --git a/_developer.yml b/_developer.yml
new file mode 100644
index 000000000..84aaffeac
--- /dev/null
+++ b/_developer.yml
@@ -0,0 +1,12 @@
+developer: true
+baseurl: ""
+url: "http://localhost:4000"
+#
+# In the following pcjs section, setting "compiled: false" works only for pages with a single machine,
+# because the uncompiled scripts use shared classes that can only be instantiated once on a page (unless
+# they're compiled and/or wrapped inside a function).
+#
+pcjs:
+ compiled: true
+ debug: false
+ private: true
diff --git a/_includes/breadcrumbs.html b/_includes/breadcrumbs.html
new file mode 100644
index 000000000..522446d67
--- /dev/null
+++ b/_includes/breadcrumbs.html
@@ -0,0 +1,11 @@
+{% capture page_url_without_index_html %}{{ page.url | remove: "/index.html" | remove: "/404.html" }}{% endcapture %}
+{% assign splitted_url_parts = page_url_without_index_html | split: '/' %}
+{% capture forLoopMaxInt %}{{ splitted_url_parts.size | minus:1 }}{% endcapture %}
+{% for i in (1..forLoopMaxInt) %}
+ {% capture url %}{{ url }}{{ splitted_url_parts[i] }}/{% endcapture %}
+ {% capture path %}{{ path }}\{{ splitted_url_parts[i] | upcase }}{% endcapture %}
+ {% if splitted_url_parts[i] == "blog" %}
+ {% break %}
+ {% endif %}
+{% endfor %}
+
Directory of C:\PCJS.ORG{{ path }}
diff --git a/_includes/footer.html b/_includes/footer.html
new file mode 100644
index 000000000..950e658fd
--- /dev/null
+++ b/_includes/footer.html
@@ -0,0 +1,61 @@
+
diff --git a/_includes/google-analytics.html b/_includes/google-analytics.html
new file mode 100644
index 000000000..3b20ec554
--- /dev/null
+++ b/_includes/google-analytics.html
@@ -0,0 +1,10 @@
+{% unless site.developer %}
+
+{% endunless %}
diff --git a/_includes/head.html b/_includes/head.html
new file mode 100644
index 000000000..26866f5f5
--- /dev/null
+++ b/_includes/head.html
@@ -0,0 +1,23 @@
+
+
+
+
+ {% if page.title %}PCjs: {{ page.title }}{% else %}{{ site.title }}{% endif %}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {% include machine-styles.html %}
+
diff --git a/_includes/header.html b/_includes/header.html
new file mode 100644
index 000000000..78e86eeec
--- /dev/null
+++ b/_includes/header.html
@@ -0,0 +1,32 @@
+
diff --git a/_includes/image.html b/_includes/image.html
new file mode 100644
index 000000000..b32bab7f4
--- /dev/null
+++ b/_includes/image.html
@@ -0,0 +1 @@
+[
]({{ include.link }} "{{ include.alt }}")
diff --git a/_includes/machine-build.html b/_includes/machine-build.html
new file mode 100644
index 000000000..15a1e8bf6
--- /dev/null
+++ b/_includes/machine-build.html
@@ -0,0 +1 @@
+
diff --git a/_includes/machine-command.html b/_includes/machine-command.html
new file mode 100644
index 000000000..d82ce4892
--- /dev/null
+++ b/_includes/machine-command.html
@@ -0,0 +1,22 @@
+{% comment %}
+
+As discussed in /_posts/2017-01-03-pdp-11-tutorials.md, when a page (usually part of a tutorial)
+wants to create a control that tests some feature of a machine, the page will define a machine command
+using a Liquid-style include that looks like this:
+
+ {% include machine-command.html type='button' label='Try It!' machine='vt100' component='Keyboard' command='sendString' value='Hello World' %}
+
+and which should generate something like this:
+
+
+
+Alternatively, if the command parameter is the name of a machine script in the page's Front Matter, then this:
+
+ {% include machine-command.html type='button' label='Try It!' machine='vt100' component='Keyboard' command='scriptName' %}
+
+should generate something like this:
+
+
+
+{% endcomment %}
+{% if page.machineScripts[include.command] != nil %}{% assign machine_command = "script" %}{% capture command_value %}{{ page.machineScripts[include.command] | replace:'"','"' | strip }}{% endcapture %}{% else %}{% capture machine_command %}{{ include.command }}{% endcapture %}{% capture command_value %}{{ include.value | replace:'"','"' }}{% endcapture %}{% endif %}{% if include.type == "clickOnce" %}{% assign control_type = "button" %}{% assign control_single = "true" %}{% elsif include.type == "button" %}{% assign control_type = "button" %}{% assign control_single = "false" %}{% else %}{% assign control_type = "unknown" %}{% assign control_single = "false" %}{% endif %}{% if control_type == "button" %}{% else %}{% endif %}
diff --git a/_includes/machine-engines.html b/_includes/machine-engines.html
new file mode 100644
index 000000000..d7481a156
--- /dev/null
+++ b/_includes/machine-engines.html
@@ -0,0 +1,178 @@
+{% comment %}
+
+As discussed in /modules/markout/lib/markout.js, our Node web server recognizes the following machine properties
+in the Front Matter of our Markdown documents, for compatibility with the Jekyll web server:
+
+ 'id' (eg: ibm5150)
+ 'name' (eg: "IBM PC (Model 5150) with Monochrome Display")
+ 'type' (eg: c1p, pcx86, pc8080, pdp10, pdp11)
+ 'debugger' (default: false)
+ 'config' (default: machine.xml)
+ 'template' (default: machine.xsl)
+ 'debug' (default: false; true enables asserts and is much slower)
+ 'uncompiled' (default: false; true is useful for debugging but slower)
+ 'parms' (stringified object that collects additional machine properties listed below)
+
+Note that if you want BACKTRACK support enabled in a machine, both 'debugger' and 'uncompiled' must be true.
+Also note that while multiple machines ARE supported on a single page, there are some limitations; for example,
+loading two or more machines of the same 'type' but with different 'debug', 'uncompiled', or 'debugger' settings
+may not work as desired.
+
+The following optional machine properties will be added to the 'parms' property:
+
+ 'autoMount' (eg: {"A":{"name":"OS/2 FOOTBALL (v7.68.17)","path":"/disks/pc/os2/misc/football/FOOTBALL-76817.json"}})
+ 'autoPower' (eg: true)
+ 'autoScript' (eg, type Keyboard "$date\r$time\r")
+ 'autoStart' (eg: true)
+ 'autoType' (eg: $date\r$time\r)
+ 'drives' (eg: '[{name:"68Mb Hard Disk",type:4,path:"http://archive.pcjs.org/disks/pc/fixed/68mb/win95.json"}]')
+ 'resume' (eg: 1)
+ 'state' (eg: state.json)
+ 'commands' (debugger commands, if any)
+ 'messages' (eg: fault)
+ 'connection' (eg: serialPort->vt100a.serialPort)
+
+{% endcomment %}
+{% for machine in page.machines %}
+ {% capture machine_type %}{{ machine.type | remove:"-dbg" }}{% endcapture %}
+ {% if machine_type == "c1p" %}
+ {% assign machine_app = "c1pjs" %}
+ {% elsif machine_type == "pdp10" or machine_type == "pdp11" %}
+ {% assign machine_app = "pdpjs" %}
+ {% else %}
+ {% capture machine_app %}{{ machine_type }}{% endcapture %}
+ {% endif %}
+ {% unless machine.config %}
+ {% assign machine_config = "machine.xml" %}
+ {% else %}
+ {% assign machine_config = machine.config %}
+ {% endunless %}
+ {% if machine.debugger or machine_config contains "debugger" %}
+ {% capture machine_file %}{{ machine_type }}-dbg{% endcapture %}
+ {% assign machine_debugger = true %}
+ {% else %}
+ {% capture machine_file %}{{ machine.type }}{% endcapture %}
+ {% if machine.type != machine_type %}
+ {% assign machine_debugger = true %}
+ {% else %}
+ {% assign machine_debugger = false %}
+ {% endif %}
+ {% endif %}
+ {% capture machine_embed %}embed{{ machine_type | upcase | replace:"X86","x86" }}{% endcapture %}
+ {% if machine.autoMount == "" %}
+ {% assign machine_autoMount = "{}" %}
+ {% else %}
+ {% capture machine_autoMount %}{{ machine.autoMount|jsonify }}{% endcapture %}
+ {% endif %}
+ {% if machine.autoPower != nil %}
+ {% capture machine_autoPower %},autoPower:{{ machine.autoPower }}{% endcapture %}
+ {% else %}
+ {% assign machine_autoPower = "" %}
+ {% endif %}
+ {% if machine.autoScript != nil %}
+ {% capture machine_autoScript %},autoScript:"{{ page.machineScripts[machine.autoScript] | strip_newlines | replace:'"':"\\\\"" | replace:"\r":"\\\\r" | replace:"\n":"\\\\n" | replace:"\t":"\\\\t" | replace:"\x":"\\\\x" }}"{% endcapture %}
+ {% else %}
+ {% assign machine_autoScript = "" %}
+ {% endif %}
+ {% if machine.autoStart != nil %}
+ {% capture machine_autoStart %},autoStart:{{ machine.autoStart }}{% endcapture %}
+ {% else %}
+ {% assign machine_autoStart = "" %}
+ {% endif %}
+ {% if machine.autoType != nil %}
+ {% capture machine_autoType %},autoType:"{{ machine.autoType | replace:"\r":"\\\\r" | replace:"\n":"\\\\n" | replace:"\t":"\\\\t" | replace:"\x":"\\\\x" }}"{% endcapture %}
+ {% else %}
+ {% assign machine_autoType = "" %}
+ {% endif %}
+ {% if machine.drives != nil %}
+ {% if machine.drives == "" %}
+ {% assign machine_drives = ",drives:[]" %}
+ {% else %}
+ {% capture machine_drives %},drives:{{ machine.drives }}{% endcapture %}
+ {% endif %}
+ {% else %}
+ {% assign machine_drives = "" %}
+ {% endif %}
+ {% unless machine.template %}
+ {% assign machine_template = "" %}
+ {% else %}
+ {% assign machine_template = machine.template %}
+ {% endunless %}
+ {% capture machine_parms %}{{ site.left_brace }}autoMount:{{ machine_autoMount }}{{ machine_autoPower }}{{ machine_autoScript }}{{ machine_autoStart }}{{ machine_autoType }}{{ machine_drives }},resume:"{{ machine.resume }}",state:"{{ machine.state }}",commands:"{{ machine.commands }}",messages:"{{ machine.messages }}",connection:"{{ machine.connection }}"{{ site.right_brace }}{% endcapture %}
+ {% if site.pcjs.compiled == true and machine.uncompiled != true %}
+ {% capture page_script %}
+ {% endcapture %}
+ {% unless page_scripts contains page_script %}
+ {{ page_script }}
+ {% endunless %}
+ {% capture page_scripts %}{{ page_scripts }}{{ page_script }}{% endcapture %}
+ {% if machine_template == "" %}
+ {% capture machine_template %}{{ site.baseurl }}/versions/{{ machine_app }}/{{ site.pcjs.version }}/components.xsl{% endcapture %}
+ {% endif %}
+ {% else %}
+ {% capture machine_file_uncompiled %}{{ machine_file | remove:"-dbg" | append:"-uncompiled" }}{% endcapture %}
+ {% capture page_script %}
+ {% endcapture %}
+ {% unless page_scripts contains page_script %}
+ {{ page_script }}
+ {% endunless %}
+ {% capture page_scripts %}{{ page_scripts }}{{ page_script }}{% endcapture %}
+ {% if machine_template == "" %}
+ {% capture machine_template %}{{ site.baseurl }}/versions/{{ machine_app }}/{{ site.pcjs.version }}/components.xsl{% endcapture %}
+ {% endif %}
+ {% comment %}
+
+ The following approach worked well before we converted most of the code to ES6 classes. Unfortunately, ES6 classes
+ don't coexist well with the conditional Node require() statements inside the individual scripts. Since we were already
+ stripping all the Node-related code from the scripts to build monolithic scripts that we could feed into the Closure
+ Compiler, we have simply moved those monolithic scripts from the /tmp folder to the /versions folder, with "-uncompiled"
+ suffixes. And since they are now checked in alongside the compiled files, there's the added benefit that we can always
+ reference them from source maps.
+
+ So, the following template code is no longer of any use, but we'll leave it here for historical reference. Note that
+ our Node web server still serves up individual scripts, because it has the ability to strip all Node references from the
+ scripts before delivering them to the web browser. But that's not really feasible in the Jekyll environment.
+
+ {% if machine_type == "c1p" %}{% assign array_scripts = site.pcjs.c1p_scripts %}{% endif %}
+ {% if machine_type == "pcx86" %}{% assign array_scripts = site.pcjs.pcx86_scripts %}{% endif %}
+ {% if machine_type == "pc8080" %}{% assign array_scripts = site.pcjs.pc8080_scripts %}{% endif %}
+ {% if machine_type == "pdp10" %}{% assign array_scripts = site.pcjs.pdp10_scripts %}{% endif %}
+ {% if machine_type == "pdp11" %}{% assign array_scripts = site.pcjs.pdp11_scripts %}{% endif %}
+ {% for script in array_scripts %}
+ {% if script != "/modules/shared/lib/nodebug.js" or machine.debug != true and site.pcjs.debug != true %}
+ {% capture page_script %}{% endcapture %}
+ {% unless page_scripts contains page_script %}
+ {{ page_script }}
+ {% if script contains "shared/lib/defines.js" %}
+ {% if site.pcjs.private %}
+ {{ page_script | replace:"defines.js","private.js" }}
+ {% endif %}
+ {% endif %}
+ {% if script contains "js/lib/defines.js" %}
+ {% if machine_debugger != true %}
+ {{ page_script | replace:"defines.js","nodebugger.js" }}
+ {% endif %}
+ {% endif %}
+ {% endunless %}
+ {% capture page_scripts %}{{ page_scripts }}{{ page_script }}{% endcapture %}
+ {% endif %}
+ {% endfor %}
+ {% if machine_template == "" %}
+ {% if machine_app != "c1pjs" %}
+ {% capture machine_template %}{{ site.baseurl }}/modules/shared/templates/components.xsl{% endcapture %}
+ {% else %}
+ {% capture machine_template %}{{ site.baseurl }}/modules/{{ machine_app }}/templates/components.xsl{% endcapture %}
+ {% endif %}
+ {% endif %}
+ {% endcomment %}
+ {% endif %}
+
+ {% if machine.sticky == "top" %}
+
+
+ {% endif %}
+ {% if page.build %}
+
+
+ {% endif %}
+{% endfor %}
diff --git a/_includes/machine-styles.html b/_includes/machine-styles.html
new file mode 100644
index 000000000..9eea4b733
--- /dev/null
+++ b/_includes/machine-styles.html
@@ -0,0 +1,23 @@
+{% for machine in page.machines %}
+ {% capture machine_type %}{{ machine.type | remove:"-dbg" }}{% endcapture %}
+ {% if machine_type == "c1p" %}
+ {% assign machine_app = "c1pjs" %}
+ {% elsif machine_type == "pdp10" or machine_type == "pdp11" %}
+ {% assign machine_app = "pdpjs" %}
+ {% else %}
+ {% capture machine_app %}{{ machine_type }}{% endcapture %}
+ {% endif %}
+ {% unless site.pcjs.compiled == true and machine.uncompiled != true %}
+ {% if machine_type == "c1p" %}
+ {% capture machine_style %}{{ site.baseurl }}/modules/c1pjs/templates/components.css{% endcapture %}
+ {% else %}
+ {% capture machine_style %}{{ site.baseurl }}/modules/shared/templates/components.css{% endcapture %}
+ {% endif %}
+ {% else %}
+ {% capture machine_style %}{{ site.baseurl }}/versions/{{ machine_app }}/{{ site.pcjs.version }}/components.css{% endcapture %}
+ {% endunless %}
+ {% unless machine_styles contains machine_style %}
+
+ {% endunless %}
+ {% capture machine_styles %}{{ machine_styles }}{{ machine_style }}{% endcapture %}
+{% endfor %}
diff --git a/_includes/machine.html b/_includes/machine.html
new file mode 100644
index 000000000..f60db81ef
--- /dev/null
+++ b/_includes/machine.html
@@ -0,0 +1,17 @@
+
+ {% assign machine_name = "PCjs Machine" %}
+ {% for machine in page.machines %}
+ {% if include.id == machine.id %}
+ {% if machine.name %}
+ {% assign machine_name = machine.name %}
+ {% break %}
+ {% endif %}
+ {% if machine.type %}
+ {% capture machine_name %}{{ machine.type | upcase | replace:"X86","x86" }} Machine{% endcapture %}
+ {% break %}
+ {% endif %}
+ {% endif %}
+ {% endfor %}
+ [{{ machine_name }}]
+
+
diff --git a/_includes/page-scripts.html b/_includes/page-scripts.html
new file mode 100644
index 000000000..e6d675b08
--- /dev/null
+++ b/_includes/page-scripts.html
@@ -0,0 +1,8 @@
+{% comment %}
+
+Used by pages like the one in /api/v1/dump/ to simulate a client-side API.
+
+{% endcomment %}
+{% for script in page.scripts %}
+
+{% endfor %}
diff --git a/_includes/random-publication.html b/_includes/random-publication.html
new file mode 100644
index 000000000..87f225591
--- /dev/null
+++ b/_includes/random-publication.html
@@ -0,0 +1,42 @@
+{% assign random_id = "random" %}
+
+
diff --git a/_includes/screenshot.html b/_includes/screenshot.html
new file mode 100644
index 000000000..fa7ef75f2
--- /dev/null
+++ b/_includes/screenshot.html
@@ -0,0 +1,16 @@
+{% assign include_width = "" %}
+{% assign include_height = "" %}
+{% if include.width %}
+ {% capture include_width %} width="{{ include.width }}"{% endcapture %}
+{% endif %}
+{% if include.height %}
+ {% capture include_height %} height="{{ include.height }}"{% endcapture %}
+{% endif %}
+
+
+
{{ include.title }}
+
diff --git a/_layouts/blog.html b/_layouts/blog.html
new file mode 100644
index 000000000..d43798d8f
--- /dev/null
+++ b/_layouts/blog.html
@@ -0,0 +1,26 @@
+---
+layout: default
+---
+
+
+
+ {{ content }}
+
+
Posts
+
+
+ {% for post in site.posts %}
+ -
+ {{ post.date | date: "%b %-d, %Y" }}
+
+
+ {{ post.excerpt | replace:'','...'}}
+
+ {% endfor %}
+
+
+
+
+
diff --git a/_layouts/default.html b/_layouts/default.html
new file mode 100644
index 000000000..ed5601775
--- /dev/null
+++ b/_layouts/default.html
@@ -0,0 +1,26 @@
+
+
+
+ {% include head.html %}
+
+
+
+ {% include header.html %}
+
+
+
+ {% include footer.html %}
+
+ {% include machine-engines.html %}
+
+ {% include page-scripts.html %}
+
+ {% include google-analytics.html %}
+
+
+
+
diff --git a/_layouts/page.html b/_layouts/page.html
new file mode 100644
index 000000000..f8de36d10
--- /dev/null
+++ b/_layouts/page.html
@@ -0,0 +1,16 @@
+---
+layout: default
+---
+
+
+ {% if page.display_title %}
+
+ {% endif %}
+
+
+ {{ content }}
+
+
+
diff --git a/_layouts/post.html b/_layouts/post.html
new file mode 100644
index 000000000..a2b4e52fe
--- /dev/null
+++ b/_layouts/post.html
@@ -0,0 +1,15 @@
+---
+layout: default
+---
+
+
+
+
+
+ {{ content }}
+
+
+
diff --git a/_layouts/viewer.html b/_layouts/viewer.html
new file mode 100644
index 000000000..21432f723
--- /dev/null
+++ b/_layouts/viewer.html
@@ -0,0 +1,78 @@
+
+
+
+ {% include head.html %}
+
+
+
+ {% include header.html %}
+
+
+
+ {% include footer.html %}
+
+
+
+ {% include google-analytics.html %}
+
+
+
+
diff --git a/_posts/2017-01-03-pdp-11-tutorials.md b/_posts/2017-01-03-pdp-11-tutorials.md
index 8a046455f..a1285c354 100644
--- a/_posts/2017-01-03-pdp-11-tutorials.md
+++ b/_posts/2017-01-03-pdp-11-tutorials.md
@@ -47,7 +47,7 @@ want to send some serial data to a machine:
{% include machine-command.html type='button' label='Try It!' machine='test1170' component='SerialPort' command='receiveData' value='HELP\r' %}
{% endraw %}
-which should translate into a control that looks like:
+which should translate into a control that looks like this:
diff --git a/_sass/_base.scss b/_sass/_base.scss
new file mode 100644
index 000000000..0c7d77268
--- /dev/null
+++ b/_sass/_base.scss
@@ -0,0 +1,185 @@
+/**
+ * Reset some basic elements
+ */
+body, h1, h2, h3, h4, h5, h6,
+p, blockquote, pre,
+dl, dd, ol, ul, figure {
+ margin: 0;
+ padding: 0;
+}
+
+/**
+ * Basic styling
+ */
+body {
+ font-family: $base-font-family;
+ font-size: $base-font-size;
+ line-height: $base-line-height;
+ font-weight: 300;
+ color: $text-color;
+ background-color: $background-color;
+ -webkit-text-size-adjust: 100%;
+}
+
+/**
+ * Set `margin-bottom` to maintain vertical rhythm
+ */
+h1, h2, h3, h4, h5, h6,
+p, blockquote, pre,
+ul, ol, dl, figure,
+%vertical-rhythm {
+ margin-bottom: $spacing-unit / 2;
+}
+
+/**
+ * Images
+ */
+img {
+ max-width: 100%;
+ vertical-align: middle;
+}
+
+/**
+ * Figures
+ */
+figure > img {
+ display: block;
+}
+
+figcaption {
+ font-size: $small-font-size;
+}
+
+/**
+ * Lists
+ */
+ul, ol {
+ margin-left: $spacing-unit;
+}
+
+li {
+ > ul,
+ > ol {
+ margin-bottom: 0;
+ }
+}
+
+/**
+ * Headings
+ */
+h1, h2, h3, h4, h5, h6 {
+ font-weight: 300;
+}
+
+/**
+ * Links
+ */
+a {
+ color: $brand-color;
+ text-decoration: none;
+
+ &:visited {
+ color: darken($brand-color, 15%);
+ }
+
+ &:hover {
+ color: $text-color;
+ text-decoration: underline;
+ }
+}
+
+/**
+ * Blockquotes
+ */
+blockquote {
+ color: $grey-color;
+ border-left: 4px solid $grey-color-light;
+ padding-left: $spacing-unit / 2;
+ padding-right: $spacing-unit / 2;
+ padding-bottom: $spacing-unit / 2;
+ margin-bottom: 0;
+ text-align: justify;
+ /* font-size: 18px; */
+ /* letter-spacing: -1px; */
+ /* font-style: italic; */
+
+ > :last-child {
+ margin-bottom: 0;
+ }
+}
+
+/**
+ * Code formatting
+ */
+pre,
+code {
+ font-size: 15px;
+ border: 1px solid $grey-color-light;
+ border-radius: 3px;
+ background-color: #eef;
+}
+
+code {
+ padding: 1px 5px;
+}
+
+pre {
+ padding: 8px 12px;
+ overflow-x: scroll;
+ white-space: pre-wrap;
+
+ > code {
+ border: 0;
+ padding-right: 0;
+ padding-left: 0;
+ }
+}
+
+/**
+ * Wrapper
+ */
+.wrapper {
+ /* max-width: -webkit-calc(800px - (#{$spacing-unit} * 2)); */
+ /* max-width: calc(800px - (#{$spacing-unit} * 2)); */
+ margin-right: auto;
+ margin-left: auto;
+ padding-right: $spacing-unit;
+ padding-left: $spacing-unit;
+ @extend %clearfix;
+
+ @include media-query($on-laptop) {
+ /* max-width: -webkit-calc(800px - (#{$spacing-unit})); */
+ /* max-width: calc(800px - (#{$spacing-unit})); */
+ padding-right: $spacing-unit / 2;
+ padding-left: $spacing-unit / 2;
+ }
+}
+
+/**
+ * Clearfix
+ */
+%clearfix {
+
+ &:after {
+ content: "";
+ display: table;
+ clear: both;
+ }
+}
+
+/**
+ * Icons
+ */
+.icon {
+
+ > svg {
+ display: inline-block;
+ width: 16px;
+ height: 16px;
+ vertical-align: middle;
+
+ path {
+ fill: $grey-color;
+ }
+ }
+}
diff --git a/_sass/_layout.scss b/_sass/_layout.scss
new file mode 100644
index 000000000..f56c462a5
--- /dev/null
+++ b/_sass/_layout.scss
@@ -0,0 +1,270 @@
+/**
+ * Site header
+ */
+.site-header {
+ border-top: 5px solid $grey-color-dark;
+ border-bottom: 1px solid $grey-color-light;
+ min-height: 56px;
+
+ // Positioning context for the mobile navigation icon
+ position: relative;
+}
+
+.site-title {
+ font-size: 26px;
+ line-height: 56px;
+ letter-spacing: -1px;
+ margin-bottom: 0;
+ float: left;
+
+ &,
+ &:visited {
+ color: $grey-color-dark;
+ }
+}
+
+.site-nav {
+ float: right;
+ line-height: 56px;
+
+ .menu-icon {
+ display: none;
+ }
+
+ .page-link {
+ color: $text-color;
+ line-height: $base-line-height;
+
+ // Gaps between nav items, but not on the first one
+ &:not(:first-child) {
+ margin-left: 20px;
+ }
+ }
+
+ @include media-query($on-palm) {
+ position: absolute;
+ top: 9px;
+ right: 30px;
+ background-color: $background-color;
+ border: 1px solid $grey-color-light;
+ border-radius: 5px;
+ text-align: right;
+
+ .menu-icon {
+ display: block;
+ float: right;
+ width: 36px;
+ height: 26px;
+ line-height: 0;
+ padding-top: 10px;
+ text-align: center;
+
+ > svg {
+ width: 18px;
+ height: 15px;
+
+ path {
+ fill: $grey-color-dark;
+ }
+ }
+ }
+
+ .trigger {
+ clear: both;
+ display: none;
+ }
+
+ &:hover .trigger {
+ display: block;
+ padding-bottom: 5px;
+ }
+
+ .page-link {
+ display: block;
+ padding: 5px 10px;
+ }
+ }
+}
+
+/**
+ * Site footer
+ */
+.site-footer {
+ border-top: 1px solid $grey-color-light;
+ padding: $spacing-unit 0;
+}
+
+.footer-heading {
+ font-size: 18px;
+ margin-bottom: $spacing-unit / 2;
+}
+
+.contact-list,
+.social-media-list {
+ list-style: none;
+ margin-left: 0;
+}
+
+.footer-col-wrapper {
+ font-size: 15px;
+ color: $grey-color;
+ margin-left: -$spacing-unit / 2;
+ @extend %clearfix;
+}
+
+.footer-col {
+ float: left;
+ margin-bottom: $spacing-unit / 2;
+ padding-left: $spacing-unit / 2;
+}
+
+.footer-col-1 {
+ width: -webkit-calc(40% - (#{$spacing-unit} / 2));
+ width: calc(40% - (#{$spacing-unit} / 2));
+}
+
+.footer-col-2 {
+ width: -webkit-calc(20% - (#{$spacing-unit} / 2));
+ width: calc(20% - (#{$spacing-unit} / 2));
+}
+
+.footer-col-3 {
+ width: -webkit-calc(100% - (#{$spacing-unit} / 2));
+ width: calc(100% - (#{$spacing-unit} / 2));
+}
+
+@include media-query($on-laptop) {
+ .footer-col-1,
+ .footer-col-2 {
+ width: -webkit-calc(50% - (#{$spacing-unit} / 2));
+ width: calc(50% - (#{$spacing-unit} / 2));
+ }
+
+ .footer-col-3 {
+ width: -webkit-calc(100% - (#{$spacing-unit} / 2));
+ width: calc(100% - (#{$spacing-unit} / 2));
+ }
+}
+
+@include media-query($on-palm) {
+ .footer-col {
+ float: none;
+ width: -webkit-calc(100% - (#{$spacing-unit} / 2));
+ width: calc(100% - (#{$spacing-unit} / 2));
+ }
+}
+
+/**
+ * Page content
+ */
+.page-content {
+ padding: $spacing-unit 0;
+}
+
+.page-heading {
+ font-size: 20px;
+}
+
+.post-list {
+ margin-left: 0;
+ list-style: none;
+
+ > li {
+ margin-bottom: $spacing-unit;
+ }
+}
+
+.post-meta {
+ font-size: $small-font-size;
+ color: $grey-color;
+}
+
+.post-link {
+ display: block;
+ font-size: 24px;
+}
+
+/**
+ * Posts
+ */
+.post-header {
+ margin-bottom: $spacing-unit;
+}
+
+.post-title {
+ font-size: 42px;
+ letter-spacing: -1px;
+ line-height: 1;
+
+ @include media-query($on-laptop) {
+ font-size: 36px;
+ }
+}
+
+.post-content {
+ margin-bottom: $spacing-unit;
+
+ h2 {
+ font-size: 32px;
+
+ @include media-query($on-laptop) {
+ font-size: 28px;
+ }
+ }
+
+ h3 {
+ font-size: 26px;
+
+ @include media-query($on-laptop) {
+ font-size: 22px;
+ }
+ }
+
+ h4 {
+ font-size: 20px;
+
+ @include media-query($on-laptop) {
+ font-size: 18px;
+ }
+ }
+}
+
+/**
+ * PCjs-specific styles
+ */
+.machine {
+ margin-bottom: 16px;
+}
+.machine-floating {
+ position: relative;
+ z-index: auto;
+ background-color: transparent;
+ padding-right: 0;
+}
+.machine-sticky {
+ position: fixed !important;
+ z-index: 1 !important;
+ background-color: #ffffff !important;
+ padding-right: $spacing-unit !important;
+ top: 0 !important;
+ @include media-query($on-laptop) {
+ padding-right: $spacing-unit / 2 !important;
+ }
+}
+.screenshot-frame {
+ display: inline-block;
+ margin: 8px;
+ text-align: center;
+}
+.screenshot-image {
+ padding: 5px;
+ border: 1px solid black;
+ border-radius: 5px;
+ background-color: #FAEBD7;
+}
+.screenshot-label {
+ font-size: x-small;
+}
+.pcjs-description, .pcjs-status {
+ line-height: 2.8em !important;
+}
diff --git a/_sass/_syntax-highlighting.scss b/_sass/_syntax-highlighting.scss
new file mode 100644
index 000000000..fb889cc66
--- /dev/null
+++ b/_sass/_syntax-highlighting.scss
@@ -0,0 +1,68 @@
+/**
+ * Syntax highlighting styles
+ */
+.highlight {
+// background: #fff;
+ @extend %vertical-rhythm;
+
+ .c { color: #998; font-style: italic } // Comment
+ .err { color: #a61717; background-color: #e3d2d2 } // Error
+ .k { font-weight: bold } // Keyword
+ .o { font-weight: bold } // Operator
+ .cm { color: #998; font-style: italic } // Comment.Multiline
+ .cp { color: #999; font-weight: bold } // Comment.Preproc
+ .c1 { color: #998; font-style: italic } // Comment.Single
+ .cs { color: #999; font-weight: bold; font-style: italic } // Comment.Special
+ .gd { color: #000; background-color: #fdd } // Generic.Deleted
+ .gd .x { color: #000; background-color: #faa } // Generic.Deleted.Specific
+ .ge { font-style: italic } // Generic.Emph
+ .gr { color: #a00 } // Generic.Error
+ .gh { color: #999 } // Generic.Heading
+ .gi { color: #000; background-color: #dfd } // Generic.Inserted
+ .gi .x { color: #000; background-color: #afa } // Generic.Inserted.Specific
+ .go { color: #888 } // Generic.Output
+ .gp { color: #555 } // Generic.Prompt
+ .gs { font-weight: bold } // Generic.Strong
+ .gu { color: #aaa } // Generic.Subheading
+ .gt { color: #a00 } // Generic.Traceback
+ .kc { font-weight: bold } // Keyword.Constant
+ .kd { font-weight: bold } // Keyword.Declaration
+ .kp { font-weight: bold } // Keyword.Pseudo
+ .kr { font-weight: bold } // Keyword.Reserved
+ .kt { color: #458; font-weight: bold } // Keyword.Type
+ .m { color: #099 } // Literal.Number
+ .s { color: #d14 } // Literal.String
+ .na { color: #008080 } // Name.Attribute
+ .nb { color: #0086B3 } // Name.Builtin
+ .nc { color: #458; font-weight: bold } // Name.Class
+ .no { color: #008080 } // Name.Constant
+ .ni { color: #800080 } // Name.Entity
+ .ne { color: #900; font-weight: bold } // Name.Exception
+ .nf { color: #900; font-weight: bold } // Name.Function
+ .nn { color: #555 } // Name.Namespace
+ .nt { color: #000080 } // Name.Tag
+ .nv { color: #008080 } // Name.Variable
+ .ow { font-weight: bold } // Operator.Word
+ .w { color: #bbb } // Text.Whitespace
+ .mf { color: #099 } // Literal.Number.Float
+ .mh { color: #099 } // Literal.Number.Hex
+ .mi { color: #099 } // Literal.Number.Integer
+ .mo { color: #099 } // Literal.Number.Oct
+ .sb { color: #d14 } // Literal.String.Backtick
+ .sc { color: #d14 } // Literal.String.Char
+ .sd { color: #d14 } // Literal.String.Doc
+ .s2 { color: #d14 } // Literal.String.Double
+ .se { color: #d14 } // Literal.String.Escape
+ .sh { color: #d14 } // Literal.String.Heredoc
+ .si { color: #d14 } // Literal.String.Interpol
+ .sx { color: #d14 } // Literal.String.Other
+ .sr { color: #009926 } // Literal.String.Regex
+ .s1 { color: #d14 } // Literal.String.Single
+ .ss { color: #990073 } // Literal.String.Symbol
+ .bp { color: #999 } // Name.Builtin.Pseudo
+ .vc { color: #008080 } // Name.Variable.Class
+ .vg { color: #008080 } // Name.Variable.Global
+ .vi { color: #008080 } // Name.Variable.Instance
+ .il { color: #099 } // Literal.Number.Integer.Long
+ .lineno { color: #ccc; display:inline-block; padding: 0 5px; border-right:1px solid #ccc; }
+}
diff --git a/archive/.gitignore b/archive/.gitignore
new file mode 100644
index 000000000..7e0caf8f5
--- /dev/null
+++ b/archive/.gitignore
@@ -0,0 +1 @@
+!*.html
diff --git a/archive/index.html b/archive/index.html
new file mode 100644
index 000000000..2c96cabb6
--- /dev/null
+++ b/archive/index.html
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+ PCjs Machines
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Welcome to the PCjs Archive Server.
+ There is nothing here to browse. You should return to pcjs.org
+
+
+
+
+
+
+
diff --git a/css/main.scss b/css/main.scss
new file mode 100755
index 000000000..321f4ffd3
--- /dev/null
+++ b/css/main.scss
@@ -0,0 +1,47 @@
+---
+# Only the main Sass file needs front matter (the dashes are enough)
+---
+@charset "utf-8";
+
+// Our variables
+$base-font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
+$base-font-size: 16px;
+$small-font-size: $base-font-size * 0.875;
+$base-line-height: 1.5;
+
+$spacing-unit: 30px;
+
+$text-color: #111;
+$background-color: #fdfdfd;
+$brand-color: #2a7ae2;
+
+$grey-color: #828282;
+$grey-color-light: lighten($grey-color, 40%);
+$grey-color-dark: darken($grey-color, 25%);
+
+$on-palm: 600px;
+$on-laptop: 800px;
+
+
+
+// Using media queries with like this:
+// @include media-query($palm) {
+// .wrapper {
+// padding-right: $spacing-unit / 2;
+// padding-left: $spacing-unit / 2;
+// }
+// }
+@mixin media-query($device) {
+ @media screen and (max-width: $device) {
+ @content;
+ }
+}
+
+
+
+// Import partials from `sass_dir` (defaults to `_sass`)
+@import
+ "base",
+ "layout",
+ "syntax-highlighting"
+;
diff --git a/devices/pcx86/machine/5170/README.md b/devices/pcx86/machine/5170/README.md
index 218ecc3cf..bd271c1c8 100644
--- a/devices/pcx86/machine/5170/README.md
+++ b/devices/pcx86/machine/5170/README.md
@@ -59,7 +59,7 @@ Models 319 and 339 were introduced in April 1986:
- Enhanced 101-key keyboard
IBM PC AT 5170 Configuration Options
----
+------------------------------------
The IBM PC AT 5170 doesn't have DIP switches like previous models, but it still has a few switches and jumpers.
@@ -103,7 +103,7 @@ it cannot be changed by the user.
---
IBM PC AT 5170 (Models 68 and 99) Announcement
----
+----------------------------------------------
The following details come from a [copy](http://www.minuszerodegrees.net/misc/IBM%20PC%20AT%205170%20announcement%20letter.txt)
of IBM's PC AT Announcement Letter, dated August 14, 1984.
diff --git a/devices/pcx86/rom/README.md b/devices/pcx86/rom/README.md
index 3d9d9a6f9..42f655acc 100644
--- a/devices/pcx86/rom/README.md
+++ b/devices/pcx86/rom/README.md
@@ -5,7 +5,7 @@ permalink: /devices/pcx86/rom/
---
IBM PC ROMs
----
+-----------
ROMs are added to machines by including one *[ROM](/docs/pcx86/rom/)* component in the machine XML configuration file
for each ROM in the machine; eg:
diff --git a/devices/pcx86/video/cdp/README.md b/devices/pcx86/video/cdp/README.md
index db9bde6a5..d41ef0776 100644
--- a/devices/pcx86/video/cdp/README.md
+++ b/devices/pcx86/video/cdp/README.md
@@ -5,6 +5,6 @@ permalink: /devices/pcx86/video/cdp/
---
Columbia Data Products Video Adapters
----
+-------------------------------------
* [Columbia Data Products Color Graphics Adapter (CGA)](cga/)
diff --git a/feed.xml b/feed.xml
new file mode 100644
index 000000000..022378beb
--- /dev/null
+++ b/feed.xml
@@ -0,0 +1,30 @@
+---
+layout: null
+---
+
+
+
+ {{ site.title | xml_escape }}
+ {{ site.description | xml_escape }}
+ {{ site.url }}{{ site.baseurl }}/
+
+ {{ site.time | date_to_rfc822 }}
+ {{ site.time | date_to_rfc822 }}
+ Jekyll v{{ jekyll.version }}
+ {% for post in site.posts limit:10 %}
+ -
+ {{ post.title | xml_escape }}
+ {{ post.content | xml_escape }}
+ {{ post.date | date_to_rfc822 }}
+ {{ post.url | prepend: site.baseurl | prepend: site.url }}
+ {{ post.url | prepend: site.baseurl | prepend: site.url }}
+ {% for tag in post.tags %}
+ {{ tag | xml_escape }}
+ {% endfor %}
+ {% for cat in post.categories %}
+ {{ cat | xml_escape }}
+ {% endfor %}
+
+ {% endfor %}
+
+
diff --git a/index.md b/index.md
new file mode 100644
index 000000000..b044075e2
--- /dev/null
+++ b/index.md
@@ -0,0 +1,100 @@
+---
+layout: page
+permalink: /
+machines:
+ - id: ibm5150
+ type: pcx86
+ resume: 1
+ name: "IBM PC (Model 5150) with Monochrome Display"
+ config: /devices/pcx86/machine/5150/mda/64kb/machine.xml
+ - id: demoC1P
+ type: c1p
+ config: /devices/c1p/machine/8kb/large/machine.xml
+---
+
+Welcome to PCjs, home of [PCx86](/docs/pcx86/), the original IBM PC simulation that runs in your web browser. It is
+one of several JavaScript Machines in the [PCjs Project](https://github.com/jeffpar/pcjs), an open-source project that
+includes:
+
+* [PCx86](/docs/pcx86/), an x86-based emulator of the [IBM PC and PC-compatibles](/devices/pcx86/machine/)
+* [PC8080](/modules/pc8080/), an 8080 machine emulator (see [Space Invaders](/devices/pc8080/machine/invaders/) and the [VT100 Terminal](/devices/pc8080/machine/vt100/))
+* [C1Pjs](/docs/c1pjs/), an emulation of the 6502-based [Ohio Scientific Challenger 1P](/devices/c1p/)
+* [PDPjs](/docs/pdpjs/), a set of machine emulation modules supporting the DEC [PDP-10](/devices/pdp10/machine/) and [PDP-11](/devices/pdp11/machine/)
+
+All PCjs machine simulations are written entirely in [JavaScript](/modules/). No Flash, Java or other plugins are
+required. Supported browsers include modern versions of Chrome, Safari, Firefox, Internet Explorer (v9.0 and up), Edge,
+and assorted mobile browsers.
+
+{% include machine.html id="ibm5150" %}
+
+The [JavaScript Machine](/devices/pcx86/machine/5150/mda/64kb/) above uses [PCx86](/docs/pcx86/) configured with an Intel
+8088 running at 4.77Mhz, with 64Kb of RAM and an IBM Monochrome Display Adapter. For more control, there are also
+[Control Panel](/devices/pcx86/machine/5150/mda/64kb/debugger/) and [Soft Keyboard](/devices/pcx86/machine/5150/mda/64kb/softkbd/)
+configurations, featuring the built-in PCx86 Debugger. For even greater control, build your own PC. The
+[PCx86 Documentation](/docs/pcx86/) will help you get started.
+
+PCx86 has steadily evolved to support more classic x86-based machines, including the IBM PC XT, the 80286-based IBM PC AT,
+and the 80386-based COMPAQ DeskPro 386. PCx86 fully supports the original machine ROMs, video cards, etc, and all
+machines run at their original speeds.
+
+The goals of the [PCjs Project](/docs/about/) are to create fast, full-featured simulations of classic
+computer hardware, help people understand how these early machines worked, make it easy to experiment with different
+machine configurations, and provide a platform for running and analyzing old computer software.
+
+Demos
+-----
+Some pre-configured machines are shown below, ready to run BASIC, DOS, Windows, OS/2, and other assorted software.
+
+{% include screenshot.html src="/apps/pcx86/1981/visicalc/thumbnail.jpg" width="200" height="120" title="IBM PC running VisiCalc" link="/apps/pcx86/1981/visicalc/" %}
+{% include screenshot.html src="/apps/pcx86/1981/donkey/thumbnail.jpg" width="200" height="120" title="IBM PC running DONKEY.BAS" link="/apps/pcx86/1981/donkey/" %}
+{% include screenshot.html src="/disks/pcx86/windows/1.00/thumbnail.jpg" width="200" height="120" title="IBM PC XT w/EGA, Windows 1.0" link="/disks/pcx86/windows/1.00/" %}
+{% include screenshot.html src="/disks/pcx86/windows/1.01/cga/thumbnail.jpg" width="200" height="120" title="IBM PC XT w/CGA, Windows 1.01" link="/disks/pcx86/windows/1.01/cga/" %}
+{% include screenshot.html src="/disks/pcx86/windows/1.01/thumbnail.jpg" width="200" height="120" title="IBM PC XT w/EGA, Windows 1.01" link="/disks/pcx86/windows/1.01/" %}
+{% include screenshot.html src="/disks/pcx86/os2/ibm/1.0/thumbnail.jpg" width="200" height="120" title="IBM PC AT w/EGA, OS/2 1.0" link="/disks/pcx86/os2/ibm/1.0/" %}
+{% include screenshot.html src="/disks/pcx86/windows/2.0x/thumbnail.jpg" width="200" height="120" title="COMPAQ DeskPro 386, Windows/386 2.01" link="/disks/pcx86/windows/2.0x/" %}
+{% include screenshot.html src="/disks/pcx86/windows/3.00/thumbnail.jpg" width="200" height="120" title="IBM PC AT w/EGA, Windows 3.00" link="/disks/pcx86/windows/3.00/" %}
+{% include screenshot.html src="/disks/pcx86/windows/3.10/thumbnail.jpg" width="200" height="120" title="IBM PC AT w/VGA, Windows 3.10" link="/disks/pcx86/windows/3.10/" %}
+{% include screenshot.html src="/disks/pcx86/windows/win95/4.00.950/thumbnail.jpg" width="200" height="120" title="COMPAQ DeskPro 386, Windows 95" link="/disks/pcx86/windows/win95/4.00.950/" %}
+{% include screenshot.html src="/disks/pcx86/cpm/1.1b/thumbnail.jpg" width="200" height="120" title="IBM PC w/MDA, CP/M-86" link="/disks/pcx86/cpm/1.1b/" %}
+{% include screenshot.html src="/disks/pcx86/games/microsoft/adventure/thumbnail.jpg" width="200" height="120" title="Microsoft Adventure (1981)" link="/disks/pcx86/games/microsoft/adventure/" %}
+{% include screenshot.html src="/apps/pcx86/1982/esuite/thumbnail.jpg" width="200" height="120" title="Executive Suite (1982)" link="/apps/pcx86/1982/esuite/" %}
+{% include screenshot.html src="/disks/pcx86/games/infocom/zork1/thumbnail.jpg" width="200" height="120" title="Zork I (1982)" link="/disks/pcx86/games/infocom/zork1/" %}
+{% include screenshot.html src="/apps/pcx86/1983/adventmath/thumbnail.jpg" width="200" height="120" title="Adventures in Math (1983)" link="/apps/pcx86/1983/adventmath/" %}
+{% include screenshot.html src="/apps/pcx86/1985/rogue/thumbnail.jpg" width="200" height="120" title="Rogue (1985)" link="/apps/pcx86/1985/rogue/" %}
+
+There are many more [PCx86 Demos](/devices/pcx86/machine/#ready-to-run-app-demos), including an
+[IBM PC with Dual Displays](/devices/pcx86/machine/5150/dual/64kb/) demonstrating early multi-monitor support,
+and multiple IBM PC XT machines running side-by-side with [CGA Displays](/devices/pcx86/machine/5160/cga/256kb/array/)
+and [EGA Displays](/devices/pcx86/machine/5160/ega/640kb/array/).
+
+C1Pjs
+-----
+Below is the [OSI Challenger C1P](/docs/c1pjs/), another simulation in the PCjs Project.
+It simulates Ohio Scientific's 6502-based microcomputer, released in 1978. More details about this simulation
+and the original machine are available in the [C1Pjs Documentation](/docs/c1pjs/).
+
+{% include machine.html id="demoC1P" %}
+
+License
+-------
+The [PCjs Project](https://github.com/jeffpar/pcjs) is now an open-source project on [GitHub](http://github.com/).
+All published portions are free for redistribution and/or modification under the terms of the
+[GNU General Public License](/LICENSE) as published by the Free Software Foundation, either version 3 of the License,
+or (at your option) any later version.
+
+You are required to include the following copyright notice, with a link to [{{ site.pcjs.domain }}]({{ site.url }}/):
+
+> [PCjs]({{ site.url }}/) © 2012-2017 by [Jeff Parsons](mailto:Jeff@pcjs.org) ([@jeffpar](http://twitter.com/jeffpar))
+
+in every source code file of every copy or modified version of this work, and to display that notice on every web page
+or computer that runs any version of this software.
+
+See [LICENSE](/LICENSE) for details.
+
+More Information
+----------------
+Learn more about the [PCjs Project](/docs/about/) and [PCx86](/docs/about/pcx86/). To
+create your own PCx86 machines, see the [PCx86 Documentation](/docs/pcx86/) for details.
+
+If you have questions or run into any problems, feel free to [tweet](http://twitter.com/jeffpar) or
+[email](mailto:Jeff@pcjs.org).
diff --git a/pubs/c1p/README.md b/pubs/c1p/README.md
index c66a9b240..02a345405 100644
--- a/pubs/c1p/README.md
+++ b/pubs/c1p/README.md
@@ -8,4 +8,5 @@ Challenger 1P Publications
--------------------------
* [Data Sheets](datasheets/)
+* [Programming Guides/Samples](programming/)
* [Technical Reference Manuals](techref/)
diff --git a/robots.txt b/robots.txt
new file mode 100644
index 000000000..445d24b44
--- /dev/null
+++ b/robots.txt
@@ -0,0 +1,2 @@
+User-agent: *
+Disallow: /web/