diff --git a/20230418/Makefile b/20230418/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..7ae33df99f68fcf460324cfbb008f3f7a3863638
--- /dev/null
+++ b/20230418/Makefile
@@ -0,0 +1,8 @@
+%.elf: %.c
+	avr-gcc -Wall -Os -mmcu=atmega328p $< -o $@
+
+%.hex: %.elf
+	avr-objcopy -O ihex $< $@
+
+download:
+	./download.sh
diff --git a/20230418/blink-01.c b/20230418/blink-01.c
new file mode 100644
index 0000000000000000000000000000000000000000..16f34fc9dcbc5aa686b879e0c5cf1d8c10a446ee
--- /dev/null
+++ b/20230418/blink-01.c
@@ -0,0 +1,18 @@
+#include <avr/io.h>
+
+#define F_CPU 8000000
+#include <util/delay.h>
+
+int main (void)
+{
+  DDRB = 0xff;   // alle 8 Ausgänge als Outputs verwenden ("pinMode" für alle 8)
+  PORTB = 0x20;  // Bit Nr. 5 auf 1 setzen, alle anderen auf 0 ("digitalWrite" für alle 8)
+  while (1)
+    {
+      _delay_ms (500);
+      PORTB = 0x00;
+      _delay_ms (500);
+      PORTB = 0x20;
+    }
+  return 0;
+}
diff --git a/20230418/blink-01.hex b/20230418/blink-01.hex
new file mode 100644
index 0000000000000000000000000000000000000000..bf73a0d621c3419d3d1bd993cd9807885c6edc85
--- /dev/null
+++ b/20230418/blink-01.hex
@@ -0,0 +1,13 @@
+:100000000C9434000C943E000C943E000C943E0082
+:100010000C943E000C943E000C943E000C943E0068
+:100020000C943E000C943E000C943E000C943E0058
+:100030000C943E000C943E000C943E000C943E0048
+:100040000C943E000C943E000C943E000C943E0038
+:100050000C943E000C943E000C943E000C943E0028
+:100060000C943E000C943E0011241FBECFEFD8E04C
+:10007000DEBFCDBF0E9440000C9458000C940000DD
+:100080008FEF84B980E285B92FEF34E39CE02150F3
+:1000900030409040E1F700C0000015B82FEF34E386
+:1000A0009CE0215030409040E1F700C00000EBCFD1
+:0400B000F894FFCFF2
+:00000001FF
diff --git a/20230418/blink-01.s b/20230418/blink-01.s
new file mode 100644
index 0000000000000000000000000000000000000000..007702acb8feffd42efaae15cb4ed6c73567ae02
--- /dev/null
+++ b/20230418/blink-01.s
@@ -0,0 +1,41 @@
+	.file	"blink-01.c"
+__SP_H__ = 0x3e
+__SP_L__ = 0x3d
+__SREG__ = 0x3f
+__tmp_reg__ = 0
+__zero_reg__ = 1
+	.section	.text.startup,"ax",@progbits
+.global	main
+	.type	main, @function
+main:
+/* prologue: function */
+/* frame size = 0 */
+/* stack size = 0 */
+.L__stack_usage = 0
+	ldi r24,lo8(-1)             ; #include <avr/io.h>
+	out 0x4,r24                 ;
+	ldi r24,lo8(32)             ; #define F_CPU 8000000
+.L3:                                ; #include <util/delay.h>
+	out 0x5,r24                 ;
+	ldi r18,lo8(799999)         ; int main (void)
+	ldi r19,hi8(799999)         ; {
+	ldi r25,hlo8(799999)        ;   DDRB = 0xff;   // alle 8 Ausgänge als Outputs verwenden ("pinMode" für alle 8)
+1:	subi r18,1                  ;   PORTB = 0x20;  // Bit Nr. 5 auf 1 setzen, alle anderen auf 0 ("digitalWrite" für alle 8)
+	sbci r19,0                  ;   while (1)
+	sbci r25,0                  ;     {
+	brne 1b                     ;       _delay_ms (500);
+	rjmp .                      ;       PORTB = 0x00;
+	nop                         ;       _delay_ms (500);
+	out 0x5,__zero_reg__        ;       PORTB = 0x20;
+	ldi r18,lo8(799999)         ;     }
+	ldi r19,hi8(799999)         ;   return 0;
+	ldi r25,hlo8(799999)        ; }
+1:	subi r18,1
+	sbci r19,0
+	sbci r25,0
+	brne 1b
+	rjmp .
+	nop
+	rjmp .L3
+	.size	main, .-main
+	.ident	"GCC: (GNU) 5.4.0"
diff --git a/20230418/blink-01.s0 b/20230418/blink-01.s0
new file mode 100644
index 0000000000000000000000000000000000000000..ae625e1cbf1ca55ecbb16ba76c9896c0680e8f94
--- /dev/null
+++ b/20230418/blink-01.s0
@@ -0,0 +1,295 @@
+	.file	"blink-01.c"
+__SP_H__ = 0x3e
+__SP_L__ = 0x3d
+__SREG__ = 0x3f
+__tmp_reg__ = 0
+__zero_reg__ = 1
+.global	__mulsf3
+.global	__ltsf2
+.global	__gtsf2
+.global	__fixunssfsi
+	.text
+.global	main
+	.type	main, @function
+main:                              ;  #include <avr/io.h>
+	push r28                   ;  
+	push r29                   ;  #define F_CPU 8000000
+	in r28,__SP_L__            ;  #include <util/delay.h>
+	in r29,__SP_H__            ;  
+	sbiw r28,28                ;  int main (void)
+	in __tmp_reg__,__SREG__    ;  {
+	cli                        ;    DDRB = 0xff;   // alle 8 Ausgänge als Outputs verwenden ("pinMode" für alle 8)
+	out __SP_H__,r29           ;    PORTB = 0x20;  // Bit Nr. 5 auf 1 setzen, alle anderen auf 0 ("digitalWrite" für alle 8)
+	out __SREG__,__tmp_reg__   ;    while (1)
+	out __SP_L__,r28           ;      {
+/* prologue: function */           ;        _delay_ms (500);
+/* frame size = 28 */              ;        PORTB = 0x00;
+/* stack size = 30 */              ;        _delay_ms (500);
+.L__stack_usage = 30               ;        PORTB = 0x20;
+	ldi r24,lo8(36)            ;      }
+	ldi r25,0                  ;    return 0;
+	ldi r18,lo8(-1)            ;  }
+	movw r30,r24
+	st Z,r18
+	ldi r24,lo8(37)
+	ldi r25,0
+	ldi r18,lo8(32)
+	movw r30,r24
+	st Z,r18
+.L18:
+	ldi r24,0
+	ldi r25,0
+	ldi r26,lo8(-6)
+	ldi r27,lo8(67)
+	std Y+1,r24
+	std Y+2,r25
+	std Y+3,r26
+	std Y+4,r27
+	ldi r18,0
+	ldi r19,0
+	ldi r20,lo8(-6)
+	ldi r21,lo8(68)
+	ldd r22,Y+1
+	ldd r23,Y+2
+	ldd r24,Y+3
+	ldd r25,Y+4
+	call __mulsf3
+	movw r26,r24
+	movw r24,r22
+	std Y+19,r24
+	std Y+20,r25
+	std Y+21,r26
+	std Y+22,r27
+	ldi r18,0
+	ldi r19,0
+	ldi r20,lo8(-128)
+	ldi r21,lo8(63)
+	ldd r22,Y+19
+	ldd r23,Y+20
+	ldd r24,Y+21
+	ldd r25,Y+22
+	call __ltsf2
+	tst r24
+	brge .L23
+	ldi r24,lo8(1)
+	ldi r25,0
+	std Y+24,r25
+	std Y+23,r24
+	rjmp .L4
+.L23:
+	ldi r18,0
+	ldi r19,lo8(-1)
+	ldi r20,lo8(127)
+	ldi r21,lo8(71)
+	ldd r22,Y+19
+	ldd r23,Y+20
+	ldd r24,Y+21
+	ldd r25,Y+22
+	call __gtsf2
+	cp __zero_reg__,r24
+	brge .L24
+	ldi r18,0
+	ldi r19,0
+	ldi r20,lo8(32)
+	ldi r21,lo8(65)
+	ldd r22,Y+1
+	ldd r23,Y+2
+	ldd r24,Y+3
+	ldd r25,Y+4
+	call __mulsf3
+	movw r26,r24
+	movw r24,r22
+	movw r22,r24
+	movw r24,r26
+	call __fixunssfsi
+	movw r26,r24
+	movw r24,r22
+	std Y+24,r25
+	std Y+23,r24
+	rjmp .L7
+.L8:
+	ldi r24,lo8(-56)
+	ldi r25,0
+	std Y+26,r25
+	std Y+25,r24
+	ldd r24,Y+25
+	ldd r25,Y+26
+/* #APP */
+ ;  105 "/usr/lib/avr/include/util/delay_basic.h" 1
+	1: sbiw r24,1
+	brne 1b
+ ;  0 "" 2
+/* #NOAPP */
+	std Y+26,r25
+	std Y+25,r24
+	ldd r24,Y+23
+	ldd r25,Y+24
+	sbiw r24,1
+	std Y+24,r25
+	std Y+23,r24
+.L7:
+	ldd r24,Y+23
+	ldd r25,Y+24
+	or r24,r25
+	brne .L8
+	rjmp .L9
+.L24:
+	ldd r22,Y+19
+	ldd r23,Y+20
+	ldd r24,Y+21
+	ldd r25,Y+22
+	call __fixunssfsi
+	movw r26,r24
+	movw r24,r22
+	std Y+24,r25
+	std Y+23,r24
+.L4:
+	ldd r24,Y+23
+	ldd r25,Y+24
+	std Y+28,r25
+	std Y+27,r24
+	ldd r24,Y+27
+	ldd r25,Y+28
+/* #APP */
+ ;  105 "/usr/lib/avr/include/util/delay_basic.h" 1
+	1: sbiw r24,1
+	brne 1b
+ ;  0 "" 2
+/* #NOAPP */
+	std Y+28,r25
+	std Y+27,r24
+.L9:
+	ldi r24,lo8(37)
+	ldi r25,0
+	movw r30,r24
+	st Z,__zero_reg__
+	ldi r24,0
+	ldi r25,0
+	ldi r26,lo8(-6)
+	ldi r27,lo8(67)
+	std Y+5,r24
+	std Y+6,r25
+	std Y+7,r26
+	std Y+8,r27
+	ldi r18,0
+	ldi r19,0
+	ldi r20,lo8(-6)
+	ldi r21,lo8(68)
+	ldd r22,Y+5
+	ldd r23,Y+6
+	ldd r24,Y+7
+	ldd r25,Y+8
+	call __mulsf3
+	movw r26,r24
+	movw r24,r22
+	std Y+9,r24
+	std Y+10,r25
+	std Y+11,r26
+	std Y+12,r27
+	ldi r18,0
+	ldi r19,0
+	ldi r20,lo8(-128)
+	ldi r21,lo8(63)
+	ldd r22,Y+9
+	ldd r23,Y+10
+	ldd r24,Y+11
+	ldd r25,Y+12
+	call __ltsf2
+	tst r24
+	brge .L25
+	ldi r24,lo8(1)
+	ldi r25,0
+	std Y+14,r25
+	std Y+13,r24
+	rjmp .L12
+.L25:
+	ldi r18,0
+	ldi r19,lo8(-1)
+	ldi r20,lo8(127)
+	ldi r21,lo8(71)
+	ldd r22,Y+9
+	ldd r23,Y+10
+	ldd r24,Y+11
+	ldd r25,Y+12
+	call __gtsf2
+	cp __zero_reg__,r24
+	brge .L26
+	ldi r18,0
+	ldi r19,0
+	ldi r20,lo8(32)
+	ldi r21,lo8(65)
+	ldd r22,Y+5
+	ldd r23,Y+6
+	ldd r24,Y+7
+	ldd r25,Y+8
+	call __mulsf3
+	movw r26,r24
+	movw r24,r22
+	movw r22,r24
+	movw r24,r26
+	call __fixunssfsi
+	movw r26,r24
+	movw r24,r22
+	std Y+14,r25
+	std Y+13,r24
+	rjmp .L15
+.L16:
+	ldi r24,lo8(-56)
+	ldi r25,0
+	std Y+16,r25
+	std Y+15,r24
+	ldd r24,Y+15
+	ldd r25,Y+16
+/* #APP */
+ ;  105 "/usr/lib/avr/include/util/delay_basic.h" 1
+	1: sbiw r24,1
+	brne 1b
+ ;  0 "" 2
+/* #NOAPP */
+	std Y+16,r25
+	std Y+15,r24
+	ldd r24,Y+13
+	ldd r25,Y+14
+	sbiw r24,1
+	std Y+14,r25
+	std Y+13,r24
+.L15:
+	ldd r24,Y+13
+	ldd r25,Y+14
+	or r24,r25
+	brne .L16
+	rjmp .L17
+.L26:
+	ldd r22,Y+9
+	ldd r23,Y+10
+	ldd r24,Y+11
+	ldd r25,Y+12
+	call __fixunssfsi
+	movw r26,r24
+	movw r24,r22
+	std Y+14,r25
+	std Y+13,r24
+.L12:
+	ldd r24,Y+13
+	ldd r25,Y+14
+	std Y+18,r25
+	std Y+17,r24
+	ldd r24,Y+17
+	ldd r25,Y+18
+/* #APP */
+ ;  105 "/usr/lib/avr/include/util/delay_basic.h" 1
+	1: sbiw r24,1
+	brne 1b
+ ;  0 "" 2
+/* #NOAPP */
+	std Y+18,r25
+	std Y+17,r24
+.L17:
+	ldi r24,lo8(37)
+	ldi r25,0
+	ldi r18,lo8(32)
+	movw r30,r24
+	st Z,r18
+	rjmp .L18
+	.size	main, .-main
+	.ident	"GCC: (GNU) 5.4.0"
diff --git a/20230418/calc-01.c b/20230418/calc-01.c
new file mode 100644
index 0000000000000000000000000000000000000000..6791fea72774e2268c841825ae37c1b08200c72f
--- /dev/null
+++ b/20230418/calc-01.c
@@ -0,0 +1,10 @@
+#include <stdio.h>
+
+int main (void)
+{
+  int a = 3;
+  int b = 7;
+  int c = a + b;
+  printf ("c = %d\n", c);
+  return 0;
+}
diff --git a/20230418/calc-01.s b/20230418/calc-01.s
new file mode 100644
index 0000000000000000000000000000000000000000..84e3c202702e6e922ec409b18c7340a600bc69d6
--- /dev/null
+++ b/20230418/calc-01.s
@@ -0,0 +1,26 @@
+	.file	"calc-01.c"
+	.text
+	.section	.rodata.str1.1,"aMS",@progbits,1
+.LC0:
+	.string	"c = %d\n"
+	.text
+	.globl	main
+	.type	main, @function
+main:
+.LFB11:
+	.cfi_startproc                   ; #include <stdio.h>
+	subq	$8, %rsp                 ; 
+	.cfi_def_cfa_offset 16           ; int main (void)
+	movl	$10, %esi                ; {
+	leaq	.LC0(%rip), %rdi         ;   int a = 3;
+	movl	$0, %eax                 ;   int b = 7;
+	call	printf@PLT               ;   int c = a + b;
+	movl	$0, %eax                 ;   printf ("c = %d\n", c);
+	addq	$8, %rsp                 ;   return 0;
+	.cfi_def_cfa_offset 8            ; }
+	ret
+	.cfi_endproc
+.LFE11:
+	.size	main, .-main
+	.ident	"GCC: (Debian 8.3.0-6) 8.3.0"
+	.section	.note.GNU-stack,"",@progbits
diff --git a/20230418/calc-01.s0 b/20230418/calc-01.s0
new file mode 100644
index 0000000000000000000000000000000000000000..e0f8564fa52fb91f9eef7c1ba769a6aa5c794da0
--- /dev/null
+++ b/20230418/calc-01.s0
@@ -0,0 +1,37 @@
+	.file	"calc-01.c"
+	.text
+	.section	.rodata
+.LC0:
+	.string	"c = %d\n"
+	.text
+	.globl	main
+	.type	main, @function
+main:
+.LFB0:
+	.cfi_startproc
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset 6, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register 6          ; #include <stdio.h>
+	subq	$16, %rsp                ; 
+	movl	$3, -4(%rbp)             ; int main (void)
+	movl	$7, -8(%rbp)             ; {
+	movl	-4(%rbp), %edx           ;   int a = 3;
+	movl	-8(%rbp), %eax           ;   int b = 7;
+	addl	%edx, %eax               ;   int c = a + b;
+	movl	%eax, -12(%rbp)          ;   printf ("c = %d\n", c);
+	movl	-12(%rbp), %eax          ;   return 0;
+	movl	%eax, %esi               ; }
+	leaq	.LC0(%rip), %rdi
+	movl	$0, %eax
+	call	printf@PLT
+	movl	$0, %eax
+	leave
+	.cfi_def_cfa 7, 8
+	ret
+	.cfi_endproc
+.LFE0:
+	.size	main, .-main
+	.ident	"GCC: (Debian 8.3.0-6) 8.3.0"
+	.section	.note.GNU-stack,"",@progbits
diff --git a/20230418/calc-02.c b/20230418/calc-02.c
new file mode 100644
index 0000000000000000000000000000000000000000..0db41dca4029f53c6857d0cc15e786354f131c6c
--- /dev/null
+++ b/20230418/calc-02.c
@@ -0,0 +1,10 @@
+#include <stdio.h>
+
+int main (void)
+{
+  volatile int a = 3;
+  volatile int b = 7;
+  volatile int c = a + b;
+  printf ("c = %d\n", c);
+  return 0;
+}
diff --git a/20230418/calc-02.s b/20230418/calc-02.s
new file mode 100644
index 0000000000000000000000000000000000000000..30a87eb9b9721ebeaff6cd1362c33612fc7b243b
--- /dev/null
+++ b/20230418/calc-02.s
@@ -0,0 +1,32 @@
+	.file	"calc-02.c"
+	.text
+	.section	.rodata.str1.1,"aMS",@progbits,1
+.LC0:
+	.string	"c = %d\n"
+	.text
+	.globl	main
+	.type	main, @function
+main:
+.LFB11:
+	.cfi_startproc
+	subq	$24, %rsp
+	.cfi_def_cfa_offset 32                 ; #include <stdio.h>
+	movl	$3, 12(%rsp)                   ; 
+	movl	$7, 8(%rsp)                    ; int main (void)
+	movl	12(%rsp), %eax                 ; {
+	movl	8(%rsp), %edx                  ;   volatile int a = 3;
+	addl	%edx, %eax                     ;   volatile int b = 7;
+	movl	%eax, 4(%rsp)                  ;   volatile int c = a + b;
+	movl	4(%rsp), %esi                  ;   printf ("c = %d\n", c);
+	leaq	.LC0(%rip), %rdi               ;   return 0;
+	movl	$0, %eax                       ; }
+	call	printf@PLT
+	movl	$0, %eax
+	addq	$24, %rsp
+	.cfi_def_cfa_offset 8
+	ret
+	.cfi_endproc
+.LFE11:
+	.size	main, .-main
+	.ident	"GCC: (Debian 8.3.0-6) 8.3.0"
+	.section	.note.GNU-stack,"",@progbits
diff --git a/20230418/calc-03.c b/20230418/calc-03.c
new file mode 100644
index 0000000000000000000000000000000000000000..19b5aaa588781fea370749d72da98dcf92b2d001
--- /dev/null
+++ b/20230418/calc-03.c
@@ -0,0 +1,11 @@
+#include <stdio.h>
+
+volatile int a = 3;
+volatile int b = 7;
+
+int main (void)
+{
+  volatile static int c = a + b;
+  printf ("c = %d\n", c);
+  return 0;
+}
diff --git a/20230418/calc-03.s b/20230418/calc-03.s
new file mode 100644
index 0000000000000000000000000000000000000000..cb1f9023b5d3f3ed899e71b5ba59476b4d2a4f16
--- /dev/null
+++ b/20230418/calc-03.s
@@ -0,0 +1 @@
+	.file	"calc-03.c"
diff --git a/20230418/calc-04.c b/20230418/calc-04.c
new file mode 100644
index 0000000000000000000000000000000000000000..9cdec037f23e8b46f5ab53cbc4a967bab1cf0c57
--- /dev/null
+++ b/20230418/calc-04.c
@@ -0,0 +1,12 @@
+#include <stdio.h>
+
+volatile int a = 3;
+volatile int b = 7;
+
+int main (void)
+{
+  volatile static int c;
+  c = a + b;
+  printf ("c = %d\n", c);
+  return 0;
+}
diff --git a/20230418/calc-04.s b/20230418/calc-04.s
new file mode 100644
index 0000000000000000000000000000000000000000..0556a0c1488347bdda7fac848aa7d051d96ac729
--- /dev/null
+++ b/20230418/calc-04.s
@@ -0,0 +1,45 @@
+	.file	"calc-04.c"
+	.text
+	.section	.rodata.str1.1,"aMS",@progbits,1
+.LC0:
+	.string	"c = %d\n"
+	.text
+	.globl	main
+	.type	main, @function
+main:
+.LFB11:
+	.cfi_startproc
+	subq	$8, %rsp
+	.cfi_def_cfa_offset 16
+	movl	a(%rip), %eax
+	movl	b(%rip), %edx
+	addl	%edx, %eax                    ; #include <stdio.h>
+	movl	%eax, c.2399(%rip)            ; 
+	movl	c.2399(%rip), %esi            ; volatile int a = 3;
+	leaq	.LC0(%rip), %rdi              ; volatile int b = 7;
+	movl	$0, %eax                      ; 
+	call	printf@PLT                    ; int main (void)
+	movl	$0, %eax                      ; {
+	addq	$8, %rsp                      ;   volatile static int c;
+	.cfi_def_cfa_offset 8                 ;   c = a + b;
+	ret                                   ;   printf ("c = %d\n", c);
+	.cfi_endproc                          ;   return 0;
+.LFE11:                                       ; }
+	.size	main, .-main
+	.local	c.2399
+	.comm	c.2399,4,4
+	.globl	b
+	.data
+	.align 4
+	.type	b, @object
+	.size	b, 4
+b:
+	.long	7
+	.globl	a
+	.align 4
+	.type	a, @object
+	.size	a, 4
+a:
+	.long	3
+	.ident	"GCC: (Debian 8.3.0-6) 8.3.0"
+	.section	.note.GNU-stack,"",@progbits
diff --git a/20230418/download.sh b/20230418/download.sh
new file mode 100755
index 0000000000000000000000000000000000000000..770c3b5dca74ac09778be055c9d6f5adb0df293b
--- /dev/null
+++ b/20230418/download.sh
@@ -0,0 +1,3 @@
+port=$(ls -rt /dev/ttyACM* | tail -1)
+echo avrdude -P $port -c arduino -p m328p -U flash:w:$(ls -rt *.hex | tail -1)
+avrdude -P $port -c arduino -p m328p -U flash:w:$(ls -rt *.hex | tail -1) 2>/dev/null
diff --git a/20230418/dwarf.red b/20230418/dwarf.red
new file mode 100644
index 0000000000000000000000000000000000000000..c2af9cdef5dbe8cb86409ab212bb9a503fe323e2
--- /dev/null
+++ b/20230418/dwarf.red
@@ -0,0 +1,15 @@
+;redcode
+;name Dwarf
+;author A. K. Dewdney
+;strategy Throw DAT bombs around memory, hitting every 4th memory cell.
+;strategy This program was presented in the first Corewar article.
+;assert 1
+
+bomb  DAT   #0
+dwarf ADD   #4,    bomb
+      MOV   bomb, @bomb
+      JMP   dwarf
+      END   dwarf          ; Programs start at the first line unless
+                           ; an "END start" pseudo-op appears to indicate
+                           ; the first logical instruction.  Also, nothing
+                           ; after the END instruction will be assembled.
diff --git a/20230418/knirps.red b/20230418/knirps.red
new file mode 100644
index 0000000000000000000000000000000000000000..befaa2a3da9a8cab5e76207623ac49880453b472
--- /dev/null
+++ b/20230418/knirps.red
@@ -0,0 +1,5 @@
+;name Knirps
+;assert 1
+
+start   mov 0, 1
+        end start
diff --git a/20230418/logo-hochschule-bochum-cvh-text-v2.pdf b/20230418/logo-hochschule-bochum-cvh-text-v2.pdf
new file mode 120000
index 0000000000000000000000000000000000000000..4aa99b8f81061aca6dcaf43eed2d9efef40555f8
--- /dev/null
+++ b/20230418/logo-hochschule-bochum-cvh-text-v2.pdf
@@ -0,0 +1 @@
+../common/logo-hochschule-bochum-cvh-text-v2.pdf
\ No newline at end of file
diff --git a/20230418/logo-hochschule-bochum.pdf b/20230418/logo-hochschule-bochum.pdf
new file mode 120000
index 0000000000000000000000000000000000000000..b6b9491e370e499c9276918182cdb82cb311bcd1
--- /dev/null
+++ b/20230418/logo-hochschule-bochum.pdf
@@ -0,0 +1 @@
+../common/logo-hochschule-bochum.pdf
\ No newline at end of file
diff --git a/20230418/mice.red b/20230418/mice.red
new file mode 100644
index 0000000000000000000000000000000000000000..0b17fb8c6db22239bf870c841e600a24f82a2216
--- /dev/null
+++ b/20230418/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/20230418/nothing.red b/20230418/nothing.red
new file mode 100644
index 0000000000000000000000000000000000000000..5d6f3c21f2f19c3929c675c21b1e9a8ff47d8bf1
--- /dev/null
+++ b/20230418/nothing.red
@@ -0,0 +1,5 @@
+;name Nothing
+;assert 1
+
+start    jmp 0
+         end start
diff --git a/20230418/pgslides.sty b/20230418/pgslides.sty
new file mode 120000
index 0000000000000000000000000000000000000000..5be1416f4216f076aa268901f52a15d775e43f64
--- /dev/null
+++ b/20230418/pgslides.sty
@@ -0,0 +1 @@
+../common/pgslides.sty
\ No newline at end of file
diff --git a/20230418/rtech-20230418.pdf b/20230418/rtech-20230418.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..0913ab92893bd5c2dbd7bcc0e9f72181d29ae306
Binary files /dev/null and b/20230418/rtech-20230418.pdf differ
diff --git a/20230418/rtech-20230418.tex b/20230418/rtech-20230418.tex
new file mode 100644
index 0000000000000000000000000000000000000000..b92ef5319702a756e864af0063558ac0c9c65433
--- /dev/null
+++ b/20230418/rtech-20230418.tex
@@ -0,0 +1,622 @@
+% rtech-20230418.pdf - Lecture Slides on Computer Technology
+% Copyright (C) 2012, 2013, 2014, 2021, 2022, 2023  Peter Gerwinski
+%
+% This document is free software: you can redistribute it and/or
+% modify it either under the terms of the Creative Commons
+% Attribution-ShareAlike 3.0 License, or under the terms of the
+% GNU General Public License as published by the Free Software
+% Foundation, either version 3 of the License, or (at your option)
+% any later version.
+%
+% This document is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this document.  If not, see <http://www.gnu.org/licenses/>.
+%
+% You should have received a copy of the Creative Commons
+% Attribution-ShareAlike 3.0 Unported License along with this
+% document.  If not, see <http://creativecommons.org/licenses/>.
+
+% README: Assembler-Programmierung
+
+\documentclass[10pt,t]{beamer}
+
+\usepackage{pgslides}
+\usepackage{pdftricks}
+%\usepackage[obeyfamily=false,mathrm=mathsf,textrm=sffamily]{siunitx}
+%\usepackage{eurosym}
+\usepackage{tikz}
+
+\newcommand{\Cin}{C\raisebox{-0.5ex}{\footnotesize in}}
+\newcommand{\Cout}{C\raisebox{-0.5ex}{\footnotesize out}}
+
+\lstdefinestyle{asm}{basicstyle=\color{structure},
+                     language={},
+                     gobble=4}
+
+\begin{psinputs}
+  \usepackage[utf8]{inputenc}
+  \usepackage[german]{babel}
+  \usepackage[T1]{fontenc}
+  \usepackage{helvet}
+  \renewcommand*\familydefault{\sfdefault}
+  \usepackage{pstricks,pst-grad,pst-circ-pg}
+  \newcommand{\invisible}{\tiny\color{white}}
+  \psset{unit=1cm}
+  \psset{logicLabelstyle=\invisible}
+  \newcommand{\logicSymbol}{\small\boldmath\bf\rule{0pt}{0.5cm}}
+  \psset{logicSymbolstyle=\logicSymbol}
+  \newcommand{\Cin}{C\raisebox{-0.5ex}{\footnotesize in}}
+  \newcommand{\Cout}{C\raisebox{-0.5ex}{\footnotesize out}}
+\end{psinputs}
+
+\title{Rechnertechnik}
+\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski}
+\date{18.\ April 2022}
+
+\begin{document}
+
+\maketitleframe
+
+\nosectionnonumber{\inserttitle}
+
+\begin{frame}
+
+  \shownosectionnonumber
+
+  \begin{itemize}
+    \item[\textbf{1}] \textbf{Einführung}
+    \item[\textbf{2}] \textbf{Vom Schaltkreis zum Computer}
+      \begin{itemize}
+        \item[2.1] Logik-Schaltkreise
+        \item[2.2] Binärdarstellung von Zahlen
+        \item[2.3] Vom Logik-Schaltkreis zum Addierer
+        \item[2.4] Negative Zahlen
+        \item[2.5] Weitere Rechenoperationen
+        \color{medgreen}
+        \item[2.6] Vom Addierer zum Computer
+      \end{itemize}
+    \item[\textbf{3}] \textbf{Assember-Programmierung}
+      \begin{itemize}
+        \color{red}
+        \item[3.1] Struktur von Assembler-Programmen
+        \item[3.2] Beispiel: Redcode
+        \item[\dots]
+      \end{itemize}
+%    \color{gray}
+%    \item[\textbf{3}] \textbf{Architekturmerkmale von Prozessoren}
+%    \item[\textbf{4}] \textbf{Der CPU-Stack}
+%    \item[\textbf{5}] \textbf{Hardwarenahe Programmierung}
+%    \item[\textbf{6}] \textbf{Anwender-Software}
+%    \item[\textbf{7}] \textbf{Bus-Systeme}
+%    \item[\textbf{8}] \textbf{Pipelining}
+%    \item[\textbf{9}] \textbf{Ausblick}
+    \item[\textbf{\dots\hspace{-0.75em}}]
+  \end{itemize}
+
+\end{frame}
+
+\setcounter{section}{1}
+\section{Vom Schaltkreis zum Computer}
+\setcounter{subsection}{5}
+\subsection{Vom Addierer zum Computer}
+
+\begin{frame}
+
+  \showsubsection
+
+  \visible<1->{Rechenwerk (ALU)}
+
+  \bigskip
+
+  Speicher ($n$-Bit-Speicherzellen)
+  \begin{itemize}
+    \item
+      Prozessorregister
+    \item
+      Adressierbarer Hauptspeicher
+  \end{itemize}
+
+  \begin{onlyenv}<1>
+
+    \bigskip
+
+    \begin{visibleenv}<1->
+      Prozessorregister
+      \begin{itemize}
+        \item
+          können über Schaltungen (Und-Gatter) direkt mit Ein- und Ausgängen\\
+          der ALU verbunden werden \textcolor{red}{(Video: Master-Slave-D-Flipflop)}
+          \begin{onlyenv}<1->
+            \begin{picture}(0,0)
+              \put(-5.6,-0.6){%
+                \begin{minipage}{6cm}
+                  \begin{center}
+                    \color{medgreen}\footnotesize
+                    leider offizieller Name\\
+                    Gegenvorschlag: Primary-Secondary
+                  \end{center}
+                \end{minipage}}
+            \end{picture}
+          \end{onlyenv}
+        \item
+          sehr wenige (unter 100)
+        \item
+          sehr schnell
+      \end{itemize}
+    \end{visibleenv}
+
+    \bigskip
+
+    \begin{visibleenv}<1->
+      Adressierbarer Hauptspeicher: Speicherzellen
+      \begin{itemize}
+        \item
+          können über Schaltungen mit Prozessorregistern verbunden werden
+        \item
+          sehr viele (Stand 2023: mehrere Tausend bis mehrere Milliarden)
+        \item
+          Schaltkreis zum Auswählen: Decoder \textcolor{red}{(Video)}
+      \end{itemize}
+    \end{visibleenv}
+
+    \vspace*{-10cm}
+
+  \end{onlyenv}
+
+  \pause
+  \bigskip
+
+  Takt
+  \begin{itemize}
+    \item
+      Taktgeber
+    \item
+      Zähler
+    \arrowitem
+      Speicher durchgehen und Befehle abarbeiten: Maschinensprache
+  \end{itemize}
+
+  \begin{onlyenv}<2>
+
+    \smallskip
+
+    Der \newterm{Instruction Pointer} (ein Prozessorregister) adressiert eine Speicherzelle\\
+    im Hauptspeicher. Je nachdem, was sich darin befindet, wird ein Wert\\
+    aus dem Hauptspeicher in ein Prozessorregister übertragen oder umgekehrt\\
+    oder mit einem Prozessorregister eine Rechnung durchgeführt.
+
+    \smallskip
+
+    Wert aus Hauptspeicher in den Instruction Pointer übertragen
+    \textarrow\ Sprungbefehl\\
+    Ansonsten: Instruction Pointer hochzählen
+
+    \vspace*{-10cm}
+
+  \end{onlyenv}
+
+  \pause
+  \bigskip
+
+  Peripherie
+  \begin{itemize}
+    \item
+      Output: Speicherzelle als Output-Pin nach außen führen
+    \item
+      Input: Speicherzelle durch Input-Pin ersetzen
+    \arrowitem
+      Kommunikation mit der Außenwelt
+  \end{itemize}
+
+\end{frame}
+
+\section{Assembler-Programmierung}
+\subsection{Struktur von Assembler-Programmen}
+
+\begin{frame}
+  \showsection
+  \showsubsection
+
+  Maschinenbefehl: Bits besagen, was in diesem Takt geschehen soll
+
+  \begin{itemize}
+    \item
+      Daten aus Registern (oder Hauptspeicher) an ALU legen,\\
+      Ergebnis in Register (oder Hauptspeicher) schreiben
+    \arrowitem
+      arithmetisch-logische Befehle
+    \item
+      Daten aus dem Hauptspeicher in Register einlesen
+    \item
+      Daten aus Register in den Hauptspeicher schreiben
+    \arrowitem
+      Lade- und Speicher-Befehle
+    \item
+      Daten aus Register oder Hauptspeicher in das \lstinline{IP}-Register laden
+    \arrowitem
+      (unbedingter) Sprungbefehl
+    \item
+      Sprungbefehl nur dann, wenn im Status-Ausgang der ALU\\
+      ein bestimmtes Bit gesetzt ist
+    \arrowitem
+      bedingter Sprungbefehl
+    \bigskip
+    \arrowitem
+      Der Computer kann "`alles"' -- \newterm{Turing-Vollständigkeit}
+  \end{itemize}
+\end{frame}
+
+\begin{frame}
+
+  \showsection
+  \showsubsection
+
+  Maschinensprache: Bits besagen, was in diesem Takt geschehen soll
+  \begin{itemize}
+    \item
+      Lade- und Speicher-Befehle\\
+      arithmetisch-logische Befehle\\
+      unbedingte und bedingte Sprungbefehle
+    \arrowitem
+      Der Computer kann "`alles"' -- \newterm{Turing-Vollständigkeit}
+  \end{itemize}
+
+  \medskip
+
+  \newterm{Assembler\/}-Sprache
+  \begin{itemize}
+    \item
+      Maschinensprache = Zahlen \textarrow\ für Menschen schwer handhabbar
+    \arrowitem
+      Namen für die Befehle: \newterm{Mnemonics}
+  \end{itemize}
+
+  \pause
+  \medskip
+
+  Beispiele
+  \begin{itemize}
+    \item
+      Intel 8086 \textcolor{red}{(Screenshots: qemu/kvm, FreeDOS)}
+    \item
+      Atmel AVR \textcolor{red}{(Live: Arduino)}
+    \item
+      Intel IA-32 / AMD64 \textcolor{red}{(\lstinline[style=cmd]{gcc -S})}
+    \item
+      Redcode \textcolor{red}{(Praktikumsversuch)}
+  \end{itemize}
+
+\end{frame}
+
+\begin{frame}[fragile]
+
+  \showsubsection
+
+  Beispiel: IA-32-Assembler \only<3>{-- Adressierungsarten}
+
+  \vspace{2cm}
+
+  \begin{lstlisting}
+    addl    $1, %eax
+    movb    %al, b
+    cmpb    (%ebx), %dl
+    jbe     .L2
+  \end{lstlisting}
+
+  \begin{onlyenv}<2-3>
+    \begin{picture}(0,0)
+      \color{red}
+      \put(0.4,2.8){\vector(0,-1){0.7}}
+      \put(0.4,2.9){\makebox(0,0)[b]{Befehl}}
+      \only<2>{%
+        \put(1.4,2.8){\vector(-1,-1){0.7}}
+        \put(2.3,2.9){\makebox(0,0)[b]{Größen-Suffix}}}
+      \only<3>{%
+        \put(1.4,2.8){\vector(-1,-2){0.35}}
+        \put(1.4,2.8){\vector(1,-2){0.35}}
+        \put(2.0,2.9){\makebox(0,0)[b]{Operanden}}}
+    \end{picture}
+  \end{onlyenv}
+  \begin{onlyenv}<4>
+    \begin{picture}(0,0)
+      \color{red}
+      \put(1.4,2.8){\vector(-1,-2){0.35}}
+      \put(2.0,2.9){\makebox(0,0)[b]{unmittelbar}}
+      \put(3.0,1.8){\vector(-1,0){0.7}}
+      \put(3.1,1.8){\makebox(0,0)[l]{Register}}
+      \put(4.8,1.4){\vector(-1,0){2.7}}
+      \put(4.9,1.4){\makebox(0,0)[l]{Speicher (absolut)}}
+      \put(2.3,-0.0){\vector(-1,1){0.7}}
+      \put(3.5,-0.1){\makebox(0,0)[t]{indirekt mit Register}}
+      \put(0.8,-0.6){\vector(0,1){0.9}}
+      \put(0.0,-0.7){\makebox(0,0)[tl]{Speicher (relativ)}}
+    \end{picture}
+  \end{onlyenv}
+
+\end{frame}
+
+\subsection{Beispiel: Redcode}
+
+\begin{frame}[fragile]
+
+  \showsubsection
+
+  Beispiel: Redcode (ICWS '86) -- Core War[s] (Krieg der Kerne)\\
+  Virtuelle Maschine: Memory Array Redcode Simulator (MARS)
+
+  \bigskip
+
+  \begin{minipage}[t]{7.2cm}
+    Instruktionen:\\[\smallskipamount]
+    \lstinline{dat B} -- Daten \only<1->{-- "`Du hast verloren!"'}\\
+    \lstinline{mov A, B} -- kopiere A nach B\\
+    \lstinline{add A, B} -- addiere A zu B\\
+    \lstinline{sub A, B} -- subtrahiere A von B\\
+    \lstinline{jmp A} -- unbedingter Sprung nach A\\
+    \lstinline{jmz A, B} -- Sprung nach A, wenn B $=$ 0\\
+    \lstinline{jmn A, B} -- Sprung nach A, wenn B $\ne$ 0\\
+    \lstinline{djn A, B} -- "`decrement and jump if not zero"'\\
+    \lstinline{cmp A, B} -- "`compare"': überspringe, falls gleich\\
+    \lstinline{spl A} -- "`split"': Programm verzweigen
+  \end{minipage}\hfill
+  \begin{minipage}[t]{4.7cm}
+    Adressierungsarten:\\[\smallskipamount]
+    grundsätzlich: Speicher relativ\\[\smallskipamount]
+    \lstinline{#} -- unmittelbar\\
+    \lstinline{$} -- direkt\\
+    \lstinline{@} -- indirekt\\
+    \lstinline{<} -- indirekt mit Prä-Dekrement
+
+%    \pause[5]
+    \bigskip
+    Programm "`Nothing"':
+    \begin{lstlisting}[gobble=6]
+      jmp 0
+    \end{lstlisting}
+%    \pause
+    \bigskip
+    Programm "`Knirps"':
+    \begin{lstlisting}[gobble=6]
+      mov 0, 1
+    \end{lstlisting}
+
+  \end{minipage}
+
+\end{frame}
+
+\begin{frame}[fragile]
+
+  \showsubsection
+
+  Unbedingte Verzweigung
+
+  Beispiel: Endlosschleife von "`Dwarf"'
+
+  \begin{minipage}[t]{1.2cm}
+    \begin{lstlisting}[style=asm,gobble=6]
+      bomb
+      start
+    \end{lstlisting}
+  \end{minipage}%
+  \begin{minipage}[t]{3cm}
+    \begin{lstlisting}[style=asm,gobble=6]
+      dat #0
+      add #4, bomb
+      mov bomb, @bomb
+      jmp start
+      end start
+    \end{lstlisting}
+  \end{minipage}\hfill
+  \begin{minipage}[t]{3.9cm}
+    \small
+    \bigskip
+    Instruktionen:\\[\smallskipamount]
+    \lstinline{dat B}\\
+    \lstinline{mov A, B}\\
+    \lstinline{add A, B}\\
+    \lstinline{sub A, B}\\
+    \lstinline{jmp A}\\
+    \lstinline{jmz A, B} -- "`jump if zero"'\\
+    \lstinline{jmn A, B} -- "`if not zero"'\\
+    \lstinline{djn A, B} -- "`dec. \& jmn"'\\
+    \lstinline{cmp A, B} -- vgl.\ \& überspr.\\
+    \lstinline{spl A} -- verzweigen
+  \end{minipage}%
+  \begin{minipage}[t]{2.7cm}
+    \small
+    \bigskip
+    Adressierungsarten:\\[\medskipamount]
+    grundsätzlich:\\
+    Speicher relativ\\[\medskipamount]
+    \lstinline{#} -- unmittelbar\\[\smallskipamount]
+    \lstinline{$} -- direkt\\[\smallskipamount]
+    \lstinline{@} -- indirekt\\[\smallskipamount]
+    \lstinline{<} -- indirekt mit\\
+    \hspace*{0.52cm}Prä-Decrement
+  \end{minipage}
+
+\end{frame}
+
+\begin{frame}[fragile]
+
+  \showsubsection
+
+  \alt<2->{Mehrere Threads}{Bedingte Verzweigung}
+
+  Beispiel: \alt<2->{Multithreading}{Kopierschleife} von "`Mice"'
+
+  \begin{minipage}[t]{1.2cm}
+    \begin{lstlisting}[style=asm,gobble=6]
+      ptr
+      start
+      loop
+
+
+
+
+      dest
+
+    \end{lstlisting}
+  \end{minipage}%
+  \begin{minipage}[t]{3cm}
+    \begin{lstlisting}[style=asm,gobble=6]
+      dat              #0
+      mov     #12,     ptr
+      mov     @ptr,    <dest
+      djn     loop,    ptr
+      spl     @dest
+      add     #653,    dest
+      jmz     start,   ptr
+      dat              #833
+      end start
+    \end{lstlisting}
+  \end{minipage}\hfill
+  \begin{minipage}[t]{3.9cm}
+    \small
+    \bigskip
+    Instruktionen:\\[\smallskipamount]
+    \lstinline{dat B}\\
+    \lstinline{mov A, B}\\
+    \lstinline{add A, B}\\
+    \lstinline{sub A, B}\\
+    \lstinline{jmp A}\\
+    \lstinline{jmz A, B} -- "`jump if zero"'\\
+    \lstinline{jmn A, B} -- "`if not zero"'\\
+    \lstinline{djn A, B} -- "`dec. \& jmn"'\\
+    \lstinline{cmp A, B} -- vgl.\ \& überspr.\\
+    \lstinline{spl A} -- verzweigen
+  \end{minipage}%
+  \begin{minipage}[t]{2.7cm}
+    \small
+    \bigskip
+    Adressierungsarten:\\[\medskipamount]
+    grundsätzlich:\\
+    Speicher relativ\\[\medskipamount]
+    \lstinline{#} -- unmittelbar\\[\smallskipamount]
+    \lstinline{$} -- direkt\\[\smallskipamount]
+    \lstinline{@} -- indirekt\\[\smallskipamount]
+    \lstinline{<} -- indirekt mit\\
+    \hspace*{0.52cm}Prä-Decrement
+  \end{minipage}
+
+\end{frame}
+
+\begin{frame}[fragile]
+
+  \showsubsection
+
+  Selbstmodifizierender Code
+
+  Beispiel: Selbsterkennung von "`Fini"'
+
+  \begin{minipage}[t]{1.2cm}
+    \begin{lstlisting}[language={},gobble=6]
+      num
+      start
+
+      pos
+
+    \end{lstlisting}
+  \end{minipage}%
+  \begin{minipage}[t]{0.9cm}
+    \begin{lstlisting}[language={},gobble=6]
+      dat #-2
+      mov num, <pos
+      jmp start
+      dat #-3
+      end start
+    \end{lstlisting}
+  \end{minipage}\hfill
+  \begin{minipage}[t]{3.9cm}
+    \small
+    \bigskip
+    Instruktionen:\\[\smallskipamount]
+    \lstinline{dat B}\\
+    \lstinline{mov A, B}\\
+    \lstinline{add A, B}\\
+    \lstinline{sub A, B}\\
+    \lstinline{jmp A}\\
+    \lstinline{jmz A, B} -- "`jump if zero"'\\
+    \lstinline{jmn A, B} -- "`if not zero"'\\
+    \lstinline{djn A, B} -- "`dec. \& jmn"'\\
+    \lstinline{cmp A, B} -- vgl.\ \& überspr.\\
+    \lstinline{spl A} -- verzweigen
+  \end{minipage}%
+  \begin{minipage}[t]{2.7cm}
+    \small
+    \bigskip
+    Adressierungsarten:\\[\medskipamount]
+    grundsätzlich:\\
+    Speicher relativ\\[\medskipamount]
+    \lstinline{#} -- unmittelbar\\[\smallskipamount]
+    \lstinline{$} -- direkt\\[\smallskipamount]
+    \lstinline{@} -- indirekt\\[\smallskipamount]
+    \lstinline{<} -- indirekt mit\\
+    \hspace*{0.52cm}Prä-Decrement
+  \end{minipage}
+
+\end{frame}
+
+\begin{frame}[fragile]
+
+  \showsubsection
+
+  \strut
+ 
+  \strut\makebox(0,0)[bl]{\large\color{structure}\textbf{Praktikumsversuch}}
+
+  \begin{minipage}[t]{5cm}
+    \medskip
+    Schreiben Sie ein\\
+    Redcode-Programm,\\
+    das die Gegner\\
+    \file{Nothing}, \file{Knirps}\\
+    und \file{Mice} besiegt.
+
+    \medskip
+
+    ICWS-86-Standard,\\
+    max.\ 64 Prozesse,\\
+    Speichergröße zufällig\\
+    von 512 bis 8192
+
+    \medskip
+
+    Teams bis zu 3 Personen\\
+    sind zulässig.
+  \end{minipage}\hfill
+  \begin{minipage}[t]{3.9cm}
+    \small
+    \bigskip
+    Instruktionen:\\[\smallskipamount]
+    \lstinline{dat B}\\
+    \lstinline{mov A, B}\\
+    \lstinline{add A, B}\\
+    \lstinline{sub A, B}\\
+    \lstinline{jmp A}\\
+    \lstinline{jmz A, B} -- "`jump if zero"'\\
+    \lstinline{jmn A, B} -- "`if not zero"'\\
+    \lstinline{djn A, B} -- "`dec. \& jmn"'\\
+    \lstinline{cmp A, B} -- vgl.\ \& überspr.\\
+    \lstinline{spl A} -- verzweigen
+  \end{minipage}%
+  \begin{minipage}[t]{2.7cm}
+    \small
+    \bigskip
+    Adressierungsarten:\\[\medskipamount]
+    grundsätzlich:\\
+    Speicher relativ\\[\medskipamount]
+    \lstinline{#} -- unmittelbar\\[\smallskipamount]
+    \lstinline{$} -- direkt\\[\smallskipamount]
+    \lstinline{@} -- indirekt\\[\smallskipamount]
+    \lstinline{<} -- indirekt mit\\
+    \hspace*{0.52cm}Prä-Decrement
+  \end{minipage}
+
+\end{frame}
+
+\end{document}
diff --git a/20230418/tournament b/20230418/tournament
new file mode 100755
index 0000000000000000000000000000000000000000..c3cd7e438d288b3719e47553a28c283331fba016
--- /dev/null
+++ b/20230418/tournament
@@ -0,0 +1,40 @@
+#!/bin/bash
+
+if [ -n "$1" ]; then
+  PARTICIPANTS="$@"
+else
+  PARTICIPANTS=$(ls *.red)
+fi
+
+#PARTICIPANTS="nothing.red knirps.red mice.red $1"
+
+PMARS="$HOME/bo/2012ws/rtech/material/pmars-0.9.2/src/pmars-ncurses"
+
+mars ()
+{
+  c1=$2
+  c2=$3
+#  echo "$PMARS -8 -b -k -p 64 -s $1 $2 $3"
+  set $($PMARS -8 -b -k -p 8000 -s $1 $2 $3)
+#  set $($PMARS -8 -b -k -s $1 $2 $3)
+  if [ $1 = 1 ]; then
+    echo -n "***" >> $c1.score
+    touch $c2.score
+  elif [ $3 = 1 ]; then
+    touch $c1.score
+    echo -n "***" >> $c2.score
+  else
+    echo -n "+" >> $c1.score
+    echo -n "+" >> $c2.score
+  fi
+}
+
+rm -f *.score
+
+./turn $PARTICIPANTS \
+  | sort -R \
+  | while read line; do
+      $line
+    done
+
+./scores