The 5170 AT hard disk controller is limping along now, so I'm getting ready for a 1.15.4 release

Some other interesting bugs were fixed along the way:
the Video component incorrectly assumed that masking a negative number with 0x80000000 would yield 0x80000000 (it actually yields -0x80000000, thank you JavaScript);
the ChipSet component provides a new addCMOSMemory() interface that RAM objects can use to bump the CMOS total to match the actual total;
the CPU properly implements INSW and OUTSW instructions now (kind of important for the AT hard disk controller)
This commit is contained in:
Jeff Parsons 2014-10-08 16:15:12 -07:00 committed by jeffpar
commit 0f06c3f039
115 changed files with 2803 additions and 1902 deletions

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/manifest.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/manifest.xsl"?>
<manifest type="software">
<title>VisiCalc</title>
<!-- Since version numbers are incorporated into the disk image names, and this version number is a bit ugly, we're not exposing it with the normal "version" tag -->

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/manifest.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/manifest.xsl"?>
<manifest type="software">
<title>Executive Suite</title>
<version/>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/manifest.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/manifest.xsl"?>
<manifest type="software">
<title>Rogue</title>
<version/>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/manifest.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/manifest.xsl"?>
<manifest type="software">
<title>ThinkTank</title>
<version>2.41NP</version>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/manifest.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/manifest.xsl"?>
<manifest type="software">
<title>The Dungeons of Moria</title>
<version>4.872</version>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/manifest.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/manifest.xsl"?>
<manifest type="software">
<title>The Dungeons of Moria</title>
<version>5.5</version>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/c1pjs/1.15.3/machine.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/c1pjs/1.15.4/machine.xsl"?>
<machine id="c1psim" class="c1p" border="1" width="100%" style="background-color:#FAEBD7">
<name>OSI Challenger 1P (32Kb) with Disk Support</name>
<computer id="c1p" name="Challenger 1P">

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/c1pjs/1.15.3/machine.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/c1pjs/1.15.4/machine.xsl"?>
<machine id="c1pAll" class="c1p" border="1" width="100%" style="background-color:#FAEBD7">
<name>OSI Challenger 1P (8Kb, More Programs)</name>
<computer id="c1p" name="Challenger 1P">

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/c1pjs/1.15.3/outline.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/c1pjs/1.15.4/outline.xsl"?>
<outline>
<title>Challenger 1P (8Kb) "Server Array"</title>
<machine id="OSI1" ref="/configs/c1p/machines/8kb/small/machine.xml"/>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/c1pjs/1.15.3/machine.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/c1pjs/1.15.4/machine.xsl"?>
<machine id="c1p8kb" class="c1p" border="1" width="100%" style="background-color:#FAEBD7">
<name>OSI Challenger 1P (8Kb) with Debugger</name>
<computer id="c1p" name="Challenger 1P">

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/c1pjs/1.15.3/machine.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/c1pjs/1.15.4/machine.xsl"?>
<machine id="c1pLarge" class="c1p" border="1" pos="center" style="background-color:#FAEBD7">
<name pos="center">OSI Challenger 1P (circa 1978)</name>
<computer id="c1p" name="Challenger 1P">

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/c1pjs/1.15.3/machine.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/c1pjs/1.15.4/machine.xsl"?>
<machine id="c1pSmall" class="c1p" border="1" width="272px" pos="left" padright="16px" padbottom="16px" style="background-color:#FAEBD7">
<computer id="c1p" name="Challenger 1P">
<module type="cpu" refid="cpu6502" start="0x0000" end="0xffff"/>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/machine.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/machine.xsl"?>
<machine id="ibm5150" class="pc" border="1" pos="center" width="1000px" style="background-color:white">
<name>IBM PC (Model 5150), CGA, 384K</name>
<computer id="pc-cga-384k" name="IBM PC"/>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/machine.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/machine.xsl"?>
<machine id="ibm5150" class="pc" border="1" width="980px" pos="center" style="background-color:#FAEBD7">
<name pos="center">IBM PC (Model 5150), CGA, 64K</name>
<computer id="pc-cga-64k" name="IBM PC" state="/configs/pc/machines/5150/cga/64kb/donkey/state.json"/>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/machine.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/machine.xsl"?>
<machine id="ibm5150" class="pc" border="1" width="980px" pos="center" style="background-color:#FAEBD7">
<name pos="center">IBM PC (Model 5150), CGA, 64K</name>
<computer id="pc-cga-64k" name="IBM PC" state="/configs/pc/machines/5150/cga/64kb/donkey/state.json"/>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/machine.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/machine.xsl"?>
<machine id="ibm5150" class="pc" border="1" pos="center" width="1000px" style="background-color:white">
<name>IBM PC (Model 5150), CGA, 64K</name>
<computer id="pc-cga-64k" name="IBM PC"/>

View file

@ -1,18 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/machine.xsl"?>
<machine id="ibm5150" class="pc" border="1" width="740px" pos="center" style="background-color:#FAEBD7">
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/machine.xsl"?>
<machine id="ibm5150" class="pc" border="1" pos="center" style="background-color:#FAEBD7">
<name pos="center">IBM PC Model 5150 with Monochrome Display</name>
<computer id="pc-mda-64k" name="IBM PC" resume="1"/>
<ram id="ramLow" addr="0x00000"/>
<rom id="romBASIC" addr="0xf6000" size="0x8000" file="/devices/pc/basic/ibm-basic-1.00.json"/>
<rom id="romBIOS" addr="0xfe000" size="0x2000" file="/devices/pc/bios/5150/1981-04-24.json"/>
<video id="videoMDA" screenwidth="720" screenheight="350" scale="true" charset="/devices/pc/video/ibm-mda-cga.json" pos="center" width="720px" padding="8px">
<video id="videoMDA" screenwidth="720" screenheight="350" scale="true" charset="/devices/pc/video/ibm-mda-cga.json" pos="center" padding="8px">
<name>Monochrome Display</name>
</video>
<cpu id="cpu8088" model="8088" autostart="true"/>
<keyboard ref="/configs/pc/keyboards/minimal-functions.xml"/>
<debugger id="debugger"/>
<panel ref="/configs/pc/panels/default.xml"/>
<panel ref="/configs/pc/panels/wide.xml"/>
<fdc ref="/configs/pc/disks/samples.xml" width="280px"/>
<chipset id="chipset" model="5150" sw1="01000001" sw2="11110000" pos="left" padleft="8px" padbottom="8px">
<control type="switches" class="input" label="SW1" binding="sw1" left="0px"/>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/machine.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/machine.xsl"?>
<machine id="ibm5150" class="pc" border="1" pos="center" style="background-color:#FAEBD7">
<name pos="center">IBM PC (Model 5150) with Monochrome Display</name>
<computer id="pc-mda-64k" name="IBM PC" resume="1"/>

View file

@ -1,18 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/machine.xsl"?>
<machine id="ibm5150" class="pc" border="1" pos="center" width="1000px" style="background-color:white">
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/machine.xsl"?>
<machine id="ibm5150" class="pc" border="1" pos="center" style="background-color:white">
<name>IBM PC (Model 5150), MDA, 64K</name>
<computer id="pc-mda-64k" name="IBM PC"/>
<cpu id="cpu8088" model="8088"/>
<ram id="ramLow" addr="0x00000"/>
<rom id="romBASIC" addr="0xf6000" size="0x8000" file="/devices/pc/basic/ibm-basic-1.00.json"/>
<rom id="romBIOS" addr="0xfe000" size="0x2000" file="/devices/pc/bios/5150/1981-04-24.json"/>
<video id="videoMDA" screenwidth="720" screenheight="350" scale="true" charset="/devices/pc/video/ibm-mda-cga.json" pos="center" width="720px" padding="8px">
<video id="videoMDA" screenwidth="720" screenheight="350" scale="true" charset="/devices/pc/video/ibm-mda-cga.json" pos="center" padding="8px">
<name>Monochrome Display</name>
</video>
<keyboard ref="/configs/pc/keyboards/us83.xml"/>
<debugger id="debugger"/>
<panel ref="/configs/pc/panels/default.xml"/>
<panel ref="/configs/pc/panels/wide.xml"/>
<fdc ref="/configs/pc/disks/samples.xml" width="280px"/>
<chipset id="chipset" model="5150" sw1="01000001" sw2="11110000" pos="left" padleft="8px" padbottom="8px">
<control type="switches" class="input" label="SW1" binding="sw1" left="0px"/>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/machine.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/machine.xsl"?>
<machine id="ibm5160" class="pc" border="1" pos="center" width="1000px" style="background-color:white">
<name pos="center">IBM PC XT (Model 5160), CGA, 256K, 10Mb Drive</name>
<computer id="xt-cga-256k" name="IBM PC XT"/>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/machine.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/machine.xsl"?>
<machine id="ibm5160" class="pc" border="1" width="980px" pos="center" style="background-color:#FAEBD7">
<name pos="center">IBM PC XT (Model 5160), CGA, 256K, 10Mb Drive</name>
<computer id="xt-cga-256k" name="IBM PC XT"/>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/machine.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/machine.xsl"?>
<machine id="ibm5160" class="pc" border="1" width="980px" pos="center" style="background-color:#FAEBD7">
<name pos="center">IBM PC XT (Model 5160), CGA, 256Kb, 10Mb Drive</name>
<computer id="xt-cga-256k" name="IBM PC XT" resume="1"/>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/machine.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/machine.xsl"?>
<machine id="ibm5160" class="pc" border="1" pos="center" width="1000px" style="background-color:white">
<name>IBM PC XT (Model 5160), CGA, 256K, 10Mb Drive</name>
<computer id="xt-cga-256k" name="IBM PC XT"/>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/machine.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/machine.xsl"?>
<machine id="ibm5160" class="pc" border="1" width="980px" pos="center" style="background-color:#FAEBD7">
<name pos="center">IBM PC XT (Model 5160) running Windows v1.01</name>
<computer id="xt-cga-win101" name="IBM PC XT" state="/configs/pc/machines/5160/cga/256kb/win101/state.json" resume="1"/>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/machine.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/machine.xsl"?>
<machine id="ibm5160" class="pc" border="1" pos="center" style="background-color:#FAEBD7">
<name pos="center">IBM PC XT (Model 5160) running Windows v1.01</name>
<computer id="xt-cga-win101" name="IBM PC XT" state="/configs/pc/machines/5160/cga/256kb/win101/state.json"/>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/machine.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/machine.xsl"?>
<machine id="ibm5160" class="pc" border="1" pos="center" width="1000px" style="background-color:white">
<name>IBM PC XT (Model 5160), CGA, 256K, WIN101</name>
<computer id="xt-cga-256k" name="IBM PC XT"/>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/machine.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/machine.xsl"?>
<machine id="ibm5160" class="pc" border="1" pos="center" width="1000px" style="background-color:white">
<name>IBM PC XT (Model 5160), CGA, 512K, WIN101</name>
<computer id="xt-cga-512k" name="IBM PC XT"/>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/machine.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/machine.xsl"?>
<machine id="ibm5160" class="pc" border="1" width="980px" pos="center" style="background-color:#FAEBD7">
<name pos="center">IBM PC XT (Model 5160), CGA, 640K, 10Mb Drive</name>
<computer id="xt-cga-640k" name="IBM PC XT"/>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/machine.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/machine.xsl"?>
<machine id="ibm5160" class="pc" border="1" pos="center" width="1000px" style="background-color:white">
<name>IBM PC XT (Model 5160), CGA, 640K, 10Mb Drive</name>
<computer id="xt-cga-640k" name="IBM PC XT"/>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/machine.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/machine.xsl"?>
<machine id="ibm5160" class="pc" border="1" pos="center" style="background-color:#FAEBD7">
<name pos="center">IBM PC XT (Model 5160), CGA, 640K, 10Mb Drive</name>
<computer id="xt-cga-640k" name="IBM PC XT"/>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/machine.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/machine.xsl"?>
<machine id="ibm5160" class="pc" border="1" pos="center" style="background-color:#FAEBD7">
<name>IBM PC XT (Model 5160), 64K EGA, 256K RAM, 10Mb Hard Drive</name>
<computer id="xt-ega-256k" name="IBM PC XT"/>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/machine.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/machine.xsl"?>
<machine id="ibm5160" class="pc" border="1" width="680px" float="left" style="background-color:#FAEBD7">
<name pos="center">IBM PC XT, 128K EGA, 640K RAM, 10Mb Hard Drive</name>
<computer id="xt-ega-640k" name="IBM PC XT" state="/configs/pc/machines/5160/ega/640kb/win101/state.json"/>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/machine.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/machine.xsl"?>
<machine id="ibm5160" class="pc" border="1" pos="center" style="background-color:#FAEBD7">
<name>IBM PC XT, 128K EGA, 640K RAM, 10Mb Hard Drive</name>
<computer id="xt-ega-640k" name="IBM PC XT"/>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/machine.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/machine.xsl"?>
<machine id="ibm5160" class="pc" border="1" pos="center" style="background-color:#FAEBD7">
<name>IBM PC XT, 128K EGA, 640K RAM, 10Mb Hard Drive</name>
<computer id="xt-ega-640k" name="IBM PC XT"/>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/machine.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/machine.xsl"?>
<machine id="ibm5160" class="pc" border="1" style="background-color:#FAEBD7">
<name pos="center">IBM PC XT, 128K EGA, 640K RAM, 10Mb Hard Drive</name>
<computer id="xt-ega-640k" name="IBM PC XT" state="/configs/pc/machines/5160/ega/640kb/win101/state.json"/>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/machine.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/machine.xsl"?>
<machine id="ibm5160" class="pc" border="1" width="740px" pos="center" style="background-color:#FAEBD7">
<name pos="center">IBM PC XT (Model 5160), MDA, 256Kb, 10Mb Drive</name>
<computer id="xt188-mda-256k" name="IBM PC XT"/>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/machine.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/machine.xsl"?>
<machine id="ibm5160" class="pc" border="1" pos="center" style="background-color:#FAEBD7">
<name pos="center">IBM PC XT (Model 5160), MDA, 256Kb, 10Mb Drive</name>
<computer id="xt188-mda-256k" name="IBM PC XT"/>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/machine.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/machine.xsl"?>
<machine id="ibm5160" class="pc" border="1" width="740px" pos="center" style="background-color:#FAEBD7">
<name pos="center">IBM PC XT (Model 5160), MDA, 256Kb, 10Mb Drive</name>
<computer id="xt-mda-256k" name="IBM PC XT"/>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/machine.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/machine.xsl"?>
<machine id="ibm5160" class="pc" border="1" pos="center" width="1000px" style="background-color:white">
<name>IBM PC XT (Model 5160), MDA, 64K, 10Mb Drive</name>
<computer id="xt-mda-64k" name="IBM PC XT"/>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/machine.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/machine.xsl"?>
<machine id="ibm5170" class="pc" border="1" pos="center" style="background-color:#FAEBD7">
<name>IBM PC AT, 128K EGA, 640K RAM</name>
<computer id="at-ega-640k" name="IBM PC AT" buswidth="24"/>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/manifest.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/manifest.xsl"?>
<manifest type="document">
<title>IBM PC AT References</title>
<document href="http://minuszerodegrees.net/manuals/IBM_5170_Technical_Reference_1502243_MAR84.pdf">

