                          - SEPTIC'S DEMOSKOLA -

                                 Lektion 5
                                 ¯¯¯¯¯¯¯¯¯
                        Skriven av Vicious / Septic

                                 05 Jun 93



                                 Inledning
                                 ¯¯¯¯¯¯¯¯¯
Efter två lektioner om bitplansgrafik ska vi nu gå vidare till sprites, och
göra en (förr i tiden) mycket (men tyvärr även nu) vanlig typ av
stjärnscroll! Mycket nöje!


                                   Teori
                                   ¯¯¯¯¯
Trots att sprites ser ut som vanlig bitplansgrafik är de egentligen helt
oberoende av grafiken bakom-framför dem. Att göra några scrollande stjärnor
bakom en vektorkub kräver alltså ingen större ansträngning än att göra dem
på en tom skärm. Det finns bara åtta sprite kanaler på Amigan, vilket bara
tillåter att åtta sprites visas på samma gång PÅ SAMMA RASTERRAD! Ska man
köra spritarna huller om buller om varandra så kan man alltså bara ha åtta
stycken, men ser man till att de ligger efter varandra nedåt på skärmen
(som i en horisontell stjärnscroll) så kan man använda en återanvändnings-
teknik som innebär att sprite kanalen visar en ny sprite efter att den
blivit klar med den förra...Detta betyder alltså att i en stjärnscroll kan
man rita ut en stjärna och sedan vänta på en ny rad med samma spritekanal
och rita ut ännu en ny stjärna. På det här sättet kan man visa kanske 200
stjärnor med bara EN spritekanal, och om man använder varje spritekanal
till ett lager stjärnor, blir det 8 lager med 200 stjärnor i varje, vilket
ger 1600 punkter...Ganska lagom.
  En sprite kan bara vara 16 pixlar bred (ej AGA) men däremot kan den vara
hur hög som helst! Den kan bara ha 4 färger i vanlig mode, men använder man
attached mode (som ger 16 färger) så halveras spritekanal-antalet till 4.
  En sprite är uppbyggd på följande sätt:

   WORD 1 - Bit 15-8 innehåller de 8 lägsta VSTART-bitarna
            Bit  7-0 innehåller de 8 höga bitarna i HSTART
   WORD 2 - Bit 15-8 innehåller de 8 låga VSTOP-bitarna
            Bit 7    (används i attached mode)
            Bit 6-3  Används ej
            Bit 2    VSTART högsta biten
            Bit 1    VSTOP högsta biten
            Bit 0    HSTART låga biten

Härefter följer sprite data för grafiken och sen antingen två words med
noll, eller nya spritekontroll WORDS för nästa sprite.
  VSTART står för den vertikala startpositionen och VSTOP för
slutpositionen. Detta anger alltså höjden på spriten. HSTART är den
horisontella startpositionen. Alla dessa siffror anges i
hårdvarukoordinater, som börjar en bit innan den riktiga skärmen.

  En sprite kan se ut så här:

   DC.W   $6D60,$7200   ; VSTART,HSTART,VSTOP
   DC.W   $0990,$07E0   ; Data för grafiken i två bitplan.
   DC.W   $13C8,$0FF0
   DC.W   $23C4,$1FF8
   DC.W   $13C8,$0FF0
   DC.W   $0990,$07E0
   DC.W   $0000,$0000   ; Slut på spritedata

Den här spriten kommer att visas på horis.pos $60 och vertikal pos $6D till
$72...Sprite grafiken skapas enklast i en RAW to IFF converter.
  Vill man återanvända spritekanalen så är det bara att haka på ny
spritedata där nollorna sitter:

   DC.W   $6D60,$7200   ; VSTART,HSTART,VSTOP
   DC.W   $0990,$07E0   ; Data för grafiken i två bitplan.
   DC.W   $13C8,$0FF0
   DC.W   $23C4,$1FF8
   DC.W   $13C8,$0FF0
   DC.W   $0990,$07E0
   DC.W   $8D90,$9200   ; Vår nya sprite börjar här!
   DC.W   $0990,$07E0   ; Data för grafiken i två bitplan.
   DC.W   $13C8,$0FF0
   DC.W   $23C4,$1FF8
   DC.W   $13C8,$0FF0
   DC.W   $0990,$07E0
   DC.W   $0000,$0000   ; Slut på spritedata

Här kommer vår första sprite att visas på samma ställe som förut, men samma
spritekanal kommer nu också att visa en likadan på position $90, $8D.
Fantastiskt!

                                 Register
                                 ¯¯¯¯¯¯¯¯
Först och främst måste vi slå på sprite DMA i DMACON ($dff096) i vanlig
ordning. Sen behöver vi bara ställa in lite pekare varje vertikal blanking
för att DMAn ska visa våra vackra spritar. Eftersom de ska ställas in varje
VBL, så ska vi givetvis (surprise, surprise!) uppdatera dem
med.....COPPERN!
  SPR0PT ($DFF120) heter den första spritepekaren och sen följer 7
longwords till de andra pekarna som vi måste ställa in.
  Hur jag gör detta smidigt ser du i programexemplet.
  Spritarnas färger ställs in i färgregistren 16 till 32, och där har två
spritepar 4 färger var. Det betyder alltså att sprite 0 och 1 delar på
färgerna 16-19, sprite 2 och 3 på färgerna 20-23, sprite 4 och 5 på
färgerna 24-27 och sprite 6 och 7 på färgerna 28-31.
  Använder man attached mode (16 färger) så delar de fyra spritarna på
färgerna 16-31.


                              Programexemplet
                              ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Tja, inte mycket att kommentera egentligen...En sån där stjärnscroll som vi
sett 10958345 gånger förr! Oftast brukar den vara i endast tre lager, men
jag har klämt till med sex lager som alla scrollar i
olika hastigheter från 1 till 6 pixlar varje vertical blanking.
  Scrollningen görs genom att ändra i varje sprites kontroll WORD, där den
horisontella positionen står. Den kommer självmant att "wrappa runt" när
byten nått 255 och skärmens ytterkant är nådd.


                                 Utmaning
                                 ¯¯¯¯¯¯¯¯
Den här gången tänkte jag göra en enkel utmaning så att alla
(förhoppningsvis) kan delta...
  Det jag vill att ni ska göra är att skriva om den här lektionens program-
exempel till att klara två riktningar på stjärnscrollen. Höger och vänster!
Stjärnorna ska alltså scrolla åt höger först, och när man trycker på
joystick-knappen ska de scrolla åt vänster istället, och så ska man kunna
hålla på och byta riktning tills man får hjärnblödning, eller trycker på
musknappen.
  Joysticken läses av på samma sätt som vänster musknapp, fast med bit #7
istället för #6:

   BTST   #7,$BFE001   ; Läs av joystick-knapp...

  Detta kan väl inte vara för svårt?! Jag kommer att presentera en lösning
i nästa lektion, men tills dess vill jag ha många skojiga försök från er
sida!
