Added MMU dump command ("d mmu [filter]"), fixed byte updates of PDRs, masked 18-bit UNIBUS addresses when UNIBUS relocation map not enabled, and fixed reads of MMR0 when ABORT bits are set
This commit is contained in:
parent
2b23c86649
commit
9148cec085
8 changed files with 424 additions and 360 deletions
|
|
@ -166,11 +166,12 @@ Component.subclass(BusPDP11);
|
|||
|
||||
BusPDP11.IOPAGE_16BIT = 0xE000; /*000160000*/ // eg, PDP-11/20
|
||||
BusPDP11.IOPAGE_18BIT = 0x3E000; /*000760000*/ // eg, PDP-11/45
|
||||
BusPDP11.IOPAGE_UNIBUS = 0x3C0000; /*017000000*/
|
||||
BusPDP11.IOPAGE_22BIT = 0x3FE000; /*017760000*/ // eg, PDP-11/70
|
||||
BusPDP11.IOPAGE_LENGTH = 0x2000; // ie, 8Kb
|
||||
BusPDP11.IOPAGE_MASK = BusPDP11.IOPAGE_LENGTH - 1;
|
||||
BusPDP11.MAX_MEMORY = BusPDP11.IOPAGE_UNIBUS - 16384; // Maximum memory address (need less memory for BSD 2.9 boot)
|
||||
|
||||
BusPDP11.UNIBUS_22BIT = 0x3C0000; /*017000000*/
|
||||
BusPDP11.MAX_MEMORY = BusPDP11.UNIBUS_22BIT - 16384; // Maximum memory address (need less memory for BSD 2.9 boot)
|
||||
|
||||
BusPDP11.ERROR = {
|
||||
RANGE_INUSE: 1,
|
||||
|
|
@ -319,15 +320,11 @@ BusPDP11.IOController = {
|
|||
fWrite = true;
|
||||
}
|
||||
/*
|
||||
* If a writeWord() handler exists, call the readWord() handler first to get the original data,
|
||||
* then call writeWord() with the new data pre-inserted in the original data.
|
||||
*
|
||||
* WARNING: Whenever we call readWord() under these circumstances, we zero the address parameter,
|
||||
* so that the handler can distinguish this case. Thus, if we're dealing with a special register
|
||||
* where a byte write operation modifies the entire register, the handler can simply return zero.
|
||||
* If a writeWord() handler exists, call the readWord() handler first to get the original data
|
||||
* (with fPreWrite set to true) and call writeWord() with the new data inserted into the original data.
|
||||
*/
|
||||
else if (afn[BusPDP11.IOHANDLER.WRITE_WORD]) {
|
||||
w = afn[BusPDP11.IOHANDLER.READ_WORD]? afn[BusPDP11.IOHANDLER.READ_WORD](0) : 0;
|
||||
w = afn[BusPDP11.IOHANDLER.READ_WORD]? afn[BusPDP11.IOHANDLER.READ_WORD](addrMasked, true) : 0;
|
||||
if (!(addrMasked & 0x1)) {
|
||||
afn[BusPDP11.IOHANDLER.WRITE_WORD]((w & ~0xff) | b, addrMasked);
|
||||
fWrite = true;
|
||||
|
|
@ -339,18 +336,14 @@ BusPDP11.IOController = {
|
|||
} else if (addrMasked & 0x1) {
|
||||
/*
|
||||
* If no handler existed, and this address was odd, then perhaps a handler exists for the even address;
|
||||
* if so, call the readWord() handler first to get the original data, then call writeWord() with the new
|
||||
* data pre-inserted in (the high byte of) the original data.
|
||||
*
|
||||
* WARNING: Whenever we call readWord() under these circumstances, we zero the address parameter,
|
||||
* so that the handler can distinguish this case. Thus, if we're dealing with a special register
|
||||
* where a byte write operation modifies the entire register, the handler can simply return zero.
|
||||
* if so, call the readWord() handler first to get the original data (with fPreWrite set to true) and call
|
||||
* writeWord() with the new data inserted into (the high byte of) the original data.
|
||||
*/
|
||||
afn = bus.aIOHandlers[off & ~0x1];
|
||||
if (afn) {
|
||||
if (afn[BusPDP11.IOHANDLER.WRITE_WORD]) {
|
||||
addrMasked &= ~0x1;
|
||||
w = afn[BusPDP11.IOHANDLER.READ_WORD]? afn[BusPDP11.IOHANDLER.READ_WORD](0) : 0;
|
||||
w = afn[BusPDP11.IOHANDLER.READ_WORD]? afn[BusPDP11.IOHANDLER.READ_WORD](addrMasked, true) : 0;
|
||||
afn[BusPDP11.IOHANDLER.WRITE_WORD]((w & 0xff) | (b << 8), addrMasked);
|
||||
fWrite = true;
|
||||
} else if (afn[BusPDP11.IOHANDLER.WRITE_BYTE]) {
|
||||
|
|
@ -930,11 +923,11 @@ BusPDP11.prototype.setMemoryBlocks = function(addr, size, aBlocks, type)
|
|||
BusPDP11.prototype.getByte = function(addr)
|
||||
{
|
||||
/*
|
||||
* If bits 18-21 of addr are all set (which is implied by addr >= BusPDP11.IOPAGE_UNIBUS aka 0x3C0000),
|
||||
* If bits 18-21 of addr are all set (which is implied by addr >= BusPDP11.UNIBUS_22BIT aka 0x3C0000),
|
||||
* then we have a 22-bit address pointing to the top 256Kb range, so we must pass the address through the
|
||||
* UNIBUS relocation map.
|
||||
*/
|
||||
if (addr >= BusPDP11.IOPAGE_UNIBUS) {
|
||||
if (addr >= BusPDP11.UNIBUS_22BIT) {
|
||||
addr = this.cpu.mapUnibus(addr);
|
||||
}
|
||||
return this.aMemBlocks[(addr & this.nBusMask) >>> this.nBlockShift].readByte(addr & this.nBlockLimit, addr);
|
||||
|
|
@ -952,11 +945,11 @@ BusPDP11.prototype.getByte = function(addr)
|
|||
BusPDP11.prototype.getByteDirect = function(addr)
|
||||
{
|
||||
/*
|
||||
* If bits 18-21 of addr are all set (which is implied by addr >= BusPDP11.IOPAGE_UNIBUS aka 0x3C0000),
|
||||
* If bits 18-21 of addr are all set (which is implied by addr >= BusPDP11.UNIBUS_22BIT aka 0x3C0000),
|
||||
* then we have a 22-bit address pointing to the top 256Kb range, so we must pass the address through the
|
||||
* UNIBUS relocation map.
|
||||
*/
|
||||
if (addr >= BusPDP11.IOPAGE_UNIBUS) {
|
||||
if (addr >= BusPDP11.UNIBUS_22BIT) {
|
||||
addr = this.cpu.mapUnibus(addr);
|
||||
}
|
||||
this.fFault = false;
|
||||
|
|
@ -976,11 +969,11 @@ BusPDP11.prototype.getByteDirect = function(addr)
|
|||
BusPDP11.prototype.getWord = function(addr)
|
||||
{
|
||||
/*
|
||||
* If bits 18-21 of addr are all set (which is implied by addr >= BusPDP11.IOPAGE_UNIBUS aka 0x3C0000),
|
||||
* If bits 18-21 of addr are all set (which is implied by addr >= BusPDP11.UNIBUS_22BIT aka 0x3C0000),
|
||||
* then we have a 22-bit address pointing to the top 256Kb range, so we must pass the address through the
|
||||
* UNIBUS relocation map.
|
||||
*/
|
||||
if (addr >= BusPDP11.IOPAGE_UNIBUS) {
|
||||
if (addr >= BusPDP11.UNIBUS_22BIT) {
|
||||
addr = this.cpu.mapUnibus(addr);
|
||||
}
|
||||
var off = addr & this.nBlockLimit;
|
||||
|
|
@ -1003,11 +996,11 @@ BusPDP11.prototype.getWord = function(addr)
|
|||
BusPDP11.prototype.getWordDirect = function(addr)
|
||||
{
|
||||
/*
|
||||
* If bits 18-21 of addr are all set (which is implied by addr >= BusPDP11.IOPAGE_UNIBUS aka 0x3C0000),
|
||||
* If bits 18-21 of addr are all set (which is implied by addr >= BusPDP11.UNIBUS_22BIT aka 0x3C0000),
|
||||
* then we have a 22-bit address pointing to the top 256Kb range, so we must pass the address through the
|
||||
* UNIBUS relocation map.
|
||||
*/
|
||||
if (addr >= BusPDP11.IOPAGE_UNIBUS) {
|
||||
if (addr >= BusPDP11.UNIBUS_22BIT) {
|
||||
addr = this.cpu.mapUnibus(addr);
|
||||
}
|
||||
var w;
|
||||
|
|
@ -1034,11 +1027,11 @@ BusPDP11.prototype.getWordDirect = function(addr)
|
|||
BusPDP11.prototype.setByte = function(addr, b)
|
||||
{
|
||||
/*
|
||||
* If bits 18-21 of addr are all set (which is implied by addr >= BusPDP11.IOPAGE_UNIBUS aka 0x3C0000),
|
||||
* If bits 18-21 of addr are all set (which is implied by addr >= BusPDP11.UNIBUS_22BIT aka 0x3C0000),
|
||||
* then we have a 22-bit address pointing to the top 256Kb range, so we must pass the address through the
|
||||
* UNIBUS relocation map.
|
||||
*/
|
||||
if (addr >= BusPDP11.IOPAGE_UNIBUS) {
|
||||
if (addr >= BusPDP11.UNIBUS_22BIT) {
|
||||
addr = this.cpu.mapUnibus(addr);
|
||||
}
|
||||
this.aMemBlocks[(addr & this.nBusMask) >>> this.nBlockShift].writeByte(addr & this.nBlockLimit, b & 0xff, addr);
|
||||
|
|
@ -1057,11 +1050,11 @@ BusPDP11.prototype.setByte = function(addr, b)
|
|||
BusPDP11.prototype.setByteDirect = function(addr, b)
|
||||
{
|
||||
/*
|
||||
* If bits 18-21 of addr are all set (which is implied by addr >= BusPDP11.IOPAGE_UNIBUS aka 0x3C0000),
|
||||
* If bits 18-21 of addr are all set (which is implied by addr >= BusPDP11.UNIBUS_22BIT aka 0x3C0000),
|
||||
* then we have a 22-bit address pointing to the top 256Kb range, so we must pass the address through the
|
||||
* UNIBUS relocation map.
|
||||
*/
|
||||
if (addr >= BusPDP11.IOPAGE_UNIBUS) {
|
||||
if (addr >= BusPDP11.UNIBUS_22BIT) {
|
||||
addr = this.cpu.mapUnibus(addr);
|
||||
}
|
||||
this.fFault = false;
|
||||
|
|
@ -1080,11 +1073,11 @@ BusPDP11.prototype.setByteDirect = function(addr, b)
|
|||
BusPDP11.prototype.setWord = function(addr, w)
|
||||
{
|
||||
/*
|
||||
* If bits 18-21 of addr are all set (which is implied by addr >= BusPDP11.IOPAGE_UNIBUS aka 0x3C0000),
|
||||
* If bits 18-21 of addr are all set (which is implied by addr >= BusPDP11.UNIBUS_22BIT aka 0x3C0000),
|
||||
* then we have a 22-bit address pointing to the top 256Kb range, so we must pass the address through the
|
||||
* UNIBUS relocation map.
|
||||
*/
|
||||
if (addr >= BusPDP11.IOPAGE_UNIBUS) {
|
||||
if (addr >= BusPDP11.UNIBUS_22BIT) {
|
||||
addr = this.cpu.mapUnibus(addr);
|
||||
}
|
||||
var off = addr & this.nBlockLimit;
|
||||
|
|
@ -1110,11 +1103,11 @@ BusPDP11.prototype.setWord = function(addr, w)
|
|||
BusPDP11.prototype.setWordDirect = function(addr, w)
|
||||
{
|
||||
/*
|
||||
* If bits 18-21 of addr are all set (which is implied by addr >= BusPDP11.IOPAGE_UNIBUS aka 0x3C0000),
|
||||
* If bits 18-21 of addr are all set (which is implied by addr >= BusPDP11.UNIBUS_22BIT aka 0x3C0000),
|
||||
* then we have a 22-bit address pointing to the top 256Kb range, so we must pass the address through the
|
||||
* UNIBUS relocation map.
|
||||
*/
|
||||
if (addr >= BusPDP11.IOPAGE_UNIBUS) {
|
||||
if (addr >= BusPDP11.UNIBUS_22BIT) {
|
||||
addr = this.cpu.mapUnibus(addr);
|
||||
}
|
||||
var off = addr & this.nBlockLimit;
|
||||
|
|
|
|||
|
|
@ -318,11 +318,11 @@ CPUStatePDP11.prototype.setMemoryAccess = function()
|
|||
*/
|
||||
CPUStatePDP11.prototype.getMMR0 = function()
|
||||
{
|
||||
/*
|
||||
* Technically, we never allow the UNUSED bits to be set, so there's no point going out of our way
|
||||
* to clear them, but it doesn't hurt to include them in the mask.
|
||||
*/
|
||||
return (this.regMMR0 & ~(PDP11.MMR0.UNUSED | PDP11.MMR0.PAGE | PDP11.MMR0.MODE)) | (this.mmuLastMode << 5) | (this.mmuLastPage << 1);
|
||||
var data = this.regMMR0;
|
||||
if (!(data & PDP11.MMR0.ABORT)) {
|
||||
data = (data & ~(PDP11.MMR0.UNUSED | PDP11.MMR0.PAGE | PDP11.MMR0.MODE)) | (this.mmuLastMode << 5) | (this.mmuLastPage << 1);
|
||||
}
|
||||
return data;
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -1278,19 +1278,6 @@ CPUStatePDP11.prototype.updateSubFlags = function(result, src, dst)
|
|||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* panic(reason)
|
||||
*
|
||||
* TODO: Something.
|
||||
*
|
||||
* @this {CPUStatePDP11}
|
||||
* @param {number} reason
|
||||
*/
|
||||
CPUStatePDP11.prototype.panic = function(reason)
|
||||
{
|
||||
console.log("panic(" + reason + ")");
|
||||
};
|
||||
|
||||
/**
|
||||
* trap(vector, flag, reason)
|
||||
*
|
||||
|
|
@ -1433,7 +1420,7 @@ CPUStatePDP11.prototype.getTrapStatus = function()
|
|||
/**
|
||||
* mapUnibus(addr)
|
||||
*
|
||||
* If bits 18-21 of addr are all set (which is implied by addr >= BusPDP11.IOPAGE_UNIBUS aka 0x3C0000),
|
||||
* If bits 18-21 of addr are all set (which is implied by addr >= BusPDP11.UNIBUS_22BIT aka 0x3C0000),
|
||||
* then we have a 22-bit address pointing to the top 256Kb range, so if the UNIBUS relocation map is enabled,
|
||||
* we must pass the lower 18 bits of that address through the map.
|
||||
*
|
||||
|
|
@ -1470,8 +1457,19 @@ CPUStatePDP11.prototype.mapUnibus = function(addr)
|
|||
var idx = (addr >> 13) & 0x1f;
|
||||
if (idx < 31) {
|
||||
if (this.regMMR3 & PDP11.MMR3.UNIBUS_MAP) {
|
||||
/*
|
||||
* The UNIBUS map relocation is enabled
|
||||
*/
|
||||
addr = (this.unibusMap[idx] + (addr & 0x1ffe)) & 0x3ffffe;
|
||||
if (addr >= BusPDP11.IOPAGE_UNIBUS && addr < BusPDP11.IOPAGE_22BIT) this.panic(898);
|
||||
this.assert(addr < BusPDP11.UNIBUS_22BIT || addr >= BusPDP11.IOPAGE_22BIT);
|
||||
} else {
|
||||
/*
|
||||
* Since UNIBUS map relocation is NOT enabled, then as explained above:
|
||||
*
|
||||
* If the UNIBUS map relocation is not enabled, an incoming 18-bit UNIBUS address has 4 leading zeroes added for
|
||||
* referencing a 22-bit physical address. The lower 18 bits are the same. No relocation is performed.
|
||||
*/
|
||||
addr &= ~BusPDP11.UNIBUS_22BIT;
|
||||
}
|
||||
}
|
||||
return addr;
|
||||
|
|
@ -1607,7 +1605,6 @@ CPUStatePDP11.prototype.mapVirtualToPhysical = function(virtualAddress, accessFl
|
|||
this.mmuLastPage = page;
|
||||
}
|
||||
|
||||
var fAbort = false;
|
||||
if (newMMR0) {
|
||||
if (newMMR0 & PDP11.MMR0.ABORT) {
|
||||
if (this.trapPSW >= 0) {
|
||||
|
|
@ -1618,11 +1615,11 @@ CPUStatePDP11.prototype.mapVirtualToPhysical = function(virtualAddress, accessFl
|
|||
this.assert(!(newMMR0 & ~PDP11.MMR0.UPDATE));
|
||||
this.setMMR0((this.regMMR0 & ~PDP11.MMR0.UPDATE) | newMMR0);
|
||||
/*
|
||||
* I've decided to NOT set fAbort if MMR0 already indicates an ABORT condition,
|
||||
* I've decided to NOT abort if MMR0 already indicates an ABORT condition,
|
||||
* because otherwise we run the risk of infinitely looping; eg, we call trap(), which
|
||||
* calls mapVirtualToPhysical() on the trap vector, which faults again, etc.
|
||||
*/
|
||||
fAbort = true;
|
||||
this.trap(PDP11.TRAP.MMU, 0, PDP11.REASON.ABORT);
|
||||
}
|
||||
}
|
||||
if (!(this.regMMR0 & (PDP11.MMR0.ABORT | PDP11.MMR0.TRAP_MMU))) {
|
||||
|
|
@ -1637,9 +1634,6 @@ CPUStatePDP11.prototype.mapVirtualToPhysical = function(virtualAddress, accessFl
|
|||
}
|
||||
}
|
||||
}
|
||||
if (fAbort) { // don't abort until the end, because it throws an exception
|
||||
this.trap(PDP11.TRAP.MMU, 0, PDP11.REASON.ABORT);
|
||||
}
|
||||
}
|
||||
return physicalAddress;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1207,26 +1207,22 @@ if (DEBUGGER) {
|
|||
value = cpu.regSL;
|
||||
break;
|
||||
case DebuggerPDP11.REG_MMR0:
|
||||
value = panel.getMMR0();
|
||||
value = cpu.getMMR0();
|
||||
break;
|
||||
case DebuggerPDP11.REG_MMR1:
|
||||
value = panel.getMMR1();
|
||||
value = cpu.getMMR1();
|
||||
break;
|
||||
case DebuggerPDP11.REG_MMR2:
|
||||
value = panel.getMMR2();
|
||||
value = cpu.getMMR2();
|
||||
break;
|
||||
case DebuggerPDP11.REG_MMR3:
|
||||
value = panel.getMMR3();
|
||||
value = cpu.getMMR3();
|
||||
break;
|
||||
case DebuggerPDP11.REG_AR:
|
||||
if (panel) {
|
||||
value = panel.getAR();
|
||||
}
|
||||
if (panel) value = panel.getAR();
|
||||
break;
|
||||
case DebuggerPDP11.REG_DR:
|
||||
if (panel) {
|
||||
value = panel.getDR();
|
||||
}
|
||||
if (panel) value = panel.getDR();
|
||||
break;
|
||||
case DebuggerPDP11.REG_SR:
|
||||
if (panel && panel.hasSwitches()) {
|
||||
|
|
|
|||
|
|
@ -351,6 +351,24 @@ var PDP11 = {
|
|||
MMU_22BIT: 0x0010,
|
||||
UNIBUS_MAP: 0x0020 // UNIBUS map relocation enabled
|
||||
},
|
||||
PDR: {
|
||||
ACF: {
|
||||
NR: 0x0, // non-resident, abort all accesses
|
||||
RO1: 0x1, // read-only, abort on write attempt, memory management trap on read (11/70 only)
|
||||
RO: 0x2, // read-only, abort on write attempt
|
||||
U1: 0x3, // unused, abort all accesses--reserved for future use
|
||||
RW1: 0x4, // read/write, memory management trap upon completion of a read or write
|
||||
RW2: 0x5, // read/write, memory management trap upon completion of a write (11/70 only)
|
||||
RW: 0x6, // read/write, no system trap/abort action
|
||||
U2: 0x7 // unused, abort all accesses--reserved for future use
|
||||
},
|
||||
ED: 0x0080, // expansion direction (if set, the page expands downward from block number 127)
|
||||
UNUSED: 0x0030,
|
||||
MODIFIED: 0x0040, // page has been written (bit cleared when either PDR or PAR is written)
|
||||
ACCESSED: 0x0080, // page has been accessed (bit cleared when either PDR or PAR is written) (11/70 only)
|
||||
PLF: 0x7F00, // page length field
|
||||
BC: 0x8000 // bypass cache (11/44 only)
|
||||
},
|
||||
/*
|
||||
* Assorted special (UNIBUS) addresses
|
||||
*
|
||||
|
|
|
|||
|
|
@ -130,9 +130,62 @@ DevicePDP11.prototype.initBus = function(cmp, bus, cpu, dbg)
|
|||
bus.addIOTable(this, DevicePDP11.UNIBUS_IOTABLE);
|
||||
bus.addResetHandler(this.reset.bind(this));
|
||||
|
||||
if (DEBUGGER && dbg) {
|
||||
dbg.messageDump(MessagesPDP11.MMU, function onDumpMMU(asArgs) {
|
||||
device.dumpMMU(asArgs);
|
||||
});
|
||||
}
|
||||
this.setReady();
|
||||
};
|
||||
|
||||
/**
|
||||
* dumpMMU(asArgs)
|
||||
*
|
||||
* @this {DevicePDP11}
|
||||
* @param {Array.<string>} asArgs
|
||||
*/
|
||||
DevicePDP11.prototype.dumpMMU = function(asArgs)
|
||||
{
|
||||
if (DEBUGGER) {
|
||||
var cpu = this.cpu;
|
||||
this.dumpRegs("KIPDR", cpu.mmuPDR[0], 0, asArgs[0]);
|
||||
this.dumpRegs("KDPDR", cpu.mmuPDR[0], 8, asArgs[0]);
|
||||
this.dumpRegs("KIPAR", cpu.mmuPAR[0], 0, asArgs[0]);
|
||||
this.dumpRegs("KDPAR", cpu.mmuPAR[0], 8, asArgs[0], true);
|
||||
this.dumpRegs("SIPDR", cpu.mmuPDR[1], 0, asArgs[0]);
|
||||
this.dumpRegs("SDPDR", cpu.mmuPDR[1], 8, asArgs[0]);
|
||||
this.dumpRegs("SIPAR", cpu.mmuPAR[1], 0, asArgs[0]);
|
||||
this.dumpRegs("SDPAR", cpu.mmuPAR[1], 8, asArgs[0], true);
|
||||
this.dumpRegs("UIPDR", cpu.mmuPDR[3], 0, asArgs[0]);
|
||||
this.dumpRegs("UDPDR", cpu.mmuPDR[3], 8, asArgs[0]);
|
||||
this.dumpRegs("UIPAR", cpu.mmuPAR[3], 0, asArgs[0]);
|
||||
this.dumpRegs("UDPAR", cpu.mmuPAR[3], 8, asArgs[0], true);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* dumpRegs(sName, aRegs, offset, sFilter, fBreak)
|
||||
*
|
||||
* @this {DevicePDP11}
|
||||
* @param {string} sName
|
||||
* @param {Array.<number>} aRegs
|
||||
* @param {number} offset
|
||||
* @param {string} sFilter
|
||||
* @param {boolean} [fBreak]
|
||||
*/
|
||||
DevicePDP11.prototype.dumpRegs = function(sName, aRegs, offset, sFilter, fBreak)
|
||||
{
|
||||
if (DEBUGGER) {
|
||||
var dbg = this.dbg;
|
||||
if (sFilter && sName.indexOf(sFilter.toUpperCase()) < 0) return;
|
||||
var sDump = sName + ":";
|
||||
for (var i = 0; i < 8; i++) {
|
||||
sDump += ' ' + dbg.toStrBase(aRegs[offset + i]);
|
||||
}
|
||||
dbg.println(sDump + (fBreak? '\n' : ''));
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* reset()
|
||||
*
|
||||
|
|
@ -435,7 +488,10 @@ DevicePDP11.prototype.readKIPDR = function(addr)
|
|||
DevicePDP11.prototype.writeKIPDR = function(data, addr)
|
||||
{
|
||||
var reg = (addr >> 1) & 7;
|
||||
this.cpu.mmuPDR[0][reg] = data & 0xff0f;
|
||||
this.cpu.mmuPDR[0][reg] = data &= 0xff0f;
|
||||
if (this.messageEnabled(MessagesPDP11.MMU)) {
|
||||
this.printMessage("writeKIPDR[" + reg + "]: " + str.toOct(data), true);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -962,20 +1018,23 @@ DevicePDP11.prototype.readMB = function(addr)
|
|||
*/
|
||||
DevicePDP11.prototype.writeMB = function(data, addr)
|
||||
{
|
||||
if (!(addr & 0x1)) data &= 0xff; // Required for KB11-CM without MFPT instruction
|
||||
if (!(addr & 0x1)) {
|
||||
data &= 0xff; // required for KB11-CM without MFPT instruction
|
||||
}
|
||||
this.cpu.regMB = data;
|
||||
};
|
||||
|
||||
/**
|
||||
* readPIR(addr)
|
||||
* readPIR(addr, fPreWrite)
|
||||
*
|
||||
* @this {DevicePDP11}
|
||||
* @param {number} addr (eg, PDP11.UNIBUS.PIR or 177772)
|
||||
* @param {boolean} [fPreWrite]
|
||||
* @return {number}
|
||||
*/
|
||||
DevicePDP11.prototype.readPIR = function(addr)
|
||||
DevicePDP11.prototype.readPIR = function(addr, fPreWrite)
|
||||
{
|
||||
if (!addr) return 0; // the caller is preparing to write the low or high byte; these are the bits to return for the other byte
|
||||
if (fPreWrite) return 0;
|
||||
return this.cpu.getPIR();
|
||||
};
|
||||
|
||||
|
|
@ -992,15 +1051,16 @@ DevicePDP11.prototype.writePIR = function(data, addr)
|
|||
};
|
||||
|
||||
/**
|
||||
* readSL(addr)
|
||||
* readSL(addr, fPreWrite)
|
||||
*
|
||||
* @this {DevicePDP11}
|
||||
* @param {number} addr (eg, PDP11.UNIBUS.SL or 177774)
|
||||
* @param {boolean} [fPreWrite]
|
||||
* @return {number}
|
||||
*/
|
||||
DevicePDP11.prototype.readSL = function(addr)
|
||||
DevicePDP11.prototype.readSL = function(addr, fPreWrite)
|
||||
{
|
||||
if (!addr) return 0; // the caller is preparing to write the low or high byte; these are the bits to return for the other byte
|
||||
if (fPreWrite) return 0;
|
||||
return this.cpu.getSL();
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -38,9 +38,10 @@ var MessagesPDP11 = {
|
|||
FAULT: 0x00000020,
|
||||
BUS: 0x00000040,
|
||||
MEMORY: 0x00000080,
|
||||
ROM: 0x00000100,
|
||||
DEVICE: 0x00000200,
|
||||
PANEL: 0x00000400,
|
||||
MMU: 0x00000100,
|
||||
ROM: 0x00000200,
|
||||
DEVICE: 0x00000400,
|
||||
PANEL: 0x00000800,
|
||||
KEYBOARD: 0x00010000,
|
||||
KEYS: 0x00020000,
|
||||
PAPER: 0x00100000,
|
||||
|
|
@ -74,6 +75,7 @@ MessagesPDP11.CATEGORIES = {
|
|||
"fault": MessagesPDP11.FAULT,
|
||||
"bus": MessagesPDP11.BUS,
|
||||
"memory": MessagesPDP11.MEMORY,
|
||||
"mmu": MessagesPDP11.MMU,
|
||||
"rom": MessagesPDP11.ROM,
|
||||
"device": MessagesPDP11.DEVICE,
|
||||
"panel": MessagesPDP11.PANEL,
|
||||
|
|
|
|||
Loading…
Reference in a new issue