home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga MA Magazine 1998 #6
/
amigamamagazinepolishissue1998.iso
/
coders
/
assembler-kurs
/
listings
/
listing3c2.s
< prev
next >
Wrap
Text File
|
1977-12-31
|
4KB
|
128 lines
; Listing3c2.s ; BALKEN, DER SINKT, ERSTELLT MIT EINEM MOVE&WAIT DES COPPER
; (UM IHN ZUM SINKEN ZU BRINGEN RECHTE MAUSTASTE)
; Es wurde eine Kontrolle hinzugefügt, um ab einer
; bestimmten Zeile des Scroll anzuhalten
SECTION ZWEITECOP,CODE ; auch Fast ist OK
Anfang:
move.l 4.w,a6 ; Execbase in a6
jsr -$78(a6) ; Disable - stoppt das Multitasking
lea GfxName,a1 ; Adresse des Namen der zu öffnenden Library in a1
jsr -$198(a6) ; OpenLibrary, Routine der EXEC, die Libraris
; öffnet, und als Resultat in d0 die Basisadresse
; derselben Bibliothek liefert, ab welcher
; die Offsets (Distanzen) zu machen sind
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 (immer auf $26 nach
; GfxBase)
move.l #COPPERLIST,$dff080 ; COP1LC - "Zeiger" auf unsere COP
; (deren Adresse)
move.w d0,$dff088 ; COPJMP1 - Starten unsere COP
mouse:
cmpi.b #$ff,$dff006 ; VHPOSR - sind wir bei Zeile 255 angekommen?
bne.s mouse ; Wenn nicht, geh nicht weiter
btst #2,$dff016 ; POTINP - Rechte Maustaste gedrückt?
bne.s Warte ; Wenn nicht, führe BEWEGECOPPER nicht aus
bsr.s BewegeCopper ; Diese Subroutine läßt das WAIT sinken!
; Sie wird einmal pro Frame ausgeführt.
Warte:
cmpi.b #$ff,$dff006 ; VHPOSR:
; Sind wir noch auf $FF? Wenn ja, warte auf die
beq.s Warte ; nächste Zeile (00). Ansonsten wird BewegeCopper
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
;
; Diese kleine Routine bringt das Wait des Copper zum sinken, indem es
; erhöht wird, bei der ersten Ausführung wird das
;
; dc.w $2007,$FFFE ; Warte auf Zeile $20
;
; so verändert werden:
;
; dc.w $2107,$FFFE ; Warte auf Zeile $21! (Dannn $22,$23 ecc.)
;
; usw. bis der Maximalwert erreicht ist, in unserem Falle $fc
BewegeCopper:
cmpi.b #$fc,BALKEN ; sind wir bei Zeile $fc angekommen?
beq.s Beendet ; wenn ja, dann sind wir unten und stoppen
addq.b #1,BALKEN ; WAIT 1 verändert, Balken sinkt un eine Zeile
Beendet:
rts
; Wenn BALKEN $fc erreicht hat, dann wird das addq übersprungen.
; P.S: Zur Zeit können wir den letzten Teil des Bildschirmes noch
; nicht erreichen (nach $FF), ich erkläre euch später warum und
; wie es geht.
; DATEN...
GfxName:
dc.b "graphics.library",0,0 ; Bemerkung: um Charakter in den
; Speicher zu geben, verwenden wir
; immer das dc.b und setzen sie
; unter "" oder '', Abschluß mit ,0
GfxBase: ; Hier hinein kommt die Basisadresse der graphics.library,
dc.l 0 ; ab hier werden die Offsets gemacht
OldCop: ; Hier hinein kommt die Adresse der Orginal-Copperlist des
dc.l 0 ; Betriebssystemes
SECTION MeinCopper,DATA_C ; Dieser Befehl veranlaßt das Betriebssystem,
; das folgende Datensegment in die CHIP-RAM
; zu laden, obligatorisch.
; Die Cpperlist MÜSSEN in die CHIP RAM!
COPPERLIST:
dc.w $100,$200 ; BPLCON0 - keine Bitplanes, nur Hintergrund
dc.w $180,$004 ; COLOR0 - Beginne die COP mit DUNKELBLAU
BALKEN:
dc.w $7907,$FFFE ; WAIT - Warte auf Zeile $79
dc.w $180,$600 ; COLOR0 - Hier beginnt die rote Zone : ROT auf 6
dc.w $FFFF,$FFFE ; ENDE DER COPPERLIST
end
Als Änderungen könntet ihr versuchen, das $fc in der Zeile
cmpi.b #$fc,BALKEN
durch andere Werte zu ersetzen, und ihr werdet bemerken, wie der Balken nur
bis zum gegebenen Wert sinkt.