Editorial Inhalt Impressum

;Datei       : listing4.asm
;Beschreibung: Horizontale Copperanimation.
;Autor       : Enrico Bauermeister
;Datum       : 14.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
 
 
; Das graue Stueck vom roten Balken bewegen
;-------------------------------------------
 bsr.s    BewegeRot            ;jede 1/50 Sekunde ausführen
 
 
; Das graue Stueck vom gruenen Balken bewegen
;---------------------------------------------
 bsr.w    BewegeGruen          ;jede 1/50 Sekunde ausführen
                       
; 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
Links_r:  dc.w  0
Rechts_r: dc.w  0
Links_g:  dc.w  0
Rechts_g: dc.w  0
 
 
;Routine um das graue Stueck vom roten Balken zu bewegen
;--------------------------------------------------------
BewegeRot:
 cmpi.w   #78,Rechts_r         ;Schon 78 Zyklen (1/50 Sekunde) nach rechts
                               ;bewegt ?
 bne.s    NachRechts_r         ;nein -> NachRechts_r
 cmpi.w   #78,Links_r          ;Schon 78 Zyklen (1/50 Sekunde) nach links
                               ;bewegt ?
 bne.s    NachLinks_r          ;nein -> NachLinks_r
 clr.w    Rechts_r             ;"Rechts_r" auf 0 setzen
 clr.w    Links_r              ;"Links_r" auf 0 setzen
 rts
NachRechts_r:
 lea      Wait_rot+1,a0        ;1 zur effektiven Adresse von Wait_rot
                               ;addieren und nach A0 laden (ohne eine 1
                               ;zu addieren würden wir die X-Position
                               ;nach A0 laden, wir wollen aber die Y-Pos.)
 move.w   #17,d0               ;17 nach D0 kopieren (Zähler für Schleife)
loop_rot_rechts:
 addq.b   #2,(a0)              ;2 zum linken WAIT des grauen Stücks add.
 addq.b   #2,8(a0)             ;2 zum rechten WAIT des grauen Stücks add.
 add.w    #24,a0
 dbra     d0,loop_rot_rechts   ;Mit "dbra" können wir eine Zählschleife in
                               ;Assembler realisieren. Der Inhalt von D0
                               ;bei jedem Durchlauf runtergezählt. Ist -1
                               ;in D0 wird die Schleife beendet. Hier geht
                               ;die Schleife von "loop_rot_rechts" bis zum
                               ;"dbra"-Befehl und wir 18 mal durchlaufen.
                               ;18 mal deshalb, weil der rote Balken 18
                               ;Zeilen hoch ist und wir die WAITs in jeder
                               ;Zeile bewegen müssen.
 add.w    #1,Rechts_r          ;1 zu "Rechts_r" addieren
 rts
NachLinks_r:
 lea      Wait_rot+1,a0        ;Diese Routine funktioniert genauso wie
 move.w   #17,d0               ;beim nach rechts bewegen, nur eben ein
loop_rot_links:                ;"sub" statt ein "add" bei den WAITs.
 subq.b   #2,(a0)              ;                 |  |
 subq.b   #2,8(a0)             ;                 |  |
 add.w    #24,a0               ;                 |  |
 dbra     d0,loop_rot_links    ;                   /
 add.w    #1,Links_r           ;                  /
 rts
 
 
;Routine um das graue Stueck vom roten Balken zu bewegen
;--------------------------------------------------------
BewegeGruen:
 cmpi.w   #78,Links_g          ;Diese Routine funktioniert genauso wie
 bne.s    NachLinks_g          ;die für den roten Balken.
 cmpi.w   #78,Rechts_g         ;                 |  |
 bne.s    NachRechts_g         ;                 |  |
 clr.w    Links_g              ;                 |  |
 clr.w    Rechts_g             ;                 |  |
 rts                           ;                 |  |
NachRechts_g:                  ;                 |  |
 lea      Wait_gruen+1,a0      ;                 |  |
 move.w   #17,d0               ;                 |  |
