IMD 1.17: 24/11/2010 20:07:16   ߋtv ?BOOT-F-No boot on volume           RT11A DECRT11A :` -fS -՘%SH -z;MvU -N;MvU -z,v-N,v-:`S -:S -:4}Ԁ h-                   LSE); FileNames.ReadFileName(InFN, "DK IN MOD"); TTIO.Read(ch); IF ch = ESC THEN InFromTTY := TRUE; ok0 END WriteInt; PROCEDURE WriteCard(x, n: CARDINAL); VAR i: CARDINAL; a: ARRAY [0..6] OF CARDINAL; BEGIN  := 0 ELSE Files.Lookup(InFno, InFN, ok); IF ok >= 0 THEN Streams.Connect(in, InFno, FALSE); InFromTTi := 0; REPEAT a[i] := x MOD 10; x := x DIV 10; INC(i) UNTIL x = 0; REPEAT DEC(n); Write(" ") UNTIL n <= i; Y := FALSE ELSE ShowString(" not found", FALSE) END END ; TTIO.Write(CR); TTIO.Write(LF); UREPEAT DEC(i); Write(CHAR(a[i]+60B)) UNTIL i = 0 END WriteCard; PROCEDURE WriteOct(w: SYSTEM.WORD; n: CARDINAL); VANTIL ok >= 0; REPEAT ShowString("output = ", FALSE); FileNames.ReadFileName(OutFN, "DK OUT OUT"); TTIO.Read(ch); R i,x: CARDINAL; a: ARRAY [0..6] OF CARDINAL; BEGIN i := 0; x := CARDINAL(w); REPEAT a[i] := x MOD 8; x := x DIV  IF ch = ESC THEN OutOnTTY := TRUE; ok := 0 ELSE Files.Lookup(OutFno, OutFN, ok); IF ok >= 0 THEN 8; INC(i) UNTIL i = 5; IF x = 0 THEN a[i] := 0 ELSE a[i] := 1 END ; INC(i); REPEAT DEC(n); Write(" ") UNTIL  Files.Close(OutFno); ShowString(" overwrite? ", FALSE); TTIO.Read(ch); TTIO.Write(ch); IF CAP(cn <= i; REPEAT DEC(i); Write(CHAR(a[i]+60B)) UNTIL i = 0 END WriteOct; PROCEDURE WriteHex(w: SYSTEM.WORD; n: CARDINh) = "Y" THEN ok := 0 ELSE ok := -1 END ELSE ok := 0 END ; IF ok >= 0 THEN Files.Create(OutFno, OutFN, ok); IF ok >= 0 THEN Streams.Connect(out, OutFno, FALSE); OutOnTTY := FALSE ELSE ShowString(" failed", FALSE) END END END ; TTIO.Write(CR); TTIO.Write(LF) UNTIL ok >= 0  END OpenIO; PROCEDURE Write(ch: CHAR); BEGIN IF OutOnTTY THEN TTIO.Write(ch) ELSE Streams.WriteChar(out, IMPLEMENTATION MODULE InOut; (*$T- N.Wirth 27.2.80*) IMPORT SYSTEM, TTIO, Files, FileNames, Streams; CONST CR = 15C; Lch) END END Write; PROCEDURE WriteInt(x: INTEGER; n: CARDINAL); VAR i, x0: CARDINAL; a: ARRAY [0..6] OFF = 12C; ESC = 33C; InFno = 1; OutFno = 2; VAR InFromTTY, OutOnTTY: BOOLEAN; in, out: Streams.STREAM; In CHAR; BEGIN i := 0; x0 := ABS(x); REPEAT a[i] := CHAR(x0 MOD 10 + 60B); x0 := x0 DIV 10; INC(i) UNTIL x0 = 0; FN, OutFN: Files.FileName; PROCEDURE OpenIO; VAR ok: INTEGER; ch: CHAR; BEGIN REPEAT ShowString("input = ", FA IF x < 0 THEN a[i] := "-"; INC(i) END ; REPEAT DEC(n); Write(" ") UNTIL n <= i; REPEAT DEC(i); Write(a[i]) UNTIL i =  HILE (i < StrLeng) & (s[i] # 0C) DO Write(s[i]); INC(i) END END WriteString; PROCEDURE ShowString(s: String; cr: BOOLEAN); VAR i: CARDINAL; BEGIN i := 0; WHILE (i < StrLeng) & (s[i] # 0C) DO TTIO.Write(s[i]); INC(i) IMPLEMENTATION MODULE PROCESSSCHEDULER [6]; (*$T- NW, CJ, SEK, HHN 30-Aug-79 *) (* additional procedure INITSIGNAL CJ dec END ; IF cr THEN TTIO.Write(CR); TTIO.Write(LF) END END ShowString; PROCEDURE Read(VAR ch: CHAR)-79 *) (* elimination of import of storage handler CJ dec-79 *) FROM SYSTEM IMPORT WORD, PROCESS, ADDRESS, NEWPROCE; BEGIN IF InFromTTY THEN TTIO.Read(ch) ELSE Streams.ReadChar(in, ch) END END Read; PROCEDURE ReadInSS, TRANSFER, IOTRANSFER, LISTEN, SYSRESET; TYPE SIGNAL = POINTER TO ProcessDescriptor; ProcessDescriptor = RECt(VAR x: INTEGER; VAR nextChar: CHAR; VAR IsNum: BOOLEAN); VAR ch: CHAR; neg: BOOLEAN; x0: INTEGER; ORD pp: PROCESS; postponment: CARDINAL; (* postponment=0 means that the process is ready postponme BEGIN LOOP Read(ch); IF ch > " " THEN IF ch = "-" THEN neg := TRUE; Read(ch) ELSIF ch = "+" THEnt>0 means that the process is waiting for a signal. postponment>1 is used for PAUSE only *) next: SIGNAL;N neg := FALSE; Read(ch) ELSE neg := FALSE END ; IF (ch >= "0") & (ch <= "9") THEN x0 := (* ties the descriptors in the ring *) queue: SIGNAL; (* ties the descriptors waiting for the  INTEGER(ch) - 60B; Read(ch); WHILE (ch >= "0") & (ch <= "9") DO x0 := 10*x0 + (INTEGER(ch) - 60B); Read same signal *) interrupted: SIGNAL; (* pointer to descriptor of interrupted proces(ch) END ; IF neg THEN x := -x0 ELSE x := x0 END ; IsNum := TRUE ELSE IsNum := FALSE s *) END ; VAR cp: SIGNAL; (* current process *) tick: SIGNAL; (* head of the queue of the PAUSing processes*) AL); PROCEDURE HexDig(d: CARDINAL); BEGIN d := d MOD 16; IF d < 10 THEN d := d+60B ELSE d := d+67B END ;  END ; nextChar := ch; EXIT ELSIF ch = 0C THEN IsNum := FALSE; nextChar := 0C; EXIT END  Write(CHAR(d)) END HexDig; BEGIN REPEAT DEC(n); Write(" ") UNTIL n <= 4; HexDig(CARDINAL(w) DIV 1000H); H END END ReadInt; PROCEDURE CloseIO; BEGIN IF NOT InFromTTY THEN Streams.Disconnect(in, TRUE); InFromTexDig(CARDINAL(w) DIV 100H); HexDig(CARDINAL(w) DIV 10H); HexDig(CARDINAL(w)) END WriteHex; PROCEDURE Writeln; TY := TRUE END ; IF NOT OutOnTTY THEN Streams.EndWrite(out); Streams.Disconnect(out, TRUE); OutOnTTY :=  BEGIN Write(CR); Write(LF) END Writeln; PROCEDURE WriteString(s: String); VAR i: CARDINAL; BEGIN i := 0; WTRUE END END CloseIO; BEGIN InFromTTY := TRUE; OutOnTTY := TRUE; END InOut.  NAL; (* line clock status register *) StorageForCP: ProcessDescriptor; PROCEDURE STARTPROCESS(P: PROC; A: ADDRESxt END ; this^.queue := cp END ; cp^.postponment := 1; cp^.queue := NIL; nextready; END WAIT; S; n: CARDINAL); (* start P with workspace A of length n *) VAR t: SIGNAL; BEGIN t := cp; (*NEW(cp)*) cp := A;  PROCEDURE DOIO(va: CARDINAL); VAR this, strt: SIGNAL; p: PROCESS; BEGIN cp^.postponment := 1; this := cp;  WITH cp^ DO next := t^.next; postponment := 0; interrupted := NIL; t^.next := cp; NEWPROCESS(P,A+TWITH this^ DO IF interrupted # NIL THEN cp := interrupted; interrupted := NIL; ELSE LOOP strt :SIZE(SIGNAL),n-TSIZE(SIGNAL),pp); TRANSFER(t^.pp,pp); END; END STARTPROCESS; PROCEDURE SEND(VAR s: SIGNAL); = cp; REPEAT cp := cp^.next UNTIL (cp^.postponment=0) OR (cp=strt); IF cp^.postponment = 0 THE (* resume first process waiting for s *) VAR t: SIGNAL; BEGIN IF s # NIL THEN t := cp; cp := s; cp^.posN EXIT ELSE LISTEN END; END; END; p := cp^.pp; IOTRANSFER(pp, p, va); cp^.pp := p; interrupted := tponment := 0; s := cp^.queue; TRANSFER(t^.pp, cp^.pp) END END SEND; PROCEDURE SENDDOWN(VAR s: SIGNAL); cp; cp := this; END; END DOIO; PROCEDURE PAUSE(n: CARDINAL); VAR this: SIGNAL; BEGIN IF n > 0 THEN  (* mark first process waiting for s as ready *) BEGIN IF s # NIL THEN s^.postponment := 0; s := s^.queue EN cp^.queue := tick; tick := cp; END; cp^.postponment := n; nextready; END PAUSE; PROCEDURE INITSIGNALD END SENDDOWN; PROCEDURE nextready; (* activate next ready process *) VAR this, strt: SIGNAL; BEGIN this := (VAR s: SIGNAL); (* Initialisation of a SIGNAL *) BEGIN s := NIL; END INITSIGNAL; PROCEDURE Clock; (* cp; WITH this^ DO IF interrupted # NIL THEN cp := interrupted; interrupted := NIL; ELSE LOOthis procedure acts as a clock, ticking 50 times per sec *) VAR this,last: SIGNAL; BEGIN LCS := 100B; LOOP IOTRANSFP strt := cp; REPEAT cp := cp^.next UNTIL (cp^.postponment=0) OR (cp=strt); IF cp^.postponment ER(clk, intbyclock, 100B); this := tick; last := NIL; WHILE this # NIL DO WITH this^ DO DEC(po= 0 THEN EXIT ELSE LISTEN END; END; END; TRANSFER(pp,cp^.pp); END; END nextready; PROCEDUREstponment); IF postponment = 0 THEN IF last = NIL THEN tick := queue ELSE last^.queue := qu WAIT(VAR s: SIGNAL); VAR this, next: SIGNAL; BEGIN (* insert current process at end of queue s *) IF s = NIL THEN eue END; ELSE last := this; END; this := queue; END; END; END intbyclock, clk: PROCESS; WSP: ARRAY [0..100] OF WORD; (* work space for clock process *) LCS [177546B]: CARDIs := cp ELSE this := s; LOOP next := this^.queue; IF next = NIL THEN EXIT END ; this := ne  * * 17-04-79 * * Modifications Geissmann: * * 18.12.79 * * 23.05 4 ) 6) identifiers can have at most a length of 40 characters; only 20 characters will be printed in the xreftable .80 * * * * * ******************************** 7) CROSSREF makes a difference between small an capital letters priority : 1 lexicografical order 2 small l END Clock; PROCEDURE INITSCHEDULER; BEGIN SYSRESET; (*NEW(cp)*) cp := ADDRESS(ADR(StorageForCP)); WITH cp^ DO ** SUMMARY ------- The program XREF generates from an input-ascii-file a cross reference list and a listing wit postponment := 0; next := cp; interrupted := NIL; END; tick := NIL; NEWPROCESS(Clock, ADR(WSP), SIZE(WSP)h numbered lines. XREF is written in MODULA-2 (version 2.10) and was implemented on PDP 11/30 under RT-11. main , clk); TRANSFER(intbyclock,clk); END INITSCHEDULER; BEGIN INITSCHEDULER END PROCESSSCHEDULER. features ------------- 1) the program demand one inputfile : file.ext 2) two ascii-outputfiles are generated : file.LST  file.XRF 3) this two files are already formated and may be printed directly to the lineprinter 4) when the inputfile is a list-file (with numbered lines), no listing will be generated by CROSSREF and the linenumbers are taken as referencenumbers ( lines without linenumbers (e.g. error-lines) are skipped ) 5) three switche(********************************* * * * * * XREF s may be set : /E,/S and /list /S : a small statistic will be printed to the keyboard /E : the fil * * * * UTILITY PROGRAM * * written by * * e .XRF contains 8 referencenumbers per line (default : /E missing => 15 numbers per line) /list : list STEFAN BERNER * * * * Diplomarbeit am * * Institut fuer Info may be N or L: /L : generate a listfile (in any case) /N : inputfile is a listfile (with nurmatik * * ETH Zuerich * * CH-8092 ZUERICH * * * * mbered lines) default : if the first nonblank at the first nonempty line of the file input is a  * * * * ( NOV/DEC 78 ) * * Modifications Naegeli: digit, the inputfile is treated as listfile otherwise, as a textfile (e.g. .MOD) ( see GIN key[ 1]:="AND "; key[ 2]:="ARRAY "; key[ 3]:="BEGIN "; key[ 4]:="BY "; key[ 5]:="CASE "; key[ ARDINAL; (* linenumber *) listing : BOOLEAN; (* listing ==> generate listing *) PROCEDURE Copy; 6]:="CONST "; key[ 7]:="DEFINITION "; key[ 8]:="DIV "; key[ 9]:="DO "; key[10]:="ELSE "; key[11]:="ELSIF ";  BEGIN IF listing THEN WriteCh(ch) END; ReadCh(ch); END Copy; (*-----*) PROCEDUR key[12]:="END "; key[13]:="EXIT "; key[14]:="EXPORT "; key[15]:="FOR "; key[16]:="FROM "; key[17]:E NewLine; BEGIN IF listing THEN INC(lno); WriteNum(output,lno,6); WriteCh('="IF "; key[18]:="IMPLEMENTATION "; key[19]:="IMPORT "; key[20]:="IN "; key[21]:="LOOP "; key[22]:="MO ');WriteCh(' ') ELSE (* skip empty lines and get first nonblank*) WHILE (ch = ' ') AND NOT EOSD "; key[23]:="MODULE "; key[24]:="NOT "; key[25]:="OF "; key[26]:="OR "; key[27]:="POINTER "; key[28(input) DO ReadCh(ch); END; IF (ch>='0') & (ch<='9') AND NOT EOS(input) THEN etter < capital letter MODULA-2 dependent features --------------------------- - keywords of MODULA-2 are not l]:="PROCEDURE "; key[29]:="QUALIFIED "; key[30]:="RECORD "; key[31]:="REPEAT "; key[32]:="RETURN "; key[33]:="Sisted in the xreftable - B and C at the end of a number are not treated as identifiers - comments (**) are skipped (also nestET "; key[34]:="THEN "; key[35]:="TO "; key[36]:="TYPE "; key[37]:="UNTIL "; key[38]:="VAR "; keed comments!) - strings ( ' ', " ") are skipped (**) ACHTUNG bei Aenderungen im Programm muss man sich vergewissern, dasy[39]:="WHILE "; key[40]:="WITH "; END KeyDefinition; (**************************************************) MODs die groesste Adresse 70000B nicht uebersteigt. (**) *) (************************************************************) ULE Scanner; FROM KeyDefinition IMPORT keynum,key; FROM TableHandler IMPORT Enter; FROM Streams IMPORT Res MODULE XREF; (*$T-*) IMPORT SYSTEM, Files, Streams, TTIO, FileNames, Options, WriteStrings, Conversions; MOet,EOS; FROM InputOutput IMPORT WriteCh,ReadCh,LF,CR,WriteNum,input,output,ERROR; EXPORT QUALIFIED Scan,id,first,last;DULE KeyDefinition; (* Define all key-words, which are not listed in the cross- reference-table. Standard identifiers are CONST maxid=39; (* max length of identifier *) VAR id : ARRAY [0..maxid] OF CHAR; first,last : CARDINAL; (* firs NOT keywords! *) EXPORT QUALIFIED keynum,key; CONST keynum = 40; (* Number of keywords *) t and last linenumber *) PROCEDURE Scan(VAR switch : CARDINAL); (* scan the input text and generate the xreftable alfalength = 14; TYPE alfa = ARRAY [0..alfalength] OF CHAR; VAR key : ARRAY [0..keynum] OF alfa; BE and the listing *) VAR ch : CHAR; i,k,l,m,r : CARDINAL; (* auxiliary *) lno : C 275 END; x:=10*x+CARDINAL(ch)-CARDINAL('0'); ReadCh(ch) END; RETURN x) OR EOS(input); l:=1; r:=keynum; id[k]:=" "; (* binary search *)  END ReadCARDINAL; (*-----*) PROCEDURE Comment; (* recursive procedure for nested comments *)  REPEAT m:= (l+r) DIV 2; i:=0; WHILE (id[i]=key[m,i]) & (id[i]#" ") DO INC( BEGIN LOOP IF EOS(input) THEN EXIT END; IF ch='(' THEN Copy; IF (chi) END; IF id[i] <= key[m,i] THEN r:=m-1 END; IF id[i] >= key[m,i] THEN l:=m+1 END ='*') AND NOT EOS(input) THEN Copy; Comment END; ELSIF ch=LF THEN Copy; IF NOT EOS(input) TUNTIL l>r; IF l=r+1 THEN Enter(lno) END (* no keyword, hence insert lno *) ELSIF (ch>='0') & (ch<='9'HEN NewLine END; ELSIF ch = '*' THEN Copy; IF (ch = ')') AND NOT EOS(input) THEN Copy; EXIT) THEN (* number *) REPEAT Copy UNTIL ((ch<'0') OR (ch>'9')) AND ((CAP(ch)<'A')  END ELSE Copy END; (* IF *) END; (* LOOP *) END Comment; (*-----*) BEGIN (OR (CAP(ch)>'F')) OR EOS(input); IF NOT EOS(input) THEN IF CAP(ch)* Scan *) lno:=0; first := 0; listing := (switch = 0); IF switch = 2 THEN REPEAT ReadC = 'H' THEN Copy; ELSIF ch = '.' THEN (* real number *) Copy; WHILE (ch>='0'h(ch); IF (ch = CR) AND NOT EOS(input) THEN ReadCh(ch); IF (ch = LF) AND NOT EOS(input) THEN R) AND (ch<='9') AND NOT EOS(input) DO Copy; END; IF (CAP(ch) = 'E') AND  lno:=ReadCARDINAL() ELSE (*skip unnumbered lines *) WHILE (ch <> LF) AND NOT EOS(inputeadCh(ch) END; END UNTIL (ch # " ") OR EOS(input); listing:=(ch<'0') OR (ch>'9'); Reset(input)) DO ReadCh(ch) END; IF NOT EOS(input) THEN ReadCh(ch); NewLine END; END (* IF *) END; (* IF  END; (* IF *) IF listing THEN switch := 1 ELSE switch := 0 END; (* start to scan *) *) IF first = 0 THEN first := lno END END NewLine; (*-----*) PROCEDURE ReadCARDINAL():CARDINAL;  ReadCh(ch); WHILE NOT EOS(input) DO NewLine; WHILE (ch <> LF) AND NOT EOS(input) DO IF (C VAR x : CARDINAL; b : BOOLEAN; BEGIN x:=0; b := TRUE; WHILE (ch >= '0') AND (ch <=AP(ch) >= 'A') AND (CAP(ch) <= 'Z') THEN (* identifier *) k:=0; REPEAT IF k '9') AND NOT EOS(input) DO IF x > 3275 THEN IF b THEN ERROR(8) END; b := FALSE; x:=3 < maxid THEN id[k]:=ch; INC(k) END; Copy UNTIL ((ch<'0')OR(ch>'9'))AND((CAP(ch)<'A')OR(CAP(ch)>'Z')   Copy; END; END; END; END; ELSIF ch='(' THnt : CARDINAL END; VAR fileref : ARRAY [1..4] OF wordfile; PROCEDURE GetWord(rf:CARDINAL;VAR w:EN Copy; IF (ch='*') AND NOT EOS(input) THEN Copy; Comment END; ELSIF ch='"' THEN (* sWORD); BEGIN WITH fileref[rf] DO ReadWord(file,w); DEC(cnt) END (* WITH *) END GetWordtring *) REPEAT Copy UNTIL (ch='"') OR EOS(input); Copy ELSIF ch="'" THEN (* string *); (*---*) PROCEDURE PutWord(rf:CARDINAL; w:WORD); BEGIN WITH fileref[rf] DO WriteWord(file,w);  REPEAT Copy UNTIL (ch="'") OR EOS(input); Copy ELSIF ch # LF THEN Copy END; INC(cnt) END (* WHILE *) END PutWord; (*---*) PROCEDURE eorf(rf:CARDINAL):BOOLEAN; (* end-o (* IF *) END; (* WHILE *) IF NOT EOS(input) THEN Copy END; END; (*WHILE*) last:=lno END Scf-ref-file *) BEGIN RETURN fileref[rf].cnt<=0 END eorf; END RefFile; (**********) PROCEDURE ReadCh(VARan; END Scanner; (**************************************************************) MODULE InputOutput;  ch : CHAR); (* Read one character from file input *) BEGIN ReadChar(input,ch) END ReadCh; (*-----*) PROCEDURE FROM Streams IMPORT STREAM,ReadChar,WriteChar,ReadWord,WriteWord; FROM WriteStrings IMPORT WriteStringC, WriteLn; IMPORT  WriteCh(ch : CHAR); (* Write one character to the file output *) BEGIN WriteChar(output,ch) END WriteCh; (*-----*) SYSTEM; EXPORT QUALIFIED WriteCh,ReadCh,WriteNum,WriteBlanks,Writeln, CR, LF, input,output,ERROR, wordfile,PutWord,G PROCEDURE WriteNum(f: STREAM;x: INTEGER;n: CARDINAL); (* Write x in decimal form with n characters to file f *) VAR ietWord,eorf,fileref,BlockMark,TreeFlag; CONST CR = 15C; (* Carriage Return *) LF = 12C; (* Line Feed *) T : CARDINAL; x1,x2 : INTEGER; d : ARRAY [1..6] OF CHAR; (* x in character-form;assume log10(x)<7 *) BEGIYPE String30 = ARRAY [0..29] OF CHAR; VAR input,output : STREAM; (**********) MODULE RefFile; (* This MODN x1:=ABS(x); i:=0; REPEAT INC(i); x2:=x1 DIV 10; d[i]:=CHAR(x1-x2*10+60B); (* =CHAR(x1 MOD 10ULE defines the 4 local files ref1 - ref4 and contains the operations for them *) FROM SYSTEM IMPORT WORD;  + INTEGER('0') *) x1:=x2 UNTIL x1=0; IF x < 0 THEN INC(i); d[i]:='-' END; WHILE n>i DO WriteChar(f," "); DECNOT EOS(input) THEN Copy; IF ((ch='+') OR (ch='-')) AND NOT EOS(input) THEN IMPORT STREAM,ReadWord,WriteWord; EXPORT wordfile,PutWord,GetWord,eorf,fileref,BlockMark,TreeFlag; CONST BlockMark = Copy; END; WHILE (ch>='0') AND (ch<='9') AND NOT EOS(input) DO  177777B; TreeFlag = 100000B; TYPE wordfile = RECORD file : STREAM; c   be greater than (2 * log2(maxtree)) *) (** ** for large vesion : CONST maxchar = 5600; (* size fo CHAR-ARRAY (c ELSE r:=less END; LOOP IF CAP(ch) # CAP(chlst[k]) THEN EXIT END; IF(n) END; REPEAT WriteChar(f,d[i]); DEC(i) UNTIL i=0; END WriteNum; (*-----*) PROCEDURE Writeln(f: STREa 2800 words)*) maxreftab = 300; (* size of Reference table (ca 600 words)*) maxtree = 800; (* size of treeAM); BEGIN WriteChar(f,CR); WriteChar(f,LF) END Writeln; (*-----*) PROCEDURE WriteBlanks(f: STREAM;n: CARDINAL);  ARRAY (ca 3200 words)*) treelog = 30; (* must be greater than (2 * log2(maxtree)) *) ** **) (* Zu Bea BEGIN WHILE n > 0 DO WriteChar(f," "); DEC(n) END (* WHILE *) END WriteBlanks; (*-----*) PROCEDURchten bei Aenderungen: Der Ausdruck (maxchar DIV 2) + (maxreftab * 2) + (maxtree * 4) darf E ERROR(n:CARDINAL); BEGIN WriteStringC(" ---- "); CASE n OF 1 : WriteStringC('DEVICE FULL'); |2 : WriteStringnicht groesser sein als 6600. *) MODULE CharacterTable; (* This Module contains all tables, index' and procedureC('TOO MANY IDENTIFIERS'); |3 : WriteStringC('TOO MANY CHARACTERS'); |4 : WriteStringC('BYE'); |5 : WriteStringC('ILs for the identifierlist. *) IMPORT id,maxchar; EXPORT chlst,chind,Compare,relation,InsertId; L SWITCH') |6 : WriteStringC('ILL COMMAND') |7 : WriteStringC('FILE NOT FOUND') |8 : WriteStringC('LINENUMBER TO LAR TYPE relation = (less,equal,greater); VAR chlst : ARRAY [0..maxchar] OF CHAR; (* character-list *) GE') END; (* CASE *) WriteLn; END ERROR; (*-----*) END InputOutput; (**************************************** chind : CARDINAL; (* index to first free place at chlst *) PROCEDURE Compare(k:CARDINAL):relation; (* **********) MODULE TableHandler; FROM Scanner IMPORT id,first,last; FROM RefListOut IMPORT OutRef,InvertOrder;Compare id with the identifier beginning at chlst[k] and returns less,equal or greater *) VAR i : CARDINAL;  FROM InputOutput IMPORT Writeln,WriteNum,WriteCh,WriteBlanks,output,ERROR, GetWord,BlockMark,TreeFlag; FROM Command  ch: CHAR; r : relation; BEGIN i:=0; LOOP ch:=id[i]; IF ch # chlst[k] THEN IMPORT reffileout; EXPORT QUALIFIED Enter,root,treearr,refarr,refind,WriteTab,chlst,treelog, chind,t EXIT END; IF ch <= " " THEN RETURN equal END; INC(i);INC(k) END; (* LOOP *) IF CAP(ch) > CAreeind; CONST maxchar = 4000; (* size fo CHAR-ARRAY (ca 2000 words)*) maxreftab = 1300; (* size of Reference P(chlst[k]) THEN RETURN greater ELSIF CAP(ch) < CAP(chlst[k]) THEN RETURN less ELSE (* same letters (capital &table (ca 2600 words)*) maxtree = 500; (* size of tree ARRAY (ca 2000 words)*) treelog = 30; (* must small) *) (* assume upper case letter greater than lower case letter *) IF ch < chlst[k] THEN r:=greater  bles and procedures for the handling of the referencelist *) IMPORT maxreftab; used element *) full : CARDINAL; (* table full *) refful : BOOLEAN; (* referencelist full *)  EXPORT refarr,refind,InsertRf; TYPE ref = RECORD rnum,next : CARDINAL  PROCEDURE Enter(num :CARDINAL); (* IF id in list THEN insert refnum ELSE insert id and r END; VAR refarr : ARRAY [1..maxreftab] OF ref; (*reference numbers array *) refind : CARDINAL; (* poinefnum full = 1 : tree-array full; = 2 : char-array full; *) VAR p : CARDINAL; ter to first element of LAVS *) PROCEDURE InsertRf(VAR ind:CARDINAL;num:CARDINAL;VAR reffull:BOOLEAN); VA PROCEDURE Search(p:CARDINAL):CARDINAL; (* search id. IF not found, insert a new element in tree and id in the  (ch <= ' ') AND (chlst[k] <= ' ') THEN RETURN r END; INC(i);INC(k); ch:=id[i] END; (* LOOP R p: CARDINAL; BEGIN p:=refind; refind:=refarr[refind].next; IF refind = 0 THEN reffull := TRUE EN*) IF CAP(ch) > CAP(chlst[k]) THEN RETURN greater ELSE RETURN less END ENDD; WITH refarr[p] DO rnum:=num; next:=ind END; (* WITH *) ind:=p; END InsertRf;  (* IF *) END Compare; (*-----*) PROCEDURE InsertId(VAR err : BOOLEAN); (* Insert id in chlst begin BEGIN (* initialise LAVS *) FOR refind:= 1 TO (maxreftab-1) DO refarr[refind].next:= refindning at chind. 1 blank is added. chind is the adress of the next free place on chlst. err = TRUE <=== no place in+1 END; refarr[maxreftab].next:=0; refind:=1 END ReferenceTable; (****************************** chlst *) VAR i : CARDINAL; BEGIN err:=FALSE; i:=0; WHILE (id[i] > " ") & NOT err D******) MODULE Tree; (* contains all variables and procedures for the treehandling *) IMPORT O chlst[chind]:=id[i]; IF chind = maxchar THEN err:= TRUE ELSE INC(i);INC(chind OutRef,reffileout,InsertRf,Compare,relation,InsertId, chind,ERROR,maxtree; EXPORT Enter,root,treearr,treeind) END (* IF *) END; (* WHILE *) chlst[chind]:=" "; IF chind = maxchar THEN err:=TRUE ; CONST root = 0 ; (* root of tree *) TYPE pointrec = RECORD pid,pre ELSE INC(chind) END END InsertId; (*-----*) BEGIN chind:=0 END Characf : CARDINAL; (* pointers to char- and reflist *) pgreater,pless : CARDINAL END; terTable; (***********************************) MODULE ReferenceTable; (* contain all varia VAR treearr : ARRAY [0..maxtree] OF pointrec; (* tree-array *) treeind : CARDINAL; (* pointer to last   ELSE treearr[p].pless := treeind END; (* IF *) WITH treearr[treeind] DO pgreater:=0; INC(i);DEC(k) UNTIL (chlst[i]=" ") OR (k<=0); WriteBlanks(output,k); i:=N; IF onfile  pless:=0; pid:=chind; pref:=0 END; (* WITH *) InserTHEN IF p=w-TreeFlag THEN (* write out the first references: they are on the file *) tId(err); IF err THEN full :=2 END END; (* IF *) RETURN treeind END Search;  GetWord(tab,w); REPEAT IF i=0 THEN Writeln(output);WriteBlanks(output,L);  BEGIN (* Enter *) p:=Search(root); CASE full OF 1 : ERROR(2)(* TREE-LIST FULL *) |2 : ERROR(3 i:=N END; (* IF *) WriteNum(output,w,6); INC(refind); Get)(* CHAR-LIST FULL *) ELSE END; (* CASE *) InsertRf(treearr[p].pref,num,refful); IF refful THEN OutRef; refWord(tab,w); DEC(i) UNTIL w >= TreeFlag; END; (* IF *) onfile:= (w ful:=FALSE; reffileout:=TRUE END; END Enter; BEGIN refful:=FALSE; full:=0; treeind:=0; # BlockMark); END; (* IF *) p:=treearr[p].pref; (* write out the last references: they are in core WITH treearr[root] DO pgreater := 0; pless := 0; pid := 0; pref := 0; END; END Tree; (******** *) IF p#0 THEN InvertOrder(p); REPEAT IF i=0 THEN Writeln(output);WriteBlan char-list. Return the adress of the created or found element *) VAR q : CARDINAL; r : relation;***************************) PROCEDURE WriteTab(onfile : BOOLEAN; tab,N : CARDINAL); (* write the whole X-r err : BOOLEAN; BEGIN q:=treearr[p].pgreater; r:=greater; WHILE q # 0 DO ef-list (with identifiers ) to the file output onfile = TRUE ===> part of the reference-list is on the file ta p:=q; WITH treearr[p] DO r:=Compare(pid); IF r = equal THEN RETURN p b The list in the reference-array is in reversed order! *) TYPE str = ARRAY [0..12] OF CHAR; VAR ELSIF r=less THEN q:=pless ELSE q:=pgreater END (* IF *) END w : CARDINAL; PROCEDURE Print(p:CARDINAL); (* Print out the node p (identifier and reference-list *)  (* WITH *) END; (* WHILE *) (* NOT found, hence insert *) IF treeind = maxtree THEN full:=1  CONST L = 20; (* max length of identifier *) VAR i,k : CARDINAL; BEGIN ( ELSE INC(treeind); IF r = greater THEN treearr[p].pgreater:=treeind * print identifier *) i:=treearr[p].pid; k:=L; REPEAT WriteCh(chlst[i]);   p#0 THEN TraverseTree(treearr[p].pless); Print(p); TraverseTree(treearr[p].pgreater) f[2]) *) PROCEDURE InvertOrder(VAR t : CARDINAL); (* Invert the order of the reference-list beginning with refarr[ END (* IF *) END TraverseTree; (*-----*) PROCEDURE firstlast(mes : str;fila : CARDINAL); t]. t becomes the new begin of the reversed list. *) VAR p,q : CARDINAL; BEGIN q:=refarr[t].next; refarr[t] VAR i : CARDINAL; BEGIN FOR i := 0 TO 12 DO WriteCh(mes[i]) END; WriteNum(output,fila,6); .next:=0; WHILE q # 0 DO p:=refarr[q].next; refarr[q].next:=t; t:=q; q:=p END (* WHILE *) END Inve Writeln(output) END firstlast; (*-----*) BEGIN (* WriteTab *) refind:=0; Writeln(rtOrder; (*-----*) PROCEDURE OutRef; VAR r,t : CARDINAL; PROCEDURE NextId():CARDINAL; (* search the noutput); firstlast('FIRST LINE = ',first); firstlast('LAST LINE = ',last); Writeln(output); IF onfiext identifier to write on file. Returns Adress of node in tree*) VAR q : CARDINAL; PROCEDURE Through; le THEN GetWord(tab,w) END; Writeln(output); TraverseTree(treearr[root].pgreater); Writeln(output) END (* change file *) BEGIN PutWord(now,BlockMark); (* Write Terminator *) IF now=1 THEN now :=2 WriteTab; END TableHandler; (**************************************************) MODULE RefListOut; (* cont ELSE now :=1 END; (* IF *) END Through; BEGIN q:=treearr[order[ordind].Node].pgreater; IF qains all variables and procedures to write the referencelist on file *) FROM Streams IMPORT Connect, Disconnect; FRO = 0 THEN (* no right part *) WHILE order[ordind].DownOnPgreater DO DEC(ordind) END; IF ordind > 0 THEN DECM Files IMPORT SetBlock, FileName, Release; FROM TableHandler IMPORT refarr,refind,treearr,root,treelog; FROM Command(ordind) ELSE Through END; ELSE (* right part *) INC(ordind); WITH order[ordind] DO DownOnPgreate IMPORT reffileout, fn; FROM InputOutput IMPORT ERROR,fileref,PutWord,BlockMark,TreeFlag; EXPORT QUALIFIED OutRef,Ir := TRUE; Node := q END; WHILE treearr[q].pless # 0 DO q:=treearr[q].pless; INC(ordind); ks(output,L); i:=N END; (* IF *) WriteNum(output,refarr[p].rnum,6); INCnvertOrder,now, TermRef; CONST ref1File = 8; ref2File = 9; ref3File = 10; ref4File = 11; VA(refind); p:=refarr[p].next; DEC(i) UNTIL p=0 END; (* IF *) WrR order : ARRAY [0..treelog] OF RECORD DownOnPgreater: BOOLEAN; Node: CARDINAL; iteln(output); END Print; (*-----*) PROCEDURE TraverseTree(p:CARDINAL); BEGIN IF END; ordind : INTEGER; (* index to last order-pointer *) now : CARDINAL; (* actual file (ref[1] or re  WITH order[ordind] DO DownOnPgreater := FALSE; Node := q END; END (* WHILE *) END; (* IF *)  free place in LAVS *) r:=refarr[t].next; refarr[t].next:=refind; refind:=t; t:=r UNTIL t=0 END RETURN order[ordind].Node; END NextId; (*-----*) PROCEDURE OpenRef; (* create the files ref[1],ref[2],ref OutRef; PROCEDURE TermRef; VAR ix : CARDINAL; BEGIN IF reffileout THEN FOR ix := 1 TO 4 DO Disconnect([3],ref[4] *) VAR reply : INTEGER; localfn : FileName; i : CARDINAL; BEGIN localfn := " fileref[ix].file,FALSE) END; Release(ref1File); Release(ref2File); Release(ref3File); Release(ref4FiREF1 TEM"; FOR i := 0 TO 2 DO localfn[i] := fn[i] END; SetBlock(ref1File,localfn,2,30,reply); (* create *) le); END; END TermRef; BEGIN (* RefListOut *) ordind:=0; WITH order[0] DO DownOnPgreater := FALSE; Node := r IF reply <= 0 THEN ERROR(7)(* file not found *) END; Connect(fileref[1].file,ref1File,TRUE); localfn[6] := '2'oot END; END RefListOut; (*****************************************************) MODULE MergeFiles; FROM InputOutp; SetBlock(ref2File,localfn,2,30,reply); (* create *) IF reply <= 0 THEN ERROR(7)(* file not found *) END; ut IMPORT PutWord,GetWord,eorf,BlockMark,TreeFlag,fileref; FROM TableHandler IMPORT treearr,chlst; FROM Streams IMPORT R Connect(fileref[2].file,ref2File,TRUE); localfn[6] := '3'; SetBlock(ref3File,localfn,2,30,reply); (* create *) eset,EndWrite; FROM RefListOut IMPORT now; EXPORT QUALIFIED Merge; PROCEDURE Merge(VAR hlp: CARDINAL); (* merge an IF reply <= 0 THEN ERROR(7)(* file not found *) END; Connect(fileref[3].file,ref3File,TRUE); localfn[6] d sort the files ref[1] and ref[2]. Result on ref[hlp] *) VAR w1,w2 : CARDINAL; h1 : CARDINAL; r1,r2,r3,r4:= '4'; SetBlock(ref4File,localfn,2,30,reply); (* create *) IF reply <= 0 THEN ERROR(7)(* file not found *) END : CARDINAL; PROCEDURE CopyIdList(i : CARDINAL); (* i = 1 copy ref[1] to hlp until end-of-block = 2 copy re; Connect(fileref[4].file,ref4File,TRUE); FOR now := 1 TO 4 DO fileref[now].cnt:=0 END; now:=1 END Openf[2] to hlp until end-of-block = 3 copy lower identifier (ref[1] or ref[2]) to hlp *) VAR i1,i2 : CARDINAL; Ref; BEGIN (* OutRef *) IF NOT reffileout THEN OpenRef END; REPEAT r:=NextId(); t:=treearr[r].pre PROCEDURE CopyPart(rf:CARDINAL;VAR w : CARDINAL); BEGIN REPEAT PutWord(hlp,w); f UNTIL t#0; treearr[r].pref:=0; (* delete reflist in treearr *) InvertOrder(t); (* Output to file, starting  GetWord(rf,w) UNTIL w >= TreeFlag; END CopyPart; PROCEDURE Lower(k1,k2:CARDINAL):BOOLEAN; with the address of the treenode *) PutWord(now,r+TreeFlag); REPEAT PutWord(now,refarr[t].rnum); (* insert (* Compare identifier at node k1 with node k2 and Returns id(node k1)CAP(chlst[k2]eref[r3].file); Reset(fileref[r4].file); fileref[r3].cnt:=0; fileref[r4].cnt:=0; hlp:=r3; WHI) THEN RETURN FALSE ELSE (* assume upper case letter greater than lower case letter *) b:=chlLE (NOT eorf(r1)) AND (NOT eorf(r2)) DO GetWord(r1,w1); GetWord(r2,w2); REPEAT CopyIdst[k1]>chlst[k2]; LOOP IF CAP(chlst[k1])#CAP(chlst[k2]) THEN EXIT END; IF (chlst[k1List(3) UNTIL (w1=BlockMark) OR (w2=BlockMark); CopyIdList(1); CopyIdList(2); PutWord(]<=' ') AND (chlst[k2]<=' ') THEN RETURN b END; INC(k1);INC(k2) END; RETURN(CAP(chlst[hlp,BlockMark); IF hlp = r3 THEN hlp:=r4 ELSE hlp:=r3 END; END; (* WHILE *) IF NOk1]) w2 THEN CopyPart(r2:=r1; r1:=r3;r3:=h1; Reset(fileref[r1].file); Reset(fileref[r2].file); END; (* WHILE *) hlp:=r1; E  ConvertCardinal(last-first+1,7,numstr); WriteString(numstr); WriteLn; WriteStringC('identifiers : ');  IF cancel THEN (* inputline cancelled *) ELSIF noFile THEN EXIT; ELSIF superDefault THEN Wr ConvertCardinal(treeind,7,numstr); WriteString(numstr); WriteLn; WriteStringC('characters : '); iteStringC(" ---- no default file"); WriteLn; ELSE (* filename is typed *) Lookup(inFile,fn,reply);  ConvertCardinal(chind-treeind,7,numstr); WriteString(numstr); WriteLn; WriteStringC('refnumbers : ');  IF reply > 0 THEN InterpreteOptions(cancel); IF cancel THEN Release(inFile); ELSE okay := ConvertCardinal(refind,7,numstr); WriteString(numstr); WriteLn; END Statistic; (*-----*) PRO TRUE; EXIT; END; ELSE WriteStringC(" ---- file not found"); WriteLn; ReleaCEDURE AcceptCommand(VAR fn : FileName; VAR okay: BOOLEAN); (* accept command from keyboard *) VAR cancel : BOOLEAN;se(inFile); END; END; END; (* LOOP *) END AcceptCommand; (*-----*) VAR reply: INTEGER; (* us reply : INTEGER; PROCEDURE InterpreteOptions(VAR illegaloptions: BOOLEAN); VAR opttext : ARRAY [0..1] OFed only as a result parameter *) BEGIN (* Command *) reffileout:=FALSE; AcceptCommand(fn,ok); IF ok THEN htring, WriteStringC, WriteLn; FROM Conversions IMPORT ConvertCardinal; FROM RefListOut IMPORT TermRef; FROM MergeFiles I CHAR; optlength : CARDINAL; BEGIN illegaloptions := FALSE; GetOption(opttext,optlength); WMPORT Merge; FROM Scanner IMPORT Scan,first,last; FROM TableHandler IMPORT WriteTab,treeind,chind,refind; FROM InputOutpHILE optlength > 0 DO IF optlength <> 1 THEN illegaloptions := TRUE; ELSE CASE opttext[0ut IMPORT input,output,ERROR; EXPORT QUALIFIED reffileout, fn; CONST inFile = 5; outFile = 6; xrefFile] OF 'E' : refonline:=8 |'L' : switch:=0 |'N' : switch := 1 |'S' : stat :=  = 7; VAR fn : FileName; helpfn : FileName; ok : BOOLEAN; (* command accepted *) TRUE ELSE illegaloptions := TRUE; END; (* CASE *) END; GetOption(opttext,optlength); reffileout : BOOLEAN; (* part of table on file fi *) i : CARDINAL; fi : CARDINAL; switch, END; IF illegaloptions THEN ERROR(5) END; END InterpreteOptions; BEGIN okay := FALSE; LOOP refonline : CARDINAL; (* options *) stat : BOOLEAN; (* option *) PROCEDURE Statistic; TYPE str1 (* defaults *) switch := 2; stat := FALSE; refonline := 15; (* file name and options input *) 5 = ARRAY [0..14] OF CHAR; VAR numstr : str15; BEGIN (* Statistic *) WriteStringC('lines : ');  WriteStringC("input file> "); ReadFileName(fn,'DK YYYYYYLST'); ReadOptions(cancel,TRUE,TRUE); WriteLn;  onnect(output,FALSE); Release(outFile); END; (* IF *) (* open output .XRF *) fn[ 9]:='X'; fn[10]@BN0~46@BU@pU@:='R'; fn[11]:='F'; Create(xrefFile,fn,reply); Connect(output,xrefFile,FALSE); IF reffileout THEN Mergef ^  _lPtPPPd_(fi) END; WriteTab(reffileout,fi,refonline); IF stat THEN Statistic END; EndWrite(output); Disconnect(ou& & & Le& >H Itput,TRUE); TermRef; END; END Command; (**************************************************) END XREF. Pe_ l r2re ^ e  ($, _b \`:  _ _' _Ce_ee"$&(_*,5 !!P_"$&(_*,&&&ex. V   e&  e   e&  e  D@<2ff $ d`g%`wff "ee@ Hw< e& &  e l@l@   e  elpfn := " 123456789"; FOR i := 0 TO 2 DO helpfn[i] := fn[i] END; Create(outFile,helpfn,reply); Connect(inpuw. ``ՔB~ fՔC~eH feCEՔB~eHwf t,inFile,FALSE); Reset(input); Connect(output,outFile,FALSE); Scan(switch); Disconnect(input,TRUE);  6A  v v  6 vf   N A f C'%vC B      EndWrite(output); IF switch = 1 THEN (* rename LST file *) Disconnect(output,TRUE); fn [9]:='L';    w &AF&fAF&f&f fn[10]:='S'; fn[11]:='T'; Rename(outFile,fn,helpfn,reply) ELSE (* release opened LST file *) Disce@`  >  `> &&N04 @r ŗ*ECw:  2 2 ,w2 2 ,w`r A E &  f  e  '  w '  e z ' ' E@rwD. Erw($w 2 wWq(lr,   n wߕ ߋ '  e ' ߕ ' '  wߕ ߋ `, Er Er e er2 e2@r ŗ*EC V V V Er' ߕ w :w:   ErEr 2 e2@r ŗ*E zw: N L  'ߕ   r   & & e e' ߕ w' ߕ w  e e eߋ ' ' ߕ wd' ߕ ߋ w V EWw V V'  g _! ߕ wR   Ef' w$  f Ve '  ߕ & &     e .   Eree ee ere2e e& ߋ %ߋ ' '  eK e   wߕ   CmW-K_T!wT!r,T! eC! ! leF!ߋX!w  "w   l_  eK5 , V!V!  & "e 5 T!r,T!r- KT!rN!_!R! R!lR!r-C   ffCe fe e 5 ,5 5 w2W-uw   C Ca  /:&,  )w0U-&  0: n/ . /. rU- P#,e_'ߕ'' 0.4U-. n/ .  n/ . `͕ , w /  0ߕ '&  ()ߋ'''wߋ'Gߋ''2'f& & r''' ߕ'ߋ'&   -w (s- s5fe (W%  )w62 rߋ'E: e (w"'e'z ' ߕ''ߕ'  \ )Ca )w  )w Ca W-E2@r' 'w'_''@U@$, _' )W'W!Ca )  2 EErAL!_N!N_P!P!V!V!T!P!e_R!V!T!5 , _X! Z!ߕ N#  v!f ) )TQ2 ,Pw0``f ),P '' ' #wf   "5 5 5 C CaCC'CCߕ'ߕ',E$ߕ'wU$2 ,`͋ `f )  W- f v& f ($CCa W-f v&W-PPOe D* ) ) & &  t+e  & uwCCa3 W-f v&u-f &C Ca  u- t+e  &  t+e   f  f t+e ,f &CCa   f $   s- rw`0,  w  w 2  2rr 2rr, rr, 2 wW- tEEt ltWtEC` ŕ0Elrw ÕAE`rE`s  w( w `-EW- E,  5  5 5 wu f &f r,  ,2 , `͕  `C`K ,` f Ce fe e  5 ,f "u- f "wu- A > .& 2 - 2 , ` `C`K  -22 .   \12 \1 \1z1e21W/\1w'\1'N \1ErAZ \1z1e21wb09 \1d optionempty filefile not found MODULA-2 linker, 03.07.80 link files to:> : SY empty fileno file foundfile not foundz1e21w>/\1 ,\1\1z1e21͕//w \1 )wV Z1: 'Z1\1*.SY MODULAM2S base file ( for )> DK LODbad optionempty filefile not found: linking system start address ( for B)> LODMAPend linkageerror in linkageO PO d ~1 B3333PP8 *Oe D*N:Wq e3f Be 8'8e!8 :e& e +ee D*8 * *8N:Wq e3 f Ce8 ,8 f jBN:Wq e3 f Ce:3 8 *e8 ?ee -e 1e *e RFߋ3ߋ3ߋ3ߋ3ߋ01?< 8 : *w`3ee e  e :ew"  9 :w 9 : *ߋ01wߋ3 #9 * *3ߕ8ߋZ Caw40W9 `qww8, f n/w  ) ., Ca 2  CalEAaɜw2lECaע  lECa n/ , - no filePO ' ' Z1 \101:11 Z1\12 e (  \1? )w~ \1  \1ߕ01^1 *wR  ,\1-E  _11w \1/w"\ )\1z1e21r ---- linker error 0more than files master file> DK LNKba Ee3ee e e&  e Be e D* *  e :e w6 2 ,%,!r!`͋r!` l:: C`K , l:: `͕ Y9 :wߋ11d9 :w r9 : * ߋ01ߋ3wV :339 e Be3 e \De  2 e ( w \ ) Z:`rߋ3G9 * e D*9 *e9 -e 1e *e RFߋ3ߋ3ߋ3ߕ3wP0!7,,1 Z:` ww ) ? )ߋ11e9 we9 0122ߋ01OL 9 : *w3ee e  e : : 2 WuZ:`ÜE`Õ0Ez ,:333333ee:ewB 9 :w 9 :ߋ3 9 * e D* *ߋ01ߋ3wߕ3ߕ3ߋ3#9 * *9 * *ߋ3-9 *e *ee D*: *eVߕ3ww  0E * e p;e3ee e  f jB e p;e3 e  : Ee3ee Heߋ33 e : Ee3ee He3 3 3 ߋ33 : *w3 3 !: * *  *8 : * 8& 2 2 ,::`W ::`f C : C, ::`W ::`f C ". C , ::`W ::`f C ,8 >9 * *8: 3  ) D*e8 e \De ߋ3O9 *ee r!` s- ECa 2 ,%, !r!  -e& 1eߋ11 *wR9 *ߕ11012ߋ01sp3ee eߋ113 e& U9 `͋r! ` C`K , r!`  l W!  f jB    ::T.ZjPkWq*eYfef k&֋7fefe fl&֋w:fj :fe D*f *ffe tpw d.\jwkWq*eYfef k&֋nfefe fl&֋w:fj :fe D*f *ffe tpfj *f *\j,wBfj *fkp*eY D*f *, w w'\jd f ,k Zj\jkWq*eYZjkp*eYf* \j\jkWq*eYXj  5 "\jkWq*eY C-"$'Xj  f xj Pk " XjXjjpe*G 3 .Glinker error 1more than procedu Xj Zje\jcode incompatiblewrong formatwrong module: version conflict on code incompatibres separate modulesversion conflict on version conflict on initialisation order of reference cycle: OcOO f: dp p p  *^j : *VPmj :& e +ee D*Oe D* *42 +,'j`j`j`j`s r ,j`j`s r ,,, ,, r'.G.GEW! zw,.G z, z'Zj\j :dj Pk \je *m    Aeee te ,kee k ,kee fl ,kp #e*GC,w se, , w:wT Ef,wep R%֋p $npe sŕE, f ,kEz2 , s, ww6 |twZj,wHp R%֋:we)e sEE(qC`K WuEE(qC`K 2 ,wN,q `f se sŕE,,* zm, we s,  er, s,q `W# ,q ` ,  s5 f ,k Ezw se,  e@qWq*eYfe :e Ef,we s,p R%֋pe $,p zw:p3 d#ep # pe se  |t, wp :w:q : *mwq * *p  sEf mŕE,WuEf lp : *w:p : *1 |t#ppe se s sE,, z |t ,ke 2s f ,k rs s |t ,kwp #ee te^\j@qWq*eYffe k&֋:fp :fe D*f *wJffee fl&֋:fp :ff D*f *p #$p ppp3 d#ep #e {ee {e {e22wle se sŕE,le withwrong format on base fileOOOc :\j@qWq*eYfefe ; ff zwE :w s, zwe sWuEW!Efe teߋ3 :  @w6e >  vepf lw:e se s ,,w r*_Zj A r_Xj:\j@qWq*eYfeffe  &&L04 , f , w  &  v$& #@BL046@BU@p d  _lPtPPPd_& & & Le& <H IPe_ l r2r2 e V e x ($, _bBF9  _ _' _Ce_ee PPOe e *ee B ,  "$&(_*,5 !!P_"$&(_*,&&6&ex~, TBe +ee X3& d#er Zj@Wq*eYff fOef>:0ff $ d`g%`wff "ee@ Hw> :e  Oe )  ߋ3 wZđ @Wq*eYff Ow0 ``ՔB~ fՔC~eH feCEՔB~eHwf ep :e Oe   rZj,w`@Wq*eYfב ff fO 6A  v v  6 vf   N A f C'%vC B       l@l@    e      eߕ wR   Ef' w$  f <e '  ߕ & &  e e .   Eree ee ere2@r ŗ*E& ߋ %ߋ ' ' l l eKn e   wߕ  l & Cw:  2 2 ,w2 2 ,w`r A EE@rwD. z fz ~ e z  | '~  ~ wx ~ '| ~ | ez z | '| ~ '~  n wߕ Erw($w 2 wWq(lr,  `, ߋ '| ~ | ez ' ߕ | '| ~ '~  wߕ ߋ  < Er Er e er2 e2@r ŗ*ECw :w: < < Er' ߕ   ErEr 2 e2@r ŗ*E zw: N Ll  'ߕ  l r   & & e e' ߕ w' ߕ w z  e el eߋ   e&  e   e&  e   e& &  e' ' ߕ wd'l ߕ ߋ w < EWw < <'  g _!l    & "el 5 :!r,:!r- K:!r4!_!8! 8!l8!r-CCmW-! E,  5  5 5 wu f &ff Ce fe2 , `͕  `C`K ,`  .  e  5 ,f u- f wu- A >  ffCe & 2 , 2 , ` `C`K  ,22 . /:&,  fe  e 5 ,5 5 w2W-uw   C Ca  (w0U,&  0: T/ . /. rU, 0.4U, 6#,e_'ߕl'h'ߕ m'&  ). T/ .  T/ . `͕ , w /  0  ,ߋh'm'h'wߋl'Gߋi''2n'f& & r'l'n' ߕl'ߋj'& )w62 rw (s- s5fe 'W%   \ K_:!w:!r,:!l eC! !l leF!ߋ>!w  w l l lߋk'E: e 'w"'en'z ' ߕl'm'ߕh'E2@r_l l eK5 , ! @!ߕ 4#  \!f #wTQ2 ,Pw0``f (,P i'j' 'CC'CCߕj'f   "5 5 5 C Ca W- fߕi',E$ߕi'wU$2 ,`͋ `f ( PPOe ** \& f $CCa W-f \&W-uwCCa3  ( ( & &  Z+e  &  Z+e   W-f \&u-f &C Ca  u-f &CCa &  Z+e   f  f Z+e ,w`0,  f $   s- rrr,   w  w 2  2rr 2rr, ŕ0Elrw2 wW- tEEt ltWtEC`EW-  ÕAE`rE`s  w( w `- r,  ," 1:1 @1B12 e '  B1? (w~ B1  B1ߕ1D1 f*wR  ,B1,E  _1w B1/w"\ (B1`1e1r B12 B1 B1`1e1 ---- linker error 0more than files master file> DK LNKbad optionempty filefile nW/B1w'B1'N B1ErAZ B1`1e1wb09 B1`1e1w>/ot found MODULA-2 linker, 03.07.80 link files to:> : SY empty fileno file foundfile not foundSY MODULAM2S base file (B1 ,B1B1`1e1͕//w B1 (wV @1: '@1B1*.@1`1e1  for )> DK LODbad optionempty filefile not found: linking system start address ( for B)> LODMAPend lC`K '@1B1w @1@1`1e1W/w. r!` inkageerror in linkageO PO d d1 tB3333PP8 f*Oe **4:Wq e3f Be 8'8e!8 v:e& e *ee **8 f* *84:Wq e3 f Ce8 ,8 f PB4:Wq e3 f Ce:3 8 f*e8 ?ee ,e z1e *(Ca (w  (w Ca W-W'W!Ca (  2 EErAZ Caw40W9 `qww8, f T/w  ( ., Ca 2  CalEAaɜw2lECaע lECa T/ , - no filePO ' ' @1 B1# 3  ( **e8 e BDe ߋ359 f*ee ,e& z1es- ECa 2 ,%, !r! `͋r! ߋ1 *w89 f*ߕ112ߋ1sp3ee eߋ13 e& ;9 De3ee ` C`K , r!`  l W!  f PB2 ,%,!r!e e&  e Be e ** *  e :e w6 ?9 v:wߋ1J9 v:`͋r!` l : C`K , l : `͕ w X9 v: * ߋ1ߋ3wV :33g9 e Be3 ߋ3Gt9 f* ee BDe  2 e ' w \ ( @:`rwP0!7, **9 f*e9 ,e z1e *e 8Fߋ3ߋ3ߋ3ߕ3ߋ1eg9 we,1 @:` ww ( ? (: : 2 Wug9 122ߋ1OL 9 v: *w3ee e  e :ewB 9@:`ÜE`Õ0Ez ,:333333ee H3e H,A v:w 9 v:ߋ3 9 f* e ** *ߋ1ߋ3wߕ3ߕ3ߋ3 9 f* *ErQߕ3w`Bߕ3wNSߕ3w<Aߕ3w*Mߕ3wVߕ3ww9 f* *ߋ3-9 f*e *ee **9 f*e E *  e V;e3ee e  f PB e V;e3 e 9 De3ee .eߋ33 e 9 De3ee .e3 3 3 ߋ33 9 f*w3 3 : f* *  *8 v: * 8e 8Fߋ3ߋ3ߋ3ߋ3ߋ1?< 8 v: *w`3ee e  e :e& 2 2 , :`W  :`f C : C,  :`W w" 8 v:w 8 v: *ߋ1wߋ3  9 f* *3ߕ8ߋ8 $9 f* *8:  :`f C ". C ,  :`W  :`f C , r!` $ % &  ,, r'GGEW! zw,G z, z'@jBj :djj 6k Bje m   ::T.@jPjWq*eYfef k&֋7fefe Ll&֋w:f|j v:fe **f *ffe Zpw d.BjwjWq*eYfef k&֋nfefe Ll&֋w:fj v:fe **f *ffe Zpfj f*f *Bj,wBfj f*fjp*eY **f *, w w'Bjd f k @jBjjWq*eY@jjp*eYf* BjBjjWq*eY>j  5 "BjjWq*eY C-"$'>jlinker error 1more than procedures separate modulesversion conflict on version conflict on initialisation order of reference cycle: OcOO L: Jp lp zp  *Dj v: *VPSj v:& e *ee **Oe ** *42 +,'j`j`j`j`s r ,j`j`s r ,,,' ߋ3 :  @w6e >  vep:Bj&qWq*e re r ,,w r*_@j A r_>j@j,wR&qWq*eeYfeffe j,wR"qWqeGC,we te kee k kee Ll kp #p 8%֋ re, , w:wT Ef,we r, wwp $npe rŕE, f kEz2 ,)e rEE6 btw@j,wHp 8%֋:we re rŕEqC`K WuEEqC`K 2 ,wNq `f rq `W#,,* zm, we r,  er,w re, q ` ,  r5 f k Ezp 8%֋pe  e&qWq*eYfe :e Ef,we r,  bt, $,p zw:p3 J#ep # pe re rEf l wp v:w:p v: mwp f* *p #ppŕE,WuEf lp v: *w:p v: *1 bt ke se re r rE,, z bt f k Xs s bt kwp #ee te^Bj&qWq*eYffe k&֋:fp v:fe **f *wJffee Ll&֋:fp v:  f ^j 6k " >j>jjpeG 3 G >j ff **f *p #$p ppp3 J#ep #e |{e@jeBjcode incompatiblewrong formatwrong module: version conflict on code incompatible withwrong format on be |{e |{e22wle re rŕE, zwase fileOOOc :Bj&qWq*eYfefe ; fffe teE :w r, zwe rWuEW!Ef lw:( )  rf  kfe rfe r E,wfe r, wwf kfe rwf kfe rfe rw~f kfe rfe rfe rw.w*w$v   ""b"bimported modules stackedno module found with initialisationprogram not executable Storage map of layer (module from file system linkage (without base file) linked to layer separate module Data: Proc #: First free location: OOOccc c j  ~eߋ2@j&Wq*eYf LA e Ɲe ߋ ߋ3  A  Bj* e{ 5 'dd 6kBj* e{  Bj* e{E _ :m .q   qe@j  ʓ bo o Bj&Wq*eY5 $2fe sf k f kf ".peF}f Xsfe sfe rwjf kffe$ rw:f kfe rfe r E,wfe r, wfe rf oC l"peGf* e,  f ef V;ee,w"f e, r fl.  k2"peG0l.2 eKlw~fe. (tf0l.  k",wP"peG  f w f&  , f , wfe rC l(f("peG  k("peGCb0l.2 ewŕEf @jWq*e >jp`f gGf  @jWq*f @j,wR&Wq*eYCfe. (tf0l.  kfe rfe r: `6**&p*eY l(,w e, , >j,wR"WqeGC,wf("peG  k("peGCb0l.2 ewwfe. (tf0l e, ,   Ι 7ŕEf  ef  .  kf,2  k 60l. 2 e0l.2 ew&6&p*eY2  f,w"2 ef ,    7ŕEf lf  0l.2 e(46w.w*w$~xx|2 f btf k-wBf r"bfe btf kwf rBj* e{,w.p Ef,w"e r ,   R Ι Ι Ι2 6 eF}feeee \me  wf :mBj&p*eYf r4@j,4w4&Wq*eYfffef Prefe- sf- k- 4fe Xsfeefe qfe ʓ f bo ,  \fe sfee e e* \me f  kfe r: `*6w r@j,w&Wq*eY&rm$r f",w8"peGlfe rwf ʜfe rfe rfC&l Hwtfe rC l2f ʜ2 , C "peGCb(, 3 J#e  "peG0fe r-fe rfe r E,w*f2 e  \$& # #l #Ef    r , wwfe. (tf0l.  k0l.2 eKm&w`fe. (tf@j,w\&Wq*eYfÕE fC" e* ff& C, w"f 0l.  kfe r: `6*0l.2 e*&Wp*eYKl&wfe. (tf0+ ꤀Oe ) r ߋ3 ꤀wZ ꤀&Wq*eYff Oep :ey ꤀w. ``ՔB~ fՔC~eH feCEՔB~eHwf Oe   r@j,w`&Wq*eYf ꤀ff fOef :efy  6A  v v  6 vf   N A f C'%vC B     ꤀fOe f fБ ꤀ff& r 2 f",w rW f fۑ ꤀   w &AF&fAF&f&ff Jf ꤀"peG  f wf ꤀ , f e@`  >  `> &&N04, w ꤀   \$& #@BN0~46@BU@pU@f ^  _lPtPPPd_& & & Le& >H IP   e&  e   e&  e   e& ,4 4w ʜ 6 v: *A v: *: w(& 6&Wq*eYf( Ι | x $4# r2 ,r!`͋r!`f r PPOeb #  _ e *ee B r, r e *e"$&(_*,5 !!P_"$&(_*,&&&ex. Ve X3& J#eX ꤀@j&Wq*eYff fOef :ep ꤀y D@<2ff $ d`g%`wff "ee@ Hw<,  e .   Eree ee ere2@r `͕ , w   h  w h s- ŗ*ECw:  2 2 ,w2 2 ,w`r A EE@rws5fe W%   \ x Ca x w  x w D. Erw($w 2 wWq(lr,  `,Ca W-W'W!Ca x  Er Er e er2 e2@r ŗ*ECw   2 EErAZ Caw40W9 `qww:w:   ErEr 2 e2@r ŗ*E zw:8, f "w  x  d, Ca 2  ,e_R ߕ  ߕ & CalEAaɜw2lECaע lECa " , X e_ ߋ   wߋ Gߋ '2 f& & rP   ߕ ߋ & ` w62 rߋ E: e w"P e z P  ߕ  ߕ E2@rT  V wV _V T @U@$, _  `  x  x TQ2 ,Pw0``f x ,P   R CCR CCߕ ߕ ,E$ߕ wU$ .& 2  2 , ` `C`K  22 d :&,  x w0U &  h: " &  e l@l@   e    d . rU  h.4U . " d  " d - TQe   e  x  2 2 70w ,1w e& ,  ('(&&f(*. je '.*: '(&w0&f&*,wbrqE`0re  x 07  x  e . @e '.*_ &f&*. je '.*~  & , , e& ? x B  X    w    e    " e "   " " e "    E Stack start address: (or 0 for default [=131000B]) MOD.LOD fe_ pA rf,w ,  EA r_& Erile:DK MOD LODnot foundSY RTS M2SSY:RTS.M2S not foundEOF reached on .SAV input fileChecksum error on .LOD input file.2 ,w4 eEE CA  f,  pCq_ E EsSAV file not createdAttempt to write over end of bit mapNot enough space on .SAV output fileEOF reached on .LOD input filewr wW-   $ f  @e  '  wite at EOF on .SAV output fileBoth parts of system try to occupy same locationEOF reached on .SAV input file.LOD file has wro f  @e '     ez ' '  nng formatNo entry point block found on .LOD fileNo new key block found on .LOD fileNo first free loc block found on .LOD file$ e'$  ' '   ez ' ' end system generation  P   2  4 ֋U@ P@E_6< P'  r *ߕSߕAߕV 0 e 0 : Pק6 ק6t6P4ŗ6 ":w&:w:ww$$$$< Ef "  &2 ,w e& , " E e&$ E e&Pe( E  4Wu  4Wu 2 4Wu V   B  ֋6@ P@E_6< P8 e&K Erer p*A rr2 ,wZ,  e&l EPק6< Ef8 4"w< Ef " &  f 4"  @ "  ! "   r w , ,   (_q* r_& EA r*_,'(&<2 ,. b#  _ e .   Eree ee ere2@r "$&(_*,5 !!P_"$&(_*,&&6&ex~, TBŗ*ECw:  2 2 ,w2 2 ,w`r A EE@rw>:0ff $ d`g%`wff "ee@ Hw>D. Erw($w 2 wWq(lr,  `,w0 ``ՔB~ fՔC~eH feCEՔB~eHwf  Er Er e er2 e2@r ŗ*ECw  6A  v v  6 vf   N A f C'%vC B     :w:   ErEr 2 e2@r ŗ*E zw: , e& ,',*9 '(&2 ,w e& ,  (w0&f&*.   w &AF&fAF&f&fe @e '.*  Hf   !Jf   !Lf   !@`  <  `> &&L04Nf   !  ,w"e P ,  !@BL046@BU@p d,we P,  f   !f  ֋ e   _lPtPPPd_&   !& & Le& <H IP   e&  e   e&  e   e& &  e l@l@   e    / R CCߕ ߕ ,E$ߕ wU$ .& 2  2 , ` `C`K  22 d :&,  x w0U &  h: " d . rU  h.4U . " d  " d `͕ , w   h  w h s- s5fe W%   \ x Ca x w  x w Stack start address: (or 0 for default [=131000B]) MOD.LOD fCa W-W'W!Ca x ile:DK MOD LODnot foundSY RTS M2SSY:RTS.M2S not foundEOF reached on .SAV input fileChecksum error on .LOD input file.  2 EErAZ Caw40W9 `qwwSAV file not createdAttempt to write over end of bit mapNot enough space on .SAV output fileEOF reached on .LOD input filewr8, f "w  x  d, Ca 2  ite at EOF on .SAV output fileBoth parts of system try to occupy same locationEOF reached on .SAV input file.LOD file has wro,e_R ߕ  ߕ & CalEAaɜw2lECaע lECa " , X e_ ߋ   wߋ Gߋ '2 f& & rP   ߕ ߋ & ` w62 rߋ E: e w"P e z P  ߕ  ߕ E2@rT  V wV _V T @U@$, _  `  x  x TQ2 ,Pw0``f x ,P   R CC0 : Pק6 ק6t6P4ŗ6 ":w&:w:ww$$$$< Ef "  &2 ,w e& , " E e&$ E e&Pe( E  4Wu  4Wu 2 4Wu V   B  ֋6@ P@E_6< P8 e&K Erer p*A rr2 ,wZ,  e&l EPק6< Ef8 4"w< Ef " &  f 4"  @ "  ! "   r w , ,   (_q* r_& EA r*_,'(&<2 ,TQe   e  x  2 2 70w ,1w e& ,  ('(&&f(*. je '.*: '(&w0&f&*,wbrqE`0re  x 07  x  e . @e '.*_ &f&*. je '.*~  & , , e& ? x B  X    w    e   , e& ,',*9 '(&2 ,w e& ,  (w0&f&*.  " e "   " " e "    E  @e '.*  Hf   !Jf   !Lf   !e_ pA rf,w ,  EA r_& ErNf   !  ,w"e P ,  !2 ,w4 eEE CA  f,  pCq_ E Es,we P,  f   !f  ֋ e  wW-   $ f  @e  '  w  ! f  @e '     ez ' '  nng formatNo entry point block found on .LOD fileNo new key block found on .LOD fileNo first free loc block found on .LOD file$ e'$  ' '   ez ' ' end system generation  P   2  4 ֋U@ P@E_6< P'  r *ߕSߕAߕV 0 e 0 1  END OpenIO; PROCEDURE Write(ch: CHAR); BEGIN IF OutOnTTY THEN TTIO.Write(ch) ELSE Streams.WriteChar(out,  BEGIN Write(CR); Write(LF) END Writeln; PROCEDURE WriteString(s: String); VAR i: CARDINAL; BEGIN i := 0; WIMPLEMENTATION MODULE InOut; (*$T- N.Wirth 27.2.80*) IMPORT SYSTEM, TTIO, Files, FileNames, Streams; CONST CR = 15C; Lch) END END Write; PROCEDURE WriteInt(x: INTEGER; n: CARDINAL); VAR i, x0: CARDINAL; a: ARRAY [0..6] OFF = 12C; ESC = 33C; InFno = 1; OutFno = 2; VAR InFromTTY, OutOnTTY: BOOLEAN; in, out: Streams.STREAM; In CHAR; BEGIN i := 0; x0 := ABS(x); REPEAT a[i] := CHAR(x0 MOD 10 + 60B); x0 := x0 DIV 10; INC(i) UNTIL x0 = 0; FN, OutFN: Files.FileName; PROCEDURE OpenIO; VAR ok: INTEGER; ch: CHAR; BEGIN REPEAT ShowString("input = ", FA IF x < 0 THEN a[i] := "-"; INC(i) END ; REPEAT DEC(n); Write(" ") UNTIL n <= i; REPEAT DEC(i); Write(a[i]) UNTIL i = wString("input = ", FA0 END WriteInt; PROCEDURE WriteCard(x, n: CARDINAL); VAR i: CARDINAL; a: ARRAY [0..6] OF CARDINAL; BEGIN  := 0 ELSE Files.Lookup(InFno, InFN, ok); IF ok >= 0 THEN Streams.Connect(in, InFno, FALSE); InFromTTi := 0; REPEAT a[i] := x MOD 10; x := x DIV 10; INC(i) UNTIL x = 0; REPEAT DEC(n); Write(" ") UNTIL n <= i; Y := FALSE ELSE ShowString(" not found", FALSE) END END ; TTIO.Write(CR); TTIO.Write(LF); UREPEAT DEC(i); Write(CHAR(a[i]+60B)) UNTIL i = 0 END WriteCard; PROCEDURE WriteOct(w: SYSTEM.WORD; n: CARDINAL); VANTIL ok >= 0; REPEAT ShowString("output = ", FALSE); FileNames.ReadFileName(OutFN, "DK OUT OUT"); TTIO.Read(ch); R i,x: CARDINAL; a: ARRAY [0..6] OF CARDINAL; BEGIN i := 0; x := CARDINAL(w); REPEAT a[i] := x MOD 8; x := x DIV  IF ch = ESC THEN OutOnTTY := TRUE; ok := 0 ELSE Files.Lookup(OutFno, OutFN, ok); IF ok >= 0 THEN 8; INC(i) UNTIL i = 5; IF x = 0 THEN a[i] := 0 ELSE a[i] := 1 END ; INC(i); REPEAT DEC(n); Write(" ") UNTIL  Files.Close(OutFno); ShowString(" overwrite? ", FALSE); TTIO.Read(ch); TTIO.Write(ch); IF CAP(cn <= i; REPEAT DEC(i); Write(CHAR(a[i]+60B)) UNTIL i = 0 END WriteOct; PROCEDURE WriteHex(w: SYSTEM.WORD; n: CARDINh) = "Y" THEN ok := 0 ELSE ok := -1 END ELSE ok := 0 END ; IF ok >= 0 THEN Files.Create(OuAL); PROCEDURE HexDig(d: CARDINAL); BEGIN d := d MOD 16; IF d < 10 THEN d := d+60B ELSE d := d+67B END ; tFno, OutFN, ok); IF ok >= 0 THEN Streams.Connect(out, OutFno, FALSE); OutOnTTY := FALSE ELSE Write(CHAR(d)) END HexDig; BEGIN REPEAT DEC(n); Write(" ") UNTIL n <= 4; HexDig(CARDINAL(w) DIV 1000H); H ShowString(" failed", FALSE) END END END ; TTIO.Write(CR); TTIO.Write(LF) UNTIL ok >= 0 exDig(CARDINAL(w) DIV 100H); HexDig(CARDINAL(w) DIV 10H); HexDig(CARDINAL(w)) END WriteHex; PROCEDURE Writeln; 2  END ; nextChar := ch; EXIT ELSIF ch = 0C THEN IsNum := FALSE; nextChar := 0C; EXIT END  Files.Close(OutFno); ShowString(" overwrite? ", FALSE); TTIO.Read(ch); TTIO.Write(ch); IF CAP(c END END ReadInt; PROCEDURE CloseIO; BEGIN IF NOT InFromTTY THEN Streams.Disconnect(in, TRUE); InFromTh) = "Y" THEN ok := 0 ELSE ok := -1 END ELSE ok := 0 END ; IF ok >= 0 THEN Files.Create(OuTY := TRUE END ; IF NOT OutOnTTY THEN Streams.EndWrite(out); Streams.Disconnect(out, TRUE); OutOnTTY := tFno, OutFN, ok); IF ok >= 0 THEN Streams.Connect(out, OutFno, FALSE); OutOnTTY := FALSE ELSETRUE END END CloseIO; BEGIN InFromTTY := TRUE; OutOnTTY := TRUE; END InOut.  ShowString(" failed", FALSE) END END END ; TTIO.Write(CR); TTIO.Write(LF) UNTIL ok >= 0 HILE (i < StrLeng) & (s[i] # 0C) DO Write(s[i]); INC(i) END END WriteString; PROCEDURE ShowString(s: String; cr: BOOLEAN); VAR i: CARDINAL; BEGIN i := 0; WHILE (i < StrLeng) & (s[i] # 0C) DO TTIO.Write(s[i]); INC(i) IMPLEMENTATION MODULE InOut; (*$T- N.Wirth 27.2.80*) IMPORT SYSTEM, TTIO, Files, FileNames, Streams; CONST CR = 15C; L END ; IF cr THEN TTIO.Write(CR); TTIO.Write(LF) END END ShowString; PROCEDURE Read(VAR ch: CHAR)F = 12C; ESC = 33C; InFno = 1; OutFno = 2; VAR InFromTTY, OutOnTTY: BOOLEAN; in, out: Streams.STREAM; In; BEGIN IF InFromTTY THEN TTIO.Read(ch) ELSE Streams.ReadChar(in, ch) END END Read; PROCEDURE ReadInFN, OutFN: Files.FileName; PROCEDURE OpenIO; VAR ok: INTEGER; ch: CHAR; BEGIN REPEAT ShowString("input = ", FAt(VAR x: INTEGER; VAR nextChar: CHAR; VAR IsNum: BOOLEAN); VAR ch: CHAR; neg: BOOLEAN; x0: INTEGER; wString("input = ", FAwString("input = ", FA BEGIN LOOP Read(ch); IF ch > " " THEN IF ch = "-" THEN neg := TRUE; Read(ch) ELSIF ch = "+" THE := 0 ELSE Files.Lookup(InFno, InFN, ok); IF ok >= 0 THEN Streams.Connect(in, InFno, FALSE); InFromTTN neg := FALSE; Read(ch) ELSE neg := FALSE END ; IF (ch >= "0") & (ch <= "9") THEN x0 :=Y := FALSE ELSE ShowString(" not found", FALSE) END END ; TTIO.Write(CR); TTIO.Write(LF); U INTEGER(ch) - 60B; Read(ch); WHILE (ch >= "0") & (ch <= "9") DO x0 := 10*x0 + (INTEGER(ch) - 60B); ReadNTIL ok >= 0; REPEAT ShowString("output = ", FALSE); FileNames.ReadFileName(OutFN, "DK OUT OUT"); TTIO.Read(ch); (ch) END ; IF neg THEN x := -x0 ELSE x := x0 END ; IsNum := TRUE ELSE IsNum := FALSE  IF ch = ESC THEN OutOnTTY := TRUE; ok := 0 ELSE Files.Lookup(OutFno, OutFN, ok); IF ok >= 0 THEN 3 REPEAT DEC(i); Write(CHAR(a[i]+60B)) UNTIL i = 0 END WriteCard; PROCEDURE WriteOct(w: SYSTEM.WORD; n: CARDINAL); VA BEGIN LOOP Read(ch); IF ch > " " THEN IF ch = "-" THEN neg := TRUE; Read(ch) ELSIF ch = "+" THER i,x: CARDINAL; a: ARRAY [0..6] OF CARDINAL; BEGIN i := 0; x := CARDINAL(w); REPEAT a[i] := x MOD 8; x := x DIV N neg := FALSE; Read(ch) ELSE neg := FALSE END ; IF (ch >= "0") & (ch <= "9") THEN x0 :=8; INC(i) UNTIL i = 5; IF x = 0 THEN a[i] := 0 ELSE a[i] := 1 END ; INC(i); REPEAT DEC(n); Write(" ") UNTIL  INTEGER(ch) - 60B; Read(ch); WHILE (ch >= "0") & (ch <= "9") DO x0 := 10*x0 + (INTEGER(ch) - 60B); Readn <= i; REPEAT DEC(i); Write(CHAR(a[i]+60B)) UNTIL i = 0 END WriteOct; PROCEDURE WriteHex(w: SYSTEM.WORD; n: CARDIN(ch) END ; IF neg THEN x := -x0 ELSE x := x0 END ; IsNum := TRUE ELSE IsNum := FALSE AL); PROCEDURE HexDig(d: CARDINAL); BEGIN d := d MOD 16; IF d < 10 THEN d := d+60B ELSE d := d+67B END ;  END ; nextChar := ch; EXIT ELSIF ch = 0C THEN IsNum := FALSE; nextChar := 0C; EXIT END  Write(CHAR(d)) END HexDig; BEGIN REPEAT DEC(n); Write(" ") UNTIL n <= 4; HexDig(CARDINAL(w) DIV 1000H); H END END ReadInt; PROCEDURE CloseIO; BEGIN IF NOT InFromTTY THEN Streams.Disconnect(in, TRUE); InFromTexDig(CARDINAL(w) DIV 100H); HexDig(CARDINAL(w) DIV 10H); HexDig(CARDINAL(w)) END WriteHex; PROCEDURE Writeln; TY := TRUE END ; IF NOT OutOnTTY THEN Streams.EndWrite(out); Streams.Disconnect(out, TRUE); OutOnTTY :=  END OpenIO; PROCEDURE Write(ch: CHAR); BEGIN IF OutOnTTY THEN TTIO.Write(ch) ELSE Streams.WriteChar(out,  BEGIN Write(CR); Write(LF) END Writeln; PROCEDURE WriteString(s: String); VAR i: CARDINAL; BEGIN i := 0; Wch) END END Write; PROCEDURE WriteInt(x: INTEGER; n: CARDINAL); VAR i, x0: CARDINAL; a: ARRAY [0..6] OFHILE (i < StrLeng) & (s[i] # 0C) DO Write(s[i]); INC(i) END END WriteString; PROCEDURE ShowString(s: String; CHAR; BEGIN i := 0; x0 := ABS(x); REPEAT a[i] := CHAR(x0 MOD 10 + 60B); x0 := x0 DIV 10; INC(i) UNTIL x0 = 0;  cr: BOOLEAN); VAR i: CARDINAL; BEGIN i := 0; WHILE (i < StrLeng) & (s[i] # 0C) DO TTIO.Write(s[i]); INC(i)  IF x < 0 THEN a[i] := "-"; INC(i) END ; REPEAT DEC(n); Write(" ") UNTIL n <= i; REPEAT DEC(i); Write(a[i]) UNTIL i =  END ; IF cr THEN TTIO.Write(CR); TTIO.Write(LF) END END ShowString; PROCEDURE Read(VAR ch: CHAR)0 END WriteInt; PROCEDURE WriteCard(x, n: CARDINAL); VAR i: CARDINAL; a: ARRAY [0..6] OF CARDINAL; BEGIN ; BEGIN IF InFromTTY THEN TTIO.Read(ch) ELSE Streams.ReadChar(in, ch) END END Read; PROCEDURE ReadIni := 0; REPEAT a[i] := x MOD 10; x := x DIV 10; INC(i) UNTIL x = 0; REPEAT DEC(n); Write(" ") UNTIL n <= i; t(VAR x: INTEGER; VAR nextChar: CHAR; VAR IsNum: BOOLEAN); VAR ch: CHAR; neg: BOOLEAN; x0: INTEGER; 4 TRUE END END CloseIO; BEGIN InFromTTY := TRUE; OutOnTTY := TRUE; END InOut. 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L