               ;****************************
               ;* KICKSTART GRAFIK SCROLL- *
               ;*        ROUTINE           *
               ;*                          *
               ;*   VON LUTZ GROßHENNIG    *
               ;****************************

               ; OFFSETS EXEC

PERMIT         = -138
FORBID         = -132
OPENLIBRARY    = -408
CLOSELIBRARY   = -414
ALLOCMEM       = -198
FREEMEM        = -210

               ;OFFSETS GRAPHICS

INITRASTPORT   = -198
INITBITMAP     = -390
MOVETO         = -240
DRAWTO         = -246
PRINT          = -060

               ; KONSTANTEN

EXECBASE       = 4

DMACON         = $DFF096               ; HARDWARE REGISTER
MOUSEBUTTON    = $BFE001
INTENA         = $DFF09A
JOY1DAT        = $DFF00C
BPLCON1        = $DFF102
COLOR00        = $DFF180

START:

               move.l  EXECBASE.s,a6
               ; MULTITASKING 

               jsr     FORBID(a6)              ; AUSSCHALTEN

               move.l  EXECBASE.s,a6             ; SPEICHER FÜR DIE GRAFIK
               move.l  #40960,d0               ; RESERVIEREN
               move.l  #$10002,d1              ; UND SICHERN
               jsr     ALLOCMEM(a6)
               move.l  d0,SCREENPOINTER

POINTERS:

               lea     COP1+2,a0
               move.l  SCREENPOINTER,d0        ; ADRESSE DES GRAFIK-
               move.w  d0,4(a0)                ; SPEICHERS IN DIE
               swap    d0                      ; COPPERLISTE
               move.w  d0,(a0)                 ; KOPIEREN

               move.l  EXECBASE.s,a6             ; SPEICHER FÜR DIE
               moveq  #44,d0                  ; COPPERLIST IM CHIP
               move.l  #$10002,d1              ; MEMORY RESERVIEREN
               jsr     ALLOCMEM(a6)
               move.l  d0,COPPERPOINTER

               moveq   #10,d7                  ; COPPERLIST INS
               lea     COPLIST,a0              ; CHIP MEMORY KOPIEREN
               move.l  COPPERPOINTER,a1
COPYLOOP:
               move.l  (a0)+,(a1)+
               dbra    d7,COPYLOOP

               move.l  EXECBASE.s,a6             ; GRAPHICS LIBRARY
               lea     GFXNAME,a1              ; ÖFFNEN
               jsr     OPENLIBRARY(a6)
               move.l  d0,GFXBASE

               move.l  GFXBASE,a6              ; BITMAP INSTALLIEREN
               lea     BITMAP,a0
               moveq   #1,d0                   ; TIEFE
               move.l  #640,d1                 ; BREITE
               move.l  #512,d2                 ; HÖHE
               jsr     INITBITMAP(a6)

               move.l  SCREENPOINTER,a0        ; ZEIGER AUF GRAFIKSPEICHER
               move.l  a0,PLANE1               ; IN DIE BITMAP KOPIEREN

               lea     RASTPORT,a1             ; RASTPORT INSTALLIEREN
               jsr     INITRASTPORT(a6)
               move.l  #BITMAP,R_BITMAP

               move.l  GFXBASE,a0              ; MEINE COPPERLIST
               add.l   #$32,a0                 ; STARTEN
               move.w  #$00B0,DMACON           ; COPPER UND SPRITE DMA AUS
               move.l  (a0),OLDCOPPER
               move.l  COPPERPOINTER,(a0)
               move.l  #$8080,d0               ; COPPER DMA AN
               move.w  d0,DMACON

BILD:
               moveq   #0,d0                   ; UMRANDUNG ZIEHEN
               move.l  #510,d1
               jsr     DRAW

               move.l  #639,d0
               move.l  #510,d1
               jsr     DRAW

               move.l  #639,d0
               moveq   #0,d1
               jsr     DRAW

               moveq   #0,d0
               moveq   #0,d1
               jsr     DRAW

               move.l  #639,d0                 ; KREUZ MALEN
               move.l  #510,d1
               jsr     DRAW

               move.l  #639,d0
               moveq   #0,d1
               jsr     PENMOVE

               moveq   #0,d0
               move.l  #510,d1
               jsr     DRAW

               move.l  #224,d0                 ; CURSOR NACH 224,140
               move.l  #140,d1
               jsr     PENMOVE

               moveq  #24,d0                  ; TEXT AUSGEBEN
               lea     TEXT1,a0
               jsr     PRINT(a6)

               move.l  #244,d0                 ; CURSOR NACH 244,160
               move.l  #160,d1
               jsr     PENMOVE

               moveq  #19,d0                  ; DEN ZWEITEN TEXT
               lea     TEXT2,a0                ; AUSGEBEN
               jsr     PRINT(a6)

               move.w  DELAY,BPLCON1           ; SCROLLING VORBEREITEN

               jsr     INITIRQ                 ; INTERRUPT VERBIEGEN

