Skip to content

Latest commit

 

History

History
274 lines (207 loc) · 13.7 KB

vdp_cursus_3.md

File metadata and controls

274 lines (207 loc) · 13.7 KB
  M S X   2 / 2 +   V D P   C U R S U S   ( 3  )
                                                            
      
      
               D E   C O M M A N D O   R E G I S T E R S 
      
      Zoals beloofd behandelen we deze keer de commando registers. 
      Hiermee  kunt u  de VDP laten kopiâren, lijnen trekken, etc. 
      Nu volgt eerst een overzicht van de commando's, logische be- 
      werkingen en commando registers.
      
      
                           O V E R Z I C H T 
      
      Naam:     Doel:   Bron:   Eenh:   Mnemonic: CM3 CM2 CM1 CM0
      ----------------------------------------------------------- 
      High-     VRAM    CPU     Byte    HMMC       1   1   1   1
      Speed     VRAM    VRAM    Byte    YMMM       1   1   1   0
      Move      VRAM    VRAM    Byte    HMMM       1   1   0   1
                VRAM    VDP     Byte    HMMV       1   1   0   0
      Logical   VRAM    CPU     Dot     LMMC       1   0   1   1
      Move      CPU     VRAM    Dot     LMCM       1   0   1   0
                VRAM    VRAM    Dot     LMMM       1   0   0   1
                VRAM    VDP     Dot     LMMV       1   0   0   0
      Line      VRAM    VDP     Dot     LINE       0   1   1   1
      Search    VRAM    VDP     Dot     SRCH       0   1   1   0
      Pset      VRAM    VDP     Dot     PSET       0   1   0   1
      Point     VDP     VRAM    Dot     POINT      0   1   0   0
      Invalid                                      0   0   1   1
      Invalid                                      0   0   1   0
      Invalid                                      0   0   0   1
      Stop                              STOP       0   0   0   0
      ------------------------------------------------------------ 
      
      Het  commando wordt  uitgevoerd door  de VDP  door de juiste 
      waarde van  CM3-CM0 naar  R#46 te  schrijven. De juiste data 
      moet  echter  eerst  naar R#32-R#45  worden geschreven  (zie 
      verderop).  Bit 0  van S#2  (CE = Command Execute), heeft de 
      waarde 1  als het  commando wordt uitgevoerd, en de waarde 0 
      als  het klaar  is. De werking van deze commando's is alleen 
      gegarandeerd in  de modes  G4-G7 (SCREEN  5 t/m  8, op MSX2+ 
      natuurlijk  ook in  SCREEN 10  t/m 12).  Gebruik STOP om een 
      commando af te breken dat wordt uitgevoerd.
      
      
                  L O G I S C H E   O P E R A T I E S 
      
      Naam:    Werking:                           LO3 LO2 LO1 LO0
      -----------------------------------------------------------
      IMP      DC=SC                               0   0   0   0
      AND      DC=SC*DC                            0   0   0   1
      OR       DC=SC+DC                            0   0   1   0
      EOR      DC=NOT(SC)*DC+SC*NOT(DC)            0   0   1   1
      NOT      DC=NOT(SC)                          0   1   0   0
      TIMP     if SC=0 then DC=DC else IMP         1   0   0   0
      TAND     if SC=0 then DC=DC else AND         1   0   0   1
      TOR      if SC=0 then DC=DC else OR          1   0   1   0
      TEOR     if SC=0 then DC=DC else EOR         1   0   1   1
      TNOT     if SC=0 then DC=DC else NOT         1   1   0   0
      -----------------------------------------------------------
      
      SC = Source Color (bron), DC = Destination Color (doel). EOR 
      is hetzelfde  als XOR  in BASIC. De logische operaties mogen 
      worden  toegepast bij LINE, PSET en LOGICAL MOVE commando's. 
      De  juiste  waarde  van  LO3-LO0 moet  gelijktijdig met  het 
      commando naar R#46 worden geschreven.
      
      
             H E T   C O O R D I N A T E N   S Y S T E E M 
      
      De VDP werkt met een ander coîrdinatensysteem dan MSX-BASIC. 
      Alle pages  worden als  het ware  aan elkaar geplakt tot ÇÇn 
      groot  scherm, waarbij de Y-coîrdinaten gewoon doorlopen. In 
      onderstaand  overzicht  is  te  zien hoe  dat werkt.  In het 
      midden staan de corresponderende adressen in het VRAM.
      
            G4 (SCREEN 5)        Adres:       G5 (SCREEN 6)
      
      -------------------------- 00000H -------------------------- 
      (000,000)        (255,000)        (000,000)        (511,000) 
                Page 0                            Page 0
      (000,255)        (255,255)        (000,255)        (511,255) 
      -------------------------- 08000H -------------------------- 
      (000,256)        (255,256)        (000,256)        (511,256) 
                Page 1                            Page 1
      (000,511)        (255,511)        (000,511)        (511,511) 
      -------------------------- 10000H -------------------------- 
      (000,512)        (255,512)        (000,512)        (511,512) 
                Page 2                            Page 2
      (000,767)        (255,767)        (000,767)        (511,767) 
      -------------------------- 18000H -------------------------- 
      (000,768)        (255,768)        (000,768)        (511,768) 
                Page 3                            Page 3
      (000,1023)      (255,1023)        (000,1023)      (511,1023) 
      -------------------------- 1FFFFH -------------------------- 
      
            G7 (SCREEN 8)                     G6 (SCREEN 7)
      
      -------------------------- 00000H -------------------------- 
      (000,000)        (255,000)        (000,000)        (511,000) 
                Page 0                            Page 0
      (000,255)        (255,255)        (000,255)        (511,255) 
      -------------------------- 10000H -------------------------- 
      (000,256)        (256,256)        (000,256)        (511,256) 
                Page 1                            Page 1
      (000,511)        (255,511)        (000,511)        (511,511) 
      -------------------------- 1FFFFH -------------------------- 
      
      Op het  scherm zijn 212 (of 192) lijnen van dezelfde PAGE te 
      zien. Welke dat zijn kunt u instellen met R#23.
      
      
                               P A G E S 
      
      PAGEs werken  ook anders in ML, er is geen SET PAGE commando 
      of  iets dergelijks.  De PAGE  die wordt  getoond kan worden 
      ingesteld met  R#2. U  kunt daarbij  het volgende tabelletje 
      gebruiken:
      
      Page:    0         1         2         3
      R#2:     &H1F      &H3F      &H5F      &H7F
      
      Bij het schrijven van VRAM in ÇÇn van de pages moet u gewoon 
      het  juiste  adres  instellen, zie  hiervoor deel  2 van  de 
      cursus (de bits in R#14 bepalen daarbij de page).
      
      Bij  kopiâren,  lijnen  trekken,  etc.  is  er  voor de  VDP 
      helemaal  geen sprake  van PAGEs. De coîrdinaten lopen zoals 
      in bovenstaand  overzicht te  zien is gewoon door. Om de VDP 
      iets  in een  bepaalde pagina  te laten doen, moet gewoon de 
      juiste waarde bij de y coîrdinaat worden opgeteld.
      
      Voorbeeld: stel  u wilt een lijn trekken op page 3, van (23, 
      68)  naar (203,176).  Dat wordt dan (23,68+768) en (203,176+ 
      768). Het is dus niet nodig R#2 hiervoor te veranderen.
      
      In de  praktijk gaat  het werken met pages heel gemakkelijk, 
      omdat het gewoon de high byte van de y coîrdinaat is. Bij de 
      standaardmethode  om een  commando naar de VDP te sturen die 
      we nog zullen behandelen wijst zich dat vanzelf.
      
      
                  C O M M A N D O   R E G I S T E R S 
      
      Hieronder  volgt een schematisch overzicht van de registers, 
      zoals we gewend zijn op binair niveau.
      
          MSB  7   6   5   4   3   2   1   0  LSB
      ------------------------------------------------------------ 
      R#32     SX7 SX6 SX5 SX4 SX3 SX2 SX1 SX0    Source X Low
      R#33     0   0   0   0   0   0   0   SX8    Source X High
      R#34     SY7 SY6 SY5 SY4 SY3 SY2 SY1 SY0    Source Y Low
      R#35     0   0   0   0   0   0   SY9 SY8    Source Y High
      
      R#36     DX7 DX6 DX5 DX4 DX3 DX2 DX1 DX0    Dest. X Low
      R#37     0   0   0   0   0   0   0   DX8    Dest. X High
      R#38     DY7 DY6 DY5 DY4 DY3 DY2 DY1 DY0    Dest. Y Low
      R#39     0   0   0   0   0   0   DY9 DY8    Dest. Y High
      
      R#40     NX7 NX6 NX5 NX4 NX3 NX2 NX1 NX0    Nr of dots X Low 
      R#41     0   0   0   0   0   0   0   NX8    Nr of dots X Hgh 
      R#42     NY7 NY6 NY5 NY4 NY3 NY2 NY1 NY0    Nr of dots Y Low 
      R#43     0   0   0   0   0   0   NY9 NY8    Nr of dots Y Hgh 
      
      R#44     CH3 CH2 CH1 CH0 CL3 CL2 CL1 CL0    Color register
      R#45     0   MXC MXD MXS DIY DIX EQ  MAJ    Argument reg.
      R#46     CM3 CM2 CM1 CM0 LO3 LO2 LO1 LO0    Command register 
      ------------------------------------------------------------ 
      
      
      Ik zal nu alle commando's ÇÇn voor ÇÇn gaan bespreken. Omdat 
      dat  veel ruimte  in beslag  neemt, zal  het over twee delen 
      worden verdeeld. Opmerking vooraf: bit 5 van R#45 bepaalt of 
      het VRAM (0) of Expansion RAM (1) wordt gebruikt.
      
      
                                H M M C 
      
                      High Speed Move CPU to VRAM
      
      Dit commando  doet ongeveer  hetzelfde als  COPY <array>  TO 
      (X,Y)  in  Basic.  Het  schrijft  data van  de CPU  naar een 
      rechthoek.  Geef met  DX, DY, NX, NY, DIX en DIY de gewenste 
      rechthoek aan. DIX en DIY werken als volgt:
      
      DIX:   0 = naar rechts vanaf DX, 1 = naar links vanaf DX
      DIY:   0 = naar onder vanaf DY, 1 = naar boven vanaf DY
      
      De data moet steeds naar R#44 worden geschreven. Schrijf bij 
      het geven  van het commando alvast de eerste byte naar R#44. 
      De opbouw van R#44 verschilt per schermmode:
      
      G4, G6 (SC5,7): CR7 CR6 CR5 CR4   CR3 CR2 CR1 CR0
                        linker pixel     rechter pixel
      
      G5     (SC6)  : CR7 CR6   CR5 CR4   CR3 CR2   CR1 CR0
                       links    midlinks  midrechts  rechts
      
      G7     (SC8)  : CR7 CR6 CR5 CR4 CR3 CR2 CR1 CR0
                              ÇÇn pixel
      
      Dit  omdat de data per byte moet worden verzonden, en in G4- 
      G6 meer dan ÇÇn pixel in een byte wordt opgeslagen. Hierdoor 
      worden er ook bits van NX en DX verwaarloosd. In G5 bit 0 en 
      1, in G4 en G6 alleen bit 0.
      
      Als alles  goed is  ingevuld, schrijf je de waarde 11110000B 
      naar  R#46. Vervolgens moet steeds S#2 worden uitgelezen, en 
      gekeken worden of TR of CE gelijk zijn aan 0.
      
          MSB  7   6   5   4   3   2   1   0
      S#2      TR  VR  HR  BD  1   1   EO  CE     Status reg. 2
      
      De  volgende byte  mag naar  R#44 worden  geschreven als  TR 
      gelijk is  aan 1. Het commando is klaar als CE gelijk is aan 
      0.
      
      In schema:
      1) Schrijf de juiste waardes naar R#36-R#45
      2) Schrijf 11110000B naar R#46
      3) Lees S#2
      4) Als CE=0 dan is het klaar
      5) Als TR=0 dan 3
      6) Schrijf volgende byte naar R#44
      7) Ga naar 3
      
      
                                Y M M M 
      
                  High Speed Move VRAM to VRAM, y only
      
      Dit  commando verplaatst  de rechthoek  die wordt aangegeven 
      door DX, SY, NY, DIX en DIY en de rand van het scherm aan de 
      rechterkant (of  linkerkant, als DIX=1) naar eenzelfde blok, 
      echter met Y-coîrdinaat DY. Omdat het met bytes gaat, worden 
      in  G4-G6 weer  dezelfde bits  van de X-coîrdinaten verwaar- 
      loosd als bij HMMC.
      
      Instellen van het YMMM commando:
      R#34 en R#35: y-coîrdinaat van bron
      R#36 en R#37: x-coîrdinaat van bron än doel
      R#38 en R#39: y-coîrdinaat van doel
      R#42 en R#43: lengte van rechthoek in Y-richting
      R#45        : bepaal richting en soort VRAM
      
      Schrijf 11100000B  naar R#46  om het commando uit te voeren, 
      het is klaar als CE gelijk is aan 0.
      
      
                                H M M M 
      
                      High Speed Move VRAM to VRAM
      
      Dit is een van de meest gebruikte commando's. Het verplaatst 
      de  rechthoek die  wordt aangegeven door SX, SY, NX, NY, DIX 
      en DIY  naar het punt DX,DY. Weer worden de laagste bits van 
      de X-coîrdinaten verwaarloosd in G4-G6.
      
      Het commando is te vergelijken met COPY (SX,SY)- STEP(NX,NY) 
      TO  (DX,DY) in  Basic, met  het verschil  dat hierbij  de x- 
      coîrdinaat een  veelvoud van 2 (G4, G6) of 4 (G5) moet zijn. 
      Het is daarom ook sneller.
      
      Instellen van het HMMM commando:
      Schrijf de juiste waardes naar R#32-R#43 en R#45.
      
      Schrijf  11010000B naar  R#46 om het commando uit te voeren, 
      het is klaar als CE gelijk is aan 0.
      
      In  het volgende  deel volgt  de rest van de commando's. Tot 
      dan!
      
                                                      Stefan Boer