OldComp.cz
http://oldcomp.cz/

ZX Spectrum AY IRQ playback
http://oldcomp.cz/viewtopic.php?f=38&t=7612
Stránka 11

Autor:  tommik [ 18.08.2019, 10:12 ]
Předmět příspěvku:  ZX Spectrum AY IRQ playback

Chci se zeptat. V mnoha hrách, povětšinou těch co jsou 48k a mají přilepenou hudbu pro AY, se stává, že přehrávání není úplně plynulé a čas od času se zpomaluje. Všiml jsem si toho např. ve hrách Commando, Action Force 2 - obě s dodatečně přidělanou hudbou pro AY, ale třebas i na 128k hře Bedlam. Nemělo by to být tak, že hudba hraje "v přerušení" a neměla by být plynulost jejího přehrávání bez zpomalování? Srovnávám-li např. s Commodore 64, tam jsem si nevšiml že by hudba "rychlostně reagovala" na to, co se děje na obrazovce.

Co je důvodem takového zpomalování?

Autor:  mborik128 [ 18.08.2019, 12:36 ]
Předmět příspěvku:  Re: ZX Spectrum AY IRQ playback

Dovodom je to, ze speecy ma na vykreslenie celeho obrazu kazdu 1/50 sekundy iba 70908 strojovych taktov Z80 (pricom najmensi pocet taktov, ktory moze mat instrukcia su 4 takty, aj ked instrukcia nerobi nic - nop). Na zaciatku tohto celeho procesu prichadza k obsluhe prerusenia. To zakladne IM1 v ROMke iba otestuje klavesy a nastavi prislusne systemove premenne, ale ak sa programovo nastavi maskovane prerusenie IM2, "doskace" sa az ku vlastnej rutinke, pri ktorej mame istotu, ze sa zavola vzdy na zaciatku prerusenia, tj. v case, ked za vykresluje horna prazdna cast borderu. A prave tam sa zvykne zavolat obsluha hudobnej rutinky, ktora podla dat pozicii, patternov a samplov pripravi potrebne data a "nakrmi" vsetky registre AY. To zvykne trvat rozne dlho, ale orienacne povedzme tak od 2000 az 20000 taktov! Nasledne sa rutinka prerusenia vrati do "hlavneho kodu", ale tie takty nam uz nikto nevrati, takze nam do konca ostava 70908 minus to, co zozrala rutinka obsluhy prerusenia.
A teraz sa dostavame k tomu, co moze sposobit to, ze nam "utecie" prerusenie: Majme vykreslovaciu rutinku, ktora kvoli svojej rychlosti data nacitava, alebo zapisuje pomocou zasobnika a teda MUSI zakazat prerusenie pomocou DI (aby k nemu neprislo a neznicilo to data alebo sa to nevyzvracalo do obrazovky :) ).
Predstavme si, ze v danom case muzika, alebo nejaka obsluha postaviciek/sprajtov/whatever trvala dlhsie a vykreslovacia rutina to nestihne vykreslit a skonci az niekedy za 70908. V tomto pripade teda dojde k obsluhe prerusenia az pri dalsom 50Hz intervale a teda v muzike pocut evidentne zaskobrtnutie.
Tak to je v skratke... :dwi:
Teda vzdy je to iba (ne)sikovnostou daneho programatora.

PS: Este pre predstavu, prekreslit komplet celu obrazovku (a teda vyplnit vsetkych 6912 bajtov, ktore screen reprezentuje) nie je realne, za tych 70908 taktov sa to proste nestiha. Klasicky LDIR na presun 6912 bajtov z vnutornej obrazovky do obrazovky trva obludnych 21 * 6912 = 145152 taktov. :dco:

Autor:  tommik [ 18.08.2019, 13:19 ]
Předmět příspěvku:  Re: ZX Spectrum AY IRQ playback

Moc dekuji za vycerpavajici odpoved!

Autor:  Busy [ 18.08.2019, 15:10 ]
Předmět příspěvku:  Re: ZX Spectrum AY IRQ playback

Dalsi dovod moze byt v tom ze tieto stare klasicke 48k hry maju zvuky na EAR a aby tieto zvuky neboli skreslene prerusenim, tak pocas ich generovania sa prerusenie zakazuje. Dosledkom toho sa dodatocne pridana hudba z prerusenia spomaluje.

Inak na C64 vsetky hry a aj dema uz tak nejak od zaciatku pocitaju s tym ze budu mat normalne hudbu a zvuky z prerusenia, preto je cely kod uz aj tak pisany aby sa prerusenie pocas hrania zvukov/hudby nezakazovalo. Ono tam zakazovanie prerusenia ani nema moc zmysel pretoze jednak C64 nema EAR a vzdy vsetky zvuky robi cez SID, a dvak 6502 / 6510 aj tak nevie vyuzit zasobnik pre rychle vykreslovanie.

Autor:  mborik128 [ 18.08.2019, 18:28 ]
Předmět příspěvku:  Re: ZX Spectrum AY IRQ playback

Presne tak. A tu sa dostavame asi aj k dovodu, preco sa prave tieto veci deju u hier, do ktorych bola az dodatocne a asi bez nejakej hlbsej analyzy prilepena AY muzika.
Tym, ze boli vycasovane na klasicke 48k speccy, boli vykreslovacie rutinky time-critical vycasovane tak, aby tam nedochadzalo ku glitchom pri vykreslovani spritov, scrollovani viewportom atp. A predopokladam, ze pri takom Commande mali autori co robit, aby sa do 70908 taktov zmestili.
Tym padom, ak sa tam ta muzika naroubovala necitlivo k povodnemu kodu a neprisposobila sa povodnemu toku vykreslovacieho enginu, tak je jasne, ze to v niektorych momentoch "pretecie".

PS: V tomto pripade by sa tam asi hodil Busyho "inteligentny halt" © 1995 :dwi:

Autor:  Lanex [ 19.08.2019, 13:50 ]
Předmět příspěvku:  Re: ZX Spectrum AY IRQ playback

Je to tak, ke zpomalení dojde když se prošvihne přerušení. Když jsem rouboval hudbu do Draconuse, musel jsem přepsat i část vykreslovacího kódu. Ta totiž trvala skutečně skoro těch 70k taktů, a hudební rutina už způsobila přetečení. Sice jen o pár stovek taktů, ale dost na to, aby se přerušení vůbec nevyvolalo. On totiž ten signál z ULA trvá jen - a ted hádám z hlavy - cca 30 taktů. Pokud Z80 v této chvíli bude v DI, nezareaguje, a ztratí se celá 1/50 z hudby. Pokud se to bude dít s železnou pravidelností, zpomalí se hudba na 50 % své původní rychlosti, a v některých případech (pokud hra používá synchronizaci) se zpomalí na 50 % i vlastní hra. To proto, že hra čeká na přerušení, které by za normálních okolností přišlo do pár stovek taktů. Ale jak to přeteklo, příjde až za dalších skoro 70k taktů. Je to takový 25 FPS režim :)

Autor:  tommik [ 20.08.2019, 06:56 ]
Předmět příspěvku:  Re: ZX Spectrum AY IRQ playback

No, jak vidno naprogramovat hru kde bude hrat jak beeper tak AY zaroven plus udrzet slusne fps neni az jen tak...

Stránka 11 Všechny časy jsou v UTC + 1 hodina [ Letní čas ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/