MAIN_LOOP:

               btst    #7,MOUSEBUTTON          ; FIREBUTTON ABFRAGEN
               beq     CHANGECOLOR
LOOP:
               btst    #6,MOUSEBUTTON          ; MAUSTASTE ZUM
               bne     MAIN_LOOP               ; BEENDEN

ENDE:

               move.l  GFXBASE,a0              ; ALTE COPPERLISTE
               add.l   #$32,a0                 ; EINSCHALTEN
               move.w  #$0080,DMACON           ; COPPER DMA AUS
               move.l  OLDCOPPER,(a0)
               move.l  #$80B0,d0               ; COPPER UND SPRITE DMA AN
               move.w  d0,DMACON

               move.l  EXECBASE.s,a6             ; GRAPHICS SCHLIEßEN
               move.l  GFXBASE,a1
               jsr     CLOSELIBRARY(a6)


               jsr     EXITIRQ                 ; ALTEN INTERRUPT INSTALLIEREN

               move.l  EXECBASE.s,a6             ; SPEICHER WIEDER
               move.l  #40960,d0               ; FREI GEBEN
               move.l  SCREENPOINTER,a1
               jsr     FREEMEM(a6)

               moveq  #44,d0
               move.l  COPPERPOINTER,a1
               jsr     FREEMEM(a6)

               move.l  EXECBASE.s,a6             ; MULTITASKING ANSCHALTEN
               jsr     PERMIT(a6)

               rts                             ; PROGRAMM ENDE

               ; UNTERPROGRAMME

CHANGECOLOR:

               move.w  #$0FFF,COLOR00          ; WENN DER FEUERKNOPF
               move.w  #$0000,COLOR00+2        ; GEDRÜCKT IST, WIRD
               bra     LOOP                    ; DAS BILD INVERTIERT


PENMOVE:

               move.l  GFXBASE,a6              ; GRAFIK CURSOR NACH X,Y
               lea     RASTPORT,a1             ; X IN D0
               jsr     MOVETO(a6)              ; Y IN D1
               rts

DRAW:

               move.l  GFXBASE,a6              ; LINIE ZUM PUNKT X,Y
               lea     RASTPORT,a1             ; X IN D0
               jsr     DRAWTO(a6)              ; Y IN D1
               rts


INITIRQ:

               move.w  #$4000,INTENA           ; ROUTINE ZUM VERBIEGEN
               move.l  $6C.s,OLDIRQ              ; DES VERTICAL BLANKING
               move.l  #NEWIRQ,$6C.s             ; INTERRUPTS AUF EINE
               move.l  #$C000,d0               ; EIGENE ROUTINE
               move.w  d0,INTENA
               rts

EXITIRQ:

               move.w  #$4000,INTENA           ; DIESE ROUTINE VERBIEGT
               move.l  OLDIRQ,$6C.s              ; DEN INTERRUPT AUF DIE
               move.l  #$C000,d0               ; NORMALE ROUTINE
               move.w  d0,INTENA
               rts

NEWIRQ:        ; NEUE INTERRUPT ROUTINE
               movem.l d0-d7/a0-a6,-(a7)       ; ALLE REGISTER RETTEN

               bra     JOY_RIGHT               ; JOYSTICK ABFRAGE

IRQ2:
               movem.l (a7)+,d0-d7/a0-a6; ALLE REGISTER ZURÜCK
               dc.w    $4EF9                   ; IRQ ENDE

OLDIRQ:        dc.l    0               ; ZEIGER AUF ALTE IRQ ROUTINE
               ; MUß HIER STEHEN BLEIBEN

JOY_RIGHT:

               move.w  JOY1DAT,d0

               btst    #1,d0                   ; JOYSTICK NACH RECHTS ?
               beq     JOY_LEFT                ; NEIN, NACH JOY_LEFT
               bsr     SCROLL_RIGHT            ; NACH RECHTS SCROLLEN
               bra     IRQ2                    ; ZURÜCK

JOY_LEFT:

               btst    #9,d0                   ; JOYSTICK NACH LINKS ?
               beq     JOY_DOWN                ; NEIN, NACH JOY_DOWN
               bsr     SCROLL_LEFT             ; NACH LINKS SCROLLEN
               bra     IRQ2                    ; ZURÜCK

