Grafika na osmibitových Atari: grafický koprocesor ANTIC

16. 4. 2026
Doba čtení: 44 minut

Sdílet

Projekt Atari perex.
Autor: Michal Tauchman, podle licence: CC BY-SA 4.0
Projekt Atari perex.
Po popisu možností čipu GTIA se zaměříme na čip, který je vedle mikroprocesoru MOS 6502 srdcem osmibitových počítačů Atari. Jedná se o integrovaný obvod ANTIC s vlastním přístupem do paměti a vlastní instrukční sadou.

Limity čipu GTIA

Co se dozvíte v článku
  1. Limity čipu GTIA
  2. Čip ANTIC se představuje
  3. Textové režimy čipu ANTIC
  4. Grafické režimy čipu ANTIC
  5. Ukázky her využívajících textové režimy
  6. Ukázky her využívajících grafické režimy
  7. Řídicí registry čipu ANTIC
  8. Od teorie k praxi
  9. Soubor atari_antic.inc
  10. Úprava konfiguračního souboru pro linker
  11. Nastavení display listu s textovým režimem (4 barvy, dvojitá velikost znaků)
  12. Úplný zdrojový kód prvního demonstračního příkladu
  13. I assembler může být čitelný: využití konstant definovaných v souboru atari_antic.inc
  14. Úplný zdrojový kód druhého demonstračního příkladu
  15. Kombinace různých textových a grafických režimů
  16. Složitější varianta display listu
  17. Úplný zdrojový kód třetího demonstračního příkladu
  18. Příloha: Makefile pro překlad všech demonstračních příkladů
  19. Repositář s demonstračními příklady
  20. Odkazy na Internetu

V předchozích třech článcích o tvorbě software pro osmibitové domácí mikropočítače Atari jsme se zaměřili na popis grafického čipu GTIA. Ten je určen (především) k zobrazení pohyblivých objektů – spritů, ovšem omezeni jsme jen na sprity šířky dvou či osmi pixelů a výšky 128 nebo 256 pixelů (další rozšíření již vyžaduje ANTIC). Možnosti jsou tedy relativně omezené, i když jen s využitím spritů (a ničeho dalšího) lze implementovat například plnohodnotnou hru Pong. Celou implementaci sice ještě hotovou nemáme, ale první „nástřel“ (využívající skutečně pouze sprity) vypadá takto:

Scéna ze hry Pong, ve které jsem použil jen čtyři hráče a čtyři střely (PMG).

Obrázek 1: Scéna ze hry Pong, ve které jsem použil jen čtyři hráče a čtyři střely. 

Autor: tisnik, podle licence: Rights Managed

Ostatně podívejme se na zdrojový kód programu, který tuto scénu vykreslí. Skutečně zde pracujeme jen se čtyřmi hráči (zobrazení skóre) a čtyřmi střelami (dvě pálky, síťka a míček):

; ---------------------------------------------------------------------
; Zobrazení obrazovky ze hry Pong.
; ---------------------------------------------------------------------
 
.include "atari.inc"
 
.CODE
 
SCORE_OFFSET = 10
PLAYER_0_OFFSET = 512
PLAYER_1_OFFSET = PLAYER_0_OFFSET + 128
PLAYER_2_OFFSET = PLAYER_1_OFFSET + 128
PLAYER_3_OFFSET = PLAYER_2_OFFSET + 128
MISSILES_OFFSET = 384
 
 
.proc main
        lda #0                  ; barva pozadí textu
        sta COLOR1              ; nastavit
        sta COLOR2              ; nastavit
 
        lda #70                 ; horizontální pozice prvního hráče (číslice skóre)
        sta HPOSP0              ; uložit do řídicího registru HPOSP0 na čipu GTIA
 
        lda #80                 ; horizontální pozice druhého hráče (číslice skóre)
        sta HPOSP1              ; uložit do řídicího registru HPOSP1 na čipu GTIA
 
        lda #160                ; horizontální pozice třetího hráče (číslice skóre)
        sta HPOSP2              ; uložit do řídicího registru HPOSP2 na čipu GTIA
 
        lda #170                ; horizontální pozice čtvrtého hráče (číslice skóre)
        sta HPOSP3              ; uložit do řídicího registru HPOSP3 na čipu GTIA
 
        lda #50                 ; horizontální pozice první střely (pálka)
        sta HPOSM0              ; uložit do řídicího registru HPOSM0 na čipu GTIA
 
        lda #200                ; horizontální pozice druhé střely (pálka)
        sta HPOSM1              ; uložit do řídicího registru HPOSM1 na čipu GTIA
 
        lda #160                ; horizontální pozice třetí střely (míček)
        sta HPOSM2              ; uložit do řídicího registru HPOSM2 na čipu GTIA
 
        lda #128                ; horizontální pozice čtvrté střely (síťka)
        sta HPOSM3              ; uložit do řídicího registru HPOSM3 na čipu GTIA
 
        lda #HUE_GREEN<<4 + 12  ; barva prvního hráče (odstín+intenzita)
        sta PCOLR0              ; uložit do řídicího registru PCOLR0 na čipu GTIA
 
        lda #HUE_YELLOW<<4 + 12 ; barva druhého hráče (odstín+intenzita)
        sta PCOLR1              ; uložit do řídicího registru PCOLR1 na čipu GTIA
 
        lda #HUE_MAGENTA<<4 + 12 ; barva třetího hráče (odstín+intenzita)
        sta PCOLR2              ; uložit do řídicího registru PCOLR2 na čipu GTIA
 
        lda #HUE_CYAN<<4 + 12   ; barva čtvrtého hráče (odstín+intenzita)
        sta PCOLR3              ; uložit do řídicího registru PCOLR3 na čipu GTIA
 
        lda #3                  ; bitové pole: povolení hráčů i střel
        sta GRACTL              ; uložit do řídicího registru GRACTL na čipu GTIA
 
        lda #0                  ; priorita hráčů a pozadí
        sta GPRIOR              ; uložit do řídicího registru GPRIOR na čipu GTIA
 
        lda #152                ; paměťová stránka číslo 152
        sta PMBASE
 
        ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        ;; Skóre
        ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        addr = 152*256
        ldx #8                  ; začneme na hodnotě o 1 vyšší
next_line:
        lda number_0-1, x         ; načíst
        sta addr+PLAYER_0_OFFSET+SCORE_OFFSET, x  ; uložit byte - první hráč
        sta addr+PLAYER_1_OFFSET+SCORE_OFFSET, x  ; uložit byte - druhý hráč
        sta addr+PLAYER_2_OFFSET+SCORE_OFFSET, x  ; uložit byte - třetí hráč
        sta addr+PLAYER_3_OFFSET+SCORE_OFFSET, x  ; uložit byte - čtvrtý hráč
        dex                     ; snížit offset + nastavit příznaky
        bne next_line           ; další byte spritu
 
        ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        ;; Pálky
        ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        ldx #20
missile_line:
        lda #%0000001           ; jen první střela (pálka)
        sta addr+MISSILES_OFFSET+50, x
        lda #%0000100           ; jen druhá střela (pálka)
        sta addr+MISSILES_OFFSET+72, x
        dex
        bne missile_line        ; další byte spritu
 
        ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        ;; Míček
        ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        lda #%00110000          ; jen třetí střela (míček)
        sta addr+MISSILES_OFFSET+70, x
        sta addr+MISSILES_OFFSET+71, x
 
        ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        ;; Síťka
        ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        ldx #126
net:
        lda addr+MISSILES_OFFSET, x
        ora #%1000000           ; jen čtvrtá střela (síťka)
        sta addr+MISSILES_OFFSET, x
        dex
        dex
        bne net                 ; další byte spritu
 
        lda #46                 ; povolení PMG DMA
        sta SDMCTL
 
loop:   jmp loop
.endproc
 
; data
number_0: .byte %00111100, %011000011, %011000011, %011000011, %011000011, %011000011, %00111100, 0
 
end:
 
 
.segment "EXEHDR"
.word   $ffff                   ; uvodni sekvence bajtu v souboru XEX
.word   main                    ; zacatek kodoveho segmentu
.word   end - 1                 ; konec kodoveho segmentu
 
 
.segment "AUTOSTRT"             ; segment s pocatecni adresou
.word   RUNAD                   ; naplni se pouze adresy RUNAD a RUNAD+1
.word   RUNAD+1
.word   main                    ; adresa vstupniho bodu do programu
 
; finito
Poznámka: přidání dalších grafických objektů již vyžaduje použití čipu ANTIC.

Čip ANTIC se představuje

