home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga MA Magazine 1998 #6
/
amigamamagazinepolishissue1998.iso
/
coders
/
assembler-kurs
/
listings2
/
listing5d2.s
< prev
next >
Wrap
Text File
|
1977-12-31
|
8KB
|
247 lines
; Listing5d.s SCROLLEN EINES BILDES NACH OBEN UND UNTEN, KOMBINIERT
; MIT EINEM VERZERRUNGSEFFEKT, HERGESTELLT MIT DEM
; $dff102 (BPLCON0)
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 Scrollroutine
bsr.s BewegeCopper ; Scrollt Bild rauf und runter durch
; Ändern der Bitplanepointers
Warte:
cmpi.b #$ff,$dff006 ; Sind wir noch auf Zeile 255?
beq.s Warte ; Wenn ja, 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 bewegt das Bild nach oben und unten, imdem sie auf
; die Bitplanepointer in der Copperlist zugreift (Mit dem Label
; BPLPOINTERS).
; Die Struktur ist ähnlich mit der in Listing3d.s
; Als erstes geben wir die Adresse, die dir BPLPOINTERS gerade anpointen
; in d0, dann addieren oder subtrahieren wir 40 Bytes von d0, und
; setzen dann diesen neuen Wert in die Copperlist ein. Dafür verwenden
; wir wieder die gleiche Routine POINTBP.
BewegeCopper:
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 RaufRunter ; Müßen wir nach oben oder unten?
beq.w GehRunter
cmp.l #PIC-(40*30),d0 ; sind wir weit genug OBEN?
beq.s SetzRunter ; 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 Ende
SetzRunter:
clr.b RaufRunter ; Durch Löschen von RaufRunter wird das TST
bra.s Ende ; danach wieder BEQ ermöglichen ->
; BEQ wird zur Routine GehRunter springen
GehRunter:
cmpi.l #PIC+(40*30),d0 ; sind wir weit genug UNTEN?
beq.s SetzRauf ; 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 Ende
SetzRauf:
move.b #$ff,RaufRunter ; Wenn das Label nicht auf NULL steht,
rts ; bedeutet das, daß wir rauf müßen
Ende: ; 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
; Dieses Byte, vom Label RaufRunter markiert, ist ein FLAG.
RaufRunter:
dc.b 0,0
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
; 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
; SPIEGELEFFEKT (könnte man als "TextureMap-Effekt" verkaufen)
dc.w $7007,$fffe
dc.w $180,$004 ; Color0
dc.w $102,$011 ; bplcon1
dc.w $7307,$fffe
dc.w $180,$006 ; Color0
dc.w $102,$022 ; bplcon1
dc.w $7607,$fffe
dc.w $180,$008 ; Color0
dc.w $102,$033 ; bplcon1
dc.w $7b07,$fffe
dc.w $180,$00a ; Color0
dc.w $102,$044 ; bplcon1
dc.w $8307,$fffe
dc.w $180,$00c ; Color0
dc.w $102,$055 ; bplcon1
dc.w $9007,$fffe
dc.w $180,$00e ; Color0
dc.w $102,$066 ; bplcon1
dc.w $9607,$fffe
dc.w $180,$00f ; Color0
dc.w $102,$077 ; bplcon1
dc.w $9a07,$fffe
dc.w $180,$00e ; Color0
dc.w $a007,$fffe
dc.w $180,$00c ; Color0
dc.w $102,$066 ; bplcon1
dc.w $ad07,$fffe
dc.w $180,$00a ; Color0
dc.w $102,$055 ; bplcon1
dc.w $b507,$fffe
dc.w $180,$008 ; Color0
dc.w $102,$044 ; bplcon1
dc.w $ba07,$fffe
dc.w $180,$006 ; Color0
dc.w $102,$033 ; bplcon1
dc.w $bd07,$fffe
dc.w $180,$004 ; Color0
dc.w $102,$022 ; bplcon1
dc.w $bf07,$fffe
dc.w $180,$001 ; Color0
dc.w $FFFF,$FFFE ; Ende der Copperlist
; BILD
dcb.b 30*40,0 ; Wegen der Bytes über und unter der Pic
PIC:
incbin "amiga.320*256*3" ; hier laden wir das Bild im RAW-
; Format
dcb.b 30*40,0 ; Wegen der Bytes über und unter der Pic
end
Nur durch Ändern der Copperlist des Listing5c.s haben wir diesen Effekt
erzeugt, der ein bißchen an ein "Aufrollen des Bildes auf einen Zylinder"
erinnert. Naja, überzeugt vielleicht nicht recht, aber es ist einfach zu
machen und sieht ganz nett aus. Einfach die $dff102 in aufsteigender
Reihenfolge in die Copperlist geben, kombiniert mit Wait: 1,2,3,4 um die
erste Verzerrung nach rechts zu schaffen:
+++++++++++++
+++++++++++++
+++++++++++++
+++++++++++++
In der Mitte angekommen, geht dann alles rückwärts bis auf NULL.