MILC logo

IndexVorigeVolgendeLeeg

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

    

Index

Vorige

Volgende