Texas Instruments TMS9918
# Texas Instruments TMS9918

Il TMS9918, detto anche Video Display Processor (VDP) è un chip video fabbricato da Texas Instruments e commercializzato a partire dal 1979. Con le sue varianti, fu usato in sistemi quali il ColecoVision, il CreatiVision, il Memotech MTX, i computer MSX1, il Sega SG-1000, i computer di Spectravideo, il Sord M5, il Tatung Einstein, il TI-99/4 ed i suoi cloni. Il Sega Master System, il Sega Game Gear ed il Mega Drive usarono delle versioni modificate del TMS9918 contenenti dei registri aggiuntivi e delle nuove modalità grafiche (il VDP del Mega Drive non supportava le modalità grafiche del TMS9918).

Il TMS9918 fu sostituito dallo Yamaha V9938, che supportava nuove modalità grafiche, sprite con più colori, un registro per lo scorrimento verticale ed una tavolozza personalizzabile.

## Versioni

Il chip fu fabbricato in diverse varianti chiamate TMS9918A, TMS9928A e TMS9929A, dove la lettera "A" indica una seconda versione del chip con aggiunte nuove caratteristiche, principalmente una nuova modalità con grafica bitmap (Graphic 2). La prima versione, quella senza la "A", fu usata solo nel computer TI-99/4; il suo successore, il TI-99/4A, e gli altri computer avevano la versione TMS9918A. Il TMS9918 generava un segnale video composito mentre il TMS9928A generava un segnale video YPbPr; entrambi generavano un'immagine con 525 linee di scansione ed un segnale con frequenza di 60 Hertz, compatibile con lo standard NTSC. Il TMS9929A generava invece un segnale video YPbPr con 625 linee di scansione, adatto ai Paesi che usavano lo standard PAL/SÉCAM. A livello di costi era più conveniente generare un segnale video YPbPr e poi convertirlo in PAL/SECAM nel modulatore RF piuttosto che progettare e costruire un nuovo sistema per ogni standard video. Il TMS9918A (ed il TMS9918) aveva, rispetto agli altri 2 chip, anche un ingresso video composito che poteva miscelare all'immagine bitmap generata.

Tutti i chip di questa famiglia sono generalmente indicati con il nome TMS9918, alle volte con l'aggiunta della "A".

A metà degli anni ottanta furono rilasciate delle nuove versioni del TMS9918 chiamate TMS9118, TMS9128 e TMS9129: i chip differivano dai precedenti modelli per la funzione di un piedino cambiata e per una differente mappatura della memoria video.

Famiglia Texas Instruments TMS9918 :

| Versione | Uscita video | Ingresso video | Frequenza segnale | Linee di scansione | Modalità Graphic II |
| - | - | - | - | - | - |
| 9918 | Composito | Composito | 60 Hz | 525 | No |
| 9918A / 9118 | Composito | Composito | 60 Hz | 525 | Sì |
| 9928A / 9128 | YPbPr | (No) | 60 Hz | 525 | Sì |
| 9929A / 9129 | YPbPr | (No) | 50 Hz | 625 | Sì |

## Interfaccia

Il TMS9918 gestiva un blocco dedicato di memoria video di 16 kB, esterno al chip grafico ma non visibile all'interno dello spazio di indirizzi gestibili dalla CPU: il bus di memoria del VDP era infatti separato da quello del processore centrale, a differenza di altri sistemi, come il MOS VIC-II del Commodore 64, che usavano memoria condivisa con il resto della macchina. Il VDC poteva così accedere ai dati della memoria video senza dover accedere alla RAM di sistema e, quindi, senza rallentare la CPU; inoltre la memoria video esterna consentiva di risparmiare RAM della memoria centrale. La CPU comunicava con il VDP attraverso una porta ad 8 bit ed i dati erano trasferiti tra questi chip tramite scritture su tale porta. La porta era mappata in memoria oppure gestita come porta di input/output (a seconda delle caratteristiche della CPU) ed il sistema di comunicazione ricorreva all'uso di 2 byte e di 3 segnali elettrici su altrettanti piedini del VDP: mediante questa interfaccia la CPU poteva istruire il VDP per leggere o scrivere nella sua memoria video o in un suo registro semplicemente inserendo nel primo byte l'indirizzo della cella o del registro oggetto dell'operazione e scrivendo o leggendo il dato dal secondo byte, e poi selezionando l'operazione voluta (lettura o scrittura) tramite i segnali elettrici.

## Modalità video

Il TMS9918A supportava 4 differenti modalità video (il TMS9918 non aveva la modalità Graphic 2):

