stationeers.de Mod-Werkstatt · Dominik1199
EN Anmelden
  1. Start
  2. IC10-Akademie
  3. Tag 135

Tag 135 von 365 · Fortgeschritten · Monat 5: Speicher und Struktur

Sprungtabellen

Eine Kette aus beq-Zeilen springt direkt in den Block des aktuellen Zustands. Ein Fang-Zweig am Ende schickt jeden unbekannten Zustand in die Störung.

Lektion 15 Min. Woche 20

Das lernst du heute

  • Zustände über Labels verteilen
  • Vergleichskette
  • Zustand prüfen statt raten

Der Tankfüller von gestern hat drei Zustände und zwölf Zeilen Übergänge. Jeder Takt rechnet alle Übergänge durch, auch die von Zuständen, in denen der Automat gar nicht ist. Mit fünf oder sechs Zuständen wird daraus eine lange Kette, in der niemand mehr sieht, welche Zeile zu welchem Zustand gehört.

Besser: Der Chip springt direkt in den Block des aktuellen Zustands und rechnet nur dort.

Die Vergleichskette

beq zustand BEREIT z_bereit
beq zustand FUELLEN z_fuellen
beq zustand VOLL z_voll
beq zustand STOERUNG z_stoerung
move neu STOERUNG       # Fang: unbekannter Zustand
j ausgabe

Jede Zeile vergleicht den Zustand mit einer Nummer und springt bei Gleichheit zum Label. beq ist hier richtig: Der Zustand ist eine ganze Zahl, die nur dein Code setzt – kein Messwert, bei dem ein exakter Vergleich scheitern könnte.

Ein Block pro Zustand

Jeder Block kümmert sich nur um seine Übergänge und springt dann zur gemeinsamen Ausgabe:

z_fuellen:
sge tmp druck ZIEL
select neu tmp VOLL neu
j ausgabe

Die Ausgabe am Ende schreibt Pumpe und Anzeige für alle Zustände an einer Stelle. So steht jede Regel genau einmal im Code, und ein neuer Zustand braucht nur eine Zeile in der Kette und einen Block.

Zustand prüfen statt raten

Die vorletzte Zeile der Kette ist der Fang-Zweig. Er erwischt jede Zahl, für die es keinen Block gibt – etwa weil du beim Umbauen einen Zustand gelöscht hast oder ein Register versehentlich überschrieben wird. Ohne Fang läuft der Chip einfach in den ersten Block unter der Kette und macht dort weiter, als wäre alles in Ordnung. Mit Fang landet er in der Störung: Pumpe aus, Anzeige 3, und du siehst sofort, dass etwas nicht stimmt.

Achtung

Manche Programme springen mit j auf eine berechnete Zeilennummer, etwa add tmp zustand 20 und dann j tmp. Das spart ein paar Zeilen, bricht aber bei jeder Änderung: Jede neue Kommentarzeile und jedes neue define verschiebt alle Zeilennummern, und der Sprung landet mitten in einem fremden Block – ohne Fehlermeldung. Nimm Labels und die Vergleichskette.

Variante: Zustand als Unterprogramm

Mit beqal wird jeder Block ein Unterprogramm, das mit j ra statt j ausgabe zurückkehrt:

beqal zustand BEREIT z_bereit
beqal zustand FUELLEN z_fuellen
beqal zustand VOLL z_voll

Das funktioniert nur, weil die Blöcke neu setzen und die Kette zustand prüft. Würde ein Block zustand direkt ändern, träfe die nächste beqal-Zeile im selben Takt gleich den nächsten Block. Den Fang brauchst du hier extra: Prüf nach der Kette, ob der Zustand im erlaubten Bereich liegt.

Schaubild

Ablauf mit bedingtem Sprung start: yield · l r0 r0 > 303.15? heiss: On 1 On 0 ja: bgt springt nein: nächste Zeile j start
Jede Zeile der Vergleichskette ist ein bedingter Sprung: Passt der Zustand, geht es beim Label weiter, sonst prüft die nächste Zeile.

Übung

Aufgabe

Der Tankfüller bekommt eine Sprungtabelle und einen vierten Zustand Störung (3):

  • Bereit (0) → Füllen (1) bei Tastendruck
  • Füllen → Voll (2) ab 3000 kPa
  • Voll → Bereit unter 1000 kPa
  • Störung → Bereit bei Tastendruck, aber nur, wenn der Analysator Werte liefert
  • Ohne Analysator und bei jedem unbekannten Zustand: Störung

Die Blöcke für Bereit und Störung und die Ausgabe sind fertig. Schreib die Vergleichskette mit Fang-Zweig und die Blöcke für Füllen und Voll.

Hinweise

Hinweis 1

Vier Zeilen beq zustand ZUSTAND label, eine für jeden Zustand.

Hinweis 2

Danach der Fang: move neu STOERUNG und j ausgabe.

Hinweis 3

Füllen: sge tmp druck ZIEL, select neu tmp VOLL neu, j ausgabe. Voll genauso mit slt und NACHFUELLEN.

Quiz

4 Fragen. Ab 60 % ist das Quiz bestanden – die Auswertung macht der Server.

Tag abschließen

  • Übung im Simulator bestanden
  • Quiz mit mindestens 60 % bestanden

Ohne Konto wird der Fortschritt nur in diesem Browser gespeichert.

Fehler in dieser Lektion melden

Zum Melden bitte anmelden. Anmelden

Esc
↑ ↓ wählenEnter öffnen/ öffnet die Suche überall