;  Sourcecodedemo fuer Cracker -
; --- Journal Assemblerkurs ----
; Version 2 -  Copper und Grafik
;   (c) 1990 Doctor Mabuse of
;	  Alpha Flight
; ------ Programmadresse -------
jmp		$50000		; Der Programmbeginn wird auf
org		$50000		; $50000 festgesetzt
load		$50000
>extern	"bild",$70000,$20000	; Vor dem Start des Programmes einmal
				; mit y Befehl Grafik einladen.
; ---------- Offsets -----------
openlibrary= 	-408		; Hier sind vordefinierte Adressen
closelibrary= 	-414		; und Offsets, die wir spaeter
forbid= 	-132		; brauchen werden
permit= 	-138
execbase= 	$04
; ------------------------------
start:
movem.l d0-d7/a0-a6,-(a7)	; Alle Register retten damit am Ende
				; des Programms alles wiederherge-
				; stellt werden kann
; ------------------------------
; -- Graphics Libary oeffnen ---
				; Mit der Exec-Library Funktion
				; Openlibray wird die Graphics
				; Library geoffnet. Dazu holen wir
				; uns die Basisadresse der Offsetliste
move.l	execbase,a6		; aus der Adresse $4=Execbase.
lea	gfxname,a1 	
jsr	openlibrary(a6)		; Die Routine wird angesprungen und
move.l	d0,gfxbase		; wir bekommen als Ergebnis die
				; Adresse der Ofsetliste der GFX-
				; Library. (Etwas Kompliziert)
; -- Multitasking abschalten ---
				; Da der Interrupt der Betriebssystems
				; immer mitlaeuft muessen wir das
move.l	execbase,a6		; Multitasking des Amiga ausschalten,
jsr	forbid(a6)		; was wir hiermit tun.
; ---- Copperfeld erzeugen -----
				; Hier werden die scrollenden Farb-
				; balken vorbereitet. Dabei wird eine
				; Liste mit entsprechenden Copperbe-
				; fehlen mittels der folgenden Schlei-
move.l	#copdat,a0		; fe erzeugt.
move.w	#$2009,d0		; Anfangszeile der Farbbalken laden.
move.w	#$9-1,d1		; Groesse
loop1:
move.l	#colours,a1
move.w	#$20-1,d2
loop2:
move.w	d0,(a0)+		; Copperbefehl 'wait' erzeugen.
move.w	#$fffe,(a0)+ 
move.w	#$0180,(a0)+		; Code fuer Hintergrundfarbe und Farbe
move.w	(a1)+,(a0)+		; aus Farbliste holen. Die Farbliste
				; steht am Schluss des Programms.
add.w	#$0100,d0		; Wait auf naechste Zeile stellen.
dbra	d2,loop2		; Innere Schleife
dbra	d1,loop1		; Aeussere Schleife
move.w	#$0000,-(a0)		; Letzte Farbe schwarz machen.
; -------- $ffdf,$fffe ---------
move.l	#$ffdffffe,copdat+[[$100-$20]*8]
				; Anstelle des wait $0009,$fffe wird
				; $ffdf,$fffe gesetzt und damit das
				; Copperfeld in den Palbereich gebracht.
; -- Eigene CListe einsetzen ---
move.l	gfxbase,a0		; Die Adresse der Copperliste steht 
add.l	#$32,a0			; in einer Adresse der GFX-Library
move.w	#$0080,$dff096		; Die Copper DMA wird abgeschaltet,
move.l	(a0),oldcopper		; alte Copperliste zwischengespeichert
move.l	#newcopper,(a0)		; ,neue eingesetzt und
move.w	#$8080,$dff096		; DMA wieder eingeschaltet.
; -------- IRQ umbiegen --------
				; Wir sind fertig mit Initialisieren
move.l	$6c,oldirq		; und aktivieren unsere Interrupt
move.l	#newirq,$6c		; Routine, nachdem wir den alten
				; Vektor abgespeichert haben.
;  Hauptprogramm Warteschleife -
				; Jetzt laeuft das Demo nur durch den
main:				; Interrupt. Waehrenddessen wird hier
btst	#6,$bfe001		; auf das Druecken der Mousetaste
bne	main			; gewartet
; ------ Abschaltroutine -------
				; Beim Abschalten wird zu allererst
				; der Interrupt abgeschaltet, indem
				; man einfach den alten Vektor