JOY_DOWN:
               btst    #0,d0                   ; JOYSTICK NACH UNTEN ?
               beq     JOY_UP                  ; NEIN NACH JOY_UP
               btst    #1,d0
               bne     JOY_UP                  ; NEIN NACH JOY_UP
               bsr     SCROLL_DOWN             ; NACH UNTEN SCROLLEN
               bra     IRQ2                    ; ZURÜCK

JOY_UP:

               btst    #8,d0                   ; JOYSTICK NACH OBEN ?
               beq     IRQ2                    ; NEIN ZURÜCK
               btst    #9,d0
               bne     IRQ2                    ; NEIN ZURÜCK
               bsr     SCROLL_UP               ; NACH OBEN SCROLLEN
               bra     IRQ2                    ; ZURÜCK

SCROLL_RIGHT:

               move.l  SCREENX,d0              ; IST DIE RECHTE SEITE
               cmp.l   #320,d0                 ; SCHON ERREICHT ?
               beq     JUMP_BACK               ; JA, ZURÜCK

               addq.l   #4,SCREENX              ; NEIN, SCROLLEN
               sub.w   #$0044,DELAY
               bpl     SR1
               move.w  #$00FF,DELAY
               moveq  #2,d1
               bsr     SCROLL

SR1:           move.w  DELAY,BPLCON1
               rts

SCROLL_LEFT:

               move.l  SCREENX,d0              ; IST DIE LINKE SEITE
               cmp.l   #0,d0                   ; SCHON ERREICHT ?
               beq     JUMP_BACK               ; JA, ZURÜCK

               subq.l   #4,SCREENX              ; NEIN, SCROLLEN
               add.w   #$0044,DELAY
               cmp.w   #$0143,DELAY
               blt     SL1
               move.w  #$0033,DELAY
               moveq  #-2,d1
               bsr     SCROLL

SL1:           move.w  DELAY,BPLCON1
               rts

SCROLL_DOWN:

               move.l  SCREENY,d0              ; IST DIE UNTERE SEITE
               cmp.l   #264,d0                 ; SCHON ERREICHT ?
               beq     JUMP_BACK               ; JA, ZURÜCK

               addq.l   #4,SCREENY              ; NEIN, SCROLLEN
               move.l  #320,d1
               bsr     SCROLL
               rts

SCROLL_UP:

               move.l  SCREENY,d0              ; IST DIE OBERE SEITE
               cmp.l   #0,d0                   ; SCHON ERREICHT ?
               beq     JUMP_BACK               ; JA, ZURÜCK

               subq.l   #4,SCREENY              ; NEIN, SCROLLEN
               move.l  #-320,d1
               bsr     SCROLL
               rts

SCROLL:

               move.l  COPPERPOINTER,a0        ; SCROLL ROUTINE
               add.l   #18,a0
               move.w  (a0),d0
               swap    d0
               move.w  4(a0),d0
               add.l   d1,d0
               move.w  d0,4(a0)
               swap    d0
               move.w  d0,(a0)
               rts

JUMP_BACK:

               rts


               ; DATEN BEREICH

COPLIST:

               dc.w    $008E,$2C80             ; DIWSTART
               dc.w    $0090,$23C0             ; DIWSTOP
               dc.w    $0092,$0030             ; DDFSTART
               dc.w    $0094,$00D0             ; DDFSTOP

COP1:          dc.w    $00E0,0                 ; SCREENPOINTER 1 HIGH
               dc.w    $00E2,0                 ; SCREENPOINTER 1 LOW

               dc.w    $0108,38                ; MODOLUS
               dc.w    $0100,$1200             ; 1 BITPLANE

               dc.w    $0180,$0000             ; VORDER- UND HINTERGRUND
               dc.w    $0182,$0FFF             ; ALS RGB WERTE

               dc.w    $FFFF,$FFFE             ; COPPERLIST ENDE

               ; VARIABLEN SPEICHER

GFXBASE:       dc.l    0
SCREENPOINTER: dc.l    0
COPPERPOINTER: dc.l    0
OLDCOPPER:     dc.l    0
DELAY:         dc.w    $00FF
SCREENX:       dc.l    0
SCREENY:       dc.l    0

BITMAP:
BYPROW:        dc.w    0
BYTES:         dc.w    0
FLAGS:         dc.b    0
DEPTH:         dc.b    0
PAD:           dc.w    0
PLANE1:        dc.l    0
PLANES:        blk.l   7,0

RASTPORT:      dc.l    0
R_BITMAP:      dc.l    0
               blk.b   96,0

GFXNAME:       dc.b    'graphics.library',0
TEXT1:         dc.b    'KICKSTART SCROLL-ROUTINE'; 24 CHARS
TEXT2:         dc.b    'VON LUTZ GROßHENNIG'; 19 CHARS




