Hoe de graphics op de NES werken -------------------------------- De auteur van het originele document is onbekend. Het document is vertaald door A.A.J. Bouwmans en hierover kan je contact opnemen via de e-mail: a.a.j.bouwmans@kub.nl. Alle grafische informatie wordt opgeslagen in de 16kb geheugen van de Picture Processing Unit (PPU). Het eerste deel van het PPU geheugen staat bekend als de "Pattern Tables." De Pattern Tables zijn 8kb groot en is meestal opgesplits in een deel voor de achtergrond en een deel voor de sprites. Het gebruik van de Pattern Tables wordt bepaald door de PPU Control Registers. Alle graphics worden opgeslagen in 8x8 pixels grote "tiles", in de Pattern Tables, die dan samen de achtergrond en sprites vormen. De Pattern Tables (ook wel bekend als VROM) heeft echter slechts de helft van de informatie over deze tiles. De NES is namelijk in staat om 16 kleuren tegelijk te tonen en elke pixel bestaat uit 4-bits (voor de kleur). Deze kleur is echter slechts een opzoek-getal i.p.v. een echte RGB-waarde. De Pattern Table levert de lagere 2-bits van het 4-bits palet. De hogere 2 bits komen vanuit de Attribute Table of het Sprite RAM. Sommige roms hebben CHR-RAM. CHR-RAM staat voor CHaRacter RAM en bevat 8kb stukken met Pattern Tables, die in en uit- kunnen worden gewisseld in de PPU via een MMC. Dit scheelt weer het probleem van het copieren van graphics vanuit de programmacode naar de PPU, zoals sommige spelletjes zonder CHR-RAM doen. Het tweede deel van het PPU geheugen is bekend als "Name Tables". Er zijn er twee, hoewel er adressen zijn voor 4. De twee andere zijn slechts mirrors van de echte tables. De mirror wordt bepaald door de mirroring-bit in de .NES header. Elke Name Table is 960 bytes, die overeenkomen met 960 8x8 tiles die samen de achtergrond vormen. De achtergrond is 32x30 tiles, of 256x240 pixels. Op een NTSC NES worden echter de bovenste en onderste 8 lijnen niet getoont, zodat de echte resolutie daar 256x224 wordt. Let op: sommige spellen gebruiken slechts een (1) Name Table, terwijl andere er vier hebben. Dit hangt af van de Memory Mapper die wordt gebruikt. Bij elke Name Table hoort een Attribute Table. Deze tables hebben de hogere twee bits van elke pixels's kleur die worden toegevoegd aan de lagere twee bits in de Pattern Table. Echter, de Attribute Table is slechts 64 bytes groot, hetgeen betekent dat elke byte de hogere twee bits heeft voor een groep van 4x4 tiles ofwel 32x32 pixels. Dit limiteerd de keuzemogelijkheden voor de achtergrond. Echter, je kunt dit omzeilen door MMC5 te gebruiken, die je toestaat om 4 Name Tables te gebruiken en zo voor elke tile apart de hogere twee bits te kunnen definieren. Voor meer informatie hierover kun je YOSHi's zeer informatieve NESTECH.DOC lezen. In het PPU geheugen zitten ook twee 16 kleuren paletten. De een is voor de achtergrond, de andere voor de sprites. Een palet bevat niet de echte RGB- waardes maar meer een opzoekwaarde van een 256 kleuren palet, die de PPU vertaalt naar TV singalen. Je kan deze waardes in het palette aanpassen, waardoor de vele effecten kunt creeeren zoals een "fade", "flashen" or transparantie. Er is een onafhankelijk stukje geheugen, dat bekend staat onder de naam Sprite Ram en welke 256 bytes groot is. Dit stukje geheugen slaat 4 bytes aan informatie op voor 64 sprites. Deze 4 bytes bevatten de X- en Y-locatie van de sprite of het scherm, de hogere twee kleurenbits, het tile index nummer (welke tile je uit de Pattern Table nodig hebt voor de sprite), informatie over flippen (horizontaal of verticaal) en de prioriteit (staat de sprite voor of achter de achtergrond). Sprite RAM kun je byte-per-byte bereiken via de NES registers of kunnen via DMA transfers worden geladen via andere registers. Er zijn vele andere aspecten van de PPU die kunnen worden geregeld via verscheidene NES registers. Hier is een lijst van de registers en hun werking: PPU Control register 1 (PPUCTRL0): * Selecteert de te tonen Name table * Definieert de PPU adres toename (voor lezen en schrijven) * Definieert het adres met de Pattern Table voor de sprites * Definieert het adres met de Pattern Table voor de achtergrond * Definieert de grootte van de sprites (8x8 of 8x16 pixels) * Definieert of er een interrupt moet worden uitgevoerd als sprite 0 wordt getekend * Definieert of er een interrupt moet worden uitgevoerd tijdens de VBlank periode PPU Control register 2 (PPUCTRL1): * Selecteert het beeldsoort (kleur, zwart-wit) * Definieert of de linker 8 pixels van de achtergrond moeten worden geclipt * Definieert of de sprites moeten worden geclipt in de linker 8 pixels van de achtergrond * Definieert of het scherm moet worden getekend * Selecteert de achtergrondkleur (zwart, rood, blauw, groen) PPU Status register (PPUSTAT): * Vertelt je of de PPU in de VBlank zit * Vertelt je of er meer dan 8 sprites of de huidige scanline zitten * Vertelt je op sprite 0 is getekend op de huidige scanline Achtergrond Scroll (BGSCROLL): * Definieert de horizontale en verticale scroll (hiernaar wordt 2x geschreven)