PROGRAM RECHNERSIMULATION (IN,OUT); CONST D=30;P=50; TYPE WORT=ARRAY [1..5] 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; AC:REAL; BZR,DAR,ADR,LAENGE:INTEGER; ANWEISUNG,MODUS:WORT; BEDINGUNG:BOOLEAN; PROCEDUR TREAD (VAR ANWEISUNG:WORT); VAR INDEX:INTEGER; BEGIN INDEX:=0; REPEAT INDEX:=INDEX+1;READ(ANWEISUNG[INDEX]); UNTIL EOLN OR (INDEX=5); END; PROCEDUR TWRITE (VAR ANWEISUNG:WORT); VAR INDEX:INTEGER; BEGIN FOR INDEX:=1 TO 4 DO WRITE(ANWEISUNG[INDEX]); END; PROCEDUR LIST (VAR PS:SPEICHER); VAR I:INTEGER; BEGIN WRITELN; WRITELN("DER PROGRAMMSPEICHER ENTHAELT FOLGENDES PROGRAMM:"); WRITELN; FOR I:=1 TO LAENGE DO BEGIN WRITE(I:3,":");TWRITE(PS.OP[I]);WRITELN(PS.ADR[I]:3); END; WRITELN; END; PROCEDUR DELET (VAR ZEILE:INTEGER); VAR I:INTEGER; BEGIN FOR I:=ZEILE TO LAENGE DO BEGIN PS.OP[I] :=PS.OP[I+1]; PS.ADR[I]:=PS.ADR[I+1]; END; LAENGE:=LAENGE-1; END; PROCEDUR INSERT (VAR ZEILE:INTEGER); VAR I:INTEGER; BEGIN FOR I:=LAENGE DOWNTO ZEILE DO BEGIN PS.OP[I+1] :=PS.OP[I]; PS.ADR[I+1]:=PS.ADR[I]; END; WRITE("WELCHER BEFEHL WIRD VOR ZEILE NR.",ZEILE:3," EINGEFUEGT"); READLN;TREAD(PS.OP[ZEILE]); WRITELN;READ(PS.ADR[ZEILE]); LAENGE:=LAENGE+1; END; PROCEDUR CLEAR (VAR ZEILE:INTEGER); BEGIN WRITE("DURCH WELCHEN BEFEHL SOLL NR.",ZEILE:3," ERSETZT WERDEN"); READLN;TREAD(PS.OP[ZEILE]);READ(PS.ADR[ZEILE]); END; PROCEDUR EDITIERBEFEHLE; BEGIN WRITELN("IHNEN STEHEN FOLGENDE BEFEHLE ZUR VERFUEGUNG:"); WRITELN("LOESCHEN EINER ZEILE : DELE ZEILE"); WRITELN("EINFUEGEN EINER ZEILE : INSE ZEILE"); WRITELN("UEBERSCHREIBEN EINER ZEILE : CLEA ZEILE"); WRITELN("AUFLISTEN DER EDITIERBEFEHLE: BEDI"); WRITELN("AUFLISTEN DES PROGRAMMS : LIST"); WRITELN("BEENDEN DES MODUS : END"); WRITELN; END; PROCEDUR EDIT (VAR PS:SPEICHER); VAR BEFEHL:WORT; ZEILE:INTEGER; BEGIN WRITELN; WRITELN("SIE BEFINDEN SICH IM EDITOR."); WRITELN; EDITIERBEFEHLE; REPEAT WRITE("EDITIER-BEFEHL(ODER SCHREIBEN SIE 'HILF')"); READLN;TREAD(BEFEHL);READ(ZEILE); IF BEFEHL[1]<>"E"(*END*) THEN CASE BEFEHL[1] OF "D":DELET(ZEILE); "I":INSERT(ZEILE); "C":CLEAR(ZEILE); "B":EDITIERBEFEHLE; "H":EDITIERBEFEHLE; "L":LIST(PS); END; UNTIL BEFEHL[1]="E"; WRITELN("SIE HABEN DEN EDITOR VERLASSEN!"); WRITELN; END; PROCEDUR BEFHOLEN (VAR BZR:INTEGER); BEGIN BR.OP :=PS.OP [BZR]; BR.ADR:=PS.ADR[BZR]; END; PROCEDUR KONTROLLAUSGABE(VAR BR:BEFEHL;DAR:INTEGER); BEGIN WRITELN("====================================="); WRITELN("BZR :",BZR:3); WRITE("DER BEFEHL ");TWRITE(BR.OP);WRITE(BR.ADR:3);WRITELN(" WIRD AUSGEFUEHRT");  IF (BR.OP[4]="D") OR (BR.OP[4]="T") OR (BR.OP[4]="E") THEN WRITELN ELSE WRITELN("AC :",AC:19:6); IF (BR.OP[4]="R")OR(BR.OP[4]="+")OR(BR.OP[4]="-") OR(BR.OP[4]="*")OR(BR.OP[4]="/") THEN WRITELN("DIE SPEICHERZELLE",DAR:3," HAT DEN WERT",DS[DAR]:20:6); IF BR.OP[1]="I" THEN (*+++ INDIREKTE ADRESSIERUNG +++*) WRITELN("DIE SPEICHERZELLE",BR.ADR:4," HAT DEN WERT",DAR:4); WRITELN; END; PROCEDUR DECODIERE (VAR ANWEISUNG:WORT;ADR:INTEGER); VAR DAR:INTEGER; BEGIN BEDINGUNG:=FALSE; DAR:=ADR; IF ANWEISUNG[1]="I" THEN DAR:=TRUNC (DS[DAR]); KONTROLLAUSGABE(BR,DAR); CASE ANWEISUNG[4] OF (*READ*)"D":BEGIN WRITE("-",DAR:2," -");READLN;READ(DS[DAR]) END; (*WRIT*)"T":WRITELN("<",DAR:2," >=",DS[DAR]:20:6); (*ADD+*)"+":AC:=AC+DS[DAR]; (*SUB-*)"-":AC:=AC-DS[DAR]; (*MULX*)"*":AC:=AC*DS[DAR]; (*DIV/*)"/":AC:=AC/DS[DAR]; (*LADE*)"E":AC:=DS[DAR]; (*STOR*)"R":DS[DAR]:=AC; (*GOTO*)"O":BZR:=DAR-1; (*GO.0*)"0":IF AC=0 THEN BEGIN BZR:=DAR-1;BEDINGUNG:=TRUE END; (*GO.P*)"P":IF AC>0 THEN BEGIN BZR:=DAR-1;BEDINGUNG:=TRUE END; END; IF (ANWEISUNG[4]="P") OR (ANWEISUNG[4]="0") THEN IF BEDINGUNG=TRUE THEN WRITELN("DIE BEDINGUNG IST ERFUELLT!") ELSE WRITELN("DIE BEDINGUNG IST NICHT ERFUELLT!"); END; PROCEDUR LESE (VAR PS:SPEICHER); VAR INDEX:INTEGER; BEGIN WRITELN; WRITELN("SIE BEFINDEN SICH IM PROGRAMMLESE-MODUS,"); WRITELN("BITTE GEBEN SIE IHR PROGRAMM EIN."); WRITELN("SCHREIBEN SIE DIE BEFEHLE IM FORMAT"); WRITELN(" 'BEFEHL_ADRESSE_' ."); WRITELN("BEENDEN SIE DEN PROGRAMMIERMODUS INDEM SIE"); WRITELN(" 'END. 0 ' EINGEBEN!"); WRITELN; INDEX:=0; REPEAT INDEX:=INDEX+1;WRITE("BEFEHL NR.",INDEX:3);READLN; TREAD(PS.OP[INDEX]);READ(PS.ADR[INDEX]); UNTIL PS.OP[INDEX][4]="."; LAENGE:=INDEX; WRITELN("SIE HABEN DEN PROGRAMMLESE-MODUS VERLASSEN!"); WRITELN; END; PROCEDUR RUN; VAR AC:REAL; BEGIN WRITELN(" M I N I - INTERPRETER V007 HTL-MOEDLING"); WRITELN; BZR:=1; REPEAT BEFHOLEN (BZR); DECODIERE (BR.OP,BR.ADR); BZR:=BZR+1; UNTIL PS.OP[BZR][4]="."; WRITELN; END; PROCEDUR BEGRUESSUNG; BEGIN WRITELN("DIESES PROGRAMM SIMMULIERT DEN RECHNER 'MINI'."); WRITELN("AN DIESEM RECHNER KOENNEN SIE SELBSTERSTELLTE"); WRITELN("EINADRESS-PROGRAMME TESTEN."); END; PROCEDUR BEFEHLSLISTE; BEGIN WRITELN; WRITELN(" DER RECHNER KENNT FOLGENDE BEFEHLE:"); WRITELN(" READ X:DER RECHNER LIEST EINEN WERT AUF SPEICHER X EIN"); WRITELN(" WRIT X:DER RECHNER DRUCKT DEN WERT DE S SPEICHERS X AUS"); WRITELN(" LADE X:DER WERT DES SPEICHERS X WIRD IN AC GELADEN"); WRITELN(" STOR X:DER WERT DES AC WIRD AUF X ABGESPEICHERT"); WRITELN(" ADD+ X: AC:=+X"); WRITELN(" SUB- X: AC:=-X"); WRITELN(" MUL* X: AC:=*X"); WRITELN(" DIV/ X: AC:=/X"); WRITELN(" GOTO X:UNBEDINGTER SPRUNG NACH X"); WRITELN(" GO.P X:NUR WENN AC>0 DANN NACH X SPRINGEN"); WRITELN(" GO.0 X:NUR WENN AC=0 DANN NACH X SPRINGEN"); WRITELN("AUSSER DEM HABEN SIE DIE MOEGLICHKEIT INDIREKT ZU ADRESSIEREN:"); WRITELN(" DEM BEFEHL WIRD EIN 'I' VORANGESTELLT.DER DANN"); WRITELN(" IN X GESPEICHERTE WERT IST DIE ADRESSE:"); WRITELN(" IRED,IWRT,ILDE,ISTR"); WRITELN(" IAD+,ISB-,IML*,IDV/,IGTO,IG.P,IG.0"); WRITELN; END; PROCEDUR COMMANDOLISTE; BEGIN WRITELN("DIE VERSCHIEDENEN MODI SIND:"); WRITELN(" READ:SIE KOENNEN EIN PROGRAMM IN DEN PROGRAMMSPEICHER LESEN"); WRITELN(" LIST:DAS ERSTELLTE PROGRAMM WIRD AUFGELISTET"); WRITELN(" RUN :DAS IM PROGRAMMSPEICHER BEFINDLICHE PROGRAMM WIRD AUSGEFUEHRT"); WRITELN(" EDIT:SIE HABEN DIE MOEGLICHKEIT IHR PROGRAMM ZU KORRIGIEREN"); WRITELN(" CMDO:DIE COMMANDOLISTE WIRD NOCH EINMAL AUSGEGEBEN"); WRITELN(" BFHL:DIE BEFEHLSLISTE WIRD AUSGEGEBEN"); WRITELN(" END :DAS PROGRAMM ZUR RECHNERSIMULATION IST ZU ENDE"); WRITELN; END; PROCEDUR COMANDECODIERUNG; BEGIN WRITELN("IN WELCHEN MODUS MOECHTEN SIE"); WRITE("(SCHREIBEN SIE 'HILF' WENN SIE NICHTS WISSEN)"); READLN;TREAD(MODUS); IF MODUS[2]<>"N"(*END*) THEN CASE MODUS[2] OF "E":LESE(PS); "I":BEGIN IF MODUS[1]="L" THEN LIST(PS) ELSE COMMANDOLISTE END; "U":RUN; "F":BEFEHLSLISTE; "M":COMMANDOLISTE; "D":EDIT(PS); END; END; PROCEDUR DIALOG; BEGIN BEGRUESSUNG; COMMANDOLISTE; REPEAT COMANDECODIERUNG UNTIL MODUS[2]="N"; WRITELN("SIE HABEN DAS PROGRAMM VERLASSEN!"); WRITELN("AUF WIEDERSEHEN!"); END; (*========== Hauptprogramm ==========*) BEGIN LAENGE:=0; DIALOG; END.