De MSX 2+ schermen

Last updated on: August 19, 1998

In deze aflevering van Schermen op MSX gaan we het hebben over de MSX 2+ schermen. Zoals wellicht bekend zijn dit de schermen genummerd 10, 11 en 12. Op deze MSX 2+ schermen kunnen zeer veel kleuren tegelijk worden getoond; op screen 12 zijn het er 19268 en op screen 10 en 11 zijn het 12599.
De MSX 2+ schermen hebben dezelfde resolutie als scherm 8 van de MSX 2, dat slechts 256 kleuren tegelijk kan weergeven. Desondanks gebruiken de MSX 2+ schermen niet meer geheugen dan scherm 8. Dit heeft men bereikt door een slimme truuk te gebruiken bij het opslaan van de schermen. Heel globaal gesteld hebben 4 naast elkaar liggende pixels dezelfde kleur en kan per pixel de helderheid worden ingesteld. Op deze manier wordt de kleur informatie verdeeld over meerdere pixels waardoor je in totaal meer kleuren kunt weergeven terwijl het toch niet meer geheugen kost. Om deze kodering te kunnen toepassen heeft de MSX 2+ een nieuw kleur systeem, genaamd het YJK systeem. De letters J en K staan voor de kleur componenten en de letter Y staat voor de helderheid. Dit YJK systeem zullen we eerst uitleggen aan de hand van scherm 12 en daarna komen de schermen 10 en 11 aan bod.

Screen 12 en het YJK systeem
Zoals hierboven al vermeld, werkt screen 12 met het YJK systeem, waarbij de kleur informatie is verdeeld over 4 pixels en de helderheid per pixel wordt vastgesteld. In het video geheugen ziet dat er als volgt uit:
 b7 b6 b5 b4 b3 b2 b1 b0
pixel 0 Y0 Kl
pixel 1 Y1 Kh
pixel 2 Y2 Jl
pixel 3 Y3 Jh
Pixel 0 tot en met pixel 3 zijn de 4 naast elkaar liggende pixels en b7 tot en met b0 zijn de 8 bits binnen 1 pixel. Zoals in deze tabel te zien is, heeft iedere pixel een 5 bits Y component, en zijn de J en K componenten verdeeld over de overige 12 bits; de K component zit in de laagste 3 bits van pixel 0 en pixel 1 en de J component zit in de laagste 3 bits van pixel 2 en 3.

Conversie van YJK naar RGB
Hoewel het YJK systeem handig is om de kleuren compact te kunnen opslaan, is het voor ons toch handiger om te werken met het zogenaamde RGB systeem. Bij het RGB systeem wordt namelijk aangegeven hoe helder de 3 primaire kleuren zijn, te weten Rood, Groen en Blauw. Dit zijn de 3 basis kleuren waar bijvoorbeeld TV's en monitors mee werken en die ook worden waargenomen door het menselijk oog. Gelukkig is het mogelijk om YJK kleuren om te rekenen naar RGB kleuren. Dit kan met de volgende formules:

R = Y + J

G = Y + K

    5       J   K
B = - * Y - - - -
    4       2   4

Bij deze formules moet echter wel nog rekening worden gehouden met de gebruikte rekenmethode; de VDP rekent in 6-bits 2 complement. De getallen J en K zijn beide 6 bits getallen, die in principe overeenkomen met de getallen 0 tot en met 63 als geen rekening wordt gehouden met 2 complement. Om nu de J en K waarden om te zetten naar 2 complement kunnen de volgende BASIC instructies worden gebruikt:

IF J > 31 THEN J=J-64
IF K > 31 THEN K=K-64

Verder dient bij de conversie van YJK naar RGB ook nog rekening gehouden te worden met het feit dat de 3 resultaten slechts 5 bits groot zijn, dus R, G en B zijn alle 3 slechts 5 bits groot. Dit houdt in dat ze altijd tussen 0 en 31 moeten liggen. De VDP gebruikt hierbij de volgende methode:
als één van de waardes kleiner wordt dan 0, dan wordt 0 gekozen en als één van de waardes groter wordt dan 31, dan wordt 31 gekozen. In BASIC kan dit als volgt worden geprogrammeerd:

IF R < 0 THEN R = 0 ELSE IF R > 31 THEN R = 31
IF G < 0 THEN G = 0 ELSE IF G > 31 THEN G = 31
IF B < 0 THEN B = 0 ELSE IF B > 31 THEN B = 31

