VDP cursus (4) Genic Clubguide, 00-00-00 ALWEER HET VIERDE DEEL: M S X 2 / 2 + V D P C U R S U S ( 4 ) ============================================= Het laatste commando dat ik de vorige keer heb behandeld was HMMM. Voordat we verdergaan, eerst nog even een zeer belang- rijke tip. HET UITVOEREN VAN COMMANDO'S VERSNELLEN Er zijn drie methodes om het uitvoeren van de commando's door de VDP te versnellen. 1) Zet de sprites uit Als bit 1 van R#8 gelijk wordt gemaakt aan 1, kan de tijd die normaal voor het weergeven van sprites wordt gebruikt nu gebruikt worden voor het uitvoeren van commando's. Dat gaat daardoor nu sneller. 2) Zet het scherm uit Als bit 6 van R#1 gelijk wordt gemaakt aan 0 kan de tijd die normaal voor het weergeven van het scherm wordt gebruikt nu gebruikt worden voor het uitvoeren van commando's. Dat gaat daardoor nu sneller. U kunt dit bijvoorbeeld gebruiken bij flip-screens (wordt veel bij MSX2 spellen gebruikt, er is geen scrolling maar als je het scherm uitloopt wordt het even zwart, waarna het volgende scherm wordt getoond). Je kunt het scherm namelijk ook zwart maken door PAGE 1 zwart te maken en die te tonen. De schermopbouw gaat echter sneller als u bit 6 van R#1 gebruikt. 3) Koop een Panasonic FS-A1ST MSX turbo R Omdat uw MSX2 of MSX2+ maar op 3.58 MHz werkt, remt dat de VDP af. De V9958 van de MSX2+ (die ook in de turbo R zit) heeft zelfs een kloksnelheid van 21.48 MHz!!! Bij de turbo R gaat de uitvoering van de commando's sneller, terwijl het toch dezelfde videoprocessor is! Ik ga nu verder met het overzicht van alle commando's. HMMV: High-speed move VDP to VRAM Dit commando vult een bepaalde rechthoek met een bepaalde kleur. Het doet dus hetzelfde als LINE,BF in Basic. High speed betekent geen logische bewerking en transport per byte. De uitvoering is daarom veel sneller. Het nadeel van transport per byte is dat in SCREEN 5 en 7 (G4 en G6) de X co”rdinaat een veelvoud moet zijn van 2, en in SCREEN 6 (G5), de X co”rdinaat een meervoud moet zijn van 4. (Het onderste bit of de onderste twee bits gaan dus verloren.) De volgende registers hebben betekenis bij HMMW: NX: grootte van rechthoek in X richting R#40, R#41 NY: grootte van rechthoek in Y richting R#42, R#43 DX: X co”rdinaat R#36, R#37 DY: Y co”rdinaat R#38, R#39 DIX, DIY: richting R#45 CLR: kleur R#44 Nadat bovenstaande data naar de juiste registers is geschreven kan het commando worden uitgevoerd door de waarde &B11000000 naar R#46 te schrijven. CE geeft aan of de VDP al klaar is (=0) of niet (=1). Let op: R#44 bevat niet het kleurnummer, maar de byte die geschreven moet worden. Bij SCREEN 5, 6 en 7 kun je dus verticale strepen maken. Zie voor de opbouw van de byte het commando HMMC op de vorige ClubGuide. LMMC: Logical move CPU to VRAM Dit commando verplaatst data van de microprocessor naar het VRAM naar een bepaalde rechthoek. De data wordt per pixel verstuurd, er kunnen dus logische bewerkingen worden toegepast. De volgende registers moeten eerst met de juiste waarden worden gevuld: R#36, R#37: DX X co”rdinaat bestemming R#38, R#39: DY Y co”rdinaat bestemming R#40, R#41: NX grootte in X-richting R#42, R#43: NY grootte in Y-richting R#44 : data de juiste data R#45 : DIX, DIY de juiste richting Daarna kunt u het commando laten uitvoeren door &B1011---- naar R#46 te schrijven. Op de plaats van ---- kunt u de code van de gewenste logische operatie schrijven. De data wordt nu per pixel verzonden. Dat gaat als volgt: MSB 7 6 5 4 3 2 1 0 LSB R#44 - - - - C3 C2 C1 C0 G4 en G6 R#44 - - - - - - C1 C0 G5 R#44 C7 C6 C5 C4 C3 C2 C1 C0 G7 en hoger Dit commando is de langzamere versie van HMMC. Er kunnen nu echter wel logische bewerkingen worden gebruikt. Ook is elke X co”rdinaat mogelijk. Ik geef ook weer het werkschema: 1 Stel de commando registers in 2 Schrijf &B1011---- naar R#46 (logische bewerking op ----) 3 Lees S#2 4 Als CE gelijk is aan 0, dan is het klaar 5 Als TR gelijk is aan 0, dan is het verzenden nog niet klaar, ga terug naar 3 6 Anders kan nu de data naar R#44 worden geschreven 7 Ga verder bij 3 LMCM: Logical move VRAM to CPU Dit commando verplaatst data van een bepaalde rechthoek per pixel naar de CPU. Het is onzin hierbij een logische bewerking te gebruiken. De volgende registers moeten worden ingevuld: R#32, R#33: SX Bron X co”rdinaat R#34, R#35: SY Bron Y co”rdinaat R#40, R#41: NX Grootte van rechthoek in X richting R#42, R#43: NY Grootte van rechthoek in Y richting R#45 : DIY, DIX Richting Het commando wordt uitgevoerd door de waarde &B10100000 naar R#46 te schrijven. De data kan dan uit S#7 worden gelezen. Denk er daarbij om dat de data verschilt per screenmode. Het overzicht is hetzelfde als de data die bij het vorige commando naar CLR moest worden geschreven. Ik geef u voor de duidelijkheid wederom een werkschema: 1 Lees S#7 2 Schrijf de juiste waardes naar de commando registers 3 Schrijf &B10100000 naar R#46 4 Lees S#2 5 Als TR=0 dan transport nog niet klaar, ga naar 6 Lees S#7 en doe met de waarde wat u wilt 7 Als CE gelijk is aan 0 is het commando klaar 8 Ga anders naar 4 Let op: TR moet op 0 worden gezet voordat het commando wordt uitgevoerd. Daarom moeten eerst S#7 worden gelezen. Ook al is de data naar S#7 geschreven en TR=1, zal daarna toch het commando worden afgemaakt en zal CE gelijk worden gemaakt aan 0. LMMM: Logical move VRAM to VRAM Het LMMM commando verplaatst de data van het aangegeven rechthoekige stuk naar een ander rechthoekig stuk. Omdat dit gaat in eenheden van pixels, kunt u logische operaties gebruiken. De volgende registers moeten eerst van de juiste waarde worden voorzien: R#32, R#33: SX Bron X co”rdinaat R#34, R#35: SY Bron Y co”rdinaat R#36, R#37: DX Doel X co”rdinaat R#38, R#39: DY Doel Y co”rdinaat R#40, R#41: NX Grootte X richting R#42, R#43: NY Grootte Y richting R#45 : DIX, DIY Richting Schrijf &B1001---- naar R#46 om het commando uit te voeren. U kunt op de streepjes de gewenste logische bewerking invullen. Dit commando wordt door MSX Basic 2.0 en hoger gebruikt voor COPY (SX,SY)-STEP(NX,NY) TO (DX,DY),,<logische bewerking>. LMMV: Logical move VDP to VRAM Dit commando doet hetzelfde als HMMV, met het verschil dat er nu wel logische bewerkingen kunnen worden toegepast en dat het transport nu met pixels in plaats van bytes gebeurt. De X co”rdinaat kan dus elke waarde hebben. Het gaat daarom ook langzamer. Dit commando wordt in MSX Basic 2.0 en hoger gebruikt voor LINE(DX,DY)-STEP(NX,NY),CLR,BF,<logische bewerking>. Voor de werking verwijs ik dus naar HMMV, er moet nu echter &B1000---- naar R#46 worden geschreven, en op de laagste vier bits de logische bewerking. Van de X co”rdinaat worden alle bits behouden. LINE Het LINE commando trekt een lijn. (Overbodige mededeling.) Die lijn die wordt getekend is de schuine lijn van een rechthoekige driehoek. (Dat is een driehoek waarvan twee zijden loodrecht op elkaar staan.) De twee rechthoekszijden worden aangegeven als afstanden vanaf ‚‚n punt. (Dat is het punt waarde rechte hoek zit.) De volgende registers moet u beschrijven met de juiste waardes: R#36, R#37: DX X co”rdinaat R#38, R#39: DY Y co”rdinaat R#40, R#41: MJ grootte van de langste zijde (NX) R#42, R#43: MI grootte van de kortste zijde (NY) R#45 : DIX richting van de rechthoekszijden vanaf het punt (DX,DY) 0: rechts 1: links : DIY 0: omlaag 1: omhoog : MAJ 0: lange zijde is X 1: lange zijde is Y R#44 : C Kleur (G4,G6 0-15; G5 0-3; G7 0-255) Schrijf &B0111---- naar R#46 om de lijn te trekken. Op de streepjes kunt u een eventuele logische bewerking invullen. Dit is erg ingewikkeld. Zoals al eerder aangekondigd zullen op komende ClubGuides vele toepassingen van het geleerde geplaatst worden, voorzien van zeer uitgebreide uitleg. Daar zal ook zeker een lijn bijzitten. Voor de duidelijkheid geef ik u nu nog hoe het er in Basic uit zou zien: LINE (DX+MAJ,DY)-(DX,DY-MIN),C,,<logische operatie>. Hierbij zijn DIX, DIY en MAJ gelijk aan 0. Zoals gewoonlijk is CE van S#2 gelijk aan 1 als het commando wordt uitgevoerd. SRCH Het SRCH commando zoekt (search = zoeken) naar een pixel met een bepaalde kleur naar de linker- of rechterkant van een bepaald startpunt. Dit commando wordt bijvoorbeeld gebruikt bij het PAINT commando. De volgende registers worden door SRCH gebruikt: R#32, R#33: SX X co”rdinaat startpunt R#34, R#35: SY Y co”rdinaat startpunt R#44 C te zoeken kleur R#45 : DIX Geeft zoekrichting aan (0 = rechts) : EQ Geeft aan wanneer de VDP moet stoppen met zoeken. 1 = stop als een pixel met de juiste kleur is gevonden, 0 = stop als een pixel met een andere kleur is gevonden. Schrijf de waarde &B01100000 naar R#46 om het commando te starten. De statusregisters worden als volgt be‹nvloedt: S#2 : BD Bit 4 wordt 1 als kleur gevonden : CE Bit 0 wordt 0 als commando klaar S#8 : BX X co”rdinaat van plaats waar gevonden S#9 : BX Bit 0 bevat bit 8 van X co”rdinaat Overige bits bevatten de waarde 1 Werkschema: 1) Schrijf de juiste waardes naar de commandoregisters 2) Schrijf &B01100000 naar R#46 3) Lees S#2 4) Als CE=1 dan naar 3, commando nog niet klaar 5) Als BD=0 dan klaar, kleur niet gevonden 6) Lees S#8 en S#9 7) Klaar PSET Het PSET commando doet hetzelfde als PSET(X,Y),C,<logische operatie> in Basic. Het zet een pixel in de kleur C op positie (X,Y), daarbij wordt eventueel de logische bewerking uitgevoerd met de pixel die er al stond. De co”rdinaten moeten in DX en DY staan, R#36-R#39. De kleur kunt u in R#44 zetten. De volgende kleurnummers zijn mogelijk: Mode: Kleurbereik: ------------------------------- SCREEN 5, G4 0-15 SCREEN 6, G5 0-3 SCREEN 7, G6 0-15 SCREEN 8, G7 0-255 Schrijf de waarde &B0101---- naar R#46 om het PSET commando uit te voeren. Op ---- kunt u eventueel een logische operatie invullen. POINT Dit commando doet het tegenovergestelde van PSET. Het leest namelijk de kleur van een bepaald pixel. In Basic hebben we daarvoor het commando POINT(X,Y). De co”rdinaten moeten nu in SX en SY staan, R#32-R#35. De kleur komt in S#7 te staan. Daarbij zijn dezelfde kleur- nummers mogelijk als bij PSET. Schrijf de waarde &B01000000 naar R#46 om het POINT commando uit te voeren. Het CE bit van S#2 zal tijdens het uitvoeren van het commando de waarde 1 krijgen. Als het klaar is wordt CE weer op 0 gezet. COMMANDO REGISTERS NA EEN COMMANDO Dit was het einde van het overzicht van alle commando's. Tot slot nog een overzicht van de be‹nvloeding van de commando registers door de verschillende commando's. Het is namelijk niet nodig om alle registers steeds opnieuw in te vullen. Sommigen behouden hun waarde. U kunt in de tabel zien welke dat zijn. Uitleg bij de tabel: - Onveranderd * Co”rdinaat aan het einde van commando (of kleurcode) # De waarde die het register had toen het einde van het scherm werd bereikt SX DY DX DY NX NY CLR CMRH CMRL ARG ------------------------------------------------------------ HMMC - - - * - # - 0 - - YMMM - * - * - # - 0 - - HMMM - * - * - # - 0 - - HMMV - - - * - # - 0 - - LMMC - - - * - # - 0 - - LMCM - * - - - # * 0 - - LMMM - * - * - # - 0 - - LMMV - - - * - # - 0 - - LINE - - - * - - - 0 - - SRCH - - - - - - - 0 - - PSET - - - - - - - 0 - - POINT - - - - - - * 0 - - ------------------------------------------------------------ N.B. De eindwaardes van SY, DY en NY (SY*, DY* en NYB) moeten als volgt worden omgerekend: (DIY = 0) SY* = SY + N DY* = DY + N (DIY = 1) SY* = SY - N DY* = DY - N NYB = NY - N Bij het LINE commando moet u nog 1 van N aftrekken als MAJ gelijk is aan 0. TOT SLOT U kunt nu alle VDP commando's zelf toepassen. De volgende keer zijn de statusregisters aan de beurt. Nadat ook de sprites en de opslag van de scherminhoud behandeld zijn zullen we een aantal zeer leuke toepassingen doornemen. Veel succes en tot de volgende keer! Stefan Boer |