1
0
mirror of https://github.com/pkimpel/retro-b5500.git synced 2026-04-24 19:40:37 +00:00

Continue development of B5500ColdLoader.html: load Kernel bootstrap, implement loadAsMCP as loadAsInt, fix several bugs.

This commit is contained in:
paul
2013-01-13 03:23:02 +00:00
parent 4e66aa6270
commit dce44f5bdb

View File

@@ -723,19 +723,17 @@ window.onload = function() {
from BIC to ANSI, and writes it a row at a time to the disk "eu".
Establishes the "diskHeader" disk file header from the tape and updates the
disk header address row words as the rows are allocated and written to the disk.
Returns true if no more files should be converted */
Returns the disk address of the first row loaded */
var addr;
var block;
var tapeHeader;
var firstRowAddr = -1;
var lab;
var lab2;
var result = false;
var rowCount = 0;
var tapeHeader;
var text;
var x;
spout(" ");
spout("Loading #" + fileNr + ": " + tapeDir[fileNr]);
lab = readTapeLabel(ctl);
if (ctl.eof) {
spout("loadFile: EOF encountered when tape label expected, block=" + ctl.blockCount);
@@ -792,6 +790,9 @@ window.onload = function() {
} else {
diskHeader[10+x] = addr;
loadFileRow(ctl, eu, addr, tapeHeader.segmentsPerRow);
if (firstRowAddr < 0) {
firstRowAddr = addr;
}
}
}
}
@@ -808,28 +809,26 @@ window.onload = function() {
spout("loadFile: File ending label mismatch, block=" + ctl.blockCount);
}
}
return result;
return firstRowAddr;
}
/**************************************/
function skipFile(ctl, fileNr) {
function skipTapeFile(ctl, fileNr) {
/* Spaces over the next file in the tape blob */
var block;
var lab;
var lab2;
var result = false;
spout("Skipping #" + fileNr + ": " + tapeDir[fileNr]);
lab = readTapeLabel(ctl);
if (ctl.eof) {
spout("skipFile: EOF encountered when tape label expected, block=" + ctl.blockCount);
spout("skipTapeFile: EOF encountered when tape label expected, block=" + ctl.blockCount);
} else if (!lab.isLabel) {
spout(lab.text);
spout("skipFile: Above block encountered when a tape label was expected, block=" + ctl.blockCount);
spout("skipTapeFile: Above block encountered when a tape label was expected, block=" + ctl.blockCount);
} else {
block = readWordBlock(ctl);
if (!ctl.eof) {
spout("skipFile: EOF expected after starting label, block=" + ctl.blockCount);
spout("skipTapeFile: EOF expected after starting label, block=" + ctl.blockCount);
}
do {
@@ -838,12 +837,11 @@ window.onload = function() {
lab2 = readTapeLabel(ctl);
if (!lab2.isLabel) {
spout("skipFile: Tape label expected after file data, block=" + ctl.blockCount);
spout("skipTapeFile: Tape label expected after file data, block=" + ctl.blockCount);
} else if (lab2.mfid != lab.mfid || lab2.fid != lab.fid) {
spout("skipFile: File ending label mismatch, block=" + ctl.blockCount);
spout("skipTapeFile: File ending label mismatch, block=" + ctl.blockCount);
}
}
return result;
}
/**************************************/
@@ -913,7 +911,7 @@ window.onload = function() {
}
/**************************************/
function loadNextFile(tapeCtl, topFileNr, fileNr) {
function loadTapeFile(tapeCtl, topFileNr, fileNr) {
/* Locates and loads the next selected file from the tape blob. On
completion, if there are more file to load, chains itself for the next one */
var names = [0, 0];
@@ -923,7 +921,10 @@ window.onload = function() {
var eu = txn.objectStore(euName);
var fid;
var mfid;
var nameParts = tapeDir[fileNr].split("/");
var loadAsInt;
var loadAsMCP;
var firstRowAddr = -1;
var nameParts;
function loadFileHost(addr, block, slot) {
/* Controls the loading of the current file from tape and updates
@@ -951,7 +952,7 @@ window.onload = function() {
}
}
loadFile(tapeCtl, fileNr, eu, diskHeader);
firstRowAddr = loadFile(tapeCtl, fileNr, eu, diskHeader);
// Move the new header into the directory block
for (x=0; x<30; x++) {
@@ -981,10 +982,40 @@ window.onload = function() {
}
writeDiskWords(eu, addr+31, block, 0, 30);
}
// Check to see if seg.0 must be updated for MCP or Intrinsics
if (loadAsMCP || loadAsInt) {
readDiskBlock(eu, 0, 1, block, function(addr, block) {
if (loadAsMCP) {
block[10] = mfid;
block[11] = fid;
block[12] = firstRowAddr;
}
if (loadAsInt) {
block[13] = mfid;
block[14] = fid;
}
writeDiskWords(eu, 0, block, 0, 30);
});
}
}
/***** loadNextFile outer block *****/
/***** loadTapeFile outer block *****/
while (!$$("File_" + fileNr).checked) {
spout("Skipping #" + fileNr + ": " + tapeDir[fileNr]);
skipTapeFile(tapeCtl, fileNr);
fileNr++;
}
txn.oncomplete = function(ev) {
if (fileNr < topFileNr) {
loadTapeFile(tapeCtl, topFileNr, fileNr+1);
} else {
alert("Tape load completed");
}
};
nameParts = tapeDir[fileNr].split("/");
mfid = "0" + padToLength(nameParts[0] || " ", 7);
fid = "0" + padToLength(nameParts[1] || " ", 7);
stringToANSI(mfid, buf, 0);
@@ -992,19 +1023,11 @@ window.onload = function() {
ANSItoWords(buf, 0, 16, names, 0);
mfid = names[0];
fid = names[1];
loadAsMCP = $$("AsMCP_" + fileNr).checked;
loadAsInt = $$("AsINT_" + fileNr).checked;
while (!$$("File_" + fileNr).checked) {
skipFile(tapeCtl, fileNr);
fileNr++;
}
txn.oncomplete = function(ev) {
if (fileNr < topFileNr) {
loadNextFile(tapeCtl, topFileNr, fileNr+1);
} else {
alert("Tape load completed");
}
};
spout(" ");
spout("Loading #" + fileNr + ": " + tapeDir[fileNr]);
findDiskFile(mfid, fid, eu, loadFileHost);
}
@@ -1026,7 +1049,7 @@ window.onload = function() {
if (topFileNr <= 0) {
alert("loadFromTape: no files selected");
} else {
loadNextFile(tapeCtl, topFileNr, 1);
loadTapeFile(tapeCtl, topFileNr, 1);
}
}
@@ -1115,20 +1138,35 @@ window.onload = function() {
tapeDir = readTapeDirectory(tapeCtl);
row = document.createElement("tr");
// File number and checkbox (empty)
cell = document.createElement("td");
cell.colSpan=2;
row.appendChild(cell);
// File name
cell = document.createElement("td");
cell.appendChild(document.createTextNode("(none)"));
row.appendChild(cell);
// Load as MCP for no selection
cell = document.createElement("td");
cell.className = "center";
e = document.createElement("input");
e.type = "radio";
e.id = "AsMCP_0";
e.value = "0";
e.name = "AsMCP";
e.checked = true;
cell.appendChild(e);
row.appendChild(cell);
// Load as Intrinsics for no selection
cell = document.createElement("td");
cell.appendChild(document.createTextNode("(none)"));
cell.className = "center";
e = document.createElement("input");
e.type = "radio";
e.id = "AsINT_0";
e.value = "0";
e.name = "AsINT";
e.checked = true;
cell.appendChild(e);
row.appendChild(cell);
body.appendChild(row);
@@ -1148,6 +1186,10 @@ window.onload = function() {
e.value = "File_" + x;
cell.appendChild(e);
row.appendChild(cell);
// File ID
cell = document.createElement("td");
cell.appendChild(document.createTextNode(tapeDir[x]));
row.appendChild(cell);
// Load as MCP selection radio button
cell = document.createElement("td");
cell.className = "center";
@@ -1158,9 +1200,15 @@ window.onload = function() {
e.name = "AsMCP";
cell.appendChild(e);
row.appendChild(cell);
// File ID
// Load as Intrinsics selection radio button
cell = document.createElement("td");
cell.appendChild(document.createTextNode(tapeDir[x]));
cell.className = "center";
e = document.createElement("input");
e.type = "radio";
e.id = "AsINT_" + x;
e.value = x;
e.name = "AsINT";
cell.appendChild(e);
row.appendChild(cell);
body.appendChild(row);
}
@@ -1196,7 +1244,8 @@ window.onload = function() {
/**************************************/
function initializeDisk() {
/* Performs a B5500 Cold Start by initializing the directory structure on
the disk, overwriting (and destroying) whatever else was there before */
the disk, building segment 0, and loading the bootstrap, overwriting (and
destroying) whatever else was there before */
var buffer = new Uint8Array(240);
var eu;
var euName = euPrefix + "0";
@@ -1211,6 +1260,7 @@ window.onload = function() {
function loadBootstrap() {
/* Creates the Halt/Load Button Card image and stores it in segment 1 */
/* Note: this has been replaced by loadKernel -- not used */
var w = [];
w[ 0] = parseInt("0441341003604231", 8);
@@ -1237,6 +1287,297 @@ window.onload = function() {
eu.put(buffer, 1);
}
function loadKernel() {
/* Creates the Kernel bootstrap loaderand stores it starting in
segment 1. This code was generated using the Mark XVI KERNEL source
and XVI ESPOLXEM compiler */
var addr = 1; // Bootstrap starts at segment 1
var w = [];
w[ 0] = parseInt("0740623100000000", 8);
w[ 1] = parseInt("0000000000000000", 8);
w[ 2] = parseInt("0211101607302231", 8);
w[ 3] = parseInt("0004613100000000", 8);
w[ 4] = parseInt("0000000000000000", 8);
w[ 5] = parseInt("0014613100000000", 8);
w[ 6] = parseInt("0020613100000000", 8);
w[ 7] = parseInt("0060202102350000", 8);
w[ 8] = parseInt("0064202102350000", 8);
w[ 9] = parseInt("0070202102350000", 8);
w[10] = parseInt("0074202102350000", 8);
w[11] = parseInt("0000000000000000", 8);
w[12] = parseInt("0050613100000000", 8);
w[13] = parseInt("0000000000000000", 8);
w[14] = parseInt("0060613100000000", 8);
w[15] = parseInt("0064613100000000", 8);
w[16] = parseInt("0000000000000000", 8);
w[17] = parseInt("0000000000000000", 8);
w[18] = parseInt("0000000000000000", 8);
w[19] = parseInt("0000000000000000", 8);
w[20] = parseInt("0000000000000000", 8);
w[21] = parseInt("0000000000000000", 8);
w[22] = parseInt("0000000000000000", 8);
w[23] = parseInt("0000000000000000", 8);
w[24] = parseInt("0000000000000000", 8);
w[25] = parseInt("0000000000000000", 8);
w[26] = parseInt("0000000000000000", 8);
w[27] = parseInt("0000000000000000", 8);
w[28] = parseInt("0000000000000000", 8);
w[29] = parseInt("0000000000000000", 8);
wordsToANSI(w, 0, 30, buffer, 0);
eu.put(buffer, addr++);
w[ 0] = parseInt("0000000000000000", 8);
w[ 1] = parseInt("0000000000000000", 8);
w[ 2] = parseInt("0000000000000000", 8);
w[ 3] = parseInt("0534623100000000", 8);
w[ 4] = parseInt("0000000000000000", 8);
w[ 5] = parseInt("0000000000000000", 8);
w[ 6] = parseInt("0000000000000000", 8);
w[ 7] = parseInt("0000000000000000", 8);
w[ 8] = parseInt("0000000000000000", 8);
w[ 9] = parseInt("0000000000000000", 8);
w[10] = parseInt("0000000000000000", 8);
w[11] = parseInt("0000000000000000", 8);
w[12] = parseInt("0000000000000000", 8);
w[13] = parseInt("0000000000000000", 8);
w[14] = parseInt("0000000000000000", 8);
w[15] = parseInt("0000000000000000", 8);
w[16] = parseInt("0000000000000000", 8);
w[17] = parseInt("0000000000000000", 8);
w[18] = parseInt("0000000000000000", 8);
w[19] = parseInt("0000000000000000", 8);
w[20] = parseInt("0000000000000000", 8);
w[21] = parseInt("0000000000000000", 8);
w[22] = parseInt("0000000000000000", 8);
w[23] = parseInt("0000000000000000", 8);
w[24] = parseInt("0000000000000000", 8);
w[25] = parseInt("0000000000000000", 8);
w[26] = parseInt("0000000000000000", 8);
w[27] = parseInt("0000000000000000", 8);
w[28] = parseInt("0000000000000000", 8);
w[29] = parseInt("0000000000000000", 8);
wordsToANSI(w, 0, 30, buffer, 0);
eu.put(buffer, addr++);
w[ 0] = parseInt("0000000000000000", 8);
w[ 1] = parseInt("0000000000000000", 8);
w[ 2] = parseInt("0000000000000000", 8);
w[ 3] = parseInt("0000000000000000", 8);
w[ 4] = parseInt("0000000000000000", 8);
w[ 5] = parseInt("0000000000000000", 8);
w[ 6] = parseInt("0000000000000000", 8);
w[ 7] = parseInt("0000000000000000", 8);
w[ 8] = parseInt("0000000000000000", 8);
w[ 9] = parseInt("0000000000000000", 8);
w[10] = parseInt("0000000000000000", 8);
w[11] = parseInt("0000000000000000", 8);
w[12] = parseInt("0000000000000000", 8);
w[13] = parseInt("0000000000000000", 8);
w[14] = parseInt("0000000000000000", 8);
w[15] = parseInt("0000000000000000", 8);
w[16] = parseInt("0000000000000000", 8);
w[17] = parseInt("0000000000000000", 8);
w[18] = parseInt("0000000000000000", 8);
w[19] = parseInt("0000000000000000", 8);
w[20] = parseInt("0000000000000000", 8);
w[21] = parseInt("0000000000000000", 8);
w[22] = parseInt("0000000000000000", 8);
w[23] = parseInt("0000000000000000", 8);
w[24] = parseInt("0000000000000000", 8);
w[25] = parseInt("0000000000000000", 8);
w[26] = parseInt("0000000000000000", 8);
w[27] = parseInt("0000000000000000", 8);
w[28] = parseInt("0000000000000000", 8);
w[29] = parseInt("0000000000000000", 8);
wordsToANSI(w, 0, 30, buffer, 0);
eu.put(buffer, addr++);
w[ 0] = parseInt("0000000000000000", 8);
w[ 1] = parseInt("0000000000000000", 8);
w[ 2] = parseInt("0000000000000000", 8);
w[ 3] = parseInt("0000000000000000", 8);
w[ 4] = parseInt("0000000000000000", 8);
w[ 5] = parseInt("0000000000000000", 8);
w[ 6] = parseInt("0000000000000000", 8);
w[ 7] = parseInt("0000000000000000", 8);
w[ 8] = parseInt("0000000000000000", 8);
w[ 9] = parseInt("0000000000000000", 8);
w[10] = parseInt("0000000000000000", 8);
w[11] = parseInt("0000000000000000", 8);
w[12] = parseInt("0000000000000000", 8);
w[13] = parseInt("0000000000000000", 8);
w[14] = parseInt("0000000000000000", 8);
w[15] = parseInt("0000000000000000", 8);
w[16] = parseInt("0000000000000000", 8);
w[17] = parseInt("0000000000000000", 8);
w[18] = parseInt("0000000000000000", 8);
w[19] = parseInt("0000000000000000", 8);
w[20] = parseInt("0000000000000000", 8);
w[21] = parseInt("0000000000000000", 8);
w[22] = parseInt("5000000000000000", 8);
w[23] = parseInt("0000000000000000", 8);
w[24] = parseInt("0000000000000000", 8);
w[25] = parseInt("0000000000000000", 8);
w[26] = parseInt("0000000000000000", 8);
w[27] = parseInt("7660000000000022", 8);
w[28] = parseInt("7560000000000371", 8);
w[29] = parseInt("7560000000000400", 8);
wordsToANSI(w, 0, 30, buffer, 0);
eu.put(buffer, addr++);
w[ 0] = parseInt("0400001421410230", 8);
w[ 1] = parseInt("1003014102301003", 8);
w[ 2] = parseInt("0141202111120055", 8);
w[ 3] = parseInt("0101102510211003", 8);
w[ 4] = parseInt("0141000010250421", 8);
w[ 5] = parseInt("0211023010030141", 8);
w[ 6] = parseInt("2021111600550225", 8);
w[ 7] = parseInt("0024223102301003", 8);
w[ 8] = parseInt("0141000010250421", 8);
w[ 9] = parseInt("0044613100550055", 8);
w[10] = parseInt("0000000000010000", 8);
w[11] = parseInt("0000000000070000", 8);
w[12] = parseInt("0004101441211020", 8);
w[13] = parseInt("2021062001411003", 8);
w[14] = parseInt("0141777462551261", 8);
w[15] = parseInt("1265101004210204", 8);
w[16] = parseInt("1003014110102021", 8);
w[17] = parseInt("5355304510250421", 8);
w[18] = parseInt("0204100301412021", 8);
w[19] = parseInt("1003014102001025", 8);
w[20] = parseInt("0421021010030141", 8);
w[21] = parseInt("0064102504210441", 8);
w[22] = parseInt("1642005502041003", 8);
w[23] = parseInt("0141202154251032", 8);
w[24] = parseInt("0000442504740231", 8);
w[25] = parseInt("0224100301410004", 8);
w[26] = parseInt("1012045510451025", 8);
w[27] = parseInt("0421020410030141", 8);
w[28] = parseInt("2021100301411646", 8);
w[29] = parseInt("0055022410030141", 8);
wordsToANSI(w, 0, 30, buffer, 0);
eu.put(buffer, addr++);
w[ 0] = parseInt("2021745550610265", 8);
w[ 1] = parseInt("1025042104411652", 8);
w[ 2] = parseInt("0055020410030141", 8);
w[ 3] = parseInt("2021542510320051", 8);
w[ 4] = parseInt("0204100301412021", 8);
w[ 5] = parseInt("1003014116560055", 8);
w[ 6] = parseInt("0224100301412021", 8);
w[ 7] = parseInt("7455506102651025", 8);
w[ 8] = parseInt("0421044116520055", 8);
w[ 9] = parseInt("0204100301412021", 8);
w[10] = parseInt("5425103200510210", 8);
w[11] = parseInt("1003014102101003", 8);
w[12] = parseInt("0141202102241003", 8);
w[13] = parseInt("0141202100240401", 8);
w[14] = parseInt("0101102504210204", 8);
w[15] = parseInt("1003014120211003", 8);
w[16] = parseInt("0141000010250421", 8);
w[17] = parseInt("0220100301410441", 8);
w[18] = parseInt("0204100301412021", 8);
w[19] = parseInt("1662005501411032", 8);
w[20] = parseInt("1025042102201003", 8);
w[21] = parseInt("0141202100004425", 8);
w[22] = parseInt("0024213100041003", 8);
w[23] = parseInt("0141001010121025", 8);
w[24] = parseInt("0421021410030141", 8);
w[25] = parseInt("0004101210250421", 8);
w[26] = parseInt("0210100301412021", 8);
w[27] = parseInt("1012100304211002", 8);
w[28] = parseInt("0004100301412021", 8);
w[29] = parseInt("4125004022310230", 8);
wordsToANSI(w, 0, 30, buffer, 0);
eu.put(buffer, addr++);
w[ 0] = parseInt("1003014116660055", 8);
w[ 1] = parseInt("1025042102341003", 8);
w[ 2] = parseInt("0141167200551025", 8);
w[ 3] = parseInt("0421024010030141", 8);
w[ 4] = parseInt("1676005510250421", 8);
w[ 5] = parseInt("0441170200551032", 8);
w[ 6] = parseInt("0051000000140131", 8);
w[ 7] = parseInt("0200100301410444", 8);
w[ 8] = parseInt("1025042104411706", 8);
w[ 9] = parseInt("0055023010030141", 8);
w[10] = parseInt("2021021510360200", 8);
w[11] = parseInt("1003014100501025", 8);
w[12] = parseInt("0421044117120055", 8);
w[13] = parseInt("0230100301412021", 8);
w[14] = parseInt("0215103602001003", 8);
w[15] = parseInt("0141000010250421", 8);
w[16] = parseInt("0441171600550230", 8);
w[17] = parseInt("1003014120210215", 8);
w[18] = parseInt("1036023010030141", 8);
w[19] = parseInt("0230100301412021", 8);
w[20] = parseInt("0200010110250421", 8);
w[21] = parseInt("0064100301411722", 8);
w[22] = parseInt("0055102504210070", 8);
w[23] = parseInt("1003014117260055", 8);
w[24] = parseInt("1025042100741003", 8);
w[25] = parseInt("0141173200551025", 8);
w[26] = parseInt("0421100200100301", 8);
w[27] = parseInt("1003042110020224", 8);
w[28] = parseInt("1003014120217455", 8);
w[29] = parseInt("2461026502141003", 8);
wordsToANSI(w, 0, 30, buffer, 0);
eu.put(buffer, addr++);
w[ 0] = parseInt("0141202174552261", 8);
w[ 1] = parseInt("0265100304210004", 8);
w[ 2] = parseInt("0014214100000010", 8);
w[ 3] = parseInt("2141006410030141", 8);
w[ 4] = parseInt("4231000401042231", 8);
w[ 5] = parseInt("0024413100550055", 8);
w[ 6] = parseInt("0140004000000000", 8);
w[ 7] = parseInt("0000000000004060", 8);
w[ 8] = parseInt("0140000100000000", 8);
w[ 9] = parseInt("0000000000006060", 8);
w[10] = parseInt("0140000040100000", 8);
w[11] = parseInt("3145652143312460", 8);
w[12] = parseInt("2124245125626260", 8);
w[13] = parseInt("2646516044234737", 8);
w[14] = parseInt("0740000000000046", 8);
w[15] = parseInt("0140000047704235", 8);
w[16] = parseInt("0140000047700473", 8);
w[17] = parseInt("0140000041200017", 8);
w[18] = parseInt("0441023201004441", 8);
w[19] = parseInt("0253010453527705", 8);
w[20] = parseInt("3705005101002411", 8);
w[21] = parseInt("0000102642314006", 8);
w[22] = parseInt("0235000000000000", 8);
w[23] = parseInt("0000700744110220", 8);
w[24] = parseInt("1003014104411022", 8);
w[25] = parseInt("1025042102201003", 8);
w[26] = parseInt("0141202141552345", 8);
w[27] = parseInt("4004042140060024", 8);
w[28] = parseInt("0415000044250140", 8);
w[29] = parseInt("0131400602350000", 8);
wordsToANSI(w, 0, 30, buffer, 0);
eu.put(buffer, addr++);
w[ 0] = parseInt("0441100202001003", 8);
w[ 1] = parseInt("0141202101017006", 8);
w[ 2] = parseInt("5355304544410222", 8);
w[ 3] = parseInt("0104106601007006", 8);
w[ 4] = parseInt("1003014120210555", 8);
w[ 5] = parseInt("1045003402317006", 8);
w[ 6] = parseInt("0060715503610565", 8);
w[ 7] = parseInt("7004042102201003", 8);
w[ 8] = parseInt("0141044170061032", 8);
w[ 9] = parseInt("1025042102201003", 8);
w[10] = parseInt("0141202100004425", 8);
w[11] = parseInt("0100013104350000", 8);
w[12] = parseInt("0000000000000000", 8);
w[13] = parseInt("0000000000000000", 8);
w[14] = parseInt("0000000000000000", 8);
w[15] = parseInt("0000000000000000", 8);
wordsToANSI(w, 0, 30, buffer, 0);
eu.put(buffer, addr++);
}
function enterFile(mfid, fid, areas, areasize) {
/* Enters a file into the disk directory. This routine will only create
one directory block, so do not call this routine more than 15 times.
@@ -1281,7 +1622,7 @@ window.onload = function() {
eu.put(buffer, 0);
// Load the Halt Load Button Card image
loadBootstrap(); // load the Halt/Load Button Card image
loadKernel(); // load the Kernel bootstrap program
// Note: it is not necessary the clear out the ESPDISK area, since on a
// cold start the entire EU object store is cleared.
@@ -1388,12 +1729,12 @@ window.onload = function() {
eu = txn.objectStore(euName);
txn.objectStore("CONFIG").get(0).onsuccess = function(ev) {
config = ev.target.result; // global assignment
if (!config) {
alert("No CONFIG object in database");
txn.abort();
} else {
// If we're going to cold start, may as well start with an empty EU store
eu.clear().onsuccess = function(ev) {
initializeDirectory(config);
}
@@ -1507,7 +1848,7 @@ window.onload = function() {
$$("ColdstartBtn").disabled = false;
$$("FileSelector").disabled = false;
//dumpDisk(); // <<<<<<<<<<<<<< DEBUG <<<<<<<<<<<<<<<<<
dumpDisk(); // <<<<<<<<<<<<<< DEBUG <<<<<<<<<<<<<<<<<
disk.transaction("CONFIG").objectStore("CONFIG").get(0).onsuccess = function(ev) {
config = ev.target.result;
@@ -1591,11 +1932,12 @@ TBODY#TapeDirBody {
<tr>
<th>Nr
<th>Load
<th>as MCP
<th>File ID
<th>as MCP
<th>as INT
<tbody id=TapeDirBody>
</table>
<input id=LoadBtn type=button value="Load" DISABLED>
<br><input id=LoadBtn type=button value="Load" accessKey=L DISABLED>
</div>
<pre id=TextPanel>