Obsah
2. Stručná historie mikrořadičů PIC
3. Společné vlastnosti a rozdíly mezi mikrořadiči PIC a MCS-51
4. Rozdělení osmibitových mikrořadičů PIC do rodin
5. Instrukční sady mikrořadičů PIC
6. Skoky a instrukce typu SKIP
7. Seznam instrukcí dvanáctibitové instrukční sady
8. Obsah následující části seriálu
1. Osmibitové mikrořadiče PIC
V předchozích pěti částech seriálu o architekturách počítačů jsme si stručně popsali historii vzniku osmibitových mikrořadičů Intel 8048 (označovaných též jako MCS-48) a Intel 8051 (MCS-51) i některé aplikační oblasti, ve kterých se tyto mikrořadiče využívaly či stále využívají. Ovšem nabídka mikrořadičů, které je v současnosti možné pro amatérské či profesionální elektronická zařízení využít, není v žádném případě omezena pouze na čipy z rodiny MCS-48 a MCS-51. Jedním z alternativních typů mikrořadičů jsou – pokud prozatím zůstaneme u osmibitových architektur – i mikrořadiče PIC firmy Microchip Technology. Tato firma dnes nabízí několik set(!) různých typů těchto čipů, které se od sebe odlišují jak počtem využitelných vstupně/výstupních pinů, tak i kapacitou interní paměti dat (RAM) a taktéž interní paměti programu (ROM), počtem a typem modulů, které jsou na mikrořadiči implementovány, rozsahem povoleného napájecího napětí, rozsahem frekvencí hodinového signálu, kterým se čip řídí atd.
Obrázek 1: Pro vývoj aplikací určených pro osmibitové mikrořadiče PIC lze použít i mnoho open source nástrojů. Na tomto screenshotu jsou zobrazena některá okna nástroje gpsim (simulátoru mikrořadičů).
V následujícím textu se zaměříme především na popis těch nejjednodušších mikrořadičů firmy Microchip Technology, konkrétně čipů používajících dvanáctibitovou či čtrnáctibitovou instrukční sadu (rozdíl mezi nimi si vysvětlíme dále). Některé z těchto čipů, například celá řada PIC10F, se díky své nízké ceně a malému počtu vývodů z pouzdra podobá spíše (programovatelným) logickým obvodům než plnohodnotným mikrořadičům, ovšem právě to je jeden z důvodů, proč jsou mikrořadiče PIC tak oblíbené, jak mezi konstruktéry amatérských zařízení (nízká cena PICů a hlavně existence interní paměti typu EPROM/Flash), tak i mezi konstruktéry profesionálních výrobků, protože existence programovatelného čipu umožňuje, aby se změny v zapojení či změny funkcionality nějakého výrobku prováděly i v poměrně pozdních stadiích vývoje, bez nutnosti změny návrhu plošného spoje a dalších s tím souvisejících činností. Výkonnější typy mikrořadičů PIC, které již v mnoha ohledech konkurují platformě MCS-51 či AVR, budou popsány v následujících částech seriálu, spolu s popisem vhodných vývojových nástrojů, kitů pro odzkoušení těchto mikrořadičů v praxi atd.
Obrázek 2: Mezi jedny z nejpoužívanějších mikrořadičů PIC patří řada PIC16F87, která konstruktérům nabízí příznivý poměr mezi cenou a velikostí čipu na jedné straně a jeho možnostmi na straně druhé.
2. Stručná historie mikrořadičů PIC
Mikrořadiče PIC mají za sebou velmi dlouhý a v několika ohledech i zajímavý vývoj. Ten vlastně začal již v polovině sedmdesátých let minulého století, kdy vznikl mikrořadič Signetics 8×300. Jednalo se o jeden z prvních mikrořadičů založených na Harvardské architektuře (tj. s oddělenou pamětí pro data a pamětí pro program), který byl vytvořený na bázi bipolárních tranzistorů, podobně jako například logické obvody řady TTL. Tento mikrořadič ovšem postrádal některé důležité vlastnosti, například neměl zásobník, indexové registry a dokonce ani možnost zpracovávat přerušení (což souviselo, i když jen okrajově, s neexistencí zásobníku). Taktéž adresování paměti programu bylo poněkud složité – provádělo se přes osmibitový registr IVB, navíc aritmeticko-logická jednotka dokázala provádět pouze instrukce MOV, ADD, AND, XOR a bitové posuny. Z výše uvedených důvodů se mikrořadič Signetics 8×300 v praxi příliš nerozšířil.
Obrázek 3: Zapojení vývodů mikrořadiče PIC16F88.
V sedmdesátých letech minulého století ovšem vznikl i šestnáctibitový mikroprocesor s označením CP1600 firmy General Instruments (s touto firmou jsme se již ostatně v tomto seriálu setkali, protože stojí i za vznikem slavného zvukového čipu AY-3–8910, lidově „áýčka“). Aby se vylepšila výkonnost tohoto nepříliš úspěšného mikroprocesoru při provádění různých vstupně/výstupních operací, byl vytvořen pomocný čip nesoucí označení PIC1640, kde první tři písmena „PIC“ znamenala „Programmable Interface Controller“. Úkolem tohoto čipu byla skutečně komunikace s periferními zařízeními, kterou tak nemusel obstarávat mikroprocesor CP1600. Původní PIC1640 a na něj navazující čip PIC1650 obsahoval interní paměť ROM programovanou pomocí poslední masky přímo při výrobě čipu. Ovšem většího rozšíření se mikrořadiče PIC dočkaly až po oddělení divize mikroelektroniky z firmy General Instruments do nově vzniklé firmy s názvem Microchip Technology.
Obrázek 4: Hlavní okno simulátoru mikrořadičů PIC – aplikace gpsim.
Právě v této nové firmě došlo k zásadní proměně mikrořadiče – náhradě neměnné ROM za paměť EPROM (mazatelné ultrafialovým zářením přes okénko na čipu) a posléze i náhradě EPROM za EEPROM (elektronicky mazatelnou paměť) a Flash (vylepšenou EEPROM s větším množstvím zápisů a rychlejším blokovým algoritmem přepisu dat). Mimochodem – první mikrořadič PIC s EEPROM nesoucí jméno PIC 16C84 se díky svému významu pro další vývoj celého odvětví dostal i mezi 25 čipů, které (podle autora tohoto žebříčku) nejvíce změnily svět: „25 Microchips That Shoot The World“. PIC 16C84 je zde zmíněn například vedle známého časovače 555, osmibitového mikroprocesoru MOS 6502, 8/16bitového mikroprocesoru Intel 8088 (právě ten stál u vzniku platformy IBM PC, nikoli jeho výkonnější bráška Intel 8086) či 16/32bitového mikroprocesoru Motorola 68000 (majitelům osobních mikropočítačů značek Atari ST, Amiga či Macintosh 68k zajisté netřeba zdlouhavě představovat).
Obrázek 5: Editor paměti programu v simulátoru gpsim.
3. Společné vlastnosti a rozdíly mezi mikrořadiči PIC a MCS-51
Pojďme si nyní říci základní technické informace o osmibitových mikrořadičích PIC. Možná bude zajímavé i jejich porovnání s již popsanou řadou mikrořadičů MCS-51, s níž mají PIC některé vlastnosti téměř shodné a v některých vlastnostech se naopak obě řady čipů zcela odlišují. Z předchozích částí tohoto seriálu již víme, že mikrořadiče MCS-51 jsou založeny na osmibitové aritmeticko-logické jednotce (ALU), interní paměti údajů (RAM) o velikosti typicky 128 nebo 256 bajtů, sadě registrů speciálních funkcí (SFR), interní paměti programu (ROM), dvojici či trojici konfigurovatelných čítačů/časovačů, řadičem přerušení a taktéž konfigurovatelným synchronním i asynchronním sériovým portem. Jak paměť RAM, tak i paměť ROM je adresována po bajtech a vzhledem k tomu, že se jedná o mikrořadiče založené na Harvardské architektuře, jsou obě paměti od sebe striktně odděleny a pro přístup k jednotlivým paměťovým buňkám RAM a ROM jsou použity zcela jiné instrukce. Navíc je možné k MCS-51 připojit i externí paměti RAM a ROM a vytvořit tak vlastně základ mikropočítačového systému.
Obrázek 6: Nástroj gpsim obsahuje i disassembler.
Osmibitové mikrořadiče PIC jsou taktéž založeny na Harvardské architektuře s oddělenou pamětí údajů od paměti programu. Paměť údajů o kapacitě řádově desítky až stovky bajtů je adresovatelná po jednotlivých bajtech, stejně jako v případě MCS-51 (i když se v případě mikrořadičů PIC hovoří o sadě universálních a speciálních registrů, jedná se o obdobu RAM u čipů 8051). Ovšem struktura paměti programu je v případě mikrořadičů PIC zcela odlišná. Namísto organizace této paměti po bajtech se používají slova o šířce 12, 14 či 16 bitů (v závislosti na verzi použitého čipu, resp. na jeho rodině). Na první pohled netypická velikost zpracovávaných slov je ovšem umožněna dvěma fakty: již zmíněnou Harvardskou architekturou (která zcela odděluje ROM od RAM) a taktéž tím, že se u většiny mikrořadičů PIC (kromě některých modelů z rodiny PIC17 a PIC18) využívá pouze interní paměť programu, nikoli paměť externí, takže není zapotřebí, aby se mikrořadiče PIC musely při práci s externí pamětí „podřizovat“ okolnímu osmibitovému či šestnáctibitovému světu.
Obrázek 7: Krokování programu v nástroji gpsim.
Na tomto místě je možná vhodné se zmínit o tom, že dalším konstruktérem mikroprocesorů a mikrořadičů, který se odmítl smířit s tím, že paměti musí mít šířku datové sběrnice 8, 16 či 32 bitů, byl Chuck Moore (mj. tvůrce programovacího jazyka FORTH), který například u svého mikrořadiče F21 zvolil dvacetibitovou architekturu pamětí i aritmeticko-logické jednotky. Vraťme se však k mikrořadičům PIC: díky větší bitové šířce instrukcí bylo možné zjednodušit instrukční sadu takovým způsobem, že většina instrukcí má délku pouze jednoho slova, tj. 12, 14 nebo 16 bitů, a navíc je počet instrukcí zredukován, v některých případech pouze na 33 instrukcí (viz následující kapitoly). Mikrořadiče MCS-51 a PIC se odlišují ještě v jednom detailu: zatímco zásobník je u MCS-51 umístěn přímo v paměti údajů (takže ho lze modifikovat a navíc je jeho velikost teoreticky omezena na velikost celé RAM), u mikrořadičů PIC se zásobník nachází mimo adresovatelnou oblast a u většiny čipů je poměrně malý, což poněkud komplikuje práci programátorů například při zpracování přerušení nebo při přepínání úloh. Ovšem současně je nutné říci, že na tuto činnost nejsou mikrořadiče PIC, zejména rodiny PIC10 až PIC16, určeny a u rodiny PIC18 má již zásobník větší kapacitu.
Obrázek 8: Editace obsahu paměti RAM v nástroji gpsim.
4. Rozdělení osmibitových mikrořadičů PIC do rodin
V předchozích kapitolách jsme se prozatím bez vysvětlování dalších podrobností zmínili o tom, že osmibitové mikrořadiče PIC jsou rozděleny do takzvaných rodin. Čipy z jednotlivých rodin se od sebe odlišují především počtem vstupně/výstupních portů (a tím pádem i pinů), počtem universálních registrů (neboli kapacitou paměti údajů), kapacitou paměti programu a v neposlední řadě také instrukční sadou – nejjednodušší mikrořadiče, konkrétně se jedná o mikrořadiče spadající do rodiny PIC10, mají ve své instrukční sadě pouze 33 instrukcí, pouzdra těchto čipů mají v extrémním případě jen šest vývodů (což je například méně než počet vývodů známého obvodu 555), kapacita paměti programu dosahuje 256 nebo 512 bajtů a počet universálních registrů je roven 16 nebo 24 (takže kapacita interní RAM je 16 či 24 bajtů). Naproti tomu některé mikrořadiče z rodiny PIC18 jsou umístěny v pouzdře s 28 až 40 piny, jejich instrukční sada má 75 instrukcí, paměť pro uložení programu může mít kapacitu 8 kB a počet universálních registrů dosahuje typicky 256 bajtů.
Obrázek 9: Časovač 555 má více pinů než nejjednodušší mikrořadiče PIC.
Základní rozdělení osmibitových mikrořadičů PIC je znázorněno na následujícím obrázku. Povšimněte si, že jedním z hlavních ukazatelů je nejenom počet pinů (který omezuje i počet modulů, například přítomnost sériového portu, A/D převodníku či PWM) ale i bitová šířka instrukcí, protože u čipů s větším počtem universálních registrů (RAM) i větší kapacitou paměti programu (ROM) je nutné v instrukčním slově rezervovat větší množství bitů pro uložení indexu universálního registru nebo adresy, na které se má provést skok:
Obrázek 10: Základní rozdělení osmibitových mikrořadičů PIC. Zdroj: firma Microchip Technology.
Pro lepší porovnání možností mikrořadičů z jednotlivých rodin jsou v následující tabulce vypsány parametry některých vybraných mikrořadičů PIC:
Mikrořadič | Frekvence (MHz) | Pinů | RAM (počet registrů) | ROM (slov) | Instrukční sada – bitů | Počet instrukcí |
---|---|---|---|---|---|---|
PIC10F200 | 4 | 6–8 | 16 | 256 | 12 | 33 |
PIC10F206 | 4 | 6–8 | 16 | 512 | 12 | 33 |
PIC12F683 | 8 | 14 | 128 | 2048 | 14 | 35 |
PIC16F87 | až 20 | 18 | 368 | 4096 | 14 | 35 |
PIC18F1220 | až 40 | 18–28 | 256 | 2048 | 16 | 78 |
PIC18F1320 | až 40 | 18–28 | 256 | 4096 | 16 | 78 |
5. Instrukční sady mikrořadičů PIC
Instrukční sada osmibitových mikrořadičů PIC se v několika ohledech odlišuje od instrukční sady, se kterou jsme se seznámili při popisu mikrořadičů MCS-48 a MCS-51. Zatímco u zmíněných dvou typů mikrořadičů byla paměť programu organizována po jednotlivých bajtech a instrukce měly proměnlivou délku jeden až dva bajty i proměnlivou dobu trvání, u mikrořadičů PIC je díky širšímu instrukčnímu slovu o velikosti dvanáct až šestnáct bitů naprostá většina instrukcí uložena pouze v jednom slovu.
Obrázek 11: Source browser – součást nástroje gpsim.
Navíc je instrukční sada velmi pravidelná (v mnoha ohledech ortogonální) a s malým počtem instrukcí (nejmenší mikrořadiče mají pouze 33 instrukcí), což na jednu stranu usnadňuje život programátorům, na stranu druhou vede malá a pravidelná instrukční sada k návrhu jednoduššího řadiče, který je možné implementovat na menší ploše čipu, což je jak levnější, tak i výhodnější z hlediska příkonu celého mikrořadiče. Kromě operačního kódu instrukce se do zmíněných dvanácti až šestnácti bitů ukládá i adresa universálního registru (druhým registrem instrukce je většinou akumulátor W), index bitu u bitových operací, či část adresy, na kterou se má řízení programu přenést instrukcí skoku.
6. Skoky a instrukce typu SKIP
U instrukcí skoku se na chvíli zastavme – zatímco u naprosté většiny ostatních mikroprocesorů i mikrořadičů se v jejich instrukční sadě nachází i instrukce umožňující provádění podmíněných skoků, tj. skoků provedených po splnění nějaké podmínky (nulový, kladný či záporný výsledek předchozí aritmetické či logické operace, přetečení předchozí aritmetické operace, atd.), obsahují osmibitové mikrořadiče PIC (kromě nejvyšší řady) pouze instrukci pro provedení nepodmíněného skoku GOTO a několik instrukcí, které po splnění nějaké podmínky změní programový čítač takovým způsobem, že je následující instrukce přeskočena (skip). Podmíněný skok se tedy implementuje pomocí dvojice instrukcí – některé instrukce typu SKIP s opačnou podmínkou následovanou nepodmíněným skokem. Ovšem v některých případech se skok vůbec nemusí provádět, protože ona jediná instrukce nacházející se za SKIP může nahradit celý podmíněný blok (vyslání bitu na externí port, pokud je splněna nějaká podmínka, reset watchdogu atd.). Ve dvanáctibitové instrukční sadě se nachází následující instrukce umožňující provedení skoků popř. přeskočení jedné instrukce:
Operační kód (bin) | Jméno instrukce | Stručný popis instrukce |
---|---|---|
0010 11d fffff | DECFSZ f,d | d = f – 1, vynechání následující instrukce pokud je výsledek nula |
0011 11d fffff | INCFSZ f,d | d = f + 1, vynechání následující instrukce pokud je výsledek nula |
0110 bbb fffff | BTFSC f,b | Bit test f, vynechání následující instrukce pokud je bit nulový |
0111 bbb fffff | BTFSS f,b | Bit test f, vynechání následující instrukce pokud je bit jedničkový |
1001 kkkkkkkk | CALL k | zavolání podprogramu na adrese k |
1000 kkkkkkkk | RETLW k | návrat z podprogramu s nastavením akumulátoru |
101 kkkkkkkkk | GOTO k | skok na adresu specifikovanou devíti bity |
Obrázek 12: V některých zařízeních s mikrořadiči se využívají jednoduché paměťové moduly se sériovým přenosem adres i dat.
7. Seznam instrukcí dvanáctibitové instrukční sady
V následující tabulce je vypsána instrukční sada mikrořadičů PIC s pamětí programu organizovanou po dvanácti bitech. Povšimněte si, že instrukce lze rozdělit do čtyř kategorií, přičemž instrukce v každé kategorii mají jednotný formát. Konkrétními vlastnostmi této instrukční sady, například tím, jak jsou adresovány universální registry, se budeme zabývat v příští části tohoto seriálu:
# | Operační kód | Jméno instrukce | Stručný popis instrukce |
---|---|---|---|
01 | 0000 0000 0000 | NOP | neprovede se žádná operace |
02 | 0000 0000 0010 | OPTION | obsah akumulátoru se přesune do speciálního registru OPTION |
03 | 0000 0000 0011 | SLEEP | přechod do režimu spánku |
04 | 0000 0000 0100 | CLRWDT | reset watchdogu |
05 | 0000 0000 01ff | TRIS f | zápis akumulátoru na port (f=1..3) |
06 | 0000 001 fffff | MOVWF f | přenos akumulátoru to do universálního registru 0–31 |
07 | 0000 010 xxxxx | CLRW | vynulování akumulátoru |
08 | 0000 011 fffff | CLRF f | vynulování universálního registru 0–31 |
09 | 0000 10d fffff | SUBWF f,d | d = f – W |
10 | 0000 11d fffff | DECF f,d | d = f – 1 |
11 | 0001 00d fffff | IORWF f,d | d = f OR W |
12 | 0001 01d fffff | ANDWF f,d | d = f AND W |
13 | 0001 10d fffff | XORWF f,d | d = f XOR W |
14 | 0001 11d fffff | ADDWF f,d | d = f + W |
15 | 0010 00d fffff | MOVF f,d | d = f |
16 | 0010 01d fffff | COMF f,d | d = NOT f |
17 | 0010 10d fffff | INCF f,d | d = f + 1 |
18 | 0010 11d fffff | DECFSZ f,d | d = f – 1, vynechání následující instrukce při nulovém výsledku |
19 | 0011 00d fffff | RRF f,d | rotace doprava přes carry |
20 | 0011 01d fffff | RLF f,d | rotace doleva přes carry |
21 | 0011 10d fffff | SWAPF f,d | prohození nibblů universálního registru |
22 | 0011 11d fffff | INCFSZ f,d | d = f + 1, vynechání následující instrukce při nulovém výsledku |
23 | 0100 bbb fffff | BCF f,b | vynulování jednoho bitu universálního registru |
24 | 0101 bbb fffff | BSF f,b | nastavení (na 1) jednoho bitu universálního registru |
25 | 0110 bbb fffff | BTFSC f,b | Bit test f, vynechání následující instrukce pokud je bit nulový |
26 | 0111 bbb fffff | BTFSS f,b | Bit test f, vynechání následující instrukce pokud je bit jedničkový |
27 | 1000 kkkkkkkk | RETLW k | návrat z podprogramu s nastavením akumulátoru |
28 | 1001 kkkkkkkk | CALL k | zavolání podprogramu na adrese k |
29 | 101 kkkkkkkkk | GOTO k | skok na adresu specifikovanou devíti bity |
30 | 1100 kkkkkkkk | MOVLW k | W = k |
31 | 1101 kkkkkkkk | IORLW k | W = k OR W |
32 | 1110 kkkkkkkk | ANDLW k | W = k AND W |
33 | 1111 kkkkkkkk | XORLW k | W = k XOR W |
8. Obsah následující části seriálu
V následující části seriálu o architekturách počítačů si popíšeme tři řady osmibitových mikrořadičů firmy Microchip Technology. Bude se jednat o řady PIC10F, PIC12F a především o velmi populární řadu PIC16F, která pro mnoho typů zapojení představuje takřka ideální poměr mezi možnostmi tohoto mikrořadiče (rychlosti, kapacity obou pamětí, instalovaných modulů) a jeho velikostí (většinou se jedná o čipy s osmnácti piny), spotřebou a v neposlední řadě i jeho příznivou cenou. Taktéž si popíšeme některé vývojové a simulační nástroje, které je možné pro vývoj aplikací pro mikrořadiče PIC použít. Zaměříme se samozřejmě především na nástroje šířené ve formě open source, například na projekt picasm (assembler použitelný pro většinu typů mikrořadičů PIC), gpsim (simulátor těchto mikrořadičů), gputils (assembler, disassembler a několik dalších užitečných utilit pro vývoj) a FlashForth (de facto ucelené vývojové prostředí a současně i operační systém založený na programovacím jazyce Forth).
Obrázek 13: Vývojový kit BASIC Stamp ve verzi vybavené rozhraním universální sériové sběrnice (USB).
Obrázek 14: Vývojový kit Amicus s mikrořadičem PIC. Tento vývojový kit byl inspirován kitem Arduino určeným pro mikrořadiče Atmel AVR.
Nesmíme taktéž zapomenout ani na některé zajímavé aplikace, které ve svém zapojení využívají osmibitové mikrořadiče PIC. Jedním z těchto zařízení, které může být zajímavé například i z hlediska výuky programování, je jednoduchá vývojová deska nazvaná BASIC Stamp, jejíž součástí je jeden z čipů PIC (konkrétní verze závisí na variantě BASIC Stampu) a taktéž externí sériová paměť, v níž je uložený tokenizovaný BASICový program, jehož délka může pro variantu s 256 bajty externí paměti dosahovat cca 80 programových řádků (viz též obrázek číslo 13). Další verze BASIC Stampu je již vybavena i rozhraním universální sériové sběrnice (USB). Další zajímavou aplikací s čipy PIC je vývojový kit Amicus inspirovaný známějším kitem Arduino určeným pro změnu pro vývoj s využitím mikrořadičů Atmel AVR. Nákres vývojového kitu Amicus je uveden na čtrnáctém obrázku.9. Odkazy na Internetu
- Microchip Technology
http://www.microchip.com/ - Výběr z různých modelů mikrořadičů PIC
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=2661 - Řada mikrořadičů PIC 10
http://www.microchip.com/ParamChartSearch/chart.aspx?branchID=1009&mid=10&lang=en&pageId=74 - Řada mikrořadičů PIC 12
http://www.microchip.com/ParamChartSearch/chart.aspx?branchID=1001&mid=10&lang=en&pageId=74 - Řada mikrořadičů PIC 14
http://www.microchip.com/ParamChartSearch/chart.aspx?branchID=1008&mid=10&lang=en&pageId=74 - Řada mikrořadičů PIC 16
http://www.microchip.com/ParamChartSearch/chart.aspx?branchID=1002&mid=10&lang=en&pageId=74 - Další výběr z různých modelů mikrořadičů PIC
http://www.microchip.com/maps/microcontroller.aspx - PIC microcontroller (Wikipedia EN)
http://en.wikipedia.org/wiki/PIC_microcontroller - Mikrokontrolér PIC (Wikipedia CZ)
http://cs.wikipedia.org/wiki/Mikrokontrolér_PIC - FLASHFORTH for the PIC18F and the dsPIC30F
http://flashforth.sourceforge.net/ - FlashForth
http://www.sourceforge.net/projects/flashforth - Free Pic software tools
http://softwarepic.50webs.com/freesoft.html - What is Amicus?
http://www.picbasic.org/proton_lite.php - Amicus FAQ
http://www.myamicus.co.uk/faq.php?s=2e8d12e7f4c23e775776f4916876354b& - Microcontrollers development tools
http://www.gnupic.dds.nl/ - gpsim (Wikipedia)
http://en.wikipedia.org/wiki/Gpsim - gpsim home page
http://gpsim.sourceforge.net/gpsim.html - The FreeRTOS Project
http://www.freertos.org/ - FreeRTOS (Wikipedia)
http://en.wikipedia.org/wiki/FreeRTOS - Serial EEPROM (93C46 / 93CS46) Routines
http://www.pjrc.com/tech/8051/serial-eeprom.html - Great Microprocessors of the Past and Present (V 13.4.0)
http://jbayko.sasktelwebsite.net/cpu.html