De V9938 Videoprocessor Arsoft & ??, 01-09-94 *** 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. 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 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. 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. 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 rolt als je het register de waarde 0 tot 7 geeft. - Statusregisters: VDP() reg | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 ------------+-----+-----+-----+-----+-----+-----+-----+----- 8 0 | F | SD | C | S4 | S3 | S2 | S1 | S0 *) -1 1 | FL | LPS | I4 | I3 | I2 | I1 | I0 | FH -2 2 | TR | VR | HR | BD | 0 | 0 | E/O | CE -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 *) Dit register staat in het AF register bij de interrupt-routine 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: 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 geldt, 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: 0000 PSET 1000 TPSET 0001 AND 1001 TAND 0010 OR 1010 TOR 0011 XOR 1011 TXOR 0100 NOT 1100 TNOT nieuwe schermkleur=oude kleur LOG source kleur 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 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) |