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ů.
ja to hral poprve na Atari800XE, paradni hratelna zalezitost. jinak H.E.R.O. = Helicopter Equipped Rescue Operation. viz http://en.wikipedia.org/wiki/H.E.R.O.
jdu nastartovat emulator ;)
a velmi pekny serial, vsetky jeho casti pravidelne citam a chyba mi iba
jedno, ze to nemam ako knihu (aspon v PDF).
A teda mam otazku na redakciu, alebo autora, nebudu sa jednotlive seriali casom
vydavat ako PDF ? alebo ked to vsetko raz skonci, nebude z toho jedna velka PDF
kniha ? velmi rad by som mal nieco podobne v zbierke
Moc dík za super článek, udělal velkou radost. Atari 2600 mám dodneška doma, takže schéma se určitě zhodí. Tak mě napadá, neexistuje (alespoň ve schématu) funkční redukce mezi klasickým yoistickem a portem pro tuto herní konzoli? Rád bych si jej ještě zprovoznil, ale původní yoisticky jsou v totálně dezolátním stavu…
Ahoj, jestli myslíš klasické (digitální) joysticky, tak ty by měly být AFAIK úplně stejně zapojené, jako na dalších Atárkách i Commodorech, tj. čtyři „tlačítka“ pro směry + 1 fire. Takže by měl stačit jakýkoli joystick z těchto počítačů, ideálně s mikrospínači. Ale asi máš na mysli převodník „analogových“ joysticků na Atarácké že?
Ještě se k Atari 2600 dodávaly paddle, což je pouze dvojice potenciometrů (přesný rozsah nevím, používal jsem kdysi dávno potenciometry ze starých televizí, ale ty byly nelineární) doplněná o jedno tlačítko.
Kdesi jsem se dočetl že Atari měly 1MΩ a Commodore 500 kΩ, zapojení konektoru je třeba tady.
Jo pravda, to jsem pak také zjistil když jsem ho vyráběl a sháněl potenciometry :-D Mimochodem, osobní dotaz, to vtech má či nemá něco společného s touhle firmou?
Já jsem si toho Vítka myslel, ale obávám se že byli první, tu firmu založili v Hong Kongu už v roce 1976. Ještě od nich mám Socrates, ten používal grafický čip z TI-99, hádám že se tu o něm ještě dočteme :)
Možná by se víc než převodník hodilo něco stylovějšího, nebo rovnou zásuvková krabice s pěti zvonkovými tlačítky, to by byla skutečná atmosféra osmdesátých let ;-) Jeden takový tu mám, budu ho muset konečně nafotit a šoupnout na net…
Taky se jeste misto tlacitek (ja jsem pouzival ty z vlacku – 6 tlacitek vedle sebe) dala vybrakovat stara Skodovka a vzit si packu na blinkry – ta mela taky ctyri smery a dokonce jeste sla zatlacit dovnitr :-) Nj. to byly casy, kdy jsem i konektor na BT-100 vyrabel podomacku, protoze tehdejsi Tesla Eltos sice neco podobneho v nabidce mela (bezny konektor DB-9), ale tak 50 kusu pro cele Brno…
Nepochopil jsem výrok, že Sinclairy neuměly grafický režim. Ony ho uměly, neuměly textový režim. Jediné omezení bylo v tom, že ta grafika byla v zásadě dvoubarevná, přičemž ty dvě barvy byly pro každý čtvereček 8×8 nastavitelné z pevně dané osmibarevné palety (s volitelným blikáním a zvýrazněním jasu, dohromady 1 bajt atributů).
Máta pravdu, to je slavná grafika Spectra, tu popíšu příště.
Dneska jsem popisoval ZX80/ZX81, ten skutečně uměl jen pseudografiku, což je pochopitelné, protože by se do standardního 1kB RAM framebuffer nevešel (i když se pamět dala rozšířit na tuším až 16 kB). Speccy se svými 48 kB už bylo o jednu generaci dál, tam nebyl problém mít framebuffer 256×192 (bitová mapa) + 32×24 (atributová mapa) řízený ULou.
(jestli jsem tedy v nějaké větě náhodou napsal jen Sinclair, byla tím myšlena ZX80/81, ale mám dojem, že jsem poctivě všude psal i model – jestli ne, tak se omlouvám)
Pripomenulo mi to dve veci z mojej ZX Spectrum „kariéry“: