Obsah
1. Historie vývoje počítačových her (110. část – herní konzole Nintendo 64)
2. Nintendo 64 a konkurenční herní konzole páté generace
3. Design herní konzole Nintendo 64
5. Programátorský model mikroprocesoru R4300i
6. Instrukce mikroprocesoru R4300i
9. Instrukce podmíněných a nepodmíněných skoků
10. Instrukce pro vyvolání výjimky (trap)
12. Instrukce pro matematický koprocesor
13. Obsah následující části seriálu
1. Historie vývoje počítačových her (110. část – herní konzole Nintendo 64)
Neoficiálním nástupcem společnosti Atari se v oblasti videoher stala ve druhé polovině osmdesátých let minulého století firma Nintendo se svojí osmibitovou herní konzolí třetí generace nazvanou Nintendo Entertainment System pocházející z roku 1985, která je známá spíše pod zkratkou NES (poněkud odlišná Japonská verze Famicom pochází z roku 1983). Kromě klasických domácích herních konzolí připojovaných k televizoru se firma Nintendo významně podílela i na vývoji kapesních herních konzolí vybavených vlastním displejem (LCD) či dokonce v případě složitějších konzolí dvojicí displejů. Nicméně trh klasických herních konzolí byl (a doposud je) natolik zajímavý, že se společnost Nintendo snažila být i v této oblasti lídrem na trhu. Po velmi úspěšné konzoli NES byla vyvinuta další komerčně úspěšná konzole Super NES (SNES), která se již svými parametry (kapacita operační paměti, použitý CPU, možnosti grafického subsystému) řadila mezi herní konzole čtvrté generace. Zde SNES poměrně úspěšně konkuroval například konzoli Sega Mega Drive/Sega Genesis či TurboGrafx16.
Pro hráče mnohem zajímavější, ale pro společnost Nintendo již nikoli příliš příznivá situace nastala ve chvíli, kdy začaly být vyvíjeny a následně prodávány herní konzole patřící do páté generace. Od těchto konzolí totiž hráči a vlastně i producenti her již očekávali poněkud odlišné parametry než od jednodušších herních konzolí třetí a čtvrté generace – zejména se to týkalo zobrazení trojrozměrné grafiky (včetně použití textur popř. pokročilejších grafických efektů) a taktéž využití možností nabízených vysokokapacitními paměťovými médii, mezi něž v devadesátých letech minulého století patřily především jednotky a paměťová média CD-ROM.
Naproti tomu konzole třetí a čtvrté generace, kde firma Nintendo excelovala nejprve s NESem a později se SNESem, byly orientovány zejména na dvourozměrnou grafiku se sprity, rozdělením grafické paměti na dlaždice a tvary (znaky) i hardwarově podporovaným scrollingem. Nejoblíbenějším paměťovým médiem byly u těchto konzolí cartridge osazené většinou paměťmi (E)PROM, které byly v některých případech doplněny i dalšími čipy (RAM o malé kapacitě zálohovaná baterií používaná pro tabulky s dosaženým skóre i pro ukládání stavů hry, čip pro FM syntézu atd.).
2. Nintendo 64 a konkurenční herní konzole páté generace
Nejúspěšněji byly nové požadavky na konzole páté generace splněny společností Sony, která vyvinula herní konzoli Sony PlayStation, jejíž historii vzniku i základní technické parametry jsme si popsali v minulé a předminulé části tohoto seriálu. Nicméně i společnost Nintendo v roce 1996 (tedy poněkud později, než tomu bylo u dalších konzolí) vydala vlastní herní konzoli páté generace, která měla přímo konkurovat nejenom Sony PlayStation, ale i konzolím Sega Saturn, 3DO či Atari Jaguar a v menší míře pak Amiga CD32 (kromě toho existovaly i některé konzole stojící na rozhraní mezi čtvrtou a pátou generací, příkladem může být Sega 32X, což je vlastně rozšiřující modul pro starší konzoli Sega Mega Drive).
Již na tomto místě můžeme prozradit, že nová herní konzole Nintenda, která nesla označení Nintendo 64, sice v žádném případě nebyla komerčním propadákem, ale firmě se již nepodařilo zopakovat fenomenální úspěch NESu, protože Nintendu 64 patřila s přibližně 33 miliony prodaných kusů přibližně jen třetina trhu v porovnání s nepřekonanou konzolí Sony PlayStation, které se prodalo přes 100 milionů. Tabulku s celkovými počty prodaných kusů herních konzolí páté generace jsme si už uvedli ve sto čtvrté části tohoto seriálu. Jedním z důvodů, proč Nintendo 64 nebylo více populární, byl právě jeho pozdní vstup na trh, protože v roce 1996 muselo Nintendo 64 bojovat s PlayStation či Segou Saturn, které byly vydány v roce 1994 a taktéž s konzolí Atari Jaguar vydanou dokonce ještě o rok dříve. Dalším velmi úzce souvisejícím důvodem byl relativní nedostatek her v prvním roce existence Nintenda 64 (zde se firmě Nintendo vymstil způsob kooperace s vývojáři her, který nebyl tak „svobodný“ jako v případě Sony PlayStation – k tomuto důležitému tématu se ještě vrátíme).
3. Design herní konzole Nintendo 64
Poměrně neobvyklý byl způsob vzniku herní konzole Nintendo 64. Vývojem se totiž nezabývali pouze inženýři ze samotné firmy Nintendo, protože návrhem základních modulů této herní konzole byla pověřena známá společnost Silicon Graphics Inc. (SSI). Tato společnost sice neměla žádné předchozí zkušenosti s vývojem herních konzolí, o to větší zkušenosti a know how však měla v oblasti počítačové grafiky, především pak trojrozměrné grafiky zobrazované v reálném čase (možná právě vývoj konzole jinou firmou zapříčinil relativně pozdní příchod na trh). Výsledný design konzole Nintendo 64 se v mnoha ohledech podobá designu již minule a předminule popsané konzole Sony PlayStation až na jednu výjimku: firma Nintendo preferovala použití paměťových cartridgí namísto mechaniky CD-ROM, což s sebou přinášelo některé výhody (ochrana proti kopírování, větší odolnost), ale i nevýhody (menší kapacita a z toho vyplývající omezení pro tvůrce her).
Nintendo 64 bylo založeno na 64bitovém mikroprocesoru R4300i s architekturou RISC nazývaného „Reality Engine“ (jak uvidíme dále, používá se slovo „reality“ i pro popis dalších modulů této herní konzole). Mikroprocesor, který již mimochodem nabízel rozhraní JTAG (které bylo možné v konzoli zneužít), byl doplněn druhým čipem, který v sobě sdružoval jak grafický subsystém (Reality Immersion Processor), tak i subsystém zvukový (Reality Signal Processor).
Důvodem, proč byly tyto dva subsystémy umístěny společně na jednom čipu, byly samozřejmě snahy o snížení výrobních nákladů herní konzole. Konzole byla dále osazena operační pamětí o kapacitě 4 MB, kterou bylo možné rozšířit až na 8 MB. Zajímavé je, že paměťové moduly využívaly technologii firmy Rambus (šířka datové sběrnice 4×9 bitů) a nikoli SDRAM. Důvodem byla opět snaha snížit výrobní náklady (jednodušší obvody pro řízení pamětí) a současně i zrychlit přenosové rychlosti (blokový přenos dat), ovšem na úkor větších latencí při náhodném přístupu k datům uloženým v paměti (to sice nebylo tak kritické pro oblast herních konzolí, ovšem i kvůli této vlastnosti se tyto paměti přestaly používat na desktopech).
4. Mikroprocesor R4300i
V této kapitole si stručně popíšeme vlastnosti mikroprocesoru R4300i „Reality Engine“, který byl ústředním prvkem herní konzole Nintendo 64. Jednalo se o na svou dobu poměrně výkonný 64bitový mikroprocesor s architekturou RISC kompatibilní s řadou R4000 používanou společností SGI v mnoha dalších systémech a pracovních stanicích, jehož hodinová frekvence byla nastavena na 93,75 MHz (maximální frekvence tohoto čipu je 100 MHz). Jen pro porovnání si uveďme, že první (samozřejmě pouze 32bitové) čipy Pentium byly uvedeny na trh v roce 1993 a jejich hodinové frekvence začínaly u nejlevnějších modelů na 60 MHz. Čip R4300i, který byl navržen především s ohledem na celkovou výrobní cenu a nikoli tak, aby nabízel co nejvyšší výpočetní výkon, byl vybaven vyrovnávací pamětí pro data i pro instrukce, jak tomu ostatně je u RISCových mikroprocesorů zvykem. Datová cache měla kapacitu 8kB, zatímco instrukční cache celých 16kB.
Kromě vlastního procesorového jádra se na čipu R4300i nacházela i trojice koprocesorů označovaná CP0 až CP2. Koprocesor CP0 sloužil pro virtualizaci paměti a pro zpracování výjimek, koprocesor CP1 vykonával operace s plovoucí řádovou čárkou a koprocesor CP2 byl rezervován pro další rozšiřování možností R4300i v budoucnosti. Tento mikroprocesor byl samozřejmě vybaven aritmeticko-logickou jednotkou (ALU) doplněnou o modul pro bitové posuny (shifter) a taktéž o modul násobičky (CSA Multiplier), který byl používaný jak při násobení celých čísel, tak i pro násobení hodnot s plovoucí řádovou čárkou s jednoduchou i dvojitou přesností.
Ostatně i mnohé další operace s plovoucí řádovou čárkou používaly stejné moduly, jaké byly využívány pro celočíselné operace, a to kvůli výše zmíněné snaze o dosažení co nejnižší výrobní ceny a nízké energetické náročnosti při zachování dostatečného výpočetního výkonu. I z tohoto důvodu dokázal matematický koprocesor provádět jen základní aritmetické operace, výpočet odmocniny a několik druhů zaokrouhlení, ovšem například exponenciální, logaritmické či goniometrické operace zde nebyly implementovány. To mj. znamená, že možnosti matematického koprocesoru CP1 se dosti podstatným způsobem odlišovaly například od matematického koprocesoru, který můžeme najít na architektuře x86.
5. Programátorský model mikroprocesoru R4300i
Programátorský model mikroprocesoru R4300i se v mnoha ohledech podobá dalším 64bitovým RISCovým mikroprocesorům, zejména dalším mikroprocesorům založeným na původních čipech MIPS. Základem je sada pracovních registrů rozdělených do dvou skupin. V první skupině se nachází 32 registrů o šířce 64 bitů, které jsou používány pro operace s celými čísly i pro adresování (GPR – General Purpose Registers). Tyto registry se v assembleru pojmenovávají R0 (konstantní nula) až R31 a zajímavé je, že v závislosti na nastaveném režimu se může bitová šířka těchto registrů snížit na 32 bitů (32bitový režim) či může mít celých 64 bitů. Druhá skupina taktéž obsahuje 32 registrů o šířce 64 bitů, ovšem tyto registry jsou používány pro operace s hodnotami uloženými v systému plovoucí řádové čárky – Floating Point General Purpose Registers (FGRs), a to jak v režimu jednoduché přesnosti (single/float), tak i v režimu double. V assembleru jsou těmto registrům přidělena jména FGR0 až FGR31.
Tato sada univerzálních pracovních registrů je doplněna ještě pěticí registrů se speciálními funkcemi. Mezi tyto registry patří 64bitový instrukční čítač PC, dva registry pro čtení stavu a řízení FPU (resp. přesněji řečeno koprocesoru CP1) a konečně dvojice registrů nazvaných MulHI a MulLO, které jsou využívány násobičkou a děličkou. I tyto dva speciální registry mají šířku 64 bitů. Ke speciálním registrům lze zařadit i jednobitový registr (či možná přesněji řečeno jednobitový příznak) LL (Load/Link) používaný například při synchronizaci. Další speciální a řídicí registry jsou součástí koprocesoru CP0, o němž jsme se zmínili v předchozí kapitole (těchto speciálních registrů je celkem třicet dva, každý z nich má odlišnou funkci):
Číslo registru (hexa) | Název |
---|---|
0×00 | Index |
0×01 | Random |
0×02 | EntryLo0 |
0×03 | EntryLo1 |
0×04 | Context |
0×05 | PageMask |
0×06 | Wired |
0×07 | rezervováno |
0×08 | BadVAddr |
0×09 | Count |
0×0A | EntryHi |
0×0B | Compare |
0×0C | Status |
0×0D | Cause |
0×0E | EPC |
0×0F | PRevID |
0×10 | Config |
0×11 | LLAddr |
0×12 | WatchLo |
0×13 | WatchHi |
0×14 | XContext |
0×15 | rezervováno |
0×16 | rezervováno |
0×17 | rezervováno |
0×18 | rezervováno |
0×19 | rezervováno |
0×1A | PErr |
0×1B | CacheErr |
0×1C | TagLo |
0×1D | TagHi |
0×1E | ErrorEPC |
0×1F | rezervováno |
6. Instrukce mikroprocesoru R4300i
Již v předchozích částech tohoto seriálu jsme si stručně popsali některé mikroprocesory s architekturou RISC použité v herních konzolích páté generace. Čip R4300i popisovaný dnes se v mnoha ohledech příliš neliší například od čipu R3000A, s nímž jsme se již seznámili v rámci popisu herní konzole Sony PlayStation. Není se ostatně čemu divit, protože oba zmíněné čipy jsou založeny na architektuře MIPS, i když R4300i je o generaci dále než R3000A (navíc se podle nastaveného režimu mohly operace provádět v 64bitovém režimu). Všechny instrukce mikroprocesorů R4300i měly konstantní šířku třicet dva bitů, což mj. taktéž znamenalo, že instrukce byly v operační paměti vždy zarovnány na násobek čtyř bajtů. To mělo význam například u instrukcí skoků, neboť nebylo nutné ukládat spodní dva bity adresy: ty byly vždy nulové.
Podle způsobu rozdělení bitových polí v 32bitovém instrukčním slovu se instrukce dělily pouze do třech kategorií – I-type (Immediate), J-type (Jump) a R-Type (register):
I-Type (immediate) ------------------------------------------------------------ | 31 26 | 25 21 | 20 16 | 15 0 | ------------------------------------------------------------ | opcode (6) | rs (5) | rt (5) | offset/konstanta (16) | ------------------------------------------------------------
J-Type (jump) ------------------------------------------------------------ | 31 26 | 25 0 | ------------------------------------------------------------ | opcode (6) | adresa (26) | ------------------------------------------------------------
R-Type (register) ------------------------------------------------------------ | 31 26 | 25 21 | 20 16 | 15 11 | 10 6 | 5 0 | ------------------------------------------------------------ | opcode (6) | rs (5) | rt (5) | rd (5) | shift | operace | ------------------------------------------------------------
Instrukce je možné rozdělit i podle jejich funkce do několika kategorií vypsaných v následujících šesti kapitolách.
7. Instrukce typu load/store
Instrukce typu load/store slouží k načítání a ukládání hodnot do operační paměti. Mikroprocesor R4300i programátorům nabízel mnoho typů těchto instrukcí, které se od sebe lišily především typem operandů, popř. i automaticky prováděnými konverzemi. Zajímavé jsou instrukce pro atomické operace typu read-modify-write; vždy se jedná o dvojici instrukcí (například LL a SC atd.):
# | Load/store | Operandy | Význam |
---|---|---|---|
1 | LB | rt,offset(base) | načtení hodnoty typu byte |
2 | LBU | rt,offset(base) | načtení hodnoty typu byte unsigned |
3 | LD | rt,offset(base) | načtení hodnoty typu doubleword |
4 | LDL | rt,offset(base) | načtení hodnoty typu doubleword (nejvyšší bity) |
5 | LDR | rt,offset(base) | načtení hodnoty typu doubleword (nejnižší bity) |
6 | LH | rt,offset(base) | načtení hodnoty typu halfword |
7 | LHU | rt,offset(base) | načtení hodnoty typu halfword unsigned |
8 | LL | rt,offset(base) | načtení hodnoty typu word (pro atomické operace) |
9 | LLD | rt,offset(base) | načtení hodnoty typu doubleword (pro atomické operace) |
10 | LW | rt,offset(base) | načtení hodnoty typu word |
11 | LWL | rt,offset(base) | načtení hodnoty typu word (nejvyšší bity) |
12 | LWR | rt,offset(base) | načtení hodnoty typu word (nejnižší bity) |
13 | LWU | rt,offset(base) | načtení hodnoty typu word Unsigned |
14 | SB | rt,offset(base) | uložení hodnoty typu byte |
15 | SC | rt,offset(base) | načtení hodnoty typu word (pro atomické operace) |
16 | SCD | rt,offset(base) | načtení hodnoty typu doubleword (pro atomické operace) |
17 | SD | rt,offset(base) | uložení hodnoty typu doubleword |
18 | SDL | rt,offset(base) | uložení hodnoty typu doubleword (nejvyšší bity) |
19 | SDR | rt,offset(base) | uložení hodnoty typu doubleword (nejnižší bity) |
20 | SH | rt,offset(base) | uložení hodnoty typu halfword |
21 | SW | rt,offset(base) | uložení hodnoty typu word |
22 | SWL | rt,offset(base) | uložení hodnoty typu word (nejvyšší bity) |
23 | SWR | rt,offset(base) | uložení hodnoty typu word (nejnižší bity) |
8. Aritmetické instrukce
Podobně jako je tomu i u mnoha dalších typů mikroprocesorů, tvoří největší skupinu instrukcí instrukce pro aritmetické, logické či bitové operace:
# | Aritmetické instrukce | Operandy | Význam |
---|---|---|---|
1 | ADD | rd,rs,rt | součet |
1 | ADDI | rt,rs,immediate | součet s konstantou |
2 | ADDIU | rt,rs,immediate | součet s konstantou |
3 | ADDU | rd,rs,rt | součet |
4 | AND | rd,rs,rt | operace AND |
5 | ANDI | rt,rs,immediate | operace AND s konstantou |
6 | DADD | rd,rs,rt | součet |
7 | DADDI | rt,rs,immediate | součet s konstantou |
8 | DADDIU | rt,rs,immediate | součet s konstantou |
9 | DADDU | rd,rs,rt | součet |
10 | DDIV | rs,rt | podíl |
11 | DDIVU | rs,rt | podíl |
12 | DIV | rs,rt | podíl |
13 | DIVU | rs,rt | podíl |
14 | DMULT | rs,rt | součin |
15 | DMULTU | rs,rt | součin |
16 | DSLL | rd,rt,sa | posun doleva |
17 | DSLL32 | rd,rt,sa | posun doleva |
18 | DSLLV | rd,rt,rs | posun doleva |
19 | DSRA | rd,rt,sa | aritmetický posun doprava |
20 | DSRA32 | rd,rt,sa | aritmetický posun doprava |
21 | DSRAV | rd,rt,rs | aritmetický posun doprava |
22 | DSRL | rd,rt,sa | logický posun doprava |
23 | DSRL32 | rd,rt,sa | logický posun doprava |
24 | DSRLV | rd,rt,rs | logický posun doprava |
25 | DSUB | rd,rs,rt | rozdíl |
26 | DSUBU | rd,rs,rt | rozdíl |
27 | LUI | rt,immediate | speciální formát načtení konstanty (horní bity) |
28 | MFHI | rd | přesuny dat z/do registrů násobičky |
29 | MFLO | rd | přesuny dat z/do registrů násobičky |
30 | MTHI | rd | přesuny dat z/do registrů násobičky |
31 | MTLO | rd | přesuny dat z/do registrů násobičky |
32 | MULT | rs,rt | součin |
33 | MULTU | rs,rt | součin |
34 | NOR | rd,rs,rt | operace NOR |
35 | OR | rd,rs,rt | operace OR |
36 | ORI | rt,rs,immediate | operace OR s konstantou |
37 | SLL | rd,rt,sa | logický posun doleva |
38 | SLLV | rd,rt,rs | logický posun doleva |
39 | SLT | rd,rs,rt | nastavení hodnoty na základě podmínky < |
40 | SLTI | rt,rs,immediate | nastavení hodnoty na základě podmínky < |
41 | SLTIU | rt,rs,immediate | nastavení hodnoty na základě podmínky < |
42 | SLTU | rd,rs,rt | nastavení hodnoty na základě podmínky < |
43 | SRA | rd,rt,sa | aritmetický posun doprava |
44 | SRAV | rd,rt,rs | aritmetický posun doprava |
45 | SRL | rd,rt,sa | logický posun doprava |
46 | SRLV | rd,rt,rs | logický posun doprava |
47 | SUB | rd,rs,rt | rozdíl |
48 | SUBU | rd,rs,rt | rozdíl |
49 | XOR | rd,rs,rt | operace XOR |
50 | XORI | rt,rs,immediate | operace XOR s konstantou |
9. Instrukce podmíněných a nepodmíněných skoků
Instrukce podmíněných a nepodmíněných skoků implementovaných mikroprocesorem R4300i jsou zvláštní tím, že u podmíněných skoků lze typem instrukce určit, zda se má v případě NEprovedení skoku provést i branch delay slot, tj. instrukce uvedená ihned za skokem (písmeno L na konci instrukce je zkratkou slova „likely“, resp. „likely not taken“). Tato technologie měla vést ke zvýšení hustoty kódu se zachováním všech předností branch delay slotů. Povšimněte si taktéž způsobu skoku do subrutiny – namísto uložení návratové hodnoty do zásobníku se používají skoky typu jump-and-link, podobně jako u několika dalších mikroprocesorů s architekturou RISC:
# | Skoky | Operandy | Význam |
---|---|---|---|
1 | BEQ | rs,rt,offset | skok při podmínce rs=rt |
2 | BEQL | rs,rt,offset | skok při podmínce rs=rt |
3 | BGEZ | rs,offset | skok při podmínce rs>=0 |
4 | BGEZAL | rs,offset | skok do subrutiny při podmínce rs>=0 |
5 | BGEZALL | rs,offset | skok do subrutiny při podmínce rs>=0 |
6 | BGEZL | rs,offset | skok při podmínce rs>=0 |
7 | BGTZ | rs,offset | skok při podmínce rs>0 |
8 | BGTZL | rs,offset | skok při podmínce rs>0 |
9 | BLEZ | rs,offset | skok při podmínce rs<=0 |
10 | BLEZL | rs,offset | skok při podmínce rs<=0 |
11 | BLTZ | rs,offset | skok při podmínce rs<0 |
12 | BLTZAL | rs,offset | skok do subrutiny při podmínce rs<0 |
13 | BLTZALL | rs,offset | skok do subrutiny při podmínce rs<0 |
14 | BLTZL | rs,offset | skok při podmínce rs<0 |
15 | BNE | rs,rt,offset | skok při podmínce rs!=rt |
16 | BNEL | rs,rt,offset | skok při podmínce rs!=rt |
17 | J | target | nepodmíněný skok |
18 | JAL | target | skok do subrutiny |
19 | JALR | rs,rd | skok do subrutiny (uloží původní adresu do registru) |
20 | JR | rs | návrat ze subrutiny (skočí na adresu uloženou v registru) |
10. Instrukce pro vyvolání výjimky (trap)
Na základě splnění určité podmínky je možné vyvolat výjimku, k čemuž slouží instrukce typu trap, které tak do jisté míry suplují podmíněné skoky (při vyvolání výjimky lze zjistit návratovou adresu ze speciálního registru EPC):
# | Vyvolání výjimky | Operandy | Význam |
---|---|---|---|
1 | TEQ | rs,rt | vyvolání výjimky při splnění podmínky rs=rt |
2 | TEQI | rs,immediate | vyvolání výjimky při splnění podmínky rs=konstanta |
3 | TGE | rs,rt | vyvolání výjimky při splnění podmínky rs>=rt (signed) |
4 | TGEI | rs,immediate | vyvolání výjimky při splnění podmínky rs>=konstanta |
5 | TGEIU | rs,immediate | vyvolání výjimky při splnění podmínky rs>=konstanta |
6 | TGEU | rs,rt | vyvolání výjimky při splnění podmínky rs>=rt (unsigned) |
7 | TLT | rs,rt | vyvolání výjimky při splnění podmínky rs<rt (signed) |
8 | TLTI | rs,immediate | vyvolání výjimky při splnění podmínky rs<konstanta |
9 | TLTIU | rs,immediate | vyvolání výjimky při splnění podmínky rs<konstanta |
10 | TLTU | rs,rt | vyvolání výjimky při splnění podmínky rs<rt (unsigned) |
11 | TNE | rs,rt | vyvolání výjimky při splnění podmínky rs!=rt |
12 | TNEI | rs,immediate | vyvolání výjimky při splnění podmínky rs!=konstanta |
11. Speciální instrukce
Zbývá nám již pouze popis dvou speciálních instrukcí, z nichž jedna slouží pro ladění a druhá pro vyvolání systémové subrutiny:
# | Speciální instrukce | Operandy | Význam |
---|---|---|---|
1 | BREAK | offset | breakpoint |
2 | SYSCALL | offset | vyvolání systémové rutiny |
12. Instrukce pro matematický koprocesor
Jak jsme si již řekli v×předchozích kapitolách, obsahoval mikroprocesor R4300i mj. i koprocesor CP1 sloužící pro provádění operací s registry obsahujícími hodnoty uložené ve formátu plovoucí řádové čárky. Tento matematický koprocesor neobsahoval například podporu pro goniometrické, logaritmické či exponenciální funkce, ale „pouze“ pro základní aritmetické operace (součet, rozdíl, součin, podíl) doplněné o funkce pro zaokrouhlování a o výpočet druhé odmocniny. V porovnání s matematickým koprocesorem 80×87 se sice jedná o mnohem menší počet operací, výhodou CP1 však bylo (kromě menší obsazené plochy čipu) mnohem větší množství pracovních registrů (32 oproti osmi) a tím pádem i širší možnosti při minimalizaci počtu přístupů do operační paměti, předávání operandů volaným funkcím/procedurám atd. Funkce matematického koprocesoru jsou vypsány pod tímto odstavcem. V tabulce s funkcemi se používají následující zkratky:
# | Označení | Význam |
---|---|---|
1 | fs | zdrojový FP registr FGR0 až FGR31 |
2 | fd | cílový FP registr FGR0 až FGR31 |
3 | ft | většinou druhý operand u instrukcí typu FGRz = FGRx op. FGRy |
4 | rt | cíl skoku či zdrojový/cílový celočíselný registr atd. (různý význam) |
5 | offset | šestnáctibitový (relativní) offset |
6 | fmt | formát operandů, zde single/float či double |
Následuje již slíbená tabulka s instrukcemi matematického koprocesoru CP1:
# | Instrukce | Operandy | Význam |
---|---|---|---|
1 | ABS.fmt | fd,fs | výpočet absolutní hodnoty |
2 | ADD.fmt | fd,fs,ft | součet |
3 | BC1F | offset | skok při nastavení FP příznaku na false (příznak nastaven instrukcí C.cond.fmt) |
4 | BC1FL | offset | skok při nastavení FP příznaku na false (příznak nastaven instrukcí C.cond.fmt) |
5 | BC1T | offset | skok při nastavení FP příznaku na true (příznak nastaven instrukcí C.cond.fmt) |
6 | BC1TL | offset | skok při nastavení FP příznaku na true (příznak nastaven instrukcí C.cond.fmt) |
7 | C.cond.fmt | fs,ft | porovnání obsahu dvou registrů |
8 | CEIL.L.fmt | fd,fs | funkce ceil(), zaokrouhlení FP hodnoty směrem k nekonečnu |
9 | CEIL.W.fmt | fd,fs | funkce ceil(), zaokrouhlení FP hodnoty směrem k nekonečnu |
10 | CFC1 | rt,fs | přesun řídicího slova koprocesoru do celočíselného registru |
11 | CTC1 | rt,fs | přesun hodnoty z celočíselného registru do řídicího slova koprocesoru |
12 | CVT.D.fmt | fd,fs | konverze na hodnotu typu double |
13 | CVT.L.fmt | fd,fs | konverze na hodnotu typu fixed point (long) |
14 | CVT.S.fmt | fd,fs | konverze na hodnotu typu single/float |
15 | CVT.W.fmt | fd,fs | konverze na hodnotu typu fixed point (int/word) |
16 | DIV.fmt | fd,fs,ft | podíl |
17 | DMFC1 | rt,fs | přesun hodnoty z FP registru do celočíselného registru |
18 | DMTC1 | rt,fs | přesun hodnoty z celočíselného registru do FP registru |
19 | FLOOR.L.fmt | fd,fs | funkce floor(), zaokrouhlení FP hodnoty směrem k zápornému nekonečnu |
20 | FLOOR.W.fmt | fd,fs | funkce flool(), zaokrouhlení FP hodnoty směrem k zápornému nekonečnu |
21 | LDC1 | ft,offset(base) | načtení FP hodnoty z operační paměti |
22 | LWC1 | ft,offset(base) | načtení FP hodnoty z operační paměti |
23 | MFC1 | rt,fs | přesun z FP registru do celočíselného registru |
24 | MOV.fmt | fd,fs | přesun hodnoty mezi dvojicí FP registrů |
25 | MTC1 | rt,fs | přesun hodnoty z celočíselného registru do FP registru |
26 | MUL.fmt | fd,fs,ft | součin |
27 | NEG.fmt | fd,fs | negace (změna znaménka) |
28 | ROUND.L.fmt | fd,fs | funkce round(), zaokrouhlení (long) |
29 | ROUND.W.fmt | fd,fs | funkce round(), zaokrouhlení (int) |
30 | SDC1 | ft,offset(base) | uložení FP hodnoty do operační paměti |
31 | SQRT.fmt | fd,fs | druhá odmocnina |
32 | SUB.fmt | fd,fs,ft | rozdíl |
33 | SWC1 | ft,offset(base) | uložení FP hodnoty do operační paměti |
34 | TRUNC.L.fmt | fd,fs | funkce trunc(), oříznutí desetinné části (long) |
35 | TRUNC.W.fmt | fd,fs | funkce trunc(), oříznutí desetinné části (int) |
13. Obsah následující části seriálu
V následující části tohoto seriálu si popíšeme zejména grafický subsystém herní konzole Nintendo 64, protože právě v možnostech i celkové výkonnosti těchto subsystémů spočívají největší rozdíly mezi herními konzolemi páté generace. Zaměříme se především na možnosti vykreslování polygonů a využívání textur; taktéž si možnosti Nintenda 64 porovnáme s konkurenčními herními konzolemi Sega Saturn a samozřejmě i se Sony PlayStation.
14. Odkazy na Internetu
- Don't Blame Rare, Blame Rambus
http://www.therwp.com/forums/showthread.php?t=881 - RDRAM
http://en.wikipedia.org/wiki/RDRAM - MIPS Architecture Overview
http://tams-www.informatik.uni-hamburg.de/applets/hades/webdemos/mips.html - MIPS Technologies R3000
http://www.cpu-world.com/CPUs/R3000/ - Sony PlayStation (Wikipedia)
http://en.wikipedia.org/wiki/PlayStation_(console) - The Official PlayStation muzeum
http://playstationmuseum.com/playstation-systems/ - CPU-collection: IDT R3010 FPU
http://www.cpu-collection.de/?tn=0&l0=co&l1=IDT&l2=R3010+FPU - The MIPS R2000 Instruction Set
http://suraj.lums.edu.pk/~cs423a05/Reference/MIPSCodeTable.pdf - Maska mikroprocesoru RISC 1
http://www.cs.berkeley.edu/~pattrsn/Arch/RISC1.jpg - Maska mikroprocesoru RISC 2
http://www.cs.berkeley.edu/~pattrsn/Arch/RISC2.jpg - The MIPS Register Usage Conventions
http://pages.cs.wisc.edu/~cs354–2/beyond354/conventions.html - C.E. Sequin and D.A.Patterson: Design and Implementation of RISC I
http://www.eecs.berkeley.edu/Pubs/TechRpts/1982/CSD-82–106.pdf - Berkeley RISC
http://en.wikipedia.org/wiki/Berkeley_RISC - Great moments in microprocessor history
http://www.ibm.com/developerworks/library/pa-microhist.html - Great Microprocessors of the Past and Present
http://www.cpushack.com/CPU/cpu1.html - Sega documentation
http://koti.kapsi.fi/~antime/sega/docs.html - 1995 Programming on the Sega Saturn
http://cowboyprogramming.com/2010/06/03/1995-programming-on-the-sega-saturn/ - Sega Myths-Saturn was the most difficult console to program for of 5th Gen
http://forums.sega.com/showthread.php?313485-Sega-Myths-Saturn-was-the-most-difficult-console-to-program-for-of-5th-Gen - SuperH RISC engine Family
http://www.renesas.com/products/mpumcu/superh/index.jsp - Sega Saturn
http://en.wikipedia.org/wiki/Sega_saturn - Jaguar Sector – II
http://www.jaguarsector.com/index.php - Atari Age: Atari Jaguar History
http://www.atariage.com/Jaguar/history.html - Jaguar
http://www.giantbomb.com/jaguar/3045–28/ - Consoles that won't die: The Atari Jaguar
http://venturebeat.com/2013/04/25/consoles-that-wont-die-atari-jaguar/ - Atari Jaguar and Atari Jaguar CD
http://videogamecritic.com/jaguarinfo.htm - Atari Jaguar Documentation (Forum)
http://www.jaguarsector.com/index.php?showforum=65 - Atari Jaguar Programming (Forum)
http://www.jaguarsector.com/index.php?showforum=63 - The Jaguar Underground Documentation
http://justclaws.atari.org/devcats/dox/dox.htm - Blitter (Wikipedia CZ)
http://cs.wikipedia.org/wiki/Blitter - Blitter (Wikipedia EN)
http://en.wikipedia.org/wiki/Blitter - Bit blit
http://en.wikipedia.org/wiki/Bit_blit - Disassembler for the portable Jaguar DSP emulator (zdrojový kód s instrukcemi)
http://mamedev.org/source/src/emu/cpu/jaguar/jagdasm.c.html - Fourth-Generation Consoles
http://gaming.wikia.com/wiki/Fourth-Generation_Consoles - Fifth-Generation Consoles
http://gaming.wikia.com/wiki/Fifth-Generation_Consoles - History of video game consoles (fifth generation)
http://en.wikipedia.org/wiki/History_of_video_game_consoles_(fifth_generation) - Atari Jaguar
http://gaming.wikia.com/wiki/Atari_Jaguar - Atari Jaguar Games
http://gaming.wikia.com/wiki/List_of_Atari_Jaguar_games - MyMedia Games Network Retrospective – Nintendo Super FX chip
http://psp.mmgn.com/News/MyMedia-Games-Network-Retrospe-G6W - Wikipedia: Super FX
http://en.wikipedia.org/wiki/Super_FX - IGN: Top 25 Consoles
http://www.ign.com/top-25-consoles/13.html - Sega Mega Drive
http://sega.jp/archive/segahard/md/ - The16bit Era Of Console Video Games
http://tvtropes.org/pmwiki/pmwiki.php/Main/The16bitEraOfConsoleVideoGames - The Console Wars
http://www.cracked.com/funny-2590-the-console-wars/ - Console Wars
http://tvtropes.org/pmwiki/pmwiki.php/Main/ConsoleWars - Era of the „Bit Wars“
http://www.gtplanet.net/forum/threads/era-of-the-bit-wars.119796/ - Rez Wars: How the Bit Wars never really ended
http://www.ign.com/blogs/beastmastertoad/2013/01/31/rez-wars-how-the-bit-wars-never-really-ended - Which system ended the „Bit Wars“?
http://atariage.com/forums/topic/199163-which-system-ended-the-bit-wars/