Added KW11 interface (and LKS register) definitions

This commit is contained in:
Jeff 2016-09-26 12:36:36 -07:00 committed by Jeff Parsons
commit 1e1388b9ca
4 changed files with 474 additions and 429 deletions

View file

@ -302,55 +302,6 @@ var PDP11 = {
* For more details: https://github.com/google/closure-compiler/wiki/ECMAScript6
*/
UNIBUS: { //16-bit 18-bit 22-bit Hex Description
PSW: 0o177776, // 777776 17777776 0x3FFFFE Processor Status Word
SL: 0o177774, // Stack Limit Register
PIR: 0o177772, // Program Interrupt Request
MB: 0o177770, // Microprogram break (11/70 only?)
CPUERR: 0o177766, // CPU error (11/70 only?)
SYSID: 0o177764, // System ID Register (11/70 only?)
SIZE_HI: 0o177762, // Upper Size Register (always zero) (11/70 only?)
SIZE_LO: 0o177760, // Lower Size Register (last 32-word block) (11/70 only?)
DISPLAY: 0o177570, // Console Switch and Display
XBUF: 0o177566, // Console Terminal: Transmitter Data Buffer Register
XCSR: 0o177564, // Console Terminal: Transmitter Status Register
RBUF: 0o177562, // Console Terminal: Receiver Data Buffer Register
RCSR: 0o177560, // Console Terminal: Receiver Status Register
MMR0: 0o177572, // 777572 17777572
MMR1: 0o177574, // 777574 17777574
MMR2: 0o177576, // 777576 17777576
MMR3: 0o172516, // 772516 17772516
UISDR0: 0o177600, // User I Space Descriptor Register 0
UISDR1: 0o177602, // User I Space Descriptor Register 1
UISDR2: 0o177604, // User I Space Descriptor Register 2
UISDR3: 0o177606, // User I Space Descriptor Register 3
UISDR4: 0o177610, // User I Space Descriptor Register 4
UISDR5: 0o177612, // User I Space Descriptor Register 5
UISDR6: 0o177614, // User I Space Descriptor Register 6
UISDR7: 0o177616, // User I Space Descriptor Register 7
UDSDR0: 0o177620, // User D Space Descriptor Register 0
UDSDR1: 0o177622, // User D Space Descriptor Register 1
UDSDR2: 0o177624, // User D Space Descriptor Register 2
UDSDR3: 0o177626, // User D Space Descriptor Register 3
UDSDR4: 0o177630, // User D Space Descriptor Register 4
UDSDR5: 0o177632, // User D Space Descriptor Register 5
UDSDR6: 0o177634, // User D Space Descriptor Register 6
UDSDR7: 0o177636, // User D Space Descriptor Register 7
UISAR0: 0o177640, // User I Space Address Register 0
UISAR1: 0o177642, // User I Space Address Register 1
UISAR2: 0o177644, // User I Space Address Register 2
UISAR3: 0o177646, // User I Space Address Register 3
UISAR4: 0o177650, // User I Space Address Register 4
UISAR5: 0o177652, // User I Space Address Register 5
UISAR6: 0o177654, // User I Space Address Register 6
UISAR7: 0o177656, // User I Space Address Register 7
UDSAR0: 0o177660, // User D Space Address Register 0
UDSAR1: 0o177662, // User D Space Address Register 1
UDSAR2: 0o177664, // User D Space Address Register 2
UDSAR3: 0o177666, // User D Space Address Register 3
UDSAR4: 0o177670, // User D Space Address Register 4
UDSAR5: 0o177672, // User D Space Address Register 5
UDSAR6: 0o177674, // User D Space Address Register 6
UDSAR7: 0o177676, // User D Space Address Register 7
SISDR0: 0o172200, // Supervisor I Space Descriptor Register 0
SISDR1: 0o172202, // Supervisor I Space Descriptor Register 1
SISDR2: 0o172204, // Supervisor I Space Descriptor Register 2
@ -415,8 +366,63 @@ var PDP11 = {
KDSAR5: 0o172372, // Kernel D Space Address Register 5
KDSAR6: 0o172374, // Kernel D Space Address Register 6
KDSAR7: 0o172376, // Kernel D Space Address Register 7
MMR3: 0o172516, // 772516 17772516
XBUF: 0o177566, // Console Terminal: Transmitter Data Buffer Register
XCSR: 0o177564, // Console Terminal: Transmitter Status Register
RBUF: 0o177562, // Console Terminal: Receiver Data Buffer Register
RCSR: 0o177560, // Console Terminal: Receiver Status Register
LKS: 0o177546, // KW11-L Clock Status
DISPLAY: 0o177570, // Console Switch and Display
MMR0: 0o177572, // 777572 17777572
MMR1: 0o177574, // 777574 17777574
MMR2: 0o177576, // 777576 17777576
UISDR0: 0o177600, // User I Space Descriptor Register 0
UISDR1: 0o177602, // User I Space Descriptor Register 1
UISDR2: 0o177604, // User I Space Descriptor Register 2
UISDR3: 0o177606, // User I Space Descriptor Register 3
UISDR4: 0o177610, // User I Space Descriptor Register 4
UISDR5: 0o177612, // User I Space Descriptor Register 5
UISDR6: 0o177614, // User I Space Descriptor Register 6
UISDR7: 0o177616, // User I Space Descriptor Register 7
UDSDR0: 0o177620, // User D Space Descriptor Register 0
UDSDR1: 0o177622, // User D Space Descriptor Register 1
UDSDR2: 0o177624, // User D Space Descriptor Register 2
UDSDR3: 0o177626, // User D Space Descriptor Register 3
UDSDR4: 0o177630, // User D Space Descriptor Register 4
UDSDR5: 0o177632, // User D Space Descriptor Register 5
UDSDR6: 0o177634, // User D Space Descriptor Register 6
UDSDR7: 0o177636, // User D Space Descriptor Register 7
UISAR0: 0o177640, // User I Space Address Register 0
UISAR1: 0o177642, // User I Space Address Register 1
UISAR2: 0o177644, // User I Space Address Register 2
UISAR3: 0o177646, // User I Space Address Register 3
UISAR4: 0o177650, // User I Space Address Register 4
UISAR5: 0o177652, // User I Space Address Register 5
UISAR6: 0o177654, // User I Space Address Register 6
UISAR7: 0o177656, // User I Space Address Register 7
UDSAR0: 0o177660, // User D Space Address Register 0
UDSAR1: 0o177662, // User D Space Address Register 1
UDSAR2: 0o177664, // User D Space Address Register 2
UDSAR3: 0o177666, // User D Space Address Register 3
UDSAR4: 0o177670, // User D Space Address Register 4
UDSAR5: 0o177672, // User D Space Address Register 5
UDSAR6: 0o177674, // User D Space Address Register 6
UDSAR7: 0o177676, // User D Space Address Register 7
SIZE_LO: 0o177760, // Lower Size Register (last 32-word block) (11/70 only?)
SIZE_HI: 0o177762, // Upper Size Register (always zero) (11/70 only?)
SYSID: 0o177764, // System ID Register (11/70 only?)
CPUERR: 0o177766, // CPU error (11/70 only?)
MB: 0o177770, // Microprogram break (11/70 only?)
PIR: 0o177772, // Program Interrupt Request
SL: 0o177774, // Stack Limit Register
PSW: 0o177776 // 777776 17777776 0x3FFFFE Processor Status Word
},
DL11: {
DL11: { // SERIAL LINE INTERFACE
DELAY: 8,
PRI: 4,
VEC: 0o64,
@ -426,6 +432,15 @@ var PDP11 = {
MAINT: 0x04, // Maintenance (read-write)
BREAK: 0x01 // BREAK (read-write)
}
},
KW11: { // KW11-L LINE TIME CLOCK
DELAY: 0,
PRI: 6,
VEC: 0o100,
LKS: {
INT_ENABLE: 0x40,
MONITOR: 0x80
}
}
};

View file

@ -201,36 +201,43 @@ DevicePDP11.prototype.initBus = function(cmp, bus, cpu, dbg)
};
/**
* readPSW(addr)
* readLKS(addr)
*
* @this {DevicePDP11}
* @param {number} addr (eg, 177776)
* @param {number} addr (eg, PDP11.UNIBUS.LKS or 177546)
* @return {number}
*/
DevicePDP11.prototype.readPSW = function(addr)
DevicePDP11.prototype.readLKS = function(addr)
{
return this.cpu.getPSW();
var result = this.kw11.lks;
this.kw11.lks &= ~PDP11.KW11.LKS.MONITOR;
return result;
};
/**
* writePSW(data, addr)
* writeLKS(data, addr)
*
* @this {DevicePDP11}
* @param {number} data
* @param {number} addr (eg, 177776)
* @param {number} addr (eg, PDP11.UNIBUS.LKS or 177546)
*/
DevicePDP11.prototype.writePSW = function(data, addr)
DevicePDP11.prototype.writeLKS = function(data, addr)
{
var maskDisallowed = PDP11.PSW.UNUSED | PDP11.PSW.TF;
this.cpu.setPSW((data & ~maskDisallowed) | (this.cpu.getPSW() & maskDisallowed));
this.cpu.opFlags |= PDP11.OPFLAG.SKIP_FLAGS;
this.kw11.lks = data;
if (data & PDP11.KW11.LKS.INT_ENABLE) {
if (!this.kw11.init) {
setInterval(this.kw11_interrupt.bind(this), 25);
this.kw11.init = 1;
}
}
this.kw11.lks = data & ~PDP11.KW11.LKS.MONITOR;
};
/**
* readXCSR(addr)
*
* @this {DevicePDP11}
* @param {number} addr (eg, 177564)
* @param {number} addr (eg, PDP11.UNIBUS.XCSR or 177564)
* @return {number}
*/
DevicePDP11.prototype.readXCSR = function(addr)
@ -243,7 +250,7 @@ DevicePDP11.prototype.readXCSR = function(addr)
*
* @this {DevicePDP11}
* @param {number} data
* @param {number} addr (eg, 177564)
* @param {number} addr (eg, PDP11.UNIBUS.XCSR or 177564)
*/
DevicePDP11.prototype.writeXCSR = function(data, addr)
{
@ -263,6 +270,32 @@ DevicePDP11.prototype.writeXCSR = function(data, addr)
this.tty.xcsr = (this.tty.xcsr & PDP11.DL11.XCSR.READY) | (data & ~PDP11.DL11.XCSR.READY);
};
/**
* readPSW(addr)
*
* @this {DevicePDP11}
* @param {number} addr (eg, PDP11.UNIBUS.PSW or 177776)
* @return {number}
*/
DevicePDP11.prototype.readPSW = function(addr)
{
return this.cpu.getPSW();
};
/**
* writePSW(data, addr)
*
* @this {DevicePDP11}
* @param {number} data
* @param {number} addr (eg, PDP11.UNIBUS.PSW or 177776)
*/
DevicePDP11.prototype.writePSW = function(data, addr)
{
var maskDisallowed = PDP11.PSW.UNUSED | PDP11.PSW.TF;
this.cpu.setPSW((data & ~maskDisallowed) | (this.cpu.getPSW() & maskDisallowed));
this.cpu.opFlags |= PDP11.OPFLAG.SKIP_FLAGS;
};
/**
* rk11_go()
*
@ -645,9 +678,9 @@ DevicePDP11.prototype.rp11_end = function(err, meta, block, address, count)
*/
DevicePDP11.prototype.kw11_interrupt = function()
{
this.kw11.csr |= 0x80;
if (this.kw11.csr & 0x40) {
this.cpu.interrupt(0, 6, 0x40 /*0100*/);
this.kw11.lks |= PDP11.KW11.LKS.MONITOR;
if (this.kw11.lks & PDP11.KW11.LKS.INT_ENABLE) {
this.cpu.interrupt(PDP11.KW11.DELAY, PDP11.KW11.PRI, PDP11.KW11.VEC);
}
};
@ -734,9 +767,9 @@ DevicePDP11.prototype.insertData = function(original, physicalAddress, data, byt
if (physicalAddress & 1) {
if (!byteFlag) {
//log.push("TRAP 4 201 " + physicalAddress.toString(8) + " " + data.toString(8));
return this.cpu.trap(PDP11.TRAP.BUS_ERROR, 122);
this.cpu.trap(PDP11.TRAP.BUS_ERROR, 122);
}
if (data >= 0) {
else if (data >= 0) {
data = ((data << 8) & 0xff00) | (original & 0xff);
} else {
data = original;
@ -833,7 +866,7 @@ DevicePDP11.prototype.reset = function()
this.display.misc = (this.display.misc & ~0x77) | 0x14; // kernel 16 bit
this.tty.rcsr = 0;
this.tty.xcsr = 0x80; /*0200*/
this.kw11.csr = 0;
this.kw11.lks = 0;
this.rk11.rkcs = 0x80; /*0200*/
this.rl11.csr = 0x80;
this.rp11_init();
@ -1101,22 +1134,22 @@ DevicePDP11.prototype.access = function(physicalAddress, data, byteFlag)
}
result = 0;
break;
case 0x3FFF74: /*017777564*/ // console xcsr
// if (data < 0) {
// result = tty.xcsr;
// } else {
// result = this.insertData(tty.xcsr, physicalAddress, data, byteFlag);
// if (result >= 0) {
// if ((tty.xcsr & 0xC0) /*0300*/ == 0x80 /*0200*/&& (result & 0x40) /*0100*/) {
// cpu.interrupt(8, 4, 0x34, /*064*/ function() {
// tty.xcsr |= 0x80; /*0200*/
// return !!(tty.xcsr & 0x40); /*0100*/
// });
// }
// tty.xcsr = (tty.xcsr & 0x80) /*0200*/ | (result & ~0x80) /*0200*/;
// }
// }
break;
// case 0x3FFF74: /*017777564*/ // console xcsr
// if (data < 0) {
// result = tty.xcsr;
// } else {
// result = this.insertData(tty.xcsr, physicalAddress, data, byteFlag);
// if (result >= 0) {
// if ((tty.xcsr & 0xC0) /*0300*/ == 0x80 /*0200*/&& (result & 0x40) /*0100*/) {
// cpu.interrupt(8, 4, 0x34, /*064*/ function() {
// tty.xcsr |= 0x80; /*0200*/
// return !!(tty.xcsr & 0x40); /*0100*/
// });
// }
// tty.xcsr = (tty.xcsr & 0x80) /*0200*/ | (result & ~0x80) /*0200*/;
// }
// }
// break;
case 0x3FFF72: /*017777562*/ // console rbuf
result = 0;
if (data < 0) {
@ -1140,23 +1173,23 @@ DevicePDP11.prototype.access = function(physicalAddress, data, byteFlag)
if (result >= 0) tty.rcsr = (tty.rcsr & 0x80) /*0200*/ | (result & ~0x80) /*0200*/;
}
break;
case 0x3FFF66: /*017777546*/ // kw11.csr
if (data < 0) {
result = kw11.csr;
kw11.csr &= ~0x80; /*0200*/
} else {
result = this.insertData(kw11.csr, physicalAddress, data, byteFlag);
if (result >= 0) {
if (result & 0x40) /*0100*/ {
if (!kw11.init) {
setInterval(this.kw11_interrupt.bind(this), 25);
kw11.init = 1;
}
}
kw11.csr = result & ~0x80; /*0200*/
}
}
break;
// case 0x3FFF66: /*017777546*/ // kw11.lks
// if (data < 0) {
// result = kw11.lks;
// kw11.lks &= ~0x80; /*0200*/
// } else {
// result = this.insertData(kw11.lks, physicalAddress, data, byteFlag);
// if (result >= 0) {
// if (result & 0x40) /*0100*/ {
// if (!kw11.init) {
// setInterval(this.kw11_interrupt.bind(this), 25);
// kw11.init = 1;
// }
// }
// kw11.lks = result & ~0x80; /*0200*/
// }
// }
// break;
default:
cpu.regCPUErr |= PDP11.CPUERR.TIMEOUT;
return cpu.trap(PDP11.TRAP.BUS_ERROR, 126);
@ -1446,12 +1479,9 @@ DevicePDP11.prototype.access = function(physicalAddress, data, byteFlag)
* ES6 ALERT: As you can see below, I've finally started using computed property names.
*/
DevicePDP11.UNIBUS_TABLE = {
[PDP11.UNIBUS.PSW]: [
null, null, DevicePDP11.prototype.readPSW, DevicePDP11.prototype.writePSW
],
[PDP11.UNIBUS.XCSR]: [
null, null, DevicePDP11.prototype.readXCSR, DevicePDP11.prototype.writeXCSR
]
[PDP11.UNIBUS.LKS]: [null, null, DevicePDP11.prototype.readLKS, DevicePDP11.prototype.writeLKS],
[PDP11.UNIBUS.XCSR]: [null, null, DevicePDP11.prototype.readXCSR, DevicePDP11.prototype.writeXCSR],
[PDP11.UNIBUS.PSW]: [null, null, DevicePDP11.prototype.readPSW, DevicePDP11.prototype.writePSW]
};
/**