**************************
** Raster-Demonstration **
** -------------------- **
** ©'90 MMS of Level 4  **
**************************

Anz_Lines=	200			; Anzahl der Rasterzeilen
Length=		15			; Anzahl der Farben bei Colors
Number=		10			; Anzahl der Balken
Distance=	7			; Abstand der Balken in Pixeln

	jmp	$70000
	org	$70000
	load	$70000

o:	move.l	#Start,$80
	trap	#0
	clr.l	d0
	rts

Start:	move.w	#$2700,sr
	move.w	#$8400,$dff096

	bsr.L	Init_Raster		; Alles initialisieren

	move.l	#co,$dff080		; Copper einschalten

Sync:	cmp.b	#$f0,$dff006
	bne.s	Sync
	
	bsr.L	Clr_Raster		; Copperfarben loeschen
	bsr.L	Do_Raster		; Raster aufbauen

	btst	#6,$bfe001		; Mouse testen
	bne.L	Sync

	lea	GfxName,a1		; Copper zurueckschalten
	move.l	$4,a6
	jsr	-408(a6)
	move.l	d0,a1
	move.l	$26(a1),$dff080
	jsr	-414(a6)

	rte

GfxName:	dc.b	"graphics.library",0
even

co:					; Copperliste
Raster:	blk.l	Anz_Lines+1*2,$fffffffe
	dc.w	$ffff,$fffe

Init_Raster:
	lea	Raster,a0		; Raster in Copperliste
	move.l	#$2901fffe,d0
	move.l	#$01800000,d1
	move.w	#Anz_Lines,d7
Loop:	move.l	d0,(a0)+		; schreiben
	move.l	d1,(a0)+
	add.l	#$01000000,d0
	dbf	d7,Loop

	rts

Clr_Raster:
	lea	Raster+4+2,a0		; Alle Farbdaten im Copper
	move.w	#Anz_Lines,d7
Clear:	clr.w	(a0)			; loeschen
	lea	8(a0),a0
	dbf	d7,Clear
	rts

Do_Raster:
	move.w	#Number-1,d7
	move.w	Pos,d0
	move.w	dir,d5
Schreiben:
	bsr.s	Set_One_Raster		; Balken an Stelle d0 schreiben
	add.w	d5,d0			; naechsten Balken ausrechnen
	cmp.w	#Anz_Lines-Length,d0
	blt.s	OK
	neg.w	d5
	add.w	d5,d0
OK:	tst.w	d0
	bge	OK2
	neg.w	d5
	add.w	d5,d0
OK2:
	dbf	d7,Schreiben

	move.w	Pos,d0			; Pos fuer naechsten ersten 
	add.w	Dir,d0			; Balken ausrechnen
	cmp.w	#Anz_Lines-Length,d0
	blt.s	OK3
	neg.w	Dir
	add.w	Dir,d0
OK3:	tst.w	d0
	bge	OK4
	neg.w	Dir
	add.w	Dir,d0
OK4:
	move.w	d0,Pos
	rts

Set_One_Raster:
	movem.w	d0/d7,-(a7)		; d0 zwischenspeichern

	lea	Colors,a1		; Farben des Balkens

	lea	Raster+4+2,a0		; Eintrag in Copperliste
	lsl.w	#3,d0			; Raster+6+(8*Hoehe)
	lea	(a0,d0.w),a0

	move.w	#Length-1,d7		; Laenge des Balkens
Loop_Fill:
	move.w	(a1)+,(a0)		; In Copperliste schreiben
	lea	8(a0),a0
	dbf	d7,Loop_Fill

	movem.w	(a7)+,d0/d7		; d0 wieder holen
	rts

Colors:					; Farbdaten fuer einen Balken

	dc.w	$0313,$0535,$0757,$0979,$0b9b,$0dbd,$0fdf,$0fff
	dc.w	$0fdd,$0dbb,$0b99,$0977,$0755,$0533,$0311,-1

Pos:	dc.w	0			; Aktuelle Position des
					; 1. zu schreibenden Balkens
Dir:	dc.w	Distance		; Additionswert (+/- Distance)

