Merge branch 'next-release'

This commit is contained in:
Jeff Parsons 2016-12-01 21:27:50 -08:00
commit 55e47ac9d0
61 changed files with 3727 additions and 2718 deletions

View file

@ -9,9 +9,9 @@ Challenger 1P 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 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/)
See the [Documentation](/docs/c1pjs/) for details on the operation of C1Pjs.

View file

@ -10,8 +10,8 @@ Challenger 1P Machine Configurations
Here are some sample C1P Machine Configurations:
- [8kb with Small Display](8kb/small/)
- [8kb with Large Display](8kb/large/) ([Debugger](8kb/large/debugger/))
- [8kb with Large Display w/Additional Software](8kb/all/) ([Debugger](8kb/all/debugger/))
- [8kb with Large Display](8kb/large/) (with [Debugger](8kb/large/debugger/))
- [8kb with Large Display w/Additional Software](8kb/all/) (with [Debugger](8kb/all/debugger/))
- [8kb "Server Array" Demo](8kb/array/)
- [32kb with Diskette Support](32kb/)

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<?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>
<computer id="computer" busWidth="16"/>
<cpu id="cpu8080" model="8080" cycles="2764800" autoStart="true"/>

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<?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>
<computer id="computer" busWidth="16"/>
<cpu id="cpu8080" model="8080" cycles="2764800"/>
@ -29,6 +29,6 @@
<control type="button" binding="setup" padLeft="8px" padBottom="8px">SET-UP</control>
</keyboard>
<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>
</machine>

View file

@ -7,12 +7,12 @@ permalink: /devices/pdp11/machine/1120/
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 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 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
has 56Kb of RAM.
The "Demo" machines come with 16Kb of RAM and a [PC11 Paper Tape Reader](/devices/pdp11/pc11/). All the other machines
are configured with 56Kb of RAM.

View 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.

View 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).

View 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).

View 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>

View 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>

View 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/).

View 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" %}

View 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>

View 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>

View file

@ -7,7 +7,7 @@ permalink: /devices/pdp11/machine/1170/
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 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
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.

View file

@ -1,6 +1,6 @@
---
layout: page
title: PDP-11/70 Boot Monitor
title: PDP-11/70 with 256Kb and Boot Monitor
permalink: /devices/pdp11/machine/1170/monitor/
machines:
- id: test1170

View file

@ -1,6 +1,6 @@
---
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/
machines:
- id: test1170

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pdpjs/1.30.5/machine.xsl"?>
<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"/>
<cpu id="cpu" model="1170" cycles="6666667"/>
<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"/>
<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>

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pdpjs/1.30.5/machine.xsl"?>
<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"/>
<cpu id="cpu" model="1170" cycles="6666667" autoStart="true"/>
<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"/>
<panel ref="/devices/pdp11/panel/test/terminal.xml"/>
<device ref="/devices/pdp11/pc11/default.xml"/>
<device ref="/devices/pdp11/rk11/default.xml"/>
<device ref="/devices/pdp11/rl11/default.xml"/>
</machine>

View file

@ -10,3 +10,7 @@ machines:
{% include machine.html id="test1170" %}
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).

View file

@ -15,6 +15,6 @@ machines:
{% include machine.html id="test1170" %}
This PDP-11/70 is also available with our built-in [Debugger](debugger/).
{% include machine.html id="vt100" %}
This PDP-11/70 is also available with our built-in [Debugger](debugger/).

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<?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>
<computer id="computer" busWidth="22"/>
<cpu id="cpu" model="1170" cycles="6666667" autoStart="true"/>

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<?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>
<computer id="computer" busWidth="22"/>
<cpu id="cpu" model="1170" cycles="6666667" autoStart="true"/>

View file

@ -7,8 +7,8 @@ permalink: /devices/pdp11/machine/
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/45
* [PDP-11/45](/devices/pdp11/machine/1145/)
* [PDP-11/70](/devices/pdp11/machine/1170/)

View file

@ -204,7 +204,7 @@
</control>
</control>
<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="text" binding="debugInput" width="auto"/>
<control type="button" binding="debugEnter">Enter</control>

View 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.

View 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)

View 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>

View 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>

View file