move.l	oldirq,$6c		; zurueckschreibt.
; alte Copperliste wiederholen -
move.l	gfxbase,a0		; Genau wie vorher unsere Copper-
add.l	#$32,a0			; listenadresse einsetzt wurde,
move.w	#$0080,$dff096		; wird nun die alte zurueckgeschrie-
move.l	oldcopper,(a0)		; ben.
move.w	#$8080,$dff096
; --- GFX-Library schliessen ---
move.l	execbase,a6		; Mit closelibrary wird die GFX-
move.l	gfxbase,a1		; Library geschlossen.
jsr	closelibrary(a6)
; -- Multitasking einschalten --
move.l	execbase,a6		; Und das Multitasking wieder erlaubt.
jsr	permit(a6)
; ----- Programmaussprung ------
movem.l	(a7)+,d0-d7/a0-a6	; Alle Register zurueckholen und
rts				; verabschieden.
; ------------------------------
; --------- Interrupt ----------
newirq:				; Hier ist Beginn unserer Interrupt-
movem.l	d0-d7/a0-a6,-(sp)	; outine. Zuerst alle Register retten.
; -------- Copperdemo ----------
move.l	#copdat+6,a0		; Mittels dieser einfachen Schleife
move.l	#copdat+14,a1		; werden alle Farbwerte eine Position
move.w	(a0),d0			; nach oben geschoben. Und schliess-
move.w	#9*$20-3,d1		; lich wird der erste Farbwert an die
inter1:				; letzte Stelle gemovet.
move.w	(a1),(a0)
add.w	#8,a1
add.w	#8,a0
dbra	d1,inter1
move.w	d0,(a0)
; -------- Blinkroutine --------
add.w	#1,r1			; Warteregister hochzaehlen
cmp.w	#4,r1			; Wartezyklen
bne	bb1			; wegspringen
move.w	#0,r1			; zuerts Warteregister Null setzen
add.w	#2,r2			; Zaehlregister erhoehen
cmp.w	#28*2,r2		; Anzahl Farben (Woerter)
bne	bb1
move.w	#0,r2
bb1:
move.l	#rot,a0			; Farbadresse holen
add.w	r2,a0
move.w	(a0),rgb+14		; Rueberkopieren und fertig
; ------- Interruptende --------
movem.l	(sp)+,d0-d7/a0-a6	; Zuerst die Register zurueckholen.
dc.w	$4ef9			; Hier wird ein Jump zum alten
oldirq:				; IRQ simuliert, fuer uns das Ende
dc.l	0			; der IRQ Routine
r1:	dc.w	0		; Warteregister
r2:	dc.w	0		; Zaehlregister
; ------------------------------
; -------- Copperliste ---------
newcopper:			; Und hier haben wir unsere Copper-
				; liste. In diesem Fall ist sie aber
				; nutzlos, da keine Grafikausgabe
				; aktiviert wird, sondern nur unsere
				; kleine Copperspielerei.
dc.w 	$008e,$7a81,$0090,$c8d1 ; linke obere und rechte untere 
				; Koordinaten des BildschirmFenster
dc.w 	$0092,$0038,$0094,$00d0 ; DataFetch Start Stop Register
dc.w 	$0108,$0050,$010a,$0050	; Modulo Werte der Bitplanes
dc.w 	$0102,$0000,$0104,$0000 ; BitPlane Control Reg. #1 u. #2
				; Scrollwerte, Prioritaeten
dc.w 	$0100,$3200		; BitPlane Control Reg. #0
				; 3 Bitplanes aktiviert

dc.w    $00e0,$0007,$00e2,$0000	; Adresse 1. Plane
dc.w	$00e4,$0007,$00e6,$0028	; 2. Plane
dc.w	$00e8,$0007,$00ea,$0050	; 3. Plane

dc.w	$0120,$0000,$0122,$0ff0

rgb:
dc.w	$0180,$0000,$0182,$0444	; Farben als RGB-Werte
dc.w	$0184,$0ddd,$0186,$0d00
dc.w	$0188,$0990,$018a,$0aa0
dc.w	$018c,$0dd0,$018e,$0ff0
copdat:				; Hier wird der Platz fuer die Liste
blk.w	9*$20*4,0		; unserer Balkenspielerei freigehalten

dc.w	$ffff,$fffe		; Code fuer Ende der Copperliste
; ------ Systemregister --------
gfxbase:	dc.l 	0
oldcopper:	dc.l	0
gfxname:
dc.b 	"graphics.library",0,0
; ---------- Farbliste ---------
colours:			; Hier sind die Farben der Hinter-
				; grundbalken als RGB-Werte abgelegt.
				; Experimentiert ruhig mal ein wenig
				; damit herum.
dc.w	$ff0,$ee0,$ee0,$dd0,$cc0,$bb0,$aa0,$990
dc.w	$880,$770,$660,$550,$440,$330,$330,$220
dc.w	$220,$330,$330,$440,$550,$660,$770,$880
dc.w	$990,$aa0,$bb0,$cc0,$dd0,$ee0,$ee0,$ff0
rot:
dc.w	$f00,$e00,$e00,$d00,$c00,$b00,$a00,$900
dc.w	$800,$700,$600,$500,$400,$300,$200,$100
dc.w	$100,$200,$300,$400,$500,$600,$700,$800
dc.w	$900,$a00,$b00,$c00,$d00,$e00,$e00,$f00
; ----- Programmcode Ende ------
prgend:
