From cb4d054ead84d89cc324796f3efd1d6c91d7683d Mon Sep 17 00:00:00 2001 From: Jeff Parsons Date: Sat, 25 Feb 2017 16:21:21 -0800 Subject: [PATCH] Added preliminary first-order opcode dispatch table --- modules/pdp10/lib/cpuops.js | 637 ++++++++++++++++++++++++++++- modules/pdp10/lib/debugger.js | 43 +- modules/pdp10/lib/defines.js | 3 +- versions/pdpjs/1.34.0/pdp10-dbg.js | 4 +- 4 files changed, 665 insertions(+), 22 deletions(-) diff --git a/modules/pdp10/lib/cpuops.js b/modules/pdp10/lib/cpuops.js index 0a58ea825..cd815f4ff 100644 --- a/modules/pdp10/lib/cpuops.js +++ b/modules/pdp10/lib/cpuops.js @@ -33,7 +33,26 @@ if (NODE) { } /** - * opUUO(000000 000000) + * opUUO(0xx000 000000): Unimplemented User Operation + * + * From the DEC PDP-10 System Reference Manual (May 1968), p. 2-64: + * + * Store the instruction code, A and the effective address E in bits 0-8, 9-12 and 18-35 respectively of + * location 40; clear bits 13-17. Execute the instruction contained in location 41. The original contents + * of location 40 are lost. + * + * All of these codes are equivalent when they occur in the Monitor or when time sharing is not in effect. + * But when a UUO appears in a user program, a code in the range 001-037 uses relocated locations 40 and 41 + * (ie 40 and 41 in the user's block) and is thus entirely a part of and under control of the user program. + * + * A code in the range 040-077 on the other hand uses unrelocated 40 and 41, and the instruction in the latter + * location is under control of the Monitor; these codes are thus specifically for user communication with + * the Monitor, which interprets them (refer to the Monitor manual for the meanings of the various codes). + * + * The code 000 executes in the same way as 040-077 but is not a standard communication code: it is included + * so that control returns to the Monitor should a user program wipe itself out. + * + * For a second processor connected to the same memory, the UUO trap is locations 140-141 instead of 40-41. * * @this {CPUStatePDP10} * @param {number} opCode @@ -43,7 +62,22 @@ PDP10.opUUO = function(opCode) }; /** - * opUFA(130000 000000) + * opUFA(130000 000000): Unnormalized Floating Add + * + * From the DEC PDP-10 System Reference Manual (May 1968), p. 2-37: + * + * Floating add the contents of location E to AC. If the double length fraction in the sum is zero, clear + * accumulator A+1. Otherwise normalize the sum only if the magnitude of its fractional part is >= 1, and place + * the high order part of the result in AC A+1. The original contents of AC and E are unaffected. + * + * NOTE: The result is placed in accumulator A+1. T his is the only arithmetic instruction that stores the result + * in a second accumulator, leaving the original operands intact. + * + * If the exponent of the sum following the one-step normalization is > 127, set Overflow and Floating Overflow; + * the result stored has an exponent 256 less than the correct one. + * + * SIDEBAR: The exponent of the sum is equal to that of the larger summand unless addition of the fractions + * overflows, in which case it is greater by 1. Exponent overflow can occur only in the latter case. * * @this {CPUStatePDP10} * @param {number} opCode @@ -53,7 +87,15 @@ PDP10.opUFA = function(opCode) }; /** - * opDFN(131000 000000) + * opDFN(131000 000000): Double Floating Negate + * + * From the DEC PDP-10 System Reference Manual (May 1968), p. 2-37: + * + * Negate the double length floating point number composed of the contents of AC and location E with AC on the left. + * Do this by taking the twos complement of the number whose sign is AC bit 0, whose exponent is in AC bits 1-8, and + * whose fraction is the 54-bit string in bits 9-35 of AC and location E. Place the high order word of the result + * in AC; place the low order part of the fraction in bits 9-35 of location E without altering the original contents + * of bits 0-8 of that location. * * @this {CPUStatePDP10} * @param {number} opCode @@ -63,7 +105,28 @@ PDP10.opDFN = function(opCode) }; /** - * opFSC(132000 000000) + * opFSC(132000 000000): Floating Scale + * + * From the DEC PDP-10 System Reference Manual (May 1968), p. 2-34: + * + * If the fractional part of AC is zero, clear AC. Otherwise add the scale factor given by E to the exponent part + * of AC (thus multiplying AC by 2^E), normalize the resulting word bringing 0s into bit positions vacated at the + * right, and place the result back in AC. + * + * NOTE: A negative E is represented in standard twos complement notation, but the hardware compensates for this + * when scaling the exponent. + * + * If the exponent after normalization is > 127, set Overflow and Floating Overflow; the result stored has an + * exponent 256 less than the correct one. If < -128, set Overflow, Floating Overflow and Floating Underflow; + * the result stored has an exponent 256 greater than the correct one. + * + * SIDEBAR: This instruction can be used to float a fixed number with 27 or fewer significant bits. To float an + * integer contained within AC bits 9-35, + * + * FSC AC,233 + * + * inserts the correct exponent to move the binary point from the right end to the left of bit 9 and then normalizes + * (233(base 8) = 155(base 10) = 128 + 27). * * @this {CPUStatePDP10} * @param {number} opCode @@ -73,7 +136,23 @@ PDP10.opFSC = function(opCode) }; /** - * opIBP(133000 000000) + * opIBP(133000 000000): Increment Byte Pointer + * + * From the DEC PDP-10 System Reference Manual (May 1968), p. 2-16: + * + * Increment the byte pointer in location E as explained above. + * + * FROM ABOVE: To facilitate processing a series of bytes, several of the byte instructions increment the pointer, + * ie, modify it so that it points to the next byte position in a set of memory locations. Bytes are processed from + * left to right in a word, so incrementing merely replaces the current value of P by P - S, unless there is + * insufficient space in the present location for another byte of the specified size (P - S < 0). In this case Y is + * increased by one to point to the next consecutive location, and P is set to 36 - S to point to the first byte at + * the left in the new location. + * + * CAUTION: Do not allow Y to reach maximum value. The whole pointer is incremented, so if Y is 2^18 - 1 it becomes + * zero and X is also incremented. The address calculation for the pointer uses the original X, but if a priority + * interrupt should occur before the calculation is complete, the incremented X is used when the instruction is + * repeated. * * @this {CPUStatePDP10} * @param {number} opCode @@ -3681,3 +3760,551 @@ PDP10.opCONSZ = function(opCode) PDP10.opCONSO = function(opCode) { }; + +/** + * opIO(opCode) + * + * @this {CPUStatePDP10} + * @param {number} opCode + */ +PDP10.opIO = function(opCode) +{ + PDP10.opUndefined.call(this, opCode); +}; + +/** + * opUndefined() + * + * @this {CPUStatePDP10} + * @param {number} opCode + */ +PDP10.opUndefined = function(opCode) +{ +}; + +/** + * opKA10(opCode) + * + * @this {CPUStatePDP10} + * @param {number} opCode + */ +PDP10.opKA10 = function(opCode) +{ + var op = (opCode / PDP10.OPCODE.SHIFT)|0; + PDP10.aOpXXX_KA10[op].call(this, opCode); +}; + +PDP10.aOpXXX_KA10 = [ + PDP10.opUUO, // 0o000xxx yyyyyy + PDP10.opUUO, // 0o001xxx yyyyyy + PDP10.opUUO, // 0o002xxx yyyyyy + PDP10.opUUO, // 0o003xxx yyyyyy + PDP10.opUUO, // 0o004xxx yyyyyy + PDP10.opUUO, // 0o005xxx yyyyyy + PDP10.opUUO, // 0o006xxx yyyyyy + PDP10.opUUO, // 0o007xxx yyyyyy + PDP10.opUUO, // 0o010xxx yyyyyy + PDP10.opUUO, // 0o011xxx yyyyyy + PDP10.opUUO, // 0o012xxx yyyyyy + PDP10.opUUO, // 0o013xxx yyyyyy + PDP10.opUUO, // 0o014xxx yyyyyy + PDP10.opUUO, // 0o015xxx yyyyyy + PDP10.opUUO, // 0o016xxx yyyyyy + PDP10.opUUO, // 0o017xxx yyyyyy + PDP10.opUUO, // 0o020xxx yyyyyy + PDP10.opUUO, // 0o021xxx yyyyyy + PDP10.opUUO, // 0o022xxx yyyyyy + PDP10.opUUO, // 0o023xxx yyyyyy + PDP10.opUUO, // 0o024xxx yyyyyy + PDP10.opUUO, // 0o025xxx yyyyyy + PDP10.opUUO, // 0o026xxx yyyyyy + PDP10.opUUO, // 0o027xxx yyyyyy + PDP10.opUUO, // 0o030xxx yyyyyy + PDP10.opUUO, // 0o031xxx yyyyyy + PDP10.opUUO, // 0o032xxx yyyyyy + PDP10.opUUO, // 0o033xxx yyyyyy + PDP10.opUUO, // 0o034xxx yyyyyy + PDP10.opUUO, // 0o035xxx yyyyyy + PDP10.opUUO, // 0o036xxx yyyyyy + PDP10.opUUO, // 0o037xxx yyyyyy + PDP10.opUUO, // 0o040xxx yyyyyy + PDP10.opUUO, // 0o041xxx yyyyyy + PDP10.opUUO, // 0o042xxx yyyyyy + PDP10.opUUO, // 0o043xxx yyyyyy + PDP10.opUUO, // 0o044xxx yyyyyy + PDP10.opUUO, // 0o045xxx yyyyyy + PDP10.opUUO, // 0o046xxx yyyyyy + PDP10.opUUO, // 0o047xxx yyyyyy + PDP10.opUUO, // 0o050xxx yyyyyy + PDP10.opUUO, // 0o051xxx yyyyyy + PDP10.opUUO, // 0o052xxx yyyyyy + PDP10.opUUO, // 0o053xxx yyyyyy + PDP10.opUUO, // 0o054xxx yyyyyy + PDP10.opUUO, // 0o055xxx yyyyyy + PDP10.opUUO, // 0o056xxx yyyyyy + PDP10.opUUO, // 0o057xxx yyyyyy + PDP10.opUUO, // 0o060xxx yyyyyy + PDP10.opUUO, // 0o061xxx yyyyyy + PDP10.opUUO, // 0o062xxx yyyyyy + PDP10.opUUO, // 0o063xxx yyyyyy + PDP10.opUUO, // 0o064xxx yyyyyy + PDP10.opUUO, // 0o065xxx yyyyyy + PDP10.opUUO, // 0o066xxx yyyyyy + PDP10.opUUO, // 0o067xxx yyyyyy + PDP10.opUUO, // 0o070xxx yyyyyy + PDP10.opUUO, // 0o071xxx yyyyyy + PDP10.opUUO, // 0o072xxx yyyyyy + PDP10.opUUO, // 0o073xxx yyyyyy + PDP10.opUUO, // 0o074xxx yyyyyy + PDP10.opUUO, // 0o075xxx yyyyyy + PDP10.opUUO, // 0o076xxx yyyyyy + PDP10.opUUO, // 0o077xxx yyyyyy + PDP10.opUndefined, // 0o100xxx yyyyyy + PDP10.opUndefined, // 0o101xxx yyyyyy + PDP10.opUndefined, // 0o102xxx yyyyyy + PDP10.opUndefined, // 0o103xxx yyyyyy + PDP10.opUndefined, // 0o104xxx yyyyyy + PDP10.opUndefined, // 0o105xxx yyyyyy + PDP10.opUndefined, // 0o106xxx yyyyyy + PDP10.opUndefined, // 0o107xxx yyyyyy + PDP10.opUndefined, // 0o110xxx yyyyyy + PDP10.opUndefined, // 0o111xxx yyyyyy + PDP10.opUndefined, // 0o112xxx yyyyyy + PDP10.opUndefined, // 0o113xxx yyyyyy + PDP10.opUndefined, // 0o114xxx yyyyyy + PDP10.opUndefined, // 0o115xxx yyyyyy + PDP10.opUndefined, // 0o116xxx yyyyyy + PDP10.opUndefined, // 0o117xxx yyyyyy + PDP10.opUndefined, // 0o120xxx yyyyyy + PDP10.opUndefined, // 0o121xxx yyyyyy + PDP10.opUndefined, // 0o122xxx yyyyyy + PDP10.opUndefined, // 0o123xxx yyyyyy + PDP10.opUndefined, // 0o124xxx yyyyyy + PDP10.opUndefined, // 0o125xxx yyyyyy + PDP10.opUndefined, // 0o126xxx yyyyyy + PDP10.opUndefined, // 0o127xxx yyyyyy + PDP10.opUFA, // 0o130xxx yyyyyy + PDP10.opDFN, // 0o131xxx yyyyyy + PDP10.opFSC, // 0o132xxx yyyyyy + PDP10.opIBP, // 0o133xxx yyyyyy + PDP10.opILDB, // 0o134xxx yyyyyy + PDP10.opLDB, // 0o135xxx yyyyyy + PDP10.opIDPB, // 0o136xxx yyyyyy + PDP10.opDPB, // 0o137xxx yyyyyy + PDP10.opFAD, // 0o140xxx yyyyyy + PDP10.opFADI, // 0o141xxx yyyyyy + PDP10.opFADM, // 0o142xxx yyyyyy + PDP10.opFADB, // 0o143xxx yyyyyy + PDP10.opFADR, // 0o144xxx yyyyyy + PDP10.opFADRI, // 0o145xxx yyyyyy + PDP10.opFADRM, // 0o146xxx yyyyyy + PDP10.opFADRB, // 0o147xxx yyyyyy + PDP10.opFSB, // 0o150xxx yyyyyy + PDP10.opFSBI, // 0o151xxx yyyyyy + PDP10.opFSBM, // 0o152xxx yyyyyy + PDP10.opFSBB, // 0o153xxx yyyyyy + PDP10.opFSBR, // 0o154xxx yyyyyy + PDP10.opFSBRI, // 0o155xxx yyyyyy + PDP10.opFSBRM, // 0o156xxx yyyyyy + PDP10.opFSBRB, // 0o157xxx yyyyyy + PDP10.opFMP, // 0o160xxx yyyyyy + PDP10.opFMPI, // 0o161xxx yyyyyy + PDP10.opFMPM, // 0o162xxx yyyyyy + PDP10.opFMPB, // 0o163xxx yyyyyy + PDP10.opFMPR, // 0o164xxx yyyyyy + PDP10.opFMPRI, // 0o165xxx yyyyyy + PDP10.opFMPRM, // 0o166xxx yyyyyy + PDP10.opFMPRB, // 0o167xxx yyyyyy + PDP10.opFDV, // 0o170xxx yyyyyy + PDP10.opFDVI, // 0o171xxx yyyyyy + PDP10.opFDVM, // 0o172xxx yyyyyy + PDP10.opFDVB, // 0o173xxx yyyyyy + PDP10.opFDVR, // 0o174xxx yyyyyy + PDP10.opFDVRI, // 0o175xxx yyyyyy + PDP10.opFDVRM, // 0o176xxx yyyyyy + PDP10.opFDVRB, // 0o177xxx yyyyyy + PDP10.opMOV, // 0o200xxx yyyyyy + PDP10.opMOVI, // 0o201xxx yyyyyy + PDP10.opMOVM, // 0o202xxx yyyyyy + PDP10.opMOVS, // 0o203xxx yyyyyy + PDP10.opMOVS, // 0o204xxx yyyyyy + PDP10.opMOVSI, // 0o205xxx yyyyyy + PDP10.opMOVSM, // 0o206xxx yyyyyy + PDP10.opMOVSS, // 0o207xxx yyyyyy + PDP10.opMOVN, // 0o210xxx yyyyyy + PDP10.opMOVNI, // 0o211xxx yyyyyy + PDP10.opMOVNM, // 0o212xxx yyyyyy + PDP10.opMOVNS, // 0o213xxx yyyyyy + PDP10.opMOVM, // 0o214xxx yyyyyy + PDP10.opMOVMI, // 0o215xxx yyyyyy + PDP10.opMOVMM, // 0o216xxx yyyyyy + PDP10.opMOVMS, // 0o217xxx yyyyyy + PDP10.opIMUL, // 0o220xxx yyyyyy + PDP10.opIMULI, // 0o221xxx yyyyyy + PDP10.opIMULM, // 0o222xxx yyyyyy + PDP10.opIMULB, // 0o223xxx yyyyyy + PDP10.opMUL, // 0o224xxx yyyyyy + PDP10.opMULI, // 0o225xxx yyyyyy + PDP10.opMULM, // 0o226xxx yyyyyy + PDP10.opMULB, // 0o227xxx yyyyyy + PDP10.opIDIV, // 0o230xxx yyyyyy + PDP10.opIDIVI, // 0o231xxx yyyyyy + PDP10.opIDIVM, // 0o232xxx yyyyyy + PDP10.opIDIVB, // 0o233xxx yyyyyy + PDP10.opDIV, // 0o234xxx yyyyyy + PDP10.opDIVI, // 0o235xxx yyyyyy + PDP10.opDIVM, // 0o236xxx yyyyyy + PDP10.opDIVB, // 0o237xxx yyyyyy + PDP10.opASH, // 0o240xxx yyyyyy + PDP10.opROT, // 0o241xxx yyyyyy + PDP10.opLSH, // 0o242xxx yyyyyy + PDP10.opJFFO, // 0o243xxx yyyyyy + PDP10.opASHC, // 0o244xxx yyyyyy + PDP10.opROTC, // 0o245xxx yyyyyy + PDP10.opLSHC, // 0o246xxx yyyyyy + PDP10.opUndefined, // 0o247xxx yyyyyy + PDP10.opEXCH, // 0o250xxx yyyyyy + PDP10.opBLT, // 0o251xxx yyyyyy + PDP10.opAOBJP, // 0o252xxx yyyyyy + PDP10.opAOBJN, // 0o253xxx yyyyyy + PDP10.opJRST, // 0o254xxx yyyyyy + PDP10.opJFCL, // 0o255xxx yyyyyy + PDP10.opXCT, // 0o256xxx yyyyyy + PDP10.opUndefined, // 0o257xxx yyyyyy + PDP10.opPUSHJ, // 0o260xxx yyyyyy + PDP10.opPUSH, // 0o261xxx yyyyyy + PDP10.opPOP, // 0o262xxx yyyyyy + PDP10.opPOPJ, // 0o263xxx yyyyyy + PDP10.opJSR, // 0o264xxx yyyyyy + PDP10.opJSP, // 0o265xxx yyyyyy + PDP10.opJSA, // 0o266xxx yyyyyy + PDP10.opJRA, // 0o267xxx yyyyyy + PDP10.opADD, // 0o270xxx yyyyyy + PDP10.opADDI, // 0o271xxx yyyyyy + PDP10.opADDM, // 0o272xxx yyyyyy + PDP10.opADDB, // 0o273xxx yyyyyy + PDP10.opSUB, // 0o274xxx yyyyyy + PDP10.opSUBI, // 0o275xxx yyyyyy + PDP10.opSUBM, // 0o276xxx yyyyyy + PDP10.opSUBB, // 0o277xxx yyyyyy + PDP10.opCAI, // 0o300xxx yyyyyy + PDP10.opCAIL, // 0o301xxx yyyyyy + PDP10.opCAIE, // 0o302xxx yyyyyy + PDP10.opCAILE, // 0o303xxx yyyyyy + PDP10.opCAIA, // 0o304xxx yyyyyy + PDP10.opCAIGE, // 0o305xxx yyyyyy + PDP10.opCAIN, // 0o306xxx yyyyyy + PDP10.opCAIG, // 0o307xxx yyyyyy + PDP10.opCA, // 0o310xxx yyyyyy + PDP10.opCAL, // 0o311xxx yyyyyy + PDP10.opCAE, // 0o312xxx yyyyyy + PDP10.opCALE, // 0o313xxx yyyyyy + PDP10.opCAA, // 0o314xxx yyyyyy + PDP10.opCAGE, // 0o315xxx yyyyyy + PDP10.opCAN, // 0o316xxx yyyyyy + PDP10.opCAG, // 0o317xxx yyyyyy + PDP10.opJUMP, // 0o320xxx yyyyyy + PDP10.opJUMPL, // 0o321xxx yyyyyy + PDP10.opJUMPE, // 0o322xxx yyyyyy + PDP10.opJUMPLE, // 0o323xxx yyyyyy + PDP10.opJUMPA, // 0o324xxx yyyyyy + PDP10.opJUMPGE, // 0o325xxx yyyyyy + PDP10.opJUMPN, // 0o326xxx yyyyyy + PDP10.opJUMPG, // 0o327xxx yyyyyy + PDP10.opSKIP, // 0o330xxx yyyyyy + PDP10.opSKIPL, // 0o331xxx yyyyyy + PDP10.opSKIPE, // 0o332xxx yyyyyy + PDP10.opSKIPLE, // 0o333xxx yyyyyy + PDP10.opSKIPA, // 0o334xxx yyyyyy + PDP10.opSKIPGE, // 0o335xxx yyyyyy + PDP10.opSKIPN, // 0o336xxx yyyyyy + PDP10.opSKIPG, // 0o337xxx yyyyyy + PDP10.opAOJ, // 0o340xxx yyyyyy + PDP10.opAOJL, // 0o341xxx yyyyyy + PDP10.opAOJE, // 0o342xxx yyyyyy + PDP10.opAOJLE, // 0o343xxx yyyyyy + PDP10.opAOJA, // 0o344xxx yyyyyy + PDP10.opAOJGE, // 0o345xxx yyyyyy + PDP10.opAOJN, // 0o346xxx yyyyyy + PDP10.opAOJG, // 0o347xxx yyyyyy + PDP10.opAOS, // 0o350xxx yyyyyy + PDP10.opAOSL, // 0o351xxx yyyyyy + PDP10.opAOSE, // 0o352xxx yyyyyy + PDP10.opAOSLE, // 0o353xxx yyyyyy + PDP10.opAOSA, // 0o354xxx yyyyyy + PDP10.opAOSGE, // 0o355xxx yyyyyy + PDP10.opAOSN, // 0o356xxx yyyyyy + PDP10.opAOSG, // 0o357xxx yyyyyy + PDP10.opSOJ, // 0o360xxx yyyyyy + PDP10.opSOJL, // 0o361xxx yyyyyy + PDP10.opSOJE, // 0o362xxx yyyyyy + PDP10.opSOJLE, // 0o363xxx yyyyyy + PDP10.opSOJA, // 0o364xxx yyyyyy + PDP10.opSOJGE, // 0o365xxx yyyyyy + PDP10.opSOJN, // 0o366xxx yyyyyy + PDP10.opSOJG, // 0o367xxx yyyyyy + PDP10.opSOS, // 0o370xxx yyyyyy + PDP10.opSOSL, // 0o371xxx yyyyyy + PDP10.opSOSE, // 0o372xxx yyyyyy + PDP10.opSOSLE, // 0o373xxx yyyyyy + PDP10.opSOSA, // 0o374xxx yyyyyy + PDP10.opSOSGE, // 0o375xxx yyyyyy + PDP10.opSOSN, // 0o376xxx yyyyyy + PDP10.opSOSG, // 0o377xxx yyyyyy + PDP10.opSETZ, // 0o400xxx yyyyyy + PDP10.opSETZI, // 0o401xxx yyyyyy + PDP10.opSETZM, // 0o402xxx yyyyyy + PDP10.opSETZB, // 0o403xxx yyyyyy + PDP10.opAND, // 0o404xxx yyyyyy + PDP10.opANDI, // 0o405xxx yyyyyy + PDP10.opANDM, // 0o406xxx yyyyyy + PDP10.opANDB, // 0o407xxx yyyyyy + PDP10.opANDCA, // 0o410xxx yyyyyy + PDP10.opANDCAI, // 0o411xxx yyyyyy + PDP10.opANDCAM, // 0o412xxx yyyyyy + PDP10.opANDCAB, // 0o413xxx yyyyyy + PDP10.opSETM, // 0o414xxx yyyyyy + PDP10.opSETMI, // 0o415xxx yyyyyy + PDP10.opSETMM, // 0o416xxx yyyyyy + PDP10.opSETMB, // 0o417xxx yyyyyy + PDP10.opANDCM, // 0o420xxx yyyyyy + PDP10.opANDCMI, // 0o421xxx yyyyyy + PDP10.opANDCMM, // 0o422xxx yyyyyy + PDP10.opANDCMB, // 0o423xxx yyyyyy + PDP10.opSETA, // 0o424xxx yyyyyy + PDP10.opSETAI, // 0o425xxx yyyyyy + PDP10.opSETAM, // 0o426xxx yyyyyy + PDP10.opSETAB, // 0o427xxx yyyyyy + PDP10.opXOR, // 0o430xxx yyyyyy + PDP10.opXORI, // 0o431xxx yyyyyy + PDP10.opXORM, // 0o432xxx yyyyyy + PDP10.opXORB, // 0o433xxx yyyyyy + PDP10.opIOR, // 0o434xxx yyyyyy + PDP10.opIORI, // 0o435xxx yyyyyy + PDP10.opIORM, // 0o436xxx yyyyyy + PDP10.opIORB, // 0o437xxx yyyyyy + PDP10.opANDCB, // 0o440xxx yyyyyy + PDP10.opANDCBI, // 0o441xxx yyyyyy + PDP10.opANDCBM, // 0o442xxx yyyyyy + PDP10.opANDCBB, // 0o443xxx yyyyyy + PDP10.opEQV, // 0o444xxx yyyyyy + PDP10.opEQVI, // 0o445xxx yyyyyy + PDP10.opEQVM, // 0o446xxx yyyyyy + PDP10.opEQVB, // 0o447xxx yyyyyy + PDP10.opSETCA, // 0o450xxx yyyyyy + PDP10.opSETCAI, // 0o451xxx yyyyyy + PDP10.opSETCAM, // 0o452xxx yyyyyy + PDP10.opSETCAB, // 0o453xxx yyyyyy + PDP10.opORCA, // 0o454xxx yyyyyy + PDP10.opORCAI, // 0o455xxx yyyyyy + PDP10.opORCAM, // 0o456xxx yyyyyy + PDP10.opORCAB, // 0o457xxx yyyyyy + PDP10.opSETCM, // 0o460xxx yyyyyy + PDP10.opSETCMI, // 0o461xxx yyyyyy + PDP10.opSETCMM, // 0o462xxx yyyyyy + PDP10.opSETCMB, // 0o463xxx yyyyyy + PDP10.opORCM, // 0o464xxx yyyyyy + PDP10.opORCMI, // 0o465xxx yyyyyy + PDP10.opORCMM, // 0o466xxx yyyyyy + PDP10.opORCMB, // 0o467xxx yyyyyy + PDP10.opORCB, // 0o470xxx yyyyyy + PDP10.opORCBI, // 0o471xxx yyyyyy + PDP10.opORCBM, // 0o472xxx yyyyyy + PDP10.opORCBB, // 0o473xxx yyyyyy + PDP10.opSETO, // 0o474xxx yyyyyy + PDP10.opSETOI, // 0o475xxx yyyyyy + PDP10.opSETOM, // 0o476xxx yyyyyy + PDP10.opSETOB, // 0o477xxx yyyyyy + PDP10.opHLL, // 0o500xxx yyyyyy + PDP10.opHLLI, // 0o501xxx yyyyyy + PDP10.opHLLM, // 0o502xxx yyyyyy + PDP10.opHLLS, // 0o503xxx yyyyyy + PDP10.opHRL, // 0o504xxx yyyyyy + PDP10.opHRLI, // 0o505xxx yyyyyy + PDP10.opHRLM, // 0o506xxx yyyyyy + PDP10.opHRLS, // 0o507xxx yyyyyy + PDP10.opHLLZ, // 0o510xxx yyyyyy + PDP10.opHLLZI, // 0o511xxx yyyyyy + PDP10.opHLLZM, // 0o512xxx yyyyyy + PDP10.opHLLZS, // 0o513xxx yyyyyy + PDP10.opHRLZ, // 0o514xxx yyyyyy + PDP10.opHRLZI, // 0o515xxx yyyyyy + PDP10.opHRLZM, // 0o516xxx yyyyyy + PDP10.opHRLZS, // 0o517xxx yyyyyy + PDP10.opHLLO, // 0o520xxx yyyyyy + PDP10.opHLLOI, // 0o521xxx yyyyyy + PDP10.opHLLOM, // 0o522xxx yyyyyy + PDP10.opHLLOS, // 0o523xxx yyyyyy + PDP10.opHRLO, // 0o524xxx yyyyyy + PDP10.opHRLOI, // 0o525xxx yyyyyy + PDP10.opHRLOM, // 0o526xxx yyyyyy + PDP10.opHRLOS, // 0o527xxx yyyyyy + PDP10.opHLLE, // 0o530xxx yyyyyy + PDP10.opHLLEI, // 0o531xxx yyyyyy + PDP10.opHLLEM, // 0o532xxx yyyyyy + PDP10.opHLLES, // 0o533xxx yyyyyy + PDP10.opHRLE, // 0o534xxx yyyyyy + PDP10.opHRLEI, // 0o535xxx yyyyyy + PDP10.opHRLEM, // 0o536xxx yyyyyy + PDP10.opHRLES, // 0o537xxx yyyyyy + PDP10.opHRR, // 0o540xxx yyyyyy + PDP10.opHRRI, // 0o541xxx yyyyyy + PDP10.opHRRM, // 0o542xxx yyyyyy + PDP10.opHRRS, // 0o543xxx yyyyyy + PDP10.opHLR, // 0o544xxx yyyyyy + PDP10.opHLRI, // 0o545xxx yyyyyy + PDP10.opHLRM, // 0o546xxx yyyyyy + PDP10.opHLRS, // 0o547xxx yyyyyy + PDP10.opHRRZ, // 0o550xxx yyyyyy + PDP10.opHRRZI, // 0o551xxx yyyyyy + PDP10.opHRRZM, // 0o552xxx yyyyyy + PDP10.opHRRZS, // 0o553xxx yyyyyy + PDP10.opHLRZ, // 0o554xxx yyyyyy + PDP10.opHLRZI, // 0o555xxx yyyyyy + PDP10.opHLRZM, // 0o556xxx yyyyyy + PDP10.opHLRZS, // 0o557xxx yyyyyy + PDP10.opHRRO, // 0o560xxx yyyyyy + PDP10.opHRROI, // 0o561xxx yyyyyy + PDP10.opHRROM, // 0o562xxx yyyyyy + PDP10.opHRROS, // 0o563xxx yyyyyy + PDP10.opHLRO, // 0o564xxx yyyyyy + PDP10.opHLROI, // 0o565xxx yyyyyy + PDP10.opHLROM, // 0o566xxx yyyyyy + PDP10.opHLROS, // 0o567xxx yyyyyy + PDP10.opHRRE, // 0o570xxx yyyyyy + PDP10.opHRREI, // 0o571xxx yyyyyy + PDP10.opHRREM, // 0o572xxx yyyyyy + PDP10.opHRRES, // 0o573xxx yyyyyy + PDP10.opHLRE, // 0o574xxx yyyyyy + PDP10.opHLREI, // 0o575xxx yyyyyy + PDP10.opHLREM, // 0o576xxx yyyyyy + PDP10.opHLRES, // 0o577xxx yyyyyy + PDP10.opTRN, // 0o600xxx yyyyyy + PDP10.opTLN, // 0o601xxx yyyyyy + PDP10.opTRNE, // 0o602xxx yyyyyy + PDP10.opTLNE, // 0o603xxx yyyyyy + PDP10.opTRNA, // 0o604xxx yyyyyy + PDP10.opTLNA, // 0o605xxx yyyyyy + PDP10.opTRNN, // 0o606xxx yyyyyy + PDP10.opTLNN, // 0o607xxx yyyyyy + PDP10.opTDN, // 0o610xxx yyyyyy + PDP10.opTSN, // 0o611xxx yyyyyy + PDP10.opTDNE, // 0o612xxx yyyyyy + PDP10.opTSNE, // 0o613xxx yyyyyy + PDP10.opTDNA, // 0o614xxx yyyyyy + PDP10.opTSNA, // 0o615xxx yyyyyy + PDP10.opTDNN, // 0o616xxx yyyyyy + PDP10.opTSNN, // 0o617xxx yyyyyy + PDP10.opTRZ, // 0o620xxx yyyyyy + PDP10.opTLZ, // 0o621xxx yyyyyy + PDP10.opTRZE, // 0o622xxx yyyyyy + PDP10.opTLZE, // 0o623xxx yyyyyy + PDP10.opTRZA, // 0o624xxx yyyyyy + PDP10.opTLZA, // 0o625xxx yyyyyy + PDP10.opTRZN, // 0o626xxx yyyyyy + PDP10.opTLZN, // 0o627xxx yyyyyy + PDP10.opTDZ, // 0o630xxx yyyyyy + PDP10.opTSZ, // 0o631xxx yyyyyy + PDP10.opTDZE, // 0o632xxx yyyyyy + PDP10.opTSZE, // 0o633xxx yyyyyy + PDP10.opTDZA, // 0o634xxx yyyyyy + PDP10.opTSZA, // 0o635xxx yyyyyy + PDP10.opTDZN, // 0o636xxx yyyyyy + PDP10.opTSZN, // 0o637xxx yyyyyy + PDP10.opTRC, // 0o640xxx yyyyyy + PDP10.opTLC, // 0o641xxx yyyyyy + PDP10.opTRCE, // 0o642xxx yyyyyy + PDP10.opTLCE, // 0o643xxx yyyyyy + PDP10.opTRCA, // 0o644xxx yyyyyy + PDP10.opTLCA, // 0o645xxx yyyyyy + PDP10.opTRCN, // 0o646xxx yyyyyy + PDP10.opTLCN, // 0o647xxx yyyyyy + PDP10.opTDC, // 0o650xxx yyyyyy + PDP10.opTSC, // 0o651xxx yyyyyy + PDP10.opTDCE, // 0o652xxx yyyyyy + PDP10.opTSCE, // 0o653xxx yyyyyy + PDP10.opTDCA, // 0o654xxx yyyyyy + PDP10.opTSCA, // 0o655xxx yyyyyy + PDP10.opTDCN, // 0o656xxx yyyyyy + PDP10.opTSCN, // 0o657xxx yyyyyy + PDP10.opTRO, // 0o660xxx yyyyyy + PDP10.opTLO, // 0o661xxx yyyyyy + PDP10.opTROE, // 0o662xxx yyyyyy + PDP10.opTLOE, // 0o663xxx yyyyyy + PDP10.opTROA, // 0o664xxx yyyyyy + PDP10.opTLOA, // 0o665xxx yyyyyy + PDP10.opTRON, // 0o666xxx yyyyyy + PDP10.opTLON, // 0o667xxx yyyyyy + PDP10.opTDO, // 0o670xxx yyyyyy + PDP10.opTSO, // 0o671xxx yyyyyy + PDP10.opTDOE, // 0o672xxx yyyyyy + PDP10.opTSOE, // 0o673xxx yyyyyy + PDP10.opTDOA, // 0o674xxx yyyyyy + PDP10.opTSOA, // 0o675xxx yyyyyy + PDP10.opTDON, // 0o676xxx yyyyyy + PDP10.opTSON, // 0o677xxx yyyyyy + PDP10.opIO, // 0o700xxx yyyyyy + PDP10.opIO, // 0o701xxx yyyyyy + PDP10.opIO, // 0o702xxx yyyyyy + PDP10.opIO, // 0o703xxx yyyyyy + PDP10.opIO, // 0o704xxx yyyyyy + PDP10.opIO, // 0o705xxx yyyyyy + PDP10.opIO, // 0o706xxx yyyyyy + PDP10.opIO, // 0o707xxx yyyyyy + PDP10.opIO, // 0o710xxx yyyyyy + PDP10.opIO, // 0o711xxx yyyyyy + PDP10.opIO, // 0o712xxx yyyyyy + PDP10.opIO, // 0o713xxx yyyyyy + PDP10.opIO, // 0o714xxx yyyyyy + PDP10.opIO, // 0o715xxx yyyyyy + PDP10.opIO, // 0o716xxx yyyyyy + PDP10.opIO, // 0o717xxx yyyyyy + PDP10.opIO, // 0o720xxx yyyyyy + PDP10.opIO, // 0o721xxx yyyyyy + PDP10.opIO, // 0o722xxx yyyyyy + PDP10.opIO, // 0o723xxx yyyyyy + PDP10.opIO, // 0o724xxx yyyyyy + PDP10.opIO, // 0o725xxx yyyyyy + PDP10.opIO, // 0o726xxx yyyyyy + PDP10.opIO, // 0o727xxx yyyyyy + PDP10.opIO, // 0o730xxx yyyyyy + PDP10.opIO, // 0o731xxx yyyyyy + PDP10.opIO, // 0o732xxx yyyyyy + PDP10.opIO, // 0o733xxx yyyyyy + PDP10.opIO, // 0o734xxx yyyyyy + PDP10.opIO, // 0o735xxx yyyyyy + PDP10.opIO, // 0o736xxx yyyyyy + PDP10.opIO, // 0o737xxx yyyyyy + PDP10.opIO, // 0o740xxx yyyyyy + PDP10.opIO, // 0o741xxx yyyyyy + PDP10.opIO, // 0o742xxx yyyyyy + PDP10.opIO, // 0o743xxx yyyyyy + PDP10.opIO, // 0o744xxx yyyyyy + PDP10.opIO, // 0o745xxx yyyyyy + PDP10.opIO, // 0o746xxx yyyyyy + PDP10.opIO, // 0o747xxx yyyyyy + PDP10.opIO, // 0o750xxx yyyyyy + PDP10.opIO, // 0o751xxx yyyyyy + PDP10.opIO, // 0o752xxx yyyyyy + PDP10.opIO, // 0o753xxx yyyyyy + PDP10.opIO, // 0o754xxx yyyyyy + PDP10.opIO, // 0o755xxx yyyyyy + PDP10.opIO, // 0o756xxx yyyyyy + PDP10.opIO, // 0o757xxx yyyyyy + PDP10.opIO, // 0o760xxx yyyyyy + PDP10.opIO, // 0o761xxx yyyyyy + PDP10.opIO, // 0o762xxx yyyyyy + PDP10.opIO, // 0o763xxx yyyyyy + PDP10.opIO, // 0o764xxx yyyyyy + PDP10.opIO, // 0o765xxx yyyyyy + PDP10.opIO, // 0o766xxx yyyyyy + PDP10.opIO, // 0o767xxx yyyyyy + PDP10.opIO, // 0o770xxx yyyyyy + PDP10.opIO, // 0o771xxx yyyyyy + PDP10.opIO, // 0o772xxx yyyyyy + PDP10.opIO, // 0o773xxx yyyyyy + PDP10.opIO, // 0o774xxx yyyyyy + PDP10.opIO, // 0o775xxx yyyyyy + PDP10.opIO, // 0o776xxx yyyyyy + PDP10.opIO // 0o777xxx yyyyyy +]; diff --git a/modules/pdp10/lib/debugger.js b/modules/pdp10/lib/debugger.js index aba9f472a..6f472e9f9 100644 --- a/modules/pdp10/lib/debugger.js +++ b/modules/pdp10/lib/debugger.js @@ -3460,23 +3460,29 @@ class DebuggerPDP10 extends Debugger { */ doTest() { - var aOps = {}; - var sOperation; - for (var op = 0o00000; op <= 0o77774; op += 4) { - var opCode = op * Math.pow(2, 21); + var ops = {}, aOpXXX = []; + var op, opXXX, opCode, sOperation; + for (op = 0o00000; op <= 0o77774; op += 4) { + opCode = op * Math.pow(2, 21); sOperation = this.findInstruction(opCode, false); if (!sOperation) continue; - if (aOps[sOperation] === undefined) { - aOps[sOperation] = op; + if (ops[sOperation] === undefined) { + ops[sOperation] = op; } else { - aOps[sOperation] &= op; + ops[sOperation] &= op; + } + opXXX = op >> 6; + if (!aOpXXX[opXXX]) { + aOpXXX[opXXX] = sOperation; + } else if (aOpXXX[opXXX] != sOperation) { + aOpXXX[opXXX] = "XXX"; } } - for (sOperation in aOps) { - if (sOperation == null) continue; - this.println(sOperation + ": " + this.toStrWord(aOps[sOperation] * Math.pow(2, 21))); + for (sOperation in ops) { + op = ops[sOperation]; + this.println(sOperation + ": " + this.toStrWord(op * Math.pow(2, 21))); // this.println("/**"); - // this.println(" * op" + sOperation + "(" + this.toStrWord(aOps[sOperation] * Math.pow(2, 21)) + ")"); + // this.println(" * op" + sOperation + "(" + this.toStrWord(op * Math.pow(2, 21)) + ")"); // this.println(" *"); // this.println(" * @this {CPUStatePDP10}"); // this.println(" * @param {number} opCode"); @@ -3485,6 +3491,15 @@ class DebuggerPDP10 extends Debugger { // this.println("{"); // this.println("};\n"); } + // this.println("PDP10.aOpXXX = ["); + // for (opXXX = 0o000; opXXX <= 0o777; opXXX++) { + // sOperation = aOpXXX[opXXX]; + // sOperation = sOperation? (" PDP10.op" + sOperation + ",") : " PDP10.opUndefined,"; + // sOperation = Str.pad(sOperation, 32); + // sOperation += "// " + Str.toOct(opXXX, 3, true) + "xxx yyyyyy"; + // this.println(sOperation); + // } + // this.println("];"); } /** @@ -3652,6 +3667,9 @@ if (DEBUGGER) { * we're done; otherwise, we must set set R to [E] and repeat the process. */ DebuggerPDP10.OPTABLE = { + [PDP10.OPCODE.OPUUO]: { // 0o70000 + 0o00000: DebuggerPDP10.OPS.UUO + }, [PDP10.OPCODE.OPMASK]: { // 0o77700 0o13000: DebuggerPDP10.OPS.UFA, 0o13100: DebuggerPDP10.OPS.DFN, @@ -3761,9 +3779,6 @@ if (DEBUGGER) { 0o70024: DebuggerPDP10.OPS.CONI, 0o70030: DebuggerPDP10.OPS.CONSZ, 0o70034: DebuggerPDP10.OPS.CONSO - }, - [PDP10.OPCODE.OPUUO]: { // 0o70000 - 0o00000: DebuggerPDP10.OPS.UUO } }; diff --git a/modules/pdp10/lib/defines.js b/modules/pdp10/lib/defines.js index dfa55c8e0..b4d1121cb 100644 --- a/modules/pdp10/lib/defines.js +++ b/modules/pdp10/lib/defines.js @@ -108,13 +108,14 @@ var PDP10 = { OPMODE: 0o77400, // operation with mode OPCOMP: 0o77000, // operation with compare OPTEST: 0o71100, // operation with test - OPIO: 0o70034, // input-output instructions + OPIO: 0o70034, // input-output operation OPUUO: 0o70000, // unimplemented user operation (UUO) mask OPSHIFT: Math.pow(2, 21), // operation shift FNSHIFT: 23, // accumulator/function shift FNMASK: 0o17, // accumulator/function mask (after shift) IOSHIFT: Math.pow(2, 26), // input-output device code shift IOMASK: 0o177, // input-output device code mask (after shift) + SHIFT: Math.pow(2, 27), // operation code shift Y_MASK: 0o777777, X_SHIFT: 18, X_MASK: 0o17, diff --git a/versions/pdpjs/1.34.0/pdp10-dbg.js b/versions/pdpjs/1.34.0/pdp10-dbg.js index 2e508274a..95499a139 100644 --- a/versions/pdpjs/1.34.0/pdp10-dbg.js +++ b/versions/pdpjs/1.34.0/pdp10-dbg.js @@ -170,8 +170,8 @@ a.ba);break;case "cs":var fb;void 0!==g[3]&&(fb=+g[3]);switch(g[2]){case "int":a a.f("\tbase #\t\tset default base to #"),a.f("\tcs int #\tset checksum cycle interval to #"),a.f("\tcs start #\tset checksum cycle start count to #"),a.f("\tcs stop #\tset checksum cycle stop count to #"),a.f("\tsp #\t\tset speed multiplier to #")}break;case "t":Le(a,g[0],g[1]);break;case "u":Sd(a,g[1],g[2],8);break;case "v":if("var"==g[0]){Ie(a,b.substr(3))||(d=!1);break}if("ver"==g[0]){a.f((Ab||"PDP10")+" version 1.34.0 ("+a.b.Za+",RELEASE)");a.f(window?window.navigator.userAgent:"");break}f=!0; break;case "?":if(g[1]){Ke(a,b.substr(1));break}var Dc="commands:",Ec;for(Ec in Ne)Dc+="\n"+Xa(Ec,9)+Ne[Ec];jd(a)||(Dc+="\nnote: history disabled if no exec breakpoints");a.f(Dc);break;default:f=!0}f&&(a.f("unknown command: "+b),d=!1)}}catch(ue){a.f("debugger error: "+(ue.stack||ue.message)),d=!1}return d}function Yc(a,b,c){b=ud(a,b,c);for(var d in b)if(!Fe(a,b[+d]))return!1;return!0} var Ne={"?":"help/print","a [#]":"assemble","b [#]":"breakpoint",c:"clear output","d [#]":"dump memory","e [#]":"edit memory","g [#]":"go [to #]",h:"halt","if":"eval expression","int [#]":"request interrupt",k:"stack trace",ln:"list nearest symbol(s)",m:"messages",p:"step over",print:"print expression",r:"dump/set registers",reset:"reset machine",s:"set options","t [#]":"trace","u [#]":"unassemble","var":"assign variable",ver:"print version"},Ae=20,Be=".WORD HLL HLLZ HLLO HLLE HRL HRLZ HRLO HRLE HRR HRRZ HRRO HRRE HLR HLRZ HLRO HLRE MOV MOVS MOVN MOVM EXCH BLT PUSH POP LDB DPB IBP ILDB IDPB SETZ SETO SETA SETCA SETM SETCM AND ANDCA ANDCM ANDCB IOR ORCA ORCM ORCB XOR EQV LSH LSHC ROT ROTC ADD SUB MUL IMUL DIV IDIV ASH ASHC FSC FADR FSBR FMPR FDVR DFN UFA FAD FSB FMP FDV AOBJP AOBJN CAI CA JUMP SKIP AOJ AOS SOJ SOS TR TL TD TS XCT JFFO JFCL JSR JSP JRST JSA JRA PUSHJ POPJ BLKI DATAI BLKO DATAO CONO CONI CONSZ CONSO UUO".split(" "), -Md=0,Ld=["PC"],Oe={},we=(Oe[32704]={5632:64,5696:63,5760:58,5824:27,5888:28,5952:25,6016:29,6080:26,10240:56,10304:48,10368:46,10432:84,10496:57,10560:49,10624:47,10752:21,10816:22,10880:69,10944:70,11008:88,11072:85,11136:83,11264:91,11328:23,11392:24,11456:92,11520:86,11584:87,11648:89,11712:90},Oe[32512]={6144:65,6400:59,6656:66,6912:60,7168:67,7424:61,7680:68,7936:62,8192:17,8448:18,8704:19,8960:Ae,9216:53,9472:52,9728:55,9984:54,11776:50,12032:51,16384:30,16640:36,16896:37,17152:34,17408:38, -17664:32,17920:44,18176:40,18432:39,18688:45,18944:33,19200:41,19456:35,19712:42,19968:43,20224:31,20480:1,20736:5,20992:2,21248:6,21504:3,21760:7,22016:4,22272:8,22528:9,22784:13,23040:10,23296:14,23552:11,23808:15,24064:12,24320:16},Oe[32256]={12288:71,12800:72,13312:73,13824:74,14336:75,14848:76,15360:77,15872:78},Oe[29248]={24576:79,24640:80,25088:81,25152:82},Oe[28700]={28672:93,28676:94,28680:95,28684:96,28688:97,28692:98,28696:99,28700:100},Oe[28672]={0:101},Oe),xe=["","I","M","S"],ye=" L E LE A GE N G".split(" "), +Md=0,Ld=["PC"],Oe={},we=(Oe[28672]={0:101},Oe[32704]={5632:64,5696:63,5760:58,5824:27,5888:28,5952:25,6016:29,6080:26,10240:56,10304:48,10368:46,10432:84,10496:57,10560:49,10624:47,10752:21,10816:22,10880:69,10944:70,11008:88,11072:85,11136:83,11264:91,11328:23,11392:24,11456:92,11520:86,11584:87,11648:89,11712:90},Oe[32512]={6144:65,6400:59,6656:66,6912:60,7168:67,7424:61,7680:68,7936:62,8192:17,8448:18,8704:19,8960:Ae,9216:53,9472:52,9728:55,9984:54,11776:50,12032:51,16384:30,16640:36,16896:37, +17152:34,17408:38,17664:32,17920:44,18176:40,18432:39,18688:45,18944:33,19200:41,19456:35,19712:42,19968:43,20224:31,20480:1,20736:5,20992:2,21248:6,21504:3,21760:7,22016:4,22272:8,22528:9,22784:13,23040:10,23296:14,23552:11,23808:15,24064:12,24320:16},Oe[32256]={12288:71,12800:72,13312:73,13824:74,14336:75,14848:76,15360:77,15872:78},Oe[29248]={24576:79,24640:80,25088:81,25152:82},Oe[28700]={28672:93,28676:94,28680:95,28684:96,28688:97,28692:98,28696:99,28700:100},Oe),xe=["","I","M","S"],ye=" L E LE A GE N G".split(" "), ze="N NE NA NN Z ZE ZA ZN C CE CA CN O OE OA ON".split(" "),Nd=1E3,Qd=">> ";M(function(){for(var a=D(document,C,"debugger"),b=0;b\nLicense: GPL version 3 or later ");for(b=0;b