Tento článek se zabývá jedním z nejvlivnějších mikroprocesorů historie, MOS Technology 6502, a jeho moderním programováním pomocí nástroje ACME Cross-Assembler. Tato kombinace představuje most mezi zlatou érou 8bitových počítačů a současným vývojem retro softwaru (tzv. homebrew a demoscene).
MOS Technology 6502 je 8bitový mikroprocesor navržený týmem Chucka Peddla v roce 1975. Ve své době způsobil tržní šok svou cenou 25 USD, zatímco konkurenční Intel 8080 nebo Motorola 6800 stály téměř desetkrát tolik. Tato nízká cena umožnila vznik osobních počítačů pro masy.
Tento čip (nebo jeho varianty) poháněl systémy jako Apple I & II, Commodore 64, Atari 2600, NES (Nintendo) a BBC Micro.
Procesor 6502 je navržen jako akumulátorově orientovaný procesor s velmi malým počtem registrů. To zjednodušuje hardware čipu (méně tranzistorů), ale klade vyšší nároky na programátora a efektivní práci s pamětí.
Srdcem procesoru je ALU (Arithmetic Logic Unit), která provádí sčítání, odčítání, logické operace (AND, ORA, EOR) a posuny bitů. ALU je propojena s Registry a vnitřní datovou sběrnicí.
Ačkoliv je 6502 často považován za jednoduchý procesor, využívá primitivní formu pipeliningu. Zatímco se jedna instrukce vykonává, procesor již načítá (Fetch) další instrukci z paměti. Díky tomu je 6502 taktovaný na 1 MHz výkonnostně srovnatelný s procesorem Intel 8080 nebo Zilog Z80 taktovaným na 2–4 MHz.
| Registr | Zkratka | Velikost | Funkce |
|---|---|---|---|
| Akumulátor | A | 8-bit | Primární registr pro veškerou matematiku a logiku. |
| Index X | X | 8-bit | Počítadlo smyček, ofset pro adresování paměti. |
| Index Y | Y | 8-bit | Podobný jako X, klíčový pro „Indirect Indexed“ adresování. |
| Stack Pointer | SP | 8-bit | Ukazuje na vrchol zásobníku. Zásobník je „hard-wired“ na stránku $01 ($0100-$01FF). |
| Program Counter | PC | 16-bit | Ukazatel na aktuálně vykonávanou instrukci. |
| Status Register | P / SR | 8-bit | Obsahuje příznaky (Flags) výsledků operací. |
Tento registr je klíčový pro větvení programu (instrukce `BNE`, `BEQ`, `BCC` atd.). Každý bit má svůj význam:
| Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 |
|---|---|---|---|---|---|---|---|
| N | V | - | B | D | I | Z | C |
| Negative | Overflow | (Unused) | Break | Decimal | Interrupt | Zero | Carry |
Procesor reaguje na vnější události pomocí přerušení. Adresy obslužných rutin (vektory) jsou uloženy na samém konci paměti:
ACME (Advanced Cross Macro Assembler) je multiplatformní nástroj, který umožňuje psát kód pro procesory rodiny 6502 na moderních operačních systémech (Windows, Linux, macOS). Výstupem je binární soubor spustitelný na emulátoru nebo reálném historickém hardwaru.
Díky podpoře maker a flexibilní syntaxi je ACME standardem v Commodore 64 demo scéně.
ACME nevnucuje pevnou strukturu, ale využívá „pseudo-opkódy“ (preprocesorové direktivy) začínající vykřičníkem.
<code asm> ; Příklad definice konstant a paměti !to „output.prg“, cbm ; Cílový soubor * = $0801 ; Počáteční adresa (Origin)
; Definice maker pro čitelnost !macro SetBorderColor .color {
lda #.color sta $d020
} </code >
Následující kód demonstruje sílu 6502 ve spojení s ACME. Vytvoříme efekt stabilního „raster baru“ synchronizovaného s vykreslováním obrazu.
<code asm> ;
; ACME Assembler Source: Stable Raster Interrupt ; Platforma: Commodore 64 ;
!to „raster.prg“, cbm
;— Basic Bootstrap ($0801) — * = $0801 !byte $0b, $08, $0a, $00, $9e, $32, $30, $36, $34, $00, $00, $00 ; To odpovídá „10 SYS 2064“
;— Hlavní program — * = $0810
Init:
sei ; Vypnout přerušení lda #$7f sta $dc0d ; Vypnout CIA přerušení lda $dc0d ; Potvrdit vypnutí
lda #$01 sta $d01a ; Zapnout raster interrupt na VIC-II
lda #$80 ; Číslo řádku, kde chceme přerušení (128) sta $d012 lda $d011 ; Vymazání 9. bitu rasteru (pro řádky < 255) and #$7f sta $d011
lda #<IRQ_Handler ; Nastavení vektoru přerušení (Low byte) sta $0314 lda #>IRQ_Handler ; High byte sta $0315
cli ; Povolit přerušení jmp * ; Nekonečná smyčka (CPU čeká na přerušení)
;— Obsluha přerušení (Interrupt Routine) — IRQ_Handler:
; Uložit registry dělá C64 KERNAL automaticky, ale zde ; přepisujeme standardní rutinu, tak musíme potvrdit IRQ. lsr $d019 ; Potvrzení přerušení (Acknowledge)
; Samotný efekt inc $d020 ; Změna barvy rámečku ldx #$0f ; Čekací smyčka pro viditelnost pruhu
.wait:
dex bne .wait dec $d020 ; Vrátit barvu zpět
; Skok na standardní systémovou rutinu (pro klávesnici atd.) jmp $ea31
</code >
Všechny použité obrázky pocházejí z Wikimedia Commons a jsou volně šiřitelné:
Kategorie: Hardware, Programování, Assembler, Retro Computing