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

  1.  
  2. ; Listing7y1.s    EIN SPRITE WIRD ANGEZEIGT, INDEM WIR DIREKT IN DIE REGISTER
  3. ;        SCHREIBEN (OHNE DMA)
  4. ;    Dieses Beispiel zeigt, wie man einen Sprite erzeugen kann, indem man
  5. ;    direkt in die Register schreibt. Der Sprite wird unter anderem auf
  6. ;    zwei verschiedenen horizontalen Positionen angezeigt, gleich wie
  7. ;    bei der Wiederverwendung.
  8.  
  9.  
  10.     SECTION CipundCop,CODE
  11.  
  12. Anfang:
  13.     move.l    4.w,a6        ; Execbase
  14.     jsr    -$78(a6)    ; Disable
  15.     lea    GfxName(PC),a1    ; Name lib
  16.     jsr    -$198(a6)    ; OpenLibrary
  17.     move.l    d0,GfxBase
  18.     move.l    d0,a6
  19.     move.l    $26(a6),OldCop    ; speichern die alte COP
  20.  
  21. ;    Pointen auf das "leere" PIC
  22.  
  23.     MOVE.L    #BITPLANE,d0    ; wohin pointen
  24.     LEA    BPLPOINTERS,A1    ; COP-Pointer
  25.     move.w    d0,6(a1)
  26.     swap    d0
  27.     move.w    d0,2(a1)
  28.  
  29. ;    Wir pointen NICHT auf den Sprite !!!!!!!!!!!!!!!!!!!!
  30.  
  31.     move.l    #COPPERLIST,$dff080    ; unsere COP
  32.     move.w    d0,$dff088        ; START COP
  33.     move.w    #0,$dff1fc        ; NO AGA!
  34.     move.w    #$c00,$dff106        ; NO AGA!
  35.  
  36. mouse:
  37.     btst    #6,$bfe001    ; Mouse gedrückt?
  38.     bne.s    mouse
  39.  
  40.     move.l    OldCop(PC),$dff080    ; Pointen auf die SystemCOP
  41.     move.w    d0,$dff088        ; starten die alte SystemCOP
  42.  
  43.     move.l    4.w,a6
  44.     jsr    -$7e(a6)    ; Enable
  45.     move.l    gfxbase(PC),a1
  46.     jsr    -$19e(a6)    ; Closelibrary
  47.     rts
  48.  
  49. ;    Daten
  50.  
  51. GfxName:
  52.     dc.b    "graphics.library",0,0
  53.  
  54. GfxBase:
  55.     dc.l    0
  56.  
  57. OldCop:
  58.     dc.l    0
  59.  
  60.  
  61.     SECTION GRAPHIC,DATA_C
  62.  
  63. COPPERLIST:
  64. SpritePointers:
  65.     dc.w    $120,0,$122,0,$124,0,$126,0,$128,0 ; SPRITE
  66.     dc.w    $12a,0,$12c,0,$12e,0,$130,0,$132,0
  67.     dc.w    $134,0,$136,0,$138,0,$13a,0,$13c,0
  68.     dc.w    $13e,0
  69.  
  70.     dc.w    $8E,$2c81    ; DiwStrt
  71.     dc.w    $90,$2cc1    ; DiwStop
  72.     dc.w    $92,$38        ; DdfStart
  73.     dc.w    $94,$d0        ; DdfStop
  74.     dc.w    $102,0        ; BplCon1
  75.     dc.w    $104,0        ; BplCon2
  76.     dc.w    $108,0        ; Bpl1Mod
  77.     dc.w    $10a,0        ; Bpl2Mod
  78.  
  79.             ; 5432109876543210
  80.     dc.w    $100,%0001001000000000    ; Bit 12 an: 1 Bitplane Lowres
  81.  
  82. BPLPOINTERS:
  83.     dc.w $e0,0,$e2,0    ;primo    bitplane
  84.  
  85.     dc.w    $180,$000    ; COLOR0    ; Schwarzer Hintergrund
  86.     dc.w    $182,$123    ; COLOR1    ; COLOR1 des Bitplane, das in
  87.                         ; diesem Fall leer ist, er
  88.                         ; erscheint also nicht.
  89.  
  90.     dc.w    $1A2,$FF0    ; COLOR17, also COLOR1 des Sprite0 - GELB
  91.     dc.w    $1A4,$a00    ; COLOR18, also COLOR2 des Sprite0 - ROT
  92.     dc.w    $1A6,$F70    ; COLOR19, also COLOR3 des Sprite0 - ORANGE
  93.  
  94.  
  95.     dc.w    $4007,$fffe    ; Wartera auf Zeile $40
  96.     dc.w    $140,$0080    ; SPR0POS - Horizontale Position
  97.     dc.w    $142,$0000    ; SPR0CTL
  98.     dc.w    $146,$0e70    ; SPR0DATB
  99.     dc.w    $144,$03c0    ; SPR0DATA - aktiviert Sprite
  100.  
  101.     dc.w    $6007,$fffe    ; Wartet auf Zeile $60
  102.     dc.w    $142,$0000    ; SPR0CTL - "deaktiviert" den Sprite
  103.  
  104.     dc.w    $140,$00a0    ; SPR0POS - neue horizontale Position
  105.     dc.w    $146,$2ff4    ; SPR0DATB
  106.     dc.w    $8007,$fffe    ; Warter auf Zeile $80
  107.     dc.w    $144,$13c8    ; SPR0DATA - aktiviert den Sprite
  108.  
  109.     dc.w    $b407,$fffe    ; Warter auf Zeile $b4
  110.     dc.w    $142,$0000    ; SPR0CTL - "deaktiviert" den Sprite
  111.  
  112.     dc.w    $FFFF,$FFFE    ; Ende der Copperlist
  113.  
  114.  
  115.  
  116.     SECTION LEERESPLANE,BSS_C    ; Wir brauchen ein leeres Bitplane,
  117.                     ; denn ohne Bitplanes können wir
  118.                     ; keine Sprites anzeigen.
  119.                     
  120. BITPLANE:
  121.     ds.b    40*256        ; leeres Bitplane Lowres
  122.  
  123.     end
  124.  
  125. In diesem Beispiel sehen wir, wie wir einen Sprite verwenden können, indem
  126. wir direkt die Register SPRxPOS, SPRxCTL, SPRxDATA und SPRxDATB verwenden.
  127. Als erstes wird euch aufgefallen sein, daß wir den Sprite NICHT anpointen.
  128. Es  gibt  nicht  einmal  eine  Spritestruktur im Speicher (Chip Ram). Denn
  129. diese Struktur wird vom DMA verwendet, und in der  Praxis  tut  er  nichts
  130. anderes  als  diese Daten in die obengenannten Register zu laden. Wenn wir
  131. die Daten selbst in diese Register schreiben, dann brauchen  wir  den  DMA
  132. nicht.  Sehen  wir  im  Detail,  wie  diese  Register verwendet werden. In
  133. SPRxPOS kommt die Position des Sprites. Der Inhalt  dieses  Registers  ist
  134. praktisch  der  gleiche wie der im ersten Kontrollword der Spritestruktur.
  135. Der Unterschied ist aber, daß VSTART die  vertikale  Position  der  Sprite
  136. nicht  beeinflußt. Die Sprites werden aktiviert, indem man in das Register
  137. SPRxDATA schreibt. Wenn er einmal aktiviert ist, dann  wird  er  in  jeder
  138. Zeile  neu  geschrieben,  auf  der  selben  horizontalen  Position  wie
  139. eingegeben. Er hat also in jeder Zeile die gleiche "Form". Diese Form wird
  140. in  die  Register SPRxDATA und SPRxDATB geschrieben. Die höherwertigen Bit
  141. kommen in DATB, die niederwertigeren in DATA. Diese zwei  Register  werden
  142. bei  jeder  Zeile  wiederverwendet. Wenn wir also wollen, daß die Form des
  143. Sprites von einer Zeile zur anderen wechselt, dann müssen wir diese beiden
  144. Register bei jeder Zeile verändern.
  145. Das Register SPRxCTL hat den gleichen Inhalt wie das  zweite  Kontrollword
  146. der  Struktur.  Auch  hier  ist die vertikale Position ungültig. Praktisch
  147. gesehen haben nur die Bits 0 und 7 von allen einen Sinn:  Bit  0  ist  das
  148. niederwertige  Bit  von  HSTART  und  Bit 7 ist für die "Attached"-Sprites
  149. notwendig. Durch Schreiben in das  Register  SPRxCTL  werden  die  Sprites
  150. wieder deaktiviert.
  151.  
  152. Die  Sprites  ohne  DMA zu verwenden ist recht unpraktisch, weil bei jeder
  153. Zeile die Register SPRxDATx verändert werden  müssen.  Normalerweise  wird
  154. diese  Methode  auch  nicht  verwendet. Sie ist aber vorteilhaft, wenn wir
  155. einen  Sprite  brauchen,  der  in  jeder  Zeile  gleich  ist:  Um  Säulen
  156. herzustellen,  sonst  fällt  mir  nichts  ein. In diesem Fall ist es nicht
  157. nötig, in jeder Zeile die Register SPRxDATx zu verändern, denn  es  bleibt
  158. immer  das  Gleiche. Des Weiteren sparen wir viel Speicher: wenn wir einen
  159. Säulen-Sprite machen möchten, der 100 Zeilen hoch ist, dann bräuchten  wir
  160. mit  dem  DMA  eine  Struktur,  die  100  Zeilen  lang  ist,  Kontrollword
  161. ausgeschloßen!
  162.  
  163. Die Prozedur, um ohne DMA Säulen und Kolonnen herzustellen, ist also:
  164.  
  165. 1) die richtigen Werte in SPRxPOS, SPRxCLT und SPRxDATB schreiben.
  166. 2) die gewollte, vertikale  Position  abwarten,  ab  der  man  den  Sprite
  167.   starten  will.
  168. 3) Den Wert in SPRxDATA schreiben. Damit wird  der  Sprite  aktiviert  und
  169.   gezeichnet,  für  jede  folgende Zeile gleich.
  170. 4) Man wartet die vertikale Position ab, an der der Sprite enden soll.
  171. 5) Man schreibt irgend etwas in das Register SPRxCTL
  172.  
  173. Es ist auch möglich, wie in diesem Beispiel vorgeführt, mehrere Säulen auf
  174. verscheidenen Höhen anzuzeigen, indem diese Prozedur wiederholt wird.  Man
  175. könnte auch die Palette zwischen einer Säule und der anderen verändern.
  176.  
  177.  
  178.