Hlavní navigace

Osmibitové počítače Commodore a čip VIC-II

16. 7. 2009
Doba čtení: 10 minut

Sdílet

V dnešním pokračování seriálu o architekturách počítačů se budeme věnovat čipu VIC-II (6567/6569 Video Interface Controller), který byl použitý v legendárních osmibitových domácích počítačích Commodore C64. Popíšeme si především standardní textové a grafické režimy, a v navazující části seriálu i některé triky.

Obsah

1. Osmibitové počítače Commodore a čip VIC-II
2. Grafický řadič počítačů Commodore – čip VIC-II
3. Standardní textový režim
4. Vícebarevný textový režim (multicolor)
5. Rozšířený textový režim
6. Standardní grafické režimy – hi-res
7. Standardní grafické režimy – multicolor
8. Odkazy na Internetu
9. Obsah následující části seriálu

1. Osmibitové počítače Commodore a čip VIC-II

Počítače Commodore C64 a od nich odvozené modely patřily ve své době mezi špičku mezi osmibitovými domácími počítači, především díky výhodnému poměru cena/výkon a dostupnosti programového vybavení, samozřejmě především her. Vzhledem k agresivní cenové válce mezi firmami Atari, Commodore (CBM), Apple, Texas Instruments a některými dalšími (méně významnými) výrobci počítačů na americkém trhu, se cena modelu C64 snížila z původních 1000 dolarů na pouhých 200 dolarů (cena osmibitových Atari se recipročně snížila až na 100 dolarů, což bylo poměrně paradoxní když si uvědomíme, že dodavatelem mikroprocesorů 6502 byla právě firma CBM, přesněji její dceřinná společnost MOS). Právě tato cenová válka a následný úspěch C64 je považována za jednu z příčin velkého krachu na trhu s herními konzolami, protože cena ve své podstatě univerzálních osmibitových domácích počítačů (použitelných například i v kancelářích) se přiblížila ceně osmibitových herních konzolí, jejichž použití samozřejmě bylo více specializované.

pc7001

Obrázek 1: Osmibitový domácí počítač Commodore C64.

Dalšímu rozšíření počítače C64 pomohlo, ostatně podobně jako osmibitovým počítačům firmy Atari a částečně i dalším výrobcům osmibitových počítačů, otevření trhů ve střední a východní Evropě po roce 1989, což mj. firmě CBM umožnilo, aby tyto počítače vyráběla až do roku 1994 (počátek výroby se datuje do roku 1982), tj. do doby, kdy se například v USA již téměř kompletně přešlo na počítače další generace se šestnáctibitovými i třicetidvou­bitovými mikroprocesory. Celkový počet vyrobených a prodaných kusů C64 se odhaduje na 17 až 22 milionů (jedná se tak o nejprodávanější osmibitový počítač) a – což je poměrně zajímavé – žádný další model počítače odvozený od C64 již nebyl tak úspěšný. C64 je taktéž považován za počítač, na němž se počala formovat demoscéna; na některých demopárty se ostatně s těmito počítači dodnes můžeme setkat, podobně jako s osmibitovými Atari či ZX Spectrem.

pc7002

Obrázek 2: Aliens – známý obrázek z C64 nakreslený v pěti odstínech šedi.

2. Grafický řadič počítačů Commodore – čip VIC-II

Pro generování video signálu byl v počítači C64 využit grafický čip nazvaný VIC-II, což je zkratka úplného názvu Video Interface Controller (dalšími dvěma čipy s velkou integrací jsou mikroprocesor MOS 6510 a již v tomto seriálu popsaný zvukový čip SDI). První verze tohoto grafického řadiče (VIC) byla určena především pro použití v jednoúčelových automatech a levných řadičích displejů (CRT), ale komerčně nebyla příliš úspěšná. I z tohoto důvodu se jí nebudeme v tomto seriálu podrobněji zabývat. Grafický čip VIC-II byl rozšířen ve více variantách. Starší počítače C64 obsahovaly buď verzi MOS 6567 určenou pro televizní normu NTSC (USA) nebo MOS 6569, která byla navržena pro normu PAL. Novější počítače byly osazeny verzemi MOS 8562 (norma NTSC), popř. MOS 8565 (norma PAL), které byly vyrobeny technologií HMOS-II. V počítačích C128 se používaly čipy MOS 8564, popř. MOS 8566. Jednotlivé verze tohoto čipu se od sebe odlišovaly především časováním některých synchronizačních signálů (počet obrazových řádků, počet pixelů na řádku) a vnitřní strukturou, z hlediska programátora se však stále jednalo o tentýž čip s prakticky shodnými vlastnostmi.

