Praktické použití textových režimů nabízených čipem ANTIC

21. 4. 2026
Doba čtení: 51 minut

Sdílet

Projekt Atari perex.
Autor: Michal Tauchman, podle licence: CC BY-SA 4.0
Projekt Atari perex.
Na úvodní článek s představením vlastností čipu ANTIC dnes navážeme. Popíšeme si textové režimy podporované osmibitovými počítači Atari. Vše si pochopitelně vysvětlíme i na demonstračních příkladech.

Praktické použití textových režimů nabízených čipem ANTIC

Co se dozvíte v článku
  1. Praktické použití textových režimů nabízených čipem ANTIC
  2. Struktura video RAM ve standardním textovém režimu
  3. Demonstrační příklad: tisk znaků ve standardním textovém režimu
  4. Volba znakové sady ve standardním textovém režimu
  5. Demonstrační příklad: volba mezinárodní znakové sady
  6. Demonstrační příklad: volba „náhodné“ stránky se znakovou sadou
  7. Struktura video RAM v textových režimech GR.1 a GR.2
  8. Demonstrační příklad: tisk 64 znaků ve čtyřech barvách
  9. Které 64 znaky se budou tisknout a jak se určuje jejich barva?
  10. Demonstrační příklad: výběr části ATASCII s malými znaky pro grafický režim GR.1
  11. Struktura video RAM v textových režimech GR.12 a GR.13
  12. Demonstrační příklad: tisk znaků v textovém režimu GR.12
  13. Způsob výběru barvy pixelů v textových režimech GR.12 a GR.13
  14. Definice vlastní znakové sady (naivní implementace)
  15. Demonstrační příklad: zobrazení vlastních znaků v textovém režimu GR.12
  16. Od textových režimů k režimům grafickým
  17. Nejjednodušší případ: dvoubarevný grafický režim s rozlišením 80×48 pixelů
  18. Příloha: Makefile pro překlad všech demonstračních příkladů
  19. Repositář s demonstračními příklady
  20. Odkazy na Internetu

Na úvodní článek s představením základních vlastností čipu ANTIC dnes navážeme. Popíšeme si základní vlastností textových režimů podporovaných osmibitovými počítači Atari. Připomeňme si, že se jedná o celkem šest režimů:

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

Na základě společných vlastností je možné tyto režimy rozdělit do tří podskupin (vždy po dvojicích):

  1. V první podskupině je standardní textový režim GR.0 (ANTIC 2) a režim ANTIC 3. V těchto režimech se zobrazují monochromatické znaky o výše osmi resp. deseti obrazových řádků. Barva pozadí a popředí znaků má vždy stejný odstín, liší se jen intenzita. Režim GR.0 bude popsán ve druhé až šesté kapitole, protože se budeme zabývat i problematikou znakové sady.
  2. Ve druhé podskupině jsou režimy GR.1 a GR.2 (ANTIC 6 a 7). Horizontální počet znaků je snížen na polovinu (stejně jako rozlišení) a zobrazit je možné jen 64 znaků (nikoli 128). Nejvyšší dva bity znaků určují jejich barvu, pátá je barva pozadí (implicitně černá). Těmito režimy se budeme zabývat v kapitole sedmé až desáté.
  3. Režimy GR.12 a GR.13 (ANTIC 4 a 5) leží na pomezí mezi čistě textovými režimy a režimy grafickými. Znaky mají poloviční horizontální rozlišení a vždy dva bity v bitmapě znaku určují barvu pixelu. Tím lze rozlišit čtyři barvy; pátá barva je vybrána sedmým bitem kódu znaku. Výsledkem jsou „divné“ (špatně čitelné) znaky, ovšem modifikací znakové sady lze docílit mnoha zajímavých efektů. Režimy GR.12 a GR.13 se začneme zabývat v kapitole jedenácté.

Připomeňme si, že pro nastavení nějakého režimu musíme vytvořit takzvaný display list, který je interpretován čipem ANTIC. Display list umožňuje specifikovat pro každý logický řádek nějaký textový či grafický režim. Prozatím budeme pro celou obrazovku používat vždy ten samý režim.

Příkladem je nastavení display listu tak, aby se zobrazilo dvanáct řádků v textovém režimu GR.2:

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

Výsledek:

V grafickém režimu GR.2 lze současně zobrazit jen 64 různých znaků, nikoli 128.

Obrázek 1: V grafickém režimu GR.2 lze současně zobrazit jen 64 různých znaků, nikoli 128.

Autor: tisnik, podle licence: Rights Managed

Struktura video RAM ve standardním textovém režimu

Popis textových režimů začneme režimem, do kterého se osmibitové počítače Atari typicky přepnou po zapnutí (pokud ovšem uživatel neovlivní inicializační fázi). Tento režim je použit jak Atari BASICem, tak i dalšími vývojovými nástroji, například Atari Macroassemblerem atd.:

Atari Assembler využívá standardní textový režim GR.0, pouze nastavuje odlišnou barvu popředí i pozadí (je to vždy stejná barva, jen s odlišnou intenzitou).

Obrázek 2: Atari Assembler využívá standardní textový režim GR.0, pouze nastavuje odlišnou barvu popředí i pozadí (je to vždy stejná barva, jen s odlišnou intenzitou).

Autor: tisnik, podle licence: Rights Managed

V tomto režimu se zobrazuje 40 znaků na řádku a počet textových řádků je standardně nastaven na 24. Celkem je tedy možné zobrazit 40×24=960 bajtů. Každý znak je uložen v jednom bajtu, takže velikost video RAM je taktéž 960 bajtů (a v BASICu bývá namapována na adresy 40000 až 40960, což se dobře pamatuje).

Znaková sada osmibitových Atari obsahuje 128 znaků. Pokud do video RAM zapíšeme znak s kódem vyšším než 128, je znak zobrazen inverzně, tj. nejvyšší bit znaku určuje způsob zobrazení a nikoli tvar znaku. Textový režim je monochromatický – pozadí i znaky mají stejný odstín barvy, ovšem odlišnou intenzitu. Ve výchozím nastavení se používá modrý odstín, ale může se jednat o libovolný jiný odstín z nabídky šestnácti barev. Barva se nastavuje registrem COLOR2, například:

