MILC logo

IndexVorigeVolgendeLeeg

Sprites in ML
Genic Clubguide, 00-00-00


    
SPRITES IN ML

               SPRITES ZOALS ZE WERKELIJK ZIJN
              =================================

Iedereen die een beetje met BASIC heeft zitten  klooien  zal
gemerkt hebben  dat  sprites  heel  makkelijk  zijn  in  het
gebruik en in aansturing, maar dat komt alleen maar omdat de
BIOS zich intensief bemoeit met de spriteaansturing. Als  je
dus gaat proberen om sprites in ML te gebruiken  kom  je  al
snel voor raadsels te staan die je niet  ‚‚n  twee  drie  op
weet te lossen. Je kunt natuurlijk gebruik gaan maken van de
BIOS routines maar persoonlijk heb ik daar een hekel aan.

Als je besluit om een aansturing te gebruiken die niets  met
de BIOS te maken heeft, dan kan je een aantal leuke  grapjes
uithalen die heel handig kunnen zijn.  Zo is het mogelijk om
op 1 scherm van 32kB 1024 sprites  van  16x16  te  ontwerpen
waarvan je er 64 per keer kunt gebruiken. Als er van  pagina
gewisseld wordt, dan hoeven de sprites niet mee veranderd te
worden. De feitelijke aansturing wordt ook sneller en het is
bij een sprite botsing mogelijk om  de  coordinaten  van  de
gebotste sprites op te vragen. Dit zijn een paar voorbeelden
van de verschillen tussen de BIOS aansturing een een direkte
aansturing. Nu volgt een beschrijving en uitleg van  de  VDP
registers die met sprites te maken hebben.


         B7  B6  B5  B4  B3  B2  B1  B0

Reg. 1   x   x   x   x   x   x   SZ MAG
     8   x   x   x   x   x   x  SPD  x
     11  x   x   x   x   x   x  D16 D15
     5  D14 D13 D12 D11 D10 D09 D08 D07
     6    0   0 E16 E15 E14 E13 E12 E11

     SZ  = Sprite size (0=8*8 1=16*16)
     MAG = Magnify sprites (1=magnify)
     D16 - D07 = Adres voor spritekleur en positie in VRAM
     E16 - E11 = Adres voor spritepatronen in VRAM
                 (Hierover later meer)

Statusregisters:

        B7  B6  B5  B4  B3  B2  B1  B0

Reg. 0   x  5S   C  F4  F3  F2  F1  F0
     3  X7  X6  X5  X4  X3  X2  X1  X0
     4   1   1   1   1   1   1   1  X8
     5  Y7  Y6  Y5  Y4  Y3  Y2  Y1  Y0
     6   1   1   1   1   1   1   x  Y8

     5S = 1 als: er op screen 1 t/m 3 meer dan 4 sprites op
                 1 horizontale lijn staan.
                 er op screen 5 t/m 8 meer dan 8 sprites op
                 1 horizontale lijn staan.
      C = 1 als er een spritebotsing plaats vindt.
     F4 - F0 = Is het nummer van de sprite die als vijde of
               negende op 1 horizontale lijn staat.
     X8 - X0 = X-coordinaat van botsende sprite
     Y8 - Y0 = Y-coordinaat van botsende sprite


Dit is alle informatie over sprites die in de VDP  registers
te vinden is. Het tweede deel over de  statusregisters  laat
niets te wensen over en is helemaal  duidelijk.  Het  eerste
deel is echter wat lastiger omdat er wat addertjes onder het
gras zitten. Het gaat daarbij over de registers 11,5 en 6.

Reg. 11 en 5 vormen  samen  een  adres  waar  de  kleur-  en
positietabel van de sprites  zich  bevindt  en  registers  6
geeft aan waar de patroontabel van de  sprites  begint.  Het
eerste addertje dat we tegen komen is dat Reg.5 niet  zomaar
alle waardes mag hebben tussen 0 en 255. Feitelijk kan Reg.5
maar 32 waardes hebben omdat  er  bij  andere  waardes  geen
sprites op het scherm komen.