pc7003

Obrázek 3: Jedna z variant základní desky počítače C64. Tento počítač byl postaven na mikroprocesoru MOS 6510, grafickém čipu VIC-II, zvukovém čipu SID a dvojici vstupně-výstupních čipů SIO.

Čip VIC-II byl zapojen na interní osmibitovou datovou a šestnáctibitovou adresovou sběrnici počítače. Vzhledem k tomu, že měl vyvedeno pouze čtrnáct nižších adresových vodičů, mohl čip přistupovat k maximálně 16 kB operační paměti, nejvyšší dva bity adresy se musely nastavovat pomocí speciálních klopných obvodů mapovaných do prvních adres paměti (I/O port), čímž bylo mj. umožněno rychlé přepínání obrazových bufferů (viz dále zmíněné triky). Ve zmíněných 16 kB operační paměti se nacházel framebuffer i oblast, ve které byly uloženy sprity. Kromě toho přistupoval čip VIC-II i do samostatné barvové (atributové) paměti, jejíž kapacita byla rovna 210×4 bity=0,5 kB (z této paměti se data načítala paralelně se zobrazovanou bitmapou, neboť VIC-II měl datovou sběrnici rozšířenou na 8+4=12 bitů). Barvová paleta byla, na rozdíl od počítačů Atari vybavených obvodem GTIA, neměnná a obsahovala 16 barev. Zajímavé bylo, že se nejednalo o čisté barvy modelu RGB, ale spíše o různé pastelové odstíny, takže obrázky vytvářené na C64 jsou poměrně snadno rozeznatelné (sami tvůrci tohoto obvodu napsali, že si vybrali barvy, které se jim líbily). Na následujícím schématu je naznačena mapa paměti tak, jak ji může adresovat mikroprocesor. Obsah adres 0×d000 až 0×dfff se liší podle toho, na jakou hodnotu je nastavený klopný obvod řízený signálem CHAREN (jedná se o hodnotu druhého bitu I/O portu).

                               The area at $d000-$dfff with
                                  CHAREN=1     CHAREN=0

 $ffff +--------------+  /$e000 +----------+  +----------+
       |  Kernal ROM  | /       |  I/O  2  |  |          |
 $e000 +--------------+/  $df00 +----------+  |          |
       |I/O, Char ROM |         |  I/O  1  |  |          |
 $d000 +--------------+\  $de00 +----------+  |          |
       |     RAM      | \       |  CIA  2  |  |          |
 $c000 +--------------+  \$dd00 +----------+  |          |
       |  Basic ROM   |         |  CIA  1  |  |          |
 $a000 +--------------+   $dc00 +----------+  | Char ROM |
       |              |         |Color RAM |  |          |
       .     RAM      .         |          |  |          |
       .              .   $d800 +----------+  |          |
       |              |         |   SID    |  |          |
 $0002 +--------------+         |registers |  |          |
       | I/O port DR  |   $d400 +----------+  |          |
 $0001 +--------------+         |   VIC    |  |          |
       | I/O port DDR |         |registers |  |          |
 $0000 +--------------+   $d000 +----------+  +----------+
pc7004

Obrázek 4: Hra Draconus se na počítači C64 vizuálně poněkud odlišuje od verze určené pro Atari, především kvůli fixní barvové paletě na jedné straně a multi-color spritům na straně druhé.

3. Standardní textový režim

Čip VIC-II obsahuje celkem 47 řídicích registrů mapovaných od adresy 0×d000, z nichž většina je použita pro řízení spritů. V řídicích registrech se nachází i trojice bitů označovaných ECM, BMM a MCM (Extended Color Mode, Bit Map Mode, Multi Color Mode), pomocí nichž je možné volit jeden z osmi textových či grafických režimů; ovšem pouze pět režimů je korektních (při pokusu o nastavení dalších režimů sice dochází ke čtení z obrazové paměti, ovšem obrazovka má konstantní barvu). Základním režimem je standardní textový režim, který je nastaven kombinací bitů ECM=0, BMM=0, MCM=0. V tomto režimu se zobrazuje 40 znaků na 25 řádcích (kapacita video paměti je tedy rovna 1000 bajtům). Každý znak je představován rastrovým obrázkem o rozměrech 8×8 pixelů, tj. celkové rozlišení obrazovky je rovno 320×200 pixelům. Barva pozadí znaku (příslušný bit je nulový) zůstává neměnná (barva pozadí je uložena na adrese 0×d021), barvu popředí je možné měnit čtyřbitovým atributem uloženým v atributové paměti (Color RAM). Bitová mapa s definicemi znaků je uložena v operační paměti počítače, je ji tedy možné programově změnit. Originální mapa se znaky ASCII o celkové velikosti 2 KB (256×8 byte) je uložena v paměti ROM.

