PROGRAM MINISIMULATION (IN,OUT); CONST P=50; D=20; (*CREATED BY MARKUS ISING SEP/25. 1984*) TYPE WORT=ARRAY[1..4] OF CHAR; BEFEHL=RECORD OP:WORT; ADR:INTEGER; END; SPEICHER=RECORD OP:ARRAY[1..P] OF WORT; ADR:ARRAY[1..P] OF INTEGER; END; VAR DS:ARRAY[1..D] OF REAL; PS:SPEICHER; BR:BEFEHL; (*BEFEHLREGISTER*) ANTWORT:CHAR; PROCEDURE PROGEINGABE; VAR I:INTEGER; PROCEDURE LESE; VAR J:INTEGER; ZEICHEN:CHAR; BEGIN READLN; FOR J:=1 TO 4 DO BEGIN READ(ZEICHEN); PS.OP[I][J]:=ZEICHEN END END; BEGIN I:=0; READLN; REPEAT I:=I+1;WRITELN;WRITE(I:3," OPERATIONSTEIL"); LESE;WRITE(" ADRESSTEIL");READLN;READ(PS.ADR[I]) UNTIL PS.OP[I][4]="." END; PROCEDURE PROGAUSGABE; VAR I:INTEGER; PROCEDURE SCHREIBE; VAR J:INTEGER; ZEICHEN:CHAR; BEGIN FOR J:=1 TO 4 DO BEGIN ZEICHEN:=PS.OP[I][J];WRITE(ZEICHEN) END END; BEGIN I:=0;WRITELN;WRITELN("ZUR KONTROLLE,"); WRITELN("DER PROGRAMMSPEICHER ENTHAELT FOLGENDES PROGRAMM:"); REPEAT I:=I+1;WRITE(I:3," "); SCHREIBE;WRITELN(" ",PS.ADR[I]:3) UNTIL PS.OP[I][4]=".";WRITELN; END; PROCEDURE RUN; VAR BZR,Z:INTEGER; (*BZR= BEFEHLSZAEHLREGISTER*) AC:REAL; PROCEDURE BEFEHLHOLEN(ADRESSE:INTEGER); BEGIN BR.OP:=PS.OP[ADRESSE]; BR.ADR:=PS.ADR[ADRESSE] END; PROCEDURE ACAUSGABE; BEGIN WRITELN(" =",AC:10:4) END; PROCEDURE PROGSCHRITT; VAR I,J:INTEGER; BEGIN FOR J:=1 TO 50 DO WRITE("*");WRITELN; WRITELN(BZR:3,". PROGRAMMBEFEHL:"); WRITE(" OPERATIONSTEIL:");FOR I:=1 TO 4 DO WRITE(BR.OP[I]); WRITE(" , ADRESSTEIL:",BR.ADR:3);WRITELN;FOR J:=10 TO 50 DO WRITE("_"); WRITELN; END; BEGIN (*-----RUN-----*) BZR:=0;Z:=0; REPEAT BZR:=BZR+1;Z:=Z+1; BEFEHLHOLEN(BZR);WRITE(Z:2 ," "); PROGSCHRITT; IF BR.OP[1]="I" THEN BR.ADR:=TRUNC(DS[BR.ADR]); (*IND. ADRESSIERUNG*) CASE BR.OP[4] OF (*BEFEHLDECODIERUNG,DATENEINLESEN,AKKUMULATORAUSGABE*) "D":BEGIN WRITELN("?"); READ(DS[BR.ADR]) END; "T":WRITELN(" =",DS[BR.ADR]:10:4); "E":BEGIN AC:=DS[BR.ADR];ACAUSGABE END; "R":BEGIN DS[BR.ADR]:=AC;ACAUSGABE END; "+":BEGIN AC:=AC+DS[BR.ADR];ACAUSGABE END; "-":BEGIN AC:=AC-DS[BR.ADR];ACAUSGABE END; "*":BEGIN AC:=AC*DS[BR.ADR];ACAUSGABE END; "/":IF DS[BR.ADR]<>0 THEN BEGIN AC:=AC/DS[BR.ADR];ACAUSGABE END ELSE BEGIN WRITELN(" DIVISION DURCH 0 IST UNZULAESSIG,"); WRITELN(" WERTBELEGUNG VON DS.ADR ",BR.ADR:3," AENDERN !") END; "P":BEGIN IF AC>0 THEN BZR:=BR.ADR-1;WRITELN(" BZR=",BZR:3) END; "0":BEGIN IF AC=0 THEN BZR:=BR.ADR-1;WRITELN(" BZR=",BZR:3) END; "O":BEGIN BZR:=BR.ADR-1;WRITELN(" BZR=",BZR:3) END; ".":WRITELN; END UNTIL BR.OP[4]="." END; (*-----RUN-----*) PROCEDURE DIALOGTEXT; BEGIN WRITELN("DIESES PROGRAMM BEARBEITET PROGRAMME, DIE AUS FOLGENDEN"); WRITELN("EINADRESSBEFEHLEN BESTEHEN:"); WRITELN("READ X, WRIT X, ADD+ X, SUB- X, MUL* X, DIV/ X, LADE X,"); WRITELN("STOR X, GOTO Y, GO.P Y, GO.0 Y, END. 0 ."); WRITELN; WRITELN("LAUT VEREINBARUNG KANN EIN PROGRAMM MAX. 50 BEFEHLE ENTHALTEN,"); WRITELN("ES STEHEN 20 DATENSPEICHERPLAETZE ZUR VERFUEGUNG ."); WRITELN("WERDEN DIESE GRENZEN UEBERSCHRITTEN, MUESSEN ZUVOR DIE"); WRITELN("KONSTANTEN P UND D ERHOEHT WERDEN .");WRITELN; WRITELN("DRUECKEN SIE 'RETURN' UND GEBEN SIE EIN PROGRAMM EIN !") END; BEGIN (*===HAUPTPROGRAMM===*) DIALOGTEXT; REPEAT PROGEINGABE; PROGAUSGABE; REPEAT RUN; WRITELN("WOLLEN SIE NEUE DATEN FUER DIESES PROGRAMM EINGEBEN (J/N) ?"); READLN;READ(ANTWORT) UNTIL ANTWORT<>"J"; WRITELN("WOLLEN SIE EIN NEUES PROGRAMM EINGEGEN (J/N) ?"); READLN;READ(ANTWORT) UNTIL ANTWORT<>"J"; END.