mirror of
https://github.com/pkimpel/retro-220.git
synced 2026-01-11 23:52:46 +00:00
311 lines
12 KiB
JavaScript
311 lines
12 KiB
JavaScript
/***********************************************************************
|
|
* retro-220/webUI B220CardatronControl.js
|
|
************************************************************************
|
|
* Copyright (c) 2017, Paul Kimpel.
|
|
* Licensed under the MIT License, see
|
|
* http://www.opensource.org/licenses/mit-license.php
|
|
************************************************************************
|
|
* Burroughs 220 Cardatron Control object.
|
|
************************************************************************
|
|
* 2017-05-19 P.Kimpel
|
|
* Original version, from retro-205 D205CardatronControl.js.
|
|
***********************************************************************/
|
|
"use strict";
|
|
|
|
/**************************************/
|
|
function B220CardatronControl(p) {
|
|
/* Constructor for the CardatronControl object */
|
|
var left = 600; // left window margin
|
|
var u; // unit config object
|
|
var x; // unit index
|
|
|
|
this.config = p.config; // System configuration object
|
|
this.mnemonic = "CCU";
|
|
this.p = p; // B220Processor object
|
|
|
|
// Do not call this.clear() here -- call from onLoad instead
|
|
|
|
this.doc = null;
|
|
this.window = null;
|
|
B220Util.openPopup(window, "../webUI/B220CardatronControl.html", this.mnemonic,
|
|
"location=no,scrollbars=no,resizable,width=140,height=140,left=" + left +
|
|
",top=" + (screen.availHeight-140),
|
|
this, B220CardatronControl.prototype.cardatronOnLoad);
|
|
|
|
// Set up the I/O devices from the system configuration
|
|
this.inputUnit = [
|
|
null, // no input unit 0
|
|
null, // input unit 1
|
|
null, // input unit 2
|
|
null, // input unit 3
|
|
null, // input unit 4
|
|
null, // input unit 5
|
|
null, // input unit 6
|
|
null]; // input unit 7
|
|
this.outputUnit = [
|
|
null, // no output unit 0
|
|
null, // output unit 1
|
|
null, // output unit 2
|
|
null, // output unit 3
|
|
null, // output unit 4
|
|
null, // output unit 5
|
|
null, // output unit 6
|
|
null]; // output unit 7
|
|
|
|
for (x=7; x>0; --x) {
|
|
u = this.config.getNode("Cardatron.units", x);
|
|
switch (u.type.substring(0, 2)) {
|
|
case "CR":
|
|
this.inputUnit[x] = new B220CardatronInput(u.type, x, this.config);
|
|
this.outputUnit[8-x] = null;
|
|
break;
|
|
case "CP":
|
|
case "LP":
|
|
this.inputUnit[x] = null;
|
|
this.outputUnit[8-x] = new B220CardatronOutput(u.type, x, this.config);
|
|
break;
|
|
default:
|
|
this.inputUnit[x] = null;
|
|
this.outputUnit[8-x] = null;
|
|
break;
|
|
} // switch u.type
|
|
} // for x
|
|
}
|
|
|
|
/**************************************/
|
|
B220CardatronControl.prototype.$$ = function $$(e) {
|
|
return this.doc.getElementById(e);
|
|
};
|
|
|
|
/**************************************/
|
|
B220CardatronControl.prototype.clear = function clear() {
|
|
/* Initializes the panel state */
|
|
|
|
this.bufferReadLamp.set(0);
|
|
this.bufferWriteLamp.set(0);
|
|
this.formatLoadLamp.set(0);
|
|
this.outputUnitLamp.set(0);
|
|
this.setUnitDesignateLamps(0);
|
|
this.setRelayDesignateLamps(0);
|
|
};
|
|
|
|
/**************************************/
|
|
B220CardatronControl.prototype.setUnitDesignateLamps = function setUnitDesignateLamps(unit) {
|
|
/* Sets the UD lamps on the panel from the low-order three bits of "unit" */
|
|
|
|
this.unitDesignate1Lamp.set(unit & 0x01);
|
|
this.unitDesignate2Lamp.set((unit >>> 1) & 0x01);
|
|
this.unitDesignate4Lamp.set((unit >>> 2) & 0x01);
|
|
};
|
|
|
|
/**************************************/
|
|
B220CardatronControl.prototype.setRelayDesignateLamps = function setRelayDesignateLamps(mask) {
|
|
/* Sets the RD lamps on the panel from the low-order four bits of "mask" */
|
|
|
|
this.relayDesignate1Lamp.set(mask & 0x01);
|
|
this.relayDesignate2Lamp.set((mask >>> 1) & 0x01);
|
|
this.relayDesignate4Lamp.set((mask >>> 2) & 0x01);
|
|
this.relayDesignate8Lamp.set((mask >>> 3) & 0x01);
|
|
};
|
|
|
|
/**************************************/
|
|
B220CardatronControl.prototype.ClearBtn_onClick = function ClearBtn_onClick(ev) {
|
|
/* Handle the click event for the CLEAR button, which will clear the
|
|
Cardatron Control state */
|
|
|
|
this.clear();
|
|
};
|
|
|
|
/**************************************/
|
|
B220CardatronControl.prototype.beforeUnload = function beforeUnload(ev) {
|
|
var msg = "Closing this window will make the panel unusable.\n" +
|
|
"Suggest you stay on the page and minimize this window instead";
|
|
|
|
ev.preventDefault();
|
|
ev.returnValue = msg;
|
|
return msg;
|
|
};
|
|
|
|
/**************************************/
|
|
B220CardatronControl.prototype.cardatronOnLoad = function cardatronOnLoad(ev) {
|
|
/* Initializes the Cardatron Control window and user interface */
|
|
var body;
|
|
var box;
|
|
var e;
|
|
var x;
|
|
|
|
this.doc = ev.target;
|
|
this.window = this.doc.defaultView;
|
|
body = this.$$("PanelSurface");
|
|
|
|
this.bufferReadLamp = new NeonLampBox(body, null, null, "BufferReadLamp");
|
|
this.bufferReadLamp.setCaption("BR", true);
|
|
this.bufferWriteLamp = new NeonLampBox(body, null, null, "BufferWriteLamp");
|
|
this.bufferWriteLamp.setCaption("BW", true);
|
|
this.formatLoadLamp = new NeonLampBox(body, null, null, "FormatLoadLamp");
|
|
this.formatLoadLamp.setCaption("FL", true);
|
|
this.outputUnitLamp = new NeonLampBox(body, null, null, "OutputUnitLamp");
|
|
this.outputUnitLamp.setCaption("OU", true);
|
|
|
|
this.unitDesignate4Lamp = new NeonLampBox(body, null, null, "UnitDesignate4Lamp");
|
|
this.unitDesignate4Lamp.setCaption("UD4", true);
|
|
this.unitDesignate2Lamp = new NeonLampBox(body, null, null, "UnitDesignate2Lamp");
|
|
this.unitDesignate2Lamp.setCaption("UD2", true);
|
|
this.unitDesignate1Lamp = new NeonLampBox(body, null, null, "UnitDesignate1Lamp");
|
|
this.unitDesignate1Lamp.setCaption("UD1", true);
|
|
|
|
this.relayDesignate8Lamp = new NeonLampBox(body, null, null, "RelayDesignate8Lamp");
|
|
this.relayDesignate8Lamp.setCaption("RD8", true);
|
|
this.relayDesignate4Lamp = new NeonLampBox(body, null, null, "RelayDesignate4Lamp");
|
|
this.relayDesignate4Lamp.setCaption("RD4", true);
|
|
this.relayDesignate2Lamp = new NeonLampBox(body, null, null, "RelayDesignate2Lamp");
|
|
this.relayDesignate2Lamp.setCaption("RD2", true);
|
|
this.relayDesignate1Lamp = new NeonLampBox(body, null, null, "RelayDesignate1Lamp");
|
|
this.relayDesignate1Lamp.setCaption("RD1", true);
|
|
|
|
// Events
|
|
|
|
this.window.addEventListener("beforeunload", B220CardatronControl.prototype.beforeUnload, false);
|
|
this.$$("ClearBtn").addEventListener("click",
|
|
B220CardatronControl.prototype.ClearBtn_onClick.bind(this), false);
|
|
|
|
this.clear();
|
|
|
|
this.window.moveTo(this.window.screenX, screen.availHeight - this.window.outerHeight);
|
|
};
|
|
|
|
/**************************************/
|
|
B220CardatronControl.prototype.inputInitiate = function inputInitiate(unitNr, rDigit, wordSender) {
|
|
/* Initiates the read from one of the Cardatron input devices.
|
|
Returns 0 if device exists and the I/O was initiated; returns -1 if device
|
|
not present */
|
|
|
|
this.bufferReadLamp.set(1);
|
|
this.bufferWriteLamp.set(0);
|
|
this.formatLoadLamp.set(0);
|
|
this.outputUnitLamp.set(0);
|
|
this.setRelayDesignateLamps(0);
|
|
this.setUnitDesignateLamps(unitNr);
|
|
if (!this.inputUnit[unitNr]) {
|
|
return -1; // just terminate the I/O
|
|
} else {
|
|
this.inputUnit[unitNr].inputInitiate(rDigit, wordSender);
|
|
return 0;
|
|
}
|
|
};
|
|
|
|
/**************************************/
|
|
B220CardatronControl.prototype.inputReadyInterrogate = function inputReadyInterrogate(unitNr) {
|
|
/* Interrogates the ready status of a Cardatron input device.
|
|
Returns -1 if device not present, 0 if device not ready, 1 if device is ready */
|
|
|
|
this.setUnitDesignateLamps(unitNr);
|
|
if (!this.inputUnit[unitNr]) {
|
|
return -1;
|
|
} else {
|
|
return (this.inputUnit[unitNr].inputReadyInterrogate() ? 1 : 0);
|
|
}
|
|
};
|
|
|
|
/**************************************/
|
|
B220CardatronControl.prototype.inputFormatInitiate = function inputFormatInitiate(
|
|
unitNr, rDigit, requestNextWord, signalFinished) {
|
|
/* Initiates loading a format band for one of the Cardatron input devices.
|
|
Returns 0 if device exists and the I/O was initiated; returns -1 if device
|
|
not present */
|
|
|
|
this.bufferReadLamp.set(0);
|
|
this.bufferWriteLamp.set(0);
|
|
this.formatLoadLamp.set(1);
|
|
this.outputUnitLamp.set(0);
|
|
this.setRelayDesignateLamps(0);
|
|
this.setUnitDesignateLamps(unitNr);
|
|
if (!this.inputUnit[unitNr]) {
|
|
return -1; // just terminate the I/O
|
|
} else {
|
|
this.inputUnit[unitNr].inputFormatInitiate(rDigit, requestNextWord, signalFinished);
|
|
return 0;
|
|
}
|
|
};
|
|
|
|
/**************************************/
|
|
B220CardatronControl.prototype.outputInitiate = function outputInitiate(
|
|
unitNr, fDigit, cDigit, requestNextWord, signalFinished) {
|
|
/* Initiates writing to one of the Cardatron output devices.
|
|
Returns 0 if device exists and the I/O was initiated; returns -1 if device
|
|
not present */
|
|
|
|
this.bufferReadLamp.set(0);
|
|
this.bufferWriteLamp.set(1);
|
|
this.formatLoadLamp.set(0);
|
|
this.outputUnitLamp.set(1);
|
|
this.setRelayDesignateLamps(cDigit);
|
|
this.setUnitDesignateLamps(unitNr);
|
|
if (!this.outputUnit[unitNr]) {
|
|
return -1; // just terminate the I/O
|
|
} else {
|
|
this.outputUnit[unitNr].outputInitiate(fDigit, cDigit, requestNextWord, signalFinished);
|
|
return 0;
|
|
}
|
|
};
|
|
|
|
/**************************************/
|
|
B220CardatronControl.prototype.outputReadyInterrogate = function outputReadyInterrogate(unitNr) {
|
|
/* Interrogates the ready status of a Cardatron output device.
|
|
Returns -1 if device not present, 0 if device not ready, 1 if device is ready */
|
|
|
|
this.setUnitDesignateLamps(unitNr);
|
|
if (!this.outputUnit[unitNr]) {
|
|
return -1; // just terminate the I/O
|
|
} else {
|
|
return (this.outputUnit[unitNr].outputReadyInterrogate() ? 1 : 0);
|
|
}
|
|
};
|
|
|
|
/**************************************/
|
|
B220CardatronControl.prototype.outputFormatInitiate = function outputFormatInitiate(
|
|
unitNr, fDigit, requestNextWord, signalFinished) {
|
|
/* Initiates loading a format band for one of the Cardatron output devices.
|
|
Returns 0 if device exists and the I/O was initiated; returns -1 if device
|
|
not present */
|
|
|
|
this.bufferReadLamp.set(0);
|
|
this.bufferWriteLamp.set(0);
|
|
this.formatLoadLamp.set(1);
|
|
this.outputUnitLamp.set(1);
|
|
this.setRelayDesignateLamps(0);
|
|
this.setUnitDesignateLamps(unitNr);
|
|
if (!this.outputUnit[unitNr]) {
|
|
return -1; // just terminate the I/O
|
|
} else {
|
|
this.outputUnit[unitNr].outputFormatInitiate(fDigit, requestNextWord, signalFinished);
|
|
return 0;
|
|
}
|
|
};
|
|
|
|
/**************************************/
|
|
B220CardatronControl.prototype.shutDown = function shutDown() {
|
|
/* Shuts down the panel */
|
|
var x;
|
|
|
|
if (this.inputUnit) {
|
|
for (x=this.inputUnit.length-1; x>=0; --x) {
|
|
if (this.inputUnit[x]) {
|
|
this.inputUnit[x].shutDown();
|
|
this.inputUnit[x] = null;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (this.outputUnit) {
|
|
for (x=this.outputUnit.length-1; x>=0; --x) {
|
|
if (this.outputUnit[x]) {
|
|
this.outputUnit[x].shutDown();
|
|
this.outputUnit[x] = null;
|
|
}
|
|
}
|
|
}
|
|
|
|
this.window.removeEventListener("beforeunload", B220CardatronControl.prototype.beforeUnload, false);
|
|
this.window.close();
|
|
}; |