Obsah
1. Vývoj her a grafických dem pro oslavovanou i nenáviděnou platformu PC (úvod)
3. Osmibitový či šestnáctibitový počítač?
4. Počítač bez specializovaných zákaznických obvodů
5. IBM PC z pohledu programátora
6. Co je zapotřebí k vývoji? Editor, assembler, Sysman a dostatek kafe
8. Assembler vhodný pro vývoj pro IBM PC
11. Instalace Netwide Assembleru
12. První program pro IBM PC v assembleru: Hello world!
13. Úplný zdrojový kód programu typu „Hello, world!“
14. Výsledný program, jeho spuštění v DOSBoxu
15. Zkrácené řešení ukončení procesu
17. Úplný zdrojový kód programu, který čeká na stisk klávesy
19. Repositář s demonstračními příklady
1. Vývoj her a grafických dem pro oslavovanou i nenáviděnou platformu PC (úvod)
V srpnu roku 1981, tedy před 43 lety, se začal prodávat šestnáctibitový osobní mikropočítač IBM PC. Z dnešního pohledu se sice jednalo o velmi málo výkonný stroj, ovšem v době vzniku IBM PC patřil tento mikropočítač v oblasti osobních mikropočítačů mezi špičku, alespoň co se týká hrubého výpočetního výkonu. Obsahoval šestnáctibitový mikroprocesor Intel 8088 (s vnější sběrnicí zůženou na osm bitů) taktovaný na 4,77 MHz.
Kapacita operační paměti se pohybovala od 16 kB do 256 kB (takže se ani zdaleka nedotýkala tehdy teoretické hranice 640 kB, na kterou se narazilo sice později, ale o to tvrději), pro grafiku se používala grafická karta CGA, pro profesionální textové aplikace pak karta MDA s odlišným monitorem. Zvukový výstup obstarával nechvalně známý PC
Důležité byly dva fakty – IBM PC vyráběla společnost IBM, která byla pro mnoho korporací známým a dlouhodobým partnerem. A navíc IBM PC byla do určité míry otevřená architektura se standardizovanou sběrnicí umožňující modulární design (což se ukázalo již na možnosti výběru video karty – obě nabízené karty sice byly špatné, ale ne stejně špatné).
Obrázek 1: Na tomto obrázku s motherboardem IBM PC je možná nejdůležitější sběrnice se sloty, které zde nejsou popsány.
2. Vznik konceptu IBM PC
Na přelomu let 1980 a 1981 již byly splněny všechny podmínky, které umožnily nejenom vznik konceptu PC, ale i jeho komerční úspěch, což je o to důležitější, když si uvědomíme, jak problematické a mnohdy krátkodobé byly mnohé další projekty v oblasti osmibitových domácích či 16/32bitových osobních mikropočítačů (máme totiž tendenci si pamatovat úspěšné projekty, těch neúspěšných však bylo mnohem více). Koncept osobního počítače už v té době existoval (takto se označovala například celá řada Apple II), takže v tomto ohledu firma IBM vlastně nevymyslela nic nového. Taktéž již existovaly mikroprocesory odpovídající požadavkům IBM (muselo se jednat o nezávislé výrobce – to splňovaly čipy řady 86).
Obrázek 2: Pohled do nitra počítače Apple II. V zadní části můžeme vidět sloty určené pro připojení přídavných karet.
K dispozici navíc byly i obvody nutné pro realizaci video systému (k tomu se samozřejmě ještě vrátíme, to je totiž jedna ze špatných věcí PC), DRAM s požadovanou kapacitou (začínalo se na 16kB a pokračovalo až do 64kB, teprve později se kapacita zdesateronásobila). A navíc již měla firma IBM zkušenosti z vývoje univerzálních sběrnic, protože právě existence standardizované sběrnice je fakt, který počítač IBM PC odlišoval od dalších dobových do značné míry uzavřených systémů. Možnost rozšiřování PC přes standardizovanou sběrnici byla velmi dobrou myšlenkou, která tuto platformu pomohla rozšířit.
Obrázek 3: Cesta ke konceptu IBM PC.
3. Osmibitový či šestnáctibitový počítač?
Osobní mikropočítače IBM PC byly oficiálně postaveny na mikroprocesorové architektuře Intel 8086, díky čemž je tato architektura vlastně stále živá (16bitový reálný režim zde totiž stále existuje kvůli bootstrapingu). Jednalo se o plně šestnáctibitovou architekturu, která však ideově navazovala na předchozí dvě generace osmibitových mikroprocesorů společnosti Intel, tj. na řadu Intel 8008 a především pak úspěšný Intel 8080, který se na určitou dobu stal průmyslovým standardem.
Nicméně samotné IBM PC (tedy vůbec první počítač z této rodiny) nepoužívalo mikroprocesor Intel 8086, ale jeho „osekanou“ a levnější variantu nazvanou Intel 8088. Ona osmička na konci číselného označení čipu naznačuje, že i když se interně jednalo o šestnáctibitový mikroprocesor, externí datová sběrnice byla pouze osmibitová. Interně byl ovšem Intel 8088 prakticky totožný s Intelem 8086, a to včetně aritmeticko-logické jednotky (ALU) i execution unit (EU). Odlišovala se jen jediná komponenta, a to konkrétně bus interface unit (BIU).
Otázkou zůstává, jak se na mikroprocesor Intel 8088 dívat – jedná se o osmibitový či šestnáctibitový čip? Z pohledu aritmeticko-logické jednotky a interní datové sběrnice jde o šestnáctibitový čip, z pohledu externího pak o čip osmibitový. A programátoři vlastně ani nerozliší mezi plnohodnotným čipem Intel 8086 a jeho „shrouhnutou“ variantou Intel 8088 (až na pomalejší běh programů).
4. Počítač bez specializovaných zákaznických obvodů
Použití z vnějšího pohledu „pouze“ osmibitového mikroprocesoru Intel 8088 bylo ve skutečnosti velmi dobrým inženýrským rozhodnutím, které určilo základní vlastnosti IBM PC. Znamenalo totiž, že na úkor výpočetní rychlosti (pomalejší načítání instrukcí a dat) bylo možné celé IBM PC postavit na bázi osmibitových čipů, konkrétně čipů Intel 8251 (UART), Intel 8253 (programovatelný časovač), Intel 8237/8257 (programovatelný řadič DMA), Intel 8255 (paralelní rozhraní) a konečně Intel 8259 (programovatelný řadič přerušení). K tomu připočtěme grafický subsystém, který je postaven na čipu Motorola 6845, nezávisle na tom, zda se použila karta MDA či CGA.
Důležité přitom je, že všechny výše zmíněné čipy byly běžně dostupné na trhu, dobře zdokumentované a IBM PC vůbec nepoužívalo specializované zákaznické obvody. To je v poměrně ostrém kontrastu s mnoha tehdejšími osmibitovými domácími počítači, jejichž součástí většinou zákaznické obvody byly (ULA na ZX Spectru, ANTIC, GTIA a POKEY na Atari, VIC-II a SID na Commodore C64), nemluvě o počítačích řady Atari ST a především Amiga. Počítač IBM PC tak bylo možné relativně snadno „naklonovat“ a skutečně – postupně vzniklo mnoho firem, které nabízely vlastní varianty PC, mnohdy prakticky zcela kompatibilní s originálem, někdy s nekompatibilními změnami a vylepšeními.
5. IBM PC z pohledu programátora
Z dnešního pohledu je IBM PC minimalisticky pojatým počítačem, kde mezi programátorem a vlastním hardwarem nejsou umístěny žádné další mezivrstvy, a to dokonce většinou ani drivery – většinu zařízení je totiž možné ovládat přímo pomocí řídicích registrů a popř. namapované paměti. Některé operace nabízel systém BIOS umístěný v EPROM, ovšem těchto operací je relativně málo a například pro grafický výstup jsou nedostačující či pomalé.
Navíc ani systém DOS vlastně programátorům moc nepomáhal, protože umožňoval jen práci na úrovni logických zařízení (disket, disků, tiskáren atd.), práci s adresáři, práci se soubory a základní podporu pro spouštění procesů, pro vytvoření rezidentních procesů a pro jejich ukončení (DOS je sice jednoúlohový systém, ovšem rezidentní programy mohly být spuštěny souběžně s jiným programem).
Obrázek 4: První PC skutečně mohly mít jen 16kB RAM. Ovšem tento screenshot je důležitý z jiného důvodu – ukazuje, jak nekoncepčně jsou některé části PC navrženy. Zde konkrétně služba BIOSu, která se musela jedenkrát změnit a posléze zcela ztratila význam (kapacitu RAM je nutno zjistit jinak). Podobných nutností udržení zpětné kompatibility je v oblasti PC mnoho (asi nejznámější je tzv. A20 line, což je „technologie“, která nás straší dodnes).
6. Co je zapotřebí k vývoji? Editor, assembler, Sysman a dostatek kafe
Podobně minimalisticky jako hardware je pojato i potřebné softwarové vybavení. V podstatě postačovalo jen minimum programových prostředků, konkrétně programátorský textový editor, nějaký assembler (například dobový Turbo Assembler nebo Macroassembler), linker a program typu Sysman s popisem hardware, jeho řídicích registrů, systémových volání BIOSu a systémových volání DOSu. Namísto Sysmana (český produkt, v češtině) je možné využít i další zdroje informací, například známý Ralf Brown's Interrupt List.
Náš „setup“ bude odlišný, a to:
- DOSBox pro emulaci IBM PC i systému DOS
- Libovolný programátorský editor běžící přímo ve vašem systému
- Netwide assembler nebo Flat assembler běžící přímo ve vašem systému
- Namísto Sysmana budou použity informace z tohoto článku i z článků navazujících
7. DOSBox – emulátor IBM PC
Pravděpodobně jen málo čtenářů má přístup k reálnému IBM PC (i když například pozdější XTčka se ještě dají najít, a to i ve funkčním stavu). Z tohoto důvodu budeme potřebovat vhodný emulátor PC. Tím je DOSBox, který dokáže velmi dobře emulovat jak vlastní PC, tak i mnoho video adaptérů, různých zvukových karet apod. Výhodou DOSBoxu je možnost jeho instalace jak v Linuxu, tak i ve Windows. Programy, které budeme vytvářet, budou překládány do spustitelných souborů typu COM a ty budeme spouštět triviálně takto:
$ dosbox název_programu.com
DOSBox v tomto případě interně „nabootuje“ virtuální PC, nahraje do něj obdobu systému DOS a následně náš program v tomto emulovaném prostředí spustí.
8. Assembler vhodný pro vývoj pro IBM PC
V rámci dalšího textu i navazujících článků si tvorbu aplikací pro IBM PC prakticky vyzkoušíme. Budeme k tomu ovšem potřebovat vhodný assembler. Vzhledem k tomu, že dobové assemblery, což vlastně znamená Turbo Assembler či Microsoft Macroassembler, stále nebyly uvolněny pod vhodnou licencí (i když se na internetu dají najít), použijeme některý moderní assembler, a to konkrétně takový assembler, který podporuje instrukční sadu šestnáctibitových mikroprocesorů Intel 8086/Intel 8088 a současně podporuje i vygenerování spustitelných souborů určených pro operační systém DOS. Mezi takové assemblery patří Netwide Assembler neboli NASM a taktéž Flat Assembler neboli FASM.
9. Netwide Assembler (NASM)
Jedním z volně dostupných assemblerů, které bude možné použít i pro vývoj na IBM PC, je známý Netwide Assembler (NASM). Tento assembler vznikl v době, kdy začali na operační systém Linux přecházet programátoři znající a používající operační systémy DOS a (16/32bit) Windows. Tito programátoři byli většinou dobře seznámeni s možnostmi assemblerů, které se na těchto platformách používaly nejčastěji – Turbo Assembleru (TASM) společnosti Borland i Microsoft Macro Assembleru (MASM) a tak jim možnosti na Linuxu standardního GNU Assembleru (který má své kořeny na odlišných architekturách) příliš nevyhovovaly.
Výsledkem snah o vytvoření nástroje podobnému TASMu či MASMu byl právě projekt pojmenovaný NASM, který podporuje stejný způsob zápisu operandů instrukcí a navíc ještě zjednodušuje zápis těch instrukcí, u nichž je jeden operand tvořen nepřímou adresou. NASM byl následován projektem Yasm (fork+přepis), ovšem základní vlastnosti a především pak vazba na platformu i386 a x86_64 zůstaly zachovány (to mj. znamená, že například na Raspberry Pi možnosti těchto dvou nástrojů plně nevyužijeme, což je určitě škoda, protože zrovna tento mikropočítač se poměrně dobře hodí pro výuku assembleru). Nicméně pro DOS a IBM PC nám bude tento assembler plně vyhovovat.
10. Flat Assembler (FASM)
Dalším vhodným assemblerem je FASM neboli flat assembler (nikoli fast assembler, i když i toto jméno by v tomto případě bylo poměrně příhodné). FASM má poměrně velké množství zajímavých vlastností. Jedná se o assembler určený pro platformy x86, IA-32 i x86–64. Pod těmito zkratkami se skrývá původní šestnáctibitová instrukční sada procesorů řady 8086 (což nás přesně zajímá), dále 32bitové rozšíření této instrukční sady (někdy označované i386, i686 atd. podle konkrétní varianty, dostupných pracovních registrů atd.) a konečně 64bitové rozšíření této instrukční sady.
Dále FASM podporuje generování výstupu v různých formátech, včetně „plochého“ binárního formátu (pouze kódy instrukcí a případná statická data), souborů COM z DOSu (dtto to samé, ovšem s posunutou základní adresou), formátů ELF, COFF, PE, MZ atd. K této důležité problematice se ještě vrátíme v dalším textu.
Zajímavé je, že způsob překladu či formát výstupního souboru, který assembler generuje, se nezadává přepínači zadávanými na příkazové řádce ani s využitím konfiguračních souborů. Tyto informace jsou totiž přímo součástí zdrojových kódů a navíc je zaručeno, že FASM pro stejné vstupní zdrojové kódy vždy vygeneruje bitově naprosto totožný výstup (což je poněkud paradoxně problematika, ke které se v IT zase vracíme). Samozřejmě ovšem můžeme tento koncept „ohnout“, například tak, že vstupní zdrojový soubor bude obsahovat informace o výstupním formátu, ale bude direktivou include při překladu vkládat například obecné knihovní subrutiny atd.
A navíc je samotný FASM naprogramován přímo ve FASM, tedy sám v sobě (viz jeho zdrojové kódy), což znamená, že dnes již (bez bootstrapingu, viz též Můžeme věřit překladačům? Projekty řešící schéma „důvěřivé důvěry“) může přeložit sám sebe. Díky podpoře různých platforem (16bitová, 32bitová, 64bitová) i různých výstupních formátů lze FASM přeložit (cross překladem) na různé platformy (DOS, Windows, Linux, MenuetOS…) a přitom budou výsledné spustitelné binární soubory s assemblerem naprosto totožné se soubory získanými instalací FASM například z repositářů nějaké distribuce.
11. Instalace Netwide Assembleru
V současných distribucích Linuxu nalezneme většinou právě Netwide Assembler, takže prozatím využijeme tento užitečný nástroj. Jeho instalace je většinou jednoduchá, protože nemá prakticky žádné závislosti. Příkladem může být instalace ne Fedoře 38:
$ sudo dnf install nasm Last metadata expiration check: 0:46:41 ago on Fri 28 Jun 2024 03:20:33 PM CEST. Dependencies resolved. ============================================================================================ Package Architecture Version Repository Size ============================================================================================ Installing: nasm x86_64 2.16.01-3.fc38 fedora 455 k Transaction Summary ============================================================================================ Install 1 Package Total download size: 455 k Installed size: 3.3 M Is this ok [y/N]:
Po instalaci si ověříme, že je Netwide Assembler spustitelný:
$ nasm -version NASM version 2.16.01 compiled on Jan 19 2023
12. První program pro IBM PC v assembleru: Hello world!
Nás úplně první program pro IBM PC sice bude psaný v assembleru, ale bude dodržovat zvyklosti zavedené ve slavné knize The C Programming Language. Bude se tedy jednat o program, který po svém spuštění vypíše na obrazovku zprávu „Hello, world!“ a následně se ukončí. To znamená, že budeme potřebovat realizovat dvě operace:
- Výpis zprávy na terminál (tedy na STDOUT)
- Ukončení procesu
Pro obě operace prozatím použijeme služby DOSu. Ty se volají vyvoláním softwarového přerušení 0×21, tj. instrukcí:
int 0x21
Do osmibitového registru AH se vkládá číslo operace, což v našem případě znamená:
Operace | Název | Číslo v AH |
---|---|---|
výpis řetězce | Print string | 9 |
ukončení procesu | Terminate process with return code | 4c |
Pro tisk zprávy použijeme funkci DOSu číslo 9, které se v šestnáctibitovém registru DX předá adresa zprávy. Délku není zapotřebí uvádět, protože zpráva musí být ukončena znakem „$“ (nikoli nulou!), což ovšem není pouze specifikum DOSu (ostatně tato služba byla „převzata“ ze CP/M):
; tisk retezce na obrazovku mov dx, message mov ah, 9 int 0x21
Pro ukončení procesu se obvykle používá funkce 0×4c, přičemž v registru AL lze předat návratovou hodnotu:
; ukonceni procesu a navrat do DOSu mov ah, 0x4c int 0x21
13. Úplný zdrojový kód programu typu „Hello, world!“
; Program typu "Hello, world!" urceny pro DOS a prelozitelny assemblerem NASM ; ; preklad pomoci: ; nasm -f bin -o hello.com hello.asm ; ; nebo pouze: ; nasm -o hello.com hello.asm ;----------------------------------------------------------------------------- org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 256) start: ; tisk retezce na obrazovku mov dx, message mov ah, 9 int 0x21 ; ukonceni procesu a navrat do DOSu mov ah, 0x4c int 0x21 ; retezec ukonceny znakem $ message db "Hello, world!", 0x0d, 0x0a, "$"
14. Výsledný program, jeho spuštění v DOSBoxu
Překlad výše popsaného programu provedeme příkazem:
$ nasm -o hello.com hello.asm
Výsledkem by měl být soubor o délce pouze 27 bajtů:
$ ls -la hello.com -rw-r--r--. 1 ptisnovs ptisnovs 27 Jun 30 20:13 hello.com
Systém Linux dokonce rozpozná jeho typ:
$ file hello.com hello.com: COM executable for DOS
Podívat se můžeme i na obsah tohoto souboru, který bude za všech předpokladů stejný (nezávisle na assembleru, jeho verzi, verzi Linuxu, verzi DOSu atd.):
$ od -tx1 hello.com 0000000 ba 0b 01 b4 09 cd 21 b4 4c cd 21 48 65 6c 6c 6f 0000020 2c 20 77 6f 72 6c 64 21 0d 0a 24 0000033
Program spustíme v DOSBoxu takto:
$ dosbox hello.com
Výsledek:
Obrázek 5: Obrazovka DOSboxu po spuštění našeho programu, výpisu zprávy a jeho následného ukončení (druhá zpráva je vypsána samotným DOSBoxem).
15. Zkrácené řešení ukončení procesu
Ukončení programu nemusí být realizováno funkcí DOSu 0×4c, ale pouze instrukcí retn (near return) s předáním návratového kódu v AX (tím ušetříme několik taktů a několik bajtů):
xor ax, ax ; navratovy kod retn ; navrat do DOSu
Program se tedy změní následovně:
; Program typu "Hello, world!" urceny pro DOS a prelozitelny assemblerem NASM ; ; preklad pomoci: ; nasm -f bin -o hello.com hello_shorter.asm ; ; nebo pouze: ; nasm -o hello.com hello_shorter.asm ;----------------------------------------------------------------------------- org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 256) start: ; tisk retezce na obrazovku mov dx, message mov ah, 9 int 0x21 ; ukonceni procesu a navrat do DOSu ret ; retezec ukonceny znakem $ message db "Hello, world!", 0x0d, 0x0a, "$"
Po překladu se délka zkrátí na pouhých 24 bajtů.
16. Čekání na stisk klávesy
Do našeho programu ještě přidáme čekání na stisk klávesy po výpisu zprávy. Tentokrát ovšem nevyužijeme služeb DOSu, ale přímo BIOSu. Tyto služby se vyvolávají několika SW přerušeními (zkráceně 0×00 až 0×20), protože služby BIOSu jsou rozděleny do několika skupin. Pro práci s klávesnicí jsou určeny služby volané přes přerušení 0×16, konkrétně hned první služba s AH=0. Tato služba čeká na stisk libovolné klávesy (a vrací kód této klávesy), takže její použití je triviální:
; vyprazdneni bufferu klavesnice a cekani na klavesu xor ax, ax int 0x16
Obrázek 6: Náš program je nyní propracovanější – čeká na stisk klávesy.
17. Úplný zdrojový kód programu, který čeká na stisk klávesy
; Program typu "Hello, world!" urceny pro DOS a prelozitelny assemblerem NASM ; ; preklad pomoci: ; nasm -f bin -o hello.com hello_wait.asm ; ; nebo pouze: ; nasm -o hello.com hello_wait.asm ;----------------------------------------------------------------------------- org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 256) start: ; tisk retezce na obrazovku mov dx, message mov ah, 9 int 0x21 ; vyprazdneni bufferu klavesnice a cekani na klavesu xor ax, ax int 0x16 ; ukonceni procesu a navrat do DOSu mov ah, 0x4c int 0x21 ; retezec ukonceny znakem $ message db "Hello, world!", 0x0d, 0x0a, "$"
18. Obsah navazujícího článku
Příště si již ukážeme zajímavější programátorské techniky, konkrétně práci s textovými i grafickými režimu (ne)slavné grafické karty CGA. I přes značná omezení pro tuto grafickou kartu vznikly stovky her.
19. Repositář s demonstračními příklady
Demonstrační příklady napsané v assembleru, které jsou určené pro překlad pomocí assembleru NASM, byly uložen do Git repositáře, který je dostupný na adrese https://github.com/tisnik/8bit-fame. Jednotlivé demonstrační příklady si můžete v případě potřeby stáhnout i jednotlivě bez nutnosti klonovat celý (dnes již poměrně rozsáhlý) repositář:
# | Příklad | Stručný popis | Adresa |
---|---|---|---|
1 | hello.asm | program typu „Hello world“ naprogramovaný v assembleru pro systém DOS | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hello.asm |
2 | hello_shorter.asm | kratší varianta výskoku z procesu zpět do DOSu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hello_shorter.asm |
3 | hello_wait.asm | čekání na stisk klávesy | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hello_wait.asm |
4 | hello_macros.asm | realizace jednotlivých částí programu makrem | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hello_macros.asm |
20. Odkazy na Internetu
- The Intel 8088 Architecture and Instruction Set
https://people.ece.ubc.ca/~edc/464/lectures/lec4.pdf - x86 Opcode Structure and Instruction Overview
https://pnx.tf/files/x86_opcode_structure_and_instruction_overview.pdf - x86 instruction listings (Wikipedia)
https://en.wikipedia.org/wiki/X86_instruction_listings - x86 assembly language (Wikipedia)
https://en.wikipedia.org/wiki/X86_assembly_language - Intel Assembler (Cheat sheet)
http://www.jegerlehner.ch/intel/IntelCodeTable.pdf - 25 Microchips That Shook the World
https://spectrum.ieee.org/tech-history/silicon-revolution/25-microchips-that-shook-the-world - Chip Hall of Fame: MOS Technology 6502 Microprocessor
https://spectrum.ieee.org/tech-history/silicon-revolution/chip-hall-of-fame-mos-technology-6502-microprocessor - Chip Hall of Fame: Intel 8088 Microprocessor
https://spectrum.ieee.org/tech-history/silicon-revolution/chip-hall-of-fame-intel-8088-microprocessor - Jak se zrodil procesor?
https://www.root.cz/clanky/jak-se-zrodil-procesor/ - Apple II History Home
http://apple2history.org/ - The 8086/8088 Primer
https://www.stevemorse.org/8086/index.html - flat assembler: Assembly language resources
https://flatassembler.net/ - FASM na Wikipedii
https://en.wikipedia.org/wiki/FASM - Fresh IDE FASM inside
https://fresh.flatassembler.net/ - MS-DOS Version 4.0 Programmer's Reference
https://www.pcjs.org/documents/books/mspl13/msdos/dosref40/ - INT 21 – DOS Function Dispatcher (DOS)
https://www.stanislavs.org/helppc/int21.html - DOS API (Wikipedia)
https://en.wikipedia.org/wiki/DOS_API - Bit banging
https://en.wikipedia.org/wiki/Bit_banging - IBM Basic assembly language and successors (Wikipedia)
https://en.wikipedia.org/wiki/IBM_Basic_assembly_language_and_successors - X86 Assembly/Bootloaders
https://en.wikibooks.org/wiki/X86_Assembly/Bootloaders - Počátky grafiky na PC: grafické karty CGA a Hercules
https://www.root.cz/clanky/pocatky-grafiky-na-pc-graficke-karty-cga-a-hercules/ - Co mají společného Commodore PET/4000, BBC Micro, Amstrad CPC i grafické karty MDA, CGA a Hercules?
https://www.root.cz/clanky/co-maji-spolecneho-commodore-pet-4000-bbc-micro-amstrad-cpc-i-graficke-karty-mda-cga-a-hercules/ - Karta EGA: první použitelná barevná grafika na PC
https://www.root.cz/clanky/karta-ega-prvni-pouzitelna-barevna-grafika-na-pc/ - RGB Classic Games
https://www.classicdosgames.com/ - Turbo Assembler (Wikipedia)
https://en.wikipedia.org/wiki/Turbo_Assembler - Microsoft Macro Assembler
https://en.wikipedia.org/wiki/Microsoft_Macro_Assembler - IBM Personal Computer (Wikipedia)
https://en.wikipedia.org/wiki/IBM_Personal_Computer - Intel 8251
https://en.wikipedia.org/wiki/Intel_8251 - Intel 8253
https://en.wikipedia.org/wiki/Intel_8253 - Intel 8255
https://en.wikipedia.org/wiki/Intel_8255 - Intel 8257
https://en.wikipedia.org/wiki/Intel_8257 - Intel 8259
https://en.wikipedia.org/wiki/Intel_8259 - Support/peripheral/other chips – 6800 family
http://www.cpu-world.com/Support/6800.html - Motorola 6845
http://en.wikipedia.org/wiki/Motorola_6845 - The 6845 Cathode Ray Tube Controller (CRTC)
http://www.tinyvga.com/6845 - CRTC operation
http://www.6502.org/users/andre/hwinfo/crtc/crtc.html - 6845 – Motorola CRT Controller
https://stanislavs.org/helppc/6845.html - The 6845 Cathode Ray Tube Controller (CRTC)
http://www.tinyvga.com/6845 - Motorola 6845 and bitwise graphics
https://retrocomputing.stackexchange.com/questions/10996/motorola-6845-and-bitwise-graphics - IBM Monochrome Display Adapter
http://en.wikipedia.org/wiki/Monochrome_Display_Adapter - Color Graphics Adapter
http://en.wikipedia.org/wiki/Color_Graphics_Adapter - Color Graphics Adapter and the Brown color in IBM 5153 Color Display
https://www.aceinnova.com/en/electronics/cga-and-the-brown-color-in-ibm-5153-color-display/ - The Modern Retrocomputer: An Arduino Driven 6845 CRT Controller
https://hackaday.com/2017/05/14/the-modern-retrocomputer-an-arduino-driven-6845-crt-controller/ - flat assembler: Assembly language resources
https://flatassembler.net/ - FASM na Wikipedii
https://en.wikipedia.org/wiki/FASM - Fresh IDE FASM inside
https://fresh.flatassembler.net/ - MS-DOS Version 4.0 Programmer's Reference
https://www.pcjs.org/documents/books/mspl13/msdos/dosref40/ - INT 21 – DOS Function Dispatcher (DOS)
https://www.stanislavs.org/helppc/int21.html - DOS API (Wikipedia)
https://en.wikipedia.org/wiki/DOS_API - IBM Basic assembly language and successors (Wikipedia)
https://en.wikipedia.org/wiki/IBM_Basic_assembly_language_and_successors - X86 Assembly/Arithmetic
https://en.wikibooks.org/wiki/X86_Assembly/Arithmetic - Art of Assembly – Arithmetic Instructions
http://oopweb.com/Assembly/Documents/ArtOfAssembly/Volume/Chapter6/CH06–2.html - ASM Flags
http://www.cavestory.org/guides/csasm/guide/asm_flags.html - Status Register
https://en.wikipedia.org/wiki/Status_register - Linux assemblers: A comparison of GAS and NASM
http://www.ibm.com/developerworks/library/l-gas-nasm/index.html - Programovani v assembleru na OS Linux
http://www.cs.vsb.cz/grygarek/asm/asmlinux.html - Is it worthwhile to learn x86 assembly language today?
https://www.quora.com/Is-it-worthwhile-to-learn-x86-assembly-language-today?share=1 - Why Learn Assembly Language?
http://www.codeproject.com/Articles/89460/Why-Learn-Assembly-Language - Is Assembly still relevant?
http://programmers.stackexchange.com/questions/95836/is-assembly-still-relevant - Why Learning Assembly Language Is Still a Good Idea
http://www.onlamp.com/pub/a/onlamp/2004/05/06/writegreatcode.html - Assembly language today
http://beust.com/weblog/2004/06/23/assembly-language-today/ - Assembler: Význam assembleru dnes
http://www.builder.cz/rubriky/assembler/vyznam-assembleru-dnes-155960cz - Programming from the Ground Up Book – Summary
http://savannah.nongnu.org/projects/pgubook/ - DOSBox
https://www.dosbox.com/ - The C Programming Language
https://en.wikipedia.org/wiki/The_C_Programming_Language