Hinher Lauflicht Ideal Loesung

Hinher Lauflicht

Beschreibung der Aufgabe

Entwickelt werden soll ein Lauflicht, dessen Aktionsbereich mit jeder Runde zunimmt und wenn es am rechten Rand angekommen ist, wieder abnimmt und immer so weiter.

Beschreibung des Problems

Das Programm muss Entscheidungen treffen können, um dieses Ergebnis zu erhalten. Befehle wie breq, brne, cp, cpi sind daher unerlässlich.

Code

.include "8515def.inc"
                            ; Hinher Lauflicht von unknown name

                            ; Nicht böse sein, es kann sein, dass ich hier
                            ; Befehle benutzt habe, die noch nicht im
                            ; Unterricht vorgekommen sind!!!

.def hinher =R16                ; Dieses Register enthält das Ergebnis 
.def weite =R17                ; Dieses wie weit das Lauflicht laufen darf

    ser hinher
    out DDRA, hinher             ; Das zählt nicht!!! => -2 Wörter = 21 Wörter!!!

    ldi hinher, 0b10000000
    ldi weite, 0b10000000        ; klar!!!

loop_weite_r:
    lsr weite                    ; Das Lauflicht darf eins weiter laufen

    rcall loop_hinher_r            ; Das Lauflicht laufen lassen

    cpi weite, 0b00000001
    brne loop_weite_r            ; Überprüfen, ob das Lauflicht schon am rechten Rand
                            ; angekommen ist, wenn ja, nächster Loop, wenn nicht,
                            ; Loop noch mal. Hier spart die Verwendung von brne
                            ; ein Wort

loop_weite_l:
    lsl weite                    ; Das Lauflicht muss eins weniger laufen

    rcall loop_hinher_r            ; s.o.

    cpi weite, 0b10000000
    breq loop_weite_r            ; Überprüfen, ob das Lauflicht schon am linkem Rand
                            ; angekommen ist, wenn ja, vorheriger Loop

    rjmp loop_weite_l            ; ist im Grunde klar!!

loop_hinher_r:
    out PORTA, hinher            ; Lauflicht anzeigen

    cp hinher, weite
    breq sprung_l                ; Überprüfen, ob das Lauflicht so weit ist, wie es
                            ; darf, sonst nächster Loop

    lsr hinher                    ; Lauflicht läuft nacht rechts

    rjmp loop_hinher_r            ; klar!!!

loop_hinher_l:
    lsl hinher                    ; Lauflicht läuft nach links. lsl ist hier vor dem
                            ; out, weil es ein Wort spart

    out PORTA, hinher            ; s.o.

sprung_l:                        ; neuer Einstiegspunkt für den Loop. Spart ein Wort
                            ; unter Verwendung von brne
    cpi hinher, 0b10000000
    brne loop_hinher_l            ; Überprüfen, ob das Lauflicht wieder links angekommen
                            ; ist, Wenn nicht, Loop nochmal, sonst:

    ret                        ; Springt zurück zu dem Punkt, wo rcall aufgerufen wurde
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License