*** De MSX2 ViDeo-Processor *** ----------------------------------------------------------------------------- Hier zullen de meeste registers genoemd worden met hun functie, het is aan te bevelen om al enige kennis (Basic in ieder geval) hiervan te hebben, deze tekst is meer bedoeld voor het snel opzoeken van 'hoe was tie ook alweer'. Allereerst alle registers op een rijtje, met basic en de video nummers, want de basic interpreter gebruikt andere waardes voor de vdp registers. BASIC VDP() reg 7 6 5 4 3 2 1 0 ------------------------------------------------------ 0 0 0 DG IE0 IE1 M5 M4 M3 D 1 1 0 BLK IE2 M1 M2 0 SZ MAG 9 8 MSE LCS TP CBD VRS1 VRS0 SPD B/W 10 9 LN 0 SYM1 SYM0 IL E/O NTSC DCD Betekenis: ----------- DG - Digitize 0=Normaal, 1=Digitaliseer mode IE0 - Vertical Retrace Interrupt Enable IE1 - Horizontal Retrace Interrupt Enable IE2 - Light pen/mouse Interrupt Enable M5/1 - M5 M4 M3 M2 M1 Screen 0 0 0 0 0 1 0 0 0 0 1 0 ( 40 koloms) 0 0 0 1 0 3 0 0 1 0 0 2 0 1 0 0 0 4 0 1 0 0 1 0 ( 80 koloms) 0 1 1 0 0 5 1 0 0 0 0 6 1 0 1 0 0 7 1 1 1 0 0 8 Screen 10,11 en 12 zijn verbouwde screen 8. D - External VDP-input BLK - Enable/Disable Display Het scherm aan of uit zetten SZ - Sprite Size 0=8*8 Sprites, 1=16*16 Sprites MAG - Magnify Sprites 0=Normaal, 1=2* zo groot MSE - Light pen/mous (1=mouse) LCS - Light pen/coincidence select (1=light pen) TP - Transparant mode 0=Kleur 0 is transparant, 1=Kleur 0 niet transparant CBD - Color Bus Direction 0=Output(normaal), 1=Input(Digitaliseren) VRS1/0 - Video RAM Select VRS1 VRS0 KB 0 0 1*16 0 1 4*16 1 0 1*64 1 1 64 High speed SPD - Sprite Disable (Sprites: 0=normaal, 1=geen sprites op scherm) SYM1/0 - Synchronisation mode (Voor digitaliseren en mixen) SYM1 SYM0 mode 0 0 Intern 0 1 Mix 1 0 Extern (Digitize) 1 1 none IL - Interlace mode (uitleg over interlace volgt later) E/O - Even/Odd Display NTSC - TV mode select(0=NTSC (Japan), 1=PAL (Europa)) De interne interrupt is in europa 50 Hz, door NTSC nul te maken, wordt het beeldscherm 60 * per seconde naar het beeldscherm gestuurd, ook zal de muziek anders gaan klinken (PLAY). De z80 processor wordt niet sneller, zoals onterecht een keer is geschreven in een blad! DCD - Dot Clock Direction BASIC VDP() reg 7 6 5 4 3 2 1 0 ---------------------------------------------------------- 2 2 0 A16 A15 A14 A13 A12 A11 A10 3 3 B13 B12 B11 B10 B9 B8 B7 B6 11 10 0 0 0 0 0 B16 B15 B14 4 4 0 0 C16 C15 C14 C13 C12 C11 5 5 D14 D13 D12 D11 D10 D9 D8 D7 12 11 0 0 0 0 0 0 D16 D15 6 6 0 0 E16 E15 E14 E13 E12 E11 15 14 0 0 0 0 0 F16 F15 F14 Betekenis: A16/A10 - Scherminfo Tabel B16/B6 - Kleur Tabel C16/C11 - Matrix Tabel D16/D7 - Spriteinfo Tabel E16/E11 - Sprite patroon Tabel F16/F14 - Video RAM access Scherm info: Kan alleen in pagina's van een Kbyte schakelen, en bevat het adres waarvandaan de data van het scherm staat. (screen 0 : #00000) In screen 5 tot 8 kan hiermee de pagina geschakeld worden en wordt dan ook in basic door SET PAGE gebruikt. In screen 2 tot 4 staan hier getallen die niet verandert worden, deze getallen geven aan welke plaats op het scherm bij een karakter hoort, screen 2 en 4 bevatten derhalve 3 maal 0 tot 255. Kleur tabel wordt door de schermen 1 tot 4 gebruikt: Screen 1: kleurcode voor 8 karakters, de tabel is dus 32 bytes lang. Screen 2 en 4: Hier wordt per rij van 8 pixels de kleur bijgehouden. In de scherm matrix tabel staat per acht bits aangegeven of die pixels aan of uit staan. Bits 3 tot 0 bepalen de kleur van een '0' bit uit de scherminfo tabel. Terwijl 7 tot 4e '1' bepalen. Screen 3: Iedere Byte bevat de kleuren van twee pixels. Matrix tabel wordt in screen 0 tot 4: Hier worden de patronen opgebouwd, deze patronen worden door de namen tabel getoond. Screen 0: 2048 bytes groot, bevat alle karakters. De processor zoekt bij het opbouwen van het scherm uit de namen tabel welk karakter er getoond moet worden, en uit de patroon tabel hoe dat karakter er uit moet zien. Screen 1: dezelfde manier, behalve dan dat uit de kleur tabel ook nog de kleur van dat karakter opgezocht wordt. Screen 2 tot 4: In de namentabel wordt aangewezen welk 'karakter' er getoond wordt, en in deze matrix wordt aangegeven of die pixels aan of uit staan. Sprite info: Bevat y-as, x-as en het nummer van de geprojecteerde sprite. Deze tabel bevat waardes voor 32 sprites, die sprites kunnen de nummers 0 tot 255 hebben, en dus bij 16*16 sprites ook andere delen van het VRAM bestrijken dan de sprite patroon tabel. Bij de MSX2 wordt het 4de byte niet gebruikt, in MSX1 bevatte dit de kleur van de sprite. Opbouw tabel: byte 1: Y-as sprite byte 2: X-as sprite byte 3: sprite nummer (verwijst naar sprite patroon tabel) byte 4: Ongebruikt Voor de MSX2 geld dat alle horizontale sprite lijnen een andere kleur kunnen hebben. Deze tabel staat 512 bytes onder de sprite info tabel en voor iedere sprite zijn hier 16 bytes gereserveerd. Opbouw: bit 0 tot 3: kleurcode horizontale lijn. bit 5: geSET betekend dat een sprite botsing niet gedetecteerd wordt. bit 6: geSET betekend dat deze lijn niet getoond wordt; voor deze lijn nooit botsingdetectie. Als deze lijn van de sprite een lijn van een andere sprite met een hogere prioriteit (eerder in de sprite info tabel staat) passeert met dit bit op nul en als de lijnen van de sprites op dezelfde horizontaal liggen, dan wordt de lijn van deze sprite toch geprojecteerd. Bij overlap wordt op de spritelijnen echter ook nog een logische OR toegepast. bit 7: geSET betekend dat de sprite lijn 32 beeldpunten naar links geprojecteerd wordt. Sprite patroon tabel: Bij 8*8 sprites zijn hier 8 bytes en bij 16*16 sprites zijn hier 32 bytes gereserveerd. BASIC VDP() reg 7 6 5 4 3 2 1 0 ---------------------------------------------------------- 7 7 TC3 TC2 TC1 TC0 BDC3 BDC2 BDC1 BDC0 13 12 C3 C2 C1 C0 BC3 BC2 BC1 BC0 14 13 ON3 ON2 ON1 ON0 OF3 OF2 OF1 OF0 Betekenis: TC3/0 - Text Color BCD3/0 - Back Drop Color C3/0 - Color BC3/0 - Back Color ON3/0 - Blink On (1/5 seconde) OF3/0 - Blink Off(1/5 seconde) register 7 bevat in elk ander scherm dan 0 de rand (border) kleur, Screen 8 gebruikt voor zijn 256 kleuren alle bits. Screen 1-5 en 7 gebruiken allen bit 3 tot 0 Screen 6 gebruikt BDC3 en BDC2 voor de kleur van alle verticale even lijnen, terwijl BDC1 en BDC0 gebruikt worden voor alle verticale oneven lijnen, dit geeft een 16 kleuren effect. In screen 0 kan tekst met deze registers geinventeerd worden of een andere kleur krijgen. Dan bevat TC3 tot TC0 de voorgrond kleur van de geinventeerde tekst en BDC3 tot BDC0 de achtergrond kleur. Dit is de reden dat het tekstscherm geen andere border kleur dan de voorgrond kleur kan krijgen. Met register 13 kan daarna de tijd ingesteld worden dat het getoond moet worden. ON3 tot ON0 voor aan en OF3 tot OF0 voor uit. Dit kan ook voor interlacing gebruikt worden, ON wordt gebruikt voor de even pagina en OF voor de oneven pagina. C3/0 en BC3/0 bevatten de voorgrond en de achtergrond kleur in screen 0. BASIC VDP() reg 7 6 5 4 3 2 1 0 ---------------------------------------------------------- 16 15 0 0 0 0 RS3 RS2 RS1 RS0 17 16 0 0 0 0 C3 C2 C1 C0 18 17 S/I 0 RC5 RC4 RC3 RC2 RC1 RC0 19 18 dV3 dV2 dV1 dV0 dH3 dH2 dH1 dH0 20 19 IL7 IL6 IL5 IL4 IL3 IL2 IL1 IL0 21 20 0 0 CBX5 CBX4 CBX3 CBX2 CBX1 CBX0 22 21 0 0 CBY5 CBY4 CBY3 CBY2 CBY1 CBY0 23 22 0 0 CBZ5 CBZ4 CBZ3 CBZ2 CBZ1 CBZ0 24 23 LS7 LS6 LS5 LS4 LS3 LS2 LS1 LS0 Betekenis: RS3/0 - Register nummer van Statusregister C3/0 - Color code S/I - 0=Automatisch ophogen van RC5/0, 1=Niet ophogen RC5/0 - Register nummer van Controlregister Hier kan een register nummer worden opgeslagen: Met indirecte toegangs poort (#0007)+3 kan er naar het register geschreven worden dat RC5/0 aanwijst, als er geschreven is wordt aan de hand van S/I wel of niet opgehoogd Dit is handig om achter elkaar een aantal registers van waarde te veranderen. dV3/0 - delta Vertical adjust dH3/0 - delta Horizontal adjust IL7/0 - vertical line number of Line Interrupt CBX5/0 - Color Burst value of phase 0 CBY5/0 - Color Burst value of phase 1/3 CBZ5/0 - Color Burst valeu of phase 2/3 LS7/0 - horizontal line start Video RAM Toekennen van kleuren palet: Eerst register 16 (C3 tot C0) met kleurcode vullen. Daarna verzenden van twee Bytes naar de pallette schrijfpoort nl: bit 7 6 5 4 3 2 1 0 --------------------------------------------------------- Byte 1 0 R2 R1 R0 0 B2 B1 B0 Byte 2 0 0 0 0 0 G2 G1 G0 Deze kleurcodes worden door de computer ergens apart in het VRAM opgeslagen, dat doet de VDP niet zelf, daarom hebben de BIOS routines in het EXTROM de voorkeur: GETPLT (#0149) om kleur code op te halen en SETPLT (#014D) om een kleur te zetten. In screen 8 geldt de volgende formule: 32*G+4*R+B waarbij G en R tussen de 0 en de 7 liggen en B tussen de 0 en de 3. Adjust: dV3/0 en dH3/0 zijn als volgt opgebouwd: Het 4e bit is geSET als het getal positief is. Het registers kan 2* de waardes -7 tot 8 bevatten en wordt opgeslagen in het two complement. Dus -7 wordt 0111 en 8 wordt 1000. Smooth scroll: In register 24 staat voor screen 5 tot 8 de eerste Y-as die afgebeeld moet worden. In screen 0 wordt hiermee het eerste byte aangegeven die voor het vormen van de karakters gebruikt wordt, dit houd in dat een karakter rold als je het register de waarde 0 tot 7 geeft. Statusregisters: BASIC VDP() reg 7 6 5 4 3 2 1 0 ------------------------------------------------------ 8 0 F SD C S4 S3 S2 S1 S0 (Dit register staat in -1 1 FL LPS I4 I3 I2 I1 I0 FH het AF register bij de -2 2 TR VR HR BD 0 0 E/O CE interrupt routine) -3 3 X7 X6 X5 X4 X3 X2 X1 X0 -4 4 0 0 0 0 0 0 X9 X8 -5 5 Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 -6 6 0 0 0 0 0 0 Y9 Y8 -7 7 C7 C6 C5 C4 C3 C2 C1 C0 -8 8 BX7 BX6 BX5 BX4 BX3 BX2 BX1 BX0 -9 9 0 0 0 0 0 0 BX9 BX8 Betekenis: F - Vertical Retrace Interrupt Bij een interrupt wordt hier gekeken of het van de VDP kwam (0=Nee, 1=Ja) zoniet dan wordt naar de NMI-routine gesprongen SD - Vijfde cq. negende sprite gedetecteerd (1=teveel sprites) C - Botsing tussen sprites gedetecteerd (1=botsing) S4/0 - Nummer van de vijfde cq. negende sprite FL - Muis of lichtpen schakelaar status LPS - Tweede muis of lichtpen schakelaar status I4/0 - Videochip LSI-nummer (Identicatie 1-V9938 2-V9958) FH - Horizontal Retrace Interrupt TR - Transfer met CPU data ready VR - Vertical Retrace timing HR - Horizontal Retrace timing BD - Border Detected E/O - Even or Odd field status (0=even, 1=oneven pagina afgebeeld) CE - Command Executing status (0=klaar) X9/0 - X-coordinaat spritebotsing, muis of lichtpen Y9/0 - Y-coordinaat spritebotsing, muis of lichtpen C7/0 - Kleurencode gelezen kleurregister BX9/0 - Border X-coordinaat van spritebotsing Het programmeren van de VDP: De registers: BASIC VDP() reg 7 6 5 4 3 2 1 0 ------------------------------------------------------------------------- 32 33 SX7 SX6 SX5 SX4 SX3 SX2 SX1 SX0 33 34 0 0 0 0 0 0 0 SX8 34 35 SY7 SY6 SY5 SY4 SY3 SY2 SY1 SY0 35 36 0 0 0 0 0 0 SY9 SY8 36 37 DX7 DX6 DX5 DX4 DX3 DX2 DX1 DX0 37 38 0 0 0 0 0 0 0 DX8 38 39 DY7 DY6 DY5 DY4 DY3 DY2 DY1 DY0 39 40 0 0 0 0 0 0 DY9 DY8 40 41 NX7 NX6 NX5 NX4 NX3 NX2 NX1 NX0 41 42 0 0 0 0 0 0 NX9 NX8 42 43 NY7 NY6 NY5 NY4 NY3 NY2 NY1 NY0 43 44 0 0 0 0 0 0 NY9 NY8 44 45 C7 C6 C5 C4 C3 C2 C1 C0 45 46 0 0 0 0 DIRY DIRX (N)EQ MAJ/MIN 46 47 CM3 CM2 CM1 CM0 LO3 LO2 LO1 LO0 SX= source X-coordinaat SY= source Y-coordinaat DX= destination X-coordinaat DY= destination Y-coordinaat NX= number X-dots NY= number Y-dots C = kleur register CM= commando LO= logische operatie We kunnen alleen een begin punt opgeven, als we van 0 tot 255 (x) willen copieeren dan moet in NX 256 staan en in DIRX 0. Als er we van begin-X naar rechts gaan om bij eind-X te komen dan moet DIRX nul zijn, anders 1. Bij Y geld, werken we van boven naar beneden, dan DIRY=0. Tabel van commando's en wat er allemaal ingevuld moet worden: Code Com SX SY DX DY NX NY C DIRY DIRX (N)EQ MAJ/MIN LOG COM 1111 HMMC * * * * * * * * 1110 HMCM + + + + + + + 1101 HMMM * * * * * * * * * 1100 HMMV + + + + + + + + 1011 LMMC * * * * * * * * * 1010 LMCM + + + + + + + + 1001 LMMM * * * * * * * * * * 1000 LMMV + + + + + + + + + 0111 LINE * * * * * * * * * * 0110 SRCH + + + + + + 0101 PSET * * * * * 0100 PINT + + + LOGische bewerkingen: nieuwe schermkleur=oude kleur LOG source kleur 0000 PSET 1000 TPSET 0001 AND 1001 TAND 0010 OR 1010 TOR 0011 XOR 1011 TXOR 0100 NOT 1100 TNOT Bij de commando's staat de eerste H of L voor High of Low speed, dit houd in dat er bij het copiereen wel (High) of niet (Low) de bewerkingen in Bytes worden uitgevoerd. het copieeren van een stuk VRAM gebeurt in screen 5 dus met 2 punten tegelijk als een H commando gebruikt wordt. HMMC en LMMC: Verplaatsen van RAM naar VRAM Kleur van eerste byte (of pixel) moet in het kleur register(44) staan. Vervolgens wordt het kader gevuld door de rest van de data achter elkaar naar het kleur register te schrijven. Uit het TR bit van statusregister 2 kunnen we afleiden of alle data verplaatst is. HMCM en LMCM: Verplaatsen van VRAM naar RAM Nu wordt de data gelezen uit statusregister 7 (andere registers kunnen immers niet gelezen worden). het TR bit verteld weer wanneer alles binnen is. HMMM en LMMM: verplaatsen VRAM->VRAM razendsnel verplaatsen SX,SY,NX,NY,DIRY,DIRX geven source weer. Beginpunt van destination gaat in DX en DY. Dus eigenlijk het zelfde als BASIC 'COPY(SX,SY)-(SX+NX,SY+NY) TO (DX,DY)' als DIRX en DIRY nul zijn tenminste. HMMV en LMMV: VRAM vullen met kleur Op de zelfde manier als bij ?MMM wordt hier het te bewerken gebied aangegeven. bij H commando's zijn dus geen LOGische bewerkingen mogelijk! LINE Kader in DX,DY,NX,NY,DIRX,DIRY en MAJ/MIN Het bijzondere is dat als er meer Y dan X punten zijn, dat dan NY en NX verwisseld worden en moet MAJ/MIN geSET zijn!! SRCH zoekt een punt in DIRX richting, SY bevat lijn waarop gezocht moet worden. (N)EQ =0 dan wordt er een punt gezocht die dezelfde kleur heeft als het kleurregister (44). (N)EQ =1 dan wordt er een punt gezocht die een andere kleur heeft als het kleurregister. PINT geeft kleur code van (SX,SY) in statusregister 7. Bij het programmeren moet de interrupt uit staan, dan eerst CE-bit controleren of de processor de volgende opdracht kan uitvoeren. Dan parameters wegschrijven, met als laatste het register 46, omdat dan de VDP met het uitvoeren van de opdracht begint. In het MSXROM bevatten adres #0006 en #0007 een aantal I/O poorten die gebruikt mogen worden om de VDP op een snelle manier te lezen. (#0006) data leespoort (#0006)+1 status leespoort (de inhoud van adres #0006 dus, plus 1) (#0007) schrijfpoort (#0007)+1 commando schrijfpoort (#0007)+2 pallette schrijfpoort (#0007)+3 indirecte toegangspoort Schrijven naar een VDP-register: Eerst wordt data geschreven, daarna het registernummer MET BIT 7 geSET! De gewone VDP registers kunnen niet gelezen worden de Status registers wel. In schema: bit 7 6 5 4 3 2 1 0 Byte 1 da7 da6 da5 da4 da3 da2 da1 da0 Byte 2 1 0 re5 re4 re3 re2 re1 re0 Betekenis: da7/0 - data bits (7 in totaal) re5/0 - register (39 registers) Dit wordt naar (#0007)+1 gestuurd VRAM lezen of schrijven: Werkwijze bij lezen en schrijven - register 14 beschrijven bit 0-2: komen overeen met de 3 hoogste bits van het 17 bits adres bit 3-7: moeten geRESET zijn. - byte wegschrijven naar commandopoort bit 0-7: komen overeen met 8 laagste bits van 17 bits adres - byte wegschrijven naar commando poort bit 0-5: komen overeen met bit 8-13 van het 17 bits adres bit 6 : geRESET betekent LEZEN, geSET betekend SCHRIJVEN bit 7 : Moet geRESET zijn In schema: bit: 7 6 5 4 3 2 1 0 byte 1: 0 0 0 0 0 Ab16 Ab15 Ab14 byte 2: 1 0 0 0 1 1 1 0 byte 3: Ab7 Ab6 Ab5 Ab4 Ab3 Ab2 Ab1 Ab0 byte 4: 0 L/S Ab13 Ab12 Ab11 Ab10 Ab9 Ab8 Betekenis: Ab17/0 - VRAM adres bits, 17 bits voor 128k L/S - 0 lezen (I/O poort (#0006)+1) 1 schrijven (I/O poort (#0007)+1) Organisatie van het VIDEO geheugen: Scherm: 5 6 7 8 resolutie: 256*212 512*212 512*212 256*212 bits per pixel: 4 2 4 8 punten per byte: 2 4 2 1 max aantal kleuren: 16 4 16 256 grootte van een pagina: 32k 32k 64k 64k aantal pagina's: 4 4 2 2 Eind adres in VRAM (begin=0): #7FFF #7FFF #FCFF #D3FF (Dit betreft BSAVE,S adressen, voor de schermen)