Merge branch 'next-release'

This commit is contained in:
Jeff Parsons 2016-10-23 13:55:00 -07:00
commit ea1c213534
16 changed files with 1968 additions and 287 deletions

View file

@ -72,3 +72,14 @@ available as paper tape image files, with the exception of PAL-11S and LINK-11S:
- [DEC-11-AJPB-PB BASIC-11 v007A SA=16104 RA=0](basic/DEC-11-AJPB-PB.json)
Some additional information on DEC's Paper Tape Software is available at [retrotechnology.com](http://retrotechnology.com/pdp11/11_20_PTS.html).
Newer Paper Tape Software (mid-1970s)
-------------------------------------
Thanks to the efforts of person(s) unknown, additional paper tape images have been uploaded to
[bitsavers.org](http://bitsavers.trailing-edge.com/bits/DEC/pdp11/papertapeimages/). It's not super organized, so for now,
I'm just going to pick out selected tapes, archive them [here](misc/), and add them to the [Default PC11 Configuration](/devices/pdp11/pc11/).
Try this [PDP-11/70](/devices/pdp11/machine/1170/panel/debugger/) to test the newer tapes.
- [MAINDEC-11-DEQKC-B1-PB 06/12/78; 11/70 cpu instruction; exerciser; (c)1975,76](misc/MAINDEC-11-DEQKC-B1-PB.json)

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,12 @@
---
layout: page
title: Miscellaneous Paper Tape Images
permalink: /apps/pdp11/tapes/misc/
---
Miscellaneous Paper Tape Images
-------------------------------
From [bitsavers.org](http://bitsavers.trailing-edge.com/bits/DEC/pdp11/papertapeimages/20040101/), Tray 02:
- Tape 04: [MAINDEC-11-DEQKC-B1-PB 06/12/78; 11/70 cpu instruction; exerciser; (c)1975,76](MAINDEC-11-DEQKC-B1-PB.json)

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pdpjs/1.30.2/machine.xsl"?>
<machine id="test1120" class="pdp11" border="1" pos="center" background="#FAEBD7">
<name pos="center">PDP-11/20: 16Kb, DEC BASIC, Debugger</name>
<name pos="center">PDP-11/20: 16Kb, PDP-11 BASIC, Debugger</name>
<computer id="computer" busWidth="16"/>
<cpu id="cpu" model="1120" cycles="6666667"/>
<ram id="ram" addr="0x0000" size="0x4000" file="/apps/pdp11/tapes/basic/DEC-11-AJPB-PB.json"/>

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pdpjs/1.30.2/machine.xsl"?>
<machine id="test1120" class="pdp11" border="1" pos="center" background="#FAEBD7">
<name pos="center">PDP-11/20: 16Kb, DEC BASIC</name>
<name pos="center">PDP-11/20: 16Kb, PDP-11 BASIC</name>
<computer id="computer" busWidth="16"/>
<cpu id="cpu" model="1120" cycles="6666667"/>
<ram id="ram" addr="0x0000" size="0x4000" file="/apps/pdp11/tapes/basic/DEC-11-AJPB-PB.json"/>

View file

@ -7,7 +7,8 @@
<ram id="ram" addr="0x0000" size="0xE000" file="/apps/pdp11/boot/test/BOOTTEST.json"/>
<ram id="ram" addr="0x10000" size="0x34000"/>
<device id="default" type="default"/>
<serial id="dl11" adapter="0" binding="print"/>
<serial id="dl11" adapter="0" binding="print" upperCase="true"/>
<panel ref="/devices/pdp11/panel/1170/debugger/front.xml"/>
<debugger id="debugger" base="8" messages="" commands=""/>
<device ref="/devices/pdp11/pc11/default.xml"/>
</machine>

View file

@ -7,6 +7,7 @@
<ram id="ram" addr="0x0000" size="0xE000" file="/apps/pdp11/boot/test/BOOTTEST.json"/>
<ram id="ram" addr="0x10000" size="0x34000"/>
<device id="default" type="default"/>
<serial id="dl11" adapter="0" binding="print"/>
<serial id="dl11" adapter="0" binding="print" upperCase="true"/>
<panel ref="/devices/pdp11/panel/1170/front.xml"/>
<device ref="/devices/pdp11/pc11/default.xml"/>
</machine>

View file

@ -30,6 +30,7 @@
<tape id="tape24" name="DUMPTT SA=XX7440 RA=XX7440" path="/apps/pdp11/tapes/dumptt/DEC-11-Y1PA-PO.json"/>
<tape id="tape25" name="DUMPTT SA=XXXXXX RA=XXXXXX" path="/apps/pdp11/tapes/dumptt/DEC-11-Y1PA-PB.json"/>
<tape id="tape26" name="DUMPAB SA=XXXXXX RA=XXXXXX" path="/apps/pdp11/tapes/dumpab/DEC-11-Y2PA-PB.json"/>
<tape id="tray02.tape04" name="11/70 CPU EXERCISER" path="/apps/pdp11/tapes/misc/MAINDEC-11-DEQKC-B1-PB.json"/>
</control>
<control type="button" binding="attachTape">Attach</control>
<control type="button" binding="loadTape">Load</control>

View file

@ -1405,7 +1405,7 @@ Computer8080.prototype.getMachineComponent = function(sType, componentPrev)
* where the display is more constrained, so we no longer do it by default (fScroll must be true).
*
* @this {Computer8080}
* @param {boolean} [fScroll]
* @param {boolean} [fScroll] (true if you really want the control scrolled into view)
*/
Computer8080.prototype.updateFocus = function(fScroll)
{

View file

@ -1432,7 +1432,8 @@ Computer.prototype.getMachineComponent = function(sType, componentPrev)
* updateFocus(fScroll)
*
* NOTE: When soft keyboard buttons call us to return focus to the machine (and away from the button),
* the scroll feature has annoying effect on iOS, so we no longer do it by default (fScroll must be true).
* the browser's default behavior is to scroll the element into view, which can be annoying, especially on iOS,
* where the display is more constrained, so we no longer do it by default (fScroll must be true).
*
* @this {Computer}
* @param {boolean} [fScroll] (true if you really want the control scrolled into view)
@ -1450,10 +1451,12 @@ Computer.prototype.updateFocus = function(fScroll)
x = window.scrollX;
y = window.scrollY;
}
/*
* TODO: We need a mechanism to determine the "active" display, instead of hard-coding this to aVideo[0].
*/
this.aVideo[0].setFocus();
if (!fScroll && window) {
window.scrollTo(x, y);
}

View file

@ -1168,9 +1168,11 @@ CPUPDP11.prototype.stepCPU = function(nMinCycles)
*
* @this {CPUPDP11}
* @param {boolean} [fComplete]
* @return {boolean} true if the CPU was stopped, false if it was already stopped
*/
CPUPDP11.prototype.stopCPU = function(fComplete)
{
var fStopped = false;
if (this.flags.running) {
this.endBurst();
this.addCycles(this.nRunCycles);
@ -1181,8 +1183,10 @@ CPUPDP11.prototype.stopCPU = function(fComplete)
if (this.cmp) {
this.cmp.stop(usr.getTime(), this.getCycles());
}
fStopped = true;
}
this.flags.complete = fComplete;
return fStopped;
};
/**

View file

@ -246,7 +246,7 @@ CPUStatePDP11.prototype.resetRegs = function()
this.mmuMask = 0x3ffff;
this.mmuMemorySize = BusPDP11.IOPAGE_18BIT;
this.opFlags |= PDP11.OPFLAG.INTQ;
this.resetTriggers();
if (this.bus) this.setMemoryAccess();
};
@ -383,10 +383,15 @@ CPUStatePDP11.prototype.setReset = function(addr, fReset)
this.setPC(addr);
if (!fReset && this.dbg) {
/*
* TODO: Review the decision to always stop the CPU if the Debugger is loaded.
* TODO: Review the decision to always stop the CPU if the Debugger is loaded. Note that
* when stopCPU() stops a running CPU, the Debugger gets notified, so again, no need to notify it here.
*
* TODO: There are more serious problems to deal with if another component is slamming a new PC down
* the CPU's throat (presumably while also dropping some new code into RAM) while the CPU was still running;
* we should probably force a complete reset if the CPU is running, but for now, it's up to the user
* to hit the reset button themselves.
*/
this.stopCPU();
this.dbg.updateStatus();
if (!this.stopCPU()) this.dbg.updateStatus();
}
};
@ -765,12 +770,25 @@ CPUStatePDP11.prototype.checkTriggers = function(priority)
};
/**
* checkInterrupts()
* resetTriggers(priority)
*
* @this {CPUStatePDP11}
*/
CPUStatePDP11.prototype.resetTriggers = function()
{
this.triggerNext = null;
};
/**
* checkInterrupts()
*
* @this {CPUStatePDP11}
* @return {boolean} true if an interrupt was dispatched, false if not
*/
CPUStatePDP11.prototype.checkInterrupts = function()
{
var fInterrupt = false;
if (this.opFlags & PDP11.OPFLAG.INTQ) {
this.opFlags &= ~PDP11.OPFLAG.INTQ;
@ -785,6 +803,7 @@ CPUStatePDP11.prototype.checkInterrupts = function()
if (this.dispatchInterrupt(vector, priority)) {
if (trigger) this.removeTrigger(trigger);
fInterrupt = true;
}
}
else if (this.opFlags & PDP11.OPFLAG.INTQ_SPL) {
@ -794,6 +813,7 @@ CPUStatePDP11.prototype.checkInterrupts = function()
*/
this.opFlags++;
}
return fInterrupt;
};
/**
@ -879,7 +899,7 @@ CPUStatePDP11.prototype.setPSW = function(newPSW)
this.regPSW = newPSW;
/*
* Trigger a call to checkInterrupts(), just in case.
* Trigger (no pun intended) a call to checkInterrupts(), just in case.
*
* TODO: I think this is overdone; if you set a breakpoint on checkInterrupts(), you'll see that a significant
* percentage of calls do nothing. For example, you'll usually see a spurious checkInterrupts() immediately after
@ -2050,7 +2070,11 @@ CPUStatePDP11.prototype.writeDstWord = function(opCode, data)
CPUStatePDP11.prototype.branch = function(opCode, condition)
{
if (condition) {
this.setPC(this.getPC() + ((opCode << 24) >> 23));
var off = ((opCode << 24) >> 23);
if (DEBUG && DEBUGGER && this.dbg && off == -2) {
this.dbg.stopInstruction("branch to self");
}
this.setPC(this.getPC() + off);
this.nStepCycles -= 2;
}
this.nStepCycles -= (2 + 1);
@ -2117,7 +2141,7 @@ CPUStatePDP11.prototype.stepCPU = function(nMinCycles)
this.stopCPU();
break;
}
nDebugState = 1;
if (!nDebugState) nDebugState++;
nDebugCheck++;
}
@ -2150,7 +2174,14 @@ CPUStatePDP11.prototype.stepCPU = function(nMinCycles)
* interrupting the natural flow of instructions whenever the Debugger is stepping through code.
*/
if ((this.opFlags & (PDP11.OPFLAG.INTQ_SPL | PDP11.OPFLAG.INTQ | PDP11.OPFLAG.WAIT)) /*&& nMinCycles*/) {
this.checkInterrupts();
if (this.checkInterrupts()) {
/*
* Since an interrupt was just dispatched, altering the normal flow of time and changing
* the future as we knew it, let's break out immediately if we're single-stepping, so that
* the Debugger gets to see the first instruction of the interrupt handler.
*/
if (nDebugState < 0) break;
}
}
}