loop_gruen_rechts:             ;                 |  |
 addq.b   #2,(a0)              ;                 |  |
 addq.b   #2,8(a0)             ;                 |  |
 add.w    #24,a0               ;                 |  |
 dbra     d0,loop_gruen_rechts ;                 |  |
 add.w    #1,Rechts_g          ;                 |  |
 rts                           ;                 |  |
NachLinks_g:                   ;                 |  |
 lea      Wait_gruen+1,a0      ;                 |  |
 move.w   #17,d0               ;                 |  |
loop_gruen_links:              ;                 |  |
 subq.b   #2,(a0)              ;                 |  |
 subq.b   #2,8(a0)             ;                 |  |
 add.w    #24,a0               ;                 |  |
 dbra     d0,loop_gruen_links  ;                   /
 add.w    #1,Links_g           ;                  /
 rts
 
 
; Unsere eigene COPPERLIST definieren
;-------------------------------------
; Jeder Balken ist 18 Pixel hoch. Zwischen jeden Balken ist ein Zischenraum
; von 50 Pixeln.
;--------------------------------------------------------------------------
; X-Koordinate von 59 ($3b) bis 223 ($df). Weil der COPPER beim Wait nur
; einen ungeraden Wert fuer XX zulaesst !!!
;--------------------------------------------------------------------------
 SECTION Grafik,CODE_C
Copperliste:
  dc.w    $100,$200     ;Nur Hintergrund
  dc.w    $180,$000     ;Color0 -> Schwarz
; roter Balken (von Zeile 95 bis Zeile 113)
;-------------------------------------------
;erste Zeile
  dc.w    $5f07,$fffe   ;Wait y -> 95
  dc.w    $180,$300
Wait_rot:
  dc.w    $5f3b,$fffe   ;Wait y = 95  x = 59
  dc.w    $180,$333
  dc.w    $5f45,$fffe   ;Wait y = 95  x = 69
  dc.w    $180,$300
;zweite Zeile
  dc.w    $6007,$fffe   ;Wait y -> 96
  dc.w    $180,$300
  dc.w    $603b,$fffe   ;Wait y = 96  x = 59
  dc.w    $180,$333
  dc.w    $6045,$fffe   ;Wait y = 96  x = 69
  dc.w    $180,$300
;dritte Zeile
  dc.w    $6107,$fffe   ;Wait y -> Zeile 97
  dc.w    $180,$600
  dc.w    $613b,$fffe   ;Wait y = 97  x = 59
  dc.w    $180,$666
  dc.w    $6145,$fffe   ;Wait y = 97  x = 69
  dc.w    $180,$600
;vierte Zeile
  dc.w    $6207,$fffe   ;Wait y -> Zeile 98
  dc.w    $180,$600
  dc.w    $623b,$fffe   ;Wait y = 98  x = 59
  dc.w    $180,$666
  dc.w    $6245,$fffe   ;Wait y = 98  x = 69
  dc.w    $180,$600
;fuenfte Zeile
  dc.w    $6307,$fffe   ;Wait y -> Zeile 99
  dc.w    $180,$900
  dc.w    $633b,$fffe   ;Wait y = 99  x = 59
  dc.w    $180,$999
  dc.w    $6345,$fffe   ;Wait y = 99  x = 69
  dc.w    $180,$900
;sechste Zeile
  dc.w    $6407,$fffe   ;Wait y -> Zeile 100
  dc.w    $180,$900
  dc.w    $643b,$fffe   ;Wait y = 100  x = 59
  dc.w    $180,$999
  dc.w    $6445,$fffe   ;Wait y = 100  x = 69
  dc.w    $180,$900
;siebente Zeile
  dc.w    $6507,$fffe   ;Wait y -> Zeile 101
  dc.w    $180,$c00
  dc.w    $653b,$fffe   ;Wait y = 101  x = 59
  dc.w    $180,$ccc
  dc.w    $6545,$fffe   ;Wait y = 101  x = 69
  dc.w    $180,$c00
