Programování grafického kernelu na osmibitových Atari

4. 6. 2026
Doba čtení: 81 minut

Sdílet

Projekt Atari perex.
Autor: Michal Tauchman, podle licence: CC BY-SA 4.0
Projekt Atari perex.
Článek je věnován problematice takzvaného grafického kernelu. Jedná se o podprogram (subrutinu) běžící souběžně s generováním obrazu, který umožňuje zvýšit počet barev, počet zobrazených spritů atd.

Dnešním článkem uzavřeme tu část seriálu o osmibitových domácích mikropočítačích Atari, která byla věnována jeho grafickým schopnostem. Připomeňme si, že jsme si popsali jak možnosti nabízené čipem GTIA (primárně se jedná o podporu pro sprity a taktéž pro speciální GTIA režimy), tak i ANTIC (kombinace barvových režimů, DLI a VBI). Dnešní článek je věnován problematice takzvaného grafického kernelu. Jedná se o podprogram (subrutinu), který je nějakým způsobem synchronizovaný s generováním obrazu a jenž tudíž běží souběžně s generováním obrazu.

Co se dozvíte v článku
  1. Notoricky známý příklad: duha (zobrazení všech barev)
  2. Úplný zdrojový kód prvního demonstračního příkladu
  3. Plynule scrollující duha
  4. Úplný zdrojový kód druhého demonstračního příkladu
  5. Dvě nezávisle scrollující duhové pruhy: herní plocha a pozadí
  6. Úplný zdrojový kód třetího demonstračního příkladu
  7. Kernel modifikující barvy na aktuálním televizním řádku v reálném čase
  8. Úplný zdrojový kód čtvrtého demonstračního příkladu
  9. Zákaz DMA ANTICu a přesná synchronizace programu s paprskem
  10. Úplný zdrojový kód pátého demonstračního příkladu
  11. Větší množství barev v režimech GTIA
  12. Úprava display listu a nová podoba grafických kernelů
  13. Úplný zdrojový kód šestého demonstračního příkladu: více barev v režimu GTIA 9
  14. Úplný zdrojový kód sedmého demonstračního příkladu: více barev v režimu GTIA 11
  15. Skládáme vše dohromady: grafický kernel, DLI a zobrazení spritů
  16. Úplný zdrojový kód posledního demonstračního příkladu
  17. Příloha: Makefile pro překlad všech demonstračních příkladů
  18. Repositář s demonstračními příklady
  19. Odkazy na Internetu

Díky tomu je možné (pochopitelně pouze při použití korektních technik) zvýšit počet současně použitelných barev, zvětšit počet zobrazených spritů na obrazovce atd. Grafický kernel si tedy (při použití moderních termínů) můžeme představit jako vlákno spouštěné v určitých přesně definovaných okamžicích.

Otázkou zůstává, jakým způsobem se grafický kernel synchronizuje s generováním obrazu. Teoreticky je nutné mít k dispozici tři možnosti synchronizace:

  1. Synchronizace se začátkem či naopak s koncem vykreslování celého snímku. To lze na osmibitových Atari zajistit relativně snadno, konkrétně s využitím VBI resp. subrutiny vyvolané při VBI (připomeňme si možnost naprogramování jak přímé reakce na VBI, tak i takzvané odložené VBI).
  2. Synchronizace se začátkem vykreslování obrazového (televizního) řádku. Zde mají vývojáři k dispozici dva mechanismy. Buď nakonfigurování a vyvolání DLI (tedy úprava display listu) nebo aktivní čekání zápisem do registru WSYNC. K oběma těmto způsobům se dnes dostaneme.
  3. Synchronizace s vykreslením jednotlivých pixelů. Tato technika nemá (minimálně na osmibitových Atari) podporu v hardware, takže se musíme uchýlit k počítání strojových cyklů, ovšem se všemi nevýhodami, které to přináší. Navíc se musí počítat s dalšími přerušeními (několik cyklů si například „ukradne“ ANTIC) a aby toho nebylo málo, není mikroprocesor MOS 6502 dostatečně rychlý na to, aby například dokázal měnit barvy individuálních pixelů. K této problematice se dnes opět dostaneme.

Ještě si připomeňme (z předchozího článku), jak vlastně souvisí časování generování televizního obrazu s frekvencí mikroprocesoru MOS 6502. Pro jednoduchost se zaměříme na Atari upravené pro televizní normu PAL (NTSC je odlišná monstrozita, časování snímků a řádků je zde odlišné). Mikroprocesor MOS 6502 má na Atari pro PAL nastavenu frekvenci přibližně 1,77 MHz. Z této frekvence lze (převrácenou hodnotou) vypočítat dobu trvání jednoho cyklu CPU. Z této doby je dalším dělením dvěma odvozena hodnota nazývaná color cycle (důvod pro toto označení si hned řekneme).

Poznámka: CPU ve skutečnosti vykoná méně cyklů, než by odpovídalo výpočtu. ANTIC totiž používá DMA a při přístupu do paměti je CPU pozastaven. To si dokonce můžeme vizualizovat – viz závěrečné demonstrační příklady, které jsou zaměřeny přesně na tento problém.

Zobrazení snímků je do značné míry svázáno s frekvencí CPU a tím pádem i s výše uvedeným barvovým cyklem. Zobrazení jednoho obrazového řádku na televizoru trvá 228 barvových cyklů (a tím pádem 114 cyklů procesoru). Označení color cycle vychází z toho, že barvy na obrazovce lze modifikovat právě v jednotlivých barvových cyklech (nikoli CPU cyklech). Výjimkou jsou monochromatické režimy GR.0 a GR.8, které zobrazují pixely s poloviční šířkou (pixel=1/2 color cycle) a proto se v těchto režimech barvy pixelů nemohou měnit (modifikují se jen jejich intenzity).

Poznámka: zatímco u osmibitových domácích mikropočítačů Atari je možnost naprogramování grafického kernelu jen určitá třešnička na dortu (mnoho her se bez něj obejde), u osmibitové herní konzole Atari 2600 jiná možnost jak zobrazit grafiku nebyla. Tato konzole totiž neobsahovala žádný čip, který by nahradil ANTIC. K dispozici byl jen čip TIA (poměrně primitivní předchůdce CTIA a GTIA), jenž dokázal zobrazit jednořádkové herní pole a jednořádkové sprity. Programátoři tedy byli doslova přinuceni naprogramovat kernel a řešit vykreslování každého řádku (tato technika se taktéž nazývá „dohánění TV paprsku“). To byla doba pravých hackerů…

Notoricky známý příklad: duha (zobrazení všech barev)

Začneme poměrně jednoduchým grafickým kernelem, který i přes svoji triviálnost ukazuje možnosti a schopnosti této programátorské techniky. Tento konkrétní kernel je vyvolán při DLI (a tedy vyžaduje úpravu display listu), ovšem interně je značně jednoduchý. Můžeme zde vidět implementaci počítané programové smyčky, která se bude opakovat 192×, což je (nikoli náhodou) celkový počet obrazových řádků v režimu GR.8 (24 textových řádků × 8 obrazových řádků/řádek textový = 192):

; ---------------------------------------------------------------------
; obsluha DLI
; ---------------------------------------------------------------------
dli:
        ldx #192                ; počitadlo řádků
next_line:
        ...
        ...
        ...
        dex
        bne next_line           ; opakovat 192x
        rti                     ; návrat z DLI

A co konkrétně se v této smyčce provádí? Nejprve se realizuje zápis do HW registru WSYNC. Připomeňme si, že tato operace počká na horizontální synchronizaci obrazu a tedy vlastně čekáme na začátek zobrazení dalšího obrazového řádku. A po zápisu do WSYNC uložíme do barvového registru COLPF2 (barva pozadí v GR.8) aktuální hodnotu index registru X (počitadlo řádků), čímž se pro celý obrazový řádek, který se právě začal vykreslovat, změnila barva kreslení:

; ---------------------------------------------------------------------
; obsluha DLI
; ---------------------------------------------------------------------
dli:
        ldx #192                ; počitadlo řádků
next_line:
        stx COLPF2              ; změna barvy
        sta WSYNC               ; čekání na další řádek
        dex
        bne next_line           ; opakovat 192x
        rti                     ; návrat z DLI

Výsledek znají všichni uživatelé počítačů Atari – jedná se o klasickou duhu použitou v nepřeberném množství her a dem:

Zobrazení duhy v grafické režimu 0.

 Obrázek 1: Klasická duha je jedním z typických triků na Atari.

Autor: tisnik, podle licence: Rights Managed

Poznámka: za povšimnutí stojí fakt, že doba běhu této na první pohled malé a rychlé subrutiny ve skutečnosti trvá prakticky tak dlouho, jako vykreslení celého snímku (resp. jeho viditelné části). Je tomu tak proto, že sta WSYNC pozdrží dokončení instrukce na několik desítek strojových cyklů (prakticky se jedná téměř přesně o 100 cyklů).

Aby se vůbec subrutina s obsluhou DLI vyvolala, musíme DLI povolit, a to jedenkrát pro celý display list (ne vícekrát, už jen kvůli době trvání subrutiny). Pro zajímavost jsem display list upravil takovým způsobem, aby se DLI vyvolalo ještě na horním (černém) okraji obrazovky, protože příznak DL_DLI je použit u instrukce DL_BLK8:

dlist:
.byte DL_BLK8, DL_BLK8, DL_DLI+DL_BLK8 ; 3x8=24 prázdných obrazových řádků
.byte DL_LMS+DL_CHR40x8x1       ; určení počáteční adresy obrazové paměti + jeden řádek režimu 2 (GR.0)
.byte <screen, >screen          ; počáteční adresa obrazové paměti 
.res 23, DL_CHR40x8x1           ; opakovat řádky textového režimu 2 (GR.0)
.byte DL_JVB, <dlist, >dlist    ; skok na začátek display listu
Poznámka: sami si vyzkoušejte display list změnit takovým způsobem, aby se DLI vyvolalo na jiném řádku (poté je ovšem nutné či minimálně vhodné upravit počitadlo v DLI).

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

Následuje výpis zdrojového kódu dnešního prvního demonstračního příkladu, který posloužil pro vygenerování obrázku ukázaného v předchozí kapitole. Povšimněte si, jak krátký tento program ve skutečnosti je:

.include "atari.inc"
 
