; ChipMemTrip  von Maik Jablonski

EXECBASE    = 4
OPENLIBRARY = -408
ALLOCMEM    = -198
FREEMEM     = -210

COPJMP1     = $dff088
VBI         = 148
LOFLIST     = 50

SPEED       = 2    ; Geschwindigkeit
STEP        = 7    ; Schrittweite
COL1        = $F0F ; Vordergrundfarbe
STARTPOS    = 10   ; Startposition
ENDPOS      = 312  ; Endposition

; GfxBase öffnen
	move.l ExecBase,a6
	lea GfxName,a1
	jsr OpenLibrary(a6)
	move.l d0,GfxBase	
	
; ChipMem für Copper-Liste anfordern
	move.l #2000,d0
	moveq  #2,d1
	jsr AllocMem(a6)
        move.l d0,CopAddr

; Anfang der Cp.List ins ChipMem kopieren
	move.l CopAddr,a0
	lea CopList,a1
	moveq #15,d0
Copy:	move.w (a1)+,(a0)+
	dbra d0,Copy
	
; Kurven für Copper-Liste erstellen
	move.w #STARTPOS,d0

ALoop:  moveq #0,d1
BLoop:	add.w #STEP,d0
	bsr SetCop
	add.w #1,d1
	cmp.w #8,d1
	bne BLoop

CLoop:	add.w #STEP,d0
	sub.w #1,d1
	bsr SetCop
	cmp.w #0,d1
	bne CLoop

	cmp.w #ENDPOS,d0
	bls ALoop

; Ende der Copper-Liste setzen
	move.w #$ffff,(a0)+
	move.w #$fffe,(a0)+

; Copper-Liste aktivieren
	move.l GfxBase,a6
	move.l 50(a6),OldCop
	move.l CopAddr,50(a6)
	clr.w COPJMP1

; Handler für 
; Vertical-Blank-Interrupt einbinden
	move.l EXECBASE,a6
	move.l VBI(a6),OldInt
	move.l #VInt,VBI(a6)

; Linke Maustaste ?
FLoop:	btst #$6,$bfe001
	bne FLoop

; Alten Interrupt-Handler wiederherstellen
	move.l EXECBASE,a6
	move.l OldInt,VBI(a6)
; Speicher freigeben
	move.l CopAddr,a1
	move.l #2000,d0
	jsr FreeMem(a6)

; Alte Copper-Liste zurückschreiben
	move.l GfxBase,a6
	move.l OldCop,50(a6)

; Programm beenden
	moveq #0,d0
	rts

; Copper-Liste beschreiben
SetCop:

; Y-Position < 255 ?
	cmp.w #255,d0
	bls JLoop

	cmp.b #1,True
	beq JLoop

	move.b #1,True
	move.w #$ffdd,(a0)+
	move.w #$fffe,(a0)+
JLoop:
	move.b d0,(a0)+
	move.b #$1,(a0)+
	move.w #$fffe,(a0)+
	move.w #$102,(a0)+
	move.w d1,(a0)+
; Hintergrundfarbe = Auslenkung
	move.w #$0180,(a0)+
	move.w d1,(a0)+
	rts


; Interrupt-Handler
VInt:
	move.l a0,-(sp)
	move.l Old,d1
	move.l CopAddr,a0
	add.l #SPEED*80,d1
	move.w d1,6(a0)
	swap d1	
	move.w d1,10(a0)
	swap d1
	move.l d1,Old
	move.l (sp)+,a0
	move.l OldInt,a6
	jmp (a6)

; Anfang der Copper-Liste
CopList: dc.w $0101,$fffe
	 dc.w $00e2,$0000
	 dc.w $00e0,$0000
	 dc.w $0096,$0020
	 dc.w $008e,$2964
	 dc.w $0090,$29f4
	 dc.w $0182,COL1
	 dc.w $0100,$9000

CopAddr: dc.l 0
Old:     dc.l 0
GfxBase: dc.l 0 
OldInt:  dc.l 0 
OldCop:	 dc.l 0
True:	 dc.b 0
GfxName: dc.b "graphics.library",0,0