;achte Zeile
  dc.w    $6607,$fffe   ;Wait y -> Zeile 102
  dc.w    $180,$c00
  dc.w    $663b,$fffe   ;Wait y = 102  x = 59
  dc.w    $180,$ccc
  dc.w    $6645,$fffe   ;Wait y = 102  x = 69
  dc.w    $180,$c00
;neunte Zeile
  dc.w    $6707,$fffe   ;Wait y -> Zeile 103
  dc.w    $180,$f00
  dc.w    $673b,$fffe   ;Wait y = 103  x = 59
  dc.w    $180,$fff
  dc.w    $6745,$fffe   ;Wait y = 103  x = 69
  dc.w    $180,$f00
;zehnte Zeile
  dc.w    $6807,$fffe   ;Wait y -> Zeile 104
  dc.w    $180,$f00
  dc.w    $683b,$fffe   ;Wait y = 104  x = 59
  dc.w    $180,$fff
  dc.w    $6845,$fffe   ;Wait y = 104  x = 69
  dc.w    $180,$f00
;elfte Zeile
  dc.w    $6907,$fffe   ;Wait y -> Zeile 105
  dc.w    $180,$c00
  dc.w    $693b,$fffe   ;Wait y = 105  x = 59
  dc.w    $180,$ccc
  dc.w    $6945,$fffe   ;Wait y = 105  x = 69
  dc.w    $180,$c00
;zwoelfte Zeile
  dc.w    $6a07,$fffe   ;Wait y -> Zeile 106
  dc.w    $180,$c00
  dc.w    $6a3b,$fffe   ;Wait y = 106  x = 59
  dc.w    $180,$ccc
  dc.w    $6a45,$fffe   ;Wait y = 106  x = 69
  dc.w    $180,$c00
;dreizehnte Zeile
  dc.w    $6b07,$fffe   ;Wait y -> Zeile 107
  dc.w    $180,$900
  dc.w    $6b3b,$fffe   ;Wait y = 107  x = 59
  dc.w    $180,$999
  dc.w    $6b45,$fffe   ;Wait y = 107  x = 69
  dc.w    $180,$900
;vierzehnte Zeile
  dc.w    $6c07,$fffe   ;Wait y -> Zeile 108
  dc.w    $180,$900
  dc.w    $6c3b,$fffe   ;Wait y = 108  x = 59
  dc.w    $180,$999
  dc.w    $6c45,$fffe   ;Wait y = 108  x = 69
  dc.w    $180,$900
;fuenfzehnte Zeile
  dc.w    $6d07,$fffe   ;Wait y -> Zeile 109
  dc.w    $180,$600
  dc.w    $6d3b,$fffe   ;Wait y = 109  x = 59
  dc.w    $180,$666
  dc.w    $6d45,$fffe   ;Wait y = 109  x = 69
  dc.w    $180,$600
;sechszehnte Zeile
  dc.w    $6e07,$fffe   ;Wait y -> Zeile 110
  dc.w    $180,$600
  dc.w    $6e3b,$fffe   ;Wait y = 110  x = 59
  dc.w    $180,$666
  dc.w    $6e45,$fffe   ;Wait y = 110  x = 69
  dc.w    $180,$600
;siebzehnte Zeile
  dc.w    $6f07,$fffe   ;Wait y -> Zeile 111
  dc.w    $180,$300
  dc.w    $6f3b,$fffe   ;Wait y = 111  x = 59
  dc.w    $180,$333
  dc.w    $6f45,$fffe   ;Wait y = 111  x = 69
  dc.w    $180,$300
;achtzehnte Zeile
  dc.w    $7007,$fffe   ;Wait y -> Zeile 112
  dc.w    $180,$300
  dc.w    $703b,$fffe   ;Wait y = 112  x = 59
  dc.w    $180,$333
  dc.w    $7045,$fffe   ;Wait y = 112  x = 69
  dc.w    $180,$300
  dc.w    $7107,$fffe   ;Wait y -> Zeile 113
; Zwischenraum zwischen roten und gruenen Balken
;------------------------------------------------
  dc.w    $180,$000     ;Color0 -> Scwarz
