Commit DCMCP transcription and emulator WIP as of 2012-06-19.
@@ -4017,3 +4017,82 @@ PROB: 04683350
|
||||
ELSE IOD ~ OIOD & SECREC[CTC]; 04684050
|
||||
% STANDARD LENGTH 04684100
|
||||
DOIONOW; 04684150
|
||||
% WRITE SECOND RECORD. 04684200
|
||||
IF RESULT.[28:1] THEN GO PROB; 04684250
|
||||
IOD ~ OIOD; 04684300
|
||||
% ORIGINAL BAD IO ON NEW UNIT 04684350
|
||||
DOIONOW; 04684400
|
||||
IF RESULT.[28:1] THEN GO PROB; 04684450
|
||||
KAPUT: 04684500
|
||||
IF NOT DSED THEN 04684550
|
||||
BEGIN 04684600
|
||||
MODE ~ 0; 04684650
|
||||
STARTIMING(FNUM,U); 04684700
|
||||
END; 04684750
|
||||
% CHANGE OVER SUCCESSFUL. 04684800
|
||||
FIB[15].[24:6] ~ U; 04684850
|
||||
% NEW LUN INTO FIB. 04684900
|
||||
OLDU ~ TINU[U].[3:5]; 04684950
|
||||
% OLDU LOADED WITH NEW PHYSICAL UNIT NUMBER. 04685000
|
||||
IF NOT RC THEN 04685050
|
||||
BEGIN 04685100
|
||||
RESETUNITS: 04685150
|
||||
IOQUE[S] ~ (*P(DUP)) & OLDU[3:43:5]; 04685200
|
||||
FINALQUE[S] ~ (*P(DUP)) & OLDU[3:43:5]; 04685250
|
||||
LOCATQUE[S] ~ (*P(DUP)) & U[12:42:6]; 04685300
|
||||
% RESET DESCRIPTORS IN IOQUE. 04685350
|
||||
IF (S ~ LOCATQUE[S].[FF]!@77777 THEN GO RESETUNITS; 04685400
|
||||
END; 04685450
|
||||
FIB[16] ~ (*P(DUP)) & OLDU[3:43:5]; 04685500
|
||||
FIB[19] ~ (*P(DUP)) & OLDU[3:43:5]; 04685550
|
||||
% CHANGE UNIT FIELD OF DESCRIPTORS IN FIB. 04685600
|
||||
FIB[6] ~ ((RC=0)|2)+HOLDCT; 04685650
|
||||
% LOAD NEW BLOCK COUNT INTO FIB 04685700
|
||||
FIB[7] ~ (((RC=0)|2) | NUMRECS)+HOLDCT | NUMRECS+LOGICLRC; 04685750
|
||||
% LOAD NEW RECORD COUNT 04685800
|
||||
TINU[U].[24:6] ~ 0; 04685850
|
||||
UNIT[U].[5:10] ~ 0; 04685900
|
||||
% RESET ERROR FLAGS. 04685950
|
||||
IF NOT DSED THEN 04686000
|
||||
BEGIN 04686050
|
||||
STREAM(A~TINU[U], T~T2~SPACE(4)); 04686100
|
||||
BEGIN 04686150
|
||||
DS ~ 26 LIT"#REEL SWITCH COMPLETED ON "; 04686200
|
||||
SI ~ LOC A; SI ~ SI+5; DS ~ 3 CHR; DS ~ LIT"~"; 04686250
|
||||
END; 04686300
|
||||
SPOUTER(T2,UNITNO,1); 04686350
|
||||
END; 04686400
|
||||
TOPIOD ~ TEMP ~ (IF RC THEN FIB[19] ELSE OIOD).[CF]-2; 04686450
|
||||
% MUST RESET LUN IN I/O BUFFER FOR PROGRAM RELEASE 04686500
|
||||
ARN: M[TEMP] ~ (*P(DUP)) & U[12:42:6]; 04686550
|
||||
IF M[TEMP].[FF]-2!TOPIOD THEN 04686600
|
||||
BEGIN 04686650
|
||||
TEMP ~ M[TEMP].[FF]-2; 04686700
|
||||
GO ARN; 04686750
|
||||
END; 04686800
|
||||
GO EXIT; 04686850
|
||||
ERROROUT: 04686900
|
||||
STREAM(T~T2~SPACE(3)); 04686950
|
||||
DS ~ 21 LIT"#REEL SWITCH ABORTED~"; 04687000
|
||||
SPOUTER(T2,UNITNO,1); 04687050
|
||||
IF U < 0 THEN % JOB BEING DS-ED AT MT REQ 04687100
|
||||
BEGIN 04687150
|
||||
U ~ TEMP; 04687200
|
||||
% SET U TO LAST UNIT. 04687250
|
||||
IF U=SAVEU THEN GO EXIT; 04687300
|
||||
DSED ~ 1; 04687350
|
||||
GO KAPUT; 04687400
|
||||
% GO TO KAPUT TO COUNTINUE HOUSE-KEEPING 04687450
|
||||
END; 04687500
|
||||
EXIT: 04687550
|
||||
P1MIX ~ 0; 04687600
|
||||
IF FIRSTREC!0 THEN 04687650
|
||||
BEGIN 04687700
|
||||
FORGETSPACE(FIRSTREC-2); 04687750
|
||||
FORGETSPACE(SECREC-2); 04687800
|
||||
END; 04687850
|
||||
IF NOT NORMALPROCESS THEN NOPROCESSTOG ~ NOPROCESSTOG-1; 04687900
|
||||
% WAS UNABLE TO FREE NORMAL PROCESS DUE TO UNFILLED BUFFERS. 04687950
|
||||
% THIS SITUATION MAY NEVER OCCUR, BUT JUST IN CASE 04688000
|
||||
WRITEPARITYREELSWITCH ~ UNIT[U] & MODE[5:40:8]; 04688050
|
||||
END WRITEPARITYREELSWITCH; 04688100
|
||||
|
||||
@@ -155,18 +155,18 @@ B5500CentralControl.prototype.bit = function(word, bit) {
|
||||
B5500CentralControl.prototype.bitSet = function(word, bit) {
|
||||
/* Sets the specified bit in word and returns the updated word */
|
||||
|
||||
return this.insert(word, bit, 1, 1);
|
||||
return this.fieldInsert(word, bit, 1, 1);
|
||||
}
|
||||
|
||||
/**************************************/
|
||||
B5500CentralControl.prototype.bitReset = function(word, bit) {
|
||||
/* Resets the specified bit in word and returns the updated word */
|
||||
|
||||
return this.insert(word, bit, 1, 0);
|
||||
return this.fieldInsert(word, bit, 1, 0);
|
||||
}
|
||||
|
||||
/**************************************/
|
||||
B5500CentralControl.prototype.isolate = function(word, start, width) {
|
||||
B5500CentralControl.prototype.fieldIsolate = function(word, start, width) {
|
||||
/* Extracts a bit field [start:width] from word and returns the field */
|
||||
var ue = 48-start; // upper power exponent
|
||||
var le = ue-width; // lower power exponent
|
||||
@@ -175,8 +175,8 @@ B5500CentralControl.prototype.isolate = function(word, start, width) {
|
||||
}
|
||||
|
||||
/**************************************/
|
||||
B5500CentralControl.prototype.insert = function(word, start, width, value) {
|
||||
/* Inserts a value into word.[start:width] and returns the updated word */
|
||||
B5500CentralControl.prototype.fieldInsert = function(word, start, width, value) {
|
||||
/* Inserts a bit field into word.[start:width] and returns the updated word */
|
||||
var ue = 48-start; // upper power exponent
|
||||
var le = ue-width; // lower power exponent
|
||||
var bpower = 1; // bottom portion power of 2
|
||||
@@ -428,7 +428,7 @@ B5500CentralControl.prototype.tock = function tock() {
|
||||
} else {
|
||||
that.TM = 0;
|
||||
that.CCI03F = 1; // set timer interrupt
|
||||
// for now // that.signalInterrupt();
|
||||
// inhibit for now // that.signalInterrupt();
|
||||
}
|
||||
that.nextTimeStamp += that.rtcTick;
|
||||
that.timer = setTimeout(function() {that.tock()},
|
||||
@@ -441,23 +441,24 @@ B5500CentralControl.prototype.initiateP2 = function() {
|
||||
memory location @10. If P2 is busy or not present, sets the P2 busy
|
||||
interrupt. Otherwise, loads the INCW into P2's A register and initiates
|
||||
the processor. */
|
||||
var p2 = this.P2;
|
||||
|
||||
if (!this.P2 || this.P2BF) {
|
||||
this.CCI12F = 1; // set P2 busy interrupt
|
||||
this.signalInterrupt();
|
||||
} else {
|
||||
this.P2.M = 8; // Now have P2 pick up the INCW
|
||||
this.P2.access(0x04); // A = [M]
|
||||
this.P2.AROF = 1;
|
||||
this.P2.T = 0x849; // inject 4111=IP1 into P2's T register
|
||||
this.P2.TROF = 1;
|
||||
this.P2.NCSF = 0; // make sure P2 is in control state
|
||||
p2.M = 8; // Now have P2 pick up the INCW
|
||||
p2.access(0x04); // A = [M]
|
||||
p2.AROF = 1;
|
||||
p2.T = 0x849; // inject 4111=IP1 into P2's T register
|
||||
p2.TROF = 1;
|
||||
p2.NCSF = 0; // make sure P2 is in control state
|
||||
this.P2BF = 1;
|
||||
this.HP2F = 0;
|
||||
|
||||
// Now start scheduling P2 on the Javascript thread
|
||||
this.P2.procTime = new Date().getTime()*1000;
|
||||
this.P2.scheduler = setTimeout(this.P2.schedule, 0);
|
||||
p2.procTime = new Date().getTime()*1000;
|
||||
p2.scheduler = setTimeout(p2.schedule, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,98 +0,0 @@
|
||||
/***********************************************************************
|
||||
* retro-b5500/emulator B5500DDPanel.js
|
||||
************************************************************************
|
||||
* Copyright (c) 2012, Nigel Williams and Paul Kimpel.
|
||||
* Licensed under the MIT License, see http://www.opensource.org/licenses/mit-license.php
|
||||
************************************************************************
|
||||
* JavaScript object definition for the B5500 Distribution & Display panel
|
||||
* utility constructors.
|
||||
************************************************************************
|
||||
* 2012-06-18 P.Kimpel
|
||||
* Original version, from thin air.
|
||||
***********************************************************************/
|
||||
|
||||
/***********************************************************************
|
||||
* Panel Lamp *
|
||||
***********************************************************************/
|
||||
function B5500DDLamp(x, y) {
|
||||
/* Constructor for the lamp objects used within D&D. x & y are the
|
||||
coordinates of the lamp within its containing element */
|
||||
|
||||
this.state = 0; // current lamp state, 0=off
|
||||
|
||||
// visible DOM element
|
||||
this.element = document.createElement("div");
|
||||
this.element.className = "ddLamp";
|
||||
this.element.style.left = String(x) + "px";
|
||||
this.element.style.top = String(y) + "px";
|
||||
}
|
||||
|
||||
/**************************************/
|
||||
|
||||
B5500DDLamp.prototype.onColor = "#FF9900";
|
||||
B5500DDLamp.prototype.offColor = "#999999";
|
||||
|
||||
/**************************************/
|
||||
B5500DDLamp.prototype.set = function(v) {
|
||||
/* Changes the visible state of the lamp according to the low-order
|
||||
bit of "v". */
|
||||
newState = v & 1;
|
||||
|
||||
if (this.state ^ newState) { // the state has changed
|
||||
this.element.backgroundColor = (v & 1 ? this.onColor : this.offColor);
|
||||
this.state = newState;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* Panel Register *
|
||||
***********************************************************************/
|
||||
function B5500DDRegister(bits, x, y, rows, caption) {
|
||||
/* Constructor for the register objects used within D&D:
|
||||
bits: number of bits in register
|
||||
x: horizontal coordinate of upper-left corner [hSpacing increments]
|
||||
y: vertical coordinate of upper-left corner [vSpacing increments]
|
||||
rows: number of rows used to display the bit lamps
|
||||
*/
|
||||
var cols = Math.floor((bits+rows-1)/rows);
|
||||
var height = rows*this.vSpacing;
|
||||
var width = cols*this.hSpacing;
|
||||
var b;
|
||||
var cx = Math.floor((x-0.25)*this.hSpacing);
|
||||
var cy = Math.floor((y-0.25)*this.vSpacing);
|
||||
var lamp;
|
||||
|
||||
this.bits = bits; // number of bits in the register
|
||||
this.left = cx; // horizontal offset relative to container
|
||||
this.top = cy; // vertical offset relative to container
|
||||
this.caption = caption; // panel caption
|
||||
this.lamps = new Array(bits+1); // bit lamps
|
||||
|
||||
// visible DOM element
|
||||
this.element = document.createElement("div");
|
||||
this.element.className = "ddRegister";
|
||||
this.element.style.left = String(cx) + "px";
|
||||
this.element.style.top = String(cy) + "px";
|
||||
this.element.style.width = width;
|
||||
this.element.style.height = height;
|
||||
|
||||
cx = Math.floor((cols+0.25)*this.hSpacing);
|
||||
for (b=1; b<=bits; b++) {
|
||||
if ((b-1)%rows == 0) {
|
||||
cy = Math.floor((rows-0.75)*this.vSpacing);
|
||||
cx -= this.hSpacing;
|
||||
} else {
|
||||
cy -= this.vSpacing;
|
||||
}
|
||||
lamp = new B5500DDLamp(cx, cy);
|
||||
this.lamps[b] = lamp;
|
||||
this.element.appendChild(lamp.element);
|
||||
}
|
||||
}
|
||||
|
||||
/**************************************/
|
||||
|
||||
B5500DDRegister.prototype.hSpacing = 24; // horizontal lamp spacing, pixels
|
||||
B5500DDRegister.prototype.vSpacing = 24; // vertical lamp spacing, pixels
|
||||
|
||||
@@ -1075,7 +1075,7 @@ B5500Processor.prototype.run = function() {
|
||||
variant = 48-t2;
|
||||
}
|
||||
if (variant > 0) {
|
||||
this.B = cc.insert(this.B, t2, variant, cc.isolate(this.A, t1, variant));
|
||||
this.B = cc.fieldInsert(this.B, t2, variant, cc.fieldIsolate(this.A, t1, variant));
|
||||
}
|
||||
this.AROF = 0;
|
||||
this.cycleCount += variant + this.G + this.K; // approximate the shift counts
|
||||
@@ -1092,7 +1092,7 @@ B5500Processor.prototype.run = function() {
|
||||
if (t2+variant > 48) {
|
||||
variant = 48-t2;
|
||||
}
|
||||
if (variant > 0 && cc.isolate(this.B, t2, variant) < cc.isolate(this.A, t1, variant)) {
|
||||
if (variant > 0 && cc.fieldIsolate(this.B, t2, variant) < cc.fieldIsolate(this.A, t1, variant)) {
|
||||
this.A = 1;
|
||||
} else {
|
||||
this.A = 0;
|
||||
@@ -1111,7 +1111,7 @@ B5500Processor.prototype.run = function() {
|
||||
if (t2+variant > 48) {
|
||||
variant = 48-t2;
|
||||
}
|
||||
if (variant > 0 && cc.isolate(this.B, t2, variant) == cc.isolate(this.A, t1, variant)) {
|
||||
if (variant > 0 && cc.fieldIsolate(this.B, t2, variant) == cc.fieldIsolate(this.A, t1, variant)) {
|
||||
this.A = 1;
|
||||
} else {
|
||||
this.A = 0;
|
||||
|
||||
@@ -1,25 +0,0 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>B5500 Distribution & Display Processor Panel</title>
|
||||
<meta name="Author" content="Williams & Kimpel">
|
||||
<meta http-equiv="Content-Script-Type" content="text/javascript">
|
||||
<meta http-equiv="Content-Style-Type" content="text/css">
|
||||
<link id=defaultStyleSheet rel=stylesheet type="text/css" href="B5500DistributionAndDisplay.css">
|
||||
|
||||
<script src="B5500DDPanel.js"></script>
|
||||
<script src="B5500ProcessorPanel.js"></script>
|
||||
|
||||
<script>
|
||||
var panel;
|
||||
|
||||
window.onload = function() {
|
||||
window.resizeTo(screen.availWidth, screen.availHeight*0.8);
|
||||
window.moveTo(0, 300);
|
||||
panel = new B5500ProcessorPanel(window);
|
||||
};
|
||||
</script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,24 +0,0 @@
|
||||
/***********************************************************************
|
||||
* retro-b5500/emulator B5500ProcessorPanel.js
|
||||
************************************************************************
|
||||
* Copyright (c) 2012, Nigel Williams and Paul Kimpel.
|
||||
* Licensed under the MIT License, see http://www.opensource.org/licenses/mit-license.php
|
||||
************************************************************************
|
||||
* JavaScript object definition for the B5500 D&D Processor panels.
|
||||
************************************************************************
|
||||
* 2012-06-18 P.Kimpel
|
||||
* Original version, from thin air.
|
||||
***********************************************************************/
|
||||
|
||||
/**************************************/
|
||||
function B5500ProcessorPanel(win) {
|
||||
/* Constructor for the B5500 D&D Processor Panel object. Creates the
|
||||
panel UI on window "win" */
|
||||
var body = win.document.body;
|
||||
|
||||
this.X = new B5500DDRegister(39, 1, 1, 3, "X REG");
|
||||
body.appendChild(this.X.element);
|
||||
|
||||
this.J = new B5500DDRegister(4, 14, 1, 3, "J REG");
|
||||
body.appendChild(this.J.element);
|
||||
}
|
||||
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
158
webUI/B5500DDPanel.js
Normal file
@@ -0,0 +1,158 @@
|
||||
/***********************************************************************
|
||||
* retro-b5500/emulator B5500DDPanel.js
|
||||
************************************************************************
|
||||
* Copyright (c) 2012, Nigel Williams and Paul Kimpel.
|
||||
* Licensed under the MIT License, see http://www.opensource.org/licenses/mit-license.php
|
||||
************************************************************************
|
||||
* JavaScript object definition for the B5500 Distribution & Display panel
|
||||
* utility constructors.
|
||||
************************************************************************
|
||||
* 2012-06-18 P.Kimpel
|
||||
* Original version, from thin air.
|
||||
***********************************************************************/
|
||||
|
||||
/***********************************************************************
|
||||
* Panel Lamp *
|
||||
***********************************************************************/
|
||||
function B5500DDLamp(x, y) {
|
||||
/* Constructor for the lamp objects used within D&D. x & y are the
|
||||
coordinates of the lamp within its containing element */
|
||||
|
||||
this.state = 0; // current lamp state, 0=off
|
||||
|
||||
// visible DOM element
|
||||
this.element = document.createElement("div");
|
||||
this.element.className = "ddLamp";
|
||||
this.element.style.left = String(x) + "px";
|
||||
this.element.style.top = String(y) + "px";
|
||||
}
|
||||
|
||||
/**************************************/
|
||||
|
||||
B5500DDLamp.onColor = "#FFCC33";
|
||||
B5500DDLamp.offColor = "#999999";
|
||||
|
||||
/**************************************/
|
||||
B5500DDLamp.prototype.set = function(v) {
|
||||
/* Changes the visible state of the lamp according to the low-order
|
||||
bit of "v". */
|
||||
var newState = v & 1;
|
||||
|
||||
if (this.state ^ newState) { // the state has changed
|
||||
this.element.backgroundColor = (newState ? B5500DDLamp.onColor : B5500DDLamp.offColor);
|
||||
this.state = newState;
|
||||
}
|
||||
}
|
||||
|
||||
/**************************************/
|
||||
B5500DDLamp.prototype.flip = function() {
|
||||
/* Complements the visible state of the lamp */
|
||||
var newState = this.state ^ 1;
|
||||
|
||||
this.element.backgroundColor = (newState ? B5500DDLamp.onColor : B5500DDLamp.offColor);
|
||||
this.state = newState;
|
||||
}
|
||||
|
||||
/**************************************/
|
||||
B5500DDLamp.prototype.setCaption = function(caption) {
|
||||
/* Establishes an optional caption for a single lamp */
|
||||
var e = document.createElement("div");
|
||||
|
||||
e.className = "ddLampCaption";
|
||||
e.appendChild(document.createTextNode(caption));
|
||||
this.element.appendChild(e);
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* Panel Register *
|
||||
***********************************************************************/
|
||||
function B5500DDRegister(bits, x, y, rows, caption) {
|
||||
/* Constructor for the register objects used within D&D:
|
||||
bits: number of bits in register
|
||||
x: horizontal coordinate of upper-left corner [hSpacing increments]
|
||||
y: vertical coordinate of upper-left corner [vSpacing increments]
|
||||
rows: number of rows used to display the bit lamps
|
||||
*/
|
||||
var cols = Math.floor((bits+rows-1)/rows);
|
||||
var height = rows*B5500DDRegister.vSpacing;
|
||||
var width = cols*B5500DDRegister.hSpacing;
|
||||
var b;
|
||||
var cx = Math.floor((x-0.25)*B5500DDRegister.hSpacing);
|
||||
var cy = Math.floor((y-0.25)*B5500DDRegister.vSpacing);
|
||||
var lamp;
|
||||
|
||||
this.bits = bits; // number of bits in the register
|
||||
this.left = cx; // horizontal offset relative to container
|
||||
this.top = cy; // vertical offset relative to container
|
||||
this.caption = caption || ""; // panel caption
|
||||
this.lastValue = 0; // prior register value
|
||||
this.lamps = new Array(bits+1); // bit lamps
|
||||
|
||||
// visible DOM element
|
||||
this.element = document.createElement("div");
|
||||
this.element.className = "ddRegister";
|
||||
this.element.style.left = String(cx) + "px";
|
||||
this.element.style.top = String(cy) + "px";
|
||||
this.element.style.width = String(width) + "px";
|
||||
this.element.style.height = String(height) + "px";
|
||||
|
||||
cx = cols*B5500DDRegister.hSpacing + B5500DDRegister.hOffset;
|
||||
for (b=1; b<=bits; b++) {
|
||||
if ((b-1)%rows == 0) {
|
||||
cy = (rows-1)*B5500DDRegister.vSpacing + B5500DDRegister.vOffset;
|
||||
cx -= B5500DDRegister.hSpacing;
|
||||
} else {
|
||||
cy -= B5500DDRegister.vSpacing;
|
||||
}
|
||||
lamp = new B5500DDLamp(cx, cy);
|
||||
this.lamps[b] = lamp;
|
||||
this.element.appendChild(lamp.element);
|
||||
}
|
||||
|
||||
this.captionDiv = document.createElement("div");
|
||||
this.captionDiv.className = "ddRegCaption";
|
||||
this.captionDiv.style.left = "2px";
|
||||
this.captionDiv.style.right = "2px";
|
||||
this.captionDiv.style.top = String(-B5500DDRegister.vOffset) + "px";
|
||||
if (caption) {
|
||||
lamp = document.createElement("span");
|
||||
lamp.className = "ddRegSpan";
|
||||
lamp.appendChild(document.createTextNode(caption));
|
||||
this.captionDiv.appendChild(lamp);
|
||||
}
|
||||
this.element.appendChild(this.captionDiv);
|
||||
|
||||
}
|
||||
|
||||
/**************************************/
|
||||
|
||||
B5500DDRegister.hSpacing = 24; // horizontal lamp spacing, pixels
|
||||
B5500DDRegister.hOffset = 5; // horizontal lamp offset within container
|
||||
B5500DDRegister.vSpacing = 24; // vertical lamp spacing, pixels
|
||||
B5500DDRegister.vOffset = 5; // vertical lamp offset within container
|
||||
|
||||
/**************************************/
|
||||
B5500DDRegister.prototype.update = function(value) {
|
||||
/* Update the register lamps from the value of the parameter */
|
||||
var bitNr = 0;
|
||||
var low = (this.lastValue % 0x1000000) ^ (value % 0x1000000);
|
||||
var high = (Math.floor(this.lastValue / 0x1000000) % 0x1000000) ^ (Math.floor(value / 0x1000000) % 0x1000000);
|
||||
|
||||
while (low) {
|
||||
bitNr++;
|
||||
if (low & 1) {
|
||||
this.lamps[bitNr].flip();
|
||||
}
|
||||
low >>>= 1;
|
||||
}
|
||||
bitNr = 23;
|
||||
while (high) {
|
||||
bitNr++;
|
||||
if (high & 1) {
|
||||
this.lamps[bitNr].flip();
|
||||
}
|
||||
high >>>= 1;
|
||||
}
|
||||
this.lastValue = value;
|
||||
}
|
||||
@@ -14,6 +14,10 @@ BODY.consoleBody {
|
||||
background-color: #666666;
|
||||
margin: 4px}
|
||||
|
||||
BODY.panelBody {
|
||||
background-color: #EEEEEE;
|
||||
margin: 4px}
|
||||
|
||||
DIV#BurroughsLogo {
|
||||
background-color: black;
|
||||
position: absolute;
|
||||
@@ -78,15 +82,40 @@ DIV.ddLamp {
|
||||
width: 12px;
|
||||
height: 12px;
|
||||
font-size: 4px;
|
||||
background-color: #FF9900;
|
||||
background-color: #FFCC33;
|
||||
border-radius: 8px;
|
||||
border: 1px solid black}
|
||||
|
||||
DIV.ddLampCaption {
|
||||
position: absolute;
|
||||
width: 16px;
|
||||
top: 14px;
|
||||
left: -3px;
|
||||
font-size: 6px;
|
||||
text-align: center}
|
||||
|
||||
DIV.ddRegister {
|
||||
position: absolute;
|
||||
border: 1px solid black;
|
||||
font-size: 6px}
|
||||
|
||||
DIV.ddRegCaption {
|
||||
position: absolute;
|
||||
font-family: Arial, Helvetica, sans-serif;
|
||||
font-size: 10px;
|
||||
font-weight: bold;
|
||||
text-align: center;
|
||||
height: 10px;
|
||||
border-top: 1px solid black;
|
||||
border-left: 1px solid black;
|
||||
border-right: 1px solid black}
|
||||
|
||||
SPAN.ddRegSpan {
|
||||
position: relative;
|
||||
top: -7px;
|
||||
padding-left: 2px;
|
||||
padding-right: 2px;
|
||||
background-color: #EEEEEE}
|
||||
|
||||
IMG#BurroughsLogoImage {
|
||||
width: 150px;
|
||||
text-align: center;
|
||||
55
webUI/B5500ProcessorPanel.html
Normal file
@@ -0,0 +1,55 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>B5500 Distribution & Display Processor Panel</title>
|
||||
<meta name="Author" content="Williams & Kimpel">
|
||||
<meta http-equiv="Content-Script-Type" content="text/javascript">
|
||||
<meta http-equiv="Content-Style-Type" content="text/css">
|
||||
<link id=defaultStyleSheet rel=stylesheet type="text/css" href="B5500DistributionAndDisplay.css">
|
||||
|
||||
<script src="B5500DDPanel.js"></script>
|
||||
<script src="B5500ProcessorPanel.js"></script>
|
||||
|
||||
<script>
|
||||
var panel;
|
||||
var displayRefreshPeriod = 50; // milliseconds
|
||||
var nextRefresh = 0;
|
||||
var refreshTimer = null;
|
||||
var totalTime = 0;
|
||||
var totalDelay = 0;
|
||||
|
||||
var updateDisplay = function updateDisplay() {
|
||||
/* Schedules itself to update the display on a periodic basis. */
|
||||
var that = updateDisplay.that;
|
||||
var thisTime = new Date().getTime();
|
||||
var delta;
|
||||
var meter = document.getElementById("idleMeter");
|
||||
|
||||
panel.X.update(Math.random()*0x8000000000);
|
||||
|
||||
// Schedule ourself for the next period
|
||||
nextRefresh += displayRefreshPeriod;
|
||||
delta = nextRefresh-thisTime;
|
||||
refreshTimer = setTimeout(updateDisplay, (delta < 0 ? 0 : delta));
|
||||
totalTime += displayRefreshPeriod;
|
||||
totalDelay += delta;
|
||||
meter.value = (totalDelay/totalTime*100).toFixed(1) + "%";
|
||||
};
|
||||
|
||||
window.onload = function() {
|
||||
window.resizeTo(screen.availWidth, screen.availHeight*0.8);
|
||||
window.moveTo(0, 300);
|
||||
document.title = "B5500 Processor A";
|
||||
panel = new B5500ProcessorPanel(window);
|
||||
updateDisplay.that = this;
|
||||
nextRefresh = new Date().getTime();
|
||||
updateDisplay();
|
||||
};
|
||||
</script>
|
||||
</head>
|
||||
|
||||
<body class="panelBody">
|
||||
<div style="text-align:right">
|
||||
Idle: <input id=idleMeter type=text size=5 style="text-align:right">
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
145
webUI/B5500ProcessorPanel.js
Normal file
@@ -0,0 +1,145 @@
|
||||
/***********************************************************************
|
||||
* retro-b5500/emulator B5500ProcessorPanel.js
|
||||
************************************************************************
|
||||
* Copyright (c) 2012, Nigel Williams and Paul Kimpel.
|
||||
* Licensed under the MIT License, see http://www.opensource.org/licenses/mit-license.php
|
||||
************************************************************************
|
||||
* JavaScript object definition for the B5500 D&D Processor panels.
|
||||
************************************************************************
|
||||
* 2012-06-18 P.Kimpel
|
||||
* Original version, from thin air.
|
||||
***********************************************************************/
|
||||
|
||||
/**************************************/
|
||||
function B5500ProcessorPanel(win) {
|
||||
/* Constructor for the B5500 D&D Processor Panel object. Creates the
|
||||
panel UI on window "win" */
|
||||
var body = win.document.body;
|
||||
|
||||
// Row 1
|
||||
|
||||
this.X = new B5500DDRegister(39, 1, 1, 3, "X REG");
|
||||
body.appendChild(this.X.element);
|
||||
|
||||
this.J = new B5500DDRegister(4, 14, 1, 3, "J REG");
|
||||
body.appendChild(this.J.element);
|
||||
this.J.lamps[1].setCaption("1");
|
||||
this.J.lamps[2].setCaption("2");
|
||||
this.J.lamps[3].setCaption("4");
|
||||
this.J.lamps[4].setCaption("8");
|
||||
// adjust the weird position of the "8" bit
|
||||
this.J.lamps[4].element.style.top = String(B5500DDRegister.vOffset) + "px";
|
||||
|
||||
this.Q = new B5500DDRegister(21, 16, 1, 3, "Q REG");
|
||||
body.appendChild(this.Q.element);
|
||||
this.Q.lamps[2].setCaption("CCCF");
|
||||
this.Q.lamps[3].setCaption("VARF");
|
||||
this.Q.lamps[4].setCaption("1");
|
||||
this.Q.lamps[5].setCaption("2");
|
||||
this.Q.lamps[6].setCaption("3");
|
||||
this.Q.lamps[7].setCaption("4");
|
||||
this.Q.lamps[8].setCaption("5");
|
||||
this.Q.lamps[9].setCaption("6");
|
||||
this.Q.lamps[10].setCaption("7");
|
||||
this.Q.lamps[11].setCaption("8");
|
||||
this.Q.lamps[12].setCaption("9");
|
||||
this.Q.lamps[13].setCaption("12");
|
||||
this.Q.lamps[14].setCaption("MRAF");
|
||||
this.Q.lamps[15].setCaption("MROF");
|
||||
this.Q.lamps[16].setCaption("HLTF");
|
||||
this.Q.lamps[17].setCaption("EIHF");
|
||||
this.Q.lamps[18].setCaption("MWOF");
|
||||
this.Q.lamps[19].setCaption("NCSF");
|
||||
this.Q.lamps[20].setCaption("SALF");
|
||||
this.Q.lamps[21].setCaption("CWMF");
|
||||
|
||||
this.R = new B5500DDRegister(9, 23, 1, 3, "R REG");
|
||||
body.appendChild(this.R.element);
|
||||
|
||||
// Row 2
|
||||
|
||||
this.A = new B5500DDRegister(48, 1, 5, 3, "A REG");
|
||||
body.appendChild(this.A.element);
|
||||
|
||||
this.AROF = new B5500DDRegister(1, 17, 5, 1, null);
|
||||
body.appendChild(this.AROF.element);
|
||||
this.AROF.lamps[1].setCaption("AROF");
|
||||
|
||||
this.G = new B5500DDRegister(3, 18, 5, 3, "G");
|
||||
body.appendChild(this.G.element);
|
||||
|
||||
this.H = new B5500DDRegister(3, 19, 5, 3, "H");
|
||||
body.appendChild(this.H.element);
|
||||
|
||||
this.Y = new B5500DDRegister(6, 21, 5, 6, "Y");
|
||||
body.appendChild(this.Y.element);
|
||||
|
||||
this.Z = new B5500DDRegister(6, 22, 5, 6, "Z");
|
||||
body.appendChild(this.Z.element);
|
||||
|
||||
this.M = new B5500DDRegister(15, 23, 5, 3, "M REG");
|
||||
body.appendChild(this.M.element);
|
||||
|
||||
// Row 3
|
||||
|
||||
this.B = new B5500DDRegister(48, 1, 9, 3, "B REG");
|
||||
body.appendChild(this.B.element);
|
||||
|
||||
this.BROF = new B5500DDRegister(1, 17, 9, 1, null);
|
||||
body.appendChild(this.BROF.element);
|
||||
this.BROF.lamps[1].setCaption("BROF");
|
||||
|
||||
this.K = new B5500DDRegister(3, 18, 9, 3, "K");
|
||||
body.appendChild(this.K.element);
|
||||
|
||||
this.V = new B5500DDRegister(3, 19, 9, 3, "V");
|
||||
body.appendChild(this.V.element);
|
||||
|
||||
this.N = new B5500DDRegister(4, 20, 8, 4, "N");
|
||||
body.appendChild(this.N.element);
|
||||
|
||||
this.S = new B5500DDRegister(15, 23, 9, 3, "S REG");
|
||||
body.appendChild(this.S.element);
|
||||
|
||||
// Row 4
|
||||
|
||||
this.P = new B5500DDRegister(48, 1, 13, 3, "P REG");
|
||||
body.appendChild(this.P.element);
|
||||
|
||||
this.PROF = new B5500DDRegister(3, 17, 13, 3, null);
|
||||
body.appendChild(this.PROF.element);
|
||||
this.PROF.lamps[1].setCaption("L1");
|
||||
this.PROF.lamps[2].setCaption("L2");
|
||||
this.PROF.lamps[3].setCaption("PROF");
|
||||
|
||||
this.T = new B5500DDRegister(12, 18, 13, 3, "T REG");
|
||||
body.appendChild(this.T.element);
|
||||
|
||||
this.TROF = new B5500DDRegister(1, 22, 13, 1, null);
|
||||
body.appendChild(this.TROF.element);
|
||||
this.TROF.lamps[1].setCaption("TROF");
|
||||
|
||||
this.C = new B5500DDRegister(15, 23, 13, 3, "C REG");
|
||||
body.appendChild(this.C.element);
|
||||
|
||||
// Row 5
|
||||
|
||||
this.I = new B5500DDRegister(9, 3, 17, 1, "I REG");
|
||||
body.appendChild(this.I.element);
|
||||
|
||||
this.TM = new B5500DDRegister(9, 3, 19, 1, "TM REG");
|
||||
body.appendChild(this.TM.element);
|
||||
|
||||
this.E = new B5500DDRegister(6, 17, 17, 1, "E REG");
|
||||
body.appendChild(this.E.element);
|
||||
|
||||
this.F = new B5500DDRegister(15, 23, 17, 3, "F REG");
|
||||
body.appendChild(this.F.element);
|
||||
}
|
||||
|
||||
/**************************************/
|
||||
B5500ProcessorPanel.prototype.updateDisplay = function() {
|
||||
/* Update the processor panel lamps.
|
||||
For now, just supply random values */
|
||||
|
||||
}
|
||||
|
Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 39 KiB |
|
Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 39 KiB |
|
Before Width: | Height: | Size: 5.3 KiB After Width: | Height: | Size: 5.3 KiB |
@@ -13,7 +13,7 @@ TD {
|
||||
border-radius: 8px}
|
||||
</style>
|
||||
|
||||
<script src="B5500CentralControl.js"></script>
|
||||
<script src="../emulator/B5500CentralControl.js"></script>
|
||||
|
||||
<script>
|
||||
var displayRefreshPeriod = 50; // milliseconds
|
||||
@@ -56,6 +56,8 @@ window.onload = function() {
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<fieldset>
|
||||
<legend>Test Reg</legend>
|
||||
<table cellspacing=4 cellpadding=0 border=0>
|
||||
<tr>
|
||||
<td id=CCI03F>
|
||||
@@ -66,6 +68,7 @@ window.onload = function() {
|
||||
<td id=CCTM2>
|
||||
<td id=CCTM1>
|
||||
</table>
|
||||
</fieldset>
|
||||
|
||||
<div id=wanderer style="position:absolute; top:50px; right:10px; width:12px; height:12px; font-size:4px; border-radius:8px; border:2px solid black; background-color:#FF9900">
|
||||
|
||||