Na osmibitových počítačích Atari se grafika skládala, jak již dobře víme, ze dvou částí: pozadí (hrací pole, playfield) a pohyblivých rastrových obrázků (spritů). Pro nastavení grafického režimu pozadí (playfield) byl určen obvod ANTIC (Alpha-Numeric Television Interface Circuit), který umožnil pro každý vykreslovaný řádek programově nastavit jeden ze čtrnácti textových nebo grafických režimů, které se lišily svým rozlišením, počtem současně zobrazitelných barev a velikostí alokované paměti.

Některé z podporovaných režimů zobrazovaly pouze znaky, jiné byly čistě bitmapové. U každého zobrazovaného řádku bylo možné povolit přerušení DLI (Display-List Interrupt), které nastalo při horizontálním zpětném běhu elektronového paprsku na televizní obrazovce. Pro každý zobrazovaný řádek bylo také možné povolit jemný posuv o maximálně osm pixelů, čímž bylo možné realizovat jednoduchý scrolling obrazovky nebo její části (tj. pouze několika vybraných řádků).

Vzhledem k tomu, že se čip ANTIC řídil vlastní sadou příkazů nazývanou Display List a při vykreslování přebíral od hlavního procesoru řízení sběrnice, se v podstatě jednalo o jeden z prvních široce používaných grafických procesorů (Graphics Processing Unit – GPU). Operační paměť byla mezi hlavním procesorem počítače MOS 6502 a čipem ANTIC sdílená, což vedlo k nutnosti postupného přebírání řízení jedním z procesorů za pomoci operací přerušení.

Díky frekvenci hlavního procesoru a potřebě synchronizace elektronového paprsku bylo maximální podporované rozlišení rovno 352×240 pixelům. Toto rozlišení, které se v literatuře nazývá celkem trefně overscan se kvůli kompatibilitě s kompozitními monitory a televizními obrazovkami snižovalo na standardních 320×200 pixelů resp. spíše 320×192 pixelů. V režimu overscan totiž paprsek okrajové části obrazu kreslil „za roh“ obrazovky, což bylo krásně viditelné například na elektronkových televizorech Salermo, které měly přední část obrazovky o cca 2cm vysunutou z šasi přístroje (o tuto vymoženost jsme postupnou modernizací přišli).

Textové režimy čipu ANTIC

Popišme si nejdříve textové režimy podporované čipem ANTIC. V následující tabulce jsou vypsány vlastnosti všech šesti textových režimů. Druhý sloupec obsahuje číslo režimu v BASICu, kde je použito v příkazu GRAPHICS (dále budeme používat zkratku GR.x znamenající GRAPHICS x, například GRAPHICS 8). Počet řádků a vyžadovaná kapacita RAM je spočtena pro standardní případy – všechny řádky používají stejný režim a omezeni jsme na 192 obrazových řádků:

ANTIC BASIC Znaků/řádek Počet řádků Počet barev Spotřeba RAM
2 0 40 24 2 960
3 40 -- 2 --
4 12 40 24 4/5 960
5 13 40 12 4/5 480
6 1 20 24 5 480
7 2 20 12 5 240

Tuto šestici režimů je možné dále rozdělit do tří podskupin:

  1. V první podskupině je standardní textový režim GR.0 (ANTIC 2) a režim ANTIC 3. V těchto režimech se zobrazují monochromatické znaky o výše osmi resp. deseti obrazových řádků. Barva pozadí a popředí znaků má vždy stejný odstín, liší se jen intenzita.
  2. Ve druhé podskupině jsou režimy GR.1 a GR.2 (ANTIC 6 a 7). Horizontální počet znaků je snížen na polovinu (stejně jako rozlišení) a zobrazit je možné jen 64 znaků (nikoli 128). Nejvyšší dva bity znaků určují jejich barvu, pátá je barva pozadí (implicitně černá).
  3. Režimy GR.12 a GR.13 (ANTIC 4 a 5) leží na pomezí mezi čistě textovými režimy a režimy grafickými. Znaky mají poloviční horizontální rozlišení a vždy dva bity v bitmapě znaku určují barvu pixelu. Tím lze rozlišit čtyři barvy; pátá barva je vybrána sedmým bitem kódu znaku. Výsledkem jsou „divné“ (špatně čitelné) znaky, ovšem modifikací znakové sady lze docílit mnoha zajímavých efektů.
Poznámka: poslední dva zmíněné režimy jsem kdysi považoval za zcela zbytečné a nebylo mi vůbec jasné, proč je tvůrci počítačů Atari vlastně zaváděli. Ve skutečnosti se však jedná o jednu z nejsilnějších zbraní Atari. Na těchto režimech je založeno velké množství her a v kombinaci se sprity lze dosáhnout mnoha zajímavých efektů (ostatně podobně koncipovanou grafiku mají mnohé herní automaty nebo i herní konzole NES).

Grafické režimy čipu ANTIC

Grafických režimů podporovaných čipem ANTIC je celkem osm. Tyto režimy vznikají kombinací různého horizontálního rozlišení (40, 80, 160, 320 pixelů), vertikálního rozlišení (24, 48, 96, 192 řádků) a počtu barev (2 nebo 4). Základní informace o těchto režimech jsou uvedeny v následující tabulce:

ANTIC BASIC Pixelů/řádek Počet řádků Počet barev Spotřeba RAM
8 3 40 24 4 240
9 4 80 48 2 480
A 5 80 48 4 960
B 6 160 96 2 1920
D 7 160 96 4 3840
C 14 160 192 2 3840
E 15 160 192 4 7680
F 8 320 192 2 7680
Poznámka: režimy C a D jsou v tabulce prohozeny, protože nové pořadí mi připadne logičtější.

Grafické režimy lze rozdělit do tří podskupin:

  1. V první podskupině se nachází režimy se čtyřmi barvami. Jedná se o režimy s rozlišeními 40×24, 80×48, 160×96 a 160×192 pixelů (ANTIC 8, A, D a E) neboli GR.3, GR.5, GR.7 a GR.15. Každý pixel je uložen ve dvou bitech a kromě posledního režimu jsou pixely čtvercové (v posledním režimu mají poloviční výšku).
  2. Režimy s rozlišením 80×48, 160×96 a 160×192 pixelů mají i svoje dvojbarevné varianty, v nichž je každý pixel uložen v jediném bitu. Jedná se o režimy ANTIC 9, B a C neboli GR.4, GR.6 a GR.14 (kupodivu neexistuje režim 40×24 pixelů se dvěma barvami, to je hodně primitivní grafika).
  3. Režim s rozlišením 320×192 pixelů (ANTIC F neboli GR.8) je monochromatický, což znamená, že barva pozadí i popředí má stejný odstín a pouze jinou intenzitu. Jedná se tedy o obdobu standardního textového režimu GR.0, který má (z pohledu barev) stejné vlastnosti. Tento režim nabízí nejvyšší možné (standardní) rozlišení, ovšem taktéž vyžaduje skoro 8 kB RAM (jinak se ovšem jedná o běžný režim s jedním bitem na pixel).

Ukázky her využívajících textové režimy

Ukažme si, jak byly jednotlivé režimy čipu ANTIC využity v praxi. V této kapitole budou představeny screenshoty několika her, které využívají některý z textových režimů. Snažil jsem se o výběr takových her, v nichž není zkombinováno větší množství režimů (takovými hrami se budeme zabývat příště).

Začneme standardním textovým režimem GR.0, který má v instrukční sadě ANTICu kód 2. První hra používá tento režim beze změny, druhá má vlastní font:

Hra Diktátor ve verzi pro osmibitová Atari.

Obrázek 2: Hra Diktátor ve verzi pro osmibitová Atari.

Autor: tisnik, podle licence: Rights Managed

Jedna z mnoha textovek využívajících standardní textový režim, ovšem vlastní font.

Obrázek 3: Jedna z mnoha textovek využívajících standardní textový režim, ovšem vlastní font.

Autor: tisnik, podle licence: Rights Managed

Režim GR.1 s 20 znaky na řádku a 24 textovými řádky není ve hrách příliš často používán, takže zde je výběr poněkud omezený. V dalším screeshotu je použita vlastní znaková sada:

Dungeons of Xotha naprogramovaná v BASICu.

Obrázek 4: Hra Dungeons of Xotha naprogramovaná v BASICu.

Autor: tisnik, podle licence: Rights Managed

Režim GR.2 s 20 znaky na řádku a pouze 12 textovými řádky taktéž není (jako celek) používán příliš často. Ukažme si tedy alespoň úvodní obrazovku ke stejné hře, z jaké byl pořízen předchozí screenshot:

Úvodní obrazovka hry Dungeons of Xotha naprogramované v BASICu.

Obrázek 5: Úvodní obrazovka hry Dungeons of Xotha naprogramované v BASICu.

