File MIN434.PS

Directory of image this file is from
This file as a plain text file

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:=<AC>+X"); WRITELN(" SUB- X: AC:=<AC>-X"); WRITELN(" MUL* X: AC:=<AC>*X"); WRITELN(" DIV/ X: AC:=<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.



Feel free to contact me, David Gesswein djg@pdp8online.com with any questions, comments on the web site, or if you have related equipment, documentation, software etc. you are willing to part with.  I am interested in anything PDP-8 related, computers, peripherals used with them, DEC or third party, or documentation. 

PDP-8 Home Page   PDP-8 Site Map   PDP-8 Site Search