*
* I N T R O G E N  --  write a boot-intro with your
*                      own text in the bootblock!
*
* created on 3/12/89  12:22:22  by Holger Gzella
*
* Es ist der 1. Advent!
*

                incdir "asm:"
                include "exec/exec_lib.i"
                include "libraries/dos_lib.i"
                include "graphics/graphics_lib.i"
                include "intuition/intuition_lib.i"
                include "intuition/intuition.i"

Flags           EQU     WINDOWDRAG|WINDOWDEPTH|ACTIVATE
AFlags          EQU     GADGIMMEDIATE|RELVERIFY
SFlags          EQU     AFlags|TOGGLESELECT|STRINGCENTER

MEMREQS         EQU     $10000|$2               * CHIP sowie clear

                lea     IntuiName,a1
                CALLEXEC OldOpenLibrary         * Intuition öffnen
                move.l  d0,IntuiBase            * Zeiger sichern
                beq     MemFault                * bei Fehler abbrechen

                move.l  IntuiBase,a6
                lea     WindowData,a0
                jsr     _LVOOpenWindow(a6)      * Fenster öffnen
                move.l  d0,WindowPtr            * Zeiger sichern
                beq     FileFault               * oder Abbruch

                move.l  #1024,d0                * 1024 Bytes
                move.l  #MEMREQS,d1             * CHIP-Memory für
                CALLEXEC AllocMem               * Bootblock reservieren
                move.l  d0,Data                 * Zeiger sichern
                beq     FileFault               * oder Abbruch

*
* Nun muß per IDCMP gewartet werden, bis
* irgendein Gadget angeklickt wird!
*

MessageLoop:    move.l  WindowPtr,a0
                move.l  $56(a0),a0
                move.l  a0,a5
                move.b  $0f(a0),d1
                moveq   #0,d0
                bset    d1,d0
                CALLEXEC Wait                   * auf Nachricht warten

                move.l  a5,a0
                CALLEXEC GetMsg                 * Nachricht holen
                move.l  d0,a1
                move.l  $14(a1),d4              * diverse
                move.l  $18(a1),d5              * Parameter
                move.l  $1c(a1),a4              * sichern
                CALLEXEC ReplyMsg               * Nachricht beantworten

                cmpi.l  #GADGETUP,d4            * Gadget angeklickt?
                beq.s   ParseGadgets            * auswerten!

                bra.s   MessageLoop             * war was anderes

*
* Es folgt die Routine zur Auswertung
* des betätigten Gadgets!
*

ParseGadgets:   move.l  $24(a4),d0              * Gadget-ID laden
                cmpi.w  #1,d0                   * Gadget Nr. 1?
                beq.s   Info                    * Version anzeigen
                cmpi.w  #2,d0                   * Gadget Nr. 2?
                beq.s   InstallDf0              * Bootblock auf DF0:
                cmpi.w  #3,d0                   * Gadget Nr. 3?
                beq.s   InstallDf1              * Bootblock auf DF1:
                cmpi.w  #4,d0                   * Gadget Nr. 4?
                beq     FileFault               * ENDE!

                bra.s   MessageLoop             * zurück ...

*
* Version anzeigen (mit einem Intuition-Automatik-Requester) ...
*

Info:           move.l  WindowPtr,a0
                lea     BodyText,a1             * Versionstext
                lea     LeftText,a2             * Text d. linken Gadgets
                lea     RightText,a3            * Text d. rechten Gadgets
                moveq.l #0,d0                   * nur anklicken
                moveq.l #0,d1                   *       "
                move.w  #330,d2                 * 330 Pixel breit
                moveq.w #80,d3                  * 80 Pixel hoch
                move.l  IntuiBase,a6
                jsr     _LVOAutoRequest(a6)     * und anzeigen
                bra     MessageLoop             * zurück

*
* Bootblock auf die Disk in DF0: schreiben ...
*

InstallDf0:     move.l  #0,Drive                * Drive=DF0:
                bra.s   PatchBlock              * Intro schreiben

*
* Bootblock auf die Disk in DF1: schreiben ...
*

InstallDf1:     move.l  #1,Drive                * Drive=DF1:

*
* Bootblock ins CHIP-Memory kopieren ...
*