Autor: tisnik, podle licence: Rights Managed

Naproti tomu režim GR.12 (ANTIC 4) se 40 znaky na řádku a 24 textovými řádky se používá velmi často. Horizontální rozlišení je zde sice sníženo na polovinu (160 pixelů), ovšem v oblasti každého znaku lze využít čtyři barvy (pátá barva se volí horním bitem znaku). Tento režim je velmi často využíván v mnoha hrách (i když to nemusí být na první pohled patrné) a ještě se k němu několikrát vrátíme:

Slavný Boulder Dash (zde konkrétně Boulder Dash II).

Obrázek 6: Slavný Boulder Dash (zde konkrétně Boulder Dash II) běží celý v textovém režimu.

Autor: tisnik, podle licence: Rights Managed

Neméně známá hra (Preliminary) Monty.

Obrázek 7: Neméně známá hra (Preliminary) Monty.

Autor: tisnik, podle licence: Rights Managed

Ukázky her využívajících grafické režimy

Podívejme se ještě na několik ukázek her a dem, v nichž jsou použity režimy grafické. Opět jsem se (prozatím) snažil o výběr takových obrázků, v nichž nedochází ke změně režimů na jednotlivých řádcích, takže možná není příliš velkým překvapením, že se v několika případech jedná o „pouhé“ úvodní statické obrázky.

První screenshot pochází z dema, nikoli ze skutečné hry. Je v něm použit režim GR.6 (ANTIC B) s rozlišením 160×96 pixelů, který má pouhé dvě barvy. Předností tohoto režimu je malá kapacita obrazové paměti (1920 bajtů) a tím pádem i možnost relativně rychlého přepočítávání a překreslování:

Toto není hra, ale screenshot z dema Tron.

Obrázek 8: Toto není hra, ale screenshot z dema Tron.

Autor: tisnik, podle licence: Rights Managed

Další screenshot již pochází ze hry. Je zde použit grafický režim GR.7 (ANTIC D), jenž má taktéž rozlišení 160×96 pixelů, ovšem již je zde možné využít čtyři barvy (mimochodem: na této hře je nejlepší úvodní melodie a úvodní obrázek, samotná hra je dosti jednotvárná):

Úvodní obrazovka hry Space Lobsters.

Obrázek 9: Úvodní obrazovka hry Space Lobsters.

Autor: tisnik, podle licence: Rights Managed

Následuje dvojice obrázků používajících grafický režim GR.15 (ANTIC E) s rozlišením 160×192 pixelů a se čtyřmi barvami. Pixely v tomto případě nejsou čtvercové, ovšem vertikální rozlišení se zdvojnásobilo, stejně jako požadavky na Video RAM (celých 7680 bajtů):

Známá hra Zorro firmy Datasoft.

Obrázek 10: Známá hra Zorro firmy Datasoft.

Autor: tisnik, podle licence: Rights Managed

Opět Boulder Dash, tentokrát jeho úvodní obrazovka.

Obrázek 11: Opět Boulder Dash II, tentokrát jeho úvodní obrazovka.

Autor: tisnik, podle licence: Rights Managed

Poslední dva screenshoty využívají režim GR.8 (ANTIC F) s nejvyšším rozlišení 320×192 pixelů, ovšem pouze s jedinou barvou (ve dvou odstínech). První screenshot je statický úvodní snímek, druhý screenshot ovšem pochází z živé hry:

Úvodní obrazovka známé hry Starquake.

Obrázek 12: Úvodní obrazovka známé hry Starquake.

Autor: tisnik, podle licence: Rights Managed

Isometrická hra Amaurote.

Obrázek 13: Isometrická hra Amaurote (je až neuvěřitelné, že tato hra s pohyblivými objekty je počítána a vykreslována MOSem 6502). 

Autor: tisnik, podle licence: Rights Managed

Řídicí registry čipu ANTIC

Čip ANTIC se konfiguruje přes patnáct řídicích registrů. Těchto registrů je tedy mnohem méně, než v případě čipu GTIA, ovšem na druhou stranu ANTIC využívá několik datových struktur uložených v ROM nebo v operační paměti. Mezi tyto struktury patří především takzvaný display list, o němž se zmíníme dále a taktéž znaková sada (1024 bajtů neboli čtyři stránky paměti). Vraťme se však k řídicím registrům čipu ANTIC. Ty jsou vypsány v následující tabulce:

Jméno Význam Čtení/zápis Stínový registr
DMACTL Direct Memory Access Control W SDMCTL
CHACTL Character Control W CHART
DLISTL Display List Pointer (low byte) W SDLSTL
DLISTH Display List Pointer (high byte) W SDLSTH
HSCROL Horizontal Fine Scroll W  
VSCROL Vertical Fine Scroll W  
PMBASE Player/Missile Base Address W  
CHBASE Character Set Base Address W CHBAS
WSYNC Wait for Horizontal Sync W  
VCOUNT Vertical Line Counter R  
PENH Light Pen Horizontal Position R LPENH
PENV Light Pen Vertical Position R LPENV
NMIEN Non-Maskable Interrupt (NMI) Enable W  
NMIRES Non-Maskable Interrupt (NMI) Reset W  
NMIST Non-Maskable Interrupt (NMI) Status R  

Registr PMBASE a DMACTL (resp. stínový registr SDMCTL) jsme již dříve používali, ovšem skutečně se jedná o registry čipu ANTIC. Z toho ovšem plyne zajímavé poučení: o přístup do paměti se stará i v případě spritů ANTIC a nikoli GTIA.

Poznámka: stínové registry (shadow registers) mají stejný význam jako u čipu GTIA. Některé registry jsou totiž určeny jen pro zápis, takže z nich není možné přečíst dříve zapsanou hodnotu. Řešení spočívá v tom, že se zápis provede do stínového registru v operační paměti a operační systém automaticky (po každém snímku) přečte obsah stínového registru a zapíše ho do ANTICu. A stínové registry je pochopitelně možné číst.

Od teorie k praxi

V tomto seriálu jsem schválně nejdříve začal s popisem čipu GTIA a nikoli ANTIC. Je tomu tak z toho důvodu, že s využitím GTIA je možné vykreslit nějaký sprite (hráče nebo střelu) s pouhými několika instrukcemi. V případě čipu ANTIC je situace komplikovanější, protože pokud budeme chtít použít jiný režim, než standardní GR.0 (ANTIC 2), bude nutné, abychom explicitně nastavili display list a navíc je nutné v některém místě RAM rezervovat blok použitý pro uložení kódů znaků (textové režimy) nebo barev pixelů (grafické režimy). To vyžaduje další znalosti assembleru (segment BSS atd.). Nicméně již dnes budeme schopni nastavit nový textový/grafický režim a provést výpis textu nebo vykreslení pixelů. V navazujících článcích si podrobněji vysvětlíme, jak celý proces funguje.

Soubor atari_antic.inc

Řídicí registry čipu ANTIC, ale například i kódy pro jednotlivé textové či grafické režimy, jsou uloženy v souboru atari_antic.inc, který je nainstalován současně s assemblerem CA65. Tento soubor je relativně krátký a současně postupně využijeme všechny zde definované symboly, takže je možná dobrý nápad si uvést celý jeho obsah:

;-------------------------------------------------------------------------
; ANTIC Address Equates
;-------------------------------------------------------------------------
 
; Read Addresses
 
VCOUNT  = ANTIC + $0B         ;vertical line counter
PENH    = ANTIC + $0C         ;light pen horizontal position
PENV    = ANTIC + $0D         ;light pen vertical position
NMIST   = ANTIC + $0F         ;NMI interrupt status
 
; Write Addresses
 
DMACTL  = ANTIC + $00         ;DMA control
CHACTL  = ANTIC + $01         ;character control
DLISTL  = ANTIC + $02         ;low display list address
DLISTH  = ANTIC + $03         ;high display list address
HSCROL  = ANTIC + $04         ;horizontal scroll
VSCROL  = ANTIC + $05         ;vertical scroll
PMBASE  = ANTIC + $07         ;player-missile base address
CHBASE  = ANTIC + $09         ;character base address
WSYNC   = ANTIC + $0A         ;wait for HBLANK synchronization
NMIEN   = ANTIC + $0E         ;NMI enable
NMIRES  = ANTIC + $0F         ;NMI interrupt reset
 
 
;-------------------------------------------------------------------------
; Antic opcodes
;-------------------------------------------------------------------------
 
