\documentclass[10pt, a4paper]{report}
\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}
\usepackage{datetime}
\usepackage[]{amsmath} 
\usepackage[]{amsthm} 
\usepackage[]{amssymb}
\usepackage{listings}
\usepackage{xcolor}
\usepackage{fancyhdr}

\pagestyle{fancy}
\fancyhf{}
\lhead{Rechnerarchitekturen 1 - Praktikum A1 - WS 20/21}
\rfoot{Page \thepage}

\definecolor{codegreen}{rgb}{0,0.6,0}
\definecolor{codegray}{rgb}{0.5,0.5,0.5}
\definecolor{codepurple}{rgb}{0.58,0,0.82}
\definecolor{backcolour}{rgb}{0.95,0.95,0.92}

%Code listing style named "mystyle"
\lstdefinestyle{mystyle}{
  backgroundcolor=\color{backcolour},   
  commentstyle=\color{codegreen},
  keywordstyle=\color{magenta},
  numberstyle=\tiny\color{codegray},
  stringstyle=\color{codepurple},
  basicstyle=\ttfamily\footnotesize,
  breakatwhitespace=false,         
  breaklines=true,                 
  captionpos=b,                    
  keepspaces=true,                 
  numbers=left,                    
  numbersep=5pt,                  
  showspaces=false,                
  showstringspaces=false,
  showtabs=false,                  
  tabsize=2
}

%"mystyle" code listing set
\lstset{style=mystyle}

\newdateformat{myformat}{\THEDAY{ten }\monthname[\THEMONTH], \THEYEAR}

\title{Rechnerarchitekturen 1 - Praktikum A1}
\date\today
\begin{document}

\section*{ Grundaufgabe a: Funktionen ermitteln}
\begin{lstlisting}[language=Assembler]
; Programmbereich:
anf:    MOV   EDX,400000H  ;Groessee der Verzoegerung
        MOV   [verzoe],EDX ;Verzoegerung speichern

m1:     MOV   EDI,10    ;EDI=10
        MOV   ESI,OFFSET ziff   ;Adresse von ziff in ESI

m2:     MOV   AL,[ESI+EDI-1]    ;AL=ziff+9
        OUT   0B0H,AL   ;SiebenSegment schreibt AL
        CALL  zeit      ;warten
        DEC   EDI       ;EDI=EDI-1
        JNZ   m2        ;if(EDI!=0) goto m2

        MOV   AL,0FFH   ;AL=255 (dec)
m3:     OUT   5CH,AL    ;LED Reihe links schreiben
        NOT   AL        ;AL negieren
        OUT   5DH,AL    ;LED Reihe rechts schreiben
        CALL  zeit      ;warten
        MOV   BL,AL     ;Inhalt von AL wird noch gebraucht
        IN    AL,59H    ;Tastenreihe rechts lesen auf AL
        BT    EAX,7     ;Bit 7 von EAX in Carry Flag
        MOV   AL,BL     ;AL bekommt alten Wert zurueck
        JC    m1        ;if(m1==0) goto m1
        JMP   m3        ;goto m3 (Loop)

;zeit ist ein Unterprogramm, welches nur Zeit verbrauchen soll:
zeit:   MOV   ECX,[verzoe] ;Lade wartezeit
z1:     DEC   ECX       ;ECX=ECX-1
        JNZ   z1        ;if(ECX!=0) goto z1
        RET             ;zurueck zum Hauptprogramm

; Datenbereich:
verzoe  DD    ?         ;Eine Speicherzelle (Doppelwort)
ziff    DB    3FH,03H,6DH,67H,53H,76H,7EH,23H,7FH,77H
\end{lstlisting}

\begin{description}
    \item[anf] setzt die Länge der Wartezeit
    \item[m1] Lädt Register
    \item[m2] Zählt auf Sieben Segment Anzeige
    \item[m3] schreibt auf LED Reihe links und invertierend rechts
    \item[zeit] Verbraucht Zeit nach "verzoe"     
\end{description}

\clearpage