.CODE
 
 
.proc main
        lda #<dlist             ; nižší byte adresy display listu
        sta SDLSTL
        lda #>dlist             ; vyšší byte adresy display listu
        sta SDLSTH
 
        ; vektor DLI
        lda #<dli               ; nastavení DLI
        sta VDSLST
        lda #>dli
        sta VDSLST+1
 
        ; povolení DLI
        NMIEN_DLI=$80           ; maska povolení DLI
        NMIEN_VBI=$40           ; maska povolení VBI
        lda #NMIEN_DLI | NMIEN_VBI ; povolení DLI
        sta NMIEN
 
loop:   jmp loop
.endproc
 
 
; ---------------------------------------------------------------------
; obsluha DLI
; ---------------------------------------------------------------------
dli:
        ldx #192                ; počitadlo řádků
next_line:
        stx COLPF2              ; změna barvy
        sta WSYNC               ; čekání na další řádek
        dex
        bne next_line           ; opakovat 192x
        rti                     ; návrat z DLI
 
 
dlist:
.byte DL_BLK8, DL_BLK8, DL_DLI+DL_BLK8 ; 3x8=24 prázdných obrazových řádků
.byte DL_LMS+DL_CHR40x8x1       ; určení počáteční adresy obrazové paměti + jeden řádek režimu 2 (GR.0)
.byte <screen, >screen          ; počáteční adresa obrazové paměti 
.res 23, DL_CHR40x8x1           ; opakovat řádky textového režimu 2 (GR.0)
.byte DL_JVB, <dlist, >dlist    ; skok na začátek display listu
 
end:
 
.BSS
screen: .res 40*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

Plynule scrollující duha

Pokusme se nyní o nepatrnou modifikaci našeho grafického kernelu, a to konkrétně takovým způsobem, aby se zobrazil další známý grafický efekt. Jedná se o plynule scrollující duhu, tj. o obdobu předchozího efektu, ovšem vhodně upraveného takovým způsobem, aby se duha plynule pohybovala nahoru či dolů. Pohyb je skutečně plynulý, protože je navázán na synchronizaci kernelu s DLI.

Zobrazení animované duhy.

 Obrázek 2: Animovaná duha.

Autor: tisnik, podle licence: Rights Managed

Nejprve v programovém kódu rezervujeme bajt, který bude obsahovat hodnotu představující posun duhy. Tato hodnota se při každém snímku zvýší nebo naopak sníží o jedničku (popř. můžete posun navázat na náklon joysticku atd.). Ideální by bylo tento bajt uložit do nulté stránky paměti, ovšem prozatím si vystačíme s bajtem umístěným „náhodně“ (adresa bude zvolena assemblerem):

color: .byte 0

V subrutině volané při každém DLI (v našem případě tedy na začátku snímku) se opět používá kombinace instrukcí pro synchronizaci sta WSYNC s instrukcí pro změnu barvy v registru COLPF2. A opět použijeme počitadlo 192 řádků realizované index registrem X, ovšem s jedním rozdílem – počáteční hodnota zapisovaná do COLPF2 není přímo odvozena z obsahu registru X (počitadla), ale naopak registru Y, který je inicializován na hodnotu přečtenou z adresy color:

; ---------------------------------------------------------------------
; obsluha DLI
; ---------------------------------------------------------------------
dli:
        ldx #192                ; počitadlo řádků
        ldy color               ; počáteční barva
next_line:
        sty COLPF2              ; změna barvy
        sta WSYNC               ; čekání na další řádek
        iny                     ; další barva v paletě
        dex
        bne next_line           ; opakovat 192x
        inc color               ; počáteční barva pro další snímek
        rti                     ; návrat z DLI
Poznámka: mimochodem si povšimněte ještě jednoho specifika mikroprocesoru MOS 6502. Tím je existence instrukce INC, která dokáže zvýšit hodnotu uloženou v operační paměti s využitím prakticky všech dostupných adresovacích režimů. Nejsme tedy nuceni otrocky psát:
        ltx color
        inx
        stx color

Mimochodem: akumulátor je (poněkud paradoxně) pro tento účel zcela nevhodný kvůli tomu, že je nutné nastavit nebo naopak vynulovat příznak carry a provádět součet s konstantou, nikoli přímo realizovat inkrementaci.

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

Zdrojový kód dnešního druhé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
 
        ; vektor DLI
        lda #<dli               ; nastavení DLI
        sta VDSLST
        lda #>dli
        sta VDSLST+1
 
        ; povolení DLI
        NMIEN_DLI=$80           ; maska povolení DLI
        NMIEN_VBI=$40           ; maska povolení VBI
        lda #NMIEN_DLI | NMIEN_VBI ; povolení DLI
        sta NMIEN
 
loop:   jmp loop
.endproc
 
 
; ---------------------------------------------------------------------
; obsluha DLI
; ---------------------------------------------------------------------
dli:
        ldx #192                ; počitadlo řádků
        ldy color               ; počáteční barva
next_line:
        sty COLPF2              ; změna barvy
        sta WSYNC               ; čekání na další řádek
        iny                     ; další barva v paletě
        dex
        bne next_line           ; opakovat 192x
        inc color               ; počáteční barva pro další snímek
        rti                     ; návrat z DLI
 
 
dlist:
.byte DL_BLK8, DL_BLK8, DL_DLI+DL_BLK8 ; 3x8=24 prázdných obrazových řádků
.byte DL_LMS+DL_CHR40x8x1       ; určení počáteční adresy obrazové paměti + jeden řádek režimu 2 (GR.0)
.byte <screen, >screen          ; počáteční adresa obrazové paměti 
.res 23, DL_CHR40x8x1           ; opakovat řádky textového režimu 2 (GR.0)
.byte DL_JVB, <dlist, >dlist    ; skok na začátek display listu
 
end:
 
color: .byte 0
 
.BSS
screen: .res 40*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

Dvě nezávisle scrollující duhové pruhy: herní plocha a pozadí

V další verzi se pokusíme efekt scrollující duhy ještě nepatrně vylepšit. Namísto jedné duhy zobrazíme duhy dvě (obě pohyblivé). Jedna duha bude zobrazena v herním poli (playfield), druhá na okraji (border). A každá duha se bude pohybovat odlišnou rychlostí. Na začátku subrutiny pro obsluhu DLI se počitadlo color uloží do index registru Y, zatímco doplněk této hodnoty do akumulátoru A:

        ldy color               ; počáteční barva
        lda #$ff
        clc
        sbc color

V programové smyčce obsahující samotný grafický kernel se opět provádí synchronizace s televizními řádky. A nastavují se dva barvové registry COLPF2 a COLBK. Za smyčkou se ještě barva pozadí nastaví na černou barvu, protože v opačném případě by spodní část obrazovky poblikávala (v herním poli jsme to nemuseli řešit, ale okraj je viditelný):

next_line:
        sty COLPF2              ; změna barvy
        sta WSYNC               ; čekání na další řádek
        iny                     ; další barva v paletě
 
        sta COLBK               ; změna barvy okraje
        clc
        sbc #1
 
        dex
        bne next_line           ; opakovat 192x
        inc color               ; počáteční barva pro další snímek
 
        lda #0                  ; černá barva
        sta COLBK               ; změna barvy spodního okraje
 
        rti                     ; návrat z DLI

Výsledek:

Zobrazení dvojice animovaných duh.

 Obrázek 3: Dvojice animovaných duh.

Autor: tisnik, podle licence: Rights Managed

Pro zajímavost si ještě ukažme modifikaci tohoto příkladu do podoby s úzkým herním polem (narrow playfield):

Zobrazení dvojice animovaných duh, úzké herní pole.

 Obrázek 4: Animované duhy a úzké herní pole.

Autor: tisnik, podle licence: Rights Managed

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

Opět následuje výpis úplného zdrojového kódu dnešního třetího demonstračního příkladu, který vypadá takto:

.include "atari.inc"
 
.CODE
 
 
.proc main
        lda #<dlist             ; nižší byte adresy display listu
        sta SDLSTL
        lda #>dlist             ; vyšší byte adresy display listu
        sta SDLSTH
 
        ; vektor DLI
        lda #<dli               ; nastavení DLI
        sta VDSLST
        lda #>dli
        sta VDSLST+1
 
        ; povolení DLI
        NMIEN_DLI=$80           ; maska povolení DLI
        NMIEN_VBI=$40           ; maska povolení VBI
        lda #NMIEN_DLI | NMIEN_VBI ; povolení DLI
        sta NMIEN
 
loop:   jmp loop
.endproc
 
 
; ---------------------------------------------------------------------
; obsluha DLI
; ---------------------------------------------------------------------
dli:
        ldx #192                ; počitadlo řádků
        ldy color               ; počáteční barva
        lda #$ff
        clc
        sbc color
next_line:
        sty COLPF2              ; změna barvy
        sta WSYNC               ; čekání na další řádek
        iny                     ; další barva v paletě
 
        sta COLBK               ; změna barvy okraje
        clc
        sbc #1
 
        dex
        bne next_line           ; opakovat 192x
        inc color               ; počáteční barva pro další snímek
 
        lda #0                  ; černá barva
        sta COLBK               ; změna barvy spodního okraje
 
        rti                     ; návrat z DLI
 
 
dlist:
.byte DL_BLK8, DL_BLK8, DL_DLI+DL_BLK8 ; 3x8=24 prázdných obrazových řádků
.byte DL_LMS+DL_CHR40x8x1       ; určení počáteční adresy obrazové paměti + jeden řádek režimu 2 (GR.0)
.byte <screen, >screen          ; počáteční adresa obrazové paměti 
.res 23, DL_CHR40x8x1           ; opakovat řádky textového režimu 2 (GR.0)
.byte DL_JVB, <dlist, >dlist    ; skok na začátek display listu
 
end:
 
color: .byte 0
 
.BSS
screen: .res 40*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

Pro nastavení úzkého herního pole je použita tato modifikace:

; ---------------------------------------------------------------------
; nastavení spodních dvou bitů stínového registru SDMCTL
; ---------------------------------------------------------------------
.macro  set_playfield_width bitfield
        lda SDMCTL              ; načíst stínový registr
        and #%11111100          ; vynulovat spodní dva bity
        ora bitfield            ; nastavit spodní dva bity na zvolenou masku
        sta SDMCTL              ; a uložit zpět
.endmacro

a:

