*
* Copper-Cycling über die Hardware!
*
* written on 30/10/89  19:56:50  by Holger Gzella
*

                incdir "asm:"
                include "exec/exec_lib.i"
                include "libraries/dos_lib.i"

StartIt:        lea     DosName,a1              * DOS-Library öffnen
                moveq.l #0,d0
                CALLEXEC OpenLibrary
                move.l  d0,DosBase

                move.l  #2000,d0                * 2000 Bytes
                move.l  #$10002,d1              * CHIP-Memory
                CALLEXEC AllocMem               * allokieren
                tst.l   d0                      * alles klar?
                beq     Fault                   * nein - beenden!
                move.l  d0,CopperList           * Zeiger sichern

*
* Jetzt wird die Maschine übernommen.
*

                CALLEXEC Forbid                 * kein Multitasking
                move.w  #$3a0,$DFF096           * Copper-, Sprite- und
                                                * Bitplane-DMA sowie DMAEN
                                                * löschen

                move.l  CopperList,a0           * Copperlist nach a0

*
* Nun wird die Copperlist aufgebaut ...
*

                move.w  #$180,(a0)+             * schwarzer Hintergrund
                move.w  #$000,(a0)+             * bis zur Zeile

                move.l  #$9001,d0               * 144
                lea     Colors,a1               * Farben laden
                moveq.w #15,d1                  * 16 Abstufungen

SetEntry:       move.w  d0,(a0)+                * WAIT-Position schreiben
                move.w  #$fffe,(a0)+            * Maske schreiben
                move.w  #$180,(a0)+             * Hintergrund-Register
                move.w  (a1)+,(a0)+             * entsprechende Farbe
                add.w   #$0100,d0               * y-Koordinate erhöhen
                dbra    d1,SetEntry             * bis zum Schluß!

                move.w  #$180,(a0)+             * der Rest soll Schwarz
                move.w  #$000,(a0)+             * dargestellt werden
                move.l  #$fffffffe,(a0)         * und Ende ...

                move.l  CopperList,$DFF080      * List manipulieren
                move.l  #0,$DFF088              * COPJMP1 löschen

                move.w  #$8280,$DFF096          * Copper-DMA und DMAEN
                                                * aktivieren

*
* Dies ist die Cycling-Routine ...
*

                move.l  DosBase,a6

CycleLoop:      move.l  CopperList,a0           * Zeiger einladen
                add.l   #10,a0                  * auf das erste MOVE-
                                                * Statement richten
                lea     Colors,a1               * Farben laden

                cmp.l   #0,Offset               * Offset 0?
                bne.s   CompDirect              * nein - weiter

*
* Diese Stelle wird erreicht, wenn die hellblaue Farbe
* den oberen Rand des Scrollstreifens erreicht hat (also
* wurde vorher nach oben gescrollt). Jetzt wird die
* Richtung geändert und nach unten gescrollt.
*

                move.l  #1,Direction            * Richtung: nach untne

CompDirect:     cmp.l   #0,Direction            * nach oben scrollen?
                beq.s   ScrollUp                * freilich!

*
* Dieser Code wird ausgeführt, wenn die Scrollrichtung
* nach unten verläuft - der Offset wird erhöht.
*

                addq.l  #2,Offset               * Offset erhöhen
                bra.s   Compare                 * und weiter

*
* Wenn diese Stelle erreicht wird, läuft das Scrolling nach
* oben. Also muß der Offset erniedrigt werden.
*

ScrollUp:       subq.l  #2,Offset               * Offset -2

Compare:        cmp.l   #31,Offset              * Offset 31?
                ble.s   ChangeEntry             * nein!

                move.l  #0,Direction            * Richtung ändern

*
* Diese Stelle wird praktisch immer ausgeführt.
*

ChangeEntry:    add.l   Offset,a1               * Offset zur Farbtabelle
                                                * addieren
                moveq   #15,d0                  * 16 Abstufungen

ChangeColor:    move.w  (a1)+,(a0)              * entsprechende Farbe laden
                addq.l  #8,a0                   * Zeiger auf die nächste
                                                * MOVE-Instruktion richten
                dbra    d0,ChangeColor          * bis wir fertig sind!

                moveq.l #1,d1                   * 1/50stel Sekunde
                jsr     _LVODelay(a6)           * warten

                btst.b  #6,$bfe001              * Maustaste abfragen
                bne.s   CycleLoop               * nicht gedrückt!

*
* Nun wird der ursprüngliche Zustand wieder hergestellt.
*

                lea     GfxName,a1              * Graphics öffnen
                moveq.l #0,d0
                CALLEXEC OpenLibrary
                move.l  d0,a1

                move.l  38(a1),$DFF080          * System-List wieder
                                                * aktivieren

                CALLEXEC CloseLibrary           * Graphics schließen

                move.l  DosBase,a1              * DOS schließen
                CALLEXEC CloseLibrary

                move.l  #0,$DFF088              * COPJMP1 löschen
                move.w  #$83e0,$DFF096          * Copper-, Blitter-, Sprite-
                                                * und Bitplane-DMA sowie
                                                * DMAEN aktivieren

                CALLEXEC Permit                 * Multitasking erlauben

                move.l  CopperList,a1           * Copperlist im
                move.l  #2000,d0                * CHIP-RAM wieder
                CALLEXEC FreeMem                * deallokieren

Fault:          moveq   #0,d0                   * Ende!
                rts

*
* Auch hier wieder ein Datenteil ...
*

GfxName:        dc.b     "graphics.library",0
 even
DosName:        dc.b     "dos.library",0
 even

DosBase:        dc.l     0
CopperList:     dc.l     0
Offset:         dc.l     0                      * Offset innerhalb der
                                                * Farbtabelle
Direction:      dc.l     1                      * Scrollrichtung: 1=unten
                                                *                 0=oben

*
* Die folgenden DC.Ws beinhalten die Farben -
* hier handelt es sich um Hellblau-Töne.
*

Colors:         dc.w     $00F,$01F,$02F,$03F,$04F,$05F,$06F,$07F
                dc.w     $08F,$09F,$0AF,$0BF,$0CF,$0DF,$0EF,$0FF
                dc.w     $0EF,$0DF,$0CF,$0BF,$0AF,$09F,$08F,$07F
                dc.w     $06F,$05F,$04F,$03F,$02F,$01F,$00F

                END

