Changed the last embedPC() parameter from sStateFile to sParms, although for backward compatibility, if sParms is not a JSON object definition (ie, beginning with a brace), it continues to be treated as a state filename.
This change allows us to pass any number of additional properties to embedPC(), which in turn can override properties contained in the XML file; the only property overrides currently supported are 'state' (which overrides any 'state' property set in the XML's <computer> element) and 'automount' (which overrides any 'automount' property set in the XML's <fdc> element). The goal is to make it easier to reuse XML machine definitions, by allowing commonly altered component attributes to be overridden.
This commit is contained in:
parent
5d2da60d67
commit
12b760f912
28 changed files with 2187 additions and 2059 deletions
|
|
@ -12,6 +12,9 @@ url: "http://www.pcjs.org" # "http://jeffpar.github.io" or "http://www.pcjs.org
|
|||
twitter_username: jeffpar
|
||||
github_username: jeffpar
|
||||
|
||||
left_brace: "{"
|
||||
right_brace: "}"
|
||||
|
||||
# Build settings
|
||||
|
||||
exclude: ["index.html", "**/index.html", "logs", "node_modules", "**/c64", "src", "**/src", "**/static", "tmp", "videos", "web"]
|
||||
|
|
|
|||
|
|
@ -10,11 +10,7 @@
|
|||
{% else %}
|
||||
{% assign machine_template = machine.template %}
|
||||
{% endunless %}
|
||||
{% unless machine.state %}
|
||||
{% assign machine_state = '' %}
|
||||
{% else %}
|
||||
{% assign machine_state = machine.state %}
|
||||
{% endunless %}
|
||||
{% capture machine_parms %}{{ site.left_brace }}state:"{{ machine.state }}",autoMount:{{ machine.automount|jsonify }}{{ site.right_brace }}{% endcapture %}
|
||||
{% if site.pcjs.compiled == true and machine.uncompiled != true %}
|
||||
{% capture machine_script %}<script type="text/javascript" src="{{ site.baseurl }}/versions/{{ machine.type | remove:'-dbg' }}js/{{ site.pcjs.version }}/{{ machine.type }}.js"></script>{% endcapture %}
|
||||
{% unless machine_scripts contains machine_script %}
|
||||
|
|
@ -38,5 +34,5 @@
|
|||
{% capture machine_template %}{{ site.baseurl }}/modules/{{ machine.type | remove:'-dbg' }}js/templates/components.xsl{% endcapture %}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
<script type="text/javascript">{{ machine_embed }}("{{ machine.id }}","{{ machine_config }}","{{ machine_template }}","{{ machine_state }}");</script>
|
||||
<script type="text/javascript">{{ machine_embed }}("{{ machine.id }}","{{ machine_config }}","{{ machine_template }}",'{{ machine_parms }}');</script>
|
||||
{% endfor %}
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<keyboard id="keyboard" padleft="8px">
|
||||
<control type="button" binding="esc">ESC</control>
|
||||
<control type="button" binding="ctrl-c">CTRL-C</control>
|
||||
<control type="button" binding="f1">F1</control>
|
||||
<control type="button" binding="f10">F10</control>
|
||||
</keyboard>
|
||||
|
|
|
|||
|
|
@ -37,8 +37,13 @@ Machines from our [IBM PC Application Archive](/apps/pc/):
|
|||
|
||||
And here are some machines from our [IBM PC Disk Archive](/disks/pc/):
|
||||
|
||||
* [CP/M-86 v1.1B](/disks/pc/cpm/1.1b/)
|
||||
* [PC-DOS 1.00](/disks/pc/dos/ibm/1.00/)
|
||||
* [PC-DOS 1.10](/disks/pc/dos/ibm/1.10/)
|
||||
* [Multitasking MS-DOS 4.00](/disks/pc/dos/microsoft/4.0M/)
|
||||
* [IBM Diagnostics v2.20](/disks/pc/diags/ibm/2.20/)
|
||||
* [IBM OS/2 1.0](/disks/pc/os2/ibm/1.0/)
|
||||
* [OS/2 1.0 Debugger Boot Disk](/disks/pc/os2/misc/1.0/debugger/)
|
||||
* [CP/M-86 v1.1B](/disks/pc/cpm/1.1b/)
|
||||
* [Infocom Zork I](/disks/pc/games/infocom/zork1/)
|
||||
|
||||
---
|
||||
|
|
|
|||
|
|
@ -3,16 +3,16 @@
|
|||
<machine id="deskpro386" class="pc" border="1" pos="center" background="#FAEBD7">
|
||||
<computer id="deskpro386-ega-2048k" name="Compaq DeskPro 386" buswidth="32"/>
|
||||
<cpu id="cpu386" model="80386" autostart="false"/>
|
||||
<ram id="ramLow" addr="0x00000" test="true" size="0xa0000" comment="ROM BIOS memory test has NOT been disabled"/>
|
||||
<ram id="ramLow" addr="0x00000" test="false" size="0xa0000" comment="ROM BIOS memory test has been disabled"/>
|
||||
<ram id="ramCPQ" addr="0xfa0000" size="0x60000" comment="Compaq memory at 0xFA0000"/>
|
||||
<ram id="ramExt" addr="0x100000" size="0x100000" comment="Extended memory at 0x100000"/>
|
||||
<rom id="romEGA" addr="0xc0000" size="0x4000" file="/devices/pc/video/ibm/ega/ibm-ega.json" notify="videoEGA"/>
|
||||
<rom id="romBIOS" addr="0xf8000" size="0x8000" alias="[0xf0000,0xffff0000,0xffff8000]" file="/devices/pc/bios/compaq/deskpro386/1988-01-28/1988-01-28.json"/>
|
||||
<video ref="/devices/pc/video/ibm/ega/ibm-ega-128kb-autolockfs.xml"/>
|
||||
<keyboard ref="/devices/pc/keyboard/keyboard-minimal-functions.xml"/>
|
||||
<debugger id="debugger" messages="fault|port" commands=""/>
|
||||
<panel ref="/devices/pc/panel/btpanel.xml"/>
|
||||
<fdc ref="/disks/pc/library.xml" automount='{A: {name: "PC-DOS 3.00 (Disk 1)", path: "/disks/pc/dos/ibm/3.00/PCDOS300-DISK1.json"}, B: {name: "PC-DOS 3.00 (Disk 2)", path: "/disks/pc/dos/ibm/3.00/PCDOS300-DISK2.json"}}'/>
|
||||
<debugger id="debugger" messages="fault" commands=""/>
|
||||
<panel ref="/devices/pc/panel/wide386.xml"/>
|
||||
<fdc ref="/disks/pc/library.xml" automount='{A: {name: "PC-DOS 3.20 (Disk 1)", path: "/disks/pc/dos/ibm/3.20/PCDOS320-DISK1.json"}, B: {name: "PC-DOS 3.20 (Disk 2)", path: "/disks/pc/dos/ibm/3.20/PCDOS320-DISK2.json"}}'/>
|
||||
<hdcFoo id="hdcAT" type="at" drives='[{name:"20Mb Hard Disk",type:2}]'/>
|
||||
<chipset id="chipset" model="deskpro386" floppies="[1200,1200]"/>
|
||||
<serial id="com1" adapter="1"/>
|
||||
|
|
|
|||
|
|
@ -61,9 +61,10 @@ that automatically run the software.
|
|||
* MS OS/2 1.1
|
||||
* MS OS/2 1.2
|
||||
|
||||
### Other OS/2 Disks
|
||||
### [Other OS/2 Disks](/disks/pc/os2/misc/)
|
||||
|
||||
* [OS/2 1.0 Debugger Boot Disk](/disks/pc/os2/misc/)
|
||||
* [OS/2 1.0 Debugger Boot Disk](/disks/pc/os2/misc/1.0/debugger/)
|
||||
* [OS/2 FOOTBALL Boot Disk (v7.68.17)](/disks/pc/os2/misc/football/debugger/)
|
||||
|
||||
### Microsoft Windows
|
||||
|
||||
|
|
@ -118,7 +119,7 @@ that automatically run the software.
|
|||
* Microsoft Windows SDK 2.03
|
||||
* Microsoft Windows SDK 3.00
|
||||
|
||||
We also have links to all the [Microsoft Languages NewsLetters](/disks/pc/tools/microsoft/) that were published
|
||||
NOTE: We also have links to all the [Microsoft Languages NewsLetters](/disks/pc/tools/microsoft/) that were published
|
||||
in [PC Tech Journal](/pubs/pc/magazines/pctj/).
|
||||
|
||||
### Microsoft Games
|
||||
|
|
|
|||
|
|
@ -14,9 +14,6 @@ The PCjs machine below is running PC-DOS 4.00.
|
|||
|
||||
{% include machine.html id="ibm5170-msdos400" %}
|
||||
|
||||
Vital Statistics
|
||||
---
|
||||
|
||||
MS-DOS 4.00 was released in October 1988. The contents of the six 360Kb distribution diskettes are shown below.
|
||||
|
||||
### Directory of MS-DOS 4.00 (Disk 1)
|
||||
|
|
|
|||
|
|
@ -14,9 +14,6 @@ The PCjs machine below is running PC-DOS 4.01.
|
|||
|
||||
{% include machine.html id="ibm5170-msdos401" %}
|
||||
|
||||
Vital Statistics
|
||||
---
|
||||
|
||||
MS-DOS 4.01 was released in April 1989. The contents of the six 360Kb distribution diskettes are shown below.
|
||||
|
||||
### Directory of MS-DOS 4.01 (Disk 1)
|
||||
|
|
|
|||
|
|
@ -11,6 +11,8 @@ OS/2 1.0 Debugger Boot Disk
|
|||
---
|
||||
|
||||
This disk contains a version of OS/2 1.0 built on October 12, 1988, which includes the built-in kernel debugger used by
|
||||
Microsoft and IBM for internal development. For more details, see the "OS/2 1.0" [blog post](/blog/2014/12/04/).
|
||||
Microsoft and IBM for internal development.
|
||||
|
||||
{% include machine.html id="ibm5170" %}
|
||||
|
||||
Return to [Other OS/2 Disks](/disks/pc/os2/misc/).
|
||||
|
|
|
|||
|
|
@ -25,13 +25,13 @@ of these files, suggesting that this was a private build of IBM OS/2 1.0. When
|
|||
The 5-digit number indicates the day the files were built. The first 2 digits are the year (88) and the 3 remaining
|
||||
digits are the day of the year (286 or October 12).
|
||||
|
||||
A directory listing of the disk is provided below.
|
||||
|
||||
Aside from the fact that this version of IBMDOS.COM is much larger than the 1987 version (thanks to the inclusion of
|
||||
the kernel debugger), most of the file sizes are identical. But not all. For example, the 1987 version of CLOCK01.SYS
|
||||
is 2762 bytes, whereas this version is 2812 bytes. So apparently a few changes were slipped into the 1.0 sources used
|
||||
to build these binaries.
|
||||
|
||||
A directory listing of the disk is provided below.
|
||||
|
||||
IBMBIO COM 4096 10-12-88 12:32p
|
||||
IBMDOS COM 299143 10-12-88 10:53a
|
||||
IBMDOS SYM 62788 10-12-88 10:54a
|
||||
|
|
@ -68,3 +68,48 @@ to build these binaries.
|
|||
CONFIG SYS 101 12-04-14 7:45p
|
||||
34 file(s) 765785 bytes
|
||||
437760 bytes free
|
||||
|
||||
### OS/2 FOOTBALL Boot Disk (v7.68.17)
|
||||
|
||||
The [OS/2 FOOTBALL Boot Disk (v7.68.17)](/disks/pc/os2/misc/football/debugger/) contains a prototype version of OS/2
|
||||
from early 1987 that added preliminary support for the Intel 80386 processor, including limited support for 32-bit code
|
||||
and the ability to run multiple DOS applications in V86-mode. It was forked from pre-OS/2 1.0 sources, and the only
|
||||
machine it supported was the Compaq DeskPro 386-16.
|
||||
|
||||
A directory listing of the disk is provided below.
|
||||
|
||||
Volume in drive A has no label
|
||||
Directory of A:\
|
||||
|
||||
IBMBIO COM 50689 2-27-87 3:49p
|
||||
IBMDOS COM 216962 2-27-87 3:48p
|
||||
OSO001 MSG 40730 2-27-87 12:24p
|
||||
ANSICALL EXE 3165 2-27-87 11:34a
|
||||
BKSCALLS EXE 3611 2-27-87 11:51a
|
||||
BMSCALLS EXE 2064 2-27-87 11:55a
|
||||
BVSCALLS EXE 11710 2-27-87 12:02p
|
||||
DOSCALL1 EXE 7071 2-27-87 12:03p
|
||||
KBDCALLS EXE 4138 2-27-87 12:04p
|
||||
MONCALLS EXE 5655 2-27-87 12:09p
|
||||
MOUCALLS EXE 5177 2-27-87 12:16p
|
||||
QUECALLS EXE 11508 2-27-87 12:28p
|
||||
SESMGR EXE 25744 2-27-87 12:41p
|
||||
SHELL EXE 4096 2-27-87 12:43p
|
||||
VIOCALLS EXE 9833 2-27-87 12:47p
|
||||
CMD EXE 47056 11-17-86 1:52p
|
||||
VT52 SYS 3205 10-27-86 3:57p
|
||||
IBMDOS SYM 50692 2-27-87 3:48p
|
||||
COUNTRY SYS 6175 11-03-86 8:32p
|
||||
MSG EXE 5824 11-03-86 8:36p
|
||||
NLS EXE 3124 11-03-86 8:37p
|
||||
SWAPPER EXE 4150 2-25-87 8:04p
|
||||
EXEHDR EXE 23242 10-17-86 2:24p
|
||||
COMMAND COM 23724 10-27-86 3:57p
|
||||
CONFIG SYS 90 2-27-87 4:14p
|
||||
POINTDD SYS 4240 11-03-86 7:28p
|
||||
VDISK SYS 4662 11-03-86 7:28p
|
||||
PGSWP32 EXE 7570 2-02-87 12:20p
|
||||
LIN EXE 8084 2-12-87 3:00p
|
||||
MAIN EXE 32482 11-14-86 12:44p
|
||||
CPGREP EXE 25286 10-21-86 9:08p
|
||||
31 File(s) 549888 bytes free
|
||||
|
|
|
|||
25
disks/pc/os2/misc/football/debugger/README.md
Normal file
25
disks/pc/os2/misc/football/debugger/README.md
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
---
|
||||
layout: page
|
||||
title: "OS/2 FOOTBALL Boot Disk (v7.68.17)"
|
||||
permalink: /disks/pc/os2/misc/football/debugger/
|
||||
machines:
|
||||
- type: pc-dbg
|
||||
id: deskpro386
|
||||
config: /devices/pc/machine/compaq/deskpro386/ega/2048kb/machine.xml
|
||||
uncompiled: true
|
||||
automount:
|
||||
A:
|
||||
name: OS/2 FOOTBALL Boot Disk (v7.68.17)
|
||||
path: /disks/pc/os2/misc/football/debugger/FOOTBALL-7.68.17.json
|
||||
---
|
||||
|
||||
OS/2 FOOTBALL Boot Disk (v7.68.17)
|
||||
---
|
||||
|
||||
This boot disk contains a prototype version of OS/2 from early 1987 that added preliminary support for the Intel 80386
|
||||
processor, including limited support for 32-bit code and the ability to run multiple DOS applications in V86-mode.
|
||||
It was forked from pre-OS/2 1.0 sources, and the only machine it supported was the Compaq DeskPro 386-16.
|
||||
|
||||
{% include machine.html id="deskpro386" %}
|
||||
|
||||
Return to [Other OS/2 Disks](/disks/pc/os2/misc/).
|
||||
|
|
@ -6,4 +6,7 @@
|
|||
<disk id="disk01" size="1228800" chs="80:2:15" href="/disks/pc/os2/misc/1.0/debugger/OS210-BOOT.json">
|
||||
<name>OS/2 1.0 Debugger Boot Disk</name>
|
||||
</disk>
|
||||
<disk id="disk02" size="1228800" chs="80:2:15" img="football/debugger/static/FOOTBALL-7.68.17.img" href="/disks/pc/os2/misc/football/debugger/FOOTBALL-7.68.17.json" md5="3825dc8053f904c266b1ce98dbf1e981" md5json="7ea3f05e71ae4f3ccc7432f025426140">
|
||||
<name>OS/2 FOOTBALL Boot Disk (v7.68.17)</name>
|
||||
</disk>
|
||||
</manifest>
|
||||
|
|
|
|||
|
|
@ -68,7 +68,12 @@
|
|||
</xsl:with-param>
|
||||
<xsl:with-param name="component" select="'machine'"/>
|
||||
<xsl:with-param name="class"><xsl:value-of select="@class"/>js</xsl:with-param>
|
||||
<xsl:with-param name="parms"><xsl:if test="@parms">,<xsl:value-of select="@parms"/></xsl:if></xsl:with-param>
|
||||
<xsl:with-param name="parms">
|
||||
<xsl:choose>
|
||||
<xsl:when test="$machineState != ''">state:"<xsl:value-of select="$machineState"/>"</xsl:when>
|
||||
<xsl:otherwise><xsl:value-of select="@parms"/></xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:with-param>
|
||||
<xsl:with-param name="url"><xsl:value-of select="@url"/></xsl:with-param>
|
||||
</xsl:call-template>
|
||||
</div>
|
||||
|
|
@ -107,9 +112,9 @@
|
|||
<xsl:otherwise><xsl:value-of select="$component"/></xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:variable>
|
||||
<xsl:variable name="componentURL">
|
||||
<xsl:variable name="machineParms">
|
||||
<xsl:choose>
|
||||
<xsl:when test="$component = 'machine'">url:'<xsl:value-of select="$url"/>'</xsl:when>
|
||||
<xsl:when test="$component = 'machine'"><xsl:value-of select="$parms"/></xsl:when>
|
||||
<xsl:otherwise/>
|
||||
</xsl:choose>
|
||||
</xsl:variable>
|
||||
|
|
@ -191,7 +196,7 @@
|
|||
<xsl:variable name="componentClass">
|
||||
<xsl:value-of select="$APPCLASS"/><xsl:text>-</xsl:text><xsl:value-of select="$component"/><xsl:text> </xsl:text><xsl:value-of select="$APPCLASS"/><xsl:text>-component</xsl:text>
|
||||
</xsl:variable>
|
||||
<div id="{$id}" class="{$componentClass}" style="{$width}{$height}{$pos}{$left}{$top}{$padding}" data-value="{$componentURL}">
|
||||
<div id="{$id}" class="{$componentClass}" style="{$width}{$height}{$pos}{$left}{$top}{$padding}" data-value="{$machineParms}">
|
||||
<xsl:if test="$component = 'machine'">
|
||||
<xsl:apply-templates select="name" mode="machine"/>
|
||||
</xsl:if>
|
||||
|
|
@ -206,7 +211,7 @@
|
|||
<xsl:apply-templates select="menu" mode="component"/>
|
||||
</xsl:if>
|
||||
<xsl:if test="$class != '' and $component != 'machine'">
|
||||
<div class="{$APPCLASS}-{$class}-object" data-value="id:'{$id}',name:'{$name}'{$comment}{$parms}"> </div>
|
||||
<div class="{$APPCLASS}-{$class}-object" data-value="{{id:'{$id}',name:'{$name}'{$comment}{$parms}}}"> </div>
|
||||
</xsl:if>
|
||||
<xsl:if test="control">
|
||||
<div class="{$APPCLASS}-controls">
|
||||
|
|
@ -354,30 +359,30 @@
|
|||
</xsl:if>
|
||||
<xsl:choose>
|
||||
<xsl:when test="@type = 'canvas'">
|
||||
<canvas class="{$APPCLASS}-binding {$APPCLASS}-canvas" width="{@width}" height="{@height}" style="-webkit-user-select:none;{$border}{$fontsize}{$style}" data-value="{$type},{$binding}"><xsl:apply-templates/></canvas>
|
||||
<canvas class="{$APPCLASS}-binding {$APPCLASS}-canvas" width="{@width}" height="{@height}" style="-webkit-user-select:none;{$border}{$fontsize}{$style}" data-value="{{{$type},{$binding}}}"><xsl:apply-templates/></canvas>
|
||||
</xsl:when>
|
||||
<xsl:when test="@type = 'button'">
|
||||
<button class="{$APPCLASS}-binding" style="-webkit-user-select:none;{$border}{$width}{$height}{$fontsize}{$style}" data-value="{$type},{$binding}"><xsl:apply-templates/></button>
|
||||
<button class="{$APPCLASS}-binding" style="-webkit-user-select:none;{$border}{$width}{$height}{$fontsize}{$style}" data-value="{{{$type},{$binding}}}"><xsl:apply-templates/></button>
|
||||
</xsl:when>
|
||||
<xsl:when test="@type = 'list'">
|
||||
<select class="{$APPCLASS}-binding" style="{$border}{$width}{$height}{$fontsize}{$style}" data-value="{$type},{$binding}">
|
||||
<select class="{$APPCLASS}-binding" style="{$border}{$width}{$height}{$fontsize}{$style}" data-value="{{{$type},{$binding}}}">
|
||||
<xsl:apply-templates select="disk|app|manifest" mode="component"/>
|
||||
</select>
|
||||
</xsl:when>
|
||||
<xsl:when test="@type = 'text'">
|
||||
<input class="{$APPCLASS}-binding" type="text" style="{$border}{$width}{$height}{$style}" data-value="{$type},{$binding}" value="{.}" autocapitalize="off" autocorrect="off"/>
|
||||
<input class="{$APPCLASS}-binding" type="text" style="{$border}{$width}{$height}{$style}" data-value="{{{$type},{$binding}}}" value="{.}" autocapitalize="off" autocorrect="off"/>
|
||||
</xsl:when>
|
||||
<xsl:when test="@type = 'submit'">
|
||||
<input class="{$APPCLASS}-binding" type="submit" style="{$border}{$fontsize}{$style}" data-value="{$type},{$binding}" value="{.}"/>
|
||||
<input class="{$APPCLASS}-binding" type="submit" style="{$border}{$fontsize}{$style}" data-value="{{{$type},{$binding}}}" value="{.}"/>
|
||||
</xsl:when>
|
||||
<xsl:when test="@type = 'textarea'">
|
||||
<textarea class="{$APPCLASS}-binding" style="{$border}{$width}{$height}{$style}" data-value="{$type},{$binding}" readonly="readonly"> </textarea>
|
||||
<textarea class="{$APPCLASS}-binding" style="{$border}{$width}{$height}{$style}" data-value="{{{$type},{$binding}}}" readonly="readonly"> </textarea>
|
||||
</xsl:when>
|
||||
<xsl:when test="@type = 'heading'">
|
||||
<div><xsl:value-of select="."/></div>
|
||||
</xsl:when>
|
||||
<xsl:when test="@type = 'file'">
|
||||
<form class="{$APPCLASS}-binding" data-value="{$type},{$binding}">
|
||||
<form class="{$APPCLASS}-binding" data-value="{{{$type},{$binding}}}">
|
||||
<fieldset class="{$APPCLASS}-fieldset">
|
||||
<input type="file"/>
|
||||
<input type="submit" value="Mount" disabled="true"/>
|
||||
|
|
@ -385,7 +390,7 @@
|
|||
</form>
|
||||
</xsl:when>
|
||||
<xsl:when test="@type = 'led'">
|
||||
<div class="{$APPCLASS}-binding {$APPCLASS}-{@type}" data-value="{$type},{$binding}"><xsl:value-of select="."/></div>
|
||||
<div class="{$APPCLASS}-binding {$APPCLASS}-{@type}" data-value="{{{$type},{$binding}}}"><xsl:value-of select="."/></div>
|
||||
</xsl:when>
|
||||
<xsl:when test="@type = 'separator'">
|
||||
<hr/>
|
||||
|
|
@ -397,7 +402,7 @@
|
|||
<div style="clear:both"> </div>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<div class="{$APPCLASS}-binding{$subClass} {$APPCLASS}-{@type}" style="-webkit-user-select:none;{$border}{$width}{$height}{$fontsize}{$style}" data-value="{$type},{$binding}"><xsl:apply-templates/></div>
|
||||
<div class="{$APPCLASS}-binding{$subClass} {$APPCLASS}-{@type}" style="-webkit-user-select:none;{$border}{$width}{$height}{$fontsize}{$style}" data-value="{{{$type},{$binding}}}"><xsl:apply-templates/></div>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
<xsl:if test="@label">
|
||||
|
|
@ -423,7 +428,7 @@
|
|||
</xsl:if>
|
||||
</xsl:if>
|
||||
</xsl:variable>
|
||||
<option value="{@path}" data-value="{$desc}"><xsl:if test="name"><xsl:value-of select="name"/></xsl:if><xsl:if test="not(name)"><xsl:value-of select="."/></xsl:if></option>
|
||||
<option value="{@path}" data-value="{{{$desc}}}"><xsl:if test="name"><xsl:value-of select="name"/></xsl:if><xsl:if test="not(name)"><xsl:value-of select="."/></xsl:if></option>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="app[@ref]" mode="component">
|
||||
|
|
@ -446,7 +451,7 @@
|
|||
<xsl:variable name="files">
|
||||
<xsl:for-each select="file"><xsl:if test="position() = 1"><xsl:value-of select="$path"/></xsl:if><xsl:value-of select="@name"/><xsl:if test="position() != last()">;</xsl:if></xsl:for-each>
|
||||
</xsl:variable>
|
||||
<option value="{$files}" data-value="{$desc}"><xsl:value-of select="@name"/></option>
|
||||
<option value="{$files}" data-value="{{{$desc}}}"><xsl:value-of select="@name"/></option>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="manifest[@ref]" mode="component">
|
||||
|
|
@ -483,7 +488,7 @@
|
|||
</xsl:if>
|
||||
</xsl:variable>
|
||||
<xsl:if test="@href">
|
||||
<option value="{@href}" data-value="{$link}"><xsl:value-of select="$name"/></option>
|
||||
<option value="{@href}" data-value="{{{$link}}}"><xsl:value-of select="$name"/></option>
|
||||
</xsl:if>
|
||||
<xsl:if test="not(@href)">
|
||||
<xsl:variable name="dir">
|
||||
|
|
@ -492,7 +497,7 @@
|
|||
<xsl:variable name="files">
|
||||
<xsl:for-each select="file"><xsl:if test="position() = 1"><xsl:value-of select="$dir"/></xsl:if><xsl:value-of select="@dir"/><xsl:value-of select="."/><xsl:if test="position() != last()">;</xsl:if></xsl:for-each>
|
||||
</xsl:variable>
|
||||
<option value="{$files}" data-value="{$link}"><xsl:value-of select="$name"/></option>
|
||||
<option value="{$files}" data-value="{{{$link}}}"><xsl:value-of select="$name"/></option>
|
||||
</xsl:if>
|
||||
</xsl:if>
|
||||
</xsl:for-each>
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -157,7 +157,7 @@
|
|||
</xsl:if>
|
||||
<div class="{$APPCLASS}-container" style="{$border}{$style}">
|
||||
<xsl:if test="$class != '' and $component != 'machine'">
|
||||
<div class="{$APPCLASS}-{$class}-object" data-value="id:'{$id}',name:'{$name}'{$parms}"></div>
|
||||
<div class="{$APPCLASS}-{$class}-object" data-value="{{id:'{$id}',name:'{$name}'{$parms}}}"></div>
|
||||
</xsl:if>
|
||||
<xsl:if test="control">
|
||||
<div class="{$APPCLASS}-controls">
|
||||
|
|
@ -270,27 +270,27 @@
|
|||
</xsl:if>
|
||||
<xsl:choose>
|
||||
<xsl:when test="@type = 'button'">
|
||||
<button class="{$APPCLASS}-binding" style="{$border}{$width}{$height}{$fontsize}{$style}" data-value="{$type},{$binding}"><xsl:apply-templates/></button>
|
||||
<button class="{$APPCLASS}-binding" style="{$border}{$width}{$height}{$fontsize}{$style}" data-value="{{{$type},{$binding}}}"><xsl:apply-templates/></button>
|
||||
</xsl:when>
|
||||
<xsl:when test="@type = 'list'">
|
||||
<select class="{$APPCLASS}-binding" style="{$border}{$width}{$height}{$fontsize}{$style}" data-value="{$type},{$binding}">
|
||||
<select class="{$APPCLASS}-binding" style="{$border}{$width}{$height}{$fontsize}{$style}" data-value="{{{$type},{$binding}}}">
|
||||
<xsl:apply-templates select="item" mode="component"/>
|
||||
</select>
|
||||
</xsl:when>
|
||||
<xsl:when test="@type = 'text'">
|
||||
<input class="{$APPCLASS}-binding" type="text" style="{$border}{$width}{$height}{$style}" data-value="{$type},{$binding}" value="" autocapitalize="off" autocorrect="off"/>
|
||||
<input class="{$APPCLASS}-binding" type="text" style="{$border}{$width}{$height}{$style}" data-value="{{{$type},{$binding}}}" value="" autocapitalize="off" autocorrect="off"/>
|
||||
</xsl:when>
|
||||
<xsl:when test="@type = 'submit'">
|
||||
<input class="{$APPCLASS}-binding" type="submit" style="{$border}{$fontsize}{$style}" data-value="{$type},{$binding}" value="{.}"/>
|
||||
<input class="{$APPCLASS}-binding" type="submit" style="{$border}{$fontsize}{$style}" data-value="{{{$type},{$binding}}}" value="{.}"/>
|
||||
</xsl:when>
|
||||
<xsl:when test="@type = 'textarea'">
|
||||
<textarea class="{$APPCLASS}-binding" style="{$border}{$width}{$height}{$style}" data-value="{$type},{$binding}" readonly="readonly"></textarea>
|
||||
<textarea class="{$APPCLASS}-binding" style="{$border}{$width}{$height}{$style}" data-value="{{{$type},{$binding}}}" readonly="readonly"></textarea>
|
||||
</xsl:when>
|
||||
<xsl:when test="@type = 'heading'">
|
||||
<div><xsl:value-of select="."/></div>
|
||||
</xsl:when>
|
||||
<xsl:when test="@type = 'file'">
|
||||
<form class="{$APPCLASS}-binding" style="{$border}{$width}{$height}{$style}" data-value="{$type},{$binding}">
|
||||
<form class="{$APPCLASS}-binding" style="{$border}{$width}{$height}{$style}" data-value="{{{$type},{$binding}}}">
|
||||
<fieldset class="{$APPCLASS}-fieldset">
|
||||
<input type="file"/>
|
||||
<input type="submit" value="Mount" disabled="true"/>
|
||||
|
|
@ -304,7 +304,7 @@
|
|||
<div style="clear:both"></div><br/>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<div class="{$APPCLASS}-binding{$subclass}" style="{$border}{$width}{$height}{$style}" data-value="{$type},{$binding}"><xsl:apply-templates/></div>
|
||||
<div class="{$APPCLASS}-binding{$subclass}" style="{$border}{$width}{$height}{$style}" data-value="{{{$type},{$binding}}}"><xsl:apply-templates/></div>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
<xsl:if test="@label">
|
||||
|
|
|
|||
|
|
@ -82,7 +82,7 @@ if (NODE) {
|
|||
* @param {Object} [parmsMachine]
|
||||
* @param {boolean} [fSuspended]
|
||||
*
|
||||
* The Computer component has no required (parmsComputer) properties, but does
|
||||
* The Computer component has no required (parmsComputer) properties, but it does
|
||||
* support the following:
|
||||
*
|
||||
* autoPower: true to automatically power the computer (default), false to wait;
|
||||
|
|
@ -102,6 +102,16 @@ if (NODE) {
|
|||
*
|
||||
* state: the path to JSON-encoded state file (see details regarding 'state' below)
|
||||
*
|
||||
* The parmsMachine object, if provided, may contain any of:
|
||||
*
|
||||
* url: the location of the machine XML file
|
||||
*
|
||||
* autoMount: if set, this should override any 'autoMount' property in the FDC's
|
||||
* parmsFDC object.
|
||||
*
|
||||
* state: if set, this should override any 'state' property in the Computer's
|
||||
* parmsComputer object.
|
||||
*
|
||||
* If a predefined state is supplied AND it's successfully loaded, then resume behavior
|
||||
* defaults to '1' (ie, resume enabled without prompting).
|
||||
*
|
||||
|
|
@ -141,7 +151,9 @@ function Computer(parmsComputer, parmsMachine, fSuspended) {
|
|||
this.sStateData = null;
|
||||
this.fStateData = false; // remembers if sStateData was loaded
|
||||
this.fServerState = false;
|
||||
this.url = parmsMachine? parmsMachine['url'] : null;
|
||||
|
||||
this.parmsMachine = parmsMachine;
|
||||
this.url = this.getMachineParm('url') || "";
|
||||
|
||||
/*
|
||||
* Generate a random number x (where 0 <= x < 1), add 0.1 so that it's guaranteed to be
|
||||
|
|
@ -230,7 +242,7 @@ function Computer(parmsComputer, parmsMachine, fSuspended) {
|
|||
* localStorage (in other words, it prevents fAllowResume from being true, and forcing resume off).
|
||||
*/
|
||||
var fAllowResume;
|
||||
var sState = Component.parmsURL && Component.parmsURL['state'] || (fAllowResume = true) && parmsComputer['state'];
|
||||
var sState = Component.parmsURL && Component.parmsURL['state'] || this.getMachineParm('state') || (fAllowResume = true) && parmsComputer['state'];
|
||||
|
||||
if (sState) {
|
||||
sStatePath = this.sStatePath = sState;
|
||||
|
|
@ -318,6 +330,17 @@ Computer.prototype.getMachineID = function()
|
|||
return this.sMachineID;
|
||||
};
|
||||
|
||||
/**
|
||||
* getMachineParm(sParm)
|
||||
*
|
||||
* @param {string} sParm
|
||||
* @return {string|undefined}
|
||||
*/
|
||||
Computer.prototype.getMachineParm = function(sParm)
|
||||
{
|
||||
return this.parmsMachine && this.parmsMachine[sParm];
|
||||
};
|
||||
|
||||
/**
|
||||
* getUserID()
|
||||
*
|
||||
|
|
|
|||
|
|
@ -142,22 +142,11 @@ function FDC(parmsFDC) {
|
|||
this['dmaWrite'] = this.dmaWrite;
|
||||
this['dmaFormat'] = this.dmaFormat;
|
||||
|
||||
this.configMount = null;
|
||||
if (parmsFDC['autoMount']) {
|
||||
this.configMount = parmsFDC['autoMount'];
|
||||
if (typeof this.configMount == "string") {
|
||||
try {
|
||||
/*
|
||||
* The most likely source of any exception will be right here, where we're parsing
|
||||
* the JSON-encoded diskette data.
|
||||
* We record any 'autoMount' object now, but we no longer parse it until initBus(), because the Computer's
|
||||
* getMachineParm() service may have an override for us.
|
||||
*/
|
||||
this.configMount = eval("(" + parmsFDC['autoMount'] + ")");
|
||||
} catch (e) {
|
||||
Component.error("FDC auto-mount error: " + e.message + " (" + parmsFDC['autoMount'] + ")");
|
||||
this.configMount = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
this.configMount = parmsFDC['autoMount'] || null;
|
||||
|
||||
/*
|
||||
* The following array keeps track of every disk image we've ever mounted. Each entry in the
|
||||
|
|
@ -533,6 +522,23 @@ FDC.prototype.initBus = function(cmp, bus, cpu, dbg)
|
|||
|
||||
this.chipset = cmp.getMachineComponent("ChipSet");
|
||||
|
||||
this.configMount = this.cmp.getMachineParm('autoMount') || this.configMount;
|
||||
|
||||
if (this.configMount) {
|
||||
if (typeof this.configMount == "string") {
|
||||
try {
|
||||
/*
|
||||
* The most likely source of any exception will be right here, where we're parsing
|
||||
* the JSON-encoded diskette data.
|
||||
*/
|
||||
this.configMount = eval("(" + this.configMount + ")");
|
||||
} catch (e) {
|
||||
Component.error("FDC auto-mount error: " + e.message + " (" + this.configMount + ")");
|
||||
this.configMount = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* If we didn't need auto-mount support, we could defer controller initialization until we received a powerUp() notification,
|
||||
* at which point reset() would call initController(), or restore() would restore the controller; in that case, all we'd need
|
||||
|
|
|
|||
|
|
@ -69,7 +69,12 @@
|
|||
</xsl:with-param>
|
||||
<xsl:with-param name="component" select="'machine'"/>
|
||||
<xsl:with-param name="class"><xsl:value-of select="@class"/>js</xsl:with-param>
|
||||
<xsl:with-param name="parms"><xsl:if test="@parms">,<xsl:value-of select="@parms"/></xsl:if></xsl:with-param>
|
||||
<xsl:with-param name="parms">
|
||||
<xsl:choose>
|
||||
<xsl:when test="$machineState != ''">state:"<xsl:value-of select="$machineState"/>"</xsl:when>
|
||||
<xsl:otherwise><xsl:value-of select="@parms"/></xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:with-param>
|
||||
<xsl:with-param name="url"><xsl:value-of select="@url"/></xsl:with-param>
|
||||
</xsl:call-template>
|
||||
</div>
|
||||
|
|
@ -108,9 +113,9 @@
|
|||
<xsl:otherwise><xsl:value-of select="$component"/></xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:variable>
|
||||
<xsl:variable name="componentURL">
|
||||
<xsl:variable name="machineParms">
|
||||
<xsl:choose>
|
||||
<xsl:when test="$component = 'machine'">url:'<xsl:value-of select="$url"/>'</xsl:when>
|
||||
<xsl:when test="$component = 'machine'"><xsl:value-of select="$parms"/></xsl:when>
|
||||
<xsl:otherwise/>
|
||||
</xsl:choose>
|
||||
</xsl:variable>
|
||||
|
|
@ -192,7 +197,7 @@
|
|||
<xsl:variable name="componentClass">
|
||||
<xsl:value-of select="$APPCLASS"/><xsl:text>-</xsl:text><xsl:value-of select="$component"/><xsl:text> </xsl:text><xsl:value-of select="$APPCLASS"/><xsl:text>-component</xsl:text>
|
||||
</xsl:variable>
|
||||
<div id="{$id}" class="{$componentClass}" style="{$width}{$height}{$pos}{$left}{$top}{$padding}" data-value="{$componentURL}">
|
||||
<div id="{$id}" class="{$componentClass}" style="{$width}{$height}{$pos}{$left}{$top}{$padding}" data-value="{$machineParms}">
|
||||
<xsl:if test="$component = 'machine'">
|
||||
<xsl:apply-templates select="name" mode="machine"/>
|
||||
</xsl:if>
|
||||
|
|
@ -207,7 +212,7 @@
|
|||
<xsl:apply-templates select="menu" mode="component"/>
|
||||
</xsl:if>
|
||||
<xsl:if test="$class != '' and $component != 'machine'">
|
||||
<div class="{$APPCLASS}-{$class}-object" data-value="id:'{$id}',name:'{$name}'{$comment}{$parms}"> </div>
|
||||
<div class="{$APPCLASS}-{$class}-object" data-value="{{id:'{$id}',name:'{$name}'{$comment}{$parms}}}"> </div>
|
||||
</xsl:if>
|
||||
<xsl:if test="control">
|
||||
<div class="{$APPCLASS}-controls">
|
||||
|
|
@ -355,30 +360,30 @@
|
|||
</xsl:if>
|
||||
<xsl:choose>
|
||||
<xsl:when test="@type = 'canvas'">
|
||||
<canvas class="{$APPCLASS}-binding {$APPCLASS}-canvas" width="{@width}" height="{@height}" style="-webkit-user-select:none;{$border}{$fontsize}{$style}" data-value="{$type},{$binding}"><xsl:apply-templates/></canvas>
|
||||
<canvas class="{$APPCLASS}-binding {$APPCLASS}-canvas" width="{@width}" height="{@height}" style="-webkit-user-select:none;{$border}{$fontsize}{$style}" data-value="{{{$type},{$binding}}}"><xsl:apply-templates/></canvas>
|
||||
</xsl:when>
|
||||
<xsl:when test="@type = 'button'">
|
||||
<button class="{$APPCLASS}-binding" style="-webkit-user-select:none;{$border}{$width}{$height}{$fontsize}{$style}" data-value="{$type},{$binding}"><xsl:apply-templates/></button>
|
||||
<button class="{$APPCLASS}-binding" style="-webkit-user-select:none;{$border}{$width}{$height}{$fontsize}{$style}" data-value="{{{$type},{$binding}}}"><xsl:apply-templates/></button>
|
||||
</xsl:when>
|
||||
<xsl:when test="@type = 'list'">
|
||||
<select class="{$APPCLASS}-binding" style="{$border}{$width}{$height}{$fontsize}{$style}" data-value="{$type},{$binding}">
|
||||
<select class="{$APPCLASS}-binding" style="{$border}{$width}{$height}{$fontsize}{$style}" data-value="{{{$type},{$binding}}}">
|
||||
<xsl:apply-templates select="disk|app|manifest" mode="component"/>
|
||||
</select>
|
||||
</xsl:when>
|
||||
<xsl:when test="@type = 'text'">
|
||||
<input class="{$APPCLASS}-binding" type="text" style="{$border}{$width}{$height}{$style}" data-value="{$type},{$binding}" value="{.}" autocapitalize="off" autocorrect="off"/>
|
||||
<input class="{$APPCLASS}-binding" type="text" style="{$border}{$width}{$height}{$style}" data-value="{{{$type},{$binding}}}" value="{.}" autocapitalize="off" autocorrect="off"/>
|
||||
</xsl:when>
|
||||
<xsl:when test="@type = 'submit'">
|
||||
<input class="{$APPCLASS}-binding" type="submit" style="{$border}{$fontsize}{$style}" data-value="{$type},{$binding}" value="{.}"/>
|
||||
<input class="{$APPCLASS}-binding" type="submit" style="{$border}{$fontsize}{$style}" data-value="{{{$type},{$binding}}}" value="{.}"/>
|
||||
</xsl:when>
|
||||
<xsl:when test="@type = 'textarea'">
|
||||
<textarea class="{$APPCLASS}-binding" style="{$border}{$width}{$height}{$style}" data-value="{$type},{$binding}" readonly="readonly"> </textarea>
|
||||
<textarea class="{$APPCLASS}-binding" style="{$border}{$width}{$height}{$style}" data-value="{{{$type},{$binding}}}" readonly="readonly"> </textarea>
|
||||
</xsl:when>
|
||||
<xsl:when test="@type = 'heading'">
|
||||
<div><xsl:value-of select="."/></div>
|
||||
</xsl:when>
|
||||
<xsl:when test="@type = 'file'">
|
||||
<form class="{$APPCLASS}-binding" data-value="{$type},{$binding}">
|
||||
<form class="{$APPCLASS}-binding" data-value="{{{$type},{$binding}}}">
|
||||
<fieldset class="{$APPCLASS}-fieldset">
|
||||
<input type="file"/>
|
||||
<input type="submit" value="Mount" disabled="true"/>
|
||||
|
|
@ -386,7 +391,7 @@
|
|||
</form>
|
||||
</xsl:when>
|
||||
<xsl:when test="@type = 'led'">
|
||||
<div class="{$APPCLASS}-binding {$APPCLASS}-{@type}" data-value="{$type},{$binding}"><xsl:value-of select="."/></div>
|
||||
<div class="{$APPCLASS}-binding {$APPCLASS}-{@type}" data-value="{{{$type},{$binding}}}"><xsl:value-of select="."/></div>
|
||||
</xsl:when>
|
||||
<xsl:when test="@type = 'separator'">
|
||||
<hr/>
|
||||
|
|
@ -398,7 +403,7 @@
|
|||
<div style="clear:both"> </div>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<div class="{$APPCLASS}-binding{$subClass} {$APPCLASS}-{@type}" style="-webkit-user-select:none;{$border}{$width}{$height}{$fontsize}{$style}" data-value="{$type},{$binding}"><xsl:apply-templates/></div>
|
||||
<div class="{$APPCLASS}-binding{$subClass} {$APPCLASS}-{@type}" style="-webkit-user-select:none;{$border}{$width}{$height}{$fontsize}{$style}" data-value="{{{$type},{$binding}}}"><xsl:apply-templates/></div>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
<xsl:if test="@label">
|
||||
|
|
@ -424,7 +429,7 @@
|
|||
</xsl:if>
|
||||
</xsl:if>
|
||||
</xsl:variable>
|
||||
<option value="{@path}" data-value="{$desc}"><xsl:if test="name"><xsl:value-of select="name"/></xsl:if><xsl:if test="not(name)"><xsl:value-of select="."/></xsl:if></option>
|
||||
<option value="{@path}" data-value="{{{$desc}}}"><xsl:if test="name"><xsl:value-of select="name"/></xsl:if><xsl:if test="not(name)"><xsl:value-of select="."/></xsl:if></option>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="app[@ref]" mode="component">
|
||||
|
|
@ -447,7 +452,7 @@
|
|||
<xsl:variable name="files">
|
||||
<xsl:for-each select="file"><xsl:if test="position() = 1"><xsl:value-of select="$path"/></xsl:if><xsl:value-of select="@name"/><xsl:if test="position() != last()">;</xsl:if></xsl:for-each>
|
||||
</xsl:variable>
|
||||
<option value="{$files}" data-value="{$desc}"><xsl:value-of select="@name"/></option>
|
||||
<option value="{$files}" data-value="{{{$desc}}}"><xsl:value-of select="@name"/></option>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="manifest[@ref]" mode="component">
|
||||
|
|
@ -485,7 +490,7 @@
|
|||
</xsl:variable>
|
||||
<!-- TODO: Think about incorporating the optional "desc" tag into the disk description (see /disks/pc/tools/microsoft/c/4.00/manifest.xml) -->
|
||||
<xsl:if test="@href">
|
||||
<option value="{@href}" data-value="{$link}"><xsl:value-of select="$name"/></option>
|
||||
<option value="{@href}" data-value="{{{$link}}}"><xsl:value-of select="$name"/></option>
|
||||
</xsl:if>
|
||||
<xsl:if test="not(@href)">
|
||||
<xsl:variable name="dir">
|
||||
|
|
@ -494,7 +499,7 @@
|
|||
<xsl:variable name="files">
|
||||
<xsl:for-each select="file"><xsl:if test="position() = 1"><xsl:value-of select="$dir"/></xsl:if><xsl:value-of select="@dir"/><xsl:value-of select="."/><xsl:if test="position() != last()">;</xsl:if></xsl:for-each>
|
||||
</xsl:variable>
|
||||
<option value="{$files}" data-value="{$link}"><xsl:value-of select="$name"/></option>
|
||||
<option value="{$files}" data-value="{{{$link}}}"><xsl:value-of select="$name"/></option>
|
||||
</xsl:if>
|
||||
</xsl:if>
|
||||
</xsl:for-each>
|
||||
|
|
|
|||
|
|
@ -456,7 +456,7 @@ Component.getComponentParms = function(element)
|
|||
sParms = element.getAttribute("data-value");
|
||||
if (sParms) {
|
||||
try {
|
||||
parms = eval("({" + sParms + "})"); // jshint ignore:line
|
||||
parms = eval("(" + sParms + ")"); // jshint ignore:line
|
||||
/*
|
||||
* We can no longer invoke removeAttribute() because some components (eg, Panel) need
|
||||
* to run their initXXX() code more than once, to avoid initialization-order dependencies.
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@ var cMachines = 0;
|
|||
var fAsync = true;
|
||||
|
||||
/**
|
||||
* loadXML(sFile, idMachine, sStateFile, fResolve, display, done)
|
||||
* loadXML(sFile, idMachine, sParms, fResolve, display, done)
|
||||
*
|
||||
* This is the preferred way to load all XML and XSL files. It uses loadResource()
|
||||
* to load them as strings, which parseXML() can massage before parsing/transforming them.
|
||||
|
|
@ -81,12 +81,12 @@ var fAsync = true;
|
|||
*
|
||||
* @param {string} sXMLFile
|
||||
* @param {string|null|undefined} idMachine
|
||||
* @param {string|null|undefined} sStateFile
|
||||
* @param {string|null|undefined} sParms
|
||||
* @param {boolean} fResolve is true to resolve any "ref" attributes
|
||||
* @param {function(string)} display
|
||||
* @param {function(string,Object)} done (string contains the unparsed XML string data, and Object contains a parsed XML object)
|
||||
*/
|
||||
function loadXML(sXMLFile, idMachine, sStateFile, fResolve, display, done)
|
||||
function loadXML(sXMLFile, idMachine, sParms, fResolve, display, done)
|
||||
{
|
||||
var doneLoadXML = function(sURLName, sXML, nErrorCode) {
|
||||
if (nErrorCode) {
|
||||
|
|
@ -94,14 +94,14 @@ function loadXML(sXMLFile, idMachine, sStateFile, fResolve, display, done)
|
|||
done(sXML, null);
|
||||
return;
|
||||
}
|
||||
parseXML(sXML, sXMLFile, idMachine, sStateFile, fResolve, display, done);
|
||||
parseXML(sXML, sXMLFile, idMachine, sParms, fResolve, display, done);
|
||||
};
|
||||
display("Loading " + sXMLFile + "...");
|
||||
web.loadResource(sXMLFile, fAsync, null, null, doneLoadXML);
|
||||
}
|
||||
|
||||
/**
|
||||
* parseXML(sXML, sXMLFile, idMachine, sStateFile, fResolve, display, done)
|
||||
* parseXML(sXML, sXMLFile, idMachine, sParms, fResolve, display, done)
|
||||
*
|
||||
* Generates an XML document from an XML string. This function also provides a work-around for XSLT's
|
||||
* lack of support for the document() function (at least on some browsers), by replacing every reference
|
||||
|
|
@ -110,12 +110,12 @@ function loadXML(sXMLFile, idMachine, sStateFile, fResolve, display, done)
|
|||
* @param {string} sXML
|
||||
* @param {string|null} sXMLFile
|
||||
* @param {string|null|undefined} idMachine
|
||||
* @param {string|null|undefined} sStateFile
|
||||
* @param {string|null|undefined} sParms
|
||||
* @param {boolean} fResolve is true to resolve any "ref" attributes; default is false
|
||||
* @param {function(string)} display
|
||||
* @param {function(string,Object)} done (string contains the unparsed XML string data, and Object contains a parsed XML object)
|
||||
*/
|
||||
function parseXML(sXML, sXMLFile, idMachine, sStateFile, fResolve, display, done)
|
||||
function parseXML(sXML, sXMLFile, idMachine, sParms, fResolve, display, done)
|
||||
{
|
||||
var buildXML = function(sXML, sError) {
|
||||
if (sError) {
|
||||
|
|
@ -125,7 +125,20 @@ function parseXML(sXML, sXMLFile, idMachine, sStateFile, fResolve, display, done
|
|||
if (idMachine) {
|
||||
var sURL = sXMLFile;
|
||||
if (sURL && sURL.indexOf('/') < 0) sURL = window.location.pathname + sURL;
|
||||
sXML = sXML.replace(/(<machine[^>]*\sid=)(['"]).*?\2/, "$1$2" + idMachine + "$2" + (sStateFile? " state=$2" + sStateFile + "$2" : "") + (sURL? " url=$2" + sURL + "$2" : ""));
|
||||
/*
|
||||
* We embed the URL to the XML file both as a separate "xml" attribute for easy access from the
|
||||
* XSL file and as part of the "parms" attribute for easy access from JavaScript.
|
||||
*/
|
||||
if (!sParms) {
|
||||
sParms = '{';
|
||||
} else if (sParms.substr(0, 1) == '{') {
|
||||
sParms = sParms.slice(0, -1);
|
||||
if (sParms.length > 1) sParms += ',';
|
||||
} else { // backward compatibility: sParms is actually sStateFile
|
||||
sParms = '{state:"' + sParms + '",';
|
||||
}
|
||||
sParms += 'url:"' + sURL + '"}';
|
||||
sXML = sXML.replace(/(<machine[^>]*\sid=)(['"]).*?\2/, "$1$2" + idMachine + "$2" + (sParms? " parms='" + sParms + "'" : "") + (sURL? ' url="' + sURL + '"' : ''));
|
||||
}
|
||||
/*
|
||||
* Non-COMPILED kludge to replace the version number template in the XSL file (which we assume we're reading,
|
||||
|
|
@ -281,7 +294,7 @@ function resolveXML(sXML, display, done)
|
|||
}
|
||||
|
||||
/**
|
||||
* embedMachine(sName, sVersion, idElement, sXMLFile, sXSLFile, sStateFile)
|
||||
* embedMachine(sName, sVersion, idElement, sXMLFile, sXSLFile, sParms)
|
||||
*
|
||||
* This allows to you embed a machine on a web page, by transforming the machine XML into HTML.
|
||||
*
|
||||
|
|
@ -290,10 +303,10 @@ function resolveXML(sXML, display, done)
|
|||
* @param {string} idElement
|
||||
* @param {string} sXMLFile
|
||||
* @param {string} sXSLFile
|
||||
* @param {string} [sStateFile]
|
||||
* @param {string} [sParms]
|
||||
* @return {boolean} true if successful, false if error
|
||||
*/
|
||||
function embedMachine(sName, sVersion, idElement, sXMLFile, sXSLFile, sStateFile)
|
||||
function embedMachine(sName, sVersion, idElement, sXMLFile, sXSLFile, sParms)
|
||||
{
|
||||
var eMachine, eWarning, fSuccess = true;
|
||||
|
||||
|
|
@ -439,9 +452,9 @@ function embedMachine(sName, sVersion, idElement, sXMLFile, sXSLFile, sStateFile
|
|||
}
|
||||
};
|
||||
if (sXMLFile.charAt(0) != '<') {
|
||||
loadXML(sXMLFile, idElement, sStateFile, true, displayMessage, loadXSL);
|
||||
loadXML(sXMLFile, idElement, sParms, true, displayMessage, loadXSL);
|
||||
} else {
|
||||
parseXML(sXMLFile, null, idElement, sStateFile, false, displayMessage, loadXSL);
|
||||
parseXML(sXMLFile, null, idElement, sParms, false, displayMessage, loadXSL);
|
||||
}
|
||||
} else {
|
||||
displayError("missing machine element: " + idElement);
|
||||
|
|
@ -467,18 +480,18 @@ function embedC1P(idElement, sXMLFile, sXSLFile)
|
|||
}
|
||||
|
||||
/**
|
||||
* embedPC(idElement, sXMLFile, sXSLFile, sStateFile)
|
||||
* embedPC(idElement, sXMLFile, sXSLFile, sParms)
|
||||
*
|
||||
* @param {string} idElement
|
||||
* @param {string} sXMLFile
|
||||
* @param {string} sXSLFile
|
||||
* @param {string} [sStateFile]
|
||||
* @param {string} [sParms]
|
||||
* @return {boolean} true if successful, false if error
|
||||
*/
|
||||
function embedPC(idElement, sXMLFile, sXSLFile, sStateFile)
|
||||
function embedPC(idElement, sXMLFile, sXSLFile, sParms)
|
||||
{
|
||||
if (fAsync) web.enablePageEvents(false);
|
||||
return embedMachine("PCjs", APPVERSION, idElement, sXMLFile, sXSLFile, sStateFile);
|
||||
return embedMachine("PCjs", APPVERSION, idElement, sXMLFile, sXSLFile, sParms);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -12,7 +12,9 @@ Browse our collection of PC-related magazines.
|
|||
[<img src="http://archive.pcjs.org/pubs/pc/magazines/msj/MSJ-1986-10/thumbs/MSJ-1986-10 1.jpeg" width="200" height="260" alt= "Microsoft Systems Journal"/>](msj/)
|
||||
[<img src="http://archive.pcjs.org/pubs/pc/magazines/pctj/PCTJ-1983-07/thumbs/PCTJ-1983-07 1.jpeg" width="200" height="260" alt= "PC Tech Journal"/>](pctj/)
|
||||
|
||||
We also have an assortment of selected articles:
|
||||
From [PC Tech Journal](/pubs/pc/magazines/pctj/), we also have all the [Microsoft Languages NewsLetters](/disks/pc/tools/microsoft/).
|
||||
|
||||
And we have an assortment of selected articles:
|
||||
|
||||
- [Exploring the EGA](http://archive.pcjs.org/pubs/pc/magazines/pcmag/PCMAG-1986-08/PCMAG-1986-08-Exploring_The_EGA.pdf) by Charles Petzold, PC Magazine, August 1986
|
||||
- [Software Sprites](http://archive.pcjs.org/pubs/pc/magazines/pctj/PCTJ-1986-08/PCTJ-1986-08-Software_Sprites.pdf) by Michael Abrash and Dan Illowsky, PC Tech Journal, August, 1986
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -156,7 +156,7 @@
|
|||
</xsl:if>
|
||||
<div class="{$APPCLASS}-container" style="{$border}{$style}">
|
||||
<xsl:if test="$class != '' and $component != 'machine'">
|
||||
<div class="{$APPCLASS}-{$class}-object" data-value="id:'{$id}',name:'{$name}'{$parms}"></div>
|
||||
<div class="{$APPCLASS}-{$class}-object" data-value="{{id:'{$id}',name:'{$name}'{$parms}}}"></div>
|
||||
</xsl:if>
|
||||
<xsl:if test="control">
|
||||
<div class="{$APPCLASS}-controls">
|
||||
|
|
@ -269,27 +269,27 @@
|
|||
</xsl:if>
|
||||
<xsl:choose>
|
||||
<xsl:when test="@type = 'button'">
|
||||
<button class="{$APPCLASS}-binding" style="{$border}{$width}{$height}{$fontsize}{$style}" data-value="{$type},{$binding}"><xsl:apply-templates/></button>
|
||||
<button class="{$APPCLASS}-binding" style="{$border}{$width}{$height}{$fontsize}{$style}" data-value="{{{$type},{$binding}}}"><xsl:apply-templates/></button>
|
||||
</xsl:when>
|
||||
<xsl:when test="@type = 'list'">
|
||||
<select class="{$APPCLASS}-binding" style="{$border}{$width}{$height}{$fontsize}{$style}" data-value="{$type},{$binding}">
|
||||
<select class="{$APPCLASS}-binding" style="{$border}{$width}{$height}{$fontsize}{$style}" data-value="{{{$type},{$binding}}}">
|
||||
<xsl:apply-templates select="item" mode="component"/>
|
||||
</select>
|
||||
</xsl:when>
|
||||
<xsl:when test="@type = 'text'">
|
||||
<input class="{$APPCLASS}-binding" type="text" style="{$border}{$width}{$height}{$style}" data-value="{$type},{$binding}" value="" autocapitalize="off" autocorrect="off"/>
|
||||
<input class="{$APPCLASS}-binding" type="text" style="{$border}{$width}{$height}{$style}" data-value="{{{$type},{$binding}}}" value="" autocapitalize="off" autocorrect="off"/>
|
||||
</xsl:when>
|
||||
<xsl:when test="@type = 'submit'">
|
||||
<input class="{$APPCLASS}-binding" type="submit" style="{$border}{$fontsize}{$style}" data-value="{$type},{$binding}" value="{.}"/>
|
||||
<input class="{$APPCLASS}-binding" type="submit" style="{$border}{$fontsize}{$style}" data-value="{{{$type},{$binding}}}" value="{.}"/>
|
||||
</xsl:when>
|
||||
<xsl:when test="@type = 'textarea'">
|
||||
<textarea class="{$APPCLASS}-binding" style="{$border}{$width}{$height}{$style}" data-value="{$type},{$binding}" readonly="readonly"></textarea>
|
||||
<textarea class="{$APPCLASS}-binding" style="{$border}{$width}{$height}{$style}" data-value="{{{$type},{$binding}}}" readonly="readonly"></textarea>
|
||||
</xsl:when>
|
||||
<xsl:when test="@type = 'heading'">
|
||||
<div><xsl:value-of select="."/></div>
|
||||
</xsl:when>
|
||||
<xsl:when test="@type = 'file'">
|
||||
<form class="{$APPCLASS}-binding" style="{$border}{$width}{$height}{$style}" data-value="{$type},{$binding}">
|
||||
<form class="{$APPCLASS}-binding" style="{$border}{$width}{$height}{$style}" data-value="{{{$type},{$binding}}}">
|
||||
<fieldset class="{$APPCLASS}-fieldset">
|
||||
<input type="file"/>
|
||||
<input type="submit" value="Mount" disabled="true"/>
|
||||
|
|
@ -303,7 +303,7 @@
|
|||
<div style="clear:both"></div><br/>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<div class="{$APPCLASS}-binding{$subclass}" style="{$border}{$width}{$height}{$style}" data-value="{$type},{$binding}"><xsl:apply-templates/></div>
|
||||
<div class="{$APPCLASS}-binding{$subclass}" style="{$border}{$width}{$height}{$style}" data-value="{{{$type},{$binding}}}"><xsl:apply-templates/></div>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
<xsl:if test="@label">
|
||||
|
|
|
|||
|
|
@ -68,7 +68,12 @@
|
|||
</xsl:with-param>
|
||||
<xsl:with-param name="component" select="'machine'"/>
|
||||
<xsl:with-param name="class"><xsl:value-of select="@class"/>js</xsl:with-param>
|
||||
<xsl:with-param name="parms"><xsl:if test="@parms">,<xsl:value-of select="@parms"/></xsl:if></xsl:with-param>
|
||||
<xsl:with-param name="parms">
|
||||
<xsl:choose>
|
||||
<xsl:when test="$machineState != ''">state:"<xsl:value-of select="$machineState"/>"</xsl:when>
|
||||
<xsl:otherwise><xsl:value-of select="@parms"/></xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:with-param>
|
||||
<xsl:with-param name="url"><xsl:value-of select="@url"/></xsl:with-param>
|
||||
</xsl:call-template>
|
||||
</div>
|
||||
|
|
@ -107,9 +112,9 @@
|
|||
<xsl:otherwise><xsl:value-of select="$component"/></xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:variable>
|
||||
<xsl:variable name="componentURL">
|
||||
<xsl:variable name="machineParms">
|
||||
<xsl:choose>
|
||||
<xsl:when test="$component = 'machine'">url:'<xsl:value-of select="$url"/>'</xsl:when>
|
||||
<xsl:when test="$component = 'machine'"><xsl:value-of select="$parms"/></xsl:when>
|
||||
<xsl:otherwise/>
|
||||
</xsl:choose>
|
||||
</xsl:variable>
|
||||
|
|
@ -191,7 +196,7 @@
|
|||
<xsl:variable name="componentClass">
|
||||
<xsl:value-of select="$APPCLASS"/><xsl:text>-</xsl:text><xsl:value-of select="$component"/><xsl:text> </xsl:text><xsl:value-of select="$APPCLASS"/><xsl:text>-component</xsl:text>
|
||||
</xsl:variable>
|
||||
<div id="{$id}" class="{$componentClass}" style="{$width}{$height}{$pos}{$left}{$top}{$padding}" data-value="{$componentURL}">
|
||||
<div id="{$id}" class="{$componentClass}" style="{$width}{$height}{$pos}{$left}{$top}{$padding}" data-value="{$machineParms}">
|
||||
<xsl:if test="$component = 'machine'">
|
||||
<xsl:apply-templates select="name" mode="machine"/>
|
||||
</xsl:if>
|
||||
|
|
@ -206,7 +211,7 @@
|
|||
<xsl:apply-templates select="menu" mode="component"/>
|
||||
</xsl:if>
|
||||
<xsl:if test="$class != '' and $component != 'machine'">
|
||||
<div class="{$APPCLASS}-{$class}-object" data-value="id:'{$id}',name:'{$name}'{$comment}{$parms}"> </div>
|
||||
<div class="{$APPCLASS}-{$class}-object" data-value="{{id:'{$id}',name:'{$name}'{$comment}{$parms}}}"> </div>
|
||||
</xsl:if>
|
||||
<xsl:if test="control">
|
||||
<div class="{$APPCLASS}-controls">
|
||||
|
|
@ -354,30 +359,30 @@
|
|||
</xsl:if>
|
||||
<xsl:choose>
|
||||
<xsl:when test="@type = 'canvas'">
|
||||
<canvas class="{$APPCLASS}-binding {$APPCLASS}-canvas" width="{@width}" height="{@height}" style="-webkit-user-select:none;{$border}{$fontsize}{$style}" data-value="{$type},{$binding}"><xsl:apply-templates/></canvas>
|
||||
<canvas class="{$APPCLASS}-binding {$APPCLASS}-canvas" width="{@width}" height="{@height}" style="-webkit-user-select:none;{$border}{$fontsize}{$style}" data-value="{{{$type},{$binding}}}"><xsl:apply-templates/></canvas>
|
||||
</xsl:when>
|
||||
<xsl:when test="@type = 'button'">
|
||||
<button class="{$APPCLASS}-binding" style="-webkit-user-select:none;{$border}{$width}{$height}{$fontsize}{$style}" data-value="{$type},{$binding}"><xsl:apply-templates/></button>
|
||||
<button class="{$APPCLASS}-binding" style="-webkit-user-select:none;{$border}{$width}{$height}{$fontsize}{$style}" data-value="{{{$type},{$binding}}}"><xsl:apply-templates/></button>
|
||||
</xsl:when>
|
||||
<xsl:when test="@type = 'list'">
|
||||
<select class="{$APPCLASS}-binding" style="{$border}{$width}{$height}{$fontsize}{$style}" data-value="{$type},{$binding}">
|
||||
<select class="{$APPCLASS}-binding" style="{$border}{$width}{$height}{$fontsize}{$style}" data-value="{{{$type},{$binding}}}">
|
||||
<xsl:apply-templates select="disk|app|manifest" mode="component"/>
|
||||
</select>
|
||||
</xsl:when>
|
||||
<xsl:when test="@type = 'text'">
|
||||
<input class="{$APPCLASS}-binding" type="text" style="{$border}{$width}{$height}{$style}" data-value="{$type},{$binding}" value="{.}" autocapitalize="off" autocorrect="off"/>
|
||||
<input class="{$APPCLASS}-binding" type="text" style="{$border}{$width}{$height}{$style}" data-value="{{{$type},{$binding}}}" value="{.}" autocapitalize="off" autocorrect="off"/>
|
||||
</xsl:when>
|
||||
<xsl:when test="@type = 'submit'">
|
||||
<input class="{$APPCLASS}-binding" type="submit" style="{$border}{$fontsize}{$style}" data-value="{$type},{$binding}" value="{.}"/>
|
||||
<input class="{$APPCLASS}-binding" type="submit" style="{$border}{$fontsize}{$style}" data-value="{{{$type},{$binding}}}" value="{.}"/>
|
||||
</xsl:when>
|
||||
<xsl:when test="@type = 'textarea'">
|
||||
<textarea class="{$APPCLASS}-binding" style="{$border}{$width}{$height}{$style}" data-value="{$type},{$binding}" readonly="readonly"> </textarea>
|
||||
<textarea class="{$APPCLASS}-binding" style="{$border}{$width}{$height}{$style}" data-value="{{{$type},{$binding}}}" readonly="readonly"> </textarea>
|
||||
</xsl:when>
|
||||
<xsl:when test="@type = 'heading'">
|
||||
<div><xsl:value-of select="."/></div>
|
||||
</xsl:when>
|
||||
<xsl:when test="@type = 'file'">
|
||||
<form class="{$APPCLASS}-binding" data-value="{$type},{$binding}">
|
||||
<form class="{$APPCLASS}-binding" data-value="{{{$type},{$binding}}}">
|
||||
<fieldset class="{$APPCLASS}-fieldset">
|
||||
<input type="file"/>
|
||||
<input type="submit" value="Mount" disabled="true"/>
|
||||
|
|
@ -385,7 +390,7 @@
|
|||
</form>
|
||||
</xsl:when>
|
||||
<xsl:when test="@type = 'led'">
|
||||
<div class="{$APPCLASS}-binding {$APPCLASS}-{@type}" data-value="{$type},{$binding}"><xsl:value-of select="."/></div>
|
||||
<div class="{$APPCLASS}-binding {$APPCLASS}-{@type}" data-value="{{{$type},{$binding}}}"><xsl:value-of select="."/></div>
|
||||
</xsl:when>
|
||||
<xsl:when test="@type = 'separator'">
|
||||
<hr/>
|
||||
|
|
@ -397,7 +402,7 @@
|
|||
<div style="clear:both"> </div>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<div class="{$APPCLASS}-binding{$subClass} {$APPCLASS}-{@type}" style="-webkit-user-select:none;{$border}{$width}{$height}{$fontsize}{$style}" data-value="{$type},{$binding}"><xsl:apply-templates/></div>
|
||||
<div class="{$APPCLASS}-binding{$subClass} {$APPCLASS}-{@type}" style="-webkit-user-select:none;{$border}{$width}{$height}{$fontsize}{$style}" data-value="{{{$type},{$binding}}}"><xsl:apply-templates/></div>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
<xsl:if test="@label">
|
||||
|
|
@ -423,7 +428,7 @@
|
|||
</xsl:if>
|
||||
</xsl:if>
|
||||
</xsl:variable>
|
||||
<option value="{@path}" data-value="{$desc}"><xsl:if test="name"><xsl:value-of select="name"/></xsl:if><xsl:if test="not(name)"><xsl:value-of select="."/></xsl:if></option>
|
||||
<option value="{@path}" data-value="{{{$desc}}}"><xsl:if test="name"><xsl:value-of select="name"/></xsl:if><xsl:if test="not(name)"><xsl:value-of select="."/></xsl:if></option>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="app[@ref]" mode="component">
|
||||
|
|
@ -446,7 +451,7 @@
|
|||
<xsl:variable name="files">
|
||||
<xsl:for-each select="file"><xsl:if test="position() = 1"><xsl:value-of select="$path"/></xsl:if><xsl:value-of select="@name"/><xsl:if test="position() != last()">;</xsl:if></xsl:for-each>
|
||||
</xsl:variable>
|
||||
<option value="{$files}" data-value="{$desc}"><xsl:value-of select="@name"/></option>
|
||||
<option value="{$files}" data-value="{{{$desc}}}"><xsl:value-of select="@name"/></option>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="manifest[@ref]" mode="component">
|
||||
|
|
@ -483,7 +488,7 @@
|
|||
</xsl:if>
|
||||
</xsl:variable>
|
||||
<xsl:if test="@href">
|
||||
<option value="{@href}" data-value="{$link}"><xsl:value-of select="$name"/></option>
|
||||
<option value="{@href}" data-value="{{{$link}}}"><xsl:value-of select="$name"/></option>
|
||||
</xsl:if>
|
||||
<xsl:if test="not(@href)">
|
||||
<xsl:variable name="dir">
|
||||
|
|
@ -492,7 +497,7 @@
|
|||
<xsl:variable name="files">
|
||||
<xsl:for-each select="file"><xsl:if test="position() = 1"><xsl:value-of select="$dir"/></xsl:if><xsl:value-of select="@dir"/><xsl:value-of select="."/><xsl:if test="position() != last()">;</xsl:if></xsl:for-each>
|
||||
</xsl:variable>
|
||||
<option value="{$files}" data-value="{$link}"><xsl:value-of select="$name"/></option>
|
||||
<option value="{$files}" data-value="{{{$link}}}"><xsl:value-of select="$name"/></option>
|
||||
</xsl:if>
|
||||
</xsl:if>
|
||||
</xsl:for-each>
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Loading…
Reference in a new issue