.proc main
        lda #<dlist             ; nižší byte adresy display listu
        sta SDLSTL
        lda #>dlist             ; vyšší byte adresy display listu
        sta SDLSTH
 
        set_playfield_width #%01 ; šířka herního pole 
        ; vektor DLI
        lda #<dli               ; nastavení DLI
        sta VDSLST
        lda #>dli
        sta VDSLST+1
 
        ; povolení DLI
        NMIEN_DLI=$80           ; maska povolení DLI
        NMIEN_VBI=$40           ; maska povolení VBI
        lda #NMIEN_DLI | NMIEN_VBI ; povolení DLI
        sta NMIEN

Kernel modifikující barvy na aktuálním televizním řádku v reálném čase

Pokusme se nyní o návrh komplikovanějšího kernelu, konkrétně kernelu, který modifikuje barvu v průběhu zobrazení televizního řádku. Tímto trikem lze zobrazit mnohem větší počet barev na jednom řádku, ovšem chybí nám zde jedna klíčová vlastnost: přesná synchronizace na úrovni jednotlivých pixelů. Tuto možnost čipy ANTIC ani GTIA nenabízí, takže nám nezbývá než počítat jednotlivé cykly. To je ovšem komplikované (jak ostatně uvidíme), protože mikroprocesor je v průběhu zobrazování pozastavován čipem ANTIC, který načítá data z paměti přes DMA. Z tohoto důvodu není počítání cyklů snadné, protože se časování na jednotlivých řádcích postupně mění.

Grafický kernel, který je ukázaný pod tímto odstavcem, nejprve nastaví barvu herního pole na hodnotu uloženou v registru Y (ta postupně roste po jednotlivých řádcích). Poté se vykoná deset instrukcí NOP, z nichž každá trvá dva cykly. Celkem tedy CPU vykoná minimálně dvacet cyklů, což by teoreticky mělo odpovídat deseti color cyklům a tedy dvěma znakům. Následně se barva herního pole změní na černou a počká se na dokončení vykreslení televizního řádku:

; ---------------------------------------------------------------------
; obsluha DLI
; ---------------------------------------------------------------------
dli:
        ldx #192                ; počitadlo řádků
        ldy color               ; počáteční barva
next_line:
        sty COLPF2              ; změna barvy
        iny                     ; další barva v paletě
        .repeat 10
        nop
        .endrepeat
        lda #0
        sta COLPF2              ; změna barvy
        sta WSYNC               ; čekání na další řádek
 
        dex
        bne next_line           ; opakovat 192x
        inc color               ; počáteční barva pro další snímek
        rti                     ; návrat z DLI

Očekávali bychom, že se stále zobrazí duha, ovšem zkrácená na šířku přibližně dvou či tří znaků. Ovšem skutečnost je odlišná:

Vliv DMA čipu ANTIC na změnu barev v rámci jednotlivých obrazových řádků.

 Obrázek 5: Vliv DMA na grafický kernel, který mění barvy v rámci jednoho řádku.

Autor: tisnik, podle licence: Rights Managed

Můžeme zde vidět, že CPU je na některých řádcích „zpožděn“ čipem ANTIC. Jedná se o začátky textových řádků, tj. každý osmý obrazový řádek je zobrazen odlišně – změna barvy na černou je opožděna tak, že zasahuje až do řádku dalšího (ANTIC načítá instrukci display listu, ale též tvary znaků atd.). Z této jednoduché ukázky je patrné, že práce na úrovni jednotlivých řádků není jednoduchá (a navíc se nevyplatí používat textové režimy, ve kterých neplatí vztah logický řádek==televizní řádek).

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

Následuje výpis úplného zdrojového kódu dnešního čtvrtého demonstračního příkladu, který vypadá takto:

.include "atari.inc"
 
.CODE
 
 
.proc main
        lda #<dlist             ; nižší byte adresy display listu
        sta SDLSTL
        lda #>dlist             ; vyšší byte adresy display listu
        sta SDLSTH
 
        ; vektor DLI
        lda #<dli               ; nastavení DLI
        sta VDSLST
        lda #>dli
        sta VDSLST+1
 
        ; povolení DLI
        NMIEN_DLI=$80           ; maska povolení DLI
        NMIEN_VBI=$40           ; maska povolení VBI
        lda #NMIEN_DLI | NMIEN_VBI ; povolení DLI
        sta NMIEN
 
loop:   jmp loop
.endproc
 
 
; ---------------------------------------------------------------------
; obsluha DLI
; ---------------------------------------------------------------------
dli:
        ldx #192                ; počitadlo řádků
        ldy color               ; počáteční barva
next_line:
        sty COLPF2              ; změna barvy
        iny                     ; další barva v paletě
        .repeat 10
        nop
        .endrepeat
        lda #0
        sta COLPF2              ; změna barvy
        sta WSYNC               ; čekání na další řádek
 
        dex
        bne next_line           ; opakovat 192x
        inc color               ; počáteční barva pro další snímek
        rti                     ; návrat z DLI
 
 
dlist:
.byte DL_BLK8, DL_BLK8, DL_DLI+DL_BLK8 ; 3x8=24 prázdných obrazových řádků
.byte DL_LMS+DL_CHR40x8x1       ; určení počáteční adresy obrazové paměti + jeden řádek režimu 2 (GR.0)
.byte <screen, >screen          ; počáteční adresa obrazové paměti 
.res 23, DL_CHR40x8x1           ; opakovat řádky textového režimu 2 (GR.0)
.byte DL_JVB, <dlist, >dlist    ; skok na začátek display listu
 
end:
 
color: .byte 0
 
.BSS
screen: .res 40*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

Zákaz DMA ANTICu a přesná synchronizace programu s paprskem

Otázkou zůstává, jestli je vůbec možné na osmibitových mikropočítačích Atari dosáhnout toho, aby bylo v grafickém kernelu možné počítat strojové cykly bez toho, aby do nich zasahoval ANTIC se svým DMA. Řešení existuje a je jednoduché – ANTIC „odstřihneme“ od DMA. Sice se nebude zobrazovat běžný textový či grafický režim, ale to do určité míry můžeme vyřešit v grafickém kernelu (alespoň pro účely dema).

