
; Listing6i.s		TEXT IN 3 FARBEN, BEI DEM EINE FARBE BLINKT
;			VERWENDEN DAZU EINE VORDEFINIERTE TABELLE


	SECTION	CIPundCOP,CODE

Anfang:
	move.l	4.w,a6		; Execbase in a6
	jsr	-$78(a6)	; Disable - stoppt das Multitasking
	lea	GfxName(PC),a1	; Adresse des Namen der zu öffnenden Lib in a1
	jsr	-$198(a6)	; OpenLibrary
	move.l	d0,GfxBase	; speichere diese Adresse in GfxBase
	move.l	d0,a6
	move.l	$26(a6),OldCop	; hier speichern wir die Adresse der Copperlist
				; des Betriebssystemes

;	POINTEN AUF UNSERE BITPLANES

	MOVE.L	#BITPLANE,d0	; in d0 kommt die Adresse des PIC
	LEA	BPLPOINTERS,A1	; Pointer in der Copperlist
	move.w	d0,6(a1)	; kopiert das niederw. Word der Planeadresse
	swap	d0		; vertauscht die 2 Word in d0 (1234 > 3412)
	move.w	d0,2(a1)	; kopiert das hochw. Word der Adresse des Plnae

;	POINTEN AUF UNSER BITPLANE

	MOVE.L	#BITPLANE2,d0	; in d0 kommt die Adresse des PIC
	LEA	BPLPOINTERS2,A1 ; Pointer in der Copperlist
	move.w	d0,6(a1)	; kopiert das niederw. Word der Planeadresse
	swap	d0		; vertauscht die 2 word in d0 (1234 > 3412)
	move.w	d0,2(a1)	; kopiert das hochw. Word der Planeadresse
	
	move.l	#COPPERLIST,$dff080	; COP1LC - "Zeiger" auf unsere COP
	move.w	d0,$dff088		; COPJMP1 - Starten unsere COP
	move.w	#0,$dff1fc		; FMODE - Deaktiviert das AGA
	move.w	#$c00,$dff106		; BPLCON3 - Deaktiviert das AGA

	LEA	TEXT(PC),A0	; Adresse des zu schreibenden Textes in a0
	LEA	BITPLANE,A3	; Adresse des Ziel-Bitplanes in a3
	bsr.w	print		; Bringt den Text auf den Bildschirm

	LEA	TEXT2(PC),A0	; Adresse des zu schreibenden Textes in a0
	LEA	BITPLANE2,A3	; Adresse des Ziel-Bitplanes in a3
	bsr.w	print		; Bringt den Text auf den Bildschirm
 
mouse:
	cmpi.b	#$ff,$dff006	; Sind wir auf Zeile 255?
	bne.s	mouse		; Wenn nicht, geh nicht weiter

	btst	#2,$dff016	; wenn die rechte Maustaste gedrückt ist,
	beq.s	Warte		; gehe zu Warte

	bsr.w	BLINKEN	 ; ansonsten gehe zu BLINKE

Warte:
	cmpi.b	#$ff,$dff006	; Sind wir auf Zeile 255?
	beq.s	Warte		; Wenn nicht, geh nicht weiter

	btst	#6,$bfe001	; linke Maustaste gedrückt?
	bne.s	mouse		; wenn nicht, zurück zu mouse:

	move.l	OldCop(PC),$dff080	; COP1LC - "Zeiger" auf die Orginal-COP
	move.w	d0,$dff088		; COPJMP1 - und starten sie

	move.l	4.w,a6
	jsr	-$7e(a6)	; Enable - stellt Multitasking wieder her
	move.l	GfxBase(PC),a1	; Basis der Library, die es zu schließen gilt
				; (Libraries werden geöffnet UND geschlossen!)
	jsr	-$19e(a6)	; Closelibrary - schließt die Graphics lib
	rts

; DATEN

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

GfxBase:		; Hier hinein kommt die Basisadresse der graphics.lib,
	dc.l	0	; ab hier werden die Offsets gemacht

OldCop:		 ; Hier hinein kommt die Adresse der Orginal-Copperlist des
	dc.l	0	; Betriebssystemes


;	Blinkroutine, die eine vorgefertigte Farbverlauf-TABELLE verwendet.
;	Diese Tabelle ist nicht anderes als eine Reihe von Words mit den
;	verschiedenen RGB-Werten, die COLOR1 annehmen wird.
;	Diese Routine nimmt bei jedem Durchgang den nächsten Wert in der 
;	Tabelle, und wenn sie ein Word (2 Bytes) vor dem Label ENDECOLORTAB
;	angekommen ist, beginnt der Lesevorgang wieder beim ersten Element:
;
;	dc.w	1,3,5,7,9,8,6,4,2,1	; unsere "Mini"-Tabelle
;
;	Während der nächsten Fotogramme wird die Reihenfolge der kopierten
;	word so aussehen, in einem unendlichen Loop:
;
;	1,3,5,7,9,8,6,4,2,1,1,3,5,7,9,8,6,4,2,1,1,3,5,7,9,8,6,4,2,1....
;
;	Die Adresse des letzten gelesenen Word wird in der Long COLTABPOINT
;	gespeichert.