PatchBlock:     move.l  Data,a1                 * Zeiger auf CHIP-Block
                move.l  #BootHeader,a0          * und Bootblock holen
                move.l  #1023,d0                * Größe: 1Kbyte

copy:           move.b  (a0)+,(a1)+             * Bootblock ins CHIP-
                dbra    d0,copy                 * Memory kopieren

*
* Checksumme berechnen ...
*

CompCheckSum:   lea     BootHeader,a0           * Bootblock-Zeiger nach a0
                move.l  (a0),d0                 * Adresse nach d0
                add.l   #8,a0                   * 8 addieren
                move.l  #1016/4-1,d7            * Anzahl Longwords nach d7

AddLoop:        add.l   (a0)+,d0                * Longwords addieren
                bcs.s   Overflow                * Übertrag?

EndOverflow:    dbra    d7,AddLoop              * bis alle addiert
                addq.l  #1,d0                   * Zähler erhöhen
                neg.l   d0                      * negieren

                bra.s   GoForIt                 * und schreiben!

Overflow:       addq.l  #1,d0                   * Zähler erhöhen und

                bra.s   EndOverflow             * Übertrag ignorieren

*
* Jetzt wird der Bootblock auf die Diskette geschrieben!
*

GoForIt:        move.l  Data,a0                 * Zeiger auf Block suchen
                add.l   #4,a0                   * auf Checksumme richten
                move.l  d0,(a0)                 * Checksumme speichern

*
* Zuerst muß ein MsgPort bereitgestellt werden!
*

                sub.l   a1,a1
                CALLEXEC FindTask               * Task suchen
                move.l  d0,ReplyPort+$10        * MsgPort
                lea     ReplyPort,a1            * initialisieren und
                CALLEXEC AddPort                * einfügen

*
* Erst dann können wir das Device öffnen ...
*

                lea     DiskIO,a1               * IOTrackDisk laden
                move.l  Drive,d0                * Laufwerks-Unit laden
                moveq   #0,d1                   * keine Spezial-Flags
                lea     DevName,a0              * Name des Devices
                CALLEXEC OpenDevice             * Device öffnen
                tst.l   d0                      * hat's geklappt?
                bne.s   Abort                   * nein ... Abbruch!!!

*
* Scheint soweit alles in Ordnung zu sein.
* Dann können wir versuchen, das Intro zu schreiben!
*

                lea     DiskIO,a1               * IOTrackDisk laden
                move.l  #ReplyPort,14(a1)       * MsgPort laden
                move    #3,28(a1)               * Kommando: schreiben
                move.l  Data,a0                 * Daten: Bootblock
                move.l  a0,40(a1)               * Adresse setzen
                move.l  #1024,36(a1)            * Größe
                move.l  #0,44(a1)               * sonstiges
                CALLEXEC DoIO                   * ausführen

                lea     DiskIO,a1               * IOTrackDisk laden
                move    #4,28(a1)               * Kommando: update
                CALLEXEC DoIO                   * ausführen

                lea     DiskIO,a1               * IOTrackDisk laden
                move    #9,28(a1)               * Kommando: Motor
                move.l  #0,36(a1)               * ausschalten
                CALLEXEC DoIO                   * ausführen!

*
* Wir dürften fertig sein ...
*

                lea     DiskIO,a1
                CALLEXEC CloseDevice            * Device schließen

Abort:          lea     ReplyPort,a1
                CALLEXEC RemPort                * Port entfernen

                bra     MessageLoop             * zurück!

*
* Hier werden Vorbereitungen für
* das Programmende getroffen!
*

FileFault:      move.l  Data,a1                 * Memory für den
                move.l  #1024,d0                * Bootblock
                CALLEXEC FreeMem                * freigeben

MemFault:       move.l  IntuiBase,d0            * konnte Intuition
                tst.l   d0                      * geöffnet werden?
                beq.s   GoHome                  * nein!

DosLibFault:    move.l  WindowPtr,d0            * konnte Window
                tst.l   d0                      * geöffnet werden?
                beq.s   IntuiFault              * nein!

                move.l  d0,a0
                move.l  IntuiBase,a6
                jsr     _LVOCloseWindow(a6)     * Window schließen