.include "atari.inc"
 
.CODE
 
 
.proc main
        lda #18                 ; kod barvy
        sta COLOR2              ; ulozit do registru COLOR2
loop:   jmp loop
end:
.endproc
 
 
.segment "EXEHDR"
.word   $ffff                   ; uvodni sekvence bajtu v souboru XEX
.word   main                    ; zacatek kodoveho segmentu
.word   main::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

S výsledkem:

Nastavení odlišného barevného odstínu v režimu GR.0.

 Obrázek 3: Nastavení odlišného barevného odstínu v režimu GR.0.

Autor: tisnik, podle licence: Rights Managed

Popř. při nastavení černé barvy:

Nastavení odlišného barevného odstínu v režimu GR.0. Pozadí má nyní stejnou barvu jako okraj obrazovky.

Obrázek 4: Nastavení odlišného barevného odstínu v režimu GR.0. Pozadí má nyní stejnou barvu jako okraj obrazovky.

Autor: tisnik, podle licence: Rights Managed

Poznámka: registrem COLOR4 se nenastavuje barva pozadí, ale barva okraje. To je jedna z výjimek platná pro textový režim GR.0 a grafický režim GR.8.

Demonstrační příklad: tisk znaků ve standardním textovém režimu

V dnešním prvním demonstračním příkladu je explicitně nastaven display list tak, aby zobrazil standardní textový režim GR.0, ovšem pro zajímavost s menším počtem textových řádků. Display list tedy obsahuje všechny čtyři nezbytné části:

  1. Několik prázdných řádků na začátku obrazovky
  2. Nastavení počátku video RAM + nastavení prvního textového řádku
  3. Dále nastavíme dalších 11 řádků (ne 23) do textového režimu
  4. Skok na začátek display listu

Dále se do video RAM zapíšou hodnoty 0 až 255 odpovídající 128 dostupným znakům v neinvertujícím i invertujícím zobrazení:

128 znaků vypsaných v přímé i inverzní podobě v textovém režimu GR.0.

Obrázek 5: Výpis 128 znaků v přímé podobě a dalších 128 znaků v podobě inverzní.

Autor: tisnik, podle licence: Rights Managed

Následuje úplný zdrojový kód tohoto demonstračního příkladu:

.include "atari.inc"
 
.CODE
 
 
.proc main
        lda #<dlist             ; nižší byte adresy display listu
        sta SDLSTL
        lda #>dlist             ; vyšší byte adresy display listu
        sta SDLSTH
 
        ldy #0                  ; počitadlo zápisů
clear:
        tya                     ; kód vypisovaného znaku
        sta screen, y           ; tisk znaku na zvolené místo na obrazovce
        iny                     ; zvětšit hodnotu počitadla a offsetu
        bne clear               ; skok
 
loop:   jmp loop
.endproc
 
dlist:
.byte DL_BLK8, DL_BLK8, 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 
.byte DL_CHR40x8x1              ; jeden řádek textového režimu 2 (GR.0)
.byte DL_CHR40x8x1              ; jeden řádek textového režimu 2 (GR.0)
.byte DL_CHR40x8x1              ; jeden řádek textového režimu 2 (GR.0)
.byte DL_CHR40x8x1              ; jeden řádek textového režimu 2 (GR.0)
.byte DL_CHR40x8x1              ; jeden řádek textového režimu 2 (GR.0)
.byte DL_CHR40x8x1              ; jeden řádek textového režimu 2 (GR.0)
.byte DL_CHR40x8x1              ; jeden řádek textového režimu 2 (GR.0)
.byte DL_CHR40x8x1              ; jeden řádek textového režimu 2 (GR.0)
.byte DL_CHR40x8x1              ; jeden řádek textového režimu 2 (GR.0)
.byte DL_CHR40x8x1              ; jeden řádek textového režimu 2 (GR.0)
.byte DL_CHR40x8x1              ; jeden řádek textového režimu 2 (GR.0)
.byte DL_JVB, <dlist, >dlist    ; skok na začátek display listu
 
end:
 
.BSS
screen: .res 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

Volba znakové sady ve standardním textovém režimu

Jednou z důležitých vlastností čipu ANTIC je fakt, že (kromě patnácti řídicích registrů) načítá všechna ostatní data ze standardního adresního prostoru počítačů Atari, tedy buď z ROM nebo z RAM. Platí to i pro znakovou sadu. Připomeňme si, že znaková sada obsahuje bitmapy 128 znaků, přičemž každý znak je reprezentován maticí 8×8 pixelů. To tedy znamená, že celková velikost znakové sady je 128×8=1 kB. A umístění tohoto jednokilobajtového bloku je plně programovatelné. Konkrétně se číslo paměťové stránky, na které znaková sada začíná, zapisuje do řídicího registru CHBAS. Teoreticky by mělo být možné zvolit libovolnou stránku v rozsahu 0 až 255, ovšem existuje zde jedno omezení – stránka musí být sudá, tj. začátek znakové sady se musí nacházet na adrese dělitelné hodnotou 512. Umístění znakové sady lze snadno měnit, a to jak pro každý snímek, tak teoreticky pro každý textový řádek, což umožňuje realizaci různých triků.

Demonstrační příklad: volba mezinárodní znakové sady

V dalším demonstračním příkladu změníme adresu stránky uloženou v registru CHBAS. Nastavíme ji na hodnotu 204, protože na adrese 204×256=52224 je namapována ROM obsahující upravenou znakovou sadu, konkrétně takovou sadu, která namísto pseudografických znaků obsahuje znaky s nabodeníčky (přehlasování atd.). Ostatně nejlepší bude podívat se na výsledek – ten se odlišuje od předchozího screenshotu, ovšem pouze u některých znaků:

Mezinárodní znaková sada vypsaná v textovém režimu GR.0.

Obrázek 6: Mezinárodní znaková sada vypsaná v textovém režimu GR.0.

