                          - SEPTIC'S DEMOSKOLA -

                                 Lektion 2
                                 
                        Skriven av Vicious / Septic

                                 23 Apr 93



                                 Inledning
                                 
Jaha, d var det dags fr andra lektionen i demoskolan. Jag hoppas att
frsta delen inte vllade er ngra strre problem. Om den gjorde det s var
inte rdda fr att frga mig! Jag svarar p allt, och jag kan ven frklara
vissa "kod-tekniska" saker, fr er som r assembler-nybrjare, bara ni
frgar...
  Tja, frra gngen tog jag upp grunderna i copperns programmering. Jag
tnkte fortstta med ett litet program som utnyttjar copperns mjligheter
att byta frger. Det r inte speciellt avancerat, men br nog vara
intressant fr nybrjaren, hoppas jag!


                                 Register
                                 
Det enda nya registret jag behver ta upp idag r VPOSR ($dff004). Det r,
precis som mnga andra register, ett READ ONLY register. Egentligen ligger
vertikala och horisontala positionen i registret VHPOSR ($dff006), dr de
tta lgsta bitarna r horis-positionen och de tta hgsta bitarna r
vert-positionen. Detta rcker ju dock inte p en PAL-amiga, eftersom vi
mste kunna vnta p positioner ver $FF (vilket inte fr plats i en byte),
men d hittar man hgsta biten i VPOSR ($dff004).
  Nr man programmerar demos r det viktigt att kunna vnta p rasterstrlens
position fr att undvika att ens rutiner flimmrar eller kanske till och med
frsvinner ibland. Om man inte vntar p "syncen", som det kallas, s kan
rutiner ocks g olika snabbt p olika datorer, och musikrutiner gr
ALLDELES fr fort. (Du kan ju testa att plocka bort hoppet till rutinen
SYNC i mainloopen p mitt program fr att se skillnaden, och varfr man br
synca i sitt program...)
  Jaja, somliga brukar bara vnta p att vertikala positionen blir noll
genom den enkla testen:

WT:   TST.B   $DFF006
      BNE.S   WT

  Detta kan vara bra ibland, men oftast r det dumt. Runt den hr
positionen, allts vertikal-position noll, sker mycket uppdateringar,
coppern restartas och interrupt exekveras, vilket kan gra att vr rutin
frdrjs (om man har otur), och det r dessutom oflexibelt om man vill kra
en enkel liten bob lngst upp p skrmen, fr d kommer den inte att synas.
  Allts, man br kunna vlja vilken vertikal position man vill vnta p,
och det r den metoden jag anvnder:

sync:   move.l  $dff004,d0      ; Hr hmtar jag allts bde horisontell
                                ; och vertikal position, plus den mest
                                ; signifikanta biten av den vertikala
                                ; positionen och sen
        and.l   #$1ff00,d0      ; maskar jag bort, med kommandot AND, alla
                                ; ondiga bitar, allts de horisontella,
                                ; eftersom jag bara kollar de vertikala.
        lsr.l   #8,d0           ; Sen gr jag en liten skift s att
                                ; vertikalpositionen hamnar lngst ner i
                                ; wordet...
        cmp.w   #$f0,d0         ; Nu jmfr jag det bara med den vertikala
                                ; position jag vill vnta p och
        bne.s   sync            ; hoppar tillbaks om det inte var rtt...

Resten av programmet ska inte innebra ngot nytt...Grunden r vrt frra
program, allts den gamla startupen. Om du har glmt copperns instruktioner
kan du titta i lektion 1.
  Vrt att notera kanske, r hur man stoppar en copperlista, dvs stter den
i en evig loop. Det grs med tv word s hr:

   DC.W   $FFFF,$FFFE

Vad instruktionen egentligen gr r att vnta ovillkorligt p en position
som aldrig kommer att intrffa, och drfr stannar coppern dr tills den fr
en signal att skrmen ska uppdateras igen, och d brjar den om frn brjan
av listan.
  En annan intressant sak r hur man ska kunna vnta p rader ver 255. Den
vertikala WAIT-positionen r ju bara en byte, och rymmer sledes inte hgre
tal n 255. Jo, d finns det ett litet knep...Man vntar p den allra sista
positionen som kan intrffa, och d gr coppern automatiskt ver i ett
"PAL-lge", som man kan kalla det, och $100 adderas till alla WAIT-satsers
vertikala position. Det betyder allts att position 02 blir position $102
istllet.
  Man vntar p "PAL" med fljande WAIT-sats:

   DC.W   $FFDF,$FFFE

Jag visar ven detta i programexemplet, s titta grna dr ocks.

Det var allt under rubriken Register fr den hr gngen, men det kommer nya
spnnande saker nsta gng!


                              Programexemplet
                              
Den hr gngen har jag bara gtt in lite mer p copperns programmering, och
programmet visar en gammal effekt - gungande copperbars...
  Att gra dessa balkar r relativt ltt. Frst och frmst mste man
reservera plats fr dem i sin copperlista, och eftersom det r vldigt
trkigt att skriva 168 waitrader s reserverar vi bara platsen med nollor,
och genererar copperkoden i vrt program.
  Kod-genereringen gr jag i rutinen ClrBars. Den kr jag varje vertikal
blanking, eftersom den samtidigt som den genererar copperkoden, rensar de
gamla balkarna. Tekniken jag anvnder fr att generera koden r vldigt
enkel. Jag pekar p stllet dr vi ska flytta in koden och stter sen tv
data register till de instruktioner vi behver. Den ena instruktionen r en
WAIT, och den andra r en MOVE. MOVE-instruktionen ska ju hela tiden vara
$01800000, eftersom vi bara vill stta bakgrundsfrgen. WAIT-instruktionen
dremot mste vi ka p hela tiden, s att den vntar p raden efter
fregende.
  I rutinen SwingBars sen, skriver jag ut de sex rasterbalkarna en efter
en, med brjan p den minsta, som alltid ska vara lngst bort.
  Jag lser bara av ett sinusvrde frn tabellen, och multiplicerar det s
att jag hamnar p rtt plats i copperlistan, och sen fr jag in frgvrdena
dr. Som sagt, inte s svrt, men kanske lite knepigt fr nybrjaren. Kom
grna med frgor i s fall!
  Om du vill kan du grna ndra lite i coppergrafiken i slutet p sourcen.
Som du ser r grafiken uppbyggd med vanliga frgbyten, som du kan tex ndra
frsta balken,

	; Bar 1 (Smalast)
	dc.w	$700
	dc.w	$800
	dc.w	$500
	dc.w	$000

till en gul balk:

	; Bar 1 (Smalast)
	dc.w	$770
	dc.w	$880
	dc.w	$550
	dc.w	$000

  Experimentera p bara! S kommer du frhoppningsvis frst hur det
fungerar!
