Porównywana jest często "na szybko" pamięć VRAM w SMS wielkości 16KB do 2KB VRAM w NES, która to wypada blado przy jej 8-krotnie większej ilości w SMS. Jednak sprawa nie jest tak prosta i w rzeczywistości porównywanie wielkości VRAM zainstalowanej w konsolach nie przekłada się na przewagę jednego systemu nad drugim.
Cały haczyk jest w zasadzie działania grafiki w obu systemach, bo nawet jak NES ma tylko 2KB VRAM w konsoli, to kolejne przynajmniej 8KB zawsze siedzi w kartridżu, natomiast w przypadku SMS jest ona w całości w konsoli. Więc już ten fakt pokazuje, że porównywane musi być 16KB do 10KB a nie do 2KB w przypadku NES.
Co do rodzaju tych 8KB w kartridżu z grą na NES, to może być to zarówno 8KB VRAM jak i VROM - gdy jest ROM to grafika zostaje już "fabrycznie" wgrana w kość, natomiast gdy RAM to podobnie jak w SMS najpierw na początku kodu musimy skopiować z Program ROM'u te 8KB do pamięci VRAM.
To nie koniec, bo nawet jak SMS w tym przypadku ma dalej o 6KB VRAM więcej, to nie znaczy, że przekłada się to na np. większą ilość wyświetlanej grafiki itd. Kolejny haczyk jest w organizacji tej pamięci. Obie konsole mają wszystko zaprojektowane podobnie, a nawet jest przewaga NES względem SMS pod pewnym kątem
![Smile :)](./images/smilies/icon_smile.gif)
Zarówno SMS jak i NES mają pamięć VRAM podzieloną na trzy najważniejsze części: Pamięć znaków tła, znaków sprites oraz pamięć ekranu.
Obie konsole mają 256 znaków tła oraz 256 znaków sprites, a największa różnica to ich wielkość bo znak (TILE) w SMS zajmuje 32 bajty i ma 4-Bitowy kolor (4bpp), natomiast w NES znak zajmuje 16 bajtów bo ma 2-bitowy kolor (2bpp) i to powoduje podwójnie większe zapotrzebowanie na pamięć:
SMS 256 znaków x 32 bajty to 8KB x dwie takie tablice to już 16KB, natomiast NES to 256x 16 bajtów to 4KB x dwie tablice to mamy 8KB.
Teraz może coś się nie zgadzać bo skoro w SMS dwie tablice znaków zajmują 16KB czyli całość VRAM to gdzie reszta?
No właśnie tu jest coś, co w NES jest na plus, bo jedna z tablic zostaje obcięta o 2KB, które zostały na pamięć ekranu, natomiast w NES te 2KB siedzi w konsoli osobno dzięki czemu nie zmniejsza ilości grafik możliwych do wyświetlenia.
Więc w przypadku SMS mamy organizację taką: 8KB (8192 bajtów) dla jednej tablicy znaków (256 grafik), kolejna tablica (192 grafiki) ma 6KB (6144 bajtów) oraz 2KB (2048 bajtów) dla pamięci ekranu. I to jest całość 16KB (tzn to co zostaje pod koniec pamięci ekranu to 256 bajtów dla atrybutów sprites). Co ważne można ustawić sobie dowolnie który bank będzie dla tła i dla sprites, dzięki czemu jak potrzeba więcej znaków dla tła to ustawiamy sobie większy bank z 256 znakami, a dla sprites ten z 192 (i odwrotnie). NES jak wyżej napisałem to 4KB (256 znaków) + 4KB (256 znaków) i 2KB dla ekranu.
![Obrazek](https://i.postimg.cc/2S6bgTL8/VRAM-NES-SMS.png)
Tu wychodzi także kolejna, mała przewaga NES, bo o ile w SMS mamy w tych 2KB pamięci tylko na jeden ekran, to w NES te 2KB starcza na dwa
![Smile :)](./images/smilies/icon_smile.gif)
Wszystko zależy od wielkości ekranu, która w przypadku NES jest stała i zawsze ma rozdzielczość 256x240 czyli 32 znaki w poziomie na 30 znaków w pionie. Daje to 32 x 30 więc 960 bajtów + 64 bajty atrybutów = 1KB (1024 bajtów) na ekran, więc mamy pamięci na dwa niezależne ekrany.
SMS ekran zajmuje w podstawowym trybie 32 x 24 znaki (256x192) czyli 768 bajtów x 2 (dwa bajty na znak) = 1536 bajtów + 256 bajtów niewidocznych znaków + pod koniec 256 bajtów dla sprites.
SMS ma jeszcze dwa tryby 32x28 (256x224) oraz 32x30 (256x240 jak NES) i one zajmują nieco więcej pamięci ekranu czyli 1792 oraz 1920 bajtów.
Ostatni tryb jest możliwy wyłącznie na konsoli SMS wersja II i tylko PAL oraz powoduje, że z tych 2KB pamięci zostaje na końcu tylko 128 bajtów dla sprites więc trzeba wtedy zarezerwować inne miejsce w VRAM do tego celu (kosztem ilości znaków).
Wiemy już dlaczego SMS ma większą ilość VRAM względem NES - zwyczajnie podobna zawartość zajmuje w każdym przypadku dwa razy więcej miejsca.
Czy są jakieś plusy takiego rozwiązania skoro same liczby wyglądają podobnie (znaczy się ilości znaków/tilesów oraz ich ilość na ekranie) ?
Wszystkiemu "winna" jest większa ilość bitów koloru w SMS - 4 bits-per-pixel (16 kolorów) versus 2 bits-per-pixel (4 kolory) w NES.
Teraz ktoś pomyśli... zaraz, ale zarówno SMS jak i NES mają dwie palety po 16 kolorów (16 kolorów dla tła, oraz 16 kolorów dla sprites) więc skąd ta różnica? Każda z tych konsol inaczej "zarządza" paletą kolorów, więc nawet jak wydaje się, że są podobne pod tym wzlędem, to działają totalnie inaczej...
SMS używając dla grafiki znaków w 4bpp ma możliwość użycia wszystkich 16 kolorów w jednym znaku 8x8 pixeli - natomiast NES już tylko 4 kolory i to jeszcze z ograniczeniem....
Palety tła oraz sprites w NES zostały podzielone na 4 sub-palety, które dodatkowo "tracą" jeden z kolorów - kolor 0, czyli przezroczysty (kolor tła).
Mamy więc np. dla tła 16 kolorów, podzielone na 4 sub-palety (2bpp), każda ma kolor 0 wspólny (przezroczysty) więc realnie z 16 kolorów robi nam się 12 + kolor 0 (to samo dla sprites). Oczywiście nie użyjemy na raz tych 12 kolorów... Bo jeden znak może przybrać jedną z tych 4 sub-palet. SMS natomiast nie dzieli palety na sub-palety, ale używa jednej, dużej 16 kolorowej a dokładnie 15 różnych kolorów + kolor 0. Zarówno paleta tła jak i sprites.
Paleta NES - tło+sprites
![Obrazek](https://i.postimg.cc/Hn7kW72R/VRAM-PAL-NES.png)
Paleta NES - tło+sprites (sub-palety)
![Obrazek](https://i.postimg.cc/DmkySypZ/VRAM-PAL-NES.png)
Paleta SMS - tło+sprites
![Obrazek](https://i.postimg.cc/C15Kt2fF/VRAM-PAL-SMS.png)
Paleta SMS - tło+sprites (jedna paleta, brak sub-palet)
![Obrazek](https://i.postimg.cc/85YCVbhL/VRAM-PAL-SMS.png)
Pod tym względem SMS przewyższa potwornie NES i możliwość użycia aż 15 kolorów dla jednego znaku 8x8 pix robi znaczącą robotę (dodatkowo istnieje możliwość ustawienia w atrybutach każdego znaku używanie palety dla sprites co dodatkowo umożliwia zwiększenie zakresu kolorów znaków tła). Co do dodatkowego ograniczenia w przypadku NES o którym wyżej wspominałem, to użycie jednej z 4 sub-palet odnosi się nie do jednego znaku 8x8 pix, ale do meta-znaku 16x16 (4 znaki) - spowodowane jest to bardzo ograniczoną, pozostałą na końcu pamięci ekranu przestrzenią do tego celu (1024 bajty na ekran to 960 bajtów na znaki + 64 na ich atrybuty, czyli zbyt mało aby mieć możliwość ustawienia numeru sub-palety osobno dla każdego znaku). To spory minus NES'a, a możliwość jego obejścia jest tylko możliwa używając najmocarniejszego mappera/kontrolera MMC5).
Podzielenie głównej palety na 4 sub-palety w NES ma swoje plusy w oszczędnościach związanych z ilością danych grafik znaków. Przykładem niech będzie biała chmurka i zielony krzaczek w super mario bros - używają one tej samej grafiki znaków, ale każda ma przypisany inny numer sub-palety. W przypadku SMS musimy narysować dwie osobne grafiki znaków co zwiększy użycie pamięci VRAM (jest wprawdzie myk, że ustawimy numer palety dla sprites, ale znowu trzeba to przemyślnie uwzględnić w projekcie aby numer koloru w obu paletach był ten sam, tylko miał inną wartość czyli dla chmurki był biały w palecie tła, a dla krzaczka zielony w palecie sprites).
Nie wiem czy przejrzyście to opisałem, bo słaby ze mnie pisarz... Więc sorki za błędy w pisowni
![Smile :)](./images/smilies/icon_smile.gif)
Dodatkowo wspomnieć trzeba o największym plusie obecności banku 8KB VRAM w kartridżu z grą na NES - a mianowicie możliwość używania i przełączania banków w praktycznie dowolnej ilości. Przykładowo używanie różnych kontrolerów umożliwia zwiększenie tej pamięci do np. 128,256,512 lub więcej KB i przełączanie "w locie" banków z grafikami (co masa gier robi). To samo w SMS jest niemożliwe sprzętowo, a jak chcemy zmienić grafikę w VRAM konsoli, to musimy ją ponownie skopiować z Program ROM, co zjada sporo cykli procesora i odbija się na wydajnośći.
Przy okazji wspomnę także o pamięci WRAM w obu konsolach. SMS ma 8KB a NES 2KB co jest sporą róznicą, ale to także jest w bardzo prosty sposób do obejścia - dodatkowe 8KB WRAM można bez większych problemów zainstalować w kartridżu i mamy do niego bezpośredni dostęp na mapie pamięci co daje łącznie 10KB WRAM (co także wiele gier robi).
![Smile :)](./images/smilies/icon_smile.gif)