Autor: tisnik, podle licence: Rights Managed

Zdrojový kód takto upraveného příkladu:

.include "atari.inc"
 
.CODE
 
 
.proc main
        lda #204                ; adresa se stránkou znakové sady
        sta CHBAS               ; uložit do řídicího registru ANTICu
        lda #<dlist             ; nižší byte adresy display listu
        sta SDLSTL
        lda #>dlist             ; vyšší byte adresy display listu
        sta SDLSTH
 
        ldy #0                  ; počitadlo zápisů
clear:
        tya                     ; kód vypisovaného znaku
        sta screen, y           ; tisk znaku na zvolené místo na obrazovce
        iny                     ; zvětšit hodnotu počitadla a offsetu
        bne clear               ; skok
 
loop:   jmp loop
.endproc
 
dlist:
.byte DL_BLK8, DL_BLK8, 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 
.byte DL_CHR40x8x1              ; jeden řádek textového režimu 2 (GR.0)
.byte DL_CHR40x8x1              ; jeden řádek textového režimu 2 (GR.0)
.byte DL_CHR40x8x1              ; jeden řádek textového režimu 2 (GR.0)
.byte DL_CHR40x8x1              ; jeden řádek textového režimu 2 (GR.0)
.byte DL_CHR40x8x1              ; jeden řádek textového režimu 2 (GR.0)
.byte DL_CHR40x8x1              ; jeden řádek textového režimu 2 (GR.0)
.byte DL_CHR40x8x1              ; jeden řádek textového režimu 2 (GR.0)
.byte DL_CHR40x8x1              ; jeden řádek textového režimu 2 (GR.0)
.byte DL_CHR40x8x1              ; jeden řádek textového režimu 2 (GR.0)
.byte DL_CHR40x8x1              ; jeden řádek textového režimu 2 (GR.0)
.byte DL_CHR40x8x1              ; jeden řádek textového režimu 2 (GR.0)
.byte DL_JVB, <dlist, >dlist    ; skok na začátek display listu
 
end:
 
.BSS
screen: .res 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

Demonstrační příklad: volba „náhodné“ stránky se znakovou sadou

Nic nám ovšem nezabrání v tom nastavit stránku v registru CHBAS na libovolnou sudou hodnotu. Můžeme například chtít, aby se tvary znaků četly z ROM, z řídicích registrů dalších čipů atd. V dalším demonstračním příkladu je zvolena „náhodné“ stránka, která ovšem neobsahuje pouze nulové bajty:

Tvary znaků jsou nyní čteny z odlišné paměťové stránky.

Obrázek 7: Tvary znaků jsou nyní čteny z odlišné paměťové stránky.

Autor: tisnik, podle licence: Rights Managed

Opět si pro úplnost uvedeme úplný zdrojový kód tohoto demonstračního příkladu:

.include "atari.inc"
 
.CODE
 
 
.proc main
        lda #$d000/256          ; adresa se stránkou znakové sady
        sta CHBAS               ; uložit do řídicího registru ANTICu
        lda #<dlist             ; nižší byte adresy display listu
        sta SDLSTL
        lda #>dlist             ; vyšší byte adresy display listu
        sta SDLSTH
 
        ldy #0                  ; počitadlo zápisů
clear:
        tya                     ; kód vypisovaného znaku
        sta screen, y           ; tisk znaku na zvolené místo na obrazovce
        iny                     ; zvětšit hodnotu počitadla a offsetu
        bne clear               ; skok
 
loop:   jmp loop
.endproc
 
dlist:
.byte DL_BLK8, DL_BLK8, 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 
.byte DL_CHR40x8x1              ; jeden řádek textového režimu 2 (GR.0)
.byte DL_CHR40x8x1              ; jeden řádek textového režimu 2 (GR.0)
.byte DL_CHR40x8x1              ; jeden řádek textového režimu 2 (GR.0)
.byte DL_CHR40x8x1              ; jeden řádek textového režimu 2 (GR.0)
.byte DL_CHR40x8x1              ; jeden řádek textového režimu 2 (GR.0)
.byte DL_CHR40x8x1              ; jeden řádek textového režimu 2 (GR.0)
.byte DL_CHR40x8x1              ; jeden řádek textového režimu 2 (GR.0)
.byte DL_CHR40x8x1              ; jeden řádek textového režimu 2 (GR.0)
.byte DL_CHR40x8x1              ; jeden řádek textového režimu 2 (GR.0)
.byte DL_CHR40x8x1              ; jeden řádek textového režimu 2 (GR.0)
.byte DL_CHR40x8x1              ; jeden řádek textového režimu 2 (GR.0)
.byte DL_JVB, <dlist, >dlist    ; skok na začátek display listu
 
end:
 
.BSS
screen: .res 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

Struktura video RAM v textových režimech GR.1 a GR.2

Struktura video paměti se v textových režimech GR.1 a GR.2 odlišuje od textového režimu GR.0. Na řádcích se zobrazuje jen dvacet znaků (ne čtyřicet) a každý znak je stále uložen v jediném bajtu. To znamená, že i spotřeba RAM je nižší. Pro GR.1 je to 20×24=480 bajtů a pro GR.2 dokonce jen 20×12=240 bajtů (tedy necelá jedna paměťová stránka). Ovšem pro každý znak je možné si vybrat jeho barvu. Zatímco v režimu GR.0 se nejvyšším bitem kódu znaku určovalo, jestli bude znak zobrazen inverzně či nikoli, v GR.1 a GR.2 mají význam nejvyšší dva bity kódu znaku (což ovšem snižuje počet dostupných znaků ze 128 na 64):

Bit 7 a 6 Barva
00 0
01 1
10 2
11 3

Barvy znaků se nastavují přes registry COLOR0, COLOR1, COLOR2 a COLOR3 (v tomto pořadí). Barva pozadí znaků se nastavuje v registru COLOR4 (to je opět novinka, která v GR.0 nebyla implementována z důvodů, ke kterým se ještě vrátíme).

Díky možnosti nastavování barev i tvarů znaků byly i tyto režimy použity u některých starších her:

