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

  1.  
  2. ; Listing7y3.s    ZWEI VERWENDUNGEN EINES SPRITE AUF DER GLEICHEN ZEILE
  3.  
  4. ;    Dieses Beispiel zeigt, wie es möglich ist, einen Sprite 2 Mal
  5. ;    auf der selben Zeile anzuzeigen, indem man direkt auf die Register
  6. ;    zugreift.
  7.  
  8.  
  9.     SECTION CipundCop,CODE
  10.  
  11. Anfang:
  12.     move.l    4.w,a6        ; Execbase
  13.     jsr    -$78(a6)    ; Disable
  14.     lea    GfxName(PC),a1    ; Name lib
  15.     jsr    -$198(a6)    ; OpenLibrary
  16.     move.l    d0,GfxBase
  17.     move.l    d0,a6
  18.     move.l    $26(a6),OldCop    ; speichern die alte COP
  19.  
  20. ;    Pointen auf das "leere" PIC
  21.  
  22.     MOVE.L    #BITPLANE,d0    ; wohin pointen
  23.     LEA    BPLPOINTERS,A1    ; COP-Pointer
  24.     move.w    d0,6(a1)
  25.     swap    d0
  26.     move.w    d0,2(a1)
  27.  
  28. ;    Wir pointen NICHT auf den Sprite !!!!!!!!!!!!!!!!!!!!
  29.  
  30.     move.l    #COPPERLIST,$dff080    ; unsere COP
  31.     move.w    d0,$dff088        ; START COP
  32.     move.w    #0,$dff1fc        ; NO AGA!
  33.     move.w    #$c00,$dff106        ; NO AGA!
  34.  
  35. mouse:
  36.     btst    #6,$bfe001    ; Mouse gedrückt?
  37.     bne.s    mouse
  38.  
  39.     move.l    OldCop(PC),$dff080    ; Pointen auf die SystemCOP
  40.     move.w    d0,$dff088        ; starten die alte SystemCOP
  41.  
  42.     move.l    4.w,a6
  43.     jsr    -$7e(a6)    ; Enable
  44.     move.l    gfxbase(PC),a1
  45.     jsr    -$19e(a6)    ; Closelibrary
  46.     rts
  47.  
  48. ;    Daten
  49.  
  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    ;erstes Bitplane
  84.  
  85.     dc.w    $180,$000    ; COLOR0    ; schwarzer Hintergrund
  86.     dc.w    $182,$123    ; COLOR1    ; COLOR1 des Bitplane, das
  87.                         ; in diesem Fall leer ist, und
  88.                         ; deswegen nicht erscheint.
  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. ; ---> fügt hier das Stück Copperlist ein, das am Ende des Kommentars steht
  95.  
  96.     dc.w    $4007,$fffe    ; Warte auf Zeile $40, horizontale Pos. 7
  97.     dc.w    $140,$0060    ; SPR0POS - horizontale Position
  98.     dc.w    $142,$0000    ; SPR0CTL
  99.     dc.w    $146,$0e70    ; SPR0DATB
  100.     dc.w    $144,$03c0    ; SPR0DATA - aktiviert den Sprite
  101.  
  102.     dc.w    $4087,$fffe    ; Warte auf Zeile $40, horizontale Pos. 87
  103.     dc.w    $140,$00a0    ; SPR0POS - horizontale Position
  104.  
  105. ; Das gleiche für Zeile $41
  106.  
  107.     dc.w    $4107,$fffe    ; wait horiz. Position 07
  108.     dc.w    $140,$0060    ; spr0pos
  109.  
  110.     dc.w    $4187,$fffe    ; wait horiz. Position 87
  111.     dc.w    $140,$00a0    ; spr0pos
  112.  
  113. ; Das gleiche für Zeile $42
  114.  
  115.     dc.w    $4207,$fffe    ; wait
  116.     dc.w    $140,$0060    ; spr0pos
  117.  
  118.     dc.w    $4287,$fffe    ; wait... und so weiter
  119.     dc.w    $140,$00a0
  120.  
  121. ; Das gleiche für Zeile $43
  122.  
  123.     dc.w    $4307,$fffe
  124.     dc.w    $140,$0060
  125.  
  126.     dc.w    $4387,$fffe
  127.     dc.w    $140,$00a0
  128.  
  129. ; Das gleiche für Zeile $44
  130.  
  131.     dc.w    $4407,$fffe
  132.     dc.w    $140,$0060
  133.  
  134.     dc.w    $4487,$fffe
  135.     dc.w    $140,$00a0
  136.  
  137. ; Das gleiche für Zeile $45
  138.  
  139.     dc.w    $4507,$fffe
  140.     dc.w    $140,$0060
  141.  
  142.     dc.w    $4587,$fffe
  143.     dc.w    $140,$00a0
  144.  
  145. ; Das gleiche für Zeile $46
  146.  
  147.     dc.w    $4607,$fffe
  148.     dc.w    $140,$0060
  149.  
  150.     dc.w    $4687,$fffe
  151.     dc.w    $140,$00a0
  152.  
  153. ; Das gleiche für Zeile $47
  154.  
  155.     dc.w    $4707,$fffe
  156.     dc.w    $140,$0060
  157.  
  158.     dc.w    $4787,$fffe
  159.     dc.w    $140,$00a0
  160.  
  161. ; Das gleiche für Zeile $48
  162.  
  163.     dc.w    $4807,$fffe
  164.     dc.w    $140,$0060
  165.  
  166.     dc.w    $4887,$fffe
  167.     dc.w    $140,$00a0
  168.  
  169. ; Das gleiche für Zeile $49
  170.  
  171.     dc.w    $4907,$fffe
  172.     dc.w    $140,$0060
  173.  
  174.     dc.w    $4987,$fffe
  175.     dc.w    $140,$00a0
  176.  
  177. ; Das gleiche für Zeile $4a
  178.  
  179.     dc.w    $4a07,$fffe
  180.     dc.w    $140,$0060
  181.  
  182.     dc.w    $4a87,$fffe
  183.     dc.w    $140,$00a0
  184.  
  185. ; Das gleiche für Zeile $4b
  186.  
  187.     dc.w    $4b07,$fffe
  188.     dc.w    $140,$0060
  189.  
  190.     dc.w    $4b87,$fffe
  191.     dc.w    $140,$00a0
  192.  
  193. ; Das gleiche für Zeile $4c
  194.  
  195.     dc.w    $4c07,$fffe
  196.     dc.w    $140,$0060
  197.  
  198.     dc.w    $4c87,$fffe
  199.     dc.w    $140,$00a0
  200.  
  201. ; Das gleiche für Zeile $4d
  202.  
  203.     dc.w    $4d07,$fffe
  204.     dc.w    $140,$0060
  205.  
  206.     dc.w    $4d87,$fffe
  207.     dc.w    $140,$00a0
  208.  
  209. ; Das gleiche für Zeile $4e
  210.  
  211.     dc.w    $4e07,$fffe
  212.     dc.w    $140,$0060
  213.  
  214.     dc.w    $4e87,$fffe
  215.     dc.w    $140,$00a0
  216.  
  217. ; Das gleiche für Zeile $4f
  218.  
  219.     dc.w    $4f07,$fffe
  220.     dc.w    $140,$0060
  221.  
  222.     dc.w    $4f87,$fffe
  223.     dc.w    $140,$00a0
  224.  
  225.     dc.w    $5007,$fffe    ; Warte auf Zeile $50
  226.     dc.w    $142,$0000    ; SPR0CTL - deaktiviert den Sprite
  227.  
  228.     dc.w    $FFFF,$FFFE    ; Ende der Copperlist
  229.  
  230.  
  231.     SECTION LEERESPLANE,BSS_C    ; Wir brauchen ein leeres Bitplane,
  232.                     ; denn ohne Bitplanes können wir
  233.                     ; keine Sprites anzeigen.
  234.  
  235. BITPLANE:
  236.     ds.b    40*256        ; leeres Bitplane Lowres
  237.  
  238.     end
  239.  
  240. Direktes Manipulieren der Spriteregister macht es auch möglich, einen Sprite
  241. zwei Mal suf der selben Zeile zu malen, ihn also auf verschiedenen horizontalen
  242. Positionen zu setzen. Der Trick besteht in der Möglichkeit des Copper, eine
  243. bestimmte Position am Bildschirm abzuwarten.  Am Anfang wartet man die erste
  244. Zeile des Bildschirmes ab, an der der Sprite beginnen soll. Im Beispiel nehmen
  245. wir Zeile $40, in der Copperlist:
  246.  
  247.     dc.w    $4007,$fffe    ; Warte auf Zeile $40, horizontale Pos. 7
  248.  
  249.  Dann werden die Register SPR0CTL, SPRDATB und SPRDAT geladen:
  250.  
  251.     dc.w    $142,$0000    ; SPR0CTL
  252.     dc.w    $146,$0e70    ; SPR0DATB
  253.     dc.w    $144,$03c0    ; SPR0DATA - aktiviert den Sprite
  254.  
  255. Dann gibt man den ersten Wert der horizontale Position des Sprite in SPRxPOS:
  256.  
  257.     dc.w    $140,$0060    ; SPR0POS - horizontale Position
  258.  
  259. Nun wartet man, bis der Elektronenstrahl an dieser Position vorbeigegangen ist:
  260.  
  261.     dc.w    $4087,$fffe    ; Warte auf Zeile $40, horizontale Pos. 87
  262.  
  263. Im Beispiel ist die horizontale Position des Sprite $60. Wenn wir also auf
  264. Position $87 warten, dann sind wir sicher, daß der Sprite schon gezeichnet
  265. wurde. Wenn der Elektronenstrahl diese Position überflogen hat, dann wurde
  266. der Sprite auch gemalt.
  267.  
  268. Wenn das einmal vorbei ist, schreiben wir die zweite Position in das Regiter
  269. SPRxPOS.
  270.  
  271.     dc.w    $140,$00a0    ; SPR0POS - horizontale Position
  272.  
  273. Somit wird der Sprite nochmal auf der gleichen Zeile gezeichnet. Um nun auch
  274. auf den folgenden Zeilen die Sprites zu verdoppeln, muß dieser Schritt nur
  275. immer wiederholt werden. Für die Zeile $41 schreiben wir z.B.:
  276.  
  277. ; Das gleiche für Zeile $41
  278.  
  279.     dc.w    $4107,$fffe
  280.     dc.w    $140,$0060
  281.  
  282.     dc.w    $4187,$fffe
  283.     dc.w    $140,$00a0
  284.  
  285. Es ist das Selbe wie bei Zeile $40, wir behalten die Register SPR0DATA,
  286. SPR0DATB und SPR0CTL konstant, um auch die Form des Sprite konstant zu
  287. halten. Wenn man möchte, kann man natürlich diese Werte verändern, und somit
  288. auch das Aussehen des Sprite.
  289.  
  290. Um den Sprite zu deaktivieren muß einfach irgend etwas in das Register SPR0CLT
  291. geschrieben werden, etwa so:
  292.  
  293.     dc.w    $5007,$fffe    ; Warte auf Zeile $50
  294.     dc.w    $142,$0000    ; SPR0CTL - deaktiviert den Sprite
  295.  
  296. Wenn ihr wirklich übertreiben wollt, dann könnt ihr auch noch zwischen
  297. einem Balken und dem anderen Palette ändern, um so auch noch eine
  298. Wiederverwendung der Farben zu haben.
  299. Versucht dieses Stück an dieser markierten Stelle einzufügen:
  300.  
  301. ; ---> fügt hier das Stück Copperlist ein, das am Ende des Kommentars steht
  302.  
  303. Wir ersetzen das letzte Stück, das sich mit dem Anzeigen des Sprites befasst.
  304. (Amiga+b+c+i, um ein Stück Text zu kopieren).
  305.  
  306.     dc.w    $4007,$fffe    ; Warte auf Zeile $40, horizontale Pos. 7
  307.     dc.w    $140,$0060    ; SPR0POS - horizontale Position
  308.     dc.w    $142,$0000    ; SPR0CTL
  309.     dc.w    $146,$0e70    ; SPR0DATB
  310.     dc.w    $144,$03c0    ; SPR0DATA - aktiviert den Sprite
  311.  
  312.     dc.w    $4087,$fffe    ; Warte auf Zeile $40, horizontale Pos. 87
  313.     dc.w    $1A2,$aFa    ; COLOR17    ; Grünton
  314.     dc.w    $1A4,$050    ; COLOR18
  315.     dc.w    $1A6,$0a0    ; COLOR19
  316.     dc.w    $140,$00a0    ; SPR0POS - horizontale Position
  317.  
  318. ; Zeile $41
  319.     dc.w    $4107,$fffe    ; wait horiz. Position 07
  320.     dc.w    $1A2,$FF0    ; COLOR17    ; Orange
  321.     dc.w    $1A4,$a00    ; COLOR18
  322.     dc.w    $1A6,$F70    ; COLOR19
  323.     dc.w    $140,$0060    ; spr0pos
  324.     dc.w    $4187,$fffe    ; wait horiz. Position 87
  325.     dc.w    $1A2,$aFa    ; COLOR17    ; Grünton
  326.     dc.w    $1A4,$050    ; COLOR18
  327.     dc.w    $1A6,$0a0    ; COLOR19
  328.     dc.w    $140,$00a0    ; spr0pos
  329. ; Zeile $42
  330.     dc.w    $4207,$fffe    ; wait horiz. Position 07
  331.     dc.w    $1A2,$FF0    ; COLOR17    ; Orange
  332.     dc.w    $1A4,$a00    ; COLOR18
  333.     dc.w    $1A6,$F70    ; COLOR19
  334.     dc.w    $140,$0060    ; spr0pos
  335.     dc.w    $4287,$fffe    ; wait horiz. Position 87
  336.     dc.w    $1A2,$aFa    ; COLOR17    ; Grünton
  337.     dc.w    $1A4,$050    ; COLOR18
  338.     dc.w    $1A6,$0a0    ; COLOR19
  339.     dc.w    $140,$00a0    ; spr0pos
  340. ; Zeile $43
  341.     dc.w    $4307,$fffe    ; wait horiz. Position 07
  342.     dc.w    $1A2,$FF0    ; COLOR17    ; Orange
  343.     dc.w    $1A4,$a00    ; COLOR18
  344.     dc.w    $1A6,$F70    ; COLOR19
  345.     dc.w    $140,$0060    ; spr0pos
  346.     dc.w    $4387,$fffe    ; wait horiz. Position 87
  347.     dc.w    $1A2,$aFa    ; COLOR17    ; Grünton
  348.     dc.w    $1A4,$050    ; COLOR18
  349.     dc.w    $1A6,$0a0    ; COLOR19
  350.     dc.w    $140,$00a0    ; spr0pos
  351. ; Zeile $44
  352.     dc.w    $4407,$fffe    ; wait horiz. Position 07
  353.     dc.w    $1A2,$FF0    ; COLOR17    ; Orange
  354.     dc.w    $1A4,$a00    ; COLOR18
  355.     dc.w    $1A6,$F70    ; COLOR19
  356.     dc.w    $140,$0060    ; spr0pos
  357.     dc.w    $4487,$fffe    ; wait horiz. Position 87
  358.     dc.w    $1A2,$aFa    ; COLOR17    ; Grünton
  359.     dc.w    $1A4,$050    ; COLOR18
  360.     dc.w    $1A6,$0a0    ; COLOR19
  361.     dc.w    $140,$00a0    ; spr0pos
  362. ; Zeile $45
  363.     dc.w    $4507,$fffe    ; wait horiz. Position 07
  364.     dc.w    $1A2,$FF0    ; COLOR17    ; Orange
  365.     dc.w    $1A4,$a00    ; COLOR18
  366.     dc.w    $1A6,$F70    ; COLOR19
  367.     dc.w    $140,$0060    ; spr0pos
  368.     dc.w    $4587,$fffe    ; wait horiz. Position 87
  369.     dc.w    $1A2,$aFa    ; COLOR17    ; Grünton
  370.     dc.w    $1A4,$050    ; COLOR18
  371.     dc.w    $1A6,$0a0    ; COLOR19
  372.     dc.w    $140,$00a0    ; spr0pos
  373.  
  374.     dc.w    $4607,$fffe    ; Warte auf Zeile $46
  375.     dc.w    $142,$0000    ; SPR0CTL - deaktiviert den Sprite
  376.     dc.w    $FFFF,$FFFE    ; Ende der Copperlist
  377.  
  378.