View file

@ -25,6 +25,7 @@ Model 5160 Machine Configurations include:
* [IBM PC XT, CGA "Server Array" Demo](/configs/pc/machines/5160/cga/256kb/array/)
* [IBM PC XT, EGA, 256K, 10Mb Drive, Debugger](/configs/pc/machines/5160/ega/256kb/debugger/)
* [IBM PC XT, EGA, 640K, 10Mb Drive, Debugger](/configs/pc/machines/5160/ega/640kb/debugger/)
* [IBM PC XT, EGA, 640K, Windows 1.01](/configs/pc/machines/5160/ega/640kb/win101/)
* [IBM PC XT, EGA "Server Array" Demo](/configs/pc/machines/5160/ega/640kb/array/)
Model 5170 Machine Configurations include:

File diff suppressed because one or more lines are too long

View file

@ -98,8 +98,35 @@
F000:070D @ FORMAT_SET
F000:0771 @ DSKETTE_SETUP
28DA +
F000:0000 @ DISK_SETUP
F000:0197 @ DISK_IO
F000:0000 @ HDISK_SETUP
F000:0197 @ HDISK_IO
F000:0212 @ HDISK_IO_CONT
F000:02B3 @ HDISK_RESET
F000:0307 @ RETURN_STATUS
F000:0310 @ HDISK_READ
F000:0318 @ HDISK_WRITE
F000:0320 @ HDISK_VERF
F000:0333 @ FMT_TRK
F000:0349 @ READ_DASD_TYPE
F000:038B @ GET_HDPARM
F000:03EA @ INIT_DRV
F000:041F @ RD_LONG
F000:0427 @ WR_LONG
F000:042F @ HDISK_SEEK
F000:044E @ TST_RDY
F000:0465 @ HDISK_RECAL
F000:0489 @ CTLR_DIAGNOSTIC
F000:04BB @ COMMANDI
F000:04FB @ COMMANDO
F000:0544 @ COMMAND
F000:05A5 @ WAIT
F000:05DF @ NOT_BUSY
F000:0608 @ WAIT_DRQ
F000:061E @ CHECK_STATUS
F000:0630 @ CHECK_ST
F000:0664 @ CHECK_ER
F000:068F @ CHECK_DMA
F000:06B4 @ GET_VEC
F000:06CA @ HD_INT
0000 +
F000:2FC8 @ KEYBOARD_IO_1

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/manifest.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/manifest.xsl"?>
<manifest type="software">
<title>1-2-3</title>
<version>1.0a</version>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/manifest.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/manifest.xsl"?>
<manifest type="software">
<title>MS Word</title>
<version>2.0c</version>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/manifest.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/manifest.xsl"?>
<manifest type="software">
<title>MS Word</title>
<version>3.0</version>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/manifest.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/manifest.xsl"?>
<manifest type="software">
<title>MS Word</title>
<version>3.1</version>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/manifest.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/manifest.xsl"?>
<manifest type="software">
<title>MS Word</title>
<version>5.0</version>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/machine.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/machine.xsl"?>
<machine id="ibm5150" class="pc" border="1" width="740px" pos="center" style="background-color:#FAEBD7">
<name pos="center">IBM PC (Model 5150) running CP/M-86</name>
<computer id="cpm-mda-64k" name="IBM PC" resume="1"/>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/manifest.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/manifest.xsl"?>
<manifest type="software">
<title>CP/M-86</title>
<version>1.1B</version>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/machine.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/machine.xsl"?>
<machine id="ibm5150" class="pc" border="1" width="740px" pos="center" style="background-color:#FAEBD7">
<name pos="center">IBM PC (Model 5150) running IBM Advanced Diagnostics 2.20</name>
<computer id="pc-mda-64k" name="IBM PC"/>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/manifest.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/manifest.xsl"?>
<manifest type="software">
<title>IBM Advanced Diagnostics</title>
<version>2.20</version>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/manifest.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/manifest.xsl"?>
<manifest type="software">
<title>PC-DOS</title>
<version>1.00</version>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/manifest.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/manifest.xsl"?>
<manifest type="software">
<title>PC-DOS</title>
<version>1.10</version>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/manifest.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/manifest.xsl"?>
<manifest type="software">
<title>PC-DOS</title>
<version>2.00</version>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/manifest.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/manifest.xsl"?>
<manifest type="software">
<title>PC-DOS</title>
<version>2.10</version>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/manifest.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/manifest.xsl"?>
<manifest type="software">
<title>PC-DOS</title>
<version>3.00</version>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/manifest.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/manifest.xsl"?>
<manifest type="software">
<title>MS-DOS</title>
<version>3.20</version>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/manifest.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/manifest.xsl"?>
<manifest type="software">
<title>MS-DOS</title>
<version>3.30</version>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/manifest.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/manifest.xsl"?>
<manifest type="software">
<title>MS-DOS</title>
<version>3.30a</version>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/manifest.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/manifest.xsl"?>
<manifest type="software">
<title>MS-DOS</title>
<version>4.01</version>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/manifest.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/manifest.xsl"?>
<manifest type="software">
<title>MS-DOS</title>
<version>4.0M</version>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/manifest.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/manifest.xsl"?>
<manifest type="software">
<title>The Hitchhiker's Guide to the Galaxy</title>
<version/>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/machine.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/machine.xsl"?>
<machine id="ibm5150" class="pc" border="1" width="980px" pos="center" style="background-color:#FAEBD7">
<name pos="center">IBM PC Model 5150 (CGA, 64K)</name>
<computer id="infocom-cga-64k" name="IBM PC" resume="1"/>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/machine.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/machine.xsl"?>
<machine id="ibm5150" class="pc" border="1" width="980px" pos="center" style="background-color:#FAEBD7">
<name pos="center">IBM PC Model 5150 (CGA, 64K)</name>
<computer id="infocom-cga-64k" name="IBM PC" resume="1"/>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/manifest.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/manifest.xsl"?>
<manifest type="software">
<title>Planetfall</title>
<version/>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/machine.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/machine.xsl"?>
<machine id="ibm5150" class="pc" border="1" width="980px" pos="center" style="background-color:#FAEBD7">
<name pos="center">Zork I (IBM PC Model 5150)</name>
<computer id="zork-cga-64k" name="IBM PC"/>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/manifest.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/manifest.xsl"?>
<manifest type="software">
<title>Zork I</title>
<version/>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/manifest.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/manifest.xsl"?>
<manifest type="software">
<title>Zork II</title>
<version/>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/manifest.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/manifest.xsl"?>
<manifest type="software">
<title>Zork III</title>
<version/>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/machine.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/machine.xsl"?>
<machine id="ibm5150" class="pc" border="1" pos="center" style="background-color:#FAEBD7">
<name pos="center">IBM PC (Model 5150) running Microsoft Adventure</name>
<computer id="msadv-mda-64k" name="IBM PC" resume="1"/>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/manifest.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/manifest.xsl"?>
<manifest type="software">
<title>Microsoft Adventure</title>
<version>1.00</version>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/manifest.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/manifest.xsl"?>
<manifest type="software">
<title>Microsoft Flight Simulator</title>
<version/>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/manifest.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/manifest.xsl"?>
<manifest type="software">
<title>MINIX</title>
<version>1.1</version>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/manifest.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/manifest.xsl"?>
<manifest type="software">
<title>Turbo Pascal</title>
<disk id="disk01" href="/disks/pc/tools/borland/pascal/3.0/TURBO30.json" md5="b1243614e885cb2a16047cff1adcb00b" md5json="672b78ada3c22756676b71fdf83c23af">

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/manifest.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/manifest.xsl"?>
<manifest type="software">
<title>MS BASIC</title>
<version/>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/manifest.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/manifest.xsl"?>
<manifest type="software">
<title>Microsoft C Compiler</title>
<version>4.00</version>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/manifest.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/manifest.xsl"?>
<manifest type="software">
<title>Microsoft Macro Assember</title>
<type>Tool</type>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/manifest.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/manifest.xsl"?>
<manifest type="software">
<title>MS Mouse</title>
<version>5.00</version>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/manifest.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/manifest.xsl"?>
<manifest type="software">
<title>Windows 1.01 SDK</title>
<disk id="disk01" href="/disks/pc/tools/microsoft/winsdk/1.01/WINRUN101-DISK1-SETUP.json" md5="d690737d566f7962276edc087c1e218e" md5json="466410d8f856ce6f2ffff64d57ebf498">

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/manifest.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/manifest.xsl"?>
<manifest type="software">
<title>Windows 1.04 SDK</title>
<source href="http://os2museum.com">os2museum.com</source>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/manifest.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/manifest.xsl"?>
<manifest type="software">
<title>Windows 2.03 SDK</title>
<source href="http://os2museum.com">os2museum.com</source>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/manifest.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/manifest.xsl"?>
<manifest type="software">
<title>Microsoft Windows 1.01</title>
<disk id="disk01" dir="private/01-SETUP/" href="/disks/pc/win/win101/WIN101-DISK1-SETUP.json" md5="f82a9804ea9baab98f0d1fe9bf639637" md5json="6fd1f1762e78830e27f44e3e9386ae55">

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/manifest.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/manifest.xsl"?>
<manifest type="software">
<title>Microsoft Windows 1.03</title>
<disk id="disk01" dir="private/01-SETUP/" href="/disks/pc/win/win103/WIN103-DISK1-SETUP.json" md5="6cdc68e0fc237c858fc5099957e5fb3d" md5json="09605e98952fbec2e0bf39524c1106f3">

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/manifest.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/manifest.xsl"?>
<manifest type="software">
<title>Microsoft Windows 1.03a</title>
<disk id="disk01" href="/disks/pc/win/win103a/WIN103A-DISK1-SETUP.json" md5="90e3c32f675bf573bba222681143e9a4" md5json="a480122e92b286eab69388f167827253">

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/manifest.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/manifest.xsl"?>
<manifest type="software">
<title>Microsoft Windows 1.04</title>
<source href="http://os2museum.com">os2museum.com</source>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/manifest.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/manifest.xsl"?>
<manifest type="software">
<title>Microsoft Windows 2.03</title>
<source href="http://os2museum.com">os2museum.com</source>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/manifest.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/manifest.xsl"?>
<manifest type="software">
<title>Windows COMM Driver (Source)</title>
<disk id="disk01" href="/disks/pc/win/wincomm/WINCOMM.json" md5="4aa07d1ff8a88b1bac0828d0f5b74fac" md5json="fd0dc74b471044add2b2338a889bd602"/>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.3/manifest.xsl"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.15.4/manifest.xsl"?>
<manifest type="software">
<title>SCO Xenix 8086 Operating System For i8086 Vers 2.1.3</title>
<disk id="disk01" href="/disks/pc/xenix/8086/2.1.3/N1.json" md5="f3abb0fbee6a60d925cbd81a31e9f2a5" md5json="d84c47d7fa2e14f00f76dabed23a3b58">

View file

@ -32,6 +32,25 @@ Attributes
The 'path' property is optional; if omitted, an empty disk matching the specified drive type will be created
(10mb in the case of drive type 3).
* *type* (optional)
Should be set to one of:
* *'xt'*: PC XT Xebec controller emulation
* *'at'*: PC AT Western Digital controller emulation
Also, make sure the appropriate ROM is installed.
For the Xebec (*'xt'*) controller, you should install the Xebec ROM; eg:
<rom id="romHDC" addr="0xc8000" size="0x2000" file="/devices/pc/hdc/ibm-xebec-1982.json"/>
For the Western Digital (*'at'*) controller, use a Model 5170 (or newer) ROM module; eg:
<rom id="romBIOS" addr="0xf0000" size="0x10000" alias="0xff0000" file="/devices/pc/bios/5170/1984-01-10.json"/>
The default *type* setting is *'xt'*.
* Also supports the attributes of *[Component](/docs/pcjs/component/)*.
Bindings