Hra Up Up and Away využívá textový režim GR.1 a navíc i spritovou grafiku.

Obrázek 8: Hra Up Up and Away využívá textový režim GR.1 a navíc i spritovou grafiku.

Autor: tisnik, podle licence: Rights Managed

Demonstrační příklad: tisk 64 znaků ve čtyřech barvách

V dalším demonstračním příkladu provedeme nastavení display listu tak, aby se zobrazilo 14 řádků v textovém režimu GR.1 (ovšem počet řádků můžete rozšířit až na 24 nebo 25). Poté se do video RAM zapíšou hodnotu 0 až 255, tedy všechny možné kódy znaků. Výsledek by měl vypadat takto:

256 znaků vypsaných v textovém režimu GR.1. Ve skutečnosti se vypíše 64 různých znaků, ovšem ve čtyřech barvách.

Obrázek 9: 256 znaků vypsaných v textovém režimu GR.1. Ve skutečnosti se vypíše 64 různých znaků, ovšem ve čtyřech barvách.

Autor: tisnik, podle licence: Rights Managed

Poznámka: povšimněte si, že se opakuje 64 znaků, ovšem postupně se mění jejich barvy. Třetí skupina znaků je modrá, což přesně odpovídá barvě použité v grafickém režimu GR.0.

Úplný zdrojový kód tohoto demonstračního příkladu vypadá následovně:

.include "atari.inc"
 
.CODE
 
 
.proc main
        lda #<dlist             ; nižší byte adresy display listu
        sta SDLSTL
        lda #>dlist             ; vyšší byte adresy display listu
        sta SDLSTH
 
        ldy #0                  ; počitadlo zápisů
clear:
        tya                     ; kód vypisovaného znaku
        sta screen, y           ; tisk znaku na zvolené místo na obrazovce
        iny                     ; zvětšit hodnotu počitadla a offsetu
        bne clear               ; skok

loop:   jmp loop
.endproc
 
dlist:
.byte DL_BLK8, DL_BLK8, DL_BLK8 ; 3x8=24 prázdných obrazových řádků
.byte DL_LMS+DL_CHR20x8x2       ; 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 
.byte DL_CHR20x8x2              ; jeden řádek textového režimu 6 (GR.1)
.byte DL_CHR20x8x2              ; jeden řádek textového režimu 6 (GR.1)
.byte DL_CHR20x8x2              ; jeden řádek textového režimu 6 (GR.1)
.byte DL_CHR20x8x2              ; jeden řádek textového režimu 6 (GR.1)
.byte DL_CHR20x8x2              ; jeden řádek textového režimu 6 (GR.1)
.byte DL_CHR20x8x2              ; jeden řádek textového režimu 6 (GR.1)
.byte DL_CHR20x8x2              ; jeden řádek textového režimu 6 (GR.1)
.byte DL_CHR20x8x2              ; jeden řádek textového režimu 6 (GR.1)
.byte DL_CHR20x8x2              ; jeden řádek textového režimu 6 (GR.1)
.byte DL_CHR20x8x2              ; jeden řádek textového režimu 6 (GR.1)
.byte DL_CHR20x8x2              ; jeden řádek textového režimu 6 (GR.1)
.byte DL_CHR20x8x2              ; jeden řádek textového režimu 6 (GR.1)
.byte DL_CHR20x8x2              ; jeden řádek textového režimu 6 (GR.1)
.byte DL_JVB, <dlist, >dlist    ; skok na začátek display listu
 
end:
 
.BSS
screen: .res 20*24
 
 
 
.segment "EXEHDR"
.word   $ffff                   ; uvodni sekvence bajtu v souboru XEX
.word   main                    ; zacatek kodoveho segmentu
.word   end - 1                ; konec kodoveho segmentu
 
 
.segment "AUTOSTRT"             ; segment s pocatecni adresou
.word   RUNAD                   ; naplni se pouze adresy RUNAD a RUNAD+1
.word   RUNAD+1
.word   main                    ; adresa vstupniho bodu do programu
 
; finito

Které 64 znaky se budou tisknout a jak se určuje jejich barva?

Připomeňme si, že znaková sada osmibitových mikropočítačů Atari obsahuje definice 128 znaků, ovšem v režimech GR.1 a GR.2 je možné zobrazit pouze 64 znaků. Je tedy nutné nějakým způsobem určit, která polovina znakové sady se použije, zda prvních 64 znaků nebo naopak druhých 64 znaků. To se opět provádí přes řídicí registr CHBAS, do kterého se zapisuje první stránka znakové sady. Zápisem stránky 226 se vlastně posune ukazatel na definici prvního znaku a začnou se vypisovat odlišné znaky (původní hodnota je rovna 224, což odpovídá prvním 512 bajtům definic znaků; zápisem 226 jsme se přepnuli na definici druhé poloviny znakové sady):

Nyní se sice vypisují minusky, ovšem namísto mezery se vykresluje znak srdíčka.

Obrázek 10: Nyní se sice vypisují minusky, ovšem namísto mezery se vykresluje znak srdíčka.

Autor: tisnik, podle licence: Rights Managed

Demonstrační příklad: výběr části ATASCII s malými znaky pro grafický režim GR.1

V dalším demonstračním příkladu se zápisem do registru CHBAS změní sada vykreslovaných znaků. Namísto verzálek (a dalších znaků) se nyní budou vykreslovat minusky. Ovšem do této druhé skupiny znaků již nespadá mezera. Namísto ní se vypisuje srdíčko (má kód roven nule):

.include "atari.inc"
 
.CODE
 
 
.proc main
        lda #226                ; adresa se stránkou znakové sady
        sta CHBAS               ; uložit do řídicího registru ANTICu
        lda #<dlist             ; nižší byte adresy display listu
        sta SDLSTL
        lda #>dlist             ; vyšší byte adresy display listu
        sta SDLSTH
 
        ldy #0                  ; počitadlo zápisů
clear:
        tya                     ; kód vypisovaného znaku
        sta screen, y           ; tisk znaku na zvolené místo na obrazovce
        iny                     ; zvětšit hodnotu počitadla a offsetu
        bne clear               ; skok
 