IntuiFault:     move.l  IntuiBase,a1
                CALLEXEC CloseLibrary           * Intuition schließen

*
* Und Schluß ...
*

GoHome:         moveq   #0,d0
                rts

*
* Datenteil ...
*

IntuiName:      dc.b "intuition.library",0
 even
DevName:        dc.b "trackdisk.device",0
 even

*
* Das ist der Kopf des Bootblocks!
*

 even
BootHeader:     dc.b "DOS",0                    * bootfähige Diskette
                dc.l $00000000,$00000370        * Feld für Checksum
                                                * und Rootblock

*
* Hier steht das eigentliche Boot-Intro ...
*

Block:          movem.l d0-d7/a0-a6,-(SP)       * Register retten

StartIt:        lea     FontName(pc),a0         * Font anpassen
                lea     TextAt(pc),a1
                move.l  a0,(a1)

                lea     GfxName(pc),a1          * Graphics öffnen
                moveq.l #0,d0
                CALLEXEC OpenLibrary
                lea     GfxBase(pc),a0
                move.l  d0,(a0)

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

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

                move.l  #52*345,d0              * Speicher
                move.l  #MEMREQS,d1             * für Bitplane
                CALLEXEC AllocMem               * allokieren
                tst.l   d0                      * hat's geklappt?
                beq     Fault2                  * nein!
                lea     Bitplane(pc),a0
                move.l  d0,(a0)                 * Zeiger retten

*
* 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(pc),a0       * Copperlist nach a0
                move.l  Bitplane(pc),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  #$6401,d0               * Verlauf ab Zeile 100 ($64)
                lea     Colors(pc),a1           * Hintergrundfarben laden
                lea     Colors2(pc),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(pc),$DFF080  * List manipulieren
                move.w  #0,$DFF088              * COPJMP1 löschen

                move.w  #$1AC4,$DFF08E          * DIWSTRT setzen
                move.w  #$39D8,$DFF090          * DIWSTOP setzen
                move.w  #$0020,$DFF092          * DDFSTRT setzen
                move.w  #$00D8,$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  #4,$DFF108              * ein Modulo von vier
                move.w  #4,$DFF10A              * soll benutzt werden

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

*
* Hier steht die Routine für das Copper-Rolling ...
*

                moveq.l #0,d6                   * Scrollzähler löschen
                lea     Text(pc),a6             * Scrolltext nach a6

                lea     LineCounter(pc),a4
                lea     Direction(pc),a5
                move.l  #100,(a4)               * fängt ab Zeile 100 an
                move.l  #1,(a5)                 * Richtung: nach unten!

RolLoop:        move.l  CopperList(pc),a0       * Liste laden
                add.l   #12,a0                  * Zeiger auf 1. WAIT

                cmp.l   #200,(a4)               * Zeile 200 erreicht?
                blo.s   IsItTop                 * nein, noch nicht

*
* Dieser Teil wird ausgeführt, wenn die Rasterzeile 200
* von unserem Balken erreicht worden ist, und ändert die Richtung:
* statt nach unten rollt der Balken nach oben bis zur Zeile 100!
*

                move.l  #0,(a5)                 * Richtung: nach oben!

IsItTop:        cmp.l   #100,(a4)               * Zeile 100 erreicht?
                bhi.s   RollIt                  * höher?

                move.l  #1,(a5)                 * Richtung: nach unten

*
* Der jetzt kommende Teil wird auf jeden Fall ausgeführt
* und schiebt den Balken eine Rasterzeile nach oben oder unten.
*

RollIt:         cmp.l   #1,(a5)                 * nach unten rollen?
                beq.s   RollDown                * jawoll!

*
* Anscheinend soll nach oben gerollt werden. Nun denn, der
* Amiga macht's möglich; sehen Sie selbst!
*

RollUp:         moveq   #30,d0                  * 30+1=31 Zeilen rollen
                                                * (dies ist die Höhe des
                                                * Balkens, tatsächlich
                                                * gerollt wird natürlich
                                                * nur jede Zeile einmal)

