Paper tape punch definitions, and publication updates

This commit is contained in:
Jeff Parsons 2017-02-03 16:19:14 -08:00 committed by Jeff Parsons
commit c92b1521f3
9 changed files with 84 additions and 37 deletions

View file

@ -665,7 +665,7 @@ var PDP11 = {
PVEC: 0o074, // punch vector
PRS: { // 177550: PC11 (and PR11) Reader Status Register
RE: 0x0001, // Reader Enable (W/O)
RIE: 0x0040, // Reader Interrupt Enable (allows the DONE and ERROR bits to trigger an interrupt)
IE: 0x0040, // Reader Interrupt Enable (allows the DONE and ERROR bits to trigger an interrupt)
DONE: 0x0080, // Done (R/O)
BUSY: 0x0800, // Busy (R/O)
ERROR: 0x8000, // Error (R/O)
@ -678,15 +678,14 @@ var PDP11 = {
MASK: 0x00FF // Data
},
PPS: { // 177554: PC11 Punch Status Register
/*
* TODO: Flesh this out if/when we add Paper Tape Punch support
*/
IE: 0x0040, // Interrupt Enable
RDY: 0x0080, // Ready
ERROR: 0x8000, // Error (eg, no tape in punch, or punch has no power)
WMASK: 0x0040, // bits writable
BAUD: 600
},
PPB: { // 177556: PC11 Punch Buffer Register
/*
* TODO: Flesh this out if/when we add Paper Tape Punch support
*/
MASK: 0x00FF // Data
}
},
RK11: { // RK11 Disk Controller

View file

@ -76,10 +76,12 @@ class PC11 extends Component {
this.cAutoMount = 0;
this.nBaudReceive = +parms['baudReceive'] || PDP11.PC11.PRS.BAUD;
this.regPRS = 0; // PRS register
this.regPRB = 0; // PRB register
this.iTapeData = 0; // buffer index
this.aTapeData = []; // buffer for the PRB register
this.regPRS = 0; // PRS register
this.regPRB = 0; // PRB register
this.regPPS = PDP11.PC11.PPS.ERROR; // PPS register (TODO: signals an error until we implement the punch)
this.regPPB = 0; // PPB register
this.iTapeData = 0; // buffer index
this.aTapeData = []; // buffer for the PRB register
this.sTapeSource = PC11.SOURCE.NONE;
this.nTapeTarget = PC11.TARGET.NONE;
this.sTapeName = this.sTapePath = "";
@ -824,7 +826,7 @@ class PC11 extends Component {
this.displayProgress(this.iTapeData / this.aTapeData.length * 100);
this.regPRS |= PDP11.PC11.PRS.DONE;
this.regPRS &= ~PDP11.PC11.PRS.BUSY;
if (this.regPRS & PDP11.PC11.PRS.RIE) {
if (this.regPRS & PDP11.PC11.PRS.IE) {
this.cpu.setIRQ(this.irqReader);
}
}
@ -868,7 +870,7 @@ class PC11 extends Component {
*/
if (this.regPRS & PDP11.PC11.PRS.ERROR) {
data &= ~PDP11.PC11.PRS.RE;
if (this.regPRS & PDP11.PC11.PRS.RIE) {
if (this.regPRS & PDP11.PC11.PRS.IE) {
this.cpu.setIRQ(this.irqReader);
}
} else {
@ -914,6 +916,63 @@ class PC11 extends Component {
writePRB(data, addr)
{
}
/**
* readPPS(addr)
*
* @this {PC11}
* @param {number} addr (eg, PDP11.UNIBUS.PPS or 177554)
* @return {number}
*/
readPPS(addr)
{
return this.regPPS;
}
/**
* writePPS(data, addr)
*
* NOTE: This was originally added ONLY because when RT-11 v4.0 copies from device "PC:" (the paper tape reader),
* it executes the following code:
*
* 016010: 005037 177550 CLR @#177550 ;history=2 PRS
* 016014: 005037 177554 CLR @#177554 ;history=1
*
* and as you can see, without this PPS handler, a TRAP to 4 would normally occur. I guess since we claim to be
* a PC11, that makes sense. But what about PDP-11 machines with only a PR11 (ie, a reader-only unit)?
*
* @this {PC11}
* @param {number} data
* @param {number} addr (eg, PDP11.UNIBUS.PPS or 177554)
*/
writePPS(data, addr)
{
this.regPPS = (this.regPPS & ~PDP11.PC11.PPS.WMASK) | (data & PDP11.PC11.PPS.WMASK);
}
/**
* readPPB(addr)
*
* @this {PC11}
* @param {number} addr (eg, PDP11.UNIBUS.PPB or 177556)
* @return {number}
*/
readPPB(addr)
{
return this.regPPB;
}
/**
* writePPB(data, addr)
*
* @this {PC11}
* @param {number} data
* @param {number} addr (eg, PDP11.UNIBUS.PPB or 177556)
*/
writePPB(data, addr)
{
this.regPPB = (this.regPPB & ~PDP11.PC11.PPB.WMASK) | (data & PDP11.PC11.PPB.WMASK);
}
}
/*
@ -944,7 +1003,9 @@ PC11.CSSCLASS = {
*/
PC11.UNIBUS_IOTABLE = {
[PDP11.UNIBUS.PRS]: /* 177550 */ [null, null, PC11.prototype.readPRS, PC11.prototype.writePRS, "PRS"],
[PDP11.UNIBUS.PRB]: /* 177552 */ [null, null, PC11.prototype.readPRB, PC11.prototype.writePRB, "PRB"]
[PDP11.UNIBUS.PRB]: /* 177552 */ [null, null, PC11.prototype.readPRB, PC11.prototype.writePRB, "PRB"],
[PDP11.UNIBUS.PPS]: /* 177554 */ [null, null, PC11.prototype.readPPS, PC11.prototype.writePPS, "PPS"],
[PDP11.UNIBUS.PPB]: /* 177556 */ [null, null, PC11.prototype.readPPB, PC11.prototype.writePPB, "PPB"]
};
if (NODE) module.exports = PC11;