BLINKEN:
	ADDQ.L	#2,COLTABPOINT		; Pointet auf das nächste Word
	MOVE.L	COLTABPOINT(PC),A0    ; Adresse, die im Long COLTABPOINT steht
					; wird in a0 kopiert
	CMP.L	#ENDECOLORTAB-2,A0    ; Sind wir beim letzten Word in der TAB?
	BNE.S	NOBSTART2		; noch nicht? dann geh´ weiter
	MOVE.L	#COLORTAB-2,COLTABPOINT ; Starte wieder beim ersten Word
NOBSTART2:
	MOVE.W	(A0),Farbe1	; kopiere das Word der Tabelle in die COP
	rts


COLTABPOINT:		   ; Dieses Longword "POINTET" auf COLORTAB, also
	dc.l	COLORTAB-2 ; enthält es die Adresse von COLORTAB. Es wird
			   ; die Adresse des zuletzt gelesenen Word innerhalb
			   ; der Tabelle beinhalten. (hier beginne es bei 
			   ; COLORTAB-2, weil das Blinken ja mit ADDQ.L #2,C...
			   ; beginnt. Es dient zum "ausgleich" dieser ersten
			   ; Anweisung.

;	Die Tabelle mit den vordefinierten Werten, die das Blinken ergeben:

COLORTAB:
	dc.w	$000,$000,$001,$011,$011,$011,$012,$012 ; Beginn DUNKEL
	dc.w	$022,$022,$022,$023,$023
	dc.w	$033,$033,$034
	dc.w	$044,$044
	dc.w	$045,$055,$055
	dc.w	$056,$056,$066,$066,$066
	dc.w	$167,$167,$177,$177,$177,$177,$177
	dc.w	$278,$278,$278,$288,$288,$288,$288,$288
	dc.w	$389,$389,$399,$399,$399,$399
	dc.w	$39a,$39a,$3aa,$3aa,$3aa
	dc.w	$3ab,$3bb,$3bb,$3bb
	dc.w	$4bc,$4cc,$4cc,$4cc
	dc.w	$4cd,$4cd,$4dd,$4dd,$4dd
	dc.w	$5de,$5de,$5ee,$5ee,$5ee,$5ee
	dc.w	$6ef,$6ff,$6ff,$7ff,$7ff,$8ff,$8ff,$9ff ; Maximum HELL
	dc.w	$5ee,$5ee,$5ee,$5de,$5de,$5de
	dc.w	$4dd,$4dd,$4dd,$4cd,$4cd
	dc.w	$4cc,$4cc,$4cc,$4bc
	dc.w	$3cb,$3bb,$3bb
	dc.w	$3ba,$3aa,$3aa
	dc.w	$3a9,$399,$399
	dc.w	$298,$288
	dc.w	$187,$177
	dc.w	$076,$066
	dc.w	$065,$055
	dc.w	$054,$044
	dc.w	$034
	dc.w	$022
	dc.w	$011
	dc.w	$000			; wieder DUNKEL
ENDECOLORTAB:


;	Routine, die 8x8 Pixel große Buchstaben druckt

PRINT:
	MOVEQ	#27-1,D3	 ; ANZAHL DER ZEILEN, DIE ZU DRUCKEN SIND -> 26
PRINTZEILE:
	MOVEQ	#40-1,D0	; ANZAHL DER SPALTEN EINER ZEILE: 40 (LOWRES!)

PRINTCHAR2:
	MOVEQ	#0,D2		; Löscht D2
	MOVE.B	(A0)+,D2	; Nächster Charakter in d2
	SUB.B	#$20,D2		; ZÄHLE 32 VOM ASCII-WERT DES BUCHSTABEN WEG,
				; SOMIT VERWANDELN WIR Z.B. DAS LEERZEICHEN
				; (Das $20 entspricht), IN $00, DAS
				; MALZEICHEN ($21) IN $01...
	MULU.W	#8,D2		; MULTIPLIZIERE DIE ERHALTENE ZAHL MIT 8,
				; da die Charakter ja 8 Pixel hoch sind
	MOVE.L	D2,A2
	ADD.L	#FONT,A2	; FINDE DEN GEWÜNSCHTEN BUCHSTEBEN IM FONT

				; DRUCKE DEN BUCHSTABEN ZEILE FÜR ZEILE
	MOVE.B	(A2)+,(A3)	; Drucke Zeile 1 des Buchstaben
	MOVE.B	(A2)+,40(A3)	; Drucke Zeile 2  "	"
	MOVE.B	(A2)+,40*2(A3)	; Drucke Zeile 3  "	"
	MOVE.B	(A2)+,40*3(A3)	; Drucke Zeile 4  "	"
	MOVE.B	(A2)+,40*4(A3)	; Drucke Zeile 5  "	"
	MOVE.B	(A2)+,40*5(A3)	; Drucke Zeile 6  "	"
	MOVE.B	(A2)+,40*6(A3)	; Drucke Zeile 7  "	"
	MOVE.B	(A2)+,40*7(A3)	; Drucke Zeile 8  "	"

	ADDQ.w	#1,A3		; A3+1, wir gehen um 8 Bit weiter (zum
				; nächsten Buchstaben

	DBRA	D0,PRINTCHAR2	; DRUCKEN D0 (80) ZEICHEN PRO ZEILE

	ADD.W	#40*7,A3	; "Return", neue Zeile

	DBRA	D3,PRINTZEILE	; Wir drucken D3 Zeilen
	RTS

TEXT:
             ; Anzahl Charakter pro Zeile: 40
             ;            1111111111222222222233333333334
             ;   1234567890123456789012345678901234567890
	dc.b	'   ERSTE ZEILE (nur TEXT1)              ' ; 1
	dc.b	'                                        ' ; 2
	dc.b	'     /\  /                              ' ; 3
	dc.b	'    /  \/                               ' ; 4
	dc.b	'                                        ' ; 5
	dc.b	'        SECHSTE ZEILE (beide Bitplanes) ' ; 6
	dc.b	'                                        ' ; 7
	dc.b	'                                        ' ; 8
	dc.b	'FABIO CIUCCI               INTERNATIONAL' ; 9
	dc.b	'                                        ' ; 10
	dc.b	'   1  4 6 89  !@ $ ^& () +| =- ]{       ' ; 11
	dc.b	'                                        ' ; 12
	dc.b	'     I H D N E,  L O BIN I H            ' ; 13
	dc.b	'                                        ' ; 24
	dc.b	'                                        ' ; 15
	dc.b	'  Das Fraeulein stand am Meere,         ' ; 16
	dc.b	'                                        ' ; 17
	dc.b	'    Und seufzte lang und bang,          ' ; 18
	dc.b	'                                        ' ; 19
	dc.b	'    Es ruehrte sie so sehre,            ' ; 20
	dc.b	'                                        ' ; 21
	dc.b	'      Sonnenuntergang.                  ' ; 22
	dc.b	'                                        ' ; 23
	dc.b	'           ...                          ' ; 24
	dc.b	'                                        ' ; 25
	dc.b	'                                        ' ; 26
	dc.b	'                                        ' ; 27


        EVEN

TEXT2:
             ; Anzahl Charakter pro Zeile: 40
             ;            1111111111222222222233333333334
             ;   1234567890123456789012345678901234567890
	dc.b	'                                        ' ; 1
	dc.b	'  ZWEITE ZEILE (nur TEXT2)              ' ; 2
	dc.b	'     /\  /                              ' ; 3
	dc.b	'    /  \/                               ' ; 4
	dc.b	'                                        ' ; 5
	dc.b	'        SECHSTE ZEILE (beide Bitplanes) ' ; 6
	dc.b	'                                        ' ; 7
	dc.b	'                                        ' ; 8
	dc.b	'FABIO        COMMUNICATION INTERNATIONAL' ; 9
	dc.b	'                                        ' ; 10
	dc.b	'   1234567 90  @#$%^&*( _+|\=-[]{}      ' ; 11
	dc.b	'                                        ' ; 12
	dc.b	'     ICH DENKE, ALSO     ICH            ' ; 13
	dc.b	'                                        ' ; 14
	dc.b	'                                        ' ; 15
	dc.b	'  Das           stand am                ' ; 16
	dc.b	'                                        ' ; 17
	dc.b	'    Und s u  te l n  und b  g,          ' ; 18
	dc.b	'                                        ' ; 19
	dc.b	'    Es ruehrte        sehre,            ' ; 20
	dc.b	'                                        ' ; 21
	dc.b	'  Der Sonnen     gang.                  ' ; 22
	dc.b	'                                        ' ; 23
	dc.b	'           ...                          ' ; 24
	dc.b	'                                        ' ; 25
	dc.b	'                                        ' ; 26
	dc.b	'                                        ' ; 27

	EVEN


	SECTION GRAPHIC,DATA_C

COPPERLIST:
	dc.w	$120,$0000,$122,$0000,$124,$0000,$126,$0000,$128,$0000 ; SPRITE
	dc.w	$12a,$0000,$12c,$0000,$12e,$0000,$130,$0000,$132,$0000
	dc.w	$134,$0000,$136,$0000,$138,$0000,$13a,$0000,$13c,$0000
	dc.w	$13e,$0000

	dc.w	$8E,$2c81	; DiwStrt (Register mit Normalwerten)
	dc.w	$90,$2cc1	; DiwStop
	dc.w	$92,$0038	; DdfStart
	dc.w	$94,$00d0	; DdfStop
	dc.w	$102,0		; BplCon1
	dc.w	$104,0		; BplCon2
	dc.w	$108,0		; Bpl1Mod
	dc.w	$10a,0		; Bpl2Mod
	
		    ; 5432109876543210
	dc.w	$100,%0010001000000000  ; 2 BITPLANES LOWRES, 4 FARBEN

BPLPOINTERS:
	dc.w $e0,$0000,$e2,$0000	;erstes  Bitplane
BPLPOINTERS2:
	dc.w $e4,$0000,$e6,$0000	;zweites Bitplane

	dc.w	$0180,$000	; Color0 - HINTERGRUND
	dc.w	$0182

Farbe1:
	dc.w	$000
	dc.w	$0184,$f62 ; Color2 - SCHRIFT zweites Bitplane (ORANGE)
	dc.w	$0186,$1e4 ; Color3 - SCHRIFT erstes+zweites Bitplane (GRÜN)


	dc.w	$FFFF,$FFFE	; Ende der Copperlist

;	Der FONT, Charakter 8x8

FONT:
;	incbin	"metal.fnt"	; Breiter Zeichensatz
;	incbin	"normal.fnt"	; Ähnlich dem aus dem Kickstart 1.3
	incbin	"nice.fnt"	; Schmaler Zeichensatz

	SECTION MEIPLANE,BSS_C	; Die SECTION BSS können nur aus NULLEN
				; bestehen!!! Man verwendet das DS.B um zu
				; definieren, wieviele Nullen die Section
				; enthalten soll

BITPLANE:
	ds.b	40*256	; ein Bitplane LOWRES 320x256
BITPLANE2:
	ds.b	40*256	; ein Bitplane LOWRES 320x256


	end


Unter Verwendung von vordefinierten oder "vorberechneten" Werten kann  man
viel  bessere  Bewegungen oder Farbverläufe herstellen, als mit bloßen ADD
und SUB.
Die einzige "Neuigkeit" in diesem Listing besteht in der Auscodierung  der
Routine  "BLINKEN",  die  die  Werte  aus einer Tabelle liest, die dann in
"FARBE1" kommen. Dabei wird ein POINTER  auf  das  zuletzt  gelesene  Word
verwendet,  also  ein LONGWORD, das die Adresse dieses Wordes inerhalb der
Tabelle speichert. Zu Bemerken ist, daß ein:


COLTABPOINT:
	dc.l	COLORTAB

gleich einem

COLTABPOINT:
	DC.L	0

ist, nachdem ein MOVE.L #COLORTAB,COLTABPOINT ausgeführt  wurde,  es  wird
also  ein  Longword  assembliert,  das  die Adresse eines bestimmten Label
enthält. In dieser Routine ist ein

	dc.l	COLORTAB-2

vorzufinden, es ist aber nur dazu da, um beim ersten Mal das erste Word zu
lesen, da die Routine ja mit

BLINKEN:
	ADDQ.L	#2,COLTABPOINT	; Pointet auf das nächste Word

beginnt.  COLTABPOINT  muß  den  Anfang  des  ersten	Word-2	enthalten,
jedenfalls  nach  dem ersten ADDQ.L #2 wird beim ersten jsr das erste Word
kopiert und nicht das zweite.
Danach wird das Longword COLTABPOINT jedesmal um 2  erhöht,  die  Adresse,
die  es enthält, wird also jedesmal die nächste sein, bis nicht das letzte
Word erreicht wird, das zwei Bytes vor dem ENDE der Tabelle steht:

; wir sind auf dieser Adresse, wenn wir das letzte Word lesen...

	dc.w	$000			; wieder DUNKEL
ENDECOLORTAB:

Hier wird dann mit einem

	MOVE.L	#COLORTAB-2,COLTABPOINT ; Starte wieder beim ersten Word


das Label COLTABPOINT wieder mit der Adresse des ersten Word geladen.

Ihr könnt diese Routine für viele verschiedene Zwecke verwenden,  z.B.  um
Sprites zum springen oder wellen zu bringen. Einfach die Tabelle ersetzen.

Probiert, die Tabelle mit dieser zu ersetzen:

COLORTAB:
	dc.w	$26F,$27E,$28D,$29C,$2AB,$2BA,$2C9,$2D8,$2E7,$2F6
	dc.w	$4E7,$6D8,$8C9,$ABA,$CAA,$D9A,$E8A,$F7A,$F6B,$F5C
	dc.w	$D6D,$B6E,$96F,$76F,$56F,$36F
ENDECOLORTAB:

