Some corrections as to what features are available on the 11/40 vs. 11/45

This commit is contained in:
Jeff Parsons 2016-12-31 11:23:25 -08:00 committed by Jeff Parsons
commit dd628148ef
8 changed files with 396 additions and 367 deletions

View file

@ -35,7 +35,11 @@
var PDP11 = require("./defines");
/*
* Decoding starts at the bottom of this file, in op1120() and op1145().
* Decoding starts near the bottom of this file, in op1120() and op1140(). Obviously, there are
* MANY more PDP-11 models than the 11/20 and 11/40, but for the broad model categories that PDPjs
* supports (ie, MODEL_1120, MODEL_1140, MODEL_1145, and MODEL_1170), the biggest differences are
* between MODEL_1120 and MODEL_1140, so decoding is divided into those two categories, and all
* other differences are handled inside the opcode handlers.
*
* The basic decoding approach is to dispatch on the top 4 bits of the opcode, and if further
* decoding is required, the dispatched function will dispatch on the next 4 bits, and so on
@ -51,6 +55,11 @@ var PDP11 = require("./defines");
* For example, opADD() passes the helper function fnADD() to the appropriate update method. This
* allows the update method to perform the entire read/modify/write operation, because the modify
* step is performed internally, via the fnXXX() helper function.
*
* For the handful of instructions in the 1140 tables that actually exist only on the 11/45 and
* 11/70 (ie, MFPD, MTPD, and SPL), those opcode handlers perform their own model checks. That's
* simpler than creating additional tables, and seems fine for instructions that are not commonly
* executed.
*/
/**
@ -1729,7 +1738,7 @@ PDP11.opSOB = function(opCode)
*/
PDP11.opSPL = function(opCode)
{
if (!(opCode & 0x08)) {
if (!(opCode & 0x08) || this.model < PDP11.MODEL_1145) {
PDP11.opUndefined.call(this, opCode);
return;
}
@ -2217,103 +2226,107 @@ PDP11.aOp8CXn_1120 = [
];
/**
* op1145(opCode)
* op1140(opCode)
*
* @this {CPUStatePDP11}
* @param {number} opCode
*/
PDP11.op1145 = function(opCode)
PDP11.op1140 = function(opCode)
{
PDP11.aOpXnnn_1145[opCode >> 12].call(this, opCode);
PDP11.aOpXnnn_1140[opCode >> 12].call(this, opCode);
};
/**
* op0Xnn_1145(opCode)
* op0Xnn_1140(opCode)
*
* @this {CPUStatePDP11}
* @param {number} opCode
*/
PDP11.op0Xnn_1145 = function(opCode)
PDP11.op0Xnn_1140 = function(opCode)
{
PDP11.aOp0Xnn_1145[(opCode >> 8) & 0xf].call(this, opCode);
PDP11.aOp0Xnn_1140[(opCode >> 8) & 0xf].call(this, opCode);
};
/**
* op0DXn_1145(opCode)
* op0DXn_1140(opCode)
*
* @this {CPUStatePDP11}
* @param {number} opCode
*/
PDP11.op0DXn_1145 = function(opCode)
PDP11.op0DXn_1140 = function(opCode)
{
PDP11.aOp0DXn_1145[(opCode >> 6) & 0x3].call(this, opCode);
PDP11.aOp0DXn_1140[(opCode >> 6) & 0x3].call(this, opCode);
};
/**
* op00Xn_1145(opCode)
* op00Xn_1140(opCode)
*
* @this {CPUStatePDP11}
* @param {number} opCode
*/
PDP11.op00Xn_1145 = function(opCode)
PDP11.op00Xn_1140 = function(opCode)
{
PDP11.aOp00Xn_1145[(opCode >> 4) & 0xf].call(this, opCode);
PDP11.aOp00Xn_1140[(opCode >> 4) & 0xf].call(this, opCode);
};
/**
* op000X_1145(opCode)
* op000X_1140(opCode)
*
* @this {CPUStatePDP11}
* @param {number} opCode
*/
PDP11.op000X_1145 = function(opCode)
PDP11.op000X_1140 = function(opCode)
{
PDP11.aOp000X_1145[opCode & 0xf].call(this, opCode);
PDP11.aOp000X_1140[opCode & 0xf].call(this, opCode);
};
/**
* op7Xnn_1145(opCode)
* op7Xnn_1140(opCode)
*
* @this {CPUStatePDP11}
* @param {number} opCode
*/
PDP11.op7Xnn_1145 = function(opCode)
PDP11.op7Xnn_1140 = function(opCode)
{
PDP11.aOp7Xnn_1145[(opCode >> 8) & 0xf].call(this, opCode);
PDP11.aOp7Xnn_1140[(opCode >> 8) & 0xf].call(this, opCode);
};
/**
* op8Xnn_1145(opCode)
* op8Xnn_1140(opCode)
*
* @this {CPUStatePDP11}
* @param {number} opCode
*/
PDP11.op8Xnn_1145 = function(opCode)
PDP11.op8Xnn_1140 = function(opCode)
{
PDP11.aOp8Xnn_1145[(opCode >> 8) & 0xf].call(this, opCode);
PDP11.aOp8Xnn_1140[(opCode >> 8) & 0xf].call(this, opCode);
};
/**
* op8DXn_1145(opCode)
* op8DXn_1140(opCode)
*
* @this {CPUStatePDP11}
* @param {number} opCode
*/
PDP11.op8DXn_1145 = function(opCode)
PDP11.op8DXn_1140 = function(opCode)
{
PDP11.aOp8DXn_1145[(opCode >> 6) & 0x3].call(this, opCode);
if (this.model < PDP11.MODEL_1145) {
PDP11.opUndefined.call(this, opCode);
return;
}
PDP11.aOp8DXn_1140[(opCode >> 6) & 0x3].call(this, opCode);
};
PDP11.aOpXnnn_1145 = [
PDP11.op0Xnn_1145, // 0x0nnn
PDP11.aOpXnnn_1140 = [
PDP11.op0Xnn_1140, // 0x0nnn
PDP11.opMOV, // 0x1nnn 01SSDD 11/20+ 2.3
PDP11.opCMP, // 0x2nnn 02SSDD 11/20+ 2.3*
PDP11.opBIT, // 0x3nnn 03SSDD 11/20+ 2.9*
PDP11.opBIC, // 0x4nnn 04SSDD 11/20+ 2.9
PDP11.opBIS, // 0x5nnn 05SSDD 11/20+ 2.3
PDP11.opADD, // 0x6nnn 06SSDD 11/20+ 2.3
PDP11.op7Xnn_1145, // 0x7nnn
PDP11.op8Xnn_1145, // 0x8nnn
PDP11.op7Xnn_1140, // 0x7nnn
PDP11.op8Xnn_1140, // 0x8nnn
PDP11.opMOVB, // 0x9nnn 11SSDD 11/20+ 2.3
PDP11.opCMPB, // 0xAnnn 12SSDD 11/20+ 2.3
PDP11.opBITB, // 0xBnnn 13SSDD 11/20+ 2.9
@ -2323,8 +2336,8 @@ PDP11.aOpXnnn_1145 = [
PDP11.opUndefined // 0xFnnn
];
PDP11.aOp0Xnn_1145 = [
PDP11.op00Xn_1145, // 0x00nn
PDP11.aOp0Xnn_1140 = [
PDP11.op00Xn_1140, // 0x00nn
PDP11.opBR, // 0x01nn 0004XX 11/20+ 2.6
PDP11.opBNE, // 0x02nn 0010XX 11/20+ 2.6**
PDP11.opBEQ, // 0x03nn 0014XX 11/20+ 2.6**
@ -2337,20 +2350,20 @@ PDP11.aOp0Xnn_1145 = [
PDP11.op0AXn_1120, // 0x0Ann
PDP11.op0BXn_1120, // 0x0Bnn
PDP11.op0CXn_1120, // 0x0Cnn
PDP11.op0DXn_1145, // 0x0Dnn
PDP11.op0DXn_1140, // 0x0Dnn
PDP11.opUndefined, // 0x0Enn
PDP11.opUndefined // 0x0Fnn
];
PDP11.aOp0DXn_1145 = [
PDP11.opMARK, // 0x0D0n 11/45+
PDP11.opMFPI, // 0x0D4n 11/45+
PDP11.opMTPI, // 0x0D8n 11/45+
PDP11.opSXT // 0x0DCn 11/45+
PDP11.aOp0DXn_1140 = [
PDP11.opMARK, // 0x0D0n 11/40+ LEIS
PDP11.opMFPI, // 0x0D4n 11/40+
PDP11.opMTPI, // 0x0D8n 11/40+
PDP11.opSXT // 0x0DCn 11/40+ LEIS
];
PDP11.aOp00Xn_1145 = [
PDP11.op000X_1145, // 0x000n 000000-000017
PDP11.aOp00Xn_1140 = [
PDP11.op000X_1140, // 0x000n 000000-000017
PDP11.opUndefined, // 0x001n 000020-000037
PDP11.opUndefined, // 0x002n 000040-000057
PDP11.opUndefined, // 0x003n 000060-000077
@ -2368,14 +2381,14 @@ PDP11.aOp00Xn_1145 = [
PDP11.opSWAB // 0x00Fn 0003DD 11/20+ 2.3
];
PDP11.aOp000X_1145 = [
PDP11.aOp000X_1140 = [
PDP11.opHALT, // 0x0000 000000 11/20+ 1.8
PDP11.opWAIT, // 0x0001 000001 11/20+ 1.8
PDP11.opRTI, // 0x0002 000002 11/20+ 4.8
PDP11.opBPT, // 0x0003 000003
PDP11.opIOT, // 0x0004 000004 11/20+ 9.3
PDP11.opRESET, // 0x0005 000005 11/20+ 20ms
PDP11.opRTT, // 0x0006 000006 11/45+
PDP11.opRTT, // 0x0006 000006 11/40+ LEIS
PDP11.opMFPT, // 0x0007 000007 TBD
PDP11.opUndefined, // 0x0008
PDP11.opUndefined, // 0x0009
@ -2387,26 +2400,26 @@ PDP11.aOp000X_1145 = [
PDP11.opUndefined // 0x000F
];
PDP11.aOp7Xnn_1145 = [
PDP11.opMUL, // 0x70nn 11/45+
PDP11.opMUL, // 0x71nn 11/45+
PDP11.opDIV, // 0x72nn 11/45+
PDP11.opDIV, // 0x73nn 11/45+
PDP11.opASH, // 0x74nn 11/45+
PDP11.opASH, // 0x75nn 11/45+
PDP11.opASHC, // 0x76nn 11/45+
PDP11.opASHC, // 0x77nn 11/45+
PDP11.opXOR, // 0x78nn 11/45+
PDP11.opXOR, // 0x79nn 11/45+
PDP11.aOp7Xnn_1140 = [
PDP11.opMUL, // 0x70nn 11/40+ EIS
PDP11.opMUL, // 0x71nn 11/40+ EIS
PDP11.opDIV, // 0x72nn 11/40+ EIS
PDP11.opDIV, // 0x73nn 11/40+ EIS
PDP11.opASH, // 0x74nn 11/40+ EIS
PDP11.opASH, // 0x75nn 11/40+ EIS
PDP11.opASHC, // 0x76nn 11/40+ EIS
PDP11.opASHC, // 0x77nn 11/40+ EIS
PDP11.opXOR, // 0x78nn 11/40+ LEIS
PDP11.opXOR, // 0x79nn 11/40+ LEIS
PDP11.opUndefined, // 0x7Ann
PDP11.opUndefined, // 0x7Bnn
PDP11.opUndefined, // 0x7Cnn
PDP11.opUndefined, // 0x7Dnn
PDP11.opSOB, // 0x7Enn 11/45+
PDP11.opSOB // 0x7Fnn 11/45+
PDP11.opSOB, // 0x7Enn 11/40+ LEIS
PDP11.opSOB // 0x7Fnn 11/40+ LEIS
];
PDP11.aOp8Xnn_1145 = [
PDP11.aOp8Xnn_1140 = [
PDP11.opBPL, // 0x80nn 1000XX 11/20+ 2.6**
PDP11.opBMI, // 0x81nn 1004XX 11/20+ 2.6**
PDP11.opBHI, // 0x82nn 1010XX 11/20+ 2.6**
@ -2420,12 +2433,12 @@ PDP11.aOp8Xnn_1145 = [
PDP11.op8AXn_1120, // 0x8Ann
PDP11.op8BXn_1120, // 0x8Bnn
PDP11.op8CXn_1120, // 0x8Cnn
PDP11.op8DXn_1145, // 0x8Dnn
PDP11.op8DXn_1140, // 0x8Dnn
PDP11.opUndefined, // 0x8Enn
PDP11.opUndefined // 0x8Fnn
];
PDP11.aOp8DXn_1145 = [
PDP11.aOp8DXn_1140 = [
PDP11.opUndefined, // 0x8D0n
PDP11.opMFPD, // 0x8D4n 11/45+
PDP11.opMTPD, // 0x8D8n 11/45+