* Modalità 0 (Text): 40×24 caratteri, monocromatica: dato che il video è largo 256 pixel i caratteri sono larghi solo 6 pixel. Questa modalità non supporta gli sprite.
* Modalità 1 (Graphic 1): 32×24 caratteri. Ogni 8 caratteri del set di caratteri si hanno un colore di sfondo ed uno principale diverso. Ciò significa che i caratteri da "0" a "7" hanno gli stessi attributi di colore. Sprite supportati.
* Modalità 2 (Graphic 2): 32×24 caratteri oppure grafica bitmap a 256×192 pixel con la limitazione dell'uso di 2 colori per ogni linea di 8 pixel all'interno di un carattere. Sprite.
* Modalità 3 (Multicolor): modo 64×48 con blocchi grafici di 4×4 pixel. Ogni blocco può avere il suo colore, potendo quindi usare tutti i 15 colori disponibili. Sprite.

Il TMS9918 aveva una tavolozza fissa di 16 colori (15 tonalità più la trasparenza).

## Sprite

La documentazione tecnica del VDP introduce per la prima volta il termine "sprite per indicare gli elementi grafici separati dallo sfondo e gestibili direttamente dall'hardware del processore grafico. Nelle modalità 1, 2 e 3 il VDP poteva renderizzare 32 sprite monocromatici di 8×8 o 16×16 pixel, ognuno colorato diversamente. L'unica limitazione era il numero per riga orizzontale: non più di 4 contemporaneamente, quelli eccedenti venivano scartati. Gli sprite avevano un attributo per impostare la priorità: quelli con priorità più alta venivano disegnati prima. Il VDP aveva un registro in cui veniva memorizzato lo sprite scartato: la CPU poteva quindi aggirare la limitazione dei 4 sprite per riga modificando la priorità degli sprite così da far apparire ad ogni fotogramma un gruppo di sprite differenti. In questo modo gli sprite non scomparivano completamente ma lampeggiavano sullo schermo. Questa tecnica è nota come "multiplazione degli sprite" ( sprite multiplexing). Il VDP permetteva di aumentare le dimensioni degli sprite mediante un attributo grafico che, se impostato, raddoppiava i singoli pixel permettendo quindi di avere sprite di dimensioni 16×16 e 32×32 pixel, rispettivamente.

Il VDP non supportava il movimento automatico degli sprite per cui il posizionamento degli sprite doveva essere gestito via software.

Quando 2 pixel non trasparenti di 2 sprite coincidevano veniva impostato il relativo flag della collisione fra sprite: ciò era utile per poter gestire da programma l'esatta dinamica dell'evento dato che, a differenza del TIA dell'Atari 2600 e del MOS VIC-II del Commodore 64, il TMS9918 non indicava quali sprite erano entrati in collisione ma solo che si era verificata una collisione.

## Piani grafici

Il VDP gestiva l'immagine per piani grafici o livelli: i piani erano 35, ed ogni livello gestiva un componente dell'immagine. Il numero del livello indicava la "distanza" dall'osservatore: più il numero era grande, più il livello era "lontano", collocandosi sotto a tutti quelli con un numero minore e sopra a tutti quelli con un numero maggiore. Il livello 0 era perciò il primo, quello più "vicino", mentre il livello 34 era l'ultimo, quello più "lontano":

* livelli dallo 0 al 31: erano i livelli dedicati agli sprite; l'ordine rappresentava anche la priorità tra gli stessi sprite
* livello 32: livello del motivo grafico dello sfondo
* livello 33: detto "backplane", questo motivo era largo quanto l'immagine video, estendendosi oltre il riquadro grafico generato dal VDP e di fatto creando la cornice colorata intorno ad esso
* livello 34: usato per inserire nell'immagine l'eventuale segnale video presente in ingresso (solo TMS9918/9918A)

## Dettagli sulla Modalità 2

Tecnicamente la Modalità 2 è una modalità testuale con un insieme di caratteri colorati. Lo schermo è diviso in 3 aree orizzontali di 256×64 pixel ciascuna, ognuna delle quali può avere il proprio insieme di caratteri. Modificando i caratteri e disegnandoli sullo schermo il programma può simulare una modalità grafica in cui ogni pixel può essere impostato individualmente. Ciò nonostante il framebuffer risultante non è lineare.

Il programma può anche usare 3 insiemi di caratteri diversi e poi gestire lo schermo come una modalità testuale con un insieme di caratteri colorati. I motivi dello sfondo e gli sprite consistono allora di caratteri colorati. Questo metodo fu usato comunemente nei giochi dato che il riempimento/scorrimento dell'intero schermo si limitava al riempimento/scorrimento di soli 32×24 byte. Le parti grafiche potevano essere disegnate in modo tale che i bordi dei blocchi di 8×8 pixel non fossero così marcati: questa fu un'arte in cui Konami eccelse particolarmente.

