mirror of
https://github.com/pkimpel/retro-b5500.git
synced 2026-04-25 03:45:34 +00:00
Commit retro-b5500 release 1.05:
1. Implement new method to open pop-up windows that schedules pop-up opens through a queue, delaying between opens, and retrying with longer delays when the opens fail. This is to satisfy new restrictions on pop-ups introduced in Apple Safari 11.0, even when the browser is configured to enable pop-ups. 2. Remove the Application Cache facility. This API has been deprecated and will be removed from browsers. 3. Implement improved setCallback() asynchronous timing mechanism with a new Promise-based approach developed for the retro-220 emulator. 4. Correct Processor memory access logic to avoid causing an Invalid Address interrupt in Control State. 5. Correct Processor Exit Character Mode (XX00) by implementing it separately from Word Mode exits. 6. Implement separate jump mechanisms for Word and Character Mode to correct edge-case errors. 7. Make slight correction to clock counting in singlePrecisionAdd. 8. Fix bug in double-clicking the "stacker" of the card punch to extract its contents. 9. Disable I/O descriptor word count in IOUnit for card reader/punch operations; remove extraneous blank card between card-load programs from the COLDSTART-XIII.card and COOLSTART-XIII.card decks that was previously required to prevent "eating" the second program's boot card. 10. Remove extraneous whitespace from B5500FramePaper used for most text-only windows and frames. 11. Compute HPT disk latency based on current timestamp rather than a random number. 12. Correct top-of-form handling in B5500LinePrinter. 13. Correct annimation of tape reel in B5500MagTapeDrive. 14. Replace the emulator's custom bindMethod() utility routine with Function.bind(). 15. Replace the emulator's custom DOM className utility routines by DOM classList methods. 16. Add P1 S and F register values to the internal tape dump caption; improve the dump tape's label records. 17. Give the annunciators on the ConsolePanel a dark gray presence when they are not lit. 18. Correct the method to "focus" the ConsolePanel window after the SPO initializes and becomes ready. 19. Clean up line delimiters in source and make consistent for Windows systems.
This commit is contained in:
33
.gitattributes
vendored
Normal file
33
.gitattributes
vendored
Normal file
@@ -0,0 +1,33 @@
|
||||
# Set the default behavior, in case people don't have core.autocrlf set.
|
||||
* text=auto
|
||||
|
||||
# Explicitly declare text files you want to always be normalized and converted
|
||||
# to native line endings on checkout.
|
||||
*.html text
|
||||
*.css text
|
||||
*.js text
|
||||
*.md text
|
||||
*.txt text
|
||||
*.lst text
|
||||
*.svg text
|
||||
*.card text
|
||||
*.tape text
|
||||
*.pt text
|
||||
*.bacg text
|
||||
*.baca text
|
||||
*.cmd text
|
||||
*.bat text
|
||||
*.wsf text
|
||||
*.vbs text
|
||||
|
||||
# Denote all files that are truly binary and should not be modified.
|
||||
*.png binary
|
||||
*.gif binary
|
||||
*.jpg binary
|
||||
*.ttf binary
|
||||
*.woff binary
|
||||
*.pdf binary
|
||||
*.doc binary
|
||||
*.docx binary
|
||||
*.xls binary
|
||||
*.xlsx binary
|
||||
19
.gitignore
vendored
Normal file
19
.gitignore
vendored
Normal file
@@ -0,0 +1,19 @@
|
||||
#############
|
||||
## Windows detritus
|
||||
#############
|
||||
|
||||
# Windows image file caches
|
||||
Thumbs.db
|
||||
ehthumbs.db
|
||||
|
||||
# Folder config file
|
||||
Desktop.ini
|
||||
|
||||
#IIS config file
|
||||
web.config
|
||||
|
||||
# Recycle Bin used on file shares
|
||||
$RECYCLE.BIN/
|
||||
|
||||
# Mac crap
|
||||
.DS_Store
|
||||
72
README.md
72
README.md
@@ -1,36 +1,36 @@
|
||||
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 new concepts together and made them work so well in a commercially-successful product:
|
||||
|
||||
* Stack- and descriptor-oriented instruction set
|
||||
* Variable-length memory segments
|
||||
* Hardware bounds checking
|
||||
* Unified integer/floating-point numeric format
|
||||
* Designed for and programmed exclusively in higher-level languages
|
||||
* Designed for and managed by a sophisticated operating system, the Master Control Program, or **MCP**
|
||||
* Multi-programming (multiple tasks sharing the same processor)
|
||||
* Multi-processing (multiple physical processors sharing common memory and I/O)
|
||||
* Automatic memory allocation and address relocation
|
||||
* Automatic memory segment overlay (what we now call virtual memory)
|
||||
* Use of labeled file media and automatic assignment of labeled file media to requesting programs (what we now call automatic volume recognition)
|
||||
|
||||
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/ |
|
||||
| Web/email Forum | http://groups.google.com/group/retro-b5500 |
|
||||
| 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 |
|
||||
|
||||
|
||||
This project was originally hosted on Google Code at https://code.google.com/p/retro-b5500 and moved to GitHub in June 2015.
|
||||
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 new concepts together and made them work so well in a commercially-successful product:
|
||||
|
||||
* Stack- and descriptor-oriented instruction set
|
||||
* Variable-length memory segments
|
||||
* Hardware bounds checking
|
||||
* Unified integer/floating-point numeric format
|
||||
* Designed for and programmed exclusively in higher-level languages
|
||||
* Designed for and managed by a sophisticated operating system, the Master Control Program, or **MCP**
|
||||
* Multi-programming (multiple tasks sharing the same processor)
|
||||
* Multi-processing (multiple physical processors sharing common memory and I/O)
|
||||
* Automatic memory allocation and address relocation
|
||||
* Automatic memory segment overlay (what we now call virtual memory)
|
||||
* Use of labeled file media and automatic assignment of labeled file media to requesting programs (what we now call automatic volume recognition)
|
||||
|
||||
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/ |
|
||||
| Web/email Forum | http://groups.google.com/group/retro-b5500 |
|
||||
| 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 |
|
||||
|
||||
|
||||
This project was originally hosted on Google Code at https://code.google.com/p/retro-b5500 and moved to GitHub in June 2015.
|
||||
|
||||
@@ -61,7 +61,7 @@ function B5500CentralControl(global) {
|
||||
/**************************************/
|
||||
|
||||
/* Global constants */
|
||||
B5500CentralControl.version = "1.04";
|
||||
B5500CentralControl.version = "1.05";
|
||||
|
||||
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)
|
||||
@@ -150,15 +150,6 @@ B5500CentralControl.unitSpecs = {
|
||||
MTA: {unitIndex: 47, designate: 1, unitClass: "B5500MagTapeDrive"}};
|
||||
|
||||
|
||||
/**************************************/
|
||||
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 */
|
||||
|
||||
return function bindMethodAnon() {return f.apply(context, arguments)};
|
||||
};
|
||||
|
||||
/**************************************/
|
||||
B5500CentralControl.prototype.clear = function clear() {
|
||||
/* Initializes (and if necessary, creates) the system and starts the
|
||||
@@ -344,7 +335,7 @@ B5500CentralControl.prototype.fetch = function fetch(acc) {
|
||||
}
|
||||
|
||||
// For now, we assume memory parity can never happen
|
||||
if (acc.MAIL || !this.memMod[modNr]) {
|
||||
if (!this.memMod[modNr]) {
|
||||
acc.MPED = 0; // no memory parity error
|
||||
acc.MAED = 1; // memory address error
|
||||
// no .word value is returned in this case
|
||||
@@ -388,7 +379,7 @@ B5500CentralControl.prototype.store = function store(acc) {
|
||||
}
|
||||
|
||||
// For now, we assume memory parity can never happen
|
||||
if (acc.MAIL || !this.memMod[modNr]) {
|
||||
if (!this.memMod[modNr]) {
|
||||
acc.MPED = 0; // no memory parity error
|
||||
acc.MAED = 1; // memory address error
|
||||
// no word is stored in this case
|
||||
@@ -923,7 +914,6 @@ B5500CentralControl.prototype.dumpSystemState = function dumpSystemState(caption
|
||||
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
|
||||
};
|
||||
@@ -1066,7 +1056,6 @@ B5500CentralControl.prototype.dumpSystemTape = function dumpSystemTape(caption,
|
||||
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
|
||||
};
|
||||
@@ -1127,10 +1116,7 @@ B5500CentralControl.prototype.dumpSystemTape = function dumpSystemTape(caption,
|
||||
}
|
||||
} // for mod
|
||||
|
||||
bic = caption.toUpperCase();
|
||||
while (bic.length < 150) {
|
||||
bic += " ";
|
||||
}
|
||||
bic = caption.toUpperCase() + ", P1 S=" + this.P1.S.toString(8) + " F=" + this.P1.F.toString(8);
|
||||
while (bic.length < 160) {
|
||||
bic += " ";
|
||||
}
|
||||
@@ -1163,8 +1149,8 @@ B5500CentralControl.prototype.configureSystem = function configureSystem(cfg) {
|
||||
cc.CCI05F = 1;
|
||||
cc.signalInterrupt();
|
||||
} else if (f === -1) { // focus Console Panel window (if available)
|
||||
if ("focusConsole" in cc.global) {
|
||||
cc.global.focusConsole();
|
||||
if ("focusConsole" in cc) {
|
||||
cc.focusConsole();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@@ -51,7 +51,6 @@ function B5500IOUnit(ioUnitID, cc) {
|
||||
requestorID: ioUnitID, // 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
|
||||
};
|
||||
@@ -1162,6 +1161,7 @@ B5500IOUnit.prototype.forkIO = function forkIO() {
|
||||
|
||||
// card #1 reader/punch
|
||||
case 10:
|
||||
this.D23F = 0; // disable word count
|
||||
if (this.D24F) { // CRA
|
||||
u.read(this.boundFinishGenericRead, this.buffer, (this.D21F ? 160 : 80), this.D21F, 0);
|
||||
} else { // CPA
|
||||
@@ -1175,6 +1175,7 @@ B5500IOUnit.prototype.forkIO = function forkIO() {
|
||||
|
||||
// card #2 reader
|
||||
case 14:
|
||||
this.D23F = 0; // disable word count
|
||||
if (this.D24F) {
|
||||
u.read(this.boundFinishGenericRead, this.buffer, (this.D21F ? 160 : 80), this.D21F, 0);
|
||||
} else {
|
||||
|
||||
@@ -41,7 +41,6 @@ function B5500Processor(procID, cc) {
|
||||
requestorID: procID, // 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
|
||||
};
|
||||
@@ -56,7 +55,7 @@ function B5500Processor(procID, cc) {
|
||||
/**************************************/
|
||||
|
||||
B5500Processor.cyclesPerMilli = 1000; // clock cycles per millisecond (1000 => 1.0 MHz)
|
||||
B5500Processor.timeSlice = 4000; // this.run() time-slice, clocks
|
||||
B5500Processor.timeSlice = 4000; // this.run() time slice, clocks
|
||||
B5500Processor.delayAlpha = 0.0001; // decay factor for exponential weighted average delay
|
||||
B5500Processor.delayAlpha1 = 1-B5500Processor.delayAlpha;
|
||||
B5500Processor.slackAlpha = 0.00001; // decay factor for exponential weighted average slack
|
||||
@@ -122,7 +121,7 @@ B5500Processor.prototype.clear = function clear() {
|
||||
this.cycleCount = 0; // Cycle count for current syllable
|
||||
this.cycleLimit = 0; // Cycle limit for this.run()
|
||||
this.normalCycles = 0; // Current normal-state cycle count (for UI display)
|
||||
this.runCycles = 0; // Current cycle cound for this.run()
|
||||
this.runCycles = 0; // Current cycle count for this.run()
|
||||
this.totalCycles = 0; // Total cycles executed on this processor
|
||||
this.procStart = 0; // Javascript time that the processor started running, ms
|
||||
this.procTime = 0.001; // Total processor running time, ms
|
||||
@@ -132,10 +131,12 @@ B5500Processor.prototype.clear = function clear() {
|
||||
};
|
||||
|
||||
/**************************************/
|
||||
B5500Processor.prototype.accessError = function accessError() {
|
||||
/* Common error handling routine for all memory acccesses */
|
||||
B5500Processor.prototype.accessError = function accessError(MAIL) {
|
||||
/* Common error handling routine for all memory acccesses. MAIL is the
|
||||
memory address inhibit level set by attempting to access addresses below
|
||||
octal 1000 when in Normal State */
|
||||
|
||||
if (this.accessor.MAED) {
|
||||
if (MAIL || this.accessor.MAED) {
|
||||
this.I |= 0x02; // set I02F: memory address/inhibit error
|
||||
this.cc.signalInterrupt();
|
||||
} else if (this.accessor.MPED) {
|
||||
@@ -154,14 +155,17 @@ B5500Processor.prototype.loadAviaS = function loadAviaS() {
|
||||
|
||||
this.E = 0x02; // Just to show the world what's happening
|
||||
acc.addr = this.S;
|
||||
acc.MAIL = (this.S < 0x0200 && this.NCSF);
|
||||
this.cc.fetch(acc);
|
||||
this.cycleCount += B5500CentralControl.memReadCycles;
|
||||
if (acc.MAED || acc.MPED) {
|
||||
this.accessError();
|
||||
if (this.S < 0x0200 && this.NCSF) {
|
||||
this.accessError(true);
|
||||
} else {
|
||||
this.A = acc.word;
|
||||
this.AROF = 1;
|
||||
this.cc.fetch(acc);
|
||||
this.cycleCount += B5500CentralControl.memReadCycles;
|
||||
if ((acc.MAED || acc.MPED) && this.NCSF) {
|
||||
this.accessError(false);
|
||||
} else {
|
||||
this.A = acc.word;
|
||||
this.AROF = 1;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@@ -172,14 +176,17 @@ B5500Processor.prototype.loadBviaS = function loadBviaS() {
|
||||
|
||||
this.E = 0x03; // Just to show the world what's happening
|
||||
acc.addr = this.S;
|
||||
acc.MAIL = (this.S < 0x0200 && this.NCSF);
|
||||
this.cc.fetch(acc);
|
||||
this.cycleCount += B5500CentralControl.memReadCycles;
|
||||
if (acc.MAED || acc.MPED) {
|
||||
this.accessError();
|
||||
if (this.S < 0x0200 && this.NCSF) {
|
||||
this.accessError(true);
|
||||
} else {
|
||||
this.B = acc.word;
|
||||
this.BROF = 1;
|
||||
this.cc.fetch(acc);
|
||||
this.cycleCount += B5500CentralControl.memReadCycles;
|
||||
if ((acc.MAED || acc.MPED) && this.NCSF) {
|
||||
this.accessError(false);
|
||||
} else {
|
||||
this.B = acc.word;
|
||||
this.BROF = 1;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@@ -190,14 +197,17 @@ B5500Processor.prototype.loadAviaM = function loadAviaM() {
|
||||
|
||||
this.E = 0x04; // Just to show the world what's happening
|
||||
acc.addr = this.M;
|
||||
acc.MAIL = (this.M < 0x0200 && this.NCSF);
|
||||
this.cc.fetch(acc);
|
||||
this.cycleCount += B5500CentralControl.memReadCycles;
|
||||
if (acc.MAED || acc.MPED) {
|
||||
this.accessError();
|
||||
if (this.M < 0x0200 && this.NCSF) {
|
||||
this.accessError(true);
|
||||
} else {
|
||||
this.A = acc.word;
|
||||
this.AROF = 1;
|
||||
this.cc.fetch(acc);
|
||||
this.cycleCount += B5500CentralControl.memReadCycles;
|
||||
if ((acc.MAED || acc.MPED) && this.NCSF) {
|
||||
this.accessError(false);
|
||||
} else {
|
||||
this.A = acc.word;
|
||||
this.AROF = 1;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@@ -208,14 +218,17 @@ B5500Processor.prototype.loadBviaM = function loadBviaM() {
|
||||
|
||||
this.E = 0x05; // Just to show the world what's happening
|
||||
acc.addr = this.M;
|
||||
acc.MAIL = (this.M < 0x0200 && this.NCSF);
|
||||
this.cc.fetch(acc);
|
||||
this.cycleCount += B5500CentralControl.memReadCycles;
|
||||
if (acc.MAED || acc.MPED) {
|
||||
this.accessError();
|
||||
if (this.M < 0x0200 && this.NCSF) {
|
||||
this.accessError(true);
|
||||
} else {
|
||||
this.B = acc.word;
|
||||
this.BROF = 1;
|
||||
this.cc.fetch(acc);
|
||||
this.cycleCount += B5500CentralControl.memReadCycles;
|
||||
if ((acc.MAED || acc.MPED) && this.NCSF) {
|
||||
this.accessError(false);
|
||||
} else {
|
||||
this.B = acc.word;
|
||||
this.BROF = 1;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@@ -226,13 +239,16 @@ B5500Processor.prototype.loadMviaM = function loadMviaM() {
|
||||
|
||||
this.E = 0x06; // Just to show the world what's happening
|
||||
acc.addr = this.M;
|
||||
acc.MAIL = (this.M < 0x0200 && this.NCSF);
|
||||
this.cc.fetch(acc);
|
||||
this.cycleCount += B5500CentralControl.memReadCycles;
|
||||
if (acc.MAED || acc.MPED) {
|
||||
this.accessError();
|
||||
if (this.M < 0x0200 && this.NCSF) {
|
||||
this.accessError(true);
|
||||
} else {
|
||||
this.M = (acc.word % 0x40000000) >>> 15;
|
||||
this.cc.fetch(acc);
|
||||
this.cycleCount += B5500CentralControl.memReadCycles;
|
||||
if ((acc.MAED || acc.MPED) && this.NCSF) {
|
||||
this.accessError(false);
|
||||
} else {
|
||||
this.M = (acc.word % 0x40000000) >>> 15;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@@ -243,14 +259,17 @@ B5500Processor.prototype.loadPviaC = function loadPviaC() {
|
||||
|
||||
this.E = 0x30; // Just to show the world what's happening
|
||||
acc.addr = this.C;
|
||||
acc.MAIL = (this.C < 0x0200 && this.NCSF);
|
||||
this.cc.fetch(acc);
|
||||
this.PROF = 1; // PROF gets set even for invalid address
|
||||
this.cycleCount += B5500CentralControl.memReadCycles;
|
||||
if (acc.MAED || acc.MPED) {
|
||||
this.accessError();
|
||||
if (this.C < 0x0200 && this.NCSF) {
|
||||
this.accessError(true);
|
||||
} else {
|
||||
this.P = acc.word;
|
||||
this.cc.fetch(acc);
|
||||
this.PROF = 1; // PROF gets set even for invalid address
|
||||
this.cycleCount += B5500CentralControl.memReadCycles;
|
||||
if ((acc.MAED || acc.MPED) && this.NCSF) {
|
||||
this.accessError(false);
|
||||
} else {
|
||||
this.P = acc.word;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@@ -261,12 +280,15 @@ B5500Processor.prototype.storeAviaS = function storeAviaS() {
|
||||
|
||||
this.E = 0x0A; // Just to show the world what's happening
|
||||
acc.addr = this.S;
|
||||
acc.MAIL = (this.S < 0x0200 && this.NCSF);
|
||||
acc.word = this.A;
|
||||
this.cc.store(acc);
|
||||
this.cycleCount += B5500CentralControl.memWriteCycles;
|
||||
if (acc.MAED || acc.MPED) {
|
||||
this.accessError();
|
||||
if (this.S < 0x0200 && this.NCSF) {
|
||||
this.accessError(true);
|
||||
} else {
|
||||
acc.word = this.A;
|
||||
this.cc.store(acc);
|
||||
this.cycleCount += B5500CentralControl.memWriteCycles;
|
||||
if ((acc.MAED || acc.MPED) && this.NCSF) {
|
||||
this.accessError(false);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@@ -277,12 +299,15 @@ B5500Processor.prototype.storeBviaS = function storeBviaS() {
|
||||
|
||||
this.E = 0x0B; // Just to show the world what's happening
|
||||
acc.addr = this.S;
|
||||
acc.MAIL = (this.S < 0x0200 && this.NCSF);
|
||||
acc.word = this.B;
|
||||
this.cc.store(acc);
|
||||
this.cycleCount += B5500CentralControl.memWriteCycles;
|
||||
if (acc.MAED || acc.MPED) {
|
||||
this.accessError();
|
||||
if (this.S < 0x0200 && this.NCSF) {
|
||||
this.accessError(true);
|
||||
} else {
|
||||
acc.word = this.B;
|
||||
this.cc.store(acc);
|
||||
this.cycleCount += B5500CentralControl.memWriteCycles;
|
||||
if ((acc.MAED || acc.MPED) && this.NCSF) {
|
||||
this.accessError(false);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@@ -293,12 +318,15 @@ B5500Processor.prototype.storeAviaM = function storeAviaM() {
|
||||
|
||||
this.E = 0x0C; // Just to show the world what's happening
|
||||
acc.addr = this.M;
|
||||
acc.MAIL = (this.M < 0x0200 && this.NCSF);
|
||||
acc.word = this.A;
|
||||
this.cc.store(acc);
|
||||
this.cycleCount += B5500CentralControl.memWriteCycles;
|
||||
if (acc.MAED || acc.MPED) {
|
||||
this.accessError();
|
||||
if (this.M < 0x0200 && this.NCSF) {
|
||||
this.accessError(true);
|
||||
} else {
|
||||
acc.word = this.A;
|
||||
this.cc.store(acc);
|
||||
this.cycleCount += B5500CentralControl.memWriteCycles;
|
||||
if ((acc.MAED || acc.MPED) && this.NCSF) {
|
||||
this.accessError(false);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@@ -309,12 +337,15 @@ B5500Processor.prototype.storeBviaM = function storeBviaM() {
|
||||
|
||||
this.E = 0x0D; // Just to show the world what's happening
|
||||
acc.addr = this.M;
|
||||
acc.MAIL = (this.M < 0x0200 && this.NCSF);
|
||||
acc.word = this.B;
|
||||
this.cc.store(acc);
|
||||
this.cycleCount += B5500CentralControl.memWriteCycles;
|
||||
if (acc.MAED || acc.MPED) {
|
||||
this.accessError();
|
||||
if (this.M < 0x0200 && this.NCSF) {
|
||||
this.accessError(true);
|
||||
} else {
|
||||
acc.word = this.B;
|
||||
this.cc.store(acc);
|
||||
this.cycleCount += B5500CentralControl.memWriteCycles;
|
||||
if ((acc.MAED || acc.MPED) && this.NCSF) {
|
||||
this.accessError(false);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@@ -477,33 +508,65 @@ B5500Processor.prototype.exchangeTOS = function exchangeTOS() {
|
||||
};
|
||||
|
||||
/**************************************/
|
||||
B5500Processor.prototype.jumpSyllables = function jumpSyllables(count) {
|
||||
/* Adjusts the C and L registers by "count" syllables (which may be negative).
|
||||
Forces a fetch to reload the P register after C and L are adjusted.
|
||||
On entry, C and L are assumed to be pointing to the next instruction
|
||||
to be executed, not the current one */
|
||||
var addr;
|
||||
B5500Processor.prototype.jumpSyllables = function jumpSyllables(backward) {
|
||||
/* Adjusts the C and L registers by the number of syllables in the low-order
|
||||
12 bits of the A register. If "backward" is true, the branch is in the
|
||||
reverse direction. On entry, C and L are assumed to be pointing to the next
|
||||
instruction to be executed, not the current one, and the branch is relative
|
||||
to that instruction. Forces a fetch to reload the P register after C and L
|
||||
are adjusted */
|
||||
var addr = this.C*4 + this.L;
|
||||
var count = this.A % 0x1000;
|
||||
|
||||
addr = this.C*4 + this.L + count;
|
||||
this.C = addr >>> 2;
|
||||
this.L = addr & 0x03;
|
||||
if (backward) {
|
||||
addr -= count;
|
||||
} else {
|
||||
addr += count;
|
||||
}
|
||||
|
||||
this.C = this.M = addr >>> 2; // set M for display only
|
||||
this.L = addr % 4;
|
||||
this.PROF = 0; // require fetch at SECL
|
||||
};
|
||||
|
||||
/**************************************/
|
||||
B5500Processor.prototype.jumpWords = function jumpWords(count) {
|
||||
/* Adjusts the C register by "count" words (which may be negative). L is set
|
||||
to zero. Forces a fetch to reload the P register after C and L are adjusted.
|
||||
On entry, C is assumed to be pointing to the CURRENT instruction word, i.e.,
|
||||
Inhibit Fetch and Inhibit Count for Fetch have both been asserted. Any adjustment
|
||||
to C to account for the emulator's automatic C/L increment at SECL is the
|
||||
responsibility of the caller */
|
||||
B5500Processor.prototype.jumpWords = function jumpWords(backward) {
|
||||
/* Adjusts the C register by the number of words in the low-order 10 bits of
|
||||
the A register. If "backward" is true, the branch is in the reverse direction.
|
||||
On entry, C is assumed to be pointing to the next instruction to be executed.
|
||||
The branch is relative to the word containing the current instruction. L is
|
||||
unconditionally set to zero. Forces a fetch to reload the P register after C
|
||||
and L are adjusted */
|
||||
var count = this.A % 0x400;
|
||||
|
||||
this.C += count;
|
||||
if (this.L == 0) { // current instruction is in C-1
|
||||
--this.C;
|
||||
}
|
||||
|
||||
if (backward) {
|
||||
this.C -= count;
|
||||
} else {
|
||||
this.C += count;
|
||||
}
|
||||
|
||||
this.M = this.C; // set M for display only
|
||||
this.L = 0;
|
||||
this.PROF = 0; // require fetch at SECL
|
||||
};
|
||||
|
||||
/**************************************/
|
||||
B5500Processor.prototype.jumpCharMode = function jumpCharMode(count) {
|
||||
/* Adjusts the C and L registers by "count" syllables (which may be negative).
|
||||
Forces a fetch to reload the P register after C and L are adjusted.
|
||||
On entry, C and L are assumed to be pointing to the next instruction
|
||||
to be executed, not the current one */
|
||||
var addr = this.C*4 + this.L + count;
|
||||
|
||||
this.C = addr >>> 2;
|
||||
this.L = addr & 0x03;
|
||||
this.PROF = 0; // require fetch at SECL
|
||||
};
|
||||
|
||||
/**************************************/
|
||||
B5500Processor.prototype.jumpOutOfLoop = function jumpOutOfLoop(count) {
|
||||
/* Terminates the current character-mode loop by restoring the prior LCW
|
||||
@@ -517,7 +580,7 @@ B5500Processor.prototype.jumpOutOfLoop = function jumpOutOfLoop(count) {
|
||||
this.loadAviaS(); // A = [S], fetch prior LCW from stack
|
||||
if (count) {
|
||||
this.cycleCount += (count >>> 2) + (count & 0x03);
|
||||
this.jumpSyllables(count);
|
||||
this.jumpCharMode(count);
|
||||
}
|
||||
this.X = this.A % 0x8000000000; // store prior LCW (39 bits: less control bits) in X
|
||||
this.S = t1; // restore S
|
||||
@@ -1177,7 +1240,7 @@ B5500Processor.prototype.streamInputConvert = function streamInputConvert(count)
|
||||
here, too. Note that a maximum of 8 characters are converted */
|
||||
var a = 0; // local working copy of A
|
||||
var b = 0; // local working copy of B
|
||||
var power = 1; // A-register shif factor
|
||||
var power = 1; // A-register shift factor
|
||||
|
||||
this.streamAdjustSourceChar();
|
||||
if (this.BROF) {
|
||||
@@ -1579,7 +1642,7 @@ B5500Processor.prototype.initiate = function initiate(forTest) {
|
||||
}
|
||||
}
|
||||
|
||||
this.T = this.cc.fieldIsolate(this.P, this.L*12, 12);
|
||||
// this.T = this.cc.fieldIsolate(this.P, this.L*12, 12); // redundant: will be set at SECL
|
||||
this.TROF = 1;
|
||||
if (!forTest) {
|
||||
this.NCSF = 1;
|
||||
@@ -1684,6 +1747,7 @@ B5500Processor.prototype.singlePrecisionAdd = function singlePrecisionAdd(adding
|
||||
/* Adds the contents of the A register to the B register, leaving the result
|
||||
in B and invalidating A. If "adding" is not true, subtraction is performed
|
||||
instead of addition.
|
||||
|
||||
The B5500 did this by complement arithmetic, exchanging operands as necessary,
|
||||
and maintaining a bunch of Q-register flags to keep it all straight. Since the
|
||||
B5500 used a unified numeric word format, this routine does both integer and
|
||||
@@ -1698,7 +1762,7 @@ B5500Processor.prototype.singlePrecisionAdd = function singlePrecisionAdd(adding
|
||||
implementing most of the J-count state logic as described in the Flow Chart
|
||||
and Training Manual documents. This runs considerably slower (in terms of
|
||||
number of emulated clocks) than the original version, e.g., the
|
||||
YUSPAR-RETRO-DECK.card test runs about 7% slower with this version.
|
||||
YUSPAR-RETRO-DECK.card test runs about 4% slower with this version.
|
||||
|
||||
During development of this version of SP add/subtract we learned that the
|
||||
flows can be subtle, and some things are not as they appear on the surface.
|
||||
@@ -1743,7 +1807,7 @@ B5500Processor.prototype.singlePrecisionAdd = function singlePrecisionAdd(adding
|
||||
in that 13th octade have matching states, or correspondingly, W03L is true if
|
||||
NONE of the three pairs of bits have matching states. That is a form of logical
|
||||
equivalence, not arithmetic equality. Logical equivalence is the complement of
|
||||
exclusive-or. Hence the eye-watering expression for W03L/ in case 5 under !Q04F
|
||||
exclusive-OR. Hence the eye-watering expression for W03L/ in case 5 under !Q04F
|
||||
that extracts the 13th octades from both register values, XORs them, complements
|
||||
the result, and tests that for not equal to zero.
|
||||
*/
|
||||
@@ -1770,7 +1834,6 @@ B5500Processor.prototype.singlePrecisionAdd = function singlePrecisionAdd(adding
|
||||
var W36C; // true => carry from 12th octade of sum
|
||||
var W99L; // true => internal addition operation
|
||||
|
||||
this.cycleCount += 2; // estimate some general overhead
|
||||
this.adjustABFull();
|
||||
this.AROF = 0; // A is unconditionally marked empty
|
||||
ma = this.A % 0x8000000000; // extract the A mantissa
|
||||
@@ -3327,7 +3390,7 @@ B5500Processor.prototype.doublePrecisionDivide = function doublePrecisionDivide(
|
||||
// 0.999999999985). See the Training Manual and flows for details.
|
||||
|
||||
// I have no idea why setting the high-order octade of the mantissa
|
||||
// to zero (which forces a normalization shift in DLM) is necessary
|
||||
// to zero (which forces a normalization shift in DLM) is necessary
|
||||
// or why it works, but it is and it does.
|
||||
|
||||
if (xx == 0) { // q2 is zero: no multiply needed
|
||||
@@ -3630,9 +3693,8 @@ B5500Processor.prototype.buildMSCW = function buildMSCW() {
|
||||
B5500Processor.prototype.applyMSCW = function applyMSCW(word) {
|
||||
/* Set processor state from fields of the Mark Stack Control
|
||||
Word in the "word" parameter */
|
||||
var f;
|
||||
var f = word % 0x8000; // [33:15], not used
|
||||
|
||||
f = word % 0x8000; // [33:15], not used
|
||||
word = (word-f)/0x8000;
|
||||
this.F = f = word % 0x8000; // [18:15], F register
|
||||
word = (word-f)/0x8000;
|
||||
@@ -3662,9 +3724,8 @@ B5500Processor.prototype.applyRCW = function applyRCW(word, inline) {
|
||||
/* Set processor state from fields of the Return Control Word in
|
||||
the "word" parameter. If "inline" is truthy, C & L are NOT restored from
|
||||
the RCW. Returns the state of the OPDC/DESC bit [2:1] */
|
||||
var f;
|
||||
var f = word % 0x8000; // [33:15], C
|
||||
|
||||
f = word % 0x8000; // [33:15], C
|
||||
if (!inline) {
|
||||
this.C = f;
|
||||
this.PROF = 0; // require fetch at SECL
|
||||
@@ -3758,12 +3819,17 @@ B5500Processor.prototype.enterSubroutine = function enterSubroutine(descriptorCa
|
||||
this.L = 0;
|
||||
this.PROF = 0; // require fetch at SECL
|
||||
|
||||
//if (this.C == 999) { // TERMINALMESSAGE address for Mark XIII only
|
||||
// this.cc.B5500DumpTape("Enter TERMINALMESSAGE"); // <<< DEBUG >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
|
||||
//}
|
||||
|
||||
// Fix up the rest of the registers
|
||||
if (arg) {
|
||||
this.F = this.S;
|
||||
} else {
|
||||
this.F = (aw % 0x40000000) >>> 15; // aw.[18:15]
|
||||
}
|
||||
|
||||
this.AROF = 0;
|
||||
this.BROF = 0;
|
||||
this.SALF = 1;
|
||||
@@ -3778,10 +3844,9 @@ B5500Processor.prototype.enterSubroutine = function enterSubroutine(descriptorCa
|
||||
};
|
||||
|
||||
/**************************************/
|
||||
B5500Processor.prototype.exitSubroutine = function exitSubroutine(inline) {
|
||||
B5500Processor.prototype.exitSubroutine = function exitSubroutine() {
|
||||
/* Exits a subroutine by restoring the processor state from RCW and MSCW words
|
||||
in the stack. "inline" indicates the C & L registers are NOT restored from the
|
||||
RCW. The RCW is assumed to be in the B register, pointing to the MSCW.
|
||||
in the stack. The RCW is assumed to be in the B register, pointing to the MSCW.
|
||||
The A register is not affected by this routine. If SALF & MSFF bits in the MSCW
|
||||
are set, link back through the MSCWs until one is found that has either bit not
|
||||
set, and store that MSCW at [R]+7. This is the last prior MSCW that actually
|
||||
@@ -3798,9 +3863,10 @@ B5500Processor.prototype.exitSubroutine = function exitSubroutine(inline) {
|
||||
if (this.NCSF) {
|
||||
this.I = (this.I & 0x0F) | 0x80; // set I08: flag-bit
|
||||
this.cc.signalInterrupt();
|
||||
//this.cc.B5500DumpTape("Flag Bit: Exit-Sub"); // <<< DEBUG >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
|
||||
}
|
||||
} else { // flag bit is set
|
||||
result = this.applyRCW(this.B, inline);
|
||||
result = this.applyRCW(this.B, 0);
|
||||
this.X = this.B % 0x8000000000; // save F setting from RCW to restore S at end
|
||||
|
||||
this.S = this.F;
|
||||
@@ -3822,6 +3888,39 @@ B5500Processor.prototype.exitSubroutine = function exitSubroutine(inline) {
|
||||
return result;
|
||||
};
|
||||
|
||||
/**************************************/
|
||||
B5500Processor.prototype.exitCharacterMode = function exitCharacterMode(inline) {
|
||||
/* Exits character mode, either a subroutine or an in-line call. If "inline" is
|
||||
true, the C & L registers are NOT restored from the RCW. The B register is loaded
|
||||
with the RCW if it is not already present. The A register is invalidated */
|
||||
|
||||
if (this.BROF) {
|
||||
this.storeBviaS(); // store destination string
|
||||
}
|
||||
|
||||
this.S = this.F;
|
||||
this.AROF = 0;
|
||||
this.loadBviaS(); // B = [S], fetch the RCW
|
||||
if (this.B < 0x800000000000) { // flag bit not set
|
||||
if (this.NCSF) {
|
||||
this.I = (this.I & 0x0F) | 0x80; // set I08: flag-bit
|
||||
this.cc.signalInterrupt();
|
||||
//this.cc.B5500DumpTape("Flag Bit: Exit-Char-Mode"); // <<< DEBUG >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
|
||||
}
|
||||
} else { // flag bit is set
|
||||
this.S = ((this.B - this.B % 0x8000)/0x8000) % 0x8000; // get address of MSCW
|
||||
this.MSFF = 0; // AKA TFFF
|
||||
this.SALF = 0;
|
||||
this.applyRCW(this.B, inline);
|
||||
this.loadBviaS(); // B = [S], fetch the MSCW
|
||||
--this.S; // delete the MSCW
|
||||
this.applyMSCW(this.B);
|
||||
this.BROF = 0;
|
||||
this.X = this.M = this.N = 0;
|
||||
this.CWMF = 0; // return to word mode
|
||||
}
|
||||
};
|
||||
|
||||
/**************************************/
|
||||
B5500Processor.prototype.operandCall = function operandCall() {
|
||||
/* OPDC, the moral equivalent of "load accumulator" on lesser
|
||||
@@ -3847,7 +3946,7 @@ B5500Processor.prototype.operandCall = function operandCall() {
|
||||
if (this.A >= 0x800000000000 && this.NCSF) {// Flag bit is set
|
||||
this.I = (this.I & 0x0F) | 0x80; // set I08: flag-bit interrupt
|
||||
this.cc.signalInterrupt();
|
||||
// B5500DumpState("Flag Bit: OPDC"); // <<< DEBUG >>>
|
||||
//this.cc.B5500DumpTape("Flag Bit: OPDC"); // <<< DEBUG >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -3961,15 +4060,7 @@ B5500Processor.prototype.run = function run() {
|
||||
noSECL = 0; // force off by default (set by CRF)
|
||||
switch (opcode & 0x3F) {
|
||||
case 0x00: // XX00: CMX, EXC: Exit character mode
|
||||
if (this.BROF) {
|
||||
this.storeBviaS(); // store destination string
|
||||
}
|
||||
this.S = this.F;
|
||||
this.loadBviaS(); // B = [S], fetch the RCW
|
||||
this.exitSubroutine(variant & 0x01);// 0=exit, 1=exit inline
|
||||
this.AROF = this.BROF = 0;
|
||||
this.X = this.M = this.N = 0;
|
||||
this.CWMF = 0;
|
||||
this.exitCharacterMode(variant & 0x01); // variant 0=exit, 1=exit inline
|
||||
break;
|
||||
|
||||
case 0x02: // XX02: BSD=Skip bit destination
|
||||
@@ -4093,7 +4184,7 @@ B5500Processor.prototype.run = function run() {
|
||||
|
||||
case 0x09: // XX11: Control State ops
|
||||
switch (variant) {
|
||||
case 0x14: // 2411: ZPI=Conditional Halt
|
||||
case 0x14: // 2411: ZP1=Conditional Halt
|
||||
if (this.US14X) { // STOP OPERATOR switch on
|
||||
this.stop();
|
||||
}
|
||||
@@ -4362,7 +4453,7 @@ B5500Processor.prototype.run = function run() {
|
||||
case 0x25: // XX45: JFC=Jump forward conditional
|
||||
if (!this.MSFF) { // conditional on TFFF
|
||||
this.cycleCount += (variant >>> 2) + (variant & 0x03);
|
||||
this.jumpSyllables(variant);
|
||||
this.jumpCharMode(variant);
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -4372,7 +4463,7 @@ B5500Processor.prototype.run = function run() {
|
||||
|
||||
case 0x27: // XX47: JFW=Jump forward unconditional
|
||||
this.cycleCount += (variant >>> 2) + (variant & 0x03);
|
||||
this.jumpSyllables(variant);
|
||||
this.jumpCharMode(variant);
|
||||
break;
|
||||
|
||||
case 0x28: // XX50: RCA=Recall control address
|
||||
@@ -4486,7 +4577,7 @@ B5500Processor.prototype.run = function run() {
|
||||
case 0x2D: // XX55: JRC=Jump reverse conditional
|
||||
if (!this.MSFF) { // conditional on TFFF
|
||||
this.cycleCount += (variant >>> 2) + (variant & 0x03);
|
||||
this.jumpSyllables(-variant);
|
||||
this.jumpCharMode(-variant);
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -4517,7 +4608,7 @@ B5500Processor.prototype.run = function run() {
|
||||
|
||||
case 0x2F: // XX57: JRV=Jump reverse unconditional
|
||||
this.cycleCount += (variant >>> 2) + (variant & 0x03);
|
||||
this.jumpSyllables(-variant);
|
||||
this.jumpCharMode(-variant);
|
||||
break;
|
||||
|
||||
case 0x30: // XX60: CEQ=Compare equal
|
||||
@@ -4785,7 +4876,7 @@ B5500Processor.prototype.run = function run() {
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x14: // 2411: ZPI=Conditional Halt
|
||||
case 0x14: // 2411: ZP1=Conditional Halt
|
||||
if (this.US14X) { // STOP OPERATOR switch on
|
||||
this.stop();
|
||||
}
|
||||
@@ -5045,13 +5136,11 @@ B5500Processor.prototype.run = function run() {
|
||||
} else {
|
||||
this.BROF = 0;
|
||||
if (this.A < 0x800000000000) { // simple operand
|
||||
this.jumpSyllables(-(this.A % 0x1000));
|
||||
this.jumpSyllables(true);
|
||||
this.AROF = 0;
|
||||
} else { // descriptor
|
||||
if (this.L == 0) {
|
||||
--this.C; // adjust for Inhibit Fetch
|
||||
}
|
||||
if (this.presenceTest(this.A)) {
|
||||
this.B = this.A; // set B for display only
|
||||
this.C = this.A % 0x8000;
|
||||
this.L = 0;
|
||||
this.PROF = 0; // require fetch at SECL
|
||||
@@ -5068,13 +5157,11 @@ B5500Processor.prototype.run = function run() {
|
||||
} else {
|
||||
this.BROF = 0;
|
||||
if (this.A < 0x800000000000) { // simple operand
|
||||
this.jumpSyllables(this.A % 0x1000);
|
||||
this.jumpSyllables(false);
|
||||
this.AROF = 0;
|
||||
} else { // descriptor
|
||||
if (this.L == 0) {
|
||||
--this.C; // adjust for Inhibit Fetch
|
||||
}
|
||||
if (this.presenceTest(this.A)) {
|
||||
this.B = this.A; // set B for display only
|
||||
this.C = this.A % 0x8000;
|
||||
this.L = 0;
|
||||
this.PROF = 0; // require fetch at SECL
|
||||
@@ -5111,14 +5198,12 @@ B5500Processor.prototype.run = function run() {
|
||||
this.AROF = this.BROF = 0; // true => no branch
|
||||
} else {
|
||||
this.BROF = 0;
|
||||
if (this.L == 0) {
|
||||
--this.C; // adjust for Inhibit Fetch
|
||||
}
|
||||
if (this.A < 0x800000000000) { // simple operand
|
||||
this.jumpWords(-(this.A % 0x0400));
|
||||
this.jumpWords(true);
|
||||
this.AROF = 0;
|
||||
} else { // descriptor
|
||||
if (this.presenceTest(this.A)) {
|
||||
this.B = this.A; // set B for display only
|
||||
this.C = this.A % 0x8000;
|
||||
this.L = 0;
|
||||
this.PROF = 0; // require fetch at SECL
|
||||
@@ -5134,14 +5219,12 @@ B5500Processor.prototype.run = function run() {
|
||||
this.AROF = this.BROF = 0; // true => no branch
|
||||
} else {
|
||||
this.BROF = 0;
|
||||
if (this.L == 0) {
|
||||
--this.C; // adjust for Inhibit Fetch
|
||||
}
|
||||
if (this.A < 0x800000000000) { // simple operand
|
||||
this.jumpWords(this.A % 0x0400);
|
||||
this.jumpWords(false);
|
||||
this.AROF = 0;
|
||||
} else { // descriptor
|
||||
if (this.presenceTest(this.A)) {
|
||||
this.B = this.A; // set B for display only
|
||||
this.C = this.A % 0x8000;
|
||||
this.L = 0;
|
||||
this.PROF = 0; // require fetch at SECL
|
||||
@@ -5160,12 +5243,9 @@ B5500Processor.prototype.run = function run() {
|
||||
case 0x21: // 4131: BBW=branch backward unconditional
|
||||
this.adjustAFull();
|
||||
if (this.A < 0x800000000000) { // simple operand
|
||||
this.jumpSyllables(-(this.A % 0x1000));
|
||||
this.jumpSyllables(true);
|
||||
this.AROF = 0;
|
||||
} else { // descriptor
|
||||
if (this.L == 0) {
|
||||
--this.C; // adjust for Inhibit Fetch
|
||||
}
|
||||
if (this.presenceTest(this.A)) {
|
||||
this.C = this.A % 0x8000;
|
||||
this.L = 0;
|
||||
@@ -5178,12 +5258,9 @@ B5500Processor.prototype.run = function run() {
|
||||
case 0x22: // 4231: BFW=branch forward unconditional
|
||||
this.adjustAFull();
|
||||
if (this.A < 0x800000000000) { // simple operand
|
||||
this.jumpSyllables(this.A % 0x1000);
|
||||
this.jumpSyllables(false);
|
||||
this.AROF = 0;
|
||||
} else { // descriptor
|
||||
if (this.L == 0) {
|
||||
--this.C; // adjust for Inhibit Fetch
|
||||
}
|
||||
if (this.presenceTest(this.A)) {
|
||||
this.C = this.A % 0x8000;
|
||||
this.L = 0;
|
||||
@@ -5202,11 +5279,8 @@ B5500Processor.prototype.run = function run() {
|
||||
|
||||
case 0x31: // 6131: LBU=branch backward word unconditional
|
||||
this.adjustAFull();
|
||||
if (this.L == 0) {
|
||||
--this.C; // adjust for Inhibit Fetch
|
||||
}
|
||||
if (this.A < 0x800000000000) { // simple operand
|
||||
this.jumpWords(-(this.A % 0x0400));
|
||||
this.jumpWords(true);
|
||||
this.AROF = 0;
|
||||
} else { // descriptor
|
||||
if (this.presenceTest(this.A)) {
|
||||
@@ -5220,11 +5294,8 @@ B5500Processor.prototype.run = function run() {
|
||||
|
||||
case 0x32: // 6231: LFU=branch forward word unconditional
|
||||
this.adjustAFull();
|
||||
if (this.L == 0) {
|
||||
--this.C; // adjust for Inhibit Fetch
|
||||
}
|
||||
if (this.A < 0x800000000000) { // simple operand
|
||||
this.jumpWords(this.A % 0x0400);
|
||||
this.jumpWords(false);
|
||||
this.AROF = 0;
|
||||
} else { // descriptor
|
||||
if (this.presenceTest(this.A)) {
|
||||
@@ -5286,7 +5357,7 @@ B5500Processor.prototype.run = function run() {
|
||||
if (this.A < 0x800000000000 || this.presenceTest(this.A)) {
|
||||
this.S = this.F;
|
||||
this.loadBviaS(); // B = [S], fetch the RCW
|
||||
switch (this.exitSubroutine(0)) {
|
||||
switch (this.exitSubroutine()) {
|
||||
case 0:
|
||||
this.X = 0;
|
||||
this.operandCall();
|
||||
@@ -5306,7 +5377,7 @@ B5500Processor.prototype.run = function run() {
|
||||
this.AROF = 0;
|
||||
this.S = this.F;
|
||||
this.loadBviaS(); // B = [S], fetch the RCW
|
||||
this.exitSubroutine(0);
|
||||
this.exitSubroutine();
|
||||
break;
|
||||
|
||||
case 0x0A: // 1235: RTS=return special
|
||||
@@ -5316,7 +5387,7 @@ B5500Processor.prototype.run = function run() {
|
||||
if (this.A < 0x800000000000 || this.presenceTest(this.A)) {
|
||||
// Note that RTS assumes the RCW is pointed to by S, not F
|
||||
this.loadBviaS(); // B = [S], fetch the RCW
|
||||
switch (this.exitSubroutine(0)) {
|
||||
switch (this.exitSubroutine()) {
|
||||
case 0:
|
||||
this.X = 0;
|
||||
this.operandCall();
|
||||
@@ -5459,11 +5530,8 @@ B5500Processor.prototype.run = function run() {
|
||||
case 0x00: // X051/X451: CFN=non-zero field branch forward nondestructive
|
||||
if (t1) {
|
||||
if (this.A < 0x800000000000) { // simple operand
|
||||
this.jumpSyllables(this.A % 0x1000);
|
||||
this.jumpSyllables(false);
|
||||
} else { // descriptor
|
||||
if (this.L == 0) {
|
||||
--this.C; // adjust for Inhibit Fetch
|
||||
}
|
||||
if (this.presenceTest(this.A)) {
|
||||
this.C = this.A % 0x8000;
|
||||
this.L = 0;
|
||||
@@ -5479,11 +5547,8 @@ B5500Processor.prototype.run = function run() {
|
||||
case 0x01: // X151/X551: CBN=non-zero field branch backward nondestructive
|
||||
if (t1) {
|
||||
if (this.A < 0x800000000000) { // simple operand
|
||||
this.jumpSyllables(-(this.A % 0x1000));
|
||||
this.jumpSyllables(true);
|
||||
} else { // descriptor
|
||||
if (this.L == 0) {
|
||||
--this.C; // adjust for Inhibit Fetch
|
||||
}
|
||||
if (this.presenceTest(this.A)) {
|
||||
this.C = this.A % 0x8000;
|
||||
this.L = 0;
|
||||
@@ -5631,13 +5696,13 @@ B5500Processor.prototype.schedule = function schedule() {
|
||||
/* Schedules the processor running time and attempts to throttle performance
|
||||
to approximate that of a real B5500 -- well, at least we hope this will run
|
||||
fast enough that the performance will need to be throttled. It establishes
|
||||
a timeslice in terms of a number of processor "cycles" of 1 microsecond
|
||||
each and calls run() to execute at most that number of cycles. run()
|
||||
counts up cycles until it reaches this limit or some terminating event
|
||||
(such as a halt), then exits back here. If the processor remains active,
|
||||
this routine will reschedule itself after an appropriate delay, thereby
|
||||
throttling the performance and allowing other modules a chance at the
|
||||
single Javascript execution thread */
|
||||
a time slice in terms of a number of processor "cycles" of 1 microsecond
|
||||
each and calls run() to execute at most that number of cycles. run() counts
|
||||
up cycles until it reaches this limit or some terminating event (such as a
|
||||
halt), then exits back here. If the processor remains active, this routine
|
||||
will reschedule itself after an appropriate delay, thereby throttling the
|
||||
performance and allowing other modules to share the single Javascript
|
||||
execution thread */
|
||||
var clockOff = performance.now(); // ending time for the delay and the run() call, ms
|
||||
var delayTime; // delay from/until next run() for this processor, ms
|
||||
var runTime; // real-world processor running time, ms
|
||||
@@ -5649,13 +5714,13 @@ B5500Processor.prototype.schedule = function schedule() {
|
||||
// Compute the exponential weighted average of scheduling delay
|
||||
this.delayDeltaAvg = (delayTime - this.delayRequested)*B5500Processor.delayAlpha +
|
||||
this.delayDeltaAvg*B5500Processor.delayAlpha1;
|
||||
this.procSlackAvg = B5500Processor.slackAlpha*delayTime +
|
||||
this.procSlackAvg = delayTime*B5500Processor.slackAlpha +
|
||||
this.procSlackAvg*B5500Processor.slackAlpha1;
|
||||
|
||||
if (this.busy) {
|
||||
this.cycleLimit = B5500Processor.timeSlice;
|
||||
|
||||
this.run(); // execute syllables for the timeslice
|
||||
this.run(); // execute syllables for the time slice
|
||||
|
||||
clockOff = performance.now();
|
||||
this.procRunAvg = (clockOff - this.delayLastStamp)*B5500Processor.slackAlpha +
|
||||
|
||||
@@ -1,13 +1,3 @@
|
||||
?REMOVE LONGALG/DISK, LONGALG/NEW, NEWSYM/LONGALG 00000100
|
||||
?COMPILE LONGALG/NEW ALGOL LIBRARY 00000200
|
||||
?ALGOL STACK=1000 00000300
|
||||
?ALGOL FILE TAPE=SYMBOL/ALGOL SERIAL 00000400
|
||||
?ALGOL FILE NEWTAPE=NEWSYM/LONGALG SERIAL 00000450
|
||||
?FILE LINE = LINE BACK UP DISK 00000500
|
||||
?FILE NEWTAPE = "0CRDIMG" TAPE 00000600
|
||||
?FILE PNCH = PNCH PUNCH 00000700
|
||||
?DATA CARD 00000800
|
||||
$ TAPE CHECK NEW 00000900
|
||||
%#######################################################################00001000
|
||||
% 00001010
|
||||
% THE SECOND COMING OF THE B-5500 LONGALG COMPILER 00001020
|
||||
@@ -11144,4 +11134,3 @@ PROCEDURE JUMPS; 16431000
|
||||
ENDOFITALL:END MAIN BLOCK 17000100
|
||||
END. 17001000
|
||||
END;END. LAST CARD ON 0CRDIMG TAPE 99999990
|
||||
?END 99999999
|
||||
|
||||
@@ -1,242 +1,242 @@
|
||||
PROGRAM
|
||||
BLOCK
|
||||
BLOKHEAD
|
||||
BLOKBODY
|
||||
LABDEF
|
||||
STAT
|
||||
STAT-
|
||||
EXPR
|
||||
EXPR-
|
||||
IFCLAUSE
|
||||
TRUEPART
|
||||
CATENA
|
||||
DISJ
|
||||
DISJHEAD
|
||||
CONJ
|
||||
CONJ-
|
||||
CONJHEAD
|
||||
NEGATION
|
||||
RELATION
|
||||
CHOICE
|
||||
CHOICE-
|
||||
SUM
|
||||
SUM-
|
||||
TERM
|
||||
TERM-
|
||||
FACTOR
|
||||
FACTOR-
|
||||
PRIMARY
|
||||
PROCDEF
|
||||
PROCHEAD
|
||||
LIST*
|
||||
LISTHEAD
|
||||
REFERENC
|
||||
NUMBER
|
||||
REAL*
|
||||
INTEGER*
|
||||
INTEGER-
|
||||
DIGIT
|
||||
LOGVAL
|
||||
VAR
|
||||
VAR-
|
||||
VARDECL
|
||||
FORDECL
|
||||
LABDECL
|
||||
*
|
||||
0
|
||||
1
|
||||
2
|
||||
3
|
||||
4
|
||||
5
|
||||
6
|
||||
7
|
||||
8
|
||||
9
|
||||
,
|
||||
.
|
||||
;
|
||||
:
|
||||
@
|
||||
NEW
|
||||
FORMAL
|
||||
LABEL
|
||||
IDENT*
|
||||
[
|
||||
]
|
||||
BEGIN
|
||||
END
|
||||
(
|
||||
)
|
||||
LQ
|
||||
RQ
|
||||
GOTO
|
||||
OUT
|
||||
~
|
||||
IF
|
||||
THEN
|
||||
ELSE
|
||||
&
|
||||
OR
|
||||
AND
|
||||
NOT
|
||||
=
|
||||
!
|
||||
<
|
||||
{
|
||||
}
|
||||
>
|
||||
MIN
|
||||
MAX
|
||||
+
|
||||
-
|
||||
|
|
||||
/
|
||||
%
|
||||
MOD
|
||||
*
|
||||
ABS
|
||||
LENGTH
|
||||
INTEGER
|
||||
REAL
|
||||
LOGICAL
|
||||
LIST
|
||||
TAIL
|
||||
IN
|
||||
ISB
|
||||
ISN
|
||||
ISR
|
||||
ISL
|
||||
ISLI
|
||||
ISY
|
||||
ISP
|
||||
ISU
|
||||
SYMBOL*
|
||||
UNDEFINE
|
||||
TEN
|
||||
#
|
||||
TRUE
|
||||
FALSE
|
||||
$
|
||||
*
|
||||
VARDECL NEW IDENT* 001
|
||||
FORDECL FORMAL IDENT* 002
|
||||
LABDECL LABEL IDENT* 003
|
||||
VAR- IDENT* 004
|
||||
VAR- VAR- [ EXPR ] 005
|
||||
VAR- VAR- . 006
|
||||
VAR VAR- 007
|
||||
LOGVAL TRUE 010
|
||||
LOGVAL FALSE 011
|
||||
DIGIT 0 012
|
||||
DIGIT 1 013
|
||||
DIGIT 2 014
|
||||
DIGIT 3 015
|
||||
DIGIT 4 016
|
||||
DIGIT 5 017
|
||||
DIGIT 6 020
|
||||
DIGIT 7 021
|
||||
DIGIT 8 022
|
||||
DIGIT 9 023
|
||||
INTEGER- DIGIT 024
|
||||
INTEGER- INTEGER- DIGIT 025
|
||||
INTEGER* INTEGER- 026
|
||||
REAL* INTEGER* . INTEGER* 027
|
||||
REAL* INTEGER* 030
|
||||
NUMBER REAL* 031
|
||||
NUMBER REAL* TEN INTEGER* 032
|
||||
NUMBER REAL* TEN # INTEGER* 033
|
||||
NUMBER TEN INTEGER* 034
|
||||
NUMBER TEN # INTEGER* 035
|
||||
REFERENC @ VAR 036
|
||||
LISTHEAD LISTHEAD EXPR , 037
|
||||
LISTHEAD ( 040
|
||||
LIST* LISTHEAD EXPR ) 041
|
||||
LIST* LISTHEAD ) 042
|
||||
PROCHEAD PROCHEAD FORDECL ; 043
|
||||
PROCHEAD LQ 044
|
||||
PROCDEF PROCHEAD EXPR RQ 045
|
||||
PRIMARY VAR 046
|
||||
PRIMARY VAR LIST* 047
|
||||
PRIMARY LOGVAL 050
|
||||
PRIMARY NUMBER 051
|
||||
PRIMARY SYMBOL* 052
|
||||
PRIMARY REFERENC 053
|
||||
PRIMARY LIST* 054
|
||||
PRIMARY TAIL PRIMARY 055
|
||||
PRIMARY PROCDEF 056
|
||||
PRIMARY UNDEFINE 057
|
||||
PRIMARY [ EXPR ] 060
|
||||
PRIMARY IN 061
|
||||
PRIMARY ISB VAR 062
|
||||
PRIMARY ISN VAR 063
|
||||
PRIMARY ISR VAR 064
|
||||
PRIMARY ISL VAR 065
|
||||
PRIMARY ISLI VAR 066
|
||||
PRIMARY ISY VAR 067
|
||||
PRIMARY ISP VAR 070
|
||||
PRIMARY ISU VAR 071
|
||||
PRIMARY ABS PRIMARY 072
|
||||
PRIMARY LENGTH VAR 073
|
||||
PRIMARY INTEGER PRIMARY 074
|
||||
PRIMARY REAL PRIMARY 075
|
||||
PRIMARY LOGICAL PRIMARY 076
|
||||
PRIMARY LIST PRIMARY 077
|
||||
FACTOR- PRIMARY 100
|
||||
FACTOR- FACTOR- * PRIMARY 101
|
||||
FACTOR FACTOR- 102
|
||||
TERM- FACTOR 103
|
||||
TERM- TERM- | FACTOR 104
|
||||
TERM- TERM- / FACTOR 105
|
||||
TERM- TERM- % FACTOR 106
|
||||
TERM- TERM- MOD FACTOR 107
|
||||
TERM TERM- 110
|
||||
SUM- TERM 111
|
||||
SUM- + TERM 112
|
||||
SUM- - TERM 113
|
||||
SUM- SUM- + TERM 114
|
||||
SUM- SUM- - TERM 115
|
||||
SUM SUM- 116
|
||||
CHOICE- SUM 117
|
||||
CHOICE- CHOICE- MIN SUM 120
|
||||
CHOICE- CHOICE- MAX SUM 121
|
||||
CHOICE CHOICE- 122
|
||||
RELATION CHOICE 123
|
||||
RELATION CHOICE = CHOICE 124
|
||||
RELATION CHOICE ! CHOICE 125
|
||||
RELATION CHOICE < CHOICE 126
|
||||
RELATION CHOICE { CHOICE 127
|
||||
RELATION CHOICE } CHOICE 130
|
||||
RELATION CHOICE > CHOICE 131
|
||||
NEGATION RELATION 132
|
||||
NEGATION NOT RELATION 133
|
||||
CONJHEAD NEGATION AND 134
|
||||
CONJ- CONJHEAD CONJ- 135
|
||||
CONJ- NEGATION 136
|
||||
CONJ CONJ- 137
|
||||
DISJHEAD CONJ OR 140
|
||||
DISJ DISJHEAD DISJ 141
|
||||
DISJ CONJ 142
|
||||
CATENA CATENA & PRIMARY 143
|
||||
CATENA DISJ 144
|
||||
TRUEPART EXPR ELSE 145
|
||||
IFCLAUSE IF EXPR THEN 146
|
||||
EXPR- BLOCK 147
|
||||
EXPR- IFCLAUSE TRUEPART EXPR- 150
|
||||
EXPR- VAR ~ EXPR- 151
|
||||
EXPR- GOTO PRIMARY 152
|
||||
EXPR- OUT EXPR- 153
|
||||
EXPR- CATENA 154
|
||||
EXPR EXPR- 155
|
||||
STAT- LABDEF STAT- 156
|
||||
STAT- EXPR 157
|
||||
STAT STAT- 160
|
||||
LABDEF IDENT* : 161
|
||||
BLOKHEAD BEGIN 162
|
||||
BLOKHEAD BLOKHEAD VARDECL ; 163
|
||||
BLOKHEAD BLOKHEAD LABDECL ; 164
|
||||
BLOKBODY BLOKHEAD 165
|
||||
BLOKBODY BLOKBODY STAT ; 166
|
||||
BLOCK BLOKBODY STAT END 167
|
||||
PROGRAM $ BLOCK $ 170
|
||||
*
|
||||
PROGRAM
|
||||
BLOCK
|
||||
BLOKHEAD
|
||||
BLOKBODY
|
||||
LABDEF
|
||||
STAT
|
||||
STAT-
|
||||
EXPR
|
||||
EXPR-
|
||||
IFCLAUSE
|
||||
TRUEPART
|
||||
CATENA
|
||||
DISJ
|
||||
DISJHEAD
|
||||
CONJ
|
||||
CONJ-
|
||||
CONJHEAD
|
||||
NEGATION
|
||||
RELATION
|
||||
CHOICE
|
||||
CHOICE-
|
||||
SUM
|
||||
SUM-
|
||||
TERM
|
||||
TERM-
|
||||
FACTOR
|
||||
FACTOR-
|
||||
PRIMARY
|
||||
PROCDEF
|
||||
PROCHEAD
|
||||
LIST*
|
||||
LISTHEAD
|
||||
REFERENC
|
||||
NUMBER
|
||||
REAL*
|
||||
INTEGER*
|
||||
INTEGER-
|
||||
DIGIT
|
||||
LOGVAL
|
||||
VAR
|
||||
VAR-
|
||||
VARDECL
|
||||
FORDECL
|
||||
LABDECL
|
||||
*
|
||||
0
|
||||
1
|
||||
2
|
||||
3
|
||||
4
|
||||
5
|
||||
6
|
||||
7
|
||||
8
|
||||
9
|
||||
,
|
||||
.
|
||||
;
|
||||
:
|
||||
@
|
||||
NEW
|
||||
FORMAL
|
||||
LABEL
|
||||
IDENT*
|
||||
[
|
||||
]
|
||||
BEGIN
|
||||
END
|
||||
(
|
||||
)
|
||||
LQ
|
||||
RQ
|
||||
GOTO
|
||||
OUT
|
||||
~
|
||||
IF
|
||||
THEN
|
||||
ELSE
|
||||
&
|
||||
OR
|
||||
AND
|
||||
NOT
|
||||
=
|
||||
!
|
||||
<
|
||||
{
|
||||
}
|
||||
>
|
||||
MIN
|
||||
MAX
|
||||
+
|
||||
-
|
||||
|
|
||||
/
|
||||
%
|
||||
MOD
|
||||
*
|
||||
ABS
|
||||
LENGTH
|
||||
INTEGER
|
||||
REAL
|
||||
LOGICAL
|
||||
LIST
|
||||
TAIL
|
||||
IN
|
||||
ISB
|
||||
ISN
|
||||
ISR
|
||||
ISL
|
||||
ISLI
|
||||
ISY
|
||||
ISP
|
||||
ISU
|
||||
SYMBOL*
|
||||
UNDEFINE
|
||||
TEN
|
||||
#
|
||||
TRUE
|
||||
FALSE
|
||||
$
|
||||
*
|
||||
VARDECL NEW IDENT* 001
|
||||
FORDECL FORMAL IDENT* 002
|
||||
LABDECL LABEL IDENT* 003
|
||||
VAR- IDENT* 004
|
||||
VAR- VAR- [ EXPR ] 005
|
||||
VAR- VAR- . 006
|
||||
VAR VAR- 007
|
||||
LOGVAL TRUE 010
|
||||
LOGVAL FALSE 011
|
||||
DIGIT 0 012
|
||||
DIGIT 1 013
|
||||
DIGIT 2 014
|
||||
DIGIT 3 015
|
||||
DIGIT 4 016
|
||||
DIGIT 5 017
|
||||
DIGIT 6 020
|
||||
DIGIT 7 021
|
||||
DIGIT 8 022
|
||||
DIGIT 9 023
|
||||
INTEGER- DIGIT 024
|
||||
INTEGER- INTEGER- DIGIT 025
|
||||
INTEGER* INTEGER- 026
|
||||
REAL* INTEGER* . INTEGER* 027
|
||||
REAL* INTEGER* 030
|
||||
NUMBER REAL* 031
|
||||
NUMBER REAL* TEN INTEGER* 032
|
||||
NUMBER REAL* TEN # INTEGER* 033
|
||||
NUMBER TEN INTEGER* 034
|
||||
NUMBER TEN # INTEGER* 035
|
||||
REFERENC @ VAR 036
|
||||
LISTHEAD LISTHEAD EXPR , 037
|
||||
LISTHEAD ( 040
|
||||
LIST* LISTHEAD EXPR ) 041
|
||||
LIST* LISTHEAD ) 042
|
||||
PROCHEAD PROCHEAD FORDECL ; 043
|
||||
PROCHEAD LQ 044
|
||||
PROCDEF PROCHEAD EXPR RQ 045
|
||||
PRIMARY VAR 046
|
||||
PRIMARY VAR LIST* 047
|
||||
PRIMARY LOGVAL 050
|
||||
PRIMARY NUMBER 051
|
||||
PRIMARY SYMBOL* 052
|
||||
PRIMARY REFERENC 053
|
||||
PRIMARY LIST* 054
|
||||
PRIMARY TAIL PRIMARY 055
|
||||
PRIMARY PROCDEF 056
|
||||
PRIMARY UNDEFINE 057
|
||||
PRIMARY [ EXPR ] 060
|
||||
PRIMARY IN 061
|
||||
PRIMARY ISB VAR 062
|
||||
PRIMARY ISN VAR 063
|
||||
PRIMARY ISR VAR 064
|
||||
PRIMARY ISL VAR 065
|
||||
PRIMARY ISLI VAR 066
|
||||
PRIMARY ISY VAR 067
|
||||
PRIMARY ISP VAR 070
|
||||
PRIMARY ISU VAR 071
|
||||
PRIMARY ABS PRIMARY 072
|
||||
PRIMARY LENGTH VAR 073
|
||||
PRIMARY INTEGER PRIMARY 074
|
||||
PRIMARY REAL PRIMARY 075
|
||||
PRIMARY LOGICAL PRIMARY 076
|
||||
PRIMARY LIST PRIMARY 077
|
||||
FACTOR- PRIMARY 100
|
||||
FACTOR- FACTOR- * PRIMARY 101
|
||||
FACTOR FACTOR- 102
|
||||
TERM- FACTOR 103
|
||||
TERM- TERM- | FACTOR 104
|
||||
TERM- TERM- / FACTOR 105
|
||||
TERM- TERM- % FACTOR 106
|
||||
TERM- TERM- MOD FACTOR 107
|
||||
TERM TERM- 110
|
||||
SUM- TERM 111
|
||||
SUM- + TERM 112
|
||||
SUM- - TERM 113
|
||||
SUM- SUM- + TERM 114
|
||||
SUM- SUM- - TERM 115
|
||||
SUM SUM- 116
|
||||
CHOICE- SUM 117
|
||||
CHOICE- CHOICE- MIN SUM 120
|
||||
CHOICE- CHOICE- MAX SUM 121
|
||||
CHOICE CHOICE- 122
|
||||
RELATION CHOICE 123
|
||||
RELATION CHOICE = CHOICE 124
|
||||
RELATION CHOICE ! CHOICE 125
|
||||
RELATION CHOICE < CHOICE 126
|
||||
RELATION CHOICE { CHOICE 127
|
||||
RELATION CHOICE } CHOICE 130
|
||||
RELATION CHOICE > CHOICE 131
|
||||
NEGATION RELATION 132
|
||||
NEGATION NOT RELATION 133
|
||||
CONJHEAD NEGATION AND 134
|
||||
CONJ- CONJHEAD CONJ- 135
|
||||
CONJ- NEGATION 136
|
||||
CONJ CONJ- 137
|
||||
DISJHEAD CONJ OR 140
|
||||
DISJ DISJHEAD DISJ 141
|
||||
DISJ CONJ 142
|
||||
CATENA CATENA & PRIMARY 143
|
||||
CATENA DISJ 144
|
||||
TRUEPART EXPR ELSE 145
|
||||
IFCLAUSE IF EXPR THEN 146
|
||||
EXPR- BLOCK 147
|
||||
EXPR- IFCLAUSE TRUEPART EXPR- 150
|
||||
EXPR- VAR ~ EXPR- 151
|
||||
EXPR- GOTO PRIMARY 152
|
||||
EXPR- OUT EXPR- 153
|
||||
EXPR- CATENA 154
|
||||
EXPR EXPR- 155
|
||||
STAT- LABDEF STAT- 156
|
||||
STAT- EXPR 157
|
||||
STAT STAT- 160
|
||||
LABDEF IDENT* : 161
|
||||
BLOKHEAD BEGIN 162
|
||||
BLOKHEAD BLOKHEAD VARDECL ; 163
|
||||
BLOKHEAD BLOKHEAD LABDECL ; 164
|
||||
BLOKBODY BLOKHEAD 165
|
||||
BLOKBODY BLOKBODY STAT ; 166
|
||||
BLOCK BLOKBODY STAT END 167
|
||||
PROGRAM $ BLOCK $ 170
|
||||
*
|
||||
|
||||
@@ -1,24 +1,24 @@
|
||||
|
||||
BEGIN NEW FOR; NEW MAKE; NEW T; NEW A;
|
||||
FOR ~ LQ FORMAL CV; FORMAL LB; FORMAL STEP; FORMAL UB; FORMAL S;
|
||||
BEGIN
|
||||
LABEL L; LABEL K;
|
||||
CV ~ LB;
|
||||
K: IF CV { UB THEN S ELSE GOTO L;
|
||||
CV ~ CV + STEP;
|
||||
GOTO K;
|
||||
L: 0
|
||||
END RQ;
|
||||
|
||||
MAKE ~ LQ FORMAL B; FORMAL X;
|
||||
BEGIN NEW T; NEW I; NEW F; NEW L;
|
||||
L ~ B; T ~ LIST L[1];
|
||||
F ~ IF LENGTH L ! 1 THEN MAKE(TAIL L, X) ELSE X;
|
||||
FOR (@I, 1, 1, L[1], LQ T[I] ~ F RQ);
|
||||
T
|
||||
END RQ;
|
||||
|
||||
A ~ ();
|
||||
FOR (@T, 1, 1, 4, LQ BEGIN A ~ A & (T); OUT MAKE(@A,T) END RQ)
|
||||
END $
|
||||
DUMP
|
||||
|
||||
BEGIN NEW FOR; NEW MAKE; NEW T; NEW A;
|
||||
FOR ~ LQ FORMAL CV; FORMAL LB; FORMAL STEP; FORMAL UB; FORMAL S;
|
||||
BEGIN
|
||||
LABEL L; LABEL K;
|
||||
CV ~ LB;
|
||||
K: IF CV { UB THEN S ELSE GOTO L;
|
||||
CV ~ CV + STEP;
|
||||
GOTO K;
|
||||
L: 0
|
||||
END RQ;
|
||||
|
||||
MAKE ~ LQ FORMAL B; FORMAL X;
|
||||
BEGIN NEW T; NEW I; NEW F; NEW L;
|
||||
L ~ B; T ~ LIST L[1];
|
||||
F ~ IF LENGTH L ! 1 THEN MAKE(TAIL L, X) ELSE X;
|
||||
FOR (@I, 1, 1, L[1], LQ T[I] ~ F RQ);
|
||||
T
|
||||
END RQ;
|
||||
|
||||
A ~ ();
|
||||
FOR (@T, 1, 1, 4, LQ BEGIN A ~ A & (T); OUT MAKE(@A,T) END RQ)
|
||||
END $
|
||||
DUMP
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -394,6 +394,10 @@ window.addEventListener("load", function() {
|
||||
header.rowAddress = block.slice(10);
|
||||
header.words = block; // save the raw header words
|
||||
|
||||
if (header.recordLength == 0 || header.blockLength == 0) {
|
||||
header.recordLength = header.blockLength = 30;
|
||||
}
|
||||
|
||||
return header;
|
||||
}
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
|
||||
window.addEventListener("load", function() {
|
||||
var configName = "CONFIG"; // database configuration store name
|
||||
var dbName = "TSS-CANDE"; // IDB database name
|
||||
var dbName = "B5500TESTDISK"; // IDB database name
|
||||
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)
|
||||
|
||||
@@ -1,247 +1,246 @@
|
||||
14M90+KI$|#0|00MM)290+JI"000000D4*342L05000V10JI18JI0)0)000S0QKI000W0HKI000,08KI000]=/1V082I08JI0417+E0M16+E[)|/EV+EBV+E}V+E?V*)*/}V000M16+E:)B/1VB),/4V4J1>50JI
|
||||
00000000049DJA9YSI001J F2900SI8Y4A4(0)0)08/I00000?/I|0000+/I7Y000 +A2( B01000160
|
||||
000000000U+A2(0)0Y+A2(000!+A2(001|0000000Q/IPBT0RSMSG000AUTOUNLDRNALL00001000170
|
||||
00000000CODEOLAYCOREST00DATAOLAYHALT0000REMOTE00CEMESS00BATCHZIPNOBATCH001000200
|
||||
00000000000000000000000000000000000000000000000000000000MOD3IOS00000000001000210
|
||||
00000000OPTN0000~000000000000000000000000000000000000000000000000000000001000220
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000230
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000240
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000250
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000260
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000270
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000300
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000310
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000320
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000330
|
||||
00000000Q00000000000000000000000000000000000000000000000000000000000000001000340
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000350
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000360
|
||||
0000000000000000000000000000000000000000Q ?0006SQ :0006]Q W0007@Q ?0008101000370
|
||||
00000000Q }0008:" 60008&" ?0008K= 80008;]T(0003(= .0009}= 2000#]= I0008W01000400
|
||||
00000000= &0009R= @000#5= 7000#+= 6000#G= G000#(= #000#U] B0000B400?AJ0401000410
|
||||
000000008I8&4A1Y9-JA#H+A001J0?11884A4J8#MJ8!000000001*|$|50R108#831J1!S)01000420
|
||||
00000000#/#V8U4A8#1!11884A8#8+4A8#1Y11884A8#831J1YS)#/#V8 4A8#2|11884A8#01000430
|
||||
00000000831J1YS)#/#V944A8#2|11884A8#831J&8S)#/#V904A8#&811884A8#831J1YS)01000440
|
||||
00000000#/#V984A8#2|11884A8#8?4A8#2|11884A008H4AD98#831J0QS)#/#V8Y4A8#8|01000450
|
||||
000000004A4J8K>B0)#<4J8K0Q11MJ2!%-104J9U+A#O8M8A+E11KI0&SIE-KI7HKIMQKI2Y01000460
|
||||
00000000SIA?KI2!SI+!KI4|SI5 KI1+SI30KI0QSI0)0)0)4J089"001J>F0)#<DI|):N0001000470
|
||||
00000000ME04AIDI|):N0D1I400?AJ>+KI0)0)0)2|00|0007|0000004J#S8#8|4A5MJI4J01000500
|
||||
000000003U#>008X4J#$8E4A008W0+2E008W04KE2:0&2I008X048E4A14/I7YJI4J#$8&4A01000510
|
||||
000000008<1?118D4A8MJI0+8T0+8X4J#$8E8A8E4A9DJI4J3U#>1?8T},0)+E4J#$31}]0)01000520
|
||||
00000000H1}]0)41318E4A1?8S+20)KE0HBI1?8T+20)8E4A1-KI0)0)00000800000000+001000530
|
||||
00000000000002001?8S+F0)2E0H2I1?8T+F0)8E4A:DJI0)00000700088T4J#$8E4A54KI01000540
|
||||
000000004J#$8Q4A8$04KE8$0 2E2:1:2YAI4J34#>4J#$9?JA4J34#>4J#$8-4A8$04319S01000550
|
||||
000000009>119?JA8;0+Y100ME8;6+Y1004E8;I0Y100ME2:4:8$0?1E4:08BI9>04119?JA01000560
|
||||
000000008;6+Y1]|419>119?JA4J9}048TMJ2*8W104J3-#>C|JI4J9Y+A#O9HJA9.302E0D01000570
|
||||
000000002I9.2|319HJA0HKI304J#$319HJA9.004E4&AI049|JA080UKI0)0)0)009K2)1/01000600
|
||||
00000000;V9|JA9O04119M8A9.2E0?AI008T008S9K2:8E4A4DJI000USI0)0)0)004J008L01000610
|
||||
00000000##9|JA9K0&JE5+AI4J8K9K1 8.319O119@MJ3*2L0H8!0 7}2L0"104J9O01000620
|
||||
0000000000ME0?2I3404SI3Q#>9O04119M8A042E0UAI8<00KE0DBI4J0H9"001JD60)#<6?01000630
|
||||
00000000/I0)0)0)7|0000000M974J#$8E4A4J20#>0|974J#$8E4A4J3Q#>0?979>9>Q)+/01000640
|
||||
00000000BV4J#$S)2/#V8I8E4A0+97008E4A0M969&JA4J3-#>0424KI8#8|4A4J8KEO0)#<01000650
|
||||
000000004J9U+A#O00ME7+AI8#8|4A0M9O11974J#$8E4A4J3-#>9O04119M8A9<2E0MAI9O01000660
|
||||
0000000010KI0)0)2|00|0000M9O1197008E4A9O04119M8A1+2E0?AI0097448E4A0&970|01000670
|
||||
00000000969<4104318E4A8.08118H4A4J8F8.08H13194+A#K8.1YME0U2I4J8F98+A#K8F01000700
|
||||
0000000010118D4A008H4AO-JI0+8SG>0)KE0H2I0+8TG>0)8E4A108T0!8E4A8<00KE0HBI01000710
|
||||
000000004J0H9"001JGB0)#<9D/I0)0)000000G&7|000000048X8<8E4A008W0+2E008W0401000720
|
||||
00000000KE2:0D2I008X048E4A4J008U+A#K1 8.319@4 8E4A1U8.319@008E4A0)0)0)0)01000730
|
||||
00000000000?KI8.04118H8A008W0431JE0?BI4J8<8.318 +A#K1DJI389&JA9<8<008W3101000740
|
||||
00000000KE10BI4J9<94+AMJ2B8W109<8<008W319<319&KA3!1E0DBI4J94+A001JI60)#<01000750
|
||||
000000000DSI0)0)1|007Y004J94+A001JI<0)9<Y)L/6V#<3!119&JA3!JI0)0)1|00000001000760
|
||||
000000004J8<041194+AMJ2B8W104J94+A001JI]0)#<4J8F98+A#K000+SI0)0)1J.00H0001000770
|
||||
000000008.8T008E4A8.04118H8A1U2E0?AI4J009"001J.;0)#<009DJA4J8B.S0)#<9F0801001000
|
||||
000000004E0DBI4J8B10MJ2*D5100DSI7|0000002|05|0004J#0+A10MJ2*}510000?AJ0001001010
|
||||
0000000008AJ.0/I0000BI00000000000000000~0000000%0000001.0000001Y0000002G01001020
|
||||
000000000000002V0000003D0000003T0000004A0000004 0000005>00000000FILE000001001030
|
||||
00000000FENCE000STOP0000ESU00000USE00000DATE0000TYPE0000OPTN0000DIRECTOR01001040
|
||||
00000000DRCTRYTPSYSTEMS0~000000000000000DRA00000DRB00000BOJ00000EOJ0000001001050
|
||||
00000000OPEN0000TERMNATEDATE0000TIME0000ONEBREAKAUTOPRNTCLEARWRSDISCONDC01001060
|
||||
00000000CMPLFILECLOSE000ERRORMSGRET00000LIBMSG00SCHEDMSGSECMSG00DSKTOG0001001070
|
||||
00000000RELTOG00PBDREL00CHECK000DISKMSG0DISKLOG0LIBERR00PBDONLY0SAVEPBT001001100
|
||||
00000000RSMSG000AUTOUNLDRNALL000CODEOLAYCOREST00DATAOLAYHALT0000REMOTE0001001110
|
||||
00000000CEMESS00BATCHZIPNOBATCH0000000000000000000000000000000000000000001001120
|
||||
0000000000000000MOD3IOS000000000OPTN0000~000000000000000000000000000000001001130
|
||||
0000000000000000DIRECTRY BUILT~ INCORRECT CARD~0 ERROR ~ DIRECTOR01001140
|
||||
00000000YTOP NOT SET~ LOADER LOADED ALREADY~ 4J041{4A1{0008M9290?JI0)01001150
|
||||
00000000J)#N00ME0 1I1 0UMJ142*35102&JI0)0S1?JI0)0W1&JI0)0,1-JI0)0]1!JI0)01001160
|
||||
00000000R|00PY204J8410MJ2*14+$!5!50R10D93*1L0H3:2*8I1|~D2N0K8P248>2?3*1L01001170
|
||||
000000000/1N}{5J00142*351*5I0; D2N1I4{"D}N1IA$1I1|"D6N2:241!0 0OBP0R0K}P01001200
|
||||
00000000A<@NA$1I1|A<1N2P0O5P0R>{2P1I1K4J2:142B150000PY20004J008L##044E0801001210
|
||||
000000002I#BKI0)Y64J8KMJ1*1H367>1/1N1K3J10082I#BKI4(1N2P00Y#Y61JY44AY7M901001220
|
||||
000000004J#.|44A|6Q)@N004E0&2I9F1:141I089DJAY#001E4+2I|6K)8N004E3U2I|6N)01001230
|
||||
000000008N|63)DN0HME4:Y#831J+A20ME4:182IY#831J008E4AY#0411831J008E4A48JI01001240
|
||||
000000001MKI|6N)8N|63)DN0QME4:Y#831J+A00ME4:082I0DKI4JY6#F5UJI4(00Y63)DN01001250
|
||||
00000000Y44AY61YME0?2I/61MKIY60QME0?2I/214KIY60HME0?2I ]0MKIY60+ME0?2I ,01001260
|
||||
0000000004KI ,|44A4J|60+9"MJ2B5I3"104J0+9"001J ;#<Y60QME0QBIDI|):N00ME0&01001270
|
||||
000000001IDI|):N0D1I1QKI00000SPO00000CRA00000DKA00000DRA00000XXX7|00000001001300
|
||||
0000000000SI4(G000Y4+A001:1JY44AY#1)?N|48A0+2IY#MIY84A4JY#Y4+A|:MJ2B8W1001001310
|
||||
00000000|60&BI4JY4+A F9;S)#/#V9;1U111YH1Y)L/6V#<2!KI0)0)1|<1|8004JY4+A ;01001320
|
||||
00000000#<8>831JY4+A831J+A8E4A4J8> K#<0)8>4JY4+A|:MJ3*8I8>5$ /1N1K0R3J1001001330
|
||||
000000000?2I4J B#F4(0)0)1|<108001|<1|8001|00000000008K831J+A008:001:ME0401001340
|
||||
00000000BI0 0DKI004J008L##|84A|#0 ME0?2I0 0&KI004J8KY4+A|##6|44A|62(1YH101001350
|
||||
000000000000004J008L##|84A0)004J|#8KMJ2L0}1?1*462L0X10|44A|62(2I004J0M8%01001360
|
||||
00000000|7MJ2*4I146>4$333$1~2N1U1P12130R0R10|62(9B0Q2I4J0M9"001J/##<000?01001370
|
||||
000000001I4J048%0M8,8)CN4J#;8Y+A1JMJ3*2L05104J8Y+A001J W#<008,008E4)4/-V01001400
|
||||
00000000004E2?1I8Y+A8!4A6!8Y+A1J8Y4A008%048E4A049+JA4J8Y+A001J F#<8!+A8Y01001410
|
||||
000000004A4(0)0)7|0000002|#0|0001|007Y004J8.9@9 +AMJ2*1I7"1!0/1I7"9!0 RE01001420
|
||||
00000000MOVED~108.9@0 8E4A4J9 +A001J ##<4(0)0)0)7|00000000#,KI|62(MJ2*1I01001430
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001001440
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001001450
|
||||
00000000=000000#04*)H/}VY6044A4("000000:2*14"$"50R004J0O4J70100S0|JI000001000011
|
||||
DRCTRYTP 2000 % START OF DIRECTORY AREA
|
||||
DIRECT 3604 % END OF DIRECTORY AREA
|
||||
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
|
||||
2004
|
||||
FILE SYSTEM/LOG, 1|5000, 999 % RESERVE SPACE FOR LOG
|
||||
3609
|
||||
FILE MCP/DISK, 1|1500, 999 % RESERVE SPACE FOR MCP CODE
|
||||
8610
|
||||
FILE DMPAREA/DISK, 1|100, 999 % RESERVE SPACE FOR MEM DUMP
|
||||
10110
|
||||
FILE RESERVE/DISK, 1|2000, 999 % RESERVE FOR NO-USER-DISK EVENT
|
||||
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)
|
||||
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
|
||||
USE CLEARWRS % CLEAR WRITE-READY STATUS ON DATACOM STATIONS
|
||||
TYPE CLOSE % PRINT FILE CLOSE MESSAGES
|
||||
TYPE RET % PRINT TAPE VOLUME-RETENTION MESSAGES
|
||||
TYPE LIBMSG % PRINT DUMP/LOAD/REMOVED, ETC. MESSAGES
|
||||
TYPE SCHEDMSG % PRINT MESSAGE WHEN TASKS ARE SCHEDULED
|
||||
TYPE SECMSG % PRINT FILE SECURITY MAINTENANCE MESSAGES
|
||||
USE DSKTOG % PREVENT USER ACCESS BELOW USER DISK AREA
|
||||
USE RELTOG % PREVENT USE OF ALGOL RELEASE ON DISK FILES
|
||||
TYPE PBDREL % PRINT BACKUP FILE RELEASE MESSAGES IF NOT AUTOPRNT
|
||||
TYPE DISKMSG % PRINT ALL DISK I/O RETRY MESSAGES
|
||||
TYPE DISKLOG % DISK LOGGING(TSMCP ONLY)
|
||||
TYPE LIBERR % PRINT LIB/MAINT ERROR MESSAGES (TSMCP ONLY)
|
||||
USE PBDONLY % ASSIGN ALL PRINTER/PUNCH FILES TO BACKUP (SPOOLED)
|
||||
USE SAVEPBT % REWIND AND SAVE PRINTER-BACKUP TAPES WHEN RELEASED
|
||||
USE RSMSG % PRINT MESSAGE FOR FILE-ACCESSED FLAG CHANGES
|
||||
USE RNALL % RUN ALL PSEUDO-READER DECKS (SHARED SYSTEMS ONLY)
|
||||
USE COREST % LOG MEMORY USAGE STATS (STATISTICS ONLY)
|
||||
USE HALT % HALT SYSTEM WHEN HALT-RECOMMENDED ERRORS OCCUR
|
||||
USE CEMESS % PRINT LIB/MAINT MESSAGES FOR CANDE TASKS (TSMCP ONLY)
|
||||
USE BATCHZIP % ZIP DECKS TO RUN UNDER BATCH CONTROL (TSMCP ONLY)
|
||||
USE MOD3IOS % ASSUME WE HAVE MODEL-III I/O CONTROL UNITS (WE DO)
|
||||
000000007|SI000000000000298>7HBI04/I0000000000000?/I00000+/I00000 +A2(0001000160
|
||||
000000000U+A2(000Y+A2(000!+A2(00000000000Q/I0000000000000 /I00000U/I000001000170
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000200
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000210
|
||||
00000000000000005&SI000000000000000000000000000000000000000000000000000001000220
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000230
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000240
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000250
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000260
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000270
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000300
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000310
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000320
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000330
|
||||
00000000Q0000000000000000000000000000000= 20003X] B0000B= 70003Z= ?0004001000340
|
||||
00000000400?AJ2H831J2H831J+A9#0)118E8A831J008E4A292H831J+A9>0)2E0DBI2H8301000350
|
||||
000000001J008E4A0M/I0)0)0000010000000700048?JA8++A6+1J831J"!S)#/#V884A2401000360
|
||||
00000000831J88+A*)HN8E4A24831J+A831J208E4A28831J0U8E4A4J>K0)24831J+A-E8.01000370
|
||||
0000000000ME4!2I2D831J048#4)8N8E4A24831J+A831J>O0)2D831J+A!)Q/2V8E4A4J>$01000400
|
||||
000000000)24831J+A-E8.0R24831J+A831J>;0)2D831J+A!)Q/2V8E4A4J>$0)24831J+A01000410
|
||||
00000000-E8.0R28831J28831J+A2D831J+A0D41118E4A24831J+A831J008E4A2+831J4J01000420
|
||||
0000000024831J+A>S0)1J8.8E4A2+831J+A00ME0DAI04831J088#8E4A2?831J048#8E4A01000430
|
||||
0000000028831J+A8#834A8204831J+AJE0|BI2H831J>W0)8E4A2&831J>,0)8E4A2|831J01000440
|
||||
00000000>]0)8E4A4J}20)8.0R000?1I20831J4M8E4A4J}60)2H831J+A2:8<20831J0Q8E01000450
|
||||
000000004A4J}#0)2H831J+A2:8<20831J008E4A4J}>0)2H831J+A2:8<2H831J2H831J+A01000460
|
||||
0000000020118E4A0U831J}B0)8E4A0Y831J}F0)8E4A0!831J}.0)8E4A820831834A822D01000470
|
||||
00000000831J+A!)D/2V2?831J+A!)B/2V834A040?AJ0008AJ0U831JKI0414BI0DJI0)0)01000500
|
||||
000000001|0|0000000000| 1|010000000000 1|00|800INVALID ADDRESS FOR MCP~01000510
|
||||
000000007|00000O1|00PYK(1|00PY4%1|00J+0}4J2.10MJ2*14*$"5~50R10D9008FKI|601000520
|
||||
000000002(00000000Y7M92+831J4J8B8E4A2+831J+AJ)CN|44A|60D4:00ME1|1I|62(0001000530
|
||||
000000004J8220831J+A11Y6*)HNMJ2B148W10Y6831J+A5)8N0&2IY60 Z)3/5VY44A2+8301000540
|
||||
000000001J4JY68.8E4A2+831J+A00ME101I4(000000000000000000000000000000000001000550
|
||||
00000000=000000#04*)H/}VY6044A4("000000:2*14"$"50R004J0O4J70100S0|JI000001000011
|
||||
STOP
|
||||
%% THIS EXTRA CARD MUST BE HERE %%
|
||||
14M90+KI$|#0|00MM)290+JI"000000D4*342L05000V10JI18JI0)0)000S0QKI000W0HKI000,08KI000]=/1V082I08JI0417+E0M16+E[)|/EV+EBV+E}V+E?V*)*/}V000M16+E:)B/1VB),/4V4J1>50JI
|
||||
000000008YSI8D4A008T008E2900SI+A001J ]0008/I8F080?/I0?8]0+/I8F040 +A2(8]01000160
|
||||
000000000U+A2(8T0Y+A2(4A0!+A2(001J B009>0Q/I831J0Y8,8E4A0 /I0)0)0U/I080001000170
|
||||
000000001|0|0000000040001|00|8002B8W104(000009A 00000000000000000000000001000200
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000210
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000220
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000230
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000240
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000250
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000260
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000270
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000300
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000310
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000320
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000330
|
||||
00000000Q00000000000000000000000000000000000000000000000000000000000000001000340
|
||||
000000000000000000000000000000000000000000000000Q <0003WQ +0004DQ 50004M01000350
|
||||
00000000= 200082= 60005-= &0005+= ?0004R= C0004V= 800058= 60005S= F0005Y01000360
|
||||
00000000= :0006>= 70006[= N0006K= H00077= L0007~] B0000B90+A0D1J831J"!S)01000370
|
||||
00000000#/#V8-4A8-+A001J8|4A8K#O0)118M4A8O#O0)11831J]|S)#/#V8 4A400?AJ4J01000400
|
||||
000000009;041?KI000000+64J00@20)8$Z)3/5V@60)9>0R8$08118Q8A1!2E0DAI041+SI01000410
|
||||
00000000000K000000000Q008-+A041J8$Z)3/5V8?4A4J8>?O0)?$0)9>K)CN00ME282I0401000420
|
||||
000000008{+A?;0)|:8I001:ME8:088{+A088]8:001:ME4:0?8{+A?S0)8:001:ME4:1:1+01000430
|
||||
000000002I4J8>?W0)?,0)9>0R8$08118Q8A1!2E18AI005|1I4J049F4J8>?O0)009>0R0401000440
|
||||
000000003 KI0)0)0}"5|00000006Q000LABEL 0FILE000000K000000000Q008$8;008]01000450
|
||||
000000008:001:ME8$04118;048]8:001:ME4:1:0DBI8$8;0 ME0?2I4J08968$08118Q8A01000460
|
||||
00000000|02E0MAI4J8$04119F4J8>>20)009>0R4J9S0M8;04311YH104118+4A040DSI0)01000470
|
||||
000000000}"5|0004J8>}>0)009>0R4J9B8$04118Q8A8B2E0+AI4J8>}B0)009>0R8#1M2I01000500
|
||||
000000004J0?8"0H8%MJ}>D! TO DEFAULT ADDRESS=2*8W1!0~9}8#104J0?964J8U+A1001000510
|
||||
00000000MJ2*D510000?AJ0008AJ>8/I0}"5|000000K00000000BI004J041{4A1{0008M901000520
|
||||
00000000290?JI0)J)#N00ME0 1I1 0UMJ142*35102&JI0)0S1?JI0)0W1&JI0)0,1-JI0)01000530
|
||||
000000000]1!JI0)R|00PY204J8410MJ2*14+$!5!50R10D900000000000000000000000001000540
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000550
|
||||
0000000000000000000000000000000000000000DISK FAILURE~000TAPE FAILURE~00001000560
|
||||
00000000NO MCP FILE~0000MCP FILE LOADED~NOT IN DIRCTORY~LOADER ON DISK~ 01000570
|
||||
00000000CRA FAILURE~ 00000000000000000MCP 0DISK 0SYSTEM 0000000001000600
|
||||
0000000000000000000000Y>Y#2:Y84AY@M94J92|84A|#Y61:4:|?4A|>K)CN004E0+BI|>01000610
|
||||
00000000N)8N1:08BI4JY#|@9#1:0&AI|#|44A|62(DISK~ 0000/#|44A4J8K|6009>0R8O01000620
|
||||
00000000831J8K831J+A8E4A4J8O|604=)|/1V009>0R0)8K4J8OMJ3*8I8>3$S$ /1N1K0R01000630
|
||||
000000000R3J100U2I|#0411|84A|#0D2E3H1I4J00964J?08KMJ2B8%104(0)0)1;413 0001000640
|
||||
0000000000040+SI4J8> F .9>L)#N08AI|60411|48AY62E0+AI4(0)0001|0000000600001000650
|
||||
000000000000Y6Q)@N004E082I042(Y6M)9N4-2IY63)DN0-BI041&KI4J8> K O9>0RY74J01000660
|
||||
0000000000Y# <9>8E8AM)9N004E3Y2I|#0411|88A0D2E0&AI2+KI0)0003|0000000600001000670
|
||||
000000000418KI0)Y74J00Y# O9>8E8AM)9N004E1|2I|#0411|88A0D2E0DAI4JY63)DN0Q01000700
|
||||
00000000ME0?2I0H0?KIY#9)?N96|62(000020004J08Y6418%001J B009>0RY60?ME0D1I01000710
|
||||
000000004(0)0)0)7|000000004J0M8T|7MJ2*4I146>4$333$1~2N1U1P12130R0R10|62(01000720
|
||||
00000000008<0?2I4J0D964J048T0M8S8)CN4J9.8 +A1JMJ3*2L0510DI|):N0DBI4J8 +A01000730
|
||||
00000000001J # >9>0R0UKI2|#0|00000003000008T0 8E4A008S008E4)4/-V004E3M1I01000740
|
||||
000000008K|44A8 +A6!1J8|4A048&4A8K831J048E4A4J9B|68|4A4(0)004J8$0+8"MJ2*01000750
|
||||
000000001>"$ D2N1I2P0O1P0R/D3N1I?{FP=D2N6{BP7$ D3N1!0 @P/D3N1!0 6P=D3N1!01000760
|
||||
000000000 1P1"0R4:108Q4A4(8T0 8E4J9KY60|2I088"0+8]8E4A0YKI008"0+8]8E4A4J01000770
|
||||
000000009K048"0+8]8E4A4(00008T008E4A4J8 +A001J S009>0R088S|4JA0)0)0)|60+01001000
|
||||
00000000110?KI8B10118+4A044Y2I4J8C8 +AMJ2*8W104J8 +A001J >009>0R0038KI0)01001010
|
||||
000000001|00|8001|00K000(!8F318S4 8:001:ME0?2I4J0+96(!8F318S008]8:001:ME01001020
|
||||
000000000 2I<08F318S048]8:001:4E0-2I8F08118D8A1 2E0-AI5HJI0?8".!8F0!413101001030
|
||||
000000008S8E8A00ME888A0D2I0?8" B8E4A4J0?8]0Y8%MJ2B8W104(000009A DI|):N4+01001040
|
||||
000000002I8 +A001J8Q4A4J8 +A001J ]/29>0R008T+A008:001:ME04BI4J9<4J9K0+8]01001050
|
||||
00000000 S8:001:ME0?2I4J009O0+8] $8:001:ME0?2I4J049ODI|):N00ME0+8] <8:0001001060
|
||||
000000001:ME2:4+1I4J9$4(2|#0|000000030000FILE 0TAPE 0STOP 0-8{0?8]01001070
|
||||
000000008E4A0D8{+E+AMI8E4A4J8B1 8F3108H1118-+AMJ2B8W104J8-+A001J/<009>0R01001100
|
||||
00000000008T208E4A048T008E4A4J8 +A001J/B/B9>0R048S4)8N8D4A0-8F0D41118D4A01001110
|
||||
00000000008T008E4A4J8 +A001J ]009>0R8F08118T0?8]8E4A8F04118T048]8E4A8F8T01001120
|
||||
00000000008]8E4A4J8 +A001J B009>0R8K831J0Y8,8E4A4(0)0)0)1|<108001|0|000001001130
|
||||
00000000000040001|00|800009WKI|62(4A0D8{0000000000000000000000000000000001001140
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001001150
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001001160
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001001170
|
||||
00000000=000000#04*)H/}VY6044A4("000000:2*14"$"50R004J0O4J70100S0|JI000001000011
|
||||
TAPE = SYSTEM
|
||||
FILE = MCP/DISK
|
||||
STOP
|
||||
?ADD FROM SYSTEM INT/DISK, PRNPBT/DISK, LDCNTRL/DISK -
|
||||
,ALGOL/DISK -
|
||||
,XALGOL/DISK -
|
||||
,FORTRAN/DISK -
|
||||
,COBOL/DISK -
|
||||
,LOGOUT/DISK
|
||||
14M90+KI$|#0|00MM)290+JI"000000D4*342L05000V10JI18JI0)0)000S0QKI000W0HKI000,08KI000]=/1V082I08JI0417+E0M16+E[)|/EV+EBV+E}V+E?V*)*/}V000M16+E:)B/1VB),/4V4J1>50JI
|
||||
00000000049DJA9YSI001J F2900SI8Y4A4(0)0)08/I00000?/I|0000+/I7Y000 +A2( B01000160
|
||||
000000000U+A2(0)0Y+A2(000!+A2(001|0000000Q/IPBT0RSMSG000AUTOUNLDRNALL00001000170
|
||||
00000000CODEOLAYCOREST00DATAOLAYHALT0000REMOTE00CEMESS00BATCHZIPNOBATCH001000200
|
||||
00000000000000000000000000000000000000000000000000000000MOD3IOS00000000001000210
|
||||
00000000OPTN0000~000000000000000000000000000000000000000000000000000000001000220
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000230
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000240
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000250
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000260
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000270
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000300
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000310
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000320
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000330
|
||||
00000000Q00000000000000000000000000000000000000000000000000000000000000001000340
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000350
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000360
|
||||
0000000000000000000000000000000000000000Q ?0006SQ :0006]Q W0007@Q ?0008101000370
|
||||
00000000Q }0008:" 60008&" ?0008K= 80008;]T(0003(= .0009}= 2000#]= I0008W01000400
|
||||
00000000= &0009R= @000#5= 7000#+= 6000#G= G000#(= #000#U] B0000B400?AJ0401000410
|
||||
000000008I8&4A1Y9-JA#H+A001J0?11884A4J8#MJ8!000000001*|$|50R108#831J1!S)01000420
|
||||
00000000#/#V8U4A8#1!11884A8#8+4A8#1Y11884A8#831J1YS)#/#V8 4A8#2|11884A8#01000430
|
||||
00000000831J1YS)#/#V944A8#2|11884A8#831J&8S)#/#V904A8#&811884A8#831J1YS)01000440
|
||||
00000000#/#V984A8#2|11884A8#8?4A8#2|11884A008H4AD98#831J0QS)#/#V8Y4A8#8|01000450
|
||||
000000004A4J8K>B0)#<4J8K0Q11MJ2!%-104J9U+A#O8M8A+E11KI0&SIE-KI7HKIMQKI2Y01000460
|
||||
00000000SIA?KI2!SI+!KI4|SI5 KI1+SI30KI0QSI0)0)0)4J089"001J>F0)#<DI|):N0001000470
|
||||
00000000ME04AIDI|):N0D1I400?AJ>+KI0)0)0)2|00|0007|0000004J#S8#8|4A5MJI4J01000500
|
||||
000000003U#>008X4J#$8E4A008W0+2E008W04KE2:0&2I008X048E4A14/I7YJI4J#$8&4A01000510
|
||||
000000008<1?118D4A8MJI0+8T0+8X4J#$8E8A8E4A9DJI4J3U#>1?8T},0)+E4J#$31}]0)01000520
|
||||
00000000H1}]0)41318E4A1?8S+20)KE0HBI1?8T+20)8E4A1-KI0)0)00000800000000+001000530
|
||||
00000000000002001?8S+F0)2E0H2I1?8T+F0)8E4A:DJI0)00000700088T4J#$8E4A54KI01000540
|
||||
000000004J#$8Q4A8$04KE8$0 2E2:1:2YAI4J34#>4J#$9?JA4J34#>4J#$8-4A8$04319S01000550
|
||||
000000009>119?JA8;0+Y100ME8;6+Y1004E8;I0Y100ME2:4:8$0?1E4:08BI9>04119?JA01000560
|
||||
000000008;6+Y1]|419>119?JA4J9}048TMJ2*8W104J3-#>C|JI4J9Y+A#O9HJA9.302E0D01000570
|
||||
000000002I9.2|319HJA0HKI304J#$319HJA9.004E4&AI049|JA080UKI0)0)0)009K2)1/01000600
|
||||
00000000;V9|JA9O04119M8A9.2E0?AI008T008S9K2:8E4A4DJI000USI0)0)0)004J008L01000610
|
||||
00000000##9|JA9K0&JE5+AI4J8K9K1 8.319O119@MJ3*2L0H8!0 7}2L0"104J9O01000620
|
||||
0000000000ME0?2I3404SI3Q#>9O04119M8A042E0UAI8<00KE0DBI4J0H9"001JD60)#<6?01000630
|
||||
00000000/I0)0)0)7|0000000M974J#$8E4A4J20#>0|974J#$8E4A4J3Q#>0?979>9>Q)+/01000640
|
||||
00000000BV4J#$S)2/#V8I8E4A0+97008E4A0M969&JA4J3-#>0424KI8#8|4A4J8KEO0)#<01000650
|
||||
000000004J9U+A#O00ME7+AI8#8|4A0M9O11974J#$8E4A4J3-#>9O04119M8A9<2E0MAI9O01000660
|
||||
0000000010KI0)0)2|00|0000M9O1197008E4A9O04119M8A1+2E0?AI0097448E4A0&970|01000670
|
||||
00000000969<4104318E4A8.08118H4A4J8F8.08H13194+A#K8.1YME0U2I4J8F98+A#K8F01000700
|
||||
0000000010118D4A008H4AO-JI0+8SG>0)KE0H2I0+8TG>0)8E4A108T0!8E4A8<00KE0HBI01000710
|
||||
000000004J0H9"001JGB0)#<9D/I0)0)000000G&7|000000048X8<8E4A008W0+2E008W0401000720
|
||||
00000000KE2:0D2I008X048E4A4J008U+A#K1 8.319@4 8E4A1U8.319@008E4A0)0)0)0)01000730
|
||||
00000000000?KI8.04118H8A008W0431JE0?BI4J8<8.318 +A#K1DJI389&JA9<8<008W3101000740
|
||||
00000000KE10BI4J9<94+AMJ2B8W109<8<008W319<319&KA3!1E0DBI4J94+A001JI60)#<01000750
|
||||
000000000DSI0)0)1|007Y004J94+A001JI<0)9<Y)L/6V#<3!119&JA3!JI0)0)1|00000001000760
|
||||
000000004J8<041194+AMJ2B8W104J94+A001JI]0)#<4J8F98+A#K000+SI0)0)1J.00H0001000770
|
||||
000000008.8T008E4A8.04118H8A1U2E0?AI4J009"001J.;0)#<009DJA4J8B.S0)#<9F0801001000
|
||||
000000004E0DBI4J8B10MJ2*D5100DSI7|0000002|05|0004J#0+A10MJ2*}510000?AJ0001001010
|
||||
0000000008AJ.0/I0000BI00000000000000000~0000000%0000001.0000001Y0000002G01001020
|
||||
000000000000002V0000003D0000003T0000004A0000004 0000005>00000000FILE000001001030
|
||||
00000000FENCE000STOP0000ESU00000USE00000DATE0000TYPE0000OPTN0000DIRECTOR01001040
|
||||
00000000DRCTRYTPSYSTEMS0~000000000000000DRA00000DRB00000BOJ00000EOJ0000001001050
|
||||
00000000OPEN0000TERMNATEDATE0000TIME0000ONEBREAKAUTOPRNTCLEARWRSDISCONDC01001060
|
||||
00000000CMPLFILECLOSE000ERRORMSGRET00000LIBMSG00SCHEDMSGSECMSG00DSKTOG0001001070
|
||||
00000000RELTOG00PBDREL00CHECK000DISKMSG0DISKLOG0LIBERR00PBDONLY0SAVEPBT001001100
|
||||
00000000RSMSG000AUTOUNLDRNALL000CODEOLAYCOREST00DATAOLAYHALT0000REMOTE0001001110
|
||||
00000000CEMESS00BATCHZIPNOBATCH0000000000000000000000000000000000000000001001120
|
||||
0000000000000000MOD3IOS000000000OPTN0000~000000000000000000000000000000001001130
|
||||
0000000000000000DIRECTRY BUILT~ INCORRECT CARD~0 ERROR ~ DIRECTOR01001140
|
||||
00000000YTOP NOT SET~ LOADER LOADED ALREADY~ 4J041{4A1{0008M9290?JI0)01001150
|
||||
00000000J)#N00ME0 1I1 0UMJ142*35102&JI0)0S1?JI0)0W1&JI0)0,1-JI0)0]1!JI0)01001160
|
||||
00000000R|00PY204J8410MJ2*14+$!5!50R10D93*1L0H3:2*8I1|~D2N0K8P248>2?3*1L01001170
|
||||
000000000/1N}{5J00142*351*5I0; D2N1I4{"D}N1IA$1I1|"D6N2:241!0 0OBP0R0K}P01001200
|
||||
00000000A<@NA$1I1|A<1N2P0O5P0R>{2P1I1K4J2:142B150000PY20004J008L##044E0801001210
|
||||
000000002I#BKI0)Y64J8KMJ1*1H367>1/1N1K3J10082I#BKI4(1N2P00Y#Y61JY44AY7M901001220
|
||||
000000004J#.|44A|6Q)@N004E0&2I9F1:141I089DJAY#001E4+2I|6K)8N004E3U2I|6N)01001230
|
||||
000000008N|63)DN0HME4:Y#831J+A20ME4:182IY#831J008E4AY#0411831J008E4A48JI01001240
|
||||
000000001MKI|6N)8N|63)DN0QME4:Y#831J+A00ME4:082I0DKI4JY6#F5UJI4(00Y63)DN01001250
|
||||
00000000Y44AY61YME0?2I/61MKIY60QME0?2I/214KIY60HME0?2I ]0MKIY60+ME0?2I ,01001260
|
||||
0000000004KI ,|44A4J|60+9"MJ2B5I3"104J0+9"001J ;#<Y60QME0QBIDI|):N00ME0&01001270
|
||||
000000001IDI|):N0D1I1QKI00000SPO00000CRA00000DKA00000DRA00000XXX7|00000001001300
|
||||
0000000000SI4(G000Y4+A001:1JY44AY#1)?N|48A0+2IY#MIY84A4JY#Y4+A|:MJ2B8W1001001310
|
||||
00000000|60&BI4JY4+A F9;S)#/#V9;1U111YH1Y)L/6V#<2!KI0)0)1|<1|8004JY4+A ;01001320
|
||||
00000000#<8>831JY4+A831J+A8E4A4J8> K#<0)8>4JY4+A|:MJ3*8I8>5$ /1N1K0R3J1001001330
|
||||
000000000?2I4J B#F4(0)0)1|<108001|<1|8001|00000000008K831J+A008:001:ME0401001340
|
||||
00000000BI0 0DKI004J008L##|84A|#0 ME0?2I0 0&KI004J8KY4+A|##6|44A|62(1YH101001350
|
||||
000000000000004J008L##|84A0)004J|#8KMJ2L0}1?1*462L0X10|44A|62(2I004J0M8%01001360
|
||||
00000000|7MJ2*4I146>4$333$1~2N1U1P12130R0R10|62(9B0Q2I4J0M9"001J/##<000?01001370
|
||||
000000001I4J048%0M8,8)CN4J#;8Y+A1JMJ3*2L05104J8Y+A001J W#<008,008E4)4/-V01001400
|
||||
00000000004E2?1I8Y+A8!4A6!8Y+A1J8Y4A008%048E4A049+JA4J8Y+A001J F#<8!+A8Y01001410
|
||||
000000004A4(0)0)7|0000002|#0|0001|007Y004J8.9@9 +AMJ2*1I7"1!0/1I7"9!0 RE01001420
|
||||
00000000MOVED~108.9@0 8E4A4J9 +A001J ##<4(0)0)0)7|00000000#,KI|62(MJ2*1I01001430
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001001440
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001001450
|
||||
00000000=000000#04*)H/}VY6044A4("000000:2*14"$"50R004J0O4J70100S0|JI000001000011
|
||||
DRCTRYTP 2000 % START OF DIRECTORY AREA
|
||||
DIRECT 3604 % END OF DIRECTORY AREA
|
||||
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
|
||||
2004
|
||||
FILE SYSTEM/LOG, 1|5000, 999 % RESERVE SPACE FOR LOG
|
||||
3609
|
||||
FILE MCP/DISK, 1|1500, 999 % RESERVE SPACE FOR MCP CODE
|
||||
8610
|
||||
FILE DMPAREA/DISK, 1|100, 999 % RESERVE SPACE FOR MEM DUMP
|
||||
10110
|
||||
FILE RESERVE/DISK, 1|2000, 999 % RESERVE FOR NO-USER-DISK EVENT
|
||||
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)
|
||||
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
|
||||
USE CLEARWRS % CLEAR WRITE-READY STATUS ON DATACOM STATIONS
|
||||
TYPE CLOSE % PRINT FILE CLOSE MESSAGES
|
||||
TYPE RET % PRINT TAPE VOLUME-RETENTION MESSAGES
|
||||
TYPE LIBMSG % PRINT DUMP/LOAD/REMOVED, ETC. MESSAGES
|
||||
TYPE SCHEDMSG % PRINT MESSAGE WHEN TASKS ARE SCHEDULED
|
||||
TYPE SECMSG % PRINT FILE SECURITY MAINTENANCE MESSAGES
|
||||
USE DSKTOG % PREVENT USER ACCESS BELOW USER DISK AREA
|
||||
USE RELTOG % PREVENT USE OF ALGOL RELEASE ON DISK FILES
|
||||
TYPE PBDREL % PRINT BACKUP FILE RELEASE MESSAGES IF NOT AUTOPRNT
|
||||
TYPE DISKMSG % PRINT ALL DISK I/O RETRY MESSAGES
|
||||
TYPE DISKLOG % DISK LOGGING(TSMCP ONLY)
|
||||
TYPE LIBERR % PRINT LIB/MAINT ERROR MESSAGES (TSMCP ONLY)
|
||||
USE PBDONLY % ASSIGN ALL PRINTER/PUNCH FILES TO BACKUP (SPOOLED)
|
||||
USE SAVEPBT % REWIND AND SAVE PRINTER-BACKUP TAPES WHEN RELEASED
|
||||
USE RSMSG % PRINT MESSAGE FOR FILE-ACCESSED FLAG CHANGES
|
||||
USE RNALL % RUN ALL PSEUDO-READER DECKS (SHARED SYSTEMS ONLY)
|
||||
USE COREST % LOG MEMORY USAGE STATS (STATISTICS ONLY)
|
||||
USE HALT % HALT SYSTEM WHEN HALT-RECOMMENDED ERRORS OCCUR
|
||||
USE CEMESS % PRINT LIB/MAINT MESSAGES FOR CANDE TASKS (TSMCP ONLY)
|
||||
USE BATCHZIP % ZIP DECKS TO RUN UNDER BATCH CONTROL (TSMCP ONLY)
|
||||
USE MOD3IOS % ASSUME WE HAVE MODEL-III I/O CONTROL UNITS (WE DO)
|
||||
000000007|SI000000000000298>7HBI04/I0000000000000?/I00000+/I00000 +A2(0001000160
|
||||
000000000U+A2(000Y+A2(000!+A2(00000000000Q/I0000000000000 /I00000U/I000001000170
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000200
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000210
|
||||
00000000000000005&SI000000000000000000000000000000000000000000000000000001000220
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000230
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000240
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000250
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000260
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000270
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000300
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000310
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000320
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000330
|
||||
00000000Q0000000000000000000000000000000= 20003X] B0000B= 70003Z= ?0004001000340
|
||||
00000000400?AJ2H831J2H831J+A9#0)118E8A831J008E4A292H831J+A9>0)2E0DBI2H8301000350
|
||||
000000001J008E4A0M/I0)0)0000010000000700048?JA8++A6+1J831J"!S)#/#V884A2401000360
|
||||
00000000831J88+A*)HN8E4A24831J+A831J208E4A28831J0U8E4A4J>K0)24831J+A-E8.01000370
|
||||
0000000000ME4!2I2D831J048#4)8N8E4A24831J+A831J>O0)2D831J+A!)Q/2V8E4A4J>$01000400
|
||||
000000000)24831J+A-E8.0R24831J+A831J>;0)2D831J+A!)Q/2V8E4A4J>$0)24831J+A01000410
|
||||
00000000-E8.0R28831J28831J+A2D831J+A0D41118E4A24831J+A831J008E4A2+831J4J01000420
|
||||
0000000024831J+A>S0)1J8.8E4A2+831J+A00ME0DAI04831J088#8E4A2?831J048#8E4A01000430
|
||||
0000000028831J+A8#834A8204831J+AJE0|BI2H831J>W0)8E4A2&831J>,0)8E4A2|831J01000440
|
||||
00000000>]0)8E4A4J}20)8.0R000?1I20831J4M8E4A4J}60)2H831J+A2:8<20831J0Q8E01000450
|
||||
000000004A4J}#0)2H831J+A2:8<20831J008E4A4J}>0)2H831J+A2:8<2H831J2H831J+A01000460
|
||||
0000000020118E4A0U831J}B0)8E4A0Y831J}F0)8E4A0!831J}.0)8E4A820831834A822D01000470
|
||||
00000000831J+A!)D/2V2?831J+A!)B/2V834A040?AJ0008AJ0U831JKI0414BI0DJI0)0)01000500
|
||||
000000001|0|0000000000| 1|010000000000 1|00|800INVALID ADDRESS FOR MCP~01000510
|
||||
000000007|00000O1|00PYK(1|00PY4%1|00J+0}4J2.10MJ2*14*$"5~50R10D9008FKI|601000520
|
||||
000000002(00000000Y7M92+831J4J8B8E4A2+831J+AJ)CN|44A|60D4:00ME1|1I|62(0001000530
|
||||
000000004J8220831J+A11Y6*)HNMJ2B148W10Y6831J+A5)8N0&2IY60 Z)3/5VY44A2+8301000540
|
||||
000000001J4JY68.8E4A2+831J+A00ME101I4(000000000000000000000000000000000001000550
|
||||
00000000=000000#04*)H/}VY6044A4("000000:2*14"$"50R004J0O4J70100S0|JI000001000011
|
||||
STOP
|
||||
14M90+KI$|#0|00MM)290+JI"000000D4*342L05000V10JI18JI0)0)000S0QKI000W0HKI000,08KI000]=/1V082I08JI0417+E0M16+E[)|/EV+EBV+E}V+E?V*)*/}V000M16+E:)B/1VB),/4V4J1>50JI
|
||||
000000008YSI8D4A008T008E2900SI+A001J ]0008/I8F080?/I0?8]0+/I8F040 +A2(8]01000160
|
||||
000000000U+A2(8T0Y+A2(4A0!+A2(001J B009>0Q/I831J0Y8,8E4A0 /I0)0)0U/I080001000170
|
||||
000000001|0|0000000040001|00|8002B8W104(000009A 00000000000000000000000001000200
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000210
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000220
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000230
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000240
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000250
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000260
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000270
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000300
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000310
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000320
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000330
|
||||
00000000Q00000000000000000000000000000000000000000000000000000000000000001000340
|
||||
000000000000000000000000000000000000000000000000Q <0003WQ +0004DQ 50004M01000350
|
||||
00000000= 200082= 60005-= &0005+= ?0004R= C0004V= 800058= 60005S= F0005Y01000360
|
||||
00000000= :0006>= 70006[= N0006K= H00077= L0007~] B0000B90+A0D1J831J"!S)01000370
|
||||
00000000#/#V8-4A8-+A001J8|4A8K#O0)118M4A8O#O0)11831J]|S)#/#V8 4A400?AJ4J01000400
|
||||
000000009;041?KI000000+64J00@20)8$Z)3/5V@60)9>0R8$08118Q8A1!2E0DAI041+SI01000410
|
||||
00000000000K000000000Q008-+A041J8$Z)3/5V8?4A4J8>?O0)?$0)9>K)CN00ME282I0401000420
|
||||
000000008{+A?;0)|:8I001:ME8:088{+A088]8:001:ME4:0?8{+A?S0)8:001:ME4:1:1+01000430
|
||||
000000002I4J8>?W0)?,0)9>0R8$08118Q8A1!2E18AI005|1I4J049F4J8>?O0)009>0R0401000440
|
||||
000000003 KI0)0)0}"5|00000006Q000LABEL 0FILE000000K000000000Q008$8;008]01000450
|
||||
000000008:001:ME8$04118;048]8:001:ME4:1:0DBI8$8;0 ME0?2I4J08968$08118Q8A01000460
|
||||
00000000|02E0MAI4J8$04119F4J8>>20)009>0R4J9S0M8;04311YH104118+4A040DSI0)01000470
|
||||
000000000}"5|0004J8>}>0)009>0R4J9B8$04118Q8A8B2E0+AI4J8>}B0)009>0R8#1M2I01000500
|
||||
000000004J0?8"0H8%MJ}>D! TO DEFAULT ADDRESS=2*8W1!0~9}8#104J0?964J8U+A1001000510
|
||||
00000000MJ2*D510000?AJ0008AJ>8/I0}"5|000000K00000000BI004J041{4A1{0008M901000520
|
||||
00000000290?JI0)J)#N00ME0 1I1 0UMJ142*35102&JI0)0S1?JI0)0W1&JI0)0,1-JI0)01000530
|
||||
000000000]1!JI0)R|00PY204J8410MJ2*14+$!5!50R10D900000000000000000000000001000540
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000550
|
||||
0000000000000000000000000000000000000000DISK FAILURE~000TAPE FAILURE~00001000560
|
||||
00000000NO MCP FILE~0000MCP FILE LOADED~NOT IN DIRCTORY~LOADER ON DISK~ 01000570
|
||||
00000000CRA FAILURE~ 00000000000000000MCP 0DISK 0SYSTEM 0000000001000600
|
||||
0000000000000000000000Y>Y#2:Y84AY@M94J92|84A|#Y61:4:|?4A|>K)CN004E0+BI|>01000610
|
||||
00000000N)8N1:08BI4JY#|@9#1:0&AI|#|44A|62(DISK~ 0000/#|44A4J8K|6009>0R8O01000620
|
||||
00000000831J8K831J+A8E4A4J8O|604=)|/1V009>0R0)8K4J8OMJ3*8I8>3$S$ /1N1K0R01000630
|
||||
000000000R3J100U2I|#0411|84A|#0D2E3H1I4J00964J?08KMJ2B8%104(0)0)1;413 0001000640
|
||||
0000000000040+SI4J8> F .9>L)#N08AI|60411|48AY62E0+AI4(0)0001|0000000600001000650
|
||||
000000000000Y6Q)@N004E082I042(Y6M)9N4-2IY63)DN0-BI041&KI4J8> K O9>0RY74J01000660
|
||||
0000000000Y# <9>8E8AM)9N004E3Y2I|#0411|88A0D2E0&AI2+KI0)0003|0000000600001000670
|
||||
000000000418KI0)Y74J00Y# O9>8E8AM)9N004E1|2I|#0411|88A0D2E0DAI4JY63)DN0Q01000700
|
||||
00000000ME0?2I0H0?KIY#9)?N96|62(000020004J08Y6418%001J B009>0RY60?ME0D1I01000710
|
||||
000000004(0)0)0)7|000000004J0M8T|7MJ2*4I146>4$333$1~2N1U1P12130R0R10|62(01000720
|
||||
00000000008<0?2I4J0D964J048T0M8S8)CN4J9.8 +A1JMJ3*2L0510DI|):N0DBI4J8 +A01000730
|
||||
00000000001J # >9>0R0UKI2|#0|00000003000008T0 8E4A008S008E4)4/-V004E3M1I01000740
|
||||
000000008K|44A8 +A6!1J8|4A048&4A8K831J048E4A4J9B|68|4A4(0)004J8$0+8"MJ2*01000750
|
||||
000000001>"$ D2N1I2P0O1P0R/D3N1I?{FP=D2N6{BP7$ D3N1!0 @P/D3N1!0 6P=D3N1!01000760
|
||||
000000000 1P1"0R4:108Q4A4(8T0 8E4J9KY60|2I088"0+8]8E4A0YKI008"0+8]8E4A4J01000770
|
||||
000000009K048"0+8]8E4A4(00008T008E4A4J8 +A001J S009>0R088S|4JA0)0)0)|60+01001000
|
||||
00000000110?KI8B10118+4A044Y2I4J8C8 +AMJ2*8W104J8 +A001J >009>0R0038KI0)01001010
|
||||
000000001|00|8001|00K000(!8F318S4 8:001:ME0?2I4J0+96(!8F318S008]8:001:ME01001020
|
||||
000000000 2I<08F318S048]8:001:4E0-2I8F08118D8A1 2E0-AI5HJI0?8".!8F0!413101001030
|
||||
000000008S8E8A00ME888A0D2I0?8" B8E4A4J0?8]0Y8%MJ2B8W104(000009A DI|):N4+01001040
|
||||
000000002I8 +A001J8Q4A4J8 +A001J ]/29>0R008T+A008:001:ME04BI4J9<4J9K0+8]01001050
|
||||
00000000 S8:001:ME0?2I4J009O0+8] $8:001:ME0?2I4J049ODI|):N00ME0+8] <8:0001001060
|
||||
000000001:ME2:4+1I4J9$4(2|#0|000000030000FILE 0TAPE 0STOP 0-8{0?8]01001070
|
||||
000000008E4A0D8{+E+AMI8E4A4J8B1 8F3108H1118-+AMJ2B8W104J8-+A001J/<009>0R01001100
|
||||
00000000008T208E4A048T008E4A4J8 +A001J/B/B9>0R048S4)8N8D4A0-8F0D41118D4A01001110
|
||||
00000000008T008E4A4J8 +A001J ]009>0R8F08118T0?8]8E4A8F04118T048]8E4A8F8T01001120
|
||||
00000000008]8E4A4J8 +A001J B009>0R8K831J0Y8,8E4A4(0)0)0)1|<108001|0|000001001130
|
||||
00000000000040001|00|800009WKI|62(4A0D8{0000000000000000000000000000000001001140
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001001150
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001001160
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001001170
|
||||
00000000=000000#04*)H/}VY6044A4("000000:2*14"$"50R004J0O4J70100S0|JI000001000011
|
||||
TAPE = SYSTEM
|
||||
FILE = MCP/DISK
|
||||
STOP
|
||||
?ADD FROM SYSTEM INT/DISK, PRNPBT/DISK, LDCNTRL/DISK -
|
||||
,ALGOL/DISK -
|
||||
,XALGOL/DISK -
|
||||
,FORTRAN/DISK -
|
||||
,COBOL/DISK -
|
||||
,LOGOUT/DISK
|
||||
?END
|
||||
@@ -1,235 +1,234 @@
|
||||
14M90+KI$|#0|00MM)290+JI"000000D4*342L05000V10JI18JI0)0)000S0QKI000W0HKI000,08KI000]=/1V082I08JI0417+E0M16+E[)|/EV+EBV+E}V+E?V*)*/}V000M16+E:)B/1VB),/4V4J1>50JI
|
||||
00000000049DJA9YSI001J F2900SI8Y4A4(0)0)08/I00000?/I|0000+/I7Y000 +A2( B01000160
|
||||
000000000U+A2(0)0Y+A2(000!+A2(001|0000000Q/IPBT0RSMSG000AUTOUNLDRNALL00001000170
|
||||
00000000CODEOLAYCOREST00DATAOLAYHALT0000REMOTE00CEMESS00BATCHZIPNOBATCH001000200
|
||||
00000000000000000000000000000000000000000000000000000000MOD3IOS00000000001000210
|
||||
00000000OPTN0000~000000000000000000000000000000000000000000000000000000001000220
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000230
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000240
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000250
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000260
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000270
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000300
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000310
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000320
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000330
|
||||
00000000Q00000000000000000000000000000000000000000000000000000000000000001000340
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000350
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000360
|
||||
0000000000000000000000000000000000000000Q ?0007?Q :0007HQ W0007NQ ?0008[01000370
|
||||
00000000Q }0008P" 60008W" ?0008!= 800098]T*0003*= .0009R= 2000@H= I0009+01000400
|
||||
00000000= &000#3= @000#~= 7000#$= 6000#/= G000#X= #000@>] B0000B400?AJ0401000410
|
||||
000000008I8&4A1Y9-JA#H+A001J0?11884A4J8#MJ8!000000001*|$|50R108#831J1!S)01000420
|
||||
00000000#/#V8U4A8#1!11884A8#8+4A8#1Y11884A8#831J1YS)#/#V8 4A8#2|11884A8#01000430
|
||||
00000000831J1YS)#/#V944A8#2|11884A8#831J&8S)#/#V904A8#&811884A8#831J1YS)01000440
|
||||
00000000#/#V984A8#2|11884A8#8?4A8#2|11884A4J008I8U+A#K0U10KI0)0)8.8X8.0401000450
|
||||
00000000118X008E8A8E4A8.0D118H8A1 2E0+AI008T208E4A048T008E4A4J8 +A001J8I01000460
|
||||
00000000}#0)#<048S4)8N9QJA008H4AD98#831J0QS)#/#V8Y4A8#8|4A4J8K}>0)#<4J8K01000470
|
||||
000000000Q11MJ2!%-104J9U+A#O8M8A+E11KI0&SIF&KI88KI5QSI34SIA!KI38SIA-KI4-01000500
|
||||
00000000SI6|KI1DSI3+KI0-SI0)0)0)4J089"001J}B0)#<DI|):N00ME04AIDI|):N0D1I01000510
|
||||
00000000400?AJ}0KI0)0)0)1|0|00002|00|0007|0000004J#S8#8|4A5UJI4J3U#>008X01000520
|
||||
000000004J#$8E4A008W0+2E008W04KE2:0&2I008X048E4A18/I88JI4J#$8&4A8<1?118D01000530
|
||||
000000004A4J8<9$318I8 +A#K9DJI0+8T0+8X4J#$8E8A8E4A#4JI4J3U#>1?8T+]0)+E4J01000540
|
||||
00000000#$31A20)H1A20)41318E4A1?8SA60)KE0HBI1?8TA60)8E4A1-KI0)0)0000080001000550
|
||||
00000000000000+0000002001?8SA.0)2E0H2I1?8TA.0)8E4A>4JI0)00000700088T4J#$01000560
|
||||
000000008E4A54KI4J#$8Q4A8$04KE8$0 2E2:1:34AI4J34#>4J#$9?JA4J34#>4J#$8-4A01000570
|
||||
000000008$04319S9>119?JA8;0+Y100ME8;6+Y1004E8;I0Y100ME2:4:8$0?1E4:08BI9>01000600
|
||||
0000000004119?JA8;6+Y1]|419>119?JA4J9}048TMJ2*8W104J3-#>D+JI4J9Y+A#O9HJA01000610
|
||||
000000009.302E0D2I9.2|319HJA0HKI304J#$319HJA9.004E4QAI049|JA080UKI0)0)0)01000620
|
||||
00000000009K2)1/;V9|JA9O04119M8A9.2E0?AI008T008S9K2:8E4A4DJI5?/I0+8SDK0)01000630
|
||||
00000000KE0H2I0+8TDK0)8E4A108T0!8E4A8<00KE0HBI4J0H9"001JDO0)#<5 /I0)0)0)01000640
|
||||
00000000000000G&7|000000048X8<8E4A008W0+2E008W04KE2:0D2I008X048E4A4J008U01000650
|
||||
00000000+A#K4J8<9$318 +A#K389&JA9<8<008W31KE10BI4J9<94+AMJ2B8W109<8<008W01000660
|
||||
00000000319<319&KA3!1E0+BI4J94+A001JEW0)#<0DSI0)1|007Y004J94+A001JF>0)9<01000670
|
||||
00000000Y)L/6V#<3!119&JA0!/I0)0)1|0000004J8<041194+AMJ2B8W104J94+A001JF,01000700
|
||||
000000000)#<0+8S8<310?112?0881H110418F119&JA8FAUKI0)0)0)1J.00H00<09-JA4J01000710
|
||||
000000008F0!318I90+A#K001-KI0)0)0)004J8.9@MJ1*0E1N1K8I0E1N1K3J100+2I4J#W01000720
|
||||
00000000:!KI8.08118H8A1 2E0&AI1 3HSI0)0)8.9#4 4E>&2I8.9#0 4E?D2I8.9#H$0)01000730
|
||||
000000008:001:ME0YBI8.04119#H;0)4:HS0)8:001:ME0QBI8.04119@+E+AHW0)4:H,0)01000740
|
||||
000000002:8E4A4J#W9QKI0)0DECK 0"0000""0#0000~?0"""""00000000 8.0!419-01000750
|
||||
00000000KA90+A1J1YS)#/#V944A0M97+E+A1!4:8E4A0)004J94+AMJ1*<$1~4N1K0O3P1P01000760
|
||||
000000008I0R3J100M961+2E2:0+2I4J#W58KI0)0)0)0)0M960M1104SI9K04319|8A0Q1E01000770
|
||||
00000000202I9K96004E0&BI9K968<KE9K96088S.<0)411E2:0?BI4J#W2HKI0)00003U9001001000
|
||||
000000002MJI0)0)0)0)0M960Q110?KI9K04119|8A1UJE0 2I9K96004E0+2I4J#W08KI0D01001010
|
||||
00000000/I8.08318H8A00KE3HAI4J8F98+A#K8F10118D8A9<2E4HAI009@4 8E4A4J8F9801001020
|
||||
00000000+A#K000?SI0)0)0)8.8T008E4A8.04118H8A1U2E0?AI4J009"001J&F0)#<009D01001030
|
||||
00000000JA4J8B&.0)#<9F084E0DBI4J8B10MJ2*D5100DSI7|0000002|05|0004J#0+A1001001040
|
||||
00000000MJ2*}510000?AJ0008AJ[Q/I0000BI00000000000000000~0000000%0000001.01001050
|
||||
000000000000001Y0000002G0000002V0000003D0000003T0000004A0000004 0000005>01001060
|
||||
0000000000000000FILE0000FENCE000STOP0000ESU00000USE00000DATE0000TYPE000001001070
|
||||
00000000OPTN0000DIRECTORDRCTRYTPSYSTEMS0~000000000000000DRA00000DRB0000001001100
|
||||
00000000BOJ00000EOJ00000OPEN0000TERMNATEDATE0000TIME0000ONEBREAKAUTOPRNT01001110
|
||||
00000000CLEARWRSDISCONDCCMPLFILECLOSE000ERRORMSGRET00000LIBMSG00SCHEDMSG01001120
|
||||
00000000SECMSG00DSKTOG00RELTOG00PBDREL00CHECK000DISKMSG0DISKLOG0LIBERR0001001130
|
||||
00000000PBDONLY0SAVEPBT0RSMSG000AUTOUNLDRNALL000CODEOLAYCOREST00DATAOLAY01001140
|
||||
00000000HALT0000REMOTE00CEMESS00BATCHZIPNOBATCH000000000000000000000000001001150
|
||||
00000000000000000000000000000000MOD3IOS000000000OPTN0000~00000000000000001001160
|
||||
00000000000000000000000000000000DIRECTRY CHECKD~INCORRECT CARD~0 ERRO01001170
|
||||
00000000R ~ DIRECTORYTOP NOT SET~ LOADER LOADED ALREADY~ 4J041{4A01001200
|
||||
000000001{0008M9290?JI0)J)#N00ME0 1I1 0UMJ142*35102&JI0)0S1?JI0)0W1&JI0)01001210
|
||||
000000000,1-JI0)0]1!JI0)R|00PY204J8410MJ2*14+$!5!50R10D93*1L0H3:2*8I1|~D01001220
|
||||
000000002N0K8P248>2?3*1L0/1N}{5J00142*351*5I0; D2N1I4{"D}N1IA$1I1|"D6N2:01001230
|
||||
00000000241!0 0OBP0R0K}PA<@NA$1I1|A<1N2P0O5P0R>{2P1I1K4J2:142B150000PY2001001240
|
||||
00000000004J008L##044E082I#BKI0)Y64J8KMJ1*1H367>1/1N1K3J10082I#BKI4(1N2P01001250
|
||||
0000000000Y#Y61JY44AY7M94J#.|44A|6Q)@N004E0&2I9F1:141I089DJAY#001E4+2I|601001260
|
||||
00000000K)8N004E3U2I|6N)8N|63)DN0HME4:Y#831J+A20ME4:182IY#831J008E4AY#0401001270
|
||||
0000000011831J008E4A48JI1MKI|6N)8N|63)DN0QME4:Y#831J+A00ME4:082I0DKI4JY601001300
|
||||
00000000#F5UJI4(00Y63)DNY44AY61YME0?2I/61MKIY60QME0?2I/214KIY60HME0?2I ]01001310
|
||||
000000000MKIY60+ME0?2I ,04KI ,|44A4J|60+9"MJ2B5I3"104J0+9"001J ;#<Y60QME01001320
|
||||
000000000QBIDI|):N00ME0&1IDI|):N0D1I1QKI00000SPO00000CRA00000DKA00000DRA01001330
|
||||
0000000000000XXX7|00000000SI4(G000Y4+A001:1JY44AY#1)?N|48A0+2IY#MIY84A4J01001340
|
||||
00000000Y#Y4+A|:MJ2B8W10|60&BI4JY4+A F9;S)#/#V9;1U111YH1Y)L/6V#<2!KI0)0)01001350
|
||||
000000001|<1|8004JY4+A ;#<8>831JY4+A831J+A8E4A4J8> K#<0)8>4JY4+A|:MJ3*8I01001360
|
||||
000000008>5$ /1N1K0R3J100?2I4J B#F4(0)0)1|<108001|<1|8001|00000000008K8301001370
|
||||
000000001J+A008:001:ME04BI0 0DKI004J008L##|84A|#0 ME0?2I0 0&KI004J8KY4+A01001400
|
||||
00000000|##6|44A|62(1YH10000004J008L##|84A0)004J|#8KMJ2L0}1?1*462L0X10|401001410
|
||||
000000004A|62(2I004J0M8%|7MJ2*4I146>4$333$1~2N1U1P12130R0R10|62(9B0Q2I4J01001420
|
||||
000000000M9"001J/##<000?1I4J048%0M8,8)CN4J#;8Y+A1JMJ3*2L05104J8Y+A001J W01001430
|
||||
00000000#<008,008E4)4/-V004E2?1I8Y+A8!4A6!8Y+A1J8Y4A008%048E4A049+JA4J8Y01001440
|
||||
00000000+A001J F#<8!+A8Y4A4(0)0)7|0000002|#0|0001|007Y004J8.9@9 +AMJ2*1I01001450
|
||||
000000007"1!0/1I7"9!0 REMOVED~108.9@0 8E4A4J9 +A001J ##<4(0)0)0)7|00000001001460
|
||||
0000000000#,KI|62(MJ2*1I00000000000000000000000000000000000000000000000001001470
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001001500
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001001510
|
||||
00000000=000000#04*)H/}VY6044A4("000000:2*14"$"50R004J0O4J70100S0|JI000001000011
|
||||
DRCTRYTP 2000 % START OF DIRECTORY AREA
|
||||
DIRECT 3604 % END OF DIRECTORY AREA
|
||||
ESU 2 % MAX NUMBER OF EUS
|
||||
DATE 04/18/85 % CURRENT SYSTEM DATE
|
||||
SYSTEMS = 1 % MUST BE 1 (FOR NOW)
|
||||
FENCE = 16384 % USED BY TSMCP ONLY
|
||||
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)
|
||||
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
|
||||
USE CLEARWRS % CLEAR WRITE-READY STATUS ON DATACOM STATIONS
|
||||
TYPE CLOSE % PRINT FILE CLOSE MESSAGES
|
||||
TYPE RET % PRINT TAPE VOLUME-RETENTION MESSAGES
|
||||
TYPE LIBMSG % PRINT DUMP/LOAD/REMOVED, ETC. MESSAGES
|
||||
TYPE SCHEDMSG % PRINT MESSAGE WHEN TASKS ARE SCHEDULED
|
||||
TYPE SECMSG % PRINT FILE SECURITY MAINTENANCE MESSAGES
|
||||
USE DSKTOG % PREVENT USER ACCESS BELOW USER DISK AREA
|
||||
USE RELTOG % PREVENT USE OF ALGOL RELEASE ON DISK FILES
|
||||
TYPE PBDREL % PRINT BACKUP FILE RELEASE MESSAGES IF NOT AUTOPRNT
|
||||
TYPE DISKMSG % PRINT ALL DISK I/O RETRY MESSAGES
|
||||
TYPE DISKLOG % DISK LOGGING(TSMCP ONLY)
|
||||
TYPE LIBERR % PRINT LIB/MAINT ERROR MESSAGES (TSMCP ONLY)
|
||||
USE PBDONLY % ASSIGN ALL PRINTER/PUNCH FILES TO BACKUP (SPOOLED)
|
||||
USE RSMSG % PRINT MESSAGE FOR FILE-ACCESSED FLAG CHANGES
|
||||
USE RNALL % RUN ALL PSEUDO-READER DECKS (SHARED SYSTEMS ONLY)
|
||||
USE COREST % LOG MEMORY USAGE STATS (STATISTICS ONLY)
|
||||
USE HALT % HALT SYSTEM WHEN HALT-RECOMMENDED ERRORS OCCUR
|
||||
USE CEMESS % PRINT LIB/MAINT MESSAGES FOR CANDE TASKS (TSMCP ONLY)
|
||||
USE BATCHZIP % ZIP DECKS TO RUN UNDER BATCH CONTROL (TSMCP ONLY)
|
||||
USE MOD3IOS % ASSUME WE HAVE MODEL-III I/O CONTROL UNITS (WE DO)
|
||||
000000007|SI000000000000298>7HBI04/I0000000000000?/I00000+/I00000 +A2(0001000160
|
||||
000000000U+A2(000Y+A2(000!+A2(00000000000Q/I0000000000000 /I00000U/I000001000170
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000200
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000210
|
||||
00000000000000005&SI000000000000000000000000000000000000000000000000000001000220
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000230
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000240
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000250
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000260
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000270
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000300
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000310
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000320
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000330
|
||||
00000000Q0000000000000000000000000000000= 20003X] B0000B= 70003Z= ?0004001000340
|
||||
00000000400?AJ2H831J2H831J+A9#0)118E8A831J008E4A292H831J+A9>0)2E0DBI2H8301000350
|
||||
000000001J008E4A0M/I0)0)0000010000000700048?JA8++A6+1J831J"!S)#/#V884A2401000360
|
||||
00000000831J88+A*)HN8E4A24831J+A831J208E4A28831J0U8E4A4J>K0)24831J+A-E8.01000370
|
||||
0000000000ME4!2I2D831J048#4)8N8E4A24831J+A831J>O0)2D831J+A!)Q/2V8E4A4J>$01000400
|
||||
000000000)24831J+A-E8.0R24831J+A831J>;0)2D831J+A!)Q/2V8E4A4J>$0)24831J+A01000410
|
||||
00000000-E8.0R28831J28831J+A2D831J+A0D41118E4A24831J+A831J008E4A2+831J4J01000420
|
||||
0000000024831J+A>S0)1J8.8E4A2+831J+A00ME0DAI04831J088#8E4A2?831J048#8E4A01000430
|
||||
0000000028831J+A8#834A8204831J+AJE0|BI2H831J>W0)8E4A2&831J>,0)8E4A2|831J01000440
|
||||
00000000>]0)8E4A4J}20)8.0R000?1I20831J4M8E4A4J}60)2H831J+A2:8<20831J0Q8E01000450
|
||||
000000004A4J}#0)2H831J+A2:8<20831J008E4A4J}>0)2H831J+A2:8<2H831J2H831J+A01000460
|
||||
0000000020118E4A0U831J}B0)8E4A0Y831J}F0)8E4A0!831J}.0)8E4A820831834A822D01000470
|
||||
00000000831J+A!)D/2V2?831J+A!)B/2V834A040?AJ0008AJ0U831JKI0414BI0DJI0)0)01000500
|
||||
000000001|0|0000000000| 1|010000000000 1|00|800INVALID ADDRESS FOR MCP~01000510
|
||||
000000007|00000O1|00PYK(1|00PY4%1|00J+0}4J2.10MJ2*14*$"5~50R10D9008FKI|601000520
|
||||
000000002(00000000Y7M92+831J4J8B8E4A2+831J+AJ)CN|44A|60D4:00ME1|1I|62(0001000530
|
||||
000000004J8220831J+A11Y6*)HNMJ2B148W10Y6831J+A5)8N0&2IY60 Z)3/5VY44A2+8301000540
|
||||
000000001J4JY68.8E4A2+831J+A00ME101I4(000000000000000000000000000000000001000550
|
||||
00000000=000000#04*)H/}VY6044A4("000000:2*14"$"50R004J0O4J70100S0|JI000001000011
|
||||
STOP
|
||||
%% THIS EXTRA CARD MUST BE HERE %%
|
||||
14M90+KI$|#0|00MM)290+JI"000000D4*342L05000V10JI18JI0)0)000S0QKI000W0HKI000,08KI000]=/1V082I08JI0417+E0M16+E[)|/EV+EBV+E}V+E?V*)*/}V000M16+E:)B/1VB),/4V4J1>50JI
|
||||
000000008YSI8D4A008T008E2900SI+A001J ]0008/I8F080?/I0?8]0+/I8F040 +A2(8]01000160
|
||||
000000000U+A2(8T0Y+A2(4A0!+A2(001J B009>0Q/I831J0Y8,8E4A0 /I0)0)0U/I080001000170
|
||||
000000001|0|0000000040001|00|8002B8W104(000009A 00000000000000000000000001000200
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000210
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000220
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000230
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000240
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000250
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000260
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000270
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000300
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000310
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000320
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000330
|
||||
00000000Q00000000000000000000000000000000000000000000000000000000000000001000340
|
||||
000000000000000000000000000000000000000000000000Q <0003WQ +0004DQ 50004M01000350
|
||||
00000000= 200082= 60005-= &0005+= ?0004R= C0004V= 800058= 60005S= F0005Y01000360
|
||||
00000000= :0006>= 70006[= N0006K= H00077= L0007~] B0000B90+A0D1J831J"!S)01000370
|
||||
00000000#/#V8-4A8-+A001J8|4A8K#O0)118M4A8O#O0)11831J]|S)#/#V8 4A400?AJ4J01000400
|
||||
000000009;041?KI000000+64J00@20)8$Z)3/5V@60)9>0R8$08118Q8A1!2E0DAI041+SI01000410
|
||||
00000000000K000000000Q008-+A041J8$Z)3/5V8?4A4J8>?O0)?$0)9>K)CN00ME282I0401000420
|
||||
000000008{+A?;0)|:8I001:ME8:088{+A088]8:001:ME4:0?8{+A?S0)8:001:ME4:1:1+01000430
|
||||
000000002I4J8>?W0)?,0)9>0R8$08118Q8A1!2E18AI005|1I4J049F4J8>?O0)009>0R0401000440
|
||||
000000003 KI0)0)0}"5|00000006Q000LABEL 0FILE000000K000000000Q008$8;008]01000450
|
||||
000000008:001:ME8$04118;048]8:001:ME4:1:0DBI8$8;0 ME0?2I4J08968$08118Q8A01000460
|
||||
00000000|02E0MAI4J8$04119F4J8>>20)009>0R4J9S0M8;04311YH104118+4A040DSI0)01000470
|
||||
000000000}"5|0004J8>}>0)009>0R4J9B8$04118Q8A8B2E0+AI4J8>}B0)009>0R8#1M2I01000500
|
||||
000000004J0?8"0H8%MJ}>D! TO DEFAULT ADDRESS=2*8W1!0~9}8#104J0?964J8U+A1001000510
|
||||
00000000MJ2*D510000?AJ0008AJ>8/I0}"5|000000K00000000BI004J041{4A1{0008M901000520
|
||||
00000000290?JI0)J)#N00ME0 1I1 0UMJ142*35102&JI0)0S1?JI0)0W1&JI0)0,1-JI0)01000530
|
||||
000000000]1!JI0)R|00PY204J8410MJ2*14+$!5!50R10D900000000000000000000000001000540
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000550
|
||||
0000000000000000000000000000000000000000DISK FAILURE~000TAPE FAILURE~00001000560
|
||||
00000000NO MCP FILE~0000MCP FILE LOADED~NOT IN DIRCTORY~LOADER ON DISK~ 01000570
|
||||
00000000CRA FAILURE~ 00000000000000000MCP 0DISK 0SYSTEM 0000000001000600
|
||||
0000000000000000000000Y>Y#2:Y84AY@M94J92|84A|#Y61:4:|?4A|>K)CN004E0+BI|>01000610
|
||||
00000000N)8N1:08BI4JY#|@9#1:0&AI|#|44A|62(DISK~ 0000/#|44A4J8K|6009>0R8O01000620
|
||||
00000000831J8K831J+A8E4A4J8O|604=)|/1V009>0R0)8K4J8OMJ3*8I8>3$S$ /1N1K0R01000630
|
||||
000000000R3J100U2I|#0411|84A|#0D2E3H1I4J00964J?08KMJ2B8%104(0)0)1;413 0001000640
|
||||
0000000000040+SI4J8> F .9>L)#N08AI|60411|48AY62E0+AI4(0)0001|0000000600001000650
|
||||
000000000000Y6Q)@N004E082I042(Y6M)9N4-2IY63)DN0-BI041&KI4J8> K O9>0RY74J01000660
|
||||
0000000000Y# <9>8E8AM)9N004E3Y2I|#0411|88A0D2E0&AI2+KI0)0003|0000000600001000670
|
||||
000000000418KI0)Y74J00Y# O9>8E8AM)9N004E1|2I|#0411|88A0D2E0DAI4JY63)DN0Q01000700
|
||||
00000000ME0?2I0H0?KIY#9)?N96|62(000020004J08Y6418%001J B009>0RY60?ME0D1I01000710
|
||||
000000004(0)0)0)7|000000004J0M8T|7MJ2*4I146>4$333$1~2N1U1P12130R0R10|62(01000720
|
||||
00000000008<0?2I4J0D964J048T0M8S8)CN4J9.8 +A1JMJ3*2L0510DI|):N0DBI4J8 +A01000730
|
||||
00000000001J # >9>0R0UKI2|#0|00000003000008T0 8E4A008S008E4)4/-V004E3M1I01000740
|
||||
000000008K|44A8 +A6!1J8|4A048&4A8K831J048E4A4J9B|68|4A4(0)004J8$0+8"MJ2*01000750
|
||||
000000001>"$ D2N1I2P0O1P0R/D3N1I?{FP=D2N6{BP7$ D3N1!0 @P/D3N1!0 6P=D3N1!01000760
|
||||
000000000 1P1"0R4:108Q4A4(8T0 8E4J9KY60|2I088"0+8]8E4A0YKI008"0+8]8E4A4J01000770
|
||||
000000009K048"0+8]8E4A4(00008T008E4A4J8 +A001J S009>0R088S|4JA0)0)0)|60+01001000
|
||||
00000000110?KI8B10118+4A044Y2I4J8C8 +AMJ2*8W104J8 +A001J >009>0R0038KI0)01001010
|
||||
000000001|00|8001|00K000(!8F318S4 8:001:ME0?2I4J0+96(!8F318S008]8:001:ME01001020
|
||||
000000000 2I<08F318S048]8:001:4E0-2I8F08118D8A1 2E0-AI5HJI0?8".!8F0!413101001030
|
||||
000000008S8E8A00ME888A0D2I0?8" B8E4A4J0?8]0Y8%MJ2B8W104(000009A DI|):N4+01001040
|
||||
000000002I8 +A001J8Q4A4J8 +A001J ]/29>0R008T+A008:001:ME04BI4J9<4J9K0+8]01001050
|
||||
00000000 S8:001:ME0?2I4J009O0+8] $8:001:ME0?2I4J049ODI|):N00ME0+8] <8:0001001060
|
||||
000000001:ME2:4+1I4J9$4(2|#0|000000030000FILE 0TAPE 0STOP 0-8{0?8]01001070
|
||||
000000008E4A0D8{+E+AMI8E4A4J8B1 8F3108H1118-+AMJ2B8W104J8-+A001J/<009>0R01001100
|
||||
00000000008T208E4A048T008E4A4J8 +A001J/B/B9>0R048S4)8N8D4A0-8F0D41118D4A01001110
|
||||
00000000008T008E4A4J8 +A001J ]009>0R8F08118T0?8]8E4A8F04118T048]8E4A8F8T01001120
|
||||
00000000008]8E4A4J8 +A001J B009>0R8K831J0Y8,8E4A4(0)0)0)1|<108001|0|000001001130
|
||||
00000000000040001|00|800009WKI|62(4A0D8{0000000000000000000000000000000001001140
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001001150
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001001160
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001001170
|
||||
00000000=000000#04*)H/}VY6044A4("000000:2*14"$"50R004J0O4J70100S0|JI000001000011
|
||||
TAPE = SYSTEM
|
||||
FILE = MCP/DISK
|
||||
STOP
|
||||
?ADD FROM SYSTEM INT/DISK, PRNPBT/DISK, LDCNTRL/DISK
|
||||
14M90+KI$|#0|00MM)290+JI"000000D4*342L05000V10JI18JI0)0)000S0QKI000W0HKI000,08KI000]=/1V082I08JI0417+E0M16+E[)|/EV+EBV+E}V+E?V*)*/}V000M16+E:)B/1VB),/4V4J1>50JI
|
||||
00000000049DJA9YSI001J F2900SI8Y4A4(0)0)08/I00000?/I|0000+/I7Y000 +A2( B01000160
|
||||
000000000U+A2(0)0Y+A2(000!+A2(001|0000000Q/IPBT0RSMSG000AUTOUNLDRNALL00001000170
|
||||
00000000CODEOLAYCOREST00DATAOLAYHALT0000REMOTE00CEMESS00BATCHZIPNOBATCH001000200
|
||||
00000000000000000000000000000000000000000000000000000000MOD3IOS00000000001000210
|
||||
00000000OPTN0000~000000000000000000000000000000000000000000000000000000001000220
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000230
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000240
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000250
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000260
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000270
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000300
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000310
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000320
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000330
|
||||
00000000Q00000000000000000000000000000000000000000000000000000000000000001000340
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000350
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000360
|
||||
0000000000000000000000000000000000000000Q ?0007?Q :0007HQ W0007NQ ?0008[01000370
|
||||
00000000Q }0008P" 60008W" ?0008!= 800098]T*0003*= .0009R= 2000@H= I0009+01000400
|
||||
00000000= &000#3= @000#~= 7000#$= 6000#/= G000#X= #000@>] B0000B400?AJ0401000410
|
||||
000000008I8&4A1Y9-JA#H+A001J0?11884A4J8#MJ8!000000001*|$|50R108#831J1!S)01000420
|
||||
00000000#/#V8U4A8#1!11884A8#8+4A8#1Y11884A8#831J1YS)#/#V8 4A8#2|11884A8#01000430
|
||||
00000000831J1YS)#/#V944A8#2|11884A8#831J&8S)#/#V904A8#&811884A8#831J1YS)01000440
|
||||
00000000#/#V984A8#2|11884A8#8?4A8#2|11884A4J008I8U+A#K0U10KI0)0)8.8X8.0401000450
|
||||
00000000118X008E8A8E4A8.0D118H8A1 2E0+AI008T208E4A048T008E4A4J8 +A001J8I01000460
|
||||
00000000}#0)#<048S4)8N9QJA008H4AD98#831J0QS)#/#V8Y4A8#8|4A4J8K}>0)#<4J8K01000470
|
||||
000000000Q11MJ2!%-104J9U+A#O8M8A+E11KI0&SIF&KI88KI5QSI34SIA!KI38SIA-KI4-01000500
|
||||
00000000SI6|KI1DSI3+KI0-SI0)0)0)4J089"001J}B0)#<DI|):N00ME04AIDI|):N0D1I01000510
|
||||
00000000400?AJ}0KI0)0)0)1|0|00002|00|0007|0000004J#S8#8|4A5UJI4J3U#>008X01000520
|
||||
000000004J#$8E4A008W0+2E008W04KE2:0&2I008X048E4A18/I88JI4J#$8&4A8<1?118D01000530
|
||||
000000004A4J8<9$318I8 +A#K9DJI0+8T0+8X4J#$8E8A8E4A#4JI4J3U#>1?8T+]0)+E4J01000540
|
||||
00000000#$31A20)H1A20)41318E4A1?8SA60)KE0HBI1?8TA60)8E4A1-KI0)0)0000080001000550
|
||||
00000000000000+0000002001?8SA.0)2E0H2I1?8TA.0)8E4A>4JI0)00000700088T4J#$01000560
|
||||
000000008E4A54KI4J#$8Q4A8$04KE8$0 2E2:1:34AI4J34#>4J#$9?JA4J34#>4J#$8-4A01000570
|
||||
000000008$04319S9>119?JA8;0+Y100ME8;6+Y1004E8;I0Y100ME2:4:8$0?1E4:08BI9>01000600
|
||||
0000000004119?JA8;6+Y1]|419>119?JA4J9}048TMJ2*8W104J3-#>D+JI4J9Y+A#O9HJA01000610
|
||||
000000009.302E0D2I9.2|319HJA0HKI304J#$319HJA9.004E4QAI049|JA080UKI0)0)0)01000620
|
||||
00000000009K2)1/;V9|JA9O04119M8A9.2E0?AI008T008S9K2:8E4A4DJI5?/I0+8SDK0)01000630
|
||||
00000000KE0H2I0+8TDK0)8E4A108T0!8E4A8<00KE0HBI4J0H9"001JDO0)#<5 /I0)0)0)01000640
|
||||
00000000000000G&7|000000048X8<8E4A008W0+2E008W04KE2:0D2I008X048E4A4J008U01000650
|
||||
00000000+A#K4J8<9$318 +A#K389&JA9<8<008W31KE10BI4J9<94+AMJ2B8W109<8<008W01000660
|
||||
00000000319<319&KA3!1E0+BI4J94+A001JEW0)#<0DSI0)1|007Y004J94+A001JF>0)9<01000670
|
||||
00000000Y)L/6V#<3!119&JA0!/I0)0)1|0000004J8<041194+AMJ2B8W104J94+A001JF,01000700
|
||||
000000000)#<0+8S8<310?112?0881H110418F119&JA8FAUKI0)0)0)1J.00H00<09-JA4J01000710
|
||||
000000008F0!318I90+A#K001-KI0)0)0)004J8.9@MJ1*0E1N1K8I0E1N1K3J100+2I4J#W01000720
|
||||
00000000:!KI8.08118H8A1 2E0&AI1 3HSI0)0)8.9#4 4E>&2I8.9#0 4E?D2I8.9#H$0)01000730
|
||||
000000008:001:ME0YBI8.04119#H;0)4:HS0)8:001:ME0QBI8.04119@+E+AHW0)4:H,0)01000740
|
||||
000000002:8E4A4J#W9QKI0)0DECK 0"0000""0#0000~?0"""""00000000 8.0!419-01000750
|
||||
00000000KA90+A1J1YS)#/#V944A0M97+E+A1!4:8E4A0)004J94+AMJ1*<$1~4N1K0O3P1P01000760
|
||||
000000008I0R3J100M961+2E2:0+2I4J#W58KI0)0)0)0)0M960M1104SI9K04319|8A0Q1E01000770
|
||||
00000000202I9K96004E0&BI9K968<KE9K96088S.<0)411E2:0?BI4J#W2HKI0)00003U9001001000
|
||||
000000002MJI0)0)0)0)0M960Q110?KI9K04119|8A1UJE0 2I9K96004E0+2I4J#W08KI0D01001010
|
||||
00000000/I8.08318H8A00KE3HAI4J8F98+A#K8F10118D8A9<2E4HAI009@4 8E4A4J8F9801001020
|
||||
00000000+A#K000?SI0)0)0)8.8T008E4A8.04118H8A1U2E0?AI4J009"001J&F0)#<009D01001030
|
||||
00000000JA4J8B&.0)#<9F084E0DBI4J8B10MJ2*D5100DSI7|0000002|05|0004J#0+A1001001040
|
||||
00000000MJ2*}510000?AJ0008AJ[Q/I0000BI00000000000000000~0000000%0000001.01001050
|
||||
000000000000001Y0000002G0000002V0000003D0000003T0000004A0000004 0000005>01001060
|
||||
0000000000000000FILE0000FENCE000STOP0000ESU00000USE00000DATE0000TYPE000001001070
|
||||
00000000OPTN0000DIRECTORDRCTRYTPSYSTEMS0~000000000000000DRA00000DRB0000001001100
|
||||
00000000BOJ00000EOJ00000OPEN0000TERMNATEDATE0000TIME0000ONEBREAKAUTOPRNT01001110
|
||||
00000000CLEARWRSDISCONDCCMPLFILECLOSE000ERRORMSGRET00000LIBMSG00SCHEDMSG01001120
|
||||
00000000SECMSG00DSKTOG00RELTOG00PBDREL00CHECK000DISKMSG0DISKLOG0LIBERR0001001130
|
||||
00000000PBDONLY0SAVEPBT0RSMSG000AUTOUNLDRNALL000CODEOLAYCOREST00DATAOLAY01001140
|
||||
00000000HALT0000REMOTE00CEMESS00BATCHZIPNOBATCH000000000000000000000000001001150
|
||||
00000000000000000000000000000000MOD3IOS000000000OPTN0000~00000000000000001001160
|
||||
00000000000000000000000000000000DIRECTRY CHECKD~INCORRECT CARD~0 ERRO01001170
|
||||
00000000R ~ DIRECTORYTOP NOT SET~ LOADER LOADED ALREADY~ 4J041{4A01001200
|
||||
000000001{0008M9290?JI0)J)#N00ME0 1I1 0UMJ142*35102&JI0)0S1?JI0)0W1&JI0)01001210
|
||||
000000000,1-JI0)0]1!JI0)R|00PY204J8410MJ2*14+$!5!50R10D93*1L0H3:2*8I1|~D01001220
|
||||
000000002N0K8P248>2?3*1L0/1N}{5J00142*351*5I0; D2N1I4{"D}N1IA$1I1|"D6N2:01001230
|
||||
00000000241!0 0OBP0R0K}PA<@NA$1I1|A<1N2P0O5P0R>{2P1I1K4J2:142B150000PY2001001240
|
||||
00000000004J008L##044E082I#BKI0)Y64J8KMJ1*1H367>1/1N1K3J10082I#BKI4(1N2P01001250
|
||||
0000000000Y#Y61JY44AY7M94J#.|44A|6Q)@N004E0&2I9F1:141I089DJAY#001E4+2I|601001260
|
||||
00000000K)8N004E3U2I|6N)8N|63)DN0HME4:Y#831J+A20ME4:182IY#831J008E4AY#0401001270
|
||||
0000000011831J008E4A48JI1MKI|6N)8N|63)DN0QME4:Y#831J+A00ME4:082I0DKI4JY601001300
|
||||
00000000#F5UJI4(00Y63)DNY44AY61YME0?2I/61MKIY60QME0?2I/214KIY60HME0?2I ]01001310
|
||||
000000000MKIY60+ME0?2I ,04KI ,|44A4J|60+9"MJ2B5I3"104J0+9"001J ;#<Y60QME01001320
|
||||
000000000QBIDI|):N00ME0&1IDI|):N0D1I1QKI00000SPO00000CRA00000DKA00000DRA01001330
|
||||
0000000000000XXX7|00000000SI4(G000Y4+A001:1JY44AY#1)?N|48A0+2IY#MIY84A4J01001340
|
||||
00000000Y#Y4+A|:MJ2B8W10|60&BI4JY4+A F9;S)#/#V9;1U111YH1Y)L/6V#<2!KI0)0)01001350
|
||||
000000001|<1|8004JY4+A ;#<8>831JY4+A831J+A8E4A4J8> K#<0)8>4JY4+A|:MJ3*8I01001360
|
||||
000000008>5$ /1N1K0R3J100?2I4J B#F4(0)0)1|<108001|<1|8001|00000000008K8301001370
|
||||
000000001J+A008:001:ME04BI0 0DKI004J008L##|84A|#0 ME0?2I0 0&KI004J8KY4+A01001400
|
||||
00000000|##6|44A|62(1YH10000004J008L##|84A0)004J|#8KMJ2L0}1?1*462L0X10|401001410
|
||||
000000004A|62(2I004J0M8%|7MJ2*4I146>4$333$1~2N1U1P12130R0R10|62(9B0Q2I4J01001420
|
||||
000000000M9"001J/##<000?1I4J048%0M8,8)CN4J#;8Y+A1JMJ3*2L05104J8Y+A001J W01001430
|
||||
00000000#<008,008E4)4/-V004E2?1I8Y+A8!4A6!8Y+A1J8Y4A008%048E4A049+JA4J8Y01001440
|
||||
00000000+A001J F#<8!+A8Y4A4(0)0)7|0000002|#0|0001|007Y004J8.9@9 +AMJ2*1I01001450
|
||||
000000007"1!0/1I7"9!0 REMOVED~108.9@0 8E4A4J9 +A001J ##<4(0)0)0)7|00000001001460
|
||||
0000000000#,KI|62(MJ2*1I00000000000000000000000000000000000000000000000001001470
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001001500
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001001510
|
||||
00000000=000000#04*)H/}VY6044A4("000000:2*14"$"50R004J0O4J70100S0|JI000001000011
|
||||
DRCTRYTP 2000 % START OF DIRECTORY AREA
|
||||
DIRECT 3604 % END OF DIRECTORY AREA
|
||||
ESU 2 % MAX NUMBER OF EUS
|
||||
DATE 04/18/85 % CURRENT SYSTEM DATE
|
||||
SYSTEMS = 1 % MUST BE 1 (FOR NOW)
|
||||
FENCE = 16384 % USED BY TSMCP ONLY
|
||||
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)
|
||||
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
|
||||
USE CLEARWRS % CLEAR WRITE-READY STATUS ON DATACOM STATIONS
|
||||
TYPE CLOSE % PRINT FILE CLOSE MESSAGES
|
||||
TYPE RET % PRINT TAPE VOLUME-RETENTION MESSAGES
|
||||
TYPE LIBMSG % PRINT DUMP/LOAD/REMOVED, ETC. MESSAGES
|
||||
TYPE SCHEDMSG % PRINT MESSAGE WHEN TASKS ARE SCHEDULED
|
||||
TYPE SECMSG % PRINT FILE SECURITY MAINTENANCE MESSAGES
|
||||
USE DSKTOG % PREVENT USER ACCESS BELOW USER DISK AREA
|
||||
USE RELTOG % PREVENT USE OF ALGOL RELEASE ON DISK FILES
|
||||
TYPE PBDREL % PRINT BACKUP FILE RELEASE MESSAGES IF NOT AUTOPRNT
|
||||
TYPE DISKMSG % PRINT ALL DISK I/O RETRY MESSAGES
|
||||
TYPE DISKLOG % DISK LOGGING(TSMCP ONLY)
|
||||
TYPE LIBERR % PRINT LIB/MAINT ERROR MESSAGES (TSMCP ONLY)
|
||||
USE PBDONLY % ASSIGN ALL PRINTER/PUNCH FILES TO BACKUP (SPOOLED)
|
||||
USE RSMSG % PRINT MESSAGE FOR FILE-ACCESSED FLAG CHANGES
|
||||
USE RNALL % RUN ALL PSEUDO-READER DECKS (SHARED SYSTEMS ONLY)
|
||||
USE COREST % LOG MEMORY USAGE STATS (STATISTICS ONLY)
|
||||
USE HALT % HALT SYSTEM WHEN HALT-RECOMMENDED ERRORS OCCUR
|
||||
USE CEMESS % PRINT LIB/MAINT MESSAGES FOR CANDE TASKS (TSMCP ONLY)
|
||||
USE BATCHZIP % ZIP DECKS TO RUN UNDER BATCH CONTROL (TSMCP ONLY)
|
||||
USE MOD3IOS % ASSUME WE HAVE MODEL-III I/O CONTROL UNITS (WE DO)
|
||||
000000007|SI000000000000298>7HBI04/I0000000000000?/I00000+/I00000 +A2(0001000160
|
||||
000000000U+A2(000Y+A2(000!+A2(00000000000Q/I0000000000000 /I00000U/I000001000170
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000200
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000210
|
||||
00000000000000005&SI000000000000000000000000000000000000000000000000000001000220
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000230
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000240
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000250
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000260
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000270
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000300
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000310
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000320
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000330
|
||||
00000000Q0000000000000000000000000000000= 20003X] B0000B= 70003Z= ?0004001000340
|
||||
00000000400?AJ2H831J2H831J+A9#0)118E8A831J008E4A292H831J+A9>0)2E0DBI2H8301000350
|
||||
000000001J008E4A0M/I0)0)0000010000000700048?JA8++A6+1J831J"!S)#/#V884A2401000360
|
||||
00000000831J88+A*)HN8E4A24831J+A831J208E4A28831J0U8E4A4J>K0)24831J+A-E8.01000370
|
||||
0000000000ME4!2I2D831J048#4)8N8E4A24831J+A831J>O0)2D831J+A!)Q/2V8E4A4J>$01000400
|
||||
000000000)24831J+A-E8.0R24831J+A831J>;0)2D831J+A!)Q/2V8E4A4J>$0)24831J+A01000410
|
||||
00000000-E8.0R28831J28831J+A2D831J+A0D41118E4A24831J+A831J008E4A2+831J4J01000420
|
||||
0000000024831J+A>S0)1J8.8E4A2+831J+A00ME0DAI04831J088#8E4A2?831J048#8E4A01000430
|
||||
0000000028831J+A8#834A8204831J+AJE0|BI2H831J>W0)8E4A2&831J>,0)8E4A2|831J01000440
|
||||
00000000>]0)8E4A4J}20)8.0R000?1I20831J4M8E4A4J}60)2H831J+A2:8<20831J0Q8E01000450
|
||||
000000004A4J}#0)2H831J+A2:8<20831J008E4A4J}>0)2H831J+A2:8<2H831J2H831J+A01000460
|
||||
0000000020118E4A0U831J}B0)8E4A0Y831J}F0)8E4A0!831J}.0)8E4A820831834A822D01000470
|
||||
00000000831J+A!)D/2V2?831J+A!)B/2V834A040?AJ0008AJ0U831JKI0414BI0DJI0)0)01000500
|
||||
000000001|0|0000000000| 1|010000000000 1|00|800INVALID ADDRESS FOR MCP~01000510
|
||||
000000007|00000O1|00PYK(1|00PY4%1|00J+0}4J2.10MJ2*14*$"5~50R10D9008FKI|601000520
|
||||
000000002(00000000Y7M92+831J4J8B8E4A2+831J+AJ)CN|44A|60D4:00ME1|1I|62(0001000530
|
||||
000000004J8220831J+A11Y6*)HNMJ2B148W10Y6831J+A5)8N0&2IY60 Z)3/5VY44A2+8301000540
|
||||
000000001J4JY68.8E4A2+831J+A00ME101I4(000000000000000000000000000000000001000550
|
||||
00000000=000000#04*)H/}VY6044A4("000000:2*14"$"50R004J0O4J70100S0|JI000001000011
|
||||
STOP
|
||||
14M90+KI$|#0|00MM)290+JI"000000D4*342L05000V10JI18JI0)0)000S0QKI000W0HKI000,08KI000]=/1V082I08JI0417+E0M16+E[)|/EV+EBV+E}V+E?V*)*/}V000M16+E:)B/1VB),/4V4J1>50JI
|
||||
000000008YSI8D4A008T008E2900SI+A001J ]0008/I8F080?/I0?8]0+/I8F040 +A2(8]01000160
|
||||
000000000U+A2(8T0Y+A2(4A0!+A2(001J B009>0Q/I831J0Y8,8E4A0 /I0)0)0U/I080001000170
|
||||
000000001|0|0000000040001|00|8002B8W104(000009A 00000000000000000000000001000200
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000210
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000220
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000230
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000240
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000250
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000260
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000270
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000300
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000310
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000320
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000330
|
||||
00000000Q00000000000000000000000000000000000000000000000000000000000000001000340
|
||||
000000000000000000000000000000000000000000000000Q <0003WQ +0004DQ 50004M01000350
|
||||
00000000= 200082= 60005-= &0005+= ?0004R= C0004V= 800058= 60005S= F0005Y01000360
|
||||
00000000= :0006>= 70006[= N0006K= H00077= L0007~] B0000B90+A0D1J831J"!S)01000370
|
||||
00000000#/#V8-4A8-+A001J8|4A8K#O0)118M4A8O#O0)11831J]|S)#/#V8 4A400?AJ4J01000400
|
||||
000000009;041?KI000000+64J00@20)8$Z)3/5V@60)9>0R8$08118Q8A1!2E0DAI041+SI01000410
|
||||
00000000000K000000000Q008-+A041J8$Z)3/5V8?4A4J8>?O0)?$0)9>K)CN00ME282I0401000420
|
||||
000000008{+A?;0)|:8I001:ME8:088{+A088]8:001:ME4:0?8{+A?S0)8:001:ME4:1:1+01000430
|
||||
000000002I4J8>?W0)?,0)9>0R8$08118Q8A1!2E18AI005|1I4J049F4J8>?O0)009>0R0401000440
|
||||
000000003 KI0)0)0}"5|00000006Q000LABEL 0FILE000000K000000000Q008$8;008]01000450
|
||||
000000008:001:ME8$04118;048]8:001:ME4:1:0DBI8$8;0 ME0?2I4J08968$08118Q8A01000460
|
||||
00000000|02E0MAI4J8$04119F4J8>>20)009>0R4J9S0M8;04311YH104118+4A040DSI0)01000470
|
||||
000000000}"5|0004J8>}>0)009>0R4J9B8$04118Q8A8B2E0+AI4J8>}B0)009>0R8#1M2I01000500
|
||||
000000004J0?8"0H8%MJ}>D! TO DEFAULT ADDRESS=2*8W1!0~9}8#104J0?964J8U+A1001000510
|
||||
00000000MJ2*D510000?AJ0008AJ>8/I0}"5|000000K00000000BI004J041{4A1{0008M901000520
|
||||
00000000290?JI0)J)#N00ME0 1I1 0UMJ142*35102&JI0)0S1?JI0)0W1&JI0)0,1-JI0)01000530
|
||||
000000000]1!JI0)R|00PY204J8410MJ2*14+$!5!50R10D900000000000000000000000001000540
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000550
|
||||
0000000000000000000000000000000000000000DISK FAILURE~000TAPE FAILURE~00001000560
|
||||
00000000NO MCP FILE~0000MCP FILE LOADED~NOT IN DIRCTORY~LOADER ON DISK~ 01000570
|
||||
00000000CRA FAILURE~ 00000000000000000MCP 0DISK 0SYSTEM 0000000001000600
|
||||
0000000000000000000000Y>Y#2:Y84AY@M94J92|84A|#Y61:4:|?4A|>K)CN004E0+BI|>01000610
|
||||
00000000N)8N1:08BI4JY#|@9#1:0&AI|#|44A|62(DISK~ 0000/#|44A4J8K|6009>0R8O01000620
|
||||
00000000831J8K831J+A8E4A4J8O|604=)|/1V009>0R0)8K4J8OMJ3*8I8>3$S$ /1N1K0R01000630
|
||||
000000000R3J100U2I|#0411|84A|#0D2E3H1I4J00964J?08KMJ2B8%104(0)0)1;413 0001000640
|
||||
0000000000040+SI4J8> F .9>L)#N08AI|60411|48AY62E0+AI4(0)0001|0000000600001000650
|
||||
000000000000Y6Q)@N004E082I042(Y6M)9N4-2IY63)DN0-BI041&KI4J8> K O9>0RY74J01000660
|
||||
0000000000Y# <9>8E8AM)9N004E3Y2I|#0411|88A0D2E0&AI2+KI0)0003|0000000600001000670
|
||||
000000000418KI0)Y74J00Y# O9>8E8AM)9N004E1|2I|#0411|88A0D2E0DAI4JY63)DN0Q01000700
|
||||
00000000ME0?2I0H0?KIY#9)?N96|62(000020004J08Y6418%001J B009>0RY60?ME0D1I01000710
|
||||
000000004(0)0)0)7|000000004J0M8T|7MJ2*4I146>4$333$1~2N1U1P12130R0R10|62(01000720
|
||||
00000000008<0?2I4J0D964J048T0M8S8)CN4J9.8 +A1JMJ3*2L0510DI|):N0DBI4J8 +A01000730
|
||||
00000000001J # >9>0R0UKI2|#0|00000003000008T0 8E4A008S008E4)4/-V004E3M1I01000740
|
||||
000000008K|44A8 +A6!1J8|4A048&4A8K831J048E4A4J9B|68|4A4(0)004J8$0+8"MJ2*01000750
|
||||
000000001>"$ D2N1I2P0O1P0R/D3N1I?{FP=D2N6{BP7$ D3N1!0 @P/D3N1!0 6P=D3N1!01000760
|
||||
000000000 1P1"0R4:108Q4A4(8T0 8E4J9KY60|2I088"0+8]8E4A0YKI008"0+8]8E4A4J01000770
|
||||
000000009K048"0+8]8E4A4(00008T008E4A4J8 +A001J S009>0R088S|4JA0)0)0)|60+01001000
|
||||
00000000110?KI8B10118+4A044Y2I4J8C8 +AMJ2*8W104J8 +A001J >009>0R0038KI0)01001010
|
||||
000000001|00|8001|00K000(!8F318S4 8:001:ME0?2I4J0+96(!8F318S008]8:001:ME01001020
|
||||
000000000 2I<08F318S048]8:001:4E0-2I8F08118D8A1 2E0-AI5HJI0?8".!8F0!413101001030
|
||||
000000008S8E8A00ME888A0D2I0?8" B8E4A4J0?8]0Y8%MJ2B8W104(000009A DI|):N4+01001040
|
||||
000000002I8 +A001J8Q4A4J8 +A001J ]/29>0R008T+A008:001:ME04BI4J9<4J9K0+8]01001050
|
||||
00000000 S8:001:ME0?2I4J009O0+8] $8:001:ME0?2I4J049ODI|):N00ME0+8] <8:0001001060
|
||||
000000001:ME2:4+1I4J9$4(2|#0|000000030000FILE 0TAPE 0STOP 0-8{0?8]01001070
|
||||
000000008E4A0D8{+E+AMI8E4A4J8B1 8F3108H1118-+AMJ2B8W104J8-+A001J/<009>0R01001100
|
||||
00000000008T208E4A048T008E4A4J8 +A001J/B/B9>0R048S4)8N8D4A0-8F0D41118D4A01001110
|
||||
00000000008T008E4A4J8 +A001J ]009>0R8F08118T0?8]8E4A8F04118T048]8E4A8F8T01001120
|
||||
00000000008]8E4A4J8 +A001J B009>0R8K831J0Y8,8E4A4(0)0)0)1|<108001|0|000001001130
|
||||
00000000000040001|00|800009WKI|62(4A0D8{0000000000000000000000000000000001001140
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001001150
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001001160
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001001170
|
||||
00000000=000000#04*)H/}VY6044A4("000000:2*14"$"50R004J0O4J70100S0|JI000001000011
|
||||
TAPE = SYSTEM
|
||||
FILE = MCP/DISK
|
||||
STOP
|
||||
?ADD FROM SYSTEM INT/DISK, PRNPBT/DISK, LDCNTRL/DISK
|
||||
?END
|
||||
@@ -1,71 +1,71 @@
|
||||
14M90+KI$|#0|00MM)290+JI"000000D4*342L05000V10JI18JI0)0)000S0QKI000W0HKI000,08KI000]=/1V082I08JI0417+E0M16+E[)|/EV+EBV+E}V+E?V*)*/}V000M16+E:)B/1VB),/4V4J1>50JI
|
||||
000000008YSI8D4A008T008E2900SI+A001J ]0008/I8F080?/I0?8]0+/I8F040 +A2(8]01000160
|
||||
000000000U+A2(8T0Y+A2(4A0!+A2(001J B009>0Q/I831J0Y8,8E4A0 /I0)0)0U/I080001000170
|
||||
000000001|0|0000000040001|00|8002B8W104(000009A 00000000000000000000000001000200
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000210
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000220
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000230
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000240
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000250
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000260
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000270
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000300
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000310
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000320
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000330
|
||||
00000000Q00000000000000000000000000000000000000000000000000000000000000001000340
|
||||
000000000000000000000000000000000000000000000000Q <0003WQ +0004DQ 50004M01000350
|
||||
00000000= 200082= 60005-= &0005+= ?0004R= C0004V= 800058= 60005S= F0005Y01000360
|
||||
00000000= :0006>= 70006[= N0006K= H00077= L0007~] B0000B90+A0D1J831J"!S)01000370
|
||||
00000000#/#V8-4A8-+A001J8|4A8K#O0)118M4A8O#O0)11831J]|S)#/#V8 4A400?AJ4J01000400
|
||||
000000009;041?KI000000+64J00@20)8$Z)3/5V@60)9>0R8$08118Q8A1!2E0DAI041+SI01000410
|
||||
00000000000K000000000Q008-+A041J8$Z)3/5V8?4A4J8>?O0)?$0)9>K)CN00ME282I0401000420
|
||||
000000008{+A?;0)|:8I001:ME8:088{+A088]8:001:ME4:0?8{+A?S0)8:001:ME4:1:1+01000430
|
||||
000000002I4J8>?W0)?,0)9>0R8$08118Q8A1!2E18AI005|1I4J049F4J8>?O0)009>0R0401000440
|
||||
000000003 KI0)0)0}"5|00000006Q000LABEL 0FILE000000K000000000Q008$8;008]01000450
|
||||
000000008:001:ME8$04118;048]8:001:ME4:1:0DBI8$8;0 ME0?2I4J08968$08118Q8A01000460
|
||||
00000000|02E0MAI4J8$04119F4J8>>20)009>0R4J9S0M8;04311YH104118+4A040DSI0)01000470
|
||||
000000000}"5|0004J8>}>0)009>0R4J9B8$04118Q8A8B2E0+AI4J8>}B0)009>0R8#1M2I01000500
|
||||
000000004J0?8"0H8%MJ}>D! TO DEFAULT ADDRESS=2*8W1!0~9}8#104J0?964J8U+A1001000510
|
||||
00000000MJ2*D510000?AJ0008AJ>8/I0}"5|000000K00000000BI004J041{4A1{0008M901000520
|
||||
00000000290?JI0)J)#N00ME0 1I1 0UMJ142*35102&JI0)0S1?JI0)0W1&JI0)0,1-JI0)01000530
|
||||
000000000]1!JI0)R|00PY204J8410MJ2*14+$!5!50R10D900000000000000000000000001000540
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000550
|
||||
0000000000000000000000000000000000000000DISK FAILURE~000TAPE FAILURE~00001000560
|
||||
00000000NO MCP FILE~0000MCP FILE LOADED~NOT IN DIRCTORY~LOADER ON DISK~ 01000570
|
||||
00000000CRA FAILURE~ 00000000000000000MCP 0DISK 0SYSTEM 0000000001000600
|
||||
0000000000000000000000Y>Y#2:Y84AY@M94J92|84A|#Y61:4:|?4A|>K)CN004E0+BI|>01000610
|
||||
00000000N)8N1:08BI4JY#|@9#1:0&AI|#|44A|62(DISK~ 0000/#|44A4J8K|6009>0R8O01000620
|
||||
00000000831J8K831J+A8E4A4J8O|604=)|/1V009>0R0)8K4J8OMJ3*8I8>3$S$ /1N1K0R01000630
|
||||
000000000R3J100U2I|#0411|84A|#0D2E3H1I4J00964J?08KMJ2B8%104(0)0)1;413 0001000640
|
||||
0000000000040+SI4J8> F .9>L)#N08AI|60411|48AY62E0+AI4(0)0001|0000000600001000650
|
||||
000000000000Y6Q)@N004E082I042(Y6M)9N4-2IY63)DN0-BI041&KI4J8> K O9>0RY74J01000660
|
||||
0000000000Y# <9>8E8AM)9N004E3Y2I|#0411|88A0D2E0&AI2+KI0)0003|0000000600001000670
|
||||
000000000418KI0)Y74J00Y# O9>8E8AM)9N004E1|2I|#0411|88A0D2E0DAI4JY63)DN0Q01000700
|
||||
00000000ME0?2I0H0?KIY#9)?N96|62(000020004J08Y6418%001J B009>0RY60?ME0D1I01000710
|
||||
000000004(0)0)0)7|000000004J0M8T|7MJ2*4I146>4$333$1~2N1U1P12130R0R10|62(01000720
|
||||
00000000008<0?2I4J0D964J048T0M8S8)CN4J9.8 +A1JMJ3*2L0510DI|):N0DBI4J8 +A01000730
|
||||
00000000001J # >9>0R0UKI2|#0|00000003000008T0 8E4A008S008E4)4/-V004E3M1I01000740
|
||||
000000008K|44A8 +A6!1J8|4A048&4A8K831J048E4A4J9B|68|4A4(0)004J8$0+8"MJ2*01000750
|
||||
000000001>"$ D2N1I2P0O1P0R/D3N1I?{FP=D2N6{BP7$ D3N1!0 @P/D3N1!0 6P=D3N1!01000760
|
||||
000000000 1P1"0R4:108Q4A4(8T0 8E4J9KY60|2I088"0+8]8E4A0YKI008"0+8]8E4A4J01000770
|
||||
000000009K048"0+8]8E4A4(00008T008E4A4J8 +A001J S009>0R088S|4JA0)0)0)|60+01001000
|
||||
00000000110?KI8B10118+4A044Y2I4J8C8 +AMJ2*8W104J8 +A001J >009>0R0038KI0)01001010
|
||||
000000001|00|8001|00K000(!8F318S4 8:001:ME0?2I4J0+96(!8F318S008]8:001:ME01001020
|
||||
000000000 2I<08F318S048]8:001:4E0-2I8F08118D8A1 2E0-AI5HJI0?8".!8F0!413101001030
|
||||
000000008S8E8A00ME888A0D2I0?8" B8E4A4J0?8]0Y8%MJ2B8W104(000009A DI|):N4+01001040
|
||||
000000002I8 +A001J8Q4A4J8 +A001J ]/29>0R008T+A008:001:ME04BI4J9<4J9K0+8]01001050
|
||||
00000000 S8:001:ME0?2I4J009O0+8] $8:001:ME0?2I4J049ODI|):N00ME0+8] <8:0001001060
|
||||
000000001:ME2:4+1I4J9$4(2|#0|000000030000FILE 0TAPE 0STOP 0-8{0?8]01001070
|
||||
000000008E4A0D8{+E+AMI8E4A4J8B1 8F3108H1118-+AMJ2B8W104J8-+A001J/<009>0R01001100
|
||||
00000000008T208E4A048T008E4A4J8 +A001J/B/B9>0R048S4)8N8D4A0-8F0D41118D4A01001110
|
||||
00000000008T008E4A4J8 +A001J ]009>0R8F08118T0?8]8E4A8F04118T048]8E4A8F8T01001120
|
||||
00000000008]8E4A4J8 +A001J B009>0R8K831J0Y8,8E4A4(0)0)0)1|<108001|0|000001001130
|
||||
00000000000040001|00|800009WKI|62(4A0D8{0000000000000000000000000000000001001140
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001001150
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001001160
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001001170
|
||||
00000000=000000#04*)H/}VY6044A4("000000:2*14"$"50R004J0O4J70100S0|JI000001000011
|
||||
TAPE = SYSTEM
|
||||
FILE = MCP/DISK
|
||||
STOP
|
||||
14M90+KI$|#0|00MM)290+JI"000000D4*342L05000V10JI18JI0)0)000S0QKI000W0HKI000,08KI000]=/1V082I08JI0417+E0M16+E[)|/EV+EBV+E}V+E?V*)*/}V000M16+E:)B/1VB),/4V4J1>50JI
|
||||
000000008YSI8D4A008T008E2900SI+A001J ]0008/I8F080?/I0?8]0+/I8F040 +A2(8]01000160
|
||||
000000000U+A2(8T0Y+A2(4A0!+A2(001J B009>0Q/I831J0Y8,8E4A0 /I0)0)0U/I080001000170
|
||||
000000001|0|0000000040001|00|8002B8W104(000009A 00000000000000000000000001000200
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000210
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000220
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000230
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000240
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000250
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000260
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000270
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000300
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000310
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000320
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000330
|
||||
00000000Q00000000000000000000000000000000000000000000000000000000000000001000340
|
||||
000000000000000000000000000000000000000000000000Q <0003WQ +0004DQ 50004M01000350
|
||||
00000000= 200082= 60005-= &0005+= ?0004R= C0004V= 800058= 60005S= F0005Y01000360
|
||||
00000000= :0006>= 70006[= N0006K= H00077= L0007~] B0000B90+A0D1J831J"!S)01000370
|
||||
00000000#/#V8-4A8-+A001J8|4A8K#O0)118M4A8O#O0)11831J]|S)#/#V8 4A400?AJ4J01000400
|
||||
000000009;041?KI000000+64J00@20)8$Z)3/5V@60)9>0R8$08118Q8A1!2E0DAI041+SI01000410
|
||||
00000000000K000000000Q008-+A041J8$Z)3/5V8?4A4J8>?O0)?$0)9>K)CN00ME282I0401000420
|
||||
000000008{+A?;0)|:8I001:ME8:088{+A088]8:001:ME4:0?8{+A?S0)8:001:ME4:1:1+01000430
|
||||
000000002I4J8>?W0)?,0)9>0R8$08118Q8A1!2E18AI005|1I4J049F4J8>?O0)009>0R0401000440
|
||||
000000003 KI0)0)0}"5|00000006Q000LABEL 0FILE000000K000000000Q008$8;008]01000450
|
||||
000000008:001:ME8$04118;048]8:001:ME4:1:0DBI8$8;0 ME0?2I4J08968$08118Q8A01000460
|
||||
00000000|02E0MAI4J8$04119F4J8>>20)009>0R4J9S0M8;04311YH104118+4A040DSI0)01000470
|
||||
000000000}"5|0004J8>}>0)009>0R4J9B8$04118Q8A8B2E0+AI4J8>}B0)009>0R8#1M2I01000500
|
||||
000000004J0?8"0H8%MJ}>D! TO DEFAULT ADDRESS=2*8W1!0~9}8#104J0?964J8U+A1001000510
|
||||
00000000MJ2*D510000?AJ0008AJ>8/I0}"5|000000K00000000BI004J041{4A1{0008M901000520
|
||||
00000000290?JI0)J)#N00ME0 1I1 0UMJ142*35102&JI0)0S1?JI0)0W1&JI0)0,1-JI0)01000530
|
||||
000000000]1!JI0)R|00PY204J8410MJ2*14+$!5!50R10D900000000000000000000000001000540
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001000550
|
||||
0000000000000000000000000000000000000000DISK FAILURE~000TAPE FAILURE~00001000560
|
||||
00000000NO MCP FILE~0000MCP FILE LOADED~NOT IN DIRCTORY~LOADER ON DISK~ 01000570
|
||||
00000000CRA FAILURE~ 00000000000000000MCP 0DISK 0SYSTEM 0000000001000600
|
||||
0000000000000000000000Y>Y#2:Y84AY@M94J92|84A|#Y61:4:|?4A|>K)CN004E0+BI|>01000610
|
||||
00000000N)8N1:08BI4JY#|@9#1:0&AI|#|44A|62(DISK~ 0000/#|44A4J8K|6009>0R8O01000620
|
||||
00000000831J8K831J+A8E4A4J8O|604=)|/1V009>0R0)8K4J8OMJ3*8I8>3$S$ /1N1K0R01000630
|
||||
000000000R3J100U2I|#0411|84A|#0D2E3H1I4J00964J?08KMJ2B8%104(0)0)1;413 0001000640
|
||||
0000000000040+SI4J8> F .9>L)#N08AI|60411|48AY62E0+AI4(0)0001|0000000600001000650
|
||||
000000000000Y6Q)@N004E082I042(Y6M)9N4-2IY63)DN0-BI041&KI4J8> K O9>0RY74J01000660
|
||||
0000000000Y# <9>8E8AM)9N004E3Y2I|#0411|88A0D2E0&AI2+KI0)0003|0000000600001000670
|
||||
000000000418KI0)Y74J00Y# O9>8E8AM)9N004E1|2I|#0411|88A0D2E0DAI4JY63)DN0Q01000700
|
||||
00000000ME0?2I0H0?KIY#9)?N96|62(000020004J08Y6418%001J B009>0RY60?ME0D1I01000710
|
||||
000000004(0)0)0)7|000000004J0M8T|7MJ2*4I146>4$333$1~2N1U1P12130R0R10|62(01000720
|
||||
00000000008<0?2I4J0D964J048T0M8S8)CN4J9.8 +A1JMJ3*2L0510DI|):N0DBI4J8 +A01000730
|
||||
00000000001J # >9>0R0UKI2|#0|00000003000008T0 8E4A008S008E4)4/-V004E3M1I01000740
|
||||
000000008K|44A8 +A6!1J8|4A048&4A8K831J048E4A4J9B|68|4A4(0)004J8$0+8"MJ2*01000750
|
||||
000000001>"$ D2N1I2P0O1P0R/D3N1I?{FP=D2N6{BP7$ D3N1!0 @P/D3N1!0 6P=D3N1!01000760
|
||||
000000000 1P1"0R4:108Q4A4(8T0 8E4J9KY60|2I088"0+8]8E4A0YKI008"0+8]8E4A4J01000770
|
||||
000000009K048"0+8]8E4A4(00008T008E4A4J8 +A001J S009>0R088S|4JA0)0)0)|60+01001000
|
||||
00000000110?KI8B10118+4A044Y2I4J8C8 +AMJ2*8W104J8 +A001J >009>0R0038KI0)01001010
|
||||
000000001|00|8001|00K000(!8F318S4 8:001:ME0?2I4J0+96(!8F318S008]8:001:ME01001020
|
||||
000000000 2I<08F318S048]8:001:4E0-2I8F08118D8A1 2E0-AI5HJI0?8".!8F0!413101001030
|
||||
000000008S8E8A00ME888A0D2I0?8" B8E4A4J0?8]0Y8%MJ2B8W104(000009A DI|):N4+01001040
|
||||
000000002I8 +A001J8Q4A4J8 +A001J ]/29>0R008T+A008:001:ME04BI4J9<4J9K0+8]01001050
|
||||
00000000 S8:001:ME0?2I4J009O0+8] $8:001:ME0?2I4J049ODI|):N00ME0+8] <8:0001001060
|
||||
000000001:ME2:4+1I4J9$4(2|#0|000000030000FILE 0TAPE 0STOP 0-8{0?8]01001070
|
||||
000000008E4A0D8{+E+AMI8E4A4J8B1 8F3108H1118-+AMJ2B8W104J8-+A001J/<009>0R01001100
|
||||
00000000008T208E4A048T008E4A4J8 +A001J/B/B9>0R048S4)8N8D4A0-8F0D41118D4A01001110
|
||||
00000000008T008E4A4J8 +A001J ]009>0R8F08118T0?8]8E4A8F04118T048]8E4A8F8T01001120
|
||||
00000000008]8E4A4J8 +A001J B009>0R8K831J0Y8,8E4A4(0)0)0)1|<108001|0|000001001130
|
||||
00000000000040001|00|800009WKI|62(4A0D8{0000000000000000000000000000000001001140
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001001150
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001001160
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000001001170
|
||||
00000000=000000#04*)H/}VY6044A4("000000:2*14"$"50R004J0O4J70100S0|JI000001000011
|
||||
TAPE = SYSTEM
|
||||
FILE = MCP/DISK
|
||||
STOP
|
||||
|
||||
@@ -1,290 +1,290 @@
|
||||
/*
|
||||
* ComposeJS, object composition for JavaScript, featuring
|
||||
* JavaScript-style prototype inheritance and composition, multiple inheritance,
|
||||
* mixin and traits-inspired conflict resolution and composition
|
||||
*/
|
||||
(function(define){
|
||||
"use strict";
|
||||
define([], function(){
|
||||
// function for creating instances from a prototype
|
||||
function Create(){
|
||||
}
|
||||
var delegate = Object.create ?
|
||||
function(proto){
|
||||
return Object.create(typeof proto == "function" ? proto.prototype : proto || Object.prototype);
|
||||
} :
|
||||
function(proto){
|
||||
Create.prototype = typeof proto == "function" ? proto.prototype : proto;
|
||||
var instance = new Create();
|
||||
Create.prototype = null;
|
||||
return instance;
|
||||
};
|
||||
function validArg(arg){
|
||||
if(!arg){
|
||||
throw new Error("Compose arguments must be functions or objects");
|
||||
}
|
||||
return arg;
|
||||
}
|
||||
// this does the work of combining mixins/prototypes
|
||||
function mixin(instance, args, i){
|
||||
// use prototype inheritance for first arg
|
||||
var value, argsLength = args.length;
|
||||
for(; i < argsLength; i++){
|
||||
var arg = args[i];
|
||||
if(typeof arg == "function"){
|
||||
// the arg is a function, use the prototype for the properties
|
||||
var prototype = arg.prototype;
|
||||
for(var key in prototype){
|
||||
value = prototype[key];
|
||||
var own = prototype.hasOwnProperty(key);
|
||||
if(typeof value == "function" && key in instance && value !== instance[key]){
|
||||
var existing = instance[key];
|
||||
if(value == required){
|
||||
// it is a required value, and we have satisfied it
|
||||
value = existing;
|
||||
}
|
||||
else if(!own){
|
||||
// if it is own property, it is considered an explicit override
|
||||
// TODO: make faster calls on this, perhaps passing indices and caching
|
||||
if(isInMethodChain(value, key, getBases([].slice.call(args, 0, i), true))){
|
||||
// this value is in the existing method's override chain, we can use the existing method
|
||||
value = existing;
|
||||
}else if(!isInMethodChain(existing, key, getBases([arg], true))){
|
||||
// the existing method is not in the current override chain, so we are left with a conflict
|
||||
console.error("Conflicted method " + key + ", final composer must explicitly override with correct method.");
|
||||
}
|
||||
}
|
||||
}
|
||||
if(value && value.install && own && !isInMethodChain(existing, key, getBases([arg], true))){
|
||||
// apply modifier
|
||||
value.install.call(instance, key);
|
||||
}else{
|
||||
instance[key] = value;
|
||||
}
|
||||
}
|
||||
}else{
|
||||
// it is an object, copy properties, looking for modifiers
|
||||
for(var key in validArg(arg)){
|
||||
var value = arg[key];
|
||||
if(typeof value == "function"){
|
||||
if(value.install){
|
||||
// apply modifier
|
||||
value.install.call(instance, key);
|
||||
continue;
|
||||
}
|
||||
if(key in instance){
|
||||
if(value == required){
|
||||
// required requirement met
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
// add it to the instance
|
||||
instance[key] = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
return instance;
|
||||
}
|
||||
// allow for override (by es5 module)
|
||||
Compose._setMixin = function(newMixin){
|
||||
mixin = newMixin;
|
||||
};
|
||||
function isInMethodChain(method, name, prototypes){
|
||||
// searches for a method in the given prototype hierarchy
|
||||
for(var i = 0; i < prototypes.length;i++){
|
||||
var prototype = prototypes[i];
|
||||
if(prototype[name] == method){
|
||||
// found it
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
// Decorator branding
|
||||
function Decorator(install, direct){
|
||||
function Decorator(){
|
||||
if(direct){
|
||||
return direct.apply(this, arguments);
|
||||
}
|
||||
throw new Error("Decorator not applied");
|
||||
}
|
||||
Decorator.install = install;
|
||||
return Decorator;
|
||||
}
|
||||
Compose.Decorator = Decorator;
|
||||
// aspect applier
|
||||
function aspect(handler){
|
||||
return function(advice){
|
||||
return Decorator(function install(key){
|
||||
var baseMethod = this[key];
|
||||
(advice = this[key] = baseMethod ? handler(this, baseMethod, advice) : advice).install = install;
|
||||
}, advice);
|
||||
};
|
||||
};
|
||||
// around advice, useful for calling super methods too
|
||||
Compose.around = aspect(function(target, base, advice){
|
||||
return advice.call(target, base);
|
||||
});
|
||||
Compose.before = aspect(function(target, base, advice){
|
||||
return function(){
|
||||
var results = advice.apply(this, arguments);
|
||||
if(results !== stop){
|
||||
return base.apply(this, results || arguments);
|
||||
}
|
||||
};
|
||||
});
|
||||
var stop = Compose.stop = {};
|
||||
var undefined;
|
||||
Compose.after = aspect(function(target, base, advice){
|
||||
return function(){
|
||||
var results = base.apply(this, arguments);
|
||||
var adviceResults = advice.apply(this, arguments);
|
||||
return adviceResults === undefined ? results : adviceResults;
|
||||
};
|
||||
});
|
||||
|
||||
// rename Decorator for calling super methods
|
||||
Compose.from = function(trait, fromKey){
|
||||
if(fromKey){
|
||||
return (typeof trait == "function" ? trait.prototype : trait)[fromKey];
|
||||
}
|
||||
return Decorator(function(key){
|
||||
if(!(this[key] = (typeof trait == "string" ? this[trait] :
|
||||
(typeof trait == "function" ? trait.prototype : trait)[fromKey || key]))){
|
||||
throw new Error("Source method " + fromKey + " was not available to be renamed to " + key);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
// Composes an instance
|
||||
Compose.create = function(base){
|
||||
// create the instance
|
||||
var instance = mixin(delegate(base), arguments, 1);
|
||||
var argsLength = arguments.length;
|
||||
// for go through the arguments and call the constructors (with no args)
|
||||
for(var i = 0; i < argsLength; i++){
|
||||
var arg = arguments[i];
|
||||
if(typeof arg == "function"){
|
||||
instance = arg.call(instance) || instance;
|
||||
}
|
||||
}
|
||||
return instance;
|
||||
}
|
||||
// The required function, just throws an error if not overriden
|
||||
function required(){
|
||||
throw new Error("This method is required and no implementation has been provided");
|
||||
};
|
||||
Compose.required = required;
|
||||
// get the value of |this| for direct function calls for this mode (strict in ES5)
|
||||
|
||||
function extend(){
|
||||
var args = [this];
|
||||
args.push.apply(args, arguments);
|
||||
return Compose.apply(0, args);
|
||||
}
|
||||
// Compose a constructor
|
||||
function Compose(base){
|
||||
var args = arguments;
|
||||
var prototype = (args.length < 2 && typeof args[0] != "function") ?
|
||||
args[0] : // if there is just a single argument object, just use that as the prototype
|
||||
mixin(delegate(validArg(base)), args, 1); // normally create a delegate to start with
|
||||
function Constructor(){
|
||||
var instance;
|
||||
if(this instanceof Constructor){
|
||||
// called with new operator, can proceed as is
|
||||
instance = this;
|
||||
}else{
|
||||
// we allow for direct calls without a new operator, in this case we need to
|
||||
// create the instance ourself.
|
||||
Create.prototype = prototype;
|
||||
instance = new Create();
|
||||
}
|
||||
// call all the constructors with the given arguments
|
||||
for(var i = 0; i < constructorsLength; i++){
|
||||
var constructor = constructors[i];
|
||||
var result = constructor.apply(instance, arguments);
|
||||
if(typeof result == "object"){
|
||||
if(result instanceof Constructor){
|
||||
instance = result;
|
||||
}else{
|
||||
for(var j in result){
|
||||
if(result.hasOwnProperty(j)){
|
||||
instance[j] = result[j];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return instance;
|
||||
}
|
||||
// create a function that can retrieve the bases (constructors or prototypes)
|
||||
Constructor._getBases = function(prototype){
|
||||
return prototype ? prototypes : constructors;
|
||||
};
|
||||
// now get the prototypes and the constructors
|
||||
var constructors = getBases(args),
|
||||
constructorsLength = constructors.length;
|
||||
if(typeof args[args.length - 1] == "object"){
|
||||
args[args.length - 1] = prototype;
|
||||
}
|
||||
var prototypes = getBases(args, true);
|
||||
Constructor.extend = extend;
|
||||
if(!Compose.secure){
|
||||
prototype.constructor = Constructor;
|
||||
}
|
||||
Constructor.prototype = prototype;
|
||||
return Constructor;
|
||||
};
|
||||
|
||||
Compose.apply = function(thisObject, args){
|
||||
// apply to the target
|
||||
return thisObject ?
|
||||
mixin(thisObject, args, 0) : // called with a target object, apply the supplied arguments as mixins to the target object
|
||||
extend.apply.call(Compose, 0, args); // get the Function.prototype apply function, call() it to apply arguments to Compose (the extend doesn't matter, just a handle way to grab apply, since we can't get it off of Compose)
|
||||
};
|
||||
Compose.call = function(thisObject){
|
||||
// call() should correspond with apply behavior
|
||||
return mixin(thisObject, arguments, 1);
|
||||
};
|
||||
|
||||
function getBases(args, prototype){
|
||||
// this function registers a set of constructors for a class, eliminating duplicate
|
||||
// constructors that may result from diamond construction for classes (B->A, C->A, D->B&C, then D() should only call A() once)
|
||||
var bases = [];
|
||||
function iterate(args, checkChildren){
|
||||
outer:
|
||||
for(var i = 0; i < args.length; i++){
|
||||
var arg = args[i];
|
||||
var target = prototype && typeof arg == "function" ?
|
||||
arg.prototype : arg;
|
||||
if(prototype || typeof arg == "function"){
|
||||
var argGetBases = checkChildren && arg._getBases;
|
||||
if(argGetBases){
|
||||
iterate(argGetBases(prototype)); // don't need to check children for these, this should be pre-flattened
|
||||
}else{
|
||||
for(var j = 0; j < bases.length; j++){
|
||||
if(target == bases[j]){
|
||||
continue outer;
|
||||
}
|
||||
}
|
||||
bases.push(target);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
iterate(args, true);
|
||||
return bases;
|
||||
}
|
||||
// returning the export of the module
|
||||
return Compose;
|
||||
});
|
||||
})(typeof define != "undefined" ?
|
||||
define: // AMD/RequireJS format if available
|
||||
function(deps, factory){
|
||||
if(typeof module !="undefined"){
|
||||
module.exports = factory(); // CommonJS environment, like NodeJS
|
||||
// require("./configure");
|
||||
}else{
|
||||
Compose = factory(); // raw script, assign to Compose global
|
||||
}
|
||||
});
|
||||
/*
|
||||
* ComposeJS, object composition for JavaScript, featuring
|
||||
* JavaScript-style prototype inheritance and composition, multiple inheritance,
|
||||
* mixin and traits-inspired conflict resolution and composition
|
||||
*/
|
||||
(function(define){
|
||||
"use strict";
|
||||
define([], function(){
|
||||
// function for creating instances from a prototype
|
||||
function Create(){
|
||||
}
|
||||
var delegate = Object.create ?
|
||||
function(proto){
|
||||
return Object.create(typeof proto == "function" ? proto.prototype : proto || Object.prototype);
|
||||
} :
|
||||
function(proto){
|
||||
Create.prototype = typeof proto == "function" ? proto.prototype : proto;
|
||||
var instance = new Create();
|
||||
Create.prototype = null;
|
||||
return instance;
|
||||
};
|
||||
function validArg(arg){
|
||||
if(!arg){
|
||||
throw new Error("Compose arguments must be functions or objects");
|
||||
}
|
||||
return arg;
|
||||
}
|
||||
// this does the work of combining mixins/prototypes
|
||||
function mixin(instance, args, i){
|
||||
// use prototype inheritance for first arg
|
||||
var value, argsLength = args.length;
|
||||
for(; i < argsLength; i++){
|
||||
var arg = args[i];
|
||||
if(typeof arg == "function"){
|
||||
// the arg is a function, use the prototype for the properties
|
||||
var prototype = arg.prototype;
|
||||
for(var key in prototype){
|
||||
value = prototype[key];
|
||||
var own = prototype.hasOwnProperty(key);
|
||||
if(typeof value == "function" && key in instance && value !== instance[key]){
|
||||
var existing = instance[key];
|
||||
if(value == required){
|
||||
// it is a required value, and we have satisfied it
|
||||
value = existing;
|
||||
}
|
||||
else if(!own){
|
||||
// if it is own property, it is considered an explicit override
|
||||
// TODO: make faster calls on this, perhaps passing indices and caching
|
||||
if(isInMethodChain(value, key, getBases([].slice.call(args, 0, i), true))){
|
||||
// this value is in the existing method's override chain, we can use the existing method
|
||||
value = existing;
|
||||
}else if(!isInMethodChain(existing, key, getBases([arg], true))){
|
||||
// the existing method is not in the current override chain, so we are left with a conflict
|
||||
console.error("Conflicted method " + key + ", final composer must explicitly override with correct method.");
|
||||
}
|
||||
}
|
||||
}
|
||||
if(value && value.install && own && !isInMethodChain(existing, key, getBases([arg], true))){
|
||||
// apply modifier
|
||||
value.install.call(instance, key);
|
||||
}else{
|
||||
instance[key] = value;
|
||||
}
|
||||
}
|
||||
}else{
|
||||
// it is an object, copy properties, looking for modifiers
|
||||
for(var key in validArg(arg)){
|
||||
var value = arg[key];
|
||||
if(typeof value == "function"){
|
||||
if(value.install){
|
||||
// apply modifier
|
||||
value.install.call(instance, key);
|
||||
continue;
|
||||
}
|
||||
if(key in instance){
|
||||
if(value == required){
|
||||
// required requirement met
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
// add it to the instance
|
||||
instance[key] = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
return instance;
|
||||
}
|
||||
// allow for override (by es5 module)
|
||||
Compose._setMixin = function(newMixin){
|
||||
mixin = newMixin;
|
||||
};
|
||||
function isInMethodChain(method, name, prototypes){
|
||||
// searches for a method in the given prototype hierarchy
|
||||
for(var i = 0; i < prototypes.length;i++){
|
||||
var prototype = prototypes[i];
|
||||
if(prototype[name] == method){
|
||||
// found it
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
// Decorator branding
|
||||
function Decorator(install, direct){
|
||||
function Decorator(){
|
||||
if(direct){
|
||||
return direct.apply(this, arguments);
|
||||
}
|
||||
throw new Error("Decorator not applied");
|
||||
}
|
||||
Decorator.install = install;
|
||||
return Decorator;
|
||||
}
|
||||
Compose.Decorator = Decorator;
|
||||
// aspect applier
|
||||
function aspect(handler){
|
||||
return function(advice){
|
||||
return Decorator(function install(key){
|
||||
var baseMethod = this[key];
|
||||
(advice = this[key] = baseMethod ? handler(this, baseMethod, advice) : advice).install = install;
|
||||
}, advice);
|
||||
};
|
||||
};
|
||||
// around advice, useful for calling super methods too
|
||||
Compose.around = aspect(function(target, base, advice){
|
||||
return advice.call(target, base);
|
||||
});
|
||||
Compose.before = aspect(function(target, base, advice){
|
||||
return function(){
|
||||
var results = advice.apply(this, arguments);
|
||||
if(results !== stop){
|
||||
return base.apply(this, results || arguments);
|
||||
}
|
||||
};
|
||||
});
|
||||
var stop = Compose.stop = {};
|
||||
var undefined;
|
||||
Compose.after = aspect(function(target, base, advice){
|
||||
return function(){
|
||||
var results = base.apply(this, arguments);
|
||||
var adviceResults = advice.apply(this, arguments);
|
||||
return adviceResults === undefined ? results : adviceResults;
|
||||
};
|
||||
});
|
||||
|
||||
// rename Decorator for calling super methods
|
||||
Compose.from = function(trait, fromKey){
|
||||
if(fromKey){
|
||||
return (typeof trait == "function" ? trait.prototype : trait)[fromKey];
|
||||
}
|
||||
return Decorator(function(key){
|
||||
if(!(this[key] = (typeof trait == "string" ? this[trait] :
|
||||
(typeof trait == "function" ? trait.prototype : trait)[fromKey || key]))){
|
||||
throw new Error("Source method " + fromKey + " was not available to be renamed to " + key);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
// Composes an instance
|
||||
Compose.create = function(base){
|
||||
// create the instance
|
||||
var instance = mixin(delegate(base), arguments, 1);
|
||||
var argsLength = arguments.length;
|
||||
// for go through the arguments and call the constructors (with no args)
|
||||
for(var i = 0; i < argsLength; i++){
|
||||
var arg = arguments[i];
|
||||
if(typeof arg == "function"){
|
||||
instance = arg.call(instance) || instance;
|
||||
}
|
||||
}
|
||||
return instance;
|
||||
}
|
||||
// The required function, just throws an error if not overriden
|
||||
function required(){
|
||||
throw new Error("This method is required and no implementation has been provided");
|
||||
};
|
||||
Compose.required = required;
|
||||
// get the value of |this| for direct function calls for this mode (strict in ES5)
|
||||
|
||||
function extend(){
|
||||
var args = [this];
|
||||
args.push.apply(args, arguments);
|
||||
return Compose.apply(0, args);
|
||||
}
|
||||
// Compose a constructor
|
||||
function Compose(base){
|
||||
var args = arguments;
|
||||
var prototype = (args.length < 2 && typeof args[0] != "function") ?
|
||||
args[0] : // if there is just a single argument object, just use that as the prototype
|
||||
mixin(delegate(validArg(base)), args, 1); // normally create a delegate to start with
|
||||
function Constructor(){
|
||||
var instance;
|
||||
if(this instanceof Constructor){
|
||||
// called with new operator, can proceed as is
|
||||
instance = this;
|
||||
}else{
|
||||
// we allow for direct calls without a new operator, in this case we need to
|
||||
// create the instance ourself.
|
||||
Create.prototype = prototype;
|
||||
instance = new Create();
|
||||
}
|
||||
// call all the constructors with the given arguments
|
||||
for(var i = 0; i < constructorsLength; i++){
|
||||
var constructor = constructors[i];
|
||||
var result = constructor.apply(instance, arguments);
|
||||
if(typeof result == "object"){
|
||||
if(result instanceof Constructor){
|
||||
instance = result;
|
||||
}else{
|
||||
for(var j in result){
|
||||
if(result.hasOwnProperty(j)){
|
||||
instance[j] = result[j];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return instance;
|
||||
}
|
||||
// create a function that can retrieve the bases (constructors or prototypes)
|
||||
Constructor._getBases = function(prototype){
|
||||
return prototype ? prototypes : constructors;
|
||||
};
|
||||
// now get the prototypes and the constructors
|
||||
var constructors = getBases(args),
|
||||
constructorsLength = constructors.length;
|
||||
if(typeof args[args.length - 1] == "object"){
|
||||
args[args.length - 1] = prototype;
|
||||
}
|
||||
var prototypes = getBases(args, true);
|
||||
Constructor.extend = extend;
|
||||
if(!Compose.secure){
|
||||
prototype.constructor = Constructor;
|
||||
}
|
||||
Constructor.prototype = prototype;
|
||||
return Constructor;
|
||||
};
|
||||
|
||||
Compose.apply = function(thisObject, args){
|
||||
// apply to the target
|
||||
return thisObject ?
|
||||
mixin(thisObject, args, 0) : // called with a target object, apply the supplied arguments as mixins to the target object
|
||||
extend.apply.call(Compose, 0, args); // get the Function.prototype apply function, call() it to apply arguments to Compose (the extend doesn't matter, just a handle way to grab apply, since we can't get it off of Compose)
|
||||
};
|
||||
Compose.call = function(thisObject){
|
||||
// call() should correspond with apply behavior
|
||||
return mixin(thisObject, arguments, 1);
|
||||
};
|
||||
|
||||
function getBases(args, prototype){
|
||||
// this function registers a set of constructors for a class, eliminating duplicate
|
||||
// constructors that may result from diamond construction for classes (B->A, C->A, D->B&C, then D() should only call A() once)
|
||||
var bases = [];
|
||||
function iterate(args, checkChildren){
|
||||
outer:
|
||||
for(var i = 0; i < args.length; i++){
|
||||
var arg = args[i];
|
||||
var target = prototype && typeof arg == "function" ?
|
||||
arg.prototype : arg;
|
||||
if(prototype || typeof arg == "function"){
|
||||
var argGetBases = checkChildren && arg._getBases;
|
||||
if(argGetBases){
|
||||
iterate(argGetBases(prototype)); // don't need to check children for these, this should be pre-flattened
|
||||
}else{
|
||||
for(var j = 0; j < bases.length; j++){
|
||||
if(target == bases[j]){
|
||||
continue outer;
|
||||
}
|
||||
}
|
||||
bases.push(target);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
iterate(args, true);
|
||||
return bases;
|
||||
}
|
||||
// returning the export of the module
|
||||
return Compose;
|
||||
});
|
||||
})(typeof define != "undefined" ?
|
||||
define: // AMD/RequireJS format if available
|
||||
function(deps, factory){
|
||||
if(typeof module !="undefined"){
|
||||
module.exports = factory(); // CommonJS environment, like NodeJS
|
||||
// require("./configure");
|
||||
}else{
|
||||
Compose = factory(); // raw script, assign to Compose global
|
||||
}
|
||||
});
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# list words in a file with a uniqness count to identify typing mistakes.
|
||||
# Usage: ./uniquewordcount MyFile | more
|
||||
# ./uniquewordcount < MyFile > UniqueWordsWithCount
|
||||
#
|
||||
(echo "$1"; cat) | tr -cs "[:alpha:]" "\n" | sort | uniq -c
|
||||
#!/bin/bash
|
||||
#
|
||||
# list words in a file with a uniqness count to identify typing mistakes.
|
||||
# Usage: ./uniquewordcount MyFile | more
|
||||
# ./uniquewordcount < MyFile > UniqueWordsWithCount
|
||||
#
|
||||
(echo "$1"; cat) | tr -cs "[:alpha:]" "\n" | sort | uniq -c
|
||||
|
||||
@@ -32,14 +32,14 @@ function B5500CardPunch(mnemonic, unitIndex, designate, statusChange, signal, op
|
||||
this.clear();
|
||||
|
||||
this.doc = null;
|
||||
this.window = null;
|
||||
this.stacker1 = null;
|
||||
this.endOfStacker1 = null;
|
||||
this.stacker2 = null;
|
||||
this.endOfStacker2 = null;
|
||||
this.window = window.open("../webUI/B5500CardPunch.html", mnemonic,
|
||||
"location=no,scrollbars=no,resizable,width=560,height=204,left=0,top=220");
|
||||
this.window.addEventListener("load",
|
||||
B5500CentralControl.bindMethod(this, B5500CardPunch.prototype.punchOnload), false);
|
||||
B5500Util.openPopup(window, "../webUI/B5500CardPunch.html", mnemonic,
|
||||
"location=no,scrollbars=no,resizable,width=560,height=204,left=0,top=220",
|
||||
this, B5500CardPunch.prototype.punchOnload);
|
||||
}
|
||||
|
||||
B5500CardPunch.prototype.cardsPerMinute = 300; // Punch speed
|
||||
@@ -84,15 +84,15 @@ B5500CardPunch.prototype.copyStacker = function copyStacker(ev) {
|
||||
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;
|
||||
B5500Util.openPopup(window, "./B5500FramePaper.html", "",
|
||||
"scrollbars,resizable,width=500,height=500",
|
||||
this, function(ev) {
|
||||
var doc = ev.target;
|
||||
var win = doc.defaultView;
|
||||
|
||||
doc = win.document;
|
||||
doc.title = title;
|
||||
win.moveTo((screen.availWidth-win.outerWidth)/2, (screen.availHeight-win.outerHeight)/2);
|
||||
doc.getElementById("Paper").textContent = text;
|
||||
});
|
||||
|
||||
@@ -107,27 +107,27 @@ B5500CardPunch.prototype.setPunchReady = function setPunchReady(ready) {
|
||||
|
||||
if (ready && !this.ready) {
|
||||
this.statusChange(1);
|
||||
B5500Util.addClass(this.$$("CPStartBtn"), "greenLit")
|
||||
B5500Util.removeClass(this.$$("CPNotReadyLight"), "whiteLit");
|
||||
this.$$("CPStartBtn").classList.add("greenLit")
|
||||
this.$$("CPNotReadyLight").classList.remove("whiteLit");
|
||||
this.ready = true;
|
||||
if (this.runoutArmed) {
|
||||
if (this.stacker1Count || this.stacker2Count) {
|
||||
if (this.window.confirm("Empty both " + this.mnemonic + " stackers?")) {
|
||||
this.stacker1Count = this.stacker2Count = 0;
|
||||
this.$$("CPStacker1Bar").value = 0;
|
||||
B5500Util.removeClass(this.$$("CPStacker1Full"), "annunciatorLit");
|
||||
this.emptyStacker(stacker1);
|
||||
this.$$("CPStacker1Full").classList.remove("annunciatorLit");
|
||||
this.emptyStacker(this.stacker1);
|
||||
this.$$("CPStacker2Bar").value = 0;
|
||||
B5500Util.removeClass(this.$$("CPStacker2Full"), "annunciatorLit");
|
||||
this.emptyStacker(stacker2);
|
||||
this.$$("CPStacker2Full").classList.remove("annunciatorLit");
|
||||
this.emptyStacker(this.stacker2);
|
||||
}
|
||||
}
|
||||
this.armRunout(false);
|
||||
}
|
||||
} else if (!ready && this.ready) {
|
||||
this.statusChange(0);
|
||||
B5500Util.removeClass(this.$$("CPStartBtn"), "greenLit")
|
||||
B5500Util.addClass(this.$$("CPNotReadyLight"), "whiteLit");
|
||||
this.$$("CPStartBtn").classList.remove("greenLit")
|
||||
this.$$("CPNotReadyLight").classList.add("whiteLit");
|
||||
this.ready = false;
|
||||
}
|
||||
};
|
||||
@@ -165,10 +165,10 @@ B5500CardPunch.prototype.armRunout = function armRunout(armed) {
|
||||
an empty input stacker */
|
||||
|
||||
if (armed && !this.ready) {
|
||||
B5500Util.addClass(this.$$("CPRunoutBtn"), "redLit");
|
||||
this.$$("CPRunoutBtn").classList.add("redLit");
|
||||
this.runoutArmed = true;
|
||||
} else {
|
||||
B5500Util.removeClass(this.$$("CPRunoutBtn"), "redLit");
|
||||
this.$$("CPRunoutBtn").classList.remove("redLit");
|
||||
this.runoutArmed = false;
|
||||
}
|
||||
};
|
||||
@@ -218,11 +218,12 @@ B5500CardPunch.prototype.beforeUnload = function beforeUnload(ev) {
|
||||
};
|
||||
|
||||
/**************************************/
|
||||
B5500CardPunch.prototype.punchOnload = function punchOnload() {
|
||||
B5500CardPunch.prototype.punchOnload = function punchOnload(ev) {
|
||||
/* Initializes the punch window and user interface */
|
||||
var de;
|
||||
|
||||
this.doc = this.window.document;
|
||||
this.doc = ev.target;
|
||||
this.window = this.doc.defaultView;
|
||||
de = this.doc.documentElement;
|
||||
this.doc.title = "retro-B5500 Card Punch " + this.mnemonic;
|
||||
|
||||
@@ -241,17 +242,17 @@ B5500CardPunch.prototype.punchOnload = function punchOnload() {
|
||||
this.window.addEventListener("beforeunload",
|
||||
B5500CardPunch.prototype.beforeUnload, false);
|
||||
this.stacker1.addEventListener("dblclick",
|
||||
B5500CentralControl.bindMethod(this, B5500CardPunch.prototype.copyStacker));
|
||||
B5500CardPunch.prototype.copyStacker.bind(this));
|
||||
this.stacker2.addEventListener("dblclick",
|
||||
B5500CentralControl.bindMethod(this, B5500CardPunch.prototype.copyStacker));
|
||||
B5500CardPunch.prototype.copyStacker.bind(this));
|
||||
this.$$("CPStartBtn").addEventListener("click",
|
||||
B5500CentralControl.bindMethod(this, B5500CardPunch.prototype.CPStartBtn_onclick), false);
|
||||
B5500CardPunch.prototype.CPStartBtn_onclick.bind(this), false);
|
||||
this.$$("CPStopBtn").addEventListener("click",
|
||||
B5500CentralControl.bindMethod(this, B5500CardPunch.prototype.CPStopBtn_onclick), false);
|
||||
B5500CardPunch.prototype.CPStopBtn_onclick.bind(this), false);
|
||||
this.$$("CPRunoutBtn").addEventListener("click",
|
||||
B5500CentralControl.bindMethod(this, B5500CardPunch.prototype.CPRunoutBtn_onclick), false);
|
||||
B5500CardPunch.prototype.CPRunoutBtn_onclick.bind(this), false);
|
||||
this.$$("CPAlgolGlyphsCheck").addEventListener("click",
|
||||
B5500CentralControl.bindMethod(this, B5500CardPunch.prototype.CPAlgolGlyphsCheck_onclick), false);
|
||||
B5500CardPunch.prototype.CPAlgolGlyphsCheck_onclick.bind(this), false);
|
||||
this.$$("CPStacker1Bar").max = this.maxScrollLines;
|
||||
this.$$("CPStacker2Bar").max = this.maxScrollLines;
|
||||
|
||||
@@ -290,7 +291,7 @@ B5500CardPunch.prototype.write = function write(finish, buffer, length, mode, co
|
||||
this.endOfStacker2.scrollIntoView();
|
||||
this.$$("CPStacker2Bar").value = (++this.stacker2Count);
|
||||
if (this.stacker2Count >= this.maxScrollLines) {
|
||||
B5500Util.addClass(this.$$("CPStacker2Full"), "annunciatorLit");
|
||||
this.$$("CPStacker2Full").classList.add("annunciatorLit");
|
||||
this.setPunchReady(false);
|
||||
}
|
||||
} else {
|
||||
@@ -298,7 +299,7 @@ B5500CardPunch.prototype.write = function write(finish, buffer, length, mode, co
|
||||
this.endOfStacker1.scrollIntoView();
|
||||
this.$$("CPStacker1Bar").value = (++this.stacker1Count);
|
||||
if (this.stacker1Count >= this.maxScrollLines) {
|
||||
B5500Util.addClass(this.$$("CPStacker1Full"), "annunciatorLit");
|
||||
this.$$("CPStacker1Full").classList.add("annunciatorLit");
|
||||
this.setPunchReady(false);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,11 +32,11 @@ function B5500CardReader(mnemonic, unitIndex, designate, statusChange, signal, o
|
||||
this.clear();
|
||||
|
||||
this.doc = null;
|
||||
this.window = null;
|
||||
this.keyinWindow = null;
|
||||
this.window = window.open("../webUI/B5500CardReader.html", mnemonic,
|
||||
"location=no,scrollbars=no,resizable,width=560,height=160,left=0,top="+x);
|
||||
this.window.addEventListener("load",
|
||||
B5500CentralControl.bindMethod(this, B5500CardReader.prototype.readerOnload), false);
|
||||
B5500Util.openPopup(window, "../webUI/B5500CardReader.html", mnemonic,
|
||||
"location=no,scrollbars=no,resizable,width=560,height=160,left=0,top="+x,
|
||||
this, B5500CardReader.prototype.readerOnload);
|
||||
|
||||
this.hopperBar = null;
|
||||
this.outHopperFrame = null;
|
||||
@@ -116,16 +116,16 @@ B5500CardReader.prototype.setReaderReady = function setReaderReady(ready) {
|
||||
this.ready = ready;
|
||||
if (ready) {
|
||||
this.statusChange(1);
|
||||
B5500Util.addClass(this.$$("CRStartBtn"), "greenLit")
|
||||
B5500Util.removeClass(this.$$("CRNotReadyLight"), "whiteLit");
|
||||
this.$$("CRStartBtn").classList.add("greenLit")
|
||||
this.$$("CRNotReadyLight").classList.remove("whiteLit");
|
||||
this.$$("CRKeyinDeckBtn").disabled = true;
|
||||
B5500Util.removeClass(this.$$("CRKeyinDeckBtn"), "whiteLit");
|
||||
this.$$("CRKeyinDeckBtn").classList.remove("whiteLit");
|
||||
} else {
|
||||
this.statusChange(0);
|
||||
B5500Util.removeClass(this.$$("CRStartBtn"), "greenLit")
|
||||
B5500Util.addClass(this.$$("CRNotReadyLight"), "whiteLit");
|
||||
this.$$("CRStartBtn").classList.remove("greenLit")
|
||||
this.$$("CRNotReadyLight").classList.add("whiteLit");
|
||||
this.$$("CRKeyinDeckBtn").disabled = false;
|
||||
B5500Util.addClass(this.$$("CRKeyinDeckBtn"), "whiteLit");
|
||||
this.$$("CRKeyinDeckBtn").classList.add("whiteLit");
|
||||
}
|
||||
};
|
||||
|
||||
@@ -136,9 +136,9 @@ B5500CardReader.prototype.armEOF = function armEOF(armed) {
|
||||
|
||||
this.eofArmed = armed;
|
||||
if (armed) {
|
||||
B5500Util.addClass(this.$$("CREOFBtn"), "whiteLit");
|
||||
this.$$("CREOFBtn").classList.add("whiteLit");
|
||||
} else {
|
||||
B5500Util.removeClass(this.$$("CREOFBtn"), "whiteLit");
|
||||
this.$$("CREOFBtn").classList.remove("whiteLit");
|
||||
}
|
||||
};
|
||||
|
||||
@@ -179,9 +179,7 @@ B5500CardReader.prototype.CRKeyinDeckBtn_onClick = function CRKeyinDeckBtn_onCli
|
||||
var $$$ = null; // getElementById shortcut for keyin window
|
||||
var doc = null; // loader window.document
|
||||
var keyinText = null; // keyin text area
|
||||
var win = this.window.open("B5500CardReaderKeyin.html", this.mnemonic + "Keyin",
|
||||
"location=no,scrollbars=no,resizable,width=640,height=240,left=" +
|
||||
(this.window.screenX+32) +",top=" + (this.window.screenY+32));
|
||||
var win = null;
|
||||
|
||||
function keyinCancelDeck(ev) {
|
||||
/* Handler for the Cancel button on the deck keyin window -- closes it */
|
||||
@@ -217,8 +215,13 @@ B5500CardReader.prototype.CRKeyinDeckBtn_onClick = function CRKeyinDeckBtn_onCli
|
||||
/* On-load handler for the deck keyin window */
|
||||
var de;
|
||||
|
||||
doc = win.document;
|
||||
doc = ev.target;
|
||||
win = doc.defaultView;
|
||||
this.keyinWindow = win;
|
||||
de = doc.documentElement;
|
||||
this.$$("CRStartBtn").disabled = true;
|
||||
this.$$("CRKeyinDeckBtn").disabled = true;
|
||||
this.$$("CRKeyinDeckBtn").classList.remove("whiteLit");
|
||||
$$$ = function $$$(id) {
|
||||
return doc.getElementById(id);
|
||||
};
|
||||
@@ -246,14 +249,13 @@ B5500CardReader.prototype.CRKeyinDeckBtn_onClick = function CRKeyinDeckBtn_onCli
|
||||
$$$("CRKeyinEndCardBtn").removeEventListener("click", keyinInsertDeck, false);
|
||||
$$$("CRKeyinInsertBtn").removeEventListener("click", keyinInsertDeck, false);
|
||||
$$$("CRKeyinCancelBtn").removeEventListener("click", keyinCancelDeck, false);
|
||||
win.removeEventListener("load", keyinOnload, false);
|
||||
win.removeEventListener("unload", keyinOnUnload, false);
|
||||
|
||||
keyinText = null;
|
||||
cr.keyinWindow = null;
|
||||
cr.$$("CRStartBtn").disabled = false;
|
||||
cr.$$("CRKeyinDeckBtn").disabled = false;
|
||||
B5500Util.addClass(cr.$$("CRKeyinDeckBtn"), "whiteLit");
|
||||
cr.$$("CRKeyinDeckBtn").classList.add("whiteLit");
|
||||
|
||||
}
|
||||
|
||||
@@ -262,11 +264,10 @@ B5500CardReader.prototype.CRKeyinDeckBtn_onClick = function CRKeyinDeckBtn_onCli
|
||||
this.keyinWindow.close();
|
||||
}
|
||||
|
||||
this.keyinWindow = win;
|
||||
this.$$("CRStartBtn").disabled = true;
|
||||
this.$$("CRKeyinDeckBtn").disabled = true;
|
||||
B5500Util.removeClass(this.$$("CRKeyinDeckBtn"), "whiteLit");
|
||||
win.addEventListener("load", keyinOnload, false);
|
||||
B5500Util.openPopup(this.window, "B5500CardReaderKeyin.html", this.mnemonic + "-Keyin",
|
||||
"location=no,scrollbars=no,resizable,width=640,height=240,left=" +
|
||||
(this.window.screenX+32) +",top=" + (this.window.screenY+32),
|
||||
this, keyinOnload);
|
||||
|
||||
};
|
||||
|
||||
@@ -422,11 +423,12 @@ B5500CardReader.prototype.beforeUnload = function beforeUnload(ev) {
|
||||
};
|
||||
|
||||
/**************************************/
|
||||
B5500CardReader.prototype.readerOnload = function readerOnload() {
|
||||
B5500CardReader.prototype.readerOnload = function readerOnload(ev) {
|
||||
/* Initializes the reader window and user interface */
|
||||
var de;
|
||||
|
||||
this.doc = this.window.document;
|
||||
this.doc = ev.target;
|
||||
this.window = this.doc.defaultView;
|
||||
de = this.doc.documentElement;
|
||||
this.doc.title = "retro-B5500 Card Reader " + this.mnemonic;
|
||||
|
||||
@@ -440,17 +442,17 @@ B5500CardReader.prototype.readerOnload = function readerOnload() {
|
||||
this.window.addEventListener("beforeunload",
|
||||
B5500CardReader.prototype.beforeUnload, false);
|
||||
this.$$("CRFileSelector").addEventListener("change",
|
||||
B5500CentralControl.bindMethod(this, B5500CardReader.prototype.fileSelector_onChange), false);
|
||||
B5500CardReader.prototype.fileSelector_onChange.bind(this), false);
|
||||
this.$$("CRStartBtn").addEventListener("click",
|
||||
B5500CentralControl.bindMethod(this, B5500CardReader.prototype.CRStartBtn_onClick), false);
|
||||
B5500CardReader.prototype.CRStartBtn_onClick.bind(this), false);
|
||||
this.$$("CRStopBtn").addEventListener("click",
|
||||
B5500CentralControl.bindMethod(this, B5500CardReader.prototype.CRStopBtn_onClick), false);
|
||||
B5500CardReader.prototype.CRStopBtn_onClick.bind(this), false);
|
||||
this.$$("CREOFBtn").addEventListener("click",
|
||||
B5500CentralControl.bindMethod(this, B5500CardReader.prototype.CREOFBtn_onClick), false);
|
||||
B5500CardReader.prototype.CREOFBtn_onClick.bind(this), false);
|
||||
this.$$("CRKeyinDeckBtn").addEventListener("click",
|
||||
B5500CentralControl.bindMethod(this, B5500CardReader.prototype.CRKeyinDeckBtn_onClick), false);
|
||||
B5500CardReader.prototype.CRKeyinDeckBtn_onClick.bind(this), false);
|
||||
this.hopperBar.addEventListener("click",
|
||||
B5500CentralControl.bindMethod(this, B5500CardReader.prototype.CRHopperBar_onClick), false);
|
||||
B5500CardReader.prototype.CRHopperBar_onClick.bind(this), false);
|
||||
|
||||
this.window.resizeBy(de.scrollWidth - this.window.innerWidth + 4, // kludge for right-padding/margin
|
||||
de.scrollHeight - this.window.innerHeight);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!DOCTYPE html>
|
||||
<html manifest="B5500Manifest.appcache">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<title>retro-B5500 Emulator</title>
|
||||
|
||||
@@ -67,7 +67,7 @@ window.addEventListener("load", function() {
|
||||
if (!window.FileReader) {missing += ", FileReader"}
|
||||
if (!window.FileList) {missing += ", FileList"}
|
||||
if (!window.indexedDB) {missing += ", IndexedDB"}
|
||||
if (!window.postMessage) {missing += ", window.postMessage"}
|
||||
if (!window.Promise) {missing += ", Promise"}
|
||||
if (!(window.performance && "now" in performance)) {missing += ", performance.now"}
|
||||
|
||||
if (missing.length == 0) {
|
||||
@@ -92,38 +92,7 @@ window.addEventListener("load", function() {
|
||||
document.getElementById("StartUpNoPowerBtn").addEventListener("click", systemStartup);
|
||||
document.getElementById("StartUpPoweredBtn").focus();
|
||||
|
||||
window.applicationCache.addEventListener("checking", function(ev) {
|
||||
document.getElementById("StatusMsg").textContent = "Checking for emulator update...";
|
||||
clearStatusMsg(15);
|
||||
});
|
||||
window.applicationCache.addEventListener("noupdate", function(ev) {
|
||||
document.getElementById("StatusMsg").textContent = "Emulator version is current.";
|
||||
clearStatusMsg(15);
|
||||
});
|
||||
window.applicationCache.addEventListener("obsolete", function(ev) {
|
||||
document.getElementById("StatusMsg").textContent = "Emulator off-line installation has been disabled.";
|
||||
clearStatusMsg(15);
|
||||
});
|
||||
window.applicationCache.addEventListener("downloading", function(ev) {
|
||||
document.getElementById("StatusMsg").textContent = "Initiating download for emulator update...";
|
||||
clearStatusMsg(15);
|
||||
});
|
||||
window.applicationCache.addEventListener("progress", function(ev) {
|
||||
var text = (ev.loaded && ev.total ? ev.loaded.toString() + "/" + ev.total.toString() : "Unknown number of");
|
||||
document.getElementById("StatusMsg").textContent = text + " resources downloaded thus far...";
|
||||
clearStatusMsg(15);
|
||||
});
|
||||
window.applicationCache.addEventListener("updateready", function(ev) {
|
||||
document.getElementById("StatusMsg").textContent = "Emulator update completed. Reload this page to activate the new version.";
|
||||
clearStatusMsg(15);
|
||||
});
|
||||
window.applicationCache.addEventListener("cached", function(ev) {
|
||||
document.getElementById("StatusMsg").textContent = "Emulator is now installed for off-line use.";
|
||||
clearStatusMsg(15);
|
||||
});
|
||||
window.applicationCache.addEventListener("error", function(ev) {
|
||||
document.getElementById("StatusMsg").textContent = "Browser reported error during emulator version check.";
|
||||
clearStatusMsg(15);
|
||||
});
|
||||
document.getElementById("StatusMsg").textContent = "The Application Cache feature has been deimplemented";
|
||||
clearStatusMsg(30);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
* retro-b5500/emulator B5500ConsolePanel.css
|
||||
************************************************************************
|
||||
* Copyright (c) 2015, Nigel Williams and Paul Kimpel.
|
||||
* Licensed under the MIT License, see
|
||||
* Licensed under the MIT License, see
|
||||
* http://www.opensource.org/licenses/mit-license.php
|
||||
************************************************************************
|
||||
* B5500 emulator Operator Console Panel web interface style sheet.
|
||||
@@ -150,6 +150,19 @@ HTML {
|
||||
padding-right: 1px;
|
||||
vertical-align: bottom}
|
||||
|
||||
#CentralControl TD.annunciator {
|
||||
color: #333;
|
||||
text-align: center;
|
||||
visibility: visible}
|
||||
#CentralControl TD.statValue {
|
||||
color: white;
|
||||
visibility: visible;
|
||||
text-align: right}
|
||||
#CentralControl TD.statLabel {
|
||||
color: white;
|
||||
visibility: visible;
|
||||
text-align: left}
|
||||
|
||||
COL.AnnunciatorCol {
|
||||
width: 32px}
|
||||
|
||||
@@ -157,6 +170,3 @@ COL.AnnunciatorCol {
|
||||
visibility: visible;
|
||||
width: 60px;
|
||||
text-align: right}
|
||||
TD.statLabel {
|
||||
visibility: visible;
|
||||
text-align: left}
|
||||
|
||||
@@ -86,11 +86,11 @@
|
||||
<td id=CCI14F class=annunciator title="Special Interrupt #1 (not used)">SPEC
|
||||
<td id=CCI15F class=annunciator title="Disk File #1 Read check finished">DK1F
|
||||
<td id=CCI16F class=annunciator title="Disk File #2 Read check finished">DK2F
|
||||
<td colspan=9>
|
||||
<td colspan=8>
|
||||
<td id=P2BF class=annunciator title="Processor 2 Busy FF">P2BF
|
||||
<td id=HP2F class=annunciator title="Halt Processor 2 FF">HP2F
|
||||
<td colspan=2>
|
||||
<td id=procSlack class=annunciator>
|
||||
<td colspan=3>
|
||||
<td id=procSlack class="annunciator statValue">
|
||||
<td class="annunciator statLabel">%
|
||||
<td class="annunciator statLabel" title="Percentage of time Processor A is throttling its performance">P1 Slack
|
||||
<tr id=CCPeripheralRow>
|
||||
@@ -125,7 +125,7 @@
|
||||
<td id=MTR class=annunciator title="Magnetic Tape Drive R">MTR <!-- Unit 34 -->
|
||||
<td id=MTS class=annunciator title="Magnetic Tape Drive S">MTS <!-- Unit 33 -->
|
||||
<td id=MTT class=annunciator title="Magnetic Tape Drive T">MTT <!-- Unit 32 -->
|
||||
<td id=procDelay class=annunciator>
|
||||
<td id=procDelay class="annunciator statValue">
|
||||
<td class="annunciator statLabel">ms
|
||||
<td class="annunciator statLabel" title="Average excess throttling delay for Processor A (ms)">P1 Delay
|
||||
</table>
|
||||
|
||||
@@ -54,13 +54,16 @@ function B5500ConsolePanel(global, autoPowerUp, shutDown) {
|
||||
this.timerInterval = 50; // Console display update interval [ms]
|
||||
|
||||
this.doc = null;
|
||||
this.window = window.open("../webUI/B5500ConsolePanel.html", "B5500Console",
|
||||
B5500Util.openPopup(window, "../webUI/B5500ConsolePanel.html", "B5500Console",
|
||||
"location=no,scrollbars=no,resizable,top=0,left=" + left +
|
||||
",width=" + width + ",height=" + height);
|
||||
this.window.addEventListener("load",
|
||||
B5500CentralControl.bindMethod(this, B5500ConsolePanel.prototype.consoleOnload));
|
||||
",width=" + width + ",height=" + height,
|
||||
this, B5500ConsolePanel.prototype.consoleOnload);
|
||||
}
|
||||
|
||||
/**************************************/
|
||||
B5500ConsolePanel.annOnColor = "white"; // annunciator lamp on color
|
||||
B5500ConsolePanel.annOffColor = "#333"; // annunciator lamp off color
|
||||
|
||||
/**************************************/
|
||||
B5500ConsolePanel.prototype.$$ = function $$(id) {
|
||||
return this.doc.getElementById(id);
|
||||
@@ -157,7 +160,7 @@ B5500ConsolePanel.prototype.PowerOnBtn_Click = function PowerOnBtn_Click(ev) {
|
||||
that.$$("SysConfigName").textContent = config.configName;
|
||||
that.$$("StorageName").textContent = config.units.DKA.storageName;
|
||||
if (that.showAnnunciators) {
|
||||
that.lampTest(B5500CentralControl.bindMethod(that, applyPower), config);
|
||||
that.lampTest(applyPower.bind(that), config);
|
||||
} else {
|
||||
applyPower(config);
|
||||
}
|
||||
@@ -225,7 +228,7 @@ B5500ConsolePanel.prototype.LoadBtn_Click = function LoadBtn_Click(ev) {
|
||||
this.$$("HaltBtn").disabled = false;
|
||||
this.$$("LoadBtn").disabled = true;
|
||||
this.timer = setInterval(
|
||||
B5500CentralControl.bindMethod(this, B5500ConsolePanel.prototype.dasBlinkenlichten),
|
||||
B5500ConsolePanel.prototype.dasBlinkenlichten.bind(this),
|
||||
this.timerInterval);
|
||||
break;
|
||||
case 1:
|
||||
@@ -265,10 +268,10 @@ B5500ConsolePanel.prototype.LoadSelectBtn_Click = function LoadSelectBtn_Click(e
|
||||
/**************************************/
|
||||
B5500ConsolePanel.prototype.dumpState = function dumpState(caption) {
|
||||
/* Generates a dump of the processor states and all of memory */
|
||||
var doc;
|
||||
var doc = null;
|
||||
var lastPhase = -2;
|
||||
var win = window.open("", "", "location=no,resizable,scrollbars,status");
|
||||
var x;
|
||||
var win = null;
|
||||
var x = 0;
|
||||
|
||||
var htmlMatch = /[<>&"]/g; // regular expression for escaping HTML text
|
||||
|
||||
@@ -330,28 +333,38 @@ B5500ConsolePanel.prototype.dumpState = function dumpState(caption) {
|
||||
} // switch
|
||||
}
|
||||
|
||||
doc = win.document;
|
||||
doc.open();
|
||||
doc.writeln("<html><head><title>retro-B5500 Console State Dump</title>");
|
||||
doc.writeln("</head><body>");
|
||||
doc.write("<pre>");
|
||||
function dumpStateOnLoad(ev) {
|
||||
/* Call-back function for the dumpState onload event */
|
||||
|
||||
this.cc.dumpSystemState(caption, writer);
|
||||
doc = ev.target;
|
||||
win = doc.defaultView;
|
||||
doc.open();
|
||||
doc.writeln("<html><head><title>retro-B5500 Console State Dump</title>");
|
||||
doc.writeln("</head><body>");
|
||||
doc.write("<pre>");
|
||||
|
||||
doc.writeln("</pre></body></html>")
|
||||
doc.close();
|
||||
win.focus();
|
||||
this.cc.dumpSystemState(caption, writer);
|
||||
|
||||
doc.writeln("</pre></body></html>")
|
||||
doc.close();
|
||||
win.focus();
|
||||
}
|
||||
|
||||
// Outer block of dumpState
|
||||
B5500Util.openPopup(this.window, "./B5500FramePaper.html", "",
|
||||
"location=no,resizable,scrollbars,status",
|
||||
this, dumpStateOnLoad);
|
||||
}
|
||||
|
||||
/**************************************/
|
||||
B5500ConsolePanel.prototype.dumpTape = function dumpTape(caption) {
|
||||
/* Generates a dump of all of memory to a MEMORY/DUMP tape image */
|
||||
var doc;
|
||||
var win = window.open("", "", "location=no,resizable,scrollbars,status");
|
||||
var x;
|
||||
var doc = null;
|
||||
var win = null;
|
||||
var x = 0;
|
||||
|
||||
var htmlMatch = /[<>&"]/g; // regular expression for escaping HTML text
|
||||
var tapeLabel = " LABEL 0MEMORY 0DUMP00100175001019936500000000000000000000000000000000000000000";
|
||||
var tapeLabel = " LABEL 000000000MDUMP 001750010199365000006400000640000000051300513000002900|4";
|
||||
|
||||
function htmlFilter(c) {
|
||||
/* Used to escape HTML-sensitive characters in a string */
|
||||
@@ -389,24 +402,34 @@ B5500ConsolePanel.prototype.dumpTape = function dumpTape(caption) {
|
||||
break;
|
||||
|
||||
case -1: // Termination, write tape label
|
||||
doc.writeln(text);
|
||||
doc.writeln(text.substring(0, 160));
|
||||
doc.writeln("}"); // tape mark
|
||||
doc.writeln(tapeLabel);
|
||||
break;
|
||||
} // switch
|
||||
}
|
||||
|
||||
doc = win.document;
|
||||
doc.open();
|
||||
doc.writeln("<html><head><title>retro-B5500 Console Tape Dump</title>");
|
||||
doc.writeln("</head><body>");
|
||||
doc.write("<pre>");
|
||||
function dumpTapeOnLoad(ev) {
|
||||
/* Call-back function for the dumpTape window onload event */
|
||||
|
||||
this.cc.dumpSystemTape(caption, writer);
|
||||
doc = ev.target;
|
||||
win = doc.defaultView;
|
||||
doc.open();
|
||||
doc.writeln("<html><head><title>retro-B5500 Console Tape Dump</title>");
|
||||
doc.writeln("</head><body>");
|
||||
doc.write("<pre>");
|
||||
|
||||
doc.writeln("</pre></body></html>")
|
||||
doc.close();
|
||||
win.focus();
|
||||
this.cc.dumpSystemTape(caption, writer);
|
||||
|
||||
doc.writeln("</pre></body></html>")
|
||||
doc.close();
|
||||
win.focus();
|
||||
}
|
||||
|
||||
// Outer block of dumpTape
|
||||
B5500Util.openPopup(this.window, "./B5500FramePaper.html", "",
|
||||
"location=no,resizable,scrollbars,status",
|
||||
this, dumpTapeOnLoad);
|
||||
}
|
||||
|
||||
/**************************************/
|
||||
@@ -496,7 +519,7 @@ B5500ConsolePanel.prototype.displayCentralControl = function displayCentralContr
|
||||
while (ccChange) {
|
||||
if (ccChange & 0x01) {
|
||||
if (this.ccLightsMap[x]) {
|
||||
this.ccLightsMap[x].style.visibility = (ccMask & 0x01 ? "visible" : "hidden");
|
||||
this.ccLightsMap[x].style.color = (ccMask & 0x01 ? B5500ConsolePanel.annOnColor : B5500ConsolePanel.annOffColor);
|
||||
}
|
||||
}
|
||||
ccMask >>>= 1;
|
||||
@@ -508,7 +531,7 @@ B5500ConsolePanel.prototype.displayCentralControl = function displayCentralContr
|
||||
while (interruptChange) {
|
||||
if (interruptChange & 0x01) {
|
||||
if (this.intLightsMap[x]) {
|
||||
this.intLightsMap[x].style.visibility = (interruptMask & 0x01 ? "visible" : "hidden");
|
||||
this.intLightsMap[x].style.color = (interruptMask & 0x01 ? B5500ConsolePanel.annOnColor : B5500ConsolePanel.annOffColor);
|
||||
}
|
||||
}
|
||||
interruptMask >>>= 1;
|
||||
@@ -520,7 +543,7 @@ B5500ConsolePanel.prototype.displayCentralControl = function displayCentralContr
|
||||
while (unitBusyChange) {
|
||||
if (unitBusyChange & 0x01) {
|
||||
if (this.perLightsMap[x]) {
|
||||
this.perLightsMap[x].style.visibility = (unitBusyMask & 0x01 ? "visible" : "hidden");
|
||||
this.perLightsMap[x].style.color = (unitBusyMask & 0x01 ? B5500ConsolePanel.annOnColor : B5500ConsolePanel.annOffColor);
|
||||
}
|
||||
}
|
||||
unitBusyMask >>>= 1;
|
||||
@@ -532,20 +555,20 @@ B5500ConsolePanel.prototype.displayCentralControl = function displayCentralContr
|
||||
/**************************************/
|
||||
B5500ConsolePanel.prototype.dasBlinkenlichten = function dasBlinkenlichten() {
|
||||
/* Updates the panel display from current system state */
|
||||
var cycles;
|
||||
var cycles = 0;
|
||||
var pa = this.cc.PA;
|
||||
var pb = this.cc.PB;
|
||||
var p1 = this.cc.P1;
|
||||
var stateRate;
|
||||
var stateRate = 0;
|
||||
|
||||
cycles = p1.normalCycles+p1.controlCycles+1; // avoid div zero
|
||||
|
||||
if (pa) {
|
||||
if (pa.normalCycles+pa.controlCycles <= 0) {
|
||||
if (this.lastPAControlRate != -1) {
|
||||
this.lastPAControlRate = -1;
|
||||
this.aControl.className = "yellowButton";
|
||||
this.lastPAControlRate = this.lastPANormalRate = -1;
|
||||
this.aNormal.className = "yellowButton";
|
||||
this.aControl.className = (pa === p1 ? "yellowButton yellowLit" : "yellowButton");
|
||||
}
|
||||
} else {
|
||||
stateRate = Math.round(pa.normalCycles/cycles*6 + 0.25);
|
||||
@@ -576,7 +599,7 @@ B5500ConsolePanel.prototype.dasBlinkenlichten = function dasBlinkenlichten() {
|
||||
}
|
||||
}
|
||||
|
||||
stateRate = Math.round(pa.controlCycles/cycles*6 + 0.25);
|
||||
stateRate = (pa === p1 ? Math.round(pa.controlCycles/cycles*6 + 0.25) : 0);
|
||||
if (stateRate != this.lastPAControlRate) {
|
||||
this.lastPAControlRate = stateRate;
|
||||
switch (stateRate) {
|
||||
@@ -611,9 +634,9 @@ B5500ConsolePanel.prototype.dasBlinkenlichten = function dasBlinkenlichten() {
|
||||
if (pb) {
|
||||
if (pb.normalCycles+pb.controlCycles <= 0) {
|
||||
if (this.lastPBControlRate != -1) {
|
||||
this.bControl.className = "yellowButton";
|
||||
this.lastPBControlRate = this.lastPBNormalRate = -1;
|
||||
this.bNormal.className = "yellowButton";
|
||||
this.lastPBControlRate = -1;
|
||||
this.bControl.className = (pb === p1 ? "yellowButton yellowLit" : "yellowButton");
|
||||
}
|
||||
} else {
|
||||
stateRate = Math.round(pb.normalCycles/cycles*6 + 0.25);
|
||||
@@ -644,7 +667,7 @@ B5500ConsolePanel.prototype.dasBlinkenlichten = function dasBlinkenlichten() {
|
||||
}
|
||||
}
|
||||
|
||||
stateRate = Math.round(pb.controlCycles/cycles*6 + 0.25);
|
||||
stateRate = (pb === p1 ? Math.round(pb.controlCycles/cycles*6 + 0.25) : 0);
|
||||
if (stateRate != this.lastPBControlRate) {
|
||||
this.lastPBControlRate = stateRate;
|
||||
switch (stateRate) {
|
||||
@@ -717,7 +740,7 @@ B5500ConsolePanel.prototype.lampTest = function lampTest(callback, callbackParam
|
||||
var that = this;
|
||||
|
||||
function switchEm(mode) {
|
||||
var visibility = (mode ? "visible" : "hidden");
|
||||
var visibility = (mode ? B5500ConsolePanel.annOnColor : B5500ConsolePanel.annOffColor);
|
||||
var x;
|
||||
|
||||
that.$$("ANormalBtn").className = "yellowButton" + (mode ? " yellowLit" : "");
|
||||
@@ -731,19 +754,19 @@ B5500ConsolePanel.prototype.lampTest = function lampTest(callback, callbackParam
|
||||
|
||||
for (x in that.ccLightsMap) {
|
||||
if (that.ccLightsMap[x]) {
|
||||
that.ccLightsMap[x].style.visibility = visibility;
|
||||
that.ccLightsMap[x].style.color = visibility;
|
||||
}
|
||||
}
|
||||
|
||||
for (x in that.intLightsMap) {
|
||||
if (that.intLightsMap[x]) {
|
||||
that.intLightsMap[x].style.visibility = visibility;
|
||||
that.intLightsMap[x].style.color = visibility;
|
||||
}
|
||||
}
|
||||
|
||||
for (x in that.perLightsMap) {
|
||||
if (that.perLightsMap[x]) {
|
||||
that.perLightsMap[x].style.visibility = visibility;
|
||||
that.perLightsMap[x].style.color = visibility;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -802,33 +825,33 @@ B5500ConsolePanel.prototype.clearStatusLabel = function clearStatusLabel(inSecon
|
||||
B5500ConsolePanel.prototype.consoleOnload = function consoleOnload(ev) {
|
||||
/* Initialization function called when window finishes loading */
|
||||
|
||||
this.doc = this.window.document;
|
||||
this.doc = ev.target;
|
||||
this.window = this.doc.defaultView;
|
||||
this.$$("RetroVersion").textContent = B5500CentralControl.version;
|
||||
this.window.name = "B5500Console";
|
||||
this.window.addEventListener("unload",
|
||||
B5500CentralControl.bindMethod(this, B5500ConsolePanel.prototype.consoleUnload));
|
||||
B5500ConsolePanel.prototype.consoleUnload.bind(this));
|
||||
this.$$("BurroughsLogo").addEventListener("click",
|
||||
B5500CentralControl.bindMethod(this, B5500ConsolePanel.prototype.BurroughsLogo_Click));
|
||||
B5500ConsolePanel.prototype.BurroughsLogo_Click.bind(this));
|
||||
this.$$("B5500Logo").addEventListener("click",
|
||||
B5500CentralControl.bindMethod(this, B5500ConsolePanel.prototype.B5500Logo_Click));
|
||||
B5500ConsolePanel.prototype.B5500Logo_Click.bind(this));
|
||||
this.$$("PowerOnBtn").addEventListener("click",
|
||||
B5500CentralControl.bindMethod(this, B5500ConsolePanel.prototype.PowerOnBtn_Click));
|
||||
B5500ConsolePanel.prototype.PowerOnBtn_Click.bind(this));
|
||||
this.$$("PowerOffBtn").addEventListener("click",
|
||||
B5500CentralControl.bindMethod(this, B5500ConsolePanel.prototype.PowerOffBtn_Click));
|
||||
B5500ConsolePanel.prototype.PowerOffBtn_Click.bind(this));
|
||||
this.$$("HaltBtn").addEventListener("click",
|
||||
B5500CentralControl.bindMethod(this, B5500ConsolePanel.prototype.HaltBtn_Click));
|
||||
B5500ConsolePanel.prototype.HaltBtn_Click.bind(this));
|
||||
this.$$("LoadBtn").addEventListener("click",
|
||||
B5500CentralControl.bindMethod(this, B5500ConsolePanel.prototype.LoadBtn_Click));
|
||||
B5500ConsolePanel.prototype.LoadBtn_Click.bind(this));
|
||||
this.$$("LoadSelectBtn").addEventListener("click",
|
||||
B5500CentralControl.bindMethod(this, B5500ConsolePanel.prototype.LoadSelectBtn_Click));
|
||||
B5500ConsolePanel.prototype.LoadSelectBtn_Click.bind(this));
|
||||
this.$$("MemoryCheckBtn").addEventListener("click",
|
||||
B5500CentralControl.bindMethod(this, function(ev) {
|
||||
function(ev) {
|
||||
this.dumpState("Memory-Check Button");
|
||||
}));
|
||||
this.$$("NotReadyBtn").addEventListener("click",
|
||||
B5500CentralControl.bindMethod(this, function(ev) {
|
||||
this.dumpTape("Not-Ready Button");
|
||||
}));
|
||||
}.bind(this));
|
||||
this.$$("NotReadyBtn").addEventListener("click", function(ev) {
|
||||
this.dumpTape("Not-Ready Button");
|
||||
}.bind(this));
|
||||
|
||||
this.aControl = this.$$("AControlBtn");
|
||||
this.aNormal = this.$$("ANormalBtn");
|
||||
@@ -839,9 +862,9 @@ B5500ConsolePanel.prototype.consoleOnload = function consoleOnload(ev) {
|
||||
this.buildLightMaps();
|
||||
|
||||
this.cc = new B5500CentralControl(this.global);
|
||||
this.global.B5500DumpState = this.dumpState; // for use by Processor
|
||||
this.global.B5500DumpState = this.dumpTape; // for use by Processor
|
||||
this.global.focusConsole = B5500CentralControl.bindMethod(this, B5500ConsolePanel.prototype.focusConsole);
|
||||
this.cc.B5500DumpState = B5500ConsolePanel.prototype.dumpState.bind(this); // for use by Processor
|
||||
this.cc.B5500DumpTape = B5500ConsolePanel.prototype.dumpTape.bind(this); // for use by Processor
|
||||
this.cc.focusConsole = B5500ConsolePanel.prototype.focusConsole.bind(this);
|
||||
|
||||
this.window.resizeTo(this.doc.documentElement.scrollWidth + this.window.outerWidth - this.window.innerWidth + 2, // kludge +2, dunno why
|
||||
this.doc.documentElement.scrollHeight + this.window.outerHeight - this.window.innerHeight);
|
||||
|
||||
@@ -45,12 +45,12 @@ function B5500DatacomUnit(mnemonic, unitIndex, designate, statusChange, signal,
|
||||
this.clear();
|
||||
|
||||
this.doc = null;
|
||||
this.window = null;
|
||||
this.paper = null;
|
||||
this.endOfPaper = null;
|
||||
this.window = window.open("../webUI/B5500DatacomUnit.html", mnemonic,
|
||||
"location=no,scrollbars,resizable,width=520,height=540");
|
||||
this.window.addEventListener("load", B5500CentralControl.bindMethod(this,
|
||||
B5500DatacomUnit.prototype.datacomOnload), false);
|
||||
B5500Util.openPopup(window, "../webUI/B5500DatacomUnit.html", mnemonic,
|
||||
"location=no,scrollbars,resizable,width=520,height=540",
|
||||
this, B5500DatacomUnit.prototype.datacomOnload);
|
||||
}
|
||||
|
||||
// this.bufState enumerations
|
||||
@@ -114,63 +114,63 @@ B5500DatacomUnit.prototype.setState = function setState(newState) {
|
||||
this.showBufferIndex();
|
||||
|
||||
if (this.abnormal) {
|
||||
B5500Util.addClass(this.$$("Abnormal"), "textLit")
|
||||
this.$$("Abnormal").classList.add("textLit")
|
||||
} else {
|
||||
B5500Util.removeClass(this.$$("Abnormal"), "textLit");
|
||||
this.$$("Abnormal").classList.remove("textLit");
|
||||
}
|
||||
|
||||
if (this.interrupt) {
|
||||
B5500Util.addClass(this.$$("Interrupt"), "textLit")
|
||||
this.$$("Interrupt").classList.add("textLit")
|
||||
} else {
|
||||
B5500Util.removeClass(this.$$("Interrupt"), "textLit");
|
||||
this.$$("Interrupt").classList.remove("textLit");
|
||||
}
|
||||
|
||||
if (this.fullBuffer) {
|
||||
B5500Util.addClass(this.$$("FullBuffer"), "textLit")
|
||||
this.$$("FullBuffer").classList.add("textLit")
|
||||
} else {
|
||||
B5500Util.removeClass(this.$$("FullBuffer"), "textLit");
|
||||
this.$$("FullBuffer").classList.remove("textLit");
|
||||
}
|
||||
|
||||
if (this.bufState != newState) {
|
||||
switch (this.bufState) {
|
||||
case this.bufNotReady:
|
||||
B5500Util.removeClass(this.$$("NotReadyState"), "textLit");
|
||||
this.$$("NotReadyState").classList.remove("textLit");
|
||||
break;
|
||||
case this.bufIdle:
|
||||
B5500Util.removeClass(this.$$("IdleState"), "textLit");
|
||||
this.$$("IdleState").classList.remove("textLit");
|
||||
break;
|
||||
case this.bufInputBusy:
|
||||
B5500Util.removeClass(this.$$("InputBusyState"), "textLit");
|
||||
this.$$("InputBusyState").classList.remove("textLit");
|
||||
break;
|
||||
case this.bufReadReady:
|
||||
B5500Util.removeClass(this.$$("ReadReadyState"), "textLit");
|
||||
this.$$("ReadReadyState").classList.remove("textLit");
|
||||
break;
|
||||
case this.bufOutputBusy:
|
||||
B5500Util.removeClass(this.$$("OutputBusyState"), "textLit");
|
||||
this.$$("OutputBusyState").classList.remove("textLit");
|
||||
break;
|
||||
case this.bufWriteReady:
|
||||
B5500Util.removeClass(this.$$("WriteReadyState"), "textLit");
|
||||
this.$$("WriteReadyState").classList.remove("textLit");
|
||||
break;
|
||||
}
|
||||
|
||||
switch (newState) {
|
||||
case this.bufNotReady:
|
||||
B5500Util.addClass(this.$$("NotReadyState"), "textLit");
|
||||
this.$$("NotReadyState").classList.add("textLit");
|
||||
break;
|
||||
case this.bufIdle:
|
||||
B5500Util.addClass(this.$$("IdleState"), "textLit");
|
||||
this.$$("IdleState").classList.add("textLit");
|
||||
break;
|
||||
case this.bufInputBusy:
|
||||
B5500Util.addClass(this.$$("InputBusyState"), "textLit");
|
||||
this.$$("InputBusyState").classList.add("textLit");
|
||||
break;
|
||||
case this.bufReadReady:
|
||||
B5500Util.addClass(this.$$("ReadReadyState"), "textLit");
|
||||
this.$$("ReadReadyState").classList.add("textLit");
|
||||
break;
|
||||
case this.bufOutputBusy:
|
||||
B5500Util.addClass(this.$$("OutputBusyState"), "textLit");
|
||||
this.$$("OutputBusyState").classList.add("textLit");
|
||||
break;
|
||||
case this.bufWriteReady:
|
||||
B5500Util.addClass(this.$$("WriteReadyState"), "textLit");
|
||||
this.$$("WriteReadyState").classList.add("textLit");
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -185,7 +185,7 @@ B5500DatacomUnit.prototype.termDisconnect = function termDisconnect() {
|
||||
if (this.connected) {
|
||||
this.bufLength = 0;
|
||||
this.bufIndex = 0;
|
||||
B5500Util.removeClass(this.$$("TermConnectBtn"), "greenLit");
|
||||
this.$$("TermConnectBtn").classList.remove("greenLit");
|
||||
this.interrupt = true;
|
||||
this.abnormal = true;
|
||||
this.setState(this.bufIdle);
|
||||
@@ -199,7 +199,7 @@ B5500DatacomUnit.prototype.termConnect = function termConnect() {
|
||||
/* Sets the status of the datacom unit to connected */
|
||||
|
||||
if (!this.connected) {
|
||||
B5500Util.addClass(this.$$("TermConnectBtn"), "greenLit");
|
||||
this.$$("TermConnectBtn").classList.add("greenLit");
|
||||
this.interrupt = true;
|
||||
this.abnormal = true;
|
||||
this.setState(this.bufWriteReady);
|
||||
@@ -510,15 +510,15 @@ B5500DatacomUnit.prototype.copyPaper = function copyPaper(ev) {
|
||||
or saved by the user */
|
||||
var text = ev.target.textContent;
|
||||
var title = "B5500 " + this.mnemonic + " Text Snapshot";
|
||||
var win = window.open("./B5500FramePaper.html", this.mnemonic + "-Snapshot",
|
||||
"location=no,scrollbars,resizable,width=500,height=500");
|
||||
|
||||
win.moveTo((screen.availWidth-win.outerWidth)/2, (screen.availHeight-win.outerHeight)/2);
|
||||
win.addEventListener("load", function() {
|
||||
var doc;
|
||||
B5500Util.openPopup(this.window, "./B5500FramePaper.html", "",
|
||||
"location=no,scrollbars,resizable,width=500,height=500",
|
||||
this, function(ev) {
|
||||
var doc = ev.target;
|
||||
var win = doc.defaultView;
|
||||
|
||||
doc = win.document;
|
||||
doc.title = title;
|
||||
win.moveTo((screen.availWidth-win.outerWidth)/2, (screen.availHeight-win.outerHeight)/2);
|
||||
doc.getElementById("Paper").textContent = text;
|
||||
});
|
||||
|
||||
@@ -545,11 +545,12 @@ B5500DatacomUnit.prototype.beforeUnload = function beforeUnload(ev) {
|
||||
};
|
||||
|
||||
/**************************************/
|
||||
B5500DatacomUnit.prototype.datacomOnload = function datacomOnload() {
|
||||
B5500DatacomUnit.prototype.datacomOnload = function datacomOnload(ev) {
|
||||
/* Initializes the datacom unit and terminal window user interface */
|
||||
var x;
|
||||
|
||||
this.doc = this.window.document;
|
||||
this.doc = ev.target;
|
||||
this.window = this.doc.defaultView;
|
||||
this.doc.title = "retro-B5500 Datacom Unit " + this.mnemonic + ": TU/BUF=01/00";
|
||||
this.paper = this.$$("Paper");
|
||||
this.endOfPaper = this.$$("EndOfPaper");
|
||||
@@ -557,17 +558,17 @@ B5500DatacomUnit.prototype.datacomOnload = function datacomOnload() {
|
||||
this.window.addEventListener("beforeunload",
|
||||
B5500DatacomUnit.prototype.beforeUnload, false);
|
||||
this.window.addEventListener("resize",
|
||||
B5500CentralControl.bindMethod(this, B5500DatacomUnit.prototype.resizeWindow), false);
|
||||
B5500DatacomUnit.prototype.resizeWindow.bind(this), false);
|
||||
this.window.addEventListener("keydown",
|
||||
B5500CentralControl.bindMethod(this, B5500DatacomUnit.prototype.keyDown), false);
|
||||
B5500DatacomUnit.prototype.keyDown.bind(this), false);
|
||||
this.window.addEventListener("keypress",
|
||||
B5500CentralControl.bindMethod(this, B5500DatacomUnit.prototype.keyPress), false);
|
||||
B5500DatacomUnit.prototype.keyPress.bind(this), false);
|
||||
this.$$("TermOut").addEventListener("keypress",
|
||||
B5500CentralControl.bindMethod(this, B5500DatacomUnit.prototype.keyPress), false);
|
||||
B5500DatacomUnit.prototype.keyPress.bind(this), false);
|
||||
this.paper.addEventListener("dblclick",
|
||||
B5500CentralControl.bindMethod(this, B5500DatacomUnit.prototype.copyPaper), false);
|
||||
B5500DatacomUnit.prototype.copyPaper.bind(this), false);
|
||||
this.$$("TermConnectBtn").addEventListener("click",
|
||||
B5500CentralControl.bindMethod(this, B5500DatacomUnit.prototype.termConnectBtnClick), false);
|
||||
B5500DatacomUnit.prototype.termConnectBtnClick.bind(this), false);
|
||||
|
||||
this.statusChange(1); // make DCA ready
|
||||
this.window.moveTo((screen.availWidth-this.window.outerWidth)/2,
|
||||
|
||||
@@ -16,8 +16,8 @@
|
||||
* Units (EU) and sizes and types of each of the EUs. This module addresses
|
||||
* the second part.
|
||||
*
|
||||
* Each disk storage subsystem is maintained as a separate IndexedDB database.
|
||||
* Each database contains a single-object store named "CONFIG" that holds the
|
||||
* Each disk storage subsystem is maintained as a separate IndexedDB data base.
|
||||
* Each data base contains a single-object store named "CONFIG" that holds the
|
||||
* configuration data for that subsystem. In addition, there are one or more
|
||||
* "EUn" object stores, where "n" is a one- or two-digit decimal number in the
|
||||
* range 0-19. Each of these object stores represents the storage capacity for
|
||||
@@ -27,7 +27,7 @@
|
||||
* represented individually, as their address space was monolithic within an EU
|
||||
* (i.e., one I/O could cross SU boundaries but not EU boundaries).
|
||||
*
|
||||
* In addition to the "CONFIG" and "EUn" object stores, the database will have
|
||||
* In addition to the "CONFIG" and "EUn" object stores, the data base will have
|
||||
* two object stores reserved for use by the drum units, DRA and DRB. These
|
||||
* units have a fixed 32K words of storage and were word-addressible. Since
|
||||
* they have a fixed configuration, they are not represented in the "CONFIG"
|
||||
@@ -64,10 +64,10 @@
|
||||
*
|
||||
* configLevel: the revision level of the CONFIG object.
|
||||
* storageName: the name of the storage subsystem. This should match
|
||||
* the name of the IndexedDB database (db.name).
|
||||
* the name of the IndexedDB data base (db.name).
|
||||
*
|
||||
* The "EUn" objects in "CONFIG" MUST match one-for-one the "EUn" object stores
|
||||
* in the database. Object stores without a matching "CONFIG" entry entry will
|
||||
* in the data base. Object stores without a matching "CONFIG" entry entry will
|
||||
* not be used by the emulator (the EU will be reported as being not ready).
|
||||
* "CONFIG" entries without a matching object store will cause an error when the
|
||||
* disk device driver attempts to create an IndexedDB transaction that references
|
||||
@@ -103,19 +103,19 @@
|
||||
* in the disk subsystem and require a Cold Start to resolve.
|
||||
*
|
||||
* Also note that in emulator 0.20 and earlier, there was a single disk storage
|
||||
* database named "B5500DiskUnit". That database also contained a single-object
|
||||
* data base named "B5500DiskUnit". That data base also contained a single-object
|
||||
* store named "CONFIG", but with a simpler set of "EUn" objects that indicated
|
||||
* only the size of the EU. The "B5500DiskUnit" name is retained as a default
|
||||
* storage name for the initial disk subsystem to be created. If the emulator
|
||||
* encounters a database with the older form of EU object, it will use it
|
||||
* encounters a data base with the older form of EU object, it will use it
|
||||
* implying slow=true and lockoutMask=0. If you modify the EU configuration in
|
||||
* any way, however, the older form of object will be converted to the new form.
|
||||
*
|
||||
* With this approach, disk subsystem databases from older versions of the
|
||||
* With this approach, disk subsystem data bases from older versions of the
|
||||
* emulator will work with the later versions, but ONLY IF THE DISK CONFIGURATION
|
||||
* IS NOT MODIFIED. Once you click the "SAVE" button on the Disk Subsystem
|
||||
* Configuration dialog, the "CONFIG" structure will be updated to the newer
|
||||
* format, and the database will no longer work with older versions of the
|
||||
* format, and the data base will no longer work with older versions of the
|
||||
* emulator.
|
||||
*
|
||||
************************************************************************
|
||||
@@ -128,8 +128,9 @@
|
||||
function B5500DiskStorageConfig() {
|
||||
/* Constructor for the DiskStorageConfig object */
|
||||
|
||||
this.db = null; // the IndexedDB database connection (null if closed)
|
||||
this.db = null; // the IndexedDB data base connection (null if closed)
|
||||
this.storageConfig = null; // the current storage subsystem configuration
|
||||
this.doc = null; // configuration UI document object
|
||||
this.window = null; // configuration UI window object
|
||||
this.alertWin = window; // current base window for alert/confirm/prompt
|
||||
}
|
||||
@@ -159,22 +160,22 @@ B5500DiskStorageConfig.prototype.$$ = function $$(id) {
|
||||
|
||||
/**************************************/
|
||||
B5500DiskStorageConfig.prototype.genericDBError = function genericDBError(ev) {
|
||||
// Formats a generic alert message when an otherwise-unhandled database error occurs */
|
||||
// Formats a generic alert message when an otherwise-unhandled data base error occurs */
|
||||
|
||||
alert("Database \"" + target.result.name +
|
||||
alert("data base \"" + ev.target.result.name +
|
||||
"\" UNHANDLED ERROR: " + ev.target.result.error);
|
||||
};
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* Disk Storage Database Configuration Interface *
|
||||
* Disk Storage data base Configuration Interface *
|
||||
***********************************************************************/
|
||||
|
||||
/**************************************/
|
||||
B5500DiskStorageConfig.prototype.upgradeStorageSchema = function upgradeStorageSchema(ev) {
|
||||
/* Handles the onupgradeneeded event for this Disk Storage database. Upgrades
|
||||
the schema to the current version. For a new database, creates the default
|
||||
configuration and stores it in the database. "ev" is the upgradeneeded event.
|
||||
/* Handles the onupgradeneeded event for this Disk Storage data base. Upgrades
|
||||
the schema to the current version. For a new data base, creates the default
|
||||
configuration and stores it in the data base. "ev" is the upgradeneeded event.
|
||||
Must be called in the context of the DiskStorageConfig object */
|
||||
var aborted = false;
|
||||
var configStore = null;
|
||||
@@ -196,9 +197,9 @@ B5500DiskStorageConfig.prototype.upgradeStorageSchema = function upgradeStorageS
|
||||
}
|
||||
|
||||
function applyNewConfig(config) {
|
||||
/* Applies the new configuration structure in "CONFIG" to the database.
|
||||
If CONFIG contains EU* structures that are not in the database, those
|
||||
new structures are created. If the database contains EU* structures
|
||||
/* Applies the new configuration structure in "CONFIG" to the data base.
|
||||
If CONFIG contains EU* structures that are not in the data base, those
|
||||
new structures are created. If the data base contains EU* structures
|
||||
that are not in CONFIG, they are ignored (the storage UI should
|
||||
prevent this from happening, however) */
|
||||
var name;
|
||||
@@ -223,7 +224,7 @@ B5500DiskStorageConfig.prototype.upgradeStorageSchema = function upgradeStorageS
|
||||
}
|
||||
|
||||
function createDefaultConfig() {
|
||||
/* Create an initial disk subsystem configuration for a new database,
|
||||
/* Create an initial disk subsystem configuration for a new data base,
|
||||
containing a single EU having the default EU configuration, plus
|
||||
both drum units */
|
||||
var config = B5500Util.deepCopy(B5500DiskStorageConfig.prototype.storageConfig);
|
||||
@@ -243,19 +244,19 @@ B5500DiskStorageConfig.prototype.upgradeStorageSchema = function upgradeStorageS
|
||||
};
|
||||
|
||||
if (ev.oldVersion < 1) {
|
||||
// New database -- start by creating a store for the config structure.
|
||||
if (!this.alertWin.confirm("Disk Storage database \"" + db.name +
|
||||
// New data base -- start by creating a store for the config structure.
|
||||
if (!this.alertWin.confirm("Disk Storage data base \"" + db.name +
|
||||
"\"\ndoes not exist. Do you want to create it?")) {
|
||||
aborted = true;
|
||||
txn.abort();
|
||||
db.close();
|
||||
} else {
|
||||
this.alertWin.alert("Disk Storage database \"" + db.name + "\" created.");
|
||||
this.alertWin.alert("Disk Storage data base \"" + db.name + "\" created.");
|
||||
}
|
||||
}
|
||||
|
||||
if (aborted) {
|
||||
this.alertWin.alert("Disk Storage database creation aborted.");
|
||||
this.alertWin.alert("Disk Storage data base creation aborted.");
|
||||
} else if (db.objectStoreNames.contains(this.storageConfigName)) {
|
||||
// Normal upgrade: get the updated config structure from the DB and apply it
|
||||
configStore = txn.objectStore(this.storageConfigName);
|
||||
@@ -263,8 +264,8 @@ B5500DiskStorageConfig.prototype.upgradeStorageSchema = function upgradeStorageS
|
||||
applyNewConfig(that.normalizeStorageConfig(ev.target.result, db.Name));
|
||||
};
|
||||
} else {
|
||||
// No config structure exists in the database. We assume this is a
|
||||
// database just being created, so simply create a Disk Storage CONFIG
|
||||
// No config structure exists in the data base. We assume this is a
|
||||
// data base just being created, so simply create a Disk Storage CONFIG
|
||||
// structure for it.
|
||||
configStore = db.createObjectStore(this.storageConfigName);
|
||||
createDefaultConfig();
|
||||
@@ -274,7 +275,7 @@ B5500DiskStorageConfig.prototype.upgradeStorageSchema = function upgradeStorageS
|
||||
/**************************************/
|
||||
B5500DiskStorageConfig.prototype.deleteStorageDB = function deleteStorageDB(
|
||||
storageName, onsuccess, onfailure) {
|
||||
/* Attempts to permanently delete the Disk Storage database named in
|
||||
/* Attempts to permanently delete the Disk Storage data base named in
|
||||
"storageName". If successful, calls the "onsuccess" function passing
|
||||
the resulting event; if not successful, calls onfailure passing the
|
||||
resulting event */
|
||||
@@ -283,9 +284,9 @@ B5500DiskStorageConfig.prototype.deleteStorageDB = function deleteStorageDB(
|
||||
var that = this;
|
||||
|
||||
if (this.alertWin.confirm("This will PERMANENTLY DELETE the\n" +
|
||||
"Disk Storage database \"" + storageName + "\".\n\n" +
|
||||
"Disk Storage data base \"" + storageName + "\".\n\n" +
|
||||
"Are you sure you want to do this?\n")) {
|
||||
if (this.alertWin.confirm("Deletion of the Disk Storage database\n" +
|
||||
if (this.alertWin.confirm("Deletion of the Disk Storage data base\n" +
|
||||
"CANNOT BE UNDONE.\n\nAre you really sure?\n")) {
|
||||
if (this.db && this.db.name == storageName) {
|
||||
this.storageConfig = null;
|
||||
@@ -295,16 +296,16 @@ B5500DiskStorageConfig.prototype.deleteStorageDB = function deleteStorageDB(
|
||||
req = window.indexedDB.deleteDatabase(storageName);
|
||||
|
||||
req.onerror = function(ev) {
|
||||
that.alertWin.alert("CANNOT DELETE Disk Storage database:\n" + ev.target.error);
|
||||
that.alertWin.alert("CANNOT DELETE Disk Storage data base:\n" + ev.target.error);
|
||||
onfailure(ev);
|
||||
};
|
||||
|
||||
req.onblocked = function(ev) {
|
||||
that.alertWin.alert("Deletion of Disk Storage database is BLOCKED");
|
||||
that.alertWin.alert("Deletion of Disk Storage data base is BLOCKED");
|
||||
};
|
||||
|
||||
req.onsuccess = function(ev) {
|
||||
that.alertWin.alert("Disk Storage database \"" + storageName +
|
||||
that.alertWin.alert("Disk Storage data base \"" + storageName +
|
||||
"\"\n successfully deleted.");
|
||||
onsuccess(ev);
|
||||
sysConfig = new B5500SystemConfig();
|
||||
@@ -319,7 +320,7 @@ B5500DiskStorageConfig.prototype.modifyStorageSchema =
|
||||
function modifyStorageSchema(onsuccess, onfailure) {
|
||||
/* Called to trigger a schema upgrade. Before calling this method, the new
|
||||
EU configuration must be established and stored in the "CONFIG" store.
|
||||
This method simply closes the database and then reopens with with the next
|
||||
This method simply closes the data base and then reopens with with the next
|
||||
higher version number. That will trigger the onupgradeneeded event, and
|
||||
upgradeStorageSchema() will examine the new config structure, creating any
|
||||
new EUs as necessary. The "onsuccess" or "onfailure" callbacks are called
|
||||
@@ -333,7 +334,7 @@ B5500DiskStorageConfig.prototype.modifyStorageSchema =
|
||||
req = window.indexedDB.open(dbName, ver+1); // trigger the schema upgrade
|
||||
|
||||
req.onblocked = function(ev) {
|
||||
that.alertWin.alert("Database \"" + dbName +
|
||||
that.alertWin.alert("data base \"" + dbName +
|
||||
"\"\n open for schema upgrade is blocked");
|
||||
};
|
||||
|
||||
@@ -350,9 +351,9 @@ B5500DiskStorageConfig.prototype.modifyStorageSchema =
|
||||
that.db = ev.target.result;
|
||||
that.db.onerror = that.genericDBError; // set up global error handler
|
||||
// Since we know we just went through an onupgradeneeded event, we know
|
||||
// this database now has a "CONFIG" structure, so the extra tests in
|
||||
// this data base now has a "CONFIG" structure, so the extra tests in
|
||||
// openStorageDB() are not necessary.
|
||||
// that.alertWin.alert("Database \"" + dbName + "\" schema upgrade successful");
|
||||
// that.alertWin.alert("data base \"" + dbName + "\" schema upgrade successful");
|
||||
delete that.storageConfig;
|
||||
onsuccess(ev);
|
||||
};
|
||||
@@ -361,28 +362,28 @@ B5500DiskStorageConfig.prototype.modifyStorageSchema =
|
||||
/**************************************/
|
||||
B5500DiskStorageConfig.prototype.openStorageDB = function openStorageDB(
|
||||
storageName, onsuccess, onfailure) {
|
||||
/* Attempts to open the Disk Storage database named in "storageName".
|
||||
Handles, if necessary, a change in database version. If successful,
|
||||
/* Attempts to open the Disk Storage data base named in "storageName".
|
||||
Handles, if necessary, a change in data base version. If successful,
|
||||
calls the "onsuccess" function passing the success event. If not successful,
|
||||
calls the "onfailure" function passing the error event.
|
||||
|
||||
This process is just a little bit nasty, because the only time we can
|
||||
modify the DB schema to add new EUs is during an onupgradeneeded event.
|
||||
That event is fired only when the DB version increases. Therefore, we
|
||||
must normally open the database without specifying a version, as we have
|
||||
must normally open the data base without specifying a version, as we have
|
||||
no aprori idea what it might me. There are three possibilities:
|
||||
1. This is an open for a database that does not currently exist.
|
||||
1. This is an open for a data base that does not currently exist.
|
||||
The old version is 0 and the new version will be 1. The onupgrade-
|
||||
needed event will automatically fire, and upgradeStorageSchema()
|
||||
will create the "CONFIG" structure and an initial default EU.
|
||||
2. This is an open for an existing database that has a "CONFIG"
|
||||
2. This is an open for an existing data base that has a "CONFIG"
|
||||
structure. This is the simplest case, and proceeds like a normal
|
||||
IndexedDB open.
|
||||
3. This is an open for an existing database that does not have a
|
||||
3. This is an open for an existing data base that does not have a
|
||||
"CONFIG" structure. We have no idea what it is, so we throw up
|
||||
an alert, call onfailure(), and close the database before we do
|
||||
an alert, call onfailure(), and close the data base before we do
|
||||
any damage. The failure routine can, if it wishes, still access
|
||||
the database.
|
||||
the data base.
|
||||
*/
|
||||
var req; // IndexedDB open request
|
||||
var that = this;
|
||||
@@ -390,7 +391,7 @@ B5500DiskStorageConfig.prototype.openStorageDB = function openStorageDB(
|
||||
req = window.indexedDB.open(storageName); // open the current version, whatever it may be
|
||||
|
||||
req.onblocked = function(ev) {
|
||||
that.alertWin.alert("Database \"" + storageName + "\" open is blocked");
|
||||
that.alertWin.alert("data base \"" + storageName + "\" open is blocked");
|
||||
that.closeStorageDB();
|
||||
};
|
||||
|
||||
@@ -410,7 +411,7 @@ B5500DiskStorageConfig.prototype.openStorageDB = function openStorageDB(
|
||||
delete that.storageConfig;
|
||||
onsuccess(ev);
|
||||
} else {
|
||||
that.alertWin.alert("ERROR: Disk Storage database \"" + storageName +
|
||||
that.alertWin.alert("ERROR: Disk Storage data base \"" + storageName +
|
||||
"\"\nhas no CONFIG store");
|
||||
onfailure(ev);
|
||||
that.closeStorageDB();
|
||||
@@ -477,7 +478,7 @@ B5500DiskStorageConfig.prototype.getStorageConfig = function getStorageConfig(st
|
||||
var that = this;
|
||||
|
||||
function readConfig() {
|
||||
/* Reads the named system configuration structure from the database,
|
||||
/* Reads the named system configuration structure from the data base,
|
||||
then calls the successor function with the configuration object */
|
||||
var txn = that.db.transaction(that.storageConfigName);
|
||||
|
||||
@@ -490,7 +491,7 @@ B5500DiskStorageConfig.prototype.getStorageConfig = function getStorageConfig(st
|
||||
function onOpenFailure(ev) {
|
||||
that.storageConfig = null;
|
||||
that.alertWin.alert("getStorageConfig cannot open \"" + storageName +
|
||||
"\" database:\n" + ev.target.error);
|
||||
"\" data base:\n" + ev.target.error);
|
||||
successor(that.storageConfig);
|
||||
}
|
||||
|
||||
@@ -506,7 +507,7 @@ B5500DiskStorageConfig.prototype.getStorageConfig = function getStorageConfig(st
|
||||
B5500DiskStorageConfig.prototype.putStorageConfig = function putStorageConfig(
|
||||
config, successor) {
|
||||
/* Attempts to store the structure "config" to the Disk Storage
|
||||
database. The database name must be in config.storageName.
|
||||
data base. The data base name must be in config.storageName.
|
||||
If successful, calls "successor" passing the success event */
|
||||
var that = this;
|
||||
|
||||
@@ -528,7 +529,7 @@ B5500DiskStorageConfig.prototype.putStorageConfig = function putStorageConfig(
|
||||
function onOpenFailure(ev) {
|
||||
that.storageConfig = null;
|
||||
that.alertWin.alert("putStorageConfig cannot open \"" + storageName +
|
||||
"\" database:\n" + ev.target.error);
|
||||
"\" data base:\n" + ev.target.error);
|
||||
}
|
||||
|
||||
if (this.db && this.db.name == config.storageName) {
|
||||
@@ -596,7 +597,7 @@ B5500DiskStorageConfig.prototype.loadStorageDialog = function loadStorageDialog(
|
||||
|
||||
/**************************************/
|
||||
B5500DiskStorageConfig.prototype.saveStorageDialog = function saveStorageDialog(ev) {
|
||||
/* Saves the configuration UI window settings to the System Config database.
|
||||
/* Saves the configuration UI window settings to the System Config data base.
|
||||
A new config object is cloned from the prototype, then the current configuration
|
||||
is merged with the settings on the window form into the new object. If there
|
||||
are no errors, the new object is stored in "CONFIG" and the window is closed */
|
||||
@@ -698,7 +699,7 @@ B5500DiskStorageConfig.prototype.deleteStorageDialog = function deleteStorageDia
|
||||
var that = this;
|
||||
|
||||
function deleteFailed(ev) {
|
||||
that.alertWin.alert("Deletion of database \"" + storageName +
|
||||
that.alertWin.alert("Deletion of data base \"" + storageName +
|
||||
"\" failed: " + ev.target.error);
|
||||
}
|
||||
function deleteOK(ev) {
|
||||
@@ -719,6 +720,7 @@ B5500DiskStorageConfig.prototype.closeStorageUI = function closeStorageUI() {
|
||||
this.window.close();
|
||||
}
|
||||
this.window = null;
|
||||
this.doc = null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -729,27 +731,29 @@ B5500DiskStorageConfig.prototype.openStorageUI = function openStorageUI(storageN
|
||||
var that = this;
|
||||
|
||||
function storageUI_Open(ev) {
|
||||
this.doc = ev.target;
|
||||
this.window = this.doc.defaultView;
|
||||
this.alertWin = this.window;
|
||||
|
||||
this.window.moveTo(screen.availWidth-this.window.outerWidth-80,
|
||||
(screen.availHeight-this.window.outerHeight)/2);
|
||||
this.window.focus();
|
||||
|
||||
this.getStorageConfig(storageName,
|
||||
B5500CentralControl.bindMethod(this, this.loadStorageDialog));
|
||||
this.loadStorageDialog.bind(this));
|
||||
this.$$("StorageDeleteBtn").addEventListener("click", function(ev) {
|
||||
that.deleteStorageDialog(storageName);
|
||||
});
|
||||
this.$$("SaveBtn").addEventListener("click",
|
||||
B5500CentralControl.bindMethod(this, this.saveStorageDialog));
|
||||
this.saveStorageDialog.bind(this));
|
||||
this.$$("CancelBtn").addEventListener("click", function(ev) {
|
||||
that.window.close();
|
||||
});
|
||||
this.window.addEventListener("unload",
|
||||
B5500CentralControl.bindMethod(this, this.closeStorageUI), false);
|
||||
this.closeStorageUI.bind(this), false);
|
||||
}
|
||||
|
||||
this.doc = null;
|
||||
this.window = window.open("../webUI/B5500DiskStorageConfig.html", storageName+"_Config",
|
||||
"location=no,scrollbars,resizable,width=560,height=480");
|
||||
this.window.moveTo(screen.availWidth-this.window.outerWidth-80,
|
||||
(screen.availHeight-this.window.outerHeight)/2);
|
||||
this.window.focus();
|
||||
this.alertWin = this.window;
|
||||
this.window.addEventListener("load",
|
||||
B5500CentralControl.bindMethod(this, storageUI_Open), false);
|
||||
B5500Util.openPopup(window, "../webUI/B5500DiskStorageConfig.html", storageName+"_Config",
|
||||
"location=no,scrollbars,resizable,width=560,height=480",
|
||||
this, storageUI_Open);
|
||||
};
|
||||
|
||||
@@ -13,15 +13,15 @@
|
||||
* (EU) and Storage Units (SU) that make up the physical disk storage facility.
|
||||
*
|
||||
* Physical storage in this implementation is provided by a W3C IndexedDB
|
||||
* database local to the browser in which the emulator is running. There may
|
||||
* be multiple of these databases, but only one may be selected for use by an
|
||||
* instance of the emulator at a time. The database will be initialized to a
|
||||
* data base local to the browser in which the emulator is running. There may
|
||||
* be multiple of these data bases, but only one may be selected for use by an
|
||||
* instance of the emulator at a time. The data base will be initialized to a
|
||||
* default configuration the first time the emulator is used, and may be
|
||||
* modified using the system configuration UI in the B5500 Console, but see
|
||||
* below for considerations when using an existing database from emulator
|
||||
* below for considerations when using an existing data base from emulator
|
||||
* versions 0.20 and earlier.
|
||||
*
|
||||
* The database consists of a CONFIG object store and some number of "EUn"
|
||||
* The data base consists of a CONFIG object store and some number of "EUn"
|
||||
* object stores, where n is in 0..19. The CONFIG store contains an "EUn" member
|
||||
* for each such object store that specifies the characteristics of that EU:
|
||||
*
|
||||
@@ -50,13 +50,13 @@
|
||||
* versions, the configuration UI will attempt to preserve this older format,
|
||||
* and this device driver will accept that format, assuming Model-I disk and
|
||||
* a lockoutMask of 0. This will allow older versions of the emulator to
|
||||
* continue to use the IndexedDB database. Once the configuration of such a
|
||||
* database is changed, however, it will no longer be compatible with the
|
||||
* continue to use the IndexedDB data base. Once the configuration of such a
|
||||
* data base is changed, however, it will no longer be compatible with the
|
||||
* older version of the emulator, as the older emulator requires the IndexedDB
|
||||
* database version to be 1.
|
||||
* data base version to be 1.
|
||||
*
|
||||
* Within an EU, segments are represented in the database as 240-byte Uint8Array
|
||||
* objects, each with a database key corresponding to its numeric segment address.
|
||||
* Within an EU, segments are represented in the data base as 240-byte Uint8Array
|
||||
* objects, each with a data base key corresponding to its numeric segment address.
|
||||
* The segments in an EU are not pre-allocated, but are created as they are
|
||||
* written by IDB put() methods. When reading, any unallocated segments are
|
||||
* returned with their bytes set to 0x23 (#), which will be translated by the
|
||||
@@ -115,7 +115,7 @@
|
||||
* 2013-01-19 P.Kimpel
|
||||
* Original version, cloned from B5500DummyUnit.js.
|
||||
* 2014-08-25 P.Kimpel
|
||||
* Adapt to new EU configuration object format and selectable databases.
|
||||
* Adapt to new EU configuration object format and selectable data bases.
|
||||
***********************************************************************/
|
||||
"use strict";
|
||||
|
||||
@@ -133,15 +133,15 @@ function B5500DiskUnit(mnemonic, index, designate, statusChange, signal, options
|
||||
this.timer = 0; // setCallback() token
|
||||
this.initiateStamp = 0; // timestamp of last initiation (set by IOUnit)
|
||||
this.config = null; // copy of CONFIG store contents
|
||||
this.db = null; // the IDB database object
|
||||
this.db = null; // the IDB data base object
|
||||
this.sectorBuf = new Uint8Array(240); // sector buffer used by write()
|
||||
this.euPrefix = // prefix for EU object store names
|
||||
(mnemonic=="DKA" || options.DFX ? "EU" : "EU1");
|
||||
|
||||
this.stdFinish = B5500CentralControl.bindMethod(this, B5500DiskUnit.prototype.stdFinish);
|
||||
this.stdFinish = B5500DiskUnit.prototype.stdFinish.bind(this);
|
||||
|
||||
this.clear();
|
||||
this.openDatabase(); // attempt to open the IDB database
|
||||
this.openDatabase(); // attempt to open the IDB data base
|
||||
}
|
||||
|
||||
B5500DiskUnit.prototype.charXferRate = 96; // avg. transfer rate [characters/ms = KC/sec]
|
||||
@@ -169,17 +169,17 @@ B5500DiskUnit.prototype.stdFinish = function stdFinish(errorMask, length) {
|
||||
};
|
||||
|
||||
/**************************************/
|
||||
B5500DiskUnit.genericIDBError = function genericIDBError(ev) {
|
||||
/* Formats a generic alert when otherwise-unhandled database errors occur */
|
||||
B5500DiskUnit.prototype.genericIDBError = function genericIDBError(ev) {
|
||||
/* Formats a generic alert when otherwise-unhandled data base errors occur */
|
||||
|
||||
this.stdFinish(0x20, 0); // set a generic disk-parity error
|
||||
alert("Disk \"" + this.mnemonic + "\" database error: " + ev.target.result.error);
|
||||
alert("Disk \"" + this.mnemonic + "\" data base error: " + ev.target.result.error);
|
||||
};
|
||||
|
||||
/**************************************/
|
||||
B5500DiskUnit.prototype.copySegment = function copySegment(seg, buffer, offset) {
|
||||
/* Copies the bytes from a single segment Uint8Array object to "buffer" starting
|
||||
at "offset" for 240 bytes. If "seg" is undefined, copies zero bytes instead */
|
||||
at "offset" for 240 bytes. If "seg" is undefined, copies bytes of zero instead */
|
||||
var x;
|
||||
|
||||
if (seg) {
|
||||
@@ -195,7 +195,7 @@ B5500DiskUnit.prototype.copySegment = function copySegment(seg, buffer, offset)
|
||||
|
||||
/**************************************/
|
||||
B5500DiskUnit.prototype.loadStorageConfig = function loadStorageConfig(storageConfig) {
|
||||
/* Loads the storage configuration object from the storage database and
|
||||
/* Loads the storage configuration object from the storage data base and
|
||||
sets up the internal representation of that object for use by the driver */
|
||||
var config = B5500Util.deepCopy(storageConfig);
|
||||
var eu;
|
||||
@@ -214,7 +214,7 @@ B5500DiskUnit.prototype.loadStorageConfig = function loadStorageConfig(storageCo
|
||||
|
||||
/**************************************/
|
||||
B5500DiskUnit.prototype.openDatabase = function openDatabase() {
|
||||
/* Attempts to open the disk subsystem database specified by
|
||||
/* Attempts to open the disk subsystem data base specified by
|
||||
this.options.storageName. If successful, loads the EU configuration,
|
||||
sets this.db to the IDB object, and sets the DFCU to ready status */
|
||||
var dsc = new B5500DiskStorageConfig();
|
||||
@@ -225,13 +225,13 @@ B5500DiskUnit.prototype.openDatabase = function openDatabase() {
|
||||
|
||||
if (!config) {
|
||||
that.config = null;
|
||||
alert(that.mnemonic + ": CONFIG structure does not exist in\ndatabase \"" +
|
||||
alert(that.mnemonic + ": CONFIG structure does not exist in\ndata base \"" +
|
||||
that.options.storageName + "\" -- must recreate storage DB");
|
||||
} else {
|
||||
req = indexedDB.open(that.options.storageName); // accept any database version
|
||||
req = indexedDB.open(that.options.storageName); // accept any data base version
|
||||
|
||||
req.onerror = function idbOpenOnerror(ev) {
|
||||
alert("Cannot open " + that.mnemonic + " Disk Subsystem\ndatabase \"" +
|
||||
alert("Cannot open " + that.mnemonic + " Disk Subsystem\ndata base \"" +
|
||||
that.options.storageName + "\":\n" + ev.target.error);
|
||||
};
|
||||
|
||||
@@ -249,7 +249,7 @@ B5500DiskUnit.prototype.openDatabase = function openDatabase() {
|
||||
// Save the DB object reference globally for later use
|
||||
that.db = ev.target.result;
|
||||
// Set up the generic error handler
|
||||
that.db.onerror = B5500CentralControl.bindMethod(that, that.genericIDBError);
|
||||
that.db.onerror = that.genericIDBError.bind(that);
|
||||
that.loadStorageConfig(config);
|
||||
that.statusChange(1); // now report the DFCU as ready to Central Control
|
||||
dsc.closeStorageDB();
|
||||
@@ -259,8 +259,7 @@ B5500DiskUnit.prototype.openDatabase = function openDatabase() {
|
||||
}
|
||||
|
||||
this.statusChange(0); // initially force DFCU status to not ready
|
||||
dsc.getStorageConfig(this.options.storageName,
|
||||
B5500CentralControl.bindMethod(this, openStorageDB));
|
||||
dsc.getStorageConfig(this.options.storageName, openStorageDB.bind(this));
|
||||
};
|
||||
|
||||
/**************************************/
|
||||
@@ -295,7 +294,7 @@ B5500DiskUnit.prototype.read = function read(finish, buffer, length, mode, contr
|
||||
endAddr = eu.size-1;
|
||||
}
|
||||
finishTime = this.initiateStamp +
|
||||
Math.random()*eu.maxLatency + segs*240/eu.charXferRate;
|
||||
this.initiateStamp%eu.maxLatency + segs*240/eu.charXferRate;
|
||||
|
||||
if (segs < 1) { // No length specified, so just finish the I/O
|
||||
this.stdFinish(0, 0);
|
||||
@@ -370,7 +369,7 @@ B5500DiskUnit.prototype.write = function write(finish, buffer, length, mode, con
|
||||
var bx = 0; // current buffer offset
|
||||
var eu; // EU characteristics object
|
||||
var finishTime; // predicted time of I/O completion, ms
|
||||
var req; // IDB request object
|
||||
var req; // IDB request object
|
||||
var sectorBuf = this.sectorBuf; // local copy
|
||||
var that = this; // local object context
|
||||
var txn; // IDB transaction object
|
||||
@@ -398,7 +397,7 @@ B5500DiskUnit.prototype.write = function write(finish, buffer, length, mode, con
|
||||
endAddr = eu.size-1;
|
||||
}
|
||||
finishTime = this.initiateStamp +
|
||||
Math.random()*eu.maxLatency + segs*240/eu.charXferRate;
|
||||
this.initiateStamp%eu.maxLatency + segs*240/eu.charXferRate;
|
||||
|
||||
if (segs < 1) {
|
||||
// No length specified, so just finish the I/O
|
||||
@@ -486,7 +485,7 @@ B5500DiskUnit.prototype.readCheck = function readCheck(finish, length, control)
|
||||
endAddr = eu.size-1;
|
||||
}
|
||||
finishTime = this.initiateStamp +
|
||||
Math.random()*eu.maxLatency + segs*240/eu.charXferRate;
|
||||
this.initiateStamp%eu.maxLatency + segs*240/eu.charXferRate;
|
||||
|
||||
if (segs < 1) { // No length specified, so just finish the I/O
|
||||
finish(this.errorMask, 0);
|
||||
@@ -539,7 +538,7 @@ B5500DiskUnit.prototype.readInterrogate = function readInterrogate(finish, contr
|
||||
this.errorMask |= 0x10; // set D28F (lockout bit) to indicate Mod IB (slow) disk
|
||||
}
|
||||
this.timer = setCallback(this.mnemonic, this,
|
||||
Math.random()*eu.maxLatency + this.initiateStamp - performance.now(),
|
||||
this.initiateStamp%eu.maxLatency + this.initiateStamp - performance.now(),
|
||||
function readInterrogateTimeout() {
|
||||
this.stdFinish(0, 0);
|
||||
});
|
||||
@@ -571,7 +570,7 @@ B5500DiskUnit.prototype.writeInterrogate = function writeInterrogate(finish, con
|
||||
this.errorMask |= 0x20; // set D27F for invalid seg address
|
||||
}
|
||||
this.timer = setCallback(this.mnemonic, this,
|
||||
Math.random()*eu.maxLatency + this.initiateStamp - performance.now(),
|
||||
this.initiateStamp%eu.maxLatency + this.initiateStamp - performance.now(),
|
||||
function writeInterrogateTimeout() {
|
||||
this.stdFinish(0, 0);
|
||||
});
|
||||
|
||||
@@ -41,8 +41,6 @@ DIV.greenBar {
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id=Paper class=paper></div>
|
||||
<div id=EndOfPaper></div>
|
||||
</body>
|
||||
<!-- Don't add any additional whitespace to the BODY! -->
|
||||
<body><div id=Paper class=paper></div><div id=EndOfPaper></div></body>
|
||||
</html>
|
||||
@@ -35,17 +35,17 @@ function B5500LinePrinter(mnemonic, unitIndex, designate, statusChange, signal,
|
||||
|
||||
this.clear();
|
||||
|
||||
this.doc = null;
|
||||
this.doc = null; // printer UI document object
|
||||
this.window = null; // printer UI window object
|
||||
this.barGroup = null; // current greenbar line group
|
||||
this.paperDoc = null; // the content document for the paper frame
|
||||
this.paper = null; // the "paper" we print on
|
||||
this.endOfPaper = null; // dummy element used to control scrolling
|
||||
this.paperMeter = null; // <meter> element showing amount of paper remaining
|
||||
this.window = window.open("../webUI/B5500LinePrinter.html", mnemonic,
|
||||
B5500Util.openPopup(window, "../webUI/B5500LinePrinter.html", mnemonic,
|
||||
"location=no,scrollbars,resizable,width=" + w + ",height=" + h +
|
||||
",left=0,top=" + (screen.availHeight - h));
|
||||
this.window.addEventListener("load",
|
||||
B5500CentralControl.bindMethod(this, B5500LinePrinter.prototype.printerOnload), false);
|
||||
",left=0,top=" + (screen.availHeight - h),
|
||||
this, B5500LinePrinter.prototype.printerOnload);
|
||||
}
|
||||
|
||||
B5500LinePrinter.prototype.linesPerMinute = 1040; // B329 line printer
|
||||
@@ -72,7 +72,7 @@ B5500LinePrinter.prototype.clear = function clear() {
|
||||
this.paperLeft = this.maxPaperLines;// lines remaining in paper supply
|
||||
this.formFeedCount = 0; // counter for triple-formfeed => rip paper
|
||||
this.groupLinesLeft = 0; // lines remaining in current greenbar group
|
||||
this.topOfForm = false; // start new page flag
|
||||
this.atTopOfForm = false; // start new page flag
|
||||
};
|
||||
|
||||
/**************************************/
|
||||
@@ -81,13 +81,13 @@ B5500LinePrinter.prototype.setPrinterReady = function setPrinterReady(ready) {
|
||||
|
||||
if (ready && !this.ready) {
|
||||
this.statusChange(1);
|
||||
B5500Util.addClass(this.$$("LPStartBtn"), "greenLit")
|
||||
B5500Util.removeClass(this.$$("LPNotReadyLight"), "whiteLit");
|
||||
this.$$("LPStartBtn").classList.add("greenLit")
|
||||
this.$$("LPNotReadyLight").classList.remove("whiteLit");
|
||||
this.ready = true;
|
||||
} else if (!ready && this.ready) {
|
||||
this.statusChange(0);
|
||||
B5500Util.removeClass(this.$$("LPStartBtn"), "greenLit")
|
||||
B5500Util.addClass(this.$$("LPNotReadyLight"), "whiteLit");
|
||||
this.$$("LPStartBtn").classList.remove("greenLit")
|
||||
this.$$("LPNotReadyLight").classList.add("whiteLit");
|
||||
this.ready = false;
|
||||
}
|
||||
};
|
||||
@@ -97,7 +97,7 @@ B5500LinePrinter.prototype.ripPaper = function ripPaper(ev) {
|
||||
/* Handles an event to clear the "paper" from the printer */
|
||||
|
||||
this.formFeedCount = 0;
|
||||
B5500Util.removeClass(this.$$("LPEndOfPaperBtn"), "whiteLit");
|
||||
this.$$("LPEndOfPaperBtn").classList.remove("whiteLit");
|
||||
this.paperMeter.value = this.paperLeft = this.maxPaperLines;
|
||||
while (this.paper.firstChild) {
|
||||
this.paper.removeChild(this.paper.firstChild);
|
||||
@@ -112,20 +112,20 @@ B5500LinePrinter.prototype.copyPaper = function copyPaper(ev) {
|
||||
var barGroup = this.paper.firstChild;
|
||||
var text = "";
|
||||
var title = "B5500 " + this.mnemonic + " Paper Snapshot";
|
||||
var win = window.open("./B5500FramePaper.html", this.mnemonic + "-Snapshot",
|
||||
"scrollbars,resizable,width=500,height=500");
|
||||
|
||||
while (barGroup) {
|
||||
text += barGroup.textContent + "\n";
|
||||
barGroup = barGroup.nextSibling;
|
||||
}
|
||||
|
||||
win.moveTo((screen.availWidth-win.outerWidth)/2, (screen.availHeight-win.outerHeight)/2);
|
||||
win.addEventListener("load", function() {
|
||||
var doc;
|
||||
B5500Util.openPopup(this.window, "./B5500FramePaper.html", "",
|
||||
"scrollbars,resizable,width=500,height=500",
|
||||
this, function(ev) {
|
||||
var doc = ev.target;
|
||||
var win = doc.defaultView;
|
||||
|
||||
doc = win.document;
|
||||
doc.title = title;
|
||||
win.moveTo((screen.availWidth-win.outerWidth)/2, (screen.availHeight-win.outerHeight)/2);
|
||||
doc.getElementById("Paper").textContent = text;
|
||||
});
|
||||
|
||||
@@ -191,7 +191,7 @@ B5500LinePrinter.prototype.printLine = function printLine(text, control) {
|
||||
this.paperMeter.value = this.paperLeft -= lines;
|
||||
} else {
|
||||
this.setPrinterReady(false);
|
||||
B5500Util.addClass(this.$$("LPEndOfPaperBtn"), "whiteLit");
|
||||
this.$$("LPEndOfPaperBtn").classList.add("whiteLit");
|
||||
}
|
||||
};
|
||||
|
||||
@@ -298,7 +298,7 @@ B5500LinePrinter.prototype.LPEndOfPaperBtn_onclick = function LPEndOfPaperBtn_on
|
||||
|
||||
if (this.paperLeft <= 0 && !this.ready) {
|
||||
this.formFeedCount = 0;
|
||||
B5500Util.removeClass(this.$$("LPEndOfPaperBtn"), "whiteLit");
|
||||
this.$$("LPEndOfPaperBtn").classList.remove("whiteLit");
|
||||
this.setPrinterReady(true);
|
||||
}
|
||||
};
|
||||
@@ -328,11 +328,12 @@ B5500LinePrinter.prototype.beforeUnload = function beforeUnload(ev) {
|
||||
};
|
||||
|
||||
/**************************************/
|
||||
B5500LinePrinter.prototype.printerOnload = function printerOnload() {
|
||||
B5500LinePrinter.prototype.printerOnload = function printerOnload(ev) {
|
||||
/* Initializes the line printer window and user interface */
|
||||
var newChild;
|
||||
|
||||
this.doc = this.window.document;
|
||||
this.doc = ev.target;
|
||||
this.window = this.doc.defaultView;
|
||||
this.doc.title = "retro-B5500 Line Printer " + this.mnemonic;
|
||||
|
||||
this.paperDoc = this.$$("LPPaperFrame").contentDocument;
|
||||
@@ -355,21 +356,21 @@ B5500LinePrinter.prototype.printerOnload = function printerOnload() {
|
||||
this.window.addEventListener("beforeunload",
|
||||
B5500LinePrinter.prototype.beforeUnload, false);
|
||||
this.paper.addEventListener("dblclick",
|
||||
B5500CentralControl.bindMethod(this, B5500LinePrinter.prototype.copyPaper));
|
||||
B5500LinePrinter.prototype.copyPaper.bind(this), false);
|
||||
this.$$("LPEndOfPaperBtn").addEventListener("click",
|
||||
B5500CentralControl.bindMethod(this, B5500LinePrinter.prototype.LPEndOfPaperBtn_onclick), false);
|
||||
B5500LinePrinter.prototype.LPEndOfPaperBtn_onclick.bind(this), false);
|
||||
this.$$("LPFormFeedBtn").addEventListener("click",
|
||||
B5500CentralControl.bindMethod(this, B5500LinePrinter.prototype.LPFormFeedBtn_onclick), false);
|
||||
B5500LinePrinter.prototype.LPFormFeedBtn_onclick.bind(this), false);
|
||||
this.$$("LPSpaceBtn").addEventListener("click",
|
||||
B5500CentralControl.bindMethod(this, B5500LinePrinter.prototype.LPSpaceBtn_onclick), false);
|
||||
B5500LinePrinter.prototype.LPSpaceBtn_onclick.bind(this), false);
|
||||
this.$$("LPAlgolGlyphsCheck").addEventListener("click",
|
||||
B5500CentralControl.bindMethod(this, B5500LinePrinter.prototype.LPAlgolGlyphsCheck_onclick), false);
|
||||
B5500LinePrinter.prototype.LPAlgolGlyphsCheck_onclick.bind(this), false);
|
||||
this.$$("LPGreenbarCheck").addEventListener("click",
|
||||
B5500CentralControl.bindMethod(this, B5500LinePrinter.prototype.LPGreenbarCheck_onclick), false);
|
||||
B5500LinePrinter.prototype.LPGreenbarCheck_onclick.bind(this), false);
|
||||
this.$$("LPStopBtn").addEventListener("click",
|
||||
B5500CentralControl.bindMethod(this, B5500LinePrinter.prototype.LPStopBtn_onclick), false);
|
||||
B5500LinePrinter.prototype.LPStopBtn_onclick.bind(this), false);
|
||||
this.$$("LPStartBtn").addEventListener("click",
|
||||
B5500CentralControl.bindMethod(this, B5500LinePrinter.prototype.LPStartBtn_onclick), false);
|
||||
B5500LinePrinter.prototype.LPStartBtn_onclick.bind(this), false);
|
||||
|
||||
this.window.moveTo(0, screen.availHeight - this.window.outerHeight);
|
||||
};
|
||||
|
||||
@@ -48,10 +48,10 @@ function B5500MagTapeDrive(mnemonic, unitIndex, designate, statusChange, signal,
|
||||
this.reelIcon = null; // handle for the reel spinner
|
||||
|
||||
this.doc = null;
|
||||
this.window = window.open("../webUI/B5500MagTapeDrive.html", mnemonic,
|
||||
"location=no,scrollbars=no,resizable,width=560,height=120,left=280,top=" + y);
|
||||
this.window.addEventListener("load",
|
||||
B5500CentralControl.bindMethod(this, B5500MagTapeDrive.prototype.tapeDriveOnload), false);
|
||||
this.window = null;
|
||||
B5500Util.openPopup(window, "../webUI/B5500MagTapeDrive.html", mnemonic,
|
||||
"location=no,scrollbars=no,resizable,width=560,height=120,left=280,top=" + y,
|
||||
this, B5500MagTapeDrive.prototype.tapeDriveOnload);
|
||||
}
|
||||
|
||||
// this.tapeState enumerations
|
||||
@@ -192,7 +192,7 @@ B5500MagTapeDrive.prototype.moveTape = function moveTape(inches, delay, callBack
|
||||
/* Delays the I/O during tape motion, during which it animates the reel image
|
||||
icon. At the completion of the "delay" time in milliseconds, "callBack" is
|
||||
called with no parameters. */
|
||||
var delayLeft = delay; // milliseconds left to delay
|
||||
var delayLeft = Math.abs(delay); // milliseconds left to delay
|
||||
var direction = (inches < 0 ? -1 : 1);
|
||||
var inchesLeft = inches; // inches left to move tape
|
||||
var lastStamp = performance.now(); // last timestamp for spinDelay
|
||||
@@ -223,7 +223,7 @@ B5500MagTapeDrive.prototype.moveTape = function moveTape(inches, delay, callBack
|
||||
} else {
|
||||
this.timer = setCallback(this.mnemonic, this, delayLeft, spinFinish);
|
||||
}
|
||||
motion = inches*interval/delay;
|
||||
motion = inchesLeft*interval/delayLeft;
|
||||
if (inchesLeft*direction <= 0) { // inchesLeft crossed zero
|
||||
motion = inchesLeft = 0;
|
||||
} else if (motion*direction <= inchesLeft*direction) {
|
||||
@@ -232,6 +232,7 @@ B5500MagTapeDrive.prototype.moveTape = function moveTape(inches, delay, callBack
|
||||
motion = inchesLeft;
|
||||
inchesLeft = 0;
|
||||
}
|
||||
|
||||
this.spinReel(motion);
|
||||
}
|
||||
|
||||
@@ -246,12 +247,12 @@ B5500MagTapeDrive.prototype.setAtBOT = function setAtBOT(atBOT) {
|
||||
this.atBOT = atBOT;
|
||||
if (!atBOT) {
|
||||
this.botSensed = false;
|
||||
B5500Util.removeClass(this.$$("MTAtBOTLight"), "annunciatorLit");
|
||||
this.$$("MTAtBOTLight").classList.remove("annunciatorLit");
|
||||
} else {
|
||||
this.imgIndex = 0;
|
||||
this.tapeInches = 0;
|
||||
this.reelAngle = 0;
|
||||
B5500Util.addClass(this.$$("MTAtBOTLight"), "annunciatorLit");
|
||||
this.$$("MTAtBOTLight").classList.add("annunciatorLit");
|
||||
this.reelBar.value = this.imgMaxInches;
|
||||
this.reelIcon.style.transform = "none";
|
||||
}
|
||||
@@ -265,9 +266,9 @@ B5500MagTapeDrive.prototype.setAtEOT = function setAtEOT(atEOT) {
|
||||
if (atEOT ^ this.atEOT) {
|
||||
this.atEOT = atEOT;
|
||||
if (!atEOT) {
|
||||
B5500Util.removeClass(this.$$("MTAtEOTLight"), "annunciatorLit");
|
||||
this.$$("MTAtEOTLight").classList.remove("annunciatorLit");
|
||||
} else {
|
||||
B5500Util.addClass(this.$$("MTAtEOTLight"), "annunciatorLit");
|
||||
this.$$("MTAtEOTLight").classList.add("annunciatorLit");
|
||||
this.reelBar.value = 0;
|
||||
}
|
||||
}
|
||||
@@ -291,10 +292,10 @@ B5500MagTapeDrive.prototype.setTapeUnloaded = function setTapeUnloaded() {
|
||||
this.$$("MTRewindBtn").disabled = true;
|
||||
this.$$("MTWriteRingBtn").disabled = true;
|
||||
this.$$("MTFileName").value = "";
|
||||
B5500Util.removeClass(this.$$("MTRemoteBtn"), "yellowLit");
|
||||
B5500Util.addClass(this.$$("MTLocalBtn"), "yellowLit");
|
||||
B5500Util.removeClass(this.$$("MTWriteRingBtn"), "redLit");
|
||||
B5500Util.addClass(this.$$("MTUnloadedLight"), "annunciatorLit");
|
||||
this.$$("MTRemoteBtn").classList.remove("yellowLit");
|
||||
this.$$("MTLocalBtn").classList.add("yellowLit");
|
||||
this.$$("MTWriteRingBtn").classList.remove("redLit");
|
||||
this.$$("MTUnloadedLight").classList.add("annunciatorLit");
|
||||
this.setAtBOT(false);
|
||||
this.setAtEOT(false);
|
||||
this.reelBar.value = 0;
|
||||
@@ -321,13 +322,13 @@ B5500MagTapeDrive.prototype.setTapeRemote = function setTapeRemote(ready) {
|
||||
if (ready) {
|
||||
this.tapeState = this.tapeRemote;
|
||||
this.statusChange(1);
|
||||
B5500Util.removeClass(this.$$("MTLocalBtn"), "yellowLit");
|
||||
B5500Util.addClass(this.$$("MTRemoteBtn"), "yellowLit");
|
||||
this.$$("MTLocalBtn").classList.remove("yellowLit");
|
||||
this.$$("MTRemoteBtn").classList.add("yellowLit");
|
||||
} else {
|
||||
this.tapeState = this.tapeLocal;
|
||||
this.statusChange(0);
|
||||
B5500Util.removeClass(this.$$("MTRemoteBtn"), "yellowLit");
|
||||
B5500Util.addClass(this.$$("MTLocalBtn"), "yellowLit");
|
||||
this.$$("MTRemoteBtn").classList.remove("yellowLit");
|
||||
this.$$("MTLocalBtn").classList.add("yellowLit");
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -342,7 +343,7 @@ B5500MagTapeDrive.prototype.setWriteRing = function setWriteRing(writeRing) {
|
||||
case this.tapeRemote:
|
||||
if (this.writeRing && !writeRing) {
|
||||
this.writeRing = false;
|
||||
B5500Util.removeClass(this.$$("MTWriteRingBtn"), "redLit");
|
||||
this.$$("MTWriteRingBtn").classList.remove("redLit");
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -362,9 +363,7 @@ B5500MagTapeDrive.prototype.loadTape = function loadTape() {
|
||||
var tapeFormat = ""; // tape format code (bcd, aod, aev, etc.)
|
||||
var tapeInches = 0; // selected tape length in inches
|
||||
var tapeLengthSelect = null; // tape length list element
|
||||
var win = this.window.open("B5500MagTapeLoadPanel.html", this.mnemonic + "Load",
|
||||
"location=no,scrollbars=no,resizable,width=508,height=112,left=" +
|
||||
(this.window.screenX+16) +",top=" + (this.window.screenY+16));
|
||||
var win = null; // loader window object
|
||||
var writeRing = false; // true if write-enabled
|
||||
var writeRingCheck = null; // tape write ring checkbox element
|
||||
|
||||
@@ -417,14 +416,14 @@ B5500MagTapeDrive.prototype.loadTape = function loadTape() {
|
||||
mt.tapeState = mt.tapeLocal; // setTapeRemote() requires it not be unloaded
|
||||
mt.setTapeRemote(false);
|
||||
mt.reelIcon.style.visibility = "visible";
|
||||
B5500Util.removeClass(mt.$$("MTUnloadedLight"), "annunciatorLit");
|
||||
mt.$$("MTUnloadedLight").classList.remove("annunciatorLit");
|
||||
|
||||
mt.imgWritten = false;
|
||||
mt.writeRing = writeRing;
|
||||
if (writeRing) {
|
||||
B5500Util.addClass(mt.$$("MTWriteRingBtn"), "redLit");
|
||||
mt.$$("MTWriteRingBtn").classList.add("redLit");
|
||||
} else {
|
||||
B5500Util.removeClass(mt.$$("MTWriteRingBtn"), "redLit");
|
||||
mt.$$("MTWriteRingBtn").classList.remove("redLit");
|
||||
}
|
||||
|
||||
win.close();
|
||||
@@ -619,7 +618,10 @@ B5500MagTapeDrive.prototype.loadTape = function loadTape() {
|
||||
/* On-load handler for the tape loader window */
|
||||
var de;
|
||||
|
||||
doc = win.document;
|
||||
doc = ev.target;
|
||||
win = doc.defaultView;
|
||||
this.loadWindow = win;
|
||||
this.$$("MTLoadBtn").disabled = true;
|
||||
de = doc.documentElement;
|
||||
win.focus();
|
||||
$$$ = function $$$(id) {
|
||||
@@ -651,7 +653,6 @@ B5500MagTapeDrive.prototype.loadTape = function loadTape() {
|
||||
writeRingCheck.removeEventListener("click", tapeLoadWriteRingCheck, false);
|
||||
$$$("MTLoadOKBtn").removeEventListener("click", tapeLoadOK, false);
|
||||
$$$("MTLoadCancelBtn").removeEventListener("click", tapeLoadCancelBtn, false);
|
||||
win.removeEventListener("load", tapeLoadOnload, false);
|
||||
win.removeEventListener("unload", tapeLoadOnUnload, false);
|
||||
|
||||
mt.loadWindow = null;
|
||||
@@ -663,19 +664,19 @@ B5500MagTapeDrive.prototype.loadTape = function loadTape() {
|
||||
this.loadWindow.close();
|
||||
}
|
||||
|
||||
this.loadWindow = win;
|
||||
this.$$("MTLoadBtn").disabled = true;
|
||||
win.addEventListener("load", tapeLoadOnload, false);
|
||||
B5500Util.openPopup(this.window, "B5500MagTapeLoadPanel.html", this.mnemonic + "Load",
|
||||
"location=no,scrollbars=no,resizable,width=508,height=112,left=" +
|
||||
(this.window.screenX+16) +",top=" + (this.window.screenY+16),
|
||||
this, tapeLoadOnload);
|
||||
};
|
||||
|
||||
/**************************************/
|
||||
B5500MagTapeDrive.prototype.unloadTape = function unloadTape() {
|
||||
/* Reformats the tape image data as ASCII text and displays it in a new
|
||||
window so the user can save or copy/paste it elsewhere */
|
||||
var doc = null; // loader window.document
|
||||
var doc = null; // unloader window.document
|
||||
var mt = this; // tape drive object
|
||||
var win = this.window.open("./B5500FramePaper.html", this.mnemonic + "-Unload",
|
||||
"location=no,scrollbars=yes,resizable,width=800,height=600");
|
||||
var win = null; // unloader window object
|
||||
|
||||
function unloadDriver() {
|
||||
/* Converts the tape image to ASCII once the window has displayed the
|
||||
@@ -725,20 +726,23 @@ B5500MagTapeDrive.prototype.unloadTape = function unloadTape() {
|
||||
mt.setTapeUnloaded();
|
||||
}
|
||||
|
||||
function unloadSetup() {
|
||||
function unloadSetup(ev) {
|
||||
/* Loads a status message into the "paper" rendering area, then calls
|
||||
unloadDriver after a short wait to allow the message to appear */
|
||||
|
||||
win.removeEventListener("load", unloadSetup, false);
|
||||
doc = ev.target;
|
||||
win = doc.defaultView;
|
||||
win.document.getElementById("Paper").appendChild(
|
||||
win.document.createTextNode("Rendering tape image... please wait..."));
|
||||
win.moveTo((screen.availWidth-win.outerWidth)/2, (screen.availHeight-win.outerHeight)/2);
|
||||
win.focus();
|
||||
setTimeout(unloadDriver, 50);
|
||||
}
|
||||
|
||||
// Outer block of unloadTape
|
||||
win.moveTo((screen.availWidth-win.outerWidth)/2, (screen.availHeight-win.outerHeight)/2);
|
||||
win.focus();
|
||||
win.addEventListener("load", unloadSetup, false);
|
||||
B5500Util.openPopup(this.window, "./B5500FramePaper.html", "",
|
||||
"location=no,scrollbars=yes,resizable,width=800,height=600",
|
||||
this, unloadSetup);
|
||||
};
|
||||
|
||||
/**************************************/
|
||||
@@ -751,7 +755,7 @@ B5500MagTapeDrive.prototype.tapeRewind = function tapeRewind(makeReady) {
|
||||
function rewindFinish() {
|
||||
this.timer = 0;
|
||||
this.busy = false;
|
||||
B5500Util.removeClass(this.$$("MTRewindingLight"), "annunciatorLit");
|
||||
this.$$("MTRewindingLight").classList.remove("annunciatorLit");
|
||||
if (makeReady && this.tapeState == this.tapeRemote) {
|
||||
this.ready = true;
|
||||
this.statusChange(1);
|
||||
@@ -793,7 +797,7 @@ B5500MagTapeDrive.prototype.tapeRewind = function tapeRewind(makeReady) {
|
||||
this.ready = false;
|
||||
this.statusChange(0);
|
||||
this.setAtEOT(false);
|
||||
B5500Util.addClass(this.$$("MTRewindingLight"), "annunciatorLit");
|
||||
this.$$("MTRewindingLight").classList.add("annunciatorLit");
|
||||
this.timer = setCallback(this.mnemonic, this, 1000, rewindStart);
|
||||
}
|
||||
};
|
||||
@@ -1125,7 +1129,7 @@ B5500MagTapeDrive.prototype.bcdWrite = function bcdWrite(oddParity) {
|
||||
/* Writes the next block to the .bcd tape (this.image) in memory, translating
|
||||
the character frames from ANSI character codes based on the translation
|
||||
table "xlate". The translated data is stored at the current offset in
|
||||
this.buffer. The start of a block is indicated by setting its high-order bit set.
|
||||
this.buffer. The start of a block is indicated by setting its high-order bit.
|
||||
oddParity 0=Alpha (even parity), 1=Binary (odd parity) write
|
||||
Exits with the image index pointing beyond the last frame of the block (or beyond
|
||||
the end of the image blob if at the end). Returns the number of characters written
|
||||
@@ -1173,11 +1177,12 @@ B5500MagTapeDrive.prototype.beforeUnload = function beforeUnload(ev) {
|
||||
};
|
||||
|
||||
/**************************************/
|
||||
B5500MagTapeDrive.prototype.tapeDriveOnload = function tapeDriveOnload() {
|
||||
B5500MagTapeDrive.prototype.tapeDriveOnload = function tapeDriveOnload(ev) {
|
||||
/* Initializes the reader window and user interface */
|
||||
var de;
|
||||
|
||||
this.doc = this.window.document;
|
||||
this.doc = ev.target;
|
||||
this.window = this.doc.defaultView;
|
||||
de = this.doc.documentElement;
|
||||
this.doc.title = "retro-B5500 Tape Drive " + this.mnemonic;
|
||||
|
||||
@@ -1191,17 +1196,17 @@ B5500MagTapeDrive.prototype.tapeDriveOnload = function tapeDriveOnload() {
|
||||
this.window.addEventListener("beforeunload",
|
||||
B5500MagTapeDrive.prototype.beforeUnload, false);
|
||||
this.$$("MTUnloadBtn").addEventListener("click",
|
||||
B5500CentralControl.bindMethod(this, B5500MagTapeDrive.prototype.MTUnloadBtn_onclick), false);
|
||||
B5500MagTapeDrive.prototype.MTUnloadBtn_onclick.bind(this), false);
|
||||
this.$$("MTLoadBtn").addEventListener("click",
|
||||
B5500CentralControl.bindMethod(this, B5500MagTapeDrive.prototype.MTLoadBtn_onclick), false);
|
||||
B5500MagTapeDrive.prototype.MTLoadBtn_onclick.bind(this), false);
|
||||
this.$$("MTRemoteBtn").addEventListener("click",
|
||||
B5500CentralControl.bindMethod(this, B5500MagTapeDrive.prototype.MTRemoteBtn_onclick), false);
|
||||
B5500MagTapeDrive.prototype.MTRemoteBtn_onclick.bind(this), false);
|
||||
this.$$("MTLocalBtn").addEventListener("click",
|
||||
B5500CentralControl.bindMethod(this, B5500MagTapeDrive.prototype.MTLocalBtn_onclick), false);
|
||||
B5500MagTapeDrive.prototype.MTLocalBtn_onclick.bind(this), false);
|
||||
this.$$("MTWriteRingBtn").addEventListener("click",
|
||||
B5500CentralControl.bindMethod(this, B5500MagTapeDrive.prototype.MTWriteRingBtn_onclick), false);
|
||||
B5500MagTapeDrive.prototype.MTWriteRingBtn_onclick.bind(this), false);
|
||||
this.$$("MTRewindBtn").addEventListener("click",
|
||||
B5500CentralControl.bindMethod(this, B5500MagTapeDrive.prototype.MTRewindBtn_onclick), false);
|
||||
B5500MagTapeDrive.prototype.MTRewindBtn_onclick.bind(this), false);
|
||||
|
||||
this.window.resizeBy(de.scrollWidth - this.window.innerWidth + 4, // kludge for right-padding/margin
|
||||
de.scrollHeight - this.window.innerHeight);
|
||||
|
||||
@@ -1,61 +0,0 @@
|
||||
CACHE MANIFEST
|
||||
# retro-B5500 emulator 1.04, 2016-09-03 16:25
|
||||
|
||||
CACHE:
|
||||
../emulator/B5500CentralControl.js
|
||||
../emulator/B5500IOUnit.js
|
||||
../emulator/B5500Processor.js
|
||||
../emulator/B5500SystemConfiguration.js
|
||||
B5500BlankPaper.html
|
||||
B5500CardPunch.css
|
||||
B5500CardPunch.html
|
||||
B5500CardPunch.js
|
||||
B5500CardReader.css
|
||||
B5500CardReader.html
|
||||
B5500CardReaderKeyin.html
|
||||
B5500CardReader.js
|
||||
B5500ColdLoader.html
|
||||
B5500Common.css
|
||||
B5500Console.css
|
||||
B5500Console.html
|
||||
B5500Console.js
|
||||
B5500ConsolePanel.css
|
||||
B5500ConsolePanel.html
|
||||
B5500ConsolePanel.js
|
||||
B5500DatacomUnit.css
|
||||
B5500DatacomUnit.html
|
||||
B5500DatacomUnit.js
|
||||
B5500DiskStorageConfig.html
|
||||
B5500DiskStorageConfig.js
|
||||
B5500DiskUnit.js
|
||||
B5500DummyUnit.js
|
||||
B5500FramePaper.html
|
||||
B5500LinePrinter.css
|
||||
B5500LinePrinter.html
|
||||
B5500LinePrinter.js
|
||||
B5500MagTapeDrive.css
|
||||
B5500MagTapeDrive.html
|
||||
B5500MagTapeDrive.js
|
||||
B5500MagTapeLoadPanel.html
|
||||
B5500SetCallback.js
|
||||
B5500SPOUnit.css
|
||||
B5500SPOUnit.html
|
||||
B5500SPOUnit.js
|
||||
B5500SyllableDebugger.css
|
||||
B5500SyllableDebugger.html
|
||||
B5500SystemConfig.css
|
||||
B5500SystemConfig.html
|
||||
B5500SystemConfig.js
|
||||
B5500Util.js
|
||||
resources/B5500Logo.jpg
|
||||
resources/Burroughs-B5500-102646215-05-01-06.jpg
|
||||
resources/Burroughs-Logo-Neg.jpg
|
||||
resources/DejaVuSans-Bold-webfont.ttf
|
||||
resources/DejaVuSans-Bold-webfont.woff
|
||||
resources/DejaVuSans-webfont.ttf
|
||||
resources/DejaVuSans-webfont.woff
|
||||
resources/DejaVuSansMono-webfont.ttf
|
||||
resources/DejaVuSansMono-webfont.woff
|
||||
resources/MagTapeReel.jpg
|
||||
resources/retro-B5500-Logo.png
|
||||
resources/TeletypeLogo.gif
|
||||
@@ -39,14 +39,14 @@ function B5500SPOUnit(mnemonic, unitIndex, designate, statusChange, signal, opti
|
||||
this.clear();
|
||||
|
||||
this.doc = null;
|
||||
this.window = null;
|
||||
this.paper = null;
|
||||
this.inputBox = null;
|
||||
this.endOfPaper = null;
|
||||
this.window = window.open("../webUI/B5500SPOUnit.html", mnemonic,
|
||||
B5500Util.openPopup(window, "../webUI/B5500SPOUnit.html", mnemonic,
|
||||
"location=no,scrollbars=no,resizable,width=" + w + ",height=" + h +
|
||||
",left=" + (screen.availWidth - w) + ",top=" + (screen.availHeight - h));
|
||||
this.window.addEventListener("load", B5500CentralControl.bindMethod(this,
|
||||
B5500SPOUnit.prototype.spoOnload), false);
|
||||
",left=" + (screen.availWidth - w) + ",top=" + (screen.availHeight - h),
|
||||
this, B5500SPOUnit.prototype.spoOnload);
|
||||
}
|
||||
|
||||
// this.spoState enumerations
|
||||
@@ -98,11 +98,11 @@ B5500SPOUnit.prototype.setLocal = function setLocal() {
|
||||
this.spoInputRequested = false;
|
||||
this.spoState = this.spoLocal;
|
||||
this.endOfPaper.scrollIntoView();
|
||||
B5500Util.addClass(this.$$("SPOLocalBtn"), "yellowLit");
|
||||
B5500Util.addClass(this.inputBox, "visible");
|
||||
this.$$("SPOLocalBtn").classList.add("yellowLit");
|
||||
this.inputBox.classList.add("visible");
|
||||
this.inputBox.focus();
|
||||
B5500Util.removeClass(this.$$("SPORemoteBtn"), "yellowLit");
|
||||
B5500Util.removeClass(this.$$("SPOInputRequestBtn"), "yellowLit");
|
||||
this.$$("SPORemoteBtn").classList.remove("yellowLit");
|
||||
this.$$("SPOInputRequestBtn").classList.remove("yellowLit");
|
||||
this.statusChange(0);
|
||||
|
||||
// Set up to echo characters from the keyboard
|
||||
@@ -135,9 +135,9 @@ B5500SPOUnit.prototype.setRemote = function setRemote() {
|
||||
this.spoState = this.spoRemote;
|
||||
this.spoLocalRequested = false;
|
||||
this.spoInputRequested = false;
|
||||
B5500Util.addClass(this.$$("SPORemoteBtn"), "yellowLit");
|
||||
B5500Util.removeClass(this.$$("SPOLocalBtn"), "yellowLit");
|
||||
B5500Util.removeClass(this.inputBox, "visible");
|
||||
this.$$("SPORemoteBtn").classList.add("yellowLit");
|
||||
this.$$("SPOLocalBtn").classList.remove("yellowLit");
|
||||
this.inputBox.classList.remove("visible");
|
||||
this.window.focus();
|
||||
text = this.inputBox.value;
|
||||
if (text.length > 0) {
|
||||
@@ -165,9 +165,9 @@ B5500SPOUnit.prototype.setAlgolGlyphs = function setAlgolGlyphs(makeItPretty) {
|
||||
}
|
||||
this.useAlgolGlyphs = makeItPretty;
|
||||
if (makeItPretty) {
|
||||
B5500Util.addClass(this.$$("SPOAlgolGlyphsBtn"), "yellowLit");
|
||||
this.$$("SPOAlgolGlyphsBtn").classList.add("yellowLit");
|
||||
} else {
|
||||
B5500Util.removeClass(this.$$("SPOAlgolGlyphsBtn"), "yellowLit");
|
||||
this.$$("SPOAlgolGlyphsBtn").classList.remove("yellowLit");
|
||||
}
|
||||
};
|
||||
|
||||
@@ -266,7 +266,7 @@ B5500SPOUnit.prototype.requestInput = function requestInput() {
|
||||
case this.spoOutput:
|
||||
if (!this.spoInputRequested) {
|
||||
this.spoInputRequested = true;
|
||||
B5500Util.addClass(this.$$("SPOInputRequestBtn"), "yellowLit");
|
||||
this.$$("SPOInputRequestBtn").classList.add("yellowLit");
|
||||
this.signal(0); // Cause the Input Request interrupt
|
||||
}
|
||||
break;
|
||||
@@ -288,8 +288,8 @@ B5500SPOUnit.prototype.terminateInput = function terminateInput() {
|
||||
var x;
|
||||
|
||||
if (this.spoState == this.spoInput) {
|
||||
B5500Util.removeClass(this.$$("SPOReadyBtn"), "yellowLit");
|
||||
B5500Util.removeClass(this.inputBox, "visible");
|
||||
this.$$("SPOReadyBtn").classList.remove("yellowLit");
|
||||
this.inputBox.classList.remove("visible");
|
||||
this.appendEmptyLine(text.substring(0, 72));
|
||||
for (x=0; x<len; ++x) {
|
||||
this.buffer[this.bufIndex++] = text.charCodeAt(x);
|
||||
@@ -415,15 +415,15 @@ B5500SPOUnit.prototype.copyPaper = function copyPaper(ev) {
|
||||
or saved by the user */
|
||||
var text = ev.target.textContent;
|
||||
var title = "B5500 " + this.mnemonic + " Text 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;
|
||||
B5500Util.openPopup(this.window, "./B5500FramePaper.html", "",
|
||||
"scrollbars,resizable,width=500,height=500",
|
||||
this, function(ev) {
|
||||
var doc = ev.target;
|
||||
var win = doc.defaultView;
|
||||
|
||||
doc = win.document;
|
||||
doc.title = title;
|
||||
win.moveTo((screen.availWidth-win.outerWidth)/2, (screen.availHeight-win.outerHeight)/2);
|
||||
doc.getElementById("Paper").textContent = text;
|
||||
});
|
||||
|
||||
@@ -472,11 +472,12 @@ B5500SPOUnit.prototype.printText = function printText(msg, finish) {
|
||||
};
|
||||
|
||||
/**************************************/
|
||||
B5500SPOUnit.prototype.spoOnload = function spoOnload() {
|
||||
B5500SPOUnit.prototype.spoOnload = function spoOnload(ev) {
|
||||
/* Initializes the SPO window and user interface */
|
||||
var x;
|
||||
|
||||
this.doc = this.window.document;
|
||||
this.doc = ev.target;
|
||||
this.window = this.doc.defaultView;
|
||||
this.doc.title = "retro-B5500 " + this.mnemonic;
|
||||
this.paper = this.$$("Paper");
|
||||
this.inputBox = this.$$("InputBox");
|
||||
@@ -487,38 +488,38 @@ B5500SPOUnit.prototype.spoOnload = function spoOnload() {
|
||||
this.window.addEventListener("beforeunload",
|
||||
B5500SPOUnit.prototype.beforeUnload, false);
|
||||
this.window.addEventListener("resize",
|
||||
B5500CentralControl.bindMethod(this, B5500SPOUnit.prototype.resizeWindow), false);
|
||||
B5500SPOUnit.prototype.resizeWindow.bind(this), false);
|
||||
this.window.addEventListener("keydown",
|
||||
B5500CentralControl.bindMethod(this, B5500SPOUnit.prototype.keyDown), false);
|
||||
B5500SPOUnit.prototype.keyDown.bind(this), false);
|
||||
this.$$("SPOUT").addEventListener("keydown",
|
||||
B5500CentralControl.bindMethod(this, B5500SPOUnit.prototype.keyDown), false);
|
||||
B5500SPOUnit.prototype.keyDown.bind(this), false);
|
||||
this.inputBox.addEventListener("keydown",
|
||||
B5500CentralControl.bindMethod(this, B5500SPOUnit.prototype.keyDown), false);
|
||||
B5500SPOUnit.prototype.keyDown.bind(this), false);
|
||||
this.inputBox.addEventListener("keypress",
|
||||
B5500CentralControl.bindMethod(this, B5500SPOUnit.prototype.keyPress), false);
|
||||
B5500SPOUnit.prototype.keyPress.bind(this), false);
|
||||
this.paper.addEventListener("dblclick",
|
||||
B5500CentralControl.bindMethod(this, B5500SPOUnit.prototype.copyPaper), false);
|
||||
B5500SPOUnit.prototype.copyPaper.bind(this), false);
|
||||
this.$$("SPORemoteBtn").addEventListener("click",
|
||||
B5500CentralControl.bindMethod(this, B5500SPOUnit.prototype.setRemote), false);
|
||||
B5500SPOUnit.prototype.setRemote.bind(this), false);
|
||||
this.$$("SPOLocalBtn").addEventListener("click",
|
||||
B5500CentralControl.bindMethod(this, B5500SPOUnit.prototype.requestLocal), false);
|
||||
B5500SPOUnit.prototype.requestLocal.bind(this), false);
|
||||
this.$$("SPOInputRequestBtn").addEventListener("click",
|
||||
B5500CentralControl.bindMethod(this, B5500SPOUnit.prototype.requestInput), false);
|
||||
B5500SPOUnit.prototype.requestInput.bind(this), false);
|
||||
this.$$("SPOErrorBtn").addEventListener("click",
|
||||
B5500CentralControl.bindMethod(this, B5500SPOUnit.prototype.cancelInput), false);
|
||||
B5500SPOUnit.prototype.cancelInput.bind(this), false);
|
||||
this.$$("SPOEndOfMessageBtn").addEventListener("click",
|
||||
B5500CentralControl.bindMethod(this, B5500SPOUnit.prototype.terminateInput), false);
|
||||
B5500SPOUnit.prototype.terminateInput.bind(this), false);
|
||||
this.$$("SPOAlgolGlyphsBtn").addEventListener("click",
|
||||
B5500CentralControl.bindMethod(this, B5500SPOUnit.prototype.SPOAlgolGlyphsBtn_onclick), false);
|
||||
B5500SPOUnit.prototype.SPOAlgolGlyphsBtn_onclick.bind(this), false);
|
||||
|
||||
this.window.focus();
|
||||
this.printText("retro-B5500 Emulator Version " + B5500CentralControl.version,
|
||||
B5500CentralControl.bindMethod(this, function initFinish() {
|
||||
function initFinish() {
|
||||
this.setRemote();
|
||||
this.appendEmptyLine("\xA0");
|
||||
this.endOfPaper.scrollIntoView();
|
||||
this.signal(-1); // re-focus the Console window
|
||||
}));
|
||||
}.bind(this));
|
||||
|
||||
// Kludge for Chrome window.outerWidth/Height timing bug
|
||||
setCallback(null, this, 100, function chromeBug() {
|
||||
@@ -536,10 +537,10 @@ B5500SPOUnit.prototype.read = function read(finish, buffer, length, mode, contro
|
||||
case this.spoRemote:
|
||||
this.spoState = this.spoInput;
|
||||
this.spoInputRequested = false;
|
||||
B5500Util.addClass(this.$$("SPOReadyBtn"), "yellowLit");
|
||||
B5500Util.removeClass(this.$$("SPOInputRequestBtn"), "yellowLit");
|
||||
this.$$("SPOReadyBtn").classList.add("yellowLit");
|
||||
this.$$("SPOInputRequestBtn").classList.remove("yellowLit");
|
||||
this.endOfPaper.scrollIntoView();
|
||||
B5500Util.addClass(this.inputBox, "visible");
|
||||
this.inputBox.classList.add("visible");
|
||||
this.inputBox.focus();
|
||||
this.buffer = buffer;
|
||||
this.bufLength = length;
|
||||
|
||||
@@ -1,282 +1,281 @@
|
||||
/***********************************************************************
|
||||
* retro-b5500/webUI B5500SetCallback.js
|
||||
************************************************************************
|
||||
* Copyright (c) 2013, Nigel Williams and Paul Kimpel.
|
||||
* Licensed under the MIT License, see
|
||||
* http://www.opensource.org/licenses/mit-license.php
|
||||
************************************************************************
|
||||
* B5500 emulator universal function call-back module.
|
||||
*
|
||||
* Implements a combination setTimeout() and setImmediate() facility for the
|
||||
* B5500 emulator web-based user interface. setCallback() is used the same way
|
||||
* that setTimeout() is used, except that for low values of the timeout parameter,
|
||||
* it merely yields control to any other pending events and timers before calling
|
||||
* the call-back function.
|
||||
*
|
||||
* This facility is needed because modern browsers implement a minimum delay
|
||||
* when calling setTimeout(). HTML5 specs require 4ms, but browsers vary in the
|
||||
* minimum they use, and their precision in activating the call-back function
|
||||
* once the actual delay is established varies even more. This module will use
|
||||
* setTimeout() if the requested delay time is above a certain threshold, and
|
||||
* a setImmediate()-like mechanism (based on window.postMessage) if the requested
|
||||
* delay is below that threshold.
|
||||
*
|
||||
* To help compensate for the fact that the call-back function may be called
|
||||
* sooner than requested, and that due either to other activity or to browser
|
||||
* limitations the delay may be longer than requested, the timing behavior of
|
||||
* setCallback() may be divided into "categories." For each category, a separate
|
||||
* record is kept of the current total deviation between the requested delay and
|
||||
* the actual delay. A portion of this deviation is then applied to the requested
|
||||
* delay on subsequent calls in an attempt to smooth out the differences. We are
|
||||
* going for good average behavior here, and some too-quick call-backs are better
|
||||
* than consistently too-long callbacks in this environment, so that I/Os can be
|
||||
* initiated and their finish detected in finer-grained time increments.
|
||||
*
|
||||
* The SetCallback mechanism defines three functions that become members of the
|
||||
* global (window) object:
|
||||
*
|
||||
* token = setCallback(category, context, delay, fcn[, arg])
|
||||
*
|
||||
* Requests that the function "fcn" be called after "delay" milliseconds.
|
||||
* The function will be called as a method of "context", passing a
|
||||
* single optional argument "arg". The call-back "fcn" may be called
|
||||
* earlier or later than the specified delay. The string "category" (which
|
||||
* may be empty, null, or undefined) defines the category under which the
|
||||
* average delay difference will be maintained. setCallBack returns a
|
||||
* numeric token identifying the call-back event, which can be used
|
||||
* with clearCallback(). Note that passing a string in lieu of a function
|
||||
* object is not permitted.
|
||||
*
|
||||
* clearCallBack(token)
|
||||
*
|
||||
* Cancels a pending call-back event, if in fact it is still pending.
|
||||
* The "token" parameter is a value returned from setCallback().
|
||||
*
|
||||
* object = getCallbackState(optionMask)
|
||||
*
|
||||
* This is a diagnostic function intended for use in monitoring the callback
|
||||
* mechanism. It returns an object that, depending upon bits set in its mask
|
||||
* parameter, contains copies of the lastTokenNr value, poolLength
|
||||
* value, current delayDev hash, pendingCallbacks hash, and pool array.
|
||||
* The optionMask parameter supports the following bit values:
|
||||
* bit 0x01: delayDev hash
|
||||
* bit 0x02: pendingCallbacks hash
|
||||
* bit 0x04: pool array
|
||||
* The lastTokenNr and poolLength values are always returned. If no mask
|
||||
* is supplied, no additional items are returned.
|
||||
*
|
||||
* This implementation has been inspired by Domenic Denicola's shim for the
|
||||
* setImmediate() API at https://github.com/NobleJS/setImmediate, and
|
||||
* David Baron's setZeroTimeout() implemenmentation described in his blog
|
||||
* at http://dbaron.org/log/20100309-faster-timeouts.
|
||||
*
|
||||
* I stole a little of their code, too.
|
||||
*
|
||||
************************************************************************
|
||||
* 2013-08-04 P.Kimpel
|
||||
* Original version, cloned from B5500DiskUnit.js.
|
||||
* 2014-04-05 P.Kimpel
|
||||
* Change calling sequence to add "category" parameter; reorder setCallback
|
||||
* parameters into a more reasonable sequence; implement call-back pooling.
|
||||
* 2014-12-14 P.Kimpel
|
||||
* Added getCallbackState() diagnostic function, changed "cookie" to "token".
|
||||
* 2015-08-09 P.Kimpel
|
||||
* Implement new method of delay deviation accounting and delay adjustment.
|
||||
***********************************************************************/
|
||||
"use strict";
|
||||
|
||||
(function (global) {
|
||||
/* Define a closure for the setCallback() mechanism */
|
||||
var delayDev = {NUL: 0}; // hash of delay time deviations by category
|
||||
var minTimeout = 4; // minimum setTimeout() threshold, milliseconds
|
||||
var lastTokenNr = 0; // last setCallback token return value
|
||||
var pendingCallbacks = {}; // hash of pending callbacks, indexed by token as a string
|
||||
var perf = global.performance; // cached window.performance object
|
||||
var pool = []; // pool of reusable callback objects
|
||||
var poolLength = 0; // length of active entries in pool
|
||||
var secretPrefix = "retro-b5500.webUI." + Date.now().toString(16);
|
||||
|
||||
/**************************************/
|
||||
function activateCallback(token) {
|
||||
/* Activates a callback after its delay period has expired */
|
||||
var category;
|
||||
var endStamp = perf.now();
|
||||
var thisCallback;
|
||||
var tokenName = token.toString();
|
||||
|
||||
thisCallback = pendingCallbacks[tokenName];
|
||||
if (thisCallback) {
|
||||
delete pendingCallbacks[tokenName];
|
||||
category = thisCallback.category;
|
||||
if (category) {
|
||||
delayDev[category] += endStamp - thisCallback.startStamp - thisCallback.delay;
|
||||
}
|
||||
try {
|
||||
thisCallback.fcn.call(thisCallback.context, thisCallback.arg);
|
||||
} catch (err) {
|
||||
console.log("B5500SetCallback.activateCallback: " + err.name + ", " + err.message);
|
||||
}
|
||||
|
||||
thisCallback.context = null;
|
||||
thisCallback.fcn = null;
|
||||
thisCallback.arg = null;
|
||||
pool[poolLength++] = thisCallback;
|
||||
}
|
||||
}
|
||||
|
||||
/**************************************/
|
||||
function clearCallback(token) {
|
||||
/* Disables a pending callback, if it still exists and is still pending */
|
||||
var thisCallback;
|
||||
var tokenName = token.toString();
|
||||
|
||||
thisCallback = pendingCallbacks[tokenName];
|
||||
if (thisCallback) {
|
||||
delete pendingCallbacks[tokenName];
|
||||
if (thisCallback.isTimeout) {
|
||||
if (thisCallback.cancelToken) {
|
||||
global.clearTimeout(thisCallback.cancelToken);
|
||||
}
|
||||
}
|
||||
|
||||
thisCallback.context = null;
|
||||
thisCallback.fcn = null;
|
||||
thisCallback.arg = null;
|
||||
pool[poolLength++] = thisCallback;
|
||||
}
|
||||
}
|
||||
|
||||
/**************************************/
|
||||
function setCallback(category, context, callbackDelay, fcn, arg) {
|
||||
/* Sets up and schedules a callback for function "fcn", called with context
|
||||
"context", after a delay of "delay" ms. An optional "arg" value will be passed
|
||||
to "fcn". If the delay is less than "minTimeout", a setImmediate-like mechanism
|
||||
based on window.postsMessage() will be used; otherwise the environment's standard
|
||||
setTimeout mechanism will be used */
|
||||
var categoryName = (category || "NUL").toString();
|
||||
var delay = callbackDelay || 0; // actual delay to be generated
|
||||
var delayBias; // current amount of delay deviation
|
||||
var ratio; // ratio of delay to delayBias
|
||||
var thisCallback; // call-back object to be used
|
||||
var token = ++lastTokenNr; // call-back token number
|
||||
var tokenName = token.toString(); // call-back token ID
|
||||
|
||||
// Allocate a call-back object from the pool.
|
||||
if (poolLength <= 0) {
|
||||
thisCallback = {};
|
||||
} else {
|
||||
thisCallback = pool[--poolLength];
|
||||
pool[poolLength] = null;
|
||||
}
|
||||
|
||||
delayBias = delayDev[categoryName];
|
||||
if (!delayBias) {
|
||||
delayDev[categoryName] = 0; // got a new one
|
||||
} else {
|
||||
ratio = delay/delayBias;
|
||||
if (ratio > 1) {
|
||||
delay -= delayBias;
|
||||
delayDev[categoryName] = 0;
|
||||
} else if (ratio > 0) {
|
||||
delayDev[categoryName] -= delay;
|
||||
delay = 0;
|
||||
} else if (ratio < -1) {
|
||||
delay += delayBias;
|
||||
delayDev[categoryName] = 0;
|
||||
} else {
|
||||
delayDev[categoryName] += delay;
|
||||
delay = 0;
|
||||
}
|
||||
}
|
||||
|
||||
// Fill in the call-back object and tank it in pendingCallbacks.
|
||||
thisCallback.startStamp = perf.now();
|
||||
thisCallback.category = categoryName;
|
||||
thisCallback.context = context || this;
|
||||
thisCallback.delay = delay;
|
||||
thisCallback.fcn = fcn;
|
||||
thisCallback.arg = arg;
|
||||
pendingCallbacks[tokenName] = thisCallback;
|
||||
|
||||
// Decide whether to do a time wait or just a yield.
|
||||
if (delay > minTimeout) {
|
||||
thisCallback.isTimeout = true;
|
||||
thisCallback.cancelToken = global.setTimeout(activateCallback, delay, token);
|
||||
} else {
|
||||
thisCallback.isTimeout = false;
|
||||
thisCallback.cancelToken = 0;
|
||||
global.postMessage(secretPrefix + tokenName, "*");
|
||||
}
|
||||
|
||||
return token;
|
||||
}
|
||||
|
||||
/**************************************/
|
||||
function onMessage(ev) {
|
||||
/* Handler for the global.onmessage event. Activates the callback */
|
||||
var payload;
|
||||
|
||||
if (ev.source === global) {
|
||||
payload = ev.data.toString();
|
||||
if (payload.substring(0, secretPrefix.length) === secretPrefix) {
|
||||
activateCallback(payload.substring(secretPrefix.length));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**************************************/
|
||||
function getCallbackState(optionMask) {
|
||||
/* Diagnostic function. Returns an object that, depending upon bits in
|
||||
the option mask, contains copies of the lastTokenNr value, poolLength
|
||||
value, current delayDev hash, pendingCallbacks hash, and pool array.
|
||||
bit 0x01: delayDev hash
|
||||
bit 0x02: pendingCallbacks hash
|
||||
bit 0x04: pool array
|
||||
If no mask is supplied, no additional items are returned */
|
||||
var e;
|
||||
var mask = optionMask || 0;
|
||||
var state = {
|
||||
lastTokenNr: lastTokenNr,
|
||||
poolLength: poolLength,
|
||||
delayDev: {},
|
||||
pendingCallbacks: {},
|
||||
pool: []};
|
||||
|
||||
if (mask & 0x01) {
|
||||
for (e in delayDev) {
|
||||
state.delayDev[e] = delayDev[e];
|
||||
}
|
||||
}
|
||||
if (mask & 0x02) {
|
||||
for (e in pendingCallbacks) {
|
||||
state.pendingCallbacks[e] = pendingCallbacks[e];
|
||||
}
|
||||
}
|
||||
if (mask & 0x04) {
|
||||
for (e=0; e<poolLength; ++e) {
|
||||
state.pool[e] = pool[e];
|
||||
}
|
||||
}
|
||||
|
||||
return state;
|
||||
}
|
||||
|
||||
/********** Outer block of anonymous closure **********/
|
||||
if (!global.setCallback && global.postMessage && !global.importScripts) {
|
||||
// Attach to the prototype of global, if possible, otherwise to global itself
|
||||
var attachee = global;
|
||||
|
||||
/*****
|
||||
if (typeof Object.getPrototypeOf === "function") {
|
||||
if ("setTimeout" in Object.getPrototypeOf(global)) {
|
||||
attachee = Object.getPrototypeOf(global);
|
||||
}
|
||||
}
|
||||
*****/
|
||||
|
||||
global.addEventListener("message", onMessage, false);
|
||||
attachee.setCallback = setCallback;
|
||||
attachee.clearCallback = clearCallback;
|
||||
attachee.getCallbackState = getCallbackState;
|
||||
}
|
||||
}(typeof global === "object" && global ? global : this));
|
||||
/***********************************************************************
|
||||
* retro-b5500/webUI B5500SetCallback.js
|
||||
************************************************************************
|
||||
* Copyright (c) 2013,2017, Nigel Williams and Paul Kimpel.
|
||||
* Licensed under the MIT License, see
|
||||
* http://www.opensource.org/licenses/mit-license.php
|
||||
************************************************************************
|
||||
* B5500 emulator universal function call-back module.
|
||||
*
|
||||
* Implements a combination setTimeout() and setImmediate() facility for the
|
||||
* B5500 emulator web-based user interface. setCallback() is used in a manner
|
||||
* similar to setTimeout(), except that for low values of the timeout parameter
|
||||
* it merely yields control to any other pending events and timers before calling
|
||||
* the call-back function.
|
||||
*
|
||||
* This facility is needed because modern browsers implement a minimum delay
|
||||
* when calling setTimeout(). HTML5 specs require 4ms, but browsers vary in the
|
||||
* minimum they use, and their precision in activating the call-back function
|
||||
* once the actual delay is established varies even more. This module will use
|
||||
* setTimeout() if the requested delay time is above a certain threshold, and
|
||||
* a setImmediate-like mechanism (based on Promise) if the requested delay is
|
||||
* below that threshold.
|
||||
*
|
||||
* To help compensate for the fact that the call-back function may be called
|
||||
* sooner than requested, and that due either to other activity or to browser
|
||||
* limitations the delay may be longer than requested, the timing behavior of
|
||||
* setCallback() may be divided into "categories." For each category, a separate
|
||||
* record is kept of the current total deviation between the requested delay and
|
||||
* the actual delay. A portion of this deviation is then applied to the requested
|
||||
* delay on subsequent calls in an attempt to smooth out the differences. We are
|
||||
* going for good average behavior here, and some too-quick call-backs are better
|
||||
* than consistently too-long callbacks in this environment, particularly so that
|
||||
* I/Os can be initiated and their finish detected in finer-grained time increments.
|
||||
*
|
||||
* The SetCallback mechanism defines three functions that become members of the
|
||||
* global (window) object:
|
||||
*
|
||||
* token = setCallback(category, context, delay, fcn[, arg])
|
||||
*
|
||||
* Requests that the function "fcn" be called after "delay" milliseconds.
|
||||
* The function will be called as a method of "context", passing a
|
||||
* single optional argument "arg". The call-back "fcn" may be called
|
||||
* earlier or later than the specified delay. The string "category" (which
|
||||
* may be empty, null, or undefined) defines the category under which the
|
||||
* average delay difference will be maintained. setCallBack returns a
|
||||
* numeric token identifying the call-back event, which can be used with
|
||||
* clearCallback() to cancel the callback. Note that passing a string in
|
||||
* lieu of a function object is not permitted.
|
||||
*
|
||||
* clearCallBack(token)
|
||||
*
|
||||
* Cancels a pending call-back event, if in fact it is still pending.
|
||||
* The "token" parameter is a value returned from setCallback().
|
||||
*
|
||||
* object = getCallbackState(optionMask)
|
||||
*
|
||||
* This is a diagnostic function intended for use in monitoring the callback
|
||||
* mechanism. It returns an object that, depending upon bits set in its mask
|
||||
* parameter, contains copies of the lastTokenNr value, poolLength
|
||||
* value, current delayDev hash, pendingCallbacks hash, and pool array.
|
||||
* The optionMask parameter supports the following bit values:
|
||||
* bit 0x01: delayDev hash
|
||||
* bit 0x02: pendingCallbacks hash
|
||||
* bit 0x04: pool array
|
||||
* The lastTokenNr and poolLength values are always returned. If no mask
|
||||
* is supplied, no additional items are returned.
|
||||
*
|
||||
* This implementation has been inspired by Domenic Denicola's shim for the
|
||||
* setImmediate() API at https://github.com/NobleJS/setImmediate, and
|
||||
* David Baron's setZeroTimeout() implemenmentation described in his blog
|
||||
* at http://dbaron.org/log/20100309-faster-timeouts.
|
||||
*
|
||||
* I stole a little of their code, too.
|
||||
*
|
||||
************************************************************************
|
||||
* 2013-08-04 P.Kimpel
|
||||
* Original version, cloned from B5500DiskUnit.js.
|
||||
* 2014-04-05 P.Kimpel
|
||||
* Change calling sequence to add "category" parameter; reorder setCallback
|
||||
* parameters into a more reasonable sequence; implement call-back pooling.
|
||||
* 2014-12-14 P.Kimpel
|
||||
* Added getCallbackState() diagnostic function, changed "cookie" to "token".
|
||||
* 2015-08-09 P.Kimpel
|
||||
* Implement new method of delay deviation accounting and delay adjustment.
|
||||
* 2017-11-23 P.Kimpel
|
||||
* Redesign yet again the delay adjustment mechanism with one from the
|
||||
* retro-205 project. Replace window.postMessage yield mechanism with one
|
||||
* from the retro-220 project based on Promise().
|
||||
***********************************************************************/
|
||||
"use strict";
|
||||
|
||||
(function (global) {
|
||||
/* Define a closure for the setCallback() mechanism */
|
||||
var alpha = 0.25; // decay factor for delay deviation adjustment
|
||||
var delayDev = {NUL: 0}; // hash of delay time deviations by category
|
||||
var minTimeout = 4; // minimum setTimeout() threshold, milliseconds
|
||||
var lastTokenNr = 0; // last setCallback token return value
|
||||
var pendingCallbacks = {}; // hash of pending callbacks, indexed by token as a string
|
||||
var perf = global.performance; // cached window.performance object
|
||||
var pool = []; // pool of reusable callback objects
|
||||
var poolLength = 0; // length of active entries in pool
|
||||
|
||||
/**************************************/
|
||||
function activateCallback(token) {
|
||||
/* Activates a callback after its delay period has expired */
|
||||
var endStamp = perf.now();
|
||||
var thisCallback;
|
||||
var tokenName = token.toString();
|
||||
|
||||
thisCallback = pendingCallbacks[tokenName];
|
||||
if (thisCallback) {
|
||||
delete pendingCallbacks[tokenName];
|
||||
delayDev[thisCallback.category] += endStamp - thisCallback.startStamp - thisCallback.delay;
|
||||
try {
|
||||
thisCallback.fcn.call(thisCallback.context, thisCallback.arg);
|
||||
} catch (err) {
|
||||
console.log("B5500SetCallback.activateCallback: " + err.name + ", " + err.message);
|
||||
}
|
||||
|
||||
thisCallback.context = null;
|
||||
thisCallback.fcn = null;
|
||||
thisCallback.arg = null;
|
||||
pool[poolLength++] = thisCallback;
|
||||
}
|
||||
}
|
||||
|
||||
/**************************************/
|
||||
function clearCallback(token) {
|
||||
/* Disables a pending callback, if it still exists and is still pending */
|
||||
var thisCallback;
|
||||
var tokenName = token.toString();
|
||||
|
||||
thisCallback = pendingCallbacks[tokenName];
|
||||
if (thisCallback) {
|
||||
delete pendingCallbacks[tokenName];
|
||||
if (thisCallback.cancelToken) {
|
||||
global.clearTimeout(thisCallback.cancelToken);
|
||||
}
|
||||
|
||||
thisCallback.context = null;
|
||||
thisCallback.fcn = null;
|
||||
thisCallback.arg = null;
|
||||
pool[poolLength++] = thisCallback;
|
||||
}
|
||||
}
|
||||
|
||||
/**************************************/
|
||||
function setCallback(category, context, callbackDelay, fcn, arg) {
|
||||
/* Sets up and schedules a callback for function "fcn", called with context
|
||||
"context", after a delay of "delay" ms. An optional "arg" value will be passed
|
||||
to "fcn". If the delay is less than "minTimeout", a setImmediate-like mechanism
|
||||
based on DOM Promise() will be used; otherwise the environment's standard
|
||||
setTimeout mechanism will be used */
|
||||
var adj = 0; // adjustment to delay and delayDev[]
|
||||
var categoryName = (category || "NUL").toString();
|
||||
var delay = callbackDelay || 0; // actual delay to be generated
|
||||
var delayBias; // current amount of delay deviation
|
||||
var thisCallback; // call-back object to be used
|
||||
var token = ++lastTokenNr; // call-back token number
|
||||
var tokenName = token.toString(); // call-back token ID
|
||||
|
||||
// Allocate a call-back object from the pool.
|
||||
if (poolLength <= 0) {
|
||||
thisCallback = {};
|
||||
} else {
|
||||
thisCallback = pool[--poolLength];
|
||||
pool[poolLength] = null;
|
||||
}
|
||||
|
||||
thisCallback.startStamp = perf.now();
|
||||
|
||||
// Adjust the requested delay based on the current delay deviation
|
||||
// for this category.
|
||||
delayBias = delayDev[categoryName];
|
||||
if (!delayBias) {
|
||||
delayDev[categoryName] = 0; // bias was zero, or got a new one: no adjustment
|
||||
} else {
|
||||
if (delayBias > 0) {
|
||||
// We are delaying too much and should try to delay less.
|
||||
if (delay < 0) {
|
||||
adj = 0; // don't make delay any more negative
|
||||
} else {
|
||||
adj = -Math.min(delay, delayBias, minTimeout)*alpha;
|
||||
}
|
||||
} else { // delayBias < 0
|
||||
// We are delaying too little and should try to delay more.
|
||||
if (delay < 0) {
|
||||
if (delay - minTimeout < delayBias) {
|
||||
adj = -delayBias;
|
||||
} else {
|
||||
adj = minTimeout - delay;
|
||||
}
|
||||
} else {
|
||||
if (delay > minTimeout) {
|
||||
adj = 0;
|
||||
} else if (delay - minTimeout < delayBias) {
|
||||
adj = -delayBias;
|
||||
} else {
|
||||
adj = minTimeout - delay;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
delay += adj;
|
||||
delayDev[categoryName] += adj;
|
||||
}
|
||||
|
||||
// Fill in the call-back object and tank it in pendingCallbacks.
|
||||
thisCallback.category = categoryName;
|
||||
thisCallback.delay = delay;
|
||||
thisCallback.context = context || this;
|
||||
thisCallback.fcn = fcn;
|
||||
thisCallback.arg = arg;
|
||||
pendingCallbacks[tokenName] = thisCallback;
|
||||
|
||||
// Decide whether to do a time wait or just a yield.
|
||||
if (delay > minTimeout) {
|
||||
thisCallback.cancelToken = global.setTimeout(activateCallback, delay, token);
|
||||
} else {
|
||||
thisCallback.cancelToken = 0;
|
||||
Promise.resolve(token).then(activateCallback);
|
||||
}
|
||||
|
||||
return token;
|
||||
}
|
||||
|
||||
/**************************************/
|
||||
function getCallbackState(optionMask) {
|
||||
/* Diagnostic function. Returns an object that, depending upon bits in
|
||||
the option mask, contains copies of the lastTokenNr value, poolLength
|
||||
value, current delayDev hash, pendingCallbacks hash, and pool array.
|
||||
bit 0x01: delayDev hash
|
||||
bit 0x02: pendingCallbacks hash
|
||||
bit 0x04: pool array
|
||||
If no mask is supplied, no additional items are returned */
|
||||
var e;
|
||||
var mask = optionMask || 0;
|
||||
var state = {
|
||||
lastTokenNr: lastTokenNr,
|
||||
poolLength: poolLength,
|
||||
delayDev: {},
|
||||
pendingCallbacks: {},
|
||||
pool: []};
|
||||
|
||||
if (mask & 0x01) {
|
||||
for (e in delayDev) {
|
||||
state.delayDev[e] = delayDev[e];
|
||||
}
|
||||
}
|
||||
if (mask & 0x02) {
|
||||
for (e in pendingCallbacks) {
|
||||
state.pendingCallbacks[e] = pendingCallbacks[e];
|
||||
}
|
||||
}
|
||||
if (mask & 0x04) {
|
||||
for (e=0; e<poolLength; ++e) {
|
||||
state.pool[e] = pool[e];
|
||||
}
|
||||
}
|
||||
|
||||
return state;
|
||||
}
|
||||
|
||||
/********** Outer block of anonymous closure **********/
|
||||
if (!global.setCallback && !global.importScripts) {
|
||||
// Attach to the prototype of global, if possible, otherwise to global itself
|
||||
var attachee = global;
|
||||
|
||||
/*****
|
||||
if (typeof Object.getPrototypeOf === "function") {
|
||||
if ("setTimeout" in Object.getPrototypeOf(global)) {
|
||||
attachee = Object.getPrototypeOf(global);
|
||||
}
|
||||
}
|
||||
*****/
|
||||
|
||||
attachee.setCallback = setCallback;
|
||||
attachee.clearCallback = clearCallback;
|
||||
attachee.getCallbackState = getCallbackState;
|
||||
}
|
||||
}(typeof global === "object" && global ? global : this));
|
||||
|
||||
@@ -40,8 +40,8 @@
|
||||
|
||||
<script src="./B5500SPOUnit.js"></script>
|
||||
<script src="./B5500DiskUnit.js"></script>
|
||||
<!--
|
||||
<script src="./B5500CardReader.js"></script>
|
||||
<!--
|
||||
<script src="./B5500LinePrinter.js"></script>
|
||||
<script src="./B5500CardPunch.js"></script>
|
||||
<script src="./B5500DatacomUnit.js"></script>
|
||||
|
||||
@@ -65,6 +65,7 @@ function B5500SystemConfig() {
|
||||
|
||||
this.db = null; // the IndexedDB database connection (null if closed)
|
||||
this.systemConfig = null; // the currently-loaded system configuration
|
||||
this.doc = null; // configuration UI document object
|
||||
this.window = null; // configuration UI window object
|
||||
this.alertWin = window; // current base window for alert/confirm/prompt
|
||||
}
|
||||
@@ -786,8 +787,7 @@ B5500SystemConfig.prototype.selectConfigDialog = function selectConfigDialog(ev)
|
||||
this.alertWin.alert("No configuration selected"); // should never happen
|
||||
} else {
|
||||
configName = nameList.options[selection].value;
|
||||
this.getSystemConfig(configName,
|
||||
B5500CentralControl.bindMethod(this, this.loadConfigDialog));
|
||||
this.getSystemConfig(configName, this.loadConfigDialog.bind(this));
|
||||
}
|
||||
};
|
||||
|
||||
@@ -847,35 +847,37 @@ B5500SystemConfig.prototype.openConfigUI = function openConfigUI() {
|
||||
default system configuration */
|
||||
|
||||
function configUI_Open(ev) {
|
||||
this.doc = ev.target;
|
||||
this.window = this.doc.defaultView;
|
||||
this.alertWin = this.window;
|
||||
|
||||
this.window.moveTo(screen.availWidth-this.window.outerWidth-40,
|
||||
(screen.availHeight-this.window.outerHeight)/2);
|
||||
this.window.focus();
|
||||
|
||||
this.getSystemConfig(null,
|
||||
B5500CentralControl.bindMethod(this, this.loadConfigDialog));
|
||||
this.loadConfigDialog.bind(this));
|
||||
this.$$("ConfigNewBtn").addEventListener("click",
|
||||
B5500CentralControl.bindMethod(this, this.newConfigDialog));
|
||||
this.newConfigDialog.bind(this));
|
||||
this.$$("ConfigDeleteBtn").addEventListener("click",
|
||||
B5500CentralControl.bindMethod(this, this.deleteConfigDialog));
|
||||
this.deleteConfigDialog.bind(this));
|
||||
this.$$("ConfigNameList").addEventListener("change",
|
||||
B5500CentralControl.bindMethod(this, this.selectConfigDialog));
|
||||
this.selectConfigDialog.bind(this));
|
||||
this.$$("DiskEditBtn").addEventListener("click",
|
||||
B5500CentralControl.bindMethod(this, this.openStorageUI));
|
||||
this.openStorageUI.bind(this));
|
||||
this.$$("DiskNewBtn").addEventListener("click",
|
||||
B5500CentralControl.bindMethod(this, this.newStorageDialog));
|
||||
this.newStorageDialog.bind(this));
|
||||
this.$$("SaveBtn").addEventListener("click",
|
||||
B5500CentralControl.bindMethod(this, this.saveConfigDialog));
|
||||
this.saveConfigDialog.bind(this));
|
||||
this.$$("CancelBtn").addEventListener("click",
|
||||
B5500CentralControl.bindMethod(this, function(ev) {
|
||||
function(ev) {
|
||||
this.window.close();
|
||||
}));
|
||||
}.bind(this));
|
||||
this.window.addEventListener("unload",
|
||||
B5500CentralControl.bindMethod(this, this.closeConfigUI), false);
|
||||
this.closeConfigUI.bind(this), false);
|
||||
}
|
||||
|
||||
this.doc = null;
|
||||
this.window = window.open("../webUI/B5500SystemConfig.html", this.configDBName,
|
||||
"location=no,scrollbars,resizable,width=640,height=700");
|
||||
this.window.moveTo(screen.availWidth-this.window.outerWidth-40,
|
||||
(screen.availHeight-this.window.outerHeight)/2);
|
||||
this.window.focus();
|
||||
this.alertWin = this.window;
|
||||
this.window.addEventListener("load",
|
||||
B5500CentralControl.bindMethod(this, configUI_Open), false);
|
||||
B5500Util.openPopup(window, "../webUI/B5500SystemConfig.html", this.configDBName,
|
||||
"location=no,scrollbars,resizable,width=640,height=700",
|
||||
this, configUI_Open);
|
||||
};
|
||||
|
||||
@@ -18,7 +18,12 @@ function B5500Util() {
|
||||
// Nothing to construct at present...
|
||||
}
|
||||
|
||||
|
||||
/**************************************/
|
||||
B5500Util.popupOpenDelayIncrement = 250;// increment for pop-up open delay adjustment, ms
|
||||
B5500Util.popupOpenDelay = 500; // current pop-up open delay, ms
|
||||
B5500Util.popupOpenQueue = []; // queue of pop-up open argument objects
|
||||
|
||||
B5500Util.xlateASCIIToAlgolRex = // For translation of BIC-as-ASCII to Unicode Algol glyphs
|
||||
/[^\r\n\xA0 "#$%&()*+,\-./0-9:;<=>?@A-Z\[\]a-z\u00D7\u2190\u2260\u2264\u2265]/g;
|
||||
B5500Util.xlateASCIIToAlgolGlyph = {
|
||||
@@ -39,41 +44,12 @@ B5500Util.xlateAlgolToASCIIGlyph = {
|
||||
"\u2264": "{", // less-than-or-equal
|
||||
"\u2265": "}"}; // greater-than-or-equal
|
||||
|
||||
|
||||
/**************************************/
|
||||
B5500Util.$$ = function $$(e) {
|
||||
return document.getElementById(e);
|
||||
};
|
||||
|
||||
/**************************************/
|
||||
B5500Util.hasClass = function hasClass(e, name) {
|
||||
/* returns true if element "e" has class "name" in its class list */
|
||||
var classes = e.className;
|
||||
|
||||
if (!e) {
|
||||
return false;
|
||||
} else if (classes == name) {
|
||||
return true;
|
||||
} else {
|
||||
return (classes.search("\\b" + name + "\\b") >= 0);
|
||||
}
|
||||
};
|
||||
|
||||
/**************************************/
|
||||
B5500Util.addClass = function addClass(e, name) {
|
||||
/* Adds a class "name" to the element "e"s class list */
|
||||
|
||||
if (!B5500Util.hasClass(e, name)) {
|
||||
e.className += (" " + name);
|
||||
}
|
||||
};
|
||||
|
||||
/**************************************/
|
||||
B5500Util.removeClass = function removeClass(e, name) {
|
||||
/* Removes the class "name" from the element "e"s class list */
|
||||
|
||||
e.className = e.className.replace(new RegExp("\\b" + name + "\\b\\s*", "g"), "");
|
||||
};
|
||||
|
||||
/**************************************/
|
||||
B5500Util.octize = function octize(v, n) {
|
||||
/* Converts "v" to an octal digit string and truncates or pads with zeroes
|
||||
@@ -263,3 +239,78 @@ B5500Util.xlateDOMTreeText = function xlateDOMTreeText(n, xlate) {
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/**************************************/
|
||||
B5500Util.openPopup = function openPopup(parent, url, windowName, options, context, onload) {
|
||||
/* Schedules the opening of a pop-up window so that browsers such as Apple
|
||||
Safari (11.0+) will not block the opens if they occur too close together.
|
||||
Parameters:
|
||||
parent: parent window for the pop-up
|
||||
url: url of window context, passed to window.open()
|
||||
windowName: internal name of the window, passed to window.open()
|
||||
options: string of window options, passed to window.open()
|
||||
context: object context ("this") for the onload function (may be null)
|
||||
onload: event handler for the window's onload event (may be null).
|
||||
If the queue of pending pop-up opens in B5500Util.popupOpenQueue[] is empty,
|
||||
then attempts to open the window immediately. Otherwise queues the open
|
||||
parameters, which will be dequeued and acted upon after the previously-
|
||||
queued entries are completed by B5500Util.dequeuePopup() */
|
||||
|
||||
B5500Util.popupOpenQueue.push({
|
||||
parent: parent,
|
||||
url: url,
|
||||
windowName: windowName,
|
||||
options: options,
|
||||
context: context,
|
||||
onload: onload});
|
||||
if (B5500Util.popupOpenQueue.length == 1) { // queue was empty
|
||||
B5500Util.dequeuePopup();
|
||||
}
|
||||
};
|
||||
|
||||
/**************************************/
|
||||
B5500Util.dequeuePopup = function dequeuePopup() {
|
||||
/* Dequeues a popupOpenQueue[] entry and attempts to open the pop-up window.
|
||||
Called either directly by B5500Util.openPopup() when an entry is inserted
|
||||
into an empty queue, or by setTimeout() after a delay. If the open fails,
|
||||
the entry is reinserted into the head of the queue, the open delay is
|
||||
incremented, and this function is rescheduled for the new delay. If the
|
||||
open is successful, and the queue is non-empty, then this function is
|
||||
scheduled for the current open delay to process the next entry in the queue */
|
||||
var entry = B5500Util.popupOpenQueue.shift();
|
||||
var loader1 = null;
|
||||
var loader2 = null;
|
||||
var win = null;
|
||||
|
||||
if (entry) {
|
||||
try {
|
||||
win = entry.parent.open(entry.url, entry.windowName, entry.options);
|
||||
} catch (e) {
|
||||
win = null;
|
||||
}
|
||||
|
||||
if (!win) { // window open failed, requeue
|
||||
B5500Util.popupOpenQueue.unshift(entry);
|
||||
B5500Util.popupOpenDelay += B5500Util.popupOpenDelayIncrement;
|
||||
setTimeout(B5500Util.dequeuePopup, B5500Util.popupOpenDelay);
|
||||
//console.log("Pop-up open failed: " + entry.windowName + ", new delay=" + B5500Util.popupOpenDelay + "ms");
|
||||
} else { // window open was successful
|
||||
if (entry.onload) {
|
||||
loader1 = entry.onload.bind(entry.context);
|
||||
win.addEventListener("load", loader1, false);
|
||||
}
|
||||
|
||||
loader2 = function(ev) { // remove the load event listeners after loading
|
||||
win.removeEventListener("load", loader2, false);
|
||||
if (loader1) {
|
||||
win.removeEventListener("load", loader1, false);
|
||||
}
|
||||
};
|
||||
|
||||
win.addEventListener("load", loader2, false);
|
||||
if (B5500Util.popupOpenQueue.length > 0) {
|
||||
setTimeout(B5500Util.dequeuePopup, B5500Util.popupOpenDelay);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -1,97 +1,97 @@
|
||||
Fonts are (c) Bitstream (see below). DejaVu changes are in public domain.
|
||||
Glyphs imported from Arev fonts are (c) Tavmjong Bah (see below)
|
||||
|
||||
Bitstream Vera Fonts Copyright
|
||||
------------------------------
|
||||
|
||||
Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is
|
||||
a trademark of Bitstream, Inc.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of the fonts accompanying this license ("Fonts") and associated
|
||||
documentation files (the "Font Software"), to reproduce and distribute the
|
||||
Font Software, including without limitation the rights to use, copy, merge,
|
||||
publish, distribute, and/or sell copies of the Font Software, and to permit
|
||||
persons to whom the Font Software is furnished to do so, subject to the
|
||||
following conditions:
|
||||
|
||||
The above copyright and trademark notices and this permission notice shall
|
||||
be included in all copies of one or more of the Font Software typefaces.
|
||||
|
||||
The Font Software may be modified, altered, or added to, and in particular
|
||||
the designs of glyphs or characters in the Fonts may be modified and
|
||||
additional glyphs or characters may be added to the Fonts, only if the fonts
|
||||
are renamed to names not containing either the words "Bitstream" or the word
|
||||
"Vera".
|
||||
|
||||
This License becomes null and void to the extent applicable to Fonts or Font
|
||||
Software that has been modified and is distributed under the "Bitstream
|
||||
Vera" names.
|
||||
|
||||
The Font Software may be sold as part of a larger software package but no
|
||||
copy of one or more of the Font Software typefaces may be sold by itself.
|
||||
|
||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT,
|
||||
TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME
|
||||
FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING
|
||||
ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES,
|
||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
|
||||
THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE
|
||||
FONT SOFTWARE.
|
||||
|
||||
Except as contained in this notice, the names of Gnome, the Gnome
|
||||
Foundation, and Bitstream Inc., shall not be used in advertising or
|
||||
otherwise to promote the sale, use or other dealings in this Font Software
|
||||
without prior written authorization from the Gnome Foundation or Bitstream
|
||||
Inc., respectively. For further information, contact: fonts at gnome dot
|
||||
org.
|
||||
|
||||
Arev Fonts Copyright
|
||||
------------------------------
|
||||
|
||||
Copyright (c) 2006 by Tavmjong Bah. All Rights Reserved.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of the fonts accompanying this license ("Fonts") and
|
||||
associated documentation files (the "Font Software"), to reproduce
|
||||
and distribute the modifications to the Bitstream Vera Font Software,
|
||||
including without limitation the rights to use, copy, merge, publish,
|
||||
distribute, and/or sell copies of the Font Software, and to permit
|
||||
persons to whom the Font Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright and trademark notices and this permission notice
|
||||
shall be included in all copies of one or more of the Font Software
|
||||
typefaces.
|
||||
|
||||
The Font Software may be modified, altered, or added to, and in
|
||||
particular the designs of glyphs or characters in the Fonts may be
|
||||
modified and additional glyphs or characters may be added to the
|
||||
Fonts, only if the fonts are renamed to names not containing either
|
||||
the words "Tavmjong Bah" or the word "Arev".
|
||||
|
||||
This License becomes null and void to the extent applicable to Fonts
|
||||
or Font Software that has been modified and is distributed under the
|
||||
"Tavmjong Bah Arev" names.
|
||||
|
||||
The Font Software may be sold as part of a larger software package but
|
||||
no copy of one or more of the Font Software typefaces may be sold by
|
||||
itself.
|
||||
|
||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL
|
||||
TAVMJONG BAH BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||
OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||
|
||||
Except as contained in this notice, the name of Tavmjong Bah shall not
|
||||
be used in advertising or otherwise to promote the sale, use or other
|
||||
dealings in this Font Software without prior written authorization
|
||||
from Tavmjong Bah. For further information, contact: tavmjong @ free
|
||||
Fonts are (c) Bitstream (see below). DejaVu changes are in public domain.
|
||||
Glyphs imported from Arev fonts are (c) Tavmjong Bah (see below)
|
||||
|
||||
Bitstream Vera Fonts Copyright
|
||||
------------------------------
|
||||
|
||||
Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is
|
||||
a trademark of Bitstream, Inc.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of the fonts accompanying this license ("Fonts") and associated
|
||||
documentation files (the "Font Software"), to reproduce and distribute the
|
||||
Font Software, including without limitation the rights to use, copy, merge,
|
||||
publish, distribute, and/or sell copies of the Font Software, and to permit
|
||||
persons to whom the Font Software is furnished to do so, subject to the
|
||||
following conditions:
|
||||
|
||||
The above copyright and trademark notices and this permission notice shall
|
||||
be included in all copies of one or more of the Font Software typefaces.
|
||||
|
||||
The Font Software may be modified, altered, or added to, and in particular
|
||||
the designs of glyphs or characters in the Fonts may be modified and
|
||||
additional glyphs or characters may be added to the Fonts, only if the fonts
|
||||
are renamed to names not containing either the words "Bitstream" or the word
|
||||
"Vera".
|
||||
|
||||
This License becomes null and void to the extent applicable to Fonts or Font
|
||||
Software that has been modified and is distributed under the "Bitstream
|
||||
Vera" names.
|
||||
|
||||
The Font Software may be sold as part of a larger software package but no
|
||||
copy of one or more of the Font Software typefaces may be sold by itself.
|
||||
|
||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT,
|
||||
TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME
|
||||
FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING
|
||||
ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES,
|
||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
|
||||
THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE
|
||||
FONT SOFTWARE.
|
||||
|
||||
Except as contained in this notice, the names of Gnome, the Gnome
|
||||
Foundation, and Bitstream Inc., shall not be used in advertising or
|
||||
otherwise to promote the sale, use or other dealings in this Font Software
|
||||
without prior written authorization from the Gnome Foundation or Bitstream
|
||||
Inc., respectively. For further information, contact: fonts at gnome dot
|
||||
org.
|
||||
|
||||
Arev Fonts Copyright
|
||||
------------------------------
|
||||
|
||||
Copyright (c) 2006 by Tavmjong Bah. All Rights Reserved.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of the fonts accompanying this license ("Fonts") and
|
||||
associated documentation files (the "Font Software"), to reproduce
|
||||
and distribute the modifications to the Bitstream Vera Font Software,
|
||||
including without limitation the rights to use, copy, merge, publish,
|
||||
distribute, and/or sell copies of the Font Software, and to permit
|
||||
persons to whom the Font Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright and trademark notices and this permission notice
|
||||
shall be included in all copies of one or more of the Font Software
|
||||
typefaces.
|
||||
|
||||
The Font Software may be modified, altered, or added to, and in
|
||||
particular the designs of glyphs or characters in the Fonts may be
|
||||
modified and additional glyphs or characters may be added to the
|
||||
Fonts, only if the fonts are renamed to names not containing either
|
||||
the words "Tavmjong Bah" or the word "Arev".
|
||||
|
||||
This License becomes null and void to the extent applicable to Fonts
|
||||
or Font Software that has been modified and is distributed under the
|
||||
"Tavmjong Bah Arev" names.
|
||||
|
||||
The Font Software may be sold as part of a larger software package but
|
||||
no copy of one or more of the Font Software typefaces may be sold by
|
||||
itself.
|
||||
|
||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL
|
||||
TAVMJONG BAH BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||
OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||
|
||||
Except as contained in this notice, the name of Tavmjong Bah shall not
|
||||
be used in advertising or otherwise to promote the sale, use or other
|
||||
dealings in this Font Software without prior written authorization
|
||||
from Tavmjong Bah. For further information, contact: tavmjong @ free
|
||||
. fr.
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user