diff --git a/build-release.cmd b/build-release.cmd index 297dbc1..bf02a77 100644 --- a/build-release.cmd +++ b/build-release.cmd @@ -1 +1 @@ -"%ProgramFiles%\7-Zip\7z.exe" a -tzip releases\retro-b5500-%1.zip build-release.cmd emulator\ webui\ -x!webui\tools\* -x!webui\prototypes\* tools\*.html tools\*.job \ No newline at end of file +"%ProgramFiles%\7-Zip\7z.exe" a -tzip releases\retro-b5500-%1.zip build-release.cmd emulator\ webui\ -x!webui\prototypes\* tools\*.html tools\*.js tools\*.card \ No newline at end of file diff --git a/emulator/B5500CentralControl.js b/emulator/B5500CentralControl.js index a0565bb..7f45774 100644 --- a/emulator/B5500CentralControl.js +++ b/emulator/B5500CentralControl.js @@ -18,6 +18,7 @@ function B5500CentralControl(global) { this.mnemonic = "CC"; // Unit mnemonic this.global = global; // Javascript global object (e.g., "window" for browsers) + this.sysConfig = null; // System configuration object /* Global system modules */ this.DD = null; // Distribution & Display unit @@ -45,8 +46,7 @@ function B5500CentralControl(global) { // Instance variables and flags this.poweredUp = 0; // System power indicator - - this.unitStatusMask = 0; // Peripheral unit ready-status bitmask + this.unitStatusMask = 0; // Peripheral unit ready-status bitmask [must not be in clear()] this.PB1L = 0; // 0=> PA is P1, 1=> PB is P1 this.inhCCI03F = 0; // 0=> allow timer interrupts; 1=> inhibit 'em @@ -61,7 +61,7 @@ function B5500CentralControl(global) { /**************************************/ /* Global constants */ -B5500CentralControl.version = "0.20"; +B5500CentralControl.version = "1.00"; B5500CentralControl.memReadCycles = 2; // assume 2 µs memory read cycle time (the other option was 3 µs) B5500CentralControl.memWriteCycles = 4; // assume 4 µs memory write cycle time (the other option was 6 µs) @@ -113,7 +113,7 @@ B5500CentralControl.unitIndex = [ [null, 47,null, 46, 31, 45, 29, 44, 30, 43, 24, 42, 28, 41, 23, 40, 17, 39, 20, 38, 19, 37,null, 36,null, 35,null, 34,null, 33, 22, 32]]; -// The following object maps the unit mnemonics from B5500SystemConfiguration.units +// The following object maps the unit mnemonics from this.sysConfig.units // to the attributes needed to configure the CC unit[] array. B5500CentralControl.unitSpecs = { @@ -126,8 +126,8 @@ B5500CentralControl.unitSpecs = { CRB: {unitIndex: 23, designate: 14, unitClass: "B5500CardReader"}, CRA: {unitIndex: 24, designate: 10, unitClass: "B5500CardReader"}, CPA: {unitIndex: 25, designate: 10, unitClass: "B5500CardPunch"}, - LPB: {unitIndex: 26, designate: 26, unitClass: "B5500DummyPrinter"}, - LPA: {unitIndex: 27, designate: 22, unitClass: "B5500DummyPrinter"}, + LPB: {unitIndex: 26, designate: 26, unitClass: "B5500LinePrinter"}, + LPA: {unitIndex: 27, designate: 22, unitClass: "B5500LinePrinter"}, DKB: {unitIndex: 28, designate: 12, unitClass: "B5500DiskUnit"}, DKA: {unitIndex: 29, designate: 6, unitClass: "B5500DiskUnit"}, DRB: {unitIndex: 30, designate: 8, unitClass: null}, @@ -151,7 +151,7 @@ B5500CentralControl.unitSpecs = { /**************************************/ -B5500CentralControl.bindMethod = function bindMethod(f, context) { +B5500CentralControl.bindMethod = function bindMethod(context, f) { /* Returns a new function that binds the function "f" to the object "context". Note that this is a static constructor property function, NOT an instance method of the CC object */ @@ -205,7 +205,7 @@ B5500CentralControl.prototype.clear = function clear() { this.P2BF = 0; // Processor 2 busy FF this.HP2F = 0; // Halt processor 2 FF - this.ccLatch = 0x20; // I/O Unit busy & P2 latched status (reset by console UI) + this.ccLatch = 0; // I/O Unit busy & P2 latched status (reset by console UI) this.interruptMask = 0; // Interrupt status mask this.interruptLatch = 0; // Interrupt latched status (reset by console UI) this.iouMask = 0; // I/O Unit busy status mask @@ -214,10 +214,6 @@ B5500CentralControl.prototype.clear = function clear() { this.P1 = (this.PB1L ? this.PB : this.PA); this.P2 = (this.PB1L ? this.PA : this.PB); - if (!this.P2) { - this.P2BF = 1; // mark non-existent P2 as busy - this.ccLatch |= 0x10; - } if (this.PA) { this.PA.clear(); } @@ -624,23 +620,23 @@ B5500CentralControl.prototype.initiateIO = function initiateIO() { if (this.IO1 && this.IO1.REMF && !this.AD1F) { this.AD1F = 1; - this.iouMask |= 0x1; - this.ccLatch |= 0x1; + this.iouMask |= 0x01; + this.ccLatch |= 0x01; this.IO1.initiate(); } else if (this.IO2 && this.IO2.REMF && !this.AD2F) { this.AD2F = 1; - this.iouMask |= 0x2; - this.ccLatch |= 0x2; + this.iouMask |= 0x02; + this.ccLatch |= 0x02; this.IO2.initiate(); } else if (this.IO3 && this.IO3.REMF && !this.AD3F) { this.AD3F = 1; - this.iouMask |= 0x4; - this.ccLatch |= 0x4; + this.iouMask |= 0x04; + this.ccLatch |= 0x04; this.IO3.initiate(); } else if (this.IO4 && this.IO4.REMF && !this.AD4F) { this.AD4F = 1; - this.iouMask |= 0x8; - this.ccLatch |= 0x8; + this.iouMask |= 0x08; + this.ccLatch |= 0x08; this.IO4.initiate(); } else { this.CCI04F = 1; // set I/O busy interrupt @@ -785,33 +781,42 @@ B5500CentralControl.prototype.load = function load(dontStart) { this.clear(); // initialize P1/P2 configuration if (!this.P1 || this.P1.busy) { // P1 is busy or not available result = 1; - } else if (!this.testUnitReady(22)) { // SPO not ready - result = 2; - } else if (this.testUnitBusy(22)) { // SPO is busy - result = 3; + } else if (!this.testUnitReady(22)) { + result = 2; // SPO not ready + } else if (this.testUnitBusy(22)) { + result = 3; // SPO is busy + } else if (!(this.cardLoadSelect || this.testUnitReady(29))) { + result = 4; // DKA not ready + } else if (!this.cardLoadSelect && this.testUnitBusy(29)) { + result = 5; // DKA is busy } else { // ready to rock 'n roll + if (!this.P2) { + this.P2BF = 1; // mark non-existent P2 as busy + this.ccLatch |= 0x10; + } + this.nextTimeStamp = performance.now(); this.tock(); this.LOFF = 1; // set the Load FF if (this.IO1 && this.IO1.REMF && !this.AD1F) { this.AD1F = 1; - this.iouMask |= 0x1; - this.ccLatch |= 0x1; + this.iouMask |= 0x01; + this.ccLatch |= 0x01; this.IO1.initiateLoad(this.cardLoadSelect, boundLoadComplete); } else if (this.IO2 && this.IO2.REMF && !this.AD2F) { this.AD2F = 1; - this.iouMask |= 0x2; - this.ccLatch |= 0x2; + this.iouMask |= 0x02; + this.ccLatch |= 0x02; this.IO2.initiateLoad(this.cardLoadSelect, boundLoadComplete); } else if (this.IO3 && this.IO3.REMF && !this.AD3F) { this.AD3F = 1; - this.iouMask |= 0x4; - this.ccLatch |= 0x4; + this.iouMask |= 0x04; + this.ccLatch |= 0x04; this.IO3.initiateLoad(this.cardLoadSelect, boundLoadComplete); } else if (this.IO4 && this.IO4.REMF && !this.AD4F) { this.AD4F = 1; - this.iouMask |= 0x8; - this.ccLatch |= 0x8; + this.iouMask |= 0x08; + this.ccLatch |= 0x08; this.IO4.initiateLoad(this.cardLoadSelect, boundLoadComplete); } else { this.CCI04F = 1; // set I/O busy interrupt @@ -831,7 +836,7 @@ B5500CentralControl.prototype.loadTest = function loadTest(buf, loadAddr) { should not be used to load ESPOL "DECK" files */ var addr = loadAddr; // starting B5500 memory address var bytes = buf.byteLength; - var data = new DataView(buf); // use DataView() to avoid problems with littleendians. + var data = new DataView(buf); // use DataView() to avoid problems with little-endians. var power = 0x10000000000; var word = 0; var x = 0; @@ -987,7 +992,7 @@ B5500CentralControl.prototype.dumpSystemState = function dumpSystemState(caption writer(nr, "B=" + padOctal(px.B, 16) + " BROF=" + px.BROF); } - writer(0, "B5500 State Dump by " + (caption || "(unknown)") + " : " + new Date().toString()); + writer(0, "retro-B5500 State Dump by \"" + (caption || "(unknown)") + "\" : " + new Date().toString()); // Dump the processor states dumpProcessorState(this.P1, 1); @@ -1033,10 +1038,9 @@ B5500CentralControl.prototype.dumpSystemState = function dumpSystemState(caption }; /**************************************/ -B5500CentralControl.prototype.configureSystem = function configureSystem() { - /* Establishes the hardware module configuration from the - B5500SystemConfiguration module */ - var cfg = B5500SystemConfiguration; +B5500CentralControl.prototype.configureSystem = function configureSystem(cfg) { + /* Establishes the hardware module configuration from the system configuration + object "cfg" */ var mnem; var signal = null; var specs; @@ -1097,38 +1101,37 @@ B5500CentralControl.prototype.configureSystem = function configureSystem() { } } - // ***** !! inhibit for now ***** // this.DD = new B5500DistributionAndDisplay(this); - // Configure the processors - if (cfg.PA) {this.PA = new B5500Processor("A", this)} - if (cfg.PB) {this.PB = new B5500Processor("B", this)} + if (cfg.PA.enabled) {this.PA = new B5500Processor("A", this)} + if (cfg.PB.enabled) {this.PB = new B5500Processor("B", this)} // Determine P1/P2 this.PB1L = (cfg.PB1L ? 1 : 0); // Configure the I/O Units - if (cfg.IO1) {this.IO1 = new B5500IOUnit("1", this)} - if (cfg.IO2) {this.IO2 = new B5500IOUnit("2", this)} - if (cfg.IO3) {this.IO3 = new B5500IOUnit("3", this)} - if (cfg.IO4) {this.IO4 = new B5500IOUnit("4", this)} + if (cfg.IO1.enabled) {this.IO1 = new B5500IOUnit("1", this)} + if (cfg.IO2.enabled) {this.IO2 = new B5500IOUnit("2", this)} + if (cfg.IO3.enabled) {this.IO3 = new B5500IOUnit("3", this)} + if (cfg.IO4.enabled) {this.IO4 = new B5500IOUnit("4", this)} // Configure memory for (x=0; x<8; ++x) { - if (cfg.memMod[x]) { - this.addressSpace[x] = new ArrayBuffer(32768); // 4K B5500 words @ 8 bytes each + if (cfg.memMod[x].enabled) { + this.addressSpace[x] = new ArrayBuffer(4096*8); // 4K B5500 words @ 8 bytes each this.memMod[x] = new Float64Array(this.addressSpace[x]); } } // Configure the peripheral units for (mnem in cfg.units) { - if (cfg.units[mnem]) { + if (cfg.units[mnem].enabled) { specs = B5500CentralControl.unitSpecs[mnem]; if (specs) { unitClass = this.global[specs.unitClass || "B5500DummyUnit"]; if (unitClass) { u = new unitClass(mnem, specs.unitIndex, specs.designate, - makeChange(this, specs.unitIndex), makeSignal(this, mnem)); + makeChange(this, specs.unitIndex), makeSignal(this, mnem), + cfg.units[mnem]); this.unit[specs.unitIndex] = u; } } @@ -1139,12 +1142,13 @@ B5500CentralControl.prototype.configureSystem = function configureSystem() { }; /**************************************/ -B5500CentralControl.prototype.powerOn = function powerOn() { +B5500CentralControl.prototype.powerOn = function powerOn(config) { /* Powers up the system and establishes the hardware module configuration. - Redundant power-ons are ignored. */ + "config" is the system configuration object. Redundant power-ons are ignored. */ if (!this.poweredUp) { - this.configureSystem(); + this.sysConfig = config; + this.configureSystem(config); this.poweredUp = 1; } }; @@ -1154,7 +1158,7 @@ B5500CentralControl.prototype.powerOff = function powerOff() { /* Powers down the system and deallocates the hardware modules. Redundant power-offs are ignored. */ - function shutDown() { + function systemShutDown() { var x; if (this.timer) { @@ -1182,12 +1186,13 @@ B5500CentralControl.prototype.powerOff = function powerOff() { this.addressSpace[x] = null; } + this.clear(); this.poweredUp = 0; } if (this.poweredUp) { this.halt(); // Wait a little while for I/Os, etc., to finish - setCallback(this.mnemonic, this, 500, shutDown); + setCallback(this.mnemonic, this, 500, systemShutDown); } }; diff --git a/emulator/B5500IOUnit.js b/emulator/B5500IOUnit.js index 26fa7c5..d3aa4ae 100644 --- a/emulator/B5500IOUnit.js +++ b/emulator/B5500IOUnit.js @@ -106,7 +106,7 @@ B5500IOUnit.ANSItoBIC = [ // Index by 8-bit ANSI to get 6-bit BIC 0x30,0x3C,0x3F,0x0A,0x2A,0x3B,0x1C,0x0C,0x1D,0x2D,0x2B,0x10,0x3A,0x2C,0x1A,0x31, // 20-2F 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0D,0x2E,0x1E,0x3D,0x0E,0x0C, // 30-3F 0x0B,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x21,0x22,0x23,0x24,0x25,0x26, // 40-4F - 0x27,0x28,0x29,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x1B,0x0C,0x3E,0x0C,0x0C, // 50-5F + 0x27,0x28,0x29,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x1B,0x0C,0x3E,0x0C,0x1F, // 50-5F 0x0C,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x21,0x22,0x23,0x24,0x25,0x26, // 60-6F 0x27,0x28,0x29,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x2F,0x20,0x0F,0x1F,0x0C, // 70-7F 0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C, // 80-8F diff --git a/emulator/B5500Processor.js b/emulator/B5500Processor.js index c85cc04..c9d8a04 100644 --- a/emulator/B5500Processor.js +++ b/emulator/B5500Processor.js @@ -55,7 +55,7 @@ function B5500Processor(procID, cc) { /**************************************/ B5500Processor.cyclesPerMilli = 1000; // clock cycles per millisecond (1000 => 1.0 MHz) -B5500Processor.timeSlice = 4000; // this.run() timeslice, clocks +B5500Processor.timeSlice = 4000; // this.run() time-slice, clocks B5500Processor.delayAlpha = 0.999; // decay factor for exponential weighted average delay B5500Processor.slackAlpha = 0.9999; // decay factor for exponential weighted average slack @@ -2813,7 +2813,6 @@ B5500Processor.prototype.doublePrecisionMultiply = function doublePrecisionMulti this.I = (this.I & 0x0F) | 0xB0; // set I05/6/8: exponent-overflow this.cc.signalInterrupt(); } - /********** dumpState("Exponent Overflow in DLM"); ************************************/ } else if (eb < 0) { if (eb >= -63) { eb = (-eb) | 0x40; // set the exponent sign bit @@ -3059,8 +3058,10 @@ B5500Processor.prototype.computeRelativeAddr = function computeRelativeAddr(offs Manual. "cEnable" determines whether C-relative addressing is permitted. This offset must be in (0..1023) */ - if (this.SALF) { - this.cycleCount += 2; // approximate the timing + this.cycleCount += 2; // approximate the timing + if (!this.SALF) { + this.M = this.R*64 + (offset % 0x400); + } else { switch ((offset % 0x400) >>> 7) { case 0: case 1: @@ -3095,8 +3096,6 @@ B5500Processor.prototype.computeRelativeAddr = function computeRelativeAddr(offs } break; } // switch - } else { - this.M = this.R*64 + (offset % 0x400); } // Reset variant-mode R-relative addressing, if enabled @@ -3128,7 +3127,7 @@ B5500Processor.prototype.indexDescriptor = function indexDescriptor() { /* Indexes a descriptor and, if successful leaves the indexed value in the A register. Returns 1 if an interrupt is set and the syllable is to be exited */ - var aw = this.A; // local copy of A reg + var aw; // local copy of A reg var bw; // local copy of B reg var interrupted = 0; // fatal error, interrupt set var xe; // index exponent @@ -3137,7 +3136,8 @@ B5500Processor.prototype.indexDescriptor = function indexDescriptor() { var xs; // index mantissa sign var xt; // index exponent sign - this.adjustBFull(); + this.adjustABFull(); + aw = this.A; bw = this.B; xm = (bw % 0x8000000000); xe = (bw - xm)/0x8000000000; @@ -3173,21 +3173,24 @@ B5500Processor.prototype.indexDescriptor = function indexDescriptor() { // Now we have an integerized index value in xm if (!interrupted) { - if (xs && xm) { // oops... negative index + if (xs && xm) { + // Oops... index is negative interrupted = 1; if (this.NCSF) { this.I = (this.I & 0x0F) | 0x90; // set I05/8: invalid-index this.cc.signalInterrupt(); } - } else if (xm % 0x0400 >= (aw % 0x10000000000 - aw % 0x40000000)/0x40000000) { - interrupted = 1; // oops... index out of bounds + } else if (xm % 0x0400 < (aw % 0x10000000000 - aw % 0x40000000)/0x40000000) { + // We finally have a valid index + this.A = aw - aw % 0x8000 + (xm % 0x400 + aw)%0x8000; + this.BROF = 0; + } else { + // Oops... index not less than size + interrupted = 1; if (this.NCSF) { this.I = (this.I & 0x0F) | 0x90; // set I05/8: invalid-index this.cc.signalInterrupt(); } - } else { // we finally have a valid index - this.A = this.cc.fieldInsert(aw, 33, 15, aw % 0x8000 + xm % 0x400); - this.BROF = 0; } } @@ -3490,12 +3493,13 @@ B5500Processor.prototype.operandCall = function operandCall() { var aw = this.A; // local copy of A reg value var interrupted = 0; // interrupt occurred + // If A contains a simple operand, just leave it there, otherwise... if (aw >= 0x800000000000) { // It's not a simple operand switch ((aw % 0x800000000000 - aw % 0x100000000000)/0x100000000000) { // aw.[1:3] case 2: case 3: - // Present data descriptor + // Present data descriptor: see if it must be indexed if ((aw % 0x10000000000 - aw % 0x40000000)/0x40000000) { // aw.[8:10] interrupted = this.indexDescriptor(); // else descriptor is already indexed (word count 0) @@ -3503,10 +3507,10 @@ B5500Processor.prototype.operandCall = function operandCall() { if (!interrupted) { this.M = this.A % 0x8000; this.loadAviaM(); // A = [M] - if (this.A >= 0x800000000000 && this.NCSF) { - // Flag bit is set + if (this.A >= 0x800000000000 && this.NCSF) {// Flag bit is set this.I = (this.I & 0x0F) | 0x80; // set I08: flag-bit interrupt this.cc.signalInterrupt(); + dumpState("Flag Bit: OPDC"); // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< DEBUG >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> } } break; @@ -3527,7 +3531,7 @@ B5500Processor.prototype.operandCall = function operandCall() { } break; - default: + default: // cases 4, 6 // Miscellaneous control word -- leave as is break; } @@ -3551,10 +3555,12 @@ B5500Processor.prototype.descriptorCall = function descriptorCall() { switch ((aw % 0x800000000000 - aw % 0x100000000000)/0x100000000000) { // aw.[1:3] case 2: case 3: - // Present data descriptor + // Present data descriptor: see if it must be indexed if ((aw % 0x10000000000 - aw % 0x40000000)/0x40000000) { // aw.[8:10] interrupted = this.indexDescriptor(); - this.A = this.cc.fieldInsert(this.A, 8, 10, 0); // set word count to zero + if (!interrupted) { + this.A = this.cc.fieldInsert(this.A, 8, 10, 0); // set word count to zero + } // else descriptor is already indexed (word count 0) } break; @@ -3575,7 +3581,7 @@ B5500Processor.prototype.descriptorCall = function descriptorCall() { } break; - default: + default: // cases 4, 6 // Miscellaneous control word this.A = this.M + 0xA00000000000; break; @@ -4278,7 +4284,7 @@ B5500Processor.prototype.run = function run() { this.adjustAEmpty(); this.computeRelativeAddr(opcode >>> 2, 1); this.loadAviaM(); - if (this.A >= 0x800000000000) { // if it's a control word, + if (this.A >= 0x800000000000) { // optimization: if it's a control word, this.operandCall(); // evaluate it } // otherwise, just leave it in A break; diff --git a/emulator/B5500SystemConfiguration.js b/emulator/B5500SystemConfiguration.js index 7499bb6..258bd94 100644 --- a/emulator/B5500SystemConfiguration.js +++ b/emulator/B5500SystemConfiguration.js @@ -1,72 +1,117 @@ /*********************************************************************** * retro-b5500/emulator B5500SystemConfiguration.js ************************************************************************ -* Copyright (c) 2012, Nigel Williams and Paul Kimpel. +* Copyright (c) 2012, 2014, Nigel Williams and Paul Kimpel. * Licensed under the MIT License, * see http://www.opensource.org/licenses/mit-license.php ************************************************************************ -* B5500 System Configuration module. +* B5500 System Configuration definition module. * -* This is presently a static Javascript object describing the hardware -* modules and peripherals attached to the system. +* This class defines the system configuration properties for the B5500 +* emulator. This is not used directly by the emulator, but serves as a +* central definition of the configuration properties and as a template +* from which actual configuration instances can be cloned. ************************************************************************ * 2012-06-30 P.Kimpel * Original version, from thin air. +* 2014-08-27 P.Kimpel +* Revise and implement as a constructor with prototype to support the +* new dynamic configuration mechanism. ***********************************************************************/ "use strict"; -var B5500SystemConfiguration = { +/**************************************/ +function B5500SystemConfiguration() { + /* Constructor for the global SystemConfiguration definition object */ + // ...nothing to construct at present... everything's in the prototype. +} - PA: true, // Processor A available - PB: false, // Processor B available +/**************************************/ +B5500SystemConfiguration.prototype.configLevel = 1; // configuration object version +B5500SystemConfiguration.prototype.sysDefaultConfigName = "Default"; +B5500SystemConfiguration.prototype.sysDefaultStorageName = "B5500DiskUnit"; - PB1L: false, // PA is P1 (false) | PB is P1 (true) +// Template for Datacom terminal unit (B487) definition object +B5500SystemConfiguration.prototype.sysDefaultTerminalUnit = { + enabled: true, // available in system + adapters: 1, // number of terminal interface adapters + buffers: 2, // number of 28-character buffers/adapter + pingPong: false // use ping-pong buffer management +}; - IO1: true, // I/O Unit 1 available - IO2: true, // I/O Unit 2 available - IO3: true, // I/O Unit 3 available - IO4: false, // I/O Unit 4 available +// Template for the global system configuration definition object +B5500SystemConfiguration.prototype.systemConfig = { + configLevel: B5500SystemConfiguration.prototype.configLevel, + configName: B5500SystemConfiguration.prototype.sysDefaultConfigName, - memMod: [ - true, // Memory module 0 available (4KW) - true, // Memory module 1 available (4KW) - true, // Memory module 2 available (4KW) - true, // Memory module 3 available (4KW) - true, // Memory module 4 available (4KW) - true, // Memory module 5 available (4KW) - true, // Memory module 6 available (4KW) - true], // Memory module 7 available (4KW) + PA: {enabled: true}, // Processor A available + PB: {enabled: false}, // Processor B available + + PB1L: false, // PA is P1 (false) | PB is P1 (true) + + IO1: {enabled: true}, // I/O Unit 1 available + IO2: {enabled: true}, // I/O Unit 2 available + IO3: {enabled: true}, // I/O Unit 3 available + IO4: {enabled: false}, // I/O Unit 4 available + + memMod: [ {enabled: true}, // Memory module 0 available (4KW) + {enabled: true}, // Memory module 1 available (4KW) + {enabled: true}, // Memory module 2 available (4KW) + {enabled: true}, // Memory module 3 available (4KW) + {enabled: true}, // Memory module 4 available (4KW) + {enabled: true}, // Memory module 5 available (4KW) + {enabled: true}, // Memory module 6 available (4KW) + {enabled: true}], // Memory module 7 available (4KW) units: { - SPO: true, // SPO keyboard/printer - DKA: true, // Disk File Control A - DKB: true, // Disk File Control B - CRA: true, // Card Reader A - CRB: false, // Card Reader B - CPA: true, // Card Punch A - LPA: true, // Line Printer A - LPB: false, // Line Printer B - PRA: false, // Paper Tape Reader A - PRB: false, // Paper Tape Reader B - PPA: false, // Paper Tape Punch A - PPB: false, // Paper Tape Punch A - DCA: true, // Data Communications Control A - DRA: false, // Drum/Auxmem A - DRB: false, // Drum/Auxmem B - MTA: true, // Magnetic Tape Unit A - MTB: true, // Magnetic Tape Unit B - MTC: true, // Magnetic Tape Unit C - MTD: true, // Magnetic Tape Unit D - MTE: false, // Magnetic Tape Unit E - MTF: false, // Magnetic Tape Unit F - MTH: false, // Magnetic Tape Unit H - MTJ: false, // Magnetic Tape Unit J - MTK: false, // Magnetic Tape Unit K - MTL: false, // Magnetic Tape Unit L - MTM: false, // Magnetic Tape Unit M - MTN: false, // Magnetic Tape Unit N - MTP: false, // Magnetic Tape Unit P - MTR: false, // Magnetic Tape Unit R - MTS: false, // Magnetic Tape Unit S - MTT: false} // Magnetic Tape Unit X + SPO: {enabled: true, // SPO keyboard/printer + algolGlyphs: false}, + + DKA: {enabled: true, // Disk File Control A + DFX: true, FPM: false, + storageName: B5500SystemConfiguration.prototype.sysDefaultStorageName}, + DKB: {enabled: false, // Disk File Control B + DFX: true, FPM: false, + storageName: B5500SystemConfiguration.prototype.sysDefaultStorageName}, + + CRA: {enabled: true}, // Card Reader A + CRB: {enabled: false}, // Card Reader B + CPA: {enabled: true, // Card Punch A + algolGlyphs: true}, + + LPA: {enabled: true, // Line Printer A + algolGlyphs: true}, + LPB: {enabled: false, // Line Printer B + algolGlyphs: true}, + + PRA: {enabled: false}, // Paper Tape Reader A + PRB: {enabled: false}, // Paper Tape Reader B + PPA: {enabled: false}, // Paper Tape Punch A + PPB: {enabled: false}, // Paper Tape Punch A + + DCA: {enabled: true, // Data Communications Control A + terminalUnits: { + TU1: B5500SystemConfiguration.prototype.sysDefaultTerminalUnit + }}, + + DRA: {enabled: false}, // Drum/Auxmem A + DRB: {enabled: false}, // Drum/Auxmem B + + MTA: {enabled: true}, // Magnetic Tape Unit A + MTB: {enabled: false}, // Magnetic Tape Unit B + MTC: {enabled: false}, // Magnetic Tape Unit C + MTD: {enabled: false}, // Magnetic Tape Unit D + MTE: {enabled: false}, // Magnetic Tape Unit E + MTF: {enabled: false}, // Magnetic Tape Unit F + MTH: {enabled: false}, // Magnetic Tape Unit H + MTJ: {enabled: false}, // Magnetic Tape Unit J + MTK: {enabled: false}, // Magnetic Tape Unit K + MTL: {enabled: false}, // Magnetic Tape Unit L + MTM: {enabled: false}, // Magnetic Tape Unit M + MTN: {enabled: false}, // Magnetic Tape Unit N + MTP: {enabled: false}, // Magnetic Tape Unit P + MTR: {enabled: false}, // Magnetic Tape Unit R + MTS: {enabled: false}, // Magnetic Tape Unit S + MTT: {enabled: false} // Magnetic Tape Unit T + } }; diff --git a/index.html b/index.html index 98c16c9..6c89be8 100644 --- a/index.html +++ b/index.html @@ -1,6 +1,6 @@
-
+
-
+
This site hosts the current test version of the retro-B5500 emulator, a web-browser based implementation of the legendary Burroughs B5500. +
This site hosts the current version of the retro-B5500 emulator, an implementation of the legendary Burroughs B5500 that runs in a web-browser. + +
+
+
.zip file per release.
-
.zip file per release.
+