Další funkce podporované čipem POKEY

Dnes
Doba čtení: 74 minut

Sdílet

Projekt Atari perex.
Autor: Michal Tauchman, podle licence: CC BY-SA 4.0
Projekt Atari perex.
Integrovaný obvod POKEY z herních automatů i počítačů Atari je víceúčelovým čipem. Realizuje tvorbu zvuků a hudby, čtení stavů ovladačů paddle, čtení kláves, obsahuje generátor pseudonáhodných čísel a taktéž sériový I/O.

V trojici článků o čipu POKEY, které na Rootu vyšly v předchozích týdnech [1] [2] [3] jsme se zaměřili na popis způsobu generování zvuků (a částečně i hudby) tímto integrovaným obvodem. Ovšem POKEY je víceúčelovým čipem, protože realizuje resp. přesněji řečeno umožňuje realizovat hned několik činností: generování zvuků a hudby (již známe), čtení stavů paddle (potenciometrů), čtení klávesnice (64 běžných kláves + 3 speciálně zpracovávané klávesy Control, Shift a Break), obsahuje generátor pseudonáhodných hodnot, dále čítače (využívají tři zvukové kanály, využití našly například při práci s magnetofonem), sériový I/O a řízení IRQ (přerušení). V dnešním článku se začneme zabývat „nezvukovými“ vlastnostmi tohoto integrovaného obvodu.

Co se dozvíte v článku
  1. Řídicí a stavové registry čipu POKEY
  2. Přístup k řídicím a stavovým registrům z assembleru
  3. Generátor pseudonáhodných hodnot
  4. První demonstrační příklad: výpis pseudonáhodných hodnot formou sekvence ATASCII znaků
  5. Grafická vizualizace pseudonáhodných hodnot
  6. Druhý demonstrační příklad: vizualizace pseudonáhodných hodnot v grafickém režimu 80×48 pixelů
  7. Třetí a čtvrtý příklad: vyplnění celé obrazovky pseudonáhodnými hodnotami
  8. Krátká odbočka do ještě vzdálenější historie
  9. Herní ovladače typu paddle
  10. Způsob připojení paddle a měření natočení ovladače
  11. Registry POKEY použité pro práci s paddle
  12. Čtení natočení paddle operačním systémem
  13. Využití paddle ve hrách a kreslicích programech
  14. Pátý demonstrační příklad: příprava na ovládání hráče
  15. Šestý demonstrační příklad: přímé ovládání hráče s využitím paddle
  16. Obsah navazujícího článku
  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
Poznámka: samotná zkratka POKEY znamená Pot Keyboard Integrated Circuit, z čehož plyne, že se větší důraz kladl na práci s klávesnicí a čtení natočení potenciometrů (použity jsou v ovladačích typu paddle). Tedy na rozdíl od SIDu (Sound Interface Device) není v názvu POKEY zmíněn ani zvukový subsystém, ani systém pro sériové vstup-výstup (I/O).

Řídicí a stavové registry čipu POKEY

Ovládání či naopak čtení stavu čipu POKEY se provádí s využitím řídicích a stavových registrů. Adresový rozsah vyhrazený pro POKEY je roven šestnácti adresám, ovšem využívá se jich jen 14 pro čtení a 15 pro zápis. Jak je na osmibitových Atari zvykem, je při zápisu na určitou adresu použit (zcela) odlišný registr, než pro čtení. Konkrétně tedy při čtení z adresy $d200 získáme stav natočení prvního paddle, kdežto při zápisu na stejnou adresu nastavujeme děličku frekvence prvního zvukového kanálu. I z tohoto důvodu existují pro vybrané registry takzvané stínové registry, což jsou místa v operační paměti, kam operační systém zapisuje stejné informace, jaké zapisuje do řídicích registrů (odsud totiž není možné čtení provést):

Jméno Stínový registr Čtení/zápis Adresa Stručný popis
POT0 PADDL0 čtení $d200 měření natočení prvního paddle
POT1 PADDL1 čtení $d201 měření natočení druhého paddle
POT2 PADDL2 čtení $d202 měření natočení třetího paddle
POT3 PADDL3 čtení $d203 měření natočení čtvrtého paddle
POT4 PADDL4 čtení $d204 měření natočení pátého paddle
POT5 PADDL5 čtení $d205 měření natočení šestého paddle
POT6 PADDL6 čtení $d206 měření natočení sedmého paddle
POT7 PADDL7 čtení $d207 měření natočení osmého paddle
ALLPOT   čtení $d208 stav měření všech osmi paddle (0 znamená validní informaci, 1 prováděné měření)
KBCODE CH čtení $d209 kód stisknuté klávesy (což není zcela přesné, viz další text)
RANDOM   čtení $d20a hodnota generátoru pseudonáhodných hodnot
SERIN   čtení $d20d buffer pro data posílaná po sériovém portu (čtení-příjem)
IRQST   čtení $d20e stav jednotlivých přerušení (IRQ)
SKSTAT   čtení $d20f stavový registr sériového portu
         
AUDF1   zápis $d200 nastavení děličky frekvence prvního zvukového kanálu
AUDC1   zápis $d201 hlasitost + zkreslení (poly čítače) prvního zvukového kanálu
AUDF2   zápis $d202 nastavení děličky frekvence druhého zvukového kanálu
AUDC2   zápis $d203 hlasitost + zkreslení (poly čítače) druhého zvukového kanálu
AUDF3   zápis $d204 nastavení děličky frekvence třetího zvukového kanálu
AUDC3   zápis $d205 hlasitost + zkreslení (poly čítače) třetího zvukového kanálu
AUDF4   zápis $d206 nastavení děličky frekvence čtvrtého zvukového kanálu
AUDC4   zápis $d207 hlasitost + zkreslení (poly čítače) čtvrtého zvukového kanálu
AUDCTL   zápis $d208 globální nastavení celého zvukového subsystému (frekvence+spojení zvukových kanálů)
STIMER   zápis $d209 zapnutí časovače
SKRES   zápis $d20a zápis jakékoli hodnoty provede vynulování bitů 5 až 7 registru SKSTAT
POTGO   zápis $d20b inicializace měření natočení paddle (vybití kondenzátorů)
SEROUT   zápis $d20d buffer pro data posílaná po sériovém portu (zápis-vysílání)
IRQEN POKMSK zápis $d20e povolení či zákaz jednotlivých přerušení
SKCTL SSKCLT zápis $d20f řízení sériového portu, režimu čtení klávesnice a rychlého čtení paddle

Alternativně je možné registry rozdělit podle subsystému, který ovládají nebo o němž zjišťují stav.

Zvukový subsystém:

Jméno Stínový registr Čtení/zápis Adresa Stručný popis
AUDF1   zápis $d200 nastavení děličky frekvence prvního zvukového kanálu
AUDC1   zápis $d201 hlasitost + zkreslení (poly čítače) prvního zvukového kanálu
AUDF2   zápis $d202 nastavení děličky frekvence druhého zvukového kanálu
AUDC2   zápis $d203 hlasitost + zkreslení (poly čítače) druhého zvukového kanálu
AUDF3   zápis $d204 nastavení děličky frekvence třetího zvukového kanálu
AUDC3   zápis $d205 hlasitost + zkreslení (poly čítače) třetího zvukového kanálu
AUDF4   zápis $d206 nastavení děličky frekvence čtvrtého zvukového kanálu
AUDC4   zápis $d207 hlasitost + zkreslení (poly čítače) čtvrtého zvukového kanálu
AUDCTL   zápis $d208 globální nastavení celého zvukového subsystému (frekvence+spojení zvukových kanálů)

Práce s ovladači typu paddle:

Jméno Stínový registr Čtení/zápis Adresa Stručný popis
POT0 PADDL0 čtení $d200 měření natočení prvního paddle
POT1 PADDL1 čtení $d201 měření natočení druhého paddle
POT2 PADDL2 čtení $d202 měření natočení třetího paddle
POT3 PADDL3 čtení $d203 měření natočení čtvrtého paddle
POT4 PADDL4 čtení $d204 měření natočení pátého paddle
POT5 PADDL5 čtení $d205 měření natočení šestého paddle
POT6 PADDL6 čtení $d206 měření natočení sedmého paddle
POT7 PADDL7 čtení $d207 měření natočení osmého paddle
ALLPOT   čtení $d208 stav měření všech osmi paddle (0 znamená validní informaci, 1 prováděné měření)
POTGO   zápis $d20b inicializace měření natočení paddle (vybití kondenzátorů)

Sériový I/O port:

Jméno Stínový registr Čtení/zápis Adresa Stručný popis
SERIN   čtení $d20d buffer pro data posílaná po sériovém portu (čtení-příjem)
SKSTAT   čtení $d20f stavový registr sériového portu
SEROUT   zápis $d20d buffer pro data posílaná po sériovém portu (zápis-vysílání)
SKCTL SSKCLT zápis $d20f řízení sériového portu, režimu čtení klávesnice a rychlého čtení paddle
SKRES   zápis $d20a zápis jakékoli hodnoty provede vynulování bitů 5 až 7 registru SKSTAT

Klávesnice:

Jméno Stínový registr Čtení/zápis Adresa Stručný popis
KBCODE CH čtení $d209 kód stisknuté klávesy (což není zcela přesné, viz další text)

IRQ:

Jméno Stínový registr Čtení/zápis Adresa Stručný popis
IRQST   čtení $d20e stav jednotlivých přerušení (IRQ)
IRQEN POKMSK zápis $d20e povolení či zákaz jednotlivých přerušení

Generátor pseudonáhodných hodnot a časovač:

Jméno Stínový registr Čtení/zápis Adresa Stručný popis
RANDOM   čtení $d20a hodnota generátoru pseudonáhodných hodnot
STIMER   zápis $d209 zapnutí časovače

Přístup k řídicím a stavovým registrům z assembleru

Při programování v assembleru samozřejmě nemusíme pracovat přímo s číselnými adresami registrů POKEY, protože v souboru atari.inc máme k dispozici příslušné konstanty. Zejména počáteční adresu adresové prostoru čipu POKEY:

POKEY     = $D200         ;POKEY area

Adresy jednotlivých registrů jsou pak od POKEY odvozeny:

; Read Addresses
 
POT0    = POKEY + $00         ;potentiometer 0
POT1    = POKEY + $01         ;potentiometer 1
POT2    = POKEY + $02         ;potentiometer 2
POT3    = POKEY + $03         ;potentiometer 3
POT4    = POKEY + $04         ;potentiometer 4
POT5    = POKEY + $05         ;potentiometer 5
POT6    = POKEY + $06         ;potentiometer 6
POT7    = POKEY + $07         ;potentiometer 7
 
ALLPOT  = POKEY + $08         ;potentiometer port status
KBCODE  = POKEY + $09         ;keyboard code
RANDOM  = POKEY + $0A         ;random number generator
SERIN   = POKEY + $0D         ;serial port input
IRQST   = POKEY + $0E         ;IRQ interrupt status
SKSTAT  = POKEY + $0F         ;serial port and keyboard status
 
; Write Addresses
 
AUDF1   = POKEY + $00         ;channel 1 audio frequency
AUDC1   = POKEY + $01         ;channel 1 audio control
 
AUDF2   = POKEY + $02         ;channel 2 audio frequency
AUDC2   = POKEY + $03         ;channel 2 audio control
 
AUDF3   = POKEY + $04         ;channel 3 audio frequency
AUDC3   = POKEY + $05         ;channel 3 audio control
 
AUDF4   = POKEY + $06         ;channel 4 audio frequency
AUDC4   = POKEY + $07         ;channel 4 audio control
 
AUDCTL  = POKEY + $08         ;audio control
STIMER  = POKEY + $09         ;start timers
SKRES   = POKEY + $0A         ;reset SKSTAT status
POTGO   = POKEY + $0B         ;start potentiometer scan sequence
SEROUT  = POKEY + $0D         ;serial port output
IRQEN   = POKEY + $0E         ;IRQ interrupt enable
SKCTL   = POKEY + $0F         ;serial port and keyboard control

Generátor pseudonáhodných hodnot

Praktickou část dnešního článku začneme tou nejjednodušší vlastností čipu POKEY. Přes stavový registr RANDOM (určen je jen pro čtení) je totiž možné v libovolný okamžik přečíst osm bitů s pseudonáhodnými hodnotami. Interně je pro generování pseudonáhodných hodnot využit sedmnáctibitový posuvný registr se zpětnou vazbou (poly čítač, LFSR – Linear-feedback shift register), s nímž jsme se již setkali při popisu zvukového subsystému. Tento poly čítač tedy slouží jak ke generování šumu, tak i pseudonáhodných hodnot (ostatně proč nevyužít již tak drahé tranzistory pro více účelů?). Tento čítač mění svůj stav s frekvencí CPU (tedy cca 1,7 MHz) a registr RANDOM lze díky tomu, že v počítači vznikají a jsou zpracovávána různá přerušení, dochází k přerušení od ANTICu atd., považovat za dostatečně kvalitní generátor (pseudo)náhodných hodnot – pro hry je vhodný zcela jistě a pro kryptografické aplikace nejsou osmibitová Atari určena :-)

První demonstrační příklad: výpis pseudonáhodných hodnot formou sekvence ATASCII znaků

V dnešním prvním demonstračním příkladu se na prvních šest textových řádků standardního grafického režimu GR.0 vypíšou náhodné ATASCII znaky, jejichž kódy byly získány právě čtením registru RANDOM:

Pseudonáhodné znaky generované s využitím čipu POKEY.

Obrázek 1: Pseudonáhodné znaky generované s využitím čipu POKEY.

Autor: tisnik, podle licence: Rights Managed

Po každém stisku klávesy se provede překreslení obrazovky novou sadou pseudonáhodných znaků:

Odlišné pseudonáhodné znaky generované s využitím čipu POKEY.

Obrázek 2: Odlišné pseudonáhodné znaky generované s využitím čipu POKEY.

Autor: tisnik, podle licence: Rights Managed

Poznámka: pouhých šest textových řádků a nikoli celou obrazovku používám z toho důvodu, že 6×40<255 a tedy samotná realizace programové smyčky si vystačí s jediným osmibitovým počitadlem realizovaným index registrem Y. Proč zrovna Y a ne X? Odpověď dá použitý adresovací režim):
        ldy #0                  ; počitadlo zápisů
fills:
        lda RANDOM
        sta (88), y             ; tisk znaku na zvolené místo na obrazovce
                                ; (adresa Video RAM je na adresách 88 a 89)
        iny                     ; zvětšit hodnotu počitadla a offsetu
        cpy #40*6               ; test na koncovou hodnotu počitadla
        bne fills               ; skok, pokud Y>40*6

Následuje výpis úplného zdrojového kódu tohoto demonstračního příkladu:

; ---------------------------------------------------------------------
; Vyplnění bloku náhodnými hodnotami.
; ---------------------------------------------------------------------
 
.include "atari.inc"
 
.CODE
 
 
.proc main
loop:
        ldy #0                  ; počitadlo zápisů
fills:
        lda RANDOM
        sta (88), y             ; tisk znaku na zvolené místo na obrazovce
                                ; (adresa Video RAM je na adresách 88 a 89)
        iny                     ; zvětšit hodnotu počitadla a offsetu
        cpy #40*6               ; test na koncovou hodnotu počitadla
        bne fills               ; skok, pokud Y>40*6
 
        jsr get_key
        jmp loop
.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
 
 
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

Grafická vizualizace pseudonáhodných hodnot

U generátorů pseudonáhodných hodnot vždy stojíme před otázkou: do jaké míry jsou čtené hodnoty „náhodné“ a zda mají dostatečně dlouhou periodu (ostatně samotná existence konečné periody znamená, že hodnoty nejsou skutečně náhodné). Pochopitelně bychom pro analýzu mohli použít různé předpřipravené nástroje, ovšem pro jednoduchost si vystačíme s lidským mozkem a jeho systémem rozpoznávání vzorů (v chaosu). Nejprve nastavíme monochromatický grafický režim a následně do obrazové paměti uložíme pseudonáhodné hodnoty získané čtením z registru RANDOM. Pokud vznikne ve čtených datech krátká perioda popř. se nějaké vzorky budou opakovat, lidský mozek by tuto skutečnost měl zaznamenat.

Monochromatický režim bude mít rozlišení 80×48 pixelů (není nutné řešit stránkování) a jeho display list vypadá takto:

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 
.res 47, DL_MAP80x4x2           ; opakovat řádky grafického režimu 9 (GR.4)
.byte DL_JVB, dlist    ; skok na začátek display listu

Druhý demonstrační příklad: vizualizace pseudonáhodných hodnot v grafickém režimu 80×48 pixelů

V dnešním druhém demonstračním příkladu se nejdříve nastaví monochromatický grafický režim s rozlišením 80×48 pixelů, přičemž obrazovka bude inicializována statickými daty:

Na začátku má obrazová paměť tento obsah.

Obrázek 3: Na začátku má obrazová paměť tento obsah.

Autor: tisnik, podle licence: Rights Managed

Po stisku libovolné klávesy se prvních 240 bajtů, tedy prvních 24 obrazových řádků přepíše pseudonáhodnými daty přečtenými z registru RANDOM:

Vyplnění prnvních 240 bajtů obrazové paměti pseudonáhodnými daty.

Obrázek 4: Vyplnění prvních 240 bajtů obrazové paměti pseudonáhodnými daty.

Autor: tisnik, podle licence: Rights Managed

Každý další stisk klávesy tuto první část obrazové paměti přepíše novými pseudonáhodnými hodnotami:

Vyplnění prnvních 240 bajtů obrazové paměti odlišnými pseudonáhodnými daty.

Obrázek 5: Vyplnění prvních 240 bajtů obrazové paměti odlišnými pseudonáhodnými daty.

Autor: tisnik, podle licence: Rights Managed

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

; ---------------------------------------------------------------------
; Vyplnění bloku náhodnými hodnotami.
; ---------------------------------------------------------------------
 
.include "atari.inc"
 
.CODE
 
 
.proc main
        lda #0                  ; kod barvy
        sta COLOR0              ; ulozit do registru COLOR2
 
        lda #10                 ; kod barvy
        sta COLOR4              ; ulozit do registru COLOR4
 
        lda #<dlist             ; nižší byte adresy display listu
        sta SDLSTL
        lda #>dlist             ; vyšší byte adresy display listu
        sta SDLSTH
 
        jsr get_key
 
loop:
        ldy #0                  ; počitadlo zápisů
fills:
        lda RANDOM
        sta screen, y           ; tisk znaku na zvolené místo na obrazovce
        iny                     ; zvětšit hodnotu počitadla a offsetu
        cpy #40*6               ; test na koncovou hodnotu počitadla
        bne fills               ; skok, pokud Y>40*6
 
        jsr get_key
        jmp loop
.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_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 
.res 47, DL_MAP80x4x2           ; opakovat řádky grafického režimu 9 (GR.4)
.byte DL_JVB, dlist    ; skok na začátek display listu
 
screen:                         ; video paměť
.include "image_80x48.asm"
 
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

Třetí a čtvrtý příklad: vyplnění celé obrazovky pseudonáhodnými hodnotami

Další, v pořadí již třetí demonstrační příklad, vykresluje pseudonáhodné pixely na celou obrazovku. Díky použitému grafickému režimu je nutné vyplnit pouze 480 bajtů, což znamená dvojici programových smyček (každá pro vyplnění resp. nastavení 240 bajtů). Poněkud naivní, ale na druhou stranu plně funkční, způsob implementace může vypadat takto:

fills1:
        lda RANDOM
        sta screen, y           ; tisk osmice pixelu na zvolené místo na obrazovce
        iny                     ; zvětšit hodnotu počitadla a offsetu
        cpy #40*6               ; test na koncovou hodnotu počitadla
        bne fills1              ; skok, pokud Y>40*6
        ldy #0                  ; počitadlo zápisů
fills2:
        lda RANDOM
        sta screen+40*6, y      ; tisk osmice pixelu na zvolené místo na obrazovce
        iny                     ; zvětšit hodnotu počitadla a offsetu
        cpy #40*6               ; test na koncovou hodnotu počitadla
        bne fills2              ; skok, pokud Y>40*6
Vyplnění celé obrazové paměti (480 bajtů) pseudonáhodnými daty.

Obrázek 6: Vyplnění celé obrazové paměti (480 bajtů) pseudonáhodnými daty.

Autor: tisnik, podle licence: Rights Managed

Odlišné pseudonáhodné hodnoty vyplňující celou obrazovou paměť.

Obrázek 7: Odlišné pseudonáhodné hodnoty vyplňující celou obrazovou paměť.

Autor: tisnik, podle licence: Rights Managed

Úplný zdrojový kód takto rozšířeného demonstračního příkladu vypadá následovně:

; ---------------------------------------------------------------------
; Vyplnění bloku náhodnými hodnotami.
; ---------------------------------------------------------------------
 
.include "atari.inc"
 
.CODE
 
 
.proc main
        lda #0                  ; kod barvy
        sta COLOR0              ; ulozit do registru COLOR2
 
        lda #10                 ; kod barvy
        sta COLOR4              ; ulozit do registru COLOR4
 
        lda #<dlist             ; nižší byte adresy display listu
        sta SDLSTL
        lda #>dlist             ; vyšší byte adresy display listu
        sta SDLSTH
 
        jsr get_key
 
loop:
        ldy #0                  ; počitadlo zápisů
fills1:
        lda RANDOM
        sta screen, y           ; tisk osmice pixelu na zvolené místo na obrazovce
        iny                     ; zvětšit hodnotu počitadla a offsetu
        cpy #40*6               ; test na koncovou hodnotu počitadla
        bne fills1              ; skok, pokud Y>40*6
        ldy #0                  ; počitadlo zápisů
fills2:
        lda RANDOM
        sta screen+40*6, y      ; tisk osmice pixelu na zvolené místo na obrazovce
        iny                     ; zvětšit hodnotu počitadla a offsetu
        cpy #40*6               ; test na koncovou hodnotu počitadla
        bne fills2              ; skok, pokud Y>40*6
 
        jsr get_key
        jmp loop
.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_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 
.res 47, DL_MAP80x4x2           ; opakovat řádky grafického režimu 9 (GR.4)
.byte DL_JVB, <dlist, >dlist    ; skok na začátek display listu
 
screen:                         ; video paměť
.include "image_80x48.asm"
 
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

Výhodnější však může být uložení „vyplňovací smyčky“ do makra, kterému se předá počáteční adresa vyplňovaného bloku a celkový počet bajtů (do 255):

.macro  fill_random_pixels address, size
        .local fills
        ldy #0                  ; počitadlo zápisů
fills:
        lda RANDOM
        sta address, y          ; tisk znaku osmice pixelu na zvolené místo na obrazovce
        iny                     ; zvětšit hodnotu počitadla a offsetu
        cpy size                ; test na koncovou hodnotu počitadla
        bne fills               ; skok, pokud Y>size
        ldy #0                  ; počitadlo zápisů
.endmacro

Toto makro bude v programu expandováno celkem dvakrát:

        fill_random_pixels screen, 40*6
        fill_random_pixels screen+40*6, 40*6

Výsledný programový kód bude po těchto úpravách vypadat takto:

; ---------------------------------------------------------------------
; Vyplnění bloku náhodnými hodnotami.
; ---------------------------------------------------------------------
 
.include "atari.inc"
 
.CODE
 
.macro  fill_random_pixels address, size
        .local fills
        ldy #0                  ; počitadlo zápisů
fills:
        lda RANDOM
        sta address, y          ; tisk znaku osmice pixelu na zvolené místo na obrazovce
        iny                     ; zvětšit hodnotu počitadla a offsetu
        cpy size                ; test na koncovou hodnotu počitadla
        bne fills               ; skok, pokud Y>size
        ldy #0                  ; počitadlo zápisů
.endmacro
 
 
 
.proc main
        lda #0                  ; kod barvy
        sta COLOR0              ; ulozit do registru COLOR2
 
        lda #10                 ; kod barvy
        sta COLOR4              ; ulozit do registru COLOR4
 
        lda #<dlist             ; nižší byte adresy display listu
        sta SDLSTL
        lda #>dlist             ; vyšší byte adresy display listu
        sta SDLSTH
 
        jsr get_key
 
loop:
        fill_random_pixels screen, 40*6
        fill_random_pixels screen+40*6, 40*6
 
        jsr get_key
        jmp loop
.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_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 
.res 47, DL_MAP80x4x2           ; opakovat řádky grafického režimu 9 (GR.4)
.byte DL_JVB, <dlist, >dlist    ; skok na začátek display listu
 
screen:                         ; video paměť
.include "image_80x48.asm"
 
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

Krátká odbočka do ještě vzdálenější historie

Vraťme se na chvíli do dávné IT minulosti, konkrétně do roku 1966. Právě tehdy Nolan Bushnell najal mladého inženýra Allana Alcorna, aby pro něj navrhl a zkonstruoval závodní hru (vývoj probíhal paralelně s vývojem Computer Space). Pokud by Alan skutečně toto zadání zdárně dokončil, jednalo by se s velkou pravděpodobností o první závodní hru tohoto typu na světě, po několika týdnech vývoje se však ukázalo, že se při tehdejší úrovni integrace elektronických obvodů jedná o příliš ambiciózní projekt, protože výsledný produkt by byl velký a především drahý. Allan Alcorn tedy místo implementačně komplikované závodní hry vytvořil vlastní kopii hry Pong, která se stala velmi úspěšným titulem a velkou měrou přispěla k dalšímu vývoji herních automatů a posléze i domácích herních konzolí (nejdůležitější byl fakt, že se i další firmy začaly o toto zcela nové průmyslové odvětví zajímat, což pozitivně přispělo k vývoji dalších technologií, na jejichž konci stojí moderní osobní počítače)

Obrázek 8: Al Alcorn byl v pořadí třetím zaměstnancem firmy Atari.

Automat s touto hrou sice pro vykreslování herní scény používal rastrový displej (obyčejnou černobílou televizní obrazovku), ovšem dnes zcela běžný framebuffer, tj. obrazová paměť, ve které je uložena předloha vykreslovaného rastrového obrázku, zde nebyl implementován – namísto toho se obraz generoval v sadě integrovaných obvodů řízených přesným hodinovým signálem, podobně jako ve výše zmíněné hře Computer Space. V souvislosti s videohrou Pong se setkáváme s další důležitou firmou. Jedná se o společnost Magnavox, která vytvořila herní konzoli Odyssey právě se hrou Pong. Vzhledem k tomu, že konzole Odyssey byla vytvořena dříve než automat Pong, byl Nolan Bushnell a jeho právě založená firma Atari zažalována (korunu tomu dodal fakt, že Bushnell byl zapsán v seznamu hostů pozvaných na představení konzole Odyssey ještě před jejím vydáním a samozřejmě též před vydáním videohry Pong). Výsledkem tohoto soudního sporu bylo, že firma Atari v roce 1976 zakoupila „licenci“ za 700 000 dolarů na hru Pong, a tuto licenci samozřejmě zaplatila z výnosů, které jí tento herní automat přinášel.

pc6608

Obrázek 9: Hra Pong ve variantě z roku 1972.

Herní ovladače typu paddle

Proč jsme se však o hře Pong vůbec zmiňovali? Není to proto, že by se jednalo o výrobek společnosti Atari, ale z toho důvodu, že se hra Pong ovládala dvojicí otočných ovladačů. Natočením se měnil odpor, který byl periodicky měřen a hra reagovala na vypočtenou hodnotu. Později byl podobný způsob ovládání použit i v domácí (přenosné) variantě hry Pong. A protože se ve stolním tenisu (ping pong) rakety označují slovem paddle, vžilo se toto označení i pro otočné herní ovladače, které interně využívaly buď rotační enkodér nebo (častěji) běžný potenciometr. A právě druhý typ ovladačů založených na potenciometru je podporován i osmibitovými domácími mikropočítači Atari. Ovladače typu paddle se připojovaly do stejných konektorů, jako joysticky. A vzhledem k tomu, že do jednoho joystickového konektoru mohly být připojeny dva ovladače typu paddle (piny paddle A a paddle B), bylo možné podle typu počítače pracovat buď se čtyřmi (série XL a XE) nebo dokonce osmi (původní Atari 400 a Atari 800) otočnými ovladači.

Obrázek 10: Kabinet se hrou Pong. Z panelu pod obrazovkou je patrné minimalistické pojetí ovládání této hry s využitím dvojice paddle.

Způsob připojení paddle a měření natočení ovladače

Každý ovladač paddle je většinou představovaný běžným potenciometrem, který je zapojen mezi pin s pěti volty a vstupní pin číslo 5 nebo 9 na joystickovém konektoru. Interně je každý z pinů (5, 9) interně zapojen ke kondenzátoru, který má svou druhou elektrodu uzemněnou. A navíc je paralelně ke kondenzátoru zapojen tranzistor ovládaný softwarově. Počítač při zjišťování, jak je paddle (a tedy vlastně potenciometr) natočen, provádí tyto operace:

  1. Tranzistor se sepne, čímž se kondenzátor vybije (pravděpodobně je do série zapojen i ochranný rezistor, to je však interní věc Atari).
  2. Tranzistor se otevře a zaznamená se čas t1
  3. Nyní se kondenzátor začne přes potenciometr nabíjet. Rychlost nabíjení závisí na aktuálním odporu potenciometru a tedy i na jeho natočení.
  4. Jakmile nabití dosáhne určité úrovně, dojde k zaznamenání času t2. Rozdíl t2-t1 je tím větší, čím větší je odpor potenciometru. PADDLE nepoužívá reálný čas; namísto toho počítá obrazové řádky.

Konkrétní způsob měření je prováděn operačním systémem a je odvozen – jako ostatně i mnoho dalších činností – od časování grafického subsystému. Konkrétně se čas měří v délce trvání obrazových řádků, ať již viditelných či neviditelných. Hodnoty, které jsou naměřeny, jsou tak v rozsahu 0 až 228, což je (jaká náhoda) rozsah horizontálních pozic spritů. Některé hry tedy mohly načtené údaje o natočení přímo použít pro horizontální pozicování hráče.

Registry POKEY použité pro práci s paddle

Pro čtení hodnoty ovladačů paddle (je jich teoreticky celkem osm, prakticky ovšem spíše maximálně čtyři) se používá deset registrů čipu POKEY. Devět z těchto registrů je použito pro čtení, desátý registr naopak slouží pro zápis:

Jméno Stínový registr Čtení/zápis Adresa Stručný popis
POT0 PADDL0 čtení $d200 měření natočení prvního paddle
POT1 PADDL1 čtení $d201 měření natočení druhého paddle
POT2 PADDL2 čtení $d202 měření natočení třetího paddle
POT3 PADDL3 čtení $d203 měření natočení čtvrtého paddle
POT4 PADDL4 čtení $d204 měření natočení pátého paddle
POT5 PADDL5 čtení $d205 měření natočení šestého paddle
POT6 PADDL6 čtení $d206 měření natočení sedmého paddle
POT7 PADDL7 čtení $d207 měření natočení osmého paddle
ALLPOT   čtení $d208 stav měření všech osmi paddle (0 znamená validní informaci, 1 prováděné měření)
POTGO   zápis $d20b inicializace měření natočení paddle (vybití kondenzátorů)

Jak čtení probíhá? Typicky se na konci VBI rutiny provede zápis libovolné hodnoty do registru POTGO, čímž se zapne měření odporu (resp. času nabíjení kondenzátoru připojeného do série s potenciometrem):

LDA #cokoli
STA POTGO

Teoreticky je poté možné čekat na nastavení nulových bitů v registru ALLPOT. Jakmile je příslušný bit nulový, je hodnota uložená v odpovídajícím registru POTx korektní (kondenzátor se nabil). Ovšem prakticky víme, že hodnoty POTx budou korektní až v následujícím snímku, takže je opět můžeme vyčíst v subrutině VBI:

LDA POT0
...
...
...
Poznámka: většinou nám postačuje čtení nové hodnoty v každém snímku. Rychlejší čtení je možné, ale nebude přesné (ukážeme si příště).

Čtení natočení paddle operačním systémem

Ve skutečnosti je veškerá obsluha paddle řešena již na úrovni operačního systému, který automaticky nastavuje stínové registry PADDLx. Původní ROM počítačů Atari obsahuje mj. i následující sekvenci instrukcí, která je součástí subrutiny VBI:

; Source: original Atari ROMs
 
1508 E883 A2 03           LDX #3
1509 EBBS BD 10 D0 STRL:  LDA TRIGO,X ;MOVE JOYSTICK TRIGGERS
1510 EBBS 90 84 02        STA STRIGO,X
1511 E8BB BD 00 D2        LDA POTO,X ;MOVE POT VALUES
1512 EBBE 9D 70 02        STA PADDLO,X
1513 E8C1 BD 04 D2        LDA POT4,X
1514 EBC4 9D 74 02        STA PADDL4,X
1515 E8C7 CA              DEX
1516 E8C8 10 EB           BPL STRL
1517 E8CA 8D OB D2        STA POTGO ;START POTS FOR NEXT TIME
1518 ;
1519 E8CD A2 06           LDX #6
1520 E8CF A0 03           LDY #3
1521 EBD1 89 78 02 PTRLP: LDA STICKO,Y ;TRANSFER BITS FROM JOYSTICKS
1522 E8D4 4A              LSR A ;TO PADDLE TRIGGERS
1523 E8D5 4A              LSR A
1524 E8D6 4A              LSR A
1525 EBD7 90 7D 02        STA PTRIG1,X
1526 E8DA A9 00           LDA #0
1527 E8DC 2A              ROL A
1528 E8DD 9D 7C 02        STA PTRIGO,X
1529 E8E0 CA              DEX
1530 E8E1 CA              DEX
1531 E8E2 88              DEY
1532 E8E3 10 EC           BPL PTRLP

Čitelnější kód nalezneme například ve známé Altiře:

; Zdroj:
; https://github.com/ilmenit/AltirraSDL/blob/main/src/Kernel/source/Shared/vbi.s
 
pot_loop:
        lda             pot0,x
        sta             paddl0,x
        lda             #0
        sta             ptrig0,x
        dex
        bpl             pot_loop
 
        ldx             #3
trig_loop:
        lda             trig0,x
        sta             strig0,x
        dex
        bpl             trig_loop
 
        lda             porta
        ldx             #0
        ldy             #0
        jsr             do_stick_ptrigs
        lda             portb
        ldx             #4
        ldy             #2
        jsr             do_stick_ptrigs
.endif
 
        ;restart pots (required for SysInfo)
        sta             potgo

Využití paddle ve hrách a kreslicích programech

Ovladače typu paddle byly poprvé vydány pro herní konzoli Atari 2600 (VCS) a byly využity v několika známých hrách. Mezi ně patří Breakout (tedy předchůdce Arkanoidu), Warlords, Canyon Bomber či Kaboom! Na osmibitových domácích mikropočítačích Atari (400, 800, řada XL, řada XE atd.) se sice používal naprosto stejný ovladač, ovšem podpora pro paddle ve hrách byla relativně slabší. Pravděpodobně nejznámější hrou jsou Warlords (stejný princip jako na Atari 2600 či na herním automatu) a paddle podporuje (vedle joysticku) například i Arkanoid či Planetary Defense.

Hra Warlords je ovládaná pomocí paddle.

Obrázek 11: Hra Warlords je ovládaná pomocí paddle.

Autor: tisnik, podle licence: Rights Managed

Úvodní obrazovka Arkanoidu nabízí ovládání pomocí paddle.

Obrázek 12: Úvodní obrazovka Arkanoidu nabízí ovládání pomocí paddle.

Autor: tisnik, podle licence: Rights Managed

První úroveň hry Arkanoid.

 Obrázek 13: První úroveň hry Arkanoid.

Autor: tisnik, podle licence: Rights Managed

Planetary Defense se dá ovládat i dvojicí paddle, což může být v tomto případě lepší, než s využitím joysticku (což je taktéž možné).

Obrázek 14: Planetary Defense se dá ovládat i dvojicí paddle, což může být v tomto případě lepší, než s využitím joysticku (což je taktéž možné).

Autor: tisnik, podle licence: Rights Managed

Zajímavý je tablet (v původním smyslu tohoto slova) nazvaný Koala Pad, který se připojoval k analogovému vstupu, konkrétně byl připojen jako dvojice ovladačů typu paddle. Koala Pad byl podporován kreslicím programem Koala Painter, jehož uživatelské rozhraní vypadá následovně (je použit grafický režim 160×192 pixelů pro obrázek, uživatelské rozhraní je však založeno na textovém režimu s pěti barvami):

Menu kreslicího programu Koala Painter využívá textový režim s pěti barvami.

Obrázek 15: Menu kreslicího programu Koala Painter využívá textový režim s pěti barvami.

Autor: tisnik, podle licence: Rights Managed

Pátý demonstrační příklad: příprava na ovládání hráče

Vraťme se nyní na chvíli k článkům o PMG, tedy o spritech, které se u osmibitových mikropočítačů Atari nazývají souslovím Player-Missile Graphics. V těchto článcích jsme si kromě dalších věcí ukázali, jak snadné je měnit horizontální pozici hráče zápisem osmibitové hodnoty do jednoho z řídicích registrů HPOSx integrovaného obvodu GTIA. Takto jsme například implementovali posun hráče s využitím joysticku:

; ---------------------------------------------------------------------
; subrutina pro obsluhu VBI
; ---------------------------------------------------------------------
.proc   horizontal_movement
        ldx x_pos               ; původní pozice prvního hráče
 
        lda STICK0              ; čtení joysticku
        cmp #11                 ; je nakloněn doleva?
        bne not_left
        dex                     ; posun hráče doleva
not_left:
        cmp #7                  ; je nakloněn doprava?
        bne not_right
        inx                     ; posun hráče doprava
not_right:
        stx HPOSP0              ; změna pozice prvního hráče
        stx x_pos               ; zapamatovat si pozici prvního hráče
        jmp XITVBV              ; zpracovat zbytek odloženého VBLANKu
        rts
.endproc

Tato subrutina je volána 50× nebo 60× za sekundu a navíc využívá paměťovou buňku s předchozí pozicí hráče:

; horizontální pozice hráče
x_pos:    .byte 80

Výsledek na obrazovce Atari může vypadat následovně:

Posun hráče s využitím joysticku.

Obrázek 16: Posun hráče s využitím joysticku.

Autor: tisnik, podle licence: Rights Managed

Následuje úplný zdrojový kód, který bude v rámci navazující kapitoly modifikován tak, aby bylo možné hráče posunovat nikoli joystickem, ale pomocí ovladače paddle:

.include "atari.inc"
 
.CODE
 
PLAYER_0_OFFSET = 512
 
 
; ---------------------------------------------------------------------
; vstupní bod do programu
; ---------------------------------------------------------------------
.proc main
        lda #80                 ; horizontální pozice prvního hráče
        sta HPOSP0              ; uložit do řídicího registru HPOSP0 na čipu GTIA
 
        lda #HUE_GREEN<<4 + 12  ; barva prvního hráče (odstín+intenzita)
        sta PCOLR0              ; uložit do řídicího registru PCOLR0 na čipu GTIA
 
        lda #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+50, x  ; uložit byte - první hráč
        dex                     ; snížit offset + nastavit příznaky
        bne next_line           ; další byte spritu
 
        lda #46                 ; povolení PMG DMA
        sta SDMCTL
 
        ; nastavit vektor pro odloženou VBI
        lda #>horizontal_movement
        sta VVBLKD+1
        lda #<horizontal_movement
        sta VVBLKD
loop:
        jmp loop                ; program vlastně nice nedělá - jen cyklí!
.endproc
 
 
 
; ---------------------------------------------------------------------
; subrutina pro obsluhu VBI
; ---------------------------------------------------------------------
.proc   horizontal_movement
        ldx x_pos               ; původní pozice prvního hráče
 
        lda STICK0              ; čtení joysticku
        cmp #11                 ; je nakloněn doleva?
        bne not_left
        dex                     ; posun hráče doleva
not_left:
        cmp #7                  ; je nakloněn doprava?
        bne not_right
        inx                     ; posun hráče doprava
not_right:
        stx HPOSP0              ; změna pozice prvního hráče
        stx x_pos               ; zapamatovat si pozici prvního hráče
        jmp XITVBV              ; zpracovat zbytek odloženého VBLANKu
        rts
.endproc
 
 
; data
sprite:   .byte 24, 60, 126, 219, 255, 36, 90, 165
 
; horizontální pozice hráče
x_pos:    .byte 80
 
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

Šestý demonstrační příklad: přímé ovládání hráče s využitím paddle

Přímé ovládání hráče, resp. přesněji řečeno horizontální polohy hráče s využitím ovladače paddle, je realizováno v dnešním šestém a současně i posledním demonstračním příkladu. Změna pozice hráče je realizována ve VBI a je až triviálně jednoduchá, protože většinu práce za nás udělá operační systém:

; ---------------------------------------------------------------------
; subrutina pro obsluhu VBI
; ---------------------------------------------------------------------
.proc   horizontal_movement
        lda PADDL0              ; čtení hodnoty paddle
        sta HPOSP0              ; změna pozice prvního hráče
        jmp XITVBV              ; zpracovat zbytek odloženého VBLANKu
        rts
.endproc
Poznámka: to tedy znamená, že načtená hodnota 0 až 227 je přímo použita pro nastavení horizontální pozice spritu. Samozřejmě by bylo možné provádět další výpočty, aby se například začínalo na hodnotě 48 atd.

Výsledek:

Posun hráče s využitím paddle.

Obrázek 17: Posun hráče s využitím paddle.

Autor: tisnik, podle licence: Rights Managed

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

.include "atari.inc"
 
.CODE
 
PLAYER_0_OFFSET = 512
 
 
; ---------------------------------------------------------------------
; vstupní bod do programu
; ---------------------------------------------------------------------
.proc main
        lda #80                 ; horizontální pozice prvního hráče
        sta HPOSP0              ; uložit do řídicího registru HPOSP0 na čipu GTIA
 
        lda #HUE_GREEN<<4 + 12  ; barva prvního hráče (odstín+intenzita)
        sta PCOLR0              ; uložit do řídicího registru PCOLR0 na čipu GTIA
 
        lda #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+50, x  ; uložit byte - první hráč
        dex                     ; snížit offset + nastavit příznaky
        bne next_line           ; další byte spritu
 
        lda #46                 ; povolení PMG DMA
        sta SDMCTL
 
        ; nastavit vektor pro odloženou VBI
        lda #>horizontal_movement
        sta VVBLKD+1
        lda #<horizontal_movement
        sta VVBLKD
loop:
        jmp loop                ; program vlastně nice nedělá - jen cyklí!
.endproc
 
 
 
; ---------------------------------------------------------------------
; subrutina pro obsluhu VBI
; ---------------------------------------------------------------------
.proc   horizontal_movement
        lda PADDL0              ; čtení hodnoty paddle
        sta HPOSP0              ; změna pozice prvního hráče
        jmp XITVBV              ; zpracovat zbytek odloženého VBLANKu
        rts
.endproc
 
 
 
; data
sprite:   .byte 24, 60, 126, 219, 255, 36, 90, 165
 
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

Obsah navazujícího článku

V navazujícím článku budeme pokračovat v popisu možností nabízených čipem POKEY. Nejdříve si ukážeme způsob čtení kódu stlačených kláves, s čímž nepřímo souvisí i problematika hardwarových přerušení (IRQ), které POKEY taktéž dokáže ovládat (maskovat atd.). A poté si řekneme, jakým způsobem byl integrovaný čip POKEY využit pro řízení sériového portu. Ten byl velmi důležitý, protože sloužil k připojování dalších periferií k osmibitovým mikropočítačům Atari. Ostatně sériový port Atari nazývaný SIO se stal předchůdcem USB, tedy sériové sběrnice používané dodnes.

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 \
         sound_1.xex             sound_2.xex \
         sound_3.xex             sound_4.xex \
         sound_5.xex             sound_6.xex \
         sound_7.xex             sound_8.xex \
         sound_9.xex             sound_A.xex \
         sound_B.xex             sound_C.xex \
         sound_D.xex             sound_E.xex \
         sound_F.xex \
         rnd_1.xex               rnd_2.xex \
         rnd_3.xex               rnd_4.xex \
         paddle_1.xex            paddle_2.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
 
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
 
sound:  \
        sound_1.xex \
        sound_2.xex \
        sound_3.xex \
        sound_4.xex \
        sound_5.xex \
        sound_6.xex \
        sound_7.xex \
        sound_8.xex \
        sound_9.xex \
        sound_A.xex \
        sound_B.xex \
        sound_C.xex \
        sound_D.xex \
        sound_E.xex \
        sound_F.xex
 
rnd:    \
        rnd_1.xex \
        rnd_2.xex \
        rnd_3.xex \
        rnd_4.xex
 
paddle: \
        paddle_1.xex \
        paddle_2.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
       
317 sound1.asm čistý tón komorního A https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/sound1.asm
318 sound1_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/sound1_list.asm
319 sound1.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/sound1.map
       
320 sound2.asm tón komorního A modulovaný šumem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/sound2.asm
321 sound2_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/sound2_list.asm
322 sound2.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/sound2.map
       
323 sound3.asm původní tón komorního A, ovšem nyní je frekvence snížena na 15kHz https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/sound3.asm
324 sound3_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/sound3_list.asm
325 sound3.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/sound3.map
       
326 sound4.asm nejnižší tón, který lze získat ze zvukového kanálu s osmibitovým děličem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/sound4.asm
327 sound4_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/sound4_list.asm
328 sound4.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/sound4.map
       
329 sound5.asm zázněje získané ze dvou zvukových kanálů s podobnou výstupní frekvencí https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/sound5.asm
330 sound5_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/sound5_list.asm
331 sound5.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/sound5.map
       
332 sound6.asm zázněje získané ze čtyř zvukových kanálů s podobnou výstupní frekvencí https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/sound6.asm
333 sound6_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/sound6_list.asm
334 sound6.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/sound6.map
       
335 sound7.asm ukázka všech kombinací generátorů šumu (jeden kanál) https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/sound7.asm
336 sound7_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/sound7_list.asm
337 sound7.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/sound7.map
       
338 sound8.asm ovládání osmibitové děličky zvukového kanálu pomocí joysticku https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/sound8.asm
339 sound8_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/sound8_list.asm
340 sound8.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/sound8.map
       
341 sound9.asm ovládání šestnáctibitové děličky dvou spojených zvukových kanálů pomocí joysticku https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/sound9.asm
342 sound9_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/sound9_list.asm
343 sound9.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/sound9.map
       
344 sound_A.asm nastavení horní propusti pro první zvukový kanál https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/sound_A.asm
345 sound_A_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/sound_A_list.asm
346 sound_A.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/sound_A.map
       
347 sound_B.asm první zvukový kanál s horní propustí, ovládání frekvencí pomocí joysticku https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/sound_B.asm
348 sound_B_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/sound_B_list.asm
349 sound_B.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/sound_B.map
       
350 sound_C.asm první zvukový kanál s horní propustí, ovládání frekvencí pomocí joysticku, změna generátoru šumu pro první kanál https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/sound_C.asm
351 sound_C_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/sound_C_list.asm
352 sound_C.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/sound_C.map
       
353 sound_D.asm přivedení generátoru šumu na horní propust https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/sound_D.asm
354 sound_D_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/sound_D_list.asm
355 sound_D.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/sound_D.map
       
356 sound_E.asm přímé ovládání reproduktoru (generuje se poškozený zvuk) https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/sound_E.asm
357 sound_E_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/sound_E_list.asm
358 sound_E.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/sound_E.map
       
359 sound_F.asm přímé ovládání reproduktoru bez dalších přerušení https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/sound_F.asm
360 sound_F_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/sound_F_list.asm
361 sound_F.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/sound_F.map
       
362 rnd1.asm tisk náhodných ATASCII znaků s hodnotami přečtenými z registru RANDOM https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/rnd1.asm
363 rnd1_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/rnd1_list.asm
364 rnd1.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/rnd1.map
       
365 rnd2.asm vyplnění 48 obrazových řádků v grafickém režimu 80×48 pixelů https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/rnd2.asm
366 rnd2_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/rnd2_list.asm
367 rnd2.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/rnd2.map
       
368 rnd3.asm vyplnění celé obrazovky režimu 80×48 pixelů pseudonáhodnými daty (verze bez maker) https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/rnd3.asm
369 rnd3_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/rnd3_list.asm
370 rnd3.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/rnd3.map
       
371 rnd4.asm vyplnění celé obrazovky režimu 80×48 pixelů pseudonáhodnými daty (verze s makry) https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/rnd4.asm
372 rnd4_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/rnd4_list.asm
373 rnd4.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/rnd4.map
       
374 paddle1.asm příprava pro ovládání horizontální pozice spritu s využitím paddle https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/paddle1.asm
375 paddle1_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/paddle1_list.asm
376 paddle1.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/paddle1.map
       
377 paddle2.asm ovládání horizontální pozice spritu s využitím paddle https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/paddle2.asm
378 paddle2_list.asm „listing“ vygenerovaný assemblerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/paddle2_list.asm
379 paddle2.map mapa paměti; soubor vytvořený linkerem https://github.com/tisnik/8bit-fame/blob/master/Atari800-ca65/paddle2.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
  76. Doug Neubauer
    https://en.wikipedia.org/wi­ki/Doug_Neubauer
  77. POKEY
    https://en.wikipedia.org/wiki/POKEY
  78. Inside the Atari 800XL
    https://www.goto10retro.com/p/800×l-inside
  79. Grayscale Project – „Jam Session“ – Chiptune Visualization / Atari SAP
    https://www.youtube.com/watch?v=Qx-AHgvwrHo&list=PL92E73FD91764173B
  80. POKEY MUSIC ( ATARI XL / XE ) =+ MUSIC FROM POLAND += DEMO
    https://www.youtube.com/wat­ch?v=5PswfMjMop4&list=RD5PswfMjMop4&star­t_radio=1
  81. Atari.org
    http://www.atari.org/
  82. Atari POKEY
    http://www.absoluteastrono­my.com/topics/Atari_POKEY
  83. Chiptune
    http://www.absoluteastrono­my.com/topics/Chiptune
  84. ASAP – Another Slight Atari Player
    http://asap.sourceforge.net/
  85. Atari SAP music archive
    http://asma.atari.org/
  86. RASTER Music Tracker (RMT)
    http://raster.infos.cz/ata­ri/rmt/rmt.htm
  87. POKEY explorer
    https://github.com/ivop/pokey-explorer
  88. POKEY C012294 Documentation
    https://7800.8bitdev.org/in­dex.php/POKEY_C012294_Docu­mentation
  89. Pokey Registers
    https://user.xmission.com/~tre­vin/atari/pokey_regs.html
  90. POKEY CO12294
    http://krap.pl/mirrorz/ata­ri/homepage.ntlworld.com/kry­ten_droid/Atari/800XL/ata­ri_hw/pokey.htm
  91. De Re Atari: SOUND
    https://www.atariarchives­.org/dere/chapt07.php#H7_3_5
  92. Paddle (game controller)
    https://en.wikipedia.org/wi­ki/Paddle_(game_controller)
  93. Interfacing Your Atari
    https://www.atariarchives­.org/creativeatari/Interfa­cing_Your_Atari.php
  94. Atari SIO
    https://en.wikipedia.org/wi­ki/Atari_SIO
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.