Werken met scherm 12 Hans Otten De mogelijkheden van scherm 12 waren de grootste verrassing die MSX-2+ ons heeft gebracht. De demonstraties met plaatjes die een kwaliteit vertonen die dicht de werkelijkheid benaderen trokken veel aandacht bij de MSX gebruikers, gewend aan scherm 8 plaatjes. Rond de mogelijkheden van het IC dat dit mogelijk gemaakt, de VDP9958, zijn vooral bij de introductie enorme misverstanden ontstaan. En weinig applikaties zijn er in Europa daarna gemaakt die de mogelijkheden van scherm 12 benutten. Het digitaliseren van plaatjes met de Sony module HBI-V1 en daarna vertonen is waarschijnlijk het meest populaire gebruik. Er is echter veel meer met scherm 12 te doen, als je maar weet hoe het in elkaar zit. Na een uitgebreide speurtocht (met dank aan Gerrit Willemsen en Jan Clements voor de geboden hulp) is de volgende informatie over scherm 12 boven water gekomen. Met name dient deze informatie om het omzetten van en naar scherm 12 plaatjes naar andere formaten, waarbij een RGB omzetting nodig is, te kunnen uitvoeren. Opbouw scherm 12 Scherm 12 is een volledig grafisch scherm. Het is wel een bitmap, maar vier horizontale pixels zijn, in groepjes van vier byte opgeslagen, van elkaar afhankelijk. Tussen deze groepjes is echter geen afhankelijkheid, waardoor het aantal kleuren, tegelijkertijd op het scherm, erg hoog kan zijn. Elk rijtje van vier pixels is gecodeerd volgens de voor de VDP9958 uitgevonden YJK notatie. In afbeelding 1 is te zien hoe de VDP9958 de YJK-waarden in het videoram verwerkt. Via een berekening worden de YJK-waarden naar RGB-waarden omgezet, en via een D/A-converter worden deze naar de analoge RGB-uitgang worden gevoerd. Zie afbeelding 2 voor de verdeling van YJK-waarden over de vier bytes. Waarvoor is scherm 12 geschikt? De afhankelijkheid tussen vier pixels op een rij maken scherm 12 zo goed als ongeschikt voor tekst of computertekeningen. Als we een lijn trekken dan zal de kleur 'lekken' naar de punten buiten die lijn, wat erg storend werkt. Maar met gedigitaliseerde plaatjes zijn verrassend goede resultaten mogelijk, veel beter dan met scherm 8. YJK naar RGB In de VDP9958 zit, zoals in afbeelding 1 is getoond, een schakeling die de YJK-waarden converteert naar RGB-waarden. Deze conversie wordt niet door de Z80 uitgevoerd maar door een logische schakeling in de VDP9958. Omrekenen van de YJK waarden naar de meer gebruikelijke RGB-waarden gaat volgens de formules in afbeelding 2. Deze formules zijn opgenomen in de gegevens van de VDP9958. Deze berekening wordt voortdurend uitgevoerd door de VDP om de inhoud van scherm 12 op het beeld te tonen. Maar in de gegevens ontbreekt de informatie hoe we met deze formules moeten omgaan. Het heeft aardig wat experimenten gekost, zoals het vergelijken tussen een kleur met YJK opgebouwd op scherm 12 en een andere PC met een via RGB-methode opgebouwde kleur om tot de volgende aanvulling te komen: - de formules moeten gezien worden als een weergave van wat in de hardware van de 9958 is gestopt - delen door 2 of 4 is een schuif-operatie waarbij de minst significante bits er aan de rechterkant afvallen - Y1..Y4 zijn 5-bits positieve getallen (0..31) - J en K zijn 6-bits two-complements getallen, dat wil zeggen: het is een 5-bits getal (-31 .. 31) - De YJK waarden worden in de VDP9958 omgezet in RGB-waarden met een bereik van 5 bits (0..31). - Als het resultaat van een berekening negatief is wordt de waarde nul genomen, als het resultaat groter dan 31 is wordt de waarde 31 genomen. Voorbeelden: 1. Y = 0 J = 15 K = 7 R = 15 G = 7 B = 0 2. Y = 0 J = 63 K = 63 R = 0 G = 0 B = 0 3. Y = 0 J = 47 K = 47 R = 0 G = 0 B = 12 Merk op dat, omdat J en K two's complement getallen zijn we in de formules in plaats van 47 eigenlijk de waarde -16 invullen en voor 63 de waarde 0. J en K Uit de de formules blijkt duidelijk dat K de kleur rood en J de kleur groen bepaald in de basiskleur. Verrassend is dat de hoeveelheid blauw zowel door J en K worden beinvloed. Y Het is gebruikelijk om Y de intensiteit van de kleur te noemen. Als we de formules bekijken zien we dat dit maar gedeeltelijk waar is. Met de J en K waarden wordt een basiskleur voor een groep van 4 pixels samengesteld. De Y1..Y4 waarden worden daarbij opgeteld en dat kan leiden tot duidelijk andere kleurtinten. Als de basiskleur vermenigvuldigd zou worden met de Y-waarden was het een intensiteit. De formules voor het omrekenen van YJK naar RGB zijn niet praktisch voor het gebruik in programma's. Vooral het werken met J en K leveren problemen op. Het is handig om het te formuleren zoals in afbeelding 3. Hoeveel kleuren? Waar bij de introduktie van MSX-2+ de meeste verwarring over is ontstaan is hoeveel kleuren er nu op het scherm kunnen worden getoond. Als we de formules vor de conversie naar RGB en de uitleg ervan bestuderen zien we dat er van de theoretische millioenen kleuren de nodige zullen uitvallen. En omdat de YJK-waarden via een conversie in de VDP 9958 worden omgezet in 5 bit RGB-waarden zullen er maximaal 32768 (15 bit) kleuren op het scherm kunnen komen. Om dit uit te zoeken heb ik een programma geschreven dat alle mogelijke waarden van YJK varieert en de resulterende RGB-waarden na berekening volgens de formules in afbeelding 3 opslaat. Daaruit blijkt dat er 19621 unieke RGB-waarden overblijven, beduidend minder dan de 32768 die we kunnen verwachten. Maar het aantal van 19621 komt redelijk overeen met de al eerder gepubliceerde getallen. Het programma kijkt overigens ook naar de niet gevonden RGB-waarden of er in de onmiddelijke nabijheid wel iets is gevonden. Dat blijkt inderdaad het geval te zijn (de R of G of B waarde met de waarde 1 of 2 veranderen) zodat de VDP9958 vrijwel het gehele kleurenspectrum tegelijkertijd op het scherm kan weergeven. Afbeelding 1 YJK ---> RGB(3x5 bit) conversie ---> D/A conversie RGB analoog Afbeelding 2 Verdeling van YJK over 4 bytes 7 6 5 4 3 2 1 -------------------------- byte1 | Y1 | KL | byte2 | Y1 | KH | byte3 | Y1 | JL | byte4 | Y1 | JH | -------------------------- Afbeelding 3 Formules voor omrekenen YJK naar RGB R = Y + J G = Y + K B = 5 * Y /4 - K/4 - J/2 Afbeelding 4 Berekenen van RGB-waarden uit YJK-waarden 1. R = Y 2. G = Y 3. B = 5 * Y /4 4. Als J > 31 dan G = G + J B = B - J / 2 anders G = G - (63 - J) B = B + (63 - J) / 2 5. Als K > 31 dan R = R + K B = B - K / 4 anders R = R - (63 - K) B = B + (63 - K) / 4 Afbeelding 5 Pascal code om uit YJK waarden RGB-waarde te berekenen k := (byte1 and 7) + ((byte1 and 3) * 8) ; j := (byte3 and 7) + ((byte4 and 3) * 8) ; bk := ( (byte2 and 4) = 4 ) ; bj := ( (byte4 and 4) = 4 ) ; y[1] := byte1 / 8 ; y[2] := byte2 / 8 ; y[2] := byte3 / 8 ; y[2] := byte4 / 8 ; for byte_count := 1 to 4 do begin r := y[byte_count] ; g := y[byte_count] ; b := round(y[byte_count] * 5 / 4 ) ; if bk then b := b + ((k xor 31) / 4) else begin g := k + y[byte_count] ; b := b - (k / 4) ; end ; if bj then b := b + ( (j xor 31) / 2) else begin r := j + y[byte_count] ; b := b - (j / 2) ; end ; limit(r) ; { als > 31 dan 31, als < 0 dan 0 } limit(g) ; limit(b) ;