diff --git a/README.md b/README.md
index c9f2169..777a17d 100644
--- a/README.md
+++ b/README.md
@@ -1,8 +1,35 @@
-# retro-b5500
-Automatically exported from code.google.com/p/retro-b5500
+The Burroughs B5500 was an innovative computer system. Released first as the B5000 in 1962 and then, with minor improvements and a new disk subsystem, re-released as the B5500 in 1964, its design was a radical departure from other commercial systems of the day. Many of the concepts that it embodied were being worked on and implemented by others around the same time, but it is difficult to think of another system that pulled so many concepts together and made them work so well in a commercially-successful product:
-This project is presently an experimental export from Google Code while we evaluate GitHub as a new home for the retro-b5500 emulator project.
+ * Multi-programming (multiple tasks sharing the same processor)
+ * Multi-processing (multiple physical processors sharing common memory and I/O)
+ * Automatic memory address relocation
+ * Automatic memory segment overlay (what we now call virtual memory)
+ * Variable-length memory segments
+ * Hardware bounds checking
+ * Stack- and descriptor-oriented instruction set
+ * Unified integer/floating-point numeric format
+ * Management by a sophisticated operating system, the Master Control Program, or **MCP**
+ * Designed for and programmed exclusively in higher-level languages
-The project remains hosted at https://code.google.com/p/retro-b5500.
-We recommend that you not clone or fork from this repo during this evaluation period.
+The B5500 was the foundation for the Burroughs B6000/7000/A Series, which are still produced and sold today as Unisys ClearPath MCP systems.
+
+The main goal of this project is creation of a web browser-based emulator for the B5500. A second goal is reconstruction of the source and object code for the system.
+
+A complete software release (Mark XIII, 1971) is presently available from the hosting site below under liberal terms of a Unisys educational/hobbyist license.
+
+The contents of this project are licensed under the [MIT License](http://www.opensource.org/licenses/mit-license.php).
+
+| Related Sites | URL |
+| ------------- | ----- |
+| Getting Started | http://www.phkimpel.us/B5500/webSite/HelpMenu.html |
+| Project Blog | http://retro-b5500.blogspot.com/ |
+| Emulator hosting site | http://www.phkimpel.us/B5500/ |
+| Burroughs Mark XIII Software Release | http://www.phkimpel.us/B5500/webSite/SoftwareRequest.html |
+| B5500 at retroComputingTasmania | http://www.retrocomputingtasmania.com/home/projects/burroughs-b5500 |
+| Documents at bitsavers.org | http://bitsavers.org/pdf/burroughs/B5000_5500_5700/ |
+| Release Downloads | https://drive.google.com/folderview?id=0BxqKm7v4xBswM29qUkxPTkVfYzg&usp=sharing |
+| Web/email Forum | http://groups.google.com/group/retro-b5500 |
+
+
+This project was originally hosted on Google Code at https://code.google.com/p/retro-b5500 and moved to GitHub in June 2015.
diff --git a/emulator/B5500CentralControl.js b/emulator/B5500CentralControl.js
index 031e349..05b1a34 100644
--- a/emulator/B5500CentralControl.js
+++ b/emulator/B5500CentralControl.js
@@ -61,7 +61,7 @@ function B5500CentralControl(global) {
/**************************************/
/* Global constants */
-B5500CentralControl.version = "1.01";
+B5500CentralControl.version = "1.02";
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)
@@ -896,6 +896,7 @@ B5500CentralControl.prototype.runTest = function runTest(runAddr) {
this.P1.start();
};
+/**************************************/
B5500CentralControl.prototype.dumpSystemState = function dumpSystemState(caption, writer) {
/* Generates a dump of the processor states and all of memory
"caption is an identifying string that is output in the heading line.
@@ -961,7 +962,7 @@ B5500CentralControl.prototype.dumpSystemState = function dumpSystemState(caption
}
}
- function convertWordtoANSI(value) {
+ function convertWordToANSI(value) {
/* Converts the "value" as a B5500 word to an eight character string and returns it */
var c; // current character
var s = ""; // working string value
@@ -1020,7 +1021,7 @@ B5500CentralControl.prototype.dumpSystemState = function dumpSystemState(caption
bic += "????????";
} else {
line += " " + padOctal(accessor.word, 16);
- bic += convertWordtoANSI(accessor.word);
+ bic += convertWordToANSI(accessor.word);
}
} // for x
@@ -1040,6 +1041,102 @@ B5500CentralControl.prototype.dumpSystemState = function dumpSystemState(caption
writer(-1, null);
};
+/**************************************/
+B5500CentralControl.prototype.dumpSystemTape = function dumpSystemTape(caption, writer) {
+ /* Generates a dump of the processor states and all of memory for generation of a tape image.
+ "caption is an identifying string that is output in the heading line.
+ "writer" is a function that is called to output lines of text to the outside
+ world. It takes two parameters:
+ "phase" is a numeric code indicating the type of line being output:
+ 0 = initialization (text parameter not valid)
+ 32 = core memory: control word plus 512 memory words translated to ANSI
+ -1 = end of dump (text parameter is caption)
+ "text" is the line of text to be output.
+ */
+ var addr;
+ var bic;
+ var dupCount = 0;
+ var lastLine = "";
+ var line;
+ var lineAddr;
+ var mod;
+ var x;
+
+ var accessor = { // Memory access control block
+ requestorID: "C", // Memory requestor ID
+ addr: 0, // Memory address
+ word: 0, // 48-bit data word
+ MAIL: 0, // Truthy if attempt to access @000-@777 in normal state
+ MPED: 0, // Truthy if memory parity error
+ MAED: 0 // Truthy if memory address/inhibit error
+ };
+
+ var BICtoANSI = [
+ "0", "1", "2", "3", "4", "5", "6", "7",
+ "8", "9", "#", "@", "?", ":", ">", "}",
+ "+", "A", "B", "C", "D", "E", "F", "G",
+ "H", "I", ".", "[", "&", "(", "<", "~",
+ "|", "J", "K", "L", "M", "N", "O", "P",
+ "Q", "R", "$", "*", "-", ")", ";", "{",
+ " ", "/", "S", "T", "U", "V", "W", "X",
+ "Y", "Z", ",", "%", "!", "=", "]", "\""];
+
+ function convertWordToANSI(value) {
+ /* Converts the "value" as a B5500 word to an eight character string and returns it */
+ var c; // current character
+ var s = ""; // working string value
+ var w = value; // working word value
+ var x; // character counter
+
+ for (x=0; x<8; ++x) {
+ c = w % 64;
+ w = (w-c)/64;
+ s = BICtoANSI[c] + s;
+ }
+ return s;
+ }
+
+ writer(0, null);
+
+ // Dump all of memory
+ for (mod=0; mod<0x8000; mod+=0x1000) {
+ accessor.addr = mod;
+ this.fetch(accessor);
+ if (accessor.MAED) { // invalid address
+ bic = convertWordToANSI(0x200000000000 + mod);
+ for (addr=0; addr<512; ++addr) {
+ bic += "00000000";
+ }
+ writer(32, bic);
+ } else {
+ for (addr=0; addr<0x1000; addr+=512) {
+ lineAddr = mod+addr;
+ bic = convertWordToANSI(lineAddr);
+ for (x=0; x<512; ++x) {
+ accessor.addr = lineAddr+x;
+ this.fetch(accessor);
+ if (accessor.MPED) {
+ bic += "????????";
+ } else {
+ bic += convertWordToANSI(accessor.word);
+ }
+ } // for x
+
+ writer(32, bic);
+ } // for addr
+ }
+ } // for mod
+
+ bic = caption.toUpperCase();
+ while (bic.length < 150) {
+ bic += " ";
+ }
+ while (bic.length < 160) {
+ bic += " ";
+ }
+ writer(-1, bic);
+};
+
/**************************************/
B5500CentralControl.prototype.configureSystem = function configureSystem(cfg) {
/* Establishes the hardware module configuration from the system configuration
@@ -1126,6 +1223,7 @@ B5500CentralControl.prototype.configureSystem = function configureSystem(cfg) {
}
// Configure the peripheral units
+ this.unitStatusMask = 0;
for (mnem in cfg.units) {
if (cfg.units[mnem].enabled) {
specs = B5500CentralControl.unitSpecs[mnem];
@@ -1173,6 +1271,7 @@ B5500CentralControl.prototype.powerOff = function powerOff() {
for (x=0; x
A menu of information resources to assist you in setting up and operating the emulator.
-
Source code, documentation, and other developer resources for the retro-B5500 emulator project at Google Code.
+
Source code, documentation, and other developer resources for the retro-B5500 emulator project at GitHub.
The retro-B5500 project blog.
@@ -62,7 +62,7 @@
Copyright (c) 2013, Nigel Williams and Paul Kimpel • Licensed under the MIT License
diff --git a/tools/B5500DiskDirFixer.html b/tools/B5500DiskDirFixer.html index 2228acf..caa3b00 100644 --- a/tools/B5500DiskDirFixer.html +++ b/tools/B5500DiskDirFixer.html @@ -24,6 +24,8 @@ ************************************************************************ * 2013-07-27 P.Kimpel * Original version, from B5500DiskDirList.html. +* 2015-04-17 P.Kimpel +* Add "db=" URL parameter. ***********************************************************************/ "use strict"; @@ -34,7 +36,6 @@ if (!window.indexedDB) { // for Safari, mostly window.addEventListener("load", function() { var configName = "CONFIG"; // database configuration store name var dbName = "B5500DiskUnit"; // IDB database name - var dbVersion; // current IDB database version (leave undefined) var directoryTop; // start of directory area var directoryEnd; // end of directory area var euPrefix = "EU"; // prefix for EU object store names @@ -509,15 +510,15 @@ window.addEventListener("load", function() { } /**************************************/ - function openDatabase(name, version, successor) { - /* Attempts to open the disk subsystem database for the specified "name" - and "version". Stores the IDB database object in "disk" if successful, or - stores null if unsuccessful. Also gets directoryTop from seg 0 */ + function openDatabase(name, successor) { + /* Attempts to open the disk subsystem database for the specified "name". + Stores the IDB database object in "disk" if successful, or stores null + if unsuccessful. Also gets directoryTop from seg 0 */ var block = new Array(30); var db = null; var req; - req = window.indexedDB.open(name, version); + req = window.indexedDB.open(name); // open current version req.onerror = function(ev) { alert("Cannot open disk database: " + ev.target.error); @@ -544,6 +545,32 @@ window.addEventListener("load", function() { } + /**************************************/ + function getDBName(defaultName) { + /* Parses the URL query string for a "db=name" parameter. If "db" is + found, returns the corresponding name; if not found, returns "defaultName" */ + var args; + var i; + var name; + var search = location.search.substring(1); // drop the "?" + var value = defaultName; + var x; + + args = search.split("&"); + for (x=args.length-1; x>=0; --x) { + i = args[x].indexOf("="); + if (i > 0 ) { + name = decodeURIComponent(args[x].substring(0, i)); + if (name.toLowerCase() == "db") { + value = decodeURIComponent(args[x].substring(i+1)); + break; // out of for loop + } + } + } + + return value; + } + /**************************************/ function checkBrowser() { /* Checks whether this browser can support the necessary stuff */ @@ -569,7 +596,8 @@ window.addEventListener("load", function() { /********** Start of window.onload() **********/ if (!checkBrowser()) { - openDatabase(dbName, dbVersion, function() { + dbName = getDBName(dbName); + openDatabase(dbName, function() { directorySearch("TAPE", "COMPARE", fixIt); }); } diff --git a/tools/B5500DiskDirList.html b/tools/B5500DiskDirList.html index 1f5da19..53cb3a6 100644 --- a/tools/B5500DiskDirList.html +++ b/tools/B5500DiskDirList.html @@ -22,6 +22,8 @@ ************************************************************************ * 2013-04-16 P.Kimpel * Original version, from B5500ColdLoader.html. +* 2015-04-17 P.Kimpel +* Add "db=" URL parameter. ***********************************************************************/ "use strict"; @@ -32,7 +34,6 @@ if (!window.indexedDB) { // for Safari, mostly window.addEventListener("load", function() { var configName = "CONFIG"; // database configuration store name var dbName = "B5500DiskUnit"; // IDB database name - var dbVersion; // current IDB database version (leave undefined) var directoryTop; // start of directory area var directoryEnd; // end of directory area var euPrefix = "EU"; // prefix for EU object store names @@ -505,15 +506,15 @@ window.addEventListener("load", function() { } /**************************************/ - function openDatabase(name, version, successor) { - /* Attempts to open the disk subsystem database for the specified "name" - and "version". Stores the IDB database object in "disk" if successful, or - stores null if unsuccessful. Also gets directoryTop from seg 0 */ + function openDatabase(name, successor) { + /* Attempts to open the disk subsystem database for the specified "name". + Stores the IDB database object in "disk" if successful, or stores null + if unsuccessful. Also gets directoryTop from seg 0 */ var block = new Array(30); var db = null; var req; - req = window.indexedDB.open(name, version); + req = window.indexedDB.open(name); // open current version req.onerror = function(ev) { alert("Cannot open disk database: " + ev.target.error); @@ -540,6 +541,32 @@ window.addEventListener("load", function() { } + /**************************************/ + function getDBName(defaultName) { + /* Parses the URL query string for a "db=name" parameter. If "db" is + found, returns the corresponding name; if not found, returns "defaultName" */ + var args; + var i; + var name; + var search = location.search.substring(1); // drop the "?" + var value = defaultName; + var x; + + args = search.split("&"); + for (x=args.length-1; x>=0; --x) { + i = args[x].indexOf("="); + if (i > 0 ) { + name = decodeURIComponent(args[x].substring(0, i)); + if (name.toLowerCase() == "db") { + value = decodeURIComponent(args[x].substring(i+1)); + break; // out of for loop + } + } + } + + return value; + } + /**************************************/ function checkBrowser() { /* Checks whether this browser can support the necessary stuff */ @@ -565,7 +592,8 @@ window.addEventListener("load", function() { /********** Start of window.onload() **********/ if (!checkBrowser()) { - openDatabase(dbName, dbVersion, function() { + dbName = getDBName(dbName); + openDatabase(dbName, function() { directoryList(function() {}); }); } diff --git a/tools/B5500DiskFileList.html b/tools/B5500DiskFileList.html index f29109a..954e9b1 100644 --- a/tools/B5500DiskFileList.html +++ b/tools/B5500DiskFileList.html @@ -23,6 +23,8 @@ ************************************************************************ * 2013-04-17 P.Kimpel * Original version, from B5500DiskDirList.html. +* 2015-04-17 P.Kimpel +* Add "db=" URL parameter. ***********************************************************************/ "use strict"; @@ -33,7 +35,6 @@ if (!window.indexedDB) { // for Safari, mostly window.addEventListener("load", function() { var configName = "CONFIG"; // database configuration store name var dbName = "B5500DiskUnit"; // IDB database name - var dbVersion; // current IDB database version (leave undefined) var directoryTop; // start of directory area var directoryEnd; // end of directory area var euPrefix = "EU"; // prefix for EU object store names @@ -653,15 +654,15 @@ window.addEventListener("load", function() { } /**************************************/ - function openDatabase(name, version, successor) { - /* Attempts to open the disk subsystem database for the specified "name" - and "version". Stores the IDB database object in "disk" if successful, or - stores null if unsuccessful. Also gets directoryTop from seg 0 */ + function openDatabase(name, successor) { + /* Attempts to open the disk subsystem database for the specified "name". + Stores the IDB database object in "disk" if successful, or stores null + if unsuccessful. Also gets directoryTop from seg 0 */ var block = new Array(30); var db = null; var req; - req = window.indexedDB.open(name, version); + req = window.indexedDB.open(name); // open current version req.onerror = function(ev) { alert("Cannot open disk database: " + ev.target.error); @@ -688,6 +689,32 @@ window.addEventListener("load", function() { } + /**************************************/ + function getDBName(defaultName) { + /* Parses the URL query string for a "db=name" parameter. If "db" is + found, returns the corresponding name; if not found, returns "defaultName" */ + var args; + var i; + var name; + var search = location.search.substring(1); // drop the "?" + var value = defaultName; + var x; + + args = search.split("&"); + for (x=args.length-1; x>=0; --x) { + i = args[x].indexOf("="); + if (i > 0 ) { + name = decodeURIComponent(args[x].substring(0, i)); + if (name.toLowerCase() == "db") { + value = decodeURIComponent(args[x].substring(i+1)); + break; // out of for loop + } + } + } + + return value; + } + /**************************************/ function checkBrowser() { /* Checks whether this browser can support the necessary stuff */ @@ -713,7 +740,8 @@ window.addEventListener("load", function() { /********** Start of window.onload() **********/ if (!checkBrowser()) { - openDatabase(dbName, dbVersion, function() { + dbName = getDBName(dbName); + openDatabase(dbName, function() { directoryList(function() {}); }); } diff --git a/tools/B5500DiskSystemLogFixer.html b/tools/B5500DiskSystemLogFixer.html index bcc513c..53f5c7c 100644 --- a/tools/B5500DiskSystemLogFixer.html +++ b/tools/B5500DiskSystemLogFixer.html @@ -24,6 +24,8 @@ ************************************************************************ * 2013-07-27 P.Kimpel * Original version, from B5500DiskDirList.html. +* 2015-04-17 P.Kimpel +* Add "db=" URL parameter. ***********************************************************************/ "use strict"; @@ -34,7 +36,6 @@ if (!window.indexedDB) { // for Safari, mostly window.addEventListener("load", function() { var configName = "CONFIG"; // database configuration store name var dbName = "B5500DiskUnit"; // IDB database name - var dbVersion; // current IDB database version (leave undefined) var directoryTop; // start of directory area var directoryEnd; // end of directory area var euPrefix = "EU"; // prefix for EU object store names @@ -495,15 +496,15 @@ window.addEventListener("load", function() { } /**************************************/ - function openDatabase(name, version, successor) { - /* Attempts to open the disk subsystem database for the specified "name" - and "version". Stores the IDB database object in "disk" if successful, or - stores null if unsuccessful. Also gets directoryTop from seg 0 */ + function openDatabase(name, successor) { + /* Attempts to open the disk subsystem database for the specified "name". + Stores the IDB database object in "disk" if successful, or stores null + if unsuccessful. Also gets directoryTop from seg 0 */ var block = new Array(30); var db = null; var req; - req = window.indexedDB.open(name, version); + req = window.indexedDB.open(name); // open current version req.onerror = function(ev) { alert("Cannot open disk database: " + ev.target.error); @@ -530,6 +531,32 @@ window.addEventListener("load", function() { } + /**************************************/ + function getDBName(defaultName) { + /* Parses the URL query string for a "db=name" parameter. If "db" is + found, returns the corresponding name; if not found, returns "defaultName" */ + var args; + var i; + var name; + var search = location.search.substring(1); // drop the "?" + var value = defaultName; + var x; + + args = search.split("&"); + for (x=args.length-1; x>=0; --x) { + i = args[x].indexOf("="); + if (i > 0 ) { + name = decodeURIComponent(args[x].substring(0, i)); + if (name.toLowerCase() == "db") { + value = decodeURIComponent(args[x].substring(i+1)); + break; // out of for loop + } + } + } + + return value; + } + /**************************************/ function checkBrowser() { /* Checks whether this browser can support the necessary stuff */ @@ -555,7 +582,8 @@ window.addEventListener("load", function() { /********** Start of window.onload() **********/ if (!checkBrowser()) { - openDatabase(dbName, dbVersion, function() { + dbName = getDBName(dbName); + openDatabase(dbName, function() { directorySearch("SYSTEM", "LOG", fixIt); }); } diff --git a/tools/B5500FixStorageNames.html b/tools/B5500FixStorageNames.html index b933b78..79e9757 100644 --- a/tools/B5500FixStorageNames.html +++ b/tools/B5500FixStorageNames.html @@ -2,7 +2,10 @@
- + @@ -14,6 +17,36 @@ var storageName = "B5500DiskUnit"; window.addEventListener("load", function(ev) { var req; + /**************************************/ + function getDBName(defaultName) { + /* Parses the URL query string for a "db=name" parameter. If "db" is + found, returns the corresponding name; if not found, returns "defaultName" */ + var args; + var i; + var name; + var search = location.search.substring(1); // drop the "?" + var value = defaultName; + var x; + + args = search.split("&"); + for (x=args.length-1; x>=0; --x) { + i = args[x].indexOf("="); + if (i > 0 ) { + name = decodeURIComponent(args[x].substring(0, i)); + if (name.toLowerCase() == "db") { + value = decodeURIComponent(args[x].substring(i+1)); + break; // out of for loop + } + } + } + + return value; + } + + /***************************************/ + + storageName = getDBName(storageName); + req = window.indexedDB.open(configName); req.onerror = function(ev) { diff --git a/tools/COLDSTART-XIII.card b/tools/COLDSTART-XIII.card index 3ba3228..a0e003a 100644 --- a/tools/COLDSTART-XIII.card +++ b/tools/COLDSTART-XIII.card @@ -90,8 +90,8 @@ 00000000=000000#04*)H/}VY6044A4("000000:2*14"$"50R004J0O4J70100S0|JI000001000011 DRCTRYTP 2000 % START OF DIRECTORY AREA DIRECT 3604 % END OF DIRECTORY AREA -ESU 3 % MAX NUMBER OF EUS -DATE 09/01/84 % CURRENT SYSTEM DATE +ESU 2 % MAX NUMBER OF EUS +DATE 05/10/85 % CURRENT SYSTEM DATE SYSTEMS = 1 % MUST BE 1 (FOR NOW) FENCE = 16384 % USED BY TSMCP ONLY FILE DIRCTRY/DISK, 1|1600, 999 % DIRECTORY ENTRY FOR DIRECTORY @@ -101,13 +101,13 @@ FILE SYSTEM/LOG, 1|5000, 999 % RESERVE SPACE FOR LOG FILE MCP/DISK, 1|1500, 999 % RESERVE SPACE FOR MCP CODE 8610 FILE DMPAREA/DISK, 1|100, 999 % RESERVE SPACE FOR MEM DUMP - 10108 + 10110 FILE RESERVE/DISK, 1|2000, 999 % RESERVE FOR NO-USER-DISK EVENT - 10208 -TYPE BOJ % PRINT BOJ MESSAGES -TYPE EOJ % PRINT EOJ MESSAGES + 10210 +TYPE BOJ % PRINT BOJ MESSAGES +TYPE EOJ % PRINT EOJ MESSAGES TYPE OPEN % PRINT FILE OPEN MESSAGES -USE TERMNATE % REMOVE TASKS FROM MEMORY AT EOJ (NORMALLY SET) +USE TERMNATE % REMOVE TASKS FROM MEMORY AT EOJ (NORMALLY SET) TYPE TIME % REQUIRE TIME TO BE ENTERED AT SPO AFTER HALT/LOAD USE ONEBREAK % WRITE ALL BREAKOUTS TO A SINGLE TAPE USE AUTOPRNT % PRINT BACKUP (SPOOLED) FILES BY DEFAULT @@ -243,4 +243,4 @@ STOP ,FORTRAN/DISK - ,COBOL/DISK - ,LOGOUT/DISK -?END \ No newline at end of file +?END \ No newline at end of file diff --git a/webSite/HelpMenu.html b/webSite/HelpMenu.html index dec5e39..0f07f15 100644 --- a/webSite/HelpMenu.html +++ b/webSite/HelpMenu.html @@ -21,37 +21,37 @@
@@ -63,7 +63,7 @@ Copyright (c) 2013, Nigel Williams and Paul Kimpel • Licensed under the MIT License
diff --git a/webUI/B5500CardPunch.js b/webUI/B5500CardPunch.js index c0889df..0cf51df 100644 --- a/webUI/B5500CardPunch.js +++ b/webUI/B5500CardPunch.js @@ -71,6 +71,40 @@ B5500CardPunch.prototype.clear = function clear() { this.stacker2Count = 0; // cards in stacker #2 }; +/**************************************/ +B5500CardPunch.prototype.emptyStacker = function emptyStacker(stacker) { + /* Empties the stacker of all text lines */ + + while (stacker.firstChild) { + stacker.removeChild(stacker.firstChild); + } +}; + +/**************************************/ +B5500CardPunch.prototype.copyStacker = function copyStacker(ev) { + /* Copies the text contents of a "stacker" area of the device, opens a new + temporary window, and pastes that text into the window so it can be copied + or saved by the user */ + var stacker = ev.target; + var text = stacker.textContent; + var title = "B5500 " + this.mnemonic + " Stacker Snapshot"; + var win = window.open("./B5500FramePaper.html", this.mnemonic + "-Snapshot", + "scrollbars,resizable,width=500,height=500"); + + win.moveTo((screen.availWidth-win.outerWidth)/2, (screen.availHeight-win.outerHeight)/2); + win.addEventListener("load", function() { + var doc; + + doc = win.document; + doc.title = title; + doc.getElementById("Paper").textContent = text; + }); + + this.emptyStacker(stacker); + ev.preventDefault(); + ev.stopPropagation(); +}; + /**************************************/ B5500CardPunch.prototype.setPunchReady = function setPunchReady(ready) { /* Controls the ready-state of the card punch */ @@ -86,14 +120,10 @@ B5500CardPunch.prototype.setPunchReady = function setPunchReady(ready) { this.stacker1Count = this.stacker2Count = 0; this.$$("CPStacker1Bar").value = 0; B5500Util.removeClass(this.$$("CPStacker1Full"), "annunciatorLit"); - while (this.stacker1.firstChild) { - this.stacker1.removeChild(this.stacker1.firstChild); - } + this.emptyStacker(stacker1); this.$$("CPStacker2Bar").value = 0; B5500Util.removeClass(this.$$("CPStacker2Full"), "annunciatorLit"); - while (this.stacker2.firstChild) { - this.stacker2.removeChild(this.stacker2.firstChild); - } + this.emptyStacker(stacker2); } } this.armRunout(false); @@ -214,6 +244,10 @@ B5500CardPunch.prototype.punchOnload = function punchOnload() { this.window.addEventListener("beforeunload", B5500CardPunch.prototype.beforeUnload, false); + this.stacker1.addEventListener("dblclick", + B5500CentralControl.bindMethod(this, B5500CardPunch.prototype.copyStacker)); + this.stacker2.addEventListener("dblclick", + B5500CentralControl.bindMethod(this, B5500CardPunch.prototype.copyStacker)); this.$$("CPStartBtn").addEventListener("click", B5500CentralControl.bindMethod(this, B5500CardPunch.prototype.CPStartBtn_onclick), false); this.$$("CPStopBtn").addEventListener("click", diff --git a/webUI/B5500ColdLoader.html b/webUI/B5500ColdLoader.html index 15492c8..c4e27ac 100644 --- a/webUI/B5500ColdLoader.html +++ b/webUI/B5500ColdLoader.html @@ -72,7 +72,6 @@ if (!window.indexedDB) { // for Safari, mostly window.addEventListener("load", function() { var configName = "CONFIG"; // database configuration store name var dbName = "B5500DiskUnit"; // IDB database name - var dbVersion = 1; // current IDB database version var directoryTop = 2000; // start of directory area var directoryEnd = 3008; // end of directory area var euSize = 200000; // model I size (5 Storage Units: 6MW or 48MC) @@ -1989,13 +1988,13 @@ window.addEventListener("load", function() { } /**************************************/ - function openDatabase(name, version) { - /* Attempts to open the disk subsystem database for the specified "name" - and "version". Stores the IDB database object in "db" if successful, or - stores null if unsuccessful */ + function openDatabase(name) { + /* Attempts to open the disk subsystem database for the specified "name". + Stores the IDB database object in "db" if successful, or stores null + if unsuccessful */ var req; - req = window.indexedDB.open(name, version); + req = window.indexedDB.open(name); req.onerror = function(ev) { alert("Cannot open retro-B5500 Disk Subsystem database:\n" + ev.target.error); @@ -2103,7 +2102,7 @@ window.addEventListener("load", function() { deleteDiskDatabase(dbName); }); $$("LoadBtn").addEventListener("click", loadFromTape); - openDatabase(dbName, dbVersion); + openDatabase(dbName); } }, false); diff --git a/webUI/B5500Console.css b/webUI/B5500Console.css index 56bce97..b7b57a7 100644 --- a/webUI/B5500Console.css +++ b/webUI/B5500Console.css @@ -74,8 +74,9 @@ H1 { border-collapse: collapse; border-spacing: 0} #PageFooter { - position: absolute; - font-size: 75%; - bottom: 4px; - text-align: center; - width: 100%} + margin-top: 2em; + margin-left: calc(50% - 3in); + margin-right: calc(50% - 3in); + font-weight: bold; + color: red; + text-align: center} diff --git a/webUI/B5500Console.html b/webUI/B5500Console.html index 74e713b..968e2c8 100644 --- a/webUI/B5500Console.html +++ b/webUI/B5500Console.html @@ -22,6 +22,8 @@ * Split off Javascript code into a separate script. * 2015-01-24 P.Kimpel * Strip down to new, minimal home page sans console panel. +* 2015-06-10 P.Kimpel +* Change project links from Google Code to GitHub. ***********************************************************************/ --> @@ -63,13 +65,13 @@
| + | Open-Source Project | Project Blog | |
| + | Getting Started Wiki |
@@ -87,6 +89,10 @@
+
+
|