Doufám, že se seriál dotkne i framebufferu ZX Spectra (a klonů). Jeho velmi netradiční pojetí (prohození horní trojice bitů spodního bajtu adresy s dolní trojicí horního bajtů adresy) snad nikdo, kromě samotných autorů nepochopil. Jestli to byla chyba v návrhu ULA (a oprava byla v té době neúměrně drahá), nebo to mělo jiný záměr?
Každopádně záhada století.
To HUA: POKE 16384,170
Nevím, jak to bylo na ZX80, ale na ZX spectru, když se CPU motal adresami mezi 16384 a 32767, tak mu ULA vypínala hodiny, když zrovna potřebovala kreslit obrázek. Strašně dlouho jsem nemohl přijít na to, proč můj speedloader funguje bez problému od adresy 4e4 a po přesunu do tiskového bufferu na 23296 z něj lezly úplně divné tóny a samozřejmě nefungoval.
Na ZX80 a ZX81 se o vlastni zobrazovani dokonce staral do znacne miry samotny procesor :-). Pro ZX80 bylo typicke blikani obrazovky – kdyz se CPU zabyvala necim jinym, obraz proste nebyl. Na ZX81 prislo vylepseni – v Basicu byly 2 rezimy – FAST a SLOW. V rezimu FAST „zhasinala“ obrazovka a vypocty byly rychlejsi. V rezimu SLOW se cas CPU delil mezi uzivatelsky program a zobrazovaci system – vypocty apod. tak byly pochopitelne pomalejsi, ale obrazovka neblikala. Firma Sinclair – to byli mistri jak z minima dostat maximum. Nejen podle meho nazoru tyto veci vymysleli vynikajici inzenyri.
Vida. ZX Spectrum jsem měl docela dlouho, ale nikdy jsem si nevšiml, že by přístup do paměti na těchto adresách byl pomalejší.
Zajímalo by mne, jestli to emulátory poskytující reálnou emulaci
(jako byl kdysi známy Gutterovský emulátor pro DOS … jenž k nám distribuoval tehdejší JIMAZ… od něhož mám i zdrojáky… emuloval i poměrné délky trvání instrukcí)
nejak emulují i tento efekt..
Do jaké hloubky ? No přece co nejvíce :) Zajímavé jsou hlavně různé hacky hw, kdy se sw vytvářelo něco, co podle specifikace „nešlo“. Jak na ZX (multicolor) tak na C64 (sprite multiplexy, renderovani do borderu atd.) I když ZX znám, zajímavé jsou pro mne spíš ostatní platformy, kdy si člověk přečte něco nového.
Záměr to mělo úplně jednoduchý – zrychlení výpisu znaku na obrazovku. Spectrum totiž nemá přepínání textových a grafických režimů jako jiné (mnohem dražší) mikropočítače, ale jede stále v grafickém, takže kazdé písmenko se musí na obrazovku „namalovat“. Například to 16384 je adresa prvního bytu znaku v levém hormím ruhu, druhý byte měl adresu o 256 vyšší, třetí o dalších 256… Prostě stačilo jedinou jednobytovou instrukcí přičítat jedničku k hornímu byte adresy, na kterou se mělo zapisovat, což spotřebovalo čtyři takty procesoru, na rozdíl od šestnáctibitového sčítání dvou dvouregistrů, které by trvalo třikrát déle a zabíralo o dva registry (ze sedmi) více.
Tohle jsem věděl, ale přišlo mi to, jako kanón na vrabce. Je ale možný že kdyby se to dělal stylem
LD (HL),A
ADD HL,BC //BC=32
namísto
LD (HL),A
INC H
První řešení je možná opravdu pomalejší (a žravější na registry) (i když v jedné tabulce teď čtu, že obě instrukce zaberou 8 taktů, tak nevím)
Zase komplikovanější byk výpočet počáteční adresy (a když se k tomu příchaly atributy,…)
To zdanlive nelogicke usporadani videopameti melo duvod hlavne v tom, ze to zjednodusilo logiku uvnitr ULA, ktera sahala do osmice DRAM 4116. Samotna rychlost vykreslovani znaku procesorem duvodem ani tak nebyla – ten byl ve zjednoduseni systemu, ktery obsah videopameti posilal na obrazovku. Pochopitelne pro programatora grafickych rutin to pak byla obcas trochu pakarna, nez si zvykl. Ale kdyz to clovek takrikajic dostal pod kuzi, ani mu to neprislo… Ma ZX Spectra (48gumak, 48plus, 128) jsou stale funkcni, hec. Pred 2 lety jsem pouze vymenil membrany v klavesnicich – vyrobila mne je na zakazku jedna ochotna firma :-)
Přitom to počítání příští pozice je jen to INC D, žádný volný registr už ani nezbyl, leda by se použila druhá sada :) Ono to na pohled vypadá strašně, ale hraničí to s genialitou, jako mnoho podobných řešení na Spectru, třeba těch pár odporů zdánlivě nelogicky umístěných na datové sběrnici udělá práci za několik čipů.
Zde bude během osmi průchodů smyčkou proveden tisk znaku.
0BB7 PR-ALL-4 EX AF,AF’ Uschovej CY flag v registru F'.
LD A,(DE) Vyzvedni stávající mikrořádek.
AND B Použij masku pro OVER a výsledek
XOR (HL) XORuj s mikrořádkem.
XOR C Proveď XOR také s maskou pro INVERSE
LD (DE),A a vlož na cílovou adresu.
EX AF,AF’ Vyzvedni CY flag
JR C,#0BD3,PR-ALL-6 a skoč, je-li nastaven pro tiskárnu.
INC D Uprav cílovou adresu.
0BC1 PR-ALL-5 INC HL Posuň se na další řádek zdrojové matice.
DEC A Zmenši čítač
JR NZ,#0BB7,PR-ALL-4 a skoč zpět, pokud není nulový.
EX DE,HL HL musí obsahovat
DEC H správnou vyšší adresu znakové oblasti.
BIT 1,(IY+1) (FLAGS) Při obsluze obrazovky
CALL Z,#0BDB,PO-ATTR nastav příslušný bajt atributů.