@ -204,7 +204,7 @@
</control>
</control>
<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="text" binding="debugInput" width="auto"/>
<control type="button" binding="debugEnter">Enter</control>

View file

@ -204,7 +204,7 @@
</control>
</control>
<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 type="container" class="pcjs-registers" width="35%" padding="8px">
<control type="button" binding="run">Run</control>

View file

@ -8,5 +8,6 @@ PDP-11 Control Panels
---------------------
* [11/20 Front Panels](1120/)
* [11/45 Front Panels](1145/)
* [11/70 Front Panels](1170/)
* [Terminal Test Panels](test/)

View file

@ -53,6 +53,6 @@
<control type="button" binding="loadTape">Load</control>
<control type="description" binding="descTape" padRight="8px"/>
<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>
</device>

View file

@ -12,8 +12,8 @@ disk cartridges.
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 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/)
for use by those machines, which are listed in the following RK11 Device XML file:

View 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:
- [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 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
from [Paul Nankervis](http://skn.noip.me/pdp11/) for use by those machines, which are also listed in the

View file

@ -52,7 +52,7 @@
}
.pcjs-progress {
height: 20px;
width: 300px;
width: 200px;
margin-top: 8px;
border: 1px solid black;
position: relative;
@ -66,7 +66,7 @@
}
.pcjs-progress-text {
height: 20px;
width: 300px;
width: 200px;
font-size: small;
line-height: 20px;
text-align: center;
@ -224,7 +224,7 @@
text-decoration: none;
}
@media screen and (max-width: 900px) {
@media screen and (max-width: 800px) {
.pcjs-textarea {
width: 100% !important;
}
@ -242,3 +242,13 @@
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

View file

@ -111,6 +111,7 @@ function SerialPort8080(parmsSerial) {
*/
this.fAutoXOFF = true;
this.fAutoStop = false;
this.fNullModem = true;
Component.call(this, "SerialPort", parmsSerial, SerialPort8080, Messages8080.SERIAL);
@ -128,14 +129,15 @@ function SerialPort8080(parmsSerial) {
* No connection until initConnection() is called.
*/
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'] = {
'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}",
* 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:
*
* 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
* 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.
*
* @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) {
var sConnection = this.cmp.getMachineParm("connection");
@ -500,9 +504,11 @@ SerialPort8080.prototype.initConnection = function()
var exports = this.connection['exports'];
if (exports) {
var fnConnect = exports['connect'];
if (fnConnect) fnConnect.call(this.connection);
if (fnConnect) fnConnect.call(this.connection, this.fNullModem);
this.sendData = exports['receiveData'];
if (this.sendData) {
this.fNullModem = fNullModem;
this.updateStatus = exports['receiveStatus'];
this.status(this.idMachine + '.' + sSourceID + " connected to " + sTargetID);
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
* in turn invoke our initConnection() again.
*/
this.initConnection();
this.initConnection(this.fNullModem);
if (!data || !this.restore) {
this.reset();
@ -713,6 +719,22 @@ SerialPort8080.prototype.receiveData = function(data)
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)
*
@ -865,6 +887,23 @@ SerialPort8080.prototype.outControl = function(port, bOut, addrFrom)
this.bMode = bOut;
this.fReady = true;
} 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;
if (this.bCommand & SerialPort8080.UART8251.COMMAND.INTERNAL_RESET) {
this.fReady = false;

View file

@ -245,7 +245,7 @@ Mouse.prototype.powerUp = function(data, fRepower)
var componentAdapter = null;
while ((componentAdapter = this.cmp.getMachineComponent(this.sAdapterType, componentAdapter))) {
if (componentAdapter.attachMouse) {
this.componentAdapter = componentAdapter.attachMouse(this.idAdapter, this);
this.componentAdapter = componentAdapter.attachMouse(this.idAdapter, this, this.receiveStatus);
if (this.componentAdapter) {
/*
* 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.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.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;
};
@ -372,7 +379,7 @@ Mouse.prototype.saveState = function()
data[i++] = this.yDelta;
data[i++] = this.fButton1;
data[i++] = this.fButton2;
data[i] = this.bMCR;
data[i] = this.pins;
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.
*
@ -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.
*
* @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 (!this.fActive) {
var fIdentify = false;
if (!(this.bMCR & SerialPort.MCR.RTS)) {
if (!(this.pins & RS232.RTS.MASK)) {
this.reset();
this.printMessage("serial mouse reset");
fIdentify = true;
}
if (!(this.bMCR & SerialPort.MCR.DTR)) {
if (!(this.pins & RS232.DTR.MASK)) {
this.printMessage("serial mouse ID requested");
fIdentify = true;
}
@ -704,7 +711,7 @@ Mouse.prototype.notifyMCR = function(bMCR)
this.setActive(fActive);
}
}
this.bMCR = bMCR;
this.pins = pins;
};
/**

View file

@ -122,6 +122,9 @@ function SerialPort(parmsSerial) {
this.charBOL = parmsSerial['charBOL'];
this.iLogicalCol = 0;
this.bMSRInit = SerialPort.MSR.CTS | SerialPort.MSR.DSR;
this.fNullModem = true;
Component.call(this, "SerialPort", parmsSerial, SerialPort, Messages.SERIAL);
var sBinding = parmsSerial['binding'];
@ -138,14 +141,15 @@ function SerialPort(parmsSerial) {
* No connection until initConnection() is called.
*/
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'] = {
'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};
/**
* attachMouse(id, mouse)
* attachMouse(id, mouse, fnUpdate)
*
* @this {SerialPort}
* @param {string} id
* @param {Mouse} mouse component
* @return {Component} this or null, based on whether or not the specified ID matches
* @param {Mouse} mouse
* @param {function(number)} fnUpdate
* @return {Component|null}
*/
SerialPort.prototype.attachMouse = function(id, mouse)
SerialPort.prototype.attachMouse = function(id, mouse, fnUpdate)
{
if (id == this.idComponent) {
this.mouse = mouse;
return this;
var component = null;
if (id == this.idComponent && !this.connection) {
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)
*
@ -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}",
* 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:
*
* 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
* 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.
*
* @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) {
var sConnection = this.cmp.getMachineParm("connection");
@ -505,9 +502,11 @@ SerialPort.prototype.initConnection = function()
var exports = this.connection['exports'];
if (exports) {
var fnConnect = exports['connect'];
if (fnConnect) fnConnect.call(this.connection);
if (fnConnect) fnConnect.call(this.connection, this.fNullModem);
this.sendData = exports['receiveData'];
if (this.sendData) {
this.fNullModem = fNullModem;
this.updateStatus = exports['receiveStatus'];
this.status(this.idMachine + '.' + sSourceID + " connected to " + sTargetID);
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
* in turn invoke our initConnection() again.
*/
this.initConnection();
this.initConnection(this.fNullModem);
if (!data || !this.restore) {
this.reset();
@ -628,7 +627,7 @@ SerialPort.prototype.initState = function(data)
0, // LCR
0, // MCR
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
};
/**
* 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()
*
@ -714,7 +736,7 @@ SerialPort.prototype.advanceRBR = function()
* inRBR(port, addrFrom)
*
* @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)
* @return {number} simulated port value
*/
@ -731,7 +753,7 @@ SerialPort.prototype.inRBR = function(port, addrFrom)
* inIER(port, addrFrom)
*
* @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)
* @return {number} simulated port value
*/
@ -746,7 +768,7 @@ SerialPort.prototype.inIER = function(port, addrFrom)
* inIIR(port, addrFrom)
*
* @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)
* @return {number} simulated port value
*/
@ -761,7 +783,7 @@ SerialPort.prototype.inIIR = function(port, addrFrom)
* inLCR(port, addrFrom)
*
* @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)
* @return {number} simulated port value
*/
@ -776,7 +798,7 @@ SerialPort.prototype.inLCR = function(port, addrFrom)
* inMCR(port, addrFrom)
*
* @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)
* @return {number} simulated port value
*/
@ -791,7 +813,7 @@ SerialPort.prototype.inMCR = function(port, addrFrom)
* inLSR(port, addrFrom)
*
* @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)
* @return {number} simulated port value
*/
@ -806,13 +828,14 @@ SerialPort.prototype.inLSR = function(port, addrFrom)
* inMSR(port, addrFrom)
*
* @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)
* @return {number} simulated port value
*/
SerialPort.prototype.inMSR = function(port, addrFrom)
{
var b = this.bMSR;
this.bMSR &= ~(SerialPort.MSR.DCTS | SerialPort.MSR.DDSR);
this.printMessageIO(port, null, addrFrom, "MSR", b);
return b;
};
@ -821,7 +844,7 @@ SerialPort.prototype.inMSR = function(port, addrFrom)
* outTHR(port, bOut, addrFrom)
*
* @this {SerialPort}
* @param {number} port (0x3F8 or 0x2F8)
* @param {number} port (eg, 0x3F8 or 0x2F8)
* @param {number} bOut
* @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)
*
* @this {SerialPort}
* @param {number} port (0x3F9 or 0x2F9)
* @param {number} port (eg, 0x3F9 or 0x2F9)
* @param {number} bOut
* @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)
*
* @this {SerialPort}
* @param {number} port (0x3FB or 0x2FB)
* @param {number} port (eg, 0x3FB or 0x2FB)
* @param {number} bOut
* @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)
*
* @this {SerialPort}
* @param {number} port (0x3FC or 0x2FC)
* @param {number} port (eg, 0x3FC or 0x2FC)
* @param {number} bOut
* @param {number} [addrFrom] (not defined whenever the Debugger tries to write the specified port)
*/
SerialPort.prototype.outMCR = function(port, bOut, addrFrom)
{
var bPrev = this.bMCR;
var delta = (bOut ^ this.bMCR);
this.printMessageIO(port, bOut, addrFrom, "MCR");
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)) {
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) {
this.bIIR &= ~(SerialPort.IIR.NO_INT | SerialPort.IIR.INT_BITS);
this.bIIR |= bIIR;

View file

@ -913,6 +913,55 @@ BusPDP11.prototype.getByte = function(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)
*
@ -943,23 +992,6 @@ BusPDP11.prototype.getByteDirect = function(addr)
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)
*
@ -985,18 +1017,6 @@ BusPDP11.prototype.getWordDirect = function(addr)
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)
*
@ -1014,25 +1034,6 @@ BusPDP11.prototype.setByteDirect = function(addr, b)
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)
*
@ -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).
*
* @this {BusPDP11}
* @param {Component} component
* @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)
*/
BusPDP11.prototype.addIOTable = function(component, table)
BusPDP11.prototype.addIOTable = function(component, table, offReg)
{
for (var port in table) {
var addr = +port;
var afn = table[port];
for (var reg in table) {
var addr = +reg + (offReg || 0);
var afn = table[reg];
/*
* Don't install (ie, ignore) handlers for I/O addresses that are defined with a model number

View file

@ -206,6 +206,17 @@ CPUPDP11.prototype.initBus = function(cmp, bus, cpu, dbg)
this.setReady();
};
/**
* finish()
*
* Stub for final initialization call (overridden by the CPUStatePDP11 component).
*
* @this {CPUPDP11}
*/
CPUPDP11.prototype.finish = function()
{
};
/**
* reset()
*
@ -255,6 +266,7 @@ CPUPDP11.prototype.restore = function(data)
CPUPDP11.prototype.powerUp = function(data, fRepower)
{
if (!fRepower) {
this.finish();
if (!data || !this.restore) {
this.reset();
} else {

View file

@ -875,7 +875,7 @@ PDP11.opBVS = 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));
};
@ -887,7 +887,7 @@ PDP11.opCLR = 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));
};
@ -1283,8 +1283,8 @@ PDP11.opMARK = function(opCode)
PDP11.opMFPD = function(opCode)
{
var data = this.readWordFromPrevSpace(opCode, PDP11.ACCESS.DSPACE);
this.pushWord(data);
this.updateNZVFlags(data);
this.pushWord(data);
this.nStepCycles -= (10 + 1);
};
@ -1297,8 +1297,8 @@ PDP11.opMFPD = function(opCode)
PDP11.opMFPI = function(opCode)
{
var data = this.readWordFromPrevSpace(opCode, PDP11.ACCESS.ISPACE);
this.pushWord(data);
this.updateNZVFlags(data);
this.pushWord(data);
this.nStepCycles -= (10 + 1);
};
@ -1346,7 +1346,7 @@ PDP11.opMOV = function(opCode)
*/
var data = this.readSrcWord(opCode);
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);
};
@ -1359,7 +1359,7 @@ PDP11.opMOV = function(opCode)
PDP11.opMOVB = function(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));
};
@ -1381,8 +1381,8 @@ PDP11.opMTPD = function(opCode)
*/
var data = this.popWord();
this.nSnapCycles = this.nStepCycles;
this.writeWordToPrevSpace(opCode, PDP11.ACCESS.DSPACE, data);
this.updateNZVFlags(data);
this.writeWordToPrevSpace(opCode, PDP11.ACCESS.DSPACE, data);
this.nStepCycles = this.nSnapCycles - PDP11.MTP_CYCLES[this.dstMode];
};
@ -1400,8 +1400,8 @@ PDP11.opMTPI = function(opCode)
*/
var data = this.popWord();
this.nSnapCycles = this.nStepCycles;
this.writeWordToPrevSpace(opCode, PDP11.ACCESS.ISPACE, data);
this.updateNZVFlags(data);
this.writeWordToPrevSpace(opCode, PDP11.ACCESS.ISPACE, data);
this.nStepCycles = this.nSnapCycles - PDP11.MTP_CYCLES[this.dstMode];
};
@ -1775,7 +1775,7 @@ PDP11.opSWAB = 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));
};

