Der IC10 ist der programmierbare Chip in Stationeers. Er steckt in einem IC-Gehäuse, hängt am Datenkabel und kann Werte von Geräten lesen, rechnen und Geräte schalten. Die Sprache sieht aus wie Assembler: eine Anweisung pro Zeile, keine Klammern, keine Schleifen-Befehle, nur Sprünge. Das klingt spröde, ist aber schnell gelernt, und danach regelt die Station sich selbst, während du draußen Erz kloppst.
Was der Chip pro Takt tut
- Das Spiel rechnet in Takten von 0,5 Sekunden, also zwei pro Sekunde.
- Pro Takt führt der Chip höchstens 128 Anweisungen aus.
- Gerätewerte ändern sich nur einmal pro Takt. Wer denselben Sensor zehnmal im selben Takt liest, bekommt zehnmal denselben Wert.
Deshalb gehört in jede Hauptschleife ein yield: Es beendet den aktuellen Takt und macht im nächsten an derselben Stelle weiter.
Register
Der Chip hat 16 frei nutzbare Speicherplätze für Zahlen, r0 bis r15. Dazu kommen zwei mit Sonderaufgabe:
| Register | Zweck |
|---|---|
r0 … r15 | frei für eigene Werte |
sp (r16) | Stapelzeiger für push, pop, peek (der Stapel fasst 512 Werte) |
ra (r17) | Rücksprungadresse für jal |
Alle Werte sind Kommazahlen. Wahr und falsch sind einfach 1 und 0.
Geräte ansprechen
Es gibt zwei Wege:
Über die Pins d0 bis d5. Am IC-Gehäuse stellst du mit dem Schraubendreher ein, welches Gerät an welchem Pin hängt. Dann liest l r0 d0 Temperature die Temperatur vom Gerät an Pin 0. db ist das Gehäuse selbst. Sechs Pins sind schnell voll.
Über das Datennetz mit Typ und Namen. lbn liest, sbn schreibt, und zwar bei allen Geräten eines Typs mit einem bestimmten Namen im selben Datennetz:
lbn r0 -1252983604 HASH("Raum") Temperature 0
sbn 24258244 HASH("Heizung") On 1
- Die erste Zahl ist der Prefab-Hash des Gerätetyps, hier Gas-Sensor (
StructureGasSensor) und Wandheizung (StructureWallHeater). HASH("Raum")ist der Hash des Namens, den du dem Gerät im Spiel mit dem Beschriftungsgerät gegeben hast.- Die letzte Zahl beim Lesen ist der Batchmodus: Was soll herauskommen, wenn mehrere Geräte passen?
| Batchmodus | Wert | Ergebnis |
|---|---|---|
| Average | 0 | Durchschnitt aller passenden Geräte |
| Sum | 1 | Summe |
| Minimum | 2 | kleinster Wert |
| Maximum | 3 | größter Wert |
| Count | 4 | Anzahl der passenden Geräte |
Für Messwerte ist 0 (Average) fast immer richtig. Mit Sum werden aus zwei Sensoren mit je 20 °C plötzlich 40 °C, und das fällt erst auf, wenn jemand den zweiten Sensor baut.
Findet lbn mit Average kein einziges passendes Gerät, liefert es NaN (keine Zahl). Jeder Vergleich mit NaN ist falsch, jede Rechnung damit ergibt wieder NaN. Ein Tippfehler im Namen legt so still die ganze Regelung lahm. Abfangen mit bnan oder snan, siehe Typische Fehler.
Batch-Befehle laufen nur über das Datenkabel, nicht über die Pins. Das Gehäuse braucht also ein Datenkabel zu den Geräten.
define und alias
Rohe Zahlen im Code liest in drei Wochen niemand mehr, auch du nicht. Deshalb:
define NAME wertgibt einer Zahl einen Namen. Ideal für Prefab-Hashes und Schwellwerte.alias name r0gibt einem Register (oder Pin) einen Namen.
define SENSOR -1252983604 # Gas-Sensor
define ZIEL 294.15 # 21 C in Kelvin
alias tRaum r0
lbn tRaum SENSOR HASH("Raum") Temperature 0
HASH("...") wird schon beim Laden des Programms durch die Zahl ersetzt. Deshalb geht auch define RAUM HASH("Raum").
Temperaturen rechnet das Spiel in Kelvin: 0 °C sind 273,15 K. 21 °C sind also 294.15.
Labels und Sprünge
Ein Label ist ein Name mit Doppelpunkt allein auf einer Zeile. Sprünge gehen zu diesem Namen:
| Befehl | Bedeutung |
|---|---|
j start | springe immer |
beq a b ziel | springe, wenn a gleich b |
bne a b ziel | springe, wenn a ungleich b |
blt a b ziel | springe, wenn a kleiner b |
bgt a b ziel | springe, wenn a größer b |
bnan a ziel | springe, wenn a keine Zahl ist |
jal ziel | springe und merke die Rücksprungadresse in ra (Unterprogramm, zurück mit j ra) |
Immer Labels benutzen, nie Zeilennummern. Fügst du oben eine Zeile ein, verschieben sich alle Nummern, und das Programm springt ins Leere.
Das erste Programm: Heizung mit Hysterese
Ein Gas-Sensor namens „Raum“ misst die Temperatur. Unter 18 °C gehen alle Wandheizungen namens „Heizung“ an, über 21 °C wieder aus. Dazwischen bleibt alles, wie es ist. Diese Lücke heißt Hysterese und verhindert, dass die Heizung im Sekundentakt klackert.
# Raumheizung mit Hysterese
define SENSOR -1252983604 # Gas-Sensor
define HEIZUNG 24258244 # Wandheizung
define KALT 291.15 # 18 C: darunter heizen
define WARM 294.15 # 21 C: darueber aus
alias tRaum r0
alias heizen r1
move heizen 0
start:
yield
lbn tRaum SENSOR HASH("Raum") Temperature 0
bnan tRaum start
blt tRaum KALT an
bgt tRaum WARM aus
j schalten
an:
move heizen 1
j schalten
aus:
move heizen 0
schalten:
sbn HEIZUNG HASH("Heizung") On heizen
j start
So liest es sich:
- Zahlen und Register bekommen Namen.
start:ist der Anfang der Endlosschleife.yieldwartet auf den nächsten Takt.- Sensor lesen. Kommt NaN zurück (Sensor fehlt oder falsch benannt), zurück an den Anfang, ohne etwas zu schalten.
- Zu kalt:
heizenauf 1. Zu warm: auf 0. Dazwischen: unverändert. - Alle Heizungen mit dem Namen „Heizung“ bekommen den Wert. Dann von vorn.
Die harten Grenzen
| Grenze | Wert |
|---|---|
| Zeilen pro Programm | 128 |
| Zeichen pro Zeile | 90 |
| Zeichen im ganzen Programm | 4096 |
| Register | r0–r15 (plus sp, ra) |
| Pins | d0–d5 und db |
| Anweisungen pro Takt | 128 |
Alles zählt mit: Leerzeilen, Kommentarzeilen, Labels, define und alias. Bei ausführlichen Kommentaren ist meist das Zeichenlimit die Grenze, die zuerst erreicht ist, nicht die Zeilenzahl.
Kleine Fallen für den Anfang
- Befehle sind klein geschrieben und exakt:
move, nichtmov;j, nichtjmp. - Zahlen ohne Exponent:
100000, nicht1e5. - Läuft das Programm hinter die letzte Zeile, bleibt der Chip für immer stehen. Ohne Fehlermeldung. Jedes Programm endet mit einem Sprung zurück.
sleep 5wartet 5 Sekunden, nicht 5 Takte.- Keine Umlaute in Gerätenamen, die du per
HASHansprichst. Der Chip speichert nur einfache Zeichen, aus „Küche“ wird beim Schreiben etwas anderes, und der Hash passt nicht mehr.
Weiter geht es mit So schreibe ich IC10 und Typische Fehler. Wer im Spiel üben will: Das IC10 Editor-Tablet prüft Code beim Tippen und hat einen Simulator.