Merge branch 'next-release'
This commit is contained in:
commit
ea1c213534
16 changed files with 1968 additions and 287 deletions
|
|
@ -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)
|
||||
|
|
|
|||
1596
apps/pdp11/tapes/misc/MAINDEC-11-DEQKC-B1-PB.json
Normal file
1596
apps/pdp11/tapes/misc/MAINDEC-11-DEQKC-B1-PB.json
Normal file
File diff suppressed because it is too large
Load diff
12
apps/pdp11/tapes/misc/README.md
Normal file
12
apps/pdp11/tapes/misc/README.md
Normal 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)
|
||||
|
|
@ -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"/>
|
||||
|
|
|
|||
|
|
@ -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"/>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
Loading…
Reference in a new issue