RollCopper1:    sub.w   #$0100,(a0)             * Zeilennummer der WAIT-
                                                * Instruktion -1
                add.l   #12,a0                  * 12 Bytes weiter steht
                                                * der nächste WAIT!
                dbra    d0,RollCopper1          * bis zum Ende rollen ...

                subq.l  #1,(a4)                 * Zeilenzähler -1
                bra     Finished                * fertig gerollt!

*
* Wie's das Schicksal so will, soll nach unten gerollt
* werden, was aber keine Schwierigkeiten bereiten dürfte.
*

RollDown:       moveq   #30,d0                  * 30+1=31 Zeilen des
                                                * Balkens rollen

RollCopper2:    add.w   #$100,(a0)              * Zeilennummer der be-
                                                * treffenden WAIT-
                                                * Instruktion erhöhen
                add.l   #12,a0                  * nach 12 Bytes kommt der
                                                * nächste WAIT-Befehl
                dbra    d0,RollCopper2          * bis zum Ende rollen!

                addq.l  #1,(a4)                 * Zeilenzähler erhöhen

Finished:       movem.l d0/a0/a4/a5,-(SP)

ScrollIt:       and.l   #$7,d6                  * sind alle 8 Pixel dieses
                                                * Buchstabens dargestellt?
                bne.s   ScrollOn                * nein ... weiterscrollen

*
* Dieser Abschnitt setzt den Font-Daten-Zeiger
* auf die letzte Zeile des Fonts.
*

                move.l  FontBase(pc),a0         * Font-Basis holen
                move.l  34(a0),a3               * Zeiger auf Font-Daten
                move.w  38(a0),d4               * Modulo des Fonts
                move.w  d4,d5
                mulu    #7,d4                   * mal die Höhe des Fonts
                add.l   d4,a3                   * Zeiger auf die letzte Zeile
                                                * der Font-Daten richten

*
* Hier wird der nächste, "hereinzuscrollende"
* Buchstabe aus dem Textstring geholt.
*

                moveq.l #0,d1

                move.b  (a6)+,d1                * nächsten Buchstaben laden
                bne.s   NotTheLast              * sollte dieser kein Nullbyte
                                                * sein, wird gescrollt, an-
                                                * sonsten der erste Buchstabe
                                                * geladen!

                lea     Text(pc),a6             * Textadresse laden
                move.b  (a6)+,d1                * Buchstaben holen

NotTheLast:     cmp.b   #127,d1                 * Sonderzeichen???
                bls.s   NoSpecialChar           * nein, alles bestens!

*
* Falls im Text ein Sonderzeichen (z.B. ein Umlaut)
* vorkommt, muß dessen ASCII-Code um 32 herunter-
* gerechnet werden, da die Zeichen mit den Codes
* 128 bis 159 ($80 bis $9f) im "topaz"-Datenblock
* nicht definiert sind. Da Sonderzeichen ASCII-Codes
* von größer als 128 haben, müssen die nicht defi-
* nierten Zeichen übersprungen werden.
*

                sub.b   #32,d1                  * $80-$9f überspringen

*
* Auch die ASCII-Codes $00-$1f (0-31) sind nicht
* im "topaz.font"-Datenblock definiert (aus be-
* greiflichen Gründen - sie sind nicht darstellbar!).
* Somit hat JEDES darstellbare Zeichen einen ASCII-Code
* von 32 oder darüber und muß um 32 Codes herunter-
* gerechnet werden.
*

NoSpecialChar:  sub.b   #32,d1                  * $00-$1f überspringen

                add.l   d1,a3                   * Zeiger korrekt setzen

ScrollOn:       move.l  Bitplane(pc),a0         * Bitplane-Zeiger laden

                add.l   #143*52,a0              * Position (Zeile 128) setzen
                move.l  #7,d1                   * 8 Zeilen scrollen

                move.l  a3,a5                   * Zeiger retten

*
* Für ein fließendes Scrolling ist es wichtig, zu warten, bis
* der Elektronenstrahl die richtige Position erreicht hat.
*

BeamSyncLoop:   move.l  $DFF004,d3              * Rasterstrahl-Position
                and.l   #$1ff00,d3              * nur vertikale Position
                cmp.l   #$08000,d3              * richtige Zeile (#128)?
                bne.s   BeamSyncLoop            * nein!

*
* Hier beginnt das eigentliche Scrolling.
*

                add.b   #$8,d6                  * Scrollzähler auf Word-
                                                * größe bringen

