1
0
mirror of https://github.com/pkimpel/retro-220.git synced 2026-04-13 23:44:23 +00:00

Commit emulator version 1.01.

1. Tune internal processor timing to adjust neon glow persistence and
attempt to make the Control Console display more realistic.
2. Change form-feed behavior in ConsolePrinter to embed an ASCII form-
feed character in the text instead of emitting a number of newlines
based upon the current line counter.
3. Corrections to rounding code in experimental version of floatingAdd()
function (not currently enabled in the emulator).
This commit is contained in:
Paul Kimpel
2018-10-28 09:20:26 -07:00
parent 6e34115d1c
commit 69f2b1828c
3 changed files with 57 additions and 37 deletions

View File

@@ -260,22 +260,20 @@ function B220Processor(config, devices) {
* Global Constants *
***********************************************************************/
B220Processor.version = "1.00a";
B220Processor.version = "1.01";
B220Processor.tick = 1000/200000; // milliseconds per clock cycle (200KHz)
B220Processor.cyclesPerMilli = 1/B220Processor.tick;
// clock cycles per millisecond (200 => 200KHz)
B220Processor.timeSlice = 10; // maximum processor time slice, ms
B220Processor.delayAlpha = 0.0001; // decay factor for exponential weighted average delay
B220Processor.timeSlice = 13; // maximum processor time slice, ms
B220Processor.delayAlpha = 0.000001; // decay factor for exponential weighted average delay
B220Processor.delayAlpha1 = 1-B220Processor.delayAlpha;
B220Processor.slackAlpha = 0.0001; // decay factor for exponential weighted average slack
B220Processor.slackAlpha = 0.000001; // decay factor for exponential weighted average slack
B220Processor.slackAlpha1 = 1-B220Processor.slackAlpha;
B220Processor.neonPersistence = 1000/60;
// persistence of neon bulb glow [ms]
B220Processor.neonPersistence = 7; // persistence of neon bulb glow [ms]
B220Processor.maxGlowTime = B220Processor.neonPersistence;
// panel bulb glow persistence [ms]
B220Processor.lampGlowInterval = 50; // background lamp sampling interval (ms)
B220Processor.adderGlowAlpha = B220Processor.neonPersistence/12;
// adder and carry toggle glow decay factor,
// based on one digit (1/12 word) time [ms]
@@ -1833,7 +1831,7 @@ B220Processor.prototype.floatingAdd__WITH_ROUND = function floatingAdd(absolute)
this.OFT.set(1);
sign = ax = dx = limiter = 0;
}
} else if (am < 0x50) { // mantissa is zero
} else if (am == 0) { // mantissa is zero
ax = sign = limiter = 0;
timing += 0.065;
} else { // normalize the result as necessary
@@ -1870,12 +1868,16 @@ B220Processor.prototype.floatingAdd__WITH_ROUND = function floatingAdd(absolute)
// Set toggles for display purposes and set the result.
d = am%0x100; // get the rounding digits
am = (am - am%0x100)/0x100; // scale back to 8 digits
if (d > 0x50) { // round required
am = (am - d)/0x100; // scale back to 8 digits
if (d >= 0x50) { // round required
am = this.bcdAdd(1, am, 11, 0, 0);
if (am >= 0x100000000) {
am = (am - am%0x10)/0x10;
ax = this.bcdAdd(1, ax, 3, 0, 0); // ignore exponent overflow, for now
d = am%0x10;
am = (am - d)/0x10;
if (d >= 5) { // round again after scale right
am = this.bcdAdd(1, am, 11, 0, 0);
}
}
}
@@ -4294,7 +4296,6 @@ B220Processor.prototype.ioInitiate = function ioInitiate() {
this.AST.set(1);
this.asyncOn();
this.updateLampGlow(0); // update the console lamps
this.execLimit = 0; // kill the run() loop
};

View File

@@ -64,7 +64,7 @@ B220ConsolePrinter.ttySpeed = 10; // TTY printer speed, char/sec
B220ConsolePrinter.ttyNewLine = 200; // TTY carriage-return delay, ms
B220ConsolePrinter.whippetSpeed = 1000; // Whippet printer speed, char/sec
B220ConsolePrinter.whippetNewLine = 75; // Whippet carriage-return delay, ms
B220ConsolePrinter.formFeedPeriod = 500;// form-feed average delay, ms
B220ConsolePrinter.formFeedPeriod = 500;// full-page form-feed delay, ms
B220ConsolePrinter.pageSize = 66; // lines/page for form-feed
B220ConsolePrinter.maxScrollLines = 15000;
@@ -122,19 +122,25 @@ B220ConsolePrinter.prototype.emptyPaper = function emptyPaper() {
while (this.paper.firstChild) {
this.paper.removeChild(this.paper.firstChild);
}
this.paper.appendChild(this.doc.createTextNode(""));
this.printerLine = 0;
this.printerCol = 0;
this.printerEOP.scrollIntoView();
};
/**************************************/
B220ConsolePrinter.prototype.emptyLine = function emptyLine(text) {
/* Removes excess lines already output, then appends a new text node to the
<pre> element within the paper element. Note that "text" is an ANSI string */
B220ConsolePrinter.prototype.printNewLine = function printNewLine(text) {
/* Removes excess lines already output, then appends a newline to the
current text node, and then a new text node to the end of the <pre> element
within the paper element. Note that "text" is an ANSI string */
var paper = this.paper;
var line = text || "";
while (paper.childNodes.length > B220ConsolePrinter.maxScrollLines) {
paper.removeChild(paper.firstChild);
}
paper.lastChild.nodeValue += "\n"; // newline
paper.appendChild(this.doc.createTextNode(line));
++this.printerLine;
@@ -152,14 +158,14 @@ B220ConsolePrinter.prototype.printChar = function printChar(code) {
if (c != "?") { // some 220 codes just don't print
line = this.paper.lastChild.nodeValue;
len = line.length;
if (len < 1) {
if (len < 1) { // first char on line
this.paper.lastChild.nodeValue = c;
this.printerCol = 1;
} else if (len < this.columns) {
} else if (len < this.columns) {// normal char
this.paper.lastChild.nodeValue = line + c;
++this.printerCol;
} else {
this.emptyLine(c);
} else { // right margin overflow
this.printNewLine(c);
}
}
};
@@ -178,22 +184,35 @@ B220ConsolePrinter.prototype.printTab = function printTab() {
} // for x
if (this.columns < tabCol) {
this.emptyLine(); // tab would overflow right margin
this.printNewLine(); // tab would overflow right margin
} else {
while (this.printerCol < tabCol) {
this.printChar(0x00); // output a space
this.printChar(0x00); // output a space
}
}
};
/**************************************/
B220ConsolePrinter.prototype.printFormFeed = function printFormFeed() {
/* Simulates a form feed by outputting an appropriate number of blank lines */
/* Simulates a form feed by appending a newline and form feed to the
current text node, and then a new text node to the end of the <pre> element
within the paper element, with sufficient spaces to position the print head
to the same position on the line */
var paper = this.paper;
var line = "";
this.printerLine %= B220ConsolePrinter.pageSize;
while (this.printerLine < B220ConsolePrinter.pageSize) {
this.emptyLine();
while (line.length < this.printerCol-8) {
line += " ";
}
while (line.length < this.printerCol) {
line += " ";
}
paper.lastChild.nodeValue += "\n\f"; // newline + formfeed
paper.appendChild(this.doc.createTextNode(line));
this.printerLine = 0;
this.printerEOP.scrollIntoView();
};
/**************************************/
@@ -223,7 +242,6 @@ B220ConsolePrinter.prototype.copyPaper = function copyPaper(ev) {
});
this.emptyPaper();
this.emptyLine();
ev.preventDefault();
ev.stopPropagation();
};
@@ -234,11 +252,11 @@ B220ConsolePrinter.prototype.button_Click = function button_Click(ev) {
switch (ev.target.id) {
case "LineFeedBtn":
this.emptyLine();
this.printNewLine();
break;
case "CarriageReturnBtn":
if (this.printerCol > 0) {
this.emptyLine();
this.printNewLine();
}
break;
case "OpenPanelBtn":
@@ -410,7 +428,6 @@ B220ConsolePrinter.prototype.printerOnLoad = function printerOnLoad(ev) {
this.paper = this.$$("Paper");
this.printerEOP = this.$$("EndOfPaper");
this.emptyPaper();
this.emptyLine();
body = this.$$("FormatControlsDiv");
this.remoteKnob = new BlackControlKnob(body, null, null, "RemoteKnob",
@@ -536,7 +553,7 @@ B220ConsolePrinter.prototype.receiveSign = function receiveSign(char, successor)
break;
} // switch
if (this.nextCharTime <= stamp) {
if (this.nextCharTime < stamp) {
this.nextCharTime = stamp;
}
@@ -548,7 +565,7 @@ B220ConsolePrinter.prototype.receiveSign = function receiveSign(char, successor)
B220ConsolePrinter.prototype.receiveChar = function receiveChar(char, successor) {
/* Receives a non-sign character from the processor and outputs it. Special handling
is provided for tabs, carriage returns, form feeds, and end-of-word characters */
var delay = this.charPeriod; // default character delay
var delay = this.charPeriod; // default character delay, ms
var nextReceiver = this.boundReceiveChar; // default routine to receive next char
var stamp = performance.now(); // current time
@@ -558,10 +575,12 @@ B220ConsolePrinter.prototype.receiveChar = function receiveChar(char, successor)
break;
case 0x02: // blank (non-print)
delay = 10; // a guess...
break;
case 0x15: // form-feed
delay = B220ConsolePrinter.formFeedPeriod;
delay = this.newLinePeriod + B220ConsolePrinter.formFeedPeriod *
(1 - (this.printerLine%B220ConsolePrinter.pageSize)/B220ConsolePrinter.pageSize);
this.suppressLZ = 0;
this.printFormFeed();
break;
@@ -569,7 +588,7 @@ B220ConsolePrinter.prototype.receiveChar = function receiveChar(char, successor)
case 0x16: // carriage-return
delay = this.newLinePeriod;
this.suppressLZ = 0;
this.emptyLine();
this.printNewLine();
break;
case 0x26: // tab
@@ -589,7 +608,7 @@ B220ConsolePrinter.prototype.receiveChar = function receiveChar(char, successor)
break;
case 2: // EOW = carriage-return
delay = this.newLinePeriod;
this.emptyLine();
this.printNewLine();
break;
}
}

View File

@@ -103,7 +103,7 @@ function B220ControlConsole(p, systemShutdown) {
}
/**************************************/
B220ControlConsole.displayRefreshPeriod = 100; // milliseconds
B220ControlConsole.displayRefreshPeriod = 50; // milliseconds
B220ControlConsole.offSwitchImage = "./resources/ToggleDown.png";
B220ControlConsole.onSwitchImage = "./resources/ToggleUp.png";
B220ControlConsole.offOrganSwitchImage = "./resources/Organ-Switch-Up.png"
@@ -470,7 +470,7 @@ B220ControlConsole.prototype.updatePanel = function updatePanel() {
text = (timer/1000 + 10000).toFixed(1);
this.intervalTimer.textContent = text.substring(text.length-6);
p.updateLampGlow(p.AST.value ? 0.75 : 0);
p.updateLampGlow(p.AST.value ? 1 : 0);
eLevel = (p.RUT.value ? p.EXT.glow : p.EXT.value);
// Primary Registers