Nejprve upravíme display list takovým způsobem, aby obsahoval jen instrukce DL_BLK8. Teoreticky je možné display list zkrátit pouze na dvě instrukce (konkrétně na DL_DLI+DL_BLK8 a DL_VJB, ale ponechme ho v podobě, která odpovídá textovému režimu GR.0, ovšem s tím rozdílem, že se zobrazují jen prázdné řádky:

dlist:
.byte DL_BLK8, DL_BLK8, DL_DLI+DL_BLK8 ; 3x8=24 prázdných obrazových řádků
.res 24, DL_BLK8                ; opakovat řádky textového režimu 2 (GR.0)
.byte DL_JVB, <dlist, >dlist    ; skok na začátek display listu

A následně nesmíme zapomenout na zákaz DMA:

        lda #0
        sta DMACTL

Samotný grafický kernel je upraven do takové podoby, že na jednom řádku přepíná barvu několikrát, a to vždy po deseti instrukcích NOP (dvacet cyklů). Na obrazovce tak bude jasně patrné, jaká je „šířka dvaceti cyklů“ (resp. spíše 25 cyklů kvůli zápisu nové barvy):

; ---------------------------------------------------------------------
; obsluha DLI
; ---------------------------------------------------------------------
dli:
        lda #0
        sta DMACTL
        ldx #192                ; počitadlo řádků
        ldy color               ; počáteční barva
        sta WSYNC               ; čekání na další řádek
next_line:
        sty COLBK               ; změna barvy
        iny                     ; další barva v paletě
 
        .repeat 10
        nop
        .endrepeat
 
        lda #0
        sta COLBK               ; změna barvy
 
        .repeat 10
        nop
        .endrepeat
 
        sty COLBK
 
        .repeat 10
        nop
        .endrepeat
        sta COLBK               ; změna barvy
 
        sta WSYNC               ; čekání na další řádek
 
        lda #0
        sta COLBK               ; změna barvy
 
        dex
        bne next_line           ; opakovat 192x
        inc color               ; počáteční barva pro další snímek
        rti                     ; návrat z DLI

Výsledkem je naprosto čistá animace (až na první řádek – ten ovšem není synchronizován přes WSYNC):

Korektní zobrazení "přerušované" duhy při vypnutí DMA čipu ANTIC.

 Obrázek 6: Korektní "přerušovaná duha" (vypnutí DMA).

Autor: tisnik, podle licence: Rights Managed

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

Dnešní v pořadí již pátý demonstrační příklad má následující zdrojový kód:

.include "atari.inc"
 
.CODE
 
 
.proc main
        lda #<dlist             ; nižší byte adresy display listu
        sta SDLSTL
        lda #>dlist             ; vyšší byte adresy display listu
        sta SDLSTH
 
        ; vektor DLI
        lda #<dli               ; nastavení DLI
        sta VDSLST
        lda #>dli
        sta VDSLST+1
 
        ; povolení DLI
        NMIEN_DLI=$80           ; maska povolení DLI
        NMIEN_VBI=$40           ; maska povolení VBI
        lda #NMIEN_DLI | NMIEN_VBI ; povolení DLI
        sta NMIEN
 
loop:   jmp loop
.endproc
 
 
; ---------------------------------------------------------------------
; obsluha DLI
; ---------------------------------------------------------------------
dli:
        lda #0
        sta DMACTL
        ldx #192                ; počitadlo řádků
        ldy color               ; počáteční barva
        sta WSYNC               ; čekání na další řádek
next_line:
        sty COLBK               ; změna barvy
        iny                     ; další barva v paletě
 
        .repeat 10
        nop
        .endrepeat
 
        lda #0
        sta COLBK               ; změna barvy
 
        .repeat 10
        nop
        .endrepeat
 
        sty COLBK
 
        .repeat 10
        nop
        .endrepeat
        sta COLBK               ; změna barvy
 
        sta WSYNC               ; čekání na další řádek
 
        lda #0
        sta COLBK               ; změna barvy
 
        dex
        bne next_line           ; opakovat 192x
        inc color               ; počáteční barva pro další snímek
        rti                     ; návrat z DLI
 
 
dlist:
.byte DL_BLK8, DL_BLK8, DL_DLI+DL_BLK8 ; 3x8=24 prázdných obrazových řádků
.res 24, DL_BLK8                ; opakovat řádky textového režimu 2 (GR.0)
.byte DL_JVB, <dlist, >dlist    ; skok na začátek display listu
 
end:
 
color: .byte 0
 
.BSS
screen: .res 40*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

Větší množství barev v režimech GTIA

Po (alespoň rámcovém) popisu možností grafických kernelů se ještě jednou vrátíme k režimům GTIA. S využitím DLI (nebo i celých grafických kernelů) je totiž možné relativně snadno zobrazit celou paletu 128 nebo dokonce 256 barev, kterými osmibitové mikropočítače Atari disponují. Dále uvedené úpravy jsou založeny na následujícím programu, který napřed provede přepnutí do běžného grafického režimu GR.8 (320×192 pixelů monochromaticky) a vykreslí všech 16 kombinací čtyř sousedních pixelů, počká na stisk klávesy a následně se přepne do GTIA režimu číslo 9:

Všechny kombinace čtyř sousedních pixelů v grafickém režimu GR.8.

Obrázek 7: Všechny kombinace čtyř sousedních pixelů v grafickém režimu GR.8.

Autor: tisnik, podle licence: Rights Managed

Přepnutí do GTIA režimu číslo 9.

Obrázek 8: Přepnutí do GTIA režimu číslo 9.

Autor: tisnik, podle licence: Rights Managed

Tento program je založen na demonstračních příkladech, které jsme si ukázali již minule, takže nevyžaduje podrobnější popis:

; ---------------------------------------------------------------------
; Grafický režim 320x192 se dvěma barvami.
; Korektní display list.
; Vykreslení šestnácti různých kombinací pixelů.
; Přepnutí do GTIA režimu 9.
; ---------------------------------------------------------------------
 
.include "atari.inc"
 
.CODE
 
; dva bloky RAM využité jako obrazová paměť
screen1 = $7000
screen2 = $8000
 
 
 
; ---------------------------------------------------------------------
; makro pro nastavení display listu
; ---------------------------------------------------------------------
.macro  set_display_list label
        lda #<label             ; nižší byte adresy display listu
        sta SDLSTL
        lda #>label             ; vyšší byte adresy display listu
        sta SDLSTH
.endmacro
 
 
 
; ---------------------------------------------------------------------
; vyplnění obrazovky
; ---------------------------------------------------------------------
.macro  fill_screen screen
        .local next_line        ; definice lokálního symbolu
        .local draw_on_line     ; definice lokálního symbolu
        screen_addr = 128
 
        lda #<screen1           ; uložit adresu začátku obrazovky na nultou stránku
        sta screen_addr
        lda #>screen1
        sta screen_addr+1
 
        ldx #96                 ; počitadlo řádků
next_line:
        lda #0                  ; zapisovaná hodnota + počitadlo smyčky
        tay                     ; offset do obrazové paměti
        clc                     ; nechceme přičítat přenos
        ; ---------------------------------------------------------------------
        ; vykreslení pixelů na jednom řádku
        ; ---------------------------------------------------------------------
draw_on_line:
        sta (screen_addr), y    ; zápis na první řádek
        iny                     ; další zápis bude proveden o jeden bajt dále
        adc #1                  ; zvýšení hodnoty v akumulátoru
        cmp #40                 ; konec smyčky?
        bne draw_on_line        ; dokud není nula, pokračovat
 
        lda screen_addr         ; 16bitové zvýšení adresy
        clc
        adc #40
        sta screen_addr
        lda screen_addr+1
        adc #0
        sta screen_addr+1
 
        dex                     ; snížení počitadla
        bne next_line           ; jsme na posledním řádku? ne->skok
.endmacro
 
 
 
; ---------------------------------------------------------------------
; hlavní herní smyčka
; ---------------------------------------------------------------------
.macro  game_loop
        .local loop             ; definice lokálního symbolu
loop:
        jmp loop                ; program vlastně nice nedělá - jen cyklí!
.endmacro
 
 
; ---------------------------------------------------------------------
; vstupní bod do programu
; ---------------------------------------------------------------------
.proc main
        set_display_list dlist  ; nastavení display listu
        fill_screen screen1     ; vyplnění obrazovky
        jsr get_key             ; čekání na stisk klávesy

        jsr gtia_mode_9         ; nastavení GTIA režimu číslo 9

        game_loop               ; hlavní herní smyčka
.endproc
 
 
 
; ---------------------------------------------------------------------
; nastavení GTIA režimu číslo 9
; ---------------------------------------------------------------------
.proc gtia_mode_9
        lda GPRIOR              ; modifikace stínového registru GPRIOR
        ora  #$40               ; výběr GTIA režimu GR.9
        sta GPRIOR
        rts                     ; vyber adresy ze zasobniku + skok
.endproc
 
 
 
; ---------------------------------------------------------------------
; čekání na stisk klávesy
; ---------------------------------------------------------------------
.proc get_key
        KBHANDLER = $e424       ; rutina pro cteni klavesy
        lda KBHANDLER+1         ; cteni horni casti adresy ulozene v ROM
        pha                     ; ulozeni na zasobnik
        lda KBHANDLER           ; cteni dolni casti adresy ulozene v ROM
        pha                     ; ulozeni na zasobnik
        rts                     ; vyber adresy ze zasobniku + skok
                                ; zde neni nutne mit RTS
.endproc
 
 
dlist:
.byte DL_BLK8, DL_BLK8, DL_BLK8 ; 3x8=24 prázdných obrazových řádků
.byte DL_LMS+DL_MAP320x1x1      ; určení počáteční adresy obrazové paměti + jeden řádek režimu F (GR.8)
.byte <screen1, >screen1        ; počáteční adresa obrazové paměti (první blok)
.res 95, DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_LMS+DL_MAP320x1x1      ; určení počáteční adresy obrazové paměti + jeden řádek režimu F (GR.8)
.byte <screen2, >screen2        ; počáteční adresa obrazové paměti (druhý blok)
.res 95, DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_JVB, <dlist, >dlist    ; skok na začátek display listu
 
 
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

Úprava display listu a nová podoba grafických kernelů

Aby se zobrazilo 128 nebo 256 barev, tedy celá dostupná paleta (a přitom se nejednalo o triviální duhu), budeme přepínat barvy v DLI subrutině, tedy v podprogramu, který je zavolán v případě, že instrukce display listu obsahuje příznak DL_DLI. V GTIA režimu číslo 9 postačuje pouze změnit barevný odstín v HW registru COLBK, čímž se vlastně změní odstín všech šestnácti zobrazitelných intenzit pixelů. Jediný zápis tedy změní všech šestnáct barev:

; ---------------------------------------------------------------------
; obsluha DLI
; ---------------------------------------------------------------------
dli:
        pha                     ; uschovat akumulátor
        lda color               ; barva pozadí
        clc
        adc #16
        sta COLBK               ; přímo nastavit zápisem do HW registru
        sta color
        pla                     ; obnovit akumulátor
        rti                     ; návrat z DLI

Pokud je naopak nastavený GTIA režim číslo 11, mění se intenzita barvy a nikoli její odstín. Ovšem stále platí, že postačuje jediný zápis do HW registru COLBK. Intenzita je nyní definována sudým číslem 0 až 14 a proto subrutina obsahuje instrukci AND pro maskování:

; ---------------------------------------------------------------------
; obsluha DLI
; ---------------------------------------------------------------------
dli:
        pha                     ; uschovat akumulátor
        lda color               ; barva pozadí
        clc
        adc #1
        sta color
        and #%00001110
        sta COLBK               ; přímo nastavit zápisem do HW registru
        pla                     ; obnovit akumulátor
        rti                     ; návrat z DLI

To ovšem nestačí. Navíc je nutné změnit i display list. Vždy si necháme vyvolat DLI a poté se zobrazí (stejnými barvami) dalších pět řádků. Celkem tedy vždy šest obrazových řádků bude mít stejný obsah. A proč jsem vybral hodnotu 6? Platí 6×16=96, což je přesně polovina výšky obrazovky. Právě na tomto místě je nutné přepínat na odlišný blok video RAM, protože maximální velikost tohoto bloku je rovna čtyřem kilobajtům. To by nebyl nepřekonatelný problém, ovšem poněkud by se zkomplikoval kód vykreslující vzorek pixelů (cílem těchto článků je co nejčitelnější kód):

dlist:
.byte DL_BLK8, DL_BLK8, DL_BLK8 ; 3x8=24 prázdných obrazových řádků
.byte DL_LMS+DL_MAP320x1x1      ; určení počáteční adresy obrazové paměti + jeden řádek režimu F (GR.8)
.byte <screen1, >screen1        ; počáteční adresa obrazové paměti (první blok)
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.byte DL_LMS+DL_MAP320x1x1      ; určení počáteční adresy obrazové paměti + jeden řádek režimu F (GR.8)
.byte <screen2, >screen2        ; počáteční adresa obrazové paměti (druhý blok)
.res 95, DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_JVB, <dlist, >dlist    ; skok na začátek display listu

Úplný zdrojový kód šestého demonstračního příkladu: více barev v režimu GTIA 9

V režimu 9 vypadá cesta k barvové paletě na obrazovce takto:

Všechny kombinace čtyř sousedních pixelů v grafickém režimu GR.8.

Obrázek 9: Všechny kombinace čtyř sousedních pixelů v grafickém režimu GR.8.

Autor: tisnik, podle licence: Rights Managed

Zapnutí DLI pro změnu barvy okraje (viz poněkud neviditelné tmavé barvy na okraji).

Obrázek 10: Zapnutí DLI pro změnu barvy okraje (viz poněkud neviditelné tmavé barvy na okraji).

Autor: tisnik, podle licence: Rights Managed

GTIA režim číslo 9 + DLI měnící odstíny barev.

Obrázek 11: GTIA režim číslo 9 + DLI měnící odstíny barev.

Autor: tisnik, podle licence: Rights Managed

Zdrojový kód demonstračního příkladu, který zobrazí barvovou paletu s využitím GTIA režimu číslo 9, vypadá následovně:

; ---------------------------------------------------------------------
; Grafický režim 320x192 se dvěma barvami.
; Korektní display list.
; Vykreslení šestnácti různých kombinací pixelů.
; Přepnutí do GTIA režimu 9.
; ---------------------------------------------------------------------
 
.include "atari.inc"
 
.CODE
 
; dva bloky RAM využité jako obrazová paměť
screen1 = $7000
screen2 = $8000
 
 
 
; ---------------------------------------------------------------------
; makro pro nastavení display listu
; ---------------------------------------------------------------------
.macro  set_display_list label
        lda #<label             ; nižší byte adresy display listu
        sta SDLSTL
        lda #>label             ; vyšší byte adresy display listu
        sta SDLSTH
.endmacro
 
 
; ---------------------------------------------------------------------
; makro pro nastavení DLI
; ---------------------------------------------------------------------
.macro  set_dli_handler handler
        ; vektor DLI
        lda #<handler           ; nastavení DLI
        sta VDSLST
        lda #>handler
        sta VDSLST+1
.endmacro
 
 
 
; ---------------------------------------------------------------------
; vyplnění obrazovky
; ---------------------------------------------------------------------
.macro  fill_screen screen
        .local next_line        ; definice lokálního symbolu
        .local draw_on_line     ; definice lokálního symbolu
        screen_addr = 128
 
        lda #<screen1           ; uložit adresu začátku obrazovky na nultou stránku
        sta screen_addr
        lda #>screen1
        sta screen_addr+1
 
        ldx #96                 ; počitadlo řádků
next_line:
        lda #0                  ; zapisovaná hodnota + počitadlo smyčky
        tay                     ; offset do obrazové paměti
        clc                     ; nechceme přičítat přenos
        ; ---------------------------------------------------------------------
        ; vykreslení pixelů na jednom řádku
        ; ---------------------------------------------------------------------
draw_on_line:
        sta (screen_addr), y    ; zápis na první řádek
        iny                     ; další zápis bude proveden o jeden bajt dále
        adc #1                  ; zvýšení hodnoty v akumulátoru
        cmp #40                 ; konec smyčky?
        bne draw_on_line        ; dokud není nula, pokračovat
 
        lda screen_addr         ; 16bitové zvýšení adresy
        clc
        adc #40
        sta screen_addr
        lda screen_addr+1
        adc #0
        sta screen_addr+1
 
        dex                     ; snížení počitadla
        bne next_line           ; jsme na posledním řádku? ne->skok
.endmacro
 
 
 
; ---------------------------------------------------------------------
; hlavní herní smyčka
; ---------------------------------------------------------------------
.macro  game_loop
        .local loop             ; definice lokálního symbolu
loop:
        jmp loop                ; program vlastně nice nedělá - jen cyklí!
.endmacro
 
 
; ---------------------------------------------------------------------
; vstupní bod do programu
; ---------------------------------------------------------------------
.proc main
        set_display_list dlist  ; nastavení display listu
        set_dli_handler dli     ; nastavení obsluhy DLI
        fill_screen screen1     ; vyplnění obrazovky
        jsr get_key             ; čekání na stisk klávesy
 
        jsr enable_dli          ; povolení DLI (a VBI)
        jsr get_key             ; čekání na stisk klávesy
 
        jsr gtia_mode_9         ; nastavení GTIA režimu číslo 9
 
        game_loop               ; hlavní herní smyčka
.endproc
 
 
 
; ---------------------------------------------------------------------
; povolení DLI (a VBI)
; ---------------------------------------------------------------------
.proc enable_dli
        ; povolení DLI
        NMIEN_DLI=$80           ; maska povolení DLI
        NMIEN_VBI=$40           ; maska povolení VBI
        lda #NMIEN_DLI | NMIEN_VBI ; povolení DLI
        sta NMIEN
        rts
.endproc
 
 
 
; ---------------------------------------------------------------------
; nastavení GTIA režimu číslo 9
; ---------------------------------------------------------------------
.proc gtia_mode_9
        lda GPRIOR              ; modifikace stínového registru GPRIOR
        ora  #$40               ; výběr GTIA režimu GR.9
        sta GPRIOR
        rts                     ; vyber adresy ze zasobniku + skok
.endproc
 
 
 
; ---------------------------------------------------------------------
; čekání na stisk klávesy
; ---------------------------------------------------------------------
.proc get_key
        KBHANDLER = $e424       ; rutina pro cteni klavesy
        lda KBHANDLER+1         ; cteni horni casti adresy ulozene v ROM
        pha                     ; ulozeni na zasobnik
        lda KBHANDLER           ; cteni dolni casti adresy ulozene v ROM
        pha                     ; ulozeni na zasobnik
        rts                     ; vyber adresy ze zasobniku + skok
                                ; zde neni nutne mit RTS
.endproc
 
 
; ---------------------------------------------------------------------
; obsluha DLI
; ---------------------------------------------------------------------
dli:
        pha                     ; uschovat akumulátor
        lda color               ; barva pozadí
        clc
        adc #16
        sta COLBK               ; přímo nastavit zápisem do HW registru
        sta color
        pla                     ; obnovit akumulátor
        rti                     ; návrat z DLI
 
 
dlist:
.byte DL_BLK8, DL_BLK8, DL_BLK8 ; 3x8=24 prázdných obrazových řádků
.byte DL_LMS+DL_MAP320x1x1      ; určení počáteční adresy obrazové paměti + jeden řádek režimu F (GR.8)
.byte <screen1, >screen1        ; počáteční adresa obrazové paměti (první blok)
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.byte DL_LMS+DL_MAP320x1x1      ; určení počáteční adresy obrazové paměti + jeden řádek režimu F (GR.8)
.byte <screen2, >screen2        ; počáteční adresa obrazové paměti (druhý blok)
.res 95, DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_JVB, <dlist, >dlist    ; skok na začátek display listu
 
; barva v GTIA režimu 9
color: .byte 1
 
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

Úplný zdrojový kód sedmého demonstračního příkladu: více barev v režimu GTIA 11

V režimu 11 vypadá cesta k barvové paletě na obrazovce následovně:

Všechny kombinace čtyř sousedních pixelů v grafickém režimu GR.8.

Obrázek 12: Všechny kombinace čtyř sousedních pixelů v grafickém režimu GR.8.

Autor: tisnik, podle licence: Rights Managed

Zapnutí DLI pro změnu intenzity barev okraje.

Obrázek 13: Zapnutí DLI pro změnu intenzity barev okraje.

Autor: tisnik, podle licence: Rights Managed

Režim GTIA 11 + DLI pro postupnou změnu intenzity barev.

Obrázek 14: Režim GTIA 11 + DLI pro postupnou změnu intenzity barev.

Autor: tisnik, podle licence: Rights Managed

Opět se podívejme na úplný zdrojový kód příkladu, tentokrát příkladu, který zobrazí barvovou paletu v režimu GTIA 11 a nikoli GTIA 9:

; ---------------------------------------------------------------------
; Grafický režim 320x192 se dvěma barvami.
; Korektní display list.
; Vykreslení šestnácti různých kombinací pixelů.
; Přepnutí do GTIA režimu 11.
; ---------------------------------------------------------------------
 
.include "atari.inc"
 
.CODE
 
; dva bloky RAM využité jako obrazová paměť
screen1 = $7000
screen2 = $8000
 
 
 
; ---------------------------------------------------------------------
; makro pro nastavení display listu
; ---------------------------------------------------------------------
.macro  set_display_list label
        lda #<label             ; nižší byte adresy display listu
        sta SDLSTL
        lda #>label             ; vyšší byte adresy display listu
        sta SDLSTH
.endmacro
 
 
; ---------------------------------------------------------------------
; makro pro nastavení DLI
; ---------------------------------------------------------------------
.macro  set_dli_handler handler
        ; vektor DLI
        lda #<handler           ; nastavení DLI
        sta VDSLST
        lda #>handler
        sta VDSLST+1
.endmacro
 
 
 
; ---------------------------------------------------------------------
; vyplnění obrazovky
; ---------------------------------------------------------------------
.macro  fill_screen screen
        .local next_line        ; definice lokálního symbolu
        .local draw_on_line     ; definice lokálního symbolu
        screen_addr = 128
 
        lda #<screen1           ; uložit adresu začátku obrazovky na nultou stránku
        sta screen_addr
        lda #>screen1
        sta screen_addr+1
 
        ldx #96                 ; počitadlo řádků
next_line:
        lda #0                  ; zapisovaná hodnota + počitadlo smyčky
        tay                     ; offset do obrazové paměti
        clc                     ; nechceme přičítat přenos
        ; ---------------------------------------------------------------------
        ; vykreslení pixelů na jednom řádku
        ; ---------------------------------------------------------------------
draw_on_line:
        sta (screen_addr), y    ; zápis na první řádek
        iny                     ; další zápis bude proveden o jeden bajt dále
        adc #1                  ; zvýšení hodnoty v akumulátoru
        cmp #40                 ; konec smyčky?
        bne draw_on_line        ; dokud není nula, pokračovat
 
        lda screen_addr         ; 16bitové zvýšení adresy
        clc
        adc #40
        sta screen_addr
        lda screen_addr+1
        adc #0
        sta screen_addr+1
 
        dex                     ; snížení počitadla
        bne next_line           ; jsme na posledním řádku? ne->skok
.endmacro
 
 
 
; ---------------------------------------------------------------------
; hlavní herní smyčka
; ---------------------------------------------------------------------
.macro  game_loop
        .local loop             ; definice lokálního symbolu
loop:
        jmp loop                ; program vlastně nice nedělá - jen cyklí!
.endmacro
 
 
; ---------------------------------------------------------------------
; vstupní bod do programu
; ---------------------------------------------------------------------
.proc main
        set_display_list dlist  ; nastavení display listu
        set_dli_handler dli     ; nastavení obsluhy DLI
        fill_screen screen1     ; vyplnění obrazovky
        jsr get_key             ; čekání na stisk klávesy
 
        jsr enable_dli          ; povolení DLI (a VBI)
        jsr get_key             ; čekání na stisk klávesy
 
        jsr gtia_mode_11        ; nastavení GTIA režimu číslo 11
 
        game_loop               ; hlavní herní smyčka
.endproc
 
 
 
; ---------------------------------------------------------------------
; povolení DLI (a VBI)
; ---------------------------------------------------------------------
.proc enable_dli
        ; povolení DLI
        NMIEN_DLI=$80           ; maska povolení DLI
        NMIEN_VBI=$40           ; maska povolení VBI
        lda #NMIEN_DLI | NMIEN_VBI ; povolení DLI
        sta NMIEN
        rts
.endproc
 
 
 
; ---------------------------------------------------------------------
; nastavení GTIA režimu číslo 11
; ---------------------------------------------------------------------
.proc gtia_mode_11
        lda GPRIOR              ; modifikace stínového registru GPRIOR
        ora  #$c0               ; výběr GTIA režimu GR.11
        sta GPRIOR
        rts                     ; vyber adresy ze zasobniku + skok
.endproc
 
 
 
; ---------------------------------------------------------------------
; čekání na stisk klávesy
; ---------------------------------------------------------------------
.proc get_key
        KBHANDLER = $e424       ; rutina pro cteni klavesy
        lda KBHANDLER+1         ; cteni horni casti adresy ulozene v ROM
        pha                     ; ulozeni na zasobnik
        lda KBHANDLER           ; cteni dolni casti adresy ulozene v ROM
        pha                     ; ulozeni na zasobnik
        rts                     ; vyber adresy ze zasobniku + skok
                                ; zde neni nutne mit RTS
.endproc
 
 
; ---------------------------------------------------------------------
; obsluha DLI
; ---------------------------------------------------------------------
dli:
        pha                     ; uschovat akumulátor
        lda color               ; barva pozadí
        clc
        adc #1
        sta color
        and #%00001110
        sta COLBK               ; přímo nastavit zápisem do HW registru
        pla                     ; obnovit akumulátor
        rti                     ; návrat z DLI
 
 
dlist:
.byte DL_BLK8, DL_BLK8, DL_BLK8 ; 3x8=24 prázdných obrazových řádků
.byte DL_LMS+DL_MAP320x1x1      ; určení počáteční adresy obrazové paměti + jeden řádek režimu F (GR.8)
.byte <screen1, >screen1        ; počáteční adresa obrazové paměti (první blok)
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.byte DL_LMS+DL_MAP320x1x1      ; určení počáteční adresy obrazové paměti + jeden řádek režimu F (GR.8)
.byte <screen2, >screen2        ; počáteční adresa obrazové paměti (druhý blok)
.res 95, DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_JVB, <dlist, >dlist    ; skok na začátek display listu
 
; barva v GTIA režimu 9
color: .byte 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

Skládáme vše dohromady: grafický kernel, DLI a zobrazení spritů

V samotném závěru popisu grafických schopností osmibitových domácích mikropočítačů Atari zkombinujeme některé postupy do jediného programu. V něm se zobrazí větší množství spritů, každý se zvlášť nastavenou barvou nezávislou na grafickém režimu ani na obsahu herního pole. Sprity se pohybují synchronizovaně s obrazem (VBI) a herní pole obsahuje paletu 256 barev (DLI). Výsledek by měl vypadat následovně:

GTIA režim s DLI (256 barev) a čtyřmi nezávislými sprity.

Obrázek 15: GTIA režim s DLI (256 barev) a čtyřmi nezávislými sprity.

Autor: tisnik, podle licence: Rights Managed

Poznámka: snadno lze přidat další sprity; jediné omezení spočívá v tom, že na jednom řádku mohou být čtyři hráči+čtyři střely či pět hráčů.

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

Dnešní poslední demonstrační příklad je již poměrně dlouhý, protože po překladu získáme .xex soubor s délkou 491 bajtů (to jsou skoro dvě paměťové stránky!):

; ---------------------------------------------------------------------
; Grafický režim 320x192 se dvěma barvami.
; Korektní display list.
; Vykreslení šestnácti různých kombinací pixelů.
; Přepnutí do GTIA režimu 9.
; ---------------------------------------------------------------------
 
.include "atari.inc"
 
.CODE
 
; dva bloky RAM využité jako obrazová paměť
screen1 = $7000
screen2 = $8000
 
; adresy PMG
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
 
 
; ---------------------------------------------------------------------
; makro pro nastavení display listu
; ---------------------------------------------------------------------
.macro  set_display_list label
        lda #<label             ; nižší byte adresy display listu
        sta SDLSTL
        lda #>label             ; vyšší byte adresy display listu
        sta SDLSTH
.endmacro
 
 
; ---------------------------------------------------------------------
; makro pro nastavení DLI
; ---------------------------------------------------------------------
.macro  set_dli_handler handler
        ; vektor DLI
        lda #<handler           ; nastavení DLI
        sta VDSLST
        lda #>handler
        sta VDSLST+1
.endmacro
 
 
; ---------------------------------------------------------------------
; makro pro nastavení VBI
; ---------------------------------------------------------------------
.macro  set_vbi_handler handler
        ; nastavit vektor pro odloženou VBI
        lda #>handler
        sta VVBLKD+1
        lda #<handler
        sta VVBLKD
.endmacro
 
 
; ---------------------------------------------------------------------
; vyplnění obrazovky
; ---------------------------------------------------------------------
.macro  fill_screen screen
        .local next_line        ; definice lokálního symbolu
        .local draw_on_line     ; definice lokálního symbolu
        screen_addr = 128
 
        lda #<screen1           ; uložit adresu začátku obrazovky na nultou stránku
        sta screen_addr
        lda #>screen1
        sta screen_addr+1
 
        ldx #96                 ; počitadlo řádků
next_line:
        lda #0                  ; zapisovaná hodnota + počitadlo smyčky
        tay                     ; offset do obrazové paměti
        clc                     ; nechceme přičítat přenos
        ; ---------------------------------------------------------------------
        ; vykreslení pixelů na jednom řádku
        ; ---------------------------------------------------------------------
draw_on_line:
        sta (screen_addr), y    ; zápis na první řádek
        iny                     ; další zápis bude proveden o jeden bajt dále
        adc #1                  ; zvýšení hodnoty v akumulátoru
        cmp #40                 ; konec smyčky?
        bne draw_on_line        ; dokud není nula, pokračovat
 
        lda screen_addr         ; 16bitové zvýšení adresy
        clc
        adc #40
        sta screen_addr
        lda screen_addr+1
        adc #0
        sta screen_addr+1
 
        dex                     ; snížení počitadla
        bne next_line           ; jsme na posledním řádku? ne->skok
.endmacro
 
 
 
; ---------------------------------------------------------------------
; set PMG
; ---------------------------------------------------------------------
.macro  set_pmg
        .local next_line        ; definice lokálního symbolu
 
        lda #80                 ; horizontální pozice prvního hráče
        sta HPOSP0              ; uložit do řídicího registru HPOSP0 na čipu GTIA
 
        lda #100                ; horizontální pozice druhého hráče
        sta HPOSP1              ; uložit do řídicího registru HPOSP1 na čipu GTIA
 
        lda #120                ; horizontální pozice třetího hráče
        sta HPOSP2              ; uložit do řídicího registru HPOSP2 na čipu GTIA
 
        lda #140                ; horizontální pozice čtvrtého hráče
        sta HPOSP3              ; uložit do řídicího registru HPOSP3 na čipu GTIA
 
        lda #HUE_BLUE<<4 + 12 ; barva druhého hráče (odstín+intenzita)
        sta PCOLR0              ; uložit do řídicího registru PCOLR0 na čipu GTIA
 
        lda #HUE_GREEN<<4 + 12  ; barva první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 #$ff                ; bitová maska všech hráčů
        sta GRAFP0              ; uložit do řídicího registru GRAFP0 na čipu GTIA
        sta GRAFP1              ; uložit do řídicího registru GRAFP1 na čipu GTIA
        sta GRAFP2              ; uložit do řídicího registru GRAFP2 na čipu GTIA
        sta GRAFP3              ; uložit do řídicího registru GRAFP3 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
 
        addr = 152*256
        ldx #8                  ; začneme na hodnotě o 1 vyšší
next_line:
        lda sprite-1, x         ; načíst
        sta addr+PLAYER_0_OFFSET+20, x  ; uložit byte - první hráč
        sta addr+PLAYER_1_OFFSET+30, x  ; uložit byte - druhý hráč
        sta addr+PLAYER_2_OFFSET+40, x  ; uložit byte - třetí hráč
        sta addr+PLAYER_3_OFFSET+50, x  ; uložit byte - čtvrtý hráč
        dex                     ; snížit offset + nastavit příznaky
        bne next_line           ; další byte spritu
 
        lda #46                 ; povolení PMG DMA
        sta SDMCTL
.endmacro
 
 
 
; ---------------------------------------------------------------------
; hlavní herní smyčka
; ---------------------------------------------------------------------
.macro  game_loop
        .local loop             ; definice lokálního symbolu
loop:
        jmp loop                ; program vlastně nice nedělá - jen cyklí!
.endmacro
 
 
; ---------------------------------------------------------------------
; vstupní bod do programu
; ---------------------------------------------------------------------
.proc main
        set_display_list dlist  ; nastavení display listu
        set_pmg                 ; nastavení PMG
 
        set_dli_handler dli     ; nastavení obsluhy DLI
        set_vbi_handler horizontal_movement
        fill_screen screen1     ; vyplnění obrazovky
        jsr get_key             ; čekání na stisk klávesy
 
        jsr enable_dli          ; povolení DLI (a VBI)
        jsr get_key             ; čekání na stisk klávesy
 
        jsr gtia_mode_9         ; nastavení GTIA režimu číslo 9
 
        game_loop               ; hlavní herní smyčka
.endproc
 
 
 
; ---------------------------------------------------------------------
; povolení DLI (a VBI)
; ---------------------------------------------------------------------
.proc enable_dli
        ; povolení DLI
        NMIEN_DLI=$80           ; maska povolení DLI
        NMIEN_VBI=$40           ; maska povolení VBI
        lda #NMIEN_DLI | NMIEN_VBI ; povolení DLI
        sta NMIEN
        rts
.endproc
 
 
 
; ---------------------------------------------------------------------
; nastavení GTIA režimu číslo 9
; ---------------------------------------------------------------------
.proc gtia_mode_9
        lda GPRIOR              ; modifikace stínového registru GPRIOR
        ora  #$40               ; výběr GTIA režimu GR.9
        sta GPRIOR
        rts                     ; vyber adresy ze zasobniku + skok
.endproc
 
 
 
; ---------------------------------------------------------------------
; čekání na stisk klávesy
; ---------------------------------------------------------------------
.proc get_key
        KBHANDLER = $e424       ; rutina pro cteni klavesy
        lda KBHANDLER+1         ; cteni horni casti adresy ulozene v ROM
        pha                     ; ulozeni na zasobnik
        lda KBHANDLER           ; cteni dolni casti adresy ulozene v ROM
        pha                     ; ulozeni na zasobnik
        rts                     ; vyber adresy ze zasobniku + skok
                                ; zde neni nutne mit RTS
.endproc
 
 
; ---------------------------------------------------------------------
; obsluha DLI
; ---------------------------------------------------------------------
dli:
        pha                     ; uschovat akumulátor
        lda color               ; barva pozadí
        clc
        adc #16
        sta COLBK               ; přímo nastavit zápisem do HW registru
        sta color
        pla                     ; obnovit akumulátor
        rti                     ; návrat z DLI
 
 
; ---------------------------------------------------------------------
; subrutina pro obsluhu VBI
; ---------------------------------------------------------------------
.proc   horizontal_movement
        ldx x_pos_0             ; původní pozice prvního hráče
        dex                     ; posun hráče doleva
        stx HPOSP0              ; změna pozice prvního hráče
        stx x_pos_0             ; zapamatovat si pozici prvního hráče
 
        ldx x_pos_1             ; původní pozice prvního hráče
        inx                     ; posun hráče doprava
        stx HPOSP1              ; změna pozice prvního hráče
        stx x_pos_1             ; zapamatovat si pozici prvního hráče
 
        ldx x_pos_2             ; původní pozice prvního hráče
        dex                     ; posun hráče doleva
        dex                     ; posun hráče doleva
        stx HPOSP2              ; změna pozice prvního hráče
        stx x_pos_2             ; zapamatovat si pozici prvního hráče
 
        ldx x_pos_3             ; původní pozice prvního hráče
        inx                     ; posun hráče doprava
        inx                     ; posun hráče doprava
        stx HPOSP3              ; změna pozice prvního hráče
        stx x_pos_3             ; zapamatovat si pozici prvního hráče
 
        jmp XITVBV              ; zpracovat zbytek odloženého VBLANKu
        rts
.endproc
 
 
dlist:
.byte DL_BLK8, DL_BLK8, DL_BLK8 ; 3x8=24 prázdných obrazových řádků
.byte DL_LMS+DL_MAP320x1x1      ; určení počáteční adresy obrazové paměti + jeden řádek režimu F (GR.8)
.byte <screen1, >screen1        ; počáteční adresa obrazové paměti (první blok)
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.res 5,  DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_MAP320x1x1+DL_DLI      ; povolení DLI
.byte DL_LMS+DL_MAP320x1x1      ; určení počáteční adresy obrazové paměti + jeden řádek režimu F (GR.8)
.byte <screen2, >screen2        ; počáteční adresa obrazové paměti (druhý blok)
.res 95, DL_MAP320x1x1          ; opakovat řádky grafického režimu F (GR.8)
.byte DL_JVB, <dlist, >dlist    ; skok na začátek display listu
 
; barva v GTIA režimu 9
color: .byte 1
 
; data spritů
sprite:  .byte 24, 60, 126, 219, 255, 36, 90, 165
x_pos_0: .byte 80
x_pos_1: .byte 100
x_pos_2: .byte 120
x_pos_3: .byte 140
 
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

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í Kubernetes

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             antic_4.xex \
         antic_5.xex             antic_6.xex \
         antic_7.xex             antic_8.xex \
         antic_9.xex             antic_A.xex \
         antic_B.xex \
         antic_bitmap_1.xex      antic_bitmap_2.xex \
         antic_bitmap_3.xex      antic_bitmap_4.xex \
         antic_bitmap_5.xex      antic_bitmap_6.xex \
         antic_bitmap_7.xex      antic_bitmap_8.xex \
         antic_dli_1.asm         antic_dli_2.asm \
         antic_dli_3.asm         antic_dli_4.asm \
         antic_dli_5.asm         antic_dli_pmg.asm
 
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
 
antic_bitmap_6.xex:     antic_bitmap_6.o
        ld65 -C linker_image.cfg $< -o $@ -m $(basename $<).map
 
antic_bitmap_7.xex:     antic_bitmap_7.o
        ld65 -C linker_image_2.cfg $< -o $@ -m $(basename $<).map
 
antic:  \
         antic_1.xex \
         antic_2.xex \
         antic_3.xex \
         antic_4.xex \
         antic_5.xex \
         antic_6.xex \
         antic_7.xex \
         antic_8.xex \
         antic_9.xex \
         antic_A.xex \
         antic_B.xex
 
antic_bitmap:   \
        antic_bitmap_1.xex \
        antic_bitmap_2.xex \
        antic_bitmap_3.xex \
        antic_bitmap_4.xex \
        antic_bitmap_5.xex \
        antic_bitmap_6.xex \
        antic_bitmap_7.xex \
        antic_bitmap_8.xex
 
antic_dli:      \
        antic_dli_1.xex \
        antic_dli_2.xex \
        antic_dli_3.xex \
        antic_dli_4.xex \
        antic_dli_5.xex \
        antic_dli_pmg.xex
 
antic_vbi:      \
        antic_vbi_1.xex \
        antic_vbi_2.xex \
        antic_vbi_3.xex \
        antic_vbi_dli_1.xex \
        antic_vbi_dli_2.xex \
        antic_vbi_dli_3.xex \
        antic_vbi_dli_4.xex
 
antic_scrolling:        \
        antic_scrolling_1.xex \
        antic_scrolling_2.xex \
        antic_scrolling_3.xex \
        antic_scrolling_4.xex
 
gtia:   \
        gtia_mode_1.xex \
        gtia_mode_2.xex \
        gtia_mode_3.xex \
        gtia_mode_4.xex \
        gtia_mode_5.xex \
        gtia_mode_6.xex \
        gtia_mode_7.xex \
        gtia_mode_8.xex \
        gtia_mode_9.xex \
        gtia_mode_A.xex \
        gtia_mode_B.xex

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_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic1_list.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_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic2_list.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_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic3_list.asm
155 antic3.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic3.map
       
156 antic4.asm nastavení standardního textového režimu GR.0, výpis 256 znaků https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic4.asm
157 antic4_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic4_list.asm
158 antic4.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic4.map
       
159 antic5.asm volba mezinárodní znakové sady pro textový režim GR.0 https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic5.asm
160 antic5_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic5_list.asm
161 antic5.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic5.map
       
162 antic6.asm volba náhodné stránky pro fonty v textovém režimu GR.0 https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic6.asm
163 antic6_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic6_list.asm
164 antic6.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic6.map
       
165 antic7.asm tisk 64 znaků ve čtyřech barvách v režimu GR.1 https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic7.asm
166 antic7_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic7_list.asm
167 antic7.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic7.map
       
168 antic8.asm určení, které znaky se budou tisknout v režimu GR.1 nebo GR.2 https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic8.asm
169 antic8_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic8_list.asm
170 antic8.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic8.map
       
171 antic9.asm nastavení textového režimu GR.12 a výpis znaků na obrazovku https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic9.asm
172 antic9_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic9_list.asm
173 antic9.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic9.map
       
174 antic_A.asm vlastní znaková sada (naivní přístup) pro textový režim GR.12 https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_A.asm
175 antic_A_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_A_list.asm
176 antic_A.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_A.map
       
177 antic_B.asm nastavení dvoubarevného grafického režimu s rozlišením 80×48 pixelů https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_B.asm
178 antic_B_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_B_list.asm
179 antic_B.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_B.map
       
180 antic_bitmap1.asm nastavení dvoubarevného grafického režimu s rozlišením 80×48 pixelů, zobrazení bitmapy https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_bitmap1.asm
181 antic_bitmap1_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_bitmap1_list.asm
182 antic_bitmap1.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_bitmap1.map
       
183 antic_bitmap2.asm nastavení dvoubarevného grafického režimu s rozlišením 80×48 pixelů, jednodušší zápis display listu https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_bitmap2.asm
184 antic_bitmap2_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_bitmap2_list.asm
185 antic_bitmap2.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_bitmap2.map
       
186 antic_bitmap3.asm nastavení dvoubarevného grafického režimu s rozlišením 160×96 pixelů, zobrazení bitmapy https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_bitmap3.asm
187 antic_bitmap3_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_bitmap3_list.asm
188 antic_bitmap3.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_bitmap3.map
       
189 antic_bitmap4.asm nastavení dvoubarevného grafického režimu s rozlišením 160×192 pixelů, zobrazení bitmapy https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_bitmap4.asm
190 antic_bitmap4_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_bitmap4_list.asm
191 antic_bitmap4.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_bitmap4.map
       
192 antic_bitmap5.asm nastavení dvoubarevného grafického režimu s rozlišením 320×192 pixelů, nekorektní display list, nekorektní zobrazení bitmapy https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_bitmap5.asm
193 antic_bitmap5_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_bitmap5_list.asm
194 antic_bitmap5.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_bitmap5.map
       
195 antic_bitmap6.asm nastavení dvoubarevného grafického režimu s rozlišením 320×192 pixelů, zarovnání bitmapy do bloku 4096 bajtů https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_bitmap6.asm
196 antic_bitmap6_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_bitmap6_list.asm
197 antic_bitmap6.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_bitmap6.map
       
198 antic_bitmap7.asm nastavení dvoubarevného grafického režimu s rozlišením 320×192 pixelů, korektní display list, rozdělená bitmapa https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_bitmap7.asm
199 antic_bitmap7_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_bitmap7_list.asm
200 antic_bitmap7.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_bitmap7.map
       
201 antic_bitmap8.asm nastavení čtyřbarevného grafického režimu s rozlišením 160×96 pixelů, zobrazení čtyřbarevného obrázku https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_bitmap8.asm
202 antic_bitmap8_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_bitmap8_list.asm
203 antic_bitmap8.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_bitmap8.map
       
204 chars.bas tisk všech znaků na obrazovku (varianta naprogramovaná v BASICu) https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/chars.bas
       
205 image_80×48.asm data obrázku 80×48 ve formě příkazů .byte https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/image_80×48.asm
206 image_160×96.asm data obrázku 160×96 ve formě příkazů .byte https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/image_160×96.asm
207 image_160×192.asm data obrázku 160×192 ve formě příkazů .byte https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/image_160×192.asm
208 image_320×192.bin čistě binární data obrázku 320×192× https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/image_320×192.bin
209 image_320×192_1.bin čistě binární data obrázku 320×96× (první polovina) https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/image_320×192_1.bin
210 image_320×192_2.bin čistě binární data obrázku 320×96× (druhá polovina) https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/image_320×192_2.bin
211 image_160×96×2.bin čistě binární data obrázku 320×192× https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/image_160×96×2.bin
       
212 antic_dli1.asm výpis všech 128 znaků v přímé i inverzní podobě v režimu GR.0 https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_dli1.asm
213 antic_dli1_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_dli1_list.asm
214 antic_dli1.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_dli1.map
       
215 antic_dli2.asm dočasná modifikace barvy pozadí provedená v DLI (dvanáctý textový řádek) https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_dli2.asm
216 antic_dli2_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_dli2_list.asm
217 antic_dli2.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_dli2.map
       
218 antic_dli3.asm opakované čekání na synchronizační pulz v DLI, výběr odlišné barvy pozadí https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_dli3.asm
219 antic_dli3_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_dli3_list.asm
220 antic_dli3.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_dli3.map
       
221 antic_dli4.asm display list obsahující několik instrukcí DLI, opakovaná změna barvy pozadí https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_dli4.asm
222 antic_dli4_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_dli4_list.asm
223 antic_dli4.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_dli4.map
       
224 antic_dli5.asm display list obsahující několik instrukcí DLI, opakovaná změna barvy pozadí https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_dli5.asm
225 antic_dli5_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_dli5_list.asm
226 antic_dli5.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_dli5.map
       
227 antic_dli_pmg.asm zobrazení osmi spritů namísto spritů čtyř s využitím DLI https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_dli_pmg.asm
228 antic_dli_pmg_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_dli_pmg_list.asm
229 antic_dli_pmg.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_dli_pmg.map
       
230 antic_vbi1.asm aktivní čekání na dokončení vykreslení snímku (bez VBI) https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_vbi1.asm
231 antic_vbi1_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_vbi1_list.asm
232 antic_vbi1.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_vbi1.map
       
233 antic_vbi2.asm pohyb PMG realizovaný ve VBI (první způsob nastavení vektoru) https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_vbi2.asm
234 antic_vbi2_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_vbi2_list.asm
235 antic_vbi2.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_vbi2.map
       
235 antic_vbi3.asm pohyb PMG realizovaný ve VBI (druhý způsob nastavení vektoru) https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_vbi3.asm
236 antic_vbi3_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_vbi3_list.asm
238 antic_vbi3.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_vbi3.map
       
239 antic_vbi_dli1.asm změna pozice PMG ve VBI, modifikace barvy herního pole v DLI https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_vbi_dli1.asm
240 antic_vbi_dli1_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_vbi_dli1_list.asm
241 antic_vbi_dli1.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_vbi_dli1.map
       
242 antic_vbi_dli2.asm dtto, ale s odstraněním nadbytečné instrukce RTS ve VBI https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_vbi_dli2.asm
243 antic_vbi_dli2_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_vbi_dli2_list.asm
244 antic_vbi_dli2.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_vbi_dli2.map
       
245 antic_vbi_dli3.asm přepis předchozího příkladu s využitím subrutin https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_vbi_dli3.asm
246 antic_vbi_dli3_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_vbi_dli3_list.asm
247 antic_vbi_dli3.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_vbi_dli3.map
       
248 antic_vbi_dli4.asm přepis předchozího příkladu s využitím maker https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_vbi_dli4.asm
249 antic_vbi_dli4_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_vbi_dli4_list.asm
250 antic_vbi_dli4.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_vbi_dli4.map
       
251 antic_scrolling1.asm příprava pro scrolling: dvojice hodnot ovládaných joystickem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_scrolling1.asm
252 antic_scrolling1_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_scrolling1_list.asm
253 antic_scrolling1.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_scrolling1.map
       
254 antic_scrolling2.asm příprava na scrolling, tisk horizontálního a vertikálního posunu na obrazovku https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_scrolling2.asm
255 antic_scrolling2_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_scrolling2_list.asm
256 antic_scrolling2.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_scrolling2.map
       
257 antic_scrolling3.asm realizace vertikálního scrollingu https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_scrolling3.asm
258 antic_scrolling3_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_scrolling3_list.asm
259 antic_scrolling3.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_scrolling3.map
       
260 antic_scrolling4.asm realizace horizontálního i vertikálního scrollingu https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_scrolling4.asm
261 antic_scrolling4_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_scrolling4_list.asm
262 antic_scrolling4.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_scrolling4.map
       
263 antic_playfield1.asm úzké, standardní a rozšířené herní pole https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_playfield1.asm
264 antic_playfield1_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_playfield1_list.asm
265 antic_playfield1.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/antic_playfield1.map
       
266 gtia_mode1.asm základ pro další demonstrační příklady: monochromatický grafický režim 320×192 pixelů https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/gtia_mode1.asm
267 gtia_mode1_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/gtia_mode1_list.asm
268 gtia_mode1.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/gtia_mode1.map
       
269 gtia_mode2.asm nastavení GTIA režimu 9 s vykreslením vzorku barev https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/gtia_mode2.asm
270 gtia_mode2_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/gtia_mode2_list.asm
271 gtia_mode2.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/gtia_mode2.map
       
272 gtia_mode3.asm nastavení GTIA režimu 9 s postupnou změnou základního odstínu barvy https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/gtia_mode3.asm
273 gtia_mode3_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/gtia_mode3_list.asm
274 gtia_mode3.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/gtia_mode3.map
       
275 gtia_mode4.asm nastavení GTIA režimu 11 s vykreslením vzorku barev https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/gtia_mode4.asm
276 gtia_mode4_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/gtia_mode4_list.asm
277 gtia_mode4.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/gtia_mode4.map
       
278 gtia_mode5.asm nastavení GTIA režimu 11 s postupnou změnou intenzity barev https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/gtia_mode5.asm
279 gtia_mode5_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/gtia_mode5_list.asm
280 gtia_mode5.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/gtia_mode5.map
       
281 gtia_mode6.asm zobrazení barevné škály v režimu GTIA 10 https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/gtia_mode6.asm
282 gtia_mode6_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/gtia_mode6_list.asm
283 gtia_mode6.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/gtia_mode6.map
       
284 gtia_mode7.asm obrazovka s různými textovými režimy, přepnutí do „zobrazení“ GTIA https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/gtia_mode7.asm
285 gtia_mode7_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/gtia_mode7_list.asm
286 gtia_mode7.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/gtia_mode7.map
       
287 gtia_mode8.asm   https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/gtia_mode8.asm
288 gtia_mode8_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/gtia_mode8_list.asm
289 gtia_mode8.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/gtia_mode8.map
       
290 gtia_mode9.asm zobrazení palety se šestnácti stupni šedi https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/gtia_mode9.asm
291 gtia_mode9_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/gtia_mode9_list.asm
292 gtia_mode9.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/gtia_mode9.map
       
293 gtia_mode_A.asm rozšíření palety na 256 barev na jediné obrazovce https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/gtia_mode_A.asm
294 gtia_mode_A_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/gtia_mode_A_list.asm
295 gtia_mode_A.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/gtia_mode_A.map
       
296 gtia_mode_B.asm kombinace 256 barev na obrazovce se sprity https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/gtia_mode_B.asm
297 gtia_mode_B_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/gtia_mode_B_list.asm
298 gtia_mode_B.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/gtia_mode_B.map
       
299 rainbow1.asm zobrazení duhy ve standardním textovém režimu GR.0 https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/rainbow1.asm
300 rainbow1_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/rainbow1_list.asm
301 rainbow1.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/rainbow1.map
       
302 rainbow2.asm scrollující duha zobrazená ve standardním textovém režimu GR.0 https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/rainbow2.asm
303 rainbow2_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/rainbow2_list.asm
304 rainbow2.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/rainbow2.map
       
305 rainbow3.asm dvě nezávisle na sobě scrollující duhy ve standardním textovém režimu GR.0 https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/rainbow3.asm
306 rainbow3_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/rainbow3_list.asm
307 rainbow3.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/rainbow3.map
       
308 rainbow4.asm dvě nezávisle na sobě scrollující duhy ve standardním textovém režimu GR.0 https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/rainbow4.asm
309 rainbow4_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/rainbow4_list.asm
310 rainbow4.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/rainbow4.map
       
311 rainbow5.asm změna barvy v průběhu zobrazení televizních řádků https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/rainbow5.asm
312 rainbow5_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/rainbow5_list.asm
313 rainbow5.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/rainbow5.map
       
314 rainbow6.asm změna barvy (duha) na obrazovce bez display listu https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/rainbow6.asm
315 rainbow6_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/rainbow6_list.asm
316 rainbow6.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/rainbow6.map

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)
  64. Atari Graphics Demonstrations by Underground Software, 1985 | Atari 8 bit Demo
    https://www.youtube.com/wat­ch?v=h7N9EYSyCkw
  65. Atari 8-bit Display List Interrupts: A Complete(ish) Tutorial
    https://playermissile.com/dli_tu­torial/
  66. Atari Assembler Editor manual
    https://atariwiki.org/wiki/at­tach/Atari%20Assembler%20E­ditor/ATARI%20Assembler%20E­ditor%20User-s%20Manual-OCR.pdf
  67. Atari 8-bit Fine Scrolling: A Complete(ish) Tutorial
    https://playermissile.com/scro­lling_tutorial/index.html
  68. Atari Fine Scrolling
    https://www.atarimagazines­.com/compute/issue67/338_1_A­tari_Fine_Scrolling.php
  69. CTIA / GTIA Pinout Diagram
    https://user.xmission.com/~tre­vin/atari/gtia_pinout.html
  70. GTIA Modes
    https://page6.org/archive/is­sue02/page10.htm
  71. 56 graphic modes
    https://www.atari800×l.eu/docs/kb/kb-hardware-0005-atari-8bit-56-graphic-modes.html
  72. UNLOCKING THE 56 GRAPHIC MODES
    https://www.atarimagazines­.com/v3n5/allmodes.html
  73. GTIA Modes 9, 10 & 11 + ANTIC data and color clocks
    https://forums.atariage.com/to­pic/366256-gtia-modes-9–10–11-antic-data-and-color-clocks/
  74. ANTIC, GTIA and timing info
    https://atarimax.com/jindrou­sh.atari.org/atanttim.html
  75. 6.10 Cycle timing
    https://github.com/AnimaIn­Corpore/A8E/blob/main/AHRM/6­.%20CTIA-GTIA/10.%20Cycle%20timing.md
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.