; usage example:
;
; ScreenDL:
; .byte DL_BLK8
; .byte DL_BLK8
; .byte DL_CHR40x8x1 | DL_LMS | DL_DLI
; .word ScreenAlignment
; .byte DL_BLK1 | DL_DLI
; .byte DL_MAP320x1x1 | DL_LMS
; .word Screen
;
; .repeat 99
; .byte DL_MAP320x1x1
; .endrepeat
; .byte DL_MAP320x1x1 | DL_LMS
; .word Screen + 40 * 100       ; 100 lines a 40 byte, 'Screen' has to be aligned correctly!
; .repeat 92
; .byte DL_MAP320x1x1
; .endrepeat
;
; .byte DL_JVB
 
; absolute instructions (non mode lines)
 
DL_JMP  = 1
DL_JVB  = 65
 
; DL_BLKn display n empty lines (just background)
 
DL_BLK1  = 0
DL_BLK2  = 16
DL_BLK3  = 32
DL_BLK4  = 48
DL_BLK5  = 64
DL_BLK6  = 80
DL_BLK7  = 96
DL_BLK8  = 112
 
; absolute instructions (mode lines)
 
DL_CHR40x8x1  = 2               ; monochrome, 40 character & 8 scanlines per mode line (GR. 0)
DL_CHR40x10x1 = 3               ; monochrome, 40 character & 10 scanlines per mode line
DL_CHR40x8x4  = 4               ; colour, 40 character & 8 scanlines per mode line (GR. 12)
DL_CHR40x16x4 = 5               ; colour, 40 character & 16 scanlines per mode line (GR. 13)
DL_CHR20x8x2  = 6               ; colour (duochrome per character), 20 character & 8 scanlines per mode line (GR. 1)
DL_CHR20x16x2 = 7               ; colour (duochrome per character), 20 character & 16 scanlines per mode line (GR. 2)
 
DL_MAP40x8x4  = 8               ; colour, 40 pixel & 8 scanlines per mode line (GR. 3)
DL_MAP80x4x2  = 9               ; 'duochrome', 80 pixel & 4 scanlines per mode line (GR.4) 
DL_MAP80x4x4  = 10              ; colour, 80 pixel & 4 scanlines per mode line (GR.5) 
DL_MAP160x2x2 = 11              ; 'duochrome', 160 pixel & 2 scanlines per mode line (GR.6) 
DL_MAP160x1x2 = 12              ; 'duochrome', 160 pixel & 1 scanline per mode line (GR.14) 
DL_MAP160x2x4 = 13              ; 4 colours, 160 pixel & 2 scanlines per mode line (GR.7) 
DL_MAP160x1x4 = 14              ; 4 colours, 160 pixel & 1 scanline per mode line (GR.15) 
DL_MAP320x1x1 = 15              ; monochrome, 320 pixel & 1 scanline per mode line (GR.8) 
 
; modifiers on mode lines...
 
DL_HSCROL = 16
DL_VSCROL = 32
DL_LMS    = 64
 
; general modifier...
 
DL_DLI    = 128

Úprava konfiguračního souboru pro linker

Demonstrační příklady popsané v navazujících kapitolách taktéž vyžadují modifikaci konfiguračního souboru linkeru. Jedná se o soubor nazvaný linker.cfg, do kterého je přidán řádek se specifikací segmentu BSS. Ostatní řádky zůstanou nezměněny:

FEATURES
{
    STARTADDRESS: default = $2000;
}
 
SYMBOLS
{

}
 
MEMORY
{
    ZP:         start = $0082, size = $007E, type = rw, define = yes;
    HEADER:     start = $0000, size = $0006, file = %O;
    RAM:        start = %S,    size = $8000, file = %O;
    TRAILER:    start = $0000, size = $0006, file = %O;
}
 
SEGMENTS
{
    EXEHDR:   load = HEADER,  type = ro;
    STARTUP:  load = RAM,     type = ro, define = yes, optional = yes;
    ZEROPAGE: load = ZP,      type = zp;
    CODE:     load = RAM,     type = ro, define = yes;
    AUTOSTRT: load = TRAILER, type = ro;
    BSS:      load = RAM,     type = bss, define = yes;
}
 
FEATURES
{
    CONDES: segment = INIT,
        type = constructor,
        label = __CONSTRUCTOR_TABLE__,
        count = __CONSTRUCTOR_COUNT__;
    CONDES: segment = RODATA,
        type = destructor,
        label = __DESTRUCTOR_TABLE__,
        count = __DESTRUCTOR_COUNT__;
    CONDES: type = interruptor,
        segment = RODATA,
        label = __INTERRUPTOR_TABLE__,
        count = __INTERRUPTOR_COUNT__;
}

Nastavení display listu s textovým režimem (4 barvy, dvojitá velikost znaků)

Vykreslování herního pole čipem ANTIC probíhá (zjednodušeně řečeno) následujícím způsobem:

  1. Přečte se instrukce display listu, což je jedna hodnota typu bajt nebo hodnota+dvoubajtová adresa
  2. Instrukce se provede, což znamená buď vykreslení řádku (text či grafika) nebo skok na jinou instrukci display listu

Existuje několik typů instrukcí, které lze do display listu zapsat:

  1. Vykreslení osmi prázdných řádků
  2. Vykreslení textového řádku (písma) nebo grafického řádku (40, 80, 160 či 320 pixelů)
  3. Skok na jinou instrukci display listu
  4. Nastavení začátku obrazové paměti + vykreslení textového nebo grafického řádku (kupodivu se jedná o jedinou instrukci)

Pokud budeme chtít na obrazovce zobrazit dvanáct textových řádků režimu GR.2 (ANTIC 7), bude display list vypadat takto:

vykreslení osmi prázdných řádků (sync televize)
vykreslení osmi prázdných řádků (sync televize)
vykreslení osmi prázdných řádků (sync televize)
vykreslení textového řádku ANTIC 7 + nastavení adresy začátku video RAM (jedna instrukce)
vykreslení textového řádku ANTIC 7
vykreslení textového řádku ANTIC 7
vykreslení textového řádku ANTIC 7
vykreslení textového řádku ANTIC 7
vykreslení textového řádku ANTIC 7
vykreslení textového řádku ANTIC 7
vykreslení textového řádku ANTIC 7
vykreslení textového řádku ANTIC 7
vykreslení textového řádku ANTIC 7
vykreslení textového řádku ANTIC 7
vykreslení textového řádku ANTIC 7
skok na začátek display listu

Číselně může celý display list vypadat následovně:

.byte 112, 112, 112
.byte 64+7, <screen, >screen
.byte 7, 7, 7, 7
.byte 7, 7, 7, 7
.byte 7, 7, 7
.byte 65, <dlist, >dlist

Na druhém řádku je uvedena instrukce 64+7, <screen, >screen. Tato instrukce nastaví počáteční adresu video RAM na blok začínající návěštím screen. A současně se vykreslí jeden textový řádek v režimu GR.2 (ANTIC 7). Samotná video RAM má kapacitu 20×24=480 bajtů a je umístěna v segmentu BSS (ten není uložen ve výsledném .xex souboru – zbytečně by ho „nafukoval“):

.BSS
screen: .res 20*24
Poznámka: vypadá to celé jako magie? Vše bude vysvětleno ve druhém příkladu.

Výsledek:

Dvanáct řádků textového režimu GR.2 (ANTIC 7).

Obrázek 14: Dvanáct textových řádků v režimu GR.2 (ANTIC 7). 

Autor: tisnik, podle licence: Rights Managed

Úplný zdrojový kód prvního demonstračního příkladu

Podívejme se na úplný zdrojový kód dnešního prvního demonstračního příkladu, který vypadá následovně:

.include "atari.inc"
 
.CODE
 
 
.proc main
        lda #<dlist             ; nižší byte adresy display listu
        sta SDLSTL
        lda #>dlist             ; vyšší byte adresy display listu
        sta SDLSTH
 
        ldy #0                  ; počitadlo zápisů
        lda #0                  ; kód vypisovaného znaku
_fill:
        sta screen, y           ; tisk znaku na zvolené místo na obrazovce
        clc
        adc #1
        iny                     ; zvětšit hodnotu počitadla a offsetu
        cpy #20*12              ; test na koncovou hodnotu počitadla
        bne _fill               ; skok, pokud Y>20x12
 
loop:   jmp loop
.endproc
 
dlist:
.byte 112, 112, 112
.byte 64+7, <screen, >screen
.byte 7, 7, 7, 7
.byte 7, 7, 7, 7
.byte 7, 7, 7
.byte 65, <dlist, >dlist
 
end:
 
.BSS
screen: .res 20*24
 
 
 
.segment "EXEHDR"
.word   $ffff                   ; uvodni sekvence bajtu v souboru XEX
.word   main                    ; zacatek kodoveho segmentu
.word   end - 1                ; konec kodoveho segmentu
 
 
.segment "AUTOSTRT"             ; segment s pocatecni adresou
.word   RUNAD                   ; naplni se pouze adresy RUNAD a RUNAD+1
.word   RUNAD+1
.word   main                    ; adresa vstupniho bodu do programu
 
