S P R I T E S I N M L 2
S P R I T E S I N D E P R A K T I J K
Hier dan eindelijk het vervolg van de sprite besturingen in
ML. Het eerste deel kunt u vinden op Sunrise Special #2.
Om sprites daadwerkelijk op het beeld te toveren zonder
daarbij het MSX-BIOS te gebruiken is nogal een ingewikkeld
verhaal. In deel 1 hebt u kunnen lezen over de start
adressen voor de sprite data. Om enig inzicht te krijgen in
de VDP waarden, zal ik hier een aantal zaken van ophelderen
met enkele voorbeelden.
S P R I T E M O D E S
Op een MSX2 of hoger zijn er nog meer zaken, wat betreft het
zetten van een sprite, waar rekening mee moet worden
gehouden. Zoals de kleuren en speciale commando bits. Daarom
spreken we van twee sprite modes: MODE 1 (MSX1 en hoger),
MODE 2 (MSX2 en hoger). Dus een MSX2 gebruikt zowel MODE 1
als MODE 2. MODE 2 bestaat uit alle extra MSX2 functies.
Sprite Mode 1: Graphic 1 (screen 1)
Graphic 2 (screen 2)
Multi colour (screen 3)
Max. sprites op 1 horizontale as: 4
Sprite Mode 2: Graphic 3 (screen 4)
Graphic 4 (screen 5)
Graphic 5 (screen 6)
Graphic 6 (screen 7)
Graphic 7 (screen 8)
Max. sprites op 1 horizontale as: 8
I N S T A L L E R E N V A N S P R I T E S
Om sprites op het scherm te toveren, moeten eerst de
volgende register worden beschreven:
Noot: Registers worden afgekord met "r# xx", hiermee worden
de registers aangeduid zoals ze in ML worden gebruikt. Dus
denkt er om MSX2 registers worden in BASIC 1 verhoogd. Dus:
VDP(12)=r#11!)
b7 b6 b5 b4 b3 b2 b1 b0
r# 1 x x x x x x SZ EXP(/MAG) (mode 1)
r# 8 x x x x x x SPD x (mode 1)
SZ: SiZe. Grootte (0:8x8, 1:16x16)
EXP: EXPanded. Vergroting (0:normaal, 1:vergroot)
SPD: SPrite Display. Weergave (0:AAN, 1:UIT)
Voorbeeld:
VDP(1)=VDP(1) and &B11111100 or &B00000010
VDP(8)=VDP(8) or &B00000010
De sprite grootte is hier: 16x16 normaal (r#1). De sprites
worden zichtbaar op het scherm (r#8).
N O G M A A L S D E S P R I T E A D R E S S E N
(zie ook deel 1)
De volgende VDP registers worden hiervoor gebruikt:
b7 b6 b5 b4 b3 b2 b1 b0
r# 5 D14 D13 D12 D11 D10 1 1 1 (mode 1)
r#11 0 0 0 0 0 0 D16 D15 (mode 2)
r# 6 0 0 E16 E15 E14 E13 E12 E11 (mode 1)
D10-D16: VRAM-adres voor spritekleur- en attribute tabellen.
E16-E11: VRAM-adres voor spritepatroon tabel.
N.B. D10-D14: VRAM lijn adres
D15/D16: VRAM page nr.
E11-E14: VRAM lijn adres
E15/E16: VRAM page nr.
Een beschrijving van de registers:
r# 5 en r#11 vormen samen het adres waar de kleur- en
positie tabellen van de sprites. Bits 0-2 moeten altijd hoog
zijn. Bits 3-7 vormen het lijn adres van de kleur tabel.
Adres berekening: start-lijn * 128 or &H07.
De startlijn is altijd in stappen van 8, dus kunnen er
feitelijk maar 32 verschillende waarden worden opgegeven.
Voorbeeld:
Stel we willen de sprite kleur data op Page 1, lijn 200
plaatsten, dan worden r#5 en r#11:
r# 5, &HCF (200 or 7)
r#11, &H01
Hierbij is het kleur tabel adres bekend: 200x128 or 7=&H6400
Het positie tabel adres: kleur tabel adres + &H0200 = &H6600
Standaard zijn deze registers gevuld met de volgende
waardes:
r# 5, &B11101111/&HEF (VRAM adres: &H7400)
r#11, &B00000000/&H00 (VRAM page: 0)
r# 6 bevat het adres waar de patroon tabellen van de
sprites. Bits 0-3 vormen het lijn adres van de patroon
tabel.
Adres berekening: start-lijn * 128 * 16. De startlijn is
altijd in stappen van 16, dus kunnen er maar 16
verschillende waarden worden opgegeven. Bits 4/5 bevatten
het pagina nummer.
Voorbeeld:
Stel we willen de sprite patroon data op Page 2, lijn 32
plaatsen, dan worden r#6:
r# 6, &H22 (32/2 or &H20)
(LSB: adres, MSB: page)
Hierbij is de patroon tabel adres bekend:
32*16+&H8000=&H8200.
De tabel bevindt zich boven de 32 kB (page1) dus moeten we
er &H8000 (=16 kB) bij optellen.
(als r#6>31 dan bovenste 64 kB VRAM.)
Standaard is dit register gevuld met de volgende waarde:
r# 6, &B00001111/&H0F (VRAM adres: &H7800, page: 0)
Het leuke van het kunnen verandereren van de sprite adressen
is dat je zonder alle sprite data hoeft te veranderen, toch
in 1 keer alle sprites kunt veranderen.
P L A A T S E N V A N S P R I T E S
De sprite attribute tabel bevat de weergave waarden van de
sprites. Elke sprite wordt weergeven op 1 van de 32 "sprite
vlakken". De sprite waarden voor elk vlak bestaat uit vier
bytes. Het start adres hiervan wordt gezet door r#5 en r#11
te beschrijven (VRAM adres: r#5/r#11 + &h0200).
De vier bytes bevatten de volgende informatie voor 1 sprite
vlak:
+0 Y-positie De verticale positie van een sprite wordt
verhoogd met 1. Dus de werkelijk waarde die
moet worden geschreven is Y-1. Door deze
waarde op 208 (mode 1) of 216 (mode 2) te
zetten, wordt de sprite niet zichtbaar op
het scherm.
+1 X-positie Horizontale positie. Kan "slechts" 256
waarde bevatten, dus in een hogere resolutie
(bijv. screen 7) zal de sprite altijd een
even waarde krijgen.
+2 Sprite nr. Bevat het sprite patroon, die moet worden
weer gegeven op dit vlak.
+3 Kleur Bevat de kleur van de hele sprite in sprite
Mode 1. Als er in Mode 2 wordt gewerkt, is
deze waarden onbelangrijk. Door het EC bit
(bit 7) hoog te zetten, wordt de sprite 32
pixels naar links geschoven.
Let op! deze waarden zijn bedoeld voor het sprite vlak.
Er zijn 32 vlakken, dus de totale lengte van de attribute
tabel is: 32 * 4 = 128 bytes.
Voorbeeld: (8x8 sprites, niet vergroot, mode 1)
We willen sprite 7 op vlak 11 plaatsen, met als positie
(40,50), en de kleur is 9. Eerst moeten we weten naar welk
attribute-adres we willen schrijven. We gebruiken vlak 11,
dus: 11 * 4 = 44. We weten het start adres al, door r#5/r#11
te lezen. Dit is bijvoorbeeld: &H7600.
Het schrijf adres wordt dan: &H7600 + 44 = &h762C.
Vervolgens beschrijven we de volgende VRAM adressen:
&H762C+0, 50-1 (Y-1)
+1, 40 (X)
+2, 7 (nr)
+3, 9 (kleur)
Door het EC bit te zetten wordt de sprite 32 pixels naar
links verplaatst. Het nut hiervan is dat deze sprite nu ook
pixel voor pixel aan de linker kant van het scherm kan
verdwijnen. Dat deze waarde 32 is, komt omdat een sprite
16x16 vergroot kan wezen. Deze wordt dan immers 32x32 groot.
Ook deze sprite moet pixel voor pixel kunnen verdwijnen.
Om een sprite daadwerkelijk op het scherm te kunnen
plaatsen, moeten er met nog een aantal zaken rekening worden
gehouden. Een van die zaken is de grootte van de sprite
(16x16).
Als er voor 8x8 sprites wordt gekozen, levert dit geen
problemen op. Echter het gebruik van 16x16 sprites is iets
ingewikkelder. Om een 16x16 sprite te plaatsen, worden er
eigenlijk 4 (8x8) sprites geplaatst. Het totaal patroon ziet
er als volgt uit:
X
Y +------++------+
| spr || spr |
| +0 || +2 |
+------++------+
| spr || spr |
| +1 || +3 |
+------++------+
Dus het totaal oppervlak wordt aangevuld met de 3 volgende
sprites.
Voorbeeld: (16x16 sprites, niet vergroot)
sprite patroon 3 moet worden geplaats op (10,20).
De eerste (8x8) sprite wordt dan: 3 * 4 = 12.
de opbouw wordt dan als volgt:
X=10
Y=20 +--------------++--------------+
|spr.12 (10,20)||spr.14 (16,20)|
+--------------++--------------+
|spr.13 (10,36)||spr.15 (16,36)|
+--------------++--------------+
Om een 16x16 sprite te maken kun je dus net zo goed zelf 4
(8x8) sprites plaatsen. Echter, 16x16 sprites hebben een
voordeel dat je maar een keer een X en een Y hoeft op te
geven, want de VDP regelt zelft de andere 3 (8x8) sprites.
Om nu een (16x16) sprite te zetten, moet men er dus rekening
met het volgende houden: Het sprite nummer dat wordt
opgegeven moet uit stappen van 4 bestaan. Dus 0, 4, 8 etc.
Wordt er bijvoorbeeld toch sprite 3 opgegeven, dan wordt dit
sprite patroon 0, en worden 8x8-sprites 0, 1, 2 en 3
geplaatst.
Bij vullen van de attribute tabel moet hier ook rekening mee
worden gehouden. Immers de 3 opvolgende sprite vlakken
worden ook gebruikt. Er zijn nus feitelijk 32/4=8 sprite
vlakken, waardoor er maar 8 sprites kunnen worden vertoond.
Dus om een sprite te zetten, wordt het adres van deze tabel
als volgt berekend:
VRAM adres van r#5/r#11 + vlaknr * 4 * 4.
De laatste vermenigvuldiging met 4 zorgt er voor dat de 3
volgende vlakken worden overgeslagen, deze worden immers
automatisch door de VDP gevuld. Het vergroten van een sprite
(EXP) heeft geen gevolgen voor het berekenen van de
attribute tabellen.
Voorbeeld: (16x16, vergroot (=32x32), mode 1)
We willen een (16x16) sprite op vlak 3 plaatsen. X=132,
Y=40, sprite nr=0, kleur=7. De sprite moet 32 pixels naar
links worden verschoven. r#5/r#11= &H7600
Attribute adres: &h7600 + 3 * 4 * 4 = &H7630.
&h7630+0, 40-1 (Y-1)
+1, 132 (X)
+2, 12 (nr: 3*4)
+3, &H87 (kleur + EC=1)
Wat betreft het plaatsen van een sprite, moet er nu
voldoende voer zijn geleverd. Om het hele sprite verhaal af
te maken, wil ik volgende keer de aandacht richten op de
sprite botsingen (mode 1 �n 2), en de kleurcodes bij sprite
mode 2. Tot een volgende keer!
Roman van der Meulen