loop:   jmp loop
.endproc
 
dlist:
.byte DL_BLK8, DL_BLK8, DL_BLK8 ; 3x8=24 prázdných obrazových řádků
.byte DL_LMS+DL_CHR20x8x2       ; 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 
.byte DL_CHR20x8x2              ; jeden řádek textového režimu 6 (GR.1)
.byte DL_CHR20x8x2              ; jeden řádek textového režimu 6 (GR.1)
.byte DL_CHR20x8x2              ; jeden řádek textového režimu 6 (GR.1)
.byte DL_CHR20x8x2              ; jeden řádek textového režimu 6 (GR.1)
.byte DL_CHR20x8x2              ; jeden řádek textového režimu 6 (GR.1)
.byte DL_CHR20x8x2              ; jeden řádek textového režimu 6 (GR.1)
.byte DL_CHR20x8x2              ; jeden řádek textového režimu 6 (GR.1)
.byte DL_CHR20x8x2              ; jeden řádek textového režimu 6 (GR.1)
.byte DL_CHR20x8x2              ; jeden řádek textového režimu 6 (GR.1)
.byte DL_CHR20x8x2              ; jeden řádek textového režimu 6 (GR.1)
.byte DL_CHR20x8x2              ; jeden řádek textového režimu 6 (GR.1)
.byte DL_CHR20x8x2              ; jeden řádek textového režimu 6 (GR.1)
.byte DL_CHR20x8x2              ; jeden řádek textového režimu 6 (GR.1)
.byte DL_JVB, <dlist, >dlist    ; skok na začátek display listu
 
end:
 
.BSS
screen: .res 20*24
 
 
 
.segment "EXEHDR"
.word   $ffff                   ; uvodni sekvence bajtu v souboru XEX
.word   main                    ; zacatek kodoveho segmentu
.word   end - 1                ; konec kodoveho segmentu
 
 
.segment "AUTOSTRT"             ; segment s pocatecni adresou
.word   RUNAD                   ; naplni se pouze adresy RUNAD a RUNAD+1
.word   RUNAD+1
.word   main                    ; adresa vstupniho bodu do programu
 
; finito

Struktura video RAM v textových režimech GR.12 a GR.13

Mezi nejužitečnější režimy nabízené osmibitovými počítači Atari patří režimy GR.12 a GR.13. Jedná se o textové režimy, ovšem tvary znaků jsou interpretovány takovým způsobem, že je možné zobrazit čtyřbarevné znaky a celkově je umožněno (bez dalších triků) zobrazit pět barev. Navíc je velikost video RAM velmi malá: 960 či dokonce jen 480 bajtů, takže překreslování herní scény je snadné, protože to mikroprocesor „ustíhá“ (na rozdíl od některých čistě rastrových grafických režimů).

Možnost zobrazení vícebarevných znaků zkombinovaná s definicí jejich tvaru, je ukázána v následujícím videu: https://youtu.be/h7N9EYSyCkw?t=220 (je to jen několik sekund záznamu s přepnutím mezi režimem GR.0 a režimem GR.12. Tyto vlastnosti byly využity doslova ve stovkách her pro osmibitová Atari:

Známá hra Rally Speedway plně využívá možností textového režimu GR.12 a GR.13.

Obrázek 11: Známá hra Rally Speedway plně využívá možností textového režimu GR.12 a GR.13.

Autor: tisnik, podle licence: Rights Managed

3D grafika? Ani ne, opět se využívá textový režim GR.12.

Obrázek 12: 3D grafika? Ani ne, opět se využívá textový režim GR.12.

Autor: tisnik, podle licence: Rights Managed

Nicméně se vraťme s organizaci video RAM u těchto režimů. Je to relativně snadné: vždy se zobrazí 40 znaků na řádku přičemž počet textových řádků je buď 24 (GR.12) nebo 12 (GR.13). Ve druhém případě jsou znaky zobrazeny s dvojnásobnou výškou. Zobrazit je možné všech 128 znaků, ovšem způsob zobrazení se v mnohém odlišuje od předchozích textových režimů. Nejdříve si ukážeme krátké demo s GR.12 a poté si způsob zobrazení znaků podrobněji vysvětlíme.

Demonstrační příklad: tisk znaků v textovém režimu GR.12

Organizace video RAM u režimů GR.0 a GR.12 je (až na odlišnou interpretaci tvarů znaků) naprosto stejná, takže v dalším demonstračním příkladu nejdříve nastavíme display list takovým způsobem, aby se zobrazovalo dvanáct textových řádků v režimu GR.12 (jejich počet si můžete zvýšit až na 24 či 25):

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

Dále vyplníme prvních 256 bajtů video RAM hodnotami 0 až 255:

        ldy #0                  ; počitadlo zápisů
clear:
        tya                     ; kód vypisovaného znaku
        sta screen, y           ; tisk znaku na zvolené místo na obrazovce
        iny                     ; zvětšit hodnotu počitadla a offsetu
        bne clear               ; skok

Výsledkem bude 256 zobrazených znaků (128 tvarů, další tvary se sice opakují, ale mají odlišné barvy). Jak je z obrázku patrné, nejsou znaky příliš čitelné, protože mají šířku jen 4 pixely a nikoli osm pixelů:

Výpis 256 znaků ukazuje, jak se interpretují masky znaků v textovém režimu GR.12.

Obrázek 13: Výpis 256 znaků ukazuje, jak se interpretují masky znaků v textovém režimu GR.12.

Autor: tisnik, podle licence: Rights Managed

Úplný zdrojový kód tohoto příkladu vypadá následovně:

.include "atari.inc"
 
.CODE
 
 
.proc main
        lda #<dlist             ; nižší byte adresy display listu
        sta SDLSTL
        lda #>dlist             ; vyšší byte adresy display listu
        sta SDLSTH
 
        ldy #0                  ; počitadlo zápisů
clear:
        tya                     ; kód vypisovaného znaku
        sta screen, y           ; tisk znaku na zvolené místo na obrazovce
        iny                     ; zvětšit hodnotu počitadla a offsetu
        bne clear               ; skok
 