; finito

I assembler může být čitelný: využití konstant definovaných v souboru atari_antic.inc

Pokud se podíváme na řadu čísel z předchozího zdrojového kódu, mohlo by se zdát, že práce v assembleru je při práci s ANTICem plná magie, ve které dosahujeme kýženého výsledku opakováním tajných číselných sekvencí předávaných programátory z generace na generaci:

dlist:
.byte 112, 112, 112
.byte 64+7, <screen, >screen
.byte 7, 7, 7, 7
.byte 7, 7, 7, 7
.byte 7, 7, 7
.byte 65, <dlist, >dlist

Ovšem ve skutečnosti tak tomu být nemusí, protože si musíme uvědomit, že číselné konstanty jsou vlastně instrukcemi ANTICu a díky hlavičkovému souboru s potřebnými konstantami můžeme tyto instrukce přepsat do rozumnějšího tvaru:

dlist:
.byte DL_BLK8, DL_BLK8, DL_BLK8 ; 3x8=24 prázdných obrazových řádků
.byte DL_LMS+DL_CHR20x16x2      ; určení počáteční adresy obrazové paměti + jeden řádek režimu 7
.byte <screen, >screen          ; počáteční adresa obrazové paměti 
.byte DL_CHR20x16x2             ; jeden řádek textového režimu 7 (GR.2)
.byte DL_CHR20x16x2             ; jeden řádek textového režimu 7 (GR.2)
.byte DL_CHR20x16x2             ; jeden řádek textového režimu 7 (GR.2)
.byte DL_CHR20x16x2             ; jeden řádek textového režimu 7 (GR.2)
.byte DL_CHR20x16x2             ; jeden řádek textového režimu 7 (GR.2)
.byte DL_CHR20x16x2             ; jeden řádek textového režimu 7 (GR.2)
.byte DL_CHR20x16x2             ; jeden řádek textového režimu 7 (GR.2)
.byte DL_CHR20x16x2             ; jeden řádek textového režimu 7 (GR.2)
.byte DL_CHR20x16x2             ; jeden řádek textového režimu 7 (GR.2)
.byte DL_CHR20x16x2             ; jeden řádek textového režimu 7 (GR.2)
.byte DL_CHR20x16x2             ; jeden řádek textového režimu 7 (GR.2)
.byte DL_JVB, <dlist, >dlist    ; skok na začátek display listu

Stále se zde vyskytují symboly < a >. Jedná se o klauzule assembleru, který namísto těchto symbolů dosadí horní nebo dolní bajt adresy, tj. v našem případě konkrétně adresy s obsahem obrazovky screen a adresy začátku display listu dlist.

Výsledek bude po zobrazení na obrazovce totožný s předchozím příkladem:

Dvanáct řádků textového režimu GR.2 (ANTIC 7).

Obrázek 15: Dvanáct textových řádků v režimu GR.2 (ANTIC 7).  

Autor: tisnik, podle licence: Rights Managed

Úplný zdrojový kód druhého demonstračního příkladu

Celý zdrojový kód dnešního druhého demonstračního příkladu se do značné míry podobá příkladu prvnímu, pochopitelně s tím rozdílem, že je nyní výsledek mnohem čitelnější (byla odstraněna většina magických konstant):

.include "atari.inc"
 
.CODE
 
 
.proc main
        lda #<dlist             ; nižší byte adresy display listu
        sta SDLSTL
        lda #>dlist             ; vyšší byte adresy display listu
        sta SDLSTH
 
        ldy #0                  ; počitadlo zápisů
        lda #0                  ; kód vypisovaného znaku
_fill:
        sta screen, y           ; tisk znaku na zvolené místo na obrazovce
        clc
        adc #1
        iny                     ; zvětšit hodnotu počitadla a offsetu
        cpy #20*12              ; test na koncovou hodnotu počitadla
        bne _fill               ; skok, pokud Y>20x12
 
loop:   jmp loop
.endproc
 
dlist:
.byte DL_BLK8, DL_BLK8, DL_BLK8 ; 3x8=24 prázdných obrazových řádků
.byte DL_LMS+DL_CHR20x16x2      ; určení počáteční adresy obrazové paměti + jeden řádek režimu 7
.byte <screen, >screen          ; počáteční adresa obrazové paměti 
.byte DL_CHR20x16x2             ; jeden řádek textového režimu 7 (GR.2)
.byte DL_CHR20x16x2             ; jeden řádek textového režimu 7 (GR.2)
.byte DL_CHR20x16x2             ; jeden řádek textového režimu 7 (GR.2)
.byte DL_CHR20x16x2             ; jeden řádek textového režimu 7 (GR.2)
.byte DL_CHR20x16x2             ; jeden řádek textového režimu 7 (GR.2)
.byte DL_CHR20x16x2             ; jeden řádek textového režimu 7 (GR.2)
.byte DL_CHR20x16x2             ; jeden řádek textového režimu 7 (GR.2)
.byte DL_CHR20x16x2             ; jeden řádek textového režimu 7 (GR.2)
.byte DL_CHR20x16x2             ; jeden řádek textového režimu 7 (GR.2)
.byte DL_CHR20x16x2             ; jeden řádek textového režimu 7 (GR.2)
.byte DL_CHR20x16x2             ; jeden řádek textového režimu 7 (GR.2)
.byte DL_JVB, <dlist, >dlist    ; skok na začátek display listu
 
end:
 
.BSS
screen: .res 20*24
 
 
 
.segment "EXEHDR"
.word   $ffff                   ; uvodni sekvence bajtu v souboru XEX
.word   main                    ; zacatek kodoveho segmentu
.word   end - 1                ; konec kodoveho segmentu
 
 
.segment "AUTOSTRT"             ; segment s pocatecni adresou
.word   RUNAD                   ; naplni se pouze adresy RUNAD a RUNAD+1
.word   RUNAD+1
.word   main                    ; adresa vstupniho bodu do programu
 
; finito

Kombinace různých textových a grafických režimů

Jednou z nejtypičtějších a vlastně i nejunikátnějších vlastností osmibitových domácích mikropočítačů Atari je schopnost ANTICu na jediné obrazovce střídat různé textové a grafické režimy. Musíme vlastně dodržet jen dvě pravidla: nepřekročit bloky o velikosti čtyř kilobajtů (povíme si příště) a taktéž celkový počet obrazových řádků (včetně prázdných řádků na okrajích) nesmí překročit limit televizoru. Teoreticky je možné zobrazit okolo 228 obrazových řádků, typicky se však používá 192 obrazových řádků (ovšem rozšíření na 200 řádků se zdá být zcela bezpečné). To, jakým způsobem se textové a grafické režimy kombinují v praxi, si povíme příště, kdy si ukážeme display listy některých her (zde mi velmi pomohl kolega MilanV, kterému mockrát děkuji!). Ovšem již dnes si můžeme ukázat, jak bude vypadat výsledná obrazovka, pokud zkombinujeme několik grafických a textových režimů.

Složitější varianta display listu

V dalším demonstračním příkladu bude display list obsahovat textové režimy GR.0, GR.1 i GR.2. Kromě toho pro zajímavost zařadím dva řádky grafického režimu GR.3, který umožňuje zobrazit 40 pixelů na řádku (pixelem je myšlena logická jednotka, fyziky se takový pixel vlastně skládá z celé řady pixelů obrazovky). Celková délka display listu je navržena tak, aby se nepřekročil celkový povolený počet obrazových řádků:

.byte DL_BLK8, DL_BLK8, DL_BLK8 ; 3x8=24 prázdných obrazových řádků
.byte DL_LMS+DL_CHR20x16x2      ; určení počáteční adresy obrazové paměti + jeden řádek režimu 7
.byte <screen, >screen          ; počáteční adresa obrazové paměti 
.byte DL_CHR20x16x2             ; jeden řádek textového režimu 7 (GR.2)
.byte DL_CHR40x8x1              ; jeden řádek textového režimu 2 (GR.0)
.byte DL_CHR20x8x2              ; jeden řádek textového režimu 6 (GR.1)
.byte DL_CHR40x8x1              ; jeden řádek textového režimu 2 (GR.0)
.byte DL_CHR20x16x2             ; jeden řádek textového režimu 7 (GR.2)
.byte DL_CHR20x16x2             ; jeden řádek textového režimu 7 (GR.2)
.byte DL_MAP40x8x4              ; jeden řádek grafického režimu 8 (GR.3)
.byte DL_MAP40x8x4              ; jeden řádek grafického režimu 8 (GR.3)
.byte DL_CHR20x16x2             ; jeden řádek textového režimu 7 (GR.2)
.byte DL_CHR20x16x2             ; jeden řádek textového režimu 7 (GR.2)
.byte DL_CHR20x16x2             ; jeden řádek textového režimu 7 (GR.2)
.byte DL_CHR40x8x1              ; jeden řádek textového režimu 2 (GR.0)
.byte DL_JVB, <dlist, >dlist    ; skok na začátek display listu

