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

  1.  
  2. ; Listing7g.s    EIN ATTACHED-SPRITE ZU 16 FARBEN WIRD MITTELS ZWEI TABELLEN
  3. ;        (X- und Y- Koordinaten) AM BILDSCHIRM BEWEGT
  4.  
  5.  
  6.     SECTION CipundCop,CODE
  7.  
  8. Anfang:
  9.     move.l    4.w,a6        ; Execbase
  10.     jsr    -$78(a6)    ; Disable
  11.     lea    GfxName(PC),a1    ; Libname
  12.     jsr    -$198(a6)    ; OpenLibrary
  13.     move.l    d0,GfxBase
  14.     move.l    d0,a6
  15.     move.l    $26(a6),OldCop    ; speichern die alte COP
  16.  
  17. ;    Pointen auf das "leere" PIC
  18.  
  19.     MOVE.L    #BITPLANE,d0    ; wohin pointen
  20.     LEA    BPLPOINTERS,A1    ; COP-Pointer
  21.     move.w    d0,6(a1)
  22.     swap    d0
  23.     move.w    d0,2(a1)
  24.  
  25.  
  26. ;    Pointen auf die Sprite 0 und 1, die zusammen einen einzigen Sprite
  27. ;    zu 16 Farben ergeben. Der Sprite 1, der ungerade, muß Bit 7 des zweiten
  28. ;    Word auf 1 haben.
  29.  
  30.     MOVE.L    #MEINSPRITE0,d0        ; Adresse des Sprite in d0
  31.     LEA    SpritePointers,a1    ; Pointer in der Copperlist
  32.     move.w    d0,6(a1)
  33.     swap    d0
  34.     move.w    d0,2(a1)
  35.     MOVE.L    #MEINSPRITE1,d0        ; Adresse des Sprite in d0
  36.     addq.w    #8,a1            ; nächsten SPRITEPOINTERS
  37.     move.w    d0,6(a1)
  38.     swap    d0
  39.     move.w    d0,2(a1)
  40.  
  41.     bset    #7,MEINSPRITE1+3    ; Setzt das Bit für Attached beim
  42.                     ; Sprite 1. Ohne ihm sind die Sprites
  43.                     ; nicht ATTACHED, sondern "normal"
  44.     move.l    #COPPERLIST,$dff080    ; unsere COP
  45.     move.w    d0,$dff088        ; START COP
  46.     move.w    #0,$dff1fc        ; NO AGA!
  47.     move.w    #$c00,$dff106        ; NO AGA!
  48.  
  49. mouse:
  50.     cmpi.b    #$ff,$dff006    ; Zeile 255?
  51.     bne.s    mouse
  52.  
  53.  
  54.     bsr.w    BewegeSpriteX    ; Bewege Sprite 0 in X-Richtung
  55.     bsr.w    BewegeSpriteY    ; Bewege Sprite 0 in Y-Richtung
  56.  
  57. Warte:
  58.     cmpi.b    #$ff,$dff006    ; Zeile 255?
  59.     beq.s    Warte
  60.  
  61.     btst    #6,$bfe001    ; Mouse gedrückt?
  62.     bne.s    mouse
  63.  
  64.  
  65.     move.l    OldCop(PC),$dff080    ; Pointen auf die alte SystemCOP
  66.     move.w    d0,$dff088        ; Starten die alte SystemCOP
  67.  
  68.     move.l    4.w,a6
  69.     jsr    -$7e(a6)    ; Enable
  70.     move.l    gfxbase(PC),a1
  71.     jsr    -$19e(a6)    ; Closelibrary
  72.     rts
  73.  
  74. ;    Daten
  75. GfxName:
  76.     dc.b    "graphics.library",0,0
  77.  
  78. GfxBase:
  79.     dc.l    0
  80.  
  81. OldCop:
  82.     dc.l    0
  83.  
  84. ; Diese Routine bewegt den Sprite indem die auf das Byte HSTART, also
  85. ; dem Byte seiner X-Position,zugreift.Es werden die Werte einer vorausberechn.
  86. ; Tabelle (TABX) eingesetzt. Wenn wir nur auf HSTART agieren, dann bewegen wir
  87. ; den Sprite um jeweils 2 Pixel, und nicht nur einem, deswegen ist der Scroll
  88. ; etwas "ruckelig", vor allem wenn er langsamer wird.
  89. ; In den nächsten Listings werden wir dieses Manko beheben und mit einem Pixel
  90. ; scrollen.
  91.  
  92. BewegeSpriteX:
  93.     ADDQ.L    #1,TABXPOINT     ; Pointe auf das nächste Byte
  94.     MOVE.L    TABXPOINT(PC),A0 ; Adresse, die im Long TABXPOINT enthalten ist
  95.                  ; wird in a0 kopiert
  96.     CMP.L    #ENDETABX-1,A0     ; Sind wir beim letzten Long der TAB?
  97.     BNE.S    NOBSTARTX     ; noch nicht? dann mach´ weiter
  98.     MOVE.L    #TABX-1,TABXPOINT ; Starte wieder beim ersten Long
  99. NOBSTARTX:
  100.  
  101.     MOVE.b    (A0),MEINSPRITE0+1 ; Kopie das Byte aus der Tabelle in HSTART0
  102.     MOVE.b    (A0),MEINSPRITE1+1 ; Kopie das Byte aus der Tabelle in HSTART1
  103.     rts
  104.  
  105. TABXPOINT:
  106.     dc.l    TABX-1
  107.  
  108. ; Tabelle mit vorberechneten X-Koordinaten.
  109.  
  110. TABX:
  111.     incbin    "XCOORDINAT.TAB"    ; 334 Werte
  112. ENDETABX:
  113.  
  114. ; Diese Routine bewegt den Sprite nach Oben und nach Unten, indem sie auf
  115. ; die Bytes VSTART und VSTOP zugreift, also den Anfangs- und Endkoordinaten
  116. ; des Sprites. Es werden schon vordefinierte Koordinaten aus TABY eingesetzt.
  117.  
  118. BewegeSpriteY:
  119.     ADDQ.L    #1,TABYPOINT     ; Pointe auf das nächste Byte
  120.     MOVE.L    TABYPOINT(PC),A0 ; Adresse, die im Long TABXPOINT enthalten ist
  121.                  ; wird in a0 kopiert
  122.     CMP.L    #ENDETABY-1,A0     ; Sind wir beim letzten Long der TAB?
  123.     BNE.S    NOBSTARTY     ; noch nicht? dann mach´ weiter
  124.     MOVE.L    #TABY-1,TABYPOINT ; Starte wieder beim ersten Long
  125. NOBSTARTY:
  126.     moveq    #0,d0        ; Lösche d0
  127.     MOVE.b    (A0),d0        ; kopieren das Byte aus der Tabelle in d0
  128.     MOVE.b    d0,MEINSPRITE0    ; kopieren das Byte in VSTART0
  129.     MOVE.b    d0,MEINSPRITE1    ; kopieren das Byte in VSTART1
  130.     ADD.B    #15,D0        ; Zähle die Länge eines Sprite dazu, um die
  131.                     ; Endposition (VSTOP) zu ermitteln
  132.     move.b    d0,MEINSPRITE0+2    ; Setze den richtigen Wert in VSTOP0
  133.     move.b    d0,MEINSPRITE1+2    ; Setze den richtigen WErt in VSTOP1
  134.     rts
  135.  
  136. TABYPOINT:
  137.     dc.l    TABY-1        ; Bemerke: die Werte der Tabelle sind Bytes
  138.  
  139. ; Tabelle mit vorberechneten Y-Koordinaten.
  140.  
  141. TABY:
  142.     incbin    "YCOORDINAT.TAB"    ; 200 Werte
  143. ENDETABY:
  144.  
  145.  
  146.     SECTION GRAPHIC,DATA_C
  147.  
  148. COPPERLIST:
  149. SpritePointers:
  150.     dc.w    $120,0,$122,0,$124,0,$126,0,$128,0 ; SPRITE
  151.     dc.w    $12a,0,$12c,0,$12e,0,$130,0,$132,0
  152.     dc.w    $134,0,$136,0,$138,0,$13a,0,$13c,0
  153.     dc.w    $13e,0
  154.  
  155.     dc.w    $8E,$2c81    ; DiwStrt
  156.     dc.w    $90,$2cc1    ; DiwStop
  157.     dc.w    $92,$38        ; DdfStart
  158.     dc.w    $94,$d0        ; DdfStop
  159.     dc.w    $102,0        ; BplCon1
  160.     dc.w    $104,0        ; BplCon2
  161.     dc.w    $108,0        ; Bpl1Mod
  162.     dc.w    $10a,0        ; Bpl2Mod
  163.  
  164.             ; 5432109876543210
  165.     dc.w    $100,%0001001000000000    ; Bit 12 an-1 Bitplane lowres
  166.  
  167. BPLPOINTERS:
  168.     dc.w $e0,0,$e2,0    ;erstes  Bitplane
  169.  
  170. ;    Palette der PIC
  171.  
  172.     dc.w    $180,$000    ; Color0    ; schwarzer Hintergrund
  173.     dc.w    $182,$123    ; Color1    ; Color 1 des Bitplane, das
  174.                         ; in diesem Fall leer ist,
  175.                         ; also nicht erscheint
  176.  
  177. ;    Palette der ATTACHED-SPRITE
  178.  
  179.     dc.w    $1A2,$FFC    ; color17, Farbe 1 für die Attached-Sprites
  180.     dc.w    $1A4,$EEB    ; color18, Farbe 2 für die Attached-Sprites
  181.     dc.w    $1A6,$CD9    ; color19, Farbe 3 für die Attached-Sprites
  182.     dc.w    $1A8,$AC8    ; color20, Farbe 4 für die Attached-Sprites
  183.     dc.w    $1AA,$8B6    ; color21, Farbe 5 für die Attached-Sprites
  184.     dc.w    $1AC,$6A5    ; color22, Farbe 6 für die Attached-Sprites
  185.     dc.w    $1AE,$494    ; color23, Farbe 7 für die Attached-Sprites
  186.     dc.w    $1B0,$384    ; color24, Farbe 7 für die Attached-Sprites
  187.     dc.w    $1B2,$274    ; color25, Farbe 9 für die Attached-Sprites
  188.     dc.w    $1B4,$164    ; color26, Farbe 10 für die Attached-Sprites
  189.     dc.w    $1B6,$154    ; color27, Farbe 11 für die Attached-Sprites
  190.     dc.w    $1B8,$044    ; color28, Farbe 12 für die Attached-Sprites
  191.     dc.w    $1BA,$033    ; color29, Farbe 13 für die Attached-Sprites
  192.     dc.w    $1BC,$012    ; color30, Farbe 14 für die Attached-Sprites
  193.     dc.w    $1BE,$001    ; color31, Farbe 15 für die Attached-Sprites
  194.  
  195.     dc.w    $FFFF,$FFFE    ; Ende der Copperlist
  196.  
  197.  
  198. ; ************ Hier die Sprites: KLARERWEISE in CHIP RAM! **********
  199.  
  200. MEINSPRITE0:      ; Länge 15 Zeilen
  201. VSTART0:
  202.     dc.b $00  ; Vertikale Anfangsposition des Sprite (von $2c bis $f2)
  203. HSTART0:
  204.     dc.b $00  ; Horizontale Anfangsposition des Sprite (von $40 bis $d8)
  205. VSTOP0:
  206.     dc.b $00  ; Vertikale Endposition des Sprite
  207.     dc.b $00
  208.  
  209.     dc.w $0380,$0650,$04e8,$07d0,$0534,$1868,$1e5c,$1636 ; Daten des
  210.     dc.w $377e,$5514,$43a1,$1595,$0172,$1317,$6858,$5035 ; Sprite 0
  211.     dc.w $318c,$0c65,$7453,$27c9,$5ece,$5298,$0bfe,$2c32
  212.     dc.w $005c,$13c4,$0be8,$0c18,$03e0,$03e0
  213.  
  214.     dc.w    0,0    ; 2 auf 0 gesetzte Word markieren das Ende des Sprite
  215.  
  216.  
  217. MEINSPRITE1:        ; Länge 15 Zeilen
  218. VSTART1:
  219.     dc.b $00  ; Vertikale Anfangsposition des Sprite (von $2c bis $f2)
  220. HSTART1:
  221.     dc.b $00  ; Horizontale Anfangsposition des Sprite (von $40 bis $d8)
  222. VSTOP1:
  223.     dc.b $00    ; $50+13=$5d    ; Vertikale Endposition des Sprite
  224.     dc.b $00    ; Bit 7 setzen, un die Sprites 0 und 1 zu vermählen
  225.  
  226.     dc.w $0430,$07f0,$0fc8,$0838,$0fe4,$101c,$39f2,$200e ; Daten des
  227.     dc.w $58f2,$600e,$5873,$600f,$5cf1,$600f,$1ff3,$600f ; Sprite 1
  228.     dc.w $4fe3,$701f,$47c7,$783f,$6286,$7d7e,$300e,$3ffe
  229.     dc.w $1c3c,$1ffc,$0ff8,$0ff8,$03e0,$03e0
  230.  
  231.     dc.w    0,0    ; 2 auf 0 gesetzte Word markieren das Ende des Sprites
  232.  
  233.     SECTION LEERESPLANE,BSS_C ; Ein auf 0 gesetztes Bitplane, wir
  234.                   ; müssen es verwenden, denn ohne Bitplane
  235.                   ; ist es nicht möglich, die Sprites
  236.                   ; zu aktivieren
  237. BITPLANE:
  238.     ds.b    40*256        ; Bitplane auf 0 Lowres
  239.  
  240.     end
  241.  
  242. AUßer der Neuigkeit des Attached-Bits, um einen Sprite in 16 Farben  statt
  243. in 4 erscheinen zu lassen, gibt´s da noch einige DInge:
  244.  
  245. 1) Die Tabellen für X und Y wurden mit dem Befehl "WB"  abgespeichert  und
  246. werden  nun mit dem Incbin geladen, eingebunden. Somit können verschiedene
  247. Programme auf die selbe Tabelle zugreifen, Hauptsache, sie  befindet  sich
  248. auf der Disk!
  249. 2) Es werden nicht mehr die Label VSTART0, VSTART1,  HSTART0  und  HSTART1
  250. etc.  verwendet, um den Sprite zu bewegen. Die angesprochenen Bytes werden
  251. nun auf folgende Weise erreicht:
  252.  
  253.  
  254.     MEINSPRITE    ; Für VSTART
  255.     MEINSPRITE+1    ; Für HSTART
  256.     MEINSPRITE+2    ; Für VSTOP
  257.  
  258. Damit kann ein Sprite ganz einfach so begonnen werden:
  259.  
  260. MEINSPRITE:
  261.     DC.W    0,0
  262.     ..Daten..
  263.  
  264. Ohne die zwei Words in einzelne Bytes zerlegen zu müssen,  und  jedem  ein
  265. Label  zuzuteilen.  Das  Verlängert  das  Listing  nur.  Auch um Bit 7 des
  266. zweiten  Word  von  Sprite  1  zu  setzen,  um  also den AttachedModus
  267. einzuschalten, reicht folgende Operation:
  268.  
  269.     bset    #7,MEINSPRITE1+3
  270.  
  271. Ansonsten hätten wir es "von Hand" in diesem vierten Byte setzen müssen:
  272.  
  273. MEINSPRITE1:
  274. VSTART1:
  275.     dc.b $00
  276. HSTART1:
  277.     dc.b $00
  278. VSTOP1:
  279.     dc.b $00
  280.     dc.b %10000000      ; oder dc.b $80 ($80=%10000000)
  281.  
  282. Wenn alle 8 Sprite verwendet werden müssen, dann  spart  man  damit  einen
  283. Haufen  Labels  und  sonstigen Platz. Noch besser wäre es, die Adresse des
  284. Sprites in ein Ax-Register  zu  geben  um  dann  mit  Offsets  dorthin  zu
  285. gelangen, wohin man will:
  286.  
  287.  
  288.     lea    MEINSPRITE,a0
  289.     MOVE.B    #yy,(a0)    ; Für VSTART
  290.     MOVE.B    #xx,1(A0)    ; Für HSTART
  291.     MOVE.B    #y2,2(A0)    ; Für VSTOP
  292.  
  293. Sich in Binärform einen Sprite in 16 Farben zu definieren wird so  langsam
  294. problematisch.    Deswegen  ist  es  besser,  man  verläßt  sich  auf  ein
  295. Malprogramm, man muß sich nur erinnern, daß ein Screen  zu  16  Farben  zu
  296. wählen ist und die Sprites nicht länger als 16 Pixel werden dürfen. Einmal
  297. das Pic in 16 Farben  im  IFF-Format  abgespeichert  (oder  einen  Brush),
  298. werden wir ihn mit dem IFF-Konverter genauso wie ein Bild konvertieren.
  299.  
  300. BEMERKUNG:  Unter  Brush versteht man ein Stück eines Bildes mit variabler
  301. Größe.
  302.  
  303. Und so wird ein Sprite mit dem Kefcon konvertiert:
  304.  
  305. 1) Ladet das IFF-File, das zu 16 Farben sein muß.
  306. 2) Ihr dürft nur den Sprite auswählen, um das zu  tun  drückt  die  rechte
  307. Taste,  dann  positioniert  euch  in die linke, obere Ecke des zukünftigen
  308. Sprite und drückt die linke Taste. Wenn ihr nun die Maus bewegt, erscheint
  309. ein  Gittermuster,  das - wie es das Schicksal will - genau 16 Pixel breit
  310. ist.  Ihr  könnt  natürlich  auch  die  Breite  und  Länge    des    Sprites
  311. kontrollieren. Um den Sprite richtig ´reinzukriegen müßt ihr beachten, daß
  312. ihr  den  Rand  des  Sprite  mit    dem    "Auswahlstrich"    des    Quadrates
  313. überschreiten  müßt,  die  letzte noch beinhaltete Zeile des Quadrates ist
  314. die, die auf der Grenze verläuft, und nicht die innerhalb des Quadrates.
  315.  
  316.  
  317.     <----- 16 pixel ----->
  318.  
  319.     |========####========| /\
  320.     ||     ########        || ||
  321.     ||   ############   || ||
  322.     || ################ || ||
  323.     ||##################|| ||
  324.     ###################### ||
  325.     ###################### Länge des Sprite, maximal 256 Pixel
  326.     ###################### ||
  327.     ||##################|| ||
  328.     || ################ || ||
  329.     ||   ############   || ||
  330.     ||     ########        || ||
  331.     |========####========| \/
  332.  
  333. Wenn der Sprite kleiner als 16 Pixel ist, dann müßt ihr einen freien  Rand
  334. lassen,  auf  beiden  Rändern  oder  nur auf einem, so, daß die Breite des
  335. Blocks immer 16 ist.
  336.  
  337. Einmal ausgewählt, muß der Sprite  als  "SPRITE16"  abgespeichert  werden,
  338. oder  als  "SPRITE4", wenn es sich um einen "normalen" Sprite handelt. Der
  339. Sprite wird in dc.b abgespeichert, also in Textformat, das  ihr  dann  mit
  340. "I" im Listing einbinden könnt. Oder in einen anderen Textbuffer laden und
  341. dann mit Amiga+b+c+i hinüberkopieren.
  342.  
  343. Und so speichert der KEFCON einen Attached-Sprite ab (16 Farben):
  344.  
  345.     dc.w $0000,$0000
  346.     dc.w $0380,$0650,$04e8,$07d0,$0534,$1868,$1e5c,$1636
  347.     dc.w $377e,$5514,$43a1,$1595,$0172,$1317,$6858,$5035
  348.     dc.w $318c,$0c65,$7453,$27c9,$5ece,$5298,$0bfe,$2c32
  349.     dc.w $005c,$13c4,$0be8,$0c18,$03e0,$03e0
  350.     dc.w 0,0
  351.  
  352.     dc.w $0000,$0000
  353.     dc.w $0430,$07f0,$0fc8,$0838,$0fe4,$101c,$39f2,$200e
  354.     dc.w $58f2,$600e,$5873,$600f,$5cf1,$600f,$1ff3,$600f
  355.     dc.w $4fe3,$701f,$47c7,$783f,$6286,$7d7e,$300e,$3ffe
  356.     dc.w $1c3c,$1ffc,$0ff8,$0ff8,$03e0,$03e0
  357.     dc.w 0,0
  358.  
  359. Wie ihr seht haben diese beiden Sprite die beiden Kontrollword  auf  NULL,
  360. die  Daten  in Hexadezimal und die zwei auf 0 gesetzten Word, die das Ende
  361. des Sprite markieren. Einfach die Label "Meinsprite0:" und  "Meinsprite1:"
  362. am  Anfang  dieser  Sprites  geben,  und  dann  mit  Meinsprite+x  auf die
  363. jeweiligen Bytes zugreifen, z.B. Koordinaten, Bit 7...  Das  Einzige,  das
  364. noch  fehlt, ist ist das Setzen des Bit 7 für den Attached-Modus, entweder
  365. mit einem BSET #7,MEINSPRITE+3 oder direkt im Sprite:
  366.  
  367.  
  368.  
  369.  
  370. MEINSPRITE1:
  371.     dc.w $0000,$0080    ; $80, oder %10000000 -> ATTACCHED!
  372.  
  373.     dc.w $0430,$07f0,$0fc8,$0838,$0fe4,$101c,$39f2,$200e
  374.     ...
  375.  
  376. Wenn ihr nur Sprites zu 4 Farben macht, dann erübrigt sich das Problem, da
  377. das Bit nicht gesetzt werden muß!
  378.  
  379. Was  die  Palette  der Sprites angeht, so müssen sie mit der Option COPPER
  380. abgespeichert werden, genauso wie bei einem Bild. Das Problem  dabei  ist,
  381. daß  alles  wie  ein  Bild  zu 16 Farben aufgefaßt wird, und nicht wie ein
  382. Sprite:
  383.  
  384.  
  385.     dc.w $0180,$0000,$0182,$0ffc,$0184,$0eeb,$0186,$0cd9
  386.     dc.w $0188,$0ac8,$018a,$08b6,$018c,$06a5,$018e,$0494
  387.     dc.w $0190,$0384,$0192,$0274,$0194,$0164,$0196,$0154
  388.     dc.w $0198,$0044,$019a,$0033,$019c,$0012,$019e,$0001
  389.  
  390. Die Farben sind richtig, aber die Register beziehen sich auf die ersten 16
  391. Farben, und nicht die letzten. Da muß man Hand  anlegen  und  sie  in  die
  392. richtigen Register bringen:
  393.  
  394.     dc.w    $1A2,$FFC    ; COLOR17, COLOR  1 für die Attached-Sprites
  395.     dc.w    $1A4,$EEB    ; COLOR18, COLOR  2 für die Attached-Sprites
  396.     dc.w    $1A6,$CD9    ; COLOR19, COLOR  3 für die Attached-Sprites
  397.     dc.w    $1A8,$AC8    ; COLOR20, COLOR  4 für die Attached-Sprites
  398.     dc.w    $1AA,$8B6    ; COLOR21, COLOR  5 für die Attached-Sprites
  399.     dc.w    $1AC,$6A5    ; COLOR22, COLOR  6 für die Attached-Sprites
  400.     dc.w    $1AE,$494    ; COLOR23, COLOR  7 für die Attached-Sprites
  401.     dc.w    $1B0,$384    ; COLOR24, COLOR  7 für die Attached-Sprites
  402.     dc.w    $1B2,$274    ; COLOR25, COLOR  9 für die Attached-Sprites
  403.     dc.w    $1B4,$164    ; COLOR26, COLOR 10 für die Attached-Sprites
  404.     dc.w    $1B6,$154    ; COLOR27, COLOR 11 für die Attached-Sprites
  405.     dc.w    $1B8,$044    ; COLOR28, COLOR 12 für die Attached-Sprites
  406.     dc.w    $1BA,$033    ; COLOR29, COLOR 13 für die Attached-Sprites
  407.     dc.w    $1BC,$012    ; COLOR30, COLOR 14 für die Attached-Sprites
  408.     dc.w    $1BE,$001    ; COLOR31, COLOR 15 für die Attached-Sprites
  409.  
  410. Man bemerke, daß in $1a2 der Wert $182 kopiert werden muß, in $1a4 der von
  411. $184 und so weiter.
  412.  
  413. Versucht, den Sprite zu 16 Farben aus diesem Listing mit  einem  eurem  zu
  414. ersetzen,  mit  eurer  Palette,  und  auch einen zu 4 Farben aus den alten
  415. Listings zu konvertieren. Es zu Tun wird  euch  hlefen,  alles  besser  zu
  416. verstehen!!!
  417.  
  418.  
  419.