*
* Playfield-Demo
*
* written on 4/11/89  11:43:16  by Holger Gzella
*

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

MEMREQS         EQU     $10000|$2               * CHIP u. clear

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

                move.l  d0,a6
                lea     TextAttr,a0             * Font
                jsr     _LVOOpenFont(a6)        * öffnen
                move.l  d0,Font

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

                move.l  #40*256,d0              * Speicher
                move.l  #MEMREQS,d1             * für Bitplane
                CALLEXEC AllocMem               * allokieren
                tst.l   d0                      * hat's geklappt?
                beq     Fault2                  * nein!
                move.l  d0,Bitplane             * Zeiger retten

                lea     Text,a0                 * Text laden
                move.l  #320,d0                 * 320 Pixel/Zeile
                move.l  Font,a1                 * Font laden
                move.l  34(a1),a1               * charData holen
                move.l  Bitplane,a2             * Plane laden
                add.l   #(40*108)+6,a2          * Position holen
                bsr     FastText                * und Text ausgeben

*
* Jetzt wird die Maschine übernommen.
*

                CALLEXEC Forbid                 * kein Multitasking
                move.w  #$3e0,$DFF096           * Copper-, Sprite- und
                                                * andere DMAs sowie DMAEN
                                                * löschen

*
* Nun wird die Copperlist erstellt - ein Farbverlauf mit
* den Farben, die in der Tabelle im Datenteil stehen ...
*

                move.l  CopperList,a0           * Copperlist nach a0
                move.l  Bitplane,d2             * Bitplane nach d2
                swap    d2                      * auf oberes Word richten

*
* Hier werden erstmal die Bitplane-Zeiger zurückgesetzt.
*

                move.w  #$0E0,(a0)+             * Register: BPL1PTH
                move.w  d2,(a0)+                * oberes Word des Plane-
                                                * zeigers setzen
                move.w  #$0E2,(a0)+             * Register: BPL1PTL
                swap    d2                      * unteres Word holen
                move.w  d2,(a0)+                * und setzen

*
* Jetzt geht's recht normal weiter ...
*

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

                move.w  #$8a01,d0               * Verlauf ab Zeile #138 ($8a)
                lea     Colors,a1               * Hintergrundfarben laden
                lea     Colors2,a2              * Vordergrundfarben laden

                moveq.w #30,d1                  * 30+1=31 Abstufungen

SetEntry:       move.w  d0,(a0)+                * Position in die Liste
                move.w  #$fffe,(a0)+            * Maske in die Liste
                move.w  #$180,(a0)+             * Hintergrund-Register
                move.w  (a1)+,(a0)+             * und Tabellen-Farbwert 1
                move.w  #$182,(a0)+             * Vordergrund-Register 1
                move.w  (a2)+,(a0)+             * und Tabellen-Farbwert 2
                add.w   #$0100,d0               * y-Position erhöhen
                dbra    d1,SetEntry             * bis zum bitteren Ende!

                move.w  #$180,(a0)+             * der Rest soll
                move.w  #$000,(a0)+             * schwarz sein!
                move.l  #$fffffffe,(a0)         * Ende!

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

                move.w  #$2981,$DFF08E          * DIWSTRT setzen
                move.w  #$29C1,$DFF090          * DIWSTOP setzen
                move.w  #$0038,$DFF092          * DDFSTRT setzen
                move.w  #$00D0,$DFF094          * DDFSTOP setzen
                move.w  #$1000,$DFF100          * 1 Plane - BPLCON0 setzen
                move.w  #0,$DFF102              * kein Scrolling
                move.w  #0,$DFF104              * kein Dual-Playfield
                move.w  #0,$DFF108              * kein Modulo
                move.w  #0,$DFF10A              * soll benutzt werden

                move.w  #$83C0,$DFF096          * alle wichtigen DMAs und
                                                * und DMAEN aktivieren

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

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

                move.l  GfxBase,a1              * Graphics laden
                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          * deaktivierte
                                                * DMA-Kanäle wieder
                                                * einschalten

                CALLEXEC Permit                 * Multitasking erlauben

                move.l  Bitplane,a1             * Bitplane im
                move.l  #40*256,d0              * CHIP-Speicher
                CALLEXEC FreeMem                * deallokieren

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

Fault:          moveq   #0,d0                   * Ende!
                rts

*
* Unterprogramme ...
*

*
* Diese Routine dient der schnellen Textausgabe mit dem
* "Topaz.font" der Höhe 8. Als Parameter müssen übergeben werden:
*
* D0: Breite der Bitplane in Pixeln
* A0: Zeiger auf den auszugebenden Text.
* A1: Zeiger auf die Font-Daten des Fonts.
* A2: Zeiger auf die Bitplane, in die der Text geschrieben werden soll.
*

FastText:       movem.l d0-d3/a3/a5,-(SP)       * Register retten

                move.l  a1,a5                   * Font-Daten retten
                lsr.w   #3,d0                   * Breite in Pixeln

GetNext:        move.b  (a0)+,d1                * nächstes Zeichen holen
                beq.s   EndOfIt                 * Nullbyte? Dann beenden!

                sub.b   #32,d1                  * andernfalls den Offset
                                                * richten
                move.l  a5,a1                   * Font-Daten holen
                add.l   d1,a1                   * Offset setzen

                moveq   #7,d2                   * Höhe=7+1=8 Pixel
                move.l  a2,a3                   * Plane retten

StoreIt:        move.b  (a1),(a3)               * Daten kopieren
                add.l   #40,a3                  * nächste Zeile der Plane
                add.l   #$c0,a1                 * nächste Zeile des Fonts
                dbra    d2,StoreIt              * bis zum Ende!

                addq.l  #1,a2                   * 1 Byte=8 Pixel weiter
                bra.s   GetNext                 * nächsten Buchstaben
                                                * holen

EndOfIt:        movem.l (SP)+,d0-d3/a3/a5       * Register holen
                rts                             * zurück

*
* Auch hier wieder ein Datenteil ...
*

GfxName:        dc.b     "graphics.library",0
 even
FontName:       dc.b     "topaz.font",0
 even

Text:           dc.b     "*** P L A Y F I E L D ! ***",0
 even

GfxBase:        dc.l     0
Font:           dc.l     0

CopperList:     dc.l     0                      * Zeiger auf die Copperlist
Bitplane:       dc.l     0                      * Zeiger auf die Plane

TextAttr:       dc.l     FontName
                dc.w     8
                dc.b     0,1

*
* Dies sind die Farben des Verlaufs. Setzen Sie ruhig Ihre
* eigenen Farbwerte im Amiga-RGB-Format ein (hier sind es
* Orange-Werte), aber achten Sie darauf, nicht mehr als 30
* Einträge zu verwenden oder ändern Sie die Verlaufsroutine.
*

Colors:         dc.w     $F00,$F10,$F20,$F30,$F40,$F50,$F60,$F70,$F80
                dc.w     $F90,$FA0,$FB0,$FC0,$FD0,$FE0,$FF0,$FE0,$FD0
                dc.w     $FC0,$FB0,$FA0,$F90,$F80,$F70,$F60,$F50,$F40
                dc.w     $F30,$F20,$F10,$F00

*
* Hier sind noch ein paar coole, blaue Werte für
* die Vordergrundfarbe ...
*

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

                END