Počet obrazových řádků si můžeme snadno vypočítat:

DL_BLK8, DL_BLK8, DL_BLK8 24
DL_LMS+DL_CHR20x16x2      16
DL_CHR20x16x2             16
DL_CHR40x8x1              8
DL_CHR20x8x2              8
DL_CHR40x8x1              8
DL_CHR20x16x2             16
DL_CHR20x16x2             16
DL_MAP40x8x4              8
DL_MAP40x8x4              8
DL_CHR20x16x2             16
DL_CHR20x16x2             16
DL_CHR20x16x2             16
DL_CHR40x8x1              8
                        -----
                         184
Poznámka: můžeme tedy bez obavy přidat ještě další řádky.

Výsledkem je pěkný guláš:

Mix různých textových a grafických režimů.

Obrázek 16: Mix různých textových a grafických režimů.  

Autor: tisnik, podle licence: Rights Managed

Úplný zdrojový kód třetího demonstračního příkladu

Zdrojový kód třetího a současně i dnes posledního demonstračního příkladu vypadá následovně:

.include "atari.inc"
 
.CODE
 
 
.proc main
        lda #<dlist             ; nižší byte adresy display listu
        sta SDLSTL
        lda #>dlist             ; vyšší byte adresy display listu
        sta SDLSTH
 
        ldy #0                  ; počitadlo zápisů
        lda #0                  ; kód vypisovaného znaku
_fill:
        sta screen, y           ; tisk znaku na zvolené místo na obrazovce
        clc
        adc #1
        iny                     ; zvětšit hodnotu počitadla a offsetu
        cpy #40*6               ; test na koncovou hodnotu počitadla
        bne _fill               ; skok, pokud Y>40*6
 
loop:   jmp loop
.endproc
 
dlist:
.byte DL_BLK8, DL_BLK8, DL_BLK8 ; 3x8=24 prázdných obrazových řádků
.byte DL_LMS+DL_CHR20x16x2      ; určení počáteční adresy obrazové paměti + jeden řádek režimu 7
.byte <screen, >screen          ; počáteční adresa obrazové paměti 
.byte DL_CHR20x16x2             ; jeden řádek textového režimu 7 (GR.2)
.byte DL_CHR40x8x1              ; jeden řádek textového režimu 2 (GR.0)
.byte DL_CHR20x8x2              ; jeden řádek textového režimu 6 (GR.1)
.byte DL_CHR40x8x1              ; jeden řádek textového režimu 2 (GR.0)
.byte DL_CHR20x16x2             ; jeden řádek textového režimu 7 (GR.2)
.byte DL_CHR20x16x2             ; jeden řádek textového režimu 7 (GR.2)
.byte DL_MAP40x8x4              ; jeden řádek grafického režimu 8 (GR.3)
.byte DL_MAP40x8x4              ; jeden řádek grafického režimu 8 (GR.3)
.byte DL_CHR20x16x2             ; jeden řádek textového režimu 7 (GR.2)
.byte DL_CHR20x16x2             ; jeden řádek textového režimu 7 (GR.2)
.byte DL_CHR20x16x2             ; jeden řádek textového režimu 7 (GR.2)
.byte DL_CHR40x8x1              ; jeden řádek textového režimu 2 (GR.0)
.byte DL_JVB, <dlist, >dlist    ; skok na začátek display listu
 
end:
 
.BSS
screen: .res 20*24
 
 
 
.segment "EXEHDR"
.word   $ffff                   ; uvodni sekvence bajtu v souboru XEX
.word   main                    ; zacatek kodoveho segmentu
.word   end - 1                ; konec kodoveho segmentu
 
 
.segment "AUTOSTRT"             ; segment s pocatecni adresou
.word   RUNAD                   ; naplni se pouze adresy RUNAD a RUNAD+1
.word   RUNAD+1
.word   main                    ; adresa vstupniho bodu do programu
 
; finito

Příloha: Makefile pro překlad všech demonstračních příkladů

Všechny minule i dnes popsané demonstrační příklady, pro jejichž překlad je zapotřebí použít assembler ca65 a linker ld65, je možné přeložit s využitím souboru Makefile, jehož obsah je vypsán pod tímto odstavcem:

Školení Zabbix

execs := dummy.xex print_a.xex \
         background_color_1.xex  background_color_2.xex \
         color_computation_1.xex color_computation_2.xex \
         subroutine_1.xex        subroutine_2.xex \
         hex_number_1.xex        hex_number_2.xex \
         hex_number_3.xex        hex_number_4.xex \
         hex_number_5.xex        hex_number_6.xex \
         hex_number_7.xex        hex_number_8.xex \
         hex_number_9.xex \
         fill_block_1.xex        fill_block_2.xex \
         fill_block_3.xex        fill_block_4.xex \
         fill_block_5.xex \
         pmg_01.xex              pmg_02.xex \
         pmg_03.xex              pmg_04.xex \
         pmg_05.xex              pmg_06.xex \
         pmg_07.xex              pmg_08.xex \
         pmg_09.xex              pmg_10.xex \
         pmg_11.xex              pmg_12.xex \
         pmg_13.xex              pmg_14.xex \
         pmg_15.xex              pong.xex \
         pmg_stick_1.xex         pmg_stick_2.xex \
         pmg_stick_3.xex         pmg_stick_4.xex \
         pmg_stick_5.xex         pmg_stick_6.xex \
         pmg_collisions_1.xex    pmg_collisions_2.xex \
         pmg_collisions_3.xex    pmg_collisions_4.xex \
         antic_1.xex             antic_2.xex \
         antic_3.xex
 
all: $(execs)
 
clean:
        rm -f *.o
        rm -f *.xex
 
.PHONY: all clean
 
%.o: %.asm
        ca65 $< -t atari -o $@ -l $(basename $<)_list.asm --list-bytes 100
 
%.xex: %.o
        ld65 -C linker.cfg $< -o $@ -m $(basename $<).map

Výsledkem překladu jsou soubory s koncovkou .xex, které je možné přímo spustit v emulátoru osmibitových počítačů Atari.

Repositář s demonstračními příklady

Všechny demonstrační příklady, s nimiž jsme se v předchozích článcích i v článku dnešním seznámili a které jsou určeny pro překlad s využitím assembleru ca65, jsou dostupné, jak je zvykem, na GitHubu. V tabulce níže jsou uvedeny odkazy na jednotlivé zdrojové kódy příkladů psané v assembleru i „listingy“ vygenerované samotným assemblerem, ze kterých je patrné, jakým způsobem se jednotlivé příklady přeložily do výsledného XEX souboru:

# Příklad Stručný popis příkladu Adresa
1 Makefile definice cílů pro překlad všech demonstračních příkladů z této tabulky https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/Makefile
2 linker.cfg konfigurační soubor pro linker https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/linker.cfg
       
3 dummy.asm pouze nekonečná smyčka https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/dummy.asm
4 dummy_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/dummy_list.asm
5 dummy_list.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/dummy.map
       
6 background_color1.asm změna barvy pozadí – základní varianta příkladu https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/background_color1.asm
7 background_color1_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/background_color1_list.asm
8 background_color1.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/background_color1.map
       
9 background_color2.asm změna barvy pozadí – využití předdefinovaných konstant https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/background_color2.asm
10 background_color2_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/background_color2_list.asm
11 background_color2.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/background_color2.map
       
12 print_a.asm tisk znaku přímo do obrazové paměti https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/print_a.asm
13 print_a_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/print_a_list.asm
14 print_a.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/print_a.map
       
15 color_computation1.asm výpočet barvy, varianta bez bitových posunů https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/color_computation1.asm
16 color_computation1_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/color_computation1_list.asm
17 color_computation1.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/color_computation1.map
       
18 color_computation2.asm výpočet barvy, varianta s bitovými posuny https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/color_computation2.asm
19 color_computation2_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/color_computation2_list.asm
20 color_computation2.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/color_computation2.map
       
21 subroutine1.asm skok do podprogramu bez předávání parametrů https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/subroutine1.asm
22 subroutine1_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/subroutine1_list.asm
23 subroutine1.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/subroutine1.map
       
24 subroutine2.asm skok do podprogramu s předáním parametru https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/subroutine2.asm
25 subroutine2_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/subroutine2_list.asm
26 subroutine2.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/subroutine2.map
       
