home *** CD-ROM | disk | FTP | other *** search
- PROGRAM PasInter;
-
- USES Crt;
-
- LABEL 1,2;
-
- CONST
- MaxBound = 500;
- MaxLong = 500; (* Org. 1000 *)
- MaxReal = 500; (* """"""""" *)
- MaxSet = 200;
- MaxFiles = 4;
- MaxTextFiles = -1;
- CodeMax = 2666; (* GROESSE DES CODEARRAYS *)
- PCMax = 2300;
- MaxStk = 1500; (* MAXIMALE GROESSE VON STACK UND HEAP *)
- MaxStr = 2000; (* GROESSE DES STOREARRAYS *)
- MaxString = 2000;
- BeginCode = 3;
- InputAdr = 5;
- OutputAdr = 7;
- MaxPCode = 74;
-
- TYPE
- Long_Integer = LongInt; (* fuer Turbo Pascal 4.0 *)
- ALFA = PACKED ARRAY[1..10] OF CHAR; (* Fuer Turbo Pascal 4.0 *)
- Bounds = RECORD lB,uB: INTEGER END;
- Alpha = PACKED ARRAY[1..8] OF CHAR;
-
- KEl = ^KElem;
- KElem = RECORD
- DBGPos: INTEGER;
- Next : KEl;
- END;
-
- SetRange = 0..127;
- Sets = SET OF SetRange;
- CharRange= 0..127;
- DataType = (UnDef,Int,Reel,IsBool,SetT,Adr,Mark,IsChar,Long);
- Address = -1..MaxStr;
- Beta = PACKED ARRAY[1..25] OF CHAR;
- CodeRec = RECORD OP1,P1,Q1: INTEGER END;
- CodeArray= ARRAY[0..CodeMax] OF CodeRec;
- StoreRec = PACKED RECORD CASE DataType OF
- Int : (VI:INTEGER);
- Reel : (VR:REAL);
- IsBool: (VB:BOOLEAN);
- SetT : (VS:Sets);
- IsChar: (VC:CHAR);
- Adr : (VA:INTEGER);
- Long : (VL:Long_Integer);
- Mark : (VM:INTEGER);
- END;
- FileRec = FILE OF StoreRec;
- FileStore= ARRAY[1..MaxFiles] OF FileRec;
- FileRange= 1..4;
- TextFileRange= -4..-1;
-
- VAR
- Code: CodeArray;
- PC : 0..PCMax;
- OP,
- P,Q : INTEGER;
- HelpRec: CodeRec;
-
- Files : FileStore;
- TextFiles : ARRAY[-4..-1] OF TEXT;
- IsTextOpen,IsTextEoF,IsTextEoLn: ARRAY[-4..-1] OF BOOLEAN;
- IsOpen,IsEoF,IsEoLn : ARRAY[1..MaxFiles] OF BOOLEAN;
- FreeFiles : PACKED ARRAY[FileRange] OF BOOLEAN;
- FreeTextFiles : PACKED ARRAY[TextFileRange] OF BOOLEAN;
-
- Store : ARRAY[0..MaxStr] OF StoreRec;
- MP,SP, EP,NP : INTEGER;
- InterPreting : BOOLEAN;
- PCode : TEXT;
-
- PCo : ARRAY[CharRange] OF ALFA;
- MakeOp : ARRAY[CharRange] OF INTEGER;
- SPTable: ARRAY[0..29] OF ALFA;
-
- AD,AD1,Handle: INTEGER;
- B : BOOLEAN;
- i,j,i1,i2 : INTEGER;
- c : CHAR;
- Keller : KEl;
- DebugTable : ARRAY[1..100] OF Alpha;
- DebugPos : INTEGER; (* POS IN DEBTABLE *)
-
- Bound : Bounds;
- BoundPos : INTEGER;
- BoundTable: ARRAY[1..MaxBound] OF Bounds;
-
- LongTable : ARRAY[1..MaxLong] OF Long_Integer;
- LongPos : INTEGER;
-
- RealTable : ARRAY[1..MaxReal] OF REAL;
- RealPos : INTEGER;
-
- SetTable : ARRAY[1..MaxSet] OF Sets;
- SetPos : INTEGER;
-
- StringPos : INTEGER;
-
-
- PROCEDURE Push (VAR k: KEl; Pos: INTEGER);
-
- VAR k1: KEl;
-
- BEGIN
- New(k1);
- WITH k1^ DO BEGIN
- DBGPos := Pos; Next := k
- END;
- k := k1;
- END;
-
-
- PROCEDURE Pop (VAR k: KEl);
-
- VAR k1: KEl;
-
- BEGIN
- k1 := k; k := k^.Next; Dispose(k1);
- END;
-
-
- PROCEDURE WriteKeller (k: KEl);
-
- BEGIN
- IF k <> NIL THEN BEGIN
- WriteLn; WriteLn;
- WriteLn('Laufzeit-Fehler in ',DebugTable[k^.DBGPos]); k := k^.Next;
- WHILE k <> NIL DO BEGIN
- WriteLn(' Aufgerufen von ',DebugTable[k^.DBGPos]); k := k^.Next
- END;
- END;
- END;
-
-
- PROCEDURE Load;
-
- CONST
- MaxLabel = 1850;
-
- TYPE
- LabKind = (IsEnt,IsDef);
- LabRange= 0..MaxLabel;
- LabDat = RECORD
- Val: INTEGER;
- St : LabKind;
- END;
-
- VAR
- MCP,i : INTEGER;
- Word : ARRAY[1..10] OF CHAR;
- ch : CHAR;
- LabelTab : ARRAY[LabRange] OF LabDat;
- LabelValue: INTEGER;
-
-
- PROCEDURE Init;
-
- VAR i: INTEGER;
-
- BEGIN
- PCo[ 0] := 'lod '; PCo[ 1] := 'ldo ';
- PCo[ 2] := 'str '; PCo[ 3] := 'sro ';
- PCo[ 4] := 'lda '; PCo[ 5] := 'lao ';
- PCo[ 6] := 'sto '; PCo[ 7] := 'ldc ';
- PCo[ 8] := '... '; PCo[ 9] := 'ind ';
- PCo[10] := 'inc '; PCo[11] := 'mst ';
- PCo[12] := 'cup '; PCo[13] := 'ent ';
- PCo[14] := 'ret '; PCo[15] := 'csp ';
- PCo[16] := 'ixa '; PCo[17] := 'equ ';
- PCo[18] := 'neq '; PCo[19] := 'geq ';
- PCo[20] := 'grt '; PCo[21] := 'leq ';
- PCo[22] := 'les '; PCo[23] := 'ujp ';
- PCo[24] := 'fjp '; PCo[25] := 'xjp ';
- PCo[26] := 'chk '; PCo[27] := 'eof ';
- PCo[28] := 'adi '; PCo[29] := 'adr ';
- PCo[30] := 'sbi '; PCo[31] := 'sbr ';
- PCo[32] := 'sgs '; PCo[33] := 'flt ';
- PCo[34] := 'flo '; PCo[35] := 'trc ';
- PCo[36] := 'ngi '; PCo[37] := 'ngr ';
- PCo[38] := 'sqi '; PCo[39] := 'sqr ';
- PCo[40] := 'abi '; PCo[41] := 'abr ';
- PCo[42] := 'not '; PCo[43] := 'and ';
- PCo[44] := 'ior '; PCo[45] := 'dif ';
- PCo[46] := 'int '; PCo[47] := 'uni ';
- PCo[48] := 'inn '; PCo[49] := 'mod ';
- PCo[50] := 'odd '; PCo[51] := 'mpi ';
- PCo[52] := 'mpr '; PCo[53] := 'dvi ';
- PCo[54] := 'dvr '; PCo[55] := 'mov ';
- PCo[56] := 'lca '; PCo[57] := 'dec ';
- PCo[58] := 'stp '; PCo[59] := 'ord ';
- PCo[60] := 'chr '; PCo[61] := 'ujc ';
- PCo[62] := 'adl '; PCo[63] := 'sbl ';
- PCo[64] := 'dvl '; PCo[65] := 'mdl ';
- PCo[66] := 'ilo '; PCo[67] := 'ilt ';
- PCo[68] := 'mpl '; PCo[69] := 'ngl ';
- PCo[70] := 'lfo '; PCo[71] := 'lft ';
- PCo[72] := 'dbg '; PCo[73] := 'pop ';
- SPTable[ 0] := 'get '; SPTable[ 1] := 'put ';
- SPTable[ 2] := 'rst '; SPTable[ 3] := 'rln ';
- SPTable[ 4] := 'new '; SPTable[ 5] := 'wln ';
- SPTable[ 6] := 'wrs '; SPTable[ 7] := 'eln ';
- SPTable[ 8] := 'wri '; SPTable[ 9] := 'wrr ';
- SPTable[10] := 'wrc '; SPTable[11] := 'rdi ';
- SPTable[12] := 'rdr '; SPTable[13] := 'rdc ';
- SPTable[14] := 'sin '; SPTable[15] := 'cos ';
- SPTable[16] := 'exp '; SPTable[17] := 'log ';
- SPTable[18] := 'sqt '; SPTable[19] := 'atn ';
- SPTable[20] := 'sav '; SPTable[21] := 'rdl ';
- SPTable[22] := 'wrl '; SPTable[23] := 'gmd ';
- SPTable[24] := 'bio '; SPTable[25] := 'xbi ';
- SPTable[26] := 'rwr '; SPTable[27] := 'res ';
- SPTable[28] := 'cls '; SPTable[29] := 'rnd ';
- MakeOp[ 0] := 123; MakeOp[ 1] := 75;
- MakeOp[ 2] := 81; MakeOp[ 3] := 87;
- MakeOp[ 6] := 93; MakeOp[ 9] := 99;
- MakeOp[10] := 105; MakeOp[26] := 111;
- MakeOp[57] := 117; MakeOp[59] := 129;
- PC := BeginCode;
- StringPos := MaxStk+1;
- FOR i := 1 TO 10 DO Word[i] := ' ';
- FOR i := 0 TO MaxLabel DO
- WITH LabelTab[i] DO BEGIN Val := -1; St := IsEnt END;
- END;
-
-
- PROCEDURE Error1 (No: INTEGER);
-
- VAR c: CHAR;
-
- BEGIN
- WriteLn; Write('*** Fehler: ');
- CASE No OF
- 1: WriteLn('doppelte Marke');
- 2: WriteLn('Ueberlauf der Real-Tabelle');
- 3: WriteLn('illegales Zeichen');
- 4: WriteLn('Ueberlauf der Set-Tabelle');
- 5: WriteLn('Ueberlauf der Long-Tabelle');
- 6: WriteLn('illegaler P-Code');
- 7: WriteLn('Ueberlauf der Indexgrenzen-Tabelle');
- 8: WriteLn('Ueberlauf der String-Tabelle');
- END;
- WriteLn; WriteLn('>> Abbruch <<'); WriteLn('Taste druecken...');
- REPEAT UNTIL KeyPressed; Halt;
- END;
-
-
- PROCEDURE Update (x: LabRange);
-
- VAR
- IsActual,Succ: -1..PCMax;
- EndList : BOOLEAN;
-
- BEGIN
- IF LabelTab[x].St = IsDef THEN Error1(1)
- ELSE BEGIN
- IF LabelTab[x].Val <> -1 THEN BEGIN
- IsActual := LabelTab[x].Val; EndList := FALSE;
- WHILE NOT EndList DO
- WITH Code[IsActual] DO BEGIN
- Succ := Q1; Q1 := LabelValue;
- IF Succ=-1 THEN EndList := TRUE
- ELSE IsActual := Succ
- END;
- END;
- LabelTab[x].St := IsDef;
- LabelTab[x].Val := LabelValue;
- END;
- END;
-
-
- PROCEDURE Assemble; FORWARD;
-
-
- PROCEDURE Generate;
-
- VAR
- x : INTEGER;
- Weiter: BOOLEAN;
-
- BEGIN
- Weiter := TRUE;
- WHILE Weiter DO BEGIN
- Read(PCode,ch);
- CASE ch OF
- 'i' : ReadLn(PCode);
- 'l' : BEGIN
- Read(PCode,x);
- IF NOT Eoln(PCode) THEN Read(PCode,ch);
- IF ch = '=' THEN Read(PCode,LabelValue)
- ELSE LabelValue := PC;
- Update(x); ReadLn(PCode);
- END;
- 'q' : BEGIN Weiter := FALSE; ReadLn(PCode); END;
- ' ' : BEGIN Read(PCode,ch); Assemble END
- END;
- END
- END;
-
-
- PROCEDURE Assemble;
-
- LABEL 1;
-
- VAR
- Name : ALFA;
- B,Found : BOOLEAN;
- r : REAL;
- s : Sets;
- LongKonst: Long_Integer;
- c1 : CHAR;
- i,j,s1,
- lB,uB : INTEGER;
- ProcName : Alpha;
-
-
- FUNCTION DBIndex (VAR Name: Alpha): INTEGER;
-
- VAR Found: BOOLEAN; i,Erg: INTEGER;
-
- BEGIN
- Found := FALSE; i := 1;
- WHILE NOT Found AND (i <= DebugPos) DO BEGIN
- Found := DebugTable[i] = Name;
- i := i+1
- END;
- IF NOT Found THEN BEGIN
- DebugPos := DebugPos+1;
- DebugTable[DebugPos] := Name;
- Erg := DebugPos;
- END
- ELSE Erg := i-1;
- DBIndex := Erg
- END;
-
-
- PROCEDURE FindQ (x: LabRange);
-
- BEGIN
- CASE LabelTab[x].St OF
- IsEnt: BEGIN
- Q := LabelTab[x].Val;
- LabelTab[x].Val := PC;
- END;
- IsDef: Q := LabelTab[x].Val;
- END;
- END;
-
-
- PROCEDURE FindLabel;
-
- VAR x: LabRange;
-
- BEGIN
- WHILE (ch <> 'l') AND NOT Eoln(PCode) DO Read(PCode,ch);
- Read(PCode,x); FindQ(x)
- END;
-
-
- PROCEDURE GetName;
-
- VAR i : INTEGER;
-
- BEGIN
- Word[1] := ch;
- Read(PCode,Word[2],Word[3]);
- IF NOT Eoln(PCode) THEN Read(PCode,ch);
- (*
- Pack(Word,1,Name);
- *)
- Name := ' ';
- FOR i := 1 TO 10 DO Name[i] := Word[i];
- END;
-
-
- PROCEDURE GetType;
-
- VAR i: INTEGER;
-
- BEGIN
- IF ch <> 'i' THEN BEGIN
- CASE ch OF
- 'a' : i := 0;
- 'r' : i := 1;
- 's' : i := 2;
- 'b' : i := 3;
- 'c' : i := 4;
- 'l' : i := 5;
- END;
- OP := MakeOp[OP]+i;
- END
- END;
-
-
- PROCEDURE LoadConst;
-
- BEGIN
- CASE ch OF
- 'i' : BEGIN P := 1; Read(PCode,Q); END;
- 'r' : BEGIN
- OP := 8; P := 2;
- Read(PCode,r);
- IF RealPos < MaxReal THEN RealPos := RealPos+1
- ELSE Error1(2);
- RealTable[RealPos] := r;
- Q := RealPos;
- END;
- 'n' : BEGIN P := 0; Q := 0 END;
- 'b' : BEGIN P := 3; Read(PCode,Q) END;
- 'c' : BEGIN
- P := 6;
- REPEAT Read(PCode,ch); UNTIL ch <> ' ';
- IF ch <> '''' THEN Error1(3);
- Read(PCode,ch); Q := Ord(ch);
- Read(PCode,ch);
- IF ch <> '''' THEN Error1(3);
- END;
- '(' : BEGIN
- OP := 8; P := 4;
- s := []; Read(PCode,ch);
- WHILE ch <> ')' DO BEGIN
- Read(PCode,s1,ch,ch); s := s+[s1];
- END;
- IF SetPos < MaxSet THEN SetPos := SetPos+1
- ELSE Error1(4);
- SetTable[SetPos] := s;
- Q := SetPos;
- END;
- 'l' : BEGIN
- OP := 8; P := 7;
- Read(PCode,LongKonst);
- IF LongPos<MaxLong THEN LongPos := LongPos+1
- ELSE Error1(5);
- LongTable[LongPos] := LongKonst;
- Q := LongPos;
- END;
- END (* CASE *)
- END;
-
-
- BEGIN (* Assemble *)
- ProcName := ' '; P := 0; Q := 0; OP := 0;
- GetName;
- PCo[MaxPCode] := Name;
- WHILE PCo[OP] <> Name DO OP := OP+1;
- IF OP = MaxPCode THEN Error1(6);
- CASE OP OF
- 17,18,19,20,21,22:
- BEGIN
- CASE ch OF
- 'a' : ;
- 'i' : P := 1;
- 'r' : P := 2;
- 'b' : P := 3;
- 's' : P := 4;
- 'c' : P := 6;
- 'l' : P := 7;
- 'm' : BEGIN P := 5; Read(PCode,Q); END
- END
- END;
- 0,2:
- BEGIN GetType; Read(PCode,P,Q); END;
- 4:
- Read(PCode,P,Q);
- 12:
- BEGIN Read(PCode,P); FindLabel END;
- 11:
- Read(PCode,P);
- 14:
- CASE ch OF
- 'p' : P := 0;
- 'i' : P := 1;
- 'r' : P := 2;
- 'c' : P := 3;
- 'b' : P := 4;
- 'a' : P := 5;
- 'l' : P := 6;
- END;
- 5,16,55:
- Read(PCode,Q);
- 1,3,9,10,57:
- BEGIN GetType; Read(PCode,Q); END;
- 23,24,25:
- FindLabel;
- 13:
- BEGIN Read(PCode,P); FindLabel END;
- 15:
- BEGIN
- FOR j := 1 TO 9 DO Read(PCode,ch);
- GetName;
- WHILE Name <> SPTable[Q] DO Q := Q+1;
- END;
- 7:
- LoadConst;
- 26:
- BEGIN
- GetType;
- Read(PCode,lB,uB);
- IF OP = 111 THEN Q := lB
- ELSE BEGIN
- { SUCHE, OB (LB,UB) SCHON IN TABELLE ... }
- Found := FALSE; Bound.uB := uB; Bound.lB := lB; j := 1;
- WHILE NOT Found AND (j <= BoundPos) DO BEGIN
- Found := (BoundTable[j].uB = Bound.uB) AND
- (BoundTable[j].lB = Bound.lB);
- j := j+1
- END;
- IF Found THEN Q := j-1
- ELSE BEGIN
- IF BoundPos < MaxBound THEN BoundPos := BoundPos+1
- ELSE Error1(7);
- BoundTable[BoundPos] := Bound;
- Q := BoundPos
- END;
- END;
- END;
- 56:
- BEGIN
- WHILE ch <> '''' DO Read(PCode,ch);
- Read(PCode,ch);Q := StringPos;
- WHILE ch <> '''' DO BEGIN
- IF StringPos > MaxString THEN Error1(8);
- Store[StringPos].VC := ch;
- Read(PCode,ch);
- StringPos := StringPos+1
- END;
- END;
- 6,59:
- GetType;
- 72: (* DBG *)
- BEGIN
- WHILE ch <> '''' DO Read(PCode,ch);
- Read(PCode,ch);
- i := 1;
- WHILE ch <> '''' DO BEGIN
- ProcName[i] := ch; i := i+1;
- Read(PCode,ch);
- END;
- P := DBIndex(ProcName);
- END;
- END; (* CASE *)
- WITH Code[PC] DO BEGIN
- OP1 := OP; P1 := P; Q1 := Q;
- END;
- PC := PC+1;
- 1:
- ReadLn(PCode);
- END;
-
-
- BEGIN (* Load *)
- Init;
- Generate;
- PC := 0;
- Generate;
- END;
-
-
- PROCEDURE PostMortemDump;
-
- VAR s: INTEGER; i: INTEGER; c: CHAR;
-
-
- PROCEDURE PrintStoreEntry;
-
- BEGIN
- Write(s:6);
- IF ABS(Store[s].VI) < MaxInt THEN Write((Store[s].VI):8)
- ELSE Write(' zu gross');
- s := s-1;
- i := i+1;
- IF i = 4 THEN BEGIN WriteLn; i := 0 END;
- END;
-
-
- BEGIN
- WriteLn(' pc =',PC-1:5,' op =',OP:3,' sp =',SP:5,' mp =',MP:5,
- ' np =',NP:5);
- WriteLn('-------------------------------------------------');
- s := SP; i := 0;
- WHILE s >= 0 DO PrintStoreEntry;
- s := MaxStk;
- WHILE s >= NP DO PrintStoreEntry;
- END;
-
-
- PROCEDURE ErrorI (No: INTEGER);
-
- BEGIN
- WriteLn; Write('*** Fehler: ');
- CASE No OF
- 1: WriteLn('Datei nicht geoeffnet');
- 2: WriteLn('Versuch, nach dem Dateiende zu lesen');
- 3: WriteLn('ReadLn bei Ausgabe-Datei');
- 4: WriteLn('Speicher-Überlauf');
- 5: WriteLn('WriteLn bei Eingabe-Datei');
- 6: WriteLn('Write bei Eingabe-Datei');
- 7: WriteLn('Read bei Ausgabe-Datei');
- 8: WriteLn('zuviel offene Dateien');
- 9: WriteLn('zuviel offene Text-Dateien');
- 10: WriteLn('<, <=, >, >= fuer Adresse');
- 11: WriteLn('Mengen-Einschliessung');
- 12: WriteLn('illegaler Zeigerwert');
- 13: WriteLn('Wert nicht darstellbar');
- 14: WriteLn('CASE-Fehler');
- END;
- WriteLn; WriteKeller(Keller);
- WriteLn('Taste druecken...');
- REPEAT UNTIL KeyPressed;
- PostMortemDump;
- WriteLn('Taste druecken...');
- REPEAT UNTIL KeyPressed; Halt;
- END;
-
-
- FUNCTION Basis (NoOfBSt: INTEGER): INTEGER;
-
- VAR AD: INTEGER;
-
- BEGIN
- AD := MP;
- WHILE NoOfBSt>0 DO BEGIN
- AD := Store[AD+1].VM; NoOfBSt := NoOfBSt-1
- END;
- Basis := AD;
- END;
-
-
- PROCEDURE CompareBlock;
-
- BEGIN
- i1 := Store[SP].VA;
- i2 := Store[SP+1].VA;
- i := 0; B := TRUE;
- WHILE B AND (i <> Q) DO
- IF Store[i1+i].VI=Store[i2+i].VI THEN i := i+1
- ELSE B := FALSE
- END;
-
-
- PROCEDURE CallStdProcs;
-
- VAR Line: BOOLEAN; i: INTEGER;
-
-
- PROCEDURE ReadI (VAR f: TEXT);
-
- VAR AD: INTEGER;
-
- BEGIN
- AD := Store[SP-1].VA;
- Read(f,Store[AD].VI);
- (*
- Store[Store[SP].VA].VC := f^;
- *)
- SP := SP-2
- END;
-
-
- PROCEDURE ReadL(VAR f: TEXT);
-
- VAR AD: INTEGER;
-
- BEGIN
- AD := Store[SP-1].VA;
- Read(f,Store[AD].VL);
- (*
- Store[Store[SP].VA].VC := f^;
- *)
- SP := SP-2
- END;
-
-
- PROCEDURE ReadR (VAR f: TEXT);
-
- VAR AD: INTEGER;
-
- BEGIN
- AD := Store[SP-1].VA;
- Read(f,Store[AD].VR);
- (*
- Store[Store[SP].VA].VC := f^;
- *)
- SP := SP-2
- END;
-
-
- PROCEDURE ReadC (VAR f: TEXT);
-
- VAR AD: INTEGER; c: CHAR;
-
- BEGIN
- AD := Store[SP-1].VA;
- Read(f,c);
- Store[AD].VC := c;
- (*
- Store[Store[SP].VA].VC) := f^;
- *)
- SP := SP-2;
- END;
-
-
- PROCEDURE SPGet;
-
- VAR AD: Address; FileHandle,i,Offset: INTEGER;
-
- BEGIN
- AD := Store[SP-1].VA; Offset := Store[SP].VI;
- FileHandle := Store[AD+Offset].VI;
- IF NOT IsOpen[FileHandle] THEN
- ErrorI(1)
- ELSE IF Eof(Files[FileHandle]) THEN IsEoF[FileHandle] := TRUE
- ELSE
- FOR i := 1 TO Offset DO
- IF Eof(Files[FileHandle]) THEN ErrorI(2)
- ELSE BEGIN
- Read(Files[FileHandle],Store[AD+i-1]);
- (* Get(Files[FileHandle]); *)
- END;
- SP := SP-2;
- END;
-
-
- PROCEDURE SPPut;
-
- VAR AD: Address; FileHandle,i,Offset: INTEGER;
-
- BEGIN
- AD := Store[SP-1].VA; Offset := Store[SP].VI;
- FileHandle := Store[AD+Offset].VI;
- IF NOT IsOpen[FileHandle] THEN ErrorI(1);
- FOR i := 1 TO Offset DO BEGIN
- Write(Files[FileHandle],Store[AD+i-1]);
- (* PUT(FILES[FILEHANDLE]); *)
- END;
- SP := SP-2
- END;
-
-
- PROCEDURE WriteStr (VAR f: TEXT);
-
- VAR i,j,k: INTEGER; AD: INTEGER;
-
- BEGIN
- AD := Store[SP-3].VA;
- k := Store[SP-2].VI;
- j := Store[SP-1].VI;
- IF k > j THEN FOR i := 1 TO k-j DO Write(f,' ')
- ELSE j := k;
- FOR i := 0 TO j-1 DO Write(f,Store[AD+i].VC);
- SP := SP-4
- END;
-
-
- PROCEDURE PRST;
-
- BEGIN
- NP := Store[SP].VA; SP := SP-1
- END;
-
-
- PROCEDURE PRLn; (* Zeilenende lesen *)
-
- VAR AD: Address; Handle: INTEGER;
-
- BEGIN
- AD := Store[SP].VA; Handle := Store[AD+1].VI;
- CASE Handle OF
- -3 : ErrorI(3);
- -4 : BEGIN
- ReadLn(Input);
- (*
- Store[InputAdr].VC := Input^;
- *)
- END;
- -2,
- -1 : BEGIN
- ReadLn(TextFiles[Handle]);
- (*
- Store[AD].VC := TextFiles[Handle]^;
- *)
- END;
- END;
- SP := SP-1;
- END;
-
-
- PROCEDURE PNew;
-
- VAR AD: Address;
-
- BEGIN
- AD := NP-Store[SP].VI;
- IF AD <= EP THEN ErrorI(4);
- NP := AD; AD := Store[SP-1].VA;
- Store[AD].VA := NP;
- SP := SP-2;
- END;
-
-
- PROCEDURE PWLn; (* Zeilenende schreiben *)
-
- VAR AD: Address; Handle: INTEGER;
-
- BEGIN
- AD := Store[SP].VA;
- Handle := Store[AD+1].VI;
- CASE Handle OF
- -3 : WriteLn(Output);
- -4 : ErrorI(5);
- -2,
- -1 : WriteLn(TextFiles[Handle]);
- END;
- END;
-
-
- PROCEDURE PWrS; (* Zeichenkette schreiben *)
-
- VAR AD: Address; Handle: INTEGER;
-
- BEGIN
- AD := Store[SP].VA;
- Handle := Store[AD+1].VI;
- CASE Handle OF
- -3 : WriteStr(Output);
- -4 : ErrorI(6);
- -2,
- -1 : WriteStr(TextFiles[Handle]);
- END;
- END;
-
-
- PROCEDURE PWrI; (* Integer schreiben *)
-
- VAR AD: Address; Handle: INTEGER;
-
- BEGIN
- AD := Store[SP].VA; Handle := Store[AD+1].VI;
- CASE Handle OF
- -3 : Write(Output,Store[SP-2].VI:Store[SP-1].VI);
- -4 : ErrorI(6);
- -2,
- -1 : Write(TextFiles[Handle],Store[SP-2].VI:Store[SP-1].VI);
- END;
- SP := SP-3;
- END;
-
-
- PROCEDURE PRdI; (* Integer lesen *)
-
- BEGIN
- Handle := Store[Store[SP].VA+1].VI;
- CASE Handle OF
- -4 : ReadI(Input);
- -3 : ErrorI(7);
- -2,
- -1 : ReadI(TextFiles[Handle]);
- END
- END;
-
-
- PROCEDURE PWrR; (* Real schreiben *)
-
- VAR AD: Address; Handle: INTEGER;
-
- BEGIN
- AD := Store[SP].VA; Handle := Store[AD+1].VI;
- CASE Handle OF
- -3 : Write(Output,Store[SP-2].VR:Store[SP-1].VI);
- -4 : ErrorI(6);
- -2,
- -1 : Write(TextFiles[Handle],Store[SP-2].VR:Store[SP-1].VI);
- END;
- SP := SP-3;
- END;
-
-
- PROCEDURE PRdR; (* Real lesen *)
-
- BEGIN
- Handle := Store[Store[SP].VA+1].VI;
- CASE Handle OF
- -4 : ReadR(Input);
- -3 : ErrorI(7);
- -1,
- -2 : ReadR(TextFiles[Handle]);
- END
- END;
-
-
- PROCEDURE PWrC; (* Char schreiben *)
-
- VAR AD: Address; Handle: INTEGER;
-
- BEGIN
- AD := Store[SP].VA; Handle := Store[AD+1].VI;
- CASE Handle OF
- -3 : Write(Output,Store[SP-2].VC:Store[SP-1].VI);
- -4 : ErrorI(6);
- -2,
- -1 : Write(TextFiles[Handle],Store[SP-2].VC:Store[SP-1].VI);
- END;
- SP := SP-3;
- END;
-
-
- PROCEDURE PRdC; (* Char lesen *)
-
- BEGIN
- Handle := Store[Store[SP].VA+1].VI;
- CASE Handle OF
- -4 : ReadC(Input);
- -3 : ErrorI(7);
- -1,
- -2 : ReadC(TextFiles[Handle]);
- END
- END;
-
-
- PROCEDURE PWrL; (* Long-Integer schreiben *)
-
- VAR AD: Address; Handle: INTEGER;
-
- BEGIN
- AD := Store[SP].VA; Handle := Store[AD+1].VI;
- CASE Handle OF
- -3 : Write(Output,Store[SP-2].VL:Store[SP-1].VI);
- -4 : ErrorI(6);
- -2,
- -1 : Write(TextFiles[Handle],Store[SP-2].VL:Store[SP-1].VI);
- END;
- SP := SP-3;
- END;
-
-
- PROCEDURE PRdL; (* Long-Integer lesen *)
-
- VAR Handle: INTEGER;
-
- BEGIN
- Handle := Store[Store[SP].VA+1].VI;
- CASE Handle OF
- -4 : ReadL(Input);
- -3 : ErrorI(7);
- -1,
- -2 : ReadL(TextFiles[Handle]);
- END;
- END;
-
-
- PROCEDURE SPEoLn;
-
- VAR AD: Address; Offset,FileHandle: INTEGER;
-
- BEGIN
- AD := Store[SP-1].VA; Offset := Store[SP].VI;
- FileHandle := Store[AD+Offset].VI;
- SP := SP-1;
- IF FileHandle < 0 THEN BEGIN (* TEXTFILE *)
- IsTextEoLn[FileHandle] := Eoln(TextFiles[FileHandle]);
- Store[SP].VB := IsTextEoLn[FileHandle];
- END
- ELSE BEGIN
- (*
- IsEoLn[FileHandle] := EoLn(Files[FileHandle]);
- Store[SP].VB := IsEoLn[FileHandle];
- *)
- END;
- END;
-
-
- PROCEDURE SPReSetReWrite (CAS: INTEGER);
-
- VAR
- AD: Address; i,Offset,Handle: INTEGER;
- FName: STRING[80];
- IsTextFile: BOOLEAN;
-
-
- FUNCTION GetHandle (Error: INTEGER): INTEGER;
-
- VAR Handle,i: INTEGER; Found: BOOLEAN;
-
- BEGIN
- i := 1;
- Found := FALSE;
- WHILE NOT Found AND (i <= 4) DO BEGIN
- IF IsTextFile THEN Found := FreeTextFiles[-i]
- ELSE Found := FreeFiles[i];
- i := i+1
- END;
- IF NOT Found THEN ErrorI(Error); (* NEVER RETURNS *)
- IF IsTextFile THEN BEGIN
- Handle := -i+1; FreeTextFiles[Handle] := FALSE
- END
- ELSE BEGIN
- Handle := i-1; FreeFiles[Handle] := FALSE;
- END;
- GetHandle := Handle;
- END;
-
-
- BEGIN
- AD := Store[SP-2].VA; (* ADRESSE DES STRINGS *)
- FName := '';
- FOR i := 1 TO Store[SP-1].VI DO
- FName := Concat(Fname,Store[AD+i-1].VC);
- AD := Store[SP-4].VA; Offset := Store[SP-3].VI;
- IsTextFile := Store[SP].VI=1;
- CASE IsTextFile OF
- FALSE : BEGIN
- Handle := GetHandle(8);
- IsEoLn[Handle] := FALSE; IsEoF[Handle] := FALSE;
- IF CAS=1 THEN BEGIN
- Assign(Files[Handle],FName);
- ReWrite(Files[Handle])
- END
- ELSE BEGIN
- Assign(Files[Handle],FName);
- ReSet(Files[Handle]);
- IF Eof(Files[Handle]) THEN IsEoF[Handle] := TRUE
- ELSE
- FOR i := 1 TO Offset DO
- IF Eof(Files[Handle]) THEN
- ErrorI(2)
- ELSE BEGIN
- Read(Files[Handle],Store[AD+i-1]);
- (* GET(FILES[HANDLE]); *)
- END
- END;
- IsOpen[Handle] := TRUE;
- END;
- TRUE : BEGIN
- Handle := GetHandle(9);
- IsTextEoLn[Handle] := FALSE;
- IsTextEoF[Handle] := FALSE;
- IF CAS=1 THEN BEGIN
- Assign(TextFiles[Handle],FName);
- ReWrite(TextFiles[Handle])
- END
- ELSE BEGIN
- Assign(TextFiles[Handle],FName);
- ReSet(TextFiles[Handle]);
- IF Eof(TextFiles[Handle]) THEN IsTextEoF[Handle] := TRUE
- ELSE ; (* NIX. FILEPUFFER LEER *)
- END;
- IsTextOpen[Handle] := TRUE;
- END;
- END;
- Store[AD+Offset].VI := Handle; (* FILEHANDLE ZUWEISEN *)
- SP := SP-5;
- END;
-
-
- PROCEDURE SPClose;
-
- VAR AD: Address; FileHandle,Offset: INTEGER;
-
- BEGIN
- AD := Store[SP-1].VA; Offset := Store[SP].VI;
- FileHandle := Store[AD+Offset].VI;
- IF FileHandle < 0 THEN BEGIN (* TEXTFILE *)
- Close(TextFiles[FileHandle]);
- IsTextOpen[FileHandle] := FALSE;
- FreeTextFiles[FileHandle] := TRUE;
- END
- ELSE BEGIN
- Close(Files[FileHandle]);
- IsOpen[FileHandle] := FALSE;
- FreeFiles[FileHandle] := TRUE;
- END;
- (* UEBERNEHME INDEX FILEHANDLE IN FREILISTE . .... *)
- SP := SP-2
- END;
-
-
- PROCEDURE SPRound;
-
- BEGIN
- Store[SP].VI := Round(Store[SP].VR)
- END;
-
-
- (* IN STORE[SP] STEHT DIE FUNKTIONSNUMMER DES GEMDOS-AUFRUFS.
- ES FOLGT EINE AUFLISTUNG ALLER GEMDOS-FUNKTIONEN: *)
- (* Fuer andere Betriebssysteme und Compiler entsprechen anpassen! *)
-
- PROCEDURE GMD;
- (*
- VAR
- sk : INTEGER;
- C : CHAR;
- I,L: INTEGER;
- SR : STOREREC;
-
- PROCEDURE Term; GEMDOS(0);
- FUNCTION ConIn: CHAR; GEMDOS(1);
- PROCEDURE ConOut (C: CHAR); GEMDOS(2);
- FUNCTION AuxIn: CHAR; GEMDOS(3);
- PROCEDURE AuxOut (C: CHAR); GEMDOS(4);
- *)
- BEGIN
- WriteLn('GEMDOS(',Store[SP].VI,') nicht implementiert');
- Halt;
- (*
- CASE STORE[SP].VI OF
- 0 : TERM;
- 1 : SR.VC := CONIN;
- 2 : CONOUT(STORE[SP-1].VC);
- 3 : SR.VC := AUXIN;
- 4 : AUXOUT(STORE[SP-1].VC);
- ELSE:
- BEGIN
- WRITELN('GEMDOS(',STORE[SP].VI,') nicht implementiert');
- HALT
- END;
- END;
- CASE STORE[SP].VI OF
- 1,3 : SK := 0;
- 2,4 : SK := 2;
- END;
- SP := SP-SK;
- STORE[SP] := SR;
- *)
- END;
-
-
- BEGIN (* CallStdProcs *)
- CASE Q OF
- 0 : SPGet;
- 1 : SPPut;
- 2 : PRST;
- 3 : PRLn;
- 4 : PNew;
- 5 : PWLn;
- 6 : PWrS;
- 7 : SPEoLn;
- 8 : PWrI;
- 9 : PWrR;
- 10: PWrC;
- 11: PRdI;
- 12: PRdR;
- 13: PRdC;
- 14: Store[SP].VR := Sin(Store[SP].VR);
- 15: Store[SP].VR := Cos(Store[SP].VR);
- 16: Store[SP].VR := Exp(Store[SP].VR);
- 17: Store[SP].VR := Ln (Store[SP].VR);
- 18: Store[SP].VR := Sqrt(Store[SP].VR);
- 19: Store[SP].VR := ArcTan(Store[SP].VR);
- 20: BEGIN
- AD := Store[SP].VA;
- Store[AD].VA := NP;
- SP := SP-1
- END;
- 21: PRdL;
- 22: PWrL;
- 23: GMD;
- (*
- 24: BIO;
- 25: XBI;
- *)
- 26: SPReSetReWrite(1);
- 27: SPReSetReWrite(0);
- 28: SPClose;
- 29: SPRound;
- END
- END;
-
-
- PROCEDURE PEqu;
-
- BEGIN
- SP := SP-1;
- CASE P OF
- 1: Store[SP].VB := Store[SP].VI=Store[SP+1].VI;
- 0: Store[SP].VB := Store[SP].VA=Store[SP+1].VA;
- 6: Store[SP].VB := Store[SP].VC=Store[SP+1].VC;
- 2: Store[SP].VB := Store[SP].VR=Store[SP+1].VR;
- 3: Store[SP].VB := Store[SP].VB=Store[SP+1].VB;
- 4: Store[SP].VB := Store[SP].VS=Store[SP+1].VS;
- 7: Store[SP].VB := Store[SP].VL=Store[SP+1].VL;
- 5: BEGIN
- CompareBlock;
- Store[SP].VB := B;
- END;
- END;
- END;
-
-
- PROCEDURE PNEq;
-
- BEGIN
- SP := SP-1;
- CASE P OF
- 0: Store[SP].VB := Store[SP].VA <> Store[SP+1].VA;
- 1: Store[SP].VB := Store[SP].VI <> Store[SP+1].VI;
- 6: Store[SP].VB := Store[SP].VC <> Store[SP+1].VC;
- 2: Store[SP].VB := Store[SP].VR <> Store[SP+1].VR;
- 3: Store[SP].VB := Store[SP].VB <> Store[SP+1].VB;
- 4: Store[SP].VB := Store[SP].VS <> Store[SP+1].VS;
- 7: Store[SP].VB := Store[SP].VL <> Store[SP+1].VL;
- 5: BEGIN
- CompareBlock;
- Store[SP].VB := NOT B;
- END;
- END;
- END;
-
-
- PROCEDURE PGEq;
-
- BEGIN
- SP := SP-1;
- CASE P OF
- 0: ErrorI(10);
- 1: Store[SP].VB := Store[SP].VI>=Store[SP+1].VI;
- 6: Store[SP].VB := Store[SP].VC>=Store[SP+1].VC;
- 2: Store[SP].VB := Store[SP].VR>=Store[SP+1].VR;
- 3: Store[SP].VB := Store[SP].VB>=Store[SP+1].VB;
- 4: Store[SP].VB := Store[SP].VS>=Store[SP+1].VS;
- 7: Store[SP].VB := Store[SP].VL>=Store[SP+1].VL;
- 5: BEGIN
- CompareBlock;
- Store[SP].VB := B OR (Store[i1+i].VI >= Store[i2+i].VI)
- END
- END
- END;
-
-
- PROCEDURE PGrT;
-
- BEGIN
- SP := SP-1;
- CASE P OF
- 0: ErrorI(10);
- 1: Store[SP].VB := Store[SP].VI>Store[SP+1].VI;
- 6: Store[SP].VB := Store[SP].VC>Store[SP+1].VC;
- 2: Store[SP].VB := Store[SP].VR>Store[SP+1].VR;
- 3: Store[SP].VB := Store[SP].VB>Store[SP+1].VB;
- 7: Store[SP].VB := Store[SP].VL>Store[SP+1].VL;
- 4: ErrorI(11);
- 5: BEGIN
- CompareBlock;
- Store[SP].VB := NOT B AND (Store[i1+i].VI > Store[i2+i].VI)
- END
- END
- END;
-
-
- PROCEDURE PLEq;
-
- BEGIN
- SP := SP-1;
- CASE P OF
- 0: ErrorI(10);
- 1: Store[SP].VB := Store[SP].VI<=Store[SP+1].VI;
- 6: Store[SP].VB := Store[SP].VC<=Store[SP+1].VC;
- 2: Store[SP].VB := Store[SP].VR<=Store[SP+1].VR;
- 3: Store[SP].VB := Store[SP].VB<=Store[SP+1].VB;
- 4: Store[SP].VB := Store[SP].VS<=Store[SP+1].VS;
- 7: Store[SP].VB := Store[SP].VL<=Store[SP+1].VL;
- 5: BEGIN
- CompareBlock;
- Store[SP].VB := B OR (Store[i1+i].VI <= Store[i2+i].VI)
- END;
- END
- END;
-
-
- PROCEDURE PLes;
-
- BEGIN
- SP := SP-1;
- CASE P OF
- 0: ErrorI(10);
- 1: Store[SP].VB := Store[SP].VI<Store[SP+1].VI;
- 6: Store[SP].VB := Store[SP].VC<Store[SP+1].VC;
- 2: Store[SP].VB := Store[SP].VR<Store[SP+1].VR;
- 3: Store[SP].VB := Store[SP].VB<Store[SP+1].VB;
- 7: Store[SP].VB := Store[SP].VL<Store[SP+1].VL;
- 5: BEGIN
- CompareBlock;
- Store[SP].VB := NOT B AND (Store[i1+i].VI < Store[i2+i].VI)
- END;
- END
- END;
-
-
- PROCEDURE PUJp;
-
- BEGIN
- PC := Q;
- END;
-
-
- PROCEDURE PFJp;
-
- BEGIN
- IF NOT Store[SP].VB THEN PC := Q;
- SP := SP-1
- END;
-
-
- PROCEDURE PXJp;
-
- BEGIN
- PC := Store[SP].VI+Q;
- SP := SP-1
- END;
-
-
- PROCEDURE PChkA;
-
- BEGIN
- IF (Store[SP].VA<NP) OR (Store[SP].VA>(MaxStr-Q)) THEN
- ErrorI(12)
- END;
-
-
- PROCEDURE PChk;
-
- BEGIN
- IF (Store[SP].VI<BoundTable[Q].lB) OR
- (Store[SP].VI>BoundTable[Q].uB) THEN
- ErrorI(13)
- END;
-
-
- PROCEDURE PChkB;
-
- BEGIN
- IF (Ord(Store[SP].VB)<Ord(FALSE)) OR
- (Ord(Store[SP].VB)>Ord(TRUE)) THEN
- ErrorI(13);
- END;
-
-
- PROCEDURE PChkC;
-
- BEGIN
- IF (Ord(Store[SP].VC)<BoundTable[Q].lB) OR
- (Ord(Store[SP].VC)>BoundTable[Q].uB) THEN
- ErrorI(13);
- END;
-
-
- PROCEDURE SPEoF;
-
- VAR AD:Address; FileHandle,Offset:INTEGER;
-
- BEGIN
- AD := Store[SP-1].VA; Offset := Store[SP].VI;
- FileHandle := Store[AD+Offset].VI;
- SP := SP-1;
- IF FileHandle < 0 THEN BEGIN (*TEXTFILE*)
- IsTextEoF[FileHandle] := Eof(TextFiles[FileHandle]);
- Store[SP].VB := IsTextEoF[FileHandle]
- END
- ELSE Store[SP].VB := IsEoF[FileHandle];
- END;
-
-
- PROCEDURE PAdI;
-
- BEGIN
- SP := SP-1;
- Store[SP].VI := Store[SP].VI+Store[SP+1].VI
- END;
-
-
- PROCEDURE PAdR;
-
- BEGIN
- SP := SP-1;
- Store[SP].VR := Store[SP].VR+Store[SP+1].VR
- END;
-
-
- PROCEDURE PSbI;
-
- BEGIN
- SP := SP-1;
- Store[SP].VI := Store[SP].VI-Store[SP+1].VI
- END;
-
-
- PROCEDURE PSbR;
-
- BEGIN
- SP := SP-1;
- Store[SP].VR := Store[SP].VR-Store[SP+1].VR
- END;
-
-
- PROCEDURE PAnd;
-
- BEGIN
- SP := SP-1;
- Store[SP].VB := Store[SP].VB AND Store[SP+1].VB
- END;
-
-
- PROCEDURE PIOr;
-
- BEGIN
- SP := SP-1;
- Store[SP].VB := Store[SP].VB OR Store[SP+1].VB
- END;
-
-
- PROCEDURE PDif;
-
- BEGIN
- SP := SP-1;
- Store[SP].VS := Store[SP].VS-Store[SP+1].VS
- END;
-
-
- PROCEDURE PInt;
-
- BEGIN
- SP := SP-1;
- Store[SP].VS := Store[SP].VS*Store[SP+1].VS
- END;
-
-
- PROCEDURE PUni;
-
- BEGIN
- SP := SP-1;
- Store[SP].VS := Store[SP].VS+Store[SP+1].VS;
- END;
-
-
- PROCEDURE PInN;
-
- BEGIN
- SP := SP-1; i := Store[SP].VI;
- Store[SP].VB := i IN Store[SP+1].VS;
- END;
-
-
- PROCEDURE PMod;
-
- BEGIN
- SP := SP-1;
- Store[SP].VI := Store[SP].VI MOD Store[SP+1].VI
- END;
-
-
- PROCEDURE POdd;
-
- BEGIN
- Store[SP].VB := Odd(Store[SP].VI);
- END;
-
-
- PROCEDURE PMpI;
-
- BEGIN
- SP := SP-1;
- Store[SP].VI := Store[SP].VI*Store[SP+1].VI
- END;
-
-
- PROCEDURE PMpR;
-
- BEGIN
- SP := SP-1;
- Store[SP].VR := Store[SP].VR*Store[SP+1].VR;
- END;
-
-
- PROCEDURE PDvI;
-
- BEGIN
- SP := SP-1;
- Store[SP].VI := Store[SP].VI DIV Store[SP+1].VI
- END;
-
-
- PROCEDURE PDvR;
-
- BEGIN
- SP := SP-1;
- Store[SP].VR := Store[SP].VR / Store[SP+1].VR
- END;
-
-
- PROCEDURE PMov;
-
- VAR Quelle, Ziel, i: Address;
-
- BEGIN
- Ziel := Store[SP-1].VA;
- Quelle := Store[SP].VA;
- SP := SP-2;
- FOR i := 0 TO Q-1 DO
- Store[Ziel+i] := Store[Quelle+i];
- END;
-
-
- PROCEDURE PLCA;
-
- BEGIN
- SP := SP+1;
- Store[SP].VA := Q;
- END;
-
-
- PROCEDURE PDec;
-
- BEGIN
- Store[SP].VI := Store[SP].VI-Q;
- END;
-
-
- PROCEDURE PDecC;
-
- VAR i:INTEGER;
-
- BEGIN
- WITH Store[SP] DO FOR i := 1 TO Q DO VC := Pred(VC);
- END;
-
-
- PROCEDURE PIncC;
-
- VAR i:INTEGER;
-
- BEGIN
- WITH Store[SP] DO FOR i := 1 TO Q DO VC := Succ(VC)
- END;
-
-
- PROCEDURE PSTP;
-
- BEGIN
- InterPreting := FALSE;
- END;
-
-
- PROCEDURE POrdI;
-
- BEGIN
- WITH Store[SP] DO VI := Ord(VB);
- END;
-
-
- PROCEDURE POrdC;
-
- BEGIN
- WITH Store[SP] DO VI := Ord(VC)
- END;
-
-
- PROCEDURE PChr;
-
- BEGIN
- WITH Store[SP] DO VC := Chr(VI)
- END;
-
-
- PROCEDURE PUJC;
-
- BEGIN
- ErrorI(14);
- END;
-
-
- PROCEDURE PLOD;
-
- BEGIN
- AD := Basis(P)+Q;
- SP := SP+1;
- Store[SP] := Store[AD]
- END;
-
-
- PROCEDURE PLDO;
-
- BEGIN
- SP := SP+1;
- Store[SP] := Store[Q]
- END;
-
-
- PROCEDURE PSTR;
-
- BEGIN
- Store[Basis(P)+Q] := Store[SP];
- SP := SP-1
- END;
-
-
- PROCEDURE PSRO;
-
- BEGIN
- Store[Q] := Store[SP];
- SP := SP-1;
- END;
-
-
- PROCEDURE PLDA;
-
- BEGIN
- SP := SP+1;
- Store[SP].VA := Basis(P)+Q
- END;
-
-
- PROCEDURE PLAO;
-
- BEGIN
- SP := SP+1;
- Store[SP].VA := Q
- END;
-
-
- PROCEDURE PSTO;
-
- BEGIN
- Store[Store[SP-1].VA] := Store[SP];
- SP := SP-2
- END;
-
-
- PROCEDURE PLDC;
-
- BEGIN
- SP := SP+1;
- CASE P OF
- 1 : Store[SP].VI := Q;
- 6 : Store[SP].VC := Chr(Q);
- 3 : Store[SP].VB := (Q=1);
- ELSE Store[SP].VA := MaxStr;
- END
- END;
-
-
- PROCEDURE PLCI;
-
- BEGIN
- SP := SP+1;
- CASE P OF
- 2 : Store[SP].VR := RealTable[Q];
- 4 : Store[SP].VS := SetTable[Q];
- 7 : Store[SP].VL := LongTable[Q];
- END;
- END;
-
-
- PROCEDURE NextCase (OP: INTEGER);
-
- BEGIN
- CASE OP OF
- 62 : BEGIN SP := SP-1; Store[SP].VL := Store[SP].VL+Store[SP+1].VL END;
- 63 : BEGIN SP := SP-1; Store[SP].VL := Store[SP].VL-Store[SP+1].VL END;
- 64 : BEGIN SP := SP-1; Store[SP].VL := Store[SP].VL DIV Store[SP+1].VL END;
- 65 : BEGIN SP := SP-1; Store[SP].VL := Store[SP].VL MOD Store[SP+1].VL END;
- 68 : BEGIN SP := SP-1; Store[SP].VL := Store[SP].VL*Store[SP+1].VL END;
- 66 : Store[SP-1].VL := Store[SP-1].VI;
- 67 : Store[SP].VL := Store[SP].VI;
- 69 : Store[SP].VL := -Store[SP].VL;
- 70 : Store[SP-1].VR := Store[SP-1].VL;
- 71 : Store[SP].VR := Store[SP].VL;
- 72 : Push(Keller,P);
- 73 : Pop(Keller);
- END
- END;
-
-
- PROCEDURE Init1;
-
- VAR i: INTEGER;
-
- BEGIN
- Keller := NIL; DebugPos := 1;
- DebugTable[1] := 'main ';
- Push(Keller,1);
- FOR i := -2 TO -1 DO IsTextOpen[i] := FALSE;
- FOR i := -4 TO -1 DO IsTextOpen[i] := TRUE; (*INPUT,OUTPUT*)
- Store[8].VI := -3;
- Store[6].VI := -4; (* FILEHANDLE FUER INPUT,OUTPUT *)
- FOR i := 1 TO MaxFiles DO BEGIN
- IsOpen[i] := FALSE; IsEoF[i] := TRUE; IsEoLn[i] := TRUE;
- END;
- FOR i := 1 TO 4 DO FreeFiles[i] := TRUE;
- FOR i := -2 TO -1 DO FreeTextFiles[i] := TRUE;
- FOR i := -4 TO -3 DO FreeTextFiles[i] := FALSE;
- BoundPos := 0; SetPos := 0; LongPos := 0; RealPos := 0;
- END;
-
-
- PROCEDURE ReadFileName;
-
- VAR CodeName: STRING[80];
-
- BEGIN
- WriteLn;
- Write('Dateiname ohne Suffix : '); ReadLn(CodeName);
- CodeName := Concat(CodeName,'.cod');
- Assign(PCode,CodeName);
- ReSet(PCode);
- (* RESET(PCODE,CODENAME);*)
- WriteLn;
- END;
-
-
- BEGIN
- WriteLn;
- WriteLn('PASCOMP - PASCAL International P-CODE INTERPRETER v0.1');
- WriteLn(' (C) 1987 J.Velmans & PASCAL INT.');
- WriteLn;
- ReadFileName;
- Init1;
- WriteLn('lese Programm... ');
- Load;
- WriteLn('interpretiere Programm... ');
- WriteLn(Output);
- PC := 0; SP := -1; MP := 0; NP := MaxStk; EP := 5;
- InterPreting := TRUE;
- 2:
- WHILE InterPreting AND NOT KeyPressed DO BEGIN
- HelpRec := Code[PC];
- WITH HelpRec DO BEGIN
- OP := OP1; P := P1; Q := Q1;
- END;
- PC := PC+1;
- CASE OP OF
- 123,124,125,126,127,128,0: PLOD;
- 75,76,77,78,79,80,1 : PLDO;
- 81,82,83,84,85,86,2 : PSTR;
- 87,88,89,90,91,92,3 : PSRO;
- 4 : PLDA;
- 5 : PLAO;
- 93,94,95,96,97,98,6 : PSTO;
- 7 : PLDC;
- 8 : PLCI;
- 99,100,101,102,103,104,9 : BEGIN
- AD := Store[SP].VA+Q;
- Store[SP] := Store[AD]
- END;
- 105,106,107,108,110,10 : Store[SP].VI := Store[SP].VI+Q;
- 109 : PIncC;
- 11 : BEGIN
- Store[SP+2].VM := Basis(P);
- Store[SP+3].VM := MP;
- Store[SP+4].VM := EP;
- SP := SP+5;
- END;
- 12 : BEGIN
- MP := SP-(P+4);
- Store[MP+4].VM := PC;
- PC := Q
- END;
- 13 : IF P=1 THEN BEGIN
- SP := MP+Q;
- IF SP > NP THEN BEGIN
- WriteLn('Speicher-Ueberlauf: SP=',SP,' NP=',NP,' ',SP>NP);
- ErrorI(4);
- END
- END
- ELSE BEGIN
- EP := SP+Q;
- IF EP > NP THEN ErrorI(4);
- END;
- 14 : BEGIN
- CASE P OF
- 0 : SP := MP-1;
- 1,2,3,4,5,6 : SP := MP
- END;
- PC := Store[MP+4].VM;
- EP := Store[MP+3].VM;
- MP := Store[MP+2].VM;
- END;
- 15 : CallStdProcs;
- 16 : BEGIN
- i := Store[SP].VI;
- SP := SP-1;
- Store[SP].VA := Q*i+Store[SP].VA
- END;
- 17 : PEqu;
- 18 : PNEq;
- 19 : PGEq;
- 20 : PGrT;
- 21 : PLEq;
- 22 : PLes;
- 23 : PUJp;
- 24 : PFJp;
- 25 : PXJp;
- 111: PChkA;
- 112,113,116,26 : PChk;
- 114: PChkB;
- 115: PChkC;
- 27 : SPEoF;
- 28 : PAdI;
- 29 : PAdR;
- 30 : PSbI;
- 31 : PSbR;
- 32 : Store[SP].VS := [Store[SP].VI];
- 33 : Store[SP].VR := Store[SP].VI;
- 34 : Store[SP-1].VR := Store[SP-1].VI;
- 35 : Store[SP].VI := Trunc(Store[SP].VR);
- 36 : Store[SP].VI := -Store[SP].VI;
- 37 : Store[SP].VR := -Store[SP].VR;
- 38 : Store[SP].VI := Sqr(Store[SP].VI);
- 39 : Store[SP].VR := Sqr(Store[SP].VR);
- 40 : Store[SP].VI := ABS(Store[SP].VI);
- 41 : Store[SP].VR := ABS(Store[SP].VR);
- 42 : Store[SP].VB := NOT Store[SP].VB;
- 43 : PAnd;
- 44 : PIOr;
- 45 : PDif;
- 46 : PInt;
- 47 : PUni;
- 48 : PInN;
- 49 : PMod;
- 50 : POdd;
- 51 : PMpI;
- 52 : PMpR;
- 53 : PDvI;
- 54 : PDvR;
- 55 : PMov;
- 56 : PLCA;
- 117,118,119,120,122,57 : PDec;
- 121: PDecC;
- 58 : PSTP;
- 59,129,130,131,134: ;
- 132: POrdI;
- 133: POrdC;
- 60 : PChr;
- 61 : PUJC;
- ELSE NextCase(OP);
- END
- END;
- IF KeyPressed THEN BEGIN
- Read(c);
- IF c = Chr(3) THEN BEGIN (* CTRL-C *)
- WriteLn; WriteLn;
- WriteLn('Abbruch durch Benutzer !');
- END
- ELSE GOTO 2
- END;
- 1:
- WriteLn;
- Write('Taste druecken...');
- REPEAT UNTIL KeyPressed;
- END.