\section*{ Grundaufgabe b: Programmentwurf}
\subsection*{einfaches Lauflicht}
auf der rechten LED-Reihe soll ein sichtbarer Lichtpunkt von links nach rechts laufen und immer wieder von links beginnen

\begin{lstlisting}[language=Assembler]
anf:    MOV     EDX,400000H
        MOV     [verzoe],EDX

        MOV     AL, 80H     ;Startwert fuer LED Reihe
lauf:   OUT     5CH, AL     ;Wert auf LED Reihe schreiben
        CALL    zeit        ;warten
        ROR     AL, 1       ;Bits um 1 nach rechts 
        JMP     lauf        ;Schleife wiederholen

zeit:   MOV     ECX,[verzoe]
z1:     DEC     ECX
        JNZ     z1
        RET
\end{lstlisting}



\subsection*{Lauflicht mit Geschwindigkeitsumschalter}
das Lauflicht soll durch den linken Schalter zwischen "schnell" (Schalter oben) und "langsam" (Schalter unten) umschalten

\begin{lstlisting}[language=Assembler]
anf:    MOV     Al, 80H

lauf:   MOV     EDX, 400000H    ; Wert fuer "langsam"
        MOV     [verzoe], EDX   ;"langsam" in Speicher
        OUT     5CH, AL         ;LED Reihe schreiben
        MOV     BL, AL          ;AL speichern
        IN      AL, 58H         ;Schalter einlesen
        BT      AL, 7           ;7. Bit von AL in Carry Flag
        JNC     langsam         ;Carry Flag = 0, schalter unten
        MOV     EDX, 200000H    ; Wert fuer "schnell"
        MOV     [verzoe], EDX   ;"schnell" in Speicher
        CMC                     ;Carry Flag umschalten (0)

langsam: CALL   zeit            ;warten
        MOV     AL, BL          ;AL aus speicher zurueck
        ROR     AL,1            ;Bits um 1 nach rechts
        JMP     anf             ;Schleife wiederholen

zeit:   MOV     ECX,[verzoe]
z1:     DEC     ECX
        JNZ     z1
        RET
\end{lstlisting}

\clearpage

\subsection*{Lauflicht verändert Richtung}
zusätzlich zum oben implementierten soll die Bewegungsrichtung des Lichtpunktes durch den rechten Schalter der Schalterreihe zwischen "nach links" und "nach rechts" wechseln.

\begin{lstlisting}[language=Assembler]
anf:    MOV     Al, 80H
lauf:   MOV     EDX, 400000H    ; Wert fuer "langsam"
        MOV     [verzoe], EDX   ;"langsam" in Speicher
        OUT     5CH, AL         ;LED Reihe schreiben
        MOV     BL, AL          ;AL speichern
        IN      AL, 58H         ;Schalter einlesen
        BT      AL, 7           ;7. Bit von AL in Carry Flag
        JNC     langsam         ;Carry Flag = 0, Schalter unten
        MOV     EDX, 200000H    ; Wert fuer "schnell"
        MOV     [verzoe], EDX   ;"schnell" in Speicher
        CMC                     ;Carry Flag umschalten
langsam: CALL   zeit            ;warten
        MOV     AL, BL          ;AL aus speicher zurueck
        BT      AL, 0           ;0. Bit von AL in Carry Flag
        JNC     rechts          ;Carry Flag = 1; Schalter oben 
        ROL     AL,1            ;Bits um 1 nach links
        CMC                     ;Carry Flag umschalten (0)
        JMP     anf             ;Schleife wiederholen
rechts: ROR     AL, 1           ;Bits um 1 nach rechts
        JMP     anf             ;Schleife wiederholen
zeit:   MOV     ECX,[verzoe]
z1:     DEC     ECX
        JNZ     z1
        RET
\end{lstlisting}