; gruener Balken (von Zeile 164 bis Zeile 182)
;----------------------------------------------
;erste Zeile
  dc.w    $a407,$fffe   ;Wait y -> Zeile 164
  dc.w    $180,$030
Wait_gruen:
  dc.w    $a4d3,$fffe   ;Wait y = 164  x = 211
  dc.w    $180,$333
  dc.w    $a4dd,$fffe   ;Wait y = 164  x = 221
  dc.w    $180,$030
;zweite Zeile
  dc.w    $a507,$fffe   ;Wait y -> Zeile 165
  dc.w    $180,$030
  dc.w    $a5d3,$fffe   ;Wait y = 165  x = 211
  dc.w    $180,$333
  dc.w    $a5dd,$fffe   ;Wait y = 165  x = 221   dc.w    $180,$030
;dritte Zeile
  dc.w    $a607,$fffe   ;Wait y -> Zeile 166
  dc.w    $180,$060
  dc.w    $a6d3,$fffe   ;Wait y = 166  x = 211
  dc.w    $180,$666
  dc.w    $a6dd,$fffe   ;Wait y = 166  x = 221
  dc.w    $180,$060
;vierte Zeile
  dc.w    $a707,$fffe   ;Wait y -> Zeile 167
  dc.w    $180,$060
  dc.w    $a7d3,$fffe   ;Wait y = 167  x = 211
  dc.w    $180,$666
  dc.w    $a7dd,$fffe   ;Wait y = 167  x = 221
  dc.w    $180,$060
;fuenfte Zeile
  dc.w    $a807,$fffe   ;Wait y -> Zeile 168
  dc.w    $180,$090
  dc.w    $a8d3,$fffe   ;Wait y = 168  x = 211
  dc.w    $180,$999
  dc.w    $a8dd,$fffe   ;Wait y = 168  x = 221
  dc.w    $180,$090
;sechste Zeile
  dc.w    $a907,$fffe   ;Wait y -> Zeile 169
  dc.w    $180,$090
  dc.w    $a9d3,$fffe   ;Wait y = 169  x = 211
  dc.w    $180,$999
  dc.w    $a9dd,$fffe   ;Wait y = 169  x = 221
  dc.w    $180,$090
;siebente Zeile
  dc.w    $aa07,$fffe   ;Wait y -> Zeile 170
  dc.w    $180,$0c0
  dc.w    $aad3,$fffe   ;Wait y = 170  x = 211
  dc.w    $180,$ccc
  dc.w    $aadd,$fffe   ;Wait y = 170  y = 221
  dc.w    $180,$0c0
;achte Zeile
  dc.w    $ab07,$fffe   ;Wait y -> Zeile 171
  dc.w    $180,$0c0
  dc.w    $abd3,$fffe   ;Wait y = 171  x = 211
  dc.w    $180,$ccc
  dc.w    $abdd,$fffe   ;Wait y = 171  y = 221
  dc.w    $180,$0c0
;neunte Zeile
  dc.w    $ac07,$fffe   ;Wait y -> Zeile 172
  dc.w    $180,$0f0
  dc.w    $acd3,$fffe   ;Wait y = 172  x = 211
  dc.w    $180,$fff
  dc.w    $acdd,$fffe   ;Wait y = 172  x = 221
  dc.w    $180,$0f0
;zehnte Zeile
  dc.w    $ad07,$fffe   ;Wait y -> Zeile 173
  dc.w    $180,$0f0
  dc.w    $add3,$fffe   ;Wait y = 173  x = 211
  dc.w    $180,$fff
  dc.w    $addd,$fffe   ;Wait y = 173  x = 221
  dc.w    $180,$0f0
;elfte Zeile
  dc.w    $ae07,$fffe   ;Wait y -> Zeile 174
  dc.w    $180,$0c0
  dc.w    $aed3,$fffe   ;Wait y = 174  x = 211
  dc.w    $180,$ccc
  dc.w    $aedd,$fffe   ;Wait y = 174  x = 221
  dc.w    $180,$0c0
