diff --git a/20210114/hp-20210114.pdf b/20210114/hp-20210114.pdf
index 1f457a7b9e76aaa6ff5fb042f3ee01b8dabcd37a..824d098f2359839823b13ad1bd3ce351c47c9c64 100644
Binary files a/20210114/hp-20210114.pdf and b/20210114/hp-20210114.pdf differ
diff --git a/20210114/hp-20210114.tex b/20210114/hp-20210114.tex
index 81466728852b1e65e1d23af0a5bb577e4627a432..541b512919bbf446bfd43f4c1a1aeed8fccfa8d8 100644
--- a/20210114/hp-20210114.tex
+++ b/20210114/hp-20210114.tex
@@ -20,7 +20,7 @@
 % Attribution-ShareAlike 3.0 Unported License along with this
 % document.  If not, see <http://creativecommons.org/licenses/>.
 
-% README: Hardwarenahe Programmierung
+% README: Hardwarenahe Programmierung: Bit-Operationen, I/O-Ports
 
 \documentclass[10pt,t]{beamer}
 
@@ -68,6 +68,7 @@
         \color{red}
         \item[4.1] Bit-Operationen
         \item[4.2] I/O-Ports
+        \color{black}
         \item[4.3] Interrupts
         \item[4.4] volatile-Variable
         \item[4.6] Byte-Reihenfolge -- Endianness
@@ -475,6 +476,7 @@
         \color{red}
         \item[4.1] Bit-Operationen
         \item[4.2] I/O-Ports
+        \color{black}
         \item[4.3] Interrupts
         \item[4.4] volatile-Variable
         \item[4.6] Byte-Reihenfolge -- Endianness
@@ -757,467 +759,4 @@
 
 \end{frame}
 
