1
0
mirror of https://github.com/retro-software/B5500-software.git synced 2026-03-02 17:44:40 +00:00
Files
Paul Kimpel 2c72f7fd1d Commit CUBE Library version 13 of February 1972.
1. Commit library tape images, directories, and extracted text files.
2. Commit additional utilities under Unisys-Emode-Tools.
2018-05-27 11:24:23 -07:00

152 lines
12 KiB
Plaintext

$+STREAM 00000000
BEGIN % LINKED MESSAGE FILE HANDLER 00001000
% L P MCQUOWN 00002000
% WESTINGHOUSE R & D 00003000
% INPUT FORMAT: 2 I4 FIELDS FOLLOWED BY 72 CHR OF TEXT 00004000
% LEFT # = LINK TO CONTINUED TEXT ELSE 0 00005000
% RIGHT #= PHYSICAL RECORD # OF THIS TEXT IMAGE 00006000
% COM=0 LIST "DISK" 00007000
% COM=1 DUMP "DISK" -> "PUNCH" 00008000
% COM=2 LIST "DISK" LOCATE 00009000
% COM=3 DUMP "DISK" -> "NEWDISK" 00010000
% COM=4 LOAD "CARD" -> "MESSAGE" 00011000
% COM=6 LOAD "CARD" -> "MESSAGE" LOCK 00012000
00013000
BOOLEAN COM; 00014000
INTEGER I,CT,ERCT,TOP,LEFT,RIGHT,RT; 00015000
DEFINE D32 = [36:7]#, 00016000
M32 = [43:5]#; 00017000
LABEL LEOF,LOD,EOF,NEXT,DMP,RCVR,FINISH,ER; 00018000
00019000
ARRAY A[0:9], % INCOMING DATA ROW 00020000
NEED[0:127], % REQUESTED LINKS 00021000
HAVE[0:127]; % RECORDS ENCOUNTERED 00022000
FORMAT L1("MESSAGE FILE: "A1,A6"/"A1,A6), 00023000
L2(//I4" MESSAGES"), 00024000
L3(X80"ERROR IN MESSAGE FILE"); 00025000
FORMAT F1(X80"RECORD OUT OF BOUNDS:"2I5), 00026000
F2(X80"DUPLICATE TEXT RECORD"I5), 00027000
F3(X80"MISSING TEXT RECORD"I5), 00028000
F4(//I4" RECORDS,"I4" ERRORS."); 00029000
FORMAT D1(//I4" VALID RECORDS IN ERROR FILE"); 00030000
FILE CARD (2,10,150); 00031000
FILE LINE 6(1,15); 00032000
FILE MESSAGE DISK RANDOM [20:210] (1,10,30,SAVE 780); 00033000
FILE DISK DISK RANDOM (1,10,30); 00034000
FILE PUNCH 32(5,10); 00035000
FILE NEWDISK DISK SERIAL [20:210] (2,10,30,SAVE 780); 00036000
00037000
PROCEDURE VALIDATE; 00038000
BEGIN 00039000
FORMAT NOFILE("NO FILE: "A1,A6"/"A1,A6), 00040000
WRONG("IMPROPER RECORD SIZE:"I5" ! 10"); 00041000
SEARCH(DISK,A[*]); 00042000
IF A[0] { 0 THEN BEGIN 00043000
WRITE(LINE,NOFILE,A[1].[6:6],A[1],A[2].[6:6],A[2]); 00044000
GO FINISH; 00045000
END; 00046000
IF A[3] ! 10 THEN BEGIN 00047000
WRITE(LINE,WRONG,A[3]); 00048000
GO FINISH; 00049000
END; 00050000
TOP ~ A[5]; 00051000
END; 00052000
STREAM PROCEDURE ZOT(A,B); VALUE B; BEGIN 00053000
SI~A; DI~A; SI~SI+4; DS~4 CHR; DS~4 LIT " "; 00054000
B(DI~A; DS~4 LIT " "); END; 00055000
STREAM PROCEDURE REQUEST(A,B); VALUE B; BEGIN 00056000
DI~A; DI~DI+1; SKIP B DB; DS~ SET END; 00057000
BOOLEAN STREAM PROCEDURE ALREADY(A,B); VALUE B; BEGIN 00058000
SI~A; SI~SI+1; SKIP B SB; 00059000
IF SB THEN TALLY~1; ALREADY~TALLY END; 00060000
STREAM PROCEDURE DECODE(A,L,R); BEGIN 00061000
SI~A; DI~L; DS~4 OCT; DI~R; DS~4 OCT; 00062000
SI~L; DI~A; DS~4 DEC; SI~R; DS~4 DEC; 00063000
DI~DI-4; DS~3 FILL END; 00064000
IF COM.[45:1] THEN GO LOD; 00065000
IF COM THEN GO DMP; 00066000
% LIST A MESSAGE FILE 00067000
VALIDATE; 00068000
WRITE(LINE[DBL],L1,A[1].[6:6],A[1],A[2].[6:6],A[2]); 00069000
FOR I~0 STEP 1 UNTIL TOP DO BEGIN 00070000
READ(DISK[I],10,A[*])[LEOF]; 00071000
DECODE(A,LEFT,RIGHT); 00072000
IF RIGHT = I THEN % VALID RECORD IN FILE 00073000
IF NOT ALREADY(NEED[I.D32],I.M32) THEN BEGIN 00074000
CT ~ CT + 1; 00075000
ERCT ~ 0; 00076000
WHILE LEFT ! 0 DO BEGIN 00077000
REQUEST(NEED[LEFT.D32],LEFT.M32); 00078000
ZOT(A,ERCT!0 AND (NOT COM).[46:1]); 00079000
WRITE(LINE,10,A[*]); 00080000
READ(DISK[RT~LEFT],10,A[*])[LEOF]; 00081000
DECODE(A,LEFT,RIGHT); 00082000
IF RT ! RIGHT THEN GO ER; 00083000
ERCT ~ ERCT + 1; 00084000
END; 00085000
ZOT(A,ERCT!0 AND (NOT COM).[46:1]); 00086000
WRITE(LINE[DBL],10,A[*]); 00087000
END; 00088000
LEOF: 00089000
END; 00090000
WRITE(LINE,L2,CT); 00091000
GO FINISH; 00092000
ER: 00093000
WRITE(LINE,L3); 00094000
GO FINISH; 00095000
LOD: 00096000
WHILE TRUE DO BEGIN 00097000
READ(CARD,10,A[*])[EOF]; 00098000
DECODE(A,LEFT,RIGHT); 00099000
IF LEFT=9999 OR RIGHT=9999 THEN 00100000
GO NEXT; 00101000
IF LEFT>4095 OR RIGHT>4095 THEN BEGIN 00102000
WRITE(LINE[DBL],F1,LEFT,RIGHT); 00103000
ERCT ~ ERCT + 1; 00104000
GO NEXT; 00105000
END; 00106000
IF LEFT ! 0 THEN 00107000
REQUEST(NEED[LEFT.D32],LEFT.M32); 00108000
IF ALREADY(HAVE[RIGHT.D32],RIGHT.M32) THEN BEGIN 00109000
WRITE(LINE[DBL],F2,RIGHT); 00110000
ERCT ~ ERCT + 1; 00111000
GO NEXT; 00112000
END; 00113000
REQUEST(HAVE[RIGHT.D32],RIGHT.M32); 00114000
WRITE(MESSAGE[RIGHT],10,A[*]); 00115000
WRITE(LINE[DBL],10,A[*]); 00116000
TOP ~ MAX(TOP,LEFT,RIGHT); 00117000
CT ~ CT + 1; 00118000
NEXT: 00119000
END; 00120000
EOF: 00121000
FOR I~0 STEP 1 UNTIL TOP DO 00122000
IF ALREADY(NEED[I.D32],I.M32) THEN 00123000
IF NOT ALREADY(HAVE[I.D32],I.M32) THEN BEGIN 00124000
WRITE(LINE[DBL],F3,I); 00125000
ERCT ~ ERCT + 1; 00126000
END; 00127000
IF ERCT = 0 OR COM.[46:1] THEN 00128000
LOCK(MESSAGE); 00129000
WRITE(LINE,F4,CT,ERCT); 00130000
GO FINISH; 00131000
00132000
DMP: 00133000
VALIDATE; 00134000
FOR I~0 STEP 1 UNTIL TOP DO BEGIN 00135000
READ(DISK[I],10,A[*])[RCVR]; 00136000
DECODE(A,LEFT,RIGHT); 00137000
IF RIGHT!I THEN GO RCVR; 00138000
WRITE(LINE[DBL],10,A[*]); 00139000
IF COM.[46:1] THEN 00140000
WRITE(NEWDISK,10,A[*]) 00141000
ELSE 00142000
WRITE(PUNCH,10,A[*]); 00143000
CT ~ CT + 1; 00144000
RCVR: 00145000
END; 00146000
WRITE(LINE,D1,CT); 00147000
IF CT>0 AND COM.[46:1] THEN LOCK(NEWDISK); 00148000
FINISH: 00149000
END. 00150000