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 |