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

  1.  
  2. ; Listing5d.s    SCROLLEN EINES BILDES NACH OBEN UND UNTEN, KOMBINIERT
  3. ;        MIT EINEM VERZERRUNGSEFFEKT, HERGESTELLT MIT DEM
  4. ;        $dff102 (BPLCON0)
  5.  
  6.     SECTION    CIPundCOP,CODE
  7.  
  8. Anfang:
  9.     move.l    4.w,a6        ; Execbase in a6
  10.     jsr    -$78(a6)    ; Disable - stoppt das Multitasking
  11.     lea    GfxName(PC),a1    ; Adresse des Namen der zu öffnenden Lib in a1
  12.     jsr    -$198(a6)    ; OpenLibrary
  13.     move.l    d0,GfxBase    ; speichere diese Adresse in GfxBase
  14.     move.l    d0,a6
  15.     move.l    $26(a6),OldCop    ; hier speichern wir die Adresse der Copperlist
  16.                 ; des Betriebssystemes
  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 Scrollroutine
  48.  
  49.     bsr.s    BewegeCopper    ; Scrollt Bild rauf und runter durch
  50.                 ; Ändern der Bitplanepointers
  51.  
  52. Warte:
  53.     cmpi.b    #$ff,$dff006    ; Sind wir noch auf Zeile 255?
  54.     beq.s    Warte        ; Wenn ja, geh nicht weiter
  55.  
  56.     btst    #6,$bfe001    ; linke Maustaste gedrückt?
  57.     bne.s    mouse        ; wenn nicht, zurück zu mouse:
  58.  
  59.     move.l    OldCop(PC),$dff080    ; COP1LC - "Zeiger" auf die Orginal-COP
  60.     move.w    d0,$dff088        ; COPJMP1 - und starten sie
  61.  
  62.     move.l    4.w,a6
  63.     jsr    -$7e(a6)    ; Enable - stellt Multitasking wieder her
  64.     move.l    GfxBase(PC),a1    ; Basis der Library, die es zu schließen gilt
  65.                 ; (Libraries werden geöffnet UND geschlossen!)
  66.     jsr    -$19e(a6)    ; Closelibrary - schließt die Graphics lib
  67.     rts
  68.  
  69. ; DATEN
  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. ;    Diese Routine bewegt das Bild nach oben und unten, imdem sie auf
  81. ;    die Bitplanepointer in der Copperlist zugreift (Mit dem Label
  82. ;    BPLPOINTERS).
  83. ;    Die Struktur ist ähnlich mit der in Listing3d.s
  84. ;    Als erstes geben wir die Adresse, die dir BPLPOINTERS gerade anpointen
  85. ;    in d0, dann addieren oder subtrahieren wir 40 Bytes von d0, und
  86. ;    setzen dann diesen neuen Wert in die Copperlist ein. Dafür verwenden
  87. ;    wir wieder die gleiche Routine POINTBP.
  88.  
  89.  
  90. BewegeCopper:
  91.     LEA    BPLPOINTERS,A1    ; Mit diesen 4 Anweisungen holen wir aus der
  92.     move.w    2(a1),d0    ; Copperlist die Adresse, wohin das $dff0e0
  93.     swap    d0        ; gerade pointet und geben diesen Wert
  94.     move.w    6(a1),d0    ; in d0
  95.  
  96.     TST.B    RaufRunter    ; Müßen wir nach oben oder unten?
  97.  
  98.     beq.w    GehRunter
  99.     cmp.l    #PIC-(40*30),d0 ; sind wir weit genug OBEN?
  100.     beq.s    SetzRunter    ; wenn ja, sind wir am Ende und müßen runter
  101.     sub.l    #40,d0        ; subtrahieren 40, also 1 Zeile, dadurch
  102.                 ; wandert das Bild nach UNTEN
  103.     bra.s    Ende
  104.  
  105. SetzRunter:
  106.     clr.b    RaufRunter    ; Durch Löschen von RaufRunter wird das TST
  107.     bra.s    Ende        ; danach wieder BEQ ermöglichen ->
  108.                 ; BEQ wird zur Routine GehRunter springen
  109.  
  110. GehRunter:
  111.     cmpi.l    #PIC+(40*30),d0 ; sind wir weit genug UNTEN?
  112.     beq.s    SetzRauf    ; wenn ja, sind wir am unteren Ende und
  113.                 ; müßen wieder rauf
  114.     add.l    #40,d0        ; Addieren 40, also 1 Zeile, somit scrollt
  115.                 ; das Bild nach OBEN
  116.     bra.s    Ende
  117.  
  118. SetzRauf:
  119.     move.b    #$ff,RaufRunter ; Wenn das Label nicht auf NULL steht,
  120.     rts            ; bedeutet das, daß wir rauf müßen
  121.  
  122. Ende:                ; POINTEN DIE BITPLANEPOINTER AN
  123.     LEA    BPLPOINTERS,A1    ; POINTER in der COPPERLIST
  124.     MOVEQ    #2,D1        ; Anzahl der Bitplanes -1 (hier: 3)
  125. POINTBP2:
  126.     move.w    d0,6(a1)    ; kopiert das niederw. Word der Adress des Pl.
  127.     swap    d0        ; vertauscht die 2 Word von d0 (1234 > 3412)
  128.     move.w    d0,2(a1)    ; kopiert das höherw. Word der Adresse des Pl.
  129.     swap    d0        ; vertauscht die 2 Word von d0 (3412 > 1234)
  130.     ADD.L    #40*256,d0    ; + Länge Bitplane -> nächstes Bitplane
  131.     addq.w    #8,a1        ; zu den nächsten bplpointers in der Cop
  132.     dbra    d1,POINTBP2    ; Wiederhole D1 Mal POINTBP (D1=n. bitplanes)
  133.     rts
  134.  
  135.  
  136. ;    Dieses Byte, vom Label RaufRunter markiert, ist ein FLAG.
  137.  
  138. RaufRunter:
  139.     dc.b    0,0
  140.  
  141.  
  142.     SECTION GRAPHIC,DATA_C
  143.  
  144.  
  145. COPPERLIST:
  146.     dc.w    $120,$0000,$122,$0000,$124,$0000,$126,$0000,$128,$0000 ; SPRITE
  147.     dc.w    $12a,$0000,$12c,$0000,$12e,$0000,$130,$0000,$132,$0000
  148.     dc.w    $134,$0000,$136,$0000,$138,$0000,$13a,$0000,$13c,$0000
  149.     dc.w    $13e,$0000
  150.  
  151.     dc.w    $8e,$2c81    ; DiwStrt    (Register mit Standartwerten)
  152.     dc.w    $90,$2cc1    ; DiwStop
  153.     dc.w    $92,$0038    ; DdfStart
  154.     dc.w    $94,$00d0    ; DdfStop
  155.     dc.w    $102,0        ; BplCon1
  156.     dc.w    $104,0        ; BplCon2
  157.     dc.w    $108,0        ; Bpl1Mod
  158.     dc.w    $10a,0        ; Bpl2Mod
  159.  
  160.             ; 5432109876543210  ; BPLCON0:
  161.     dc.w    $100,%0011001000000000  ; Bits 13 und 12 an!! (3 = %011)
  162.                     ; 3 Bitplanes Lowres, nicht Lace
  163. BPLPOINTERS:
  164.     dc.w $e0,$0000,$e2,$0000    ;erstes  Bitplane - BPL0PT
  165.     dc.w $e4,$0000,$e6,$0000    ;zweites Bitplane - BPL1PT
  166.     dc.w $e8,$0000,$ea,$0000    ;drittes Bitplane - BPL2PT
  167.  
  168.     dc.w    $0180,$000    ; Color0
  169.     dc.w    $0182,$475    ; Color1
  170.     dc.w    $0184,$fff    ; Color2
  171.     dc.w    $0186,$ccc    ; Color3
  172.     dc.w    $0188,$999    ; Color4
  173.     dc.w    $018a,$232    ; Color5
  174.     dc.w    $018c,$777    ; Color6
  175.     dc.w    $018e,$444    ; Color7
  176.  
  177. ;    SPIEGELEFFEKT (könnte man als "TextureMap-Effekt" verkaufen)
  178.  
  179.     dc.w    $7007,$fffe
  180.     dc.w    $180,$004    ; Color0
  181.     dc.w    $102,$011    ; bplcon1
  182.     dc.w    $7307,$fffe
  183.     dc.w    $180,$006    ; Color0
  184.     dc.w    $102,$022    ; bplcon1
  185.     dc.w    $7607,$fffe
  186.     dc.w    $180,$008    ; Color0
  187.     dc.w    $102,$033    ; bplcon1
  188.     dc.w    $7b07,$fffe
  189.     dc.w    $180,$00a    ; Color0
  190.     dc.w    $102,$044    ; bplcon1
  191.     dc.w    $8307,$fffe
  192.     dc.w    $180,$00c    ; Color0
  193.     dc.w    $102,$055    ; bplcon1
  194.     dc.w    $9007,$fffe
  195.     dc.w    $180,$00e    ; Color0
  196.     dc.w    $102,$066    ; bplcon1
  197.     dc.w    $9607,$fffe
  198.     dc.w    $180,$00f    ; Color0
  199.     dc.w    $102,$077    ; bplcon1
  200.     dc.w    $9a07,$fffe
  201.     dc.w    $180,$00e    ; Color0
  202.     dc.w    $a007,$fffe
  203.     dc.w    $180,$00c    ; Color0
  204.     dc.w    $102,$066    ; bplcon1
  205.     dc.w    $ad07,$fffe
  206.     dc.w    $180,$00a    ; Color0
  207.     dc.w    $102,$055    ; bplcon1
  208.     dc.w    $b507,$fffe
  209.     dc.w    $180,$008    ; Color0
  210.     dc.w    $102,$044    ; bplcon1
  211.     dc.w    $ba07,$fffe
  212.     dc.w    $180,$006    ; Color0
  213.     dc.w    $102,$033    ; bplcon1
  214.     dc.w    $bd07,$fffe
  215.     dc.w    $180,$004    ; Color0
  216.     dc.w    $102,$022    ; bplcon1
  217.     dc.w    $bf07,$fffe
  218.     dc.w    $180,$001    ; Color0
  219.  
  220.     dc.w    $FFFF,$FFFE    ; Ende der Copperlist
  221.  
  222. ;    BILD
  223.  
  224.     dcb.b    30*40,0    ; Wegen der Bytes über und unter der Pic
  225. PIC:
  226.     incbin    "amiga.320*256*3"    ; hier laden wir das Bild im RAW-
  227.                     ; Format
  228.     dcb.b    30*40,0    ; Wegen der Bytes über und unter der Pic
  229.  
  230.     end
  231.  
  232. Nur  durch  Ändern  der Copperlist des Listing5c.s haben wir diesen Effekt
  233. erzeugt, der ein bißchen an ein "Aufrollen des Bildes auf einen  Zylinder"
  234. erinnert.  Naja,  überzeugt vielleicht nicht recht, aber es ist einfach zu
  235. machen und sieht ganz nett  aus.  Einfach  die  $dff102  in  aufsteigender
  236. Reihenfolge  in  die Copperlist geben, kombiniert mit Wait: 1,2,3,4 um die
  237. erste Verzerrung nach rechts zu schaffen:
  238.  
  239.     +++++++++++++
  240.      +++++++++++++
  241.       +++++++++++++
  242.        +++++++++++++
  243.  
  244. In der Mitte angekommen, geht dann alles rückwärts bis auf NULL.
  245.  
  246.  
  247.