Obsah
1. Šestnáctibitové mikrořadiče TI řady MSP430
4. Pracovní registry mikroprocesoru
5. Struktura stavového registru
6. Instrukční sada čipů MSP430
8. Adresování s registrem R0 (PC)
9. Speciální adresovací režimy při použití registrů R2 a R3 – generátory konstant
13. Instrukce s dvojicí operandů
14. Instrukce s jedním operandem
1. Šestnáctibitové mikrořadiče TI řady MSP430
Při popisu mikrořadičů nesmíme zapomenout na oblíbenou a poměrně často používanou řadu šestnáctibitových čipů založených na jádru MSP430. Tyto čipy vyrábí společnost Texas Instruments, do jejíhož portfolia náleží i další (architektonicky zcela odlišné) čipy – digitální signálové procesory (TMS320Cxx a další) i MSP432 (i přes podobné jméno jsou tyto čipy založeny na ARMovském jádru Cortex-M4F). Popis mikroprocesorových a mikrořadičových jader MSP430 jsem schválně zařadil ihned za popis jader H8, protože tyto architektury mají mnoho vlastností společných.
U jader řady MSP430 můžeme vidět inspiraci jak v RISCových procesorech, tak i v oblíbených čipech s architekturou CISC, mezi něž v tomto případě počítám především Motorolu 68000 či osmibitový procesor Motorola 6809. Mezi „RISCové“ vlastnosti patří především minimalisticky pojatá instrukční sada s pouhými 27 instrukcemi a poměrně rozsáhlá množina pracovních registrů se šestnácti 16bitovými registry (ovšem pouze dvanáct těchto registrů je skutečně obecně použitelných, protože první čtyři registry mají odlišné funkce).
Naopak mezi „CISCové“ vlastnosti můžeme zařadit ortogonalitu instrukční sady, protože prakticky každá instrukce může využít libovolný dostupný adresovací režim. Z toho mj. vyplývá i další typicky CISCová vlastnost – existence instrukcí, které dokážou pracovat s operandy uloženými v operační paměti, aniž by bylo nutné jeden či oba operandy nejprve přenést do nějakého pracovního registru (v tomto případě ovšem instrukce pochopitelně trvají delší dobu; základní doba trvání je totiž pouhý jeden takt). V tomto ohledu jsou čipy MSP430 pro programátory mnohem příjemnější, než například řada 8086, kde je patrné, že vznikla vývojem z osmibitových mikroprocesorů s akumulátorem.
2. Režimy činnosti MSP430
Šestnáctibitové mikrořadiče jsou v praxi používány mj. i z toho důvodu, že jsou (alespoň většinou) navrženy pro použití v režimech nízké spotřeby, což je důležité například u aplikací napájených z monočlánků, solárních článků či z akumulátorů s malou kapacitou (klasickým příkladem jsou termostaty či různá další „inteligentní“čidla). U mikrořadičů MSP430 má programátor k dispozici hned několik režimů činnosti, mezi kterými se může explicitně (programově) či automaticky (na základě externí události či při „probuzení“ watchdogu) přepínat. V páté kapitole si popíšeme strukturu stavového registru, v němž se mj. nachází i čtyři bity s označením CPUOFF, OSCOFF, SCG0 a SCG1, jejichž modifikací lze zajistit přepnutí mezi takzvaným aktivním režimem a jedním z pěti režimů s nízkou spotřebou (v originální dokumentaci se poněkud nadneseně nazývají ultralow-power).
Proč jsou vlastně tyto bity součástí stavového registru? Je to poměrně elegantní řešení mnoha problémů, protože při příchodu přerušení, které mnohdy vede k nutnosti přepnutí režimu mikrořadiče, je celý obsah stavového registru uložen na zásobník a na konci přerušovací rutiny je tento registr automaticky obnoven, čímž se celý čip vrátí do původního programátorem zvoleného módu.
3. Organizace operační paměti
Původní čipy MSP430 (bez X na konci) dokážou adresovat 64 kB paměti. Tento rozsah je rozdělen do několika oblastí, které jsou naznačeny na následujícím obrázku:
+------------------------------+ 0xffff | | | Tabulka pro vektory přerušení| | | 0xffe0 +------------------------------+ 0xffdf | | | Flash/ROM | | | 0x???? +------------------------------+ | | | RAM | | | 0x0200 +------------------------------+ 0x01ff | | | Oblast, do které se mapují | | buffery atd. HW modulů | adresováno po slovech | | 0x0100 +------------------------------+ 0x00ff | | | Oblast, do které se mapují | | buffery atd. HW modulů | adresováno po bajtech | | 0x0010 +------------------------------+ 0x000f | | | SFR - oblast řídicích a | | stavových registrů HW | adresováno po bajtech | | 0x0000 +------------------------------+
Poznámka: u některých čipů nalezneme taktéž oblast ROM o kapacitě jednoho kilobajtu. Tato ROM obsahuje bootloader (pro přenos OS přes sériovou linku) a je mapována na adresy 0×0c00 až 0×0fff.
4. Pracovní registry mikroprocesoru
Vzhledem k tomu, že procesory a mikrořadiče řady MSP430 zdědily některé své vlastnosti z RISCových procesorů, asi nás příliš nepřekvapí, že počet pracovních registrů je poměrně vysoký. Programátoři mají k dispozici celkem šestnáct pracovních registrů, přičemž každý registr má šířku šestnácti bitů. Ve skutečnosti je však pouze dvanáct těchto registrů skutečně univerzálně použitelných, neboť další čtyři registry mají či mohou mít speciální význam. Konkrétní vlastnosti jednotlivých pracovních registrů nám ukáže následující tabulka:
Označení registru | Jméno | Stručný popis |
---|---|---|
R0, PC | Program Counter | programový čítač |
R1, SP | Stack Pointer | ukazatel na vrchol zásobníku |
R2, SR, CG1 | Status Register | stavový registr + generátor konstant |
R3, ZR, CG2 | Zero Register | nulový registr + generátor konstant |
R4 | General Purpose | běžný pracovní registr |
R5 | General Purpose | běžný pracovní registr |
R6 | General Purpose | běžný pracovní registr |
R7 | General Purpose | běžný pracovní registr |
R8 | General Purpose | běžný pracovní registr |
R9 | General Purpose | běžný pracovní registr |
R10 | General Purpose | běžný pracovní registr |
R11 | General Purpose | běžný pracovní registr |
R12 | General Purpose | běžný pracovní registr |
R13 | General Purpose | běžný pracovní registr |
R14 | General Purpose | běžný pracovní registr |
R15 | General Purpose | běžný pracovní registr |
Poznámka: mnoho instrukcí dokáže pracovat s osmibitovými či šestnáctibitovými operandy. Při použití osmibitových operandů je použita jen polovina pracovního registru.
Poznámka 2: zápis do registru R3 nemění jeho hodnotu, stále zde bude uložena nula. Toho bylo možné využít při snížení počtu instrukcí procesoru.
5. Struktura stavového registru
Registr R2 obsahuje čtyři stavové bity (příznaky) obsahující informace o právě dokončené aritmetické operaci (overflow, negative, carry a zero), čtyři řídicí bity určené pro volbu režimu činnosti procesoru a další řídicí bit, kterým se povolují či naopak zakazují všechna maskovatelná přerušení. Zbývajících sedm bitů stavového registru R2 je rezervováno pro pozdější využití. Podívejme se nyní na přesnou strukturu stavového registru:
Bit | Označení | Význam zkratky | Stručný popis |
---|---|---|---|
15 | × | × | rezervováno |
14 | × | × | rezervováno |
13 | × | × | rezervováno |
12 | × | × | rezervováno |
11 | × | × | rezervováno |
10 | × | × | rezervováno |
9 | × | × | rezervováno |
8 | V | overflow | přetečení při práci s čísly se znaménkem |
7 | SCG1 | System Clock Generator | povolení či zákaz SMCLK (Sub-system Master Clock) |
6 | SCG0 | System Clock Generator | povolení či zákaz DCO (Digitally Controlled Oscillator) |
5 | OSCOFF | OSCillator OFF | povolení či zákaz oscilátoru LFXT1 (podrobnější vysvětlení příště) |
4 | CPUOFF | CPU OFF | vypnutí CPU (čip bude čekat na přerušení, watchdog atd.) |
3 | GIE | General Interrupt Enable | povolení či zákaz všech maskovatelných přerušení |
2 | N | negative | příznak záporného výsledku předchozí operace |
1 | Z | zero | příznak nulového výsledku předchozí operace |
0 | C | carry | příznak přenosu při práci s čísly bez znaménka |
Poznámka: všechny čtyři stavové bity (příznaky) overflow, negative, carry a zero jsou nastaveny korektně bez ohledu na to, zda byla ALU operace provedena s bajty či se šestnáctibitovými slovy.
6. Instrukční sada čipů MSP430
Instrukční sada čipů MSP430 je z pohledu programátora velmi snadno pochopitelná, protože obsahuje pouze 27 různých instrukcí. Význam některých instrukcí se však může změnit (resp. přesněji řečeno rozšířit) při použití určitého adresovacího režimu, protože nesmíme zapomenout na to, že v sadě pracovních registrů se nachází i programový čítač PC, ukazatel na vrchol zásobníku SP a registry R2 a R3, které se používají jako takzvané generátory konstant. V určitém ohledu můžeme MSP430 považovat za RISCové procesory, ovšem oproti klasickým RISCovým architekturám se v případě MSP430 setkáme s některými odlišnostmi – komplikovanějšími adresovacími režimy, použitím instrukcí s proměnnou délkou, možností používat jako zdrojový či cílový operand buňku v operační paměti atd.
Poznámka: assemblery pro procesory MSP430 akceptují použití aliasů některých instrukcí (CLR atd.) i použití zápisu typu mov #1234, R4, což sice striktně řečeno není validní instrukce, ale lze ji snadno nahradit již plně validní instrukcí mov @R0+, R4, za níž následuje šestnáctibitová konstanta 1234 (pro více informací viz navazující kapitoly).
7. Adresovací režimy
Většina instrukcí pracuje s dvojicí zdrojových operandů a jedním operandem cílovým. Ovšem vzhledem k tomu, že instrukční slova mají šířku pouze šestnáct bitů, není možné použít takzvaný tříadresový kód, který známe z některých 32bitových RISCových architektur (příkladem může být architektura MIPS, u níž se ale při použití instrukčních slov o šířce třiceti dvou bitů mnohdy zbytečně plýtvá pamětí). Z tohoto důvodu je vždy jeden ze zdrojových operandů současně i operandem cílovým. Navíc se ještě počet adresovacích režimů (alespoň zdánlivě) snížil, zejména při porovnání s konkurenčními procesory H8, jejichž osmibitové varianty nabízí jedenáct adresovacích režimů. Čipy MSP430 sice nabízí programátorům pouze čtyři základní adresovací režimy, ovšem tento na první pohled malý počet je ve skutečnosti vyvážen tím, že mezi pracovními registry je i PC (Program Counter) a SP (Stack Pointer), což vede k některým zajímavým důsledkům, o nichž se zmíníme v navazující kapitole. Adresovací režimy se odlišují podle toho, zda jsou použity pro zdrojový či pro cílový operand.
Podívejme se nyní na následující dvojici tabulek, které jednotlivé režimy popisují (povšimněte si, jak se zápis v assembleru podobá zápisu používaném u čipů H8):
Adresovací režimy pro zdrojový operand
Bity v instrukci | Zápis v assembleru | Název režimu | Stručný popis |
---|---|---|---|
00 | Rn | Register direct | registr Rn obsahuje zdrojový operand |
01 | offset(Rn) | Register indexed | zdrojový operand je uložen na adrese Rn+offset |
10 | @Rn | Register indirect | registr Rn je použit ve funkci ukazatele |
11 | @Rn+ | Register indirect with post-increment | stejné jako předchozí režim, ovšem registr je po provedení operace zvýšen o 1 či 2 podle typu operandů (bajt či slovo) |
V případě, že je použit režim offset(Rn), je ihned za instrukčním slovem uložen šestnáctibitový offset. Instrukce tedy mohou mít proměnnou délku.
Adresovací režimy pro cílový operand
Bity v instrukci | Zápis v assembleru | Název režimu | Stručný popis |
---|---|---|---|
0 | Rn | Register direct | do registru Rn je zapsán výsledek operace |
1 | offset(Rn) | Register indexed | výsledek operace bude uložen na adresu Rn+offset |
Opět platí, že pokud je použit režim offset(Rn), je ihned za instrukčním slovem uložen šestnáctibitový offset. Tato vlastnost je zachována i při použití různých offsetů pro zdrojový a cílový operand, například:
mov 2(R5), 1234(R6)
V tomto případě má celá instrukce délku šesti bajtů (tří slov) a její význam je zhruba následující (ve skutečnosti se jednotlivé kroky mohou částečně překrývat):
- Vypočti ADDR1=R5+2
- Vypočti ADDR2=R6+1234
- Přečti slovo z adresy ADDR1
- Ulož toto slovo na adresu ADDR2
- Zvyš PC/R0 o hodnotu 6 (krok na další instrukci)
8. Adresování s registrem R0 (PC)
Zápis offset(PC) může ve skutečnosti označovat jakoukoli přesně definovanou adresu v operační paměti, protože assembler již při překladu programu ví, jaká je při spuštění této instrukce hodnota registru PC (programy obecně nejsou realokovatelné). To například znamená, že při programování v assembleru můžeme použít i následující zápis popisující instrukci pro přenos slova mezi dvěma absolutními adresami označenými návěštími (labels) FOO a BAR:
mov FOO, BAR
Assembler z tohoto zápisu automaticky vygeneruje instrukci:
mov x(PC), y(PC)
Neboli
mov x(R0), y(R0)
Kde x a y jsou assemblerem vypočteny takovým způsobem, aby platilo x=FOO-PC a y=BAR-PC.
Zápis @R0 označuje další slovo uložené za instrukcí, které je možné použít ve funkci vstupního operandu. Ovšem kdyby se například jednalo o instrukci pro součet, znamenalo by to, že po provedení součtu by se mikrořadič pokusil přečíst další slovo (obsahující konstantu pro součet) a interpretovat ho jako instrukci, takže se pravděpodobně se zápisem @R0 příliš často nesetkáme.
Ovšem mnohem zajímavější je zápis @R0+, který lze použít pro zdrojový operand ve významu: „přečti šestnáctibitové slovo následující za instrukcí, použij ho jako zdrojový operand a poté posuň PC/R0 až za toto slovo“. Tímto jednoduchým trikem vlastně dokážeme jako zdrojový operand použít šestnáctibitovou konstantu, která je uložena přesně tam, kde ji potřebujeme mít – v paměti ROM/EPROM, a to ihned u instrukce. Dále se ušetří nutnost použití konstanty vyjadřující adresu zdrojového operandy (ušetří se dva bajty). Podle mého názoru se jedná o velmi elegantní způsob, který například zabraňuje problémům, s nimiž se setkávají programátoři používající procesory ARM, u nichž se musí obecné konstanty (které nelze snadno vypočítat v instrukcích MOV a MVN) přidávat až za vlastní subrutiny.
Poznámka: assemblery procesorů MSP430 obvykle rozeznávají zápis konstanty ve tvaru #1234, který je převeden na výše uvedené adresování registrem PC/R0. Tento režim se v manuálech nazývá immediate mode.
9. Speciální adresovací režimy při použití registrů R2 a R3 – generátory konstant
Registry R2 a R3 mohou mít ve chvíli, kdy jsou použity jako zdrojové operandy, význam takzvaných generátorů konstant, Připomeňme si, že registr R2 je aliasem pro stavový registr a R3 pro registr obsahující konstantní nulu. To ovšem platí jen ve chvíli, kdy jsou tyto registry použity v adresovacím režimu Register Mode, tj. když se přímo čte jejich obsah. Pokud je použit odlišný adresovací režim, je chování registrů R2 a R3 odlišné, neboť mohou generovat pět různých konstant (šestou konstantou je nula při použití R3 jako přímého zdrojového operandu. Podívejme se tedy na vliv jednotlivých adresovacích režimů při použití registrů R2 a R3:
Bity v instrukci | Zdrojový registr | Konstanta | Stručný popis |
---|---|---|---|
00 | R2 | × | běžný přístup k obsahu registru R2 (Register mode) |
01 | R2 | (0) | absolutní adresování, 16bitová adresa je uložena ihned za instrukčním slovem |
10 | R2 | #4 | |
11 | R2 | #8 | |
00 | R3 | #0 | |
01 | R3 | #1 | |
10 | R3 | #2 | |
11 | R3 | #-1 (0×ffff) |
Poznámka: povšimněte si, že vlastně žádnou funkcionalitu neztrácíme, protože ani R2 ani R3 nemají v režimech @Rn atd. žádný praktický význam.
Díky existenci těchto adresovacích režimů je možné v programech používat šestici výše zmíněných konstant, které nevyžadují, aby se za instrukčním slovem nacházela skutečná konstanta (to zajistí assembler automaticky). Program je tak kratší a je prováděn rychleji. Navíc díky tomu, že registry R2 a R3 generují „vhodné“ konstanty, dokáže assembler nahradit zápis INC dest za ADD 0(R3), dest (konstanta #1 v předchozí tabulce), CLR dest je možné nahradit za MOV R3, dest (konstanta #0 v předchozí tabulce) atd.
Ve výsledku obsahuje instrukční soubor jen 27 instrukcí, ovšem dalších 24 instrukcí je emulováno právě použitím registrů R2 a R3 a jejich speciálního významu při použití ve funkci zdrojového operandu.
10. Adresování bajtů či slov
V assembleru je možné u některých instrukcí zvolit, zda se mají operace provádět s hodnotami typu bajt či šestnáctibitové slovo. Odlišení se provádí systémem, který jsme již viděli u procesorů H8 – připojením postfixu „.b“ či „.w“ k mnemotechnickému kódu instrukce. Přitom platí, že výchozím režimem je práce se šestnáctibitovými slovy, takže se vlastně „.w“ nemusí uvádět a v praxi se ani neuvádí (uvidíme ho pouze při debugování či disassemblingu).
11. Formát instrukčních slov
Instrukce procesorů a mikrořadičů MSP430 můžeme podle formátu instrukčních slov rozdělit do pouhých tří skupin, což opět připomíná dělení instrukcí v čistě RISCových procesorech MIPS. Jednotlivé skupiny instrukcí budou podrobněji popsány v navazující trojici kapitol.
Všechny instrukce mají shodnou šířku šestnácti bitů, ovšem v některých režimech adresace se za instrukčním slovem může objevit jedna či dokonce dvě šestnáctibitové konstanty. Instrukční slova jsou rozdělena do několika bitových polí (samozřejmě ne všechna pole jsou vždy přítomna):
- Operační kód instrukce (použit vždy)
- Kód podmínky skoku (podmíněné a nepodmíněné skoky)
- Offset vůči registru PC (použit u skoků)
- Index registru pro zdrojový operand (4 bity)
- Index registru pro cílový operand (4 bity)
- Adresovací režim pro zdrojový operand (2 bity)
- Adresovací režim pro cílový operand (1 bit)
- Režim výpočtu nad bajty či slovy (1 bit)
12. Instrukce skoku (kód I)
Začneme instrukcemi skoku, které obsahují jak kód podmínky (sedm podmínek + jeden nepodmíněný skok), tak i desetibitový offset vůči registru PC, offset je před použitím vynásoben dvěma, protože instrukce mohou začínat vždy pouze na sudé adrese. Rozsah offsetu je tedy PC-1022 až PC+1024:
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | op.kód |podmínka| offset vůči registru PC | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
Povšimněte si, že operační kód instrukce má pouze tři bity, zatímco u dále popsaných formátů jsou to čtyři bity resp. dokonce devět bitů. U skoků to však nijak nevadí, protože všech osm instrukcí skoku používá naprosto stejný operační kód.
Tři bity podmínky dovolují specifikovat již zmíněných sedm skutečných podmínek a jeden nepodmíněný skok:
# | Instrukce | Alias | Význam |
---|---|---|---|
000 | JEQ | JZ | skok při podmínce zero_flag==1 |
001 | JNE | JNZ | skok při podmínce zero_flag==0 |
010 | JC | × | skok při podmínce carry_flag==1 |
011 | JNC | × | skok při podmínce carry_flag==0 |
100 | JN | × | skok při podmínce negative_flag==1 (obrácená podmínka neexistuje) |
101 | JGE | × | skok při podmínce negative_flag ⊕ overflow_flag==0 |
110 | JL | × | skok při podmínce negative_flag ⊕ overflow_flag==1 |
111 | JMP | × | nepodmíněný skok |
Poznámka: pokud je zapotřebí provést nepodmíněný skok na jakoukoli adresu, lze samozřejmě použít instrukci mov #konstanta, PC.
13. Instrukce s dvojicí operandů
Většina aritmetických a logických instrukcí obsahuje v instrukčním slovu specifikaci zdrojového operandu i operandu cílového. Zdrojový operand je specifikován adresovacím režimem (2 bity) a indexem registru, protože všechny čtyři dostupné adresovací režimy pracují s libovolným zdrojovým registrem. Cílový operand je taktéž specifikován adresovacím režimem (pouze jeden bit) a opět indexem pracovního registru. Kromě toho je nutné jedním bitem zvolit, zda se mají operace provádět s bajty nebo se šestnáctibitovými slovy:
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | op.kód |zdr.registr|AD|BW| AS |cíl.registr| +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
Význam jednotlivých bitových polí:
- Operační kód instrukce
- Index registru pro první zdrojový operand (4 bity)
- AD: adresovací režim pro zdrojový operand (2 bity)
- BW: režim výpočtu nad bajty či slovy (1 bit)
- AS: adresovací režim pro cílový operand (1 bit)
- Index registru pro druhý zdrojový a současně i cílový operand (4 bity)
Poznámka: cílový registr (a adresovací režim) samozřejmě platí i pro druhý operand – není zde použit tříadresový kód.
14. Instrukce s jedním operandem
Sedm instrukcí využívá pouze jediný zdrojový a/nebo cílový operand, takže v tomto případě mohlo dojít k dosti podstatnému zjednodušení instrukčního slova, jehož formát vypadá následovně:
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | operační kód instrukce |BW| AD | registr | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
Význam jednotlivých bitových polí:
- Operační kód instrukce
- BW: režim výpočtu nad bajty či slovy (1 bit)
- AD: adresovací režim pro zdrojový i cílový operand (2 bity)
- Index registru pro zdrojový a současně i cílový operand (4 bity)
Poznámka: podrobnější popis jednotlivých instrukcí a současně i popis standardních modulů (časovače, A/D, D/A atd.) bude uveden v pokračování tohoto článku.
15. Odkazy na Internetu
- MSP430 Development Hardware
http://www.argenox.com/library/msp430/msp430-development-hardware-chapter-1/ - MSP430™ ultra-low-power Microcontrollers
http://www.ti.com/lsds/ti/microcontrollers16-bit32-bit/msp/overview.page?HQS=msp430 - An introduction to the TI MSP430 low-power microcontrollers
http://mspgcc.sourceforge.net/manual/c68.html - MSP430 LaunchPad Tutorials
http://processors.wiki.ti.com/index.php/MSP430_LaunchPad_Tutorials - LaunchPad MSP430 Assembly Language Tutorial
http://robotics.hobbizine.com/asmlau.html - TI 16-bit and 32-bit microcontrollers
http://www.ti.com/lsds/ti/microcontrollers16-bit32-bit/overview.page - TI MSP430 (Wikipedia)
https://en.wikipedia.org/wiki/TI_MSP430 - Introduction to Getting Started with MSP430
http://www.argenox.com/library/msp430/msp430-preface-intro/ - H8/300H Series Software Manual
https://www.renesas.com/en-us/doc/products/mpumcu/001/rej09b0213_h8300h.pdf - Renesas H8/300H Series Manuals
https://www.manualslib.com/products/Renesas-H8–300h-Series-2312446.html - H8 Family
https://en.wikipedia.org/wiki/H8_Family - H8/300 and H8/300L
http://nah6.com/~itsme/download/ibutton/h8_8bit.pdf - H8 Family
https://www.renesas.com/en-us/products/microcontrollers-microprocessors/h8.html - (GCC) Status of Supported Architectures from Maintainers' Point of View
https://gcc.gnu.org/backends.html - (GCC) H8/300 Options
https://gcc.gnu.org/onlinedocs/gcc/H8_002f300-Options.html#H8_002f300-Options - GCC for SuperH,H8/300,AVR
http://mes.osdn.jp/h8/gcc.html - H8/3802, 38002S, 38004, 38104 (manuály k čipům)
https://www.renesas.com/en-us/document/hw-manual?hwLayerShowFlg=true&prdLayerId=184&layerName=H8%252F3802%252C%2B38002S%252C%2B38004%252C%2B38104&coronrService=document-prd-search&hwDocUrl=%2Fen-us%2Fdoc%2Fproducts%2Fmpumcu%2F001%2Frej09b0024_h83802.pdf&hashKey=c5e1fa0a18c01e6c789bc7b5c0184ed9 - Addressing mode (Wikipedia)
https://en.wikipedia.org/wiki/Addressing_mode - Renesas SH Instruction Set Summary
http://shared-ptr.com/sh_insns.html - SH-4 RISC Processor by HITACHI
http://www.cs.umd.edu/~meesh/cmsc411/website/projects/risc/risc.htm - SH-4 RISC Processor
http://www.cs.umd.edu/~meesh/cmsc411/website/projects/risc/sh-4.htm - SuperH RISC engine Family Features
https://www.renesas.com/en-us/products/microcontrollers-microprocessors/superh/superh-features.html - Orthogonal instruction set
https://en.wikipedia.org/wiki/Orthogonal_instruction_set - Status Register
https://en.wikipedia.org/wiki/Status_register - 6800 Instruction Set
http://www.electronics.dit.ie/staff/tscarff/6800/Instructions/instructions.htm - Assembly language today
http://beust.com/weblog/2004/06/23/assembly-language-today/ - Calling subroutines
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.kui0100a/armasm_cihcfigg.htm - Art of Assembly – Arithmetic Instructions
http://oopweb.com/Assembly/Documents/ArtOfAssembly/Volume/Chapter6/CH06–2.html - X86 Assembly/Arithmetic
https://en.wikibooks.org/wiki/X86_Assembly/Arithmetic - ARM subroutines & program stack
http://www.toves.org/books/armsub/ - Programming from the Ground Up Book – Summary
http://savannah.nongnu.org/projects/pgubook/ - The 6502 overflow flag explained mathematically
http://www.righto.com/2012/12/the-6502-overflow-flag-explained.html