Grafick⑦ mdy 9++ a 10++¢Piotr Fusik (Fox/Taquart)¢<fox@scene.pl>¢P②eklad: Radek t❎rba (Raster/C.P.U.)¢¢Tento text je nedoslovn⑨m p②ekladem anglick⑦ho p②ekladu p
vodn ho ⇨l⇧nku publikovan⑦ho v polsk⑦m magaz nu "Atarynka", ⇨ slo 2/2002. Fox mi ho osobn❎ poslal, əe mohu ud❎lat ⇨esk⑨ p②eklad pro Flop. Kladl mi na srdce, abych p②edt m, neə budu text p②ekl⇧dat, nejd② ve princip jeho speci⇧ln ho grafick⑦ho mdu pochopil. To se mi na③t❎st poda②ilo, takəe hur⇧ na ⇨eskou verzi. ¢¢LewiS/AiDS v ⇨l⇧nku v magaz nu Atarynka 1/2002 p ③e: ¢Nejpouə van❎j③ m grafick⑨m mdem je "Konop
v md", kter⑨ poprv⑦ pouəil Konop/Shadows v demu "Asskicker". Tento md byl pouə v⇧n l⑦ta a pravd❎podobn❎ neexistuje jin⑨ md, kter⑨ by byl tak rychl⑨ s podobn⑨mi parametry (⇨tvercov⑦ body, mal⇧ obrazov⇧ pam❎④, 16 odst n
[nebo jin⑨ GTIA md]).¢¢LewiS se m⑨lil, nebo④ existuje podobn⑨ md s je③t❎ lep③ mi vlastnostmi neə v⑨③e uveden⑨ "Konop
v" (zn⇧m⑨ t⑦ə jako 9+). Tento nov⑨ md byl nazv⇧n 9++ a Fox ho pouəil nap② klad v super demu Numen.¢¢V⑨hody nov⑦ho mdu 9++¢----------------------¢1. Je rychlej③ neə md 9+, p②itom v③ak nepouə v⇧ pr⇧zdn⑦ mezi②⇧dky.¢2. Display List je zna⇨n❎ krat③ (kaəd⑨ grafick⑨ ②⇧dek je tvo②en pouze jedinou DL instrukc ).¢3. Display List obsahuje pouze jednu jedinou definici obrazov⑦ pam❎ti na za⇨⇧tku, takəe nap② klad pro pot②eby metody "st② d⇧n obrazovek" nen nutn⑦ m t dva DListy, ale sta⇨ m❎nit jen tuto jednu definici v jednom DL.¢4. Je moən⑦ jednodu③e vytvo②il variace tohoto mdu s jinou v⑨③kou ②⇧dku (nap②. 3,5 nebo 6 obrazov⑨ch bod
m sto 4), maxim⇧ln❎ 16.¢5. Vypad⇧ l⑦pe - posu⇦te sami - hlavn❎ nap② klad v GTIA mdu 10 jsou barvy hez⇨ , protoəe nepouəit m pr⇧zdn⑨ch mezi②⇧dk
nen sn əen jas a sytost barev.¢¢Nev⑨hody¢--------¢1. V tomto mdu spot②ebov⇧v⇧ ANTIC podstatn❎ m⑦n❎ takt
, ov③em 6502 zase mus ud❎lat n❎jakou pr⇧ci nav c. Nen j moc, ale mus b⑨t p②esn❎ synchronizov⇧na se zobrazov⇧n m a vyəaduje to psan obsluən⑨ch rutin.¢2. Je probl⑦m se zobrazen m nejspodn❎j③ ho, 240. obrazov⑦ho ②⇧dku. Proto se u mdu 9++ mus te bu⇦ spokojit s maxim⇧ln❎ 59 ②⇧dky (59*4=236 obrazov⑨ch ②⇧dk
), a nebo ud❎lat nejvrchn❎j③ ⇨i nejspodn❎j③ ②⇧dek niə③ , tj. 3 obrazov⑦ ②⇧dky m sto 4.¢¢My③lenka¢--------¢Hlavn my③lenka je jednoduch⇧ - za②i⇦me, a④ ANTIC zobrazuje stejn⑨ obrazov⑨ ②⇧dek v cekr⇧t pod sebou a pouə v⇧ p②itom jen svou intern pam❎④. To stejn⑦ se d❎je t②eba v ANTIC mdu 8 (GRAPHICS 3), kdy se data p②en⇧③ej z hlavn pam❎ti pouze pro prvn obrazov⑨ ②⇧dek, a n⇧sleduj c ch 7 obrazov⑨ch ②⇧dk
se zobrazuje jiə z pam❎ti ANTICu.¢¢Teorie¢------¢ANTIC obsahuje intern 4-bitov⑨ registr DCTR, kter⑨ po⇨ t⇧ obrazov⑦ ②⇧dky. Norm⇧ln❎ pro kaəd⑨ ②⇧dek grafick⑦ho mdu po⇨ t⇧ od 0 do hodnoty p② slu③n⑦ pro dan⑨ grafick⑨ md. Nap② klad v nejjemn❎j③ ch mdech je tato hodnota 0, u grafik s dvojn⇧sobnou v⑨③kou bodu je to 1 atd.¢Jin⑦ je to p②i aktivovan⑦m vertik⇧ln m rolov⇧n . V prvn m roluj c m ②⇧dku DCTR po⇨ t⇧ od VSCROL do 0, v n⇧sleduj c m norm⇧ln❎, a v posledn m od 0 do VSCROL. Po⇨ t⇧n m od A do B je my③leno, əe nejd② ve je DCTR nastaveno hodnotou A a pobl ə konce kaəd⑦ho obrazov⑦ho ②⇧dku je DCTR porovn⇧no s B. V p② pad❎ rovnosti se p②ejde na dal③ DL instrukci, jinak je DCTR zv⑨③eno o 1.¢¢M❎jme nap② klad tento DList:¢$2f¢$0f¢a VSCROL=13 (decim⇧ln❎):¢Pak se bude nejprve 4x opakovat prvn obrazov⑨ ②⇧dek (DCTR bude nab⑨vat hodnot 13,14,15,0 - hodnota 0 n⇧sleduje po 15, protoəe DCTR je 4-bitov⑨ registr).¢Potom n⇧sleduje druh⑨ obrazov⑨ ②⇧dek 14x (DCTR bude nab⑨vat hodnot od 0 do 13 v⇨etn❎).¢¢Obdobn❎ pro VSCROL=3:¢Nejprve prvn obrazov⑨ ②⇧dek 14x.¢Pot⑦ druh⑨ obrazov⑨ ②⇧dek 4x.¢¢Co je d
leəit⑦, obrazov⇧ data pro n❎kolik stejn⑨ch ②⇧dk
se p②en⇧③ej z hlavn pam❎ti pouze jednou.¢¢Konstrukce mdu¢---------------¢Jak lze snadno vyvodit z p②ede③l⑨ch informac , pro grafick⑨ md 9++ s kaəd⑨m ②⇧dkem o v⑨③ce 4 obrazov⑦ ②⇧dky, budeme pot②ebovat n⇧sleduj c DList:¢$6f,$xxyy(adresa obrazov⑦ pam❎ti)¢$0f¢$2f¢$0f¢...¢a budeme ve spr⇧vn⑨ch okaməic ch m❎nit obsah VSCROL registru.¢¢N⇧sleduj c obr⇧zek v⇧m pom
əe pochopit co se kdy d❎je:¢DCTR¢ 13 @--------------------------¢ 14 ---------------------------¢ 15 ---------------------------¢ 0 ---------------------------¢ 0 ===========================¢ 1 ===========================¢ 2 ===========================¢ 3 ====!===================*##¢ \--viditeln⑨ obraz--/¢¢'-' - prvn ②⇧dek grafick⑦ho mdu 9++¢ (bit 5 v DListu je nastaven)¢'=' - druh⑨ ②⇧dek grafick⑦ho mdu 9++¢ (bit 5 v DListu je nulov⑨)¢'@' - nyn VSCROL mus obsahovat 13¢'!' - nyn se vyvol⇧v⇧ DLI rutina¢'*' - nyn VSCROL mus obsahovat 3¢'#' - nyn nastavujeme 13 do VSCROL¢¢Obr⇧zek ukazoval dva ②⇧dky grafick⑦ho mdu 9++, tj. 8 obrazov⑨ch ②⇧dk
. Tak⑦ zn⇧zoroval ⇨asov⇧n - jednotliv⑦ obrazov⑦ ②⇧dky jsou vykreslov⇧ny zleva doprava.¢¢Nejprve mus VSCROL obsahovat hodnotu 13 (decim⇧ln❎). Jakmile si ANTIC p②ebere tuto hodnotu do DCTR, vykresl 4x stejn⑨ obrazov⑨ ②⇧dek - tj. prvn ②⇧dek grafick⑦ho mdu 9++. N⇧sledn❎ se budou vykreslovat jednotliv⑦ obrazov⑦ ②⇧dky druh⑦ho ②⇧dku grafick⑦ho mdu 9++. Na konci ⇨tvrt⑦ho obrazov⑦ho ②⇧dku mus me zajistit, aby VSCROL obsahoval 3. Je dost ⇨asu na nastaven t⑦to hodnoty do VSCROLu. M
əeme to prov⑦st t②eba v DLI na prvn m ②⇧dku. Mnohem kriti⇨t❎j③ je to s p② pravou pro t②et grafick⑨ ②⇧dek. Jak je vid❎t na obr⇧zku ('#'), je jen kr⇧tk⑨ okaməik p②ed koncem ②⇧dku, kdy mus me uloəit hodnotu 13 do VSCROLu (jen p⇧r strojov⑨ch takt
).¢¢Varianty implementace¢---------------------¢Registr VSCROL m
əeme nastavovat:¢a) pouəit m DLI p②eru③en ,¢b) uvnit② kdu n❎jak⑦ho na③eho efektu,¢c) pouəit m IRQ POKEY ⇨asova⇨
.¢¢Varianta a) je bezpochyby nejjednodu③③ , av③ak nejpomalej③ . Optim⇧ln je varianta b), pouəiteln⇧ v③ak bude jen u jednoduch⑨ch efekt
typu bump mapping. Varianta c) je kvalitn❎j③ neə a), protoəe POKEY ⇨asova⇨e m
əeme nastavovat s p②esnost na jednotliv⑦ takty, takəe nepl⑨tv⇧me ⇨asem v rutin❎ p②eru③en . Ov③em pro pot②eby hry ⇨i dema je c) nepraktick⇧, protoəe POKEY ⇨asova⇨e se pouə vaj tak⑦ pro generov⇧n zvuk
a nechceme ob❎tovat ⑤rove hudebn ho doprovodu (m⑦n❎ zvukov⑨ch gener⇧tor
) jen kv
li nov⑦mu grafick⑦mu mdu.¢¢DLI rutina p②eru③en ¢--------------------¢Pot②ebujeme, aby spot②ebov⇧vala co nejm⑦n❎ ⇨asu. Bude se vyvol⇧vat na kaəd⑦m druh⑦m grafick⑦m ②⇧dku (tj. jednou na 8 obrazov⑨ch ②⇧dk
) - to ② d me bitem 5 v DL instrukci.¢P②eru③en se vyvol⇧v⇧ kr⇧tce po za⇨⇧tku vykreslov⇧n obrazov⑦ho ②⇧dku (okaməik '!'). Norm⇧ln❎ NMI obsluha zjist typ p②eru③en (DLI nebo VLBKI) a uschov⇧ obsah registr
(p②inejmen③ m A registru). P②esto m⇧me st⇧le dost ⇨asu p②ed z⇧pisem hodnoty 13 do VSCROLu. Nejjednodu③③ m zp
sobem jak spot②ebovat tento ⇨as (a zajistit spr⇧vnou synchronizaci) je pouəit WSYNC. Pak zap ③eme 13 do VSCROLu a ihned pot⑦ 3.¢¢Uk⇧zka:¢ lda #<dli¢ sta $200¢ lda #>dli¢ sta $201¢ lda #$22¢ sta $22f¢ lda #<dl¢ sta $230¢ lda #>dl¢ sta $231¢ lda #$40¢ sta $26f¢ lda #$c0¢ sta $d40e¢ jmp *¢¢dli pha¢ sta $d40a¢ lda #13¢ sta $d405¢ lda #3¢ sta $d405¢ pla¢ rti¢¢; 2 pr⇧zdn⑦ ②⇧dky, 1 ②⇧dek grafiky 9++¢dl db $90,$6f¢ dw $f000¢; 29kr⇧t $8f,$2f => 58 ②⇧dk
grafiky 9++¢ db $8f,$2f,$8f,$2f,$8f,$2f,$8f,$2f¢ db $8f,$2f,$8f,$2f,$8f,$2f,$8f,$2f¢ db $8f,$2f,$8f,$2f,$8f,$2f,$8f,$2f¢ db $8f,$2f,$8f,$2f,$8f,$2f,$8f,$2f¢ db $8f,$2f,$8f,$2f,$8f,$2f,$8f,$2f¢ db $8f,$2f,$8f,$2f,$8f,$2f,$8f,$2f¢ db $8f,$2f,$8f,$2f,$8f,$2f,$8f,$2f¢ db $8f,$2f¢ db $41¢ dw dl¢¢Moən⇧ nen na prvn pohled z②ejm⑦, pro⇨ jsme zapsali 3 do VSCROLu na konci DLI, a ne p②ed z⇧pisem do $d40a (WSYNC)?¢Jak bylo zn⇧zorn❎no na obr⇧zku, VSCROL je ve druh⑦m ②⇧dku kontrolov⇧n bl zko konci obrazov⑦ho ②⇧dku. P②esn❎ji, je to v okaməiku, kdyə je dokon⇨eno zpracov⇧n aktu⇧ln ho DL kdu. Av③ak kdyə pouəijeme DLI (kter⑦ se vyvol⇧v⇧ v posledn m obrazov⑦m ②⇧dku DL kdu), prov⇧d se dal③ porovn⇧n DCTR s VSCROLem. Tud ə VSCROL mus jiə obsahovat 3, kdyə p②eru③en za⇨ n⇧.¢¢Kolik takt
z sk⇧me?¢--------------------¢To je velmi d
leəit⇧ ot⇧zka, protoəe rychlost jsme zm nili hned v prvn m bod❎ mezi v⑨hodami tohoto nov⑦ho mdu.¢Jeden ②⇧dek mdu 9+ m
əe v DListu vypadat takto:¢ db $0f,$00,$4f¢ dw screen¢ db $00¢Celkov❎: 6 takt
pro DL¢+ (64 nebo 80) takt
pro obraz (v z⇧vislosti na ③ ②ce obrazu).¢V mdu 9++ je to pouze jeden DL kd, takəe 1 takt pro DL¢+ (32 nebo 40) takt
pro obraz. Nav c v③ak 6502 mus nastavovat VSCROL, na coə spot②ebuje 6 takt
gr.mdu 9++, zad⇧n po⇨⇧tku videopam❎ti v prvn m ②⇧dku, JVB):¢✓zk⑨ obraz:¢9+: 1+59*(6+64)+2+3=4136¢9++: 1+59*(1+32+6)+2+3=2307¢Norm⇧ln ③ ②ka obrazu:¢9+: 1+59*(6+80)+2+3=5080¢9++: 1+59*(1+40+6)+2+3=2779¢Zhruba lze ② ci, əe zisk p②edstavuje cca 6-7% CPU strojov⑦ho ⇨asu. To v③ak plat jen v ide⇧ln m p② pad❎, kdy prov⇧d me nastavov⇧n VSCROLu p② mo uvnit② kdu. Pouəijeme-li na to DLI, jako v uveden⑦m p② kladu, vyjde n⇧m nov⑨ md 9++ nepatrn❎ pomalej③ neə star⑨ md 9+, ale st⇧le mnohem rychlej③ neə md bez pr⇧zdn⑨ch ②⇧dk
, vytvo②en⑨ pouze DListem). P②itom nejv c ⇨asu je promrh⇧no pouəit m STA $d40a (synchronizace p②es WSYNC). Elegantn m (av③ak obt ən❎ realizovateln⑨m) ②e③en m m
əe b⑨t vyuəit tohoto ⇨asu pro n❎jak⑦ v⑨po⇨ty.¢¢Hlavn❎ v③ak nesm me zapom nat na dal③ v⑨hody mdu 9++, d ky kter⑨m se jeho pouəit st⇧v⇧ v⑨hodn❎j③ neə klasick⑨ch md
konstruovan⑨ch pouze p②es DList. P②itom, pokud jiə nastavov⇧n VSCROLu d❎l⇧me p②es DLI, je tu dal③ v⑨hoda: M
əeme nap② klad m❎nit barvu pozad pro jednotliv⑦ ②⇧dky a nestoj n⇧s to t⑦m❎② jiə ə⇧dnou pr⇧ci nav c.¢¢P.S. Popsanou metodu s VSCROL registrem m
əete obecn❎ pouə t i pro vytvo②en dal③ ch zaj mav⑨ch md
, t②eba hardwarem podporovan⑦ho textov⑦ho mdu 40x40 znak