mirror of
https://github.com/pkimpel/retro-b5500.git
synced 2026-02-12 11:17:29 +00:00
2. Fix (we hope) the nasty problem that was causing Invalid Address out of COM5 after large compiles -- bug in MSCW/MSFF tracing in Processor.exitSubroutine(). 3. Implement ability to do a hardware load without initiating P1 in CentralControl (used by SyllableDebugger). 4. De-anonymize object prototype method functions in Processor as an aid when using JS debuggers. 5. Rework storeForInterrupt() and initiate() in Processor. 6. Replace bitmask "AND"s with power-of-two "MOD"s in many places in Processor. 7. Replace many bit(), fieldIsolate(), fieldInsert() calls with mod/div expressions in Processor. 8. Fix a problem existing normalization when an Integer Overflow occurs in Integer Store syllables. 9. Fix missing and superfluous break statements in Processor.run() switch statements. 10. Fix incorrect C-register restoration in Character Mode RCA syllable. 11. Correct test for continuity bit in Processor PRL syllable coding. 12. Correct missing "this." in Processor BRT syllable coding. 13. Change way that delayTime and Processor.procSlack is computed in Processor.run(). 14. Correct BCL translation bug and directory EOF detection in B5500ColdLoader. 15. Attempt to initialize SYSTEM/LOG in B5500ColdLoader (not working yet). 16. Implement new retro-B5500-Logo.png. 17. Implement Hardware Load button in SyllableDebugger. 18. Release tools/B5500DiskDirList.html utility. 19. Release tools/B5500DiskFileList.html utility with PBD file special formattring. 20. Restrict directory complement to EU0 in B5500ColdLoader.html. 21. Miscellaneous improvements to comments and cosmetics.
276 lines
11 KiB
HTML
276 lines
11 KiB
HTML
<!DOCTYPE html>
|
|
<head>
|
|
<title>B5500 Emulator Operator Console</title>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
|
<meta name="Author" content="Nigel Williams & Paul Kimpel">
|
|
<meta http-equiv="Content-Script-Type" content="text/javascript">
|
|
<meta http-equiv="Content-Style-Type" content="text/css">
|
|
<link id=defaultStyleSheet rel=stylesheet type="text/css" href="B5500Console.css">
|
|
|
|
<script src="./B5500DummyUnit.js"></script>
|
|
<script src="./B5500SPOUnit.js"></script>
|
|
<script src="./B5500DiskUnit.js"></script>
|
|
|
|
<script src="../emulator/B5500SystemConfiguration.js"></script>
|
|
<script src="../emulator/B5500CentralControl.js"></script>
|
|
<script src="../emulator/B5500Processor.js"></script>
|
|
<script src="../emulator/B5500IOUnit.js"></script>
|
|
|
|
<script>
|
|
window.onload = function() {
|
|
var aControl;
|
|
var aNormal;
|
|
var bControl;
|
|
var bNormal;
|
|
var boundBlinkenlicht;
|
|
var cc = new B5500CentralControl();
|
|
var lastBusyMask = 0;
|
|
var procRate;
|
|
var procSlack;
|
|
var timer;
|
|
var timerInterval = 50; // milliseconds
|
|
|
|
function $$(id) {
|
|
return document.getElementById(id)
|
|
}
|
|
|
|
function bindMethod(f, context) {
|
|
return function() {f.apply(context, arguments)};
|
|
}
|
|
|
|
function PowerOnBtn_Click(ev) {
|
|
$$("PowerOnBtn").className = "whiteButton whiteLit";
|
|
$$("AControlBtn").className = "yellowButton yellowLit";
|
|
cc.powerOn();
|
|
$$("LoadBtn").disabled = false;
|
|
return true;
|
|
}
|
|
|
|
function PowerOffBtn_Click(ev) {
|
|
$$("PowerOnBtn").className = "whiteButton";
|
|
$$("ANormalBtn").className = "yellowButton";
|
|
$$("AControlBtn").className = "yellowButton";
|
|
$$("BNormalBtn").className = "yellowButton";
|
|
cc.powerOff();
|
|
$$("HaltBtn").disabled = true;
|
|
$$("LoadBtn").disabled = true;
|
|
if (timer) {
|
|
clearTimeout(timer);
|
|
timer = null;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
function HaltBtn_Click(ev) {
|
|
cc.halt();
|
|
$$("HaltBtn").disabled = true;
|
|
$$("LoadBtn").disabled = false;
|
|
}
|
|
|
|
function LoadBtn_Click(ev) {
|
|
cc.load();
|
|
$$("HaltBtn").disabled = false;
|
|
$$("LoadBtn").disabled = true;
|
|
boundBlinkenlicht();
|
|
}
|
|
|
|
function displayCentralControl() {
|
|
/* Displays the I/O and interrupt status in Central Control */
|
|
var cells;
|
|
var s;
|
|
var busyMask = cc.unitBusyMask;
|
|
var busyChange = lastBusyMask ^ busyMask;
|
|
var x;
|
|
|
|
lastBusyMask = busyMask;
|
|
|
|
$$("AD1F").className = (cc.AD1F ? "busy" : "");
|
|
$$("AD2F").className = (cc.AD2F ? "busy" : "");
|
|
$$("AD3F").className = (cc.AD3F ? "busy" : "");
|
|
$$("AD4F").className = (cc.AD4F ? "busy" : "");
|
|
|
|
for (x=3; x<=16; x++) {
|
|
s = "CCI" + (x+100).toString().substring(1) + "F";
|
|
$$(s).className = (cc[s] ? "busy" : "");
|
|
}
|
|
|
|
cells = $$("CCPeripheralRow").cells;
|
|
x = 47;
|
|
while (busyChange) {
|
|
if (busyChange & 0x01) {
|
|
cells[x-17].className = (busyMask & 0x01 ? "busy" : "");
|
|
}
|
|
busyMask >>>= 1;
|
|
busyChange >>>= 1;
|
|
x--;
|
|
}
|
|
}
|
|
|
|
function dasBlinkenlicht() {
|
|
var et;
|
|
var pa = cc.PA;
|
|
var pb = cc.PB;
|
|
|
|
if (pa) {
|
|
if (!pa.busy) {
|
|
aControl.className = "yellowButton";
|
|
aNormal.className = "yellowButton";
|
|
} else if (pa.NCSF) {
|
|
aControl.className = "yellowButton";
|
|
aNormal.className = "yellowButton yellowLit";
|
|
} else {
|
|
aNormal.className = "yellowButton";
|
|
if (pa === cc.P1) {
|
|
aControl.className = "yellowButton yellowLit";
|
|
}
|
|
}
|
|
et = new Date().getTime()*1000 - pa.procStart;
|
|
procRate.innerHTML = ((pa.procTime - pa.procStart)/et*100).toFixed(1) + "%";
|
|
//procSlack.innerHTML = (pa.procSlack/et*100).toFixed(1) + "%";
|
|
}
|
|
if (pb) {
|
|
if (!pb.busy) {
|
|
bControl.className = "yellowButton";
|
|
bNormal.className = "yellowButton";
|
|
} else if (pb.NCSF) {
|
|
bControl.className = "yellowButton";
|
|
bNormal.className = "yellowButton yellowLit";
|
|
} else {
|
|
bNormal.className = "yellowButton";
|
|
if (pb === cc.P1) {
|
|
bControl.className = "yellowButton yellowLit";
|
|
}
|
|
}
|
|
}
|
|
displayCentralControl();
|
|
timer = setTimeout(boundBlinkenlicht, timerInterval);
|
|
}
|
|
|
|
function checkBrowser() {
|
|
/* Checks whether this browser can support the necessary stuff */
|
|
var missing = "";
|
|
|
|
if (!window.indexedDB) {missing += ", IndexedDB"}
|
|
if (!window.ArrayBuffer) {missing += ", ArrayBuffer"}
|
|
if (!window.DataView) {missing += ", DataView"}
|
|
if (!window.Blob) {missing += ", Blob"}
|
|
if (!window.File) {missing += ", File"}
|
|
if (!window.FileReader) {missing += ", FileReader"}
|
|
if (!window.FileList) {missing += ", FileList"}
|
|
|
|
if (missing.length == 0) {
|
|
return false;
|
|
} else {
|
|
alert("No can do... your browser does not support the following features:\n" +
|
|
missing.substring(2));
|
|
return true;
|
|
}
|
|
}
|
|
|
|
/***** window.onload() outer block *****/
|
|
|
|
if (!checkBrowser()) {
|
|
$$("PowerOnBtn").addEventListener("click", PowerOnBtn_Click);
|
|
$$("PowerOffBtn").addEventListener("click", PowerOffBtn_Click);
|
|
$$("HaltBtn").addEventListener("click", HaltBtn_Click);
|
|
$$("LoadBtn").addEventListener("click", LoadBtn_Click);
|
|
|
|
aControl = $$("AControlBtn");
|
|
aNormal = $$("ANormalBtn");
|
|
bControl = $$("BControlBtn");
|
|
bNormal = $$("BNormalBtn");
|
|
procRate = $$("procRate");
|
|
procSlack = $$("procSlack");
|
|
boundBlinkenlicht = bindMethod(dasBlinkenlicht, this);
|
|
}
|
|
};
|
|
</script>
|
|
</head>
|
|
|
|
<body>
|
|
|
|
<div id=consoleDiv>
|
|
<button id=HaltBtn class=blackButton DISABLED>HALT</button>
|
|
|
|
<button id=NotReadyBtn class=yellowButton>NOT READY</button>
|
|
<button id=LoadSelectBtn class=blackButton>LOAD SELECT</button>
|
|
<button id=LoadBtn class=blackButton DISABLED>LOAD</button>
|
|
|
|
<button id=MemoryCheckBtn class=yellowButton>MEMORY CHECK</button>
|
|
<button id=ANormalBtn class=yellowButton>A NORMAL</button>
|
|
<button id=AControlBtn class=yellowButton>A CONTROL</button>
|
|
<button id=BNormalBtn class=yellowButton>B NORMAL</button>
|
|
<button id=BControlBtn class=yellowButton>B CONTROL</button>
|
|
|
|
<button id=PowerOnBtn class=whiteButton>POWER<br>ON</button>
|
|
<button id=PowerOffBtn class=blackButton>POWER OFF</button>
|
|
|
|
<div id=BurroughsLogo>
|
|
<img id=BurroughsLogoImage src="Burroughs-Logo-Neg.jpg">
|
|
</div>
|
|
<div id=B5500Logo><img src="retro-B5500-Logo.png" alt="retro-B5500 logo"><!-- B 5500 --></div>
|
|
|
|
<table id=CentralControl>
|
|
<colgroup>
|
|
<col span=32 style="width:3%">
|
|
</colgroup>
|
|
<thead>
|
|
<tr id=CCInterruptRow>
|
|
<td id=AD1F>IOU1 <!-- I/O unit 1 busy -->
|
|
<td id=AD2F>IOU2 <!-- I/O unit 2 busy -->
|
|
<td id=AD3F>IOU3 <!-- I/O unit 3 busy -->
|
|
<td id=AD4F>IOU4 <!-- I/O unit 4 busy -->
|
|
<td id=CCI03F>TIMR <!-- Time interval interrupt -->
|
|
<td id=CCI04F>IOBZ <!-- I/O busy interrupt -->
|
|
<td id=CCI05F>KBD <!-- Keyboard request interrupt -->
|
|
<td id=CCI06F>PR1F <!-- Printer 1 finished interrupt -->
|
|
<td id=CCI07F>PR2F <!-- Printer 2 finished interrupt -->
|
|
<td id=CCI08F>IO1F <!-- I/O unit 1 finished interrupt (RD in @14) -->
|
|
<td id=CCI09F>IO2F <!-- I/O unit 2 finished interrupt (RD in @15) -->
|
|
<td id=CCI10F>IO3F <!-- I/O unit 3 finished interrupt (RD in @16) -->
|
|
<td id=CCI11F>IO4F <!-- I/O unit 4 finished interrupt (RD in @17) -->
|
|
<td id=CCI12F>P2BZ <!-- P2 busy interrupt -->
|
|
<td id=CCI13F>INQ <!-- Remote inquiry request interrupt -->
|
|
<td id=CCI14F>SPEC <!-- Special interrupt #1 (not used) -->
|
|
<td id=CCI15F>DK1F <!-- Disk file #1 read check finished -->
|
|
<td id=CCI16F>DK2F <!-- Disk file #2 read check finished -->
|
|
<td colspan=13>
|
|
<td id=procSlack>
|
|
<tr id=CCPeripheralRow>
|
|
<td id=DCA>DCA <!-- 17 -->
|
|
<td id=PPB>PPB <!-- 18 -->
|
|
<td id=PRB>PRB <!-- 19 -->
|
|
<td id=PRA>PRA <!-- 20 -->
|
|
<td id=PPA>PPA <!-- 21 -->
|
|
<td id=SPO>SPO <!-- 22 -->
|
|
<td id=CRB>CRB <!-- 23 -->
|
|
<td id=CRA>CRA <!-- 24 -->
|
|
<td id=CPA>CPA <!-- 25 -->
|
|
<td id=LPB>LPB <!-- 26 -->
|
|
<td id=LPA>LPA <!-- 27 -->
|
|
<td id=DKB>DKB <!-- 28 -->
|
|
<td id=DKA>DKA <!-- 29 -->
|
|
<td id=DRB>DRB <!-- 30 -->
|
|
<td id=DRA>DRA <!-- 31 -->
|
|
<td id=MTT>MTT <!-- 32 -->
|
|
<td id=MTS>MTS <!-- 33 -->
|
|
<td id=MTR>MTR <!-- 34 -->
|
|
<td id=MTP>MTP <!-- 35 -->
|
|
<td id=MTN>MTN <!-- 36 -->
|
|
<td id=MTM>MTM <!-- 37 -->
|
|
<td id=MTL>MTL <!-- 38 -->
|
|
<td id=MTK>MTK <!-- 39 -->
|
|
<td id=MTJ>MTJ <!-- 40 -->
|
|
<td id=MTH>MTH <!-- 41 -->
|
|
<td id=MTF>MTF <!-- 42 -->
|
|
<td id=MTE>MTE <!-- 43 -->
|
|
<td id=MTD>MTD <!-- 44 -->
|
|
<td id=MTC>MTC <!-- 45 -->
|
|
<td id=MTB>MTB <!-- 46 -->
|
|
<td id=MTA>MTA <!-- 47 -->
|
|
<td id=procRate>
|
|
</table>
|
|
</div>
|
|
|
|
</body>
|
|
</html> |