;zwoelfte Zeile
  dc.w    $af07,$fffe   ;Wait y -> Zeile 175
  dc.w    $180,$0c0
  dc.w    $afd3,$fffe   ;Wait y = 175  x = 211
  dc.w    $180,$ccc
  dc.w    $afdd,$fffe   ;Wait y = 175  x = 221
  dc.w    $180,$0c0
;dreizehnte Zeile
  dc.w    $b007,$fffe   ;Wait y -> Zeile 176
  dc.w    $180,$090
  dc.w    $b0d3,$fffe   ;Wait y = 176  x = 211
  dc.w    $180,$999
  dc.w    $b0dd,$fffe   ;Wait y = 176  x = 221
  dc.w    $180,$090
;vierzehnte Zeile
  dc.w    $b107,$fffe   ;Wait y -> Zeile 177
  dc.w    $180,$090
  dc.w    $b1d3,$fffe   ;Wait y = 177  x = 211
  dc.w    $180,$999
  dc.w    $b1dd,$fffe   ;Wait y = 177  x = 221
  dc.w    $180,$090
;fuenfzehnte Zeile
  dc.w    $b207,$fffe   ;Wait y -> Zeile 178
  dc.w    $180,$060
  dc.w    $b2d3,$fffe   ;Wait y = 178  x = 211
  dc.w    $180,$666
  dc.w    $b2dd,$fffe   ;Wait y = 178  x = 221
  dc.w    $180,$060
;sechszehnte Zeile
  dc.w    $b307,$fffe   ;Wait y -> Zeile 179
  dc.w    $180,$060
  dc.w    $b3d3,$fffe   ;Wait y = 179  x = 211
  dc.w    $180,$666
  dc.w    $b3dd,$fffe   ;Wait y = 179  x = 221   dc.w    $180,$060
;siebzehnte Zeile
  dc.w    $b407,$fffe   ;Wait y -> Zeile 180
  dc.w    $180,$030
  dc.w    $b4d3,$fffe   ;Wait y = 180  x = 211
  dc.w    $180,$333
  dc.w    $b4dd,$fffe   ;Wait y = 180  x = 221
  dc.w    $180,$030
;achtzehnte Zeile
  dc.w    $b507,$fffe   ;Wait y -> Zeile 181
  dc.w    $180,$030
  dc.w    $b5d3,$fffe   ;Wait y = 181  x = 211
  dc.w    $180,$333
  dc.w    $b5dd,$fffe   ;Wait y = 181  x = 221
  dc.w    $180,$030
  dc.w    $b607,$fffe   ;Wait y -> Zeile 182
; Zwischenraum zwischen gruenen und blauen Balken
;-------------------------------------------------
   dc.w    $180,$000     ;Color0 -> Scwarz 
  dc.w    $e907,$fffe   ;Wait y -> Zeile 233
; blauer Balken (von Zeile 233 bis Zeile 251)
;----------------------------------------------
  dc.w    $180,$003
  dc.w    $eb07,$fffe   ;Wait y -> Zeile 235
  dc.w    $180,$006
  dc.w    $ed07,$fffe   ;Wait y -> Zeile 237
  dc.w    $180,$009
  dc.w    $ef07,$fffe   ;Wait y -> Zeile 239
  dc.w    $180,$00c
  dc.w    $f107,$fffe   ;Wait y -> Zeile 241
  dc.w    $180,$00f
  dc.w    $f307,$fffe   ;Wait y -> Zeile 243
  dc.w    $180,$00c
  dc.w    $f507,$fffe   ;Wait y -> Zeile 245
  dc.w    $180,$009
  dc.w    $f707,$fffe   ;Wait y -> Zeile 247
  dc.w    $180,$006
  dc.w    $f907,$fffe   ;Wait y -> Zeile 249
  dc.w    $180,$003
  dc.w    $fb07,$fffe   ;Wait y -> Zeile 251
; Zwischenraum zwischen blauen Balken und Bildschirmende
;--------------------------------------------------------
  dc.w    $180,$000     ;Color0 -> Scwarz
  dc.w    $FFFF,$FFFE   ;Ende der Copperliste
 
 END

Zurück zum Programmierkurs