-\subsection{volatile-Variable}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  Externes Gerät ruft (per Stromsignal) Unterprogramm auf
-
-  Zeiger hinterlegen: "`Interrupt-Vektor"'
-
-  Beispiel: Taster
-
-  \vspace*{-2.5pt}
-
-  \begin{minipage}[t]{5cm}
-    \begin{onlyenv}<1>
-      \begin{lstlisting}[gobble=8]
-        ¡#include <avr/interrupt.h>
-        ...
-
-        uint8_t key_pressed = 0;
-
-        ISR (INT0_vect)
-        {
-          key_pressed = 1;
-        }¿
-      \end{lstlisting}
-    \end{onlyenv}
-    \begin{onlyenv}<2>
-      \begin{lstlisting}[gobble=8]
-        ¡#include <avr/interrupt.h>
-        ...
-
-        volatile uint8_t key_pressed = 0;
-
-        ISR (INT0_vect)
-        {
-          key_pressed = 1;
-        }¿
-      \end{lstlisting}
-    \end{onlyenv}
-  \end{minipage}\hfill
-  \begin{minipage}[t]{6cm}
-    \begin{lstlisting}[gobble=6]
-      ¡int main (void)
-      {
-        ...
-
-        while (1)
-          {
-            while (!key_pressed)
-              ;  /* just wait */
-            PORTD ^= 0x40;
-            key_pressed = 0;
-          }
-        return 0;
-      }¿
-    \end{lstlisting}
-  \end{minipage}
-
-  \pause
-  \begin{picture}(0,0)
-    \color{red}
-    \put(10.3,4.0){\makebox(0,0)[b]{\begin{minipage}{6cm}
-        \begin{center}
-          \textbf{volatile}:\\
-          Speicherzugriff\\
-          nicht wegoptimieren
-        \end{center}
-      \end{minipage}}}
-    \put(10.3,3.95){\makebox(0,0)[tr]{\tikz{\draw[-latex](0,0)--(-0.5,-0.9);}}}
-  \end{picture}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  Was ist eigentlich \lstinline{PORTD}?
-
-  \bigskip
-  \pause
-
-  \lstinline[style=cmd]{avr-gcc -Wall -Os -mmcu=atmega328p blink-3.c -E}
-
-  \bigskip
-  \pause
-  \lstinline{PORTD = 0x01;}\\
-  \textarrow\quad
-  \lstinline[style=terminal]{(*(volatile uint8_t *)((0x0B) + 0x20)) = 0x01;}\\
-  \pause
-  \begin{picture}(0,2)(0,-1.7)
-    \color{red}
-    \put(5.75,0.3){$\underbrace{\rule{2.95cm}{0pt}}_{\mbox{Zahl: \lstinline|0x2B|}}$}
-    \pause
-    \put(1.55,0.3){$\underbrace{\rule{4.0cm}{0pt}}_{\mbox{\shortstack[t]{Umwandlung in Zeiger\\
-      auf \lstinline|volatile uint8_t|}}}$}
-    \pause
-    \put(1.32,-1){\makebox(0,0)[b]{\tikz{\draw[-latex](0,0)--(0,1.3)}}}
-    \put(1.12,-1.1){\makebox(0,0)[tl]{Dereferenzierung des Zeigers}}
-  \end{picture}
-
-  \pause
-  \textarrow\quad
-  \lstinline|volatile uint8_t|-Variable an Speicheradresse \lstinline|0x2B|
-
-  \pause
-  \bigskip
-  \bigskip
-
-  \textarrow\quad
-  \lstinline|PORTA = PORTB = PORTC = PORTD = 0| ist eine schlechte Idee.
-
-\end{frame}
-
-\subsection{Byte-Reihenfolge -- Endianness}
-\subsubsection{Konzept}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-  \showsubsubsection
-
-  Eine Zahl geht über mehrere Speicherzellen.\\
-  Beispiel: 16-Bit-Zahl in 2 8-Bit-Speicherzellen
-
-  \smallskip
-
-  Welche Bits liegen wo?
-
-  \pause
-  \bigskip
-
-  $1027 = 1024 + 2 + 1 = 0000\,0100\,0000\,0011_2 = 0403_{16}$
-
-  \pause
-  \bigskip
-  Speicherzellen:
-
-  \medskip
-  \begin{tabular}{|c|c|l}\cline{1-2}
-    \raisebox{-0.25ex}{04} & \raisebox{-0.25ex}{03} & \strut Big-Endian "`großes Ende zuerst"' \\\cline{1-2}
-    \multicolumn{2}{c}{} & \pause für Menschen leichter lesbar \pause \\
-    \multicolumn{3}{c}{} \\[-5pt]\cline{1-2}
-    \raisebox{-0.25ex}{03} & \raisebox{-0.25ex}{04} & \strut Little-Endian "`kleines Ende zuerst"' \\\cline{1-2}
-    \multicolumn{2}{c}{} & \pause bei Additionen effizienter
-  \end{tabular}
-
-  \pause
-  \medskip
-  \textarrow\ Geschmackssache
-  \pause\\
-  \quad\textbf{\dots\ außer bei Datenaustausch!}
-
-%  \pause
-%  \bigskip
-%
-%  Aber: nicht verwechseln! \qquad $0304_{16} = 772$
-
-\end{frame}
-
-\begin{frame}
-
-  \showsubsection
-  \showsubsubsection
-
-  Eine Zahl geht über mehrere Speicherzellen.\\
-  Beispiel: 16-Bit-Zahl in 2 8-Bit-Speicherzellen
-
-  \smallskip
-
-  Welche Bits liegen wo?
-
-  \medskip
-
-  \textarrow\ Geschmackssache\\
-  \textbf{\dots\ außer bei Datenaustausch!}
-
-  \begin{itemize}
-    \item
-      Dateiformate
-    \item
-      Datenübertragung
-  \end{itemize}
-
-\end{frame}
-
-\subsubsection{Dateiformate}
-
-\begin{frame}
-
-  \showsubsection
-  \showsubsubsection
-
-  Audio-Formate: Reihenfolge der Bytes in 16- und 32-Bit-Zahlen
-  \begin{itemize}
-    \item
-      RIFF-WAVE-Dateien (\file{.wav}): Little-Endian
-    \item
-      Au-Dateien (\file{.au}): Big-Endian
-    \pause
-    \item
-      ältere AIFF-Dateien (\file{.aiff}): Big-Endian
-    \item
-      neuere AIFF-Dateien (\file{.aiff}): Little-Endian
-  \end{itemize}
-
-  \pause
-  \bigskip
-
-  Grafik-Formate: Reihenfolge der Bits in den Bytes
-  \begin{itemize}
-    \item
-      PBM-Dateien: Big-Endian\only<4->{, MSB first}
-    \item
-      XBM-Dateien: Little-Endian\only<4->{, LSB first}
-  \end{itemize}
-  \only<4->{MSB/LSB = most/least significant bit}
-
-\end{frame}
-
-\subsubsection{Datenübertragung}
-
-\begin{frame}
-
-  \showsubsection
-  \showsubsubsection
-
-  \begin{itemize}
-    \item
-      RS-232 (serielle Schnittstelle): LSB first
-    \item
-      I$^2$C: MSB first
-    \item
-      USB: beides
-    \pause
-    \medskip
-    \item
-      Ethernet: LSB first
-    \item
-      TCP/IP (Internet): Big-Endian
-  \end{itemize}
-
-\end{frame}
-
-\subsection{Binärdarstellung negativer Zahlen}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  Speicher ist begrenzt!\\
-  \textarrow\ feste Anzahl von Bits
-
-  \medskip
-
-  8-Bit-Zahlen ohne Vorzeichen: \lstinline{uint8_t}\\
-  \textarrow\ Zahlenwerte von \lstinline{0x00} bis \lstinline{0xff} = 0 bis 255\\
-  \pause
-  \textarrow\ 255 + 1 = 0
-
-  \pause
-  \medskip
-
-  8-Bit-Zahlen mit Vorzeichen: \lstinline{int8_t}\\
-  \lstinline{0xff} = 255 ist die "`natürliche"' Schreibweise für $-1$.\\
-  \pause
-  \textarrow\ Zweierkomplement
-
-  \pause
-  \medskip
-
-  Oberstes Bit = 1: negativ\\
-  Oberstes Bit = 0: positiv\\
-  \textarrow\ 127 + 1 = $-128$
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  Speicher ist begrenzt!\\
-  \textarrow\ feste Anzahl von Bits
-
-  \medskip
-
-  16-Bit-Zahlen ohne Vorzeichen:
-  \lstinline{uint16_t}\hfill\lstinline{uint8_t}\\
-  \textarrow\ Zahlenwerte von \lstinline{0x0000} bis \lstinline{0xffff}
-  = 0 bis 65535\hfill 0 bis 255\\
-  \textarrow\ 65535 + 1 = 0\hfill 255 + 1 = 0
-
-  \medskip
-
-  16-Bit-Zahlen mit Vorzeichen:
-  \lstinline{int16_t}\hfill\lstinline{int8_t}\\
-  \lstinline{0xffff} = 66535 ist die "`natürliche"' Schreibweise für $-1$.\hfill
-  \lstinline{0xff} = 255 = $-1$\\
-  \textarrow\ Zweierkomplement
-
-  \medskip
-
-  Oberstes Bit = 1: negativ\\
-  Oberstes Bit = 0: positiv\\
-  \textarrow\ 32767 + 1 = $-32768$
-
-  \bigskip
-  Literatur: \url{http://xkcd.com/571/}
-
-\end{frame}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  Frage: \emph{Für welche Zahl steht der Speicherinhalt\,
-  \raisebox{2pt}{%
-    \tabcolsep0.25em
-    \begin{tabular}{|c|c|}\hline
-      \rule{0pt}{11pt}a3 & 90 \\\hline
-    \end{tabular}}
-  (hexadezimal)?}
-  
-  \pause
-  \smallskip
-  Antwort: \emph{Das kommt darauf an.} ;--)
-
-  \pause
-  \medskip
-  Little-Endian:
-
-  \smallskip
-
-  \begin{tabular}{lrl}
-    als \lstinline,int8_t,: & $-93$ & (nur erstes Byte)\\
-    als \lstinline,uint8_t,: & $163$ & (nur erstes Byte)\\
-    als \lstinline,int16_t,: & $-28509$\\
-    als \lstinline,uint16_t,: & $37027$\\
-    \lstinline,int32_t, oder größer: & $37027$
-      & (zusätzliche Bytes mit Nullen aufgefüllt)
-  \end{tabular}
-
-  \pause
-  \medskip
-  Big-Endian:
-
-  \smallskip
-
-  \begin{tabular}{lrl}
-    als \lstinline,int8_t,:   & $-93$ & (nur erstes Byte)\\
-    als \lstinline,uint8_t,:  & $163$ & (nur erstes Byte)\\
-    als \lstinline,int16_t,:  & $-23664$\\
-    als \lstinline,uint16_t,: & $41872$\\ als \lstinline,int32_t,:  & $-1550843904$ & (zusätzliche Bytes\\
-    als \lstinline,uint32_t,: & $2744123392$  & mit Nullen aufgefüllt)\\
-    als \lstinline,int64_t,:  & $-6660823848880963584$\\
-    als \lstinline,uint64_t,: & $11785920224828588032$\\
-  \end{tabular}
-
-  \vspace*{-1cm}
-
-\end{frame}
-
-\subsection{Speicherausrichtung -- Alignment}
-
-\begin{frame}[fragile]
-
-  \showsubsection
-
-  \begin{lstlisting}
-    #include <stdint.h>
-
-    uint8_t a;
-    uint16_t b;
-    uint8_t c;
-  \end{lstlisting}
-
-  \pause
-  \bigskip
-
-  Speicheradresse durch 2 teilbar -- "`16-Bit-Alignment"'
-  \begin{itemize}
-    \item
-      2-Byte-Operation: effizienter
-    \pause
-    \item
-      \dots\ oder sogar nur dann erlaubt
-    \pause
-    \arrowitem
-      Compiler optimiert Speicherausrichtung
-  \end{itemize}
-
-  \medskip
-
-  \pause
-  \begin{minipage}{3cm}
-    \begin{lstlisting}[gobble=6]
-      ¡uint8_t a;
-      uint8_t dummy;
-      uint16_t b;
-      uint8_t c;¿
-    \end{lstlisting}
-  \end{minipage}
-  \pause
-  \begin{minipage}{3cm}
-    \begin{lstlisting}[gobble=6]
-      ¡uint8_t a;
-      uint8_t c;
-      uint16_t b;¿
-    \end{lstlisting}
-  \end{minipage}
-
-  \pause
-  \vspace{-1.75cm}
-  \strut\hfill
-  \begin{minipage}{6.5cm}
-    Fazit:
-    \begin{itemize}
-      \item
-        \textbf{Adressen von Variablen\\
-        sind systemabhängig}
-      \item
-        Bei Definition von Datenformaten\\
-        Alignment beachten \textarrow\ effizienter
-    \end{itemize}
-  \end{minipage}
-
-\end{frame}
-
-\nosectionnonumber{\inserttitle}
-
-\begin{frame}
-
-  \shownosectionnonumber
-
-  \begin{itemize}
-    \item[\textbf{1}] \textbf{Einführung}
-      \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}}
-    \item[\textbf{2}] \textbf{Einführung in C}
-    \item[\textbf{3}] \textbf{Bibliotheken}
-    \item[\textbf{5}] \textbf{Algorithmen}
-      \begin{itemize}
-        \item[5.1] Differentialgleichungen
-        \item[5.2] Rekursion
-        \item[5.3] Aufwandsabschätzungen
-      \end{itemize}
-    \item[\textbf{4}] \textbf{Hardwarenahe Programmierung}
-      \begin{itemize}
-        \color{medgreen}
-        \item[4.1] Bit-Operationen
-        \item[4.2] I/O-Ports
-        \item[4.3] Interrupts
-        \item[4.4] volatile-Variable
-        \item[4.6] Byte-Reihenfolge -- Endianness
-        \item[4.7] Binärdarstellung negativer Zahlen
-        \item[4.8] Speicherausrichtung -- Alignment
-      \end{itemize}
-    \item[\textbf{\dots}]
-  \end{itemize}
-
-\end{frame}
-
 \end{document}