Merge branch 'master' into gh-pages

This commit is contained in:
Jeff Parsons 2017-06-24 10:39:51 -07:00
commit 9681038ed8
28 changed files with 125 additions and 45 deletions

View file

@ -36,16 +36,20 @@ Some pre-configured machines are shown below, ready to run BASIC, DOS, Windows,
![IBM PC running VisiCalc](/apps/pcx86/1981/visicalc/thumbnail.jpg "link:/apps/pcx86/1981/visicalc/:200:120")
![IBM PC running DONKEY.BAS](/apps/pcx86/1981/donkey/thumbnail.jpg "link:/apps/pcx86/1981/donkey/:200:120")
![IBM PC AT w/EGA, OS/2 1.0](/disks/pcx86/os2/ibm/1.0/thumbnail.jpg "link:/disks/pcx86/os2/ibm/1.0/:200:120")
![IBM PC XT w/EGA, Windows 1.0](/disks/pcx86/windows/1.00/thumbnail.jpg "link:/disks/pcx86/windows/1.00/:200:120")
![IBM PC XT w/CGA, Windows 1.01](/disks/pcx86/windows/1.01/cga/thumbnail.jpg "link:/disks/pcx86/windows/1.01/cga/:200:120")
![IBM PC XT w/EGA, Windows 1.01](/disks/pcx86/windows/1.01/thumbnail.jpg "link:/disks/pcx86/windows/1.01/:200:120")
![IBM PC AT w/EGA, OS/2 1.0](/disks/pcx86/os2/ibm/1.0/thumbnail.jpg "link:/disks/pcx86/os2/ibm/1.0/:200:120")
![COMPAQ DeskPro 386, Windows/386](/disks/pcx86/windows/2.0x/thumbnail.jpg "link:/disks/pcx86/windows/2.0x/:200:120")
![IBM PC AT w/EGA, Windows 3.00](/disks/pcx86/windows/3.00/thumbnail.jpg "link:/disks/pcx86/windows/3.00/:200:120")
![IBM PC AT w/VGA, Windows 3.10](/disks/pcx86/windows/3.10/thumbnail.jpg "link:/disks/pcx86/windows/3.10/:200:120")
![IBM PC AT w/EGA, Windows 3.0](/disks/pcx86/windows/3.00/thumbnail.jpg "link:/disks/pcx86/windows/3.00/:200:120")
![IBM PC AT w/VGA, Windows 3.1](/disks/pcx86/windows/3.10/thumbnail.jpg "link:/disks/pcx86/windows/3.10/:200:120")
![COMPAQ DeskPro 386, Windows 95](/disks/pcx86/windows/win95/4.00.950/thumbnail.jpg "link:/disks/pcx86/windows/win95/4.00.950/:200:120")
![IBM PC w/MDA, CP/M-86](/disks/pcx86/cpm/1.1b/thumbnail.jpg "link:/disks/pcx86/cpm/1.1b/:200:120")
![IBM PC w/MDA, Microsoft Adventure](/disks/pcx86/games/microsoft/adventure/thumbnail.jpg "link:/disks/pcx86/games/microsoft/adventure/:200:120")
![IBM PC w/CGA, Zork I](/disks/pcx86/games/infocom/zork1/thumbnail.jpg "link:/disks/pcx86/games/infocom/zork1/:200:120")
![Microsoft Adventure (1981)](/disks/pcx86/games/microsoft/adventure/thumbnail.jpg "link:/disks/pcx86/games/microsoft/adventure/:200:120")
![Executive Suite (1982)](/apps/pcx86/1982/esuite/thumbnail.jpg "link:/apps/pcx86/1982/esuite/:200:120")
![Zork I (1982)](/disks/pcx86/games/infocom/zork1/thumbnail.jpg "link:/disks/pcx86/games/infocom/zork1/:200:120")
![Adventures in Math (1983)](/apps/pcx86/1983/adventmath/thumbnail.jpg "link:/apps/pcx86/1983/adventmath/:200:120")
![Rogue (1985)](/apps/pcx86/1985/rogue/thumbnail.jpg "link:/apps/pcx86/1985/rogue/:200:120")
There are many more [PCx86 Demos](/devices/pcx86/machine/#ready-to-run-app-demos), including an
[IBM PC with Dual Displays](/devices/pcx86/machine/5150/dual/64kb/) demonstrating early multi-monitor support,

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

View file

@ -7,7 +7,7 @@
<rom id="romBASIC" addr="0xf6000" size="0x8000" file="/devices/pcx86/rom/5150/basic/BASIC100.json"/>
<rom id="romBIOS" addr="0xfe000" size="0x2000" file="/devices/pcx86/rom/5150/1981-04-24/PCBIOS-REV1.json"/>
<video ref="/devices/pcx86/video/ibm/cga/ibm-cga.xml"/>
<fdc ref="/disks/pcx86/compiled/samples.xml"/>
<fdc ref="/disks/pcx86/compiled/library.xml"/>
<cpu id="cpu8088" model="8088" autostart="true"/>
<keyboard ref="/devices/pcx86/keyboard/us83-buttons-minimal.xml"/>
<debugger id="debugger"/>

View file

@ -7,7 +7,7 @@
<rom id="romBASIC" addr="0xf6000" size="0x8000" file="/devices/pcx86/rom/5150/basic/BASIC100.json"/>
<rom id="romBIOS" addr="0xfe000" size="0x2000" file="/devices/pcx86/rom/5150/1981-04-24/PCBIOS-REV1.json"/>
<video ref="/devices/pcx86/video/ibm/cga/ibm-cga.xml"/>
<fdc ref="/disks/pcx86/compiled/samples.xml"/>
<fdc ref="/disks/pcx86/compiled/library.xml"/>
<cpu id="cpu8088" model="8088" autoStart="true" pos="left" padLeft="8px" padBottom="8px">
<control type="button" binding="run">Run</control>
<control type="button" binding="reset">Reset</control>

View file

@ -8,7 +8,7 @@
<rom id="romBASIC" addr="0xf6000" size="0x8000" file="/devices/pcx86/rom/5150/basic/BASIC100.json"/>
<rom id="romBIOS" addr="0xfe000" size="0x2000" file="/devices/pcx86/rom/5150/1981-04-24/PCBIOS-REV1.json"/>
<video ref="/devices/pcx86/video/ibm/cga/ibm-cga.xml"/>
<fdc ref="/disks/pcx86/compiled/samples.xml"/>
<fdc ref="/disks/pcx86/compiled/library.xml"/>
<keyboard ref="/devices/pcx86/keyboard/us83-softkeys.xml"/>
<debugger id="debugger"/>
<panel ref="/devices/pcx86/panel/wide.xml"/>

View file

@ -0,0 +1,32 @@
---
layout: page
title: IBM PC (Model 5150, 64Kb) with Dual Displays
permalink: /devices/pcx86/machine/5150/dual/64kb/
machines:
- id: ibm5150
type: pcx86
autoMount:
A:
name: PC-DOS 3.00 (Disk 1)
---
IBM PC (Model 5150, 64Kb) with Dual Displays
--------------------------------------------
The original IBM PC supported multiple display adapters. This page demonstrates a PCjs hardware configuration with
both a Monochrome Display connected to an MDA (Monochrome Display Adapter) and a Color Display connected to a CGA
(Color Display Adapter).
At any given time, only one display was considered "active", and the initial active display was determined by switches
on the motherboard. After booting DOS, you could use **MODE** commands to change the active display:
- *mode co40* selects the Color Display and sets it to 40-column mode
- *mode co80* selects the Color Display and sets it to 80-column mode
- *mode mono* selects the Monochrome Display, which supports only 80-column mode
The initial active display for the machine below is the Monochrome Display. Third-party software with dual-display
support could write to both displays simultaneously, but most text-based applications only wrote to the active display.
Programs that used color graphics, on the other hand, might use the Color Display whether or not it was currently
active.
{% include machine.html id="ibm5150" %}

View file

@ -1,11 +0,0 @@
---
layout: page
title: IBM PC (Model 5150, 64Kb) with Dual Displays
permalink: /devices/pcx86/machine/5150/dual/64kb/
machines:
- id: ibm5150
type: pcx86
resume: 1
---
{% include machine.html id="ibm5150" %}

View file

@ -8,7 +8,7 @@
<rom id="romBIOS" addr="0xfe000" size="0x2000" file="/devices/pcx86/rom/5150/1981-04-24/PCBIOS-REV1.json"/>
<video ref="/devices/pcx86/video/ibm/mda/ibm-mda-dual.xml"/>
<video ref="/devices/pcx86/video/ibm/cga/ibm-cga-dual.xml"/>
<fdc ref="/disks/pcx86/compiled/samples.xml"/>
<fdc ref="/disks/pcx86/compiled/library.xml"/>
<cpu id="cpu8088" model="8088" autostart="true" pos="left" padLeft="8px" padBottom="8px">
<control type="button" binding="run">Run</control>
<control type="button" binding="reset">Reset</control>

View file

@ -7,7 +7,7 @@
<rom id="romBASIC" addr="0xf6000" size="0x8000" file="/devices/pcx86/rom/5150/basic/BASIC100.json"/>
<rom id="romBIOS" addr="0xfe000" size="0x2000" file="/devices/pcx86/rom/5150/1981-04-24/PCBIOS-REV1.json"/>
<video ref="/devices/pcx86/video/ibm/mda/ibm-mda.xml"/>
<fdc ref="/disks/pcx86/compiled/samples.xml"/>
<fdc ref="/disks/pcx86/compiled/library.xml"/>
<cpu id="cpu8088" model="8088" autostart="true" pos="left" padLeft="8px" padBottom="8px">
<control type="button" binding="run">Run</control>
<control type="button" binding="reset">Reset</control>

View file

@ -8,7 +8,7 @@
<rom id="romBASIC" addr="0xf6000" size="0x8000" file="/devices/pcx86/rom/5150/basic/BASIC100.json"/>
<rom id="romBIOS" addr="0xfe000" size="0x2000" file="/devices/pcx86/rom/5150/1981-04-24/PCBIOS-REV1.json"/>
<video ref="/devices/pcx86/video/ibm/mda/ibm-mda.xml"/>
<fdc ref="/disks/pcx86/compiled/samples.xml"/>
<fdc ref="/disks/pcx86/compiled/library.xml"/>
<keyboard ref="/devices/pcx86/keyboard/us83-softkeys.xml"/>
<debugger id="debugger"/>
<panel ref="/devices/pcx86/panel/wide.xml"/>

View file

@ -8,7 +8,7 @@
<rom id="romBASIC" addr="0xf6000" size="0x8000" file="/devices/pcx86/rom/5160/basic/BASIC110.json"/>
<rom id="romBIOS" addr="0xfe000" size="0x2000" file="/devices/pcx86/rom/5160/1982-11-08/XTBIOS-REV1.json"/>
<video ref="/devices/pcx86/video/ibm/cga/ibm-cga.xml"/>
<fdc ref="/disks/pcx86/compiled/samples.xml"/>
<fdc ref="/disks/pcx86/compiled/library.xml"/>
<cpu id="cpu8088" model="8088" autostart="true" pos="left" padLeft="8px">
<control type="button" binding="run">Run</control>
<control type="button" binding="reset">Reset</control>

View file

@ -8,7 +8,7 @@
<rom id="romBASIC" addr="0xf6000" size="0x8000" file="/devices/pcx86/rom/5160/basic/BASIC110.json"/>
<rom id="romBIOS" addr="0xfe000" size="0x2000" file="/devices/pcx86/rom/5160/1982-11-08/XTBIOS-REV1.json"/>
<video ref="/devices/pcx86/video/ibm/cga/ibm-cga-lock.xml"/>
<fdc ref="/disks/pcx86/compiled/samples.xml"/>
<fdc ref="/disks/pcx86/compiled/library.xml"/>
<cpu id="cpu8088" model="8088" autoStart="true"/>
<keyboard ref="/devices/pcx86/keyboard/us83-buttons-functions.xml"/>
<debugger id="debugger"/>

View file

@ -8,7 +8,7 @@
<rom id="romBASIC" addr="0xf6000" size="0x8000" file="/devices/pcx86/rom/5160/basic/BASIC110.json"/>
<rom id="romBIOS" addr="0xfe000" size="0x2000" file="/devices/pcx86/rom/5160/1982-11-08/XTBIOS-REV1.json"/>
<video ref="/devices/pcx86/video/ibm/cga/ibm-cga-lock.xml"/>
<fdc ref="/disks/pcx86/compiled/samples.xml"/>
<fdc ref="/disks/pcx86/compiled/library.xml"/>
<cpu id="cpu8088" model="8088" autoStart="true" pos="left" padLeft="8px" padBottom="8px">
<control type="button" binding="run">Run</control>
<control type="button" binding="reset">Reset</control>

View file

@ -9,7 +9,7 @@
<rom id="romBASIC" addr="0xf6000" size="0x8000" file="/devices/pcx86/rom/5160/basic/BASIC110.json"/>
<rom id="romBIOS" addr="0xfe000" size="0x2000" file="/devices/pcx86/rom/5160/1982-11-08/XTBIOS-REV1.json"/>
<video ref="/devices/pcx86/video/ibm/cga/ibm-cga-lock.xml"/>
<fdc ref="/disks/pcx86/compiled/samples.xml"/>
<fdc ref="/disks/pcx86/compiled/library.xml"/>
<keyboard ref="/devices/pcx86/keyboard/us83-softkeys.xml"/>
<debugger id="debugger"/>
<panel ref="/devices/pcx86/panel/default.xml"/>

View file

@ -12,7 +12,7 @@
<keyboard ref="/devices/pcx86/keyboard/us83-softkeys.xml"/>
<debugger id="debugger"/>
<panel ref="/devices/pcx86/panel/default.xml"/>
<fdc ref="/disks/pcx86/compiled/samples.xml" width="280px"/>
<fdc ref="/disks/pcx86/compiled/library.xml" width="360px"/>
<chipset id="chipset" model="5160" sw1="01110001" pos="left" padLeft="8px" padBottom="8px">
<control type="switches" label="SW1" binding="sw1" left="0px"/>
<control type="description" binding="swdesc" left="0px"/>

View file

@ -5,8 +5,9 @@
<version>1.00</version>
<type>Game</type>
<category>Text Adventure</category>
<author>Microsoft</author>
<releaseDate/>
<publisher>Microsoft</publisher>
<releaseDate>1981</releaseDate>
<author>Gordon Letwin</author>
<machine href="/disks/pcx86/games/microsoft/adventure/machine.xml"/>
<disk id="disk01" href="/disks/pcx86/games/microsoft/adventure/ADVENTURE-1981.json" md5="88eed6b1cb7bafa1ab957fa9c6fc7105" md5json="c0b400918a442cd3a11315092a144c15">
<name>Microsoft Adventure</name>

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

View file

@ -22,6 +22,8 @@ Microsoft Windows 1.01, the first public version of Windows, was released on Nov
It is shown here running on an IBM PC XT (Model 5160) with an EGA Display. You can also run
[Windows 1.01 with a CGA Display](cga/).
A demo of an earlier pre-release version, [Windows 1.0 ("Premiere Edition")](../1.00/), is also available.
{% include machine.html id="ibm5160-ega-win101" %}
Directory listings of the five 360Kb distribution diskettes are provided [below](#directory-listings).

View file

@ -670,7 +670,8 @@ function Rv(a,b){var c=0,d,e=!0;b||(b=[0,0,Yv,Array(9),0,0,0,[]]);a.Va=b[c++];c+
p[v++];g.cb=null;g.sa||(g.ue="");var E=p[v++];102==E&&(E=!1);"boolean"==typeof E?(u=p[v++],p=p[v],E?(v=k.A[m],Wv(k,m,!0,!0),v.Oe=!0,m=new Yu(k,v,"preload"),k.nj(v,m,u,p,!0)):aw(k,m,u,p,!0)?g.sa&&p&&bw(k,u,p,g.sa):Lb(k,!1)):void 0!==E&&g.sa&&0>g.sa.restore(E)&&(h=!1);h&&g.sa&&void 0!==g.Ta&&(g.cb=g.sa.seek(g.Gb,g.Za,g.mb));h||(e=!1)}a.G=b[c++]||0;a.Zb=b[c]||cw;return e}
function Xv(a){var b=0,c=[];c[b++]=a.Va;c[b++]=0;c[b++]=a.fa;c[b++]=a.F;c[b++]=a.D;c[b++]=a.B;c[b++]=a.I;for(var d=b++,e=0,f=[],g=0;g<a.A.length;g++){var h=e++,k=a.A[g],m=0,p=[];p[m++]=k.rb;p[m++]=[k.name,k.qb,k.kb,k.$a,k.Na,k.Pe,k.wg,k.Bf,k.Cf];p[m++]=k.Za;p[m++]=k.Td+100;p[m++]=k.Gb;p[m++]=k.mb;p[m++]=k.Ud;p[m++]=k.ub;p[m++]=k.Ta;p[m++]=k.Oe;p[m++]=k.al;p[m]=k.ue;f[h]=p}c[d]=f;d=b++;for(e=0;e<a.A.length;e++)f=a.A[e],f.sa&&dw(a,f.ue,f.sa);c[d]=a.C;c[b++]=a.G;c[b]=a.Zb;return c}
l.jj=function(a){var b;a=this.A[a];if(void 0!==a){b={};for(var c in a)b[c]=a[c]}return b};l.bl=function(a,b,c){if(a.sa){var d=a.sa.info(),e=d[2],f=d[1]*e;if(b+c<=d[0]*f)return a.Gb=Math.floor(b/f),b%=f,a.Za=Math.floor(b/e),a.mb=b%e+1,a.ub=c*d[3],a.rb=ew,!0}return!1};
function Vv(a,b){b||(a.K=0);for(var c in a.L){var d=a.L[c],e=d.path||"";if(e){var f=c.charCodeAt(0)-65;if(0<=f&&f<a.A.length){if(!(d=d.name))a:{if((d=a.na.listDisks)&&d.options)for(var g=0;g<d.options.length;g++){var h=d.options[g];if(h.value==e){d=h.text;break a}}d=ta(e,!0)}!aw(a,f,d||"Unknown",e,!0)&&b&&Lb(a,!1)}else a.Da("Incorrect auto-mount settings for drive "+c+" ("+JSON.stringify(d)+")")}}return!!a.K}
function Vv(a,b){b||(a.K=0);for(var c in a.L){var d=a.L[c],e;if(!(e=d.path))a:{if(e=d.name){var f=a.na.listDisks;if(f&&f.options)for(var g=0;g<f.options.length;g++){var h=f.options[g];if(h.text==e){e=h.value;break a}}}e=""}if(e)if(f=c.charCodeAt(0)-65,0<=f&&f<a.A.length){if(!(d=d.name))a:{if((d=a.na.listDisks)&&d.options)for(g=0;g<d.options.length;g++)if(h=d.options[g],h.value==e){d=h.text;break a}d=ta(e,!0)}!aw(a,f,d||"Unknown",e,!0)&&b&&Lb(a,!1)}else a.Da("Incorrect auto-mount settings for drive "+
c+" ("+JSON.stringify(d)+")")}return!!a.K}
function Qv(a,b,c,d){var e,f=a.na.listDrives;if(f&&!isNaN(e=oa(f.value,10))&&0<=e&&e<a.A.length)if(c)if("?"==c)a.Da('Use "Choose File" and "Mount" to select and load a local disk.');else{if("??"==c){c=window.prompt("Enter the URL of a remote disk image.","")||"";if(!c)return;b=ta(c)}for(;0>aw(a,e,b,c,!1,d)&&window.confirm("Click OK to reload the original disk.\n(WARNING: All disk changes will be discarded)");){var f=a,g=c,h;for(h=0;h<f.C.length;h++)if(f.C[h][1]==g){f.C.splice(h,1);break}Wv(a,e,!1,
!0)}}else Wv(a,e);else a.Da("Unable to load the selected drive")}function aw(a,b,c,d,e,f){var g=a.A[b];if(d&&(d=d.replace("/disks/pc/","/disks/pcx86/"),g.ue.toLowerCase()!=d.toLowerCase())){Wv(a,b,e,!0);if(g.Me)return a.Da("Drive "+b+" busy"),0;g.Me=!0;e&&(g.le=!0,a.K++,t(a)&&Ob(a,"loading diskette '"+c+"'"));g.Oe=!!f;return(new Yu(a,g,"preload")).load(c,d,f,a.nj)?1:0}return-1}
l.nj=function(a,b,c,d,e){var f;a.Me=!1;b&&(f=b.info(),b&&f[0]>a.qb||f[1]>a.kb)&&(this.Da('Diskette "'+c+'" too large for drive '+String.fromCharCode(65+a.Va)),b=null);b?(a.sa=b,a.al=c,a.ue=d,bw(this,c,d,b),f=b.info(),this.G|=fw,this.Da('Mounted diskette "'+c+'" in drive '+String.fromCharCode(65+a.Va),a.le||e),a.wg=f[0],a.Bf=f[1],a.Cf=f[2],this.pa&&this.pa.nd()):a.Oe=!1;a.le&&(a.le=!1,--this.K||Lb(this));Pv(this,a.Va)};

View file

@ -616,7 +616,8 @@ function Cs(a,b){var c=0,d,e=!0;b||(b=[0,0,Js,Array(9),0,0,0,[]]);a.La=b[c++];c+
80;g.Za=9;break;case 1200:g.fb=80;g.Za=15;break;case 1440:g.fb=80,g.Za=18}}var l=a,m=d,q=f[d],y=0;h=!0;g.La=m;g.ke=g.me=!1;q||(q=[Ks,!0,0,2,0]);"boolean"==typeof q[1]&&(q[1]=[Ls,g.fb||40,g.gb||q[3],g.Za||9,g.lb||512,q[1],g.Nf,g.Re,g.Se]);g.hb=q[y++];var w=q[y++];g.name=w[0];g.fb=w[1];g.gb=w[2];g.Za=w[3];g.lb=w[4];g.ne=w[5];(g.Nf=w[6])?(g.Re=w[7],g.Se=w[8]):(g.Nf=g.fb,g.Re=g.gb,g.Se=g.Za);g.Sa=q[y++];g.sd=q[y++];g.ub=q[y++];g.sd=100<=g.sd?g.sd-100:g.sd-g.ub;g.kb=q[y++];g.td=q[y++];g.tb=q[y++];g.Pa=
q[y++];g.Ra=null;g.sa||(g.Sd="");var z=q[y++];102==z&&(z=!1);"boolean"==typeof z?(w=q[y++],q=q[y],z?(y=l.A[m],Hs(l,m,!0,!0),y.me=!0,m=new fs(l,y,"preload"),l.li(y,m,w,q,!0)):Ms(l,m,w,q,!0)?g.sa&&q&&Ns(l,w,q,g.sa):pb(l,!1)):void 0!==z&&g.sa&&0>g.sa.restore(z)&&(h=!1);h&&g.sa&&void 0!==g.Pa&&(g.Ra=g.sa.seek(g.ub,g.Sa,g.kb));h||(e=!1)}a.H=b[c++]||0;a.F=b[c]||Os;return e}
function Is(a){var b=0,c=[];c[b++]=a.La;c[b++]=0;c[b++]=a.Y;c[b++]=a.G;c[b++]=a.D;c[b++]=a.C;c[b++]=a.I;for(var d=b++,e=0,f=[],g=0;g<a.A.length;g++){var h=e++,l=a.A[g],m=0,q=[];q[m++]=l.hb;q[m++]=[l.name,l.fb,l.gb,l.Za,l.lb,l.ne,l.Nf,l.Re,l.Se];q[m++]=l.Sa;q[m++]=l.sd+100;q[m++]=l.ub;q[m++]=l.kb;q[m++]=l.td;q[m++]=l.tb;q[m++]=l.Pa;q[m++]=l.me;q[m++]=l.Sj;q[m]=l.Sd;f[h]=q}c[d]=f;d=b++;for(e=0;e<a.A.length;e++)f=a.A[e],f.sa&&Ps(a,f.Sd,f.sa);c[d]=a.B;c[b++]=a.H;c[b]=a.F;return c}
function Gs(a,b){b||(a.J=0);for(var c in a.L){var d=a.L[c],e=d.path||"";if(e){var f=c.charCodeAt(0)-65;if(0<=f&&f<a.A.length){if(!(d=d.name))a:{if((d=a.ia.listDisks)&&d.options)for(var g=0;g<d.options.length;g++){var h=d.options[g];if(h.value==e){d=h.text;break a}}d=pa(e,!0)}!Ms(a,f,d||"Unknown",e,!0)&&b&&pb(a,!1)}else a.wa("Incorrect auto-mount settings for drive "+c+" ("+JSON.stringify(d)+")")}}return!!a.J}
function Gs(a,b){b||(a.J=0);for(var c in a.L){var d=a.L[c],e;if(!(e=d.path))a:{if(e=d.name){var f=a.ia.listDisks;if(f&&f.options)for(var g=0;g<f.options.length;g++){var h=f.options[g];if(h.text==e){e=h.value;break a}}}e=""}if(e)if(f=c.charCodeAt(0)-65,0<=f&&f<a.A.length){if(!(d=d.name))a:{if((d=a.ia.listDisks)&&d.options)for(g=0;g<d.options.length;g++)if(h=d.options[g],h.value==e){d=h.text;break a}d=pa(e,!0)}!Ms(a,f,d||"Unknown",e,!0)&&b&&pb(a,!1)}else a.wa("Incorrect auto-mount settings for drive "+
c+" ("+JSON.stringify(d)+")")}return!!a.J}
function Bs(a,b,c,d){var e,f=a.ia.listDrives;if(f&&!isNaN(e=na(f.value,10))&&0<=e&&e<a.A.length)if(c)if("?"==c)a.wa('Use "Choose File" and "Mount" to select and load a local disk.');else{if("??"==c){c=window.prompt("Enter the URL of a remote disk image.","")||"";if(!c)return;b=pa(c)}for(;0>Ms(a,e,b,c,!1,d)&&window.confirm("Click OK to reload the original disk.\n(WARNING: All disk changes will be discarded)");){var f=a,g=c,h;for(h=0;h<f.B.length;h++)if(f.B[h][1]==g){f.B.splice(h,1);break}Hs(a,e,!1,
!0)}}else Hs(a,e);else a.wa("Unable to load the selected drive")}function Ms(a,b,c,d,e,f){var g=a.A[b];if(d&&(d=d.replace("/disks/pc/","/disks/pcx86/"),g.Sd.toLowerCase()!=d.toLowerCase())){Hs(a,b,e,!0);if(g.ke)return a.wa("Drive "+b+" busy"),0;g.ke=!0;e&&(g.Gd=!0,a.J++);g.me=!!f;return(new fs(a,g,"preload")).load(c,d,f,a.li)?1:0}return-1}
k.li=function(a,b,c,d,e){var f;a.ke=!1;b&&(f=b.info(),b&&f[0]>a.fb||f[1]>a.gb)&&(this.wa('Diskette "'+c+'" too large for drive '+String.fromCharCode(65+a.La)),b=null);b?(a.sa=b,a.Sj=c,a.Sd=d,Ns(this,c,d,b),f=b.info(),this.H|=Qs,this.wa('Mounted diskette "'+c+'" in drive '+String.fromCharCode(65+a.La),a.Gd||e),a.Nf=f[0],a.Re=f[1],a.Se=f[2],this.oa&&bd(this.oa)):a.me=!1;a.Gd&&(a.Gd=!1,--this.J||pb(this));As(this,a.La)};

