Blog update
This commit is contained in:
parent
66a36828d1
commit
0735ea8186
9 changed files with 61 additions and 45 deletions
|
|
@ -27,7 +27,7 @@ as a set of static web pages, I've decided to stop using Node to power www.pcjs.
|
|||
the website to [GitHub Pages](https://pages.github.com/), and using [Jekyll](https://help.github.com/articles/using-jekyll-with-pages/)
|
||||
to convert all my existing Markdown files to HTML.
|
||||
|
||||
This new approach is *very* similar to what the PCjs custom Node modules did: every time time someone visited a folder
|
||||
This new approach is *very* similar to what the PCjs custom Node modules did: every time someone visited a folder
|
||||
on the website that did not yet contain an "index.html", the PCjs Node server would create one, either by converting the
|
||||
README.md file in that folder to HTML or generating a default HTML document. The PCjs Markdown-to-HTML converter also
|
||||
contained some special logic that made it easy to embed PCjs machines on a page.
|
||||
|
|
@ -59,19 +59,20 @@ Basically, the YAML at the top of the file lists all the machines that the page
|
|||
|
||||
The `machine.html` include accepts only one parameter: the `id` of a machine listed at the top of the file.
|
||||
|
||||
The `machines` element at the top of the file must specify a `type` and `id` at a minimum. `type` must be one of
|
||||
the following values, depending on whether you want an IBM PC or Challenger 1P, with or without a debugger:
|
||||
The `machines` element at the top of the file must specify a `type` and `id` at a minimum. `type` should be one of
|
||||
the following values, depending on whether you want an IBM PC or Challenger 1P:
|
||||
|
||||
- pc
|
||||
- pc-dbg
|
||||
- c1p
|
||||
- c1p-dbg
|
||||
|
||||
and `id` can be any identifier you want to use to embed the machine. You may also use `config` to specify a machine
|
||||
XML configuration file if not using the default `machine.xml`; `template` to specify an alternate XSL template file
|
||||
if not using the default `components.xsl`; `state` to specify 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**.
|
||||
and `id` can be any identifier you want to use to embed the machine. If you want to include the machine's built-in
|
||||
debugger, set `debugger` to *true*; the older method of specifying *pc-dbg* or *c1p-dbg* instead of *pc* or *c1p* as the
|
||||
`type` still works, too.
|
||||
|
||||
You may also use `config` to specify a machine XML configuration file if not using the default *machine.xml*;
|
||||
`template` to specify an alternate XSL template file if not using the default *components.xsl*; `state` to specify
|
||||
a JSON-encoded machine state file if the machine requires a predefined state; and `uncompiled` may be set to *true*
|
||||
to force a machine to use uncompiled sources, overriding the value of `site.pcjs.compiled` in **_config.yml**.
|
||||
|
||||
For example, the PCjs home page contains two machines, so this appears at the top of the root
|
||||
[README.md](https://raw.githubusercontent.com/jeffpar/pcjs/master/README.md):
|
||||
|
|
@ -84,6 +85,21 @@ For example, the PCjs home page contains two machines, so this appears at the to
|
|||
id: demoC1P
|
||||
config: /devices/c1p/machine/8kb/large/machine.xml
|
||||
|
||||
If necessary, you can also override some of the settings in a machine XML file. Here's an example of overriding the
|
||||
FDC `autoMount` setting, making it easy to reuse the same machine XML file with different boot disks:
|
||||
|
||||
machines:
|
||||
- type: pc
|
||||
id: deskpro386
|
||||
debugger: true
|
||||
config: /devices/pc/machine/compaq/deskpro386/ega/4096kb/machine.xml
|
||||
autoMount:
|
||||
A:
|
||||
path: /disks/pc/os2/misc/football/FOOTBALL-76817.json
|
||||
|
||||
`messages`, `state`, and `autoPower` are some other settings that can be overridden, and support for more can
|
||||
easily be added.
|
||||
|
||||
I will continue to include a Node web server with the PCjs project, but it's now intended for development
|
||||
purposes only (not production servers). I've updated the PCjs MarkOut component to parse any "Front Matter"
|
||||
at the top of the PCjs Markdown files, and to convert all new Jekyll-style embedded machines and screenshots
|
||||
|
|
|
|||
|
|
@ -504,7 +504,7 @@ Bus.prototype.getA20 = function()
|
|||
/**
|
||||
* setA20(fEnable)
|
||||
*
|
||||
* On 32-bit bus machines, I've adopted the approach that Compaq took with DeskPro 386 machines,
|
||||
* On 32-bit bus machines, I've adopted the approach that COMPAQ took with DeskPro 386 machines,
|
||||
* which is to map the 1st Mb to the 2nd Mb whenever A20 is disabled, rather than blindly masking
|
||||
* the A20 address bit from all addresses; in fact, this is what the DeskPro 386 ROM BIOS requires.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -561,7 +561,7 @@ ChipSet.IRQ = {
|
|||
* and PIT1 for the second. This mirrors how we refer to multiple DMA controllers
|
||||
* (eg, DMA0 and DMA1) and multiple PICs (eg, PIC0 and PIC1).
|
||||
*
|
||||
* This differs from Compaq's nomenclature, which used "Timer 1" to refer to the first
|
||||
* This differs from COMPAQ's nomenclature, which used "Timer 1" to refer to the first
|
||||
* PIT, and "Timer 2" for the second PIT, and then referred to "Counter 0", "Counter 1",
|
||||
* and "Counter 2" within each PIT.
|
||||
*/
|
||||
|
|
@ -741,22 +741,22 @@ ChipSet.KBC = {
|
|||
}
|
||||
},
|
||||
INPORT: { // this.b8042InPort
|
||||
COMPAQ_50MHZ: 0x01, // 50Mhz system clock enabled (0=48Mhz); see Compaq 386/25 TechRef p2-106
|
||||
COMPAQ_50MHZ: 0x01, // 50Mhz system clock enabled (0=48Mhz); see COMPAQ 386/25 TechRef p2-106
|
||||
UNDEFINED: 0x02, // undefined
|
||||
COMPAQ_NO80387: 0x04, // 80387 coprocessor NOT installed; see Compaq 386/25 TechRef p2-106
|
||||
COMPAQ_NOWEITEK:0x08, // Weitek coprocessor NOT installed; see Compaq 386/25 TechRef p2-106
|
||||
COMPAQ_NO80387: 0x04, // 80387 coprocessor NOT installed; see COMPAQ 386/25 TechRef p2-106
|
||||
COMPAQ_NOWEITEK:0x08, // Weitek coprocessor NOT installed; see COMPAQ 386/25 TechRef p2-106
|
||||
ENABLE_256KB: 0x10, // enable 2nd 256Kb of system board RAM
|
||||
COMPAQ_HISPEED: 0x10, // high-speed enabled (0=auto); see Compaq 386/25 TechRef p2-106
|
||||
COMPAQ_HISPEED: 0x10, // high-speed enabled (0=auto); see COMPAQ 386/25 TechRef p2-106
|
||||
MFG_OFF: 0x20, // manufacturing jumper not installed
|
||||
COMPAQ_DIP5OFF: 0x20, // system board DIP switch #5 OFF (0=ON); see Compaq 386/25 TechRef p2-106
|
||||
COMPAQ_DIP5OFF: 0x20, // system board DIP switch #5 OFF (0=ON); see COMPAQ 386/25 TechRef p2-106
|
||||
MONO: 0x40, // monochrome monitor is primary display
|
||||
COMPAQ_NONDUAL: 0x40, // Compaq Dual-Mode monitor NOT installed; see Compaq 386/25 TechRef p2-106
|
||||
KBD_UNLOCKED: 0x80 // keyboard not inhibited (in Compaq parlance: security lock is unlocked)
|
||||
COMPAQ_NONDUAL: 0x40, // COMPAQ Dual-Mode monitor NOT installed; see COMPAQ 386/25 TechRef p2-106
|
||||
KBD_UNLOCKED: 0x80 // keyboard not inhibited (in COMPAQ parlance: security lock is unlocked)
|
||||
},
|
||||
OUTPORT: { // this.b8042OutPort
|
||||
NO_RESET: 0x01, // set by default
|
||||
A20_ON: 0x02, // set by default
|
||||
COMPAQ_SLOWD: 0x08, // SL0WD* NOT asserted (refer to timer 2, counter 2); see Compaq 386/25 TechRef p2-105
|
||||
COMPAQ_SLOWD: 0x08, // SL0WD* NOT asserted (refer to timer 2, counter 2); see COMPAQ 386/25 TechRef p2-105
|
||||
OUTBUFF_FULL: 0x10, // output buffer full
|
||||
INBUFF_EMPTY: 0x20, // input buffer empty
|
||||
KBD_CLOCK: 0x40, // keyboard clock (output)
|
||||
|
|
@ -783,9 +783,9 @@ ChipSet.KBC = {
|
|||
PORT: 0x64,
|
||||
READ_CMD: 0x20, // sends the current CMD byte (this.b8042CmdData) to KBC.DATA.PORT
|
||||
WRITE_CMD: 0x60, // followed by a command byte written to KBC.DATA.PORT (see KBC.DATA.CMD)
|
||||
COMPAQ_SLOWD: 0xA3, // enable system slow down; see Compaq 386/25 TechRef p2-111
|
||||
COMPAQ_TOGGLE: 0xA4, // toggle speed-control bit; see Compaq 386/25 TechRef p2-111
|
||||
COMPAQ_SPCREAD: 0xA5, // special read of "port 2"; see Compaq 386/25 TechRef p2-111
|
||||
COMPAQ_SLOWD: 0xA3, // enable system slow down; see COMPAQ 386/25 TechRef p2-111
|
||||
COMPAQ_TOGGLE: 0xA4, // toggle speed-control bit; see COMPAQ 386/25 TechRef p2-111
|
||||
COMPAQ_SPCREAD: 0xA5, // special read of "port 2"; see COMPAQ 386/25 TechRef p2-111
|
||||
SELF_TEST: 0xAA, // self-test (KBC.DATA.SELF_TEST.OK is placed in the output buffer if no errors)
|
||||
INTF_TEST: 0xAB, // interface test
|
||||
DIAG_DUMP: 0xAC, // diagnostic dump
|
||||
|
|
@ -803,7 +803,7 @@ ChipSet.KBC = {
|
|||
INBUFF_FULL: 0x02, // set if the controller has received but not yet read data from the input buffer (not normally set)
|
||||
SYS_FLAG: 0x04,
|
||||
CMD_FLAG: 0x08, // set on write to KBC.CMD (port 0x64), clear on write to KBC.DATA (port 0x60)
|
||||
NO_INHIBIT: 0x10, // (in Compaq parlance: security lock not engaged)
|
||||
NO_INHIBIT: 0x10, // (in COMPAQ parlance: security lock not engaged)
|
||||
XMT_TIMEOUT: 0x20,
|
||||
RCV_TIMEOUT: 0x40,
|
||||
PARITY_ERR: 0x80, // last byte of data received had EVEN parity (ODD parity is normally expected)
|
||||
|
|
|
|||
|
|
@ -125,7 +125,7 @@ var I386 = true;
|
|||
/**
|
||||
* @define {boolean}
|
||||
*
|
||||
* COMPAQ386 enables Compaq DeskPro 386 support. Requires I386 support as well (duh).
|
||||
* COMPAQ386 enables COMPAQ DeskPro 386 support. Requires I386 support as well (duh).
|
||||
*/
|
||||
var COMPAQ386 = I386;
|
||||
|
||||
|
|
|
|||
|
|
@ -151,7 +151,7 @@ HDC.DEFAULT_DRIVE_NAME = "Hard Drive";
|
|||
|
||||
/*
|
||||
* Drive type tables differed across IBM controller models (XTC drive types don't match ATC drive types)
|
||||
* and across OEMs (eg, Compaq drive types only match a few IBM drive types), so you must use iDriveTable to
|
||||
* and across OEMs (eg, COMPAQ drive types only match a few IBM drive types), so you must use iDriveTable to
|
||||
* index the correct table type inside both aDriveTables and aDriveTypes.
|
||||
*/
|
||||
HDC.aDriveTables = ["XTC", "ATC", "COMPAQ"];
|
||||
|
|
@ -223,9 +223,9 @@ HDC.aDriveTypes = [
|
|||
23: [306, 4]
|
||||
},
|
||||
/*
|
||||
* aDriveTypes[2] is for the Compaq DeskPro (ATC) controller.
|
||||
* aDriveTypes[2] is for the COMPAQ DeskPro (ATC) controller.
|
||||
*
|
||||
* NOTE: According to Compaq, drive type 25 (0x19) must be used with their 130Mb drive when using MS-DOS 3.1
|
||||
* NOTE: According to COMPAQ, drive type 25 (0x19) must be used with their 130Mb drive when using MS-DOS 3.1
|
||||
* or earlier, or when using any [unspecified] application software that supports only 17 sectors per track;
|
||||
* otherwise, use drive type 35 (0x23), which uses the drive's full capacity of 34 sectors per track.
|
||||
*/
|
||||
|
|
@ -233,7 +233,7 @@ HDC.aDriveTypes = [
|
|||
1: [306, 4], // same as IBM
|
||||
2: [615, 4], // same as IBM
|
||||
3: [615, 6], // same as IBM
|
||||
4: [1023, 8], // 68Mb (67.93Mb: 1023*8*17*512 or 71,233,536 bytes) (TODO: Cylinders is listed as 1024 in the Compaq TechRef; confirm)
|
||||
4: [1023, 8], // 68Mb (67.93Mb: 1023*8*17*512 or 71,233,536 bytes) (TODO: Cylinders is listed as 1024 in the COMPAQ TechRef; confirm)
|
||||
5: [940, 6], // same as IBM
|
||||
6: [697, 5],
|
||||
7: [462, 8], // same as IBM
|
||||
|
|
@ -269,7 +269,7 @@ HDC.aDriveTypes = [
|
|||
35: [966, 8, 34], // 130Mb (128.30Mb: 966*8*34*512 or 134,529,024 bytes)
|
||||
36: [966, 9, 34],
|
||||
37: [966, 5, 34],
|
||||
38: [612, 16, 63], // 300Mb (301.22Mb: 612*16*63*512 or 315,850,752 bytes) (TODO: Cylinders is listed as 611 in the Compaq TechRef; confirm)
|
||||
38: [612, 16, 63], // 300Mb (301.22Mb: 612*16*63*512 or 315,850,752 bytes) (TODO: Cylinders is listed as 611 in the COMPAQ TechRef; confirm)
|
||||
39: [1023,11, 33],
|
||||
40: [1023,15, 34],
|
||||
41: [1630,15, 52],
|
||||
|
|
@ -1865,7 +1865,7 @@ HDC.prototype.outATCDrvHd = function(port, bOut, addrFrom)
|
|||
* TODO: Dig into the ATC documentation some more, and determine what other situations, if any, regStatus
|
||||
* needs to be updated.
|
||||
*
|
||||
* UPDATE: The Compaq DeskPro 386 ROM BIOS requires setting STATUS.SEEK_OK in addition to STATUS.READY;
|
||||
* UPDATE: The COMPAQ DeskPro 386 ROM BIOS requires setting STATUS.SEEK_OK in addition to STATUS.READY;
|
||||
* a quick retest of the MODEL_5170_REV3 BIOS suggests that it's happy with that change, so it's quite likely
|
||||
* that was the appropriate change all along.
|
||||
*/
|
||||
|
|
@ -2030,7 +2030,7 @@ HDC.prototype.doATC = function()
|
|||
* Bytes from the requested sector(s) will now be delivered via inATCByte().
|
||||
*
|
||||
* FYI, I'm taking a shotgun approach to these status bits: I need to clear STATUS.BUSY and
|
||||
* set STATUS.DATA_REQ, because otherwise CompaqDeskPro386 reads will fail, and I need to set
|
||||
* set STATUS.DATA_REQ, because otherwise COMPAQ DeskPro 386 reads will fail, and I need to set
|
||||
* the STATUS.READY and STATUS.SEEK_OK bits, because otherwise MODEL_5170_REV3 reads will fail.
|
||||
*/
|
||||
hdc.regStatus = HDC.ATC.STATUS.READY | HDC.ATC.STATUS.SEEK_OK | HDC.ATC.STATUS.DATA_REQ;
|
||||
|
|
@ -2063,7 +2063,7 @@ HDC.prototype.doATC = function()
|
|||
case HDC.ATC.COMMAND.SEEK: // 0x70
|
||||
/*
|
||||
* Physically, this moves the head(s) to the requested cylinder, but logically, there isn't anything to do;
|
||||
* in fact, we didn't even need this command for the MODEL_5170 ROM BIOS (the Compaq DeskPro 386 ROM BIOS was
|
||||
* in fact, we didn't even need this command for the MODEL_5170 ROM BIOS (the COMPAQ DeskPro 386 ROM BIOS was
|
||||
* another story).
|
||||
*/
|
||||
fInterrupt = true;
|
||||
|
|
|
|||
|
|
@ -639,7 +639,7 @@ Memory.prototype = {
|
|||
/**
|
||||
* readNone(off)
|
||||
*
|
||||
* Previously, this always returned 0x00, but the initial memory probe by the Compaq DeskPro 386 ROM BIOS
|
||||
* Previously, this always returned 0x00, but the initial memory probe by the COMPAQ DeskPro 386 ROM BIOS
|
||||
* writes 0x0000 to the first word of every 64Kb block in the nearly 16Mb address space it supports, and
|
||||
* if it reads back 0x0000, it will initially think that LOTS of RAM exists, only to be disappointed later
|
||||
* when it performs a more exhaustive memory test, generating unwanted error messages in the process.
|
||||
|
|
|
|||
|
|
@ -181,7 +181,7 @@ RAM.prototype.reset = function()
|
|||
|
||||
/*
|
||||
* Memory with an ID of "ramCPQ" is reserved for built-in memory located just below the 16Mb
|
||||
* boundary on Compaq DeskPro 386 machines.
|
||||
* boundary on COMPAQ DeskPro 386 machines.
|
||||
*
|
||||
* Technically, that memory is part of the first 1Mb of memory that also provides up to 640Kb
|
||||
* of conventional memory (ie, memory below 1Mb).
|
||||
|
|
@ -193,7 +193,7 @@ RAM.prototype.reset = function()
|
|||
*
|
||||
* Therefore, a DeskPro 386's first 1Mb of physical memory is allocated by PCjs in two pieces,
|
||||
* and the second piece must have an ID of "ramCPQ", triggering the additional allocation of
|
||||
* Compaq-specific memory-mapped registers.
|
||||
* COMPAQ-specific memory-mapped registers.
|
||||
*
|
||||
* See CompaqController for more details.
|
||||
*/
|
||||
|
|
@ -216,7 +216,7 @@ RAM.prototype.reset = function()
|
|||
}
|
||||
/*
|
||||
* Don't add the "ramCPQ" memory to the CMOS total, because addCMOSMemory() will add it to the extended
|
||||
* memory total, which will just confuse the Compaq BIOS.
|
||||
* memory total, which will just confuse the COMPAQ BIOS.
|
||||
*/
|
||||
if (!COMPAQ386 || this.idComponent != "ramCPQ") {
|
||||
if (this.chipset) this.chipset.addCMOSMemory(this.addrRAM, this.sizeRAM);
|
||||
|
|
@ -302,8 +302,8 @@ RAM.init = function()
|
|||
* memory slots spanning 0x000E0000-0x000FFFFF, and then update those slots with the blocks from
|
||||
* 0x00FE0000-0x00FFFFFF. Note that only the top 128Kb of "ramCPQ" addressability is affected; the
|
||||
* rest of that memory, ranging anywhere from 256Kb to 640Kb, remains addressable at its original
|
||||
* location. Compaq's CEMM and VDISK utilities were generally the only software able to access that
|
||||
* remaining memory (what Compaq refers to as "Compaq Built-in Memory").
|
||||
* location. COMPAQ's CEMM and VDISK utilities were generally the only software able to access that
|
||||
* remaining memory (what COMPAQ refers to as "Compaq Built-in Memory").
|
||||
*
|
||||
* @constructor
|
||||
* @param {RAM} ram
|
||||
|
|
@ -328,7 +328,7 @@ CompaqController.MAP_SIZE = 0x00020000;
|
|||
/*
|
||||
* Bit definitions for the 16-bit write-only memory-mapping register (wMappings)
|
||||
*
|
||||
* NOTE: Although Compaq says the memory at %FE0000 is "relocated", it actually remains addressable
|
||||
* NOTE: Although COMPAQ says the memory at %FE0000 is "relocated", it actually remains addressable
|
||||
* at %FE0000; it simply becomes addressable at %0E0000 as well, displacing any ROMs that used to be
|
||||
* addressable at %0E0000 through %0FFFFF.
|
||||
*/
|
||||
|
|
@ -344,7 +344,7 @@ CompaqController.MAPPINGS = {
|
|||
*
|
||||
* SW1-7 and SW1-8 are mapped to bits 5 and 4 of wSettings, respectively, as follows:
|
||||
*
|
||||
* SW1-7 SW1-8 Bit5 Bit4 Amount (of base memory provided by the Compaq 32-bit memory board)
|
||||
* SW1-7 SW1-8 Bit5 Bit4 Amount (of base memory provided by the COMPAQ 32-bit memory board)
|
||||
* ----- ----- ---- ---- ------
|
||||
* ON ON 0 0 640Kb
|
||||
* ON OFF 0 1 Invalid
|
||||
|
|
@ -358,7 +358,7 @@ CompaqController.MAPPINGS = {
|
|||
* SW1-3: ON sets memory from 0xC00000 to 0xFFFFFF (between 12 and 16 megabytes) non-cacheable
|
||||
* SW1-4: ON selects AUTO system speed (OFF selects HIGH system speed)
|
||||
* SW1-5: RESERVED (however, the system can read its state; see below)
|
||||
* SW1-6: Compaq Dual-Mode Monitor or Color Monitor (OFF selects Monochrome monitor other than Compaq)
|
||||
* SW1-6: COMPAQ Dual-Mode Monitor or Color Monitor (OFF selects Monochrome monitor other than COMPAQ)
|
||||
*
|
||||
* While SW1-7 and SW1-8 are connected to this memory-mapped register, other SW1 DIP switches are accessible
|
||||
* through the 8042 Keyboard Controller's KBC.INPORT register, as follows:
|
||||
|
|
|
|||
|
|
@ -385,7 +385,7 @@ X86.opLOADALL386 = function()
|
|||
* a MOD != 11 as an illegal opcode. This was changed in later versions to ignore the value of MOD.
|
||||
* Assemblers that generate MOD != 11 for these instructions will fail on some 80486s."
|
||||
*
|
||||
* And in fact, the Compaq DeskPro 386 ROM BIOS executes this instruction with MOD set to 00, so we have
|
||||
* And in fact, the COMPAQ DeskPro 386 ROM BIOS executes this instruction with MOD set to 00, so we have
|
||||
* to ignore it.
|
||||
*
|
||||
* @this {X86CPU}
|
||||
|
|
@ -483,7 +483,7 @@ X86.opMOVrd = function()
|
|||
* a MOD != 11 as an illegal opcode. This was changed in later versions to ignore the value of MOD.
|
||||
* Assemblers that generate MOD != 11 for these instructions will fail on some 80486s."
|
||||
*
|
||||
* And in fact, the Compaq DeskPro 386 ROM BIOS executes this instruction with MOD set to 00, so we have
|
||||
* And in fact, the COMPAQ DeskPro 386 ROM BIOS executes this instruction with MOD set to 00, so we have
|
||||
* to ignore it.
|
||||
*
|
||||
* @this {X86CPU}
|
||||
|
|
|
|||
|
|
@ -285,7 +285,7 @@ X86Seg.prototype.loadIDTReal = function loadIDTReal(nIDT)
|
|||
{
|
||||
var cpu = this.cpu;
|
||||
/*
|
||||
* NOTE: The Compaq DeskPro 386 ROM loads the IDTR for the real-mode IDT with a limit of 0xffff instead
|
||||
* NOTE: The COMPAQ DeskPro 386 ROM loads the IDTR for the real-mode IDT with a limit of 0xffff instead
|
||||
* of the normal 0x3ff. A limit higher than 0x3ff is OK, since all real-mode IDT entries are 4 bytes, and
|
||||
* there's no way to issue an interrupt with a vector > 0xff. Just something to be aware of.
|
||||
*/
|
||||
|
|
|
|||
Loading…
Reference in a new issue