OldComp.cz

Komunitní diskuzní fórum pro fanoušky historických počítačů

ByteFest 2019!

Právě je 17 říj 2019, 20:57

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]




Odeslat nové téma Odpovědět na téma  [ Příspěvků: 7 ] 
Autor Zpráva
 Předmět příspěvku: ZX Spectrum AY IRQ playback
PříspěvekNapsal: 18 srp 2019, 10:12 
Offline
Radil
Uživatelský avatar

Registrován: 20 úno 2017, 01:17
Příspěvky: 538
Has thanked: 12 times
Been thanked: 20 times
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í?


Nahoru
 Profil  
 
 Předmět příspěvku: Re: ZX Spectrum AY IRQ playback
PříspěvekNapsal: 18 srp 2019, 12:36 
Offline
Kecálek
Uživatelský avatar

Registrován: 19 črc 2013, 14:21
Příspěvky: 193
Bydliště: Košice
Has thanked: 93 times
Been thanked: 223 times
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:


Nahoru
 Profil  
 
 Předmět příspěvku: Re: ZX Spectrum AY IRQ playback
PříspěvekNapsal: 18 srp 2019, 13:19 
Offline
Radil
Uživatelský avatar

Registrován: 20 úno 2017, 01:17
Příspěvky: 538
Has thanked: 12 times
Been thanked: 20 times
Moc dekuji za vycerpavajici odpoved!


Nahoru
 Profil  
 
 Předmět příspěvku: Re: ZX Spectrum AY IRQ playback
PříspěvekNapsal: 18 srp 2019, 15:10 
Offline
Pan Generální

Registrován: 22 kvě 2013, 21:14
Příspěvky: 2279
Bydliště: Bratislava
Has thanked: 254 times
Been thanked: 431 times
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.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: ZX Spectrum AY IRQ playback
PříspěvekNapsal: 18 srp 2019, 18:28 
Offline
Kecálek
Uživatelský avatar

Registrován: 19 črc 2013, 14:21
Příspěvky: 193
Bydliště: Košice
Has thanked: 93 times
Been thanked: 223 times
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:


Nahoru
 Profil  
 
 Předmět příspěvku: Re: ZX Spectrum AY IRQ playback
PříspěvekNapsal: 19 srp 2019, 13:50 
Offline
Radil
Uživatelský avatar

Registrován: 12 kvě 2013, 20:32
Příspěvky: 377
Bydliště: Kladno
Has thanked: 33 times
Been thanked: 77 times
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 :)

_________________
>> Amiga 1200, ZX Spectrum+, Didaktik Gama, LnxSpectrum, LnxTracker, LnxAmigaImageConvertor, https://www.ilnx.cz <<


Nahoru
 Profil  
 
 Předmět příspěvku: Re: ZX Spectrum AY IRQ playback
PříspěvekNapsal: 20 srp 2019, 06:56 
Offline
Radil
Uživatelský avatar

Registrován: 20 úno 2017, 01:17
Příspěvky: 538
Has thanked: 12 times
Been thanked: 20 times
No, jak vidno naprogramovat hru kde bude hrat jak beeper tak AY zaroven plus udrzet slusne fps neni az jen tak...


Nahoru
 Profil  
 
Zobrazit příspěvky za předchozí:  Seřadit podle  
Odeslat nové téma Odpovědět na téma  [ Příspěvků: 7 ] 

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 1 návštěvník


Nemůžete zakládat nová témata v tomto fóru
Nemůžete odpovídat v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete přikládat soubory v tomto fóru

Hledat:
Přejít na:  
Založeno na phpBB® Forum Software © phpBB Group
Český překlad – phpBB.cz