home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga MA Magazine 1998 #6
/
amigamamagazinepolishissue1998.iso
/
coders
/
assembler-kurs
/
listings2
/
listing5h.s
< prev
next >
Wrap
Text File
|
1977-12-31
|
7KB
|
237 lines
; Listing5h.s HORIZONTALE WELLENBEWEGUNG EINES BILDES MIT DEM $dff102
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
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 ; überspringe die Routine
bsr.s Wellen ; Bringt das Bild in Wellenbewegung
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
; Diese Routine ist ähnlich mit der in Listing3e.s, die Werte werden wie in
; einer Kette vertauscht. Ich erinnere euch das System:
;
; 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
;
; In dieser Routine werden aber anstatt der Farben die Werte des $dff102
; kopiert, aber die grundsätzliche funktionsweise der Routine ist die gleiche.
; Um LABEL und Zeit zu sparen wurde diese Routine mit einem DBRA-Zyklus
; ausgestattet, der die Rotation sovieler Word vornimmt, wie wir wollen: da
; die zu ändernden Word alle 8 Byte entfernt sind, brauchen wir nur eines
; in a0 zu geben, das andere in a1 und dann mit einem MOVE.W (a0),(a1) zu
; kopieren. Dann schreiten wir zum nächsten Paar über, indem wir zu a0 und a1
; 8 dazuzählen, sie werden dann auf die nächsten Word pointen.
; Achtung: um einen unendlichen Zyklus zu machen, muß der letzte Wert immer
; in den errsten geschrieben werden:
;
; >>>>>>>>>>>>>>>>>>>>>
; ^ v
; In diesem Fall wir am Ende des Zyklus immer der erste Wert in den letzten
; geschrieben, der Zufluß ist also konstant. Die alte Routine endete so:
; move.w col1,col14 ; col1 kommt in col14
Wellen:
LEA Con1Effekt+8,A0 ; Adresse Quellword in a0
LEA Con1Effekt,A1 ; Adresse Zielword in a1
MOVEQ #44,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
; jedesmal in den Letzten.
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 ; BplCon1 - DAS REGISTER
dc.b $00 ; BplCon1 - DAS NICHT VERWENDETE BYTE!!!
MEINCON1:
dc.b $00 ; BplCon1 - DAS VERWENDETE BYTE!!!
dc.w $104,0 ; BplCon2
dc.w $108,0 ; Bpl1Mod
dc.w $10a,0 ; Bpl2Mod
; 5432109876543210 ; BPLCON0:
dc.w $100,%0011001000000000 ; Bits 13 und 12 an!! (3 = %011)
; 3 Bitplanes Lowres, nicht Lace
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
dc.w $0180,$000 ; Color0
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
; Der Effekt in der Copperlist: er besteht aus einem Wait und einem
; BPLCON1, die Wait stehen alle 4 Zeilen: $34, $38, $3c...
; In den $dff102 sind schon die "Wellenwerte" enthalten: 1,2,3,4,...3,2,1.
DC.W $3007,$FFFE,$102
Con1Effekt:
DC.W $00
DC.W $3407,$FFFE,$102,$00
DC.W $3807,$FFFE,$102,$00
DC.W $3C07,$FFFE,$102,$11
DC.W $4007,$FFFE,$102,$11
DC.W $4407,$FFFE,$102,$11
DC.W $4807,$FFFE,$102,$11
DC.W $4C07,$FFFE,$102,$22
DC.W $5007,$FFFE,$102,$22
DC.W $5407,$FFFE,$102,$22
DC.W $5807,$FFFE,$102,$33
DC.W $5C07,$FFFE,$102,$33
DC.W $6007,$FFFE,$102,$44
DC.W $6407,$FFFE,$102,$44
DC.W $6807,$FFFE,$102,$55
DC.W $6C07,$FFFE,$102,$66
DC.W $7007,$FFFE,$102,$77
DC.W $7407,$FFFE,$102,$88
DC.W $7807,$FFFE,$102,$88
DC.W $7C07,$FFFE,$102,$99
DC.W $8007,$FFFE,$102,$99
DC.W $8407,$FFFE,$102,$aa
DC.W $8807,$FFFE,$102,$aa
DC.W $8C07,$FFFE,$102,$aa
DC.W $9007,$FFFE,$102,$99
DC.W $9407,$FFFE,$102,$99
DC.W $9807,$FFFE,$102,$88
DC.W $9C07,$FFFE,$102,$88
DC.W $A007,$FFFE,$102,$77
DC.W $A407,$FFFE,$102,$66
DC.W $A807,$FFFE,$102,$55
DC.W $AC07,$FFFE,$102,$44
DC.W $B007,$FFFE,$102,$44
DC.W $B407,$FFFE,$102,$33
DC.W $B807,$FFFE,$102,$33
DC.W $BC07,$FFFE,$102,$22
DC.W $C007,$FFFE,$102,$22
DC.W $C407,$FFFE,$102,$22
DC.W $C807,$FFFE,$102,$11
DC.W $CC07,$FFFE,$102,$11
DC.W $D007,$FFFE,$102,$11
DC.W $D407,$FFFE,$102,$11
DC.W $D807,$FFFE,$102,$00
DC.W $DC07,$FFFE,$102,$00
DC.W $E007,$FFFE,$102,$00
DC.W $E407,$FFFE,$102
LetzterWert:
DC.W $00
dc.w $FFFF,$FFFE ; Ende der Copperlist
; BILD
PIC:
incbin "amiga.320*256*3" ; hier laden wir das Bild im RAW-
; Format
end
Dieser Welleneffekt ist ein Klassiker der Amiga. Um zu Sparen wird hier
nicht bei jeder Zeile eine Welle erzeugt, sondern nur alle 4 Zeilen, aber
mindestens ist die Routine schnell, die die $dff102 in der Copperlist
durchläuft.
Die Routine in diesem Listing kann überall dort verwendet werden wo Word
"rotiert" werden müßen, also könnte sie euch bei Farbeffekten und
ähnlichem dienen.