1
0
mirror of https://github.com/pkimpel/retro-b5500.git synced 2026-02-12 11:17:29 +00:00

Commit DCMCP transcription as of 2013-01-01; continue development of B5500ColdLoader (cold start working).

This commit is contained in:
paul
2013-01-01 21:54:06 +00:00
parent 243ca17428
commit c57e11fe97
2 changed files with 303 additions and 137 deletions

View File

@@ -18595,3 +18595,109 @@ ZIPLIST: 20600380
AGN: TALLY:=1; EOS:=TALLY; 20600450
DUN: DS:=LIT"~"; 20600455
ZZP(D:=SI; SI:=LOC D; DI:=CARDLOC; DS:=WDS); 20600460
END; 20600465
SPOUTER(NT1,SPOUTUNIT,64); 20600470
IF P AND (UNITNO=31) THEN 20600480
GO Z;PLIST; 20600490
ABORT:=0; 20600500
END LISTHECARD; 20600510
$ POP OMIT 20600511
P(0,0,0,0,0,0,0,0,0,0);% 20600600
P(0,0,0,0,0,0,0,0,0,0);% 20600650
P(0,0,0,0,0,0,0,0,0,0);% 20600700
P(0,0,0,0); 20600750
% DO NOT ZERO THE LAST THREE LOCALS (RETURN-MSCW, RCW, & VAL) 20600755
RCW:=RCW & P1(..CONTROLCARD,LOD)[CTC]; 20600760
UNITNO := CARD.[2:6]; 20600850
IF CARD.[33:15] = 0 THEN 20600900
BEGIN CARD.[33:15] := GETSPACE(13,0,0)+4; 20600950
IF WAITIO(CARD INX @40000000,@15,UNITNO).[45:3] NEQ 0% 20601000
THEN 20601050
BEGIN LABELTABLE[UNITNO] := @114;% 20601100
RRRMECH := NOT TWO (UNITNO) AND RRRMECH;% 20601150
FORGETSPACE(CARD INX NOT 1);% 20601200
KILL([MSCW]); 20601250
END; 20601300
END; 20601350
COMMENT GET OWN STACK AND GET RID OF INDEPENDENT STACK;% 20601400
COMMENT SET UP ACCUM ARRAY FOR SCAN;% 20601450
ACCUM:=[M[SPACE(10)]]&10[8:38:10];% 20601500
ACCUM[0] := 0;% 20601550
IF (CCTBLWORD:=P(CCTBLWORD,DUP)&(P.[FF]+1)[CTF]).[FF]>1 THEN 20601600
BEGIN 20601620
IF CCTBLADDR=0 THEN SLEEP([CCTBLWORD],@77777); 20601640
DIRECT:=[C[CCTBLWORD]]&CCTABLSZ[8:38:10]; 20601660
END ELSE 20601680
BEGIN 20601700
DIRECT:=[M[T:=SPACE(CCTABLSZ)]]&CCTABLSZ[8:38:10]; 20601720
DISKWAIT(-T,CCTABLSZ,MESSAGETABLE[3].[22:26]); 20601740
CCTABLDDR:=T; 20601760
END; 20601780
CMM:=[M[GETSPACE(130,2,0)+2]]&30[8:38:10];% 20601850
PEQN:=(31 INX (CEQN:=(31 INX(PROG:=(31 INX CMM)))));% 20601900
% PLACE "." IN COL 73 ;% 20601950
CARDLOC := CARD INX 0;% 20602000
IF UNITNO=25 OR UNITNO=26 OR UNITNO=30 OR UNITNO=31 THEN 20602050
SOURCE:=CARDLOC ELSE 20602100
M[(SOURCE:=CARDLOC)+9] := @3277320000000000; % .". 2B XTRA SAFE20602150
IF UNITNO GEQ 32 AND UNITCODE[UNITNO-23].[1:1] THEN 20602200
UNITCODE[UNITNO-23]:=M[CARDLOC + 10]; 20602250
IF UNITNO=25 OR UNITNO=31 THEN USERID:=MCP ELSE% 20602300
BEGIN IF UNITNO=26 THEN UNITNO:=31;% 20602350
USERID:=UNITCODE[UNITNO-23];% 20602400
$ SET OMIT = NOT(DATACOM AND RJE ) 20602409
END;% 20602450
SPOUTUNIT:=( 20602460
$ SET OMIT = NOT(PACKETS) 20602469
IF ZIPMIX!0 AND PSEUDOMIX[ZIPMIX] GEQ 32 THEN 20602470
PSEUDOMIX[ZIPMIX] ELSE 20602480
IF UNITNO GEQ 32 THEN UNITNO ELSE 20602490
$ POP OMIT 20602491
0)&CARD[9:9:9]; 20602500
$ SET OMIT = NOT(PACKETS) 20602509
IF UNITNO GEQ 32 THEN 20602510
IF PKTONLY THEN %124-20602515
IF PSEUDO[UNITNO-32]=0 THEN 20602520
PRINTTHECOVER(CARDLOC&CARD[9:9:9],UNITNO,PSOURCE); 20602530
LASTSCAN:=0&1[2:47:1]; 20602540
$ POP OMIT 20602541
COMMENT SCAN FOR CARD WITH QUESTION MARK IN COL. 1;% 20602550
CC: IF SCAN NEQ QUEST THEN GO TO INCSC;% 20602650
T:=SCAN; 20602700
CCTYPE: IF (T LSS UNLOCKV) OR (T GTR RESETV) THEN 20602800
GO TO INCSC;% 20602850
PPCPROCESS:=0;% %173-20602855
PROCVAL:=0; %128-20602860
IF CARD.[9:9] NEQ 0 THEN% 20602900
$ SET OMIT = NOT(DATACOM AND RJE ) 20602909
IF CCFIND THEN GO TO INCSC; 20602950
IF (T LEQ LOAD AND (T GEQ RUNV) THEN 20603000
BEGIN % 20603050
M[CARDLOC - 2] := 0;% 20603100
M[CARDLOC -1] :=10;% 20603150
CMM[6]:= GETESPDISK & 10[18:33:15];% 20603200
$ SET OMIT = NOT(DATACOM AND RJE ) 20603209
DISKWAIT(CARDLOC-2,11,CMM[6] INX 0); 20603250
END;% 20603350
$ SET OMIT = NOT(PACKETS) 20603359
LISTHECARD; 20603360
$ POP OMIT 20603361
% WRITE OUT CONTROL CARD FOR LOGGING ROUTINE% 20603400
% BRANCH ON 1ST WORD ON CONTROL CARD% 20603450
LIBNO:=0; 20603500
TOG:= FALSE; 20603550
IF UNITNO GEQ 32 THEN %780-20603560
IF T=PACKET OR T=USER THEN ELSE %780-20603565
IF (USERID.[1:1] AND USERID ! MCP) THEN %780-20603570
BEGIN USERID ~ "U000000"; %780-20603575
UNITCODE[UNIT-23] ~ USERID %780-20603580
END; %780-20603590
GO TO TYPE[T-UNLOCKV]; 20603600
% COMPILER CALL OUT CARD% 20603700
COMPILE: IF CCCOMPILE THEN GO INCSC; 20603750
INITIALIZATION: OPTNN:=INITIALIZEIT; GO DOWN; 20603900
BEFORETRYNEXT: IF OPTN=PERIO THEN GO TO CONTROLLER; 20604050
TRYNEXT: IF KOUNT=@14 THEN 20604100
IF SOURCE=(CARDLOC&1[30:45:3]) THEN 20604105
BEGIN 20604110
PPCPROCESS:=1; T:=SCAN; GO CONTROLA; 20604115

View File

@@ -648,160 +648,192 @@ window.onload = function() {
reader.readAsArrayBuffer(f);
}
function loadBootstrap(eu, buffer) {
/* Creates the Halt/Load Button Card image and stores it in segment 1 */
var w = [];
w[ 0] = parseInt("0441341003604231", 8);
w[ 1] = parseInt("7500000000000023", 8);
w[ 2] = parseInt("0211001441310435", 8);
w[ 3] = parseInt("7012700704210014", 8);
w[ 4] = parseInt("4411005441314155", 8);
w[ 5] = parseInt("6461106500000425", 8);
w[ 6] = parseInt("0074013100644131", 8);
w[ 7] = parseInt("0000006200644131", 8);
w[ 8] = parseInt("0000006601044131", 8);
w[ 9] = parseInt("0000007201244131", 8);
w[10] = parseInt("0000007601444131", 8);
w[11] = parseInt("5140000040700137", 8);
w[12] = parseInt("5140000047700461", 8);
w[13] = parseInt("5140000047704223", 8);
w[14] = parseInt("7700000000000037", 8);
w[15] = parseInt("0153020404050000", 8);
w[16] = parseInt("0167010604410440", 8);
w[17] = parseInt("0163010604410010", 8);
w[18] = parseInt("0157010604410660", 8);
w[19] = parseInt("0600017205204131", 8);
wordsToANSI(w, 0, 30, buffer, 0);
eu.put(buffer, 1);
}
function enterFile(mfid, fid, areas, areasize, eu, buffer, directoryTop, labels, fileNr, segNr) {
/* Enters a file into the disk directory. The loader will only create
one directory block, so do not call this routine more than 15 times.
Only the first row is allocated. Returns the next available segment address */
var header = [];
var labelx = 240-(fileNr+1)*16;
stringToANSI(padToLength(mfid, 7), labels, labelx+1);
stringToANSI(padToLength(fid, 7), labels, labelx+9);
if (labelx > 15) {
labels[labelx-9] = 0x4C; // @114, last-entry marker
}
header[0] = 0x41; // BIC "11" = @0101 = 1 rec/block, 1 seg/block
header[3] = 0x1001200; // Date: BIC "00010180" = 1980-01-01
header[7] = areas*areasize-1;
header[8] = areasize;
header[9] = areas;
header[10] = segNr;
wordsToANSI(header, 0, 30, buffer, 0);
eu.put(buffer, directoryTop + 18 - fileNr);
return segNr + areasize;
}
function initializeDisk() {
/* Performs a B5500 Cold Start by initializing the directory structure on
the disk, overwriting (and destroying) whatever else was there before */
var buffer = new Uint8Array(240);
var eu = disk.transaction(euPrefix+"0", "readwrite").objectStore(euPrefix+"0");
var eu;
var euName = euPrefix + "0";
var fileLabels = new Uint8Array(240);
var fileNr = 0;
var info = [];
var segNr;
var shar = [];
var txn;
var zeroes = new Uint8Array(240);
var x;
fileLabels[14*16+7] = 0x4C; // @114, last-entry marker
function loadBootstrap(eu, buffer) {
/* Creates the Halt/Load Button Card image and stores it in segment 1 */
var w = [];
shar[ 0] = 1; // number of shared-disk systems
shar[ 1] = directoryTop;
shar[ 2] = 0;
shar[ 3] = 0;
shar[ 4] = directoryEnd; // DIRECT deck option
eu.put(shar, 0);
loadBootstrap(eu, buffer); // load the Halt/Load Button Card image
for (x=50; x<directoryTop; x++) {
eu.put(zeroes, x);
w[ 0] = parseInt("0441341003604231", 8);
w[ 1] = parseInt("7500000000000023", 8);
w[ 2] = parseInt("0211001441310435", 8);
w[ 3] = parseInt("7012700704210014", 8);
w[ 4] = parseInt("4411005441314155", 8);
w[ 5] = parseInt("6461106500000425", 8);
w[ 6] = parseInt("0074013100644131", 8);
w[ 7] = parseInt("0000006200644131", 8);
w[ 8] = parseInt("0000006601044131", 8);
w[ 9] = parseInt("0000007201244131", 8);
w[10] = parseInt("0000007601444131", 8);
w[11] = parseInt("5140000040700137", 8);
w[12] = parseInt("5140000047700461", 8);
w[13] = parseInt("5140000047704223", 8);
w[14] = parseInt("7700000000000037", 8);
w[15] = parseInt("0153020404050000", 8);
w[16] = parseInt("0167010604410440", 8);
w[17] = parseInt("0163010604410010", 8);
w[18] = parseInt("0157010604410660", 8);
w[19] = parseInt("0600017205204131", 8);
wordsToANSI(w, 0, 30, buffer, 0);
eu.put(buffer, 1);
}
info[ 0] = // option word
// 47: use DRA
// 46: use DRB
pow2[47-45] + // 45: print BOJ
pow2[47-44] + // 44: print EOJ
pow2[47-43] + // 43: type file open
pow2[47-42] + // 42: call TERMINATE procedure
pow2[47-41] + // 41: initialize date @ H/L
pow2[47-40] + // 40: initialize time @ H/L
// 39: use only one breakout tape
// 38: automatically print pbt
pow2[47-37] + // 37: clear write ready status @ terminal
pow2[47-36] + // 36: write disc. code on terminal
pow2[47-35] + // 35: type when compiler files open & close
pow2[47-34] + // 34: type file close
pow2[47-33] + // 33: error msgs when progr recovery used
pow2[47-32] + // 32: type MT retention messages
pow2[47-31] + // 31: type library messages
pow2[47-30] + // 30: type schedule messages
pow2[47-29] + // 29: type file security messages
pow2[47-28] + // 28: prevent I/O below user disk area
pow2[47-27] + // 27: prevent disk RELEASE statement
pow2[47-26] + // 26: printer backup disk release
pow2[47-25] + // 25: check memory links
pow2[47-24] + // 24: type disk error messages
pow2[47-23] + // 23: disk logging
pow2[47-22] + // 22: suppress library error messages
pow2[47-21] + // 21: go to printer back-up only
pow2[47-20] + // 20: dont stack files on PB tapes
pow2[47-19] + // 19: print set or reset messages
// 18: no user disk will unload expired
pow2[47-17] + // 17: run all decks(SHAREDISK)
// 16: olay core to ECM(AUXMEM)
pow2[47-15] + // 15: job core estimates(STATISTICS)
// 14: olay data to ECM(AUXMEM)
pow2[47-13] + // 13: makes system hang on-should HL msg
// 12: enables datacom(TSS, if not DCP)
pow2[47-11] + // 11: library messages for CANDE
pow2[47-10] + // 10: ZIP decks to run on batch(SHAREDISK)
// 9: controls running of batch jobs on TSS
// 8: UNUSED
// 7: UNUSED
// 6: UNUSED
// 5: UNUSED
// 4: UNUSED
// 3: UNUSED
pow2[47- 2] + // 2: Model III I/O channels
// 1: UNUSED
0; // 0: (flag bit)
function enterFile(mfid, fid, areas, areasize, eu, buffer, directoryTop, labels, fileNr, segNr) {
/* Enters a file into the disk directory. The loader will only create
one directory block, so do not call this routine more than 15 times.
Only the first row is allocated. Returns the next available segment address */
var header = [];
var labelx = 240-(fileNr+1)*16;
info[ 1] = 0x1001200; // Date: BIC "00010180" = 1980-01-01
info[ 2] = config.eus; // number of EUs
info[ 3] = 0; // not used
info[ 4] = directoryEnd; // DIRECT deck option
info[ 5] = 0; // last number used for control deck
info[ 6] = 0; // first control deck queued
info[ 7] = 0; // last control deck queued
info[ 8] = 0; // next number available for printer backup disk
info[ 9] = 1; // multiprocessing core factor
info[10] = 0; // SPO stations (through info[15])
info[11] = 0;
info[12] = 0;
info[13] = 0;
info[14] = 0;
info[15] = 0;
info[16] = 15; // Q value for datacom input
wordsToANSI(info, 0, 30, buffer, 0);
eu.put(buffer, directoryTop);
stringToANSI(padToLength(mfid, 7), labels, labelx+1);
stringToANSI(padToLength(fid, 7), labels, labelx+9);
if (labelx > 15) {
stringToANSI("0000001?", labels, labelx-16); // @114, last-entry marker
stringToANSI("00000000", labels, labelx-8);
}
header[0] = 0x41; // BIC "11" = @0101 = 1 rec/block, 1 seg/block
header[3] = 0x1001200; // Date: BIC "00010180" = 1980-01-01
header[7] = areas*areasize-1;
header[8] = areasize;
header[9] = areas;
header[10] = segNr;
wordsToANSI(header, 0, 30, buffer, 0);
eu.put(buffer, directoryTop + 18 - fileNr);
segNr = directoryEnd + 1;
segNr = enterFile("SYSTEM", "LOG", 1, 20000, eu, buffer, directoryTop, fileLabels, fileNr, segNr);
fileNr++;
return segNr + areasize;
}
/***** Start of initializeDisk *****/
wordsToANSI(shar, 0, 30, zeroes, 0); // create a segment buffer of zeroes
wordsToANSI(shar, 0, 30, fileLabels, 0); // initialize the file name label block
// Start a transaction
txn = disk.transaction([euName, "CONFIG"], "readwrite");
txn.oncomplete = function(ev) {
alert("Cold Start completed successfully");
};
eu = txn.objectStore(euName);
txn.objectStore("CONFIG").get(0).onsuccess = function(ev) {
config = ev.target.result;
if (!config) {
alert("No CONFIG object in database");
txn.abort();
} else {
// Initialize the directory labels segment
stringToANSI("0000001?", fileLabels, 14*16); // @114, last-entry marker
stringToANSI("00000000", fileLabels, 14*16+8);
// Initialize segment 0
shar[ 0] = 1; // number of shared-disk systems
shar[ 1] = directoryTop;
shar[ 2] = 0;
shar[ 3] = 0;
shar[ 4] = directoryEnd; // DIRECT deck option
wordsToANSI(shar, 0, 30, buffer, 0);
eu.put(buffer, 0);
// Load the Halt Load Button Card image
loadBootstrap(eu, buffer); // load the Halt/Load Button Card image
// Clean out the ESPDISK area
for (x=50; x<directoryTop; x++) {
eu.put(zeroes, x);
}
// Initialize the DIRECTORYTOP segment
info[ 0] = // option word
// 47: use DRA
// 46: use DRB
pow2[47-45] + // 45: print BOJ
pow2[47-44] + // 44: print EOJ
pow2[47-43] + // 43: type file open
pow2[47-42] + // 42: call TERMINATE procedure
pow2[47-41] + // 41: initialize date @ H/L
pow2[47-40] + // 40: initialize time @ H/L
// 39: use only one breakout tape
// 38: automatically print pbt
pow2[47-37] + // 37: clear write ready status @ terminal
pow2[47-36] + // 36: write disc. code on terminal
pow2[47-35] + // 35: type when compiler files open & close
pow2[47-34] + // 34: type file close
pow2[47-33] + // 33: error msgs when progr recovery used
pow2[47-32] + // 32: type MT retention messages
pow2[47-31] + // 31: type library messages
pow2[47-30] + // 30: type schedule messages
pow2[47-29] + // 29: type file security messages
pow2[47-28] + // 28: prevent I/O below user disk area
pow2[47-27] + // 27: prevent disk RELEASE statement
pow2[47-26] + // 26: printer backup disk release
pow2[47-25] + // 25: check memory links
pow2[47-24] + // 24: type disk error messages
pow2[47-23] + // 23: disk logging
pow2[47-22] + // 22: suppress library error messages
pow2[47-21] + // 21: go to printer back-up only
pow2[47-20] + // 20: dont stack files on PB tapes
pow2[47-19] + // 19: print set or reset messages
// 18: no user disk will unload expired
pow2[47-17] + // 17: run all decks(SHAREDISK)
// 16: olay core to ECM(AUXMEM)
pow2[47-15] + // 15: job core estimates(STATISTICS)
// 14: olay data to ECM(AUXMEM)
pow2[47-13] + // 13: makes system hang on-should HL msg
// 12: enables datacom(TSS, if not DCP)
pow2[47-11] + // 11: library messages for CANDE
pow2[47-10] + // 10: ZIP decks to run on batch(SHAREDISK)
// 9: controls running of batch jobs on TSS
// 8: UNUSED
// 7: UNUSED
// 6: UNUSED
// 5: UNUSED
// 4: UNUSED
// 3: UNUSED
pow2[47- 2] + // 2: Model III I/O channels
// 1: UNUSED
0; // 0: (flag bit)
info[ 1] = 0x1001200; // Date: BIC "00010180" = 1980-01-01
info[ 2] = config.eus; // number of EUs
info[ 3] = 0; // not used
info[ 4] = directoryEnd; // DIRECT deck option
info[ 5] = 0; // last number used for control deck
info[ 6] = 0; // first control deck queued
info[ 7] = 0; // last control deck queued
info[ 8] = 0; // next number available for printer backup disk
info[ 9] = 1; // multiprocessing core factor
info[10] = 0; // SPO stations (through info[15])
info[11] = 0;
info[12] = 0;
info[13] = 0;
info[14] = 0;
info[15] = 0;
info[16] = 15; // Q value for datacom input
wordsToANSI(info, 0, 30, buffer, 0);
eu.put(buffer, directoryTop);
// Create a file entry for the system log
segNr = directoryEnd + 1;
segNr = enterFile("SYSTEM", "LOG", 1, 20000, eu, buffer, directoryTop, fileLabels, fileNr, segNr);
fileNr++;
// Store the directory labels segment
eu.put(fileLabels, directoryTop + 19); // write the directory block file labels
}
};
eu.put(fileLabels, directoryTop + 19); // write the directory block file labels
}
function configureDatabase(ev) {
@@ -855,6 +887,31 @@ window.onload = function() {
alert("Database \"" + disk.name + "\" error: " + ev.target.result.error);
}
function dumpDisk() {
/* Dumps the initial and directory portions of the disk */
var txn = disk.transaction("EU0");
var eu = txn.objectStore("EU0");
var range = IDBKeyRange.upperBound(directoryTop+20);
var req = eu.openCursor(range);
var lastKey = -1;
spout("===== START OF DISK DUMP =====");
req.onsuccess = function(ev) {
var cursor = ev.target.result;
if (cursor) {
if (cursor.key-lastKey > 1) {
spout("----- " + (cursor.key-lastKey-1) + " unallocated segments -----");
}
spout(cursor.key + ": " + String.fromCharCode.apply(null, cursor.value));
lastKey = cursor.key;
cursor.continue();
} else {
spout("===== END OF DISK DUMP =====");
}
};
}
function openDatabase(name, version) {
/* Attempts to open the disk subsystem database for the specified "name"
and "version". Returns the IDB database object if successful, or null if
@@ -877,6 +934,8 @@ window.onload = function() {
alert("Disk database opened: " + name + " #" + disk.version);
disk.onerror = genericDBError;
$$("ColdstartBtn").disabled = false;
dumpDisk(); // <<<<<<<<<<<<<< DEBUG <<<<<<<<<<<<<<<<<
};
req.onupgradeneeded = configureDatabase;
@@ -898,7 +957,8 @@ window.onload = function() {
if (missing.length == 0) {
return false;
} else {
alert("No can do... your browser does not support the following features:\n" + missing.substring(2));
alert("No can do... your browser does not support the following features:\n" +
missing.substring(2));
return true;
}
}