diff --git a/tools/BICTOEBCDIC.alg_m b/tools/BICTOEBCDIC.alg_m new file mode 100644 index 0000000..c6717bf --- /dev/null +++ b/tools/BICTOEBCDIC.alg_m @@ -0,0 +1,184 @@ + $ SET LINEINFO 00000100 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%00001000 +%% SRCE/MISC/B5500/BIC2EBCDIC %%00001100 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%00001200 +% CONVERTS 6-BIT BCL-CODED BINARY DATA FILES TO 8-BIT EBCDIC-CODED 00001300 +% FILES, SPECIFICALLY B5500 CODE FILES GENERATED BY ESPOLXEM. 00001400 +% BCL INPUT FILE IS "DISK" AND OUTPUT EBCDIC FILE IS "TEXT". 00001500 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%00010000 +% 2013-03-10 P.KIMPEL 00010010 +% ORIGINAL VERSION, CLONED PARTLY FROM ESPOLXEM SOURCE. 00010020 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%00099900 + 00100000 +BEGIN 00100100 + 00110000 +INTEGER 00110100 + BICRECSIZE, 00110200 + BICRECWORDS, 00110300 + BICBLOCKFACTOR, 00110400 + TEXTRECSIZE, 00110500 + TEXTRECWORDS; 00110600 + 00130000 +ARRAY 00130100 + BIC[0:29], 00130200 + EBC[0:39]; 00130300 + 00160000 +FILE 00160100 + DISK(KIND=DISK, DEPENDENTSPECS, FILEUSE=IN), 00160200 + TEXT(KIND=DISK, MAXRECSIZE=240, BLOCKSIZE=3600, FRAMESIZE=8, 00160300 + AREAS=10, AREASIZE=1008, FLEXIBLE, FILEKIND=DATA); 00160400 + 00180000 +TRANSLATETABLE 00180100 + BICTOEBCDIC ( % 00180200 + EBCDIC TO "?", 00180300 + 48"00" TO "0", % DIGIT-ZERO 00180400 + 48"01" TO "1", 00180500 + 48"02" TO "2", 00180600 + 48"03" TO "3", 00180700 + 48"04" TO "4", 00180800 + 48"05" TO "5", 00180900 + 48"06" TO "6", 00181000 + 48"07" TO "7", 00181100 + 48"08" TO "8", 00181200 + 48"09" TO "9", 00181300 + 48"0A" TO "#", 00181400 + 48"0B" TO "@", 00181500 + 48"0C" TO "?", 00181600 + 48"0D" TO ":", 00181700 + 48"0E" TO ">", 00181800 + 48"0F" TO "}", % GEQ 00181900 + 48"10" TO "+", 00182000 + 48"11" TO "A", 00182100 + 48"12" TO "B", 00182200 + 48"13" TO "C", 00182300 + 48"14" TO "D", 00182400 + 48"15" TO "E", 00182500 + 48"16" TO "F", 00182600 + 48"17" TO "G", 00182700 + 48"18" TO "H", 00182800 + 48"19" TO "I", 00182900 + 48"1A" TO ".", 00183000 + 48"1B" TO "[", 00183100 + 48"1C" TO "&", 00183200 + 48"1D" TO "(", 00183300 + 48"1E" TO "<", 00183400 + 48"1F" TO "~", % LEFT-ARROW 00183500 + 48"20" TO "|", % TIMES 00183600 + 48"21" TO "J", 00183700 + 48"22" TO "K", 00183800 + 48"23" TO "L", 00183900 + 48"24" TO "M", 00184000 + 48"25" TO "N", 00184100 + 48"26" TO "O", % LETTER-O 00184200 + 48"27" TO "P", 00184300 + 48"28" TO "Q", 00184400 + 48"29" TO "R", 00184500 + 48"2A" TO "$", 00184600 + 48"2B" TO "*", 00184700 + 48"2C" TO "-", 00184800 + 48"2D" TO ")", 00184900 + 48"2E" TO ";", 00185000 + 48"2F" TO "{", % LEQ 00185100 + 48"30" TO " ", % BLANK 00185200 + 48"31" TO "/", 00185300 + 48"32" TO "S", 00185400 + 48"33" TO "T", 00185500 + 48"34" TO "U", 00185600 + 48"35" TO "V", 00185700 + 48"36" TO "W", 00185800 + 48"37" TO "X", 00185900 + 48"38" TO "Y", 00186000 + 48"39" TO "Z", 00186100 + 48"3A" TO ",", 00186200 + 48"3B" TO "%", 00186300 + 48"3C" TO "!", % NEQ 00186400 + 48"3D" TO "=", 00186500 + 48"3E" TO "]", 00186600 + 48"3F" TO """); % QUOTE 00186700 + 00300000 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%00300100 +PROCEDURE UNPACKBICTOEBCDIC(S, SX, D, DX, N); 00300200 + VALUE SX, DX, N; 00300300 + ARRAY S, D[0]; 00300400 + REAL SX, DX, N; 00300500 + BEGIN COMMENT 00300600 + UNPACKS 6-BIT BIC CHARACTERS TO 8-BIT EBCDIC CHARACTERS FROM 00300700 + ARRAY S TO ARRAY D. SX IS THE 6-BIT CHARACTER OFFSET INTO S AND 00300800 + DX IS THE 8-BIT CHARACTER OFFSET INTO D. N IS THE NUMBER OF 00300900 + CHARACTERS TO UNPACK. UNPACKING PROCEEDS IN A REVERSE DIRECTION 00301000 + SO THAT SOURCE AND DESTINATION CAN REFER TO THE SAME LOCATION. 00301100 + ; 00301200 + REAL 00301300 + NC, % NR CHARS LEFT TO UNPACK 00301400 + SA, % SOURCE ACCUMULATOR WORD, 00301500 + SB, % SOURCE BIT NBR 00301600 + SW, % SOURCE WORD INDEX 00301700 + DA, % DESTINATION ACCUMULATOR WORD 00301800 + DB, % DESTINATION BIT NBR 00301900 + DW; % DESTINATION WORD INDEX 00302000 + 00302100 + SW:= (SX+N-1) DIV 8; 00302200 + SB:= 47-((SX+N-1) MOD 8)*6; 00302300 + DW:= (DX+N-1) DIV 6; 00302400 + DB:= 47-((DX+N-1) MOD 6)*8; 00302500 + SA:= S[SW]; 00302600 + DA:= D[DW]; 00302700 + NC:= N; 00302800 + WHILE NC > 0 DO 00302900 + BEGIN 00303000 + DA:= * & (SA.[SB:6])[DB:8]; 00303100 + NC:= *-1; 00303200 + IF NC > 0 THEN 00303300 + BEGIN 00303400 + IF SB < 47 THEN 00303500 + SB:= *+6 00303600 + ELSE 00303700 + BEGIN 00303800 + SB:= 5; 00303900 + SA:= S[SW:= *-1]; 00304000 + END; 00304100 + 00304200 + IF DB < 47 THEN 00304300 + DB:= *+8 00304400 + ELSE 00304500 + BEGIN 00304600 + D[DW]:= DA; 00304700 + DB:= 7; 00304800 + DA:= D[DW:= *-1]; 00304900 + END; 00305000 + END; 00305100 + END WHILE; 00305200 + 00305300 + D[DW]:= DA; 00305400 + REPLACE POINTER(D[DX DIV 6],8)+(DX MOD 6) BY 00305500 + POINTER(D[DX DIV 6],8)+(DX MOD 6) FOR N WITH BICTOEBCDIC; 00305600 + END UNPACKBICTOEBCDIC; 00305700 + 00900000 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%00900100 +%% OUTER BLOCK 00900200 + 00900300 +OPEN(DISK); 00900400 +BICRECSIZE:= DISK.MAXRECSIZE; 00900500 +BICBLOCKFACTOR:= DISK.BLOCKSIZE DIV BICRECSIZE; 00900600 +BICRECWORDS:= (DISK.FRAMESIZE*BICRECSIZE + 47) DIV 48; 00900700 +IF SIZE(BIC) < BICRECWORDS THEN 00900800 + RESIZE(BIC, BICRECWORDS); 00900900 + 00901000 +TEXTRECSIZE:= BICRECWORDS*8; 00901100 +TEXTRECWORDS:= (TEXTRECSIZE + 5) DIV 6; 00901200 +TEXT.MAXRECSIZE:= TEXTRECSIZE; 00901300 +TEXT.BLOCKSIZE:= TEXTRECSIZE*BICBLOCKFACTOR; 00901400 +TEXT.AREASIZE:= (BICBLOCKFACTOR+999) DIV BICBLOCKFACTOR; 00901500 +IF SIZE(EBC) < TEXTRECWORDS THEN 00901600 + RESIZE(EBC, TEXTRECWORDS); 00901700 + 00901800 +WHILE NOT READ(DISK, BICRECSIZE, BIC) DO 00901900 + BEGIN 00902000 + UNPACKBICTOEBCDIC(BIC, 0, EBC, 0, TEXTRECSIZE); 00902100 + WRITE(TEXT, TEXTRECSIZE, EBC); 00902200 + END READ SOURCE; 00908800 + 00908900 +CLOSE(TEXT, CRUNCH); 00909000 +CLOSE(DISK); 00909100 + 00999800 +END. 00999900 diff --git a/tools/INCL2OMIT.alg_m b/tools/INCL2OMIT.alg_m new file mode 100644 index 0000000..e53351f --- /dev/null +++ b/tools/INCL2OMIT.alg_m @@ -0,0 +1,260 @@ + $ SET LINEINFO 00000100 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%00001000 +%% SRCE/MISC/B5500/INCL2OMIT %%00001100 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%00001200 +% CONVERTS $INCLUDE AND $OMIT PRAGMAS IN THE B5500 MARK XIII MCP 00001300 +% SOURCE TO THE NEWER $OMIT SCHEME USED IN LATER RELEASES. READS THE 00001400 +% MCP SOURCE FROM INTNAME "SOURCE" AND WRITES CHANGED LINES TO 00001500 +% INTNAME "PATCH". 00001600 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%00010000 +% 2013-03-08 P.KIMPEL 00010010 +% ORIGINAL VERSION. 00010020 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%00099900 + 00100000 +BEGIN 00100100 +DEFINE 00100200 + ALL1 = REAL(NOT FALSE) #; 00100300 + 00100400 +INTEGER 00100500 + LASTSEQNR, 00100600 + LEFT, 00100700 + OMITDEPTH, 00100750 + OMITTYPE, 00100800 + POPCOUNT, 00100900 + POPSEQNR, 00101000 + STOPSEQNR, 00101100 + THISSEQNR, 00101200 + TOKLEFT, 00101300 + TOKLENGTH, 00101400 + TOKOFFSET, 00101500 + X; 00101600 + 00101700 +POINTER 00101800 + P; 00101900 + 00102000 +ARRAY 00102100 + POPLIST[0:15]; 00102200 + 00102300 +EBCDIC ARRAY 00102400 + PREC[0:89], 00102500 + REC[0:89], 00102600 + TOKEN[0:89]; 00102700 + 00102800 +FILE 00102900 + SOURCE(KIND=DISK, DEPENDENTSPECS, FILEUSE=IN, 00103000 + TITLE="SRCE/MISC/B5500/MARKXIII/MCP."), 00103100 + PATCH(KIND=DISK, MAXRECSIZE=15, BLOCKSIZE=420, FRAMESIZE=48, 00103200 + AREAS=10, AREASIZE=1008, FLEXIBLE, FILEKIND=ESPOLSYMBOL, 00103300 + TITLE="PATCH/MISC/B5500/MARKXIII/MCP/INCL2OMIT."); 00103350 + 00103400 +TRUTHSET 00103500 + NUMBERS ("0123456789"), 00103600 + ALPHANUM (NUMBERS OR "ABCDEFGHIJKLMNOPQRSTUVWXYZ"); 00103700 + 00300000 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%00300100 +INTEGER PROCEDURE SCANNER; 00300200 + BEGIN 00300300 + INTEGER 00300400 + LEFT; 00300500 + POINTER 00300600 + P; 00300700 + 00300800 + SCAN P:REC[TOKOFFSET] FOR LEFT:TOKLEFT WHILE=" "; 00300900 + IF LEFT = 0 THEN 00301000 + BEGIN 00301100 + TOKLENGTH:= TOKLEFT:= 0; 00301200 + REPLACE TOKEN BY 48"00"; 00301300 + END 00301400 + ELSE 00301500 + BEGIN 00301600 + TOKOFFSET:= *+TOKLEFT-LEFT; 00301700 + IF P IN NUMBERS THEN 00301800 + REPLACE TOKEN[1] BY P FOR TOKLEFT:LEFT WHILE IN NUMBERS 00301900 + ELSE IF P IN ALPHANUM THEN 00302000 + REPLACE TOKEN[1] BY P FOR TOKLEFT:LEFT WHILE IN ALPHANUM 00302100 + ELSE 00302200 + BEGIN 00302300 + REPLACE TOKEN[1] BY P FOR 1; 00302400 + TOKLEFT:= LEFT-1; 00302500 + END; 00302600 + 00302700 + TOKLENGTH:= LEFT-TOKLEFT; 00302800 + TOKOFFSET:= *+TOKLENGTH; 00302900 + REPLACE TOKEN BY TOKLENGTH.[7:48] FOR 1; 00303000 + END; 00303100 + 00303200 + SCANNER:= TOKLENGTH; 00303300 + END SCANNER; 00303400 + 00303500 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%00303600 +INTEGER PROCEDURE INSERTPOP(STOPSEQNR); 00303700 + VALUE STOPSEQNR; 00303800 + INTEGER STOPSEQNR; 00303900 + BEGIN 00304000 + INTEGER 00304100 + X; 00304200 + 00304300 + X:= POPLIST[0]; 00304400 + IF X > 0 THEN 00304500 + X:= MASKSEARCH(0, ALL1, POPLIST[X]); 00304600 + 00304700 + IF X < 1 THEN 00304800 + BEGIN 00304850 + X:= POPLIST[0]:= *+1; 00304900 + IF SIZE(POPLIST) <= X THEN 00305000 + RESIZE(POPLIST, X+16, RETAIN); 00305100 + END; 00305200 + 00305300 + POPLIST[X]:= STOPSEQNR; 00305400 + OMITDEPTH:= *+1; 00305450 + INSERTPOP:= X; 00305500 + END INSERTPOP; 00305600 + 00305700 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%00305800 +INTEGER PROCEDURE REMOVEPOP(STOPSEQNR); 00305900 + VALUE STOPSEQNR; 00306000 + INTEGER STOPSEQNR; 00306100 + BEGIN 00306200 + INTEGER 00306300 + X; 00306400 + 00306500 + X:= POPLIST[0]; 00306600 + WHILE X > 0 DO 00306700 + BEGIN 00306800 + IF POPLIST[X] > STOPSEQNR THEN 00306900 + X:= *-1 00307000 + ELSE 00307100 + BEGIN 00307200 + REMOVEPOP:= POPLIST[X]; 00307300 + POPLIST[X]:= 0; 00307400 + IF POPLIST[0] = X THEN 00307500 + POPLIST[0]:= *-1; 00307600 + 00307700 + X:= 0; % KILL THE LOOP 00307800 + IF OMITDEPTH > 0 THEN 00307820 + OMITDEPTH:= *-1; 00307840 + END; 00307900 + END; 00308000 + END REMOVEPOP; 00308100 + 00900000 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%00900100 +%% OUTER BLOCK 00900200 + 00900300 +REPLACE REC BY " " FOR 72, "0" FOR 8, " " FOR 10; 00900500 +REPLACE REC BY "$# MARKXIII/MCP INCL2OMIT"; 00900600 +WRITE(PATCH, 15, REC); 00900700 + 00900800 +WHILE NOT READ(SOURCE, 15, REC) DO 00900900 + BEGIN 00901000 + TOKOFFSET:= 0; 00901100 + TOKLEFT:= 72; 00901200 + LASTSEQNR:= THISSEQNR; 00901300 + THISSEQNR:= INTEGER(REC[72], 8); 00901400 + IF THISSEQNR <= LASTSEQNR THEN 00901500 + DISPLAY("SEQUENCE ERROR " !! STRING(LASTSEQNR,8) !! " : " !! 00901600 + STRING(THISSEQNR,8)); 00901700 + 00901800 + POPCOUNT:= 0; 00901900 + POPSEQNR:= REMOVEPOP(THISSEQNR); 00901950 + WHILE POPSEQNR > 0 DO 00902000 + BEGIN 00902100 + IF POPSEQNR >= THISSEQNR THEN 00902200 + BEGIN 00902250 + POPCOUNT:= *+1; 00902300 + POPSEQNR:= REMOVEPOP(THISSEQNR); 00902320 + END 00902340 + ELSE 00902400 + BEGIN 00902500 + REPLACE PREC BY " " FOR 72, POPSEQNR FOR 8 DIGITS, " " FOR 10; 00902600 + REPLACE P:PREC BY " $POP OMIT"; 00902700 + LASTSEQNR:= POPSEQNR; 00902710 + DO BEGIN 00902720 + POPSEQNR:= REMOVEPOP(THISSEQNR); 00902730 + IF POPSEQNR = LASTSEQNR THEN 00902740 + REPLACE P:P BY " OMIT"; 00902750 + END 00902760 + UNTIL POPSEQNR ^= LASTSEQNR; 00902770 + WRITE(PATCH, 15, PREC); 00902800 + END; 00903000 + END WHILE; 00903100 + 00903200 + SCANNER; 00903300 + IF TOKEN ^= 48"01""$" THEN 00903400 + IF POPCOUNT > 0 THEN 00903405 + BEGIN 00903410 + REPLACE PREC BY " " FOR 72, THISSEQNR-1 FOR 8 DIGITS, " " FOR 10; 00903415 + REPLACE P:PREC BY " $POP "; 00903420 + WHILE POPCOUNT > 0 DO 00903425 + BEGIN 00903430 + REPLACE P:P BY "OMIT "; 00903435 + POPCOUNT:= *-1; 00903440 + END WHILE; 00903445 + WRITE(PATCH, 15, PREC); 00903450 + END; 00903455 + ELSE 00903460 + BEGIN 00903500 + SCANNER; 00903600 + OMITTYPE:= (IF TOKEN=48"07""INCLUDE" THEN 1 ELSE 00903700 + IF TOKEN=48"04""OMIT" THEN 2 ELSE 0); 00903800 + IF OMITTYPE > 0 THEN 00903900 + BEGIN 00904000 + SCANNER; 00904100 + IF TOKEN[1] IN NUMBERS FOR TOKLENGTH THEN 00904200 + BEGIN 00904300 + STOPSEQNR:= INTEGER(TOKEN[1], TOKLENGTH); 00904400 + SCANNER; 00904500 + IF TOKEN = 48"01""," THEN 00904600 + SCANNER; 00904700 + 00904800 + IF TOKEN = 48"02""IF" THEN 00904900 + BEGIN 00905000 + REPLACE PREC BY " " FOR 90; 00905100 + REPLACE P:PREC BY " $"; 00905200 + IF POPCOUNT > 0 THEN 00905300 + BEGIN 00905400 + REPLACE P:P BY "POP "; 00905500 + WHILE POPCOUNT > 0 DO 00905600 + BEGIN 00905700 + REPLACE P:P BY "OMIT "; 00905800 + POPCOUNT:= *-1; 00905900 + END WHILE; 00906000 + END; 00906100 + 00906200 + INSERTPOP(STOPSEQNR); 00906250 + REPLACE P:P BY "SET OMIT="; 00906300 + IF OMITTYPE = 1 THEN 00906400 + REPLACE P:P BY "NOT"; 00906500 + 00906600 + REPLACE P:P BY "("; 00906700 + SCANNER; 00906800 + DO BEGIN 00906900 + REPLACE P:P BY TOKEN[1] FOR TOKLENGTH, " "; 00907000 + SCANNER; 00907100 + END 00907200 + UNTIL TOKLENGTH = 0 OR TOKEN=48"01"";"; 00907300 + IF TOKEN = 48"01"";" THEN 00907320 + SCANNER; 00907340 + 00907360 + REPLACE P:P-1 BY ") "; 00907400 + IF OMITDEPTH > 1 THEN 00907420 + REPLACE P:P BY "OR OMIT "; 00907440 + 00907450 + WHILE TOKLENGTH > 0 DO 00907500 + BEGIN 00907600 + REPLACE P:P BY TOKEN[1] FOR TOKLENGTH, " "; 00907700 + SCANNER; 00907800 + END WHILE; 00907900 + 00908000 + REPLACE PREC[72] BY THISSEQNR FOR 8 DIGITS; 00908100 + WRITE(PATCH, 15, PREC); 00908200 + END; 00908300 + 00908400 + END; 00908500 + END; 00908600 + END; 00908700 + END READ SOURCE; 00908800 + 00908900 +CLOSE(PATCH, CRUNCH); 00909000 +CLOSE(SOURCE); 00909100 + 00999800 +END. 00999900