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

  1.  
  2. ; Listing7y2.s    Vertikale Balken
  3.  
  4. ;    In diesem Beispiel verwenden wir zwei Sprites, um vertikale Balken
  5. ;    zu erzeugen.
  6.  
  7.     SECTION CipundCop,CODE
  8.  
  9. Anfang:
  10.     move.l    4.w,a6        ; Execbase
  11.     jsr    -$78(a6)    ; Disable
  12.     lea    GfxName(PC),a1    ; Name lib
  13.     jsr    -$198(a6)    ; OpenLibrary
  14.     move.l    d0,GfxBase
  15.     move.l    d0,a6
  16.     move.l    $26(a6),OldCop    ; speichern die alte COP
  17.  
  18. ;    Pointen auf das "leere" PIC
  19.  
  20.     MOVE.L    #BITPLANE,d0    ; wohin pointen
  21.     LEA    BPLPOINTERS,A1    ; COP-Pointer
  22.     move.w    d0,6(a1)
  23.     swap    d0
  24.     move.w    d0,2(a1)
  25.  
  26. ;    Wir pointen NICHT auf den Sprite !!!!!!!!!!!!!!!!!!!!
  27.  
  28.     move.l    #COPPERLIST,$dff080    ; unsere COP
  29.     move.w    d0,$dff088        ; START COP
  30.     move.w    #0,$dff1fc        ; NO AGA!
  31.     move.w    #$c00,$dff106        ; NO AGA!
  32.  
  33.  
  34. mouse:
  35.     cmpi.b    #$ff,$dff006    ; Zeile 255?
  36.     bne.s    mouse
  37.  
  38.     bsr.s    BewegeSprite ; Bewegt die Sprite 0 und 1 horizontal, aber
  39.                 ; indem er auf die MOVE in der COPPERLIST zugreift,
  40.                 ; da wir ja die Register direkt verwenden
  41.  
  42. Warte:
  43.     cmpi.b    #$ff,$dff006    ; Zeile 255?
  44.     beq.s    Warte
  45.  
  46.     btst    #6,$bfe001    ; Mouse gedrückt?
  47.     bne.s    mouse
  48.  
  49.     move.l    OldCop(PC),$dff080    ; Pointen auf die SystemCOP
  50.     move.w    d0,$dff088        ; Starten die alte SystemCOP
  51.  
  52.     move.l    4.w,a6
  53.     jsr    -$7e(a6)    ; Enable
  54.     move.l    gfxbase(PC),a1
  55.     jsr    -$19e(a6)    ; Closelibrary
  56.     rts
  57.  
  58. ;    Daten
  59.  
  60. GfxName:
  61.     dc.b    "graphics.library",0,0
  62.  
  63. GfxBase:
  64.     dc.l    0
  65.  
  66. OldCop:
  67.     dc.l    0
  68.  
  69. ; Diese Routine bewegt den Sprite, indem sie auf die Copperlist einwirkt,
  70. ; durch verändern des Wertes bar1, der in das Register SPRxPOS geladen wird,
  71. ; also das Byte der horizontalen Position. Es werden schon vorausberechnete
  72. ; Werte aus einer Tabelle eingesetzt, TABX.
  73.  
  74. BewegeSprite:
  75.     ADDQ.L    #2,TABXPOINT     ; Pointe auf das nächste Byte
  76.     MOVE.L    TABXPOINT(PC),A0 ; Adresse im Long TABXPOINT
  77.                  ; wird in a0 kopiert
  78.     CMP.L    #ENDETABX-2,A0     ; Sind wir beim letzten Longword der TAB?
  79.     BNE.S    NOBSTART     ; noch nicht? Dann mach weiter
  80.     MOVE.L    #TABX-2,TABXPOINT ; Starte wieder beim ersten Long
  81. NOBSTART:
  82.     MOVE.w    (A0),d1
  83.  
  84.     add.w    #128,D1        ; 128 - um den Sprite zu zentrieren
  85.     btst.l    #0,D1        ; Niederw. Bit der X-Koordinate = 0?
  86.     beq.s    NiederBitNull
  87.     bset.b    #0,bar1_b    ; Setzen das niederwertige Bit der bar.
  88.     bra.s    PlaceCoords
  89.  
  90. NiederBitNull:
  91.     bclr.b    #0,bar1_b    ; Löschen das niederwertige Bit der bar.
  92. PlaceCoords:
  93.     lsr.w    #1,D1        ; SHIFTEN, bewegen also alles um 1 Bit nach rechts.
  94.  
  95.     move.b    D1,bar1        ; Geben den XX-Wert in die Position des Sprite
  96.  
  97.     ADDQ.L    #2,TABXPOINT2      ; Pointe auf das nächste Byte
  98.     MOVE.L    TABXPOINT2(PC),A0 ; Adresse im Long    TABXPOINT
  99.                   ; wird in a0 kopiert
  100.     CMP.L    #ENDETABX-2,A0      ; Sind wir beim letzten Word der TAB?
  101.     BNE.S    NOBSTART2      ; noch nicht? Dann mach weiter.
  102.     MOVE.L    #TABX-2,TABXPOINT2 ; Starte wieder beim ersten Long
  103. NOBSTART2:
  104.     MOVE.w    (A0),d1
  105.     add.w    #128,D1        ; 128 - um den Sprite zu zentrieren.
  106.     btst.l    #0,D1        ; niederwertiges Bit der X-Koordinate =0?
  107.     beq.s    NiederBitNull2
  108.     bset.b    #0,bar2_b    ; Setzen das niederwertige Bit der bar.
  109.     bra.s    PlaceCoords2
  110.  
  111. NiederBitNull2:
  112.     bclr.b    #0,bar2_b    ; Löschen das niederwertige Bit der bar.
  113. PlaceCoords2:
  114.     lsr.w    #1,D1        ; SHIFTEN, bewegen also alles um 1 Bit nach rechts.
  115.  
  116.     move.b    D1,bar2        ; Geben den XX-Wert ind das Byte der Position
  117.     rts
  118.  
  119. TABXPOINT:
  120.     dc.l    TABX-2
  121.     
  122. TABXPOINT2:            ; Der Pointer für die zweite Position ist anders
  123.     dc.l    TABX+40-2
  124.     
  125. ; Tabelle mit vorausberechneten X-Koordinaten des Sprite.
  126.  
  127. TABX:
  128.     incbin    "XCOORDINATOK.TAB"
  129.  
  130. ENDETABX:
  131.  
  132.     SECTION GRAPHIC,DATA_C
  133.  
  134. COPPERLIST:
  135. SpritePointers:
  136.     dc.w    $120,0,$122,0,$124,0,$126,0,$128,0 ; SPRITE
  137.     dc.w    $12a,0,$12c,0,$12e,0,$130,0,$132,0
  138.     dc.w    $134,0,$136,0,$138,0,$13a,0,$13c,0
  139.     dc.w    $13e,0
  140.  
  141.     dc.w    $8E,$2c81    ; DiwStrt
  142.     dc.w    $90,$2cc1    ; DiwStop
  143.     dc.w    $92,$38        ; DdfStart
  144.     dc.w    $94,$d0        ; DdfStop
  145.     dc.w    $102,0        ; BplCon1
  146.     dc.w    $104,0        ; BplCon2
  147.     dc.w    $108,0        ; Bpl1Mod
  148.     dc.w    $10a,0        ; Bpl2Mod
  149.  
  150.             ; 5432109876543210
  151.     dc.w    $100,%0001001000000000    ; Bit 12 an:1 Bitplane Lowres
  152.  
  153. BPLPOINTERS:
  154.     dc.w $e0,0,$e2,0    ;erstes Bitplane
  155.  
  156.     dc.w    $180,$000    ; COLOR0    ; schwarzer Hintergrund
  157.     dc.w    $182,$123    ; COLOR1    ; COLOR1 des Bitplane, das in
  158.                         ; diesem Fall leer ist, es wird
  159.                         ; also nicht angezeigt.
  160.  
  161.     dc.w    $1A2,$FF0    ; COLOR17, also COLOR1 des Sprite0 - GIELB
  162.     dc.w    $1A4,$a00    ; COLOR18, also COLOR2 des Sprite0 - ROT
  163.     dc.w    $1A6,$F70    ; COLOR19, also COLOR3 des Sprite0 - ORANGE
  164.  
  165.  
  166.     dc.w    $2c07,$fffe    ; WAIT - Warte auf den oberen Rand
  167.  
  168.     dc.w    $140        ; SPR0POS
  169.     dc.b    0        ; Vertikale Position (nicht verwenddet)
  170. bar1:    dc.b    0        ; Horizontale Position
  171.     dc.w    $142        ; SPR0CTL
  172.     dc.b    0        ; VSTOP (nicht verwendet)
  173. bar1_b: dc.b    0        ; viertes Kontrollbyte: es wird das Bit 0
  174.                 ; verwendet, es ist das fehlende Bit der
  175.                 ; horizontalen Position (niederwertigstes)
  176.  
  177.     dc.w    $146,$0e70    ; SPR0DATB
  178.     dc.w    $144,$03c0    ; SPR0DATA - aktiviert Sprite
  179.  
  180.     dc.w    $148        ; SPR1POS
  181.     dc.b    0
  182. bar2:    dc.b    0        ; horizontale Position
  183.     dc.w    $14a        ; SPR1CTL
  184.     dc.b    0
  185. bar2_b: dc.b    0
  186.     dc.w    $14e,$3e7c    ; SPR1DATB
  187.     dc.w    $14c,$0ff0;db0    ; SPR1DATA - aktiviert Sprite
  188.  
  189.  
  190.     dc.w    $FFFF,$FFFE    ; Ende der Copperlist
  191.  
  192.  
  193.  
  194.     SECTION LEERESPLANE,BSS_C    ; Wir brauchen ein leeres Bitplane,
  195.                     ; denn ohne Bitplanes können wir
  196.                     ; keine Sprites anzeigen.
  197.  
  198. BITPLANE:
  199.     ds.b    40*256        ; leeres Bitplane Lowres
  200.  
  201.     end
  202.  
  203. Bemerkt,  daß bei den Kolonnen, da sie den ganzen Bildschirm ausfüllen, es
  204. nicht notwendig ist, in das Register SPRxCTL zu schreiben, um  die  Sprite
  205. zu deaktivieren.
  206.  
  207. Setzt  dieses  Stück  Copperlist  vor der Zeile "dc.w $FFFF,$FFFE" ein, um
  208. einen Schuß Farbe ins Listing zu bringen (Amiga+b+c+i).
  209.  
  210.     dc.w    $5407,$fffe    ; WAIT
  211.     dc.w    $1A2,$FaF    ; COLOR17    ; Violett
  212.     dc.w    $1A4,$703    ; COLOR18
  213.     dc.w    $1A6,$F0a    ; COLOR19
  214.     dc.w    $6807,$fffe    ; WAIT
  215.     dc.w    $1A2,$aFa    ; COLOR17    ; Grün
  216.     dc.w    $1A4,$050    ; COLOR18
  217.     dc.w    $1A6,$0a0    ; COLOR19
  218.     dc.w    $7c07,$fffe    ; WAIT
  219.     dc.w    $1A2,$0FF    ; COLOR17    ; Blau
  220.     dc.w    $1A4,$00d    ; COLOR18
  221.     dc.w    $1A6,$07F    ; COLOR19
  222.     dc.w    $9007,$fffe    ; WAIT
  223.     dc.w    $1A2,$eee    ; COLOR17    ; Grau
  224.     dc.w    $1A4,$444    ; COLOR18
  225.     dc.w    $1A6,$888    ; COLOR19
  226.  
  227.