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 }} + +
+ {{ 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

+ + + +

subscribe via RSS

+ +
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 %} + +
+
+ {{ content }} +
+
+ + {% 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 %} +
+

{{ page.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 +--- +
+ +
+

{{ page.title }}

+ +
+ +
+ {{ 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 %} + +
+
+ {{ content }} +
+
+ +
+
+ +
+
+ +
+
+
+
+ + {% 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/