Das aus der folgenden Quelle erzeugte Programm kann im Benutzer-Auftrag mit dem normalen STARTE-Kommando aktiviert werden und schreibt dann den Text „Grüß Gott!“ ins Ablaufprotokoll (und im Dialogbetrieb an die Konsole des jeweiligen Benutzers).
SEGMENT HALLOWELT
; */START VIA, ALARM CIAO/* CO Start- und Alarm-Adresse;
; [0:255]FULL INDIZES; */XBASIS INDIZES/* CO Platz für Indizes;
; */VORBES (1,0), UNTPR 7/* CO Vorbesetzung Arbeitsspeicher und BU-Register;
; [0:5]FULL VB616 CO Versorgungsblock für Systemdienst SSR 6 16;[8]
IS ( REF CIAO CO Fehler-Ausgang;
, SHORT 3 CO Ausgabe ins Ablaufprotokoll und an Konsole;
, REF "*021Grüß Gott!" CO 1 Zeile Text (mit Vorschubzeichen NL);
, SHORT 2 CO 2 Ganzwörter (12 Zeichen) ausgeben;
, FULL 0 CO bedeutungslos, da keine Konsoleingabe verlangt;
)
; FULL VB012 = VB616 CO VB616[0:1] taugt auch als Versorgung für SSR 0 12;[15]
; VIA: BB := REF VB616; */SSR 6 16/* CO Text ausgeben;
; CIAO: BB := REF VB012; */SSR 0 12/* CO Programmlauf beenden;
FINIS
Die fünf Angaben, die das Betriebssystem zum Start eines Programms im Benutzer-Auftrag benötigt, müssen in TAS-Einschüben gemacht werden. Auch die Systemdienste (SSR-Befehle) werden in TAS-Einschüben aufgerufen. Im Falle eines SSR-Fehlers oder eines Alarms (mit denen hier nicht zu rechnen ist) würde das Programm bei der Marke CIAO fortgesetzt, also ohne Weiteres beendet werden.
SSR-Befehle erwarten die Adresse eines Versorgungsblocks im Register BB. Die Art der gewünschten Systemleistung wird durch die beiden Adressteile des SSR-Befehls bestimmt, die Einzelheiten durch den Inhalt des Versorgungsblocks.[16]
Alle Variablen, Konstanten und Befehls-Adressen werden mit PS‑440-Sprachmitteln deklariert; die deklarierten Namen können in TAS-Einschüben verwendet werden (hier: VIA, CIAO und INDIZES).
Die Äquivalenz-Vereinbarung in Zeile 13 erklärt VB012 als Alias für das erste Ganzwort aus VB616. Eine Spezifikation LABEL CIAO ist unnötig, da CIAO nur in einem TAS-Einschub und in einer konstanten Referenz verwendet wird; da genügt es, dass die Marke CIAO irgendwo im Segment gesetzt ist.
Das folgende Unterprogramm kann aus einem Fortran-Programm mit der Anweisung CALL JETZT (JAHR, MONAT, TAG, STUNDE, MINUTE, SEKUNDE) aufgerufen werden.[A 10] Als aktuelle Parameter sind 1 bis 6 INTEGER-Variable (oder Feldelemente) anzugeben, in die JETZT das aktuelle Datum samt Uhrzeit einträgt. Überzählige Parameter werden ignoriert. Das Unterprogramm lässt INTEGER*2- und INTEGER*4-Parameter zu und veranlasst bei falscher Versorgung den Abbruch des Programmlaufs mit einer Fehlermeldung.
SEGMENT PROCSFB JETZT
IS BEGIN */STRUKT (1, KB)/* CO Daten für den Rückverfolger;
; [0:3]FULL KB CO Kontrollblock;
PRESET ( SHORT '2H 0' CO Platz für Rückkehr-Adresse;
, SHORT 1 CO Code-Prozedur;
, SHORT '2H 81 0A0A' CO Fortran-Anschluss;
, REF TE CO Meldungstext im Fehlerfall;
)
; SHORT RADR = KB[0] CO Rückkehr-Adresse;
, FTADR = KB[3] CO Fehlertext-Adresse;
; SHORT KBADR IS REF KB
; FULL TE IS "*037" CO kein Text (nur Text-Ende);
; RADR := BB CO Rückkehradresse retten;
; INDEX PADR := RA CO Adresse der Parameterversorgung retten;
; FULL PARAMETER = FVAL PADR
; SHORT FADR = HW OF PARAMETER[0] CO Fehleradresse;
; LABEL FEHLER = SVAL FADR CO Fehlerroutine;
; PART SPRACHE = '3H FFFFFF 0FFFFF' OF PARAMETER[0] CO Sprachschlüssel;
, AUFRUF = '3H FFFFFF FFFCFF' OF PARAMETER[0] CO Aufrufart;
, PARZAHL = '3H FFFFFF FFFF00' OF PARAMETER[0] CO Anzahl Parameter;
; IF SPRACHE ≠ 1 THEN FTADR := REF "JETZT muss als FORTRAN-Unterprogramm aufgerufen werden*037"
ELSF AUFRUF = 2 THEN FTADR := REF "JETZT muss mit CALL aufgerufen werden*037"
FI
; IF FTADR ≠ REF TE THEN RH := REF KBADR; GOTO FEHLER FI
; SPEC S&SRF LABEL S&SRF CO Unterprogramm zur Behandlung von SSR-Fehlern;
; [0:1]FULL VB432 CO Versorgungsblock für SSR 4 32;
IS (REF S&SRF, SHORT 1) CO Ergebnis in 12 Dezimalziffern zu je 4 Bit mit TK=3 gewünscht;
; BB := REF VB432; */SSR 4 32/*; FULL UHR := RA CO Datum und Uhrzeit holen;
; INDEX P, PMAX, TYP, FBX
; FULL PP = PARAMETER[P][P]
; SHORT HV = HW OF PP[0] CO Zugriff auf den aktuellen Parameter;
; PART SCHL= '3H FFFFFF 3FFFFF' OF PP CO Beschreibung des aktuellen Parameters;
, ART = '3H FFFFFF 3FFF00' OF PP CO Beschreibung & Art des aktuellen Parameters;
, VTYP= '3H FFFFFF C000FF' OF PP CO Typ des aktuellen Parameters;
, FBA = '3H FFFFFF C00000' OF PP CO gegebenenfalls Adresse der Feldbeschreibung;
; FULL FB = FVAL FBX CO gegebenenfalls Feldbeschreibung;
; PART FTYP= '3H FFFFFF FF00FF' OF FB CO Typ aus Feldbeschreibung;
; IF PARZAHL > 6 THEN PMAX := 6 ELSE PMAX := PARZAHL FI
; FOR P FROM 1 TO PMAX
DO BEGIN
IF SCHL = 2 THEN FBX := FBA; TYP := FTYP CO Feld-Element;
ELSF ART = 2 THEN TYP := VTYP CO einfache Variable;
ELSE FTADR := REF "Parameter muss Variable oder Feld-Element sein*037"
FI
; RAQ := (RAQ := UHR) LEFT 8; SHORT WERT := RA; UHR := RQ CO nächsten Teilwert isolieren;
; FULL IWERT := 10 * TK1 (WERT RIGHT 4) + TK1 (WERT ET '3HF') CO Teilwert nach INTEGER wandeln;
; IF P = 1
THEN IF IWERT > 69 THEN IWERT +:= 1900 ELSE IWERT +:= 2000 FI CO Jahr vierstellig;
FI
; IF FTADR ≠ REF TE THEN CO inkompatibler Aktualparameter, nix tun;
ELSF TYP = 1 THEN EXEC HV; SVAL BB := IWERT
ELSF TYP = 2 THEN EXEC HV; FVAL BB := IWERT
ELSE FTADR := REF "Parameter muss INTEGER*2 oder INTEGER*4 sein*037"
FI
; IF FTADR ≠ REF TE THEN RH := REF KBADR; GOTO FEHLER FI
END P
; BB := RADR
END JETZT
FINIS
Der Vorteil von PS 440 gegenüber TAS: Man übersetzt die Struktur der diversen Versorgungs- und Kontrollblöcke aus der Dokumentation[17] als Äquivalenz-Deklarationen ins PS‑440-Programm und muss sich dann beim Zugriff auf die so deklarierten Größen keine Gedanken um indirekte Adressierung, Indizierung und Teilwort-Zugriffe machen, da das alles der Compiler berücksichtigt. Entscheidend dabei ist, dass sich die Äquivalenzen auf veränderliche Adressen beziehen können, die erst zur Laufzeit des Programms ausgewertet werden.
Da das Unterprogramm mehrfach vom selben Programm aufgerufen werden kann, sind Vorbelegungen mit PRESET nur soweit verlässlich, wie sie durch das Unterprogramm selbst nicht verändert werden. Andernfalls muss es den Variablen ihren Anfangswert dynamisch zuweisen – ausgenommen FTADR, das nur für eine Fehlermeldung verändert wird, von der es keine Rückkehr ins rufende Programm gibt.
Das Unterprogramm JETZT wird gemäß Programmiersystem-Konvention mit dem SFB-Befehl[11] aufgerufen, der die Rückkehradresse ins BB-Register bringt; der PS‑440-Compiler erwartet, dass beim Verlassen der Prozedur die Rückkehradresse wieder in BB steht. Also muss am Anfang BB gerettet und am Ende wiederhergestellt werden. Der STRUKT-Pseudobefehl ist ein Hinweis für die Rückverfolgung; aufgrund dieser Angabe erwartet der Rückverfolger im Alarm- oder Fehlerfall die Rückkehradresse im Kontrollblock. Der sonstige Inhalt des Kontrollblocks wird von dem Fehler-Unterprogramm ausgewertet, dessen Adresse im Parameterblock übergeben wurde; diesem Unterprogramm muss im RH-Register die Adresse eines Halbworts, das rechtsbündig die Adresse des Kontrollblocks enthält, übergeben werden.
Beim Aufruf eines Unterprogramms aus höheren Programmiersprachen steht die Adresse des Parameter-Blocks im RA-Register; diese muss als Nächstes gerettet werden. Der Parameter-Block besteht aus einem Kopfwort mit allgemeinen Angaben, gefolgt von je zwei Halbwörtern (Haupt- und Zusatzversorgung) pro Parameter. Die Zusatzversorgung beschreibt Typ und Art des jeweiligen Parameters und damit auch implizit die Wirkung der Hauptversorgung; im Falle eines Feldelements oder einer einfachen Variablen ist die Hauptversorgung ein Befehl, der dessen bzw. deren Adresse ins BB-Register bringt.
Ein Unterprogramm, das aus höheren Programmiersprachen aufgerufen wird, kann die Indizes 0 bis 7 für eigene Zwecke benutzen, sofern es nicht seinerseits andere Unterprogramme aufruft, die diese Indizes verändern. JETZT benutzt insgesamt fünf dieser acht Indizes.