27 hex_number1.asm tisk jedné hexadecimální číslice (nekorektní varianta) https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/hex_number1.asm
28 hex_number1_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/hex_number1_list.asm
29 hex_number1.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/hex_number1.map
       
30 hex_number2.asm tisk jedné hexadecimální číslice (korektní varianta) https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/hex_number2.asm
31 hex_number2_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/hex_number2_list.asm
32 hex_number2.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/hex_number2.map
       
33 hex_number3.asm tisk jedné hexadecimální číslice (korektní varianta po refaktoringu) https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/hex_number3.asm
34 hex_number3_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/hex_number3_list.asm
35 hex_number3.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/hex_number3.map
       
36 hex_number4.asm tisk jedné hexadecimální číslice, varianta postavená na makrech https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/hex_number4.asm
37 hex_number4_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/hex_number4_list.asm
38 hex_number4.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/hex_number4.map
       
39 hex_number5.asm tisk jedné hexadecimální číslice, varianta postavená na makrech, lokální automaticky generovaná návěští https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/hex_number5.asm
40 hex_number5_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/hex_number5_list.asm
41 hex_number5.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/hex_number5.map
       
42 hex_number6.asm příprava pro tisk dvouciferné hexadecimální hodnoty https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/hex_number6.asm
43 hex_number6_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/hex_number6_list.asm
44 hex_number6.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/hex_number6.map
       
45 hex_number7.asm realizace tisku dvouciferné hexadecimální hodnoty https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/hex_number7.asm
46 hex_number7_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/hex_number7_list.asm
47 hex_number7.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/hex_number7.map
       
48 hex_number8.asm makro pro logický posun doprava o zadaný počet bitů https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/hex_number8.asm
49 hex_number8_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/hex_number8_list.asm
50 hex_number8.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/hex_number8.map
       
51 hex_number9.asm čekání na stisk klávesy https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/hex_number8.asm
52 hex_number9_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/hex_number8_list.asm
53 hex_number9.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/hex_number8.map
       
54 fill_block1.asm vyplnění bloku, varianta se dvěma index registry https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/fill_block1.asm
55 fill_block1_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/fill_block1_list.asm
56 fill_block1.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/fill_block1.map
       
57 fill_block2.asm vyplnění bloku, nekorektní varianta využívající jeden index registr https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/fill_block2.asm
58 fill_block2_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/fill_block2_list.asm
59 fill_block2.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/fill_block2.map
       
60 fill_block3.asm vyplnění bloku, korektní varianta využívající jeden index registr https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/fill_block3.asm
61 fill_block3_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/fill_block3_list.asm
62 fill_block3.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/fill_block3.map
       
63 fill_block4.asm vyplnění bloku delšího než 256 bajtů https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/fill_block4.asm
64 fill_block4_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/fill_block4_list.asm
65 fill_block4.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/fill_block4.map
       
66 fill_block5.asm vyplnění bloku, čítání směrem nahoru https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/fill_block5.asm
67 fill_block5_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/fill_block5_list.asm
68 fill_block5.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/fill_block5.map
       
69 pmg01.asm inicializace PMG, povolení PMG, nastavení pozice a tvaru prvního hráče https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg01.asm
70 pmg01_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg01_list.asm
71 pmg01.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg01.map
       
72 pmg02.asm nastavení pozice, tvaru a barvy prvního hráče https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg02.asm
73 pmg02_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg02_list.asm
74 pmg02.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg02.map
       
75 pmg03.asm vliv zákazu DMA na zobrazení PMG https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg03.asm
76 pmg03_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg03_list.asm
77 pmg03.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg03.map
       
78 pmg04.asm postupná změna horizontální velikosti hráče https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg04.asm
79 pmg04_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg04_list.asm
80 pmg04.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg04.map
       
81 pmg05.asm odlišná bitová maska tvaru hráče https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg05.asm
82 pmg05_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg05_list.asm
83 pmg05.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg05.map
       
84 pmg06.asm inicializace a zobrazení dvou hráčů, kteří se překrývají https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg06.asm
84 pmg06_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg06_list.asm
86 pmg06.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg06.map
       
87 pmg07.asm naivní způsob nastavení bitmapy prvního hráče https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg07.asm
88 pmg07_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg07_list.asm
89 pmg07.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg07.map
       
90 pmg08.asm elegantnější způsob nastavení bitmapy prvního hráče https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg08.asm
91 pmg08_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg08_list.asm
92 pmg08.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg08.map
       
93 pmg09.asm zobrazení všech čtyř hráčů, změna priority zobrazení https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg09.asm
94 pmg09_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg09_list.asm
95 pmg09.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg09.map
       
96 pmg10.asm nastavení bitmap všech čtyř hráčů https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg10.asm
97 pmg10_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg10_list.asm
98 pmg10.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg10.map
       
99 pmg_stick1.asm ovládání prvního hráče joystickem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg_stick1.asm
100 pmg_stick1_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg_stick1_list.asm
101 pmg_stick1.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg_stick1.map
       
102 pmg_stick2.asm zobrazení všech čtyř střel https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg_stick2.asm
103 pmg_stick2_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg_stick2_list.asm
104 pmg_stick2.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg_stick2.map
       
105 pmg_stick3.asm střely zdánlivě tvoří pátého hráče (ovšem stále jsou samostatné) https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg_stick3.asm
106 pmg_stick3_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg_stick3_list.asm
107 pmg_stick3.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg_stick3.map
       
108 pmg_stick4.asm korektní zobrazení pátého hráče https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg_stick4.asm
109 pmg_stick4_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg_stick4_list.asm
110 pmg_stick4.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg_stick4.map
       
111 pmg_stick5.asm detekce stisku tlačítka joysticku, změna barvy prvního hráče https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg_stick5.asm
112 pmg_stick5_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg_stick5_list.asm
113 pmg_stick5.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg_stick5.map
       
114 pmg11.asm automatický horizontální pohyb prvního hráče, realizace zpožďovací smyčky https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg11.asm
115 pmg11_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg11_list.asm
116 pmg11.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg11.map
       
117 pmg12.asm automatický horizontální pohyb prvního hráče, čekání na další snímek https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg12.asm
118 pmg12_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg12_list.asm
119 pmg12.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg12.map
       
120 pmg13.asm vertikální posun spritu směrem dolů (nekorektní varianta) https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg13.asm
121 pmg13_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg13_list.asm
122 pmg13.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg13.map
       
123 pmg14.asm vertikální posun spritu směrem dolů (korektní varianta) https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg14.asm
124 pmg14_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg14_list.asm
125 pmg14.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg14.map
       
126 pmg15.asm vertikální posun spritu směrem nahoru (korektní varianta) https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg15.asm
127 pmg15_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg15_list.asm
128 pmg15.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg15.map
       
129 pmg_stick6.asm ovládání PMG joystickem v horizontálním i vertikálním směru https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg_stick6.asm
130 pmg_stick6_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg_stick6_list.asm
131 pmg_stick6.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg_stick6.map
       
132 pmg_collision1.asm ovládání PMG joystickem, detekce kolize prvního hráče s dalšími hráči https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg_collision1.asm
133 pmg_collision1_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg_collision1_list.asm
134 pmg_collision1.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg_collision1.map
       
135 pmg_collision2.asm ovládání PMG joystickem, detekce kolize prvního hráče s dalšími hráči https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg_collision2.asm
136 pmg_collision2_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg_collision2_list.asm
137 pmg_collision2.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg_collision2.map
       
138 pmg_collision3.asm ovládání PMG joystickem, detekce kolize prvního hráče s dalšími hráči, detekce kolize první střely s hráči https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg_collision3.asm
139 pmg_collision3_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg_collision3_list.asm
140 pmg_collision3.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg_collision3.map
       
141 pmg_collision4.asm ovládání PMG joystickem, detekce kolize prvního hráče s hracím polem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg_collision4.asm
142 pmg_collision4_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg_collision4_list.asm
143 pmg_collision4.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pmg_collision4.map
       
144 pong.asm scéna ze hry Pong vykreslená jen s využitím spritů https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pong.asm
145 pong_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pong_list.asm
146 pong.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/pong.map
       
147 antic1.asm nastavení textového režimu se čtyřmi barvami a 20×12 znaky https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic1.asm
148 antic1.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic1.asm
149 antic1.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic1.map
       
150 antic2.asm nastavení textového režimu se čtyřmi barvami a 20×12 znaky, zlepšení čitelnosti https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic2.asm
151 antic2.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic2.asm
152 antic2.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic2.map
       
