# Texas Instruments TMS9918

De TMS9918 is een Video Display Controller ontwikkeld door Texas Instruments en werd door vele computersystemen gebruikt, waaronder MSX, Coleco ColecoVision, Texas Instruments TI99/4 en Sega SG-1000 en SC-3000.
Gemodificeerde varianten met aanvullende weergavemodi en -registers werden gebruikt in Sega's Sega Master System, Game Gear en Mega Drive.

## Modelvarianten

Er zijn verschillende modelvarianten van deze processor verschenen en voor elk geldt dat modelnummers met "A" als toevoeging een tweede generatie van het desbetreffende model betreft en beschikt over enkele toegevoegde kenmerken en waarvan een bitmap-modus (Graphic II) de meest belangrijke is. Met uitzondering van de TI-99/4 gebruiken alle hiervoorgenoemde systemen de meer geavanceerde "A"-variant. Deze gehele processorfamilie wordt meestal aangeduid met de benaming TMS9918 of TMS9918A.
De onderstaande modelvarianten van de TMS9918(A) zijn ontwikkeld:

### TMS9918(A)

* kleurcodering: NTSC
* verversingssnelheid: 60 Hz.

### TMS9928(A)

* kleurcodering: YPbPr
* verversingssnelheid: 60 Hz.

### TMS9929(A)

* kleurcodering: YPbPr
* verversingssnelheid: 50 Hz.

### TMS9938(A)

* kleurcodering: NTSC
* verversingssnelheid: 60 Hz.
* doorontwikkeld door als Yamaha V9938
Uit bovenstaande blijkt dat het verschil tussen de '10', '20' en '30'-reeks wordt gevormd door gekozen beeldcodering. Uit oogpunt van kostenbesparingen heeft men tijdens de ontwikkeling van de processoren rekening gehouden met de verschillende bestaande analoge televisiesystemen, met name binnen Europa, en gekozen voor een composiet video-uitvoersignaal [meer precies een YPbPr-uitvoersignaal met uitvoer van de luminantie (Y) en de kleurverschillen blauw (Pb) en rood (Pr)] in plaats van twee afzonderlijke chipvarianten te moeten ontwikkelen voor de PAL en SECAM-televisiestandaarden. Deze codering vindt nu plaats in de HF-modulator.
De TMS9918A werd opgevolgd door de Yamaha V9938. Deze beschikte over meer bitmapmodi, meer kleurige sprites, verticaal scrollregister en een aanpasbaar kleurenpalet. De V9938 werd op zijn beurt weer opgevolgd door de V9958, die onder meer over hoge kleurenmodi en een horizontaal scrollregister beschikte. Deze chip werd onder andere toegepast in MSX2, 2+ en MSX turbo R-computers. Yamaha fabriceerde daarnaast de V9990, die door enkelen wordt gezien als de opvolger van de V9958 maar hiermee niet achterwaartscompatibel is. Voor de MSX is voor de V9990 een uitbreidingsmodule uitgebracht onder de naam "Graphics 9000".

## Interface

De TMS9918A is uitgerust met 16k × 8 Video RAM, dat buiten het adresbereik van de Z80-processor valt. Dit geheugen wordt niet opgeslagen in het geheugen van de processor - de VDP-bus is een private (hoewel extern) gegevensbus dat van de processor is gescheiden.
Een eigen adresseringsruimte betekent wel dat de processor een twee-bytes commando-opdracht naar de VDP-control poort moet sturen om data in het videogeheugen te plaatsen. Dit betekent ook dat VDP de hoofdprocessor niet vertraagd wanneer het gegevens uit zijn geheugen leest, en aangezien het geheugen niet in de adresseringsruimte van de processor wordt gemapped is er meer adresruimte beschikbaar voor overig geheugen. De processor communiceert met de VDP door middel van een 8-bits poort op de VDP en de gegevens worden overgedragen tussen de twee poorten via schrijfopdrachten. Wanneer een byte wordt geschreven of gelezen zal de TMS9918 haar interne adresregister incrementeren waardoor de processor geen adresupdate hoeft te verzenden voor iedere bytetoegang. Dit is belangrijk omdat dit het snel lezen en schrijven van gegevensblokken vereenvoudigt. Door gebruik van de overige interne registers van de TMS9918 kan de hoofd CPU bijvoorbeeld de gewenste videomode instellen, de sprites logica configureren of de interne status van de VDP uitlezen (bijvoorbeeld voor sprite collision detectie).

## Schermmodi

Mode 0 (Tekst): 40 × 24 monochrome karakters. Aangezien het beeldscherm 256 pixels breed is, is de karakterset slechts 6 pixels breed. Deze modus ondersteunt geen sprites of een afwijkende kleur voor de schermrand.
Mode 1 (Graphic 1): 32 × 24 karakters (256 × 192 bitmap), waarbij elke 8 karakters in de karakterset de voorgrond- en achtergrondkleur kan worden bepaald. De karakters "0"-"7", bijvoorbeeld hebben elk dezelfde kenmerken.
Mode 2 (Graphic 2): 32 × 24 karakters (256 × 192 bitmap), met een 2 kleuren beperking voor elke 8 pixels brede regel binnen een karakter.
Mode 3 (Multicolor): 64 × 48 modus, zeer blokkerig en slechts zelden gebruikt. Aan iedere 'pixel' kan echter een eigen kleur worden toegekend, vandaar de aanduiding "Multicolor". De sprites daarentegen hebben nog steeds dezelfde resolutie als in de schermmodi 1 en 2.
De TMS9918 heeft een vast palet van 16 kleuren.

## Sprites

In modi 1, 2 en 3 kan de VDP sprites genereren. Er kunnen 32 monochrome sprites van 8 × 8 of 16 × 16 beeldpunten op het scherm worden weergegeven, elk met een eigen kleur. Er kunnen niet meer dan 4 sprites op één scanlijn bevinden. Van elke extra sprite komen de horizontale beeldpunten te vervallen. Sprites met een hogere prioriteit worden als eerste opgetekend en weergegeven. De processor kan deze beperking echter omzeilen door gebruik van rotatie van de spriteprioriteit, waardoor een andere groep sprites opgetekend wordt op elk frame. Hierdoor zullen de sprites echter "flikkeren" in plaats van geheel te verdwijnen. Deze techniek staat bekend als multiplexing.
Automatische spritebewegingen worden niet afgehandeld door de VDP. In de praktijk zal de hoofdprocessor dit op zich nemen tijdens de VDP's "vertical interrupt" - een gebruikelijke VDP-uitvoer - welke automatisch, iedere 50e of 60e van een seconde (afhankelijk van de processorvariant), plaatsvindt gedurende de "vertical blanking interval" (VBI). De processor springt dan naar een, in de software aanwezige, sprite afhandelende (sub)routine, dat op haar beurt de VDP opdracht geeft waar de sprites moeten worden (her)gepositioneerd.
Wanneer twee niet-transparante beeldpunten - in om het even welke combinatie - botsen, wordt de sprite collision-vlag geactiveerd. Dit is nuttig voor het aanroepen van meer geavanceerde botsingsdetectieroutines in de software, die vervolgens de precieze positie kunnen bepalen en hierop handelen. Merk op dat de VDP het programma niet kan meedelen welke twee sprites met elkaar in botsing zijn gekomen.

## Technische specificaties

* Video RAM: 16 kB
* Tekstmodi: 40 × 24 en 32 × 24
* Resolutie: 256 × 192 (16 kleuren)
* Sprites: 32, 1 kleur, maximaal 4 per horizontale beeldlijn