loop:   jmp loop
.endproc
 
dlist:
.byte DL_BLK8, DL_BLK8, DL_BLK8 ; 3x8=24 prázdných obrazových řádků
.byte DL_LMS+DL_CHR40x8x4       ; určení počáteční adresy obrazové paměti + jeden řádek režimu 4 (GR.12)
.byte <screen, >screen          ; počáteční adresa obrazové paměti 
.byte DL_CHR40x8x4              ; jeden řádek textového režimu 4 (GR.12)
.byte DL_CHR40x8x4              ; jeden řádek textového režimu 4 (GR.12)
.byte DL_CHR40x8x4              ; jeden řádek textového režimu 4 (GR.12)
.byte DL_CHR40x8x4              ; jeden řádek textového režimu 4 (GR.12)
.byte DL_CHR40x8x4              ; jeden řádek textového režimu 4 (GR.12)
.byte DL_CHR40x8x4              ; jeden řádek textového režimu 4 (GR.12)
.byte DL_CHR40x8x4              ; jeden řádek textového režimu 4 (GR.12)
.byte DL_CHR40x8x4              ; jeden řádek textového režimu 4 (GR.12)
.byte DL_CHR40x8x4              ; jeden řádek textového režimu 4 (GR.12)
.byte DL_CHR40x8x4              ; jeden řádek textového režimu 4 (GR.12)
.byte DL_CHR40x8x4              ; jeden řádek textového režimu 4 (GR.12)
.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

Způsob výběru barvy pixelů v textových režimech GR.12 a GR.13

Textové režimy GR.12 i GR.13 stále využívají znakovou sadu, ve které je definováno 128 znaků, přičemž pro každý znak je rezervováno osm bajtů (celkem má tedy znaková sada velikost 1024 bajtů, to se nemění). Znaky jsou vysoké osm obrazových řádků, přičemž v režimu GR.13 je výška řádku dvojnásobná oproti režimu GR.12 (celkem 96 obrazových řádků a nikoli 192 obrazových řádků). Až do této chvíle se tedy režim GR.12 podobá standardnímu textovému režimu GR.0. Ovšem je zde jeden podstatný rozdíl: barva pixelů je určena nikoli jediným bitem, ale hned dvěma bity definice znaku. A nejenom to – navíc (někdy!) záleží i na tom, zda je kód znaku menší než 128 nebo naopak větší než 127 (tedy jinými slovy: zda je nastaven jeho nejvyšší bit).

Celý způsob určení barvy pixelu je shrnut (doufám, že přehledně) do následující tabulky:

Bitový pár v masce znaku 7. bit znaku Barva Jméno registru s barvou Adresa registru
00 ? BAK COLOR4 712
01 ? PF0 COLOR0 708
10 ? PF1 COLOR1 709
11 0 PF2 COLOR2 710
11 1 PF3 COLOR3 711

A jak to vypadá v praxi? Jako příklad si vezměme znak s kódem (řekněme) 100, jehož první bajt definice (masky) vypadá následovně:

00011011

Tyto bity jsou pro účely zobrazení pixelů na obrazovce rozděleny do dvojic:

00 01 10 11

Což při pohledu do tabulky znamená, že na obrazovce uvidíme čtyři pixely v barvách:

BAK PF0 PF1 PF2

Pokud bude mít znak kód 200 a stejnou bitovou masku, budou barvy čtyř pixelů nepatrně odlišné (zde se konkrétně bude lišit barva posledního pixelu):

BAK PF0 PF1 PF3

Grafické režimy GR.12 a GR.13 tedy skutečně dokážou zobrazit pět barev, ovšem s několika více či méně závažnými omezeními. Do jaké míry jsou tato omezení skutečně limitující, záleží na konkrétní hře nebo programu, který tyto režimy využívá.

Definice vlastní znakové sady (naivní implementace)

Režimy GR.12 a GR.13 jsou reálně využitelné jen tehdy, pokud vývojář navrhne vlastní znakovou sadu, která bude například obsahovat tvary objektů ve hře atd. K dispozici je 128 znaků, každý s reálným rozlišením 4×8 pixelů, přičemž pro každý pixel můžeme vybrat jednu ze čtyř barev (resp. pěti barev, v závislosti na kódu znaku). Pokusme se prozatím pro zajímavost nadefinovat pouze několik znaků. První znak bude celý zobrazen barvou pozadí (výchozí barva pozadí je černá):

font_source:
.byte %00000000
.byte %00000000
.byte %00000000
.byte %00000000
.byte %00000000
.byte %00000000
.byte %00000000
.byte %00000000

Další tři znaky obsahují pouze jedinou svislou úsečku. V prvním případě bude mít tato úsečka barvu PF0 (červená), ve druhém případě PF1 (zelená) a v případě třetím buď PF2 (modrá) nebo PF3 (fialová):

.byte %01000000
.byte %01000000
.byte %01000000
.byte %01000000
.byte %01000000
.byte %01000000
.byte %01000000
.byte %01000000
 
.byte %10000000
.byte %10000000
.byte %10000000
.byte %10000000
.byte %10000000
.byte %10000000
.byte %10000000
.byte %10000000
 
.byte %11000000
.byte %11000000
.byte %11000000
.byte %11000000
.byte %11000000
.byte %11000000
.byte %11000000
.byte %11000000

A konečně další tři znaky budou zobrazeny jako jednobarevné bloky: první blok bude černý, druhý červený, třetí zelený a čtvrtý buď modrý nebo fialový (podle toho, jestli vypíšeme znak s původním kódem nebo kódem zvětšeným o 128):

.byte %00000000
.byte %00000000
.byte %00000000
.byte %00000000
.byte %00000000
.byte %00000000
.byte %00000000
.byte %00000000
 
.byte %01010101
.byte %01010101
.byte %01010101
.byte %01010101
.byte %01010101
.byte %01010101
.byte %01010101
.byte %01010101
 