pc7005

Obrázek 5: Obrazovka v textovém režimu, která je zobrazena po spuštění počítače. Interpret jazyka Basic byl u C64 naprogramován firmou Microsoft. Zajímavé je, že tatáž firma chtěla vytvořit i interpret Basicu pro osmibitové počítače Atari, avšak nepodařilo se jí splnit jedno kritérium: celý Basic se musel vejít do 8 kB ROM. Firma Atari si nakonec vytvořila vlastní osmikilobajtovou verzi Basicu s příkazy pro práci s grafikou i zvukem.

4. Vícebarevný textový režim (multicolor)

V textovém režimu nazvaném multicolor, který je nastaven kombinací bitů ECM=0, BMM=0, MCM=1, se opět zobrazuje 40 znaků na 25 textových řádcích a i velikost obrazové paměti zůstává zachována: 40×25=1000 bajtů. Ovšem některé znaky jsou vytvořeny v rastru 4×8 pixelů namísto 8×8 pixelů, tj. horizontální rozlišení se snižuje na polovinu – 160 pixelů (pixely se však rozšíří, takže se šířka obrázku nezmění). Horizontální rozlišení znaku (4 či 8 pixelů) se řídí nejvyšším bitem uloženým v atributové paměti (Color RAM). Pokud je tento bit nulový, je znak zobrazen stejným způsobem, jako ve standardním textovém režimu, ovšem na výběr barvy popředí zbyly pouze 3 bity (osm barev namísto šestnácti). Pokud je bit jedničkový, snižuje se horizontální rozlišení znaku na 4 pixely, ovšem zvyšuje se i počet barevných kombinací – v každém znaku je možné rozlišit čtyři různé barvy – tři barvy jsou uložené v příslušných řídicích registrech, čtvrtá barva je v atributové paměti a může být tedy pro každý znak odlišná. Celková velikost paměti pro znakový generátor zůstává stejná – 2kB. Tento mód se v několika ohledech podobá režimu GRAPHICS 12 na osmibitových počítačích Atari a i způsob jeho použití je shodný.

pc7006

Obrázek 6: Další obrázek ze hry Draconus.

5. Vícebarevný textový režim (multicolor)

Posledním textovým režimem, který čip VIC-II nabízí, je takzvaný rozšířený textový režim. Tento režim vychází ze standardního textového režimu, tj. zobrazují se znaky o rozměrech 8×8 pixelů ve 25 řádcích po čtyřiceti znacích na řádek. Rozšíření spočívá v tom, že pro každý znak je možné zvolit jednu ze čtyř barev pozadí (výběr barvy popředí se stále provádí čtením čtyř bitů z atributové paměti). Barva pozadí je uložena přímo v kódu znaků pomocí dvou nejvyšších bitů – to znamená, že se sníží počet zobrazitelných znaků z  28=256 na 26=64. Pro některé účely je tento počet znaků dostačující, protože písmen v abecedě je 26 a při použití malých i velkých písmen s číslicemi, mezerou a tečkou (či jiným důležitým znakem) stačí využít pouze 2×26+10+2=64 znaků. Tento režim lze uplatnit i ve hrách, kde je například pozadí složeno právě ze 64 různých (programátorem definovaných) znaků. Oproti grafickým režimům se při změně scény přenáší či mění mnohem menší množství údajů.

pc7007

Obrázek 7: Grafický režim multicolor (popsaný dále) je téměř ideální pro tvorbu statických obrázků.

6. Standardní grafické režimy – hi-res

