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/
|
ecp/
|
||||||
projects/
|
projects/
|
||||||
private/
|
private/
|
||||||
|
restricted/
|
||||||
src/
|
src/
|
||||||
tmp/
|
tmp/
|
||||||
|
unlisted/
|
||||||
|
|
|
||||||
86
Gruntfile.js
86
Gruntfile.js
|
|
@ -108,7 +108,7 @@ module.exports = function(grunt) {
|
||||||
* "<%= pkg.name %>"
|
* "<%= pkg.name %>"
|
||||||
*
|
*
|
||||||
* which would be fine for most of my needs, but some of the information I need
|
* 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.
|
* 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} name
|
||||||
* @property {string} version
|
* @property {string} version
|
||||||
* @property {Array.<string>} c1pJSFiles
|
* @property {Array.<string>} c1pJSFiles
|
||||||
* @property {Array.<string>} pcJSFiles
|
* @property {Array.<string>} pcX86Files
|
||||||
* @property {Array.<string>} pc8080Files
|
* @property {Array.<string>} pc8080Files
|
||||||
* @property {Array.<string>} closureCompilerExterns
|
* @property {Array.<string>} closureCompilerExterns
|
||||||
*/
|
*/
|
||||||
var pkg = grunt.file.readJSON("package.json");
|
var pkg = grunt.file.readJSON("package.json");
|
||||||
|
|
||||||
var tmpC1Pjs = "./tmp/c1pjs/" + pkg.version + "/c1p.js";
|
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";
|
var tmpPC8080 = "./tmp/pc8080/" + pkg.version + "/pc8080.js";
|
||||||
|
|
||||||
grunt.initConfig({
|
grunt.initConfig({
|
||||||
|
|
@ -153,18 +153,18 @@ module.exports = function(grunt) {
|
||||||
src: pkg.c1pJSFiles,
|
src: pkg.c1pJSFiles,
|
||||||
dest: "./versions/c1pjs/" + pkg.version + "/c1p-dbg.js"
|
dest: "./versions/c1pjs/" + pkg.version + "/c1p-dbg.js"
|
||||||
},
|
},
|
||||||
"pc.js": {
|
"pcx86.js": {
|
||||||
src: pkg.pcJSFiles,
|
src: pkg.pcX86Files,
|
||||||
dest: "./versions/pcjs/" + pkg.version + "/pc.js",
|
dest: "./versions/pcx86/" + pkg.version + "/pcx86.js",
|
||||||
options: {
|
options: {
|
||||||
process: function(src, filepath) {
|
process: function(src, filepath) {
|
||||||
return (path.basename(filepath) == "debugger.js"? "" : src);
|
return (path.basename(filepath) == "debugger.js"? "" : src);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"pc-dbg.js": {
|
"pcx86-dbg.js": {
|
||||||
src: pkg.pcJSFiles,
|
src: pkg.pcX86Files,
|
||||||
dest: "./versions/pcjs/" + pkg.version + "/pc-dbg.js"
|
dest: "./versions/pcx86/" + pkg.version + "/pcx86-dbg.js"
|
||||||
},
|
},
|
||||||
"pc8080.js": {
|
"pc8080.js": {
|
||||||
src: pkg.pc8080Files,
|
src: pkg.pc8080Files,
|
||||||
|
|
@ -190,9 +190,9 @@ module.exports = function(grunt) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"tmp-pcjs": {
|
"tmp-pcx86": {
|
||||||
src: pkg.pcJSFiles,
|
src: pkg.pcX86Files,
|
||||||
dest: tmpPCjs,
|
dest: tmpPCx86,
|
||||||
options: {
|
options: {
|
||||||
banner: '"use strict";\n\n',
|
banner: '"use strict";\n\n',
|
||||||
process: function(src, filepath) {
|
process: function(src, filepath) {
|
||||||
|
|
@ -225,9 +225,9 @@ module.exports = function(grunt) {
|
||||||
src: pkg.c1pJSFiles,
|
src: pkg.c1pJSFiles,
|
||||||
dest: tmpC1Pjs
|
dest: tmpC1Pjs
|
||||||
},
|
},
|
||||||
"pc.js": {
|
"pcx86.js": {
|
||||||
src: pkg.pcJSFiles,
|
src: pkg.pcX86Files,
|
||||||
dest: tmpPCjs
|
dest: tmpPCx86
|
||||||
},
|
},
|
||||||
"pc8080.js": {
|
"pc8080.js": {
|
||||||
src: pkg.pc8080Files,
|
src: pkg.pc8080Files,
|
||||||
|
|
@ -290,7 +290,7 @@ module.exports = function(grunt) {
|
||||||
*/
|
*/
|
||||||
TEMPcompilerOpts: {
|
TEMPcompilerOpts: {
|
||||||
// create_source_map: "./tmp/c1pjs/" + pkg.version + "/c1p.map",
|
// 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"],
|
"\"SITEHOST='www.pcjs.org'\"", "COMPILED=true", "DEBUG=false"],
|
||||||
// output_wrapper: "\"(function(){%output%})();//@ sourceMappingURL=/tmp/c1pjs/" + pkg.version + "/c1p.map\""
|
// output_wrapper: "\"(function(){%output%})();//@ sourceMappingURL=/tmp/c1pjs/" + pkg.version + "/c1p.map\""
|
||||||
output_wrapper: "\"(function(){%output%})();\""
|
output_wrapper: "\"(function(){%output%})();\""
|
||||||
|
|
@ -302,7 +302,7 @@ module.exports = function(grunt) {
|
||||||
"c1p-dbg.js": {
|
"c1p-dbg.js": {
|
||||||
TEMPcompilerOpts: {
|
TEMPcompilerOpts: {
|
||||||
// create_source_map: "./tmp/c1pjs/" + pkg.version + "/c1p-dbg.map",
|
// 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"],
|
"\"SITEHOST='www.pcjs.org'\"", "COMPILED=true", "DEBUG=false"],
|
||||||
// output_wrapper: "\"(function(){%output%})();//@ sourceMappingURL=/tmp/c1pjs/" + pkg.version + "/c1p-dbg.map\""
|
// output_wrapper: "\"(function(){%output%})();//@ sourceMappingURL=/tmp/c1pjs/" + pkg.version + "/c1p-dbg.map\""
|
||||||
output_wrapper: "\"(function(){%output%})();\""
|
output_wrapper: "\"(function(){%output%})();\""
|
||||||
|
|
@ -311,37 +311,37 @@ module.exports = function(grunt) {
|
||||||
src: tmpC1Pjs,
|
src: tmpC1Pjs,
|
||||||
dest: "./versions/c1pjs/" + pkg.version + "/c1p-dbg.js"
|
dest: "./versions/c1pjs/" + pkg.version + "/c1p-dbg.js"
|
||||||
},
|
},
|
||||||
"pc.js": {
|
"pcx86.js": {
|
||||||
TEMPcompilerOpts: {
|
TEMPcompilerOpts: {
|
||||||
// create_source_map: "./tmp/pcjs/" + pkg.version + "/pc.map",
|
// create_source_map: "./tmp/pcx86/" + pkg.version + "/pcx86.map",
|
||||||
define: ["\"APPNAME='PCjs'\"", "\"APPVERSION='" + pkg.version + "'\"", "DEBUGGER=false",
|
define: ["\"APPVERSION='" + pkg.version + "'\"", "DEBUGGER=false",
|
||||||
"\"SITEHOST='www.pcjs.org'\"", "COMPILED=true", "DEBUG=false", "BACKTRACK=false", "I386=true"],
|
"\"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%})();\""
|
output_wrapper: "\"(function(){%output%})();\""
|
||||||
},
|
},
|
||||||
// src: pkg.pcJSFiles,
|
// src: pkg.pcX86Files,
|
||||||
src: tmpPCjs,
|
src: tmpPCx86,
|
||||||
dest: "./versions/pcjs/" + pkg.version + "/pc.js"
|
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.
|
* 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: {
|
TEMPcompilerOpts: {
|
||||||
// create_source_map: "./tmp/pcjs/" + pkg.version + "/pc-dbg.map",
|
// create_source_map: "./tmp/pcx86/" + pkg.version + "/pcx86-dbg.map",
|
||||||
define: ["\"APPNAME='PCjs'\"", "\"APPVERSION='" + pkg.version + "'\"",
|
define: ["\"APPVERSION='" + pkg.version + "'\"",
|
||||||
"\"SITEHOST='www.pcjs.org'\"", "COMPILED=true", "DEBUG=false", "BACKTRACK=false", "I386=true"],
|
"\"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%})();\""
|
output_wrapper: "\"(function(){%output%})();\""
|
||||||
},
|
},
|
||||||
// src: pkg.pcJSFiles,
|
// src: pkg.pcX86Files,
|
||||||
src: tmpPCjs,
|
src: tmpPCx86,
|
||||||
dest: "./versions/pcjs/" + pkg.version + "/pc-dbg.js"
|
dest: "./versions/pcx86/" + pkg.version + "/pcx86-dbg.js"
|
||||||
},
|
},
|
||||||
"pc8080.js": {
|
"pc8080.js": {
|
||||||
TEMPcompilerOpts: {
|
TEMPcompilerOpts: {
|
||||||
// create_source_map: "./tmp/pc8080/" + pkg.version + "/pc8080.map",
|
// 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"],
|
"\"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%})();//@ sourceMappingURL=/tmp/pc8080/" + pkg.version + "/pc8080.map\""
|
||||||
output_wrapper: "\"(function(){%output%})();\""
|
output_wrapper: "\"(function(){%output%})();\""
|
||||||
|
|
@ -356,7 +356,7 @@ module.exports = function(grunt) {
|
||||||
*/
|
*/
|
||||||
TEMPcompilerOpts: {
|
TEMPcompilerOpts: {
|
||||||
// create_source_map: "./tmp/pc8080/" + pkg.version + "/pc8080-dbg.map",
|
// 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"],
|
"\"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%})();//@ sourceMappingURL=/tmp/pc8080/" + pkg.version + "/pc8080-dbg.map\""
|
||||||
output_wrapper: "\"(function(){%output%})();\""
|
output_wrapper: "\"(function(){%output%})();\""
|
||||||
|
|
@ -402,19 +402,19 @@ module.exports = function(grunt) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"pcjs": {
|
"pcx86": {
|
||||||
files: [
|
files: [
|
||||||
{
|
{
|
||||||
cwd: "modules/shared/templates/",
|
cwd: "modules/shared/templates/",
|
||||||
src: ["common.css", "common.xsl", "components.*", "document.css", "document.xsl", "machine.xsl", "manifest.xsl", "outline.xsl"],
|
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
|
expand: true
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
options: {
|
options: {
|
||||||
process: function(content, srcPath) {
|
process: function(content, srcPath) {
|
||||||
var s = content.replace(/(<xsl:variable name="APPVERSION">)[^<]*(<\/xsl:variable>)/g, "$1" + pkg.version + "$2");
|
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, "");
|
s = s.replace(/[ \t]*\/\*[^\*][\s\S]*?\*\//g, "").replace(/[ \t]*<!--[^@]*?-->[ \t]*\n?/g, "");
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
@ -443,9 +443,9 @@ module.exports = function(grunt) {
|
||||||
"examples": {
|
"examples": {
|
||||||
files: [
|
files: [
|
||||||
{
|
{
|
||||||
cwd: "versions/pcjs/<%= pkg.version %>/",
|
cwd: "versions/pcx86/<%= pkg.version %>/",
|
||||||
src: ["pc.js", "pc-dbg.js", "components.css", "components.xsl"],
|
src: ["pcx86.js", "pcx86-dbg.js", "components.css", "components.xsl"],
|
||||||
dest: "docs/pcjs/examples/",
|
dest: "docs/pcx86/examples/",
|
||||||
expand: true
|
expand: true
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|
@ -520,14 +520,14 @@ module.exports = function(grunt) {
|
||||||
args: []
|
args: []
|
||||||
},
|
},
|
||||||
"zip-examples": {
|
"zip-examples": {
|
||||||
options: {cwd: "docs/pcjs/examples"},
|
options: {cwd: "docs/pcx86/examples"},
|
||||||
cmd: "./zip.sh",
|
cmd: "./zip.sh",
|
||||||
args: ["v" + pkg.version + ".zip"]
|
args: ["v" + pkg.version + ".zip"]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
replace: {
|
replace: {
|
||||||
"fix-source-maps": {
|
"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,
|
overwrite: true,
|
||||||
replacements: [
|
replacements: [
|
||||||
{
|
{
|
||||||
|
|
@ -560,13 +560,13 @@ module.exports = function(grunt) {
|
||||||
|
|
||||||
grunt.loadTasks("modules/grunts/prepjs/tasks");
|
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("compile", ["preCompiler", "closureCompiler", "replace:fix-source-maps"]);
|
||||||
|
|
||||||
grunt.registerTask('nocompile', function(target) {
|
grunt.registerTask('nocompile', function(target) {
|
||||||
if (!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 {
|
} else {
|
||||||
grunt.task.run("concat:" + target);
|
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.
|
Welcome to PCjs, home of [PCx86](/docs/pcx86/), the original IBM PC simulation written entirely JavaScript. It is
|
||||||
It was added to the [JavaScript Machines](/docs/about/) project in Fall 2012, and it is now part of the
|
one of several JavaScript Machines in the [PCjs Project](https://github.com/jeffpar/pcjs), an open-source project that
|
||||||
[PCjs Project](https://github.com/jeffpar/pcjs) on GitHub.
|
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
|
All PCjs computer simulations are written entirely in [JavaScript](/modules/). No Flash, Java or other plugins are
|
||||||
* [PC8080](/modules/pc8080/), a 8080-based generic machine emulator
|
required. Supported browsers include modern versions of Chrome, Safari, Firefox, Internet Explorer (v9.0 and up), Edge,
|
||||||
* [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,
|
|
||||||
and assorted mobile browsers.
|
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,
|
The [JavaScript Machine](/devices/pcx86/machine/5150/mda/64kb/) above uses [PCx86](/docs/pcx86/) configured with an Intel
|
||||||
with 64Kb of RAM and an IBM Monochrome Display Adapter. For more control, there are also
|
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/)
|
[Control Panel](/devices/pcx86/machine/5150/mda/64kb/debugger/) and [Soft Keyboard](/devices/pcx86/machine/5150/mda/64kb/softkbd/)
|
||||||
configurations, featuring the built-in PCjs Debugger. For even greater control, build your own PC. The
|
configurations, featuring the built-in PCx86 Debugger. For even greater control, build your own PC. The
|
||||||
[PCjs Documentation](/docs/pcjs/) will help you get started.
|
[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
|
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.
|
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.
|
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
|
There are many more [PCx86 Demos](/devices/pcx86/machine/#ready-to-run-app-demos), including an
|
||||||
[IBM PC with Dual Displays](/devices/pc/machine/5150/dual/64kb/) demonstrating early multi-monitor support,
|
[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/pc/machine/5160/cga/256kb/array/)
|
and multiple IBM PC XT machines running side-by-side with [CGA Displays](/devices/pcx86/machine/5160/cga/256kb/array/)
|
||||||
and [EGA Displays](/devices/pc/machine/5160/ega/640kb/array/).
|
and [EGA Displays](/devices/pcx86/machine/5160/ega/640kb/array/).
|
||||||
|
|
||||||
C1Pjs
|
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
|
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/).
|
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
|
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,
|
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/pcjs/examples/) and
|
with or without a web server, and examples are provided for both [local](/docs/pcx86/examples/) and
|
||||||
[remote](http://www.pcjs.org/) operation.
|
[remote](http://www.pcjs.org/) operation.
|
||||||
|
|
||||||
The project includes:
|
The project includes:
|
||||||
|
|
@ -78,8 +76,8 @@ The project includes:
|
||||||
- A simple Node-based web server ([server.js](server.js))
|
- 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/))
|
- 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/))
|
- 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
|
- The [PCx86](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
|
- 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
|
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.
|
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:".
|
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
|
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
|
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.
|
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
|
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
|
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
|
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
|
[Closure Compiler](https://developers.google.com/closure/compiler/) if any of the target files (eg, pcx86.js or
|
||||||
in the [/versions](versions/) directory) are out-of date.
|
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
|
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
|
[/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
|
layout: page
|
||||||
permalink: /
|
permalink: /
|
||||||
machines:
|
machines:
|
||||||
- type: pc
|
- type: pcx86
|
||||||
id: ibm5150
|
id: ibm5150
|
||||||
name: "IBM PC (Model 5150) with Monochrome Display"
|
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
|
- type: c1p
|
||||||
id: demoC1P
|
id: demoC1P
|
||||||
config: /devices/c1p/machine/8kb/large/machine.xml
|
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
|
### 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:
|
run a series of automated tests, etc:
|
||||||
|
|
||||||
cd modules/pcjs/bin
|
cd modules/pcx86/bin
|
||||||
node pcjs
|
node pcx86
|
||||||
|
|
||||||
The [pcjs](modules/pcjs/bin/pcjs) script in [modules/pcjs/bin](modules/pcjs/bin) loads
|
The [pcx86](modules/pcx86/bin/pcx86) script in [modules/pcx86/bin](modules/pcx86/bin) loads
|
||||||
all the PCjs browser scripts listed in the root [package.json](/package.json) and then starts a Node REPL
|
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
|
("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.
|
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
|
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
|
[ibm5150.json](modules/pcx86/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/)
|
of the [machine.xml](devices/pcx86/machine/5150/mda/64kb/machine.xml) displayed on the [pcjs.org](http://www.pcjs.org/)
|
||||||
home page.
|
home page.
|
||||||
|
|
||||||
The command-line loader creates all the JSON-defined machine components in the same order that the browser creates
|
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:
|
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
|
In fact, any number of "--cmd" arguments can be included on the command-line. A batch file syntax will eventually be
|
||||||
added, too.
|
added, too.
|
||||||
|
|
||||||
When PCjs runs in a browser, an XML machine configuration file is transformed into HTML with a set of DIVs for each
|
When a PCjs machine runs in a browser, an XML machine configuration file is transformed into HTML with a set of DIVs
|
||||||
component: an "object" DIV whose *data-value* attribute provides the initialization parameters for the corresponding
|
for each component: an "object" DIV whose *data-value* attribute provides the initialization parameters for the
|
||||||
component, along with a set of optional "control" DIVs that the component can bind to (eg, a "Run" button, or a visual
|
corresponding component, along with a set of optional "control" DIVs that the component can bind to (eg, a "Run" button,
|
||||||
representation of DIP switches, or whatever).
|
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
|
When a PCjs machine is run from the command-line, there is no XML, HTML, or DIVs involved; this is basically a
|
||||||
of PCjs, so there is no simple way to view a machine's video display or interact with its keyboard, mouse, etc.
|
"headless" version of the machine, so there is no simple way to view its video display or interact with its keyboard,
|
||||||
You have to use Debugger commands to dump the machine's video buffer.
|
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
|
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
|
and server operation: PCjs machines on the client supports *only* XML machine configuration files, whereas PCjs machines
|
||||||
supports *only* JSON machine configuration files.
|
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
|
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.
|
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
|
### 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:
|
and C1Pjs much easier to debug, albeit much slower:
|
||||||
|
|
||||||
http://localhost:8088/?gort=debug
|
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
|
The "gort=debug" command is unnecessary if the server is started with `--debug`; the server always serves uncompiled
|
||||||
files when running in debug mode.
|
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
|
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)
|
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
|
2. Run the "grunt promote" task to bump the version in all the machine XML files
|
||||||
3. Make changes
|
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/).
|
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
|
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
|
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,
|
[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.
|
or (at your option) any later version.
|
||||||
|
|
@ -419,8 +417,8 @@ See [LICENSE](/LICENSE) for details.
|
||||||
|
|
||||||
More Information
|
More Information
|
||||||
---
|
---
|
||||||
Learn more about the [JavaScript Machines](/docs/about/) Project and [PCjs](/docs/about/pcjs/). To
|
Learn more about the [PCjs Project](/docs/about/) and [PCx86](/docs/about/pcx86/). To
|
||||||
create your own PCjs machines, see the [Documentation](/docs/pcjs/) for details.
|
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
|
If you have questions or run into any problems, feel free to [tweet](http://twitter.com/jeffpar) or
|
||||||
[email](mailto:Jeff@pcjs.org).
|
[email](mailto:Jeff@pcjs.org).
|
||||||
|
|
|
||||||
101
_config.yml
101
_config.yml
|
|
@ -1,13 +1,12 @@
|
||||||
# Site settings
|
# Site settings
|
||||||
|
|
||||||
title: "PCjs: The Virtual IBM PC"
|
title: "PCjs Machines"
|
||||||
email: Jeff@pcjs.org
|
email: Jeff@pcjs.org
|
||||||
description: >
|
description: >
|
||||||
PCjs: The Original IBM PC in a Browser.
|
PCjs: Home of the original IBM PC emulator in a browser.
|
||||||
Classic computer simulations in JavaScript.
|
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.
|
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
|
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"
|
url: "http://www.pcjs.org" # "http://jeffpar.github.io" or "http://www.pcjs.org"
|
||||||
twitter_username: jeffpar
|
twitter_username: jeffpar
|
||||||
|
|
@ -33,52 +32,9 @@ gems:
|
||||||
|
|
||||||
pcjs:
|
pcjs:
|
||||||
domain: pcjs.org # whereas site.url is used for linking purposes, site.pcjs.domain is used for display purposes
|
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
|
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, pc.js or pc-dbg.js)
|
compiled: true # by default, the compiled pcjs.version scripts will be used (eg, pcx86.js or pcx86-dbg.js)
|
||||||
pc_scripts: # if pcjs.compiled is false, the following scripts will be included instead, in the order listed
|
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/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:
|
|
||||||
- /modules/shared/lib/defines.js
|
- /modules/shared/lib/defines.js
|
||||||
- /modules/shared/lib/nodebug.js
|
- /modules/shared/lib/nodebug.js
|
||||||
- /modules/shared/lib/dumpapi.js
|
- /modules/shared/lib/dumpapi.js
|
||||||
|
|
@ -99,6 +55,49 @@ pcjs:
|
||||||
- /modules/c1pjs/lib/debugger.js
|
- /modules/c1pjs/lib/debugger.js
|
||||||
- /modules/c1pjs/lib/computer.js
|
- /modules/c1pjs/lib/computer.js
|
||||||
- /modules/shared/lib/embed.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:
|
pc8080_scripts:
|
||||||
- /modules/shared/lib/defines.js
|
- /modules/shared/lib/defines.js
|
||||||
- /modules/shared/lib/dumpapi.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")
|
'id' (eg, "ibm5150")
|
||||||
'name' (eg, "IBM PC (Model 5150) with Monochrome Display")
|
'name' (eg, "IBM PC (Model 5150) with Monochrome Display")
|
||||||
'type' (eg. "c1p", "pc", "pc8080")
|
'type' (eg, "c1p", "pcx86", "pc8080")
|
||||||
'debugger' (default is false)
|
'debugger' (default is false)
|
||||||
'config' (default is "machine.xml")
|
'config' (default is "machine.xml")
|
||||||
'template' (default is "machine.xsl")
|
'template' (default is "machine.xsl")
|
||||||
|
|
@ -34,17 +34,23 @@ of our Markdown or XML documents. Examples: 'automount' becomes 'autoMount', 'a
|
||||||
{% endcomment %}
|
{% endcomment %}
|
||||||
{% for machine in page.machines %}
|
{% for machine in page.machines %}
|
||||||
{% capture machine_type %}{{ machine.type | remove:"-dbg" }}{% endcapture %}
|
{% 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 %}
|
{% capture machine_app %}{{ machine_type }}{% endcapture %}
|
||||||
{% else %}
|
{% else %}
|
||||||
{% capture machine_app %}{{ machine_type }}js{% endcapture %}
|
{% capture machine_app %}{{ machine_type }}js{% endcapture %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if machine.debugger %}
|
{% if machine.debugger %}
|
||||||
{% capture machine_file %}{{ machine_type }}-dbg{% endcapture %}
|
{% capture machine_file %}{{ machine_type }}-dbg{% endcapture %}
|
||||||
|
{% assign machine_debugger = true %}
|
||||||
{% else %}
|
{% else %}
|
||||||
{% capture machine_file %}{{ machine.type }}{% endcapture %}
|
{% capture machine_file %}{{ machine.type }}{% endcapture %}
|
||||||
|
{% if machine.type != machine_type %}
|
||||||
|
{% assign machine_debugger = true %}
|
||||||
|
{% else %}
|
||||||
|
{% assign machine_debugger = false %}
|
||||||
|
{% endif %}
|
||||||
{% 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 != nil %}
|
||||||
{% if machine.automount == "" %}
|
{% if machine.automount == "" %}
|
||||||
{% assign machine_autoMount = "{}" %}
|
{% assign machine_autoMount = "{}" %}
|
||||||
|
|
@ -103,7 +109,7 @@ of our Markdown or XML documents. Examples: 'automount' becomes 'autoMount', 'a
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% else %}
|
{% else %}
|
||||||
{% if machine_type == "c1p" %}{% assign array_scripts = site.pcjs.c1p_scripts %}{% endif %}
|
{% 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 %}
|
{% if machine_type == "pc8080" %}{% assign array_scripts = site.pcjs.pc8080_scripts %}{% endif %}
|
||||||
{% for script in array_scripts %}
|
{% for script in array_scripts %}
|
||||||
{% if script != "/modules/shared/lib/nodebug.js" or machine.debug != true %}
|
{% 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 %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if script contains "js/lib/defines.js" %}
|
{% if script contains "js/lib/defines.js" %}
|
||||||
{% if machine.debugger != true %}
|
{% if machine_debugger != true %}
|
||||||
{{ machine_script | replace:"defines.js","nodebugger.js" }}
|
{{ machine_script | replace:"defines.js","nodebugger.js" }}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,12 @@
|
||||||
{% for machine in page.machines %}
|
{% for machine in page.machines %}
|
||||||
{% capture machine_type %}{{ machine.type | remove:"-dbg" }}{% endcapture %}
|
{% 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 %}
|
{% capture machine_app %}{{ machine_type }}{% endcapture %}
|
||||||
{% else %}
|
{% else %}
|
||||||
{% capture machine_app %}{{ machine_type }}js{% endcapture %}
|
{% capture machine_app %}{{ machine_type }}js{% endcapture %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% unless site.pcjs.compiled == true and machine.uncompiled != true %}
|
{% 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 %}
|
{% capture machine_style %}{{ site.baseurl }}/modules/shared/templates/components.css{% endcapture %}
|
||||||
{% else %}
|
{% else %}
|
||||||
{% capture machine_style %}{{ site.baseurl }}/modules/{{ machine_app }}/templates/components.css{% endcapture %}
|
{% 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,
|
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:
|
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.
|
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
|
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.
|
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
|
The variety of configurations was getting out of hand. It's a bit tidier now, but there's still room for
|
||||||
improvement.
|
improvement.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,7 @@ while I can understand some whitespace inconsistencies across web servers, I wou
|
||||||
on the server to modify file contents.
|
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,
|
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
|
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
|
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
|
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.
|
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.
|
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*)
|
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),
|
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.
|
stylesheets. And occasionally Safari -- and ONLY Safari -- will render those XML files as blank pages.
|
||||||
|
|
||||||
For example, here's the
|
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.
|
[{{ 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),
|
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"
|
efficiently. The rest of the changes to the website involved beefing up support for both "software manifests"
|
||||||
and "document 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
|
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.
|
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
|
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
|
diagnostics and run [Windows 1.01](/devices/pcx86/machine/5160/ega/640kb/win101/) in color. Check out our
|
||||||
[Windows 1.01 "Server Array"](/devices/pc/machine/5160/ega/640kb/array/) demo.
|
[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)
|
[<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:
|
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
|
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:
|
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:
|
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 *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
|
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/
|
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
|
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
|
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
|
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
|
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.
|
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
|
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:
|
But now, a machine XML file can specify:
|
||||||
|
|
||||||
<computer name="IBM PC AT" buswidth="24"/>
|
```xml
|
||||||
<cpu model="80286"/>
|
<computer name="IBM PC AT" buswidth="24"/>
|
||||||
<chipset model="5170"/>
|
<cpu model="80286"/>
|
||||||
...
|
<chipset model="5170"/>
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
Conventional emulators are usually NOT able to run original BIOS images, or simulate original PC hardware,
|
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
|
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 PCjs simulation
|
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
|
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.
|
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
|
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
|
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 PCjs is shooting for.
|
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
|
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.
|
completion is a *very* long series of baby steps.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -6,8 +6,8 @@ category: Releases
|
||||||
permalink: /blog/2014/09/13/
|
permalink: /blog/2014/09/13/
|
||||||
---
|
---
|
||||||
|
|
||||||
My first IBM PC AT (Model 5170) [Test Configuration](/devices/pc/machine/5170/ega/640kb/rev1/debugger/) finally
|
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/pc/rom/5170/),
|
boots to a PC-DOS prompt. The configuration uses the original [IBM Model 5170 ROM BIOS](/devices/pcx86/rom/5170/),
|
||||||
dated January 10, 1984.
|
dated January 10, 1984.
|
||||||
|
|
||||||
Getting through the BIOS "POST" (Power-On Self Test) diagnostics was like running an obstacle course, with various
|
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
|
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.
|
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
|
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 disk controller), and the keyboard *barely* works; the 8042
|
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
|
Keyboard Controller and AT keyboard had a number of features that older PC/XT keyboards did not (like LEDs and
|
||||||
programmable repeat rate).
|
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)
|
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.
|
to those files for more information.
|
||||||
|
|
||||||
### Braces and Parentheses
|
### 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.
|
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
|
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.
|
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
|
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/
|
permalink: /blog/2014/10/13/
|
||||||
---
|
---
|
||||||
|
|
||||||
I just added my first [8Mhz IBM PC AT](/devices/pc/machine/5170/ega/1152kb/rev3/debugger/) machine configuration
|
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/pc/machine/), and not surprisingly, the new machine
|
to the list of [IBM PC Machine Configurations](/devices/pcx86/machine/), and not surprisingly, the new machine
|
||||||
fails to boot.
|
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
|
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.
|
images I would like to be able to read in a PCjs machine.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -6,23 +6,23 @@ category: Releases
|
||||||
permalink: /blog/2014/10/17/
|
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:
|
[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
|
+ 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
|
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
|
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.
|
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
|
+ 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
|
"double-stepping" test to work (double-stepping is required on an 80-track drive when attempting to read
|
||||||
a 40-track diskette).
|
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
|
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
|
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
|
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,
|
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
|
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.
|
"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
|
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.
|
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
|
[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.
|
from working properly.
|
||||||
|
|
||||||
There are also some Debugger improvements; for example, if you turn on "fdc" and "int" messages in the
|
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)".
|
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
|
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
|
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)*
|
*[@jeffpar](http://twitter.com/jeffpar)*
|
||||||
*October 23, 2014*
|
*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
|
[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
|
[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
|
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
|
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
|
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
|
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.
|
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
|
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").
|
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
|
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.
|
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
|
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/pc/os2/misc/), you can click on the **Control Panel** output window, press Ctrl-C, and
|
[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
|
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
|
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.
|
(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
|
layout: post
|
||||||
title: PCjs Uncompiled
|
title: PCx86 Uncompiled
|
||||||
date: 2015-01-17 11:00:00
|
date: 2015-01-17 11:00:00
|
||||||
category: Features
|
category: Features
|
||||||
permalink: /blog/2015/01/17/
|
permalink: /blog/2015/01/17/
|
||||||
machines:
|
machines:
|
||||||
- type: pc
|
- type: pcx86
|
||||||
id: at-ega-1152k-rev3
|
id: at-ega-1152k-rev3
|
||||||
debugger: true
|
debugger: true
|
||||||
uncompiled: 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
|
Most PCx86 machines on [{{ site.pcjs.domain }}](/) run with a compiled version of PCx86, which is produced
|
||||||
by running PCjs JavaScript source code through Google's Closure Compiler, yielding a smaller (minified)
|
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.
|
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
|
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
|
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.
|
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**.
|
to *true*, overriding the value of `site.pcjs.compiled` in **_config.yml**.
|
||||||
|
|
||||||
Here's what a typical Markdown file would look like:
|
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:
|
machines:
|
||||||
- type: pc
|
- type: pcx86
|
||||||
id: at-ega-1152k-rev3
|
id: at-ega-1152k-rev3
|
||||||
debugger: true
|
debugger: true
|
||||||
uncompiled: 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" %}
|
{% include machine.html id="at-ega-1152k-rev3" %}
|
||||||
|
|
|
||||||
|
|
@ -1,18 +1,18 @@
|
||||||
---
|
---
|
||||||
layout: post
|
layout: post
|
||||||
title: New PCjs Control Panel
|
title: New PCx86 Control Panel
|
||||||
date: 2015-01-28 11:00:00
|
date: 2015-01-28 11:00:00
|
||||||
category: Control Panel
|
category: Control Panel
|
||||||
permalink: /blog/2015/01/28/
|
permalink: /blog/2015/01/28/
|
||||||
machines:
|
machines:
|
||||||
- type: pc
|
- type: pcx86
|
||||||
id: at-ega-1152k-rev3
|
id: at-ega-1152k-rev3
|
||||||
debugger: true
|
debugger: true
|
||||||
uncompiled: 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.
|
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.
|
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
|
category: 80386
|
||||||
permalink: /blog/2015/02/22/
|
permalink: /blog/2015/02/22/
|
||||||
machines:
|
machines:
|
||||||
- type: pc
|
- type: pcx86
|
||||||
id: deskpro386
|
id: deskpro386
|
||||||
debugger: true
|
debugger: true
|
||||||
uncompiled: 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
|
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 PCjs.
|
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
|
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
|
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
|
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.
|
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
|
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.
|
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
|
category: 80386
|
||||||
permalink: /blog/2015/04/16/
|
permalink: /blog/2015/04/16/
|
||||||
machines:
|
machines:
|
||||||
- type: pc
|
- type: pcx86
|
||||||
id: deskpro386
|
id: deskpro386
|
||||||
debugger: true
|
debugger: true
|
||||||
uncompiled: 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.
|
but booting from a floppy works.
|
||||||
|
|
||||||
While working through issues with this ROM BIOS, I created some lightly-annotated
|
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
|
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
|
At the top of the source code, I explain a few important details about ROM addresses that
|
||||||
are worth recapping here:
|
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
|
mov cr0,eax ; 0000F4A4 0F2200
|
||||||
jmp 0x28:xf4ac ; 0000F4A7 EAACF42800
|
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
|
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
|
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
|
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
|
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.
|
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
|
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
|
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.
|
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
|
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
|
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
|
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
|
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.
|
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:
|
The first problem I ran into was here:
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@ category: Video
|
||||||
permalink: /blog/2015/06/05/
|
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.
|
and I discovered an odd problem.
|
||||||
|
|
||||||
For example, when I ran this code:
|
For example, when I ran this code:
|
||||||
|
|
|
||||||
|
|
@ -5,17 +5,17 @@ date: 2015-07-17 11:00:00
|
||||||
category: Windows 95
|
category: Windows 95
|
||||||
permalink: /blog/2015/07/17/
|
permalink: /blog/2015/07/17/
|
||||||
machines:
|
machines:
|
||||||
- type: pc
|
- type: pcx86
|
||||||
id: deskpro386
|
id: deskpro386
|
||||||
debugger: true
|
debugger: true
|
||||||
state: /disks/pc/windows/win95/4.00.950/deskpro386.json
|
state: /disks/pcx86/windows/win95/4.00.950/deskpro386.json
|
||||||
config: /devices/pc/machine/compaq/deskpro386/vga/4096kb/debugger/machine.xml
|
config: /devices/pcx86/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"}]'
|
drives: '[{name:"68Mb Hard Disk",type:4,path:"http://archive.pcjs.org/disks/pcx86/fixed/68mb/win95.json"}]'
|
||||||
autoMount: ''
|
autoMount: ''
|
||||||
---
|
---
|
||||||
|
|
||||||
This week (July 14, 2015) was the 20th anniversary of Windows 95 RTM ("Release To Manufacturing"). So I decided to
|
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:
|
Sadly, it immediately failed:
|
||||||
|
|
||||||
|
|
@ -52,17 +52,17 @@ The failing code:
|
||||||
0E36:0927 07 POP ES
|
0E36:0927 07 POP ES
|
||||||
0E36:0928 C3 RET
|
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
|
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.
|
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
|
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
|
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.
|
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.
|
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.
|
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
|
> 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
|
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)
|
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.
|
*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
|
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
|
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
|
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.
|
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
|
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
|
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
|
m dos off
|
||||||
bp 1ED4:16B4 "set fn=ah;dos;if fn!=3f||cx!=24"
|
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:
|
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,
|
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:
|
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
|
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`
|
(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"),
|
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`
|
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.
|
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.
|
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
|
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.
|
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
|
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 PCjs Debugger to debug
|
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.
|
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.
|
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 real-mode
|
||||||
* `##` indicates protected-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
|
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
|
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
|
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
|
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
|
category: Windows 95
|
||||||
permalink: /blog/2015/09/21/
|
permalink: /blog/2015/09/21/
|
||||||
machines:
|
machines:
|
||||||
- type: pc
|
- type: pcx86
|
||||||
id: deskpro386
|
id: deskpro386
|
||||||
state: /disks/pc/windows/win95/4.00.950/deskpro386.json
|
state: /disks/pcx86/windows/win95/4.00.950/deskpro386.json
|
||||||
config: /devices/pc/machine/compaq/deskpro386/vga/4096kb/machine.xml
|
config: /devices/pcx86/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"}]'
|
drives: '[{name:"68Mb Hard Disk",type:4,path:"http://archive.pcjs.org/disks/pcx86/fixed/68mb/win95.json"}]'
|
||||||
autoMount: ''
|
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
|
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.
|
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
|
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
|
of the initial "Getting ready to run Windows 95 for the first time..." splash screen, you'll see the normal
|
||||||
Windows 95 startup screen.
|
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
|
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:
|
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:
|
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
|
will cause Windows 95 to display the 32-bit multiplication warning shown above (PCjs deliberately fails the exact
|
||||||
multiplication test that Windows 95 performs).
|
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:
|
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
|
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.
|
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:
|
machines:
|
||||||
- type: pc
|
- type: pcx86
|
||||||
id: ibm5150
|
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*
|
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**.
|
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):
|
[Markdown file](https://raw.githubusercontent.com/jeffpar/pcjs/master/index.md):
|
||||||
|
|
||||||
machines:
|
machines:
|
||||||
- type: pc
|
- type: pcx86
|
||||||
id: ibm5150
|
id: ibm5150
|
||||||
config: /devices/pc/machine/5150/mda/64kb/machine.xml
|
config: /devices/pcx86/machine/5150/mda/64kb/machine.xml
|
||||||
- type: c1p
|
- type: c1p
|
||||||
id: demoC1P
|
id: demoC1P
|
||||||
config: /devices/c1p/machine/8kb/large/machine.xml
|
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:
|
FDC `autoMount` setting, making it easy to reuse the same machine XML file with different boot disks:
|
||||||
|
|
||||||
machines:
|
machines:
|
||||||
- type: pc
|
- type: pcx86
|
||||||
id: deskpro386
|
id: deskpro386
|
||||||
debugger: true
|
debugger: true
|
||||||
autoMount:
|
autoMount:
|
||||||
A:
|
A:
|
||||||
path: /disks/pc/os2/misc/football/FOOTBALL-76817.json
|
path: /disks/pcx86/os2/misc/football/FOOTBALL-76817.json
|
||||||
config: /devices/pc/machine/compaq/deskpro386/ega/4096kb/debugger/machine.xml
|
config: /devices/pcx86/machine/compaq/deskpro386/ega/4096kb/debugger/machine.xml
|
||||||
|
|
||||||
Other settings that can currently be overridden include:
|
Other settings that can currently be overridden include:
|
||||||
|
|
||||||
|
|
@ -104,11 +104,11 @@ Other settings that can currently be overridden include:
|
||||||
+ `messages`
|
+ `messages`
|
||||||
+ `state`
|
+ `state`
|
||||||
|
|
||||||
Additional overrides will be added as needed. See the [Windows 95 Demo](/disks/pc/windows/win95/4.00.950/)
|
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/pc/windows/win95/4.00.950/README.md)
|
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.
|
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"
|
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
|
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
|
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
|
category: OS/2
|
||||||
permalink: /blog/2015/12/27/
|
permalink: /blog/2015/12/27/
|
||||||
machines:
|
machines:
|
||||||
- type: pc
|
- type: pcx86
|
||||||
id: ibm5170
|
id: ibm5170
|
||||||
debugger: true
|
debugger: true
|
||||||
config: /devices/pc/machine/5170/ega/2048kb/rev3/debugger/machine.xml
|
config: /devices/pcx86/machine/5170/ega/2048kb/rev3/debugger/machine.xml
|
||||||
drives: '[{name:"20Mb Hard Disk",type:2,path:"/disks/pc/fixed/20mb/IBMOS210-EGA.json"}]'
|
drives: '[{name:"20Mb Hard Disk",type:2,path:"/disks/pcx86/fixed/20mb/IBMOS210-EGA.json"}]'
|
||||||
automount: ''
|
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
|
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.
|
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
|
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.
|
drive C.
|
||||||
|
|
||||||
Next, I installed the [MS OS/2 SDK 1.02](/disks/pc/tools/microsoft/os2/sdk/1.02/). This SDK was released
|
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/pc/os2/microsoft/1.0/). I don't have any of the
|
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
|
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
|
[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/).
|
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,
|
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
|
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
|
about [SDKED](/disks/pcx86/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.
|
[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
|
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/pc/tools/microsoft/os2/sdk/1.02/) pre-installed, so check out our copy of 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!
|
[Microsoft® Operating System/2 Programmer’s Toolkit](/pubs/pc/software/os2/microsoft/ptk10/) and then write some code!
|
||||||
|
|
||||||
{% include machine.html id="ibm5170" %}
|
{% 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
|
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**,
|
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
|
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
|
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.
|
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.
|
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
|
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:
|
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
|
* 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
|
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.
|
and blank screens.
|
||||||
|
|
||||||
A hard-error popup would occur when FOOTBALL tried to initialize a non-existent PRN device. To resolve that, PCjs
|
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
|
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]
|
[SerialPort](/docs/pcx86/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
|
(/devices/pcx86/machine/compaq/deskpro386/ega/4096kb/debugger/) machine used to run FOOTBALL has now been updated to
|
||||||
include one parallel port.
|
include one parallel port.
|
||||||
|
|
||||||
The other problem was that switching between sessions with the **SysReq** key would often result in a blank screen;
|
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
|
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.
|
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!
|
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
|
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:
|
*contents* of ROM devices. So, with that in mind, I've made the following rearrangements:
|
||||||
|
|
||||||
* `/devices/pc/bios/5150/*` => `/devices/pc/rom/5150/*`
|
* `/devices/pcx86/bios/5150/*` => `/devices/pcx86/rom/5150/*`
|
||||||
* `/devices/pc/bios/5160/*` => `/devices/pc/rom/5160/*`
|
* `/devices/pcx86/bios/5160/*` => `/devices/pcx86/rom/5160/*`
|
||||||
* `/devices/pc/bios/5170/*` => `/devices/pc/rom/5170/*`
|
* `/devices/pcx86/bios/5170/*` => `/devices/pcx86/rom/5170/*`
|
||||||
* `/devices/pc/bios/compaq/*` => `/devices/pc/rom/compaq/*`
|
* `/devices/pcx86/bios/compaq/*` => `/devices/pcx86/rom/compaq/*`
|
||||||
* `/devices/pc/basic/ibm-basic-1.00.json` => `/devices/pc/rom/5150/basic/BASIC100.json`
|
* `/devices/pcx86/basic/ibm-basic-1.00.json` => `/devices/pcx86/rom/5150/basic/BASIC100.json`
|
||||||
* `/devices/pc/basic/ibm-basic-1.10.json` => `/devices/pc/rom/5160/basic/BASIC110.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
|
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).
|
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
|
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,
|
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.
|
it has not been added to the project.
|
||||||
|
|
|
||||||
|
|
@ -5,9 +5,9 @@ date: 2016-02-17 14:00:00
|
||||||
permalink: /blog/2016/02/17/
|
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.
|
[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.
|
IBM PC demos on your own web page.
|
||||||
|
|
||||||
Saving Disks
|
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**.
|
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
|
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.
|
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
|
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.
|
`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
|
**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.
|
so that you can rename it appropriately.
|
||||||
|
|
||||||
Saving Machines
|
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.
|
All your changes should be preserved.
|
||||||
|
|
||||||
Under the bottom-left corner of any IBM PC on the PCjs [website](/), you should now see a
|
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:
|
everything that machine needs to run, including:
|
||||||
|
|
||||||
* The machine XML configuration file (eg, "machine.xml")
|
* The machine XML configuration file (eg, "machine.xml")
|
||||||
* The machine XSL transformation file (eg, "components.xsl")
|
* The machine XSL transformation file (eg, "components.xsl")
|
||||||
* The machine CSS stylesheet file (eg, "components.css")
|
* The machine CSS stylesheet file (eg, "components.css")
|
||||||
* The machine state file (eg, "state.json")
|
* 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
|
* 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:
|
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
|
* A dialog box will appear with some markup to copy-and-paste
|
||||||
|
|
||||||
The dialog box should provide the following information:
|
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:
|
and then add the following to your web page:
|
||||||
|
|
||||||
<div id="ibm5150"></div>
|
<div id="ibm5150"></div>
|
||||||
...
|
...
|
||||||
<script type="text/javascript" src="pc.js"></script>
|
<script type="text/javascript" src="pcx86.js"></script>
|
||||||
<script type="text/javascript">embedPC("ibm5150","machine.xml","components.xsl");</script>
|
<script type="text/javascript">embedPC("ibm5150","machine.xml","components.xsl");</script>
|
||||||
|
|
||||||
The machine should appear where the <div> is located.
|
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.
|
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 **pc.js** and your web page are in different folders, then you'll also need to update *src* to include the exact
|
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.
|
location of the script.
|
||||||
|
|
||||||
Some notes:
|
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.
|
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
|
* 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 **pc.js** (or **pc-dbg.js** if the machine is
|
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 PCjs debugger).
|
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
|
* 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.
|
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
|
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:
|
*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
|
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.
|
any *existing* IBM PC and embed it on any other website.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -50,12 +50,12 @@ all we have are the memories.
|
||||||
### Speaking of Memories
|
### Speaking of Memories
|
||||||
|
|
||||||
In particular, Read-Only Memories: we have precious few of those, too. I finally obtained
|
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,
|
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.
|
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
|
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:
|
since they are all machines I would like to see PCjs eventually support:
|
||||||
|
|
||||||
- COMPAQ Portable
|
- COMPAQ Portable
|
||||||
|
|
@ -64,7 +64,7 @@ since they are all machines I would like to see PCjs eventually support:
|
||||||
- COMPAQ DeskPro 286
|
- COMPAQ DeskPro 286
|
||||||
- COMPAQ Portable 286
|
- COMPAQ Portable 286
|
||||||
- COMPAQ Portable II
|
- COMPAQ Portable II
|
||||||
- [COMPAQ DeskPro 386](/devices/pc/machine/compaq/deskpro386/)
|
- [COMPAQ DeskPro 386](/devices/pcx86/machine/compaq/deskpro386/)
|
||||||
- COMPAQ Portable III
|
- COMPAQ Portable III
|
||||||
- COMPAQ DeskPro 386/20
|
- COMPAQ DeskPro 386/20
|
||||||
- COMPAQ Portable 386
|
- 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.
|
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
|
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/pc/dos/compaq/3.31/), there may have been a shift in policy. Both products still
|
[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
|
called themselves `The COMPAQ Personal Computer MS-DOS`, but in 3.31, the copyright string changed to
|
||||||
`Compaq Computer Corp.`
|
`Compaq Computer Corp.`
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ date: 2016-03-06 09:00:00
|
||||||
permalink: /blog/2016/03/06/
|
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,
|
[Windows Solitaire](https://en.wikipedia.org/wiki/Microsoft_Solitaire) on my iPad. It was a bit, um, touchy,
|
||||||
but it worked.
|
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
|
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/),
|
80386-based software, such as [Windows/386](/disks/pcx86/windows/2.0x/), [Windows 3.0](/disks/pcx86/windows/3.00/),
|
||||||
[Windows 3.1](/disks/pc/windows/3.10/), and [Windows 95](/disks/pc/windows/win95/4.00.950/).
|
[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/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/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/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/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/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/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/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
|
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*
|
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`.
|
if you started Windows by running `WIN386.EXE`.
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ permalink: /blog/2016/05/04/
|
||||||
This was the week of The Sharpening.
|
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
|
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.
|
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
|
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.
|
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.
|
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
|
For example, this [machine](/devices/pcx86/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,
|
[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:
|
no matter how large you make your browser window:
|
||||||
|
|
||||||
```xml
|
```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
|
which eliminates much of the fuzziness that would occur when copying pixels from the lower-resolution *buffer* canvas
|
||||||
to the higher-resolution *screen* 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
|
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.
|
use its default interpolation method.
|
||||||
|
|
||||||
|
|
@ -66,7 +66,7 @@ while the right one does not.
|
||||||
Aspect Ratio
|
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.
|
[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
|
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:
|
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
|
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.
|
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/diskapi.js
|
||||||
- /modules/shared/lib/dumpapi.js
|
- /modules/shared/lib/dumpapi.js
|
||||||
- /modules/shared/lib/component.js
|
- /modules/shared/lib/component.js
|
||||||
- /modules/pcjs/lib/x86.js
|
- /modules/pcx86/lib/x86.js
|
||||||
- /modules/diskdump/lib/diskdump.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:
|
Browse classic application software for the following machines:
|
||||||
|
|
||||||
- [IBM PC](pc/)
|
- [IBM PC](pcx86/)
|
||||||
- [Challenger 1P](c1p/)
|
- [Challenger 1P](c1p/)
|
||||||
|
|
||||||
### Software Application Manifests
|
### 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)
|
- 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,
|
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.
|
provides more detail.
|
||||||
|
|
||||||
### Example: VisiCalc
|
### Example: VisiCalc
|
||||||
|
|
||||||
VisiCalc is stored in an [/apps folder](/apps/pc/1981/visicalc/), and two relevant files are
|
VisiCalc is stored in an [/apps folder](/apps/pcx86/1981/visicalc/), and two relevant files are
|
||||||
described by <file> entries in its [manifest](/apps/pc/1981/visicalc/manifest.xml):
|
described by <file> entries in its [manifest](/apps/pcx86/1981/visicalc/manifest.xml):
|
||||||
|
|
||||||
<manifest>
|
```xml
|
||||||
<title>VisiCalc</title>
|
<manifest>
|
||||||
<version>VC-176Y2-IBM-TEST</version>
|
<title>VisiCalc</title>
|
||||||
<type>Application</type>
|
<version>VC-176Y2-IBM-TEST</version>
|
||||||
<category>Productivity</category>
|
<type>Application</type>
|
||||||
<company>Software Arts</company>
|
<category>Productivity</category>
|
||||||
<releaseDate>December 16, 1981</releaseDate>
|
<company>Software Arts</company>
|
||||||
<machine href="/devices/pc/machine/5150/mda/64kb/machine.xml" state="/apps/pc/1981/visicalc/state.json"/>
|
<releaseDate>December 16, 1981</releaseDate>
|
||||||
<disk id="disk" dir="/apps/pc/1981/visicalc/bin/">
|
<machine href="/devices/pcx86/machine/5150/mda/64kb/machine.xml" state="/apps/pcx86/1981/visicalc/state.json"/>
|
||||||
<file>VC.COM</file>
|
<disk id="disk" dir="/apps/pcx86/1981/visicalc/bin/">
|
||||||
<file dir="../">README.md</file>
|
<file>VC.COM</file>
|
||||||
<link href="http://www.bricklin.com/history/vclicense.htm">VisiCalc License</link>
|
<file dir="../">README.md</file>
|
||||||
</disk>
|
<link href="http://www.bricklin.com/history/vclicense.htm">VisiCalc License</link>
|
||||||
</manifest>
|
</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
|
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
|
[PCjs machine](/devices/pcx86/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
|
to its own <[computer](/docs/pcx86/computer/)> settings, unless the manifest overrides the machine's
|
||||||
default state with its own *state* setting; eg:
|
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.
|
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,
|
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:
|
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
|
The PCjs DiskDump module processes the dump request and generates a JSON-encoded DOS 2.x-compatible disk image
|
||||||
containing all the specified files.
|
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
|
have saved that JSON-encoded image as static file on the server, and then added an *href* attribute to the manifest's
|
||||||
<disk> entry:
|
<disk> entry:
|
||||||
|
|
||||||
<manifest>
|
```xml
|
||||||
<disk id="disk01" dir="/apps/pc/1981/visicalc/archive/" href="/apps/pc/1981/visicalc/disk.json">
|
<manifest>
|
||||||
...
|
<disk id="disk01" dir="/apps/pcx86/1981/visicalc/archive/" href="/apps/pcx86/1981/visicalc/disk.json">
|
||||||
</disk>
|
...
|
||||||
</manifest>
|
</disk>
|
||||||
|
</manifest>
|
||||||
|
```
|
||||||
|
|
||||||
PCjs always prefers a resource specified by *href*. While the <file> entries are now superfluous, they
|
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
|
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
|
### 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
|
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/pc/cpm/1.1b/manifest.xml):
|
folder's [manifest](/disks/pcx86/cpm/1.1b/manifest.xml):
|
||||||
|
|
||||||
<manifest>
|
```xml
|
||||||
<title>CP/M-86</title>
|
<manifest>
|
||||||
<version>1.1B</version>
|
<title>CP/M-86</title>
|
||||||
<type>OS</type>
|
<version>1.1B</version>
|
||||||
<category>Operating System</category>
|
<type>OS</type>
|
||||||
<company href="http://en.wikipedia.org/wiki/Digital_Research">Digital Research</company>
|
<category>Operating System</category>
|
||||||
<publisher href="http://en.wikipedia.org/wiki/Eagle_Computer">Eagle Computer</publisher>
|
<company href="http://en.wikipedia.org/wiki/Digital_Research">Digital Research</company>
|
||||||
<releaseDate>May 20, 1983</releaseDate>
|
<publisher href="http://en.wikipedia.org/wiki/Eagle_Computer">Eagle Computer</publisher>
|
||||||
<machine href="/disks/pc/cpm/1.1b/machine.xml"/>
|
<releaseDate>May 20, 1983</releaseDate>
|
||||||
<disk id="disk01" href="/disks/pc/cpm/1.1b/cpm86-disk1.json">
|
<machine href="/disks/pcx86/cpm/1.1b/machine.xml"/>
|
||||||
<name>CP/M-86 (Disk 1)</name>
|
<disk id="disk01" href="/disks/pcx86/cpm/1.1b/cpm86-disk1.json">
|
||||||
</disk>
|
<name>CP/M-86 (Disk 1)</name>
|
||||||
<disk id="disk02" href="/disks/pc/cpm/1.1b/cpm86-disk2.json">
|
</disk>
|
||||||
<name>CP/M-86 (Disk 2)</name>
|
<disk id="disk02" href="/disks/pcx86/cpm/1.1b/cpm86-disk2.json">
|
||||||
</disk>
|
<name>CP/M-86 (Disk 2)</name>
|
||||||
</manifest>
|
</disk>
|
||||||
|
</manifest>
|
||||||
|
```
|
||||||
|
|
||||||
In this case, the software was "born" as disk images (non-DOS disk images at that), so we don't
|
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.
|
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:
|
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:
|
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
|
layout: page
|
||||||
title: IBM PC Applications (1981)
|
title: IBM PC Applications (1981)
|
||||||
permalink: /apps/pc/1981/
|
permalink: /apps/pcx86/1981/
|
||||||
|
redirect_from:
|
||||||
|
- /apps/pc/1981/
|
||||||
---
|
---
|
||||||
|
|
||||||
IBM PC Applications (1981)
|
IBM PC Applications (1981)
|
||||||
|
|
@ -1,12 +1,14 @@
|
||||||
---
|
---
|
||||||
layout: page
|
layout: page
|
||||||
title: "VisiCalc (1981)"
|
title: "VisiCalc (1981)"
|
||||||
permalink: /apps/pc/1981/visicalc/
|
permalink: /apps/pcx86/1981/visicalc/
|
||||||
|
redirect_from:
|
||||||
|
- /apps/pc/1981/visicalc/
|
||||||
machines:
|
machines:
|
||||||
- type: pc
|
- type: pcx86
|
||||||
id: ibm5150
|
id: ibm5150
|
||||||
config: /devices/pc/machine/5150/mda/64kb/machine.xml
|
config: /devices/pcx86/machine/5150/mda/64kb/machine.xml
|
||||||
state: /apps/pc/1981/visicalc/state.json
|
state: /apps/pcx86/1981/visicalc/state.json
|
||||||
---
|
---
|
||||||
|
|
||||||
VisiCalc (1981)
|
VisiCalc (1981)
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?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">
|
<manifest type="software">
|
||||||
<title>VisiCalc</title>
|
<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 -->
|
<!-- 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>
|
<author href="http://www.frankston.com/public/?name=ImplementingVisiCalc">Bob Frankston</author>
|
||||||
<releaseDate>December 16, 1981</releaseDate>
|
<releaseDate>December 16, 1981</releaseDate>
|
||||||
<license href="http://www.bricklin.com/history/vclicense.htm">Lotus Development</license>
|
<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"/>
|
<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/pc/1981/visicalc/disk.json" md5="61494f998d5fb0e31e7b8bd99f1cc588" md5json="3ad82ed815725e6bd786f92a4714e84f">
|
<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>
|
<name>VisiCalc (1981)</name>
|
||||||
<file size="27520" time="1981-12-16 23:00:00" attr="0x20" md5="28997dfedb2440c6054d8be835be8634">VC.COM</file>
|
<file size="27520" time="1981-12-16 23:00:00" attr="0x20" md5="28997dfedb2440c6054d8be835be8634">VC.COM</file>
|
||||||
<file dir="../">README.md</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
|
layout: page
|
||||||
title: IBM PC Applications (1982)
|
title: IBM PC Applications (1982)
|
||||||
permalink: /apps/pc/1982/
|
permalink: /apps/pcx86/1982/
|
||||||
|
redirect_from:
|
||||||
|
- /apps/pc/1982/
|
||||||
---
|
---
|
||||||
|
|
||||||
IBM PC Applications (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 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">
|
<manifest type="software">
|
||||||
<title>Executive Suite</title>
|
<title>Executive Suite</title>
|
||||||
<version/>
|
<version/>
|
||||||
|
|
@ -7,8 +7,8 @@
|
||||||
<category>Text Simulation</category>
|
<category>Text Simulation</category>
|
||||||
<author>Armonk Corporation</author>
|
<author>Armonk Corporation</author>
|
||||||
<releaseDate>1982</releaseDate>
|
<releaseDate>1982</releaseDate>
|
||||||
<machine href="/devices/pc/machine/5160/mda/256kb/fake188/machine.xml" state="/apps/pc/1982/esuite/state.json"/>
|
<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/pc/1982/esuite/disk.json" md5="7721a7bc9fcbd0005e7c1d87ecc055c5" md5json="dbf0a2c0176b8128d87e2465794764f4">
|
<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>
|
<name>Executive Suite (1982)</name>
|
||||||
<file size="384" time="2000-02-29 08:04:48" attr="0x20" md5="3e638560a5f483cdbd1be486b07c767e">ESUITE.COM</file>
|
<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 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
|
layout: page
|
||||||
title: IBM PC Applications (1985)
|
title: IBM PC Applications (1985)
|
||||||
permalink: /apps/pc/1985/
|
permalink: /apps/pcx86/1985/
|
||||||
|
redirect_from:
|
||||||
|
- /apps/pc/1985/
|
||||||
---
|
---
|
||||||
|
|
||||||
IBM PC Applications (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 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">
|
<manifest type="software">
|
||||||
<title>Rogue</title>
|
<title>Rogue</title>
|
||||||
<version/>
|
<version/>
|
||||||
|
|
@ -12,7 +12,7 @@
|
||||||
<author>Ken Arnold</author>
|
<author>Ken Arnold</author>
|
||||||
<author>Jon Lane</author>
|
<author>Jon Lane</author>
|
||||||
<author>Michael Toy</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>
|
<name>Rogue (1985)</name>
|
||||||
<file size="14016" time="1985-03-25 14:33:18" attr="0x20" md5="e8f7c7b97210f480c7b741a0d58951bd">MKOPT.EXE</file>
|
<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>
|
<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="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>
|
<file size="0" time="1995-08-26 12:11:38" attr="0x20">ROGUE.SCR</file>
|
||||||
</disk>
|
</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>
|
</manifest>
|
||||||
File diff suppressed because one or more lines are too long
|
|
@ -1,7 +1,9 @@
|
||||||
---
|
---
|
||||||
layout: page
|
layout: page
|
||||||
title: IBM PC Applications (1987)
|
title: IBM PC Applications (1987)
|
||||||
permalink: /apps/pc/1987/
|
permalink: /apps/pcx86/1987/
|
||||||
|
redirect_from:
|
||||||
|
- /apps/pc/1987/
|
||||||
---
|
---
|
||||||
|
|
||||||
IBM PC Applications (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 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">
|
<manifest type="software">
|
||||||
<title>ThinkTank</title>
|
<title>ThinkTank</title>
|
||||||
<version>2.41NP</version>
|
<version>2.41NP</version>
|
||||||
|
|
@ -7,7 +7,7 @@
|
||||||
<category>Productivity</category>
|
<category>Productivity</category>
|
||||||
<company>Living Videotext</company>
|
<company>Living Videotext</company>
|
||||||
<releaseDate>September 25, 1987</releaseDate>
|
<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>
|
<name>ThinkTank (1987)</name>
|
||||||
<file size="6" time="2012-11-20 15:29:40" attr="0x20" md5="50b68f3f99eda119c661b2b50cb9f4de">AUTOEXEC.BAT</file>
|
<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>
|
<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="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>
|
<file size="3072" time="2012-11-20 15:32:11" attr="0x20" md5="20ded226630726d7b26d0ec7832753d0" dir="TMPLATES/">WTMEASUR.TXT</file>
|
||||||
</disk>
|
</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>
|
</manifest>
|
||||||
File diff suppressed because one or more lines are too long
|
|
@ -1,7 +1,9 @@
|
||||||
---
|
---
|
||||||
layout: page
|
layout: page
|
||||||
title: IBM PC Applications (1988)
|
title: IBM PC Applications (1988)
|
||||||
permalink: /apps/pc/1988/
|
permalink: /apps/pcx86/1988/
|
||||||
|
redirect_from:
|
||||||
|
- /apps/pc/1988/
|
||||||
---
|
---
|
||||||
|
|
||||||
IBM PC Applications (1988)
|
IBM PC Applications (1988)
|
||||||
|
|
@ -1,7 +1,9 @@
|
||||||
---
|
---
|
||||||
layout: page
|
layout: page
|
||||||
title: The Dungeons of Moria (1988)
|
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)
|
The Dungeons of Moria (1988)
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?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">
|
<manifest type="software">
|
||||||
<title>The Dungeons of Moria</title>
|
<title>The Dungeons of Moria</title>
|
||||||
<version>4.872</version>
|
<version>4.872</version>
|
||||||
|
|
@ -14,7 +14,7 @@
|
||||||
<name>D. G. Kneller</name>
|
<name>D. G. Kneller</name>
|
||||||
<desc>MSDOS port</desc>
|
<desc>MSDOS port</desc>
|
||||||
</author>
|
</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>
|
<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="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>
|
<file size="91154" time="1991-06-01 14:50:02" attr="0x20" md5="66593e83a2aa3870d7a9e8b43079ce42">GOD</file>
|
||||||
|
|
@ -1,7 +1,9 @@
|
||||||
---
|
---
|
||||||
layout: page
|
layout: page
|
||||||
title: IBM PC Applications (1992)
|
title: IBM PC Applications (1992)
|
||||||
permalink: /apps/pc/1992/
|
permalink: /apps/pcx86/1992/
|
||||||
|
redirect_from:
|
||||||
|
- /apps/pc/1992/
|
||||||
---
|
---
|
||||||
|
|
||||||
IBM PC Applications (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 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">
|
<manifest type="software">
|
||||||
<title>The Dungeons of Moria</title>
|
<title>The Dungeons of Moria</title>
|
||||||
<version>5.5</version>
|
<version>5.5</version>
|
||||||
|
|
@ -92,7 +92,7 @@
|
||||||
<name>Ben Schreiber</name>
|
<name>Ben Schreiber</name>
|
||||||
<desc>Macintosh port for Think C</desc>
|
<desc>Macintosh port for Think C</desc>
|
||||||
</contributor>
|
</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>
|
<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="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>
|
<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="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>
|
<file size="423" time="1992-11-01 23:15:44" attr="0x20" md5="07fdaebf594f9b34d54544c2b6aa36d8">WELCOME.HLP</file>
|
||||||
</disk>
|
</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>
|
</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:
|
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/))
|
* [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,
|
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
|
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
|
title: OSI Challenger 1P (32Kb) with Disk Support
|
||||||
permalink: /devices/c1p/machine/32kb/
|
permalink: /devices/c1p/machine/32kb/
|
||||||
machines:
|
machines:
|
||||||
- type: c1p-dbg
|
- type: c1p
|
||||||
id: c1p32kb
|
id: c1p32kb
|
||||||
|
debugger: true
|
||||||
---
|
---
|
||||||
|
|
||||||
{% include machine.html id="c1p32kb" %}
|
{% include machine.html id="c1p32kb" %}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?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">
|
<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>
|
<name>OSI Challenger 1P (32Kb) with Disk Support</name>
|
||||||
<computer id="c1p" name="Challenger 1P">
|
<computer id="c1p" name="Challenger 1P">
|
||||||
|
|
|
||||||
|
|
@ -3,8 +3,9 @@ layout: page
|
||||||
title: OSI Challenger 1P (8Kb) with Additional Software
|
title: OSI Challenger 1P (8Kb) with Additional Software
|
||||||
permalink: /devices/c1p/machine/8kb/all/debugger/
|
permalink: /devices/c1p/machine/8kb/all/debugger/
|
||||||
machines:
|
machines:
|
||||||
- type: c1p-dbg
|
- type: c1p
|
||||||
id: c1p8kb
|
id: c1p8kb
|
||||||
|
debugger: true
|
||||||
---
|
---
|
||||||
|
|
||||||
{% include machine.html id="c1p8kb" %}
|
{% include machine.html id="c1p8kb" %}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?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">
|
<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>
|
<name>OSI Challenger 1P (8Kb, Additional Software)</name>
|
||||||
<computer id="c1p" name="Challenger 1P">
|
<computer id="c1p" name="Challenger 1P">
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?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">
|
<machine id="c1pAll" class="c1p" border="1" pos="center" background="#FAEBD7" style="padding-bottom:8px">
|
||||||
<name>OSI Challenger 1P (8Kb, Additional Software)</name>
|
<name>OSI Challenger 1P (8Kb, Additional Software)</name>
|
||||||
<computer id="c1p" name="Challenger 1P">
|
<computer id="c1p" name="Challenger 1P">
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?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>
|
<outline>
|
||||||
<title>Challenger 1P (8Kb) "Server Array"</title>
|
<title>Challenger 1P (8Kb) "Server Array"</title>
|
||||||
<machine id="OSI1" ref="/devices/c1p/machine/8kb/small/machine.xml"/>
|
<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
|
title: OSI Challenger 1P (8Kb) with Large Display
|
||||||
permalink: /devices/c1p/machine/8kb/large/debugger/
|
permalink: /devices/c1p/machine/8kb/large/debugger/
|
||||||
machines:
|
machines:
|
||||||
- type: c1p-dbg
|
- type: c1p
|
||||||
id: c1p8kb
|
id: c1p8kb
|
||||||
|
debugger: true
|
||||||
---
|
---
|
||||||
|
|
||||||
{% include machine.html id="c1p8kb" %}
|
{% include machine.html id="c1p8kb" %}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?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">
|
<machine id="c1p8kb" class="c1p" border="1" width="100%" background="#FAEBD7" style="padding-bottom:8px">
|
||||||
<name>OSI Challenger 1P (8Kb) with Debugger</name>
|
<name>OSI Challenger 1P (8Kb) with Debugger</name>
|
||||||
<computer id="c1p" name="Challenger 1P">
|
<computer id="c1p" name="Challenger 1P">
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?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">
|
<machine id="c1pLarge" class="c1p" border="1" pos="center" background="#FAEBD7" style="padding-bottom:8px">
|
||||||
<name pos="center">OSI Challenger 1P (circa 1978)</name>
|
<name pos="center">OSI Challenger 1P (circa 1978)</name>
|
||||||
<computer id="c1p" name="Challenger 1P">
|
<computer id="c1p" name="Challenger 1P">
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?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">
|
<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">
|
<computer id="c1p" name="Challenger 1P">
|
||||||
<module type="cpu" refid="cpu6502" start="0x0000" end="0xffff"/>
|
<module type="cpu" refid="cpu6502" start="0x0000" end="0xffff"/>
|
||||||
|
|
|
||||||
|
|
@ -9,11 +9,11 @@ Challenger 1P Machine Configurations
|
||||||
|
|
||||||
Here are some sample C1P 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 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 with Large Display w/Additional Software](8kb/all/) ([Debugger](8kb/all/debugger/))
|
||||||
* [8kb "Server Array" Demo](8kb/array/)
|
- [8kb "Server Array" Demo](8kb/array/)
|
||||||
* [32kb with Diskette Support](32kb/)
|
- [32kb with Diskette Support](32kb/)
|
||||||
|
|
||||||
See the [C1Pjs Documentation](/docs/c1pjs/) for operational details of the emulator.
|
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...
|
[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.
|
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...
|
[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.
|
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: ................
|
[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: ................
|
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