.byte %10101010
.byte %10101010
.byte %10101010
.byte %10101010
.byte %10101010
.byte %10101010
.byte %10101010
.byte %10101010
 
.byte %11111111
.byte %11111111
.byte %11111111
.byte %11111111
.byte %11111111
.byte %11111111
.byte %11111111
.byte %11111111

Nastavení vlastní znakové sady je provedeno zápisem do paměťové stránky 152 (ta je volná):

font_page = 152
font_target = 152 * 256

Specifikace pro čip ANTIC, kde se znaková sada nachází:

        lda #font_page          ; vyšší bajt adresy fontu = číslo stránky
        sta CHBAS

A konečně kopie tvarů prvních osmi znaků:

define_font:
        ldx #8*8                ; počitadlo smyčky
next_line:
        lda font_source, x      ; načíst byte
        sta font_target, x      ; uložit byte
        dex                     ; snížit offset + nastavit příznaky
        bne next_line           ; další byte spritu
Poznámka: mnohem lepší by bylo využít linker a namapovat data přímo do stránky 152. To je technika, ke které se ještě vrátíme.

Výsledek skutečně odpovídá našim znakům:

Osmice znaků. U prvních čtyř znaků je vyplněn jediný sloupec, u dalších čtyř znaků všechny čtyři sloupce. Další osmice znaků má nastaven sedmý bit na jedničku.

Obrázek 14: Osmice znaků. U prvních čtyř znaků je vyplněn jediný sloupec, u dalších čtyř znaků všechny čtyři sloupce. Další osmice znaků má nastaven sedmý bit na jedničku.

Autor: tisnik, podle licence: Rights Managed

Poznámka: bude zajímavé zjistit, jaké znaky jsou využity ve hrách.

Demonstrační příklad: zobrazení vlastních znaků v textovém režimu GR.12

Výše uvedený postup je ukázán v dalším – dnes již předposledním – demonstračním příkladu, jehož úplný zdrojový kód vypadá následovně:

.include "atari.inc"
 
.CODE
 
font_page = 152
font_target = 152 * 256
 
.proc main
        lda #font_page          ; vyšší bajt adresy fontu = číslo stránky
        sta CHBAS
        lda #<dlist             ; nižší byte adresy display listu
        sta SDLSTL
        lda #>dlist             ; vyšší byte adresy display listu
        sta SDLSTH
 
        ldy #0                  ; počitadlo zápisů
fill_screen:
        tya                     ; kód vypisovaného znaku
        sta screen, y           ; tisk znaku na zvolené místo na obrazovce
        iny                     ; zvětšit hodnotu počitadla a offsetu
        bne fill_screen         ; skok
 
define_font:
        ldx #8*8                ; počitadlo smyčky
next_line:
        lda font_source, x      ; načíst byte
        sta font_target, x      ; uložit byte
        dex                     ; snížit offset + nastavit příznaky
        bne next_line           ; další byte spritu
loop:   jmp loop
.endproc
 
dlist:
.byte DL_BLK8, DL_BLK8, DL_BLK8 ; 3x8=24 prázdných obrazových řádků
.byte DL_LMS+DL_CHR40x8x4       ; určení počáteční adresy obrazové paměti + jeden řádek režimu 4 (GR.12)
.byte <screen, >screen          ; počáteční adresa obrazové paměti 
.byte DL_CHR40x8x4              ; jeden řádek textového režimu 4 (GR.12)
.byte DL_CHR40x8x4              ; jeden řádek textového režimu 4 (GR.12)
.byte DL_CHR40x8x4              ; jeden řádek textového režimu 4 (GR.12)
.byte DL_CHR40x8x4              ; jeden řádek textového režimu 4 (GR.12)
.byte DL_CHR40x8x4              ; jeden řádek textového režimu 4 (GR.12)
.byte DL_CHR40x8x4              ; jeden řádek textového režimu 4 (GR.12)
.byte DL_CHR40x8x4              ; jeden řádek textového režimu 4 (GR.12)
.byte DL_CHR40x8x4              ; jeden řádek textového režimu 4 (GR.12)
.byte DL_CHR40x8x4              ; jeden řádek textového režimu 4 (GR.12)
.byte DL_CHR40x8x4              ; jeden řádek textového režimu 4 (GR.12)
.byte DL_CHR40x8x4              ; jeden řádek textového režimu 4 (GR.12)
.byte DL_JVB, <dlist, >dlist    ; skok na začátek display listu
 
font_source:
.byte %00000000
.byte %00000000
.byte %00000000
.byte %00000000
.byte %00000000
.byte %00000000
.byte %00000000
.byte %00000000
 
.byte %01000000
.byte %01000000
.byte %01000000
.byte %01000000
.byte %01000000
.byte %01000000
.byte %01000000
.byte %01000000
 
.byte %10000000
.byte %10000000
.byte %10000000
.byte %10000000
.byte %10000000
.byte %10000000
.byte %10000000
.byte %10000000
 
.byte %11000000
.byte %11000000
.byte %11000000
.byte %11000000
.byte %11000000
.byte %11000000
.byte %11000000
.byte %11000000
 
.byte %00000000
.byte %00000000
.byte %00000000
.byte %00000000
.byte %00000000
.byte %00000000
.byte %00000000
.byte %00000000
 
.byte %01010101
.byte %01010101
.byte %01010101
.byte %01010101
.byte %01010101
.byte %01010101
.byte %01010101
.byte %01010101
 
.byte %10101010
.byte %10101010
.byte %10101010
.byte %10101010
.byte %10101010
.byte %10101010
.byte %10101010
.byte %10101010
 
.byte %11111111
.byte %11111111
.byte %11111111
.byte %11111111
.byte %11111111
.byte %11111111
.byte %11111111
.byte %11111111
 
 
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

Od textových režimů k režimům grafickým