Een beschrijving van de registers:

Reg. 6
bevat het  startadres  van  de  patroontabel  (vorm  van  de
sprites) en kan liggen tussen 0 en  63.  Het  adres  kan  in
BASIC berekend worden met PATADR = VDP(6)*2^11    Natuurlijk
moet je rekening houden met het  feit  dat  het  VRAM  128kB
groot is. Is VDP(6)>31 dan zit je in de hoogste 64kB. In  ML
gaat het zo (In A staat de waarde van R#6)

    RLCA
    RLCA
    RLCA
    RES 0,A
    LD H,A  ; Het patroonstartadres staat in HL en als je in
    LD L,0  ; de hoogste 64kB zit dan is de Cy hoog.
    RET

Reg. 11 en 5 (Opm: VDP(12)=Reg.11=R#11)
bevatten samen een referentieadres  waaruit  het  startadres
van de positietabel en de kleurtabel gehaald kan worden.
In BASIC:  XYADR = VDP(12)*2^15+(VDP(5)-3)*128:' Positie
          COLADR = VDP(12)*2^15+(vdp(5)-7)*128:' Kleurtabel
Ook hier moet je weer op de hoogste 64kB passen. Hier kan je
daarop testen door te kijken of VDP(12)>1
In ML: (In A en B staan de waardes van R#5 en R#11)

    SUB 3          ; Trek 3 van A af als je het positieadres
    RRCA           ; wilt hebben en trek er 7 vanaf als je
    PUSH AF        ; het kleuradres wilt hebben.
    AND &H80
    LD L,A
    POP AF
    AND &H7F
    LD H,A
    LD A,B
    RRCA
    LD B,A
    AND &H80
    OR H
    LD H,A
    LD A,B         ; In HL staat het betreffende startadres
    RRCA           ; en de Cy geeft aan of je in de hoogste
    RET            ; 64kB zit.

Met deze informatie ben je nu in staat om  de  startadressen
van de spritetabellen te berekenen, maar ben je nog niet  in
staat om de VDP registers van een andere waarde te voorzien.
Zoals vermeld kan reg. 5 niet zomaar  elke  waarde  krijgen,
maar  de  waardes  die  dit  register  kan  krijgen  kan  je
eenvoudig berekenen met de formule:

VDP(5) = X OR 7

Deze formule is getest op screen  5  t/m  8  en  klopt  daar
altijd. De regel is gewoon dat bit 0 t/m 2 van Reg.5  altijd
1 moeten zijn om sprites op het scherm te kunnen toveren.

Reg.6 mag elke waarde hebben en het  komt  er  praktisch  op
neer dat je in screen 5 en 6 om de 16 lijnen en in screen  7
en 8 om de 8 lijnen een nieuwe patroontabel kunt beginnen.
Vb: Screen 5, VDP(6)=31 ==> Startlijn = 31*16 = 496
                        ==> Page 1, lijn 496 - 256 = 240

Reg.11 kan de waardes 0 t/m 3 bevatten en elke  waarde  komt
overeen met 32kB VRAM. In screen  5  en  6  kan  je  dus  de
ingestelde page lezen door reg.11  te  lezen.  Dit  is  heel
leuk, want nu kan je dus de spritetabellen op page 3  zetten
terwijl je de sprites op page 0 zichtbaar maakt  zonder  dat
die tabellen in de weg zitten.  Opm:  Je  kunt  beter  Reg.2
lezen om er achter te komen welke page  is  ingesteld,  maar
als je vanuit BASIC de schermen instelt dan levert dit  geen
problemen op.

Dit  was  het  voorlopig,  een  volgende  keer  zal  ik   de
feitelijke invulling van de tabellen toelichten.

                                           Alex van der Wal


    

Index

Vorige

Volgende