*
* Eine einfache Copperlist, dynamisch generiert!
*
* written on 30/10/89  15:16:12  by Holger Gzella
*

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

StartIt:        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   d0,a0                  * Copperlist nach a0

                moveq.w  #43,d0                 * Start bei Zeile 43
                move.w   #$111,d1               * grauer Farbverlauf
                moveq.w  #$0,d5                 * schwarzer Vordergrund
                bsr      CopCom

                moveq.w  #126,d0                * Start bei Zeile 126
                moveq.w  #$001,d1               * blauer Farbverlauf
                moveq.w  #$0,d5                 * schwarze Vordergrundfarbe
                bsr      CopCom

                move.w   #209,d0                * Start bei Zeile 209
                moveq.w  #$010,d1               * grüner Farbverlauf
                moveq.w  #$0,d5                 * schwarze Vordergrundfarbe
                bsr      CopCom

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

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

*
* Hier könnte jetzt ein wahnsinnig gutes Hauptprogramm stehen.
*

MouseLoop:      btst.b   #6,$bfe001             * Maustaste abfragen
                bne.s    MouseLoop              * 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   #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

*
* Die Unterroutine, um einen Farbverlauf zu errechnen ...
*
* Es werden folgende Parameter benötigt:
*
* D0 - Startposition des Verlaufs
* D1 - Startwert der Hintergrundfarbe
* D5 - Startwert der Vordergrundfarbe
*

CopCom:         move.w  #0,d2                   * Hilfsregister 1 löschen
                move.w  #0,d6                   * Hilfsregister 2 löschen
                move.l  #$e,d3                  * $e (=#14) +1 Abstufungen ->
                lsl.w   #8,d0                   * Position heraufrechnen
                ori.b   #$f,d0
cop1:           add.w   d1,d2                   * HGrundfarbe + Hilfsreg 1
                add.w   d5,d6                   * Schriftfarbe + Hilfsreg 2
                move.w  d0,(a0)+                * in die Copperliste (=WAIT)
                move.l  #$fffe0180,(a0)+        * MOVE ins HGrund-Register
                move.w  d2,(a0)+                * Farbe reinschreiben
                move.w  d0,(a0)+                * WAIT
                move.l  #$fffe0182,(a0)+        * MOVE ins VGrund-Register
                move.w  d6,(a0)+                * Farbe rein
                addi.w  #$200,d0                * übernächste Rasterzeile
                dbra    d3,cop1                 * 15 mal (14+1)

*
* Jetzt kommt das ganze noch für die Rückabstufung. Statt den
* Anfangs-Farbwert zu addieren, wird er jetzt subtrahiert.
* Der Rest verläuft äquivalent.
*

                move.l  #$e,d3
cop2:           sub.w   d1,d2
                sub.w   d5,d6
                move.w  d0,(a0)+
                move.l  #$fffe0180,(a0)+
                move.w  d2,(a0)+
                move.w  d0,(a0)+
                move.l  #$fffe0182,(a0)+
                move.w  d6,(a0)+
                addi.w  #$200,d0
                dbra    d3,cop2

                rts                             * Rücksprung an Aufrufenden

*
* Auch hier wieder ein Datenteil ...
*

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

CopperList:     dc.l     0

                END

