Trailing-Edge
-
PDP-10 Archives
-
decuslib20-03
-
decus/20-0078/util/ibmsim.sim
There is 1 other file named ibmsim.sim in the archive. Click here to see a list.
OPTIONS(/W/-Q/-A/-I/-D);
COMMENT --- IBMSIM program Version 2.1 ---
Date: 74-12-09, 75-09-04, 76-02-27, 78-06-16
----------------------------------------------------------------------
Author: Mats Ohlin
Swedish Research Institute of National Defence
FOA 1
Fack
S-104 50 STOCKHOLM 80
SWEDEN
The information in this document is subject to change without
notice. The institute assumes no responsibility for any errors that
may be present in this document. The described software is furnished
to the user for use on a SIMULA system. (SIMULA is a registered
trademark of the Norwegian Computing Center, Oslo, Norway).
Copyright 1975 by the Swedish Research Institute for National Defence.
Copying is allowed.
----------------------------------------------------------------------
The IBMSIM program converts SIMULA programs from IBM 360/370
to DEC System-10 representation.
The following conversion problems must be considered by the
programmer:-
1. The use of standard procedures RANK and CHAR gives different
result on DEC 10 compared with most other systems.
2. The file names must be no longer than six characters (the 7th and 8th
characters will be ignored if present).
3. The maximal number of subscripts is 10 in DEC 10 but 127 in IBM SIMULA.
4. Virtual quantities may only be LABEL, SWITCH or (type) PROCEDURE
in DEC 10 SIMULA. This problem could often be solved with the help of
type procedures.
5. Subscript checking in DEC 10, unlike IBM, is made for every index element.
6. The EXTERNAL declarations must be changed.
7. Some of the mathematical standard procedures do not have double precision
in DEC 10 SIMULA (the compiler will warn you if necessary).
See also SIMULA Language Handbook, Part 2, Chapter 4.
The IBMSIM program makes the following conversions:-
1. Changing the source input control cards (records) -
%(NO)SOURCE,%PAGE,%TITLE to their DEC 10 SIMULA OPTIONS
equivalents.
2. Eliminating control records %(NO)LIST and %INDENT=n.
In order to indent your program, use the SIMED program afterwards.
3. Warns for numerical constants out of range (ABS(10log(abs(x))) > 37).
4. Eliminates card seqeunce numbers, if present.
5. Converts LONG REAL constants to DEC 10 SIMULA format.
The user is asked for the following information:-
1. The file name for the program file, which must have a record length
not exceeding 80.
2. The name of the output file (if no name is given a spooled LPT
file is generated).
3. The input representation of the NOT symbol, output as \.
[End of IBMSIM.HLP]
;
BEGIN EXTERNAL TEXT PROCEDURE rest,upcase,conc2,tsub;
EXTERNAL LONG REAL PROCEDURE scanreal;
EXTERNAL INTEGER PROCEDURE scanint,checkint;
EXTERNAL CLASS safmin;
safmin BEGIN
CHARACTER ctab,cnot; text t;
REF (Infile) prog; REF (Outfile) outf;
TEXT progname,outname; INTEGER begincount,endcount;
PROCEDURE warning(message,t); NAME message; TEXT message,t;
BEGIN
Outtext("Warning *** "); Outtext(message);
IF t.Length > Length THEN
BEGIN WHILE t.More DO Outchar(t.Getchar) END ELSE
Outtext(t);
Outtext(" ***"); Outimage
END OF WARNING;
BOOLEAN PROCEDURE help1;
BEGIN
Outtext("Enter the file description for the file you want converted.");
Outimage
END OF HELP1;
BOOLEAN PROCEDURE help2;
BEGIN
Outtext("Enter the file description for the resulting file.");
Outimage
END OF HELP2;
BOOLEAN PROCEDURE help3;
BEGIN outline("Enter the character representation for the NOT symbol as");
outline("achivied by your card reader/tape conversion program.");
outline("Very often this will be the character '^'.");
END OF HELP3;
Outtext("IBMSIM - SIMULA Conversion Program. Version 1.1");
Outimage;
request("Enter program file name",nodefault,textinput(progname,
TRUE),"? Illegal file spec.",help1);
prog:- NEW Infile(conc2("INPUT ",progname));
request("Enter output file name","LPT:",textinput(outname,outname =/= NOTEXT),
"? Illegal file spec.",help2);
outf:- NEW Outfile(conc2("IBMSIM ",outname));
request("Enter input representation of NOT symbol","^",textinput(t,NOT(
t.Length NE 1 OR Digit(t.Sub(1,1).Getchar) OR Letter(t.Sub(1,1).Getchar))),
"? Please answer with just one character.",help3);
cnot:= t.Getchar;
ctab:= Char(9);
INSPECT outf DO
BEGIN Open(Blanks(135));
INSPECT prog DO
BEGIN
PROCEDURE getstring;
BEGIN
t:- t.Main; t:= NOTEXT; t.Setpos(1);
t.Putchar(window); go to l;
WHILE (IF Letter(c) THEN TRUE ELSE IF Digit(c) THEN TRUE ELSE
IF c = '_' THEN TRUE ELSE IF c = '$' THEN TRUE ELSE
IF c = '#' THEN TRUE ELSE c = '@') DO
BEGIN t.Putchar(c); l: IF \ More THEN go to ready;
c:= Inchar END;
Setpos(Pos-1);
ready: t:- t.Sub(1,t.Pos-1)
END OF GETSTRING;
PROCEDURE nextimage;
BEGIN
IF textflag THEN
BEGIN Image:- mainimage;
FOR p:= 72 STEP -1 UNTIL 2 DO
BEGIN c:= Image.Sub(p,1).Getchar;
IF c NE ' ' AND c NE '"' THEN
BEGIN Outtext(Image.Sub(1,p-1)); Outimage;
Image:- Image.Sub(p,Length-p+1);
GO TO (IF Image.Strip == NOTEXT THEN skip ELSE print);
END;
END;
END textflag;
print:
Outtext(Image); Outimage;
skip:
Image:- mainimage;
Inimage;
Image:- Image.Sub(1,72).Strip;
WHILE Image == NOTEXT DO
BEGIN Outimage;
Image:- mainimage; Inimage;
Image:- Image.Sub(1,72).Strip
END
END OF NEXTIMAGE;
CHARACTER window,c; TEXT mainimage;
BOOLEAN endcommentflag,commentflag,textflag;
INTEGER i,p;
t:- Blanks(140);
Open(Blanks(80)); mainimage:- Image; nextimage;
WHILE \ Endfile DO
BEGIN next:
IF NOT More THEN nextimage;
IF endcommentflag THEN go to scanendcomment;
IF textflag THEN go to scantext;
IF commentflag THEN go to scancomment;
window:= Inchar;
scan:
IF window = ' ' OR window = ctab OR window = ';' THEN !SKIP IT;
ELSE
IF window = cnot THEN Image.Sub(Pos-1,1).Putchar('\') ELSE
IF (IF Letter(window) THEN TRUE ELSE IF window = '_' THEN TRUE
ELSE
IF window = '$' THEN TRUE ELSE IF window = '#' THEN TRUE ELSE
window = '@') THEN
BEGIN p:= Pos -1; getstring;
IF t = "COMMENT" THEN go to scancomment;
IF t = "OPTIONS" THEN go to scancomment;
IF t = "END" THEN
BEGIN
moreends:
endcount:= endcount + 1;
IF endcount > begincount THEN
warning("More ENDs than BEGINs at line:",Image);
scanendcomment:
WHILE More DO
BEGIN window:= Inchar;
IF window = 'E' THEN
BEGIN p:= Pos - 1; getstring;
IF t = "END" THEN go to moreends;
IF t = "ELSE" THEN
BEGIN
endcommentflag:= FALSE; go to next
END;
END ELSE
IF window = 'O' THEN
BEGIN p:= Pos - 1; getstring;
IF t = "OTHERWISE" THEN
BEGIN
endcommentflag:= FALSE; go to next
END;
END ELSE
IF window = 'W' THEN
BEGIN p:= Pos - 1; getstring;
IF t = "WHEN" THEN
BEGIN endcommentflag:= FALSE;
go to next END
END ELSE
IF window = ';' THEN
BEGIN endcommentflag:= FALSE; go to next END
END MORE LOOP;
endcommentflag:= TRUE;
END *ND=T ELSE
IF (IF window = 'B' THEN t = "BEGIN" ELSE FALSE) THEN
begincount:= begincount + 1;
END ONE OR MORE LETTERS ELSE
IF window = '"' THEN
BEGIN scantext:
window:= ' ';
WHILE (IF More THEN window \= '"' ELSE FALSE) DO
window:= Inchar;
IF window \= '"' THEN
BEGIN
warning("<CR><LF> in text constant:",Image);
textflag:= TRUE
END
ELSE textflag:= FALSE;
END ELSE
IF window = '%' AND Pos = 2 THEN
BEGIN window:= Inchar;
IF tsub(Image,2,4) = "PAGE" THEN Outtext("OPTIONS(/P);") ELSE
IF tsub(Image,2,5) = "TITLE" THEN
BEGIN
Outtext("OPTIONS(/P:""");
Outtext(Image.Sub(10,Length-9).Strip);
Outtext(""");"); Outimage;
END ELSE
IF tsub(Image,2,6) = "SOURCE" THEN Outtext("OPTIONS(/L);") ELSE
IF tsub(Image,2,7)= "NORESWD" THEN !skip; ELSE
IF tsub(Image,2,8) = "NOSOURCE" THEN Outtext("OPTIONS(/-L);");
Image:= NOTEXT; Setpos(0);
END ELSE
IF Digit(window) OR (IF window = '.' AND More THEN
Digit(Image.Sub(Pos,1).Getchar) ELSE FALSE) THEN
BEGIN
p:= IF Digit(window) THEN -2 ELSE -1;
WHILE More AND (Digit(window) OR window = ctab OR
window = '.' OR window = ' ') DO
BEGIN IF window = '.' THEN p:= Abs(p) ELSE
IF Digit(window) THEN p:= p + Sign(p);
window:= Inchar
END;
i:= Pos;
IF window = '&' AND More THEN
BEGIN
IF p > 9 THEN BEGIN
Image:- conc2(conc2(Image.Sub(1,Pos-1),"&"),
Image.Sub(Pos,Length-Pos+1)); Setpos(i+1);
END;
amp:
i:= Pos;
IF checkint(Image) = 1 THEN
BEGIN Setpos(i); i:= Inint;
IF Abs(i) > 37 THEN warning("Numerical constant out of range:",Image);
END ELSE Setpos(i);
END ELSE
IF p > 9 THEN
BEGIN Image:- conc2(conc2(Image.Sub(1,Pos-2),"&&0 "),
Image.Sub(Pos-1,Length-Pos+2)); Setpos(i+2)
END;
END ELSE
IF window = '&' THEN GO TO amp ELSE
IF window = ''' THEN
BEGIN
IF \ More THEN
w0: warning("Character constant at line:",Image) ELSE
BEGIN Setpos(Pos+1);
IF \ More THEN go to w0;
window:= Inchar;
IF window \= ''' THEN go to w0
END
END ELSE
IF window = '!' THEN
BEGIN
scancomment: textflag:= FALSE;
WHILE (IF More THEN window \= ';' OR
(IF t = "OPTIONS" THEN textflag ELSE FALSE) ELSE FALSE) DO
BEGIN window:= Inchar;
textflag:= NOT (window = '"' EQV textflag)
END;
textflag:= FALSE; t:= NOTEXT;
commentflag:= window \= ';';
END;
END BIG LOOP;
Close
END INSPECTING INPUT;
Close
END INSPECTING OUTPUT;
Outtext("Processing ready."); Outimage;
Outtext("Number of BEGIN (END) found:"); Outint(begincount,5);
IF endcount \= begincount THEN
BEGIN Outtext(" ("); Outint(endcount,5); Outchar(')');
Outtext(" ******************")
END;
Outimage
END prefixed block
END OF PROGRAM