Merge branch 'next-release'
This commit is contained in:
commit
55e47ac9d0
61 changed files with 3727 additions and 2718 deletions
|
|
@ -9,9 +9,9 @@ Challenger 1P Machine Configurations with 8Kb
|
||||||
|
|
||||||
Here are some sample C1P Machine Configurations with 8Kb:
|
Here are some sample C1P Machine Configurations with 8Kb:
|
||||||
|
|
||||||
* [8kb with Large Display](large/) ([Debugger](large/debugger/))
|
* [8kb with Large Display](large/) (with [Debugger](large/debugger/))
|
||||||
* [8kb with Small Display](small/)
|
* [8kb with Small Display](small/)
|
||||||
* [8kb with Large Display w/Additional Software](all/) ([Debugger](all/debugger/))
|
* [8kb with Large Display w/Additional Software](all/) (with [Debugger](all/debugger/))
|
||||||
* [8kb "Server Array" Demo](array/)
|
* [8kb "Server Array" Demo](array/)
|
||||||
|
|
||||||
See the [Documentation](/docs/c1pjs/) for details on the operation of C1Pjs.
|
See the [Documentation](/docs/c1pjs/) for details on the operation of C1Pjs.
|
||||||
|
|
|
||||||
|
|
@ -10,8 +10,8 @@ Challenger 1P Machine Configurations
|
||||||
Here are some sample C1P Machine Configurations:
|
Here are some sample C1P Machine Configurations:
|
||||||
|
|
||||||
- [8kb with Small Display](8kb/small/)
|
- [8kb with Small Display](8kb/small/)
|
||||||
- [8kb with Large Display](8kb/large/) ([Debugger](8kb/large/debugger/))
|
- [8kb with Large Display](8kb/large/) (with [Debugger](8kb/large/debugger/))
|
||||||
- [8kb with Large Display w/Additional Software](8kb/all/) ([Debugger](8kb/all/debugger/))
|
- [8kb with Large Display w/Additional Software](8kb/all/) (with [Debugger](8kb/all/debugger/))
|
||||||
- [8kb "Server Array" Demo](8kb/array/)
|
- [8kb "Server Array" Demo](8kb/array/)
|
||||||
- [32kb with Diskette Support](32kb/)
|
- [32kb with Diskette Support](32kb/)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<?xml-stylesheet type="text/xsl" href="/versions/pc8080/1.30.5/machine.xsl"?>
|
<?xml-stylesheet type="text/xsl" href="/versions/pc8080/1.30.5/machine.xsl"?>
|
||||||
<machine id="vt100" class="pc8080" border="1" pos="center" background="#FAEBD7">
|
<machine id="vt100" class="pc8080 machine-right" border="1" pos="center" background="#FAEBD7">
|
||||||
<name pos="center">VT100 Terminal</name>
|
<name pos="center">VT100 Terminal</name>
|
||||||
<computer id="computer" busWidth="16"/>
|
<computer id="computer" busWidth="16"/>
|
||||||
<cpu id="cpu8080" model="8080" cycles="2764800" autoStart="true"/>
|
<cpu id="cpu8080" model="8080" cycles="2764800" autoStart="true"/>
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<?xml-stylesheet type="text/xsl" href="/versions/pc8080/1.30.5/machine.xsl"?>
|
<?xml-stylesheet type="text/xsl" href="/versions/pc8080/1.30.5/machine.xsl"?>
|
||||||
<machine id="vt100" class="pc8080" border="1" pos="center" background="#FAEBD7">
|
<machine id="vt100" class="pc8080 machine-right" border="1" pos="center" background="#FAEBD7">
|
||||||
<name pos="center">VT100 Terminal</name>
|
<name pos="center">VT100 Terminal</name>
|
||||||
<computer id="computer" busWidth="16"/>
|
<computer id="computer" busWidth="16"/>
|
||||||
<cpu id="cpu8080" model="8080" cycles="2764800"/>
|
<cpu id="cpu8080" model="8080" cycles="2764800"/>
|
||||||
|
|
@ -29,6 +29,6 @@
|
||||||
<control type="button" binding="setup" padLeft="8px" padBottom="8px">SET-UP</control>
|
<control type="button" binding="setup" padLeft="8px" padBottom="8px">SET-UP</control>
|
||||||
</keyboard>
|
</keyboard>
|
||||||
<serial id="serialPort" adapter="0" binding="print">
|
<serial id="serialPort" adapter="0" binding="print">
|
||||||
<control type="button" binding="test" value="HELLO WORLD!\n\\e[D\\e[D\\e[D\\e[D\\e[D\\e[D\\e[D\\e[D\\e[D\\e[D\\e[D" padLeft="8px">TEST RECEIVER</control>
|
<control type="button" binding="test" value="HELLO WORLD!\r\n" padLeft="8px">TEST RECEIVER</control>
|
||||||
</serial>
|
</serial>
|
||||||
</machine>
|
</machine>
|
||||||
|
|
|
||||||
|
|
@ -7,12 +7,12 @@ permalink: /devices/pdp11/machine/1120/
|
||||||
PDP-11/20 Machine Configurations
|
PDP-11/20 Machine Configurations
|
||||||
--------------------------------
|
--------------------------------
|
||||||
|
|
||||||
PDPjs is currently being tested with the following PDP-11/20 machine configurations:
|
PDPjs supports a variety of PDP-11/20 machine configurations, including:
|
||||||
|
|
||||||
* [PDP-11/20 Boot Monitor](/devices/pdp11/machine/1120/monitor/) (with [Debugger](/devices/pdp11/machine/1120/monitor/debugger/))
|
* [PDP-11/20 Boot Monitor](/devices/pdp11/machine/1120/monitor/) (with [Debugger](/devices/pdp11/machine/1120/monitor/debugger/))
|
||||||
* [PDP-11/20 with Front Panel](/devices/pdp11/machine/1120/panel) (with [Debugger](/devices/pdp11/machine/1120/panel/debugger/))
|
* [PDP-11/20 with Front Panel](/devices/pdp11/machine/1120/panel) (with [Debugger](/devices/pdp11/machine/1120/panel/debugger/))
|
||||||
* [PDP-11/20 Bootstrap Loader Demo](/devices/pdp11/machine/1120/bootstrap/) (with [Debugger](/devices/pdp11/machine/1120/bootstrap/debugger/))
|
* [PDP-11/20 Bootstrap Loader Demo](/devices/pdp11/machine/1120/bootstrap/) (with [Debugger](/devices/pdp11/machine/1120/bootstrap/debugger/))
|
||||||
* [PDP-11/20 BASIC Demo](/devices/pdp11/machine/1120/basic/) (with [Debugger](/devices/pdp11/machine/1120/basic/debugger/))
|
* [PDP-11/20 BASIC Demo](/devices/pdp11/machine/1120/basic/) (with [Debugger](/devices/pdp11/machine/1120/basic/debugger/))
|
||||||
|
|
||||||
The "Demo" machines come with 16Kb of RAM and a [PC11 Paper Tape Reader](/devices/pdp11/pc11/). The "Boot Monitor" machine
|
The "Demo" machines come with 16Kb of RAM and a [PC11 Paper Tape Reader](/devices/pdp11/pc11/). All the other machines
|
||||||
has 56Kb of RAM.
|
are configured with 56Kb of RAM.
|
||||||
|
|
|
||||||
17
devices/pdp11/machine/1145/README.md
Normal file
17
devices/pdp11/machine/1145/README.md
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
---
|
||||||
|
layout: page
|
||||||
|
title: PDP-11/45 Machine Configurations
|
||||||
|
permalink: /devices/pdp11/machine/1145/
|
||||||
|
---
|
||||||
|
|
||||||
|
PDP-11/45 Machine Configurations
|
||||||
|
--------------------------------
|
||||||
|
|
||||||
|
PDPjs supports a variety of PDP-11/45 machine configurations, including:
|
||||||
|
|
||||||
|
* [PDP-11/45 with Front Panel](/devices/pdp11/machine/1145/panel/) (with [Debugger](/devices/pdp11/machine/1145/panel/debugger/))
|
||||||
|
* [PDP-11/45 with VT100 Terminal](/devices/pdp11/machine/1145/vt100/) (with [Debugger](/devices/pdp11/machine/1145/vt100/debugger/))
|
||||||
|
|
||||||
|
All of the above configurations include 248Kb of RAM -- the maximum supported by the PDP-11/45 architecture.
|
||||||
|
The top 8Kb of the PDP-11/45's 18-bit address space is occupied by the *I/O Page*, a region reserved for hardware
|
||||||
|
registers belonging to the CPU, MMU, and assorted peripherals.
|
||||||
16
devices/pdp11/machine/1145/panel/README.md
Normal file
16
devices/pdp11/machine/1145/panel/README.md
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
---
|
||||||
|
layout: page
|
||||||
|
title: PDP-11/45 with 256Kb and Front Panel
|
||||||
|
permalink: /devices/pdp11/machine/1145/panel/
|
||||||
|
machines:
|
||||||
|
- id: test1145
|
||||||
|
type: pdp11
|
||||||
|
---
|
||||||
|
|
||||||
|
{% include machine.html id="test1145" %}
|
||||||
|
|
||||||
|
This machine is also available with our built-in [Debugger](debugger/).
|
||||||
|
|
||||||
|
Other interesting things to know about this machine:
|
||||||
|
|
||||||
|
* It includes an [M9312 ROM](/devices/pdp11/rom/M9312/) at address 165000. The exact ROM is [23-616F1](/devices/pdp11/rom/M9312/23-616F1.txt).
|
||||||
15
devices/pdp11/machine/1145/panel/debugger/README.md
Normal file
15
devices/pdp11/machine/1145/panel/debugger/README.md
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
---
|
||||||
|
layout: page
|
||||||
|
title: PDP-11/45 with 256Kb, Front Panel, and Debugger
|
||||||
|
permalink: /devices/pdp11/machine/1145/panel/debugger/
|
||||||
|
machines:
|
||||||
|
- id: test1145
|
||||||
|
type: pdp11
|
||||||
|
debugger: true
|
||||||
|
---
|
||||||
|
|
||||||
|
{% include machine.html id="test1145" %}
|
||||||
|
|
||||||
|
Other interesting things to know about this machine:
|
||||||
|
|
||||||
|
* It includes an [M9312 ROM](/devices/pdp11/rom/M9312/) at address 165000. The exact ROM is [23-616F1](/devices/pdp11/rom/M9312/23-616F1.txt).
|
||||||
16
devices/pdp11/machine/1145/panel/debugger/machine.xml
Normal file
16
devices/pdp11/machine/1145/panel/debugger/machine.xml
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<?xml-stylesheet type="text/xsl" href="/versions/pdpjs/1.30.5/machine.xsl"?>
|
||||||
|
<machine id="test1145" class="pdp11" border="1" pos="center" background="#FAEBD7">
|
||||||
|
<name pos="center">PDP-11/45 with 256Kb, Front Panel and Debugger</name>
|
||||||
|
<computer id="computer" busWidth="18"/>
|
||||||
|
<cpu id="cpu" model="1145" cycles="6666667"/>
|
||||||
|
<ram id="ram" addr="0x00000" size="0x3E000" file="/apps/pdp11/boot/monitor/BOOTMON.json"/>
|
||||||
|
<rom id="m9312" addr="0xEA00" size="0x200" file="/devices/pdp11/rom/M9312/23-616F1.json"/>
|
||||||
|
<device id="default" type="default"/>
|
||||||
|
<serial id="dl11" adapter="0" binding="print"/>
|
||||||
|
<panel ref="/devices/pdp11/panel/1145/debugger/front.xml"/>
|
||||||
|
<debugger id="debugger" base="8" messages="" commands=""/>
|
||||||
|
<device ref="/devices/pdp11/pc11/default.xml"/>
|
||||||
|
<device ref="/devices/pdp11/rk11/default.xml"/>
|
||||||
|
<device ref="/devices/pdp11/rl11/default.xml"/>
|
||||||
|
</machine>
|
||||||
15
devices/pdp11/machine/1145/panel/machine.xml
Normal file
15
devices/pdp11/machine/1145/panel/machine.xml
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<?xml-stylesheet type="text/xsl" href="/versions/pdpjs/1.30.5/machine.xsl"?>
|
||||||
|
<machine id="test1145" class="pdp11" border="1" pos="center" background="#FAEBD7">
|
||||||
|
<name pos="center">PDP-11/45 with 256Kb and Front Panel</name>
|
||||||
|
<computer id="computer" busWidth="18"/>
|
||||||
|
<cpu id="cpu" model="1145" cycles="6666667" autoStart="true"/>
|
||||||
|
<ram id="ram" addr="0x00000" size="0x3E000" file="/apps/pdp11/boot/monitor/BOOTMON.json"/>
|
||||||
|
<rom id="m9312" addr="0xEA00" size="0x200" file="/devices/pdp11/rom/M9312/23-616F1.json"/>
|
||||||
|
<device id="default" type="default"/>
|
||||||
|
<serial id="dl11" adapter="0" binding="print"/>
|
||||||
|
<panel ref="/devices/pdp11/panel/1145/front.xml"/>
|
||||||
|
<device ref="/devices/pdp11/pc11/default.xml"/>
|
||||||
|
<device ref="/devices/pdp11/rk11/default.xml"/>
|
||||||
|
<device ref="/devices/pdp11/rl11/default.xml"/>
|
||||||
|
</machine>
|
||||||
20
devices/pdp11/machine/1145/vt100/README.md
Normal file
20
devices/pdp11/machine/1145/vt100/README.md
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
---
|
||||||
|
layout: page
|
||||||
|
title: PDP-11/45 with VT100 Terminal
|
||||||
|
permalink: /devices/pdp11/machine/1145/vt100/
|
||||||
|
machines:
|
||||||
|
- id: test1145
|
||||||
|
type: pdp11
|
||||||
|
config: /devices/pdp11/machine/1145/vt100/machine.xml
|
||||||
|
connection: dl11->vt100.serialPort
|
||||||
|
- id: vt100
|
||||||
|
type: pc8080
|
||||||
|
config: /devices/pc8080/machine/vt100/machine.xml
|
||||||
|
connection: serialPort->test1145.dl11
|
||||||
|
---
|
||||||
|
|
||||||
|
{% include machine.html id="test1145" %}
|
||||||
|
|
||||||
|
{% include machine.html id="vt100" %}
|
||||||
|
|
||||||
|
This PDP-11/45 is also available with our built-in [Debugger](debugger/).
|
||||||
20
devices/pdp11/machine/1145/vt100/debugger/README.md
Normal file
20
devices/pdp11/machine/1145/vt100/debugger/README.md
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
---
|
||||||
|
layout: page
|
||||||
|
title: PDP-11/45 with VT100 Terminal and Debugger
|
||||||
|
permalink: /devices/pdp11/machine/1145/vt100/debugger/
|
||||||
|
machines:
|
||||||
|
- id: test1145
|
||||||
|
type: pdp11
|
||||||
|
debugger: true
|
||||||
|
config: /devices/pdp11/machine/1145/vt100/debugger/machine.xml
|
||||||
|
connection: dl11->vt100.serialPort
|
||||||
|
- id: vt100
|
||||||
|
type: pc8080
|
||||||
|
debugger: true
|
||||||
|
config: /devices/pc8080/machine/vt100/debugger/machine.xml
|
||||||
|
connection: serialPort->test1145.dl11
|
||||||
|
---
|
||||||
|
|
||||||
|
{% include machine.html id="test1145" %}
|
||||||
|
|
||||||
|
{% include machine.html id="vt100" %}
|
||||||
15
devices/pdp11/machine/1145/vt100/debugger/machine.xml
Normal file
15
devices/pdp11/machine/1145/vt100/debugger/machine.xml
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<?xml-stylesheet type="text/xsl" href="/versions/pdpjs/1.30.5/machine.xsl"?>
|
||||||
|
<machine id="test1145" class="pdp11 machine-left" border="1" pos="center" background="#FAEBD7">
|
||||||
|
<name pos="center">PDP-11/45 with 256Kb, Front Panel, and Debugger</name>
|
||||||
|
<computer id="computer" busWidth="18"/>
|
||||||
|
<cpu id="cpu" model="1145" cycles="6666667" autoStart="true"/>
|
||||||
|
<ram id="ram" addr="0x00000" size="0x3E000" file="/apps/pdp11/boot/monitor/BOOTMON.json"/>
|
||||||
|
<device id="default" type="default"/>
|
||||||
|
<serial id="dl11" adapter="0"/>
|
||||||
|
<panel ref="/devices/pdp11/panel/1145/debugger/front.xml"/>
|
||||||
|
<debugger id="debugger" base="8" messages="" commands=""/>
|
||||||
|
<device ref="/devices/pdp11/pc11/default.xml"/>
|
||||||
|
<device ref="/devices/pdp11/rk11/default.xml"/>
|
||||||
|
<device ref="/devices/pdp11/rl11/default.xml"/>
|
||||||
|
</machine>
|
||||||
14
devices/pdp11/machine/1145/vt100/machine.xml
Normal file
14
devices/pdp11/machine/1145/vt100/machine.xml
Normal file
|
|
@ -0,0 +1,14 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<?xml-stylesheet type="text/xsl" href="/versions/pdpjs/1.30.5/machine.xsl"?>
|
||||||
|
<machine id="test1145" class="pdp11 machine-left" border="1" pos="center" background="#FAEBD7">
|
||||||
|
<name pos="center">PDP-11/45 with 256Kb and Front Panel</name>
|
||||||
|
<computer id="computer" busWidth="18"/>
|
||||||
|
<cpu id="cpu" model="1145" cycles="6666667" autoStart="true"/>
|
||||||
|
<ram id="ram" addr="0x00000" size="0x3E000" file="/apps/pdp11/boot/monitor/BOOTMON.json"/>
|
||||||
|
<device id="default" type="default"/>
|
||||||
|
<serial id="dl11" adapter="0"/>
|
||||||
|
<panel ref="/devices/pdp11/panel/1145/front.xml"/>
|
||||||
|
<device ref="/devices/pdp11/pc11/default.xml"/>
|
||||||
|
<device ref="/devices/pdp11/rk11/default.xml"/>
|
||||||
|
<device ref="/devices/pdp11/rl11/default.xml"/>
|
||||||
|
</machine>
|
||||||
|
|
@ -7,7 +7,7 @@ permalink: /devices/pdp11/machine/1170/
|
||||||
PDP-11/70 Machine Configurations
|
PDP-11/70 Machine Configurations
|
||||||
--------------------------------
|
--------------------------------
|
||||||
|
|
||||||
PDPjs is currently being tested with the following PDP-11/70 machine configurations:
|
PDPjs supports a variety of PDP-11/70 machine configurations, including:
|
||||||
|
|
||||||
* [PDP-11/70 Boot Monitor](/devices/pdp11/machine/1170/monitor/) (with [Debugger](/devices/pdp11/machine/1170/monitor/debugger/))
|
* [PDP-11/70 Boot Monitor](/devices/pdp11/machine/1170/monitor/) (with [Debugger](/devices/pdp11/machine/1170/monitor/debugger/))
|
||||||
* [PDP-11/70 with Front Panel](/devices/pdp11/machine/1170/panel/) (with [Debugger](/devices/pdp11/machine/1170/panel/debugger/))
|
* [PDP-11/70 with Front Panel](/devices/pdp11/machine/1170/panel/) (with [Debugger](/devices/pdp11/machine/1170/panel/debugger/))
|
||||||
|
|
@ -16,3 +16,7 @@ PDPjs is currently being tested with the following PDP-11/70 machine configurati
|
||||||
|
|
||||||
The [PDP-11/70 with Front Panel and Debugger](/devices/pdp11/machine/1170/panel/debugger/) also features a section
|
The [PDP-11/70 with Front Panel and Debugger](/devices/pdp11/machine/1170/panel/debugger/) also features a section
|
||||||
on "[Toggle-Ins](/devices/pdp11/machine/1170/panel/debugger/#toggle-ins)" for your switch-toggling enjoyment.
|
on "[Toggle-Ins](/devices/pdp11/machine/1170/panel/debugger/#toggle-ins)" for your switch-toggling enjoyment.
|
||||||
|
|
||||||
|
Unless otherwise specified, the above configurations include 256Kb of RAM. The PDP-11/70's 22-bit architecture
|
||||||
|
supports a maximum of 3,840Kb of RAM, since the last 256Kb is reserved for UNIBUS devices. The top 8Kb is known
|
||||||
|
as the *I/O Page*, a region containing hardware registers belonging to the CPU, MMU, and assorted peripherals.
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
---
|
---
|
||||||
layout: page
|
layout: page
|
||||||
title: PDP-11/70 Boot Monitor
|
title: PDP-11/70 with 256Kb and Boot Monitor
|
||||||
permalink: /devices/pdp11/machine/1170/monitor/
|
permalink: /devices/pdp11/machine/1170/monitor/
|
||||||
machines:
|
machines:
|
||||||
- id: test1170
|
- id: test1170
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
---
|
---
|
||||||
layout: page
|
layout: page
|
||||||
title: PDP-11/70 Boot Monitor with Debugger
|
title: PDP-11/70 with 256Kb, Boot Monitor, and Debugger
|
||||||
permalink: /devices/pdp11/machine/1170/monitor/debugger/
|
permalink: /devices/pdp11/machine/1170/monitor/debugger/
|
||||||
machines:
|
machines:
|
||||||
- id: test1170
|
- id: test1170
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<?xml-stylesheet type="text/xsl" href="/versions/pdpjs/1.30.5/machine.xsl"?>
|
<?xml-stylesheet type="text/xsl" href="/versions/pdpjs/1.30.5/machine.xsl"?>
|
||||||
<machine id="test1170" class="pdp11" border="1" pos="center" background="#FAEBD7">
|
<machine id="test1170" class="pdp11" border="1" pos="center" background="#FAEBD7">
|
||||||
<name pos="center">PDP-11/70 Boot Monitor with Debugger</name>
|
<name pos="center">PDP-11/70 with 256Kb, Boot Monitor, and Debugger</name>
|
||||||
<computer id="computer" busWidth="22"/>
|
<computer id="computer" busWidth="22"/>
|
||||||
<cpu id="cpu" model="1170" cycles="6666667"/>
|
<cpu id="cpu" model="1170" cycles="6666667"/>
|
||||||
<ram id="ram" addr="0x00000" size="0x40000" file="/apps/pdp11/boot/monitor/BOOTMON.json"/>
|
<ram id="ram" addr="0x00000" size="0x40000" file="/apps/pdp11/boot/monitor/BOOTMON.json"/>
|
||||||
|
|
@ -10,6 +10,4 @@
|
||||||
<panel ref="/devices/pdp11/panel/test/debugger/terminal.xml"/>
|
<panel ref="/devices/pdp11/panel/test/debugger/terminal.xml"/>
|
||||||
<debugger id="debugger" base="8" messages="" commands=""/>
|
<debugger id="debugger" base="8" messages="" commands=""/>
|
||||||
<device ref="/devices/pdp11/pc11/default.xml"/>
|
<device ref="/devices/pdp11/pc11/default.xml"/>
|
||||||
<device ref="/devices/pdp11/rk11/default.xml"/>
|
|
||||||
<device ref="/devices/pdp11/rl11/default.xml"/>
|
|
||||||
</machine>
|
</machine>
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<?xml-stylesheet type="text/xsl" href="/versions/pdpjs/1.30.5/machine.xsl"?>
|
<?xml-stylesheet type="text/xsl" href="/versions/pdpjs/1.30.5/machine.xsl"?>
|
||||||
<machine id="test1170" class="pdp11" border="1" pos="center" background="#FAEBD7">
|
<machine id="test1170" class="pdp11" border="1" pos="center" background="#FAEBD7">
|
||||||
<name pos="center">PDP-11/70 Boot Monitor</name>
|
<name pos="center">PDP-11/70 with 256Kb and Boot Monitor</name>
|
||||||
<computer id="computer" busWidth="22"/>
|
<computer id="computer" busWidth="22"/>
|
||||||
<cpu id="cpu" model="1170" cycles="6666667" autoStart="true"/>
|
<cpu id="cpu" model="1170" cycles="6666667" autoStart="true"/>
|
||||||
<ram id="ram" addr="0x00000" size="0x40000" file="/apps/pdp11/boot/monitor/BOOTMON.json"/>
|
<ram id="ram" addr="0x00000" size="0x40000" file="/apps/pdp11/boot/monitor/BOOTMON.json"/>
|
||||||
|
|
@ -9,6 +9,4 @@
|
||||||
<serial id="dl11" adapter="0" binding="print"/>
|
<serial id="dl11" adapter="0" binding="print"/>
|
||||||
<panel ref="/devices/pdp11/panel/test/terminal.xml"/>
|
<panel ref="/devices/pdp11/panel/test/terminal.xml"/>
|
||||||
<device ref="/devices/pdp11/pc11/default.xml"/>
|
<device ref="/devices/pdp11/pc11/default.xml"/>
|
||||||
<device ref="/devices/pdp11/rk11/default.xml"/>
|
|
||||||
<device ref="/devices/pdp11/rl11/default.xml"/>
|
|
||||||
</machine>
|
</machine>
|
||||||
|
|
|
||||||
|
|
@ -10,3 +10,7 @@ machines:
|
||||||
{% include machine.html id="test1170" %}
|
{% include machine.html id="test1170" %}
|
||||||
|
|
||||||
This machine is also available with our built-in [Debugger](debugger/).
|
This machine is also available with our built-in [Debugger](debugger/).
|
||||||
|
|
||||||
|
Other interesting things to know about this machine:
|
||||||
|
|
||||||
|
* It includes an [M9312 ROM](/devices/pdp11/rom/M9312/) at address 165000. The exact ROM is [23-616F1](/devices/pdp11/rom/M9312/23-616F1.txt).
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,6 @@ machines:
|
||||||
|
|
||||||
{% include machine.html id="test1170" %}
|
{% include machine.html id="test1170" %}
|
||||||
|
|
||||||
This PDP-11/70 is also available with our built-in [Debugger](debugger/).
|
|
||||||
|
|
||||||
{% include machine.html id="vt100" %}
|
{% include machine.html id="vt100" %}
|
||||||
|
|
||||||
|
This PDP-11/70 is also available with our built-in [Debugger](debugger/).
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<?xml-stylesheet type="text/xsl" href="/versions/pdpjs/1.30.5/machine.xsl"?>
|
<?xml-stylesheet type="text/xsl" href="/versions/pdpjs/1.30.5/machine.xsl"?>
|
||||||
<machine id="test1170" class="pdp11" border="1" pos="center" background="#FAEBD7">
|
<machine id="test1170" class="pdp11 machine-left" border="1" pos="center" background="#FAEBD7">
|
||||||
<name pos="center">PDP-11/70 with 256Kb, Front Panel, and Debugger</name>
|
<name pos="center">PDP-11/70 with 256Kb, Front Panel, and Debugger</name>
|
||||||
<computer id="computer" busWidth="22"/>
|
<computer id="computer" busWidth="22"/>
|
||||||
<cpu id="cpu" model="1170" cycles="6666667" autoStart="true"/>
|
<cpu id="cpu" model="1170" cycles="6666667" autoStart="true"/>
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<?xml-stylesheet type="text/xsl" href="/versions/pdpjs/1.30.5/machine.xsl"?>
|
<?xml-stylesheet type="text/xsl" href="/versions/pdpjs/1.30.5/machine.xsl"?>
|
||||||
<machine id="test1170" class="pdp11" border="1" pos="center" background="#FAEBD7">
|
<machine id="test1170" class="pdp11 machine-left" border="1" pos="center" background="#FAEBD7">
|
||||||
<name pos="center">PDP-11/70 with 256Kb and Front Panel</name>
|
<name pos="center">PDP-11/70 with 256Kb and Front Panel</name>
|
||||||
<computer id="computer" busWidth="22"/>
|
<computer id="computer" busWidth="22"/>
|
||||||
<cpu id="cpu" model="1170" cycles="6666667" autoStart="true"/>
|
<cpu id="cpu" model="1170" cycles="6666667" autoStart="true"/>
|
||||||
|
|
|
||||||
|
|
@ -7,8 +7,8 @@ permalink: /devices/pdp11/machine/
|
||||||
PDP-11 Machine Configurations
|
PDP-11 Machine Configurations
|
||||||
-----------------------------
|
-----------------------------
|
||||||
|
|
||||||
[PDP-11 Devices](/devices/pdp11/) are used to build a variety of PDP-11 machines:
|
[PDP-11 Devices](/devices/pdp11/) are used to build a variety of PDP-11 machines, including:
|
||||||
|
|
||||||
* [PDP-11/20](/devices/pdp11/machine/1120/)
|
* [PDP-11/20](/devices/pdp11/machine/1120/)
|
||||||
* PDP-11/45
|
* [PDP-11/45](/devices/pdp11/machine/1145/)
|
||||||
* [PDP-11/70](/devices/pdp11/machine/1170/)
|
* [PDP-11/70](/devices/pdp11/machine/1170/)
|
||||||
|
|
|
||||||
|
|
@ -204,7 +204,7 @@
|
||||||
</control>
|
</control>
|
||||||
</control>
|
</control>
|
||||||
<control type="container" class="pcjs-textarea" width="60%" padTop="8px" padBottom="8px">
|
<control type="container" class="pcjs-textarea" width="60%" padTop="8px" padBottom="8px">
|
||||||
<control type="textarea" binding="print" width="100%" height="380px" padRight="8px" pos="relative" style="resize:vertical;"/>
|
<control type="textarea" binding="print" width="100%" height="360px" padRight="8px" pos="relative" style="resize:vertical;"/>
|
||||||
<control type="container" width="100%">
|
<control type="container" width="100%">
|
||||||
<control type="text" binding="debugInput" width="auto"/>
|
<control type="text" binding="debugInput" width="auto"/>
|
||||||
<control type="button" binding="debugEnter">Enter</control>
|
<control type="button" binding="debugEnter">Enter</control>
|
||||||
|
|
|
||||||
131
devices/pdp11/panel/1145/README.md
Normal file
131
devices/pdp11/panel/1145/README.md
Normal file
|
|
@ -0,0 +1,131 @@
|
||||||
|
---
|
||||||
|
layout: page
|
||||||
|
title: PDP-11/45 Control Panels
|
||||||
|
permalink: /devices/pdp11/panel/1145/
|
||||||
|
---
|
||||||
|
|
||||||
|
PDP-11/45 Control Panels
|
||||||
|
------------------------
|
||||||
|
|
||||||
|
The following Control Panel configurations are available:
|
||||||
|
|
||||||
|
* [PDP-11/45 Front Panel](front.xml) (with [Debugger](debugger/front.xml))
|
||||||
|
|
||||||
|
Use this [PDP-11/45](/devices/pdp11/machine/1145/panel/debugger/) to see the
|
||||||
|
[PDP-11/45 Front Panel](debugger/front.xml) in action.
|
||||||
|
|
||||||
|
Front Panel Basics
|
||||||
|
------------------
|
||||||
|
|
||||||
|
From the [PDP-11/45 Handbook (1973)](http://archive.pcjs.org/pubs/dec/pdp11/1145/PDP1145_Handbook_1973.pdf),
|
||||||
|
Chapter 8, p. 195:
|
||||||
|
|
||||||
|
> ### THE SYSTEM OPERATOR'S CONSOLE
|
||||||
|
>
|
||||||
|
> The PDP-11/45 System Operator's Console is designed for convenient system control. A complete set of function
|
||||||
|
> switches and display indicators provide comprehensive status monitoring and control facilities.
|
||||||
|
>
|
||||||
|
> #### 8.1 CONSOLE ELEMENTS
|
||||||
|
>
|
||||||
|
> The PDP-11/45 System Operator's Console provides the following facilities:
|
||||||
|
>
|
||||||
|
> 1. A System Key Switch (OFF/ON/LOCK)
|
||||||
|
> 2. A bank of 7 indicator lights, indicating the following Central Processor states:
|
||||||
|
> RUN, PAUSE, MASTER(UNIBUS), USER, SUPERVISOR, KERNEL, DATA.
|
||||||
|
> 3. An 18-bit Address Register display
|
||||||
|
> 4. An Addressing Error indicator light (ADRS ERR)
|
||||||
|
> 5. A 16-bit Data Register display
|
||||||
|
> 6. An 18-bit Switch Register
|
||||||
|
> 7. Control knobs
|
||||||
|
> a. Address Display Select
|
||||||
|
> 1. USER I VIRTUAL
|
||||||
|
> 2. USER D VIRTUAL
|
||||||
|
> 3. SUPERVISOR I VIRTUAL
|
||||||
|
> 4. SUPERVISOR O VIRTUAL
|
||||||
|
> 5. KERNEL I VIRTUAL
|
||||||
|
> 6. KERNEL O VIRTUAL
|
||||||
|
> 7. PROGRAM PHYSICAL
|
||||||
|
> 8. CONSOLE PHYSICAL
|
||||||
|
> b. Data Display Select
|
||||||
|
> 1. DATA PATHS
|
||||||
|
> 2. BUS REGISTER
|
||||||
|
> 3. FPP ADRS.CPU ADRS
|
||||||
|
> 4. DISPLAY REGISTER
|
||||||
|
> 8. Control Switches
|
||||||
|
> a. LOAD ADRS (Load Address)
|
||||||
|
> b. EXAM (Examine)
|
||||||
|
> c. REG EXAM (Register Examine)
|
||||||
|
> d. CONT (Continue)
|
||||||
|
> e. ENABLE/HALT
|
||||||
|
> f. S-INST/S-BUS CYCLE (Single Instruction/Single Bus Cycle)
|
||||||
|
> g. START
|
||||||
|
> h. DEPOSIT
|
||||||
|
> i. REG DEPOSIT
|
||||||
|
|
||||||
|
The PDPjs Front Panel replicates most (but not all) the features of a real PDP-11/45 Console. The switches,
|
||||||
|
which PDPjs displays as green to make them stand out from the rest of the traditional pink-and-magenta controls,
|
||||||
|
are summarized below.
|
||||||
|
|
||||||
|
### 0..21
|
||||||
|
|
||||||
|
Switches 0 to 21 control bits 0 to 21 of the SWITCH register. The UP position represents a 1, and the DOWN position
|
||||||
|
represents a 0. Once all the bits have been set, you can choose to load the contents of the SWITCH register into the
|
||||||
|
ADDRESS register (as displayed by the top row of LEDs), or directly into the memory location referenced by the ADDRESS
|
||||||
|
register (where it will become the DATA displayed by the second row of LEDs).
|
||||||
|
|
||||||
|
The SWITCH, ADDRESS, and DATA (aka DISPLAY) registers are all internal to the Front Panel hardware, and should not be
|
||||||
|
confused with CPU registers.
|
||||||
|
|
||||||
|
### TEST
|
||||||
|
|
||||||
|
This is a momentary switch that is normally in the DOWN position. When held in the UP position, it turns on all LEDs.
|
||||||
|
This "lamp test" was more important in the days when the lights were produced by bulbs with filaments that could burn out,
|
||||||
|
and if you didn't realize that a particular light was "burned out", you could mistake it for a zero.
|
||||||
|
|
||||||
|
While the TEST switch is more "cute" than useful on a virtual Front Panel, we have added one "innovation" to the switch:
|
||||||
|
pressing it also returns all the SWITCH register switches (0-21) to their DOWN position.
|
||||||
|
|
||||||
|
### LOAD [ADRS]
|
||||||
|
|
||||||
|
This is a momentary switch that is normally in the UP position. When pressed DOWN, it copies the SWITCH register to the
|
||||||
|
ADDRESS register.
|
||||||
|
|
||||||
|
### EXAM
|
||||||
|
|
||||||
|
This is a momentary switch that is normally in the UP position. When pressed DOWN, it reads the memory location referenced
|
||||||
|
by the ADDRESS register and displays it in the DATA register. If pressed repeatedly, each repetition also automatically
|
||||||
|
adds 2 to the ADDRESS register, making it easier to examine a series of words. Note that if the CPU registers are being
|
||||||
|
examined (starting at address 177700), the ADDRESS register will advance by 1 instead of 2.
|
||||||
|
|
||||||
|
Another "innovation" unique to PDPjs: if the STEP switch is toggled from the UP to the DOWN position, repeated EXAM or DEP
|
||||||
|
operations will decrease the ADDRESS register instead of increasing it.
|
||||||
|
|
||||||
|
### DEP
|
||||||
|
|
||||||
|
This is a momentary switch that is normally in the DOWN position. When pressed UP, it writes the contents of the SWITCH
|
||||||
|
register to the memory location referenced by the ADDRESS register, and displays the result in the DATA register. Like the
|
||||||
|
EXAM switch, if DEP is pressed repeatedly, each repetition also automatically adds 2 to the ADDRESS register, making it easier
|
||||||
|
to deposit the same value to a series of words.
|
||||||
|
|
||||||
|
### CONT
|
||||||
|
|
||||||
|
This is a momentary switch that is normally in the UP position. When pressed DOWN, it will start the CPU if it's currently
|
||||||
|
halted. If the CPU is already running, CONT has no effect. Also, if the ENABLE/HALT switch is in the DOWN (HALT) position,
|
||||||
|
then the CPU will continue for only ONE instruction and then stop again.
|
||||||
|
|
||||||
|
### ENABLE/HALT
|
||||||
|
|
||||||
|
This switch is a toggle that is normally in the UP (ENABLE) position. If it pressed DOWN while the CPU is running, the CPU will
|
||||||
|
stop. Once the CPU is stopped, this switch has no effect, other than determining what CONT will do when pressed.
|
||||||
|
|
||||||
|
### STEP
|
||||||
|
|
||||||
|
On a real PDP-11, this would select between cycle-stepping vs. instruction-stepping. Since PDPjs doesn't support cycle-stepping,
|
||||||
|
this switch has no effect (except as described above when the EXAM or DEP switches are pressed repeatedly).
|
||||||
|
|
||||||
|
### START
|
||||||
|
|
||||||
|
The START switch is similar to CONT, but it also performs the equivalent a RESET instruction before starting the CPU, so
|
||||||
|
unless you're starting execution at the beginning of a program, using START instead of CONT to continue execution is probably
|
||||||
|
not a good idea. Also, if the ENABLE/HALT switch is in the DOWN (HALT) position, START will still reset the machine but not
|
||||||
|
execute anything.
|
||||||
10
devices/pdp11/panel/1145/debugger/README.md
Normal file
10
devices/pdp11/panel/1145/debugger/README.md
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
---
|
||||||
|
layout: page
|
||||||
|
title: PDP-11/45 Control Panel with Debugger
|
||||||
|
permalink: /devices/pdp11/panel/1145/debugger/
|
||||||
|
---
|
||||||
|
|
||||||
|
PDP-11/45 Control Panel with Debugger
|
||||||
|
-------------------------------------
|
||||||
|
|
||||||
|
* [PDP-11/45 Front Panel with Debugger](front.xml)
|
||||||
239
devices/pdp11/panel/1145/debugger/front.xml
Normal file
239
devices/pdp11/panel/1145/debugger/front.xml
Normal file
|
|
@ -0,0 +1,239 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<panel id="panel" width="100%" padding="8px">
|
||||||
|
<name>Control Panel</name>
|
||||||
|
<control type="container" class="pcjs-panel-group" width="100%" padBottom="8px">
|
||||||
|
<control type="container" class="pcjs-triplet" width="9.3%" pos="right">
|
||||||
|
<control type="container" class="pcjs-ledlbl" width="33%" pos="right">16</control>
|
||||||
|
<control type="container" class="pcjs-ledlbl" width="33%" pos="right">18</control>
|
||||||
|
<control type="container" class="pcjs-ledlbl" width="33%" pos="right">22</control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="B16" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="B18" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="B22" width="100%" container="center"/></control>
|
||||||
|
</control>
|
||||||
|
<control type="container" class="pcjs-triplet" width="9.3%" pos="right">
|
||||||
|
<control type="container" class="pcjs-ledlbl" width="33%" pos="right">KRNL</control>
|
||||||
|
<control type="container" class="pcjs-ledlbl" width="33%" pos="right">SUPR</control>
|
||||||
|
<control type="container" class="pcjs-ledlbl" width="33%" pos="right">USER</control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="KERNEL" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="SUPER" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="USER" width="100%" container="center"/></control>
|
||||||
|
</control>
|
||||||
|
<control type="container" class="pcjs-triplet" width="6.2%" pos="right"></control>
|
||||||
|
<control type="container" class="pcjs-triplet" width="9.3%" pos="right">
|
||||||
|
<control type="container" class="pcjs-ledlbl0" width="100%" pos="right">ADDRESS</control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="A0" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="A1" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="A2" width="100%" container="center"/></control>
|
||||||
|
</control>
|
||||||
|
<control type="container" class="pcjs-triplet" width="9.3%" pos="right">
|
||||||
|
<control type="container" class="pcjs-ledlbl1" width="100%" pos="right" style="color:transparent">.</control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="A3" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="A4" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="A5" width="100%" container="center"/></control>
|
||||||
|
</control>
|
||||||
|
<control type="container" class="pcjs-triplet" width="9.3%" pos="right">
|
||||||
|
<control type="container" class="pcjs-ledlbl0" width="100%" pos="right" style="color:transparent">.</control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="A6" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="A7" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="A8" width="100%" container="center"/></control>
|
||||||
|
</control>
|
||||||
|
<control type="container" class="pcjs-triplet" width="9.3%" pos="right">
|
||||||
|
<control type="container" class="pcjs-ledlbl1" width="100%" pos="right" style="color:transparent">.</control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="A9" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="A10" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="A11" width="100%" container="center"/></control>
|
||||||
|
</control>
|
||||||
|
<control type="container" class="pcjs-triplet" width="9.3%" pos="right">
|
||||||
|
<control type="container" class="pcjs-ledlbl0" width="100%" pos="right" style="color:transparent">.</control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="A12" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="A13" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="A14" width="100%" container="center"/></control>
|
||||||
|
</control>
|
||||||
|
<control type="container" class="pcjs-triplet" width="9.3%" pos="right">
|
||||||
|
<control type="container" class="pcjs-ledlbl1" width="100%" pos="right" style="color:transparent">.</control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="A15" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="A16" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="A17" width="100%" container="center"/></control>
|
||||||
|
</control>
|
||||||
|
<control type="container" class="pcjs-triplet" width="9.3%" pos="right">
|
||||||
|
<control type="container" class="pcjs-ledlbl0" width="100%" pos="right" style="color:transparent">.</control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="A18" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="A19" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="A20" width="100%" container="center"/></control>
|
||||||
|
</control>
|
||||||
|
<control type="container" class="pcjs-triplet" width="3.1%" pos="right">
|
||||||
|
<control type="container" class="pcjs-ledlbl1" width="100%" pos="right" style="color:transparent">.</control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="100%" pos="right" style="clear:both;"><control type="rled" binding="A21" width="100%" container="center"/></control>
|
||||||
|
</control>
|
||||||
|
</control>
|
||||||
|
<control type="container" class="pcjs-panel-group" width="100%" padBottom="8px">
|
||||||
|
<control type="container" class="pcjs-triplet" width="9.3%" pos="right">
|
||||||
|
<control type="container" class="pcjs-ledlbl" width="33%" pos="right">LED1</control>
|
||||||
|
<control type="container" class="pcjs-ledlbl" width="33%" pos="right">LED2</control>
|
||||||
|
<control type="container" class="pcjs-ledlbl" width="33%" pos="right">LED3</control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="LED1" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="LED2" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="LED3" width="100%" container="center"/></control>
|
||||||
|
</control>
|
||||||
|
<control type="container" class="pcjs-triplet" width="9.3%" pos="right">
|
||||||
|
<control type="container" class="pcjs-ledlbl" width="33%" pos="right">LED4</control>
|
||||||
|
<control type="container" class="pcjs-ledlbl" width="33%" pos="right">LED5</control>
|
||||||
|
<control type="container" class="pcjs-ledlbl" width="33%" pos="right">LED6</control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="LED4" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="LED5" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="LED6" width="100%" container="center"/></control>
|
||||||
|
</control>
|
||||||
|
<control type="container" class="pcjs-triplet" width="6.2%" pos="right"></control>
|
||||||
|
<control type="container" class="pcjs-triplet" width="9.3%" pos="right">
|
||||||
|
<control type="container" class="pcjs-ledlbl0" width="100%" pos="right">DATA</control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="D0" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="D1" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="D2" width="100%" container="center"/></control>
|
||||||
|
</control>
|
||||||
|
<control type="container" class="pcjs-triplet" width="9.3%" pos="right">
|
||||||
|
<control type="container" class="pcjs-ledlbl1" width="100%" pos="right" style="color:transparent">.</control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="D3" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="D4" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="D5" width="100%" container="center"/></control>
|
||||||
|
</control>
|
||||||
|
<control type="container" class="pcjs-triplet" width="9.3%" pos="right">
|
||||||
|
<control type="container" class="pcjs-ledlbl0" width="100%" pos="right" style="color:transparent">.</control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="D6" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="D7" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="D8" width="100%" container="center"/></control>
|
||||||
|
</control>
|
||||||
|
<control type="container" class="pcjs-triplet" width="9.3%" pos="right">
|
||||||
|
<control type="container" class="pcjs-ledlbl1" width="100%" pos="right" style="color:transparent">.</control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="D9" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="D10" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="D11" width="100%" container="center"/></control>
|
||||||
|
</control>
|
||||||
|
<control type="container" class="pcjs-triplet" width="9.3%" pos="right">
|
||||||
|
<control type="container" class="pcjs-ledlbl0" width="100%" pos="right" style="color:transparent">.</control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="D12" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="D13" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="D14" width="100%" container="center"/></control>
|
||||||
|
</control>
|
||||||
|
<control type="container" class="pcjs-triplet" width="3.1%" pos="right">
|
||||||
|
<control type="container" class="pcjs-ledlbl1" width="100%" pos="right" style="color:transparent">.</control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="100%" pos="right" style="clear:both;"><control type="rled" binding="D15" width="100%" container="center"/></control>
|
||||||
|
</control>
|
||||||
|
</control>
|
||||||
|
<control type="container" class="pcjs-panel-group" width="100%" padBottom="8px">
|
||||||
|
<control type="container" class="pcjs-triplet" width="9.3%" pos="right">
|
||||||
|
<control type="container" class="pcjs-swlbl" width="33%" pos="right">STRT</control>
|
||||||
|
<control type="container" class="pcjs-swlbl" width="33%" pos="right">STEP</control>
|
||||||
|
<control type="container" class="pcjs-swlbl" width="33%" pos="right">E/H</control>
|
||||||
|
<control type="container" class="pcjs-swpad" width="33%" pos="right"><control type="switch" binding="START" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-swpad" width="33%" pos="right"><control type="switch" binding="STEP" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-swpad" width="33%" pos="right"><control type="switch" binding="ENABLE" width="100%" container="center"/></control>
|
||||||
|
</control>
|
||||||
|
<control type="container" class="pcjs-triplet" width="9.3%" pos="right">
|
||||||
|
<control type="container" class="pcjs-swlbl" width="33%" pos="right">CONT</control>
|
||||||
|
<control type="container" class="pcjs-swlbl" width="33%" pos="right">DEP</control>
|
||||||
|
<control type="container" class="pcjs-swlbl" width="33%" pos="right">EXAM</control>
|
||||||
|
<control type="container" class="pcjs-swpad" width="33%" pos="right"><control type="switch" binding="CONT" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-swpad" width="33%" pos="right"><control type="switch" binding="DEP" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-swpad" width="33%" pos="right"><control type="switch" binding="EXAM" width="100%" container="center"/></control>
|
||||||
|
</control>
|
||||||
|
<control type="container" class="pcjs-triplet" width="6.2%" pos="right">
|
||||||
|
<control type="container" class="pcjs-swlbl" width="50%" pos="right">LOAD</control>
|
||||||
|
<control type="container" class="pcjs-swlbl" width="50%" pos="right">TEST</control>
|
||||||
|
<control type="container" class="pcjs-swpad" width="50%" pos="right" style="clear:both;"><control type="switch" binding="LOAD" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-swpad" width="50%" pos="right"><control type="switch" binding="TEST" width="100%" container="center"/></control>
|
||||||
|
</control>
|
||||||
|
<control type="container" class="pcjs-triplet" width="9.3%" pos="right">
|
||||||
|
<control type="container" class="pcjs-swlbl" width="33%" pos="right">0</control>
|
||||||
|
<control type="container" class="pcjs-swlbl" width="33%" pos="right">1</control>
|
||||||
|
<control type="container" class="pcjs-swlbl" width="33%" pos="right">2</control>
|
||||||
|
<control type="container" class="pcjs-swpad" width="33%" pos="right"><control type="switch" binding="S0" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-swpad" width="33%" pos="right"><control type="switch" binding="S1" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-swpad" width="33%" pos="right"><control type="switch" binding="S2" width="100%" container="center"/></control>
|
||||||
|
</control>
|
||||||
|
<control type="container" class="pcjs-triplet" width="9.3%" pos="right">
|
||||||
|
<control type="container" class="pcjs-swlbl" width="33%" pos="right">3</control>
|
||||||
|
<control type="container" class="pcjs-swlbl" width="33%" pos="right">4</control>
|
||||||
|
<control type="container" class="pcjs-swlbl" width="33%" pos="right">5</control>
|
||||||
|
<control type="container" class="pcjs-swpad" width="33%" pos="right"><control type="switch" binding="S3" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-swpad" width="33%" pos="right"><control type="switch" binding="S4" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-swpad" width="33%" pos="right"><control type="switch" binding="S5" width="100%" container="center"/></control>
|
||||||
|
</control>
|
||||||
|
<control type="container" class="pcjs-triplet" width="9.3%" pos="right">
|
||||||
|
<control type="container" class="pcjs-swlbl" width="33%" pos="right">6</control>
|
||||||
|
<control type="container" class="pcjs-swlbl" width="33%" pos="right">7</control>
|
||||||
|
<control type="container" class="pcjs-swlbl" width="33%" pos="right">8</control>
|
||||||
|
<control type="container" class="pcjs-swpad" width="33%" pos="right"><control type="switch" binding="S6" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-swpad" width="33%" pos="right"><control type="switch" binding="S7" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-swpad" width="33%" pos="right"><control type="switch" binding="S8" width="100%" container="center"/></control>
|
||||||
|
</control>
|
||||||
|
<control type="container" class="pcjs-triplet" width="9.3%" pos="right">
|
||||||
|
<control type="container" class="pcjs-swlbl" width="33%" pos="right">9</control>
|
||||||
|
<control type="container" class="pcjs-swlbl" width="33%" pos="right">10</control>
|
||||||
|
<control type="container" class="pcjs-swlbl" width="33%" pos="right">11</control>
|
||||||
|
<control type="container" class="pcjs-swpad" width="33%" pos="right"><control type="switch" binding="S9" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-swpad" width="33%" pos="right"><control type="switch" binding="S10" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-swpad" width="33%" pos="right"><control type="switch" binding="S11" width="100%" container="center"/></control>
|
||||||
|
</control>
|
||||||
|
<control type="container" class="pcjs-triplet" width="9.3%" pos="right">
|
||||||
|
<control type="container" class="pcjs-swlbl" width="33%" pos="right">12</control>
|
||||||
|
<control type="container" class="pcjs-swlbl" width="33%" pos="right">13</control>
|
||||||
|
<control type="container" class="pcjs-swlbl" width="33%" pos="right">14</control>
|
||||||
|
<control type="container" class="pcjs-swpad" width="33%" pos="right"><control type="switch" binding="S12" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-swpad" width="33%" pos="right"><control type="switch" binding="S13" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-swpad" width="33%" pos="right"><control type="switch" binding="S14" width="100%" container="center"/></control>
|
||||||
|
</control>
|
||||||
|
<control type="container" class="pcjs-triplet" width="9.3%" pos="right">
|
||||||
|
<control type="container" class="pcjs-swlbl" width="33%" pos="right">15</control>
|
||||||
|
<control type="container" class="pcjs-swlbl" width="33%" pos="right">16</control>
|
||||||
|
<control type="container" class="pcjs-swlbl" width="33%" pos="right">17</control>
|
||||||
|
<control type="container" class="pcjs-swpad" width="33%" pos="right"><control type="switch" binding="S15" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-swpad" width="33%" pos="right"><control type="switch" binding="S16" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-swpad" width="33%" pos="right"><control type="switch" binding="S17" width="100%" container="center"/></control>
|
||||||
|
</control>
|
||||||
|
<control type="container" class="pcjs-triplet" width="9.3%" pos="right">
|
||||||
|
<control type="container" class="pcjs-swlbl" width="33%" pos="right">18</control>
|
||||||
|
<control type="container" class="pcjs-swlbl" width="33%" pos="right">19</control>
|
||||||
|
<control type="container" class="pcjs-swlbl" width="33%" pos="right">20</control>
|
||||||
|
<control type="container" class="pcjs-swpad" width="33%" pos="right"><control type="switch" binding="S18" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-swpad" width="33%" pos="right"><control type="switch" binding="S19" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-swpad" width="33%" pos="right"><control type="switch" binding="S20" width="100%" container="center"/></control>
|
||||||
|
</control>
|
||||||
|
<control type="container" class="pcjs-triplet" width="3.1%" pos="right">
|
||||||
|
<control type="container" class="pcjs-swlbl" width="100%" pos="right">21</control>
|
||||||
|
<control type="container" class="pcjs-swpad" width="100%" pos="right" style="clear:both;"><control type="switch" binding="S21" width="100%" container="center"/></control>
|
||||||
|
</control>
|
||||||
|
</control>
|
||||||
|
<control type="container" class="pcjs-textarea" width="60%" padTop="8px" padBottom="8px">
|
||||||
|
<control type="textarea" binding="print" width="100%" height="440px" padRight="8px" pos="relative" style="resize:vertical;"/>
|
||||||
|
<control type="container" width="100%">
|
||||||
|
<control type="text" binding="debugInput" width="auto"/>
|
||||||
|
<control type="button" binding="debugEnter">Enter</control>
|
||||||
|
<control type="button" binding="clear">Clear</control>
|
||||||
|
</control>
|
||||||
|
</control>
|
||||||
|
<control type="container" class="pcjs-registers" width="35%" padding="8px">
|
||||||
|
<name>Registers</name>
|
||||||
|
<control type="register" label="R0" binding="R0" pos="left" width="60px" padRight="8px" padBottom="8px">000000</control>
|
||||||
|
<control type="register" label="R1" binding="R1" pos="left" width="60px" padRight="8px" padBottom="8px">000000</control>
|
||||||
|
<control type="register" label="R2" binding="R2" pos="left" width="60px" padRight="8px" padBottom="8px">000000</control>
|
||||||
|
<control type="register" label="R3" binding="R3" pos="left" width="60px" padRight="8px" padBottom="8px">000000</control>
|
||||||
|
<control type="register" label="R4" binding="R4" pos="left" width="60px" padRight="8px" padBottom="8px">000000</control>
|
||||||
|
<control type="register" label="R5" binding="R5" pos="left" width="60px" padRight="8px" padBottom="8px">000000</control>
|
||||||
|
<control type="register" label="SP" binding="R6" pos="left" width="60px" padRight="8px" padBottom="8px">000000</control>
|
||||||
|
<control type="register" label="PC" binding="R7" pos="left" width="60px" padRight="8px" padBottom="8px">000000</control>
|
||||||
|
<control type="register" label="PS" binding="PS" pos="left" width="60px" padRight="8px" padBottom="8px">000000</control>
|
||||||
|
<control type="container" pos="left">
|
||||||
|
<control type="flag" label="N" binding="NF" width="8px" padRight="4px" padBottom="8px">0</control>
|
||||||
|
<control type="flag" label="Z" binding="ZF" width="8px" padRight="4px" padBottom="8px">0</control>
|
||||||
|
<control type="flag" label="V" binding="VF" width="8px" padRight="4px" padBottom="8px">0</control>
|
||||||
|
<control type="flag" label="C" binding="CF" width="8px" padRight="4px" padBottom="8px">0</control>
|
||||||
|
</control>
|
||||||
|
</control>
|
||||||
|
<control type="container" class="pcjs-registers" width="35%" padding="8px">
|
||||||
|
<control type="button" binding="run">Run</control>
|
||||||
|
<control type="button" binding="step">Step</control>
|
||||||
|
<control type="button" binding="reset">Reset</control>
|
||||||
|
<control type="button" binding="setSpeed">Fast</control>
|
||||||
|
<control type="description" binding="speed" pos="default">Stopped</control>
|
||||||
|
</control>
|
||||||
|
</panel>
|
||||||
215
devices/pdp11/panel/1145/front.xml
Normal file
215
devices/pdp11/panel/1145/front.xml
Normal file
|
|
@ -0,0 +1,215 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<panel id="panel" width="100%" padding="8px">
|
||||||
|
<name>Control Panel</name>
|
||||||
|
<control type="container" class="pcjs-panel-group" width="100%" padBottom="8px">
|
||||||
|
<control type="container" class="pcjs-triplet" width="9.3%" pos="right">
|
||||||
|
<control type="container" class="pcjs-ledlbl" width="33%" pos="right">16</control>
|
||||||
|
<control type="container" class="pcjs-ledlbl" width="33%" pos="right">18</control>
|
||||||
|
<control type="container" class="pcjs-ledlbl" width="33%" pos="right">22</control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="B16" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="B18" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="B22" width="100%" container="center"/></control>
|
||||||
|
</control>
|
||||||
|
<control type="container" class="pcjs-triplet" width="9.3%" pos="right">
|
||||||
|
<control type="container" class="pcjs-ledlbl" width="33%" pos="right">KRNL</control>
|
||||||
|
<control type="container" class="pcjs-ledlbl" width="33%" pos="right">SUPR</control>
|
||||||
|
<control type="container" class="pcjs-ledlbl" width="33%" pos="right">USER</control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="KERNEL" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="SUPER" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="USER" width="100%" container="center"/></control>
|
||||||
|
</control>
|
||||||
|
<control type="container" class="pcjs-triplet" width="6.2%" pos="right"></control>
|
||||||
|
<control type="container" class="pcjs-triplet" width="9.3%" pos="right">
|
||||||
|
<control type="container" class="pcjs-ledlbl0" width="100%" pos="right">ADDRESS</control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="A0" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="A1" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="A2" width="100%" container="center"/></control>
|
||||||
|
</control>
|
||||||
|
<control type="container" class="pcjs-triplet" width="9.3%" pos="right">
|
||||||
|
<control type="container" class="pcjs-ledlbl1" width="100%" pos="right" style="color:transparent">.</control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="A3" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="A4" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="A5" width="100%" container="center"/></control>
|
||||||
|
</control>
|
||||||
|
<control type="container" class="pcjs-triplet" width="9.3%" pos="right">
|
||||||
|
<control type="container" class="pcjs-ledlbl0" width="100%" pos="right" style="color:transparent">.</control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="A6" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="A7" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="A8" width="100%" container="center"/></control>
|
||||||
|
</control>
|
||||||
|
<control type="container" class="pcjs-triplet" width="9.3%" pos="right">
|
||||||
|
<control type="container" class="pcjs-ledlbl1" width="100%" pos="right" style="color:transparent">.</control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="A9" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="A10" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="A11" width="100%" container="center"/></control>
|
||||||
|
</control>
|
||||||
|
<control type="container" class="pcjs-triplet" width="9.3%" pos="right">
|
||||||
|
<control type="container" class="pcjs-ledlbl0" width="100%" pos="right" style="color:transparent">.</control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="A12" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="A13" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="A14" width="100%" container="center"/></control>
|
||||||
|
</control>
|
||||||
|
<control type="container" class="pcjs-triplet" width="9.3%" pos="right">
|
||||||
|
<control type="container" class="pcjs-ledlbl1" width="100%" pos="right" style="color:transparent">.</control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="A15" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="A16" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="A17" width="100%" container="center"/></control>
|
||||||
|
</control>
|
||||||
|
<control type="container" class="pcjs-triplet" width="9.3%" pos="right">
|
||||||
|
<control type="container" class="pcjs-ledlbl0" width="100%" pos="right" style="color:transparent">.</control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="A18" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="A19" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="A20" width="100%" container="center"/></control>
|
||||||
|
</control>
|
||||||
|
<control type="container" class="pcjs-triplet" width="3.1%" pos="right">
|
||||||
|
<control type="container" class="pcjs-ledlbl1" width="100%" pos="right" style="color:transparent">.</control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="100%" pos="right" style="clear:both;"><control type="rled" binding="A21" width="100%" container="center"/></control>
|
||||||
|
</control>
|
||||||
|
</control>
|
||||||
|
<control type="container" class="pcjs-panel-group" width="100%" padBottom="8px">
|
||||||
|
<control type="container" class="pcjs-triplet" width="9.3%" pos="right">
|
||||||
|
<control type="container" class="pcjs-ledlbl" width="33%" pos="right">LED1</control>
|
||||||
|
<control type="container" class="pcjs-ledlbl" width="33%" pos="right">LED2</control>
|
||||||
|
<control type="container" class="pcjs-ledlbl" width="33%" pos="right">LED3</control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="LED1" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="LED2" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="LED3" width="100%" container="center"/></control>
|
||||||
|
</control>
|
||||||
|
<control type="container" class="pcjs-triplet" width="9.3%" pos="right">
|
||||||
|
<control type="container" class="pcjs-ledlbl" width="33%" pos="right">LED4</control>
|
||||||
|
<control type="container" class="pcjs-ledlbl" width="33%" pos="right">LED5</control>
|
||||||
|
<control type="container" class="pcjs-ledlbl" width="33%" pos="right">LED6</control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="LED4" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="LED5" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="LED6" width="100%" container="center"/></control>
|
||||||
|
</control>
|
||||||
|
<control type="container" class="pcjs-triplet" width="6.2%" pos="right"></control>
|
||||||
|
<control type="container" class="pcjs-triplet" width="9.3%" pos="right">
|
||||||
|
<control type="container" class="pcjs-ledlbl0" width="100%" pos="right">DATA</control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="D0" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="D1" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="D2" width="100%" container="center"/></control>
|
||||||
|
</control>
|
||||||
|
<control type="container" class="pcjs-triplet" width="9.3%" pos="right">
|
||||||
|
<control type="container" class="pcjs-ledlbl1" width="100%" pos="right" style="color:transparent">.</control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="D3" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="D4" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="D5" width="100%" container="center"/></control>
|
||||||
|
</control>
|
||||||
|
<control type="container" class="pcjs-triplet" width="9.3%" pos="right">
|
||||||
|
<control type="container" class="pcjs-ledlbl0" width="100%" pos="right" style="color:transparent">.</control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="D6" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="D7" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="D8" width="100%" container="center"/></control>
|
||||||
|
</control>
|
||||||
|
<control type="container" class="pcjs-triplet" width="9.3%" pos="right">
|
||||||
|
<control type="container" class="pcjs-ledlbl1" width="100%" pos="right" style="color:transparent">.</control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="D9" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="D10" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="D11" width="100%" container="center"/></control>
|
||||||
|
</control>
|
||||||
|
<control type="container" class="pcjs-triplet" width="9.3%" pos="right">
|
||||||
|
<control type="container" class="pcjs-ledlbl0" width="100%" pos="right" style="color:transparent">.</control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="D12" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="D13" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="33%" pos="right"><control type="rled" binding="D14" width="100%" container="center"/></control>
|
||||||
|
</control>
|
||||||
|
<control type="container" class="pcjs-triplet" width="3.1%" pos="right">
|
||||||
|
<control type="container" class="pcjs-ledlbl1" width="100%" pos="right" style="color:transparent">.</control>
|
||||||
|
<control type="container" class="pcjs-ledpad" width="100%" pos="right" style="clear:both;"><control type="rled" binding="D15" width="100%" container="center"/></control>
|
||||||
|
</control>
|
||||||
|
</control>
|
||||||
|
<control type="container" class="pcjs-panel-group" width="100%" padBottom="8px">
|
||||||
|
<control type="container" class="pcjs-triplet" width="9.3%" pos="right">
|
||||||
|
<control type="container" class="pcjs-swlbl" width="33%" pos="right">START</control>
|
||||||
|
<control type="container" class="pcjs-swlbl" width="33%" pos="right">STEP</control>
|
||||||
|
<control type="container" class="pcjs-swlbl" width="33%" pos="right">ENABLE</control>
|
||||||
|
<control type="container" class="pcjs-swpad" width="33%" pos="right"><control type="switch" binding="START" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-swpad" width="33%" pos="right"><control type="switch" binding="STEP" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-swpad" width="33%" pos="right"><control type="switch" binding="ENABLE" width="100%" container="center"/></control>
|
||||||
|
</control>
|
||||||
|
<control type="container" class="pcjs-triplet" width="9.3%" pos="right">
|
||||||
|
<control type="container" class="pcjs-swlbl" width="33%" pos="right">CONT</control>
|
||||||
|
<control type="container" class="pcjs-swlbl" width="33%" pos="right">DEP</control>
|
||||||
|
<control type="container" class="pcjs-swlbl" width="33%" pos="right">EXAM</control>
|
||||||
|
<control type="container" class="pcjs-swpad" width="33%" pos="right"><control type="switch" binding="CONT" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-swpad" width="33%" pos="right"><control type="switch" binding="DEP" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-swpad" width="33%" pos="right"><control type="switch" binding="EXAM" width="100%" container="center"/></control>
|
||||||
|
</control>
|
||||||
|
<control type="container" class="pcjs-triplet" width="6.2%" pos="right">
|
||||||
|
<control type="container" class="pcjs-swlbl" width="50%" pos="right">LOAD</control>
|
||||||
|
<control type="container" class="pcjs-swlbl" width="50%" pos="right">TEST</control>
|
||||||
|
<control type="container" class="pcjs-swpad" width="50%" pos="right" style="clear:both;"><control type="switch" binding="LOAD" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-swpad" width="50%" pos="right"><control type="switch" binding="TEST" width="100%" container="center"/></control>
|
||||||
|
</control>
|
||||||
|
<control type="container" class="pcjs-triplet" width="9.3%" pos="right">
|
||||||
|
<control type="container" class="pcjs-swlbl" width="33%" pos="right">0</control>
|
||||||
|
<control type="container" class="pcjs-swlbl" width="33%" pos="right">1</control>
|
||||||
|
<control type="container" class="pcjs-swlbl" width="33%" pos="right">2</control>
|
||||||
|
<control type="container" class="pcjs-swpad" width="33%" pos="right"><control type="switch" binding="S0" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-swpad" width="33%" pos="right"><control type="switch" binding="S1" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-swpad" width="33%" pos="right"><control type="switch" binding="S2" width="100%" container="center"/></control>
|
||||||
|
</control>
|
||||||
|
<control type="container" class="pcjs-triplet" width="9.3%" pos="right">
|
||||||
|
<control type="container" class="pcjs-swlbl" width="33%" pos="right">3</control>
|
||||||
|
<control type="container" class="pcjs-swlbl" width="33%" pos="right">4</control>
|
||||||
|
<control type="container" class="pcjs-swlbl" width="33%" pos="right">5</control>
|
||||||
|
<control type="container" class="pcjs-swpad" width="33%" pos="right"><control type="switch" binding="S3" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-swpad" width="33%" pos="right"><control type="switch" binding="S4" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-swpad" width="33%" pos="right"><control type="switch" binding="S5" width="100%" container="center"/></control>
|
||||||
|
</control>
|
||||||
|
<control type="container" class="pcjs-triplet" width="9.3%" pos="right">
|
||||||
|
<control type="container" class="pcjs-swlbl" width="33%" pos="right">6</control>
|
||||||
|
<control type="container" class="pcjs-swlbl" width="33%" pos="right">7</control>
|
||||||
|
<control type="container" class="pcjs-swlbl" width="33%" pos="right">8</control>
|
||||||
|
<control type="container" class="pcjs-swpad" width="33%" pos="right"><control type="switch" binding="S6" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-swpad" width="33%" pos="right"><control type="switch" binding="S7" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-swpad" width="33%" pos="right"><control type="switch" binding="S8" width="100%" container="center"/></control>
|
||||||
|
</control>
|
||||||
|
<control type="container" class="pcjs-triplet" width="9.3%" pos="right">
|
||||||
|
<control type="container" class="pcjs-swlbl" width="33%" pos="right">9</control>
|
||||||
|
<control type="container" class="pcjs-swlbl" width="33%" pos="right">10</control>
|
||||||
|
<control type="container" class="pcjs-swlbl" width="33%" pos="right">11</control>
|
||||||
|
<control type="container" class="pcjs-swpad" width="33%" pos="right"><control type="switch" binding="S9" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-swpad" width="33%" pos="right"><control type="switch" binding="S10" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-swpad" width="33%" pos="right"><control type="switch" binding="S11" width="100%" container="center"/></control>
|
||||||
|
</control>
|
||||||
|
<control type="container" class="pcjs-triplet" width="9.3%" pos="right">
|
||||||
|
<control type="container" class="pcjs-swlbl" width="33%" pos="right">12</control>
|
||||||
|
<control type="container" class="pcjs-swlbl" width="33%" pos="right">13</control>
|
||||||
|
<control type="container" class="pcjs-swlbl" width="33%" pos="right">14</control>
|
||||||
|
<control type="container" class="pcjs-swpad" width="33%" pos="right"><control type="switch" binding="S12" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-swpad" width="33%" pos="right"><control type="switch" binding="S13" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-swpad" width="33%" pos="right"><control type="switch" binding="S14" width="100%" container="center"/></control>
|
||||||
|
</control>
|
||||||
|
<control type="container" class="pcjs-triplet" width="9.3%" pos="right">
|
||||||
|
<control type="container" class="pcjs-swlbl" width="33%" pos="right">15</control>
|
||||||
|
<control type="container" class="pcjs-swlbl" width="33%" pos="right">16</control>
|
||||||
|
<control type="container" class="pcjs-swlbl" width="33%" pos="right">17</control>
|
||||||
|
<control type="container" class="pcjs-swpad" width="33%" pos="right"><control type="switch" binding="S15" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-swpad" width="33%" pos="right"><control type="switch" binding="S16" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-swpad" width="33%" pos="right"><control type="switch" binding="S17" width="100%" container="center"/></control>
|
||||||
|
</control>
|
||||||
|
<control type="container" class="pcjs-triplet" width="9.3%" pos="right">
|
||||||
|
<control type="container" class="pcjs-swlbl" width="33%" pos="right">18</control>
|
||||||
|
<control type="container" class="pcjs-swlbl" width="33%" pos="right">19</control>
|
||||||
|
<control type="container" class="pcjs-swlbl" width="33%" pos="right">20</control>
|
||||||
|
<control type="container" class="pcjs-swpad" width="33%" pos="right"><control type="switch" binding="S18" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-swpad" width="33%" pos="right"><control type="switch" binding="S19" width="100%" container="center"/></control>
|
||||||
|
<control type="container" class="pcjs-swpad" width="33%" pos="right"><control type="switch" binding="S20" width="100%" container="center"/></control>
|
||||||
|
</control>
|
||||||
|
<control type="container" class="pcjs-triplet" width="3.1%" pos="right">
|
||||||
|
<control type="container" class="pcjs-swlbl" width="100%" pos="right">21</control>
|
||||||
|
<control type="container" class="pcjs-swpad" width="100%" pos="right" style="clear:both;"><control type="switch" binding="S21" width="100%" container="center"/></control>
|
||||||
|
</control>
|
||||||
|
</control>
|
||||||
|
<control type="container" class="pcjs-textarea" width="60%" padTop="8px" padBottom="8px">
|
||||||
|
<control type="textarea" binding="print" width="100%" height="280px" padRight="8px" pos="relative" style="resize:vertical;"/>
|
||||||
|
</control>
|
||||||
|
<control type="container" class="pcjs-registers" width="35%" padding="8px">
|
||||||
|
<control type="button" binding="run">Run</control>
|
||||||
|
<control type="button" binding="reset">Reset</control>
|
||||||
|
<control type="button" binding="setSpeed">Fast</control>
|
||||||
|
<control type="description" binding="speed" pos="default">Stopped</control>
|
||||||
|
</control>
|
||||||
|
</panel>
|
||||||
|
|
@ -204,7 +204,7 @@
|
||||||
</control>
|
</control>
|
||||||
</control>
|
</control>
|
||||||
<control type="container" class="pcjs-textarea" width="60%" padTop="8px" padBottom="8px">
|
<control type="container" class="pcjs-textarea" width="60%" padTop="8px" padBottom="8px">
|
||||||
<control type="textarea" binding="print" width="100%" height="380px" padRight="8px" pos="relative" style="resize:vertical;"/>
|
<control type="textarea" binding="print" width="100%" height="440px" padRight="8px" pos="relative" style="resize:vertical;"/>
|
||||||
<control type="container" width="100%">
|
<control type="container" width="100%">
|
||||||
<control type="text" binding="debugInput" width="auto"/>
|
<control type="text" binding="debugInput" width="auto"/>
|
||||||
<control type="button" binding="debugEnter">Enter</control>
|
<control type="button" binding="debugEnter">Enter</control>
|
||||||
|
|
|
||||||
|
|
@ -204,7 +204,7 @@
|
||||||
</control>
|
</control>
|
||||||
</control>
|
</control>
|
||||||
<control type="container" class="pcjs-textarea" width="60%" padTop="8px" padBottom="8px">
|
<control type="container" class="pcjs-textarea" width="60%" padTop="8px" padBottom="8px">
|
||||||
<control type="textarea" binding="print" width="100%" height="240px" padRight="8px" pos="relative" style="resize:vertical;"/>
|
<control type="textarea" binding="print" width="100%" height="280px" padRight="8px" pos="relative" style="resize:vertical;"/>
|
||||||
</control>
|
</control>
|
||||||
<control type="container" class="pcjs-registers" width="35%" padding="8px">
|
<control type="container" class="pcjs-registers" width="35%" padding="8px">
|
||||||
<control type="button" binding="run">Run</control>
|
<control type="button" binding="run">Run</control>
|
||||||
|
|
|
||||||
|
|
@ -8,5 +8,6 @@ PDP-11 Control Panels
|
||||||
---------------------
|
---------------------
|
||||||
|
|
||||||
* [11/20 Front Panels](1120/)
|
* [11/20 Front Panels](1120/)
|
||||||
|
* [11/45 Front Panels](1145/)
|
||||||
* [11/70 Front Panels](1170/)
|
* [11/70 Front Panels](1170/)
|
||||||
* [Terminal Test Panels](test/)
|
* [Terminal Test Panels](test/)
|
||||||
|
|
|
||||||
|
|
@ -53,6 +53,6 @@
|
||||||
<control type="button" binding="loadTape">Load</control>
|
<control type="button" binding="loadTape">Load</control>
|
||||||
<control type="description" binding="descTape" padRight="8px"/>
|
<control type="description" binding="descTape" padRight="8px"/>
|
||||||
<control type="file" binding="mountTape"/>
|
<control type="file" binding="mountTape"/>
|
||||||
<control type="progress" binding="readProgress" pos="default" width="250px" padTop="8px">Tape Progress</control>
|
<control type="progress" binding="readProgress" pos="default" padTop="8px">Tape Progress</control>
|
||||||
</control>
|
</control>
|
||||||
</device>
|
</device>
|
||||||
|
|
|
||||||
|
|
@ -12,8 +12,8 @@ disk cartridges.
|
||||||
|
|
||||||
Machines containing the [RK11 Component](/modules/pdp11/lib/rk11.js) include:
|
Machines containing the [RK11 Component](/modules/pdp11/lib/rk11.js) include:
|
||||||
|
|
||||||
- [PDP-11/70 Boot Monitor](/devices/pdp11/machine/1170/monitor/) (with [Debugger](/devices/pdp11/machine/1170/monitor/debugger/))
|
|
||||||
- [PDP-11/70 with Front Panel](/devices/pdp11/machine/1170/panel/) (with [Debugger](/devices/pdp11/machine/1170/panel/debugger/))
|
- [PDP-11/70 with Front Panel](/devices/pdp11/machine/1170/panel/) (with [Debugger](/devices/pdp11/machine/1170/panel/debugger/))
|
||||||
|
- [PDP-11/70 with VT100 Terminal](/devices/pdp11/machine/1170/vt100/) (with [Debugger](/devices/pdp11/machine/1170/vt100/debugger/))
|
||||||
|
|
||||||
PCjs has archived a selection of [RK03 Disk Images](/disks/dec/rk03/) from [Paul Nankervis](http://skn.noip.me/pdp11/)
|
PCjs has archived a selection of [RK03 Disk Images](/disks/dec/rk03/) from [Paul Nankervis](http://skn.noip.me/pdp11/)
|
||||||
for use by those machines, which are listed in the following RK11 Device XML file:
|
for use by those machines, which are listed in the following RK11 Device XML file:
|
||||||
|
|
|
||||||
|
|
@ -12,8 +12,8 @@ The RL11 Disk Controller controls up to four RL01 or RL02 disk drives, which in
|
||||||
|
|
||||||
Machines containing the [RL11 Component](/modules/pdp11/lib/pc11.js) include:
|
Machines containing the [RL11 Component](/modules/pdp11/lib/pc11.js) include:
|
||||||
|
|
||||||
- [PDP-11/70 Boot Monitor](/devices/pdp11/machine/1170/monitor/) (with [Debugger](/devices/pdp11/machine/1170/monitor/debugger/))
|
|
||||||
- [PDP-11/70 with Front Panel](/devices/pdp11/machine/1170/panel/) (with [Debugger](/devices/pdp11/machine/1170/panel/debugger/))
|
- [PDP-11/70 with Front Panel](/devices/pdp11/machine/1170/panel/) (with [Debugger](/devices/pdp11/machine/1170/panel/debugger/))
|
||||||
|
- [PDP-11/70 with VT100 Terminal](/devices/pdp11/machine/1170/vt100/) (with [Debugger](/devices/pdp11/machine/1170/vt100/debugger/))
|
||||||
|
|
||||||
PCjs has archived a selection of [RL01K](/disks/dec/rl01k/) and [RL02K](/disks/dec/rl02k/) disk images
|
PCjs has archived a selection of [RL01K](/disks/dec/rl01k/) and [RL02K](/disks/dec/rl02k/) disk images
|
||||||
from [Paul Nankervis](http://skn.noip.me/pdp11/) for use by those machines, which are also listed in the
|
from [Paul Nankervis](http://skn.noip.me/pdp11/) for use by those machines, which are also listed in the
|
||||||
|
|
|
||||||
|
|
@ -52,7 +52,7 @@
|
||||||
}
|
}
|
||||||
.pcjs-progress {
|
.pcjs-progress {
|
||||||
height: 20px;
|
height: 20px;
|
||||||
width: 300px;
|
width: 200px;
|
||||||
margin-top: 8px;
|
margin-top: 8px;
|
||||||
border: 1px solid black;
|
border: 1px solid black;
|
||||||
position: relative;
|
position: relative;
|
||||||
|
|
@ -66,7 +66,7 @@
|
||||||
}
|
}
|
||||||
.pcjs-progress-text {
|
.pcjs-progress-text {
|
||||||
height: 20px;
|
height: 20px;
|
||||||
width: 300px;
|
width: 200px;
|
||||||
font-size: small;
|
font-size: small;
|
||||||
line-height: 20px;
|
line-height: 20px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
|
|
@ -224,7 +224,7 @@
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
@media screen and (max-width: 900px) {
|
@media screen and (max-width: 800px) {
|
||||||
.pcjs-textarea {
|
.pcjs-textarea {
|
||||||
width: 100% !important;
|
width: 100% !important;
|
||||||
}
|
}
|
||||||
|
|
@ -242,3 +242,13 @@
|
||||||
padding-right: 0 !important;
|
padding-right: 0 !important;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@media screen and (min-width: 1400px) {
|
||||||
|
.machine-left, .machine-right {
|
||||||
|
max-width: 45%;
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
.machine-right + * {
|
||||||
|
clear: both;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -111,6 +111,7 @@ function SerialPort8080(parmsSerial) {
|
||||||
*/
|
*/
|
||||||
this.fAutoXOFF = true;
|
this.fAutoXOFF = true;
|
||||||
this.fAutoStop = false;
|
this.fAutoStop = false;
|
||||||
|
this.fNullModem = true;
|
||||||
|
|
||||||
Component.call(this, "SerialPort", parmsSerial, SerialPort8080, Messages8080.SERIAL);
|
Component.call(this, "SerialPort", parmsSerial, SerialPort8080, Messages8080.SERIAL);
|
||||||
|
|
||||||
|
|
@ -128,14 +129,15 @@ function SerialPort8080(parmsSerial) {
|
||||||
* No connection until initConnection() is called.
|
* No connection until initConnection() is called.
|
||||||
*/
|
*/
|
||||||
this.sDataReceived = "";
|
this.sDataReceived = "";
|
||||||
this.connection = this.sendData = null;
|
this.connection = this.sendData = this.updateStatus = null;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Export all functions required by initConnection(); currently, this is the bare minimum (no flow control yet).
|
* Export all functions required by initConnection().
|
||||||
*/
|
*/
|
||||||
this['exports'] = {
|
this['exports'] = {
|
||||||
'connect': this.initConnection,
|
'connect': this.initConnection,
|
||||||
'receiveData': this.receiveData
|
'receiveData': this.receiveData,
|
||||||
|
'receiveStatus': this.receiveStatus
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -466,7 +468,7 @@ SerialPort8080.prototype.initBus = function(cmp, bus, cpu, dbg)
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* initConnection()
|
* initConnection(fNullModem)
|
||||||
*
|
*
|
||||||
* If a machine 'connection' parameter exists of the form "{sourcePort}->{targetMachine}.{targetPort}",
|
* If a machine 'connection' parameter exists of the form "{sourcePort}->{targetMachine}.{targetPort}",
|
||||||
* and "{sourcePort}" matches our idComponent, then look for a component with id "{targetMachine}.{targetPort}".
|
* and "{sourcePort}" matches our idComponent, then look for a component with id "{targetMachine}.{targetPort}".
|
||||||
|
|
@ -474,6 +476,7 @@ SerialPort8080.prototype.initBus = function(cmp, bus, cpu, dbg)
|
||||||
* If the target component is found, then verify that it has exported functions with the following names:
|
* If the target component is found, then verify that it has exported functions with the following names:
|
||||||
*
|
*
|
||||||
* receiveData(data): called when we have data to transmit; aliased internally to sendData(data)
|
* receiveData(data): called when we have data to transmit; aliased internally to sendData(data)
|
||||||
|
* receiveStatus(pins): called when our control signals have changed; aliased internally to updateStatus(pins)
|
||||||
*
|
*
|
||||||
* For now, we're not going to worry about communication in the other direction, because when the target component
|
* For now, we're not going to worry about communication in the other direction, because when the target component
|
||||||
* performs its own initConnection(), it will find our receiveData() function, at which point communication in both
|
* performs its own initConnection(), it will find our receiveData() function, at which point communication in both
|
||||||
|
|
@ -484,8 +487,9 @@ SerialPort8080.prototype.initBus = function(cmp, bus, cpu, dbg)
|
||||||
* if we've already initialized, no harm done.
|
* if we've already initialized, no harm done.
|
||||||
*
|
*
|
||||||
* @this {SerialPort8080}
|
* @this {SerialPort8080}
|
||||||
|
* @param {boolean} [fNullModem] (caller's null-modem setting, to ensure our settings are in agreement)
|
||||||
*/
|
*/
|
||||||
SerialPort8080.prototype.initConnection = function()
|
SerialPort8080.prototype.initConnection = function(fNullModem)
|
||||||
{
|
{
|
||||||
if (!this.connection) {
|
if (!this.connection) {
|
||||||
var sConnection = this.cmp.getMachineParm("connection");
|
var sConnection = this.cmp.getMachineParm("connection");
|
||||||
|
|
@ -500,9 +504,11 @@ SerialPort8080.prototype.initConnection = function()
|
||||||
var exports = this.connection['exports'];
|
var exports = this.connection['exports'];
|
||||||
if (exports) {
|
if (exports) {
|
||||||
var fnConnect = exports['connect'];
|
var fnConnect = exports['connect'];
|
||||||
if (fnConnect) fnConnect.call(this.connection);
|
if (fnConnect) fnConnect.call(this.connection, this.fNullModem);
|
||||||
this.sendData = exports['receiveData'];
|
this.sendData = exports['receiveData'];
|
||||||
if (this.sendData) {
|
if (this.sendData) {
|
||||||
|
this.fNullModem = fNullModem;
|
||||||
|
this.updateStatus = exports['receiveStatus'];
|
||||||
this.status(this.idMachine + '.' + sSourceID + " connected to " + sTargetID);
|
this.status(this.idMachine + '.' + sSourceID + " connected to " + sTargetID);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -535,7 +541,7 @@ SerialPort8080.prototype.powerUp = function(data, fRepower)
|
||||||
* may be not fully resolved until the target machine performs its own initConnection(), which will
|
* may be not fully resolved until the target machine performs its own initConnection(), which will
|
||||||
* in turn invoke our initConnection() again.
|
* in turn invoke our initConnection() again.
|
||||||
*/
|
*/
|
||||||
this.initConnection();
|
this.initConnection(this.fNullModem);
|
||||||
|
|
||||||
if (!data || !this.restore) {
|
if (!data || !this.restore) {
|
||||||
this.reset();
|
this.reset();
|
||||||
|
|
@ -713,6 +719,22 @@ SerialPort8080.prototype.receiveData = function(data)
|
||||||
return true; // for now, return true regardless, since we're buffering everything anyway
|
return true; // for now, return true regardless, since we're buffering everything anyway
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* receiveStatus(pins)
|
||||||
|
*
|
||||||
|
* NOTE: Prior to the addition of this interface, the DSR bit was initialized set and remained set for the life
|
||||||
|
* of the machine. It is entirely appropriate that this is the only way the bit can be changed, because it represents
|
||||||
|
* an external control signal.
|
||||||
|
*
|
||||||
|
* @this {SerialPort8080}
|
||||||
|
* @param {number} pins
|
||||||
|
*/
|
||||||
|
SerialPort8080.prototype.receiveStatus = function(pins)
|
||||||
|
{
|
||||||
|
this.bStatus &= ~SerialPort8080.UART8251.STATUS.DSR;
|
||||||
|
if (pins & RS232.DSR.MASK) this.bStatus |= SerialPort8080.UART8251.STATUS.DSR;
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* transmitByte(b)
|
* transmitByte(b)
|
||||||
*
|
*
|
||||||
|
|
@ -865,6 +887,23 @@ SerialPort8080.prototype.outControl = function(port, bOut, addrFrom)
|
||||||
this.bMode = bOut;
|
this.bMode = bOut;
|
||||||
this.fReady = true;
|
this.fReady = true;
|
||||||
} else {
|
} else {
|
||||||
|
/*
|
||||||
|
* Whenever DTR or RTS changes, we also want to notify any connected machine, via updateStatus().
|
||||||
|
*/
|
||||||
|
if (this.updateStatus) {
|
||||||
|
var delta = (bOut ^ this.bCommand);
|
||||||
|
if (delta & (SerialPort8080.UART8251.COMMAND.RTS | SerialPort8080.UART8251.COMMAND.DTR)) {
|
||||||
|
var pins = 0;
|
||||||
|
if (this.fNullModem) {
|
||||||
|
pins |= (bOut & SerialPort8080.UART8251.COMMAND.RTS)? RS232.CTS.MASK : 0;
|
||||||
|
pins |= (bOut & SerialPort8080.UART8251.COMMAND.DTR)? (RS232.DSR.MASK | RS232.CD.MASK): 0;
|
||||||
|
} else {
|
||||||
|
pins |= (bOut & SerialPort8080.UART8251.COMMAND.RTS)? RS232.RTS.MASK : 0;
|
||||||
|
pins |= (bOut & SerialPort8080.UART8251.COMMAND.DTR)? RS232.DTR.MASK : 0;
|
||||||
|
}
|
||||||
|
this.updateStatus.call(this.connection, pins);
|
||||||
|
}
|
||||||
|
}
|
||||||
this.bCommand = bOut;
|
this.bCommand = bOut;
|
||||||
if (this.bCommand & SerialPort8080.UART8251.COMMAND.INTERNAL_RESET) {
|
if (this.bCommand & SerialPort8080.UART8251.COMMAND.INTERNAL_RESET) {
|
||||||
this.fReady = false;
|
this.fReady = false;
|
||||||
|
|
|
||||||
|
|
@ -245,7 +245,7 @@ Mouse.prototype.powerUp = function(data, fRepower)
|
||||||
var componentAdapter = null;
|
var componentAdapter = null;
|
||||||
while ((componentAdapter = this.cmp.getMachineComponent(this.sAdapterType, componentAdapter))) {
|
while ((componentAdapter = this.cmp.getMachineComponent(this.sAdapterType, componentAdapter))) {
|
||||||
if (componentAdapter.attachMouse) {
|
if (componentAdapter.attachMouse) {
|
||||||
this.componentAdapter = componentAdapter.attachMouse(this.idAdapter, this);
|
this.componentAdapter = componentAdapter.attachMouse(this.idAdapter, this, this.receiveStatus);
|
||||||
if (this.componentAdapter) {
|
if (this.componentAdapter) {
|
||||||
/*
|
/*
|
||||||
* It's possible that the SerialPort we've just attached to might want to bring us "up to speed"
|
* It's possible that the SerialPort we've just attached to might want to bring us "up to speed"
|
||||||
|
|
@ -351,7 +351,14 @@ Mouse.prototype.initState = function(data)
|
||||||
this.yDelta = data[i++];
|
this.yDelta = data[i++];
|
||||||
this.fButton1 = data[i++]; // FYI, we consider button1 to be the LEFT button
|
this.fButton1 = data[i++]; // FYI, we consider button1 to be the LEFT button
|
||||||
this.fButton2 = data[i++]; // FYI, we consider button2 to be the RIGHT button
|
this.fButton2 = data[i++]; // FYI, we consider button2 to be the RIGHT button
|
||||||
this.bMCR = data[i];
|
this.pins = data[i];
|
||||||
|
/*
|
||||||
|
* Convert old UART "MCR" data to new RS-232 "pins" data, in case we're loading an old state;
|
||||||
|
* detection and conversion relies on the fact that the MCR bits don't overlap with any RS-232 bits.
|
||||||
|
*/
|
||||||
|
if (this.pins & (SerialPort.MCR.DTR | SerialPort.MCR.RTS)) {
|
||||||
|
this.pins = ((this.pins & SerialPort.MCR.DTR)? RS232.DTR.MASK : 0) | ((this.pins & SerialPort.MCR.RTS)? RS232.RTS.MASK : 0);
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -372,7 +379,7 @@ Mouse.prototype.saveState = function()
|
||||||
data[i++] = this.yDelta;
|
data[i++] = this.yDelta;
|
||||||
data[i++] = this.fButton1;
|
data[i++] = this.fButton1;
|
||||||
data[i++] = this.fButton2;
|
data[i++] = this.fButton2;
|
||||||
data[i] = this.bMCR;
|
data[i] = this.pins;
|
||||||
return data;
|
return data;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -626,7 +633,7 @@ Mouse.prototype.sendPacket = function(sDiag, xDiag, yDiag)
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* notifyMCR(bMCR)
|
* receiveStatus(pins)
|
||||||
*
|
*
|
||||||
* The SerialPort notifies us whenever SerialPort.MCR.DTR or SerialPort.MCR.RTS changes.
|
* The SerialPort notifies us whenever SerialPort.MCR.DTR or SerialPort.MCR.RTS changes.
|
||||||
*
|
*
|
||||||
|
|
@ -641,20 +648,20 @@ Mouse.prototype.sendPacket = function(sDiag, xDiag, yDiag)
|
||||||
* for sending the identification byte. Right or wrong, this gets the ball rolling for Windows v1.01.
|
* for sending the identification byte. Right or wrong, this gets the ball rolling for Windows v1.01.
|
||||||
*
|
*
|
||||||
* @this {Mouse}
|
* @this {Mouse}
|
||||||
* @param {number} bMCR
|
* @param {number} pins
|
||||||
*/
|
*/
|
||||||
Mouse.prototype.notifyMCR = function(bMCR)
|
Mouse.prototype.receiveStatus = function(pins)
|
||||||
{
|
{
|
||||||
var fActive = ((bMCR & (SerialPort.MCR.DTR | SerialPort.MCR.RTS)) == (SerialPort.MCR.DTR | SerialPort.MCR.RTS));
|
var fActive = ((pins & (RS232.DTR.MASK | RS232.RTS.MASK)) == (RS232.DTR.MASK | RS232.RTS.MASK));
|
||||||
if (fActive) {
|
if (fActive) {
|
||||||
if (!this.fActive) {
|
if (!this.fActive) {
|
||||||
var fIdentify = false;
|
var fIdentify = false;
|
||||||
if (!(this.bMCR & SerialPort.MCR.RTS)) {
|
if (!(this.pins & RS232.RTS.MASK)) {
|
||||||
this.reset();
|
this.reset();
|
||||||
this.printMessage("serial mouse reset");
|
this.printMessage("serial mouse reset");
|
||||||
fIdentify = true;
|
fIdentify = true;
|
||||||
}
|
}
|
||||||
if (!(this.bMCR & SerialPort.MCR.DTR)) {
|
if (!(this.pins & RS232.DTR.MASK)) {
|
||||||
this.printMessage("serial mouse ID requested");
|
this.printMessage("serial mouse ID requested");
|
||||||
fIdentify = true;
|
fIdentify = true;
|
||||||
}
|
}
|
||||||
|
|
@ -704,7 +711,7 @@ Mouse.prototype.notifyMCR = function(bMCR)
|
||||||
this.setActive(fActive);
|
this.setActive(fActive);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.bMCR = bMCR;
|
this.pins = pins;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -122,6 +122,9 @@ function SerialPort(parmsSerial) {
|
||||||
this.charBOL = parmsSerial['charBOL'];
|
this.charBOL = parmsSerial['charBOL'];
|
||||||
this.iLogicalCol = 0;
|
this.iLogicalCol = 0;
|
||||||
|
|
||||||
|
this.bMSRInit = SerialPort.MSR.CTS | SerialPort.MSR.DSR;
|
||||||
|
this.fNullModem = true;
|
||||||
|
|
||||||
Component.call(this, "SerialPort", parmsSerial, SerialPort, Messages.SERIAL);
|
Component.call(this, "SerialPort", parmsSerial, SerialPort, Messages.SERIAL);
|
||||||
|
|
||||||
var sBinding = parmsSerial['binding'];
|
var sBinding = parmsSerial['binding'];
|
||||||
|
|
@ -138,14 +141,15 @@ function SerialPort(parmsSerial) {
|
||||||
* No connection until initConnection() is called.
|
* No connection until initConnection() is called.
|
||||||
*/
|
*/
|
||||||
this.sDataReceived = "";
|
this.sDataReceived = "";
|
||||||
this.connection = this.sendData = null;
|
this.connection = this.sendData = this.updateStatus = null;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Export all functions required by initConnection(); currently, this is the bare minimum (no flow control yet).
|
* Export all functions required by initConnection().
|
||||||
*/
|
*/
|
||||||
this['exports'] = {
|
this['exports'] = {
|
||||||
'connect': this.initConnection,
|
'connect': this.initConnection,
|
||||||
'receiveData': this.receiveData
|
'receiveData': this.receiveData,
|
||||||
|
'receiveStatus': this.receiveStatus
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -339,35 +343,26 @@ SerialPort.MSR.RLSD = 0x80; // complement of the RLSD (Received Line
|
||||||
SerialPort.SCR = {REG: 7};
|
SerialPort.SCR = {REG: 7};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* attachMouse(id, mouse)
|
* attachMouse(id, mouse, fnUpdate)
|
||||||
*
|
*
|
||||||
* @this {SerialPort}
|
* @this {SerialPort}
|
||||||
* @param {string} id
|
* @param {string} id
|
||||||
* @param {Mouse} mouse component
|
* @param {Mouse} mouse
|
||||||
* @return {Component} this or null, based on whether or not the specified ID matches
|
* @param {function(number)} fnUpdate
|
||||||
|
* @return {Component|null}
|
||||||
*/
|
*/
|
||||||
SerialPort.prototype.attachMouse = function(id, mouse)
|
SerialPort.prototype.attachMouse = function(id, mouse, fnUpdate)
|
||||||
{
|
{
|
||||||
if (id == this.idComponent) {
|
var component = null;
|
||||||
this.mouse = mouse;
|
if (id == this.idComponent && !this.connection) {
|
||||||
return this;
|
this.connection = mouse;
|
||||||
|
this.updateStatus = fnUpdate;
|
||||||
|
this.fNullModem = false;
|
||||||
|
component = this;
|
||||||
}
|
}
|
||||||
return null;
|
return component;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
|
||||||
* syncMouse()
|
|
||||||
*
|
|
||||||
* NOTE: This is probably obsolete, but the Mouse component still might discover a need for it. See Mouse.powerUp().
|
|
||||||
*
|
|
||||||
* @this {SerialPort}
|
|
||||||
*
|
|
||||||
SerialPort.prototype.syncMouse = function()
|
|
||||||
{
|
|
||||||
if (this.mouse) this.mouse.notifyMCR(this.bMCR);
|
|
||||||
};
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* setBinding(sHTMLType, sBinding, control, sValue)
|
* setBinding(sHTMLType, sBinding, control, sValue)
|
||||||
*
|
*
|
||||||
|
|
@ -471,7 +466,7 @@ SerialPort.prototype.initBus = function(cmp, bus, cpu, dbg)
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* initConnection()
|
* initConnection(fNullModem)
|
||||||
*
|
*
|
||||||
* If a machine 'connection' parameter exists of the form "{sourcePort}->{targetMachine}.{targetPort}",
|
* If a machine 'connection' parameter exists of the form "{sourcePort}->{targetMachine}.{targetPort}",
|
||||||
* and "{sourcePort}" matches our idComponent, then look for a component with id "{targetMachine}.{targetPort}".
|
* and "{sourcePort}" matches our idComponent, then look for a component with id "{targetMachine}.{targetPort}".
|
||||||
|
|
@ -479,6 +474,7 @@ SerialPort.prototype.initBus = function(cmp, bus, cpu, dbg)
|
||||||
* If the target component is found, then verify that it has exported functions with the following names:
|
* If the target component is found, then verify that it has exported functions with the following names:
|
||||||
*
|
*
|
||||||
* receiveData(data): called when we have data to transmit; aliased internally to sendData(data)
|
* receiveData(data): called when we have data to transmit; aliased internally to sendData(data)
|
||||||
|
* receiveStatus(pins): called when our control signals have changed; aliased internally to updateStatus(pins)
|
||||||
*
|
*
|
||||||
* For now, we're not going to worry about communication in the other direction, because when the target component
|
* For now, we're not going to worry about communication in the other direction, because when the target component
|
||||||
* performs its own initConnection(), it will find our receiveData() function, at which point communication in both
|
* performs its own initConnection(), it will find our receiveData() function, at which point communication in both
|
||||||
|
|
@ -489,8 +485,9 @@ SerialPort.prototype.initBus = function(cmp, bus, cpu, dbg)
|
||||||
* if we've already initialized, no harm done.
|
* if we've already initialized, no harm done.
|
||||||
*
|
*
|
||||||
* @this {SerialPort}
|
* @this {SerialPort}
|
||||||
|
* @param {boolean} [fNullModem] (caller's null-modem setting, to ensure our settings are in agreement)
|
||||||
*/
|
*/
|
||||||
SerialPort.prototype.initConnection = function()
|
SerialPort.prototype.initConnection = function(fNullModem)
|
||||||
{
|
{
|
||||||
if (!this.connection) {
|
if (!this.connection) {
|
||||||
var sConnection = this.cmp.getMachineParm("connection");
|
var sConnection = this.cmp.getMachineParm("connection");
|
||||||
|
|
@ -505,9 +502,11 @@ SerialPort.prototype.initConnection = function()
|
||||||
var exports = this.connection['exports'];
|
var exports = this.connection['exports'];
|
||||||
if (exports) {
|
if (exports) {
|
||||||
var fnConnect = exports['connect'];
|
var fnConnect = exports['connect'];
|
||||||
if (fnConnect) fnConnect.call(this.connection);
|
if (fnConnect) fnConnect.call(this.connection, this.fNullModem);
|
||||||
this.sendData = exports['receiveData'];
|
this.sendData = exports['receiveData'];
|
||||||
if (this.sendData) {
|
if (this.sendData) {
|
||||||
|
this.fNullModem = fNullModem;
|
||||||
|
this.updateStatus = exports['receiveStatus'];
|
||||||
this.status(this.idMachine + '.' + sSourceID + " connected to " + sTargetID);
|
this.status(this.idMachine + '.' + sSourceID + " connected to " + sTargetID);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -540,7 +539,7 @@ SerialPort.prototype.powerUp = function(data, fRepower)
|
||||||
* may be not fully resolved until the target machine performs its own initConnection(), which will
|
* may be not fully resolved until the target machine performs its own initConnection(), which will
|
||||||
* in turn invoke our initConnection() again.
|
* in turn invoke our initConnection() again.
|
||||||
*/
|
*/
|
||||||
this.initConnection();
|
this.initConnection(this.fNullModem);
|
||||||
|
|
||||||
if (!data || !this.restore) {
|
if (!data || !this.restore) {
|
||||||
this.reset();
|
this.reset();
|
||||||
|
|
@ -628,7 +627,7 @@ SerialPort.prototype.initState = function(data)
|
||||||
0, // LCR
|
0, // LCR
|
||||||
0, // MCR
|
0, // MCR
|
||||||
SerialPort.LSR.THRE | SerialPort.LSR.TSRE, // LSR
|
SerialPort.LSR.THRE | SerialPort.LSR.TSRE, // LSR
|
||||||
SerialPort.MSR.CTS | SerialPort.MSR.DSR, // MSR (instead of the normal 0 default, we indicate a state of readiness -- to be revisited)
|
this.bMSRInit, // MSR
|
||||||
[]
|
[]
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
@ -696,6 +695,29 @@ SerialPort.prototype.receiveData = function(data)
|
||||||
return true; // for now, return true regardless, since we're buffering everything anyway
|
return true; // for now, return true regardless, since we're buffering everything anyway
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* receiveStatus(pins)
|
||||||
|
*
|
||||||
|
* NOTE: Prior to the addition of this interface, the CTS and DSR bits were initialized set and remained set for the life
|
||||||
|
* of the machine. It is entirely appropriate that this is the only way those bits can be changed, because they represent
|
||||||
|
* external control signals.
|
||||||
|
*
|
||||||
|
* @this {SerialPort}
|
||||||
|
* @param {number} pins
|
||||||
|
*/
|
||||||
|
SerialPort.prototype.receiveStatus = function(pins)
|
||||||
|
{
|
||||||
|
var bMSROld = this.bMSR;
|
||||||
|
this.bMSR &= ~(SerialPort.MSR.CTS | SerialPort.MSR.DSR);
|
||||||
|
if (pins & RS232.CTS.MASK) {
|
||||||
|
this.bMSR |= SerialPort.MSR.CTS | SerialPort.MSR.DCTS;
|
||||||
|
}
|
||||||
|
if (pins & RS232.DSR.MASK) {
|
||||||
|
this.bMSR |= SerialPort.MSR.DSR | SerialPort.MSR.DDSR;
|
||||||
|
}
|
||||||
|
if (bMSROld != this.bMSR) this.updateIRR();
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* advanceRBR()
|
* advanceRBR()
|
||||||
*
|
*
|
||||||
|
|
@ -714,7 +736,7 @@ SerialPort.prototype.advanceRBR = function()
|
||||||
* inRBR(port, addrFrom)
|
* inRBR(port, addrFrom)
|
||||||
*
|
*
|
||||||
* @this {SerialPort}
|
* @this {SerialPort}
|
||||||
* @param {number} port (0x3F8 or 0x2F8)
|
* @param {number} port (eg, 0x3F8 or 0x2F8)
|
||||||
* @param {number} [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
|
* @return {number} simulated port value
|
||||||
*/
|
*/
|
||||||
|
|
@ -731,7 +753,7 @@ SerialPort.prototype.inRBR = function(port, addrFrom)
|
||||||
* inIER(port, addrFrom)
|
* inIER(port, addrFrom)
|
||||||
*
|
*
|
||||||
* @this {SerialPort}
|
* @this {SerialPort}
|
||||||
* @param {number} port (0x3F9 or 0x2F9)
|
* @param {number} port (eg, 0x3F9 or 0x2F9)
|
||||||
* @param {number} [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
|
* @return {number} simulated port value
|
||||||
*/
|
*/
|
||||||
|
|
@ -746,7 +768,7 @@ SerialPort.prototype.inIER = function(port, addrFrom)
|
||||||
* inIIR(port, addrFrom)
|
* inIIR(port, addrFrom)
|
||||||
*
|
*
|
||||||
* @this {SerialPort}
|
* @this {SerialPort}
|
||||||
* @param {number} port (0x3FA or 0x2FA)
|
* @param {number} port (eg, 0x3FA or 0x2FA)
|
||||||
* @param {number} [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
|
* @return {number} simulated port value
|
||||||
*/
|
*/
|
||||||
|
|
@ -761,7 +783,7 @@ SerialPort.prototype.inIIR = function(port, addrFrom)
|
||||||
* inLCR(port, addrFrom)
|
* inLCR(port, addrFrom)
|
||||||
*
|
*
|
||||||
* @this {SerialPort}
|
* @this {SerialPort}
|
||||||
* @param {number} port (0x3FB or 0x2FB)
|
* @param {number} port (eg, 0x3FB or 0x2FB)
|
||||||
* @param {number} [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
|
* @return {number} simulated port value
|
||||||
*/
|
*/
|
||||||
|
|
@ -776,7 +798,7 @@ SerialPort.prototype.inLCR = function(port, addrFrom)
|
||||||
* inMCR(port, addrFrom)
|
* inMCR(port, addrFrom)
|
||||||
*
|
*
|
||||||
* @this {SerialPort}
|
* @this {SerialPort}
|
||||||
* @param {number} port (0x3FC or 0x2FC)
|
* @param {number} port (eg, 0x3FC or 0x2FC)
|
||||||
* @param {number} [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
|
* @return {number} simulated port value
|
||||||
*/
|
*/
|
||||||
|
|
@ -791,7 +813,7 @@ SerialPort.prototype.inMCR = function(port, addrFrom)
|
||||||
* inLSR(port, addrFrom)
|
* inLSR(port, addrFrom)
|
||||||
*
|
*
|
||||||
* @this {SerialPort}
|
* @this {SerialPort}
|
||||||
* @param {number} port (0x3FD or 0x2FD)
|
* @param {number} port (eg, 0x3FD or 0x2FD)
|
||||||
* @param {number} [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
|
* @return {number} simulated port value
|
||||||
*/
|
*/
|
||||||
|
|
@ -806,13 +828,14 @@ SerialPort.prototype.inLSR = function(port, addrFrom)
|
||||||
* inMSR(port, addrFrom)
|
* inMSR(port, addrFrom)
|
||||||
*
|
*
|
||||||
* @this {SerialPort}
|
* @this {SerialPort}
|
||||||
* @param {number} port (0x3FE or 0x2FE)
|
* @param {number} port (eg, 0x3FE or 0x2FE)
|
||||||
* @param {number} [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
|
* @return {number} simulated port value
|
||||||
*/
|
*/
|
||||||
SerialPort.prototype.inMSR = function(port, addrFrom)
|
SerialPort.prototype.inMSR = function(port, addrFrom)
|
||||||
{
|
{
|
||||||
var b = this.bMSR;
|
var b = this.bMSR;
|
||||||
|
this.bMSR &= ~(SerialPort.MSR.DCTS | SerialPort.MSR.DDSR);
|
||||||
this.printMessageIO(port, null, addrFrom, "MSR", b);
|
this.printMessageIO(port, null, addrFrom, "MSR", b);
|
||||||
return b;
|
return b;
|
||||||
};
|
};
|
||||||
|
|
@ -821,7 +844,7 @@ SerialPort.prototype.inMSR = function(port, addrFrom)
|
||||||
* outTHR(port, bOut, addrFrom)
|
* outTHR(port, bOut, addrFrom)
|
||||||
*
|
*
|
||||||
* @this {SerialPort}
|
* @this {SerialPort}
|
||||||
* @param {number} port (0x3F8 or 0x2F8)
|
* @param {number} port (eg, 0x3F8 or 0x2F8)
|
||||||
* @param {number} bOut
|
* @param {number} bOut
|
||||||
* @param {number} [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)
|
||||||
*/
|
*/
|
||||||
|
|
@ -846,7 +869,7 @@ SerialPort.prototype.outTHR = function(port, bOut, addrFrom)
|
||||||
* outIER(port, bOut, addrFrom)
|
* outIER(port, bOut, addrFrom)
|
||||||
*
|
*
|
||||||
* @this {SerialPort}
|
* @this {SerialPort}
|
||||||
* @param {number} port (0x3F9 or 0x2F9)
|
* @param {number} port (eg, 0x3F9 or 0x2F9)
|
||||||
* @param {number} bOut
|
* @param {number} bOut
|
||||||
* @param {number} [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)
|
||||||
*/
|
*/
|
||||||
|
|
@ -864,7 +887,7 @@ SerialPort.prototype.outIER = function(port, bOut, addrFrom)
|
||||||
* outLCR(port, bOut, addrFrom)
|
* outLCR(port, bOut, addrFrom)
|
||||||
*
|
*
|
||||||
* @this {SerialPort}
|
* @this {SerialPort}
|
||||||
* @param {number} port (0x3FB or 0x2FB)
|
* @param {number} port (eg, 0x3FB or 0x2FB)
|
||||||
* @param {number} bOut
|
* @param {number} bOut
|
||||||
* @param {number} [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)
|
||||||
*/
|
*/
|
||||||
|
|
@ -878,17 +901,30 @@ SerialPort.prototype.outLCR = function(port, bOut, addrFrom)
|
||||||
* outMCR(port, bOut, addrFrom)
|
* outMCR(port, bOut, addrFrom)
|
||||||
*
|
*
|
||||||
* @this {SerialPort}
|
* @this {SerialPort}
|
||||||
* @param {number} port (0x3FC or 0x2FC)
|
* @param {number} port (eg, 0x3FC or 0x2FC)
|
||||||
* @param {number} bOut
|
* @param {number} bOut
|
||||||
* @param {number} [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)
|
SerialPort.prototype.outMCR = function(port, bOut, addrFrom)
|
||||||
{
|
{
|
||||||
var bPrev = this.bMCR;
|
var delta = (bOut ^ this.bMCR);
|
||||||
this.printMessageIO(port, bOut, addrFrom, "MCR");
|
this.printMessageIO(port, bOut, addrFrom, "MCR");
|
||||||
this.bMCR = bOut;
|
this.bMCR = bOut;
|
||||||
if (this.mouse && (bPrev ^ bOut) & (SerialPort.MCR.DTR | SerialPort.MCR.RTS)) {
|
/*
|
||||||
this.mouse.notifyMCR(this.bMCR);
|
* Whenever DTR or RTS changes, we also need to notify any connected machine or mouse, via updateStatus().
|
||||||
|
*/
|
||||||
|
if (delta & (SerialPort.MCR.DTR | SerialPort.MCR.RTS)) {
|
||||||
|
if (this.updateStatus) {
|
||||||
|
var pins = 0;
|
||||||
|
if (this.fNullModem) {
|
||||||
|
pins |= (bOut & SerialPort.MCR.RTS)? RS232.CTS.MASK : 0;
|
||||||
|
pins |= (bOut & SerialPort.MCR.DTR)? (RS232.DSR.MASK | RS232.CD.MASK): 0;
|
||||||
|
} else {
|
||||||
|
pins |= (bOut & SerialPort.MCR.RTS)? RS232.RTS.MASK : 0;
|
||||||
|
pins |= (bOut & SerialPort.MCR.DTR)? RS232.DTR.MASK : 0;
|
||||||
|
}
|
||||||
|
this.updateStatus.call(this.connection, pins);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -903,6 +939,9 @@ SerialPort.prototype.updateIRR = function()
|
||||||
if ((this.bLSR & SerialPort.LSR.DR) && (this.bIER & SerialPort.IER.RBR_AVAIL)) {
|
if ((this.bLSR & SerialPort.LSR.DR) && (this.bIER & SerialPort.IER.RBR_AVAIL)) {
|
||||||
bIIR = SerialPort.IIR.INT_RBR;
|
bIIR = SerialPort.IIR.INT_RBR;
|
||||||
}
|
}
|
||||||
|
else if ((this.bMSR & (SerialPort.MSR.DCTS | SerialPort.MSR.DDSR)) && (this.bIER & SerialPort.IER.MSR_DELTA)) {
|
||||||
|
bIIR = SerialPort.IIR.INT_MSR;
|
||||||
|
}
|
||||||
if (bIIR >= 0) {
|
if (bIIR >= 0) {
|
||||||
this.bIIR &= ~(SerialPort.IIR.NO_INT | SerialPort.IIR.INT_BITS);
|
this.bIIR &= ~(SerialPort.IIR.NO_INT | SerialPort.IIR.INT_BITS);
|
||||||
this.bIIR |= bIIR;
|
this.bIIR |= bIIR;
|
||||||
|
|
|
||||||
|
|
@ -913,6 +913,55 @@ BusPDP11.prototype.getByte = function(addr)
|
||||||
return this.aMemBlocks[(addr & this.nMemMask) >>> this.nBlockShift].readByte(addr & this.nBlockLimit, addr);
|
return this.aMemBlocks[(addr & this.nMemMask) >>> this.nBlockShift].readByte(addr & this.nBlockLimit, addr);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* getWord(addr)
|
||||||
|
*
|
||||||
|
* @this {BusPDP11}
|
||||||
|
* @param {number} addr is a physical address
|
||||||
|
* @return {number} word (16-bit) value at that address
|
||||||
|
*/
|
||||||
|
BusPDP11.prototype.getWord = function(addr)
|
||||||
|
{
|
||||||
|
var off = addr & this.nBlockLimit;
|
||||||
|
var iBlock = (addr & this.nMemMask) >>> this.nBlockShift;
|
||||||
|
if (!PDP11.WORDBUS && off == this.nBlockLimit) {
|
||||||
|
return this.aMemBlocks[iBlock++].readByte(off, addr) | (this.aMemBlocks[iBlock & this.nBlockMask].readByte(0, addr + 1) << 8);
|
||||||
|
}
|
||||||
|
return this.aMemBlocks[iBlock].readWord(off, addr);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* setByte(addr, b)
|
||||||
|
*
|
||||||
|
* @this {BusPDP11}
|
||||||
|
* @param {number} addr is a physical address
|
||||||
|
* @param {number} b is the byte (8-bit) value to write
|
||||||
|
*/
|
||||||
|
BusPDP11.prototype.setByte = function(addr, b)
|
||||||
|
{
|
||||||
|
this.assert(!(b & ~0xff));
|
||||||
|
this.aMemBlocks[(addr & this.nMemMask) >>> this.nBlockShift].writeByte(addr & this.nBlockLimit, b, addr);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* setWord(addr, w)
|
||||||
|
*
|
||||||
|
* @this {BusPDP11}
|
||||||
|
* @param {number} addr is a physical address
|
||||||
|
* @param {number} w is the word (16-bit) value to write
|
||||||
|
*/
|
||||||
|
BusPDP11.prototype.setWord = function(addr, w)
|
||||||
|
{
|
||||||
|
var off = addr & this.nBlockLimit;
|
||||||
|
var iBlock = (addr & this.nMemMask) >>> this.nBlockShift;
|
||||||
|
if (!PDP11.WORDBUS && off == this.nBlockLimit) {
|
||||||
|
this.aMemBlocks[iBlock++].writeByte(off, w & 0xff, addr);
|
||||||
|
this.aMemBlocks[iBlock & this.nBlockMask].writeByte(0, (w >> 8) & 0xff, addr + 1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.aMemBlocks[iBlock].writeWord(off, w, addr);
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* getBlockDirect(addr)
|
* getBlockDirect(addr)
|
||||||
*
|
*
|
||||||
|
|
@ -943,23 +992,6 @@ BusPDP11.prototype.getByteDirect = function(addr)
|
||||||
return b;
|
return b;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
|
||||||
* getWord(addr)
|
|
||||||
*
|
|
||||||
* @this {BusPDP11}
|
|
||||||
* @param {number} addr is a physical address
|
|
||||||
* @return {number} word (16-bit) value at that address
|
|
||||||
*/
|
|
||||||
BusPDP11.prototype.getWord = function(addr)
|
|
||||||
{
|
|
||||||
var off = addr & this.nBlockLimit;
|
|
||||||
var iBlock = (addr & this.nMemMask) >>> this.nBlockShift;
|
|
||||||
if (!PDP11.WORDBUS && off == this.nBlockLimit) {
|
|
||||||
return this.aMemBlocks[iBlock++].readByte(off, addr) | (this.aMemBlocks[iBlock & this.nBlockMask].readByte(0, addr + 1) << 8);
|
|
||||||
}
|
|
||||||
return this.aMemBlocks[iBlock].readWord(off, addr);
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* getWordDirect(addr)
|
* getWordDirect(addr)
|
||||||
*
|
*
|
||||||
|
|
@ -985,18 +1017,6 @@ BusPDP11.prototype.getWordDirect = function(addr)
|
||||||
return w;
|
return w;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
|
||||||
* setByte(addr, b)
|
|
||||||
*
|
|
||||||
* @this {BusPDP11}
|
|
||||||
* @param {number} addr is a physical address
|
|
||||||
* @param {number} b is the byte (8-bit) value to write (we truncate it to 8 bits to be safe)
|
|
||||||
*/
|
|
||||||
BusPDP11.prototype.setByte = function(addr, b)
|
|
||||||
{
|
|
||||||
this.aMemBlocks[(addr & this.nMemMask) >>> this.nBlockShift].writeByte(addr & this.nBlockLimit, b & 0xff, addr);
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* setByteDirect(addr, b)
|
* setByteDirect(addr, b)
|
||||||
*
|
*
|
||||||
|
|
@ -1014,25 +1034,6 @@ BusPDP11.prototype.setByteDirect = function(addr, b)
|
||||||
this.nDisableFaults--;
|
this.nDisableFaults--;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
|
||||||
* setWord(addr, w)
|
|
||||||
*
|
|
||||||
* @this {BusPDP11}
|
|
||||||
* @param {number} addr is a physical address
|
|
||||||
* @param {number} w is the word (16-bit) value to write (we truncate it to 16 bits to be safe)
|
|
||||||
*/
|
|
||||||
BusPDP11.prototype.setWord = function(addr, w)
|
|
||||||
{
|
|
||||||
var off = addr & this.nBlockLimit;
|
|
||||||
var iBlock = (addr & this.nMemMask) >>> this.nBlockShift;
|
|
||||||
if (!PDP11.WORDBUS && off == this.nBlockLimit) {
|
|
||||||
this.aMemBlocks[iBlock++].writeByte(off, w & 0xff, addr);
|
|
||||||
this.aMemBlocks[iBlock & this.nBlockMask].writeByte(0, (w >> 8) & 0xff, addr + 1);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
this.aMemBlocks[iBlock].writeWord(off, w & 0xffff, addr);
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* setWordDirect(addr, w)
|
* setWordDirect(addr, w)
|
||||||
*
|
*
|
||||||
|
|
@ -1236,20 +1237,21 @@ BusPDP11.prototype.addIOHandlers = function(start, end, fnReadByte, fnWriteByte,
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* addIOTable(component, table)
|
* addIOTable(component, table, offReg)
|
||||||
*
|
*
|
||||||
* Add I/O notification handlers from the specified table (a batch version of addIOHandlers).
|
* Add I/O notification handlers from the specified table (a batch version of addIOHandlers).
|
||||||
*
|
*
|
||||||
* @this {BusPDP11}
|
* @this {BusPDP11}
|
||||||
* @param {Component} component
|
* @param {Component} component
|
||||||
* @param {Object} table
|
* @param {Object} table
|
||||||
|
* @param {number} [offReg] (optional offset to add to all register addresses)
|
||||||
* @return {boolean} (true if entire range successfully registered, false if any conflicts)
|
* @return {boolean} (true if entire range successfully registered, false if any conflicts)
|
||||||
*/
|
*/
|
||||||
BusPDP11.prototype.addIOTable = function(component, table)
|
BusPDP11.prototype.addIOTable = function(component, table, offReg)
|
||||||
{
|
{
|
||||||
for (var port in table) {
|
for (var reg in table) {
|
||||||
var addr = +port;
|
var addr = +reg + (offReg || 0);
|
||||||
var afn = table[port];
|
var afn = table[reg];
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Don't install (ie, ignore) handlers for I/O addresses that are defined with a model number
|
* Don't install (ie, ignore) handlers for I/O addresses that are defined with a model number
|
||||||
|
|
|
||||||
|
|
@ -206,6 +206,17 @@ CPUPDP11.prototype.initBus = function(cmp, bus, cpu, dbg)
|
||||||
this.setReady();
|
this.setReady();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* finish()
|
||||||
|
*
|
||||||
|
* Stub for final initialization call (overridden by the CPUStatePDP11 component).
|
||||||
|
*
|
||||||
|
* @this {CPUPDP11}
|
||||||
|
*/
|
||||||
|
CPUPDP11.prototype.finish = function()
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* reset()
|
* reset()
|
||||||
*
|
*
|
||||||
|
|
@ -255,6 +266,7 @@ CPUPDP11.prototype.restore = function(data)
|
||||||
CPUPDP11.prototype.powerUp = function(data, fRepower)
|
CPUPDP11.prototype.powerUp = function(data, fRepower)
|
||||||
{
|
{
|
||||||
if (!fRepower) {
|
if (!fRepower) {
|
||||||
|
this.finish();
|
||||||
if (!data || !this.restore) {
|
if (!data || !this.restore) {
|
||||||
this.reset();
|
this.reset();
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
|
|
@ -875,7 +875,7 @@ PDP11.opBVS = function(opCode)
|
||||||
*/
|
*/
|
||||||
PDP11.opCLR = function(opCode)
|
PDP11.opCLR = function(opCode)
|
||||||
{
|
{
|
||||||
this.updateAllFlags(this.writeDstWord(opCode, 0));
|
this.writeDstWord(opCode, 0, this.updateAllFlags);
|
||||||
this.nStepCycles -= (this.dstMode? (8 + 1) : (2 + 1) + (this.dstReg == 7? 2 : 0));
|
this.nStepCycles -= (this.dstMode? (8 + 1) : (2 + 1) + (this.dstReg == 7? 2 : 0));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -887,7 +887,7 @@ PDP11.opCLR = function(opCode)
|
||||||
*/
|
*/
|
||||||
PDP11.opCLRB = function(opCode)
|
PDP11.opCLRB = function(opCode)
|
||||||
{
|
{
|
||||||
this.updateAllFlags(this.writeDstByte(opCode, 0, PDP11.WRITE.BYTE));
|
this.writeDstByte(opCode, 0, PDP11.WRITE.BYTE, this.updateAllFlags);
|
||||||
this.nStepCycles -= (this.dstMode? (8 + 1) : (2 + 1) + (this.dstReg == 7? 2 : 0));
|
this.nStepCycles -= (this.dstMode? (8 + 1) : (2 + 1) + (this.dstReg == 7? 2 : 0));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -1283,8 +1283,8 @@ PDP11.opMARK = function(opCode)
|
||||||
PDP11.opMFPD = function(opCode)
|
PDP11.opMFPD = function(opCode)
|
||||||
{
|
{
|
||||||
var data = this.readWordFromPrevSpace(opCode, PDP11.ACCESS.DSPACE);
|
var data = this.readWordFromPrevSpace(opCode, PDP11.ACCESS.DSPACE);
|
||||||
this.pushWord(data);
|
|
||||||
this.updateNZVFlags(data);
|
this.updateNZVFlags(data);
|
||||||
|
this.pushWord(data);
|
||||||
this.nStepCycles -= (10 + 1);
|
this.nStepCycles -= (10 + 1);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -1297,8 +1297,8 @@ PDP11.opMFPD = function(opCode)
|
||||||
PDP11.opMFPI = function(opCode)
|
PDP11.opMFPI = function(opCode)
|
||||||
{
|
{
|
||||||
var data = this.readWordFromPrevSpace(opCode, PDP11.ACCESS.ISPACE);
|
var data = this.readWordFromPrevSpace(opCode, PDP11.ACCESS.ISPACE);
|
||||||
this.pushWord(data);
|
|
||||||
this.updateNZVFlags(data);
|
this.updateNZVFlags(data);
|
||||||
|
this.pushWord(data);
|
||||||
this.nStepCycles -= (10 + 1);
|
this.nStepCycles -= (10 + 1);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -1346,7 +1346,7 @@ PDP11.opMOV = function(opCode)
|
||||||
*/
|
*/
|
||||||
var data = this.readSrcWord(opCode);
|
var data = this.readSrcWord(opCode);
|
||||||
this.nSnapCycles = this.nStepCycles;
|
this.nSnapCycles = this.nStepCycles;
|
||||||
this.updateNZVFlags(this.writeDstWord(opCode, data));
|
this.writeDstWord(opCode, data, this.updateNZVFlags);
|
||||||
this.nStepCycles = this.nSnapCycles - PDP11.MOV_CYCLES[(this.srcMode? 8 : 0) + this.dstMode] + (this.dstReg == 7 && !this.dstMode? 2 : 0);
|
this.nStepCycles = this.nSnapCycles - PDP11.MOV_CYCLES[(this.srcMode? 8 : 0) + this.dstMode] + (this.dstReg == 7 && !this.dstMode? 2 : 0);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -1359,7 +1359,7 @@ PDP11.opMOV = function(opCode)
|
||||||
PDP11.opMOVB = function(opCode)
|
PDP11.opMOVB = function(opCode)
|
||||||
{
|
{
|
||||||
var data = this.readSrcByte(opCode);
|
var data = this.readSrcByte(opCode);
|
||||||
this.updateNZVFlags(this.writeDstByte(opCode, data, PDP11.WRITE.SBYTE) << 8);
|
this.writeDstByte(opCode, data, PDP11.WRITE.SBYTE, this.updateNZVFlags);
|
||||||
this.nStepCycles -= (this.dstMode? (8 + 1) + (this.srcReg && this.dstReg >= 6? 1 : 0) : (this.srcMode? (3 + 2) : (2 + 1)) + (this.dstReg == 7? 2 : 0));
|
this.nStepCycles -= (this.dstMode? (8 + 1) + (this.srcReg && this.dstReg >= 6? 1 : 0) : (this.srcMode? (3 + 2) : (2 + 1)) + (this.dstReg == 7? 2 : 0));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -1381,8 +1381,8 @@ PDP11.opMTPD = function(opCode)
|
||||||
*/
|
*/
|
||||||
var data = this.popWord();
|
var data = this.popWord();
|
||||||
this.nSnapCycles = this.nStepCycles;
|
this.nSnapCycles = this.nStepCycles;
|
||||||
this.writeWordToPrevSpace(opCode, PDP11.ACCESS.DSPACE, data);
|
|
||||||
this.updateNZVFlags(data);
|
this.updateNZVFlags(data);
|
||||||
|
this.writeWordToPrevSpace(opCode, PDP11.ACCESS.DSPACE, data);
|
||||||
this.nStepCycles = this.nSnapCycles - PDP11.MTP_CYCLES[this.dstMode];
|
this.nStepCycles = this.nSnapCycles - PDP11.MTP_CYCLES[this.dstMode];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -1400,8 +1400,8 @@ PDP11.opMTPI = function(opCode)
|
||||||
*/
|
*/
|
||||||
var data = this.popWord();
|
var data = this.popWord();
|
||||||
this.nSnapCycles = this.nStepCycles;
|
this.nSnapCycles = this.nStepCycles;
|
||||||
this.writeWordToPrevSpace(opCode, PDP11.ACCESS.ISPACE, data);
|
|
||||||
this.updateNZVFlags(data);
|
this.updateNZVFlags(data);
|
||||||
|
this.writeWordToPrevSpace(opCode, PDP11.ACCESS.ISPACE, data);
|
||||||
this.nStepCycles = this.nSnapCycles - PDP11.MTP_CYCLES[this.dstMode];
|
this.nStepCycles = this.nSnapCycles - PDP11.MTP_CYCLES[this.dstMode];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -1775,7 +1775,7 @@ PDP11.opSWAB = function(opCode)
|
||||||
*/
|
*/
|
||||||
PDP11.opSXT = function(opCode)
|
PDP11.opSXT = function(opCode)
|
||||||
{
|
{
|
||||||
this.updateNZVFlags(this.writeDstWord(opCode, this.getNF()? 0xffff : 0));
|
this.writeDstWord(opCode, this.getNF()? 0xffff : 0, this.updateNZVFlags);
|
||||||
this.nStepCycles -= (this.dstMode? (8 + 1) : (2 + 1) + (this.dstReg == 7? 2 : 0));
|
this.nStepCycles -= (this.dstMode? (8 + 1) : (2 + 1) + (this.dstReg == 7? 2 : 0));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -151,14 +151,33 @@ CPUStatePDP11.prototype.initProcessor = function()
|
||||||
/** @type {IRQ|null} */
|
/** @type {IRQ|null} */
|
||||||
this.irqNext = null; // the head of the active IRQ list, in priority order
|
this.irqNext = null; // the head of the active IRQ list, in priority order
|
||||||
|
|
||||||
if (DEBUG) {
|
|
||||||
/** @type {Array.<IRQ>} */
|
/** @type {Array.<IRQ>} */
|
||||||
this.aIRQs = []; // list of all IRQs, active or not (just for debugging)
|
this.aIRQs = []; // list of all IRQs, active or not (to be used for auto-configuration)
|
||||||
}
|
|
||||||
|
|
||||||
this.flags.complete = false;
|
this.flags.complete = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* finish()
|
||||||
|
*
|
||||||
|
* TODO: This function simply ensures that we don't leave any IRQs installed with unresolved floating
|
||||||
|
* (negative) vectors; properly assigning vectors according to device type (ie, auto-configuration) is an
|
||||||
|
* exercise left for another day.
|
||||||
|
*
|
||||||
|
* @this {CPUStatePDP11}
|
||||||
|
*/
|
||||||
|
CPUStatePDP11.prototype.finish = function()
|
||||||
|
{
|
||||||
|
var vectorFloating = 0o300;
|
||||||
|
for (var i = 0; i < this.aIRQs.length; i++) {
|
||||||
|
var irq = this.aIRQs[i];
|
||||||
|
if (irq.vector < 0) {
|
||||||
|
irq.vector = vectorFloating;
|
||||||
|
vectorFloating += 4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* reset()
|
* reset()
|
||||||
*
|
*
|
||||||
|
|
@ -264,7 +283,7 @@ CPUStatePDP11.prototype.resetMMU = function()
|
||||||
this.regMMR1 = 0; // 177574
|
this.regMMR1 = 0; // 177574
|
||||||
this.regMMR2 = 0; // 177576
|
this.regMMR2 = 0; // 177576
|
||||||
this.regMMR3 = 0; // 172516
|
this.regMMR3 = 0; // 172516
|
||||||
this.regErr = 0; // 177766 TODO: Do we ever need to clear this, because it appears to accumulate errors...
|
this.regErr = 0; // 177766 TODO: Do we ever need to automatically clear this, or is it manually cleared?
|
||||||
this.regPIR = 0; // 177772
|
this.regPIR = 0; // 177772
|
||||||
this.regSL = 0xff; // 177774
|
this.regSL = 0xff; // 177774
|
||||||
this.mmuEnable = 0; // MMU enabled for PDP11.ACCESS.READ or PDP11.ACCESS.WRITE
|
this.mmuEnable = 0; // MMU enabled for PDP11.ACCESS.READ or PDP11.ACCESS.WRITE
|
||||||
|
|
@ -774,7 +793,7 @@ CPUStatePDP11.prototype.setSP = function(addr)
|
||||||
* addIRQ(vector, priority, message)
|
* addIRQ(vector, priority, message)
|
||||||
*
|
*
|
||||||
* @this {CPUStatePDP11}
|
* @this {CPUStatePDP11}
|
||||||
* @param {number} vector
|
* @param {number} vector (-1 for floating vector)
|
||||||
* @param {number} priority
|
* @param {number} priority
|
||||||
* @param {number} [message]
|
* @param {number} [message]
|
||||||
* @return {IRQ}
|
* @return {IRQ}
|
||||||
|
|
@ -782,10 +801,8 @@ CPUStatePDP11.prototype.setSP = function(addr)
|
||||||
CPUStatePDP11.prototype.addIRQ = function(vector, priority, message)
|
CPUStatePDP11.prototype.addIRQ = function(vector, priority, message)
|
||||||
{
|
{
|
||||||
var irq = {vector: vector, priority: priority, message: message || 0, next: null};
|
var irq = {vector: vector, priority: priority, message: message || 0, next: null};
|
||||||
if (DEBUG) {
|
|
||||||
irq.name = PDP11.VECTORS[vector];
|
irq.name = PDP11.VECTORS[vector];
|
||||||
this.aIRQs.push(irq);
|
this.aIRQs.push(irq);
|
||||||
}
|
|
||||||
return irq;
|
return irq;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -1171,10 +1188,8 @@ CPUStatePDP11.prototype.setPIR = function(newPIR)
|
||||||
*/
|
*/
|
||||||
CPUStatePDP11.prototype.updateNZVFlags = function(result)
|
CPUStatePDP11.prototype.updateNZVFlags = function(result)
|
||||||
{
|
{
|
||||||
if (!(this.opFlags & PDP11.OPFLAG.NO_FLAGS)) {
|
|
||||||
this.flagN = this.flagZ = result;
|
this.flagN = this.flagZ = result;
|
||||||
this.flagV = 0;
|
this.flagV = 0;
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -1187,10 +1202,8 @@ CPUStatePDP11.prototype.updateNZVFlags = function(result)
|
||||||
*/
|
*/
|
||||||
CPUStatePDP11.prototype.updateNZVCFlags = function(result)
|
CPUStatePDP11.prototype.updateNZVCFlags = function(result)
|
||||||
{
|
{
|
||||||
if (!(this.opFlags & PDP11.OPFLAG.NO_FLAGS)) {
|
|
||||||
this.flagN = this.flagZ = result;
|
this.flagN = this.flagZ = result;
|
||||||
this.flagV = this.flagC = 0;
|
this.flagV = this.flagC = 0;
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -1204,10 +1217,8 @@ CPUStatePDP11.prototype.updateNZVCFlags = function(result)
|
||||||
*/
|
*/
|
||||||
CPUStatePDP11.prototype.updateAllFlags = function(result, overflow)
|
CPUStatePDP11.prototype.updateAllFlags = function(result, overflow)
|
||||||
{
|
{
|
||||||
if (!(this.opFlags & PDP11.OPFLAG.NO_FLAGS)) {
|
|
||||||
this.flagN = this.flagZ = this.flagC = result;
|
this.flagN = this.flagZ = this.flagC = result;
|
||||||
this.flagV = overflow || 0;
|
this.flagV = overflow || 0;
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -1220,10 +1231,8 @@ CPUStatePDP11.prototype.updateAllFlags = function(result, overflow)
|
||||||
*/
|
*/
|
||||||
CPUStatePDP11.prototype.updateAddFlags = function(result, src, dst)
|
CPUStatePDP11.prototype.updateAddFlags = function(result, src, dst)
|
||||||
{
|
{
|
||||||
if (!(this.opFlags & PDP11.OPFLAG.NO_FLAGS)) {
|
|
||||||
this.flagN = this.flagZ = this.flagC = result;
|
this.flagN = this.flagZ = this.flagC = result;
|
||||||
this.flagV = (src ^ result) & (dst ^ result);
|
this.flagV = (src ^ result) & (dst ^ result);
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -1237,11 +1246,11 @@ CPUStatePDP11.prototype.updateAddFlags = function(result, src, dst)
|
||||||
*/
|
*/
|
||||||
CPUStatePDP11.prototype.updateDecFlags = function(result, dst)
|
CPUStatePDP11.prototype.updateDecFlags = function(result, dst)
|
||||||
{
|
{
|
||||||
if (!(this.opFlags & PDP11.OPFLAG.NO_FLAGS)) {
|
|
||||||
this.flagN = this.flagZ = result;
|
this.flagN = this.flagZ = result;
|
||||||
// Because src is always 1 (with a zero sign bit), it can be optimized out of this calculation
|
/*
|
||||||
|
* Because src is always 1 (with a zero sign bit), it can be optimized out of this calculation.
|
||||||
|
*/
|
||||||
this.flagV = (/* src ^ */ dst) & (dst ^ result);
|
this.flagV = (/* src ^ */ dst) & (dst ^ result);
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -1255,11 +1264,11 @@ CPUStatePDP11.prototype.updateDecFlags = function(result, dst)
|
||||||
*/
|
*/
|
||||||
CPUStatePDP11.prototype.updateIncFlags = function(result, dst)
|
CPUStatePDP11.prototype.updateIncFlags = function(result, dst)
|
||||||
{
|
{
|
||||||
if (!(this.opFlags & PDP11.OPFLAG.NO_FLAGS)) {
|
|
||||||
this.flagN = this.flagZ = result;
|
this.flagN = this.flagZ = result;
|
||||||
// Because src is always 1 (with a zero sign bit), it can be optimized out of this calculation
|
/*
|
||||||
|
* Because src is always 1 (with a zero sign bit), it can be optimized out of this calculation.
|
||||||
|
*/
|
||||||
this.flagV = (/* src ^ */ result) & (dst ^ result);
|
this.flagV = (/* src ^ */ result) & (dst ^ result);
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -1270,23 +1279,10 @@ CPUStatePDP11.prototype.updateIncFlags = function(result, dst)
|
||||||
*/
|
*/
|
||||||
CPUStatePDP11.prototype.updateMulFlags = function(result)
|
CPUStatePDP11.prototype.updateMulFlags = function(result)
|
||||||
{
|
{
|
||||||
/*
|
|
||||||
* NOTE: Technically, the MUL instruction doesn't need to worry about NO_FLAGS, because that instruction
|
|
||||||
* doesn't write to the bus, and therefore can't modify the PSW directly. But it doesn't hurt to be consistent.
|
|
||||||
*
|
|
||||||
* TODO: Conduct a review of all opcode handlers, because one possible alternative to all this NO_FLAGS nonsense
|
|
||||||
* would be to pass the appropriate flag update function to the writeDstByte()/writeDstWord() functions, and
|
|
||||||
* have them update the flags BEFORE the write occurs, thus allowing any subsequent write to the PSW to be honored.
|
|
||||||
*
|
|
||||||
* That already happens automatically with the updateDstByte()/updateDstWord() functions, since generally the
|
|
||||||
* specified modify function also updates the flags BEFORE the write occurs.
|
|
||||||
*/
|
|
||||||
if (!(this.opFlags & PDP11.OPFLAG.NO_FLAGS)) {
|
|
||||||
this.flagN = result >> 16;
|
this.flagN = result >> 16;
|
||||||
this.flagZ = this.flagN | result;
|
this.flagZ = this.flagN | result;
|
||||||
this.flagV = 0;
|
this.flagV = 0;
|
||||||
this.flagC = (result < -32768 || result > 32767)? 0x10000 : 0;
|
this.flagC = (result < -32768 || result > 32767)? 0x10000 : 0;
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -1297,10 +1293,8 @@ CPUStatePDP11.prototype.updateMulFlags = function(result)
|
||||||
*/
|
*/
|
||||||
CPUStatePDP11.prototype.updateShiftFlags = function(result)
|
CPUStatePDP11.prototype.updateShiftFlags = function(result)
|
||||||
{
|
{
|
||||||
if (!(this.opFlags & PDP11.OPFLAG.NO_FLAGS)) {
|
|
||||||
this.flagN = this.flagZ = this.flagC = result;
|
this.flagN = this.flagZ = this.flagC = result;
|
||||||
this.flagV = this.flagN ^ (this.flagC >> 1);
|
this.flagV = this.flagN ^ (this.flagC >> 1);
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -1316,10 +1310,8 @@ CPUStatePDP11.prototype.updateShiftFlags = function(result)
|
||||||
*/
|
*/
|
||||||
CPUStatePDP11.prototype.updateSubFlags = function(result, src, dst)
|
CPUStatePDP11.prototype.updateSubFlags = function(result, src, dst)
|
||||||
{
|
{
|
||||||
if (!(this.opFlags & PDP11.OPFLAG.NO_FLAGS)) {
|
|
||||||
this.flagN = this.flagZ = this.flagC = result;
|
this.flagN = this.flagZ = this.flagC = result;
|
||||||
this.flagV = (src ^ dst) & (dst ^ result);
|
this.flagV = (src ^ dst) & (dst ^ result);
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -1351,18 +1343,20 @@ CPUStatePDP11.prototype.trap = function(vector, flag, reason)
|
||||||
reason = PDP11.REASON.RED; // double-fault (nested trap) forces a RED condition
|
reason = PDP11.REASON.RED; // double-fault (nested trap) forces a RED condition
|
||||||
}
|
}
|
||||||
|
|
||||||
var fRed = false;
|
|
||||||
if (reason == PDP11.REASON.RED) {
|
if (reason == PDP11.REASON.RED) {
|
||||||
vector = 4;
|
if (this.opFlags & PDP11.OPFLAG.TRAP_RED) {
|
||||||
|
reason = PDP11.REASON.PANIC;
|
||||||
|
}
|
||||||
|
this.opFlags |= PDP11.OPFLAG.TRAP_RED;
|
||||||
/*
|
/*
|
||||||
* The next two lines used to be deferred until after the setPSW() below, but
|
* The next two lines used to be deferred until after the setPSW() below, but
|
||||||
* I'm not seeing any dependencies on these registers, so I'm consolidating the code.
|
* I'm not seeing any dependencies on these registers, so I'm consolidating the code.
|
||||||
*/
|
*/
|
||||||
this.regErr |= PDP11.CPUERR.RED;
|
this.regErr |= PDP11.CPUERR.RED;
|
||||||
this.regsGen[6] = 4;
|
this.regsGen[6] = vector = 4;
|
||||||
fRed = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (reason != PDP11.REASON.PANIC) {
|
||||||
/*
|
/*
|
||||||
* NOTE: Pre-setting the auto-dec values for MMR1 to 0xF6F6 is a work-around for an "EKBEE1"
|
* NOTE: Pre-setting the auto-dec values for MMR1 to 0xF6F6 is a work-around for an "EKBEE1"
|
||||||
* diagnostic (PC 056710), which tests what happens when a misaligned read triggers a BUS trap,
|
* diagnostic (PC 056710), which tests what happens when a misaligned read triggers a BUS trap,
|
||||||
|
|
@ -1389,9 +1383,10 @@ CPUStatePDP11.prototype.trap = function(vector, flag, reason)
|
||||||
*/
|
*/
|
||||||
this.setPSW((newPSW & ~PDP11.PSW.PMODE) | ((this.trapPSW >> 2) & PDP11.PSW.PMODE));
|
this.setPSW((newPSW & ~PDP11.PSW.PMODE) | ((this.trapPSW >> 2) & PDP11.PSW.PMODE));
|
||||||
|
|
||||||
this.pushWord(this.trapPSW, fRed);
|
this.pushWord(this.trapPSW);
|
||||||
this.pushWord(this.regsGen[7], fRed);
|
this.pushWord(this.regsGen[7]);
|
||||||
this.setPC(newPC);
|
this.setPC(newPC);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* TODO: Determine the appropriate number of cycles for traps; all I've done for now is move the
|
* TODO: Determine the appropriate number of cycles for traps; all I've done for now is move the
|
||||||
|
|
@ -1442,6 +1437,9 @@ CPUStatePDP11.prototype.trap = function(vector, flag, reason)
|
||||||
this.trapVector = vector;
|
this.trapVector = vector;
|
||||||
this.trapReason = reason;
|
this.trapReason = reason;
|
||||||
|
|
||||||
|
if (reason == PDP11.REASON.PANIC) {
|
||||||
|
this.stopCPU();
|
||||||
|
}
|
||||||
if (reason >= PDP11.REASON.RED) throw vector;
|
if (reason >= PDP11.REASON.RED) throw vector;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -1773,18 +1771,17 @@ CPUStatePDP11.prototype.popWord = function()
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* pushWord(data, fRed)
|
* pushWord(data)
|
||||||
*
|
*
|
||||||
* @this {CPUStatePDP11}
|
* @this {CPUStatePDP11}
|
||||||
* @param {number} data
|
* @param {number} data
|
||||||
* @param {boolean} [fRed]
|
|
||||||
*/
|
*/
|
||||||
CPUStatePDP11.prototype.pushWord = function(data, fRed)
|
CPUStatePDP11.prototype.pushWord = function(data)
|
||||||
{
|
{
|
||||||
var addrVirtual = (this.regsGen[6] - 2) & 0xffff;
|
var addrVirtual = (this.regsGen[6] - 2) & 0xffff;
|
||||||
this.regsGen[6] = addrVirtual; // BSD needs SP updated before any fault :-(
|
this.regsGen[6] = addrVirtual; // BSD needs SP updated before any fault :-(
|
||||||
this.opLast = (this.opLast & 0xffff) | ((this.opLast & ~0xffff) << 8) | (0x00f6 << 16);
|
this.opLast = (this.opLast & 0xffff) | ((this.opLast & ~0xffff) << 8) | (0x00f6 << 16);
|
||||||
if (!fRed) this.checkStackLimit(PDP11.ACCESS.WRITE_WORD, -2, addrVirtual);
|
if (!(this.opFlags & PDP11.OPFLAG.TRAP_RED)) this.checkStackLimit(PDP11.ACCESS.WRITE_WORD, -2, addrVirtual);
|
||||||
this.writeWord(addrVirtual, data);
|
this.writeWord(addrVirtual, data);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -2152,7 +2149,8 @@ CPUStatePDP11.prototype.readWordFromVirtual = function(addrVirtual)
|
||||||
CPUStatePDP11.prototype.writeWordToPhysical = function(addr, data)
|
CPUStatePDP11.prototype.writeWordToPhysical = function(addr, data)
|
||||||
{
|
{
|
||||||
if (addr >= BusPDP11.UNIBUS_22BIT) addr = this.mapUnibus(addr);
|
if (addr >= BusPDP11.UNIBUS_22BIT) addr = this.mapUnibus(addr);
|
||||||
this.bus.setWord(this.addrLast = addr, data & 0xffff);
|
this.assert(!(data & ~0xffff));
|
||||||
|
this.bus.setWord(this.addrLast = addr, data);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -2397,10 +2395,6 @@ CPUStatePDP11.prototype.updateDstWord = function(opCode, data, fnOp)
|
||||||
var reg = this.dstReg = opCode & PDP11.OPREG.MASK;
|
var reg = this.dstReg = opCode & PDP11.OPREG.MASK;
|
||||||
var mode = this.dstMode = (opCode & PDP11.OPMODE.MASK) >> PDP11.OPMODE.SHIFT;
|
var mode = this.dstMode = (opCode & PDP11.OPMODE.MASK) >> PDP11.OPMODE.SHIFT;
|
||||||
|
|
||||||
/*
|
|
||||||
* TODO: If callers are careful about masking data, then we don't need to mask it here or in bus.setWord().
|
|
||||||
* We've eliminated the 0xffff data mask here, but bus.setWord() is still masking.
|
|
||||||
*/
|
|
||||||
this.assert(data < 0 && data >= -8 || !(data & ~0xffff));
|
this.assert(data < 0 && data >= -8 || !(data & ~0xffff));
|
||||||
|
|
||||||
if (!mode) {
|
if (!mode) {
|
||||||
|
|
@ -2412,7 +2406,7 @@ CPUStatePDP11.prototype.updateDstWord = function(opCode, data, fnOp)
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* writeDstByte(opCode, data, writeFlags)
|
* writeDstByte(opCode, data, writeFlags, fnFlags)
|
||||||
*
|
*
|
||||||
* Used whenever the DST operand (as described by opCode) does NOT need to be read before writing.
|
* Used whenever the DST operand (as described by opCode) does NOT need to be read before writing.
|
||||||
*
|
*
|
||||||
|
|
@ -2420,9 +2414,9 @@ CPUStatePDP11.prototype.updateDstWord = function(opCode, data, fnOp)
|
||||||
* @param {number} opCode
|
* @param {number} opCode
|
||||||
* @param {number} data
|
* @param {number} data
|
||||||
* @param {number} writeFlags (WRITE.BYTE aka 0xff, or WRITE.SBYTE aka 0xffff)
|
* @param {number} writeFlags (WRITE.BYTE aka 0xff, or WRITE.SBYTE aka 0xffff)
|
||||||
* @return {number}
|
* @param {function(number)} fnFlags
|
||||||
*/
|
*/
|
||||||
CPUStatePDP11.prototype.writeDstByte = function(opCode, data, writeFlags)
|
CPUStatePDP11.prototype.writeDstByte = function(opCode, data, writeFlags, fnFlags)
|
||||||
{
|
{
|
||||||
this.assert(writeFlags);
|
this.assert(writeFlags);
|
||||||
var reg = this.dstReg = opCode & PDP11.OPREG.MASK;
|
var reg = this.dstReg = opCode & PDP11.OPREG.MASK;
|
||||||
|
|
@ -2441,41 +2435,39 @@ CPUStatePDP11.prototype.writeDstByte = function(opCode, data, writeFlags)
|
||||||
data = (data < 0? (this.regsGen[-data-1] & 0xff): data);
|
data = (data < 0? (this.regsGen[-data-1] & 0xff): data);
|
||||||
this.regsGen[reg] = (this.regsGen[reg] & ~writeFlags) | (((data << 24) >> 24) & writeFlags);
|
this.regsGen[reg] = (this.regsGen[reg] & ~writeFlags) | (((data << 24) >> 24) & writeFlags);
|
||||||
}
|
}
|
||||||
|
fnFlags.call(this, data << 8);
|
||||||
} else {
|
} else {
|
||||||
var addr = this.getAddr(mode, reg, PDP11.ACCESS.WRITE_BYTE);
|
var addr = this.getAddr(mode, reg, PDP11.ACCESS.WRITE_BYTE);
|
||||||
this.writeByteToPhysical(addr, (data = data < 0? (this.regsGen[-data-1] & 0xff): data));
|
fnFlags.call(this, (data = data < 0? (this.regsGen[-data-1] & 0xff) : data) << 8);
|
||||||
|
this.writeByteToPhysical(addr, data);
|
||||||
}
|
}
|
||||||
return data;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* writeDstWord(opCode, data)
|
* writeDstWord(opCode, data, fnFlags)
|
||||||
*
|
*
|
||||||
* Used whenever the DST operand (as described by opCode) does NOT need to be read before writing.
|
* Used whenever the DST operand (as described by opCode) does NOT need to be read before writing.
|
||||||
*
|
*
|
||||||
* @this {CPUStatePDP11}
|
* @this {CPUStatePDP11}
|
||||||
* @param {number} opCode
|
* @param {number} opCode
|
||||||
* @param {number} data
|
* @param {number} data
|
||||||
* @return {number}
|
* @param {function(number)} fnFlags
|
||||||
*/
|
*/
|
||||||
CPUStatePDP11.prototype.writeDstWord = function(opCode, data)
|
CPUStatePDP11.prototype.writeDstWord = function(opCode, data, fnFlags)
|
||||||
{
|
{
|
||||||
var reg = this.dstReg = opCode & PDP11.OPREG.MASK;
|
var reg = this.dstReg = opCode & PDP11.OPREG.MASK;
|
||||||
var mode = this.dstMode = (opCode & PDP11.OPMODE.MASK) >> PDP11.OPMODE.SHIFT;
|
var mode = this.dstMode = (opCode & PDP11.OPMODE.MASK) >> PDP11.OPMODE.SHIFT;
|
||||||
|
|
||||||
/*
|
|
||||||
* TODO: If callers are careful about masking data, then we don't need to mask it here or in bus.setWord().
|
|
||||||
* We've eliminated the 0xffff data mask here, but bus.setWord() is still masking.
|
|
||||||
*/
|
|
||||||
this.assert(data < 0 && data >= -8 || !(data & ~0xffff));
|
this.assert(data < 0 && data >= -8 || !(data & ~0xffff));
|
||||||
|
|
||||||
if (!mode) {
|
if (!mode) {
|
||||||
this.regsGen[reg] = (data = (data < 0? this.regsGen[-data-1] : data));
|
this.regsGen[reg] = (data = data < 0? this.regsGen[-data-1] : data);
|
||||||
|
fnFlags.call(this, data);
|
||||||
} else {
|
} else {
|
||||||
var addr = this.getAddr(mode, reg, PDP11.ACCESS.WRITE_WORD);
|
var addr = this.getAddr(mode, reg, PDP11.ACCESS.WRITE_WORD);
|
||||||
this.bus.setWord(addr, (data = (data < 0? this.regsGen[-data-1] : data)));
|
fnFlags.call(this, (data = data < 0? this.regsGen[-data-1] : data));
|
||||||
|
this.bus.setWord(addr, data);
|
||||||
}
|
}
|
||||||
return data;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -2606,6 +2598,7 @@ CPUStatePDP11.prototype.stepCPU = function(nMinCycles)
|
||||||
} else {
|
} else {
|
||||||
this.assert(!this.irqNext && !this.regPIR);
|
this.assert(!this.irqNext && !this.regPIR);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Snapshot the TF bit in opFlags, while clearing all other opFlags (except those in PRESERVE);
|
* Snapshot the TF bit in opFlags, while clearing all other opFlags (except those in PRESERVE);
|
||||||
* we'll check the TRAP_TF bit in opFlags when we come back around for another opcode.
|
* we'll check the TRAP_TF bit in opFlags when we come back around for another opcode.
|
||||||
|
|
|
||||||
|
|
@ -219,18 +219,20 @@ var PDP11 = {
|
||||||
* immediate (thrown) traps, as they are considered ABORTs; the rest generate synchronous traps.
|
* immediate (thrown) traps, as they are considered ABORTs; the rest generate synchronous traps.
|
||||||
*/
|
*/
|
||||||
REASON: {
|
REASON: {
|
||||||
ABORT: -1, // immediate MMU fault
|
PANIC: -1, // immediate halt (internal error)
|
||||||
ILLEGAL: -2, // immediate invalid opcode (BUS)
|
ABORT: -2, // immediate MMU fault
|
||||||
RED: -3, // immediate stack overflow fault (BUS)
|
ILLEGAL: -3, // immediate invalid opcode (BUS)
|
||||||
YELLOW: -4, // deferred stack overflow fault (BUS)
|
RED: -4, // immediate stack overflow fault (BUS)
|
||||||
FAULT: -5, // deferred MMU fault
|
YELLOW: -5, // deferred stack overflow fault (BUS)
|
||||||
TRACE: -6, // deferred TF fault (BPT)
|
FAULT: -6, // deferred MMU fault
|
||||||
HALT: -7, // illegal HALT (BUS)
|
TRACE: -7, // deferred TF fault (BPT)
|
||||||
OPCODE: -8, // opcode-generated trap (eg, BPT, EMT, IOT, TRAP, or RESERVED opcode)
|
HALT: -8, // illegal HALT (BUS)
|
||||||
INTERRUPT: -9, // device-generated trap (vector is device-specific)
|
OPCODE: -9, // opcode-generated trap (eg, BPT, EMT, IOT, TRAP, or RESERVED opcode)
|
||||||
|
INTERRUPT: -10, // device-generated trap (vector is device-specific)
|
||||||
},
|
},
|
||||||
REASONS: [
|
REASONS: [
|
||||||
"UNKNOWN",
|
"UNKNOWN",
|
||||||
|
"PANIC",
|
||||||
"ABORT",
|
"ABORT",
|
||||||
"ILLEGAL",
|
"ILLEGAL",
|
||||||
"RED",
|
"RED",
|
||||||
|
|
@ -271,7 +273,7 @@ var PDP11 = {
|
||||||
TRAP_MMU: 0x0040,
|
TRAP_MMU: 0x0040,
|
||||||
TRAP_MASK: 0x0070,
|
TRAP_MASK: 0x0070,
|
||||||
TRAP_LAST: 0x0080, // set if last operation was a trap (see trapLast for the vector, and trapReason for the reason)
|
TRAP_LAST: 0x0080, // set if last operation was a trap (see trapLast for the vector, and trapReason for the reason)
|
||||||
NO_FLAGS: 0x0100 // set whenever the PSW is written directly, requiring all updateXXXFlags() functions to leave flags unchanged
|
TRAP_RED: 0x0100, // set whenever a RED trap occurs, used to catch double RED traps (time to PANIC)
|
||||||
},
|
},
|
||||||
/*
|
/*
|
||||||
* Opcode reg (opcode bits 2-0)
|
* Opcode reg (opcode bits 2-0)
|
||||||
|
|
@ -489,6 +491,8 @@ var PDP11 = {
|
||||||
RLMP: 0o174406, // RL11 Multi-Purpose Register
|
RLMP: 0o174406, // RL11 Multi-Purpose Register
|
||||||
RLBE: 0o174410, // RL11 Bus (Address) Extension Register (RLV12 controller only)
|
RLBE: 0o174410, // RL11 Bus (Address) Extension Register (RLV12 controller only)
|
||||||
|
|
||||||
|
DL11: 0o176500, // DL11 Additional Register Range (ends at 0o176676)
|
||||||
|
|
||||||
RKDS: 0o177400, // RK11 Drive Status Register
|
RKDS: 0o177400, // RK11 Drive Status Register
|
||||||
RKER: 0o177402, // RK11 Error Register
|
RKER: 0o177402, // RK11 Error Register
|
||||||
RKCS: 0o177404, // RK11 Control Status Register
|
RKCS: 0o177404, // RK11 Control Status Register
|
||||||
|
|
@ -609,6 +613,7 @@ var PDP11 = {
|
||||||
DSC: 0x8000, // Dataset Status Change (R/O)
|
DSC: 0x8000, // Dataset Status Change (R/O)
|
||||||
RMASK: 0xFFFE, // bits readable (TODO: All I know for sure is that bit 0 is NOT readable; see readRCSR())
|
RMASK: 0xFFFE, // bits readable (TODO: All I know for sure is that bit 0 is NOT readable; see readRCSR())
|
||||||
WMASK: 0x006F, // bits writable
|
WMASK: 0x006F, // bits writable
|
||||||
|
RS232: 0x0006, // bits affecting RS-232 status updates
|
||||||
BAUD: 9600
|
BAUD: 9600
|
||||||
},
|
},
|
||||||
RBUF: { // 177562: DL11 Receiver Data Buffer Register
|
RBUF: { // 177562: DL11 Receiver Data Buffer Register
|
||||||
|
|
@ -846,10 +851,10 @@ var PDP11 = {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
VECTORS: {
|
VECTORS: {
|
||||||
0o060: "DL11.RCSR",
|
0o060: "DL11R",
|
||||||
0o064: "DL11.XCSR",
|
0o064: "DL11X",
|
||||||
0o070: "PC11.PRS",
|
0o070: "PC11R",
|
||||||
0o074: "PC11.PPS",
|
0o074: "PC11X",
|
||||||
0o100: "KW11",
|
0o100: "KW11",
|
||||||
0o160: "RL11",
|
0o160: "RL11",
|
||||||
0o220: "RK11"
|
0o220: "RK11"
|
||||||
|
|
|
||||||
|
|
@ -1065,7 +1065,6 @@ DevicePDP11.prototype.writePSW = function(data, addr)
|
||||||
*/
|
*/
|
||||||
var maskDisallowed = PDP11.PSW.UNUSED;
|
var maskDisallowed = PDP11.PSW.UNUSED;
|
||||||
this.cpu.setPSW((data & ~maskDisallowed) | (this.cpu.getPSW() & maskDisallowed));
|
this.cpu.setPSW((data & ~maskDisallowed) | (this.cpu.getPSW() & maskDisallowed));
|
||||||
this.cpu.opFlags |= PDP11.OPFLAG.NO_FLAGS;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -713,15 +713,15 @@ PC11.prototype.parseTape = function(sTapeName, sTapePath, nTapeTarget, aBytes, a
|
||||||
this.sTapePath = "";
|
this.sTapePath = "";
|
||||||
this.sTapeSource = PC11.SOURCE.NONE;
|
this.sTapeSource = PC11.SOURCE.NONE;
|
||||||
this.nTapeTarget = PC11.TARGET.NONE;
|
this.nTapeTarget = PC11.TARGET.NONE;
|
||||||
this.notice("No load address available for tape: " + sTapeName);
|
this.notice('No load address available for tape "' + sTapeName + '"');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this.status("tape loaded: " + sTapeName);
|
this.status('Loaded tape "' + sTapeName + '"');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this.iTapeData = 0;
|
this.iTapeData = 0;
|
||||||
this.aTapeData = aBytes;
|
this.aTapeData = aBytes;
|
||||||
this.status("tape attached: " + sTapeName);
|
this.status('Attached tape "' + sTapeName + '"');
|
||||||
this.displayProgress(0);
|
this.displayProgress(0);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -215,6 +215,8 @@ RAMPDP11.prototype.initRAM = function()
|
||||||
if (!this.fAllocated && this.sizeRAM) {
|
if (!this.fAllocated && this.sizeRAM) {
|
||||||
if (this.bus.addMemory(this.addrRAM, this.sizeRAM, MemoryPDP11.TYPE.RAM)) {
|
if (this.bus.addMemory(this.addrRAM, this.sizeRAM, MemoryPDP11.TYPE.RAM)) {
|
||||||
this.fAllocated = true;
|
this.fAllocated = true;
|
||||||
|
} else {
|
||||||
|
this.sizeRAM = 0; // don't bother trying again (it just results in redundant error messages)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!this.isReady()) {
|
if (!this.isReady()) {
|
||||||
|
|
|
||||||
|
|
@ -117,6 +117,7 @@ function SerialPortPDP11(parmsSerial) {
|
||||||
this.tabSize = parmsSerial['tabSize'];
|
this.tabSize = parmsSerial['tabSize'];
|
||||||
this.charBOL = parmsSerial['charBOL'];
|
this.charBOL = parmsSerial['charBOL'];
|
||||||
this.iLogicalCol = 0;
|
this.iLogicalCol = 0;
|
||||||
|
this.fNullModem = true;
|
||||||
|
|
||||||
Component.call(this, "SerialPort", parmsSerial, SerialPortPDP11, MessagesPDP11.SERIAL);
|
Component.call(this, "SerialPort", parmsSerial, SerialPortPDP11, MessagesPDP11.SERIAL);
|
||||||
|
|
||||||
|
|
@ -134,14 +135,15 @@ function SerialPortPDP11(parmsSerial) {
|
||||||
* No connection until initConnection() is called.
|
* No connection until initConnection() is called.
|
||||||
*/
|
*/
|
||||||
this.sDataReceived = "";
|
this.sDataReceived = "";
|
||||||
this.connection = this.sendData = null;
|
this.connection = this.sendData = this.updateStatus = null;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Export all functions required by initConnection(); currently, this is the bare minimum (no flow control yet).
|
* Export all functions required by initConnection().
|
||||||
*/
|
*/
|
||||||
this['exports'] = {
|
this['exports'] = {
|
||||||
'connect': this.initConnection,
|
'connect': this.initConnection,
|
||||||
'receiveData': this.receiveData
|
'receiveData': this.receiveData,
|
||||||
|
'receiveStatus': this.receiveStatus
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -308,7 +310,7 @@ SerialPortPDP11.prototype.initBus = function(cmp, bus, cpu, dbg)
|
||||||
|
|
||||||
var serial = this;
|
var serial = this;
|
||||||
|
|
||||||
this.irqReceiver = this.cpu.addIRQ(PDP11.DL11.RVEC, PDP11.DL11.PRI, MessagesPDP11.DL11);
|
this.irqReceiver = this.cpu.addIRQ(this.iAdapter? -1 : PDP11.DL11.RVEC, PDP11.DL11.PRI, MessagesPDP11.DL11);
|
||||||
|
|
||||||
this.timerReceiveInterrupt = this.cpu.addTimer(function readyReceiver() {
|
this.timerReceiveInterrupt = this.cpu.addTimer(function readyReceiver() {
|
||||||
var b = serial.receiveByte();
|
var b = serial.receiveByte();
|
||||||
|
|
@ -325,7 +327,7 @@ SerialPortPDP11.prototype.initBus = function(cmp, bus, cpu, dbg)
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
this.irqTransmitter = this.cpu.addIRQ(PDP11.DL11.XVEC, PDP11.DL11.PRI, MessagesPDP11.DL11);
|
this.irqTransmitter = this.cpu.addIRQ(this.iAdapter? -1 : PDP11.DL11.XVEC, PDP11.DL11.PRI, MessagesPDP11.DL11);
|
||||||
|
|
||||||
this.timerTransmitInterrupt = this.cpu.addTimer(function readyTransmitter() {
|
this.timerTransmitInterrupt = this.cpu.addTimer(function readyTransmitter() {
|
||||||
serial.regXCSR |= PDP11.DL11.XCSR.READY;
|
serial.regXCSR |= PDP11.DL11.XCSR.READY;
|
||||||
|
|
@ -334,14 +336,14 @@ SerialPortPDP11.prototype.initBus = function(cmp, bus, cpu, dbg)
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
bus.addIOTable(this, SerialPortPDP11.UNIBUS_IOTABLE);
|
bus.addIOTable(this, SerialPortPDP11.UNIBUS_IOTABLE, this.iAdapter? ((PDP11.UNIBUS.DL11 + (this.iAdapter - 1) * 8) - PDP11.UNIBUS.RCSR) : 0);
|
||||||
bus.addResetHandler(this.reset.bind(this));
|
bus.addResetHandler(this.reset.bind(this));
|
||||||
|
|
||||||
this.setReady();
|
this.setReady();
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* initConnection()
|
* initConnection(fNullModem)
|
||||||
*
|
*
|
||||||
* If a machine 'connection' parameter exists of the form "{sourcePort}->{targetMachine}.{targetPort}",
|
* If a machine 'connection' parameter exists of the form "{sourcePort}->{targetMachine}.{targetPort}",
|
||||||
* and "{sourcePort}" matches our idComponent, then look for a component with id "{targetMachine}.{targetPort}".
|
* and "{sourcePort}" matches our idComponent, then look for a component with id "{targetMachine}.{targetPort}".
|
||||||
|
|
@ -349,6 +351,7 @@ SerialPortPDP11.prototype.initBus = function(cmp, bus, cpu, dbg)
|
||||||
* If the target component is found, then verify that it has exported functions with the following names:
|
* If the target component is found, then verify that it has exported functions with the following names:
|
||||||
*
|
*
|
||||||
* receiveData(data): called when we have data to transmit; aliased internally to sendData(data)
|
* receiveData(data): called when we have data to transmit; aliased internally to sendData(data)
|
||||||
|
* receiveStatus(pins): called when our control signals have changed; aliased internally to updateStatus(pins)
|
||||||
*
|
*
|
||||||
* For now, we're not going to worry about communication in the other direction, because when the target component
|
* For now, we're not going to worry about communication in the other direction, because when the target component
|
||||||
* performs its own initConnection(), it will find our receiveData() function, at which point communication in both
|
* performs its own initConnection(), it will find our receiveData() function, at which point communication in both
|
||||||
|
|
@ -359,8 +362,9 @@ SerialPortPDP11.prototype.initBus = function(cmp, bus, cpu, dbg)
|
||||||
* if we've already initialized, no harm done.
|
* if we've already initialized, no harm done.
|
||||||
*
|
*
|
||||||
* @this {SerialPortPDP11}
|
* @this {SerialPortPDP11}
|
||||||
|
* @param {boolean} [fNullModem] (caller's null-modem setting, to ensure our settings are in agreement)
|
||||||
*/
|
*/
|
||||||
SerialPortPDP11.prototype.initConnection = function()
|
SerialPortPDP11.prototype.initConnection = function(fNullModem)
|
||||||
{
|
{
|
||||||
if (!this.connection) {
|
if (!this.connection) {
|
||||||
var sConnection = this.cmp.getMachineParm("connection");
|
var sConnection = this.cmp.getMachineParm("connection");
|
||||||
|
|
@ -375,9 +379,11 @@ SerialPortPDP11.prototype.initConnection = function()
|
||||||
var exports = this.connection['exports'];
|
var exports = this.connection['exports'];
|
||||||
if (exports) {
|
if (exports) {
|
||||||
var fnConnect = exports['connect'];
|
var fnConnect = exports['connect'];
|
||||||
if (fnConnect) fnConnect.call(this.connection);
|
if (fnConnect) fnConnect.call(this.connection, this.fNullModem);
|
||||||
this.sendData = exports['receiveData'];
|
this.sendData = exports['receiveData'];
|
||||||
if (this.sendData) {
|
if (this.sendData) {
|
||||||
|
this.fNullModem = fNullModem;
|
||||||
|
this.updateStatus = exports['receiveStatus'];
|
||||||
this.status(this.idMachine + '.' + sSourceID + " connected to " + sTargetID);
|
this.status(this.idMachine + '.' + sSourceID + " connected to " + sTargetID);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -410,7 +416,7 @@ SerialPortPDP11.prototype.powerUp = function(data, fRepower)
|
||||||
* may be not fully resolved until the target machine performs its own initConnection(), which will
|
* may be not fully resolved until the target machine performs its own initConnection(), which will
|
||||||
* in turn invoke our initConnection() again.
|
* in turn invoke our initConnection() again.
|
||||||
*/
|
*/
|
||||||
this.initConnection();
|
this.initConnection(this.fNullModem);
|
||||||
|
|
||||||
if (!data || !this.restore) {
|
if (!data || !this.restore) {
|
||||||
this.reset();
|
this.reset();
|
||||||
|
|
@ -483,7 +489,7 @@ SerialPortPDP11.prototype.restore = function(data)
|
||||||
SerialPortPDP11.prototype.initState = function(data)
|
SerialPortPDP11.prototype.initState = function(data)
|
||||||
{
|
{
|
||||||
this.regRBUF = 0;
|
this.regRBUF = 0;
|
||||||
this.regRCSR = 0;
|
this.regRCSR = PDP11.DL11.RCSR.CTS; // TODO: I didn't use to set this initially; is this wise?
|
||||||
this.regXCSR = PDP11.DL11.XCSR.READY;
|
this.regXCSR = PDP11.DL11.XCSR.READY;
|
||||||
this.abReceive = [];
|
this.abReceive = [];
|
||||||
return true;
|
return true;
|
||||||
|
|
@ -592,6 +598,30 @@ SerialPortPDP11.prototype.receiveByte = function()
|
||||||
return b;
|
return b;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* receiveStatus(pins)
|
||||||
|
*
|
||||||
|
* @this {SerialPortPDP11}
|
||||||
|
* @param {number} pins
|
||||||
|
*/
|
||||||
|
SerialPortPDP11.prototype.receiveStatus = function(pins)
|
||||||
|
{
|
||||||
|
var oldRCSR = this.regRCSR;
|
||||||
|
this.regRCSR &= ~(PDP11.DL11.RCSR.CTS | PDP11.DL11.RCSR.CD);
|
||||||
|
if (pins & RS232.CTS.MASK) {
|
||||||
|
this.regRCSR |= PDP11.DL11.RCSR.CTS;
|
||||||
|
}
|
||||||
|
if (pins & RS232.CD.MASK) {
|
||||||
|
this.regRCSR |= PDP11.DL11.RCSR.CD;
|
||||||
|
}
|
||||||
|
if (oldRCSR != this.regRCSR) {
|
||||||
|
this.regRCSR |= PDP11.DL11.RCSR.DSC;
|
||||||
|
if (this.regRCSR & PDP11.DL11.RCSR.DIE) {
|
||||||
|
this.cpu.setIRQ(this.irqReceiver);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* transmitByte(b)
|
* transmitByte(b)
|
||||||
*
|
*
|
||||||
|
|
@ -681,7 +711,9 @@ SerialPortPDP11.prototype.transmitByte = function(b)
|
||||||
*/
|
*/
|
||||||
SerialPortPDP11.prototype.readRCSR = function(addr)
|
SerialPortPDP11.prototype.readRCSR = function(addr)
|
||||||
{
|
{
|
||||||
return this.regRCSR & PDP11.DL11.RCSR.RMASK;
|
var data = this.regRCSR & PDP11.DL11.RCSR.RMASK;
|
||||||
|
this.regRCSR &= ~PDP11.DL11.RCSR.DSC;
|
||||||
|
return data;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -693,7 +725,24 @@ SerialPortPDP11.prototype.readRCSR = function(addr)
|
||||||
*/
|
*/
|
||||||
SerialPortPDP11.prototype.writeRCSR = function(data, addr)
|
SerialPortPDP11.prototype.writeRCSR = function(data, addr)
|
||||||
{
|
{
|
||||||
|
var delta = (data ^ this.regRCSR);
|
||||||
this.regRCSR = (this.regRCSR & ~PDP11.DL11.RCSR.WMASK) | (data & PDP11.DL11.RCSR.WMASK);
|
this.regRCSR = (this.regRCSR & ~PDP11.DL11.RCSR.WMASK) | (data & PDP11.DL11.RCSR.WMASK);
|
||||||
|
/*
|
||||||
|
* Whenever DTR or RTS changes, we also want to notify any connected machine, via updateStatus().
|
||||||
|
*/
|
||||||
|
if (this.updateStatus) {
|
||||||
|
if (delta & PDP11.DL11.RCSR.RS232) {
|
||||||
|
var pins = 0;
|
||||||
|
if (this.fNullModem) {
|
||||||
|
pins |= (data & PDP11.DL11.RCSR.RTS)? RS232.CTS.MASK : 0;
|
||||||
|
pins |= (data & PDP11.DL11.RCSR.DTR)? (RS232.DSR.MASK | RS232.CD.MASK): 0;
|
||||||
|
} else {
|
||||||
|
pins |= (data & PDP11.DL11.RCSR.RTS)? RS232.RTS.MASK : 0;
|
||||||
|
pins |= (data & PDP11.DL11.RCSR.DTR)? RS232.DTR.MASK : 0;
|
||||||
|
}
|
||||||
|
this.updateStatus.call(this.connection, pins);
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -62,6 +62,51 @@ var MAXDEBUG = false; // this @define is overridden by the Closure Com
|
||||||
*/
|
*/
|
||||||
var PRIVATE = false; // this @define is overridden by the Closure Compiler (to false) to enable PRIVATE code
|
var PRIVATE = false; // this @define is overridden by the Closure Compiler (to false) to enable PRIVATE code
|
||||||
|
|
||||||
|
/*
|
||||||
|
* RS-232 DB-25 Pin Definitions, mapped to bits 1-25 in a 32-bit status value.
|
||||||
|
*
|
||||||
|
* SerialPorts in PCjs machines are considered DTE (Data Terminal Equipment), which means they should be "virtually"
|
||||||
|
* connected to each other via a null-modem cable, which assumes the following cross-wiring:
|
||||||
|
*
|
||||||
|
* G 1 <-> 1 G (Ground)
|
||||||
|
* TD 2 <-> 3 RD (Received Data)
|
||||||
|
* RD 3 <-> 2 TD (Transmitted Data)
|
||||||
|
* RTS 4 <-> 5 CTS (Clear To Send)
|
||||||
|
* CTS 5 <-> 4 RTS (Request To Send)
|
||||||
|
* DSR 6+8 <-> 20 DTR (Data Terminal Ready)
|
||||||
|
* SG 7 <-> 7 SG (Signal Ground)
|
||||||
|
* DTR 20 <-> 6+8 DSR (Data Set Ready + Carrier Detect)
|
||||||
|
* RI 22 <-> 22 RI (Ring Indicator)
|
||||||
|
*
|
||||||
|
* TODO: Move these definitions to a more appropriate shared file at some point.
|
||||||
|
*/
|
||||||
|
var RS232 = {
|
||||||
|
RTS: {
|
||||||
|
PIN: 4,
|
||||||
|
MASK: 0x00000010
|
||||||
|
},
|
||||||
|
CTS: {
|
||||||
|
PIN: 5,
|
||||||
|
MASK: 0x00000020
|
||||||
|
},
|
||||||
|
DSR: {
|
||||||
|
PIN: 6,
|
||||||
|
MASK: 0x00000040
|
||||||
|
},
|
||||||
|
CD: {
|
||||||
|
PIN: 8,
|
||||||
|
MASK: 0x00000100
|
||||||
|
},
|
||||||
|
DTR: {
|
||||||
|
PIN: 20,
|
||||||
|
MASK: 0x00100000
|
||||||
|
},
|
||||||
|
RI: {
|
||||||
|
PIN: 22,
|
||||||
|
MASK: 0x00400000
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* NODE should be true if we're running under NodeJS (eg, command-line), false if not (eg, web browser)
|
* NODE should be true if we're running under NodeJS (eg, command-line), false if not (eg, web browser)
|
||||||
*/
|
*/
|
||||||
|
|
@ -82,6 +127,7 @@ if (NODE) {
|
||||||
global.DEBUG = DEBUG;
|
global.DEBUG = DEBUG;
|
||||||
global.MAXDEBUG = MAXDEBUG;
|
global.MAXDEBUG = MAXDEBUG;
|
||||||
global.PRIVATE = PRIVATE;
|
global.PRIVATE = PRIVATE;
|
||||||
|
global.RS232 = RS232;
|
||||||
global.NODE = NODE;
|
global.NODE = NODE;
|
||||||
/*
|
/*
|
||||||
* TODO: When we're "required" by Node, should we return anything via module.exports?
|
* TODO: When we're "required" by Node, should we return anything via module.exports?
|
||||||
|
|
|
||||||
|
|
@ -57,7 +57,7 @@
|
||||||
}
|
}
|
||||||
.pcjs-progress {
|
.pcjs-progress {
|
||||||
height: 20px;
|
height: 20px;
|
||||||
width: 300px;
|
width: 200px;
|
||||||
margin-top: 8px;
|
margin-top: 8px;
|
||||||
border: 1px solid black;
|
border: 1px solid black;
|
||||||
position: relative;
|
position: relative;
|
||||||
|
|
@ -71,7 +71,7 @@
|
||||||
}
|
}
|
||||||
.pcjs-progress-text {
|
.pcjs-progress-text {
|
||||||
height: 20px;
|
height: 20px;
|
||||||
width: 300px;
|
width: 200px;
|
||||||
font-size: small;
|
font-size: small;
|
||||||
line-height: 20px;
|
line-height: 20px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
|
|
@ -229,7 +229,7 @@
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
@media screen and (max-width: 900px) {
|
@media screen and (max-width: 800px) {
|
||||||
.pcjs-textarea {
|
.pcjs-textarea {
|
||||||
width: 100% !important;
|
width: 100% !important;
|
||||||
}
|
}
|
||||||
|
|
@ -247,3 +247,13 @@
|
||||||
padding-right: 0 !important;
|
padding-right: 0 !important;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@media screen and (min-width: 1400px) {
|
||||||
|
.machine-left, .machine-right {
|
||||||
|
max-width: 45%;
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
.machine-right + * {
|
||||||
|
clear: both;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -52,7 +52,7 @@
|
||||||
}
|
}
|
||||||
.pcjs-progress {
|
.pcjs-progress {
|
||||||
height: 20px;
|
height: 20px;
|
||||||
width: 300px;
|
width: 200px;
|
||||||
margin-top: 8px;
|
margin-top: 8px;
|
||||||
border: 1px solid black;
|
border: 1px solid black;
|
||||||
position: relative;
|
position: relative;
|
||||||
|
|
@ -66,7 +66,7 @@
|
||||||
}
|
}
|
||||||
.pcjs-progress-text {
|
.pcjs-progress-text {
|
||||||
height: 20px;
|
height: 20px;
|
||||||
width: 300px;
|
width: 200px;
|
||||||
font-size: small;
|
font-size: small;
|
||||||
line-height: 20px;
|
line-height: 20px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
|
|
@ -224,7 +224,7 @@
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
@media screen and (max-width: 900px) {
|
@media screen and (max-width: 800px) {
|
||||||
.pcjs-textarea {
|
.pcjs-textarea {
|
||||||
width: 100% !important;
|
width: 100% !important;
|
||||||
}
|
}
|
||||||
|
|
@ -242,3 +242,13 @@
|
||||||
padding-right: 0 !important;
|
padding-right: 0 !important;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@media screen and (min-width: 1400px) {
|
||||||
|
.machine-left, .machine-right {
|
||||||
|
max-width: 45%;
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
.machine-right + * {
|
||||||
|
clear: both;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -52,7 +52,7 @@
|
||||||
}
|
}
|
||||||
.pcjs-progress {
|
.pcjs-progress {
|
||||||
height: 20px;
|
height: 20px;
|
||||||
width: 300px;
|
width: 200px;
|
||||||
margin-top: 8px;
|
margin-top: 8px;
|
||||||
border: 1px solid black;
|
border: 1px solid black;
|
||||||
position: relative;
|
position: relative;
|
||||||
|
|
@ -66,7 +66,7 @@
|
||||||
}
|
}
|
||||||
.pcjs-progress-text {
|
.pcjs-progress-text {
|
||||||
height: 20px;
|
height: 20px;
|
||||||
width: 300px;
|
width: 200px;
|
||||||
font-size: small;
|
font-size: small;
|
||||||
line-height: 20px;
|
line-height: 20px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
|
|
@ -224,7 +224,7 @@
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
@media screen and (max-width: 900px) {
|
@media screen and (max-width: 800px) {
|
||||||
.pcjs-textarea {
|
.pcjs-textarea {
|
||||||
width: 100% !important;
|
width: 100% !important;
|
||||||
}
|
}
|
||||||
|
|
@ -242,3 +242,13 @@
|
||||||
padding-right: 0 !important;
|
padding-right: 0 !important;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@media screen and (min-width: 1400px) {
|
||||||
|
.machine-left, .machine-right {
|
||||||
|
max-width: 45%;
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
.machine-right + * {
|
||||||
|
clear: both;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -52,7 +52,7 @@
|
||||||
}
|
}
|
||||||
.pcjs-progress {
|
.pcjs-progress {
|
||||||
height: 20px;
|
height: 20px;
|
||||||
width: 300px;
|
width: 200px;
|
||||||
margin-top: 8px;
|
margin-top: 8px;
|
||||||
border: 1px solid black;
|
border: 1px solid black;
|
||||||
position: relative;
|
position: relative;
|
||||||
|
|
@ -66,7 +66,7 @@
|
||||||
}
|
}
|
||||||
.pcjs-progress-text {
|
.pcjs-progress-text {
|
||||||
height: 20px;
|
height: 20px;
|
||||||
width: 300px;
|
width: 200px;
|
||||||
font-size: small;
|
font-size: small;
|
||||||
line-height: 20px;
|
line-height: 20px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
|
|
@ -224,7 +224,7 @@
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
@media screen and (max-width: 900px) {
|
@media screen and (max-width: 800px) {
|
||||||
.pcjs-textarea {
|
.pcjs-textarea {
|
||||||
width: 100% !important;
|
width: 100% !important;
|
||||||
}
|
}
|
||||||
|
|
@ -242,3 +242,13 @@
|
||||||
padding-right: 0 !important;
|
padding-right: 0 !important;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@media screen and (min-width: 1400px) {
|
||||||
|
.machine-left, .machine-right {
|
||||||
|
max-width: 45%;
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
.machine-right + * {
|
||||||
|
clear: both;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Loading…
Reference in a new issue