diff --git a/20220517/catcan2.red b/20220517/catcan2.red
new file mode 100644
index 0000000000000000000000000000000000000000..f0aa1dcf34b4ecda5fe14a170ec69c6ad3044fe3
--- /dev/null
+++ b/20220517/catcan2.red
@@ -0,0 +1,21 @@
+;name Cat Can
+;author A. Kirchner, F. Uy, minor changes by P. Gerwinski
+;assert 1
+;
+; Your basic two sweep methodical bomber.
+; Fires SPL 0 and JMP -1 at every eight
+; addresses, then erases the core with
+; DAT bombs.
+
+start     mov       trap2,   < bomb
+          mov       trap1,   < bomb
+          sub     # 6,         bomb
+          jmn       start,     bomb ; trap loop
+set       mov     # -5,        bomb
+kill      mov       bomb,    @ bomb
+          djn       kill,      bomb ; kill loop
+reset     jmp       set
+bomb      dat                # -8
+trap1     spl       0
+trap2     jmp       -1
+          end       start
diff --git a/20220517/knirps.red b/20220517/knirps.red
new file mode 100644
index 0000000000000000000000000000000000000000..befaa2a3da9a8cab5e76207623ac49880453b472
--- /dev/null
+++ b/20220517/knirps.red
@@ -0,0 +1,5 @@
+;name Knirps
+;assert 1
+
+start   mov 0, 1
+        end start
diff --git a/20220517/mice.red b/20220517/mice.red
new file mode 100644
index 0000000000000000000000000000000000000000..88012d26a184b89f1d0510f76e44b7857b4e62eb
--- /dev/null
+++ b/20220517/mice.red
@@ -0,0 +1,16 @@
+;name Mice
+;author Chip Wendell
+;assert 1
+
+ptr     dat              #0
+start   mov     #12,     ptr    ; n = 12
+loop    mov     @ptr,    <dest  ; *--dest = *(ptr+(*ptr))
+        djn     loop,    ptr    ; if(--ptr != 0)
+                                ;     goto loop
+        spl     @dest           ; split(*dest)
+        add     #653,    dest   ; dest += 653
+        jmz     start,   ptr    ; if(!ptr)
+                                ;     goto start
+dest    dat              #833
+
+        end start
diff --git a/20220517/nothing.red b/20220517/nothing.red
new file mode 100644
index 0000000000000000000000000000000000000000..5d6f3c21f2f19c3929c675c21b1e9a8ff47d8bf1
--- /dev/null
+++ b/20220517/nothing.red
@@ -0,0 +1,5 @@
+;name Nothing
+;assert 1
+
+start    jmp 0
+         end start
diff --git a/20220517/rtech-20220517.txt b/20220517/rtech-20220517.txt
new file mode 100644
index 0000000000000000000000000000000000000000..ed2a3288182f68eb43a3bb445cb6299306d40b4e
--- /dev/null
+++ b/20220517/rtech-20220517.txt
@@ -0,0 +1,243 @@
+Alte Klausuren (Hardwarenahe Programmierung):
+
+https://gitlab.cvh-server.de/pgerwinski/hp
+
+Prüfungsform im Sommersemester 2022: Hausarbeit mit Kolloquium
+
+Ideen für Projekte: z.B. bei heise.de
+ - Selbstgebauter Retro-Rechner - das Mainboard Terminal
+   https://www.heise.de/-7095736
+
+
+Struktur von Assembler-Programmen, 17.05.2022, 10:34:04
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Arithmetisch-logische Befehle: Operation, Operanden
+
+  Operation: +, -, *, /, and, or, xor, ...
+
+  Operanden, z.B. für "+": 1. und 2. Summand, Ergebnis
+
+  Beispiele:
+
+    i860:
+    
+      add r24, r26, r28
+
+      "Nimm die Inhalte der Register 24 und 26, addiere sie,
+      und speichere das Ergebnis in Register 28."
+
+    IA-32 (Intel-Architektur, 32 Bit), AT&T-Syntax, GNU-Standard:
+
+      addl %eax, %ebx
+
+      "Nimm den Inhalt der Register eax und ebx, addiere sie,
+      und speichere das Ergebnis in Register ebx."
+
+      (Die Endung "l" steht für 32 Bit.)
+
+    IA-32 (Intel-Architektur, 32 Bit), Intel-Syntax:
+
+      add ebx, eax
+
+      "Nimm den Inhalt der Register eax und ebx, addiere sie,
+      und speichere das Ergebnis in Register ebx."
+
+      (Die Register eax und ebx haben immer 32 Bit.)
+
+Sprungbefehle: Operand = Sprungziel
+
+  Beispiele:
+
+    IA-32 (Intel-Architektur, 32 Bit), AT&T-Syntax, GNU-Standard:
+
+      jbe .L2
+
+      "Ist bei der letzten arithmetisch-logischen Operation
+      'below or equal' herausgekommen? (D.h. z.B.: Das Ergebnis
+      einer Subtraktion ist negativ oder null.)
+      Falls ja, springe an die Speicherzelle,
+      der wir vorher den Namen '.L2' gegeben haben."
+
+      Prüfung, ob ein Wert kleiner oder gleich 7 ist:
+
+      Wert: im eax-Register
+
+      subl $7, %eax
+      jbe .L2
+
+      Nachteil: Danach ist der Wert des eax-Registers verändert.
+      Gegenmaßnahme: zwischenspeichern
+
+      movl %eax, %ebx
+      subl $7, %ebx
+      jbe .L2
+
+      Andere Gegenmaßnahme: cmp-Befehl ("compare")
+
+      cmpl $7, %eax
+      jbe .L2
+
+      "Führe die Subtraktion aus, aber verwerfe das Ergebnis und merke
+      dir nur, ob das Ergebnis größer, kleiner oder gleich Null war."
+
+      Wenn wir ein Programm direkt mit einem jbe-Befehl starten,
+      hängt das Ergebnis von der letzten arithmetisch-logischen Operation
+      des vorherigen Programms ab, also letztlich vom Zufall.
+
+Lade- und Speicher-Befehle: Operanden = Speicherzellen (einschließlich Prozessorregister)
+
+  Beispiele:
+
+    IA-32 (Intel-Architektur, 32 Bit), AT&T-Syntax, GNU-Standard:
+
+      movb %al, b
+
+      "Nimm den Inhalt des al-Registers und speichere ihn
+      in der Speicherzelle, der wir den Namen b gegeben haben."
+
+      (Die Endung "b" steht für 8 Bit.)
+
+      movl %eax, %ebx
+
+      "Nimm den Inhalt des eax-Registers und speichere ihn im ebx-Register."
+
+      movl $1, %eax
+
+      "Nimm die Zahl 1 und speichere sie im Register eax."
+
+    IA-32 (Intel-Architektur, 32 Bit), Intel-Syntax:
+
+      mov ebx, eax
+
+      "Nimm den Inhalt des eax-Registers und speichere ihn im ebx-Register."
+
+      mov eax, #1
+
+      "Nimm die Zahl 1 und speichere sie im Register eax."
+
+    ATmega, AT&T-Syntax:
+
+      ldi r24, lo8(1)
+
+      "Nimm die untersten 8 Bit der Zahl 1 und speichere sie im Register r24."
+
+      (Das Register r24 hat nur 8 Bit.)
+
+Adressierungsarten:
+
+  unmittelbar: "die Zahl"
+
+    Beispiele:
+
+      IA-32 (Intel-Architektur, 32 Bit), AT&T-Syntax, GNU-Standard:
+      movl $1, %eax
+      "Nimm die Zahl 1 und speichere sie im Register eax."
+
+      IA-32 (Intel-Architektur, 32 Bit), Intel-Syntax:
+      mov eax, #1
+      "Nimm die Zahl 1 und speichere sie im Register eax."
+
+      ATmega, AT&T-Syntax:
+      ldi r24, lo8(1)
+      "Nimm die untersten 8 Bit der Zahl 1 und speichere sie im Register r24."
+      (Das Register r24 hat nur 8 Bit.)
+
+  Register: "im Register"
+
+    Beispiele: dieselben (siehe oben)
+
+  Speicher absolut
+
+    Beispiele:
+
+      IA-32 (Intel-Architektur, 32 Bit), AT&T-Syntax, GNU-Standard:
+      movb %al, b
+      "Nimm den Inhalt des al-Registers und speichere ihn
+      in der Speicherzelle, der wir den Namen b gegeben haben."
+
+      "Speicher" steht hier für: Arbeitsspeicher, RAM (random-access memory)
+      durchnumerierte Speicherzellen
+
+      "Register" steht für spezielle Speicherzellen im Inneren des Prozessors.
+      Diese können spezielle Namen haben (eax, ebx, al, rdi, ...)
+      oder ebenfalls durchnumeriert sein (r0, r1, ..., r24, ...).
+
+      Register "können mehr" und arbeiten schneller.
+        Es gibt mehr Befehle für die Adressierungsart "Register"
+        als für die Adressierungsart "Speicher".
+
+      Arbeitsspeicher (RAM) steht in größeren Mengen zur Verfügung.
+        Beispiel: IA-64 hat vielleicht 30 Register,
+        aber typischerweise mehrere GB an Arbeitsspeicher.
+
+    "absolut" bedeutet: Der Operand ist die Nummer der Speicherzelle.
+
+  Speicher relativ
+
+    "relativ" bedeutet: Der Operand ist die Nummer der Speicherzelle,
+    gezählt ab einer vorher bekannten Zahl.
+
+    Z.B. in Zusammenhang mit Sprungbefehlen:
+    "Springe um 5 Speicherzellen nach oben."
+
+    Zweck: Einfachere Relokation des Programms
+    (Das Programm ist lauffähig, egal wo es sich im Speicher befindet.)
+
+  Speicher indirekt
+
+    Beispiel: IA-32 (Intel-Architektur, 32 Bit), AT&T-Syntax, GNU-Standard:
+
+      cmpb (%ebx), %dl
+      "Betrachte den Inhalt des ebx-Registers als Nummer einer Speicherzelle (Zeiger)
+      und vergleiche die 8-Bit-Zahl, die sich dort befindet, mit dem dl-Register."
+
+      movb (%ebx), %dl
+      "Betrachte den Inhalt des ebx-Registers als Nummer einer Speicherzelle (Zeiger)
+      und kopiere die 8-Bit-Zahl, die sich dort befindet, in das dl-Register."
+
+      addb %dl, (%ebx)
+      "Betrachte den Inhalt des ebx-Registers als Nummer einer Speicherzelle (Zeiger)
+      und addiere den Inhalt des dl-Registers zu der 8-Bit-Zahl, die sich dort befindet."
+
+    Beispiel: Redcode
+
+      mov -1, @-2
+
+      "Betrachte den Inhalt der Speicherzelle, die sich 2 weiter oben befindet,
+      als Nummer einer Speicherzelle (Zeiger)
+      und kopiere den Inhalt der Speicherzelle, die sich 1 weiter oben befindet, dorthin."
+
+Zusätzliche Manipulatoren
+
+  Prä-Dekrement:
+
+    Bevor der Befehl ausgeführt wird, subtrahiere eine Konstante von einem der Operanden.
+
+    Beispiel: Redcode
+
+      mov -1, <-2
+
+      1. Prä-Dekrement:
+        "Subtrahiere 1 von der Speicherzelle, die sich 2 weiter oben befindet."
+      2. mov-Befehl:
+        "Betrachte den Inhalt der Speicherzelle, die sich 2 weiter oben befindet,
+        als Nummer einer Speicherzelle (Zeiger)
+        und kopiere den Inhalt der Speicherzelle, die sich 1 weiter oben befindet, dorthin."
+
+  Analog: Prä-Inkrement, Post-Dekrement, Post-Inkrement
+
+Hardware-spezifische Befehle
+
+  Beispiel: IA-32 (Intel-Architektur, 32 Bit), AT&T-Syntax, GNU-Standard:
+
+    syscall
+
+    Rufe eine Funktion im Betriebssystemkern auf.
+
+  Beispiel: Redcode
+
+    spl 2
+
+    "Führe das Programm nicht nur in der folgenden Speicherzelle aus,
+    sondern auch in der genannten, hier also in der übernächsten.
+    Dadurch entstehen zwei Tasks (oder Threads), die sich die Rechenzeit teilen."
diff --git a/20220517/sk.red b/20220517/sk.red
new file mode 100644
index 0000000000000000000000000000000000000000..49af80506e241ac711230d52743a788ab1a4bc67
--- /dev/null
+++ b/20220517/sk.red
@@ -0,0 +1,8 @@
+;name SK
+;version 2
+;author Peter Gerwinski
+;assert 1
+
+        spl 2
+        jmp 0, <-50
+        mov 0, 1
diff --git a/20220517/test-01.red b/20220517/test-01.red
new file mode 100644
index 0000000000000000000000000000000000000000..1e26a54c48cbec4d33fdcbc64b9a0f8d497cada3
--- /dev/null
+++ b/20220517/test-01.red
@@ -0,0 +1 @@
+mov -1, @-2
diff --git a/20220517/test-02.red b/20220517/test-02.red
new file mode 100644
index 0000000000000000000000000000000000000000..26bdb83e474bc3e3ff41289507211ae5b2b34e43
--- /dev/null
+++ b/20220517/test-02.red
@@ -0,0 +1,9 @@
+            dat -3
+            dat -2
+            dat -1
+start       mov -1, @-2
+            dat 1
+            dat 2
+            dat 3
+
+            end start
diff --git a/20220517/test-03.red b/20220517/test-03.red
new file mode 100644
index 0000000000000000000000000000000000000000..f6a3e947bcd7f310a91f8e2d9461909b5fece1eb
--- /dev/null
+++ b/20220517/test-03.red
@@ -0,0 +1,10 @@
+            dat -3
+            dat -2
+            dat -1
+start       mov -1, @-2
+            jmp start
+            dat 1
+            dat 2
+            dat 3
+
+            end start
diff --git a/20220517/test-04.red b/20220517/test-04.red
new file mode 100644
index 0000000000000000000000000000000000000000..16e568b3f6c8953e8fa7059c7bac24307169bc72
--- /dev/null
+++ b/20220517/test-04.red
@@ -0,0 +1,10 @@
+            dat -3
+            dat -2
+            dat -1
+start       mov -1, <-2
+            jmp start
+            dat 1
+            dat 2
+            dat 3
+
+            end start
diff --git a/20220517/test-05.red b/20220517/test-05.red
new file mode 100644
index 0000000000000000000000000000000000000000..7367de9554af8efbeca5541ad4af7eb2c22ce959
--- /dev/null
+++ b/20220517/test-05.red
@@ -0,0 +1,12 @@
+            dat -3
+            dat -2
+            dat -1
+start       spl 3
+loop        mov -1, <-3
+            jmp loop
+            mov 0, 1
+            dat 1
+            dat 2
+            dat 3
+
+            end start