Met behulp van deze informatie kan een programma geschreven worden dat screen 12 plaatjes omzet in screen 8 plaatjes. Zo'n programma is te vinden in listing 1.
In dit programma wordt per groepjes van 4 pixels gewerkt. Voor zo'n groepje van 4 pixels worden eerst de J en de K componenten berekend. Daarna wordt per pixel de Y component berekend en vervolgens worden hieruit de RGB waardes berekend en weggeschreven in screen 8 formaat.

Conversie van RGB naar YJK
Ook de omgekeerde conversie is mogelijk. Het is dus mogelijk om plaatjes in RGB formaat om te zetten in het YJK formaat van screen 12. Hierbij worden de volgende formules gebruikt:

    B   R   G
Y = - + - + -
    2   4   8

J = R - Y

K = G - Y

Ook hierbij moeten de resultaten weer worden gecontroleerd op het bereik. De Y moet tussen 0 en 31 liggen en de J en de K moeten tussen -32 en 31 liggen.
Bij het berekenen van de YJK waardes treedt er echter nog een probleem op; de J en de K moeten namelijk per 4 pixels worden berekent, terwijl de rood, groen en blauw waardes die hierbij gebruikt worden per pixel kunnen varieren. Om dit probleem op te lossen, dient per 4 pixels de gemiddelde waarde van rood, van groen en van blauw te worden berekent. Deze gemiddelde waardes kunnen vervolgens gebruikt worden om de J en de K voor de 4 pixels te berekenen en daarna kan per pixel de Y worden bepaald.

Met deze informatie is een programma te maken dat screen 8 plaatjes converteert naar screen 12. Een programma voor deze conversie is te vinden in listing 2.

Screen 10 en 11
Hoewel het mogelijk is om op scherm 12 erg mooie plaatjes weer te geven, heeft scherm 12 ook een groot nadeel; door de gebruikte codering is het onmogelijk om scherpe kleurovergangen binnen een groep van 4 pixels te maken. Je kunt bijvoorbeeld niet een rode lijn door een blauwe achtergrond trekken zoals dat op bijvoorbeeld scherm 5 wel kan. Ook in Japan heeft men dit probleem onderkend. De oplossing die hiervoor verzonnen is, heet scherm 10 en 11. Deze schermen, die beiden precies dezelfde indeling hebben, vormen een kruising van scherm 12 met het YJK systeem en scherm 5 met het kleuren palet systeem. Bij deze schermen wordt 1 bit minder gebruikt voor de Y component. In plaats van een 5 bits Y component hebben scherm 10 en 11 een 4 bits Y component. Het zogenaamde attribuut bit dat hierdoor vrij komt wordt vervolgens als een schakel bit gebruikt:
Als het bit 0 is, moet de pixel met het YJK systeem worden weergegeven. Anders dient het kleurenpalet systeem gebruikt te worden. De 4 bits Y component vormt in dat geval het kleur nummer, net zoals ook op scherm 5 een 4 bits kleur nummer gebruikt wordt. In tabel vorm ziet dit er als volgt uit:
b7 b6 b5 b4 b3 b2 b1 b0
pixel 0 Y0/C0 A0 Kl
pixel 1 Y1/C1 A1 Kh
pixel 2 Y2/C2 A2 Jl
pixel 3 Y3/C3 A3 Jh
Dit betekent dat het heel eenvoudig is om een scherm 12 plaatje te converteren naar een scherm 10 of 11 plaatje; het is voldoende om bit 3 van alle pixels te resetten zodat overal het YJK systeem wordt gebruikt. Dit kan in basic als volgt met het LINE commando:

LINE (0,0)-(255,211),&B11110111,BF,AND

Deze functie gebruikt de logische AND functie om het attribuut bit te resetten van alle pixels.

Nadat een plaatje op zo'n manier is omgezet naar screen 10 of screen 11 formaat, kan er overheen getekent worden met de normale basic commando's.

Het verschil tussen scherm 10 en 11
Hoewel scherm 10 en scherm 11 dezelfde indeling hebben, maakt BASIC toch een onderscheid tussen deze 2 schermen. Dit heeft men gedaan om het programmeren eenvoudiger te maken. In screen 11 kunnen alle bits van de pixel verandert worden. Voor het kleurnummer kunnen dan de waardes 0 tot en met 255 gebruikt worden. De conversie van screen 12 naar screen 10 of 11 kan bijvoorbeeld in screen 11 worden uitgevoerd. Als je echter met behulp van het palet over het YJK plaatje wilt gaan tekenen, is dit best wel lastig; je moet er dan voor zorgen dat alleen de 4 hoogste bits van de pixel verandert worden en dat het attribuut bit gelijk wordt gemaakt aan 1, zodat het palet systeem gebruikt wordt. Om bijvoorbeeld een blauw lijntje (met kleur 4) te tekenen van coordinaat (10,10) naar coordinaat (245,202) kunnen de volgende commando's gebruikt worden in screen 11:

LINE (10,10)-(245,202),7,,AND    :' reset Color/Y
LINE (10,10)-(245,202),4*16+8,,OR:' teken lijn in color 4

Dit tekenen met de palet kleuren kan echter een stuk eenvoudiger in screen 10 gebeuren. In screen 10 kun je namelijk hetzelfde tekenen als in screen 5. Hetzelfde lijntje trekken in screen 10 gaat dus als volgt:

LINE (10,10)-(245,202),4

Alle BASIC commando's hebben op screen 10 dus ditzelfde effect, ook commando's zoals CIRCLE waarbij je de methode van screen 11 met 2 keer tekenen niet kunt toepassen.
Kort samengevat kun je dus in screen 11 de pixels volledig veranderen zodat de YJK componenten aangepast kunnen worden, terwijl je in screen 10 over een plaatje heen kunt tekenen alsof je gewoon in screen 5 zit te werken.
Het is trouwens mogelijk om willekeurig tussen scherm 10, 11 en 12 te wisselen zonder dat basic iedere keer het scherm wist zoals bij normale schermwisselingen gebeurt!

De MSX 2+ schermen selecteren in assembler
Hoewel BASIC een aantal commando's aanbiedt om de MSX 2+ schermen te selecteren, zul je vanuit assembler iets meer werk moeten verrichten om deze schermen te zien te krijgen. De BIOS routine om een scherm te selecteren gaat namelijk niet verder dan scherm 8! Om toch scherm 10, 11 of 12 te krijgen dien je dan ook via de BIOS scherm 8 te selecteren en vervolgens moet je zelf de VDP instellen op het YJK systeem door de goede waardes naar de MSX 2+ VDP registers te schrijven. De 2+ schermen kun je instellen met behulp van 2 bits van VDP register 25:

Bit 3 (YJK) = 0
Werk in de MSX 2 mode, geef dus scherm 8 weer
Bit 3 (YJK) = 1
Werk in de MSX 2+ mode, gebruik dus het YJK systeem.
Bit 4 (YAE) = 0
Gebruik het volledige YJK systeem, geef dus scherm 12 weer.
Bit 4 (YAE) = 1
Gebruik het YJK en het palet systeem door elkaar, geef dus scherm 10 en 11 weer.
De andere bits van register 25 hebben op de MSX 2+ ook nog een betekenis. Deze mogen dan ook niet zomaar veranderd worden. Gelukkig houdt de BIOS een kopie bij van register 25 in het MSX systeem gebied. Deze kopie staat op adres #FFFA.
Het instellen van de 2+ schermen kan dus zoals weergegeven in listing 3.

Sprites op de MSX 2+ schermen
De sprites op screen 10, 11 en 12 werken hetzelfde als op screen 5 en 7. Het is dus mogelijk om per spritelijn 2 kleuren te gebruiken, en de sprite kleuren worden opgehaald uit het instelbare kleuren palet. Dit in tegenstelling tot de sprites op screen 8, waar de kleuren van de sprites worden bepaald met een vast, in de VDP ingebakken, palet.
Normaal staan de sprite tabellen op de volgende posities in het video geheugen:
Tabel naam Normale adressen Lengte
Sprite$ tabel #F000-#F7FF 2048 B
Sprite kleur tabel #F800-#F9FF 512 B
Sprite info tabel #FA00-#FA7F 128 B
Dit kan echter veranderd worden door de goede waardes naar de VDP registers te schrijven waar de sprite adressen in staan. Dit zijn de zelfde VDP registers als op de MSX 2 VDP, namelijk VDP 5, VDP 6 en VDP 12.

Het ontbrekende scherm: screen 9
Tussen het hoogste MSX 2 scherm (screen 8) en het laagste MSX 2+ scherm (screen 10) ontbreekt 1 scherm, namelijk screen 9. In de loop der tijd hebben de meest wilde verhalen over dit scherm de ronde gedaan. Het leukste verhaal was wel dat Konami het zou hebben opgekocht voor hun eigen spellen. Dit is (helaas (?)) niet het geval. Screen 9 wordt namelijk in Korea gebruikt als scherm voor de Koreaanse karakters. Het is gewoon een van de grafische MSX 2 schermen (waarschijnlijk screen 7, maar dat weet ik niet zeker), dat wordt aangestuurd alsof het een text scherm is, maar dan met de Koreaanse karakters erop. Dit is dus te vergelijken met de kanji schermen van de Japanse MSX 2+ modellen en de MSX turbo R.

Met dank aan Bernard Lamers voor de informatie over screen 9.