View file

@ -1596,6 +1596,7 @@ if (DEBUGGER) {
this.updateStatus(true);
this.setFocus();
this.clearTempBreakpoint(this.cpu.getPC());
this.sMessagePrev = null;
}
};
@ -1679,18 +1680,20 @@ if (DEBUGGER) {
};
/**
* stopInstruction()
* stopInstruction(sMessage)
*
* TODO: Currently, the only way to prevent this call from stopping the CPU is when you're single-stepping.
*
* @this {DebuggerPDP11}
* @param {string} [sMessage]
* @return {boolean} true if stopping is enabled, false if not
*/
DebuggerPDP11.prototype.stopInstruction = function()
DebuggerPDP11.prototype.stopInstruction = function(sMessage)
{
var cpu = this.cpu;
if (cpu.isRunning()) {
cpu.setPC(this.cpu.getLastPC());
if (sMessage) this.println(sMessage);
this.stopCPU();
/*
* TODO: Review the appropriate-ness of throwing a bogus vector number in order to immediately stop

View file

@ -82,6 +82,13 @@ function PC11(parms)
this.sTapeSource = PC11.SOURCE.NONE;
this.nTapeTarget = PC11.TARGET.NONE;
this.sTapeName = this.sTapePath = "";
/*
* These next few variables simply keep track of the previous parameters to parseTape(),
* so that we can easily reparse the previous tape as needed.
*/
this.aBytes = this.addrLoad = this.addrExec = null;
this.nLastPercent = -1; // ensure the first displayProgress() displays something
/*
@ -447,7 +454,15 @@ PC11.prototype.loadTape = function(sTapeName, sTapePath, nTapeTarget, fAutoMount
}
}
}
if (nResult) this.status(this.nTapeTarget == PC11.TARGET.READER? "tape attached" : "tape loaded");
if (nResult) {
/*
* Now that we're calling parseTape() again (so that the current tape can either be restarted on
* the reader or reloaded into RAM), we can also rely on it to display an appropriate status message, too.
*
* this.status(this.nTapeTarget == PC11.TARGET.READER? "tape attached" : "tape loaded");
*/
this.parseTape(this.sTapeName, this.sTapePath, this.nTapeTarget, this.aBytes, this.addrLoad, this.addrExec);
}
return nResult;
};
@ -674,6 +689,9 @@ PC11.prototype.parseTape = function(sTapeName, sTapePath, nTapeTarget, aBytes, a
this.sTapeName = sTapeName;
this.sTapePath = sTapePath;
this.nTapeTarget = nTapeTarget;
this.aBytes = aBytes;
this.addrLoad = addrLoad;
this.addrExec = addrExec;
if (nTapeTarget == PC11.TARGET.MEMORY) {
/*

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long