; ChipMem-Trip (CMT) - Just for fun !
; ---------------------------------------
; Autor : Maik Jablonski (07.August.1989)

ExecBase    = 4
OpenLibrary = -408
COPJMP1     = $dff088

DELAY       = $1f00	; Wert für Dauer der Verzögerung
STEP        = 6		; Abstand der einzelnen "Stufen"	
STARTPOS    = 10	; Anfangsposition der "Schwingung"
ENDPOS      = 312	; Endposition der "Schwingung"
COL1        = $F0F	; RGB-Wert für Vordergrundfarbe

;------------------------------------------------------------

	move.l ExecBase,a6	; ExecBase nach a6
	lea GfxName,a1		; Addresse von GfxName nach a1
	jsr OpenLibrary(a6)	; OpenLibrary aufrufen
	move.l d0,a6		; GfxBase nach a6
	
	lea Block,a0		; Addresse für Copper-List nach a0
	move.w #STARTPOS,d0	; Startposition in d0

ALoop:  moveq #0,d1		; d1 löschen
BLoop:	add.w #STEP,d0		; d0 um STEP erhöhen
	bsr SetCop		; Unterprogramm SetCop aufrufen
	add.w #1,d1		; d1 um 1 erhöhen
	cmp.w #8,d1		; d1 gleich 8 ?
	bne BLoop		; Nein , dann nochmal zu BLoop

CLoop:	add.w #STEP,d0		; d0 um STEP erhöhen
	sub.w #1,d1		; d1 um 1 vermindern
	bsr SetCop		; SetCop aufrufen
	cmp.w #0,d1		; d1 gleich 0 ?
	bne CLoop		; Nein , dann nochmal zu CLoop

	cmp.w #ENDPOS,d0	; d0 gleich ENDPOS
	bls ALoop		; Nein , dann nochmal zu ALoop

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

	move.l 50(a6),OldCop	; alte Copper-Liste speichern
	move.l #CopList,50(a6)  ; neue Liste einschreiben
	clr.w COPJMP1		; und starten

GLoop:	moveq #0,d1		; d1 löschen
FLoop:
	move.w d1,LOW		; Unteres Wort von d1 nach LOW
	swap d1			; Registerhälften von d1 vertauschen
	move.w d1,HI		; Unteres Wort von d1 nach HI
	swap d1			; Registerhälften von d1 vertauschen
	add.l #80,d1		; d1 um 80 erhöhen (1. Zeile)

	cmp.l #$7ffff,d1	; Nur das Chip-Mem durchlaufen
	bhi GLoop		

	move.l #DELAY,d0	; d0 mit DELAY laden
LLoop:	dbra d0,LLoop		; d0 vermindern und auf 0 prüfen

	btst #$6,$bfe001	; Linke Maustaste gedrückt ?
	bne FLoop		; Nein, dann nochmal zu FLoop

	move.l OldCop,50(a6)	; Alte Copper-Liste wiederherstellen
	rts

;-----------------------------------------------------------

SetCop:
	cmp.w #255,d0		; d0 größer als 255
	bls JLoop		; Nein, dann zu JLoop

	cmp.b #1,True		; True gesetzt
	beq JLoop		; Ja, dann zu JLoop

	move.b #1,True		; True setzen
	move.w #$ffdd,(a0)+	; Vorbereitung für Zeilen, die
	move.w #$fffe,(a0)+	; größer als 255 sind
JLoop:
	move.b d0,(a0)+		; y-Position in Copper-Liste
	move.b #$1,(a0)+	; 1 als Kennzeichen für WAIT
	move.w #$fffe,(a0)+	; MASKE in Copper-Liste
	move.w #$102,(a0)+	; BPLCON1 in Copper-Liste
	move.w d1,(a0)+		; Verschiebung von BPLCON1
	move.w #$0180,(a0)+	; COLOR0 in Copper-Liste
	move.w d1,(a0)+		; Wert der Verschiebung=Farbe
	rts			; Rücksprung

;-------------------------------------------------------

CopList:
	dc.w $0101,$fffe	; auf erste Zeile warten
	dc.w $0096,$0020	; Sprite-DMA ausschalten
	dc.w $008e,$2964	; DIWSTART setzen
	dc.w $0090,$29f4	; DIWSTOP setzen
	dc.w $0182,COL1		; COLOR1 setzen
	dc.w $0100,$9000	; BPLCON0 setzen
	dc.w $00e0		; High-wort BPLPT
HI:	dc.w $0000
	dc.w $00e2		; Low-wort BPLPT
LOW:	dc.w $0000
Block:	blk.w 780		; Speicher für zusätzliche
				; Copper-Liste
				; Wurde nicht mit AllocMem 
				; realisiert, um Tipparbeit zu sparen
;---------------------------------------------------------------

GfxName:
	dc.b "graphics.library",0,0
OldCop:
	dc.l 0
True:
	dc.b 0