Všechny textové režimy, které jsme si popsali, se na osmibitových Atari velmi často používají, a to pro různé účely. Editory, databáze, tabulkové procesory atd. typicky využívaly standardní textový režim GR.0. Režimy GR.1 a GR.2 byly použity méně často, většinou jen na několika řádcích pro zobrazení skóre, nebo na úvodních obrazovkách. Mnohem častěji se bylo možné setkat s režimy GR.12 a někdy i GR.13, které kombinovaly relativně vysoké rozlišení, opět relativně vysoký počet barev a navíc i nízkou spotřebu paměti (a tím pádem i rychlost). Ovšem Atari dokáže využít i grafické (rastrové režimy). Jejich velkou výhodou je velmi jednoduchá struktura video paměti, čímž se Atari odlišuje jak od svých osmibitových konkurentů, tak i například od IBM PC s jeho plejádou navzájem zcela odlišných grafických režimů.

Grafickými režimy se budeme zabývat příště, ale již dnes si ukážeme ten nejjednodušší rastrový režim, který osmibitové Atari nabízí. Jedná se o režim s rozlišením 80×48 s pouhými dvěma barvami. Každý pixel je reprezentován jediným bitem a tedy spotřeba video RAM je: 80×48/8=480 bajtů. Barvy pixelů jsou uloženy přirozeně za sebou (po řádcích); Atari nepoužívá žádné prokládání ani blokovou strukturu.

Grafický režim s rozlišením 80x48 pixelů, navíc ještě ve dvoubarevném provedení. To samozřejmě není zdaleka vše, co Atari nabízí.

Obrázek 15: Grafický režim s rozlišením 80×48 pixelů, navíc ještě ve dvoubarevném provedení. To samozřejmě není zdaleka vše, co Atari nabízí.

Autor: tisnik, podle licence: Rights Managed

Nejjednodušší případ: dvoubarevný grafický režim s rozlišením 80×48 pixelů

V rastrovém grafickém režimu 80×48×2 barvy je nutné rezervovat 480 bajtů pro obrazovou paměť. Pixely s bitem nastaveným na jedničku budou mít takovou barvu, jaká bude zapsána do registru COLOR0. A pixely s nulovým bitem budou mít barvu získanou z registru COLOR4. Dnešní poslední demonstrační příklad do video RAM zapíše 256 hodnot, což odpovídá 256×8=2048 pixelům. Výsledek byl ukázán na patnáctém obrázku (z něhož je mj. patrné, že v osmici sousedních pixelů je bit s nejvyšším indexem vykreslen jako první):

.include "atari.inc"
 
.CODE
 
 
.proc main
        lda #<dlist             ; nižší byte adresy display listu
        sta SDLSTL
        lda #>dlist             ; vyšší byte adresy display listu
        sta SDLSTH
 
        ldy #0                  ; počitadlo zápisů
clear:
        tya                     ; kód tištěných pixelů
        sta screen, y           ; tisk pixelu na zvolené místo na obrazovce
        iny                     ; zvětšit hodnotu počitadla a offsetu
        bne clear               ; skok
 
loop:   jmp loop
.endproc
 
dlist:
.byte DL_BLK8, DL_BLK8, DL_BLK8 ; 3x8=24 prázdných obrazových řádků
.byte DL_LMS+DL_MAP80x4x2       ; určení počáteční adresy obrazové paměti + jeden řádek režimu 9 (GR.4)
.byte <screen, >screen          ; počáteční adresa obrazové paměti 
.byte DL_MAP80x4x2              ; jeden řádek grafického režimu 9 (GR.4)
.byte DL_MAP80x4x2              ; jeden řádek grafického režimu 9 (GR.4)
.byte DL_MAP80x4x2              ; jeden řádek grafického režimu 9 (GR.4)
.byte DL_MAP80x4x2              ; jeden řádek grafického režimu 9 (GR.4)
.byte DL_MAP80x4x2              ; jeden řádek grafického režimu 9 (GR.4)
.byte DL_MAP80x4x2              ; jeden řádek grafického režimu 9 (GR.4)
.byte DL_MAP80x4x2              ; jeden řádek grafického režimu 9 (GR.4)
.byte DL_MAP80x4x2              ; jeden řádek grafického režimu 9 (GR.4)
.byte DL_MAP80x4x2              ; jeden řádek grafického režimu 9 (GR.4)
.byte DL_MAP80x4x2              ; jeden řádek grafického režimu 9 (GR.4)
.byte DL_MAP80x4x2              ; jeden řádek grafického režimu 9 (GR.4)
.byte DL_MAP80x4x2              ; jeden řádek grafického režimu 9 (GR.4)
.byte DL_MAP80x4x2              ; jeden řádek grafického režimu 9 (GR.4)
.byte DL_MAP80x4x2              ; jeden řádek grafického režimu 9 (GR.4)
.byte DL_MAP80x4x2              ; jeden řádek grafického režimu 9 (GR.4)
.byte DL_MAP80x4x2              ; jeden řádek grafického režimu 9 (GR.4)
.byte DL_MAP80x4x2              ; jeden řádek grafického režimu 9 (GR.4)
.byte DL_MAP80x4x2              ; jeden řádek grafického režimu 9 (GR.4)
.byte DL_MAP80x4x2              ; jeden řádek grafického režimu 9 (GR.4)
.byte DL_MAP80x4x2              ; jeden řádek grafického režimu 9 (GR.4)
.byte DL_MAP80x4x2              ; jeden řádek grafického režimu 9 (GR.4)
.byte DL_MAP80x4x2              ; jeden řádek grafického režimu 9 (GR.4)
.byte DL_MAP80x4x2              ; jeden řádek grafického režimu 9 (GR.4)
.byte DL_MAP80x4x2              ; jeden řádek grafického režimu 9 (GR.4)
.byte DL_JVB, <dlist, >dlist    ; skok na začátek display listu
 
end:
 
.BSS
screen: .res 10*48
 
 
 
.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
 
all: $(execs)
 
clean:
        rm -f *.o
        rm -f *.xex
 
.PHONY: all clean
 
%.o: %.asm
        ca65 $< -t atari -o $@ -l $(basename $<)_list.asm --list-bytes 100
 
%.xex: %.o
        ld65 -C linker.cfg $< -o $@ -m $(basename $<).map

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

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

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

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

Odkazy na Internetu

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

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

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


Autor článku

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



Nejnovější články