Jemný scrolling na osmibitových mikropočítačích Atari

Dnes
Doba čtení: 68 minut

Sdílet

Projekt Atari perex.
Autor: Michal Tauchman, podle licence: CC BY-SA 4.0
Projekt Atari perex.
Poslední velmi užitečnou vlastností čipu ANTIC je podpora pro takzvaný jemný scrolling. ANTIC umožňuje horizontální i vertikální posun celé scény s přesností na jednotlivé pixely resp. obrazové řádky.

Jemný scrolling na osmibitových mikropočítačích Atari

Co se dozvíte v článku
  1. Jemný scrolling na osmibitových mikropočítačích Atari
  2. Jemný scrolling ovládaný řídicími registry čipu ANTIC a instrukcemi display listu
  3. Kostra programu s realizací jemného horizontálního i vertikálního posunu řízeného joystickem
  4. Úplný zdrojový kód prvního demonstračního příkladu
  5. Tisk hodnoty horizontálního a vertikálního offsetu řízeného joystickem
  6. Úplný zdrojový kód druhého demonstračního příkladu
  7. Nastavení řádků v display listu pro povolení vertikálního scrollingu
  8. Jemný vertikální scrolling řízený joystickem
  9. Úplný zdrojový kód třetího demonstračního příkladu
  10. Podrobnější pohled na stav obsah obrazovky při scrollingu
  11. Modifikace display listu: současný jemný horizontální i vertikální scrolling
  12. Řízení horizontálního i vertikálního scrollingu joystickem
  13. Úplný zdrojový kód čtvrtého demonstračního příkladu
  14. Specifikace šířky herního pole
  15. Úplný zdrojový kód pátého demonstračního příkladu
  16. Ukázky display listů použitých v reálných hrách
  17. Komplikovanější display listy áčkových her
  18. Příloha: Makefile pro překlad všech demonstračních příkladů
  19. Repositář s demonstračními příklady
  20. Odkazy na Internetu

Grafický řadič ANTIC tvoří nedílnou součást osmibitových mikropočítačů Atari. V předchozích dílech jsme si ukázali základní způsoby využití display listu, DLI (přerušení vyvolaná na zvolených řádcích) a VBI (přerušení vyvolaná na konci vykreslování celého snímku). Již tyto techniky dokážou i na relativně slabých osmibitových Atari „vyčarovat“ zajímavé grafické scény. Ovšem ještě nám zbývá popis dvou vlastností ANTICu.

První vlastností je podpora pro takzvaný jemný scrolling (fine scrolling), který umožňuje posuny obrazu ve vertikálním směru s přesností na obrazový řádek a ve směru horizontálním s přesností na jeden či dva pixely (podle použitého režimu). Důležité je, že tento scrolling lze provádět bez nutnosti přesunu obrazových dat, což je v přímém kontrastu se scrollingem na PC (před zavedením karty VGA) či například se ZX Spectrem. A poslední vlastností ANTICu, s níž se dnes seznámíme, je možnost zúžit či naopak rozšířit herní scénu v horizontálním směru. Podporovány jsou šířky 128/160/192 pixelů v režimech s barvami resp. 256/320/384 pixelů v režimech monochromatických.

Jemný scrolling ovládaný řídicími registry čipu ANTIC a instrukcemi display listu

Již v úvodním článku o čipu ANTIC jsme si řekli, že se tento integrovaný obvod konfiguruje přes patnáct řídicích registrů. Těchto registrů je tedy mnohem méně, než je tomu v případě čipu GTIA (ten obsahuje registry pro ovládání PMG, kolizní registry, barvové registry atd.), ovšem na druhou stranu ANTIC využívá několik datových struktur uložených v paměti ROM nebo v operační paměti. Mezi tyto struktury patří především takzvaný display list a taktéž znaková sada (1024 bajtů neboli čtyři stránky paměti). Vraťme se však k řídicím registrům čipu ANTIC. Ty jsou vypsány v následující tabulce:

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

V dnešním článku nás budou zajímat především řídicí registry nazvané HSCROL a VSCROL. Jedná se o registry určené jen pro zápis, což je poněkud nepříjemné, protože není možné přečíst jejich obsah a modifikovat ho. Pro nás to bude znamenat jediné – údaj o horizontální a vertikálním posunu bude uložen v operační paměti a do registrů HSCROL a VSCROL bude zapisována jen pozměněná hodnota. Oba registry jsou sice osmibitové, ovšem význam mají pouze spodní čtyři bity, takže posun je možný o 0 až 15 jednotek v horizontálním a/nebo vertikálním směru.

Tyto dva řídicí registry jsou dostupné (pro zápis) na adresách 0×d4004 a 0×d4005. Obě adresy jsou dostupné i v assembleru CA65 ve formě symbolů HSCROL a VSCROL, ovšem samozřejmě pouze za předpokladu, že načteme soubor atari.inc:

ANTIC   = $D400               ;ANTIC area
 
HSCROL  = ANTIC + $04         ;horizontal scroll
VSCROL  = ANTIC + $05         ;vertical scroll

Kostra programu s realizací jemného horizontálního i vertikálního posunu řízeného joystickem

Všechny dnešní demonstrační příklady jsou založeny na stejném základě, ve kterém jsou využity jak makra assembleru, tak i několik subrutin. Kostra programu je tvořena subrutinou main, ve které se nachází jen volání čtyř maker (první tři z nich mají parametry):

; ---------------------------------------------------------------------
; vstupní bod do programu
; ---------------------------------------------------------------------
.proc main
        set_display_list dlist  ; nastavení display listu
        fill_screen screen      ; výpis znaků na obrazovku
        set_vbi_handler scroll  ; nastavení obsluhy VBI
        game_loop               ; hlavní herní smyčka
.endproc

Makro pro nastavení display listu jsme si již ukazovali minule, takže jen krátce: tomuto makru se předává návěští, na kterém začíná display list. Adresa display listu je assemblerem rozdělena na vyšší a nižší bajt. Tyto dvě hodnoty jsou uloženy do řídicích registrů SDLSTH a SDLSTH čipu ANTIC:

; ---------------------------------------------------------------------
; makro pro nastavení display listu
; ---------------------------------------------------------------------
.macro  set_display_list label
        lda #<label             ; nižší byte adresy display listu
        sta SDLSTL
        lda #>label             ; vyšší byte adresy display listu
        sta SDLSTH
.endmacro

Samotný display list zobrazí 24 řádků standardního textového režimu ANTIC 2 (GR.0):

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

Makro pro vyplnění (části) obrazovky je jednoduché. Předává se mu adresa prvního bajtu ve video RAM a makro provádí zápis do tří oblastí na obrazovce. V textovém režimu se zobrazí všech 128 znaků ATASCII ve třech opakujících se blocích:

; ---------------------------------------------------------------------
; makro pro vyplnění obrazovky znaky
; ---------------------------------------------------------------------
.macro  fill_screen screen
        .local clear            ; definice lokálního symbolu
        ldy #0                  ; počitadlo zápisů
clear:
        tya                     ; kód vypisovaného znaku
        sta screen, y           ; tisk znaku na zvolené místo na obrazovce
        sta screen+40*8, y
        sta screen+40*16, y
        iny                     ; zvětšit hodnotu počitadla a offsetu
        cpy #$80
        bne clear               ; skok
.endmacro

Následuje další makro, ve kterém se adresa subrutiny pro obsluhu VBI rozdělí na vyšší a nižší bajt. Následně se zavolá služba SETVBV, která handler (obslužnou subrutinu) zaregistruje:

; ---------------------------------------------------------------------
; makro pro nastavení VBI
; ---------------------------------------------------------------------
.macro  set_vbi_handler handler
        ; nastavit vektor pro odloženou VBI
        lda #7                  ; změna vektoru pro odložené VBI
        ldx #>handler
        ldy #<handler
        jsr SETVBV              ; zavolat službu systému pro nastavení vektoru
.endmacro

Makro s implementací herní smyčky pravděpodobně není nutné podrobně vysvětlovat, protože se jedná o prázdnou nekonečnou smyčku:

; ---------------------------------------------------------------------
; hlavní herní smyčka
; ---------------------------------------------------------------------
.macro  game_loop
        .local loop             ; definice lokálního symbolu
loop:
        jmp loop                ; program vlastně nice nedělá - jen cyklí!
.endmacro

Poslední část zdrojového kódu příkladu obsahuje definici subrutiny (podprogramu), který je volán v každém VBI. V kódu načítáme náklon joysticku a na základě toho, zda je joystick nakloněn doleva nebo doprava měníme obsah paměti na adrese x_scroll. Na konci VBI handleru se volá služba systému XITVBV:

; ---------------------------------------------------------------------
; subrutina pro obsluhu VBI
; ---------------------------------------------------------------------
.proc   scroll
        ldx x_scroll            ; 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 x_scroll            ; zapamatovat si pozici prvního hráče
        ; scrolling
        jmp XITVBV              ; zpracovat zbytek odloženého VBLANKu
.endproc

Výsledkem by měla být obrazovka s následujícím obsahem:

Obrazovka dnešního prvního demonstračního příkladu.

Obrázek 1: Obrazovka dnešního prvního demonstračního příkladu. 

Autor: tisnik, podle licence: Rights Managed

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

Ukažme si nyní pro úplnost celý zdrojový kód dnešního prvního demonstračního příkladu (ve kterém se ještě scrolling neprovádí):

.include "atari.inc"
 
.CODE
 
 
 
; ---------------------------------------------------------------------
; makro pro vyplnění obrazovky znaky
; ---------------------------------------------------------------------
.macro  fill_screen screen
        .local clear            ; definice lokálního symbolu
        ldy #0                  ; počitadlo zápisů
clear:
        tya                     ; kód vypisovaného znaku
        sta screen, y           ; tisk znaku na zvolené místo na obrazovce
        sta screen+40*8, y
        sta screen+40*16, y
        iny                     ; zvětšit hodnotu počitadla a offsetu
        cpy #$80
        bne clear               ; skok
.endmacro
 
 
; ---------------------------------------------------------------------
; makro pro nastavení display listu
; ---------------------------------------------------------------------
.macro  set_display_list label
        lda #<label             ; nižší byte adresy display listu
        sta SDLSTL
        lda #>label             ; vyšší byte adresy display listu
        sta SDLSTH
.endmacro
 
 
; ---------------------------------------------------------------------
; makro pro nastavení VBI
; ---------------------------------------------------------------------
.macro  set_vbi_handler handler
        ; nastavit vektor pro odloženou VBI
        lda #7                  ; změna vektoru pro odložené VBI
        ldx #>handler
        ldy #<handler
        jsr SETVBV              ; zavolat službu systému pro nastavení vektoru
.endmacro
 
 
; ---------------------------------------------------------------------
; hlavní herní smyčka
; ---------------------------------------------------------------------
.macro  game_loop
        .local loop             ; definice lokálního symbolu
loop:
        jmp loop                ; program vlastně nice nedělá - jen cyklí!
.endmacro
 
 
; ---------------------------------------------------------------------
; vstupní bod do programu
; ---------------------------------------------------------------------
.proc main
        set_display_list dlist  ; nastavení display listu
        fill_screen screen      ; výpis znaků na obrazovku
        set_vbi_handler scroll  ; nastavení obsluhy VBI
        game_loop               ; hlavní herní smyčka
.endproc
 
 
; ---------------------------------------------------------------------
; subrutina pro obsluhu VBI
; ---------------------------------------------------------------------
.proc   scroll
        ldx x_scroll            ; 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 x_scroll            ; zapamatovat si pozici prvního hráče
        ; scrolling
        jmp XITVBV              ; zpracovat zbytek odloženého VBLANKu
.endproc
 
 
dlist:
.byte DL_BLK8, DL_BLK8, DL_BLK8 ; 3x8=24 prázdných obrazových řádků
.byte DL_LMS+DL_CHR40x8x1       ; určení počáteční adresy obrazové paměti + jeden řádek režimu 2 (GR.0)
.byte <screen, >screen          ; počáteční adresa obrazové paměti 
.res 23, DL_CHR40x8x1           ; opakovat řádky textového režimu 2 (GR.0)
.byte DL_JVB, <dlist, >dlist    ; skok na začátek display listu
 
 
; horizontální scrolling
x_scroll:    .byte 0
 
end:
 
 
.BSS
screen: .res 40*24
 
.segment "EXEHDR"
.word   $ffff                   ; uvodni sekvence bajtu v souboru XEX
.word   main                    ; zacatek kodoveho segmentu
.word   end - 1                 ; konec kodoveho segmentu
 
 
.segment "AUTOSTRT"             ; segment s pocatecni adresou
.word   RUNAD                   ; naplni se pouze adresy RUNAD a RUNAD+1
.word   RUNAD+1
.word   main                    ; adresa vstupniho bodu do programu
 
; finito

Tisk hodnoty horizontálního a vertikálního offsetu řízeného joystickem

Abychom správně a do všech detailů pochopili, jak je vlastně jemný scrolling čipem ANTIC realizován, necháme si na obrazovce zobrazit stav proměnných (bajtů uložených v operační paměti), které obsahují jemný horizontální i vertikální posun. Důležité je, že rozsah hodnot posunu je omezen na 0 až 15, takže načtenou hodnotu instrukcí AND omezíme právě na tento rozsah. Navíc ještě předtím hodnotu vydělíme čtyřmi dvojicí posunů doprava (LSR). Proč tuto operaci provádíme? VBI je voláno 50× nebo 60× za sekundu (v závislosti na použité TV normě), což vlastně znamená, že po náklonu joysticku by se počitadla měnila velmi rychle. Vydělením čtyřmi vlastně frekvenci změn snížíme na úroveň, která je dobře zvládnutelná (člověk s průměrnou reakční dobou dokáže nastavit hodnotu přesně):

; ---------------------------------------------------------------------
; makro pro tisk jedné hexa číslice na určené místo na obrazovce
; ---------------------------------------------------------------------
.macro  print_hex address, screen, offset
        .local skip_add         ; definice lokálního symbolu
        lda address             ; načíst hodnotu, která se má vypsat
        lsr A                   ; 4x "zpomalení"
        lsr A
        and #15                 ; scrolling je jen v rozsahu 0-15
        cmp #$0a                ; test na hodnotu 0-9 nebo 10-15
        bcc skip_add            ; je to hodnota 0-9?
        adc #6                  ; pricist sedmicku (6+carry)
skip_add:
        adc #16                 ; prevod hodnoty na interni kod (ne ATASCII!)
        sta screen+offset
.endmacro

V subrutině volané při obsluze DLI budou měněny obě proměnné x_scrolly_scroll:

; ---------------------------------------------------------------------
; subrutina pro obsluhu VBI
; ---------------------------------------------------------------------
.proc   scroll
        lda STICK0              ; čtení joysticku
        cmp #11                 ; je nakloněn doleva?
        bne not_left
        dec x_scroll            ; změnit počitadlo horizontálního scrollingu
not_left:
        cmp #7                  ; je nakloněn doprava?
        bne not_right
        inc x_scroll            ; změnit počitadlo horizontálního scrollingu
not_right:
        cmp #14                 ; je nakloněn nahoru?
        bne not_up
        dec y_scroll            ; změnit počitadlo vertikálního scrollingu
not_up:
        cmp #13                 ; je nakloněn dolů?
        bne not_down
        inc y_scroll            ; změnit počitadlo vertikálního scrollingu
not_down:
        print_hex x_scroll, screen, 40*23
        print_hex y_scroll, screen, 40*23+2
        jmp XITVBV              ; zpracovat zbytek odloženého VBLANKu
.endproc

Jak je ze subrutiny patrné, provádí se i výpis obou proměnných, a to do levého spodního rohu obrazovky:

Výchozí stav příkladu: obě počitadla scrollingu jsou nulová.

Obrázek 2: Výchozí stav příkladu: obě počitadla scrollingu jsou nulová. 

Autor: tisnik, podle licence: Rights Managed

Změna stavu počitadel scrollingu pomocí joysticku.

Obrázek 3: Změna stavu počitadel scrollingu pomocí joysticku. 

Autor: tisnik, podle licence: Rights Managed

Maximální hodnoty počitadel mohou dosáhnout čísla 15.

Obrázek 4: Maximální hodnoty počitadel mohou dosáhnout čísla 15. 

Autor: tisnik, podle licence: Rights Managed

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

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

.include "atari.inc"
 
.CODE
 
 
 
; ---------------------------------------------------------------------
; makro pro vyplnění obrazovky znaky
; ---------------------------------------------------------------------
.macro  fill_screen screen
        .local clear            ; definice lokálního symbolu
        ldy #0                  ; počitadlo zápisů
clear:
        tya                     ; kód vypisovaného znaku
        sta screen, y           ; tisk znaku na zvolené místo na obrazovce
        sta screen+40*8, y
        sta screen+40*16, y
        iny                     ; zvětšit hodnotu počitadla a offsetu
        cpy #$80
        bne clear               ; skok
.endmacro
 
 
; ---------------------------------------------------------------------
; makro pro nastavení display listu
; ---------------------------------------------------------------------
.macro  set_display_list label
        lda #<label             ; nižší byte adresy display listu
        sta SDLSTL
        lda #>label             ; vyšší byte adresy display listu
        sta SDLSTH
.endmacro
 
 
; ---------------------------------------------------------------------
; makro pro nastavení VBI
; ---------------------------------------------------------------------
.macro  set_vbi_handler handler
        ; nastavit vektor pro odloženou VBI
        lda #7                  ; změna vektoru pro odložené VBI
        ldx #>handler
        ldy #<handler
        jsr SETVBV              ; zavolat službu systému pro nastavení vektoru
.endmacro
 
 
; ---------------------------------------------------------------------
; makro pro tisk jedné hexa číslice na určené místo na obrazovce
; ---------------------------------------------------------------------
.macro  print_hex address, screen, offset
        .local skip_add         ; definice lokálního symbolu
        lda address             ; načíst hodnotu, která se má vypsat
        lsr A                   ; 4x "zpomalení"
        lsr A
        and #15                 ; scrolling je jen v rozsahu 0-15
        cmp #$0a                ; test na hodnotu 0-9 nebo 10-15
        bcc skip_add            ; je to hodnota 0-9?
        adc #6                  ; pricist sedmicku (6+carry)
skip_add:
        adc #16                 ; prevod hodnoty na interni kod (ne ATASCII!)
        sta screen+offset
.endmacro
 
 
; ---------------------------------------------------------------------
; hlavní herní smyčka
; ---------------------------------------------------------------------
.macro  game_loop
        .local loop             ; definice lokálního symbolu
loop:
        jmp loop                ; program vlastně nice nedělá - jen cyklí!
.endmacro
 
 
; ---------------------------------------------------------------------
; vstupní bod do programu
; ---------------------------------------------------------------------
.proc main
        set_display_list dlist  ; nastavení display listu
        fill_screen screen      ; výpis znaků na obrazovku
        set_vbi_handler scroll  ; nastavení obsluhy VBI
        game_loop               ; hlavní herní smyčka
.endproc
 
 
; ---------------------------------------------------------------------
; subrutina pro obsluhu VBI
; ---------------------------------------------------------------------
.proc   scroll
        lda STICK0              ; čtení joysticku
        cmp #11                 ; je nakloněn doleva?
        bne not_left
        dec x_scroll            ; změnit počitadlo horizontálního scrollingu
not_left:
        cmp #7                  ; je nakloněn doprava?
        bne not_right
        inc x_scroll            ; změnit počitadlo horizontálního scrollingu
not_right:
        cmp #14                 ; je nakloněn nahoru?
        bne not_up
        dec y_scroll            ; změnit počitadlo vertikálního scrollingu
not_up:
        cmp #13                 ; je nakloněn dolů?
        bne not_down
        inc y_scroll            ; změnit počitadlo vertikálního scrollingu
not_down:
        print_hex x_scroll, screen, 40*23
        print_hex y_scroll, screen, 40*23+2
        jmp XITVBV              ; zpracovat zbytek odloženého VBLANKu
.endproc
 
 
dlist:
.byte DL_BLK8, DL_BLK8, DL_BLK8 ; 3x8=24 prázdných obrazových řádků
.byte DL_LMS+DL_CHR40x8x1       ; určení počáteční adresy obrazové paměti + jeden řádek režimu 2 (GR.0)
.byte <screen, >screen          ; počáteční adresa obrazové paměti 
.res 23, DL_CHR40x8x1           ; opakovat řádky textového režimu 2 (GR.0)
.byte DL_JVB, <dlist, >dlist    ; skok na začátek display listu
 
 
; horizontální scrolling
x_scroll:    .byte 0
 
; vertikální scrolling
y_scroll:    .byte 0
 
end:
 
 
.BSS
screen: .res 40*24
 
.segment "EXEHDR"
.word   $ffff                   ; uvodni sekvence bajtu v souboru XEX
.word   main                    ; zacatek kodoveho segmentu
.word   end - 1                 ; konec kodoveho segmentu
 
 
.segment "AUTOSTRT"             ; segment s pocatecni adresou
.word   RUNAD                   ; naplni se pouze adresy RUNAD a RUNAD+1
.word   RUNAD+1
.word   main                    ; adresa vstupniho bodu do programu
 
; finito

Nastavení řádků v display listu pro povolení vertikálního scrollingu

Vertikální scrolling není obecně prováděn s celou obrazovkou, ale pouze s těmi řádky, u nichž je v display listu nastaven příznak DL_VSCROL. To tedy znamená, že můžeme na běžné textové obrazovce v režimu ANTIC 2 (GR.0) vybrat například jen sedm řádků, které budou scrollovat. Takový display list může vypadat například následovně:

dlist:
.byte DL_BLK8, DL_BLK8, DL_BLK8 ; 3x8=24 prázdných obrazových řádků
.byte DL_LMS+DL_CHR40x8x1       ; určení počáteční adresy obrazové paměti + jeden řádek režimu 2 (GR.0)
.byte <screen, >screen          ; počáteční adresa obrazové paměti 
.res 11, DL_CHR40x8x1           ; opakovat řádky textového režimu 2 (GR.0)
.res 7,  DL_VSCROL+DL_CHR40x8x1 ; zde bude povolen scrolling
.res 5,  DL_CHR40x8x1           ; opakovat řádky textového režimu 2 (GR.0)
.byte DL_JVB, <dlist, >dlist    ; skok na začátek display listu
Poznámka: to je důvod, proč i u scrollujících her můžeme vidět řádky se skóre/životy atd., proč hra Dropzone dokáže zobrazit „radar“ s herním světem atd. Ostatně s display listem této hry se dnes seznámíme.

Jemný vertikální scrolling řízený joystickem

V dalším kroku upravíme subrutinu volanou pro obsluhu VBI takovým způsobem, že se na základě hodnoty uložené do proměnné y_scroll provede jemný vertikální scrolling. Hodnotu z proměnné musíme vydělit čtyřmi (aby to odpovídalo hodnotě vytištěné na obrazovce) a výsledek uložíme do řídicího registru VSCROL čipu ANTIC. To je vše – jediná instrukce zápisu způsobí scrolling, a to bez nutnosti „pálit“ další strojový čas:

; ---------------------------------------------------------------------
; subrutina pro obsluhu VBI
; ---------------------------------------------------------------------
.proc   scroll
        lda STICK0              ; čtení joysticku
        cmp #11                 ; je nakloněn doleva?
        bne not_left
        dec x_scroll            ; změnit počitadlo horizontálního scrollingu
not_left:
        cmp #7                  ; je nakloněn doprava?
        bne not_right
        inc x_scroll            ; změnit počitadlo horizontálního scrollingu
not_right:
        cmp #14                 ; je nakloněn nahoru?
        bne not_up
        dec y_scroll            ; změnit počitadlo vertikálního scrollingu
not_up:
        cmp #13                 ; je nakloněn dolů?
        bne not_down
        inc y_scroll            ; změnit počitadlo vertikálního scrollingu
not_down:
        lda y_scroll            ; změna vertikálního posunu
        lsr A                   ; 4x "zpomalení"
        lsr A
        sta VSCROL              ; zápis do řídicího registru ANTICu
 
        print_hex x_scroll, screen, 40*23
        print_hex y_scroll, screen, 40*23+2
        jmp XITVBV              ; zpracovat zbytek odloženého VBLANKu
.endproc
Poznámka: jak je z kódu asi patrné, není subrutina nijak optimalizována. Například ono zmiňované dělení čtyřmi je provedeno dvakrát za sebou atd. Celý kód v assembleru si tedy později zaslouží ruční optimalizaci.

Výsledek (zpomalená animace):

Vertikální scrolling.

Autor: tisnik, podle licence: Rights Managed

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

Opět si ukažme úplný zdrojový kód příkladu, který byl popsán v předchozím textu:

.include "atari.inc"
 
.CODE
 
 
 
; ---------------------------------------------------------------------
; makro pro vyplnění obrazovky znaky
; ---------------------------------------------------------------------
.macro  fill_screen screen
        .local clear            ; definice lokálního symbolu
        ldy #0                  ; počitadlo zápisů
clear:
        tya                     ; kód vypisovaného znaku
        sta screen, y           ; tisk znaku na zvolené místo na obrazovce
        sta screen+40*8, y
        sta screen+40*16, y
        iny                     ; zvětšit hodnotu počitadla a offsetu
        cpy #$80
        bne clear               ; skok
.endmacro
 
 
; ---------------------------------------------------------------------
; makro pro nastavení display listu
; ---------------------------------------------------------------------
.macro  set_display_list label
        lda #<label             ; nižší byte adresy display listu
        sta SDLSTL
        lda #>label             ; vyšší byte adresy display listu
        sta SDLSTH
.endmacro
 
 
; ---------------------------------------------------------------------
; makro pro nastavení VBI
; ---------------------------------------------------------------------
.macro  set_vbi_handler handler
        ; nastavit vektor pro odloženou VBI
        lda #7                  ; změna vektoru pro odložené VBI
        ldx #>handler
        ldy #<handler
        jsr SETVBV              ; zavolat službu systému pro nastavení vektoru
.endmacro
 
 
; ---------------------------------------------------------------------
; makro pro tisk jedné hexa číslice na určené místo na obrazovce
; ---------------------------------------------------------------------
.macro  print_hex address, screen, offset
        .local skip_add         ; definice lokálního symbolu
        lda address             ; načíst hodnotu, která se má vypsat
        lsr A                   ; 4x "zpomalení"
        lsr A
        and #15                 ; scrolling je jen v rozsahu 0-15
        cmp #$0a                ; test na hodnotu 0-9 nebo 10-15
        bcc skip_add            ; je to hodnota 0-9?
        adc #6                  ; pricist sedmicku (6+carry)
skip_add:
        adc #16                 ; prevod hodnoty na interni kod (ne ATASCII!)
        sta screen+offset
.endmacro
 
 
; ---------------------------------------------------------------------
; hlavní herní smyčka
; ---------------------------------------------------------------------
.macro  game_loop
        .local loop             ; definice lokálního symbolu
loop:
        jmp loop                ; program vlastně nice nedělá - jen cyklí!
.endmacro
 
 
; ---------------------------------------------------------------------
; vstupní bod do programu
; ---------------------------------------------------------------------
.proc main
        set_display_list dlist  ; nastavení display listu
        fill_screen screen      ; výpis znaků na obrazovku
        set_vbi_handler scroll  ; nastavení obsluhy VBI
        game_loop               ; hlavní herní smyčka
.endproc
 
 
; ---------------------------------------------------------------------
; subrutina pro obsluhu VBI
; ---------------------------------------------------------------------
.proc   scroll
        lda STICK0              ; čtení joysticku
        cmp #11                 ; je nakloněn doleva?
        bne not_left
        dec x_scroll            ; změnit počitadlo horizontálního scrollingu
not_left:
        cmp #7                  ; je nakloněn doprava?
        bne not_right
        inc x_scroll            ; změnit počitadlo horizontálního scrollingu
not_right:
        cmp #14                 ; je nakloněn nahoru?
        bne not_up
        dec y_scroll            ; změnit počitadlo vertikálního scrollingu
not_up:
        cmp #13                 ; je nakloněn dolů?
        bne not_down
        inc y_scroll            ; změnit počitadlo vertikálního scrollingu
not_down:
        lda y_scroll            ; změna vertikálního posunu
        lsr A                   ; 4x "zpomalení"
        lsr A
        sta VSCROL              ; zápis do řídicího registru ANTICu
 
        print_hex x_scroll, screen, 40*23
        print_hex y_scroll, screen, 40*23+2
        jmp XITVBV              ; zpracovat zbytek odloženého VBLANKu
.endproc
 
 
dlist:
.byte DL_BLK8, DL_BLK8, DL_BLK8 ; 3x8=24 prázdných obrazových řádků
.byte DL_LMS+DL_CHR40x8x1       ; určení počáteční adresy obrazové paměti + jeden řádek režimu 2 (GR.0)
.byte <screen, >screen          ; počáteční adresa obrazové paměti 
.res 11, DL_CHR40x8x1           ; opakovat řádky textového režimu 2 (GR.0)
.res 7,  DL_VSCROL+DL_CHR40x8x1 ; zde bude povolen scrolling
.res 5,  DL_CHR40x8x1           ; opakovat řádky textového režimu 2 (GR.0)
.byte DL_JVB, <dlist, >dlist    ; skok na začátek display listu
 
 
; horizontální scrolling
x_scroll:    .byte 0
 
; vertikální scrolling
y_scroll:    .byte 0
 
end:
 
 
.BSS
screen: .res 40*24
 
.segment "EXEHDR"
.word   $ffff                   ; uvodni sekvence bajtu v souboru XEX
.word   main                    ; zacatek kodoveho segmentu
.word   end - 1                 ; konec kodoveho segmentu
 
 
.segment "AUTOSTRT"             ; segment s pocatecni adresou
.word   RUNAD                   ; naplni se pouze adresy RUNAD a RUNAD+1
.word   RUNAD+1
.word   main                    ; adresa vstupniho bodu do programu
 
; finito

Podrobnější pohled na stav obsah obrazovky při scrollingu

Důležité je pochopit, jak vlastně vertikální scrolling pracuje. Čip ANTIC pracuje tak, že u všech logických řádků display listu s nastaveným bitem DL_VSCROL změní načasování zobrazení obrazových řádků – zobrazení je posunuto právě o hodnotu uloženou v registru VSCROL. Příkladem je standardní textový režim ANTIC 2 (GR.0), ve kterém se každý logický řádek zobrazí na osmi obrazových řádcích – jinými slovy má každý znak výšku osmi obrazových řádků. A hodnota VSCROL (ideálně v rozsahu 0–7) dokáže u všech textových řádků s nastaveným DL_VSCROL provést posun těchto textových řádků nahoru o 0 až 7 obrazových řádků. U prvního scrollovaného řádku tedy může dojít k vynechání několika televizních řádků (písmenům budou chybět vršky). Celá oblast řádků s nastaveným DL_VSCROL se bude chovat jako jediný blok.

Vertikální scrolling o 0 obrazových řádků.

Obrázek 5: Vertikální posun o 0 obrazových řádků.

Autor: tisnik, podle licence: Rights Managed

Ovšem jak se chová obrazovka pod touto oblastí, tedy na dalším textovém/grafickém řádku bez nastaveného příznaku DL_VSCROL? Tento řádek je využit jako buffer, ve kterém ANTIC sesynchronizuje další řádky, které se již posouvat nebudou. To je patrné na obrázcích před a za tímto odstavcem: počitadla posunu jsou stále zobrazena na stejném místě, i když oblast nad nimi byla posunuta.

Vertikální scrolling o 7 obrazových řádků.

Obrázek 6: Vertikální posun o 7 obrazových řádků.

Autor: tisnik, podle licence: Rights Managed

Standardní textový režim má znaky vysoké osm obrazových řádků, ovšem hodnota VSCROL může nabývat hodnot 0 až 15. V tomto případě hodnoty větší než 7 „donutí“ ANTIC zobrazit další textový řádek a scrolling se pokazí. To znamená, že v tomto režimu má smysl omezit scrolling jen na hodnoty 0–7:

Vertikální scrolling o 8 obrazových řádků.

Obrázek 7: Vertikální posun o 8 obrazových řádků.

Autor: tisnik, podle licence: Rights Managed

Vertikální scrolling o 15 obrazových řádků.

Obrázek 8: Vertikální posun o 15 obrazových řádků.

Autor: tisnik, podle licence: Rights Managed

Modifikace display listu: současný jemný horizontální i vertikální scrolling

V dalším kroku provedeme úpravu display listu, a to konkrétně takovým způsobem, že pro šest textových řádků v dolní polovině obrazovky povolíme jak horizontální, tak i vertikální scrolling. Je to ve skutečnosti snadné, jak je ostatně patrné ze zdrojového kódu s definicí display listu:

dlist:
.byte DL_BLK8, DL_BLK8, DL_BLK8 ; 3x8=24 prázdných obrazových řádků
.byte DL_LMS+DL_CHR40x8x1       ; určení počáteční adresy obrazové paměti + jeden řádek režimu 2 (GR.0)
.byte <screen, >screen          ; počáteční adresa obrazové paměti 
.res 11, DL_CHR40x8x1           ; opakovat řádky textového režimu 2 (GR.0)
.res 6,  DL_HSCROL+DL_VSCROL+DL_CHR40x8x1 ; zde bude povolen scrolling
.res 6,  DL_CHR40x8x1           ; opakovat řádky textového režimu 2 (GR.0)
.byte DL_JVB, <dlist, >dlist    ; skok na začátek display listu

Řízení horizontálního i vertikálního scrollingu joystickem

Pochopitelně budeme muset pozměnit i subrutinu volanou pro obsluhu VBI. V této subrutině budeme nastavovat jak řídicí registr VSCROL, tak nově i HSCROL:

; ---------------------------------------------------------------------
; subrutina pro obsluhu VBI
; ---------------------------------------------------------------------
.proc   scroll
        lda STICK0              ; čtení joysticku
        cmp #11                 ; je nakloněn doleva?
        bne not_left
        dec x_scroll            ; změnit počitadlo horizontálního scrollingu
not_left:
        cmp #7                  ; je nakloněn doprava?
        bne not_right
        inc x_scroll            ; změnit počitadlo horizontálního scrollingu
not_right:
        cmp #14                 ; je nakloněn nahoru?
        bne not_up
        dec y_scroll            ; změnit počitadlo vertikálního scrollingu
not_up:
        cmp #13                 ; je nakloněn dolů?
        bne not_down
        inc y_scroll            ; změnit počitadlo vertikálního scrollingu
not_down:
        lda x_scroll            ; změna horizontálního posunu
        lsr A                   ; 4x "zpomalení"
        lsr A
        sta HSCROL              ; zápis do řídicího registru ANTICu
 
        lda y_scroll            ; změna vertikálního posunu
        lsr A                   ; 4x "zpomalení"
        lsr A
        sta VSCROL              ; zápis do řídicího registru ANTICu
 
        print_hex x_scroll, screen, 40*23
        print_hex y_scroll, screen, 40*23+2
        jmp XITVBV              ; zpracovat zbytek odloženého VBLANKu
.endproc

Samozřejmě nás bude zajímat, jak budou vypadat výsledné obrazovky pro různé horizontální posuny:

Horizontální scrolling o 0 barvových cyklů.

Obrázek 9: Horizontální posun o 0 barvových cyklů.

Autor: tisnik, podle licence: Rights Managed

Horizontální scrolling o 2 barvové cykly.

Obrázek 10: Horizontální posun o 2 barvové cykly.

Autor: tisnik, podle licence: Rights Managed

Horizontální scrolling o 10 barvových cyklů.

Obrázek 11: Horizontální posun o 10 barvových cyklů.

Autor: tisnik, podle licence: Rights Managed

Horizontální scrolling o 15 barvových cyklů.

Obrázek 12: Horizontální posun o 15 barvových cyklů.

Autor: tisnik, podle licence: Rights Managed

Tyto obrazovky mohou být to značné míry matoucí, protože například počitadla scrollingu se již nenachází v levém horním rohu, ale na zcela jiném místě. Je tomu tak z toho důvodu, že v případě, že je povolený horizontální scrolling, přepne čip ANTIC šířku řádků tak, jakoby se jednalo o široké herní pole a s horizontálním rozlišením 384 pixelů (48 znaků), což pozměňuje význam ukazatele použitého při čtení dat z video RAM. To je téma, kterému se budeme věnovat v navazujících kapitolách.

Horizontální posun je prováděn zpožděním vykreslení pixelů o 0 až 15 barvových cyklů, což v monochromatických režimech znamená o 0 až 30 pixelů (násobí se dvěma, každý pixel je široký 1/2 obrazového cyklu). Prakticky jsme v jednotlivých režimech (teoreticky) omezeni takto:

ANTIC GR.x HSCROL Poznámka
2 0 0–3 výchozí textový režim
3 × 0–3 textový režim s vyššími znaky
4 12 0–3 pětibarevný textový režim, znaky jsou široké 4 pixely
5 13 0–3 pětibarevný textový režim, znaky jsou široké 4 pixely
6 1 0–7 znaky s dvojnásobnou šířkou
7 2 0–7 znaky s dvojnásobnou šířkou
Poznámka: teoreticky je pochopitelně možné využít posun až do hodnoty 15, ale v praxi postačují posuny o šířku jediného znaku.

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

Celý zdrojový kód dnešního čtvrtého (předposledního) demonstračního příkladu vypadá takto:

.include "atari.inc"
 
.CODE
 
 
 
; ---------------------------------------------------------------------
; makro pro vyplnění obrazovky znaky
; ---------------------------------------------------------------------
.macro  fill_screen screen
        .local clear            ; definice lokálního symbolu
        ldy #0                  ; počitadlo zápisů
clear:
        tya                     ; kód vypisovaného znaku
        sta screen, y           ; tisk znaku na zvolené místo na obrazovce
        sta screen+40*8, y
        sta screen+40*16, y
        iny                     ; zvětšit hodnotu počitadla a offsetu
        cpy #$80
        bne clear               ; skok
.endmacro
 
 
; ---------------------------------------------------------------------
; makro pro nastavení display listu
; ---------------------------------------------------------------------
.macro  set_display_list label
        lda #<label             ; nižší byte adresy display listu
        sta SDLSTL
        lda #>label             ; vyšší byte adresy display listu
        sta SDLSTH
.endmacro
 
 
; ---------------------------------------------------------------------
; makro pro nastavení VBI
; ---------------------------------------------------------------------
.macro  set_vbi_handler handler
        ; nastavit vektor pro odloženou VBI
        lda #7                  ; změna vektoru pro odložené VBI
        ldx #>handler
        ldy #<handler
        jsr SETVBV              ; zavolat službu systému pro nastavení vektoru
.endmacro
 
 
; ---------------------------------------------------------------------
; makro pro tisk jedné hexa číslice na určené místo na obrazovce
; ---------------------------------------------------------------------
.macro  print_hex address, screen, offset
        .local skip_add         ; definice lokálního symbolu
        lda address             ; načíst hodnotu, která se má vypsat
        lsr A                   ; 4x "zpomalení"
        lsr A
        and #15                 ; scrolling je jen v rozsahu 0-15
        cmp #$0a                ; test na hodnotu 0-9 nebo 10-15
        bcc skip_add            ; je to hodnota 0-9?
        adc #6                  ; pricist sedmicku (6+carry)
skip_add:
        adc #16                 ; prevod hodnoty na interni kod (ne ATASCII!)
        sta screen+offset
.endmacro
 
 
; ---------------------------------------------------------------------
; hlavní herní smyčka
; ---------------------------------------------------------------------
.macro  game_loop
        .local loop             ; definice lokálního symbolu
loop:
        jmp loop                ; program vlastně nice nedělá - jen cyklí!
.endmacro
 
 
; ---------------------------------------------------------------------
; vstupní bod do programu
; ---------------------------------------------------------------------
.proc main
        set_display_list dlist  ; nastavení display listu
        fill_screen screen      ; výpis znaků na obrazovku
        set_vbi_handler scroll  ; nastavení obsluhy VBI
        game_loop               ; hlavní herní smyčka
.endproc
 
 
; ---------------------------------------------------------------------
; subrutina pro obsluhu VBI
; ---------------------------------------------------------------------
.proc   scroll
        lda STICK0              ; čtení joysticku
        cmp #11                 ; je nakloněn doleva?
        bne not_left
        dec x_scroll            ; změnit počitadlo horizontálního scrollingu
not_left:
        cmp #7                  ; je nakloněn doprava?
        bne not_right
        inc x_scroll            ; změnit počitadlo horizontálního scrollingu
not_right:
        cmp #14                 ; je nakloněn nahoru?
        bne not_up
        dec y_scroll            ; změnit počitadlo vertikálního scrollingu
not_up:
        cmp #13                 ; je nakloněn dolů?
        bne not_down
        inc y_scroll            ; změnit počitadlo vertikálního scrollingu
not_down:
        lda x_scroll            ; změna horizontálního posunu
        lsr A                   ; 4x "zpomalení"
        lsr A
        sta HSCROL              ; zápis do řídicího registru ANTICu

        lda y_scroll            ; změna vertikálního posunu
        lsr A                   ; 4x "zpomalení"
        lsr A
        sta VSCROL              ; zápis do řídicího registru ANTICu
 
        print_hex x_scroll, screen, 40*23
        print_hex y_scroll, screen, 40*23+2
        jmp XITVBV              ; zpracovat zbytek odloženého VBLANKu
.endproc
 
 
dlist:
.byte DL_BLK8, DL_BLK8, DL_BLK8 ; 3x8=24 prázdných obrazových řádků
.byte DL_LMS+DL_CHR40x8x1       ; určení počáteční adresy obrazové paměti + jeden řádek režimu 2 (GR.0)
.byte <screen, >screen          ; počáteční adresa obrazové paměti 
.res 11, DL_CHR40x8x1           ; opakovat řádky textového režimu 2 (GR.0)
.res 6,  DL_HSCROL+DL_VSCROL+DL_CHR40x8x1 ; zde bude povolen scrolling
.res 6,  DL_CHR40x8x1           ; opakovat řádky textového režimu 2 (GR.0)
.byte DL_JVB, <dlist, >dlist    ; skok na začátek display listu
 
 
; horizontální scrolling
x_scroll:    .byte 0
 
; vertikální scrolling
y_scroll:    .byte 0
 
end:
 
 
.BSS
screen: .res 40*24
 
.segment "EXEHDR"
.word   $ffff                   ; uvodni sekvence bajtu v souboru XEX
.word   main                    ; zacatek kodoveho segmentu
.word   end - 1                 ; konec kodoveho segmentu
 
 
.segment "AUTOSTRT"             ; segment s pocatecni adresou
.word   RUNAD                   ; naplni se pouze adresy RUNAD a RUNAD+1
.word   RUNAD+1
.word   main                    ; adresa vstupniho bodu do programu
 
; finito

Specifikace šířky herního pole

Už v předchozím demonstračním příkladu jsme mohli vidět jednu zajímavou vlastnost čipu ANTIC. Víme již, že výška zobrazené scény je řízena display listem a tak je možné namísto de facto standardních 192 obrazových řádků zobrazit až přibližně 224 řádků (v závislosti na televizoru atd.). Šířka scény odpovídá podle použitého režimu 40 znakům resp. 160 popř. 320 pixelům (což ve všech případech odpovídá 160 barvovým cyklům – color cycles). Ovšem i tuto šířku je možné modifikovat, a to konkrétně modifikací spodních dvou bitů řídicího registru DMACTL:

Bity v DMACTL Šířka v barevných režimech Šířka v mono režimech Znaků/řádek (GR.0)
00 vypnuto vypnuto vypnuto
01 128 256 32
10 160 320 40
11 192 384 48

A jak vypadá obrazovka v praxi? Ukážeme si to na trojici screenshotů:

Úzké herní pole.

Obrázek 13: Úzké herní pole 32 znaků.

Autor: tisnik, podle licence: Rights Managed

Standardně široké herní pole.

Obrázek 14: Normální herní pole 40 znaků.

Autor: tisnik, podle licence: Rights Managed

Široké herní pole.

Obrázek 15: Široké herní pole 48 znaků.

Autor: tisnik, podle licence: Rights Managed

Poznámka: povšimněte si zalomení znaků v případě úzkého či naopak širokého herního pole.

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

Pátý a dnes již poslední demonstrační příklad vypadá následovně:

.include "atari.inc"
 
.CODE
 
 
 
; ---------------------------------------------------------------------
; makro pro vyplnění obrazovky znaky
; ---------------------------------------------------------------------
.macro  fill_screen screen
        .local clear            ; definice lokálního symbolu
        ldy #0                  ; počitadlo zápisů
clear:
        tya                     ; kód vypisovaného znaku
        sta screen, y           ; tisk znaku na zvolené místo na obrazovce
        sta screen+40*8, y
        sta screen+40*16, y
        iny                     ; zvětšit hodnotu počitadla a offsetu
        cpy #$80
        bne clear               ; skok
.endmacro
 
 
; ---------------------------------------------------------------------
; makro pro nastavení display listu
; ---------------------------------------------------------------------
.macro  set_display_list label
        lda #<label             ; nižší byte adresy display listu
        sta SDLSTL
        lda #>label             ; vyšší byte adresy display listu
        sta SDLSTH
.endmacro
 
 
; ---------------------------------------------------------------------
; nastavení spodních dvou bitů stínového registru SDMCTL
; ---------------------------------------------------------------------
.macro  set_playfield_width bitfield
        lda SDMCTL              ; načíst stínový registr
        and #%11111100          ; vynulovat spodní dva bity
        ora  bitfield           ; nastavit spodní dva bity na zvolenou masku
        sta SDMCTL              ; a uložit zpět
.endmacro
 
 
; ---------------------------------------------------------------------
; hlavní herní smyčka
; ---------------------------------------------------------------------
.macro  game_loop
        .local loop             ; definice lokálního symbolu
loop:
        jmp loop                ; program vlastně nice nedělá - jen cyklí!
.endmacro
 
 
; ---------------------------------------------------------------------
; vstupní bod do programu
; ---------------------------------------------------------------------
.proc main
        set_display_list dlist  ; nastavení display listu
        fill_screen screen      ; výpis znaků na obrazovku
 
        jsr get_key             ; čekání na stisk klávesy
 
        set_playfield_width #%00
        jsr get_key             ; čekání na stisk klávesy
 
        set_playfield_width #%01
        jsr get_key             ; čekání na stisk klávesy
 
        set_playfield_width #%10
        jsr get_key             ; čekání na stisk klávesy
 
        set_playfield_width #%11
 
        game_loop               ; hlavní herní smyčka
.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_CHR40x8x1       ; určení počáteční adresy obrazové paměti + jeden řádek režimu 2 (GR.0)
.byte <screen, >screen          ; počáteční adresa obrazové paměti 
.res 23, DL_CHR40x8x1           ; opakovat řádky textového režimu 2 (GR.0)
.byte DL_JVB, <dlist, >dlist    ; skok na začátek display listu
 
 
end:
 
 
.BSS
screen: .res 40*24
 
.segment "EXEHDR"
.word   $ffff                   ; uvodni sekvence bajtu v souboru XEX
.word   main                    ; zacatek kodoveho segmentu
.word   end - 1                 ; konec kodoveho segmentu
 
 
.segment "AUTOSTRT"             ; segment s pocatecni adresou
.word   RUNAD                   ; naplni se pouze adresy RUNAD a RUNAD+1
.word   RUNAD+1
.word   main                    ; adresa vstupniho bodu do programu
 
; finito

Ukázky display listů použitých v reálných hrách

Nyní již máme k dispozici dostatek informací k tomu, abychom pochopili display listy použité u mnoha klasických ataráckých her. V této kapitole i v kapitole navazující si vždycky ukážeme výpis display listu a následně i screenshot ze hry, která tento display list používá.

Poznámka: na tomto místě bych rád poděkoval Milanovi Vančurovi, který věnoval svůj čas přípravě display listů a vedl/vede podnětnou diskuzi o všech oblastech osmibitových Atari. Moc díky!

Slavná hra Preliminary Monty pracuje celá v textovém režimu ANTIC 4 (GR.12) s 40×24 znaky a pěti barvami. Každý textový řádek vyvolává DLI, scrolling není použit:

1F00: 3x 8 BLANK
1F03: LMS 3800 MODE 4
1F06: 23x DLI MODE 4
1F1D: MODE 4
1F1E: JVB 1F00
Preliminary Monty.

 Obrázek 16: Druhá nejvyšší úroveň pyramidy ve hře Preliminary Monty.

Autor: tisnik, podle licence: Rights Managed

Ve hře Nekonečný příběh se kombinuje grafický režim s režimem textovým. Konkrétně můžeme vidět osmdesát řádků v grafickém režimu ANTIC E (GR.15) se čtyřmi barvami a horizontálním rozlišením 160 pixelů (grafické řádky jsou vysoké jeden pixel, tj. vertikálně se jedná o nejjemnější grafiku). Poslední grafický řádek vyvolá DLI. Následuje patnáct řádků ve standardním textovém režimu ANTIC 2 (GR.0). Ani zde se nepoužívá scrolling:

0300: 2x 8 BLANK
0302: 4 BLANK
0303: LMS F000 MODE E
0306: 78x MODE E
0354: DLI MODE E
0355: LMS FC80 MODE 2
0358: 14x MODE 2
0366: JVB 0300
Nekonečný příběh.

 Obrázek 17: Nekonečný příběh.

Autor: tisnik, podle licence: Rights Managed

Display list úvodní obrazovky hry Collosus Chess obsahuje zajímavé instrukce. Nejprve je použitý textový režim s pěti barvami (ANTIC 4, GR.12) pro zobrazení jména hry. Následují prázdné řádky uprostřed obrazovky a poté dalších několik textových řádků. Pro zobrazení jmen autorů je použit textový režim ANTIC 6 (GR.1) se znaky s dvojitou šířkou. Ze statického obrázku to sice není patrné, ale poslední (textový) řádek scrolluje – obsahuje kdysi tak obvyklý „nekonečný řádek“ A jak je z display listu patrné, využívá tento scrollující řádek standardní textový režim ANTIC 2 (GR.0) doplněný o příznak HSCROLL:

17A3: 4x 8 BLANK
17A7: DLI 8 BLANK
17A8: LMS 17C8 MODE 4
17AB: 7x MODE 4
17B2: 2x 8 BLANK
17B4: 5x MODE 4
17B9: 4x 8 BLANK
17BD: LMS 19D0 MODE 6
17C0: 2x 8 BLANK
17C2: LMS 1A10 HSCROL MODE 2
17C5: JVB 17A3
Colossus chess.

 Obrázek 18: Úvodní obrazovka hry Colossus Chess.  

Autor: tisnik, podle licence: Rights Managed

Ve hře Mr.Robot dochází ke kombinaci textového režimu ANTIC 6 (GR.1) se širokými znaky (řádek s nadpisem a skóre) a režimu ANTIC 4 (GR.12) s pětibarevnými znaky. I zde se používá DLI, dokonce na každém textovém řádku herní plochy. V DLI se nastavují barvy plošinek atd.:

9E3F: 3x 8 BLANK
9E42: LMS 9D69 MODE 6
9E45: 3 BLANK
9E46: MODE 6
9E47: 3 BLANK
9E48: 8 BLANK
9E49: DLI 8 BLANK
9E4A: DLI LMS 4804 MODE 4
9E4D: 19x DLI MODE 4
9E60: JVB 9E3F
Mr.Robot and his Robot Factory.

 Obrázek 19: Mr. Robot and his Robot Factory. 

Autor: tisnik, podle licence: Rights Managed

V další známé hře Alley Cat (konkrétně v úvodní obrazovce) se střídají režimy ANTIC 6 (GR.1) se čtyřbarevnými širokými znaky a režim ANTIC 4 (GR.12) s pětibarevnou grafikou. A zcela dole je neomylně vidět standardní textový režim ANTIC 2 (GR.0) obsazující dva řádky. I zde se často používá DLI:

5AEF: 2x 8 BLANK
5AF1: 4 BLANK
5AF2: LMS 4600 MODE 6
5AF5: 4x MODE 6
5AF9: DLI MODE 6
5AFA: 8 BLANK
5AFB: DLI MODE 6
5AFC: 3x MODE 6
5AFF: DLI 4 BLANK
5B00: 8 BLANK
5B01: LMS 5238 MODE 4
5B04: 9x MODE 4
5B0D: DLI 2 BLANK
5B0E: MODE 2
5B0F: 4 BLANK
5B10: LMS 5C16 MODE 2
5B13: JVB 5AEF
Úvodní obrazovka hry Alley Cat.

 Obrázek 20: Úvodní obrazovka hry Alley Cat.

Autor: tisnik, podle licence: Rights Managed

Vrtulník či letadlo byly sice velmi oblíbenými dopravními a bojovými prostředky v mnoha střílečkách (viz výše zmíněná hra Fort Apocalypse, Protector a série Blue Max), ovšem nesmíme zapomenout ani na jiné typy zbraní. Příkladem velmi dobře promyšlené střílečky kombinované s bludišťovkou je hra Zeppelin pocházející z roku 1983, jejímž autorem je William Mataga. Jak již název napovídá, je hlavním „hrdinou“ v této hře řiditelná vzducholoď vybavená kanónem střílejícím do osmi směrů i bombami. Tato střílečka má poměrně rozsáhlý dvourozměrný herní svět; jakousi jeskyni, v níž se nachází nepřátelské balóny, vzducholodě i létající miny. Jedná se o střílečku s horizontálním i vertikálním scrollingem, která je zvláštní jak po grafické stránce, tak i po stránce ovládání – vzducholoď je sice možné v určité míře ovládat (v prostoru jedné obrazovky), ovšem hlavní směr pohybu je předem daný (naskriptovaný) a lze ho ovlivnit jen nepřímo volbou letové trasy. Úkolem hráče je postupně otevřít průchody do dalších levelů, k čemuž slouží klíče, nálože s TNT atd.

Celá hra plynule scrolluje jak horizontálně, tak i vertikálně, což je ostatně patrné i při pohledu do jejího display listu. Šířka řádků je nastavena na 48 znaků a používá se asi nejlepší herní režim osmibitových Atari: ANTIC 4 (GR.12). A co je ještě zajímavé – na začátku nejsou zobrazeny prázdné řádky, herní scéna začíná co nejvýše je to fyzicky možné:

25B5: LMS 7950 VSCROL HSCROL MODE 4
25B8: LMS 7980 VSCROL HSCROL MODE 4
25BB: LMS 79B0 VSCROL HSCROL MODE 4
25BE: LMS 79E0 VSCROL HSCROL MODE 4
25C1: LMS 7A10 VSCROL HSCROL MODE 4
25C4: LMS 7A40 VSCROL HSCROL MODE 4
25C7: LMS 7A70 VSCROL HSCROL MODE 4
25CA: LMS 7AA0 VSCROL HSCROL MODE 4
25CD: LMS 7AD0 VSCROL HSCROL MODE 4
25D0: LMS 7620 VSCROL HSCROL MODE 4
25D3: LMS 7650 VSCROL HSCROL MODE 4
25D6: LMS 7680 VSCROL HSCROL MODE 4
25D9: LMS 76B0 VSCROL HSCROL MODE 4
25DC: LMS 76E0 VSCROL HSCROL MODE 4
25DF: LMS 7710 VSCROL HSCROL MODE 4
25E2: LMS 7740 VSCROL HSCROL MODE 4
25E5: LMS 7770 VSCROL HSCROL MODE 4
25E8: LMS 77A0 VSCROL HSCROL MODE 4
25EB: LMS 77D0 VSCROL HSCROL MODE 4
25EE: LMS 7800 VSCROL HSCROL MODE 4
25F1: LMS 7830 VSCROL HSCROL MODE 4
25F4: LMS 7860 VSCROL HSCROL MODE 4
25F7: LMS 7890 VSCROL HSCROL MODE 4
25FA: LMS 78C0 VSCROL HSCROL MODE 4
25FD: LMS 78F0 HSCROL MODE 4
2600: DLI 2 BLANK
2601: LMS 24E5 MODE 4
2604: 2x MODE 4
2606: JVB 25B5
Šestá úroveň hry Zeppelin (ovšem úrovně se počítají od 7 do 1).

 Obrázek 21: Šestá úroveň hry Zeppelin (tato hra ovšem čísluje úrovně od 7 do 1).

Autor: tisnik, podle licence: Rights Managed

Poznámka: toto je oblíbená autorova hra!

Komplikovanější display listy áčkových her

Zajímavé bude zjistit i to, jak vypadají display listy u těch her, které mají či měly vysoké hodnocení.

Slavnou hru Bruce Lee pravděpodobně není zapotřebí čtenářům představovat. Display list této hry je zajímavý, protože se zde kombinuje standardní textový režim ANTIC 2 (GR.0) použitý pro zobrazení skóre a počtu životů s režimy vícebarevnými. První textový řádek je oddělen od herního pole prázdnými řádky. A samotná herní scéna využívá (překvapivě!) pětibarevný textový režim ANTIC 5 (GR.13) s dvojnásobně vysokými řádky. To znamená, že herní scéna má relativně malé rozlišení, což je patrné na lampionech a později na „žebřících“. Dále si povšimněte poměrně velkého množství řádků, na kterých je vyvoláno DLI (první DLI dokážou vykreslit hory odlišnou barvou, než jaká je použita ve zbytku scény atd.):

0EF1: 2x 8 BLANK
0EF3: 5 BLANK
0EF4: 2x 3 BLANK
0EF6: 2 BLANK
0EF7: 1 BLANK
0EF8: DLI LMS 78D5 MODE 2
0EFB: DLI 2 BLANK
0EFC: 2x MODE 5
0EFE: DLI MODE 5
0EFF: MODE 5
0F00: DLI MODE 5
0F01: 4x MODE 5
0F05: DLI MODE 5
0F06: MODE 5
0F07: JVB 0EF1
Slavný Bruce Lee.

 Obrázek 22: První obrazovka slavné hry Bruce Lee.

Autor: tisnik, podle licence: Rights Managed

Poznámka: zde můžeme vidět důkaz, že aby byla hra úspěšná, nemusí mít v žádném případě to nejlepší rozlišení ani nejvyšší počet barev.

Velmi známou hrou je i Dropzone. Tato hra využívá jemný horizontální scrolling (možná vůbec nejlepší, co je na osmibitových Atari vidět). A vzhledem k tomu, že celá herní scéna je široká „nudle“, pravděpodobně nebude překvapením, že prakticky na každém řádku musel být upraven začátek obrazové paměti. Hra poměrně unikátním způsobem kombinuje režimy ANTIC 4 (pětibarevný textový režim s herní scénou) a ANTIC E (čtyřbarevný grafický režim pro zobrazení „radaru“). Většina řádků má povolený scrolling:

84D0: 2x 8 BLANK
84D2: DLI 1 BLANK
84D3: 2 BLANK
84D4: LMS 0824 HSCROL MODE 4
84D7: LMS 0924 HSCROL MODE 4
84DA: LMS 0A24 HSCROL MODE 4
84DD: LMS 0B24 HSCROL MODE 4
84E0: DLI LMS 0C24 HSCROL MODE 4
84E3: LMS 0D24 HSCROL MODE 4
84E6: LMS 0E24 HSCROL MODE 4
84E9: LMS 0F24 HSCROL MODE 4
84EC: LMS 1024 HSCROL MODE 4
84EF: DLI LMS 1124 HSCROL MODE 4
84F2: LMS 1224 HSCROL MODE 4
84F5: LMS 1324 HSCROL MODE 4
84F8: LMS 1424 HSCROL MODE 4
84FB: LMS 1524 HSCROL MODE 4
84FE: LMS 1624 HSCROL MODE 4
8501: DLI LMS 1724 HSCROL MODE 4
8504: LMS 9424 HSCROL MODE E
8507: LMS 9524 HSCROL MODE E
850A: LMS 9624 HSCROL MODE E
850D: LMS 9724 HSCROL MODE E
8510: LMS 9824 HSCROL MODE E
8513: LMS 9924 HSCROL MODE E
8516: LMS 9A24 HSCROL MODE E
8519: LMS 9B24 HSCROL MODE E
851C: LMS 9C24 HSCROL MODE E
851F: DLI LMS 9D24 HSCROL MODE E
8522: LMS 9E24 HSCROL MODE E
8525: LMS 9F24 HSCROL MODE E
8528: LMS A024 HSCROL MODE E
852B: LMS A124 HSCROL MODE E
852E: LMS A224 HSCROL MODE E
8531: LMS A324 HSCROL MODE E
8534: LMS A424 HSCROL MODE E
8537: LMS A524 HSCROL MODE E
853A: DLI LMS A624 HSCROL MODE E
853D: LMS A724 HSCROL MODE E
8540: LMS A824 HSCROL MODE E
8543: LMS A924 HSCROL MODE E
8546: LMS AA24 HSCROL MODE E
8549: LMS AB24 HSCROL MODE E
854C: LMS AC24 HSCROL MODE E
854F: LMS AD24 HSCROL MODE E
8552: LMS AE24 HSCROL MODE E
8555: LMS AF24 HSCROL MODE E
8558: LMS B024 HSCROL MODE E
855B: LMS B124 HSCROL MODE E
855E: LMS B224 HSCROL MODE E
8561: 1 BLANK
8562: DLI 1 BLANK
8563: 2 BLANK
8564: DLI LMS 0700 MODE 4
8567: 1 BLANK
8568: LMS 1800 MODE E
856B: 1 BLANK
856C: LMS 1898 HSCROL MODE 4
856F: DLI LMS 1918 HSCROL MODE 4
8572: DLI LMS 1998 HSCROL MODE 4
8575: 1 BLANK
8576: LMS 1800 MODE E
8579: JVB 84D0
Dropzone.

 Obrázek 23: Dropzone. 

Autor: tisnik, podle licence: Rights Managed

Dále se podíváme na další slavnou hru, konkrétně na International Karate. V této hře je zkombinován grafický režim ANTIC E (čtyři barvy, horizontální rozlišení 160 pixelů) v horní části obrazovky se statickým obrázkem. Samotná hra se odehrává v režimu ANTIC 4 (GR.12) a zcela nahoře se nachází dva pětibarevné textové řádky (skóre atd.). Velké množství instrukcí s DLI naznačuje změny barev ve statickém obrázku (zde je skutečně více než čtyři barvy). A největší magie se odehrává při animaci obou hráčů; kombinují se zde možnosti textového režimu se sprity:

6260: 8 BLANK
6261: 5 BLANK
6262: DLI LMS 61C0 MODE 4
6265: DLI MODE 4
6266: DLI 1 BLANK
6267: 1 BLANK
6268: LMS B000 MODE E
626B: 62x MODE E
62A9: 2x DLI MODE E
62AB: 8x MODE E
62B3: 2x DLI MODE E
62B5: 10x MODE E
62BF: 2x DLI MODE E
62C1: 8x MODE E
62C9: 2x DLI MODE E
62CB: MODE E
62CC: LMS 0800 MODE 4
62CF: 10x MODE 4
62D9: DLI MODE 4
62DA: DLI LMS 0E27 MODE E
62DD: DLI LMS 0A40 MODE 4
62E0: DLI LMS 0E27 MODE E
62E3: LMS 0E27 MODE E
62E6: JVB 6260
International Karate.

Obrázek 24: International Karate. 

Autor: tisnik, podle licence: Rights Managed

A konečně nesmíme zapomenout ani na slavný Boulder Dash, který na osmibitových domácích počítačích Atari využívá jemný scrolling do všech stran. Textové řádky v pětibarevném režimu jsou široké 80 znaků, tj. jedná se o dvojnásobek šířky obrazovky, což přesně odpovídá velikosti herní scény (alespoň v první úrovni Boulder Dashe II). Zajímavé je, že řádek se skóre, životy atd. taktéž využívá režim ANTIC 4 (vždycky jsem si z nějakého důvodu myslel, že je to ANTIC 6):

911D: 3x 8 BLANK
9120: DLI LMS 257C MODE 4
9123: LMS 1028 VSCROL HSCROL MODE 4
9126: LMS 1078 VSCROL HSCROL MODE 4
9129: LMS 10C8 VSCROL HSCROL MODE 4
912C: LMS 1118 VSCROL HSCROL MODE 4
912F: LMS 1168 VSCROL HSCROL MODE 4
9132: LMS 11B8 VSCROL HSCROL MODE 4
9135: LMS 1208 VSCROL HSCROL MODE 4
9138: LMS 1258 VSCROL HSCROL MODE 4
913B: LMS 12A8 VSCROL HSCROL MODE 4
913E: LMS 12F8 VSCROL HSCROL MODE 4
9141: LMS 1348 VSCROL HSCROL MODE 4
9144: LMS 1398 VSCROL HSCROL MODE 4
9147: LMS 13E8 VSCROL HSCROL MODE 4
914A: LMS 1438 VSCROL HSCROL MODE 4
914D: LMS 1488 VSCROL HSCROL MODE 4
9150: LMS 14D8 VSCROL HSCROL MODE 4
9153: LMS 1528 VSCROL HSCROL MODE 4
9156: LMS 1578 VSCROL HSCROL MODE 4
9159: LMS 15C8 VSCROL HSCROL MODE 4
915C: LMS 1618 VSCROL HSCROL MODE 4
915F: LMS 1668 VSCROL HSCROL MODE 4
9162: LMS 16B8 VSCROL HSCROL MODE 4
9165: LMS 1708 VSCROL HSCROL MODE 4
9168: LMS 1758 HSCROL MODE 4
916B: JVB 911D
První úroveň ve hře Boulder Dash II.

 Obrázek 25: První úroveň hry Boulder Dash II. 

Autor: tisnik, podle licence: Rights Managed

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

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

Školení Kubernetes

execs := dummy.xex print_a.xex \
         background_color_1.xex  background_color_2.xex \
         color_computation_1.xex color_computation_2.xex \
         subroutine_1.xex        subroutine_2.xex \
         hex_number_1.xex        hex_number_2.xex \
         hex_number_3.xex        hex_number_4.xex \
         hex_number_5.xex        hex_number_6.xex \
         hex_number_7.xex        hex_number_8.xex \
         hex_number_9.xex \
         fill_block_1.xex        fill_block_2.xex \
         fill_block_3.xex        fill_block_4.xex \
         fill_block_5.xex \
         pmg_01.xex              pmg_02.xex \
         pmg_03.xex              pmg_04.xex \
         pmg_05.xex              pmg_06.xex \
         pmg_07.xex              pmg_08.xex \
         pmg_09.xex              pmg_10.xex \
         pmg_11.xex              pmg_12.xex \
         pmg_13.xex              pmg_14.xex \
         pmg_15.xex              pong.xex \
         pmg_stick_1.xex         pmg_stick_2.xex \
         pmg_stick_3.xex         pmg_stick_4.xex \
         pmg_stick_5.xex         pmg_stick_6.xex \
         pmg_collisions_1.xex    pmg_collisions_2.xex \
         pmg_collisions_3.xex    pmg_collisions_4.xex \
         antic_1.xex             antic_2.xex \
         antic_3.xex             antic_4.xex \
         antic_5.xex             antic_6.xex \
         antic_7.xex             antic_8.xex \
         antic_9.xex             antic_A.xex \
         antic_B.xex \
         antic_bitmap_1.xex      antic_bitmap_2.xex \
         antic_bitmap_3.xex      antic_bitmap_4.xex \
         antic_bitmap_5.xex      antic_bitmap_6.xex \
         antic_bitmap_7.xex      antic_bitmap_8.xex \
         antic_dli_1.asm         antic_dli_2.asm \
         antic_dli_3.asm         antic_dli_4.asm \
         antic_dli_5.asm         antic_dli_pmg.asm
 
all: $(execs)
 
clean:
        rm -f *.o
        rm -f *.xex
 
.PHONY: all clean
 
%.o: %.asm
        ca65 $< -t atari -o $@ -l $(basename $<)_list.asm --list-bytes 100
 
%.xex: %.o
        ld65 -C linker.cfg $< -o $@ -m $(basename $<).map
 
antic_bitmap_6.xex:     antic_bitmap_6.o
        ld65 -C linker_image.cfg $< -o $@ -m $(basename $<).map
 
antic_bitmap_7.xex:     antic_bitmap_7.o
        ld65 -C linker_image_2.cfg $< -o $@ -m $(basename $<).map
 
antic:  \
         antic_1.xex \
         antic_2.xex \
         antic_3.xex \
         antic_4.xex \
         antic_5.xex \
         antic_6.xex \
         antic_7.xex \
         antic_8.xex \
         antic_9.xex \
         antic_A.xex \
         antic_B.xex
 
antic_bitmap:   \
        antic_bitmap_1.xex \
        antic_bitmap_2.xex \
        antic_bitmap_3.xex \
        antic_bitmap_4.xex \
        antic_bitmap_5.xex \
        antic_bitmap_6.xex \
        antic_bitmap_7.xex \
        antic_bitmap_8.xex
 
antic_dli:      \
        antic_dli_1.xex \
        antic_dli_2.xex \
        antic_dli_3.xex \
        antic_dli_4.xex \
        antic_dli_5.xex \
        antic_dli_pmg.xex
 
antic_vbi:      \
        antic_vbi_1.xex \
        antic_vbi_2.xex \
        antic_vbi_3.xex \
        antic_vbi_dli_1.xex \
        antic_vbi_dli_2.xex \
        antic_vbi_dli_3.xex \
        antic_vbi_dli_4.xex
 
antic_scrolling:        \
        antic_scrolling_1.xex \
        antic_scrolling_2.xex \
        antic_scrolling_3.xex \
        antic_scrolling_4.xex

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

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
Neutrální ikona do widgetu na odběr článků ze seriálů

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

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


Autor článku

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



Nejnovější články