ScrollPlane:    moveq.l #25,d3                  * 26 Words auf einen Schlag
                moveq   #0,d2                   * welches Bit?
                move.b  (a5),d2                 * entsprechende Daten holen
                sub.l   d5,a5                   * Zeiger zurücksetzen

                roxl.w  #1,d2                   * und Daten des aktuellen
                roxl.w  d6,d2                   * Zeichens ermitteln

ScrollWord:     roxl.w  -(a0)                   * Word nach links schieben
                                                * (probieren Sie mal
                                                * ROXR.W (A0)+!)

                dbra    d3,ScrollWord           * bis alle 8 Zeilen ver-
                                                * schoben sind!

                dbra    d1,ScrollPlane          * bis die gesamte Plane,
                                                * bzw. deren Inhalt, ver-
                                                * schoben ist!

                addq    #1,d6                   * nächstes Zeichen

                movem.l (SP)+,d0/a0/a4/a5

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

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

                move.l  GfxBase(pc),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(pc),a1         * Bitplane im
                move.l  #52*345,d0              * CHIP-Speicher
                CALLEXEC FreeMem                * deallokieren

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

                movem.l (SP)+,d0-d7/a0-a6       * Register holen

Fault:          lea     ResName(pc),a1          * DOS holen
                CALLEXEC FindResident
                tst.l   d0
                beq.s   Error
                move.l  d0,a0
                move.l  22(a0),a0

                moveq   #0,d0                   * alles klar!
                rts

Error:          move.l  #$ff,d0                 * oh nein!
                rts

*
* Auch hier wieder ein Datenteil ...
*

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

GfxBase:        dc.l     0
FontBase:       dc.l     0

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

TextAt:         dc.l     0
                dc.w     8
                dc.b     0,1

Direction:      dc.l     1
LineCounter:    dc.l     0

*
* 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 Rollroutine.
*

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 blaue Werte
* für die Vordergrundfarbe ...
*

Colors2:        dc.w     $02F,$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,$02F

Text:           dc.b "A BOOT-INTRO MADE BY HOLGER GZELLA 1989 ... "
                dc.b "                                   "
                ds.b 22
                dc.b 0                          * 0-Byte, heißt: E N D E
 even                                           * gerade Adressierung

*
* Hier ist das Boot-Intro zuende;
* es folgen Daten für den Generator!
*

WindowPtr:      dc.l 0                          * Zeiger auf's Fenster
IntuiBase:      dc.l 0                          * Zeiger auf Intuition
Data:           dc.l 0
DiskIO:         ds.b 48                         * IOStdReq-Record
ReplyPort:      ds.b 34                         * MsgPort-Record
StrUndo:        ds.l 100                        * 100 Zeichen Undo-Speicher
Drive:          dc.l 0                          * Laufwerksnummer f. Install

*
* Jetzt kommt die Definition des Intuition-Windows ...
*

 even
WindowData:     dc.w 99,98,442,60               * Position, Breite, Höhe
                dc.b 0,1                        * Farben
                dc.l GADGETUP                   * IDCMP-Flag
                dc.l Flags                      * Window-Flags
                dc.l Gadget1                    * Zeiger auf 1. Gadget
                dc.l 0                          * Standard-Checkmark
                dc.l Titel                      * Zeiger auf Window-Titel
                dc.l 0,0                        * kein eigener Screen/Bitmap
                dc.w 0,0,0,0                    * keine Mindest-/Max.-Größen
                dc.w WBENCHSCREEN               * Workbench-Screen

Titel:          dc.b "IntroGen -- by Holger Gzella",0
 even                                           * Window-Titel

*
* Nun folgen die Gadget-Definitionen!
*

Gadget1:        dc.l Gadget2                    * nächstes Gadget
                dc.w 10,20,98,10                * Position und Ausmaße
                dc.w 0,AFlags,1                 * keine Special-Flags,
                                                * aber BoolGadget
                dc.l GBorder                    * Gadget-Rahmen
                dc.l 0                          * kein Select-Image
                dc.l Text1                      * Zeiger auf Gadget-Text
                dc.l 0,0                        * weder Exclude noch
                                                * Special-Info
                dc.w 1                          * Gadget-ID
                dc.l 0                          * keine Special-Daten