Kromě tří výše popsaných textových režimů lze s využitím čipu VIC-II použít i dvojici režimů grafických. Prvním z těchto režimů je režim nazývaný hi-res nebo hires („high resolution“). V tomto režimu se zobrazuje grafika v rastru 320×200 pixelů, přičemž na každý pixel je rezervován pouze jeden bit. Pro blok 8×8 pixelů je možné zvolit společnou barvu popředí a pozadí (zda se jedná o popředí či pozadí je určeno na základě hodnoty bitu přiřazeného ke každému bajtu), která je přečtena z paměti o velikosti 40×25=1000 bajtů. Jedná se o jediný režim čipu VIC-II, ve kterém se nevyužívá atributové paměti – Color RAM, protože barvy pro popředí a pozadí bloku 8×8 pixelů jsou uloženy v operační paměti (atributová paměť nemá dostatečnou kapacitu). Uložení pixelů v obrazové paměti je nestandardní, protože se dodržuje návaznost na textový režim (tvůrci čipu tak mohli provést zjednodušení jeho interní struktury, protože grafický režim je zpracovávaný podobně jako režim textový, ovšem s tím rozdílem, že každý řádek má jinou znakovou sadu). Z tohoto důvodu jsou pixely ukládány v blocích 8×8. Spotřeba paměti je následující: obrazová paměť: 320×200=64000 pixelů, tj. 64000/8=8000 bytů, atributová paměť: 320/8×200/8=1000 bytů. Tento režim je velmi podobný grafickému režimu ZX Spectra, až na odlišné rozlišení a jiný způsob adresování obrazových řádků ve framebufferu.

trap_door

Obrázek 8: Ukázka hry Trap Door běžící v režimu hi-res

7. Standardní grafické režimy – multicolor

Druhým grafickým režimem, který je velmi často používaný pro tvorbu statických obrázků (s možnou aplikací dalších triků), je režim nazvaný multi-color či multicolor. Grafika se zobrazuje v rastru 160×200 pixelů, pro každý pixel jsou vyhrazeny 2 bity, pixel tedy může být nezávisle na ostatních pixelech v okolí vybarven jednou ze čtyř barev, která se kombinuje s barvou přečtenou z atributové paměti (tato barva je opět platná pro blok 8×8 pixelů). Prakticky to znamená, že pixelu s bitovou hodnotou 00 se přiřadí barva pozadí, pixelu s hodnotou 11 barva přečtená z atributové paměti (Color RAM) a pixelům, které mají hodnotu 01 či 10 se přiřazuje barva stejným způsobem jako v režimu hi-res: je přečten bajt z bloku 40×25=1000 atributů, přičemž spodní polovina bajtu udává barvu pro pixel s hodnotou 10 a horní polovina pro pixel s hodnotou 01 (tento blok tedy spolu s Color RAM vytváří matici o struktuře 40×25×12 bitů – přesně takto je taktéž čipem VIC-II adresován). Jedná se tedy o kombinaci klasického barevného režimu známého z počítačů Atari s režimem výběru barev z atributové paměti (použité na ZX Spectru). Spotřeba paměti je následující: bitmapa 160×200/4=8000 bajtů, barvy 40×25=1000 bajtů a Color RAM 40×25=1000 nibblů (půlbajtů).

pc7009

Obrázek 9: Režim multicolor se často používá pro zobrazení statických obrázků.

root_podpora

8. Odkazy na Internetu

  1. C64.com
    http://www.c64­.com/
  2. C64 Wiki
    http://www.c64-wiki.com/index­.php/C64
  3. The MOS 6567/6569 video controller (VIC-II) and its application in the Commodore 64
    http://www.zim­mers.net/cbmpic­s/cbm/c64/vic-ii.txt
  4. Wikipedia: Commodore 64
    http://en.wiki­pedia.org/wiki/C64
  5. Wikipedia: Video Display Controller
    http://en.wiki­pedia.org/wiki/Vi­deo_Display_Con­troller
  6. Wikipedia: MOS Technology VIC-II
    http://en.wiki­pedia.org/wiki/MOS_Techn­ology_VIC-II
  7. Wikipedia: List of Commodore 64 games
    http://en.wiki­pedia.org/wiki/Lis­t_of_Commodore64_ga­mes
  8. Wikipedia: Commodore 64 demos
    http://en.wiki­pedia.org/wiki/Com­modore64_demos

9. Obsah následující části seriálu

V navazující části seriálu o architekturách počítačů dokončíme popis grafického čipu VIC-II. Řekneme si, jakým způsobem tento čip pracuje se sprity a taktéž si ukážeme některé známé i méně známé triky, které je možné s tímto obvodem provádět – například je možné zvýšit počet barev zobrazitelných v jednom atributu (bloku 8×8 resp. 4×8 pixelů), zvýšit počet spritů ze standardních osmi na takřka libovolný počet (omezený jen rychlostí procesoru) atd..

Byl pro vás článek přínosný?

Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.