Il TMS9918 gestiva i colori in Modalità 2 permettendo di usare per ogni riga di 8×1 pixel solo 2 tonalità diverse, lo sfondo ed il colore di riempimento, scelti liberamente da una tavolozza di 15. Ma per ogni area di 8×1 pixel potevano esistere solo 2 colori. E quando si manipolava lo schermo via BASIC con istruzioni grafiche era facile superare tale limite, ad esempio attraversando una sezione con i 2 già impostati con il tracciamento di una linea di un terzo colore. L'effetto che ne derivava era noto con il termine di "color spill" (visibile nell'immagine a lato). Questo difetto era comune anche al Sinclair ZX Spectrum.

Il VIC-II del C64 era strutturato diversamente e non aveva questo limite: il chip, infatti, permetteva di avere massimo 4 colori (da una tavolozza di 16) ogni area di 4×8 pixel, con 3 colori che potevano essere scelti per ogni area mentre il quarto, generalmente il colore di sfondo, che doveva rimanere uguale per tutto lo schermo. Utilizzando delle tecniche avanzate (ricorrendo a programmi in linguaggio macchina) si poteva comunque modificare tale colore di sfondo variandolo ad ogni linea di scansione dell'immagine.

Il TMS9918 non aveva nessun registro di scorrimento, che doveva essere eseguito quindi via software.

## Accorgimenti usati nei giochi

Alcuni giochi cercarono di aggirare l'assenza dei registri di scorrimento eseguendo lo scorrimento dei pixel degli stessi caratteri, come il gioco Parsec per il TI-99/4A.

La conversione per MSX di Circus Charlie aveva lo scorrimento orizzontale e aggirava il limite dei 2 colori per ogni area di 8×1 pixel ricorrendo ad una grafica monocromatica con la sovrapposizione di alcuni sprite colorati.

Pippols scorreva verticalmente. Dato che lo scorrimento verticale non era afflitto dal limite dell'area 8×1, il personaggio controllato dal giocatore poteva camminare tra delle siepi di fiori colorati che scorrevano dolcemente. Gli altri personaggi ed oggetti del gioco erano monocromatici e non erano dettagliati con la stessa cura.

Road Fighter era un gioco di guida a scorrimento verticale: quando l'auto del giocatore viaggiava a tutta velocità lo schermo era spostato verso il basso di 8 pixel per fotogramma, rendendo lo scorrimento degli sprite dolce nonostante i salti di 8 pixel.

Knightmare aveva uno scorrimento verticale così lento che i salti di 8 pixel non disturbavano più di tanto. Zanac scorreva verticalmente molto più velocemente ma grazie agli sfondi con cui il giocatore non entrava mai in collisione il problema non dava particolarmente noia.

In Nemesis (un gioco in stile R-Type), invece, lo scorrimento orizzontale era il lato negativo del gioco, con i salti di 8 pixel distintamente visibili. Il suo seguito, Nemesis 2, sopperiva in parte agli scatti di 8 pixel offrendo una grafica altamente colorata e dettagliata.

## Caratteristiche tecniche

* RAM video:
   * 4/8/16 kB: tutte le caratteristiche del VDC erano gestibili solo usando 16 kB di RAM, che era il taglio di memoria normalmente usato nei principali sistemi
* Modalità testuali:
   * 40×24 (caratteri di 6×8 pixel)
   * 32×24 caratteri (8×8 pixel)
* Risoluzione: 256×192 pixel, 16 colori (15 colori + trasparenza)
   * nel TMS9918/TMS9918A la trasparenza veniva usata per miscelare il segnale video eventualmente presente in ingresso
* Sprite: 32
   * 1 colore
   * solo 4 ogni riga orizzontale
   * dimensioni: 8×8 e 16×16 pixel - possono essere raddoppiate a 16×16 e 32×32 pixel, rispettivamente
* Piani grafici: 35
   * 32 per gli sprite (1 piano per ogni sprite)
   * sfondo
   * "backplane"
   * ingresso video

## Strumenti grafici

Il TMS9918 ha visto nascere nel corso degli anni alcuni strumenti per la gestione delle immagini, il disegno degli sprite e, recentemente, anche alcuni strumenti di conversione delle immagini in formati compatibili con la risoluzione ed il numero di colori supportati in Modalità 2, alcuni basati su algoritmi di dithering quali quello di Floyd-Steinberg. Alcuni di questi strumenti di conversione sono disponibili liberamente, come l'MSX Screen Conversor, che converte direttamente online, e lo Screen 2 Converter, versione in linguaggio C del precedente (offline).