\subsection*{Lauflicht mit Invertierung}
durch drücken einer beliebigen Taste der blauen Tastenreihe wird die Anzeige invertiert, d.h. der Lichtpunkt ist dunkel etc. Invertierung nur solange die Taste gedrückt wird.
\begin{lstlisting}[language=Assembler]
anf:    MOV     Al, 80H
lauf:   MOV     EDX, 400000H    ; Wert fuer "langsam"
        MOV     [verzoe], EDX   ;"langsam" in Speicher
        MOV     BL, AL          ;Kopie von AL anlegen
        IN      AL, 59H         ;Tastenreihe einlesen
        AND     AL, FFH         ;UND Operation mit FF
        JZ      nopress         ;kein Schalter gedrueckt
        NOT     BL              ;BL invertieren
        MOV     AL, BL          ;AL ueberschreiben
nopress: OUT    5CH, AL         ;LED Reihe schreiben
        IN      AL, 58H         ;Schalter einlesen
        BT      AL, 7           ;7. Bit von AL in Carry Flag
        JNC     langsam         ;Carry Flag = 0, Schalter unten
        MOV     EDX, 200000H    ; Wert fuer "schnell"
        MOV     [verzoe], EDX   ;"schnell" in Speicher
        CMC                     ;Carry Flag umschalten
langsam: CALL   zeit            ;warten
        MOV     AL, BL          ;AL aus speicher zurueck
        BT      AL, 0           ;0. Bit von AL in Carry Flag
        JNC     rechts          ;Carry Flag = 1; Schalter oben
        ROL     AL,1            ;Bits um 1 nach links
        CMC                     ;Carry Flag umschalten (0)
        JMP     anf             ;Schleife wiederholen
rechts: ROR     AL, 1           ;Bits um 1 nach rechts
        JMP     anf             ;Schleife wiederholen
zeit:   MOV     ECX,[verzoe]
z1:     DEC     ECX
        JNZ     z1
        RET
\end{lstlisting}


\subsection*{Zusatzaufgabe}
Erweiterungen des Programms nach eigenen Ideen:
\begin{itemize}
    \item symetrische LED Reihe zur Mitte
    \item Sieben Segment zählt 9 Schritte mit 
\end{itemize}
\begin{lstlisting}[language=Assembler]
anf:    MOV     Al, 80H
        MOV     EDI, 0 
        MOV     ESI, OFFSET ziff
lauf:   MOV     EDX, 400000H    ; Wert fuer "langsam"
        MOV     [verzoe], EDX   ;"langsam" in Speicher
        MOV     BL, AL          ;Kopie von AL anlegen
        IN      AL, 59H         ;Tastenreihe einlesen
        AND     AL, FFH         ;UND Operation mit FF
        JZ      nopress         ;kein Schalter gedrueckt
        NOT     BL              ;BL invertieren
        MOV     AL, BL          ;AL ueberschreiben
nopress: OUT    5CH,AL           ;LED Reihe links schreiben
        NOT     AL              ;AL negieren
        OUT     5DH,AL          ;LED Reihe rechts schreiben
        MOV     BH,[ESI+EDI-1]  ;Sieben Segment berechnen
        OUT     0B0H,BH         ;Sieben Segment schreiben
        DEC     EDI             ;Sieben Segment runterzaehlen
        JZ      timer           ;Timer auf 0 setzen
        IN      AL, 58H         ;Schalter einlesen
        BT      AL, 7           ;7. Bit von AL in Carry Flag
        JNC     langsam         ;Carry Flag = 0, Schalter unten
        MOV     EDX, 200000H    ; Wert fuer "schnell"
        MOV     [verzoe], EDX   ;"schnell" in Speicher
        CMC                     ;Carry Flag umschalten
langsam: CALL   zeit            ;warten
        MOV     AL, BL          ;AL aus speicher zurueck
        BT      AL, 0           ;0. Bit von AL in Carry Flag
        JNC     rechts          ;Carry Flag = 1; Schalter oben
        ROL     AL,1            ;Bits um 1 nach links
        CMC                     ;Carry Flag umschalten (0)
        JMP     anf             ;Schleife wiederholen
rechts: ROR     AL, 1           ;Bits um 1 nach rechts
        JMP     anf             ;Schleife wiederholen
timer:  MOV     BH, 0FFH
        RET 
zeit:   MOV     ECX,[verzoe]
z1:     DEC     ECX
        JNZ     z1
        RET
\end{lstlisting}
\end{document}