View file

@ -1084,7 +1084,7 @@ class FDC extends Component {
if (!fRemount) this.cAutoMount = 0;
for (var sDrive in this.configMount) {
var configDrive = this.configMount[sDrive];
var sDiskettePath = configDrive['path'] || "";
var sDiskettePath = configDrive['path'] || this.findDisketteByName(configDrive['name']);
if (sDiskettePath) {
/*
* WARNING: This conversion of drive letter to drive number, starting with A:, is very simplistic
@ -1092,7 +1092,7 @@ class FDC extends Component {
*/
var iDrive = sDrive.charCodeAt(0) - 0x41;
if (iDrive >= 0 && iDrive < this.aDrives.length) {
var sDisketteName = configDrive['name'] || this.findDiskette(sDiskettePath) || "Unknown";
var sDisketteName = configDrive['name'] || this.findDisketteByPath(sDiskettePath) || "Unknown";
if (!this.loadDrive(iDrive, sDisketteName, sDiskettePath, true) && fRemount) {
this.setReady(false);
}
@ -1361,7 +1361,7 @@ class FDC extends Component {
}
/**
* findDiskette(sPath)
* findDisketteByPath(sPath)
*
* This is used to deal with mount requests (eg, autoMount) that supply a path without a name;
* if we can find the path in the "listDisks" control, then we return the associated disk name.
@ -1370,7 +1370,7 @@ class FDC extends Component {
* @param {string} sPath
* @return {string|null}
*/
findDiskette(sPath)
findDisketteByPath(sPath)
{
var controlDisks = this.bindings["listDisks"];
if (controlDisks && controlDisks.options) {
@ -1382,6 +1382,30 @@ class FDC extends Component {
return Str.getBaseName(sPath, true);
}
/**
* findDisketteByName(sName)
*
* This is used to deal with mount requests (eg, autoMount) that supply a name without a path;
* if we can find the name in the "listDisks" control, then we return the associated disk path.
*
* @this {FDC}
* @param {string|undefined} sName
* @return {string}
*/
findDisketteByName(sName)
{
if (sName) {
var controlDisks = this.bindings["listDisks"];
if (controlDisks && controlDisks.options) {
for (var i = 0; i < controlDisks.options.length; i++) {
var control = controlDisks.options[i];
if (control.text == sName) return control.value;
}
}
}
return "";
}
/**
* displayDiskette(iDrive, fUpdateDrive)
*

View file

@ -670,7 +670,8 @@ function Rv(a,b){var c=0,d,e=!0;b||(b=[0,0,Yv,Array(9),0,0,0,[]]);a.Va=b[c++];c+
p[v++];g.cb=null;g.sa||(g.ue="");var E=p[v++];102==E&&(E=!1);"boolean"==typeof E?(u=p[v++],p=p[v],E?(v=k.A[m],Wv(k,m,!0,!0),v.Oe=!0,m=new Yu(k,v,"preload"),k.nj(v,m,u,p,!0)):aw(k,m,u,p,!0)?g.sa&&p&&bw(k,u,p,g.sa):Lb(k,!1)):void 0!==E&&g.sa&&0>g.sa.restore(E)&&(h=!1);h&&g.sa&&void 0!==g.Ta&&(g.cb=g.sa.seek(g.Gb,g.Za,g.mb));h||(e=!1)}a.G=b[c++]||0;a.Zb=b[c]||cw;return e}
function Xv(a){var b=0,c=[];c[b++]=a.Va;c[b++]=0;c[b++]=a.fa;c[b++]=a.F;c[b++]=a.D;c[b++]=a.B;c[b++]=a.I;for(var d=b++,e=0,f=[],g=0;g<a.A.length;g++){var h=e++,k=a.A[g],m=0,p=[];p[m++]=k.rb;p[m++]=[k.name,k.qb,k.kb,k.$a,k.Na,k.Pe,k.wg,k.Bf,k.Cf];p[m++]=k.Za;p[m++]=k.Td+100;p[m++]=k.Gb;p[m++]=k.mb;p[m++]=k.Ud;p[m++]=k.ub;p[m++]=k.Ta;p[m++]=k.Oe;p[m++]=k.al;p[m]=k.ue;f[h]=p}c[d]=f;d=b++;for(e=0;e<a.A.length;e++)f=a.A[e],f.sa&&dw(a,f.ue,f.sa);c[d]=a.C;c[b++]=a.G;c[b]=a.Zb;return c}
l.jj=function(a){var b;a=this.A[a];if(void 0!==a){b={};for(var c in a)b[c]=a[c]}return b};l.bl=function(a,b,c){if(a.sa){var d=a.sa.info(),e=d[2],f=d[1]*e;if(b+c<=d[0]*f)return a.Gb=Math.floor(b/f),b%=f,a.Za=Math.floor(b/e),a.mb=b%e+1,a.ub=c*d[3],a.rb=ew,!0}return!1};
function Vv(a,b){b||(a.K=0);for(var c in a.L){var d=a.L[c],e=d.path||"";if(e){var f=c.charCodeAt(0)-65;if(0<=f&&f<a.A.length){if(!(d=d.name))a:{if((d=a.na.listDisks)&&d.options)for(var g=0;g<d.options.length;g++){var h=d.options[g];if(h.value==e){d=h.text;break a}}d=ta(e,!0)}!aw(a,f,d||"Unknown",e,!0)&&b&&Lb(a,!1)}else a.Da("Incorrect auto-mount settings for drive "+c+" ("+JSON.stringify(d)+")")}}return!!a.K}
function Vv(a,b){b||(a.K=0);for(var c in a.L){var d=a.L[c],e;if(!(e=d.path))a:{if(e=d.name){var f=a.na.listDisks;if(f&&f.options)for(var g=0;g<f.options.length;g++){var h=f.options[g];if(h.text==e){e=h.value;break a}}}e=""}if(e)if(f=c.charCodeAt(0)-65,0<=f&&f<a.A.length){if(!(d=d.name))a:{if((d=a.na.listDisks)&&d.options)for(g=0;g<d.options.length;g++)if(h=d.options[g],h.value==e){d=h.text;break a}d=ta(e,!0)}!aw(a,f,d||"Unknown",e,!0)&&b&&Lb(a,!1)}else a.Da("Incorrect auto-mount settings for drive "+
c+" ("+JSON.stringify(d)+")")}return!!a.K}
function Qv(a,b,c,d){var e,f=a.na.listDrives;if(f&&!isNaN(e=oa(f.value,10))&&0<=e&&e<a.A.length)if(c)if("?"==c)a.Da('Use "Choose File" and "Mount" to select and load a local disk.');else{if("??"==c){c=window.prompt("Enter the URL of a remote disk image.","")||"";if(!c)return;b=ta(c)}for(;0>aw(a,e,b,c,!1,d)&&window.confirm("Click OK to reload the original disk.\n(WARNING: All disk changes will be discarded)");){var f=a,g=c,h;for(h=0;h<f.C.length;h++)if(f.C[h][1]==g){f.C.splice(h,1);break}Wv(a,e,!1,
!0)}}else Wv(a,e);else a.Da("Unable to load the selected drive")}function aw(a,b,c,d,e,f){var g=a.A[b];if(d&&(d=d.replace("/disks/pc/","/disks/pcx86/"),g.ue.toLowerCase()!=d.toLowerCase())){Wv(a,b,e,!0);if(g.Me)return a.Da("Drive "+b+" busy"),0;g.Me=!0;e&&(g.le=!0,a.K++,t(a)&&Ob(a,"loading diskette '"+c+"'"));g.Oe=!!f;return(new Yu(a,g,"preload")).load(c,d,f,a.nj)?1:0}return-1}
l.nj=function(a,b,c,d,e){var f;a.Me=!1;b&&(f=b.info(),b&&f[0]>a.qb||f[1]>a.kb)&&(this.Da('Diskette "'+c+'" too large for drive '+String.fromCharCode(65+a.Va)),b=null);b?(a.sa=b,a.al=c,a.ue=d,bw(this,c,d,b),f=b.info(),this.G|=fw,this.Da('Mounted diskette "'+c+'" in drive '+String.fromCharCode(65+a.Va),a.le||e),a.wg=f[0],a.Bf=f[1],a.Cf=f[2],this.pa&&this.pa.nd()):a.Oe=!1;a.le&&(a.le=!1,--this.K||Lb(this));Pv(this,a.Va)};

File diff suppressed because one or more lines are too long

View file

@ -60004,7 +60004,7 @@ class FDC extends Component {
if (!fRemount) this.cAutoMount = 0;
for (var sDrive in this.configMount) {
var configDrive = this.configMount[sDrive];
var sDiskettePath = configDrive['path'] || "";
var sDiskettePath = configDrive['path'] || this.findDisketteByName(configDrive['name']);
if (sDiskettePath) {
/*
* WARNING: This conversion of drive letter to drive number, starting with A:, is very simplistic
@ -60012,7 +60012,7 @@ class FDC extends Component {
*/
var iDrive = sDrive.charCodeAt(0) - 0x41;
if (iDrive >= 0 && iDrive < this.aDrives.length) {
var sDisketteName = configDrive['name'] || this.findDiskette(sDiskettePath) || "Unknown";
var sDisketteName = configDrive['name'] || this.findDisketteByPath(sDiskettePath) || "Unknown";
if (!this.loadDrive(iDrive, sDisketteName, sDiskettePath, true) && fRemount) {
this.setReady(false);
}
@ -60281,7 +60281,7 @@ class FDC extends Component {
}
/**
* findDiskette(sPath)
* findDisketteByPath(sPath)
*
* This is used to deal with mount requests (eg, autoMount) that supply a path without a name;
* if we can find the path in the "listDisks" control, then we return the associated disk name.
@ -60290,7 +60290,7 @@ class FDC extends Component {
* @param {string} sPath
* @return {string|null}
*/
findDiskette(sPath)
findDisketteByPath(sPath)
{
var controlDisks = this.bindings["listDisks"];
if (controlDisks && controlDisks.options) {
@ -60302,6 +60302,30 @@ class FDC extends Component {
return Str.getBaseName(sPath, true);
}
/**
* findDisketteByName(sName)
*
* This is used to deal with mount requests (eg, autoMount) that supply a name without a path;
* if we can find the name in the "listDisks" control, then we return the associated disk path.
*
* @this {FDC}
* @param {string|undefined} sName
* @return {string}
*/
findDisketteByName(sName)
{
if (sName) {
var controlDisks = this.bindings["listDisks"];
if (controlDisks && controlDisks.options) {
for (var i = 0; i < controlDisks.options.length; i++) {
var control = controlDisks.options[i];
if (control.text == sName) return control.value;
}
}
}
return "";
}
/**
* displayDiskette(iDrive, fUpdateDrive)
*

View file

@ -616,7 +616,8 @@ function Cs(a,b){var c=0,d,e=!0;b||(b=[0,0,Js,Array(9),0,0,0,[]]);a.La=b[c++];c+
80;g.Za=9;break;case 1200:g.fb=80;g.Za=15;break;case 1440:g.fb=80,g.Za=18}}var l=a,m=d,q=f[d],y=0;h=!0;g.La=m;g.ke=g.me=!1;q||(q=[Ks,!0,0,2,0]);"boolean"==typeof q[1]&&(q[1]=[Ls,g.fb||40,g.gb||q[3],g.Za||9,g.lb||512,q[1],g.Nf,g.Re,g.Se]);g.hb=q[y++];var w=q[y++];g.name=w[0];g.fb=w[1];g.gb=w[2];g.Za=w[3];g.lb=w[4];g.ne=w[5];(g.Nf=w[6])?(g.Re=w[7],g.Se=w[8]):(g.Nf=g.fb,g.Re=g.gb,g.Se=g.Za);g.Sa=q[y++];g.sd=q[y++];g.ub=q[y++];g.sd=100<=g.sd?g.sd-100:g.sd-g.ub;g.kb=q[y++];g.td=q[y++];g.tb=q[y++];g.Pa=
q[y++];g.Ra=null;g.sa||(g.Sd="");var z=q[y++];102==z&&(z=!1);"boolean"==typeof z?(w=q[y++],q=q[y],z?(y=l.A[m],Hs(l,m,!0,!0),y.me=!0,m=new fs(l,y,"preload"),l.li(y,m,w,q,!0)):Ms(l,m,w,q,!0)?g.sa&&q&&Ns(l,w,q,g.sa):pb(l,!1)):void 0!==z&&g.sa&&0>g.sa.restore(z)&&(h=!1);h&&g.sa&&void 0!==g.Pa&&(g.Ra=g.sa.seek(g.ub,g.Sa,g.kb));h||(e=!1)}a.H=b[c++]||0;a.F=b[c]||Os;return e}
function Is(a){var b=0,c=[];c[b++]=a.La;c[b++]=0;c[b++]=a.Y;c[b++]=a.G;c[b++]=a.D;c[b++]=a.C;c[b++]=a.I;for(var d=b++,e=0,f=[],g=0;g<a.A.length;g++){var h=e++,l=a.A[g],m=0,q=[];q[m++]=l.hb;q[m++]=[l.name,l.fb,l.gb,l.Za,l.lb,l.ne,l.Nf,l.Re,l.Se];q[m++]=l.Sa;q[m++]=l.sd+100;q[m++]=l.ub;q[m++]=l.kb;q[m++]=l.td;q[m++]=l.tb;q[m++]=l.Pa;q[m++]=l.me;q[m++]=l.Sj;q[m]=l.Sd;f[h]=q}c[d]=f;d=b++;for(e=0;e<a.A.length;e++)f=a.A[e],f.sa&&Ps(a,f.Sd,f.sa);c[d]=a.B;c[b++]=a.H;c[b]=a.F;return c}
function Gs(a,b){b||(a.J=0);for(var c in a.L){var d=a.L[c],e=d.path||"";if(e){var f=c.charCodeAt(0)-65;if(0<=f&&f<a.A.length){if(!(d=d.name))a:{if((d=a.ia.listDisks)&&d.options)for(var g=0;g<d.options.length;g++){var h=d.options[g];if(h.value==e){d=h.text;break a}}d=pa(e,!0)}!Ms(a,f,d||"Unknown",e,!0)&&b&&pb(a,!1)}else a.wa("Incorrect auto-mount settings for drive "+c+" ("+JSON.stringify(d)+")")}}return!!a.J}
function Gs(a,b){b||(a.J=0);for(var c in a.L){var d=a.L[c],e;if(!(e=d.path))a:{if(e=d.name){var f=a.ia.listDisks;if(f&&f.options)for(var g=0;g<f.options.length;g++){var h=f.options[g];if(h.text==e){e=h.value;break a}}}e=""}if(e)if(f=c.charCodeAt(0)-65,0<=f&&f<a.A.length){if(!(d=d.name))a:{if((d=a.ia.listDisks)&&d.options)for(g=0;g<d.options.length;g++)if(h=d.options[g],h.value==e){d=h.text;break a}d=pa(e,!0)}!Ms(a,f,d||"Unknown",e,!0)&&b&&pb(a,!1)}else a.wa("Incorrect auto-mount settings for drive "+
c+" ("+JSON.stringify(d)+")")}return!!a.J}
function Bs(a,b,c,d){var e,f=a.ia.listDrives;if(f&&!isNaN(e=na(f.value,10))&&0<=e&&e<a.A.length)if(c)if("?"==c)a.wa('Use "Choose File" and "Mount" to select and load a local disk.');else{if("??"==c){c=window.prompt("Enter the URL of a remote disk image.","")||"";if(!c)return;b=pa(c)}for(;0>Ms(a,e,b,c,!1,d)&&window.confirm("Click OK to reload the original disk.\n(WARNING: All disk changes will be discarded)");){var f=a,g=c,h;for(h=0;h<f.B.length;h++)if(f.B[h][1]==g){f.B.splice(h,1);break}Hs(a,e,!1,
!0)}}else Hs(a,e);else a.wa("Unable to load the selected drive")}function Ms(a,b,c,d,e,f){var g=a.A[b];if(d&&(d=d.replace("/disks/pc/","/disks/pcx86/"),g.Sd.toLowerCase()!=d.toLowerCase())){Hs(a,b,e,!0);if(g.ke)return a.wa("Drive "+b+" busy"),0;g.ke=!0;e&&(g.Gd=!0,a.J++);g.me=!!f;return(new fs(a,g,"preload")).load(c,d,f,a.li)?1:0}return-1}
k.li=function(a,b,c,d,e){var f;a.ke=!1;b&&(f=b.info(),b&&f[0]>a.fb||f[1]>a.gb)&&(this.wa('Diskette "'+c+'" too large for drive '+String.fromCharCode(65+a.La)),b=null);b?(a.sa=b,a.Sj=c,a.Sd=d,Ns(this,c,d,b),f=b.info(),this.H|=Qs,this.wa('Mounted diskette "'+c+'" in drive '+String.fromCharCode(65+a.La),a.Gd||e),a.Nf=f[0],a.Re=f[1],a.Se=f[2],this.oa&&bd(this.oa)):a.me=!1;a.Gd&&(a.Gd=!1,--this.J||pb(this));As(this,a.La)};

File diff suppressed because one or more lines are too long