Gadget2:        dc.l Gadget3                    * siehe oben
                dc.w 118,20,98,10
                dc.w 0,AFlags,1
                dc.l GBorder
                dc.l 0
                dc.l Text2
                dc.l 0,0
                dc.w 2
                dc.l 0

Gadget3:        dc.l Gadget4
                dc.w 226,20,98,10
                dc.w 0,AFlags,1
                dc.l GBorder
                dc.l 0
                dc.l Text3
                dc.l 0,0
                dc.w 3
                dc.l 0

Gadget4:        dc.l Gadget5
                dc.w 334,20,98,10
                dc.w 0,AFlags,1
                dc.l GBorder
                dc.l 0
                dc.l Text4
                dc.l 0,0
                dc.w 4
                dc.l 0

Gadget5:        dc.l 0
                dc.w 10,40,423,10
                dc.w 0,SFlags,4                 * String-Gadget!
                dc.l SBorder
                dc.l 0
                dc.l 0
                dc.l 0,Special                  * kriegt ein Special-Info
                dc.w 5
                dc.l 0

Special:        dc.l Text                       * Speicher für Intro-Text
                dc.l StrUndo                    * Speicher für Undo-Option
                dc.w 0,100                      * Cursor bei 0 u. 100 Zeichen
                dc.w 0,0,0,0,0,0                * Infos für Cursor und so
                dc.l 0                          * kein LONGINT-Gadget!
                dc.l 0                          * Standard-Keymap

*
* Ab hier stehen die ganzen Intui-Texte für die Gadgets u. Requester ...
*

Text1:          dc.b 1,0,0                      * Farben und Draw-Modus JAM1
 even
                dc.w 1,2,0,0                    * Position u. Standard-Font
                dc.l Text1Text                  * Zeiger auf eigentliche Text
                dc.l 0                          * kein folgender Intui-Text
Text1Text:      dc.b "  VERSION!  ",0           * Gadget-Text
 even

Text2:          dc.b 1,0,0                      * siehe oben
 even
                dc.w 1,2,0,0
                dc.l Text2Text
                dc.l 0
Text2Text:      dc.b "Install DF0:",0
 even

Text3:          dc.b 1,0,0
 even
                dc.w 1,2,0,0
                dc.l Text3Text
                dc.l 0
Text3Text:      dc.b "Install DF1:",0
 even

Text4:          dc.b 1,0,0
 even
                dc.w 1,2,0,0
                dc.l Text4Text
                dc.l 0
Text4Text:      dc.b "    EXIT    ",0
 even

BodyText:       dc.b 0,1,0
 even
                dc.w 30,10,0,0
                dc.l BodyTextText
                dc.l BodyText2
BodyTextText:   dc.b "IntroGen v1.00 by Holger Gzella",0
 even

BodyText2:      dc.b 0,1,0
 even
                dc.w 10,19,0,0
                dc.l BodyTextText2
                dc.l 0
BodyTextText2:  dc.b "Write an Intro into your bootblocks!",0
 even

LeftText:       dc.b 0,1,0
 even
                dc.w 5,3,0,0
                dc.l LeftTextText
                dc.l 0
LeftTextText:   dc.b "  Klar!  ",0
 even

RightText:      dc.b 0,1,0
 even
                dc.w 5,3,0,0
                dc.l RightTextText
                dc.l 0
RightTextText:  dc.b "  Logo!  ",0
 even

*
* Ab hier stehen die Daten für die Gadget-Rahmen ...
*

GBorder:        dc.w -1,-1                      * Position
                dc.b 1,0,0                      * Farben und JAM1
                dc.b 5                          * 5 Koordinatenpaare
                dc.l BordTable                  * Zeiger auf Koordinaten
                dc.l 0                          * kein weiterer Border

SBorder:        dc.w -1,-1                      * siehe oben
                dc.b 1,0,0
                dc.b 5
                dc.l SBordTable
                dc.l 0

BordTable:      dc.w 0,0,99,0,99,11,0,11,0,0    * Koordinaten
SBordTable:     dc.w 0,0,424,0,424,11,0,11,0,0

                       END