View file

@ -151,14 +151,33 @@ CPUStatePDP11.prototype.initProcessor = function()
/** @type {IRQ|null} */
this.irqNext = null; // the head of the active IRQ list, in priority order
if (DEBUG) {
/** @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;
};
/**
* 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()
*
@ -264,7 +283,7 @@ CPUStatePDP11.prototype.resetMMU = function()
this.regMMR1 = 0; // 177574
this.regMMR2 = 0; // 177576
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.regSL = 0xff; // 177774
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)
*
* @this {CPUStatePDP11}
* @param {number} vector
* @param {number} vector (-1 for floating vector)
* @param {number} priority
* @param {number} [message]
* @return {IRQ}
@ -782,10 +801,8 @@ CPUStatePDP11.prototype.setSP = function(addr)
CPUStatePDP11.prototype.addIRQ = function(vector, priority, message)
{
var irq = {vector: vector, priority: priority, message: message || 0, next: null};
if (DEBUG) {
irq.name = PDP11.VECTORS[vector];
this.aIRQs.push(irq);
}
return irq;
};
@ -1171,10 +1188,8 @@ CPUStatePDP11.prototype.setPIR = function(newPIR)
*/
CPUStatePDP11.prototype.updateNZVFlags = function(result)
{
if (!(this.opFlags & PDP11.OPFLAG.NO_FLAGS)) {
this.flagN = this.flagZ = result;
this.flagV = 0;
}
};
/**
@ -1187,10 +1202,8 @@ CPUStatePDP11.prototype.updateNZVFlags = function(result)
*/
CPUStatePDP11.prototype.updateNZVCFlags = function(result)
{
if (!(this.opFlags & PDP11.OPFLAG.NO_FLAGS)) {
this.flagN = this.flagZ = result;
this.flagV = this.flagC = 0;
}
};
/**
@ -1204,10 +1217,8 @@ CPUStatePDP11.prototype.updateNZVCFlags = function(result)
*/
CPUStatePDP11.prototype.updateAllFlags = function(result, overflow)
{
if (!(this.opFlags & PDP11.OPFLAG.NO_FLAGS)) {
this.flagN = this.flagZ = this.flagC = result;
this.flagV = overflow || 0;
}
};
/**
@ -1220,10 +1231,8 @@ CPUStatePDP11.prototype.updateAllFlags = function(result, overflow)
*/
CPUStatePDP11.prototype.updateAddFlags = function(result, src, dst)
{
if (!(this.opFlags & PDP11.OPFLAG.NO_FLAGS)) {
this.flagN = this.flagZ = this.flagC = result;
this.flagV = (src ^ result) & (dst ^ result);
}
};
/**
@ -1237,11 +1246,11 @@ CPUStatePDP11.prototype.updateAddFlags = function(result, src, dst)
*/
CPUStatePDP11.prototype.updateDecFlags = function(result, dst)
{
if (!(this.opFlags & PDP11.OPFLAG.NO_FLAGS)) {
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);
}
};
/**
@ -1255,11 +1264,11 @@ CPUStatePDP11.prototype.updateDecFlags = function(result, dst)
*/
CPUStatePDP11.prototype.updateIncFlags = function(result, dst)
{
if (!(this.opFlags & PDP11.OPFLAG.NO_FLAGS)) {
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);
}
};
/**
@ -1270,23 +1279,10 @@ CPUStatePDP11.prototype.updateIncFlags = function(result, dst)
*/
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.flagZ = this.flagN | result;
this.flagV = 0;
this.flagC = (result < -32768 || result > 32767)? 0x10000 : 0;
}
};
/**
@ -1297,10 +1293,8 @@ CPUStatePDP11.prototype.updateMulFlags = function(result)
*/
CPUStatePDP11.prototype.updateShiftFlags = function(result)
{
if (!(this.opFlags & PDP11.OPFLAG.NO_FLAGS)) {
this.flagN = this.flagZ = this.flagC = result;
this.flagV = this.flagN ^ (this.flagC >> 1);
}
};
/**
@ -1316,10 +1310,8 @@ CPUStatePDP11.prototype.updateShiftFlags = function(result)
*/
CPUStatePDP11.prototype.updateSubFlags = function(result, src, dst)
{
if (!(this.opFlags & PDP11.OPFLAG.NO_FLAGS)) {
this.flagN = this.flagZ = this.flagC = 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
}
var fRed = false;
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
* I'm not seeing any dependencies on these registers, so I'm consolidating the code.
*/
this.regErr |= PDP11.CPUERR.RED;
this.regsGen[6] = 4;
fRed = true;
this.regsGen[6] = vector = 4;
}
if (reason != PDP11.REASON.PANIC) {
/*
* 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,
@ -1389,9 +1383,10 @@ CPUStatePDP11.prototype.trap = function(vector, flag, reason)
*/
this.setPSW((newPSW & ~PDP11.PSW.PMODE) | ((this.trapPSW >> 2) & PDP11.PSW.PMODE));
this.pushWord(this.trapPSW, fRed);
this.pushWord(this.regsGen[7], fRed);
this.pushWord(this.trapPSW);
this.pushWord(this.regsGen[7]);
this.setPC(newPC);
}
/*
* 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.trapReason = reason;
if (reason == PDP11.REASON.PANIC) {
this.stopCPU();
}
if (reason >= PDP11.REASON.RED) throw vector;
};
@ -1773,18 +1771,17 @@ CPUStatePDP11.prototype.popWord = function()
};
/**
* pushWord(data, fRed)
* pushWord(data)
*
* @this {CPUStatePDP11}
* @param {number} data
* @param {boolean} [fRed]
*/
CPUStatePDP11.prototype.pushWord = function(data, fRed)
CPUStatePDP11.prototype.pushWord = function(data)
{
var addrVirtual = (this.regsGen[6] - 2) & 0xffff;
this.regsGen[6] = addrVirtual; // BSD needs SP updated before any fault :-(
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);
};
@ -2152,7 +2149,8 @@ CPUStatePDP11.prototype.readWordFromVirtual = function(addrVirtual)
CPUStatePDP11.prototype.writeWordToPhysical = function(addr, data)
{
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 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));
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.
*
@ -2420,9 +2414,9 @@ CPUStatePDP11.prototype.updateDstWord = function(opCode, data, fnOp)
* @param {number} opCode
* @param {number} data
* @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);
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);
this.regsGen[reg] = (this.regsGen[reg] & ~writeFlags) | (((data << 24) >> 24) & writeFlags);
}
fnFlags.call(this, data << 8);
} else {
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.
*
* @this {CPUStatePDP11}
* @param {number} opCode
* @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 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));
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 {
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 {
this.assert(!this.irqNext && !this.regPIR);
}
/*
* 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.

View file

@ -219,18 +219,20 @@ var PDP11 = {
* immediate (thrown) traps, as they are considered ABORTs; the rest generate synchronous traps.
*/
REASON: {
ABORT: -1, // immediate MMU fault
ILLEGAL: -2, // immediate invalid opcode (BUS)
RED: -3, // immediate stack overflow fault (BUS)
YELLOW: -4, // deferred stack overflow fault (BUS)
FAULT: -5, // deferred MMU fault
TRACE: -6, // deferred TF fault (BPT)
HALT: -7, // illegal HALT (BUS)
OPCODE: -8, // opcode-generated trap (eg, BPT, EMT, IOT, TRAP, or RESERVED opcode)
INTERRUPT: -9, // device-generated trap (vector is device-specific)
PANIC: -1, // immediate halt (internal error)
ABORT: -2, // immediate MMU fault
ILLEGAL: -3, // immediate invalid opcode (BUS)
RED: -4, // immediate stack overflow fault (BUS)
YELLOW: -5, // deferred stack overflow fault (BUS)
FAULT: -6, // deferred MMU fault
TRACE: -7, // deferred TF fault (BPT)
HALT: -8, // illegal HALT (BUS)
OPCODE: -9, // opcode-generated trap (eg, BPT, EMT, IOT, TRAP, or RESERVED opcode)
INTERRUPT: -10, // device-generated trap (vector is device-specific)
},
REASONS: [
"UNKNOWN",
"PANIC",
"ABORT",
"ILLEGAL",
"RED",
@ -271,7 +273,7 @@ var PDP11 = {
TRAP_MMU: 0x0040,
TRAP_MASK: 0x0070,
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)
@ -489,6 +491,8 @@ var PDP11 = {
RLMP: 0o174406, // RL11 Multi-Purpose Register
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
RKER: 0o177402, // RK11 Error Register
RKCS: 0o177404, // RK11 Control Status Register
@ -609,6 +613,7 @@ var PDP11 = {
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())
WMASK: 0x006F, // bits writable
RS232: 0x0006, // bits affecting RS-232 status updates
BAUD: 9600
},
RBUF: { // 177562: DL11 Receiver Data Buffer Register
@ -846,10 +851,10 @@ var PDP11 = {
}
},
VECTORS: {
0o060: "DL11.RCSR",
0o064: "DL11.XCSR",
0o070: "PC11.PRS",
0o074: "PC11.PPS",
0o060: "DL11R",
0o064: "DL11X",
0o070: "PC11R",
0o074: "PC11X",
0o100: "KW11",
0o160: "RL11",
0o220: "RK11"

View file

@ -1065,7 +1065,6 @@ DevicePDP11.prototype.writePSW = function(data, addr)
*/
var maskDisallowed = PDP11.PSW.UNUSED;
this.cpu.setPSW((data & ~maskDisallowed) | (this.cpu.getPSW() & maskDisallowed));
this.cpu.opFlags |= PDP11.OPFLAG.NO_FLAGS;
};
/**

View file

@ -713,15 +713,15 @@ PC11.prototype.parseTape = function(sTapeName, sTapePath, nTapeTarget, aBytes, a
this.sTapePath = "";
this.sTapeSource = PC11.SOURCE.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;
}
this.status("tape loaded: " + sTapeName);
this.status('Loaded tape "' + sTapeName + '"');
return;
}
this.iTapeData = 0;
this.aTapeData = aBytes;
this.status("tape attached: " + sTapeName);
this.status('Attached tape "' + sTapeName + '"');
this.displayProgress(0);
};

View file

@ -215,6 +215,8 @@ RAMPDP11.prototype.initRAM = function()
if (!this.fAllocated && this.sizeRAM) {
if (this.bus.addMemory(this.addrRAM, this.sizeRAM, MemoryPDP11.TYPE.RAM)) {
this.fAllocated = true;
} else {
this.sizeRAM = 0; // don't bother trying again (it just results in redundant error messages)
}
}
if (!this.isReady()) {

View file

@ -117,6 +117,7 @@ function SerialPortPDP11(parmsSerial) {
this.tabSize = parmsSerial['tabSize'];
this.charBOL = parmsSerial['charBOL'];
this.iLogicalCol = 0;
this.fNullModem = true;
Component.call(this, "SerialPort", parmsSerial, SerialPortPDP11, MessagesPDP11.SERIAL);
@ -134,14 +135,15 @@ function SerialPortPDP11(parmsSerial) {
* No connection until initConnection() is called.
*/
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'] = {
'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;
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() {
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() {
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));
this.setReady();
};
/**
* initConnection()
* initConnection(fNullModem)
*
* 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}".
@ -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:
*
* 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
* 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.
*
* @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) {
var sConnection = this.cmp.getMachineParm("connection");
@ -375,9 +379,11 @@ SerialPortPDP11.prototype.initConnection = function()
var exports = this.connection['exports'];
if (exports) {
var fnConnect = exports['connect'];
if (fnConnect) fnConnect.call(this.connection);
if (fnConnect) fnConnect.call(this.connection, this.fNullModem);
this.sendData = exports['receiveData'];
if (this.sendData) {
this.fNullModem = fNullModem;
this.updateStatus = exports['receiveStatus'];
this.status(this.idMachine + '.' + sSourceID + " connected to " + sTargetID);
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
* in turn invoke our initConnection() again.
*/
this.initConnection();
this.initConnection(this.fNullModem);
if (!data || !this.restore) {
this.reset();
@ -483,7 +489,7 @@ SerialPortPDP11.prototype.restore = function(data)
SerialPortPDP11.prototype.initState = function(data)
{
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.abReceive = [];
return true;
@ -592,6 +598,30 @@ SerialPortPDP11.prototype.receiveByte = function()
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)
*
@ -681,7 +711,9 @@ SerialPortPDP11.prototype.transmitByte = function(b)
*/
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)
{
var delta = (data ^ this.regRCSR);
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);
}
}
};
/**

View file

@ -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
/*
* 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)
*/
@ -82,6 +127,7 @@ if (NODE) {
global.DEBUG = DEBUG;
global.MAXDEBUG = MAXDEBUG;
global.PRIVATE = PRIVATE;
global.RS232 = RS232;
global.NODE = NODE;
/*
* TODO: When we're "required" by Node, should we return anything via module.exports?

View file

@ -57,7 +57,7 @@
}
.pcjs-progress {
height: 20px;
width: 300px;
width: 200px;
margin-top: 8px;
border: 1px solid black;
position: relative;
@ -71,7 +71,7 @@
}
.pcjs-progress-text {
height: 20px;
width: 300px;
width: 200px;
font-size: small;
line-height: 20px;
text-align: center;
@ -229,7 +229,7 @@
text-decoration: none;
}
@media screen and (max-width: 900px) {
@media screen and (max-width: 800px) {
.pcjs-textarea {
width: 100% !important;
}
@ -247,3 +247,13 @@
padding-right: 0 !important;
}
}
@media screen and (min-width: 1400px) {
.machine-left, .machine-right {
max-width: 45%;
float: left;
}
.machine-right + * {
clear: both;
}
}

View file

@ -52,7 +52,7 @@
}
.pcjs-progress {
height: 20px;
width: 300px;
width: 200px;
margin-top: 8px;
border: 1px solid black;
position: relative;
@ -66,7 +66,7 @@
}
.pcjs-progress-text {
height: 20px;
width: 300px;
width: 200px;
font-size: small;
line-height: 20px;
text-align: center;
@ -224,7 +224,7 @@
text-decoration: none;
}
@media screen and (max-width: 900px) {
@media screen and (max-width: 800px) {
.pcjs-textarea {
width: 100% !important;
}
@ -242,3 +242,13 @@
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

View file

@ -52,7 +52,7 @@
}
.pcjs-progress {
height: 20px;
width: 300px;
width: 200px;
margin-top: 8px;
border: 1px solid black;
position: relative;
@ -66,7 +66,7 @@
}
.pcjs-progress-text {
height: 20px;
width: 300px;
width: 200px;
font-size: small;
line-height: 20px;
text-align: center;
@ -224,7 +224,7 @@
text-decoration: none;
}
@media screen and (max-width: 900px) {
@media screen and (max-width: 800px) {
.pcjs-textarea {
width: 100% !important;
}
@ -242,3 +242,13 @@
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

View file

@ -52,7 +52,7 @@
}
.pcjs-progress {
height: 20px;
width: 300px;
width: 200px;
margin-top: 8px;
border: 1px solid black;
position: relative;
@ -66,7 +66,7 @@
}
.pcjs-progress-text {
height: 20px;
width: 300px;
width: 200px;
font-size: small;
line-height: 20px;
text-align: center;
@ -224,7 +224,7 @@
text-decoration: none;
}
@media screen and (max-width: 900px) {
@media screen and (max-width: 800px) {
.pcjs-textarea {
width: 100% !important;
}
@ -242,3 +242,13 @@
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