
|
VDP cursus (5) Genic Clubguide, 00-00-00
ALLES OVER UW VIDEOCHIP:
M S X 2 / 2 + V D P C U R S U S ( 5 )
=============================================
In dit vijfde deel worden de statusregisters behandeld. De
naam zegt het al, deze registers geven informatie over de
status van de Video Display Processor. Uiteraard kunnen
statusregisters alleen gelezen worden en niet beschreven.
Het lezen van een statusregister is in deel 1 (ClubGuide #7)
behandeld, daar kunt u dat nog eens nalezen.
OVERZICHT STATUSREGISTERS
MSB 7 6 5 4 3 2 1 0 LSB
S#0 F 5S C ---vijfde sprite--- Status #0
F: Vertical scanning interrupt flag
Wordt geset als de VDP bovenaan het scherm begint
met de beeldopbouw. F wordt gereset als S#0 wordt
gelezen. Dit is de normale interrupt, die altijd
naar de hook &HFD9F springt.
5S: Flag voor de vijfde/negende sprite
Deze vlag geeft aan dat er meer sprites op een hori-
zontale lijn voorkomen dan de VDP kan weergeven. In
G3 (SCREEN 4) en hoger zijn dat er acht, in de ande-
re schermen vier.
C: Collision flag
Wordt gezet als twee sprites elkaar raken.
vijfde
sprite: Bevat het nummer van de vijfde of negende sprite.
MSB 7 6 5 4 3 2 1 0 LSB
S#1 FL LPS -Identification #- FH Status #1
FL: Lightpen flag (Lightpen flag is geset, LP bit 6 R#8)
Als de lichtpen licht waarneemt moeten zowel dit bit
als IE2 (bit 5 van R#0) geset zijn om een interrupt
te veroorzaken. FL wordt gereset als S#1 wordt
gelezen.
Mouse Switch 2 (Mouse flag is geset, MS bit 7 R#8)
De 2e vuurknop van de muis is ingedrukt. FL wordt
niet gereset als S#1 wordt gelezen.
LPS: Lightpen switch (Lightpen flag is geset)
De vuurknop van de lichtpen is ingedrukt. LPS wordt
niet gereset als S#1 wordt gelezen.
Mouse switch 1 (Mouse flag set)
De 1e vuurknop van de muis is ingedrukt. LPS wordt
niet gereset als S#1 wordt gelezen.
Identification number:
Het ID# van de VDP. Hieraan kun je zien of het V9938
of V9958 is (bit 2 van S#1 is geset als V9958).
FH: Horizontal scanning interrupt flag
FH wordt geset als een zgn. line-interrupt optreedt,
dus als de VDP begint met het weergeven van de lijn
die in R#19 staat. De interrupt is mogelijk als IE1
(bit 4 van R#0) is geset. FH wordt gereset als S#1
wordt gelezen.
Let op: de lichtpen- en muisuitlezing wordt bij de V9958
niet meer door de VDP gedaan. De bits FL en LPS hebben dus
hun betekenis verloren.
MSB 7 6 5 4 3 2 1 0 LSB
S#2 TR VR HR BD 1 1 EO CE Status #2
TR: Transfer ready flag
Als de CPU (microprocessor) data naar de VDP stuurt,
moet er gewacht worden tot dit bit geset is. Dan mag
de data verstuurd worden.
VR: Vertical scanning line timing flag
Tijdens verticaal scannen is deze flag geset.
HR: Horizontal scanning line timing flag
Tijdens horizontaal scannen is deze flag geset.
BD: Boundary color detect flag
Bij het Search commando (zie VDP cursus deel 4)
geeft deze flag aan of de randkleur is gevonden of
niet.
EO: Display field flag
Geeft bij het afwisselend weergeven van pagina's aan
welke pagina er wordt weergegeven.
CE: Command execute flag
Geeft aan dat een commando wordt uitgevoerd. Wacht
tot dit bit gereset is voordat het volgende commando
naar de VDP wordt gestuurd. Zie VDP cursus deel 3 en
4.
MSB 7 6 5 4 3 2 1 0 LSB
S#3 X7 X6 X5 X4 X3 X2 X1 X0 Column low
S#4 1 1 1 1 1 1 1 X8 Column high
S#5 Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 Row low
S#6 1 1 1 1 1 1 Y9 Y8 Row high
Bovenstaande registers worden gebruikt voor het aangeven van
de de plaats van de spritebotsing, de plaats van de lichtpen
of de relatieve beweging van de muis.
MSB 7 6 5 4 3 2 1 0 LSB
S#7 C7 C6 C5 C4 C3 C2 C1 C0 Color reg
Dit register wordt gebruikt bij de POINT en VRAM to CPU
commando's. De VRAM data staat in dit register. (Zie VDP
cursus deel 4).
MSB 7 6 5 4 3 2 1 0 LSB
S#8 BX7 BX6 BX5 BX4 BX3 BX2 BX1 BX0 Border X low
S#9 1 1 1 1 1 1 1 BX8 Border X hig
De X co”rdinaat die wordt gevonden bij het Search commando
wordt in deze registers gezet. (Zie VDP cursus deel 4).
Nu we de theorie hebben behandeld komen er nog een aantal
toepassingen aan bod.
SPRITE BOTSING
Bij een spritebotsing wordt C (bit 5 van S#0) geset. Als
zowel MS als LP (bit 7 en 6 van R#8) zijn gereset, dan
zullen de co”rdinaten van de botsing naar S#3 t/m S#6 worden
geschreven. Let op: bij het lezen van S#5 wordt de inhoudt
van S#3 t/m S#6 gereset.
De X die in S#4 en S#3 staat is 12 meer dan de X van de
botsing, de Y die in S#5 en S#6 staat is 8 meer dan de
botsing. Oftewel:
XS#3S#4 = XBOTSING + 12
YS#5S#6 = YBOTSING + 8
PERFECTE SCREENSPLIT
Op ClubGuide #7 stond een artikel van Cas Cremers waarin hij
u uitlegde hoe u een zgn. screensplit kunt maken. Hij
schreef in dat artikel dat u de screensplit perfect kunt
maken door iets met de statusregisters te doen.
We gebruiken hiervoor HR. Aan deze flag kunt u zien of de
VDP begint met het weergeven van een nieuwe lijn. Op die
manier kun je een screensplit krijgen die precies bij een
bepaalde lijn begint. In MT ziet dat er als volgt uit:
LD A,2 ; Status register #2
OUT (&H99),A ; Data naar Port #1
LD A,15+128 ; Register #15
OUT (&H99),A ; Register # naar Port #1
LUS: IN A,(&H99) ; Lees Port #1 (inhoud S#2)
BIT 5,A ; Bekijk HR
JP Z,LUS ; Wacht tot HR geset is
Voer na deze routine zo snel mogelijk de nodige akties uit,
en de screensplit is perfect.
LET OP!
Het is erg belangrijk dat u na het lezen van een
statusregister altijd de waarde van register 15 weer gelijk
maakt aan 0, anders zal de computer vastlopen. Uw MSX leest
namelijk voortdurend S#0, om te kijken of er een interrupt
is opgetreden. Er wordt echter niet eerst de waarde 0 naar
R#15 geschreven, dus dat moet de programmeur zelf doen. Dit
hoeft natuurlijk niet als u een BIOS routine gebruikt.
Een korte aflevering dit keer. Qua theorie komen alleen
de sprites en de beeldschermopslag nog aan bod, daarna gaan
we verder met de toepassingen. De volgende keer neem ik u
mee naar de wereld van de sprites.
Stefan Boer
|