153 antic3.asm nastavení režimu, ve kterém se kombinují různé textové a grafické řádky https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic3.asm
154 antic3.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic3.asm
155 antic3.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic3.map
       
156 chars.bas tisk všech znaků na obrazovku (varianta naprogramovaná v BASICu) https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/chars.bas

Odkazy na Internetu

  1. MOS 6502 instruction set
    http://www.6502.org/users/o­belisk/6502/instructions.html
  2. EXE File Format Description
    https://gury.atari8.info/ref­s/file_formats_exe.php
  3. XEX Filter – A toolkit to analyze and manipulate Atari binary files
    https://www.vitoco.cl/atari/xex-filter/index.html
  4. chkxex.py
    https://raw.githubusercon­tent.com/seban-slt/tcx_tools/refs/heads/mas­ter/chkxex.py
  5. ca65 Users Guide
    https://cc65.github.io/doc/ca65.html
  6. cc65 Users Guide
    https://cc65.github.io/doc/cc65.html
  7. ld65 Users Guide
    https://cc65.github.io/doc/ld65.html
  8. da65 Users Guide
    https://cc65.github.io/doc/da65.html
  9. Překladače jazyka C pro historické osmibitové mikroprocesory
    https://www.root.cz/clanky/prekladace-jazyka-c-pro-historicke-osmibitove-mikroprocesory/
  10. Překladače programovacího jazyka C pro historické osmibitové mikroprocesory (2)
    https://www.root.cz/clanky/prekladace-programovaciho-jazyka-c-pro-historicke-osmibitove-mikroprocesory-2/
  11. Getting Started Programming in C: Coding a Retro Game with C Part 2
    https://retrogamecoders.com/getting-started-with-c-cc65/
  12. NES game development in 6502 assembly – Part 1
    https://kibrit.tech/en/blog/nes-game-development-part-1
  13. NES 6502 Programming Tutorial – Part 1: Getting Started
    https://dev.xenforo.relay­.cool/index.php?threads/nes-6502-programming-tutorial-part-1-getting-started.858389/
  14. Minimal NES example using ca65
    https://github.com/bbbradsmith/NES-ca65-example
  15. List of 6502-based Computers and Consoles
    https://www.retrocompute.co.uk/list-of-6502-based-computers-and-consoles/
  16. 6502 – the first RISC µP
    http://ericclever.com/6500/
  17. 3 Generations of Game Machine Architecture
    http://www.atariarchives.or­g/dev/CGEXPO99.html
  18. “Hello, world” from scratch on a 6502 — Part 1
    https://www.youtube.com/wat­ch?v=LnzuMJLZRdU
  19. A Tour of 6502 Cross-Assemblers
    https://bumbershootsoft.wor­dpress.com/2016/01/31/a-tour-of-6502-cross-assemblers/
  20. Adventures with ca65
    https://atariage.com/forum­s/topic/312451-adventures-with-ca65/
  21. example ca65 startup code
    https://atariage.com/forum­s/topic/209776-example-ca65-startup-code/
  22. 6502 PRIMER: Building your own 6502 computer
    http://wilsonminesco.com/6502primer/
  23. 6502 Instruction Set
    https://www.masswerk.at/6502/6502_in­struction_set.html
  24. Chip Hall of Fame: MOS Technology 6502 Microprocessor
    https://spectrum.ieee.org/tech-history/silicon-revolution/chip-hall-of-fame-mos-technology-6502-microprocessor
  25. Single-board computer
    https://en.wikipedia.org/wiki/Single-board_computer
  26. www.6502.org
    http://www.6502.org/
  27. 6502 PRIMER: Building your own 6502 computer – clock generator
    http://wilsonminesco.com/6502pri­mer/ClkGen.html
  28. Great Microprocessors of the Past and Present (V 13.4.0)
    http://www.cpushack.com/CPU/cpu.html
  29. Jak se zrodil procesor?
    https://www.root.cz/clanky/jak-se-zrodil-procesor/
  30. Osmibitové mikroprocesory a mikrořadiče firmy Motorola (1)
    https://www.root.cz/clanky/osmibitove-mikroprocesory-a-mikroradice-firmy-motorola-1/
  31. Mikrořadiče a jejich použití v jednoduchých mikropočítačích
    https://www.root.cz/clanky/mikroradice-a-jejich-pouziti-v-jednoduchych-mikropocitacich/
  32. Mikrořadiče a jejich aplikace v jednoduchých mikropočítačích (2)
    https://www.root.cz/clanky/mikroradice-a-jejich-aplikace-v-jednoduchych-mikropocitacich-2/
  33. 25 Microchips That Shook the World
    https://spectrum.ieee.org/tech-history/silicon-revolution/25-microchips-that-shook-the-world
  34. Comparison of instruction set architectures
    https://en.wikipedia.org/wi­ki/Comparison_of_instructi­on_set_architectures
  35. How To Start Learning Atari 8 Bit Assembly For Free
    https://forums.atariage.com/to­pic/300732-how-to-start-learning-atari-8-bit-assembly-for-free/
  36. WUDSN (Demo Group)
    https://www.wudsn.com/
  37. Machine Language For Beginners
    https://www.atariarchives.org/mlb/
  38. Assembly language: all about I/O
    https://www.atarimagazines­.com/v3n8/AllAbout_IO.html
  39. Sedmdesátiny assemblerů: lidsky čitelný strojový kód
    https://www.root.cz/clanky/sed­mdesatiny-assembleru-lidsky-citelny-strojovy-kod/
  40. Color names
    https://atariwiki.org/wiki/Wi­ki.jsp?page=Color%20names
  41. ATASCII
    https://en.wikipedia.org/wiki/ATASCII
  42. Put characters in display ram isn't ATASCII?
    https://forums.atariage.com/to­pic/359973-put-characters-in-display-ram-isnt-atascii/
  43. ATASCII And Internal Character Code Values
    https://www.atariarchives­.org/mapping/appendix10.php
  44. Reading ATASCII from the keyboard in assembly
    https://forums.atariage.com/to­pic/361733-reading-atascii-from-the-keyboard-in-assembly/
  45. Why does the 6502 JSR instruction only increment the return address by 2 bytes?
    https://retrocomputing.stac­kexchange.com/questions/19543/why-does-the-6502-jsr-instruction-only-increment-the-return-address-by-2-bytes
  46. Pushing return address to stack off by 1 byte
    https://forums.atariage.com/to­pic/378206-pushing-return-address-to-stack-off-by-1-byte/
  47. Intel x86 documentation has more pages than the 6502 has transistors
    https://www.righto.com/2013/09/intel-x86-documentation-has-more-pages.html
  48. Clearing a Section of Memory
    http://www.6502.org/source/ge­neral/clearmem.htm
  49. Practical Memory Move Routines by Bruce Clark
    http://www.6502.org/source/ge­neral/memory_move.html
  50. 6502 Assembly Programming Guide
    https://neumont-gamedev.github.io/posts/retrogamedev-6502-guide/
  51. Off-by-one error
    https://en.wikipedia.org/wiki/Off-by-one_error
  52. 6502 cycle times
    https://www.nesdev.org/wi­ki/6502_cycle_times
  53. Atari TIA
    http://www.atarihq.com/danb/tia.shtml
  54. TIA Playfield
    http://www.atarihq.com/dan­b/TIA/Playfield.shtml
  55. Atari Inc.:
    ANTIC C012296 (NTSC) Revision D
    Atari Incorporated, Sunnyvale CA, 1982
  56. Atari Inc.:
    GTIA C014805 (NTSC) Revision A
    Atari Incorporated, Sunnyvale CA, 1982
  57. Atari 5200
    http://www.atariage.com/sof­tware_search.html?SystemID=5200
  58. Atari 5200 Hardware and Accessories
    http://www.atariage.com/5200/ar­chives/hardware.html
  59. Atari 5200 Screenshots
    http://www.atariage.com/sys­tem_items.html?SystemID=5200&I­temTypeID=SCREENSHOT
  60. History of video game consoles (second generation): Wikipedia
    http://en.wikipedia.org/wi­ki/History_of_video_game_con­soles_(second_generation)
  61. Atari 5200: Wikipedia
    http://en.wikipedia.org/wi­ki/Atari_5200
  62. Player-Missile Graphics
    https://www.atariarchives­.org/agagd/chapter5.php
  63. Sprite (computer graphics)
    https://en.wikipedia.org/wi­ki/Sprite_(computer_graphic­s)
Neutrální ikona do widgetu na odběr článků ze seriálů

Zajímá vás toto téma? Chcete se o něm dozvědět víc?

Objednejte si upozornění na nově vydané články do vašeho mailu. Žádný článek vám tak neuteče.


Autor článku

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



Nejnovější články