View file

@ -107,7 +107,7 @@ if (typeof module !== 'undefined') {
* 2F0-2F7 Reserved
* 2F8-2FF Asynchronous Communications (Secondary) [see the SerialPort component]
* 300-31F Prototype Card
* 320-32F Hard Drive Controller [see the HDC component]
* 320-32F Hard Drive Controller (XTC) [see the HDC component]
* 378-37F Printer
* 380-38C [2] SDLC Communications
* 380-389 [2] Binary Synchronous Communications (Secondary)
@ -132,6 +132,7 @@ if (typeof module !== 'undefined') {
* 071 CMOS Data ChipSet.CMOS.DATA.PORT
* 0F0 Coprocessor Clear Busy (output 0x00)
* 0F1 Coprocessor Reset (output 0x00)
* 1F0-1F7 Hard Drive Controller (ATC) [see the HDC component]
*
* [3] Port 0x70 doubles as the NMI Mask Register: output a CMOS address with bit 7 clear to enable NMI
* or with bit 7 set to disable NMI (apparently the inverse of the older NMI Mask Register at port 0xA0).
@ -150,7 +151,7 @@ function ChipSet(parmsChipSet)
this.model = (this.model !== undefined? parseInt(this.model, 10) : ChipSet.MODEL_5150);
/*
* Given that the ROM BIOS is hard-coded to load boot sectors @ 0000:7C00, the minimum amount of system RAM
* Given that the ROM BIOS is hard-coded to load boot sectors @0000:7C00, the minimum amount of system RAM
* required to boot is therefore 32Kb. Whether that's actually enough to run any or all versions of PC-DOS is
* a separate question. FYI, with only 16Kb, the ROM BIOS will still try to boot, and fail miserably.
*/
@ -178,13 +179,6 @@ function ChipSet(parmsChipSet)
this.cDMACs = this.cPICs = 1;
if (this.model >= ChipSet.MODEL_5170) {
this.cDMACs = this.cPICs = 2;
/*
* Initialize minimal support for the MODEL_5170's HFCOMBO card (see ChipSet.HFCOMBO below for details)
*/
this.regsHFCombo = {
bCtrl: 0x00, // port 0x1F4
bStatus: 0x7F // port 0x1F7
};
}
this.fScaleTimers = parmsChipSet['scaleTimers'] || false;
this.sRTCDate = parmsChipSet['rtcDate'];
@ -213,7 +207,14 @@ function ChipSet(parmsChipSet)
if (DEBUG) this.log("webkitAudioContext not available");
}
}
/*
* I used to defer ChipSet's reset() to powerUp(), which then gave us the option of doing either
* reset() OR restore(), instead of both. However, on MODEL_5170 machines, the initial CMOS data
* needs to be created earlier, so that if/when the HDC calls setCMOSDriveType(), we'll be ready.
*/
this.reset();
this.setReady();
}
@ -241,7 +242,7 @@ ChipSet.MONITOR.EGAEMULATION = 5; // Enhanced Color Display (5154) in Emul
* 8237A DMA Controller (DMAC) I/O ports
*
* MODEL_5150 and up uses DMA channel 0 for memory refresh cycles and channel 2 for the FDC
* MODEL_5160 and up uses DMA channel 3 for HDC transfers
* MODEL_5160 and up uses DMA channel 3 for HDC transfers (XTC only)
* MODEL_5170 and up contain *two* DMA Controllers, which we refer to as DMA0 and DMA1; channel 4
* on DMA1 is used to "cascade" channels 0-3 from DMA0, so only channels 5-7 are available on DMA1
*
@ -325,7 +326,7 @@ ChipSet.DMA_MODE.MODE_BLOCK = 0x80;
ChipSet.DMA_MODE.MODE_CASCADE = 0xC0;
ChipSet.DMA_FDC = 0x02; // DMA channel assigned to the Floppy Drive Controller (FDC)
ChipSet.DMA_HDC = 0x03; // DMA channel assigned to the Hard Drive Controller (HDC)
ChipSet.DMA_HDC = 0x03; // DMA channel assigned to the Hard Drive Controller (HDC; XTC only)
/*
* 8259A Programmable Interrupt Controller (PIC) I/O ports
@ -416,8 +417,8 @@ ChipSet.PIC_LO.OCW3_SMM_CMD = 0x60;
* highest priority (IRQ9 is the highest) and IRQ3 through IRQ7 having the lowest priority (IRQ7 is
* the lowest).
*
* Interrupt 13 is used on the system board and is not available on the I/O channel. Interrupt 8 is
* used for the real-time clock."
* Interrupt 13 (IRQ.COPROC) is used on the system board and is not available on the I/O channel.
* Interrupt 8 (IRQ.RTC) is used for the real-time clock."
*
* This priority scheme is a byproduct of IRQ8 through IRQ15 (slave PIC interrupts) being tied to IRQ2 of
* the master PIC. As a result, the two other system board interrupts, IRQ0 and IRQ1, continue to have the
@ -429,13 +430,13 @@ ChipSet.IRQ.KBD = 0x01;
ChipSet.IRQ.SLAVE = 0x02;
ChipSet.IRQ.COM2 = 0x03;
ChipSet.IRQ.COM1 = 0x04;
ChipSet.IRQ.HDC = 0x05; // MODEL_5160 uses this for the HDC; MODEL_5170 designates it for LPT2
ChipSet.IRQ.XTC = 0x05; // MODEL_5160 uses this for its HDC; MODEL_5170 designates it for LPT2
ChipSet.IRQ.FDC = 0x06;
ChipSet.IRQ.LPT1 = 0x07;
ChipSet.IRQ.RTC = 0x08;
ChipSet.IRQ.IRQ2 = 0x09;
ChipSet.IRQ.COPROC = 0x0D;
ChipSet.IRQ.ATHDC = 0x0E; // MODEL_5170 uses this for the HDC
ChipSet.IRQ.ATC = 0x0E; // MODEL_5170 uses this for its HDC
/*
* 8253 Programmable Interval Timer (PIT) I/O ports
@ -678,7 +679,7 @@ ChipSet.CMOS.ADDR.RTC_STATUSC = 0x0C;
ChipSet.CMOS.ADDR.RTC_STATUSD = 0x0D;
ChipSet.CMOS.ADDR.DIAG = 0x0E;
ChipSet.CMOS.ADDR.SHUTDOWN = 0x0F;
ChipSet.CMOS.ADDR.FDRIVE = 0x10; // drive 0 ChipSet.FDRIVE in high nibble, drive 1 ChipSet.FDRIVE value in low nibble
ChipSet.CMOS.ADDR.FDRIVE = 0x10;
ChipSet.CMOS.ADDR.HDRIVE = 0x12;
ChipSet.CMOS.ADDR.EQUIP = 0x14;
ChipSet.CMOS.ADDR.BASEMEM_LO = 0x15;
@ -733,37 +734,21 @@ ChipSet.CMOS.DIAG.HDRIVEFAIL = 0x08; // bit 3: 1 indicates hard drive control
ChipSet.CMOS.DIAG.TIMEFAIL = 0x04; // bit 2: 1 indicates time failure
ChipSet.CMOS.DIAG.RESERVED = 0x03;
ChipSet.FDRIVE = { // abCMOSData[ChipSet.CMOS.ADDR.FDRIVE] values (drive 0 value in high nibble, drive 1 value in low nibble)
NONE: 0, // no drive
DSDD: 1, // double-sided double-density drive (48 TPI, 40 tracks, 360Kb max)
DSHD: 2 // double-sided high-density drive (96 TPI, 80 tracks, 1.2Mb max)
ChipSet.FDRIVE = { // abCMOSData[ChipSet.CMOS.ADDR.FDRIVE]
D0_MASK: 0xF0, // Drive 0 type in high nibble
D1_MASK: 0x0F, // Drive 1 type in lower nibble
NONE: 0, // no drive
DSDD: 1, // double-sided double-density drive (48 TPI, 40 tracks, 360Kb max)
DSHD: 2 // double-sided high-density drive (96 TPI, 80 tracks, 1.2Mb max)
};
/*
* The following HDRIVE types are supported by the MODEL_5170, where C is Cylinders, H is Heads,
* WP is Write Pre-Comp, and LZ is Landing Zone.
*
* Type C H WP LZ
* ---- --- -- --- ---
* 1 306 4 128 305
* 2 615 4 300 615
* 3 615 6 300 615
* 4 940 8 512 940
* 5 940 6 512 940
* 6 615 4 no 615
* 7 462 8 256 511
* 8 733 5 no 733
* 9 900 15 no8 901
* 10 820 3 no 820
* 11 855 5 no 855
* 12 855 7 no 855
* 13 306 8 128 319
* 14 733 7 no 733
* 15 (reserved--all zeros)
*/
ChipSet.CMOS.HDRIVE = {}; // abCMOSData[ChipSet.CMOS.ADDR.HDRIVE]
ChipSet.CMOS.HDRIVE.D0 = 0xF0;
ChipSet.CMOS.HDRIVE.D1 = 0x0F;
ChipSet.CMOS.HDRIVE = { // abCMOSData[ChipSet.CMOS.ADDR.HDRIVE]
D0_MASK: 0xF0, // Drive 0 type in high nibble
D1_MASK: 0x0F // Drive 1 type in lower nibble
/*
* HDRIVE types are defined by table in the HDC component, which uses setCMOSDriveType() to update the CMOS
*/
};
/*
* The CMOS equipment flags use the same format as the older PPI equipment flags
@ -805,33 +790,6 @@ ChipSet.COPROC = {}; // TODO: Define a variable for this
ChipSet.COPROC.PORT_CLEAR = 0xF0; // clear the coprocessor's "busy" state
ChipSet.COPROC.PORT_RESET = 0xF1; // reset the coprocessor
/*
* Ports used by MODEL_5170 BIOS for "Combo Hard File/Diskette Card" check (@ F000:144C)
*
* The ChipSet component provides minimal boot-time support for the "IBM Personal Computer
* AT Fixed Disk and Diskette Drive Adapter", aka the HFCOMBO card, until we're able to fork
* the HDC component into a new HDCombo component to deal with the "Fixed Disk" portion
* of the HFCOMBO card. Fortunately, the "Diskette Drive Adapter" portion of the card is
* extremely compatible with the existing FDC component, so that component can be used as-is,
* with only minor tweaks.
*
* Initially, we intercepted reads for HFCOMBO's STATUS port simply to reduce boot time;
* otherwise, the default "unknown port" response of 0xFF would lengthen boot time. To solve
* that, the STATUS port simply needed to return a byte with bit 7 clear, so that the BIOS
* would then attempt to write/read the CTRL port.
*
* Next, we initially treated the HFCOMBO's CTRL port as an "unknown port", because again,
* we didn't need HDC support and it didn't seem to affect FDC support. But it turns out
* that FDC support IS affected, because if the BIOS doesn't set the "DUAL" bit (bit 0) of the
* "HFCNTRL" byte at 40:8F, then when it comes time later to report the diskette drive type,
* the "DISK_TYPE" function (@ F000:273D) will branch to one of two almost-identical blocks of
* code -- specifically, the block that disallows diskette drive types >= 2 (ChipSet.FDRIVE.DSDD)
* instead of >= 3 (ChipSet.FDRIVE.DSHD).
*/
ChipSet.HFCOMBO = {};
ChipSet.HFCOMBO.CTRL = {PORT: 0x1F4};
ChipSet.HFCOMBO.STATUS = {PORT: 0x1F7};
/*
* ChipSet-related BIOS interrupts, functions, and other parameters
*/
@ -939,12 +897,8 @@ ChipSet.prototype.initBus = function(cmp, bus, cpu, dbg)
*/
ChipSet.prototype.powerUp = function(data, fRepower)
{
if (!fRepower) {
if (!data || !this.restore) {
this.reset();
} else {
if (!this.restore(data)) return false;
}
if (!fRepower && data) {
if (!this.restore(data)) return false;
}
return true;
};
@ -1038,6 +992,7 @@ ChipSet.prototype.reset = function()
this.abCMOSData = new Array(ChipSet.CMOS.ADDR.TOTAL);
this.initRTCDate(this.sRTCDate);
this.initCMOSData();
/*
* TODO: Data below here has not yet been added to the save/restore state; when we're done adding new data,
* make sure it all gets added.
@ -1081,8 +1036,9 @@ ChipSet.prototype.initRTCDate = function(sDate)
{
/*
* NOTE: I've already been burned once by a JavaScript library function that did NOT treat an undefined
* parameter the same as no parameter (eg, the async parameter in xmlHTTP.open() in IE), so I'm taking no
* chances here: if sDate is undefined, then explicitly call Date() with no parameters.
* parameter (ie, a parameter === undefined) the same as an omitted parameter (eg, the async parameter in
* xmlHTTP.open() in IE), so I'm taking no chances here: if sDate is undefined, then explicitly call Date()
* with no parameters.
*/
var date = sDate? new Date(sDate) : new Date();
@ -1289,21 +1245,99 @@ ChipSet.prototype.initCMOSData = function()
this.abCMOSData[ChipSet.CMOS.ADDR.FDRIVE] = (this.getSWFloppyDriveType(0) << 4) | this.getSWFloppyDriveType(1);
/*
* We allow both memory totals to start at zero now, and rely on the RAM component to call addCMOSMemory()
* to update the total(s) as appropriate.
*
var wBaseMemKb = this.getSWMemorySize();
this.abCMOSData[ChipSet.CMOS.ADDR.BASEMEM_LO] = wBaseMemKb & 0xff;
this.abCMOSData[ChipSet.CMOS.ADDR.BASEMEM_HI] = wBaseMemKb >> 8;
*/
/*
* The final step is calculating the CMOS checksum, which we then store into the CMOS as a courtesy, so that the
* user doesn't get unnecessary CMOS errors.
*/
var wChecksum = this.getCMOSChecksum();
this.abCMOSData[ChipSet.CMOS.ADDR.CHKSUM_LO] = wChecksum & 0xff;
this.abCMOSData[ChipSet.CMOS.ADDR.CHKSUM_HI] = wChecksum >> 8;
this.updateCMOSChecksum();
};
/**
* getCMOSChecksum()
* setCMOSByte(iCMOS, b)
*
* This is ONLY for use by components that need to update CMOS configuration bytes to match their internal configuration.
*
* @this {ChipSet}
* @param {number} iCMOS
* @param {number} b
* @return {boolean} true if successful, false if not (eg, CMOS not initialized yet, or no CMOS on this machine)
*/
ChipSet.prototype.setCMOSByte = function(iCMOS, b)
{
if (this.abCMOSData) {
Component.assert(iCMOS >= ChipSet.CMOS.ADDR.FDRIVE && iCMOS < ChipSet.CMOS.ADDR.CHKSUM_HI);
this.abCMOSData[iCMOS] = b;
this.updateCMOSChecksum();
return true;
}
return false;
};
/**
* addCMOSMemory(addr, size)
*
* This is ONLY for use by the RAM component, to dynamically update the CMOS memory configuration.
*
* @this {ChipSet}
* @param {number} addr (if 0, BASEMEM_LO/BASEMEM_HI is updated; if >= 0x100000, then EXTMEM_LO/EXTMEM_HI is updated)
* @param {number} size (in bytes; we convert to Kb)
* @return {boolean} true if successful, false if not (eg, CMOS not initialized yet, or no CMOS on this machine)
*/
ChipSet.prototype.addCMOSMemory = function(addr, size)
{
if (this.abCMOSData) {
var iCMOS = (addr < 0x100000? ChipSet.CMOS.ADDR.BASEMEM_LO : ChipSet.CMOS.ADDR.EXTMEM_LO);
var wKb = this.abCMOSData[iCMOS] | (this.abCMOSData[iCMOS+1] << 8);
wKb += (size >> 10);
this.abCMOSData[iCMOS] = wKb & 0xff;
this.abCMOSData[iCMOS+1] = wKb >> 8;
this.updateCMOSChecksum();
return true;
}
return false;
};
/**
* setCMOSDriveType(iDrive, bType)
*
* This is ONLY for use by the HDC component, to update the CMOS drive configuration to match HDC's internal configuration.
*
* TODO: Extend this to support FDC drive updates, so that FDC can eventually specify diskette drive types
* (ie, DSDD or DSHD) in the same way that HDC does; currently, MODEL_5170 diskette drives always default to DSHD
* (see getSWFloppyDriveType()).
*
* @this {ChipSet}
* @param {number} iDrive
* @param {number} bType
* @return {boolean} true if successful, false if not (eg, CMOS not initialized yet, or no CMOS on this machine)
*/
ChipSet.prototype.setCMOSDriveType = function(iDrive, bType)
{
if (this.abCMOSData) {
var b = this.abCMOSData[ChipSet.CMOS.ADDR.HDRIVE];
Component.assert(bType > 0 && bType < 0xf);
if (iDrive) {
b = (b & ChipSet.CMOS.HDRIVE.D0_MASK) | bType;
} else {
b = (b & ChipSet.CMOS.HDRIVE.D1_MASK) | (bType << 4);
}
this.setCMOSByte(ChipSet.CMOS.ADDR.HDRIVE, b);
return true;
}
return false;
};
/**
* updateCMOSChecksum()
*
* This sums all the CMOS bytes from 0x10-0x2D, creating a 16-bit checksum. That's a total of 30 (unsigned) 8-bit
* values which could sum to at most 30*255 or 7650 (0x1DE2). Since there's no way that can overflow 16 bits, we don't
@ -1312,15 +1346,15 @@ ChipSet.prototype.initCMOSData = function()
* WARNING: The IBM PC AT TechRef, p.1-53 (p.75) claims that the checksum is on bytes 0x10-0x20, but that's simply wrong.
*
* @this {ChipSet}
* @return {number} 16-bit checksum of CMOS bytes 0x10-0x2D
*/
ChipSet.prototype.getCMOSChecksum = function()
ChipSet.prototype.updateCMOSChecksum = function()
{
var wChecksum = 0;
for (var iCMOS = ChipSet.CMOS.ADDR.FDRIVE; iCMOS < ChipSet.CMOS.ADDR.CHKSUM_HI; iCMOS++) {
wChecksum += this.abCMOSData[iCMOS];
}
return wChecksum;
this.abCMOSData[ChipSet.CMOS.ADDR.CHKSUM_LO] = wChecksum & 0xff;
this.abCMOSData[ChipSet.CMOS.ADDR.CHKSUM_HI] = wChecksum >> 8;
};
/**
@ -1679,7 +1713,7 @@ ChipSet.prototype.getSWFloppyDrives = function(fInit)
ChipSet.prototype.getSWFloppyDriveType = function(iDrive)
{
/*
* TODO: For MODEL_5170, we default all floppy drive types to High Capacity, but more control would be nice.
* TODO: For MODEL_5170, we default all floppy drive types to DSHD, but more control would be nice.
*/
if (iDrive < this.getSWFloppyDrives()) {
return (this.model < ChipSet.MODEL_5170? ChipSet.FDRIVE.DSDD : ChipSet.FDRIVE.DSHD);
@ -1899,7 +1933,7 @@ ChipSet.prototype.dumpCMOS = function()
* @param {number} iDMAC
* @param {number} iChannel
* @param {number} port
* @param {number|undefined} addrFrom (not defined if the Debugger is trying to read the specified port)
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
* @return {number} simulated port value
*/
ChipSet.prototype.inDMAChannelAddr = function(iDMAC, iChannel, port, addrFrom)
@ -1920,7 +1954,7 @@ ChipSet.prototype.inDMAChannelAddr = function(iDMAC, iChannel, port, addrFrom)
* @param {number} iChannel
* @param {number} port
* @param {number} bOut
* @param {number|undefined} addrFrom (not defined if the Debugger is trying to read the specified port)
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
*/
ChipSet.prototype.outDMAChannelAddr = function outDMAChannelAddr(iDMAC, iChannel, port, bOut, addrFrom)
{
@ -1938,7 +1972,7 @@ ChipSet.prototype.outDMAChannelAddr = function outDMAChannelAddr(iDMAC, iChannel
* @param {number} iDMAC
* @param {number} iChannel
* @param {number} port
* @param {number|undefined} addrFrom (not defined if the Debugger is trying to read the specified port)
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
* @return {number} simulated port value
*/
ChipSet.prototype.inDMAChannelCount = function(iDMAC, iChannel, port, addrFrom)
@ -1959,7 +1993,7 @@ ChipSet.prototype.inDMAChannelCount = function(iDMAC, iChannel, port, addrFrom)
* @param {number} iChannel (ports 0x01, 0x03, 0x05, 0x07)
* @param {number} port
* @param {number} bOut
* @param {number|undefined} addrFrom (not defined if the Debugger is trying to read the specified port)
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
*/
ChipSet.prototype.outDMAChannelCount = function(iDMAC, iChannel, port, bOut, addrFrom)
{
@ -1976,7 +2010,7 @@ ChipSet.prototype.outDMAChannelCount = function(iDMAC, iChannel, port, bOut, add
* @this {ChipSet}
* @param {number} iDMAC
* @param {number} port
* @param {number|undefined} addrFrom (not defined if the Debugger is trying to read the specified port)
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
* @return {number} simulated port value
*
* From the 8237A spec:
@ -1991,13 +2025,13 @@ ChipSet.prototype.outDMAChannelCount = function(iDMAC, iChannel, port, bOut, add
* Bits 47 are set whenever their corresponding channel is requesting service."
*
* TRIVIA: This hook wasn't installed when I was testing with the MODEL_5150 ROM BIOS, and it
* didn't matter, but the MODEL_5160 ROM BIOS checks it several times, including @ F000:E156, where
* didn't matter, but the MODEL_5160 ROM BIOS checks it several times, including @F000:E156, where
* it verifies that TIMER1 didn't request service on channel 0.
*/
ChipSet.prototype.inDMAStatus = function(iDMAC, port, addrFrom)
{
/*
* HACK: Unlike the MODEL_5150, the MODEL_5160 ROM BIOS checks DMA channel 0 for TC (@ F000:E4DF)
* HACK: Unlike the MODEL_5150, the MODEL_5160 ROM BIOS checks DMA channel 0 for TC (@F000:E4DF)
* after running a number of unrelated tests, since enough time would have passed for channel 0 to
* have reached TC at least once. So I simply OR in a hard-coded TC bit for channel 0 every time
* status is read.
@ -2016,7 +2050,7 @@ ChipSet.prototype.inDMAStatus = function(iDMAC, port, addrFrom)
* @param {number} iDMAC
* @param {number} port
* @param {number} bOut
* @param {number|undefined} addrFrom (not defined if the Debugger is trying to read the specified port)
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
*/
ChipSet.prototype.outDMACmd = function(iDMAC, port, bOut, addrFrom)
{
@ -2031,7 +2065,7 @@ ChipSet.prototype.outDMACmd = function(iDMAC, port, bOut, addrFrom)
* @param {number} iDMAC
* @param {number} port
* @param {number} bOut
* @param {number|undefined} addrFrom (not defined if the Debugger is trying to read the specified port)
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
*
* From the 8237A spec:
*
@ -2066,7 +2100,7 @@ ChipSet.prototype.outDMAReq = function(iDMAC, port, bOut, addrFrom)
* @param {number} iDMAC
* @param {number} port
* @param {number} bOut
* @param {number|undefined} addrFrom (not defined if the Debugger is trying to read the specified port)
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
*/
ChipSet.prototype.outDMAMask = function(iDMAC, port, bOut, addrFrom)
{
@ -2085,7 +2119,7 @@ ChipSet.prototype.outDMAMask = function(iDMAC, port, bOut, addrFrom)
* @param {number} iDMAC
* @param {number} port
* @param {number} bOut
* @param {number|undefined} addrFrom (not defined if the Debugger is trying to read the specified port)
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
*/
ChipSet.prototype.outDMAMode = function(iDMAC, port, bOut, addrFrom)
{
@ -2101,7 +2135,7 @@ ChipSet.prototype.outDMAMode = function(iDMAC, port, bOut, addrFrom)
* @param {number} iDMAC
* @param {number} port
* @param {number} bOut
* @param {number|undefined} addrFrom (not defined if the Debugger is trying to read the specified port)
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
*
* Any write to this port simply resets the controller's "first/last flip-flop", which determines whether the even or odd byte
* of a DMA address or count register will be accessed next.
@ -2119,7 +2153,7 @@ ChipSet.prototype.outDMAIndex = function(iDMAC, port, bOut, addrFrom)
* @param {number} iDMAC
* @param {number} port
* @param {number} bOut
* @param {number|undefined} addrFrom (not defined if the Debugger is trying to read the specified port)
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
*/
ChipSet.prototype.outDMAClear = function(iDMAC, port, bOut, addrFrom)
{
@ -2140,7 +2174,7 @@ ChipSet.prototype.outDMAClear = function(iDMAC, port, bOut, addrFrom)
* @param {number} iDMAC
* @param {number} iChannel
* @param {number} port
* @param {number|undefined} addrFrom (not defined if the Debugger is trying to read the specified port)
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
* @return {number} simulated port value
*/
ChipSet.prototype.inDMAPageReg = function(iDMAC, iChannel, port, addrFrom)
@ -2158,7 +2192,7 @@ ChipSet.prototype.inDMAPageReg = function(iDMAC, iChannel, port, addrFrom)
* @param {number} iChannel
* @param {number} port
* @param {number} bOut
* @param {number|undefined} addrFrom (not defined if the Debugger is trying to read the specified port)
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
*/
ChipSet.prototype.outDMAPageReg = function(iDMAC, iChannel, port, bOut, addrFrom)
{
@ -2172,7 +2206,7 @@ ChipSet.prototype.outDMAPageReg = function(iDMAC, iChannel, port, bOut, addrFrom
* @this {ChipSet}
* @param {number} iSpare
* @param {number} port
* @param {number|undefined} addrFrom (not defined if the Debugger is trying to read the specified port)
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
* @return {number} simulated port value
*/
ChipSet.prototype.inDMAPageSpare = function(iSpare, port, addrFrom)
@ -2189,7 +2223,7 @@ ChipSet.prototype.inDMAPageSpare = function(iSpare, port, addrFrom)
* @param {number} iSpare
* @param {number} port
* @param {number} bOut
* @param {number|undefined} addrFrom (not defined if the Debugger is trying to read the specified port)
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
*/
ChipSet.prototype.outDMAPageSpare = function(iSpare, port, bOut, addrFrom)
{
@ -2459,7 +2493,7 @@ ChipSet.prototype.updateDMA = function(channel)
*
* @this {ChipSet}
* @param {number} iPIC
* @param {number|undefined} addrFrom (not defined if the Debugger is trying to read the specified port)
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
* @return {number} simulated port value
*/
ChipSet.prototype.inPICL = function(iPIC, addrFrom)
@ -2489,7 +2523,7 @@ ChipSet.prototype.inPICL = function(iPIC, addrFrom)
* @this {ChipSet}
* @param {number} iPIC
* @param {number} bOut
* @param {number|undefined} addrFrom (not defined if the Debugger is trying to read the specified port)
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
*/
ChipSet.prototype.outPICL = function(iPIC, bOut, addrFrom)
{
@ -2617,7 +2651,7 @@ ChipSet.prototype.outPICL = function(iPIC, bOut, addrFrom)
*
* @this {ChipSet}
* @param {number} iPIC
* @param {number|undefined} addrFrom (not defined if the Debugger is trying to read the specified port)
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
* @return {number} simulated port value
*/
ChipSet.prototype.inPICH = function(iPIC, addrFrom)
@ -2634,7 +2668,7 @@ ChipSet.prototype.inPICH = function(iPIC, addrFrom)
* @this {ChipSet}
* @param {number} iPIC
* @param {number} bOut
* @param {number|undefined} addrFrom (not defined if the Debugger is trying to read the specified port)
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
*/
ChipSet.prototype.outPICH = function(iPIC, bOut, addrFrom)
{
@ -2837,7 +2871,7 @@ ChipSet.prototype.getIRRVector = function(iPIC)
*
* @this {ChipSet}
* @param {number} iTimer (ports 0x40, 0x41, 0x42)
* @param {number|undefined} addrFrom (not defined if the Debugger is trying to read the specified port)
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
* @return {number} simulated port value
*/
ChipSet.prototype.inTimer = function(iTimer, addrFrom)
@ -2860,7 +2894,7 @@ ChipSet.prototype.inTimer = function(iTimer, addrFrom)
* @this {ChipSet}
* @param {number} iTimer (ports 0x40, 0x41, 0x42)
* @param {number} bOut
* @param {number|undefined} addrFrom (not defined if the Debugger is trying to read the specified port)
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
*/
ChipSet.prototype.outTimer = function(iTimer, bOut, addrFrom)
{
@ -2942,7 +2976,7 @@ ChipSet.prototype.outTimer = function(iTimer, bOut, addrFrom)
*
* @this {ChipSet}
* @param {number} port (0x43)
* @param {number|undefined} addrFrom (not defined if the Debugger is trying to read the specified port)
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
* @return {number|null} simulated port value
*/
ChipSet.prototype.inTimerCtrl = function(port, addrFrom)
@ -2958,7 +2992,7 @@ ChipSet.prototype.inTimerCtrl = function(port, addrFrom)
* @this {ChipSet}
* @param {number} port (0x43)
* @param {number} bOut
* @param {number|undefined} addrFrom (not defined if the Debugger is trying to read the specified port)
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
*/
ChipSet.prototype.outTimerCtrl = function(port, bOut, addrFrom)
{
@ -2984,14 +3018,14 @@ ChipSet.prototype.outTimerCtrl = function(port, bOut, addrFrom)
this.setTimerMode(iTimer, bcd, mode, rw);
/*
* The 5150 ROM BIOS code @ F000:E285 ("TEST.7") would fail after a warm boot (eg, after a CTRL-ALT-DEL) because
* The 5150 ROM BIOS code @F000:E285 ("TEST.7") would fail after a warm boot (eg, after a CTRL-ALT-DEL) because
* it assumed that no TIMER0 interrupt would occur between the point it unmasked the TIMER0 interrupt and the
* point it started reprogramming TIMER0.
*
* Similarly, the 5160 ROM BIOS @ F000:E35D ("8253 TIMER CHECKOUT") would fail after initializing the EGA BIOS,
* Similarly, the 5160 ROM BIOS @F000:E35D ("8253 TIMER CHECKOUT") would fail after initializing the EGA BIOS,
* because the EGA BIOS uses TIMER0 during its diagnostics; as in the previous example, by the time the 8253
* test code runs later, there's now a pending TIMER0 interrupt, which triggers an interrupt as soon as IRQ0 is
* unmasked @ F000:E364.
* unmasked @F000:E364.
*
* After looking at this problem at bit more closely the second time around (while debugging the EGA BIOS),
* it turns out I missed an important 8253 feature: whenever a new MODE0 control word OR a new MODE0 count
@ -3003,7 +3037,7 @@ ChipSet.prototype.outTimerCtrl = function(port, bOut, addrFrom)
if (iTimer == ChipSet.TIMER0.INDEX) this.clearIRR(ChipSet.IRQ.TIMER0);
/*
* Another TIMER0 HACK: The "CASSETTE DATA WRAP TEST" @ F000:E51E occasionally reports an error when the second of
* Another TIMER0 HACK: The "CASSETTE DATA WRAP TEST" @F000:E51E occasionally reports an error when the second of
* two TIMER0 counts it latches is greater than the first. You would think the ROM BIOS would expect this, since
* TIMER0 can reload its count at any time. Is the ROM BIOS assuming that TIMER0 was initialized sufficiently
* recently that this should never happen? I'm not sure, but for now, let's try resetting TIMER0's count immediately
@ -3237,7 +3271,7 @@ ChipSet.prototype.updateTimer = function(iTimer, fCycleReset)
}
/*
* Early implementation of this mode was minimal because when using this mode, the ROM BIOS simply wanted
* to see the count changing; it wasn't looking for interrupts. See ROM BIOS "TEST.03" code @ F000:E0DE,
* to see the count changing; it wasn't looking for interrupts. See ROM BIOS "TEST.03" code @F000:E0DE,
* where TIMER1 is programmed for MODE2, LSB (the same settings, incidentally, used immediately afterward
* for TIMER1 in conjunction with DMA channel 0 memory refreshes).
*
@ -3337,7 +3371,7 @@ ChipSet.prototype.updateAllTimers = function(fCycleReset)
*
* @this {ChipSet}
* @param {number} port (0x60)
* @param {number|undefined} addrFrom (not defined if the Debugger is trying to read the specified port)
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
* @return {number} simulated port value
*/
ChipSet.prototype.inPPIA = function(port, addrFrom)
@ -3361,7 +3395,7 @@ ChipSet.prototype.inPPIA = function(port, addrFrom)
* @this {ChipSet}
* @param {number} port (0x60)
* @param {number} bOut
* @param {number|undefined} addrFrom (not defined if the Debugger is trying to read the specified port)
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
*/
ChipSet.prototype.outPPIA = function(port, bOut, addrFrom)
{
@ -3374,7 +3408,7 @@ ChipSet.prototype.outPPIA = function(port, bOut, addrFrom)
*
* @this {ChipSet}
* @param {number} port (0x61)
* @param {number|undefined} addrFrom (not defined if the Debugger is trying to read the specified port)
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
* @return {number} simulated port value
*/
ChipSet.prototype.inPPIB = function(port, addrFrom)
@ -3390,7 +3424,7 @@ ChipSet.prototype.inPPIB = function(port, addrFrom)
* @this {ChipSet}
* @param {number} port (0x61)
* @param {number} bOut
* @param {number|undefined} addrFrom (not defined if the Debugger is trying to read the specified port)
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
*/
ChipSet.prototype.outPPIB = function(port, bOut, addrFrom)
{
@ -3417,7 +3451,7 @@ ChipSet.prototype.updatePPIB = function(bOut)
this.bPPIB = bOut;
if (fNewSpeaker != fOldSpeaker) {
/*
* Originally, this code didn't catch the "ERROR_BEEP" case @ F000:EC34, which first turns both PPI_B.CLK_TIMER2 (0x01)
* Originally, this code didn't catch the "ERROR_BEEP" case @F000:EC34, which first turns both PPI_B.CLK_TIMER2 (0x01)
* and PPI_B.SPK_TIMER2 (0x02) off, then turns on only PPI_B.SPK_TIMER2 (0x02), then restores the original port value.
*
* So, when the ROM BIOS keyboard buffer got full, we didn't issue a BEEP alert. I've fixed that by limiting the test
@ -3432,7 +3466,7 @@ ChipSet.prototype.updatePPIB = function(bOut)
*
* @this {ChipSet}
* @param {number} port (0x62)
* @param {number|undefined} addrFrom (not defined if the Debugger is trying to read the specified port)
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
* @return {number} simulated port value
*/
ChipSet.prototype.inPPIC = function(port, addrFrom)
@ -3481,7 +3515,7 @@ ChipSet.prototype.inPPIC = function(port, addrFrom)
* @this {ChipSet}
* @param {number} port (0x62)
* @param {number} bOut
* @param {number|undefined} addrFrom (not defined if the Debugger is trying to read the specified port)
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
*/
ChipSet.prototype.outPPIC = function(port, bOut, addrFrom)
{
@ -3494,7 +3528,7 @@ ChipSet.prototype.outPPIC = function(port, bOut, addrFrom)
*
* @this {ChipSet}
* @param {number} port (0x63)
* @param {number|undefined} addrFrom (not defined if the Debugger is trying to read the specified port)
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
* @return {number} simulated port value
*/
ChipSet.prototype.inPPICtrl = function(port, addrFrom)
@ -3510,7 +3544,7 @@ ChipSet.prototype.inPPICtrl = function(port, addrFrom)
* @this {ChipSet}
* @param {number} port (0x63)
* @param {number} bOut
* @param {number|undefined} addrFrom (not defined if the Debugger is trying to write the specified port)
* @param {number} [addrFrom] (not defined if the Debugger is trying to write the specified port)
*/
ChipSet.prototype.outPPICtrl = function(port, bOut, addrFrom)
{
@ -3523,7 +3557,7 @@ ChipSet.prototype.outPPICtrl = function(port, bOut, addrFrom)
*
* @this {ChipSet}
* @param {number} port (0x60)
* @param {number|undefined} addrFrom (not defined if the Debugger is trying to read the specified port)
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
* @return {number} simulated port value
*/
ChipSet.prototype.in8042OutBuff = function(port, addrFrom)
@ -3546,7 +3580,7 @@ ChipSet.prototype.in8042OutBuff = function(port, addrFrom)
* @this {ChipSet}
* @param {number} port (0x60)
* @param {number} bOut
* @param {number|undefined} addrFrom (not defined if the Debugger is trying to write the specified port)
* @param {number} [addrFrom] (not defined if the Debugger is trying to write the specified port)
*/
ChipSet.prototype.out8042InBuffData = function(port, bOut, addrFrom)
{
@ -3644,7 +3678,7 @@ ChipSet.prototype.out8042InBuffData = function(port, bOut, addrFrom)
*
* @this {ChipSet}
* @param {number} port (0x61)
* @param {number|undefined} addrFrom (not defined if the Debugger is trying to read the specified port)
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
* @return {number} simulated port value
*/
ChipSet.prototype.in8042RWReg = function(port, addrFrom)
@ -3668,7 +3702,7 @@ ChipSet.prototype.in8042RWReg = function(port, addrFrom)
* @this {ChipSet}
* @param {number} port (0x61)
* @param {number} bOut
* @param {number|undefined} addrFrom (not defined if the Debugger is trying to read the specified port)
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
*/
ChipSet.prototype.out8042RWReg = function(port, bOut, addrFrom)
{
@ -3681,7 +3715,7 @@ ChipSet.prototype.out8042RWReg = function(port, bOut, addrFrom)
*
* @this {ChipSet}
* @param {number} port (0x64)
* @param {number|undefined} addrFrom (not defined if the Debugger is trying to read the specified port)
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
* @return {number} simulated port value
*/
ChipSet.prototype.in8042Status = function(port, addrFrom)
@ -3720,7 +3754,7 @@ ChipSet.prototype.in8042Status = function(port, addrFrom)
* @this {ChipSet}
* @param {number} port (0x64)
* @param {number} bOut
* @param {number|undefined} addrFrom (not defined if the Debugger is trying to write the specified port)
* @param {number} [addrFrom] (not defined if the Debugger is trying to write the specified port)
*/
ChipSet.prototype.out8042InBuffCmd = function(port, bOut, addrFrom)
{
@ -3841,7 +3875,7 @@ ChipSet.prototype.set8042OutPort = function(b)
*
* @this {ChipSet}
* @param {number} port (0x70)
* @param {number|undefined} addrFrom (not defined if the Debugger is trying to read the specified port)
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
* @return {number} simulated port value
*/
ChipSet.prototype.inCMOSAddr = function(port, addrFrom)
@ -3856,7 +3890,7 @@ ChipSet.prototype.inCMOSAddr = function(port, addrFrom)
* @this {ChipSet}
* @param {number} port (0x70)
* @param {number} bOut
* @param {number|undefined} addrFrom (not defined if the Debugger is trying to write the specified port)
* @param {number} [addrFrom] (not defined if the Debugger is trying to write the specified port)
*/
ChipSet.prototype.outCMOSAddr = function(port, bOut, addrFrom)
{
@ -3870,7 +3904,7 @@ ChipSet.prototype.outCMOSAddr = function(port, bOut, addrFrom)
*
* @this {ChipSet}
* @param {number} port (0x71)
* @param {number|undefined} addrFrom (not defined if the Debugger is trying to read the specified port)
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
* @return {number} simulated port value
*/
ChipSet.prototype.inCMOSData = function(port, addrFrom)
@ -3887,7 +3921,7 @@ ChipSet.prototype.inCMOSData = function(port, addrFrom)
* @this {ChipSet}
* @param {number} port (0x71)
* @param {number} bOut
* @param {number|undefined} addrFrom (not defined if the Debugger is trying to write the specified port)
* @param {number} [addrFrom] (not defined if the Debugger is trying to write the specified port)
*/
ChipSet.prototype.outCMOSData = function(port, bOut, addrFrom)
{
@ -3901,7 +3935,7 @@ ChipSet.prototype.outCMOSData = function(port, bOut, addrFrom)
*
* @this {ChipSet}
* @param {number} port (0x80)
* @param {number|undefined} addrFrom (not defined if the Debugger is trying to read the specified port)
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
* @return {number} simulated port value
*/
ChipSet.prototype.inMFGData = function(port, addrFrom)
@ -3916,7 +3950,7 @@ ChipSet.prototype.inMFGData = function(port, addrFrom)
* @this {ChipSet}
* @param {number} port (0x80)
* @param {number} bOut
* @param {number|undefined} addrFrom (not defined if the Debugger is trying to write the specified port)
* @param {number} [addrFrom] (not defined if the Debugger is trying to write the specified port)
*/
ChipSet.prototype.outMFGData = function(port, bOut, addrFrom)
{
@ -3932,7 +3966,7 @@ ChipSet.prototype.outMFGData = function(port, bOut, addrFrom)
* @this {ChipSet}
* @param {number} port (0xA0)
* @param {number} bOut
* @param {number|undefined} addrFrom (not defined if the Debugger is trying to write the specified port)
* @param {number} [addrFrom] (not defined if the Debugger is trying to write the specified port)
*/
ChipSet.prototype.outNMI = function(port, bOut, addrFrom)
{
@ -3940,50 +3974,6 @@ ChipSet.prototype.outNMI = function(port, bOut, addrFrom)
this.bNMI = bOut;
};
/**
* inHFCCtrl(port, addrFrom)
*
* @this {ChipSet}
* @param {number} port (0x1F4)
* @param {number|undefined} addrFrom (not defined if the Debugger is trying to read the specified port)
* @return {number} simulated port value
*/
ChipSet.prototype.inHFCCtrl = function(port, addrFrom)
{
var b = this.regsHFCombo.bCtrl;
this.messagePort(port, null, addrFrom, "HFC_CTRL", ChipSet.MESSAGE_CHIPSET, b);
return b;
};
/**
* outHFCCtrl(port, bOut, addrFrom)
*
* @this {ChipSet}
* @param {number} port (0x1F4)
* @param {number} bOut
* @param {number|undefined} addrFrom (not defined if the Debugger is trying to write the specified port)
*/
ChipSet.prototype.outHFCCtrl = function(port, bOut, addrFrom)
{
this.messagePort(port, bOut, addrFrom, "HFC_CTRL", ChipSet.MESSAGE_CHIPSET);
this.regsHFCombo.bCtrl = bOut;
};
/**
* inHFCStatus(port, addrFrom)
*
* @this {ChipSet}
* @param {number} port (0x1F7)
* @param {number|undefined} addrFrom (not defined if the Debugger is trying to read the specified port)
* @return {number} simulated port value
*/
ChipSet.prototype.inHFCStatus = function(port, addrFrom)
{
var b = this.regsHFCombo.bStatus;
this.messagePort(port, null, addrFrom, "HFC_STATUS", ChipSet.MESSAGE_CHIPSET, b);
return b;
};
/**
* intBIOSRTC(addr)
*
@ -4210,9 +4200,7 @@ ChipSet.aPortInput5170 = {
0xCA: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAChannelCount(ChipSet.DMA1.INDEX, 2, port, addrFrom); },
0xCC: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAChannelAddr(ChipSet.DMA1.INDEX, 3, port, addrFrom); },
0xCE: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAChannelCount(ChipSet.DMA1.INDEX, 3, port, addrFrom); },
0xD0: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAStatus(ChipSet.DMA1.INDEX, port, addrFrom); },
0x1F4: ChipSet.prototype.inHFCCtrl, // refer to comments regarding HFCOMBO.CTRL
0x1F7: ChipSet.prototype.inHFCStatus // refer to comments regarding HFCOMBO.STATUS
0xD0: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAStatus(ChipSet.DMA1.INDEX, port, addrFrom); }
};
/*
@ -4286,8 +4274,7 @@ ChipSet.aPortOutput5170 = {
0xD4: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAMask(ChipSet.DMA1.INDEX, port, bOut, addrFrom); },
0xD6: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAMode(ChipSet.DMA1.INDEX, port, bOut, addrFrom); },
0xD8: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAIndex(ChipSet.DMA1.INDEX, port, bOut, addrFrom); },
0xDA: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAClear(ChipSet.DMA1.INDEX, port, bOut, addrFrom); },
0x1F4: ChipSet.prototype.outHFCCtrl // refer to comments regarding HFCOMBO.CTRL
0xDA: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAClear(ChipSet.DMA1.INDEX, port, bOut, addrFrom); }
};
/**

View file

@ -262,9 +262,7 @@ CPU.prototype.powerUp = function(data, fRepower)
}
}
this.fPowered = true;
if (!this.autoStart() && this.dbg) {
this.dbg.updateStatus();
}
if (!this.autoStart() && this.dbg) this.dbg.updateStatus();
this.updateCPU();
return true;
};

View file

@ -1562,7 +1562,7 @@ if (DEBUGGER) {
*/
if (fUpdateCPU !== false) this.cpu.updateCPU();
this.updateStatus(!fRegs);
this.updateStatus(fRegs, false);
return (this.nCycles > 0);
};
@ -1580,23 +1580,27 @@ if (DEBUGGER) {
};
/**
* updateStatus(fStep)
* updateStatus(fRegs, fCompact)
*
* @this {Debugger}
* @param {boolean|undefined} [fStep]
* @param {boolean} [fRegs] (default is true)
* @param {boolean} [fCompact] (default is true)
*/
Debugger.prototype.updateStatus = function(fStep)
Debugger.prototype.updateStatus = function(fRegs, fCompact)
{
if (fRegs === undefined) fRegs = true;
if (fCompact === undefined) fCompact = true;
this.aAddrNextCode = this.newAddr(this.cpu.regIP, this.cpu.segCS.sel);
/*
* this.fProcStep used to be a simple boolean, but now it's 0 (or undefined)
* if inactive, 1 if stepping over an instruction without a register dump, or 2
* if stepping over an instruction with a register dump.
*/
if (fStep || this.fProcStep == 1)
if (!fRegs || this.fProcStep == 1)
this.doUnassemble();
else {
this.doRegisters();
this.doRegisters(null, fCompact);
}
};
@ -1800,7 +1804,7 @@ if (DEBUGGER) {
}
this.println(sStopped);
}
this.updateStatus();
this.updateStatus(true, this.fProcStep != 2);
this.setFocus();
this.clearTempBreakpoint(this.cpu.regEIP);
}
@ -2432,6 +2436,12 @@ if (DEBUGGER) {
else if (typeMode == Debugger.TYPE_IMPSEG) {
sOperand = Debugger.asRegs[((type & Debugger.TYPE_IREG) >> 8) + 16];
}
else if (typeMode == Debugger.TYPE_DSSI) {
sOperand = "DS:[SI]";
}
else if (typeMode == Debugger.TYPE_ESDI) {
sOperand = "ES:[DI]";
}
if (!sOperand.length) {
sOperand = "type(" + str.toHexWord(type) + ")";
}
@ -3507,7 +3517,7 @@ if (DEBUGGER) {
var cLines = 10;
var iHistory = this.iOpcodeHistory;
var aHistory = this.aOpcodeHistory;
if (aHistory !== undefined) {
if (aHistory.length) {
var n = (sCount === undefined? this.nextHistory : parseInt(sCount, 10));
if (isNaN(n))
n = cLines;
@ -3630,7 +3640,7 @@ if (DEBUGGER) {
this.println("\ninput commands:");
this.println("\ti [p]\tread port [p]");
/*
* NOTE: Regarding this warning, it might be nice if we had an "Unchecked" version of
* NOTE: Regarding this warning, it might be nice if we had an "unchecked" version of
* bus.checkPortInputNotify(), since all Debugger memory accesses are unchecked, too.
*
* All port I/O handlers ARE aware when the Debugger is calling (addrFrom is undefined),
@ -3921,12 +3931,13 @@ if (DEBUGGER) {
};
/**
* doRegisters(asArgs)
* doRegisters(asArgs, fCompact)
*
* @this {Debugger}
* @param {Array.<string>} [asArgs]
* @param {boolean} [fCompact]
*/
Debugger.prototype.doRegisters = function(asArgs)
Debugger.prototype.doRegisters = function(asArgs, fCompact)
{
if (asArgs && asArgs[1] == "?") {
this.println("\nregister commands:");
@ -3937,7 +3948,7 @@ if (DEBUGGER) {
return;
}
var fIns = true, fProt;
if (asArgs !== undefined && asArgs.length > 1) {
if (asArgs != null && asArgs.length > 1) {
var sReg = asArgs[1];
if (sReg == 'p') {
/*
@ -4074,7 +4085,7 @@ if (DEBUGGER) {
}
}
this.println('\n' + this.getRegStr(fProt));
this.println((fCompact? '' : '\n') + this.getRegStr(fProt));
if (fIns) {
this.aAddrNextCode = this.newAddr(this.cpu.regIP, this.cpu.segCS.sel);

View file

@ -679,8 +679,8 @@ FDC.prototype.initController = function(data)
var dataDrives = data[i++];
/*
* Initialize the disk history (if available) before initializing the drives,
* so that any disk deltas can be applied to disk images that are already loaded.
* Initialize the disk history (if available) before initializing the drives, so that any disk deltas can be
* applied to disk images that are already loaded.
*/
var aDiskHistory = data[i++];
if (aDiskHistory != null) this.aDiskHistory = aDiskHistory;
@ -1334,7 +1334,7 @@ FDC.prototype.updateDiskHistory = function(sDisketteName, sDiskettePath, disk)
* @this {FDC}
* @param {number} port (0x3F2, output only)
* @param {number} bOut
* @param {number|undefined} addrFrom (not defined whenever the Debugger tries to read the specified port)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
*/
FDC.prototype.outFDCOutput = function(port, bOut, addrFrom)
{
@ -1384,7 +1384,7 @@ FDC.prototype.outFDCOutput = function(port, bOut, addrFrom)
*
* @this {FDC}
* @param {number} port (0x3F4, input only)
* @param {number|undefined} addrFrom (not defined whenever the Debugger tries to read the specified port)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number} simulated port value
*/
FDC.prototype.inFDCStatus = function(port, addrFrom)
@ -1398,7 +1398,7 @@ FDC.prototype.inFDCStatus = function(port, addrFrom)
*
* @this {FDC}
* @param {number} port (0x3F5, input/output)
* @param {number|undefined} addrFrom (not defined whenever the Debugger tries to read the specified port)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number} simulated port value
*/
FDC.prototype.inFDCData = function(port, addrFrom)
@ -1427,7 +1427,7 @@ FDC.prototype.inFDCData = function(port, addrFrom)
* @this {FDC}
* @param {number} port (0x3F5, input/output)
* @param {number} bOut
* @param {number|undefined} addrFrom (not defined whenever the Debugger tries to read the specified port)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
*/
FDC.prototype.outFDCData = function(port, bOut, addrFrom)
{
@ -1452,7 +1452,7 @@ FDC.prototype.outFDCData = function(port, bOut, addrFrom)
*
* @this {FDC}
* @param {number} port (0x3F7, input only, MODEL_5170 only)
* @param {number|undefined} addrFrom (not defined whenever the Debugger tries to read the specified port)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number} simulated port value
*/
FDC.prototype.inFDCInput = function(port, addrFrom)
@ -1472,7 +1472,7 @@ FDC.prototype.inFDCInput = function(port, addrFrom)
* @this {FDC}
* @param {number} port (0x3F7, output only, MODEL_5170 only)
* @param {number} bOut
* @param {number|undefined} addrFrom (not defined whenever the Debugger tries to read the specified port)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
*/
FDC.prototype.outFDCControl = function(port, bOut, addrFrom)
{
@ -1480,60 +1480,6 @@ FDC.prototype.outFDCControl = function(port, bOut, addrFrom)
this.regControl = bOut;
};
/**
* intBIOSDiskette(addr)
*
* NOTE: This function tries to differentiate FDC requests from HDC requests, by whether the INT 0x13 drive number
* in DL is < 0x80; however, not all INT 0x13 functions required a drive number in DL, and not all callers supplied one.
*
* INT 0x13 Quick Reference:
*
* AH
* ----
* 0x00 Reset
* 0x01 Get status (from last operation)
* 0x02 Read sectors
* 0x03 Write sectors
* 0x04 Verify sectors
* 0x05 Format track
*
* For Read, Write, Verify and Format commands:
*
* DL drive number (0-3 allowed, value checked)
* DH head number (0-1 allowed, not value checked)
* CH track number (0-39 allowed, not value checked [which is good, because high-density diskettes go up to 80 tracks])
* CL sector number (1-8 allowed, not value checked [which is good, because support for 9-sector tracks was later added])
* AL number of sectors (max of 8, not value checked)
* ES:BX sector buffer
*
* @this {FDC}
* @param {number} addr
* @return {boolean} true to proceed with the INT 0x13 software interrupt, false to skip
*/
FDC.prototype.intBIOSDiskette = function(addr)
{
if (DEBUGGER) {
var AL = this.cpu.regAX & 0xff;
var AH = this.cpu.regAX >> 8;
var CL = this.cpu.regCX & 0xff;
var CH = this.cpu.regCX >> 8;
var DL = this.cpu.regDX & 0xff;
var DH = this.cpu.regDX >> 8;
if (this.dbg && this.dbg.messageEnabled(this.dbg.MESSAGE_FDC) && DL < 0x80) {
this.dbg.message("FDC.intBIOS(AH=" + str.toHexByte(AH) + ",D=" + str.toHexByte(DL) + ",C=" + str.toHexByte(CH) + ",H=" + str.toHexByte(DH) + ",S=" + str.toHexByte(CL) + ",N=" + str.toHexByte(AL) + ") at " + str.toHexAddr(addr - this.cpu.segCS.base, this.cpu.segCS.sel));
// this.cpu.haltCPU();
this.cpu.addInterruptReturn(addr, function (fdc, nCycles) {
return function onBIOSDisketteReturn(nLevel) {
nCycles = fdc.cpu.getCycles() - nCycles;
fdc.messageDebugger("FDC.intBIOS(" + nLevel + "): C=" + (fdc.cpu.getCF()? 1 : 0) + " (cycles=" + nCycles + ")");
// if (DEBUG && nCycles > 10000) fdc.cpu.haltCPU();
};
}(this, this.cpu.getCycles()));
}
}
return true;
};
/**
* doCmd()
*
@ -2086,6 +2032,60 @@ FDC.prototype.writeFormat = function(drive, b)
return b;
};
/**
* intBIOSDiskette(addr)
*
* NOTE: This function tries to differentiate FDC requests from HDC requests, by whether the INT 0x13 drive number
* in DL is < 0x80; however, not all INT 0x13 functions required a drive number in DL, and not all callers supplied one.
*
* INT 0x13 Quick Reference:
*
* AH
* ----
* 0x00 Reset
* 0x01 Get status (from last operation)
* 0x02 Read sectors
* 0x03 Write sectors
* 0x04 Verify sectors
* 0x05 Format track
*
* For Read, Write, Verify and Format commands:
*
* DL drive number (0-3 allowed, value checked)
* DH head number (0-1 allowed, not value checked)
* CH track number (0-39 allowed, not value checked [which is good, because high-density diskettes go up to 80 tracks])
* CL sector number (1-8 allowed, not value checked [which is good, because support for 9-sector tracks was later added])
* AL number of sectors (max of 8, not value checked)
* ES:BX sector buffer
*
* @this {FDC}
* @param {number} addr
* @return {boolean} true to proceed with the INT 0x13 software interrupt, false to skip
*/
FDC.prototype.intBIOSDiskette = function(addr)
{
if (DEBUGGER) {
var AL = this.cpu.regAX & 0xff;
var AH = this.cpu.regAX >> 8;
var CL = this.cpu.regCX & 0xff;
var CH = this.cpu.regCX >> 8;
var DL = this.cpu.regDX & 0xff;
var DH = this.cpu.regDX >> 8;
if (this.dbg && this.dbg.messageEnabled(this.dbg.MESSAGE_FDC) && DL < 0x80) {
this.dbg.message("FDC.intBIOS(AH=" + str.toHexByte(AH) + ",D=" + str.toHexByte(DL) + ",C=" + str.toHexByte(CH) + ",H=" + str.toHexByte(DH) + ",S=" + str.toHexByte(CL) + ",N=" + str.toHexByte(AL) + ") at " + str.toHexAddr(addr - this.cpu.segCS.base, this.cpu.segCS.sel));
// this.cpu.haltCPU();
this.cpu.addInterruptReturn(addr, function (fdc, nCycles) {
return function onBIOSDisketteReturn(nLevel) {
nCycles = fdc.cpu.getCycles() - nCycles;
fdc.messageDebugger("FDC.intBIOS(" + nLevel + "): C=" + (fdc.cpu.getCF()? 1 : 0) + " (cycles=" + nCycles + ")");
// if (DEBUG && nCycles > 10000) fdc.cpu.haltCPU();
};
}(this, this.cpu.getCycles()));
}
}
return true;
};
/**
* messageDebugger(sMessage)
*

File diff suppressed because it is too large Load diff

View file

@ -180,6 +180,7 @@ RAM.prototype.reset = function() {
if (MAXDEBUG) this.status("ROM BIOS memory test has been disabled");
this.bus.setWordDirect(ROM.BIOS.RESET_FLAG, ROM.BIOS.RESET_FLAG_WARMBOOT);
}
if (this.chipset) this.chipset.addCMOSMemory(this.addrRAM, this.sizeRAM);
} else {
this.error("No RAM allocated");
}

View file

@ -503,7 +503,7 @@ SerialPort.prototype.advanceRBR = function() {
*
* @this {SerialPort}
* @param {number} port (0x3F8 or 0x2F8)
* @param {number|undefined} addrFrom (not defined whenever the Debugger tries to read the specified port)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number} simulated port value
*/
SerialPort.prototype.inRBR = function(port, addrFrom) {
@ -519,7 +519,7 @@ SerialPort.prototype.inRBR = function(port, addrFrom) {
*
* @this {SerialPort}
* @param {number} port (0x3F9 or 0x2F9)
* @param {number|undefined} addrFrom (not defined whenever the Debugger tries to read the specified port)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number} simulated port value
*/
SerialPort.prototype.inIER = function(port, addrFrom) {
@ -533,7 +533,7 @@ SerialPort.prototype.inIER = function(port, addrFrom) {
*
* @this {SerialPort}
* @param {number} port (0x3FA or 0x2FA)
* @param {number|undefined} addrFrom (not defined whenever the Debugger tries to read the specified port)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number} simulated port value
*/
SerialPort.prototype.inIIR = function(port, addrFrom) {
@ -547,7 +547,7 @@ SerialPort.prototype.inIIR = function(port, addrFrom) {
*
* @this {SerialPort}
* @param {number} port (0x3FB or 0x2FB)
* @param {number|undefined} addrFrom (not defined whenever the Debugger tries to read the specified port)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number} simulated port value
*/
SerialPort.prototype.inLCR = function(port, addrFrom) {
@ -561,7 +561,7 @@ SerialPort.prototype.inLCR = function(port, addrFrom) {
*
* @this {SerialPort}
* @param {number} port (0x3FC or 0x2FC)
* @param {number|undefined} addrFrom (not defined whenever the Debugger tries to read the specified port)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number} simulated port value
*/
SerialPort.prototype.inMCR = function(port, addrFrom) {
@ -575,7 +575,7 @@ SerialPort.prototype.inMCR = function(port, addrFrom) {
*
* @this {SerialPort}
* @param {number} port (0x3FD or 0x2FD)
* @param {number|undefined} addrFrom (not defined whenever the Debugger tries to read the specified port)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number} simulated port value
*/
SerialPort.prototype.inLSR = function(port, addrFrom) {
@ -589,7 +589,7 @@ SerialPort.prototype.inLSR = function(port, addrFrom) {
*
* @this {SerialPort}
* @param {number} port (0x3FE or 0x2FE)
* @param {number|undefined} addrFrom (not defined whenever the Debugger tries to read the specified port)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number} simulated port value
*/
SerialPort.prototype.inMSR = function(port, addrFrom) {
@ -604,7 +604,7 @@ SerialPort.prototype.inMSR = function(port, addrFrom) {
* @this {SerialPort}
* @param {number} port (0x3F8 or 0x2F8)
* @param {number} bOut
* @param {number|undefined} addrFrom (not defined whenever the Debugger tries to write the specified port)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to write the specified port)
*/
SerialPort.prototype.outTHR = function(port, bOut, addrFrom) {
this.messagePort(port, bOut, addrFrom, (this.bLCR & SerialPort.LCR.DLAB) ? "DLL" : "THR");
@ -628,7 +628,7 @@ SerialPort.prototype.outTHR = function(port, bOut, addrFrom) {
* @this {SerialPort}
* @param {number} port (0x3F9 or 0x2F9)
* @param {number} bOut
* @param {number|undefined} addrFrom (not defined whenever the Debugger tries to write the specified port)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to write the specified port)
*/
SerialPort.prototype.outIER = function(port, bOut, addrFrom) {
this.messagePort(port, bOut, addrFrom, (this.bLCR & SerialPort.LCR.DLAB) ? "DLM" : "IER");
@ -645,7 +645,7 @@ SerialPort.prototype.outIER = function(port, bOut, addrFrom) {
* @this {SerialPort}
* @param {number} port (0x3FB or 0x2FB)
* @param {number} bOut
* @param {number|undefined} addrFrom (not defined whenever the Debugger tries to write the specified port)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to write the specified port)
*/
SerialPort.prototype.outLCR = function(port, bOut, addrFrom) {
this.messagePort(port, bOut, addrFrom, "LCR");
@ -658,7 +658,7 @@ SerialPort.prototype.outLCR = function(port, bOut, addrFrom) {
* @this {SerialPort}
* @param {number} port (0x3FC or 0x2FC)
* @param {number} bOut
* @param {number|undefined} addrFrom (not defined whenever the Debugger tries to write the specified port)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to write the specified port)
*/
SerialPort.prototype.outMCR = function(port, bOut, addrFrom) {
var bPrev = this.bMCR;

View file

@ -4100,8 +4100,24 @@ Video.prototype.updateScreenGraphicsEGA = function(addrScreen, addrScreenLimit)
if (x < xDirty) xDirty = x;
for (var iPixel = 0; iPixel < nPixelsPerCell; iPixel++) {
var dwPixel = data & 0x80808080;
/*
* JavaScript Alert: if adwMemory contains a 32-bit value such as -1526726656, and then we mask it
* with 0x80808080, we end up with -2147483648, which in a perfect 32-bit world, would be equivalent
* to 0x80000000, which means that when we look up "Video.aEGADWToByte[0x80000000]", we should get
* the entry containing 0x8. But no, in JavaScript, since the original value was negative, it
* still contains a sign bit above the lower 32 bits, which masking with 0x80808080 apparently doesn't
* eliminate (perhaps the mask is sign-extended as well, since there are 52 "significand" bits
* in JavaScript numbers). Anyway, this can be confirmed by looking at dwPixel.toString(16), which
* returns "-80000000". The solution is to check for a negative dwPixel and make it positive.
*/
if (dwPixel < 0) dwPixel = -dwPixel;
/*
* It's a good thing I had this assertion, which quickly caught the aforementioned problem.
* Moreover, since assertions don't fix problems (only catch them, and only in DEBUG builds), I'm
* now insuring that bPixel will always default to 0 if an undefined value ever slips through again.
*/
Component.assert(Video.aEGADWToByte[dwPixel] !== undefined);
var bPixel = Video.aEGADWToByte[dwPixel];
var bPixel = Video.aEGADWToByte[dwPixel] || 0;
this.setPixel(this.imageScreenBuffer, x++, y, aPixelColors[bPixel]);
data <<= 1;
}
@ -4131,7 +4147,7 @@ Video.prototype.updateScreenGraphicsEGA = function(addrScreen, addrScreenLimit)
*
* @this {Video}
* @param {number} port (0x3B4)
* @param {number|undefined} addrFrom (not defined whenever the Debugger tries to read the specified port)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number}
*/
Video.prototype.inMDAIndx = function(port, addrFrom)
@ -4145,7 +4161,7 @@ Video.prototype.inMDAIndx = function(port, addrFrom)
* @this {Video}
* @param {number} port (0x3B4)
* @param {number} bOut
* @param {number|undefined} addrFrom (not defined whenever the Debugger tries to read the specified port)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
*/
Video.prototype.outMDAIndx = function(port, bOut, addrFrom)
{
@ -4157,7 +4173,7 @@ Video.prototype.outMDAIndx = function(port, bOut, addrFrom)
*
* @this {Video}
* @param {number} port (0x3B5)
* @param {number|undefined} addrFrom (not defined whenever the Debugger tries to read the specified port)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number|undefined}
*/
Video.prototype.inMDAData = function(port, addrFrom)
@ -4171,7 +4187,7 @@ Video.prototype.inMDAData = function(port, addrFrom)
* @this {Video}
* @param {number} port (0x3B5)
* @param {number} bOut
* @param {number|undefined} addrFrom (not defined whenever the Debugger tries to read the specified port)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
*/
Video.prototype.outMDAData = function(port, bOut, addrFrom)
{
@ -4183,7 +4199,7 @@ Video.prototype.outMDAData = function(port, bOut, addrFrom)
*
* @this {Video}
* @param {number} port (0x3B8)
* @param {number|undefined} addrFrom (not defined whenever the Debugger tries to read the specified port)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number}
*/
Video.prototype.inMDAMode = function(port, addrFrom)
@ -4197,7 +4213,7 @@ Video.prototype.inMDAMode = function(port, addrFrom)
* @this {Video}
* @param {number} port (0x3B8)
* @param {number} bOut
* @param {number|undefined} addrFrom (not defined whenever the Debugger tries to read the specified port)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
*/
Video.prototype.outMDAMode = function(port, bOut, addrFrom)
{
@ -4209,7 +4225,7 @@ Video.prototype.outMDAMode = function(port, bOut, addrFrom)
*
* @this {Video}
* @param {number} port (0x3BA)
* @param {number|undefined} addrFrom (not defined whenever the Debugger tries to read the specified port)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number}
*/
Video.prototype.inMDAStatus = function(port, addrFrom)
@ -4223,7 +4239,7 @@ Video.prototype.inMDAStatus = function(port, addrFrom)
* @this {Video}
* @param {number} port (0x3BA or 0x3DA)
* @param {number} bOut
* @param {number|undefined} addrFrom (not defined whenever the Debugger tries to read the specified port)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
*
* NOTE: While this port also existed on the MDA and CGA, it existed only as an INPUT port, not an OUTPUT port.
*/
@ -4238,7 +4254,7 @@ Video.prototype.outFeat = function(port, bOut, addrFrom)
*
* @this {Video}
* @param {number} port (0x3C0)
* @param {number|undefined} addrFrom (not defined whenever the Debugger tries to read the specified port)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number}
*/
Video.prototype.inATC = function(port, addrFrom)
@ -4255,7 +4271,7 @@ Video.prototype.inATC = function(port, addrFrom)
* @this {Video}
* @param {number} port (0x3C0)
* @param {number} bOut
* @param {number|undefined} addrFrom (not defined whenever the Debugger tries to read the specified port)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
*/
Video.prototype.outATC = function(port, bOut, addrFrom)
{
@ -4289,7 +4305,7 @@ Video.prototype.outATC = function(port, bOut, addrFrom)
*
* @this {Video}
* @param {number} port (0x3C2)
* @param {number|undefined} addrFrom (not defined whenever the Debugger tries to read the specified port)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number}
*/
Video.prototype.inStatus0 = function(port, addrFrom)
@ -4309,7 +4325,7 @@ Video.prototype.inStatus0 = function(port, addrFrom)
* @this {Video}
* @param {number} port (0x3C2)
* @param {number} bOut
* @param {number|undefined} addrFrom (not defined whenever the Debugger tries to read the specified port)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
*/
Video.prototype.outMisc = function(port, bOut, addrFrom)
{
@ -4323,7 +4339,7 @@ Video.prototype.outMisc = function(port, bOut, addrFrom)
*
* @this {Video}
* @param {number} port (0x3C4)
* @param {number|undefined} addrFrom (not defined whenever the Debugger tries to read the specified port)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number}
*/
Video.prototype.inSEQIndx = function(port, addrFrom)
@ -4339,7 +4355,7 @@ Video.prototype.inSEQIndx = function(port, addrFrom)
* @this {Video}
* @param {number} port (0x3C4)
* @param {number} bOut
* @param {number|undefined} addrFrom (not defined whenever the Debugger tries to read the specified port)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
*/
Video.prototype.outSEQIndx = function(port, bOut, addrFrom)
{
@ -4352,7 +4368,7 @@ Video.prototype.outSEQIndx = function(port, bOut, addrFrom)
*
* @this {Video}
* @param {number} port (0x3C5)
* @param {number|undefined} addrFrom (not defined whenever the Debugger tries to read the specified port)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number}
*/
Video.prototype.inSEQData = function(port, addrFrom)
@ -4368,7 +4384,7 @@ Video.prototype.inSEQData = function(port, addrFrom)
* @this {Video}
* @param {number} port (0x3C5)
* @param {number} bOut
* @param {number|undefined} addrFrom (not defined whenever the Debugger tries to read the specified port)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
*/
Video.prototype.outSEQData = function(port, bOut, addrFrom)
{
@ -4386,7 +4402,7 @@ Video.prototype.outSEQData = function(port, bOut, addrFrom)
*
* @this {Video}
* @param {number} port (0x3CC)
* @param {number|undefined} addrFrom (not defined whenever the Debugger tries to read the specified port)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number}
*/
Video.prototype.inGRCPos1 = function(port, addrFrom)
@ -4408,7 +4424,7 @@ Video.prototype.inGRCPos1 = function(port, addrFrom)
* @this {Video}
* @param {number} port (0x3CC)
* @param {number} bOut
* @param {number|undefined} addrFrom (not defined whenever the Debugger tries to read the specified port)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
*/
Video.prototype.outGRCPos1 = function(port, bOut, addrFrom)
{
@ -4421,7 +4437,7 @@ Video.prototype.outGRCPos1 = function(port, bOut, addrFrom)
*
* @this {Video}
* @param {number} port (0x3CA)
* @param {number|undefined} addrFrom (not defined whenever the Debugger tries to read the specified port)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number}
*/
Video.prototype.inGRCPos2 = function(port, addrFrom)
@ -4442,7 +4458,7 @@ Video.prototype.inGRCPos2 = function(port, addrFrom)
* @this {Video}
* @param {number} port (0x3CA)
* @param {number} bOut
* @param {number|undefined} addrFrom (not defined whenever the Debugger tries to read the specified port)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
*/
Video.prototype.outGRCPos2 = function(port, bOut, addrFrom)
{
@ -4455,7 +4471,7 @@ Video.prototype.outGRCPos2 = function(port, bOut, addrFrom)
*
* @this {Video}
* @param {number} port (0x3CE)
* @param {number|undefined} addrFrom (not defined whenever the Debugger tries to read the specified port)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number}
*/
Video.prototype.inGRCIndx = function(port, addrFrom)
@ -4471,7 +4487,7 @@ Video.prototype.inGRCIndx = function(port, addrFrom)
* @this {Video}
* @param {number} port (0x3CE)
* @param {number} bOut
* @param {number|undefined} addrFrom (not defined whenever the Debugger tries to read the specified port)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
*/
Video.prototype.outGRCIndx = function(port, bOut, addrFrom)
{
@ -4484,7 +4500,7 @@ Video.prototype.outGRCIndx = function(port, bOut, addrFrom)
*
* @this {Video}
* @param {number} port (0x3CF)
* @param {number|undefined} addrFrom (not defined whenever the Debugger tries to read the specified port)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number}
*/
Video.prototype.inGRCData = function(port, addrFrom)
@ -4500,7 +4516,7 @@ Video.prototype.inGRCData = function(port, addrFrom)
* @this {Video}
* @param {number} port (0x3CF)
* @param {number} bOut
* @param {number|undefined} addrFrom (not defined whenever the Debugger tries to read the specified port)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
*/
Video.prototype.outGRCData = function(port, bOut, addrFrom)
{
@ -4546,7 +4562,7 @@ Video.prototype.outGRCData = function(port, bOut, addrFrom)
*
* @this {Video}
* @param {number} port (0x3D4)
* @param {number|undefined} addrFrom (not defined whenever the Debugger tries to read the specified port)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number}
*/
Video.prototype.inCGAIndx = function(port, addrFrom)
@ -4560,7 +4576,7 @@ Video.prototype.inCGAIndx = function(port, addrFrom)
* @this {Video}
* @param {number} port (0x3D4)
* @param {number} bOut
* @param {number|undefined} addrFrom (not defined whenever the Debugger tries to read the specified port)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
*/
Video.prototype.outCGAIndx = function(port, bOut, addrFrom)
{
@ -4572,7 +4588,7 @@ Video.prototype.outCGAIndx = function(port, bOut, addrFrom)
*
* @this {Video}
* @param {number} port (0x3D5)
* @param {number|undefined} addrFrom (not defined whenever the Debugger tries to read the specified port)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number|undefined}
*/
Video.prototype.inCGAData = function(port, addrFrom)
@ -4586,7 +4602,7 @@ Video.prototype.inCGAData = function(port, addrFrom)
* @this {Video}
* @param {number} port (0x3D5)
* @param {number} bOut
* @param {number|undefined} addrFrom (not defined whenever the Debugger tries to read the specified port)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
*/
Video.prototype.outCGAData = function(port, bOut, addrFrom)
{
@ -4598,7 +4614,7 @@ Video.prototype.outCGAData = function(port, bOut, addrFrom)
*
* @this {Video}
* @param {number} port (0x3D8)
* @param {number|undefined} addrFrom (not defined whenever the Debugger tries to read the specified port)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number}
*/
Video.prototype.inCGAMode = function(port, addrFrom)
@ -4612,7 +4628,7 @@ Video.prototype.inCGAMode = function(port, addrFrom)
* @this {Video}
* @param {number} port (0x3D8)
* @param {number} bOut
* @param {number|undefined} addrFrom (not defined whenever the Debugger tries to read the specified port)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
*/
Video.prototype.outCGAMode = function(port, bOut, addrFrom)
{
@ -4624,7 +4640,7 @@ Video.prototype.outCGAMode = function(port, bOut, addrFrom)
*
* @this {Video}
* @param {number} port (0x3D9)
* @param {number|undefined} addrFrom (not defined whenever the Debugger tries to read the specified port)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number}
*/
Video.prototype.inCGAColor = function(port, addrFrom)
@ -4640,7 +4656,7 @@ Video.prototype.inCGAColor = function(port, addrFrom)
* @this {Video}
* @param {number} port (0x3D9)
* @param {number} bOut
* @param {number|undefined} addrFrom (not defined whenever the Debugger tries to read the specified port)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
*/
Video.prototype.outCGAColor = function(port, bOut, addrFrom)
{
@ -4660,7 +4676,7 @@ Video.prototype.outCGAColor = function(port, bOut, addrFrom)
*
* @this {Video}
* @param {number} port (0x3DA)
* @param {number|undefined} addrFrom (not defined whenever the Debugger tries to read the specified port)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number}
*/
Video.prototype.inCGAStatus = function(port, addrFrom)
@ -4673,7 +4689,7 @@ Video.prototype.inCGAStatus = function(port, addrFrom)
*
* @this {Video}
* @param {Object} card
* @param {number|undefined} addrFrom (not defined whenever the Debugger tries to read the specified port)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number}
*/
Video.prototype.inCRTCIndx = function(card, addrFrom)
@ -4689,7 +4705,7 @@ Video.prototype.inCRTCIndx = function(card, addrFrom)
* @this {Video}
* @param {Object} card
* @param {number} bOut
* @param {number|undefined} addrFrom (not defined whenever the Debugger tries to read the specified port)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
*/
Video.prototype.outCRTCIndx = function(card, bOut, addrFrom)
{
@ -4703,7 +4719,7 @@ Video.prototype.outCRTCIndx = function(card, bOut, addrFrom)
*
* @this {Video}
* @param {Object} card
* @param {number|undefined} addrFrom (not defined whenever the Debugger tries to read the specified port)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number|undefined}
*/
Video.prototype.inCRTCData = function(card, addrFrom)
@ -4720,7 +4736,7 @@ Video.prototype.inCRTCData = function(card, addrFrom)
* @this {Video}
* @param {Object} card
* @param {number} bOut
* @param {number|undefined} addrFrom (not defined whenever the Debugger tries to read the specified port)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
*/
Video.prototype.outCRTCData = function(card, bOut, addrFrom)
{
@ -4752,7 +4768,7 @@ Video.prototype.outCRTCData = function(card, bOut, addrFrom)
*
* @this {Video}
* @param {Object} card
* @param {number|undefined} addrFrom (not defined whenever the Debugger tries to read the specified port)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number}
*/
Video.prototype.inCardMode = function(card, addrFrom)
@ -4768,7 +4784,7 @@ Video.prototype.inCardMode = function(card, addrFrom)
* @this {Video}
* @param {Object} card
* @param {number} bOut
* @param {number|undefined} addrFrom (not defined whenever the Debugger tries to read the specified port)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
*/
Video.prototype.outCardMode = function(card, bOut, addrFrom)
{
@ -4787,7 +4803,7 @@ Video.prototype.outCardMode = function(card, bOut, addrFrom)
*
* @this {Video}
* @param {Object} card
* @param {number|undefined} addrFrom (not defined whenever the Debugger tries to read the specified port)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number}
*/
Video.prototype.inCardStatus = function(card, addrFrom)

View file

@ -1258,7 +1258,7 @@ var X86OpXX = {
}
if (nReps--) {
var addrFrom = this.regEIP - nDelta - 1;
var w = this.bus.checkPortInputNotify(this.regDX, addrFrom) | (this.bus.checkPortInputNotify((this.regDX + 1) & 0xffff, addrFrom) << 8);
var w = this.bus.checkPortInputNotify(this.regDX, addrFrom) | (this.bus.checkPortInputNotify(this.regDX, addrFrom) << 8);
this.setSOWord(this.segES, this.regDI, w);
this.regDI = (this.regDI + ((this.regPS & X86.PS.DF)? -2 : 2)) & 0xffff;
this.nStepCycles -= nCycles;
@ -1350,7 +1350,7 @@ var X86OpXX = {
this.regCX -= nDelta;
var addrFrom = this.regEIP - nDelta - 1;
this.bus.checkPortOutputNotify(this.regDX, w & 0xff, addrFrom);
this.bus.checkPortOutputNotify((this.regDX + 1) & 0xffff, w >> 8, addrFrom);
this.bus.checkPortOutputNotify(this.regDX, w >> 8, addrFrom);
if (nReps) {
/*
* We have to back up to the prefix byte(s), not just to the string instruction,
@ -2728,7 +2728,7 @@ var X86OpXX = {
/**
* @this {X86CPU}
*
* Here's the pseudo-code from /pubs/pc/programming/80286_and_80287_Programmers_Reference_Manual_1987.pdf, p.B-40 (p.250):
* Here's the pseudo-code from http://www.pcjs.org/pubs/pc/reference/intel/80286/progref, p.B-40 (p.250):
*
* LEVEL := LEVEL MOD 32
* Push BP

Some files were not shown because too many files have changed in this diff Show more