Added KW11 interface (and LKS register) definitions
This commit is contained in:
parent
4b4098a5c9
commit
1e1388b9ca
4 changed files with 474 additions and 429 deletions
|
|
@ -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
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
|||
Loading…
Reference in a new issue