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

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

Großen Code gliedern

Ein großer Chip braucht eine feste Gliederung: Kopf mit Registerplan, Eingänge, Zustände, Ausgabe, Unterprogramme. So bleibt er lesbar und unter den Grenzen.

Lektion 15 Min. Woche 20

Das lernst du heute

  • Abschnitte und Registerplan
  • Unterprogramme sinnvoll schneiden
  • Platz sparen

Die Absaugung aus Tag 136 ist gewachsen: Die Anzeige wird jetzt in der Störung rot, bald kommt ein zweiter Raum dazu. Irgendwann stößt jeder größere Chip an die Grenzen – 128 Zeilen, 90 Zeichen pro Zeile und vor allem 4096 Zeichen. Mit deutschen Kommentaren ist meist das Zeichenlimit zuerst voll. Und lange bevor es so weit ist, findest du in einem ungegliederten Chip deine eigenen Fehler nicht mehr.

Eine feste Reihenfolge

TeilInhalt
Kopfdefine für Geräte, Zustände und Grenzwerte, dann alle alias
StartWerte, die vor der Schleife gesetzt werden
1. Eingängealle lbn an einer Stelle, die NaN-Prüfung direkt dahinter
2. ZuständeSprungtabelle und ein Block je Zustand
3. Ausgabeneuen Zustand übernehmen, alle sbn an einer Stelle
Unterprogrammehinter j start

Wer so baut, weiß bei jedem Fehler, wo er suchen muss: falscher Messwert → Abschnitt 1, falscher Zustand → Abschnitt 2, Gerät tut nichts → Abschnitt 3.

Der Registerplan

16 Register klingen nach viel, sind aber schnell verteilt. Leg im Kopf fest, wofür jedes da ist, und halte dich daran:

# Register: r0-r2 Zustand und Zaehler
#           r3-r7 Hauptprogramm
#           r8 nur fuer das Unterprogramm anzeige
alias zustand r0
alias takte r2
alias farbe r8

Die wichtigste Regel: Ein Unterprogramm benutzt nur seine eigenen Register. Rechnet es mit tmp, während der Aufrufer in tmp noch einen Wert braucht, ist der Wert nach j ra weg – ohne Fehlermeldung, und der Fehler zeigt sich an einer ganz anderen Stelle.

Unterprogramme sinnvoll schneiden

Ein Unterprogramm kostet mindestens zwei Zeilen extra: jal und j ra. Es lohnt sich, wenn

  • derselbe Code an mehreren Stellen gebraucht wird, zum Beispiel „alles aus“ bei jeder Störung,
  • ein abgeschlossener Teil die Hauptschleife unübersichtlich macht, etwa die Anzeige mit Zahl und Farbe.

Ein Unterprogramm für eine einzige Zeile lohnt sich nie. Und eines, das selbst wieder jal aufruft, braucht push ra und pop ra.

jal anzeige            # Status und Farbe
# ... restliche Ausgabe ...
j start
anzeige:
seq farbe zustand STOERUNG
select farbe farbe ROT GRUEN
sbn ANZEIGE HASH("Status") Color farbe
j ra

Platz sparen

  • Kommentare kurz halten. Einer pro Abschnitt und einer hinter jedem define reicht. Jedes Zeichen zählt, auch Leerzeichen.
  • Ausgaben nur einmal schreiben. Ein sbn pro Gerät in der Ausgabe statt einem in jedem Zustandsblock.
  • select statt Sprüngen. select neu tmp VOLL neu braucht kein Label und keinen Rücksprung.
  • Leerzeilen weglassen. Jede zählt als Zeile.
Achtung

Kürzen nie auf Kosten der Sicherheit: Die NaN-Prüfung und der Fang-Zweig bleiben drin, auch wenn es eng wird. Lieber einen Kommentar kürzen als einen Schutz streichen.

Übung

Aufgabe

Die Absaugung hat ein Unterprogramm anzeige bekommen: Es schreibt die Zustandsnummer und färbt die Anzeige „Status“ in der Störung rot, sonst grün. Seitdem stimmt die Zeitmessung nicht mehr: Der Nachlauf endet sofort, und wer nach einer Wartezeit in Bereit die Taste drückt, landet gleich in der Störung.

Finde den Registerkonflikt und behebe ihn nach dem Registerplan im Kopf des Programms. Das Verhalten sonst bleibt wie in Tag 136.

Hinweise

Hinweis 1

Was steht in tmp, wenn nach jal anzeige die Zeile select takte tmp takte 0 läuft?

Hinweis 2

Das Unterprogramm rechnet die Farbe in tmp aus und überschreibt damit das Ergebnis von seq tmp neu zustand.

Hinweis 3

Laut Registerplan gehört r8 dem Unterprogramm: Ersetz dort tmp durch farbe.

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