Merge branch 'master' into gh-pages
This commit is contained in:
commit
b3790ad5f2
1635 changed files with 54568 additions and 23576 deletions
2
.gitignore
vendored
2
.gitignore
vendored
|
|
@ -20,5 +20,7 @@ c64/
|
|||
ecp/
|
||||
projects/
|
||||
private/
|
||||
restricted/
|
||||
src/
|
||||
tmp/
|
||||
unlisted/
|
||||
|
|
|
|||
86
Gruntfile.js
86
Gruntfile.js
|
|
@ -108,7 +108,7 @@ module.exports = function(grunt) {
|
|||
* "<%= pkg.name %>"
|
||||
*
|
||||
* which would be fine for most of my needs, but some of the information I need
|
||||
* from the package.json is not in string form (eg, pcJSFiles, which is an array of
|
||||
* from the package.json is not in string form (eg, pcX86Files, which is an array of
|
||||
* file names). So I create a "pkg" variable first, which allows me to do both.
|
||||
*/
|
||||
|
||||
|
|
@ -117,14 +117,14 @@ module.exports = function(grunt) {
|
|||
* @property {string} name
|
||||
* @property {string} version
|
||||
* @property {Array.<string>} c1pJSFiles
|
||||
* @property {Array.<string>} pcJSFiles
|
||||
* @property {Array.<string>} pcX86Files
|
||||
* @property {Array.<string>} pc8080Files
|
||||
* @property {Array.<string>} closureCompilerExterns
|
||||
*/
|
||||
var pkg = grunt.file.readJSON("package.json");
|
||||
|
||||
var tmpC1Pjs = "./tmp/c1pjs/" + pkg.version + "/c1p.js";
|
||||
var tmpPCjs = "./tmp/pcjs/" + pkg.version + "/pc.js";
|
||||
var tmpPCx86 = "./tmp/pcx86/" + pkg.version + "/pcx86.js";
|
||||
var tmpPC8080 = "./tmp/pc8080/" + pkg.version + "/pc8080.js";
|
||||
|
||||
grunt.initConfig({
|
||||
|
|
@ -153,18 +153,18 @@ module.exports = function(grunt) {
|
|||
src: pkg.c1pJSFiles,
|
||||
dest: "./versions/c1pjs/" + pkg.version + "/c1p-dbg.js"
|
||||
},
|
||||
"pc.js": {
|
||||
src: pkg.pcJSFiles,
|
||||
dest: "./versions/pcjs/" + pkg.version + "/pc.js",
|
||||
"pcx86.js": {
|
||||
src: pkg.pcX86Files,
|
||||
dest: "./versions/pcx86/" + pkg.version + "/pcx86.js",
|
||||
options: {
|
||||
process: function(src, filepath) {
|
||||
return (path.basename(filepath) == "debugger.js"? "" : src);
|
||||
}
|
||||
}
|
||||
},
|
||||
"pc-dbg.js": {
|
||||
src: pkg.pcJSFiles,
|
||||
dest: "./versions/pcjs/" + pkg.version + "/pc-dbg.js"
|
||||
"pcx86-dbg.js": {
|
||||
src: pkg.pcX86Files,
|
||||
dest: "./versions/pcx86/" + pkg.version + "/pcx86-dbg.js"
|
||||
},
|
||||
"pc8080.js": {
|
||||
src: pkg.pc8080Files,
|
||||
|
|
@ -190,9 +190,9 @@ module.exports = function(grunt) {
|
|||
}
|
||||
}
|
||||
},
|
||||
"tmp-pcjs": {
|
||||
src: pkg.pcJSFiles,
|
||||
dest: tmpPCjs,
|
||||
"tmp-pcx86": {
|
||||
src: pkg.pcX86Files,
|
||||
dest: tmpPCx86,
|
||||
options: {
|
||||
banner: '"use strict";\n\n',
|
||||
process: function(src, filepath) {
|
||||
|
|
@ -225,9 +225,9 @@ module.exports = function(grunt) {
|
|||
src: pkg.c1pJSFiles,
|
||||
dest: tmpC1Pjs
|
||||
},
|
||||
"pc.js": {
|
||||
src: pkg.pcJSFiles,
|
||||
dest: tmpPCjs
|
||||
"pcx86.js": {
|
||||
src: pkg.pcX86Files,
|
||||
dest: tmpPCx86
|
||||
},
|
||||
"pc8080.js": {
|
||||
src: pkg.pc8080Files,
|
||||
|
|
@ -290,7 +290,7 @@ module.exports = function(grunt) {
|
|||
*/
|
||||
TEMPcompilerOpts: {
|
||||
// create_source_map: "./tmp/c1pjs/" + pkg.version + "/c1p.map",
|
||||
define: ["\"APPNAME='C1Pjs'\"", "\"APPVERSION='" + pkg.version + "'\"", "DEBUGGER=false",
|
||||
define: ["\"APPVERSION='" + pkg.version + "'\"", "DEBUGGER=false",
|
||||
"\"SITEHOST='www.pcjs.org'\"", "COMPILED=true", "DEBUG=false"],
|
||||
// output_wrapper: "\"(function(){%output%})();//@ sourceMappingURL=/tmp/c1pjs/" + pkg.version + "/c1p.map\""
|
||||
output_wrapper: "\"(function(){%output%})();\""
|
||||
|
|
@ -302,7 +302,7 @@ module.exports = function(grunt) {
|
|||
"c1p-dbg.js": {
|
||||
TEMPcompilerOpts: {
|
||||
// create_source_map: "./tmp/c1pjs/" + pkg.version + "/c1p-dbg.map",
|
||||
define: ["\"APPNAME='C1Pjs'\"", "\"APPVERSION='" + pkg.version + "'\"",
|
||||
define: ["\"APPVERSION='" + pkg.version + "'\"",
|
||||
"\"SITEHOST='www.pcjs.org'\"", "COMPILED=true", "DEBUG=false"],
|
||||
// output_wrapper: "\"(function(){%output%})();//@ sourceMappingURL=/tmp/c1pjs/" + pkg.version + "/c1p-dbg.map\""
|
||||
output_wrapper: "\"(function(){%output%})();\""
|
||||
|
|
@ -311,37 +311,37 @@ module.exports = function(grunt) {
|
|||
src: tmpC1Pjs,
|
||||
dest: "./versions/c1pjs/" + pkg.version + "/c1p-dbg.js"
|
||||
},
|
||||
"pc.js": {
|
||||
"pcx86.js": {
|
||||
TEMPcompilerOpts: {
|
||||
// create_source_map: "./tmp/pcjs/" + pkg.version + "/pc.map",
|
||||
define: ["\"APPNAME='PCjs'\"", "\"APPVERSION='" + pkg.version + "'\"", "DEBUGGER=false",
|
||||
// create_source_map: "./tmp/pcx86/" + pkg.version + "/pcx86.map",
|
||||
define: ["\"APPVERSION='" + pkg.version + "'\"", "DEBUGGER=false",
|
||||
"\"SITEHOST='www.pcjs.org'\"", "COMPILED=true", "DEBUG=false", "BACKTRACK=false", "I386=true"],
|
||||
// output_wrapper: "\"(function(){%output%})();//@ sourceMappingURL=/tmp/pcjs/" + pkg.version + "/pc.map\""
|
||||
// output_wrapper: "\"(function(){%output%})();//@ sourceMappingURL=/tmp/pcx86/" + pkg.version + "/pcx86.map\""
|
||||
output_wrapper: "\"(function(){%output%})();\""
|
||||
},
|
||||
// src: pkg.pcJSFiles,
|
||||
src: tmpPCjs,
|
||||
dest: "./versions/pcjs/" + pkg.version + "/pc.js"
|
||||
// src: pkg.pcX86Files,
|
||||
src: tmpPCx86,
|
||||
dest: "./versions/pcx86/" + pkg.version + "/pcx86.js"
|
||||
},
|
||||
"pc-dbg.js": {
|
||||
"pcx86-dbg.js": {
|
||||
/*
|
||||
* Technically, this is the one case we don't need to override the default 'define' settings, but maybe it's best to be explicit.
|
||||
*/
|
||||
TEMPcompilerOpts: {
|
||||
// create_source_map: "./tmp/pcjs/" + pkg.version + "/pc-dbg.map",
|
||||
define: ["\"APPNAME='PCjs'\"", "\"APPVERSION='" + pkg.version + "'\"",
|
||||
// create_source_map: "./tmp/pcx86/" + pkg.version + "/pcx86-dbg.map",
|
||||
define: ["\"APPVERSION='" + pkg.version + "'\"",
|
||||
"\"SITEHOST='www.pcjs.org'\"", "COMPILED=true", "DEBUG=false", "BACKTRACK=false", "I386=true"],
|
||||
// output_wrapper: "\"(function(){%output%})();//@ sourceMappingURL=/tmp/pcjs/" + pkg.version + "/pc-dbg.map\""
|
||||
// output_wrapper: "\"(function(){%output%})();//@ sourceMappingURL=/tmp/pcx86/" + pkg.version + "/pcx86-dbg.map\""
|
||||
output_wrapper: "\"(function(){%output%})();\""
|
||||
},
|
||||
// src: pkg.pcJSFiles,
|
||||
src: tmpPCjs,
|
||||
dest: "./versions/pcjs/" + pkg.version + "/pc-dbg.js"
|
||||
// src: pkg.pcX86Files,
|
||||
src: tmpPCx86,
|
||||
dest: "./versions/pcx86/" + pkg.version + "/pcx86-dbg.js"
|
||||
},
|
||||
"pc8080.js": {
|
||||
TEMPcompilerOpts: {
|
||||
// create_source_map: "./tmp/pc8080/" + pkg.version + "/pc8080.map",
|
||||
define: ["\"APPNAME='PC8080'\"", "\"APPVERSION='" + pkg.version + "'\"",
|
||||
define: ["\"APPVERSION='" + pkg.version + "'\"",
|
||||
"\"SITEHOST='www.pcjs.org'\"", "COMPILED=true", "DEBUG=false", "DEBUGGER=false"],
|
||||
// output_wrapper: "\"(function(){%output%})();//@ sourceMappingURL=/tmp/pc8080/" + pkg.version + "/pc8080.map\""
|
||||
output_wrapper: "\"(function(){%output%})();\""
|
||||
|
|
@ -356,7 +356,7 @@ module.exports = function(grunt) {
|
|||
*/
|
||||
TEMPcompilerOpts: {
|
||||
// create_source_map: "./tmp/pc8080/" + pkg.version + "/pc8080-dbg.map",
|
||||
define: ["\"APPNAME='PC8080'\"", "\"APPVERSION='" + pkg.version + "'\"",
|
||||
define: ["\"APPVERSION='" + pkg.version + "'\"",
|
||||
"\"SITEHOST='www.pcjs.org'\"", "COMPILED=true", "DEBUG=false", "DEBUGGER=true"],
|
||||
// output_wrapper: "\"(function(){%output%})();//@ sourceMappingURL=/tmp/pc8080/" + pkg.version + "/pc8080-dbg.map\""
|
||||
output_wrapper: "\"(function(){%output%})();\""
|
||||
|
|
@ -402,19 +402,19 @@ module.exports = function(grunt) {
|
|||
}
|
||||
}
|
||||
},
|
||||
"pcjs": {
|
||||
"pcx86": {
|
||||
files: [
|
||||
{
|
||||
cwd: "modules/shared/templates/",
|
||||
src: ["common.css", "common.xsl", "components.*", "document.css", "document.xsl", "machine.xsl", "manifest.xsl", "outline.xsl"],
|
||||
dest: "versions/pcjs/<%= pkg.version %>/",
|
||||
dest: "versions/pcx86/<%= pkg.version %>/",
|
||||
expand: true
|
||||
}
|
||||
],
|
||||
options: {
|
||||
process: function(content, srcPath) {
|
||||
var s = content.replace(/(<xsl:variable name="APPVERSION">)[^<]*(<\/xsl:variable>)/g, "$1" + pkg.version + "$2");
|
||||
s = s.replace(/"[^"]*\/?(common.css|common.xsl|components.css|components.xsl|document.css|document.xsl)"/g, '"/versions/pcjs/' + pkg.version + '/$1"');
|
||||
s = s.replace(/"[^"]*\/?(common.css|common.xsl|components.css|components.xsl|document.css|document.xsl)"/g, '"/versions/pcx86/' + pkg.version + '/$1"');
|
||||
s = s.replace(/[ \t]*\/\*[^\*][\s\S]*?\*\//g, "").replace(/[ \t]*<!--[^@]*?-->[ \t]*\n?/g, "");
|
||||
return s;
|
||||
}
|
||||
|
|
@ -443,9 +443,9 @@ module.exports = function(grunt) {
|
|||
"examples": {
|
||||
files: [
|
||||
{
|
||||
cwd: "versions/pcjs/<%= pkg.version %>/",
|
||||
src: ["pc.js", "pc-dbg.js", "components.css", "components.xsl"],
|
||||
dest: "docs/pcjs/examples/",
|
||||
cwd: "versions/pcx86/<%= pkg.version %>/",
|
||||
src: ["pcx86.js", "pcx86-dbg.js", "components.css", "components.xsl"],
|
||||
dest: "docs/pcx86/examples/",
|
||||
expand: true
|
||||
}
|
||||
],
|
||||
|
|
@ -520,14 +520,14 @@ module.exports = function(grunt) {
|
|||
args: []
|
||||
},
|
||||
"zip-examples": {
|
||||
options: {cwd: "docs/pcjs/examples"},
|
||||
options: {cwd: "docs/pcx86/examples"},
|
||||
cmd: "./zip.sh",
|
||||
args: ["v" + pkg.version + ".zip"]
|
||||
}
|
||||
},
|
||||
replace: {
|
||||
"fix-source-maps": {
|
||||
src: ["./tmp/c1pjs/" + pkg.version + "/c1p*.map", "./tmp/pcjs/" + pkg.version + "/pc*.map"],
|
||||
src: ["./tmp/c1pjs/" + pkg.version + "/c1p*.map", "./tmp/pcx86/" + pkg.version + "/pc*.map"],
|
||||
overwrite: true,
|
||||
replacements: [
|
||||
{
|
||||
|
|
@ -560,13 +560,13 @@ module.exports = function(grunt) {
|
|||
|
||||
grunt.loadTasks("modules/grunts/prepjs/tasks");
|
||||
|
||||
grunt.registerTask("preCompiler", grunt.option("rebuild")? ["concat:tmp-c1pjs", "concat:tmp-pcjs", "concat:tmp-pc8080"] : ["newer:concat:tmp-c1pjs", "newer:concat:tmp-pcjs", "newer:concat:tmp-pc8080"]);
|
||||
grunt.registerTask("preCompiler", grunt.option("rebuild")? ["concat:tmp-c1pjs", "concat:tmp-pcx86", "concat:tmp-pc8080"] : ["newer:concat:tmp-c1pjs", "newer:concat:tmp-pcx86", "newer:concat:tmp-pc8080"]);
|
||||
|
||||
grunt.registerTask("compile", ["preCompiler", "closureCompiler", "replace:fix-source-maps"]);
|
||||
|
||||
grunt.registerTask('nocompile', function(target) {
|
||||
if (!target) {
|
||||
grunt.task.run(["concat:c1p.js", "concat:c1p-dbg.js", "concat:pc.js", "concat:pc-dbg.js"]);
|
||||
grunt.task.run(["concat:c1p.js", "concat:c1p-dbg.js", "concat:pcx86.js", "concat:pcx86-dbg.js"]);
|
||||
} else {
|
||||
grunt.task.run("concat:" + target);
|
||||
}
|
||||
|
|
|
|||
142
README.md
142
README.md
|
|
@ -1,33 +1,31 @@
|
|||
PCjs: The Virtual IBM PC
|
||||
PCjs Machines
|
||||
===
|
||||
|
||||
Welcome to [PCjs](/docs/about/pcjs/), the first IBM PC simulation to run in your web browser without any plugins.
|
||||
It was added to the [JavaScript Machines](/docs/about/) project in Fall 2012, and it is now part of the
|
||||
[PCjs Project](https://github.com/jeffpar/pcjs) on GitHub.
|
||||
Welcome to PCjs, home of [PCx86](/docs/pcx86/), the original IBM PC simulation written entirely JavaScript. It is
|
||||
one of several JavaScript Machines in the [PCjs Project](https://github.com/jeffpar/pcjs), an open-source project that
|
||||
includes:
|
||||
|
||||
The project includes the following web-based emulators:
|
||||
* [PCx86](/docs/pcx86/), an x86-based IBM PC and PC-compatible emulator
|
||||
* [PC8080](/modules/pc8080/), a 8080-based machine emulator (e.g., [Space Invaders](/devices/pc8080/machine/invaders/))
|
||||
* [C1Pjs](/docs/c1pjs/), a 6502-based emulation of the Ohio Scientific [Challenger 1P](/devices/c1p/)
|
||||
|
||||
* [PCjs](/docs/pcjs/), an x86-based IBM PC and PC-compatible emulator
|
||||
* [PC8080](/modules/pc8080/), a 8080-based generic machine emulator
|
||||
* [C1Pjs](/docs/c1pjs/), a 6502-based Ohio Scientific Challenger 1P emulator
|
||||
|
||||
PCjs first simulated the 4.77Mhz 8088-based IBM PC, and has steadily evolved to support more classic x86 machines,
|
||||
including the IBM PC XT, the 80286-based IBM PC AT, and the 80386-based COMPAQ DeskPro 386. PCjs fully supports
|
||||
the original machine ROMs, video cards, etc, and all machines run at their original speeds.
|
||||
|
||||
All the 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,
|
||||
All PCjs computer 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.
|
||||
|
||||
[Embedded IBM PC](/devices/pc/machine/5150/mda/64kb/ "PCjs:ibm5150")
|
||||
[Embedded IBM PC](/devices/pcx86/machine/5150/mda/64kb/ "PCx86:ibm5150")
|
||||
|
||||
The [simulation](/devices/pc/machine/5150/mda/64kb/) above features 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/pc/machine/5150/mda/64kb/debugger/) and [Soft Keyboard](/devices/pc/machine/5150/mda/64kb/softkbd/)
|
||||
configurations, featuring the built-in PCjs Debugger. For even greater control, build your own PC. The
|
||||
[PCjs Documentation](/docs/pcjs/) will help you get started.
|
||||
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.
|
||||
|
||||
The goals of the [JavaScript Machines](/docs/about/) project are to create fast, full-featured simulations of classic
|
||||
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/) project 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.
|
||||
|
||||
|
|
@ -35,27 +33,27 @@ Demos
|
|||
---
|
||||
Some pre-configured machines are shown below, ready to run BASIC, DOS, Windows, OS/2, and other assorted software.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
There are many more [PCjs Demos](/devices/pc/machine/#ready-to-run-app-demos), including an
|
||||
[IBM PC with Dual Displays](/devices/pc/machine/5150/dual/64kb/) demonstrating early multi-monitor support,
|
||||
and multiple IBM PC XT machines running side-by-side with [CGA Displays](/devices/pc/machine/5160/cga/256kb/array/)
|
||||
and [EGA Displays](/devices/pc/machine/5160/ega/640kb/array/).
|
||||
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 JavaScript Machines project.
|
||||
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/).
|
||||
|
||||
|
|
@ -69,8 +67,8 @@ Developer Notes
|
|||
---
|
||||
|
||||
The [PCjs repository](https://github.com/jeffpar/pcjs) on GitHub contains everything needed to run PCjs
|
||||
computer simulations. The [PCjs](/docs/pcjs/) and [C1Pjs](/docs/c1pjs/) emulators run in any modern web browser,
|
||||
with or without a web server, and examples are provided for both [local](/docs/pcjs/examples/) and
|
||||
computer simulations. The [PCx86](/docs/pcx86/) and [C1Pjs](/docs/c1pjs/) emulators run in any modern web browser,
|
||||
with or without a web server, and examples are provided for both [local](/docs/pcx86/examples/) and
|
||||
[remote](http://www.pcjs.org/) operation.
|
||||
|
||||
The project includes:
|
||||
|
|
@ -78,8 +76,8 @@ The project includes:
|
|||
- A simple Node-based web server ([server.js](server.js))
|
||||
- Custom Node modules used by the web server ([HTMLOut](modules/htmlout/), [MarkOut](modules/markout/), [DiskDump](modules/diskdump/), [FileDump](modules/filedump/))
|
||||
- A variety of IBM PC and C1P configuration and resource files (see [/apps](apps/), [/devices](devices/) and [/disks](disks/))
|
||||
- The [PCjs](modules/pcjs/lib/) and [C1Pjs](modules/c1pjs/lib/) client applications, both "compiled" and uncompiled
|
||||
- A smattering of [PCjs](docs/pcjs/) and [C1Pjs](docs/c1pjs/) documentation, along with [blog posts](blog/), related [publications](pubs/) and more
|
||||
- The [PCx86](modules/pcjs/lib/) and [C1Pjs](modules/c1pjs/lib/) client applications, both "compiled" and uncompiled
|
||||
- A smattering of [PCx86](docs/pcx86/) and [C1Pjs](docs/c1pjs/) documentation, along with [blog posts](blog/), related [publications](pubs/) and more
|
||||
|
||||
The bundled web server is not strictly required. Any web server (Node, Apache, Nginx, etc) that can serve the necessary
|
||||
JavaScript files to your browser will work. However, instructions for doing that are beyond the scope of this introduction.
|
||||
|
|
@ -87,7 +85,7 @@ JavaScript files to your browser will work. However, instructions for doing tha
|
|||
In fact, you can run PCjs simulations without a web server at all, using the "file:" protocol instead of "http:".
|
||||
However, most of the machine configurations require additional resource files (ROMs, disk images, etc), which are
|
||||
included in the project, but unless all the resource files are moved into a single directory (as they are in these
|
||||
[Demos](/docs/pcjs/examples/)), your browser will probably be unable to load all of them, due to security restrictions.
|
||||
[Demos](/docs/pcx86/examples/)), your browser will probably be unable to load all of them, due to security restrictions.
|
||||
Using the bundled web server is the preferred solution.
|
||||
|
||||
The project includes a large selection of disk images, and a powerful [DiskDump](modules/diskdump/) utility that
|
||||
|
|
@ -180,8 +178,8 @@ OS X users may also need to preface this command with `sudo`:
|
|||
|
||||
Now you can run `grunt` anywhere within the PCjs project to build an updated version. If no command-line arguments
|
||||
are specified, `grunt` runs the "default" task defined by [Gruntfile.js](Gruntfile.js); that task runs Google's
|
||||
[Closure Compiler](https://developers.google.com/closure/compiler/) if any of the target files (eg, pc.js or pc-dbg.js
|
||||
in the [/versions](versions/) directory) are out-of date.
|
||||
[Closure Compiler](https://developers.google.com/closure/compiler/) if any of the target files (eg, pcx86.js or
|
||||
pcx86-dbg.js in the [/versions](versions/) directory) are out-of date.
|
||||
|
||||
To ensure consistent compilation results, a copy of the Closure Compiler has been checked into the
|
||||
[/bin](bin/) folder. This version of Closure Compiler, in turn, requires Java v7 or later. Use the following
|
||||
|
|
@ -234,10 +232,10 @@ pcjs.org home page ([index.md](index.md)):
|
|||
layout: page
|
||||
permalink: /
|
||||
machines:
|
||||
- type: pc
|
||||
- type: pcx86
|
||||
id: ibm5150
|
||||
name: "IBM PC (Model 5150) with Monochrome Display"
|
||||
config: /devices/pc/machine/5150/mda/64kb/machine.xml
|
||||
config: /devices/pcx86/machine/5150/mda/64kb/machine.xml
|
||||
- type: c1p
|
||||
id: demoC1P
|
||||
config: /devices/c1p/machine/8kb/large/machine.xml
|
||||
|
|
@ -254,43 +252,43 @@ For more information on all the machine options supported in a Markdown file, se
|
|||
|
||||
### From The Command-Line
|
||||
|
||||
The PCjs client app can also be run from the command-line mode using Node, making it possible to script the application,
|
||||
The PCx86 client app can also be run from the command-line mode using Node, making it possible to script the application,
|
||||
run a series of automated tests, etc:
|
||||
|
||||
cd modules/pcjs/bin
|
||||
node pcjs
|
||||
cd modules/pcx86/bin
|
||||
node pcx86
|
||||
|
||||
The [pcjs](modules/pcjs/bin/pcjs) script in [modules/pcjs/bin](modules/pcjs/bin) loads
|
||||
all the PCjs browser scripts listed in the root [package.json](/package.json) and then starts a Node REPL
|
||||
The [pcx86](modules/pcx86/bin/pcx86) script in [modules/pcx86/bin](modules/pcx86/bin) loads
|
||||
all the PCx86 browser scripts listed in the root [package.json](/package.json) and then starts a Node REPL
|
||||
("read-eval-print loop"). The REPL handles a few special commands (eg, "load", "quit") and passes anything else
|
||||
to the PCjs Debugger component. If no Debugger component has been created yet, or if the Debugger didn't recognize
|
||||
to the PCx86 Debugger component. If no Debugger component has been created yet, or if the Debugger didn't recognize
|
||||
the command, then it's passed on to *eval()*, like a good little REPL.
|
||||
|
||||
Use the "load" command to load a JSON machine configuration file. A sample
|
||||
[ibm5150.json](modules/pcjs/bin/ibm5150.json) is provided in the *bin* directory, which is a "JSON-ified" version
|
||||
of the [machine.xml](devices/pc/machine/5150/mda/64kb/machine.xml) displayed on the [pcjs.org](http://www.pcjs.org/)
|
||||
[ibm5150.json](modules/pcx86/bin/ibm5150.json) is provided in the *bin* directory, which is a "JSON-ified" version
|
||||
of the [machine.xml](devices/pcx86/machine/5150/mda/64kb/machine.xml) displayed on the [pcjs.org](http://www.pcjs.org/)
|
||||
home page.
|
||||
|
||||
The command-line loader creates all the JSON-defined machine components in the same order that the browser creates
|
||||
XML-defined components. You can also issue the "load" command directly from the command-line:
|
||||
|
||||
node pcjs --cmd="load ibm5150.json"
|
||||
node pcx86 --cmd="load ibm5150.json"
|
||||
|
||||
In fact, any number of "--cmd" arguments can be included on the command-line. A batch file syntax will eventually be
|
||||
added, too.
|
||||
|
||||
When PCjs runs in a browser, an XML machine configuration file is transformed into HTML with a set of DIVs for each
|
||||
component: an "object" DIV whose *data-value* attribute provides the initialization parameters for the corresponding
|
||||
component, along with a set of optional "control" DIVs that the component can bind to (eg, a "Run" button, or a visual
|
||||
representation of DIP switches, or whatever).
|
||||
When a PCjs machine runs in a browser, an XML machine configuration file is transformed into HTML with a set of DIVs
|
||||
for each component: an "object" DIV whose *data-value* attribute provides the initialization parameters for the
|
||||
corresponding component, along with a set of optional "control" DIVs that the component can bind to (eg, a "Run" button,
|
||||
or a visual representation of DIP switches, or whatever).
|
||||
|
||||
When PCjs is run from the command-line, there is no XML, HTML, or DIVs involved; this is basically a "headless" version
|
||||
of PCjs, so there is no simple way to view a machine's video display or interact with its keyboard, mouse, etc.
|
||||
You have to use Debugger commands to dump the machine's video buffer.
|
||||
When a PCjs machine is run from the command-line, there is no XML, HTML, or DIVs involved; this is basically a
|
||||
"headless" version of the machine, so there is no simple way to view its video display or interact with its keyboard,
|
||||
mouse, etc. You have to use Debugger commands to dump the machine's video buffer.
|
||||
|
||||
Since I was not inclined to add XML support to my Node environment, this has created some divergence between client
|
||||
and server operation: PCjs on the client supports *only* XML machine configuration files, whereas PCjs on the server
|
||||
supports *only* JSON machine configuration files.
|
||||
and server operation: PCjs machines on the client supports *only* XML machine configuration files, whereas PCjs machines
|
||||
on the server supports *only* JSON machine configuration files.
|
||||
|
||||
I haven't decided whether I'll add support for JSON configuration files to the client, or add some XML-to-JSON conversion
|
||||
to the server, or both.
|
||||
|
|
@ -327,7 +325,7 @@ A complete list of command-line options can be found in [server.js](server.js).
|
|||
|
||||
### Client Components
|
||||
|
||||
A special command parameter ("gort") can be appended to the URL to request uncompiled client source files, making PCjs
|
||||
A special command parameter ("gort") can be appended to the URL to request uncompiled client source files, making PCx86
|
||||
and C1Pjs much easier to debug, albeit much slower:
|
||||
|
||||
http://localhost:8088/?gort=debug
|
||||
|
|
@ -335,7 +333,7 @@ and C1Pjs much easier to debug, albeit much slower:
|
|||
The "gort=debug" command is unnecessary if the server is started with `--debug`; the server always serves uncompiled
|
||||
files when running in debug mode.
|
||||
|
||||
Conversely, if the server is in debug mode but you want to test a compiled version of PCjs, use:
|
||||
Conversely, if the server is in debug mode but you want to test a compiled version of PCx86, use:
|
||||
|
||||
http://localhost:8088/?gort=release
|
||||
|
||||
|
|
@ -373,7 +371,7 @@ To start developing features for a new version of PCjs, here are the recommended
|
|||
1. Change the version number in the root [package.json](package.json) and [_config.yml](_config.yml)
|
||||
2. Run the "grunt promote" task to bump the version in all the machine XML files
|
||||
3. Make changes
|
||||
4. Run "grunt" to build new versions of the apps (eg, "/versions/pcjs/1.x.x/pc.js")
|
||||
4. Run "grunt" to build new versions of the apps (eg, "/versions/pcx86/1.x.x/pcx86.js")
|
||||
|
||||
You might also want to check out the blog post on [PCjs Coding Conventions](http://www.pcjs.org/blog/2014/09/30/).
|
||||
|
||||
|
|
@ -403,7 +401,7 @@ manually or with the Grunt "clean" task:
|
|||
|
||||
License
|
||||
---
|
||||
The [PCjs Project](https://github.com/jeffpar/pcjs) is now an open source project on [GitHub](http://github.com/).
|
||||
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.
|
||||
|
|
@ -419,8 +417,8 @@ See [LICENSE](/LICENSE) for details.
|
|||
|
||||
More Information
|
||||
---
|
||||
Learn more about the [JavaScript Machines](/docs/about/) Project and [PCjs](/docs/about/pcjs/). To
|
||||
create your own PCjs machines, see the [Documentation](/docs/pcjs/) for details.
|
||||
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).
|
||||
|
|
|
|||
101
_config.yml
101
_config.yml
|
|
@ -1,13 +1,12 @@
|
|||
# Site settings
|
||||
|
||||
title: "PCjs: The Virtual IBM PC"
|
||||
title: "PCjs Machines"
|
||||
email: Jeff@pcjs.org
|
||||
description: >
|
||||
PCjs: The Original IBM PC in a Browser.
|
||||
Classic computer simulations in JavaScript.
|
||||
PCjs: Home of the original IBM PC emulator in a browser.
|
||||
Classic computer simulations in JavaScript, including the IBM PC and other x86-based machines, 6502-based
|
||||
machines such as the Ohio Scientific Challenger 1P, and 8080-based machines such as Space Invaders.
|
||||
Includes an archive of historical PC software and publications.
|
||||
Additional computer simulations in JavaScript include the 6502-based Ohio Scientific Challenger 1P and 8080-based
|
||||
machines, including arcade machines such as Space Invaders.
|
||||
baseurl: "" # "/pcjs" when using http://jeffpar.github.io or "" when using http://www.pcjs.org
|
||||
url: "http://www.pcjs.org" # "http://jeffpar.github.io" or "http://www.pcjs.org"
|
||||
twitter_username: jeffpar
|
||||
|
|
@ -33,52 +32,9 @@ gems:
|
|||
|
||||
pcjs:
|
||||
domain: pcjs.org # whereas site.url is used for linking purposes, site.pcjs.domain is used for display purposes
|
||||
version: 1.22.1 # IMPORTANT: keep pcjs.version in sync with package.json:version
|
||||
compiled: true # by default, the compiled pcjs.version scripts will be used (eg, pc.js or pc-dbg.js)
|
||||
pc_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/diskapi.js
|
||||
- /modules/shared/lib/dumpapi.js
|
||||
- /modules/shared/lib/reportapi.js
|
||||
- /modules/shared/lib/userapi.js
|
||||
- /modules/shared/lib/strlib.js
|
||||
- /modules/shared/lib/usrlib.js
|
||||
- /modules/shared/lib/weblib.js
|
||||
- /modules/shared/lib/component.js
|
||||
- /modules/pcjs/lib/defines.js
|
||||
- /modules/pcjs/lib/x86.js
|
||||
- /modules/pcjs/lib/interrupts.js
|
||||
- /modules/pcjs/lib/messages.js
|
||||
- /modules/pcjs/lib/panel.js
|
||||
- /modules/pcjs/lib/bus.js
|
||||
- /modules/pcjs/lib/memory.js
|
||||
- /modules/pcjs/lib/cpu.js
|
||||
- /modules/pcjs/lib/x86seg.js
|
||||
- /modules/pcjs/lib/x86cpu.js
|
||||
- /modules/pcjs/lib/x86fpu.js
|
||||
- /modules/pcjs/lib/x86func.js
|
||||
- /modules/pcjs/lib/x86help.js
|
||||
- /modules/pcjs/lib/x86mods.js
|
||||
- /modules/pcjs/lib/x86ops.js
|
||||
- /modules/pcjs/lib/x86op0f.js
|
||||
- /modules/pcjs/lib/chipset.js
|
||||
- /modules/pcjs/lib/rom.js
|
||||
- /modules/pcjs/lib/ram.js
|
||||
- /modules/pcjs/lib/keyboard.js
|
||||
- /modules/pcjs/lib/video.js
|
||||
- /modules/pcjs/lib/parallelport.js
|
||||
- /modules/pcjs/lib/serialport.js
|
||||
- /modules/pcjs/lib/mouse.js
|
||||
- /modules/pcjs/lib/disk.js
|
||||
- /modules/pcjs/lib/fdc.js
|
||||
- /modules/pcjs/lib/hdc.js
|
||||
- /modules/pcjs/lib/debugger.js
|
||||
- /modules/pcjs/lib/state.js
|
||||
- /modules/pcjs/lib/computer.js
|
||||
- /modules/shared/lib/embed.js
|
||||
- /modules/shared/lib/save.js
|
||||
c1p_scripts:
|
||||
version: 1.23.0 # 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
|
||||
|
|
@ -99,6 +55,49 @@ pcjs:
|
|||
- /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/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/parallelport.js
|
||||
- /modules/pcx86/lib/serialport.js
|
||||
- /modules/pcx86/lib/mouse.js
|
||||
- /modules/pcx86/lib/disk.js
|
||||
- /modules/pcx86/lib/fdc.js
|
||||
- /modules/pcx86/lib/hdc.js
|
||||
- /modules/pcx86/lib/debugger.js
|
||||
- /modules/pcx86/lib/state.js
|
||||
- /modules/pcx86/lib/computer.js
|
||||
- /modules/shared/lib/embed.js
|
||||
- /modules/shared/lib/save.js
|
||||
pc8080_scripts:
|
||||
- /modules/shared/lib/defines.js
|
||||
- /modules/shared/lib/dumpapi.js
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ in the Front Matter of our Markdown documents, for compatibility with the Jekyll
|
|||
|
||||
'id' (eg, "ibm5150")
|
||||
'name' (eg, "IBM PC (Model 5150) with Monochrome Display")
|
||||
'type' (eg. "c1p", "pc", "pc8080")
|
||||
'type' (eg, "c1p", "pcx86", "pc8080")
|
||||
'debugger' (default is false)
|
||||
'config' (default is "machine.xml")
|
||||
'template' (default is "machine.xsl")
|
||||
|
|
@ -34,17 +34,23 @@ of our Markdown or XML documents. Examples: 'automount' becomes 'autoMount', 'a
|
|||
{% endcomment %}
|
||||
{% for machine in page.machines %}
|
||||
{% capture machine_type %}{{ machine.type | remove:"-dbg" }}{% endcapture %}
|
||||
{% if machine_type != "pc" and machine_type != "c1p" %}
|
||||
{% capture machine_app %}{{ machine_type }}{% endcapture %}
|
||||
{% else %}
|
||||
{% capture machine_app %}{{ machine_type }}js{% endcapture %}
|
||||
{% if machine_type != "c1p" %}
|
||||
{% capture machine_app %}{{ machine_type }}{% endcapture %}
|
||||
{% else %}
|
||||
{% capture machine_app %}{{ machine_type }}js{% endcapture %}
|
||||
{% endif %}
|
||||
{% if machine.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 }}{% endcapture %}
|
||||
{% capture machine_embed %}embed{{ machine_type | upcase | replace:"X86","x86" }}{% endcapture %}
|
||||
{% if machine.automount != nil %}
|
||||
{% if machine.automount == "" %}
|
||||
{% assign machine_autoMount = "{}" %}
|
||||
|
|
@ -103,7 +109,7 @@ of our Markdown or XML documents. Examples: 'automount' becomes 'autoMount', 'a
|
|||
{% endif %}
|
||||
{% else %}
|
||||
{% if machine_type == "c1p" %}{% assign array_scripts = site.pcjs.c1p_scripts %}{% endif %}
|
||||
{% if machine_type == "pc" %}{% assign array_scripts = site.pcjs.pc_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 %}
|
||||
{% for script in array_scripts %}
|
||||
{% if script != "/modules/shared/lib/nodebug.js" or machine.debug != true %}
|
||||
|
|
@ -116,7 +122,7 @@ of our Markdown or XML documents. Examples: 'automount' becomes 'autoMount', 'a
|
|||
{% endif %}
|
||||
{% endif %}
|
||||
{% if script contains "js/lib/defines.js" %}
|
||||
{% if machine.debugger != true %}
|
||||
{% if machine_debugger != true %}
|
||||
{{ machine_script | replace:"defines.js","nodebugger.js" }}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
|
|
|
|||
|
|
@ -1,12 +1,12 @@
|
|||
{% for machine in page.machines %}
|
||||
{% capture machine_type %}{{ machine.type | remove:"-dbg" }}{% endcapture %}
|
||||
{% if machine_type != "pc" and machine_type != "c1p" %}
|
||||
{% if machine_type != "c1p" %}
|
||||
{% capture machine_app %}{{ machine_type }}{% endcapture %}
|
||||
{% else %}
|
||||
{% capture machine_app %}{{ machine_type }}js{% endcapture %}
|
||||
{% endif %}
|
||||
{% unless site.pcjs.compiled == true and machine.uncompiled != true %}
|
||||
{% if machine_app != "c1pjs" %}
|
||||
{% if machine_type != "c1p" %}
|
||||
{% capture machine_style %}{{ site.baseurl }}/modules/shared/templates/components.css{% endcapture %}
|
||||
{% else %}
|
||||
{% capture machine_style %}{{ site.baseurl }}/modules/{{ machine_app }}/templates/components.css{% endcapture %}
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ syntax, which is more than sufficient to handle all the site's **README.md** fil
|
|||
have used a third-party Markdown library, but this was more educational, and it was easy to add extra features,
|
||||
like the ability to embed JavaScript machines with a single Markdown-style link; eg:
|
||||
|
||||
[IBM PC](/devices/pc/machine/5150/mda/64kb/ "PCjs:ibm5150")
|
||||
[IBM PC](/devices/pcx86/machine/5150/mda/64kb/ "PCjs:ibm5150")
|
||||
|
||||
The script takes care of the rest, adding the appropriate stylesheets and PCjs scripts automatically.
|
||||
|
||||
|
|
@ -34,7 +34,7 @@ I had more grandiose plans, including a command-line prompt written in JavaScrip
|
|||
navigate the site exactly as you would an IBM PC hard drive from a "DOS prompt", and I may try something
|
||||
like that later, but don't hold your breath.
|
||||
|
||||
I've tried to improve the organization of all the [Machine Configuration Files](/devices/pc/machine/) as well.
|
||||
I've tried to improve the organization of all the [Machine Configuration Files](/devices/pcx86/machine/) as well.
|
||||
The variety of configurations was getting out of hand. It's a bit tidier now, but there's still room for
|
||||
improvement.
|
||||
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@ while I can understand some whitespace inconsistencies across web servers, I wou
|
|||
on the server to modify file contents.
|
||||
|
||||
I finally confirmed that the files were indeed modified on the server, by using Azure's FTP browser. For example,
|
||||
[us83-buttons-minimal.xml](/devices/pc/keyboard/us83-buttons-minimal.xml) is currently 622 bytes locally, but on the
|
||||
[us83-buttons-minimal.xml](/devices/pcx86/keyboard/us83-buttons-minimal.xml) is currently 622 bytes locally, but on the
|
||||
Azure server, the reported size is 632 bytes -- one extra CR for each of the file's 10 lines. After a little more
|
||||
digging, I [learned something new](http://git-scm.com/book/ch7-1.html#Formatting-and-Whitespace) about **Git**: it
|
||||
has a setting called `core.autocrlf` which, for me on OS X, defaults to `input` (meaning "convert CR/LF to LF on commit
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ are simple XML files that describe a piece of software (an application, an opera
|
|||
link to a PCjs machine configuration capable of running the software, along with a "ready-to-run" machine state file.
|
||||
Conversely, a PCjs machine XML file can refer back to the manifest, to obtain a list of disk images.
|
||||
|
||||
Here are some [demos](/apps/pc/) of "ready-to-run" apps on [PCjs](/docs/about/pcjs/).
|
||||
Here are some [Demos](/apps/pc/) of "ready-to-run" apps on [PCjs](/docs/about/).
|
||||
|
||||
There have been lots of server-side changes recently, including API improvements that make it easy (well, *easier*)
|
||||
to dynamically create diskette images from a list of files, or even an entire folder (including all subfolders),
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ Don't believe me? Just ask [Google](https://www.google.com/#q=node+express+safa
|
|||
stylesheets. And occasionally Safari -- and ONLY Safari -- will render those XML files as blank pages.
|
||||
|
||||
For example, here's the
|
||||
[machine.xml](/devices/pc/machine/5150/mda/64kb/machine.xml) file that's also embedded on the
|
||||
[machine.xml](/devices/pcx86/machine/5150/mda/64kb/machine.xml) file that's also embedded on the
|
||||
[{{ site.pcjs.domain }}]({{ site.url }}/) home page.
|
||||
|
||||
When Safari fetched that XML file from an Apache web server (what I used before switching to Node),
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ v1.13.7 of PCjs contains a few minor improvements, mostly in terms of rendering
|
|||
efficiently. The rest of the changes to the website involved beefing up support for both "software manifests"
|
||||
and "document manifests."
|
||||
|
||||
To that end, there's a new [/pubs/](/pubs/) directory for old documents, and [/disks/pc/](/disks/pc/) contains
|
||||
To that end, there's a new [/pubs/](/pubs/) directory for old documents, and [/disks/pcx86/](/disks/pcx86/) contains
|
||||
more disk images, with more on the way. I have a TON of old diskette images, and it has taken more time to organize
|
||||
them and create manifests than I would like.
|
||||
|
||||
|
|
|
|||
|
|
@ -7,14 +7,16 @@ permalink: /blog/2014/07/30/
|
|||
---
|
||||
|
||||
PCjs v1.14.0 now includes basic EGA support. It emulates the EGA hardware well enough to pass the IBM EGA BIOS
|
||||
diagnostics and run [Windows 1.01](/devices/pc/machine/5160/ega/640kb/win101/) in color. Check out our
|
||||
[Windows 1.01 "Server Array"](/devices/pc/machine/5160/ega/640kb/array/) demo.
|
||||
diagnostics and run [Windows 1.01](/devices/pcx86/machine/5160/ega/640kb/win101/) in color. Check out our
|
||||
[Windows 1.01 "Server Array"](/devices/pcx86/machine/5160/ega/640kb/array/) demo.
|
||||
|
||||
[<img src="/blog/images/win101-array-demo-small.jpg" alt='Windows 1.01 "Server Array" Demo'/>](/blog/images/win101-array-demo.jpg)
|
||||
|
||||
EGA support is added to a **machine.xml** file using two XML elements; eg:
|
||||
|
||||
<video id="videoEGA" model="ega" memory="0x20000" screenwidth="640" screenheight="350"/>
|
||||
```xml
|
||||
<video id="videoEGA" model="ega" memory="0x20000" screenwidth="640" screenheight="350"/>
|
||||
```
|
||||
|
||||
The *model* attribute must be set to "ega" and the *memory* attribute should be set to the amount of memory
|
||||
desired on the card; valid memory sizes are:
|
||||
|
|
@ -29,7 +31,9 @@ window, which the browser will then scale up or down, unless a specific overall
|
|||
|
||||
The second required XML element is a <rom> element to load the EGA ROM; eg:
|
||||
|
||||
<rom id="romEGA" addr="0xc0000" size="0x4000" file="/devices/pc/video/ibm-ega.json" notify="videoEGA"/>
|
||||
```xml
|
||||
<rom id="romEGA" addr="0xc0000" size="0x4000" file="/devices/pcx86/video/ibm-ega.json" notify="videoEGA"/>
|
||||
```
|
||||
|
||||
The *notify* attribute must match the *id* of the <video> element, so that the Video component can load
|
||||
the initial 8x14 and 8x8 fonts from the ROM. Support for dynamic loading of fonts from plane 2 of the EGA's memory
|
||||
|
|
|
|||
|
|
@ -6,39 +6,41 @@ category: 80286
|
|||
permalink: /blog/2014/08/28/
|
||||
---
|
||||
|
||||
The next milestone for PCjs is complete 80286 emulation. My hope is to have it working by the end of the year.
|
||||
The next milestone for PCx86 is complete 80286 emulation. My hope is to have it working by the end of the year.
|
||||
|
||||
PCjs version 1.15.0 is the first step on the path to full 80286 support. It includes changes to the physical
|
||||
PCx86 version 1.15.0 is the first step on the path to full 80286 support. It includes changes to the physical
|
||||
memory manager and separate real-mode and protected-mode address evaluators. The Debugger supports physical
|
||||
addresses (eg, %FE05B is the same as F000:E05B, assuming real-mode operation), along with breakpoint commands that
|
||||
stop execution on port input/output operations. And the ChipSet component now contains "infrastructure" (a
|
||||
fancy way of saying "partial support") for multiple PICs, DMA controllers, the 8042 keyboard controller (including
|
||||
A20 support), and a bit more -- but not much.
|
||||
|
||||
One of the challenges is creating a single "universal" version of PCjs that can adapt itself to different machine
|
||||
One of the challenges is creating a single "universal" version of PCx86 that can adapt itself to different machine
|
||||
types without impacting performance. There will not be a **pc8088.js** or a **pc80286.js** or whatever. There will
|
||||
only be **pc.js**.
|
||||
only be **pcx86.js**.
|
||||
|
||||
Up until now, all PCjs machine XML files assumed an 8088 CPU with a 20-bit bus and a model 5150 or 5160 motherboard.
|
||||
Up until now, all PCx86 machine XML files assumed an 8088 CPU with a 20-bit bus and a model 5150 or 5160 motherboard.
|
||||
But now, a machine XML file can specify:
|
||||
|
||||
<computer name="IBM PC AT" buswidth="24"/>
|
||||
<cpu model="80286"/>
|
||||
<chipset model="5170"/>
|
||||
...
|
||||
```xml
|
||||
<computer name="IBM PC AT" buswidth="24"/>
|
||||
<cpu model="80286"/>
|
||||
<chipset model="5170"/>
|
||||
...
|
||||
```
|
||||
|
||||
Conventional emulators are usually NOT able to run original BIOS images, or simulate original PC hardware,
|
||||
or even run at the same speed as the original PC, making some software difficult or impossible to use. PCjs takes a
|
||||
different approach, by attempting to simulate an entire PC as it originally existed. Which is why a PCjs simulation
|
||||
or even run at the same speed as the original PC, making some software difficult or impossible to use. PCx86 takes a
|
||||
different approach, by attempting to simulate an entire PC as it originally existed. Which is why a PCx86 simulation
|
||||
of an IBM PC does NOT run at whatever speed your modern PC happens to run in V86-mode or whatever speed your
|
||||
browser's JavaScript engine tops out at.
|
||||
|
||||
No, a PCjs simulation of a 4.77Mhz IBM PC runs at 4.77Mhz. And a PCjs simulation of a 6Mhz IBM PC AT will run at
|
||||
No, a PCx86 simulation of a 4.77Mhz IBM PC runs at 4.77Mhz. And a PCx86 simulation of a 6Mhz IBM PC AT will run at
|
||||
6Mhz. If you want to run the simulation faster, you have that option, but that's not the default. And I'm not saying
|
||||
that PCjs is *exact* -- exactness is an exercise I'm leaving for another day and/or to other developers who are even
|
||||
more obsessive than I am. I'm just saying that original PCs represent the targets that PCjs is shooting for.
|
||||
that PCx86 is *exact* -- exactness is an exercise I'm leaving for another day and/or to other developers who are even
|
||||
more obsessive than I am. I'm just saying that original PCs represent the targets that PCx86 is shooting for.
|
||||
|
||||
PCjs 1.15.0 can now load and run the IBM 5170 ROM BIOS up to the first 80286-specific opcode, so it's off and running.
|
||||
PCx86 1.15.0 can now load and run the IBM 5170 ROM BIOS up to the first 80286-specific opcode, so it's off and running.
|
||||
Although "running" isn't quite the right metaphor, because the process of bringing a new machine simulation to
|
||||
completion is a *very* long series of baby steps.
|
||||
|
||||
|
|
|
|||
|
|
@ -6,8 +6,8 @@ category: Releases
|
|||
permalink: /blog/2014/09/13/
|
||||
---
|
||||
|
||||
My first IBM PC AT (Model 5170) [Test Configuration](/devices/pc/machine/5170/ega/640kb/rev1/debugger/) finally
|
||||
boots to a PC-DOS prompt. The configuration uses the original [IBM Model 5170 ROM BIOS](/devices/pc/rom/5170/),
|
||||
My first IBM PC AT (Model 5170) [Test Configuration](/devices/pcx86/machine/5170/ega/640kb/rev1/debugger/) finally
|
||||
boots to a PC-DOS prompt. The configuration uses the original [IBM Model 5170 ROM BIOS](/devices/pcx86/rom/5170/),
|
||||
dated January 10, 1984.
|
||||
|
||||
Getting through the BIOS "POST" (Power-On Self Test) diagnostics was like running an obstacle course, with various
|
||||
|
|
@ -55,8 +55,8 @@ There's still no support for [LOADALL](/pubs/pc/reference/intel/80286/loadall/)
|
|||
call gates or task gates, nor for conforming code segments or expand-down data segments. 80286-specific cycle
|
||||
counts haven't been incorporated yet, either. The list of remaining 80286 features is long.
|
||||
|
||||
And there's plenty of hardware support left to do: I haven't looked at the AT hard disk controller yet (which
|
||||
I believe is significantly different from the XT hard disk controller), and the keyboard *barely* works; the 8042
|
||||
And there's plenty of hardware support left to do: I haven't looked at the AT hard drive controller yet (which
|
||||
I believe is significantly different from the XT hard drive controller), and the keyboard *barely* works; the 8042
|
||||
Keyboard Controller and AT keyboard had a number of features that older PC/XT keyboards did not (like LEDs and
|
||||
programmable repeat rate).
|
||||
|
||||
|
|
|
|||
|
|
@ -121,7 +121,7 @@ if (DEBUG) this.log('load("' + sFileURL + '")');
|
|||
```
|
||||
|
||||
There are a number of other important shared constants in [/modules/shared/lib/defines.js](/modules/shared/lib/defines.js)
|
||||
and PCjs-specific constants in [/modules/pcjs/lib/defines.js](/modules/pcjs/lib/defines.js); refer
|
||||
and PCjs-specific constants in [/modules/pcx86/lib/defines.js](/modules/pcx86/lib/defines.js); refer
|
||||
to those files for more information.
|
||||
|
||||
### Braces and Parentheses
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ can boot and run in real-mode now, but there's still a lot of protected-mode wor
|
|||
this year is to boot OS/2 1.0.
|
||||
|
||||
There are also a lot of rough edges left to polish. Holes in EGA emulation remain to be filled (support for dynamically
|
||||
loaded fonts is one of the bigger ones). And the PC AT Keyboard, along with the 8042 and Hard Disk controllers, are all
|
||||
loaded fonts is one of the bigger ones). And the PC AT Keyboard, along with the 8042 and Hard Drive controllers, are all
|
||||
just limping along at the moment.
|
||||
|
||||
Longer term, I'm looking forward to building some new tools, including an "IBM PC Configurator" that will take some
|
||||
|
|
|
|||
|
|
@ -6,11 +6,11 @@ category: JavaScript
|
|||
permalink: /blog/2014/10/13/
|
||||
---
|
||||
|
||||
I just added my first [8Mhz IBM PC AT](/devices/pc/machine/5170/ega/1152kb/rev3/debugger/) machine configuration
|
||||
to the list of [IBM PC Machine Configurations](/devices/pc/machine/), and not surprisingly, the new machine
|
||||
I just added my first [8Mhz IBM PC AT](/devices/pcx86/machine/5170/ega/1152kb/rev3/debugger/) machine configuration
|
||||
to the list of [IBM PC Machine Configurations](/devices/pcx86/machine/), and not surprisingly, the new machine
|
||||
fails to boot.
|
||||
|
||||
This machine uses the 3rd [ROM BIOS](/devices/pc/rom/5170/) that IBM released for the PC AT, a revision that
|
||||
This machine uses the 3rd [ROM BIOS](/devices/pcx86/rom/5170/) that IBM released for the PC AT, a revision that
|
||||
included support for 3.5-inch 1.44Mb diskettes -- which will be nice, because I have a number of 1.44Mb diskette
|
||||
images I would like to be able to read in a PCjs machine.
|
||||
|
||||
|
|
|
|||
|
|
@ -6,23 +6,23 @@ category: Releases
|
|||
permalink: /blog/2014/10/17/
|
||||
---
|
||||
|
||||
The [8Mhz IBM PC AT](/devices/pc/machine/5170/ega/1152kb/rev3/debugger/) machine configuration now boots in
|
||||
The [8Mhz IBM PC AT](/devices/pcx86/machine/5170/ega/1152kb/rev3/debugger/) machine configuration now boots in
|
||||
[PCjs v1.15.5](https://github.com/jeffpar/pcjs/releases/tag/v1.15.5), which includes the following fixes:
|
||||
|
||||
+ The BIOS expects memory refresh to occur roughly every 16us, which I've resolved by tying the state
|
||||
of the refresh bit in port 0x61 to bit 6 of the CPU cycle count (see *in8042RWReg()* in [chipset.js](/modules/pcjs/lib/chipset.js));
|
||||
of the refresh bit in port 0x61 to bit 6 of the CPU cycle count (see *in8042RWReg()* in [chipset.js](/modules/pcx86/lib/chipset.js));
|
||||
the original AT BIOS was satisfied with a refresh bit that merely alternated, whereas the new AT BIOS
|
||||
is much more particular about the rate at which that bit changes, since many hard-coded delay-loops have
|
||||
now been replaced with code that waits for a specific number of refresh cycles.
|
||||
|
||||
+ The 8042 Keyboard Controller emulation needed a few more tweaks, mainly with respect to what happens
|
||||
when the keyboard's "clock" line is toggled (see *set8042CmdData()* in [chipset.js](/modules/pcjs/lib/chipset.js)).
|
||||
when the keyboard's "clock" line is toggled (see *set8042CmdData()* in [chipset.js](/modules/pcx86/lib/chipset.js)).
|
||||
|
||||
+ The Floppy Disk Controller needed to add support for the "READ ID" command, in order for the BIOS
|
||||
+ The Floppy Drive Controller needed to add support for the "READ ID" command, in order for the BIOS
|
||||
"double-stepping" test to work (double-stepping is required on an 80-track drive when attempting to read
|
||||
a 40-track diskette).
|
||||
|
||||
+ The BIOS Diskette Reset function does something odd after resetting the Floppy Disk Controller: it
|
||||
+ The BIOS Diskette Reset function does something odd after resetting the Floppy Drive Controller: it
|
||||
issues not one but *four* "SENSE INTERRUPT STATUS" commands to the FDC, and expects each response to
|
||||
return an incrementally larger drive number. I found this a bit mystifying, considering that IBM's
|
||||
own FDC/HDC "combo card" supports a maximum of *two* diskette drives. But, there's no point arguing
|
||||
|
|
@ -32,7 +32,7 @@ with a BIOS that's almost 30 years old.
|
|||
to run SETUP after installing a second hard drive. So, when the CMOS reports only one hard drive installed,
|
||||
the BIOS probes for a second hard drive anyway, and it does so by simply writing the drive number to the ATC's
|
||||
"DRVHD" register and then immediately reading the "STATUS" register, without issuing any intervening command.
|
||||
It was an easy fix to *outATCDrvHd()* in [hdc.js](/modules/pcjs/lib/hdc.js), but I was surprised
|
||||
It was an easy fix to *outATCDrvHd()* in [hdc.js](/modules/pcx86/lib/hdc.js), but I was surprised
|
||||
to discover that the ATC had this behavior, and now I'm wondering if there are any other I/O operations
|
||||
that must immediately update the "STATUS" register.
|
||||
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ permalink: /blog/2014/10/23/
|
|||
---
|
||||
|
||||
[PCjs v1.15.6](https://github.com/jeffpar/pcjs/releases/tag/v1.15.6) is a fairly minor update that fixes a few
|
||||
Floppy Disk Controller (FDC) issues and one CPU emulation bug that prevented [PC-DOS 7.00](/disks/pc/dos/ibm/7.00/)
|
||||
Floppy Drive Controller (FDC) issues and one CPU emulation bug that prevented [PC-DOS 7.00](/disks/pcx86/dos/ibm/7.00/)
|
||||
from working properly.
|
||||
|
||||
There are also some Debugger improvements; for example, if you turn on "fdc" and "int" messages in the
|
||||
|
|
@ -19,9 +19,9 @@ PC-DOS 7.00 still can't be setup from its specially-formatted 1.84Mb
|
|||
through "PC-DOS 7.00 (Disk 5)", so your best bet is to boot from the 1.44Mb "PC-DOS 7.00 (1.44M Boot)".
|
||||
|
||||
Note that you must also use a fairly new 80286 machine configuration, like this
|
||||
[8Mhz IBM PC AT](/devices/pc/machine/5170/ega/1152kb/rev3/debugger/),
|
||||
[8Mhz IBM PC AT](/devices/pcx86/machine/5170/ega/1152kb/rev3/debugger/),
|
||||
in order to use 1.44Mb diskette images; previous models did not support 3.5-inch diskette drives, unless they had been
|
||||
retrofitted with a newer [BIOS](/devices/pc/rom/5170/).
|
||||
retrofitted with a newer [BIOS](/devices/pcx86/rom/5170/).
|
||||
|
||||
*[@jeffpar](http://twitter.com/jeffpar)*
|
||||
*October 23, 2014*
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ permalink: /blog/2014/10/28/
|
|||
|
||||
[PCjs v1.15.7](https://github.com/jeffpar/pcjs/releases/tag/v1.15.7) adds support for the
|
||||
[XDF Diskette Format](http://www.os2museum.com/wp/the-xdf-diskette-format/), which was used in
|
||||
[PC-DOS 7.00](/disks/pc/dos/ibm/7.00/).
|
||||
[PC-DOS 7.00](/disks/pcx86/dos/ibm/7.00/).
|
||||
|
||||
However, this support is referred to as "fake" XDF support, because it requires using JSON disk images created
|
||||
by DiskDump *without* the experimental "--xdf" option, which is an option that attempts to encode XDF sectors as they
|
||||
|
|
|
|||
|
|
@ -7,21 +7,21 @@ permalink: /blog/2014/12/04/
|
|||
---
|
||||
|
||||
Exciting news for OS/2 fans: PCjs (v1.16.1) is now able to run OS/2 1.0 on
|
||||
[IBM PC AT Machine Configurations](/devices/pc/machine/#model-5170-machine-configurations). This is the culmination
|
||||
[IBM PC AT Machine Configurations](/devices/pcx86/machine/#model-5170-machine-configurations). This is the culmination
|
||||
of recent work in PCjs to fully emulate the Intel 80286 processor and 16-bit protected-mode, including undocumented
|
||||
features like [LOADALL](/pubs/pc/reference/intel/80286/loadall/) and triple-fault resets.
|
||||
|
||||
For a quick demo, try the [OS/2 1.0 Debugger Disk](/disks/pc/os2/misc/1.0/88286/). In a few seconds,
|
||||
For a quick demo, try the [OS/2 1.0 Debugger Disk](/disks/pcx86/os2/misc/1.0/88286/). In a few seconds,
|
||||
you'll see a very rudimentary OS/2 shell (a slimmed-down version of the OS/2 Program Selector) that allows you to
|
||||
start the protected-mode command interpreter ("Start a Program") or the real-mode command interpreter ("command.com").
|
||||
|
||||
[<img src="/blog/images/os2-debugger.jpg" alt="OS/2 1.0 With Kernel Debugger"/>](/disks/pc/os2/misc/1.0/88286/)
|
||||
[<img src="/blog/images/os2-debugger.jpg" alt="OS/2 1.0 With Kernel Debugger"/>](/disks/pcx86/os2/misc/1.0/88286/)
|
||||
|
||||
As an added bonus, the Model 5170 machines feature two serial ports, with COM1 connected to a simulated serial
|
||||
mouse and COM2 connected to the **Control Panel** output window.
|
||||
|
||||
Once you've booted the [OS/2 1.0 Debugger Disk](/disks/pc/os2/misc/1.0/88286/) from the assortment of
|
||||
[OS/2 Prototype Disks](/disks/pc/os2/misc/), you can click on the **Control Panel** output window, press Ctrl-C, and
|
||||
Once you've booted the [OS/2 1.0 Debugger Disk](/disks/pcx86/os2/misc/1.0/88286/) from the assortment of
|
||||
[OS/2 Prototype Disks](/disks/pcx86/os2/misc/), you can click on the **Control Panel** output window, press Ctrl-C, and
|
||||
find yourself magically transported into the OS/2 Kernel Debugger. The **Control Panel** display is functioning
|
||||
as both the output window for all PCjs messages and PCjs Debugger commands, as well as a serial input/output device
|
||||
(aka "Dumb Terminal") for any software inside the machine communicating via COM2: in this case, the OS/2 Kernel Debugger.
|
||||
|
|
|
|||
|
|
@ -1,19 +1,19 @@
|
|||
---
|
||||
layout: post
|
||||
title: PCjs Uncompiled
|
||||
title: PCx86 Uncompiled
|
||||
date: 2015-01-17 11:00:00
|
||||
category: Features
|
||||
permalink: /blog/2015/01/17/
|
||||
machines:
|
||||
- type: pc
|
||||
- type: pcx86
|
||||
id: at-ega-1152k-rev3
|
||||
debugger: true
|
||||
uncompiled: true
|
||||
config: /devices/pc/machine/5170/ega/1152kb/rev3/debugger/machine.xml
|
||||
config: /devices/pcx86/machine/5170/ega/1152kb/rev3/debugger/machine.xml
|
||||
---
|
||||
|
||||
Most machines on [{{ site.pcjs.domain }}](/) run with a compiled version of PCjs, which is produced
|
||||
by running PCjs JavaScript source code through Google's Closure Compiler, yielding a smaller (minified)
|
||||
Most PCx86 machines on [{{ site.pcjs.domain }}](/) run with a compiled version of PCx86, which is produced
|
||||
by running the PCx86 JavaScript source code through Google's Closure Compiler, yielding a smaller (minified)
|
||||
version that loads and runs much faster than the original source code.
|
||||
|
||||
However, certain features are disabled in the compiled versions, including a new BACKTRACK feature that
|
||||
|
|
@ -21,7 +21,7 @@ makes it possible to track the contents of memory locations and registers back t
|
|||
or file location). Once the BACKTRACK feature is finished, it will be folded into the compiled code, but until
|
||||
then, the only way to experiment with it is by running the uncompiled code.
|
||||
|
||||
To make it easier to launch machines with uncompiled code, a PCjs machine definition can now set `uncompiled`
|
||||
To make it easier to launch machines with uncompiled code, a PCx86 machine definition can now set `uncompiled`
|
||||
to *true*, overriding the value of `site.pcjs.compiled` in **_config.yml**.
|
||||
|
||||
Here's what a typical Markdown file would look like:
|
||||
|
|
@ -30,11 +30,11 @@ Here's what a typical Markdown file would look like:
|
|||
---
|
||||
...
|
||||
machines:
|
||||
- type: pc
|
||||
- type: pcx86
|
||||
id: at-ega-1152k-rev3
|
||||
debugger: true
|
||||
uncompiled: true
|
||||
config: /devices/pc/machine/5170/ega/1152kb/rev3/debugger/backtrack/machine.xml
|
||||
config: /devices/pcx86/machine/5170/ega/1152kb/rev3/debugger/backtrack/machine.xml
|
||||
---
|
||||
...
|
||||
{% include machine.html id="at-ega-1152k-rev3" %}
|
||||
|
|
|
|||
|
|
@ -1,18 +1,18 @@
|
|||
---
|
||||
layout: post
|
||||
title: New PCjs Control Panel
|
||||
title: New PCx86 Control Panel
|
||||
date: 2015-01-28 11:00:00
|
||||
category: Control Panel
|
||||
permalink: /blog/2015/01/28/
|
||||
machines:
|
||||
- type: pc
|
||||
- type: pcx86
|
||||
id: at-ega-1152k-rev3
|
||||
debugger: true
|
||||
uncompiled: true
|
||||
config: /devices/pc/machine/5170/ega/1152kb/rev3/debugger/backtrack/machine.xml
|
||||
config: /devices/pcx86/machine/5170/ega/1152kb/rev3/debugger/backtrack/machine.xml
|
||||
---
|
||||
|
||||
A new PCjs Control Panel is under development, featuring a new "Display Panel" that will provide a variety of
|
||||
A new PCx86 Control Panel is under development, featuring a new "Display Panel" that will provide a variety of
|
||||
information about the machine, in real-time, and operate more efficiently than previous DOM-based Control Panels.
|
||||
|
||||
A preview of the layout is shown below. There's not much to see yet, as this is very much a work-in-progress.
|
||||
|
|
|
|||
|
|
@ -5,22 +5,22 @@ date: 2015-02-22 11:00:00
|
|||
category: 80386
|
||||
permalink: /blog/2015/02/22/
|
||||
machines:
|
||||
- type: pc
|
||||
- type: pcx86
|
||||
id: deskpro386
|
||||
debugger: true
|
||||
uncompiled: true
|
||||
config: /devices/pc/machine/compaq/deskpro386/ega/2048kb/debugger/machine.xml
|
||||
config: /devices/pcx86/machine/compaq/deskpro386/ega/2048kb/debugger/machine.xml
|
||||
---
|
||||
|
||||
I finally dumped the [COMPAQ DeskPro 386/16 ROMs](/devices/pc/rom/compaq/deskpro386/) from the motherboard I bought
|
||||
on ebay last year, so I'm ready to begin adding 80386 support to PCjs.
|
||||
I finally dumped the [COMPAQ DeskPro 386/16 ROMs](/devices/pcx86/rom/compaq/deskpro386/) from the motherboard I bought
|
||||
on ebay last year, so I'm ready to begin adding 80386 support to PCx86.
|
||||
|
||||
I'd also like to locate a copy of the "COMPAQ DeskPro 386 Technical Reference Guide, Volumes 1 and 2". It's not hard
|
||||
to find COMPAQ Maintenance and Service guides online, but their Technical Reference guides are much rarer, perhaps because
|
||||
they were expensive ($149) and not many were sold. Anyway, I'm hoping to either borrow or buy a copy, and then scan and
|
||||
post it.
|
||||
|
||||
A [COMPAQ DeskPro 386](/devices/pc/machine/compaq/deskpro386/ega/2048kb/debugger/) test configuration is displayed below.
|
||||
A [COMPAQ DeskPro 386](/devices/pcx86/machine/compaq/deskpro386/ega/2048kb/debugger/) test configuration is displayed below.
|
||||
The configuration doesn't run, and the debugger can't disassemble 80386-specific code yet, but this is what I will be
|
||||
using to test and debug my changes over the next few months.
|
||||
|
||||
|
|
|
|||
|
|
@ -5,22 +5,22 @@ date: 2015-04-16 11:00:00
|
|||
category: 80386
|
||||
permalink: /blog/2015/04/16/
|
||||
machines:
|
||||
- type: pc
|
||||
- type: pcx86
|
||||
id: deskpro386
|
||||
debugger: true
|
||||
uncompiled: true
|
||||
config: /devices/pc/machine/compaq/deskpro386/ega/2048kb/debugger/machine.xml
|
||||
config: /devices/pcx86/machine/compaq/deskpro386/ega/2048kb/debugger/machine.xml
|
||||
---
|
||||
|
||||
PCjs can now boot the [COMPAQ DeskPro 386/16 ROM BIOS](/devices/pc/rom/compaq/deskpro386/).
|
||||
PCx86 can now boot the [COMPAQ DeskPro 386/16 ROM BIOS](/devices/pcx86/rom/compaq/deskpro386/).
|
||||
|
||||
There's still a problem with the hard disk controller, which I haven't looked into yet,
|
||||
There's still a problem with the Hard Drive Controller, which I haven't looked into yet,
|
||||
but booting from a floppy works.
|
||||
|
||||
While working through issues with this ROM BIOS, I created some lightly-annotated
|
||||
[source code](/devices/pc/rom/compaq/deskpro386/1988-01-28/1988-01-28.asm) that can be re-assembled
|
||||
[source code](/devices/pcx86/rom/compaq/deskpro386/1988-01-28/1988-01-28.asm) that can be re-assembled
|
||||
with [NASM](http://www.nasm.us/). The initial process of creating the source code is
|
||||
explained [here](/devices/pc/rom/compaq/deskpro386/#recreating-rom-source-code).
|
||||
explained [here](/devices/pcx86/rom/compaq/deskpro386/#recreating-rom-source-code).
|
||||
|
||||
At the top of the source code, I explain a few important details about ROM addresses that
|
||||
are worth recapping here:
|
||||
|
|
@ -129,7 +129,7 @@ protected-mode with A20 disabled -- an unwise thing to do on most machines:
|
|||
mov cr0,eax ; 0000F4A4 0F2200
|
||||
jmp 0x28:xf4ac ; 0000F4A7 EAACF42800
|
||||
|
||||
Before fully understanding the DeskPro's unusual A20 management, PCjs worked around it by
|
||||
Before fully understanding the DeskPro's unusual A20 management, PCx86 worked around it by
|
||||
redirecting all A20 changes from the Bus component to the CPU component, giving the CPU first
|
||||
crack at any changes to A20. If the CPU was in real-mode, it would simply pass the A20 request
|
||||
on to the Bus. However, if the CPU was in protected-mode, it would maintain the requested
|
||||
|
|
@ -143,7 +143,7 @@ to match that of the 1st megabyte whenever A20 is disabled. I could probably ge
|
|||
only the first 64Kb of the 2nd megabyte, but until I'm actually able to run some tests on a real
|
||||
DeskPro 386, I'm going to assume COMPAQ's A20 implementation affected the entire 2nd megabyte.
|
||||
|
||||
Here's my [COMPAQ DeskPro 386/16](/devices/pc/machine/compaq/deskpro386/ega/2048kb/debugger/) test
|
||||
Here's my [COMPAQ DeskPro 386/16](/devices/pcx86/machine/compaq/deskpro386/ega/2048kb/debugger/) test
|
||||
configuration. Set a breakpoint at F000:F498 ("bp f000:f498") in the Debugger panel to see the above
|
||||
code in action. When the machine is operating in real-mode, you can use the "rp" command to dump all
|
||||
the registers, including the current base and limit values loaded into the segment registers.
|
||||
|
|
|
|||
|
|
@ -21,10 +21,10 @@ could only be used in PC, XT, and AT-compatible systems. I'll refer to it here
|
|||
The VGA ROM used here is assumed to have come from an original IBM VGA. It's unknown if IBM ever made any
|
||||
revisions to the VGA ROM. With the introduction of the PS/2 family and the VGA, IBM decided to no longer publish
|
||||
the source code for its ROMs, so I've created some assemblable source code from the IBM VGA ROM
|
||||
[here](/devices/pc/video/ibm/vga/).
|
||||
[here](/devices/pcx86/video/ibm/vga/).
|
||||
|
||||
I've finally started debugging a machine configuration that uses the IBM VGA ROM. Since the VGA and the 80386 are
|
||||
contemporaries, I'm using an [80386 machine configuration](/devices/pc/machine/compaq/deskpro386/vga/2048kb/debugger/).
|
||||
contemporaries, I'm using an [80386 machine configuration](/devices/pcx86/machine/compaq/deskpro386/vga/2048kb/debugger/).
|
||||
However, I don't expect the IBM VGA ROM to require any 80386 support or PS/2-specific features.
|
||||
|
||||
The first problem I ran into was here:
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ category: Video
|
|||
permalink: /blog/2015/06/05/
|
||||
---
|
||||
|
||||
I was playing with different video modes using this [IBM PC AT w/EGA](/devices/pc/machine/5170/ega/640kb/rev1/debugger/),
|
||||
I was playing with different video modes using this [IBM PC AT w/EGA](/devices/pcx86/machine/5170/ega/640kb/rev1/debugger/),
|
||||
and I discovered an odd problem.
|
||||
|
||||
For example, when I ran this code:
|
||||
|
|
|
|||
|
|
@ -5,17 +5,17 @@ date: 2015-07-17 11:00:00
|
|||
category: Windows 95
|
||||
permalink: /blog/2015/07/17/
|
||||
machines:
|
||||
- type: pc
|
||||
- type: pcx86
|
||||
id: deskpro386
|
||||
debugger: true
|
||||
state: /disks/pc/windows/win95/4.00.950/deskpro386.json
|
||||
config: /devices/pc/machine/compaq/deskpro386/vga/4096kb/debugger/machine.xml
|
||||
drives: '[{name:"68Mb Hard Disk",type:4,path:"http://archive.pcjs.org/disks/pc/fixed/68mb/win95.json"}]'
|
||||
state: /disks/pcx86/windows/win95/4.00.950/deskpro386.json
|
||||
config: /devices/pcx86/machine/compaq/deskpro386/vga/4096kb/debugger/machine.xml
|
||||
drives: '[{name:"68Mb Hard Disk",type:4,path:"http://archive.pcjs.org/disks/pcx86/fixed/68mb/win95.json"}]'
|
||||
autoMount: ''
|
||||
---
|
||||
|
||||
This week (July 14, 2015) was the 20th anniversary of Windows 95 RTM ("Release To Manufacturing"). So I decided to
|
||||
throw a PCjs party and try running Windows 95 Setup inside a PCjs machine for the first time.
|
||||
throw a PCjs party and try running Windows 95 Setup inside a PCx86 machine for the first time.
|
||||
|
||||
Sadly, it immediately failed:
|
||||
|
||||
|
|
@ -52,17 +52,17 @@ The failing code:
|
|||
0E36:0927 07 POP ES
|
||||
0E36:0928 C3 RET
|
||||
|
||||
was easily fixed with a change to [x86cpu.js](/modules/pcjs/lib/x86cpu.js), allowing the IOPL bits to be
|
||||
was easily fixed with a change to [x86cpu.js](/modules/pcx86/lib/x86cpu.js), allowing the IOPL bits to be
|
||||
modified in real-mode on an 80386. When I had previously tweaked setPS() to accomodate 80286/80386 discrimination
|
||||
logic in OS/2 1.0, there was no 80386 support in PCjs at that time, so it was sufficient to *never* allow the
|
||||
logic in OS/2 1.0, there was no 80386 support in PCx86 at that time, so it was sufficient to *never* allow the
|
||||
IOPL bits to be altered in real-mode.
|
||||
|
||||
The next problem was triggered by Setup's CAB ("Diamond") decompression code, which uses all 32 bits
|
||||
of the 80386's 32-bit registers. That in itself was not a problem, but by leaving stray bits in the upper halves of
|
||||
registers like EDX, it exposed a bug in the PCjs I/O instruction handlers, which neglected to mask EDX with 0xFFFF before
|
||||
registers like EDX, it exposed a bug in the PCx86 I/O instruction handlers, which neglected to mask EDX with 0xFFFF before
|
||||
performing port lookups, causing mysterious I/O failures that usually manifested themselves as hard disk I/O errors.
|
||||
|
||||
Then PCjs crashed in the middle of the decompression of the first CAB file (MINI.CAB). It turned out the stack
|
||||
Then PCx86 crashed in the middle of the decompression of the first CAB file (MINI.CAB). It turned out the stack
|
||||
had been improperly adjusted because a "RETF n" instruction mistakenly believed that a stack switch had occurred.
|
||||
This was, in fact, a left-over condition from a protected-mode stack-switch. That was easily cleared.
|
||||
|
||||
|
|
@ -75,7 +75,7 @@ fixed by flagging the opcode as genuinely invalid.
|
|||
|
||||
> SIDEBAR
|
||||
|
||||
> By default, PCjs marks opcodes as invalid *only* if they have been confirmed invalid. PCjs considers the vast
|
||||
> By default, PCx86 marks opcodes as invalid *only* if they have been confirmed invalid. PCx86 considers the vast
|
||||
majority of unused/undocumented opcodes to be merely "undefined" until I've seen them in the wild. An instruction will
|
||||
be marked invalid if I either discover that real hardware treats it as an Invalid Opcode (by throwing the exception)
|
||||
*or* that real software expects it to. For opcode 0x0F,0xFF, it was the latter.
|
||||
|
|
@ -86,9 +86,9 @@ I consider it a misnomer to refer to any invalid instruction as "undefined".
|
|||
|
||||
The other recent Windows 95 oddity I ran into was an instruction with multiple address-override (0x67) prefixes; the
|
||||
first prefix changed the instruction's addressing mode from 16-bit to 32-bit, and the second prefix changed it back to
|
||||
16-bit. PCjs should have simply ignored the second prefix.
|
||||
16-bit. PCx86 should have simply ignored the second prefix.
|
||||
|
||||
With all of the above changes in place, PCjs v1.18.4 is able to run Windows 95 Setup a bit farther, but still far from
|
||||
With all of the above changes in place, PCx86 v1.18.4 is able to run Windows 95 Setup a bit farther, but still far from
|
||||
completion. If you want to give it a spin yourself, start the machine below (click the "Run" button) and once it has
|
||||
finished booting, run SETUP from drive B, where the first Windows 95 diskette is already loaded.
|
||||
|
||||
|
|
@ -103,9 +103,9 @@ diskette.
|
|||
August 13, 2015 Update
|
||||
---
|
||||
|
||||
PCjs v1.18.8 has made a little more progress running Windows 95 Setup, but CAB decompression still fails almost
|
||||
PCx86 v1.18.8 has made a little more progress running Windows 95 Setup, but CAB decompression still fails almost
|
||||
immediately. To monitor DOS calls until the first 36-byte read of PRECOPY1.CAB, try setting the following
|
||||
breakpoint and then starting the machine, using the PCjs Debugger *input* field next to the **Enter** button:
|
||||
breakpoint and then starting the machine, using the PCx86 Debugger *input* field next to the **Enter** button:
|
||||
|
||||
m dos off
|
||||
bp 1ED4:16B4 "set fn=ah;dos;if fn!=3f||cx!=24"
|
||||
|
|
@ -113,7 +113,9 @@ breakpoint and then starting the machine, using the PCjs Debugger *input* field
|
|||
|
||||
Alternatively, you can hard-code those commands into the Debugger component of the machine.xml file; eg:
|
||||
|
||||
<debugger id="debugger" messages="fault|tss|int" commands='m dos off;bp 1ED4:16B4 "set fn=ah;dos;if fn!=3f||cx!=24"'/>
|
||||
```xml
|
||||
<debugger id="debugger" messages="fault|tss|int" commands='m dos off;bp 1ED4:16B4 "set fn=ah;dos;if fn!=3f||cx!=24"'/>
|
||||
```
|
||||
|
||||
Once the 36-byte read is hit, you'll probably want to stop on the next instruction that examine those bytes,
|
||||
by using a memory read breakpoint:
|
||||
|
|
@ -132,7 +134,7 @@ second breakpoint can check the value on exit.
|
|||
|
||||
Regarding the other Debugger commands shown above, the `dos` command describes the current DOS operation
|
||||
(alternatively, you could use the `m int on; m dos on` commands to turn on DOS interrupt messages). The `di`
|
||||
command dumps PCjs BACKTRACK(tm) information, to help you visually confirm which INT 0x21 calls are reading
|
||||
command dumps PCx86 BACKTRACK(tm) information, to help you visually confirm which INT 0x21 calls are reading
|
||||
PRECOPY1.CAB. Finally, the `if` command evaluates the given expression, and if the result is non-zero ("true"),
|
||||
all subsequent commands are executed, up to to any `else` command; otherwise, only commands after the `else`
|
||||
command will be executed, and if there is no `else` command, execution will stop.
|
||||
|
|
@ -142,17 +144,17 @@ are evaluated using traditional operator precedence (ie, the same as C or JavaSc
|
|||
parentheses, assignment operators, and unary or ternary operators, are not supported in expressions.
|
||||
|
||||
This test machine below has been updated to load WDEB386.EXE prior to starting B:SETUP.EXE, if you prefer using
|
||||
WDEB386. Make sure the machine is running (ie, click the **Run** button, or use the PCjs Debugger "g" command),
|
||||
WDEB386. Make sure the machine is running (ie, click the **Run** button, or use the PCx86 Debugger "g" command),
|
||||
and then click on the Debugger *output* control to give it focus and press CTRL-C to trigger WDEB386.
|
||||
|
||||
The Debugger *input* field is used exclusively for PCjs Debugger commands, whereas the *output* textarea combines
|
||||
all Debugger output *and* WDEB386 COM2 serial port I/O. You can even use the PCjs Debugger to debug
|
||||
The Debugger *input* field is used exclusively for PCx86 Debugger commands, whereas the *output* textarea combines
|
||||
all Debugger output *and* WDEB386 COM2 serial port I/O. You can even use the PCx86 Debugger to debug
|
||||
the WDEB386 debugger; just make sure the appropriate text control has focus before typing a command.
|
||||
|
||||
To help reduce confusion, the PCjs Debugger displays a double-character command prefix, to differentiate its commands
|
||||
To help reduce confusion, the PCx86 Debugger displays a double-character command prefix, to differentiate its commands
|
||||
from WDEB386's single-character command prompt -- but it's still easy to get confused.
|
||||
|
||||
A quick recap of those command prefixes (which you won't see until AFTER you've typed a PCjs command):
|
||||
A quick recap of those command prefixes (which you won't see until AFTER you've typed a PCx86 command):
|
||||
|
||||
* `>>` indicates real-mode
|
||||
* `##` indicates protected-mode
|
||||
|
|
@ -165,7 +167,7 @@ A quick recap of those command prefixes (which you won't see until AFTER you've
|
|||
August 21, 2015 Update
|
||||
---
|
||||
|
||||
PCjs v1.19.1 has finally solved a number of nagging bugs. The CAB decompression code itself was running
|
||||
PCx86 v1.19.1 has finally solved a number of nagging bugs. The CAB decompression code itself was running
|
||||
fine; it would crash after loading a 32-bit value into EAX *and* a timer interrupt occurred. A path
|
||||
through the interrupt handler was trashing the upper bits of EAX. The culprit: any of the MOV instructions
|
||||
that move an immediate value into one of the "high" 8-bit registers (AH, BH, CH, or DH). Those instructions
|
||||
|
|
|
|||
|
|
@ -5,11 +5,11 @@ date: 2015-09-21 11:00:00
|
|||
category: Windows 95
|
||||
permalink: /blog/2015/09/21/
|
||||
machines:
|
||||
- type: pc
|
||||
- type: pcx86
|
||||
id: deskpro386
|
||||
state: /disks/pc/windows/win95/4.00.950/deskpro386.json
|
||||
config: /devices/pc/machine/compaq/deskpro386/vga/4096kb/machine.xml
|
||||
drives: '[{name:"68Mb Hard Disk",type:4,path:"http://archive.pcjs.org/disks/pc/fixed/68mb/win95.json"}]'
|
||||
state: /disks/pcx86/windows/win95/4.00.950/deskpro386.json
|
||||
config: /devices/pcx86/machine/compaq/deskpro386/vga/4096kb/machine.xml
|
||||
drives: '[{name:"68Mb Hard Disk",type:4,path:"http://archive.pcjs.org/disks/pcx86/fixed/68mb/win95.json"}]'
|
||||
autoMount: ''
|
||||
---
|
||||
|
||||
|
|
@ -21,7 +21,7 @@ converts an immediate signed byte into a signed word. Those variations were fai
|
|||
a 16-bit operand size was in effect, and if the destination was a register, the upper 16 bits of that register
|
||||
could become corrupted.
|
||||
|
||||
The [Windows 95 Test Machine](/disks/pc/windows/win95/4.00.950/) hard disk has been updated
|
||||
The [Windows 95 Test Machine](/disks/pcx86/windows/win95/4.00.950/) hard disk has been updated
|
||||
with a complete set of Windows 95 files from a "Compact" installation, and first boot has finished, so instead
|
||||
of the initial "Getting ready to run Windows 95 for the first time..." splash screen, you'll see the normal
|
||||
Windows 95 startup screen.
|
||||
|
|
|
|||
|
|
@ -178,18 +178,24 @@ still continue to run, and if there was no multiplication problem, you would not
|
|||
PCjs v1.20.0 now supports a "stepping" attribute on the <cpu> element, which you can use to simulate specific
|
||||
stepping behavior. For example, a *machine.xml* file with the following CPU definition:
|
||||
|
||||
<cpu id="cpu386" model="80386" stepping="b0"/>
|
||||
```xml
|
||||
<cpu id="cpu386" model="80386" stepping="b0"/>
|
||||
```
|
||||
|
||||
will cause Windows 95 to abort exactly as described as above. Similarly, selecting a 80386 B1 stepping:
|
||||
|
||||
<cpu id="cpu386" model="80386" stepping="b1"/>
|
||||
```xml
|
||||
<cpu id="cpu386" model="80386" stepping="b1"/>
|
||||
```
|
||||
|
||||
will cause Windows 95 to display the 32-bit multiplication warning shown above (PCjs deliberately fails the exact
|
||||
multiplication test that Windows 95 performs).
|
||||
|
||||
If you want to simulate a B1 stepping that does *not* have the 32-bit multiplication flaw, set the stepping to B2:
|
||||
|
||||
<cpu id="cpu386" model="80386" stepping="b2"/>
|
||||
```xml
|
||||
<cpu id="cpu386" model="80386" stepping="b2"/>
|
||||
```
|
||||
|
||||
B2 was not an actual 80386 stepping; it is a *pseudo-stepping* that provides a simple way of specifying a B1 80386 that
|
||||
passes all 32-bit multiplication tests.
|
||||
|
|
|
|||
|
|
@ -50,7 +50,7 @@ and the following "Front Matter" (YAML) must appear at the top of the Markdown f
|
|||
---
|
||||
...
|
||||
machines:
|
||||
- type: pc
|
||||
- type: pcx86
|
||||
id: ibm5150
|
||||
---
|
||||
|
||||
|
|
@ -74,13 +74,13 @@ You may also use `config` to specify a machine XML configuration file if not usi
|
|||
a JSON-encoded machine state file if the machine requires a predefined state; and `uncompiled` may be set to *true*
|
||||
to force a machine to use uncompiled sources, overriding the value of `site.pcjs.compiled` in **_config.yml**.
|
||||
|
||||
For example, the PCjs Home page contains two machines, so this appears at the top of the
|
||||
For example, the PCjs home page contains two machines, so this appears at the top of the
|
||||
[Markdown file](https://raw.githubusercontent.com/jeffpar/pcjs/master/index.md):
|
||||
|
||||
machines:
|
||||
- type: pc
|
||||
- type: pcx86
|
||||
id: ibm5150
|
||||
config: /devices/pc/machine/5150/mda/64kb/machine.xml
|
||||
config: /devices/pcx86/machine/5150/mda/64kb/machine.xml
|
||||
- type: c1p
|
||||
id: demoC1P
|
||||
config: /devices/c1p/machine/8kb/large/machine.xml
|
||||
|
|
@ -89,13 +89,13 @@ If necessary, you can also override some of the settings in a machine XML file.
|
|||
FDC `autoMount` setting, making it easy to reuse the same machine XML file with different boot disks:
|
||||
|
||||
machines:
|
||||
- type: pc
|
||||
- type: pcx86
|
||||
id: deskpro386
|
||||
debugger: true
|
||||
autoMount:
|
||||
A:
|
||||
path: /disks/pc/os2/misc/football/FOOTBALL-76817.json
|
||||
config: /devices/pc/machine/compaq/deskpro386/ega/4096kb/debugger/machine.xml
|
||||
path: /disks/pcx86/os2/misc/football/FOOTBALL-76817.json
|
||||
config: /devices/pcx86/machine/compaq/deskpro386/ega/4096kb/debugger/machine.xml
|
||||
|
||||
Other settings that can currently be overridden include:
|
||||
|
||||
|
|
@ -104,11 +104,11 @@ Other settings that can currently be overridden include:
|
|||
+ `messages`
|
||||
+ `state`
|
||||
|
||||
Additional overrides will be added as needed. See the [Windows 95 Demo](/disks/pc/windows/win95/4.00.950/)
|
||||
machine and its associated [Markdown file](https://raw.githubusercontent.com/jeffpar/pcjs/master/disks/pc/windows/win95/4.00.950/README.md)
|
||||
Additional overrides will be added as needed. See the [Windows 95 Demo](/disks/pcx86/windows/win95/4.00.950/)
|
||||
machine and its associated [Markdown file](https://raw.githubusercontent.com/jeffpar/pcjs/master/disks/pcx86/windows/win95/4.00.950/README.md)
|
||||
for more override examples, including how to set `autoMount` to *not* mount any diskettes.
|
||||
|
||||
I will continue to include a Node web server with the PCjs project, but it's now intended for development
|
||||
I will continue to include a Node web server with the PCjs Project, but it's now intended for development
|
||||
purposes only (not production servers). I've updated the PCjs MarkOut component to parse any "Front Matter"
|
||||
at the top of the PCjs Markdown files, and to convert all new Jekyll-style embedded machines and screenshots
|
||||
to the older Markdown-compatible formats, so pages generated by the Node web server should still function
|
||||
|
|
|
|||
|
|
@ -5,23 +5,23 @@ date: 2015-12-27 11:00:00
|
|||
category: OS/2
|
||||
permalink: /blog/2015/12/27/
|
||||
machines:
|
||||
- type: pc
|
||||
- type: pcx86
|
||||
id: ibm5170
|
||||
debugger: true
|
||||
config: /devices/pc/machine/5170/ega/2048kb/rev3/debugger/machine.xml
|
||||
drives: '[{name:"20Mb Hard Disk",type:2,path:"/disks/pc/fixed/20mb/IBMOS210-EGA.json"}]'
|
||||
config: /devices/pcx86/machine/5170/ega/2048kb/rev3/debugger/machine.xml
|
||||
drives: '[{name:"20Mb Hard Disk",type:2,path:"/disks/pcx86/fixed/20mb/IBMOS210-EGA.json"}]'
|
||||
automount: ''
|
||||
---
|
||||
|
||||
Just for fun (because I have a warped sense of fun), I decided to revisit some of the old OS/2 software I wrote
|
||||
almost 30 years ago. But first, I needed an OS/2 development environment.
|
||||
|
||||
So I started with a clean install of [IBM OS/2 1.0](/disks/pc/os2/ibm/1.0/) in the 8Mhz IBM PC AT machine
|
||||
So I started with a clean install of [IBM OS/2 1.0](/disks/pcx86/os2/ibm/1.0/) in the 8Mhz IBM PC AT machine
|
||||
below, by booting from the "IBM OS/2 1.0 (1.44M Install)" diskette in drive A and reformatting the machine's 20Mb
|
||||
drive C.
|
||||
|
||||
Next, I installed the [MS OS/2 SDK 1.02](/disks/pc/tools/microsoft/os2/sdk/1.02/). This SDK was released
|
||||
in December 1987 along with [Microsoft OS/2 1.0](/disks/pc/os2/microsoft/1.0/). I don't have any of the
|
||||
Next, I installed the [MS OS/2 SDK 1.02](/disks/pcx86/tools/microsoft/os2/sdk/1.02/). This SDK was released
|
||||
in December 1987 along with [Microsoft OS/2 1.0](/disks/pcx86/os2/microsoft/1.0/). I don't have any of the
|
||||
printed documentation that came with the SDK, such as the *Installation Guide*, but I do have the
|
||||
[Microsoft® Operating System/2 Programmer’s Toolkit](/pubs/pc/software/os2/microsoft/ptk10/) documentation
|
||||
from March 1988, thanks to the [OS/2 Museum](http://www.os2museum.com/wp/os2-history/os2-library/os2-1-x-programming/).
|
||||
|
|
@ -35,11 +35,11 @@ into **Programmer's Workbench** (PWB), the text-mode Integrated Development Envi
|
|||
|
||||
With the introduction of graphical IDEs, such as Visual BASIC in 1991, Visual C++ in 1993, and Visual Studio in 1995,
|
||||
this stand-alone, text-mode editor became obsolete, but in the 1980s, it was a valuable tool. You can learn more
|
||||
about [SDKED](/disks/pc/tools/microsoft/os2/sdk/1.02/#using-sdked) on the
|
||||
[MS OS/2 SDK 1.02](/disks/pc/tools/microsoft/os2/sdk/1.02/) page.
|
||||
about [SDKED](/disks/pcx86/tools/microsoft/os2/sdk/1.02/#using-sdked) on the
|
||||
[MS OS/2 SDK 1.02](/disks/pcx86/tools/microsoft/os2/sdk/1.02/) page.
|
||||
|
||||
Our [IBM OS/2 1.0](/disks/pc/os2/ibm/1.0/) demo machine (shown below) has the
|
||||
[MS OS/2 SDK 1.02](/disks/pc/tools/microsoft/os2/sdk/1.02/) pre-installed, so check out our copy of the
|
||||
Our [IBM OS/2 1.0](/disks/pcx86/os2/ibm/1.0/) demo machine (shown below) has the
|
||||
[MS OS/2 SDK 1.02](/disks/pcx86/tools/microsoft/os2/sdk/1.02/) pre-installed, so check out our copy of the
|
||||
[Microsoft® Operating System/2 Programmer’s Toolkit](/pubs/pc/software/os2/microsoft/ptk10/) and then write some code!
|
||||
|
||||
{% include machine.html id="ibm5170" %}
|
||||
|
|
|
|||
|
|
@ -15,9 +15,9 @@ performance improvements were tested before being merged back into the main bran
|
|||
Another branch was **FOOTBALL** (aka **PIGSKIN**), an early 80386-based prototype intended to test the viability
|
||||
of the running multiple DOS applications in V86-mode. Sometimes this 80386 version was also called **386DOS**,
|
||||
to distinguish it from **286DOS**. More details are in this
|
||||
[FOOTBALL Design Document](/disks/pc/os2/misc/football/87058/#football-design-document).
|
||||
[FOOTBALL Design Document](/disks/pcx86/os2/misc/football/87058/#football-design-document).
|
||||
|
||||
To shed some light on those efforts, I recently added a few [OS/2 Prototype Disks](/disks/pc/os2/misc/): a small
|
||||
To shed some light on those efforts, I recently added a few [OS/2 Prototype Disks](/disks/pcx86/os2/misc/): a small
|
||||
collection of early (mostly pre-1.0) OS/2 boot disks that provide a glimpse of what some of those early OS/2 builds
|
||||
looked like.
|
||||
|
||||
|
|
@ -25,7 +25,7 @@ Getting these early versions of OS/2 to run in **PCjs** has been a bit of a chal
|
|||
but also some lingering issues. Debugging continues.
|
||||
|
||||
Part of the problem is that these pre-1.0 builds still contain a few bugs. Also, the original
|
||||
[OS/2 FOOTBALL Boot Disk](/disks/pc/os2/misc/football/87058/) from February 1987 was developed and
|
||||
[OS/2 FOOTBALL Boot Disk](/disks/pcx86/os2/misc/football/87058/) from February 1987 was developed and
|
||||
tested exclusively on Compaq DeskPro 386 machines from late 1986, so it has some uncommon 80386 dependencies:
|
||||
|
||||
* The [80386 LOADALL](/pubs/pc/reference/intel/80386/loadall/) instruction
|
||||
|
|
|
|||
|
|
@ -6,14 +6,14 @@ permalink: /blog/2016/02/08/
|
|||
---
|
||||
|
||||
The new release of PCjs (v1.20.8) is a fairly minor update, but it's an important one for **FOOTBALL** fans, resolving
|
||||
two annoying problems with the [OS/2 FOOTBALL Boot Disk](/disks/pc/os2/misc/football/87058/): mysterious hard-error popups
|
||||
two annoying problems with the [OS/2 FOOTBALL Boot Disk](/disks/pcx86/os2/misc/football/87058/): mysterious hard-error popups
|
||||
and blank screens.
|
||||
|
||||
A hard-error popup would occur when FOOTBALL tried to initialize a non-existent PRN device. To resolve that, PCjs
|
||||
now provides basic parallel port emulation, in the form of a [ParallelPort](/docs/pcjs/parallel/) component that you
|
||||
now provides basic parallel port emulation, in the form of a [ParallelPort](/docs/pcx86/parallel/) component that you
|
||||
include in a machine XML file with the <parallel> element, in much the same way you include the
|
||||
[SerialPort](/docs/pcjs/serial/) component with the <serial> element. This [Compaq DeskPro 386]
|
||||
(/devices/pc/machine/compaq/deskpro386/ega/4096kb/debugger/) machine used to run FOOTBALL has now been updated to
|
||||
[SerialPort](/docs/pcx86/serial/) component with the <serial> element. This [Compaq DeskPro 386]
|
||||
(/devices/pcx86/machine/compaq/deskpro386/ega/4096kb/debugger/) machine used to run FOOTBALL has now been updated to
|
||||
include one parallel port.
|
||||
|
||||
The other problem was that switching between sessions with the **SysReq** key would often result in a blank screen;
|
||||
|
|
@ -23,21 +23,21 @@ exposed a PCjs memory-management bug. The upshot is that whenever the Video com
|
|||
buffer (which is *physical* memory), it must tell the CPU to flush any linear-to-physical mappings that may still refer
|
||||
to the old physical memory.
|
||||
|
||||
With these changes, the [OS/2 FOOTBALL Boot Disk](/disks/pc/os2/misc/football/87058/) appears to be quite usable now.
|
||||
With these changes, the [OS/2 FOOTBALL Boot Disk](/disks/pcx86/os2/misc/football/87058/) appears to be quite usable now.
|
||||
Feel free to give it a few kicks!
|
||||
|
||||
---
|
||||
|
||||
I've also tidied up a few things in the [Devices](/devices/) folder. ROM images used to be stored under
|
||||
`/devices/pc/basic/` and `/devices/pc/bios/`, but BASIC and BIOS ROM images aren't actually devices; they are the
|
||||
`/devices/pcx86/basic/` and `/devices/pcx86/bios/`, but BASIC and BIOS ROM images aren't actually devices; they are the
|
||||
*contents* of ROM devices. So, with that in mind, I've made the following rearrangements:
|
||||
|
||||
* `/devices/pc/bios/5150/*` => `/devices/pc/rom/5150/*`
|
||||
* `/devices/pc/bios/5160/*` => `/devices/pc/rom/5160/*`
|
||||
* `/devices/pc/bios/5170/*` => `/devices/pc/rom/5170/*`
|
||||
* `/devices/pc/bios/compaq/*` => `/devices/pc/rom/compaq/*`
|
||||
* `/devices/pc/basic/ibm-basic-1.00.json` => `/devices/pc/rom/5150/basic/BASIC100.json`
|
||||
* `/devices/pc/basic/ibm-basic-1.10.json` => `/devices/pc/rom/5160/basic/BASIC110.json`
|
||||
* `/devices/pcx86/bios/5150/*` => `/devices/pcx86/rom/5150/*`
|
||||
* `/devices/pcx86/bios/5160/*` => `/devices/pcx86/rom/5160/*`
|
||||
* `/devices/pcx86/bios/5170/*` => `/devices/pcx86/rom/5170/*`
|
||||
* `/devices/pcx86/bios/compaq/*` => `/devices/pcx86/rom/compaq/*`
|
||||
* `/devices/pcx86/basic/ibm-basic-1.00.json` => `/devices/pcx86/rom/5150/basic/BASIC100.json`
|
||||
* `/devices/pcx86/basic/ibm-basic-1.10.json` => `/devices/pcx86/rom/5160/basic/BASIC110.json`
|
||||
|
||||
This structure mirrors what was done with Machine and Video devices, where the devices are organized
|
||||
first by manufacturer (IBM or COMPAQ) and then by type (MDA, CGA, EGA, etc).
|
||||
|
|
@ -48,7 +48,7 @@ for example, models 5150 through 5170 refer to IBM PC models.
|
|||
---
|
||||
|
||||
The project currently includes only two BASIC ROM versions, C1.00 and C1.10, which were initially released with the
|
||||
first model 5150 and 5160 machines, respectively. For more details, see [IBM PC ROMs](/devices/pc/rom/).
|
||||
first model 5150 and 5160 machines, respectively. For more details, see [IBM PC ROMs](/devices/pcx86/rom/).
|
||||
|
||||
I believe there was also a BASIC ROM version 1.20 released for IBM PCjr, but since PCjs does not yet emulate the PCjr,
|
||||
it has not been added to the project.
|
||||
|
|
|
|||
|
|
@ -5,9 +5,9 @@ date: 2016-02-17 14:00:00
|
|||
permalink: /blog/2016/02/17/
|
||||
---
|
||||
|
||||
PCjs (v1.20.9) now offers new, *much* easier ways to save disks and machines, thanks to the new
|
||||
PCx86 (v1.20.9) now offers new, *much* easier ways to save disks and machines, thanks to the new
|
||||
[Save Disk](/blog/2016/02/17/#saving-disks) and [Save Machine](/blog/2016/02/17/#saving-machines) features.
|
||||
With one click, PCjs can now generate a single download containing everything you need to embed any of our
|
||||
With one click, PCx86 can now generate a single download containing everything you need to embed any of our
|
||||
IBM PC demos on your own web page.
|
||||
|
||||
Saving Disks
|
||||
|
|
@ -18,7 +18,7 @@ to the floppy disk controls. Select the drive first, and then whatever diskette
|
|||
in that drive will be saved in your local machine's Downloads folder when you click **Save**.
|
||||
|
||||
If you made any changes to that disk after it was loaded, those changes will be included, so if you want a pristine
|
||||
copy of the disk, click the **Load** button first. PCjs will ask you to confirm that you really want to reload the
|
||||
copy of the disk, click the **Load** button first. PCx86 will ask you to confirm that you really want to reload the
|
||||
disk and discard any changes.
|
||||
|
||||
Note that the disk *should* be downloaded as an **.img** file, which is nothing more than a sector-by-sector binary
|
||||
|
|
@ -41,7 +41,7 @@ in your Downloads folder, so the OS X Terminal command `chmod -w PCDOS200-DISK1.
|
|||
`chmod +w PCDOS200-DISK1.img` will make it writable again.
|
||||
|
||||
**NOTE**: Some browsers, notably Safari, do not support named downloads, so any disks you download will end up
|
||||
with default names like "Unknown" or "download". PCjs will still try to let you know what the original filename was,
|
||||
with default names like "Unknown" or "download". PCx86 will still try to let you know what the original filename was,
|
||||
so that you can rename it appropriately.
|
||||
|
||||
Saving Machines
|
||||
|
|
@ -52,46 +52,46 @@ You can choose to save a machine in its initial state, or make changes to any of
|
|||
All your changes should be preserved.
|
||||
|
||||
Under the bottom-left corner of any IBM PC on the PCjs [website](/), you should now see a
|
||||
[**Save Machine**] link. When you click that link, PCjs will generate a large chunk of JavaScript containing
|
||||
[**Save Machine**] link. When you click that link, PCx86 will generate a large chunk of JavaScript containing
|
||||
everything that machine needs to run, including:
|
||||
|
||||
* The machine XML configuration file (eg, "machine.xml")
|
||||
* The machine XSL transformation file (eg, "components.xsl")
|
||||
* The machine CSS stylesheet file (eg, "components.css")
|
||||
* The machine state file (eg, "state.json")
|
||||
* The PCjs machine emulation script (eg, "pc.js")
|
||||
* The PCx86 machine emulation script (eg, "pcx86.js")
|
||||
* Copies of all the disk images mounted by the machine
|
||||
|
||||
Let's say you want to save the IBM PC on the PCjs [home page](/). When you click **Save Machine**, two things should
|
||||
Let's say you want to save the IBM PC on the PCx86 [home page](/). When you click **Save Machine**, two things should
|
||||
happen:
|
||||
|
||||
* A file will be downloaded (eg, "pc.js")
|
||||
* A file will be downloaded (eg, "pcx86.js")
|
||||
* A dialog box will appear with some markup to copy-and-paste
|
||||
|
||||
The dialog box should provide the following information:
|
||||
|
||||
Check your Downloads folder for "pc.js", copy it to your web server as "pc.js",
|
||||
Check your Downloads folder for "pcx86.js", copy it to your web server as "pcx86.js",
|
||||
and then add the following to your web page:
|
||||
|
||||
<div id="ibm5150"></div>
|
||||
...
|
||||
<script type="text/javascript" src="pc.js"></script>
|
||||
<script type="text/javascript">embedPC("ibm5150","machine.xml","components.xsl");</script>
|
||||
<div id="ibm5150"></div>
|
||||
...
|
||||
<script type="text/javascript" src="pcx86.js"></script>
|
||||
<script type="text/javascript">embedPC("ibm5150","machine.xml","components.xsl");</script>
|
||||
|
||||
The machine should appear where the <div> is located.
|
||||
|
||||
Copy the downloaded file to your own web server as **pc.js**, then create or edit a web page and insert the above text.
|
||||
If **pc.js** and your web page are in different folders, then you'll also need to update *src* to include the exact
|
||||
Copy the downloaded file to your own web server as **pcx86.js**, then create or edit a web page and insert the above text.
|
||||
If **pcx86.js** and your web page are in different folders, then you'll also need to update *src* to include the exact
|
||||
location of the script.
|
||||
|
||||
Some notes:
|
||||
|
||||
* PCjs may attempt to name the downloaded file **pc.json** instead of **pc.js**, because a file with a ".js"
|
||||
* PCx86 may attempt to name the downloaded file **pcx86.json** instead of **pcx86.js**, because a file with a ".js"
|
||||
extension could cause your web browser to block the download.
|
||||
|
||||
* For browsers that don't support named downloads, PCjs will attempt to open a new window/tab instead. Make sure
|
||||
you copy the *entire* contents of that window into a file named to **pc.js** (or **pc-dbg.js** if the machine is
|
||||
using the built-in PCjs debugger).
|
||||
* For browsers that don't support named downloads, PCx86 will attempt to open a new window/tab instead. Make sure
|
||||
you copy the *entire* contents of that window into a file named to **pcx86.js** (or **pcx86-dbg.js** if the machine is
|
||||
using the built-in PCx86 debugger).
|
||||
|
||||
* Your browser may also impose size limitations on the download. If nothing happens, the machine data may be too
|
||||
large for your browser; try a different browser (eg, Firefox or Safari) or a different machine.
|
||||
|
|
@ -111,9 +111,11 @@ Some notes:
|
|||
it was saved. This behavior, however, can be disabled by passing a *parms* object as the 4th parameter to the
|
||||
*embedPC()* call, overriding the 'state' property:
|
||||
|
||||
<script type="text/javascript">embedPC("ibm5150","machine.xml","components.xsl","{state:null}");</script>
|
||||
```xml
|
||||
<script type="text/javascript">embedPC("ibm5150","machine.xml","components.xsl","{state:null}");</script>
|
||||
```
|
||||
|
||||
While the [PCjs Documentation](/docs/pcjs/) explains how to create a *new* machine, by writing your own machine
|
||||
While the [PCx86 Documentation](/docs/pcx86/) explains how to create a *new* machine, by writing your own machine
|
||||
XML file and manually copying all the other pieces, the new **Save Machine** feature is the best way to save
|
||||
any *existing* IBM PC and embed it on any other website.
|
||||
|
||||
|
|
|
|||
|
|
@ -50,12 +50,12 @@ all we have are the memories.
|
|||
### Speaking of Memories
|
||||
|
||||
In particular, Read-Only Memories: we have precious few of those, too. I finally obtained
|
||||
a [ROM Dump](/devices/pc/rom/compaq/portable/) from COMPAQ's first machine, the COMPAQ Portable, but I had to buy
|
||||
a [ROM Dump](/devices/pcx86/rom/compaq/portable/) from COMPAQ's first machine, the COMPAQ Portable, but I had to buy
|
||||
a system board on ebay to get it. Considering all the effort (and money) that COMPAQ invested in writing that code,
|
||||
it's a bit depressing that these things haven't been properly preserved and memorialized.
|
||||
|
||||
Looking ahead to the day when PCjs will be able to simulate the original COMPAQ Portable, I thought it would be a good
|
||||
idea to create my own roughly chronological list of [COMPAQ Machines](/devices/pc/machine/compaq/) from the 1980s,
|
||||
idea to create my own roughly chronological list of [COMPAQ Machines](/devices/pcx86/machine/compaq/) from the 1980s,
|
||||
since they are all machines I would like to see PCjs eventually support:
|
||||
|
||||
- COMPAQ Portable
|
||||
|
|
@ -64,7 +64,7 @@ since they are all machines I would like to see PCjs eventually support:
|
|||
- COMPAQ DeskPro 286
|
||||
- COMPAQ Portable 286
|
||||
- COMPAQ Portable II
|
||||
- [COMPAQ DeskPro 386](/devices/pc/machine/compaq/deskpro386/)
|
||||
- [COMPAQ DeskPro 386](/devices/pcx86/machine/compaq/deskpro386/)
|
||||
- COMPAQ Portable III
|
||||
- COMPAQ DeskPro 386/20
|
||||
- COMPAQ Portable 386
|
||||
|
|
@ -82,8 +82,8 @@ and LTE Lite series. But I think I need to stick to my original plan and draw a
|
|||
|
||||
As best I can tell, COMPAQ preferred to print its company name in all-caps, so that's my practice as well.
|
||||
|
||||
However, it seems that sometime between the release of [COMPAQ MS-DOS 3.10](/disks/pc/dos/compaq/3.10/) and
|
||||
[COMPAQ MS-DOS 3.31](/disks/pc/dos/compaq/3.31/), there may have been a shift in policy. Both products still
|
||||
However, it seems that sometime between the release of [COMPAQ MS-DOS 3.10](/disks/pcx86/dos/compaq/3.10/) and
|
||||
[COMPAQ MS-DOS 3.31](/disks/pcx86/dos/compaq/3.31/), there may have been a shift in policy. Both products still
|
||||
called themselves `The COMPAQ Personal Computer MS-DOS`, but in 3.31, the copyright string changed to
|
||||
`Compaq Computer Corp.`
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ date: 2016-03-06 09:00:00
|
|||
permalink: /blog/2016/03/06/
|
||||
---
|
||||
|
||||
Yesterday, I fired up [Windows 3.1](/disks/pc/windows/3.10/) and played a complete game of
|
||||
Yesterday, I fired up [Windows 3.1](/disks/pcx86/windows/3.10/) and played a complete game of
|
||||
[Windows Solitaire](https://en.wikipedia.org/wiki/Microsoft_Solitaire) on my iPad. It was a bit, um, touchy,
|
||||
but it worked.
|
||||
|
||||
|
|
|
|||
|
|
@ -6,15 +6,15 @@ permalink: /blog/2016/03/12/
|
|||
---
|
||||
|
||||
I recently added some more demos to the PCjs Project, to showcase its ability to run old 80286-based and
|
||||
80386-based software, such as [Windows/386](/disks/pc/windows/2.0x/), [Windows 3.0](/disks/pc/windows/3.00/),
|
||||
[Windows 3.1](/disks/pc/windows/3.10/), and [Windows 95](/disks/pc/windows/win95/4.00.950/).
|
||||
80386-based software, such as [Windows/386](/disks/pcx86/windows/2.0x/), [Windows 3.0](/disks/pcx86/windows/3.00/),
|
||||
[Windows 3.1](/disks/pcx86/windows/3.10/), and [Windows 95](/disks/pcx86/windows/win95/4.00.950/).
|
||||
|
||||
{% include screenshot.html src="/disks/pc/windows/2.0x/thumbnail.jpg" width="200" height="120" title="COMPAQ DeskPro 386, Windows/386 2.01" link="/disks/pc/windows/2.0x/" %}
|
||||
{% include screenshot.html src="/disks/pc/windows/3.00/thumbnail.jpg" width="200" height="120" title="IBM PC AT w/EGA, Windows 3.00" link="/disks/pc/windows/3.00/" %}
|
||||
{% include screenshot.html src="/disks/pc/windows/3.10/thumbnail.jpg" width="200" height="120" title="IBM PC AT w/VGA, Windows 3.10" link="/disks/pc/windows/3.10/" %}
|
||||
{% include screenshot.html src="/disks/pc/windows/win95/4.00.950/thumbnail.jpg" width="200" height="120" title="COMPAQ DeskPro 386, Windows 95" link="/disks/pc/windows/win95/4.00.950/" %}
|
||||
{% 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/" %}
|
||||
|
||||
As the [OS/2 Museum](http://www.os2museum.com/wp/windows386-2-01/) points out, [Windows/386 2.01](/disks/pc/windows/2.0x/)
|
||||
As the [OS/2 Museum](http://www.os2museum.com/wp/windows386-2-01/) points out, [Windows/386 2.01](/disks/pcx86/windows/2.0x/)
|
||||
was the first Microsoft product to specifically target the 80386. However, not only was it *not* a 32-bit operating
|
||||
system, it didn't even run Windows applications in protected-mode. Windows apps ran in V86-mode, and even then, *only*
|
||||
if you started Windows by running `WIN386.EXE`.
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ permalink: /blog/2016/05/04/
|
|||
This was the week of The Sharpening.
|
||||
|
||||
A while back, I updated most of the machines to use higher-resolution "screens". For example, a typical
|
||||
[EGA video configuration](/devices/pc/video/ibm/ega/1984-09-13/128kb-autolockfs.xml) now specifies a *screenWidth*
|
||||
[EGA video configuration](/devices/pcx86/video/ibm/ega/1984-09-13/128kb-autolockfs.xml) now specifies a *screenWidth*
|
||||
of 1280 and *screenHeight* of 700, dimensions which are exactly twice the standard EGA resolution.
|
||||
|
||||
That change had no effect on the machine's operation, but it did improve the machine's appearance, because
|
||||
|
|
@ -16,8 +16,8 @@ most people are using much higher resolution monitors today, so by using a highe
|
|||
less interpolation is happening when a machine's screen image is scaled up to fill your browser window.
|
||||
|
||||
The amount of scaling *also* depends on whether the machine allows itself to be stretched to fill the browser window.
|
||||
For example, this [machine](/devices/pc/machine/5160/ega/640kb/array/machine.xml) (used by the
|
||||
[EGA Machine Array Demo](/devices/pc/machine/5160/ega/640kb/array/)) is limited to an overall *width* of 680 pixels,
|
||||
For example, this [machine](/devices/pcx86/machine/5160/ega/640kb/array/machine.xml) (used by the
|
||||
[EGA Machine Array Demo](/devices/pcx86/machine/5160/ega/640kb/array/)) is limited to an overall *width* of 680 pixels,
|
||||
no matter how large you make your browser window:
|
||||
|
||||
```xml
|
||||
|
|
@ -46,7 +46,7 @@ All the browsers I've tested so far (Chrome, Firefox, and Safari) support a
|
|||
which eliminates much of the fuzziness that would occur when copying pixels from the lower-resolution *buffer* canvas
|
||||
to the higher-resolution *screen* canvas.
|
||||
|
||||
So I've added a new [Video](/docs/pcjs/video/) property named *smoothing* that can be set to "true" or "false",
|
||||
So I've added a new [Video](/docs/pcx86/video/) property named *smoothing* that can be set to "true" or "false",
|
||||
and I've set it to "false" for most machines in the project. If *smoothing* is not set, your browser continues to
|
||||
use its default interpolation method.
|
||||
|
||||
|
|
@ -66,7 +66,7 @@ while the right one does not.
|
|||
Aspect Ratio
|
||||
---
|
||||
|
||||
The *smoothing* property joins another recent [Video](/docs/pcjs/video/) property, *aspect*, that was added in a
|
||||
The *smoothing* property joins another recent [Video](/docs/pcx86/video/) property, *aspect*, that was added in a
|
||||
[release](https://github.com/jeffpar/pcjs/releases/tag/v1.21.5) last month.
|
||||
|
||||
To recap, aspect ratio is display width divided by display height, but the choice of aspect ratio is complicated by
|
||||
|
|
@ -79,7 +79,7 @@ containing one or more PCjs machines.
|
|||
|
||||
For example:
|
||||
|
||||
http://www.pcjs.org/disks/pc/dos/ibm/1.00/?aspect=2.0
|
||||
http://www.pcjs.org/disks/pcx86/dos/ibm/1.00/?aspect=2.0
|
||||
|
||||
will modify the height of the machine's screen to conform to the requested aspect ratio of 2.0. The screen should still
|
||||
be responsive to any browser resizing while still retaining that aspect ratio.
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ scripts: # the following list of scripts should mirror what /modules/diskdump/li
|
|||
- /modules/shared/lib/diskapi.js
|
||||
- /modules/shared/lib/dumpapi.js
|
||||
- /modules/shared/lib/component.js
|
||||
- /modules/pcjs/lib/x86.js
|
||||
- /modules/pcx86/lib/x86.js
|
||||
- /modules/diskdump/lib/diskdump.js
|
||||
---
|
||||
|
||||
|
|
|
|||
116
apps/README.md
116
apps/README.md
|
|
@ -8,7 +8,7 @@ Application Archives
|
|||
---
|
||||
Browse classic application software for the following machines:
|
||||
|
||||
- [IBM PC](pc/)
|
||||
- [IBM PC](pcx86/)
|
||||
- [Challenger 1P](c1p/)
|
||||
|
||||
### Software Application Manifests
|
||||
|
|
@ -34,47 +34,53 @@ the following information about the software:
|
|||
- Disk(s) (one or more entries describing sets of files and/or disk images)
|
||||
|
||||
The distinctions made by Type and Category are a bit arbitrary and likely to change. For now,
|
||||
Type is merely a reflection of how we initially filed the original [disks](/disks/pc/), while Category
|
||||
Type is merely a reflection of how we initially filed the original [disks](/disks/pcx86/), while Category
|
||||
provides more detail.
|
||||
|
||||
### Example: VisiCalc
|
||||
|
||||
VisiCalc is stored in an [/apps folder](/apps/pc/1981/visicalc/), and two relevant files are
|
||||
described by <file> entries in its [manifest](/apps/pc/1981/visicalc/manifest.xml):
|
||||
VisiCalc is stored in an [/apps folder](/apps/pcx86/1981/visicalc/), and two relevant files are
|
||||
described by <file> entries in its [manifest](/apps/pcx86/1981/visicalc/manifest.xml):
|
||||
|
||||
<manifest>
|
||||
<title>VisiCalc</title>
|
||||
<version>VC-176Y2-IBM-TEST</version>
|
||||
<type>Application</type>
|
||||
<category>Productivity</category>
|
||||
<company>Software Arts</company>
|
||||
<releaseDate>December 16, 1981</releaseDate>
|
||||
<machine href="/devices/pc/machine/5150/mda/64kb/machine.xml" state="/apps/pc/1981/visicalc/state.json"/>
|
||||
<disk id="disk" dir="/apps/pc/1981/visicalc/bin/">
|
||||
<file>VC.COM</file>
|
||||
<file dir="../">README.md</file>
|
||||
<link href="http://www.bricklin.com/history/vclicense.htm">VisiCalc License</link>
|
||||
</disk>
|
||||
</manifest>
|
||||
```xml
|
||||
<manifest>
|
||||
<title>VisiCalc</title>
|
||||
<version>VC-176Y2-IBM-TEST</version>
|
||||
<type>Application</type>
|
||||
<category>Productivity</category>
|
||||
<company>Software Arts</company>
|
||||
<releaseDate>December 16, 1981</releaseDate>
|
||||
<machine href="/devices/pcx86/machine/5150/mda/64kb/machine.xml" state="/apps/pcx86/1981/visicalc/state.json"/>
|
||||
<disk id="disk" dir="/apps/pcx86/1981/visicalc/bin/">
|
||||
<file>VC.COM</file>
|
||||
<file dir="../">README.md</file>
|
||||
<link href="http://www.bricklin.com/history/vclicense.htm">VisiCalc License</link>
|
||||
</disk>
|
||||
</manifest>
|
||||
```
|
||||
|
||||
Since this [manifest](/apps/pc/1981/visicalc/manifest.xml) also contains a <machine> entry,
|
||||
Since this [manifest](/apps/pcx86/1981/visicalc/manifest.xml) also contains a <machine> entry,
|
||||
the default manifest stylesheet will automatically load and launch the associated
|
||||
[PCjs machine](/devices/pc/machine/5150/mda/64kb/machine.xml). The machine will boot or resume according
|
||||
to its own <[computer](/docs/pcjs/computer/)> settings, unless the manifest overrides the machine's
|
||||
[PCjs machine](/devices/pcx86/machine/5150/mda/64kb/machine.xml). The machine will boot or resume according
|
||||
to its own <[computer](/docs/pcx86/computer/)> settings, unless the manifest overrides the machine's
|
||||
default state with its own *state* setting; eg:
|
||||
|
||||
<machine href="/devices/pc/machine/5150/mda/64kb/machine.xml" state="/apps/pc/1981/visicalc/state.json"/>
|
||||
```xml
|
||||
<machine href="/devices/pcx86/machine/5150/mda/64kb/machine.xml" state="/apps/pcx86/1981/visicalc/state.json"/>
|
||||
```
|
||||
|
||||
The machine.xml file, in turn, refers to a [sample set](/disks/pc/samples.xml) of disk images, one of which is:
|
||||
The machine.xml file, in turn, refers to a [sample set](/disks/pcx86/samples.xml) of disk images, one of which is:
|
||||
|
||||
<manifest ref="/apps/pc/1981/visicalc/manifest.xml" disk="*"/>
|
||||
```xml
|
||||
<manifest ref="/apps/pcx86/1981/visicalc/manifest.xml" disk="*"/>
|
||||
```
|
||||
|
||||
which refers to the <disk> entry in the VisiCalc manifest -- which brings us full circle.
|
||||
|
||||
Since that <disk> entry is just a reference to a folder, PCjs must first convert it to a disk image,
|
||||
using the following API request:
|
||||
|
||||
http://localhost:8088/api/v1/dump?path=/apps/pc/1981/visicalc/bin/VC.COM;../README.md&format=json
|
||||
http://localhost:8088/api/v1/dump?path=/apps/pcx86/1981/visicalc/bin/VC.COM;../README.md&format=json
|
||||
|
||||
The PCjs DiskDump module processes the dump request and generates a JSON-encoded DOS 2.x-compatible disk image
|
||||
containing all the specified files.
|
||||
|
|
@ -83,11 +89,13 @@ However, to avoid the PCjs web server re-generating the same disk image for ever
|
|||
have saved that JSON-encoded image as static file on the server, and then added an *href* attribute to the manifest's
|
||||
<disk> entry:
|
||||
|
||||
<manifest>
|
||||
<disk id="disk01" dir="/apps/pc/1981/visicalc/archive/" href="/apps/pc/1981/visicalc/disk.json">
|
||||
...
|
||||
</disk>
|
||||
</manifest>
|
||||
```xml
|
||||
<manifest>
|
||||
<disk id="disk01" dir="/apps/pcx86/1981/visicalc/archive/" href="/apps/pcx86/1981/visicalc/disk.json">
|
||||
...
|
||||
</disk>
|
||||
</manifest>
|
||||
```
|
||||
|
||||
PCjs always prefers a resource specified by *href*. While the <file> entries are now superfluous, they
|
||||
still serve to document the contents of the disk image, and are still necessary if the disk image ever needs to
|
||||
|
|
@ -95,25 +103,27 @@ be re-generated.
|
|||
|
||||
### Example: CP/M-86
|
||||
|
||||
CPM-86 is stored as two disk images in a [/disks folder](/disks/pc/cpm/1.1b/). The disk images are described in that
|
||||
folder's [manifest](/disks/pc/cpm/1.1b/manifest.xml):
|
||||
CPM-86 is stored as two disk images in a [/disks folder](/disks/pcx86/cpm/1.1b/). The disk images are described in that
|
||||
folder's [manifest](/disks/pcx86/cpm/1.1b/manifest.xml):
|
||||
|
||||
<manifest>
|
||||
<title>CP/M-86</title>
|
||||
<version>1.1B</version>
|
||||
<type>OS</type>
|
||||
<category>Operating System</category>
|
||||
<company href="http://en.wikipedia.org/wiki/Digital_Research">Digital Research</company>
|
||||
<publisher href="http://en.wikipedia.org/wiki/Eagle_Computer">Eagle Computer</publisher>
|
||||
<releaseDate>May 20, 1983</releaseDate>
|
||||
<machine href="/disks/pc/cpm/1.1b/machine.xml"/>
|
||||
<disk id="disk01" href="/disks/pc/cpm/1.1b/cpm86-disk1.json">
|
||||
<name>CP/M-86 (Disk 1)</name>
|
||||
</disk>
|
||||
<disk id="disk02" href="/disks/pc/cpm/1.1b/cpm86-disk2.json">
|
||||
<name>CP/M-86 (Disk 2)</name>
|
||||
</disk>
|
||||
</manifest>
|
||||
```xml
|
||||
<manifest>
|
||||
<title>CP/M-86</title>
|
||||
<version>1.1B</version>
|
||||
<type>OS</type>
|
||||
<category>Operating System</category>
|
||||
<company href="http://en.wikipedia.org/wiki/Digital_Research">Digital Research</company>
|
||||
<publisher href="http://en.wikipedia.org/wiki/Eagle_Computer">Eagle Computer</publisher>
|
||||
<releaseDate>May 20, 1983</releaseDate>
|
||||
<machine href="/disks/pcx86/cpm/1.1b/machine.xml"/>
|
||||
<disk id="disk01" href="/disks/pcx86/cpm/1.1b/cpm86-disk1.json">
|
||||
<name>CP/M-86 (Disk 1)</name>
|
||||
</disk>
|
||||
<disk id="disk02" href="/disks/pcx86/cpm/1.1b/cpm86-disk2.json">
|
||||
<name>CP/M-86 (Disk 2)</name>
|
||||
</disk>
|
||||
</manifest>
|
||||
```
|
||||
|
||||
In this case, the software was "born" as disk images (non-DOS disk images at that), so we don't
|
||||
bother listing the contents of those images with <file> entries inside the <disk> entries.
|
||||
|
|
@ -123,10 +133,14 @@ the disk images.
|
|||
|
||||
If a machine file wanted to use only the first disk, then it would specify:
|
||||
|
||||
<manifest ref="/disks/pc/cpm/1.1b/manifest.xml" disk="disk01"/>
|
||||
```xml
|
||||
<manifest ref="/disks/pcx86/cpm/1.1b/manifest.xml" disk="disk01"/>
|
||||
```
|
||||
|
||||
and if it wanted to use all the disks listed in the manifest, it would specify:
|
||||
|
||||
<manifest ref="/disks/pc/cpm/1.1b/manifest.xml" disk="*"/>
|
||||
```xml
|
||||
<manifest ref="/disks/pcx86/cpm/1.1b/manifest.xml" disk="*"/>
|
||||
```
|
||||
|
||||
which is what our [CP/M Machine Configuration](/disks/pc/cpm/1.1b/machine.xml) does.
|
||||
which is what our [CP/M Machine Configuration](/disks/pcx86/cpm/1.1b/machine.xml) does.
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
|
|
@ -1,15 +0,0 @@
|
|||
---
|
||||
layout: page
|
||||
title: "Executive Suite (1982)"
|
||||
permalink: /apps/pc/1982/esuite/
|
||||
machines:
|
||||
- type: pc
|
||||
id: ibm5160
|
||||
config: /devices/pc/machine/5160/mda/256kb/fake188/machine.xml
|
||||
state: /apps/pc/1982/esuite/state.json
|
||||
---
|
||||
|
||||
Executive Suite (1982)
|
||||
---
|
||||
|
||||
{% include machine.html id="ibm5160" %}
|
||||
|
|
@ -1,15 +0,0 @@
|
|||
---
|
||||
layout: page
|
||||
title: "Rogue (1985)"
|
||||
permalink: /apps/pc/1985/rogue/
|
||||
machines:
|
||||
- type: pc
|
||||
id: ibm5160
|
||||
config: /devices/pc/machine/5160/cga/640kb/machine.xml
|
||||
state: /apps/pc/1985/rogue/state.json
|
||||
---
|
||||
|
||||
Rogue (1985)
|
||||
---
|
||||
|
||||
{% include machine.html id="ibm5160" %}
|
||||
|
|
@ -1,34 +0,0 @@
|
|||
CACHE MANIFEST
|
||||
/apps/pc/1985/rogue/manifest.xml
|
||||
/versions/pcjs/1.16.0/manifest.xsl
|
||||
/versions/pcjs/1.16.0/common.xsl
|
||||
/versions/pcjs/1.16.0/components.xsl
|
||||
/devices/pc/machine/5160/cga/640kb/machine.xml
|
||||
/devices/pc/keyboard/us83-buttons-minimal.xml
|
||||
/disks/pc/library.xml
|
||||
/disks/pc/dos/microsoft/3.20/manifest.xml
|
||||
/disks/pc/dos/microsoft/4.0M/manifest.xml
|
||||
/disks/pc/tools/microsoft/basic/manifest.xml
|
||||
/disks/pc/tools/microsoft/c/4.00/manifest.xml
|
||||
/disks/pc/tools/microsoft/masm/4.00/manifest.xml
|
||||
/disks/pc/tools/microsoft/mouse/5.00/manifest.xml
|
||||
/disks/pc/apps/lotus/123/1.0a/manifest.xml
|
||||
/disks/pc/apps/microsoft/word/3.0/manifest.xml
|
||||
/disks/pc/apps/microsoft/word/3.1/manifest.xml
|
||||
/disks/pc/apps/microsoft/word/5.0/manifest.xml
|
||||
/disks/pc/apps/microsoft/winword/2.0c/manifest.xml
|
||||
/apps/pc/1981/visicalc/manifest.xml
|
||||
/apps/pc/1982/esuite/manifest.xml
|
||||
/apps/pc/1987/thinktank/manifest.xml
|
||||
/apps/pc/1992/moria/manifest.xml
|
||||
/versions/pcjs/1.16.0/common.css
|
||||
/versions/pcjs/1.16.0/components.css
|
||||
/versions/pcjs/1.16.0/pc.js
|
||||
/devices/pc/hdc/ibm-xebec-1982.json
|
||||
/devices/pc/rom/5160/basic/BASIC110.json
|
||||
/devices/pc/rom/5160/1982-11-08/XTBIOS-REV1.json
|
||||
/devices/pc/video/ibm/cga/ibm-cga.json
|
||||
/disks/pc/dos/ibm/2.00/PCDOS200-DISK1.json
|
||||
/disks/pc/dos/ibm/2.00/PCDOS200-DISK2.json
|
||||
/apps/pc/1985/rogue/state.json
|
||||
/apps/pc/1985/rogue/disk.json
|
||||
|
|
@ -1,15 +0,0 @@
|
|||
---
|
||||
layout: page
|
||||
title: "ThinkTank (1987)"
|
||||
permalink: /apps/pc/1987/thinktank/
|
||||
machines:
|
||||
- type: pc
|
||||
id: ibm5160
|
||||
config: /devices/pc/machine/5160/cga/640kb/machine.xml
|
||||
state: /apps/pc/1987/thinktank/state.json
|
||||
---
|
||||
|
||||
ThinkTank (1987)
|
||||
---
|
||||
|
||||
{% include machine.html id="ibm5160" %}
|
||||
|
|
@ -1,15 +0,0 @@
|
|||
---
|
||||
layout: page
|
||||
title: "The Dungeons of Moria (1992)"
|
||||
permalink: /apps/pc/1992/moria/
|
||||
machines:
|
||||
- type: pc
|
||||
id: ibm5160
|
||||
config: /devices/pc/machine/5160/cga/640kb/machine.xml
|
||||
state: /apps/pc/1992/moria/state.json
|
||||
---
|
||||
|
||||
The Dungeons of Moria (1992)
|
||||
---
|
||||
|
||||
{% include machine.html id="ibm5160" %}
|
||||
File diff suppressed because one or more lines are too long
|
|
@ -1,65 +0,0 @@
|
|||
---
|
||||
layout: page
|
||||
title: IBM PC Application Archive
|
||||
permalink: /apps/pc/
|
||||
---
|
||||
|
||||
IBM PC Application Archive
|
||||
---
|
||||
|
||||
Below are selected demos of classic IBM PC applications running on [PCjs](/docs/about/pcjs/).
|
||||
|
||||
* [VisiCalc (1981)](1981/visicalc/)
|
||||
* [Executive Suite (1982)](1982/esuite/)
|
||||
* [Rogue (1985)](1985/rogue/)
|
||||
* [ThinkTank (1987)](1987/thinktank/)
|
||||
* [The Dungeons of Moria (1992)](1992/moria/)
|
||||
|
||||
A list of all the software available to PCjs machines can be found in the [IBM PC Disk Library](/disks/pc/).
|
||||
|
||||
### Creating IBM PC Application Demos
|
||||
|
||||
Demos in our [Application Archives](/apps/) combine [Software Application Manifests](/apps/#software-application-manifests)
|
||||
with [Machine Configurations](/devices/pc/machine/).
|
||||
|
||||
We'll use the [VisiCalc Demo](1981/visicalc/) as an example. First you must choose a machine configuration.
|
||||
For VisiCalc, we chose a Model 5150 machine with a Monochrome Display, and then inserted a link to that machine
|
||||
in the demo's [manifest](1981/visicalc/manifest.xml):
|
||||
|
||||
<machine href="/devices/pc/machine/5150/mda/64kb/machine.xml"/>
|
||||
|
||||
Next, the [manifest](1981/visicalc/manifest.xml) required a disk image containing the VisiCalc program
|
||||
(VC.COM). We used the [DiskDump](/modules/diskdump/) module to create that disk image:
|
||||
|
||||
cd apps/pc/1981/visicalc
|
||||
node ../../../../modules/diskdump/bin/diskdump --path="archive/VC.COM;../README.md" --format=json --output=disk.json --manifest
|
||||
|
||||
The DiskDump command created a disk image named "disk.json" containing two files ("VC.COM" from the "archive" subdirectory,
|
||||
and "README.md" from the "archive" parent directory) and automatically added that disk image to the demo's [manifest](1981/visicalc/manifest.xml):
|
||||
|
||||
<disk id="disk01" size="163840" chs="40:1:8" dir="archive/" href="/apps/pc/1981/visicalc/disk.json" md5="61494f998d5fb0e31e7b8bd99f1cc588" md5json="3ad82ed815725e6bd786f92a4714e84f">
|
||||
<file size="27520" time="1981-12-16 23:00:00" attr="0x20" md5="28997dfedb2440c6054d8be835be8634">VC.COM</file>
|
||||
<file dir="../">README.md</file>
|
||||
</disk>
|
||||
|
||||
Now that the manifest contains a disk image, we were able to add the manifest to our set of [Sample Disks](/disks/pc/samples.xml):
|
||||
|
||||
<manifest ref="/apps/pc/1981/visicalc/manifest.xml" disk="*"/>
|
||||
|
||||
Next, we started a version of our chosen machine that's also configured to use the Debugger, by loading
|
||||
the following **machine.xml** into a web browser (it's assumed the Node web server is already running on port 8088):
|
||||
|
||||
http://localhost:8088/devices/pc/machine/5150/mda/64kb/debugger/machine.xml
|
||||
|
||||
Then we booted DOS, loaded the VisiCalc disk, ran VisiCalc, pressed the Debugger's "Halt" button, pressed "Clear" to
|
||||
clear the Debugger's output window, and typed the following Debugger command:
|
||||
|
||||
d state
|
||||
|
||||
We copied-and-pasted the entire contents of the Debugger's output window into a file named "state.json", and then updated
|
||||
the <machine> entry in the [manifest](1981/visicalc/manifest.xml):
|
||||
|
||||
<machine href="/devices/pc/machine/5150/mda/64kb/machine.xml" state="/apps/pc/1981/visicalc/state.json"/>
|
||||
|
||||
It's important to use a state file *only* with the machine configuration it was created with; in this case, we're OK,
|
||||
because the only difference between the two chosen Model 5150 machines is the addition of the Debugger.
|
||||
|
|
@ -1,7 +1,9 @@
|
|||
---
|
||||
layout: page
|
||||
title: IBM PC Applications (1981)
|
||||
permalink: /apps/pc/1981/
|
||||
permalink: /apps/pcx86/1981/
|
||||
redirect_from:
|
||||
- /apps/pc/1981/
|
||||
---
|
||||
|
||||
IBM PC Applications (1981)
|
||||
|
|
@ -1,12 +1,14 @@
|
|||
---
|
||||
layout: page
|
||||
title: "VisiCalc (1981)"
|
||||
permalink: /apps/pc/1981/visicalc/
|
||||
permalink: /apps/pcx86/1981/visicalc/
|
||||
redirect_from:
|
||||
- /apps/pc/1981/visicalc/
|
||||
machines:
|
||||
- type: pc
|
||||
- type: pcx86
|
||||
id: ibm5150
|
||||
config: /devices/pc/machine/5150/mda/64kb/machine.xml
|
||||
state: /apps/pc/1981/visicalc/state.json
|
||||
config: /devices/pcx86/machine/5150/mda/64kb/machine.xml
|
||||
state: /apps/pcx86/1981/visicalc/state.json
|
||||
---
|
||||
|
||||
VisiCalc (1981)
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.22.1/manifest.xsl"?>
|
||||
<?xml-stylesheet type="text/xsl" href="/versions/pcx86/1.23.0/manifest.xsl"?>
|
||||
<manifest type="software">
|
||||
<title>VisiCalc</title>
|
||||
<!-- Since version numbers are incorporated into the disk image names, and this version number is a bit ugly, we're not exposing it with the normal "version" tag -->
|
||||
|
|
@ -11,8 +11,8 @@
|
|||
<author href="http://www.frankston.com/public/?name=ImplementingVisiCalc">Bob Frankston</author>
|
||||
<releaseDate>December 16, 1981</releaseDate>
|
||||
<license href="http://www.bricklin.com/history/vclicense.htm">Lotus Development</license>
|
||||
<machine href="/devices/pc/machine/5150/mda/64kb/machine.xml" state="/apps/pc/1981/visicalc/state.json"/>
|
||||
<disk id="disk01" size="163840" chs="40:1:8" dir="archive/" href="/apps/pc/1981/visicalc/disk.json" md5="61494f998d5fb0e31e7b8bd99f1cc588" md5json="3ad82ed815725e6bd786f92a4714e84f">
|
||||
<machine href="/devices/pcx86/machine/5150/mda/64kb/machine.xml" state="/apps/pcx86/1981/visicalc/state.json"/>
|
||||
<disk id="disk01" size="163840" chs="40:1:8" dir="archive/" href="/apps/pcx86/1981/visicalc/disk.json" md5="61494f998d5fb0e31e7b8bd99f1cc588" md5json="3ad82ed815725e6bd786f92a4714e84f">
|
||||
<name>VisiCalc (1981)</name>
|
||||
<file size="27520" time="1981-12-16 23:00:00" attr="0x20" md5="28997dfedb2440c6054d8be835be8634">VC.COM</file>
|
||||
<file dir="../">README.md</file>
|
||||
1
apps/pcx86/1981/visicalc/state.json
Normal file
1
apps/pcx86/1981/visicalc/state.json
Normal file
File diff suppressed because one or more lines are too long
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |
|
|
@ -1,7 +1,9 @@
|
|||
---
|
||||
layout: page
|
||||
title: IBM PC Applications (1982)
|
||||
permalink: /apps/pc/1982/
|
||||
permalink: /apps/pcx86/1982/
|
||||
redirect_from:
|
||||
- /apps/pc/1982/
|
||||
---
|
||||
|
||||
IBM PC Applications (1982)
|
||||
17
apps/pcx86/1982/esuite/README.md
Normal file
17
apps/pcx86/1982/esuite/README.md
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
---
|
||||
layout: page
|
||||
title: "Executive Suite (1982)"
|
||||
permalink: /apps/pcx86/1982/esuite/
|
||||
redirect_from:
|
||||
- /apps/pc/1982/esuite/
|
||||
machines:
|
||||
- type: pcx86
|
||||
id: ibm5160
|
||||
config: /devices/pcx86/machine/5160/mda/256kb/fake188/machine.xml
|
||||
state: /apps/pcx86/1982/esuite/state.json
|
||||
---
|
||||
|
||||
Executive Suite (1982)
|
||||
---
|
||||
|
||||
{% include machine.html id="ibm5160" %}
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.22.1/manifest.xsl"?>
|
||||
<?xml-stylesheet type="text/xsl" href="/versions/pcx86/1.23.0/manifest.xsl"?>
|
||||
<manifest type="software">
|
||||
<title>Executive Suite</title>
|
||||
<version/>
|
||||
|
|
@ -7,8 +7,8 @@
|
|||
<category>Text Simulation</category>
|
||||
<author>Armonk Corporation</author>
|
||||
<releaseDate>1982</releaseDate>
|
||||
<machine href="/devices/pc/machine/5160/mda/256kb/fake188/machine.xml" state="/apps/pc/1982/esuite/state.json"/>
|
||||
<disk id="disk01" size="368640" chs="40:2:9" dir="archive/" href="/apps/pc/1982/esuite/disk.json" md5="7721a7bc9fcbd0005e7c1d87ecc055c5" md5json="dbf0a2c0176b8128d87e2465794764f4">
|
||||
<machine href="/devices/pcx86/machine/5160/mda/256kb/fake188/machine.xml" state="/apps/pcx86/1982/esuite/state.json"/>
|
||||
<disk id="disk01" size="368640" chs="40:2:9" dir="archive/" href="/apps/pcx86/1982/esuite/disk.json" md5="7721a7bc9fcbd0005e7c1d87ecc055c5" md5json="dbf0a2c0176b8128d87e2465794764f4">
|
||||
<name>Executive Suite (1982)</name>
|
||||
<file size="384" time="2000-02-29 08:04:48" attr="0x20" md5="3e638560a5f483cdbd1be486b07c767e">ESUITE.COM</file>
|
||||
<file size="163840" time="2000-02-29 06:57:40" attr="0x20" md5="dcc72026cdc906109cf0e3b2d07ffd5d">GAME.DAT</file>
|
||||
File diff suppressed because one or more lines are too long
|
|
@ -1,7 +1,9 @@
|
|||
---
|
||||
layout: page
|
||||
title: IBM PC Applications (1985)
|
||||
permalink: /apps/pc/1985/
|
||||
permalink: /apps/pcx86/1985/
|
||||
redirect_from:
|
||||
- /apps/pc/1985/
|
||||
---
|
||||
|
||||
IBM PC Applications (1985)
|
||||
17
apps/pcx86/1985/rogue/README.md
Normal file
17
apps/pcx86/1985/rogue/README.md
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
---
|
||||
layout: page
|
||||
title: "Rogue (1985)"
|
||||
permalink: /apps/pcx86/1985/rogue/
|
||||
redirect_from:
|
||||
- /apps/pc/1985/rogue/
|
||||
machines:
|
||||
- type: pcx86
|
||||
id: ibm5160
|
||||
config: /devices/pcx86/machine/5160/cga/640kb/machine.xml
|
||||
state: /apps/pcx86/1985/rogue/state.json
|
||||
---
|
||||
|
||||
Rogue (1985)
|
||||
---
|
||||
|
||||
{% include machine.html id="ibm5160" %}
|
||||
34
apps/pcx86/1985/rogue/cache.manifest
Normal file
34
apps/pcx86/1985/rogue/cache.manifest
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
CACHE MANIFEST
|
||||
/apps/pcx86/1985/rogue/manifest.xml
|
||||
/versions/pcx86/current/manifest.xsl
|
||||
/versions/pcx86/current/common.xsl
|
||||
/versions/pcx86/current/components.xsl
|
||||
/devices/pcx86/machine/5160/cga/640kb/machine.xml
|
||||
/devices/pcx86/keyboard/us83-buttons-minimal.xml
|
||||
/disks/pcx86/library.xml
|
||||
/disks/pcx86/dos/microsoft/3.20/manifest.xml
|
||||
/disks/pcx86/dos/microsoft/4.0M/manifest.xml
|
||||
/disks/pcx86/tools/microsoft/basic/manifest.xml
|
||||
/disks/pcx86/tools/microsoft/c/4.00/manifest.xml
|
||||
/disks/pcx86/tools/microsoft/masm/4.00/manifest.xml
|
||||
/disks/pcx86/tools/microsoft/mouse/5.00/manifest.xml
|
||||
/disks/pcx86/apps/lotus/123/1.0a/manifest.xml
|
||||
/disks/pcx86/apps/microsoft/word/3.0/manifest.xml
|
||||
/disks/pcx86/apps/microsoft/word/3.1/manifest.xml
|
||||
/disks/pcx86/apps/microsoft/word/5.0/manifest.xml
|
||||
/disks/pcx86/apps/microsoft/winword/2.0c/manifest.xml
|
||||
/apps/pcx86/1981/visicalc/manifest.xml
|
||||
/apps/pcx86/1982/esuite/manifest.xml
|
||||
/apps/pcx86/1987/thinktank/manifest.xml
|
||||
/apps/pcx86/1992/moria/manifest.xml
|
||||
/versions/pcx86/current/common.css
|
||||
/versions/pcx86/current/components.css
|
||||
/versions/pcx86/current/pcx86.js
|
||||
/devices/pcx86/hdc/ibm-xebec-1982.json
|
||||
/devices/pcx86/rom/5160/basic/BASIC110.json
|
||||
/devices/pcx86/rom/5160/1982-11-08/XTBIOS-REV1.json
|
||||
/devices/pcx86/video/ibm/cga/ibm-cga.json
|
||||
/disks/pcx86/dos/ibm/2.00/PCDOS200-DISK1.json
|
||||
/disks/pcx86/dos/ibm/2.00/PCDOS200-DISK2.json
|
||||
/apps/pcx86/1985/rogue/state.json
|
||||
/apps/pcx86/1985/rogue/disk.json
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.22.1/manifest.xsl"?>
|
||||
<?xml-stylesheet type="text/xsl" href="/versions/pcx86/1.23.0/manifest.xsl"?>
|
||||
<manifest type="software">
|
||||
<title>Rogue</title>
|
||||
<version/>
|
||||
|
|
@ -12,7 +12,7 @@
|
|||
<author>Ken Arnold</author>
|
||||
<author>Jon Lane</author>
|
||||
<author>Michael Toy</author>
|
||||
<disk id="disk01" size="163840" chs="40:1:8" dir="archive/" href="/apps/pc/1985/rogue/disk.json" md5="91fab29636a7517e17eaa38b30ff156a" md5json="c531e9f249b20adad667a3c376e427c8">
|
||||
<disk id="disk01" size="163840" chs="40:1:8" dir="archive/" href="/apps/pcx86/1985/rogue/disk.json" md5="91fab29636a7517e17eaa38b30ff156a" md5json="c531e9f249b20adad667a3c376e427c8">
|
||||
<name>Rogue (1985)</name>
|
||||
<file size="14016" time="1985-03-25 14:33:18" attr="0x20" md5="e8f7c7b97210f480c7b741a0d58951bd">MKOPT.EXE</file>
|
||||
<file size="2616" time="1995-09-01 18:46:18" attr="0x20" md5="275fd64a3502af22b56e23934c79e9ef">ROGUE.COM</file>
|
||||
|
|
@ -21,5 +21,5 @@
|
|||
<file size="16391" time="1985-03-25 16:53:10" attr="0x20" md5="afb883b611c35f79f2a5168365349ba7">ROGUE.PIC</file>
|
||||
<file size="0" time="1995-08-26 12:11:38" attr="0x20">ROGUE.SCR</file>
|
||||
</disk>
|
||||
<machine href="/devices/pc/machine/5160/cga/640kb/machine.xml" state="/apps/pc/1985/rogue/state.json"/>
|
||||
<machine href="/devices/pcx86/machine/5160/cga/640kb/machine.xml" state="/apps/pcx86/1985/rogue/state.json"/>
|
||||
</manifest>
|
||||
File diff suppressed because one or more lines are too long
|
|
@ -1,7 +1,9 @@
|
|||
---
|
||||
layout: page
|
||||
title: IBM PC Applications (1987)
|
||||
permalink: /apps/pc/1987/
|
||||
permalink: /apps/pcx86/1987/
|
||||
redirect_from:
|
||||
- /apps/pc/1987/
|
||||
---
|
||||
|
||||
IBM PC Applications (1987)
|
||||
17
apps/pcx86/1987/thinktank/README.md
Normal file
17
apps/pcx86/1987/thinktank/README.md
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
---
|
||||
layout: page
|
||||
title: "ThinkTank (1987)"
|
||||
permalink: /apps/pcx86/1987/thinktank/
|
||||
redirect_from:
|
||||
- /apps/pc/1987/thinktank/
|
||||
machines:
|
||||
- type: pcx86
|
||||
id: ibm5160
|
||||
config: /devices/pcx86/machine/5160/cga/640kb/machine.xml
|
||||
state: /apps/pcx86/1987/thinktank/state.json
|
||||
---
|
||||
|
||||
ThinkTank (1987)
|
||||
---
|
||||
|
||||
{% include machine.html id="ibm5160" %}
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.22.1/manifest.xsl"?>
|
||||
<?xml-stylesheet type="text/xsl" href="/versions/pcx86/1.23.0/manifest.xsl"?>
|
||||
<manifest type="software">
|
||||
<title>ThinkTank</title>
|
||||
<version>2.41NP</version>
|
||||
|
|
@ -7,7 +7,7 @@
|
|||
<category>Productivity</category>
|
||||
<company>Living Videotext</company>
|
||||
<releaseDate>September 25, 1987</releaseDate>
|
||||
<disk id="disk01" size="368640" chs="40:2:9" dir="archive/" href="/apps/pc/1987/thinktank/disk.json" md5="94053339672452fba42da85481893d68" md5json="bd39020bff244db9af3ac9eb656e7878">
|
||||
<disk id="disk01" size="368640" chs="40:2:9" dir="archive/" href="/apps/pcx86/1987/thinktank/disk.json" md5="94053339672452fba42da85481893d68" md5json="bd39020bff244db9af3ac9eb656e7878">
|
||||
<name>ThinkTank (1987)</name>
|
||||
<file size="6" time="2012-11-20 15:29:40" attr="0x20" md5="50b68f3f99eda119c661b2b50cb9f4de">AUTOEXEC.BAT</file>
|
||||
<file size="8192" time="2012-11-20 15:29:35" attr="0x20" md5="3355afbc122700f13647ee0d1bbf9ed7">READ_ME.DB</file>
|
||||
|
|
@ -49,5 +49,5 @@
|
|||
<file size="512" time="2012-11-20 15:32:46" attr="0x20" md5="05f711f1c096454617eb18b31a48905f" dir="TMPLATES/">UPGRADE.TXT</file>
|
||||
<file size="3072" time="2012-11-20 15:32:11" attr="0x20" md5="20ded226630726d7b26d0ec7832753d0" dir="TMPLATES/">WTMEASUR.TXT</file>
|
||||
</disk>
|
||||
<machine href="/devices/pc/machine/5160/cga/640kb/machine.xml" state="/apps/pc/1987/thinktank/state.json"/>
|
||||
<machine href="/devices/pcx86/machine/5160/cga/640kb/machine.xml" state="/apps/pcx86/1987/thinktank/state.json"/>
|
||||
</manifest>
|
||||
File diff suppressed because one or more lines are too long
|
|
@ -1,7 +1,9 @@
|
|||
---
|
||||
layout: page
|
||||
title: IBM PC Applications (1988)
|
||||
permalink: /apps/pc/1988/
|
||||
permalink: /apps/pcx86/1988/
|
||||
redirect_from:
|
||||
- /apps/pc/1988/
|
||||
---
|
||||
|
||||
IBM PC Applications (1988)
|
||||
|
|
@ -1,7 +1,9 @@
|
|||
---
|
||||
layout: page
|
||||
title: The Dungeons of Moria (1988)
|
||||
permalink: /apps/pc/1988/moria/
|
||||
permalink: /apps/pcx86/1988/moria/
|
||||
redirect_from:
|
||||
- /apps/pc/1988/moria/
|
||||
---
|
||||
|
||||
The Dungeons of Moria (1988)
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.22.1/manifest.xsl"?>
|
||||
<?xml-stylesheet type="text/xsl" href="/versions/pcx86/1.23.0/manifest.xsl"?>
|
||||
<manifest type="software">
|
||||
<title>The Dungeons of Moria</title>
|
||||
<version>4.872</version>
|
||||
|
|
@ -14,7 +14,7 @@
|
|||
<name>D. G. Kneller</name>
|
||||
<desc>MSDOS port</desc>
|
||||
</author>
|
||||
<disk id="disk01" size="1228800" chs="80:2:15" dir="archive/" href="/apps/pc/1988/moria/disk.json" md5="7bb84a7ac4e9b03e8cd1e6753b1359fb" md5json="7630122397a57af2d0c767141af3817c">
|
||||
<disk id="disk01" size="1228800" chs="80:2:15" dir="archive/" href="/apps/pcx86/1988/moria/disk.json" md5="7bb84a7ac4e9b03e8cd1e6753b1359fb" md5json="7630122397a57af2d0c767141af3817c">
|
||||
<name>Moria 4.872 (1988)</name>
|
||||
<file size="11143" time="1988-11-01 00:00:00" attr="0x20" md5="dae278b77133f32949d0e8940f944c0d">CONFIG.DOC</file>
|
||||
<file size="91154" time="1991-06-01 14:50:02" attr="0x20" md5="66593e83a2aa3870d7a9e8b43079ce42">GOD</file>
|
||||
|
|
@ -1,7 +1,9 @@
|
|||
---
|
||||
layout: page
|
||||
title: IBM PC Applications (1992)
|
||||
permalink: /apps/pc/1992/
|
||||
permalink: /apps/pcx86/1992/
|
||||
redirect_from:
|
||||
- /apps/pc/1992/
|
||||
---
|
||||
|
||||
IBM PC Applications (1992)
|
||||
17
apps/pcx86/1992/moria/README.md
Normal file
17
apps/pcx86/1992/moria/README.md
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
---
|
||||
layout: page
|
||||
title: "The Dungeons of Moria (1992)"
|
||||
permalink: /apps/pcx86/1992/moria/
|
||||
redirect_from:
|
||||
- /apps/pc/1992/moria/
|
||||
machines:
|
||||
- type: pcx86
|
||||
id: ibm5160
|
||||
config: /devices/pcx86/machine/5160/cga/640kb/machine.xml
|
||||
state: /apps/pcx86/1992/moria/state.json
|
||||
---
|
||||
|
||||
The Dungeons of Moria (1992)
|
||||
---
|
||||
|
||||
{% include machine.html id="ibm5160" %}
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.22.1/manifest.xsl"?>
|
||||
<?xml-stylesheet type="text/xsl" href="/versions/pcx86/1.23.0/manifest.xsl"?>
|
||||
<manifest type="software">
|
||||
<title>The Dungeons of Moria</title>
|
||||
<version>5.5</version>
|
||||
|
|
@ -92,7 +92,7 @@
|
|||
<name>Ben Schreiber</name>
|
||||
<desc>Macintosh port for Think C</desc>
|
||||
</contributor>
|
||||
<disk id="disk01" size="368640" chs="40:2:9" dir="archive/bin/" href="/apps/pc/1992/moria/disk.json" md5="da0023280238bc2ee9053ad2b9548816" md5json="1473be159bb5f9001db31c06b3a366c1">
|
||||
<disk id="disk01" size="368640" chs="40:2:9" dir="archive/bin/" href="/apps/pcx86/1992/moria/disk.json" md5="da0023280238bc2ee9053ad2b9548816" md5json="1473be159bb5f9001db31c06b3a366c1">
|
||||
<name>Moria 5.5 (1992)</name>
|
||||
<file size="6074" time="1992-11-01 23:15:36" attr="0x20" md5="078aca44b845ee8a787a324c1e827200">EXP.DOC</file>
|
||||
<file size="2560" time="1992-11-01 23:15:36" attr="0x20" md5="a5c8620efd0dc841956f9cdc2e46220a">MORIA.CNF</file>
|
||||
|
|
@ -108,5 +108,5 @@
|
|||
<file size="2193" time="1992-11-01 23:15:44" attr="0x20" md5="cac18aa1420a33b231295f468c360f96">VERSION.HLP</file>
|
||||
<file size="423" time="1992-11-01 23:15:44" attr="0x20" md5="07fdaebf594f9b34d54544c2b6aa36d8">WELCOME.HLP</file>
|
||||
</disk>
|
||||
<machine href="/devices/pc/machine/5160/cga/640kb/machine.xml" state="/apps/pc/1992/moria/state.json"/>
|
||||
<machine href="/devices/pcx86/machine/5160/cga/640kb/machine.xml" state="/apps/pcx86/1992/moria/state.json"/>
|
||||
</manifest>
|
||||
1
apps/pcx86/1992/moria/state.json
Normal file
1
apps/pcx86/1992/moria/state.json
Normal file
File diff suppressed because one or more lines are too long
78
apps/pcx86/README.md
Normal file
78
apps/pcx86/README.md
Normal file
|
|
@ -0,0 +1,78 @@
|
|||
---
|
||||
layout: page
|
||||
title: IBM PC Application Archive
|
||||
permalink: /apps/pcx86/
|
||||
redirect_from:
|
||||
- /apps/pc/
|
||||
---
|
||||
|
||||
IBM PC Application Archive
|
||||
---
|
||||
|
||||
Below are selected [PCx86](/docs/about/pcx86/) demos of classic IBM PC applications:
|
||||
|
||||
* [VisiCalc (1981)](1981/visicalc/)
|
||||
* [Executive Suite (1982)](1982/esuite/)
|
||||
* [Rogue (1985)](1985/rogue/)
|
||||
* [ThinkTank (1987)](1987/thinktank/)
|
||||
* [The Dungeons of Moria (1992)](1992/moria/)
|
||||
|
||||
A list of all the software available to PCx86 machines can be found in the [IBM PC Disk Library](/disks/pcx86/).
|
||||
|
||||
### Creating IBM PC Application Demos
|
||||
|
||||
Demos in our [Application Archives](/apps/) combine
|
||||
[Software Application Manifests](/apps/#software-application-manifests) with
|
||||
[Machine Configurations](/devices/pcx86/machine/).
|
||||
|
||||
We'll use the [VisiCalc Demo](1981/visicalc/) as an example. First, we choose a machine configuration.
|
||||
For VisiCalc, we chose a Model 5150 machine with a Monochrome Display, and then inserted a link to that machine
|
||||
in the demo's [manifest](1981/visicalc/manifest.xml):
|
||||
|
||||
```xml
|
||||
<machine href="/devices/pcx86/machine/5150/mda/64kb/machine.xml"/>
|
||||
```
|
||||
|
||||
Next, the [manifest](1981/visicalc/manifest.xml) requires a disk image containing the VisiCalc program
|
||||
(VC.COM). We used the [DiskDump](/modules/diskdump/) module to create that disk image:
|
||||
|
||||
cd apps/pcx86/1981/visicalc
|
||||
node ../../../../modules/diskdump/bin/diskdump --path="archive/VC.COM;../README.md" --format=json --output=disk.json --manifest
|
||||
|
||||
The DiskDump command created a disk image named "disk.json" containing two files ("VC.COM" from the "archive"
|
||||
subdirectory, and "README.md" from the "archive" parent directory) and automatically added that disk image to the demo's
|
||||
[manifest](1981/visicalc/manifest.xml):
|
||||
|
||||
```xml
|
||||
<disk id="disk01" size="163840" chs="40:1:8" dir="archive/" href="/apps/pcx86/1981/visicalc/disk.json" md5="61494f998d5fb0e31e7b8bd99f1cc588" md5json="3ad82ed815725e6bd786f92a4714e84f">
|
||||
<file size="27520" time="1981-12-16 23:00:00" attr="0x20" md5="28997dfedb2440c6054d8be835be8634">VC.COM</file>
|
||||
<file dir="../">README.md</file>
|
||||
</disk>
|
||||
```
|
||||
|
||||
Now that the manifest contains a disk image, we were able to add the manifest to our set of
|
||||
[Sample Disks](/disks/pcx86/samples.xml):
|
||||
|
||||
```xml
|
||||
<manifest ref="/apps/pcx86/1981/visicalc/manifest.xml" disk="*"/>
|
||||
```
|
||||
|
||||
Next, we started a version of our chosen machine that's also configured to use the Debugger, by loading
|
||||
the following **machine.xml** into a web browser (it's assumed the Node web server is already running on port 8088):
|
||||
|
||||
http://localhost:8088/devices/pcx86/machine/5150/mda/64kb/debugger/machine.xml
|
||||
|
||||
Then we booted DOS, loaded the VisiCalc disk, ran VisiCalc, pressed the Debugger's "Halt" button, pressed "Clear" to
|
||||
clear the Debugger's output window, and typed the following Debugger command:
|
||||
|
||||
d state
|
||||
|
||||
We copied-and-pasted the entire contents of the Debugger's output window into a file named "state.json", and then
|
||||
updated the <machine> entry in the [manifest](1981/visicalc/manifest.xml):
|
||||
|
||||
```xml
|
||||
<machine href="/devices/pcx86/machine/5150/mda/64kb/machine.xml" state="/apps/pcx86/1981/visicalc/state.json"/>
|
||||
```
|
||||
|
||||
It's important to use a state file *only* with the machine configuration it was created with; in this case, we're OK,
|
||||
because the only difference between the two chosen Model 5150 machines is the addition of the Debugger.
|
||||
|
|
@ -13,9 +13,9 @@ Device Configurations
|
|||
|
||||
All PCjs machines are built from the following collections of devices:
|
||||
|
||||
* 6502-based Devices (e.g., [Challenger 1P](c1p/machine/))
|
||||
* [6502-based Devices](c1p/) (e.g., [Challenger 1P](c1p/machine/))
|
||||
* [8080-based Devices](pc8080/) (e.g., [Space Invaders](pc8080/machine/invaders/))
|
||||
* [8086-based Devices](pc/) (e.g., [IBM PC, including 80286 and 80386-based compatibles](pc/machine/))
|
||||
* [8086-based Devices](pcx86/) (e.g., [IBM PC, including 80286 and 80386-based compatibles](pcx86/machine/))
|
||||
|
||||
These devices are user-installable components that you would typically find in a real personal computer,
|
||||
such as keyboards, disk controllers with one or more disk drives, video cards, etc.
|
||||
such as keyboards, disk drive controllers with one or more drives, video cards, etc.
|
||||
|
|
|
|||
|
|
@ -7,6 +7,16 @@ permalink: /devices/c1p/
|
|||
Challenger 1P Device Configurations
|
||||
---
|
||||
|
||||
This folder contains the components for all [Challenger 1P Machine Configurations](machine/).
|
||||
All our [Challenger 1P Machines](machine/) are built from a collection of devices, including:
|
||||
|
||||
[Applications](/apps/c1p/) and [Disk Images](/disks/c1p/) are also available.
|
||||
* [Control Panel](panel/)
|
||||
* CPU (6502)
|
||||
* Debugger
|
||||
* Floppy Drive Controller
|
||||
* Keyboard
|
||||
* RAM
|
||||
* [ROM](rom/)
|
||||
* Serial Port
|
||||
* [Video](video/)
|
||||
|
||||
The project also includes an assortment of Challenger 1P [Applications](/apps/c1p/) and [Disk Images](/disks/c1p/).
|
||||
|
|
|
|||
|
|
@ -3,8 +3,9 @@ layout: page
|
|||
title: OSI Challenger 1P (32Kb) with Disk Support
|
||||
permalink: /devices/c1p/machine/32kb/
|
||||
machines:
|
||||
- type: c1p-dbg
|
||||
- type: c1p
|
||||
id: c1p32kb
|
||||
debugger: true
|
||||
---
|
||||
|
||||
{% include machine.html id="c1p32kb" %}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<?xml-stylesheet type="text/xsl" href="/versions/c1pjs/1.22.1/machine.xsl"?>
|
||||
<?xml-stylesheet type="text/xsl" href="/versions/c1pjs/1.23.0/machine.xsl"?>
|
||||
<machine id="c1psim" class="c1p" border="1" width="100%" padbottom="8px" background="#FAEBD7" style="padding-bottom:8px">
|
||||
<name>OSI Challenger 1P (32Kb) with Disk Support</name>
|
||||
<computer id="c1p" name="Challenger 1P">
|
||||
|
|
|
|||
|
|
@ -3,8 +3,9 @@ layout: page
|
|||
title: OSI Challenger 1P (8Kb) with Additional Software
|
||||
permalink: /devices/c1p/machine/8kb/all/debugger/
|
||||
machines:
|
||||
- type: c1p-dbg
|
||||
- type: c1p
|
||||
id: c1p8kb
|
||||
debugger: true
|
||||
---
|
||||
|
||||
{% include machine.html id="c1p8kb" %}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<?xml-stylesheet type="text/xsl" href="/versions/c1pjs/1.22.1/machine.xsl"?>
|
||||
<?xml-stylesheet type="text/xsl" href="/versions/c1pjs/1.23.0/machine.xsl"?>
|
||||
<machine id="c1pAll" class="c1p" border="1" width="100%" padbottom="8px" background="#FAEBD7" style="padding-bottom:8px">
|
||||
<name>OSI Challenger 1P (8Kb, Additional Software)</name>
|
||||
<computer id="c1p" name="Challenger 1P">
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<?xml-stylesheet type="text/xsl" href="/versions/c1pjs/1.22.1/machine.xsl"?>
|
||||
<?xml-stylesheet type="text/xsl" href="/versions/c1pjs/1.23.0/machine.xsl"?>
|
||||
<machine id="c1pAll" class="c1p" border="1" pos="center" background="#FAEBD7" style="padding-bottom:8px">
|
||||
<name>OSI Challenger 1P (8Kb, Additional Software)</name>
|
||||
<computer id="c1p" name="Challenger 1P">
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<?xml-stylesheet type="text/xsl" href="/versions/c1pjs/1.22.1/outline.xsl"?>
|
||||
<?xml-stylesheet type="text/xsl" href="/versions/c1pjs/1.23.0/outline.xsl"?>
|
||||
<outline>
|
||||
<title>Challenger 1P (8Kb) "Server Array"</title>
|
||||
<machine id="OSI1" ref="/devices/c1p/machine/8kb/small/machine.xml"/>
|
||||
|
|
|
|||
|
|
@ -3,8 +3,9 @@ layout: page
|
|||
title: OSI Challenger 1P (8Kb) with Large Display
|
||||
permalink: /devices/c1p/machine/8kb/large/debugger/
|
||||
machines:
|
||||
- type: c1p-dbg
|
||||
- type: c1p
|
||||
id: c1p8kb
|
||||
debugger: true
|
||||
---
|
||||
|
||||
{% include machine.html id="c1p8kb" %}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<?xml-stylesheet type="text/xsl" href="/versions/c1pjs/1.22.1/machine.xsl"?>
|
||||
<?xml-stylesheet type="text/xsl" href="/versions/c1pjs/1.23.0/machine.xsl"?>
|
||||
<machine id="c1p8kb" class="c1p" border="1" width="100%" background="#FAEBD7" style="padding-bottom:8px">
|
||||
<name>OSI Challenger 1P (8Kb) with Debugger</name>
|
||||
<computer id="c1p" name="Challenger 1P">
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<?xml-stylesheet type="text/xsl" href="/versions/c1pjs/1.22.1/machine.xsl"?>
|
||||
<?xml-stylesheet type="text/xsl" href="/versions/c1pjs/1.23.0/machine.xsl"?>
|
||||
<machine id="c1pLarge" class="c1p" border="1" pos="center" background="#FAEBD7" style="padding-bottom:8px">
|
||||
<name pos="center">OSI Challenger 1P (circa 1978)</name>
|
||||
<computer id="c1p" name="Challenger 1P">
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<?xml-stylesheet type="text/xsl" href="/versions/c1pjs/1.22.1/machine.xsl"?>
|
||||
<?xml-stylesheet type="text/xsl" href="/versions/c1pjs/1.23.0/machine.xsl"?>
|
||||
<machine id="c1pSmall" class="c1p" border="1" width="272px" pos="left" padding="16px" background="#FAEBD7" style="padding-bottom:8px">
|
||||
<computer id="c1p" name="Challenger 1P">
|
||||
<module type="cpu" refid="cpu6502" start="0x0000" end="0xffff"/>
|
||||
|
|
|
|||
|
|
@ -9,11 +9,11 @@ Challenger 1P Machine Configurations
|
|||
|
||||
Here are some sample C1P Machine Configurations:
|
||||
|
||||
* [8kb with Large Display](8kb/large/) ([Debugger](8kb/large/debugger/))
|
||||
* [8kb with Small Display](8kb/small/)
|
||||
* [8kb with Large Display w/Additional Software](8kb/all/) ([Debugger](8kb/all/debugger/))
|
||||
* [8kb "Server Array" Demo](8kb/array/)
|
||||
* [32kb with Diskette Support](32kb/)
|
||||
- [8kb with Small Display](8kb/small/)
|
||||
- [8kb with Large Display](8kb/large/) ([Debugger](8kb/large/debugger/))
|
||||
- [8kb with Large Display w/Additional Software](8kb/all/) ([Debugger](8kb/all/debugger/))
|
||||
- [8kb "Server Array" Demo](8kb/array/)
|
||||
- [32kb with Diskette Support](32kb/)
|
||||
|
||||
See the [C1Pjs Documentation](/docs/c1pjs/) for operational details of the emulator.
|
||||
|
||||
|
|
|
|||
15
devices/c1p/panel/README.md
Normal file
15
devices/c1p/panel/README.md
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
---
|
||||
layout: page
|
||||
title: Challenger 1P Control Panels
|
||||
permalink: /devices/c1p/panel/
|
||||
---
|
||||
|
||||
Challenger 1P Control Panels
|
||||
---
|
||||
|
||||
A Control Panel is a collection of machine controls (e.g., buttons, register values, etc) bound to the *CPU* and
|
||||
*Debugger* components and usually defined in a separate XML file.
|
||||
|
||||
The following C1P Control Panels are available:
|
||||
|
||||
- [default.xml](default.xml)
|
||||
|
|
@ -1,2 +1,371 @@
|
|||
Folder for Challenger 1P ROMs
|
||||
---
|
||||
layout: page
|
||||
title: Challenger 1P ROMs
|
||||
permalink: /devices/c1p/rom/
|
||||
---
|
||||
|
||||
Challenger 1P ROMs
|
||||
---
|
||||
|
||||
The following ROMs are available:
|
||||
|
||||
- [BASIC (8Kb)](basic.json) ([HEX](basic.hex))
|
||||
- [BASIC (8Kb) with GC Patch](basic-gcpatch.json) ([HEX](basic-gcpatch.hex))
|
||||
- [SYSTEM (2Kb)](system.json) ([HEX](system.hex))
|
||||
|
||||
BASIC Garbage Collection (GC) Patch
|
||||
---
|
||||
|
||||
The following information comes from BAS3FIX.TXT in the ["Fixed BASIC3 ROM"](http://osiweb.org/roms/basfix02.zip) ZIP
|
||||
archive at [osiweb.org](http://osiweb.org/software.html#BASIC_ROMS). The patch was created in 2001 and is attributed to
|
||||
"[Ed](http://dxforth.netbay.com.au/)" (formerly at http://www.netbay.com.au/~dxforth/).
|
||||
|
||||
New OSI/UK101 ROM BASIC garbage collection bug patch
|
||||
----------------------------------------------------
|
||||
|
||||
The 8K ROM BASIC supplied with the OSI Superboard II and
|
||||
UK101 computers contains a bug in the garbage collector
|
||||
routine (see Listing 1). A patch was subsequently made
|
||||
available in the form of an updated BASIC 3 ROM (for the
|
||||
UK101 at least). The code is shown in Listing 3.
|
||||
|
||||
Unfortunately the patch was not a complete solution and
|
||||
corrupted strings could still occur - see Listing 2.
|
||||
|
||||
Listing 4 shows a new garbage collector patch that fixes
|
||||
all the problems. It is a combination of the original
|
||||
patch with changes found in later versions of Microsoft
|
||||
6502 BASIC.
|
||||
|
||||
Implementing the patch requires replacing of the BASIC 3
|
||||
ROM. Binary and hex dumps for the new ROM are enclosed.
|
||||
|
||||
The patch and rom images suit either the OSI or UK101 ROM
|
||||
BASIC.
|
||||
|
||||
|
||||
4-Oct-2001
|
||||
|
||||
-----------------------------------------------------------
|
||||
|
||||
[Listing 1]
|
||||
|
||||
Demonstrates garbage collection bug in OSI/UK101 ROM BASIC.
|
||||
|
||||
10 DIM A$(3)
|
||||
RUN
|
||||
PRINT FRE(0) (machine hangs)
|
||||
|
||||
|
||||
[Listing 2]
|
||||
|
||||
String corruption occurs with an unmodified ROM BASIC or
|
||||
the original garbage collection patch. Before entering
|
||||
the program, perform a Cold start and enter 1000 for the
|
||||
memory size.
|
||||
|
||||
5 A$="+"
|
||||
10 A$="-"+A$+"-"
|
||||
20 A$="+"+A$+"+"
|
||||
30 PRINT A$
|
||||
40 GOTO 10
|
||||
|
||||
|
||||
[Listing 3]
|
||||
|
||||
Original garbage collection patch
|
||||
|
||||
B147 LDX $85
|
||||
LDA $86
|
||||
B14B STX $81
|
||||
STA $82
|
||||
LDY #0
|
||||
STY $9D
|
||||
LDA $7F
|
||||
LDX $80
|
||||
STA $AA
|
||||
STX $AB
|
||||
LDA #$68
|
||||
STA $71
|
||||
STY $72
|
||||
B161 CMP $65
|
||||
BEQ $B16A
|
||||
JSR $B1D7
|
||||
BEQ $B161
|
||||
B16A LDA #6
|
||||
STA $A0
|
||||
LDA $7B
|
||||
LDX $7C
|
||||
STA $71
|
||||
STX $72
|
||||
B176 CPX $7E
|
||||
BNE $B17E
|
||||
CMP $7D
|
||||
BEQ $B183
|
||||
B17E JSR $B1D1
|
||||
BEQ $B176
|
||||
B183 STA $A4
|
||||
STX $A5
|
||||
LDA #4
|
||||
STA $A0
|
||||
B18B LDA $A4
|
||||
LDX $A5
|
||||
B18F CPX $80
|
||||
BNE $B19A
|
||||
CMP $7F
|
||||
BNE $B19A
|
||||
JMP $B216
|
||||
|
||||
B19A STA $71
|
||||
STX $72
|
||||
LDY #1
|
||||
LDA ($71),Y
|
||||
PHP
|
||||
INY
|
||||
LDA ($71),Y
|
||||
ADC $A4
|
||||
STA $A4
|
||||
INY
|
||||
LDA ($71),Y
|
||||
ADC $A5
|
||||
STA $A5
|
||||
PLP
|
||||
BPL $B18B
|
||||
INY
|
||||
LDA ($71),Y
|
||||
ASL A
|
||||
ADC #5
|
||||
ADC $71
|
||||
STA $71
|
||||
BCC $B1C2
|
||||
INC $72
|
||||
B1C2 LDX $72
|
||||
B1C4 CPX $A5
|
||||
BNE $B1CC
|
||||
CMP $A4
|
||||
BEQ $B18F
|
||||
B1CC JSR $B1D7
|
||||
BEQ $B1C4
|
||||
B1D1 INY
|
||||
LDA ($71),Y
|
||||
BPL $B206
|
||||
INY
|
||||
B1D7 LDA ($71),Y
|
||||
BEQ $B206
|
||||
INY
|
||||
LDA ($71),Y
|
||||
TAX
|
||||
INY
|
||||
LDA ($71),Y
|
||||
CMP $82
|
||||
BCC $B1EC
|
||||
BNE $B206
|
||||
CPX $81
|
||||
BCS $B206
|
||||
B1EC CMP $AB
|
||||
BCC $B206
|
||||
BNE $B1F6
|
||||
CPX $AA
|
||||
BCC $B206
|
||||
B1F6 STX $AA
|
||||
STA $AB
|
||||
LDA $71
|
||||
LDX $72
|
||||
STA $9C
|
||||
STX $9D
|
||||
DEY
|
||||
DEY
|
||||
STY $A2
|
||||
B206 LDA $A0
|
||||
CLC
|
||||
ADC $71
|
||||
STA $71
|
||||
BCC $B211
|
||||
INC $72
|
||||
B211 LDX $72
|
||||
LDY #0
|
||||
RTS
|
||||
|
||||
B216 DEC $A0
|
||||
LDX $9D
|
||||
BEQ $B211
|
||||
LDY $A2
|
||||
CLC
|
||||
LDA ($9C),Y
|
||||
ADC $AA
|
||||
STA $A6
|
||||
LDA $AB
|
||||
ADC #0
|
||||
STA $A7
|
||||
LDA $81
|
||||
LDX $82
|
||||
STA $A4
|
||||
STX $A5
|
||||
JSR LA1D6
|
||||
LDY $A2
|
||||
INY
|
||||
LDA $A4
|
||||
STA ($9C),Y
|
||||
TAX
|
||||
INC $A5
|
||||
LDA $A5
|
||||
INY
|
||||
STA ($9C),Y
|
||||
JMP $B14B
|
||||
|
||||
.BYTE $53,$54,$49,$42,$4F ; RUBBISH
|
||||
|
||||
|
||||
[Listing 4]
|
||||
|
||||
New garbage collection patch
|
||||
|
||||
1 ; NEW GARBAGE COLLECTION FIX FOR
|
||||
2 ; OSI/UK101 ROM BASIC 4-Oct-2001
|
||||
3
|
||||
4 B147 *= $B147
|
||||
5
|
||||
6 B147 A6 85 LDX $85
|
||||
7 B149 A5 86 LDA $86
|
||||
8 B14B 86 81 L1 STX $81
|
||||
9 B14D 85 82 STA $82
|
||||
10 B14F A0 00 LDY #0
|
||||
11 B151 84 9D STY $9D
|
||||
12 B153 84 9C STY $9C
|
||||
13 B155 A5 7F LDA $7F
|
||||
14 B157 A6 80 LDX $80
|
||||
15 B159 85 AA STA $AA
|
||||
16 B15B 86 AB STX $AB
|
||||
17 B15D A9 68 LDA #$68
|
||||
18 B15F 85 71 STA $71
|
||||
19 B161 84 72 STY $72
|
||||
20 B163 C5 65 L2 CMP $65
|
||||
21 B165 F0 05 BEQ L3
|
||||
22 B167 20 D8 B1 JSR L14
|
||||
23 B16A F0 F7 BEQ L2
|
||||
24 B16C A9 06 L3 LDA #6
|
||||
25 B16E 85 A0 STA $A0
|
||||
26 B170 A5 7B LDA $7B
|
||||
27 B172 A6 7C LDX $7C
|
||||
28 B174 85 71 STA $71
|
||||
29 B176 86 72 STX $72
|
||||
30 B178 E4 7E L4 CPX $7E
|
||||
31 B17A D0 04 BNE L5
|
||||
32 B17C C5 7D CMP $7D
|
||||
33 B17E F0 05 BEQ L6
|
||||
34 B180 20 D2 B1 L5 JSR L13
|
||||
35 B183 F0 F3 BEQ L4
|
||||
36 B185 85 A4 L6 STA $A4
|
||||
37 B187 86 A5 STX $A5
|
||||
38 B189 A9 04 LDA #4
|
||||
39 B18B 85 A0 STA $A0
|
||||
40 B18D A5 A4 L7 LDA $A4
|
||||
41 B18F A6 A5 LDX $A5
|
||||
42 B191 E4 80 L8 CPX $80
|
||||
43 B193 D0 04 BNE L9
|
||||
44 B195 C5 7F CMP $7F
|
||||
45 B197 F0 7E BEQ L19
|
||||
46
|
||||
47 B199 85 71 L9 STA $71
|
||||
48 B19B 86 72 STX $72
|
||||
49 B19D A0 01 LDY #1
|
||||
50 B19F B1 71 LDA ($71),Y
|
||||
51 B1A1 08 PHP
|
||||
52 B1A2 C8 INY
|
||||
53 B1A3 B1 71 LDA ($71),Y
|
||||
54 B1A5 65 A4 ADC $A4
|
||||
55 B1A7 85 A4 STA $A4
|
||||
56 B1A9 C8 INY
|
||||
57 B1AA B1 71 LDA ($71),Y
|
||||
58 B1AC 65 A5 ADC $A5
|
||||
59 B1AE 85 A5 STA $A5
|
||||
60 B1B0 28 PLP
|
||||
61 B1B1 10 DA BPL L7
|
||||
62 B1B3 C8 INY
|
||||
63 B1B4 B1 71 LDA ($71),Y
|
||||
64 B1B6 A0 00 LDY #0
|
||||
65 B1B8 0A ASL A
|
||||
66 B1B9 69 05 ADC #5
|
||||
67 B1BB 65 71 ADC $71
|
||||
68 B1BD 85 71 STA $71
|
||||
69 B1BF 90 02 BCC L10
|
||||
70 B1C1 E6 72 INC $72
|
||||
71 B1C3 A6 72 L10 LDX $72
|
||||
72 B1C5 E4 A5 L11 CPX $A5
|
||||
73 B1C7 D0 04 BNE L12
|
||||
74 B1C9 C5 A4 CMP $A4
|
||||
75 B1CB F0 C4 BEQ L8
|
||||
76 B1CD 20 D8 B1 L12 JSR L14
|
||||
77 B1D0 F0 F3 BEQ L11
|
||||
78
|
||||
79 B1D2 C8 L13 INY
|
||||
80 B1D3 B1 71 LDA ($71),Y
|
||||
81 B1D5 10 30 BPL L17
|
||||
82 B1D7 C8 INY
|
||||
83 B1D8 B1 71 L14 LDA ($71),Y
|
||||
84 B1DA F0 2B BEQ L17
|
||||
85 B1DC C8 INY
|
||||
86 B1DD B1 71 LDA ($71),Y
|
||||
87 B1DF AA TAX
|
||||
88 B1E0 C8 INY
|
||||
89 B1E1 B1 71 LDA ($71),Y
|
||||
90 B1E3 C5 82 CMP $82
|
||||
91 B1E5 90 06 BCC L15
|
||||
92 B1E7 D0 1E BNE L17
|
||||
93 B1E9 E4 81 CPX $81
|
||||
94 B1EB B0 1A BCS L17
|
||||
95 B1ED C5 AB L15 CMP $AB
|
||||
96 B1EF 90 16 BCC L17
|
||||
97 B1F1 D0 04 BNE L16
|
||||
98 B1F3 E4 AA CPX $AA
|
||||
99 B1F5 90 10 BCC L17
|
||||
100 B1F7 86 AA L16 STX $AA
|
||||
101 B1F9 85 AB STA $AB
|
||||
102 B1FB A5 71 LDA $71
|
||||
103 B1FD A6 72 LDX $72
|
||||
104 B1FF 85 9C STA $9C
|
||||
105 B201 86 9D STX $9D
|
||||
106 B203 88 DEY
|
||||
107 B204 88 DEY
|
||||
108 B205 84 A2 STY $A2
|
||||
109 B207 A5 A0 L17 LDA $A0
|
||||
110 B209 18 CLC
|
||||
111 B20A 65 71 ADC $71
|
||||
112 B20C 85 71 STA $71
|
||||
113 B20E 90 02 BCC L18
|
||||
114 B210 E6 72 INC $72
|
||||
115 B212 A6 72 L18 LDX $72
|
||||
116 B214 A0 00 LDY #0
|
||||
117 B216 60 RTS
|
||||
118
|
||||
119 B217 C6 A0 L19 DEC $A0
|
||||
120 B219 A5 9D LDA $9D
|
||||
121 B21B 05 9C ORA $9C
|
||||
122 B21D F0 F3 BEQ L18
|
||||
123 B21F A4 A2 LDY $A2
|
||||
124 B221 18 CLC
|
||||
125 B222 B1 9C LDA ($9C),Y
|
||||
126 B224 65 AA ADC $AA
|
||||
127 B226 85 A6 STA $A6
|
||||
128 B228 A5 AB LDA $AB
|
||||
129 B22A 69 00 ADC #0
|
||||
130 B22C 85 A7 STA $A7
|
||||
131 B22E A5 81 LDA $81
|
||||
132 B230 A6 82 LDX $82
|
||||
133 B232 85 A4 STA $A4
|
||||
134 B234 86 A5 STX $A5
|
||||
135 B236 20 D6 A1 JSR $A1D6
|
||||
136 B239 A4 A2 LDY $A2
|
||||
137 B23B C8 INY
|
||||
138 B23C A5 A4 LDA $A4
|
||||
139 B23E 91 9C STA ($9C),Y
|
||||
140 B240 AA TAX
|
||||
141 B241 E6 A5 INC $A5
|
||||
142 B243 A5 A5 LDA $A5
|
||||
143 B245 C8 INY
|
||||
144 B246 91 9C STA ($9C),Y
|
||||
145 B248 4C 4B B1 JMP L1
|
||||
146
|
||||
147 B24B FF FF .BYTE $FF,$FF
|
||||
148
|
||||
149 B24D .END
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Contents of ROM image: http://www.pcjs.org/devices/c1p/roms/basic-gcpatch.rom
|
||||
* Contents of ROM image: http://archive.pcjs.org/devices/c1p/rom/basic-gcpatch.rom
|
||||
*/
|
||||
[0x39,0xa6,0x55,0xa5,0x3f,0xaa,0x0b,0xa7,0x22,0xa9,0x00,0xad,0x4e,0xa9,0xb8,0xa7, // 0x0000: 9.U.?..."...N...
|
||||
0xb8,0xa6,0x90,0xa6,0x3b,0xa7,0x19,0xa6,0x9b,0xa6,0xe5,0xa6,0x4e,0xa7,0x37,0xa6, // 0x0010: ....;.......N.7.
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Contents of ROM image: http://www.pcjs.org/devices/c1p/roms/basic.rom
|
||||
* Contents of ROM image: http://archive.pcjs.org/devices/c1p/rom/basic.rom
|
||||
*/
|
||||
[0x39,0xa6,0x55,0xa5,0x3f,0xaa,0x0b,0xa7,0x22,0xa9,0x00,0xad,0x4e,0xa9,0xb8,0xa7, // 0x0000: 9.U.?..."...N...
|
||||
0xb8,0xa6,0x90,0xa6,0x3b,0xa7,0x19,0xa6,0x9b,0xa6,0xe5,0xa6,0x4e,0xa7,0x37,0xa6, // 0x0010: ....;.......N.7.
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Contents of ROM image: http://www.pcjs.org/devices/c1p/roms/system.rom
|
||||
* Contents of ROM image: http://archive.pcjs.org/devices/c1p/rom/system.rom
|
||||
*/
|
||||
[0xa0,0x00,0x8c,0x01,0xc0,0x8c,0x00,0xc0,0xa2,0x04,0x8e,0x01,0xc0,0x8c,0x03,0xc0, // 0x0000: ................
|
||||
0x88,0x8c,0x02,0xc0,0x8e,0x03,0xc0,0x8c,0x02,0xc0,0xa9,0xfb,0xd0,0x09,0xa9,0x02, // 0x0010: ................
|
||||
|
|
|
|||
14
devices/c1p/video/README.md
Normal file
14
devices/c1p/video/README.md
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
---
|
||||
layout: page
|
||||
title: Challenger 1P Video Resources
|
||||
permalink: /devices/c1p/video/
|
||||
---
|
||||
|
||||
Challenger 1P Video Resources
|
||||
---
|
||||
|
||||
The following C1P Video Character Generator images available:
|
||||
|
||||
- [8x8](chargen1x.png)
|
||||
- [16x16](chargen2x.png)
|
||||
- [32x32](chargen4x.png)
|
||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue