Před několika týdny se mi ozvali milí lidé z WDC. Pokud nevíte, co je WDC, tak dovolte stručnou exkurzi: WDC, neboli Western Design Center, založil v roce 1978 Bill Mensch, bývalý zaměstnanec MOS Technology a spoluvlastník patentu na procesor 6502.

WDC začala vyrábět tento procesor a další odvozené verze, například 65C02S – vylepšenou CMOS verzi se statickým jádrem, nebo právě 65C816, což je hybridní procesor, který dokáže pracovat jednak v módu klasické 6502, ale umí se přepnout do „nativního“ módu, kde může mít akumulátor 16 bitů namísto osmi, totéž indexové registry a registr SP. Šířka adresové sběrnice u tohoto procesoru je 24 bitů, procesor tedy dokáže přímo adresovat 16 MB paměti. „Zero page“ už není nutně stránka 0, ale vyšší část adresy je uložena v registru DP (podobně jako u procesoru 6809). Podobně jsou v procesoru i dva osmibitové registry DB a PB (data bank / program bank), které udržují informace o nejvyšších bitech adresy pro přístup k datům či programu. Přibyly adresní módy, přibyly některé instrukce, například pro blokový přesun dat, přibyla podpora matematického koprocesoru atd.

65C816 byl použit v některých zajímavých strojích, jmenovitě třeba Apple IIgs, Nintendo SNES, nebo v rozšíření SuperCPU, které bude důvěrně známé majitelům Commodorů.

[sc:ebay item=“W65C816S8P“]

No a právě z WDC mi napsali, jestli by třeba nešlo přidat podporu tohoto procesoru do ASM80, a ideálně i nějaké další funkce. No, proč ne, že? Takže jako první krok naší spolupráce jsem vytvořil první testovací verzi assembleru pro tento procesor.

Hybridní podstata procesoru si vyžádala přidání několika direktiv, které určují, jestli se pracuje s šestnáctibitovým akumulátorem či indexy. Samotné přepnutí módu se děje pomocí speciálních instrukcí procesoru, ale je potřeba assembleru říct, jak má překládat nějaký kód, protože věc se má tak, že například kód A9 01 0A je interpretována odlišně podle toho, jakou šířku má zrovna akumulátor. Při šestnáctibitovém akumulátoru je to instrukce LDA #$0A01, tedy načtení konstanty 0A01 do akumulátoru. Pokud je akumulátor osmibitový, jde o dvě instrukce: LDA #$01 a ASL. Nápad, že jeden operační kód má různou délku instrukce podle vnitřního nastavení není příliš šťastný (nechci si ani představovat, jaké peklo bude, až budu psát disassembler), ale co už… Každopádně ty direktivy jsou:

Direktiva Význam
.m8 Předpokládá se osmibitový akumulátor
.m16 Předpokládá se šestnáctibitový akumulátor
.x8 Osmibitové indexregistry
.x16 Šestnáctibitové indexregistry

 

Podpora tohoto procesoru je zatím ve stadiu „early beta“, takže zatím není ani v plném IDE, pouze jako ASM65816 single page assembler. Můžete jej vyzkoušet, otestovat a případné chyby hlašte na asm80@maly.cz

Díky a hezké svátky!