1
0
mirror of https://github.com/retro-software/B5500-software.git synced 2026-01-26 19:41:41 +00:00

Okay, really commit the INCL2OMIT and BICTOEBCDIC utilities as stated in the previous commit, r312.

This commit is contained in:
Paul Kimpel
2013-03-11 04:42:39 +00:00
parent 587e8b1282
commit aefd148ef2
2 changed files with 444 additions and 0 deletions

184
tools/BICTOEBCDIC.alg_m Normal file
View File

@@ -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

260
tools/INCL2OMIT.alg_m Normal file
View File

@@ -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