Obrazovku tvoril pomocny obvod ULA, jedine co to zatezovalo z pohledu behu programu byly pristupy do pameti, takze cely druhy 16kB blok pameti (prvni cast byla VRAM) byl malinko "pomalejsi". Rozdil se dal poznat tak ze kdyz se do toho bloku pameti ulozila tabulka preruseni, tak na obrazovce zacalo "snezit" protoze ULA nekdy nedostala data z VRAM.
Na Atari800 myslim CPU delal i obycejny obraz, casto se pak jeste pridali radkova preruseni po vykresleni urciteho radku na zmenu spritu/barev (u ZX preruseni na konci radku neexistovalo, programy si samy pocitali pocet taktu procesoru a kde se nachazi vykreslovaci paprsek na TV), a samotny program pak jel o dost pomaleji oproti tomu kdyz se vypnulo zobrazovani. Na C64 urcite sli delat taky radkova preruseni, ale nevim jak se generoval obycejny obraz.
Nene, z tohoto hlediska je na tom Speccy a Atarko velmi podobne - cteni pixelu pro zobrazovani nedelal CPU, ale jiny obvod. Ovsem v pripade Atarka se graficky koprocesor (Antic) prihlasoval o sbernici tak, ze poslal signal HALT, procesor se zastavil a ANTIC si v klidu precetl co potreboval. Proto cim "vetsi" graficky rezim se pouzil (GR.8, GR.15), tim vice casu CPU stravil v rezimu HALT. Maximalni zpozdeni bylo cca 30%.
Speccy na tom bylo podobne - pristup do spodni RAM byl pomalejsi, ale mozna to nebylo az o 30%, ale min.
Co si pamatuji, tak C64 jel na necelem 1MHz a jak CPU 6502 tak i VIC (graficky cip) se pri pristupu do obrazove pameti stridaly. Dokonce tusim, ze VIC mel nejaky buffer na cely obrazovy radek nebo barvove atributy.
Na spectre boli maskovane hodiny CPU. Ked sa cpu snazilo dostat do vram (cely dolny 16k blok ramky) a prisla poziadavka od uly, procesoru sa jednoducho zastavil takt, a pokracoval az ked ula skoncila. Na zbernici boli medzi procerom a zvyskom datovej zbernice (ULA a vram) odpory aby sa natvrdo ignoroval stav CPU zbernice v case ked bola ULA master :). V pripade ze CPU islo do hornych 32k ramky frcalo to bez prerusovania na plny vykon. Ako kolega hore spomenul dalo sa trikom zaistit prsanie obrazu co bolo sposobene vlastnostou Z80 procesoru pri spracovani prerusenia, ale uz si nepamatam ako to presne fungovalo (je to straasne davno :) )
Aha, takze to opravdu pracuje na zhruba stejnem principu. Zatimco Antic posilal do 6502ky signal HALT, tak se u speccyho se zastavily hodiny, coz je vlastne to same (zastaveni hodin u Z80 zapricinilo nastaveni vstupu do vysoke impedance?). Akorat nevim, jak by se na neco podobneho 6502ka tvarila, kdyby ji nekdo zastavoval hodiny, takhle dobre emulatory nejsou, aby to slo odzkouset :-(
na to boli rezistory na zbernici medzi cpu a ulou z vram ! mily a neskodny hack :) Ule bolo jedno co si cpu robi zo zbernicou v pripade ze isiel pristup na hornych 32kb ktore boli spojene priamo. Ked isiel na dolnych 16kb (ula to vedela podla adresnej zbernice) tak mu podla potreby zastavila hodiny aby nekolidovala adresacia z vram a odelovacie rezistory sa postarali o to aby bolo jedno aky je stav na CPU datovej zbernici.
ja jeste doplnim, ze ula (tj. rekneme tehda pouzivany predchudce fpga) mel v logice chybu, resp. mel jednodussi logiku, takze obcas nefungoval uplne spravne. dal se presvedcit k cekani na cpu. slo ho k tomu prinutit treba prepnutim do im2 a presunem interrupt tabulky, nebo hranim s r-registrem (refresh registr, s tim se daly delat veci.. :-)
chybu opravoval pocitac mistrum (vysel tusim v jednom modrem AR), ktery se pozdeji upraveny prodaval jako Didaktik M.
ULA cetla videoram ve "fast-page" modu, tj. naadresovala RAS atributu a pak 2x CAS pro pixelbyte a attrbyte. Totodelal dvakrat za sebou, a pak dovolila procesoru na 2 takty cokoliv (tj. procesor pristupujici do vram po dobu jejiho vycitani dostaval rpideleny 2T sloty kazdych 8T pro zahajeni strojoveho cyklu).
Ze ma byt cyklus blokovan se detekovalo podle A15:14=01. Tj. pristup do VRAm byl zastaven jeste nez procesor zaktivoval /MREQ, a /MREQ ula pouzivala primo jako /OE svych prelacovacich budicu proti odporum z multiplexu DRAM.
Biohuzel, automat pro detekci zacatku a konce blokovaneho MCycle potreboval "jiste vedet", ze skoncil - a delal to podle A15:14 != 01. Pokud preruseni ukazovalo do VRAM, toto nenastalo, procesor tedy nebyl pri pristim pristupu zastaveny (ULA si myslela, ze stale stoji), a svym zaktrivovanym /MREQ odbudil ULA. Ta tedy nacetla nahodny byte odjinud - a vzniklo no nedeterministicke prseni v obraze.
Jinak Mistrum != didaktik M. didaktik M pouziva wait-state ULA (krokuje pomoci /WAIT, deaktivovanym jednou za 4T, ne blokovanim hodin, tj. kazdy mcycle trva N*4T). ULA pochazi zrejme z ruskeho klonu Hobbit. Mistrum pouzival stinovou VRAM...