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

  1.  
  2. ; Listing5a.s    SCROLLEN EINES BILDES NACH LINKS UND RECHTS MIT DEM $dff102
  3.  
  4. Anfang:
  5.     move.l    4.w,a6        ; Execbase in a6
  6.     jsr    -$78(a6)    ; Disable - stoppt das Multitasking
  7.     lea    GfxName(PC),a1  ; Adresse des Namen der zu öffnenden Lib in a1
  8.     jsr    -$198(a6)    ; OpenLibrary, Routine der EXEC, die Libraris
  9.                 ; öffnet, und als Resultat in d0 die Basisadr.
  10.                 ; derselben Bibliothek liefert, ab welcher
  11.                 ; die Offsets (Distanzen) zu machen sind
  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 (immer auf $26 nach
  16.                 ; GfxBase)
  17.  
  18. ;    POINTEN AUF UNSERE BITPLANES
  19.  
  20.     MOVE.L    #PIC,d0        ; in d0 kommt die Adresse von unserer PIC
  21.                 ; bzw. wo ihr erstes Bitplane beginnt
  22.  
  23.     LEA    BPLPOINTERS,A1    ; in a1 kommt die Adresse der Bitplane-
  24.                 ; Pointer der Copperlist
  25.     MOVEQ    #2,D1        ; Anzahl der Bitplanes -1 (hier sind es 3)
  26.                 ; für den DBRA - Zyklus
  27. POINTBP:
  28.     move.w    d0,6(a1)    ; kopiert das niederwertige Word der Plane-
  29.                 ; Adresse ins richtige Word der Copperlist
  30.     swap    d0        ; vertauscht die 2 Word in d0 ( 1234 > 3412)
  31.  
  32.     move.w    d0,2(a1)    ; kopiert das hochwertige Word der Adresse des 
  33.                 ; Plane in das richtige Word in der Copperlist
  34.     swap    d0        ; vertauscht erneut die 2 Word von d0
  35.     ADD.L    #40*256,d0    ; Zählen 10240 zu D0 dazu, somit zeigen wir
  36.                 ; auf das zweite Bitplane (befindet sich direkt
  37.                 ; nach dem ersten),wir zählen praktisch Länge
  38.                 ; eines Plane dazu
  39.  
  40.     addq.w    #8,a1        ; a1 enthält nun die Adresse der nächsten
  41.                 ; Bplpointers in der  Copperlist, die es
  42.                 ; einzutragen gilt
  43.     dbra    d1,POINTBP    ; Wiederhole D1 mal POINTBP (D1= bitplanes)
  44.  
  45.  
  46.     move.l    #COPPERLIST,$dff080    ; COP1LC - "Zeiger" auf unsere COP
  47.                     ; (deren Adresse)
  48.     move.w    d0,$dff088        ; COPJMP1 - Starten unsere COP
  49.  
  50.     move.w    #0,$dff1fc        ; FMODE - Deaktiviert das AGA
  51.     move.w    #$c00,$dff106        ; BPLCON3 - Deaktiviert das AGA
  52.  
  53. mouse:
  54.     cmpi.b    #$ff,$dff006    ; Sind wir auf Zeile 255?
  55.     bne.s    mouse        ; Wenn nicht, geh nicht weiter
  56.  
  57.     btst    #2,$dff016    ; wenn die rechte Maustaste gedrückt ist,
  58.     beq.s    Warte        ; dann wird die Scrollroutine übersprungen
  59.  
  60.     bsr.w    BewegeCopper    ; Scrollt Bild hin und her
  61.  
  62. Warte:
  63.     cmpi.b    #$ff,$dff006    ; Sind wir noch auf Zeile 255?
  64.     beq.s    Warte        ; Wenn ja, geh nicht weiter, warte auf die
  65.                 ; nächste Zeile, ansonsten wird BewegeCopper
  66.                 ; noch einmal ausgeführt
  67.  
  68.     btst    #6,$bfe001    ; linke Maustaste gedrückt?
  69.     bne.s    mouse        ; wenn nicht, zurück zu mouse:
  70.  
  71.     move.l    OldCop(PC),$dff080    ; COP1LC - "Zeiger" auf die Orginal-COP
  72.     move.w    d0,$dff088        ; COPJMP1 - und starten sie
  73.  
  74.     move.l    4.w,a6
  75.     jsr    -$7e(a6)    ; Enable - stellt Multitasking wieder her
  76.     move.l    GfxBase(PC),a1    ; Basis der Library, die es zu schließen gilt
  77.                 ; (Libraries werden geöffnet UND geschlossen!)
  78.     jsr    -$19e(a6)    ; Closelibrary - schließt die Graphics lib
  79.     rts
  80.  
  81. ; DATEN
  82.  
  83.  
  84.  
  85. GfxName:
  86.     dc.b    "graphics.library",0,0    
  87.  
  88. GfxBase:        ; Hier hinein kommt die Basisadresse der graphics.library,
  89.     dc.l    0   ; ab hier werden die Offsets gemacht
  90.  
  91.  
  92.  
  93. OldCop:            ; Hier hinein kommt die Adresse der Orginal-Copperlist
  94.     dc.l    0    ; des Betriebssystemes
  95.  
  96.  
  97. ;    Diese Routine ist sehr ähnlich mit der in Listing3d.s, in diesem
  98. ;    Fall aber modifizieren wir den Wert in $dff102 BPLCON1, um das
  99. ;    Bild vor- und zurückzubewegen.
  100. ;    Da es möglich ist, auf die geraden und ungeraden Bitplanes
  101. ;    unabhängig zuzugreifen, müßen wir beide gleichzeitig verschieben:
  102. ;    $0011, $0022, $0033, und nicht $0001, $0002, $0003, das nur die
  103. ;    ungeraden Bitplanes (1,3,5) verschieben würde, oder $0010, $0020, 
  104. ;    $0030; dieses hätte nur auf die geraden Planes (2,4,6) Einfluß.
  105. ;    Probiert ein "=C 102" um zu sehen, was die einzelnen Bits bedeuten.
  106.  
  107.  
  108. BewegeCopper:
  109.     TST.B    FLAG        ; Müßen wir vor oder zurück? Wenn FLAG NULL
  110.                 ; ist (TST also BEQ ergibt), dann springen wir
  111.                 ; nach Vorne, wenn es hingegen auf $FF ist,
  112.                 ; (TST also nicht BEQ ergibt), dann fahren wir
  113.                 ; mit dem zurückgehen fort (mit den sub)
  114.     beq.w    Vorne
  115.     cmpi.b    #$00,MeinCon1    ; sind wir auf der Standartposition angekommen,
  116.                 ; also ganz hinten?
  117.     beq.s    GehNachVorne    ; wenn ja, dann müßen wir nach vorne!
  118.     sub.b    #$11,MeinCon1    ; wir ziehen 1 vom Scroll der geraden/ungeraden
  119.     rts            ; Bitplanes ab ($ff,$ee,$dd,$cc,$bb,$aa,$99..)
  120.                 ; gehen somit nach LINKS
  121. GehNachVorne:
  122.     clr.b    FLAG        ; Durch Nullsetzen des FLAG wird bei TST.B FLAG
  123.     rts            ; das BEQ die Routine nach Vorne springen lassen, und
  124.                 ; das Bild wird vorschreiten (nach rechts)
  125.  
  126. Vorne:
  127.     cmpi.b    #$ff,MeinCon1    ; Sind wir beim Maximalscroll nach vorne ($ff)
  128.                 ; angekommen?? ($f gerade und $f ungerade)
  129.     beq.s    GehNachHinten    ; wenn ja müßen wir zurückgehen
  130.     add.b    #$11,MeinCon1    ; zähle 1 zum Bitplanescroll dazu, gerade und
  131.                 ; ungerade ($11,$22,$33,$44 etc..)
  132.     rts            ; GEH NACH RECHTS
  133.  
  134. GehNachHinten:
  135.     move.b    #$ff,FLAG    ; Wenn das Label FLAG nicht auf NULL ist,
  136.     rts            ; dann bedeutet das, daß wir nach links
  137.                 ; zurückgehen müßen
  138.  
  139. ;    Dieses Byte ist ein FLAG, es zeigt uns an, ob wir vor oder
  140. ;    zurück gehen müßen.
  141.  
  142. FLAG:
  143.     dc.b    0,0
  144.  
  145.  
  146.     SECTION GRAPHIC,DATA_C
  147.  
  148. COPPERLIST:
  149.     dc.w    $120,$0000,$122,$0000,$124,$0000,$126,$0000,$128,$0000 ; SPRITE
  150.     dc.w    $12a,$0000,$12c,$0000,$12e,$0000,$130,$0000,$132,$0000
  151.     dc.w    $134,$0000,$136,$0000,$138,$0000,$13a,$0000,$13c,$0000
  152.     dc.w    $13e,$0000
  153.  
  154.     dc.w    $8e,$2c81    ; DiwStrt    (Register mit Standartwerten)
  155.     dc.w    $90,$2cc1    ; DiwStop
  156.     dc.w    $92,$0038    ; DdfStart
  157.     dc.w    $94,$00d0    ; DdfStop
  158.  
  159.  
  160.     dc.w    $102        ; BplCon1 - DAS REGISTER
  161.     dc.b    $00        ; BplCon1 - DAS NICHT VERWENDETE BYTE!!!
  162. MeinCon1:
  163.     dc.b    $00        ; BplCon1 - DAS VERWENDETE BYTE!!!
  164.  
  165.  
  166.     dc.w    $104,0        ; BplCon2
  167.     dc.w    $108,0        ; Bpl1Mod
  168.     dc.w    $10a,0        ; Bpl2Mod
  169.  
  170.             ; 5432109876543210  ; BPLCON0:
  171.     dc.w    $100,%0011001000000000  ; Bits 13 und 12 an!! (3 = %011)
  172.                     ; 3 Bitplanes Lowres, nicht Lace
  173. BPLPOINTERS:
  174.     dc.w $e0,$0000,$e2,$0000    ;erstes  Bitplane - BPL0PT
  175.     dc.w $e4,$0000,$e6,$0000    ;zweites Bitplane - BPL1PT
  176.     dc.w $e8,$0000,$ea,$0000    ;drittes Bitplane - BPL2PT
  177.  
  178.     dc.w    $0180,$000    ; Color0
  179.     dc.w    $0182,$475    ; Color1
  180.     dc.w    $0184,$fff    ; Color2
  181.     dc.w    $0186,$ccc    ; Color3
  182.     dc.w    $0188,$999    ; Color4
  183.     dc.w    $018a,$232    ; Color5
  184.     dc.w    $018c,$777    ; Color6
  185.     dc.w    $018e,$444    ; Color7
  186.  
  187.     dc.w    $FFFF,$FFFE    ; Ende der Copperlist
  188.  
  189. ;    BILD
  190.  
  191. PIC:
  192.     incbin  "amiga.320*256*3"    ; hier laden wir das Bild im RAW-
  193.                     ; Format
  194.  
  195.     end
  196.  
  197. Ein Bild um 16 Pixel nach vorne zu verschieben ist auf dem Amiga ein Witz!
  198. Einfach das BPLCON1, $dff102, manipulieren, und das war´s auch schon.  Auf
  199. anderen  Systemen,  wie  etwa  PC  MSDOS  muß  wirklich das ganze Bild neu
  200. berechnet werden, was klarerweise alles herbremst.
  201. Weiters  können  gerade  und  ungerade  Bitplanes  unabhängig  voneinander
  202. manipuliert werden, was mit wenigen Befehlen sehr einfach Parallax-Effekte
  203. erzeugt. Einfach den Hintergrund etwas langsamer scrollen lassen, der z.B.
  204. aus  den  geraden  Bitplanes besteht, und den Vordergrund etwas schneller.
  205. Auf den PC´s hingegen brauchts dafür lange und komplizierte Routinen,  die
  206. alles verlangsamen. Und dann heißt´s : "Pentium 75 ist zwar etwas langsam,
  207. aber mit dem neuen Pentium 100  müßte  das  Spiel  recht  gut  laufen...!"
  208. Überprüfen    wir,    daß  es  mäglich  ist,  die  zwei  Playfields  separat
  209. anzusteuern. macht die  folgenden  Modifizierungen:  um  NUR  die  GERADEN
  210. Planes zu bewegen (hier ist es das Nr. 2) ersetzt folgende Anweisungen:
  211.  
  212.     sub.b    #$11,MeinCon1    ; ziehen 1 dem Scroll der Bitplanes ab
  213.  
  214.     cmpi.b    #$ff,MeinCon1    ; sind wir beim Maximalscroll angekommen?
  215.  
  216.     add.b    #$11,MeinCon1    ; zählen 1 zum Scroll der geraden /ungeraden
  217.                  ; Bitplanes dazu ($11,$22,$33,$44 etc..)
  218.  
  219. mit diesen:
  220.  
  221.  
  222.     sub.b    #$10,MeinCon1    ; nur die GERADEN Planes!
  223.  
  224.     cmpi.b    #$f0,MeinCon1
  225.  
  226.     add.b    #$10,MeinCon1
  227.  
  228. Ihr werdet bemerken, daß sich nur ein Bitplane bewegt, das zweite, während
  229. das  Erste  und  das  Dritte  stehen  bleiben.  Beim  Bewegen verliert das
  230. Bitplane 2 seine Überlappung, es bleibt  alleine  stehen  und  zeigt  sein
  231. "wahres  Gesicht".  Es  übernimmt  die  Farbe von COLOR2, $FFF, wie in der
  232. Copperlist ersichtlich, also Weiß. Es bekommt die Farbe2 weil das Bitplane
  233. 2  beim Verstellen nur mit dem Hintergrund auftritt, also %010, die Planes
  234. 1 und 3 sind auf 0 weil nicht vorhanden. Die Binärzahl %010 entspricht der
  235. 2,  also  wird  dessen  Farbe  vom  Register Color2 bestimmt, dem $dff184.
  236. Verändert den Wert dieses Registers und ihr werdet sehen, wie das Plane 2,
  237. wenn es "alleine" dasteht, Farbe ändert.
  238.  
  239.     dc.w    $0184,$fff    ;Color2
  240.  
  241. Wird $FF0 eingesetzt, wird es Gelb werden.  Des  Weiteren  wird  das  Bild
  242. "gelöchert",  wo  das  Bitplane verschwindet, das ist vielleicht besser zu
  243. sehen, wenn ihr die Bewegung  stoppt,  indem  ihr  den  rechten  Mausknopf
  244. drückt.  Diese  "Löcher"  treten  vor  allem  dort  auf, wo das Bitplane 2
  245. alleine stand, wo das Bild also Weiß war. Anderswo wird sich  statt  einem
  246. Loch zu bilden die Farbe verändern.
  247.  
  248. Um  nur sie UNGERADEN Bitplanes zu bewegen (1 und 3 in unserem Bild), dann
  249. verändert die Zeilen so:
  250.  
  251.     subq.b  #$01,MeinCon1    ; nur die UNGERADEN Planes!
  252.  
  253.     cmpi.b  #$0f,MeinCon1
  254.  
  255.     addq.b  #$01,MeinCon1
  256.  
  257. In  diesem  Fall bleibt das Plane 2 stehen, und die Planes 1 und 3 bewegen
  258. sich. Mit diesem Beispiel habt ihr  vielleicht  auch  die  Methode  besser
  259. verstanden, mit der die Farben durch Überlappung angezeigt werden.
  260.  
  261.  
  262.