;Beschreibung: Eine sich bewegender Balken.
;Autor : Enrico Bauermeister
;Datum : 13.10.1997
;Assembler : TFA AsmOne v1.29
;==========================================
; graphics.library öffnen
;------------------------
lea gfxname(pc),a1 ;Name der Library
moveq #0,d0 ;Version der Library
move.l 4.w,a6 ;Basisadresse der exec.library
jsr -552(a6) ;OpenLibrary()
tst.l d0 ;Lib geöffnet ?
beq ende ;nein -> ende
lea _GfxBase(pc),a0 ;Basisadresse der graphics.library
move.l d0,(a0) ;in _GfxBase sichern
; Interrupts verbieten (Mulitasking abschalten)
;-----------------------------------------------
jsr -120(a6) ;Disable() - Wir schalten hier das
;Multitasking ab. Unser Programm hat
;nun den ganzen Amiga für sich alleine.
; alte Copperliste speichern
;---------------------------
move.l _GfxBase(pc),a6
move.l $26(a6),OldCop ;Auf Adresse $26 zur Basisadresse
;der graphics.library liegt die Adresse
;der aktuellen Copperliste.
; unsere eigende Copperliste starten
;------------------------------------
move.l #Copperliste,$dff080 ;Im Register COP1LC steht nun die Adresse
;unserer Copperliste.
move.w d0,$dff088 ;Wir starten unsere Copperliste indem wir
;irgendeinen Wert ins Register COPJMP1
;reinschreiben, z.B. D0.
; pruefen ob wir schon an Zeile 255 angekommen sind
;---------------------------------------------------
Pruefe:
cmpi.b #$ff,$dff006 ;cmpi - compare immediate -
;Inhahlt von Register VHPOSR ($dff006)
;mit der Konstante $ff (255) vergleichen.
bne.s Pruefe ;Vergleich nicht wahr -> Pruefe
; wenn ja
;---------
bsr.s BewegeCopper ;bsr - branch to subroutine -
;Rountine BewegeCopper ausführen (jede
;1/50 Sekunde)
; pruefen on wir noch auf Zeile 255 sind, und auf Zeile 0 warten
;----------------------------------------------------------------
Warte:
cmpi.b #$ff,$dff006 ;255 in VHPOSR ?
beq.s Warte ;nein -> Warte
; linke Maustaste gedrueckt ?
;-----------------------------
btst #6,$bfe001 ;btst - test bit -
;Testen ob Bit 6 im Register PRA ($bfe001)
;gesetzt (also 1) ist. bne.s Pruefe
;nein -> Pruefe
; alte COPPERLIST wieder starten
;--------------------------------
move.l OldCop(pc),$dff080 ;In Register COP1LC steht nun wieder die
;Adresse der alten Copperliste
move.w d0,$dff088 ;In COPJMP1 irgendeinen Wert -> alte
;Copperliste starten
move.l 4.w,a6 ;Basisadresse der exec.library
jsr -126(a6) ;Enable() - So, nun können wieder mehrere
;Programme den Amigs nutzen.
; Interrupts wieder zulassen (Multitasking einschalten)
;------------------------------------------------------
move.l 4.w,a6 ;Basisadresse der exec.library
jsr -126(a6) ;Enable() - So, nun können wieder mehrere
;Programme den Amigs nutzen.
; graphics.library wieder schliessen
;------------------------------------
move.l _GfxBase(pc),a1 ;Basisadresse der graphics.library
jsr -414(a6) ;CloseLibrary()
; Programm verlassen
;--------------------
ende
moveq #0,d0 ;Rückgabewert des Programmes
rts ;und tschüß ...
; Datenbereich
;--------------
gfxname: dc.b 'graphics.library',0
cnop 0,2
_GfxBase: dc.l 0
OldCop: dc.l 0
Richtung: dc.b 0,0 ;Hier speichern wir ob sich der Balken
;nach oben oder untern bewegen muß.
; Nun unseren Farbbalken bewegen
;--------------------------------
BewegeCopper:
lea Wait_o,a0 ;effektive Adresse von Wait_o nach A0 laden
tst.b Richtung ;Richtung == 0 ?
beq.w BalkenRunter ;wenn ja -> BalkenRunter
cmpi.b #$2C,(a0) ;Ist das obere Ende des Balkens schon an
;Zeile 44 ?
beq.s SetzeRichtungRunter ;wenn ja -> SetzeRichtungRunter
subq.b #2,(a0) ;2 vom ersten WAIT abziehen -> der Balken
;steigt
subq.b #2,8(a0) ;2. Wait - 8 zu der Adresse des ersten WAITs
; addieren und schon haben wir das
; zweite (8 Byte weiter als das
; erste)
subq.b #2,8*2(a0) ;3. Wait
subq.b #2,8*3(a0) ;4. Wait
subq.b #2,8*4(a0) ;5. Wait
subq.b #2,8*5(a0) ;6. Wait
subq.b #2,8*6(a0) ;7. Wait
subq.b #2,8*7(a0) ;8. Wait
subq.b #2,8*8(a0) ;9. Wait
subq.b #2,8*9(a0) ;10. Wait
rts
SetzeRichtungRunter:
clr.b Richtung ;"Richtung" auf 0 setzen
rts
BalkenRunter:
lea Wait_u,a0 ;effektive Adresse von Wait_u nach A0 laden
cmpi.b #$E6,(a0) ;Ist das untere Ende des Balkens schon an
;Zeile 230 ?
beq.s SetzeRichtungRauf ;wenn ja -> SetzeRichtungRauf
lea Wait_o,a0 ;effektive Adresse von Wait_o nach A0 laden
addq.b #2,(a0) ;2 zum ersten WAIT addieren -> der Balken
;sinkt
addq.b #2,8(a0) ;2. Wait
addq.b #2,8*2(a0) ;3. Wait
addq.b #2,8*3(a0) ;4. Wait
addq.b #2,8*4(a0) ;5. Wait
addq.b #2,8*5(a0) ;6. Wait
addq.b #2,8*6(a0) ;7. Wait
addq.b #2,8*7(a0) ;8. Wait
addq.b #2,8*8(a0) ;9. Wait
addq.b #2,8*9(a0) ;10. Wait
rts
SetzeRichtungRauf:
move.b #$FF,Richtung ;Konstante $FF in "Richtung" kopieren
rts
; Unsere eigene COPPERLIST definieren
;-------------------------------------
SECTION Grafik,CODE_C
Copperliste:
dc.w $100,$200 ;BPLCON0 -> Bitplanes abschalten
dc.w $180,$000 ;COLOR0 -> Schwarz
Wait_o:
dc.w $2C07,$FFFE ;WAIT -> Auf Zeile 44 warten
dc.w $180,$300 ;COLOR0 -> Anfangsrot
dc.w $2E07,$FFFE ;WAIT -> auf Zeile 46 warten
dc.w $180,$600 ;COLOR0 -> ...
dc.w $3007,$FFFE ;WAIT -> auf Zeile 48 warten
dc.w $180,$900 ;COLOR0 -> ...
dc.w $3207,$FFFE ;WAIT -> auf Zeile 50 warten
dc.w $180,$C00 ;COLOR0 -> ...
dc.w $3407,$FFFE ;WAIT -> auf Zeile 52 warten
dc.w $180,$F00 ;COLOR0 -> ...
dc.w $3607,$FFFE ;WAIT -> auf Zeile 54 warten
dc.w $180,$C00 ;COLOR0 -> ...
dc.w $3807,$FFFE ;WAIT -> auf Zeile 56 warten
dc.w $180,$900 ;COLOR0 -> ...
dc.w $3A07,$FFFE ;WAIT -> auf Zeile 58 warten
dc.w $180,$600 ;COLOR0 -> Endrot
dc.w $3C07,$FFFE ;WAIT -> auf Zeile 60 warten
dc.w $180,$300 ;COLOR0 -> Endrot
Wait_u:
dc.w $3E07,$FFFE ;WAIT -> auf Zeile 62 warten
dc.w $180,$000 ;COLOR0 -> Scwarz
dc.w $FFFF,$FFFE ;ENDE DER COPPERLIST
END
Zurück zum Programmierkurs