home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1998 #6 / amigamamagazinepolishissue1998.iso / coders / assembler-kurs / listings2 / listing5h.s < prev    next >
Text File  |  1977-12-31  |  7KB  |  237 lines

  1.  
  2. ; Listing5h.s    HORIZONTALE WELLENBEWEGUNG EINES BILDES MIT DEM $dff102
  3.  
  4.  
  5.     SECTION    CIPundCOP,CODE
  6.  
  7. Anfang:
  8.     move.l    4.w,a6        ; Execbase in a6
  9.     jsr    -$78(a6)    ; Disable - stoppt das Multitasking
  10.     lea    GfxName(PC),a1    ; Adresse des Namen der zu öffnenden Lib in a1
  11.     jsr    -$198(a6)    ; OpenLibrary
  12.     move.l    d0,GfxBase    ; speichere diese Adresse in GfxBase
  13.     move.l    d0,a6
  14.     move.l    $26(a6),OldCop    ; hier speichern wir die Adresse der Copperlist
  15.                 ; des Betriebssystemes
  16.  
  17. ;    POINTEN AUF UNSERE BITPLANES
  18.  
  19.     MOVE.L    #PIC,d0        ; in d0 kommt die Adresse unserer PIC
  20.     LEA    BPLPOINTERS,A1    ; in a1 kommt die Adresse der Bitplane-
  21.                 ; Pointer der Copperlist
  22.     MOVEQ    #2,D1        ; Anzahl der Bitplanes -1 (hier sind es 3)
  23.                 ; für den DBRA - Zyklus
  24. POINTBP:
  25.     move.w    d0,6(a1)    ; kopiert das niederwertige Word der Plane-
  26.                 ; Adresse ins richtige Word der Copperlist
  27.     swap    d0        ; vertauscht die 2 Word in d0 (1234 > 3412)
  28.  
  29.     move.w    d0,2(a1)    ; kopiert das hochwertige Word der Adresse des 
  30.                 ; Plane in das richtige Word in der Copperlist
  31.     swap    d0        ; vertauscht erneut die 2 Word von d0
  32.     ADD.L    #40*256,d0    ; Zählen 10240 zu D0 dazu, -> nächstes Plane
  33.  
  34.     addq.w    #8,a1        ; zu den nächsten Bplpointers in der Cop
  35.     dbra    d1,POINTBP    ; Wiederhole D1 mal POINTBP (d1=n. bitplanes)
  36.  
  37.     move.l    #COPPERLIST,$dff080    ; COP1LC - "Zeiger" auf unsere COP
  38.     move.w    d0,$dff088        ; COPJMP1 - Starten unsere COP
  39.     move.w    #0,$dff1fc        ; FMODE - Deaktiviert das AGA
  40.     move.w    #$c00,$dff106        ; BPLCON3 - Deaktiviert das AGA
  41.  
  42. mouse:
  43.     cmpi.b    #$ff,$dff006    ; Sind wir auf Zeile 255?
  44.     bne.s    mouse        ; Wenn nicht, geh nicht weiter
  45.  
  46.     btst    #2,$dff016    ; wenn die rechte Maustaste gedrückt ist,
  47.     beq.s    Warte        ; überspringe die Routine
  48.  
  49.     bsr.s    Wellen        ; Bringt das Bild in Wellenbewegung
  50.  
  51. Warte:
  52.     cmpi.b    #$ff,$dff006    ; Sind wir auf Zeile 255?
  53.     beq.s    Warte        ; Wenn nicht, geh nicht weiter
  54.  
  55.     btst    #6,$bfe001    ; linke Maustaste gedrückt?
  56.     bne.s    mouse        ; wenn nicht, zurück zu mouse:
  57.  
  58.     move.l    OldCop(PC),$dff080    ; COP1LC - "Zeiger" auf die Orginal-COP
  59.     move.w    d0,$dff088        ; COPJMP1 - und starten sie
  60.  
  61.     move.l    4.w,a6
  62.     jsr    -$7e(a6)    ; Enable - stellt Multitasking wieder her
  63.     move.l    GfxBase(PC),a1    ; Basis der Library, die es zu schließen gilt
  64.                 ; (Libraries werden geöffnet UND geschlossen!)
  65.     jsr    -$19e(a6)    ; Closelibrary - schließt die Graphics lib
  66.     rts
  67.  
  68. ; DATEN
  69.  
  70.  
  71. GfxName:
  72.     dc.b    "graphics.library",0,0    
  73.  
  74. GfxBase:        ; Hier hinein kommt die Basisadresse der graphics.lib,
  75.     dc.l    0    ; ab hier werden die Offsets gemacht
  76.  
  77. OldCop:         ; Hier hinein kommt die Adresse der Orginal-Copperlist des
  78.     dc.l    0    ; Betriebssystemes
  79.  
  80.  
  81. ; Diese Routine ist ähnlich mit der in Listing3e.s, die Werte werden wie in
  82. ; einer Kette vertauscht. Ich erinnere euch das System:
  83. ;
  84. ;    move.w    col2,col1    ; col2 kommt in col1
  85. ;    move.w    col3,col2    ; col3 kommt in col2
  86. ;    move.w    col4,col3    ; col4 kommt in col3
  87. ;    move.w    col5,col4    ; col5 kommt in col4
  88. ;
  89. ; In dieser Routine werden aber anstatt der Farben die Werte des $dff102
  90. ; kopiert, aber die grundsätzliche funktionsweise der Routine ist die gleiche.
  91. ; Um LABEL und Zeit zu sparen wurde diese Routine mit einem DBRA-Zyklus
  92. ; ausgestattet, der die Rotation sovieler Word vornimmt, wie wir wollen: da
  93. ; die zu ändernden Word alle 8 Byte entfernt sind, brauchen wir nur eines
  94. ; in a0 zu geben, das andere in a1 und dann mit einem MOVE.W (a0),(a1) zu
  95. ; kopieren. Dann schreiten wir zum nächsten Paar über, indem wir zu a0 und a1
  96. ; 8 dazuzählen, sie werden dann auf die nächsten Word pointen.
  97. ; Achtung: um einen unendlichen Zyklus zu machen, muß der letzte Wert immer
  98. ; in den errsten geschrieben werden:
  99. ;
  100. ;    >>>>>>>>>>>>>>>>>>>>>
  101. ;    ^            v
  102. ; In diesem Fall wir am Ende des Zyklus immer der erste Wert in den letzten
  103. ; geschrieben, der Zufluß ist also konstant. Die alte Routine endete so:
  104. ;    move.w    col1,col14    ; col1 kommt in col14
  105.  
  106. Wellen:
  107.     LEA    Con1Effekt+8,A0 ; Adresse Quellword in a0
  108.     LEA    Con1Effekt,A1    ; Adresse Zielword in a1
  109.     MOVEQ    #44,D2        ; 45 BPLCON1 sind in COPLIST zu ändern
  110. Vertausche:
  111.     MOVE.W    (A0),(A1)    ; kopiert zwei Word - scroll!
  112.     ADDQ.W    #8,A0        ; nächstes Word-Paar
  113.     ADDQ.W    #8,A1        ; nächstes Word-Paar
  114.     DBRA    D2,Vertausche    ; wiederhole "Vertausche" die richtige
  115.                 ; Anzahl mal
  116.     MOVE.W    Con1Effekt,LetzterWert    ; um den Zyklus unendlich fortlaufen zu
  117.     RTS                ; lassen kopieren wir den ersten Wert
  118.                     ; jedesmal in den Letzten.
  119.  
  120.  
  121.     SECTION GRAPHIC,DATA_C
  122.  
  123.  
  124. COPPERLIST:
  125.     dc.w    $120,$0000,$122,$0000,$124,$0000,$126,$0000,$128,$0000 ; SPRITE
  126.     dc.w    $12a,$0000,$12c,$0000,$12e,$0000,$130,$0000,$132,$0000
  127.     dc.w    $134,$0000,$136,$0000,$138,$0000,$13a,$0000,$13c,$0000
  128.     dc.w    $13e,$0000
  129.  
  130.     dc.w    $8e,$2c81    ; DiwStrt    (Register mit Standartwerten)
  131.     dc.w    $90,$2cc1    ; DiwStop
  132.     dc.w    $92,$0038    ; DdfStart
  133.     dc.w    $94,$00d0    ; DdfStop
  134.     
  135.     dc.w    $102        ; BplCon1 - DAS REGISTER
  136.     dc.b    $00        ; BplCon1 - DAS NICHT VERWENDETE BYTE!!!
  137. MEINCON1:
  138.     dc.b    $00        ; BplCon1 - DAS VERWENDETE BYTE!!!
  139.  
  140.     dc.w    $104,0        ; BplCon2
  141.     dc.w    $108,0        ; Bpl1Mod
  142.     dc.w    $10a,0        ; Bpl2Mod
  143.  
  144.             ; 5432109876543210  ; BPLCON0:
  145.     dc.w    $100,%0011001000000000  ; Bits 13 und 12 an!! (3 = %011)
  146.                     ; 3 Bitplanes Lowres, nicht Lace
  147. BPLPOINTERS:
  148.     dc.w $e0,$0000,$e2,$0000    ;erstes  Bitplane - BPL0PT
  149.     dc.w $e4,$0000,$e6,$0000    ;zweites Bitplane - BPL1PT
  150.     dc.w $e8,$0000,$ea,$0000    ;drittes Bitplane - BPL2PT
  151.  
  152.     dc.w    $0180,$000    ; Color0
  153.     dc.w    $0182,$475    ; Color1
  154.     dc.w    $0184,$fff    ; Color2
  155.     dc.w    $0186,$ccc    ; Color3
  156.     dc.w    $0188,$999    ; Color4
  157.     dc.w    $018a,$232    ; Color5
  158.     dc.w    $018c,$777    ; Color6
  159.     dc.w    $018e,$444    ; Color7
  160.  
  161. ; Der Effekt in der Copperlist: er besteht aus einem Wait und einem
  162. ; BPLCON1, die Wait stehen alle 4 Zeilen: $34, $38, $3c...
  163. ; In den $dff102 sind schon die "Wellenwerte" enthalten: 1,2,3,4,...3,2,1.
  164.  
  165.     DC.W    $3007,$FFFE,$102
  166. Con1Effekt:
  167.     DC.W    $00
  168.     DC.W    $3407,$FFFE,$102,$00
  169.     DC.W    $3807,$FFFE,$102,$00
  170.     DC.W    $3C07,$FFFE,$102,$11
  171.     DC.W    $4007,$FFFE,$102,$11
  172.     DC.W    $4407,$FFFE,$102,$11
  173.     DC.W    $4807,$FFFE,$102,$11
  174.     DC.W    $4C07,$FFFE,$102,$22
  175.     DC.W    $5007,$FFFE,$102,$22
  176.     DC.W    $5407,$FFFE,$102,$22
  177.     DC.W    $5807,$FFFE,$102,$33
  178.     DC.W    $5C07,$FFFE,$102,$33
  179.     DC.W    $6007,$FFFE,$102,$44
  180.     DC.W    $6407,$FFFE,$102,$44
  181.     DC.W    $6807,$FFFE,$102,$55
  182.     DC.W    $6C07,$FFFE,$102,$66
  183.     DC.W    $7007,$FFFE,$102,$77
  184.     DC.W    $7407,$FFFE,$102,$88
  185.     DC.W    $7807,$FFFE,$102,$88
  186.     DC.W    $7C07,$FFFE,$102,$99
  187.     DC.W    $8007,$FFFE,$102,$99
  188.     DC.W    $8407,$FFFE,$102,$aa
  189.     DC.W    $8807,$FFFE,$102,$aa
  190.     DC.W    $8C07,$FFFE,$102,$aa
  191.     DC.W    $9007,$FFFE,$102,$99
  192.     DC.W    $9407,$FFFE,$102,$99
  193.     DC.W    $9807,$FFFE,$102,$88
  194.     DC.W    $9C07,$FFFE,$102,$88
  195.     DC.W    $A007,$FFFE,$102,$77
  196.     DC.W    $A407,$FFFE,$102,$66
  197.     DC.W    $A807,$FFFE,$102,$55
  198.     DC.W    $AC07,$FFFE,$102,$44
  199.     DC.W    $B007,$FFFE,$102,$44
  200.     DC.W    $B407,$FFFE,$102,$33
  201.     DC.W    $B807,$FFFE,$102,$33
  202.     DC.W    $BC07,$FFFE,$102,$22
  203.     DC.W    $C007,$FFFE,$102,$22
  204.     DC.W    $C407,$FFFE,$102,$22
  205.     DC.W    $C807,$FFFE,$102,$11
  206.     DC.W    $CC07,$FFFE,$102,$11
  207.     DC.W    $D007,$FFFE,$102,$11
  208.     DC.W    $D407,$FFFE,$102,$11
  209.     DC.W    $D807,$FFFE,$102,$00
  210.     DC.W    $DC07,$FFFE,$102,$00
  211.     DC.W    $E007,$FFFE,$102,$00
  212.     DC.W    $E407,$FFFE,$102
  213.  
  214. LetzterWert:
  215.     DC.W    $00
  216.  
  217.     dc.w    $FFFF,$FFFE    ; Ende der Copperlist
  218.  
  219. ;    BILD
  220.  
  221.  
  222. PIC:
  223.     incbin    "amiga.320*256*3"    ; hier laden wir das Bild im RAW-
  224.                     ; Format
  225.  
  226.     end
  227.  
  228. Dieser  Welleneffekt  ist  ein Klassiker der Amiga. Um zu Sparen wird hier
  229. nicht bei jeder Zeile eine Welle erzeugt, sondern nur alle 4 Zeilen,  aber
  230. mindestens  ist  die  Routine  schnell,  die die $dff102 in der Copperlist
  231. durchläuft.
  232.  
  233. Die Routine in diesem Listing kann überall dort verwendet werden  wo  Word
  234. "rotiert"  werden  müßen,  also  könnte  sie  euch  bei  Farbeffekten  und
  235. ähnlichem dienen.
  236.  
  237.