VBI, DLI, problik⇧v⇧n a co s t m¢raster/c.p.u., 2009¢---------------------------------------¢¢Kaəd⑨ kod⑦r na mal⑦m At⇧rku naraz d② ve ⇨i pozd❎ji na n❎jak⑦ z⇧hadn⑦ probl⑦my. Zd⇧ se, əe jeho program ned❎l⇧ to co by m❎l, n❎co se n❎kde p②episuje, procesor zatuh⇧v⇧ na kdu v m stech, kam by se teoreticky nikdy nem❎l dostat, a tak podobn❎. Tohle b⑨vaj chyby, kter⑦ ⇨lov❎k hled⇧ t②eba i hodn❎ dlouho, ale obecn⇧ rada, jak je ned❎lat nebo jak je rychle naj t, neexistuje.¢¢Pak je v③ak jin⇧ skupina probl⑦m
, se kter⑨mi program⇧to②i velmi ⇨asto bojuj (podle e-mail dotaz
co mi chod ), p②itom jsou zbyte⇨n⑦ a lze se jich vyvarovat. Mluv m o problik⇧v⇧n obrazovek p②i zm❎n⇧ch DListu a o z⇧pasen s rutinami ve VBI ⇨i DLI (oboje jsou tzv. NMI).¢¢⑥asto je d
vodem jen pouh⇧ neznalost z⇧kladn ch princip
, p② padn❎ v ra v myln⑦ informace, kter⑦ jsme zaslechli n❎kdy p②ed mnoha lety, ale v❎② me jim dodnes. Mezi nej⇨ast❎j③ m⑨ty t②eba pat② , əe VBI se prov⇧d jen v dob❎ kdy je vykreslovac paprsek mimo viditeln⑨ obraz, nebo əe vyuəit m kdu ve VBI z sk⇧me n❎jak⑨ v⑨po⇨etn v⑨kon nav c (cca 20000 takt
), kter⑨ by se jinak promrhal.¢¢P②itom si sta⇨ uv❎domit, əe to "I" ve zkratk⇧ch VBI, DLI, znamen⇧ interrupt, neboli p②eru③en . Procesor tedy v tomto okaməiku p②eru③ pr⇧ci na kdu, kter⑨ zpracov⇧val doposud, odsko⇨ si n❎kam jinam, a pot⑦ se op❎t vr⇧t k p
vodn mu kdu. Aby v❎d❎l, kam se m⇧ na konci p②eru③en vr⇧tit, mus si na z⇧sobn k uloəit n⇧vratovou adresu (stejn❎ jako p②i JSR instrukci), nav c v③ak i "flag" status (jako instrukce PHP). Proto se rutiny pracuj c v p②eru③en ukon⇨uj instrukc RTI, kter⇧ ze z⇧sobn ku vybere a obnov status a n⇧vratovou adresu, narozd l od RTS, kter⑦ pouəije jen n⇧vratovou adresu. Je to nutn⑦ proto, aby p
vodn kd mohl spr⇧vn❎ pokra⇨ovat, nebo④ p②eru③en m
əe nastat v libovoln⑦m okaməiku. Ze stejn⑦ho d
vodu je nutn⑦ v rutin❎ p②eru③en zachovat obsah v③ech registr
(A,X,Y), proto ty, kter⑦ chceme vyuə vat, mus me t⑦ə nejprve uschovat (nej⇨ast❎ji na z⇧sobn k) a p②ed koncem rutiny p②eru③en jejich obsah obnovit.¢¢Okaməik, kdy se NMI p②eru③en vyvol⇧vaj , je p②esn❎ dan⑨. U DLI je to na za⇨⇧tku posledn ho mikro②⇧dku displaylist instrukce, kter⇧ m⇧ nastaven sedm⑨ bit. Toto je tak⑦ ⇨ast⑨ d
vod z⇧pasen s kdem, kdy si program⇧tor nastav v displaylistu u prvn ho textov⑦ho ②⇧dku sedm⑨ bit a div se, pro⇨ jeho rutina m❎n barvu aə od ②⇧dku druh⑦ho.¢¢VBI se vyvol⇧v⇧ na za⇨⇧tku vertik⇧ln ho zatemn❎n , coə je, zjednodu③en❎ ②e⇨eno, na prvn m mikro②⇧dku pod spodn viditelnou hranou obrazu. To je v③ak jen jeho za⇨⇧tek a nikde nen zaru⇨eno, əe bude tato rutina i v dob❎ mimo viditeln⑨ obraz dokon⇨ena - z⇧leə jen na jej d⑦lce. Op❎t velmi ⇨ast⑨ ⑤div program⇧tora, jakto əe se ⇨innost jeho kdu ve VBI projevuje b❎hem vykreslov⇧n . A odpov❎⇦ jednoduch⇧: M⇧ rutinu p② li③ dlouhou, takəe se prov⇧d i b❎hem vykreslov⇧n dal③ ho sn mku. On❎ch ⇨asto zmiovan⑨ch 20 tis c takt
pro rutinu ve VBI vych⇧z z prost⑦ho zaokrouhlen⑦ho v⑨po⇨tu: 105 takt
na mikro②⇧dek kr⇧t 312 mikro②⇧dk
(PAL), m nus cca 8000 takt
DMA ANTICu b❎hem vykreslov⇧n obrazu, m nus cca 1000 takt
⇨innost OS ROM, rovn⇧ se 23760, tedy zhruba 20 tis c. Z nich v③ak jen cca pouh⑨ch 6 tis c ((312-256)*105) p②ipad⇧ na dobu p②ed za⇨⇧tkem vykreslov⇧n dal③ ho sn mku, del③ akce uə mohou b⑨t "viditeln⑦".¢¢P②itom VBI i DLI jsou nemaskovateln⇧ (NMI), tud ə n⇧sleduj c DLI m
əe p②eru③it i p②edch⇧zej c DLI, p② padn❎ se mohou navz⇧jem p②eru③ovat s VBI a naopak. Pokud to tedy nap② klad s d⑦lkou VBI p②eəenete drsn❎, m
əe v⇧m jeho prov⇧d❎n p②eru③it VBI zah⇧jen⑦ na konci n⇧sleduj c ho sn mku, kter⑦ bude op❎t tak dlouh⑦, əe ho p②eru③ aə dal③ VBI, a dal③ ... a jestli nedo③lo k zamrznut , p②eru③uj se dodnes. ;-)¢¢Vyuəit m rutin v p②eru③en se tedy nez sk⇧v⇧ ə⇧dn⑨ v⑨kon nav c, ale sebere se "hlavn " rutin❎.¢¢Od spr⇧vn⑦ho pochopen v⑨③e uveden⑨ch skute⇨nost je jiə jen kr
p②eru③en . Probl⑦m je v chyb❎j c synchronizaci.¢¢Jak je zn⇧mo, vektor pro displaylist se nastavuje p②es adresy $230 a $231. Zm❎na obsahu t❎chto bun❎k v③ak sama o sob❎ v
bec nic neprovede. Teprve aə p②i prvn m n⇧sleduj c m VBI, kdyə se vyvol⇧ p② slu③n⇧ OS ROM rutina, se v r⇧mci jej ho kdu obsah buky $230 zkop ruje do $d402 a obsah $231 do $d403. Aə toto je skute⇨n⑨ vektor pro displaylist ⇨ipu ANTIC, jehoə zm❎na se projev vykreslov⇧n m odpov daj c ho displaylistu.¢¢Metoda z⇧pisu na doln registry a p②episu ve VBI do registr
⇨ipu se pouə v⇧ proto, nebo④ kdybychom m❎nili p② mo obsah registr
⇨ipu zrovna b❎hem vykreslov⇧n , za⇨al by se od toho okaməiku vykreslovat nov⑨ obraz, klidn❎ od poloviny rozkreslen⑦ho aktu⇧ln ho sn mku. VBI n⇧m tedy zajist , əe se tento p②epis provede aə po dokon⇨en vykreslov⇧n , a projev se to aə p❎kn❎ shora od za⇨⇧tku n⇧sleduj c ho sn mku. Jenoməe na n❎co jsme zapomn❎li.¢¢Pokud nebudeme ⇨innost na③eho kdu ə⇧dn⑨m zp
sobem synchronizovat s vykreslov⇧n m, m
əe doj t k VBI zrovna v t⑦ ne③④astn⑦ chv li, kdy m⇧me teprve nastaven jeden ze dvou doln ch registr
adresy displaylistu. OS ROM rutina tedy zap ③e ANTICu niə③ bajt hodnoty pro nov⑨ displaylist, zat mco vy③③ bajt nastav je③t❎ dle star⑦ho displaylistu. V⑨sledkem je vykreslen cel⑦ho n⇧sleduj c ho sn mku obrazu displaylistem dle obsahu pam❎ti [nov⑨ niə③ bajt, p②edchoz vy③③ bajt], coə se m
əe projevit velmi divoce, a aə po tomto sn mku, kdy dojde k dal③ mu VBI, se p②ep ③e spr⇧vn❎ i ten vy③③ bajt a teprve dal③ sn mek bude spr⇧vn❎.¢¢Obdobn❎ nehezky m
əe dopadnout, kdyə nap② klad p②ed VBI stihneme nastavit oba bajty displaylistu, ale z⇧pis barvov⑨ch registr
(adresy $2c0 aə $2c8) nebo p②epnut ③ ②ky obrazu (adresa $22f) se jiə p②ed t m sam⑨m VBI nestihne. V⑨sledkem je probliknut jednoho sn mku se ③patn⑨mi barvami, neodpov daj c ③ ②kou obrazu atd. Pravd❎podobnost, əe k tomu dojde, nemus b⑨t ani p② li③ velk⇧, ale t m h
②e pro program⇧tora. Probliknut barev nebo jeden sn mek zmaten⑦ho obrazu by se je③t❎ s p②imhou②en m obou o⇨ dalo strp❎t, jenoməe d
sledky mohou b⑨t fat⇧ln . Nap② klad m
əe displaylist z nespr⇧vn⑦ adresy obsahovat hodnoty vyvol⇧vaj c n❎kolik DLI, s jejichə vyvol⇧n m se nepo⇨ talo, p② padn❎ zmaten⑨ obraz m
əe nastavit obsahy PMG kolizn ch registr
, ze kter⑨ch se vyvod kolize k nimə doj t nem❎lo atd.¢¢Chud⇧k program⇧tor pak stoj p②ed probl⑦mem, əe "vədycky to fungovalo" (i kdyə to v⑨jime⇨n❎ n❎jak divn❎ probliklo), ale te⇦ to ob⇨as zatuh⇧v⇧, nebo t②eba p②i h②e raketka vybuchuje, aniə by k tomu m❎la m t d
vod.¢¢Rada zn jednodu③e: Neignorujte podivn⑦ neə⇧douc jevy a snaəte se zjistit kdy a pro⇨ k nim doch⇧z .¢¢A jak takov⑦ chyby odstranit, nebo l⑦pe v
bec ned❎lat? Je d
leəit⑦ si d
sledn❎ uv❎domovat, zda prov⇧d te zm❎nu doln ch registr
, jejichə p②epis do ⇨ip
se prov⇧d aə ve VBI, nebo zda nastavujete p② mo horn registry ⇨ip
. A vədy synchronizovat zm❎ny s vykreslov⇧n m!¢¢Pokud p②ed inicializa⇨n ⇨⇧st p②id⇧te t②eba jen jednoduchou synchroniza⇨n podm nku¢¢lda $14¢waicmp $14¢beq wai¢¢m⇧te zaru⇨eno, əe v⇧③ kd bude proveden vədy ihned po dokon⇨en VBI OS ROM rutiny (kter⇧ obsah registru $14 inkrementuje). Pokud ve VBI neprov⇧d te i n❎jakou vlastn akci, zb⑨v⇧ procesoru do okaməiku za⇨⇧tku vykreslov⇧n n⇧sleduj c ho sn mku cca 6000 takt
, tedy dost ⇨asu na proveden zm❎n mimo viditelnou oblast a bez hrozby p②eru③en inicializace dal③ m VBI. ⑧⇧dn⇧ ze zm❎n doln ch registr
se v③ak neprojev ihned v n⇧sleduj c m sn mku, ale aə v o jedna dal③ m. Proto mus te bu⇦to prov⑦st zm❎ny sou⇨asn❎ v doln ch i ve sleduj c ch registrech, nebo na uskute⇨n❎n zm❎ny po⇨kat je③t❎ jeden sn mek. Prvn synchro ⇨ek⇧n tedy zajist , əe n⇧③ kd nebude p②eru③en VBI, a po druh⑦m ⇨ek⇧n si m
byly (b❎hem toho n⇧sleduj c ho VBI) provedeny.¢¢P② klad vyuəit dvou synchronizac :¢¢;1.synchro¢lda $14¢wa1cmp $14¢beq wa1¢;¢;displaylist¢lda #<dlist¢sta $230¢lda #>dlist¢sta $231¢;¢;barvy¢lda #$04¢sta $2c5¢lda #$08¢sta $2c6¢lda #$0c¢sta $2c7¢¢Nyn jsou hodnoty adresy nov⑦ho displaylistu a t②ech barvov⑨ch registr
zaps⇧ny do doln ch registr
, n⇧sleduj c cel⑨ sn mek v③ak bude je③t❎ vykreslen star⑨m displaylistem a p②edchoz mi barvami. Po⇨k⇧me tedy na dokon⇨en tohoto sn mku a proveden n⇧sleduj c ho VBI:¢¢;2.synchro¢lda $14¢wa2cmp $14¢beq wa2¢¢Nyn je jiə po dal③ m VBI, takəe v③echny hodnoty z doln ch registr
byly p②eps⇧ny do sleduj c ch. N⇧sleduj c sn mek tedy bude vykreslen cel⑨ spr⇧vn❎ na③ m nov⑨m displaylistem a se v③emi zm❎n❎n⑨mi barvami.¢¢Neberte pros m zm n❎n⑦ p② klady jako n❎jak⑦ dogma. Jde jen o to uv❎domit si, əe pokud m❎n te doln a horn registry souvisej c s vykreslov⇧n m obrazu bez jak⑦koliv synchronizace, koledujete si v lep③ m p② pad❎ o nehezky problik⇧vaj c zmaten⑨ sn mek, ⇨ast❎ji v③ak i o z⇧hadn⑦ nahodil⑦ z⇧tuhy. Je p②itom ⑤pln❎ jedno, zda budete synchronizovat p②es zji③④ov⇧n zm❎ny hodnoty adresy $14 nebo t②eba porovn⇧v⇧n m obsahu VCOUNT registru (⇨ ta⇨ vertik⇧ln ch ②⇧dk
) s n❎jakou konstantou, ale m❎jte vədy na pam❎ti, kter⑦ registry m❎n te a kdy se tato zm❎na skute⇨n❎ projev .¢