home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga MA Magazine 1998 #6
/
amigamamagazinepolishissue1998.iso
/
coders
/
assembler-kurs
/
listings2
/
listing5n.s
< prev
next >
Wrap
Text File
|
1977-12-31
|
26KB
|
804 lines
; Listing5n.s KOMBINATION VON 3 COPPER-EFFEKTEN + BILD IN 8 FARBEN MIT
; $dff102 und Bitplanepointer-EFFEKTEN
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 #PIC,d0 ; in d0 kommt die Adresse unserer PIC
LEA BPLPOINTERS,A1 ; in a1 kommt die Adresse der Bitplane-
; Pointer der Copperlist
MOVEQ #2,D1 ; Anzahl der Bitplanes -1 (hier sind es 3)
; für den DBRA - Zyklus
POINTBP:
move.w d0,6(a1) ; kopiert das niederwertige Word der Plane-
; Adresse ins richtige Word der Copperlist
swap d0 ; vertauscht die 2 Word in d0 (1234 > 3412)
move.w d0,2(a1) ; kopiert das hochwertige Word der Adresse des
; Plane in das richtige Word in der Copperlist
swap d0 ; vertauscht erneut die 2 Word von d0
ADD.L #40*256,d0 ; Zählen 10240 zu D0 dazu, -> nächstes Plane
addq.w #8,a1 ; zu den nächsten Bplpointers in der Cop
dbra d1,POINTBP ; Wiederhole D1 mal POINTBP (D1=n. bitplanes)
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
bsr.w mt_init ; Inizialisiert Musik-Routine
mouse:
cmpi.b #$ff,$dff006 ; Sind wir auf Zeile 255?
bne.s mouse ; Wenn nicht, geh nicht weiter
bsr.w BewegeCopper ; Roter Bylken unter $FF
bsr.s CopperLinkRech ; Routine für links-rechts Scroll
BSR.w scrollcolors ; Zyklisches scrollen der Farben
bsr.w ScrollPlanes ; Rauf-und Runterscrollen des Bildes
bsr.w Wellen ; Wellen mit dem $dff102
bsr.w mt_music ; Spielt die Musik
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:
bsr.w mt_end ; Beendet die Musikroutine
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
; **************************************************************************
; * HORIZONTAL LAUFENDER BALKEN (Listing3h.s) *
; **************************************************************************
CopperLinkRech:
CMPI.W #85,FlagRechts ; GehRechts 85 Mal ausgeführt?
BNE.S GehRechts ; wenn nicht, wiederhole nochmal
; wenn es aber 85 Mal ausgeführt wurde,
; dann geh weiter
CMPI.W #85,FlagLinks ; GehLinks 85 Mal ausgeführt?
BNE.S GehLinks ; wenn nicht, wiederhole nochmal
CLR.W FlagRechts ; Die Routine GehLinks wurde 85 Mal ausge-
CLR.W FlagLinks ; führt, also ist zu diesem Zeitpunkt der
; graue Balken zurückgekommen und der Rechts-
; GehLinks 85 Mal, etcetera.
RTS ; ZURÜCK ZUM MOUSE-LOOP
GehRechts: ; Diese Routine bewegt den Balken nach RECHTS
lea CopBar+1,A0 ; Wir geben in A0 die Adresse des ersten XX-
; Wertes des ersten Wait, das sich genau 1 Byte
; nach CopBar befindet
move.w #29-1,D2 ; wir müßen 29 Wait verändern (verwenden ein DBRA)
RechtsLoop:
addq.b #2,(a0) ; zählen 2 zu der X-Koordinate des Wait dazu
ADD.W #16,a0 ; gehen zum nächsten Wait, das zu ändern ist
dbra D2,RechtsLoop ; Zyklus wird d2-Mal durchlaufen
addq.w #1,FlagRechts ; vermerken, daß wir ein weiteres Mal GehRechts
; ausgeführt haben
; GehRechts: in FlagRechts steht die Anzahl,
; wie oft wir GehRechts ausgeführt haben
RTS ; Zurück zum Mouse-Loop
GehLinks: ; diese Routine bewegt den Balken nach LINKS
lea CopBar+1,A0
move.w #29-1,D2 ; wir müßen 29 Wait verändern
LinksLoop:
subq.b #2,(a0) ; ziehen der X-Koordinate des Wait 2 ab
ADD.W #16,a0 ; gehen zum nächsten Wait über, das zu verändern ist
dbra D2,LinksLoop ; Zyklus wird d2-Mal durchgeführt
addq.w #1,FlagLinks ; Zählen 1 zur Anzahl dazu, wie oft diese Routine
; GehLinks ausgeführt wurde
RTS ; Zurück zum Mouse-Loop
FlagRechts: ; In diesem Word wird die Anzahl festgehalten,
dc.w 0 ; wie oft GehRechts ausgeführt wurde
FlagLinks: ; In diesem Word wird die Anzahl festgehalten,
dc.w 0 ; wie oft GehLinks ausgeführt wurde
; **************************************************************************
; * ROTER BALKEN UNTER Zeile $FF (LISTING3f.s) *
; **************************************************************************
BewegeCopper:
LEA BALKEN,a0 ; in a0 kommt die Adresse von Balken
TST.B RAUFRUNTER2 ; Müßen wir steigen oder sinken? Wenn RaufRunter
; auf 0 steht (wenn TST also BEQ liefert), dann
; springen wir auf GEHRUNTER, wenn es hingegen
; auf $FF ist (TST also nicht eintrifft), fahren
beq.w GEHRUNTER2 ; wir fort und führen somit den "steigenden" Teil
; aus
cmpi.b #$0a,(a0) ; sind wir bei Zeile $0a+$ff angekommen?
beq.s SetzRunter2 ; wenn ja, sind wir oben angekommen und
subq.b #1,(a0) ; müßen runter
subq.b #1,8(a0)
subq.b #1,8*2(a0) ; nun ändern wir die anderen Wait: der
subq.b #1,8*3(a0) ; Abstand zwischen einem und dem anderen beträgt
subq.b #1,8*4(a0) ; 8 Byte
subq.b #1,8*5(a0)
subq.b #1,8*6(a0)
subq.b #1,8*7(a0) ; hier müßen wir alle 9 Wait des roten Balken
subq.b #1,8*8(a0) ; ändern, wenn wir ihn steigen und sinken lassen
subq.b #1,8*9(a0) ; wollen.
rts
SetzRunter2:
clr.b RAUFRUNTER2 ; Setzt RAUFRUNTER auf 0, beim TST.B RAUFRUNTER
rts ; wird das BEQ zu Routine GEHRUNTER verzweigen,
; und der Balken wird sinken
GEHRUNTER2:
cmpi.b #$2c,8*9(a0) ; sind wir bei Zeile $2c angekommen?
beq.s SetzRauf2 ; wenn ja, sind wir untern und müßen wieder
addq.b #1,(a0) ; steigen
addq.b #1,8(a0)
addq.b #1,8*2(a0) ; nun ändern wir die anderen Wait: der
addq.b #1,8*3(a0) ; Abstand zwischen einem und dem anderen beträgt
addq.b #1,8*4(a0) ; 8 Byte
addq.b #1,8*5(a0)
addq.b #1,8*6(a0)
addq.b #1,8*7(a0) ; hier müßen wir alle 9 Wait des roten Balken
addq.b #1,8*8(a0) ; ändern, wenn wir ihn steigen und sinken lassen
addq.b #1,8*9(a0) ; wollen.
rts
SetzRauf2:
move.b #$ff,RAUFRUNTER2; Wenn das Label nicht auf NULL ist,
rts ; bedeutet es, daß wir steigen müßen
RAUFRUNTER2:
dc.b 0,0
; **************************************************************************
; * ZYKLISCHES SCROLLEN DER FARBEN (LISTING3E.s) *
; **************************************************************************
Scrollcolors:
move.w col2,col1 ; col2 kommt in col1
move.w col3,col2 ; col3 kommt in col2
move.w col4,col3 ; col4 kommt in col3
move.w col5,col4 ; col5 kommt in col4
move.w col6,col5 ; col6 kommt in col5
move.w col7,col6 ; col7 kommt in col6
move.w col8,col7 ; col8 kommt in col7
move.w col9,col8 ; col9 kommt in col8
move.w col10,col9 ; col10 kommt in col9
move.w col11,col10 ; col11 kommt in col10
move.w col12,col11 ; col12 kommt in col11
move.w col13,col12 ; col13 kommt in col12
move.w col14,col13 ; col14 kommt in col13
move.w col1,col14 ; col1 kommt in col14
rts
; **************************************************************************
; * SCROLL NACH OBEN UND UNTEN DES BILDEN (aus Listing5g.s) *
; **************************************************************************
ScrollPlanes:
LEA BPLPOINTERS,A1 ; Mit diesen 4 Anweisungen holen wir aus der
move.w 2(a1),d0 ; Copperlist die Adresse, wohin das $dff0e0
swap d0 ; gerade pointet und geben diesen Wert
move.w 6(a1),d0 ; in d0
TST.B RaufRunter3 ; Müßen wir nach oben oder unten?
beq.w GehRunter3
cmp.l #PIC-(40*18),d0 ; sind wir weit genug OBEN?
beq.s SetzRunter3 ; wenn ja, sind wir am Ende und müßen runter
sub.l #40,d0 ; subtrahieren 40, also 1 Zeile, dadurch
; wandert das Bild nach UNTEN
bra.s Ende3
SetzRunter3:
clr.b RaufRunter3 ; Durch Löschen von RaufRunter wird das TST
bra.s Ende3
GehRunter3:
cmpi.l #PIC+(40*130),d0; sind wir weit genug UNTEN?
beq.s SetzRauf3 ; wenn ja, sind wir am unteren Ende und
; müßen wieder rauf
add.l #40,d0 ; Addieren 40, also 1 Zeile, somit scrollt
; das Bild nach OBEN
bra.s Ende3
SetzRauf3:
move.b #$ff,RaufRunter3; Wenn das Label nicht auf NULL steht,
rts ; bedeutet das, daß wir rauf müßen
Ende3: ; POINTEN DIE BITPLANEPOINTER AN
LEA BPLPOINTERS,A1 ; POINTER in der COPPERLIST
MOVEQ #2,D1 ; Anzahl der Bitplanes -1 (hier: 3)
POINTBP2:
move.w d0,6(a1) ; kopiert das niederw. Word der Adress des Pl.
swap d0 ; vertauscht die 2 Word von d0 (1234 > 3412)
move.w d0,2(a1) ; kopiert das höherw. Word der Adresse des Pl.
swap d0 ; vertauscht die 2 Word von d0 (3412 > 1234)
ADD.L #40*256,d0 ; + Länge Bitplane -> nächstes Bitplane
addq.w #8,a1 ; zu den nächsten bplpointers in der Cop
dbra d1,POINTBP2 ; Wiederhole D1 Mal POINTBP (D1=n. bitplanes)
rts
RaufRunter3:
dc.b 0,0
; **************************************************************************
; * WELLENEFFEKT MITTELS MODULO $dff102 (LISTING5H.S) *
; **************************************************************************
Wellen:
LEA Con1Effekt+8,A0 ; Adresse Quellword in a0
LEA Con1Effekt,A1 ; Adresse Zielword in a1
MOVEQ #19,D2 ; 45 BPLCON1 sind in COPLIST zu ändern
Vertausche:
MOVE.W (A0),(A1) ; kopiert zwei Word - scroll!
ADDQ.W #8,A0 ; nächstes Word-Paar
ADDQ.W #8,A1 ; nächstes Word-Paar
DBRA D2,Vertausche ; wiederhole "Vertausche" die richtige Anzahl mal
MOVE.W Con1Effekt,LetzterWert ; um den Zyklus unendlich fortlaufen zu
RTS ; lassen kopieren wir den ersten Wert
; **************************************************************************
; * ROUTINE ZUM ABSPIELEN VON SOUNDTRACKER/PROTRACKER *
; **************************************************************************
include "music.s" ; Routine, die zu 100% auf allen Amigas funktioniert
; **************************************************************************
; * SUPER COPPERLIST *
; **************************************************************************
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 Standartwerten)
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
; das BPLCON0 ($dff100) für einen Bildschirm mit 3 Bitplanes: (8 Farben)
; 5432109876543210
dc.w $100,%0011001000000000 ; bits 13 und 12 an!! (3 = %011)
; Wir lassen die Bitplanes direkt anpointen, indem wir die Register
; $dff0e0 und folgende hier in der Copperlist einfügen. Die
; Adressen der Bitplanes werden dann von der Routine POINTBP
; automatisch eingetragen
BPLPOINTERS:
dc.w $e0,$0000,$e2,$0000 ; erstes Bitplane - BPL0PT
dc.w $e4,$0000,$e6,$0000 ; zweites Bitplane - BPL1PT
dc.w $e8,$0000,$ea,$0000 ; drittes Bitplane - BPL2PT
; Die 8 Farben des Bildes werden hier definiert:
dc.w $0180,$000 ; color0
dc.w $0182,$070 ; color1
dc.w $0184,$0f0 ; color2
dc.w $0186,$0c0 ; color3
dc.w $0188,$090 ; color4
dc.w $018a,$030 ; color5
dc.w $018c,$070 ; color6
dc.w $018e,$040 ; color7
; Der Effekt aus Listing3e.s, weiter nach oben verschoben
dc.w $2c07,$fffe ; warten auf Zeile 154 ($9a in hexadezimal)
dc.w $180 ; Register COLOR0
col1:
dc.w $0f0 ; WERT DES COLOR 0 (wird verändert)
dc.w $2d07,$fffe ; warten auf Zeile 155 (wird nicht verändert)
dc.w $180 ; Register COLOR0 (wird nicht verändert)
col2:
dc.w $0d0 ; WERT DES COLOR 0 (will be modified)
dc.w $2e07,$fffe ; warten auf Zeile 156 (not modified, ecc.)
dc.w $180 ; Register COLOR0
col3:
dc.w $0b0 ; WERT DES COLOR 0
dc.w $2f07,$fffe ; warten auf Zeile 157
dc.w $180 ; Register COLOR0
col4:
dc.w $090 ; WERT DES COLOR 0
dc.w $3007,$fffe ; warten auf Zeile 158
dc.w $180 ; Register COLOR0
col5:
dc.w $070 ; WERT DES COLOR 0
dc.w $3107,$fffe ; warten auf Zeile 159
dc.w $180 ; Register COLOR0
col6:
dc.w $050 ; WERT DES COLOR 0
dc.w $3207,$fffe ; warten auf Zeile 160
dc.w $180 ; Register COLOR0
col7:
dc.w $030 ; WERT DES COLOR 0
dc.w $3307,$fffe ; warten auf Zeile 161
dc.w $180 ; color0... (nun habt ihr schon verstanden,
col8: ; ab hier kann ich´s mir sparen!)
dc.w $030
dc.w $3407,$fffe ; Zeile 162
dc.w $180
col9:
dc.w $050
dc.w $3507,$fffe ; Zeile 163
dc.w $180
col10:
dc.w $070
dc.w $3607,$fffe ; Zeile 164
dc.w $180
col11:
dc.w $090
dc.w $3707,$fffe ; Zeile 165
dc.w $180
col12:
dc.w $0b0
dc.w $3807,$fffe ; Zeile 166
dc.w $180
col13:
dc.w $0d0
dc.w $3907,$fffe ; Zeile 167
dc.w $180
col14:
dc.w $0f0
dc.w $3a07,$fffe ; Zeile 168
dc.w $0180,$000 ; color0 ; reale Farben des Bildes
dc.w $0182,$475 ; color1
dc.w $0184,$fff ; color2
dc.w $0186,$ccc ; color3
dc.w $0188,$999 ; color4
dc.w $018a,$232 ; color5
dc.w $018c,$777 ; color6
dc.w $018e,$444 ; color7
; Coppereffekt der Wellen mit dem $dff102 aus Listing5h.s, "geschmälert"
DC.W $102
CON1EFFEKT:
dc.w $000
DC.W $4007,$FFFE,$102,$00
DC.W $4407,$FFFE,$102,$11
DC.W $4807,$FFFE,$102,$11
DC.W $4C07,$FFFE,$102,$22
DC.W $5007,$FFFE,$102,$33
DC.W $5407,$FFFE,$102,$44
DC.W $5807,$FFFE,$102,$66
DC.W $5C07,$FFFE,$102,$66
DC.W $6007,$FFFE,$102,$77
DC.W $6407,$FFFE,$102,$77
DC.W $6807,$FFFE,$102,$77
DC.W $6C07,$FFFE,$102,$66
DC.W $7007,$FFFE,$102,$66
DC.W $7407,$FFFE,$102,$55
DC.W $7807,$FFFE,$102,$33
DC.W $7C07,$FFFE,$102,$22
DC.W $8007,$FFFE,$102,$11
DC.W $8407,$FFFE,$102,$11
DC.W $8807,$FFFE,$102,$00
DC.W $8C07,$FFFE,$102
LETZTERWERT:
DC.W $00
; EFFEKT AUS Listing3h.s
dc.w $9007,$fffe ; warten auf Anfang der Zeile
dc.w $180,$000 ; Grau auf Minimum, oder SCHWARZ!
CopBar:
dc.w $9031,$fffe ; Wait, das wir verändern ($9033,$9035,$9037..)
dc.w $180,$100 ; Farbe Rot
dc.w $9107,$fffe ; Wait, das wir nicht verändern (Beginn Zeile)
dc.w $180,$111 ; Farbe GRAU (Beginnt beim Anfang der Zeile und
dc.w $9131,$fffe ; geht bis zu diesem Wait, das wir nicht ändern
dc.w $180,$200 ; danach beginnt das ROT
; FIXE WAIT (dann Grau) - zu ändernde WAIT (gefolgt von Rot)
dc.w $9207,$fffe,$180,$120,$9231,$fffe,$180,$301 ; Zeile 3
dc.w $9307,$fffe,$180,$230,$9331,$fffe,$180,$401 ; Zeile 4
dc.w $9407,$fffe,$180,$240,$9431,$fffe,$180,$502 ; Zeile 5
dc.w $9507,$fffe,$180,$350,$9531,$fffe,$180,$603 ; ....
dc.w $9607,$fffe,$180,$360,$9631,$fffe,$180,$703
dc.w $9707,$fffe,$180,$470,$9731,$fffe,$180,$803
dc.w $9807,$fffe,$180,$580,$9831,$fffe,$180,$904
dc.w $9907,$fffe,$180,$690,$9931,$fffe,$180,$a04
dc.w $9a07,$fffe,$180,$7a0,$9a31,$fffe,$180,$b04
dc.w $9b07,$fffe,$180,$8b0,$9b31,$fffe,$180,$c05
dc.w $9c07,$fffe,$180,$9c0,$9c31,$fffe,$180,$d05
dc.w $9d07,$fffe,$180,$ad0,$9d31,$fffe,$180,$e05
dc.w $9e07,$fffe,$180,$be0,$9e31,$fffe,$180,$f05
dc.w $9f07,$fffe,$180,$cf0,$9f31,$fffe,$180,$e05
dc.w $a007,$fffe,$180,$be0,$a031,$fffe,$180,$d05
dc.w $a107,$fffe,$180,$ad0,$a131,$fffe,$180,$c05
dc.w $a207,$fffe,$180,$9c0,$a231,$fffe,$180,$b04
dc.w $a307,$fffe,$180,$8b0,$a331,$fffe,$180,$a04
dc.w $a407,$fffe,$180,$7a0,$a431,$fffe,$180,$904
dc.w $a507,$fffe,$180,$690,$a531,$fffe,$180,$803
dc.w $a607,$fffe,$180,$580,$a631,$fffe,$180,$703
dc.w $a707,$fffe,$180,$470,$a731,$fffe,$180,$603
dc.w $a807,$fffe,$180,$360,$a831,$fffe,$180,$502
dc.w $a907,$fffe,$180,$250,$a931,$fffe,$180,$402
dc.w $aa07,$fffe,$180,$140,$aa31,$fffe,$180,$301
dc.w $ab07,$fffe,$180,$130,$ab31,$fffe,$180,$202
dc.w $ac07,$fffe,$180,$120,$ac31,$fffe,$180,$103
dc.w $ad07,$fffe,$180,$111,$ad31,$fffe,$180,$004
dc.w $ae07,$fffe
dc.w $180,$002
dc.w $af07,$fffe
dc.w $180,$003
; Zylinder-Spiegel-Effekt aus Listing3g.s (+neudefinition der Farben)
dc.w $0182,$235 ; color1
dc.w $0184,$99e ; color2
dc.w $0186,$88c ; color3
dc.w $0188,$659 ; color4
dc.w $018a,$122 ; color5
dc.w $018c,$337 ; color6
dc.w $018e,$224 ; color7
dc.w $b007,$fffe
dc.w $180,$004 ; Color0
dc.w $102,$011 ; bplcon1
dc.w $108,-40*7 ; Bpl1Mod - Spiegel 5 Mal halbiert
dc.w $10a,-40*7 ; Bpl2Mod
dc.w $b307,$fffe
dc.w $180,$006 ; Color0
dc.w $102,$022 ; bplcon1
dc.w $108,-40*6 ; Bpl1Mod - Spiegel 4 Mal halbiert
dc.w $10a,-40*6 ; Bpl2Mod
dc.w $b607,$fffe
dc.w $0182,$245 ; color1
dc.w $0184,$9cf ; color2
dc.w $0186,$89c ; color3
dc.w $0188,$669 ; color4
dc.w $018a,$132 ; color5
dc.w $018c,$347 ; color6
dc.w $018e,$234 ; color7
dc.w $180,$008 ; Color0
dc.w $102,$033 ; bplcon1
dc.w $108,-40*5 ; Bpl1Mod - Spiegel 3 Mal halbiert
dc.w $10a,-40*5 ; Bpl2Mod
dc.w $bb07,$fffe
dc.w $180,$00a ; Color0
dc.w $102,$044 ; bplcon1
dc.w $108,-40*4 ; Bpl1Mod - Spiegel 2 Mal halbiert
dc.w $10a,-40*4 ; Bpl2Mod
dc.w $c307,$fffe
dc.w $0182,$355 ; color1
dc.w $0184,$abf ; color2
dc.w $0186,$9ac ; color3
dc.w $0188,$779 ; color4
dc.w $018a,$232 ; color5
dc.w $018c,$457 ; color6
dc.w $018e,$344 ; color7
dc.w $180,$00c ; Color0
dc.w $102,$055 ; bplcon1
dc.w $108,-40*3 ; Bpl1Mod - Spiegel halbiert
dc.w $10a,-40*3 ; Bpl2Mod
dc.w $d007,$fffe
dc.w $180,$00e ; Color0
dc.w $102,$066 ; bplcon1
dc.w $108,-40*2 ; Bpl1Mod - Spiegel normal
dc.w $10a,-40*2 ; Bpl2Mod
dc.w $d607,$fffe
dc.w $0182,$465 ; color1
dc.w $0184,$cdf ; color2
dc.w $0186,$bbc ; color3
dc.w $0188,$889 ; color4
dc.w $018a,$232 ; color5
dc.w $018c,$557 ; color6
dc.w $018e,$444 ; color7
dc.w $180,$00f ; Color0
dc.w $102,$077 ; bplcon1
dc.w $108,-40 ; Bpl1Mod - FLOOD, Zeilen wiederholt, für
dc.w $10a,-40 ; Bpl2Mod - Vergrößerungseffekt in der Mitte
dc.w $da07,$fffe
dc.w $0182,$355 ; color1
dc.w $0184,$abf ; color2
dc.w $0186,$9ac ; color3
dc.w $0188,$779 ; color4
dc.w $018a,$232 ; color5
dc.w $018c,$457 ; color6
dc.w $018e,$344 ; color7
dc.w $180,$00e ; Color0
dc.w $102,$066 ; bplcon1
dc.w $108,-40*2 ; Bpl1Mod - Spiegel normal
dc.w $10a,-40*2 ; Bpl2Mod
dc.w $e007,$fffe
dc.w $0182,$245 ; color1
dc.w $0184,$9cf ; color2
dc.w $0186,$89c ; color3
dc.w $0188,$669 ; color4
dc.w $018a,$132 ; color5
dc.w $018c,$347 ; color6
dc.w $018e,$234 ; color7
dc.w $180,$00c ; Color0
dc.w $102,$055 ; bplcon1
dc.w $108,-40*3 ; Bpl1Mod - Spiegel halbiert
dc.w $10a,-40*3 ; Bpl2Mod
dc.w $ed07,$fffe
dc.w $180,$00a ; Color0
dc.w $102,$044 ; bplcon1
dc.w $108,-40*4 ; Bpl1Mod - Spiegel 2 Mal halbiert
dc.w $10a,-40*4 ; Bpl2Mod
dc.w $f507,$fffe
dc.w $0182,$235 ; color1
dc.w $0184,$99e ; color2
dc.w $0186,$88c ; color3
dc.w $0188,$659 ; color4
dc.w $018a,$122 ; color5
dc.w $018c,$337 ; color6
dc.w $018e,$224 ; color7
dc.w $180,$008 ; Color0
dc.w $102,$033 ; bplcon1
dc.w $108,-40*5 ; Bpl1Mod - Spiegel 3 Mal halbiert
dc.w $10a,-40*5 ; Bpl2Mod
dc.w $fa07,$fffe
dc.w $180,$006 ; Color0
dc.w $102,$022 ; bplcon1
dc.w $108,-40*6 ; Bpl1Mod - Spiegel 4 Mal halbiert
dc.w $10a,-40*6 ; Bpl2Mod
dc.w $fd07,$fffe
dc.w $180,$004 ; Color0
dc.w $102,$011 ; bplcon1
dc.w $108,-40*7 ; Bpl1Mod - Spiegel 5 Mal halbiert
dc.w $10a,-40*7 ; Bpl2Mod
dc.w $ff07,$fffe
dc.w $180,$002 ; Color0
dc.w $102,$000 ; bplcon1
dc.w $108,-40 ; Stoppt das Bild um zu vermeiden, daß Bytes
dc.w $10a,-40 ; vor dem RAW angezeigt werden
; Effekt aus Listing3f.s
dc.w $ffdf,$fffe ; ACHTUNG! WAIT am Ende der Zeile $FF!
; die Wait nach dieser Zeile befinden sich
; unter $FF, starten aber bei $00!!
dc.w $0107,$FFFE ; ein fixer, grüner Balken unter der Zeile $FF!
dc.w $180,$010
dc.w $0207,$FFFE
dc.w $180,$020
dc.w $0307,$FFFE
dc.w $180,$030
dc.w $0407,$FFFE
dc.w $180,$040
dc.w $0507,$FFFE
dc.w $180,$030
dc.w $0607,$FFFE
dc.w $180,$020
dc.w $0707,$FFFE
dc.w $180,$010
dc.w $0807,$FFFE
dc.w $180,$000
BALKEN:
dc.w $0907,$FFFE ; Warte auf Zeile $79
dc.w $180,$300 ; Beginne die rote Zeile: Rot auf 3
dc.w $0a07,$FFFE ; nächste Zeile
dc.w $180,$600 ; Rot auf 6
dc.w $0b07,$FFFE
dc.w $180,$900 ; Rot auf 9
dc.w $0c07,$FFFE
dc.w $180,$c00 ; Rot auf 12
dc.w $0d07,$FFFE
dc.w $180,$f00 ; Rot auf 15 (Maximum)
dc.w $0e07,$FFFE
dc.w $180,$c00 ; Rot auf 12
dc.w $0f07,$FFFE
dc.w $180,$900 ; Rot auf 9
dc.w $1007,$FFFE
dc.w $180,$600 ; Rot auf 6
dc.w $1107,$FFFE
dc.w $180,$300 ; Rot auf 3
dc.w $1207,$FFFE
dc.w $180,$000 ; Farbe Schwarz
dc.w $FFFF,$FFFE ; ENDE DER COPPERLIST
; **************************************************************************
; * BILD IN 8 FARBEN 320x256 *
; **************************************************************************
dcb.b 40*98,0 ; leergefegter Raum
PIC:
incbin "amiga.320*256*3" ; hier laden wir das Bild im
; RAW - Format
dcb.b 40*8,0 ; wie oben
; **************************************************************************
; * PROTRACKER-MUSIK *
; **************************************************************************
mt_data:
incbin "mod.purple-shades"
end
; **************************************************************************
Dieses Listing ist nichts anderes als ein Zusammenschluß von einigen
Listings, wie ihr gesehen habt. Die Unterschiede sind zwei:
1) Ich habe den Welleneffekt von 45 Wait auf 20 verkürzen müßen, um ihn
zwischen die anderen Effekte zu bekommen.
2) Ich habe die Palette des Bildes oben verändert, so daß es aussieht, als
ob das Bild in die ScrollColors eintreten würde. Weiters habe ich hier und
da die Farben verändert, um die SUPERCOPPERLIST zu verschönern und ... zu
verlängern!!
Die wirkliche Neuigkeit ist das Einfügen einer Musikroutine! Zuerst einmal
folgendes: ich habe das Einbinden dieser Routine mit "INCLUDE" dem wahren
"Einsetzen" (abtippen, reinkopieren) vorgezogen. Dieses Include erlaubt es
mir, außenstehende Listings praktisch einzufügen. Schauen wir nun, wie wir
unsere Wunder noch mit einem bißchen Musik auf die Sprünge helfen können.
Als erstes ist zu beachten, daß das Musikstück in einem speziellen Format
vorliegen muß, dem PROTRACKER-Format. Und nicht etwa digitalisierte Musik
etc. Es gibt viele Programme, mit denen man Musik komponieren kann, das am
meisten verwendete ist der Protracker, kompatibel mit Soundtracker und
Noisetracker. Sie speichern das Stück im MOD-Format ab, oft beginnen
solche Musikstücke auch mit dem Kürzel MOD. Es ist aber nicht gesagt, daß
unbedingt immer Protracker verwendet wurde: bei einigen Spielen, vor allem
älteren, wurden oft MED, OCTAMED, FUTURE-COMPOSER, SOUNDMONITOR,
OKTALYZER..., verwendet, aber in diesen Fällen muß eine eigene Routine für
diese Formate das Abspielen übernehmen. Meistens erhält man zusammen mit
dem Programm auch die REPLAY-Routine,
die im Programm eingebaut werden kann.
Heutzutage verwenden 99% der Amiga-Produktionen Protracker-Format oder
deren Untersorten, also einem Format, das nach eigenen Regeln und Gesetzen
die "Noten" speichert und komprimiert.
Ich habe diesem Kurs diese Routine mitgegeben, die Protracker problemlos
spielt, sie ist kompatibel zu Soundtracker und Noisetracker. Des weiteren
habe ich sie modifiziert, daß sie kompatibel zu 68020+ Prozessoren, auch
mit eingeschalteter Cache, ist. Im Orginalzustand hatte diese
ReplayRoutine einige Probleme bei schnelleren Prozessoren und so verlor
sie manchmal einige Noten... Aber jetzt singt die "music.s" auch auf
A4000ern ohne Schwierigkeiten.
Um sie einzufügen, könnt ihr entweder den "I"-Befehl verwenden, oder sie
in einen anderen Buffer laden und dann ins Listing kopieren. Ich
persönlich ziehe es aber vor, Platz zu sparen, deswegen verwende ich die
"Include"-Direktive des ASMONE. Somit wird das Listing assembliert, als ob
die Routine wirklich händisch eingebaut worden wäre, nur sparen wir uns
die Länge dieser Routine selbst, ca 21 kB. Stellt euch z.B. vor, ihr
hättet sieben Listings, denen ihr allen diese Routine unterjubeln wollt:
Listing1.s 12234 bytes
Listing2.s 23523 bytes
Listing3.s 29382 bytes
Listing4.s 78343 bytes
Listing5.s 10482 bytes
Listing6.s 14925 bytes
Listing7.s 29482 bytes
Zusammen sind sie ca. 200k groß, nachdem wir aber jeden 21kB der
Replay-Routine dazugezählt haben, würden sie insgesamt 300kB verbrauchen!
Aber wenn ich nur die Zeile
include "music.s"
schreibe, dann ist die Vergrößerung des Listings nur ein paar Byte, das
Resultat aber das gleiche. Der einzige Schwachpunkt ist, daß man sich, wie
beim INCBIN, in der selben Directory befinden muß, wo sich auch diese
Routine befindet. Ansonsten muß man den vollständigen Pfad schreiben:
include "df0:sorgenti2/music.s"
Einmal eingefügt, sei es nun mit dem Include oder mittels direktem
Einfügen von Hand, braucht man sie nur mehr zum Funktionieren bringen.
GANZ EINFACH! Nur mt_init vor dem Mouse-Loop aufrufen, damit wird sie
initialisiert, dann "mt_music" bei JEDEM FRAME ausführen, und dann mt_end
am Ende vor dem Aussteigen aufrufen. Damit wird die Routine beendet und
sie gibt die Audio-Kanäle wieder frei.
bsr.w mt_init ; Inizialisiert Musik-Routine
mouse:
cmpi.b #$ff,$dff006 ; Sind wir auf Zeile 255?
bne.s mouse ; Wenn nicht, geh nicht weiter
bsr.w MeineGrafikRoutine
bsr.w mt_music ; Spielt die Musik
btst #6,$bfe001 ; linke Maustaste gedrückt?
bne.s mouse ; wenn nicht, zurück zu mouse:
bsr.s mt_end ; Beendet die Musikroutine
Das Musikstück muß natürlich geladen werden, einfach mit dem INCBIN unter
dem Label "mt_data":
mt_data:
incbin "mod.purple-shades"
Die im Kurs enthaltene Musik ist von HI-LITE der VISION FACTORY, ein
Stück, das schon einige Jahre auf dem Buckel hat, ich ahbe sie gewählt,
weil sie nur 13 kB lang ist. Wenn ihr etwas Eigenes spielen lassen wollt,
dann einfach mit dem Incbin reinholen:
mt_data:
incbin "df1:modules/mod.MyMusic" ; zum Beispiel!